Как найти имена для торрента

«Почему Торрент не подключается к пирам, сидам — ничего не загружается!». Пару рекомендаций тем, у кого подобная проблема

utorrent-ne-vidit-piryi

Вопрос от пользователя

Здравствуйте.

Давно натыкаюсь на ваш блог, и решила уже много проблем (спасибо большое).

Вот, первый раз не могу сама разобраться: пытаюсь загружать какие-нибудь файлы к себе на ПК, но Торрент не подключается к пирам вообще! Происходит такое со всеми загрузками с разных трекеров.

Думаю, что виновато обновление Windows 10 — до него всё работало (а может просто совпало, не знаю).

Заранее спасибо, Анастасия.

Да, эта проблема «избитая», и встречается достаточно часто. Для начала банальные советы: перезагрузите ПК, проверьте свою скорость интернета и переустановите uTorrent (скачав программу с официального сайта!).

После, можно переходить к более конкретным действиям. 👌

👉 Кстати!

Если у вас несколько иная проблема, скажем, скорость загрузки торрентов доходит до 5 Мб/с, а затем падает до 0-100 Кб/с, рекомендую ознакомиться сначала с этим —>

Что можно посоветовать, если uTorrent «не видит» пиры

👉 ШАГ 1: азы

И так, сначала кратко, о чем мы «говорим»:

  1. Пиры (Peer) — любые участники сети, раздающие файлы (к ним относятся и сиды, и личи) ;
  2. Сиды (Seed) — участники сети, у которых есть полная версия загружаемого вами файла;
  3. Личи — участники сети, у которых файл не загружен до конца (но свою уже загруженную частичку — они могут раздавать подобно сидам) .

Узнать эту информацию можно в окне uTorrent — выбрав нужный торрент и открыв вкладку «Пиры» (для каждого загружаемого торрента — количество пиров будет разным!) .

Пиры - скрин из uTorrent

Пиры — скрин из uTorrent

Когда есть какая-то проблема с «загрузкой» — обычно, вкладка «Пиры» будет пуста (либо там будут приведено несколько пиров с «нулевой» скоростью загрузки от них) .

👉 ШАГ 2

Во многих случаях причиной проблем с загрузкой могут стать антивирусы и брандмауэры. Поэтому, на время диагностики я порекомендую их выключить (обычно, для этого достаточно 1-2 клика мышки по иконке антивируса в трее, рядом с часами. См. пример ниже с Avast) . 👇

Отключение антивируса Avast на 1 час

Отключение антивируса Avast на 1 час

Также не забудьте о встроенном в Windows брандмауэре. Чтобы отключить его:

  • нажмите сочетание Win+R;
  • в появившемся окне «Выполнить» — используйте команду firewall.cpl;
  • после, передвиньте ползунки в режим «Откл.» и сохраните настройки.

Отключить брандмауэр Windows

Отключить брандмауэр Windows

Далее перезапустите uTorrent и проверьте скорость загрузки.

👉 ШАГ 3

Обратите внимание на статистику пиров на сайте вашего торрент-трекера. Обычно, она всегда отображается рядом с кнопкой «Загрузить». Чем больше пиров раздает файл — тем, как правило, выше скорость загрузки!

В любом случае, чтобы делать какие-то мало-мальские выводы о «невидимости» пиров — в uTorrent нужно добавить 2-3 торрента с не менее 20+ пирами.

Примечание : некоторые не популярные торрент-трекеры обманывают с количеством пиров (заведомо увеличивают их).

Статистика торрент-трекера

Кроме этого, также советую посмотреть рекомендуемые версии программ для работы с конкретным трекером (обычно в разделе FAQ) . Как правило большинство из них совместимо и работает с последней версией uTorrent от разработчика (однако, есть исключения!).

Рекомендуемые к использованию версии uTorrent - FAQ трекера

Рекомендуемые к использованию версии uTorrent — FAQ трекера

👉 ШАГ 4

Теперь о некоторых настройках uTorrent, которые могут быть причиной проблем с загрузкой.

И так, для начала в разделе «Общие» проверьте, чтобы стояло две галочки:

  1. «Автопроверка ассоциаций»;
  2. «Запретить спящий режим во время загрузки».

Общие - uTorrent

Далее во вкладке «BitTorrent» включите принудительное шифрование протокола, а в «Дополнительно»отключите IP-фильтрацию (параметр «ipfilter.enable») .

См. скриншот ниже, у вас в настройках uTorrent должно выглядеть примерно также. 👇

Шифрование протокола, IP-фильтр (uTorrent)

Шифрование протокола, IP-фильтр (uTorrent)

После, удостоверьтесь также что во вкладке «Скорость» не стоит жесткое ограничение пиров и скорости загрузки торрента. См. пример ниже. 👇

Скорость - uTorrent

