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

freshgo 0.3: что появилось за девять дней

Девять дней назад я писал про freshgo1 как про порт FreshRSS на Go, который быстро стал отдельной читалкой. Тогда последней была версия 0.2.7. С тех пор вышло десять версий, от 0.3.0 до 0.3.9, и 84 коммита. Переехать на freshgo теперь можно ещё с Miniflux и Tiny Tiny RSS, а в самой читалке прибавилось того, чего во FreshRSS нет.

Экран чтения freshgo 0.3: дерево подписок свёрнуто в шапку потока

Переезд не только с FreshRSS

Раньше импорт читал только каталог данных FreshRSS. Теперь в существующего пользователя freshgo можно перенести учётную запись с сервера Miniflux или Tiny Tiny RSS . Импорт идёт через API этих серверов: для Miniflux нужен токен API, для Tiny Tiny RSS логин и пароль. Запустить его можно командой freshgo import -from miniflux (или -from ttrss) либо со страницы «Импорт и экспорт».

Форма импорта с другого сервера

Переносятся категории, ленты с настройками, статьи с отметками о прочтении и звёздочками. Теги Miniflux и метки Tiny Tiny RSS становятся метками. Что перенести нельзя, импорт перечисляет списком: правила перезаписи Miniflux, фильтры и логины лент Tiny Tiny RSS (их API не отдаёт). Вложенные категории Tiny Tiny RSS становятся категориями верхнего уровня. Вся учётная запись читается до записи и пишется одной транзакцией. Если сервер ответил ошибкой, у пользователя ничего не меняется. Повторный запуск ничего не дублирует и подтягивает отметки о прочтении.

Для клиентов появился Fever API, по адресу /api/fever.php. В прошлой статье я писал, что его нет. Протокол этот проще и слабее Google Reader API, но часть клиентов подключается именно через него. В таблице клиентов FreshRSS у Fiery Feeds указан Fever, а у Reeder Classic Google Reader API2. Клиент, который умеет оба протокола, лучше оставить на Google Reader API. Включает его администратор, по умолчанию он выключен. Ключ Fever — это md5 от имени и пароля, поэтому для приложений лучше завести отдельный пароль.

Модель: перевод, пересказ, метки

Перевод через языковую модель был и раньше. Тот же сервис теперь делает ещё две вещи.

Пересказ. У раскрытой статьи есть действие «Пересказать», клавиша Y. Модель пишет до пяти предложений на языке перевода, и они встают над текстом статьи. Пересказ хранится вместе со статьёй, пока её текст не изменится. Для ленты можно включить пересказ всех длинных новых статей, длиннее 3000 символов: обновление ленты модель не ждёт и из-за неё не падает.

Пересказ над текстом статьи

Метки. Действие «Предложить метки» отправляет модели заголовок, начало текста и названия ваших меток. В ответ приходят до трёх названий, свои метки модель предпочитает новым. Под статьёй они появляются с кнопками «Добавить» и «Отклонить», и без нажатия ничего не ставится. Для статьи на скриншоте выше модель предложила «XZ Backdoor», «Supply Chain» и «Social Engineering». В фильтрах можно задать поиск, для статей по которому подсказки будут запрашиваться сразу при получении.

Оговорка из прошлой статьи остаётся в силе: каждый такой запрос отправляет текст статьи с вашего сервера в сервис, который вы указали.

Как обновляются ленты

В 0.3.0 переделан выбор, когда опрашивать ленту. Если у ленты нет своего периода, freshgo опрашивает её так часто, как она публикует. Период считается так: время с самой старой статьи за последнюю неделю делится на число статей за эту неделю. Чаще одного раза в пять минут ленту не спрашивают. Реже, чем выбрано у пользователя для таких лент (по умолчанию раз в час), тоже. Редкая лента опрашивается как во FreshRSS, частая чаще.

Сервер ленты тоже может повлиять на расписание. Если он объявил ответ свежим (Cache-Control: max-age или Expires), следующий запрос откладывается на это время. Лента с ошибками после каждого сбоя подряд ждёт дольше. Чтобы было видно, почему лента молчит, страница «Фиды, требующие внимания» пишет, когда был сбой, с какой ошибкой и когда следующая попытка.

Страница проблемных лент

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

Интерфейс

Дерево подписок переехало в шапку потока и раскрывается поверх списка клавишей t. Список статей теперь занимает всю ширину.

Дерево подписок, раскрытое поверх списка

Переходы между страницами больше не перезагружают страницу целиком. Ссылки и формы работают через htmx , сервер по-прежнему отдаёт обычный HTML, и без JavaScript всё работает как раньше. Адрес, заголовок и кнопка «назад» ведут себя как при обычной загрузке, «назад» возвращает и прокрутку.

Открытая страница узнаёт об изменениях от сервера сама, через server-sent events. Если статья пришла при обновлении или её прочитали в другом клиенте, счётчики в дереве меняются за секунды, а не раз в две минуты, как было. В последней версии, 0.3.9, обновляется и сам список. Статья, отмеченная непрочитанной на телефоне, на открытой странице становится жирной. Если всё было прочитано и поток показывал все статьи, а появились непрочитанные, поток переключается на них. Когда открыта статья, поток не перестраивается: сверху появляется кнопка «Показать».

Мелочи, которые оказались полезными:

  • отметку страницы прочитанной и удаление ленты, категории или метки можно отменить в течение десяти минут;
  • статью можно сохранить в Linkding одной клавишей b;
  • в профиле можно включить уведомления браузера о новых статьях (Web Push) и ежедневное письмо с непрочитанным, если у сервера настроены ключи VAPID и почта.

Для того, кто держит сервер

Вход по паролю теперь может спрашивать код из приложения-аутентификатора (TOTP). Забытый пароль сбрасывается письмом со ссылкой: она работает один раз и в течение часа. Пользователь OpenID Connect привязывается к издателю и идентификатору первого входа, а группа провайдера может давать права администратора.

Для эксплуатации появились команды:

  • freshgo backup копирует базу работающего сервера, останавливать его не нужно;
  • freshgo restore -check проверяет копию до того, как её подложить;
  • freshgo doctor проверяет настройки и всё, что в них названо, ничего не меняя.

Ещё добавились /healthz для проверки контейнера, метрики Prometheus на отладочном адресе, файл настроек в YAML и автодополнение для bash, zsh и fish.

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

Что дальше

Предупреждения из прошлой статьи в силе. Проект молодой, проверен одной установкой, моей, PHP-расширения FreshRSS не работают. Если при переезде что-то не перенеслось или перенеслось не так, заведите issue в juev/freshgo , список изменений по версиям лежит на странице релизов3.


  1. freshgo: порт FreshRSS на Go, который перестал быть портом . ↩︎

  2. Таблица клиентов в README FreshRSS , колонка API. Клиенты, проверенные с Fever, перечислены в документации о Fever API . ↩︎

  3. Releases juev/freshgo : changelog каждой версии собран из сообщений коммитов. ↩︎