Autorun

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

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

A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):MediaInfo
Я выше писал, что возможно придется обратиться к документации MediaInfo, поскольку это отдельный вопрос, требующий отдельного изучения. С синтаксисом шаблонов я плохо знаком, т.к. глубоко в него не вникал, поэтому подсказка hint.txt так и осталась недоделанной. Перевод строки делается через "\r\n", а скобка экранируется символом обратной косой черты "", т.е. Как я понял, все, что находится в квадратных скобках, не будет отображаться в случае отсутствия значий у полей, которые находятся внутри этих скобок.
Orion9
спасибо работает.
Копаюсь в документации MediaInfo уже не первый день, много уже переделал под себя, "\r\n" перенос строки я использую, [s]но не получается добиться, чтоб чистой строкой отделить блоки, например, если взять ваш пример выше, чтоб стало вот так[/s]
Orion9 писал(а): [cut="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: [/cut]
[s]условные блоки отделились визуально при показе подсказки.[/s]
Для перехода на следующую строку, плюс чтоб ещё одной чистой строкой отделить дважды нужно написать.

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

\r\n\r\n
Но это всё равно не то, т.к. получается примерно вот так
Orion9 писал(а): [cut="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: [/cut]
Вместо чистой строки только между блоками.

И ещё есть такой момент, что если название медиафайла начинается с русской буквы, то в подсказку попадает имя файла дважды, в самом начале подсказки и на следующей строке после Name: дублируется

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

"Имя_файла.расширение"
Name: "Имя_файла.расширение"
....
если с английской буквы, то всё нормально, только

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

Name: "Имя_файла.расширение"
....
Есть в файле hint.txt ещё кусок для показа глав

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

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
но главы в подсказке не показываются для файла в котором они точно есть и они даже подписаны.
[cut]Изображение[/cut]
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):Но это всё равно не то, т.к. получается примерно вот так
Да, припоминаю такое. Именно поэтому и отложил шаблон в сторону, когда понял, что нужно разбираться с тонкостями, а заниматься этим не хотелось.

И не только с русскими именами была проблема. Был еще и такой баг:

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

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 и т.д. Похоже, они управляют дополнительными параметрами вывода. Посмотрите в обновленном шаблоне:
[cut]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%][/cut]
С главами проблема, но пока не обращайте внимание. Я просто копировал строки из какого-то шаблона в csv файл, посмотреть, что получится. Это было уже давно, даже не помню, что и откуда копировал, возможно, из html-шаблона, но скорее всего поля просто не сходятся, поэтому и получаются пустые главы.

Я тут кое-что поменял в подсказке. Завтра выложу новую версию, более универсальную, сейчас просто не успеваю описание к ней сделать.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Я недавно запрашивал фичу, чтобы у подсказки можно было менять текст без вызова другой подсказки, но если полезете в код, то хотелось бы задавать максимальную ширину подсказки. Сейчас это динамическая величина, зависящая от длины строки. Но если строка слишком длинная, то и подсказка может получиться на весь экран, хочется как-то ограничивать этот размер.

Сейчас столкнулся с такой проблемой. Назначил вызов функции на Ctrl+1..Ctrl+5, но в окне листера клавиши не перехватываются. То есть если у меня открыто окно плагина TCMediaInfo, то смена режимов не срабатывает, хотя я поставил Return -1 в ShowPipeEx.
[cut]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[/cut]
Конечно, можно сменить на Alt или на Ctrl+Alt, но мне хотелось бы именно Ctrl использовать. Пока сменил на Alt, чтобы не было проблем, полный код чуть ниже.

A55555
Я вчера не сразу понял, какая у вас проблема с именами. Да, шаблоны не работают, если в них использовать кириллицу (в лучшем случае теряется секция, а в худшем шаблон не загружается). Но у вас другая проблема. Сверху попадает подсказка от проводника или самого ТС (поэтому поле дублируется), так работает подсказка на Autorun - оригинальная подсказка сливается с дополнительной подсказкой, с этим ничего не поделаешь. Дополнительная подсказка только добавляет новые поля, но не заменяет существующие.