Ну и последнее: во вкладке «Очередность» проверьте максимальное число одновременных загрузок — возможно, что до вашего торрента ранее просто не доходила очередь. 👀

Макс. одновременных загрузок - uTorrent

Макс. одновременных загрузок — uTorrent

👉 ШАГ 5

Если вы ранее подключались к VPN — отключите все подобные сервисы, перезагрузите ПК и снова попробуйте что-нибудь загрузить.

Примечание : в Windows 10 чтобы посмотреть VPN-подключения — нажмите Win+i и перейдите во вкладку «Сеть и Интернет / VPN».

Параметры Windows 10 - сеть и интернет

Параметры Windows 10 — сеть и интернет

Если ваше подключение к сети интернет осуществляется через Wi-Fi роутер — проверьте его настройки. В некоторых моделях роутеров в настройках «пропускного режима» для каждого из устройств устанавливается разрешение на доступ к интернету и лимит скорости. См. пример ниже. 👇

Ограничение доступа к интернет, скорости загрузки - роутер Tenda

Ограничение доступа к интернет, скорости загрузки — роутер Tenda

Как одна из рекомендаций : если работаете через Wi-Fi подключение — попробуйте подключить кабель от Интернет-провайдера напрямую к ПК/ноутбуку (либо, от LAN-порта роутера) .

LAN-кабель от Wi-Fi роутера

LAN-кабель от Wi-Fi роутера

👉 ШАГ 6

Если всё вышеперечисленное не помогло — могу посоветовать попробовать альтернативный клиент, например, MediaGet или qBittorrent. Эти программы не только могут полностью заменить классический uTorrent — но и серьезно расширить его функционал.

Как вам, например, автоматически поиск торрентов, не выходя из окна программы?! См. пример ниже. 👇

qBittorrent — хорошая альтернатива uTorrent

qBittorrent — хорошая альтернатива uTorrent

Как вариант, если проблема с uTorrent началась относительно недавно, — проверьте точки восстановления Windows (если эта опция включена — ОС делает их автоматически перед каждым обновлением системы или установкой каких-то программ) .

Это может быть весьма полезно, если вы заметили, что проблема с uTorrent началась сразу после какого-то действия (например, обновления драйвера).

О том, как проверить есть ли эти точки восстановления, и как к ним откатить систему — см. мою прошлую заметку, ссылка ниже.

Почему Торрент не подключается к пирам и не качает

Почему Торрент клиент не может найти пиров и выполнить закачку файла, в чем причины этой проблемы и как ее можно решить.

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

Торрент

Причины по которым Торрент не подключается к пирам

Если до этого случая вы скачивали файлы и проблем с подключением к пирам не возникало, то причины могут быть следующие:

  • Неполадки на сервере. Проблемы с Интернетом у провайдера. В этом случае ваша система, оборудование и сам клиент ни в чем не виноваты. Причина кроется в неполадках на стороне сервера или провайдера. Возможно, что после исправления проблем вы сможете успешно скачать нужный файл. Вы можете также обратиться на горячую линию провайдера и уточнить причину отсутствия интернета и за какой срок устранят неполадки.
  • Нет доступных пиров, сидов. Этот случай бывает часто. Причина проста – возможно файл не популярен и не имеет необходимых доступных частиц для отдачи.
  • Настройки торрент-клиента некорректны. Давайте рассмотрим, как правильно настроить клиент для нормальной работы.

Настроим торрент-клиент для стабильной работы

Чтобы открыть настройки, выберите вверху программы вкладку «Настройки», и кликните на пункте «Настройки программы». Нужно пройти процедуру настройки для устранения проблемы, когда Торрент может не подключиться к пирам и не скачивать необходимые файлы.

Торрент

Теперь в общих должны стоять галочки на пунктах «Запускать свернуто» и «Автопроверка ассоциаций». А также в самом низу «Запретить спящий режим во время загрузки», остальные пункты без галочек.

Торрент

  • В пункте о языках интерфейса установите русский, если по каким-то причинам у вас английский интерфейс в разделе «Language».
  • Пункт «Запускать клиент с ОС», здесь вы можете установить настройки по своему усмотрению, если у вас хороший интернет и мощная система, компьютеру не будет в нагрузку запущенный клиент.
  • «Устанавливать обновления автоматически» здесь лучше убрать галочку с пункта «Обновляться до бета-версии», ведь они как правило работают не стабильно.
  • «Ассоциировать» – этот пункт будет определять торрент файлы и при необходимости запускать. Лучше оставить его включенным.

Что делать, если нет в сети Торрента необходимых пиров?

Пиры (peer) – это компьютер, который скачал файл через торрент-клиент и готов отдать его следующему пользователю по такому-же определенному протоколу. Если вы удалите из списков загрузки торрент-клиента скаченный файл, то программа не сможет больше делиться его частями с другими пользователями в пиринговой сети.

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

