View previous topic :: View next topic |
Author |
Message |
A55555
Joined: 06 Feb 2011 Posts: 65
|
(Separately) Posted: Fri Sep 26, 2025 15:08 Post subject: |
|
|
Orion9 wrote: | MediaInfo
Я выше писал, что возможно придется обратиться к документации MediaInfo, поскольку это отдельный вопрос, требующий отдельного изучения. С синтаксисом шаблонов я плохо знаком, т.к. глубоко в него не вникал, поэтому подсказка hint.txt так и осталась недоделанной. Перевод строки делается через "\r\n", а скобка экранируется символом обратной косой черты "\", т.е. Как я понял, все, что находится в квадратных скобках, не будет отображаться в случае отсутствия значий у полей, которые находятся внутри этих скобок. |
Orion9
спасибо
работает.
Копаюсь в документации MediaInfo уже не первый день, много уже переделал под себя, "\r\n" перенос строки я использую, но не получается добиться, чтоб чистой строкой отделить блоки, например, если взять ваш пример выше, чтоб стало вот так
Orion9 wrote: |
 hint.txt
Name: Titanic (1997) BDRip-HEVC 1080p.mkv
Size: 23.22 GiB
Duration: 11694688
Duration: 3 h 14 min 54 s 688 ms
Duration: 03:14:54.688 (03:14:42:21)
General: 17.1 Mb/s, Matroska, Cover, 23.976 FPS
Video #0: 1920x1080pix, AR:1.778=~16:9, 23.976 (24000/1001) FPS, 9 566 kb/s, 0.192bpf, HEVC, en
Audio #0: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #1: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #2: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #3: 6ch, 48.0 kHz, 384 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #4: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #5: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #6: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #7: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #8: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #9: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #10: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #11: 2ch, 48.0 kHz, 192 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #12: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, uk, 31.250 FPS (1536 SPF)
Audio #13: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, en, 31.250 FPS (1536 SPF)
Text #0: UTF-8@ru, 243.0 Bytes, 0 b/s, 0.001 FPS
Text #1: UTF-8@ru, 80.27 KiB, 56 b/s, 0.162 FPS
Text #2: UTF-8@ru, 110.8 KiB, 83 b/s, 0.187 FPS
Text #3: UTF-8@uk, 256.0 Bytes, 0 b/s, 0.001 FPS
Text #4: UTF-8@uk, 95.09 KiB, 67 b/s, 0.160 FPS
Text #5: UTF-8@en, 61.37 KiB, 46 b/s, 0.194 FPS
Menu #0: |
условные блоки отделились визуально при показе подсказки.
Для перехода на следующую строку, плюс чтоб ещё одной чистой строкой отделить дважды нужно написать.
Но это всё равно не то, т.к. получается примерно вот так
Orion9 wrote: |
 hint.txt
Name: Titanic (1997) BDRip-HEVC 1080p.mkv
Size: 23.22 GiB
Duration: 11694688
Duration: 3 h 14 min 54 s 688 ms
Duration: 03:14:54.688 (03:14:42:21)
General: 17.1 Mb/s, Matroska, Cover, 23.976 FPS
Video #0: 1920x1080pix, AR:1.778=~16:9, 23.976 (24000/1001) FPS, 9 566 kb/s, 0.192bpf, HEVC, en
Audio #0: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #1: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #2: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #3: 6ch, 48.0 kHz, 384 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #4: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #5: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #6: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #7: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #8: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #9: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #10: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #11: 2ch, 48.0 kHz, 192 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #12: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, uk, 31.250 FPS (1536 SPF)
Audio #13: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, en, 31.250 FPS (1536 SPF)
Text #0: UTF-8@ru, 243.0 Bytes, 0 b/s, 0.001 FPS
Text #1: UTF-8@ru, 80.27 KiB, 56 b/s, 0.162 FPS
Text #2: UTF-8@ru, 110.8 KiB, 83 b/s, 0.187 FPS
Text #3: UTF-8@uk, 256.0 Bytes, 0 b/s, 0.001 FPS
Text #4: UTF-8@uk, 95.09 KiB, 67 b/s, 0.160 FPS
Text #5: UTF-8@en, 61.37 KiB, 46 b/s, 0.194 FPS
Menu #0: |
Вместо чистой строки только между блоками.
И ещё есть такой момент, что если название медиафайла начинается с русской буквы, то в подсказку попадает имя файла дважды, в самом начале подсказки и на следующей строке после Name: дублируется
Code: | "Имя_файла.расширение"
Name: "Имя_файла.расширение"
.... |
если с английской буквы, то всё нормально, только
Code: | Name: "Имя_файла.расширение"
.... |
Есть в файле hint.txt ещё кусок для показа глав
Code: | 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 |
но главы в подсказке не показываются для файла в котором они точно есть и они даже подписаны.
 Hidden text |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 903
|
(Separately) Posted: Sat Sep 27, 2025 00:38 Post subject: |
|
|
A55555 wrote: | Но это всё равно не то, т.к. получается примерно вот так |
Да, припоминаю такое. Именно поэтому и отложил шаблон в сторону, когда понял, что нужно разбираться с тонкостями, а заниматься этим не хотелось.
И не только с русскими именами была проблема. Был еще и такой баг:
Code: | Bug: "Page_Begin""Page_Middle" and "Page_End" sections are picked on lines 1011 and 12 regardless what is there. So it is better to leave them there.
;Bug: \r\n is not turned into a newline on "Page" entries.
;Bug: "Image" sections are not activebut should. |
Возможно, автор его исправил, но будьте готовы к неприятным сюрпризам. Кроме того, Mediainfo плохо документирована, многие на это жалуются. Поэтому долго придется вникать и подсматривать, как другие делают:
https://github.com/optio50/Mediainfo-Template
Конкретно по вашим вопросам. Судя по всему в шаблоне есть дополнительные секции Video_Begin, Video_Middle, Video_End и т.д. Похоже, они управляют дополнительными параметрами вывода. Посмотрите в обновленном шаблоне:
 Hidden text General;"Name: %FileName%.%FileExtension%\nSize: %FileSize/String4%\n[Duration: %Duration%]\n[Duration: %Duration/String1%]\n[Duration: %Duration/String5%]\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%]"\n
