From 5f429c3a2de5bc1f2aa436213752b38620759df5 Mon Sep 17 00:00:00 2001 From: unkn0w7n <51942695+unkn0w7n@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:29:29 +0530 Subject: [PATCH 1/4] Update substack.recipe --- recipes/substack.recipe | 60 +++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/recipes/substack.recipe b/recipes/substack.recipe index 75ea2f8c57..691871145c 100644 --- a/recipes/substack.recipe +++ b/recipes/substack.recipe @@ -6,6 +6,7 @@ # Copyright: Nathan Cook (nathan.cook@gmail.com) ## # Written: 2020-12-18 +# Updated: 2024-11-04 ## __license__ = 'GNU General Public License v3 – https://www.gnu.org/licenses/gpl-3.0.html' @@ -14,6 +15,7 @@ __version__ = 'v0.1.1' __date__ = '2020-12-19' __author__ = 'topynate' +import re import json from calibre.web.feeds.news import BasicNewsRecipe @@ -21,21 +23,36 @@ from mechanize import Request class Substack(BasicNewsRecipe): - title = 'Substack' - __author__ = 'topynate' + title = 'Substack' + __author__ = 'topynate, unkn0wn' + description = 'Use advanced menu if you want to add your own substack handles.' oldest_article = 7 language = 'en' max_articles_per_feed = 100 - auto_cleanup = True + auto_cleanup = True + auto_cleanup_keep = '//*[@class="subtitle"]' needs_subscription = 'optional' use_embedded_content = False + masthead_url = 'https://substack.com/img/substack_wordmark.png' + cover_url = 'https://substack.com/img/substack.png' + extra_css = '.captioned-image-container, .image-container {font-size: small;}' recipe_specific_options = { + 'auths': { + 'short': 'enter the @handles you subscribe to:\nseperated by a space', + 'long': 'julianmacfarlane ianleslie .... ....', + 'default': 'julianmacfarlane ianleslie thesalvo', + }, 'days': { 'short': 'Oldest article to download from this news source. In days ', 'long': 'For example, 0.5, gives you articles from the past 12 hours', - 'default': str(oldest_article) - } + 'default': str(oldest_article), + }, + 'res': { + 'short': 'For hi-res images, select a resolution from the\nfollowing options: 800, 1000, 1200 or 1500', + 'long': 'This is useful for non e-ink devices, and for a lower file size\nthan the default, use 400 or 300.', + 'default': '600', + }, } def __init__(self, *args, **kwargs): @@ -44,12 +61,12 @@ class Substack(BasicNewsRecipe): if d and isinstance(d, str): self.oldest_article = float(d) -# Every Substack publication has an RSS feed at https://{name}.substack.com/feed. -# The same URL provides either all posts, or all free posts + previews of paid posts, -# depending on whether you're logged in. - feeds = [ - ('Novum Lumen', 'https://novumlumen.substack.com/feed'), # gratuitously self-promotional example - ] + # Every Substack publication has an RSS feed at https://{name}.substack.com/feed. + # The same URL provides either all posts, or all free posts + previews of paid posts, + # depending on whether you're logged in. + # feeds = [ + # ('Novum Lumen', 'https://novumlumen.substack.com/feed'), # gratuitously self-promotional example + # ] def get_browser(self): br = BasicNewsRecipe.get_browser(self) @@ -70,3 +87,24 @@ class Substack(BasicNewsRecipe): if res.getcode() != 200: raise ValueError('Login failed, check username and password') return br + + def get_feeds(self): + ans = [] + u = self.recipe_specific_options.get('auths') + if u and isinstance(u, str): + for x in u.split(): + ans.append('https://' + x.replace('@', ' ') + '.substack.com/feed') + return ans + + def preprocess_html(self, soup): + res = '600' + w = self.recipe_specific_options.get('res') + if w and isinstance(w, str): + res = w + for img in soup.findAll('img', attrs={'src': True}): + img['src'] = re.sub(r'w_\d+', 'w_' + res, img['src']) + for src in soup.findAll(['source', 'svg']): + src.extract() + for but in soup.findAll(attrs={'class': ['button-wrapper']}): + but.extract() + return soup From cf4821cc5fc85f18b30bdb2d02d91cb5f346dfa1 Mon Sep 17 00:00:00 2001 From: unkn0w7n <51942695+unkn0w7n@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:30:21 +0530 Subject: [PATCH 2/4] Create Sonar21 --- recipes/icons/sonar21.png | Bin 0 -> 1237 bytes recipes/sonar21.recipe | 42 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 recipes/icons/sonar21.png create mode 100644 recipes/sonar21.recipe diff --git a/recipes/icons/sonar21.png b/recipes/icons/sonar21.png new file mode 100644 index 0000000000000000000000000000000000000000..cf89748e32ba2a45adf89698bebcbcca10f81c4e GIT binary patch literal 1237 zcmV;`1SNklfJSes$*?EaNy+p{pS46 z;rF|sQ3cQkECBMHd10ki1%~3$7f?8xqdkFz7NCLvt{LR8L4ItIpT+7F6*7DdOaWVg?+yBLgRDMl0Q>gs z!|iqxi9{F}7+_Ge4Lx$?2zI-jpRQiz(B!1%+|)$$=1sVFkH*GEqR}X0V`G}_;6W%Y zg=^OUsHmu*p`ig0AsUS`G&DpelhNx6Am!!dqN=LgzkgqzJb5B*ZEXU`*|TRQl}brC z9G3L*vPgBcHe{+QJv}`Fh~MuQpU)?NG=RvZOCo`QK7=lpOEQ^^jE|4Y^768Dc6R0t z;jv@KNF);2Y&P23+VFTh0C+qey1Kfs*=&TvVK{zVM}FeO35tu0bNlLag53^QtFB6? z)6~?|;PrYrefqSn*8wPsf{0)?o9XWE#_e_kV6j+u^ym?G5o`}1g2lowz(b(4w3Noi z#z3Au)j}o{=gytu!i5X?{r+44v$L~QS69>9+spa$=jrb5)}3Aj zRvZ5%5L}V_`}=XZTAixd-07X$ab?OxL_4R9xK;HtB$;86K0v9h{ zBp#3B^?G%uHw^#qZ-YEBF~RuwI1YzH*EyX|C@F#c`>D0tQ4|HxX5i@2qr_q{s;a8= z4(lCgX=&lkojU-S&1RCxq#j6dF(KfOk`hv>)S8y}_4Vnp#bV*`;lmILK`=;JSs9g; zmAXA1k25qh#L1H<*W?gDYHMpHnM}&{>(@n9Rq5#HkZm9jT3STnaf#fxA*obK>gwtQ z5LH#hm3GcY_njMZx8^5x64x3}|dI?ZvvpRXekZY2`5wze`lI;wZZ@AnglM2JSC1Ofr# z@i-+D6C4~F0pPc}Ilh^lB^(YjH#f(~$OzNZ(_}Ikg25n5OH2QDAe;AqEP;$^D0A!| zfxMkZ-|(z%!}o!gfRBM~Xb-qmt_NCyx;$~F0`k)+2bBV%=6PUb^JiIc7LYFt_8_@0 zr)#i%Rwbib8Sy00000NkvXXu0mjfqoiC9 literal 0 HcmV?d00001 diff --git a/recipes/sonar21.recipe b/recipes/sonar21.recipe new file mode 100644 index 0000000000..3750b1a065 --- /dev/null +++ b/recipes/sonar21.recipe @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +from calibre.web.feeds.news import BasicNewsRecipe, classes + + +class Sonar21(BasicNewsRecipe): + title = 'Sonar21' + __author__ = 'unkn0wn' + oldest_article = 7 + language = 'en_US' + max_articles_per_feed = 100 + use_embedded_content = False + masthead_url = 'https://sonar21.com/wp-content/uploads/2024/10/logo_999999_720x216.png' + cover_url = 'https://sonar21.com/wp-content/uploads/2024/09/sonar21_backplate_vertical.jpg' + encoding = 'utf-8' + browser_type = 'webengine' + no_stylesheets = True + remove_attributes = ['style', 'height', 'width'] + extra_css = '.entry-meta, .wp-element-caption, .wp-block-image { font-size: small; }' + + keep_only_tags = [classes('entry-header entry-content')] + + remove_tags = [ + dict(name=['iframe', 'svg']), + classes('addtoany_share_save_container wpd-avatar'), + ] + + recipe_specific_options = { + 'days': { + 'short': 'Oldest article to download from this news source. In days ', + 'long': 'For example, 0.5, gives you articles from the past 12 hours', + 'default': str(oldest_article), + }, + } + + def __init__(self, *args, **kwargs): + BasicNewsRecipe.__init__(self, *args, **kwargs) + d = self.recipe_specific_options.get('days') + if d and isinstance(d, str): + self.oldest_article = float(d) + + feeds = ['https://sonar21.com/feed'] From 51d8186d4821a7d95f6694a778910245d5143ebe Mon Sep 17 00:00:00 2001 From: unkn0w7n <51942695+unkn0w7n@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:31:08 +0530 Subject: [PATCH 3/4] Create Unz Review --- recipes/icons/unz.png | Bin 0 -> 494 bytes recipes/unz.recipe | 58 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 recipes/icons/unz.png create mode 100644 recipes/unz.recipe diff --git a/recipes/icons/unz.png b/recipes/icons/unz.png new file mode 100644 index 0000000000000000000000000000000000000000..014115d41cc97b8e8bf83b15e91d9bdec79e853d GIT binary patch literal 494 zcmVq zjss4N15JtoNPz=NgaSo-@%8x6+2(75q0iUgYlx~?b(iMs^J|T?o36zuT8qQY+I*C- zw!+bjpSRoL=qOZySb?u8W1O3?%Bj22SbU{JZk6z{&j0^iMwY|L103B4G&{OpFt{$J=a`(Li9+Vw*MX;o-8I3v9yqe|eb&CBNd*5q5d^FQMUyOo z^F$c34i!zZkkb)3u!|zrk)o-j!10|TJ+Zqe)NQ-xUol9x-Ll>)no6v6OLtKi%aSjd zo}`Q86xhYWj(2lVC^%YR&q1N!WsA^hwF=Zz5t4*zp9s9Q Date: Mon, 4 Nov 2024 18:32:17 +0530 Subject: [PATCH 4/4] remove dead recipes These recipes are based on RSS feeds that no longer work. --- recipes/icons/taipei.png | Bin 1301 -> 0 bytes recipes/icons/tanea.png | Bin 833 -> 0 bytes recipes/icons/tanuki.png | Bin 761 -> 0 bytes recipes/icons/taz.png | Bin 489 -> 0 bytes recipes/icons/tech_economy.png | Bin 1071 -> 0 bytes recipes/icons/tech_world.png | Bin 977 -> 0 bytes recipes/icons/technology_review.png | Bin 269 -> 0 bytes recipes/icons/technology_review_de.png | Bin 1453 -> 0 bytes recipes/icons/techtarget.png | Bin 484 -> 0 bytes recipes/icons/tedneward.png | Bin 1753 -> 0 bytes recipes/icons/telam.png | Bin 403 -> 0 bytes recipes/icons/telegraph_in.png | Bin 917 -> 0 bytes recipes/icons/telegraph_uk.png | Bin 590 -> 0 bytes recipes/icons/telepolis_artikel.png | Bin 353 -> 0 bytes recipes/icons/thai_post_daily.png | Bin 936 -> 0 bytes recipes/icons/the_daily_news_egypt.png | Bin 1560 -> 0 bytes recipes/icons/the_escapist.png | Bin 688 -> 0 bytes recipes/icons/the_feature.png | Bin 672 -> 0 bytes recipes/icons/the_freeman.png | Bin 1825 -> 0 bytes recipes/icons/the_manila_bulletin.png | Bin 671 -> 0 bytes recipes/icons/the_manila_times.png | Bin 2315 -> 0 bytes recipes/icons/the_new_age_za.png | Bin 449 -> 0 bytes recipes/icons/the_new_republic.png | Bin 370 -> 0 bytes recipes/icons/the_philippine_star.png | Bin 1825 -> 0 bytes recipes/icons/the_scotsman.png | Bin 925 -> 0 bytes recipes/icons/the_workingham_times.png | Bin 753 -> 0 bytes recipes/icons/thecodelesscode.png | Bin 890 -> 0 bytes recipes/icons/thedgesingapore.png | Bin 878 -> 0 bytes recipes/icons/theluminouslandscape.png | Bin 681 -> 0 bytes recipes/icons/themarketticker.png | Bin 328 -> 0 bytes recipes/icons/themorningpaper.png | Bin 1363 -> 0 bytes recipes/icons/thenews.png | Bin 350 -> 0 bytes recipes/icons/theoldfoodie.png | Bin 251 -> 0 bytes recipes/icons/theonion.png | Bin 258 -> 0 bytes recipes/icons/thewest_au.png | Bin 586 -> 0 bytes recipes/icons/think_progress.png | Bin 645 -> 0 bytes recipes/icons/thn.png | Bin 296 -> 0 bytes recipes/icons/tidbits.png | Bin 560 -> 0 bytes recipes/icons/tijolaco.png | Bin 1088 -> 0 bytes recipes/icons/time_turk.png | Bin 642 -> 0 bytes recipes/icons/timesnewroman.png | Bin 418 -> 0 bytes recipes/icons/tnxm.png | Bin 174 -> 0 bytes recipes/icons/today_online.png | Bin 576 -> 0 bytes recipes/icons/tomshardware.png | Bin 685 -> 0 bytes recipes/icons/tomshardware_de.png | Bin 685 -> 0 bytes recipes/icons/tomshardware_it.png | Bin 1192 -> 0 bytes recipes/icons/toronto_sun.png | Bin 415 -> 0 bytes recipes/icons/toyokeizai.png | Bin 1515 -> 0 bytes recipes/icons/tpm_uk.png | Bin 614 -> 0 bytes recipes/icons/tri_city_herald.png | Bin 330 -> 0 bytes recipes/icons/trojmiasto_pl.png | Bin 297 -> 0 bytes recipes/icons/trombon.png | Bin 336 -> 0 bytes recipes/icons/tsn.png | Bin 1814 -> 0 bytes recipes/icons/tuttojove.png | Bin 74 -> 0 bytes recipes/icons/tuttosport.png | Bin 205 -> 0 bytes recipes/icons/tveast_dk.png | Bin 159 -> 0 bytes recipes/icons/tvn24.png | Bin 903 -> 0 bytes recipes/icons/tvxs.png | Bin 822 -> 0 bytes recipes/icons/tweakers.png | Bin 1103 -> 0 bytes recipes/icons/twitchfilms.png | Bin 153 -> 0 bytes recipes/icons/twtfb.png | Bin 768 -> 0 bytes recipes/icons/ubuntu_pl.png | Bin 282 -> 0 bytes recipes/icons/ukraiyns_tizhdien.png | Bin 317 -> 0 bytes recipes/taipei.recipe | 69 ---------- recipes/tanea.recipe | 32 ----- recipes/tanuki.recipe | 46 ------- recipes/taz.recipe | 73 ---------- recipes/tech_economy.recipe | 15 -- recipes/tech_world.recipe | 46 ------- recipes/technology_review.recipe | 31 ----- recipes/technology_review_de.recipe | 69 ---------- recipes/techtarget.recipe | 64 --------- recipes/tedneward.recipe | 30 ---- recipes/telam.recipe | 57 -------- recipes/telepolis_artikel.recipe | 44 ------ recipes/thai_post_daily.recipe | 40 ------ recipes/the_daily_news_egypt.recipe | 46 ------- recipes/the_escapist.recipe | 63 --------- recipes/the_feature.recipe | 12 -- recipes/the_freeman.recipe | 74 ---------- recipes/the_manila_bulletin.recipe | 80 ----------- recipes/the_manila_times.recipe | 68 --------- recipes/the_new_age_za.recipe | 50 ------- recipes/the_philippine_star.recipe | 102 -------------- recipes/the_scotsman.recipe | 46 ------- recipes/the_workingham_times.recipe | 57 -------- recipes/thecodelesscode.recipe | 183 ------------------------- recipes/thedgesingapore.recipe | 52 ------- recipes/theluminouslandscape.recipe | 34 ----- recipes/themarketticker.recipe | 24 ---- recipes/themorningpaper.recipe | 42 ------ recipes/thenews.recipe | 88 ------------ recipes/theoldfoodie.recipe | 29 ---- recipes/theonion.recipe | 89 ------------ recipes/thewest_au.recipe | 62 --------- recipes/think_progress.recipe | 13 -- recipes/thn.recipe | 19 --- recipes/tidbits.recipe | 51 ------- recipes/tijolaco.recipe | 25 ---- recipes/time_turk.recipe | 14 -- recipes/timesnewroman.recipe | 50 ------- recipes/tnxm.recipe | 30 ---- recipes/today_online.recipe | 63 --------- recipes/todays_zaman.recipe | 177 ------------------------ recipes/tomshardware.recipe | 73 ---------- recipes/tomshardware_de.recipe | 58 -------- recipes/tomshardware_it.recipe | 26 ---- recipes/toronto_sun.recipe | 75 ---------- recipes/toyokeizai.recipe | 67 --------- recipes/tpm_uk.recipe | 41 ------ recipes/tri_city_herald.recipe | 27 ---- recipes/trojmiasto_pl.recipe | 57 -------- recipes/trombon.recipe | 49 ------- recipes/trystero.recipe | 26 ---- recipes/tsn.recipe | 22 --- recipes/tuttojove.recipe | 26 ---- recipes/tuttosport.recipe | 69 ---------- recipes/tveast_dk.recipe | 27 ---- recipes/tvn24.recipe | 42 ------ recipes/tvxs.recipe | 72 ---------- recipes/tweakers.recipe | 45 ------ recipes/twitchfilms.recipe | 50 ------- recipes/twtfb.recipe | 39 ------ recipes/ubuntu_pl.recipe | 21 --- recipes/ukraiyns_tizhdien.recipe | 20 --- 125 files changed, 3191 deletions(-) delete mode 100644 recipes/icons/taipei.png delete mode 100644 recipes/icons/tanea.png delete mode 100644 recipes/icons/tanuki.png delete mode 100644 recipes/icons/taz.png delete mode 100644 recipes/icons/tech_economy.png delete mode 100644 recipes/icons/tech_world.png delete mode 100644 recipes/icons/technology_review.png delete mode 100644 recipes/icons/technology_review_de.png delete mode 100644 recipes/icons/techtarget.png delete mode 100644 recipes/icons/tedneward.png delete mode 100644 recipes/icons/telam.png delete mode 100644 recipes/icons/telegraph_in.png delete mode 100644 recipes/icons/telegraph_uk.png delete mode 100644 recipes/icons/telepolis_artikel.png delete mode 100644 recipes/icons/thai_post_daily.png delete mode 100644 recipes/icons/the_daily_news_egypt.png delete mode 100644 recipes/icons/the_escapist.png delete mode 100644 recipes/icons/the_feature.png delete mode 100644 recipes/icons/the_freeman.png delete mode 100644 recipes/icons/the_manila_bulletin.png delete mode 100644 recipes/icons/the_manila_times.png delete mode 100644 recipes/icons/the_new_age_za.png delete mode 100644 recipes/icons/the_new_republic.png delete mode 100644 recipes/icons/the_philippine_star.png delete mode 100644 recipes/icons/the_scotsman.png delete mode 100644 recipes/icons/the_workingham_times.png delete mode 100644 recipes/icons/thecodelesscode.png delete mode 100644 recipes/icons/thedgesingapore.png delete mode 100644 recipes/icons/theluminouslandscape.png delete mode 100644 recipes/icons/themarketticker.png delete mode 100644 recipes/icons/themorningpaper.png delete mode 100644 recipes/icons/thenews.png delete mode 100644 recipes/icons/theoldfoodie.png delete mode 100644 recipes/icons/theonion.png delete mode 100644 recipes/icons/thewest_au.png delete mode 100644 recipes/icons/think_progress.png delete mode 100644 recipes/icons/thn.png delete mode 100644 recipes/icons/tidbits.png delete mode 100644 recipes/icons/tijolaco.png delete mode 100644 recipes/icons/time_turk.png delete mode 100644 recipes/icons/timesnewroman.png delete mode 100644 recipes/icons/tnxm.png delete mode 100644 recipes/icons/today_online.png delete mode 100644 recipes/icons/tomshardware.png delete mode 100644 recipes/icons/tomshardware_de.png delete mode 100644 recipes/icons/tomshardware_it.png delete mode 100644 recipes/icons/toronto_sun.png delete mode 100644 recipes/icons/toyokeizai.png delete mode 100644 recipes/icons/tpm_uk.png delete mode 100644 recipes/icons/tri_city_herald.png delete mode 100644 recipes/icons/trojmiasto_pl.png delete mode 100644 recipes/icons/trombon.png delete mode 100644 recipes/icons/tsn.png delete mode 100644 recipes/icons/tuttojove.png delete mode 100644 recipes/icons/tuttosport.png delete mode 100644 recipes/icons/tveast_dk.png delete mode 100644 recipes/icons/tvn24.png delete mode 100644 recipes/icons/tvxs.png delete mode 100644 recipes/icons/tweakers.png delete mode 100644 recipes/icons/twitchfilms.png delete mode 100644 recipes/icons/twtfb.png delete mode 100644 recipes/icons/ubuntu_pl.png delete mode 100644 recipes/icons/ukraiyns_tizhdien.png delete mode 100644 recipes/taipei.recipe delete mode 100644 recipes/tanea.recipe delete mode 100644 recipes/tanuki.recipe delete mode 100644 recipes/taz.recipe delete mode 100644 recipes/tech_economy.recipe delete mode 100644 recipes/tech_world.recipe delete mode 100644 recipes/technology_review.recipe delete mode 100644 recipes/technology_review_de.recipe delete mode 100644 recipes/techtarget.recipe delete mode 100644 recipes/tedneward.recipe delete mode 100644 recipes/telam.recipe delete mode 100644 recipes/telepolis_artikel.recipe delete mode 100644 recipes/thai_post_daily.recipe delete mode 100644 recipes/the_daily_news_egypt.recipe delete mode 100644 recipes/the_escapist.recipe delete mode 100644 recipes/the_feature.recipe delete mode 100644 recipes/the_freeman.recipe delete mode 100644 recipes/the_manila_bulletin.recipe delete mode 100644 recipes/the_manila_times.recipe delete mode 100644 recipes/the_new_age_za.recipe delete mode 100644 recipes/the_philippine_star.recipe delete mode 100644 recipes/the_scotsman.recipe delete mode 100644 recipes/the_workingham_times.recipe delete mode 100644 recipes/thecodelesscode.recipe delete mode 100644 recipes/thedgesingapore.recipe delete mode 100644 recipes/theluminouslandscape.recipe delete mode 100644 recipes/themarketticker.recipe delete mode 100644 recipes/themorningpaper.recipe delete mode 100644 recipes/thenews.recipe delete mode 100644 recipes/theoldfoodie.recipe delete mode 100644 recipes/theonion.recipe delete mode 100644 recipes/thewest_au.recipe delete mode 100644 recipes/think_progress.recipe delete mode 100644 recipes/thn.recipe delete mode 100644 recipes/tidbits.recipe delete mode 100644 recipes/tijolaco.recipe delete mode 100644 recipes/time_turk.recipe delete mode 100644 recipes/timesnewroman.recipe delete mode 100644 recipes/tnxm.recipe delete mode 100644 recipes/today_online.recipe delete mode 100644 recipes/todays_zaman.recipe delete mode 100644 recipes/tomshardware.recipe delete mode 100644 recipes/tomshardware_de.recipe delete mode 100644 recipes/tomshardware_it.recipe delete mode 100644 recipes/toronto_sun.recipe delete mode 100644 recipes/toyokeizai.recipe delete mode 100644 recipes/tpm_uk.recipe delete mode 100644 recipes/tri_city_herald.recipe delete mode 100644 recipes/trojmiasto_pl.recipe delete mode 100644 recipes/trombon.recipe delete mode 100644 recipes/trystero.recipe delete mode 100644 recipes/tsn.recipe delete mode 100644 recipes/tuttojove.recipe delete mode 100644 recipes/tuttosport.recipe delete mode 100644 recipes/tveast_dk.recipe delete mode 100644 recipes/tvn24.recipe delete mode 100644 recipes/tvxs.recipe delete mode 100644 recipes/tweakers.recipe delete mode 100644 recipes/twitchfilms.recipe delete mode 100644 recipes/twtfb.recipe delete mode 100644 recipes/ubuntu_pl.recipe delete mode 100644 recipes/ukraiyns_tizhdien.recipe diff --git a/recipes/icons/taipei.png b/recipes/icons/taipei.png deleted file mode 100644 index 8bdca073c85e8a2acde594c3d7f1b2ffcff4d84a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 zcmV+w1?u{VP)%!_->E3qqk3Pk;!#$frpfVOsgNX=3YmUg?AYHeEHKRw)gUNkL5|c0H29QwKCQhkAdZ4eLs5g)pP3>T zh+9)P=E+T;%^ES2a@FcqAVS#@Ie(t=M#E;PFo%+a7)w-wR}hbmQnt26E7z~n?#2dbH%@o8 z=6m%z-zDN-$Hus|vB4r`mT^BppjN+s@PHSH_&4D1J9qq8A1PZctJ{qRKbfB9`$T*{ zP5B;tYqz1KY&N_0>(|8XHnmq*se`s@wMeAg*`dzMmz2MHMT9jk-@W^oEs?Z^!;a;! z5nG6zn}b8ROqNk+eVr7t*3PHQl>lschlFTrixw_ipr@0Q^c+}1y8yY!&clcF=fngp zpFT}XsPMO(y3E2CN|cVTws5J<9GBupPHh@bLS{qUZz+!uscCzZU&B~*rE~zD#C8# z`iI{>r@{erW(42(3U=O8&#^5MiHgQj!}#t;oQ!P)717Q7)#u@#EMeFVYzDH zMBDO^3&2-kKPqOs{>B|GX^XgQY@deaER$@zPB_mc5NpE(fwtl}STwRXXor`W4m*^` z(aM0&xF#oDx!I0hxa!B9h~QTHzl8hv(A7KK3m;+DJfI3XaO`ihqgj^fD=F|{1E_%6 zY6I=QgtF5Q9RzH@tLp7MViTT!_bAa&E!+)@xMmY%!b0lq@uDcI zZ$k7*#Y9%GUZu60H|?jltVc~B~kp8h~r+rXecsfgC4{7;O&QR;KqZ;I$s=)`6B zpFb)gO0O&ZN~vbkn1$`4c%spH10?epSVVN}B4vR3A-C}Djzb=fSHXZ}&b!7ej!sU_ ze|7ot4GG`{@C;aCRKi8dKH>v#XdBPTQPkRlug}h&eRk&7tr!0QF;;6`&fvbo00000 LNkvXXu0mjfQXh3S diff --git a/recipes/icons/tanea.png b/recipes/icons/tanea.png deleted file mode 100644 index fda49b5148b93747006e569b64580d94ff8ab332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833 zcmV-H1HSx;P)&{0CfKT{v1SuA|iSsLV^GQa3@BCD@cR@6?ZO3 zgf2>jE=q=wnX{0Yw4kTH=IHL|>hJvg{Qxz605yI90CWES{{TRP004CW0CFNVe+ogC{+ICqRKGM1ue)d;lwaCrE`WJ%9i!eE=?gD@ug` z0B!&PcK|hjE=-01J%Tb$hdoS)L{f@OV3AT^kW^ogRA!V_XO&lJmRe<#UvQdYZJ2X? zp?HF&dxfWgjH-u_t^fdd6)t;`nzWObvXq^-m7TT~HGZY7!Kbdmr?11PufwXa#HzBz ztFpzdw8yfw$HvRo%Ff!*)Zfz9;MUsW-r(ln;O5`q=HTJy;Ns`uJ>PDGE9a5 z9CrX5cp@%-ke9NMn6u;M>f`3@<>&3?=R_4D-jkC(EKn6uGw8(aVY z0bWT&K~#8NebdE~>o61q&|JwJW`<#AW@ct)X6DEI{(53N9=j@%d!@yx?#-12J|Y1r zD!AR>+x`ubPQp98mk|RPb=cf*D^DO~s@5C7*c`JUsX&5oos(q?a)y5auYz;2m5X)V zfd+1pc8u-KC+(Zcj06G3g<`!r2(_dE#`Ss3as-4l@G~5W_GAHE>QQERxR612Ho#b! ziGZIBw3!F^M+Vx=(BEm11hn{4ef?2n0x@Q^5gqUX+y}+-YAO)qb6Bexf29El0C>0>5Lqfv z#OH}BrwNeR$f=74)Q$kdnE?s@Q-GiV!qHwQi?BB}uQ&MJ#iN$00000 LNkvXXu0mjfX4I5N diff --git a/recipes/icons/tanuki.png b/recipes/icons/tanuki.png deleted file mode 100644 index bcbffede20fe4d5f64d2362eead7148edc4e90a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 761 zcmV)pmAw?sLxbp65L8OW@_+>MF>DFQ0nb{*W=pDHtpw!tXyZ!pv@? zWI#fI?jJgpPcyP9=T9}W-_)|~g2#hZMdC`@7?(a>$22ywEKMaJIfZZ>Qjtecmyt}8 z9(4nI^+k`Al`k!(1T_-hDE~;+1N&eK{013ij!iEI&0o^Qr9=3iySvLV1vMlY)AdtLntcHP*7>C-n z)Ps;%#VxQpJ^^#DW3Dx`Tmq%=fi#O-%p+q+%{h#A@@gYi;sI3yXQZ+iLfh4% z7xluDAl0Fnn5)XiZT+22`<-?m=q1AB8MdjL_S?{8ERw!V+$6A6JbE1oU7Z|W1rOkK roB#pO5ZG|*@W=rb(}{l{^Z)S&N|3J)8>x9o00000NkvXXu0mjfvL{&} diff --git a/recipes/icons/taz.png b/recipes/icons/taz.png deleted file mode 100644 index 30e4b2570321913f14a4ecd9dc8eea1e3874359d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 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 diff --git a/recipes/icons/techtarget.png b/recipes/icons/techtarget.png deleted file mode 100644 index 4f00895e88c500917f3dc49ef02db620415f32ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484 zcmVro1@&V`3<%RK5(DGq+TO9<|&n=c7uV#^;p0CIFMC9I6$!o6&YG<4`NsDI| zjXK#mcVmO#X1;C`Z19<2HLu+xSUcy;jC!wM#V)}B!vx!u$vB{$@2wIvOMQ!G1S1S` z#6DH-a6&8JJ5KPfpMPMTU^=-s(cw{ETfo|$J|%sxU&tu)m`$3@=KCuAAh^}0x43Y aNRdB2XvIYsfF|z%0000mWMCO-uyVcbd0Ehr;si{Zf(PY+6rj{xV zx`&7WAj8a(>S{5+Iy(tqvVRER=JFJgruUCj^>%)?zFj1rKGnlt>Wklb{owNakCz+g zvIYrCJ)TV;P4V!kJ$g}1XJmNEA__7XRWn9acW?fA{OTu&KL7G-t*Y~jKP&5lXW#1T z`RT>=`Nb;b_OVT#$iXwM?qTwX%|2uy;e?=_%H*N!KhfD|Xh#BAgs6g)2$%ubY{_YY z)X4oWt!`udqng$SpZR)!IXb#b$EnL%x-OMcP15~Ghm-CrWflP-T2HI}N6mCf(*OjZ z2+_}m31Fkq(dW+vnlyy@-od?QG^(5S=JvwNn%V@+w7M<@x#i_)T7juCKMr zYAT}G$|;$;pqv5ETiH{HyxuuLOazf?8jN0C;CG zNCz7-fKUK37yyiZh}4W#ked0by#4#1E?@mEN;a#Y+FxnyySAY` zywHnmWJ%1(U<4T91#pC?rhfd3@1A}8drP%witwZ)f?bzyZqDX!|8@JrU(CC@X{ibQ zkAMUMe4|V@haqrHLIsZ^`o#5~sWd-jduaWBM*ecT%1P~KR5D)}uYLii$W_$ZJ z+VK>=Q-z_*A>jCSXM@qj%BqS^U}4dCL<&T2tY-XJ2YSrhy+n$ ziw6OQKmZ89ts;=Dv3BNI&5LqXDvJt;pgR#{zyYHufMIVS?J{7C_y$TBumAx1upB}S z!b2johOR;vnbG;AipDe?#RVY@36aFzon%iEU;rN{3hH1fTS0XDs8D(V+5|yd`{tA^<43>u*0j16~7bT!7W+tj283obXM9=V#??g=q z1BD*u?kul_PkP*ovgye99>4+@I z^v*#^wMk;0FW;*suhHPPYVksLC zp;cw088>-p8Fd4su$pQRv`st;%tF67bn-!+blf&MrO+Z)$Us?>eO#xO%@k0&(+lYd zskWqTV>Uaezxqw=jan^Lst663s6b6q1r-Qkij)xGszWZjNEi+toeWx)j=n)PQN1v; zs%}!MT7{rw1ty>WnoqwL5%iB?&=5ZW_;F6T3kG}&9}p3QH2}m*GO3zT%JUO%rroGBUvoAykv%-1Q_6#dwt${@Wn v7#M7Xy+L1iFkm>+NUAn1-rM;*U0nPZ{@cQ{16xj!00000NkvXXu0mjfIrB&o diff --git a/recipes/icons/telam.png b/recipes/icons/telam.png deleted file mode 100644 index e99a01bbfbfb9c50e7c4dcf35c47bbdc7efe1392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf_5hy{S0HU|ZSCmj7#$s*kdR<+ zZ}0Bz?&<023xQ zCr_R>ZQ7hUb2e<)uyg0mUAuN2K79E4_3Jlo+_-u3=B-<|Zr{Fr@7}$K4<9~y^yu~L z*I&MT`St79zkmP!|Np<{rjIkw>4GIee!&a}fB>iv4#E~p5CKY7dAc};NQ6&4y^-sX zgMjPB%@$1=21}Pd`2T-WYj1CB!j^!^vfZi~uXE*O(wbhJx$Bfr z1^!N0(Cw2`_4<>{1YWPeY3u(S%DuJsoXLs_x6X+N-QJ%d`aXV!5#Mohqhl?{Q$v>@ lk=Xh-ZcEmVX$I!Y_@n3hyt`Yy>Ko7%44$rjF6*2UngHSuw5$LC diff --git a/recipes/icons/telegraph_in.png b/recipes/icons/telegraph_in.png deleted file mode 100644 index 9fc707204e2e7b14ae43247829339eaa73027f26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 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 KMNUMnLSTXgP_~Z% diff --git a/recipes/icons/the_daily_news_egypt.png b/recipes/icons/the_daily_news_egypt.png deleted file mode 100644 index b061b2b4c5176a93ef86a075b679eced23ca239b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1560 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 P00000NkvXXu0mjftD%Ta diff --git a/recipes/icons/the_manila_bulletin.png b/recipes/icons/the_manila_bulletin.png deleted file mode 100644 index 05583628707d598a70cf0e4ec92c59bbf33abc89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671 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 rpFdCrPy`tAU@lkp^Xs}3RPzFjN87xv3 ziLxlgsly#feB{|5VDx(N@9!AfE%4g5*D1DbFII8Dw*A?KMX7wLNv;IL@%VUX|1N&f zM*Zf)&4@R+db(W4hu-5%W~51~64G@AzJr$>Xp$~{yc=tSs1$+WN9iP=&<@}}OQpQA zI#VDjMKGamNxSLv0Rz&!#T!o+5S1dB7Dgp4(wx!UI5p8>_z{&Nm=>6mG*NH$@64`s z@yoOnCZz{bHziGxb|~GJ@nc#F!*(^~9!X13c`t1lzAZ>|_+Iuhp**HFU_jC!pF9m` ziNs0eQ1WS`)}r<5yavpAA{lEpyz{uO&0#65oG9gBsGn1J4{YGdyNyW`>ko%M`p&<2KIgg`GHOJA8?s>&lj?fhNXqnVACS z`$-C4;ZU=l+5L94zol<2Vs)Nd6Q}p6@^s#d5X5?Ev&1hIi9u z7j1Ge+XaYgv|0~sbkUc4VE~b~?t>X^apC;-07~q{yYHz87Iwu;y2n1KKR{|Xr(X<^ zw4NUo`Sv&`TRbxrJ#peaTP$Ii>Dpu8DfBYhwE*yiG(ljHsggAaq3P_gocs(~4!sDlhbn_}i8NFv&d<_T;l%mt;O7(RN2-FP7L-tEu?}iCvXe4JL6B*llr>dc@%*7QFmdeS$@AAG)i&YyISF7ck$Pz7DgaK7<+fYJaGKN?6vt6L}YL)fL4zLkX~|) zCnNKvJ!7AnM-}XKs-1lkssisqQt82U^x*axDDA?ujLe)@#J=HUpEivs{JAUhdFD`X z;*27CA}3jc_-_OB4jiTDx{H>|B1TVr+B~Z8L*r+l(pkca7#utOp8!|`hv_q?!L|et zTLBoJJWC%s48Xn}z|+P7(nzC!0|3X!aeAz)qAR|X!O4{jCeP6O{rcMh;AY%Y;Kk5$ zh8tyYc{b7HnK^p)nj&@%99izc(1Zk_yBWadeac(Obf$CQ=;uu%%C%nukio31eYRP` zc`cz;8Qd7))P-64-02uO0X~(^Dz_4D;e34tht6C*e{}&S3#m-^;4%8bX|PAqnG95c z_-XpU!CNCq*#-I!fGcxJPPFa$R0E9f803myV3wkjDZ1<8xEe+c<{>a$^uXB8u(4AAN%fx zQ*?;FaBymYyx(D?kJwlwh;RQciLmy%G1DC`BT|UJtha2~s_wDTRKZMV4!CHh^_*Tb%N5DRF~`DIaE9itV0suwKw!Vir0 z7c06B`5#F}B<)KT-Susy07yh=+V^BtlgZh;`GLZ(rB0wee<<$1GV%?WUOe!f3GtOd z=ZEd>hBqoZDepj&r6Lm}P($-yA>N@Ce_pWHP}@-3T27o}FP3$m82FuJ zImzUvDH)Rrh|<4nwAaZ1;A_k#1pcFZfm{C5ze6WsY&4mz_9ABwKOsIh7h>VXWH#^ibeFgaW_s8*TM%WxxjiRg09tH!QA-c7jMET2yI`+2Q5bcT5XBL)#nN}2+R!t{(tlj;=x#PGhB9J P00000NkvXXu0mjftD%Ta diff --git a/recipes/icons/the_scotsman.png b/recipes/icons/the_scotsman.png deleted file mode 100644 index 19efd5ba99c5e36ff76469b969164d4d0ed75718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 925 zcmV;O17iG%P)8h}+qP|6!Lx&F+qP}nwr$%y`+NUPj#;eaSGO|@d+I`b zWI;pxjj@=8xtN9_=#FwohFGw}>xhfI=!!YG13$|A3RWn3Kir|CG2*)91e%Y zeZXrE&=fHdCW_!x;DX_Z6DN+AEnB8`?b=1Tc;?KR)uv4w{rBI0`u+FcRj^<|vl;*7 z#v&F>*pUa*L3mXMQz`)L#I!l*3Fx@ zRK9$O%8d)yL_BPP+*PbtF`YYiP8l*}2=RK%7%?<+<_tY}_)tB1^it~7sTDtdd?ibk zOp_)}(u4`)<=+kqA5jywQg{Oka@Wa|C)K`VC-K-+B3-(48Z>CI?%lhmvSrJL_-yp( z(KTeq5DgnPOu^>C!Y^u zUVZxX(S-{aRI+5r(7*E?w*Mec&73t;>({Rj%xLoDDcZk(zebH3rDMmA>HPU~x^m^J zZrr$`9ox67V#SK#&J1iVAx}7+PTje4M>A*6G|%J4jcfYerArsNTrM++nKETko;-QY z)xi5fr4Q)?Y`O6;yf(y(7f%TjCJeLq&%gYl$B!SYb?esVwQAL>>&DF+%9=H+Cy7{? z4qFV2go4YHJGbU9SfI+4tAu!+-kN?MI&@gck|#5-{rvOK+QH>U=ALZeA@adQe5}BC zm@@9#wM%W=wiV9nJ*7>XHoW)lU?55&7CegR$bep0hts%=SNMqU@WWTU$1_~PVN6C9B!B}x zhaCx#83j-rWl3Ni5ihytTv6pR7@S379)CdkMf00000NkvXXu0mjf_tnYe diff --git a/recipes/icons/the_workingham_times.png b/recipes/icons/the_workingham_times.png deleted file mode 100644 index ac6f3b3cc8a49f2693681c16d2b7aea1a72b01f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 753 zcmVr=b$LK6~O@rDER?yG!BS@xD)Unh@!4UMQ}nK zKyc+ifGCQHp^fPnV@#*>eEo)dug|louc{85gQa`*1c_--sI*1~sMCR{fKmcTBmvg~ zl+@`Bh+@S$1RbcDhbwNcnR?_R4*R>Ufjp%DoWZu`?ZF}rmQ0UhDvFdG={E&}XVA7{ zrWwM?)!A-N!^^x?9{g&lGb^*ZI_-@`acNDlt%161w!Q4!nP^`go4Yv`5Le4BW4slU zW<=ail6n-s_!(Usn_ZO^OEX0ER`|RT-``o>(`_~vWKm@PgzEA@@y7T0*+A9GHfpuI zgP&iQzxB2C$&VQv9CXlo22U2*vPKOqSw z4X&?!UO4f#`Q+*7&QAN)Omuwo_t8GP&!wwh0tw-(-~NR+vzrUnzAlH=j-4Lqcc)|A zTg?pgS0{pGxYud4RKGSfJ5s$KTP|RO@DG8G{j_Zt`#foJvO+wu%c}B7987P9AQgOb}o<` zdU8XxF2SG`DVyWkYPRuL3C6f5U}&H#h*cbs4{aBPLbZ9ZoLTVeGwr->uPH;*i-&66 zXCHq2FdtGgmY*BJ==ki*Z&OLc`pVwT(MF8gB_U9?!f;7mtSo0Ojz!1NTBCXH;o7nr zw5hGz8E#cwta#SD$>xsbB|l8+b3w^8tc)N`-u!5O{T1SdE3eZ!#1J)rmQoXg6e*So jrTWh@UA2~s35Vl9IaNW3dkJmG00000NkvXXu0mjfGVEd) diff --git a/recipes/icons/thecodelesscode.png b/recipes/icons/thecodelesscode.png deleted file mode 100644 index 6e40d1181f157a84b2c67407ac610727986d86c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 890 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SSr1Gf+eGhVt|_XjA*UgGKN%Kn^9SVT{>yeCTms43Ue#WBR=_|hw9^P*iPj(xl@ zGk--{u<~+UF+CSg5iXC+UsH8nupS8Az{t6-`SlCd0`?6~uattWdbM&b+P3W2O@TLR zy~5$SvyObTY;W}qSzeg*VzcDg>-F=>@0F|hqy$d$TpBb{V@Z&s%G94X_Nba~-5MHd zYU(??>}=_8J_niE9Gx!yT9X#@J0;zlo_2P}<37{Ul}CP0i`n>K-R{~0=1Ma|lqOF8 zysWu$^EaC>9%uVPB5y8YUBC9n*~@khvTK(LSx#JB^&-6gio;FQZm~5Hf#L6&^OBv` ztX38}nd02AEdAdxRZ;W1ALf;o`sciEP*}Vm;r={@6HEFoPf|TSZSC*V{&hAo{G0YQ z&%3w4`i+9n&l6i-=Xs>AS~ZW)sYznjuI9XN*G^8H6S+O6^lI(*zmE=HsQEK@vS??_ zr-k!EOMUhG&$P4848D3fI5;@``UQ!yg4-3hE?wI6cN=rEMaR*glN%+axIg6ArX1Ii z<1SdVd-A3YnTMxMv#nOXK4(U2=<0s~Ta&A|GzUh`2r4?a$WwLoe|CfPbK-e3gSI{X zKCxlWd-o%0_bn@9E(mH{uV12}E~)i%Vnc0irLf)(9kZ8v7AD(eTgNN$MtgGkh$~SRs87_ z6Vo-7-;Sk!?yE{aU~l&8-n*)_hkn4cs9NG0QIe8al4_M)lnSI6j0}v7bq&mP4J|{A v46IB{tPISx4GgRd4D#i4o}*~U%}>cptHiBA&Us2SPy>UftDnm{r-UW|K{k1n diff --git a/recipes/icons/thedgesingapore.png b/recipes/icons/thedgesingapore.png deleted file mode 100644 index cf4d2e7df165426839c852bf75098023ada88789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 878 zcmV-!1CjiRP)Lw*Lm z%@T2+AU^PlK?1U_ zMg?T87@=ftW1xJEflMZ&y=%2vyICDUWcq19`}(b|E$r;#X*9@GUl|X?; zqtV7J$b>ON*itNQMyy24fE(_mAFxJKaH~{-N(H^d;^Lx~n+&kcsLSnG*c@=YN<)lI z!EUu+eSIC9o156!*tijT&sYg-LI}1UcQ}v`=qn}%5`HABcRZ2_(e4tP&DIMIAw}6p=;L+s+SLD=1}OI(!YBS04G_5asU7T diff --git a/recipes/icons/theluminouslandscape.png b/recipes/icons/theluminouslandscape.png deleted file mode 100644 index a432e96a5d736386bdc4ba8fc540378eff394278..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmV;a0#^NrP)Q2F3w_vdQ;;B@%p zf%xQu{^*SR|Nr*?|Nj2|`OgXd&;|eh`~Uy^@bT>b`P|^#kmBBhdz&>SeO4uWP$6YV=SpZe^f`|p|m@0j}Vr~C1- z{qMQC-Oa<`)5qS>$mZ1H>f`74>F)IKkhX()omy0hO^v#*w$;qq=HuJ!<>Bw`>-6#O z^z!-r`}_U<`ThO;{r~&^|NQ>{`Tzg=|Ni{{|Ni^n{`}+p`|1Dr>;C)m{`~a*{Pq9* z_Wu3;{r&y^{{Q{|{r~>{{r&m={rdd=`~Cj^|NZ~}{`>|*DhU7p00DGTPE!Ct=GbNc z006~FL_t(|US-HrbHq>p2GD#-*0yciTidp6+y39pOH zOf1=;8HS-r451lbL1$NY`#p&#A3)JMsa)jJujanF>*5{v+A_!QRN4T*X!wt$?-8`f5$l}3;y~A+F&DOi{*8- P00000NkvXXu0mjfmgTM> diff --git a/recipes/icons/themarketticker.png b/recipes/icons/themarketticker.png deleted file mode 100644 index 1b95113e92eec0497f79bd6ee7da08617f473242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmV-O0k{5%P);q&*Vq2s-2dX@ z|L^br_V(pvWz~@a(EtDd0d!JMQvg8b*k%9#0D(zFK~#7Fb-?Wsfj|_1;g>zNN`g&m zlk|1m|0Nn@o5>Fk|0%yNwqvaqIj|P&MLMF{T?w`~HPPLO20Nt{(NUyrM9ZA7MtoKl z1+92KMqA<}dBVvKQ-IoZXg>l&y3fy0?pWMp`(luag*V~|=0P+j8{?R~64gnTR;=he atG)qC{RgemJy)_Za`(TNb_IXF1* zC;**S8?pV96UEe(NQBv~sVtC-xg< zcNjH-*i@`7D%|*}N3uYt!v$_ISMv4cybBsxpFw)Bbg*T@0l6d_fQIp!FyQ+2>zM{*Q}y-UUTKZ*q|n>UkVgSgW4 zHQRkXH?HT$d69y)Z&^GiXzR)Vmrcit5~6lEkX>FuZ+?!GKzI~@pPOrIX_~ySVZ|=g zj;-5UXi&)}@nD!(5IQ zQV$g~1?V7S21%EOGjJn*=7wj;B%=Wk1Q|X}dFVm2!d6xm<&_#{uUc|A50+v575Kmk zZWPF(i*3U1l6DJ2U9VlcIy~U`(Ib~GU1H*+e*5j$hXI*lT8~jK+aG+WTy(meIbc?T z%(>7e1V?*u9Lj}xEav(1=Z9|j>xvW-;HHZ9Xi?F>S zOWodDUYwsTj4$CtU)PB3j67CMUw_|-%}ym`rAj!Nj2HzR(O8;QnkGz_3m<59DiN#4 zAR9EwyVR0@T7~v5WUn%FHdK}l-SB_@`R6ac{4&Rf z=Ikq&gKL-vsh5T(f;9i>-0>fd8QPVS>sUFJ0ni#uR{+4m-(q5kTT>Tno4uZqvn4B;y+TC}QF)STmE{IRjJY;6k+l zcER@wx>xSp{jI=z_G_*4jC^Iwvo#{d#!_ zV_X1`mpfzGzzEw$XkHnVu-FG02>@aPl(1h<@<{0I?H$+Omior#sSz2#h&ci56DLk? ziR6p~0Gq>Yz?9IGQ>RXi3jmC0Y;K|P6<`6lS?HfI3gFA_L|c{E+*My$Rr9d4e*q5i VnMUj2twsO<002ovPDHLkV1g&wh3EhP diff --git a/recipes/icons/thenews.png b/recipes/icons/thenews.png deleted file mode 100644 index 8fbd7f2145809d7cae037aca9d8df44d64655906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmV-k0iphhP)FgbVN! zFunjkfjYr%!!Mxv6`f$Z;BPI!{tE>1R{-&EK|dgs8)T$SS`)BjOS7Zm0e&UN{Q%#x z|FxT$8h~`~^i21r+qk_m8=ZXuY_l@fG79c((iV{vz;l44ifA%B1vx;iDmUozDyy2p z(!v2)^$ilE>D8XSsB!{Ya|5mql@@UI1t{$UJTjve2Yx`L8Ah|CT>W)B+qnUj2A?57 wz`KSAuo`|BVTB|82auh;gujetd6NJD08|PUI!vI6NB{r;07*qoM6N<$f*WR$5dZ)H diff --git a/recipes/icons/theoldfoodie.png b/recipes/icons/theoldfoodie.png deleted file mode 100644 index 99426c2d4ec764de43d17a250db0b6f3183b845b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyS^+*Gu0Z-<8q>cbp?_6M|K>&g zTUGRLQ`5hFegBTl`*&;Kzenf(y}S4C+q-}N{;7U{zyVavSQ6wH%;50sMjDV)@9E+g zQgLhV<)e&;4R{;^X9oW6k7f%r{Gh*3d>i9|y_{DHb?>y7vFqg;_-9 z>;eb3u+Rlc=e;j{jIk+YjbyTM5A$_cZ%{1eU~b2Fhvi80`iANyj@QFqTwA^@^mY2h xHTQkBSt1rmByalm`(oU8xo@Y{)NAJab1(K4VzgkN7z%U>gQu&X%Q~loCIFQRXxjh) diff --git a/recipes/icons/theonion.png b/recipes/icons/theonion.png deleted file mode 100644 index c0941b8d83a131bc905c675998c17b534215dc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;VE0AXBapdXul$ac-GA+_z zW}?lUOpgVHA&VeN3V@Z%-FoVOh z8)-mJt*47)NChM7fp)=W10IG0)3uqVzp>BdV|eqNmBEPZL7o5l+-v&|&ig#GvgRps zezfh*#aCHZui15T>)lxfZnxiDde_+^r@!6QNXYHO>7qB6gzi0XiCWsvpBKAdZnJA- z;lb!Mo6XNNg(U<(uARCyF5%i7)kSBxE!eXggTe~DWM4f DavNbB diff --git a/recipes/icons/thewest_au.png b/recipes/icons/thewest_au.png deleted file mode 100644 index e66164eb97ee6911048c0af82065df3708865d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 586 zcmV-Q0=4~#P)P)t-s00030 z|Nj78ivU`O09S(mV2=P|lK@nH08x7L`1<<%{Qzc}+Uf8$gscl$fDB)W6k&)QWQhP| zmOP5FLXNXXk+n&WvQLz^U6!+5l(1rytz?_FW}LTZpSrlx-?q`;w9((P(B8V#;l0)2 zz|`Ks)!zV4b=>Li{r>&{Mrpy><#(jIc%!*@ zqPTLOwQQTRCUcoAbeJ)Bn=g2s#@XV@+vLaG=E>gZf3nPow#^-CksEH8YM{Gmp}l0F zy8x25P@e;oIVf_F;XwVpOSd|K)MK~(eP*|)P@1<7M0=+rs*UO1 zra)Y=_Rq;Le(YZjDo>&aLHP0oX&CyvDfRScK>%CLzK3Zo$s+oT9$^g94*jju;Y3Q% zs~(jk$jju}m|kmdvG{+rAwfu#7i;hlyyc+E~U>MHhOViSJA$PFpHn|KKoW%jI YXB$K$C1ehCEdT%j07*qoM6N<$f-Uhk-T(jq diff --git a/recipes/icons/think_progress.png b/recipes/icons/think_progress.png deleted file mode 100644 index 33f0b5def1ebea81f26196b573e22b8d793fd465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 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 diff --git a/recipes/icons/timesnewroman.png b/recipes/icons/timesnewroman.png deleted file mode 100644 index 39bd309d679724d681b2c078d8275af5a8c6800b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 zcmV;T0bTxyP)eKYuPR zF5cVQ8x$0D|Nec#8usnmCnO})+uPUL+O~D;R>B%GGcvfixEku~XU&?mYUL^d8a{sf zxPAMMgv2CMQ?t;}(32-mzJ2=^pN5qySMJ%f=kMQtj~_n)D&4<-|M~OhacTe*Mu$8I z0s$0&1Bo#LjZORczqFnD7c^?pqFt3)G=RbhI2aTNa%>coVUSG<5ei3d$4w_w&%<}m zM_2VCog2Y^x1(vg2Y_wa@pF M07*qoM6N<$g8ibwVgLXD diff --git a/recipes/icons/tnxm.png b/recipes/icons/tnxm.png deleted file mode 100644 index 527d9e55df39d42e50143bebcc10a6d856e7c80e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhfBgS%?<(PQX6KFj zuQxgUw%3$c!k*V~T}pXR*Fpx@Gxc+C*6(0+V4TGJAtu*hCgZu&TThrUG`>tY@Or)e zK?$yenn%0`7!y7<>+*QFVdQ&MBb@0Mz?I!~g&Q diff --git a/recipes/icons/today_online.png b/recipes/icons/today_online.png deleted file mode 100644 index 165241c5d67d3b88a4a2b92c2d018b5c21803007..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576 zcmV-G0>Axg;nL4h1aV89Yqf)a@Zgp;z~wd)Hq zQitZ#cym`h;9xA)FoyMSs$~I_`8j;*xT<&ogW3J){O6S@6w}*Atab7?75du=r>rjm zFxmSY{Z_;}y_g9u&N=+46au;s&MUiLl~M>Ho>z`5wGcx#ue{dvel?}9Cp08vP*Qz+ zCUnSA>V<5zkU_j!h#?e&7hVX#6@>49PH=~(#*J#m(^=cTEj=|v6ipu$V~;+I`|f*A zpzj8c37emy5C|c6@XiZ~AqMU9eL}^r^C{GC4W9xw(1j)TuQ!wJx5X-qu#_RTU2&JcK&w zchr+uA@H?j1jR zc;@t zU2R52MpIK0Q0eX4cduT(e&NEUB}xEN%$_wHXn>uay`Nuz zprD|amlx0~Cnu*_v*whRRxmO$PM(ACui6uG})?d1*YprLg1*fBFRGd(S>bsIN90{ipl&%VCCR#sNU#l_23 zuKMxp>9OYeFCRZ5V*25O2gj#Q{&wLUJVyWi`!|2lB4-!ZMN5}2t*Lr*;~FGEA(F=D zH?NO%cU+x0_5J0GzdyYH|Mlya2ltJ1w1ENI(%$~^H6o@F;14KHj-8o3{mkSEXQoWN zzG!|~PL7+W=jP4Z`uqDaG$19*Uw{An`~%ef|H7qliJBy@ TH%nm_00000NkvXXu0mjfcU)hA diff --git a/recipes/icons/tomshardware_de.png b/recipes/icons/tomshardware_de.png deleted file mode 100644 index 8759ffb474b749ee85ef5c91c285538f25b40484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 685 zcmV;e0#f~nP)eL}^r^C{GC4W9xw(1j)TuQ!wJx5X-qu#_RTU2&JcK&w zchr+uA@H?j1jR zc;@t zU2R52MpIK0Q0eX4cduT(e&NEUB}xEN%$_wHXn>uay`Nuz zprD|amlx0~Cnu*_v*whRRxmO$PM(ACui6uG})?d1*YprLg1*fBFRGd(S>bsIN90{ipl&%VCCR#sNU#l_23 zuKMxp>9OYeFCRZ5V*25O2gj#Q{&wLUJVyWi`!|2lB4-!ZMN5}2t*Lr*;~FGEA(F=D zH?NO%cU+x0_5J0GzdyYH|Mlya2ltJ1w1ENI(%$~^H6o@F;14KHj-8o3{mkSEXQoWN zzG!|~PL7+W=jP4Z`uqDaG$19*Uw{An`~%ef|H7qliJBy@ TH%nm_00000NkvXXu0mjfcU)hA diff --git a/recipes/icons/tomshardware_it.png b/recipes/icons/tomshardware_it.png deleted file mode 100644 index ad467b86d3c2dd703cdcd3fcf7710752edd1efa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1192 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0VDb#`32_B-Z(Eq&aj?9pseMyd z@0NkVEd%|Z|F_=M)4QpqeN#*4rnc@)UEQk!GB@?~?^v7PP}R6?X?9&k`MRv~En}k_ z8d|pu4Q`to-?lWp31piX-qhB)Wn^$eP4kw%{tb1l8>*T&HFa*NXx!A$zM-ssLrLxJ zy2&>b)gEO=UzbyP5FK<~TJe66_k&Qs8!GCrw>00>*So2s3p5I75l}mj0n`XGQ(qtC zJR?Jpl$s{cSdao07y`0E7HQwHF^9?m9bjk(Gz!dxD+6l;>QdDJc}-6bWCGAApn+gP zu(1#}l)R}6@dZc=P#MrMx6Mot>VYoQ(gEoLn{!J~A8Z{+8OXnIaYF;3+kjyO3S@Yw z0)qvpT~iwzXkae`gA1(YmND3yKpz2J2owYx4)i`qy`DZO1YjayTQq>-0}}-K3#0|8 z7s3Gh3ls$)L7*2vBuE#;SWxgn!V@eA4hN7dP#I7oPz{6uB!N;u1Th3?4#*|o6aw-o zNb$n8U$lUU=}<|KUoem+4e%(at0~KKGI1~|RUdlz;@Oi&GbNaE4;C=9gkSsj_xQ?p zr}>#boR0nYuoc!^`GXm<@8Ew-2JwORa8%ylZ`{iNR5%p z+S*i!QFASu-rIegCOnp(Px0Gd5OV!-Rn+^IWZ<8BvJsEto~x(6)-f#pWM1{fw(+}j z$4}2rUzdvql^Dg8MFcP1_G4gR^zn3Y46!)9cEWz`BZ)G{p}Fenv5=ONj^eoo?kRdY8I%%YqcW1Pkl$bsr7Q dZXenIjQOyz%N*`J$0Yx5gs{A;0 zp5gbyCyyiyAIq6PvkCmrGxMcy0+0=qek^19(kK4oggN(_WMBFv0`=Tyl>Kr1EW@vx z_Z|vrKh<^l^XA>(kDs19g*{fZ1Zj{r2deuxaqa^y)u(!{Z!#)CHk>%e@bBl(mjOu- zWBz^o{K7R7T?4QBBPru&<~|SkG(j4Ga(|w_cxvosmOS86d6QZO3^!ot0lof2)8QeX2FOXjA3T1dZVy!bRNwX2 zod-XTodN29z^M#$(vMRYKFwHsk3kgZ!WTaA_Zg&svcn-Q0RVL3S;$1%S`q*N002ov JPDHLkV1jCMzZ(Dm diff --git a/recipes/icons/toyokeizai.png b/recipes/icons/toyokeizai.png deleted file mode 100644 index 1caad7a3ed238766419a8704ad6571ad70b1e98c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1515 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 Dzl~Hl diff --git a/recipes/icons/tveast_dk.png b/recipes/icons/tveast_dk.png deleted file mode 100644 index ffd2a8dfce6df28fd4a5440330a116c0a7025714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjE0A_$;(NfV13`7hIlq8H zEG0pH!3>PmpL8|t7XbOzo-U3d6}NiNDhe?_Kd#zvt#Dy~ yB0WWVPF_Ip$_^cCZQnJ_tEX3ezJJ>0H$&iC+QreoOJg*N2t3bx{J`Ys z_IYFa9R%Qzy6i<84y}5l(;Zf1K7Ro!#F znRVeTmKr+n>ZAP5GHKG%3j%~A!15^q5g>%a4=7w8DA$1JpK5scRzpOQW7*H861ClH zjJF@Y@N<>VnmV!z-MVxrUVbRzQ^7z;_?)QWPjGSg;%k%*536VPL_{LUt0tN^jpJRx#NIP+@uA?h_AIBT z6pcrFmR%A4T87iT0go~{OdHVyd}0dUGy_ArHVKW4!14VMXkqf8j<|9^k6SPFXwjf4 zsbZL1^Ef^hO$2pUo)+N|8Ox{i#!uVD=^L*wZg3j!zNmQlu7DM@TOkpTfXj@vZyih0 zyk=%9rUTOo5aSXSOzwjRuk-K%0mc|^J}H4v4grGT_f`mG&d{c1(sfv)0uvp^HrSBI zt5uJgKWoq`7B1e)L9Lj$`=WqLkBT6~$HQ!>AZMafwUG(mHc46KZgoHDHh*8bSd&f} zfzn?D00AHfg@E`|QwkykKsboRkx)4Lry8TZQa#Z*VJ>0XvkTw54x9cx!ueQ7NQxs! z2#^5AAs7Q8>~~Ei3GtYWwk;GS0yW1SZLL~yvJwDHN;#*qR9> zt(xSPpLA`-_RJa6{Um_kKR`X^u3XO~rCpy`vibBxqUmTR@%E-|xdl~!W>$>ztr|zJ d0QmNA&o5F@iM<##OIrW{002ovPDHLkV1nYPq&olr diff --git a/recipes/icons/tvxs.png b/recipes/icons/tvxs.png deleted file mode 100644 index 6512af75b5fe20d29ee4b494ed6a1e0ad71b730f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 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 diff --git a/recipes/icons/ukraiyns_tizhdien.png b/recipes/icons/ukraiyns_tizhdien.png deleted file mode 100644 index 2c6d8118a60c78ab6ad55c55d4f2add032c4e380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmV-D0mA-?P)|1B)MpXB5rr71^UZvLSuEy#;nJsZj>t9p#<4WJl1X0l@KVIvhx z+PAN0Bw*T|?!>|?UZxUKbTD5mb>t9BI?8N!=-3~^5#SW%YymFGm57 P00000NkvXXu0mjfdT^bj diff --git a/recipes/taipei.recipe b/recipes/taipei.recipe deleted file mode 100644 index a753bf526f..0000000000 --- a/recipes/taipei.recipe +++ /dev/null @@ -1,69 +0,0 @@ -import re - -from calibre.web.feeds.news import BasicNewsRecipe - - -def classes(classes): - q = frozenset(classes.split(' ')) - return dict( - attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)} - ) - - -class TN(BasicNewsRecipe): - title = u'Taipei Times' - language = 'en_TW' - __author__ = 'Krittika Goyal' - oldest_article = 1 # days - max_articles_per_feed = 25 - use_embedded_content = False - - no_stylesheets = True - - keep_only_tags = [ - dict(name='h1'), - dict(name='h3', attrs={'class': 'a'}), - classes('main_ipic reporter text page'), - ] - - feeds = [ - ('Front Page', 'http://www.taipeitimes.com/xml/front.rss'), - ('Editorials', 'http://www.taipeitimes.com/xml/editorials.rss'), - ('Taiwan', 'http://www.taipeitimes.com/xml/taiwan.rss'), - ('Features', 'http://www.taipeitimes.com/xml/feat.rss'), - ('Business', 'http://www.taipeitimes.com/xml/biz.rss'), - ('World', 'http://www.taipeitimes.com/xml/world.rss'), - ('Sports', 'http://www.taipeitimes.com/xml/sport.rss'), - ] - - def preprocess_html(self, soup, *a): - for div in soup.findAll(**classes('page')): - for a in div.findAll('a', href=True): - a['data-calibre-follow-link'] = '1' - if a['href'].startswith('/'): - a['href'] = 'http://www.taipeitimes.com' + a['href'] - return soup - - recursions = 1 - - def is_link_wanted(self, url, tag): - digit = re.search(r'/(\d+)$', url) - if digit is not None and tag['data-calibre-follow-link'] == '1' and re.match(r'\d+', self.tag_to_string(tag)) is not None: - if int(digit.group(1)) > 1: - return True - return False - - def postprocess_html(self, soup, *a): - for div in soup.findAll(**classes('page')): - div.extract() - return soup - - # def parse_index(self): - # return [( - # 'Articles', [{ - # 'title': - # 'test', - # 'url': - # 'http://www.taipeitimes.com/News/editorials/archives/2019/02/26/2003710411' - # }] - # )] diff --git a/recipes/tanea.recipe b/recipes/tanea.recipe deleted file mode 100644 index 274f8f867f..0000000000 --- a/recipes/tanea.recipe +++ /dev/null @@ -1,32 +0,0 @@ -from calibre.web.feeds.recipes import BasicNewsRecipe - - -class TaNea(BasicNewsRecipe): - title = u'Ta Nea' - __author__ = 'Pan' - oldest_article = 1 - max_articles_per_feed = 100 - no_stylesheets = True - language = 'el' - - remove_tags_before = dict(name='div', attrs={'id': 'print-body'}) - remove_tags_after = dict(name='div', attrs={'id': 'text'}) - - feeds = [ - (u'\xce\x95\xce\xbb\xce\xbb\xce\xac\xce\xb4\xce\xb1', - u'http://www.tanea.gr/default.asp?pid=66&la=1'), - (u'\xce\x9a\xcf\x8c\xcf\x83\xce\xbc\xce\xbf\xcf\x82', - u'http://www.tanea.gr/default.asp?pid=67&la=1'), - (u'\xce\x9f\xce\xb9\xce\xba\xce\xbf\xce\xbd\xce\xbf\xce\xbc\xce\xaf\xce\xb1', - u'http://www.tanea.gr/default.asp?pid=68&la=1'), - (u'\xce\xa0\xce\xbf\xce\xbb\xce\xb9\xcf\x84\xce\xb9\xcf\x83\xce\xbc\xcf\x8c\xcf\x82', - u'http://www.tanea.gr/default.asp?pid=69&la=1'), - (u'\xce\x93\xce\xbd\xcf\x8e\xce\xbc\xce\xb5\xcf\x82', - u'http://www.tanea.gr/default.asp?pid=79&la=1'), - (u'\xce\xa1\xce\xb9\xcf\x80\xce\xad\xcf\x82', - u'http://www.tanea.gr/default.asp?pid=80&la=1'), - (u'\xce\x91\xce\xb9\xcf\x87\xce\xbc\xce\xad\xcf\x82', - u'http://www.tanea.gr/default.asp?pid=81&la=1')] - - def print_version(self, url): - return url.replace('http://www.tanea.gr/default.asp?pid=2', 'http://www.tanea.gr/default.asp?pid=96') diff --git a/recipes/tanuki.recipe b/recipes/tanuki.recipe deleted file mode 100644 index b02527304b..0000000000 --- a/recipes/tanuki.recipe +++ /dev/null @@ -1,46 +0,0 @@ -import re - -from calibre.web.feeds.news import BasicNewsRecipe - - -class tanuki(BasicNewsRecipe): - title = u'Tanuki' - oldest_article = 7 - __author__ = 'fenuks' - description = u'Tanuki - portal o anime i mandze.' - category = 'anime, manga' - language = 'pl' - max_articles_per_feed = 100 - encoding = 'utf-8' - autocleanup = True - extra_css = 'ul {list-style: none; padding: 0; margin: 0;} .kadr{float: left;} .dwazdania {float: right;}' - preprocess_regexps = [(re.compile(u'

