Autorun

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

yahuu
Сообщения: 40
Зарегистрирован: Чт июн 22, 2023 07:32

Сообщение yahuu »

В режиме миниатюр ItemAtCursor("text") может получить информацию, а GetCurrentItem не может. Это ошибка?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yahuu
Не совсем, это особенность работы Total Commander в режиме эскизов и различия в методах получения элемента. Обратите внимание, что ItemAtCursor в режиме эскизов может получать текст только
текущего элемента и только тогда, когда курсор находится над тем рядом эскизов, где расположен выделенный элемент. Т.е. эту функцию в режиме эскизов можно использовать только в том случае, если сначала активировать элемент под курсором.

Но для GetCurrentItem возможность получения текста а режиме эскизов выглядит разумной, т.к. укладывается в логику работы функции. Доработал GetCurrentItem.

Runtime 2025-04-19
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9
Наконец-то дошли руки до тестирования 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
[/cut]
ProcessExecGetOutput закомментил, так как совершенно не понимаю, как в данном случае организовать возврат значения в нее. Есть-ли у вас какие идеи на этот счет? А то не могу проверить, вообще правильно-ли подключил MI.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig
В дебри старого кода лезть не хочется, да и нет такой возможности. Наверное, лучше сделать отдельную кнопку и попробовать на ней для начала, как всё будет работать:

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

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
Наспех сделанный и плохо протестированный код, но, кажется, он работает. Вызов с CTRL показывает все данные MediaInfo файла под курсором.

Фича с подсказкой при наведении на файлы мне очень нравится, регулярно ей пользуюсь. Но, насколько я понимаю, вы юзаете 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")
А саму библиотеку загружать только один раз при старте ТС или при первом вызове функции BigHint.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):Фича с подсказкой при наведении на файлы мне очень нравится, регулярно ей пользуюсь.
И я просто балдею от нее.
Orion9 писал(а):насколько я понимаю, вы юзаете x64, а там с этим есть определенные проблемы.
Поэтому я и полез сразу в функцию. А вы правы. Лучше сначала на кнопке отладить работу MI. Просто мне не понятно, есть шанс, что библиотека в х64 заработает?
Orion9 писал(а):И всё же, если будете делать, то лучше, наверное, делать вызов функций по адресам, как это сделано в ahk-скрипте
Даже не знал, что так можно. Я-то за основу взял свой рабочий скрипт на au3, опять-же основанный на скрипте из инета. И на ahk встречал только точно такой-же. Естественно с учетом синтаксиса.
В общем есть что поковырять. А я сейчас именно этой темой и занят. Правда еще одна очень интересная тема есть. Но пока MI в приоритете.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Поэтому я и полез сразу в функцию.
Да у вас всё правильно вроде сделано. Разве что вопрос вызывает строчка:

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

Local InfoParameters = DllCall("mediainfo\MediaInfo_Option", _
   "ptr", 0, _
   "wstr", "Complete", _
   "wstr", "") 