Video;Video #%StreamKindID%: [%Width%x%Height%][, %Format%][(%Format/Family%)][, \[%Language%\]][, %AspectRatio/String% (%AspectRatio%)][, %Resolution/String%][, %FrameRate/String%][, %BitRate/String%][(%BitRate_Mode%)][, %Bits-(Pixel*Frame)%bpf]\n
Video_Begin;
Video_Middle;
Video_End;\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]\n
Audio_Begin;
Audio_Middle;
Audio_End;\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]\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]\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%]\n
Menu;Menu #%StreamKindID%: [%MenuID/String%][, %Duration% Format:%Format/String%]
С главами проблема, но пока не обращайте внимание. Я просто копировал строки из какого-то шаблона в csv файл, посмотреть, что получится. Это было уже давно, даже не помню, что и откуда копировал, возможно, из html-шаблона, но скорее всего поля просто не сходятся, поэтому и получаются пустые главы.
Я тут кое-что поменял в подсказке. Завтра выложу новую версию, более универсальную, сейчас просто не успеваю описание к ней сделать. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 903
|
(Separately) Posted: Sat Sep 27, 2025 20:12 Post subject: |
|
|
Loopback
Я недавно запрашивал фичу, чтобы у подсказки можно было менять текст без вызова другой подсказки, но если полезете в код, то хотелось бы задавать максимальную ширину подсказки. Сейчас это динамическая величина, зависящая от длины строки. Но если строка слишком длинная, то и подсказка может получиться на весь экран, хочется как-то ограничивать этот размер.
Сейчас столкнулся с такой проблемой. Назначил вызов функции на Ctrl+1..Ctrl+5, но в окне листера клавиши не перехватываются. То есть если у меня открыто окно плагина TCMediaInfo, то смена режимов не срабатывает, хотя я поставил Return -1 в ShowPipeEx.
 Hidden text SetHotkeyAction /K:C /H:1 /DM /S ShowPipeEx 0 1
SetHotkeyAction /K:C /H:2 /DM /S ShowPipeEx 0 2
SetHotkeyAction /K:C /H:3 /DM /S ShowPipeEx 0 3
SetHotkeyAction /K:C /H:4 /DM /S ShowPipeEx 0 4
SetHotkeyAction /K:C /H:5 /DM /S ChangeLeftsideHint
Конечно, можно сменить на Alt или на Ctrl+Alt, но мне хотелось бы именно Ctrl использовать. Пока сменил на Alt, чтобы не было проблем, полный код чуть ниже.
A55555
Я вчера не сразу понял, какая у вас проблема с именами. Да, шаблоны не работают, если в них использовать кириллицу (в лучшем случае теряется секция, а в худшем шаблон не загружается). Но у вас другая проблема. Сверху попадает подсказка от проводника или самого ТС (поэтому поле дублируется), так работает подсказка на Autorun - оригинальная подсказка сливается с дополнительной подсказкой, с этим ничего не поделаешь. Дополнительная подсказка только добавляет новые поля, но не заменяет существующие.
С главами действительно есть баг, который за пять лет так и не был исправлен.
Я взял стандартный шаблон, который идет с GUI-версией библиотеки:
 Example.csv General;General : %CompleteName%\r\nFormat : %Format%$if(%OverallBitRate%, at %OverallBitRate/String%)\r\nLength : %FileSize/String%[ for %Duration/String1%]\r\n\r\n
Video;Video #%StreamKindID% : %Format%$if(%BitRate%, at %BitRate/String%)\r\nAspect : %Width% x %Height% (%AspectRatio%)$if(%FrameRate%, at %FrameRate% fps)\r\n\r\n
Audio;Audio #%StreamKindID% : %Format%$if(%BitRate%, at %BitRate/String%)\r\nInfos : %Channel(s)/String%, %SamplingRate/String%\r\n$if(%Language%,Language : %Language%\r\n)\r\n
Text;Text #%StreamKindID% : %Format%\r\n$if(%Language%,Language : %Language%\r\n)\r\n
Chapters;Chapters #%StreamKindID% : %Total% chapters\r\n\r\n
File_Begin
File_End
Page_Begin
Page_Middle
Page_End
General_Begin
General_End
Video_Begin
Video_Middle
Video_End
Audio_Begin
Audio_Middle
Audio_End
Text_Begin
Text_Middle
Text_End
Chapters_Begin
Chapters_Middle
Chapters_End
Но даже в нем Chapters не работает. Такой вот неприятный сюрприз.
Все-равно оставил эту строку в hint.txt. Последняя версия шаблона:
 hint.txt General;"Name: %FileName%.%FileExtension%\nSize: %FileSize/String4%\n[Duration: %Duration%]\n[Duration: %Duration/String1%]\n[Duration: %Duration/String5%]\n
[General: %BitRate/String%][(%BitRate_Mode%)][, %Format%]$if(%Cover%,\, Cover)$if(%IsStreamable%,\, Streamable)[, %FrameRate/String%]"\n
Video;Video #%StreamKindID%: [%Width%x%Height%][, %Format%][(%Format/Family%)][, %Language%][, %AspectRatio/String% (%AspectRatio%)][, %Resolution/String%][, %FrameRate/String%][, %BitRate/String%][(%BitRate_Mode%)]\n
Video_Begin;
Video_Middle;
Video_End;\n
Audio;Audio #%StreamKindID%: [%Channel(s)%ch][, %SamplingRate/String%][, %BitRate/String%][ (%BitRate_Mode%)][, %Format%][, %Format_Profile%][, %Language%][, %FrameRate/String%]\n
Audio_Begin;
Audio_Middle;
Audio_End;\n
Text;Text #%StreamKindID%: %Format%[, %Language/String3%][, %StreamSize/String3%][, %BitRate/String%][, %FrameRate/String%][, %SamplingRate/String%]\n
Text_End;\n
Chapters;Chapters #%StreamKindID%: %Total% chapters\n
Image;Image #%StreamKindID%: [%Width%x%Height%pix][, %Format%][, %StreamSize/String5%][, %ColorSpace% (%ChromaSubsampling%)][, %BitDepth/String%][, %ColorSpace_ICC%]\n
Menu;Menu #%StreamKindID%: [%MenuID/String%][, Format:%Format/String%][ Chapters: \[%Chapters_Pos_Begin%-%Chapters_Pos_End%\]]
Еще два шаблона, которые понадобятся для новой подсказки:
 size.txt General;Name: %FileName%.%FileExtension%\r\nSize: %FileSize/String4%\r\nGeneral: [%StreamSize/String%]\r\n
