Страница 184 из 243

Добавлено: Чт апр 24, 2025 20:40
Loopback
Orion9 писал(а): Я, например, не понял, что именно делает параметр типа "Ptr" в MediaInfo_Open.
Тут скорее должен быть "handle". Это хэндл, возвращаемый вызовом MediaInfo_New, создающим экземпляр объекта. Библиотека потокобезопасна только при создании в каждом потоке своего экземпляра и работе в этом потоке только с ним.

Документация на самом деле крайне скудная. В своё время во многом приходилось разбираться методом тыка.
Orion9 писал(а):Разве что вопрос вызывает строчка: ... Где указатель почему-то нулевой.
Насколько я помню, если не задать хэндл экземпляра, то опция будет задана глобально для всех экземпляров. В TCMediainfo я все опции задаю с указанием хэндла.
Orion9 писал(а):Если привязать функцию к CapsLock командой SetHotkeyAction /V:20, то как сделать, чтобы эта функции пропускала через себя нажатие этой клавиши?
Использовать переключатель /S и из привязанной функции возвращать -1, если клавишу нужно передать дальше.

Добавлено: Чт апр 24, 2025 23:18
Orion9
AkulaBig писал(а):Вот причесанный код.
Проверил, работает, всё супер.

А теперь если взять мой файл hint.txt:
[cut="hint.txt"]General;Name: %FileName%.%FileExtension%\r\nSize: %FileSize/String4%\r\n[Duration: %Duration%]\r\n[Duration: %Duration/String1%]\r\n[Duration: %Duration/String5%]\r\n[General: %BitRate/String%][(%BitRate_Mode%)][, %Format%][(%Format/Family%)]$if(%Cover%,\, Cover)[, %Width%x%Height%pix][, AR:%AspectRatio%=~%AspectRatio/String%][, %Channel(s)%ch][, %Resolution/String%][, %FrameRate/String%][, %SamplingRate/String%][, %Bits-(Pixel*Frame)%bpf][, %Language%]\r\n

Video;Video #%StreamKindID%: [%Width%x%Height%pix][, AR:%AspectRatio%=~%AspectRatio/String%][, %Resolution/String%][, %FrameRate/String%][, %BitRate/String%][(%BitRate_Mode%)][, %Bits-(Pixel*Frame)%bpf][, %Format%][(%Format/Family%)][, %Language%][, %Channel(s)%ch][, %SamplingRate/String%]\r\n

Audio;Audio #%StreamKindID%: [%Channel(s)%ch][, %Resolution/String%][, %SamplingRate/String%][, %BitRate/String%][(%BitRate_Mode%)][, %Format%][(%Format/Family%)][, %Format_Profile%][, %Language%][, %Width%x%Height%pix][, AR:%AspectRatio%=~%AspectRatio/String%][, %FrameRate/String%][, %Bits-(Pixel*Frame)%bpf]\r\n
;
Text;Text #%StreamKindID%: %Format%[(%Format/Family%)][@%Language%][, %StreamSize/String4%][, %BitRate/String%][(%BitRate_Mode%)][, %Width%x%Height%pix][, AR:%AspectRatio%=~%AspectRatio/String%][, %Channel(s)%ch][, %Resolution/String%][, %FrameRate/String%][, %SamplingRate/String%][, %Bits-(Pixel*Frame)%bpf]\r\n

Chapters;Chapters #%StreamKindID%: %Format%[(%Format/Family%)][@%Language%][, %Total% entries][, %StreamSize/String4%][, %BitRate/String%][(%BitRate_Mode%)][, %Width%x%Height%pix][, AR:%AspectRatio%=~%AspectRatio/String%][, %Channel(s)%ch][, %Resolution/String%][, %FrameRate/String%][, %SamplingRate/String%][, %Bits-(Pixel*Frame)%bpf]\r\n
;
Image;Image #%StreamKindID%: [%Width%x%Height%pix][, AR:%AspectRatio%=~%AspectRatio/String%][, %Resolution/String%][, %FrameRate/String%][, %StreamSize/String4%][, %BitRate/String%][(%BitRate_Mode%)][, %Bits-(Pixel*Frame)%bpf][, %Format%][(%Format/Family%)][, %Language%][, %Channel(s)%ch][, %SamplingRate/String%]\r\n
;
Menu;Menu #%StreamKindID%: [%MenuID/String%][, %Duration% Format:%Format/String%]
;[/cut]
И сохранить его в папку MediaInfo, а к коду добавить:

Код: Выделить всё

If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) <> 0 Then
   DllCall(sLib & "\MediaInfo_Option", _
   "ptr", hMI, "wstr", "Output", "wstr", "file://" & COMMANDER_PATH & "\Utilities\MediaInfo\hint.txt", _
   "wstr")
Else 
   DllCall(sLib & "\MediaInfo_Option", _
   "ptr", hMI, "wstr", "Output", "wstr", "", _
   "wstr")         
Endif
[cut="Полный код"]

Код: Выделить всё

Func JoinHint(FileName, FieldIndex, UnitIndex)
   Static pipe
   Static sLib = "MediaInfo" & (auX64 ? "" : "_i386") & ".dll"
   Static hLib = DllCall("LoadLibrary", _
         "wstr", COMMANDER_PATH & "\Utilities\MediaInfo" & sLib, _
         "ptr")
   If hLib = 0 Then
      Return "Error LoadLibrary " & sLib
   EndIf

   If FieldIndex = 1 Then
      Local hMI = DllCall(sLib & "\MediaInfo_New", "ptr")
      If hMI = 0 Then
         Return "MediaInfo_New returned 0"
      Endif

      Local lng_MI ="file://" & COMMANDER_PATH & "\Utilities\MediaInfo\ru.csv"
      DllCall(sLib & "\MediaInfo_Option", _
         "ptr", hMI, "wstr", "Language", "wstr", lng_MI, _
         "wstr")
   
      If DllCall(sLib & "\MediaInfo_Open", _
         "ptr", hMI, "wstr", FileName, _
         "uint") <> 1 Then
         DllCall(sLib & "\MediaInfo_Delete", "ptr", hMI)
         Return "MediaInfo_Open failed to open file " &  FileName
      EndIf

      DllCall(sLib & "\MediaInfo_Option", _
         "ptr", hMI, "wstr", "Complete", "wstr", "0", _
         "wstr")
      If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) <> 0 Then
         DllCall(sLib & "\MediaInfo_Option", _
         "ptr", hMI, "wstr", "Output", "wstr", "file://" & COMMANDER_PATH & "\Utilities\MediaInfo\hint.txt", _
         "wstr")
      Else 
         DllCall(sLib & "\MediaInfo_Option", _
         "ptr", hMI, "wstr", "Output", "wstr", "", _
         "wstr")         
      Endif
         
      pipe = DllCall(sLib & "\MediaInfo_Inform", _
         "ptr", hMI, "uint", 0, _
         "wstr")
   
      DllCall(sLib & "\MediaInfo_Delete", "ptr", hMI)
   Endif

   Return TrimSpaces(StrPart(pipe, auLF, FieldIndex))
EndFunc

Func TrimSpaces(String)
Local a, b
   If Not StrPos(String, ":") Then Return String

   a = StrPart(String, ": ", 1)
   b = StrPart(String, ": ", 2)

   Return StrTrim(a) & ": " & StrTrim(b)
EndFunc 
[/cut]
То теперь при включеном CapsLock будет отображаться подсказка из шаблона, которая особенно хороша на видео файлах с несколькими дорожками и титрами. А при выключеном CapsLock будет по-прежнему доступна вся подсказка с русскими полями. В общем, тут есть где пофантазировать. Я же говорю: "Embody your fantasies and make Total Commander great again!" ) Loopback сделал то, что Гислеру и не снилось: положил всю Windows к ногам TC.
AkulaBig писал(а):Вот ведь обидно как.
Не парьтесь, это даже на зашквар не тянет. Я вон пропустил ключ /S и нарушил работу такой важной клавиши, как CapsLock, вот где обидно бывает. Кстати, эту строку я, кажется, у вас и брал, потому как в доках к функции Option этого нету
AkulaBig писал(а):Документация на самом деле крайне скудная. В своё время во многом приходилось разбираться методом тыка.
Спасибо за пояснения. Документация к библиотеке действительно слабая, видел на это жалобы на форуме AutoHotKey ещё давно. Так что не удивлён.
P.S. Кстати, прикольный пример со сворачиванием ТС в трей. Считаю, что так во всем Windows должно быть по умолчанию сделано )

