Как стать автором
Обновить

ABCat: OpenSource каталогизатор и загрузчик аудиокниг

Время на прочтение7 мин
Количество просмотров17K
Аудиокниги я открыл для себя пять лет назад и с тех пор слушаю их практически ежедневно. Конечно, ничто не сравнится с печатной книгой, но в ежедневной круговерти на них просто не остается времени. Под аудиокниги я езжу в общественном транспорте, выполняю рутинную работу по дому, делаю ремонт — в общем практически всё, что не требует общения с кем-либо или концентрации внимания.

Основным источником книг для меня стал rutracker.org (тогда еще torrents.ru). Там достаточно строгая модерация, стандартизированное оформление, большое количество отзывов под каждой книгой. Но однажды я заметил что поиск интересных книг начинает отнимать всё больше и больше времени, по нескольким причинам.
Во-первых раздачи сортируются не в порядке добавления, а в порядке обновления. Из-за этого всё постоянно перемешивается и нужно пролистывать много страниц в поисках непрочитанных книг.

Отделять прочитанное от непрочитанного первое время позволял браузер, меняя цвет ссылок, по которым я уже переходил. Но после смены домена на rutracker цветовая дифференциация штанов раздач слетела, что точно не упростило процесс поиска.

Разделение книг по форумам тоже довольно неудобно. Фантастику, например, разделили на русскую и зарубежную, хотя лично мне удобнее было бы по жанрам. В результате приходится на глаз выискивать любимую НФ среди фентези, S.T.A.L.K.E.Rа и др.

Знакомая проблема?

Лирическое отступление

Однажды я подумал, что написание утилиты для каталогизации аудиокниг займёт меньше времени, чем его теряется при постоянном поиске вручную. Приложение было написано и я пользовался им последние 4 года, понемногу дорабатывая.
После довольно неожиданной поддержки моего комментария к статье Спасем крупнейшую медиатеку в рунете. Вся база rutracker у Вас на компьютере стало понятно, что любителей аудиокниг не так уж и мало. Я решил привести в какое-то подобие порядка бессистемно писанный код, продумать архитектуру и расширяемость, выбросить всю проприетарщину, после чего выложить релиз с исходниками.

Эту яхту я решил назвать ABCat. Тут и AudioBooks Catalog, и ABC простота, и, конечно же, всеми любимые котики.
По совету Nashev статья не столько о разработке, сколько обзор функционала.

Приложение написано на .Net Framework, C#. Изначально интерфейс был построен на триальной версии DevExpress. Кушать она просила, но не очень настойчиво — за триальный месяц я успел устаканить GUI, а большего и не требовалось. DevExpress подкупал мощнейшей системой фильтрации списка, что кардинально упрощало поиск.
Понятно, что для вывода в опенсорсный свет весь GUI пришлось полностью выбросить и написать новый, с WPF и MVVM, заодно поближе познакомиться и с тем, и с другим.
Что можно сказать о том, что получилось? Ну разве что «Графический интерфейс пользователя, 1 шт.». Штука эта сугубо утилитарная, написана с использованием открытых бесплатных компонентов, но свои задачи выполняет.
На момент снятия скриншотов не заметил, что забыл подписать Title у окна. На скринах его нет, в релизе есть.



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

Больше подробностей о работе с программой
Доступные инструменты

Список книг

Обычный грид, с колонками атрибутов.

Группировка

Сейчас доступны 3 логики группировки:
  • По автору (авторы сгруппированы по первой букве полного имени)
  • Форум ► Автор
  • Форум ► Жанр

После выбора группы список автоматически фильтруется по её содержимому.

Фильтр

В фильтре можно задать необходимые параметры поиска. Некоторые поля имеют вид выпадающего списка — там уже содержатся все возможные значения и это комбобокс с быстрым поиском. Все поля фильтра объединяются по «И», т.е. в список после фильтрации попадает только то, что соответствует сразу всем полям поиска. Ищется любое вхождение строки.
Поле «Длительность» довольно хитрое. Если ввести туда "> 10 часов", то в список попадут только те книги, в которых автор раздачи указал длительность воспроизведения более 10 часов.
Есть некоторые оговорки. Во-первых длительность задана не для всех раздач, во-вторых указывается она в совершенно свободной форме (например «11 часов 5 минут» или «11:05:00» или как-то еще), поэтому есть логика парсинга времени, понимающая большинство (около 99%) вариантов написания, принятых на сайте. Возможно не всё понимает правильно (пока не нашел такого), но в целом получается очень удобный инструмент.
И как раз благодаря этому парсеру в фильтр можно забивать время в любом удобном виде.

Чекбоксы:
  • Загружено. Если он не отмечен, то в список не попадают уже загруженные книги.
  • Скрыто. Фильтрует записи по признаку «скрытая» (сам признак задается в списке через контекстное меню).
  • Применить. Можно включать/отключать фильтрацию записей без потери содержимого фильтра.

Редактор автозамены

18 сравнительно правильных способов указать, что книгу написали братья Стругацкие



При импорте данные проходят нормализацию. Для этого значения полей сверяются со списками автозамены и заменяются на правильный вариант.



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



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



Дерево автозамены.

Сами списки хранятся в отдельном файле БД и можно взять уже чей-то готовый вариант или настроить свой. Имеется пока еще не реализованная идея импорта списка с объединением, а не заменой всех списков целиком.

Обновление базы происходит в два этапа:
  • Загрузка списка записей. Для этого скачиваются все страницы со списками раздач, из них вытаскивается базовая информация о книге — ссылка на полную страницу раздачи и название. Для форумов rutracker первая операция занимает около 20 минут — необходимо скачать и обработать около 400 страниц.
  • Загрузка полной информации о записях. По ссылкам, полученным на первом этапе, скачиваются страницы с полной информацией. Их гораздо больше — около 18 тысяч.



Процесс обновления запускают два пункта в главном меню приложения (под пунктом «Каталог»).
Крайне рекомендуется скачать уже наполненную актуальную версию каталога (по ссылкам внизу), а после периодически запускать обновление.
Скорость скачивания полных страниц специально ограничена (не более 20 страниц в минуту). Просто для того, чтобы ребята с рутрекера не сильно обижались. Защита очень проста и при наличии исходников легко снимается, но тому, кто сможет её найти и отключить, для DDoS рутрекера и не нужен такой извращённый способ — достаточно пяти строк кода.

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



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

Скачивание

Закачка выбранной книги запускается из контекстного меню списка.

Для скачивания потребуется логин и пароль пользователя рутрекера. Логины и пароли нигде не хранятся и никуда не отправляются (кроме, понятное дело, самого рутрекера). ABCat запускает uTorrent с параметрами командной строки и закачка начинается автоматически. Скачанная раздача попадает в папку библиотеки, путь к библиотеке задается при первом запуске программы. В библиотеке книги раскладываются по папкам в соответствии с автором.



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

Немного технических подробностей

Практически вся логика в ABCat реализована через плагины. Они делятся на три основные группы:
  • UI — Плагины для пользовательского интерфейса
  • Site — Плагины для операций с источниками контента и наполнения БД
  • Catalog — Плагины для операций с каталогом контекта

В плагинах можно реализовать поддержку других сайтов, другую логику нормализатора, группировки, фильтрации и т.д. Более подробно о плагинах читайте на главной странице проекта.
Страница релиза на Codeplex.
Прямая ссылка на релиз и базу данных каталога от 20.10.201
База данных кешированных страниц на Google Drive (осторожно, 200MB)
Ссылка на исходники.

Начало работы:

  1. Скачать релиз, базу данных каталога и кеша страниц.
  2. Распаковать релиз в любую папку на диске.
  3. Скачать и распаковать базы данных каталога и кеша страниц туда, где будет удобно хранить 250+ мегабайт баз данных. У пользователя должны быть права на запись по этому пути.
  4. Запустить ABCat.exe. При первом запуске программа предложит задать основные настройки. Обязательно нужно указать пути к файлам базы данных, каталогу и uTorrent.exe. Если после запуска вы наблюдаете сообщение «Не удалось найти запрошенного провайдера данных..», то вам необходимо установить клиент SQL Ce по этой ссылке.
  5. Пользоваться.

Внимание! ABCat написан на .Net Framework 4.5, который не поддерживается операционными системами ниже Windows Vista (т.е. на XP запустить не получится). В гугле попадаются ссылки на загадочные репаки .Net Framework 4.5 под XP, но не пробовал — не знаю.
Кроме того следует понимать, что программа написана только что, в свободное время, и никто кроме меня ею не пользовался. Проект не является коммерческим. Спутников Mail.ru, тулбаров Yandex установить не предлагает, рекламу не показывает, донейтов не просит. Поэтому просьба отнестись с пониманием к возможным (и, нужно сказать, весьма вероятным) ошибкам в её работе. Обо всех ошибках просьба сообщать любым удобным способом (лучше всего вот сюда).

Новая информация. Обнаружена причина проблем на Win7, она заключается в теме оформления списка записей. В результате список не отрисовывается. Ошибка поправлена, и необходимо повторить все шаги с начала (ссылки в теме новые). Файл кеша страниц тоже нужно скачать заново из-за перехода на актуальную версию Entity Framework.
Кроме этого, если после загрузки программы появляется сообщение «Не удалось найти запрошенного провайдера данных...», то необходимо скачать и установить клиент Microsoft SQL Ce по этой ссылке. Выберите версию x64 или x86 в зависимости от версии операционной системы.

Всем спасибо за фидбек!

Перед скачиванием книги убедитесь в том, что автор релиза позаботился о соблюдении авторских прав на неё.
И не уходите с раздачи.
Теги:
Хабы:
Всего голосов 24: ↑24 и ↓0+24
Комментарии45

Публикации

Истории

Работа

.NET разработчик
49 вакансий

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань