Orion9

|
Posted: Thu May 15, 2025 00:32 Post subject: |
|
|
AkulaBig wrote: | отказавшись от TCMediaInfo |
Имхо, TCMediaInfo один из лучших плагинов, не понятно, зачем от него отказываться. Я наоборот хотел с ним лучше разобраться, т.к. он у меня в подвисшем состоянии остался.
AkulaBig wrote: | Только вот навряд-ли Autorun выдержит еще полей 30. |
Да поля-то он, наверное, выдержит, только все-равно не понятно, зачем заменять один плагин другим. В скорости, например, от этого вряд ли получится выиграть, я как раз в этом убедился сейчас.
Пришлось переделать функцию подсчета, убрав из неё получение списка через ProcessExecGetOutput, т.к. этот вариант не работает с UNC-путями. Попутно сделал вызов через DllCall и расширил функционал. Сейчас вызов с ALT делает подсчет через плагин TCMediaInfo.wdx, а простой вызов через MediaInfo.dll. Поскольку MediaInfo.dll обрабатывает все файлы (даже те, которые не-медиа, что замедляет работу), пришлось добавить фильтр. При включеном CapsLock фильтр отключается. Вызов с CTRL ограничивает глубину каталога до первого уповня. SHIFT - выводит в окно отладчика информацию о пропущенных элементах.
 Hidden text Code: | RegisterCommand 62013 "Duration"
