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.

8.5 KiB

title
Редактирование торрент-файлов

Формат торрент-файла можно посмотреть здесь

Содержимое торрент-файла

Содержимое торрент-файла кодируется указанным выше образом. Сам торрент-файл представляет собой 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. Они тут.

torread

Использование: torread файл.torrent > файл.txt

Преобразует торрент-файл к человекочитаемому виду. Словари ограничиваются круглыми скобками (), списки --- квадратными [], строки --- кавычками "", числа --- ничем не ограничиваются. Содержимое словарей пишется в виде пар "ключ" = значение. Внутри строк символы с кодами <32` и >=127`` представляются в шестнадцатиричном виде ''\x'', кавычки экранируются слэшем ". Пример конвертированного торрента отсюда:

(
 "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'', также ''\n'', ''\a'', ''\b'', ''\e'', ''\f'', ''\r'', ''\t'', ''\v'', чтобы это не значило.

Зачем оно надо?

Я использую это следующим образом.

  • Скачиваем торрент.
  • Лёгким движением руки убираем announce и announce-list, вставляем nodes.
  • ...
  • ПРОФИТ

Кто понял, тот молодец.

Перспективы

К сожалению, редактировать содержимое info нельзя, так как для идентификации торрента при взаимодействии с трекером и пирами используется хэш этого словаря. Однако, теоретически, можно ввести в торрент параметр типа info_hash и пропатчить клиента, чтобы в качестве идентификатора использовался этот параметр, а не истинный хэш. Это позволило бы менять имена файлов и убирать флаг private. Полезность второго, впрочем, сомнительна, более эффективно пропатчить клиента на предмет игнорирования этого флага.

Дополнение

Первоначальный проект получил продолжение: я написал конвертер "bencode <=> json", ибо нефиг форматы плодить, а michael_ul - утилитку magnetize.

Ссылки