- PVSM.RU - https://www.pvsm.ru -
В контексте последних законов, событий и тенденций как никогда очевидна ценность рутрекера как базы данных различного контента, а не как конкретного ресурса. К сожалению все мои призывы к администрации рутрекера предоставить общедоступный, полный, удобный дамп их базы наткнулся на полное [1] непонимание [2] с их стороны. Выкладывать нечто, что они называют зашифрованной «базой» [3] — я не считаю решением проблемы по причинам, изложенным в вышеприведенных ветках обсуждения и продублированным ниже.
К сожалению, решить проблему своими силами у меня не хватило ни времени, ни, будем откровенны, знаний. Но к счастью, мои слова возымели действие на людей, которые и тем и другим обладают. В итоге эти люди организовались и сообща сделали то, о чём так долго говорили большевики о чем я писал, а именно с помощью скриптов обошли рутрекер, сдампили все описания раздач с хешами, распарсили их и скомпоновали в удобную для употребления базу. В дополнение к этому так же была написана «морда»: программа для удобной работы с базой конечных пользователей, не знающих с какого конца держат grep. К сожалению, аккаунта на хабре никто из этой команды не имеет (если не считать read-only [4]), в песочнице статья могла бы потеряться, поэтому меня выбрали как рупор для данной площадки. Я, честно говоря, раздумывал совсем недолго и только над тем, как правильнее все сделать. Если будут какие-то вопросы — задавайте мне в комментах, я либо отвечу сам, либо переадресую разработчикам. Технические тексты от первого лица, но я имею к ним косвенное отношение, они оставлены в таком виде для простоты восприятия.
Прежде, чем перейти к технической части и ссылкам, хотел бы добавить, что весь смысл этой затеи в том, чтобы как можно больше людей сохранили эту базу к себе. Поэтому очень Вас прошу, скачать данные по ссылкам ниже (желательно использовать торрент) и оставаться на раздаче как можно дольше. Скорее всего в будущем база будет обновляться, но этот момент еще не продуман до конца.
Число раздач в базе: 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.
Исходники [5]. Лицензия GNU GPL v2. Присылайте пулл-реквесты.
Программа написана на языке C++ с использованием библиотек Qt и kdelibs [6] (для работы с архивами). Главная часть программы это таблица, в которой отображаются раздачи (используется QTableWidget [7]). Сверху имеется поле для ввода поисковой фразы. Поиск (чтение файла с таблицей и отбор подходящих строк) происходит в отдельном потоке выполнения (thread), результаты порциями отправляются в основной поток, добавляющий новые строки в таблицу. Для передачи результатов между потоками используется соединение типа Qt::QueuedConnection [8]. Когда файл дочитан до конца или отобрано необходимое число результатов, то в основной поток отправляется сообщение о том, что поиск завершен. После этого таблица пересортировывается. Прервать поиск можно кнопкой Стоп, расположенной сверху во время поиска.
Файл с таблицей может быть сжат в gzip, bzip2 или lzma/xz (под windows, к сожалению, последний вариант не поддерживается в нашей сборке). Файл распаковывается и просматривается на лету, без полной распаковки и создания временных файлов. Это реализовано при помощи класса KFilterDev [9] из библиотеки kdelibs [6]. Было выяснено, что gzip и xz дают намного лучшую скорость распаковки, чем bzip2, поэтому от последнего отказались при выборе формата, в котором база будет распространяться. Gzip показал скорость, в разы большую xz, и присутствовал на windows в используемом варианте библиотеки kdelibs [6]. Поэтому выбор пал на gzip, несмотря на проигрыш в сжатии в полтора раза. Пользователь может распаковать таблицу самостоятельно или использовать соответствующую опцию меню, чтобы хранить на диске таблицу без сжатия. Кстати, не факт, что это приведет к ускорению поиска, так как больший объекм данных будет считываться с жесткого диска при поиске, а чтение с жесткого диска может быть медленнее, чем распаковка gzip.
Рассмотрим таблицу. Думаю, значение столбцов не нужно объяснять. По всем столбцам можно сортировать, а по умолчанию результаты отсортированы по количеству загрузок. Для реализации сортировки пришлось наследоваться от QTableWidgetItem и определять [10] операцию сравнения.
Если дважды щелкнуть по любой ячейке, значение в ней выделяется и становится пригодным для копирования.
Для просмотра описания раздачи — щелкните левой кнопкой мышки в любое поле, кроме номера раздачи и хеша. Описание будет отображено снизу (при помощи QWebView [11]).
Для загрузки страницы с раздачей и отображения её снизу, щелкните по номеру раздачи. Для копирования URL раздачи, щелкните по её номеру правой кнопкой мыши.
Для открытия магнитной ссСделать так, чтобы меню контекстное открывалось с QTableView я не смог.ть правую кнопку мыши быстрее, чем выбирать пункт из контекстного меню.
Реализация перехвата событий мыши на ячейках выполнена путем наследования от QItemDelegate [12] и определения [13] editorEvent [14]. Получение описания из соответствующего tar.gz реализовано [15] средствами класса KTar [16] из библиотеки kdelibs [6].
Программой можно пользоваться, не располагая базой описаний раздач, тогда просмотреть описание можно будет только через сайт, нажав по номеру раздачи.
Настройки программа хранит в файле dump_viewer.ini, расположенном в папке с программой.
Инструкции для сборки программы для ОС Debian GNU/Linux и ОС Windows находятся в файле INSTALL [17].
В ходе разработки программы забавный казус вышел с парсингом дат. Формат даты «16-Jul-11 06:23» нестандартный, но он был оставлен, потому что довольно краткий, читаемый и похож на тот, который использует rutracker в своей выдаче. Оказалось, что QDateTime::fromString [18] ожидает локализованные обозначения месяцев (Янв вместо Jan в русскоязычном окружении). Поэтому пришлось написать костыль [19], конвертирующий текстовые обозначения месяцев в числовые (Jan -> 01).
База была подготовлена, чтобы облегчить доступ пользователей к раздачам в случае проблем с доступностью сайта трекера. Например, когда выводится сообщение «форум временно отключен». Кроме того, эта раздача пригодится, если трекер будет внесен в список заблокированных сайтов. Не хочется, чтобы был даже мельчайший шанс того, что всё, что мы тут вместе сделали за эти годы, потерялось по прихоти чиновников или из-за поломки сервера, к примеру. Пока жива данная раздача, все раздачи трекера тоже живы. Вероятно, раз в месяц нужно будет обновлять эту раздачу.
rutracker [20] же написал, что шифрованная раздача у них на трекере лучше!
Ответ: (подробнее тут [1] и тут [2])
а) У нас есть описания раздач. Часто сложно бывает выбрать, например, BDRip, не глядя в описание. Ужимается база всех описаний до ~2 гигабайт. Можно было ужать сильнее, но решили не экономить в ущерб скорости работы «морды». (На самом деле есть еще несколько мыслей по оптимизации, но пока решили, что лучшее враг хорошего. Однако ж идеи и коммиты привествуются!)
б) Даже если группа людей, которая знает пароль, распределена по всему миру — это конечная группа людей, которую можно вычислить и обладая нужными ресурсами купить или запугать.
в) Администрация рутрекера и лично intellect бесспорно бесконечно честные люди, но пока я сам не увижу, что в раздаче именно база рутрекера, а не зашифрованный белый шум — я никому не поверю. Уж извините.
г) Нет проблемы фейковых сайтов и поддельных магнитных ссылок. Базу может сделать не только администрация (наша база тому пример), так что шифрованность базы на рутрекере не спасает. А валидность хешей в базе проверяется либо по контрольным суммам (с GPG-подписью), либо банальным сравнением с самим рутрекером (если он все еще доступен).
д) Для того, чтобы в базе были актуальные раздачи — базу банально надо обновлять. Чем чаще, тем лучше. И если администрация рутрекера действительно заботится о том, чтоб пользователи получали актуальную информацию, надеюсь они не будут чинить препятствий в обновлении нашей базы. А то и помогут, чем черт не шутит.
Следующий логичный шаг — сделать генератор HTML[PHP]-сайта, дублирующего функциональность программы и базы. После этого мы хотим замахнуться на статическую реализацию всех частей сайта, то есть чистый HTML/CSS/JS, без PHP или подобной серверной логики. Это позволит заливать сайт практически на любой
Проделать подобное для других трекеров. Для пиратской бухты уже сделали [22]. Когда база данных рутрекера будет дочищена, можно перейти к другим отечественным и иностранным трекерам. Можно подумать, как все базы объединить в одну (видимо, по файлу на трекер, чтобы было удобно выбирать нужные трекеры при скачивании).
Распределенное обновление базы раздач. Разумеется, нужно периодически обновлять базу: добавляются новые раздачи, обновляются старые. А почему бы не переложить задачу обновления на пользователей? Само собой, тех, кто на это согласится. Во-первых, наши каналы не резиновые, чтобы самим постоянно дампить трекер(ы). Во-вторых, трекеры нескольких пауков могут и обнаружить с последующим баном и, возможно, разбирательством. а если пауков будет 100, то каждый из них будет забирать новые раздачи слишком медленно, чтобы это можно было обнаружить. Для пользователя это будет выглядеть как пункт в программе «Принять участие в обновлении базы» и ввод данных для входа в свой аккаунт. Дальше программа всё сделает сама. Найденные свежие раздачи и изменения в старых будут отправляться в центр, который после их проверки будет добавлять данные в общую базу.
Кстати, интересная задачка по теории вероятности: если N раздач наугад качают M независимых пауков со скоростью X раздач в сутки, то через какое время (ожидаемое) они выкачают долю Y всех раздач?
bitbucket [23] (исходники и база раздач без описаний)
mega.co.nz [24] (только база описаний, распаковать основной tar в папку с программой)
Торренты (все в одном):
i2p (в процессе заливки и индексации)
thepiratebay (пока почему-то не принимает torrent-файл)
rutor [25]
opensharing [26]
rutracker (ждем реакции администрации)
sha256-хеши всех файлов раздачи: sha256.txt
актуальный sha256.txt и sha256.txt.asc можно взять в торренте и тут [27].
GPG fingerprint: C567 227F 6D75 014E CDC0 FE7B E0F9 25D1 E020 95A4
e-mail: sir.ratnik@yandex.ru
Jabber: sir.ratnik@ya.ru
OTR fingerprint: 7503B021 02E30FEA 88861B43 7AB21676 35704DBA
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
=Peeh
-----END PGP PUBLIC KEY BLOCK-----
P.S. Хотелось бы выразить благодраность команде LAVteam за техническую поддержку.
Автор: J_o_k_e_R
Источник [28]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/kopirajt/44445
Ссылки в тексте:
[1] полное: http://habrahabr.ru/post/184206/#comment_6405678
[2] непонимание: http://habrahabr.ru/post/194186/#comment_6741942
[3] зашифрованной «базой»: http://rutracker.org/forum/viewtopic.php?t=4204390
[4] read-only: http://habrahabr.ru/users/ratnik0/
[5] Исходники: https://bitbucket.org/ratnik/dump_viewer/src
[6] kdelibs: http://api.kde.org/4.x-api/kdelibs-apidocs/
[7] QTableWidget: http://qt-project.org/doc/qt-4.7/qtablewidget.html
[8] Qt::QueuedConnection: http://www.doc.crossplatform.ru/qt/4.6.x/qt.html#ConnectionType-enum
[9] KFilterDev: http://api.kde.org/4.0-api/kdelibs-apidocs/kdecore/html/classKFilterDev.html
[10] определять: https://bitbucket.org/ratnik/dump_viewer/src/2ea4e0bbeda8ff6d6ab11423f7e3847038c322e6/mainwindow.cpp?at=default#cl-50
[11] QWebView: http://qt-project.org/doc/qt-5.0/qtwebkit/qwebview.html
[12] QItemDelegate: http://qt-project.org/doc/qt-5.0/qtwidgets/qitemdelegate.html
[13] определения: https://bitbucket.org/ratnik/dump_viewer/src/2ea4e0bbeda8ff6d6ab11423f7e3847038c322e6/mainwindow.cpp?at=default#cl-75
[14] editorEvent: http://qt-project.org/doc/qt-5.0/qtwidgets/qabstractitemdelegate.html#editorEvent
[15] реализовано: https://bitbucket.org/ratnik/dump_viewer/src/2ea4e0bbeda8ff6d6ab11423f7e3847038c322e6/mainwindow.cpp?at=default#cl-602
[16] KTar: http://api.kde.org/4.7-api/kdelibs-apidocs/kdecore/html/classKTar.html
[17] INSTALL: https://bitbucket.org/ratnik/dump_viewer/src/tip/INSTALL
[18] QDateTime::fromString: http://qt-project.org/doc/qt-5.0/qtcore/qdatetime.html#fromString-2
[19] костыль: https://bitbucket.org/ratnik/dump_viewer/src/2ea4e0bbeda8ff6d6ab11423f7e3847038c322e6/mainwindow.cpp?at=default#cl-324
[20] rutracker: http://habrahabr.ru/users/rutracker/
[21] хостинг: https://www.reg.ru/?rlink=reflink-717
[22] уже сделали: http://habrahabr.ru/post/137929/
[23] bitbucket: https://bitbucket.org/ratnik/dump_viewer
[24] mega.co.nz: https://mega.co.nz/#!iQ0jiBhR!M9V1zSwrXdSabefc8sC1fUb1lSJRNjdnpoCNfZ_kebo
[25] rutor: http://rutor.org/torrent/306663
[26] opensharing: http://opensharing.org/torrent/105846/
[27] тут: https://bitbucket.org/ratnik/dump_viewer/downloads
[28] Источник: http://habrahabr.ru/post/195454/
Нажмите здесь для печати.