Func Duration(lParam)
RunThread DurationInfo
EndFunc
Func DurationInfo()
Local T1 = GetUptime()
Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10), b_Alt = IsPressed(0x12)
Local b_Caps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
Local name = RequestCopyDataInfo("SN")
Local file = RequestCopyDataInfo("SP") & name
If Not FileExist(file) Then
ShowHint("Файл не существует " & file)
Return
Endif
Local hMI = 0
Static sLib = "MediaInfo" & (auX64 ? "" : "_i386") & ".dll", _
hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Ini\Tools\Libs\" & sLib, "ptr")
Static sExt = ".aac .ac3 .aif .aiff .aifc .afc .ape .au .snd .cda .dsf .dts .dtswav .dtshd .dtsma .eac3 .flac .fla _
.m1a .m2a .mka .mpa .mp1 .mp2 .mp3 .mp4 .m4a .m4b .m4r .mod .mpc .mp+ .mpp .ogg .ogg .oga .ogx .ogg _
.ra .spx .opus .qoa .svx .8svx .tak .tta .wav .wave .w64 .bwf .rf64 .wma .wv .avi .wmv .wmp .wm .asf _
.mpg .mpeg .mpe .m1v .m2v .mpv2 .mp2v .ts .tp .tpr .trp .vob .ifo .ogm .ogv .mp4 .m4v .m4p .m4b .3gp _
.3gpp .3g2 .3gp2 .mkv .rm .ram .rmvb .rpm .flv .swf .mov .qt .amr .nsv .dpg .m2ts .m2t .mts .dvr-ms _
.k3g .skm .evo .nsr .amv .divx .webm .wtv .f4v .mxf"
If Not b_Alt Then
If hLib = 0 Then
ShowHint("Error LoadLibrary " & sLib)
Return
EndIf
hMI = DllCall(sLib & '\MediaInfo_New', "Ptr")
If hMI = 0 Then
ShowHint("MediaInfo failed to create new object")
Return
Endif
Else
Local obj = Plugin("TCMediaInfo")
If ERROR <> 0 Then
ShowHint("TCMediaInfo plugin error " & ERROR)
Return
Endif
EndIf
Local s = 0
If Not StrPos(FileGetAttr(file), "D") Then
If b_Alt Then
obj.FileName = file
s = obj.GetValue(0) # duration
Free(obj)
Else
If DllCall(sLib & '\MediaInfo_Open', 'ptr', hMI, "wstr", file, "uint") <> 1 Then
Return ShowHint("MediaInfo_Open failed to open file " & file)
EndIf
s = DllCall(sLib & '\MediaInfo_Get', _
'ptr', hMI, "int", 0, "int", 0, "wstr", "Duration/String3", "int", 1, "int", 0, "wstr")
EndIf
Return ShowHint("Файл: " & name & auCRLF & "Длительность: " & s)
Endif
Local i, out, dirs = 0, files = 0, errs = 0, aFiles = List(), seconds = 0
Local depth = (b_Ctrl ? 1 : 0)
ShowHint("Depth: " & depth & auCRLF & _
"CapsLock: " & (b_Caps ? "yes" : "no") & auCRLF & _
(b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"Подсчёт времени")
b_Win = false
# загрузка файлов в массив
If b_Win Then
#ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.*" %"file"
#aFiles.Text = out
Else
ListDirectory(file, aFiles, depth)
EndIf
# ShowHint("Обработка " & aFiles.Count & " элементов")
For i = 0 To aFiles.Count - 1
If StrPos(FileGetAttr(aFiles[i]), "D") Then
dirs += 1
If b_Shift Then OutputDebugString("Duration:Directory:" & aFiles[i])
Continue
EndIf
If b_Alt Then
obj.FileName = aFiles[i]
s = obj.GetValue(0,3) # duration -> milliseconds
Else
ext = FileGetExt(aFiles[i])
If Not b_Caps Then
If Not StrPos(sExt, '.' & ext) Then
If b_Shift Then OutputDebugString("Duration:Filter:" & aFiles[i])
Continue
EndIf
EndIf
If DllCall(sLib & '\MediaInfo_Open', 'ptr', hMI, "wstr", aFiles[i], "uint") <> 1 Then
errs += 1
If b_Shift Then OutputDebugString("Duration:Error:" & aFiles[i])
Continue
EndIf
s = DllCall(sLib & '\MediaInfo_Get', _
'ptr', hMI, "int", 0, "int", 0, "wstr", "Duration", "int", 1, "int", 0, "wstr")
EndIf
If s > 0 Then
seconds += s
files += 1
Else
If b_Shift Then OutputDebugString("Duration:Empty:" & aFiles[i])
EndIf
If IsPressed(0x11) And IsPressed(0x12) Then
ShowHint((b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"CapsLock: " & (b_Caps ? "yes" : "no") & auCRLF & _
"Depth: " & depth & auCRLF & _
"File: " & i & " of " & aFiles.Count & auCRLF & _
aFiles[i])
EndIf
Next
If b_Alt Then Free(obj)
If hMI <> 0 Then DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
seconds = Floor(seconds / 1000)
Local day = Floor(seconds / 86400)
Local hour = Floor((seconds - (day * 86400)) / 3600)
Local min = Floor(((seconds - (day * 86400)) - (hour * 3600)) / 60)
Local sec = seconds - (day * 86400 + hour * 3600 + min * 60)
Local total = StrFormat("%02d:%02d:%02d:%02d",day,hour,min,sec)
ShowHint("Папка: " & name & auCRLF & _
"Каталогов: " & dirs & auCRLF & _
"Элементов: " & aFiles.Count & auCRLF & _
"Обработано: " & files & auCRLF & _
"Ошибки DLL: " & errs & auCRLF & _
"Секунд: " & seconds & auCRLF & _
"Минут: " & Round(seconds / 60, 2) & auCRLF & _
"Часов: " & Round(seconds / 3600, 2) & auCRLF & _
"Суток: " & Round(seconds / 86400, 2) & auCRLF & _
"Длительность: " & total & auCRLF & _
"Powered by " & (b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"Время операции: " & Round(GetUptime() - T1, 3))
Free(aFiles)
EndFunc
Func ListDirectory(sPath, ByRef aList, nDepth = 1)
Local sFile, nAttr
Local ffd = Buffer(604)
Local hf = DllCall("FindFirstFileW", "wstr", sPath & "\*.*", "ptr", ffd.Ptr)
If hf <> 0 then
While True
sFile = ffd.GetStr(44) # cFileName
nAttr = ffd.GetNum(0, "dword") # dwFileAttributes
If BitAND(nAttr, 16) Then
If Not ((sFile = ".") Or (sFile = "..")) Then
aList.Add(sPath & "\" & sFile)
If nDepth <> 1 Then
ListDirectory(sPath & "\" & sFile, aList, nDepth - 1)
EndIf
EndIf
Else
aList.Add(sPath & "\" & sFile)
Endif
If DllCall("FindNextFileW", "handle", hf, "ptr", ffd.Ptr) = 0 Then Break
Wend
DllCall("FindClose", "handle", hf)
Endif
Free(ffd)
EndFunc |
|
|