Торрент

Таким образом, если файл не качается, и программа сообщает, что нет доступных пиров, значит этот файл в ближайшее время вы скачать не сможете, попробуйте найти и поставить другой файл. Подробная инструкция на http://sdelaicomp.ru/wi-fi/podklyuchenie-k-piram-torrent-ne-kachaet-chto-delat.html.

Решаем проблему, когда торрент не подключается к пирам

Ваш провайдер может быть причиной того, что вы не можете скачать торрент. Некоторые подобные компании ограничивают Peer to Peer-трафик, а в некоторых случаях и вовсе выключают возможность его применения. Есть возможность обойти такую хитрость со стороны провайдера. На скрине можно увидеть, как это сделать.

Торрент

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

Перезапуск клиента может помочь в некоторых случая, когда необходимо перезайти в сеть и подключиться заново. Сделайте это в программе – нажмите «Файл», далее «Выход». После чего стандартным двойным нажатием на иконку запустите приложение.

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

Жесткий диск WD Blue WD10EZEX
SSD Crucial BX500 CT120BX500SSD1
Жесткий диск Transcend StoreJet 25M3 1 TB

Как найти сидов для торрента

Иногда скорость закачки через bittorrent-сети бывает не самой высокой даже при наличии широкого канала в Интернет. А при использовании magnet-ссылок файл может быть вообще не найден.

Проблема зачастую кроется в отсутствии сидеров или их малом количестве. Ситуация вполне типичная — многие раздачи 3-4 летней давности заброшены, так как потеряли актуальность. Исключение составляют только очень популярные вещи. Для решения этой проблемы можно попробовать самостоятельно добавить к раздаче (т. е. к закачке) в торрент-клиенте дополнительные трекеры в надежде на то, что хоть на них-то найдутся желанные сидеры.

Ниже представлен список популярных торрент-трекеров. Вставлять в свойства торрент файла.

Возвращаемся на раздачу или как сделать невозможное

Время на прочтение
14 мин

Количество просмотров 70K

Предыстория

Не так давно, а именно 5 июня хабрачеловек по имени alan008 задал вопрос. Чтобы не заставлять ходить за подробностями, приведу его здесь:

Нужна помощь!

За несколько лет с разных трекеров (преимущественно c rutracker’а) разными клиентами (преимущественно uTorrent’ом) скачано много гигабайт разного полезного контента. Скачанные файлы впоследствии вручную перемещались с одного диска на другой, uTorrent их соответственно не видит. Многие .torrent файлы устарели сами по себе (например, велась раздача сериала путем добавления новых серий заменой .torrent файла).

Теперь сам вопрос: есть ли способ автоматически (не вручную) установить соответствие между имеющимися на компьютере .torrent файлами и содержимым, раскиданным по разным логическим дискам компьютера? Цель: удалить лишние (неактуальные) .torrent файлы, а для актуальных — поставить всё на раздачу. У кого какие идеи? :)

При необходимости (если это требуется) можно снова поместить все файлы данных в один каталог на одном логическом диске.

В обсуждениях сошлись на том, что если это и можно сделать, то только ручками. Мне же этот вопрос показался интересным, и после возвращения из отпуска я нашел время, чтобы в нем разобраться.

Потратив в общей сложности неделю на разбор формата .torrent-файла, поиск нормально работающей библиотеки для его парсинга, я приступил к написанию программы, которая позволит решить проблему затронутую в упомянутом вопросе.

Прежде чем начать, стоит отметить несколько моментов:

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

Для тех, кому интересно, что из этого получилось, технические подробности и подводные камни — прошу под кат.

В данном случае имеется отличный способ решения — перекачать заново. Но мы же не ищем легких путей, да и предлагался такой вариант! Итак, будем решать задачу по сложному — не скачивать.

Приступая к написанию любой программы, необходимо сначала продумать хотябы базовый алгоритм ее работы. В нашем случае алгоритм, по сути, состоит из двух шагов:

  1. Найти и прочитать все .torrent-файлы;
  2. Найти в куче файлов тот, который соответствует описанному в .torrent, и переместить его в папку, соответствующую пути в .torrent.

Для реализации своей идеи, я использовал C#, однако для этого подойдет любой язык, на котором есть библиотеки для чтения файлов в формате bencode и реализована возможность считать SHA-1 хеш.

Ну что же, приступим к решению поставленной задачи.

Ищем торренты и читаем их

После того, как я разобрался с устройством .torrent-файлов, передо мной встал вопрос парсинга всего этого чуда. Прошерстив интернет по данному вопросу, я обнаружил несколько .NET-библиотек под это дело. Выбор свой я остановил на, более-менее понятной и работающей из коробки библиотеке BencodeLibrary, однако впоследствии пришлось ее немного дополнить под свои нужды, но об этом позже.