Где указатель почему-то нулевой. Ещё во всех вызовах DllCall желательно указыввать тип возвращаемого значения, чтобы не бралось значение по умолчанию. Возможно из-за этого не работает.
AkulaBig писал(а):Просто мне не понятно, есть шанс, что библиотека в х64 заработает?
Код, который я запостил выше, хоть и сырой, но в ТС x64 работает, а значит и в подсказке с кастомными полями он тоже работать будет, если, конечно, вытрясти из Гислера корректную работу CTRL и других клавиш-модификаторов. Насколько реально из него такое вытрясти, ответ вы, думаю, знаете: как только он услышит слово "Autorun", все последние шансы тут же улетучатся.
AkulaBig писал(а): Я-то за основу взял свой рабочий скрипт на au3, опять-же основанный на скрипте из инета. И на ahk встречал только точно такой-же.
На сайте MediaInfo есть архив для разработчиков с примерами вызова и описанием всех функций, но я не стал его скачивать. Взял за основу ваш код, недавний код для uchardet и класс для работы с MediaInfo на ahk для сверки:
https://github.com/Qriist/class_MediaIn ... iaInfo.ahk
Получилось довольно быстро. Помню, когда только начинал делать первые вызовы DllCall, на это уходило очень много времени. Думаю, скоро и у вас не будет с этим никаких проблем.
AkulaBig писал(а):Правда еще одна очень интересная тема есть.
Это хорошо, тем более что международный слоган Autorun пока никто не менял: "Embody your fantasies and make Total Commander great again!" )
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):Где указатель почему-то нулевой.
Так в оригинале. Там-же строковый параметр. Разберемся.
Orion9 писал(а):Ещё во всех вызовах DllCall желательно указыввать тип возвращаемого значения, чтобы не бралось значение по умолчанию.
Про это я помнил. В начале даже handle прописал. Но далее не знал, какое значение надо прописывать. Ваши значения у меня тоже вызывают вопросы. Пока я в этом не очень.
Orion9 писал(а):Возможно из-за этого не работает.
Не работает у меня по простой причине. Нет вывода в консоль. И ваше ShowHint(sMI) вроде для пользовательских полей тоже не прокатит. Если я правильно понимаю, можно только ProcessExecGetOutput использовать. А вот написать с ним выражение не получилось. Или я опять чего-то не догоняю и ShowHint будет выводить значение в поле?
Orion9 писал(а):в ТС x64 работает, а значит и в подсказке с кастомными полями он тоже работать будет
Кнопки и с MI.exe прекрасно в х64 работали. Так что не факт.
Orion9 писал(а):если, конечно, вытрясти из Гислера корректную работу CTRL
Будем надеяться когда-нибудь придет на землю русскую Витязь или Батыр и так встряхнет Гислера, что он все наши хотелки сделает :lol:
Orion9 писал(а):На сайте MediaInfo есть архив для разработчиков с примерами вызова и описанием всех функций
Как вы эти ссылки находите-то? Я вроде лазил по сайту, но ничего подобного не нашел. А можете ссылку именно на этот архив дать?
Orion9 писал(а):международный слоган Autorun
Мне аж стыдно, но тема к Autorun отношения не имеет :oops:
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Так в оригинале. Там-же строковый параметр. Разберемся.
Я исходил из кода Ahk, но значение "ноль", видимо, допустимо (проверил пример на Au3).
AkulaBig писал(а):Ваши значения у меня тоже вызывают вопросы. Пока я в этом не очень.
Да я как бы тоже... не очень )

Loopback, наверное, может подказать более правильно, тем более что целый wdx-плагин был сделан на вызовах MediaInfo.
AkulaBig писал(а):Не работает у меня по простой причине. Нет вывода в консоль
А он тут и не нужен. Из консоли бралось в переменную, сейчас будет браться из DLL. Переделал код кнопки в кастомные поля:

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

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 писал(а):придет на землю русскую Витязь или Батыр и так встряхнет Гислера, что он все наши хотелки сделает
Боюсь, это не поможет. Гислеру наши хотелки не нужны, у него своё, дальнее видение. Видеоплеер и 7zip уже прикрутил, теперь, видимо, браузер на очереди. Он еще доведёт, ДОВЕДЁТ свое детище до крылатой фразы "Куда же Тотал без браузера-то, а лучше двух" )
AkulaBig писал(а):Я вроде лазил по сайту, но ничего подобного не нашел. А можете ссылку именно на этот архив дать?
Да вроде бы здесь всё:
https://mediaarea.net/en/MediaInfo/Download/Windows
https://mediaarea.net/download/binary/l ... staller.7z
Внутри каталог "Developers".
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):Работает
ТС х64 не работает. Получаются не работают сами кастомные поля в ТС х64?
Orion9 писал(а):Внутри каталог "Developers".
Я даже смотрел этот каталог, но показалось, что ссылка выше совсем не из этих документов.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):ТС х64 не работает.
В топике это обсуждалось. Ничего не поделать: в TC x64 остаётся пока только "лочить" подсказку.

Сейчас с 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 
[/cut]
Конечно, не всегда удобно держать подсказку "на замке", но другого варианта для х64 пока нет.
AkulaBig писал(а):Получаются не работают сами кастомные поля в ТС х64?
Поля работают. Не работает именно подсказка при нажатии клавиш-модификаторов. Можете проверить. Вызовите в х64 стандартную подсказку для любого файла и нажмите CTRL - подсказка просто исчезнет. И это случается только с ТС х64, в 32-битном ТС всё нормально.
AkulaBig писал(а):показалось, что ссылка выше совсем не из этих документов.
Как-то мало там информации. Я, например, не понял, что именно делает параметр типа "Ptr" в MediaInfo_Open. В доках его вообще нет, хотя я глубоко не разбирался.

