devzone.org.ua/post/rssto-konvertatsiia-fidiv-u-rizni-formaty.md
2025-11-01 14:28:20 +02:00

119 lines
No EOL
9.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# rssto: конвертація фідів у різні формати
Днями, мене знову [зацікавила](https://devzone.org.ua/qna/dodatok-rss-dlia-firefox) тема RSS додатку для браузера, але нічого путнього для себе не знайшов. Звісно, є різні розширення і програми, але в мене є ряд вимог для них:
* мінімалізм - мені не потрібен комбайн з вбудованим браузером, а лише список заголовків з певного сайту
* приватність - сучасні рішення мало приділяють уваги цьому питанню і часто пропускають сторонні запити навіть при використанні проксі
* агрегація - можливість читати новини в зручних для мене форматах
Будучи розробником, мені простіше написати власну реалізацію аніж шукати існуючу і виявляти в ній недоліки. Забігаючи на перед скажу, що подібних прототипів у мене багато (пошукати можна по відповідному тегу в репозиторіях [YGGverse](https://github.com/orgs/YGGverse/repositories)), але `rssto` - це останній з них, тим паче що сьогодні я випустив для нього оновлення `0.2`.
[rssto](https://github.com/YGGverse/rssto) - CLI утиліта конвертації RSS фідів з оцією кравлера, що дозволяє слідкувати за різними RSS фідами і зберігати їх у заданому форматі, зокрема HTML або [Gemtext](https://geminiprotocol.net/docs/gemtext.gmi).
Іншими словами, дана програма читає фід по URL та зберігає його сутності у статичний файл згідно патерну, звідки його потім можна відкрити зручною для себе програмою. Особисто я користуюсь протоколом [Gemini](https://devzone.org.ua/post/protokol-gemini-iak-alternatyva-http), точніше [Nex](https://devzone.org.ua/post/protokol-nex-lehka-alternatyva-gemini) при чому експортовані дані знаходяться на локальному сервері [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom). На зображенні до цього матеріалу - зображена саме така конфігурація (на базі браузеру [Yoda](https://github.com/YGGverse/Yoda)), тому ви бачите саме такі UI та URL, сама ж утиліта `rssto` - просто форматує заданий XML фід у статичний файл, із заданими налаштуваннями експорту.
## Встановлення
Програма написана мовою Rust, тому тут все стандартно:
``` bash
git clone https://github.com/YGGverse/rssto.git
cd rssto
cargo build --release
sudo install target/release/rssto /usr/local/bin/rssto
```
* [Встановлення останньої версії Rust в Linux](https://devzone.org.ua/post/vstanovlennia-ostannyoyi-versiyi-rust-v-linux)
## Налаштування
Я спеціально навів приклад встановлення з репозиторію, тому що версія `0.2` ще не опублікована в стабільних релізах на [crates.io](https://crates.io/crates/rssto). По цій же причині, не буду детально описувати усі доступні опції (можна подивитись з `rssto --help`), але в цілому розповім про базові принципи конфігурації.
### Файл конфігурації
Перше, що потрібно зробити - це створити файл конфігурації, який потрібен для запуску `rssto`. Актуальний приклад конфігурації [доступний в репозиторії](https://github.com/YGGverse/rssto/blob/main/config/example.toml):
``` example.toml
# якщо дана опція вказана, 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}` - [channel:title](https://www.w3schools.com/xml/rss_tag_title_link_description_channel.asp)
* `{description}` - [channel:description](https://www.w3schools.com/xml/rss_tag_title_link_description_channel.asp)
* `{link}` - [channel:link](https://www.w3schools.com/xml/rss_tag_link.asp)
* `{language}` - [channel:language](https://www.w3schools.com/xml/rss_tag_language.asp)
* `{pub_date}` - [channel:pub_date](https://www.w3schools.com/xml/rss_tag_pubdate.asp)
* `{last_build_date}` - [channel:last_build_date](https://www.w3schools.com/xml/rss_tag_lastbuilddate.asp)
* `{time_generated}` - час генерації статичної версії фіду (програмою)
* `{items}` - список сутностей каналу, кожну з яких відформатовано за шаблоном `index/item`
#### index/item
* `{title}` - [channel:item:title](https://www.w3schools.com/xml/rss_tag_title_link_description_item.asp)
* `{description}` - [channel:item:description](https://www.w3schools.com/xml/rss_tag_title_link_description_item.asp)
* `{link}` - [channel:item:link](https://www.w3schools.com/xml/rss_tag_title_link_description_item.asp)
* `{pub_date}` - [channel:item:pub_date](https://www.w3schools.com/xml/rss_tag_pubdate_item.asp)
### 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
```
* значення `User` і `Group` та шляхів у мене вказані як користувач створеного мною сервера [Nexy](https://github.com/YGGverse/nexy), але якщо він у вас окремим обліковим записом, то створіть його командою `useradd -m rssto`
* `sudo systemctl enable rssto` - додати до авто-запуску при старті системи
* `sudo systemctl start rssto` - запуск
* `sudo systemctl status rssto` - перевірка статусу