View previous topic :: View next topic |
Author |
Message |
yahuu
Joined: 22 Jun 2023 Posts: 30
|
(Separately) Posted: Sat Apr 19, 2025 07:44 Post subject: |
|
|
В режиме миниатюр ItemAtCursor("text") может получить информацию, а GetCurrentItem не может. Это ошибка? |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1527
|
(Separately) Posted: Sat Apr 19, 2025 21:45 Post subject: |
|
|
yahuu
Не совсем, это особенность работы Total Commander в режиме эскизов и различия в методах получения элемента. Обратите внимание, что ItemAtCursor в режиме эскизов может получать текст только
текущего элемента и только тогда, когда курсор находится над тем рядом эскизов, где расположен выделенный элемент. Т.е. эту функцию в режиме эскизов можно использовать только в том случае, если сначала активировать элемент под курсором.
Но для GetCurrentItem возможность получения текста а режиме эскизов выглядит разумной, т.к. укладывается в логику работы функции. Доработал GetCurrentItem.
Runtime 2025-04-19 |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 334
|
(Separately) Posted: Tue Apr 22, 2025 22:06 Post subject: |
|
|
Orion9
Наконец-то дошли руки до тестирования MediaInfo. Подключаю через DllCall, взяв за основу вашу функцию BigHint:
 Hidden text
