Было бы здорово, но вряд лиyozhik писал(а):Такое ощущение, что мой конфиг стал быстрее обрабатываться.
Autorun
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
Спасибо. Поиск работает.Orion9 писал(а):С тем функционалом, который сечас есть в Autorun, это реально. Loopback, конечно, в подробностях знает формат торрент-файлов, но если исходить из самого простого, то можно просто проверять размер содержимого (каталога или файла) торрент-файла и сверять его с тем, что есть на диске. Результат будет с большой долей вероятности точным, т.к. количество байт у крупных объемов данных вряд ли может повториться. Недостаток такого подхода лишь один: не полностью скаченные раздачи (несколько серий сезона, несколько песен альбома и т.д) таким способом найтись не смогут, т.к. реальный объем данных не совпадает с заявленным. Возможен и обратный случай, когда в каталог полностью скаченной раздачи случайно попадают лищние файлы. Такие каталоги тоже не будут находиться, но в остальных случаях проблем не должно быть. Одиночные файлы будут находиться даже переименованными, ровно как и папки.A55555 писал(а):И если можно будет и это реально
[cut][/cut]Код: Выделить всё
RegisterCommand 70500 TorrentFindData Global gTorrentSize = 0, gTorrentCount = 0, gDriveInclude = "e:\;f:\;g:\;h:\;i:\;j:" Global h_WinFindTorr = 0 Global g_WinFindTorr = 0, g_FindTorrTask = 0 Global o_WinFindTorr = Callback("WinFindTorrProc", "hwnd;uint;wparam;lparam") Func WinFindTorrProc(hWnd, uMsg, wParam, lParam) Static WM_CLOSE = 0x0010 If uMsg = WM_CLOSE Then If DllCall("DestroyWindow", "handle", hWnd) Then h_WinFindTorr = 0 g_FindTorrTask = 0 EndIf Return 0 EndIf Return DllCall("CallWindowProcW", "ptr", g_WinFindTorr, _ "hwnd", hWnd, "uint", uMsg, "wparam", wParam, "lparam", lParam) EndFunc Func WinFindTorrentData() Local hIco h_WinFindTorr = DllCall("CreateWindowExW", _ "dword", 0, _ "wstr", "msctls_progress32", _ "wstr", "", _ "dword", 0x00C80000, _ "int", 200, "int", 100, "int", Scale(400), "int", Scale(50), _ "handle", AUTORUN_TCHANDLE, _ "handle", 0, "handle", 0, "ptr", 0, _ "handle") If h_WinFindTorr = 0 Then Return 0 WinAlign(h_WinFindTorr, 0, DllCall("GetDesktopWindow")) WinSetPos("", -Scale(50), "", "", 1, h_WinFindTorr) WinSetState(5, h_WinFindTorr) g_WinFindTorr = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _ "hwnd", h_WinFindTorr, _ "int", -4, _ "long_ptr", o_WinFindTorr.Ptr, _ "ptr") hIco = SendMessage(AUTORUN_TCHANDLE, 0x7f, 2, 0) SendMessage(h_WinFindTorr, 0x80, 0, hIco) WinSetStyle(PBS_MARQUEE, 2, h_WinFindTorr) SendMessage(h_WinFindTorr, PBM_SETMARQUEE, 1, 0) WinSetText("Searching...", h_WinFindTorr) g_FindTorrTask = 1 While g_FindTorrTask Sleep(50) Wend h_WinFindTorr = 0 EndFunc Func TorrentFindData() If h_WinFindTorr Then SendMessage(h_WinFindTorr, 0x0010, 0, 0) g_FindTorrTask = 0 Return Endif Static buf = Buffer(256) buf.Zero() Local nSymb = DllCall("GetLogicalDriveStringsW", "dword", buf.size, "ptr", buf.ptr) If Not nSymb Then MsgBox("Не удалось получить список логических дисков" & auCRLF "SYSERROR: " & SYSERROR, "Autorun") Return EndIf Local aDrive = list(), i = 0, sz, sDrives While 1 sDrive = buf.GetStr(i) sz = StrLen(sDrive) if sz = 0 THEN break aDrive.add(sDrive) i = i + sz*2 + 2 Wend sDrives = aDrive.text #MsgBox(sDrives) Local obj = Plugin("TCTorrent") If ERROR <> 0 Then ShowHint("TCTorrent.wdx plugin error " & ERROR) Return Endif Local lRet = false Local sPath = RequestCopyDataInfo("SP") Local sName = RequestCopyDataInfo("SN") Local sFile = sPath & sName If Not FileExist(sFile) Then ShowHint("Файл не существует " & sFile) lRet = true ElseIf StrPos(FileGetAttr(sFile), "D") Then ShowHint("Каталог " & sFile) lRet = true Else obj.FileName = sFile Local name = obj.GetValue(0) Local size = obj.GetValue(2,0) # size -> bytes Local files = obj.GetValue(1) If files < 1 Then ShowHint("Файл не является торрент-файлом " & sFile) lRet = true EndIf Endif Free(obj) If lRet Then Return IniRead gDriveInclude %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude" MsgBox("Поиск данных торрента:" & auCRLF & auCRLF & _ "Имя: " & name & auCRLF & _ "Размер: " & size & auCRLF & _ "Файлов: " & files & auCRLF & auCRLF & _ "Диски поиска: " & gDriveInclude & auCRLF & auCRLF & _ "Продолжить?", "Autorun", 3+32+0) If EXTENDED <> 6 Then Return gTorrentSize = size h_WinFindTorr = 0 gTorrentCount = 0 RunThread "WinFindTorrentData" While g_FindTorrTask = 0 Sleep(50) Wend Local found For i = 0 to aDrive.Count -1 If StrPos(gDriveInclude, aDrive[i]) Then If files > 1 Then found &= FileFind(aDrive[i], "*.*", 1, 2, "PathList", "Func:FindTorrentDir") & auCRLF Else found &= FileFind(aDrive[i], "*.*", 1, 1, "PathList", "Func:FindTorrentFile") & auCRLF EndIf Endif Next If g_FindTorrTask = 0 Then MsgBox("Поиск данных отменен" & auCRLF & auCRLF & _ "Найдено: " & gTorrentCount & auCRLF & found, "", 48) Else g_FindTorrTask = 0 SendMessage(h_WinFindTorr, 0x0010, 0, 0) If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0 MsgBox("Найдено: " & gTorrentCount & auCRLF & found, "", 64) EndIf EndFunc Func FindTorrentFile(file) Static T1 = GetUptime() If Not g_FindTorrTask Then Return 0 If Round(GetUptime() - T1, 0) > 200 Then WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr) T1 = GetUptime() Sleep(5) EndIf If file.size = gTorrentSize Then gTorrentCount += 1 Return 1 EndIf Return 2 EndFunc Func FindTorrentDir(file) Static T2 = GetUptime() If Not g_FindTorrTask Then Return 0 If Round(GetUptime() - T2, 0) > 200 Then WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr) T2 = GetUptime() Sleep(5) EndIf Local sz = FileFind(file.FullPath, "*.*", 1, 0, "TotalSize") If sz = gTorrentSize Then gTorrentCount += 1 Return 1 EndIf Return 2 EndFunc
[cut][/cut]Код: Выделить всё
TOTALCMD#BAR#DATA 70500 %COMMANDER_EXE% Команда 70500 -1
В wincmd.ini сохраняется ключ:Здесь можно указать на каких дисках искать. Желательно исключить диски с каталогом Windows, до тех пор, пока не будет сделано под Everything, иначе будут заметные торомоза.Код: Выделить всё
[Autorun] TorrentDrives=e:\;f:\;g:\;i:\;j:\
В общем, это пока только тестовая версия, могут быть косяки и недочеты, но в целом работает.
Для случая "папка Blu-Ray диска" находит как два объекта.
[cut]
[/cut]Такое поведение в случае, если папка BDMV одна внутри главной папки
Код: Выделить всё
E:\Torrent\Страна садов 2004 [GARDEN_STATE_2004_BDREMUX_HDCLUB]\BDMV\[cut]
[/cut]Для просто файл всё нормально
[cut]
[/cut]Но только это сообщение, на противоположной панели TC ничего не происходит, перехода к этой папке/файлу.
Код: Выделить всё
Страна садов 2004 [GARDEN_STATE_2004_BDREMUX_HDCLUB]\BDMV\A55555
Функционал будет развиваться со временем, всего сразу не сделаешь. Над новыми фишками надо будет еще подумать. Пока этот только тестовая версия, но она рабочая, что радует. Пути из окна сообщения в данный момент можно просто копировать по CTRL+C и вставлять в заголовок панели для перехода. Надеюсь, эта кнопка поможет вам найти все данные и поставить их на раздачу )
Функционал будет развиваться со временем, всего сразу не сделаешь. Над новыми фишками надо будет еще подумать. Пока этот только тестовая версия, но она рабочая, что радует. Пути из окна сообщения в данный момент можно просто копировать по CTRL+C и вставлять в заголовок панели для перехода. Надеюсь, эта кнопка поможет вам найти все данные и поставить их на раздачу )
Нет, не планировал, в WinAPI нет такого понятия, как переименование ключа. Кажется, ни в одном скриптовом языке такого не встречал. Это в любом случае будет три операции, IniRead+IniWrite+IniDelete:AkulaBig писал(а):Есть-ли такое в планах?
Код: Выделить всё
Func IniRenameKey(ini, section, key, newkey)
Local value = IniRead(ini, section, key, "<nokey>")
If value = "<nokey>" Then Return
IniWrite(ini, section, newkey, value)
IniDelete(ini, section, key)
EndFuncLoopback
Я с этим уже наловчился:
Порядок прекрасно сохраняется. Хотя он мне совершенно не важен.
Я с этим уже наловчился:
Код: Выделить всё
Local DriveLibBak = IniRead(COMMANDER_INI, "Configuration", "DriveLib.bak", "")
If DriveLibBak <> "" Then
Local WinCmdIni = List()
WinCmdIni.LoadFromFile(COMMANDER_INI)
For i = 0 to WinCmdIni.Count-1
If StrPos(WinCmdIni[i], "DriveLib.bak") > 0 Then
WinCmdIni[i] = 'DriveLib=' & DriveLibBak
Endif
Next
WinCmdIni.SaveToFile(COMMANDER_INI, "UTF-16")
Free(WinCmdIni)
EndIf
Спасибо, буду ждать.Orion9 писал(а):A55555
Функционал будет развиваться со временем, всего сразу не сделаешь. Над новыми фишками надо будет еще подумать. Пока этот только тестовая версия, но она рабочая, что радует. Пути из окна сообщения в данный момент можно просто копировать по CTRL+C и вставлять в заголовок панели для перехода. Надеюсь, эта кнопка поможет вам найти все данные и поставить их на раздачу )
Копируется по CTRL+C вообще всё что есть в окне сообщения, не только путь , чтоб сразу вставить в заголовок TC, пока так задумано я понимаю.
A55555
Ждать пришлось не долго, удачно сошлись звезды )
Улучшенная и доработанная версия функционала:
[cut="Torrent.aucfg"][/cut]
Теперь все, что касается торрент-файлов вынесено в отдельный модуль. Подключение к основной конфигурации стандартное, т.е. через строку:
После подключения можно раскомментировать "#Pragma IncludeOnce", но это не обязательно. A55555, можете не подключать как отдельный модуль, но удалите весь старый код, связанный с торрентами, включая функцию подсчета. Важно отметить, что я заменил номер функции "TorrentSize" на 70505 (раньше это был 62014). Соответственно, номер в кнопке тоже придется заменить на новый.
Код использует две дополнительные функции от Loopback для масштабирования окна:
Если эти функции ранее не использовались, необходимо их добавить. Желательно сделать отдельный модуль для хранения этих и других универсальных функций.
Что касается функционала. Добавлена поддержка поиска через утилиту "Everything", теперь поиск происходит мгновенно. Реализовано отдельной кнопкой. Для работы необходимо в настройках утилиты указать, чтобы она индексировала размеры файлов и папок (Сервис->Настройки->Индексирование). Ищет по всем индексированным дискам.
Добавлена возможность сохранения найденных путей в текстовый файл и перехода к найденным данным при нажатии "Нет" в окне результата. Текстовый файл сохраняется с тем же именем, что и торрент-файл рядом с ним. Если стоя на этом текстовом файле выполнить команду с кодои 70501, то первый в этом файле путь откроется в противоположной панели. Для ускорения работы можно создать em_команды и посадить и на горячии клавиши:
Также добавлена возможность редактирования дисков при вызове кнопки 70500 с SHIFT. Ключ сохраняется в wincmd.ini:
Пока это только костыль, но уже удобнее.
В общем, потестируйте пока, а там видно будет где и что улучшить.
Ждать пришлось не долго, удачно сошлись звезды )
Улучшенная и доработанная версия функционала:
[cut="Torrent.aucfg"]
Код: Выделить всё
#Pragma IncludeOnce
# 70500-70599
RegisterCommand 70500 "TorrentFindData" 0
RegisterCommand 70501 "TorrentFindData" 1
RegisterCommand 70502 "GoToPathFromTextFile"
RegisterCommand 70505 "TorrentSize"
Global gTorrentSize = 0, gTorrentCount = 0, gDriveInclude = "e:\;f:\;g:\;h:\;i:\;j:\"
Global h_WinFindTorr = 0
Global g_WinFindTorr = 0, g_FindTorrTask = 0
Global o_WinFindTorr = Callback("WinFindTorrProc", "hwnd;uint;wparam;lparam")
Func WinFindTorrProc(hWnd, uMsg, wParam, lParam)
Static WM_CLOSE = 0x0010
If uMsg = WM_CLOSE Then
If DllCall("DestroyWindow", "handle", hWnd) Then
h_WinFindTorr = 0
g_FindTorrTask = 0
EndIf
Return 0
EndIf
Return DllCall("CallWindowProcW", "ptr", g_WinFindTorr, _
"hwnd", hWnd, "uint", uMsg, "wparam", wParam, "lparam", lParam)
EndFunc
Func WinFindTorrentData()
Local hIco
h_WinFindTorr = DllCall("CreateWindowExW", _
"dword", 0, _
"wstr", "msctls_progress32", _
"wstr", "", _
"dword", 0x00C80000, _
"int", 200, "int", 100, "int", Scale(400), "int", Scale(50), _
"handle", AUTORUN_TCHANDLE, _
"handle", 0, "handle", 0, "ptr", 0, "handle")
If h_WinFindTorr = 0 Then Return 0
WinAlign(h_WinFindTorr, 0, DllCall("GetDesktopWindow"))
WinSetPos("", -Scale(50), "", "", 1, h_WinFindTorr)
WinSetState(5, h_WinFindTorr)
g_WinFindTorr = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
"hwnd", h_WinFindTorr, _
"int", -4, _
"long_ptr", o_WinFindTorr.Ptr, "ptr")
Static PBS_MARQUEE = 0x08, _
PBM_SETMARQUEE = 1034, _
WM_GETICON = 0x7f, _
WM_SETICON = 0x80
hIco = SendMessage(AUTORUN_TCHANDLE, WM_GETICON, 2, 0)
SendMessage(h_WinFindTorr, WM_SETICON, 0, hIco)
WinSetStyle(PBS_MARQUEE, 2, h_WinFindTorr)
SendMessage(h_WinFindTorr, PBM_SETMARQUEE, 1, 0)
WinSetText("Searching...", h_WinFindTorr)
g_FindTorrTask = 1
While g_FindTorrTask
Sleep(50)
Wend
h_WinFindTorr = 0
EndFunc
Func TorrentFindData(lParam, nMode)
If IsPressed(0x10) And Not nMode Then
SetTorrentDrives()
Return
EndIf
Local bEverything = nMode
If h_WinFindTorr Then
SendMessage(h_WinFindTorr, 0x0010, 0, 0)
g_FindTorrTask = 0
Return
Endif
Static buf = Buffer(256)
buf.Zero()
Local nSymb = DllCall("GetLogicalDriveStringsW", "dword", buf.size, "ptr", buf.ptr)
If Not nSymb Then
MsgBox("Не удалось получить список логических дисков" & auCRLF "SYSERROR: " & SYSERROR, "Autorun")
Return
EndIf
Static aDrive = list(), aFound = List()
Local i = 0, sz, sDrives
aDrive.Count = 0
While 1
sDrive = buf.GetStr(i)
sz = StrLen(sDrive)
If sz = 0 Then break
aDrive.add(sDrive)
i = i + sz*2 + 2
Wend
sDrives = aDrive.text
#MsgBox(sDrives)
Local obj = Plugin("TCTorrent")
If ERROR <> 0 Then
ShowHint("TCTorrent.wdx plugin error " & ERROR)
Return
Endif
Local lRet = false
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
lRet = true
ElseIf StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Каталог " & sFile)
lRet = true
Else
obj.FileName = sFile
Local name = obj.GetValue(0)
Local size = obj.GetValue(2,0) # size -> bytes
Local files = obj.GetValue(1)
If files < 1 Then
ShowHint("Файл не является торрент-файлом " & sFile)
lRet = true
EndIf
Endif
Free(obj)
If lRet Then Return
IniRead gDriveInclude %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
MsgBox("Поиск данных торрента:" & auCRLF & auCRLF & _
"Имя: " & name & auCRLF & _
"Размер: " & size & auCRLF & _
"Файлов: " & files & auCRLF & auCRLF & _
"Диски поиска: " & gDriveInclude & auCRLF & auCRLF & _
"Продолжить?", "Autorun", 3+32+0)
If EXTENDED <> 6 Then Return
aFound.Count = 0
gTorrentSize = size
h_WinFindTorr = 0
gTorrentCount = 0
RunThread "WinFindTorrentData"
While g_FindTorrTask = 0
Sleep(50)
Wend
Local found
If bEverything Then
found = FileFindEv("size:" & gTorrentSize, "", "")
Local nError = ERROR
If nError = 1 Then MsgBox("Не найдено окно Everything.")
If nError = 2 Then MsgBox("Ошибка выполнения запроса к IPC Everything.")
If nError > 0 Then
g_FindTorrTask = 0
Return
EndIf
Else
For i = 0 to aDrive.Count -1
If StrPos(gDriveInclude, aDrive[i]) Then
If files > 1 Then
found &= FileFind(aDrive[i], "*.*", 1, 2, "PathList", "Func:FindTorrentDir") & auCRLF
Else
found &= FileFind(aDrive[i], "*.*", 1, 1, "PathList", "Func:FindTorrentFile") & auCRLF
EndIf
Endif
Next
EndIf
found = StrTrim(found)
aFound.Text = found
If bEverything Then gTorrentCount = aFound.Count
If g_FindTorrTask = 0 Then
If gTorrentCount = 0 Then
MsgBox("Поиск отменен" & auCRLF & auCRLF & _
"Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 48)
Else
MsgBox("Поиск отменен" & auCRLF & auCRLF & _
"Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _
"Сохранить в текстовый файл?", "Autorun", 3+48+0)
If EXTENDED = 2 Then Return
If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
EndIf
Else
g_FindTorrTask = 0
SendMessage(h_WinFindTorr, 0x0010, 0, 0)
If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0
If gTorrentCount = 0 Then
MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 64)
Else
MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _
"Сохранить в текстовый файл?", "Autorun", 3+64+0)
If EXTENDED = 2 Then Return
If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
EndIf
EndIf
EndFunc
Func SaveDataPathToText(Filename, DataPath)
Local file = FileChangeExt(Filename, "txt"), bGoto = false
If FileExist(file) Then
MsgBox("Файл существует" & auCRLF & auCRLF & _
file & auCRLF & auCRLF & "Перезаписать?", "Autorun", 3+32+0)
If EXTENDED <> 6 Then Return
EndIf
FileWrite(file, DataPath)
#MsgBox("Файл сохранен " & auCRLF & auCRLF & file, "Autorun", 64)
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Файл сохранен", 0, 0, 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Sleep(100)
SetHintParam("ShowHint", "Reload")
If bGoto Then
If RequestInfo(1000) = 1 Then
CommandExec /CD %'file'
Else
CommandExec /CD '' %'file'
Endif
Endif
EndFunc
Func GoToPathFromTextFile()
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
Return
ElseIf StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Файл является каталогом " & sFile)
Return
ElseIf FileGetExt(sFile) <> "TXT" Then
ShowHint("Расширение файла не .txt " & sFile)
Return
ElseIf FileGetSize(sFile) > 1024*2 Then
ShowHint("Размер файла больше 2 Кб " & sFile)
Return
EndIf
Local txt = FileRead(sFile)
Local target = StrPart(txt, auCRLF, 1)
If target <> "" Then
GoToPathFromMsg(target)
Else
ShowHint("Пустой путь" & target)
EndIf
EndFunc
Func GoToPathFromMsg(Target)
If FileExist(Target) Then
If RequestInfo(1000) = 2 Then
CommandExec /CD %'Target'
Else
CommandExec /CD '' %'Target'
Endif
SendCommand(4006)
Else
ShowHint("Путь не существует " & Target)
EndIf
EndFunc
Func FindTorrentFile(file)
Static T1 = GetUptime()
If Not g_FindTorrTask Then Return 0
If Round(GetUptime() - T1, 0) > 200 Then
WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
T1 = GetUptime()
Sleep(5)
EndIf
If file.size = gTorrentSize Then
gTorrentCount += 1
Return 1
EndIf
Return 2
EndFunc
Func FindTorrentDir(file)
Static T2 = GetUptime()
If Not g_FindTorrTask Then Return 0
If Round(GetUptime() - T2, 0) > 200 Then
WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
T2 = GetUptime()
Sleep(5)
EndIf
Local sz = FileFind(file.FullPath, "*.*", 1, 0, "TotalSize")
If sz = gTorrentSize Then
gTorrentCount += 1
Return 1
EndIf
Return 2
EndFunc
Func SetTorrentDrives()
Local out, drives, vbs
IniRead drives %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
vbs = '/c ECHO Wscript.Echo Inputbox("Search on these disks:","Autorun","' & drives & '")>%TEMP%\~auto_0001.vbs'
ProcessExecGetOutput out %COMSPEC% %vbs%
ProcessExecGetOutput /OEM out "cscript.exe" "/nologo ~auto_0001.vbs" %TEMP%
out = StrTrim(out)
If out = "" Then Return
IniWrite %COMMANDER_INI% "Autorun" "TorrentDrives" %out%
Sleep(50)
MsgBox("Ключ сохранен.", "Autorun", 64)
EndFunc
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
SetHintParam("ShowHint", "Font", 10, "")
ShowHint("" & sName & auCRLF & _
"Размер: " & SizeFormat(size, 1, 'G', 2, 1) & auCRLF & _
"Файлов: " & files)
Sleep(100)
SetHintParam("ShowHint", "Reload")
Free(aSel)
Return
EndIf
Local tl = Round(GetUptime() - T1, 0) / 1000
SetHintParam("ShowHint", "Font", 10, "")
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")
Sleep(100)
SetHintParam("ShowHint", "Reload")
Free(obj, aSel)
EndFuncТеперь все, что касается торрент-файлов вынесено в отдельный модуль. Подключение к основной конфигурации стандартное, т.е. через строку:
Код: Выделить всё
Pragma Include %COMMANDER_PATH%\Scripts\Torrent.aucfgКод использует две дополнительные функции от Loopback для масштабирования окна:
Код: Выделить всё
Func GetDPI()
Local DC = DllCall("GetDC", "int", 0)
Local lpy = DllCall("GetDeviceCaps", "handle", DC, "int", 88) # LOGPIXELSX
DllCall("ReleaseDC", "int", 0, "handle", DC)
Return lpy
EndFunc
Func Scale(nValue)
Static dpi = GetDPI()
Return DllCall("MulDiv", "int", nValue, "int", dpi, "int", 96)
EndFunc Что касается функционала. Добавлена поддержка поиска через утилиту "Everything", теперь поиск происходит мгновенно. Реализовано отдельной кнопкой. Для работы необходимо в настройках утилиты указать, чтобы она индексировала размеры файлов и папок (Сервис->Настройки->Индексирование). Ищет по всем индексированным дискам.
Добавлена возможность сохранения найденных путей в текстовый файл и перехода к найденным данным при нажатии "Нет" в окне результата. Текстовый файл сохраняется с тем же именем, что и торрент-файл рядом с ним. Если стоя на этом текстовом файле выполнить команду с кодои 70501, то первый в этом файле путь откроется в противоположной панели. Для ускорения работы можно создать em_команды и посадить и на горячии клавиши:
Код: Выделить всё
[em_torrent_data_search]
cmd=70500
[em_torrent_data_goto]
cmd=70501Код: Выделить всё
[Shortcuts]
A+T=em_torrent_data_search
A+P=em_torrent_data_gotoКод: Выделить всё
[Autorun]
TorrentDrives=e:\;f:\;g:\;i:\;j:\Код: Выделить всё
TOTALCMD#BAR#DATA
70500
%COMMANDER_EXE%
Поиск данных торрет-файла|Shift - Выбор дисков
-1
Код: Выделить всё
TOTALCMD#BAR#DATA
70501
%COMMANDER_EXE%
Поиск данных торрет-файла c Everything
-1Код: Выделить всё
TTOTALCMD#BAR#DATA
70502
%COMMANDER_EXE%
Переход к данным из текстового файла
-1Orion9
https://github.com/yozhic/AkelPad-coder ... ucfg.coder
Вроде нескромно с такими поделками, да в калашный ряд. С другой стороны, пущай — «дабы дурь каждого видна была». Ну, и так взаимодействовать легче... А с третьей стороны, может GitHub не такой уж и калашный, а так себе, толкучка ))
https://github.com/yozhic/AkelPad-coder ... ucfg.coder
Вроде нескромно с такими поделками, да в калашный ряд. С другой стороны, пущай — «дабы дурь каждого видна была». Ну, и так взаимодействовать легче... А с третьей стороны, может GitHub не такой уж и калашный, а так себе, толкучка ))
Amo ergo sum
yozhik
Круто. Очень круто. Большое вам спасибо. Теперь все последние изменения заиграли новыми красками, включая довольно старые буферные и оконные функции, чего так не хватало.
Без подсветки - как без рук. Думаю, неплохо на официальную страницу плагина добавить ссылки на хайлатеры Autorun. Иначе где еще пользователь может о них узнать, не проводя собственных исследований.
Круто. Очень круто. Большое вам спасибо. Теперь все последние изменения заиграли новыми красками, включая довольно старые буферные и оконные функции, чего так не хватало.
Без подсветки - как без рук. Думаю, неплохо на официальную страницу плагина добавить ссылки на хайлатеры Autorun. Иначе где еще пользователь может о них узнать, не проводя собственных исследований.
С этим я не знаю куда его, тем не менее всё заработало.Orion9 писал(а):Теперь все, что касается торрент-файлов вынесено в отдельный модуль. Подключение к основной конфигурации стандартное, т.е. через строку:Код: Выделить всё
Pragma Include %COMMANDER_PATH%\Scripts\Torrent.aucfg
Работает, но окно не выходит на передний план при своем появлении.Orion9 писал(а):Также добавлена возможность редактирования дисков при вызове кнопки 70500 с SHIFT. Ключ сохраняется в wincmd.ini:Код: Выделить всё
[Autorun] TorrentDrives=e:\;f:\;g:\;i:\;j:\
[cut]
[/cut]Работает быстро, но получается эта программа всегда должна быть запущена?Orion9 писал(а):Добавлена поддержка поиска через утилиту "Everything", теперь поиск происходит мгновенно. Реализовано отдельной кнопкой. Для работы необходимо в настройках утилиты указать, чтобы она индексировала размеры файлов и папок (Сервис->Настройки->Индексирование). Ищет по всем индексированным дискам.
Иначе пишет, что окно программы Everything не найдено.
Этот момент остался.
При нажатии "НЕТ" в окне с предложением сохранить в TXT, переход на противоположной панели происходить по 2му более длинному пути.Eсли папка BDMV одна внутри главной папки BDRemuxНаходит как два объекта.Код: Выделить всё
E:\Torrent\Страна садов 2004 [GARDEN_STATE_2004_BDREMUX_HDCLUB]\BDMV\
[cut][/cut]
Не полностью скачанные по-прежнему, если я правильно понимаю, ни первым, ни вторым способом не находит.
Если это будет возможно, добавьте пожалуйста вариант поиска в чистом виде, если нашло просто на противоположной панели курсор установлен на найденной папке/файле не заходя в папку без дополнительных сообщений и запросов. (не найдено, сообщение "Ничего не найдено").
Со временем кода становится много и хранить его весь в файле autorun.cfg становится не удобно. Тогда код разделяется на логические блоки и сохраняется в разные файлы. Далее эти файлы подключаются к основой конфигурации директивой Pragma Include с указанием пути к файлу, но вам не стоит пока забивать этим голову.A55555 писал(а):С этим я не знаю куда его, тем не менее всё заработало.
Поэтому я и написал, что это костыль. В Autorun нет легкого способа работать с графическим интерфейсом, поэтому приходится вызывать vbs-скрипт из autorun-скрипта. Попробуйте заменить функцию SetTorrentDrives() на новый блок, должно помочь:A55555 писал(а):Работает, но окно не выходит на передний план при своем появлении.
[cut]
Код: Выделить всё
Global gVbsInputBox
Func SetTorrentDrives()
Local out, drives, vbs
IniRead drives %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
vbs = '/c ECHO Wscript.Echo Inputbox("Search on these disks:","Autorun","' & drives & '")>%TEMP%\~auto_0001.vbs'
ProcessExecGetOutput out %COMSPEC% %vbs%
gVbsInputBox = 1
RunThread("WinVbsInputBoxActivate")
ProcessExecGetOutput /OEM out "cscript.exe" "/nologo ~auto_0001.vbs" %TEMP%
gVbsInputBox = 0
out = StrTrim(out)
If out = "" Then Return
IniWrite %COMMANDER_INI% "Autorun" "TorrentDrives" %out%
Sleep(50)
MsgBox("Ключ сохранен.", "Autorun", 64)
EndFunc
Func WinVbsInputBoxActivate()
Local hVbs
While gVbsInputBox
hVbs = WinFind(0, "#32770", "Autorun")
If hVbs > 0 Then
WinSetState(23, hVbs)
Break
EndIf
Sleep(50)
Wend
EndFunc
Получается, так. Можно запускать Everything только на время поиска торрент-данных, если вы не пользуетесь этой утилитой, но поиск без Everything тоже быстро работает, особенно если не искать на разделах, где стоит операционная система.A55555 писал(а):Работает быстро, но получается эта программа всегда должна быть запущена?
Я пока не решил, что с этим делать. На мой взгляд, неправильно скрывать избыточную вложенность каталогов. Вы сами, например, по неосторожности можете поместить раздачу в пустой каталог или раздающие могут допустить эту оплошность. Нельзя с уверенностью сказать, какой уровень вложенности считается легитимным для конкретного торрент-файла только по его размеру. Отфильтровать, конечно, можно. Но нужен дополнительный алгоритм, хотя стоит ли он того, пока не ясно. В окне сообщения сейчас видно, что это одна раздача. Пользователь только должен принять решение, какой уровень каталога считается правильным для работы в клиенте.A55555 писал(а):Этот момент остался.
На самом деле переход происходит по первому пути, просто этот путь открывается в противоположной панели и становится текущим. Насколько мне известно, в ТС нет специальной команды для выделения каталога в противоположной панели установкой на него фокуса или курсора. Если такая команда есть, то поправьте меня (обращение ко всем).A55555 писал(а):При нажатии "НЕТ" в окне с предложением сохранить в TXT, переход на противоположной панели происходить по 2му более длинному пути.
Да, я об этом писал. Недокаченные раздачи так находиться не будут. Здесь нужен более глубокий анализ содержимого торрент-файла и более продвинутый алгоритм для сверки данных на диске. Сейчас код опирается на плагин TCTorrent (превосходный плагин от Loopback), но wdx-часть плагина не выдает список содержимого торрента, только wlx-часть. Может, автор сделает какой-нибудь недокументированный вызов к библиотеке для получения такого списка? Тогда можно будет подумать. А так, есть еще вариант с консольной утилитой torrentcheck, но тогда с бубном чуть выше прыгать придется.A55555 писал(а):Не полностью скачанные по-прежнему, если я правильно понимаю, ни первым, ни вторым способом не находит.
А если будут дубликаты? Во время я тестов специально копировал данные на несколько дисков, чтобы посмотреть, как они будут находиться. Нельзя полностью скидывать со счетов, что могут найтись дубликаты, а значит, нужно их видеть и знать, что они существуют. Но я понял, что вы имеете в виду. Да, можно сделать для этого отдельный режим, который будет вызываться либо по CTRL, либо отдельной командой. К сожалению, сейчас уже не успеваю это сделать, но взял на заметку для будущих версий.A55555 писал(а):Если это будет возможно, добавьте пожалуйста вариант поиска в чистом виде, если нашло просто на противоположной панели курсор установлен на найденной папке/файле не заходя в папку без дополнительных сообщений и запросов.
Код: Выделить всё
msgbox(Date('yyyy-MM-dd',now() + 864000000000))
wdx_autorun_2.2.20_beta -- 2025-09-19
Orion9Orion9 писал(а):На самом деле переход происходит по первому пути, просто этот путь открывается в противоположной панели и становится текущим. Насколько мне известно, в ТС нет специальной команды для выделения каталога в противоположной панели установкой на него фокуса или курсора. Если такая команда есть, то поправьте меня (обращение ко всем).
Заходит внутрь найденной папки и один шаг вверх по дереву каталога.
Может такая функция есть в TC. Опять же, если даже такой костыль реален, будет ли курсор стоять на этой папке после этого маневра.
Вы абсолютно правы. Почему-то эта мысль не пришла ко мне сразу. Видимо, мысли уже другим заняты. Замените функцию GoToPathFromMsg, тут всего одна строчка добавилась:A55555 писал(а):Заходит внутрь найденной папки и один шаг вверх по дереву каталога.
[cut]
Код: Выделить всё
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Работает действительно лучше. На крайний случай можно опцию потом добавить, переходить или не переходить внутрь каталога.
А теперь жирный бонус. Сделал автопереход к данным при включеном CapsLock. Поменяйте старый фрагмент кода на новый:
[cut="Старый"]
Код: Выделить всё
Else
g_FindTorrTask = 0
SendMessage(h_WinFindTorr, 0x0010, 0, 0)
If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0
If gTorrentCount = 0 Then
MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 64)
Else
MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _
"Сохранить в текстовый файл?", "Autorun", 3+64+0)
If EXTENDED = 2 Then Return
If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
EndIf
EndIf [cut="Новый"]
Код: Выделить всё
Else
g_FindTorrTask = 0
SendMessage(h_WinFindTorr, 0x0010, 0, 0)
If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0
If gTorrentCount = 0 Then
MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 64)
Else
If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) = 0 Then
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Автопереход к найденому", 0, 0, 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Sleep(100)
SetHintParam("ShowHint", "Reload")
GoToPathFromMsg(aFound[0])
Return
EndIf
MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _
"Сохранить в текстовый файл?", "Autorun", 3+64+0)
If EXTENDED = 2 Then Return
If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
EndIf
EndIfТеперь если CapsLock включен, будет автоматический переход. Если выключен, будет прежнее окно с сообщением. Как говорится "Autorun - мечты сбываются". Осталось только кнопки под это дело обновить:
[cut]TOTALCMD#BAR#DATA
70500
%COMMANDER_EXE%
Поиск данных торрент-файла|Shift - Выбор дисков для поиска|CapsLock - Автопереход к найденому
-1[/cut]
[cut]TOTALCMD#BAR#DATA
70501
%COMMANDER_EXE%
Поиск торрент-данных c Everything|CapsLock - Автопереход к найденому
-1[/cut]