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

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

* мінімалізм - мені не потрібен комбайн з вбудованим браузером, а лише список заголовків з певного сайту
* приватність - сучасні рішення мало приділяють уваги цьому питанню і часто пропускають сторонні запити навіть при використанні проксі
* агрегація - можливість читати новини в зручних для мене форматах

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

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

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

=> rssto-convert-rss-feeds-into-multiple-formats/rssto-yoda.png Скріншот

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

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

``` bash
git clone https://github.com/YGGverse/rssto.git
cd rssto
cargo build --release
sudo install target/release/rssto /usr/local/bin/rssto
```
=> install-latest-rust-version-on-linux.gmi Встановлення останньої версії Rust в Linux

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

Я спеціально навів приклад встановлення з репозиторію, тому що версія 0.2 ще не опублікована в стабільних релізах на crates.io. По цій же причині, не буду детально описувати усі доступні опції (можна подивитись з `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

=> https://www.w3schools.com/xml/rss_tag_title_link_description_channel.asp {title}
=> https://www.w3schools.com/xml/rss_tag_title_link_description_channel.asp {description}
=> https://www.w3schools.com/xml/rss_tag_link.asp {link}
=> https://www.w3schools.com/xml/rss_tag_language.asp {language}
=> https://www.w3schools.com/xml/rss_tag_pubdate.asp {pub_date}
* {last_build_date} - час генерації статичної версії фіду (програмою)
* {items} - список сутностей каналу, кожну з яких відформатовано за шаблоном "index/item"

### index/item

=> https://www.w3schools.com/xml/rss_tag_title_link_description_item.asp {title}
=> https://www.w3schools.com/xml/rss_tag_title_link_description_item.asp {description}
=> https://www.w3schools.com/xml/rss_tag_title_link_description_item.asp {link}
=> https://www.w3schools.com/xml/rss_tag_pubdate_item.asp {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
```
* значення "User" і "Group" та шляхів у мене вказані як користувач створеного мною сервера [Nexy](https://github.com/YGGverse/nexy), але якщо він у вас окремим обліковим записом, то створіть його командою `useradd -m rssto`
* `sudo systemctl enable rssto` - додати до авто-запуску при старті системи
* `sudo systemctl start rssto` - запуск
* `sudo systemctl status rssto` - перевірка статусу

## Посилання

=> https://github.com/YGGverse/rssto проєкт на GitHub
=> https://devzone.org.ua/post/rssto-konvertatsiia-fidiv-u-rizni-formaty Веб версія цього документу з коментарями на DevZone

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

=> rust-cross-compilation-with-cross-crate.gmi Простий спосіб крос-компіляції Rust з cross
=> gemini-protocol-as-http-alternative.gmi Протокол Gemini як альтернатива HTTP
=> nex-lightweight-gemini-alternative.gmi Протокол NEX - легка альтернатива Gemini
=> yggdrasil-is-network-with-distributed-routing.gmi Yggdrasil - мережа з децентралізованою маршрутизацією