Начнем с самого простого момента — чтения .torrent.

Строение .torrent-файла довольно простое — он представляет из себя словарь в формате bencode. В данном словаре нас интересует только пара с ключом info — блок описания файлов. Этот тоже является словарем и содержит в себе информацию об имени файлов, их размере. Кроме того, как многим известно, торрент хеширует файлы не целиком, а по кускам определенной длины, которая зависит от размера этих файлов. Информация о размере этого куска также содержится в словаре info.

Для хранения информации из прочитанного файла будем использовать такой класс Torrent:

class Torrent

public class Torrent
{
	public Torrent(string name, List<LostFile> files, int pieceLength, char[] hash, string fileName)
	{
		Name = name; 
		Files = files;
		PieceLength = pieceLength;
		Hash = hash;
		FileName= fileName;
        }
	
	public string Name;
	public int PieceLength;
	public char[] Hash;
	public List<LostFile> Files;
	public string FileName;
        
	...
}

Здесь поля хранят следующую информацию:

* Name — имя торрента (вообще говоря — имя папки или имя файла)
* Files — список файлов, которые нам надо будет в дальнейшем искать
* PieceLength — размер тех самых кусочков, хеш которых нам предстоит считать
* Hash — хеш строка всех файлов
* FileName — имя .torrent-файла на диске

Теперь стоит заострить внимание на строке хеша. Она составляется очень просто. Все файлы склеиваются в один (виртуально конечно) друг за другом, образуя при этом один БОЛЬШОООООООЙ воображаемый файл. В этом воображаемом файле берем кусок длины PieceLength, считаем SHA1 хеш, кладем хеш в строку, берем следующий кусок, считаем хеш, дописываем к концу строки с хешем предыдущего куска. Т. е. это обычная конкатенация хешей всех кусков.

Как мог заметить внимательный читатель, файл внутри класса — это не просто файл, а особый тип данных, в котором файл описывается некой конструкцией типа LostFile. Вот она:

class LostFile

public class LostFile
{
	public LostFile(string name, long length, long beginFrom)
	{
		Name = name;
		Length = length;
		BeginFrom = beginFrom;
	}

	public string Name;
	public long Length;
	public long BeginFrom;
        
	. . .
}

Здесь все просто: имя файла и его размер. Кроме того этот класс содержит еще одно поле — BeginFrom. Оно описывает начало этого файла в том БОЛЛЬШОООООМ воображаемом файле. Он нужен, чтобы взять правильную часть файла для подсчета хеша — ведь длина файла очень редко кратна длине куска.

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

С помощью найденной на просторах интернета библиотеки BencodeLibrary мы читаем наш .torrent-файл и выкорчевываем из него блок info:

List<LostFile> files = new List<LostFile>(); // список файлов, понадобится позднее
BDict torrent = (BDict)BencodingUtils.DecodeFile(filename, Encoding.UTF8);
BDict fileInfo = (BDict)torrent["info"];

Далее из этого блока необходимо забрать данные об имени торрента, размере куска.

string name = ((BString)fileInfo["name"]).Value;
int pieceLength = (int)((BInt)fileInfo["piece length"]).Value;

С чтением хеша возникла проблема, решение которой мне не очень нравится, но оно работает. Дело в том, что по спецификации все строки в .torrent-файле должны быть в UFT8. Если читать хеш, который по спецификации записан в формате bencode-строки, как UTF8-строку, то возникнет проблема сравнения — хеши одинаковых кусков не совпадут. Читая же торрент в предлагаемой кодировке codepage-437, мы получим проблемы с русскими буквами в путях. Выход из такой ситуации, которая меня тормознула на два дня, я нашел не лучший, но работающий — читать два раза в разных кодировках.

torrent = (BDict)BencodingUtils.DecodeFile(filename, Encoding.GetEncoding(437));
char[] pieces = ((BString)((BDict)torrent["info"])["pieces"]).Value.ToCharArray();

В этом месте мы передаем в метод `BencodingUtils.DecodeFile` вторым параметром информацию о кодировке. Это как раз тот момент, когда пришлось добавлять один метод в библиотеку — изначально codepage-437 была вшита в код.

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

Сначала разберем .torrent с описанием одного файла.

long Length = ((BInt)fileInfo["length"]).Value;
files.Add(new LostFile(name, Length, 0)); // files - список файлов

Тут все просто — имя торрента совпадает с именем файла. В случае, когда файлов в раздаче много, то в поле name пишется имя папки, в которую их надо положить (на самом деле может быть что угодно, но почему-то все пишут имя папки в которой эти файлы лежали при создании). Кроме того появляется список files в котором содержится информация о каждом файле: путь к нему и размер. Если размер — просто целое число, то путь к файлу представляет собой список из строк (имен директорий), пройдя по которым мы увидим этот файл.

