Редактирование торрент-файлов
Формат торрент-файла
Содрано отсюда.
Bencoding
Bencoding — способ представления данных в кратком формате. Bencoding поддерживает следующие типы данных:
- Строки (byte strings). Строки кодируются следующим образом: <Длина строки десятичным числом>:<строка>
Пример: 4:spam кодирует строку «spam».
- Целые числа (integers). Числа представляются так: i<Число в десятичном формате>e
Числа могут быть отрицательными i-3e. Запись ненулевого числа не может начинаться с нуля, то есть запись вида i04e является неверной. Однако, писать i0e вполне корректно. Максимальная величина целого числа не указана, но для работы с большими файлами (>4Gb) необходимо считать числа как минимум 64-битными. Пример: i3e кодирует число «3».
- Списки (lists). Формат списка: l<bencoded объекты>e
Списки могут содержать объекты любого типа, в том числе другие списки, причём в одном списке могут быть разнотипные объекты. Пример: l4:spami3e представляет собой список из двух объектов: строки «spam» и числа «3».
- Словари (dictionaries). Запись словаря: d<bencoded строка><bencoded объект>...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 = [ [»<host>», <port>], [»<host>», <port>], ...]. Простейший вариант — 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. Они тут.
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, чтобы это не значило.
Зачем оно надо?
Я использую это следующим образом.
- Скачиваем торрент.
- Лёгким движением руки убираем announce и announce-list, вставляем nodes.
- ...
- ПРОФИТ
Кто понял, тот молодец.
Перспективы
К сожалению, редактировать содержимое info нельзя, так как для идентификации торрента при взаимодействии с трекером и пирами используется хэш этого словаря. Однако, теоретически, можно ввести в торрент параметр типа info_hash и пропатчить клиента, чтобы в качестве идентификатора использовался этот параметр, а не истинный хэш. Это позволило бы менять имена файлов и убирать флаг private. Полезность второго, впрочем, сомнительна, более эффективно пропатчить клиента на предмет игнорирования этого флага.
Скачать / Download
- Первый, «авторский», вариант: http://linuxdv.ru/forum/download/file.php?id=28
Ссылки
Вы находитесь здесь: Сайт группы пользователей Linux города Владивостока » Проекты » Редактирование торрент-файлов

