Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Autorun
Goto page Previous  1, 2, 3 ... 183, 184, 185, 186  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Thu Apr 24, 2025 21:40    Post subject: Reply with quote

Orion9 wrote:
Я, например, не понял, что именно делает параметр типа "Ptr" в MediaInfo_Open.

Тут скорее должен быть "handle". Это хэндл, возвращаемый вызовом MediaInfo_New, создающим экземпляр объекта. Библиотека потокобезопасна только при создании в каждом потоке своего экземпляра и работе в этом потоке только с ним.

Документация на самом деле крайне скудная. В своё время во многом приходилось разбираться методом тыка.

Orion9 wrote:
Разве что вопрос вызывает строчка: ... Где указатель почему-то нулевой.

Насколько я помню, если не задать хэндл экземпляра, то опция будет задана глобально для всех экземпляров. В TCMediainfo я все опции задаю с указанием хэндла.

Orion9 wrote:
Если привязать функцию к CapsLock командой SetHotkeyAction /V:20, то как сделать, чтобы эта функции пропускала через себя нажатие этой клавиши?

Использовать переключатель /S и из привязанной функции возвращать -1, если клавишу нужно передать дальше.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 722

Post (Separately) Posted: Fri Apr 25, 2025 00:18    Post subject: Reply with quote

AkulaBig wrote:
Вот причесанный код.

Проверил, работает, всё супер.

А теперь если взять мой файл hint.txt:
 hint.txt

И сохранить его в папку MediaInfo, а к коду добавить:
Code:
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

 Полный код

То теперь при включеном CapsLock будет отображаться подсказка из шаблона, которая особенно хороша на видео файлах с несколькими дорожками и титрами. А при выключеном CapsLock будет по-прежнему доступна вся подсказка с русскими полями. В общем, тут есть где пофантазировать. Я же говорю: "Embody your fantasies and make Total Commander great again!" ) Loopback сделал то, что Гислеру и не снилось: положил всю Windows к ногам TC.
AkulaBig wrote:
Вот ведь обидно как.

Не парьтесь, это даже на зашквар не тянет. Я вон пропустил ключ /S и нарушил работу такой важной клавиши, как CapsLock, вот где обидно бывает. Кстати, эту строку я, кажется, у вас и брал, потому как в доках к функции Option этого нету
AkulaBig wrote:
Документация на самом деле крайне скудная. В своё время во многом приходилось разбираться методом тыка.

Спасибо за пояснения. Документация к библиотеке действительно слабая, видел на это жалобы на форуме AutoHotKey ещё давно. Так что не удивлён.
P.S. Кстати, прикольный пример со сворачиванием ТС в трей. Считаю, что так во всем Windows должно быть по умолчанию сделано )
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 269

Post (Separately) Posted: Fri Apr 25, 2025 05:41    Post subject: Reply with quote

Orion9 wrote:
То теперь при включеном CapsLock будет отображаться подсказка из шаблона

Сейчас доделаю основные хинты, посмотрю и дополнительные.
Orion9 wrote:
Не парьтесь, это даже на зашквар не тянет.

Проверил, оказалось, что все правильно писал я. Видимо с CLI-версией файл языка автоматически ищется в папке с библиотекой:
Code:

%COMMANDER_PATH%\Utilities\MediaInfo\MediaInfo.exe" "--Language=file://ru.csv" "--Complete=0

Но нашел и на au3:
Code:

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

Так что память подвела.
Теперь главным будет переписать вот этот код с au3 на Autorun:
Code:

$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 реализовать.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 722

Post (Separately) Posted: Fri Apr 25, 2025 11:11    Post subject: Reply with quote

AkulaBig
Самый простой способ был бы использовать объект "Buffer" для перекодирования кодовой страницы, например:
Code:
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
Пока эксперементировал с буфером нашёл пару непоняток. По-моему, в справке указан неправильный порядок параметров:
Code:
r = obj.SetStr(<Value>[, <Offset>[, <Encoding>[, <Size>]]])

А также вызов Encoding с "CP:nnn" не работает.

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

Loopback wrote:
Использовать переключатель /S и из привязанной функции возвращать -1, если клавишу нужно передать дальше.

Спасибо, помогло. Ляпотаааа... )
AkulaBig wrote:
Сейчас доделаю основные хинты, посмотрю и дополнительные.

