From 7a9b45c77f0f3cbedd51f1e7457f3c080a9f6fc3 Mon Sep 17 00:00:00 2001 From: anextsar Date: Sat, 13 Jun 2026 21:15:51 +0530 Subject: [PATCH] Add files via upload V2 --- .../report_builder.cpython-312.pyc | Bin 0 -> 31798 bytes pdf/report_builder.py | 644 ++++++++++++++++++ reports/Artificial_Intellgence_Report.pdf | Bin 0 -> 18947 bytes reports/Tata_Motors_Report.pdf | Bin 0 -> 27046 bytes reports/tata_moters_Report.pdf | Bin 0 -> 17179 bytes .../Artificial_intelligence_Report.pdf | Bin 0 -> 38904 bytes .../__pycache__/news_source.cpython-312.pyc | Bin 0 -> 13455 bytes .../wikipedia_source.cpython-312.pyc | Bin 0 -> 2683 bytes sources/news_source.py | 306 +++++++++ sources/wikipedia_source.py | 56 ++ 10 files changed, 1006 insertions(+) create mode 100644 pdf/__pycache__/report_builder.cpython-312.pyc create mode 100644 pdf/report_builder.py create mode 100644 reports/Artificial_Intellgence_Report.pdf create mode 100644 reports/Tata_Motors_Report.pdf create mode 100644 reports/tata_moters_Report.pdf create mode 100644 reports_test/Artificial_intelligence_Report.pdf create mode 100644 sources/__pycache__/news_source.cpython-312.pyc create mode 100644 sources/__pycache__/wikipedia_source.cpython-312.pyc create mode 100644 sources/news_source.py create mode 100644 sources/wikipedia_source.py diff --git a/pdf/__pycache__/report_builder.cpython-312.pyc b/pdf/__pycache__/report_builder.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75abe9b629c72682ed04cc47ef670b8b8da60e28 GIT binary patch literal 31798 zcmcJ233Oc7dEP8<_5m;eX0Q_EkOWAA3%KtKNCE^2k^(6LTm&xA0B-;c2w>nh11_V1 z4cSf&y2>HgC?)97@vu>kz=(;VMvbY)ZK2ey>7+TG(Hn}R3EarBTZgC1p-AO4Qcsuf zzi$OJ5N$PmB<|dI_x0cJeSe;p=QQB?#_z1`TYko1_&L2Ok4g4C>o*zDSb695A(;jN~`>n+MG8X6EPmxdBVNh50T0)&X0)jrpzp_5nw`gZXX!&H-1uYrx&^ z9>{CYV`29G{DFe@0_J!0dj<;I3kQnYi`cufzj(mg?qz;gzi*(Vy=0)Yy>y_gy=ehd`+|Y0_Nsw}?F$DMwJ$OndJVk$_l)iS9s{5EPmJx0`TTDh+L!PJ zaF_BPxYc|i+#0?J?lOJ_U;IsD`*Plkw-tOX@55UyzmhM(?@GQDp{w{ZxU2b9d^y6_ z@D+Hg<5%;Qcw5Uaz}q^$3hsJ-A>0l8BDfoQKip0HVz`_6C2+U!OW|(itKn|rYv69@ zm%-h^ui=-Yq@7odwRMka=v!)ySzAMRcrY3i;I;FCXfPTY2*Pg-M!Et+-s(YCLn;Xq5dsx@Wvj|YT6j}RE@ zZH->-4`z#dg3;E%z)*jXy|?xTgHfs=G}zT!>&!Y2ooMP0Uk-F4sryJUIMfzKhTfo% zbsr5yqH3I--kPJqfvn?rpeMLr2nH^aSFS5t*czfb8pB;}L3q%othIG0(1n65ZLD-B z`(cgPvmE1)<2Yi0^JyP{PYAugZLQ;5B6j& zoxu?ObcKie`K%?(x^ICSLP~l;KKw-RGd##s_RCV><=zllfwvGw&vKb%w{`}*sr^=d zSfEmEtSWTH)*0*y45JWuqL+ig!K^LXD};x8dTVW;6&|<}>>7@SE(QIq!vg~W;p%7Q zCs1QR=<4;ic7=z6{(XbI{{>7gpekgu;Va=ZRo9x;fZ|1qi61K34e5 z_$2C-ZU^bcbey845G!5|-@p7{Nr9qZb0?qnn=M9%TOAtBILcX1fg zaIP_Yd9Xhm;3Mbel-D(vVS4)tS&)D2zD=66H_-NBA-tc^h| zT;WC3L#>SLgfnWG$@g6EzSf=et(aUoIsE-s?!NNYh?u{7^k636cYWa6z(k{%zZh?> zqVbL6`^R>@?^>O#T%F`rKSOpy?pbO_3?RC(Pn{=9D?L$p>!Ua7GOo zSN`>F*S5XhFk$(QD^VnRs~>q+ro1af?`qMtCdsW4P9R;Eev#P_z?R}3c=StA>sVA> zdU1o&HRU&Md`m8^)o|C?Qfn5xC`X_itZ`Tv9JQ3z3BabjDx{t`JBAcECtN@V8s+7GI|~vUMBlPWG`%j#)k#g)FCcZ~ z|2?wlo34%W2o_bu)MIEhXtUABA^Dt#HzJQb546P_4cARw$k$~$zZPJ@6s5Y@6F2oa z6uuQNOsMVY*Y?aA>UY`r&JbfAeVKrIf2V$u)oazNi};}+d6v?>cZh6crrG*?1(+}x+mGJ@rY&pF?5PANh8HB#MDyFDYW z2oWJjX`CvAi2yT6SUl^JJsntbS-ZM|X!NkY=#k))Put^>4kD){m>WjAKKw-{;b5V8 z{0Xn4vG7-Y?ygahE)DSEbxl6J6iyz15qzEG}G|cCX8nl#LzCR8)=~$=D07=U>Yo zzmm55Gxp-wBNN+xYb0f_zUF$8XYeij*kiC4Wb8$c?BywY`NY!it+=%!u~n>CmA0?W zxO_>@_j&L`AesUGL3s2FHa89O9127QJ{qXuP2a@gY&6UTE)vG`5kLUJabEsibN-c$ zt4C(xUuxY({5{(M=ZL|GR>lqI3nV%xiZJQ9WCWmc$BqBkc++S!yjI8=t{VQpeAy_R zMLbAyM{C=$?1p$yRfjp6S`4auU0I|n8jC)<8l{{EW%uW!0@;M0g5DZZXpY8$b^@6TGm6a)onGk(E`!EXY{~~t0+aS5sMl`S3{C(_yT0vi-Po1u0f$bYT29zI9|qEgjcScy8xqr zS+HNuVcJJbBj&gXn7{!{U>-56xPbXD8>DG4v0h|d#C>3J2f!d;Y^478hXz7XVHmXv zhu}mwINC1E>xhPjIxYsUvSAXwipXzLs&#NM82;6hZK8j}BmbV1f6x8lwEsZb)s*rd zxN&;CZDRem8s#*JLo;I5fo+wd zj+-u4py4J0SUM1`5=!58X*(jSqTW6xM?jsr2T0u52Ov84QTLC$$CSzVwwpk96#GGX z;%b|KIDT869LtFHIklSN)?cO85nHrSscFpBZRE}0w8w3q-`ykjxLudhjg(yOlrcgW zl)6|cS2w;krI)-#A#7qmzq8ZxR^Ar3@b(yBSqvkprj$zN`g}^s+Hc$*x5Ta8>R16{ z+~f?=QYA&4;~n>$N=dvSZmKYhICSw2-t|qxJ-3nqTf%uA>xpd%tfX^TNh41Dv&OC1 z6i&7&tRqgDKr)ZO4-zS_C6)sMZdg4cd<89;1qKOFGcdRxp5HdAfUpD=8LydgF(t(0 zDGijtVi~}qk-#Fr4lSgXyT+^;A_5@*g2>WD%UdlfY#0{&x>dHIBDD@-9nxmnEW;FFx|FeHXxz_WCy#EHcjO zF>OZHMQ$q=56e>PtswK^n-&nPr&qzhslh=+h6gI5G1 zMue+WhJ{5CebyiBLSYOy2;ZRiZ^4NWq$DgMKYRB|L|bu=?hD^RS{l7bIVR;(J_ zbB=BQ##bj6zHeKeDJV4mt4I4{^ozZ^WB|)vRf=^ z7K;v#9?9etj5f_wRwrKipmOcCf-%e372+?PH=N1JjZ;^qUQr)kVG<0%$t z{lgJG`^PL9d*18CBCQ@cV&UGDeJ=t%zT4*84GGKd9G*0aWh+yjm2%4Q7bnaU!32M+ zKUKC;EL@ecucDaz>v`Am#)lDeCRtMV(7qOg;DU9ZcnqGB@$LklE?6~rZ1O^~VAtrO znN{njR;2c}JzRA%?K+iOb@JB2iNc9}6IZ@{D7ot7`>s<-?i8@&sR;2fKU$F2xW+nb zQPOs#zh@*ophcMrpBm^lSA;|a<(dB>NwL8)H=Ak=>CSMY(x8m*o zh9tLJqKuGOeP}VUF4h6s>e0V~d`GYou^Uaa8#`ob$N+J^8YUxWgmG#ZmB^kbkr?bz z;|Qv=CrWj*r!QaeX}>^!a&2l(wJg>m>zo$ZkWLEIT4Yzl)D{78D(O_Bgm8{9S_jTq&ikvju0S_-QmtC+JSeSjPV0))Fs*gP zYM9!(C@`<|sB!9S@?JGeZ6&q>RW#>`Rw@C!PsziV@TI(4TP@ES{W7J0_sZWQ?iG&` z!ZzR+*IJ>~`kZ3)9)|TZ+ zhmf^GOay6T*4_<`PYZ=GUu!4^g$DE))atAw&>!jABm4;Okn_*Ud6%3&Cg%s_+=r8OQV9(t>=Zz?Y8hB0cNDe9 z+)~e*qi8~x+~MVWAA69!)~d_G>d=a(+Mq6EYAPDW#!Uwrw`I+3;jS;r#p=y#=nV{^ zMJ>Yvok8KVe02obBtIso{F!a(mi=2dY+LvFZq9B3>t=0%K$9yCgBDNo&*B9FV6+mh zuyJK0m32i()wy5N{5jdnK2kIaRDaeS;CX>2RG`HI($y;I7-o|SOm);D#Rz|ngbDmb z{s0gjbYPxe%v&!jUi7VWjFSqo=^|KXQNyWT6?0&n8 zMqiLvb`((JNWK$!e3Cpe}I#9vkluJEAFMe z+`$Y5=7{(#9l~&bP!N#`7BGg$a(J*gUA|1dH&awPlkdGAz80Pciuu(UFNSX6CoZeo z`ow@K|NO8JL}9}Mebl_%iZ(o?U5~26N|Gc+aH62V`FI&kt_L>2_&bL0VkmizNSj~3 z1eylk@@wVQ2xCaWcsr9?$^Fn;e$`Oxk_89X(6E?Y2J3#|Pw^_e0q2+9?D^02fai_t z8#g!Ze@xV`K%9?|gage>i2Nnw5R1Z;wQRO(InwKfg{xUBL;*k)Fz6tREBqOf&6#97 z>17C|2!DylLYn6uc)+i5j&B`(_2}y*6UK>6Z&csfDHbkIb1RhKiizIDr9^LX!P=>k z`vs}>hs46>GTT$A4m*=3YDVdSAkuxHQ?9TE1N@+3_%M=L1{HeLPdTBvV?Rsa*Dn!{Ts0G23XT z+bq^kpV|xsYd?MJG~~T#j1buQ4ck5!_nRD?#G-v3`z&=Vb&<_(H-iG2g$>AHV^n4D zXuo6s&wB4M-7_omGy;`vE-Mb*-sgA=|2!GHD$VZZuv4F(-l6PZq<8Wz-p%Ln`N&tm zd!8fBFI00{h-u&pG&ZY`R{WgjIi-1((t1p2iI1_TWj$^sRQUyjgaJTpc}ve<{Cj%- zu3q*O?gdrm0Ma;3m;|;_`}Z{*Ie6mO$(F{uk{Fr^Nbi~+{~tWe4?4AJW7DRlEwIcx zaHg%{*wJGrgx^E60c-3{$6DH2_PuaG_$2~_zai(}uqffb;72KPjDqCiA8To(?5)l1 zQg)d)uBC*{rCf2^(T z*bDQ-+XP~+7_cS*YLrvw6PxZ;-`P3Ey%T-gm0Yqb?cP0lfBvoTXxI#H4+ zo80tH$qyF2y=b~zTz@3#IhrY440yloo$ep>zuo_%rXL@B?^v?!yx4dlxw#|hc{$_R zl<{n)?4B)8%JcH_pP37Y&MO3+S8Z??jvkdT0l_roalpf1#WuiRJt37#6HaK6o?K8t zlYx@?hENRHLBl=g;Z+%^0Ej;b{g}23H60!)eW61#^tt9_$E(J?^Pn1{s@QN|>Lphh zgbCO~S~MPT>7GNuJ-U6JyZ&M&FVQ``6O<3fyXK`{a@9_}AbZdQ_m}K}+6q1o_2+-- z`U}2f{n`k6_(FoVxkgaaZbCE&7^-ij76+Z=oVXs77R#5+jn(4f#<_8`a+c1G)pABv z?WktlGdK0DvdZShYGv`|bK`nUJ=_R{%sJODK_~XaZ7@ZWvF~$Noqo+!e91Y})=VW@ zyg)x2&#j*lvqymeS`N_JRV^`l4ezhn@2`0&YaSN*C4C)ruID?q==s}v*<;+xFq%Zd z5sCeo$FEu?pI{cRLW1%+AN}6YZs(8dW5PZ^XszL{=rD9;tNju{UegJ4Wtbih3E@7d z$o!J6te?!Y{S+lzGIvQ<%&QUK1)|W;>x`IJ`vbDwGWmEUQS6oLgekN@W)413TK<^0 zgzXLcHtuT@egpB338%zd$5AyTXuSW}pztp!B=5KoB5P}Z8);r+Zb=3e@xv0BkGZ5S z`iWePt=Kmlg+LDqK2$CnW_JpqV7DLU-fGui-z|^b$MvyzOE?OM zL#A5(q2W%*%KESR1D67!e!^=0%fU{08=z0CHe=&CXwk`^I-Tg5NuTFrjrK3*AXW0Rf+01SKL`Kx%rK?H}*|^ z<%bQ^+@Cb3iVut){pgDsGd+iu=2{iTt72k!q9<9iIk{lVee3r?Kf&n#v_+ZLd0x5484A_j3zJ3g@*oZj&lKqM@?vqyAnc<1o_ z_=8i)w)US~5I3Dm+Rx88ipP&7PE9u5xga_=z0)`CdtiNV=_mQ(meWc58H#O5G)-=~ z(;_-HzSI6A^Yl@1?~BRSmy+!-r&%kjF#DfNuN(wtCxO&Gi6H6oKP5L%zZSj7MPpyKKE>&ryDf>NaH^kg(0^U z7D^j*=3_Z^#Zi@R;GJ<3=nR)e_h@tyL2g#nC&^)gtYiGwl zUmlMh~RJS*!E|D zU>u<+{m{PSICa!21gH?AM}J26wS^o>JP`yN$nxt0%GhRd)~xbD8@ zPQ!k^c=F`r!Kp1jTsB?$Cu@`24=0x&q3!h2PtJ?Jvk&d(o|p}lTNO~DUzW0-4b3qa zNI=h)r4z26#3pte$6GAQ5+YVoC74h2j3zQ92O+K_yO|l;JWFT^XBb@ayb_>0mq=kV8KmVdiFf59hS1-l`TEPN#1Zwl z$M^+lVGOABebCrL!Yl|xm{FP+BLFkIoFkg2)c{dc2@^%xiS>w^QG!D*0fZM!;8gM} zu8Jp+r-0>gP#%RG8gc535}kbhy#l3WBQD;9K2&N3g7frT*Bhl&j6flPK#?x5YQ%@| z;_q7GF2Topd0);^b}8i`ZOL~T+r@)87V>rFsaEkwQ}$gG8*^^Nt&zELH&&_!!hpg@ zV5yL6ZN>AH`e0z_Ba>uVm}ggoc@CHXmdnD~y%;{>yX2gN^Y{c-Ka9Nk$WI$V_*ZaZ zoAeY9tj9pVM0DhhMDh4TgN$g2f>`n6e=JbvZ;tw5a@!e#3|}L7{6usKAy79G;m2r0 zB0i87PqNr%tAJ9>r3O%+4#}xUiL?NM&I%c0wat2rhh6f|e=8MTV(1j6dxTmc* zs8DL4-#KWMUh&A+MAcEG= zxxLV!A7={D2Z$)iY)tDWPG!q{G!v_$sEaFDt|hb5_zuTt40!A@PGk zg-X8?En315R8Tp9saT5&el)QMf027|K$mjvv6JKblBFvro6_9IpVh7zufDnB#)^sU z>7tsc4Wmasv=z;i*G;}M-IXps{9wa_ePVgbSaZf*c>U^B7&hUjaLAN_k=&&l`5>(F@> z>pr%a9P6K%xf1JW%O_5Qr)uKD)cSP6=FvkRIV;|6yuEQE`n@Z+u1q?o_KSN09v4oPeBj+SW|tBF_?d_H zg&0fU_D`Ss46X~tPqWT-5fUK(>E`kSJDvZgq^QZ@?9xloR1{BAvm7X1)od_*8bP%= zkA}*jPvhp(r0G(T%!C=8DIi%F2f4!RI7l+o*7Ekbv07Z*2y|@B1=4v3uiAwJH8@em zEScA=8r<{Opd&j}NgxnT9+RTY>d&ka^S_`(jZ!YanH$sRt@2U6Cs+B9(O7`Ma?OT@ z?lI2F2x~|!ZWi{2=aYc zP65(H>5vUTc_0!A4uJcY#RC0w6kI0=@CTxbbte&}WDgaiQ+33OZAeYn{IdWd;K{ht7~L zVYt-{b*TrS(KZAQMI(Nc(;bW=DPa*A>!82@&*T~^FqiNb6Mqm6WCVeVw(6MLFy@j( zG5&qXF3D;N8zfvw{f884xF7aS>Iew`3&R?#XbBS@?dm0LOE?gfLllK$-gUw>5@b2* zdTa&6CJayO&@XGvobjoPx%Wv1yneFanq_Rvp}39sd)5d?J?j856Fc0F>7D!Fq=Os^ zb*+zAj)7Hx<}%TFhr4EhjDs1Q*23(Gq4|kYNH-k)u`B6>!$O9(B;=gqWW)DRS%gd= zrGpJ64R_im+9un+f9CF)sf!PB2J9<$+CF_oMhIUo@f&a1{KnW8-LMRT;=r&elPJv} ziK^H<>FJQVSe`sp%|uZ|gh`YMW|Fk$I?~|l^vVc=8{}i6B}N+9B+@{o3Iy64j22+R zBLR1Q7$U?K$+%lW+Adx1g%wEh4=C9QI66$dVG5Xf=WKCB4@aV#9Vz!hO+9Vv=VAskTmWQ&-Z?|H54|{)#Mbac=~^{&3%cagGk^PWY1kU1`tmIP-6t9w7H<9hRc9QP4nT=t0*BSma{0^NjNr7`P54GK<}+$ zp14uAU%^tLhuOoJcw27hKTpXj&LMl2=SuiD^ws1QG+E{e{jk$hX{t(v*o_HT{;yK zw_)|D%sp`Zg;^)`EU2-h0(6dUB#COk@r9f7Z{XC478Pm-upU+G?{E|t5J124oP&G`x zs3{~Ef62JY9*SiM!>L0Ue@3B|)U*n!)x~PF1N({mFsLsqQPH z?`ql}!zrkbY_4xzdG*S;<(psAWR}U={Xg3Bp!&h^PgaQyr;__mCzqdr^gbB~rP}*M z-^H}OUn%tz&Ot@r;BUPm`slFyN5!Q#x82wVp{eOn@v1SKlB_*pd((Bt1wrUJ(Z7GX z>A{Xv<0;X1It_&Zc+<;t&&>TT(;LLKP014{AC;e)%b@n9)`D-{|Ipn4d1=LI;!sP= z$6OiTf}3Y=oJ~|rp7_AGZtOs&eBt-XZGfQenJCk0u^ZsFR)xig* z2ZhO1N5myZ#|tu^%153hDbJEb@XgSj(3DMFwk=t+{eIE?WAE>J=|L>Hvpu==>_gAF zCk{i&da#=1HHouRMN^9t9aG&OlrveXeJjWI;pHWQ;g^^^QHP0>&ncD9&{*8odaDSw{Si;TG4vL zm(3kPEx&efoG;HQmsXAG_=lRCXlw#UnHMIDwa|cX5x>Itg759-pTd3zc+2eeRNU zGqh;_Ha;&e^f?Qu8}pC!JS9}J&ccD=re8ZpmD@;b-1ORzPD@~eZeVc>GqDgFP(*A4 z$dkDO@rWW~mRRxJK!G(-db;X&1yBI}ZQ)ecy?WI4!1E=mV>$vzPbHd!kS-&X7El0Sup>!?oow??MjyRg}co~~sirbFf_iP90fph6AR)61q*FIGyuGn$E z@n0W$_t5lNao3Bf-9(@Vtl2gY181q&wH#DXPb+)PnTf}g5+U`!Vs z9<#yfBd>I#W}-A>9Vrl}wy@=vfAFMAhz( z@(Qn?xprnel+N?(N}xg5k=lh(IF^QCzS5IK<7D}rV^gQ@A5LvPD3%{eyPH3fiF6{T zBX6|biiy6JAJ|uYTyH2__vv5z&N9`(d%JCi*INJ7!oi)TIv^ne(J0SegLoqceW_C& z@aCL2L(-wE)D6m#A2Lx<@D7Cb7FCCyE3H*ymt`HgMW;h2iZfR(n^uFWL$}0Gzk;7e zthrmw+aauno_($X3RrN^Wf0ylHW&JePmDO@&OX&dMj1`?N%o?rUZ(kn8bldi8L#7ve=b%(uCn?vUSF6yovvSB zY}T7YoS@5FF#ni9VB&@q!uq&7S36;$K$aYZI%LNB%=H445kxiN@V-Q&(e@T_dy64f zFAEGNO)s`4q%x%ovab4Z0lIAQ)72jc4JdZnxKWX8m%0Lca3IvR+TTfr+c>1W z+K)QB`a@*uuCv?5SuDC{P+Ez#=GZ_h?mO41NFxw#M*NKK_6JmxbeYLf);mQ|RVP5TQDWQ?_lrqW%}$EWVV5Lk zNiv{S;HYpE75q2+MFwUwNOe@#mdPfGp(?CTb9*zzJ{%sfxiWU|BYS1aUYW^1^uYJP_8^`<*O7dgfAn&1 z>gC>KD3Tn$EWUh2Ja;vDHU@L0SBxjfYALVP^oiNzaDHqx*xfVU(iA~Lv9wY2HjX)T zW$u)YBi!GaZ2Bs)?KL%1?yngS)6Zd3D=Vu_E6bzL3kJ0L-R9}u2SW1ri_`t$uGZwv zHsm{LJjC)fOZmW5SqdL2&(2RaRa-uN`l68;RXz0>mK`%n%#pqP&@Shn)|WOL?X#F8 zG9_Tl(f`Kc{9@*aX#$C`eUAAwu4m54%FGhIo0-rHX2SNY2NwoDSDhVcjr03SV9`JOrdB9sH6_ zl)m4DScPf;Zk5cUaLNiF6$wV7Aar1*3rpG|vadmoRqmy7I8L$T?ZnqWF4r;Z zY+QoGgo%U|@xhrZIF-S(dnYAZ9fmOpPu4o-MTc1rdLn;1M3N3lM!9+P*%zo+ncz0U zq=M|~P8F-^RjXPN0)UKRArYMU@Telc@p$4?np^!*X?c?K0)orNHsxv0(u}?Ak$q9h zz9{YAIMsN+{Ow~8HYWp}X@6JR&J(cTy7T`2`!BwIMJzk{_La%#^rjzgdvDu=gAW_p zCcNJ(yH%E0{;+)I)RnQkWZB6NU1b^ff=BM9IL(zQIxx-uIP_j9dHlTCbRl`5BiZqC z(h~r%&CCB7lDGwG)tUU-$(qShfa&$e7?eIPL1~y&l`JFNzz(Ls+Qy-vLEoN-_IkkO zl4UAfmXA<gR&Cj0bhm7)BU407{I8g_8+RTsnUg5*hk$fB8n+<8n{ zb^1=af*B^GJ7G*iIp#dti4|dGoXaUaLhhV7aY=;2$pSFhpp{_&85%D2lmg@nCV;4` z0JJ!q~pIS8aL?CgfJR#)RZvkiyvE z7BWegE$%?SRj>~E(JRnxaZJ;kLn5c4F=#mF=r%PJ1_P*^hxj!a61&_*kpNcEC~ML* ztqvUBo}(jG>HrdxE_Z>pldjIVSN4{?%9IpF?OX`t4mb_+n1otF6FJQA(ybYrtno`4 z949+c%d9YkH3YC7jOr&oL)e6Od_79BCloeQyobJorPtj^+J>!&V=9}N$-g4T)%w@? zV@tvG6X+6%wUPk1tYlIVf^6k7jV5M|>$O{Ggr6b=*UG6tP-mk^8Vh#m49++(UO+QS zWQHa`qj<8$WIbfPU`=OZ5SibML_;XTDfDJ1!MauOd=A#R^G6S8pw9QYVpIZHDBTWw zda7TnZb&X|oZdejeQ@BtSEdJ&zP7aeIa_QwJ?aq3>qdjk1Xqi6dg+ zx-o0UTXyr%jYAV>lPhdaX`xYWY^NWZT2M?bE>&bQq--x@&d*)=W3*{I&b2 zbmy;eQR6!Itow6Rs`C#qsPmm8RfNG11tOL7sGkJLy}4AOZ6DPz=h5!Z&^8D*scTL$ zylQu700{H~Rdw`S>^yzN^;?(l#j2 z>ZGg9amkJlz8HitJ#NTjVEo@vj2kgWA(&z}ATdRGP`Z}~2d|=ZF&9hG6zcD1IkQe) z2wX-{5U6Df$bTZ#(@SMj0My4l_?{r>Wn8)@)sK6GtX+Y@OMyt%%!j*#zo1I3_{JV` z%{ejb0#Vt6FQ*Cg*|Z?wXC8o_2>;3w5UVdh zHa0!5CSN?6K65Vh;^yC6G~PNpSu<7rL+{(GQY&}gkN${%_mwnvgszyx z6++`X6UH>RM6LF=^?L=k3ML(5*#;aKW5K=@=Nsp5x81mibN`L+Y`S|SwR9^EE29t= zUya1qT@w*(aVz`kg-s(jbmWP;kE7H!_5hmD zAuaZ>yUpglTfR6x4!dpM`d!#<-?P6ZL+BB^W+bHSvk?dS?bNBKoN?Hb;}%1Qa+M@{ zrb4E;6X7z3K)4EN5H9875O0-Qjd&G;AfC#kSb3BXOKdWGSgb>X3{e#>uyUy_GP#9Z zRk~cCZz+ALf<0=B^ffNl#Y%lt%f+$krAn;!8+S&ll{d|Y+krGVY3p0Aq|knq(ZyYA z&XzWOt;hx&5jx$UwFj@@>}W^$V$9Vc0i`;89Z|j?=9dcW`kQ*;f1|XR_K8a=t^c6% zO-0;zY$qT<0{pBC66D_K3*dP1(Lr`?pzL?Ro>}&~JHt`j&mz4^cFI}V)E zb;8Vonav85%Q9A$(ReV8p-(|F@I{}{h=g&obFE9VH&V&UtP|fR9U6{yP~~*)1x=L# zh61?J)UJFy5|5hNf=#591Yck%n) z<%tucFU%B`jK{>HCHPPTSMZ1<@B}?i8$QI9<~Ga}`4c{|XnC@5#iT1)uxa#Arl=}m zPZg~gJ@N}@<&51mc0{z7%@h`cu)MwL#*s{M>Fw$pJ2OQkx4k!3;d0sAjW^C_3QNXq z$x~ZdGb=9ISkd18P^Yv?^P~cBOHdt!5%SI!&kC!fPn|>r zf{5(yX?EjuwsdwHWn)Don!r0dR=$Cnz_UPxyK`$89t`0c4-!3Oi?p2d$=|C(!?@pr z@_EQnxhZyEi1gJ;wzo*-D_#6YRFn`Q2VaafNZaovdS#lL0Qq{zVRmd}sv?~${|@~Y26~@!l#W!3tZ0v 20] + + +def _paragraphs_from_text(text, max_chars=950): + sentences = _split_sentences(text) + if not sentences and text: + return [_clean_text(text)] + + paragraphs = [] + current = [] + current_len = 0 + for sentence in sentences: + if current and current_len + len(sentence) > max_chars: + paragraphs.append(" ".join(current)) + current = [] + current_len = 0 + current.append(sentence) + current_len += len(sentence) + + if current: + paragraphs.append(" ".join(current)) + return paragraphs + + +def _word_counts(text): + words = re.findall(r"[A-Za-z][A-Za-z-]{3,}", text.lower()) + return Counter(word for word in words if word not in STOPWORDS) + + +def _top_keywords(text, limit=8): + return [word for word, _ in _word_counts(text).most_common(limit)] + + +def _extractive_summary(text, topic="", sentence_limit=5): + sentences = _split_sentences(text) + if len(sentences) <= sentence_limit: + return sentences + + keyword_counts = _word_counts(text) + topic_words = set(re.findall(r"[A-Za-z][A-Za-z-]{2,}", topic.lower())) + scored = [] + for index, sentence in enumerate(sentences): + words = re.findall(r"[A-Za-z][A-Za-z-]{3,}", sentence.lower()) + score = sum(keyword_counts.get(word, 0) for word in words) + score += sum(4 for word in words if word in topic_words) + score = score / max(len(words), 1) + score += max(0, 1.2 - index * 0.08) + scored.append((score, index, sentence)) + + selected = sorted(scored, reverse=True)[:sentence_limit] + return [sentence for _, _, sentence in sorted(selected, key=lambda item: item[1])] + + +def _article_text(item): + return item.get("full_text") or item.get("summary") or "" + + +def _build_styles(): + styles = getSampleStyleSheet() + + styles["Title"].fontName = "Times-Bold" + styles["Title"].fontSize = 30 + styles["Title"].leading = 36 + styles["Title"].alignment = TA_CENTER + styles["Title"].textColor = colors.HexColor("#111827") + + styles["Heading1"].fontName = "Times-Bold" + styles["Heading1"].fontSize = 18 + styles["Heading1"].leading = 23 + styles["Heading1"].spaceBefore = 18 + styles["Heading1"].spaceAfter = 8 + styles["Heading1"].textColor = colors.HexColor("#111827") + + styles["Heading2"].fontName = "Times-Bold" + styles["Heading2"].fontSize = 13 + styles["Heading2"].leading = 17 + styles["Heading2"].spaceBefore = 10 + styles["Heading2"].spaceAfter = 5 + styles["Heading2"].textColor = colors.HexColor("#1F2937") + + styles["BodyText"].fontName = "Times-Roman" + styles["BodyText"].fontSize = 10.5 + styles["BodyText"].leading = 15 + styles["BodyText"].alignment = TA_JUSTIFY + styles["BodyText"].spaceAfter = 6 + + styles.add( + ParagraphStyle( + name="CoverSubtitle", + parent=styles["BodyText"], + fontName="Helvetica", + fontSize=12, + leading=17, + alignment=TA_CENTER, + textColor=colors.HexColor("#374151"), + ) + ) + styles.add( + ParagraphStyle( + name="Meta", + parent=styles["BodyText"], + fontName="Helvetica", + textColor=colors.HexColor("#4B5563"), + fontSize=8.5, + leading=11, + alignment=TA_LEFT, + ) + ) + styles.add( + ParagraphStyle( + name="MetaCenter", + parent=styles["Meta"], + alignment=TA_CENTER, + ) + ) + styles.add( + ParagraphStyle( + name="Lead", + parent=styles["BodyText"], + fontName="Times-Italic", + fontSize=11.5, + leading=16, + textColor=colors.HexColor("#1F2937"), + ) + ) + styles.add( + ParagraphStyle( + name="Source", + parent=styles["BodyText"], + fontName="Helvetica", + textColor=colors.HexColor("#1D4ED8"), + fontSize=8.5, + leading=11, + alignment=TA_LEFT, + ) + ) + styles.add( + ParagraphStyle( + name="Toc", + parent=styles["BodyText"], + fontName="Helvetica", + fontSize=10.5, + leading=15, + alignment=TA_LEFT, + ) + ) + styles.add( + ParagraphStyle( + name="ChapterNumber", + parent=styles["BodyText"], + fontName="Helvetica-Bold", + fontSize=9, + leading=11, + textColor=colors.HexColor("#6B7280"), + alignment=TA_LEFT, + ) + ) + return styles + + +def _rule(width=1, color="#9CA3AF", space_before=8, space_after=12): + return HRFlowable( + width="100%", + thickness=width, + color=colors.HexColor(color), + spaceBefore=space_before, + spaceAfter=space_after, + ) + + +def _chapter(story, number, title, styles): + story.append(Spacer(1, 0.08 * inch)) + story.append(_paragraph(f"Chapter {number}", styles["ChapterNumber"])) + story.append(_paragraph(title, styles["Heading1"])) + story.append(_rule(width=0.7, color="#D1D5DB", space_before=2, space_after=10)) + + +def _bullet_list(items, styles, bullet_type="bullet"): + cleaned = [item for item in items if item] + if not cleaned: + return [] + return [ + ListFlowable( + [ListItem(_paragraph(item, styles["BodyText"])) for item in cleaned], + bulletType=bullet_type, + leftIndent=18, + bulletFontName="Helvetica", + ) + ] + + +def _source_table(rows, styles): + table = Table(rows, colWidths=[1.55 * inch, 4.45 * inch]) + table.setStyle( + TableStyle( + [ + ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#F3F4F6")), + ("TEXTCOLOR", (0, 0), (-1, 0), colors.HexColor("#111827")), + ("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"), + ("FONTNAME", (0, 1), (0, -1), "Helvetica-Bold"), + ("FONTSIZE", (0, 0), (-1, -1), 8.5), + ("VALIGN", (0, 0), (-1, -1), "TOP"), + ("GRID", (0, 0), (-1, -1), 0.25, colors.HexColor("#D1D5DB")), + ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, colors.HexColor("#F9FAFB")]), + ("LEFTPADDING", (0, 0), (-1, -1), 6), + ("RIGHTPADDING", (0, 0), (-1, -1), 6), + ("TOPPADDING", (0, 0), (-1, -1), 5), + ("BOTTOMPADDING", (0, 0), (-1, -1), 5), + ] + ) + ) + return table + + +def _add_cover(story, topic, wiki, news, styles): + generated_at = datetime.now().strftime("%d %B %Y") + source_count = (1 if wiki and wiki.get("url") else 0) + len(news) + + story.append(Spacer(1, 1.35 * inch)) + story.append(_rule(width=2.2, color="#111827", space_before=0, space_after=18)) + story.append(_paragraph(f"{topic} Research Report", styles["Title"])) + story.append(Spacer(1, 0.18 * inch)) + story.append( + _paragraph( + "A structured, source-backed project report with background context, recent developments, analysis, and references.", + styles["CoverSubtitle"], + ) + ) + story.append(Spacer(1, 0.35 * inch)) + story.append(_rule(width=0.8, color="#9CA3AF", space_before=4, space_after=24)) + + rows = [ + [_paragraph("Prepared On", styles["Meta"]), _paragraph(generated_at, styles["Meta"])], + [_paragraph("Primary Topic", styles["Meta"]), _paragraph(topic, styles["Meta"])], + [_paragraph("Sources Used", styles["Meta"]), _paragraph(str(source_count), styles["Meta"])], + [_paragraph("Report Type", styles["Meta"]), _paragraph("Automated research brief for project use", styles["Meta"])], + ] + story.append(_source_table(rows, styles)) + story.append(Spacer(1, 1.1 * inch)) + story.append( + _paragraph( + "Note: This report is generated from publicly available web sources. Review references before using it for formal submission.", + styles["MetaCenter"], + ) + ) + story.append(PageBreak()) + + +def _add_contents(story, styles): + story.append(_paragraph("Contents", styles["Heading1"])) + story.append(_rule(width=0.7, color="#D1D5DB", space_before=2, space_after=8)) + for index, chapter in enumerate(CHAPTERS, start=1): + story.append(_markup_paragraph(f"{index}. {escape(chapter)}", styles["Toc"])) + story.append(PageBreak()) + + +def _add_executive_summary(story, topic, wiki, news, source_errors, styles): + _chapter(story, 1, "Executive Summary", styles) + + lead_source = wiki.get("summary") if wiki else "" + if lead_source: + for paragraph in _paragraphs_from_text(lead_source, max_chars=850)[:3]: + story.append(_paragraph(paragraph, styles["Lead"])) + else: + story.append( + _paragraph( + f"This report reviews available public information on {topic}. It combines reference material and recent news coverage into a structured project-ready format.", + styles["Lead"], + ) + ) + + collected_text = " ".join( + [wiki.get("summary", "") if wiki else ""] + + [section.get("text", "") for section in (wiki.get("sections", []) if wiki else [])] + + [_article_text(item) for item in news] + ) + keywords = _top_keywords(collected_text, limit=6) + summary_points = [ + f"The report uses {len(wiki.get('sections', [])) if wiki else 0} background section(s) and {len(news)} recent news item(s).", + f"Important recurring terms found in the collected material include: {', '.join(keywords)}." if keywords else "", + "Detailed article text is included where publisher pages allowed extraction.", + f"{len(source_errors)} source issue(s) were recorded and listed in the method section." if source_errors else "", + ] + for flowable in _bullet_list(summary_points, styles): + story.append(flowable) + + +def _add_method(story, wiki, news, source_errors, styles): + _chapter(story, 2, "Research Scope And Method", styles) + story.append( + _paragraph( + "The report is assembled from live web sources at generation time. Wikipedia is used for baseline background, while Google News RSS is used to identify recent coverage. For each news item, the generator attempts to fetch and extract readable paragraph text from the publisher page.", + styles["BodyText"], + ) + ) + + rows = [ + [_paragraph("Source Area", styles["Meta"]), _paragraph("Collection Result", styles["Meta"])], + [ + _paragraph("Wikipedia", styles["Meta"]), + _paragraph( + wiki.get("url", "No matching page returned.") if wiki else "No matching page returned.", + styles["Source"], + ), + ], + [ + _paragraph("News", styles["Meta"]), + _paragraph(f"{len(news)} item(s) collected from Google News RSS.", styles["Meta"]), + ], + [ + _paragraph("Article Text", styles["Meta"]), + _paragraph( + f"{sum(1 for item in news if item.get('full_text'))} item(s) contained extractable publisher article text.", + styles["Meta"], + ), + ], + ] + story.append(_source_table(rows, styles)) + + if source_errors: + story.append(_paragraph("Source Issues", styles["Heading2"])) + for flowable in _bullet_list(source_errors, styles): + story.append(flowable) + + +def _add_background(story, wiki, styles): + _chapter(story, 3, "Background And Context", styles) + if not wiki: + story.append(_paragraph("No background content was available from Wikipedia for this topic.", styles["BodyText"])) + return + + if wiki.get("url"): + story.append(_markup_paragraph(f"Reference source: {escape(wiki['url'])}", styles["Source"])) + story.append(Spacer(1, 0.08 * inch)) + + for section in wiki.get("sections", []): + story.append(_paragraph(section.get("title", "Background"), styles["Heading2"])) + for paragraph in _paragraphs_from_text(section.get("text", ""), max_chars=950): + story.append(_paragraph(paragraph, styles["BodyText"])) + + child_items = [] + for child in section.get("children", []): + child_text = child.get("text") + if child_text: + first_sentences = " ".join(_split_sentences(child_text)[:2]) + child_items.append(f"{child.get('title')}: {first_sentences or child_text}") + for flowable in _bullet_list(child_items[:6], styles): + story.append(flowable) + + +def _add_current_developments(story, topic, news, styles): + _chapter(story, 4, "Current Developments", styles) + if not news: + story.append(_paragraph("No recent news items were returned for this topic.", styles["BodyText"])) + return + + for index, item in enumerate(news, start=1): + title = item.get("title") or "Untitled news item" + meta_parts = [part for part in [item.get("source"), item.get("published")] if part] + meta = " | ".join(meta_parts) or "Source metadata unavailable" + article_url = item.get("article_url") or item.get("link", "") + text = _article_text(item) + summary = _extractive_summary(text, topic=topic, sentence_limit=5) + + block = [ + _paragraph(f"{index}. {title}", styles["Heading2"]), + _paragraph(meta, styles["Meta"]), + ] + if item.get("content_status"): + block.append(_paragraph(item["content_status"], styles["Meta"])) + block.append(_markup_paragraph(f"Source: {escape(article_url)}", styles["Source"])) + story.append(KeepTogether(block)) + + if summary: + story.append(_paragraph("Detailed Summary", styles["Heading2"])) + for paragraph in _paragraphs_from_text(" ".join(summary), max_chars=850): + story.append(_paragraph(paragraph, styles["BodyText"])) + + if item.get("full_text"): + key_points = _extractive_summary(item["full_text"], topic=topic, sentence_limit=4) + story.append(_paragraph("Key Points From The Article", styles["Heading2"])) + for flowable in _bullet_list(key_points, styles): + story.append(flowable) + elif item.get("summary"): + story.append(_paragraph("Available RSS Detail", styles["Heading2"])) + story.append(_paragraph(item["summary"], styles["BodyText"])) + + story.append(Spacer(1, 0.1 * inch)) + + +def _add_analysis(story, topic, wiki, news, styles): + _chapter(story, 5, "Source-Based Analysis", styles) + + background_text = " ".join( + [wiki.get("summary", "") if wiki else ""] + + [section.get("text", "") for section in (wiki.get("sections", []) if wiki else [])] + ) + news_text = " ".join(_article_text(item) for item in news) + all_text = f"{background_text} {news_text}" + + story.append(_paragraph("Main Themes", styles["Heading2"])) + keywords = _top_keywords(all_text, limit=10) + if keywords: + for flowable in _bullet_list([keyword.title() for keyword in keywords], styles): + story.append(flowable) + else: + story.append(_paragraph("No recurring themes could be extracted from the available text.", styles["BodyText"])) + + story.append(_paragraph("Observations", styles["Heading2"])) + observations = [] + if wiki: + observations.append( + f"The background source provides a reference foundation for {topic}, including {len(wiki.get('sections', []))} structured section(s)." + ) + if news: + extracted = sum(1 for item in news if item.get("full_text")) + observations.append( + f"Recent coverage adds current context through {len(news)} news item(s), with detailed article text extracted for {extracted} item(s)." + ) + if keywords: + observations.append( + f"The collected material repeatedly emphasizes {', '.join(keywords[:5])}, making these useful areas for project discussion." + ) + observations.append( + "Use the references section to verify every important claim before final academic, business, or client submission." + ) + for flowable in _bullet_list(observations, styles): + story.append(flowable) + + story.append(_paragraph("Limitations", styles["Heading2"])) + limitations = [ + "Some publisher sites block automated article extraction, so the report may use RSS summaries for those items.", + "The report is extractive and source-backed; it does not replace expert review or original research.", + "News coverage changes over time, so regenerate the report when current information is important.", + ] + for flowable in _bullet_list(limitations, styles): + story.append(flowable) + + +def _add_conclusion(story, topic, wiki, news, styles): + _chapter(story, 6, "Conclusion", styles) + + conclusion_parts = [] + if wiki and wiki.get("summary"): + conclusion_parts.extend(_extractive_summary(wiki["summary"], topic=topic, sentence_limit=2)) + if news: + latest_titles = [item.get("title") for item in news[:3] if item.get("title")] + if latest_titles: + conclusion_parts.append( + f"Recent coverage reviewed for this report includes: {'; '.join(latest_titles)}." + ) + + if not conclusion_parts: + conclusion_parts.append( + f"The available material for {topic} was limited, but the report captures the source status and references for follow-up research." + ) + + for paragraph in conclusion_parts: + story.append(_paragraph(paragraph, styles["BodyText"])) + + story.append( + _paragraph( + "For project use, the strongest next step is to convert the themes, background facts, and current developments into your own argument, supported by the references listed below.", + styles["Lead"], + ) + ) + + +def _add_references(story, wiki, news, styles): + _chapter(story, 7, "References", styles) + + items = [] + if wiki and wiki.get("url"): + items.append(f"Wikipedia - {wiki.get('title', 'Topic page')}: {wiki['url']}") + for item in news: + title = item.get("title", "News item") + source = item.get("source", "Publisher") + published = item.get("published", "date unavailable") + url = item.get("article_url") or item.get("link", "") + items.append(f"{source} ({published}) - {title}: {url}") + + if not items: + story.append(_paragraph("No external sources were available.", styles["BodyText"])) + return + + story.append( + ListFlowable( + [ListItem(_paragraph(item, styles["Source"])) for item in items], + bulletType="1", + leftIndent=18, + bulletFontName="Helvetica", + ) + ) + + +def _page_frame(canvas, doc): + canvas.saveState() + width, height = A4 + canvas.setStrokeColor(colors.HexColor("#D1D5DB")) + canvas.setLineWidth(0.35) + canvas.line(0.62 * inch, height - 0.48 * inch, width - 0.62 * inch, height - 0.48 * inch) + canvas.line(0.62 * inch, 0.48 * inch, width - 0.62 * inch, 0.48 * inch) + + canvas.setFont("Helvetica", 8) + canvas.setFillColor(colors.HexColor("#6B7280")) + canvas.drawString(0.65 * inch, height - 0.38 * inch, "Research Report") + canvas.drawRightString(width - 0.65 * inch, 0.31 * inch, f"Page {doc.page}") + canvas.restoreState() + + +def build_report(topic, wiki, news, output_dir="reports", source_errors=None): + source_errors = source_errors or [] + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + filename = f"{_safe_filename(topic)}_Report.pdf" + report_path = output_path / filename + + doc = SimpleDocTemplate( + str(report_path), + pagesize=A4, + rightMargin=0.72 * inch, + leftMargin=0.72 * inch, + topMargin=0.76 * inch, + bottomMargin=0.72 * inch, + title=f"{topic} Research Report", + author="Research Report Generator", + ) + styles = _build_styles() + story = [] + + _add_cover(story, topic, wiki, news, styles) + _add_contents(story, styles) + _add_executive_summary(story, topic, wiki, news, source_errors, styles) + _add_method(story, wiki, news, source_errors, styles) + _add_background(story, wiki, styles) + _add_current_developments(story, topic, news, styles) + _add_analysis(story, topic, wiki, news, styles) + _add_conclusion(story, topic, wiki, news, styles) + _add_references(story, wiki, news, styles) + + doc.build(story, onFirstPage=_page_frame, onLaterPages=_page_frame) + return report_path.resolve() diff --git a/reports/Artificial_Intellgence_Report.pdf b/reports/Artificial_Intellgence_Report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a6ef1f6326d42c028e7078c9d233faec6d5170da GIT binary patch literal 18947 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 AApigX literal 0 HcmV?d00001 diff --git a/reports/Tata_Motors_Report.pdf b/reports/Tata_Motors_Report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a502f46776343d15eb6278952f4b9be2683f73dc GIT binary patch literal 27046 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
    x7yVmR9xr9tsU5kJyHErn?z2D^H*c%u*`k9 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 literal 0 HcmV?d00001 diff --git a/sources/__pycache__/news_source.cpython-312.pyc b/sources/__pycache__/news_source.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aef5bcb7ccb3e291317c33c8ca6c5bfae55204b7 GIT binary patch literal 13455 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 literal 0 HcmV?d00001 diff --git a/sources/news_source.py b/sources/news_source.py new file mode 100644 index 0000000..8249b60 --- /dev/null +++ b/sources/news_source.py @@ -0,0 +1,306 @@ +import json +import re +from datetime import datetime +from html import unescape +from urllib.parse import quote, quote_plus, urlparse + +import feedparser +import requests +from bs4 import BeautifulSoup + + +class NewsSourceError(RuntimeError): + """Raised when the news source cannot be reached or parsed.""" + + +ARTICLE_USER_AGENT = ( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/125.0 Safari/537.36 ResearchReportGenerator/2.0" +) +MAX_ARTICLE_CHARS = 9000 + + +def _clean_text(value): + raw = str(value or "") + if "<" in raw or "&" in raw: + text = BeautifulSoup(raw, "html.parser").get_text(" ") + else: + text = raw + return " ".join(unescape(text).split()) + + +def _entry_date(entry): + parsed = getattr(entry, "published_parsed", None) or getattr(entry, "updated_parsed", None) + if not parsed: + return "" + return datetime(*parsed[:6]).strftime("%Y-%m-%d") + + +def _google_news_article_id(url): + parsed = urlparse(url) + if "news.google.com" not in parsed.netloc or "/articles/" not in parsed.path: + return "" + return parsed.path.rsplit("/articles/", 1)[-1].strip("/") + + +def _decode_google_news_url(url, timeout): + article_id = _google_news_article_id(url) + if not article_id: + return url + + try: + session = requests.Session() + page = session.get( + f"https://news.google.com/articles/{article_id}", + timeout=timeout, + headers={"User-Agent": ARTICLE_USER_AGENT}, + ) + page.raise_for_status() + soup = BeautifulSoup(page.text, "html.parser") + decode_data = soup.find(attrs={"data-n-a-sg": True}) + if not decode_data: + return url + + timestamp = decode_data.get("data-n-a-ts") + signature = decode_data.get("data-n-a-sg") + if not timestamp or not signature: + return url + + inner = ( + '["garturlreq",[[' + '"en-US","US",["FINANCE_TOP_INDICES","WEB_TEST_1_0_0"],null,null,1,1,' + '"US:en",null,180,null,null,null,null,null,0,null,null,[1608992183,723341000]],' + '"en-US","US",1,[2,3,4,8],1,0,"655000234",0,0,null,0],' + f'"{article_id}",{timestamp},"{signature}"]' + ) + request_body = f'[[["Fbv4je","{inner.replace(chr(34), chr(92) + chr(34))}",null,"generic"]]]' + response = session.post( + "https://news.google.com/_/DotsSplashUi/data/batchexecute?rpcids=Fbv4je", + data=f"f.req={quote(request_body)}", + timeout=timeout, + headers={ + "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", + "User-Agent": ARTICLE_USER_AGENT, + }, + ) + response.raise_for_status() + + for candidate in re.findall(r"https?://[^\\\"]+", response.text): + if "news.google.com" not in urlparse(candidate).netloc: + return candidate + except requests.RequestException: + return url + + return url + + +def _canonical_url(soup, fallback): + tag = soup.find("link", rel=lambda value: value and "canonical" in value) + if tag and tag.get("href"): + return tag["href"] + tag = soup.find("meta", property="og:url") + if tag and tag.get("content"): + return tag["content"] + return fallback + + +def _page_title(soup): + for selector in [ + ("meta", {"property": "og:title"}), + ("meta", {"name": "twitter:title"}), + ]: + tag = soup.find(*selector) + if tag and tag.get("content"): + return _clean_text(tag["content"]) + if soup.title and soup.title.string: + return _clean_text(soup.title.string) + return "" + + +def _is_useful_paragraph(text): + if len(text) < 70: + return False + lowered = text.lower() + blocked = [ + "accept cookies", + "advertisement", + "all rights reserved", + "enable javascript", + "privacy policy", + "sign up", + "subscribe", + ] + return not any(item in lowered for item in blocked) + + +def _extract_paragraphs(soup): + for tag in soup(["script", "style", "noscript", "nav", "footer", "header", "aside", "form"]): + tag.decompose() + + containers = soup.find_all("article") + if not containers: + containers = soup.find_all("main") + if not containers: + containers = [soup.body or soup] + + paragraphs = [] + seen = set() + for container in containers: + for paragraph in container.find_all("p"): + text = _clean_text(paragraph.get_text(" ")) + fingerprint = text.lower() + if fingerprint in seen or not _is_useful_paragraph(text): + continue + seen.add(fingerprint) + paragraphs.append(text) + + if sum(len(item) for item in paragraphs) >= MAX_ARTICLE_CHARS: + return paragraphs + + return paragraphs + + +def _json_ld_nodes(value): + if isinstance(value, dict): + yield value + for key in ("@graph", "itemListElement"): + child = value.get(key) + if child: + yield from _json_ld_nodes(child) + elif isinstance(value, list): + for item in value: + yield from _json_ld_nodes(item) + + +def _extract_structured_text(soup): + candidates = [] + for script in soup.find_all("script", attrs={"type": "application/ld+json"}): + raw = script.string or script.get_text() + if not raw: + continue + try: + data = json.loads(raw) + except json.JSONDecodeError: + continue + + for node in _json_ld_nodes(data): + body = node.get("articleBody") or node.get("description") + if isinstance(body, str) and _is_useful_paragraph(_clean_text(body)): + candidates.append(_clean_text(body)) + + for attrs in [ + {"property": "og:description"}, + {"name": "description"}, + {"name": "twitter:description"}, + ]: + tag = soup.find("meta", attrs=attrs) + if tag and tag.get("content"): + text = _clean_text(tag["content"]) + if _is_useful_paragraph(text): + candidates.append(text) + + seen = set() + unique = [] + for text in candidates: + fingerprint = text.lower() + if fingerprint not in seen: + seen.add(fingerprint) + unique.append(text) + return "\n\n".join(unique) + + +def _fetch_article_content(url, timeout): + resolved_url = _decode_google_news_url(url, timeout=timeout) + empty_result = { + "article_url": resolved_url, + "article_title": "", + "full_text": "", + "content_status": "Article text was not available from the publisher page.", + } + + try: + response = requests.get( + resolved_url, + timeout=timeout, + allow_redirects=True, + headers={"User-Agent": ARTICLE_USER_AGENT}, + ) + response.raise_for_status() + except requests.RequestException: + return { + **empty_result, + "content_status": "Article text could not be fetched from the publisher page.", + } + + content_type = response.headers.get("content-type", "").lower() + if "html" not in content_type and "text" not in content_type: + return empty_result + + soup = BeautifulSoup(response.text, "html.parser") + paragraphs = _extract_paragraphs(soup) + full_text = "\n\n".join(paragraphs) or _extract_structured_text(soup) + if len(full_text) > MAX_ARTICLE_CHARS: + full_text = full_text[:MAX_ARTICLE_CHARS].rsplit(" ", 1)[0] + + return { + "article_url": _canonical_url(soup, response.url), + "article_title": _page_title(soup), + "full_text": full_text, + "content_status": "Article text extracted." if full_text else empty_result["content_status"], + } + + +def get_news(topic, limit=8, timeout=15, include_article_content=True, article_timeout=12): + """Return recent news results for a topic from Google News RSS.""" + if not topic or not topic.strip(): + raise ValueError("Topic is required to fetch news.") + + if limit <= 0: + return [] + + query = quote_plus(topic.strip()) + url = f"https://news.google.com/rss/search?q={query}&hl=en-US&gl=US&ceid=US:en" + try: + response = requests.get( + url, + timeout=timeout, + headers={"User-Agent": "ResearchReportGenerator/2.0"}, + ) + response.raise_for_status() + except requests.RequestException as exc: + raise NewsSourceError("Unable to fetch the news feed. Please try again later.") from exc + + feed = feedparser.parse(response.content) + + if getattr(feed, "bozo", False): + raise NewsSourceError("Unable to parse the news feed. Please try again later.") + + results = [] + seen_links = set() + for entry in feed.entries: + link = _clean_text(getattr(entry, "link", "")) + if not link or link in seen_links: + continue + + seen_links.add(link) + item = { + "title": _clean_text(getattr(entry, "title", "")) or "Untitled news item", + "link": link, + "published": _entry_date(entry), + "source": _clean_text(getattr(getattr(entry, "source", None), "title", "")), + "summary": _clean_text(getattr(entry, "summary", "")), + "article_url": link, + "article_title": "", + "full_text": "", + "content_status": "Article content fetch was disabled.", + } + if include_article_content: + item.update(_fetch_article_content(link, timeout=article_timeout)) + + results.append(item) + + if len(results) >= limit: + break + + return results diff --git a/sources/wikipedia_source.py b/sources/wikipedia_source.py new file mode 100644 index 0000000..9c31c25 --- /dev/null +++ b/sources/wikipedia_source.py @@ -0,0 +1,56 @@ +import wikipediaapi + + +class WikipediaSourceError(RuntimeError): + """Raised when Wikipedia cannot be reached or parsed.""" + + +def _section_to_dict(section, depth=0, max_depth=1): + if depth > max_depth: + return None + + text = " ".join((section.text or "").split()) + children = [ + child + for child in (_section_to_dict(item, depth + 1, max_depth) for item in section.sections) + if child + ] + + if not text and not children: + return None + + return { + "title": section.title, + "text": text, + "children": children, + } + + +def get_wikipedia_content(topic, section_limit=8): + """Return summary and high-value sections from Wikipedia for a topic.""" + if not topic or not topic.strip(): + raise ValueError("Topic is required to fetch Wikipedia content.") + + try: + wiki = wikipediaapi.Wikipedia(user_agent="ResearchReportGenerator/2.0", language="en") + page = wiki.page(topic.strip()) + + if not page.exists(): + return {} + + sections = [] + for section in page.sections: + section_data = _section_to_dict(section) + if section_data: + sections.append(section_data) + if len(sections) >= section_limit: + break + + return { + "title": page.title, + "summary": " ".join((page.summary or "").split()), + "url": page.fullurl, + "sections": sections, + } + except Exception as exc: + raise WikipediaSourceError("Unable to contact Wikipedia. Please try again later.") from exc