Добавлено: Пт апр 25, 2025 04:41
AkulaBig
Orion9 писал(а):То теперь при включеном CapsLock будет отображаться подсказка из шаблона
Сейчас доделаю основные хинты, посмотрю и дополнительные.
Orion9 писал(а):Не парьтесь, это даже на зашквар не тянет.
Проверил, оказалось, что все правильно писал я. Видимо с CLI-версией файл языка автоматически ищется в папке с библиотекой:

Код: Выделить всё

%COMMANDER_PATH%\Utilities\MediaInfo\MediaInfo.exe" "--Language=file://ru.csv" "--Complete=0
Но нашел и на au3:

Код: Выделить всё

; Установить язык названий параметров
DllCall($hDLL, "wstr", "MediaInfo_Option", _
	"ptr", 0, _
	"wstr", "Language", _
	"wstr", "file://" & EnvGet("COMMANDER_PATH") & "\Utilities\MediaInfo\ru.csv")
Так что память подвела.
Теперь главным будет переписать вот этот код с au3 на Autorun:

Код: Выделить всё

$iC = 0
$Tmp = StringToBinary($aMediaInfoInform[0], 2)
$aTmp = StringRegExp(StringTrimLeft($Tmp, 2), '(?s).{4}', 3)
$Tmp = ''
For $i = 0 To UBound($aTmp) - 1
    If StringRight($aTmp[$i], 2) == '00' Then
        $Tmp &= StringLeft($aTmp[$i], 2)
    Else
        $iC = 1
        ExitLoop
    EndIf
Next
If $iC = 1 Then
	$content = $aMediaInfoInform[0]
Else
	$content = BinaryToString('0x' & $Tmp, 1)
EndIf
Этот код переводит крякозябры. Но тут функции au3 применяются, включая рэгэкспы. Не понятно, можно-ли такое на Autorun реализовать.

Добавлено: Пт апр 25, 2025 11:34
Orion9
AkulaBig
Самый простой способ был бы использовать объект "Buffer" для перекодирования кодовой страницы, например:

Код: Выделить всё

Local size = StrLen(pipe)
Local buf = Buffer(size)
buf.Zero()
buf.SetStr(pipe, 0, size, "ANSI")
pipe = buf.GetStr(0, size, "ANSI")       
Free(buf)
Но поскольку "выхлоп" смешанный (т.е. поля отображаются нормально, а значения в кракозябрах), то такой номер не прокатывает. Перекодировка-то происходит, но это ничего не даёт. Придётся вам делать собственное посимвольное сопоставление, если уж очень хочется, хотя, на мой взгляд, такие файлы всё-равно нужно на уровне тегов перекодировать.

Loopback
Пока эксперементировал с буфером нашёл пару непоняток. По-моему, в справке указан неправильный порядок параметров:

Код: Выделить всё

r = obj.SetStr(<Value>[, <Offset>[, <Encoding>[, <Size>]]])
А также вызов Encoding с "CP:nnn" не работает.

Добавлено спустя 1 час 23 минуты:
Loopback писал(а):Использовать переключатель /S и из привязанной функции возвращать -1, если клавишу нужно передать дальше.
Спасибо, помогло. Ляпотаааа... )
AkulaBig писал(а):Сейчас доделаю основные хинты, посмотрю и дополнительные.
Как вариант решения проблемы с кракозябрами можно использовать отдельный хинт из полей плагина AnyTag. Я сейчас проверил: он без проблем отображает теги сохраненные в ANSI. Кроме того, шаблоном подсказки можно легко управлять через файл anytag.any:

[cut]0=8|Тэги|%_tag%
1=8|Почитан|%_tag_read%
2=8|Album|%album%
3=8|Artist|%artist%
4=8|Album Artist|%albumartist%
5=8|Comment|%comment%
6=8|Genre|%genre%
7=8|Title|%title%
8=8|Track|%track%
9=8|Track (leading zeros)|[$num(%track%,2)]
10=8|Year|%year%
11=8|Composer|%composer%
12=8|Covers|%_covers%
13=8|Bitrate|%_bitrate%
14=8|Codec|%_codec%
15=8|Length|%_length%
16=8|Length (in seconds)|%_length_seconds%
17=8|Mode|%_mode%
18=8|Samplerate|%_samplerate%
19=8|TagSize|%_tag_size%
20=8|Extra information|%_extra%[/cut]
Я не стал до конца переводить русские поля, это только для примера. Сам плагин можно прицепить к подсказке вместо данных MediaInfo и временно им отображать тэги при наведении на файл. Сейчас у меня это делается при помощи комбинации CTRL+SHIFT или через закрепление подсказки по SHIFT+CAPSLOCK. Если хотите, посмотрите в сборке: плагин anytag.wdx нужно выбрать в контекстном меню строки состояния.

