From ecebe2acef1326fdfabceb09b4f5987a96391314 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 14 Aug 2024 09:35:27 +0530 Subject: [PATCH] Various Russian and Ukranian news sources by bugmen00t --- recipes/before_we_go.recipe | 37 +++ recipes/dev_ua.recipe | 37 +++ recipes/icons/afr.png | Bin 220 -> 213 bytes recipes/icons/ancient_egypt.png | Bin 491 -> 443 bytes recipes/icons/before_we_go.png | Bin 0 -> 2038 bytes recipes/icons/dev_ua.png | Bin 0 -> 486 bytes recipes/icons/economist_espresso.png | Bin 1030 -> 897 bytes recipes/icons/economist_world_ahead.png | Bin 2683 -> 1903 bytes recipes/icons/firstpost.png | Bin 1051 -> 1048 bytes recipes/icons/gates_notes.png | Bin 763 -> 762 bytes recipes/icons/good_e-reader.png | Bin 593 -> 592 bytes recipes/icons/harpers.png | Bin 356 -> 350 bytes recipes/icons/hindutamil.png | Bin 807 -> 733 bytes recipes/icons/ifzm.png | Bin 726 -> 535 bytes recipes/icons/kirkusreviews.png | Bin 1429 -> 1427 bytes recipes/icons/military_history.png | Bin 339 -> 336 bytes recipes/icons/minerva_magazine.png | Bin 380 -> 366 bytes recipes/icons/nautilus.png | Bin 292 -> 278 bytes recipes/icons/new_scientist_mag.png | Bin 278 -> 276 bytes recipes/icons/newslaundry.png | Bin 286 -> 285 bytes recipes/icons/nikkeiasia.png | Bin 216 -> 214 bytes recipes/icons/poetrymagazine.png | Bin 536 -> 341 bytes recipes/icons/poligon.png | Bin 0 -> 916 bytes recipes/icons/scroll.png | Bin 298 -> 294 bytes recipes/icons/t_invariant_en.png | Bin 0 -> 896 bytes recipes/icons/t_invariant_ru.png | Bin 0 -> 896 bytes recipes/icons/t_invariant_ua.png | Bin 0 -> 896 bytes recipes/icons/the_week_magazine_free.png | Bin 286 -> 275 bytes recipes/icons/the_week_uk.png | Bin 286 -> 275 bytes recipes/icons/times_online.png | Bin 170 -> 158 bytes recipes/icons/tls_mag.png | Bin 234 -> 232 bytes recipes/icons/toi.png | Bin 305 -> 303 bytes recipes/icons/toiprint.png | Bin 305 -> 303 bytes recipes/icons/wicomix.png | Bin 0 -> 512 bytes recipes/icons/world_archeology.png | Bin 382 -> 378 bytes recipes/poligon.recipe | 35 +++ recipes/t_invariant_en.recipe | 171 ++++++++++++++ recipes/t_invariant_ru.recipe | 173 ++++++++++++++ recipes/t_invariant_ua.recipe | 171 ++++++++++++++ recipes/wicomix.recipe | 36 +++ src/calibre/qt_backend.py | 289 +++++++++++++++++++++++ 41 files changed, 949 insertions(+) create mode 100644 recipes/before_we_go.recipe create mode 100644 recipes/dev_ua.recipe create mode 100644 recipes/icons/before_we_go.png create mode 100644 recipes/icons/dev_ua.png create mode 100644 recipes/icons/poligon.png create mode 100644 recipes/icons/t_invariant_en.png create mode 100644 recipes/icons/t_invariant_ru.png create mode 100644 recipes/icons/t_invariant_ua.png create mode 100644 recipes/icons/wicomix.png create mode 100644 recipes/poligon.recipe create mode 100644 recipes/t_invariant_en.recipe create mode 100644 recipes/t_invariant_ru.recipe create mode 100644 recipes/t_invariant_ua.recipe create mode 100644 recipes/wicomix.recipe create mode 100644 src/calibre/qt_backend.py diff --git a/recipes/before_we_go.recipe b/recipes/before_we_go.recipe new file mode 100644 index 0000000000..205e833a9f --- /dev/null +++ b/recipes/before_we_go.recipe @@ -0,0 +1,37 @@ +#!/usr/bin/env python + # vim:fileencoding=utf-8 + +from __future__ import absolute_import, division, print_function, unicode_literals + +from calibre.web.feeds.news import BasicNewsRecipe + + +class BeforeWeGo(BasicNewsRecipe): + title = 'Before We Go' + __author__ = 'bugmen00t' + description = 'Before We Go Blog is a collective of Fantasy, Sci-Fi and Graphic Novel fans from around the world, passionate about providing awesome, enjoyable reviews for anyone who loves a good book!' # noqa + publisher = 'BEFOREWEGOBLOG' + category = 'blog' +# cover_url = u'https://i0.wp.com/beforewegoblog.com/wp-content/uploads/2021/09/beth-with-long-hair.jpeg' + cover_url = u'https://i0.wp.com/beforewegoblog.com/wp-content/uploads/2021/01/before-we-go-blog-1.png' + language = 'en' + no_stylesheets = True + remove_javascript = False + auto_cleanup = False + oldest_article = 14 + max_articles_per_feed = 10 + + remove_tags_before = dict(name='h1', attrs={'class': 'entry-title'}) + + remove_tags_after = dict(name='div', attrs={'id': 'author-bio'}) +# remove_tags_after = dict(name='article') + + remove_tags = [ + dict(name='div', attrs={'class': 'nectar-scrolling-text font_size_10vh custom_color has-custom-divider'}), + dict(name='span', attrs={'class': 'meta-comment-count'}), + dict(name='p', attrs={'id': 'breadcrumbs'}) + ] + + feeds = [ + ('Before We Go', 'https://beforewegoblog.com/feed/') + ] diff --git a/recipes/dev_ua.recipe b/recipes/dev_ua.recipe new file mode 100644 index 0000000000..0eb8c482a5 --- /dev/null +++ b/recipes/dev_ua.recipe @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +from __future__ import absolute_import, division, print_function, unicode_literals + +from calibre.web.feeds.news import BasicNewsRecipe + + +class WiComix(BasicNewsRecipe): + title = 'dev.ua' + __author__ = 'bugmen00t' + publisher = '\u0422\u041E\u0412 \u00AB\u0414\u0435\u0432 \u0423\u043A\u0440\u0430\u0457\u043D\u0430\u00BB' + category = 'news' + cover_url = u'https://jobs.dev.ua/storage/images/34/70/82/79/original/af4c5c155ec48ed68e1c77ca26a8f0b0.jpg' + no_stylesheets = False + remove_javascript = False + auto_cleanup = False + oldest_article = 3 + max_articles_per_feed = 30 + description = '\u041C\u0435\u0434\u0456\u0430 \u043F\u0440\u043E \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0456\u0457, \u0456\u043D\u043D\u043E\u0432\u0430\u0446\u0456\u0457, \u0432\u0438\u043D\u0430\u0445\u043E\u0434\u0438 \u0432 \u0423\u043A\u0440\u0430\u0457\u043D\u0456 \u0442\u0430 \u0437\u0430 \u0457\u0457 \u043C\u0435\u0436\u0430\u043C\u0438. \u041F\u0440\u043E \u0442\u0435, \u044F\u043A \u0432\u043E\u043D\u0438 \u0432\u043F\u043B\u0438\u0432\u0430\u044E\u0442\u044C \u043D\u0430 \u0436\u0438\u0442\u0442\u044F \u043B\u044E\u0434\u0435\u0439.' # noqa + language = 'uk' + + remove_tags_before = dict(name='div', attrs={'class': 'article__header'}) + + remove_tags_after = dict(name='div', attrs={'class': 'article__body'}) + + remove_tags = [ + dict(name='div', attrs={'class': 'article__reference article__reference_header'}), + dict(name='div', attrs={'class': 'my-lg-5'}), + dict(name='div', attrs={'class': 'video '}), + dict(name='figure', attrs={'class': 'incut'}), + dict(name='figure', attrs={'class': 'global-incut'}) + ] + + feeds = [ + ('dev.ua', 'https://dev.ua/rss') + ] diff --git a/recipes/icons/afr.png b/recipes/icons/afr.png index f3deacc513c0ea78587da3bdfc32005e7efa2d5e..58f57a288a9546b380794bb5a15d93a5560db183 100644 GIT binary patch delta 106 zcmV-w0G0pT0o4JJa$`t>S~C`>!fXnDCROKwaCWvL7c? zNJpJCp%_z?ih6`eT*=h78}-pmdKo}wlc5eK_yg$KMeCZV&ZMN$tE&E(F`<FM?C?Dp>N_wn)h^z{1n_Wb$z{rmg={{H{}{}U?XW&i*H0(4SNQ-1jaPSf}R z005RrL_t&-SASz*V01+Sj0~uJkccZ901N2500~nq5U>Rcu<8N{OAZb-HEtb{fHAuO zNLWbN)z!!XBp_nQY!4N%0h!^*>&l@765v#qkp&5;N|{TufdsfT6u<&J5)u+jW)Lmb zKmiLupe(-_M8H9l!C6!pD4@b(<;2HlVj?NdU?3-F<0Wb*FQ=$22LgJSPRH;Zy7vKB WSTtNL7Uqlq0000||h(cA!%7ROM2_L`*xVRIa!Bt$iivdMcL?l}aw^pJ}z1kv4izFC~+FR1x+D>=5 z#FRqgtcH&{hcm+o~k$UFFKQTN7L!9pMiI$Y(MnCMTQx zNhCrj9!G1<;LHpFp?I7?INX}xIGbh4G&$ef#&=A)b7xYa`kY8JCGf-Ni{eG0s+q~JG zZg2Bqc$mV*1_0HwGp=l#X9ELX>{yIf)6)Prm5OIjD;DWC3{vy+&EZI~7j$f{e`eIpf zd3XrG;Os2Ho*wG88pqizh@iCQX@5Ue+ipt{NhW#pD{H`ggx=M_VuvO!u=oe2jMoR( S6JhlL00007{g2jK_(>xWC$b# z5yjBDY(bQ^@I;FUib@p~T0{(^Afp&&!VG~BGBAX|voryPrvmz`{n5AM^-=T@`r53s z&N_GHp8cJ@zi)r%ZrSoze%rTi-?Mu+-T?bFh&)d|AwCi%35^y9M$S{>9(wr7%gJr| z8^0Ypc34?jnwyzn&}g)-o<0hdV(TalB1=N3yhEXqXxe{aB0`N!|8jICB_%8d6HFvF zF&GYbyq=B@&fNU6s|OrkLOLc6JKFHMcb>i5Xh7I})X8`Y>zzAy!me%Gw*9{V7=3*g zCnukS2kYzVtSv3gOiYM@f!@}(Ttc{*K$1ipgFGaZxKs;Uejv$CO9!K_@r@O}=71m7 z$aL%0t$z|-K|ukfs|%;bpi$nQp03W$RyZ7F6GbLFIyi(70)324Gx07QLij{TRFbPJ z$q?IrkRS;=I!~qj989s)(E1YqWhG?*xS4U`-;WHZ{e69*bdhLmjK0wv)Ga(l5)v)dSODpQwS!CmRaI3tCx@3p?nVI8 zu{6o~?%Y{~d9>w!A&fSDk&IG6&ul0?LwFvH0N*t=&>c3O(8=fZDl1Tnf1}u)I{m%2pA8SSgq+vr@QJNLLkvlm%rD6lABlNN0=)UtOf1> z2p2GZyq43VmALyp%=G@D;W0IZ6*#W$}~ zNnu`Yu5KpCXLy}870!4&9}oBS0GjIRG7MQ>9>62Q!!MpoTw`*)w|zaa67Jw2 zqi%M%2YG~bdH$^dMy;`-A%q4;fkLS$D{ovJaJM5tL52nfj|%gU{o=7f;XvmmLYnID zJQ@*(L=#ARI+7B7%uH z3k$f8cB!gvTpV3(DLJOb#^C#~po9c13pw1*CfNK!IJP*>hQ*ud(Us}31wKnk_zZ7( ziVd`b*Cx=8L*4b!Xy6a7)s2;duzx-Cvy3#OGx2fYqcg1Tq2~J1*x0e;WJz|`LSde` zC~vZ%;#S5*ZYSf##K`K~auwgsSrdZQnH5O5L%=Y!TRpvCeKvQlT%yGqRuvl}(Y3YK zeNS9XOPL%<7f-77J-Nl}cSujQtiGS##XwaSo?tc{8)l+wit<>^^*v24gY9=*NlPHi+K*kPdB}oM<$}H2G9b4TPkqsQ3o}+$Zz=0bW;qQw1FkSa9Qt zv_EGBt(7Iu1jDn#Ot@s)tIHl&c<=_aigLdlXQ4)zcvefrL|R(r@2b7V#(h+Uw|d*ZUrRKYAZOsw{G3bsBRz9|+ml8<$9q_G+7b!R_9)%hnPHH*HG7>5Hf0uM>$y zm%ryRo1gKAdl)Idzp;C8HwyGx``{;p((?RV@Kj#cla2=awtA!S-byV^4Ozke1A$`L UmW_e^-2eap07*qoM6N<$f_hBbV*mgE literal 0 HcmV?d00001 diff --git a/recipes/icons/dev_ua.png b/recipes/icons/dev_ua.png new file mode 100644 index 0000000000000000000000000000000000000000..192bac5e89d3766ab4dd8dff5e1c38064d3ddb3d GIT binary patch literal 486 zcmV@P)z^B*zGY-1l|7+V{7Ve8&(WBu_E{6$;;H;)-h4Yj4gt9HH~ zW2_tsK|csBV`|ADtJqO*%;sn-Hwmf3WRaN*KG(_SQ1qU{n*E;aLE&bDpWhI?vk4ge zpZ0Bjg0XUsflV3)EY(}wwG4=1SUs)sM=sQ7R1LsZ#>wSW4Zv1m;ZdpvVDtQcPt^cyF2R$8m*5GP;99y% zAXj+`&ZcSrHkaT)ss>;yG-VxN2L6$135VVZ{H^Pd5si9WYrTLq)iKdn9H_o36fE(J$J7Ab)wy}>f cjLn<-4}uR4PCN7cj{pDw07*qoM6N<$g3R^hAOHXW literal 0 HcmV?d00001 diff --git a/recipes/icons/economist_espresso.png b/recipes/icons/economist_espresso.png index c338e0659940d508b69d24c76340231c14d85f26..488b1c29ff4ee1109c8849597860bcc4d867bcf9 100644 GIT binary patch delta 885 zcmV-*1B(2H2!RKX8Gi!+005o0f$RVP00VPENmK|32;1RL-~a#tj8IHeMF0Q*5fKqP zJ3CTRQd3h?Sy@?ITU%aUUTJA*ZfzP`S|z`()5!NS7A#>U3b(9qGmyw=v%*VotD+S=d%0O0@t;s5~S0083+1mh0} z;|~bq5enlH3gZ$BV(1eL=xuE3fq?An?CqJD?U|YF zoSW{Oo9>^U?th`6?xLdar>5_xr|_z(@wK$_ySwtdyz;%h^S-_FzrORq!1KYu^t`Tt z-T3(U`QhOC;o3`|_>gxOJ>-+5M`|Rxd`T6_% z`~2?i{O|Al{QUm;`TqL({{H^|`uYF*`v3p`5fLdy0004@Nklg?|N60dnWP`{c;!Q1^E1s>6A7eCl>zcrX1vuYU~D04?bJ8pxTY0+bf*WoL-M zJfhviW@!%hjEI4?cMMG3X@f;-K#{vKFd67+l@StEfMt51T?z%>Nf}_B9#Ev$FhG&6 zU|SFH_zlftN z6MnRWQBl&qKa#|0fQ6p`zC*ihZDsS|G17IQaQ(z|y?nn$6BRxd=H6Hl^WV<`6(7rzaT5{w%nFX9Fr&fjkh{fFxHb8=yA^KnCIf*nk}HumJ+} z&~5{_LBJGR+l4xM03YF^kWwK)Idy*`1{%If1==v58fg5uhHBFjVq@Y{O_r^|D4DW7 zr76O1R+OIQlS0)WUBmNLW^+lg7IPV|rCJay)*7oIlyF9j{M)<%udjeG?BvPW00000 LNkvXXu0mjftwrr@ delta 1019 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 g=53FgZ>rSRt*P(Bc3_yVp delta 2629 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 diff --git a/recipes/icons/firstpost.png b/recipes/icons/firstpost.png index 693d6365d15604bfed512e088dbc6ac72ccc62df..ae891ee5f467c6863c880ddeac42b405e5624e2d 100644 GIT binary patch delta 35 tcmV+;0NnqZ2$%?vPyrZ`Q5*!Q*CVX4bddr9TayL@N(8=*$k>xq1IOCX4JQBq delta 38 wcmV+>0NMYT2%89yPyri}Q5*;V|Nn`DYr3&>YD<%KwiN4m`o98&6-8E{aqWSpxL;CPWFcBB<TTvqbnYm_A2{e7~6$GGPW>5vx$=Hdl$Cl*-;IRDB1gZf;0|3Yc@m&a= z{&>Mq55S8&un~mIgb6r-W;xo2;7x8g*AbZi;CO{@Ndn}CYxR8xI)ejAQ*a|6B$V?5 z3PUT-i`{@*QZEk8Y&^B(l^C;7NjvZ2a6ahuW#=>q4uv;wbz%K5e z?}4J9%m}AEr+dxLzVq&yOqmIjZpu*Nn9>s0GgAr_SCu3JO`FfWhPxzH1eccUq{8`? zxuRdt##bh#ULY*F0QV0lCl-&q0M)VsjvufJZxd}(kFcwDfPjB$jUe|4{E~ctTmaXy z8bN6kIwckCgx1vrKz6XirwnA(20B}_*CbBt7=yS31SkjzA>mMPDN!Uu zOF_Xq(9j|}D#Qa&!80I`5JIA$pbG^`LjlM^fQXz3%dy#A@64W|*o{5AF=Ct1%zS(P zbN(|kzU6v{l2Fx%n~Mk%MISah)iyMI3rJciRFtN8V&A>#jPCVX(eDMom=Yr3!4}~&pfP7a zEafP<;+bv>jDNe7Aih$hD1j_S=jC)U`s+KW{?VDwSRM0VF7aO2@(%T z0Be$6a?4E77jza?#%4aucZ@0eVsb?1)dM=6*#OawyMJZtvU#eLF;gKmqXAZn+G}vR zjXJB){;54l76$iYASnsuCIs{Pa;3gqi)VE@OX2;4u~3bN?2n>MHg3Ig?y0dZQrS7R z_`?DyWwV`=$NClbHqNcQxOfx~yztBUssPkBJ5Apex-}N(1knVLB!3u5L_t(I%Y{@;ixWW*eKlX%Y_j<K^1^8OArP;pojQ1fLhrA zJTujsvslGTXn!_+q8a#?dQm^lnXJ#zcF|MF%iYI_Y!uXb1*mNywxaWsEo+-ajD-09frg zBppEk5Tj0DEi*-5pmSE9n)R74#uR-q7NTwS0Ccvp0e`F=cMVptWLixfAzIM@(L6if zi#FPdbY7wSDZNzH(UTN_TI!KCAzIfr{mM}(bvr#fn0X4Ho=zEII>u=hGWp(n@64$Y z7vdjZ-1sE`KqUE>3+IQvJB{V`+w14x0bcz5YRCXk>UQdZEA(jeGk^fZTNM(3L|xfw zMDEyUhcO3Z1pwrm{9=e&&34&^fCn+$tA=Q;wxz-1Qr?mrd?sw_-)?it&7RmEen lRMh>^wC}w|mFHC*${!4=4M}xny4L^z002ovPDHLkV1i@TSDgR= diff --git a/recipes/icons/hindutamil.png b/recipes/icons/hindutamil.png index 029c72b47120f54f140f667b182f32b092087ef5..ee59654c86489f7370d76e3fb6bfef5f0af229c5 100644 GIT binary patch delta 720 zcmV;>0x$ii2Hgda8Gi!+001a04^sdD0iIAyR7EmkqBv%yKWwN(aH>Xft4egOOLeVI zcdt%(uTOZdPkFFVd9YD=uu^)lQhTved$Co0vQ~YvS%9=$g0)_Rwql34V~4n7h`3~k zxn+sDW{SFJi@Iowx@nBNYK^;Ujl64)yls!YZjiljk-l+~zkhL)zjBkmbd|t$mB4kC z!F86wc9y|+m%(_L!g`s*dz!<1n!|mY#DAT|fS$&JpT>ir$AzNEhN8%aqsWM)$%&=P zilxeor^}6~%Z{kbkEzU%s?3qA&62FnldR5^t9F+pxmhu*2K2 z!`rmQ-L=Nuw#VMQ%iz4s;lIw}!O-Kw(d5L^)#l9D=*`&Z(A(+K-0IZc z>($@v*5B;b;Oy7n?bqS$+T-rrTX`0(@i@$~uf_4)Jm z`SkYs^!NJq`1|_%{QCR-{r&#^{{H^{{{H^||NsA+w{`>o008<)L_t&-S7Yexs4l2z z>r9F6gaC%l3=KIoomNZPw)T$Bw)S?0b_X#%X+Cc)ar=550qZDxh9*%(W(Fz$P!_2o zX-3yLbAN^~eR~^LDZ3CIMVT6IGfi`bbZbK;X8}(ieF=L@Ee|DghW7mEgy7t8CtHh5 z11lz@ULc_3>cA|ck1?Sag#Ac4H(#In>J{YtLV5QUURpn#XCXBNAS zn;?IxiinqXCqtdFkfbYzZ9ETKnyN^#d?!PBj7d@iFQ;VyH-DOvaIAVKLzAtEy{@B+ zdx=lBsfcn_CqrRmR8lj_70ulgdu2iLE8iqRn0000f8UvNX6DSvWG0gt zCS{U|AxRS~w$@TCXo_^BE{cNNq8pLY3jPBwL`3ki5LfP0L>Iac6%-{_ywt=t24d5R zX_&N`NivgUGWW|lb1t8YiG~P*&+dH}@8$VDLP{y6gj&m@P=9I?4F^faLMTG;)6yoD zy2(>B6a1G{fceZepZ~Z<%d`plRWw!M^%rKCTi#})Sm)xS;|Kr*LVzdbK@F;uk{g)< z<+@2SX0TuHuvhKy!8gn7*G;;P%e$W~^8CdIcv|kd$Ji*= z35PUpt$&wz@tMKA%_5L$D`aZkwDPjv&wZnJWp~b zS0)tf_0++LPIjwGJff4^sdGF%z_CFCpCV|sZQi_co}ZVt(ETcjXozal;)lgNFF$v# zH{f2e#@MmQf%AT@o=Tyqz9Up7hX;^SvV6CM>q$n3!t@(~!ypME_&@SIiDkR!fkXO# Z0Tj(%Q7GUXhxq^i002ovPDHLkV1g`AhBp8J diff --git a/recipes/icons/ifzm.png b/recipes/icons/ifzm.png index 1e660b740906b95894663a8785846d0c410402bc..becfe9bd319866fede69ef517fdb2eb960e00ce7 100644 GIT binary patch delta 501 zcmcb{I-O;LBnLAC1A~SxfAB;_@p^_c0X`wFK!JUSZvX%P-!F2WqwfqS-x=;fv#Xo8 zS2k{|YyzRGrfoT;>vPK1=Yr6N-0}@Y)td^dHUY`vn$0D(n`1MU$7L>$&s-6owIVTl zWo$Z>ot(S6ykRR)dsWl+nwA~)?K>OVceeKI0jf;MTA5g%y)r3hRdVjCz?cO=Koq+$ zIBsD`{G#5Oho&z+F?Z$Z#p}+k+i`XC-Wxj)-QIWn-u~nFj+}XT^5WAA*PdU!{rdKU z_Ya<=>-XP3e);|9FVGAB^;|z(1A54yB*-rqNOQ`{DhC7x1_gD1z@EK8a18_= z0l}O4H(>A)1pb0Rout}cpr);!E{-7*lA#B8`yF-=aJXn~yxa4Sl4geh@BjbN3RWr$ zHkhYfyXSb}sZ8KI)mbMu?oa!(xWdFRP)0ozl=~X0LBicsQ>_tH9&&zhJ}8 zGRECor6S|^ho{cu{%>4uVDNPHb6Mw<&;$VOMgxKX delta 694 zcmV;n0!jUs1l9$R83+ad001BJ|6!3K7k>hXNkl)2iIRJEo0~^@0fz+?alB*Y%peFVsF;F6+_Wpx_m|+XR*f ztW9PJiUO>xY#!{&`5f=EExr4o#BDZn_UYn`MhNic!GUwLmCEt-;3Z!m*eO7>!wSPg z9dJ}JpwrJox9AbxY-WYUCuwJ>$A1GGoBQ(&T;>cyj4;@0xf-3hJxalNhPO-Wd#I9l z1qU=SGjBoGo zwbE(?qobK!wXc*=1@u)}4C;gc6%0g)40pk&F9lYE-_ekfeXtHF4fYTM?DLMS@V<7D zP+VvIeVLYFi(COa0KRqyj7Nf?6soYbog;3bnGm$O9jO-nL>ue7uGV3 zBv?R1(Gb+7S28?^uVz|Y+>(@%2?5mrxsCJ;^?Kmpqt)p0@`iV6>Y{)=$QLWXcmk<} zbdbpwaxFZ!^nP23V+?^q!lUgi3;(*OVf07*qoM6N<$f_`{W$p8QV diff --git a/recipes/icons/kirkusreviews.png b/recipes/icons/kirkusreviews.png index abca544dbdb7cd03c6184d79d4e1e7149c96fae4..7798f66579c18b48996464abd8088999dc9df2e0 100644 GIT binary patch delta 396 zcmV;70dxM93zG}5Cjx(SNklA_5tsGAAK5xquee7V~xW4HBtL)+ldk zZlOUTS4w5lR%IJg0L1Mbl1@Zbm%3X+vD%*AKI|VD9HNUY7~OyH2%_Gg%NDVt#FVjQ_2*AqfT974zz`Aq;LkdY)qOypm`4%WEQ;OsL;F!tnl) q`b?yg>95qcq9Bzq|5}tHY&0L3p<2G>57M_qw#Wf8{{XY51MdMcV!!49 delta 398 zcmV;90dfA53zZA7Cjx(UNkl)5rIrlnUjzzzM#d`MZKoBP9l}b>g5fM zO*AOvN~uiRtZZQlfVfp9X+u=EYdW+PtLyCQ#-853e!AF#(GPzNA{vbP>?L-{G(0kD zw$LRmm@&j=icif}+qj)6x5-Q(PO^MvwM|U}sRYQf05db|aQ@T_0Jz+qxe9t7fcb?* zZzVkkfXVG!qKOdThvk*k080dcHR(DAr$HFl*yK0SA@9bN~PV diff --git a/recipes/icons/military_history.png b/recipes/icons/military_history.png index 26f8e2f282fce780f14d378a2067c942ad628245..c9913535133f094e6c5b392164b376ff5589f9f9 100644 GIT binary patch delta 179 zcmV;k08IbW0?-1GrGJ)5L_t&-S7ndc5`r)kLz7v~fPw{ESzQm}ThYjWGB*hN

