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

Формат торрент-файла

Содрано отсюда.

Bencoding

Bencoding — способ представления данных в кратком формате. Bencoding поддерживает следующие типы данных:

Пример: 4:spam кодирует строку «spam».

Числа могут быть отрицательными i-3e. Запись ненулевого числа не может начинаться с нуля, то есть запись вида i04e является неверной. Однако, писать i0e вполне корректно. Максимальная величина целого числа не указана, но для работы с большими файлами (>4Gb) необходимо считать числа как минимум 64-битными. Пример: i3e кодирует число «3».

Списки могут содержать объекты любого типа, в том числе другие списки, причём в одном списке могут быть разнотипные объекты. Пример: l4:spami3e представляет собой список из двух объектов: строки «spam» и числа «3».

Словари представляют собой список пар «ключ», «значение». Ключ — всегда строка, значение может являться любым типом, в том числе и словарём. Словарь должен быть отсортирован по ключам (сортировка ключей делается по их байтовому значению, не по алфавиту). Пример: d4:type3:int5:valuei10ee — словарь из двух пар: «type», «int» и «value», «10».

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

Содержимое торрент-файла кодируется указанным выше образом. Сам торрент-файл представляет собой bencoded словарь со следующими ключами:

В безтрекерном торренте отсутствуют announce и announce-list, но вместо этого есть элемент nodes, представляющий собой список списков, каждый из которых содержит строку с адресом ноды и число — номер порта. Что-то вроде nodes = [ [»<host>», <port>], [»<host>», <port>], ...]. Простейший вариант — nodes = [ [«127.0.0.1», 6881] ].

Словарь info

Параметры, одинаковые для однофайловых и многофайловых торрентов.

Словарь info для однофайлового торрента
Словарь info для многофайлового торрента

Чтение и редактирование содержимого

Ничего путного для просмотра и редактирования содержимого в инете я не нашёл. Соответственно, пришлось написать самому. Итак, две программы: torread и torwrite. Они тут.

torread

torread торрент-файл > текстовый_файл

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

(
 "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 текстовый_файл > торрент-файл

Совершает обратную операцию: преобразует текстовый файл в торрент. Понимает в строках помимо \x<hex>, также \n, \a, \b, \e, \f, \r, \t, \v, чтобы это не значило.

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

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

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

Перспективы

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

Скачать / Download

Ссылки

Обсуждение на форуме.

Описание формата торрент-файла и протокола.

Описание DHT.