Loopback
Если привязать функцию к CapsLock командой SetHotkeyAction /V:20, то как сделать, чтобы эта функции пропускала через себя нажатие этой клавиши? Сейчас она блокируется.
Набрел на SendInput, но разбираться и эксперементировать со структурой INPUT сейчас совсем времени нет.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):Конечно, не всегда удобно держать подсказку "на замке", но другого варианта для х64 пока нет.
А какие-то доп настройки надо делать? Не работает и этот код.
Orion9 писал(а):В топике это обсуждалось.
Я это помню. Но там было без подробностей.
Orion9 писал(а):Как-то мало там информации
Я и писал handle, а оказывается ptr нужен. В примере на au3 используется массив. Видимо поэтому и ptr.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение 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 писал(а):Я это помню. Но там было без подробностей.
Подробности были немного ранее
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):А в 32-битном у вас тоже не работает?
TC x32 не трогаем. В нем работало всегда и работают сейчас любые варианты.
Orion9 писал(а):Наверное, здесь могут быть только пути или имена функций виноваты.
Тогда-бы и в х32 не работало. У вас в настройках все подсказки включены? Я могу посмотреть вашу сборку, но может вы с тех пор меняли какие-то настройки? Может выложите последнюю версию сборки с ТС х64?
Orion9 писал(а):Подробности были немного ранее
Теперь понятно.

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

Если все дело в клавишах-модификаторов, то может и ну их. Надо попробовать без них, будет-ли работать.

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

Проверил. Без модификаторов все работает и я так и оставляю. Меня это полностью устраивает. Теперь надо русский язык прикрутить и с d разобраться. Эх, не знал я ранее об источнике проблемы. Давно-бы убрал его.
И сразу думка о будущем. Можно-ли будет полям присвоить осмысленные названия или они в каждом файле не соответствуют друг-другу? Это я для использования не в хинтах, а в кастомных полях. Главное дело сдвинулось с мертвой точки.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):вы с тех пор меняли какие-то настройки?
Нет, каких-то крупных изменений с момента последней ссылки на предыдущей странице больше не было, если не считать перехода с Autorun 2.2.17 на 2.2.18, но весь код остался прежним. Я просто заметил, что вы используете старое имя функции "BigHint", которое я давно уже поменял на "JoinHint".
AkulaBig писал(а):Если все дело в клавишах-модификаторов, то может и ну их.
Основная причина использования модификаторов при вызове подсказки была в том, чтобы сохранить старый хинт с полями плагина TCMediaInfo как хинт по умолчанию. У меня настроенный XML-файл конфигурации, который меня вполне устраивает, даже больше, чем вполне. Но иногда требуется получить развернутую информацию о медиа-файлах, в том числе и сводную, компактную информацию о дорожках. Отсюда файл-шаблона hint.txt в сборке, который там пока больше для примера, поскольку я так и не доделал формат вывода так, чтобы длинные строки не разрывались:
[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]
AkulaBig писал(а):Теперь надо русский язык прикрутить и с d разобраться.
"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 не работает. Только что еще раз проверил - у меня всё норм.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):"BigHint", которое я давно уже поменял на "JoinHint"
Это я заметил сразу. Не в этом дело.
Orion9 писал(а):чтобы сохранить старый хинт с полями плагина TCMediaInfo как хинт по умолчанию
Скорей всего у всех так. Но мне вариант без доп клавиш больше нравится.
Orion9 писал(а):P.S. Не знаю, почему у вам CapsLock не работает. Только что еще раз проверил - у меня всё норм.
Я даже проверять не стал, как просек фишечку про клавиши-модификаторы.
Orion9 писал(а):Русский добавить можно где-то так
Вот ведь обидно как. Ведь для CLI я в свое время разобрался и написал:

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

"MediaInfo.exe" "--Language=file://ru.csv" "--Complete=0" "bestcity.mp3" --LogFile=Complete0.txt"
А тут не догадался, что надо полный путь прописать. Похоже у меня там библиотека и язык лежали рядом со скриптом. А я как только уже не попробовал. Этот-то вариант не заработал сразу.
Orion9 писал(а):"d" нужно отдельно парсить.
Я это уже понял. Так как сейчас тестовые файлы на С кинул для удобства тестирования. Сейчас эти шероховатости устраню, надо будет решать с крякозябрами. В au3 я эту проблему решил, посмотрим, можно-ли здесь это сделать.
Orion9 писал(а):Как я понял, у каждого файла свои. В этом вся и сложность задачи. Без шаблонов и фильтров источников не обойтись.
Ну да, у меня просто сомнение возникло. Видимо можно связать их между собой, но головняк это. Нет смысла с этим связываться.

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

Язык прописал:

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

Local lng_MI ="file://" & COMMANDER_PATH & "\Utilities\MediaInfo\ru.csv"
DllCall(sLib & '\MediaInfo_Option', 'ptr', hMI, "wstr", "Language", "wstr", lng_MI, "wstr")
Добавлено спустя 1 час 32 минуты:

Вот причесанный код. Язык добавлен. Парсинг поправлен:

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

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
Ответить