Video;Video #%StreamKindID%: [%StreamSize/String%]\r\n
Audio;Audio #%StreamKindID%: %StreamSize/String%\r\n
 duration.txt General;Name: %FileName%.%FileExtension%\r\nSize: %FileSize/String4%\r\nGeneral:\r\n [Duration: %Duration%]\r\n [Duration: %Duration/String1%]\r\n [Duration: %Duration/String5%]\r\n
Video;Video #%StreamKindID%: \r\n [Duration: %Duration%]\r\n [Duration: %Duration/String1%]\r\n [Duration: %Duration/String5%]\r\n
Audio;Audio #%StreamKindID%: \r\n [Duration: %Duration%]\r\n [Duration: %Duration/String1%]\r\n [Duration: %Duration/String5%]\r\n
Скинул еще раз, чтобы не приходилось отматывать назад.
Обновленный код подсказки.
 Hidden text Code: | SetHotkeyAction /K:A /H:1 /DM /S ShowPipeEx 0 1
SetHotkeyAction /K:A /H:2 /DM /S ShowPipeEx 0 2
SetHotkeyAction /K:A /H:3 /DM /S ShowPipeEx 0 3
SetHotkeyAction /K:A /H:4 /DM /S ShowPipeEx 0 4
SetHotkeyAction /K:A /H:5 /DM /S ChangeLeftsideHint
Global gHintPipe = "", _
gHintClipb = true, _
gHintLines = 60, _
gHintWait = 50, _
gHintShift = "duration.txt", _
gHintCaps = true
Global gHintLayout = List(10, 75, 15), _
gHintContent = List("size.txt", "Inform", "hint.txt"), _
gHintSleep = List(0, 250, 0)
If SYSINFO_DESKTOPHEIGHT < 1080 Then gHintLines = 50
If SYSINFO_DESKTOPHEIGHT < 720 Then gHintLines = 40
Func MagicHint(FileName, FieldIndex, UnitIndex)
If FieldIndex > gHintLines Then Return
If StrPos(FileGetAttr(FileName), "D") Then Return ""
Local bCaps = DllCall("GetKeyState", "int", 0x14, "short")
Local b_CTRL = BitAND(bCaps, 1), b_Shift = IsPressed(0x10)
If Not b_CTRL then b_CTRL = IsPressed (0x11)
If gHintCaps And Not b_CTRL Then Return
Static sLib
If auX64 Then
sLib = "MediaInfo.dll" # 64-bit
Else
sLib = "MediaInfo_i386.dll" # 32-bit
EndIf
Static sPath = COMMANDER_PATH & "\Ini\Tools\Libs\", _
sLang ="file://" & sPath & "ru.csv", _
sHint ="file://" & sPath & "hint.txt", _
sSize ="file://" & sPath & "size.txt", _
hLib = DllCall("LoadLibrary", "Wstr", sPath & sLib, "Ptr")
Static Idx = 0, bLang = true, nWait = 0, _
pNew, pOpen, pDel, pOpt, pInfo
If hLib = 0 And FieldIndex > 1 Then Return
If FieldIndex = 1 Then
If hLib = 0 Then Return "Error LoadLibrary " & sLib
Idx = 0
pNew = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_New", "Ptr")
pOpen = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Open", "Ptr")
pDel = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Delete", "Ptr")
pOpt = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Option", "Ptr")
pInfo = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Inform", "Ptr")
nWait = 0
bLang = true
sMode = "Inform"
If gHintWait > 0 Then Sleep(gHintWait)
Local x, y, w, nCase = 0
Local hWnd = RequestInfo(ItemAtCursor("panel"))
WinGetPos("", "", "w", "", hWnd)
If w > 0 Then
MouseGetPos("x","y")
Static buf = Buffer(8) # POINT
buf.Zero()
buf.SetNum(0, "long", x, "long", y)
DllCall("ScreenToClient", "hwnd", hWnd, "ptr", buf.ptr)
x = buf.GetNum(0)
Switch Round(x/w*100,0)
Case 0 To gHintLayout[0]-1
nCase = 0
Case gHintLayout[0] To gHintLayout[0]+gHintLayout[1]-1
nCase = 1
Case 100-gHintLayout[2] To 100
nCase = 2
EndSwitch
nWait = gHintSleep[nCase]
sMode = gHintContent[nCase]
EndIf
If nWait > 0 Then Sleep(nWait)
If sMode = "" Then
gHintPipe = ""
Return
ElseIf sMode <> "Inform" Then
bLang = false
sMode ="file://" & sPath & sMode
EndIf
Local hMI = DllCall(pNew, "Ptr")
If hMI = 0 Then Return "MediaInfo.dll couldn't create new object"
If DllCall(pOpen, 'Ptr', hMI, "Wstr", FileName, "Uint") <> 1 Then
DllCall(pDel, "Ptr", hMI)
Return "MediaInfo.dll couldn't open file " & FileName
EndIf
If b_Shift Then
DllCall(pOpt, 'Ptr', hMI, "Wstr", "Complete", "Wstr", "1", "Wstr")
Else
DllCall(pOpt, 'Ptr', hMI, "Wstr", "Complete", "Wstr", "0", "Wstr")
EndIf
DllCall(pOpt, "Ptr", hMI, "Wstr", "Output", "Wstr", sMode, "Wstr")
DllCall(pOpt, 'Ptr', hMI, "Wstr", "Language", "Wstr", (Not bLang ? "" : sLang), "Wstr")
gHintPipe = DllCall(pInfo, 'Ptr', hMI, "Uint", 0, "Wstr")
If Not bLang Then gHintPipe = StrReplace(gHintPipe, Chr(32), Chr(160))
DllCall(pOpt, 'Ptr', hMI, "Wstr", "Language", "Wstr", "", "Wstr")
DllCall(pDel, "Ptr", hMI)
If IsPressed(0x5B) Then Idx = gHintLines
Endif
If Not bLang Then Return StrPart(gHintPipe, auCRLF, FieldIndex)
Return FixSpaces(StrPart(gHintPipe, auCRLF, FieldIndex + Idx))
EndFunc
Func FixSpaces(String)
Local a, b
If Not StrPos(String, ":") Then Return String
a = StrPart(String, ":", 1)
b = StrPart(String, ":", 2) & StrPart(String, ":", 3)
Return StrTrim(a) & ": " & FixCodePage(StrTrim(b))
EndFunc
Func FixCodePage(String)
Local bUsedRepl
# 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
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
Func ShowPipeEx(lParam, nPage)
Local sPipe, nLines = gHintLines
Local aPipe = List(), j, nSect = 0
Local nEnd = nPage*nLines, nStart = nEnd - nLines
If gHintClipb Then ClipPut(gHintPipe)
aPipe.Text = gHintPipe
For j = 0 To aPipe.Count - 1
If aPipe[j] = "" Then nSect += 1
If (j + 1) >= nStart And (j + 1) <= nEnd Then
sPipe &= StrLeft(FixSpaces(aPipe[j]),84) & auCRLF
EndIf
Next
Free(aPipe)
If sPipe = "" Then sPipe = "Out of range"
ShowHint(StrTrim(sPipe))
Return -1
EndFunc
Func ChangeLeftsideHint()
Static init = gHintContent[0]
If gHintContent[0] = init Then
gHintContent[0] = gHintShift
Else
gHintContent[0] = init
EndIf
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Left side is " & gHintContent[0], "", "", 1000, 1)
Sleep(50)
SetHintParam("ShowHint", "Reload")
EndFunc
|
Добавлена фича постраничного вывода подсказки, а также гибкость в управлении схемой расположения секций. Пока еще не полная гибкость, но уже лучше.
Переменные.
gHintClipb - копировать в буфер всю подсказку при отображении в страничном режиме
gHintLines - число строк подсказки, больше 60 быть не может
gHintWait - задержка для всех секций перед отображением
gHintShift - шаблон для смены "на лету", только для левой секции
gHintCaps - если false, подсказка будет отображаться без CapsLock или Ctrl
gHintLayout - размер каждой секции в процентах
gHintContent - шаблон для каждой секции; если пустой "", в секцию ничего не попадает, кроме самой подсказки ТС или проводника; если "Inform" - стандартный отчет MediaInfo; если имя файла, то шаблон из файла (файлы должны находиться в каталоге MediaInfo.dll, существование файла не проверяется, в случае отсутствия сообщений об ошибке не будет, отобразится сырой результат отчета MediaInfo).
gHintSleep - задержка для каждой секции.
Пара примеров.
Code: | gHintCaps = false
gHintLayout = List(15, 70, 15)
gHintContent = List("Inform", "", "duration.txt")
gHintSleep = List(500, 0, 0) |
Подсказка будет вызываться всегда (CapsLock отключен). Левая секция - 15%, Центр - 70%, Правая секция - 15%. В левой секции стандартный отчет MediaInfo с задержкой 500 млс, в центре ничего не выводится, в правой секции шаблон duration.txt.
Code: | gHintCaps = true
gHintLayout = List(10, 80, 10)
gHintContent = List("size.txt", "hint.txt", "Inform")
gHintSleep = List(0, 0, 0) |
Подсказка вызывается дополнительно (CapsLock включен). Левая секция - 10%, Центр - 80%, Правая секция - 10%. В левой секции шаблон size.txt, в центре шаблон hint.txt, в правой секции стандартный отчет MediaInfo. Отдельных задержек перед вызовом нет.
Дополнительно шаблон в левой секции может меняться "на лету" с тем, что указан в gHintShift. Комбинация для смены Alt+5.
Кроме Alt+5 действуют еще 4 комбинации: Alt+1..Alt+4. Каждая из этих комбинаций выводит одну страницу последней подсказки и опционально копирует ее в буфер. Такое применение удобно на очень больших подсказках, которые обрезаются на 60-и строках, оставляя одну страницу просмотра. Нажав Alt+2 можно переместиться на вторую страницу и так далее. Всего четыре страницы.
Получилась более универсальная подсказка, чем прежняя, но делал все буквально на лету, т.ч. могут быть какие-то ошибки или недочеты. Только дальнейшее использование покажет. |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 65
|
(Separately) Posted: Sat Sep 27, 2025 23:50 Post subject: |
|
|
Orion9
большое спасибо, всё работает согласно вашего пояснения. В т.ч. листание огромной подсказки "Inform".
Спасибо за синтаксис по добавлению чистых строк в hint.txt, теперь подсказка отображается как хотелось.
Вместо режима MediaInfo "Inform" можно подставить "Video (compact)", или не всё так просто?
Я в принципе hint.txt под себя подогнал, но всё равно любопытно.
Можно ли добавить в код секцию, в которой пользователь сможет легко указывать замену того, что выводится в подсказку.
Я имею ввиду следующее, например добавив параметр в раздел Аудио (hint.txt)
Code: | [%Format_Commercial_IfAny%] |
для аудио форматов типа AC-3 начинает выводится дополнительно коммерческое название (Dolby Digital), для DTS, если это HD версия выводится надпись "DTS HD Master Audio". Это хорошо, но для подсказки длинновато и визуально шумновато.
Мне хватило бы "DTS-HD MA", "DD" для dolby.
Просто на данный момент весь DTS именно вот так показывается и только через коммерческое имя можно понять, что там не простой DTS.
Code: | "DTS HD Master Audio" = "DTS-HD MA"
"Dolby Digital" = "DD" |
Если это космически времязатратно, то совершенно это не обязательно, это уже так, спокойно и обойтись можна.
Поиск файлов принадлежащих .torrent файлу через Everything.exe
Вы добавляли этот один шаг вверх по дереву каталогов SendCommand(2002).
Code: | Func GoToPathFromMsg(Target)
If FileExist(Target) Then
If RequestInfo(1000) = 2 Then
CommandExec /CD %'Target'
Else
CommandExec /CD '' %'Target'
Endif
SendCommand(4006)
If StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
Else
ShowHint("Путь не существует " & Target)
EndIf
EndFunc |
Потом вы мне подсказали как выходить из Everything.exe только в случае, если поиск идет именно методом через Everything
Code: | If bEverything Then CommandExec em_everything_exit |
Есть ли в коде место, где можно именно для поиска bEverything указать дополнительный шаг SendCommand(2002)
Вы говорили, что могут быть проблемы, если несколько папок будет с одной папкой на пути к файлам, но всё-таки можно такой костыль для bEverything, где-то дополнительно указать, на подобии
Code: | If bEverything & StrPos(FileGetAttr(Target), "D") Then SendCommand(2002) |
чтоб именно при bEverything дважды по дереву папок поднимало вверх (общий подъем для любого вида поиска плюс один дополнительный)?
Не включая его в код для всех, я себе, если это возможно, подставлю.
У меня львиная доля это BDRemux (как раз одна эта папка BDMV) и получается быстрым поиском Everything я постоянно попадаю внутрь папки. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 903
|
(Separately) Posted: Sun Sep 28, 2025 00:42 Post subject: |
|
|
A55555 wrote: | Вместо режима MediaInfo "Inform" можно подставить "Video (compact)", или не всё так просто? |
Так сделать не получится. Режимы TCMediaInfo используются только в плагине TCMediaInfo. Loopback разработал специальные алгоритмы для создания таких режимов с возможностью сохранения в файле конфигурации TCMediaInfo.xml. Можно сказать, это авторские режимы, кроме одного режима "Inform", который является стандартным выводом библиотеки MediaInfo.
В подсказке тоже используется стандартный вывод MediaInfo "Inform", что и навело вас на мысль о возможной связи. Но в подсказке в качестве дополнительных вариантов используются шаблоны MediaInfo - текстовые файлы с определенной разметкой и синтаксисом. Исправляя эти файлы, можно подгонять под себя выводимые данные. Сейчас уже есть три шаблона, но можно сделать другие или передлать эти.
A55555 wrote: | "DTS HD Master Audio" = "DTS-HD MA"
"Dolby Digital" = "DD" |
Я понял. Надо подумать.
A55555 wrote: | If bEverything & StrPos(FileGetAttr(Target), "D") Then SendCommand(2002) |
Все правильно, только логическое "и" в Autorun так и будет "and", т.е. ваш код:
Code: | If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002) |
Вполне может сработать, все зависит от того, что именно вернет Everything.
A55555 wrote: | У меня львиная доля это BDRemux (как раз одна эта папка BDMV) и получается быстрым поиском Everything я постоянно попадаю внутрь папки. |
А при простом поиске все нормально? |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 65
|
(Separately) Posted: Sun Sep 28, 2025 09:05 Post subject: |
|
|
Orion9 wrote: | A55555 wrote: | If bEverything & StrPos(FileGetAttr(Target), "D") Then SendCommand(2002) |
Все правильно, только логическое "и" в Autorun так и будет "and", т.е. ваш код:
Code: | If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002) |
Вполне может сработать, все зависит от того, что именно вернет Everything. |
Спасибо, сегодня попробую найти место куда подставить.
Orion9 wrote: |
A55555 wrote: | У меня львиная доля это BDRemux (как раз одна эта папка BDMV) и получается быстрым поиском Everything я постоянно попадаю внутрь папки. |
А при простом поиске все нормально? |
Да, при простом идеально. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 903
|
(Separately) Posted: Sun Sep 28, 2025 13:50 Post subject: |
|
|
A55555
Я поторопился, когда сказал, что с результатами от Everything ничего не поделаешь. Функция поиска Autorun может получать отсортированный результат:
 FileFindEv Everything будет сортировать результирующий список:
