Autorun

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

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

Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yozhik писал(а):Такое ощущение, что мой конфиг стал быстрее обрабатываться.
Было бы здорово, но вряд ли :) Не думаю, что произведённые изменения могут дать хоть сколько-нибудь заметное ускорение, пока это в основном изменение структуры кода.
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):
A55555 писал(а):И если можно будет и это реально
С тем функционалом, который сечас есть в Autorun, это реально. Loopback, конечно, в подробностях знает формат торрент-файлов, но если исходить из самого простого, то можно просто проверять размер содержимого (каталога или файла) торрент-файла и сверять его с тем, что есть на диске. Результат будет с большой долей вероятности точным, т.к. количество байт у крупных объемов данных вряд ли может повториться. Недостаток такого подхода лишь один: не полностью скаченные раздачи (несколько серий сезона, несколько песен альбома и т.д) таким способом найтись не смогут, т.к. реальный объем данных не совпадает с заявленным. Возможен и обратный случай, когда в каталог полностью скаченной раздачи случайно попадают лищние файлы. Такие каталоги тоже не будут находиться, но в остальных случаях проблем не должно быть. Одиночные файлы будут находиться даже переименованными, ровно как и папки.
[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
[/cut]
В wincmd.ini сохраняется ключ:

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

[Autorun]
TorrentDrives=e:\;f:\;g:\;i:\;j:\
Здесь можно указать на каких дисках искать. Желательно исключить диски с каталогом Windows, до тех пор, пока не будет сделано под Everything, иначе будут заметные торомоза.
В общем, это пока только тестовая версия, могут быть косяки и недочеты, но в целом работает.
Спасибо. Поиск работает.
Для случая "папка Blu-Ray диска" находит как два объекта.
[cut]Изображение[/cut]
Такое поведение в случае, если папка BDMV одна внутри главной папки

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

E:\Torrent\Страна садов 2004 [GARDEN_STATE_2004_BDREMUX_HDCLUB]\BDMV\
Если рядом с ней есть ещё папки, типа ANY и CERTIFICATE то всё нормально, находит 1 объект.
[cut]Изображение[/cut]

Для просто файл всё нормально
[cut]Изображение[/cut]
Но только это сообщение, на противоположной панели TC ничего не происходит, перехода к этой папке/файлу.

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

Страна садов 2004 [GARDEN_STATE_2004_BDREMUX_HDCLUB]\BDMV\
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555
Функционал будет развиваться со временем, всего сразу не сделаешь. Над новыми фишками надо будет еще подумать. Пока этот только тестовая версия, но она рабочая, что радует. Пути из окна сообщения в данный момент можно просто копировать по CTRL+C и вставлять в заголовок панели для перехода. Надеюсь, эта кнопка поможет вам найти все данные и поставить их на раздачу )
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Loopback
Почему-то я считал, что для работы с инишниками у нас полный набор инструментов. А оказывается переименование ключа нет. Конечно через List() я уже умею править инишники. Но хотелось-бы иметь прямой инструмент IniRenameKey. Есть-ли такое в планах?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

AkulaBig писал(а):Есть-ли такое в планах?
Нет, не планировал, в WinAPI нет такого понятия, как переименование ключа. Кажется, ни в одном скриптовом языке такого не встречал. Это в любом случае будет три операции, IniRead+IniWrite+IniDelete:

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

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)
EndFunc
Если цель сохранить порядок ключей, то WinAPI функции это сделать не позволяют. В принципе, и IniRenameSection лишняя, по сути это тоже три последовательных операции, и тоже не сохраняет порядок.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Loopback
Я с этим уже наловчился:

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

	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
Порядок прекрасно сохраняется. Хотя он мне совершенно не важен.
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):A55555
Функционал будет развиваться со временем, всего сразу не сделаешь. Над новыми фишками надо будет еще подумать. Пока этот только тестовая версия, но она рабочая, что радует. Пути из окна сообщения в данный момент можно просто копировать по CTRL+C и вставлять в заголовок панели для перехода. Надеюсь, эта кнопка поможет вам найти все данные и поставить их на раздачу )
Спасибо, буду ждать.

Копируется по CTRL+C вообще всё что есть в окне сообщения, не только путь , чтоб сразу вставить в заголовок TC, пока так задумано я понимаю.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555
Ждать пришлось не долго, удачно сошлись звезды )

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

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

Pragma Include %COMMANDER_PATH%\Scripts\Torrent.aucfg
После подключения можно раскомментировать "#Pragma IncludeOnce", но это не обязательно. A55555, можете не подключать как отдельный модуль, но удалите весь старый код, связанный с торрентами, включая функцию подсчета. Важно отметить, что я заменил номер функции "TorrentSize" на 70505 (раньше это был 62014). Соответственно, номер в кнопке тоже придется заменить на новый.

Код использует две дополнительные функции от 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
Также добавлена возможность редактирования дисков при вызове кнопки 70500 с SHIFT. Ключ сохраняется в wincmd.ini:

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

[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%
Переход к данным  из текстового файла


-1
В общем, потестируйте пока, а там видно будет где и что улучшить.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Orion9
https://github.com/yozhic/AkelPad-coder ... ucfg.coder
Вроде нескромно с такими поделками, да в калашный ряд. С другой стороны, пущай — «дабы дурь каждого видна была». Ну, и так взаимодействовать легче... А с третьей стороны, может GitHub не такой уж и калашный, а так себе, толкучка ))
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Круто. Очень круто. Большое вам спасибо. Теперь все последние изменения заиграли новыми красками, включая довольно старые буферные и оконные функции, чего так не хватало.

Без подсветки - как без рук. Думаю, неплохо на официальную страницу плагина добавить ссылки на хайлатеры Autorun. Иначе где еще пользователь может о них узнать, не проводя собственных исследований.
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

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 не найдено.