Как вариант решения проблемы с кракозябрами можно использовать отдельный хинт из полей плагина AnyTag. Я сейчас проверил: он без проблем отображает теги сохраненные в ANSI. Кроме того, шаблоном подсказки можно легко управлять через файл anytag.any:

 Hidden text

Я не стал до конца переводить русские поля, это только для примера. Сам плагин можно прицепить к подсказке вместо данных MediaInfo и временно им отображать тэги при наведении на файл. Сейчас у меня это делается при помощи комбинации CTRL+SHIFT или через закрепление подсказки по SHIFT+CAPSLOCK. Если хотите, посмотрите в сборке: плагин anytag.wdx нужно выбрать в контекстном меню строки состояния.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 269

Post (Separately) Posted: Fri Apr 25, 2025 17:18    Post subject: Reply with quote

Orion9 wrote:
Как вариант решения проблемы с кракозябрами можно использовать отдельный хинт из полей плагина AnyTag

Мы как-то эту тему обсуждали. Там крякозябры совсем другие, если мне память не изменяет. AnyTag не поможет. Да и лучше с крякозябрами, чем без MI. Придумаем что-нибудь. Вот в TCMediaInfo этот вопрос решается функций fix_cp. Сейчас узнаю про нее.
Loopback
Хотелось-бы уточнить. Нельзя-ли вашу функцию fix_cp из плагина TCMediaInfo применить в моем скрипте MediaInfo для преобразования крякозябр? Если посмотрите выше, увидите, что на au3 этот вопрос решается. Но не понятно, можно-ли такое написать в Autorun. Да и вообще было-бы удобно использовать уже существующую функцию из вашего-же плагина.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 722

Post (Separately) Posted: Fri Apr 25, 2025 20:12    Post subject: Reply with quote

AkulaBig wrote:
AnyTag не поможет

С каких пор джентельменам не верят на слово? Smile
Orion9 wrote:
Я сейчас проверил: он без проблем отображает теги сохраненные в ANSI

Вот так выглядит wdxtaglib.wdx спаренный с MediaInfo:

А так wdxtaglib.wdx спаренный с anytag.wdx:


P.S. Если серьёзно хотите браться за это дело, для начала экземпляры выложили куда-нибудь, а то я еле нашел у себя файлы с кракозябрами.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 269

Post (Separately) Posted: Fri Apr 25, 2025 21:32    Post subject: Reply with quote

Orion9 wrote:
С каких пор джентельменам не верят на слово?

 Hidden text

Orion9 wrote:
anytag.wdx

Зачем лезть в дебри? Есть-же TCMediaInfo. Но нам это пока ничего не дает.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Fri Apr 25, 2025 22:28    Post subject: Reply with quote

Orion9 wrote:
По-моему, в справке указан неправильный порядок параметров:

Да, там ошибка, Encoding должен быть последним. CP:nnn посмотрю.

AkulaBig wrote:
Нельзя-ли вашу функцию fix_cp из плагина TCMediaInfo применить в моем скрипте MediaInfo для преобразования крякозябр?

Можно повторить, конечно. Идея основана на том, что при преобразовании юникодной строки в ISO-8859-1 (единственной допустимой ANSI-кодировки для тега) функцией WideCharToMultiByte, если в ней есть любые символы юникода c кодом > 255, то функция будет заменять их в выводе на символ замены (по умолчанию ?). В этом случае предполагаем, что у нас нормальный юникод и оставляем строку без изменений. Если замен не было, это может быть некорректный юникод (точнее, формально он корректный, но неправильный с точки зрения кодировки), в этом случае конвертируем в ANSI c кодировкой ISO-8859-1, а затем обратно в юникод с системной кодировкой CP_ACP.

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

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

Code:

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
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 269

Post (Separately) Posted: Fri Apr 25, 2025 23:27    Post subject: Reply with quote

Loopback wrote:
на выводе Inform, думаю, не сработает

Ну да, не работает. Будем дальше думать.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 722

Post (Separately) Posted: Sat Apr 26, 2025 00:21    Post subject: Reply with quote

 AkulaBig

AkulaBig wrote:
Зачем лезть в дебри?

А это и не дебри, это альтернативный хинт. Если попадутся, например, кракозябры, то можно повторно навести на файл с удержанием CTRL+SHIFT и тем самым хотя бы увидеть основные тэги такие, как "Имя","Альбом","Исполнитель", в нормальном виде. Конечно, кастомные тэги и поля, который допускает формат ID3v2, увидить так не получится, но хотя бы что-то. Этого уже будет достаточно, чтобы понять, что из себя представляет проблемный файл, и перекодировать его потом на диске.

