13 октября 2016 в 14:02

readRss — local rss reader as browser extension

Это rss читалка в виде браузерного расширения (js-приложение), которое позволяет в дальнейшем читать rss-потоки вообще без наличия интернета, даже картинки заранее скачиваются. А теперь подробнее.

Скриншот, как это выглядит:

image

В недалёком 2012 году, когда GR ушёл, я стал думать, как же мне дальше читать новости. Просмотрел кучу разных читалок. Среди них были очень достойные, которыми можно пользоваться, но у них было много разных минусов — то нужно платить, то нет нужных функций, и т.д.

Как front-end developer, я решил написать на js приложение, которое бы работало локально, подключаясь к браузеру. Это удобно в первую очередь тем, что, например, проблема авторизации уходит на второй план. Есть rss-потоки, которые работают, только если вы авторизованы на сайте. Например, тот же живой журнал. В данном случае все подзамочные записи (записи для друзей) будут отлично приходить в читалку.

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

Интерфейс я честно подглядел у гуглридер, немного его доработал.

В те годы я создал похожий проект для чтения форумов. Ядро было написано на php, но мне это показалось уже устаревшим и плохоразвиваемым, я сделал ставку на javascript. И я взял оформление с этого проекта, добавил ядро на js и встроил в расширение. И вот что получилось.

Сейчас это расширение представляе собой бету-версию, с малым количеством багов и работоспособную, я ей пользуюсь для чтения RSS, поэтому когда она стала стабильной, решил поделиться с общественностью. Можете пользоваться, поставив как расширение (через папку в developer mode). Я не гарантирую супер-волшебства дизайна при работе этого расширения, но оно работает, это я могу сказать точно.

Работают клавиши J, K, V, M


J — следующая запись
K — предыдущая
V — открыть ссылку в новой вкладке
M — пометить как непрочитанной

Добавить поток можно тремя способами


image

1. Указать точный адрес потока.
2. Указать просто url-страницы. Вам будет показан список найденных там потоков и вы можете, оставив нужные галки, подписаться.
3. Импортировать OPML-файл. Импорт работает по очереди, поэтому запаситесь терпением.

Тех детали


Поддерживаются потоки разных типов — rss, atom, rdf. Поддерживается почти всё, что есть внутри — вложения, geo, категории, комментарии, автор и т.д.

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

image

Если такая картинка уже есть в тексте статьи, то будет просто название, чтобы не дублироваться:

image

Видео и аудио — покажется плеер. Есть список подписок и можно отписаться. Есть быстрый поиск.

image

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

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

» Исходный код выложен на github

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

Применяется sanitize для очистки html от всего лишнего, что там не нужно для чтения.

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

Планы


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

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

