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

Переезд не только с 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.
freshgo: порт FreshRSS на Go, который перестал быть портом . ↩︎
Таблица клиентов в README FreshRSS , колонка API. Клиенты, проверенные с Fever, перечислены в документации о Fever API . ↩︎
Releases juev/freshgo : changelog каждой версии собран из сообщений коммитов. ↩︎