Добавлено: Пт апр 25, 2025 16:18
AkulaBig
Orion9 писал(а):Как вариант решения проблемы с кракозябрами можно использовать отдельный хинт из полей плагина AnyTag
Мы как-то эту тему обсуждали. Там крякозябры совсем другие, если мне память не изменяет. AnyTag не поможет. Да и лучше с крякозябрами, чем без MI. Придумаем что-нибудь. Вот в TCMediaInfo этот вопрос решается функций fix_cp. Сейчас узнаю про нее.
Loopback
Хотелось-бы уточнить. Нельзя-ли вашу функцию fix_cp из плагина TCMediaInfo применить в моем скрипте MediaInfo для преобразования крякозябр? Если посмотрите выше, увидите, что на au3 этот вопрос решается. Но не понятно, можно-ли такое написать в Autorun. Да и вообще было-бы удобно использовать уже существующую функцию из вашего-же плагина.

Добавлено: Пт апр 25, 2025 19:12
Orion9
AkulaBig писал(а):AnyTag не поможет
С каких пор джентельменам не верят на слово? :)
Orion9 писал(а):Я сейчас проверил: он без проблем отображает теги сохраненные в ANSI
Вот так выглядит wdxtaglib.wdx спаренный с MediaInfo:
Изображение
А так wdxtaglib.wdx спаренный с anytag.wdx:
Изображение

P.S. Если серьёзно хотите браться за это дело, для начала экземпляры выложили куда-нибудь, а то я еле нашел у себя файлы с кракозябрами.

Добавлено: Пт апр 25, 2025 20:32
AkulaBig
Orion9 писал(а):С каких пор джентельменам не верят на слово?
[cut]
Джентльмен оскорбляет другого так тонко, что глубоко оскорбленным себя может почувствовать только другой джентльмен.
[/cut]
Orion9 писал(а):anytag.wdx
Зачем лезть в дебри? Есть-же TCMediaInfo. Но нам это пока ничего не дает.

Добавлено: Пт апр 25, 2025 21:28
Loopback
Orion9 писал(а):По-моему, в справке указан неправильный порядок параметров:
Да, там ошибка, Encoding должен быть последним. CP:nnn посмотрю.
AkulaBig писал(а):Нельзя-ли вашу функцию fix_cp из плагина TCMediaInfo применить в моем скрипте MediaInfo для преобразования крякозябр?
Можно повторить, конечно. Идея основана на том, что при преобразовании юникодной строки в ISO-8859-1 (единственной допустимой ANSI-кодировки для тега) функцией WideCharToMultiByte, если в ней есть любые символы юникода c кодом > 255, то функция будет заменять их в выводе на символ замены (по умолчанию ?). В этом случае предполагаем, что у нас нормальный юникод и оставляем строку без изменений. Если замен не было, это может быть некорректный юникод (точнее, формально он корректный, но неправильный с точки зрения кодировки), в этом случае конвертируем в ANSI c кодировкой ISO-8859-1, а затем обратно в юникод с системной кодировкой CP_ACP.

Вот только в TCMediaInfo это работает на отдельно взятой строке, полученной из конкретного тега, когда есть уверенность, что весь текст в одной кодировке, правильной или нет. А вот на выводе Inform, думаю, не сработает, т.к. там будет смешан как валидный юникод, так и невалидный.

Так или иначе, на Autorun это будет как-то так:

Код: Выделить всё

Func FixCodepage(src)
    Local bUsedRepl, Output
    # iso-8859-1 = 28591
    Local nSize = DllCall("WideCharToMultiByte", "uint", 28591, "dword", 0, "wstr", src, "int", -1, "ptr", 0, "int", 0, "ptr", 0, "bool*", @bUsedRepl)
    If bUsedRepl Then Return src

    # поскольку Autorun не работает нативно с ANSI-строками, 
    # результат в Output будет неявно преобразован с кодировкой CP_ACP 
    DllCall("WideCharToMultiByte", "uint", 28591, "dword", 0, "wstr", src, "int", -1, "str:" & nSize, @Output, "int", nSize, "ptr", 0, "ptr", 0)

    Return Output