0 — без сортировки (по умолчанию);
1 — по имени, по возрастанию;
2 — по имени, по убыванию;
3 — по директории, по возрастанию;
4 — по директории, по убыванию;
5 — по размеру, по возрастанию;
6 — по размеру, по убыванию;
7 — по расширению, по возрастанию;
8 — по расширению, по убыванию;
9 — по имени типа, по возрастанию;
10 — по имени типа, по убыванию;
11 — по дате создания, по возрастанию;
12 — по дате создания, по убыванию;
13 — по дате изменения, по возрастанию;
14 — по дате изменения, по убыванию;
15 — по атрибутам, по возрастанию;
16 — по атрибутам, по убыванию;
17 — по имени в списке, по возрастанию;
18 — по имени в списке, по убыванию;
19 — по числу запусков, по возрастанию;
20 — по числу запусков, по убыванию;
21 — по признаку «недавно изменённый», по возрастанию;
22 — по признаку «недавно изменённый», по убыванию;
23 — по дате доступа, по возрастанию;
24 — по дате доступа, по убыванию;
25 — по дате запуска, по возрастанию;
26 — по дате запуска, по убыванию.
Если опция не задана, её значение — 0 (без сортировки).
Да, крутую вещь сделал Loopback. А я на первых порах и не заметил.
В общем, вам нужно заменить всего одну строку:
Code: | found = FileFindEv("size:" & gTorrentSize, "", "") |
На:
Code: | found = FileFindEv("size:" & gTorrentSize, "", "sort:3") |
Этого должно хватить, чтобы самый верхний каталог в структуре пустых каталогов стоял первым в списке результатов.
Касаемо замены. Конечно, лучше сделать отдельный файл и дополнительный алгоритм, но на первое время можете попробовать прямо в код прописать условие для замены сразу после строчки:
Code: | gHintPipe = DllCall(pInfo, 'Ptr', hMI, "Uint", 0, "Wstr")
If StrPos(sMode, "hint.txt") Then
gHintPipe = StrReplace(gHintPipe, "DTS HD Master Audio", "DTS-HD MA")
gHintPipe = StrReplace(gHintPipe, "Dolby Digital", "DD")
EndIf
If Not bLang Then gHintPipe = StrReplace(gHintPipe, Chr(32), Chr(160)) |
Но важное уточнение. Если будете менять вот такие строки:
Code: | Audio #3: 6ch, 48.0 kHz, 768 kb/s (CBR), E-AC-3, Dolby Digital Plus with Dolby Atmos, fr, 31.250 FPS (1536 SPF) |
То длинные строки для замены должны идти после коротких, чтобы избежать возможной замены подстрок, иначе может получится такая замена:
Code: | DD Plus with Dolby Atmos |
Чтобы этого не произошло, порядок должен быть такой:
Code: | If StrPos(sMode, "hint.txt") Then
gHintPipe = StrReplace(gHintPipe, "DTS HD Master Audio", "DTS-HD MA")
gHintPipe = StrReplace(gHintPipe, "Dolby Digital Plus with Dolby Atmos", "DD+Atmos")
gHintPipe = StrReplace(gHintPipe, "Dolby Digital", "DD")
EndIf |
Если замены себя оправдают и вам понравится, то можно будет подумать над файлом, где хранить такие замены, чтобы не было необходимости в код жестко прописывать.
Кстати, я вчера уже не на свежую голову написал, что такой код сработает:
Code: | If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002) |
Но он не сработает, потому что переменная bEverything действует только в рамках функции TorrentFindData, а вызов происходит из функции GoToPathFromMsg. Чтобы все заработало, в функции TorrentFindData необходимо заменить строку "Local bEverything = nMode" на "Global bEverything = nMode". Тогда переменная станет глобальной и доступной другим функциям. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1629
|
(Separately) Posted: Sun Sep 28, 2025 20:28 Post subject: |
|
|
Версия Autorun 2.2.21 beta
 История изменений