jc{r^w2320E~ZDu!_ zGmt8Rk4UAU64)tGK=7s23L+EYb`xRa?V+;ykwl`;jMS%;vC*}dOaOE3+9H&tcdgSo z0^06;Df(f!x_0br4747@_TjybL73cJ1Vrx|dkYAF38L-qGB03Zx-`k&%&&jg6h1os*N3o10rmNJv;%SVTlb zT3T90Mn+avR!&aN(9qD_+}y&#!rI!})6>(-%gfu_+t=6E&(F`_-#;KAASfs(I5;>Y zBqTI6G(J8)BO{}rprEj@u(GnUv9YncySu)(x3|B)f8xZ6lO|1?J$v@HZQD+tK7IM} z<(oHe-oAbN-o1No-n{wr>C=xNKYsoC_2;6HfevIU3GxfB`^oHg`3I0!6a&|X6|X)w&)8G-swRO^EijjNLc^4aEH12*H|$~5j&R^n zJCLXme)@>YfnI@xi&v78CZ#zE379-g6Lu6!xD+Uq=qwm;VQQiiN5^L4LP<_TLrHHZ u*=5U4oLq9|jMDP8Or;WB2foPc`p(GkpR-tL)@e0RxOuwzxvX>WHnkf0ZlZML-V08_EmH2m&^nO&$QCwMHq0>$+4bl|su}>*5HPnoK50DQUOc-?LV$#e6<5 z1m*yT!-4U5d=ta6EaEsW1iTatl~T-RGpf}pyWNiC@mMIn3kbuI<#LJVc`OzSrqk(N zKrX^h7u{|b(`7V&b#Ma^LLh_yU^E)xI1WjYT$jsb48ynq7{D8R9m;iG>h(HN6p^MW zLI`}{M@mVj)4_2ZwAQRvEB5<60RQrp&wtRLjSTXd#d$~!ynh02pnAR?^oF$n0000< KMNUMnLSTYSw4kE^ diff --git a/recipes/icons/nautilus.png b/recipes/icons/nautilus.png index 6cfc351d79af694c283945ec6f3bda5f73f8813d..eeeb38d2634d986fe84accc808e84565f3e7de46 100644 GIT binary patch delta 159 zcmV;Q0AT;50+s@he}95WL_t&-83n-s0)rq71h7+q6m?tw|Jo&i8c8w=g3%Lx{UYq{ zt9NntCf>eo?!KA*O6?TXh3v{W<9p?igPbFgd)r<6Ad={H|Gv+-(31G|tn5DdzLL=W z*?n>}$vD+D4?JC-kqXD^&!^WxD%ON5m`lh6n44hbfinw%8W>433jW-d2K^BlpxFQb N002ovPDHLkV1jJ=P3-^x delta 173 zcmV;e08;;!0;B?ve}9lkL_t&-l~qq!62&kGvRPb`F5LgLMf-l9Gsy@Mf?_Nm!Wy2v z@C?jsADkZ%Ku7R-A(A-JR{~y>GvXno^`7(LGMd=kWt$u%8tqM1(8nVQ<8KCC&%H-V zP{f1j5@=@kS%d*s;R6)Wlpjp$ZNqI3agH2{>w=~$p;m6MFeXzox)f75zU7p$SWWb| b?ce$@+?EFYrrMp600000NkvXXu0mjf7j{l` diff --git a/recipes/icons/new_scientist_mag.png b/recipes/icons/new_scientist_mag.png index 16523e4981c00ad151a38d7b7e0557f1f57d3a66..844c1e951ccf835fae1b3a2881b9d362f98720fb 100644 GIT binary patch delta 155 zcmV;M0A&A`0+a%ffq#BUL_t&-8GXS)5`r)gMZy1O$bf5KTZN56216QURqyMaqxjPlyH()*T91`^W~Ql?@sa9OY*x zXRs%$Xnp~#!0!%w%`89Q1J3I%8wr6)Li@B0N1HCEFaJLp-xmJ@`c(tohU=WM00000 LNkvXXu0mjf<;y~a diff --git a/recipes/icons/newslaundry.png b/recipes/icons/newslaundry.png index 342e059d0d300fea9fd81ebd87d0a2ac48038230..bcea93df6c399b187d498a3fd4c536e697270841 100644 GIT binary patch delta 146 zcmV;D0B!%C0-XYolYezdL_t&-(^bw%0)rqB1<~JNgD3=X!X$#+|CCwMspVT0003ZS zhDg8S;bDApih=k<$eC5M?HX01E&B07*qoM6N<$g6rWy AQ2+n{ delta 147 zcmV;E0BrxA0-geplYe$eL_t&-l~vA55`!QVL{XZrDCCJz$w!d=uhNtgUV7AZMpuY? z<~PBn9yABVz@}wMmVtKZ=`;twu61BAY}FSId!|?38OZTnM)?PyFBllJ9i_4|bHY2E zT_%E*psANPgof7JZ9qN{db@U@8N59TrDDAA1(DMP_q!vt4GaJP002ovPDHLkV1f=X BKz{%L diff --git a/recipes/icons/nikkeiasia.png b/recipes/icons/nikkeiasia.png index 966d9fd48526c52d3e26b3d5953e6f8a2a96699a..92f1ee523f71fe30d934758f7c2adb381a7fd5f1 100644 GIT binary patch delta 138 zcmcb?c#Uy_1SbnK0|Ud`yN`k%!Q#Lc?+pxV%o(3n4-&7A~$bq}NqWB~r?=PI+8|xDWr5gl6A-r24Np|ipqbh_ u0ov#c)JG!A)veUw{fo5Ts+O2_+&F#CW&zbAJ=sVA0000PZ!4!3CX7ixx)?{@UR@%s-yl-_1<#n0HL%+X$SpzFBlv& zKNhTFI%#9_#EOlMm$L7Eobbi-!vfVGOCPV4jNik1u56Ck=fiVlmVQV(Jln(1;h~P( z!9^2$%=j*y@l=0jC29Il$?g4&rOj`ey!q4L%y^n0zDM<_yiZodvGaW|B>&%G-@web U*unpN642!gp00i_>zopr0JRl&bpQYW delta 502 zcmVfDNkl%W;D+5Qcv;77{1ZLFgcK zV0B=Z;8YN&14^(vAQgmkKsq2D;0l6I(&$1is~JKN595h1Fryg{UhRJR_kp~+u5r)j z0e5~DfCXSR*3cJ$q@R`1s`ys`Uj!k59e_Q6wJ!qu*B5{aKn|b)P#CSsDF9w`4uAL} zhyX+Yq{BW0@G{`@LNGaiY)Gv(fTZA(Kpt(6TA*pe&vd@J0G+N0?U0}2- zjaCN$F@V!dfV6S29o1C70uDtY013T{M=EoogV+>jR3m$%Rq4(B82KW|0c?5-G9uWd zWp@FP%mN@Ozx#4eZMtn0rAVI$;cQ`8B{Y`R)bP`u8+RD5ct@gjVfN^o8pqmlx zl#!&{D+GHrS{=J4VL3Z64A;wgcruJ#}* ssCY5}@|HKBQTKu6R=fZ#0QY!)0H0C3l8(MU-~a#s07*qoM6N<$g5`7A8vpf*(6o#McYhQcp87G-EX;Y=4s#sN(U;!Jpuqk^aegP}Q2KWmskXW#Q!X_JpK$Haw zR3U+=8X`zH5LE#oQCc8TXOfv@GGDgu_}Z66T2!S{)KslGk{7ltok#Dv@9}HFp;|gw zo4?b|UNMEO@fgby=&8uN+#BWXBVT;#RQQZ5MF+5t^Ku+|v$1;a0WkjOat}YS*6sqI z0FiXKP?Wp?P_IY4{NnSJx{Z>S(RhOENvySGlY%%>w06c!#ftB*Z!u2tg9cKpnZn+{ zk`|@y9_}ZOm>E&cePfuI_W_ocmbm)e6;6gbbZ=ipnKrG?5YLnJ2AW#nvfE2(?IyhW z?ho|(82~d4@2%c2fA66cII5(o6P`ZLnYm|4w|~M5S82C4nVSj7CIz07xYEH_4?o#s zp8+8Rj+!A{yhwchbpXdYdsSMPYliF(G?6d)bE}UKqB;QK2*%pbj05)eGZs!ntPNH`lI9p~NK;cCfGZucBnJx?L8Gn+{0bGw^8%$LsW!x+M|(FVH)Vwi zxDJEy1lM)=F)1!}&e%uAxsC7BpzXKK~jFw+Gp zaA|cCnhl>@TZ3wCD5c=e_J|YH0h{d+PoJ5hENyiF0OuBCI=z(UOu%355vs}&l-9Dd zmmXxo?J>3}|I34w04P`D-_3=tBXFfdSg8#&gEl2n3ZlqknB?e5g?YgDC4=#VKuJ1# zDd!gBYV$y^pHSq6-*5F;T4?a=&D~?!(0$a#T5HzU*7*3NORQe|hT$k9@Fl4((AqpX z0Amar8yhSyFDGAK{^Dl0yK_Aby}wq7#l43?FlEh1QB^|d=!TO0000Y13Tf&T-^KL-~n?fwX$4VLlH@e&$!~|U5~Ah@A>fz z)MN;iU`^u4zc6xX_iqGM={}LReZ1r~Vb%R^r(qH%Q$feCY8AdGw*-0d!CO%P0000< KMNUMnLSTXmy-ei* diff --git a/recipes/icons/t_invariant_en.png b/recipes/icons/t_invariant_en.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ff44ae53ce5dc86f1303ac8a5315492b8150f7 GIT binary patch literal 896 zcmV-`1AqL9P)%&!@ox%Zyk!<@N{Lo+(ptDd)g9`^e0wf}qXwYbJ# z7&%DACftNSQ0f%ol?Et`8n@sBti_^KEL?4XfL6SKFR?lmTT?MyEr5~#Z^awfjt5h* z=}LfHEX9qu2OnVr?n=dmdV-7zFnM;=v@oL(p&5_jGpxaadigQtBr}#~I<}N7ey(Ej zoQMcF;6;3ar&6)ya%QliyR*@Hjrl ztEqU)MEsbLNFgw#l_k$stlUwucy-03Syex7#7jBIlc_lKQnsZglS9I^#ZlYZvW_i- z=0223rbbAx6mMZO?oY+*#sjJOD1|WON9&5H{oRsf>q=&}XTyF>!hJc!+h|M0VqF17 zf;2XB^COwNw+>qRT3OSAsvpzQnIGGiQ*r+2Y}De7d6X`s!mk z53l4PPo(1XbjTa^f9(o1&5LF&&os`s;5ARM1P^1*a4Ar%SKJuMN}TvP*xyz3_csOQ zbJc8D@C&-|DNYX88g&84DxBUQ^n92&v^_C!yjtr-9K^@ih~CjfPVsVA-FKLSI}$w` z6MYAR5sn?p_k2Bm>l7;gH%GD7zyl}wYiHs>SK?H65G&QdXYpNrJ^$D#42(BdaiW3C z{T$s@uzy41*zSUCpc;4(d$11Q;@qXwl*Ne%_Rrqnz7!Fu!CF2$ivA)DxS7ROt4|B;~g>w-TwCeHR;AlM0fm6vJV zokF=*k;eo$y)XFTu?DAp4Pv<(xDVgw`@9FAmU%_%G13U%&!@ox%Zyk!<@N{Lo+(ptDd)g9`^e0wf}qXwYbJ# z7&%DACftNSQ0f%ol?Et`8n@sBti_^KEL?4XfL6SKFR?lmTT?MyEr5~#Z^awfjt5h* z=}LfHEX9qu2OnVr?n=dmdV-7zFnM;=v@oL(p&5_jGpxaadigQtBr}#~I<}N7ey(Ej zoQMcF;6;3ar&6)ya%QliyR*@Hjrl ztEqU)MEsbLNFgw#l_k$stlUwucy-03Syex7#7jBIlc_lKQnsZglS9I^#ZlYZvW_i- z=0223rbbAx6mMZO?oY+*#sjJOD1|WON9&5H{oRsf>q=&}XTyF>!hJc!+h|M0VqF17 zf;2XB^COwNw+>qRT3OSAsvpzQnIGGiQ*r+2Y}De7d6X`s!mk z53l4PPo(1XbjTa^f9(o1&5LF&&os`s;5ARM1P^1*a4Ar%SKJuMN}TvP*xyz3_csOQ zbJc8D@C&-|DNYX88g&84DxBUQ^n92&v^_C!yjtr-9K^@ih~CjfPVsVA-FKLSI}$w` z6MYAR5sn?p_k2Bm>l7;gH%GD7zyl}wYiHs>SK?H65G&QdXYpNrJ^$D#42(BdaiW3C z{T$s@uzy41*zSUCpc;4(d$11Q;@qXwl*Ne%_Rrqnz7!Fu!CF2$ivA)DxS7ROt4|B;~g>w-TwCeHR;AlM0fm6vJV zokF=*k;eo$y)XFTu?DAp4Pv<(xDVgw`@9FAmU%_%G13U%&!@ox%Zyk!<@N{Lo+(ptDd)g9`^e0wf}qXwYbJ# z7&%DACftNSQ0f%ol?Et`8n@sBti_^KEL?4XfL6SKFR?lmTT?MyEr5~#Z^awfjt5h* z=}LfHEX9qu2OnVr?n=dmdV-7zFnM;=v@oL(p&5_jGpxaadigQtBr}#~I<}N7ey(Ej zoQMcF;6;3ar&6)ya%QliyR*@Hjrl ztEqU)MEsbLNFgw#l_k$stlUwucy-03Syex7#7jBIlc_lKQnsZglS9I^#ZlYZvW_i- z=0223rbbAx6mMZO?oY+*#sjJOD1|WON9&5H{oRsf>q=&}XTyF>!hJc!+h|M0VqF17 zf;2XB^COwNw+>qRT3OSAsvpzQnIGGiQ*r+2Y}De7d6X`s!mk z53l4PPo(1XbjTa^f9(o1&5LF&&os`s;5ARM1P^1*a4Ar%SKJuMN}TvP*xyz3_csOQ zbJc8D@C&-|DNYX88g&84DxBUQ^n92&v^_C!yjtr-9K^@ih~CjfPVsVA-FKLSI}$w` z6MYAR5sn?p_k2Bm>l7;gH%GD7zyl}wYiHs>SK?H65G&QdXYpNrJ^$D#42(BdaiW3C z{T$s@uzy41*zSUCpc;4(d$11Q;@qXwl*Ne%_Rrqnz7!Fu!CF2$ivA)DxS7ROt4|B;~g>w-TwCeHR;AlM0fm6vJV zokF=*k;eo$y)XFTu?DAp4Pv<(xDVgw`@9FAmU%_%G13UfNB^wqW4L+Rms ziP0Nt4OPl8PT(5;W{;f>E#m5MQ$i!gn{v8@gt$MRzR9g(^?E}tY=#1#$R>Ot1yJZDZS`huI>e=N7cV7fOLx~1d00000NkvXXu0mjfF|0af delta 141 zcmV;80CNA60-gepnSXFeL_t&-m5q-{4udcd1e@R;v&1$#goOV;66A<6N9xw49<>H| z0ONJ@cFqVX#ozbl-I)#(jnFHq3YprASrPNE%|;*<3x=4CZH6f6yWHXuy5<@yX? vcN6w^j@y*WEK-u#Uy+?el}D;4j{*mGUj#j)h}MPx0000fNB^wqW4L+Rms ziP0Nt4OPl8PT(5;W{;f>E#m5MQ$i!gn{v8@gt$MRzR9g(^?E}tY=#1#$R>Ot1yJZDZS`huI>e=N7cV7fOLx~1d00000NkvXXu0mjfF|0af delta 141 zcmV;80CNA60-gepnSXFeL_t&-m5q-{4udcd1e@R;v&1$#goOV;66A<6N9xw49<>H| z0ONJ@cFqVX#ozbl-I)#(jnFHq3YprASrPNE%|;*<3x=4CZH6f6yWHXuy5<@yX? vcN6w^j@y*WEK-u#Uy+?el}D;4j{*mGUj#j)h}MPx0000!4LsCLQ zQc}XgVj)uuj{qZEo=R>4Bik*m4+e%tpFRnEVdP_A@JV85HFzHO3uqjJr>mdKI;Vst E01*ru$^ZZW diff --git a/recipes/icons/tls_mag.png b/recipes/icons/tls_mag.png index de3e20b53107d775e74163b7841081be13affc4b..21391b1fecf81976b304ef63bf3999852fc4e81f 100644 GIT binary patch delta 110 zcmV-!0FnRd0q6mcfoD=lL_t&-SFMXV5`Z8Oz_Kfc;(_9U`u~SoNJCG`Oae`Cz8}H} zI?W3J(XLSi2EV00=?p61_T#Jsa#0JFTrZm~$!$?d+3miF;~}K(RJJ!~g&Q delta 112 zcmV-$0FVFZ0qOyefoW7pL_t&-m95XW7JwiW1JLkjf(2=!{{M$sU|}cYJ;@MYNR*z8 zodH_b?FT1!M+`99hg#tRAE=me2Ve(!AXfT`m#uQj7eY}{H%J$3;2F2DV~#vi5CWST SI0$0^0000Us113<~LosQnp{@*LZ@~*GPKDT1L+3ID zkNhJ8nHFeQ@(L&e!z0i0wVkkw#jLW7?uqs002ovPDHLkV1j*dOJo25 diff --git a/recipes/icons/toiprint.png b/recipes/icons/toiprint.png index 26da33fff69fee0cccae7ec62f9b67947043a694..1c6911c2b7352dab42850992fb3c8731b110b8b9 100644 GIT binary patch delta 161 zcmV;S0AByG0Us113<~LosQnp{@*LZ@~*GPKDT1L+3ID zkNhJ8nHFeQ@(L&e!z0i0wVkkw#jLW7?uqs002ovPDHLkV1j*dOJo25 diff --git a/recipes/icons/wicomix.png b/recipes/icons/wicomix.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccd38d2f3734514241eaf07f05cec3aabaca18f GIT binary patch literal 512 zcmV+b0{{JqP)6mk6MCDgjljGE z`E(Z>p}Pu0XQ2i<5(`5|te_(rRJu!~fDR-g*KvTry6-@vVY{81-Pt#DLa5q0&|*h> z;fnC{pR1^8RaqJSb?E7lRML(t}+j73@ zA#LN3fl#)w2C~$T@C07gJ?b=vUwHN9h+vOKQwGQk3SWxo3X+yUffm+@2;?fnOS)tr zNmJ)kgo#XeN14$^FW+tK*cCR0VS3> zqXkd{16rHs8_3jIrVSnmH~FiBe1Xc+0WS>|p|i|Gnyk15mJQ@g*mLv}n`E;*7L5^-rbeESX@Z&sqMT$D=_%{ss`D~Dtpf7d2lT-#N3nfj!;#SMG zP?_B7fyHYplT{3Ml^wL#F}Oi}{0(X&%FVF<{SMz1zw|2Z*sO~H0000 zqcB>)#$fYo6pzlVa|UdPwGBPjQ&=_*-@)&tjN=|#YM_q6x=NODV=9w+Z{QNo?!imX zhgz8&U|F7-X`<&x*gVi2@oD$#vCEP_lY^k~4YY_CjmpXYxxf2gZdVF+pW&0t00000 LNkvXXu0mjf<=AKS delta 213 zcmV;`04o3b0{#M!v46NpL_t&-m1U1@Z-X!pgU^>Y5)uMUDTTI_Le`G`{~x$Wlcs6) zH(P#mXA+9(SF8jnNq;02F_~yINl7*9s#ub3cSy(nG`RCPRRy~sTyY!cJ0!9#g{8X< zxXj`KhSx;eI~`{wuy<;mV+owEwd=7S+_GW#32aVj9J6mxeom+hVp{kOAx+|=Aro*k zPn>!@#fo4GgY=3B6D&U6R_->tf9ZVQGcWP0G?*IOkYu(jsWSXN?*II6ZdVF+SoG4D P00000NkvXXu0mjf$sAv- diff --git a/recipes/poligon.recipe b/recipes/poligon.recipe new file mode 100644 index 0000000000..1a799888fb --- /dev/null +++ b/recipes/poligon.recipe @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +from __future__ import absolute_import, division, print_function, unicode_literals + +from calibre.web.feeds.news import BasicNewsRecipe + + +class Poligon(BasicNewsRecipe): + title = '\u041F\u043E\u043B\u0438\u0433\u043E\u043D' + __author__ = 'bugmen00t' + description = '\u041D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0435 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0438\u0437\u0434\u0430\u043D\u0438\u0435, \u0432\u044B\u043F\u0443\u0441\u043A\u0430\u0435\u043C\u043E\u0435 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u0430\u043C\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0438\u0437\u0434\u0430\u043D\u0438\u0439, \u043F\u043E\u0434\u0432\u0435\u0440\u0433\u0448\u0438\u0445\u0441\u044F \u0434\u0430\u0432\u043B\u0435\u043D\u0438\u044E \u0441\u043E \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u0433\u043E\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0430. \u041F\u0438\u0448\u0435\u043C \u043E \u0420\u043E\u0441\u0441\u0438\u0438 \u0438 \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E.' # noqa + publisher = 'poligon.media' + category = 'news' + cover_url = u'https://www.plgnmedia.io/wp-content/uploads/2022/02/poligon-share.png' + language = 'ru' + no_stylesheets = False + remove_javascript = False + auto_cleanup = False + oldest_article = 14 + max_articles_per_feed = 10 + + remove_tags_after = dict(name='article') + + feeds = [ + ('\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B', 'https://poligonmedia.io/feed/'), + ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://poligonmedia.io/category/news/feed/'), + ('\u0418\u043D\u0442\u0435\u0440\u0432\u044C\u044E', 'https://poligonmedia.io/category/int/feed/'), + ('\u0420\u0430\u0441\u043A\u043B\u0430\u0434', 'https://poligonmedia.io/category/rasklad/feed/'), + ('\u0420\u0430\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u044F', 'https://poligonmedia.io/category/rassled/feed/'), + ('\u0420\u0435\u043F\u043E\u0440\u0442\u0430\u0436', 'https://poligonmedia.io/category/reportazh/feed/'), + ('\u041C\u043E\u0436\u0435\u043C \u043E\u0431\u044A\u044F\u0441\u043D\u0438\u0442\u044C', 'https://poligonmedia.io/category/mozhem-obyasnit/feed/'), + ('\u0418\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u044F', 'https://poligonmedia.io/category/issledovaniya/feed/'), + ('English', 'https://poligon.media/category/eng/feed/') + ] diff --git a/recipes/t_invariant_en.recipe b/recipes/t_invariant_en.recipe new file mode 100644 index 0000000000..bb09638156 --- /dev/null +++ b/recipes/t_invariant_en.recipe @@ -0,0 +1,171 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +from __future__ import absolute_import, division, print_function, unicode_literals + +from calibre.web.feeds.news import BasicNewsRecipe + + +class TInvariant(BasicNewsRecipe): + title = 'T-Invariant' + __author__ = 'bugmen00t' + description = 'T-Invariant is a multimedia project of scientists and science journalists. Our task is to be a bridge between the academic community in Russia and outside Russia. Let’s keep in touch!' # noqa + publisher = '\u0422-\u0438\u043D\u0432\u0430\u0440\u0438\u0430\u043D\u0442 / T-invariant' + category = 'news' + cover_url = u'https://t-invariant.org/wp-content/uploads/2023/02/logo-s.png' +# cover_url = u'https://tinyurl.com/t-invariant/wp-content/uploads/2023/02/logo-s.png' +# language = 'ru' + language = 'en_RU' +# language = 'uk' +# language = 'de' +# language = 'he' + no_stylesheets = False + remove_javascript = False + auto_cleanup = False + oldest_article = 45 + max_articles_per_feed = 15 + + remove_tags_before = dict(name='h1') + + remove_tags_after = dict(name='article') + + remove_tags = [ + dict(name='div', attrs={'class': 'media mg-info-author-block'}), + dict(name='div', attrs={'class': 'mg-blog-category mb-1'}), + dict(name='span', attrs={'class': 'newses-tags'}), + dict(name='div', attrs={'class': 'post-share'}), + dict(name='h4') + ] + + feeds = [ +# Russian version +# +# Direct links +# +# ('\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B', ‘https://www.t-invariant.org/feed/'), +# ('\u0410\u0440\u0445\u0438\u0432', ‘https://www.t-invariant.org/category/online/feed/'), +# ('\u0410\u0441\u0442\u0440\u043E\u043D\u043E\u043C\u0438\u044F', ‘https://www.t-invariant.org/category/astronomy/feed/'), +# ('\u0411\u0438\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/biologiya/feed/'), +# ('\u0412\u043E\u0439\u043D\u0430', ‘https://www.t-invariant.org/category/war/feed/'), +# ('\u0412\u0441\u0451 \u0441\u043B\u043E\u0436\u043D\u043E', ‘https://www.t-invariant.org/category/vsyo-slozhno/feed/'), +# ('\u0414\u0432\u0430 \u0433\u043E\u0434\u0430 \u0432\u043E\u0439\u043D\u0435', ‘https://www.t-invariant.org/category/dva-goda-vojne/feed/'), +# ('\u0414\u0432\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043E\u0434\u043D\u043E\u0439 \u043D\u0430\u0443\u043A\u0438', ‘https://www.t-invariant.org/category/dve-storony-odnoj-nauki/feed/'), +# ('\u0414\u0438\u0441\u043A\u0443\u0441\u0441\u0438\u0438', ‘https://www.t-invariant.org/category/discussion/feed/'), +# ('\u0414\u0438\u0441\u0441\u0435\u0440\u043D\u0435\u0442', ‘https://www.t-invariant.org/category/dissernet/feed/'), +# ('\u0418\u0418', ‘https://www.t-invariant.org/category/ai/feed/'), +# ('\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/computer-science/feed/'), +# ('\u0418\u0441\u0442\u043E\u0440\u0438\u044F', ‘https://www.t-invariant.org/category/history/feed/'), +# ('\u041A\u043B\u0438\u043C\u0430\u0442', ‘https://www.t-invariant.org/category/climate-ru/feed/'), +# ('\u041A\u043E\u043D\u0442\u0440\u044D\u0432\u043E\u043B\u044E\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/kontrevolyutsiya/feed/'), +# ('\u041A\u043E\u0440\u0440\u0443\u043F\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/korruptsiya/feed/'), +# ('\u041B\u0436\u0435\u043D\u0430\u0443\u043A\u0430', ‘https://www.t-invariant.org/category/pseudoscience/feed/'), +# ('\u041C\u0430\u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/mathematics/feed/'), +# ('\u041C\u043E\u0437\u0433', ‘https://www.t-invariant.org/category/brain/feed/'), +# ('\u041D\u0430\u0443\u043A\u0430 \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435', ‘https://www.t-invariant.org/category/ukrainian-science/feed/'), +# ('\u041D\u0430\u0443\u0447\u043D\u0430\u044F \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/science-policy-ru/feed/'), +# ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', ‘https://www.t-invariant.org/category/news/feed/'), +# ('\u041E\u043F\u0440\u043E\u0441', ‘https://www.t-invariant.org/category/survey-ru/feed/'), +# ('\u041F\u043E\u0437\u0438\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/standpiont/feed/'), +# ('\u041F\u043E\u043B\u0438\u0442\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/political-science/feed/'), +# ('\u041F\u043E\u043F\u0443\u043B\u044F\u0440\u0438\u0437\u0430\u0446\u0438\u044F \u043D\u0430\u0443\u043A\u0438', ‘https://www.t-invariant.org/category/popular-science/feed/'), +# ('\u041F\u0440\u0430\u0432\u043E', ‘https://www.t-invariant.org/category/pravo/feed/'), +# ('\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441', ‘https://www.t-invariant.org/category/progress/feed/'), +# ('\u041F\u0441\u0438\u0445\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/psihologiya/feed/'), +# ('\u0420\u0410\u041D', ‘https://www.t-invariant.org/category/ras/feed/'), +# ('\u0420\u0435\u043B\u0438\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/religion/feed/'), +# ('\u0420\u0435\u043B\u043E\u043A\u0430\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/relocation/feed/'), +# ('\u0420\u0435\u043F\u0440\u0435\u0441\u0441\u0438\u0438', ‘https://www.t-invariant.org/category/repression/feed/'), +# ('\u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043A', ‘https://www.t-invariant.org/category/russian-language/feed/'), +# ('\u0421\u0430\u043D\u043A\u0446\u0438\u0438', ‘https://www.t-invariant.org/category/sanctions/feed/'), +# ('\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u0438', ‘https://www.t-invariant.org/category/creators/feed/'), +# ('\u0421\u043E\u0446\u0438\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/sociology/feed/'), +# ('\u0422\u0435\u0440\u0440\u043E\u0440\u0438\u0437\u043C', ‘https://www.t-invariant.org/category/terrorizm/feed/'), +# ('\u0423\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u044B', ‘https://www.t-invariant.org/category/universities/feed/'), +# ('\u0424\u0438\u0437\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/physics/feed/'), +# ('\u0424\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F', ‘https://www.t-invariant.org/category/philosophy/feed/'), +# ('\u0428\u043A\u043E\u043B\u0430', ‘https://www.t-invariant.org/category/shkola/feed/'), +# ('\u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043D\u0430\u0443\u043A\u0438', ‘https://www.t-invariant.org/category/science-assessment/feed/'), +# ('\u042D\u043D\u0435\u0440\u0433\u0435\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/energy/feed/'), +# ('\u042D\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/ethics/feed/'), +# +# Censorship bypass +# +# ('\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B', 'https://tinyurl.com/t-invariant/feed/'), +# ('\u0410\u0440\u0445\u0438\u0432', 'https://tinyurl.com/t-invariant/category/online/feed/'), +# ('\u0410\u0441\u0442\u0440\u043E\u043D\u043E\u043C\u0438\u044F', 'https://tinyurl.com/t-invariant/category/astronomy/feed/'), +# ('\u0411\u0438\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/biologiya/feed/'), +# ('\u0412\u043E\u0439\u043D\u0430', 'https://tinyurl.com/t-invariant/category/war/feed/'), +# ('\u0412\u0441\u0451 \u0441\u043B\u043E\u0436\u043D\u043E', 'https://tinyurl.com/t-invariant/category/vsyo-slozhno/feed/'), +# ('\u0414\u0432\u0430 \u0433\u043E\u0434\u0430 \u0432\u043E\u0439\u043D\u0435', 'https://tinyurl.com/t-invariant/category/dva-goda-vojne/feed/'), +# ('\u0414\u0432\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043E\u0434\u043D\u043E\u0439 \u043D\u0430\u0443\u043A\u0438', 'https://tinyurl.com/t-invariant/category/dve-storony-odnoj-nauki/feed/'), +# ('\u0414\u0438\u0441\u043A\u0443\u0441\u0441\u0438\u0438', 'https://tinyurl.com/t-invariant/category/discussion/feed/'), +# ('\u0414\u0438\u0441\u0441\u0435\u0440\u043D\u0435\u0442', 'https://tinyurl.com/t-invariant/category/dissernet/feed/'), +# ('\u0418\u0418', 'https://tinyurl.com/t-invariant/category/ai/feed/'), +# ('\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/computer-science/feed/'), +# ('\u0418\u0441\u0442\u043E\u0440\u0438\u044F', 'https://tinyurl.com/t-invariant/category/history/feed/'), +# ('\u041A\u043B\u0438\u043C\u0430\u0442', 'https://tinyurl.com/t-invariant/category/climate-ru/feed/'), +# ('\u041A\u043E\u043D\u0442\u0440\u044D\u0432\u043E\u043B\u044E\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/kontrevolyutsiya/feed/'), +# ('\u041A\u043E\u0440\u0440\u0443\u043F\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/korruptsiya/feed/'), +# ('\u041B\u0436\u0435\u043D\u0430\u0443\u043A\u0430', 'https://tinyurl.com/t-invariant/category/pseudoscience/feed/'), +# ('\u041C\u0430\u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/mathematics/feed/'), +# ('\u041C\u043E\u0437\u0433', 'https://tinyurl.com/t-invariant/category/brain/feed/'), +# ('\u041D\u0430\u0443\u043A\u0430 \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435', 'https://tinyurl.com/t-invariant/category/ukrainian-science/feed/'), +# ('\u041D\u0430\u0443\u0447\u043D\u0430\u044F \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/science-policy-ru/feed/'), +# ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://tinyurl.com/t-invariant/category/news/feed/'), +# ('\u041E\u043F\u0440\u043E\u0441', 'https://tinyurl.com/t-invariant/category/survey-ru/feed/'), +# ('\u041F\u043E\u0437\u0438\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/standpiont/feed/'), +# ('\u041F\u043E\u043B\u0438\u0442\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/political-science/feed/'), +# ('\u041F\u043E\u043F\u0443\u043B\u044F\u0440\u0438\u0437\u0430\u0446\u0438\u044F \u043D\u0430\u0443\u043A\u0438', 'https://tinyurl.com/t-invariant/category/popular-science/feed/'), +# ('\u041F\u0440\u0430\u0432\u043E', 'https://tinyurl.com/t-invariant/category/pravo/feed/'), +# ('\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441', 'https://tinyurl.com/t-invariant/category/progress/feed/'), +# ('\u041F\u0441\u0438\u0445\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/psihologiya/feed/'), +# ('\u0420\u0410\u041D', 'https://tinyurl.com/t-invariant/category/ras/feed/'), +# ('\u0420\u0435\u043B\u0438\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/religion/feed/'), +# ('\u0420\u0435\u043B\u043E\u043A\u0430\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/relocation/feed/'), +# ('\u0420\u0435\u043F\u0440\u0435\u0441\u0441\u0438\u0438', 'https://tinyurl.com/t-invariant/category/repression/feed/'), +# ('\u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043A', 'https://tinyurl.com/t-invariant/category/russian-language/feed/'), +# ('\u0421\u0430\u043D\u043A\u0446\u0438\u0438', 'https://tinyurl.com/t-invariant/category/sanctions/feed/'), +# ('\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u0438', 'https://tinyurl.com/t-invariant/category/creators/feed/'), +# ('\u0421\u043E\u0446\u0438\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/sociology/feed/'), +# ('\u0422\u0435\u0440\u0440\u043E\u0440\u0438\u0437\u043C', 'https://tinyurl.com/t-invariant/category/terrorizm/feed/'), +# ('\u0423\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u044B', 'https://tinyurl.com/t-invariant/category/universities/feed/'), +# ('\u0424\u0438\u0437\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/physics/feed/'), +# ('\u0424\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F', 'https://tinyurl.com/t-invariant/category/philosophy/feed/'), +# ('\u0428\u043A\u043E\u043B\u0430', 'https://tinyurl.com/t-invariant/category/shkola/feed/'), +# ('\u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043D\u0430\u0443\u043A\u0438', 'https://tinyurl.com/t-invariant/category/science-assessment/feed/'), +# ('\u042D\u043D\u0435\u0440\u0433\u0435\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/energy/feed/'), +# ('\u042D\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/ethics/feed/'), +# +# English version +# +# ('T-invariant (English)', 'https://www.t-invariant.org/en/feed/'), +# +# Censorship bypass +# + ('T-invariant (English)', 'https://tinyurl.com/t-invariant/en/feed/'), +# +# Ukrainian version +# +# ('T-invariant (\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430)', 'https://www.t-invariant.org/uk/feed/'), +# +# Censorship bypass +# +# ('T-invariant (\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430)', 'https://tinyurl.com/t-invariant/uk/feed/'), +# +# German version +# +# ('T-invariant (Deutsch)', 'https://www.t-invariant.org/de/feed/'), +# +# Censorship bypass +# +# ('T-invariant (Deutsch)', 'https://tinyurl.com/t-invariant/de/feed/'), +# +# Hebrew version +# +# ('T-invariant (\u05E2\u05D1\u05E8\u05D9\u05EA)', 'https://www.t-invariant.org/he/feed/'), +# +# Censorship bypass +# +# ('T-invariant (\u05E2\u05D1\u05E8\u05D9\u05EA)', 'https://tinyurl.com/t-invariant/he/feed/'), +# + ] diff --git a/recipes/t_invariant_ru.recipe b/recipes/t_invariant_ru.recipe new file mode 100644 index 0000000000..b005182bfa --- /dev/null +++ b/recipes/t_invariant_ru.recipe @@ -0,0 +1,173 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +from __future__ import absolute_import, division, print_function, unicode_literals + +from calibre.web.feeds.news import BasicNewsRecipe + + +class TInvariant(BasicNewsRecipe): + title = 'T-Invariant' + __author__ = 'bugmen00t' + description = '\u041C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0439\u043D\u044B\u0439 \u043F\u0440\u043E\u0435\u043A\u0442 \u0443\u0447\u0435\u043D\u044B\u0445 \u0438 \u043D\u0430\u0443\u0447\u043D\u044B\u0445 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u043E\u0432.' # noqa + publisher = '\u0422-\u0438\u043D\u0432\u0430\u0440\u0438\u0430\u043D\u0442 / T-invariant' + category = 'news' +# cover_url = u'https://t-invariant.org/wp-content/uploads/2023/02/logo-s.png' + cover_url = u'https://tinyurl.com/t-invariant/wp-content/uploads/2023/02/logo-s.png' + language = 'ru' +# language = 'en_RU' +# language = 'uk' +# language = 'de' +# language = 'he' + no_stylesheets = False + remove_javascript = False + auto_cleanup = False + oldest_article = 45 + max_articles_per_feed = 15 + + remove_tags_before = dict(name='h1') + + remove_tags_after = dict(name='article') + + remove_tags = [ + dict(name='div', attrs={'class': 'media mg-info-author-block'}), + dict(name='div', attrs={'class': 'mg-blog-category mb-1'}), + dict(name='span', attrs={'class': 'newses-tags'}), + dict(name='div', attrs={'class': 'post-share'}), + dict(name='h4') + ] + + feeds = [ +# Russian version +# +# Direct links +# +# ('\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B', ‘https://www.t-invariant.org/feed/'), +# ('\u0410\u0440\u0445\u0438\u0432', ‘https://www.t-invariant.org/category/online/feed/'), +# ('\u0410\u0441\u0442\u0440\u043E\u043D\u043E\u043C\u0438\u044F', ‘https://www.t-invariant.org/category/astronomy/feed/'), +# ('\u0411\u0438\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/biologiya/feed/'), +# ('\u0412\u043E\u0439\u043D\u0430', ‘https://www.t-invariant.org/category/war/feed/'), +# ('\u0412\u0441\u0451 \u0441\u043B\u043E\u0436\u043D\u043E', ‘https://www.t-invariant.org/category/vsyo-slozhno/feed/'), +# ('\u0414\u0432\u0430 \u0433\u043E\u0434\u0430 \u0432\u043E\u0439\u043D\u0435', ‘https://www.t-invariant.org/category/dva-goda-vojne/feed/'), +# ('\u0414\u0432\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043E\u0434\u043D\u043E\u0439 \u043D\u0430\u0443\u043A\u0438', ‘https://www.t-invariant.org/category/dve-storony-odnoj-nauki/feed/'), +# ('\u0414\u0438\u0441\u043A\u0443\u0441\u0441\u0438\u0438', ‘https://www.t-invariant.org/category/discussion/feed/'), +# ('\u0414\u0438\u0441\u0441\u0435\u0440\u043D\u0435\u0442', ‘https://www.t-invariant.org/category/dissernet/feed/'), +# ('\u0418\u0418', ‘https://www.t-invariant.org/category/ai/feed/'), +# ('\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/computer-science/feed/'), +# ('\u0418\u0441\u0442\u043E\u0440\u0438\u044F', ‘https://www.t-invariant.org/category/history/feed/'), +# ('\u041A\u043B\u0438\u043C\u0430\u0442', ‘https://www.t-invariant.org/category/climate-ru/feed/'), +# ('\u041A\u043E\u043D\u0442\u0440\u044D\u0432\u043E\u043B\u044E\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/kontrevolyutsiya/feed/'), +# ('\u041A\u043E\u0440\u0440\u0443\u043F\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/korruptsiya/feed/'), +# ('\u041B\u0436\u0435\u043D\u0430\u0443\u043A\u0430', ‘https://www.t-invariant.org/category/pseudoscience/feed/'), +# ('\u041C\u0430\u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/mathematics/feed/'), +# ('\u041C\u043E\u0437\u0433', ‘https://www.t-invariant.org/category/brain/feed/'), +# ('\u041D\u0430\u0443\u043A\u0430 \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435', ‘https://www.t-invariant.org/category/ukrainian-science/feed/'), +# ('\u041D\u0430\u0443\u0447\u043D\u0430\u044F \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/science-policy-ru/feed/'), +# ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', ‘https://www.t-invariant.org/category/news/feed/'), +# ('\u041E\u043F\u0440\u043E\u0441', ‘https://www.t-invariant.org/category/survey-ru/feed/'), +# ('\u041F\u043E\u0437\u0438\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/standpiont/feed/'), +# ('\u041F\u043E\u043B\u0438\u0442\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/political-science/feed/'), +# ('\u041F\u043E\u043F\u0443\u043B\u044F\u0440\u0438\u0437\u0430\u0446\u0438\u044F \u043D\u0430\u0443\u043A\u0438', ‘https://www.t-invariant.org/category/popular-science/feed/'), +# ('\u041F\u0440\u0430\u0432\u043E', ‘https://www.t-invariant.org/category/pravo/feed/'), +# ('\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441', ‘https://www.t-invariant.org/category/progress/feed/'), +# ('\u041F\u0441\u0438\u0445\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/psihologiya/feed/'), +# ('\u0420\u0410\u041D', ‘https://www.t-invariant.org/category/ras/feed/'), +# ('\u0420\u0435\u043B\u0438\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/religion/feed/'), +# ('\u0420\u0435\u043B\u043E\u043A\u0430\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/relocation/feed/'), +# ('\u0420\u0435\u043F\u0440\u0435\u0441\u0441\u0438\u0438', ‘https://www.t-invariant.org/category/repression/feed/'), +# ('\u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043A', ‘https://www.t-invariant.org/category/russian-language/feed/'), +# ('\u0421\u0430\u043D\u043A\u0446\u0438\u0438', ‘https://www.t-invariant.org/category/sanctions/feed/'), +# ('\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u0438', ‘https://www.t-invariant.org/category/creators/feed/'), +# ('\u0421\u043E\u0446\u0438\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/sociology/feed/'), +# ('\u0422\u0435\u0440\u0440\u043E\u0440\u0438\u0437\u043C', ‘https://www.t-invariant.org/category/terrorizm/feed/'), +# ('\u0423\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u044B', ‘https://www.t-invariant.org/category/universities/feed/'), +# ('\u0424\u0438\u0437\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/physics/feed/'), +# ('\u0424\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F', ‘https://www.t-invariant.org/category/philosophy/feed/'), +# ('\u0428\u043A\u043E\u043B\u0430', ‘https://www.t-invariant.org/category/shkola/feed/'), +# ('\u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043D\u0430\u0443\u043A\u0438', ‘https://www.t-invariant.org/category/science-assessment/feed/'), +# ('\u042D\u043D\u0435\u0440\u0433\u0435\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/energy/feed/'), +# ('\u042D\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/ethics/feed/'), +# +# Censorship bypass +# +# ('\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B', 'https://tinyurl.com/t-invariant/feed/'), + ('\u0410\u0440\u0445\u0438\u0432', 'https://tinyurl.com/t-invariant/category/online/feed/'), + ('\u0410\u0441\u0442\u0440\u043E\u043D\u043E\u043C\u0438\u044F', 'https://tinyurl.com/t-invariant/category/astronomy/feed/'), + ('\u0411\u0438\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/biologiya/feed/'), + ('\u0412\u043E\u0439\u043D\u0430', 'https://tinyurl.com/t-invariant/category/war/feed/'), + ('\u0412\u0441\u0451 \u0441\u043B\u043E\u0436\u043D\u043E', 'https://tinyurl.com/t-invariant/category/vsyo-slozhno/feed/'), + ('\u0414\u0432\u0430 \u0433\u043E\u0434\u0430 \u0432\u043E\u0439\u043D\u0435', 'https://tinyurl.com/t-invariant/category/dva-goda-vojne/feed/'), + ('\u0414\u0432\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043E\u0434\u043D\u043E\u0439 \u043D\u0430\u0443\u043A\u0438', 'https://tinyurl.com/t-invariant/category/dve-storony-odnoj-nauki/feed/'), + ('\u0414\u0438\u0441\u043A\u0443\u0441\u0441\u0438\u0438', 'https://tinyurl.com/t-invariant/category/discussion/feed/'), + ('\u0414\u0438\u0441\u0441\u0435\u0440\u043D\u0435\u0442', 'https://tinyurl.com/t-invariant/category/dissernet/feed/'), + ('\u0418\u0418', 'https://tinyurl.com/t-invariant/category/ai/feed/'), + ('\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/computer-science/feed/'), + ('\u0418\u0441\u0442\u043E\u0440\u0438\u044F', 'https://tinyurl.com/t-invariant/category/history/feed/'), + ('\u041A\u043B\u0438\u043C\u0430\u0442', 'https://tinyurl.com/t-invariant/category/climate-ru/feed/'), + ('\u041A\u043E\u043D\u0442\u0440\u044D\u0432\u043E\u043B\u044E\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/kontrevolyutsiya/feed/'), + ('\u041A\u043E\u0440\u0440\u0443\u043F\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/korruptsiya/feed/'), + ('\u041B\u0436\u0435\u043D\u0430\u0443\u043A\u0430', 'https://tinyurl.com/t-invariant/category/pseudoscience/feed/'), + ('\u041C\u0430\u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/mathematics/feed/'), + ('\u041C\u043E\u0437\u0433', 'https://tinyurl.com/t-invariant/category/brain/feed/'), + ('\u041D\u0430\u0443\u043A\u0430 \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435', 'https://tinyurl.com/t-invariant/category/ukrainian-science/feed/'), + ('\u041D\u0430\u0443\u0447\u043D\u0430\u044F \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/science-policy-ru/feed/'), + ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://tinyurl.com/t-invariant/category/news/feed/'), + ('\u041E\u043F\u0440\u043E\u0441', 'https://tinyurl.com/t-invariant/category/survey-ru/feed/'), + ('\u041E\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u0437\u0430\u043F\u0438\u0441\u043A\u0438 \u0438\u0437 \u043F\u043E\u0434\u043F\u043E\u043B\u044C\u044F', 'https://tinyurl.com/t-invariant/category/story/feed/'), # noqa + ('\u041F\u043E\u0437\u0438\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/standpiont/feed/'), + ('\u041F\u043E\u043B\u0438\u0442\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/political-science/feed/'), + ('\u041F\u043E\u043F\u0443\u043B\u044F\u0440\u0438\u0437\u0430\u0446\u0438\u044F \u043D\u0430\u0443\u043A\u0438', 'https://tinyurl.com/t-invariant/category/popular-science/feed/'), + ('\u041F\u0440\u0430\u0432\u043E', 'https://tinyurl.com/t-invariant/category/pravo/feed/'), + ('\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441', 'https://tinyurl.com/t-invariant/category/progress/feed/'), + ('\u041F\u0441\u0438\u0445\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/psihologiya/feed/'), + ('\u0420\u0410\u041D', 'https://tinyurl.com/t-invariant/category/ras/feed/'), + ('\u0420\u0435\u043B\u0438\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/religion/feed/'), + ('\u0420\u0435\u043B\u043E\u043A\u0430\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/relocation/feed/'), + ('\u0420\u0435\u043F\u0440\u0435\u0441\u0441\u0438\u0438', 'https://tinyurl.com/t-invariant/category/repression/feed/'), + ('\u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043A', 'https://tinyurl.com/t-invariant/category/russian-language/feed/'), + ('\u0421\u0430\u043D\u043A\u0446\u0438\u0438', 'https://tinyurl.com/t-invariant/category/sanctions/feed/'), + ('\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u0438', 'https://tinyurl.com/t-invariant/category/creators/feed/'), + ('\u0421\u043E\u0446\u0438\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/sociology/feed/'), + ('\u0422\u0435\u0440\u0440\u043E\u0440\u0438\u0437\u043C', 'https://tinyurl.com/t-invariant/category/terrorizm/feed/'), + ('\u0423\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u044B', 'https://tinyurl.com/t-invariant/category/universities/feed/'), + ('\u0424\u0438\u0437\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/physics/feed/'), + ('\u0424\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F', 'https://tinyurl.com/t-invariant/category/philosophy/feed/'), + ('\u0425\u0440\u043E\u043D\u0438\u043A\u0438 \u043F\u0440\u0435\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u044F \u0443\u0447\u0435\u043D\u044B\u0445', 'https://tinyurl.com/t-invariant/category/timeline/feed/'), # noqa + ('\u0428\u043A\u043E\u043B\u0430', 'https://tinyurl.com/t-invariant/category/shkola/feed/'), + ('\u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043D\u0430\u0443\u043A\u0438', 'https://tinyurl.com/t-invariant/category/science-assessment/feed/'), + ('\u042D\u043D\u0435\u0440\u0433\u0435\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/energy/feed/'), + ('\u042D\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/ethics/feed/'), +# +# English version +# +# ('T-invariant (English)', 'https://www.t-invariant.org/en/feed/'), +# +# Censorship bypass +# +# ('T-invariant (English)', 'https://tinyurl.com/t-invariant/en/feed/'), +# +# Ukrainian version +# +# ('T-invariant (\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430)', 'https://www.t-invariant.org/uk/feed/'), +# +# Censorship bypass +# +# ('T-invariant (\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430)', 'https://tinyurl.com/t-invariant/uk/feed/'), +# +# German version +# +# ('T-invariant (Deutsch)', 'https://www.t-invariant.org/de/feed/'), +# +# Censorship bypass +# +# ('T-invariant (Deutsch)', 'https://tinyurl.com/t-invariant/de/feed/'), +# +# Hebrew version +# +# ('T-invariant (\u05E2\u05D1\u05E8\u05D9\u05EA)', 'https://www.t-invariant.org/he/feed/'), +# +# Censorship bypass +# +# ('T-invariant (\u05E2\u05D1\u05E8\u05D9\u05EA)', 'https://tinyurl.com/t-invariant/he/feed/'), +# + ] diff --git a/recipes/t_invariant_ua.recipe b/recipes/t_invariant_ua.recipe new file mode 100644 index 0000000000..af46987cad --- /dev/null +++ b/recipes/t_invariant_ua.recipe @@ -0,0 +1,171 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +from __future__ import absolute_import, division, print_function, unicode_literals + +from calibre.web.feeds.news import BasicNewsRecipe + + +class TInvariant(BasicNewsRecipe): + title = 'T-Invariant' + __author__ = 'bugmen00t' + description = 'T-Invariant is a multimedia project of scientists and science journalists. Our task is to be a bridge between the academic community in Russia and outside Russia. Let’s keep in touch!' # noqa + publisher = '\u0422-\u0438\u043D\u0432\u0430\u0440\u0438\u0430\u043D\u0442 / T-invariant' + category = 'news' + cover_url = u'https://t-invariant.org/wp-content/uploads/2023/02/logo-s.png' +# cover_url = u'https://tinyurl.com/t-invariant/wp-content/uploads/2023/02/logo-s.png' +# language = 'ru' +# language = 'en_RU' + language = 'uk' +# language = 'de' +# language = 'he' + no_stylesheets = False + remove_javascript = False + auto_cleanup = False + oldest_article = 45 + max_articles_per_feed = 15 + + remove_tags_before = dict(name='h1') + + remove_tags_after = dict(name='article') + + remove_tags = [ + dict(name='div', attrs={'class': 'media mg-info-author-block'}), + dict(name='div', attrs={'class': 'mg-blog-category mb-1'}), + dict(name='span', attrs={'class': 'newses-tags'}), + dict(name='div', attrs={'class': 'post-share'}), + dict(name='h4') + ] + + feeds = [ +# Russian version +# +# Direct links +# +# ('\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B', ‘https://www.t-invariant.org/feed/'), +# ('\u0410\u0440\u0445\u0438\u0432', ‘https://www.t-invariant.org/category/online/feed/'), +# ('\u0410\u0441\u0442\u0440\u043E\u043D\u043E\u043C\u0438\u044F', ‘https://www.t-invariant.org/category/astronomy/feed/'), +# ('\u0411\u0438\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/biologiya/feed/'), +# ('\u0412\u043E\u0439\u043D\u0430', ‘https://www.t-invariant.org/category/war/feed/'), +# ('\u0412\u0441\u0451 \u0441\u043B\u043E\u0436\u043D\u043E', ‘https://www.t-invariant.org/category/vsyo-slozhno/feed/'), +# ('\u0414\u0432\u0430 \u0433\u043E\u0434\u0430 \u0432\u043E\u0439\u043D\u0435', ‘https://www.t-invariant.org/category/dva-goda-vojne/feed/'), +# ('\u0414\u0432\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043E\u0434\u043D\u043E\u0439 \u043D\u0430\u0443\u043A\u0438', ‘https://www.t-invariant.org/category/dve-storony-odnoj-nauki/feed/'), +# ('\u0414\u0438\u0441\u043A\u0443\u0441\u0441\u0438\u0438', ‘https://www.t-invariant.org/category/discussion/feed/'), +# ('\u0414\u0438\u0441\u0441\u0435\u0440\u043D\u0435\u0442', ‘https://www.t-invariant.org/category/dissernet/feed/'), +# ('\u0418\u0418', ‘https://www.t-invariant.org/category/ai/feed/'), +# ('\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/computer-science/feed/'), +# ('\u0418\u0441\u0442\u043E\u0440\u0438\u044F', ‘https://www.t-invariant.org/category/history/feed/'), +# ('\u041A\u043B\u0438\u043C\u0430\u0442', ‘https://www.t-invariant.org/category/climate-ru/feed/'), +# ('\u041A\u043E\u043D\u0442\u0440\u044D\u0432\u043E\u043B\u044E\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/kontrevolyutsiya/feed/'), +# ('\u041A\u043E\u0440\u0440\u0443\u043F\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/korruptsiya/feed/'), +# ('\u041B\u0436\u0435\u043D\u0430\u0443\u043A\u0430', ‘https://www.t-invariant.org/category/pseudoscience/feed/'), +# ('\u041C\u0430\u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/mathematics/feed/'), +# ('\u041C\u043E\u0437\u0433', ‘https://www.t-invariant.org/category/brain/feed/'), +# ('\u041D\u0430\u0443\u043A\u0430 \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435', ‘https://www.t-invariant.org/category/ukrainian-science/feed/'), +# ('\u041D\u0430\u0443\u0447\u043D\u0430\u044F \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/science-policy-ru/feed/'), +# ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', ‘https://www.t-invariant.org/category/news/feed/'), +# ('\u041E\u043F\u0440\u043E\u0441', ‘https://www.t-invariant.org/category/survey-ru/feed/'), +# ('\u041F\u043E\u0437\u0438\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/standpiont/feed/'), +# ('\u041F\u043E\u043B\u0438\u0442\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/political-science/feed/'), +# ('\u041F\u043E\u043F\u0443\u043B\u044F\u0440\u0438\u0437\u0430\u0446\u0438\u044F \u043D\u0430\u0443\u043A\u0438', ‘https://www.t-invariant.org/category/popular-science/feed/'), +# ('\u041F\u0440\u0430\u0432\u043E', ‘https://www.t-invariant.org/category/pravo/feed/'), +# ('\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441', ‘https://www.t-invariant.org/category/progress/feed/'), +# ('\u041F\u0441\u0438\u0445\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/psihologiya/feed/'), +# ('\u0420\u0410\u041D', ‘https://www.t-invariant.org/category/ras/feed/'), +# ('\u0420\u0435\u043B\u0438\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/religion/feed/'), +# ('\u0420\u0435\u043B\u043E\u043A\u0430\u0446\u0438\u044F', ‘https://www.t-invariant.org/category/relocation/feed/'), +# ('\u0420\u0435\u043F\u0440\u0435\u0441\u0441\u0438\u0438', ‘https://www.t-invariant.org/category/repression/feed/'), +# ('\u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043A', ‘https://www.t-invariant.org/category/russian-language/feed/'), +# ('\u0421\u0430\u043D\u043A\u0446\u0438\u0438', ‘https://www.t-invariant.org/category/sanctions/feed/'), +# ('\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u0438', ‘https://www.t-invariant.org/category/creators/feed/'), +# ('\u0421\u043E\u0446\u0438\u043E\u043B\u043E\u0433\u0438\u044F', ‘https://www.t-invariant.org/category/sociology/feed/'), +# ('\u0422\u0435\u0440\u0440\u043E\u0440\u0438\u0437\u043C', ‘https://www.t-invariant.org/category/terrorizm/feed/'), +# ('\u0423\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u044B', ‘https://www.t-invariant.org/category/universities/feed/'), +# ('\u0424\u0438\u0437\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/physics/feed/'), +# ('\u0424\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F', ‘https://www.t-invariant.org/category/philosophy/feed/'), +# ('\u0428\u043A\u043E\u043B\u0430', ‘https://www.t-invariant.org/category/shkola/feed/'), +# ('\u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043D\u0430\u0443\u043A\u0438', ‘https://www.t-invariant.org/category/science-assessment/feed/'), +# ('\u042D\u043D\u0435\u0440\u0433\u0435\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/energy/feed/'), +# ('\u042D\u0442\u0438\u043A\u0430', ‘https://www.t-invariant.org/category/ethics/feed/'), +# +# Censorship bypass +# +# ('\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B', 'https://tinyurl.com/t-invariant/feed/'), +# ('\u0410\u0440\u0445\u0438\u0432', 'https://tinyurl.com/t-invariant/category/online/feed/'), +# ('\u0410\u0441\u0442\u0440\u043E\u043D\u043E\u043C\u0438\u044F', 'https://tinyurl.com/t-invariant/category/astronomy/feed/'), +# ('\u0411\u0438\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/biologiya/feed/'), +# ('\u0412\u043E\u0439\u043D\u0430', 'https://tinyurl.com/t-invariant/category/war/feed/'), +# ('\u0412\u0441\u0451 \u0441\u043B\u043E\u0436\u043D\u043E', 'https://tinyurl.com/t-invariant/category/vsyo-slozhno/feed/'), +# ('\u0414\u0432\u0430 \u0433\u043E\u0434\u0430 \u0432\u043E\u0439\u043D\u0435', 'https://tinyurl.com/t-invariant/category/dva-goda-vojne/feed/'), +# ('\u0414\u0432\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043E\u0434\u043D\u043E\u0439 \u043D\u0430\u0443\u043A\u0438', 'https://tinyurl.com/t-invariant/category/dve-storony-odnoj-nauki/feed/'), +# ('\u0414\u0438\u0441\u043A\u0443\u0441\u0441\u0438\u0438', 'https://tinyurl.com/t-invariant/category/discussion/feed/'), +# ('\u0414\u0438\u0441\u0441\u0435\u0440\u043D\u0435\u0442', 'https://tinyurl.com/t-invariant/category/dissernet/feed/'), +# ('\u0418\u0418', 'https://tinyurl.com/t-invariant/category/ai/feed/'), +# ('\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/computer-science/feed/'), +# ('\u0418\u0441\u0442\u043E\u0440\u0438\u044F', 'https://tinyurl.com/t-invariant/category/history/feed/'), +# ('\u041A\u043B\u0438\u043C\u0430\u0442', 'https://tinyurl.com/t-invariant/category/climate-ru/feed/'), +# ('\u041A\u043E\u043D\u0442\u0440\u044D\u0432\u043E\u043B\u044E\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/kontrevolyutsiya/feed/'), +# ('\u041A\u043E\u0440\u0440\u0443\u043F\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/korruptsiya/feed/'), +# ('\u041B\u0436\u0435\u043D\u0430\u0443\u043A\u0430', 'https://tinyurl.com/t-invariant/category/pseudoscience/feed/'), +# ('\u041C\u0430\u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/mathematics/feed/'), +# ('\u041C\u043E\u0437\u0433', 'https://tinyurl.com/t-invariant/category/brain/feed/'), +# ('\u041D\u0430\u0443\u043A\u0430 \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435', 'https://tinyurl.com/t-invariant/category/ukrainian-science/feed/'), +# ('\u041D\u0430\u0443\u0447\u043D\u0430\u044F \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/science-policy-ru/feed/'), +# ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://tinyurl.com/t-invariant/category/news/feed/'), +# ('\u041E\u043F\u0440\u043E\u0441', 'https://tinyurl.com/t-invariant/category/survey-ru/feed/'), +# ('\u041F\u043E\u0437\u0438\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/standpiont/feed/'), +# ('\u041F\u043E\u043B\u0438\u0442\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/political-science/feed/'), +# ('\u041F\u043E\u043F\u0443\u043B\u044F\u0440\u0438\u0437\u0430\u0446\u0438\u044F \u043D\u0430\u0443\u043A\u0438', 'https://tinyurl.com/t-invariant/category/popular-science/feed/'), +# ('\u041F\u0440\u0430\u0432\u043E', 'https://tinyurl.com/t-invariant/category/pravo/feed/'), +# ('\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441', 'https://tinyurl.com/t-invariant/category/progress/feed/'), +# ('\u041F\u0441\u0438\u0445\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/psihologiya/feed/'), +# ('\u0420\u0410\u041D', 'https://tinyurl.com/t-invariant/category/ras/feed/'), +# ('\u0420\u0435\u043B\u0438\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/religion/feed/'), +# ('\u0420\u0435\u043B\u043E\u043A\u0430\u0446\u0438\u044F', 'https://tinyurl.com/t-invariant/category/relocation/feed/'), +# ('\u0420\u0435\u043F\u0440\u0435\u0441\u0441\u0438\u0438', 'https://tinyurl.com/t-invariant/category/repression/feed/'), +# ('\u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043A', 'https://tinyurl.com/t-invariant/category/russian-language/feed/'), +# ('\u0421\u0430\u043D\u043A\u0446\u0438\u0438', 'https://tinyurl.com/t-invariant/category/sanctions/feed/'), +# ('\u0421\u043E\u0437\u0434\u0430\u0442\u0435\u043B\u0438', 'https://tinyurl.com/t-invariant/category/creators/feed/'), +# ('\u0421\u043E\u0446\u0438\u043E\u043B\u043E\u0433\u0438\u044F', 'https://tinyurl.com/t-invariant/category/sociology/feed/'), +# ('\u0422\u0435\u0440\u0440\u043E\u0440\u0438\u0437\u043C', 'https://tinyurl.com/t-invariant/category/terrorizm/feed/'), +# ('\u0423\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u044B', 'https://tinyurl.com/t-invariant/category/universities/feed/'), +# ('\u0424\u0438\u0437\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/physics/feed/'), +# ('\u0424\u0438\u043B\u043E\u0441\u043E\u0444\u0438\u044F', 'https://tinyurl.com/t-invariant/category/philosophy/feed/'), +# ('\u0428\u043A\u043E\u043B\u0430', 'https://tinyurl.com/t-invariant/category/shkola/feed/'), +# ('\u042D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u0430 \u043D\u0430\u0443\u043A\u0438', 'https://tinyurl.com/t-invariant/category/science-assessment/feed/'), +# ('\u042D\u043D\u0435\u0440\u0433\u0435\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/energy/feed/'), +# ('\u042D\u0442\u0438\u043A\u0430', 'https://tinyurl.com/t-invariant/category/ethics/feed/'), +# +# English version +# +# ('T-invariant (English)', 'https://www.t-invariant.org/en/feed/'), +# +# Censorship bypass +# +# ('T-invariant (English)', 'https://tinyurl.com/t-invariant/en/feed/'), +# +# Ukrainian version +# +# ('T-invariant (\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430)', 'https://www.t-invariant.org/uk/feed/'), +# +# Censorship bypass +# + ('T-invariant (\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430)', 'https://tinyurl.com/t-invariant/uk/feed/'), +# +# German version +# +# ('T-invariant (Deutsch)', 'https://www.t-invariant.org/de/feed/'), +# +# Censorship bypass +# +# ('T-invariant (Deutsch)', 'https://tinyurl.com/t-invariant/de/feed/'), +# +# Hebrew version +# +# ('T-invariant (\u05E2\u05D1\u05E8\u05D9\u05EA)', 'https://www.t-invariant.org/he/feed/'), +# +# Censorship bypass +# +# ('T-invariant (\u05E2\u05D1\u05E8\u05D9\u05EA)', 'https://tinyurl.com/t-invariant/he/feed/'), +# + ] diff --git a/recipes/wicomix.recipe b/recipes/wicomix.recipe new file mode 100644 index 0000000000..6c9c23b13c --- /dev/null +++ b/recipes/wicomix.recipe @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 + +from __future__ import absolute_import, division, print_function, unicode_literals + +from calibre.web.feeds.news import BasicNewsRecipe + + +class WiComix(BasicNewsRecipe): + title = 'Wicomix' + __author__ = 'bugmen00t' + description = '\u0418\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u043E \u043F\u0438\u0448\u0435\u043C \u043F\u0440\u043E \u043A\u043E\u043C\u0438\u043A\u0441\u044B \u0438 \u043C\u0430\u043D\u0433\u0443 \u0432 \u0420\u043E\u0441\u0441\u0438\u0438.' # noqa + publisher = '\u0421\u0435\u0440\u0433\u0435\u0439 \u041E\u0440\u0435\u0448\u043A\u0438\u043D' + category = 'blog' + cover_url = u'https://wicomix.files.wordpress.com/2016/03/10865972_581683525300298_6873875730458476144_o.jpg' + language = 'ru' + no_stylesheets = False + remove_javascript = False + auto_cleanup = False + oldest_article = 14 + max_articles_per_feed = 10 + + remove_tags_before = dict(name='article') + + remove_tags_after = dict(name='article') + + remove_tags = [ +# dict(name='div', attrs={'class': 'author-meta'}), + dict(name='div', attrs={'id': 'jp-post-flair'}), + dict(name='footer', attrs={'class': 'entry-meta'}) + ] + + feeds = [ + ('\u041F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u0438', 'https://wicomix.com/feed/') +# ('\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438', 'https://wicomix.com/comments/feed/') + ] diff --git a/src/calibre/qt_backend.py b/src/calibre/qt_backend.py new file mode 100644 index 0000000000..b19565d493 --- /dev/null +++ b/src/calibre/qt_backend.py @@ -0,0 +1,289 @@ +#!/usr/bin/env python +# License: GPLv3 Copyright: 2024, Kovid Goyal + + +import json +import os +import sys +from contextlib import suppress +from threading import Thread +from time import monotonic + +from qt.core import QApplication, QNetworkAccessManager, QNetworkCookie, QNetworkReply, QNetworkRequest, QObject, Qt, QTimer, QUrl, pyqtSignal, sip + +default_timeout: float = 60. # seconds + + +def qurl_to_string(url: QUrl | str) -> str: + return bytes(QUrl(url).toEncoded()).decode() + + +def qurl_to_key(url: QUrl | str) -> str: + return qurl_to_string(url).rstrip('/') + + +Headers = list[tuple[str, str]] + + +class DownloadRequest(QNetworkRequest): + + error: str = '' + worth_retry: bool = False + reply: QNetworkReply + + def __init__(self, url: str, filename: str, headers: Headers | None = None, timeout: float = default_timeout, req_id: int = 0): + super().__init__(QUrl(url)) + self.setTransferTimeout(int(timeout * 1000)) + self.url, self.filename = url, filename + self.url_key = qurl_to_key(url) + self.headers: Headers = headers or [] + for (name, val) in self.headers: + self.setRawHeader(name.encode(), val.encode()) + self.req_id: int = req_id + self.error_message = '' + self.created_at = self.last_activity_at = monotonic() + self.timeout = timeout + + def as_result(self) -> dict[str, str]: + result = {'action': 'finished', 'id': self.req_id, 'url': self.url, 'output': os.path.join( + self.webengine_download_request.downloadDirectory(), self.webengine_download_request.downloadFileName()), + 'final_url': qurl_to_string(self.webengine_download_request.url()) + } + if self.error: + result['error'], result['worth_retry'] = self.error, self.worth_retry + return result + + def too_slow_or_timed_out(self, now: float) -> bool: + if self.timeout and self.last_activity_at + self.timeout < now: + return True + time_taken = now - self.created_at + if time_taken > default_timeout and self.webengine_download_request is not None: + downloaded = self.webengine_download_request.receivedBytes() + rate = downloaded / time_taken + return rate < 10 + return False + + +class FetchBackend(QNetworkAccessManager): + + request_download = pyqtSignal(str, str, object, float, int) + input_finished = pyqtSignal(str) + set_cookies = pyqtSignal(object) + set_user_agent_signal = pyqtSignal(str) + download_finished = pyqtSignal(object) + + def __init__(self, output_dir: str = '', cache_name: str = '', parent: QObject = None, user_agent: str = '') -> None: + super().__init__(parent) + self.setTransferTimeout(default_timeout) + self.output_dir = output_dir or os.getcwd() + sys.excepthook = self.excepthook + self.request_download.connect(self.download, type=Qt.ConnectionType.QueuedConnection) + self.set_cookies.connect(self._set_cookies, type=Qt.ConnectionType.QueuedConnection) + self.set_user_agent_signal.connect(self.set_user_agent, type=Qt.ConnectionType.QueuedConnection) + self.input_finished.connect(self.on_input_finished, type=Qt.ConnectionType.QueuedConnection) + self.live_requests: set[DownloadRequest] = set() + self.all_request_cookies: list[QNetworkCookie] = [] + self.timeout_timer = t = QTimer(self) + t.setInterval(50) + t.timeout.connect(self.enforce_timeouts) + + def excepthook(self, cls: type, exc: Exception, tb) -> None: + if not isinstance(exc, KeyboardInterrupt): + sys.__excepthook__(cls, exc, tb) + QApplication.instance().exit(1) + + def on_input_finished(self, error_msg: str) -> None: + if error_msg: + self.send_response({'action': 'input_error', 'error': error_msg}) + QApplication.instance().exit(1) + + def enforce_timeouts(self): + now = monotonic() + timed_out = tuple(dr for dr in self.live_requests if dr.too_slow_or_timed_out(now)) + for dr in timed_out: + if dr.webengine_download_request is None: + dr.cancel_on_start = True + else: + dr.webengine_download_request.cancel() + self.live_requests.discard(dr) + if self.live_requests: + self.timeout_timer.start() + + def download(self, url: str, filename: str, extra_headers: Headers | None = None, timeout: float = default_timeout, req_id: int = 0) -> None: + filename = os.path.basename(filename) + qurl = QUrl(url) + dr = DownloadRequest(url, filename, extra_headers, timeout, req_id) + self.dr_identifier_count += 1 + self.pending_download_requests[self.dr_identifier_count] = dr + self.live_requests.add(dr) + if not self.timeout_timer.isActive(): + self.timeout_timer.start() + cs = self.profile().cookieStore() + for c in self.all_request_cookies: + c = QNetworkCookie(c) + c.normalize(qurl) + cs.setCookie(c) + super().download(qurl, str(self.dr_identifier_count)) + + def _download_requested(self, wdr: QWebEngineDownloadRequest) -> None: + try: + idc = int(wdr.suggestedFileName()) + dr: DownloadRequest = self.pending_download_requests.pop(idc) + except Exception: + return + try: + if dr.cancel_on_start: + dr.error = 'Timed out trying to open URL' + dr.worth_retry = True + self.send_response(dr.as_result()) + return + dr.last_activity_at = monotonic() + if dr.filename: + wdr.setDownloadFileName(dr.filename) + dr.webengine_download_request = wdr + self.download_requests_by_id[wdr.id()] = dr + wdr.isFinishedChanged.connect(self._download_finished) + wdr.receivedBytesChanged.connect(self._bytes_received) + wdr.accept() + except Exception: + import traceback + traceback.print_exc() + self.report_finish(wdr, dr) + + def _bytes_received(self) -> None: + wdr: QWebEngineDownloadRequest = self.sender() + if dr := self.download_requests_by_id.get(wdr.id()): + dr.last_activity_at = monotonic() + + def _download_finished(self) -> None: + wdr: QWebEngineDownloadRequest = self.sender() + if dr := self.download_requests_by_id.get(wdr.id()): + self.report_finish(wdr, dr) + + def report_finish(self, wdr: QWebEngineDownloadRequest, dr: DownloadRequest) -> None: + s = wdr.state() + dr.last_activity_at = monotonic() + self.live_requests.discard(dr) + has_result = False + + if s == QWebEngineDownloadRequest.DownloadState.DownloadRequested: + dr.error = 'Open of URL failed' + has_result = True + elif s == QWebEngineDownloadRequest.DownloadState.DownloadCancelled: + dr.error = 'Timed out waiting for download' + dr.worth_retry = True + has_result = True + elif s == QWebEngineDownloadRequest.DownloadState.DownloadInterrupted: + dr.error = wdr.interruptReasonString() + dr.worth_retry = wdr.interruptReason() in ( + QWebEngineDownloadRequest.DownloadInterruptReason.NetworkTimeout, + QWebEngineDownloadRequest.DownloadInterruptReason.NetworkFailed, + QWebEngineDownloadRequest.DownloadInterruptReason.NetworkDisconnected, + QWebEngineDownloadRequest.DownloadInterruptReason.NetworkServerDown, + QWebEngineDownloadRequest.DownloadInterruptReason.ServerUnreachable, + ) + has_result = True + elif s == QWebEngineDownloadRequest.DownloadState.DownloadCompleted: + has_result = True + + if has_result: + result = dr.as_result() + self.download_finished.emit(result) + self.send_response(result) + + def send_response(self, r: dict[str, str]) -> None: + with suppress(OSError): + print(json.dumps(r), flush=True, file=sys.__stdout__) + + def set_user_agent(self, new_val: str) -> None: + self.profile().setHttpUserAgent(new_val) + + def _set_cookie_from_header(self, cookie_string: str) -> None: + cs = self.profile().cookieStore() + for c in QNetworkCookie.parseCookies(cookie_string.encode()): + cs.setCookie(c) + + def _set_cookies(self, cookies: list[dict[str, str]]) -> None: + for c in cookies: + if 'header' in c: + self._set_cookie_from_header(c['header']) + else: + self.set_simple_cookie(c['name'], c['value'], c.get('domain'), c.get('path')) + + def set_simple_cookie(self, name: str, value: str, domain: str | None = None, path: str | None = '/'): + c = QNetworkCookie() + c.setName(name.encode()) + c.setValue(value.encode()) + if domain is not None: + c.setDomain(domain) + if path is not None: + c.setPath(path) + if c.domain(): + self.profile().cookieStore().setCookie(c) + else: + self.all_request_cookies.append(c) + + +def read_commands(backend: FetchBackend, tdir: str) -> None: + file_counter = 0 + error_msg = '' + try: + for line in sys.stdin: + cmd = json.loads(line) + ac = cmd['action'] + if ac == 'download': + file_counter += 1 + timeout = cmd.get('timeout') + if timeout is None: + timeout = default_timeout + backend.request_download.emit(cmd['url'], os.path.join(tdir, str(file_counter)), cmd.get('headers'), timeout, cmd.get('id', 0)) + elif ac == 'set_cookies': + backend.set_cookies.emit(cmd['cookies']) + elif ac == 'set_user_agent': + backend.set_user_agent_signal.emit(cmd['user_agent']) + elif ac == 'quit': + break + except Exception as err: + import traceback + traceback.print_exc() + error_msg = str(err) + backend.input_finished.emit(error_msg) + + +def worker(tdir: str, user_agent: str) -> None: + app = QApplication.instance() + sys.stdout = sys.stderr + backend = FetchBackend(parent=app, user_agent=user_agent) + try: + read_thread = Thread(target=read_commands, args=(backend, tdir), daemon=True) + read_thread.start() + app.exec() + finally: + sip.delete(backend) + del app + + +def develop(url: str) -> None: + from calibre.gui2 import must_use_qt, setup_unix_signals + must_use_qt() + app = QApplication.instance() + app.signal_received = lambda : app.exit(1) + setup_unix_signals(app) + backend = FetchBackend() + num_left = 0 + + def download_finished(dr: DownloadRequest): + nonlocal num_left + num_left -= 1 + if not num_left: + backend.input_finished.emit('') + + backend.download_finished.connect(download_finished) + for i, url in enumerate(sys.argv[1:]): + backend.download(url, f'test-output-{i}') + num_left += 1 + app.exec() + + +if __name__ == '__main__': + develop(sys.argv[-1])