====== Редактирование торрент-файлов ====== ==== Формат торрент-файла ==== Содрано [[http://wiki.theory.org/BitTorrentSpecification|отсюда]]. === Bencoding === Bencoding --- способ представления данных в кратком формате. Bencoding поддерживает следующие типы данных: * **Строки (byte strings).** Строки кодируются следующим образом: //<Длина строки десятичным числом>:<строка>// **Пример**: //4:spam// кодирует строку "spam". * **Целые числа (integers).** Числа представляются так: //i<Число в десятичном формате>e// Числа могут быть отрицательными //i-3e//. Запись ненулевого числа не может начинаться с нуля, то есть запись вида //i04e// является неверной. Однако, писать //i0e// вполне корректно. Максимальная величина целого числа не указана, но для работы с большими файлами (>4Gb) необходимо считать числа как минимум 64-битными. **Пример**: //i3e// кодирует число "3". * **Списки (lists).** Формат списка: //le// Списки могут содержать объекты любого типа, в том числе другие списки, причём в одном списке могут быть разнотипные объекты. **Пример**: //l4:spami3e// представляет собой список из двух объектов: строки "spam" и числа "3". * **Словари** (dictionaries). Запись словаря: //d...e// Словари представляют собой список пар "ключ", "значение". Ключ --- всегда строка, значение может являться любым типом, в том числе и словарём. Словарь должен быть отсортирован по ключам (сортировка ключей делается по их байтовому значению, не по алфавиту). **Пример**: //d4:type3:int5:valuei10ee// --- словарь из двух пар: "type", "int" и "value", "10". === Содержимое торрент-файла === Содержимое торрент-файла кодируется указанным выше образом. Сам торрент-файл представляет собой 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 = [ ["", ], ["", ], ...]. Простейший вариант --- nodes = [ ["127.0.0.1", 6881] ]. == Словарь info == Параметры, одинаковые для однофайловых и многофайловых торрентов. * **piece length**: число байтов в куске, обычно степень двойки. * **pieces**: строка из объединённых 20-байтных SHA1 хэшей кусков. * **private**: (опционально) число. Если оно равно единице, клиент для поиска пиров должен использовать ТОЛЬКО трекер(ы), указанные в торрент-файле. Если это число равно нулю, клиент может добавлять пиры любыми методами: вручную, через DHT или Peer Exchange и т. д. == Словарь info для однофайлового торрента == * **name**: строка с именем файла. * **length**: число байт в файле. * **md5sum**: (опционально) строка MD5 суммы файла. Нахрен никому не нужна. == Словарь info для многофайлового торрента == * **name**: строка с именем директории, куда будут помещаться все файлы. * **files**: список словарей, по одному для каждого файла. Каждый словарь содержит следующие ключи: * **length**: число байт в файле. * **md5sum**: (опционально) строка MD5 суммы файла. Нахрен никому не нужна, как и в предыдущем случае. * **path**: список из одной или более строк, представляющих вместе путь к файлу. Последняя строка --- имя файла, предыдущие --- последовательность вложенных директорий. Например, путь "dir1/dir2/file.ext" будет представлен в виде списка из трёх строк: "dir1", "dir2", "file.ext". ==== Чтение и редактирование содержимого ==== Ничего путного для просмотра и редактирования содержимого в инете я не нашёл. Соответственно, пришлось написать самому. Итак, две программы: torread и torwrite. Они [[http://linuxdv.ru/forum/download/file.php?id=28|тут]]. === torread === torread торрент-файл > текстовый_файл Преобразует торрент-файл к человекочитаемому виду. Словари ограничиваются круглыми скобками (), списки --- квадратными [], строки --- кавычками "", числа --- ничем не ограничиваются. Содержимое словарей пишется в виде пар "ключ" = значение. Внутри строк символы с кодами <32 и >=127 представляются в шестнадцатиричном виде ''\x'', кавычки экранируются слэшем \". Пример конвертированного торрента [[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 текстовый_файл > торрент-файл Совершает обратную операцию: преобразует текстовый файл в торрент. Понимает в строках помимо ''\x'', также ''\n'', ''\a'', ''\b'', ''\e'', ''\f'', ''\r'', ''\t'', ''\v'', чтобы это не значило. ==== Зачем оно надо? ==== Я использую это следующим образом. * Скачиваем торрент. * Лёгким движением руки убираем **announce** и **announce-list**, вставляем **nodes**. * ... * ПРОФИТ Кто понял, тот молодец. ==== Перспективы ==== К сожалению, редактировать содержимое **info** нельзя, так как для идентификации торрента при взаимодействии с трекером и пирами используется хэш этого словаря. Однако, теоретически, можно ввести в торрент параметр типа **info_hash** и пропатчить клиента, чтобы в качестве идентификатора использовался этот параметр, а не истинный хэш. Это позволило бы менять имена файлов и убирать флаг **private**. Полезность второго, впрочем, сомнительна, более эффективно пропатчить клиента на предмет игнорирования этого флага. ==== Скачать / Download ==== * Первый, "авторский", вариант: [[http://linuxdv.ru/forum/download/file.php?id=28]] ==== Ссылки ==== [[http://linuxdv.ru/forum/viewtopic.php?f=4&t=1514|Обсуждение на форуме.]] [[http://wiki.theory.org/BitTorrentSpecification|Описание формата торрент-файла и протокола.]] [[http://bittorrent.org/beps/bep_0005.html|Описание DHT.]]