С главами действительно есть баг, который за пять лет так и не был исправлен.
Я взял стандартный шаблон, который идет с GUI-версией библиотеки:
[cut="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[/cut]
Но даже в нем Chapters не работает. Такой вот неприятный сюрприз.

Все-равно оставил эту строку в hint.txt. Последняя версия шаблона:
[cut="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%\]][/cut]
Еще два шаблона, которые понадобятся для новой подсказки:
[cut="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[/cut]
[cut="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[/cut]
Скинул еще раз, чтобы не приходилось отматывать назад.

Обновленный код подсказки.
[cut]

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

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       
[/cut]
Добавлена фича постраничного вывода подсказки, а также гибкость в управлении схемой расположения секций. Пока еще не полная гибкость, но уже лучше.

Переменные.

gHintClipb - копировать в буфер всю подсказку при отображении в страничном режиме
gHintLines - число строк подсказки, больше 60 быть не может
gHintWait - задержка для всех секций перед отображением
gHintShift - шаблон для смены "на лету", только для левой секции
gHintCaps - если false, подсказка будет отображаться без CapsLock или Ctrl
gHintLayout - размер каждой секции в процентах
gHintContent - шаблон для каждой секции; если пустой "", в секцию ничего не попадает, кроме самой подсказки ТС или проводника; если "Inform" - стандартный отчет MediaInfo; если имя файла, то шаблон из файла (файлы должны находиться в каталоге MediaInfo.dll, существование файла не проверяется, в случае отсутствия сообщений об ошибке не будет, отобразится сырой результат отчета MediaInfo).
gHintSleep - задержка для каждой секции.

Пара примеров.

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

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.

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

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 можно переместиться на вторую страницу и так далее. Всего четыре страницы.

Получилась более универсальная подсказка, чем прежняя, но делал все буквально на лету, т.ч. могут быть какие-то ошибки или недочеты. Только дальнейшее использование покажет.
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9
большое спасибо, всё работает согласно вашего пояснения. В т.ч. листание огромной подсказки "Inform".
Спасибо за синтаксис по добавлению чистых строк в hint.txt, теперь подсказка отображается как хотелось.

Вместо режима MediaInfo "Inform" можно подставить "Video (compact)", или не всё так просто?
Я в принципе hint.txt под себя подогнал, но всё равно любопытно.

Можно ли добавить в код секцию, в которой пользователь сможет легко указывать замену того, что выводится в подсказку.
Я имею ввиду следующее, например добавив параметр в раздел Аудио (hint.txt)

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

[%Format_Commercial_IfAny%]
для аудио форматов типа AC-3 начинает выводится дополнительно коммерческое название (Dolby Digital), для DTS, если это HD версия выводится надпись "DTS HD Master Audio". Это хорошо, но для подсказки длинновато и визуально шумновато.
Мне хватило бы "DTS-HD MA", "DD" для dolby.
Просто на данный момент весь DTS именно вот так показывается и только через коммерческое имя можно понять, что там не простой DTS.

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

"DTS HD Master Audio" = "DTS-HD MA"
"Dolby Digital" = "DD"
Если это космически времязатратно, то совершенно это не обязательно, это уже так, спокойно и обойтись можна.

Поиск файлов принадлежащих .torrent файлу через Everything.exe
Вы добавляли этот один шаг вверх по дереву каталогов SendCommand(2002).

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

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

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

If bEverything Then CommandExec em_everything_exit
Есть ли в коде место, где можно именно для поиска bEverything указать дополнительный шаг SendCommand(2002)
Вы говорили, что могут быть проблемы, если несколько папок будет с одной папкой на пути к файлам, но всё-таки можно такой костыль для bEverything, где-то дополнительно указать, на подобии

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

If bEverything & StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
чтоб именно при bEverything дважды по дереву папок поднимало вверх (общий подъем для любого вида поиска плюс один дополнительный)?
Не включая его в код для всех, я себе, если это возможно, подставлю.
У меня львиная доля это BDRemux (как раз одна эта папка BDMV) и получается быстрым поиском Everything я постоянно попадаю внутрь папки.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):Вместо режима MediaInfo "Inform" можно подставить "Video (compact)", или не всё так просто?
Так сделать не получится. Режимы TCMediaInfo используются только в плагине TCMediaInfo. Loopback разработал специальные алгоритмы для создания таких режимов с возможностью сохранения в файле конфигурации TCMediaInfo.xml. Можно сказать, это авторские режимы, кроме одного режима "Inform", который является стандартным выводом библиотеки MediaInfo.

В подсказке тоже используется стандартный вывод MediaInfo "Inform", что и навело вас на мысль о возможной связи. Но в подсказке в качестве дополнительных вариантов используются шаблоны MediaInfo - текстовые файлы с определенной разметкой и синтаксисом. Исправляя эти файлы, можно подгонять под себя выводимые данные. Сейчас уже есть три шаблона, но можно сделать другие или передлать эти.
A55555 писал(а):"DTS HD Master Audio" = "DTS-HD MA"
"Dolby Digital" = "DD"
Я понял. Надо подумать.
A55555 писал(а):If bEverything & StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
Все правильно, только логическое "и" в Autorun так и будет "and", т.е. ваш код:

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

If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
Вполне может сработать, все зависит от того, что именно вернет Everything.
A55555 писал(а):У меня львиная доля это BDRemux (как раз одна эта папка BDMV) и получается быстрым поиском Everything я постоянно попадаю внутрь папки.
А при простом поиске все нормально?
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):
A55555 писал(а):If bEverything & StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
Все правильно, только логическое "и" в Autorun так и будет "and", т.е. ваш код:

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

If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
Вполне может сработать, все зависит от того, что именно вернет Everything.
Спасибо, сегодня попробую найти место куда подставить.

Orion9 писал(а):
A55555 писал(а):У меня львиная доля это BDRemux (как раз одна эта папка BDMV) и получается быстрым поиском Everything я постоянно попадаю внутрь папки.
А при простом поиске все нормально?
Да, при простом идеально.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555
Я поторопился, когда сказал, что с результатами от Everything ничего не поделаешь. Функция поиска Autorun может получать отсортированный результат:
[cut="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 (без сортировки).[/cut]
Да, крутую вещь сделал Loopback. А я на первых порах и не заметил.

В общем, вам нужно заменить всего одну строку:

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

found = FileFindEv("size:" & gTorrentSize, "", "")
На:

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

found = FileFindEv("size:" & gTorrentSize, "", "sort:3")
Этого должно хватить, чтобы самый верхний каталог в структуре пустых каталогов стоял первым в списке результатов.

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

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

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))
Но важное уточнение. Если будете менять вот такие строки:

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

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)
То длинные строки для замены должны идти после коротких, чтобы избежать возможной замены подстрок, иначе может получится такая замена:

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

