Спасем крупнейшую медиатеку в рунете. Вся база rutracker у Вас на компьютере

:

image

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

К сожалению, решить проблему своими силами у меня не хватило ни времени, ни, будем откровенны, знаний. Но, к счастью, мои слова возымели действие на людей, которые и тем и другим обладают. В итоге эти люди организовались и сообща сделали то, о чём так долго говорили большевики о чем я писал, а именно с помощью скриптов обошли рутрекер, сдампили все описания раздач с хешами, распарсили их и скомпоновали в удобную для употребления базу. В дополнение к этому так же была написана «морда»: программа для удобной работы с базой конечных пользователей, не знающих с какого конца держат grep. К сожалению, аккаунта на хабре никто из этой команды не имеет (если не считать read-only), в песочнице статья могла бы потеряться, поэтому меня выбрали как рупор для данной площадки. Я, честно говоря, раздумывал совсем недолго и только над тем, как правильнее все сделать. Если будут какие-то вопросы — задавайте мне в комментах, я либо отвечу сам, либо переадресую разработчикам. Технические тексты от первого лица, но я имею к ним косвенное отношение, они оставлены в таком виде для простоты восприятия.

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

Описание формата хранения базы раздач

Число раздач в базе: 1411636

Имеется два места хранения: таблица и база описаний.

В таблице хранится номер раздачи на рутрекере, название раздачи, приблизительный размер в байтах, число сидов, число пиров, хеш в формате base32, число скачиваний и дата обновления раздачи. Размер раздачи приблизительный, так как он был получен парсингом строк вида «2.05 GB». К сожалению, не было найдено способа узнать точный размер из исходного кода страницы раздачи. Название раздачи закодировано в UTF-8, чтобы на системах, где стандартной является эта кодировка, файл можно было смотреть less'ом без дополнительных манипуляций. Хеш раздачи в base32, чтобы занимало меньше места. В графической программе для просмотра базы есть возможность переключения отображения хеша (в том числе, в magnet-ссылках) на HEX. Разделитель полей: TAB. Все пробельные символы в именах раздач заменялись на пробелы. Все HTML-конструкции в названиях заменялись на соответствующие символы юникода, это ещё одна из причин, почему от cp1251 отказались в пользу UTF-8. Дата кодируется в формате: «16-Jul-11 06:23». Английские названия месяцев выбраны, чтоб было меньше заморочек с парсингом.
Пример:

4085734 [x86] Ubuntu 12.04 Classic Remix        1170378588      206     3       Y4R4DX74NPXBKU6NECLJLV2N733F2NBW        20911   06-Jun-12 13:02

База описаний представляет собой коллекцию tar.gz-файлов, в каждом из которых лежат раздачи с шагом номера 1000. gzip выбран из-за скорости и неприхотливости к объему оперативной памяти. Архивные файлы сгруппированы по 100 штук в папки. Описание раздачи с номером 1234567 лежит в файле 012/01234.tar.gz/01234567 в кодировке UTF-8.

Программа

Исходники. Лицензия GNU GPL v2. Присылайте пулл-реквесты.

Программа написана на языке C++ с использованием библиотек Qt и kdelibs (для работы с архивами). Главная часть программы это таблица, в которой отображаются раздачи (используется QTableWidget). Сверху имеется поле для ввода поисковой фразы. Поиск (чтение файла с таблицей и отбор подходящих строк) происходит в отдельном потоке выполнения (thread), результаты порциями отправляются в основной поток, добавляющий новые строки в таблицу. Для передачи результатов между потоками используется соединение типа Qt::QueuedConnection. Когда файл дочитан до конца или отобрано необходимое число результатов, то в основной поток отправляется сообщение о том, что поиск завершен. После этого таблица пересортировывается. Прервать поиск можно кнопкой Стоп, расположенной сверху во время поиска.

