TinyTinyRss на страже новостей

21 March 2013

Не так давно Google всех опечалила новостью о предстоящем отключении сервиса Google Reader. Второй из трёх всегда открытых у меня сайтов. Зря они.. зря. Ну да ладна. Весь интернет сразу же заполонили обзорами и альтернативами, сервисами, платными вариантами и self-hosted скриптами. Конечно же выбор пал на последнюю категорию. Лучше уж сразу привыкнуть к новой программе и держать у себя все базы и копии, чем опять потом искал альтернативы при помирании следующего сервиса.

TTRSS

Завелось в принципе легко и быстро, фиды импортировались успешно и свежие новости посыпались. Но нет ничего идеального - привычного режима разворачиваемого списка как в Google Reader'е тут нет, и для Raspberry постоянная работа с базами и параллельными вэб-запросами слегка сложна.

Но тут на помощь приходит ччччииииилавек-программмист! Всё это счастье поднялось на nginx вместо громоздкого apache. К php были доставлены модули кэширования. В планах ещё mysql перевезти на usb-flash накопитель, думаю он будет по быстрей чем встроенная и без того гоняемая sd-карточка. Далее в код. Покалупав скрипты, было выявлена пачка лишних дублирующихся запросов, а интерфейс сайта начал обрастать кнопочками для сворачивания и разворачивания списка.

В файле "js/viewfeed.js" функция cdmClicked посылает запросы пересчета прочитанных сообщений, даже если оно уже прочитано. Нелогично. А ведь каждый запрос жевал секунды две-три, и задерживал очередь.

function cdmClicked(event, id) {
   try {
... 
//было
   if (article_is_unread) {
      decrementFeedCounter(getActiveFeedId(), activeFeedIsCat());
   }
   var query = "?op=rpc&method=catchupSelected" +
      "&cmode=0&ids=" + param_escape(id);
   new Ajax.Request("backend.php", {
      parameters: query,
      onComplete: function(transport) {
      handle_rpc_json(transport);
   } });
... 
//стало
   if (article_is_unread) {
      decrementFeedCounter(getActiveFeedId(), activeFeedIsCat());
      var query = "?op=rpc&method=catchupSelected" +
         "&cmode=0&ids=" + param_escape(id);
      new Ajax.Request("backend.php", {
         parameters: query,
         onComplete: function(transport) {
         handle_rpc_json(transport);
      } });
   }
...

По началу пытался писать отдельный плагин, но что-то не срослось. Плагины вроде классная вещь, можно менять контент фидов, их отображение, добавлять скрипты и прочие. Но мне нужны были кастомные кнопки. Может быть позже разберусь как это дело делать. А пока они вживлены в сам сайт. Файл "classes/feeds.php".

//было
$reply .= __('Select:')."
    <a href=\"#\" onclick=\"$sel_all_link\">".__('All')."</a>,
    <a href=\"#\" onclick=\"$sel_unread_link\">".__('Unread')."</a>,
    <a href=\"#\" onclick=\"$sel_inv_link\">".__('Invert')."</a>,
    <a href=\"#\" onclick=\"$sel_none_link\">".__('None')."</a></li>";
$reply .= " ";
//добавлено
$reply .= "/ Collapse: ";
$reply .= "<a href=\"#\" onclick=\"$$('div.cdmContent')."
                ."each(function(item){item.hide()})\">Close all</a>,
           <a href=\"#\" onclick=\"$$('div.cdmContent')."
                   ."each(function(item){item.show()})\">Open all</a>";
$reply .= " ";


comments powered by Disqus

© Oleksiy Tishyn 2018