mirror of
https://codeberg.org/postscriptum/devzone.org.ua.git
synced 2026-02-19 22:12:39 +00:00
119 lines
No EOL
9.1 KiB
Markdown
119 lines
No EOL
9.1 KiB
Markdown
# 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` - перевірка статусу |