Orion9

|
Posted: Wed May 21, 2025 18:23 Post subject: |
|
|
Доработал функцию подсчёта. Теперь может обрабатывать список выделенного, и ряд других улучшений:
 Hidden text TOTALCMD#BAR#DATA
62013
%COMMANDER_EXE%
Подсчёт времени воспроизведения|Alt - Использовать TCMediaInfo.wdx|Ctrl - Глубина каталога 1|Shift - Вывод информации в отладчик|CapsLock - Отключить фильтр расширений
-1
 Hidden text Code: | RegisterCommand 62013 "Duration"
Global MI_DURATION = 0, MI_BREAK = false
Func Duration(lParam)
If MI_DURATION > 0 Then
MI_BREAK = true
Sleep(250)
Return
EndIf
RunThread DurationInfo
EndFunc
Func DurationInfo()
Local T1 = GetUptime(), T2 = 0
Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10), b_Alt = IsPressed(0x12)
Local b_Caps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
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 _
.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.dll failed to create new object")
Return
Endif
Else
Local obj = Plugin("TCMediaInfo")
If ERROR <> 0 Then
ShowHint("TCMediaInfo.wdx plugin error " & ERROR)
Return
Endif
EndIf
Local s = 0
Local aSel = List()
aSel.Text = GetSelectedItems(3, 0)
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
If aSel.Count = 0 Then
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
Free(aSel)
Return
Endif
EndIf
If aSel.Count = 0 And Not StrPos(FileGetAttr(sFile), "D") Then
Free(aSel)
If b_Alt Then
obj.FileName = sFile
s = obj.GetValue(0) # duration
Free(obj)
Else
If DllCall(sLib & '\MediaInfo_Open', 'ptr', hMI, "wstr", sFile, "uint") <> 1 Then
Return ShowHint("MediaInfo.dll failed to open file " & sFile)
EndIf
s = DllCall(sLib & '\MediaInfo_Get', _
'ptr', hMI, "int", 0, "int", 0, "wstr", "Duration/String3", "int", 1, "int", 0, "wstr")
EndIf
Return ShowHint("Файл: " & sName & auCRLF & "Длительность: " & s)
Endif
ShowHint("Загрузка")
MI_BREAK = false
MI_DURATION = 1
Local i, j, k, dirs = 0, files = 0, errs = 0, item = 0, aFiles = List(), seconds = 0, b_Hint = 0
Local depth = (b_Ctrl ? 1 : 0)
b_Win = false
# загрузка файлов в массив
If aSel.Count > 0 Then
For j = 0 To aSel.Count - 1
sFile = sPath & aSel[j]
If FileExist(sFile) Then
k += 1
aFiles.Add(sFile)
If StrPos(FileGetAttr(sFile), "D") Then ListDirectory(sFile, aFiles, depth)
EndIf
Next
sName = "S/A: " & aSel.Count & "/" & k # Selected / Available
Else
aFiles.Add(sFile)
ListDirectory(sFile, aFiles, depth)
EndIf
Free(aSel)
If aFiles.Count > 1 Then
ShowHint("Depth: " & depth & auCRLF & _
"CapsLock: " & (b_Caps ? "Yes" : "No") & auCRLF & _
(b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"Элементов: " & aFiles.Count & auCRLF & _
"Подсчёт времени...")
EndIf
For i = 0 To aFiles.Count - 1
If b_Win Then OutputDebugString("Duration.File:" & aFiles[i])
If StrPos(FileGetAttr(aFiles[i]), "D") Then
dirs += 1
If b_Shift Then OutputDebugString("Duration.Directory:" & aFiles[i])
Continue
EndIf
item += 1
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 MI_BREAK = true Or (IsPressed (0x11) And IsPressed (0x1B)) Then
ShowHint("Операция прервана")
Sleep(700)
Break
EndIf
If IsPressed(0x11) And IsPressed(0x12) Then
b_Hint += 1
If Round(GetUptime() - T2, 0) > 500 Then
ShowHint( _
(b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"CapsLock: " & (b_Caps ? "Yes" : "No") & auCRLF & _
"Depth: " & depth & auCRLF & _
"File: " & i & " of " & aFiles.Count _
)
T2 = GetUptime()
EndIf
Else
If b_Hint > 0 Then
b_Hint = 0
ShowHint("Depth: " & depth & auCRLF & _
"CapsLock: " & (b_Caps ? "Yes" : "No") & auCRLF & _
(b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"Элементов: " & aFiles.Count & auCRLF & _
"Подсчёт времени...")
EndIf
EndIf
Next
If b_Alt Then Free(obj)
If hMI <> 0 Then DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
MI_BREAK = false
MI_DURATION = 0
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)
Local tl = Round(GetUptime() - T1, 0) / 1000
ShowHint("Имя: " & sName & auCRLF & _
"Каталогов: " & dirs & auCRLF & _
"Элементов: " & aFiles.Count & auCRLF & _
"Обработано: " & files & " из " & item & auCRLF & _
"Ошибки DLL: " & errs & auCRLF & _
"Секунды: " & seconds & auCRLF & _
"Минуты: " & Round(seconds / 60, 2) & auCRLF & _
"Часы: " & Round(seconds / 3600, 2) & auCRLF & _
"Сутки: " & Round(seconds / 86400, 2) & auCRLF & _
"Время: " & Chr(0x2211) & " "& total & auCRLF & _
"Powered by " & (b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"Время операции: " & StrFormat("%.3f", tl) & " sec")
Free(aFiles)
EndFunc
|
Сделал заодно нечто подобное для торрент-файлов, но каталоги в глубину не обрабатываются, работает только с выделенными объектами на панели:
 Hidden text TOTALCMD#BAR#DATA
62014
%COMMANDER_EXE%
Подсчёт размера .torrent файлов
-1
 Hidden text Code: | RegisterCommand 62014 "TorrentSize"
Func TorrentSize(lParam)
Local T1 = GetUptime()
Local obj = Plugin("TCTorrent")
If ERROR <> 0 Then
ShowHint("TCTorrent.wdx plugin error " & ERROR)
Return
Endif
Local size = 0, files = 0
Local aSel = List()
aSel.Text = GetSelectedItems(3, 0)
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
Local lRet = false
If aSel.Count = 0 Then
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
lRet = true
ElseIf StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Каталог " & sFile)
lRet = true
Else
obj.FileName = sFile
files = obj.GetValue(1)
size = obj.GetValue(2,0) # size -> bytes
Free(obj)
Endif
EndIf
If lRet Then
Free(obj, aSel)
Return
EndIf
If aSel.Count > 10 Then
ShowHint("Выделено: " & aSel.Count & auCRLF & "Подсчёт времени...")
EndIf
Local j, k = 0, dirs = 0, torrs = 0
If aSel.Count > 0 Then
For j = 0 To aSel.Count - 1
sFile = sPath & aSel[j]
If FileExist(sFile) Then
k += 1
If Not StrPos(FileGetAttr(sFile), "D") Then
obj.FileName = sFile
s = obj.GetValue(2,0)
If s > 0 Then
size += s
files += obj.GetValue(1)
torrs += 1
Endif
Else
dirs += 1
Endif
EndIf
Next
sName = "S/A: " & aSel.Count & "/" & k # Selected / Available
Else
Return ShowHint("" & sName & auCRLF & _
"Размер: " & SizeFormat(size, 1, 'G', 2, 1) & auCRLF & _
"Файлов: " & files)
EndIf
Local tl = Round(GetUptime() - T1, 0) / 1000
ShowHint((k = aSel.Count ? "" : "Файл " & sName & auCRLF) & _
"Элементов: " & aSel.Count & auCRLF & _
"Обработано: " & torrs & auCRLF & _
"Каталогов: " & dirs & auCRLF & _
"Размер: " & SizeFormat(size, 0, 'M', 2) & auCRLF & _
"Размер: " & SizeFormat(size, 0, 'G', 2) & auCRLF & _
"Размер: " & SizeFormat(size, 0, 'T', 4) & auCRLF & _
"Файлов: " & files & auCRLF & _
"Powered by TCTorrent.wdx" & auCRLF & _
"Время операции: " & StrFormat("%.3f", tl) & " sec")
Free(obj, aSel)
EndFunc |
|
|