DD Plus with Dolby Atmos
Чтобы этого не произошло, порядок должен быть такой:

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

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
Если замены себя оправдают и вам понравится, то можно будет подумать над файлом, где хранить такие замены, чтобы не было необходимости в код жестко прописывать.

Кстати, я вчера уже не на свежую голову написал, что такой код сработает:

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

If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
Но он не сработает, потому что переменная bEverything действует только в рамках функции TorrentFindData, а вызов происходит из функции GoToPathFromMsg. Чтобы все заработало, в функции TorrentFindData необходимо заменить строку "Local bEverything = nMode" на "Global bEverything = nMode". Тогда переменная станет глобальной и доступной другим функциям.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Версия Autorun 2.2.21 beta

[cut="История изменений"]

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

* 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
[/cut]
Процесс ревизии кода продолжается.

Первое, отчёт yozhik о баге с вычисляемыми строками подоспел неожиданно вовремя, т. к. в процессе решения проблемы удалось сделать некоторые моменты лучше и эффективнее.

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

Третье, наконец сделал то, что давно собирался - дополнил API плагинов возможностью получать параметры списком. В принципе, для подавляющего большинства функций плагинов это не даёт какого-то заметного выигрыша в скорости, поэтому бросаться переписывать их смысла нет. Но не в случае RegExp. Теперь он работает намного быстрее, и чем больше размер входного текста, тем больше разница, до нескольких десятков раз.

Дальше планируется пройтись и почистить код объектов, потом на очереди плагины. Думаю, во время этого процесса интервалы между версиями будут поменьше, чтобы не накапливать слишком много изменений, так будет проще найти источник проблем в случае их появления.
Orion9 писал(а):Но если строка слишком длинная, то и подсказка может получиться на весь экран, хочется как-то ограничивать этот размер.
Вот доберусь до плагинов, может заодно и посмотрю.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Loopback
У меня чайнический вопрос.

Предыстория. RegExp такой замечательный теперь у нас есть, а я всё никак себе консольную утилиту поиска/замены не подберу, хотя много перепробовал, начиная от sed. То у них с кодировками засада, то экранирование глючит, то регулярки слабые, то метасимволы какие-то не работают, то синтаксис параметров какой-нибудь экзотически-головоломный. А задача следующая: редко, раз в месяц или два, я скачиваю текстовые файлы и переформатирую их автоматом при помощи списка замен. Сейчас подумал делать это при помощи Autorun, не сложно жеж: ф-ция со списком замен, RegisterCommand и вызывать её.