Code: |
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. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 780
|
(Separately) Posted: Wed Apr 23, 2025 13:35 Post subject: |
|
|
AkulaBig
В дебри старого кода лезть не хочется, да и нет такой возможности. Наверное, лучше сделать отдельную кнопку и попробовать на ней для начала, как всё будет работать:
Code: | TOTALCMD#BAR#DATA
60020
%COMMANDER_EXE%
MediaInfoTest
1
-1
|
Code: | 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 |
Наспех сделанный и плохо протестированный код, но, кажется, он работает. Вызов с CTRL показывает все данные MediaInfo файла под курсором.
Фича с подсказкой при наведении на файлы мне очень нравится, регулярно ей пользуюсь. Но, насколько я понимаю, вы юзаете x64, а там с этим есть определенные проблемы. И всё же, если будете делать, то лучше, наверное, делать вызов функций по адресам, как это сделано в ahk-скрипте:
Code: | ;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") |
А саму библиотеку загружать только один раз при старте ТС или при первом вызове функции BigHint. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 334
|
(Separately) Posted: Wed Apr 23, 2025 16:30 Post subject: |
|
|
Orion9 wrote: | Фича с подсказкой при наведении на файлы мне очень нравится, регулярно ей пользуюсь. |
И я просто балдею от нее.
Orion9 wrote: | насколько я понимаю, вы юзаете x64, а там с этим есть определенные проблемы. |
Поэтому я и полез сразу в функцию. А вы правы. Лучше сначала на кнопке отладить работу MI. Просто мне не понятно, есть шанс, что библиотека в х64 заработает?
Orion9 wrote: | И всё же, если будете делать, то лучше, наверное, делать вызов функций по адресам, как это сделано в ahk-скрипте |
Даже не знал, что так можно. Я-то за основу взял свой рабочий скрипт на au3, опять-же основанный на скрипте из инета. И на ahk встречал только точно такой-же. Естественно с учетом синтаксиса.
В общем есть что поковырять. А я сейчас именно этой темой и занят. Правда еще одна очень интересная тема есть. Но пока MI в приоритете. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 780
|
(Separately) Posted: Wed Apr 23, 2025 18:52 Post subject: |
|
|
AkulaBig wrote: | Поэтому я и полез сразу в функцию. |
Да у вас всё правильно вроде сделано. Разве что вопрос вызывает строчка:
Code: | Local InfoParameters = DllCall("mediainfo\MediaInfo_Option", _
"ptr", 0, _
"wstr", "Complete", _
"wstr", "") |
Где указатель почему-то нулевой. Ещё во всех вызовах DllCall желательно указыввать тип возвращаемого значения, чтобы не бралось значение по умолчанию. Возможно из-за этого не работает.
AkulaBig wrote: | Просто мне не понятно, есть шанс, что библиотека в х64 заработает? |
Код, который я запостил выше, хоть и сырой, но в ТС x64 работает, а значит и в подсказке с кастомными полями он тоже работать будет, если, конечно, вытрясти из Гислера корректную работу CTRL и других клавиш-модификаторов. Насколько реально из него такое вытрясти, ответ вы, думаю, знаете: как только он услышит слово "Autorun", все последние шансы тут же улетучатся.
AkulaBig wrote: | Я-то за основу взял свой рабочий скрипт на au3, опять-же основанный на скрипте из инета. И на ahk встречал только точно такой-же. |
На сайте MediaInfo есть архив для разработчиков с примерами вызова и описанием всех функций, но я не стал его скачивать. Взял за основу ваш код, недавний код для uchardet и класс для работы с MediaInfo на ahk для сверки:
https://github.com/Qriist/class_MediaInfo/blob/master/lib/class_MediaInfo.ahk
Получилось довольно быстро. Помню, когда только начинал делать первые вызовы DllCall, на это уходило очень много времени. Думаю, скоро и у вас не будет с этим никаких проблем.
AkulaBig wrote: | Правда еще одна очень интересная тема есть. |
Это хорошо, тем более что международный слоган Autorun пока никто не менял: "Embody your fantasies and make Total Commander great again!" ) |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 334
|
(Separately) Posted: Wed Apr 23, 2025 20:24 Post subject: |
|
|
Orion9 wrote: | Где указатель почему-то нулевой. |
Так в оригинале. Там-же строковый параметр. Разберемся.
Orion9 wrote: | Ещё во всех вызовах DllCall желательно указыввать тип возвращаемого значения, чтобы не бралось значение по умолчанию. |
Про это я помнил. В начале даже handle прописал. Но далее не знал, какое значение надо прописывать. Ваши значения у меня тоже вызывают вопросы. Пока я в этом не очень.
Orion9 wrote: | Возможно из-за этого не работает. |
Не работает у меня по простой причине. Нет вывода в консоль. И ваше ShowHint(sMI) вроде для пользовательских полей тоже не прокатит. Если я правильно понимаю, можно только ProcessExecGetOutput использовать. А вот написать с ним выражение не получилось. Или я опять чего-то не догоняю и ShowHint будет выводить значение в поле?
Orion9 wrote: | в ТС x64 работает, а значит и в подсказке с кастомными полями он тоже работать будет |
Кнопки и с MI.exe прекрасно в х64 работали. Так что не факт.
Orion9 wrote: | если, конечно, вытрясти из Гислера корректную работу CTRL |
Будем надеяться когда-нибудь придет на землю русскую Витязь или Батыр и так встряхнет Гислера, что он все наши хотелки сделает
Orion9 wrote: | На сайте MediaInfo есть архив для разработчиков с примерами вызова и описанием всех функций |
Как вы эти ссылки находите-то? Я вроде лазил по сайту, но ничего подобного не нашел. А можете ссылку именно на этот архив дать?
Orion9 wrote: | международный слоган Autorun |
Мне аж стыдно, но тема к Autorun отношения не имеет  |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 780
|
(Separately) Posted: Thu Apr 24, 2025 00:21 Post subject: |
|
|
AkulaBig wrote: | Так в оригинале. Там-же строковый параметр. Разберемся. |
Я исходил из кода Ahk, но значение "ноль", видимо, допустимо (проверил пример на Au3).
AkulaBig wrote: | Ваши значения у меня тоже вызывают вопросы. Пока я в этом не очень. |
Да я как бы тоже... не очень )
Loopback, наверное, может подказать более правильно, тем более что целый wdx-плагин был сделан на вызовах MediaInfo.
AkulaBig wrote: | Не работает у меня по простой причине. Нет вывода в консоль |
А он тут и не нужен. Из консоли бралось в переменную, сейчас будет браться из DLL. Переделал код кнопки в кастомные поля:
Code: | 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 |
Работает. SHIFT - полная инфа. Очень быстро работает, надо будет переделать старый хинт, когда руки доберуться.
AkulaBig wrote: | придет на землю русскую Витязь или Батыр и так встряхнет Гислера, что он все наши хотелки сделает |
Боюсь, это не поможет. Гислеру наши хотелки не нужны, у него своё, дальнее видение. Видеоплеер и 7zip уже прикрутил, теперь, видимо, браузер на очереди. Он еще доведёт, ДОВЕДЁТ свое детище до крылатой фразы "Куда же Тотал без браузера-то, а лучше двух" )
AkulaBig wrote: | Я вроде лазил по сайту, но ничего подобного не нашел. А можете ссылку именно на этот архив дать? |
Да вроде бы здесь всё:
https://mediaarea.net/en/MediaInfo/Download/Windows
https://mediaarea.net/download/binary/libmediainfo0/25.03/MediaInfo_DLL_25.03_Windows_x64_WithoutInstaller.7z
Внутри каталог "Developers". |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 334
|
(Separately) Posted: Thu Apr 24, 2025 11:50 Post subject: |
|
|
ТС х64 не работает. Получаются не работают сами кастомные поля в ТС х64?
Orion9 wrote: | Внутри каталог "Developers". |
Я даже смотрел этот каталог, но показалось, что ссылка выше совсем не из этих документов. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 780
|
(Separately) Posted: Thu Apr 24, 2025 13:03 Post subject: |
|
|
AkulaBig wrote: | ТС х64 не работает. |
В топике это обсуждалось. Ничего не поделать: в TC x64 остаётся пока только "лочить" подсказку.
Сейчас с DllCall можно проверять статус клавиши, например CapsLock, не прибегая к функции SetHotkeyAction и "локу" через переменные:
Code: | Local bCaps = DllCall("GetKeyState", "int", 0x14, "short")
Local b_CTRL = BitAND(bCaps, 1)
|
Полный, рабочий код:
 Hidden text Code: | 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 пока нет.