Такое лучше пояснять на примере. Для файлов level_1level_2_1file_1.txt и level_1level_2_2file_2.txt, если мы захотим их раздавать, поле name будет содержать имя папки верхнего уровня ("level_1"), а список path для одного из файлов будет следующего вида: {"level_2_1", "file_1.txt"} и {"level_2_2", "file_2.txt"} для другого.

Нам для .torrent с несколькими файлами надо путь до каждого файла собрать в одну строку. Кроме того, надо хранить начало каждого файла в том БОЛЬШООООМ (не забыли, правда же?!):

BList filesData = (BList)fileInfo["files"];
long begin = 0;

foreach (BDict file in filesData)
{
	BList filePaths = (BList)file["path"];
	long length = ((BInt)file["length"]).Value;

	string fullPath = name;
	foreach (BString partOfPath in filePaths)
	{
		fullPath += @"" + partOfPath.Value;
	}
	files.Add(new LostFile(fullPath, length, begin)); // files - список файлов

	begin += length;
}

Очень важно отметить, что порядок следования файлов в БОЛЬШОООООМ файле может быть любым, не обязательно по алфавиту или по размеру. Но порядок файлов в списке files будет точно таким же. Это ключевой момент для понимания принципа хеширования. Для примера, в ситуации, изображенной на первом рисунке, список файлов будет следующим: {"file_3","file_1", ..., "file_2"}. Таким образом, считая хеш одного файла, мы знаем какой файл надо будет брать следующим.

Когда мы все это дело прочитали и посчитали — давайте создадим и вернем экземпляр Torrent:

new Torrent(name, files, pieceLength, pieces, filename);

Собирая теперь все чтение и разбор .torrent-файла воедино, получаем:

ReadTorrent

static Torrent ReadTorrent(string filename)
{
	List<LostFile> files = new List<LostFile>();
	BDict torrent = (BDict)BencodingUtils.DecodeFile(filename);
	BDict fileInfo = (BDict)torrent["info"];

	string name = ((BString)fileInfo["name"]).Value;
	int pieceLength = (int)((BInt)fileInfo["piece length"]).Value;

	torrent = (BDict)BencodingUtils.DecodeFile(filename, Encoding.GetEncoding(437));
	char[] pieces = ((BString)((BDict)torrent["info"])["pieces"]).Value.ToCharArray();

	if (fileInfo.ContainsKey("files")) // Multifile torrent
	{
		BList filesData = (BList)fileInfo["files"];
		long begin = 0;
		
		foreach (BDict file in filesData)
		{
			BList filePaths = (BList)file["path"];
			long length = ((BInt)file["length"]).Value;

			string fullPath = name;
			foreach (BString partOfPath in filePaths)
			{
				fullPath += @"" + partOfPath.Value;
			}
			files.Add(new LostFile(fullPath, length, begin));

			begin += length;
		}
	}
	else // Singlefile torrent
	{
		long Length = ((BInt)fileInfo["length"]).Value;
		files.Add(new LostFile(name, Length, 1));
	}

	return new Torrent(name, files, pieceLength, pieces, filename);
}

Теперь, когда у нас есть все необходимые данные, мы готовы к самому интересному — поиску наших файлов.

Ищем файлы

Мы вплотную подошли к реализации второго шага нашего алгоритма. Для этого будем использовать метод FindFiles такого вида:

void FindFiles(Torrent torrent, List<FileInfo> files, string destinationPath) {}

Здесь files — список файлов, среди которых мы будем искать, destinationPath — путь до папки назначения, в которую будут помещаться найденные файлы.

Для каждого файла в .torrent мы будем перебирать все файлы из кучи и их сверять. Так как проверка хеша довольно затратна, то надо сначала отсеять явно левые файлы. Ну посудите сами: если я качал дискографию в .mp3 и переместил ее, то явно не менял расширения файлов. Имя мог поменять, а вот расширение вряд ли.

FileInfo fileOnDisk = files[j];
if (fileOnDisk.Extension != Path.GetExtension(fileInTorrent.Name))
	continue;

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

if (!torrent.CheckHash(i, fileOnDisk))
	continue;

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

			
FileInfo fileToMove = new FileInfo(destinationPath + @"" + fileInTorrent.Name);

if (!Directory.Exists(fileToMove.DirectoryName))
	Directory.CreateDirectory(fileToMove.DirectoryName);

if (!fileToMove.Exists)
{
	// Перемещаем-копируем файл
	if (copyFile)
		File.Copy(fileOnDisk.FullName, fileToMove.FullName);
	else
		File.Move(fileOnDisk.FullName, fileToMove.FullName);
		// Убираем из списка рассматириваемых
	files.Remove(fileOnDisk);
	// Убираем из описания торрента
	torrent.Files.RemoveAt(i--);
	break; //Больше искать файл в дереве не надо, можно переходить к следующему в torrent
}