Теперь, собственно, вопрос. Предположим у меня 10 таких случаев: 10 файлов и каждый из них обрабатывается списком из 30-50 строк найти/заменить. Получается 10 ф-ций, строк 500 кода. Но пользоваться я этими ф-циями буду нечасто. Раз в месяц, в два. А загружаться они будут при каждом старте TC. Такая вот загрузка редко используемого как то влияет негативно на работу в TC? Ну, там скорость загрузки или память «забивает» — это я не сам придумываю, просто слышал от других, что, мол, «лишний балласт», то, сё. А в реальности как? Насколько такой подход к решению моей задачи целесообразен, практичен, экономен?

Потому что сделать то я могу по-разному: и sed'ом обработать, и rxrepl'ом, и, в конце концов, скрипт на AutoIt написать. Но у каждого из перечисленных способов недостатки есть, и потому придётся их (способы) варьировать от случая к случаю, а хочется единообразия, и вот оно то сейчас, при помощи Autorun, мне представляется достижимым.
Amo ergo sum
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):A55555
Я поторопился, когда сказал, что с результатами от Everything ничего не поделаешь. Функция поиска Autorun может получать отсортированный результат:
[cut="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 (без сортировки).[/cut]
Да, крутую вещь сделал Loopback. А я на первых порах и не заметил.

В общем, вам нужно заменить всего одну строку:

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

found = FileFindEv("size:" & gTorrentSize, "", "")
На:

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

found = FileFindEv("size:" & gTorrentSize, "", "sort:3")
Этого должно хватить, чтобы самый верхний каталог в структуре пустых каталогов стоял первым в списке результатов.
Спасибо, работает. Этим буду пользоваться вариантом.

Этот способ тоже сработал.
Orion9 писал(а):Кстати, я вчера уже не на свежую голову написал, что такой код сработает:

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

If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
Но он не сработает, потому что переменная bEverything действует только в рамках функции TorrentFindData, а вызов происходит из функции GoToPathFromMsg. Чтобы все заработало, в функции TorrentFindData необходимо заменить строку "Local bEverything = nMode" на "Global bEverything = nMode". Тогда переменная станет глобальной и доступной другим функциям.
Orion9 писал(а):Касаемо замены. Конечно, лучше сделать отдельный файл и дополнительный алгоритм, но на первое время можете попробовать прямо в код прописать условие для замены сразу после строчки:

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

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))
Но важное уточнение. Если будете менять вот такие строки:

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

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)
То длинные строки для замены должны идти после коротких, чтобы избежать возможной замены подстрок, иначе может получится такая замена:

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

DD Plus with Dolby Atmos
Чтобы этого не произошло, порядок должен быть такой:

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

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
Если замены себя оправдают и вам понравится, то можно будет подумать над файлом, где хранить такие замены, чтобы не было необходимости в код жестко прописывать.
Спасибо, работает.
Получается прописывание в том порядке, который вы подсказываете обязательно, т.к. если не указано ничего в фрагменте кода, например для

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

Dolby Digital Plus
то оно всё равно его переделает на Но в любом случае мне и такой вариант подходит на 99%
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yozhik писал(а): Такая вот загрузка редко используемого как то влияет негативно на работу в TC? Ну, там скорость загрузки или память «забивает» — это я не сам придумываю, просто слышал от других, что, мол, «лишний балласт», то, сё. А в реальности как? Насколько такой подход к решению моей задачи целесообразен, практичен, экономен?
В принципе, естественно, влияет и на скорость загрузки, и на потребляемую память. Время требуется для парсинга, а то что отпарсилось занимает некоторое количество памяти.

Насчет точной количественной оценки как-то не задумывался, но структура скрипта в памяти будет занимать несколько больше, чем исходный текст. Вопрос только насколько больше. Например, условие If..else..endif занимает 36 байт в х86 и 64 байта в х64, For..Next - 40 и 72, пользовательская функция 64 и 112 соответственно и т. д. По 16/24 байта занимают место переменные (впрочем, они создаются только при вызове функции, поэтому их можно не считать). Всё это, конечно, не считая длины строк (которые в свою очередь UTF-16): литералов, выражений, имён и значений переменных и т. д.

Например, размер памяти для кода из поста выше

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

If bEverything And StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
я бы оценил где-то в 166/194 байт, при размере исходного текста 74 байта в ANSI или 148 байт в UTF-16. Думаю, не будет большой ошибкой считать объем памяти в 1.5-3 раза больше размера исходного текста (самая большая разница, если он в ANSI).

С загрузкой проще, поскольку можно легко оценить с помощью GetUptme, с текстом функции и без него. Сомневаюсь, что загрузка и парсинг нескольких килобайт текста выйдет за пределы погрешности измерения, но можно интереса ради проверить.

