Loopback
|
Posted: Mon Sep 29, 2025 20:59 Post subject: |
|
|
В общем идея отдельного интерфейса для получения данных торрента, озвученная в соседней ветке, неожиданно зацепила, даже отвлекся немного от чистки кода Autorun. Не всем это интересно, поэтому ссылка и технические подробности под катом. Никаких других изменений относительно последнего релиза нет.
 Hidden text
Тестовая версия от 30.09.2025
Интерфейс очень похож на интерфейс MediaInfo, что позволяет не использовать буфер и не задумываться о размере получаемых данных. Позволяет получить любую информацию о торренте, которую можно получить через wdx + файлы + все трекеры/вебсиды и т. д. В наборе 4 функции, соглашение по вызову stdcall.
| Code: | HANDLE TorrentOpen(LPCWSTR FileName) |
Открывает, парсит файл торрента и подготавливает данные. В случае успеха возвращает хэндл объекта, в случае критической ошибки - 0. Если ошибка не совсем критическая, то позднее можно получить текст ошибки с TorrentGet.
| Code: | LPWSTR TorrentGet(HANDLE Handle, LPCWSTR InfoType, int Index) |
Параметр InfoType может быть одной из строк:
| Code: | Name
TotalSize
FileCount
BlockSize
BlockCount
Created
Creator
Hash
Comment
Encoding
Webseed
Multifile
PrivateTorrent
Publisher
PublisherURL
Tracker
File
FileSize
CustomField |
Некоторые типы информации могут иметь несколько значений, для их получения используется параметр Index. Отсчёт начинается с 0.
В случае успеха функция вернёт полученное значение, в случае ошибки (неправильный handle или имя поля) - NULL.
| Code: | UINT TorrentCountGet(HANDLE Handle, LPCWSTR InfoType) |
Параметр InfoType аналогичен TorrentGet. Функция возвращает число значений данного поля. Для фиксированных полей результат всегда 1. Если поле с таким именем не существует - 0.
| Code: | void TorrentClose(HANDLE Handle)
|
Освобождает память объекта.
Пример получения данных на Autorun, вывод в DebugView:
| Code: |
Func TorrentInfo(sFile)
Static aFixed = List('Name', 'TotalSize', 'FileCount', 'BlockSize', 'BlockCount', _
'Created', 'Creator', 'Hash', 'Comment', 'Encoding', _
'Multifile', 'PrivateTorrent', 'Publisher', 'PublisherURL')
Static aMulti = List('Tracker', 'Webseed', 'Error', 'CustomField')
Static sLibName = "TCTorrent.wlx" & (auX64 ? "64" : "")
# Необходимо поменять путь на свой!
Static sLibPath = %COMMANDER_PATH & "\Plugins\wlx\TCTorrent\" & sLibName
Local hDll = DllCall("LoadLibrary", "wstr", sLibPath, "handle")
If hDll = 0 Then Return
Local hHandle = DllCall(sLibName & "\TorrentOpen", "wstr", sFile, "handle")
If hHandle = 0 Then
DllCall("FreeLibrary", "handle", hDll)
Return
EndIf
Local nCount, sRes
For i = 0 to aFixed.Count - 1
sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", aFixed[i], "int", 0, "wstr")
OutputDebugString(aFixed[i] & ": " & sRes)
Next
OutputDebugString(auCRLF & 'Files:')
nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", "File", "uint")
For j = 0 To nCount - 1
sRes = StrFormat("[%12s] %s", _
DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr"), _
DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "File", "int", j, "wstr"))
OutputDebugString(sRes)
Next
For i = 0 to aMulti.Count - 1
OutputDebugString(auCRLF & aMulti[i] & 's:')
nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", aMulti[i], "uint")
For j = 0 To nCount - 1
sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", aMulti[i], "int", j, "wstr")
OutputDebugString(sRes)
Next
Next
DllCall(sLibName & "\TorrentClose", "handle", hHandle)
DllCall("FreeLibrary", "handle", hDll)
EndFunc
|
Last edited by Loopback on Tue Sep 30, 2025 22:01; edited 1 time in total |
|