Add feeds, mionr improvements and notes
This commit is contained in:
parent
bbc25d25b9
commit
f82550d24c
88 changed files with 2344 additions and 397 deletions
2
datasets/catalogues/cve.csv
Normal file
2
datasets/catalogues/cve.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Joomla! Security Announcements, https://developer.joomla.org/security-centre.feed?type=rss, en-US, Worldwide
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
MetaBrainz Blog, https://blog.metabrainz.org/feed/, en-US, Worldwide
|
MetaBrainz Blog, https://blog.metabrainz.org/feed/, en-US, Worldwide
|
||||||
|
MP3 NFO Database, https://nfodb.ru/rss.php, en-US, Worldwide
|
||||||
|
|
|
|
@ -1,3 +1,4 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
Linux-Unix Daily Fortunes - Quotes & Quips - motd.ambians.com, https://motd.ambians.com/out/rss/daily-fortunes.xml, en-US, USA
|
Linux-Unix Daily Fortunes - Quotes & Quips - motd.ambians.com, https://motd.ambians.com/out/rss/daily-fortunes.xml, en-US, United States
|
||||||
Shakespeare Quotes & Plays, https://shakespearequotesandplays.com/feed/, en-US, USA
|
Shakespeare Quotes & Plays, https://shakespearequotesandplays.com/feed/, en-US, United States
|
||||||
|
Chabad -- Daily Quote, https://www.chabad.org/tools/rss/dailyquote_rss.xml, en-US, United States
|
||||||
|
|
|
39
datasets/catalogues/recipe.csv
Normal file
39
datasets/catalogues/recipe.csv
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
name, url, language, country
|
||||||
|
101 Cookbooks, https://www.101cookbooks.com/feed, en-US, United States
|
||||||
|
A Sweet Pea Chef, https://www.asweetpeachef.com/feed/, en-US, United States
|
||||||
|
Annalena's Heart(h)beat, https://www.annalenashearthbeat.com/feed/, en-US, United States
|
||||||
|
Ask Anna, https://askannamoseley.com/feed/, en-US, United States
|
||||||
|
Based Cooking, https://based.cooking/index.xml, en-US, United States
|
||||||
|
Bon Appétit, https://www.bonappetit.com/feed/rss, en-US, United States
|
||||||
|
Cook Nourish Bliss, https://cooknourishbliss.com/feed/, en-US, United States
|
||||||
|
Easy Cooking with Molly, https://www.easycookingwithmolly.com/feed/, en-US, United States
|
||||||
|
Easy Peasy Japanesey, http://www.easypeasyjapanesey.com/blogeasypeasyjapanesey?format=rss, en-US, United States
|
||||||
|
Farmers Forum, https://farmersforum.com/feed/, en-US, United States
|
||||||
|
FatHub, https://fathub.org/feed/, en-US, United States
|
||||||
|
Foodly, http://foodly.com/feed/, en-US, United States
|
||||||
|
Freeze Dry Guy, https://freezedryguy.com/feed/, en-US, United States
|
||||||
|
Heathen Herbs, https://heathenherbs.com/feed/, en-US, United States
|
||||||
|
Healthy and Natural World, https://www.healthyandnaturalworld.com/feed/, en-US, United States
|
||||||
|
Jamie Oliver, https://www.jamieoliver.com/feed/, en-US, United States
|
||||||
|
Jacob's Guide to Possibly Delicious Food, https://jacobwsmith.xyz/cookbook/rss.xml, en-US, United States
|
||||||
|
Juicing for Health, https://juicing-for-health.com/feed, en-US, United States
|
||||||
|
Love & Lemons, https://www.loveandlemons.com/feed/, en-US, United States
|
||||||
|
Melon's Thoughts - Recipes, https://thoughts.melonking.net/atom/?section=recipes, en-US, United States
|
||||||
|
Mercola.com, https://articles.mercola.com/sites/articles/rss.aspx, en-US, United States
|
||||||
|
Mindful, https://www.mindful.org/feed/, en-US, United States
|
||||||
|
Mythic food, https://themythicbox.com/feed/, en-US, United States
|
||||||
|
Nutrition Australia, https://nutritionaustralia.org/category/recipes/feed/, en-US, United States
|
||||||
|
Pinch of Yum, https://pinchofyum.com/feed, en-US, United States
|
||||||
|
Plant Based with Amy, https://plantbasedwithamy.com/feed/, en-US, United States
|
||||||
|
PUNCH, https://punchdrink.com/feed/, en-US, United States
|
||||||
|
Recipes on marginalia.nu, https://www.marginalia.nu/recipes/index.xml, en-US, United States
|
||||||
|
Recipes With Olive Oil, https://recipeswitholiveoil.com/feed/, en-US, United States
|
||||||
|
Sally's Baking Addiction, https://sallysbakingaddiction.com/feed/, en-US, United States
|
||||||
|
SheKnows, https://www.sheknows.com/food-and-recipes/feed/, en-US, United States
|
||||||
|
Step To Health, https://steptohealth.com/feed/, en-US, United States
|
||||||
|
Steve Kirsch, https://stevekirsch.substack.com/feed, en-US, United States
|
||||||
|
Stop Dirty Electricity, https://stopdirtyelectricity.com/feed/, en-US, United States
|
||||||
|
The Green Loot, https://thegreenloot.com/feed/, en-US, United States
|
||||||
|
The Pretty Bee, https://theprettybee.com/feed/, en-US, United States
|
||||||
|
Traditional Cooking School, https://traditionalcookingschool.com/feed/, en-US, United States
|
||||||
|
Wonderful Cook, https://wonderfulcook.com/feed/, en-US, United States
|
|
|
@ -15,3 +15,5 @@ Latest extensions in GNOME Shell Extensions, https://extensions.gnome.org/rss/,
|
||||||
DistroWatch.com: News, https://distrowatch.com/news/dw.xml, en-US, Worldwide
|
DistroWatch.com: News, https://distrowatch.com/news/dw.xml, en-US, Worldwide
|
||||||
GreasyFork: Recently Updates Userscripts, https://greasyfork.org/en/scripts.atom?sort=updated, en-US, Worldwide
|
GreasyFork: Recently Updates Userscripts, https://greasyfork.org/en/scripts.atom?sort=updated, en-US, Worldwide
|
||||||
xfce-look.org - Latest Products, https://www.xfce-look.org/content.rdf, en-US, Worldwide
|
xfce-look.org - Latest Products, https://www.xfce-look.org/content.rdf, en-US, Worldwide
|
||||||
|
Newest Python PEPs, https://peps.python.org/peps.rss/, en-US, Worldwide
|
||||||
|
Joomla! Extensions, https://extensions.joomla.org/browse/new/?format=feed&type=rss, en-US, Worldwide
|
||||||
|
|
|
2
datasets/catalogues/travel.csv
Normal file
2
datasets/catalogues/travel.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Trip101, https://trip101.com/feed, en-US, United States
|
|
2
datasets/catalogues/vacancy.csv
Normal file
2
datasets/catalogues/vacancy.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Job Openings at EFF, https://www.eff.org/about/opportunities/jobs/feed, en-US, United States
|
|
2
datasets/catalogues/webring.csv
Normal file
2
datasets/catalogues/webring.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Webring Enthusiasts of the Fediverse, https://fediverse-webring-enthusiasts.glitch.me/index.opml, en-US, United States
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
Panic Blog, https://www.panic.com/blog/feed/, en-US, United States
|
Panic Blog, https://www.panic.com/blog/feed/, en-US, United States
|
||||||
|
Necuno Solutions, https://necunos.com/feed.xml, en-US, Finland
|
||||||
|
|
|
2
datasets/corporations/data.csv
Normal file
2
datasets/corporations/data.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Confluent: Data in motion, https://www.confluent.io/rss.xml, en-US, United States
|
|
2
datasets/corporations/delivery.csv
Normal file
2
datasets/corporations/delivery.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Venipak, https://venipak.com/feed/, en-US, Nederland
|
|
8
datasets/events/computing.csv
Normal file
8
datasets/events/computing.csv
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
name, url, language, country
|
||||||
|
PyCon US, https://fosstodon.org/@pycon.rss, en-US, United States
|
||||||
|
PyTexas, https://fosstodon.org/@pytexas.rss, en-US, United States
|
||||||
|
PyConZA, https://fosstodon.org/@pyconza.rss, en-US, South Africa
|
||||||
|
PyCon Sweden, https://fosstodon.org/@pyconsweden.rss, en-US, Sweden
|
||||||
|
FSFE Events, https://fsfe.org/events/events.en.rss, en-US, Germany
|
||||||
|
FSFE Events (FR), https://fsfe.org/events/events.fr.rss, fr-FR, Germany
|
||||||
|
FSFE Events (DE), https://fsfe.org/events/events.de.rss, de-DE, Germany
|
|
2
datasets/events/graphics.csv
Normal file
2
datasets/events/graphics.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Blender Developer Forum - Meetings, https://devtalk.blender.org/c/meetings/28.rss, en-US, USA
|
|
2
datasets/forums/cms.csv
Normal file
2
datasets/forums/cms.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Zola, https://zola.discourse.group/posts.rss, en-US, Worldwide
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
SQLite, https://sqlite.org/forum/timeline.rss, en-US, Worldwide
|
SQLite, https://sqlite.org/forum/timeline.rss, en-US, Worldwide
|
||||||
|
Camen Design Forum, https://forum.camendesign.com/index.xml, en-US, United States
|
||||||
|
|
|
2
datasets/forums/graphics.csv
Normal file
2
datasets/forums/graphics.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Blender Developer Forum - Latest posts, https://devtalk.blender.org/posts.rss, en-US, USA
|
|
4
datasets/governments/switzerland.csv
Normal file
4
datasets/governments/switzerland.csv
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
name, url, language, country
|
||||||
|
News Service Bund [DE], https://www.newsd.admin.ch/newsd/feeds/rss?lang=de&org-nr=1&topic=&keyword=&offer-nr=&catalogueElement=&kind=M%2CR&start_date=2021-07-01&end_date=, de-CH, Switzerland
|
||||||
|
News Service Bund [FR], https://www.newsd.admin.ch/newsd/feeds/rss?lang=fr&org-nr=1&topic=&keyword=&offer-nr=&catalogueElement=&kind=M%2CR&start_date=2021-07-01&end_date=, fr-CH, Switzerland
|
||||||
|
News Service Bund [IT], https://www.newsd.admin.ch/newsd/feeds/rss?lang=it&org-nr=1&topic=&keyword=&offer-nr=&catalogueElement=&kind=M%2CR&start_date=2021-07-01&end_date=, it-CH, Switzerland
|
|
1054
datasets/governments/united_Kingdom.csv.old
Normal file
1054
datasets/governments/united_Kingdom.csv.old
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1 +1,2 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
|
Chiportal, https://chiportal.co.il/feed/, he-IL, Israel
|
||||||
|
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
Mail Online - Australia Home, https://www.dailymail.co.uk/auhome/index.rss, en-US, Australia
|
Mail Online - Australia Home, https://www.dailymail.co.uk/auhome/index.rss, en-US, Australia
|
||||||
|
בית חבד מלבורן, https://chabadmel.com/feed/, he-IL, Australia
|
||||||
|
|
|
|
@ -1,3 +1,4 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
CryptoSlate, https://cryptoslate.com/feed/, en-US, USA
|
CryptoSlate, https://cryptoslate.com/feed/, en-US, United States
|
||||||
CryptoPotato, https://cryptopotato.com/feed/, en-US, USA
|
CryptoPotato, https://cryptopotato.com/feed/, en-US, United States
|
||||||
|
Decrypt, https://decrypt.co/feed, , en-US, United States
|
||||||
|
|
|
26
datasets/news/bsd_linux_unix.csv
Normal file
26
datasets/news/bsd_linux_unix.csv
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
name, url, language, country
|
||||||
|
Linux Professional Institute (LPI), https://www.lpi.org/feed/, en-US, Canada
|
||||||
|
LinuxConfig, https://linuxconfig.org/feed, en-US, Worldwide
|
||||||
|
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, United States
|
||||||
|
Anjan Momi, https://momi.ca/feed.xml, en-US, United States
|
||||||
|
postmarketOS, https://postmarketos.org/blog/feed.atom, en-US, United States
|
||||||
|
PureTryOut (Alpine Linux, postmarketOS), https://mastodon.fam-ribbers.com/@bart.rss, en-US, Netherlands
|
||||||
|
Blog on Bart Ribbers - PureTryOut (Alpine Linux, postmarketOS), https://fam-ribbers.com/blog/index.xml, en-US, Netherlands
|
||||||
|
Necuno Solutions, https://necunos.com/feed.xml, en-US, Finland
|
||||||
|
Alpine Linux, https://fosstodon.org/@alpinelinux.rss, en-US, United States
|
||||||
|
ollieparanoid, https://ollieparanoid.github.io/feed.xml, en-US, United States
|
||||||
|
FSFE News, https://fsfe.org/news/news.en.rss, en-US, Germany
|
||||||
|
FSFE News (DE), https://fsfe.org/news/news.de.rss, de-DE, Germany
|
||||||
|
9to5Linux, https://9to5linux.com/feed, en-US, United States
|
||||||
|
FSFE News (FR), https://fsfe.org/news/news.fr.rss, fr-FR, Germany
|
||||||
|
GNOME adventures in mobile, https://blogs.gnome.org/pabloyoyoista/feed/, en-US, United States
|
||||||
|
Akademy, https://floss.social/@akademy.rss, en-US, United States
|
||||||
|
KDE, https://floss.social/@kde.rss, en-US, United States
|
||||||
|
Justine Smithies blog, https://justine.smithies.me.uk/atom.xml, en-US, United States
|
||||||
|
Justine Smithies, https://fosstodon.org/@JustineSmithies.rss, en-US, United States
|
||||||
|
TuxPhones, https://tuxphones.com/rss/, en-US, United States
|
||||||
|
Collabora Office and Collabora Online, https://www.collaboraoffice.com/feed/, en-US, United States
|
||||||
|
LGUG2Z, https://lgug2z.com/index.xml, en-US, United States
|
||||||
|
Hugo Barrera's site, https://whynothugo.nl/posts.xml, en-US, United States
|
||||||
|
Solene'%, https://dataswamp.org/~solene/rss.xml, en-US, United States
|
||||||
|
Solene'%, https://dataswamp.org/~solene/rss-html.xml, en-US, United States
|
|
7
datasets/news/code.csv
Normal file
7
datasets/news/code.csv
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
name, url, language, country
|
||||||
|
Tristan B. Velloza Kildaire, https://gleasonator.com/@deavmi, en-ZA, South Africa
|
||||||
|
Karl Bartel's Website, https://www.karl.berlin/atom.xml, en-US, Germany
|
||||||
|
Newest Python PEPs, https://peps.python.org/peps.rss/, en-US, Worldwide
|
||||||
|
Victor Stinner blog 3, https://vstinner.github.io/feeds/all.atom.xml, en-US, Worldwide
|
||||||
|
Victor Stinner 🐍, https://mamot.fr/@vstinner.rss, en-US, Worldwide
|
||||||
|
camen design, https://camendesign.com/rss, en-US, USA
|
|
49
datasets/news/computer.csv
Normal file
49
datasets/news/computer.csv
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
name, url, language, country
|
||||||
|
camen design, https://camendesign.com/rss, en-US, USA
|
||||||
|
computers are bad, https://computer.rip/rss.xml, en-US, Worldwide
|
||||||
|
Jacob McCormick, https://mccor.xyz/rss.xml, en-US, United States
|
||||||
|
ju_hnny5, https://blog.jbriault.fr/rss/, fr-FR, France
|
||||||
|
Lazy Reading | The Cyber Vanguard, https://cyber.dabamos.de/blog/feed.rss, en-US, United States
|
||||||
|
XXIIVV, https://wiki.xxiivv.com/links/rss.xml, en-US, Canada
|
||||||
|
Proycon's website, https://proycon.anaproy.nl/rss.xml, en-US, Netherlands
|
||||||
|
Nathan R. Yergler, https://yergler.net/feed.xml, en-US, United States
|
||||||
|
ynet - דיגיטל, https://www.ynet.co.il/Integration/StoryRss544.xml, he-IL, Israel
|
||||||
|
schollz, https://schollz.com/index.xml, en-US, United States
|
||||||
|
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, United States
|
||||||
|
Newest Python PEPs, https://peps.python.org/peps.rss/, en-US, Worldwide
|
||||||
|
Chiportal, https://chiportal.co.il/feed/, he-IL, Israel
|
||||||
|
Hackaday, https://hackaday.com/feed/, en-US, United States
|
||||||
|
Amethyst Reese, https://noswap.com/feed.xml, en-US, United States
|
||||||
|
electro·pizza, https://electro.pizza/feed.xml, en-US, United States
|
||||||
|
VironIT, https://vironit.com/feed/, en-US, Georgia
|
||||||
|
Necuno Solutions, https://necunos.com/feed.xml, en-US, Finland
|
||||||
|
Flipper Blog, https://blog.flipper.net/rss/, en-US, United States
|
||||||
|
Tristan B. Velloza Kildaire, https://gleasonator.com/@deavmi, en-ZA, South Africa
|
||||||
|
ollieparanoid, https://ollieparanoid.github.io/feed.xml, en-US, United States
|
||||||
|
FSFE News, https://fsfe.org/news/news.en.rss, en-US, Germany
|
||||||
|
FSFE News (DE), https://fsfe.org/news/news.de.rss, de-DE, Germany
|
||||||
|
FSFE News (FR), https://fsfe.org/news/news.fr.rss, fr-FR, Germany
|
||||||
|
Free Software Foundation Europe, https://mastodon.social/@fsfe.rss, en-US, Germany
|
||||||
|
heise online News, https://www.heise.de/rss/heise-atom.xml, de-DE, Germany
|
||||||
|
c't Magazin, https://social.heise.de/@ct_Magazin.rss, de-DE, Germany
|
||||||
|
GNOME adventures in mobile, https://blogs.gnome.org/pabloyoyoista/feed/, en-US, United States
|
||||||
|
EFF's Deeplinks Blog, https://www.eff.org/rss/updates.xml, en-US, United States
|
||||||
|
Heracles Papatheodorou • heracl.es, https://heracl.es/feed.xml, en-US, United States
|
||||||
|
Aphrodite.dev, https://www.aphrodite.dev/~blog/feed.xml, en-US, United States
|
||||||
|
Quinlan Pfiffer's Site, https://q.pfiffer.org/feed.xml, en-US, United States
|
||||||
|
mrshll.com, https://mrshll.com/feed.rss, en-US, United States
|
||||||
|
9to5Linux, https://9to5linux.com/feed, en-US, United States
|
||||||
|
TuxPhones, https://tuxphones.com/rss/, en-US, United States
|
||||||
|
OpenSource.net, https://opensource.net/feed/, en-US, United States
|
||||||
|
Collabora Office and Collabora Online, https://www.collaboraoffice.com/feed/, en-US, United States
|
||||||
|
LGUG2Z, https://lgug2z.com/index.xml, en-US, United States
|
||||||
|
Karl Bartel's Website, https://www.karl.berlin/atom.xml, en-US, Germany
|
||||||
|
Victor Stinner blog 3, https://vstinner.github.io/feeds/all.atom.xml, en-US, Worldwide
|
||||||
|
Victor Stinner 🐍, https://mamot.fr/@vstinner.rss, en-US, Worldwide
|
||||||
|
Hugo Barrera's site, https://whynothugo.nl/posts.xml, en-US, United States
|
||||||
|
Ηρακλής Παπαθεοδώρου • heracl.es, https://heracl.es/el/feed.xml, el-GR, Greece
|
||||||
|
Heracles Papatheodorou • heracl.es, https://heracl.es/feed.xml, en-US, Greece
|
||||||
|
Solene'%, https://dataswamp.org/~solene/rss.xml, en-US, United States
|
||||||
|
Solene'%, https://dataswamp.org/~solene/rss-html.xml, en-US, United States
|
||||||
|
Camen Design Forum, https://forum.camendesign.com/index.xml, en-US, United States
|
||||||
|
dthompson, https://dthompson.us/feed.xml, en-US, Worldwide
|
|
|
@ -1,11 +0,0 @@
|
||||||
name, url, language, country
|
|
||||||
computers are bad, https://computer.rip/rss.xml, en-US, Worldwide
|
|
||||||
Jacob McCormick, https://mccor.xyz/rss.xml, en-US, USA
|
|
||||||
ju_hnny5, https://blog.jbriault.fr/rss/, fr-FR, France
|
|
||||||
Lazy Reading | The Cyber Vanguard, https://cyber.dabamos.de/blog/feed.rss, en-US, USA
|
|
||||||
XXIIVV, https://wiki.xxiivv.com/links/rss.xml, en-US, Canada
|
|
||||||
Proycon's website, https://proycon.anaproy.nl/rss.xml, en-US, Netherlands
|
|
||||||
Nathan R. Yergler, https://yergler.net/feed.xml, en-US, USA
|
|
||||||
ynet - דיגיטל, https://www.ynet.co.il/Integration/StoryRss544.xml, he-IL, Israel
|
|
||||||
schollz, https://schollz.com/index.xml, en-US, USA
|
|
||||||
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, USA
|
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
The Smoking Gun RSS, http://thesmokinggun.com/rss, en-US, USA
|
The Smoking Gun RSS, http://thesmokinggun.com/rss, en-US, USA
|
||||||
|
Tampa Free Press, https://www.tampafp.com/feed/, en-US, USA
|
||||||
|
|
|
|
@ -1,6 +1,13 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
|
Jerm Warfare, https://jermwarfare.com/feed, en-US, USA
|
||||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
||||||
The Public Domain Review, https://publicdomainreview.org/rss.xml, en-US, USA
|
The Public Domain Review, https://publicdomainreview.org/rss.xml, en-US, USA
|
||||||
ynet - תרבות, https://www.ynet.co.il/Integration/StoryRss538.xml, he-IL, Israel
|
ynet - תרבות, https://www.ynet.co.il/Integration/StoryRss538.xml, he-IL, Israel
|
||||||
ynet - Culture, https://www.ynet.co.il/Integration/StoryRss3086.xml, en-IL, Israel
|
ynet - Culture, https://www.ynet.co.il/Integration/StoryRss3086.xml, en-IL, Israel
|
||||||
ynet - חדר משלך, https://www.ynet.co.il/Integration/StoryRss4111.xml, he-IL, Israel
|
ynet - חדר משלך, https://www.ynet.co.il/Integration/StoryRss4111.xml, he-IL, Israel
|
||||||
|
Tampa Free Press, https://www.tampafp.com/feed/, en-US, USA
|
||||||
|
Deutsche Welle: DW.com KULTUR & LEBEN, http://rss.dw.com/atom/rss-de-cul, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com KULTUR & LEBEN: BÜCHER, http://rss.dw.com/atom/rss-de-cul-buch, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com KULTUR & LEBEN: FILM, http://rss.dw.com/atom/rss-de-cul-film, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com KULTUR & LEBEN: MUSIK, http://rss.dw.com/atom/rss-de-cul-musik, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com DEUTSCHLAND ENTDECKEN, http://rss.dw.com/atom/rss-de-deutschlandentdecken, de-DE, Germany
|
||||||
|
|
|
|
@ -1 +1,8 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
|
Michael W Lucas, https://mwl.io/feed, en-US, United States
|
||||||
|
Necuno Solutions, https://necunos.com/feed.xml, en-US, Finland
|
||||||
|
Flipper Blog, https://blog.flipper.net/rss/, en-US, United States
|
||||||
|
ollieparanoid, https://ollieparanoid.github.io/feed.xml, en-US, United States
|
||||||
|
FSFE News, https://fsfe.org/news/news.en.rss, en-US, Germany
|
||||||
|
FSFE News (DE), https://fsfe.org/news/news.de.rss, de-DE, Germany
|
||||||
|
FSFE News (FR), https://fsfe.org/news/news.fr.rss, fr-FR, Germany
|
||||||
|
|
|
|
@ -1,2 +1,12 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, USA
|
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, United States
|
||||||
|
Flipper Blog, https://blog.flipper.net/rss/, en-US, United States
|
||||||
|
ollieparanoid, https://ollieparanoid.github.io/feed.xml, en-US, United States
|
||||||
|
FSFE News, https://fsfe.org/news/news.en.rss, en-US, Germany
|
||||||
|
FSFE News (DE), https://fsfe.org/news/news.de.rss, de-DE, Germany
|
||||||
|
FSFE News (FR), https://fsfe.org/news/news.fr.rss, fr-FR, Germany
|
||||||
|
heise online News, https://www.heise.de/rss/heise-atom.xml, de-DE, Germany
|
||||||
|
c't Magazin, https://social.heise.de/@ct_Magazin.rss, de-DE, Germany
|
||||||
|
electro·pizza, https://electro.pizza/feed.xml, en-US, United States
|
||||||
|
Ηρακλής Παπαθεοδώρου • heracl.es, https://heracl.es/el/feed.xml, el-GR, Greece
|
||||||
|
Heracles Papatheodorou • heracl.es, https://heracl.es/feed.xml, en-US, Greece
|
||||||
|
|
|
|
@ -1,3 +1,5 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
Mail Online - TV & showbiz, https://www.dailymail.co.uk/tvshowbiz/index.rss, en-US, USA
|
Mail Online - TV & showbiz, https://www.dailymail.co.uk/tvshowbiz/index.rss, en-US, USA
|
||||||
Mail Online, https://www.dailymail.co.uk/news/index.rss, en-US, USA
|
Mail Online, https://www.dailymail.co.uk/news/index.rss, en-US, USA
|
||||||
|
Deutsche Welle: DW.com KULTUR & LEBEN: MUSIK, http://rss.dw.com/atom/rss-de-cul-musik, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com KULTUR & LEBEN: FILM, http://rss.dw.com/atom/rss-de-cul-film, de-DE, Germany
|
||||||
|
|
|
|
@ -1,3 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
Mom on a Mission, https://www.mom-on-a-mission.blog/all-posts?format=rss, en-US, USA
|
Mom on a Mission, https://www.mom-on-a-mission.blog/all-posts?format=rss, en-US, United States
|
||||||
ynet - הורים, https://www.ynet.co.il/Integration/StoryRss3052.xml, he-IL, Israel
|
ynet - הורים, https://www.ynet.co.il/Integration/StoryRss3052.xml, he-IL, Israel
|
||||||
|
|
|
4
datasets/news/farm.csv
Normal file
4
datasets/news/farm.csv
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
name, url, language, country
|
||||||
|
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, United States
|
||||||
|
כנס מדיה, https://kenes-media.com/feed/, he-IL, Israel
|
||||||
|
|
|
|
@ -1,10 +1,11 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
ynet - מדע, https://www.ynet.co.il/Integration/StoryRss2142.xml, he-IL, Israel
|
ynet - מדע, https://www.ynet.co.il/Integration/StoryRss2142.xml, he-IL, Israel
|
||||||
Stories by Williams, https://storiesbywilliams.com/feed/, en-US, USA
|
Stories by Williams, https://storiesbywilliams.com/feed/, en-US, United States
|
||||||
SciTechDaily, https://scitechdaily.com/feed/, en-US, USA
|
SciTechDaily, https://scitechdaily.com/feed/, en-US, United States
|
||||||
ScienceDaily, https://www.sciencedaily.com/rss/all.xml, en-US, USA
|
ScienceDaily, https://www.sciencedaily.com/rss/all.xml, en-US, United States
|
||||||
ScienceAlert, https://www.sciencealert.com/feed, en-US, USA
|
ScienceAlert, https://www.sciencealert.com/feed, en-US, United States
|
||||||
NASA Image of the Day, https://www.nasa.gov/feeds/iotd-feed, en-US, USA
|
NASA Image of the Day, https://www.nasa.gov/feeds/iotd-feed, en-US, United States
|
||||||
Futurism, https://futurism.com/feed, en-US, USA
|
Futurism, https://futurism.com/feed, en-US, United States
|
||||||
Nature, https://www.nature.com/nature.rss, en-US, USA
|
Nature, https://www.nature.com/nature.rss, en-US, United States
|
||||||
Mail Online - Science & tech, https://www.dailymail.co.uk/sciencetech/index.rss, en-US, UK
|
Mail Online - Science & tech, https://www.dailymail.co.uk/sciencetech/index.rss, en-US, United Kingdom
|
||||||
|
New Atlas, https://newatlas.com/index.rss, en-US, United States
|
||||||
|
|
|
|
@ -10,3 +10,5 @@ nobulart - Exploring the Great Reset, https://nobulart.com/feed/, en-US, USA
|
||||||
Jerm Warfare, https://jermwarfare.com/feed, en-US, USA
|
Jerm Warfare, https://jermwarfare.com/feed, en-US, USA
|
||||||
Daily Stormer, https://dailystormer.in/feed/, en-US, USA
|
Daily Stormer, https://dailystormer.in/feed/, en-US, USA
|
||||||
Associated Press News, https://apnews.com/index.rss, en-US, USA
|
Associated Press News, https://apnews.com/index.rss, en-US, USA
|
||||||
|
Deutsche Welle: DW.com NACHRICHTEN, http://rss.dw.com/atom/rss-de-news, de-DE, Germany
|
||||||
|
Real Liberty Media, https://www.reallibertymedia.com/feed/, en-US, United States
|
||||||
|
|
|
9
datasets/news/germany.csv
Normal file
9
datasets/news/germany.csv
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
name, url, language, country
|
||||||
|
Deutsche Welle: DW.com DEUTSCHE WELLE GESAMT, http://rss.dw.com/atom/rss-de-all, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com THEMEN DES TAGES, http://rss.dw.com/atom/rss-de-top, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com NACHRICHTEN, http://rss.dw.com/atom/rss-de-news, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com WISSENSCHAFT, http://rss.dw.com/atom/rss-de-wissenschaft, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com DEUTSCHLAND ENTDECKEN, http://rss.dw.com/atom/rss-de-deutschlandentdecken, de-DE, Germany
|
||||||
|
Deutsche Welle: DW.com PRESSE, http://rss.dw.com/atom/presse, de-DE, Germany
|
||||||
|
"ZEIT ONLINE | Nachrichten, News, Hintergründe und Debatten", https://newsfeed.zeit.de/index, de-DE, Germany
|
||||||
|
strukturart.com latest articles,https://strukturart.com/feed, de-DE, Germany
|
|
|
@ -1,9 +1,13 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
The Corbett Report, https://www.corbettreport.com/feed/, en-US, Japan
|
The Corbett Report, https://www.corbettreport.com/feed/, en-US, Japan
|
||||||
ZeroGov, https://zerogov.com/feed/, en-US, USA
|
ZeroGov, https://zerogov.com/feed/, en-US, United States
|
||||||
Daily Stormer, https://dailystormer.in/feed/, en-US, USA
|
Daily Stormer, https://dailystormer.in/feed/, en-US, United States
|
||||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, United States
|
||||||
The Hill News, https://thehill.com/feed/?feed=partnerfeed-news-feed&format=rss, en-US, USA
|
The Hill News, https://thehill.com/feed/?feed=partnerfeed-news-feed&format=rss, en-US, United States
|
||||||
nobulart - Exploring the Great Reset, https://nobulart.com/feed/, en-US, USA
|
nobulart - Exploring the Great Reset, https://nobulart.com/feed/, en-US, United States
|
||||||
John W. Whitehead, Constitutional Attorney, https://agovernmentofwolves.com/feed/, en-US, USA
|
John W. Whitehead, Constitutional Attorney, https://agovernmentofwolves.com/feed/, en-US, United States
|
||||||
BlackListed News, https://www.blacklistednews.com/rss.php, en-US, USA
|
BlackListed News, https://www.blacklistednews.com/rss.php, en-US, United States
|
||||||
|
Tampa Free Press, https://www.tampafp.com/feed/, en-US, United States
|
||||||
|
Deutsche Welle: DW.com POLITIK, http://rss.dw.com/atom/rss_de_politik, de-DE, Germany
|
||||||
|
Real Liberty Media, https://www.reallibertymedia.com/feed/, en-US, United States
|
||||||
|
Robert Reich, https://robertreich.substack.com/feed, en-US, United States
|
||||||
|
|
|
2
datasets/news/hacking.csv
Normal file
2
datasets/news/hacking.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Flipper Blog, https://blog.flipper.net/rss/, en-US, United States
|
|
|
@ -1,2 +1,11 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
soeren-hentzschel.at - Aktuelles zu Mozilla, https://www.soeren-hentzschel.at/feed/, de-DE, Germany
|
soeren-hentzschel.at - Aktuelles zu Mozilla, https://www.soeren-hentzschel.at/feed/, de-DE, Germany
|
||||||
|
WordPress.com News, https://wordpress.com/blog/feed/, en-US, United States
|
||||||
|
Micro.blog News, https://news.micro.blog/feed.xml, en-US, United States
|
||||||
|
EFF Action Center, https://act.eff.org/action.atom, en-US, United States
|
||||||
|
Melon's Thoughts - Guidebooks, https://thoughts.melonking.net/atom/?section=guides, en-US, United States
|
||||||
|
thecozy.cat, https://thecozy.cat/feed/, en-US, United States
|
||||||
|
Melon's Thoughts, https://thoughts.melonking.net/atom/, en-US, United States
|
||||||
|
An RSS Blog, https://www.rss-specifications.com/blog-feed.xml, en-US, United States
|
||||||
|
The Blog Starter, https://www.theblogstarter.com/feed/, en-US, United States
|
||||||
|
Mozilla Hacks, https://hacks.mozilla.org/feed/, en-US, United States
|
||||||
|
|
|
|
@ -7,4 +7,6 @@ ynet - News, https://www.ynet.co.il/Integration/StoryRss3082.xml, en-IL, Israel
|
||||||
העין השביעית, https://www.the7eye.org.il/feed, he-IL, Israel
|
העין השביעית, https://www.the7eye.org.il/feed, he-IL, Israel
|
||||||
ynet - מעורבות, https://www.ynet.co.il/Integration/StoryRss3262.xml, he-IL, Israel
|
ynet - מעורבות, https://www.ynet.co.il/Integration/StoryRss3262.xml, he-IL, Israel
|
||||||
Jerm Warfare, https://jermwarfare.com/feed, en-US, USA
|
Jerm Warfare, https://jermwarfare.com/feed, en-US, USA
|
||||||
|
Chiportal, https://chiportal.co.il/feed/, he-IL, Israel
|
||||||
|
כפר ביל"ו, https://bilu.org.il/feed/, he-IL, Israel
|
||||||
|
כנס מדיה, https://kenes-media.com/feed/, he-IL, Israel
|
||||||
|
|
Can't render this file because it contains an unexpected character in line 11 and column 14.
|
|
@ -3,4 +3,10 @@ name, url, language, country
|
||||||
ynet - יהדות, https://www.ynet.co.il/Integration/StoryRss4403.xml, he-IL, Israel
|
ynet - יהדות, https://www.ynet.co.il/Integration/StoryRss4403.xml, he-IL, Israel
|
||||||
ynet - Jewish, https://www.ynet.co.il/Integration/StoryRss3443.xml, en-IL, Israel
|
ynet - Jewish, https://www.ynet.co.il/Integration/StoryRss3443.xml, en-IL, Israel
|
||||||
Jerm Warfare, https://jermwarfare.com/feed, en-US, USA
|
Jerm Warfare, https://jermwarfare.com/feed, en-US, USA
|
||||||
|
בית חבד מלבורן, https://chabadmel.com/feed/, he-IL, Australia
|
||||||
|
Chabad Weekly Magazine, https://www.chabad.org/tools/rss/magazine_rss.xml, en-US, Worldwide
|
||||||
|
Chabad Parsha, https://www.chabad.org/tools/rss/parsha_rss.xml, en-US, Worldwide
|
||||||
|
Chabad Daily Study, https://www.chabad.org/tools/rss/dailystudy_rss.xml, en-US, Worldwide
|
||||||
|
Chabad Omer Counter, https://www.chabad.org/tools/rss/omer_rss.xml, en-US, Worldwide
|
||||||
|
Chabad Lubavitch News, https://www.chabad.org/tools/rss/news_rss.xml, en-US, Worldwide
|
||||||
|
Chabad-Lubavitch in the Media, https://www.chabad.org/tools/rss/inthemedia_rss.xml, en-US, Worldwide
|
||||||
|
|
|
|
@ -1,5 +1,6 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
Jacob McCormick, https://mccor.xyz/rss.xml, en-US, USA
|
Jacob McCormick, https://mccor.xyz/rss.xml, en-US, United States
|
||||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, United States
|
||||||
XXIIVV, https://wiki.xxiivv.com/links/rss.xml, en-US, Canada
|
XXIIVV, https://wiki.xxiivv.com/links/rss.xml, en-US, Canada
|
||||||
Divine Lifestyle, https://divinelifestyle.com/feed/, en-US, USA
|
Divine Lifestyle, https://divinelifestyle.com/feed/, en-US, United States
|
||||||
|
lectronice :: now, https://now.lectronice.com/feed.xml, en-US, United States
|
||||||
|
|
|
|
@ -1,4 +0,0 @@
|
||||||
name, url, language, country
|
|
||||||
Linux Professional Institute (LPI), https://www.lpi.org/feed/, en-US, Canada
|
|
||||||
LinuxConfig, https://linuxconfig.org/feed, en-US, Worldwide
|
|
||||||
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, USA
|
|
|
4
datasets/news/literature.csv
Normal file
4
datasets/news/literature.csv
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
name, url, language, country
|
||||||
|
Stories by Williams, https://storiesbywilliams.com/feed/, en-US, United States
|
||||||
|
Lili Saintcrow, https://www.lilithsaintcrow.com/feed/, en-US, United States
|
||||||
|
Shannon Kay, https://blog.shannonkay.me/feed.xml, en-US, United States
|
|
2
datasets/news/local.csv
Normal file
2
datasets/news/local.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Tampa Free Press, https://www.tampafp.com/feed/, en-US, USA
|
|
3
datasets/news/misc.csv
Normal file
3
datasets/news/misc.csv
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
name, url, language, country
|
||||||
|
Inhaltsangabe.info, https://www.inhaltsangabe.info/feed, de-DE, Germany
|
||||||
|
Kasparov, https://www.kasparov.com/feed/, en-US, United States
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
ynet - ירוק, https://www.ynet.co.il/Integration/StoryRss4872.xml, he-IL, Israel
|
ynet - ירוק, https://www.ynet.co.il/Integration/StoryRss4872.xml, he-IL, Israel
|
||||||
|
משתלת ולך, https://www.fruit.co.il/feed/, he-IL, Israel
|
||||||
|
|
|
34
datasets/news/people.csv
Normal file
34
datasets/news/people.csv
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
name, url, language, country
|
||||||
|
Michael W Lucas, https://mwl.io/feed, en-US, United States
|
||||||
|
Alixander Court, https://alixandercourt.com/feed/, en-US, United States
|
||||||
|
Anjan Momi, https://momi.ca/feed.xml, en-US, United States
|
||||||
|
Amethyst Reese, https://noswap.com/feed.xml, en-US, United States
|
||||||
|
Dan d'Auge, https://fedi.thechangebook.org/feed/dandauge, fr-FR, France
|
||||||
|
Dan d'Auge, https://mamot.fr/@dandauge.rss, fr-FR, France
|
||||||
|
PureTryOut, https://mastodon.fam-ribbers.com/@bart.rss, en-US, Netherlands
|
||||||
|
Tristan B. Velloza Kildaire, https://gleasonator.com/@deavmi, en-ZA, South Africa
|
||||||
|
Blog on Bart Ribbers - PureTryOut, https://fam-ribbers.com/blog/index.xml, en-US, Netherlands
|
||||||
|
ollieparanoid, https://ollieparanoid.github.io/feed.xml, en-US, United States
|
||||||
|
Oliver Smith, https://fosstodon.org/@ollieparanoid, en-US, United States
|
||||||
|
Keywan Tonekaboni, https://social.heise.de/@ktn.rss, de-DE, Germany
|
||||||
|
keywan, https://chaos.social/@keywan.rss, de-DE, Germany
|
||||||
|
foreverliketh.is, https://foreverliketh.is/blog/index.xml, en-US, United States
|
||||||
|
unique hazards may exist, https://uniquehazards.com/feed.xml, en-US, United States
|
||||||
|
Aphrodite.dev, https://www.aphrodite.dev/~blog/feed.xml, en-US, United States
|
||||||
|
a walkaway story, http://xj-ix.luxe/feed.atom, en-US, United States
|
||||||
|
Detritus, https://detritus.zone/feed.xml, en-US, United States
|
||||||
|
He Can Jog, https://hecanjog.com/all.rss, en-US, United States
|
||||||
|
XXIIVV, https://wiki.xxiivv.com/links/rss.xml, en-US, United States
|
||||||
|
electro·pizza, https://electro.pizza/feed.xml, en-US, United States
|
||||||
|
Heracles Papatheodorou • heracl.es, https://heracl.es/feed.xml, en-US, United States
|
||||||
|
Aphrodite.dev, https://www.aphrodite.dev/~blog/feed.xml, en-US, United States
|
||||||
|
thecozy.cat, https://thecozy.cat/feed/, en-US, United States
|
||||||
|
Shannon Kay, https://blog.shannonkay.me/feed.xml, en-US, United States
|
||||||
|
Justine Smithies blog, https://justine.smithies.me.uk/atom.xml, en-US, United States
|
||||||
|
Justine Smithies, https://fosstodon.org/@JustineSmithies.rss, en-US, United States
|
||||||
|
Victor Stinner 🐍, https://mamot.fr/@vstinner.rss, en-US, Worldwide
|
||||||
|
lectronice :: now, https://now.lectronice.com/feed.xml, en-US, United States
|
||||||
|
Interconnected (Matt Webb), https://interconnected.org/home/feed, en-US, United States
|
||||||
|
metasyn.pw, https://metasyn.pw/rss.xml, en-US, United States
|
||||||
|
Mika Naylor, https://hordburh.autophagy.io/@mika.rss, en-US, United States
|
||||||
|
rezmason, https://merveilles.town/@rezmason.rss, en-US, United States
|
|
|
@ -1,2 +1,9 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, USA
|
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, United States
|
||||||
|
Necuno Solutions, https://necunos.com/feed.xml, en-US, Finland
|
||||||
|
ollieparanoid, https://ollieparanoid.github.io/feed.xml, en-US, United States
|
||||||
|
FSFE News, https://fsfe.org/news/news.en.rss, en-US, Germany
|
||||||
|
FSFE News (DE), https://fsfe.org/news/news.de.rss, de-DE, Germany
|
||||||
|
FSFE News (FR), https://fsfe.org/news/news.fr.rss, fr-FR, Germany
|
||||||
|
EFF Action Center, https://act.eff.org/action.atom, en-US, United States
|
||||||
|
Spread Privacy, https://spreadprivacy.com/rss/, en-US, United States
|
||||||
|
|
|
2
datasets/news/russia.csv
Normal file
2
datasets/news/russia.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Kasparov, https://www.kasparov.com/feed/, en-US, United States
|
|
|
@ -1 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
|
Deutsche Welle: DW.com WIRTSCHAFT, http://rss.dw.com/atom/rss-de-eco, de-DE, Germany
|
||||||
|
Hackaday, https://hackaday.com/feed/, en-US, United States
|
||||||
|
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
ynet - ספורט, https://www.ynet.co.il/Integration/StoryRss3.xml, he-IL, Israel
|
ynet - ספורט, https://www.ynet.co.il/Integration/StoryRss3.xml, he-IL, Israel
|
||||||
|
Deutsche Welle: DW.com SPORT, http://rss.dw.com/atom/rss-de-sport, de-DE, Germany
|
||||||
|
|
|
2
datasets/news/surveillance.csv
Normal file
2
datasets/news/surveillance.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Necuno Solutions, https://necunos.com/feed.xml, en-US, Finland
|
|
|
@ -1,4 +1,4 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, United States
|
||||||
nobulart - Exploring the Great Reset, https://nobulart.com/feed/, en-US, USA
|
nobulart - Exploring the Great Reset, https://nobulart.com/feed/, en-US, United States
|
||||||
|
|
||||||
|
|
|
|
@ -1,6 +1,24 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
Developpez, https://www.developpez.com/index/atom, fr-FR, France
|
Developpez, https://www.developpez.com/index/atom, fr-FR, France
|
||||||
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, USA
|
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, United States
|
||||||
CryptoSlate, https://cryptoslate.com/feed/, en-US, USA
|
CryptoSlate, https://cryptoslate.com/feed/, en-US, United States
|
||||||
Daily Stormer, https://dailystormer.in/feed/, en-US, USA
|
Daily Stormer, https://dailystormer.in/feed/, en-US, United States
|
||||||
Futurism, https://futurism.com/feed, en-US, USA
|
Futurism, https://futurism.com/feed, en-US, United States
|
||||||
|
Automation Rhapsody, https://automationrhapsody.com/feed/, en-US, United States
|
||||||
|
Deep Thoughts by Raymond Hettinger, https://rhettinger.wordpress.com/feed/, en-US, United States
|
||||||
|
Chiportal, https://chiportal.co.il/feed/, he-IL, Israel
|
||||||
|
Hackaday, https://hackaday.com/feed/, en-US, United States
|
||||||
|
Hacker News, https://news.ycombinator.com/rss, en-US, United States
|
||||||
|
Hacker News: Front Page, https://hnrss.org/frontpage, en-US, United States
|
||||||
|
Amethyst Reese, https://noswap.com/feed.xml, en-US, United States
|
||||||
|
Necuno Solutions, https://necunos.com/feed.xml, en-US, Finland
|
||||||
|
ollieparanoid, https://ollieparanoid.github.io/feed.xml, en-US, United States
|
||||||
|
FSFE News, https://fsfe.org/news/news.en.rss, en-US, Germany
|
||||||
|
FSFE News (DE), https://fsfe.org/news/news.de.rss, de-DE, Germany
|
||||||
|
FSFE News (FR), https://fsfe.org/news/news.fr.rss, fr-FR, Germany
|
||||||
|
heise online News, https://www.heise.de/rss/heise-atom.xml, de-DE, Germany
|
||||||
|
c't Magazin, https://social.heise.de/@ct_Magazin.rss, de-DE, Germany
|
||||||
|
AlternativeTo News, https://feed.alternativeto.net/news/all/, en-US, United States
|
||||||
|
Ηρακλής Παπαθεοδώρου • heracl.es, https://heracl.es/el/feed.xml, el-GR, Greece
|
||||||
|
Heracles Papatheodorou • heracl.es, https://heracl.es/feed.xml, en-US, Greece
|
||||||
|
lectronice :: now, https://now.lectronice.com/feed.xml, en-US, United States
|
||||||
|
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
The XMPP Blog on XMPP, https://xmpp.org/feeds/all.atom.xml, en-US, Worldwide
|
The XMPP Blog on XMPP, https://xmpp.org/feeds/all.atom.xml, en-US, Worldwide
|
||||||
|
ollieparanoid, https://ollieparanoid.github.io/feed.xml, en-US, United States
|
||||||
|
|
|
|
@ -1,2 +1,4 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
|
Deutsche Welle: DW.com DEUTSCHLAND ENTDECKEN, http://rss.dw.com/atom/rss-de-deutschlandentdecken, de-DE, Germany
|
||||||
ynet - תיירות, https://www.ynet.co.il/Integration/StoryRss598.xml, he-IL, Israel
|
ynet - תיירות, https://www.ynet.co.il/Integration/StoryRss598.xml, he-IL, Israel
|
||||||
|
Trip101, https://trip101.com/feed, en-US, United States
|
||||||
|
|
|
|
@ -1,6 +1,9 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
ZeroGov, https://zerogov.com/feed/, en-US, USA
|
ZeroGov, https://zerogov.com/feed/, en-US, United States
|
||||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, United States
|
||||||
The Hill News, https://thehill.com/feed/?feed=partnerfeed-news-feed&format=rss, en-US, USA
|
The Hill News, https://thehill.com/feed/?feed=partnerfeed-news-feed&format=rss, en-US, United States
|
||||||
John W. Whitehead, Constitutional Attorney, https://agovernmentofwolves.com/feed/, en-US, USA
|
John W. Whitehead, Constitutional Attorney, https://agovernmentofwolves.com/feed/, en-US, United States
|
||||||
BlackListed News, https://www.blacklistednews.com/rss.php, en-US, USA
|
BlackListed News, https://www.blacklistednews.com/rss.php, en-US, United States
|
||||||
|
Tampa Free Press, https://www.tampafp.com/feed/, en-US, United States
|
||||||
|
Real Liberty Media, https://www.reallibertymedia.com/feed/, en-US, United States
|
||||||
|
Robert Reich, https://robertreich.substack.com/feed, en-US, United States
|
||||||
|
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
ynet - רכב, https://www.ynet.co.il/Integration/StoryRss550.xml, he-IL, Israel
|
ynet - רכב, https://www.ynet.co.il/Integration/StoryRss550.xml, he-IL, Israel
|
||||||
|
Hackaday, https://hackaday.com/feed/, en-US, United States
|
||||||
|
|
|
2
datasets/organizations/france.csv
Normal file
2
datasets/organizations/france.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Framasoft - Toute l'actualité, https://rss.framasoft.org/, fr-FR, France
|
|
4
datasets/organizations/germany.csv
Normal file
4
datasets/organizations/germany.csv
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
name, url, language, country
|
||||||
|
FSFE News, https://fsfe.org/news/news.en.rss, en-US, Germany
|
||||||
|
FSFE News (DE), https://fsfe.org/news/news.de.rss, de-DE, Germany
|
||||||
|
FSFE News (FR), https://fsfe.org/news/news.fr.rss, fr-FR, Germany
|
|
|
@ -1,2 +1,3 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
National Alliance, https://www.natall.com/feed/, en-US, USA
|
National Alliance, https://www.natall.com/feed/, en-US, USA
|
||||||
|
EFF Action Center, https://act.eff.org/action.atom, en-US, United States
|
||||||
|
|
|
|
@ -1,2 +1,2 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
Talk Python To Me, https://talkpython.fm/episodes/rss, en-US, USA
|
Talk Python To Me, https://talkpython.fm/episodes/rss, en-US, United States
|
||||||
|
|
|
6
datasets/podcasts/computer.csv
Normal file
6
datasets/podcasts/computer.csv
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
name, url, language, country
|
||||||
|
Hacker Public Radio, http://hackerpublicradio.org/hpr_spx_rss.php, en-US, United States
|
||||||
|
postmarketOS, https://cast.postmarketos.org/feed.rss, en-US, Germany
|
||||||
|
0d - Zeroday, https://zeroday-podcast.de/feed/mp3/, de-DE, Germany
|
||||||
|
Software Freedom Podcast (OPUS), http://fsfe.org/news/podcast-opus.en.rss, en-US, Germany
|
||||||
|
Software Freedom Podcast (MP3), http://fsfe.org/news/podcast.en.rss, en-US, Germany
|
|
|
@ -2,3 +2,5 @@ name, url, language, country
|
||||||
American Dissident Voices, https://nationalvanguard.org/category/american-dissident-voices/feed/, en-US, USA
|
American Dissident Voices, https://nationalvanguard.org/category/american-dissident-voices/feed/, en-US, USA
|
||||||
Radio 3Fourteen, https://redice.tv/rss/radio-3fourteen, en-US, USA
|
Radio 3Fourteen, https://redice.tv/rss/radio-3fourteen, en-US, USA
|
||||||
The National Archives - Podcast Series, https://www.nationalarchives.gov.uk/rss/podcasts.xml, en-UK, United Kingdom
|
The National Archives - Podcast Series, https://www.nationalarchives.gov.uk/rss/podcasts.xml, en-UK, United Kingdom
|
||||||
|
Oracle Broadcasting Recent Shows, http://www.oraclebroadcasting.com/rss_recent.php, en-US, USA
|
||||||
|
Speak Free Radio, https://speakfreeradio.com/feed/, en-US, USA
|
||||||
|
|
|
|
@ -1,4 +1,11 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
American Dissident Voices, https://nationalvanguard.org/category/american-dissident-voices/feed/, en-US, USA
|
American Dissident Voices, https://nationalvanguard.org/category/american-dissident-voices/feed/, en-US, United States
|
||||||
The Corbett Report, https://www.corbettreport.com/feed/, en-US, Japan
|
The Corbett Report, https://www.corbettreport.com/feed/, en-US, Japan
|
||||||
Radio 3Fourteen, https://redice.tv/rss/radio-3fourteen, en-US, USA
|
Radio 3Fourteen, https://redice.tv/rss/radio-3fourteen, en-US, United States
|
||||||
|
Oracle Broadcasting Recent Shows, http://www.oraclebroadcasting.com/rss_recent.php, en-US, United States
|
||||||
|
Speak Free Radio, https://speakfreeradio.com/feed/, en-US, United States
|
||||||
|
Podcasts | Real Liberty Media, https://www.reallibertymedia.com/category/podcasts/feed/?redirect=no, en-US, United States
|
||||||
|
Behind The Woodshed with Hal Anthony, https://www.reallibertymedia.com/feed/behind-the-woodshed/, en-US, United States
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
2
datasets/podcasts/judaism.csv
Normal file
2
datasets/podcasts/judaism.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Chabad - Daily Torah Study, https://www.chabad.org/tools/rss/dailystudy_podcast.xml, en-US, Worldwide
|
|
|
@ -1,3 +1,5 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
The Corbett Report, https://www.corbettreport.com/feed/, en-US, Japan
|
The Corbett Report, https://www.corbettreport.com/feed/, en-US, Japan
|
||||||
postmarketOS, https://cast.postmarketos.org/feed.rss, en-US, Germany
|
postmarketOS, https://cast.postmarketos.org/feed.rss, en-US, Germany
|
||||||
|
Software Freedom Podcast, http://fsfe.org/news/podcast-opus.en.rss, en-US, Germany
|
||||||
|
Software Freedom Podcast, http://fsfe.org/news/podcast-opus.en.rss, en-US, Germany
|
||||||
|
|
|
5
datasets/podcasts/united_states.csv
Normal file
5
datasets/podcasts/united_states.csv
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
name, url, language, country
|
||||||
|
American Dissident Voices, https://nationalvanguard.org/category/american-dissident-voices/feed/, en-US, United States
|
||||||
|
Radio 3Fourteen, https://redice.tv/rss/radio-3fourteen, en-US, United States
|
||||||
|
Oracle Broadcasting Recent Shows, http://www.oraclebroadcasting.com/rss_recent.php, en-US, United States
|
||||||
|
Speak Free Radio, https://speakfreeradio.com/feed/, en-US, United States
|
|
3
datasets/projects/automation.csv
Normal file
3
datasets/projects/automation.csv
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
name, url, language, country
|
||||||
|
Home Assistant, https://www.home-assistant.io/atom.xml, en-US, USA
|
||||||
|
Zapier, https://zapier.com/blog/feeds/latest/, en-US, USA
|
|
2
datasets/projects/backup.csv
Normal file
2
datasets/projects/backup.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
rclone - rsync for cloud storage, https://rclone.org/index.xml, en-US, United States
|
|
3
datasets/projects/forums.csv
Normal file
3
datasets/projects/forums.csv
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
name, url, language, country
|
||||||
|
camen design, https://camendesign.com/rss, en-US, United States
|
||||||
|
nodebb, https://nodebb.org/feed/, en-US, United States
|
|
2
datasets/projects/game.csv
Normal file
2
datasets/projects/game.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Pirate Solitaire Devlog - itch.io, https://victor-pernet.itch.io/pirate-solitaire/devlog.rss, en-US, Worldwide
|
|
5
datasets/projects/graphics.csv
Normal file
5
datasets/projects/graphics.csv
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
name, url, language, country
|
||||||
|
blender.org, https://www.blender.org/feed/, en-US, Worldwide
|
||||||
|
News – blender.org, https://www.blender.org/category/news/feed/, en-US, Worldwide
|
||||||
|
Blender 🔶, https://mastodon.social/@Blender.rss, en-US, Worldwide
|
||||||
|
Blender Developer Blog, https://code.blender.org/feed/, en-US, Worldwide
|
|
|
@ -1,3 +1,8 @@
|
||||||
name, url, language, country
|
name, url, language, country
|
||||||
DownThemAll!, https://www.downthemall.org/feed, en-US, Worldwide
|
DownThemAll!, https://www.downthemall.org/feed, en-US, Worldwide
|
||||||
Falkon - KDE web browser, https://www.falkon.org/atom.xml, en-US, Czech
|
Falkon - KDE web browser, https://www.falkon.org/atom.xml, en-US, Czech
|
||||||
|
What's Up, Fraidycat?, https://fraidyc.at/blog/feed.xml, en-US, Worldwide
|
||||||
|
geomyidae, branch HEAD, gopher://bitreich.org:70/0/scm/geomyidae/atom.xml, en-US, United States
|
||||||
|
rclone - rsync for cloud storage, https://rclone.org/index.xml, en-US, United States
|
||||||
|
Feedbin, https://feedbin.com/blog/atom.xml, en-US, United States
|
||||||
|
Silvio Rizzi (reederapp.com), https://gloria.social/@rizzi.rss, en-US, United States
|
||||||
|
|
|
2
datasets/projects/office.csv
Normal file
2
datasets/projects/office.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Justine Smithies, https://fosstodon.org/@JustineSmithies.rss, en-US, United States
|
|
5
datasets/projects/operating_system.csv
Normal file
5
datasets/projects/operating_system.csv
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
name, url, language, country
|
||||||
|
NixOS, https://nixos.org/blog/announcements-rss.xml, en-US, USA
|
||||||
|
ReactOS, https://reactos.org/index.xml, en-US, Germany
|
||||||
|
Salix OS, https://forum.salixos.org/app.php/feed/news, en-US, Greece
|
||||||
|
postmarketOS, https://postmarketos.org/blog/feed.atom, en-US, Germany
|
|
16
datasets/projects/website.csv
Normal file
16
datasets/projects/website.csv
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
name, url, language, country
|
||||||
|
Jekyll, https://jekyllrb.com/feed.xml, en-US, Worldwide
|
||||||
|
Hugo, https://gohugo.io/index.xml, en-US, Worldwide
|
||||||
|
Joomla!, https://www.joomla.org/announcements.feed?type=rss, en-US, Worldwide
|
||||||
|
Haunt, https://dthompson.us/feed.xml, en-US, Worldwide
|
||||||
|
Grav Development Blog, https://getgrav.org/blog.atom, en-US, Worldwide
|
||||||
|
Nikola, https://getnikola.com/rss.xml, en-US, Worldwide
|
||||||
|
Octopress, http://octopress.org/atom.xml, en-US, Worldwide
|
||||||
|
Pelican, https://getpelican.com/feeds/all.atom.xml, en-US, Worldwide
|
||||||
|
Podcast Generator, https://podcastgenerator.net/feed/, en-US, Worldwide
|
||||||
|
Publii, https://getpublii.com/feed.xml, en-US, Worldwide
|
||||||
|
Textpattern CMS, https://textpattern.com/rss, en-US, Worldwide
|
||||||
|
TYPO3, https://typo3.org/rss, en-US, Worldwide
|
||||||
|
WordPress, https://wordpress.org/news/feed/, en-US, Worldwide
|
||||||
|
Foswiki, https://foswiki.org/Home/WebRss, en-US, Worldwide
|
||||||
|
Eleventy, https://www.11ty.dev/blog/feed.xml, en-US, Worldwide
|
|
2
datasets/tutorials/code.csv
Normal file
2
datasets/tutorials/code.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Karl Bartel's Website, https://www.karl.berlin/atom.xml, en-US, Germany
|
|
|
@ -8,3 +8,6 @@ Python Morsels, https://www.pythonmorsels.com/topics/feed/, en-US, Worldwide
|
||||||
Python GUIs, https://www.pythonguis.com/feeds/atom.xml, en-US, Worldwide
|
Python GUIs, https://www.pythonguis.com/feeds/atom.xml, en-US, Worldwide
|
||||||
Python Examples, https://pythonexamples.org/feed/, en-US, Worldwide
|
Python Examples, https://pythonexamples.org/feed/, en-US, Worldwide
|
||||||
AppDividend, https://appdividend.com/feed/, en-US, Worldwide
|
AppDividend, https://appdividend.com/feed/, en-US, Worldwide
|
||||||
|
Deep Thoughts by Raymond Hettinger, https://rhettinger.wordpress.com/feed/, en-US, USA
|
||||||
|
Victor Stinner blog 3, https://vstinner.github.io/feeds/all.atom.xml, en-US, Worldwide
|
||||||
|
Victor Stinner 🐍, https://mamot.fr/@vstinner.rss, en-US, Worldwide
|
||||||
|
|
|
5
datasets/videos/general.csv
Normal file
5
datasets/videos/general.csv
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
name, url, language, country
|
||||||
|
denshi.live, https://denshi.live/feeds/videos.xml, en-US, United States
|
||||||
|
Luke's Videos, https://videos.lukesmith.xyz/feeds/videos.xml, en-US, United States
|
||||||
|
fair.tube, https://fair.tube/feeds/videos.xml, de-DE, Germany
|
||||||
|
Kockatoo Tube, https://tube.kockatoo.org/feeds/videos.xml, en-US, United States
|
|
2
datasets/videos/graphics.csv
Normal file
2
datasets/videos/graphics.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
name, url, language, country
|
||||||
|
Blender Video, https://video.blender.org/feeds/videos.xml, en-US, United States
|
|
|
@ -2,3 +2,7 @@ name, url, language, country
|
||||||
denshi.live, https://denshi.live/feeds/videos.xml, en-US, USA
|
denshi.live, https://denshi.live/feeds/videos.xml, en-US, USA
|
||||||
Luke's Videos, https://videos.lukesmith.xyz/feeds/videos.xml, en-US, USA
|
Luke's Videos, https://videos.lukesmith.xyz/feeds/videos.xml, en-US, USA
|
||||||
Films By Kris, https://filmsbykris.com/rss.xml, en-US, USA
|
Films By Kris, https://filmsbykris.com/rss.xml, en-US, USA
|
||||||
|
Blender Video, https://video.blender.org/feeds/videos.xml, en-US, United States
|
||||||
|
Framatube, https://framatube.org/feeds/videos.xml, fr-FR, France
|
||||||
|
Framasoft, https://framatube.org/feeds/videos.xml?accountId=3&sort=-publishedAt, fr-FR, France
|
||||||
|
FSFE, https://media.fsfe.org/feeds/videos.xml?accountId=4, de-DE, Germany
|
||||||
|
|
|
|
@ -13,28 +13,28 @@ FIXME
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
1) SQL prepared statements
|
1) SQL prepared statements.
|
||||||
|
|
||||||
2) Machine Learning for scrapping Title, Link, Summary and Timstamp
|
2) Machine Learning for scrapping Title, Link, Summary and Timstamp.
|
||||||
|
|
||||||
3) Support MUC
|
3) Support MUC.
|
||||||
|
|
||||||
4) Support categories
|
4) Support categories.
|
||||||
|
|
||||||
5) Default prepackaged list of feeds
|
5) Default prepackaged list of feeds.
|
||||||
|
|
||||||
6) XMPP commands
|
6) XMPP commands.
|
||||||
|
|
||||||
7) Bot as transport
|
7) Bot as transport.
|
||||||
|
|
||||||
8) OMEMO
|
8) OMEMO.
|
||||||
|
|
||||||
9) Logging
|
9) Logging.
|
||||||
|
|
||||||
10) Default feeds (e.g. Blacklisted News, TBOT etc.)
|
10) Default feeds (e.g. Blacklisted News, TBOT etc.)
|
||||||
|
|
||||||
11) Download and upload/send article (xHTML, xHTMLZ, Markdown, MHTML, TXT)
|
11) Download and upload/send article (xHTML, xHTMLZ, Markdown, MHTML, TXT).
|
||||||
Use Readability
|
Use Readability.
|
||||||
|
|
||||||
12) Fetch summary from URL, instead of storing summary.
|
12) Fetch summary from URL, instead of storing summary.
|
||||||
|
|
||||||
|
@ -42,6 +42,14 @@ TODO
|
||||||
https://github.com/michael-lazar/pygopherd
|
https://github.com/michael-lazar/pygopherd
|
||||||
https://github.com/gopherball/gb
|
https://github.com/gopherball/gb
|
||||||
|
|
||||||
|
13) Support ActivityPub @person@domain (see Tip Of The Day).
|
||||||
|
|
||||||
|
12) Tip Of The Day.
|
||||||
|
Did you know that you can follow you favorite Mastodon feeds by just
|
||||||
|
sending the URL address?
|
||||||
|
Supported fediverse websites are:
|
||||||
|
Akkoma, HubZilla, Mastodon, Misskey, Pixelfed, Pleroma, Soapbox.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# vars and their meanings:
|
# vars and their meanings:
|
||||||
|
|
|
@ -1,6 +1,15 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
FIXME
|
||||||
|
|
||||||
|
1) feed_mode_scan doesn't find feed for https://www.blender.org/
|
||||||
|
even though it should be according to the pathnames dictionary.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
import asyncio
|
import asyncio
|
||||||
import feedparser
|
import feedparser
|
||||||
|
@ -55,12 +64,12 @@ async def download_updates(db_file, url=None):
|
||||||
try:
|
try:
|
||||||
feed = feedparser.parse(res[0])
|
feed = feedparser.parse(res[0])
|
||||||
if feed.bozo:
|
if feed.bozo:
|
||||||
bozo = (
|
# bozo = (
|
||||||
"WARNING: Bozo detected for feed: {}\n"
|
# "WARNING: Bozo detected for feed: {}\n"
|
||||||
"For more information, visit "
|
# "For more information, visit "
|
||||||
"https://pythonhosted.org/feedparser/bozo.html"
|
# "https://pythonhosted.org/feedparser/bozo.html"
|
||||||
).format(source)
|
# ).format(source)
|
||||||
print(bozo)
|
# print(bozo)
|
||||||
valid = 0
|
valid = 0
|
||||||
else:
|
else:
|
||||||
valid = 1
|
valid = 1
|
||||||
|
@ -96,8 +105,6 @@ async def download_updates(db_file, url=None):
|
||||||
)
|
)
|
||||||
# new_entry = 0
|
# new_entry = 0
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
if entry.has_key("id"):
|
|
||||||
eid = entry.id
|
|
||||||
if entry.has_key("title"):
|
if entry.has_key("title"):
|
||||||
title = entry.title
|
title = entry.title
|
||||||
else:
|
else:
|
||||||
|
@ -108,6 +115,10 @@ async def download_updates(db_file, url=None):
|
||||||
link = await trim_url(link)
|
link = await trim_url(link)
|
||||||
else:
|
else:
|
||||||
link = source
|
link = source
|
||||||
|
if entry.has_key("id"):
|
||||||
|
eid = entry.id
|
||||||
|
else:
|
||||||
|
eid = link
|
||||||
# TODO Pass date too for comparion check
|
# TODO Pass date too for comparion check
|
||||||
if entry.has_key("published"):
|
if entry.has_key("published"):
|
||||||
date = entry.published
|
date = entry.published
|
||||||
|
@ -138,7 +149,7 @@ async def download_updates(db_file, url=None):
|
||||||
# date = date.isoformat() # Convert to ISO 8601
|
# date = date.isoformat() # Convert to ISO 8601
|
||||||
else:
|
else:
|
||||||
# TODO Just set date = "*** No date ***"
|
# TODO Just set date = "*** No date ***"
|
||||||
# date = datetime.now().isoformat()
|
# date = await datetime.now().isoformat()
|
||||||
date = await datetimehandler.now()
|
date = await datetimehandler.now()
|
||||||
# NOTE Would seconds result in better database performance
|
# NOTE Would seconds result in better database performance
|
||||||
# date = datetime.datetime(date)
|
# date = datetime.datetime(date)
|
||||||
|
@ -606,7 +617,10 @@ async def feed_mode_request(db_file, url, tree):
|
||||||
"RSS URL discovery has found {} feeds:\n```\n"
|
"RSS URL discovery has found {} feeds:\n```\n"
|
||||||
).format(len(feeds))
|
).format(len(feeds))
|
||||||
for feed in feeds:
|
for feed in feeds:
|
||||||
|
try:
|
||||||
feed_name = feeds[feed]["feed"]["title"]
|
feed_name = feeds[feed]["feed"]["title"]
|
||||||
|
except:
|
||||||
|
feed_name = urlsplit(feed).netloc
|
||||||
feed_addr = feed
|
feed_addr = feed
|
||||||
feed_amnt = len(feeds[feed].entries)
|
feed_amnt = len(feeds[feed].entries)
|
||||||
if feed_amnt:
|
if feed_amnt:
|
||||||
|
@ -707,7 +721,10 @@ async def feed_mode_scan(db_file, url, tree):
|
||||||
# res = await download_feed(feed)
|
# res = await download_feed(feed)
|
||||||
# except:
|
# except:
|
||||||
# continue
|
# continue
|
||||||
|
try:
|
||||||
feed_name = feeds[feed]["feed"]["title"]
|
feed_name = feeds[feed]["feed"]["title"]
|
||||||
|
except:
|
||||||
|
feed_name = urlsplit(feed).netloc
|
||||||
feed_addr = feed
|
feed_addr = feed
|
||||||
feed_amnt = len(feeds[feed].entries)
|
feed_amnt = len(feeds[feed].entries)
|
||||||
if feed_amnt:
|
if feed_amnt:
|
||||||
|
@ -798,3 +815,53 @@ async def feed_mode_auto_discovery(db_file, url, tree):
|
||||||
# return await add_feed(db_file, feed_addr)
|
# return await add_feed(db_file, feed_addr)
|
||||||
msg = await add_feed(db_file, feed_addr)
|
msg = await add_feed(db_file, feed_addr)
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
|
||||||
|
async def feed_to_http(url):
|
||||||
|
"""
|
||||||
|
Replace scheme feed by http.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
url : str
|
||||||
|
URL.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
new_url : str
|
||||||
|
URL.
|
||||||
|
"""
|
||||||
|
par_url = urlsplit(url)
|
||||||
|
new_url = urlunsplit([
|
||||||
|
"http",
|
||||||
|
par_url.netloc,
|
||||||
|
par_url.path,
|
||||||
|
par_url.query,
|
||||||
|
par_url.fragment
|
||||||
|
])
|
||||||
|
return new_url
|
||||||
|
|
||||||
|
|
||||||
|
async def activitypub_to_http(namespace):
|
||||||
|
"""
|
||||||
|
Replace ActivityPub namespace by http.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
namespace : str
|
||||||
|
Namespace.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
new_url : str
|
||||||
|
URL.
|
||||||
|
"""
|
||||||
|
par_url = urlsplit(namespace)
|
||||||
|
new_url = urlunsplit([
|
||||||
|
"http",
|
||||||
|
par_url.netloc,
|
||||||
|
par_url.path,
|
||||||
|
par_url.query,
|
||||||
|
par_url.fragment
|
||||||
|
])
|
||||||
|
return new_url
|
||||||
|
|
|
@ -947,13 +947,13 @@ async def remove_nonexistent_entries(db_file, feed, source):
|
||||||
# have been changed (though that can only happen when
|
# have been changed (though that can only happen when
|
||||||
# manually editing)
|
# manually editing)
|
||||||
ix = item[0]
|
ix = item[0]
|
||||||
print(">>> SOURCE: ", source)
|
# print(">>> SOURCE: ", source)
|
||||||
print(">>> INVALID:", item[1])
|
# print(">>> INVALID:", item[1])
|
||||||
# print("title:", item[1])
|
# print("title:", item[1])
|
||||||
# print("link :", item[2])
|
# print("link :", item[2])
|
||||||
# print("id :", item[3])
|
# print("id :", item[3])
|
||||||
if item[5] == 1:
|
if item[5] == 1:
|
||||||
print(">>> DELETING:", item[1])
|
# print(">>> DELETING:", item[1])
|
||||||
sql = (
|
sql = (
|
||||||
"DELETE "
|
"DELETE "
|
||||||
"FROM entries "
|
"FROM entries "
|
||||||
|
@ -961,7 +961,7 @@ async def remove_nonexistent_entries(db_file, feed, source):
|
||||||
)
|
)
|
||||||
cur.execute(sql, (ix,))
|
cur.execute(sql, (ix,))
|
||||||
else:
|
else:
|
||||||
print(">>> ARCHIVING:", item[1])
|
# print(">>> ARCHIVING:", item[1])
|
||||||
sql = (
|
sql = (
|
||||||
"INSERT "
|
"INSERT "
|
||||||
"INTO archive "
|
"INTO archive "
|
||||||
|
@ -1221,7 +1221,12 @@ async def search_entries(db_file, query):
|
||||||
else:
|
else:
|
||||||
return "No results found for: {}".format(query)
|
return "No results found for: {}".format(query)
|
||||||
|
|
||||||
|
"""
|
||||||
|
FIXME Error due to missing date, but it appears that date is present:
|
||||||
|
this is source: https://blog.heckel.io/feed/
|
||||||
|
this is date: 2008-05-13T13:51:50+00:00
|
||||||
|
no result. this is source: https://blog.heckel.io/feed/
|
||||||
|
"""
|
||||||
async def check_entry_exist(db_file, source, eid=None,
|
async def check_entry_exist(db_file, source, eid=None,
|
||||||
title=None, link=None, date=None):
|
title=None, link=None, date=None):
|
||||||
"""
|
"""
|
||||||
|
@ -1277,8 +1282,8 @@ async def check_entry_exist(db_file, source, eid=None,
|
||||||
"timestamp": date
|
"timestamp": date
|
||||||
}).fetchone()
|
}).fetchone()
|
||||||
except:
|
except:
|
||||||
print("this is source:", source)
|
print(await datetimehandler.current_time(), "ERROR: date for:", source)
|
||||||
print("this is date: ", date)
|
print(await datetimehandler.current_time(), "ERROR: date for:", date)
|
||||||
else:
|
else:
|
||||||
sql = (
|
sql = (
|
||||||
"SELECT id "
|
"SELECT id "
|
||||||
|
@ -1295,7 +1300,7 @@ async def check_entry_exist(db_file, source, eid=None,
|
||||||
else:
|
else:
|
||||||
None
|
None
|
||||||
except:
|
except:
|
||||||
print("no result. this is source:", source)
|
print(await datetimehandler.current_time(), "ERROR: result for", source)
|
||||||
|
|
||||||
|
|
||||||
async def set_settings_value(db_file, key_value):
|
async def set_settings_value(db_file, key_value):
|
||||||
|
|
409
slixfeed/taskhandler.py
Normal file
409
slixfeed/taskhandler.py
Normal file
|
@ -0,0 +1,409 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
FIXME
|
||||||
|
|
||||||
|
1) Function check_readiness or event "changed_status" is causing for
|
||||||
|
triple status messages and also false ones that indicate of lack
|
||||||
|
of feeds.
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
1) Deprecate "add" (see above) and make it interactive.
|
||||||
|
Slixfeed: Do you still want to add this URL to subscription list?
|
||||||
|
See: case _ if message_lowercase.startswith("add"):
|
||||||
|
|
||||||
|
2) Use loop (with gather) instead of TaskGroup.
|
||||||
|
|
||||||
|
3) Assure message delivery before calling a new task.
|
||||||
|
See https://slixmpp.readthedocs.io/en/latest/event_index.html#term-marker_acknowledged
|
||||||
|
|
||||||
|
4) Do not send updates when busy or away.
|
||||||
|
See https://slixmpp.readthedocs.io/en/latest/event_index.html#term-changed_status
|
||||||
|
|
||||||
|
NOTE
|
||||||
|
|
||||||
|
1) Self presence
|
||||||
|
Apparently, it is possible to view self presence.
|
||||||
|
This means that there is no need to store presences in order to switch or restore presence.
|
||||||
|
check_readiness
|
||||||
|
<presence from="slixfeed@canchat.org/xAPgJLHtMMHF" xml:lang="en" id="ab35c07b63a444d0a7c0a9a0b272f301" to="slixfeed@canchat.org/xAPgJLHtMMHF"><status>📂 Send a URL from a blog or a news website.</status><x xmlns="vcard-temp:x:update"><photo /></x></presence>
|
||||||
|
JID: self.boundjid.bare
|
||||||
|
MUC: self.nick
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import slixmpp
|
||||||
|
|
||||||
|
import datahandler
|
||||||
|
import datetimehandler
|
||||||
|
import filehandler
|
||||||
|
import sqlitehandler
|
||||||
|
import xmpphandler
|
||||||
|
|
||||||
|
main_task = []
|
||||||
|
jid_tasker = {}
|
||||||
|
task_manager = {}
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
FIXME
|
||||||
|
|
||||||
|
Tasks don't begin at the same time.
|
||||||
|
|
||||||
|
This is noticeable when calling "check" before "status".
|
||||||
|
|
||||||
|
await taskhandler.start_tasks(
|
||||||
|
self,
|
||||||
|
jid,
|
||||||
|
["check", "status"]
|
||||||
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
|
async def start_tasks(self, jid, tasks):
|
||||||
|
task_manager[jid] = {}
|
||||||
|
for task in tasks:
|
||||||
|
match task:
|
||||||
|
case "check":
|
||||||
|
task_manager[jid]["check"] = asyncio.create_task(
|
||||||
|
check_updates(jid)
|
||||||
|
)
|
||||||
|
await task_manager[jid]["check"]
|
||||||
|
case "status":
|
||||||
|
task_manager[jid]["status"] = asyncio.create_task(
|
||||||
|
send_status(self, jid)
|
||||||
|
)
|
||||||
|
await task_manager[jid]["status"]
|
||||||
|
case "interval":
|
||||||
|
task_manager[jid]["interval"] = asyncio.create_task(
|
||||||
|
send_update(self, jid)
|
||||||
|
)
|
||||||
|
await task_manager[jid]["interval"]
|
||||||
|
|
||||||
|
|
||||||
|
async def clean_tasks(jid, tasks):
|
||||||
|
for task in tasks:
|
||||||
|
# if task_manager[jid][task]:
|
||||||
|
try:
|
||||||
|
task_manager[jid][task].cancel()
|
||||||
|
except:
|
||||||
|
print("No task", task, "for JID", jid, "(clean_tasks)")
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
TODO
|
||||||
|
|
||||||
|
Rename to "start_tasks"
|
||||||
|
|
||||||
|
Pass a list (or dict) of tasks to start
|
||||||
|
|
||||||
|
NOTE
|
||||||
|
|
||||||
|
Consider callback e.g. xmpphandler.Slixfeed.send_status.
|
||||||
|
|
||||||
|
Or taskhandler for each protocol or specific taskhandler function.
|
||||||
|
"""
|
||||||
|
async def task_jid(self, jid):
|
||||||
|
"""
|
||||||
|
JID (Jabber ID) task manager.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
jid : str
|
||||||
|
Jabber ID.
|
||||||
|
"""
|
||||||
|
enabled = await filehandler.initdb(
|
||||||
|
jid,
|
||||||
|
sqlitehandler.get_settings_value,
|
||||||
|
"enabled"
|
||||||
|
)
|
||||||
|
# print(await datetimehandler.current_time(), "enabled", enabled, jid)
|
||||||
|
if enabled:
|
||||||
|
# NOTE Perhaps we want to utilize super with keyword
|
||||||
|
# arguments in order to know what tasks to initiate.
|
||||||
|
task_manager[jid] = {}
|
||||||
|
task_manager[jid]["check"] = asyncio.create_task(
|
||||||
|
check_updates(jid)
|
||||||
|
)
|
||||||
|
task_manager[jid]["status"] = asyncio.create_task(
|
||||||
|
send_status(self, jid)
|
||||||
|
)
|
||||||
|
task_manager[jid]["interval"] = asyncio.create_task(
|
||||||
|
send_update(self, jid)
|
||||||
|
)
|
||||||
|
await task_manager[jid]["check"]
|
||||||
|
await task_manager[jid]["status"]
|
||||||
|
await task_manager[jid]["interval"]
|
||||||
|
# tasks_dict = {
|
||||||
|
# "check": check_updates,
|
||||||
|
# "status": send_status,
|
||||||
|
# "interval": send_update
|
||||||
|
# }
|
||||||
|
# for task, function in tasks_dict.items():
|
||||||
|
# task_manager[jid][task] = asyncio.create_task(
|
||||||
|
# function(jid)
|
||||||
|
# )
|
||||||
|
# await function
|
||||||
|
else:
|
||||||
|
# FIXME
|
||||||
|
# The following error occurs only upon first attempt to stop.
|
||||||
|
# /usr/lib/python3.11/asyncio/events.py:73: RuntimeWarning: coroutine 'Slixfeed.send_update' was never awaited
|
||||||
|
# self._args = None
|
||||||
|
# RuntimeWarning: Enable tracemalloc to get the object allocation traceback
|
||||||
|
try:
|
||||||
|
task_manager[jid]["interval"].cancel()
|
||||||
|
except:
|
||||||
|
None
|
||||||
|
await send_status(self, jid)
|
||||||
|
|
||||||
|
|
||||||
|
async def send_update(self, jid, num=None):
|
||||||
|
"""
|
||||||
|
Send news items as messages.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
jid : str
|
||||||
|
Jabber ID.
|
||||||
|
num : str, optional
|
||||||
|
Number. The default is None.
|
||||||
|
"""
|
||||||
|
# print("Starting send_update()")
|
||||||
|
# print(jid)
|
||||||
|
new = await filehandler.initdb(
|
||||||
|
jid,
|
||||||
|
sqlitehandler.get_entry_unread,
|
||||||
|
num
|
||||||
|
)
|
||||||
|
if new:
|
||||||
|
# TODO Add while loop to assure delivery.
|
||||||
|
print(await datetimehandler.current_time(), ">>> ACT send_message",jid)
|
||||||
|
xmpphandler.Slixfeed.send_message(
|
||||||
|
self,
|
||||||
|
mto=jid,
|
||||||
|
mbody=new,
|
||||||
|
mtype="chat"
|
||||||
|
)
|
||||||
|
# TODO Do not refresh task before
|
||||||
|
# verifying that it was completed.
|
||||||
|
await refresh_task(
|
||||||
|
self,
|
||||||
|
jid,
|
||||||
|
send_update,
|
||||||
|
"interval"
|
||||||
|
)
|
||||||
|
# interval = await filehandler.initdb(
|
||||||
|
# jid,
|
||||||
|
# sqlitehandler.get_settings_value,
|
||||||
|
# "interval"
|
||||||
|
# )
|
||||||
|
# task_manager[jid]["interval"] = loop.call_at(
|
||||||
|
# loop.time() + 60 * interval,
|
||||||
|
# loop.create_task,
|
||||||
|
# send_update(jid)
|
||||||
|
# )
|
||||||
|
|
||||||
|
# print(await datetimehandler.current_time(), "asyncio.get_event_loop().time()")
|
||||||
|
# print(await datetimehandler.current_time(), asyncio.get_event_loop().time())
|
||||||
|
# await asyncio.sleep(60 * interval)
|
||||||
|
|
||||||
|
# loop.call_later(
|
||||||
|
# 60 * interval,
|
||||||
|
# loop.create_task,
|
||||||
|
# send_update(jid)
|
||||||
|
# )
|
||||||
|
|
||||||
|
# print
|
||||||
|
# await handle_event()
|
||||||
|
|
||||||
|
|
||||||
|
async def send_status(self, jid):
|
||||||
|
"""
|
||||||
|
Send status message.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
jid : str
|
||||||
|
Jabber ID.
|
||||||
|
"""
|
||||||
|
# print(await datetimehandler.current_time(), "> SEND STATUS",jid)
|
||||||
|
status_text="🤖️ Slixfeed RSS News Bot"
|
||||||
|
enabled = await filehandler.initdb(
|
||||||
|
jid,
|
||||||
|
sqlitehandler.get_settings_value,
|
||||||
|
"enabled"
|
||||||
|
)
|
||||||
|
if not enabled:
|
||||||
|
status_mode = "xa"
|
||||||
|
status_text = "Send \"Start\" to receive news."
|
||||||
|
else:
|
||||||
|
feeds = await filehandler.initdb(
|
||||||
|
jid,
|
||||||
|
sqlitehandler.get_number_of_items,
|
||||||
|
"feeds"
|
||||||
|
)
|
||||||
|
print(">>> feeds:", feeds, "jid:", jid)
|
||||||
|
if not feeds:
|
||||||
|
print(">>> not feeds:", feeds, "jid:", jid)
|
||||||
|
status_mode = "available"
|
||||||
|
status_text = (
|
||||||
|
"📂️ Send a URL from a blog or a news website."
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
unread = await filehandler.initdb(
|
||||||
|
jid,
|
||||||
|
sqlitehandler.get_number_of_entries_unread
|
||||||
|
)
|
||||||
|
if unread:
|
||||||
|
status_mode = "chat"
|
||||||
|
status_text = (
|
||||||
|
"📰 You have {} news items to read."
|
||||||
|
).format(str(unread))
|
||||||
|
# status_text = (
|
||||||
|
# "📰 News items: {}"
|
||||||
|
# ).format(str(unread))
|
||||||
|
# status_text = (
|
||||||
|
# "📰 You have {} news items"
|
||||||
|
# ).format(str(unread))
|
||||||
|
else:
|
||||||
|
status_mode = "available"
|
||||||
|
status_text = "🗞 No news"
|
||||||
|
|
||||||
|
# breakpoint()
|
||||||
|
print(status_text, "for", jid)
|
||||||
|
xmpphandler.Slixfeed.send_presence(
|
||||||
|
self,
|
||||||
|
pshow=status_mode,
|
||||||
|
pstatus=status_text,
|
||||||
|
pto=jid,
|
||||||
|
#pfrom=None
|
||||||
|
)
|
||||||
|
# await asyncio.sleep(60 * 20)
|
||||||
|
await refresh_task(
|
||||||
|
self,
|
||||||
|
jid,
|
||||||
|
send_status,
|
||||||
|
"status",
|
||||||
|
"20"
|
||||||
|
)
|
||||||
|
# loop.call_at(
|
||||||
|
# loop.time() + 60 * 20,
|
||||||
|
# loop.create_task,
|
||||||
|
# send_status(jid)
|
||||||
|
# )
|
||||||
|
|
||||||
|
|
||||||
|
async def refresh_task(self, jid, callback, key, val=None):
|
||||||
|
"""
|
||||||
|
Apply new setting at runtime.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
jid : str
|
||||||
|
Jabber ID.
|
||||||
|
key : str
|
||||||
|
Key.
|
||||||
|
val : str, optional
|
||||||
|
Value. The default is None.
|
||||||
|
"""
|
||||||
|
if not val:
|
||||||
|
val = await filehandler.initdb(
|
||||||
|
jid,
|
||||||
|
sqlitehandler.get_settings_value,
|
||||||
|
key
|
||||||
|
)
|
||||||
|
# if task_manager[jid][key]:
|
||||||
|
if jid in task_manager:
|
||||||
|
try:
|
||||||
|
task_manager[jid][key].cancel()
|
||||||
|
except:
|
||||||
|
print("No task of type", key, "to cancel for JID", jid)
|
||||||
|
task_manager[jid][key] = loop.call_at(
|
||||||
|
loop.time() + 60 * float(val),
|
||||||
|
loop.create_task,
|
||||||
|
callback(self, jid)
|
||||||
|
# send_update(jid)
|
||||||
|
)
|
||||||
|
# task_manager[jid][key] = loop.call_later(
|
||||||
|
# 60 * float(val),
|
||||||
|
# loop.create_task,
|
||||||
|
# send_update(jid)
|
||||||
|
# )
|
||||||
|
# task_manager[jid][key] = send_update.loop.call_at(
|
||||||
|
# send_update.loop.time() + 60 * val,
|
||||||
|
# send_update.loop.create_task,
|
||||||
|
# send_update(jid)
|
||||||
|
# )
|
||||||
|
|
||||||
|
|
||||||
|
# TODO Take this function out of
|
||||||
|
# <class 'slixmpp.clientxmpp.ClientXMPP'>
|
||||||
|
async def check_updates(jid):
|
||||||
|
"""
|
||||||
|
Start calling for update check up.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
jid : str
|
||||||
|
Jabber ID.
|
||||||
|
"""
|
||||||
|
while True:
|
||||||
|
# print(await datetimehandler.current_time(), "> CHCK UPDATE",jid)
|
||||||
|
await filehandler.initdb(jid, datahandler.download_updates)
|
||||||
|
await asyncio.sleep(60 * 90)
|
||||||
|
# Schedule to call this function again in 90 minutes
|
||||||
|
# loop.call_at(
|
||||||
|
# loop.time() + 60 * 90,
|
||||||
|
# loop.create_task,
|
||||||
|
# self.check_updates(jid)
|
||||||
|
# )
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
NOTE
|
||||||
|
|
||||||
|
This is an older system, utilizing local storage instead of XMPP presence.
|
||||||
|
This function is good for use with protocols that don't have presence.
|
||||||
|
IRC, LXMF, Matrix, SMTP, Tox.
|
||||||
|
"""
|
||||||
|
async def select_file(self):
|
||||||
|
"""
|
||||||
|
Initiate actions by JID (Jabber ID).
|
||||||
|
"""
|
||||||
|
while True:
|
||||||
|
db_dir = filehandler.get_default_dbdir()
|
||||||
|
if not os.path.isdir(db_dir):
|
||||||
|
msg = (
|
||||||
|
"Slixfeed can not work without a database.\n"
|
||||||
|
"To create a database, follow these steps:\n"
|
||||||
|
"Add Slixfeed contact to your roster.\n"
|
||||||
|
"Send a feed to the bot by URL:\n"
|
||||||
|
"https://reclaimthenet.org/feed/"
|
||||||
|
)
|
||||||
|
# print(await datetimehandler.current_time(), msg)
|
||||||
|
print(msg)
|
||||||
|
else:
|
||||||
|
os.chdir(db_dir)
|
||||||
|
files = os.listdir()
|
||||||
|
# TODO Use loop (with gather) instead of TaskGroup
|
||||||
|
# for file in files:
|
||||||
|
# if file.endswith(".db") and not file.endswith(".db-jour.db"):
|
||||||
|
# jid = file[:-3]
|
||||||
|
# jid_tasker[jid] = asyncio.create_task(self.task_jid(jid))
|
||||||
|
# await jid_tasker[jid]
|
||||||
|
async with asyncio.TaskGroup() as tg:
|
||||||
|
for file in files:
|
||||||
|
if (file.endswith(".db") and
|
||||||
|
not file.endswith(".db-jour.db")):
|
||||||
|
jid = file[:-3]
|
||||||
|
main_task.extend([tg.create_task(self.task_jid(jid))])
|
||||||
|
# main_task = [tg.create_task(self.task_jid(jid))]
|
||||||
|
# task_manager.update({jid: tg})
|
||||||
|
|
||||||
|
|
|
@ -3,17 +3,40 @@
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
FIXME
|
||||||
|
|
||||||
|
1) Function check_readiness or event "changed_status" is causing for
|
||||||
|
triple status messages and also false ones that indicate of lack
|
||||||
|
of feeds.
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
1) Deprecate "add" (see above) and make it interactive.
|
1) Deprecate "add" (see above) and make it interactive.
|
||||||
Slixfeed: Do you still want to add this URL to subscription list?
|
Slixfeed: Do you still want to add this URL to subscription list?
|
||||||
See: case _ if message_lowercase.startswith("add"):
|
See: case _ if message_lowercase.startswith("add"):
|
||||||
|
|
||||||
2) Use loop (with gather) instead of TaskGroup
|
2) Use loop (with gather) instead of TaskGroup.
|
||||||
|
|
||||||
|
3) Assure message delivery before calling a new task.
|
||||||
|
See https://slixmpp.readthedocs.io/en/latest/event_index.html#term-marker_acknowledged
|
||||||
|
|
||||||
|
4) Do not send updates when busy or away.
|
||||||
|
See https://slixmpp.readthedocs.io/en/latest/event_index.html#term-changed_status
|
||||||
|
|
||||||
|
NOTE
|
||||||
|
|
||||||
|
1) Self presence
|
||||||
|
Apparently, it is possible to view self presence.
|
||||||
|
This means that there is no need to store presences in order to switch or restore presence.
|
||||||
|
check_readiness
|
||||||
|
<presence from="slixfeed@canchat.org/xAPgJLHtMMHF" xml:lang="en" id="ab35c07b63a444d0a7c0a9a0b272f301" to="slixfeed@canchat.org/xAPgJLHtMMHF"><status>📂 Send a URL from a blog or a news website.</status><x xmlns="vcard-temp:x:update"><photo /></x></presence>
|
||||||
|
JID: self.boundjid.bare
|
||||||
|
MUC: self.nick
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import slixmpp
|
import slixmpp
|
||||||
|
|
||||||
|
@ -24,6 +47,7 @@ import datetimehandler
|
||||||
import filehandler
|
import filehandler
|
||||||
import filterhandler
|
import filterhandler
|
||||||
import sqlitehandler
|
import sqlitehandler
|
||||||
|
import taskhandler
|
||||||
|
|
||||||
main_task = []
|
main_task = []
|
||||||
jid_tasker = {}
|
jid_tasker = {}
|
||||||
|
@ -41,10 +65,6 @@ loop = asyncio.get_event_loop()
|
||||||
# return current_time
|
# return current_time
|
||||||
|
|
||||||
|
|
||||||
async def handle_event():
|
|
||||||
print("Event handled!")
|
|
||||||
|
|
||||||
|
|
||||||
class Slixfeed(slixmpp.ClientXMPP):
|
class Slixfeed(slixmpp.ClientXMPP):
|
||||||
"""
|
"""
|
||||||
Slixmpp
|
Slixmpp
|
||||||
|
@ -59,21 +79,245 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
# and the XML streams are ready for use. We want to
|
# and the XML streams are ready for use. We want to
|
||||||
# listen for this event so that we we can initialize
|
# listen for this event so that we we can initialize
|
||||||
# our roster.
|
# our roster.
|
||||||
self.add_event_handler("session_start", self.start)
|
self.add_event_handler("session_start", self.start_session)
|
||||||
# self.add_event_handler("session_start", self.select_file)
|
self.add_event_handler("session_resumed", self.start_session)
|
||||||
# self.add_event_handler("session_start", self.send_status)
|
self.add_event_handler("got_offline", print("got_offline"))
|
||||||
# self.add_event_handler("session_start", self.check_updates)
|
self.add_event_handler("got_online", self.check_readiness)
|
||||||
|
self.add_event_handler("changed_status", self.check_readiness)
|
||||||
|
|
||||||
|
# self.add_event_handler("changed_subscription", self.check_subscription)
|
||||||
|
|
||||||
|
# self.add_event_handler("chatstate_active", self.check_chatstate_active)
|
||||||
|
# self.add_event_handler("chatstate_gone", self.check_chatstate_gone)
|
||||||
|
self.add_event_handler("chatstate_composing", self.check_chatstate_composing)
|
||||||
|
self.add_event_handler("chatstate_paused", self.check_chatstate_paused)
|
||||||
|
|
||||||
# The message event is triggered whenever a message
|
# The message event is triggered whenever a message
|
||||||
# stanza is received. Be aware that that includes
|
# stanza is received. Be aware that that includes
|
||||||
# MUC messages and error messages.
|
# MUC messages and error messages.
|
||||||
self.add_event_handler("message", self.message)
|
self.add_event_handler("message", self.message)
|
||||||
self.add_event_handler("disconnected", self.reconnect)
|
|
||||||
|
self.add_event_handler("groupchat_invite", self.muc_invite)
|
||||||
|
self.add_event_handler("groupchat_direct_invite", self.muc_invite)
|
||||||
|
# self.add_event_handler("groupchat_message", self.message)
|
||||||
|
|
||||||
|
# self.add_event_handler("disconnected", self.reconnect)
|
||||||
|
# self.add_event_handler("disconnected", self.inspect_connection)
|
||||||
|
|
||||||
|
self.add_event_handler("reactions", self.reactions)
|
||||||
|
self.add_event_handler("presence_available", self.presence_available)
|
||||||
|
self.add_event_handler("presence_error", self.presence_error)
|
||||||
|
self.add_event_handler("presence_subscribe", self.presence_subscribe)
|
||||||
|
self.add_event_handler("presence_subscribed", self.presence_subscribed)
|
||||||
|
self.add_event_handler("presence_unavailable", self.presence_unavailable)
|
||||||
|
self.add_event_handler("presence_unsubscribe", self.presence_unsubscribe)
|
||||||
|
self.add_event_handler("presence_unsubscribed", self.presence_unsubscribed)
|
||||||
|
|
||||||
# Initialize event loop
|
# Initialize event loop
|
||||||
# self.loop = asyncio.get_event_loop()
|
# self.loop = asyncio.get_event_loop()
|
||||||
|
|
||||||
|
# handlers for connection events
|
||||||
|
self.connection_attempts = 0
|
||||||
|
self.max_connection_attempts = 10
|
||||||
|
self.add_event_handler("connection_failed", self.on_connection_failed)
|
||||||
|
self.add_event_handler("session_end", self.on_session_end)
|
||||||
|
|
||||||
async def start(self, event):
|
"""
|
||||||
|
|
||||||
|
FIXME
|
||||||
|
|
||||||
|
This function is triggered even when status is dnd/away/xa.
|
||||||
|
This results in sending messages even when status is dnd/away/xa.
|
||||||
|
See function check_readiness.
|
||||||
|
|
||||||
|
NOTE
|
||||||
|
|
||||||
|
The issue occurs only at bot startup.
|
||||||
|
Once status is changed to dnd/away/xa, the interval stops - as expected.
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
Use "sleep()"
|
||||||
|
|
||||||
|
"""
|
||||||
|
async def presence_available(self, presence):
|
||||||
|
print("def presence_available", presence["from"].bare)
|
||||||
|
if presence["from"].bare not in self.boundjid.bare:
|
||||||
|
jid = presence["from"].bare
|
||||||
|
await taskhandler.clean_tasks(jid, ["interval", "status", "check"])
|
||||||
|
await taskhandler.task_jid(self, jid)
|
||||||
|
# main_task.extend([asyncio.create_task(taskhandler.task_jid(jid))])
|
||||||
|
# print(main_task)
|
||||||
|
|
||||||
|
async def presence_unavailable(self, presence):
|
||||||
|
if not self.boundjid.bare:
|
||||||
|
print("presence_unavailable", presence["from"].bare, presence["type"])
|
||||||
|
print(presence)
|
||||||
|
|
||||||
|
|
||||||
|
async def presence_error(self, presence):
|
||||||
|
print("presence_error")
|
||||||
|
print(presence)
|
||||||
|
|
||||||
|
async def presence_subscribe(self, presence):
|
||||||
|
print("presence_subscribe")
|
||||||
|
print(presence)
|
||||||
|
|
||||||
|
async def presence_subscribed(self, presence):
|
||||||
|
print("presence_subscribed")
|
||||||
|
print(presence)
|
||||||
|
|
||||||
|
async def presence_unsubscribe(self, presence):
|
||||||
|
print("presence_unsubscribe")
|
||||||
|
print(presence)
|
||||||
|
|
||||||
|
async def presence_unsubscribed(self, presence):
|
||||||
|
print("presence_unsubscribed")
|
||||||
|
print(presence)
|
||||||
|
|
||||||
|
async def reactions(self, message):
|
||||||
|
print("reactions")
|
||||||
|
print(message)
|
||||||
|
|
||||||
|
async def muc_invite(self, message):
|
||||||
|
print(message)
|
||||||
|
breakpoint()
|
||||||
|
muc = message
|
||||||
|
self.add_event_handler(
|
||||||
|
"muc::[room]::message",
|
||||||
|
self.message
|
||||||
|
)
|
||||||
|
self.plugin['xep_0045'].join_muc(
|
||||||
|
self.room,
|
||||||
|
self.nick,
|
||||||
|
# If a room password is needed, use:
|
||||||
|
# password=the_room_password,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def on_session_end(self, event):
|
||||||
|
print(await datetimehandler.current_time(), "Session ended. Attempting to reconnect.")
|
||||||
|
print(event)
|
||||||
|
logging.warning("Session ended. Attempting to reconnect.")
|
||||||
|
await self.recover_connection(event)
|
||||||
|
|
||||||
|
|
||||||
|
async def on_connection_failed(self, event):
|
||||||
|
print(await datetimehandler.current_time(), "Connection failed. Attempting to reconnect.")
|
||||||
|
print(event)
|
||||||
|
logging.warning("Connection failed. Attempting to reconnect.")
|
||||||
|
await self.recover_connection(event)
|
||||||
|
|
||||||
|
|
||||||
|
async def recover_connection(self, event):
|
||||||
|
self.connection_attempts += 1
|
||||||
|
# if self.connection_attempts <= self.max_connection_attempts:
|
||||||
|
# self.reconnect(wait=5.0) # wait a bit before attempting to reconnect
|
||||||
|
# else:
|
||||||
|
# print(await datetimehandler.current_time(),"Maximum connection attempts exceeded.")
|
||||||
|
# logging.error("Maximum connection attempts exceeded.")
|
||||||
|
print("Attempt:", self.connection_attempts)
|
||||||
|
self.reconnect(wait=5.0)
|
||||||
|
|
||||||
|
|
||||||
|
async def inspect_connection(self, event):
|
||||||
|
print("Disconnected\nReconnecting...")
|
||||||
|
print(event)
|
||||||
|
try:
|
||||||
|
self.reconnect
|
||||||
|
except:
|
||||||
|
self.disconnect()
|
||||||
|
print("Problem reconnecting")
|
||||||
|
|
||||||
|
|
||||||
|
async def check_chatstate_composing(self, message):
|
||||||
|
print("def check_chatstate_composing")
|
||||||
|
print(message)
|
||||||
|
if message["type"] in ("chat", "normal"):
|
||||||
|
jid = message["from"].bare
|
||||||
|
status_text="Press \"help\" for manual."
|
||||||
|
self.send_presence(
|
||||||
|
# pshow=status_mode,
|
||||||
|
pstatus=status_text,
|
||||||
|
pto=jid,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def check_chatstate_paused(self, message):
|
||||||
|
print("def check_chatstate_paused")
|
||||||
|
print(message)
|
||||||
|
if message["type"] in ("chat", "normal"):
|
||||||
|
jid = message["from"].bare
|
||||||
|
await taskhandler.refresh_task(
|
||||||
|
self,
|
||||||
|
jid,
|
||||||
|
taskhandler.send_status,
|
||||||
|
"status",
|
||||||
|
20
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def check_readiness(self, presence):
|
||||||
|
"""
|
||||||
|
If available, begin tasks.
|
||||||
|
If unavailable, eliminate tasks.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
presence : str
|
||||||
|
XML stanza </presence>.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
"""
|
||||||
|
print("def check_readiness", presence["from"].bare, presence["type"])
|
||||||
|
# # available unavailable away (chat) dnd xa
|
||||||
|
# print(">>> type", presence["type"], presence["from"].bare)
|
||||||
|
# # away chat dnd xa
|
||||||
|
# print(">>> show", presence["show"], presence["from"].bare)
|
||||||
|
|
||||||
|
jid = presence["from"].bare
|
||||||
|
if presence["type"] == "unavailable":
|
||||||
|
print(">>> unavailable:", jid)
|
||||||
|
await taskhandler.clean_tasks(
|
||||||
|
jid,
|
||||||
|
["interval", "status", "check"]
|
||||||
|
)
|
||||||
|
# elif presence["type"] == "available":
|
||||||
|
# # elif presence["type"] == "available" or presence["show"] == "chat":
|
||||||
|
# print(">>> available:", jid)
|
||||||
|
# # breakpoint()
|
||||||
|
# try:
|
||||||
|
# if task_manager[jid]:
|
||||||
|
# for task in task_manager[jid]:
|
||||||
|
# # print(">>>", jid, "cancel", task)
|
||||||
|
# task_manager[jid][task].cancel()
|
||||||
|
# except:
|
||||||
|
# print(">>> EXC: No task_manager for:", jid)
|
||||||
|
# await taskhandler.task_jid(jid)
|
||||||
|
# # print(task_manager[jid])
|
||||||
|
elif presence["show"] in ("away", "dnd", "xa"):
|
||||||
|
print(">>> away, dnd, xa:", jid)
|
||||||
|
await taskhandler.clean_tasks(
|
||||||
|
jid,
|
||||||
|
["interval"]
|
||||||
|
)
|
||||||
|
await taskhandler.start_tasks(
|
||||||
|
self,
|
||||||
|
jid,
|
||||||
|
["status", "check"]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def resume(self, event):
|
||||||
|
print("def resume")
|
||||||
|
print(event)
|
||||||
|
self.send_presence()
|
||||||
|
await self.get_roster()
|
||||||
|
|
||||||
|
|
||||||
|
async def start_session(self, event):
|
||||||
"""
|
"""
|
||||||
Process the session_start event.
|
Process the session_start event.
|
||||||
|
|
||||||
|
@ -86,13 +330,17 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
event does not provide any additional
|
event does not provide any additional
|
||||||
data.
|
data.
|
||||||
"""
|
"""
|
||||||
|
print("def start_session")
|
||||||
|
print(event)
|
||||||
self.send_presence()
|
self.send_presence()
|
||||||
await self.get_roster()
|
await self.get_roster()
|
||||||
|
|
||||||
# for task in main_task:
|
# for task in main_task:
|
||||||
# task.cancel()
|
# task.cancel()
|
||||||
if not main_task:
|
|
||||||
await self.select_file()
|
# Deprecated in favour of event "presence_available"
|
||||||
|
# if not main_task:
|
||||||
|
# await taskhandler.select_file()
|
||||||
|
|
||||||
|
|
||||||
async def message(self, msg):
|
async def message(self, msg):
|
||||||
|
@ -104,21 +352,23 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
self : ?
|
|
||||||
Self.
|
|
||||||
msg : str
|
msg : str
|
||||||
The received message stanza. See the documentation
|
The received message stanza. See the documentation
|
||||||
for stanza objects and the Message stanza to see
|
for stanza objects and the Message stanza to see
|
||||||
how it may be used.
|
how it may be used.
|
||||||
"""
|
"""
|
||||||
|
# print("message")
|
||||||
|
# print(msg)
|
||||||
if msg["type"] in ("chat", "normal"):
|
if msg["type"] in ("chat", "normal"):
|
||||||
action = 0
|
action = 0
|
||||||
jid = msg["from"].bare
|
jid = msg["from"].bare
|
||||||
|
|
||||||
db_dir = filehandler.get_default_dbdir()
|
# # Begin processing new JID
|
||||||
os.chdir(db_dir)
|
# # Deprecated in favour of event "presence_available"
|
||||||
if jid + ".db" not in os.listdir():
|
# db_dir = filehandler.get_default_dbdir()
|
||||||
await self.task_jid(jid)
|
# os.chdir(db_dir)
|
||||||
|
# if jid + ".db" not in os.listdir():
|
||||||
|
# await taskhandler.task_jid(jid)
|
||||||
|
|
||||||
message = " ".join(msg["body"].split())
|
message = " ".join(msg["body"].split())
|
||||||
message_lowercase = message.lower()
|
message_lowercase = message.lower()
|
||||||
|
@ -135,6 +385,7 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
"\n"
|
"\n"
|
||||||
"Send a URL of a news website to start."
|
"Send a URL of a news website to start."
|
||||||
)
|
)
|
||||||
|
print(task_manager[jid])
|
||||||
case _ if message_lowercase.startswith("add"):
|
case _ if message_lowercase.startswith("add"):
|
||||||
message = message[4:]
|
message = message[4:]
|
||||||
url = message.split(" ")[0]
|
url = message.split(" ")[0]
|
||||||
|
@ -145,7 +396,13 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
datahandler.add_feed_no_check,
|
datahandler.add_feed_no_check,
|
||||||
[url, title]
|
[url, title]
|
||||||
)
|
)
|
||||||
await self.send_status(jid)
|
await taskhandler.refresh_task(
|
||||||
|
self,
|
||||||
|
jid,
|
||||||
|
taskhandler.send_status,
|
||||||
|
"status",
|
||||||
|
20
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
action = "Missing URL."
|
action = "Missing URL."
|
||||||
case _ if message_lowercase.startswith("allow"):
|
case _ if message_lowercase.startswith("allow"):
|
||||||
|
@ -196,15 +453,28 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
).format(val)
|
).format(val)
|
||||||
else:
|
else:
|
||||||
action = "Missing keywords."
|
action = "Missing keywords."
|
||||||
case _ if message_lowercase.startswith("http"):
|
case _ if (message_lowercase.startswith("http") or
|
||||||
|
message_lowercase.startswith("feed:")):
|
||||||
url = message
|
url = message
|
||||||
|
if url.startswith("feed:"):
|
||||||
|
url = await datahandler.feed_to_http(url)
|
||||||
action = await filehandler.initdb(
|
action = await filehandler.initdb(
|
||||||
jid,
|
jid,
|
||||||
datahandler.add_feed,
|
datahandler.add_feed,
|
||||||
url
|
url
|
||||||
)
|
)
|
||||||
# action = "> " + message + "\n" + action
|
# action = "> " + message + "\n" + action
|
||||||
await self.send_status(jid)
|
# FIXME Make the taskhandler to update status message
|
||||||
|
await taskhandler.refresh_task(
|
||||||
|
self,
|
||||||
|
jid,
|
||||||
|
taskhandler.send_status,
|
||||||
|
"status",
|
||||||
|
20
|
||||||
|
)
|
||||||
|
# NOTE This would show the number of new unread entries
|
||||||
|
# await taskhandler.clean_tasks(jid, ["status"])
|
||||||
|
# await taskhandler.send_status(jid)
|
||||||
case _ if message_lowercase.startswith("feeds"):
|
case _ if message_lowercase.startswith("feeds"):
|
||||||
query = message[6:]
|
query = message[6:]
|
||||||
if query:
|
if query:
|
||||||
|
@ -240,9 +510,10 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
sqlitehandler.set_settings_value,
|
sqlitehandler.set_settings_value,
|
||||||
[key, val]
|
[key, val]
|
||||||
)
|
)
|
||||||
await self.refresh_task(
|
await taskhandler.refresh_task(
|
||||||
|
self,
|
||||||
jid,
|
jid,
|
||||||
self.send_update,
|
taskhandler.send_update,
|
||||||
key,
|
key,
|
||||||
val
|
val
|
||||||
)
|
)
|
||||||
|
@ -253,9 +524,21 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
action = "Missing value."
|
action = "Missing value."
|
||||||
case _ if message_lowercase.startswith("next"):
|
case _ if message_lowercase.startswith("next"):
|
||||||
num = message[5:]
|
num = message[5:]
|
||||||
await self.send_update(jid, num)
|
await taskhandler.refresh_task(
|
||||||
await self.send_status(jid)
|
self,
|
||||||
# await self.refresh_task(jid, key, val)
|
jid,
|
||||||
|
taskhandler.send_update,
|
||||||
|
"interval",
|
||||||
|
num
|
||||||
|
)
|
||||||
|
await taskhandler.refresh_task(
|
||||||
|
self,
|
||||||
|
jid,
|
||||||
|
taskhandler.send_status,
|
||||||
|
"status",
|
||||||
|
20
|
||||||
|
)
|
||||||
|
# await taskhandler.refresh_task(jid, key, val)
|
||||||
case _ if message_lowercase.startswith("quantum"):
|
case _ if message_lowercase.startswith("quantum"):
|
||||||
key = message[:7]
|
key = message[:7]
|
||||||
val = message[8:]
|
val = message[8:]
|
||||||
|
@ -293,7 +576,13 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
sqlitehandler.remove_feed,
|
sqlitehandler.remove_feed,
|
||||||
ix
|
ix
|
||||||
)
|
)
|
||||||
await self.send_status(jid)
|
await taskhandler.refresh_task(
|
||||||
|
self,
|
||||||
|
jid,
|
||||||
|
taskhandler.send_status,
|
||||||
|
"status",
|
||||||
|
20
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
action = "Missing feed ID."
|
action = "Missing feed ID."
|
||||||
case _ if message_lowercase.startswith("search"):
|
case _ if message_lowercase.startswith("search"):
|
||||||
|
@ -320,7 +609,7 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
sqlitehandler.set_settings_value,
|
sqlitehandler.set_settings_value,
|
||||||
[key, val]
|
[key, val]
|
||||||
)
|
)
|
||||||
asyncio.create_task(self.task_jid(jid))
|
asyncio.create_task(taskhandler.task_jid(self, jid))
|
||||||
action = "Updates are enabled."
|
action = "Updates are enabled."
|
||||||
# print(await datetimehandler.current_time(), "task_manager[jid]")
|
# print(await datetimehandler.current_time(), "task_manager[jid]")
|
||||||
# print(task_manager[jid])
|
# print(task_manager[jid])
|
||||||
|
@ -357,7 +646,7 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
# except:
|
# except:
|
||||||
# action = "Updates are already disabled."
|
# action = "Updates are already disabled."
|
||||||
# # print("Updates are already disabled. Nothing to do.")
|
# # print("Updates are already disabled. Nothing to do.")
|
||||||
# # await self.send_status(jid)
|
# # await taskhandler.send_status(jid)
|
||||||
key = "enabled"
|
key = "enabled"
|
||||||
val = 0
|
val = 0
|
||||||
await filehandler.initdb(
|
await filehandler.initdb(
|
||||||
|
@ -365,11 +654,16 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
sqlitehandler.set_settings_value,
|
sqlitehandler.set_settings_value,
|
||||||
[key, val]
|
[key, val]
|
||||||
)
|
)
|
||||||
await self.task_jid(jid)
|
await taskhandler.clean_tasks(jid, ["interval"])
|
||||||
|
self.send_presence(
|
||||||
|
pshow="xa",
|
||||||
|
pstatus="Send \"Start\" to receive news.",
|
||||||
|
pto=jid,
|
||||||
|
)
|
||||||
action = "Updates are disabled."
|
action = "Updates are disabled."
|
||||||
case "support":
|
case "support":
|
||||||
# TODO Send an invitation.
|
# TODO Send an invitation.
|
||||||
action = "xmpp:slixmpp@muc.poez.io?join"
|
action = "Join xmpp:slixmpp@muc.poez.io?join"
|
||||||
case _:
|
case _:
|
||||||
action = (
|
action = (
|
||||||
"Unknown command. "
|
"Unknown command. "
|
||||||
|
@ -378,283 +672,6 @@ class Slixfeed(slixmpp.ClientXMPP):
|
||||||
if action: msg.reply(action).send()
|
if action: msg.reply(action).send()
|
||||||
|
|
||||||
|
|
||||||
async def select_file(self):
|
|
||||||
"""
|
|
||||||
Initiate actions by JID (Jabber ID).
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
self : ?
|
|
||||||
Self.
|
|
||||||
"""
|
|
||||||
while True:
|
|
||||||
db_dir = filehandler.get_default_dbdir()
|
|
||||||
if not os.path.isdir(db_dir):
|
|
||||||
msg = (
|
|
||||||
"Slixfeed can not work without a database.\n"
|
|
||||||
"To create a database, follow these steps:\n"
|
|
||||||
"Add Slixfeed contact to your roster.\n"
|
|
||||||
"Send a feed to the bot by URL:\n"
|
|
||||||
"https://reclaimthenet.org/feed/"
|
|
||||||
)
|
|
||||||
# print(await datetimehandler.current_time(), msg)
|
|
||||||
print(msg)
|
|
||||||
else:
|
|
||||||
os.chdir(db_dir)
|
|
||||||
files = os.listdir()
|
|
||||||
# TODO Use loop (with gather) instead of TaskGroup
|
|
||||||
# for file in files:
|
|
||||||
# if file.endswith(".db") and not file.endswith(".db-jour.db"):
|
|
||||||
# jid = file[:-3]
|
|
||||||
# jid_tasker[jid] = asyncio.create_task(self.task_jid(jid))
|
|
||||||
# await jid_tasker[jid]
|
|
||||||
async with asyncio.TaskGroup() as tg:
|
|
||||||
for file in files:
|
|
||||||
if (file.endswith(".db") and
|
|
||||||
not file.endswith(".db-jour.db")):
|
|
||||||
jid = file[:-3]
|
|
||||||
main_task.extend([tg.create_task(self.task_jid(jid))])
|
|
||||||
# main_task = [tg.create_task(self.task_jid(jid))]
|
|
||||||
# task_manager.update({jid: tg})
|
|
||||||
|
|
||||||
|
|
||||||
async def task_jid(self, jid):
|
|
||||||
"""
|
|
||||||
JID (Jabber ID) task manager.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
self : ?
|
|
||||||
Self.
|
|
||||||
jid : str
|
|
||||||
Jabber ID.
|
|
||||||
"""
|
|
||||||
enabled = await filehandler.initdb(
|
|
||||||
jid,
|
|
||||||
sqlitehandler.get_settings_value,
|
|
||||||
"enabled"
|
|
||||||
)
|
|
||||||
# print(await datetimehandler.current_time(), "enabled", enabled, jid)
|
|
||||||
if enabled:
|
|
||||||
task_manager[jid] = {}
|
|
||||||
task_manager[jid]["check"] = asyncio.create_task(
|
|
||||||
check_updates(jid)
|
|
||||||
)
|
|
||||||
task_manager[jid]["status"] = asyncio.create_task(
|
|
||||||
self.send_status(jid)
|
|
||||||
)
|
|
||||||
task_manager[jid]["interval"] = asyncio.create_task(
|
|
||||||
self.send_update(jid)
|
|
||||||
)
|
|
||||||
await task_manager[jid]["check"]
|
|
||||||
await task_manager[jid]["status"]
|
|
||||||
await task_manager[jid]["interval"]
|
|
||||||
else:
|
|
||||||
# FIXME
|
|
||||||
# The following error occurs only upon first attempt to stop.
|
|
||||||
# /usr/lib/python3.11/asyncio/events.py:73: RuntimeWarning: coroutine 'Slixfeed.send_update' was never awaited
|
|
||||||
# self._args = None
|
|
||||||
# RuntimeWarning: Enable tracemalloc to get the object allocation traceback
|
|
||||||
try:
|
|
||||||
task_manager[jid]["interval"].cancel()
|
|
||||||
except:
|
|
||||||
None
|
|
||||||
await self.send_status(jid)
|
|
||||||
|
|
||||||
|
|
||||||
async def send_update(self, jid, num=None):
|
|
||||||
"""
|
|
||||||
Send news items as messages.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
self : ?
|
|
||||||
Self.
|
|
||||||
jid : str
|
|
||||||
Jabber ID.
|
|
||||||
num : str, optional
|
|
||||||
Number. The default is None.
|
|
||||||
"""
|
|
||||||
# print("Starting send_update()")
|
|
||||||
# print(jid)
|
|
||||||
new = await filehandler.initdb(
|
|
||||||
jid,
|
|
||||||
sqlitehandler.get_entry_unread,
|
|
||||||
num
|
|
||||||
)
|
|
||||||
if new:
|
|
||||||
print(await datetimehandler.current_time(), "> SEND UPDATE",jid)
|
|
||||||
self.send_message(
|
|
||||||
mto=jid,
|
|
||||||
mbody=new,
|
|
||||||
mtype="chat"
|
|
||||||
)
|
|
||||||
await self.refresh_task(
|
|
||||||
jid,
|
|
||||||
self.send_update,
|
|
||||||
"interval"
|
|
||||||
)
|
|
||||||
# interval = await filehandler.initdb(
|
|
||||||
# jid,
|
|
||||||
# sqlitehandler.get_settings_value,
|
|
||||||
# "interval"
|
|
||||||
# )
|
|
||||||
# task_manager[jid]["interval"] = loop.call_at(
|
|
||||||
# loop.time() + 60 * interval,
|
|
||||||
# loop.create_task,
|
|
||||||
# self.send_update(jid)
|
|
||||||
# )
|
|
||||||
|
|
||||||
# print(await datetimehandler.current_time(), "asyncio.get_event_loop().time()")
|
|
||||||
# print(await datetimehandler.current_time(), asyncio.get_event_loop().time())
|
|
||||||
# await asyncio.sleep(60 * interval)
|
|
||||||
|
|
||||||
# loop.call_later(
|
|
||||||
# 60 * interval,
|
|
||||||
# loop.create_task,
|
|
||||||
# self.send_update(jid)
|
|
||||||
# )
|
|
||||||
|
|
||||||
# print
|
|
||||||
# await handle_event()
|
|
||||||
|
|
||||||
|
|
||||||
async def send_status(self, jid):
|
|
||||||
"""
|
|
||||||
Send status message.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
self : ?
|
|
||||||
Self.
|
|
||||||
jid : str
|
|
||||||
Jabber ID.
|
|
||||||
"""
|
|
||||||
print(await datetimehandler.current_time(), "> SEND STATUS",jid)
|
|
||||||
enabled = await filehandler.initdb(
|
|
||||||
jid,
|
|
||||||
sqlitehandler.get_settings_value,
|
|
||||||
"enabled"
|
|
||||||
)
|
|
||||||
if not enabled:
|
|
||||||
status_mode = "xa"
|
|
||||||
status_text = "Send \"Start\" to receive news."
|
|
||||||
else:
|
|
||||||
feeds = await filehandler.initdb(
|
|
||||||
jid,
|
|
||||||
sqlitehandler.get_number_of_items,
|
|
||||||
"feeds"
|
|
||||||
)
|
|
||||||
if not feeds:
|
|
||||||
status_mode = "available"
|
|
||||||
status_text = (
|
|
||||||
"📂️ Send a URL from a blog or a news website."
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
unread = await filehandler.initdb(
|
|
||||||
jid,
|
|
||||||
sqlitehandler.get_number_of_entries_unread
|
|
||||||
)
|
|
||||||
if unread:
|
|
||||||
status_mode = "chat"
|
|
||||||
status_text = (
|
|
||||||
"📰 You have {} news items to read."
|
|
||||||
).format(str(unread))
|
|
||||||
# status_text = (
|
|
||||||
# "📰 News items: {}"
|
|
||||||
# ).format(str(unread))
|
|
||||||
# status_text = (
|
|
||||||
# "📰 You have {} news items"
|
|
||||||
# ).format(str(unread))
|
|
||||||
else:
|
|
||||||
status_mode = "available"
|
|
||||||
status_text = "🗞 No news"
|
|
||||||
|
|
||||||
# print(status_text, "for", jid)
|
|
||||||
self.send_presence(
|
|
||||||
pshow=status_mode,
|
|
||||||
pstatus=status_text,
|
|
||||||
pto=jid,
|
|
||||||
#pfrom=None
|
|
||||||
)
|
|
||||||
# await asyncio.sleep(60 * 20)
|
|
||||||
await self.refresh_task(
|
|
||||||
jid,
|
|
||||||
self.send_status,
|
|
||||||
"status",
|
|
||||||
"20"
|
|
||||||
)
|
|
||||||
# loop.call_at(
|
|
||||||
# loop.time() + 60 * 20,
|
|
||||||
# loop.create_task,
|
|
||||||
# self.send_status(jid)
|
|
||||||
# )
|
|
||||||
|
|
||||||
|
|
||||||
async def refresh_task(self, jid, callback, key, val=None):
|
|
||||||
"""
|
|
||||||
Apply new setting at runtime.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
self : ?
|
|
||||||
Self.
|
|
||||||
jid : str
|
|
||||||
Jabber ID.
|
|
||||||
key : str
|
|
||||||
Key.
|
|
||||||
val : str, optional
|
|
||||||
Value. The default is None.
|
|
||||||
"""
|
|
||||||
if not val:
|
|
||||||
val = await filehandler.initdb(
|
|
||||||
jid,
|
|
||||||
sqlitehandler.get_settings_value,
|
|
||||||
key
|
|
||||||
)
|
|
||||||
if jid in task_manager:
|
|
||||||
task_manager[jid][key].cancel()
|
|
||||||
task_manager[jid][key] = loop.call_at(
|
|
||||||
loop.time() + 60 * float(val),
|
|
||||||
loop.create_task,
|
|
||||||
callback(jid)
|
|
||||||
# self.send_update(jid)
|
|
||||||
)
|
|
||||||
# task_manager[jid][key] = loop.call_later(
|
|
||||||
# 60 * float(val),
|
|
||||||
# loop.create_task,
|
|
||||||
# self.send_update(jid)
|
|
||||||
# )
|
|
||||||
# task_manager[jid][key] = self.send_update.loop.call_at(
|
|
||||||
# self.send_update.loop.time() + 60 * val,
|
|
||||||
# self.send_update.loop.create_task,
|
|
||||||
# self.send_update(jid)
|
|
||||||
# )
|
|
||||||
|
|
||||||
|
|
||||||
# TODO Take this function out of
|
|
||||||
# <class 'slixmpp.clientxmpp.ClientXMPP'>
|
|
||||||
async def check_updates(jid):
|
|
||||||
"""
|
|
||||||
Start calling for update check up.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
jid : str
|
|
||||||
Jabber ID.
|
|
||||||
"""
|
|
||||||
while True:
|
|
||||||
print(await datetimehandler.current_time(), "> CHCK UPDATE",jid)
|
|
||||||
await filehandler.initdb(jid, datahandler.download_updates)
|
|
||||||
await asyncio.sleep(60 * 90)
|
|
||||||
# Schedule to call this function again in 90 minutes
|
|
||||||
# loop.call_at(
|
|
||||||
# loop.time() + 60 * 90,
|
|
||||||
# loop.create_task,
|
|
||||||
# self.check_updates(jid)
|
|
||||||
# )
|
|
||||||
|
|
||||||
|
|
||||||
def print_help():
|
def print_help():
|
||||||
"""
|
"""
|
||||||
Print help manual.
|
Print help manual.
|
||||||
|
@ -735,7 +752,9 @@ def print_help():
|
||||||
# " Send a Plain Text file of your news items.\n"
|
# " Send a Plain Text file of your news items.\n"
|
||||||
# "\n"
|
# "\n"
|
||||||
"SUPPORT\n"
|
"SUPPORT\n"
|
||||||
" support"
|
" help\n"
|
||||||
|
" Print this help manual.\n"
|
||||||
|
" support\n"
|
||||||
" Join xmpp:slixmpp@muc.poez.io?join\n"
|
" Join xmpp:slixmpp@muc.poez.io?join\n"
|
||||||
"\n"
|
"\n"
|
||||||
# "PROTOCOLS\n"
|
# "PROTOCOLS\n"
|
||||||
|
|
Loading…
Reference in a new issue