Ну а влияния на скорость работы TC после загрузки неработающие функции не оказывают.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Ну надо же. Только я всё заархивировал в очередной уже раз, а тут новая версия )

К сожалению, в этот раз не получится потестировать сразу, но рано или поздно руки дойдут.
Loopback писал(а):Вот доберусь до плагинов, может заодно и посмотрю.
Ну, фича на самом деле нужная, имхо. Давно уже хотел ее запросить, но повода не было. А тут взялся за постраничный вывод подсказки и понял, что эта фича маст хэв и значительно упростила бы жизнь.

Кстати, были еще вопросы, по возможности, не оставляйте без ответа. Вопрос про Everything в секции финализации (почему не выгружается даже через ShellExec) и вопрос про Ctrl+1..Ctrl+5 в листере (не перехватываются комбинации, если повесить через SetHotkeyAction).
yozhik писал(а):А в реальности как? Насколько такой подход к решению моей задачи целесообразен, практичен, экономен?
Сомнения прочь! Выбор очевиден. Только Autorun. Как пользователь плагина могу сказать, что у меня несколько тысяч строк кода и часто бывает по несколько потоков в фоне крутятся, никаких тормозов или других проблем с ресурсами не замечал.
A55555 писал(а):Получается прописывание в том порядке, который вы подсказываете обязательно
Да, если ожидаются подстроки, порядок должен быть такой:

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

Dolby Digital Plus with Dolby Atmos
Dolby Digital Plus
Dolby Digital
Вы попробуйте. Посмотрите, что из этого получится. Если будет смысл в таких заменах, то в будущих версиях перенесем их в файл. А если замен совсем будет мало, то можно и в коде оставить. Хотя файл, конечно, лучше.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):Вопрос про Everything в секции финализации (почему не выгружается даже через ShellExec)
У меня-же выгружается. И уже много лет. Это самая первая команда, используемая мной в Autorun. Так что навряд-ли дело в плагине.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig
У меня тоже выгружается, я об этом писал. Но раз человек утверждает, что у него на чистом конфиге не работает, то, наверное, надо разобраться, что у него не так. Может и не в плагине дело.
A55555 писал(а):Но на чистом файле autorun.cfg я попробовал и нет, не выгружает например вот этим

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

Pragma AutorunFinalizeSection
ShellExec(COMMANDER_PATH & "Everything.exe", "-exit")
Но я понимаю, что это не приоритет, тем более, что сам A55555 нашел другое решение.

Кстати, я вчера перед тем как всё заархивировать, сделал небольшую функцию для переключения полей подсказки, чтобы не комментировать каждый раз Pragma AutorunPluginFields, а делать это "на лету". Старая подсказка у меня по-прежнему в "JoinHint" и на нее много чего навешено, чтобы полностью от нее отказаться в пользу "MagicHint". Но в будущем, конечно, надо будет довести все до ума.
[cut]

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

# 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
[/cut]
Loopback писал(а):Думаю, не будет большой ошибкой считать объем памяти в 1.5-3 раза больше размера исходного текста (самая большая разница, если он в ANSI).

С загрузкой проще, поскольку можно легко оценить с помощью GetUptme, с текстом функции и без него.
А можно сделать GetState с параметром Memory для плагина? Такая информация была бы очень интересна.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Вопрос про Everything в секции финализации (почему не выгружается даже через ShellExec)
Orion9 писал(а):Но раз человек утверждает, что у него на чистом конфиге не работает, то, наверное, надо разобраться, что у него не так. Может и не в плагине дело.
Скорее всего какие-то особенности настройки системы. Возможно, из-за того, что программа требует повышения привилегий. Но я у себя такого повторить тоже не могу, у меня вызов всегда срабатывает. Не знаю что добавить. Можно посмотреть сразу после запуска ShellExec, что показывает SYSERRORTEXT, возможно это даст какую-то информацию.
Orion9 писал(а): и вопрос про Ctrl+1..Ctrl+5 в листере (не перехватываются комбинации, если повесить через SetHotkeyAction).
Каюсь, тут я упустил, что это тоже ко мне вопрос. Не самая очевидная проблема, но всё оказалось просто. По умолчанию ShowHint перехватывает фокус, соответственно, нажатие после вызова функции ShowPipeEx попадает в другое окно. Нужно вызывать подсказку с флагом 1, ну и таймер закрытия придется использовать (или тыкать строго в подсказку).
Orion9 писал(а):А можно сделать GetState с параметром Memory для плагина? Такая информация была бы очень интересна.
Почему-то был уверен, что такой запрос поступит :) Скорее всего нет, слишком много придется делать обвеса только ради одной циферки.
Ответить