AkulaBig wrote: | Получаются не работают сами кастомные поля в ТС х64? |
Поля работают. Не работает именно подсказка при нажатии клавиш-модификаторов. Можете проверить. Вызовите в х64 стандартную подсказку для любого файла и нажмите CTRL - подсказка просто исчезнет. И это случается только с ТС х64, в 32-битном ТС всё нормально.
AkulaBig wrote: | показалось, что ссылка выше совсем не из этих документов. |
Как-то мало там информации. Я, например, не понял, что именно делает параметр типа "Ptr" в MediaInfo_Open. В доках его вообще нет, хотя я глубоко не разбирался.
Loopback
Если привязать функцию к CapsLock командой SetHotkeyAction /V:20, то как сделать, чтобы эта функции пропускала через себя нажатие этой клавиши? Сейчас она блокируется.
Набрел на SendInput, но разбираться и эксперементировать со структурой INPUT сейчас совсем времени нет. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 334
|
(Separately) Posted: Thu Apr 24, 2025 13:22 Post subject: |
|
|
Orion9 wrote: | Конечно, не всегда удобно держать подсказку "на замке", но другого варианта для х64 пока нет. |
А какие-то доп настройки надо делать? Не работает и этот код.
Orion9 wrote: | В топике это обсуждалось. |
Я это помню. Но там было без подробностей.
Orion9 wrote: | Как-то мало там информации |
Я и писал handle, а оказывается ptr нужен. В примере на au3 используется массив. Видимо поэтому и ptr. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 780
|
(Separately) Posted: Thu Apr 24, 2025 13:39 Post subject: |
|
|
AkulaBig wrote: | Не работает и этот код. |
Проверял в обеих версиях, код должен работать.
А в 32-битном у вас тоже не работает? Наверное, здесь могут быть только пути или имена функций виноваты. У меня в заголовке autorun.cfg:
Code: | 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 wrote: | Я это помню. Но там было без подробностей. |
Подробности были немного ранее |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 334
|
(Separately) Posted: Thu Apr 24, 2025 13:54 Post subject: |
|
|
Orion9 wrote: | А в 32-битном у вас тоже не работает? |
TC x32 не трогаем. В нем работало всегда и работают сейчас любые варианты.
Orion9 wrote: | Наверное, здесь могут быть только пути или имена функций виноваты. |
Тогда-бы и в х32 не работало. У вас в настройках все подсказки включены? Я могу посмотреть вашу сборку, но может вы с тех пор меняли какие-то настройки? Может выложите последнюю версию сборки с ТС х64?
Orion9 wrote: | Подробности были немного ранее |
Теперь понятно.
Добавлено спустя 1 час 3 минуты:
Если все дело в клавишах-модификаторов, то может и ну их. Надо попробовать без них, будет-ли работать.
Добавлено спустя 9 минут:
Проверил. Без модификаторов все работает и я так и оставляю. Меня это полностью устраивает. Теперь надо русский язык прикрутить и с d разобраться. Эх, не знал я ранее об источнике проблемы. Давно-бы убрал его.
И сразу думка о будущем. Можно-ли будет полям присвоить осмысленные названия или они в каждом файле не соответствуют друг-другу? Это я для использования не в хинтах, а в кастомных полях. Главное дело сдвинулось с мертвой точки. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 780
|
(Separately) Posted: Thu Apr 24, 2025 18:52 Post subject: |
|
|
AkulaBig wrote: | вы с тех пор меняли какие-то настройки? |
Нет, каких-то крупных изменений с момента последней ссылки на предыдущей странице больше не было, если не считать перехода с Autorun 2.2.17 на 2.2.18, но весь код остался прежним. Я просто заметил, что вы используете старое имя функции "BigHint", которое я давно уже поменял на "JoinHint".
AkulaBig wrote: | Если все дело в клавишах-модификаторов, то может и ну их. |
Основная причина использования модификаторов при вызове подсказки была в том, чтобы сохранить старый хинт с полями плагина TCMediaInfo как хинт по умолчанию. У меня настроенный XML-файл конфигурации, который меня вполне устраивает, даже больше, чем вполне. Но иногда требуется получить развернутую информацию о медиа-файлах, в том числе и сводную, компактную информацию о дорожках. Отсюда файл-шаблона hint.txt в сборке, который там пока больше для примера, поскольку я так и не доделал формат вывода так, чтобы длинные строки не разрывались:
 Hidden text 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%]