Файл с таблицей может быть сжат в gzip, bzip2 или lzma/xz (под windows, к сожалению, последний вариант не поддерживается в нашей сборке). Файл распаковывается и просматривается на лету, без полной распаковки и создания временных файлов. Это реализовано при помощи класса KFilterDev из библиотеки kdelibs. Было выяснено, что gzip и xz дают намного лучшую скорость распаковки, чем bzip2, поэтому от последнего отказались при выборе формата, в котором база будет распространяться. Gzip показал скорость, в разы большую xz, и присутствовал на windows в используемом варианте библиотеки kdelibs. Поэтому выбор пал на gzip, несмотря на проигрыш в сжатии в полтора раза. Пользователь может распаковать таблицу самостоятельно или использовать соответствующую опцию меню, чтобы хранить на диске таблицу без сжатия. Кстати, не факт, что это приведет к ускорению поиска, так как больший объекм данных будет считываться с жесткого диска при поиске, а чтение с жесткого диска может быть медленнее, чем распаковка gzip.

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

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

Для просмотра описания раздачи — щелкните левой кнопкой мышки в любое поле, кроме номера раздачи и хеша. Описание будет отображено снизу (при помощи QWebView).
Для загрузки страницы с раздачей и отображения её снизу, щелкните по номеру раздачи. Для копирования URL раздачи, щелкните по её номеру правой кнопкой мыши.
Сделать так, чтобы при нажатии правой кнопки мыши в ячейке с номером и хешом раздачи появлялось контекстное меню с пунктом «Скопировать ссылку», не удалось. Может быть, кто-нибудь из читателей знает, как можно этого добиться от QTableView. Впрочем, можно оставить как есть, так как нажать правую кнопку мыши быстрее, чем выбирать пункт из контекстного меню.

Реализация перехвата событий мыши на ячейках выполнена путем наследования от QItemDelegate и определения editorEvent. Получение описания из соответствующего tar.gz реализовано средствами класса KTar из библиотеки kdelibs.

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

Настройки программа хранит в файле dump_viewer.ini, расположенном в папке с программой.
Инструкции для сборки программы для ОС Debian GNU/Linux и ОС Windows находятся в файле INSTALL.

В ходе разработки программы забавный казус вышел с парсингом дат. Формат даты «16-Jul-11 06:23» нестандартный, но он был оставлен, потому что довольно краткий, читаемый и похож на тот, который использует rutracker в своей выдаче. Оказалось, что QDateTime::fromString ожидает локализованные обозначения месяцев (Янв вместо Jan в русскоязычном окружении). Поэтому пришлось написать костыль, конвертирующий текстовые обозначения месяцев в числовые (Jan -> 01).

Зачем мы это сделали?

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

rutracker же написал, что шифрованная раздача у них на трекере лучше!
Ответ: (подробнее тут и тут)
а) У нас есть описания раздач. Часто сложно бывает выбрать, например, BDRip, не глядя в описание. Ужимается база всех описаний до ~2 гигабайт. Можно было ужать сильнее, но решили не экономить в ущерб скорости работы «морды». (На самом деле есть еще несколько мыслей по оптимизации, но пока решили, что лучшее враг хорошего. Однако ж идеи и коммиты привествуются!)
б) Даже если группа людей, которая знает пароль, распределена по всему миру — это конечная группа людей, которую можно вычислить и обладая нужными ресурсами купить или запугать.
в) Администрация рутрекера и лично intellect бесспорно бесконечно честные люди, но пока я сам не увижу, что в раздаче именно база рутрекера, а не зашифрованный белый шум — я никому не поверю. Уж извините.
г) Нет проблемы фейковых сайтов и поддельных магнитных ссылок. Базу может сделать не только администрация (наша база тому пример), так что шифрованность базы на рутрекере не спасает. А валидность хешей в базе проверяется либо по контрольным суммам (с GPG-подписью), либо банальным сравнением с самим рутрекером (если он все еще доступен).
д) Для того, чтобы в базе были актуальные раздачи — базу банально надо обновлять. Чем чаще, тем лучше. И если администрация рутрекера действительно заботится о том, чтоб пользователи получали актуальную информацию, надеюсь они не будут чинить препятствий в обновлении нашей базы. А то и помогут, чем черт не шутит.

Дальнейшие планы

