forked from sch/Slixfeed
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
|
||||
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
|
||||
Linux-Unix Daily Fortunes - Quotes & Quips - motd.ambians.com, https://motd.ambians.com/out/rss/daily-fortunes.xml, en-US, USA
|
||||
Shakespeare Quotes & Plays, https://shakespearequotesandplays.com/feed/, 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, 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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
Chiportal, https://chiportal.co.il/feed/, he-IL, Israel
|
||||
|
|
|
|
@ -1,2 +1,3 @@
|
|||
name, url, language, country
|
||||
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
|
||||
CryptoSlate, https://cryptoslate.com/feed/, en-US, USA
|
||||
CryptoPotato, https://cryptopotato.com/feed/, en-US, USA
|
||||
CryptoSlate, https://cryptoslate.com/feed/, en-US, United States
|
||||
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
|
||||
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
|
||||
Jerm Warfare, https://jermwarfare.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
|
||||
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 - חדר משלך, 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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
|
|
|
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
|
||||
ynet - מדע, https://www.ynet.co.il/Integration/StoryRss2142.xml, he-IL, Israel
|
||||
Stories by Williams, https://storiesbywilliams.com/feed/, en-US, USA
|
||||
SciTechDaily, https://scitechdaily.com/feed/, en-US, USA
|
||||
ScienceDaily, https://www.sciencedaily.com/rss/all.xml, en-US, USA
|
||||
ScienceAlert, https://www.sciencealert.com/feed, en-US, USA
|
||||
NASA Image of the Day, https://www.nasa.gov/feeds/iotd-feed, en-US, USA
|
||||
Futurism, https://futurism.com/feed, en-US, USA
|
||||
Nature, https://www.nature.com/nature.rss, en-US, USA
|
||||
Mail Online - Science & tech, https://www.dailymail.co.uk/sciencetech/index.rss, en-US, UK
|
||||
Stories by Williams, https://storiesbywilliams.com/feed/, en-US, United States
|
||||
SciTechDaily, https://scitechdaily.com/feed/, en-US, United States
|
||||
ScienceDaily, https://www.sciencedaily.com/rss/all.xml, en-US, United States
|
||||
ScienceAlert, https://www.sciencealert.com/feed, en-US, United States
|
||||
NASA Image of the Day, https://www.nasa.gov/feeds/iotd-feed, en-US, United States
|
||||
Futurism, https://futurism.com/feed, en-US, United States
|
||||
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, 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
|
||||
Daily Stormer, https://dailystormer.in/feed/, 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
|
||||
The Corbett Report, https://www.corbettreport.com/feed/, en-US, Japan
|
||||
ZeroGov, https://zerogov.com/feed/, en-US, USA
|
||||
Daily Stormer, https://dailystormer.in/feed/, en-US, USA
|
||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
||||
The Hill News, https://thehill.com/feed/?feed=partnerfeed-news-feed&format=rss, en-US, USA
|
||||
nobulart - Exploring the Great Reset, https://nobulart.com/feed/, en-US, USA
|
||||
John W. Whitehead, Constitutional Attorney, https://agovernmentofwolves.com/feed/, en-US, USA
|
||||
BlackListed News, https://www.blacklistednews.com/rss.php, en-US, USA
|
||||
ZeroGov, https://zerogov.com/feed/, en-US, United States
|
||||
Daily Stormer, https://dailystormer.in/feed/, en-US, United States
|
||||
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, United States
|
||||
nobulart - Exploring the Great Reset, https://nobulart.com/feed/, en-US, United States
|
||||
John W. Whitehead, Constitutional Attorney, https://agovernmentofwolves.com/feed/, en-US, United States
|
||||
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
|
||||
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
|
||||
ynet - מעורבות, https://www.ynet.co.il/Integration/StoryRss3262.xml, he-IL, Israel
|
||||
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 - Jewish, https://www.ynet.co.il/Integration/StoryRss3443.xml, en-IL, Israel
|
||||
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
|
||||
Jacob McCormick, https://mccor.xyz/rss.xml, en-US, USA
|
||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
||||
Jacob McCormick, https://mccor.xyz/rss.xml, en-US, United States
|
||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, United States
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
||||
nobulart - Exploring the Great Reset, https://nobulart.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, United States
|
||||
|
||||
|
|
|
|
@ -1,6 +1,24 @@
|
|||
name, url, language, country
|
||||
Developpez, https://www.developpez.com/index/atom, fr-FR, France
|
||||
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, USA
|
||||
CryptoSlate, https://cryptoslate.com/feed/, en-US, USA
|
||||
Daily Stormer, https://dailystormer.in/feed/, en-US, USA
|
||||
Futurism, https://futurism.com/feed, en-US, USA
|
||||
The Logs, https://www.flu0r1ne.net/logs/rss.xml, en-US, United States
|
||||
CryptoSlate, https://cryptoslate.com/feed/, en-US, United States
|
||||
Daily Stormer, https://dailystormer.in/feed/, en-US, United States
|
||||
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
|
||||
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
|
||||
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
|
||||
Trip101, https://trip101.com/feed, en-US, United States
|
||||
|
|
|
|
@ -1,6 +1,9 @@
|
|||
name, url, language, country
|
||||
ZeroGov, https://zerogov.com/feed/, en-US, USA
|
||||
The Organic Prepper, https://www.theorganicprepper.com/feed/, en-US, USA
|
||||
The Hill News, https://thehill.com/feed/?feed=partnerfeed-news-feed&format=rss, en-US, USA
|
||||
John W. Whitehead, Constitutional Attorney, https://agovernmentofwolves.com/feed/, en-US, USA
|
||||
BlackListed News, https://www.blacklistednews.com/rss.php, en-US, USA
|
||||
ZeroGov, https://zerogov.com/feed/, en-US, United States
|
||||
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, United States
|
||||
John W. Whitehead, Constitutional Attorney, https://agovernmentofwolves.com/feed/, en-US, United States
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
The Corbett Report, https://www.corbettreport.com/feed/, en-US, Japan
|
||||
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
|
||||
DownThemAll!, https://www.downthemall.org/feed, en-US, Worldwide
|
||||
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 Examples, https://pythonexamples.org/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
|
||||
Luke's Videos, https://videos.lukesmith.xyz/feeds/videos.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
|
||||
|
||||
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.)
|
||||
|
||||
11) Download and upload/send article (xHTML, xHTMLZ, Markdown, MHTML, TXT)
|
||||
Use Readability
|
||||
11) Download and upload/send article (xHTML, xHTMLZ, Markdown, MHTML, TXT).
|
||||
Use Readability.
|
||||
|
||||
12) Fetch summary from URL, instead of storing summary.
|
||||
|
||||
|
@ -42,6 +42,14 @@ TODO
|
|||
https://github.com/michael-lazar/pygopherd
|
||||
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:
|
||||
|
|
|
@ -1,6 +1,15 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- 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 asyncio
|
||||
import feedparser
|
||||
|
@ -55,12 +64,12 @@ async def download_updates(db_file, url=None):
|
|||
try:
|
||||
feed = feedparser.parse(res[0])
|
||||
if feed.bozo:
|
||||
bozo = (
|
||||
"WARNING: Bozo detected for feed: {}\n"
|
||||
"For more information, visit "
|
||||
"https://pythonhosted.org/feedparser/bozo.html"
|
||||
).format(source)
|
||||
print(bozo)
|
||||
# bozo = (
|
||||
# "WARNING: Bozo detected for feed: {}\n"
|
||||
# "For more information, visit "
|
||||
# "https://pythonhosted.org/feedparser/bozo.html"
|
||||
# ).format(source)
|
||||
# print(bozo)
|
||||
valid = 0
|
||||
else:
|
||||
valid = 1
|
||||
|
@ -96,8 +105,6 @@ async def download_updates(db_file, url=None):
|
|||
)
|
||||
# new_entry = 0
|
||||
for entry in entries:
|
||||
if entry.has_key("id"):
|
||||
eid = entry.id
|
||||
if entry.has_key("title"):
|
||||
title = entry.title
|
||||
else:
|
||||
|
@ -108,6 +115,10 @@ async def download_updates(db_file, url=None):
|
|||
link = await trim_url(link)
|
||||
else:
|
||||
link = source
|
||||
if entry.has_key("id"):
|
||||
eid = entry.id
|
||||
else:
|
||||
eid = link
|
||||
# TODO Pass date too for comparion check
|
||||
if entry.has_key("published"):
|
||||
date = entry.published
|
||||
|
@ -138,7 +149,7 @@ async def download_updates(db_file, url=None):
|
|||
# date = date.isoformat() # Convert to ISO 8601
|
||||
else:
|
||||
# TODO Just set date = "*** No date ***"
|
||||
# date = datetime.now().isoformat()
|
||||
# date = await datetime.now().isoformat()
|
||||
date = await datetimehandler.now()
|
||||
# NOTE Would seconds result in better database performance
|
||||
# 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"
|
||||
).format(len(feeds))
|
||||
for feed in feeds:
|
||||
try:
|
||||
feed_name = feeds[feed]["feed"]["title"]
|
||||
except:
|
||||
feed_name = urlsplit(feed).netloc
|
||||
feed_addr = feed
|
||||
feed_amnt = len(feeds[feed].entries)
|
||||
if feed_amnt:
|
||||
|
@ -707,7 +721,10 @@ async def feed_mode_scan(db_file, url, tree):
|
|||
# res = await download_feed(feed)
|
||||
# except:
|
||||
# continue
|
||||
try:
|
||||
feed_name = feeds[feed]["feed"]["title"]
|
||||
except:
|
||||
feed_name = urlsplit(feed).netloc
|
||||
feed_addr = feed
|
||||
feed_amnt = len(feeds[feed].entries)
|
||||
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)
|
||||
msg = await add_feed(db_file, feed_addr)
|
||||
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
|
||||
# manually editing)
|
||||
ix = item[0]
|
||||
print(">>> SOURCE: ", source)
|
||||
print(">>> INVALID:", item[1])
|
||||
# print(">>> SOURCE: ", source)
|
||||
# print(">>> INVALID:", item[1])
|
||||
# print("title:", item[1])
|
||||
# print("link :", item[2])
|
||||
# print("id :", item[3])
|
||||
if item[5] == 1:
|
||||
print(">>> DELETING:", item[1])
|
||||
# print(">>> DELETING:", item[1])
|
||||
sql = (
|
||||
"DELETE "
|
||||
"FROM entries "
|
||||
|
@ -961,7 +961,7 @@ async def remove_nonexistent_entries(db_file, feed, source):
|
|||
)
|
||||
cur.execute(sql, (ix,))
|
||||
else:
|
||||
print(">>> ARCHIVING:", item[1])
|
||||
# print(">>> ARCHIVING:", item[1])
|
||||
sql = (
|
||||
"INSERT "
|
||||
"INTO archive "
|
||||
|
@ -1221,7 +1221,12 @@ async def search_entries(db_file, query):
|
|||
else:
|
||||
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,
|
||||
title=None, link=None, date=None):
|
||||
"""
|
||||
|
@ -1277,8 +1282,8 @@ async def check_entry_exist(db_file, source, eid=None,
|
|||
"timestamp": date
|
||||
}).fetchone()
|
||||
except:
|
||||
print("this is source:", source)
|
||||
print("this is date: ", date)
|
||||
print(await datetimehandler.current_time(), "ERROR: date for:", source)
|
||||
print(await datetimehandler.current_time(), "ERROR: date for:", date)
|
||||
else:
|
||||
sql = (
|
||||
"SELECT id "
|
||||
|
@ -1295,7 +1300,7 @@ async def check_entry_exist(db_file, source, eid=None,
|
|||
else:
|
||||
None
|
||||
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):
|
||||
|
|
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
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
|
@ -24,6 +47,7 @@ import datetimehandler
|
|||
import filehandler
|
||||
import filterhandler
|
||||
import sqlitehandler
|
||||
import taskhandler
|
||||
|
||||
main_task = []
|
||||
jid_tasker = {}
|
||||
|
@ -41,10 +65,6 @@ loop = asyncio.get_event_loop()
|
|||
# return current_time
|
||||
|
||||
|
||||
async def handle_event():
|
||||
print("Event handled!")
|
||||
|
||||
|
||||
class Slixfeed(slixmpp.ClientXMPP):
|
||||
"""
|
||||
Slixmpp
|
||||
|
@ -59,21 +79,245 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
# and the XML streams are ready for use. We want to
|
||||
# listen for this event so that we we can initialize
|
||||
# our roster.
|
||||
self.add_event_handler("session_start", self.start)
|
||||
# self.add_event_handler("session_start", self.select_file)
|
||||
# self.add_event_handler("session_start", self.send_status)
|
||||
# self.add_event_handler("session_start", self.check_updates)
|
||||
self.add_event_handler("session_start", self.start_session)
|
||||
self.add_event_handler("session_resumed", self.start_session)
|
||||
self.add_event_handler("got_offline", print("got_offline"))
|
||||
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
|
||||
# stanza is received. Be aware that that includes
|
||||
# MUC messages and error messages.
|
||||
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
|
||||
# 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.
|
||||
|
||||
|
@ -86,13 +330,17 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
event does not provide any additional
|
||||
data.
|
||||
"""
|
||||
print("def start_session")
|
||||
print(event)
|
||||
self.send_presence()
|
||||
await self.get_roster()
|
||||
|
||||
# for task in main_task:
|
||||
# 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):
|
||||
|
@ -104,21 +352,23 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
|
||||
Parameters
|
||||
----------
|
||||
self : ?
|
||||
Self.
|
||||
msg : str
|
||||
The received message stanza. See the documentation
|
||||
for stanza objects and the Message stanza to see
|
||||
how it may be used.
|
||||
"""
|
||||
# print("message")
|
||||
# print(msg)
|
||||
if msg["type"] in ("chat", "normal"):
|
||||
action = 0
|
||||
jid = msg["from"].bare
|
||||
|
||||
db_dir = filehandler.get_default_dbdir()
|
||||
os.chdir(db_dir)
|
||||
if jid + ".db" not in os.listdir():
|
||||
await self.task_jid(jid)
|
||||
# # Begin processing new JID
|
||||
# # Deprecated in favour of event "presence_available"
|
||||
# db_dir = filehandler.get_default_dbdir()
|
||||
# os.chdir(db_dir)
|
||||
# if jid + ".db" not in os.listdir():
|
||||
# await taskhandler.task_jid(jid)
|
||||
|
||||
message = " ".join(msg["body"].split())
|
||||
message_lowercase = message.lower()
|
||||
|
@ -135,6 +385,7 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
"\n"
|
||||
"Send a URL of a news website to start."
|
||||
)
|
||||
print(task_manager[jid])
|
||||
case _ if message_lowercase.startswith("add"):
|
||||
message = message[4:]
|
||||
url = message.split(" ")[0]
|
||||
|
@ -145,7 +396,13 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
datahandler.add_feed_no_check,
|
||||
[url, title]
|
||||
)
|
||||
await self.send_status(jid)
|
||||
await taskhandler.refresh_task(
|
||||
self,
|
||||
jid,
|
||||
taskhandler.send_status,
|
||||
"status",
|
||||
20
|
||||
)
|
||||
else:
|
||||
action = "Missing URL."
|
||||
case _ if message_lowercase.startswith("allow"):
|
||||
|
@ -196,15 +453,28 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
).format(val)
|
||||
else:
|
||||
action = "Missing keywords."
|
||||
case _ if message_lowercase.startswith("http"):
|
||||
case _ if (message_lowercase.startswith("http") or
|
||||
message_lowercase.startswith("feed:")):
|
||||
url = message
|
||||
if url.startswith("feed:"):
|
||||
url = await datahandler.feed_to_http(url)
|
||||
action = await filehandler.initdb(
|
||||
jid,
|
||||
datahandler.add_feed,
|
||||
url
|
||||
)
|
||||
# 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"):
|
||||
query = message[6:]
|
||||
if query:
|
||||
|
@ -240,9 +510,10 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
sqlitehandler.set_settings_value,
|
||||
[key, val]
|
||||
)
|
||||
await self.refresh_task(
|
||||
await taskhandler.refresh_task(
|
||||
self,
|
||||
jid,
|
||||
self.send_update,
|
||||
taskhandler.send_update,
|
||||
key,
|
||||
val
|
||||
)
|
||||
|
@ -253,9 +524,21 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
action = "Missing value."
|
||||
case _ if message_lowercase.startswith("next"):
|
||||
num = message[5:]
|
||||
await self.send_update(jid, num)
|
||||
await self.send_status(jid)
|
||||
# await self.refresh_task(jid, key, val)
|
||||
await taskhandler.refresh_task(
|
||||
self,
|
||||
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"):
|
||||
key = message[:7]
|
||||
val = message[8:]
|
||||
|
@ -293,7 +576,13 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
sqlitehandler.remove_feed,
|
||||
ix
|
||||
)
|
||||
await self.send_status(jid)
|
||||
await taskhandler.refresh_task(
|
||||
self,
|
||||
jid,
|
||||
taskhandler.send_status,
|
||||
"status",
|
||||
20
|
||||
)
|
||||
else:
|
||||
action = "Missing feed ID."
|
||||
case _ if message_lowercase.startswith("search"):
|
||||
|
@ -320,7 +609,7 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
sqlitehandler.set_settings_value,
|
||||
[key, val]
|
||||
)
|
||||
asyncio.create_task(self.task_jid(jid))
|
||||
asyncio.create_task(taskhandler.task_jid(self, jid))
|
||||
action = "Updates are enabled."
|
||||
# print(await datetimehandler.current_time(), "task_manager[jid]")
|
||||
# print(task_manager[jid])
|
||||
|
@ -357,7 +646,7 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
# except:
|
||||
# action = "Updates are already disabled."
|
||||
# # print("Updates are already disabled. Nothing to do.")
|
||||
# # await self.send_status(jid)
|
||||
# # await taskhandler.send_status(jid)
|
||||
key = "enabled"
|
||||
val = 0
|
||||
await filehandler.initdb(
|
||||
|
@ -365,11 +654,16 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
sqlitehandler.set_settings_value,
|
||||
[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."
|
||||
case "support":
|
||||
# TODO Send an invitation.
|
||||
action = "xmpp:slixmpp@muc.poez.io?join"
|
||||
action = "Join xmpp:slixmpp@muc.poez.io?join"
|
||||
case _:
|
||||
action = (
|
||||
"Unknown command. "
|
||||
|
@ -378,283 +672,6 @@ class Slixfeed(slixmpp.ClientXMPP):
|
|||
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():
|
||||
"""
|
||||
Print help manual.
|
||||
|
@ -735,7 +752,9 @@ def print_help():
|
|||
# " Send a Plain Text file of your news items.\n"
|
||||
# "\n"
|
||||
"SUPPORT\n"
|
||||
" support"
|
||||
" help\n"
|
||||
" Print this help manual.\n"
|
||||
" support\n"
|
||||
" Join xmpp:slixmpp@muc.poez.io?join\n"
|
||||
"\n"
|
||||
# "PROTOCOLS\n"
|
||||
|
|
Loading…
Reference in a new issue