Как изменить торрент файл

Обновлено: 02.07.2024

Довольно часто, при пользовании торрент-клиентом, возникает ситуация, когда нужно продолжить раздачу файла после его переименования или переноса в другую директорию. Эта функция стала доступна с 1.8 версии самого популярного торрент-клиента uTorrent . В более ранних версиях нельзя было переименовать файл и продолжить сидирование.

Также, данное руководство вы можете использовать, если вы переносите / переименовываете папку, а не файл. Суть та же, просто выполняете на 1 шаг меньше.

Первым делом, хотелось бы обратить ваше внимание на одну важную деталь. Раздача файла после его переноса / переименования доступна из-за того, что uTorrent в своих торрент-файлах хранит не имена файлов, а их хеш - контрольную сумму. Поэтому мы и можем производить действия по переносу / переименованию, но если вы меняете сам файл, например, изменяя его теги, то вы уже не сможете продолжить его раздачу.

Итак, приступим:

1. Если торрент уже загружен в uTorrent, кликните правой кнопкой мыши по нему и нажмите "Стоп". Если же вы добавляете торрент, имена файлов которого вы изменили, то убедитесь, что вы добавляете его в режиме "Остановлен"
2. В нижней части окна торрент-клиента выбираем вкладку "Файлы". Если у вас отсутствует нижняя панель, нажмите кнопку "Настройка" и установите флажок "Подробная информация"
3. Кликаем правой кнопкой мыши по файлу и выбираем в списке меню пункт "Переместить. "
4. В появившемся окне, находим расположение нашего переименованного / перемещенного файла и нажимаем "Сохранить". Если же вы меняли название папки или переносили её, то выбирать стоит саму папку.
5. Теперь нам следует кликнуть правой кнопкой мыши по торренту и выбрать из списка "Обновить хеш"
6. Теперь вы можете "Запустить" торрент, нажав на соответствующую кнопку и если вы сделали всё правильно, то начнется раздача файла

Как вы видите, ничего сложного в этом нет, главное, чтобы файл оставался неизменным!

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

Bencode

Именно так называется формат кодирования данных в .torrent-файлах. Больше он почти нигде и не используется, мне попадался он на глаза так же в формате хранения resume-информации в Transmission.
Для большинства актуальных языков написаны библиотеки для работы с этим форматом, но не для C++, да, конечно, есть такая штука, но это чистый Си и кроме того форма представления мне не показалась удачной, поэтому написал простенький свой велосипед, ибо формат крайне прост.

Описываются 4 типа данных — массив байт, число, список, ассоциативный массив.

  • Числа задаются в форме i<последовательность цифр>e, <последовательность цифр> — это цифры в ascii представлении, то есть 1 задаётся как '1' или 0x31. Заметно что так мы можем задавать огромные числа, которые не влезут ни в long, ни в long long, однако большинство пренебрегают отсутствием лимита и используют 64-битные числа.
  • Массив байт — <длина массива>:<сам массив>. Длина массива так же формируется неограниченной последовательностью цифр.
  • Список — l<элемeнты списка>e. Элементом может являться любой из типов данных. В том числе и вложенный список. Конец, как видно из формата, отмечается литералом 'e'.
  • Ассоциативный массив — d<элемeнты массива>e. Каждый элемент массива выглядит таким образом — <массив байт><элемент>. Массив байт — это имя записи в форме из пункта 2. Элемент опять же может быть любым — список, массив, ассоциативный массив, число.

Это всё. Сам файл это последовательность таких записей. Поэтому декодирование крайне просто выполняется:


Кодирование тоже несложно:

Структура .torrent-файла.

Как я уже писал выше для кодирования используется Bencode.
Стоит добавить что если массив байт может быть интерпретирован как строка (имена элементов в ассоциативном массиве, просто строковые поля), то используется кодировка utf-8.