Есть в коде выше три важных для пояснения момента. Начну с двух последних — вот эти строки:

	
files.Remove(fileOnDisk);
torrent.Files.RemoveAt(i--);

Я посчитал вполне логичным убирать уже отсортированные файлы из рассмотрения, что позволит несколько сократить время выполнения поиска. Во второй строке есть конструкция .RemoveAt(i--); так как из коллекции убирается текущий элемент, то указатель надо сдвинуть назад, чтобы на следующей итерации цикла брался следующий элемент, а не через один.

Теперь про первый момент. Я знаю про наличие foreach для списка, но его при использовании нельзя модифицировать этот спикок, то есть мы не сможем удалять уже ненужные более элементы. Итак, собирая все выше описанное в один метод, имеем:

ReadTorrent

				
public static void FindFiles(Torrent torrent, List<FileInfo> files, string destinationPath, bool copyFile)
{
	for (int i = 0; i < torrent.Files.Count; i++)// (LostFile fileInTorrent in torrent.Files)
	{
		LostFile fileInTorrent = torrent.Files[i];

		for (int j = 0; j < files.Count; j++)
		{
			FileInfo fileOnDisk = files[j];

                    // Ищем файл с таким же разширением
			if (fileOnDisk.Extension != Path.GetExtension(fileInTorrent.Name))
				continue;
                    // Проверяем размер
			if (fileOnDisk.Length != fileInTorrent.Length)
				continue;
                    // Проверяем хэш
			if (!torrent.CheckHash(i, fileOnDisk))
				continue;

                    // Все проверки пройдены. перед нами искомый файл
                    // Перемещаем его
			FileInfo fileToMove = new FileInfo(destinationPath + @"" + fileInTorrent.Name);

			if (!Directory.Exists(fileToMove.DirectoryName))
				Directory.CreateDirectory(fileToMove.DirectoryName);

			if (!fileToMove.Exists)
			{
				if (copyFile)
					File.Copy(fileOnDisk.FullName, fileToMove.FullName);
				else
					File.Move(fileOnDisk.FullName, fileToMove.FullName);

                        // И убираем из списка рассматириваемых
				files.Remove(fileOnDisk);
                        // Убираем из описания торрента
				torrent.Files.RemoveAt(i--);
				break;
			}                    
		}
	}
}

Ну вот! Самое вкусное.

Проверка хеша

Как видно из кода выше, для проверки хеша мы передаем имя файла на диске и номер файла в списке файлов торрента. Это надо для того, чтобы не запускать поиск в списке файлов, а сразу взять его по номеру, раз он известен (еще одно «+1» циклу for).

public class Torrent
{
	public string Name;
	public int PieceLength;
	public char[] Hash;
	public List<LostFile> Files;
	public string FileName;
		
	public bool CheckHash(int index, FileInfo fileOnDisk) {}
}

Теперь приступим к реализации нашего метода проверки хеша. На данном этапе мы знаем номер в списке файлов торрента и путь до файла на диске

LostFile checkingFile = this.Files[index];

if (checkingFile.Length < this.PieceLength * 2 - 1)
	return false;

В принципе, мы можем считать хеш любого файла, но давайте немного упростим себе задачу. Мы будем браться только за файлы, длина которых больше или равна PieceLength * 2 - 1. Такое ограничение даст нам возможность вычленить хотя бы один кусок для проверки, полность находящийся в файле. У такого подхода есть несколько существенных плюсов:

  1. Нет необходимости дополнительно искать на диске соседние файлы;
  2. Длина куска для хеширования очень редко превышает 2-4 МБ, что дает нам еще один плюс — с точки зрения производительности и времени, докачать такие файлы намного проще, чем искать их на диске.

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

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

long start = 0;
long firstChunkNumber = 0;
            
long bytesOveload = checkingFile.BeginFrom % this.PieceLength;

if (bytesOveload == 0) // Если кусок начинается с первого байта файла
{
	start = checkingFile.BeginFrom;
	firstChunkNumber = checkingFile.BeginFrom / this.PieceLength;
}
else
{
	firstChunkNumber = checkingFile.BeginFrom / this.PieceLength + 1;
	start = firstChunkNumber * this.PieceLength - checkingFile.BeginFrom;
}

Ответить на вопрос «Почему номер куска разный для случая, когда его начало совпадает с началом файла, и для случая, когда кусок лежит внутри?» предлагается самостоятельно.

Сейчас, зная номер куска мы должны взять его хеш из торрента с помощью такой конструкции:

char[] hashInTorrent = new char[20]; // 20 - длина хеша SHA1 в байтах
Array.Copy(this.Hash, firstChunkNumber * 20, hashInTorrent, 0, 20);

