# 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` - перевірка статусу