{"id":20798174,"url":"https://github.com/mmesek/rssreader","last_synced_at":"2026-05-05T08:38:24.511Z","repository":{"id":132646654,"uuid":"253104285","full_name":"Mmesek/RSSReader","owner":"Mmesek","description":"Simple RSS Parser for Discord Embeds","archived":false,"fork":false,"pushed_at":"2024-11-10T00:36:11.000Z","size":191,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"microservice","last_synced_at":"2025-06-28T06:36:44.744Z","etag":null,"topics":["discord","discord-webhooks","python","rss","rss-reader","sqlalchemy-python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Mmesek.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"liberapay":"Mmesek","ko_fi":"Mmesek","custom":"https://www.paypal.me/TheMmesek"}},"created_at":"2020-04-04T21:43:20.000Z","updated_at":"2024-11-10T00:36:15.000Z","dependencies_parsed_at":"2024-11-17T16:38:45.260Z","dependency_job_id":"28e1e45a-0e74-4cac-955b-c25ff2cbe5a1","html_url":"https://github.com/Mmesek/RSSReader","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Mmesek/RSSReader","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mmesek%2FRSSReader","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mmesek%2FRSSReader/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mmesek%2FRSSReader/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mmesek%2FRSSReader/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Mmesek","download_url":"https://codeload.github.com/Mmesek/RSSReader/tar.gz/refs/heads/microservice","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mmesek%2FRSSReader/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266007855,"owners_count":23863532,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["discord","discord-webhooks","python","rss","rss-reader","sqlalchemy-python"],"created_at":"2024-11-17T16:36:56.345Z","updated_at":"2026-05-05T08:38:24.444Z","avatar_url":"https://github.com/Mmesek.png","language":"Python","funding_links":["https://liberapay.com/Mmesek","https://ko-fi.com/Mmesek","https://www.paypal.me/TheMmesek"],"categories":[],"sub_categories":[],"readme":"# RSSReader\n\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n\n[![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/Mmesek/RSSReader)](https://www.codefactor.io/repository/github/mmesek/rssreader/overview/main)\n[![Lines of code](https://sloc.xyz/github/Mmesek/RSSReader)]()\n[![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/Mmesek/RSSReader)]()\n[![GitHub repo size](https://img.shields.io/github/repo-size/Mmesek/RSSReader)]()\n\n[![GitHub issues](https://img.shields.io/github/issues/Mmesek/RSSReader)](../../issues)\n[![GitHub pull requests](https://img.shields.io/github/issues-pr/Mmesek/RSSReader)](../../pulls)\n[![GitHub contributors](https://img.shields.io/github/contributors/Mmesek/RSSReader)](../../graphs/contributors)\n[![Discord](https://img.shields.io/discord/517445947446525952)](https://discord.gg/RPHnebgZDs)\n\n[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)\n\nRSS feed parser sending entries as embeds via webhooks to Discord Channels\n\n## Installation\n\n```sh\ngit clone https://github.com/Mmesek/RSSReader.git\ncd RSSReader\npython -m pip install -r requirements.txt\n```\n\n## Configuration\n\nFeeds \u0026 Webhooks are stored in database\n\nDatabase configuration can be specified as either connection string as environment variable `DATABASE_URL`:\n\nUnix/Shell:\n```sh\nset DATABASE_URL=\"postgresql+psycopg2://postgres:PASSWORD:5432/public\"\n```\n\nWindows/Powershell:\n```powershell\n$env:DATABASE_URL = \"dialect+driver://user:PASSWORD:port/database\"\n```\n*Note that environment variable is temporary (until terminal session is closed)*\n\n\nor as `config.ini` with flag `--cfg=config.ini`:\n```ini\n[Database]\ndb = postgresql+psycopg2\nuser = postgres\npassword = PASSWORD\nlocation = 127.0.0.1\nport = 5432\nname = public\n```\n\n## Database Tables\n### Feed\nThere are stored tracked feeds:\n - `URL` to feed.\n - `last_post` being a timestamp of last entry in this feed.\n - `refresh_rate` when set, it won't attempt to fetch this feed again unless it's changed. Set to 0:00:00 to disable.\n\n### Feed_Component\nProcessing of feeds for each entry can be customized there. Available components can be found in `processors.py`\n\n### Subscription\nThis is many-to-many relationship between `Feed` and `Webhook` tables.\n\n### Webhook\nWebhook's `ID` and `Token` are stored here\n\n## Running\n\nWhole package is a run-once script, therefore if you want to run it more often, you'll need to setup cronjob to start it manually\n\nRun once:\n```sh\npython -m RSS\n```\n\nAs a cronjob at 15m interval:\n```sh\n*/15 * * * * python -m RSS\n```\n\nAlternatively if you deploy to Heroku, you can trigger it by restarting (deleting) Dyno with curl request:\n```sh\ncurl -n -X DELETE https://api.heroku.com/apps/{APP_NAME}/dynos -H \"Content-Type: application/json\" -H \"Accept: application/vnd.heroku+json; version=3\" -H \"Authorization: Bearer {TOKEN}\"\n```\n\n## Caveats\n\nCode has been tested in production against PostgreSQL. Free tier on either Heroku or Supabase should be well more than enough for simple use case. \n\nMySQL was tested in limited capacity and requires code modifications: \n- Removing `.filter()` from `Feed.get()` method\n- Adding length to all string based columns in `models.py` by replacing `sa.String` with for example `sa.String(100)`\n- Due to lack of `Interval` type, `refresh_rate` *may* not work there\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmmesek%2Frssreader","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmmesek%2Frssreader","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmmesek%2Frssreader/lists"}