Следующий логичный шаг — сделать генератор HTML[PHP]- сайта, дублирующего функциональность программы и базы. После этого мы хотим замахнуться на статическую реализацию всех частей сайта, то есть чистый HTML/CSS/JS, без PHP или подобной серверной логики. Это позволит заливать сайт практически на любой хостинг, в том числе бесплатный, что сделает в принципе невозможным искоренение данной базы из сети. На тему реализации поиска на JavaScript уже есть идеи (к примеру, сделать индекс раздач по словам, разбить его на отдельные файлы, балансируя между средним размером одного файла и общим числом файлов). Можно добавить и полноценную реализацию поиска на стороне сервера. К сожалению толковых веб-разработчиков у нас нет, ищутся желающие.

Проделать подобное для других трекеров. Для пиратской бухты уже сделали. Когда база данных рутрекера будет дочищена, можно перейти к другим отечественным и иностранным трекерам. Можно подумать, как все базы объединить в одну (видимо, по файлу на трекер, чтобы было удобно выбирать нужные трекеры при скачивании).

Распределенное обновление базы раздач. Разумеется, нужно периодически обновлять базу: добавляются новые раздачи, обновляются старые. А почему бы не переложить задачу обновления на пользователей? Само собой, тех, кто на это согласится. Во-первых, наши каналы не резиновые, чтобы самим постоянно дампить трекер(ы). Во-вторых, трекеры нескольких пауков могут и обнаружить с последующим баном и, возможно, разбирательством. а если пауков будет 100, то каждый из них будет забирать новые раздачи слишком медленно, чтобы это можно было обнаружить. Для пользователя это будет выглядеть как пункт в программе «Принять участие в обновлении базы» и ввод данных для входа в свой аккаунт. Дальше программа всё сделает сама. Найденные свежие раздачи и изменения в старых будут отправляться в центр, который после их проверки будет добавлять данные в общую базу.
Кстати, интересная задачка по теории вероятности: если N раздач наугад качают M независимых пауков со скоростью X раздач в сутки, то через какое время (ожидаемое) они выкачают долю Y всех раздач?

Ссылки и контакты

bitbucket (исходники и база раздач без описаний)
mega.co.nz (только база описаний, распаковать основной tar в папку с программой)

Торренты (все в одном):
i2p (в процессе заливки и индексации)

Магнитная ссылка

magnet:?xt=urn:btih:KY33A26BTGUNAE2D3YWET3UYYGFPP4QU&dn=release&tr=http%3a%2f%2fannounce.opensharing.org%3a2710%2fannounce&tr=udp%3a%2f%2ftracker.publicbt.com%3a80%2fannounce&tr=udp%3a%2f%2ftracker.openbittorrent.com%3a80


opensharing
rutracker

sha256-хеши всех файлов раздачи: sha256.txt
актуальный sha256.txt и sha256.txt.asc можно взять в торренте и тут.
GPG fingerprint: C567 227F 6D75 014E CDC0 FE7B E0F9 25D1 E020 95A4
e-mail: sir.ratnik@yandex.ru
Jabber: sir.ratnik@ya.ru
Jabber-конференция: torrents-database@conference.jabber.no
OTR fingerprint: 7503B021 02E30FEA 88861B43 7AB21676 35704DBA

GPG-key
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.12 (GNU/Linux)

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
=Peeh
-----END PGP PUBLIC KEY BLOCK-----

P.S. Хотелось бы выразить благодарность команде LAVteam за техническую поддержку.
UPD: Так же большое спасибо init0 за инвайт для непосредственного представителя команды разработчиков — ratnik0. Вы не однофамильцы, кстати? ;)
UPD2: Если у кого-то под виндой программа требует ssleay32.dll, то Вам поможет установка библиотек openssl.
UPD3: Создали джаббер-конференцию для координации сочувствующих и обсуждения дальнейших планов: torrents-database@conference.jabber.no
UPD4: Кто голосовал за дамп порнолаба? Нужна Ваша помощь — ждем в конференции.
UPD5: rutor удалил раздачу без объяснения причин.