EndFunc

Добавлено: Пт апр 25, 2025 22:27
AkulaBig
Loopback писал(а):на выводе Inform, думаю, не сработает
Ну да, не работает. Будем дальше думать.

Добавлено: Пт апр 25, 2025 23:21
Orion9
[cut="AkulaBig"]Джентельменом я могу себя почувствовать только посмотрев хорошее кино, другого, увы, не дано :lol:[/cut]
AkulaBig писал(а):Зачем лезть в дебри?
А это и не дебри, это альтернативный хинт. Если попадутся, например, кракозябры, то можно повторно навести на файл с удержанием CTRL+SHIFT и тем самым хотя бы увидеть основные тэги такие, как "Имя","Альбом","Исполнитель", в нормальном виде. Конечно, кастомные тэги и поля, который допускает формат ID3v2, увидить так не получится, но хотя бы что-то. Этого уже будет достаточно, чтобы понять, что из себя представляет проблемный файл, и перекодировать его потом на диске.
Loopback писал(а):А вот на выводе Inform, думаю, не сработает, т.к. там будет смешан как валидный юникод, так и невалидный.
Говорил, говорю и буду говорить: такие файлы нужно перекодировать на диске. Всего-то нужно запустить программу AnyTag и пересохранить тэг в UTF-16. Если случай уж совсем не безнадежный, этого должно хватить.
AkulaBig писал(а):Ну да, не работает. Будем дальше думать.
Можно попробовать предложенный Loopback код на второй части строки, она ведь разбивается по символу ":"

Добавлено: Сб апр 26, 2025 06:42
AkulaBig
Orion9 писал(а):А это и не дебри, это альтернативный хинт.
Я имею ввиду когда есть TCMediaInfo, который стоит у всех и правильно показывает крякозябры, использовать anytag. Можно-же на нем тестировать. Только какой в этом смысл, если его не скрестить с MI?
Orion9 писал(а):Говорил, говорю и буду говорить: такие файлы нужно перекодировать на диске.
Никто с вами и не спорит, но сейчас-то цель прочитать крякозябры и код на au3 это прекрасно делает.
Orion9 писал(а):Можно попробовать предложенный Loopback код на второй части строки, она ведь разбивается по символу ":"
Конечно первым делом так и попробовал. А потом, на всякий случай, попробовал и всю строку.
Там в первой строке на выходе 0 или 1. И получается, что на этих полях всегда ноль и они пустые.

Добавлено спустя 8 минут:

Интересно получается. Вот картинка с крякозябрами:
Изображение
Поля с крякозябрами в нуле, поэтому не выводятся. Обратите внимание, какой это уродливый файл. Помимо крякозябр есть еще крякозябры в комментах, которые никто побороть не может.
А вот файл с полями на английском:
Изображение
У него тоже поля в нуле. Так что явно проблема в этом. Код:

Код: Выделить всё

Return StrTrim(a) & ": " & StrTrim(FixCodepage(b))
Добавлено спустя 9 минут:

Попробовал вручную разные значения nSize. Комментил строку If bUsedRepl Then Return src Ничего не помогло.

Добавлено: Сб апр 26, 2025 11:18
Orion9
AkulaBig
Дело близко к завершению. При включеном CapsLock вторая часть строки фиксится:

Код: Выделить всё

Func TrimSpaces(String)
    Local a, b
    If Not StrPos(String, ":") Then Return String

    a = StrPart(String, ": ", 1)
    b = StrPart(String, ": ", 2)

    Return StrTrim(a) & ": " & StrTrim(FixCP(b))
EndFunc 

Func FixCP(String)
    If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) = 0 Then Return String
    Local nSize = StrLen(String)
    Local buf = Buffer(nSize)
    buf.Zero()
    DllCall("WideCharToMultiByte", "uint", 28591, _
                                   "dword", 0, _
                                   "wstr", String, _ 
                                   "int", -1, _
                                   "ptr", buf.ptr, "int", nSize, "ptr", 0, "ptr", 0)
    Local fixed = buf.GetStr(0, nSize, "ANSI")       
    Free(buf)
    Return fixed