Необходимо упомянуть то, что файлы представлены в протоколе кусками. То есть файлы содержащиеся в торренте объединены в единый массив, и затем этот массив разделили на относительно небольшие кусочки. В таком виде данные обрабатывает BitTorrent-протокол.

  • piece length — размер одного кусочка — 512 килобайт, 1 метр, и так далее. Слишком большое число кусков будет «раздувать» .torrent-файл.
  • pieces — строка, которая содержит конкатенацию SHA1-хешей, описывающих каждый кусочек. Длина этой строки равна 20 * количество кусков.
  • name — рекомендательное имя файла (если файл один) или директории. Увы многие торрент-клиенты воспринимают это как аксиому.
  • length — если файл один, то будет задано это поле, которое содержит длину файла.
  • files — если файлов несколько, то появится список ассоциативных массивов.
  • length — длина файла.
  • path — список из строк, которые задают путь. Каждая строка — элемент пути, относительно корневой директории торрента. Для пути a/b/c/d.jpg будет 4 строки в данном списке — ['a', 'b', 'c', 'd.jpg'].

В общем-то это всё.
Нам в данный момент нужно только одно поле — announce-list. Пробегаясь по этому списку находим неугодный трекер и вырезаем его:

Демоны и watch-directory.

Таким образом мы можем пробежаться по существующим .torrent-файлам и вырезать трекер, однако что делать с новыми файлами?
Я использую удобную штуку — watch directory. Кидаем туда .torrent и клиент обнаружив его в этой папке, сам автоматически добавит его к себе.
Однако мне совсем не хочется предварительно вырезать трекер, а желаю автоматизировать это дело.
Поэтому написал простенький демон, который мониторит собственную watch directory, удаляет трекер и кидает файл в watch directory торрент-клиента.
Для меня как пользователя абсолютно ничего не поменялось, кидаю файлы в ту же папку, получаю на выходе торрент в клиенте.

Демона пишем на Си с использованием замечательной штуки — inotify,


Инициализируем модуль с помощью inotify_init(), затем добавляем директорию для слежения inotify_add_watch(), нас интересует только создание файла, поэтому указываем флажок IN_CREATE. А затем крутим бесконечный цикл слежения за директорией.

Блокирующий вызов read() вернёт нам управление как только произойдут нужные нам изменения в одной из директорий, за которыми следим. Таким образом мы абсолютно не грузим процессор во время ожидания.
Сама обработка файла не представляет из себя ничего интересного — пара вызовов rename() и один вызов system().

Думаю что многие из нас пользовались торрентами для скачивания файлов или их раздачи.
Чтобы скачать файл с торрента, сначала скачиваем небольшой файлик с расширением torrent, который открывается в торрент-клиенте и после этого происходит скачивание (конечно же при условии что есть сиды, раздающие торрент).
Что же представляет из себя торрент-файл и какие данные в нем хранятся?
Внутренности torrent-файла – это bencode-данные.
Bencode-формат файла позволяет хранить следующие типы данных: байт-строки, числа, списки и директивы.
Приведу примеры кодирования данных.

<длина строки>:<строка>. Пример: 10:PROgramist <ключ l><bencoding данные><ключ e>. Пример: 10:PROgramisti1234ee <ключ d><строка bencoding><элемент bencoding><ключ e>. Пример: d10:PROgramist6:forevere
  • announce – URL адрес трекера;
  • announce list – список, содержащий несколько URL адрес трекеров
  • create date – дата создания torrent файла в формате Unix-time;
  • comment – комментарий от создателя торрент-файла;
  • created by – название и версия программы, в которой был создан torrent-файл.;
  • info – директива для описания свойств файлов. В зависимости от типа торрент-файла (обычный – один файл или смешанный – несколько файлов) эта директива применяется по-разному. В директиву входят:
  • piece length – длина сегмента файла;
  • pieces – бинарный массив хэш сумм сегментов файлов, полученных по алгоритму SHA1,
  • private - определяет будет ли использоваться обмен между пирами и DHT. Учтите, SHA1 хэш данных этой директивы используется для идентификации торента поэтому если изменить содержимое готового торрент-файла то его не признает трекер!

Для работы с торрент-файлами, были созданы несколько процедур (файл TorrentFiles.pbi).
К сожалению, код не могу выложить на странице - поскольку здесь ограничение в 40000 знаков поэтому рассмотрим только ключевые места кода.