Этот момент остался.
Eсли папка BDMV одна внутри главной папки BDRemux

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

    E:\Torrent\Страна садов 2004 [GARDEN_STATE_2004_BDREMUX_HDCLUB]\BDMV\
Находит как два объекта.
[cut]Изображение[/cut]
При нажатии "НЕТ" в окне с предложением сохранить в TXT, переход на противоположной панели происходить по 2му более длинному пути.



Не полностью скачанные по-прежнему, если я правильно понимаю, ни первым, ни вторым способом не находит.

Если это будет возможно, добавьте пожалуйста вариант поиска в чистом виде, если нашло просто на противоположной панели курсор установлен на найденной папке/файле не заходя в папку без дополнительных сообщений и запросов. (не найдено, сообщение "Ничего не найдено").
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):С этим я не знаю куда его, тем не менее всё заработало.
Со временем кода становится много и хранить его весь в файле autorun.cfg становится не удобно. Тогда код разделяется на логические блоки и сохраняется в разные файлы. Далее эти файлы подключаются к основой конфигурации директивой Pragma Include с указанием пути к файлу, но вам не стоит пока забивать этим голову.
A55555 писал(а):Работает, но окно не выходит на передний план при своем появлении.
Поэтому я и написал, что это костыль. В Autorun нет легкого способа работать с графическим интерфейсом, поэтому приходится вызывать vbs-скрипт из autorun-скрипта. Попробуйте заменить функцию SetTorrentDrives() на новый блок, должно помочь:
[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
[/cut]
A55555 писал(а):Работает быстро, но получается эта программа всегда должна быть запущена?
Получается, так. Можно запускать Everything только на время поиска торрент-данных, если вы не пользуетесь этой утилитой, но поиск без Everything тоже быстро работает, особенно если не искать на разделах, где стоит операционная система.
A55555 писал(а):Этот момент остался.
Я пока не решил, что с этим делать. На мой взгляд, неправильно скрывать избыточную вложенность каталогов. Вы сами, например, по неосторожности можете поместить раздачу в пустой каталог или раздающие могут допустить эту оплошность. Нельзя с уверенностью сказать, какой уровень вложенности считается легитимным для конкретного торрент-файла только по его размеру. Отфильтровать, конечно, можно. Но нужен дополнительный алгоритм, хотя стоит ли он того, пока не ясно. В окне сообщения сейчас видно, что это одна раздача. Пользователь только должен принять решение, какой уровень каталога считается правильным для работы в клиенте.
A55555 писал(а):При нажатии "НЕТ" в окне с предложением сохранить в TXT, переход на противоположной панели происходить по 2му более длинному пути.
На самом деле переход происходит по первому пути, просто этот путь открывается в противоположной панели и становится текущим. Насколько мне известно, в ТС нет специальной команды для выделения каталога в противоположной панели установкой на него фокуса или курсора. Если такая команда есть, то поправьте меня (обращение ко всем).
A55555 писал(а):Не полностью скачанные по-прежнему, если я правильно понимаю, ни первым, ни вторым способом не находит.
Да, я об этом писал. Недокаченные раздачи так находиться не будут. Здесь нужен более глубокий анализ содержимого торрент-файла и более продвинутый алгоритм для сверки данных на диске. Сейчас код опирается на плагин TCTorrent (превосходный плагин от Loopback), но wdx-часть плагина не выдает список содержимого торрента, только wlx-часть. Может, автор сделает какой-нибудь недокументированный вызов к библиотеке для получения такого списка? Тогда можно будет подумать. А так, есть еще вариант с консольной утилитой torrentcheck, но тогда с бубном чуть выше прыгать придется.
A55555 писал(а):Если это будет возможно, добавьте пожалуйста вариант поиска в чистом виде, если нашло просто на противоположной панели курсор установлен на найденной папке/файле не заходя в папку без дополнительных сообщений и запросов.
А если будут дубликаты? Во время я тестов специально копировал данные на несколько дисков, чтобы посмотреть, как они будут находиться. Нельзя полностью скидывать со счетов, что могут найтись дубликаты, а значит, нужно их видеть и знать, что они существуют. Но я понял, что вы имеете в виду. Да, можно сделать для этого отдельный режим, который будет вызываться либо по CTRL, либо отдельной командой. К сожалению, сейчас уже не успеваю это сделать, но взял на заметку для будущих версий.
yahuu
Сообщения: 40
Зарегистрирован: Чт июн 22, 2023 07:32

Сообщение yahuu »

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

msgbox(Date('yyyy-MM-dd',now() + 864000000000))
wdx_autorun_2.2.19_beta -- 2025-09-20
wdx_autorun_2.2.20_beta -- 2025-09-19
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):На самом деле переход происходит по первому пути, просто этот путь открывается в противоположной панели и становится текущим. Насколько мне известно, в ТС нет специальной команды для выделения каталога в противоположной панели установкой на него фокуса или курсора. Если такая команда есть, то поправьте меня (обращение ко всем).
Orion9
Заходит внутрь найденной папки и один шаг вверх по дереву каталога.
Может такая функция есть в TC. Опять же, если даже такой костыль реален, будет ли курсор стоять на этой папке после этого маневра.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):Заходит внутрь найденной папки и один шаг вверх по дереву каталога.
Вы абсолютно правы. Почему-то эта мысль не пришла ко мне сразу. Видимо, мысли уже другим заняты. Замените функцию GoToPathFromMsg, тут всего одна строчка добавилась:
[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
[/cut]
Работает действительно лучше. На крайний случай можно опцию потом добавить, переходить или не переходить внутрь каталога.

А теперь жирный бонус. Сделал автопереход к данным при включеном 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]
[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
[/cut]
Теперь если 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]
Ответить