rssto: конвертація фідів у різні формати

Днями, мене знову зацікавила тема RSS додатку для браузера, але нічого путнього для себе не знайшов. Звісно, є різні розширення і програми, але в мене є ряд вимог для них:

Будучи розробником, мені простіше написати власну реалізацію аніж шукати існуючу і виявляти в ній недоліки. Забігаючи на перед скажу, що подібних прототипів у мене багато (пошукати можна по відповідному тегу в репозиторіях YGGverse), але rssto - це останній з них, тим паче що сьогодні я випустив для нього оновлення 0.2

rssto - CLI утиліта конвертації RSS фідів з оцією кравлера, що дозволяє слідкувати за різними RSS фідами і зберігати їх у заданому форматі, зокрема HTML або Gemtext.

Іншими словами, дана програма читає фід по URL та зберігає його сутності у статичний файл згідно патерну, звідки його потім можна відкрити зручною для себе програмою. Особисто я користуюсь протоколом Gemini, точніше Nex, при чому експортовані дані знаходяться на локальному сервері Yggdrasil. На зображенні до цього матеріалу - зображена саме така конфігурація (на базі браузеру Yoda), тому ви бачите саме такі UI та URL, сама ж утиліта rssto - просто форматує заданий XML фід у статичний файл, із заданими налаштуваннями експорту.

Скріншот

Встановлення

Програма написана мовою Rust, тому тут все стандартно:

git clone https://github.com/YGGverse/rssto.git
cd rssto
cargo build --release
sudo install target/release/rssto /usr/local/bin/rssto
Встановлення останньої версії Rust в Linux

Налаштування

Я спеціально навів приклад встановлення з репозиторію, тому що версія 0.2 ще не опублікована в стабільних релізах на crates.io. По цій же причині, не буду детально описувати усі доступні опції (можна подивитись з `rssto --help`), але в цілому розповім про базові принципи конфігурації.

Файл конфігурації

Перше, що потрібно зробити - це створити файл конфігурації, який потрібен для запуску rssto. Актуальний приклад конфігурації доступний в репозиторії:

# якщо дана опція вказана, rssto працюватиме як фоновий демон а не разовий конвертор,
# тобто оновлюватиме фіди із заданим інтервалом в секундах
update = 60

# налаштування каналу для імпорту даних
[[feed]]
# URL шлях до фіду, як на прикладі
url = "https://assets.censor.net/rss/censor.net/rss_uk_news.xml"

# куди зберігати експортовані дані
storage = "./public/censor.net/rss_uk_news"

# у яких форматах експортувати дані
# ці теки є в репозиторії, ви можете вказати на базі них власні патерни, використовуючи макроси
templates = ["./template/html","./template/gmi"]

# обмежити кількість сутностей в каналі (стандартно стільки, скільки є у фіді)
list_items_limit = 20

# формати часу для відповідних макросів, залежатимуть від вашої локалі
pub_date_format = "%Y/%m/%d %H:%M:%S %z"
last_build_date_format = "%Y/%m/%d %H:%M:%S %z"
time_generated_format = "%Y/%m/%d %H:%M:%S %z"

# додайте інші канали по аналогії
#[[feed]]

Опція "templates" дозволяє використовувати свої шаблони для експорту але тут важливо зберігати поточну структуру їх файлової системи, утім можна довільно змінювати сам вміст шаблонів. Нище наводжу перелік макросів що підтримуються даною версією:

index

{title}
{description}
{link}
{language}
{pub_date}

index/item

{title}
{description}
{link}
{pub_date}

Systemd

Програмою rssto можна користуватись як конвертором, але особисто в мене вона працює на фоні, постійно оновлюючи фіди з інтервалом в одну годину (update = 3600).

Щоб запустити її на фоні, створімо новий сервіс:

#/etc/systemd/system/rssto.service
[Unit]
After=network-online.target
Wants=network-online.target

[Service]
Type=simple

User=rssto
Group=rssto

# розкоментуйте та вкажіть актуальний рівень дебагу
# опція "NO_COLOR" вимикає ANSI сутності для запису журналу у файл
# Environment="RUST_LOG=DEBUG"
# Environment="NO_COLOR=1"

ExecStart=/usr/local/bin/rssto -c /path/to/config.toml

# якщо не використовується, можна вказати null
StandardOutput=file:///home/rssto/debug.log
StandardError=file:///home/rssto/error.log

[Install]
WantedBy=multi-user.target

Посилання

проєкт на GitHub
Веб версія цього документу з коментарями на DevZone

Читайте також

Протокол Gemini як альтернатива HTTP
Протокол NEX - легка альтернатива Gemini
Yggdrasil - мережа з децентралізованою маршрутизацією