EndFunc

Добавлено: Сб апр 26, 2025 14:57
AkulaBig
Orion9 писал(а):Дело близко к завершению.
Круто, работает! Осталось сделать проверку на наличие крякозябр. А то при включенном капсе все остальные русские значения отображаются знаками вопроса.

Добавлено спустя 1 час 57 минут:

Подмел 8)

Код: Выделить всё

Func FixCP(String)
	Local bUsedRepl
	Local nSize = StrLen(String)
	Local buf = Buffer(nSize)
	buf.Zero()

	# iso-8859-1 = 28591
	DllCall("WideCharToMultiByte", _
		"uint", 28591, _
		"dword", 0, _
		"wstr", String, _
		"int", -1, _
		"ptr", 0, _
		"int", 0, _
		"ptr", 0, _
		"bool*", @bUsedRepl)
	If bUsedRepl Then Return String

	DllCall("WideCharToMultiByte", _
		"uint", 28591, _
		"dword", 0, _
		"wstr", String, _
		"int", -1, _
		"ptr", buf.ptr, _
		"int", nSize, _
		"ptr", 0, _
		"ptr", 0)
	Local fixed = buf.GetStr(0, nSize, "ANSI")
	Free(buf)
	Return fixed
EndFunc
Я-же подметальщик. Только я чего-то замыслю. Уже прилетает ответ. Я только причесал секцию хинтов и уже хотел разбираться с крякозябрами. А у вас уже готовый код. Прикрутил только проверку от Loopback и вот готовый код. Конфетка! Теперь с чистой совестью можно поразбираться с вашим массивом.

Добавлено спустя 20 минут:

Похоже что потихоньку приближаемся к давнишней мечте. Кажется через плагин SuperWDX возможно и пользовательские колонки сделать через Autorun.
Кстати, непонятная ситуация. Раньше автор SuperWDX запрещал использовать его в чужих сборках. Но потом автор сменился. Никто не знает, можно-ли сейчас пользоваться этим плагином в сборках? У меня сборка, совершенно случайно получилась без вареза, поэтому интересен этот вопрос.

Добавлено: Сб апр 26, 2025 16:30
AkulaBig
Orion9 писал(а):теперь при включеном CapsLock будет отображаться подсказка из шаблона
Потестил. Оставил пока в коде, до появления файлов с несколькими дорожками. Вроде общая подсказка теперь должна показывать все эти данные.
У меня скриптик с чтением полей из массива есть. Он другой, но тот-же по принципу.

Добавлено: Сб апр 26, 2025 23:29
Orion9
AkulaBig писал(а):Конфетка!
И правда смотрится стройно и красиво! Но я бы всё-таки оставил ручное переключение или по крайней мере сохранил такую возможность, поскольку не понятно, есть в оригинале кракозябры или нет. Если бы в объекте Buffer не было проблем с параметром Encoding "CP:nnn", то, вероятно, код можно было свести до варианта без DllCall:

Код: Выделить всё

Local size = StrLen(pipe)
Local buf = Buffer(size)
buf.Zero()
buf.SetStr(pipe, 0, size, "CP:28591")
pipe = buf.GetStr(0, size, "ANSI")       
Free(buf)
AkulaBig писал(а):Раньше автор SuperWDX запрещал использовать его в чужих сборках
На такое стихи писать можно, не иначе.
Стихотворение называется:
[cut="Я плакалЪ"]

Код: Выделить всё

Я плакал,
   Я плакал долго.
Потом рыдал,
   Рыдал я громко.
Повёл рукой, 
   Нажал на кнопку...
Нет, господа:
   Такое - в топку.
[/cut]
Если серьёзно, то плагин устарел. Autorun предлагает сейчас больше возможностей. Если хотите, посмотрите функцию GetSuperWdx в модуле Plugin.aucfg - было дело, эксперементировал.
AkulaBig писал(а):Оставил пока в коде, до появления файлов с несколькими дорожками.
У вас нет ни одного фильма с несколькими дорожками? :shock:
Ну, тогда могу продемонстрировать на своём:
Изображение
Пойду, пожалуй, пересмотрю в 100-й раз. Только вот не знаю с какой дорожкой на этот раз )