Code: | * RegExp переведён на новый API, скорость работы на больших текстах увеличилась в разы
+ API: для плагинов добавлена возможность передавать параметры массивом
* проверены и оптимизированы все скриптовые функции основного модуля
+ функции StrToHex и HexToStr
- в SizeFormat в некоторых случаях не работала установка пользователского разделителя
- в SizeFormat по умолчанию не применялся системный десятичный разделитель
- OutputDebugString не выводила в DebugView текст длиной более 32766 символов
- ещё раз исправлены Date и Time
+ добавлены функции RegEnumKey и RegEnumVal
* в RegRead изменён вывод ошибки "неподдерживаемый тип параметра" с диалога на код ERROR
+ RegRead и RegWrite могут работать с типом REG_QWORD
+ RegRead возвращает тип прочитанного значения в макросе EXTENDED
- в RegWrite не работала установка параметра типа REG_MULTI_SZ
- небольшие исправления в коде чтения скрипта
+ функции Min и Max
* оптимизация кода чтения и переименования ini-секций
* внутренние изменения в процессе вызова функций плагинов
- свойство SortMethod объекта List возвращало всегда 0
* внутренние изменения в обработке выражений
* внутренние изменения и оптимизации нового окна сообщений об ошибках
* убрана поддержка раннего метода возврата длинного текста, использовавшегося в GetSelectedItems с 2.2.15 по 2.2.19
- исправлено обрезание текста параметра при использовании вычисляемых строк в командной записи функций плагинов
- исправлено чтение/запись строк длиной в один символ в объектах Buffer, BinaryFile, TextFile
|
Процесс ревизии кода продолжается.
Первое, отчёт yozhik о баге с вычисляемыми строками подоспел неожиданно вовремя, т. к. в процессе решения проблемы удалось сделать некоторые моменты лучше и эффективнее.
Второе, закончил рефакторинг и оптимизацию внутренних скриптовых функций основного модуля. Больше всего переработан и дополнен древний код работы с реестром. Но также есть и другие исправления и добавления по мелочам.
Третье, наконец сделал то, что давно собирался - дополнил API плагинов возможностью получать параметры списком. В принципе, для подавляющего большинства функций плагинов это не даёт какого-то заметного выигрыша в скорости, поэтому бросаться переписывать их смысла нет. Но не в случае RegExp. Теперь он работает намного быстрее, и чем больше размер входного текста, тем больше разница, до нескольких десятков раз.
Дальше планируется пройтись и почистить код объектов, потом на очереди плагины. Думаю, во время этого процесса интервалы между версиями будут поменьше, чтобы не накапливать слишком много изменений, так будет проще найти источник проблем в случае их появления.
Orion9 wrote: | Но если строка слишком длинная, то и подсказка может получиться на весь экран, хочется как-то ограничивать этот размер. |
Вот доберусь до плагинов, может заодно и посмотрю. |
|
Back to top |
|
 |