Loopback wrote:
А вот на выводе Inform, думаю, не сработает, т.к. там будет смешан как валидный юникод, так и невалидный.

Говорил, говорю и буду говорить: такие файлы нужно перекодировать на диске. Всего-то нужно запустить программу AnyTag и пересохранить тэг в UTF-16. Если случай уж совсем не безнадежный, этого должно хватить.
AkulaBig wrote:
Ну да, не работает. Будем дальше думать.

Можно попробовать предложенный Loopback код на второй части строки, она ведь разбивается по символу ":"
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 269

Post (Separately) Posted: Sat Apr 26, 2025 07:25    Post subject: Reply with quote

Orion9 wrote:
А это и не дебри, это альтернативный хинт.

Я имею ввиду когда есть TCMediaInfo, который стоит у всех и правильно показывает крякозябры, использовать anytag. Можно-же на нем тестировать. Только какой в этом смысл, если его не скрестить с MI?
Orion9 wrote:
Говорил, говорю и буду говорить: такие файлы нужно перекодировать на диске.

Никто с вами и не спорит, но сейчас-то цель прочитать крякозябры и код на au3 это прекрасно делает.
Orion9 wrote:
Можно попробовать предложенный Loopback код на второй части строки, она ведь разбивается по символу ":"

Конечно первым делом так и попробовал. А потом, на всякий случай, попробовал и всю строку.
Там в первой строке на выходе 0 или 1. И получается, что на этих полях всегда ноль и они пустые.

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

Интересно получается. Вот картинка с крякозябрами:

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

У него тоже поля в нуле. Так что явно проблема в этом. Код:
Code:

Return StrTrim(a) & ": " & StrTrim(FixCodepage(b))


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

Попробовал вручную разные значения nSize. Комментил строку If bUsedRepl Then Return src Ничего не помогло.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 722

Post (Separately) Posted: Sat Apr 26, 2025 12:18    Post subject: Reply with quote

AkulaBig
Дело близко к завершению. При включеном CapsLock вторая часть строки фиксится:
Code:
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
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 269

Post (Separately) Posted: Sat Apr 26, 2025 13:41    Post subject: Reply with quote

Orion9 wrote:
Дело близко к завершению.

Круто, работает! Осталось сделать проверку на наличие крякозябр. А то при включенном капсе все остальные русские значения отображаются знаками вопроса.

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

Подмел Cool
Code:

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 запрещал использовать его в чужих сборках. Но потом автор сменился. Никто не знает, можно-ли сейчас пользоваться этим плагином в сборках? У меня сборка, совершенно случайно получилась без вареза, поэтому интересен этот вопрос.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 269

Post (Separately) Posted: Sat Apr 26, 2025 17:30    Post subject: Reply with quote

Orion9 wrote:
теперь при включеном CapsLock будет отображаться подсказка из шаблона

Потестил. Оставил пока в коде, до появления файлов с несколькими дорожками. Вроде общая подсказка теперь должна показывать все эти данные.
У меня скриптик с чтением полей из массива есть. Он другой, но тот-же по принципу.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 722

Post (Separately) Posted: Sun Apr 27, 2025 00:29    Post subject: Reply with quote

AkulaBig wrote:
Конфетка!

И правда смотрится стройно и красиво! Но я бы всё-таки оставил ручное переключение или по крайней мере сохранил такую возможность, поскольку не понятно, есть в оригинале кракозябры или нет. Если бы в объекте Buffer не было проблем с параметром Encoding "CP:nnn", то, вероятно, код можно было свести до варианта без DllCall:
Code:
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 wrote:
Раньше автор SuperWDX запрещал использовать его в чужих сборках

На такое стихи писать можно, не иначе.
Стихотворение называется:
 Я плакалЪ

Если серьёзно, то плагин устарел. Autorun предлагает сейчас больше возможностей. Если хотите, посмотрите функцию GetSuperWdx в модуле Plugin.aucfg - было дело, эксперементировал.
AkulaBig wrote:
Оставил пока в коде, до появления файлов с несколькими дорожками.

У вас нет ни одного фильма с несколькими дорожками? Shocked
Ну, тогда могу продемонстрировать на своём:

Пойду, пожалуй, пересмотрю в 100-й раз. Только вот не знаю с какой дорожкой на этот раз )
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... 183, 184, 185, 186  Next
Page 184 of 186

 
Jump to:  
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