From 665764bc801d14ec4d20357e2c43fd2a1dec6170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jurij=20Podgor=C5=A1ek?= Date: Thu, 30 Sep 2021 21:50:20 +0200 Subject: [PATCH 1/2] Class for event, better sh script for testing, added kulturnik --- README.org | 7 ++- mobili_cli.egg-info/SOURCES.txt | 6 ++- .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 145 bytes mobili_cli/__pycache__/event.cpython-39.pyc | Bin 0 -> 1415 bytes mobili_cli/event.py | 42 ++++++++++++++++++ mobili_cli/utils/__init__.py | 0 mobili_cli/utils/load-rss-feed.py | 13 +++--- primeri/izpisi-kulturnik.sh | 7 +++ primeri/izpisi-neodvisni.sh | 4 +- setup.py | 2 +- 10 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 mobili_cli/__pycache__/__init__.cpython-39.pyc create mode 100644 mobili_cli/__pycache__/event.cpython-39.pyc create mode 100644 mobili_cli/event.py create mode 100644 mobili_cli/utils/__init__.py create mode 100755 primeri/izpisi-kulturnik.sh diff --git a/README.org b/README.org index 8133033..dd449cf 100644 --- a/README.org +++ b/README.org @@ -38,7 +38,6 @@ events via mobilizon GraphQL api from yaml or json or whatever. Probably yaml. *** developing in guix - ** Python requests #+BEGIN_EXAMPLE python @@ -172,3 +171,9 @@ events via mobilizon GraphQL api from yaml or json or whatever. Probably yaml. #+END_EXAMPLE + +** RSS import + This tool can be used to import events from a RSS feed. + Once run, it checks if there are new events to be added and updates existing ones if need be. +*** Identification + Each event is uniquely identified by its' url ("link" field), which is mapped into the "link" field on mobilizon. diff --git a/mobili_cli.egg-info/SOURCES.txt b/mobili_cli.egg-info/SOURCES.txt index 7bf1568..30b15af 100644 --- a/mobili_cli.egg-info/SOURCES.txt +++ b/mobili_cli.egg-info/SOURCES.txt @@ -1,6 +1,7 @@ setup.py mobili_cli/__init__.py mobili_cli/cli.py +mobili_cli/event.py mobili_cli.egg-info/PKG-INFO mobili_cli.egg-info/SOURCES.txt mobili_cli.egg-info/dependency_links.txt @@ -9,4 +10,7 @@ mobili_cli.egg-info/requires.txt mobili_cli.egg-info/top_level.txt mobili_cli/commands/__init__.py mobili_cli/commands/cmd_init.py -mobili_cli/commands/cmd_status.py \ No newline at end of file +mobili_cli/commands/cmd_status.py +mobili_cli/utils/__init__.py +mobili_cli/utils/authenticate.py +mobili_cli/utils/load-rss-feed.py \ No newline at end of file diff --git a/mobili_cli/__pycache__/__init__.cpython-39.pyc b/mobili_cli/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83be24a76910e3c23d7161583fbd1dc25b1a256f GIT binary patch literal 145 zcmYe~<>g`kf^^2PL=gQLL?8o3AjbiSi&=m~3PUi1CZpdHMqqvS&R z7JyWaeI;KxAf5mTabU*Vq-n(kuXc7kGoH`;%}m;8tP@y2c8=3u0U_UUv%0`W4&XIU zKu98KP72zk6m^!ff^``suZRpJzaWy&SvQcOj4nu*%UXvd@lQBM66)A+2r`zbRW>VB z56!EK!R7#7^9Y0@T`EbJNebzh4178+L-;~+S%YsRW4Q+3nxp`;?!v>d8rY*AhvSQd zI_7-=uh|7LrBfovl!2tv03?&7L$2si61dQ2Hdl`0?Htdu!D+%BH!45T5ggSu6fuY^ zqLH)TPum~MLbX3UHbvPU>awp+ZPqTz_gS8aUVckec)5qea~BJd4Kgdl8l*6on9vBG zNz>o|;lka+doLF1%l|;^>Ob)AI)p6{8yTD0kx7`w#JYh3BP+21np-o^13xKF+zkvxFT znz30h<2HoB2&Q}<%t8sVW1`p!jm>RDXz&C0Pmon;2r}F^P8|(l= zV|cdMKCQEuHvOy7djy>o4Tm~|>^MsrZ&ab9dnNO-v@U*DHOO;}_0wO6w9VbWmTMZB literal 0 HcmV?d00001 diff --git a/mobili_cli/event.py b/mobili_cli/event.py new file mode 100644 index 0000000..038915f --- /dev/null +++ b/mobili_cli/event.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +from pprint import pp +from datetime import datetime + +class Event: + status = None + + def __init__(self, title, time, link): + self.title = title + self.time = time + self.link = link + + def setStatus(self, status): + self.status = status + + def setLocation(self, location): + self.location = location + + def __str__(self): + return str({ + 'title': self.title, + 'time': self.time, + 'link': self.link, + 'status': self.status + }) + +def parseRSS(entry): + for k in ['title', 'ical_dtstart', 'link']: + if k not in entry: + raise ValueError(f"{k} is a required event parameter") + + title, time, link = (entry.title, datetime.fromisoformat(entry['ical_dtstart']), entry.link) + ev = Event(title, time, link) + + if 'ical_status' in entry: + ev.setStatus(entry['ical_status']) + + if 'ical_location' in entry: + ev.setLocation(entry['ical_location']) + + return ev diff --git a/mobili_cli/utils/__init__.py b/mobili_cli/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mobili_cli/utils/load-rss-feed.py b/mobili_cli/utils/load-rss-feed.py index cc124e6..e9c580d 100755 --- a/mobili_cli/utils/load-rss-feed.py +++ b/mobili_cli/utils/load-rss-feed.py @@ -2,15 +2,18 @@ import sys import feedparser +from pprint import pp + +from mobili_cli.event import Event, parseRSS try: url = sys.argv[1] - f = feedparser.parse(url) - for dogodek in f['entries']: - print(dogodek) - except ValueError: raise SystemExit('Usage: load-rss-feed.py ') - +f = feedparser.parse(url) +for e in f['entries']: + pp(e) + event = parseRSS(e) + pp(str(event)) diff --git a/primeri/izpisi-kulturnik.sh b/primeri/izpisi-kulturnik.sh new file mode 100755 index 0000000..a389a53 --- /dev/null +++ b/primeri/izpisi-kulturnik.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +polnapot=$(realpath $0) +pot=$(dirname $polnapot) +url="https://dogodki.kulturnik.si/?format=rss" + +$pot/../mobili_cli/utils/load-rss-feed.py $url diff --git a/primeri/izpisi-neodvisni.sh b/primeri/izpisi-neodvisni.sh index 2970d4b..210c27a 100755 --- a/primeri/izpisi-neodvisni.sh +++ b/primeri/izpisi-neodvisni.sh @@ -1,5 +1,7 @@ #!/bin/bash +polnapot=$(realpath $0) +pot=$(dirname $polnapot) url="https://www.neodvisni.art/novice/feed" -../mobili_cli/utils/load-rss-feed.py $url +$pot/../mobili_cli/utils/load-rss-feed.py $url diff --git a/setup.py b/setup.py index 8ba8c84..70ce51e 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name="mobili_cli", version="0.1", - packages=["mobili_cli", "mobili_cli.commands"], + packages=["mobili_cli", "mobili_cli.commands", "mobili_cli.utils"], include_package_data=True, install_requires=["click", "graphql-core", "requests"], entry_points=""" From 13bb18f8a31aa6084be08248e2c4847e059ae7ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jurij=20Podgor=C5=A1ek?= Date: Thu, 30 Sep 2021 22:14:33 +0200 Subject: [PATCH 2/2] Read image from metadata, gitignore updates, cleanup cache py files --- .gitignore | 2 ++ mobili_cli/__pycache__/__init__.cpython-38.pyc | Bin 157 -> 0 bytes mobili_cli/__pycache__/__init__.cpython-39.pyc | Bin 145 -> 0 bytes mobili_cli/__pycache__/cli.cpython-38.pyc | Bin 2338 -> 0 bytes mobili_cli/__pycache__/event.cpython-39.pyc | Bin 1415 -> 0 bytes mobili_cli/event.py | 10 +++++++++- requirements.txt | 2 ++ 7 files changed, 13 insertions(+), 1 deletion(-) delete mode 100644 mobili_cli/__pycache__/__init__.cpython-38.pyc delete mode 100644 mobili_cli/__pycache__/__init__.cpython-39.pyc delete mode 100644 mobili_cli/__pycache__/cli.cpython-38.pyc delete mode 100644 mobili_cli/__pycache__/event.cpython-39.pyc diff --git a/.gitignore b/.gitignore index 9866359..378537a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ scratch +**/__pycache__/ +.#* diff --git a/mobili_cli/__pycache__/__init__.cpython-38.pyc b/mobili_cli/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index e3adb4013c8f5af2d42792cc7f4ed3c4360fdb4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWIL<>g`kg7q02 QKczG$)edC#XCP((0Naoy3IG5A diff --git a/mobili_cli/__pycache__/__init__.cpython-39.pyc b/mobili_cli/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 83be24a76910e3c23d7161583fbd1dc25b1a256f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmYe~<>g`kf^^2PL=gQLL?8o3AjbiSi&=m~3PUi1CZpd@%-`tG;I*gxg#tnP4Q1DIiY&3i*#~#$oB3w=!^}*Lp_$)S!j8k( z-!zzPE(Z6|&0i3bNuDr&{N_F{$HEuNl0sU?+_xVxY0JuMCM!q6uPCwOsETxC^;q~- z#dh42sZ!QTIj!oaT)L;?l>0MkR?Qr7&Tzt%tl@+jzMea>{083hs-bK-eJr3a$U5XA zPMtxYJ+|bWY#dwV%Dh~_+@f4MwpCRw%azych>stCN%H5cdF3r|u(n@afBNLvaJnjw zUdh7V&U&iJ3)`rq^M+{((m&s>(d=5H(zW|pv`4p^wSL@*!d`#v?(MsG)_U1ioWwzt z#FHw9t^Psb20@(0c@RvKRW=0U4j(Q}fM}g>iOBl%W05W(}`B&br16y`C~A>?$wMJd;bMb&F7S;zYH9y#mvsUEfyGc2-#C z01g=MdSmG-E-I{^=@xdVyQXx(SWJ~GN!Fc%V!&xQ+vYAG&P_tW`u|W6k`l#rC?mGR z^a>>G?*Pr8;#UUyi9=%e<;U#zvNSpH;*NI~HZL}wO2e&0$yU25G+m(=NRV|OT5S(t z)-o2x{ul6nW723^ZZ{o@RT}nG5EQi_=w)&*A-x_1FZaS^yrLJW_Ee3mca0Uxhk zIHh%IdqgZbZ)7lqtaQ;=P=?oYDj4E-_J=?LMoM-0k$q_W$kG)XMP#?8Z*w?;v!Af~ zoV{QpYo|=R_VDUO322=g*CHPj7ILj=5uf5-A5g)k=|`oup>?M9E!=ztUwhCCn_wdY zGx;I*X;i6m=uK=jdu0Om#MXARqNx~aN&vk=;wA|?V&aMm`d-0;hh8QN z=<8~lX$rz({6>_ex!TVIqw+jXyJqODu2O}30GN*2M|_MwMez%=-SEJ#Yh|)zpn`sw zZx3&*Z-;4D886>f-k2a%q_V!!VXlznE!<=02YrQNtdjmvtPX}#tE*>eKV04@livJS z2jC}#Z~SU(f=&{4^(t(=6le-MIbjGm!yh{A;} z<0$tV>rdO88!tA4=Np@wkJ=BPmzBd`?1j7JLSq7{q72T;wBIPl>f&!$*yQA*8g7|V zv3IgKEvm@Kl2j;fWn2RN30+v}YoPM$Pxg{L26w0&m7(^lXV42L>*sNn7WOloTiQK= t??1*A?lHMqqvS&R z7JyWaeI;KxAf5mTabU*Vq-n(kuXc7kGoH`;%}m;8tP@y2c8=3u0U_UUv%0`W4&XIU zKu98KP72zk6m^!ff^``suZRpJzaWy&SvQcOj4nu*%UXvd@lQBM66)A+2r`zbRW>VB z56!EK!R7#7^9Y0@T`EbJNebzh4178+L-;~+S%YsRW4Q+3nxp`;?!v>d8rY*AhvSQd zI_7-=uh|7LrBfovl!2tv03?&7L$2si61dQ2Hdl`0?Htdu!D+%BH!45T5ggSu6fuY^ zqLH)TPum~MLbX3UHbvPU>awp+ZPqTz_gS8aUVckec)5qea~BJd4Kgdl8l*6on9vBG zNz>o|;lka+doLF1%l|;^>Ob)AI)p6{8yTD0kx7`w#JYh3BP+21np-o^13xKF+zkvxFT znz30h<2HoB2&Q}<%t8sVW1`p!jm>RDXz&C0Pmon;2r}F^P8|(l= zV|cdMKCQEuHvOy7djy>o4Tm~|>^MsrZ&ab9dnNO-v@U*DHOO;}_0wO6w9VbWmTMZB diff --git a/mobili_cli/event.py b/mobili_cli/event.py index 038915f..928dc18 100644 --- a/mobili_cli/event.py +++ b/mobili_cli/event.py @@ -2,6 +2,7 @@ from pprint import pp from datetime import datetime +from metadata_parser import MetadataParser class Event: status = None @@ -17,12 +18,17 @@ class Event: def setLocation(self, location): self.location = location + def setImageFromLink(self, link): + page = MetadataParser(self.link) + self.image = page.get_metadata_link('image') + def __str__(self): return str({ 'title': self.title, 'time': self.time, 'link': self.link, - 'status': self.status + 'status': self.status, + 'image': self.image }) def parseRSS(entry): @@ -39,4 +45,6 @@ def parseRSS(entry): if 'ical_location' in entry: ev.setLocation(entry['ical_location']) + ev.setImageFromLink(ev.link) + return ev diff --git a/requirements.txt b/requirements.txt index 614b2ca..eef5de4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,4 @@ sgqlc==v14.1 feedparser==6.0.8 +metadata-parser==0.10.5 +lxml==4.6.3