Перейти к навигации · Перейти к содержимому

Покетбокс

Полгода назад я купил себе новый ридер: Nook Simple Touch with Glowlight. Одной из причин покупки нового гаджета (до этого несколько лет у меня был Покетбук 360˚) было большое желание читать сохраненные из интернета статьи (через сервис типа Pocket) на ридере. Для этого как минимум нужно устройство с вайфаем, а как максимум еще и программой-клиентом, которая могла бы (полу-)автоматически забирать новые статьи через интернет.

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

Киндл

Амазоновский ридер является самым популярным устройством в мире — и вполне заслуженно. А самое главное, что интеграция с облачными сервисами типа Instapaper в него встроена «из коробки». У Амазона есть отличный сервис «Send to Kindle», которым можно пользоваться для периодической автоматической заливки статей на устройство. Это можно делать с помощью букмарклета, а можно при помощи одного из многочисленных сервисов.

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

Кроме того, лично для меня сам Киндл как читалка обладает рядом недостатков: у него мало настроек и опций (мне важны русские переносы, сноски, размеры букв, свои шрифты и так далее). А еще он не поддерживает форматы fb2 и epub, хотя большинство книжек у меня в них. В общем, всё это не столь критично, конечно, но меня это не устраивало.

Нук

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

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

Pocket

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

У Покета есть API (свободно доступный, хоть и не без ограничений). Но его новый клиент не работает на старой версии Андроида (работает на 2.2), а старый клиент плохо работает с данным видом экрана (в частности, меня не устроил скроллинг, т.к. физические кнопки не поддерживаются). Где-то я видел упоминание пропатченного по этому поводу клиента, но подробностей я не знаю.

Не писать же свой клиент ради такого? К тому же на нуке уже есть отличная читалка: Coolreader — лучше нее просто сложно что-то придумать. И я решил, что статьи лучше всего читать прямо в ней. Но как их туда положить? Если с проводами возиться не хочется, то самое простое — воспользоваться вездесущим Дропбоксом, так как его клиент есть на всех платформах. Кроме того, для него на Андроиде есть несколько программ-синхронизаторов: они могут синхронизировать (автоматически или по запросу) выбранную папку Дропбокса с папкой на устройстве. А уже потом из этой папки я могу загружать статьи в Coolreader.

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

Pocketbox

Реализацию я сделал на старом-добром PHP (5.2), чтобы его можно было поставить на любой виртуальный хостинг, где есть крон. Рабочее название: Покетбокс (Покет+Дропбокс). Весь процесс выглядит примерно так:

  • Скрипт по крону обращается в Покет и выгружает список статей
  • Затем он обращается к Дропбоксу и выгружает список статей оттуда
  • Проверяет, появились ли новые статьи и пропали ли старые (есть еще локальный реестр ранее выгруженных статей) и производит с ними нужные манипуляции:
    • новые статьи конвертируются в epub (с картинками) — по одному файлу на статью
    • удаленные статьи помечаются прочтенными в Покете

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

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

Устанавливать Покетбокс просто, но не слишком (тест на сообразительность).

  • Сначала нужно получить доступ к API Покета и Дропбокса — это бесплатно и доступно всем даже без проверки. Полученные данные API и доступа надо вписать в конфиг.
  • Закачиваете Покетбокс на сервер (лучше назначить права на запись для папок tmp и app)
  • Набрав в браузере адрес Покетбокса (который до этого был загружен на ваш сервер), нужно пройти авторизацию на Дропбоксе. Полученные данные для доступа (consumer_key, consumer_secret, token и token_secret) нужно вписать в конфиг.
  • Затем настраиваете крон, чтобы он загружал данную страницу каждые несколько часов.

Сам я уже много месяцев пользуюсь этой системой — всё работает хорошо, мне нравится. Надеюсь, кому-нибудь еще это окажется полезно.