Спасибо.
Евгений Иванов @Methos
карма
29,0
рейтинг 0,0
Front-end developer
Самое читаемое Разработка

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

  • 0
    Огромный минус локальных (в т.ч. и этот браузерный) читалок — необходимость быть онлайн для получения всех сообщений ленты. Допустим, лента отдает последние 10 записей. В день публикуется 15 записей. Тогда, если сутки не включать комп, получится, что потеряли как минимум 5 записей. Именно по этой причине серверные читалки предпочтительнее.
    • 0
      У меня в планах создать код на nodejs и поместить на сервер, чтобы работало без локали, а потом синхронизировалось. Код «серверный» менять не придётся, в этом плюс js.
      • 0

        А зачем писать свой сервер для скачивания и хранения RSS? Можно воспользоватся API Tiny Tiny RSS, в отличии от вашего решения, TT-RSS более удобный вариант, т.к. есть мобильные клиенты. А если не хватит возможностей API, можно посмотреть как работает эта программа, которая использует свой плагин для TT-RSS.

        • 0
          Скажите пожалуйста, ваш TinyTiny Rss умеет грузить картинки для локального просмотра?
          • 0

            Вы неправильно сформулировали вопрос. TT-RSS не локальная программа и соответственно для локального просмотра она ничего не грузит. Но она эти изображения кэширует у себя, и вы очень просто можете сделать клиент для нее, который будет скачивать все изображения для локального просмотра. А если вы установите этот плагин, то вы сможете не только просматривать содержимое rss ленты, но и читать полный текст статьи.

            • 0
              Понятно. То есть, без интернета я не то что картинки, но даже текст не смогу почитать. Сейчас. О боже, какой ужас.

              • –1

                По моему Вы не понимаете что я хочу донести до вас. Ваша программа и TT-RSS не конкуренты, т.к. одна из них – серверная читалка, а другая – локальная. Но Вы написали что хотите так-же сделать сервер для скачивания статей, и вот как раз вместо того чтобы писать свое решение, ваше расширение можно прикрутить к TT-RSS, т.к. это будет куда более удобно для пользователей.
                P.S. А FeedReader, кстати, может подключится к TT-RSS, скачать все статьи вместе с картинками, и после этого вы можете их читать без интернета, то есть, делать все то-же что вы может делать ваше расширение.

                • 0
                  У меня совершенно нет желания пользоваться сторонними сервисами, которые могут умереть в любой погожий день.
                  • –1

                    TT-RSS не сторонний сервис, это self-hosted программа, вы можете установить её на свой сервер, и умрет она только с вашим сервером. Да, её создатель может забить на неё, но даже после этого она не не превратиться в тыкву, разве что обновляться не будет. Кстати, TT-RSS существует и поддерживается уже около 10 лет и не похоже что она скоро умрет.

                    • –1
                      TTRSS написан на PHP, а у меня ставка на JS.
                      • –1

                        А какое отношение имеет язык программирования к JSON API? Не всё ли равно?

  • +1
    Зачем? Если есть замечательный Feedly, например.
    Или локальность — самоцель?
    • 0
      Локальность — преимущество, когда нет интернета, и про это всё описано в статье =)
      • 0

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


        Некоторые читалки умеют скачивать ещё и статью по ссылке, но ни один из них не скачивал комментарии (которые, как известно, могут быть интереснее статьи).


        Для себя я решил проблему так: я написал и запустил на своём сервере программу, которая скачивала RSS хабра, заменяла в нём краткую версию статьи на полную, включая комментарии, и публиковала получившуюся RSS.


        RSS-потоки доступны по ссылкам: https://alexbers.com/rss/habr.rss и https://alexbers.com/rss/geektimes.rss. А исходный текст программы вот: http://pastebin.com/6tr7kzY2 (130 строк на питоне)

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

          Поэтому достаточно чтение заголовков.

      • 0
        А вы не рассматривали self-hosted решения? Тот же Tiny Tiny RSS довольно приятная штука. Feedly theme и плагины делают его весьма и весьма удобным. Опять же есть api для написания своих клиентов.
        • 0
          Просмотрел кучу разных читалок. Среди них были очень достойные, которыми можно пользоваться, но у них было много разных минусов — то нужно платить, то нет нужных функций, и т.д.
          • 0
            Я просто никак не могу уловить в чём же киллер фича вашего агрегатора. Набор функций вполне стандартный, а реализация в виде расширения для браузера лишь накладывает дополнительные ограничения. По мне куда как проще добавить функционал плагином к существующей читалке.

            То есть вам просто было в удовольствие написать свой агрегатор.
      • 0
        Но ведь RSS загружается из интернета, какой толк в RSS читалке без интернета? Архив читать?
        • 0
          Есть места, где нет интернета. Моя читалка позволяет не только читать текст, но и картинки смотреть без интернета. Скрин:

          image

          При этом около картинки появляется ссылка L, она будет вести на интернет-ссылку, которая открывается в новой вкладке (чтобы отправить другому человеку, например).
    • 0
      BazQux тоже, например
  • +1
    Неустранимая проблема всего локального — синхронизация.

    В ситуации, когда у моего ноутбука внезапно умер диск, я его случайно уронил и разбил вдребезги, или банально украли — вся моя коллекция из 300+ фидов (которую я тщательно собирал и фильтровал много лет) умрет вместе с ним.
    • 0
      Есть такая вещь — бекапы.
  • 0

    Для меня Feedly + Pocket решают эту проблему полностью.

    • 0
      free — Up to 100 sources

      а у меня намного больше потоков, около 900

      и платить 300 руб в мес — дорого
      • 0
        У меня в планах создать код на nodejs и поместить на сервер, чтобы работало без локали, а потом синхронизировалось. Код «серверный» менять не придётся, в этом плюс js.


        А за сервер платить собираешься? Или выйдет дешевле 300 руб.?
        • 0
          Хостинг у меня уже есть и я за него плачу деньги (мой сайт). Поэтому что-то дополнительно покупать не придётся.

          Конечно, тем, у кого нет хостинга, приходится пользоваться сторонними сервисами.

          Но я давно уже не пользуюсь сторонними сервисами, или стараюсь минимизировать их употребление, обязательно дублируя их на свой хостинг.

          Помню, использовал скриншотер, а через пару лет он умер и даже не предупредил, в результате все картинки сгинули. Теперь мои скриншоты только на моём сайте http://e-ivanov.ru/p/1610/57.png (делается такая картиночка за 2 секунды)
  • 0

    Есть хобби проект с нужными киллер-фичами — Мегалента. Берет из рсс адреса, полноценно рендерит на сервере и присылает на ios-устройство.

    • 0
      Это замечательно.
  • 0
    Интересное решение.
    Но для меня применимость предварительной загрузки фотографий имеет смысл только в телефоне, и для этого я использую Press (android). На быстром вай-фае загрузил все ленты и читаю себе в дороге.
    • 0
      Yandex-браузер сделал поддержку расширений. То есть, я могу в телефоне читать с помощью моей читалки, без интернета.

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