', re.DOTALL), lambda match: ''), (re.compile( - type(u'')(r''), re.DOTALL), lambda match: '')] - remove_empty_feeds = True - no_stylesheets = True - keep_only_tags = [dict(attrs={'class': ['animename', 'storyname', 'nextarrow', 'sideinfov', 'sidelinfov', 'sideinfo', 'sidelinfo']}), dict(name='table', attrs={ 'summary': 'Technikalia'}), dict(attrs={'class': ['chaptername', 'copycat']}), dict(id='rightcolumn'), dict(attrs={'class': ['headn_tt', 'subtable']})] # noqa - remove_tags = [dict(name='div', attrs={'class': 'screen'}), dict(id='randomtoplist'), dict(attrs={'class': 'note'})] - feeds = [ - (u'Anime', u'http://anime.tanuki.pl/rss_anime.xml'), - (u'Manga', u'http://manga.tanuki.pl/rss_manga.xml'), - (u'Tomiki', u'http://manga.tanuki.pl/rss_mangabooks.xml'), - - (u'Artyku\u0142y', u'http://czytelnia.tanuki.pl/rss_czytelnia_artykuly.xml'), - (u'Opowiadania', u'http://czytelnia.tanuki.pl/rss_czytelnia.xml')] - - def append_page(self, soup, appendtag): - nexturl = appendtag.find(attrs={'class': 'nextarrow'}) - if nexturl: - while nexturl: - soup2 = self.index_to_soup( - 'http://czytelnia.tanuki.pl' + nexturl['href']) - nexturl = soup2.find(attrs={'class': 'nextarrow'}) - pagetext = soup2.find( - attrs={'class': ['chaptername', 'copycat']}) - pos = len(appendtag.contents) - appendtag.insert(pos, pagetext) - pagetext = soup2.find(attrs={'class': 'copycat'}) - pos = len(appendtag.contents) - appendtag.insert(pos, pagetext) - for r in appendtag.findAll(attrs={'class': 'nextarrow'}): - r.extract() diff --git a/recipes/taz.recipe b/recipes/taz.recipe deleted file mode 100644 index e571fade50..0000000000 --- a/recipes/taz.recipe +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -__license__ = 'GPL v3' -__copyright__ = '2010, Lars Jacob jacob.lars at gmail.com' -__docformat__ = 'restructuredtext de' - -''' -www.taz.de/digiabo -''' -import os -import zipfile - -from calibre.ptempfile import PersistentTemporaryFile -from calibre.web.feeds.news import BasicNewsRecipe - -try: - from urllib.error import HTTPError - from urllib.request import HTTPBasicAuthHandler, build_opener, install_opener, urlopen -except ImportError: - from urllib2 import HTTPBasicAuthHandler, HTTPError, build_opener, install_opener, urlopen - - -class TazDigiabo(BasicNewsRecipe): - - title = u'Taz Digiabo' - description = u'Das EPUB DigiAbo der Taz' - language = 'de' - lang = 'de-DE' - - __author__ = 'Lars Jacob' - needs_subscription = True - - conversion_options = { - 'no_default_epub_cover': True - } - - def build_index(self): - domain = "http://dl.taz.de" - - url = domain + "/epub/" - - auth_handler = HTTPBasicAuthHandler() - auth_handler.add_password(realm='TAZ-ABO', - uri=url, - user=self.username, - passwd=self.password) - opener = build_opener(auth_handler) - install_opener(opener) - - try: - f = urlopen(url) - except HTTPError: - self.report_progress(0, _('Can\'t login to download issue')) - raise ValueError('Failed to login, check your username and' - ' password') - - tmp = PersistentTemporaryFile(suffix='.epub') - self.report_progress(0, _('downloading epub')) - tmp.write(f.read()) - tmp.close() - - zfile = zipfile.ZipFile(tmp.name, 'r') - self.report_progress(0, _('extracting epub')) - - zfile.extractall(self.output_dir) - - tmp.close() - index = os.path.join(self.output_dir, 'content.opf') - - self.report_progress(1, _('epub downloaded and extracted')) - - return index diff --git a/recipes/tech_economy.recipe b/recipes/tech_economy.recipe deleted file mode 100644 index 53d8a56f83..0000000000 --- a/recipes/tech_economy.recipe +++ /dev/null @@ -1,15 +0,0 @@ -__license__ = 'GPL v3' -from calibre.web.feeds.news import BasicNewsRecipe - - -class AdvancedUserRecipe1327051385(BasicNewsRecipe): - title = u'Tech Economy' - oldest_article = 7 - max_articles_per_feed = 100 - auto_cleanup = True - masthead_url = 'http://www.techeconomy.it/wp-content/uploads/2012/01/Logo-TE9.png' - feeds = [(u'Tech Economy', u'http://www.techeconomy.it/feed/')] - remove_tags_after = [dict(name='div', attrs={'class': 'cab-author-name'})] - __author__ = 'faber1971' - description = 'Italian website on technology - v1.00 (28, January 2012)' - language = 'it' diff --git a/recipes/tech_world.recipe b/recipes/tech_world.recipe deleted file mode 100644 index 2be557ab8e..0000000000 --- a/recipes/tech_world.recipe +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python -__license__ = 'GPL v3' -__author__ = 'Lorenzo Vigentini' -__copyright__ = '2009, Lorenzo Vigentini ' -__version__ = 'v1.01' -__date__ = '14, January 2010' - -''' -http://www.techworld.com/ -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class techworld(BasicNewsRecipe): - __author__ = 'Lorenzo Vigentini' - description = 'Techworld offers the latest breaking IT industry news, product reviews, enterprise software downloads, how-to articles and expert blogs for technical professionals and enterprise users in the UK' # noqa - - title = 'TechWorld' - publisher = 'IDG Communication' - category = ('Apple, Mac, video, computing, product reviews, ' - 'editing, cameras, production') - - language = 'en' - timefmt = '[%a, %d %b, %Y]' - - oldest_article = 7 - max_articles_per_feed = 15 - use_embedded_content = False - recursion = 10 - - remove_javascript = True - no_stylesheets = True - auto_cleanup = True - - feeds = [ - (u'News', u'http://www.techworld.com/news/rss'), - (u'Tutorial', u'http://www.techworld.com/tutorial/rss'), - (u'Reviews', u'http://www.techworld.com/review/rss'), - (u'Features', u'http://www.techworld.com/features/rss'), - (u'Analysis', u'http://www.techworld.com/analysis/rss'), - (u'Galleries', - u'http://www.techworld.com/picture-gallery/rss'), - (u'TechWorld Blogs', - u'http://www.techworld.com/blog/rss'), - ] diff --git a/recipes/technology_review.recipe b/recipes/technology_review.recipe deleted file mode 100644 index f475f9ac4c..0000000000 --- a/recipes/technology_review.recipe +++ /dev/null @@ -1,31 +0,0 @@ -from calibre.web.feeds.news import BasicNewsRecipe - - -class TechnologyReview(BasicNewsRecipe): - title = u'Technology Review' - __author__ = 'rty' - description = 'MIT Technology Magazine (from RSS feeds)' - publisher = 'Technology Review Inc.' - category = 'Technology, Innovation, R&D' - language = 'en' - oldest_article = 14 - max_articles_per_feed = 100 - No_stylesheets = True - auto_cleanup = True - extra_css = """ - .ArticleBody {font: normal; text-align: justify} - .headline {font: bold x-large} - .subheadline {font: italic large} - """ - feeds = [ - (u'Computing', - u'http://feeds.technologyreview.com/technology_review_Computing'), - (u'Energy', - u'http://feeds.technologyreview.com/technology_review_Energy'), - (u'Materials', - u'http://feeds.technologyreview.com/technology_review_Materials'), - (u'Biomedicine', - u'http://feeds.technologyreview.com/technology_review_Biotech'), - (u'Business', - u'http://feeds.technologyreview.com/technology_review_Biztech') - ] diff --git a/recipes/technology_review_de.recipe b/recipes/technology_review_de.recipe deleted file mode 100644 index 3caf9bc54f..0000000000 --- a/recipes/technology_review_de.recipe +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 -from __future__ import absolute_import, division, print_function, unicode_literals - -__license__ = 'GPL v3' -__copyright__ = '2010, Anton Gillert ' - -''' -Technology Review (deutsch) - heise.de/tr -''' - -import re - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TechnologyReviewDe(BasicNewsRecipe): - title = 'Technology Review' - __author__ = 'Anton Gillert, schuster' - description = 'Technology news from Germany' - language = 'de' - - oldest_article = 14 - max_articles_per_feed = 50 - use_embedded_content = False - no_stylesheets = True - remove_javascript = True - - masthead_url = 'http://1.f.ix.de/imgs/02/3/0/8/5/2/8/tr_logo-544bd18881c81263.png' - - feeds = [ - ('News', 'http://www.heise.de/tr/rss/news-atom.xml'), - ('Blog', 'http://www.heise.de/tr/rss/blog-atom.xml') - ] - - keep_only_tags = [ - dict(name='article') - ] - - remove_tags = [ - dict(name='nav'), - dict(name='figure', attrs={'class': 'logo'}), - dict(name='hr') - ] - - extra_css = '.bild_zentriert {font-size: 0.6em} \ - .source {font-size: 0.6em}' - - def get_cover_url(self): - self.cover_url = '' - soup = self.index_to_soup('http://www.heise.de/tr/magazin/') - img = soup.find('img', alt=re.compile( - 'Titelbild Technology Review'), src=True) - if img: - self.cover_url = 'http://www.heise.de' + img['src'] - return self.cover_url - - def print_version(self, url): - return url + '?view=print' - - def preprocess_html(self, soup): - # remove style attributes - for item in soup.findAll(attrs={'style': True}): - del item['style'] - # remove reference to article source - for p in soup.findAll('p'): - if 'URL dieses Artikels:' in self.tag_to_string(p): - p.extract() - return soup diff --git a/recipes/techtarget.recipe b/recipes/techtarget.recipe deleted file mode 100644 index e60f7b3f69..0000000000 --- a/recipes/techtarget.recipe +++ /dev/null @@ -1,64 +0,0 @@ -from calibre.web.feeds.news import BasicNewsRecipe - - -class TechTarget(BasicNewsRecipe): - title = u'Techtarget' - __author__ = 'Julio:map' - description = '''IT Infrastructure related blogs - from Techtarget''' - publisher = 'Techtarget' - category = 'IT, Infrastructure' - oldest_article = 7 - language = 'en' - max_articles_per_feed = 100 - no_stylesheets = True - use_embedded_content = False - needs_subscription = True - auto_cleanup = False - LOGIN = u'http://searchservervirtualization.techtarget.com/login' - - def get_browser(self): - br = BasicNewsRecipe.get_browser(self) - if self.username is not None: - br.open(self.LOGIN) - br.select_form(nr=1) - br['email'] = self.username - if self.password is not None: - br['password'] = self.password - br.submit() - return br - - keep_only_tags = [dict(name='div', attrs={'id': 'article'}), dict( - name='div', attrs={'class': 'entry'})] - remove_tags = [ - dict(name='div', attrs={'id': ['articleToolbar', 'relatedContent']})] - remove_tags_after = [dict(name='div', attrs={'id': 'relatedContent'})] - - feeds = [ - (u'IT news and analysis for CIOs', - u'http://feeds.pheedo.com/SearchCIOITNewsAndAnalysisForCIOs'), - (u'TotalCIO', u'http://feeds.pheedo.com/1532.xml'), - (u'SearchCIO-Midmarket: Technology news and tips for midmarket CIOs', - u'http://feeds.pheedo.com/techtarget/Searchsmb/Smbs'), - (u'Compliance news and advice for senior IT and business managers', - u'http://feeds.pheedo.com/tt/1200'), - (u'Server virtualization news and opinions', - u'http://feeds.pheedo.com/SearchservervirtualizationServerVirtualizationNewsAndOpinions'), - (u'The Virtualization Room', u'http://feeds.pheedo.com/techtarget/nzLe'), - (u'Server virtualization technical tips and expert advice', - u'http://feeds.pheedo.com/SearchservervirtualizationServerVirtualizationTechnicalTipsAndExpertAdvice'), - (u'Cloud Computing news and Technical Advice', - u'http://feeds.pheedo.com/1260'), - (u'IT infrastructure news', - u'http://feeds.pheedo.com/techtarget/Searchdatacenter/ItInfrastructure'), - (u'Storage Channel Update', - u'http://feeds.pheedo.com/ChannelMarker-TheItChannelWeblog'), - (u'VMware Tips and News', - u'http://feeds.pheedo.com/SearchvmwarecomVmwareTipsAndTricks'), - (u'Enterprise IT news roundup', - u'http://feeds.pheedo.com/WhatisEnterpriseItNewsRoundup'), - (u'WhatIs: Enterprise IT tips and expert advice', - u'http://feeds.pheedo.com/WhatisEnterpriseItTipsAndExpertAdvice'), - (u'WhatIs: Enterprise IT news roundup', - u'http://feeds.pheedo.com/WhatisEnterpriseItNewsRoundup'), - ] diff --git a/recipes/tedneward.recipe b/recipes/tedneward.recipe deleted file mode 100644 index b4039dea52..0000000000 --- a/recipes/tedneward.recipe +++ /dev/null @@ -1,30 +0,0 @@ - -__license__ = 'GPL v3' -__copyright__ = '2011, Darko Miletic ' -''' -blogs.tedneward.com -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class InteroperabilityHappens(BasicNewsRecipe): - title = 'Interoperability Happens' - __author__ = 'Darko Miletic' - description = 'Tech blog by Ted Neward' - oldest_article = 15 - max_articles_per_feed = 100 - language = 'en' - encoding = 'utf-8' - no_stylesheets = True - use_embedded_content = True - publication_type = 'blog' - extra_css = """ - body{font-family: Verdana,Arial,Helvetica,sans-serif} - """ - - conversion_options = { - 'comment': description, 'tags': 'blog, technology, microsoft, programming, C#, Java', 'publisher': 'Ted Neward', 'language': language - } - - feeds = [(u'Posts', u'http://blogs.tedneward.com/SyndicationService.asmx/GetRss')] diff --git a/recipes/telam.recipe b/recipes/telam.recipe deleted file mode 100644 index 4fa81b0032..0000000000 --- a/recipes/telam.recipe +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python -# -*- mode: python -*- -# -*- coding: utf-8 -*- - -__license__ = 'GPL v3' -__copyright__ = '2012-2016, Darko Miletic ' -''' -www.telam.com.ar -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class Telam(BasicNewsRecipe): - title = 'Telam' - __author__ = 'Darko Miletic' - description = 'AGENCIA DE NOTICIAS DE LA REPUBLICA ARGENTINA' - publisher = 'Telam S.E.' - category = 'news, politics, Argentina' - oldest_article = 2 - max_articles_per_feed = 200 - no_stylesheets = True - encoding = 'windows-1252' - use_embedded_content = False - language = 'es_AR' - remove_empty_feeds = True - auto_cleanup = True - publication_type = 'newsportal' - PREFIX = 'http://www.telam.com.ar' - masthead_url = 'http://www.telam.com.ar/assets/img/logo.svg' - extra_css = """ - body{font-family: Arial,Helvetica,sans-serif } - img{margin-bottom: 0.4em; display:block} - """ - - conversion_options = { - 'comment': description, 'tags': category, 'publisher': publisher, 'language': language - } - - feeds = [ - (u'Ultimas noticias', u'http://www.telam.com.ar/rss2/ultimasnoticias.xml'), - (u'Politica', u'http://www.telam.com.ar/rss2/politica.xml'), - (u'Economia', u'http://www.telam.com.ar/rss2/economia.xml'), - (u'Sociedad', u'http://www.telam.com.ar/rss2/sociedad.xml'), - (u'Policiales', u'http://www.telam.com.ar/rss2/policiales.xml'), - (u'Internacionales', u'http://www.telam.com.ar/rss2/internacional.xml'), - (u'Espectaculos', u'http://www.telam.com.ar/rss2/espectaculos.xml'), - (u'Cultura', u'http://www.telam.com.ar/rss2/cultura.xml'), - (u'Deportes', u'http://www.telam.com.ar/rss2/deportes.xml'), - (u'Educacion', u'http://www.telam.com.ar/rss2/educacion.xml') - ] - - def get_article_url(self, article): - url = BasicNewsRecipe.get_article_url(self, article) - if url.startswith('/'): - return self.PREFIX + url - return url diff --git a/recipes/telepolis_artikel.recipe b/recipes/telepolis_artikel.recipe deleted file mode 100644 index bc1c8bbad0..0000000000 --- a/recipes/telepolis_artikel.recipe +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- - -__license__ = 'GPL v3' -__copyright__ = '2009, Gerhard Aigner ' - -''' http://www.derstandard.at - Austrian Newspaper ''' -import re - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TelepolisArtikel(BasicNewsRecipe): - title = u'Telepolis (Artikel)' - __author__ = 'Gerhard Aigner' - publisher = 'Heise Zeitschriften Verlag GmbH & Co KG' - category = 'news' - description = 'Telepolis Artikel' - language = 'de_AT' - oldest_article = 7 - max_articles_per_feed = 100 - recursion = 0 - no_stylesheets = True - - use_embedded_content = False - remove_empty_feeds = True - - remove_tags_before = dict(name='h1') - remove_tags = [dict(name='img')] - - feeds = [(u'Artikel', u'http://www.heise.de/tp/rss/news-a.rdf')] - - preprocess_regexps = [(re.compile(r']*>', re.DOTALL | re.IGNORECASE), lambda match: ''), - (re.compile(r'', re.DOTALL | re.IGNORECASE), lambda match: ''), ] - - html2lrf_options = [ - '--comment', description, '--category', category, '--publisher', publisher] - - html2epub_options = 'publisher="' + publisher + \ - '"\ncomments="' + description + '"\ntags="' + category + '"' - - def print_version(self, url): - p = re.compile(r'\d{5}', re.DOTALL | re.IGNORECASE) - m = p.search(url) - return "http://www.heise.de/bin/tp/issue/r4/dl-artikel2.cgi?artikelnr=" + m.group() + "&mode=print" diff --git a/recipes/thai_post_daily.recipe b/recipes/thai_post_daily.recipe deleted file mode 100644 index 1a04b797b8..0000000000 --- a/recipes/thai_post_daily.recipe +++ /dev/null @@ -1,40 +0,0 @@ -from calibre.web.feeds.news import BasicNewsRecipe - - -class AdvancedUserRecipe1299054026(BasicNewsRecipe): - title = u'Thai Post Daily' - __author__ = 'Chotechai P.' - language = 'th' - oldest_article = 7 - max_articles_per_feed = 100 - cover_url = 'http://upload.wikimedia.org/wikipedia/th/1/10/ThaiPost_Logo.png' - feeds = [ - (u'\u0e02\u0e48\u0e32\u0e27\u0e2b\u0e19\u0e49\u0e32\u0e2b\u0e19\u0e36\u0e48\u0e07', u'http://thaipost.net/taxonomy/term/1/all/feed'), - (u'\u0e1a\u0e17\u0e1a\u0e23\u0e23\u0e13\u0e32\u0e18\u0e34\u0e01\u0e32\u0e23', u'http://thaipost.net/taxonomy/term/11/all/feed'), - (u'\u0e40\u0e1b\u0e25\u0e27 \u0e2a\u0e35\u0e40\u0e07\u0e34\u0e19', u'http://thaipost.net/taxonomy/term/2/all/feed'), - (u'\u0e2a\u0e20\u0e32\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e0a\u0e19', u'http://thaipost.net/taxonomy/term/3/all/feed'), - (u'\u0e16\u0e39\u0e01\u0e17\u0e38\u0e01\u0e02\u0e49\u0e2d', u'http://thaipost.net/taxonomy/term/4/all/feed'), - (u'\u0e01\u0e32\u0e23\u0e40\u0e21\u0e37\u0e2d\u0e07', u'http://thaipost.net/taxonomy/term/5/all/feed'), - (u'\u0e17\u0e48\u0e32\u0e19\u0e02\u0e38\u0e19\u0e19\u0e49\u0e2d\u0e22', u'http://thaipost.net/taxonomy/term/12/all/feed'), - (u'\u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21\u0e1e\u0e34\u0e40\u0e28\u0e29', u'http://thaipost.net/taxonomy/term/66/all/feed'), - (u'\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1e\u0e34\u0e40\u0e28\u0e29', u'http://thaipost.net/taxonomy/term/67/all/feed'), - (u'\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e2b\u0e19\u0e49\u0e32 4', u'http://thaipost.net/taxonomy/term/13/all/feed'), - (u'\u0e40\u0e2a\u0e35\u0e22\u0e1a\u0e0b\u0e36\u0e48\u0e07\u0e2b\u0e19\u0e49\u0e32', u'http://thaipost.net/taxonomy/term/64/all/feed'), - (u'\u0e04\u0e31\u0e19\u0e1b\u0e32\u0e01\u0e2d\u0e22\u0e32\u0e01\u0e40\u0e25\u0e48\u0e32', u'http://thaipost.net/taxonomy/term/65/all/feed'), - (u'\u0e40\u0e28\u0e23\u0e29\u0e10\u0e01\u0e34\u0e08', u'http://thaipost.net/taxonomy/term/6/all/feed'), - (u'\u0e01\u0e23\u0e30\u0e08\u0e01\u0e44\u0e23\u0e49\u0e40\u0e07\u0e32', u'http://thaipost.net/taxonomy/term/14/all/feed'), - (u'\u0e01\u0e23\u0e30\u0e08\u0e01\u0e2b\u0e31\u0e01\u0e21\u0e38\u0e21', u'http://thaipost.net/taxonomy/term/71/all/feed'), - (u'\u0e04\u0e34\u0e14\u0e40\u0e2b\u0e19\u0e37\u0e2d\u0e01\u0e23\u0e30\u0e41\u0e2a', u'http://thaipost.net/taxonomy/term/69/all/feed'), - (u'\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19', u'http://thaipost.net/taxonomy/term/68/all/feed'), - (u'\u0e2d\u0e34\u0e42\u0e04\u0e42\u0e1f\u0e01\u0e31\u0e2a', u'http://thaipost.net/taxonomy/term/10/all/feed'), - (u'\u0e01\u0e32\u0e23\u0e28\u0e36\u0e01\u0e29\u0e32-\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e2a\u0e38\u0e02', u'http://thaipost.net/taxonomy/term/7/all/feed'), # noqa - (u'\u0e15\u0e48\u0e32\u0e07\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28', u'http://thaipost.net/taxonomy/term/8/all/feed'), - (u'\u0e01\u0e35\u0e2c\u0e32', u'http://thaipost.net/taxonomy/term/9/all/feed')] - - def print_version(self, url): - return url.replace(url, 'http://www.thaipost.net/print/' + url[32:]) - - remove_tags = [] - remove_tags.append(dict(name='div', attrs={'class': 'print-logo'})) - remove_tags.append(dict(name='div', attrs={'class': 'print-site_name'})) - remove_tags.append(dict(name='div', attrs={'class': 'print-breadcrumb'})) diff --git a/recipes/the_daily_news_egypt.recipe b/recipes/the_daily_news_egypt.recipe deleted file mode 100644 index e7cf75239c..0000000000 --- a/recipes/the_daily_news_egypt.recipe +++ /dev/null @@ -1,46 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2011, Pat Stapleton ' -''' -abc.net.au/news -''' -import re - -from calibre.web.feeds.recipes import BasicNewsRecipe - - -class TheDailyNewsEG(BasicNewsRecipe): - title = u'The Daily News Egypt' - __author__ = 'Omm Mishmishah' - description = 'News from Egypt' - masthead_url = 'http://www.thedailynewsegypt.com/images/DailyNews-03_05.gif' - cover_url = 'http://www.thedailynewsegypt.com/images/DailyNews-03_05.gif' - - auto_cleanup = True - oldest_article = 7 - max_articles_per_feed = 100 - no_stylesheets = False - use_embedded_content = False - encoding = 'utf8' - publisher = 'The Daily News Egypt' - category = 'News, Egypt, World' - language = 'en_EG' - publication_type = 'newsportal' -# preprocess_regexps = [(re.compile(r'', re.DOTALL), lambda m: '')] -# Remove annoying map links (inline-caption class is also used for some -# image captions! hence regex to match maps.google) - preprocess_regexps = [(re.compile( - r' 182 - compress_news_images = True - compress_news_images_max_size = 100 - cover_url = 'http://www.thecodelesscode.com/pages/case-9/Lotus-050.jpg' - credits = [u'

{0}

'.format(title), - u'

By Qi

', - u'

An illustrated collection of (sometimes violent) fables concerning the Art and Philosophy of software development, written in the spirit of Zen kōans

', # noqa - u'

eBook conversion courtesy of {0}

'.format(__author__)] - description = u'The Art and Philosophy of software development, written in the spirit of Zen kōans' - extra_css = '.article_date { display: none; float: right; } \ - .chapter_title { font-size: 1.75em; margin-top: 0; } \ - .chapter_title::first-letter { font-size: 1.35em; font-weight: 500; letter-spacing: -.05em; } \ - h2 { margin-top: 0; } \ - .image_wrapper { text-align: center; }' - index = 'http://www.thecodelesscode.com/contents' - language = 'en' - max_articles_per_feed = 1000 # I can only wish - path_remappings = {} # IE, /case/182 -> articles_72/index.html - publication_type = 'blog' - publisher = 'Qi' - resolve_internal_links = True - scale_news_images = (600, 400) - simultaneous_downloads = 1 - url = 'http://www.thecodelesscode.com' - - def parse_index(self): - koans = [] - - # Retrieve the contents page, containing the ToC - soup = self.index_to_soup(self.index) - - for koan in soup.findAll('tr'): - # BS has some trouble with the weird layout - tag = koan.find('a') - - if tag is None: - continue - if 'random' in tag['href']: - continue - - # Minor coding error causes calibre to glitch; use the current date - # for the most recent title - koan_date = koan.find('td', attrs={'class': 'toc-date'}) - if koan_date is None: - koan_date = date.isoformat(date.today()) - else: - koan_date = koan_date.string - - title = tag.string - url = self.url + tag['href'] - - if u'The Applicant' in title: - continue # Only the main story - - koans.append({ - 'content': '', - 'date': koan_date, - 'description': '', - 'title': title, - 'url': url, - }) - - # ie, Mousetrap -> 182 - self.chapters[title] = url.split('/')[-1] - - # Oldest koans first - koans.reverse() - - # Log and then get out of here - self.log("Found {0} koans".format(len(koans))) - return([(self.title, koans)]) - - def preprocess_html(self, soup): - title = soup.find('h1', attrs={'class': 'title'}).find( - 'a', attrs={'class': 'subtle'}).string - - # Add a title at the beginning of each chapter - if title in self.chapters: - title = '
{0}
'.format(title) - - # Load up the actual story - koan = soup.find('div', attrs={'class': 'story koan'}) - - # Kind of a hack-y way to get .children in BS3
- # -> - contents = list(koan.contents) - koan = bs(title) - - for i in reversed(contents): - koan.insert(1, i) - - # Remove all anchors that don't contain /case/, leaving them as just their text - # Note that we'll come back and clean up /case/ links when the URLs are remapped - # during postprocess_book() - anchors = koan.findAll('a') - if anchors != []: - for anchor in anchors: - if '/case/' in anchor['href']: - pass - elif 'note' in anchor['href']: - anchor.replaceWith('') - else: - # Again, a hacky way to get the contents of the tag, thanks - # to BS3 - contents = list(anchor.contents) - linktext = bs() - for i in reversed(contents): - linktext.insert(1, i) - anchor.replaceWith(linktext) - - # Find all the images, and wrap them up in an image_wrapper div - for i in range(0, len(koan.contents), 1): - if not hasattr(koan.contents[i], 'name'): - continue # skip carriage returns - if koan.contents[i].name == u'img': - div = bs('
') - div.div.insert(0, koan.contents[i]) - koan.insert(i, div) - - return(koan) - - def canonicalize_internal_url(self, url, is_link=True): - url = url.split(self.url)[-1] - return BasicNewsRecipe.canonicalize_internal_url(self, url, is_link=is_link) - - def postprocess_book(self, oeb, opts, log): - # Go through each internal representation of each HTML file, and fix - # all the broken hrefs, if possible - for item in oeb.manifest.items: - if item.media_type == 'text/html': - - for node in item.data.xpath('//*[@href]'): - naughty_href = node.get('href') - - if naughty_href in self.path_remappings: - node.set('href', '../' + - self.path_remappings[naughty_href]) - href = node.get('href') - self.log( - "Remapped href {0} --> {1}".format(naughty_href, href)) - - # Remove the superfluous extra feed page at the beginning of the book, replacing it - # with the proper credits - for item in oeb.manifest.hrefs['index.html'].data.xpath('//*[local-name()="ul"]'): - item.getparent().remove(item) - - for item in oeb.manifest.hrefs['index.html'].data.xpath('//*[local-name()="p"]'): - item.getparent().remove(item) - - for item in oeb.manifest.hrefs['index.html'].data.xpath('//*[local-name()="div"]'): - for credit in self.credits[::-1]: - item.insert(0, etree.fromstring(credit, parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False))) - - # Change the creator from "calibre" to the actual author - # Also, we don't need the date in the ebook's title - oeb.metadata.items['creator'][0].value = self.publisher - oeb.metadata.items['description'][0].value = oeb.metadata.items[ - 'description'][0].value.split('\n\nArticles in this issue')[0] - oeb.metadata.items['publication_type'][0].value = self.title - oeb.metadata.items['publisher'][0].value = self.publisher - oeb.metadata.items['title'][0].value = self.title diff --git a/recipes/thedgesingapore.recipe b/recipes/thedgesingapore.recipe deleted file mode 100644 index be20a26ba6..0000000000 --- a/recipes/thedgesingapore.recipe +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python - -__license__ = 'GPL v3' -__copyright__ = '2009, Darko Miletic ' -''' -www.livemint.com -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class Edgesingapore(BasicNewsRecipe): - title = 'The Edge Singapore' - __author__ = 'Darko Miletic' - description = 'Financial news from Singapore' - publisher = 'The Edge Singapore' - category = 'news, finances, singapore' - language = 'en' - - lang = 'en_SG' - oldest_article = 15 - max_articles_per_feed = 100 - no_stylesheets = True - encoding = 'utf-8' - use_embedded_content = False - extra_css = ' .contentheading{font-size: x-large} .small{font-size: small} .createdate{font-size: small; font-weight: bold} ' - - conversion_options = { - 'comment': description, 'tags': category, 'publisher': publisher, 'author': publisher, 'language': lang, 'pretty_print': True, 'linearize_tables': True - } - - remove_tags = [ - dict(name=['object', 'link', 'embed', 'form', 'iframe']), dict(name='div', attrs={ - 'id': 'toolbar-article'}), dict(name='div', attrs={'class': 'backtotop'}), dict(name='img', attrs={'alt': 'Print'}) - ] - - remove_tags_after = dict(name='div', attrs={'class': 'backtotop'}) - - feeds = [(u'Articles', u'http://feeds.feedburner.com/edgesg')] - - def print_version(self, url): - return url + '?tmpl=component&print=1' - - def preprocess_html(self, soup): - attribs = ['style', 'font', 'valign', 'colspan', 'width', 'height', 'rowspan', 'summary', 'align', 'cellspacing', 'cellpadding', 'frames', 'rules', 'border' # noqa - ] - for item in soup.body.findAll(name=['table', 'td', 'tr', 'th', 'caption', 'thead', 'tfoot', 'tbody', 'colgroup', 'col']): - item.name = 'div' - for attrib in attribs: - item[attrib] = '' - del item[attrib] - return self.adeify_images(soup) diff --git a/recipes/theluminouslandscape.recipe b/recipes/theluminouslandscape.recipe deleted file mode 100644 index b796b3052a..0000000000 --- a/recipes/theluminouslandscape.recipe +++ /dev/null @@ -1,34 +0,0 @@ - -__license__ = 'GPL v3' -__copyright__ = '2010, Darko Miletic ' -''' -luminous-landscape.com -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class theluminouslandscape(BasicNewsRecipe): - title = 'The Luminous Landscape' - __author__ = 'Darko Miletic' - description = 'A photography news and information website in the form of a weblog with multiple authors who write on a variety of photography and art-photography related issues.' # noqa - publisher = 'The Luminous Landscape ' - category = 'news, blog, photograph, international' - oldest_article = 15 - max_articles_per_feed = 100 - no_stylesheets = True - remove_empty_feeds = True - use_embedded_content = True - encoding = 'cp1252' - language = 'en' - - conversion_options = { - 'comment': description, 'tags': category, 'publisher': publisher, 'language': language - } - - feeds = [ - (u"What's new", u'http://www.luminous-landscape.com/whatsnew/rssfeed.php')] - remove_tags = [dict(name=['object', 'link', 'iframe'])] - - def preprocess_html(self, soup): - return self.adeify_images(soup) diff --git a/recipes/themarketticker.recipe b/recipes/themarketticker.recipe deleted file mode 100644 index 4a5fd1196e..0000000000 --- a/recipes/themarketticker.recipe +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python - -__license__ = 'GPL v3' -__copyright__ = '2008, Darko Miletic ' -''' -market-ticker.denninger.net -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class Themarketticker(BasicNewsRecipe): - title = 'The Market Ticker' - __author__ = 'Darko Miletic' - description = 'Commentary On The Capital Markets' - oldest_article = 7 - max_articles_per_feed = 100 - language = 'en' - - no_stylesheets = True - use_embedded_content = True - html2lrf_options = ['--comment', description, '--category', 'blog,news,finances', '--base-font-size', '10' - ] - feeds = [(u'Posts', u'http://market-ticker.denninger.net/feeds/index.rss2')] diff --git a/recipes/themorningpaper.recipe b/recipes/themorningpaper.recipe deleted file mode 100644 index 0cf4263873..0000000000 --- a/recipes/themorningpaper.recipe +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python -# -*- mode: python -*- -# -*- coding: utf-8 -*- - -__license__ = 'GPL v3' -__copyright__ = '2017, Darko Miletic ' -''' -blog.acolyer.org -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class Themorningpaper(BasicNewsRecipe): - title = 'The Morning Paper' - __author__ = 'Darko Miletic' - description = ('an interesting/influential/important paper from' - ' the world of CS every weekday morning, as selected by Adrian Colyer') - publisher = 'Adrian Colyer' - category = 'news, tech' - oldest_article = 180 - max_articles_per_feed = 200 - no_stylesheets = True - encoding = 'utf-8' - use_embedded_content = False - language = 'en' - remove_empty_feeds = True - auto_cleanup = True - publication_type = 'blog' - extra_css = """ - body{font-family: Georgia,Palatino,serif } - img{margin-bottom: 0.4em; display:block} - """ - - conversion_options = { - 'comment': description, - 'tags': category, - 'publisher': publisher, - 'language': language - } - - feeds = [(u'Articles', u'https://blog.acolyer.org/feed/')] diff --git a/recipes/thenews.recipe b/recipes/thenews.recipe deleted file mode 100644 index 6d71543cac..0000000000 --- a/recipes/thenews.recipe +++ /dev/null @@ -1,88 +0,0 @@ -from calibre.web.feeds.news import BasicNewsRecipe - - -class TheNewsRecipe(BasicNewsRecipe): - __license__ = 'GPL v3' - __author__ = 'kwetal' - language = 'en_PK' - version = 1 - - title = u'The News' - publisher = u'Jang Group' - category = u'News, Pakistan' - description = u'English Newspaper from Pakistan' - - use_embedded_content = False - remove_empty_feeds = True - oldest_article = 2 - max_articles_per_feed = 100 - - no_stylesheets = True - remove_javascript = True - encoding = 'iso-8859-1' - - remove_tags = [] - remove_tags.append(dict(name='img', attrs={'src': 'images/thenews.gif'})) - remove_tags.append(dict(name='img', attrs={'src': 'images/shim.gif'})) - - # Feeds from http://thenews.com.pk/rss.asp - feeds = [] - feeds.append( - (u'Latest Stories', u'http://www.thenews.com.pk/rss/thenews_updates.xml')) - feeds.append( - (u'Top Stories', u'http://www.thenews.com.pk/rss/thenews_topstories.xml')) - feeds.append( - (u'World News', u'http://www.thenews.com.pk/rss/thenews_world.xml')) - feeds.append( - (u'National News', u'http://www.thenews.com.pk/rss/thenews_national.xml')) - feeds.append( - (u'Business News', u'http://www.thenews.com.pk/rss/thenews_business.xml')) - feeds.append( - (u'Karachi News', u'http://www.thenews.com.pk/rss/thenews_karachi.xml')) - feeds.append( - (u'Lahore News', u'http://www.thenews.com.pk/rss/thenews_lahore.xml')) - feeds.append( - (u'Islamabad News', u'http://www.thenews.com.pk/rss/thenews_islamabad.xml')) - feeds.append( - (u'Peshawar News', u'http://www.thenews.com.pk/rss/thenews_peshawar.xml')) - feeds.append( - (u'Editorial', u'http://www.thenews.com.pk/rss/thenews_editorial.xml')) - feeds.append( - (u'Opinion', u'http://www.thenews.com.pk/rss/thenews_opinion.xml')) - feeds.append( - (u'Sports News', u'http://www.thenews.com.pk/rss/thenews_sports.xml')) - feeds.append( - (u'Newspost', u'http://www.thenews.com.pk/rss/thenews_newspost.xml')) - - conversion_options = {'comments': description, 'tags': category, 'language': 'en', - 'publisher': publisher, 'linearize_tables': True} - - extra_css = ''' - body{font-family:verdana,arial,helvetica,geneva,sans-serif;} - .heading_txt {font-size: x-large; font-weight: bold; text-align: left;} - .small_txt {text-align: left;} - .dateline {font-size: x-small; color: #696969; margin-top: 1em; margin-bottom: 1em} - ''' - - def print_version(self, url): - ignore, sep, main = url.rpartition('/') - - if main.startswith('updates.asp'): - return url.replace('updates.asp', 'print.asp') - elif main.startswith('top_story_detail.asp'): - return url.replace('top_story_detail.asp', 'print3.asp') - elif main.startswith('daily_detail.asp'): - return url.replace('daily_detail.asp', 'print1.asp') - else: - return None - - def preprocess_html(self, soup): - for tr in soup.findAll('tr', attrs={'bgcolor': True}): - del tr['bgcolor'] - - td = soup.find('td', attrs={'class': 'small_txt', 'height': '20'}) - if td: - del td['height'] - td['class'] = 'dateline' - - return soup diff --git a/recipes/theoldfoodie.recipe b/recipes/theoldfoodie.recipe deleted file mode 100644 index 744ab4d1d3..0000000000 --- a/recipes/theoldfoodie.recipe +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python - -__license__ = 'GPL v3' -__copyright__ = '2009, Darko Miletic ' -''' -www.theoldfoodie.com -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TheOldFoodie(BasicNewsRecipe): - title = 'The Old Foodie' - __author__ = 'Darko Miletic' - description = 'Food blog' - category = 'cuisine, food, blog' - oldest_article = 30 - max_articles_per_feed = 100 - use_embedded_content = True - no_stylesheets = True - encoding = 'utf-8' - language = 'en' - - conversion_options = { - 'comments': description, 'tags': category, 'language': 'en' - } - - feeds = [ - (u'Articles', u'http://www.theoldfoodie.com/feeds/posts/default?alt=rss')] diff --git a/recipes/theonion.recipe b/recipes/theonion.recipe deleted file mode 100644 index af97c0169a..0000000000 --- a/recipes/theonion.recipe +++ /dev/null @@ -1,89 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2009-2013, Darko Miletic ' - -''' -theonion.com -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TheOnion(BasicNewsRecipe): - title = 'The Onion' - __author__ = 'Darko Miletic' - description = "The Onion, America's Finest News Source, is an award-winning publication covering world, national, and * local issues. It is updated daily online and distributed weekly in select American cities." # noqa - oldest_article = 2 - max_articles_per_feed = 100 - publisher = 'Onion, Inc.' - category = 'humor, news, USA' - language = 'en' - no_stylesheets = True - use_embedded_content = False - encoding = 'utf-8' - publication_type = 'newsportal' - needs_subscription = 'optional' - masthead_url = 'http://www.theonion.com/static/onion/img/logo_1x.png' - cover_url = 'http://www.theonion.com/static/onion/img/logo_1x.png' - extra_css = """ - body{font-family: Helvetica,Arial,sans-serif} - .section_title{color: gray; text-transform: uppercase} - .title{font-family: Georgia,serif} - .meta{color: gray; display: inline} - .has_caption{display: block} - .caption{font-size: x-small; color: gray; margin-bottom: 0.8em} - """ - - conversion_options = { - 'comment': description, 'tags': category, 'publisher': publisher, 'language': language - } - - keep_only_tags = [ - dict(attrs={'class': lambda x: x and 'content-wrapper' in x.split()})] - remove_attributes = ['lang', 'rel'] - remove_tags = [ - dict(name=['object', 'link', 'iframe', 'base', 'meta', 'button', 'footer', 'blockquote', 'figcaption']), dict(attrs={'class': lambda x: x and 'share-tools' in x.split()}), dict(attrs={'class': lambda x: x and 'content-meta' in x.split()}), dict(attrs={'class': 'below-article-tools'}), dict(name='div', attrs={'id': ['topshare', 'bottomshare']}) # noqa - ] - - feeds = [ - (u'Daily', u'http://feeds.theonion.com/theonion/daily'), (u'Sports', - u'http://feeds.theonion.com/theonion/sports') - ] - - def get_browser(self): - br = BasicNewsRecipe.get_browser(self) - br.open('http://www.theonion.com/') - if self.username is not None and self.password is not None: - br.open('https://ui.ppjol.com/login/onion/u/j_spring_security_check') - br.select_form(name='f') - br['j_username'] = self.username - br['j_password'] = self.password - br.submit() - return br - - def get_article_url(self, article): - artl = BasicNewsRecipe.get_article_url(self, article) - if artl.startswith('http://www.theonion.com/audio/'): - artl = None - return artl - - def preprocess_html(self, soup): - for item in soup.findAll(style=True): - del item['style'] - for item in soup.findAll('a'): - limg = item.find('img') - if item.string is not None: - str = item.string - item.replaceWith(str) - else: - if limg: - item.name = 'div' - item.attrs = [] - if not limg.get('alt'): - limg['alt'] = 'image' - else: - str = self.tag_to_string(item) - item.replaceWith(str) - for item in soup.findAll('img'): - if item.get('data-src'): - item['src'] = item['data-src'] - return soup diff --git a/recipes/thewest_au.recipe b/recipes/thewest_au.recipe deleted file mode 100644 index a035a2d6b6..0000000000 --- a/recipes/thewest_au.recipe +++ /dev/null @@ -1,62 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2010, Darko Miletic ' -''' -thewest.com.au -''' - -import re - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TheWest(BasicNewsRecipe): - title = 'The West Australian' - __author__ = 'Darko Miletic' - description = 'News from Australia' - publisher = 'thewest.com.au' - category = 'news, politics, Australia' - oldest_article = 2 - max_articles_per_feed = 200 - no_stylesheets = True - encoding = 'utf8' - use_embedded_content = False - language = 'en_AU' - remove_empty_feeds = True - publication_type = 'newspaper' - masthead_url = 'http://l.yimg.com/ao/i/mp/properties/news/02/wan/img/wan-logo-h49.png' - extra_css = ' .article{font-family: Arial,Helvetica,sans-serif } .image{font-size: x-small} ' - - preprocess_regexps = [ - (re.compile(r'.*?', re.DOTALL | - re.IGNORECASE), lambda match: '') - ] - - conversion_options = { - 'comment': description, 'tags': category, 'publisher': publisher, 'language': language - } - - remove_tags = [ - dict(attrs={'class': ['tools', 'lhs']}), dict(attrs={ - 'id': 'tools-bottom'}), dict(attrs={'href': 'http://twitter.com/thewest_com_au'}) - ] - keep_only_tags = [dict(attrs={'class': 'mod article'})] - remove_attributes = ['width', 'height'] - - feeds = [ - - (u'WA News', u'http://d.yimg.com/au.rss.news.yahoo.com/thewest/wa.xml'), - (u'National', u'http://d.yimg.com/au.rss.news.yahoo.com/thewest/national.xml'), - (u'World', u'http://d.yimg.com/au.rss.news.yahoo.com/thewest/world.xml'), - (u'Offbeat', u'http://d.yimg.com/au.rss.news.yahoo.com/thewest/offbeat.xml'), - (u'Business', u'http://d.yimg.com/au.rss.news.yahoo.com/thewest/business.xml'), - (u'Sport', u'http://d.yimg.com/au.rss.news.yahoo.com/thewest/sport.xml'), - (u'Entertainment', u'http://d.yimg.com/au.rss.news.yahoo.com/thewest/entertainment.xml'), - (u'Travel', u'http://d.yimg.com/au.rss.news.yahoo.com/thewest/travel.xml'), - (u'Life+Style', u'http://d.yimg.com/au.rss.news.yahoo.com/thewest/lifestyle.xml') - ] - - def get_article_url(self, article): - return article.get('guid', None) - - def preprocess_html(self, soup): - return self.adeify_images(soup) diff --git a/recipes/think_progress.recipe b/recipes/think_progress.recipe deleted file mode 100644 index 8d1a4b7924..0000000000 --- a/recipes/think_progress.recipe +++ /dev/null @@ -1,13 +0,0 @@ -from calibre.web.feeds.news import BasicNewsRecipe - - -class AdvancedUserRecipe1263409732(BasicNewsRecipe): - title = u'Think Progress' - description = u'A compilation of progressive articles on social and economic justice, healthy communities, media accountability, global and domestic security.' # noqa - __author__ = u'Xanthan Gum' - language = 'en' - - oldest_article = 7 - max_articles_per_feed = 100 - - feeds = [(u'News Articles', u'http://thinkprogress.org/feed/')] diff --git a/recipes/thn.recipe b/recipes/thn.recipe deleted file mode 100644 index efd0e183f9..0000000000 --- a/recipes/thn.recipe +++ /dev/null @@ -1,19 +0,0 @@ -from calibre.web.feeds.news import BasicNewsRecipe - - -class AdvancedUserRecipe1289990851(BasicNewsRecipe): - title = u'The Hockey News' - language = 'en_CA' - __author__ = 'Nexus' - oldest_article = 7 - max_articles_per_feed = 25 - no_stylesheets = True - remove_tags = [dict(name='div', attrs={'class': 'article_info'}), - dict(name='div', attrs={'class': 'photo_details'}), - dict(name='div', attrs={'class': 'tool_menu'}), - dict(name='div', attrs={'id': 'comments_container'}), - dict(name='div', attrs={'id': 'wrapper'})] - keep_only_tags = [dict(name='h1', attrs={'class': ['headline']}), - dict(name='div', attrs={'class': ['box_container']})] - - feeds = [(u'THN', u'http://www.thehockeynews.com/rss/all_categories.xml')] diff --git a/recipes/tidbits.recipe b/recipes/tidbits.recipe deleted file mode 100644 index d2e9af8574..0000000000 --- a/recipes/tidbits.recipe +++ /dev/null @@ -1,51 +0,0 @@ - -__license__ = 'GPL v3' -__copyright__ = '2010, Darko Miletic ' -''' -db.tidbits.com -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TidBITS(BasicNewsRecipe): - title = 'TidBITS: Mac News for the Rest of Us' - __author__ = 'Darko Miletic' - description = 'Insightful news, reviews, and analysis of the Macintosh and Internet worlds' - publisher = 'TidBITS Publishing Inc.' - category = 'news, Apple, Macintosh, IT, Internet' - oldest_article = 2 - max_articles_per_feed = 100 - no_stylesheets = True - encoding = 'utf-8' - use_embedded_content = False - language = 'en' - remove_empty_feeds = True - masthead_url = 'http://db.tidbits.com/images/tblogo9.gif' - extra_css = ' body{font-family: Georgia,"Times New Roman",Times,serif} ' - - conversion_options = { - 'comment': description, 'tags': category, 'publisher': publisher, 'language': language - } - - keep_only_tags = [dict(name='div', attrs={'id': 'center_ajax_sub'})] - remove_tags = [dict(name='div', attrs={'id': 'social-media'})] - - feeds = [ - - (u'Business Apps', u'http://db.tidbits.com/feeds/business.rss'), - (u'Entertainment', u'http://db.tidbits.com/feeds/entertainment.rss'), - (u'External Links', u'http://db.tidbits.com/feeds/links.rss'), - (u'Home Mac', u'http://db.tidbits.com/feeds/home.rss'), - (u'Inside TidBITS', u'http://db.tidbits.com/feeds/inside.rss'), - (u'iPod & iPhone', u'http://db.tidbits.com/feeds/ipod-iphone.rss'), - (u'Just for Fun', u'http://db.tidbits.com/feeds/fun.rss'), - (u'Macs & Mac OS X', u'http://db.tidbits.com/feeds/macs.rss'), - (u'Media Creation', u'http://db.tidbits.com/feeds/creative.rss'), - (u'Networking & Communications', u'http://db.tidbits.com/feeds/net.rss'), - (u'Opinion & Editorial', u'http://db.tidbits.com/feeds/opinion.rss'), - (u'Support & Problem Solving', u'http://db.tidbits.com/feeds/support.rss'), - (u'Safe Computing', u'http://db.tidbits.com/feeds/security.rss'), - (u'Tech News', u'http://db.tidbits.com/feeds/tech.rss'), - (u'Software Watchlist', u'http://db.tidbits.com/feeds/watchlist.rss') - ] diff --git a/recipes/tijolaco.recipe b/recipes/tijolaco.recipe deleted file mode 100644 index bd2200c172..0000000000 --- a/recipes/tijolaco.recipe +++ /dev/null @@ -1,25 +0,0 @@ -from calibre.web.feeds.recipes import BasicNewsRecipe - - -class Tijolaco(BasicNewsRecipe): - title = u'Tijolaco.com' - __author__ = u'Diniz Bortolotto' - description = u'Posts do Blog Tijola\xe7o.com' - oldest_article = 7 - max_articles_per_feed = 50 - encoding = 'utf8' - publisher = u'Brizola Neto' - category = 'politics, Brazil' - language = 'pt_BR' - publication_type = 'politics portal' - use_embedded_content = False - no_stylesheets = True - remove_javascript = True - - feeds = [(u'Blog Tijola\xe7o.com', u'http://feeds.feedburner.com/Tijolacoblog')] - - reverse_article_order = True - - keep_only_tags = [dict(name='div', attrs={'class': 'post'})] - - remove_tags = [dict(name='span', attrs={'class': 'com'})] diff --git a/recipes/time_turk.recipe b/recipes/time_turk.recipe deleted file mode 100644 index 4a47fdee3b..0000000000 --- a/recipes/time_turk.recipe +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- - -from calibre.web.feeds.news import BasicNewsRecipe - - -class BasicUserRecipe1325259641(BasicNewsRecipe): - language = 'tr' - __author__ = 'asalet_r' - title = u'TimeT\xfcrk' - oldest_article = 7 - max_articles_per_feed = 100 - auto_cleanup = True - - feeds = [(u'TimeT\xfcrk', u'http://www.timeturk.com/tr/rss/')] diff --git a/recipes/timesnewroman.recipe b/recipes/timesnewroman.recipe deleted file mode 100644 index 8ce8a56f6f..0000000000 --- a/recipes/timesnewroman.recipe +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -__license__ = 'GPL v3' -__copyright__ = u'2011, Silviu Cotoar\u0103' -''' -timesnewroman.ro -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TimesNewRoman(BasicNewsRecipe): - title = u'Times New Roman' - __author__ = u'Silviu Cotoar\u0103' - description = u'Cotidian independent de umor voluntar' - publisher = u'Times New Roman' - oldest_article = 25 - language = 'ro' - max_articles_per_feed = 100 - no_stylesheets = True - use_embedded_content = False - category = 'Ziare,Reviste,Fun' - encoding = 'utf-8' - cover_url = 'http://www.timesnewroman.ro/templates/TNRV2/images/logo.gif' - - conversion_options = { - 'comments': description, 'tags': category, 'language': language, 'publisher': publisher - } - - keep_only_tags = [ - dict(name='div', attrs={'id': 'page'}) - ] - - remove_tags = [ - dict(name='p', attrs={'class': ['articleinfo']}), dict(name='div', attrs={'class': ['shareTools']}), dict( - name='div', attrs={'class': 'fb_iframe_widget'}), dict(name='div', attrs={'id': 'jc'}) - ] - - remove_tags_after = [ - dict(name='div', attrs={'class': 'fb_iframe_widget'}), - dict(name='div', attrs={'id': 'jc'}) - ] - - feeds = [ - (u'Feeds', u'http://www.timesnewroman.ro/index.php?format=feed&type=rss') - ] - - def preprocess_html(self, soup): - return self.adeify_images(soup) diff --git a/recipes/tnxm.recipe b/recipes/tnxm.recipe deleted file mode 100644 index f2b84ca7a0..0000000000 --- a/recipes/tnxm.recipe +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python - -__license__ = 'GPL v3' -__copyright__ = '2009, Wasabi ' -''' -tnxm.net -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TNXM(BasicNewsRecipe): - title = u'Thanh Nien Xa Me' - __author__ = 'Wasabi' - description = 'Vietnam news and current affairs from TNXM - the finest Vietnamese bulletin board.' - no_stylesheets = True - language = 'vi' - - encoding = 'utf-8' - recursions = 0 - - remove_tags = [dict(name='div', attrs={'class': 'footer'})] - extra_css = '.headline {font-size: x-large;} \n .fact { padding-top: 10pt }' - - feeds = [ - ('Index', 'http://tnxm.net/external.php?type=RSS'), - ] - - def print_version(self, url): - return url.replace('showthread.php?', 'printthread.php?pp=160&') diff --git a/recipes/today_online.recipe b/recipes/today_online.recipe deleted file mode 100644 index bce8d75c5b..0000000000 --- a/recipes/today_online.recipe +++ /dev/null @@ -1,63 +0,0 @@ -from calibre.ptempfile import PersistentTemporaryFile -from calibre.web.feeds.news import BasicNewsRecipe - - -class AdvancedUserRecipe1276486274(BasicNewsRecipe): - title = u'Today Online - Singapore' - publisher = 'MediaCorp Press Ltd - Singapore' - __author__ = 'rty' - category = 'news, Singapore' - oldest_article = 7 - max_articles_per_feed = 100 - remove_javascript = True - use_embedded_content = False - no_stylesheets = True - language = 'en_SG' - temp_files = [] - articles_are_obfuscated = True - masthead_url = 'http://www.todayonline.com/sites/all/themes/today/logo.png' - conversion_options = {'linearize_tables': True} - extra_css = ''' - .author{font-style: italic; font-size: small} - .date{font-style: italic; font-size: small} - .Headline{font-weight: bold; font-size: xx-large} - .headerStrap{font-weight: bold; font-size: x-large; font-syle: italic} - .bodyText{font-size: 4px;font-family: Times New Roman;} - ''' - feeds = [ - (u'Hot News', u'http://www.todayonline.com/hot-news/feed'), - (u'Singapore', u'http://www.todayonline.com/feed/singapore'), - (u'World', u'http://www.todayonline.com/feed/world'), - (u'Business', u'http://www.todayonline.com/feed/business'), - (u'Tech', u'http://www.todayonline.com/feed/tech'), - (u'Voices', u'http://www.todayonline.com/feed/voices'), - (u'Commentary', u'http://www.todayonline.com/feed/Commentary'), - (u'Daily Focus', u'http://www.todayonline.com/feed/daily-focus'), - (u'Lifestyle', u'http://www.todayonline.com/feed/lifestyle'), - ] - keep_only_tags = [ - dict(name='div', attrs='print-content') - ] - - remove_tags = [ - dict(name='div', attrs={'class': ['url', 'button']}), - dict(name='div', attrs={'class': 'node-type-print-edition'}), - dict(name='div', attrs={'class': ['field field-name-field-article-section field-type-taxonomy-term-reference field-label-hidden', - 'field field-name-field-article-abstract field-type-text-long field-label-hidden', 'authoring']}) - - ] - - def get_obfuscated_article(self, url): - br = self.get_browser() - br.open(url) - response = br.follow_link(url_regex=r'/print/', nr=0) - html = response.read() - self.temp_files.append(PersistentTemporaryFile('_fa.html')) - self.temp_files[-1].write(html) - self.temp_files[-1].close() - return self.temp_files[-1].name - - def preprocess_html(self, soup): - for item in soup.findAll(style=True): - del item['style'] - return soup diff --git a/recipes/todays_zaman.recipe b/recipes/todays_zaman.recipe deleted file mode 100644 index 3058fb5083..0000000000 --- a/recipes/todays_zaman.recipe +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -from __future__ import print_function - -__license__ = 'GPL v3' -__copyright__ = '2014, spswerling' -''' -www.todayszaman.com -''' -import re - -from calibre.web.feeds.recipes import BasicNewsRecipe - -try: - from urllib.parse import urljoin -except ImportError: - from urlparse import urljoin - - -class TodaysZaman(BasicNewsRecipe): - - title = u'Todays Zaman' - __author__ = u'spswerling' - description = 'English version of Turkish Daily "Zaman"' - max_articles_per_feed = 100 - encoding = 'utf-8' - category = 'news' - language = 'en_TR' - publication_type = 'newspaper' - cover_img_url = 'http://medya.todayszaman.com/todayszaman/images/logo/todays_yenilogo.bmp' # yep, bmp - masthead_url = cover_img_url - remove_empty_feeds = True - - # on kindle, images can make things kind of fat. Slim them down. - recursions = 0 - oldest_article = 1.5 - compress_news_images = True - compress_news_images_max_size = 7 - scale_news_images = (150, 200) # (kindle touch: 600x800) - useHighResImages = False - - sections = [ - (u'Columnists', u'columnists'), - (u'Opinion', u'op-ed'), - (u'World', u'world'), - (u'National', u'national'), - (u'Diplomacy', u'diplomacy'), - (u'Business', u'business'), - ] - - # util for creating remove_tags and keep_tags style regex matchers - def tag_matcher(elt, attr, str): - return dict(name=elt, attrs={attr: re.compile(str, re.IGNORECASE)}) - - keep_only_tags = [ - tag_matcher('div', 'class', '^pageNewsDetailContainer$'), - tag_matcher('div', 'class', '^pageColumnistDetailContainer$'), - ] - - remove_tags = [ - tag_matcher('div', 'class', 'DetailKeyword'), - tag_matcher('div', 'class', 'MainContentSocial'), - tag_matcher('div', 'class', 'SocialNetwork'), - tag_matcher('div', 'class', 'DetailLeftOther'), - tag_matcher('div', 'class', 'RelatedNews'), - tag_matcher('div', 'class', '^topMenuWrapper$'), - tag_matcher('div', 'class', '^logo$'), - tag_matcher('a', 'class', 'cf_email'), - ] - articles = {} - - def parse_index(self): - for (sect_title, sect_uri) in self.sections: - self.parse_section(sect_title, sect_uri) - - ans = [] - for k in self.articles: - ans.append((k, self.articles[k])) - return ans - - def parse_section(self, sect_title, sect_uri): - url = 'http://www.todayszaman.com/' + sect_uri - print('Start section ' + sect_title + ', ' + url) - try: - soup = self.index_to_soup(url) - except: - return - - # Find each article - for div in soup.findAll('div'): - div_class = div.get('class') - if div_class: - if div_class in ['pageColumnistsMainContent', - 'pageCategoryContainer']: - # print ' DIVCLASS' + div_class - for link in div.findAll('a', href=True): - self.process_link(sect_title, div_class, link) - - print('Finished section: ' + sect_title) - - def process_link(self, section_title, layout, link): - def p(s): - print('[PROCESS LINK] ' + s[0:80]) - - href = link['href'] - full_href = urljoin('http://www.todayszaman.com/', href) - next_sib = link.nextSibling - child_h2 = link.find('h2') - link_text = self.tag_to_string(link).strip() - title_node = None - - if layout in ['pageColumnistsMainContent']: - if child_h2: - title_node = child_h2 - else: - return - elif layout in ['pageCategoryContainer']: - top_title = link.find(attrs={'class': 'pageCategoryTopTitle'}) - if top_title: - title_node = top_title - elif (not link_text) and (next_sib and next_sib.find('h4')): - title_node = next_sib.find('h4') - elif (not link_text) and (next_sib and next_sib.find('h3')): - title_node = next_sib.find('h3') - elif link_text: - title_node = link - - if title_node: - title = self.tag_to_string(title_node) - # print ' BING: ' + href + ', ' + title - self.queue_article_link(section_title, full_href, title) - - def queue_article_link(self, section, url, title): - if section not in self.articles: - self.articles[section] = [] - self.articles[section].append( - dict(title=title, - url=url, - date='', - description='', - author='', - content='')) - - def populate_article_metadata(self, article, soup, first): - - def p(s): - print('[POPULATE METADATA] ' + s[0:80]) - - tnode = soup.find('title') - if tnode: - tstring = self.tag_to_string(tnode) - if ' - ' in tstring: - author = tstring.split('-')[0] - if author: - article.author = author - article.title = author + ' - ' + article.title.strip() - p('Add author to title:' + author) - - # known matches: pageNewsDetailDate, pageColumnistDetailLeftDate - regex = re.compile('(DetailDate|DetailLeftDate)$', re.IGNORECASE) - date_node = soup.find('div', {'class': regex}) - if date_node: - date = self.tag_to_string(date_node).__str__().split('/')[0] - date = ','.join(date.split(',')[:2]).strip() - article.title = date + ' - ' + article.title.strip() - article.date = date - p('Add date to title: ' + date) - - strong = soup.find('strong') - if strong: - article.text_summary = self.tag_to_string(strong) - p('Summary: ' + article.text_summary) - - def _dbg_soup_node(self, node): - s = ' cls: ' + node.get('class').__str__().strip() + \ - ' txt: ' + self.tag_to_string(node).strip() - return s diff --git a/recipes/tomshardware.recipe b/recipes/tomshardware.recipe deleted file mode 100644 index f8e4ef959e..0000000000 --- a/recipes/tomshardware.recipe +++ /dev/null @@ -1,73 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2008-2013, Darko Miletic ' -''' -tomshardware.com/us -''' - -try: - from urllib.parse import urlencode -except ImportError: - from urllib import urlencode -from calibre.web.feeds.recipes import BasicNewsRecipe - - -class Tomshardware(BasicNewsRecipe): - title = "Tom's Hardware US" - __author__ = 'Darko Miletic' - description = 'Hardware reviews and News' - publisher = "Tom's Hardware" - category = 'news, IT, hardware, USA' - no_stylesheets = True - needs_subscription = 'optional' - language = 'en' - INDEX = 'http://www.tomshardware.com' - LOGIN = INDEX + '/membres/' - remove_javascript = True - use_embedded_content = False - - conversion_options = { - 'comment': description, 'tags': category, 'publisher': publisher, 'language': language - } - - def get_browser(self): - br = BasicNewsRecipe.get_browser(self) - br.open(self.INDEX + '/us/') - if self.username is not None and self.password is not None: - data = urlencode({'action': 'login_action', 'r': self.INDEX + '/us/', 'login': self.username, 'mdp': self.password - }) - br.open(self.LOGIN, data) - return br - - remove_tags = [ - dict(name='div', attrs={'id': 'header'}), dict(name='object') - ] - - feeds = [ - - (u'Reviews', u'http://www.tomshardware.com/feeds/rss2/tom-s-hardware-us,18-2.xml'), - (u'News', u'http://www.tomshardware.com/feeds/rss2/tom-s-hardware-us,18-1.xml') - ] - - def print_version(self, url): - main, sep, rest = url.rpartition('.html') - rmain, rsep, article_id = main.rpartition(',') - tmain, tsep, trest = rmain.rpartition('/reviews/') - rind = 'http://www.tomshardware.com/news_print.php?p1=' - if tsep: - rind = 'http://www.tomshardware.com/review_print.php?p1=' - return rind + article_id - - def cleanup_image_tags(self, soup): - for item in soup.findAll('img'): - for attrib in ['height', 'width', 'border', 'align']: - item[attrib] = '' - del item[attrib] - return soup - - def preprocess_html(self, soup): - del(soup.body['onload']) - for item in soup.findAll(style=True): - del item['style'] - for it in soup.findAll('span'): - it.name = "div" - return self.cleanup_image_tags(soup) diff --git a/recipes/tomshardware_de.recipe b/recipes/tomshardware_de.recipe deleted file mode 100644 index 140b9a2a91..0000000000 --- a/recipes/tomshardware_de.recipe +++ /dev/null @@ -1,58 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal ' - -''' -Fetch tomshardware. -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class cdnet(BasicNewsRecipe): - - title = 'tomshardware' - description = 'computer news in german' - __author__ = 'Oliver Niesner' - use_embedded_content = False - timefmt = ' [%d %b %Y]' - max_articles_per_feed = 50 - no_stylesheets = True - encoding = 'utf-8' - language = 'de' - - remove_tags = [dict(id='outside-advert'), - dict(id='advertRightWhite'), - dict(id='header-advert'), - dict(id='header-banner'), - dict(id='header-menu'), - dict(id='header-top'), - dict(id='header-tools'), - dict(id='nbComment'), - dict(id='commentTools'), - dict(id='internalSidebar'), - dict(id='header-news-infos'), - dict(id='header-news-tools'), - dict(id='breadcrumbs'), - dict(id='emailTools'), - dict(id='bookmarkTools'), - dict(id='printTools'), - dict(id='header-nextNews'), - dict(id='commentsBox'), - dict(id='showComments'), - dict(id='footer'), - dict(id=''), - dict(name='div', attrs={'class': 'pyjama'}), - dict(name='div', attrs={'class': 'basicCentral'}), - dict(name='li', attrs={ - 'class': 'simplePagination-previous'}), - dict(name='form', attrs={'id': 'commentForm'}), - dict(name='href', attrs={'class': 'comment'}), - dict(name='div', attrs={'class': 'greyBoxR clearfix'}), - dict(name='div', attrs={'class': 'greyBoxL clearfix'}), - dict(name='div', attrs={'class': 'greyBox clearfix'}), - dict(name='div', attrs={'class': 'labelized'}), - dict(id='')] - remove_tags_after = [dict(name='div', attrs={'class': 'labelized'})] - - feeds = [ - ('tomshardware', 'http://www.tomshardware.com/de/feeds/rss2/tom-s-hardware-de,12-1.xml')] diff --git a/recipes/tomshardware_it.recipe b/recipes/tomshardware_it.recipe deleted file mode 100644 index f366400055..0000000000 --- a/recipes/tomshardware_it.recipe +++ /dev/null @@ -1,26 +0,0 @@ -__license__ = 'GPL v3' -from calibre.web.feeds.news import BasicNewsRecipe - - -class AdvancedUserRecipe1327434170(BasicNewsRecipe): - title = u"Tom's Hardware" - oldest_article = 7 - max_articles_per_feed = 100 - auto_cleanup = True - masthead_url = 'http://userlogos.org/files/logos/spaljeni/tomshardwre.png' - - def get_article_url(self, article): - link = BasicNewsRecipe.get_article_url(self, article) - if link.split('/')[-1] == "story01.htm": - link = link.split('/')[-2] - a = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'I', 'L', 'N', 'S'] - b = ['0', '.', '/', '?', '-', '=', '&', - '_', 'http://', '.com', 'www.'] - for i in range(0, len(a)): - link = link.replace('0' + a[-i], b[-i]) - return link - feeds = [ - (u"Tom's Hardware", u'http://rss.feedsportal.com/c/32604/f/531080/index.rss')] - __author__ = 'faber1971' - description = 'Italian website on technology - v1.00 (28, January 2012)' - language = 'it' diff --git a/recipes/toronto_sun.recipe b/recipes/toronto_sun.recipe deleted file mode 100644 index 7ecacd1f24..0000000000 --- a/recipes/toronto_sun.recipe +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python - -__license__ = 'GPL v3' -__copyright__ = '2009, Darko Miletic ' -''' -www.torontosun.com -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TorontoSun(BasicNewsRecipe): - title = 'Toronto SUN' - __author__ = 'Darko Miletic and Sujata Raman' - description = 'News from Canada' - publisher = 'Toronto Sun' - category = 'news, politics, Canada' - oldest_article = 2 - max_articles_per_feed = 100 - no_stylesheets = True - use_embedded_content = False - encoding = 'cp1252' - language = 'en_CA' - - conversion_options = { - 'comment': description, 'tags': category, 'publisher': publisher, 'language': language - } - - keep_only_tags = [ - dict(name='div', attrs={'class': ['articleHead', 'leftBox']}), dict(name='div', attrs={ - 'id': 'channelContent'}), dict(name='div', attrs={'id': 'rotateBox'}), dict(name='img') - ] - remove_tags = [ - dict(name='div', attrs={'class': ['bottomBox clear', 'bottomBox', 'breadCrumb', 'articleControls thin', 'articleControls thin short', 'extraVideoList']}), dict(name='h2', attrs={'class': 'microhead'}), dict(name='div', attrs={'id': 'commentsBottom'}), dict(name=['link', 'iframe', 'object']), dict(name='a', attrs={'rel': 'swap'}), dict(name='a', attrs={'href': '/news/haiti/'}), dict(name='ul', attrs={'class': ['tabs dl contentSwap', 'micrositeNav clearIt hList', 'galleryNav rotateNav']}) # noqa - ] - - remove_tags_after = [ - dict(name='div', attrs={'class': 'bottomBox clear'}), dict(name='div', attrs={ - 'class': 'rotateBox'}), dict(name='div', attrs={'id': 'contentSwap'}) - ] - - extra_css = ''' - h1{font-family :Arial,Helvetica,sans-serif; font-size:large;} - h2{font-family :Arial,Helvetica,sans-serif; font-size:medium; color:#666666;} - h3{font-family :Arial,Helvetica,sans-serif; font-size:medium; color:#000000;} - p{font-family :Arial,Helvetica,sans-serif; font-size:x-small;} - .bold{font-family :Arial,Helvetica,sans-serif; font-size: xx-small;color:#444444;margin-left: 0px;} - .subheading{font-family :Arial,Helvetica,sans-serif; font-size:medium; color:#000000; font-weight: bold;} - .byline{color:#666666; font-family :Arial,Helvetica,sans-serif; font-size: xx-small;} - .byline span{color:#666666; font-family :Arial,Helvetica,sans-serif; font-size: xx-small; text-transform: uppercase;} - .updated{font-family :Arial,Helvetica,sans-serif; font-size: xx-small;} - .galleryCaption{font-family :Arial,Helvetica,sans-serif; font-size: x-small;} - .galleryUpdated{font-family :Arial,Helvetica,sans-serif; font-size: x-small;} - ''' - - feeds = [ - - (u'News', u'http://www.torontosun.com/news/rss.xml'), - (u'Canada', u'http://www.torontosun.com/news/canada/rss.xml'), - (u'Columnists', u'http://www.torontosun.com/news/columnists/rss.xml'), - (u'World', u'http://www.torontosun.com/news/world/rss.xml'), - (u'Money', u'http://www.torontosun.com/money/rss.xml') - ] - - def preprocess_html(self, soup): - # To fetch images from the specified source - for img in soup.findAll('img', src=True): - url = img.get('src').split('?')[-1].partition('=')[-1] - if url: - img['src'] = url.split('&')[0].partition('=')[0] - img['width'] = url.split( - '&')[-1].partition('=')[-1].split('x')[0] - img['height'] = url.split( - '&')[-1].partition('=')[-1].split('x')[1] - return soup diff --git a/recipes/toyokeizai.recipe b/recipes/toyokeizai.recipe deleted file mode 100644 index e6a5c30ced..0000000000 --- a/recipes/toyokeizai.recipe +++ /dev/null @@ -1,67 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2010, Hiroshi Miura ' -''' -www.toyokeizai.net -''' - -import re - -from calibre.web.feeds.news import BasicNewsRecipe - - -class Toyokeizai(BasicNewsRecipe): - title = u'ToyoKeizai News' - __author__ = 'Hiroshi Miura' - oldest_article = 1 - max_articles_per_feed = 50 - description = 'Japanese traditional economy and business magazine, only for advanced subscribers supported' - publisher = 'Toyokeizai Shinbun Sha' - category = 'economy, magazine, japan' - language = 'ja' - encoding = 'euc-jp' - index = 'http://member.toyokeizai.net/news/' - remove_javascript = True - no_stylesheets = True - masthead_title = u'TOYOKEIZAI' - needs_subscription = True - timefmt = '[%y/%m/%d]' - recursions = 5 - match_regexps = [r'page/\d+'] - - keep_only_tags = [ - dict(name='div', attrs={'class': ['news']}), - dict(name='div', attrs={'class': ["news_cont"]}), - dict(name='div', attrs={'class': ["news_con"]}), - # dict(name='div', attrs={'class':["norightsMessage"]}) - ] - remove_tags = [{'class': "mt35 mgz"}, - {'class': "mt20 newzia"}, - {'class': "mt20 fontS"}, - {'class': "bk_btn_m"}, - dict(id='newzia_connect_member') - ] - - def parse_index(self): - feeds = [] - soup = self.index_to_soup(self.index) - topstories = soup.find('ul', attrs={'class': 'list6'}) - if topstories: - newsarticles = [] - for itt in topstories.findAll('li'): - itema = itt.find('a', href=True) - itemd = itt.find('span') - newsarticles.append({ - 'title': itema.string, 'date': re.compile(r"\- ").sub("", itemd.string), 'url': 'http://member.toyokeizai.net' + itema['href'], 'description': itema['title'] # noqa - }) - feeds.append(('news', newsarticles)) - return feeds - - def get_browser(self): - br = BasicNewsRecipe.get_browser(self) - if self.username is not None and self.password is not None: - br.open('http://member.toyokeizai.net/norights/form/') - br.select_form(nr=0) - br['kaiin_id'] = self.username - br['password'] = self.password - br.submit() - return br diff --git a/recipes/tpm_uk.recipe b/recipes/tpm_uk.recipe deleted file mode 100644 index 963855cca3..0000000000 --- a/recipes/tpm_uk.recipe +++ /dev/null @@ -1,41 +0,0 @@ -__license__ = 'GPL v3' -__copyright__ = '2010-2015, Darko Miletic ' -''' -www.philosophersmag.com -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class TPM_uk(BasicNewsRecipe): - title = "The Philosophers' Magazine" - __author__ = 'Darko Miletic' - description = 'Title says it all' - publisher = "The Philosophers' Magazine" - category = 'philosophy, news' - oldest_article = 80 - max_articles_per_feed = 200 - no_stylesheets = True - encoding = 'utf8' - use_embedded_content = False - language = 'en_GB' - remove_empty_feeds = True - publication_type = 'magazine' - extra_css = """ - body{font-family: Raleway,sans-serif } - """ - - conversion_options = { - 'comment': description, 'tags': category, 'publisher': publisher, 'language': language - } - - remove_tags = [ - dict(name=['meta', 'link', 'base', 'iframe', 'embed', 'object', 'img'])] - keep_only_tags = [ - dict(attrs={'class': ['article-title', 'article-content']})] - - feeds = [ - - (u'Articles', u'http://www.philosophersmag.com/index.php/tpm-mag-articles?format=feed&type=rss'), - (u'Reflections', u'http://www.philosophersmag.com/index.php/reflections?format=feed&type=rss') - ] diff --git a/recipes/tri_city_herald.recipe b/recipes/tri_city_herald.recipe deleted file mode 100644 index a1cda789a6..0000000000 --- a/recipes/tri_city_herald.recipe +++ /dev/null @@ -1,27 +0,0 @@ -from calibre.web.feeds.news import BasicNewsRecipe - - -class TriCityHeraldRecipe(BasicNewsRecipe): - title = u'Tri-City Herald' - description = 'The Tri-City Herald Mid-Columbia.' - language = 'en' - __author__ = 'Laura Gjovaag' - oldest_article = 1.5 - max_articles_per_feed = 100 - no_stylesheets = True - remove_javascript = True - keep_only_tags = [ - dict(name='div', attrs={'id': 'story_header'}), - dict(name='img', attrs={'class': 'imageCycle'}), - dict(name='div', attrs={'id': ['cycleImageCaption', 'story_body']}) - ] - remove_tags = [ - dict(name='div', attrs={'id': 'story_mlt'}), - dict(name='a', attrs={'id': 'commentCount'}), - dict(name=['script', 'noscript', 'style'])] - extra_css = 'h1{font: bold 140%;} #cycleImageCaption{font: monospace 60%}' - - feeds = [ - (u'Tri-City Herald Mid-Columbia', - u'http://www.tri-cityherald.com/901/index.rss') - ] diff --git a/recipes/trojmiasto_pl.recipe b/recipes/trojmiasto_pl.recipe deleted file mode 100644 index 73d679aaf9..0000000000 --- a/recipes/trojmiasto_pl.recipe +++ /dev/null @@ -1,57 +0,0 @@ -import re - -from calibre.web.feeds.news import BasicNewsRecipe - - -class Trojmiasto(BasicNewsRecipe): - title = u'Tr\xf3jmiasto.pl' - __author__ = 'fenuks' - description = u'Wiadomości, imprezy, wydarzenia, spektakle.Gdańsk, Gdynia, Sopot - NOCLEGI, Katalog firm, repertuar kin, wydarzenia, przewodnik, mapa, kwatery, hotele. Portal regionalny trojmiasto.pl' # noqa - category = '' - language = 'pl' - encoding = 'utf-8' - extra_css = 'ul {list-style: none; padding:0; margin:0;}' - cover_url = 'http://www.trojmiasto.pl/_img/toplong2/logo_trojmiasto.gif' - use_embedded_content = False - oldest_article = 7 - max_articles_per_feed = 100 - no_stylesheets = True - remove_empty_feeds = True - remove_javascript = True - remove_attributes = ['style', 'font'] - ignore_duplicate_articles = {'title', 'url'} - - preprocess_regexps = [(re.compile(u'Czytaj więcej.*?', re.DOTALL | re.IGNORECASE), lambda match: ''), (re.compile(u'Zobacz też.*?', re.DOTALL | re.IGNORECASE), lambda match: ''), # noqa - (re.compile(u'[A-ZĄĆĘŁŃÓŚŹŻ ,.:-]*?', re.DOTALL), lambda match: ''), ] - - remove_tags = [ - dict(id=['logo', 'font_small', 'font_big']), - dict(attrs={'class': ['title-long', 'ankieta', 'newsletter-inside-content newsletter-wrap', 'copyright_box', 'logo', 'btn btn-photo-add', 'related-info-wrap', 'nTabs', 'article-list', 'rate-player horizontal', 'type-box', 'rate-player', 'hover-nav', 'live-head tC', 'prev-link', 'next-link', 'ie6']}), # noqa - dict(attrs={'title': [u'drukuj artykuł', u'podziel się na Facebooku', u'prześlij artykuł']})] - remove_tags_after = dict(attrs={'class': 'author-wrap'}) - remove_tags_before = dict(attrs={'class': 'text-container'}) - - feeds = [ - (u'Wszystkie', u'http://rss.trojmiasto.pl/rss,0.xml'), - (u'Fakty i opinie', u'http://rss.trojmiasto.pl/rss,1.xml'), - (u'Sport', u'http://rss.trojmiasto.pl/rss,2.xml'), - (u'Dom', u'http://rss.trojmiasto.pl/rss,3.xml'), - (u'Moto', u'http://rss.trojmiasto.pl/rss,4.xml'), - (u'Nauka', u'http://rss.trojmiasto.pl/rss,5.xml'), - (u'Rozrywka', u'http://rss.trojmiasto.pl/rss,6.xml'), - (u'Kultura', u'http://rss.trojmiasto.pl/rss,7.xml'), - (u'Rowery', u'http://rss.trojmiasto.pl/rss,8.xml'), - (u'Dziecko', u'http://rss.trojmiasto.pl/rss,9.xml'), - (u'Zdrowie i uroda', u'http://rss.trojmiasto.pl/rss,10.xml'), - (u'Praca', u'http://rss.trojmiasto.pl/rss,11.xml'), - (u'Artyku\u0142y czytelnik\xf3w', u'http://rss.trojmiasto.pl/rss,12.xml'), - (u'Korki', u'http://rss.trojmiasto.pl/rss,13.xml'), - (u'Historia', u'http://rss.trojmiasto.pl/rss,14.xml'), - (u'Biznes', u'http://rss.trojmiasto.pl/rss,16.xml'), - (u'Kryminalne Tr\xf3jmiasto', u'http://rss.trojmiasto.pl/rss,17.xml'), - (u'Przewodnik', u'http://rss.trojmiasto.pl/rss,18.xml'), - (u'Aktywne Tr\xf3jmiasto', u'http://rss.trojmiasto.pl/rss,19.xml'), - (u'Delux', u'http://rss.trojmiasto.pl/rss,20.xml')] - - def print_version(self, url): - return url + '?print=1' diff --git a/recipes/trombon.recipe b/recipes/trombon.recipe deleted file mode 100644 index bad8de80ca..0000000000 --- a/recipes/trombon.recipe +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -__license__ = 'GPL v3' -__copyright__ = u'2011, Silviu Cotoar\u0103' -''' -trombon.ro -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class Trombon(BasicNewsRecipe): - title = u'Trombon' - __author__ = u'Silviu Cotoar\u0103' - description = u'Parodii si Pamflete' - publisher = u'Trombon' - oldest_article = 5 - language = 'ro' - max_articles_per_feed = 100 - no_stylesheets = True - use_embedded_content = False - category = 'Ziare,Reviste,Fun' - encoding = 'utf-8' - cover_url = 'http://www.trombon.ro/i/trombon.gif' - - conversion_options = { - 'comments': description, 'tags': category, 'language': language, 'publisher': publisher - } - - keep_only_tags = [ - dict(name='div', attrs={'class': 'articol'}) - ] - - remove_tags = [ - dict(name='div', attrs={'class': ['info_2']}), dict( - name='iframe', attrs={'scrolling': ['no']}) - ] - - remove_tags_after = [ - dict(name='div', attrs={'id': 'article_vote'}) - ] - - feeds = [ - (u'Feeds', u'http://feeds.feedburner.com/trombon/ABWb?format=xml') - ] - - def preprocess_html(self, soup): - return self.adeify_images(soup) diff --git a/recipes/trystero.recipe b/recipes/trystero.recipe deleted file mode 100644 index bb1f3af19a..0000000000 --- a/recipes/trystero.recipe +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python - -__license__ = 'GPL v3' -__copyright__ = u'2013, Tomasz Dlugosz ' - -''' -trystero.pl -''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class trystero(BasicNewsRecipe): - title = 'Trystero' - __author__ = u'Tomasz D\u0142ugosz' - language = 'pl' - description = u'Trystero.pl jest niezależnym blogiem finansowym. Publikowane na nim teksty dotyczą rynku kapitałowego, ekonomii, gospodarki i życia społecznego – w takiej mniej więcej kolejności.' # noqa - oldest_article = 7 - remove_javascript = True - no_stylesheets = True - - feeds = [(u'Newsy', u'http://www.trystero.pl/feed')] - - keep_only_tags = [ - dict(name='h1'), - dict(name='div', attrs={'class': ['post-content']})] diff --git a/recipes/tsn.recipe b/recipes/tsn.recipe deleted file mode 100644 index d99a99ade3..0000000000 --- a/recipes/tsn.recipe +++ /dev/null @@ -1,22 +0,0 @@ -from calibre.web.feeds.news import BasicNewsRecipe - - -class AdvancedUserRecipe1289990851(BasicNewsRecipe): - title = u'TSN' - oldest_article = 7 - max_articles_per_feed = 50 - language = 'en_CA' - __author__ = 'Nexus' - no_stylesheets = True - auto_cleanup = True - use_embedded_content = False - INDEX = 'http://tsn.ca/nhl/story/?id=nhl' - # keep_only_tags = [dict(name='div', attrs={'id':['tsnColWrap']}), - # dict(name='div', attrs={'id':['tsnStory']})] - # remove_tags = [dict(name='div', attrs={'id':'tsnRelated'}), - # dict(name='div', attrs={'class':'textSize'})] - - feeds = [ - ('News', - 'http://www.tsn.ca/datafiles/rss/Stories.xml'), - ] diff --git a/recipes/tuttojove.recipe b/recipes/tuttojove.recipe deleted file mode 100644 index 4b483eca8a..0000000000 --- a/recipes/tuttojove.recipe +++ /dev/null @@ -1,26 +0,0 @@ -__license__ = 'GPL v3' -__author__ = 'faber1971' -description = 'Italian website on Juventus F.C. - v1.00 (17, December 2011)' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class AdvancedUserRecipe1305984536(BasicNewsRecipe): - title = u'tuttojuve' - description = 'Juventus' - language = 'it' - __author__ = 'faber1971' - oldest_article = 1 - max_articles_per_feed = 100 - - feeds = [ - (u'notizie', u'http://feeds.tuttojuve.com/rss/'), - (u'da vinovo', u'http://feeds.tuttojuve.com/rss/?c=10'), - (u'primo piano', u'http://feeds.tuttojuve.com/rss/?c=16'), - (u'editoriale', u'http://feeds.tuttojuve.com/rss/?c=3'), - (u'il punto', u'http://feeds.tuttojuve.com/rss/?c=8'), - (u'pagelle', u'http://feeds.tuttojuve.com/rss/?c=9'), - (u'avversario', u'http://feeds.tuttojuve.com/rss/?c=11')] - - def print_version(self, url): - return self.browser.open_novisit(url).geturl() diff --git a/recipes/tuttosport.recipe b/recipes/tuttosport.recipe deleted file mode 100644 index 805f3355b8..0000000000 --- a/recipes/tuttosport.recipe +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python -__license__ = 'GPL v3' -__author__ = 'Lorenzo Vigentini' -__copyright__ = '2009, Lorenzo Vigentini ' -__version__ = 'v1.01' -__date__ = '30, January 2010' -__description__ = 'Sport daily news from Italy' - -'''www.tuttosport.com''' - -from calibre.web.feeds.news import BasicNewsRecipe - - -class tuttosport(BasicNewsRecipe): - author = 'Lorenzo Vigentini' - description = 'Sport daily news from Italy' - - cover_url = 'http://www.tuttosport.com/res/imgs/logo_TuttoSport.png' - title = 'Tuttosport' - publisher = 'Nuova Editoriale Sportiva S.r.l' - category = 'Sport News' - - language = 'it' - timefmt = '[%a, %d %b, %Y]' - - oldest_article = 2 - max_articles_per_feed = 20 - use_embedded_content = False - recursion = 10 - - remove_javascript = True - no_stylesheets = True - - def print_version(self, url): - segments = url.split('/') - printURL = '/'.join(segments[0:10]) + '?print' - return printURL - - keep_only_tags = [ - dict(name='h2', attrs={'class': 'tit_Article'}), - dict(name='div', attrs={ - 'class': ['box_Img img_L ', 'txt_ArticleAbstract', 'txt_Article txtBox_cms']}) - ] - - feeds = [ - (u'Primo piano', u'http://www.tuttosport.com/rss/primo_piano.xml'), - (u'Cronanca', u'http://www.tuttosport.com/rss/Cronaca-205.xml'), - (u'Lettere al direttore', - u'http://blog.tuttosport.com/direttore/feed'), - (u'Calcio', u'http://www.tuttosport.com/rss/Calcio-3.xml'), - (u'Speciale Derby', - u'http://www.tuttosport.com/rss/Speciale-derby-310.xml'), - (u'Formula 1', u'hhttp://www.tuttosport.com/rss/Formula-1-7.xml'), - (u'Moto', u'hhttp://www.tuttosport.com/rss/Moto-8.xml'), - (u'Basket', u'http://www.tuttosport.com/rss/Basket-9.xml'), - (u'Altri Sport', u'http://www.tuttosport.com/rss/Altri-Sport-2.xml'), - (u'Tuttosport League', - u'http://www.tuttosport.com/rss/Tuttosport-League-245.xml'), - (u'Scommesse', u'http://www.tuttosport.com/rss/Scommesse-286.xml') - ] - - extra_css = ''' - body {font-family: Arial, Verdana, sans-serif; margin-bottom: 3em;} - h2.tit_Article {color:#9C3A0B;margin: 15px 8px 0; margin-bottom: 1px; border-bottom: 3px solid;} - .txt_ArticleAbstract {color:#4080AE;clear: both; margin: 3px 8px;} - .txt_Article {clear: both; margin: 8px 8px 12px;} - .txt_Author {float: right;} - .txt_ArticleAuthor {clear: both; margin: 8px;} - ''' diff --git a/recipes/tveast_dk.recipe b/recipes/tveast_dk.recipe deleted file mode 100644 index 255974b91e..0000000000 --- a/recipes/tveast_dk.recipe +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 -# https://manual.calibre-ebook.com/news_recipe.html -from __future__ import absolute_import, division, print_function, unicode_literals - -from calibre.web.feeds.news import BasicNewsRecipe - -''' -TV ØST -''' - - -class Tveast_dk(BasicNewsRecipe): - __author__ = 'CoderAllan.github.com' - title = 'TV ØST' - description = ('Ved at abonnere på vores RSS-feed kan du få de seneste ' - 'regionale nyheder til at automatisk dukke op på din skærm.') - category = 'news, localnews, sport, culture, Denmark' - oldest_article = 7 - max_articles_per_feed = 50 - auto_cleanup = True - language = 'da' - - # Feed are found here: http://www.tveast.dk/tveast/rss - feeds = [ - ('TV ØST', 'http://www.tveast.dk/tveast/rss'), - ] diff --git a/recipes/tvn24.recipe b/recipes/tvn24.recipe deleted file mode 100644 index 789dda0eda..0000000000 --- a/recipes/tvn24.recipe +++ /dev/null @@ -1,42 +0,0 @@ -from calibre.web.feeds.news import BasicNewsRecipe - - -class tvn24(BasicNewsRecipe): - title = u'TVN24' - oldest_article = 7 - max_articles_per_feed = 100 - __author__ = 'fenuks, Artur Stachecki' - description = u'Sport, Biznes, Gospodarka, Informacje, Wiadomości Zawsze aktualne wiadomości z Polski i ze świata' - category = 'news' - language = 'pl' - cover_url = 'http://ncplus.pl/~/media/n/npl/kanaly/logo%20na%20strony%20kanalow/tvn24-630.png' # noqa - extra_css = 'ul {list-style: none; padding: 0; margin: 0;} li {float: left;margin: 0 0.15em;}' - remove_empty_feeds = True - remove_javascript = True - no_stylesheets = True - keep_only_tags = [ - dict(name='article',attrs={'class':'mb20'}) - ] - remove_tags = [ - dict(attrs={'class': ['commentsInfo', 'textSize', 'related newsNews align-right', 'box', 'watchMaterial text', 'related galleryGallery align-center', 'advert block-alignment-right', 'userActions', 'socialBookmarks', 'im yourArticle fl', 'dynamicButton addComment fl', 'thumbsGallery', 'relatedObject customBlockquote align-right', 'lead', 'mainRightColumn', 'articleDateContainer borderGreyBottom', 'socialMediaContainer onRight loaded', 'quizContent', 'twitter', 'facebook', 'googlePlus', 'share', 'voteResult', 'reportTitleBar bgBlue_v4 mb15', 'innerVideoModule center']}), # noqa - dict(name='aside'), - dict(name='figure'), - dict(name='section', attrs={ - 'id': ['forum', 'innerArticle', 'quiz toCenter', 'mb20']}) - ] - remove_tags_after = [dict(name='li', attrs={'class': 'share'})] - feeds = [(u'Najnowsze', u'http://www.tvn24.pl/najnowsze.xml'), ] - - def get_article_url(self, article): - link = article.get('link') - # following websites are linked in aforementioned feeds, but have different layout not compatible with this recipe - banned = ['tvnwarszawa.pl','tvnmeteo.pl','szklokontaktowe.tvn24.pl','tvn24bis.pl'] - if not any(x in link for x in banned): - return link - - def preprocess_html(self, soup): - for alink in soup.findAll('a'): - if alink.string is not None: - tstr = alink.string - alink.replaceWith(tstr) - return soup diff --git a/recipes/tvxs.recipe b/recipes/tvxs.recipe deleted file mode 100644 index eeb5d53db8..0000000000 --- a/recipes/tvxs.recipe +++ /dev/null @@ -1,72 +0,0 @@ -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai - -import re - -from calibre.web.feeds.recipes import BasicNewsRecipe - - -class TVXS(BasicNewsRecipe): - title = 'TVXS' - __author__ = 'hargikas' - description = 'News from Greece' - max_articles_per_feed = 100 - oldest_article = 3 - publisher = 'TVXS' - category = 'news, sport, greece' - language = 'el' - encoding = None - use_embedded_content = False - remove_empty_feeds = True - conversion_options = {'smarten_punctuation': True} - no_stylesheets = True - publication_type = 'newspaper' - remove_tags_before = dict(name='h1', attrs={'class': 'print-title'}) - remove_tags_after = dict(name='div', attrs={ - 'class': 'field field-type-relevant-content field-field-relevant-articles'}) - remove_tags = [dict(name='div', attrs={'class': 'field field-type-relevant-content field-field-relevant-articles'}), - dict(name='div', attrs={ - 'class': 'field field-type-filefield field-field-image-gallery'}), - dict(name='div', attrs={'class': 'filefield-file'})] - remove_attributes = ['border', 'cellspacing', 'align', 'cellpadding', - 'colspan', 'valign', 'vspace', 'hspace', 'alt', 'width', 'height'] - extra_css = 'body { font-family: verdana, helvetica, sans-serif; } \ - table { width: 100%; } \ - td img { display: block; margin: 5px auto; } \ - ul { padding-top: 10px; } \ - ol { padding-top: 10px; } \ - li { padding-top: 5px; padding-bottom: 5px; } \ - h1 { text-align: center; font-size: 125%; font-weight: bold; } \ - h2, h3, h4, h5, h6 { text-align: center; font-size: 100%; font-weight: bold; }' - preprocess_regexps = [(re.compile(r'', re.IGNORECASE), lambda m: ''), - (re.compile(r'', re.IGNORECASE), lambda m: '')] - - feeds = [(u'Ελλάδα', 'http://tvxs.gr/feeds/2/feed.xml'), - (u'Κόσμος', 'http://tvxs.gr/feeds/5/feed.xml'), - (u'Τοπικά Νέα', 'http://tvxs.gr/feeds/5363/feed.xml'), - (u'Sci Tech', 'http://tvxs.gr/feeds/26/feed.xml'), - (u'Αθλητικά', 'http://tvxs.gr/feeds/243/feed.xml'), - (u'Internet & ΜΜΕ', 'http://tvxs.gr/feeds/32/feed.xml'), - (u'Καλά Νέα', 'http://tvxs.gr/feeds/914/feed.xml'), - (u'Απόψεις', 'http://tvxs.gr/feeds/1109/feed.xml'), - (u'Πολιτισμός', 'http://tvxs.gr/feeds/1317/feed.xml'), - (u'Greenlife', 'http://tvxs.gr/feeds/3/feed.xml'), - (u'Ιστορία', 'http://tvxs.gr/feeds/1573/feed.xml'), - (u'Χιούμορ', 'http://tvxs.gr/feeds/692/feed.xml')] - - def print_version(self, url): - br = self.get_browser() - response = br.open(url) - data = response.read() - - pos_1 = data.find('', pos_1) - if pos_2 == -1: - return url - - pos_1 += len('