-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
0.20191214: Replase HTML info to MarkDown
- Loading branch information
1 parent
57f6068
commit 4124a08
Showing
9 changed files
with
126 additions
and
568 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
# Редактирование торрент-файлов | ||
|
||
Формат торрент-файла можно посмотреть [здесь](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. Они [тут](http://www.linuxdv.org/wiki/_media/projects/tor_rw.tar.gz). | ||
|
||
### torread | ||
|
||
```sh | ||
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 | ||
|
||
```sh | ||
torwrite текстовый_файл > торрент-файл | ||
``` | ||
|
||
Совершает обратную операцию: преобразует текстовый файл в торрент. Понимает в строках помимо \x<hex>, также \n, \a, \b, \e, \f, \r, \t, \v, чтобы это не значило. | ||
Зачем оно надо? | ||
|
||
Я использую это следующим образом. | ||
|
||
* Скачиваем торрент. | ||
* Лёгким движением руки убираем announce и announce-list, вставляем nodes. | ||
* … | ||
* ПРОФИТ | ||
|
||
Кто понял, тот молодец. | ||
|
||
## Перспективы | ||
|
||
К сожалению, редактировать содержимое **info** нельзя, так как для идентификации торрента при взаимодействии с трекером и пирами используется хэш этого словаря. Однако, теоретически, можно ввести в торрент параметр типа **info_hash** и пропатчить клиента, чтобы в качестве идентификатора использовался этот параметр, а не истинный хэш. Это позволило бы менять имена файлов и убирать флаг **private**. Полезность второго, впрочем, сомнительна, более эффективно пропатчить клиента на предмет игнорирования этого флага. | ||
|
||
## Дополнение | ||
|
||
Первоначальный проект получил продолжение: я написал [конвертер](http://www.linuxdv.org/git/?p=torrent2json.git;a=summary) «bencode ⇔ json», ибо нефиг форматы плодить, а michael_ul - утилитку [magnetize](http://www.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) | ||
|
||
2014/07/07 17:21 — aduser | ||
|
Oops, something went wrong.