yozhik

Joined: 04 May 2014 Posts: 308 Location: Электросталь
|
(Separately) Posted: Sun Sep 28, 2025 22:41 Post subject: |
|
|
Loopback
У меня чайнический вопрос.
Предыстория. RegExp такой замечательный теперь у нас есть, а я всё никак себе консольную утилиту поиска/замены не подберу, хотя много перепробовал, начиная от sed. То у них с кодировками засада, то экранирование глючит, то регулярки слабые, то метасимволы какие-то не работают, то синтаксис параметров какой-нибудь экзотически-головоломный. А задача следующая: редко, раз в месяц или два, я скачиваю текстовые файлы и переформатирую их автоматом при помощи списка замен. Сейчас подумал делать это при помощи Autorun, не сложно жеж: ф-ция со списком замен, RegisterCommand и вызывать её.
Теперь, собственно, вопрос. Предположим у меня 10 таких случаев: 10 файлов и каждый из них обрабатывается списком из 30-50 строк найти/заменить. Получается 10 ф-ций, строк 500 кода. Но пользоваться я этими ф-циями буду нечасто. Раз в месяц, в два. А загружаться они будут при каждом старте TC. Такая вот загрузка редко используемого как то влияет негативно на работу в TC? Ну, там скорость загрузки или память «забивает» — это я не сам придумываю, просто слышал от других, что, мол, «лишний балласт», то, сё. А в реальности как? Насколько такой подход к решению моей задачи целесообразен, практичен, экономен?
Потому что сделать то я могу по-разному: и sed'ом обработать, и rxrepl'ом, и, в конце концов, скрипт на AutoIt написать. Но у каждого из перечисленных способов недостатки есть, и потому придётся их (способы) варьировать от случая к случаю, а хочется единообразия, и вот оно то сейчас, при помощи Autorun, мне представляется достижимым. _________________ Amo ergo sum |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 65
|
(Separately) Posted: Sun Sep 28, 2025 23:15 Post subject: |
|
|
Orion9 wrote: | A55555
Я поторопился, когда сказал, что с результатами от Everything ничего не поделаешь. Функция поиска Autorun может получать отсортированный результат:
 FileFindEv Everything будет сортировать результирующий список:
0 — без сортировки (по умолчанию);
1 — по имени, по возрастанию;
2 — по имени, по убыванию;
3 — по директории, по возрастанию;
4 — по директории, по убыванию;
5 — по размеру, по возрастанию;
6 — по размеру, по убыванию;
7 — по расширению, по возрастанию;
8 — по расширению, по убыванию;
9 — по имени типа, по возрастанию;
10 — по имени типа, по убыванию;
11 — по дате создания, по возрастанию;
12 — по дате создания, по убыванию;
13 — по дате изменения, по возрастанию;
14 — по дате изменения, по убыванию;
15 — по атрибутам, по возрастанию;
16 — по атрибутам, по убыванию;
17 — по имени в списке, по возрастанию;
18 — по имени в списке, по убыванию;
19 — по числу запусков, по возрастанию;
20 — по числу запусков, по убыванию;
21 — по признаку «недавно изменённый», по возрастанию;
22 — по признаку «недавно изменённый», по убыванию;
23 — по дате доступа, по возрастанию;
24 — по дате доступа, по убыванию;
25 — по дате запуска, по возрастанию;
26 — по дате запуска, по убыванию.
Если опция не задана, её значение — 0 (без сортировки).
Да, крутую вещь сделал Loopback. А я на первых порах и не заметил.
В общем, вам нужно заменить всего одну строку:
Code: | found = FileFindEv("size:" & gTorrentSize, "", "") |
На:
Code: | found = FileFindEv("size:" & gTorrentSize, "", "sort:3") |
Этого должно хватить, чтобы самый верхний каталог в структуре пустых каталогов стоял первым в списке результатов. |
Спасибо, работает. Этим буду пользоваться вариантом.
Этот способ тоже сработал.
Orion9 wrote: | Кстати, я вчера уже не на свежую голову написал, что такой код сработает:
Code: | If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002) |
Но он не сработает, потому что переменная bEverything действует только в рамках функции TorrentFindData, а вызов происходит из функции GoToPathFromMsg. Чтобы все заработало, в функции TorrentFindData необходимо заменить строку "Local bEverything = nMode" на "Global bEverything = nMode". Тогда переменная станет глобальной и доступной другим функциям. |
Orion9 wrote: | Касаемо замены. Конечно, лучше сделать отдельный файл и дополнительный алгоритм, но на первое время можете попробовать прямо в код прописать условие для замены сразу после строчки:
Code: | gHintPipe = DllCall(pInfo, 'Ptr', hMI, "Uint", 0, "Wstr")
If StrPos(sMode, "hint.txt") Then
gHintPipe = StrReplace(gHintPipe, "DTS HD Master Audio", "DTS-HD MA")
gHintPipe = StrReplace(gHintPipe, "Dolby Digital", "DD")
EndIf
If Not bLang Then gHintPipe = StrReplace(gHintPipe, Chr(32), Chr(160)) |
Но важное уточнение. Если будете менять вот такие строки:
Code: | Audio #3: 6ch, 48.0 kHz, 768 kb/s (CBR), E-AC-3, Dolby Digital Plus with Dolby Atmos, fr, 31.250 FPS (1536 SPF) |
То длинные строки для замены должны идти после коротких, чтобы избежать возможной замены подстрок, иначе может получится такая замена:
Code: | DD Plus with Dolby Atmos |
Чтобы этого не произошло, порядок должен быть такой:
Code: | If StrPos(sMode, "hint.txt") Then
gHintPipe = StrReplace(gHintPipe, "DTS HD Master Audio", "DTS-HD MA")
gHintPipe = StrReplace(gHintPipe, "Dolby Digital Plus with Dolby Atmos", "DD+Atmos")
gHintPipe = StrReplace(gHintPipe, "Dolby Digital", "DD")
EndIf |
Если замены себя оправдают и вам понравится, то можно будет подумать над файлом, где хранить такие замены, чтобы не было необходимости в код жестко прописывать. |
Спасибо, работает.
Получается прописывание в том порядке, который вы подсказываете обязательно, т.к. если не указано ничего в фрагменте кода, например для
то оно всё равно его переделает на
Но в любом случае мне и такой вариант подходит на 99% |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1629
|
(Separately) Posted: Mon Sep 29, 2025 00:08 Post subject: |
|
|
yozhik wrote: | Такая вот загрузка редко используемого как то влияет негативно на работу в TC? Ну, там скорость загрузки или память «забивает» — это я не сам придумываю, просто слышал от других, что, мол, «лишний балласт», то, сё. А в реальности как? Насколько такой подход к решению моей задачи целесообразен, практичен, экономен? |
В принципе, естественно, влияет и на скорость загрузки, и на потребляемую память. Время требуется для парсинга, а то что отпарсилось занимает некоторое количество памяти.
Насчет точной количественной оценки как-то не задумывался, но структура скрипта в памяти будет занимать несколько больше, чем исходный текст. Вопрос только насколько больше. Например, условие If..else..endif занимает 36 байт в х86 и 64 байта в х64, For..Next - 40 и 72, пользовательская функция 64 и 112 соответственно и т. д. По 16/24 байта занимают место переменные (впрочем, они создаются только при вызове функции, поэтому их можно не считать). Всё это, конечно, не считая длины строк (которые в свою очередь UTF-16): литералов, выражений, имён и значений переменных и т. д.
Например, размер памяти для кода из поста выше
Code: | If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002) |
я бы оценил где-то в 166/194 байт, при размере исходного текста 74 байта в ANSI или 148 байт в UTF-16. Думаю, не будет большой ошибкой считать объем памяти в 1.5-3 раза больше размера исходного текста (самая большая разница, если он в ANSI).
С загрузкой проще, поскольку можно легко оценить с помощью GetUptme, с текстом функции и без него. Сомневаюсь, что загрузка и парсинг нескольких килобайт текста выйдет за пределы погрешности измерения, но можно интереса ради проверить.
Ну а влияния на скорость работы TC после загрузки неработающие функции не оказывают. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 903
|
(Separately) Posted: Mon Sep 29, 2025 00:33 Post subject: |
|
|
Ну надо же. Только я всё заархивировал в очередной уже раз, а тут новая версия )
К сожалению, в этот раз не получится потестировать сразу, но рано или поздно руки дойдут.
Loopback wrote: | Вот доберусь до плагинов, может заодно и посмотрю. |
Ну, фича на самом деле нужная, имхо. Давно уже хотел ее запросить, но повода не было. А тут взялся за постраничный вывод подсказки и понял, что эта фича маст хэв и значительно упростила бы жизнь.
Кстати, были еще вопросы, по возможности, не оставляйте без ответа. Вопрос про Everything в секции финализации (почему не выгружается даже через ShellExec) и вопрос про Ctrl+1..Ctrl+5 в листере (не перехватываются комбинации, если повесить через SetHotkeyAction).
yozhik wrote: | А в реальности как? Насколько такой подход к решению моей задачи целесообразен, практичен, экономен? |
Сомнения прочь! Выбор очевиден. Только Autorun. Как пользователь плагина могу сказать, что у меня несколько тысяч строк кода и часто бывает по несколько потоков в фоне крутятся, никаких тормозов или других проблем с ресурсами не замечал.
A55555 wrote: | Получается прописывание в том порядке, который вы подсказываете обязательно |
Да, если ожидаются подстроки, порядок должен быть такой:
Code: | Dolby Digital Plus with Dolby Atmos
Dolby Digital Plus
Dolby Digital |
Вы попробуйте. Посмотрите, что из этого получится. Если будет смысл в таких заменах, то в будущих версиях перенесем их в файл. А если замен совсем будет мало, то можно и в коде оставить. Хотя файл, конечно, лучше. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 446
|
(Separately) Posted: Mon Sep 29, 2025 10:40 Post subject: |
|
|
Orion9 wrote: | Вопрос про Everything в секции финализации (почему не выгружается даже через ShellExec) |
У меня-же выгружается. И уже много лет. Это самая первая команда, используемая мной в Autorun. Так что навряд-ли дело в плагине. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 903
|
(Separately) Posted: Mon Sep 29, 2025 12:23 Post subject: |
|
|
AkulaBig
У меня тоже выгружается, я об этом писал. Но раз человек утверждает, что у него на чистом конфиге не работает, то, наверное, надо разобраться, что у него не так. Может и не в плагине дело.
A55555 wrote: | Но на чистом файле autorun.cfg я попробовал и нет, не выгружает например вот этим
Code: | Pragma AutorunFinalizeSection
ShellExec(COMMANDER_PATH & "Everything.exe", "-exit") |
|
Но я понимаю, что это не приоритет, тем более, что сам A55555 нашел другое решение.
Кстати, я вчера перед тем как всё заархивировать, сделал небольшую функцию для переключения полей подсказки, чтобы не комментировать каждый раз Pragma AutorunPluginFields, а делать это "на лету". Старая подсказка у меня по-прежнему в "JoinHint" и на нее много чего навешено, чтобы полностью от нее отказаться в пользу "MagicHint". Но в будущем, конечно, надо будет довести все до ума.
 Hidden text Code: | # Alt+F12