После этого, надо прочитать кусок из файла и посчитать его хеш:

char[] fileHash = new char[this.PieceLength];

using (BinaryReader fs = new BinaryReader(new FileStream(fileOnDisk.FullName, FileMode.Open)))
{
	using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
	{
		byte[] piece = new byte[this.PieceLength];

		fs.BaseStream.Position = start;
		fs.Read(piece, 0, this.PieceLength);

		fileHash = Encoding.GetEncoding(437).GetString(sha1.ComputeHash(piece)).ToCharArray();
	}
}

Ну и самое важное — его проверить. У меня, почему-то не захотел работать ни один из методов Equals(), которые я смог найти, поэтому проверяем так:

for (int i = 0; i < fileHash.Length; i++)
{
	if (fileHash[i] != hashInTorrent[i])
		return false;
}

Собирая воедино сие творение возбужденного мозга, получим метод следующего содержания:

CheckHash

			
public bool CheckHash(int index, FileInfo fileOnDisk)
{
	LostFile checkingFile = this.Files[index];

	if (checkingFile.Length < this.PieceLength * 2 - 1)
		return false;

	long start = 0;
	long firstChunkNumber = 0;
            
	long bytesOveload = checkingFile.BeginFrom % this.PieceLength;

	if (bytesOveload == 0)
	{
		start = checkingFile.BeginFrom;
		firstChunkNumber = checkingFile.BeginFrom / this.PieceLength;
	}
	else
	{
		firstChunkNumber = checkingFile.BeginFrom / this.PieceLength + 1;
		start = firstChunkNumber * this.PieceLength - checkingFile.BeginFrom;
	}

	char[] hashInTorrent = new char[20];
	Array.Copy(this.Hash, firstChunkNumber * 20, hashInTorrent, 0, 20);

	char[] fileHash = new char[this.PieceLength];

	using (BinaryReader fs = new BinaryReader(new FileStream(fileOnDisk.FullName, FileMode.Open)))
	{
		using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
		{
			byte[] piece = new byte[this.PieceLength];

			fs.BaseStream.Position = start;
			fs.Read(piece, 0, this.PieceLength);

			fileHash = Encoding.GetEncoding(437).GetString(sha1.ComputeHash(piece)).ToCharArray();
		}
	}
			
	for (int i = 0; i < fileHash.Length; i++)
		if (fileHash[i] != hashInTorrent[i])
			return false;

	return true;
}

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

Программа

Программа написана, как уже упоминалось на C#. При работе не сильно прихотлива, требует только .NET 2.0. Есть однако одно ограничение на использование: торрент файлы и коллекцию лучше убрать из корня логического диска. Причина этого ограничения — использование при сканировании директорий параметра `SearchOption.AllDirectories`, что приводит к вылету при попытке прочитать закрытые директории типа корзины или `System Volume Information` (если знающие люди подскажут как это обойти, то буду весьма признателен). Для папки назначения особых ограничений естественно нет, главное чтобы влезло, и можно было в нее писать, иначе вылетит с ошибкой (не моделировал, но логично).

В процессе работы, после окончания обработки очередного файла, выводится результат — имя .torrent-файла на диске и количество обработанных файлов.

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

По поводу производительности. Она пока что низкая: обработка 10 больших torrent-файлов заняла около 5 минут.

Так как работает приложение в один поток, то во время выполнения интерфейс подвисает, но я над этим работаю. Также хочу напомнить, что файлы малого размера (меньше 2-х мегабайт) не будут перемещены по причине отсутствия возможности проверки хеша. Вполне вероятны ложные срабатывания из-за того, что проверяется только один кусок под номером firstChunkNumber. Пока что проверять все куски слишком затратно, но в планах есть.

Не ищите торренты рекурсивно, если они собраны в корне диска.
Копирование может занять много времени, поэтому интерфейс может подвиснуть — не пугайтесь.

Так как писалась эта программа 4fun, то качество кода там немного не то, которое хотелось бы, но у меня оно работает. Данная программа не тестировалась, исправлялись только очевидные ошибки, поэтому могут быть, да что скрывать-то, есть скрытые баги. ИСПОЛЬЗУЯ ДАННУЮ ПРОГРАММУ, ВЫ ИСПОЛЬЗУЕТЕ ЕЕ НА СВОЙ СТРАХ И РИСК.

Взять исходники можно на github. Распространяется по GPLv2. Там есть архив с исполняемым файлом. Для работы требуется библиотека Bencode Library, но не оригинальная, а модифицированная мною (есть у меня в репозитарии, подключена субмодулем).

Спасибо всем, кто проявил терпение и дочитал эту статью до конца. Рад услышать ваши вопросы, приветствуется всевозможная помощь в совершенствовании алгоритма и, в особенности, кода.

