Files
mmd/__pycache__/rss_feeds.cpython-314.pyc

77 lines
12 KiB
Plaintext
Raw Normal View History

2026-05-26 22:21:27 +02:00
+
y<>j6<00> <00><>a<00>R7t&0tRt^RIt^RIt^RIt^RIHuHt^RI H
t
^RI H t H t ^RI Ht^RIt^RIHtHtRRRR R
R ^/R RR R RR ^/RRRR RR ^/RRRR RR ^//t]^kR8tRRRR/tRRltRRltRRltRR ltR!R"ltR9R#R$lltR%R&ltR'R(ltR)R*ltR+R,ltR-R.lt R:R/R0llt!]"R18Xd8]!4t]#!R24]!!]R3R47t$]#!R5]$ R624]PK4R#R#);u1
rss_feeds.py — Danske finansielle RSS feeds til MoneyMaker
Feeds:
Børsen https://borsen.dk/rss
Finans.dk top https://feeds.finans.dk/topnyheder
Politiken øko https://politiken.dk/rss/oekonomi.rss
Artikler gemmes i samme `articles` tabel som Ground News.
`source_count` sættes til feedets kredibilitets-vægt (ikke antal medier,
men et indikativt tal der giver coverage_spread > 0 i pipeline).
Full text (title + description + content:encoded) gemmes i `page_cache`
med url-nøgle `rss:{slug}` så analyze.py kan hente det i Phase 3.
N)<01>parsedate_to_datetime)<02>datetime<6D>timezone)<01>Path)<02>get_conn<6E>DBConn<6E>borsen<65>urlzhttps://borsen.dk/rss<73>labeluBørsen<65>weightz
finans-topz"https://feeds.finans.dk/topnyhederzFinans.dk (top)zfinans-senestezhttps://feeds.finans.dk/senestezFinans.dk (seneste)zpolitiken-oekonomiz%https://politiken.dk/rss/oekonomi.rssuPolitiken økonomi<6D>contentz(http://purl.org/rss/1.0/modules/content/<2F>dcz http://purl.org/dc/elements/1.1/c<00>$<00>V^8<>dQhR\/#)<02><00>return<72>r)<01>formats"<22>,/home/hjess/Projects/MoneyMaker/rss_feeds.py<70> __annotate__rIs<00><00><16><16><06><16>c<04><00>\4#)z4Return a DBConn wrapper. Schema is managed by db.py.)r<00>rr<00>get_dbrIs
<00><00> <13>:<3A>rc<00>(<00>V^8<>dQhR\RR/#)r<00>dbrNr)rs"rrrNs<00><00> <09> <09><06> <09>4<EFBFBD> rc<04><00>R#)z4No-op: schema is now managed by db.py init_schema().Nr)rs&r<00>_ensure_rss_cache_tablerNs<00><00>rc<00><<00>V^8<>dQhR\R\R\/#)rr<00>feed_idr)r<00>str<74>bool)rs"rrrSs&<00><00>G<01>G<01>6<EFBFBD>G<01>C<EFBFBD>G<01>D<EFBFBD>Grc<00><><00>VPRV34P4p\T;'d+\P!4VR,,
\84#)z7SELECT fetched_at FROM rss_feed_cache WHERE feed_id = ?<3F>
fetched_at)<05>execute<74>fetchoner <00>time<6D> CACHE_TTL)rr<00>rows&& r<00>
_is_cachedr(SsK<00><00>
<0C>*<2A>*<2A>A<>G<EFBFBD>:<3A> <06><0E>h<EFBFBD>j<EFBFBD><08> <10><03>E<>E<><14><19><19><1B>s<EFBFBD><<3C>'8<>8<>I<EFBFBD>E<> F<>Frc<00>4<00>V^8<>dQhR\R\RR/#)rrrrN)rr)rs"rrrZs!<00><00><10><10>V<EFBFBD><10>c<EFBFBD><10>d<EFBFBD>rc
<00><><00>VPRRRR.V\\P!4434VP4R#)<04>rss_feed_cacherr"N)<04>upsert<72>intr%<00>commit)rrs&&r<00> _mark_cachedr/Zs9<00><00><06>I<EFBFBD>I<EFBFBD><18>)<29> <12>L<EFBFBD>!<21> <10>#<23>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>"<22>#<23><06>
<07>I<EFBFBD>I<EFBFBD>Krc<00><<00>V^8<>dQhR\R\R\/#)r<00>prefix<69>tagr<00>r)rs"rrrcs!<00><00>$<24>$<24><03>$<24>#<23>$<24>#<23>$rc<00>(<00>R\V, RV 2#)<02>{<7B>})<01>NS)r1r2s&&r<00>_nsr8cs<00><00> <0F><02>6<EFBFBD>
<EFBFBD>|<7C>2<EFBFBD>c<EFBFBD>U<EFBFBD> #<23>#rc<00>j<00>V^8<>dQhR\PR\R\R,R\/#)r<00>itemr2<00> ns_prefixNr)<03>ET<45>Elementr)rs"rrrgs0<00><00>=<3D>=<3D><02>
<EFBFBD>
<EFBFBD>=<3D><13>=<3D><13>t<EFBFBD><1A>=<3D>s<EFBFBD>=rc<00><><00>TPV'd \W!4MT4pVe%VP;'gRP4#R#)N<>)<04>findr8<00>text<78>strip)r:r2r;<00>els&&& r<00>_textrDgs;<00><00> <0A><19><19>)<29>3<EFBFBD>y<EFBFBD>&<26><13> =<3D>B<EFBFBD>&(<28>n<EFBFBD>B<EFBFBD>G<EFBFBD>G<EFBFBD>M<EFBFBD>M<EFBFBD>r<EFBFBD> <20> <20> "<22><<3C>"<22><rc<00>0<00>V^8<>dQhR\R\/#<00>r<00>srr3)rs"rrrls<00><00>*<2A>*<2A>3<EFBFBD>*<2A>3<EFBFBD>*rc<00><><00>\P!RRV4p\P!RRV4p\P!RRV4P4#)z<[^>]+><3E> z&[a-z]+;z\s+)<03>re<72>subrB<00>rGs&r<00> _strip_htmlrMlsB<00><00>
<EFBFBD><06><06>z<EFBFBD>3<EFBFBD><01>"<22>A<EFBFBD>
<EFBFBD><06><06>{<7B>C<EFBFBD><11>#<23>A<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>&<26>#<23>q<EFBFBD> !<21> '<27> '<27> )<29>)rc<00><<00>V^8<>dQhR\R\R\/#)rrr rr3)rs"rrrrs&<00><00>S<01>S<01><03>S<01>#<23>S<01>#<23>Src<04><><00>VPR4^,PR4PR4R
,p\P!RRV4p\P!RRV4p\P!RRVP 44R,pVP R4pV'dV RV 2#V R\ \V44R , 2#) z*Lav et unikt slug fra feed-navn + URL-sti.<2E>?<3F>/z^ECE\d+-r?z\.rss$|\.html$z [^a-z0-9\-]<5D>-:N<>7Ni<4E><69><00><><EFBFBD><EFBFBD><EFBFBD>)<08>split<69>rstriprJrK<00>lowerrB<00>abs<62>hash)rr <00>paths&& r<00>
_make_slugr[rs<><00><00> <0E>9<EFBFBD>9<EFBFBD>S<EFBFBD>><3E>!<21> <1C> #<23> #<23>C<EFBFBD> (<28> .<2E> .<2E>s<EFBFBD> 3<>B<EFBFBD> 7<>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>+<2B>r<EFBFBD>4<EFBFBD> (<28>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>#<23>R<EFBFBD><14> .<2E>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>.<2E>#<23>t<EFBFBD>z<EFBFBD>z<EFBFBD>|<7C> 4<>S<EFBFBD> 9<>D<EFBFBD> <0F>:<3A>:<3A>c<EFBFBD>?<3F>D<EFBFBD>"&<26>g<EFBFBD>Y<EFBFBD>a<EFBFBD><04>v<EFBFBD> <1E>R<>w<EFBFBD>i<EFBFBD>q<EFBFBD><13>T<EFBFBD>#<23>Y<EFBFBD><1E>&<26>9P<39>8Q<38>,R<>Rrc<00>0<00>V^8<>dQhR\R\/#rFr3)rs"rrr|s<00><00>[<01>[<01>3<EFBFBD>[<01>3<EFBFBD>[rc<00>l<00>V'g4\P!\P4P R4#\ V4P R4# \ dR\T4^
8<EFBFBD>d TR,u#\P!\P4P R4u#i;i)z%Y-%m-%d:N<>
N)r<00>nowr<00>utc<74>strftimer<00> Exception<6F>lenrLs&r<00> _parse_daterd|s<><00><00> <0C><17>|<7C>|<7C>H<EFBFBD>L<EFBFBD>L<EFBFBD>)<29>2<>2<>:<3A>><3E>><3E>[<01>$<24>Q<EFBFBD>'<27>0<>0<><1A><<3C><<3C><> <14>[<01><1C>Q<EFBFBD><16>2<EFBFBD><1C>q<EFBFBD><13>v<EFBFBD>Z<>8<EFBFBD><<3C><<3C><08> <0C> <0C>+E<>+N<>+N<>z<EFBFBD>+Z<>Z<>[<01>s<00>A<00>$B3<03>=3B3<03>2B3c <00>^<00>V^8<>dQhR\R\R\R\\,/#)rr<00>xml_textr r)rr-<00>list<73>dict)rs"rrr<00>s,<00><00><14><14><13><14><03><14>S<EFBFBD><14>T<EFBFBD>$<24>Z<EFBFBD>rc<00><><00>\P!V4p.pVPR4EF.p\VR4;'g \VR4pV'gK.\ \VR44p\ \VR44R,p\ \VRR44R,p \VR 4;'g\VR
R 4p
\ W4p T R T ;'gT 2P 4p VPR V RVRVRV R\V
4RVRRV 2R\\P!44R\\P!44/ 4EK1 V#)z.//item<65>link<6E>guid<69>title<6C> description:NiXN<>encodedr :Ni<4E> N<>pubDate<74>dater z. <20>slug<75> full_text<78>
start_date<EFBFBD> source_count<6E>
categories<EFBFBD>rss:<3A>
first_seen<EFBFBD> last_seen) r<<00>
fromstring<EFBFBD>findallrDrMr[rB<00>appendrdr-r%) rrfr <00>root<6F>articlesr:rjrl<00>descrn<00>pubrqrrs &&& r<00> _parse_feedr<64><00>s8<00><00> <0A>=<3D>=<3D><18> "<22>D<EFBFBD><11>H<EFBFBD><14> <0C> <0C>Y<EFBFBD>'<27><04><14>T<EFBFBD>6<EFBFBD>"<22>9<>9<>e<EFBFBD>D<EFBFBD>&<26>&9<><04><13> <14><1D>e<EFBFBD>D<EFBFBD>'<27>2<>3<><05><1D>e<EFBFBD>D<EFBFBD>-<2D>8<>9<>$<24>?<3F><04><1D>e<EFBFBD>D<EFBFBD>)<29>Y<EFBFBD>?<3F>@<40><15>G<><07><17><04>i<EFBFBD>(<28>E<>E<>E<EFBFBD>$<24><06><04>,E<><03><1C>W<EFBFBD>+<2B><04><1D>g<EFBFBD>R<EFBFBD><07><0F><0F>4<EFBFBD>0<>1<>7<>7<>9<> <09><10><0F><0F> <12>4<EFBFBD> <13>5<EFBFBD> <19>4<EFBFBD> <17>9<EFBFBD> <18>;<3B>s<EFBFBD>+<2B> <1A>F<EFBFBD> <18>T<EFBFBD>'<27><19>+<2B> <18>3<EFBFBD>t<EFBFBD>y<EFBFBD>y<EFBFBD>{<7B>+<2B> <17>3<EFBFBD>t<EFBFBD>y<EFBFBD>y<EFBFBD>{<7B>+<2B>

<EFBFBD>
<0B>(<28>4 <14>Orc<00>R<00>V^8<>dQhR\R\\,R\/#)rrr}r)rrgrhr-)rs"rrr<00>s%<00><00> <0F> <0F><06> <0F>$<24>t<EFBFBD>*<2A> <0F><13> rc <00><00>^p\\P!44pVF<>pVPRVR,34P4pV'dVPRW4R,34M[VPRVR,VR,VR,VR,VR,VR ,VR
,VR ,34V^, pVP R R .RORVR, 2RW4R,34K<> VP 4V#)<12>z%SELECT 1 FROM articles WHERE slug = ?rqz0UPDATE articles SET last_seen = ? WHERE slug = ?z<>INSERT INTO articles
(slug, title, description, start_date,
source_count, categories, first_seen, last_seen)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)rlrmrsrtrurwrx<00>
page_cacher rv<00>rssrr)r <00> page_typer"r )r-r%r#r$r,r.)rr}<00>newr_<00>a<>existss&& r<00>_upsertr<74><00>s<><00><00>
<0B>C<EFBFBD>
<0A>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>
<1A>C<EFBFBD> <15><01><13><1A><1A> 3<>a<EFBFBD><06>i<EFBFBD>\<5C>
<EFBFBD>
<12>(<28>*<2A> <0F> <12> <0E>J<EFBFBD>J<EFBFBD>B<><14><06>i<EFBFBD> <20> <0E>
<0F>J<EFBFBD>J<EFBFBD>6<><13>6<EFBFBD><19>A<EFBFBD>g<EFBFBD>J<EFBFBD><01>-<2D>(8<>!<21>L<EFBFBD>/<2F><12>><3E>"<22>A<EFBFBD>l<EFBFBD>O<EFBFBD>Q<EFBFBD>|<7C>_<EFBFBD>a<EFBFBD> <0B>n<EFBFBD>V<01>  <0E> <10>1<EFBFBD>H<EFBFBD>C<EFBFBD> <0B> <09> <09> <18>%<25> 9<><13>A<EFBFBD>f<EFBFBD>I<EFBFBD>;<3B> <1F><15><03>{<7B>^<5E> <<3C>
<EFBFBD>-<16>8<07>I<EFBFBD>I<EFBFBD>K<EFBFBD> <0E>Jrc<00><<00>V^8<>dQhR\R\R\/#)rr<00>forcer)rr r-)rs"rrr<00>s!<00><00><15><15>f<EFBFBD><15>T<EFBFBD><15>c<EFBFBD>rc
<04>N<00>\V4^p\P4F<>wr4V'g+\W4'd\ RVR,R R24K7\
P !VR,^RRR/R 7pVP4\W5PVR
,4p\W4p\W4W', p\ R VR,R R \V4R RV R24K<> V# \d%p\ RTR,R RT 24Rp?K<>Rp?ii;i)zA
Hent alle RSS feeds og gem i DB.
Returnerer antal nye artikler.
u 💾 r
z<30z (cache)r Tz
User-Agentz/MoneyMaker/1.0 RSS reader (+https://github.com))<03>timeout<75>follow_redirects<74>headersr u 🌐 rI<00>2z artikler (+z nye)u ✗ z FEJL: N)r<00>FEEDS<44>itemsr(<00>print<6E>httpx<70>get<65>raise_for_statusr<73>rAr<>r/rcrb) rr<><00> total_newr<00>cfg<66>respr}r<><00>es && r<00> fetch_all_rssr<73><00>s<00><00>
<1C>B<EFBFBD><1F><11>I<EFBFBD><1D> <0B> <0B> <0A> <0C><07><14><1A>B<EFBFBD>0<>0<> <11>G<EFBFBD>C<EFBFBD><07>L<EFBFBD><13>-<2D>X<EFBFBD>6<> 7<> <14> :<3A><18>9<EFBFBD>9<EFBFBD><13>E<EFBFBD>
<EFBFBD>B<EFBFBD><14>%<25>'X<>Y<><0E>D<EFBFBD> <11> !<21> !<21> #<23>"<22>7<EFBFBD>I<EFBFBD>I<EFBFBD>s<EFBFBD>8<EFBFBD>}<7D>E<>H<EFBFBD><19>"<22>'<27>C<EFBFBD> <18><12> %<25> <15> <1C>I<EFBFBD> <11>G<EFBFBD>C<EFBFBD><07>L<EFBFBD><13>-<2D>Q<EFBFBD>s<EFBFBD>8<EFBFBD>}<7D>Q<EFBFBD>.?<3F>}<7D>S<EFBFBD>E<EFBFBD>QV<51>W<> X<>&<26>& <15><14><><19> :<3A> <11>G<EFBFBD>C<EFBFBD><07>L<EFBFBD><13>-<2D>W<EFBFBD>Q<EFBFBD>C<EFBFBD>8<> 9<> 9<><39> :<3A>s<00>BC5<02>5 D$<05>D<05>D$<05>__main__u[rss] Henter feeds …T)r<>u[rss] Færdig. z nye artikler.c<00>b<00>V^8<>dQh/^\9d\\\3,;R&#)rr<>)<03>__conditional_annotations__rhr)rs"rrrs*<00><00><04><04>><02><02>t<EFBFBD>C<EFBFBD><14>I<EFBFBD><EFBFBD><02>?ri)N)F)'r<><00>__doc__rJr%<00>sqlite3<65>xml.etree.ElementTree<65>etree<65> ElementTreer<<00> email.utilsrrr<00>pathlibrr<>rrrr<>r&r7rrr(r/r8rDrMr[rdr<>r<>r<><00>__name__r<5F><00>n<>closer)r<>s@r<00><module>r<>sD<00><><01><04> 
<EFBFBD> <0B><0E>"<22>"<22>-<2D>'<27><18> <0C><1F> <0A> <0A>)<29><0F>)<29><10>!<21><06>
<11> <0A>6<><0F>#<23><10>!<21><06>
<15> <0A>3<><0F>'<27><10>!<21><06>
<19> <0A>9<><0F>&<26><10>!<21><06>!<02><05><02>: <14> <09><0E>9<><08>1<><02><02><16>
 <09>
G<01><10>$<24>=<3D>
*<2A> S<01>[<01><14>B <0F>N<15>< <0C>z<EFBFBD><19> <0F><18>B<EFBFBD> <09>
"<22>#<23><15>b<EFBFBD><04>%<25>A<EFBFBD> <09>O<EFBFBD>A<EFBFBD>3<EFBFBD>n<EFBFBD>
-<2D>.<2E><06>H<EFBFBD>H<EFBFBD>J<EFBFBD> r