You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
8.5 KiB
132 lines
8.5 KiB
9 years ago
|
---
|
||
|
title: Редактирование торрент-файлов
|
||
|
---
|
||
|
|
||
|
Формат торрент-файла можно посмотреть [здесь](https://ru.wikipedia.org/wiki/Bencode)
|
||
|
|
||
|
Содержимое торрент-файла
|
||
|
------------------------
|
||
|
|
||
|
Содержимое торрент-файла кодируется указанным выше образом. Сам торрент-файл представляет собой bencoded словарь со следующими ключами:
|
||
|
|
||
|
* **info**: словарь, описывающий файлы в торренте. Возможно две формы этого словаря, первая для торрента, содержащего только один файл, и вторая -- для многофайлового торрента.
|
||
|
* **announce**: строка с URL'ом трекера.
|
||
|
* **announce-list**: (опционально) список списков, каждый из которых содержит строку с URL'ом трекера.
|
||
|
* **creation date**: (опционально) целое число --- время создания торрента в секундах эпохи UNIX (количество секунд с 00:00:00 01.01.1970).
|
||
|
* **comment**: (опционально) строка с произвольным комментарием.
|
||
|
* **created by**: (опционально) строка с названием и версией создавшей торрент-файл программы.
|
||
|
* **encoding**: (опционально) какая-то строка с непонятным назначением.
|
||
|
|
||
|
В безтрекерном торренте отсутствуют **announce** и **announce-list**, но вместо этого есть элемент **nodes**, представляющий собой список списков, каждый из которых содержит строку с адресом ноды и число -- номер порта. Что-то вроде ``nodes = [ ["<host>", <port>], ["<host>", <port>], ...]``. Простейший вариант -- ``nodes = [ ["127.0.0.1", 6881] ]``.
|
||
|
|
||
|
Словарь info
|
||
|
------------
|
||
|
|
||
|
Параметры, одинаковые для однофайловых и многофайловых торрентов.
|
||
|
|
||
|
* **piece length**: число байтов в куске, обычно степень двойки.
|
||
|
* **pieces**: строка из объединённых 20-байтных SHA1 хэшей кусков.
|
||
|
* **private**: (опционально) число. Если оно равно единице, клиент для поиска пиров должен использовать ТОЛЬКО трекер(ы), указанные в торрент-файле. Если это число равно нулю, клиент может добавлять пиры любыми методами: вручную, через DHT или Peer Exchange и т. д.
|
||
|
|
||
|
Для однофайлового торрента:
|
||
|
|
||
|
* **name**: строка с именем файла.
|
||
|
* **length**: число байт в файле.
|
||
|
* **md5sum**: (опционально) строка MD5 суммы файла. Нахрен никому не нужна.
|
||
|
|
||
|
Для многофайлового торрента:
|
||
|
|
||
|
* **name**: строка с именем директории, куда будут помещаться все файлы.
|
||
|
* **files**: список словарей, по одному для каждого файла. Каждый словарь содержит следующие ключи:
|
||
|
* **length**: число байт в файле.
|
||
|
* **md5sum**: (опционально) строка MD5 суммы файла. Нахрен никому не нужна, как и в предыдущем случае.
|
||
|
* **path**: список из одной или более строк, представляющих вместе путь к файлу. Последняя строка -- имя файла, предыдущие -- последовательность вложенных директорий. Например, путь "dir1/dir2/file.ext" будет представлен в виде списка из трёх строк: "dir1", "dir2", "file.ext".
|
||
|
|
||
|
Чтение и редактирование содержимого
|
||
|
-----------------------------------
|
||
|
|
||
|
Ничего путного для просмотра и редактирования содержимого в инете я не нашёл. Соответственно, пришлось написать самому.
|
||
|
Итак, две программы: torread и torwrite. Они [тут](tor_rw.tar.gz).
|
||
|
|
||
|
torread
|
||
|
-------
|
||
|
|
||
|
Использование: ``torread файл.torrent > файл.txt``
|
||
|
|
||
|
Преобразует торрент-файл к человекочитаемому виду. Словари ограничиваются круглыми скобками (), списки --- квадратными [], строки --- кавычками "", числа --- ничем не ограничиваются. Содержимое словарей пишется в виде пар "ключ" = значение. Внутри строк символы с кодами ``<32` и ``>=127`` представляются в шестнадцатиричном виде ''\x<hex>'', кавычки экранируются слэшем \". Пример конвертированного торрента [отсюда](http://thepiratebay.org/torrent/4947113/Ubuntu):
|
||
|
|
||
|
(
|
||
|
"announce" = "http://tracker.thepiratebay.org/announce"
|
||
|
"announce-list" = [
|
||
|
[
|
||
|
"http://tracker.thepiratebay.org/announce"
|
||
|
]
|
||
|
[
|
||
|
"udp://tracker.thepiratebay.org:80/announce"
|
||
|
]
|
||
|
[
|
||
|
"http://tracker.openbittorrent.com/announce"
|
||
|
]
|
||
|
[
|
||
|
"udp://tracker.openbittorrent.com:80/announce"
|
||
|
]
|
||
|
]
|
||
|
"creation date" = 1244713348
|
||
|
"info" = (
|
||
|
"files" = [
|
||
|
(
|
||
|
"length" = 32
|
||
|
"path" = [
|
||
|
"read.txt"
|
||
|
]
|
||
|
)
|
||
|
(
|
||
|
"length" = 732909568
|
||
|
"path" = [
|
||
|
"ubuntu-9.04-desktop-i386.iso"
|
||
|
]
|
||
|
)
|
||
|
]
|
||
|
"name" = "Ubuntu"
|
||
|
"piece length" = 524288
|
||
|
"pieces" = <скипнуто, ибо зело велико>
|
||
|
)
|
||
|
)
|
||
|
|
||
|
torwrite
|
||
|
--------
|
||
|
|
||
|
Использование: ``torwrite файл.txt > файл.torrent``
|
||
|
|
||
|
Совершает обратную операцию: преобразует текстовый файл в торрент. Понимает в строках помимо ''\x<hex>'', также ''\n'', ''\a'', ''\b'', ''\e'', ''\f'', ''\r'', ''\t'', ''\v'', чтобы это не значило.
|
||
|
|
||
|
Зачем оно надо?
|
||
|
---------------
|
||
|
|
||
|
Я использую это следующим образом.
|
||
|
|
||
|
* Скачиваем торрент.
|
||
|
* Лёгким движением руки убираем **announce** и **announce-list**, вставляем **nodes**.
|
||
|
* ...
|
||
|
* ПРОФИТ
|
||
|
|
||
|
Кто понял, тот молодец.
|
||
|
|
||
|
Перспективы
|
||
|
-----------
|
||
|
|
||
|
К сожалению, редактировать содержимое **info** нельзя, так как для идентификации торрента при взаимодействии с трекером и пирами используется хэш этого словаря. Однако, теоретически, можно ввести в торрент параметр типа **info_hash** и пропатчить клиента, чтобы в качестве идентификатора использовался этот параметр, а не истинный хэш. Это позволило бы менять имена файлов и убирать флаг **private**.
|
||
|
Полезность второго, впрочем, сомнительна, более эффективно пропатчить клиента на предмет игнорирования этого флага.
|
||
|
|
||
|
Дополнение
|
||
|
----------
|
||
|
|
||
|
Первоначальный проект получил продолжение: я написал [конвертер](https://linuxdv.org/git/?p=torrent2json.git;a=summary) "bencode <=> json", ибо нефиг форматы плодить, а **michael_ul** - утилитку [magnetize](https://linuxdv.org/git/?p=magnetize.git;a=summary).
|
||
|
|
||
|
Ссылки
|
||
|
------
|
||
|
|
||
|
* [Обсуждение на форуме](http://linuxdv.org/forum/viewtopic.php?f=4&t=1514)
|
||
|
* [Описание формата торрент-файла и протокола](http://wiki.theory.org/BitTorrentSpecification)
|
||
|
* [Описание DHT](https://ru.wikipedia.org/wiki/DHT)
|