initial commit

This commit is contained in:
postscriptum 2025-11-01 14:28:20 +02:00
commit d4994cde4c
61 changed files with 7044 additions and 0 deletions

View file

@ -0,0 +1,119 @@
# 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` - перевірка статусу