Autorun
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
yahuu
Не совсем, это особенность работы Total Commander в режиме эскизов и различия в методах получения элемента. Обратите внимание, что ItemAtCursor в режиме эскизов может получать текст только
текущего элемента и только тогда, когда курсор находится над тем рядом эскизов, где расположен выделенный элемент. Т.е. эту функцию в режиме эскизов можно использовать только в том случае, если сначала активировать элемент под курсором.
Но для GetCurrentItem возможность получения текста а режиме эскизов выглядит разумной, т.к. укладывается в логику работы функции. Доработал GetCurrentItem.
Runtime 2025-04-19
Не совсем, это особенность работы Total Commander в режиме эскизов и различия в методах получения элемента. Обратите внимание, что ItemAtCursor в режиме эскизов может получать текст только
текущего элемента и только тогда, когда курсор находится над тем рядом эскизов, где расположен выделенный элемент. Т.е. эту функцию в режиме эскизов можно использовать только в том случае, если сначала активировать элемент под курсором.
Но для GetCurrentItem возможность получения текста а режиме эскизов выглядит разумной, т.к. укладывается в логику работы функции. Доработал GetCurrentItem.
Runtime 2025-04-19
Orion9
Наконец-то дошли руки до тестирования MediaInfo. Подключаю через DllCall, взяв за основу вашу функцию BigHint:
[cut]
[/cut]
ProcessExecGetOutput закомментил, так как совершенно не понимаю, как в данном случае организовать возврат значения в нее. Есть-ли у вас какие идеи на этот счет? А то не могу проверить, вообще правильно-ли подключил MI.
Наконец-то дошли руки до тестирования MediaInfo. Подключаю через DllCall, взяв за основу вашу функцию BigHint:
[cut]
Код: Выделить всё
Func BigHint(FileName, FieldIndex, UnitIndex)
Local b_CTRL = IsPressed (0x11)
Static pipe, idx = 0
If Not (b_CTRL) Then Return
If FieldIndex = 1 Then
idx = 0
If b_CTRL Then
Local hDLL = DllCall("LoadLibrary", _
"wstr", util_MI, _
"handle")
# OutputDebugString(hDLL)
# Получить дескриптор DLL
Local hMediaInfo = DllCall("mediainfo\MediaInfo_New", "handle")
# OutputDebugString(hMediaInfo)
# Открыть файл
Local ResOpenFile = DllCall("mediainfo\MediaInfo_Open", _
"ptr", hMediaInfo, _
"wstr", FileName)
# OutputDebugString(ResOpenFile)
Local InfoParameters = DllCall("mediainfo\MediaInfo_Option", _
"ptr", 0, _
"wstr", "Complete", _
"wstr", "")
# OutputDebugString(InfoParameters)
Local pipe = DllCall("mediainfo\MediaInfo_Inform", _
"ptr", hMediaInfo, _
"int", 0)
# OutputDebugString(aMediaInfoInform)
# ProcessExecGetOutput /C:65001 pipe %sMI% ' --Language=file://ru.csv "--Complete=0" "%FileName%"' %pMI%
If IsPressed (0x5B) Then
idx = 50
Endif
Endif
Endif
Return TrimSpaces(StrPart(pipe, auLF, FieldIndex + idx))
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
ProcessExecGetOutput закомментил, так как совершенно не понимаю, как в данном случае организовать возврат значения в нее. Есть-ли у вас какие идеи на этот счет? А то не могу проверить, вообще правильно-ли подключил MI.
AkulaBig
В дебри старого кода лезть не хочется, да и нет такой возможности. Наверное, лучше сделать отдельную кнопку и попробовать на ней для начала, как всё будет работать:
Наспех сделанный и плохо протестированный код, но, кажется, он работает. Вызов с CTRL показывает все данные MediaInfo файла под курсором.
Фича с подсказкой при наведении на файлы мне очень нравится, регулярно ей пользуюсь. Но, насколько я понимаю, вы юзаете x64, а там с этим есть определенные проблемы. И всё же, если будете делать, то лучше, наверное, делать вызов функций по адресам, как это сделано в ahk-скрипте:
А саму библиотеку загружать только один раз при старте ТС или при первом вызове функции BigHint.
В дебри старого кода лезть не хочется, да и нет такой возможности. Наверное, лучше сделать отдельную кнопку и попробовать на ней для начала, как всё будет работать:
Код: Выделить всё
TOTALCMD#BAR#DATA
60020
%COMMANDER_EXE%
MediaInfoTest
1
-1
Код: Выделить всё
RegisterCommand 60020 "MediaInfoTest"
Func MediaInfoTest(lParam)
Local file = RequestCopyDataInfo("SP") & RequestCopyDataInfo("SN")
If Not FileExist(file) Then
ShowHint("Файл не существует " & file)
Return
Endif
If StrPos(FileGetAttr(file), "D") Then
ShowHint("Каталог" & file)
Return
Endif
Static sLib = "MediaInfo" & (auX64 ? "" : "_i386") & ".dll", _
hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Ini\Tools\Libs\" & sLib, "ptr")
If hLib = 0 Then
ShowHint("Error LoadLibrary " & sLib)
Return
EndIf
Local hMI = DllCall(sLib & '\MediaInfo_New', "Ptr")
If hMI = 0 Then
ShowHint("MediaInfo_New returned 0")
Return
Endif
If DllCall(sLib & '\MediaInfo_Open', 'ptr', hMI, "wstr", file, "uint") <> 1 Then
DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
Return ShowHint("MediaInfo_Open failed to open file " & file)
EndIf
If IsPressed(0x11) Then
DllCall(sLib & '\MediaInfo_Option', 'ptr', hMI, "wstr", "Complete", "wstr", "1", "wstr")
EndIf
Local sMI = DllCall(sLib & '\MediaInfo_Inform', 'ptr', hMI, "uint", 0, "wstr")
DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
ShowHint(sMI)
EndFuncФича с подсказкой при наведении на файлы мне очень нравится, регулярно ей пользуюсь. Но, насколько я понимаю, вы юзаете x64, а там с этим есть определенные проблемы. И всё же, если будете делать, то лучше, наверное, делать вызов функций по адресам, как это сделано в ahk-скрипте:
Код: Выделить всё
;get dll handle
this.dll := DllCall("LoadLibrary", "Str", dll_location, "Ptr")
;get pointers to make functions cleaner
this.MediaInfo_New := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_New", "Ptr")
this.MediaInfo_Open := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Open", "Ptr")
this.MediaInfo_Inform := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Inform", "Ptr")
this.MediaInfo_Option := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Option", "Ptr")
this.MediaInfo_Close := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Close", "Ptr")
this.MediaInfo_Delete := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Delete", "Ptr")
;use this.handle during subsequent dll calls
this.handle := DllCall(this.MediaInfo_New, "Ptr")
;set some defaults
this.Option("Inform","TXT")И я просто балдею от нее.Orion9 писал(а):Фича с подсказкой при наведении на файлы мне очень нравится, регулярно ей пользуюсь.
Поэтому я и полез сразу в функцию. А вы правы. Лучше сначала на кнопке отладить работу MI. Просто мне не понятно, есть шанс, что библиотека в х64 заработает?Orion9 писал(а):насколько я понимаю, вы юзаете x64, а там с этим есть определенные проблемы.
Даже не знал, что так можно. Я-то за основу взял свой рабочий скрипт на au3, опять-же основанный на скрипте из инета. И на ahk встречал только точно такой-же. Естественно с учетом синтаксиса.Orion9 писал(а):И всё же, если будете делать, то лучше, наверное, делать вызов функций по адресам, как это сделано в ahk-скрипте
В общем есть что поковырять. А я сейчас именно этой темой и занят. Правда еще одна очень интересная тема есть. Но пока MI в приоритете.
Да у вас всё правильно вроде сделано. Разве что вопрос вызывает строчка:AkulaBig писал(а):Поэтому я и полез сразу в функцию.
Код: Выделить всё
Local InfoParameters = DllCall("mediainfo\MediaInfo_Option", _
"ptr", 0, _
"wstr", "Complete", _
"wstr", "") Код, который я запостил выше, хоть и сырой, но в ТС x64 работает, а значит и в подсказке с кастомными полями он тоже работать будет, если, конечно, вытрясти из Гислера корректную работу CTRL и других клавиш-модификаторов. Насколько реально из него такое вытрясти, ответ вы, думаю, знаете: как только он услышит слово "Autorun", все последние шансы тут же улетучатся.AkulaBig писал(а):Просто мне не понятно, есть шанс, что библиотека в х64 заработает?
На сайте MediaInfo есть архив для разработчиков с примерами вызова и описанием всех функций, но я не стал его скачивать. Взял за основу ваш код, недавний код для uchardet и класс для работы с MediaInfo на ahk для сверки:AkulaBig писал(а): Я-то за основу взял свой рабочий скрипт на au3, опять-же основанный на скрипте из инета. И на ahk встречал только точно такой-же.
https://github.com/Qriist/class_MediaIn ... iaInfo.ahk
Получилось довольно быстро. Помню, когда только начинал делать первые вызовы DllCall, на это уходило очень много времени. Думаю, скоро и у вас не будет с этим никаких проблем.
Это хорошо, тем более что международный слоган Autorun пока никто не менял: "Embody your fantasies and make Total Commander great again!" )AkulaBig писал(а):Правда еще одна очень интересная тема есть.
Так в оригинале. Там-же строковый параметр. Разберемся.Orion9 писал(а):Где указатель почему-то нулевой.
Про это я помнил. В начале даже handle прописал. Но далее не знал, какое значение надо прописывать. Ваши значения у меня тоже вызывают вопросы. Пока я в этом не очень.Orion9 писал(а):Ещё во всех вызовах DllCall желательно указыввать тип возвращаемого значения, чтобы не бралось значение по умолчанию.
Не работает у меня по простой причине. Нет вывода в консоль. И ваше ShowHint(sMI) вроде для пользовательских полей тоже не прокатит. Если я правильно понимаю, можно только ProcessExecGetOutput использовать. А вот написать с ним выражение не получилось. Или я опять чего-то не догоняю и ShowHint будет выводить значение в поле?Orion9 писал(а):Возможно из-за этого не работает.
Кнопки и с MI.exe прекрасно в х64 работали. Так что не факт.Orion9 писал(а):в ТС x64 работает, а значит и в подсказке с кастомными полями он тоже работать будет
Будем надеяться когда-нибудь придет на землю русскую Витязь или Батыр и так встряхнет Гислера, что он все наши хотелки сделаетOrion9 писал(а):если, конечно, вытрясти из Гислера корректную работу CTRL
Как вы эти ссылки находите-то? Я вроде лазил по сайту, но ничего подобного не нашел. А можете ссылку именно на этот архив дать?Orion9 писал(а):На сайте MediaInfo есть архив для разработчиков с примерами вызова и описанием всех функций
Мне аж стыдно, но тема к Autorun отношения не имеетOrion9 писал(а):международный слоган Autorun
Я исходил из кода Ahk, но значение "ноль", видимо, допустимо (проверил пример на Au3).AkulaBig писал(а):Так в оригинале. Там-же строковый параметр. Разберемся.
Да я как бы тоже... не очень )AkulaBig писал(а):Ваши значения у меня тоже вызывают вопросы. Пока я в этом не очень.
Loopback, наверное, может подказать более правильно, тем более что целый wdx-плагин был сделан на вызовах MediaInfo.
А он тут и не нужен. Из консоли бралось в переменную, сейчас будет браться из DLL. Переделал код кнопки в кастомные поля:AkulaBig писал(а):Не работает у меня по простой причине. Нет вывода в консоль
Код: Выделить всё
Func JoinHint(FileName, FieldIndex, UnitIndex)
Local b_CTRL = IsPressed (0x11)
If Not b_CTRL Then
Return
EndIf
Static pipe, idx = 0
Static sLib = "MediaInfo" & (auX64 ? "" : "_i386") & ".dll", _
hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Ini\Tools\Libs" & sLib, "ptr")
If hLib = 0 Then
Return "Error LoadLibrary " & sLib
EndIf
If FieldIndex = 1 Then
idx = 0
Local hMI = DllCall(sLib & '\MediaInfo_New', "Ptr")
If hMI = 0 Then
Return "MediaInfo_New returned 0"
Endif
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", "", "wstr")
If IsPressed(0x10) Then
DllCall(sLib & '\MediaInfo_Option', 'ptr', hMI, "wstr", "Complete", "wstr", "1", "wstr")
EndIf
pipe = DllCall(sLib & '\MediaInfo_Inform', 'ptr', hMI, "uint", 0, "wstr")
DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
If IsPressed (0x5B) Then
idx = 50
Endif
Endif
Return TrimSpaces(StrPart(pipe, auLF, FieldIndex + idx))
EndFunc Боюсь, это не поможет. Гислеру наши хотелки не нужны, у него своё, дальнее видение. Видеоплеер и 7zip уже прикрутил, теперь, видимо, браузер на очереди. Он еще доведёт, ДОВЕДЁТ свое детище до крылатой фразы "Куда же Тотал без браузера-то, а лучше двух" )AkulaBig писал(а):придет на землю русскую Витязь или Батыр и так встряхнет Гислера, что он все наши хотелки сделает
Да вроде бы здесь всё:AkulaBig писал(а):Я вроде лазил по сайту, но ничего подобного не нашел. А можете ссылку именно на этот архив дать?
https://mediaarea.net/en/MediaInfo/Download/Windows
https://mediaarea.net/download/binary/l ... staller.7z
Внутри каталог "Developers".
В топике это обсуждалось. Ничего не поделать: в TC x64 остаётся пока только "лочить" подсказку.AkulaBig писал(а):ТС х64 не работает.
Сейчас с DllCall можно проверять статус клавиши, например CapsLock, не прибегая к функции SetHotkeyAction и "локу" через переменные:
Код: Выделить всё
Local bCaps = DllCall("GetKeyState", "int", 0x14, "short")
Local b_CTRL = BitAND(bCaps, 1)
[cut]
Код: Выделить всё
Func JoinHint(FileName, FieldIndex, UnitIndex)
Local bCaps = DllCall("GetKeyState", "int", 0x14, "short")
Local b_CTRL = BitAND(bCaps, 1)
If Not b_CTRL then b_CTRL = IsPressed (0x11)
If Not b_CTRL Then Return
Static pipe, idx = 0
Static sLib = "MediaInfo" & (auX64 ? "" : "_i386") & ".dll", _
hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Ini\Tools\Libs" & sLib, "ptr")
If hLib = 0 Then
Return "Error LoadLibrary " & sLib
EndIf
If FieldIndex = 1 Then
idx = 0
Local hMI = DllCall(sLib & '\MediaInfo_New', "Ptr")
If hMI = 0 Then
Return "MediaInfo_New returned 0"
Endif
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", "", "wstr")
If IsPressed(0x10) Then
DllCall(sLib & '\MediaInfo_Option', 'ptr', hMI, "wstr", "Complete", "wstr", "1", "wstr")
EndIf
pipe = DllCall(sLib & '\MediaInfo_Inform', 'ptr', hMI, "uint", 0, "wstr")
DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
If IsPressed (0x5B) Then
idx = 50
Endif
Endif
Return TrimSpaces(StrPart(pipe, auLF, FieldIndex + idx))
EndFunc Конечно, не всегда удобно держать подсказку "на замке", но другого варианта для х64 пока нет.
Поля работают. Не работает именно подсказка при нажатии клавиш-модификаторов. Можете проверить. Вызовите в х64 стандартную подсказку для любого файла и нажмите CTRL - подсказка просто исчезнет. И это случается только с ТС х64, в 32-битном ТС всё нормально.AkulaBig писал(а):Получаются не работают сами кастомные поля в ТС х64?
Как-то мало там информации. Я, например, не понял, что именно делает параметр типа "Ptr" в MediaInfo_Open. В доках его вообще нет, хотя я глубоко не разбирался.AkulaBig писал(а):показалось, что ссылка выше совсем не из этих документов.
Loopback
Если привязать функцию к CapsLock командой SetHotkeyAction /V:20, то как сделать, чтобы эта функции пропускала через себя нажатие этой клавиши? Сейчас она блокируется.
Набрел на SendInput, но разбираться и эксперементировать со структурой INPUT сейчас совсем времени нет.
А какие-то доп настройки надо делать? Не работает и этот код.Orion9 писал(а):Конечно, не всегда удобно держать подсказку "на замке", но другого варианта для х64 пока нет.
Я это помню. Но там было без подробностей.Orion9 писал(а):В топике это обсуждалось.
Я и писал handle, а оказывается ptr нужен. В примере на au3 используется массив. Видимо поэтому и ptr.Orion9 писал(а):Как-то мало там информации
Проверял в обеих версиях, код должен работать.AkulaBig писал(а):Не работает и этот код.
А в 32-битном у вас тоже не работает? Наверное, здесь могут быть только пути или имена функций виноваты. У меня в заголовке autorun.cfg:
Код: Выделить всё
Pragma AutorunPluginFields "C1:::JoinHint" "C2:::JoinHint" "C3:::JoinHint" "C4:::JoinHint" "C5:::JoinHint" "C6:::JoinHint" "C7:::JoinHint" "C8:::JoinHint" "C9:::JoinHint" "C10:::JoinHint" "C11:::JoinHint" "C12:::JoinHint" "C13:::JoinHint" "C14:::JoinHint" "C15:::JoinHint" "C16:::JoinHint" "C17:::JoinHint" "C18:::JoinHint" "C19:::JoinHint" "C20:::JoinHint" "C21:::JoinHint" "C22:::JoinHint" "C23:::JoinHint" "C24:::JoinHint" "C25:::JoinHint" "C26:::JoinHint" "C27:::JoinHint" "C28:::JoinHint" "C29:::JoinHint" "C30:::JoinHint" "C31:::JoinHint" "C32:::JoinHint" "C33:::JoinHint" "C34:::JoinHint" "C35:::JoinHint" "C36:::JoinHint" "C37:::JoinHint" "C38:::JoinHint" "C39:::JoinHint" "C40:::JoinHint" "C41:::JoinHint" "C42:::JoinHint" "C43:::JoinHint" "C44:::JoinHint" "C45:::JoinHint" "C46:::JoinHint" "C47:::JoinHint" "C48:::JoinHint" "C49:::JoinHint" "C50:::JoinHint" "C51:::JoinHint" "C52:::JoinHint" "C53:::JoinHint" "C55:::JoinHint" "C55:::JoinHint" "C56:::JoinHint" "C57:::JoinHint" "C58:::JoinHint" "C59:::JoinHint" "C60:::JoinHint"Подробности были немного ранееAkulaBig писал(а):Я это помню. Но там было без подробностей.
TC x32 не трогаем. В нем работало всегда и работают сейчас любые варианты.Orion9 писал(а):А в 32-битном у вас тоже не работает?
Тогда-бы и в х32 не работало. У вас в настройках все подсказки включены? Я могу посмотреть вашу сборку, но может вы с тех пор меняли какие-то настройки? Может выложите последнюю версию сборки с ТС х64?Orion9 писал(а):Наверное, здесь могут быть только пути или имена функций виноваты.
Теперь понятно.Orion9 писал(а):Подробности были немного ранее
Добавлено спустя 1 час 3 минуты:
Если все дело в клавишах-модификаторов, то может и ну их. Надо попробовать без них, будет-ли работать.
Добавлено спустя 9 минут:
Проверил. Без модификаторов все работает и я так и оставляю. Меня это полностью устраивает. Теперь надо русский язык прикрутить и с d разобраться. Эх, не знал я ранее об источнике проблемы. Давно-бы убрал его.
И сразу думка о будущем. Можно-ли будет полям присвоить осмысленные названия или они в каждом файле не соответствуют друг-другу? Это я для использования не в хинтах, а в кастомных полях. Главное дело сдвинулось с мертвой точки.
Нет, каких-то крупных изменений с момента последней ссылки на предыдущей странице больше не было, если не считать перехода с Autorun 2.2.17 на 2.2.18, но весь код остался прежним. Я просто заметил, что вы используете старое имя функции "BigHint", которое я давно уже поменял на "JoinHint".AkulaBig писал(а):вы с тех пор меняли какие-то настройки?
Основная причина использования модификаторов при вызове подсказки была в том, чтобы сохранить старый хинт с полями плагина TCMediaInfo как хинт по умолчанию. У меня настроенный XML-файл конфигурации, который меня вполне устраивает, даже больше, чем вполне. Но иногда требуется получить развернутую информацию о медиа-файлах, в том числе и сводную, компактную информацию о дорожках. Отсюда файл-шаблона hint.txt в сборке, который там пока больше для примера, поскольку я так и не доделал формат вывода так, чтобы длинные строки не разрывались:AkulaBig писал(а):Если все дело в клавишах-модификаторов, то может и ну их.
[cut]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]
"d" нужно отдельно парсить. Это обрубок пути, который я не стал трогать, так как длинный путь разрывается и смотрится некрасиво.AkulaBig писал(а):Теперь надо русский язык прикрутить и с d разобраться.
Русский добавить можно где-то так:
Код: Выделить всё
DllCall(sLib & '\MediaInfo_Option', 'ptr', hMI, "wstr", "Language", "wstr", "file://C:/Portable/TC 11.50/Ini/Tools/Libs/ru.csv", "wstr")Как я понял, у каждого файла свои. В этом вся и сложность задачи. Без шаблонов и фильтров источников не обойтись.AkulaBig писал(а):Можно-ли будет полям присвоить осмысленные названия или они в каждом файле не соответствуют друг-другу?
P.S. Не знаю, почему у вам CapsLock не работает. Только что еще раз проверил - у меня всё норм.
Это я заметил сразу. Не в этом дело.Orion9 писал(а):"BigHint", которое я давно уже поменял на "JoinHint"
Скорей всего у всех так. Но мне вариант без доп клавиш больше нравится.Orion9 писал(а):чтобы сохранить старый хинт с полями плагина TCMediaInfo как хинт по умолчанию
Я даже проверять не стал, как просек фишечку про клавиши-модификаторы.Orion9 писал(а):P.S. Не знаю, почему у вам CapsLock не работает. Только что еще раз проверил - у меня всё норм.
Вот ведь обидно как. Ведь для CLI я в свое время разобрался и написал:Orion9 писал(а):Русский добавить можно где-то так
Код: Выделить всё
"MediaInfo.exe" "--Language=file://ru.csv" "--Complete=0" "bestcity.mp3" --LogFile=Complete0.txt"
Я это уже понял. Так как сейчас тестовые файлы на С кинул для удобства тестирования. Сейчас эти шероховатости устраню, надо будет решать с крякозябрами. В au3 я эту проблему решил, посмотрим, можно-ли здесь это сделать.Orion9 писал(а):"d" нужно отдельно парсить.
Ну да, у меня просто сомнение возникло. Видимо можно связать их между собой, но головняк это. Нет смысла с этим связываться.Orion9 писал(а):Как я понял, у каждого файла свои. В этом вся и сложность задачи. Без шаблонов и фильтров источников не обойтись.
Добавлено спустя 22 минуты:
Язык прописал:
Код: Выделить всё
Local lng_MI ="file://" & COMMANDER_PATH & "\Utilities\MediaInfo\ru.csv"
DllCall(sLib & '\MediaInfo_Option', 'ptr', hMI, "wstr", "Language", "wstr", lng_MI, "wstr")
Вот причесанный код. Язык добавлен. Парсинг поправлен:
Код: Выделить всё
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")
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