Источники: BitTorrentSpecification.

UPD1. По результатам обсуждения мне стало понятно, что правильней будет не ломать существующие коллекции выдергиванием файлов на раздачу, а наоборот — создавать хардлинки в нужном для раздачи месте на файлы внутри упорядоченных коллекций (фильмо и дискографий, например). В дальнейшем программа будет работать именно так.

UPD2. Если у тех, кто пользовался этой утилитой, есть еще какие-то пожелания по функционалу или баг репорты, то прошу оставлять их на github в issue-трекере.


  • Обзоры
    47


  • Видео
    17


  • Вопросы
    77


  • Статьи
    11

Лучшие программы поиска торрентов и другие секреты нахождения нужных файлов



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

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

9.7

Интерфейс

Функционал

Удобство

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

В MediaGet также встроен медиаплеер, благодаря чему фильмы можно просматривать фильмы еще до того, как они закачаются целиком.

9

Интерфейс

Функционал

Удобство

А вот пример самой популярной программы для поиска и загрузки торрент файлов. Хотя, нужно сказать, что функция поиска здесь реализована не лучшим образом. Фактически, это интегрированные поисковые механизмы — вы можете выбрать InfoSpace, Google, Bing или BitTorrent. Мы рекомендуем использовать последние две, поскольку остальные предоставляют ссылки не на торренты, а, скорее, ответы на стандартные поисковые запросы.

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

8.3

Интерфейс

Функционал

Удобство

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

В сравнении с uTorrent приложение обладает не столь широким функционалом. Однако именно отсутствие множества настроек и упрощенный интерфейс привлекает многих неискушенных пользователей. В дополнение ко всему BitTorrent позволяет настроить выключение компьютера по завершению загрузок.

7.7

Интерфейс

Функционал

Удобство

А вот еще один торрент-клиент, который, кроме прочего, способен работать через прокси. Он характеризуется несколько перегруженным интерфейсом, а также тем, что некоторые трекеры блокируют его работу. Вместе с тем, программа позволяет значительно увеличить скорость загрузки по сравнению с аналогами. Вот за это многие её и выбирают.
Что касается поиска, то он у BitComet также не свой — тут придётся полагаться на интегрированные поисковые системы.

8.3

Интерфейс

Функционал

Удобство

Эта программа считается достаточно мощным BitTorrent и P2P-клиентов, поскольку работает со всеми распространенными протоколами, предназначенными для закачки файлов из Сети. В их числе BitTorrent, eDonkey и Gnutella. Возможна загрузка файлов из разных протоколов одновременно. Расширенный поиск позволяет находить файлы не только на web-серверах, но и на компьютерах обычных пользователей. При этом можно выставить такие критерии как протокол, размер, тип. Каждый поиск выполняется в отдельном окне — таким образом, вы не потеряете то, что искали. Доступны рейтинги и описание. Возможен предпросмотр во встроенном плеере.

9

Интерфейс

Функционал

Удобство

Vuze может выступить достойной альтернативой uTorrent, поскольку кроме стандартных опций предлагает также подписку на выход новых эпизодов сериалов или телешоу, быстро отправлять загруженные файлы на мобильные устройства и проигрывать фильмы в HD-плеере.
А самое главное — вы сможете воспользоваться интеллектуальным метапоиском, который предоставляет исключительно ссылки на торренты. Вы сразу сможете увидеть размер, качество и рейтинг интересующих файлов.

9.3

Интерфейс

Функционал

Удобство

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

8.7

Интерфейс

Функционал

Удобство

Возможности HAL действительно впечатляют — программа обладает мощным функционалом для поиска, сохранения и загрузки торрент-файлов. Поиск торрент-файлов в ней ведется одновременно по всем нескольким трекерам — а вы можете указать, какие именно стоит сканировать. Особенно удобно то, что от пользователя не требуется авторизация на сайтах-трекерах, даже на rutracker.org или tfile.me. То есть, беспокоиться о рейтинге тоже не стоит. Приложение позволяет совершать бесконечное множество загрузок в день.

Перед тем как искать торрент файлы в Интернете, имейте в виду — чтобы получить ожидаемый результат, необходимо воспользоваться именно поиском по торрентам. Наилучшим образом эта опция реализована в MediaGet, Vuze и Zona. Несмотря на обилие торрент-клиентов, большинство пользователей предпочитают находить торрент-файлы в поисковых системах, в частности в Google. В этом случае мы рекомендуем водить запрос «filetype:torrent» и затем добавить к нему название интересующего файла. Это будет эффективнее, чем ввести название файла и добавить слово «торрент».

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти процентную концентрацию вещества в растворе
  • Как на приусадебном участке найти воду
  • Как в перми найти место захоронения
  • Как найти свое постановление об административном правонарушении
  • Как составить портфель роста

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии