Всем привет! Наверняка многим из вас знакома проблема уставших глаз из-за длительной работой за компьютером. К сожалению, из-за этого приходится ограничивать себя в других занятиях. Одним из них есть чтение книг. В связи с этим, я уже более 5 лет почти каждый день слушаю аудиокниги. За это время научился параллельно заниматься чем-то и вникать в суть озвучки. Сейчас я даже в спортзале слушаю книги! Представьте как это удобно: час дороги пешком туда и обратно + полтора часа упражнений. Средняя книга в районе 10-15 часов записи.

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



Источник информации


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

Выбор книги


Следующей целью было создание широкого фильтра для подбора книги. Удобные фильтры помогут сменить подход к выбору книги. Если раньше вы просто находили себе вариант, а потом искали его аудиокнигу (которой могло не оказаться), то теперь вы исключаете первый пункт и ищете в базе максимально всех существующих книг. Конкретно сейчас у меня получилось сделать следующий набор фильтров:
  • Семантический глобальный поиск по всей базе по всем текстовым полям
  • Сортировка (asc/desc) по дате создания торрента, количеству просмотров (на сайте), рейтингу (из внешних источников), количество загрузок (по данным рутрекера), ну и наугад
  • Фильтр по автору произведения, автору озвучки, жанрам, и возможность исключить книги, которые вы отметили как «прочитанное»
  • Возможность подписки на авторов книг или озвучки. Да-да! Вы можете выбрать понравившегося исполнителя и подписаться на все его обновления. Я, например, мониторю все книги Игоря Князева


База рутрекера


Итак, первый пункт это анализ публикаций рутрекера и формирование базы. Для хранилища выбрал MongoDB. Во-первых, идеально для кучи не особо связанных данных, во-вторых, идеально показала себя в плане производительности. Да и вообще разрабатывать сайт с простым «пробрасыванием» json с UI на базу очень просто и занимает минимальное время. Кстати, в MongoDB 3.2 добавили left outer join.
Основной сложностью было унифицирование информации. Рутрекер хоть и заставляет оформлять раздачи (за что им спасибо), но все равно за 10 лет (именно столько времени прошло с момента публикации первой аудиокниги) оформление отличается. Пришлось открывать наугад разные разделы и собирать возможные варианты.

Скрипт парсера написан на питоне, для эмуляции браузера библиотека mechanize, для работы с DOM — BeautifulSoup.
Метод, который возвращает объект максимально эмулирующий поведение обычного браузера. Второй метод получает объект браузера, авторизируется на рутрекере и возвращает этот самый объект, внутри которого уже хранятся cookies авторизации.

 def getBrowser():
    br = mechanize.Browser()
    cj = cookielib.LWPCookieJar()
    br.set_cookiejar(cj)
    br.set_handle_equiv(True)
    br.set_handle_gzip(True)
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_robots(False)

    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

    br.addheaders = [
        ('User-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2327.5 Safari/537.36'),
        ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'),
        ('Accept-Encoding', 'gzip, deflate, sdch'),
        ('Accept-Language', 'ru,en;q=0.8'),
    ]

    return br

def rutrackerAuth():
    params = {u'login_username': '...', u'login_password': '...', u'login' : ''}
    data = urllib.urlencode(params)

    url = 'http://rutracker.org/forum/login.php'
    browser = getBrowser()
    browser.open(url, data)
    
    return browser


Сам по себе сбор данных выглядит как набор регулярных выражений в разных вариациях:

yearRegex = r'Год .*(\d{4}?)'
result['year'] = int(re.search(yearRegex, descContent, re.IGNORECASE).group(1))

# Пример разбора даты создания торрента, где дата указана в русской локали
timeData = soupHandle.find('div', {'id' : 'tor-reged'}).find('span').encode_contents()
import locale
locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')
result['creationTime'] = datetime.datetime.strptime(timeData, u'[ %d-%b-%y  %H:%M ]')


Очень важно использовать BULK-запросы в mongo, чтобы парсер не нагружал единичными вставками базу. К счастью, все это делается очень просто:

BULK = tableHandle.initialize_unordered_bulk_op()

# Цикл...
    BULK.find({'_id' : book['_id']}).upsert().update({'$set' : result})

BULK.execute()


Поле slug генерируется пакетом slugify (pip install slugify).

Вот список всех полей для каждой из книг, которые я в итоге собрал:


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



Это замедлит время вставки, но очень ускорит выборку. Синхронизация базы происходит раз в день, поэтому второй вариант для сайта предпочтительней.

Загрузка данных происходит по всем подфорумам аудиокниг:

forums = [
    {'id' : '1036'},  {'id' : '400'},   {'id' : '574'},
    {'id' : '2387'}, {'id' : '2388'},  {'id' : '695'},
    {'id' : '399'}, {'id' : '402'},  {'id' : '490'},
    {'id' : '499'}, {'id' : '2325'},  {'id' : '2342'},
    {'id' : '530'}, {'id' : '2152'},  {'id' : '403'},
    {'id' : '716'}, {'id' : '2165'}
]

for i in xrange(pagesCount):
    url = 'http://rutracker.org/forum/viewforum.php?f='+forum['id']+'&start=' + str(i*50) + '&sort=2&order=1'



Нормализация базы


Данные мы скачали, но есть проблема: нет точности в указанных данных. Кто-то напишет «В. Герасимов», кто-то «Вячеслав Герасимов». В одном месте укажут полное или альтернативное название произведение. Также появился вопрос в получении независимой оценки произведения. Погуглил пару заголовков книг и посмотрел на выдачу первых сайтов. Одним из них оказался fantlab.ru, который строит оценку по голосам пользователей, имеет довольно внушительную базу книг, содержит полное описание жанра и поджанров книг, точное имя автора и произведения.


Имя автора, название книги


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


Стоит ли говорить, что даже исключив весь текст в угловых скобках встроенный поиск на fantlab не справляется и не находит ничего. Выход я нашел, хоть и не совсем изящный: phantomjs(selenium) + google.

У меня довольно много проектов используют эту связку, поэтому настроенный headless-браузер и базовые скрипты для selenium готовы были для использования. По сути, я брал заголовок с рутрекера, добавлял к нему приставку " fantlab" и гуглил. Первый результат, который по шаблону подходил по адресу произведения парсился. Оставлю пару замечаний по поводу phantomjs: очень сильно течет память. Я давно уже сделал для себя пару «костылей», которые позволяют процессу жить месяцами на сервере и не падать по причине нехватки памяти:

    def resourceRequestedLogic(self):
        driver.execute('executePhantomScript', {'script': '''
            var page = this;
            page.onResourceRequested = function(request, networkRequest) {
                if (/\.(jpg|jpeg|png|gif|tif|tiff|mov|css)/i.test(request.url))
                {
                    //console.log('Final with css! Suppressing image: ' + request.url);
                    networkRequest.abort();
                    return;
                }
            }
        ''', 'args': []})


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

    def clearDriverCache(self):
        driver.execute('executePhantomScript', {'script': '''
            var page = this;
            page.clearMemoryCache();
        ''', 'args': []})


Открываем гугл и вбиваем ему в поле поиска любой текст, чтобы сменить UI (получить результат выдачи). Все дальнейшие запросы будут происходить на этой же странице.
driver.get('http://google.ru')
driver.find_element_by_css_selector('input[type="text"]').send_keys(u"Имя книги fantlab")
driver.find_element_by_css_selector('button').click()


Так как запросы все аяксовые, нам нужно вручную проверять факт загрузки. В selenium для этого есть некоторые методы, которые ожидают пока определенный элемент не появится на странице.
count = 0
while True:
    count += 1
    time.sleep(0.25)
    if count >= 3:
        break

    try:
        link = driver.find_element_by_css_selector('a[href*="fantlab.ru/work"]')
        if link:
            return link.get_attribute('href')
    except:
        continue


Жанры


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

# Убираем все спец символы из строки жанров   
fullGenre = fullGenre.replace('/', ',').replace(';', ',').replace('--', '-').replace(u'ё', u'е')
fullGenre = re.sub(r'[\.|"«»]', '',fullGenre)
fullGenre = re.sub(r'\[.*?\]', '',fullGenre)

# Разбиваем жанры по запятой, убираем пустые поля и начальные/конечные пробелы
allGenres = filter(None, fullGenre.split(','))
allGenres = [item.strip() for item in allGenres]

# Делаем список уникальным (убираем дубликаты)
allGenres = list(set(allGenres))

insertGenresList = []

for genre in allGenres:
    # Проходим по каждому жанру, получаем его начальную форму
    morphology = morph.parse(genre)[0]
    genre = morphology.normal_form

    insertGenresList.append(genre)


Имена авторов


С авторами можно было бы тоже что-то придумать с библиотекой pymorphy2: разбивать на слова, проверять вхождения слов и их совпадение. Но тут я вспомнил пункт про глобальный поиск всего по всем полям. Это и будет решением. Для полнотекстового поиска взял sphinx. Он напрямую не дружит с mongodb, поэтому нужно написать скрипт, который будет выбрасывать xml с данными по указанной схеме.

docset = ET.Element("sphinx:docset")
schema = ET.SubElement(docset, "sphinx:schema")

# Храним ID записи в базе, чтобы потом вытаскивать информацию
idAttribute = ET.SubElement(schema, "sphinx:attr")
idAttribute.set("name", "mongoid")
idAttribute.set("type", "int")

# Дальше перечисляем все поля, которые должны индексироваться
text = ET.SubElement(schema, "sphinx:field")
text.set("name", "audioauthor")

text = ET.SubElement(schema, "sphinx:field")
text.set("name", "bookauthor")

text = ET.SubElement(schema, "sphinx:field")
text.set("name", "title")

text = ET.SubElement(schema, "sphinx:field")
text.set("name", "publisher")

text = ET.SubElement(schema, "sphinx:field")
text.set("name", "description")

# Мы должны вручную генерировать индекс для каждой записи книги и это обязательно должен быть атрибут с имением id
globalIterator = 0
all = bookTable.find()

# Убираем то, что может сломать xml разметку
def safeText(data):
    data = re.sub('<[^<]+?>', ' ', data)
    data = "".join([c for c in data if c.isalpha() or c.isdigit() or c==' ']).rstrip()

    return data

for card in all:
    document = ET.SubElement(docset, "sphinx:document")
    globalIterator += 1

    # Этот самый обязательный id
    document.set("id", str(globalIterator))

    mongoid = ET.SubElement(document, "mongoid")
    mongoid.text = str(card["_id"])

    title = ET.SubElement(document, "audioauthor")
    title.text = safeText(card["audioAuthor"])

    # И далее все то же для всех полей...


Параметры в sphinx.conf:

source src_bookaudio
{
   type = xmlpipe2
   xmlpipe_command = python /path/to/sphinx.py

   sql_attr_uint = mongoid
}

index bookaudio
{
   morphology              = stem_enru
   charset_type            = utf-8
   source                  = src_bookaudio
   path                    = /var/lib/sphinxsearch/data/bookaudio.main
}


И команда: indexer bookaudio --rotate

Как же использовать поиск для унификации полей? Берем список всех авторов книг, и складываем одинаковые вхождения. Получится что-то типа:
Вячеслав Герасимов — 1324
Игорь Князев — 432
...


authors = {}
for book in allBooks:
    author = book['audioAuthor']
    if author in authors:
        authors[author] += 1
    else:
        authors[author] = 1


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

import sphinxapi
client = sphinxapi.SphinxClient()
client.SetServer('localhost', 9312)
client.SetMatchMode(sphinxapi.SPH_MATCH_ALL)
client.SetLimits(0, 10000, 10000)

import operator
sorted_x = reversed(sorted(authors.items(), key=operator.itemgetter(1)))
counter = 0
for i in sorted_x:
    print i[0].encode('utf-8'),
    print ' - ' + str(i[1])

    searchData = client.Query(i[0], 'bookaudio')
    for match in searchData['matches']:
        mongoId = int(match['attrs']['mongoid'])
        BULK.find({'_id' : mongoId}).upsert().update({'$set' : {'audioAuthor' : i[0]}})


Все похожие вхождения (в том числе «В. Герасимов», например) будут заменены на наиболее используемые формы.

Интерфейс


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



И работа с фильтрами:



Как видите, я захотел посмотреть все книги, озвученные Игорем Князевым по жанру «российская фантастика», отсортированные по количеству загрузок на рутрекере (вверху самые скачиваемые).

Пробелом или нажатием на карточки внизу раскрывается информация о книге. Благодаря mongodb все фильтры отрабатывают мгновенно по базе в 30к книг.

Завершение


Не все идеально: база не везде точная, интерфейс можно улучшить. Фильтр по жанрам нужно перевести в древовидную структуру. Все это работа за 3 дня и для личного пользования и выбора книг мне хватает. Вы бы пользовались таким сервисом?
Поделиться с друзьями
-->

Комментарии (104)


  1. stassss2011
    14.05.2016 23:23
    +6

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


    1. Ockonal
      14.05.2016 23:25

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

      А вообще, если поискать, можно найти ссылку ;)


      1. Survtur
        15.05.2016 00:17
        +3

        Вам надо было просто назвать Ваш проект как нибудь искабельно, типа «Который Трехдневный Книгодер», вот легко бы гуглилось.


    1. msin
      15.05.2016 11:11

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


      1. Ockonal
        15.05.2016 16:46

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


      1. Verdoga
        15.05.2016 17:00

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


    1. Rastishka
      15.05.2016 11:50
      +2

      Лайфхак Совет: некоторые пользователи заполняют в своем профиле пункт "сайт".


  1. AStek
    14.05.2016 23:34
    +3

    Отличная вещь. Если не будешь делать сервис, выложи хоть базу.


  1. n1kkk1ros
    15.05.2016 00:28
    +3

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


    1. Ockonal
      15.05.2016 00:47

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


  1. xxxTy3uKxxx
    15.05.2016 00:31
    +1

    Отличная идея! Может стоит глянуть в сторону бота для телеграмма?


    1. Ockonal
      15.05.2016 00:40
      +4

      Спасибо. Если честно, я сам не люблю этой истерии по поводу телеграм-ботов. Не считаю это удобным. Если вы хотите выбрать себе книгу, то можете уделить время, зайти на сайт и воспользоваться полным и широким набором фильтров :) Ведь именно для этого все затевалось ;)
      Да и сейчас на сайте нет возможности слушать онлайн. Для этого нужны ресурсы, если сервис зайдет — сделаю. Возможно тогда можно будет сделать бота, который будет интерпретировать фразы вида: «получить книгу с озвучкой игоря князева по жанру российская фантастика»


  1. serf
    15.05.2016 02:19
    +2

    У меня нет vk аккаунта, как залогиниться по другому?


    1. Ockonal
      15.05.2016 02:20

      Попробуйте завтра, я добавлю facebook и twitter


      1. serf
        15.05.2016 02:30
        +3

        Этих тоже у меня нет :) Можно гугла или просто логин/пароль?

        Да вот здесь book-audio.com/performers не нашел например таких декламаторов (которые представлены на rutracker):
        Андрей Кравец
        Александр Сталеваров
        Дмитрий Бобров
        Дмитрий Хазанович
        Петр Маркин
        Светлана Никифорова


        1. Ockonal
          15.05.2016 02:31

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

          Сделаю гугл логин


          1. serf
            15.05.2016 02:51
            +1

            Я бы пользовался сервисом. Особенно были бы полезны уведомления о новых книгах (или новых релизах от других декламаторов) по декламаторам и авторам.

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


            1. Ockonal
              15.05.2016 02:53

              Спасибо за отзыв, все это будет. Попытаюсь как-то и группировать серию книг. Думаю, для самых популярных произведений это вполне реально.


      1. tapin13
        15.05.2016 10:32
        +3

        поддерживаю self, хотелось бы «просто логин/пароль». Лично не люблю привязок к соц сетям.

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

        С удовольствием пользовался!


        1. Ockonal
          15.05.2016 15:59

          Сайт делаю как для себя, поэтому точно не повторится имхонет :) Спасибо


  1. webmasterx
    15.05.2016 05:20

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


    1. Ockonal
      15.05.2016 11:27

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


      1. webmasterx
        15.05.2016 12:45

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


  1. WarmongeR
    15.05.2016 06:40

    Исходники в OpenSource выпустите?


    1. Ockonal
      15.05.2016 11:28

      Я уже писал ниже, что вообще все получилось очень универсальным. Сайт по сути является UI прослойкой для MongoDB, можно подсовывать данные любого формата с минимальными изменениями. Я уже подумывал о чем-то похожем для фильмов. +Какой-то интерактивный просмотр фильма, когда ты не читаешь описания этого самого фильма. Просто жанрами подбираешь по настроению и включаешь фильм на весь экран. Не зная ни его названия, ни описания. :)


  1. tapin13
    15.05.2016 10:25

    Очень не удобно, когда каждая новая ссылка с сайта (на себя же) открывается в новом табе. (FF 28)


    1. Ockonal
      15.05.2016 11:15

      На главной? Потому что в разделе выбора книг все происходит в одном окне


      1. tapin13
        15.05.2016 12:17

        http://book-audio.com/28704:voronin-andrei-instruktor-poslednii-samurai

        Например линки — Другие книги автора «Андрей Воронин» — тоже в новом табе.


      1. tapin13
        15.05.2016 12:19

        Chrome Version 48.0.2564.116 та же история. Если что под LinuxMint 17.3.


  1. tapin13
    15.05.2016 10:27

    Читаю сейчас серию книг, скачал с руторрет, попытался поискать по названию или имени автора и ничего не найдено. (если что книга Артём Мичурин «Еда и патроны»)


    1. Ockonal
      15.05.2016 11:41

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


    1. Ockonal
      15.05.2016 17:36

      Если что, поиск починил.


      1. tapin13
        16.05.2016 09:58

        работает, спасибо!


  1. FTM
    15.05.2016 10:40
    +2

    Отличная идея. С удовольствием пользовался бы вашим сервисом.
    Кстати, решал подобную задачу на рутрекере, но только с музыкальными произведениями. Группировал по жанрам, исполнителям, годам и т.п. Все описанные вами проблемы для аудиокниг в плане оформления раздач присутствуют и там.


    1. Ockonal
      15.05.2016 11:13

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


  1. kilgore
    15.05.2016 11:12
    +2

    Безусловно!


  1. f0rmat1k
    15.05.2016 13:21
    +2

    Пользуясь случаем хочу рассказать кратко о моем поделии. Тоже задумывался, что хочу слушать аудиокниги по категориям и длительности. В итоге запилил эти фишки для передачи «Модель для сборки»: http://mds-online.ru


    1. Ockonal
      15.05.2016 15:26

      Знаю ваш сайт, приятно видеть автора в комментариях публикации :)


  1. volanddd
    15.05.2016 14:26
    +2

    А где ссылка?

    Хочу
    image


    1. Ockonal
      15.05.2016 15:22
      +1

      Кто ищет, тот всегда найдёт :)


  1. DAiMor
    15.05.2016 15:18

    Я так понимаю аудиокниги только на русском. Было бы интереснее, если бы еще на английском были.


    1. Ockonal
      15.05.2016 15:25
      +1

      Подскажите источник информации. Не проблема добавить.


      1. Stiver
        15.05.2016 16:34

        Тот же рутрекер, раздел «Аудиокниги на иностранных языках» -> «Аудиокниги на английском языке»


      1. kleevahew
        18.05.2016 11:18

        http://audiobookbay.me/ например


  1. grims
    15.05.2016 15:21
    +5

    Автор молодец! Сервис действительно нужный заметил по себе уже давно, было бы неплохо если бы такой проект в один прекрасный день ожил на просторах рунета.
    Автору успехов, и если сказал «А», то нужно говорить и «Б».


    1. Ockonal
      15.05.2016 15:25
      +2

      Все уже успешно тестируется некоторыми хабражителями ;)


  1. shooorf
    15.05.2016 15:21

    У рутрекера есть API api.rutracker.org/v1/docs — через него можно получить информацию о раздачах, включая название (а в нем обычно есть почти все необходимое, в том числе жанр, год, автор и т.п.)


  1. c_a
    15.05.2016 15:21
    +1

    Отличная идея, с удовольствием буду пользоваться. А если еще и мобильное приложение запилить к этому, то вообще супер будет


    1. Ockonal
      15.05.2016 15:25
      +1

      Подписывайтесь на обновления, работать буду каждый день :)


  1. Verdoga
    15.05.2016 15:44
    +2

    Уважаемый автор, уже отыскал ссылку на этот проект. Очень надеюсь, что дело не затухнет. Есть несколько пожеланий, я ресурсом ещё не пользовался, это, так сказать, по прочтении статьи.
    — Очень бы хотелось видеть nnmclub и рутор. Там бывают более удобные сборники по сериям или авторам.
    — Очень бы хотелось, прям до слёз, связки с abook-club. Причин этому несколько: во-первых, там хорошая картотека, правда жанрового классификатора нет; во-вторых, там есть ссылки на их форум, где написаны отзывы и рецензии читателей; и последняя — там есть демо дикторов.
    — Не мешало бы сделать модерацию данных.
    Кстати, на abook-club есть сортировка по сериям у авторов, не всегда верно, но может поможет.

    Об опыте использования текущей версии сервиса отпишу позднее. А вообще очен рад тому, что такой сервис появился!


    1. Ockonal
      15.05.2016 16:01

      Спасибо больше за развернутый отзыв. Много пунктов сам знаю и хотел интегрировать. Данная публикация была как проверка, нужно ли вообще тратить свои силы и время на развитие. Как показал отклик – нужно.
      Буду собирать максимально большую и полную базу из всех источников, которые найду


  1. firekod
    15.05.2016 16:28
    +1

    Отличный сервис, спасибо! Теперь все в одном месте и сразу можно скачивать по magnet-ссылке (нет необходимости обходить блокировку рутрекера, широким массам это будет удобно).
    Можете еще добавить в фильтр год издания книги и рейтинг.
    Например, чтобы можно было сделать такую выборку: зарубежная фантастика, начиная с 2000 года, с рейтингом не меньше 7,5 – и все это отсортировано по дате добавления.


    1. Ockonal
      15.05.2016 16:48

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


  1. Desprit
    15.05.2016 16:48
    +1

    Огромное человеческое спасибо за хак для PhantomJS, который позволяет игнорить загрузку сторонних ресурсов. Каждый день имею дело с web scraping и Scrapy, но иногда приходится прибегать к помощи фантома. Ваш фикс в среднем ускоряет процентов на 30-40 загрузку, а в некоторых примерах у меня прирост был даже 100%.
    Как-то уже искал решения раньше, но для python'а особо ничего не было и я бросил.


  1. Verdoga
    15.05.2016 16:57

    Уважаемый Ockonal, возможно вы не согласитесь со мной, но всё же я позволю себе обрисовать личную точку зрения на подобные ресурсы. Возможно она слишком субъективна, но это о наболевшем. Таких ресурсов действительно в рунете не хватает. Собирать информацию о книге, авторе, серии бывает утомительно с разных сайтов, особенно если данные не совпадают. Сервис-каталог аудио книг должен включать в себя не только информацию о книгах, сериях, циклах, но и информацию о самом авторе. Мне очень нравится классификация литературы на сайте «Лаборатория фантастики», на рутрекере жанровые классификации очень часто непонятны. Например: «Русская литература» — тогда уже хотя бы «Русская проза». Такой каталог должен нести в себе максимум информации обо всём, что связано с конкретной книгой. То есть каталог должен включать в себя: раздел биографий, раздел жанров, раздел серий/циклов, раздел каталожных карточек с отдельными произведениями. И вся эта информация должна сливаться воедино с перекрёстными ссылками. Возможно я слишком много требую, всё это невозможно получить в автоматизированном режиме, но ведь такого рода проекты и не делаются за месяц и на автоматизированной обработке данных. Отсюда вытекает вопрос модерации, о котором я писал в предыдущем комментарии.

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

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

    Вот и всё. В общих чертах я обрисовал вам сервис своей мечты, а мелких деталей очень много.


    1. Ockonal
      15.05.2016 17:02

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


      1. Verdoga
        15.05.2016 17:08

        Да это наипервейшая задача. Но проверка нужна в ближайшее время, поскольку дальше будет сложнее разгребать завалы информации.
        Где группа ВК? Что-то не вижу:)


      1. Verdoga
        15.05.2016 17:12
        +1

        Прошу прощения, ссылку на группу нашёл и подписался.


  1. alekssamos
    15.05.2016 19:05

    А ещё можно слушать обычные текстовые книги при помощи синтезаторов речи (TTS). А через специальную программу, например «Балаболка» можно записать в .mp3 или .wav… И получится аудиокнига из книги в текстовом формате…


    1. Ockonal
      15.05.2016 19:05

      У меня была идея делать подобное для небольших рассказов, но использовать движок IVONA. Там довольно неплохой синтезатор.


      1. Verdoga
        15.05.2016 19:38

        Много же вы таким образом слушали?


        1. Ockonal
          15.05.2016 20:21

          Я брал только небольшие рассказы, которые хотелось прочитать. АПИ там ограничивает по длине куски тестовые. Я прогонял их циклом и склеивал фрагменты в один mp3-файл. Слушать вполне реально


          1. Verdoga
            15.05.2016 20:28

            Мы лёгких путей не ищем:) Некоторым ещё нравится локуэндовская Ольга. Меня она раздражает проглатыванием всего окончания.
            А вообще сейчас уже довели до ума бесплатный синтезатор RHvoice, он весьма неплохо обрабатывает интонации в зависимости от пунктуации и словарь там уже не маленький. Единственный недостаток на предложениях длиннее пяти слов, коих в тексте большинство, ровно посередине он начинает читать монотонно как сомнамбула, чем портит всё впечатление.


    1. Verdoga
      15.05.2016 20:16

      Способ неплохой, особенно когда нет альтернативы. Только есть несколько проблем.
      Первая — нельзя слушать много книг подряд начитанных машиной. Нужно прерываться на книги начитанные человеком, даже пускай не очень хорошим диктором. Причина такого ограничения кроется в искажении речи. Если долго слушать машинную речь, то неверные ударения, которые мы воспринимаем на слух, становятся для нас нормальными и мы сами незаметно начинаем неверно расставлять их уже в нашей речи. Я сам долго страдал подобной проблемой после синтезатора Алёна, вместо пробЕл, говорил прОбел.
      Вторая — машина крайне плохо начитывает некоторые произведения и жанры. Например фентези очень плохо начитывается, поскольку придуманные имена, названия и слова. Ещё портят впечатления междометия и некоторые диалоги с не помеченными говорящими, не всегда есть возможность понять на слух кто что сказал. Фантастика тоже раз на раз неприходится. Ну и в других местах лучше не браться так читать. Вот и сейчас лежит фентезийный цикл, первая книга начитана Татьяной (Ivona), а боязно браться, поскольку боюсь испортить впечатление машинной начиткой, судя по началу книжка не удалась.

      Вот демка Татьяны, если кому интересно послушать.


  1. Diaskhan
    15.05.2016 19:42

    даешь приложения под iphone и андроид, супер проект взлетит )))


    1. Ockonal
      15.05.2016 20:20

      Сначала хотя бы сайт сделать :)


  1. Bagow
    15.05.2016 20:19

    Было б круто указывать в описании наличие\отсутствие фоновой музыки. Не могу слушать с музыкой.


    1. Ockonal
      15.05.2016 20:20

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


      1. Bagow
        15.05.2016 20:47
        +1

        Я готов быть волонтером. Может анализируя дорожку на наличие пиков от нуля с помощью ffmpeg можно определить отсутствие музыкального фона.


  1. bmj
    15.05.2016 20:47
    +1

    спасибо за нужный сервис, добавил ваш сайт в speed dial


  1. HuntGuter
    15.05.2016 21:08

    Отличный сервис, доступ к базе удобнее чем ICIJ сделали для своей базы офшоров =)
    Будут ли исходники на ГитХабе?


    1. Ockonal
      15.05.2016 21:10

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

      Кстати, если есть волонтер, кто может уделить 15-20 минут на пару вопросов по проблемах в верстке — напишите мне.


  1. nrcpp
    15.05.2016 22:06

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


    1. Ockonal
      15.05.2016 22:09

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


      1. shooorf
        16.05.2016 11:21

        Справедливости ради: в запрос на информацию о раздачах можно включить до сотни ID через запятую(%2C): http://api.rutracker.org/v1/get_tor_topic_data?by=topic_id&val=94316%2C146284%2C194249
        Сами ID можно получить одним запросом вида http://api.rutracker.org/v1/static/pvc/f/1056

        Что еще может быть полезно — api.rutracker.org не заблокирован в РФ.


  1. Crystal_HMR
    16.05.2016 12:14

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

    PS. На главной внизу добавьте хоть 20px какого-то футера, а то я слегка в недоумении был, когда перестало листаться. И ни скролл-таба (не знаю как правильно называется то, что обычно появляется справа при листании дивов), ни информации о том, что это конец страницы — я не увидел. Это мелочь, и не критично, но всё же :)


    1. Ockonal
      16.05.2016 12:15

      Спасибо ;) Сегодня я заменю разметку этих колонок по всему сайту, будет нормально работать.
      Я тоже очень люблю на велосипеде книги слушать.


  1. mamontovdmitriy
    16.05.2016 12:25

    Прикольная штука! Спасибо, буду пользоваться


  1. corsarr
    17.05.2016 13:25

    Отличная идея!!! Главное не остановиться на половине, а продолжить и развивать до ~…
    У отца появилась прогрессирующая проблема со зрением и он подсел на аудио книги. Приходится вручную лопатить просторы в поисках. Это я к тому, что было бы вовсе замечательно реализовать проект с учетом слабовидящих или вовсе не видящих пользователей + APP (Android, iOS)


    1. Ockonal
      17.05.2016 13:25

      Спасибо. Пока разве что можно добавить стиль с повышенном контрастом и увеличенными шрифтами. Один не потяну еще приложение. Хотя некоторые люди отзывались о сотрудничестве в эту сторону.


      1. Verdoga
        17.05.2016 14:08

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


        1. Ockonal
          18.05.2016 00:38

          Никогда не сталкивался с таким. Если есть опыт и понимание, как оно должно работать, то подскажи :)


  1. n0isy
    17.05.2016 16:52
    +1

    Ай, молодца!
    Во-первых, взял с рутрекера то, что редко попадает в лапы копирайтеров, во-вторых сделал отличный интерфейс, да ещё и статью на хабр опубликовал!
    + за py
    + за монго
    + за frai


    1. Ockonal
      17.05.2016 16:52

      Спасибо :) У меня тут уже на подходе ex.ua и еще пара трекеров


  1. Stas911
    17.05.2016 20:57

    А где ссылка-то? Хотелось бы на английском много-много аудиокниг


    1. grims
      17.05.2016 21:26
      +1

      Ну, мил-человек, что же Вы так невнимательно… изучите автора со всех сторон, профиль там и все такое…


    1. Ockonal
      17.05.2016 23:11

      Будут книги на английском ;)


      1. Stas911
        17.05.2016 23:22

        А искать по языку как-то можно? Поле «язык» добавьте плз


        1. Ockonal
          17.05.2016 23:23

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


          1. Stas911
            17.05.2016 23:24

            А на рутрекере вроде полно аудиокниг на английском, не?


            1. Ockonal
              18.05.2016 00:21

              Да, забыл о рутрекере. Сегодня/завтра добавлю все книги в базу


              1. Stas911
                19.05.2016 21:12

                Не появилось?


                1. Ockonal
                  19.05.2016 21:56

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


  1. neosapient
    17.05.2016 22:45

    Шикарно!
    Я в своё время предлагал администрации сайта Фантлаба прикрутить ссылки на торрент-раздачи аудиокниг, но администрация отказалась ((

    А можете импортировать из fantlab.ru те книги, что я уже прочитал (поставил оценку)? и те книги, что ожидаю прочитать в первую очередь (соответствующая Книжная полка «Прочитать»)?
    А затем дать возможность убирать из поисковой выдачи те книги, что я прочитал и в первую очередь показывать те книги, что я отложил на прочтение?

    P.S.
    Вижу у вас на сайте, что можно «исключить прослушанное». Но у меня несколько сотен книг помечены как Прослушанное и столько же ожидают Прочтения. Всё это руками переносить — лениво.


    1. Ockonal
      17.05.2016 22:47

      «Если гора не идет к Магомету...» :)

      Классная идея, даже не дмал о таком. Правда, доступен ли список прочитанного пользователя для остальных? Чтобы можно было без знания логина/пароля выкачать эти данные? Или может fantlab дает экспортнуть в какой-то формат. Я бы написал импортер.


      1. neosapient
        18.05.2016 10:52

        >> доступен ли список прочитанного пользователем для остальных? Чтобы можно было без знания логина/пароля выкачать эти данные?

        Сомневаюсь, что эти личные данные доступны просто так. Но я б рискнул бы предоставить вам мой логин и пароль от сайта fantlab.ru, чтобы вы импортировали данные с него.

        >> может fantlab дает экспортнуть в какой-то формат?

        Это вам придется договариваться с админами сайта fantlab.ru. Может они запилят какое-нибудь API к их сайту.


        1. neosapient
          18.05.2016 11:05

          Был неправ! ))
          Можно посмотреть мои личные данные без авторизации на сайте fantlab.ru

          Вот список книг которые я прочитал и оценил
          http://fantlab.ru/user116033/marks

          А вот моя книжная полка тех книг, что ожидают прочтения
          http://fantlab.ru/bookcase98627


          1. Ockonal
            18.05.2016 14:15

            Тогда следите за новостями ;)


  1. snnwolf
    19.05.2016 17:09

    Возможно уже кто-то писал, но когда только зарегался получил ошибку: http://take.ms/Mt9VC
    И при авторизации, ничего не происходит. Дебаггер в хроме получает ответ от сервера:


    {"result" : "ok", "data" : "2f5xxxxxx0c2eXXXXXXXX487xxxxxx0ae0b"}


  1. Artcomplex
    19.05.2016 19:19

    О! Я как раз мечтал о таком сервисе!
    Единственно- немного на другом ресурсе http://staroeradio.ru/program -здесь терабайты советских радиопостановок, «театр у микрофона» и т.п.
    Местами гораздо более качественный продукт, нежели простая начитка аудиокниг.

    И ужасный поиск.

    Но и рутрекер очень интересен, спасибо.


    1. Ockonal
      19.05.2016 19:22

      Посмотрел, там слишком мало мета-информации и все с разным описанием. Я сойду с ума писать логику, которая бы обрабатывала все возможные случаи и вариации :) Да и жанров для всего этого не найдешь. Моему набору фильтров просто не хватит информации.

      Скоро выкачу новое обновление, там не только рутрекер будет.


      1. Artcomplex
        19.05.2016 19:52
        +1

        Согласен. По-любому, то что сделано- круто. Буду пользоваться, спасибо.
        Да и визуально приятно выглядит (кроме юзерпика :) )

        З.Ы. Заметил, что первая загрузка сайта долго идет, вторая побыстрее.


  1. chomper
    24.05.2016 10:41

    Жанры в фильтре не пролистываются, а на маленьких экранах и вовсе не видны.
    https://i.gyazo.com/dd8e850b6a90acf7a8f54d5ff78bd76b.png


  1. bNN
    24.05.2016 11:28

    Спасибо за проделанную работу!

    Подскажите, интерфейс сделан же на каком-то фреймворке? Подскажите название :)