Skip to content

Commit

Permalink
0.20191214: Replase HTML info to MarkDown
Browse files Browse the repository at this point in the history
  • Loading branch information
zvezdochiot committed Dec 14, 2019
1 parent 57f6068 commit 4124a08
Show file tree
Hide file tree
Showing 9 changed files with 126 additions and 568 deletions.
126 changes: 126 additions & 0 deletions INFO_RU.md
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

Loading

0 comments on commit 4124a08

Please sign in to comment.