SetHotkeyAction /K:A /H:F12 SetHintFields
Func SetHintFields()
Local i
Static c = 1
c *= -1
Local sHint = c < 0 ? "JoinHint" : "MagicHint"
For i = 1 to 60
SetFieldsParam("Func", "C" & i, sHint)
Next
ShowRedHint("Поля подсказки " & sHint)
EndFunc
Func ShowRedHint(HintText)
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint(HintText, "", "", 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Sleep(50)
SetHintParam("ShowHint", "Reload")
EndFunc |
Loopback wrote: | Думаю, не будет большой ошибкой считать объем памяти в 1.5-3 раза больше размера исходного текста (самая большая разница, если он в ANSI).
С загрузкой проще, поскольку можно легко оценить с помощью GetUptme, с текстом функции и без него. |
А можно сделать GetState с параметром Memory для плагина? Такая информация была бы очень интересна. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1629
|
(Separately) Posted: Mon Sep 29, 2025 12:49 Post subject: |
|
|
Orion9 wrote: | Вопрос про Everything в секции финализации (почему не выгружается даже через ShellExec) |
Orion9 wrote: | Но раз человек утверждает, что у него на чистом конфиге не работает, то, наверное, надо разобраться, что у него не так. Может и не в плагине дело. |
Скорее всего какие-то особенности настройки системы. Возможно, из-за того, что программа требует повышения привилегий. Но я у себя такого повторить тоже не могу, у меня вызов всегда срабатывает. Не знаю что добавить. Можно посмотреть сразу после запуска ShellExec, что показывает SYSERRORTEXT, возможно это даст какую-то информацию.
Orion9 wrote: | и вопрос про Ctrl+1..Ctrl+5 в листере (не перехватываются комбинации, если повесить через SetHotkeyAction). |
Каюсь, тут я упустил, что это тоже ко мне вопрос. Не самая очевидная проблема, но всё оказалось просто. По умолчанию ShowHint перехватывает фокус, соответственно, нажатие после вызова функции ShowPipeEx попадает в другое окно. Нужно вызывать подсказку с флагом 1, ну и таймер закрытия придется использовать (или тыкать строго в подсказку).
Orion9 wrote: | А можно сделать GetState с параметром Memory для плагина? Такая информация была бы очень интересна. |
Почему-то был уверен, что такой запрос поступит Скорее всего нет, слишком много придется делать обвеса только ради одной циферки. |
|
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
|