;
AkulaBig wrote: | Теперь надо русский язык прикрутить и с d разобраться. |
"d" нужно отдельно парсить. Это обрубок пути, который я не стал трогать, так как длинный путь разрывается и смотрится некрасиво.
Русский добавить можно где-то так:
Code: | DllCall(sLib & '\MediaInfo_Option', 'ptr', hMI, "wstr", "Language", "wstr", "file://C:/Portable/TC 11.50/Ini/Tools/Libs/ru.csv", "wstr") |
Но нужно будет через переменную.
AkulaBig wrote: | Можно-ли будет полям присвоить осмысленные названия или они в каждом файле не соответствуют друг-другу? |
Как я понял, у каждого файла свои. В этом вся и сложность задачи. Без шаблонов и фильтров источников не обойтись.
P.S. Не знаю, почему у вам CapsLock не работает. Только что еще раз проверил - у меня всё норм. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 334
|
(Separately) Posted: Thu Apr 24, 2025 19:46 Post subject: |
|
|
Orion9 wrote: | "BigHint", которое я давно уже поменял на "JoinHint" |
Это я заметил сразу. Не в этом дело.
Orion9 wrote: | чтобы сохранить старый хинт с полями плагина TCMediaInfo как хинт по умолчанию |
Скорей всего у всех так. Но мне вариант без доп клавиш больше нравится.
Orion9 wrote: | P.S. Не знаю, почему у вам CapsLock не работает. Только что еще раз проверил - у меня всё норм. |
Я даже проверять не стал, как просек фишечку про клавиши-модификаторы.
Orion9 wrote: | Русский добавить можно где-то так |
Вот ведь обидно как. Ведь для CLI я в свое время разобрался и написал:
Code: |
"MediaInfo.exe" "--Language=file://ru.csv" "--Complete=0" "bestcity.mp3" --LogFile=Complete0.txt"
|
А тут не догадался, что надо полный путь прописать. Похоже у меня там библиотека и язык лежали рядом со скриптом. А я как только уже не попробовал. Этот-то вариант не заработал сразу.
Orion9 wrote: | "d" нужно отдельно парсить. |
Я это уже понял. Так как сейчас тестовые файлы на С кинул для удобства тестирования. Сейчас эти шероховатости устраню, надо будет решать с крякозябрами. В au3 я эту проблему решил, посмотрим, можно-ли здесь это сделать.
Orion9 wrote: | Как я понял, у каждого файла свои. В этом вся и сложность задачи. Без шаблонов и фильтров источников не обойтись. |
Ну да, у меня просто сомнение возникло. Видимо можно связать их между собой, но головняк это. Нет смысла с этим связываться.
Добавлено спустя 22 минуты:
Язык прописал:
Code: |
Local lng_MI ="file://" & COMMANDER_PATH & "\Utilities\MediaInfo\ru.csv"
DllCall(sLib & '\MediaInfo_Option', 'ptr', hMI, "wstr", "Language", "wstr", lng_MI, "wstr")
|
Добавлено спустя 1 час 32 минуты:
Вот причесанный код. Язык добавлен. Парсинг поправлен:
Code: |
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
|
|
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|