TorrentFiles_CreateTorrent( *TorrentInfo . TorrentFiles_CreateInfo )

позволяет создать новый торрент-файл. Ей передается указатель на структуру TorrentFiles_CreateInfo, в котрой содержатся данные, необходимые для создания торрент-файла.
Для загрузки торрент-файла, следует использовать процедуру

TorrentFiles_LoadTorrentFile(TorrentFile.s, *Torrent . TorrentFiles_TorrentInfo )

Ей в первом аргументе передается путь к открываемому торрент-файлу, а во втором, указатель на структуру TorrentFiles_TorrentInfo.

При успешной расшифровке торрент-файла, в эту структуру будут записаны данные из файла.

TorrentFiles_CreateSysFile_Torrent(TorrentFile.s, *Torrent . TorrentFiles_TorrentInfo )

предназначена для создания торрент-файла из данных в структуре TorrentFiles_TorrentInfo.
Она используется для сохранения данных после их редактирования.

А теперь покажу на примерах как пользоваться этими процедурами.

Создание торрент-файла: (файл CreateTorrent.pb).



В окне выбираем файл или папку из которых нужно создать торрент и при необходимости изменяем свойства торрента, после чего, кликаем по кнопке "Создать".
Через некоторый промежуток (зависит от размера файлов, из которых создается торрент), торрент-файл будет создан и его можно использовать по назначению.

А теперь рассмотрим программу, редактирующую готовый торрент-файл (файл EditTorrent.pb).



Выбираем торрент-файл и его данные будут доступны для редактирования.
Только учтите, если изменить что-либо, находящееся в области 'INFO Hash', хэш торрента изменится!

Клик по кнопке "Сохранить" вызовет процедуру TorrentFiles_CreateSysFile_Torrent(), которая сохранит изменения в торрент-файле.

Как переместить или переименовать скачанный через торрент файл? В торрент-сообществе не принято проявлять эгоизм и, скачав себе файл, уходить с раздачи. Разве что отдача файла в условиях плохого Интернета делает работу с ним критически невыносимой. Но что делать, если уход с раздачи спровоцирован необходимостью переименовать скачанный файл или переместить его в другое место, отличное от того, куда файл изначально загружен?

Эти действия торрент-клиент не позволит сделать, он блокирует раздающийся файл, последний мы можем только запускать. Операции переименования и перемещения на диске раздающихся файлов некоторые торрент-клиенты предусматривают специальным образом. Но такие обычно из числа функциональных программ или платных версий, эти возможности есть не у всех торрент-клиентов. Тем не менее у поставленной задачи есть решение в любом случае.

Чтобы переименовывать или перемещать раздающиеся файлы, необходимо исследовать возможности своего торрент-клиента – есть ли в нём операции переименования и перемещения. Например, одна из популярнейших программ для работы с торрент-сетями uTorrent предусматривает такие операции в числе дополнительных опций в контекстном меню на раздающемся файле, но работают они только в платной версии программы Pro . Для смены пути хранения раздающегося файла мы выбираем опцию «Загружать в…», а для переименования – опцию «Выбрать имя назначения».

uTorrent

Если же у вас бесплатная версия uTorrent или другой торрент-клиент, который не предусматривает возможностей переименования и перемещения раздающихся файлов, не беда, можем поступить следующим образом. Копируем в торрент-клиенте Magnet -ссылку раздачи нашего файла, а потом её удаляем. Но важно: удаляем только раздачу, не удаляем сам скачанный файл.

uTorrent

Далее делаем свои подвижки – переименовываем как надо или перемещаем файл куда надо. А потом добавляем в торрент-клиент загрузку с помощью скопированной Magnet -ссылки.

uTorrent

Оформляем загрузку по новой: если нужно, выбираем отдельные файлы пакета раздачи, указываем прочие настройки. И указываем путь загрузки – тот, куда мы переместили наш файл. Смотрим, чтобы в форме загрузки не стояла галочка создания подпапки.

uTorrent

Вот и всё: файл не будет загружаться по новой, торрент-клиент просто перепроверит его идентичность и целостность.

Читайте также: