403Webshell
Server IP : 35.80.110.71  /  Your IP : 216.73.216.221
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64
User : ubuntu ( 1000)
PHP Version : 8.3.31
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /usr/share/calibre/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/share/calibre/builtin_recipes.zip
PK�X5O-��
10minutos.png�PNG


IHDR  ���IDAT��kl�����y��s�9�7���-�m-J�(Z��n�B���B!Y�D�e���d�2�e���ɦ���(N�htQщD�K�P���sz.���E�\�/�|�$.%�K��#����@�$�$�W����R
��Yߛd�5FDpAT5r.vǪT���W�N����)�j��dW��
�u�M-�[�͙�ّ�!5ra�b)8;0p����aa,vq�U���}|��.v�J���۟z���f�;i3�:��ǧ��F�Axvxl�֞�-��<ۛa%#:�C+���k=OH�|���A44Zܻ��g�-|��/C��Lkɸ�}G�m~�����;p�1iV*��DU�G�;vZ�����I��(��;���ν��Ea�t����MXϯF������n}��vF�!Vq�Bj��޹��?���b��on�sE�xα����,M�Ϙ�B&(��w��O�6��ܶv$���?)��3��F�v��-�\�������E���=O���y�5�/`�F�h�T�#RS�/�Pİ�Ri�;�nzq�7���W,����^�㊗�����=��/O^~d�tS�G��p`�����yt"��g|����+���+�1"p����^~v�9��8��9�����w��%|R@����7�=1k�k]fĀ��ɔ�-����?���L$ww��k��np����ҠGu@��룭MC�a�$N�v��GgΞV�B�"&<y�}��|� ʓ.c�m��x���ի��g�Oon��E��CyQ'pN�D�����WA�*�랿�*k�Q���\:���V�jw7w��7�/k��h�G��Xk|kq�JLRHqd����|r�v���J&�N���P 7�V��Ӛ=۾b壿�%C���lap���SH�� �0��-�Kѩ�Dk��:�-���
:U�"sZ�GZ���_�����[�i�2D�	��o�9B�TDA�� ��L��*@���cL��ڕ�<6�}��u�uUx���|���2S��t�a!F`� Ƙ:�]��_�[��{�1�} ;5��V
��j �o%0>�ri� �#D���ګ:�>�����q1�O!2`L$jj."Q:u2�ˍغ���ŧ��*	@
��aK����Si+VU��⹃�/7��z���.�aCc|F��kp�����ʟںaC�\!�d�؏�Yk���5��J��-���ENl5Q;{�5STT��L%��-쏒�JT�=�=Ď
/Sw�}�q�\6k���ݱ���r.pf�vv{W���Z��cb�Ҟ�y��c5m�HN��-�ﭧ�9�G�oܴf��Z�8e��:sn��o��D�g|"ʡk�+gLQ2.�=�u~為[��W���S�b��/=����t:���(,U�ã�����uKA�H����I%>G�A�R
��
����Y�~�'3�iM�:ӥ���<qb�M+[:�ҹ\%?��?�5�;nN{��팛��~��V���X��"T\@�����s���'��-��f�b���Կ�����9W\̱i�����6$��wӷW�өr���&Rw��0
r�~U|Ӑ���{�h��ύ��i��2&�*YPW@kU�H�H�9T3�����Z����F3A���$-V*n��k�0�&<O|o�
7��kEC6CJ�;~b���1�tb��j
@N��i�s㒵.�����g-�jI]�T+�(1�M��L�҅q<�/�:����woG�0clM���c�uK�_��23�Lc����^�"�`�`8eE����H~t�Tkm.�il����դ��`EP2V���	��R�T�r����$
@H�R2��J�V@��mIEND�B`�PK�X#aoI��10minutos.recipe#!/usr/bin/env python
##
# Title:        Diario 10minutos.com.uy News and Sports Calibre Recipe
# Contact:      Carlos Alves - <carlosalves90@gmail.com>
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    Carlos Alves - <carlosalves90@gmail.com>
##
# Written:      September 2013
# Last Edited:  2018-02-13
##

__license__ = 'GPL v3'
__author__ = '2016, Carlos Alves <carlosalves90@gmail.com>'
'''
10minutos.com.uy
'''

from calibre.web.feeds.news import BasicNewsRecipe


class General(BasicNewsRecipe):
    title = '10minutos'
    __author__ = 'Carlos Alves'
    description = 'Noticias de Salto - Uruguay'
    tags = 'news, sports'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 5
    encoding = 'utf8'
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 2
    max_articles_per_feed = 100
    keep_only_tags = [dict(name='div', attrs={'class': 'post-content'})]

    remove_tags = [
        dict(name='div', attrs={'class': ['hr', 'titlebar', 'navigation']}),
        dict(name='div', attrs={'class': 'sharedaddy sd-sharing-enabled'}),
        dict(name='p', attrs={'class': 'post-meta'}),
        dict(name=['object', 'link'])
    ]

    extra_css = '''
                h1{font-family: Georgia,"Times New Roman",Times,serif}
                h3{font-family: Georgia,"Times New Roman",Times,serif}
                h2{font-family: Georgia,"Times New Roman",Times,serif}
                p{font-family: Verdana,Arial,Helvetica,sans-serif}
                body{font-family: Verdana,Arial,Helvetica,sans-serif}
                img{margin-bottom: 0.4em; display:block;}
                '''

    feeds = [
        (u'Articulos', u'http://10minutos.com.uy/?feed=rss2')
    ]

    def get_cover_url(self):
        return None

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�XY�l���180.png�PNG


IHDR  szz��IDATx�bR`x�`Mr ��s�)�T�T����5�m�[۶m۶m�g��e'��a�誮f��|�5�SB�!�J��R�`�A�!�S�T���Kk���i�Ie���`���*�q��8�=��>�P�8�=Kl�n>�/��M�Sl�eko�S�5G�Ϸ�4���8�̺4>9G��p,HM����<��8^,.7�O�4�2�B���UJgWw�
��FA�;�Ө�Z�3�dG�X�"���Ϧӊ��x�]�b����%p{
�]駳�Y�
i|��d>bL0��g�h�.�o��^�̗��ק���W���:�"@!Q•�4�G
Ņ<��K�D�G�ؘ.+߀�q�X��Q�R��D��at0K����0���sI-ZC�����b���
Ө3lN�5�@�5�О���{�>Z�O�g�?�<U��;.���x��΅@�D��i|�|���p�8�ϗ�)\d�R��L �\i�#`	Q_�e���i��BD�J���{�P|���ת1�&)S#X&�����Qh�B��ۋX�4'�7U��8_���<��L��jkŚ���e�#��`�¢8��㠱x�	��O��E�PJ7w�@~֨�I�
��V��;7�(��JDd������B��D�����/赽C�Y&"�f�[i�@�6���
��z373ZM�����"��;G���}Y��l��V��v�k��}�y~,���a�OV@� Ռ t���(־�'sń<^��QVsXuwg��ĢjPti�۽!�r��gA���i���T'��F`�ޞ̆��M�3�[��s�T�A��W0
m�᱾I�a���f��
*P##�ђ������E�lI�p���}��%@�j�����%_�N�[V��y�T�kX �0۶��� v��M:�Z��(�!�P�@� �LA�I�1#�|�+lH�X&�aH��b�7�L��Ju)�����P+����abJ����͊�T��T���8R+!�=Z(N�R�eb�*�)G*&�Ў�m���Gqi���.��r��bWU$��c�F1z�~Wcڡ�7�BD_nJ��
j��t���?OAU&����PR�ѯ���Ph��:T�Z<����~E:���H��!F��'����!��.�#��6��	���]�A7U�~J�@������n��1� �V+��P�`v�ukp�fIEND�B`�PK�XӦ×�
180.recipe#!/usr/bin/env python
##
# Last Edited:  2018-02-13 Carlos Alves <carlosalves90@gmail.com>
##

__license__ = 'GPL v3'
__author__ = '2010, Gustavo Azambuja <hola at gazambuja.com>'
'''
180.com.uy
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Noticias(BasicNewsRecipe):
    title = '180.com.uy'
    __author__ = 'Gustavo Azambuja'
    description = 'Noticias de Uruguay'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 5
    encoding = 'utf-8'
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 2
    max_articles_per_feed = 100
    remove_tags_after = dict(name='article')
    keep_only_tags = [
        dict(name='div', attrs={'class': 'nota'}),
        dict(name='h3',),
        dict(name='h4',),
        dict(name='article',)
    ]
    remove_tags = [
        dict(name='div', attrs={'class': 'items'})
    ]

    remove_attributes = ['width', 'height', 'style', 'font', 'color']

    extra_css = '''
                h1{font-family: Georgia,"Times New Roman",Times,serif}
                h3{font-family: Georgia,"Times New Roman",Times,serif}
                h2{font-family: Georgia,"Times New Roman",Times,serif}
                p{font-family: Verdana,Arial,Helvetica,sans-serif}
                body{font-family: Verdana,Arial,Helvetica,sans-serif}
                img{margin-bottom: 0.4em; display:block;}
                '''

    feeds = [
        (u'Titulares', u'http://www.180.com.uy/feed.php')
    ]

    def get_cover_url(self):
        pass

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X%9V1843.png�PNG


IHDR(-S]PLTE�	��3?�?J�"/�7C��js�Yc�P[�FQ�.:�&3�y��]f�MX�*7�-�$�!�������qy�bk�JU�:F���A=�.zIDATxڍNU�0��:u����q�뎑⿐���`k���s�U��&�[Xʽ@�R�!u��v��Є3���p/���8��{�Vh����$X��r1�Y�(�؞���'U��г����>z��n*�B���IEND�B`�PK�Xȩ�O��1843.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from calibre.web.feeds.news import BasicNewsRecipe, classes


class E1843(BasicNewsRecipe):
    title = '1843'
    __author__ = 'Kovid Goyal'
    description = 'The ideas, culture and lifestyle magazine from The Economist'
    language = 'en_GB'
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'
    # economist.com has started throttling after about 60% of the total has
    # downloaded with connection reset by peer (104) errors.
    delay = 1


    keep_only_tags = [
        dict(id='content')
    ]
    remove_tags = [
        classes('advert ad ds-share-list article__wordmark related-articles newsletter-signup'),
        dict(attrs={'data-test-id':'sharing-modal'}),
    ]

    def parse_index(self):
        soup = self.index_to_soup('https://economist.com/1843')
        ans = []
        main = soup.find(id='content')

        for h3 in main.find_all('h3'):
            a = h3.find('a')
            url = a['href']
            if url.startswith('/'):
                url = 'https://economist.com' + url
            title = self.tag_to_string(a)
            self.log(title, ' at ', url)
            desc = ''
            d = a.parent.findNextSibling('p')
            if d is not None:
                desc = self.tag_to_string(d)
            ans.append({'title': title, 'url': url, 'description': desc})
        return [('Articles', ans)]

    def postprocess_html(self, soup, *a):
        a = soup.find('a', string='More from 1843 magazine')
        if a is not None:
            more = a.parent.parent
            more.extract()
        return soup
PK�X�ͦ||20_minutos.png�PNG


IHDR  D���LPLTE;����?�>�@�?�?�>����@�=�@�A�B�C�!E�%H�1R�g�k����������������������A����<����B����Wq�`y�A� D���Ɣ�Ț�ˣ�Ч�� D����������4T����7W����Gd����$G�A���'K��+M�-O�.O�������C�2S�3S����Nj�Ok�Pl�Ql�Qm�Sn�To�Vq�&I�Xr�[u�\v�_w�&I�ay�b{�'I�h�i��j��'J�l��s��w��y��~���������������Ë�Ë�č�Ő��@���ǒ�ǒ�Ǔ��(J���ɗ�ʘ�ʘ�ʚ��(K���͞�͟�͟��)L���Х��*L���ӯ�֯��Mi���ײ�׳�ش�ص�ٶ�ٶ��=���ڸ�ڹ�ۺ�ܺ�ܻ�ܽ���������,M����������������������,N�,N���������� E�������?�.P�/P�0Q�"E����������������"F��������������2S�#F�#G���6V����<����8X�:Y����?]����������Ca����D�Jf�Lh��n��IDATxڽ�w�@��~���6j��ڶm۶m۶��v殑��}��&���
!�ϳ�<��F�l�s8�_�QR�tёN����,(��:���E�Gl=��y����¿Ұ<2�2��}�+I
�̌B�}��s �i.ր����2��u�7�kG�H?�9+�1x��o��}�^!:�n��K�@hP��=��.G�w<�C���u��6yt��)K�:`���K��9���Ǒ�l�J�E�
/���=���	��b��f�v�N��>�D[M�Z��S�	 W�1��(��[�f�M`�wp��'��e�C"cp�]o�
����:ԏ�괭"uv�T5�
SU	xO�E��#DC��Iwy�;	��J%��V�1�4
����}�W���V&���8��-d�_��qI-d�;�AR���I�g̛#���[�Y{N��\Y�0	"N���CF�ٺ�lzA�G$�W�.צ@ց�B"�P�IEND�B`�PK�X�::��
�
20_minutos.recipe__license__ = 'GPL v3'
__author__ = 'Luis Hernandez'
__copyright__ = 'Luis Hernandez<tolyluis@gmail.com>'
__version__ = 'v0.85'
__date__ = '31 January 2011'

'''
www.20minutos.es
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1294946868(BasicNewsRecipe):

    title = u'20 Minutos'
    publisher = u'Grupo 20 Minutos'

    __author__ = 'Luis Hernandez'
    description = 'Free spanish newspaper'
    cover_url = 'http://estaticos.20minutos.es/mmedia/especiales/corporativo/css/img/logotipos_grupo20minutos.gif'

    oldest_article = 2
    max_articles_per_feed = 100

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False

    encoding = 'ISO-8859-1'
    language = 'es'
    timefmt = '[%a, %d %b, %Y]'
    remove_empty_feeds = True

    keep_only_tags = [
        dict(name='div', attrs={'id': ['content', 'vinetas', ]}), dict(name='div', attrs={'class': ['boxed', 'description', 'lead', 'article-content', 'cuerpo estirar']}), dict(name='span', attrs={'class': ['photo-bar']}), dict(name='ul', attrs={'class': ['article-author']})  # noqa
    ]

    remove_tags_before = dict(name='ul', attrs={'class': ['servicios-sub']})
    remove_tags_after = dict(
        name='div', attrs={'class': ['related-news', 'col']})

    remove_tags = [
        dict(name='ol', attrs={'class': ['navigation', ]}), dict(name='span', attrs={'class': ['action']}), dict(name='div', attrs={'class': ['twitter comments-list hidden', 'related-news', 'col', 'photo-gallery', 'photo-gallery side-art-block', 'calendario', 'article-comment', 'postto estirar', 'otras_vinetas estirar', 'kment', 'user-actions']}), dict( name='div', attrs={'id': ['twitter-destacados', 'eco-tabs', 'inner', 'vineta_calendario', 'vinetistas clearfix', 'otras_vinetas estirar', 'MIN1', 'main', 'SUP1', 'INT']}), dict(name='ul', attrs={'class': ['article-user-actions', 'stripped-list']}), dict(name='ul', attrs={'id': ['site-links']}), dict(name='li', attrs={'class': ['puntuacion', 'enviar', 'compartir']})  # noqa
    ]

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h3{font-family: sans-serif; font-size:150%; font-weight:bold; text-align: justify; }
                                 """

    preprocess_regexps = [(re.compile(
        r'<a href="http://estaticos.*?[0-999]px;" target="_blank">', re.DOTALL), lambda m: '')]

    feeds = [

    (u'Portada', u'http://www.20minutos.es/rss/'),
    (u'Nacional', u'http://www.20minutos.es/rss/nacional/'),
    (u'Internacional', u'http://www.20minutos.es/rss/internacional/'),
    (u'Economia', u'http://www.20minutos.es/rss/economia/'),
    (u'Deportes', u'http://www.20minutos.es/rss/deportes/'),
    (u'Tecnologia', u'http://www.20minutos.es/rss/tecnologia/'),
    (u'Gente - TV', u'http://www.20minutos.es/rss/gente-television/'),
    (u'Motor', u'http://www.20minutos.es/rss/motor/'),
    (u'Salud', u'http://www.20minutos.es/rss/belleza-y-salud/'),
    (u'Viajes', u'http://www.20minutos.es/rss/viajes/'),
    (u'Vivienda', u'http://www.20minutos.es/rss/vivienda/'),
    (u'Empleo', u'http://www.20minutos.es/rss/empleo/'),
    (u'Cine', u'http://www.20minutos.es/rss/cine/'),
    (u'Musica', u'http://www.20minutos.es/rss/musica/'),
    (u'Vinetas', u'http://www.20minutos.es/rss/vinetas/'),
    (u'Comunidad20', u'http://www.20minutos.es/rss/zona20/')
    ]
PK�X�3����
20minutes.png�PNG


IHDR  szz��IDATx^��{�U����ڗsf�93��v�F��"��)m���Kh�&6ш�451��ޒ�DkcJ��"����ϴC�V�
�h�AD��s?{��:���C�M���}���g�����������-z��E��+(IB�5,������gFUG�[g�>X��y0ف�ǎ\�8^yF�6�(�@y �$$1 *U?��‰�[��|�+�Ȝ��T���e)l��S<�O��acC�E9�L@�������֙q�6�EpFh6A|���r���~y�;�X-GT� c�{�l&eA,H��0O��:q�D[2ʽ�ˀ[��^��X����L����g|l-�)�=0fv�����l�4�[�R��a���t&_p����K�۝I�X_:^a�_���g@��(6l��m�7AWw+�+
�Mֹ`n;���}�k.��7�y�|a����Xpz��_�׮��š��1G0���XV�׭��T�Ɇ��p��^�[����[�����/�Z��w��}x�{���a�<�6t�1�e��0�:��n^˖�w�P�>X��1>&�Wo,�<����a�n���q�֕Q�����t��N(�Ӯ�͈��JO�@��q��PhZ�nh#vm��qh?��\�w�nD�d5>���y��[hF:�;�q0�nT�J��@YĚ��j3��$lb��5�&����1Ğ�J ��8��X0:��GX�)b'GxH�?1��͠0.�:�!BaȆ�Q�jYT���!NVl����)ju�`���NT,��ط�'��NM`�b��8_ �H
$%H�+�M6����!�9��JM��>�u��X0���~���~�	91��B�R*7Y����~�2���ә���G[`����ʶ�WӒ�9],�5,��)�3�̓�x��s����y��HB���87>*@�
g������߶Z�+��i�<��o\{�,B�`��!n���;��n����wr��W����2U�"�r�ɞ��B!��-�x��ٹ��
Ht}�N�7X:����1+ox<?�,��t!mY�+���gӓ[×oy�r3@��5m����W0����w�d�d|������j=`�Ž�ԝa��
�H{�	Q��K�����x�'�t�u���Y��\$��q)3�R���l�X���%
k1n�N�M���FkJ��vߍ�H@N�ɆZ�8X�R��kǏ��$%%y�~úkR�SJ����'K�b�������Ix�D�����3�}��)�%0xJ������g�ܹDq@&���l�1�mӿ]X�{d_]��ŋӌ���b��(�>�:�|�rW�����Q��W��p/�;c6�߰	l#!�R�5�:[xx�t��O���z��|;����@&�c�?���y��vCnV�g9�	%T���Q������hh�jS���%��š95~�'��>�Ç4yh�#��S�ǀ�D�-��yu�<�ȟ���4�pP`,�Ј-?�FgP#6�fl��Q"L�D��F*�V\q���I�0PI���O���E�#B��C���1M�U��=��v	�քL�q\/�0{f��*d���C��+�
��ϔ�b���s:Y��@��k�r�N.�-�z��%�Y����GN0x���5
�s�Q�/]�w..pϓ{8X�|{�<�?�k�X>��цw������%P�X9KƦ�T'�#�Qz3���c��`#��h�Fy���TiV&�-��U��98��}2:V���z��E�\�dݭ1��L�B������X)QRq�fa_�B.K���3{g��3X}�"�~�L�;�ش@&2Vj�t�6�^��e�����-bÊn�y�c~��0;�8�f���>��w�&.����ӿ2�#�����_Y�F�I>�	*�����G�5��&��X}���D�Y=J��4��ۓ#��W4}3�1m����3�֍���*��>??*��mǏ�`b�0��f�����E��Mh�����C�A��x��-�B|ω{>��W
=�	�w���m���V�sԊ�DҜ��.�  �������\��]���p��E��m�^Z��ڭ։��"��LI&��'�g��o���	��~LIEND�B`�PK�XD,��II20minutes.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2011 Aurélien Chabot <contact@aurelienchabot.fr>'
'''
20minutes.fr
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class Minutes(BasicNewsRecipe):

    title = '20 minutes'
    __author__ = u'Aurélien Chabot'
    description = 'Actualités'
    encoding = 'utf-8'
    publisher = '20minutes.fr'
    category = 'Actualités, France, Monde'
    language = 'fr'

    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 15
    no_stylesheets = True
    remove_empty_feeds = True

    keep_only_tags = [
        dict(name='h1'),
        classes('lt-endor-body'),
    ]
    remove_tags = [
        classes('content-related sharebar'),
    ]
    remove_tags_after = dict(id='ob_holder')

    feeds = [
        ('France', 'http://www.20minutes.fr/rss/actu-france.xml'),
        ('International', 'http://www.20minutes.fr/rss/monde.xml'),
        ('Tech/Web', 'http://www.20minutes.fr/rss/hightech.xml'),
        ('Sciences', 'http://www.20minutes.fr/rss/sciences.xml'),
        ('Economie', 'http://www.20minutes.fr/rss/economie.xml'),
        ('Politique', 'http://www.20minutes.fr/rss/politique.xml'),
        (u'Médias', 'http://www.20minutes.fr/rss/media.xml'),
        ('Cinema', 'http://www.20minutes.fr/rss/cinema.xml'),
        ('People', 'http://www.20minutes.fr/rss/people.xml'),
        ('Culture', 'http://www.20minutes.fr/rss/culture.xml'),
        ('Sport', 'http://www.20minutes.fr/rss/sport.xml'),
        ('Paris', 'http://www.20minutes.fr/rss/paris.xml'),
        ('Lyon', 'http://www.20minutes.fr/rss/lyon.xml'),
        ('Toulouse', 'http://www.20minutes.fr/rss/toulouse.xml')
    ]
PK�X�d�
24sata.png�PNG


IHDR��h6\IDATx�c8�F����j�/zz��;�����׮>ok���w���,�UM�O{�~;�~B�F��wk���@/z�O30\�v�D�IM����w���q���͒%@i��@
�7m��|��P]����i�3,���~>y�~������s����5�e`������y���֯{TYd�������	�@����Sp
���ܽ�v��-g׫::>~9����`���<�
��iu
H���K��@��OH��
�~�
����� �}������������Ç�r��Aj��#G �y��	���%��߯_�ч�;����$Ë�.��â��G�SD�z�A��IEND�B`�PK�XI�""
24sata.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
24sata.hr
'''

import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Cro24Sata(BasicNewsRecipe):
    title = '24 Sata - Hr'
    __author__ = 'Darko Miletic'
    description = "News Portal from Croatia"
    publisher = '24sata.hr'
    category = 'news, politics, Croatia'
    oldest_article = 2
    max_articles_per_feed = 100
    delay = 4
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'hr'

    lang = 'hr-HR'

    extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif}'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    remove_tags = [
        dict(name=['object', 'link', 'embed']), dict(
            name='table', attrs={'class': 'enumbox'})
    ]

    feeds = [(u'Najnovije Vijesti',
              u'http://www.24sata.hr/index.php?cmd=show_rss&action=novo')]

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def print_version(self, url):
        return url + '&action=ispis'
PK�X��8�
3dnews.png�PNG


IHDR  D���{PLTE!u�$w�'y�-|�-|�4��;��@��E��M��P��W��X��a��d��l��v��z���؆�ڊ�ێ�ܔ�ߕ�ޝ��������������������������������������z_#�FIDAT�[RTA�<}k��R؄�_�?�Ϋ�̬��ˇ/i����EA�@�?�]M�M��Ʉ����Ӊ,ť��n��>�:�M��W;�t
�
9�bta��
��A��=uttt�W��
>�{_
Mg���@f=)X@��r^����0]�B��6�L�Z���t�o��������E�'p�lJ��Lk�x�9��C㛨�`�1�Xc��fJ�PG'2�\2�Ζ�A�N��Y���pD콺H����/�W
4���#�a�V��IEND�B`�PK�X��+ ��
3dnews.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class News(BasicNewsRecipe):
    title = '3DNews: Daily Digital Digest'
    __author__ = 'bugmen00t'
    description = 'Независимое российское онлайн-издание, посвященное цифровым технологиям'
    publisher = '3DNews'
    category = 'news'
    cover_url = u'http://www.3dnews.ru/assets/images/logo.png'
    language = 'ru'
    auto_cleanup = True

    oldest_article = 15
    max_articles_per_feed = 60

    feeds = [
        (
            '\u0412\u0430\u0436\u043D\u044B\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://3dnews.ru/breaking/rss/'
        ),
        (
            '\u0412\u0441\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://3dnews.ru/news/rss/'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438 - \u0445\u0430\u0440\u0434',
            'https://3dnews.ru/hardware-news/rss'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438 - \u0433\u0430\u0434\u0436\u0435\u0442\u044B',
            'https://3dnews.ru/gadgets/rss/'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438 - \u0441\u043E\u0444\u0442',
            'https://3dnews.ru/software-news/rss/'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438 - \u0438\u0433\u0440\u044B',
            'https://3dnews.ru/games/rss/'
        ),
        (
            '\u0423\u043C\u043D\u044B\u0435 \u0412\u0435\u0449\u0438',
            'https://3dnews.ru/smart-things/rss/'
        ),
        (
            '\u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430',
            'https://3dnews.ru/editorial/rss/'
        ),
        (
            '\u041F\u0440\u043E\u0446\u0435\u0441\u0441\u043E\u0440\u044B \u0438 \u043F\u0430\u043C\u044F\u0442\u044C',
            'https://3dnews.ru/cpu/rss/'
        ),
        (
            '\u041C\u0430\u0442\u0435\u0440\u0438\u043D\u0441\u043A\u0438\u0435 \u043F\u043B\u0430\u0442\u044B',
            'https://3dnews.ru/motherboard/rss/'
        ),
        (
            '\u041A\u043E\u0440\u043F\u0443\u0441\u0430, \u0411\u041F \u0438 \u043E\u0445\u043B\u0430\u0436\u0434\u0435\u043D\u0438\u0435',
            'https://3dnews.ru/cooling/rss/'
        ),
        (
            '\u0412\u0438\u0434\u0435\u043E\u043A\u0430\u0440\u0442\u044B',
            'https://3dnews.ru/video/rss/'
        ),
        (
            '\u041C\u043E\u043D\u0438\u0442\u043E\u0440\u044B \u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0440\u044B',
            'https://3dnews.ru/display/rss/'
        ),
        (
            '\u041D\u0430\u043A\u043E\u043F\u0438\u0442\u0435\u043B\u0438',
            'https://3dnews.ru/storage/rss/'
        ),
        (
            '\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u0430\u0432\u0442\u043E\u043C\u043E\u0431\u0438\u043B\u044C',
            'https://3dnews.ru/auto/rss/'
        ),
        (
            '\u0421\u043E\u0442\u043E\u0432\u0430\u044F \u0441\u0432\u044F\u0437\u044C',
            'https://3dnews.ru/phone/rss/'
        ),
        (
            '\u041F\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u044F',
            'https://3dnews.ru/peripheral/rss/'
        ),
        (
            '\u041D\u043E\u0443\u0442\u0431\u0443\u043A\u0438 \u0438 \u041F\u041A',
            'https://3dnews.ru/mobile/rss/'
        ),
        (
            '\u041F\u043B\u0430\u043D\u0448\u0435\u0442\u044B',
            'https://3dnews.ru/tablets/rss/'
        ),
        (
            '\u0417\u0432\u0443\u043A \u0438 \u0430\u043A\u0443\u0441\u0442\u0438\u043A\u0430',
            'https://3dnews.ru/multimedia/rss/'
        ),
        (
            '\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0435 \u0444\u043E\u0442\u043E \u0438 \u0432\u0438\u0434\u0435\u043E',
            'https://3dnews.ru/digital/rss/'
        ),
        (
            '\u0421\u0435\u0442\u0438 \u0438 \u043A\u043E\u043C\u043C\u0443\u043D\u0438\u043A\u0430\u0446\u0438\u0438',
            'https://3dnews.ru/communication/rss/'
        ),
        (
            '\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u043E\u0435 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0435\u043D\u0438\u0435',
            'https://3dnews.ru/software/rss/'
        ),
        ('Off-\u0441\u044F\u043D\u043A\u0430', 'https://3dnews.ru/offsyanka/rss/'),
        (
            '\u041C\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0430\u044F',
            'https://3dnews.ru/workshop/rss/'
        ),
        (
            'ServerNews - \u0441\u0442\u0430\u0442\u044C\u0438',
            'https://servernews.ru/rss'
        ),
        (
            'ServerNews - \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://servernews.ru/news/rss'
        )
    ]

    def print_version(self, url):
        return url + '/print'
PK�XK����	7seri.png�PNG


IHDR(-S3PLTE$"$�24������fd�4424�RT�24������TVT�S�}tRNS@��fpIDATx�U���@�X]���ȫ�� t�3����8�+щ�����]�A��t7�S	k��	-�L����L0�6]��p�����+�IBl!)��b��Q<�&B��/ò�b�Cӓb�IEND�B`�PK�X[�Bw;;7seri.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
sapteseri.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class SapteSeri(BasicNewsRecipe):
    title = u'Sapte Seri'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Sapte Seri'
    publisher = u'Sapte Seri'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Oras,Distractie,Fun'
    encoding = 'utf-8'
    remove_empty_feeds = True
    remove_javascript = True
    cover_url = 'http://www.sapteseri.ro/Images/logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h1', attrs={'id': 'title'}), dict(name='div', attrs={'class': 'mt10 mb10'}), dict(
            name='div', attrs={'class': 'mb20 mt10'}), dict(name='div', attrs={'class': 'mt5 mb20'})
    ]

    remove_tags = [
        dict(name='div', attrs={'id': ['entityimgworking']})
    ]

    feeds = [
        (u'Ce se intampla azi in Bucuresti',
         u'http://www.sapteseri.ro/ro/feed/ce-se-intampla-azi/bucuresti/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�_)��7x7.png�PNG


IHDR00`�	�PLTE�f=�g=�g<�g=�g=����������g>�jA�����������h>�mE�i@�\�������lD�}����ʼ����������yT����������������qJ����pI�������������t�������vP�b�������^�{��r�xS����i?�������o��o�rK��������kC�������wR����h�ɻ�h?�������t�uO�������f�������f����������`���p�p��������a����f<��������z�yU�}Y����������{W���������vQ�jB�ƶ�������y�����Ĵ�l���������������d���������������pH����~Z����kB�s����sM��������������mD�g<�����}Z�nF�|Y�Ǹ�{V�����nG�a�qI�qJ�tN���ó�oH�f<�f=�����������tRNS��������������������������������������������������������������������������������������������������������������������������������������������������������������������խ�b�IDATx�b``$	0102�X\è�Q
�6��s �x�om�m߭o϶m۶m�N^��\L���%��3٨���y����XjY�R6kkSihؿ<\E:e�r�4d2kN.�/��y'夵�dlV*�p�g��0&�̏��sM�eY3� ϮO��] -Ո�n	����67���\�~�)۟�^��^8�ҧRI��.��?���@8�x0ch�S�DY��yh;��-���	`I3::Y�֌�+W�mu�	ă�uQ��+�[���=�{{��;	�W�rΎ{W7��2�d���Em��Sq?}@t�]�-��&�;�|7e��0��qL<x���c`�	�j��g�[�  *�"�U��7��V�]�>�M���cN�r������#�~���&���=E��)���)�ƨ�Q
�H+��aS�-hIEND�B`�PK�X�/p�  
7x7.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class News(BasicNewsRecipe):
    title = '7x7'
    __author__ = 'bugmen00t'
    description = '7x7 - межрегиональный интернет-журнал'
    publisher = '7x7-journal.ru'
    category = 'news'
    cover_url = u'https://semnasem.org/site-specific/7x7-journal.ru/images/frontend/logo/logo-header.svg'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = True
    auto_cleanup = False

    oldest_article = 14
    max_articles_per_feed = 30

    feeds = [
        ('7x7', 'https://semnasem.org/rss/default.xml'),
    ]

    remove_tags_before = dict(name='article', attrs={'class': 'article'})

    remove_tags_after = dict(name='div', attrs={'class': 'article__footer-wrap'})

    remove_tags = [
        dict(name='div', attrs={'class': 'article__footer-wrap'}),
        dict(name='div', attrs={'class': 'promolink-widget'})
    ]
PK�X�s�WWDrawAndCook.png�PNG


IHDR  D���3PLTE�S$�S$�S$�S$�S$�S$�S$�S$�S$�S$�S$�S$�S$�S$�S$�S$Kls�tRNS 0@P`p��������cUr�IDATx���n�0�1c������A�A���QK�{_ZS�<����;ǒ�t@�\N�*0j��:�,�_�ah�\�g\%�l*��x�(:p���[���x>�5P����bTbϪ�ݸA8��>M���}��c�VTM�U|)�ܙ��1��8�[=��E'�PU���L�L���v�p=��{F���F�x	C�m>�IEND�B`�PK�X��wl�	�	DrawAndCook.recipefrom __future__ import print_function
from calibre.web.feeds.news import BasicNewsRecipe
import re


class DrawAndCook(BasicNewsRecipe):
    title = 'DrawAndCook'
    __author__ = 'Starson17'
    __version__ = 'v1.10'
    __date__ = '13 March 2011'
    description = 'Drawings of recipes!'
    language = 'en'
    publisher = 'Starson17'
    category = 'news, food, recipes'
    use_embedded_content = False
    no_stylesheets = True
    oldest_article = 24
    remove_javascript = True
    remove_empty_feeds = True
    cover_url = 'http://farm5.static.flickr.com/4043/4471139063_4dafced67f_o.jpg'
    INDEX = 'http://www.theydrawandcook.com'
    max_articles_per_feed = 30

    remove_attributes = ['style', 'font']

    def parse_index(self):
        feeds = []
        for title, url in [
            ("They Draw and Cook", "http://www.theydrawandcook.com/")
        ]:
            articles = self.make_links(url)
            if articles:
                feeds.append((title, articles))
        print('feeds are: ', feeds)
        return feeds

    def make_links(self, url):
        soup = self.index_to_soup(url)
        title = ''
        date = ''
        current_articles = []
        soup = self.index_to_soup(url)
        featured_major_slider = soup.find(
            name='div', attrs={'id': 'featured_major_slider'})
        recipes = featured_major_slider.findAll(
            'li', attrs={'data-id': re.compile(r'artwork_entry_\d+', re.DOTALL)})
        for recipe in recipes:
            page_url = self.INDEX + recipe.a['href']
            print('page_url is: ', page_url)
            title = recipe.find('strong').string
            print('title is: ', title)
            current_articles.append(
                {'title': title, 'url': page_url, 'description': '', 'date': date})
        return current_articles

    keep_only_tags = [dict(name='h1', attrs={'id': 'page_title'}), dict(name='section', attrs={'id': 'artwork'})
                      ]

    remove_tags = [dict(name='article', attrs={'id': ['recipe_actions', 'metadata']})
                   ]

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    img {max-width:100%; min-width:100%;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''
PK�X�Jm�BBTheMITPressReader.png�PNG


IHDR  D���VPLTE������������A>?��ļ��*&'������+()������������������������dab���ifg������[XY���zxx������,()������vtu���]Z[�����845���=9:������+'(���TQRhef������nllNKL���-*+������:78���@<=������.*+���VSTjghpnnPMN���0,-������:67���?;<������-)*QMN���DAA���IEF���������_\]rop634�����ɧ�����������������������������������������mkl��������mjkNKK���khiLHI���olm"��<�IDAT8�cd IW���?^̌���*`cd��W'#�Wr�0����?���gy��@��AU���y/�N�*0��x/$���* ��O@Xx�1>����,E����KF�J�QD����f����Y@%��e*(`a��_㼏x3/��iD�n��J!�`�IEND�B`�PK�X�<\*XXTheMITPressReader.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class TheMITPressReader(BasicNewsRecipe):
    title = "The MIT Press Reader"
    __author__ = 'yodha8'
    language = 'en'
    description = ("Thought-provoking excerpts, interviews and essays backed by academic rigor written by MIT Press authors."
                   " This recipe pulls articles from the past 7 days.")
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('The MIT Press Reader', 'https://thereader.mitpress.mit.edu/feed/'),
    ]
PK�X
��a!!aabenraalokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X��dUmmaabenraalokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Aabenraa
'''


class AabenraaLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Aabenraa'
    description = 'Lokale og regionale nyheder, sport, kultur fra Aabenraa og omegn på aabenraa.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Aabenraa', 'http://aabenraa.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Aabenraa', 'http://aabenraa.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Aabenraa', 'http://aabenraa.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Aabenraa', 'http://aabenraa.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Aabenraa', 'http://aabenraa.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Aabenraa', 'http://aabenraa.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X
��a!!aarhuslokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�Xćf[\\aarhuslokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Aarhus
'''


class AarhusLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Aarhus'
    description = 'Lokale og regionale nyheder, sport og kultur fra Aarhus Midt, Nord, Vest og Syd på aarhus.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Aarhus', 'http://aarhus.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Aarhus', 'http://aarhus.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Aarhus', 'http://aarhus.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Aarhus', 'http://aarhus.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Aarhus', 'http://aarhus.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Aarhus', 'http://aarhus.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X
��a!!aarhusmidtlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X��=���aarhusmidtlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Aarhus Midt
'''


class AarhusmidtLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Aarhus Midt'
    description = 'Lokale og regionale nyheder, sport og kultur fra Aarhus Midt på aarhusmidt.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Aarhus Midt', 'http://aarhusmidt.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Aarhus Midt', 'http://aarhusmidt.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Aarhus Midt', 'http://aarhusmidt.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Aarhus Midt', 'http://aarhusmidt.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Aarhus Midt', 'http://aarhusmidt.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Aarhus Midt', 'http://aarhusmidt.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X
��a!!aarhusnordlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X���N��aarhusnordlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Aarhus Nord
'''


class AarhusnordLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Aarhus Nord'
    description = 'Lokale og regionale nyheder, sport og kultur fra Aarhus Nord på aarhusnord.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Aarhus Nord', 'http://aarhusnord.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Aarhus Nord', 'http://aarhusnord.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Aarhus Nord', 'http://aarhusnord.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Aarhus Nord', 'http://aarhusnord.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Aarhus Nord', 'http://aarhusnord.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Aarhus Nord', 'http://aarhusnord.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X
��a!!aarhussydlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X��T���aarhussydlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Aarhus Syd
'''


class AarhussydLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Aarhus Syd'
    description = 'Lokale og regionale nyheder, sport og kultur fra Aarhus Syd på aarhussyd.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Aarhus Syd', 'http://aarhussyd.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Aarhus Syd', 'http://aarhussyd.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Aarhus Syd', 'http://aarhussyd.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Aarhus Syd', 'http://aarhussyd.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Aarhus Syd', 'http://aarhussyd.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Aarhus Syd', 'http://aarhussyd.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X
��a!!aarhusvestlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�Xu�wY��aarhusvestlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Aarhus Ves
'''


class AarhusvestLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Aarhus Ves'
    description = 'Lokale og regionale nyheder, sport og kultur fra Aarhus Vest på aarhusvest.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Aarhus Vest', 'http://aarhusvest.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Aarhus Vest', 'http://aarhusvest.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Aarhus Vest', 'http://aarhusvest.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Aarhus Vest', 'http://aarhusvest.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Aarhus Vest', 'http://aarhusvest.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Aarhus Vest', 'http://aarhusvest.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X���%%abc.png�PNG


IHDR(-S#PLTE��ə��������������@|)c�1m���D��-c����$<x ?o!"`�#q�=w$V�I�c�.0a�19[2}�8��:[sV�G==Hk�IYfJn�J��Kd}NTpOM^T��V��XQPYYh`_af~���� W-b���U�6CVd������������Ez(b+y����Q�#r�;��=g���ń��xx{���
^�(n�kggkt�l��mo{F)Dl*Bj_�U��� 6������nllpos�����������ݕ������� tRNS@��f�IDAT�B��[&`v�bwww�_��K���Q��'	���.H�ۢ�4�lAX
.��0�50��
�L�ި���
P	����r�X�s{
»���_�)=M'�;������m�^�g{͋��3q��r��:��Q�C{�2L��� ���q�g��W����&���.������IEND�B`�PK�X����**
abc.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class ABCRecipe(BasicNewsRecipe):
    title = u'ABC Linuxu'
    oldest_article = 5
    max_articles_per_feed = 3  # 5
    __author__ = 'Funthomas'
    language = 'cs'

    feeds = [
        # (u'Blogy', u'http://www.abclinuxu.cz/auto/blogDigest.rss'),
        (u'Články', u'http://www.abclinuxu.cz/auto/abc.rss'),
        (u'Zprávičky', 'http://www.abclinuxu.cz/auto/zpravicky.rss')
    ]

    remove_javascript = True
    no_stylesheets = True
    remove_attributes = ['width', 'height']

    remove_tags_before = dict(name='h1')
    remove_tags = [
        dict(attrs={'class': ['meta-vypis', 'page_tools', 'cl_perex']}),
        dict(attrs={'class': ['cl_nadpis-link', 'komix-nav']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['cl_perex', 'komix-nav']}),
        dict(attrs={'class': ['meta-vypis', 'page_tools']}),
        dict(name='', attrs={'': ''}),
    ]

    preprocess_regexps = [
        (re.compile(r'</div>.*<p class="perex">', re.DOTALL),
         lambda match: '</div><p class="perex">')
    ]

    def print_version(self, url):
        return url + '?varianta=print&noDiz'

    extra_css = '''
            h1 {font-size:130%; font-weight:bold}
            h3 {font-size:111%; font-weight:bold}
        '''
PK�XafI���
abc_au.png�PNG


IHDR  D����PLTE�ɣF8tRNS�y���u?���rokaMG盒�E��|:��Ø�he]/Q3)�ܬ��VVHF��
�IDATx�b@%Y k�0�eff�}L���6n~��7��r����3N��i~)N5�k��H���Pm�B��O�����P|s?�8x	�ZF�H�ZZ��L�(f�����|ᢖ��8�‚<Gg
h^�Z���N�?
���,!dTے"I+�
�� j�H7K���������}PQ�٢]tȮ#��� �&W�_f$I�?^1�[l.7);�k�`��
�?K�-�8Ꮽ�+�Oü��9bu�h�xކ���=EhIB��/jp�3�{0����I�ڎ+g���5�:�W[��&�XE�=5p�:���jJK@��|�w_D�W$�4#�Ǻ=����]�J>D�_C��+�
X�I\Z�#�T�?������bjX����
�r���C��U�cj��X��1����W��s�UIEND�B`�PK�X�x�~~
abc_au.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function

__license__ = 'GPL v3'
__copyright__ = '2020, Pat Stapleton <pat.stapleton at gmail.com>'
'''
Recipe for ABC News Australia (online)
'''
from calibre.web.feeds.news import BasicNewsRecipe


class ABCNews(BasicNewsRecipe):
    title          = 'ABC News'
    language       = 'en_AU'
    __author__     = 'Pat Stapleton'
    description = 'From the Australian Broadcasting Corporation. The ABC is owned and funded by the Australian Government, but is editorially independent.'
    masthead_url = 'https://www.abc.net.au/cm/lb/8212706/data/news-logo-2017---desktop-print-data.png'
    cover_url = 'https://www.abc.net.au/news/linkableblob/8413676/data/abc-news-og-data.jpg'
    cover_margins = (0,20,'#000000')
    scale_news_images_to_device = True
    oldest_article = 2  # days
    simultaneous_downloads = 10
    max_articles_per_feed = 100
    publication_type = 'newspaper'

#    auto_cleanup   = True # enable this as a backup option if recipe stops working

#    use_embedded_content = False # if set to true will assume that all the article content is within the feed (i.e. won't try to fetch more data)

    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = [dict(id='content')]  # the article content is contained in <main id="content" /> tag

    # ************************************
    # Regular expressions for remove_tags:
    # ************************************
    # remove aside tag - used for overlapping boxes within article
    # aside_reg_exp = '^.*aside.*$'

    # ************************************
    # Clear out all the unwanted html tags:
    # ************************************
    remove_tags = [
#        dict(name='aside', attrs={'name': re.compile(aside_reg_exp, re.IGNORECASE)})
        {
            'name': ['meta', 'link', 'noscript', 'aside']
        },
        {
            'attrs': {
                'data-component': ['Ticker', 'PublishedDate', 'Timestamp', 'Link', 'ShareLink', 'ShareUtility',
                'RelatedStories', 'ArticleTopStories', 'ArticleTopStoriesCard', 'ArticleJustInStories',
                'RelatedTopics', 'Player', 'ArticleSidebar', 'TopStoriesSidebar', 'UtilityBar']
            }
        }
    ]

    # ************************************
    # Tidy up the output to look neat for reading
    # ************************************
    remove_attributes = ['width', 'height', 'style']
    extra_css = '.byline{font-size:smaller;margin-bottom:10px;}.inline-caption{display:block;font-size:smaller;text-decoration: none;}'

    # ************************************
    # Fix images (dynamically generated by ABC news)
    # ************************************
    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            for x in img['data-src'].split():
                if '/' in x:
                    img['src'] = x
        return soup
    compress_news_images = True

    feeds          = [
        ('Top Stories', 'https://www.abc.net.au/news/feed/45910/rss.xml'),
        ('Politics', 'https://www.abc.net.au/news/feed/1534/rss.xml'),
        ('World', 'https://www.abc.net.au/news/feed/4405318/rss.xml'),
        ('Business', 'https://www.abc.net.au/news/feed/51892/rss.xml'),
        ('Analysis', 'https://www.abc.net.au/news/feed/7571268/rss.xml'),
        ('Sport', 'https://www.abc.net.au/news/feed/2942460/rss.xml'),
        ('Science', 'https://www.abc.net.au/news/feed/8132426/rss.xml'),
        ('Health', 'https://www.abc.net.au/news/feed/9167762/rss.xml'),
        ('Arts and Entertainment', 'https://www.abc.net.au/news/feed/472/rss.xml'),
        ('Fact Check', 'https://www.abc.net.au/news/feed/5306468/rss.xml'),
#        ('Adelaide', 'https://www.abc.net.au/news/feed/8057540/rss.xml'), #enable by removing # at start of line
#        ('Brisbane', 'https://www.abc.net.au/news/feed/8053540/rss.xml'), #enable by removing # at start of line
#        ('Canberra', 'https://www.abc.net.au/news/feed/8057234/rss.xml'), #enable by removing # at start of line
#        ('Darwin', 'https://www.abc.net.au/news/feed/8057648/rss.xml'), #enable by removing # at start of line
#        ('Hobart', 'https://www.abc.net.au/news/feed/8054562/rss.xml'), #enable by removing # at start of line
#        ('Melbourne', 'https://www.abc.net.au/news/feed/8057136/rss.xml'), #enable by removing # at start of line
#        ('Perth', 'https://www.abc.net.au/news/feed/8057096/rss.xml'), #enable by removing # at start of line
#        ('Sydney', 'https://www.abc.net.au/news/feed/8055316/rss.xml'), #enable by removing # at start of line
    ]
PK�X��Y���
abc_es.png�PNG


IHDR���R0PLTED_6WpIg}Ws�n����������������ú��������������$
WIDATc �b�6S�i&�y�
�:�l��20�^`�(�𙁁�ۑ�
_v�d��a5����|]׻X�3�|��w�IEND�B`�PK�X����	�	
abc_es.recipe__license__ = 'GPL v3'
__author__ = 'Ricardo Jurado'
__copyright__ = 'Ricardo Jurado'
__version__ = 'v0.4'
__date__ = '11 February 2011'

'''
http://www.abc.es/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1296604369(BasicNewsRecipe):

    title = u'ABC.es'
    masthead_url = 'http://www.abc.es/img/logo-abc.gif'
    cover_url = 'http://www.abc.es/img/logo-abc.gif'
    publisher = u'Grupo VOCENTO'

    __author__ = 'Ricardo Jurado'
    description = 'Noticias de Spain y el mundo'
    category = 'News,Spain,National,International,Economy'
    oldest_article = 2
    max_articles_per_feed = 10

    no_stylesheets = True
    use_embedded_content = False
    encoding = 'ISO-8859-1'
    auto_cleanup = True
    remove_javascript = True
    language = 'es'

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h3{font-family: sans-serif; font-size:120%; font-weight:bold; text-align: justify; }
                               h2{font-family: sans-serif; font-size:100%; font-weight:bold; text-align: justify; }
                               h1{font-family: sans-serif; font-size:150%; font-weight:bold; text-align: justify; }
                                 """

    feeds = [

    (u'PORTADA', u'http://www.abc.es/rss/feeds/abcPortada.xml'),
    (u'ULTIMAS', u'http://www.abc.es/rss/feeds/abc_ultima.xml'),
    (u'NACIONAL', u'http://www.abc.es/rss/feeds/abc_EspanaEspana.xml'),
    (u'INTERNACIONAL', u'http://www.abc.es/rss/feeds/abc_Internacional.xml'),
    (u'OPINION', u'http://www.abc.es/rss/feeds/abc_opinioncompleto.xml'),
    (u'BLOGS ABC', u'http://www.abc.es/rss/feeds/blogs-abc.xml'),
    (u'ECONOMIA', u'http://www.abc.es/rss/feeds/abc_Economia.xml'),
    (u'CIENCIA Y TECNOLOGIA', u'http://www.abc.es/rss/feeds/abc_Ciencia_Tecnologia.xml'),
    (u'CULTURA', u'http://www.abc.es/rss/feeds/abc_Cultura.xml'),
    (u'LIBROS', u'http://www.abc.es/rss/feeds/abc_Libros.xml'),
    (u'MEDIOS Y REDES', u'http://www.abc.es/rss/feeds/ABC_Medios_Redes.xml'),
    (u'EVASION', u'http://www.abc.es/rss/feeds/abc_evasion.xml'),
    (u'ESPECTACULOS', u'http://www.abc.es/rss/feeds/abc_Espectaculos.xml'),
    (u'GENTE', u'http://www.abc.es/rss/feeds/abc_Gente.xml'),
    (u'DEPORTES', u'http://www.abc.es/rss/feeds/abc_Deportes.xml')
    ]
PK�X�����
abc_py.png�PNG


IHDR00W���IDATx^�m��E�g����۷[�Z�[�T
�"��"�5�Hb����&���1Q,/A
�	D"4��D�BD�C/�����}��g��8�ó��M�Ӥ'��3sf����ٌԟ�i��HYLm�f6�hB�i[W��K��6�Z���<E���~�((E`��
`D�Y��G��.t�q�œ�ۚ�*#5Ҫ��DœV�wHC"���@j)�l��F�V���"�G�#!qp��s`�<�R�6� �t�׀��K����k#��
(����Ë�2�X,�1�R&�����P��h"�&L��&B"��4ĴO K���-/%k���53���ՂژR�1q��oi�9��@��6BmE_ �tV���h�S��*V*	p�}>��P1��R���tG�LL:�J���Y�'n�!���Վ}2$�d4E����$LJ>uC̩�i<I@�I�'�IN|����"!���H���H�w��(�(IFDMF`d�"��V��7��H�����i�䡠栘%�g
JaG g��?1�K,K�JN-+\�4�p�(��4 ���J�+ր	��39A��HIGQ�AIH(�(�#�P��7�@���dM��h,f��u��I��:5	���<DHQAcL罳�4��V�8x�1rm�a����
��N�]��c��S�PP��>�ƃ{�V�2�y�Տ.e~�a�4��M���K�U+���?�$�fѝuz>���I��A\wG�rV���ʫ��)��I�i��{�2v�6�I�
�~�e���譯�hR�ݛ��k�qѓ,��t���/��.b�{�ٰ�|B�q4����y�+�EG�~�H��q�%�����1Ws��KL�'[���jF�Sdz�af�g�e4*Y|^��Й�}�@�0�u�Ƅ2�y/��+a�e���y�KrI���7)d��w�7�w�ކ*������>�o|u%��O���dDH+�����R��s<�J�|9��
�jjqt,�Vu,?��Yk�9{�~d�g��.�����$֝��/�9�`t,p�/w��_�xa��oʧX��¹��ĥG5���mw���O���u&�r������U�\���
}M��#�!���rġ�CS����>G�-Z��s�_Pf�^�������w�[�i��q�ov�vv�~�ceO1J�����7���\y:?�a�C��.ff&g��	dg��e�='d�pU�&2n�u��g��gY�-�6�r6���9�{Y��'���3�?�,�6������ȇ���w/a���z<�j�c
<�Ծ��{��`F�u�_���==3�Wne||�vSU�V[��xˏ��ҏ�@�ŋ\�iK̷��03��h4X����~w�]a���"�yq5�f�ٙŹ��9�M�U�8}���>C��ʮ]3�B�P������)+p`����p�	��if�!���Q�T#)Z`�@N�V^�����/���?I!R�iX��}<�����V
ks�5�pͦ!i�*�9뗑灧�y���#_��)�~Nj1w҉}\t�`<GFg~a�Jų���[G((�/�A��w���v��H(��b����6]��c��͊wA�~��z=��e7�Z�B�5���6�{��*������^�׿���	���a|�J���P�w�u<��ֿsw��
�Z�^x�����E��TQ���N}=o]"��}�������12R�C��5֞���l<�??����IVx��Ws�}/#@���f��Ж=<��.��6M}.��,?x�
.��q�y�6���1�g�z=�e00�9��^�x��_��
R�v���̷r�03�1&� ��ž&��LM70m�!Q
�ts�1����j�H�{������S�&+a�@�V>�y��ٔ�n؜s�'�B��vըP�<��t⽋�b!�j0��BPm��P�σ@��)ir��;4U<�c�R
)��J2�Z�S"jk���e�
m2�@�2e~�u�?P�L�V�镾���+Hѹ�r��$3y�II^�/D�!�gf�m3�+�	hqnj*B��D7�؊0����K�Ń3�쫵-g���{��q����E�!��.y���=�R�R�?t�݉Hǎ�������� I���IQ�ݟ!�?�9d@��w�����scs��A8�G!p�����Ý����?�PPk�<�IEND�B`�PK�Xg��	��
abc_py.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
abc.com.py
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ABC_py(BasicNewsRecipe):
    title = 'ABC Color'
    __author__ = 'Darko Miletic'
    description = 'Noticias de Paraguay y el resto del mundo'
    publisher = 'ABC'
    category = 'news, politics, Paraguay'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'es_PY'
    remove_empty_feeds = True
    masthead_url = 'http://www.abc.com.py/plantillas/img/abc-logo.png'
    publication_type = 'newspaper'
    extra_css             = """
                               body{font-family: UnitSlabProMedium,"Times New Roman",serif }
                               img{margin-bottom: 0.4em; display: block;}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['form', 'iframe', 'embed',
                   'object', 'link', 'base', 'table']),
        dict(attrs={'class': ['es-carousel-wrapper']}),
        dict(attrs={'id': ['tools', 'article-banner-1']})
    ]
    keep_only_tags = [dict(attrs={'id': 'article'})]

    feeds = [

    (u'Ultimo momento', u'http://www.abc.com.py/rss.xml'),
    (u'Nacionales', u'http://www.abc.com.py/nacionales/rss.xml'),
    (u'Mundo', u'http://www.abc.com.py/internacionales/rss.xml'),
    (u'Deportes', u'http://www.abc.com.py/deportes/rss.xml'),
    (u'Espectaculos', u'http://www.abc.com.py/espectaculos/rss.xml'),
    (u'TecnoCiencia', u'http://www.abc.com.py/ciencia/rss.xml')
    ]
PK�X<~��acrimed.png�PNG


IHDR��h6�IDATxڍ�odBQ��`�A2���@}��;@���l�� H($J$EZ�"I
6AI�DDR���u������=�y��}�W(�J�z}8.�˷,!���z��`0��^t�]����R�T�ӡk2�T�U~����t:�L���o�x<^�T^^_��l���n�{�X�I)���!`��N����&GH��z��b����I�ղ���`��~\^]�*�����
B���~���j)�hI�L&H�B�Z��^�	!<��f�vEt!��kŊ�v�����.�$�r�,|>���!KX��x�R��z��`��v�b�HE��h�V� �t:Q�F�F���x<�h����J����껻{�6a���p`B8n4`�ѰZ����$�;�N�2���3�;���C��
$B�..ι�G4a�I��君#I���'t����U�P&��>W�%<�IEND�B`�PK�X)l0{acrimed.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2012'
'''
acrimed.org
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Acrimed(BasicNewsRecipe):
    title = u'Acrimed'
    __author__ = 'Gaëtan Lehmann'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup = True
    auto_cleanup_keep = '//div[@class="crayon article-chapo-4112 chapo"]'
    language = 'fr'
    masthead_url = 'http://www.acrimed.org/IMG/siteon0.gif'
    feeds = [(u'Acrimed', u'http://www.acrimed.org/spip.php?page=backend')]

    preprocess_regexps = [
        (re.compile(r'<title>(.*) - Acrimed \| Action Critique M.*dias</title>'),
         lambda m: '<title>' + m.group(1) + '</title>'),
        (re.compile(r'<h2>(.*) - Acrimed \| Action Critique M.*dias</h2>'), lambda m: '<h2>' + m.group(1) + '</h2>')]

    extra_css              = """
                                .chapo{font-style:italic; margin: 1em 0 0.5em}
                            """
PK�X]Y�a44ad.png�PNG


IHDR(-SiPLTE����!�������W1�q���=��ѐ�qQ���ϑ�Qq�ݱ����q��q� ��������������1X���,�Q�R���������1p'1n��IDATx^���u�PD�3�.����"����=��<��f�����j�d���M���
��,�$�,���L���ej�(6��<����
$eI�īq����	<HY+��K�[��Տ�v�@˨���kL$�IEND�B`�PK�X�,##	ad.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class ADRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'nl'
    country = 'NL'
    version = 1

    title = u'AD'
    publisher = u'de Persgroep Publishing Nederland NV'
    category = u'News, Sports, the Netherlands'
    description = u'News and Sports from the Netherlands'

    oldest_article = 1.2
    max_articles_per_feed = 100
    use_embedded_content = False

    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = []
    keep_only_tags.append(dict(name='div', attrs={'id': 'art_box2'}))
    keep_only_tags.append(dict(name='p', attrs={'class': 'gen_footnote3'}))

    remove_tags = []
    remove_tags.append(dict(name='div', attrs={'class': 'gen_clear'}))
    remove_tags.append(
        dict(name='div', attrs={'class': re.compile(r'gen_spacer.*')}))

    remove_attributes = ['style']

    # feeds from
    # http://ad.nl/ad/nl/1401/home/integration/nmc/frameset/ad_footer/rssFeeds.dhtml
    feeds = []
    feeds.append(
        (u'Binnenland', u'http://www.ad.nl/nieuws/binnenland/rss.xml'))
    feeds.append(
        (u'Buitenland', u'http://www.ad.nl/nieuws/buitenland/rss.xml'))
    feeds.append((u'Bizar', u'http://www.ad.nl/nieuws/bizar/rss.xml'))
    feeds.append((u'Gezondheid & Wetenschap',
                  u'http://www.ad.nl/nieuws/gezondheidwetenschap/rss.xml'))
    feeds.append((u'Economie', u'http://www.ad.nl/nieuws/economie/rss.xml'))
    feeds.append((u'Nederlands Voetbal',
                  u'http://www.ad.nl/sportwereld/nederlandsvoetbal/rss.xml'))
    feeds.append((u'Buitenlands Voetbal',
                  u'http://www.ad.nl/sportwereld/buitenlandsvoetbal/rss.xml'))
    feeds.append((u'Champions League/Europa League',
                  u'http://www.ad.nl/sportwereld/championsleagueeuropaleague/rss.xml'))
    feeds.append(
        (u'Wielrennen', u'http://www.ad.nl/sportwereld/wielrennen/rss.xml'))
    feeds.append((u'Tennis', u'http://www.ad.nl/sportwereld/tennis/rss.xml'))
    feeds.append(
        (u'Formule 1', u'http://www.ad.nl/sportwereld/formule1/rss.xml'))
    feeds.append(
        (u'Meer Sport', u'http://www.ad.nl/sportwereld/meersport/rss.xml'))
    feeds.append((u'Celebs', u'http://www.ad.nl/showbizz/celebs/rss.xml'))
    feeds.append((u'Film', u'http://www.ad.nl/showbizz/film/rss.xml'))
    feeds.append((u'Muziek', u'http://www.ad.nl/showbizz/muziek/rss.xml'))
    feeds.append((u'TV', u'http://www.ad.nl/showbizz/tv/rss.xml'))
    feeds.append((u'Kunst & Literatuur',
                  u'http://www.ad.nl/showbizz/kunstenliteratuur/rss.xml'))
    feeds.append((u'Jouw Wereld', u'http://www.ad.nl/you/rss.xml'))
    feeds.append((u'Consument', u'http://www.ad.nl/consument/rss.xml'))
    feeds.append((u'Autowereld', u'http://www.ad.nl/autowereld/rss.xml'))
    feeds.append((u'Reiswereld', u'http://www.ad.nl/reiswereld/rss.xml'))
    feeds.append((u'Internet', u'http://www.ad.nl/digitaal/internet/rss.xml'))
    feeds.append((u'Games', u'http://www.ad.nl/digitaal/games/rss.xml'))
    feeds.append(
        (u'Multimedia', u'http://www.ad.nl/digitaal/multimedia/rss.xml'))
    feeds.append((u'Planet Watch', u'http://www.ad.nl/planetwatch/rss.xml'))

    extra_css = '''
                body {font-family: verdana, arial, helvetica, geneva, sans-serif;}
                div.captionEmbeddedMasterObject {font-size: x-small; font-style: italic; color: #696969;}
                .gen_footnote3 {font-size: small; color: #666666; margin-top: 0.6em;}
                '''

    conversion_options = {'comments': description, 'tags': category, 'language': 'en',
                          'publisher': publisher}

    def print_version(self, url):
        parts = url.split('/')
        print_url = 'http://' + parts[2] + '/' + parts[3] + '/' + parts[4] + '/' + parts[5] + '/' \
            + parts[10] + '/' + parts[7] + '/print/' + \
            parts[8] + '/' + parts[9] + '/' + parts[13]

        return print_url

    def preprocess_html(self, soup):
        for br in soup.findAll('br'):
            prev = br.findPreviousSibling(True)
            if hasattr(prev, 'name') and prev.name == 'br':
                next = br.findNextSibling(True)
                if hasattr(next, 'name') and next.name == 'br':
                    br.extract()

        return soup
PK�X�)�adevarul.png�PNG


IHDR��h6�IDATx�c�O"�������' ��@��t�ҏ���^����_�654�&'$޽s����:5)�ĉ߾}CS��ŋ��g�YYs�s���=r��߿Ϙ6���(T[U�}۶�o޼}�����HO������x��U��F�4ĕ=]�@=ŅE��z�|��R奥�_��J@�V�X���%!"*%&4������%�o^��v�̙
��߿w�����#i f���ۃ��IEND�B`�PK�X3�9��adevarul.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
adevarul.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Adevarul(BasicNewsRecipe):
    title = u'Adev\u0103rul'
    language = 'ro'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'\u0218tiri din Rom\u00e2nia'
    publisher = 'Adevarul'
    category = 'Ziare,Stiri,Romania'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True
    cover_url = 'http://upload.wikimedia.org/wikipedia/en/d/d6/Logo_noul_adevarul.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [dict(name='div', attrs={'class': 'article_header'}), dict(name='div', attrs={'class': 'bb-tu first-t bb-article-body'})
                      ]

    remove_tags = [
        dict(name='li', attrs={'class': 'author'}), dict(name='li', attrs={'class': 'date'}), dict(name='li', attrs={'class': 'comments'}), dict(name='div', attrs={'class': 'bb-wg-article_related_attachements'}), dict(name='div', attrs={'class': 'bb-md bb-md-article_comments'}), dict(name='form', attrs={'id': 'bb-comment-create-form'}), dict(name='div', attrs={'id': 'mediatag'}), dict(name='div', attrs={'id': 'ft'}), dict(name='div', attrs={'id': 'comment_wrapper'})  # noqa
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': 'comment_wrapper'}),
    ]

    feeds = [(u'\u0218tiri', u'http://www.adevarul.ro/rss/latest')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X���k
adnkronos.png�PNG


IHDR. Zm�u�PLTE�������������zv������������������������]W�ZU�hc�\U����������������������NI����������`[����WS�~{�������yv�������qm����������|x�������|x�yv�yu��d`�}z�nj�XS�mi�xt�|x�{x�~�ro�lh�nj�NJ�uq�`\�}�fa�_Z�tp�MH��^Z���_[�TO�E@�KF�_[�NJ�MH�SN�QL�TO�VQ�QK�QL�RM�PK�UP�MH�:5�D@�C>�94�HB�GB�GB�A;�A;�B=�GB�@;�GB�<6�:4�;5�B=�=7�71�95�61�5/�71�5/�1+�.(�& �,&�1+�-'�("�.(�(!�)#�&!�("�)#� �"�#�$�& �'!�("��*$�#�!�"�!�!�%� �#�'"�(!��!�)$�%����&�+%�0)���tRNS	 "#%.5679:;;<BEFIIIRRXZ]^fgipqqqrsz{~���������������������������������������������������������������#4��gIDATxڥʃz�Dὶm��m۶mwc����L�>�g~8/��>����ʝ�J�ݕ"ٮ��!�ko�<�F��@��,��5�#���������z��E��g�I}!�D7W��$�%��_H���B7�� R?mА�f��hHp��1�}�)��C�I��w	�E��N��\�D��8KiOA��(�q�<����N}���ø��p��MpD6�;&�š���v���5=�ӗ
$�^r��]"�q���}T8��}����	<�#[�d��x�L���qI��9( �$-8V��+$0
��DM;����¤+>>;���pݯ �YN�+��p��	�k
ށ�z��C�IEND�B`�PK�X�jj�IIadnkronos.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gabriele Marini, based on Darko Miletic'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
description = 'Italian daily newspaper - 02-05-2010'

'''
http://www.adnkronos.com/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Adnkronos(BasicNewsRecipe):
    __author__ = 'Gabriele Marini'
    description = 'News agency'
    cover_url = 'http://www.adnkronos.com/IGN6/img/popup_ign.jpg'
    title = u'Adnkronos'
    publisher = 'Adnkronos Group - ews agency'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 7
    max_articles_per_feed = 80
    use_embedded_content = False
    recursion = 10

    remove_javascript = True

    def get_article_url(self, article):
        link = article.get('id', article.get('guid', None))
        return link

    extra_css = ' .newsAbstract{font-style: italic} '
    keep_only_tags = [dict(name='div', attrs={'class': ['breadCrumbs', 'newsTop', 'newsText']})
                      ]

    remove_tags = [
        dict(name='div', attrs={'class': ['leogoo', 'leogoo2']})
    ]

    feeds = [
        (u'Prima Pagina', u'http://rss.adnkronos.com/RSS_PrimaPagina.xml'),
        (u'Ultima Ora', u'http://rss.adnkronos.com/RSS_Ultimora.xml'),
        (u'Politica', u'http://rss.adnkronos.com/RSS_Politica.xml'),
        (u'Esteri', u'http://rss.adnkronos.com/RSS_Esteri.xml'),
        (u'Cronoca', u'http://rss.adnkronos.com/RSS_Cronaca.xml'),
        (u'Economia', u'http://rss.adnkronos.com/RSS_Economia.xml'),
        (u'Finanza', u'http://rss.adnkronos.com/RSS_Finanza.xml'),
        (u'CyberNews', u'http://rss.adnkronos.com/RSS_CyberNews.xml'),
        (u'Spettacolo', u'http://rss.adnkronos.com/RSS_Spettacolo.xml'),
        (u'Cultura', u'http://rss.adnkronos.com/RSS_Cultura.xml'),
        (u'Sport', u'http://rss.adnkronos.com/RSS_Sport.xml'),
        (u'Sostenibilita', u'http://rss.adnkronos.com/RSS_Sostenibilita.xml'),
        (u'Salute', u'http://rss.adnkronos.com/RSS_Salute.xml')
    ]
PK�X?6��++adventuregamers.png�PNG


IHDR(-S]PLTE��$3
!.	,	'��^�0�
�X�J�g$�p#�w)>X"5L&6�g�{#$"1
!/
/C*;;T
�����IDATx^m�W
�PU_w-����:1VB$�д�q.�H����c��6����d�R55���s��UV��0xE!6�.7�wTv��Kqe)�Z�x}C�[o�f�]���z�GI:��w$�0���O~9�(r
�|�IEND�B`�PK�X��/%%adventuregamers.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.adventuregamers.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AdventureGamers(BasicNewsRecipe):
    title = u'Adventure Gamers'
    language = 'en'
    __author__ = 'Darko Miletic'
    description = 'Adventure games portal'
    publisher = 'Adventure Gamers'
    category = 'news, games, adventure, technology'
    oldest_article = 10
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf8'
    remove_javascript = True
    use_embedded_content = False
    INDEX = u'http://www.adventuregamers.com'
    extra_css             = """
                                .pageheader_type{font-size: x-large; font-weight: bold; color: #828D74}
                                .pageheader_title,.page_title{font-size: xx-large; color: #394128}
                                .pageheader_byline{font-size: small; font-weight: bold; color: #394128}
                                .score_bg {display: inline; width: 100%; margin-bottom: 2em}
                                .score_column_1{ padding-left: 10px; font-size: small; width: 50%}
                                .score_column_2{ padding-left: 10px; font-size: small; width: 50%}
                                .score_column_3{ padding-left: 10px; font-size: small; width: 50%}
                                .score_header{font-size: large; color: #50544A}
                                img{margin-bottom: 1em;}
                                body{font-family: 'Open Sans',Helvetica,Arial,sans-serif}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [dict(name='div', attrs={'class': 'cleft_inn'})]
    remove_tags = [
        dict(name=['object', 'link', 'embed', 'form', 'iframe', 'meta']), dict(name='a', attrs={
            'href': 'http://www.adventuregamers.com/about/scoring'}), dict(name='a', attrs={'href': 'http://www.adventuregamers.com/about/policies'})
    ]
    remove_tags_after = [dict(name='div', attrs={'class': 'bodytext'})]
    remove_attributes = ['width', 'height']

    feeds = [(u'Articles', u'http://www.adventuregamers.com/rss/')]

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        if '/videos/' in url or '/hypeometer/' in url:
            return None
        return url

    def append_page(self, soup, appendtag, position):
        pager = soup.find('div', attrs={'class': 'pagination_big'})
        if pager:
            nextpage = soup.find('a', attrs={'class': 'next-page'})
            if nextpage:
                nexturl = nextpage['href']
                soup2 = self.index_to_soup(nexturl)
                texttag = soup2.find('div', attrs={'class': 'bodytext'})
                for it in texttag.findAll(style=True):
                    del it['style']
                newpos = len(texttag.contents)
                self.append_page(soup2, texttag, newpos)
                texttag.extract()
                pager.extract()
                appendtag.insert(position, texttag)

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll('div', attrs={'class': 'floatright'}):
            item.extract()
        self.append_page(soup, soup.body, 3)
        pager = soup.find('div', attrs={'class': 'pagination_big'})
        if pager:
            pager.extract()
        return self.adeify_images(soup)
PK�X*=$��afr.png�PNG


IHDR(-SBPLTE����i��Z�������6����	���L�ޢ��F���� ��-�ظ�������T�߃��Q)UIDAT���]� �n�l���Uށ��K�ؓ#���t^}���#4R�!e�@r�چô@��w�J�'�I|�q.
&����_IEND�B`�PK�X����XX
afr.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile


class afr(BasicNewsRecipe):
    title = 'Australian Financial Review'
    __author__ = 'unkn0wn'
    description = (
        'For more than 65 years The Australian Financial Review has been the authority on business,'
        ' finance and investment news in Australia. It has a reputation for independent, award-winning '
        'journalism and is essential reading for Australia\'s business and investor community.'
    )
    masthead_url = 'https://www.nineforbrands.com.au/wp-content/uploads/2020/08/AFR-DHOSP-Logo-black-RGB.png'
    encoding = 'utf-8'
    language = 'en_AU'

    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 25
    no_stylesheets = True
    remove_empty_feeds = True
    remove_attributes = ['style', 'height', 'width']

    keep_only_tags = [
        dict(name=['article', 'main'], attrs={'id':'content'})
    ]

    remove_tags = [
        dict(attrs={'data-testid': [
                'ArticleTools', 'ArticleBreadcrumb-Links', 'ad-wrapper', 'ArticleFooter', 'ArticleTags',
                'beyondwords-player-wrapper'
        ]}),
        dict(name=['button', 'aside', 'svg']),
    ]

    remove_tags_after= [ dict(name='aside', attrs={'id':'stickyContainer'})]

    extra_css = '''
        #img-cap {font-size:small; text-align:center;}
        [data-testid="AuthorNames"], [data-testid="ArticleTimestamp"] {font-size:small;}
    '''

    ignore_duplicate_articles = {'title'}
    resolve_internal_links  = True
    remove_empty_feeds = True

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/', 'podcast-'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        for fig in soup.findAll('figcaption'):
            fig['id'] = 'img-cap'
        return soup

    feeds = []

    sections = [
        'companies', 'market', 'politics', 'policy', 'world', 'wealth', 'street-talk',
        'chaticleer', 'rear-window', 'life-and-luxury', 'technology', 'property',
        'work-and-careers',
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:https%3A%2F%2Fwww.afr.com{}&hl=en-AU&gl=AU&ceid=AU:en'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    feeds.append(('Others', a.format('')))
PK�X��D>>aftonbladet.png�PNG


IHDR  szz�IDATx���ck�s�ڶm۶m۶m۶m۶m�ٜM�4�i����S|_�)8Կ�L�tA�UT�'��=U��&�\F� . ��$��ۜYu�#���g��(0l�@@|��o��l{���U�)���l����n2	]=�"�t�
$K�p���=3ӭ����i�st�����Ǹ��M	�zD	\���#}�K_��#�I���Z `���nܲ�9�����
�$B!���)�8q�I7,��)�����z|S�T�BV��n�X�=�Ae�!�k��m�JX�t�J�����\��c.0}�p��0D�X—�T��B`ߎ�t�$7���y��5���(p�,�UL��?����J���3tz7`�"̵����`��*,�Д(d�J� q��Ϸ��ʇ^i�&R-��̚�	F�^&�]W���L&AK�V+o�o��%T�l/^A�	���RV�4���U�Y�ԥ��N.������*�;��7"�f�吟O���T����q
}�F�Qǎ���Hܰ
|3����`Ú��"ƈ�O���:0n�Use�"������9"Y��X��i8�P^�s{E��@�����@��~Ȟ	0.M�P��K-��N�<%����"��~�<�я�l"�8-=|����Tt�>�pE�/��KR�������� �g�8�l��Պ�G�+��(�p]S��]-����B1ABq�G{��Û���IEND�B`�PK�X}�V{{aftonbladet.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1599499742(BasicNewsRecipe):
    title          = 'Aftonbladet'
    __author__     = 'Jonatan Nyberg'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True
    language = 'sv'
    description = u'Nyheter från Sveriges största nyhetssajt.'
    publisher = 'Aftonbladet'
    category = 'news'
    cover_url = 'https://gfx.aftonbladet-cdn.se/hyper-assets/f684737c60484ef64ab63a9e73a54d8b.jpg'

    feeds          = [
        ('Aftonbladet', 'http://www.aftonbladet.se/rss.xml'),
    ]
PK�X�
���
aif_ru.png�PNG


IHDR��h6�IDATx�%��Oa��_2�f���EKJY%��F�P���-�(LʦEYJBUB�d	
�����i;�}s�)7���979��@B
) �dJ 1x||�[��*�n@f�B C���D�1*�T��7�xgL5'%�/,�NT�y�>H�������sgli�VH��&I�@V�B0��8h�����.��r��1m$"�
 y�Y��lGA���j�ů7�C���P�Ya�*C���
CA��3�=��yY�9�(`
1��̌הuu6}�b~�3Mo����y����U&�����j���%���ъ��1�n8Lj[Z��1(�f�wý�C�쳇���G?mm�m���у�����/�k���R�bJ�Ҹ��|@=s=s�N��J���[7��.�p���،	΂l���{y��t��l:���䱹����K�͂�o��Jǵd�+;��zbOs��l5ď�>�.lf&��D���^����2�͵c�����+���������lm�O�S��l>η��qy��C%E3�]�1���sU5�ꪩ�����T���:�/�fufC�GЃ���Ov�++�9/@
�������9���;��@��B �g��OK��'A�ZLP
Y� E:MP��D<*J���ꃠOQP��۶W&���IEND�B`�PK�X��B��
aif_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1645564525(BasicNewsRecipe):
    title          = 'Аргументы и Факты - aif.ru'
    __author__     = 'MrBeef12'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True
    language = 'ru'

    feeds          = [
        ('ПОЛИТИКА', 'https://aif.ru/rss/politics.php'),
        ('ДЕНЬГИ', 'https://aif.ru/rss/money.php'),
        ('ОБЩЕСТВО', 'https://aif.ru/rss/society.php'),
        ('ЗДОРОВЬЕ', 'https://aif.ru/rss/health.php'),
        ('КУЛЬТУРА', 'https://aif.ru/rss/culture.php'),
        ('СПОРТ', 'https://aif.ru/rss/sport.php'),
        ('АВТОМОБИЛИ', 'https://aif.ru/rss/automobile.php'),
        ('НЕДВИЖИМОСТЬ', 'https://aif.ru/rss/realty.php'),
    ]
PK�XI��L{{
ainonline.png�PNG


IHDR  D����PLTE


$&),<P! l('p)(t,+u-,�:7�<:�>:�@=�A?�?<�@<�@=�A>�A?�B>�B?�C@


�C?�C@�D@�DA��P�&tRNS#,/16Ic����������������p:��IDATx�b�72�� ���mۘ��b���2�V�a� �������!X��@U0-�6�=i���������;p՞�-8 �Y�A-�m%8Aot<P�&9����c)�t�ge���IEND�B`�PK�X
��5k
k
ainonline.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2019, Jose Ortiz <jlortiz84 at gmail.com>

from __future__ import (unicode_literals, division, absolute_import, print_function)
from calibre.web.feeds.recipes import BasicNewsRecipe
from pprint import pformat

INDEX = 'https://www.ainonline.com/'


def absurl(url):
    if url.startswith('/'):
        url = INDEX + url[1:]
    return url


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(
        attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)}
    )


class AINOnline(BasicNewsRecipe):
    title = 'Aviation International News'
    __author__ = 'Jose Ortiz'
    description = (
        'Aviation International News covers all sectors of the aviation'
        ' industry, from business aviation to air transport to defense and'
        ' unmanned aerial vehicles.'
    )
    language = 'en'
    encoding = 'utf-8'
    no_stylesheets = True
    remove_javascript = True
    masthead_url = 'https://www.ainonline.com/sites/ainonline.com/themes/ain30/images/ainlogo-small.jpg'
    keep_only_tags = [classes('main-content')]
    remove_tags = [
        dict(name=['button', 'input']),
        dict(attrs={'class': lambda x: x and 'comments' in x})
    ]

    def parse_index(self):

        soup = self.index_to_soup(INDEX)

        # css selectors for articles
        #     .view-content [class *= 'featured-story']
        #     .view-content .views-row
        article_attrs = {
            'class':
            lambda x: x and (
                'featured-story' in x or frozenset(['views-row']).
                intersection(frozenset(x.split()))
            )
        }

        ans = []

        for section in soup.findAll(**classes('view-content')):

            if section.findParent(attrs=dict(id='featured')) is not None:
                current_section = 'Featured'
            elif section.findParent(attrs=dict(id='home-top-stories')) is not None:
                current_section = 'Top Stories'
            elif section.findParent(
                attrs=dict(id='quicktabs-container-latest_trending')
            ) is not None:
                current_section = 'Latest/Trending'
            else:
                current_section = 'Articles'

            articles = []
            for div in section.findAll(attrs=article_attrs):
                if 'views-row' in div['class']:
                    a = div.find(**classes('title')).a
                elif 'featured-story' in div['class']:
                    a = div.find(
                        lambda tag: tag.name == 'a' and tag.
                        find(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) is not None
                    )
                else:
                    continue
                title = self.tag_to_string(a)
                url = absurl(a['href'])
                desc = ''
                r = div.find(**classes('teaser'))
                if r is not None:
                    desc = self.tag_to_string(r)
                articles.append({'title': title, 'url': url, 'description': desc})
            if articles:
                for title, articles_ in ans:
                    if current_section == title:
                        articles_.extend(articles)
                        break
                else:
                    ans.append((current_section, articles))

        self.log(pformat(ans))
        return ans
PK�XɭNNajc.png�PNG


IHDR�aIDATx�b@����ȱ,��wm�h�yl#�ضU����r�m��(���{������s��U}�;�.ˬM�J��������	O��VTf�ܞN���/�(��')JD��61yr��(&$�DX�r��$�G�m��u�n)$���Yؾ�CC./

^�w!ꤘb�G259>���
�Q4PQaò��g��$��L�bŅ:����9�Yr�=:��X��U�	�}�Fö�fm�li����P�tL��Bye�߫��%��Xq�������=�Eo_��z����6����!m��ދL6����|��k㟲�h�g��><��1x����]��š����:��N�y��:���)�y�ܺ���͝2-�����}}8uj��YL��ľ}�p���2h;;�[n9Y����[REK�l.��gF�qs���-��>-��{�+v��6�;n?��B�H��L�ǟ?��ͷ��Vihi��Κ��9���v���̞���/��.k�`��䡆��ȸ8rd���(+��gO?�R�J�H���,�x�,�
Y߱�y����͛�`A���
y��f$RC|��q�w�_���u��9+�[o׳��%�fϼ�x^A�vh�a���Cx���GG��ʲ�p�@A�F�@ϖ:ߒ��lm�F���EE�nm�����.,]��׀$�K�
�Z�4u�e��TAiM�>_��Td�FE�O�BaQ�p��Y�׭���dy�a���a�~P,�N��9.*�+(fFR�q��n��8�I���Z��˒IEND�B`�PK�X]=??
ajc.recipe#!/usr/bin/env python
__license__ = 'Creative Commons Attribution 4.0 International License'
__author__ = 'John McDole'
__copyright__ = ''
__version__ = '0.1'
__date__ = '2015/01/10'
__docformat__ = 'restructuredtext en'

import datetime
import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class AdvancedUserRecipe1282101454(BasicNewsRecipe):
    now = datetime.datetime.now()
    title = 'The AJC'
    timefmt = ' [%a,%d %B %Y %I:%M %p]'
    __author__ = 'John McDole'
    language = 'en'
    description = 'The Atlanta Journal-Constitution; Metro Atlanta & Georgia'
    publisher = 'The Atlanta Journal-Constitution'
    publication_type = 'newspaper'
    category = 'news, politics, USA'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True

    # The AJC lists identical articles in multiple feeds; this removes them
    # based on their URL
    ignore_duplicate_articles = {'title', 'url'}

    # And this says "Hey, AJC, different feeds should mean something!"
    remove_empty_feeds = True

    # Sets whether a feed has full articles embedded in it. The AJC feeds do
    # not.
    use_embedded_content = False

    masthead_url = 'http://gawand.org/wp-content/uploads/2010/06/ajc-logo.gif'

    # Pick your poison. Business seems to be mostly cross-linked articles. Premium and cross-linked
    # articles will be dropped.
    feeds = [
        ('Breaking News', 'http://www.ajc.com/list/rss/online/ajc-auto-list-iphone-topnews/aFKq/'),
        ('Metro and Georgia',
         'http://www.ajc.com/list/rss/news/local/news-georgia-and-region/aCxP/'),
        ('Business', 'http://www.ajc.com/feeds/categories/business/'),
        ('Health', 'http://www.ajc.com/feeds/categories/health/'),
        # ('Braves', 'http://www.ajc.com/list/rss/sports/baseball/atlanta-braves-news/aGpN/'),
        # ('Falcons', 'http://www.ajc.com/list/rss/sports/football/falcons-news/aGK4/'),
        # ('Georgia Tech Yellow Jackets', 'http://www.ajc.com/list/rss/sports/college/georgia-tech-headlines/aGK6/'),
    ]

    headline_reg_exp = '^.*cm-story-headline.*$'
    story_body_reg_exp = '^.*cm-story-body.*$'
    author_reg_exp = '^.*cm-story-author.*$'

    keep_only_tags = [
        dict(name='div',   attrs={'class': re.compile(
            headline_reg_exp, re.IGNORECASE)}),
        dict(name='div',   attrs={'class': 'cm-story-meta'}),
        dict(name='div',   attrs={'class': re.compile(
            author_reg_exp, re.IGNORECASE)}),
        dict(name='meta',  attrs={'name': 'description'}),
        dict(name='div',   attrs={'class': re.compile(
            story_body_reg_exp, re.IGNORECASE)}),
    ]

    premium_reg_exp = '^.*cmPremiumContent.*$'
    footer_reg_exp = '^.*cm-story-footer.*$'

    remove_tags = [
        dict(name='div', attrs={'class': re.compile(
            footer_reg_exp, re.IGNORECASE)}),
        dict(name='div', attrs={'class': 'cm-inline-related-group'})
    ]

    extra_css = 'body { font-family: verdana, helvetica, sans-serif; } \
                 .cm-story-headline h1 { text-align: center; font-size: 175%; font-weight: bold; } \
                 .cm-story-meta { font-size: 80%; } \
            .cm-related-caption, .cmPhotoImageAttribution, img { display: block; font-size: 75%; font-style: italic; text-align: center; margin: 5px auto;} \
                 .cm-story-author { display: block; font-size: 80%; font-style: italic; }'

    # I would love to remove these completely from the finished product, but I can't see how at the momemnt.
    # Retuning "None" from preprocess_html(soup) as suggested in mobileread
    # forums leads to errors.
    def preprocess_html(self, soup):
        premium = soup.find('div', attrs={'class': re.compile(
            self.premium_reg_exp, re.IGNORECASE)})
        if premium:
            return None
        crosslink = soup.find('a', attrs={'class': 'cm-feed-story-more-link'})
        if crosslink:
            return None
        return soup

    def populate_article_metadata(self, article, soup, first):
        for meta in soup.findAll('meta', attrs={'name': 'description'}):
            article.text_summary = meta['content']
            article.summary = meta['content']

        lead = soup.find('div', attrs={'class': 'cm-story-photo'})
        if lead:
            lead = lead.find('img')
        else:
            lead = soup.find('img')
        if lead:
            self.add_toc_thumbnail(article, lead['src'])
        names = ''
        comma = ''
        for div in soup.findAll('div', attrs={'class': re.compile(self.author_reg_exp, re.IGNORECASE)}):
            div.extract()
            for auth in div.findAll('a'):
                if auth.get('class') == 'cm-source-image':
                    continue
                names = names + comma + auth.contents[0]
                comma = ', '
        article.author = names
        if len(names) > 0:
            tag = new_tag(soup, 'div', [('class', 'cm-story-author')])
            tag.append("by: ")
            tag.append(names)
            meta = soup.find('div', attrs={'class': 'cm-story-meta'})
            meta_idx = meta.parent.contents.index(meta)
            meta.parent.insert(meta_idx + 1, tag)
PK�X5b����ajiajin.png�PNG


IHDR  �g	PLTE`�8p�:IDATWc`�\��`>P���8@�@
H.cckk~�.L��qq�B�iU��PaIEND�B`�PK�Xkߘ"FFajiajin.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>'
'''
ajiajin.com/blog
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AjiajinBlog(BasicNewsRecipe):
    title = u'Ajiajin blog'
    __author__ = 'Hiroshi Miura'
    oldest_article = 5
    publication_type = 'blog'
    max_articles_per_feed = 100
    description = 'The next generation internet trends in Japan and Asia'
    publisher = ''
    category = 'internet, asia, japan'
    language = 'en'
    encoding = 'utf-8'

    feeds = [(u'blog', u'http://feeds.feedburner.com/Asiajin')]
PK�X4����aksiyon_derigisi.png�PNG


IHDR  �Tg�PLTE���������������|�tRNSn��NIDAT(�cpAD8+
�	P�)r&��J�(��S !Pr�#e������~PD�� pTc ���H�*�3uIEND�B`�PK�XV��R	R	aksiyon_derigisi.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class Aksiyon (BasicNewsRecipe):

    title = u'Aksiyon Dergisi'
    __author__ = u'thomass'
    description = 'Haftalık haber dergisi '
    oldest_article = 13
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    publisher = 'Aksiyon'
    category = 'news, haberler,TR,gazete'
    language = 'tr'
    publication_type = 'magazine'
    auto_cleanup = True
    cover_img_url = 'http://www.aksiyon.com.tr/aksiyon/images/aksiyon/top-page/aksiyon_top_r2_c1.jpg'
    masthead_url = 'http://aksiyon.com.tr/aksiyon/images/aksiyon/top-page/aksiyon_top_r2_c1.jpg'
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    feeds = [
        (u'KAPAK', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=26'),
        (u'ANASAYFA', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=0'),
        (u'EKONOMİ', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=35'),
        (u'EKOANALİZ', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=284'),
        (u'YAZARLAR', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=17'),
        (u'KİTAPLIK', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=13'),
        (u'SİNEMA', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=14'),
        (u'ARKA PENCERE',
         u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=27'),
        (u'DÜNYA', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=32'),
        (u'DOSYALAR', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=34'),
        (u'KARAKUTU', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=11'),
        (u'KÜLTÜR & SANAT',
         u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=12'),
        (u'SPOR', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=38'),
        (u'BİLİŞİM - TEKNOLOJİ',
         u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=39'),
        (u'3. BOYUT', u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=172'),
        (u'HAYAT BİLGİSİ',
         u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=283'),
        (u'İŞ DÜNYASI',
         u'http://www.aksiyon.com.tr/aksiyon/rss?sectionId=283'),
    ]

    # def print_version(self, url):
    # return
    # url.replace('http://www.aksiyon.com.tr/aksiyon/newsDetail_getNewsById.action?load=detay&',
    # 'http://www.aksiyon.com.tr/aksiyon/mobile_detailn.action?')
PK�X=zk��aktualne.cz.png�PNG


IHDR(-S�PLTE(��(��(��(��(��(��(��(��(��(��(��(��(��(��*��+��1��2��<��=��>��G��J��K��L��u��v��w��{�dž�ˇ�̈�͐�А�В�љ�ԙ�Ԣ�פ�ب�ڿ��������������������������������Y��tRNShhll�������b؋�IDATx�<�U�0DKqw���϶�"�g���gIѣA�tMe�}�ߧ,�k�%���!̫n��P
Z4�w�ك�is��'|ȷ[m��b���U�#:UՍ��.=��(�ݏl-<��<���1>&4;���a������C�>��F��"HIEND�B`�PK�X���EEaktualne.cz.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe
import re


class aktualneRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'aktualne.cz'
    publisher = u'Centrum holdings'
    description = 'aktuálně.cz'
    oldest_article = 1
    max_articles_per_feed = 20
    encoding = 'utf-8'

    feeds = [
        (u'Domácí', u'http://aktualne.centrum.cz/feeds/rss/domaci/?photo=0'),
        (u'Zprávy', u'http://aktualne.centrum.cz/feeds/rss/zpravy/?photo=0'),
        (u'Praha', u'http://aktualne.centrum.cz/feeds/rss/domaci/regiony/praha/?photo=0'),
        (u'Ekonomika', u'http://aktualne.centrum.cz/feeds/rss/ekonomika/?photo=0'),
        (u'Finance', u'http://aktualne.centrum.cz/feeds/rss/finance/?photo=0'),
        (u'Blogy a názory', u'http://blog.aktualne.centrum.cz/export-all.php')
    ]

    language = 'cs'
    cover_url = 'http://img.aktualne.centrum.cz/design/akt4/o/l/logo-akt-ciste.png'
    remove_javascript = True
    no_stylesheets = True

    remove_attributes = []
    remove_tags_before = dict(name='h1', attrs={'class': ['titulek-clanku']})
    filter_regexps = [r'img.aktualne.centrum.cz']
    remove_tags = [dict(name='div',   attrs={'id': ['social-bookmark']}),
                   dict(name='div', attrs={'class': ['box1', 'svazane-tagy']}),
                   dict(name='div', attrs={'class': 'itemcomment id0'}),
                   dict(name='div', attrs={'class': 'hlavicka'}),
                   dict(name='div', attrs={'class': 'hlavni-menu'}),
                   dict(name='div', attrs={
                        'class': 'top-standard-brand-obal'}),
                   dict(name='div', attrs={'class': 'breadcrumb'}),
                   dict(name='div', attrs={'id': 'start-standard'}),
                   dict(name='div', attrs={'id': 'forum'}),
                   dict(name='span', attrs={'class': 'akce'}),
                   dict(name='span', attrs={'class': 'odrazka vetsi'}),
                   dict(name='div', attrs={'class': 'boxP'}),
                   dict(name='div', attrs={'class': 'box2'})]
    preprocess_regexps = [
        (re.compile(r'<div class="(contenttitle"|socialni-site|wiki|facebook-promo|facebook-like-button"|meta-akce).*',
                    re.DOTALL | re.IGNORECASE), lambda match: '</body>'),
        (re.compile(r'<div class="[^"]*poutak-clanek-trojka".*', re.DOTALL | re.IGNORECASE), lambda match: '</body>')]

    keep_only_tags = []

    visited_urls = {}

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        if url in self.visited_urls:
            self.log.debug('Ignoring duplicate: ' + url)
            return None
        else:
            self.visited_urls[url] = True
            self.log.debug('Accepting: ' + url)
            return url
PK�XA@:���al_jazeera.png�PNG


IHDR  szz��IDATx��Wx�i�o۶m۶m�6j۶���ՎS�mT�������v>�;����~������
F���Z�E2c5߫��.�E�讔��0I�G&E)��:�0?t;�|f���rP���N��%�T�]:�kʳ���G}��.TJY�x��$�C3����N8B�C�C��'�g��)�Z�Q��,2-�菬�e�<����C)f�|�@1]Q[�;���"64{��B��G�,*��J�$�Pn� ��C�(��	J��{�h�.
GȈ��-�d�@T��E��j� +%􅞬N4�f6���k�P�k{�E~�j�0�M��&���&]s��ʟl:��(�弸0z=IgpCesI�(�"����&]u���GE:��䱬�G}���a�eT��|)d!-�H����#��k6��#����Mه�X��z���<�esf�K�������B���j�8��k�E P�X�ݡQN�jJG��j
�J�)�n9�$�4�dJ)�J)�^���US�1��{¯��xliF�1������W����ԉ�_͒K%��Y�#��u&�+d�!�i�3���@"�-�ⳗĸ��]���U�W���#돐Ԉ�g��Cw�V�L��{ǭ�����N�C7|V^��p��X��ՈRM���(vm��
.>�dũ���g=�s>�V����5J~�������=GTd�i�u��U�Na6�S��&H�|�	�^���/Lr���4�W�s�V�I8XW�7j�����$.���Oc���)�/��967� 3�'>�ȍ?RL�i����5X�D���ڊ���"�2��jPe)cY��h�x"?5��O���2��~h�d�,�8�=�s
<��D �˭T�	B��Y���"ɦo������2�zQ:�		�&�ɡ=N�=Jn2��$ݡ�8�T��W����k�x
���Aܫ���ş���~����5����8��,BB��"
Q��An�x
1�Ԉ3f�BV�7�n���GU��r�iiʗb8�"-�Ïf��Dد� 
t�S~h�@A'�i��0jH1��d�[i�_U�F
�����hM�Y5����V�`$��2c~@I�™�mȌA��zF08"Z�����x���Ps�)��$�8?������8�w1��'x!�N!�f�p!��i�
���7\�I:��;6ۊ���=��`���ϥ?������|���H�>��@i��2A���QŢ,[�
���"��&�Jq��p	:� 'h/�N���tZ1�����%خpk�8.�R�Z��W3��|������D{b�21["LZ��mө����Gq ����ńx�w�E��hS8���CO�=sAA�Wcv���v}3±����P�4��j@s���q���IEND�B`�PK�X�P��bbal_jazeera.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'

'''
english.aljazeera.net
'''
from calibre.web.feeds.news import BasicNewsRecipe, classes


class AlJazeera(BasicNewsRecipe):
    title = 'Al Jazeera in English'
    __author__ = 'Darko Miletic'
    description = 'News from Middle East'
    language = 'en'
    publisher = 'Al Jazeera'
    category = 'news, politics, middle east'
    delay = 1
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    extra_css              = """
                                body{font-family: Arial,sans-serif}
                             """
    conversion_options = {
        'comment': description, 'tags': category,
        'publisher': publisher, 'language': language
    }
    keep_only_tags = [
        classes('article-header article-featured-image wysiwyg--all-content'),
    ]

    remove_tags = [
        dict(name=['object', 'link', 'table',
                   'meta', 'base', 'iframe', 'embed']),
    ]

    feeds = [(u'Al Jazeera English',
              u'http://www.aljazeera.com/xml/rss/all.xml')]

    def get_article_url(self, article):
        artlurl = article.get('link',  None)
        return artlurl

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll(face=True):
            del item['face']
        for alink in soup.findAll('a'):
            if alink.string is not None:
                tstr = alink.string
                alink.replaceWith(tstr)
        return soup
PK�X[���44al_masry_alyoum_arabic.png�PNG


IHDR  szz��IDATx^�W�nE��=ޝ�Il���l��ƀd�����	�p�9".��GA��/�r#;�!q�5�#������L=�V��t��mW�H]_}U�3K�L�b{{{�����cf�_cf�y�,�0�L
쬮�~�)a��&����ߔ�x<F�$8>>ފ�x�$�F����u��ślnnNƛPJavvV�i�Bk������Bggg<���
ͨ�`T���]����S>==����W��#^$ t���p6�a0�L��d���������b�(�����P�vx�����/{W�(8���Fc�!���?~���ml�`F��|kw�o7pS3�p���޽��Ƨx�����0�UN3�kF3"\��4��Q��1"̌F�!�V;F;n�ܔĨ����+G��˙�
��Fٺ���m,�5r��t0�@�����	��Աd��	�Ʋ��	P�V�V�)����/��́���	����'kHpU8����@�#PiB�"3���L�D�ّ)�	QU��2E�A]S��q�1��L�,�Z����0{&ᧂgD6�_�@"E��!s�f���z�Ԡ6�K�.����p
��O�IFx5�e~/�S�:l�08{f\u����u]B4����"��Z�v!�Փ��<����`�z-
�9��%Q���g�̳<w�������P9%+�KG�[�@yS"@P$�MH�6�FXY�n�gh��+���Ykp�NNN�lnnލX�$
2ь�`�5��Z`p��P����×_���Ç_����Q�wbɞJ�������s�9??G�Ӗ�5��Ŷ>��ڨ�ׯZs�`$Ed
�D#gQ>~�h�f�w��O�<����wC�'[�`h�ϑ���z6U�-�*��.��x��6��"'�f��9h�
P�ȃ�f�F�?���S�ӿ���D5��ag�ͦ��Y��S@�	[��ւ��Z�K��$E���{R�޿u�6��u_.$�2��״5��1Z�X�� �4M�'I��i�$.	�.�	�S#i�vCI�F��w��<�ryꚝs�\�I����8���
,R�:�F��+ȖH�btR�:ݮ�5G�t����҈�m�f��g�_-�Z�Y�k��eck,�TnF�wn���/#�'�v�aw��&^��_�T����.����6P4^㟓#��ϲ6�J�W�����#�2�vįIT���+)ǬA7��������O`hK
�,��Zi�$����-2�-��IEND�B`�PK�X�p���al_masry_alyoum_arabic.recipe# coding=utf-8
__license__ = 'GPL v3'
__copyright__ = '2016, Hassan Williamson <haz at hazrpg.co.uk>'
'''
almasryalyoum.com
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class AlMasryAlyoum(BasicNewsRecipe):
    title = u'المصري اليوم (Al-Masry Alyoum)'
    __author__ = 'Hassan Williamson'
    description = 'The Arabic version of the Al-Masry Alyoum (Egypt Independent) newspaper.'
    language = 'ar_eg'
    encoding = 'utf8'
    cover_url = 'http://www.almasryalyoum.com/content/images/header_logo.png'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    publisher = 'Al-Masry Alyoum'
    category = 'News'
    publication_type = 'newsportal'

    extra_css = ' body{ font-family: Verdana,Helvetica,Arial,sans-serif; direction: rtl; } .tit_2{ font-weight: bold; font-size: 2em; } .pinfo{ font-size: 1.3em; } .articleimg img{ max-width: 100%; } .imgauther{ display: block; font-size: 0.7em; } .caption{ font-size: 0.7em; } '  # noqa

    keep_only_tags = [
        dict(name='div', attrs={'class': ['article']})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['share_buttons_container']}),
        dict(name='div', attrs={'class': ['min_related']}),
        dict(name='div', attrs={'id': ['feedback']}),
        dict(name='div', attrs={'class': ['news_SMSBox']}),
        dict(name='div', attrs={'class': ['tags']}),
        dict(name='div', attrs={'class': ['ads', 'y_logo_news']}),
        dict(name='div', attrs={'class': ['ads']}),
        dict(name='div', attrs={'class': ['option']}),
        dict(name='div', attrs={'class': ['seealso']}),
        dict(name='div', attrs={'id': ['comments']}),
    ]

    remove_attributes = [
        'width', 'height', 'style'
    ]

    feeds = [
        (u'أخر الأخبار', 'http://www.almasryalyoum.com/rss/RssFeeds'),
        (u'الصفحة الرئيسية',
         'http://www.almasryalyoum.com/rss/RssFeeds?homePage=true'),
        (u'أقلام وآراء', 'http://www.almasryalyoum.com/rss/RssFeeds?typeId=2&homePage=false'),
        (u'أخبار مصر', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=3'),
        (u'رياضة', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=8'),
        (u'اقتصاد', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=4'),
        (u'حوادث', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=7'),
        (u'فنون', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=10'),
        (u'منوعاتنون', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=12'),
        (u'ثقافة', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=6'),
        (u'علوم وتكنولوجيا',
         'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=9'),
        (u'تحقيقات وحوارات',
         'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=5'),
        (u'المرأة', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=69'),
        (u'رأي', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=2'),
        (u'وسط الناس', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=13'),
        (u'مركز المصري للدراسات و المعلومات',
         'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=56'),
        (u'مطبخ', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=81'),
        (u'برلمان مصر', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=78'),
        (u'تقارير', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=54'),
        (u'تحليلات', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=60'),
        (u'عروض نقدية', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=61'),
        (u'دراسات', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=62'),
        (u'كتاب المصري اليوم',
         'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=65'),
        (u'فعاليات', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=66'),
        (u'إسلامي', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=75'),
        (u'مطبخي', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=76'),
        (u'مسلسلاتيطبخي',
         'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=77'),
        (u'رمضان زمان', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=82'),
        (u'تقارير', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=85'),
        (u'سيارات', 'http://www.almasryalyoum.com/rss/RssFeeds?sectionId=86'),
    ]
PK�X��n{�	�	al_monitor.png�PNG


IHDR  szz�	�IDATxڕW�c�=c۞�϶m۶��z�=Vx��m��Vҹ��U�N=�T���9'k��Ύ���S��|�:m�6r�R�S�V����nJ�b��j̖��11ڶi�ǯp�x���!;�?SJl��%�����ul�e���-C#̇�kF�75�p�D;1uq��q����d�5�l��ՓjS׏@������^'�Z��4w�׭����Q�!8˚��^���G��wWi��U󌜵A��aD��yr�-<`��}D�o���׋�1��4�
wA���X�״����|�U�:=|w��e�al˪���^���}On�^���(�U�E�qb�ۚI=�sM��
;W�ީ�b�e*؎7$�����Ċf��u	��Ãh����R��ى�Z9�:��ۆ;?NCM[�(
笍�A	����w�D� ;&�iE*�?Gb!�+�ר�1�d�S�f{uY�
�^ߏyK��p�8P��.�z[>���zi�8 ��Yl�3����>�̷9>rG����Q&ڿf<	m�T�O~���o���
��6	`z��,�za7$H0���
|(uW���8~��^��-Y�[��������՟� �Ĥ8�=���
@?:��b�p��D�Y��wY>�}�|u�=���!YX1$���n�0�a����e��,8q�����M�)O%�˛p��>]�]�9Y'�&�i~Ç�Q�a�
	7C��%������$Yr%V4!�h�k;�+Sfݓ*��w�
E��<����<�����y<�nŰK�8�<շ�D[?U�.,7�z1!q!�x��,"A`�B;N]��囓�H�޼Z��>WoM�=����_���z<�}�J�X2X��u�
�-*���c���:E�p��[�L��h��9^�!�Aax��~t���R�,���A'�à0�h�~<�m6yC�m�ub�(��r�Ts���1J��9O�xR�Z�)� Ǝ_�DEc'�	�C�",f��<��. 	Z�>��ZdGY}NX
�Bp�6�ol+��L��R�}B>�7*ā=9�޷�3S��Y�ѯ��Pᇟ$��_��W�w�,�Z�𜔁6�m��*�
�u�r�6�����ֶ��~*a�X+�#�<��;�=/2�~_t���
[��ܗ�ӈnx?U/�i�D9y֨��Z/���;�~��Ҏb����("�[�H��|���'H�#��̔�F��b�Ȯa��Jpf=�X�>wE�+SI�=',w��˫�2yL`?kM<�۳j��#f��H&�K�Xc-ǻ��zvW��<Gȩ
J�ϯ�c��.AJ�����+NZ�,�E�_����U	d' IP��g�u{�Xb(�k���K7%�tQ�q�{�*|!"E��K6&�^�)�L�p����^diEI]l%
,)����ץ�����P\��#��{�|
��p�$�L]��=���b,����Ë	M�
��ܣ�d�� c/i�S��I1":�=�X�>o%K`�PB*��X7H�+��d9��R�'��IN>){�Dlx�}w5x%��m��D��]X�j�IL��bk2I��va(I(�*h,��D�.�zu_�
����k2���μ�Yq���Đ0��(�^�17��,HfiO�o�$��X�ԁ���{]e��"�N�2�7t2c�Z�!�0HP �7N�f�m|���$Q#d�|@͈6OYl�<ߎ��n��/����x\��,�F�LJe��,���;oP:'QqL&���l����Ǐﻌ>V!N��#[��^��d"���C8iX�Y	v�F���Rqo_^bd !h��5�)u��S�k��5*�z�\�����d��i:8�T6v��I,:�9Ej�t�z�r����8W2��ﰄlKr%�Pxٍ��XN�t�YpL�y��J��vC�AZI+n 8L�b!�8�����6�g�R#V[�Y"¹\�Қ��*K�Yҧ�8��V�j A�Q�bGЎ�n(�Zd<�B%Y�"N.�ӏ���t�R	�bD�^l(��A�&!9E�L��/7���@��\��ϰ`���dEԞ�n�O�}��C=����c��L�H&��\\9���Z���6<�e&���y�[V�������C)W`6�� �X/HȔ��-��p�b;9�:�lv��;Y���'Q"Wp�gD�2�h����B�!����r��o���Ta�Ar���*�!��rj8񂋭ɋ��s�%m���򬳣x{�
�ܒ9,b��?8�� ��僅lQ�	!^���c^�7z9������d�/���)��7dG�G*ԉ!��ry���,r"@L�M�DĪE�:��zH�S�qҪD��2���=p���ݒ�w#b�g���^�k4�/�&N��<"�| c�K��R��k�j�N�l��9>B��kD���=����pIEND�B`�PK�Xu����al_monitor.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals
__license__   = 'GPL v3'
__copyright__ = '2014, spswerling'
'''
http://www.al-monitor.com/
'''
import string
import inspect
import datetime
import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class AlMonitor(BasicNewsRecipe):
    title = u'Al Monitor'
    __author__ = u'spswerling'
    description = 'a The Pulse of the Middle East'
    no_stylesheets = True
    encoding = 'utf-8'
    category = 'news'
    language = 'en'
    publication_type = 'newspaper'
    cover_img_url = 'http://www.al-monitor.com/modules/almcontent/a-img/elements/logo.png'
    masthead_url = cover_img_url
    remove_empty_feeds = True

    # on kindle, images can make things kind of fat. Slim them down.
    recursions = 0
    compress_news_images = True
    compress_news_images_max_size = 7
    scale_news_images = (150, 200)  # (kindle touch: 600x800)
    useHighResImages = False
    oldest_article = 1.5
    max_articles_per_section = 15

    sections = [
        (u'egypt', u'http://www.al-monitor.com/pulse/egypt-pulse'),
        (u'gulf', u'http://www.al-monitor.com/pulse/gulf-pulse'),
        (u'iran', u'http://www.al-monitor.com/pulse/iran-pulse'),
        (u'iraq', u'http://www.al-monitor.com/pulse/iraq-pulse'),
        (u'israel', u'http://www.al-monitor.com/pulse/israel-pulse'),
        (u'lebanon', u'http://www.al-monitor.com/pulse/lebanon-pulse'),
        (u'palistine', u'http://www.al-monitor.com/pulse/palistine-pulse'),
        (u'syria', u'http://www.al-monitor.com/pulse/syria-pulse'),
        (u'turkey', u'http://www.al-monitor.com/pulse/turkey-pulse'),
    ]

    # util for creating remove_tags and keep_tags style regex matchers
    def tag_matcher(elt, attr, rgx_str):
        return dict(name=elt, attrs={attr: re.compile(rgx_str, re.IGNORECASE)})

    remove_tags = [
        dict(attrs={'id': [
            'header',
            'pulsebanner',
            'relatedarticles',
            'sidecolumn',
            'disqus',
            'footer',
            'footer2',
            'footer3',
            'mobile-extras',
        ]}),
        tag_matcher('hr', 'id', 'spacer'),
        tag_matcher('a', 'title', 'print this article'),
        tag_matcher('div', 'class', 'extras'),
        tag_matcher('div', 'class', '^clear$'),
        tag_matcher('div', 'class', '^overlay$'),
        tag_matcher('div', 'class', 'shareTag'),
    ]

    articles = {}
    urls_done = []

    def parse_index(self):
        for section in self.sections:
            self.parse_section(section[0], section[1])
        ans = []
        for k in self.articles:
            ans.append((string.capwords(k), self.articles[k]))
        return ans

    def parse_section(self, section, url):

        self.articles[section] = []

        try:
            self._p('process section  ' + section + ', url: ' + url)
            soup = self.index_to_soup(url)
        except:
            self._p('Unable to spider section')
            return []

        self._p('Got section. Processing links.')

        for link in soup.findAll('a', href=True):
            href = link.get('href')
            text = self.text(link)
            if text and ('pulse/originals' in href):
                self.process_link(section, link)

    def process_link(self, section, link):
        title = self.text(link)
        if len(title) > 120:
            title = title[0:120] + '...'
        href = link.get('href')
        if not href:
            self._p("BAD HREF: " + str(link))
            return
        self.queue_article_link(section, href, title)

    def queue_article_link(self, section, url, title):
        full_url = self.abs_url(url)
        if full_url in self.urls_done:
            self._p('Skip (already Qd): ' + ' - '.join([section, title, url]))
            return

        self._p('Q: ' + ' - '.join([section, title, url]))
        self.urls_done.append(full_url)
        if len(self.articles[section]) >= self.max_articles_per_section:
            return
        self.articles[section].append(
            dict(title=title,
                 url=full_url,
                 date='',
                 description='',
                 author='',
                 content=''))

    def preprocess_raw_html(self, raw_html, url):
        reason_to_skip = self.should_skip_article(BeautifulSoup(raw_html))
        if reason_to_skip:
            self._p('Skipping article: ' + reason_to_skip + ', ' + url)
            # Next line will show up as an error in the logs, but ignore, see
            #   http://www.mobileread.com/forums/showthread.php?p=2931136
            return None
        else:
            return super(self.__class__, self).preprocess_raw_html(raw_html, url)

    def populate_article_metadata(self, article, soup, first):
        summary_node = soup.find('div', {'id': 'summary'})
        if summary_node:
            summary = self.text(summary_node)
            self._p('Summary: ' + summary)
            article.text_summary = summary
        else:
            self._p('No summary')

    def should_skip_article(self, soup):
        date = self.scrape_article_date(soup)
        if not date:
            return False

        age = (datetime.datetime.now() - date).days
        if (age > self.oldest_article):
            return "too old"
        return False

    def scrape_article_date(self, soup):
        for span in soup.findAll('span'):
            txt = self.text(span)
            rgx = re.compile(r'Posted ([a-zA-Z]+ \d\d?, \d\d\d\d).*')
            hit = rgx.match(txt)
            if hit:
                return self.date_from_string(txt)

        return None

    def date_from_string(self, datestring):
        try:
            # eg: Posted September 17, 2014
            dt = datetime.datetime.strptime(datestring, "Posted %B %d, %Y")
        except:
            dt = None

        if dt:
            self._p('From string "' + datestring + '", datetime: ' + str(dt))
        else:
            self._p('Could not get datetime from ' + datestring)

        return dt

    def abs_url(self, url):
        if 'www.al-monitor.com' in url:
            abs_url = url
        elif url[0] == '/':
            abs_url = 'http://www.al-monitor.com' + url
        else:
            self._p('Not sure how to make abs_url: ' + url)
            raise

        if '#' in abs_url:
            abs_url = ''.join(abs_url.split('#')[0:-1])

        return abs_url

    def text(self, n):
        return self.tag_to_string(n).strip()

    def _dbg_soup_node(self, node):
        s = '   cls: ' + str(node.get('class')).strip() + \
            '  id: ' + str(node.get('id')).strip() + \
            '  role: ' + str(node.get('role')).strip() + \
            ' txt: ' + self.text(node)
        return s

    def _p(self, msg):
        curframe = inspect.currentframe()
        calframe = inspect.getouterframes(curframe, 2)
        calname = calframe[1][3].upper()
        print('[' + calname + '] ' + msg[0:100])
PK�XK?���albert_mohler.png�PNG


IHDR  D���PLTEG�P�R�W��DI�M�O�5\w�9�''�.������Ѿ1�1ˠѦ�F�:���I��Iصa������.=��)� =?���v��~�?F��~
F����t��c����I ��h��W�5)��	U��5�*�.�)�7��OC���X;r�9�<�����eæƧ[0`ǦWɫɰs�?',ZϫX;�;e�;g�E#MVjl�(ղ`�1"�?�5�=�A�
G�ʍ�]�B����Д�Ԣ���ڐ����������|�l��y�4N��f�it��x?o��F��qBatT�KH����/Ldk��l�4Ov���{�D!?������nxXz�[���2]oy��x^oib����r�-���c����˰7f���$.�0,�6)�����g��г�}h>��� -�5lvip`t���:��z���z|d{+�+�!�\j��a��m��z��نx��	*��_�X�<«t Iv�6�r��}�U������9�	$�m�ʻ���܍v˶�̼���ގ1�ɹ��я-�($�	8���Ӿ��/B%U}>wկX�^����3�ĕ�*�Zh,WzڴZ�(A۸j�t���/'T1Z�1b��a�7�/"�m�ʀ��}�Ѡ�g2[�:}7Mn��i��`���������y������y�v~�ݞ����������y
4g����m�릜�n�0��[��j�������+>��q(tRNS@��f`IDATxڕ�`�@E�EֶQ_m۶y�m۶m۶m�g{�n�=��'/��|�j����,��TƇ4]S�>�Ɣ%ݵW&�h�
���2�����jp�\�KAq��RN?O"R�T
0��'�H�/�{F�� E	�fUE�].��t�m���R�¤$��N��I�Γ�J
?���(�0kmbJ����p�ܗ��d)#A($���8a�e�r������Yn��p�����x'��ś�d�Bv>x��>��b[[��>��]x_.�x��+y	�c�3Ç�m�B��.�)�R__�ThF�NIp��P7qřWC�VFr;����`���x���9���C,����|6�7{�3:��E-�	r����@�h!�6�
���I(�=�z&��*��bwu���M�Ix��$AH�nLe\��9~�7	A�V~����)(0��'��ɩ�m�H���x���FD!��w�\�A��υ*�9��Ln{Z�L>��K�}���};

*��8'/��<�B�%��I�/��ZR(�L�y-�j��>Q{��zF��<Ⱥ��w��`��C��:�(}�ꜜ�"�@u��jD���6z�,~����j��2����uIEND�B`�PK�X&����albert_mohler.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Peter Grungi <p dot grungi at gmail dot com>'

from calibre.web.feeds.news import BasicNewsRecipe


class AlbertMohlersBlog(BasicNewsRecipe):
    title = u'Albert Mohler\'s Blog'
    __author__ = 'Peter Grungi'
    language = 'en'
    oldest_article = 90
    max_articles_per_feed = 10
    auto_cleanup = True
    cover_url = 'http://www.albertmohler.com/wp-content/themes/albert-mohler-v5/img/logo-am-lg.gif'
    publisher = 'Albert Mohler'
    language = 'en'
    author = 'Albert Mohler'

    feeds = [(u'Albert Mohler\'s Blog',
              u'http://feeds.feedburner.com/AlbertMohlersBlog?format=xml')]
PK�X�	4R�
�
ald.png�PNG


IHDR  ��	pHYs��~�
AIDATHK-Uio\W=��uޛ�73��3/�8��,M�&Q�&�N��mJҦ���*E�"��ъ��
�JP�mX��iIH���c�N�x���:�g}�|0������<�Q�d�+��)u%��H&�u"��r:�+`k���������㏶�\�F�(
*�T�z5[�
J9(8D�T�y�L3��k�|A6�F�
9\�xs+�gξ��ӥR�o�<�,Ƨa�$��A���ښ/r=�T�8'`8�(�(�X��a!5v�rgg�{?{�!d�ś��Jh˖����Fh�̻�R&����k���Ql��P���Us�w)�D��J��71~��?���{�:��q���3���S��=��]^je����K�ٖ�|�an���WM�("q�aa�h�3�&`:u��+"9��+d��;�ps
+��ž��][�K3��.��/�Py�ϩ~u�#'+�C"`UK� ��	8�F r�\i�?#���7��m��^x孨�Umg� ^���h4�$[�b	����{铫�&�y�a�9�v4�O���uA\
����/�흇��j#H����ϭ�k��t�@��hd`����67�ؘo�s��-��W�����������e)��:cb՛���q�i���fs˺����V��'Gn��X"��))���z��}3<���X">?}k�V�c�0(�D�lC>� �p��b�T�s)7�o;t�W)�=��S'k���k�����V�_z-i��>|��]Co���{��o�=�ӟ�9108�O��Ψ+qO"�ȌJ.���"_��ߧ���SۜD4�H
���'��{w߱x�ӷ��^§����ڀ\���5�h����������2N�\Q`���MM�W/_ٜlj��a�A�,_z뽵�qYT��h˶�7�w/p����<0=���H=j�Ay�V�Qք�=�=pȮD!��q�y�{��҂�i��1��H6Sh�	�w�ȑ��y93r�2�j)�&�M&�0���(+��OC4D72�9�GD�N!P�B��g��S�-4�k�>ɬ��<|���l�����|�N�v�[�����Pձ&��65
�3/���B��SL�r�q�	u%>��x��fH]����������B�[u]��4��&�lWk-7�RTm~l4
��g���-Qe���7
�	�(D�_H����������o<6������9�ͦf";;���˛���_�xwWg����R�Φ-��=�Q*�”p�`�h�p���b�ݧN�8�w���BssP�ȶ���"�3ی����7>\���Y�l�D�M1��k[&wD�E@�	�#r��Ȍ��4�]E��SX���Fn���F!j�(=��p��/WeX�����Ob�m4�㐨CD����
������Gj­����G��hW}���٥�g^��&�
Q������;v�-��<���7?|�l��:u(�8!��¥p��Aم:�{������#�Y\ �>TL�ˠ"��|���.�.��Kz����Z�*�<H��6 @��P�'���LN�l��ZM����] ���_�t�t:�p�ƣa���N>B�Q�7ŀ��-8�N(��r�	�&@��9V���w�mn�mh������̺�R���hgV�r��
�T���`;��k
BA�	ԡ���*VY�e�����|��H��0��3�al߾�c�^A���H�������\]���(;�EP����)u)*0����s��:O��#_�ZL�uj�����5�Z�RY��+�0�qY�ZQe�B�k��<�' *�R�)V.C	��|��^)�p��ɞ�H$�yP4�L��O��g�j6�L0"Z6E�\&�4Q�P��׮��)����X,�Ժ��ҽn5�8�޿�y����]�H�JY�d���TȯΏM���3J,�|9ϙ?�:�������x��g�[�Z�:�;><�/3�\{�����}b�=��;��1�>��X�#+R�9���^ϭ�q�g��6[���&�.Wݢ����⯟~�y*����܇��w���=�a���W�*�O�D�NZ����.�J�6B��Z>5�W3F6Gex���V3��O��x��^��!� ��$"F��e�`�s�#�
�W>�D�E�f./��A�@���h0?7{ktlw�VA��jB����n��|��lA���'N<���o��;:�Q-�
��{�����wI2Y��z�ع�#�s\U.�8���33�5A#��IPb5#7���Mv��R" o��߽���MI��FlN �� ��4T]!_�.��ݜ���
*���a��j	� ж�$(P)��:ۛ߿��/(M,�P�H4n�;B#��l�;̴\
� r���T汯<棾ŋWaq�*�&a�[_[E�����X�O�ȳL�b�����.<��g��˾@��"e�r��g���	6G���l�5��
~��+g��&�o,N�Ȃ�-����2W�x&\��ܵe��J��Gd2�?�	�(_8*�IEND�B`�PK�X���
�

ald.recipe#!/usr/bin/env python
from __future__ import unicode_literals, division, absolute_import, print_function
__license__ = 'GPL v3'
__copyright__ = '2018, PJ Paul'
'''
Recipe for Arts and Letters Daily website
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re
from datetime import date as dt, timedelta
from itertools import compress
from calibre.utils.date import parse_date


class ALD(BasicNewsRecipe):
    title = 'Arts and Letters Daily'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    recursions = 0
    ignore_duplicate_articles = {'url'}
    index = 'https://www.aldaily.com/alt/'
    cover_url = 'https://www.aldaily.com/static/images/header.gif'
    __author__ = 'https://github.com/pjpaulpj'
    language = 'en'
    encoding = 'utf-8'

    def get_browser(self, *args, **kwargs):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based')

    def parse_index(self):
        articles_note = []
        new_books = []
        essays = []
        feeds = []
        soup = self.index_to_soup(self.index)
        delta = timedelta(days=self.oldest_article)
        now = dt.today()
        oldest_date = now - delta

        # Extract a list of dates from the page.
        # Subset this out to the list of target dates for extraction.
        date_list = []
        for div in soup.findAll('div', attrs={'id': "dayheader"}):
            date_list.append(self.tag_to_string(div))
        date_list_clean = [re.sub(r'[^\w]', ' ', date) for date in date_list]
        date_list_bool = [
            parse_date(date).date() >= oldest_date
            for date in date_list_clean
        ]
        compress_date = list(compress(date_list, date_list_bool))

        # Process each paragraph one by one.
        # Stop when the text of the previous div is not in the target date list.
        for div in soup.findAll('div', attrs={'class': "mobile-front"}):
            for p in div.findAll('p'):
                if self.tag_to_string(p.findPreviousSibling('div')) in compress_date:
                    if p.find('a'):
                        title = self.tag_to_string(p)
                        link = p.find('a')['href']
                        if self.tag_to_string(p.findPreviousSibling('h3')
                                              ) == "Articles of Note":
                            articles_note.append({
                                'title': title,
                                'url': link,
                                'description': '',
                                'date': ''
                            })
                        elif self.tag_to_string(p.findPreviousSibling('h3')
                                                ) == "New Books":
                            new_books.append({
                                'title': title,
                                'url': link,
                                'description': '',
                                'date': ''
                            })
                        else:
                            essays.append({
                                'title': title,
                                'url': link,
                                'description': '',
                                'date': ''
                            })
                else:
                    break
        feeds.append(('Articles of Note', articles_note))
        feeds.append(('New Books', new_books))
        feeds.append(('Essays and Opinions', essays))
        return feeds
PK�X0���''alejakomiksu_com.png�PNG


IHDR��h6�IDATx�c��ɜ� �b���2�I�A2��ՠhظY��X|�dɏߥ?����~�5 �A����Y�Q��AL_[��	�/?�?|�ڀ�J%�}���_� _BFB,-Er�>����i"
�Ar�HϞ+Y[#y��ԫҟA��E��������j�i���=�~���0l~��~�T:%Y���F��
ɽ�nݗ��G�O����@�N��o�#ǥ%�������1��*��/	d�� +q���g����A��tx����Ro?J�x�{yJ�\#�c���u�_�|�&��a�Z��"ɝ{�l�9�E�}%��%+*%%_}����]������Dj���������x|��������ҿ�OE�p��⟿HO�"��&��(�(+.%"��%�q}����qK�?�������������pKC���'�+Wf�t'�s+�JU�I�ˈ��J��x��i@ Ksg1A��@� %.���lov��	��P�����1IEND�B`�PK�X�f�*alejakomiksu_com.recipe__license__ = 'GPL v3'
import re
from calibre.web.feeds.news import BasicNewsRecipe


class AlejaKomiksu(BasicNewsRecipe):
    title = u'Aleja Komiksu'
    __author__ = 'fenuks'
    description = u'Serwis poświęcony komiksom. Najnowsze wieści, recenzje, artykuły, wywiady, galerie, komiksy online, konkursy, linki, baza komiksów online.'
    category = 'comics'
    language = 'pl'
    extra_css = 'ul {list-style-type: none;} .gfx_news {float: right;}'
    cover_url = 'http://www.alejakomiksu.com/gfx/build/logo.png'
    masthead_url = 'http://www.alejakomiksu.com/gfx/build/logo.png'
    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'}

    keep_only_tags = dict(attrs={'class': ['akNews__header','akNews__body']})

    feeds = [(u'Wiadomości', 'http://www.alejakomiksu.com/rss.php5')]

    def skip_ad_pages(self, soup):
        tag = soup.find(attrs={'class': 'rodzaj'})
        if tag and tag.a.string.lower().strip() == 'recenzje':
            link = soup.find(text=re.compile('recenzuje'))
            if link:
                return self.index_to_soup(link.parent['href'], raw=True)
PK�X
��a!!alleroedlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�XP�?#__alleroedlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Allerød Nyt: RSS feed: Seneste nyt - alleroed.lokalavisen.dk
'''


class AlleroedLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Allerød Nyt - alleroed.lokalavisen.dk'
    description = ('RSS feed med sidste nyt fra Allerød Nyt. Der er nye historier flere gange dagligt'
                   ' - få de seneste nyheder fra dit lokalområde automatisk. Allerød Nyt. alleroed.lokalavisen.dk')
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Allerød Nyt', 'http://alleroed.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Allerød Nyt', 'http://alleroed.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Allerød Nyt', 'http://alleroed.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Allerød Nyt', 'http://alleroed.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Allerød Nyt', 'http://alleroed.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Allerød Nyt', 'http://alleroed.lokalavisen.dk/section/senestelaeserbreverss'),
        ('Allerød Nyt: RSS feed: Seneste nyt - alleroed.lokalavisen.dk', 'http://alleroed.lokalavisen.dk/section/rss'),

    ]

PK�X�7K'wwalt_om_herning.png�PNG


IHDR  D���pPLTE�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:l�(K�tRNSEm���tQ&
@�����ʙS5�������Lb�ڛc>-*8W��y��(u�"z��R7��d�3�
����^�N,�J� o}|{6nx��0X��p��/!	��`�gM�$Ͱ����̮���Ƙl��T���ke�'�;�i�#2���OV�H��Kh�_sC���Y١B�vU[��Ⱦ)]�.�x
�IDATx�\�S�@�3Mm;N���6/����:^6��p�����@0�D)O$S�̟�\^����IM7L�X���@�\�Ū�z��k�v��#�?��`8�d��l�PMc�^����a`��$^ʦ5Az 8}���m۶m۶m۶�ۨW���!i��CN�.pus��<<uE�����
��Y���G�ފ�!t�p����d|

�.OKDq�Q�	����d.Hܫ�HNadj��"�L�c�d� 7��<%<}�Ȅl�E�'g�� ��ں�� SF�`��f��*Qc�բҌu�`�np��C�1��
�Д�5C��q���������	�}�Jt<`D�;H;HC��[|L�_C�.�mN�ߓ���>���G8t�sS�B�)��'a`�$�������90����"�Gl�C8^ȩ#r��/�:ctV��$D���V��4�����>��>3����f�y!��F<{��$�����'��}���-�u�l⳴�|5]m�lZ�$=&���Yк��FAP��f��S��f�9mon��:�Z��91���K�_=8xE�j�`5�H���@AHog���Yx��ݨ�#i1-"��u��2S�%O�r�zE�TƔN��]�
~h���D�Q��#6U_��Lj�j��\FWo�Ͽ`���׀�~���O8��;���i�H�Е�@��?l]�o�������$��ƕ�;�%!�ҙ�6IEND�B`�PK�X'�U��alt_om_herning.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Rasmus Lauritsen <rasmus at lauritsen.info>'
'''
aoh.dk
'''

from calibre.web.feeds.news import BasicNewsRecipe


class aoh_dk(BasicNewsRecipe):
    title = 'Alt om Herning'
    __author__ = 'Rasmus Lauritsen'
    description = 'Nyheder fra Herning om omegn'
    publisher = 'Mediehuset Herning Folkeblad'
    category = 'news, local, Denmark'
    oldest_article = 14
    max_articles_per_feed = 50
    no_stylesheets = True
    delay = 1
    encoding = 'utf8'
    use_embedded_content = False
    language = 'da'
    extra_css             = """ body{font-family: Verdana,Arial,sans-serif }
                                img{margin-bottom: 0.4em}
                                .txtContent,.stamp{font-size: small}
                                """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'All news', u'http://aoh.dk/rss.xml')]

    keep_only_tags = [
        dict(name='h1'), dict(name='span', attrs={'class': ['frontpage_body']})
    ]

    remove_tags = [
        dict(name=['object', 'link'])
    ]
PK�X�_�yalternet.png�PNG


IHDR�a�IDATxڝS3�qܾ?۾�ٶm۾*�&��ԩc��m'��d2/6���ۙ�y��{��V��I�c��_�歳Z�Jq�86��yH�
�.��k�	b�� ZE�zXx��S��wxB<&~�W4��b`b��sk�!���ٙY�_/6���I�h����t%!��PXI�S
?��jv'������{3I�ٙp�ؑ�J��c��?$�8ךTdŖ!.�����#�q�ΐd7����c��a.S�+L�kx=���������l���X������W�Cmb�?Xhp�ACRtػS841jp�&֎?�ڃ��4��`y~��鹒K��J���9`�1ȉ�hu8P��xN�e���*�ŕ�fK �>?'0��jS(��<�3�A��<!妣-�'B��u2��9�R�7r|�eY�.Sj�����'���$��F�X�J�|���W�$෍]IEND�B`�PK�XϮ#V��alternet.recipefrom calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe


class Alternet(BasicNewsRecipe):
    title = u'Alternet'
    __author__ = 'rty'
    oldest_article = 7
    max_articles_per_feed = 100
    publisher = 'alternet.org'
    category = 'News, Magazine'
    description = 'News magazine and online community'
    feeds = [
        (u'Front Page', u'http://feeds.feedblitz.com/alternet')
    ]

    remove_attributes = ['width', 'align', 'cellspacing']
    remove_javascript = True
    use_embedded_content = True
    no_stylesheets = True
    language = 'en'
    encoding = 'UTF-8'
    temp_files = []
    articles_are_obfuscated = True

    def get_article_url(self, article):
        return article.get('link',  None)

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        br.open(url)
        response = br.follow_link(url_regex=r'/printversion/[0-9]+', 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

    conversion_options = {'linearize_tables': True}
PK�X�>YCLLaltomdata_dk.png�PNG


IHDR00`�	�lPLTE(#���������yvr���^ZVC?9���51+�//��������khd�����Ԇ��PLH����gg�KK惃�YY萐������띝�uu�==è��" �!!�����IDATx^����� `�{I-/���kLt�	��(LJڟ����9�.π�G9�� `.�[)x���!CY��
�(3��$��k��("���1��`�.uA��M.�DS�i���s��`�����j�76�L�	�h�ǘig�@��r m���(�,H[�#����=$�i̒h1��-����)�ks��2F�a"���%�����fp�u���pt�e^b@ʃ��Ӻ�ѨP	���{v$[6|o4�w"�°$�1Zv��S�8�
ڟp4�߫5��l��%c��ĐW�Psp��JQld��q��
��?=E`�‭�P<0JUk'ߕu�x�1s�Љ��%��2�9%�s�8O
Q�j�Oe&��?[{y�#롮IEND�B`�PK�X�/�k��altomdata_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Alt om DATA, Datatid TechLife - Download, test, antivirus, netværk
'''


class WwwAltomdata_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Alt om DATA, Datatid TechLife - Download, test, antivirus, netværk'

    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    language='da'
    resolve_internal_links = True
    remove_empty_feeds = True
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Alt om DATA, Datatid TechLife', 'http://www.altomdata.dk/feed'),
        ('Kommentarer til Alt om DATA, Datatid TechLife', 'http://www.altomdata.dk/comments/feed'),

    ]

PK�X@�FNN	am730.png�PNG


IHDR  szz�IDATx�՗p�K��m#�m��ڶm۶\�m۶u���f����3�������V�� ����g;�Kc��P�5Z�rM�SX�F}��$��Ӷ��W�";�VtW�
k�e��c錓v�X��`k�\�0ٷ*jGwA���8f�C�����#;�V��K �{C�<oVY�7�U�B|��]B��/�D|����؞8�O�������onl/%��[�ǹ��8�L	�We��F�:�	��0c?d�����4w>͉���f�.c2o�����Ϳ�����jL<�p|5�m+�$&������f�,��>dwf*|�;O�����#9�?���ӸA��)�!k&�3��AdG�e�{��bEDN�:���$�j�p��������٘띃��ApM���a���"s:��{�Fu�=K�W+��;�°�-�'a��N�e��!2�.��ID�'|R�`�g&"��“�,+�7Ŝ�X1�	�Ft7R@Z���G���4�͌|���)�T��*CPh`)�R =�/jGu�1K�`�ș�����#���%2�=m<���"���d̎�9޹pI������J��4VE%�'��9@1$��3c��2�v����0�靠�$/2&���L�@e�%S��RRްr�7@�`	��+��~���L���)
�rq}xlp��� ��T!���2�MČr�S�!%���_�r����t1K��TsX���%d(Sp�S$|R�G�-� �t@������o�����ס�"|[�oW/�;���4�+B�NE������>U1"�63���7�S�9��ə��A�C��
��
8vM�#W8zE�K���Щ[�XoF��
���Ņ�q��u��u	[���m���aŞ�P?��G�a₝��X�޷t|5���e'N��
�ơ#P!��1�F@�����Iυ�Y+@�1淋�R�/��/�=�~	_C;7h����W?�A�����
�~��u*h�����~���\n����Q�����J
Uf>d?�J���YA.ʯ߀a�"T(��Pk�AM����p	J��7�顮Z�uhȕ�4l�6���z]T�/W��B��UFo�鳄ǺCPz�H%��ju�F��ˡi��5~��
�@��S���L�]��
��l�n(#�Qz�؋��.�Xc�o@�g7���F����;y(�	�����>�o�jp�C�����SeL2��@۱Ty5`�2C��X��� ���(��|��M(#�:J4L�
m��b\�aJ�����m�(+3_�{/d���
�B��5(=x�U�n�L:U�~”'JL�=�jۉ{�
�Y��r�أ�8�_�U�1F(B��Jϕ���$��\ۣ/��"$Zd:�0���L΢��WQxM�5cA1��_BJ@W�uɖ�\FeJ�ZSF&@?nL���5ìyPe��!����V����`�=�qi
�G�օ+!�q��	ʛ�35���O��������7��������<F�UIEND�B`�PK�X�T��am730.recipe# vim:fileencoding=UTF-8
from __future__ import unicode_literals
from __future__ import print_function
__license__ = 'GPL v3'
__copyright__ = '2013, Eddie Lau'
__Date__ = ''

'''
Change Log:
2013/09/28 -- update due to website redesign, add cover
2013/03/30 -- first version
'''

try:
    from urllib.parse import unquote
except ImportError:
    from urllib import unquote

from calibre.web.feeds.recipes import BasicNewsRecipe


class AM730(BasicNewsRecipe):
    title = u'AM730'
    __author__ = 'Eddie Lau'
    publisher = 'AM730'
    oldest_article = 1
    max_articles_per_feed = 100
    language = 'zh'
    encoding = 'utf-8'
    auto_cleanup = False
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    description = 'http://www.am730.com.hk'
    category = 'Chinese, News, Hong Kong'
    masthead_url = 'https://upload.wikimedia.org/wikipedia/en/5/58/Am730_Hong_Kong_newspaper_logo.png'
    extra_css = 'img {display: block; margin-left: auto; margin-right: auto; margin-top: 20px; margin-bottom: 20px; max-height:70%;} div[id=articleHeader] {font-size:200%; text-align:left; font-weight:bold;} li {font-size:50%; margin-left:auto; margin-right:auto;}'  # noqa
    remove_tags =[dict(name='div',attrs={'class':'col-xs-12 col-sm-1 col-md-1 share-button'}),
                dict(name='div',attrs={'class':'logo-container print-logo'}),
                dict(name='div',attrs={'id':'galleria'})]
    keep_only_tags = [dict(name='div', attrs={'class': 'col-xs-12 col-sm-12 col-md-12 news-detail-content-container'}),
                     # dict(name='div',attrs={'class':'columns-left'})]
                     ]
    compress_news_images = True
    compress_news_images_auto_size = 16
    compress_news_images_max_size = 20  # kB
    scale_news_images =(600,800)
    ignore_duplicate_articles = {'title', 'url'}

    debug=False

    def get_cover_url(self):
        return self.masthead_url

    def getAMSectionArticles(self, sectionName,url):
        # print sectionName
        soup = self.index_to_soup(url)
        articles = []
        for aTag in soup.findAll('a',attrs={'class':'newsimglink'}):
            href = aTag.get('href',False)
            if not href.encode("utf-8").startswith(url.encode("utf-8")) :
                continue  # not in same section

            title = href.split('/')[-1].split('-')[0]
            title = unquote(title.encode('ASCII'))  # .decode('utf-8')
            if self.debug:
                print(title)
            try:
                if articles.index({'title':title,'url':href})>=0:
                    # print 'already added'
                    continue  # already added
            except:
                pass

            articles.append({'title':title,'url':href})

            if (len(articles) >= self.max_articles_per_feed):
                break
        if self.debug:
            print(articles)
        return (sectionName,articles)

    def parse_index(self):
        # hard code sections
        Sections=[('新聞','https://www.am730.com.hk/news/%E6%96%B0%E8%81%9E'),
        ('財經','https://www.am730.com.hk/news/%E8%B2%A1%E7%B6%93'),
        ('健康','https://www.am730.com.hk/news/%E5%81%A5%E5%BA%B7'),
        ('科技','https://www.am730.com.hk/news/%E7%A7%91%E6%8A%80'),
        ('體育','https://www.am730.com.hk/news/%E9%AB%94%E8%82%B2'),
        ('娛樂','https://www.am730.com.hk/news/%E5%A8%9B%E6%A8%82'),
        ('旅遊.飲食','https://www.am730.com.hk/news/%E6%97%85%E9%81%8A.%E9%A3%B2%E9%A3%9F')
         ]       # articles =[]
        SectionsArticles=[]
        for (title, url) in Sections:
            if self.debug:
                print(title)
                print(url)
            SectionsArticles.append(self.getAMSectionArticles(title,url))
#        feeds.append(articles[0]['url'])
        return SectionsArticles
PK�Xw%����amagerbladet_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Amagerbladet
'''


class Amagerbladet_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Amagerbladet'

    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Amagerbladet', 'http://minby.dk/amagerbladet/feed/'),
        ('Kommentarer til Amagerbladet', 'http://minby.dk/amagerbladet/comments/feed/'),

    ]

PK�XQ�����
ambito.png�PNG


IHDR(-S-PLTEIx�T��k��v�ӂ�׎�ۤ������������������������WIDATx�M�K�@@dԘ����<zG�n��Z�h�8�\��0���^�aalV@f�f������!7g7���+:`F��G�:dIF��WG��9IEND�B`�PK�X��OB�	�	
ambito.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2008-2021, Darko Miletic <darko.miletic at gmail.com>'
'''
ambito.com
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes


class Ambito(BasicNewsRecipe):
    title = 'Ambito.com'
    __author__ = 'Darko Miletic'
    description = 'Ambito.com con noticias del Diario Ambito Financiero de Buenos Aires'
    publisher = 'Editorial Nefir S.A.'
    category = 'news, politics, economy, finances, Argentina'
    oldest_article = 1.2
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    remove_empty_feeds = True
    compress_news_images = True
    scale_news_images_to_device = True
    ignore_duplicate_articles = {'url'}
    language = 'es_AR'
    publication_type = 'newsportal'
    masthead_url = 'https://www.ambito.com/css-custom/239/images/logo-239-2020v2.svg'
    extra_css = """
        body{font-family: Roboto, sans-serif}
    """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    keep_only_tags = [
        classes(
            'detail-highlighted-multimedia news-headline__publication-date news-headline__title'
            ' news-headline__author-wrapper news-headline__article-summary'
        ),
        dict(name='article', attrs={'class': lambda x: x and 'article-body' in x.split()}),
    ]
    remove_tags = [
        dict(name=['object', 'link', 'embed', 'iframe', 'meta', 'link'])
    ]

    feeds = [
        (u'Portada', u'https://www.ambito.com/rss/home.xml'),
        (u'Economia', u'https://www.ambito.com/rss/economia.xml'),
        (u'Finanzas', u'https://www.ambito.com/rss/finanzas.xml'),
        (u'Politica', u'https://www.ambito.com/rss/politica.xml'),
        (u'Opinion', u'https://www.ambito.com/rss/opinion.xml'),
        (u'Informacion General', u'https://www.ambito.com/rss/informacion-general.xml'),
        (u'Mundo', u'https://www.ambito.com/rss/mundo.xml'),
        (u'Deportes', u'https://www.ambito.com/rss/deportes.xml'),
        (u'Espectaculos', u'https://www.ambito.com/rss/espectaculos.xml'),
        (u'Nacional', u'https://www.ambito.com/rss/nacional.xml')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-td-src-property':True}):
            img['src'] = img['data-td-src-property']
        return soup
PK�XQ�����ambito_financiero.png�PNG


IHDR(-S-PLTEIx�T��k��v�ӂ�׎�ۤ������������������������WIDATx�M�K�@@dԘ����<zG�n��Z�h�8�\��0���^�aalV@f�f������!7g7���+:`F��G�:dIF��WG��9IEND�B`�PK�X'�9��ambito_financiero.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2011 - 2021, Darko Miletic <darko.miletic at gmail.com>'
'''
https://www.ambito.com/contenidos/edicion-impresa.html
'''

import time
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class Ambito_Financiero(BasicNewsRecipe):
    title = 'Ambito Financiero'
    __author__ = 'Darko Miletic'
    description = 'Informacion Libre las 24 horas'
    publisher = 'Editorial Nefir S.A.'
    category = 'news, politics, economy, Argentina'
    no_stylesheets = True
    encoding = 'utf8'
    publication_type = 'newspaper'
    needs_subscription = True
    use_embedded_content = False
    language = 'es_AR'
    fetch_retries = 10
    delay = 1
    timeout                = 8
    ignore_duplicate_articles = {'url'}
    INDEX = 'https://www.ambito.com/contenidos/edicion-impresa.html'
    LOGIN = 'https://usuarios.ambito.com/singup'
    LOGOUT = 'https://usuarios.ambito.com/logout'
    extra_css = """
                    body{font-family: Roboto, "Helvetica Neue", Arial, sans-serif;}
                    .title{font-family: "IBM Plex Sans", "Helvetica Neue", Arial, sans-serif}
                """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'detail-header-wrapper'}),
        dict(attrs={'class': lambda x: x and 'detail-body' in x.split()}),
    ]
    remove_tags = [
      dict(name=['object', 'link', 'embed', 'iframe', 'meta', 'link', 'img']),
      dict(attrs={"class": lambda x: x and 'detail-gallery' in x.split()})
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.INDEX)
        br.open(self.LOGIN)
        if self.username is not None and self.password is not None:
            br.select_form(name='td_login')
            br['login_user'] = self.username
            br['login_pass'] = self.password
            br.submit()
        return br

    def parse_index(self):
        soup = self.index_to_soup(self.INDEX)
        articles = []
        checker = []
        printed = soup.find('div', attrs={"class":"view-printed-edition"})
        if printed:
            dimg = printed.find('img', attrs={"class":"lightbox"})
            if dimg:
                self.cover_url = dimg['src']
        for feed_link in soup.find_all('h2', attrs={"class": "title"}):
            url = feed_link.a['href']
            title = self.tag_to_string(feed_link.a)
            date = strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
            if url not in checker:
                checker.append(url)
                articles.append({
                    'title': title,
                    'date': date,
                    'url': url,
                    'description': u''
                })
        return [(self.title, articles)]

    def cleanup(self):
        self.browser.open(self.LOGOUT)
PK�X���mmamerican_thinker.png�PNG


IHDR�M�4IDATx5��Oa���]�hi%�$I4F5n��dL���.&��.��A7b\����!�ER�MA@�~a{��K�#�	���}\g�"PӴ5c�S�ad(�0�!�V�ڵ�i�RQ.�x�PS����Y�u��hl~kl5;=�	d߅ b�d8�a�ۍ�O8$n�{:��ヱR�rCM)H#)hK�7�.!�!�������F����a�BcD�N�p�<	
v6�t���" P!�`\���<{�Է�T�:�Dg
Έ�rgr�$8���^��
#C\�A5����<�C)�߭Ww��7o=����x���ŃV���g�&�zy4J�A!��^���o}Y�,�T>;2"u8?e~^SWM��R��_[y��G�'���`���~��y~ �������a���8���îm�vj�եL&C�s�����ͯ��r�o����bB�Ӣ-���в�'��D�X�f�Zy���e1FcԤ���k�h)�񳅉�i��0 E���sg�z�SB"��д�W��ٙa��-@���IEND�B`�PK�X2��77american_thinker.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Walt Anthony <workshop.northpole at gmail.com>'
'''
www.americanthinker.com
'''
import html5lib
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.utils.cleantext import clean_xml_chars
from lxml import etree


class AmericanThinker(BasicNewsRecipe):
    title = u'American Thinker'
    description = "American Thinker is a daily internet publication devoted to the thoughtful exploration of issues of importance to Americans."
    __author__ = 'Walt Anthony'
    publisher = 'Thomas Lifson'
    category = 'news, politics, USA'
    oldest_article = 7  # days
    max_articles_per_feed = 50
    summary_length = 150
    language = 'en'
    ignore_duplicate_articles = {'title', 'url'}

    remove_javascript = True
    auto_cleanup = True

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    def preprocess_raw_html(self, raw, url):
        root = html5lib.parse(
            clean_xml_chars(raw), treebuilder='lxml',
            namespaceHTMLElements=False)
        for x in root.xpath('''descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' article_body ') and (@class and contains(concat(' ', normalize-space(@class), ' '), ' bottom '))]'''):  # noqa
            x.getparent().remove(x)
        return etree.tostring(root, encoding='unicode')

    feeds = [(u'http://feeds.feedburner.com/americanthinker'),
             (u'http://feeds.feedburner.com/AmericanThinkerBlog')
             ]
PK�X�e~b��
amspec.png�PNG


IHDR(-S�PLTE���17�:?Ɓ�Β�И�қ������ѳW\�Z_�]b�im�lpǂ�̏��&ϕ��(.�.4֤�ק�ت�ڭ���ƒ�������7=�����ίOSʉ�Ӟ�Ԡ��fj��=B�os�cg��̛")�uy�IN��ڝ%+���������~��TY�rv�+1�`eˌ�۰�ܳ��ñQVȆ�ԡ�ɇ�����������>��IDATx�\σADѵ���l��?��_���'¼�7���𪵓�#-�לF_�"oV��sw;i�)���2���G�r�]�t>�%��k��$`��hɢ��%:r�����%$m�8�n���.U�\bn�U��P�IKmj��b��VE(�u��8�;���e!Ab�dIEND�B`�PK�X� ��
amspec.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
spectator.org
'''

from calibre.web.feeds.news import BasicNewsRecipe
from css_selectors import Select


class TheAmericanSpectator(BasicNewsRecipe):
    title = 'The American Spectator'
    __author__ = 'Kovid Goyal'
    description = 'News from USA'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'en'
    auto_cleanup = True
    encoding = 'utf-8'

    def parse_index(self):
        root = self.index_to_soup(
            'http://spectator.org/issues/current', as_tree=True)
        select = Select(root)
        main = tuple(select('div#block-system-main'))[0]
        feeds = []
        for div in select('div.item-list', main):
            for h3 in div.xpath('./h3'):
                section_title = self.tag_to_string(h3)
                self.log('\n' + section_title)
                break
            else:
                continue
            articles = []
            for li in div.xpath('descendant::li'):
                for x in select('div.views-field-title', li):
                    title = self.tag_to_string(x)
                    break
                else:
                    raise ValueError('No article title found')
                url = 'http://spectator.org' + li.xpath('./a/@href')[0]
                desc = ''
                for x in select('div.views-field-field-short-summary', li):
                    desc = self.tag_to_string(x)
                    break
                articles.append(
                    {'title': title, 'url': url, 'description': desc})
                self.log('\t', title, 'at', url)
            feeds.append((section_title, articles))
        return feeds
PK�XG�h�xxan_druma_mor.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AnDrumaMor(BasicNewsRecipe):
    title = u'An Druma M\xf3r'
    __author__ = "David O'Callaghan"
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'ga'
    use_embedded_content = True

    feeds = [(u'Nuacht Laeth\xfail',
              u'http://feeds.feedburner.com/NuachtLneLaethilArAnDrumaMr')]
PK�X��hh
anandtech.png�PNG


IHDR�a/IDATx�}�C`$k�ضG�m۶m�N�[۶m۶Okۨ��c��fu���xh�l]l��0\��������:�7��&�)��
�QrE�kh>y��yZ������T�MSPy��)Kw��i՗y�E����+27�D��+#0��s���H�viT��W����e��Y;��<��"W뿏]�N���_}�]}�S@�*�ߚ�l���jfSX�,���pYq
�K/���6�(�9��f�r�\���%Kב�a�[x	�6bƘJo���jy|iǗQ|�O�Nj��d\�Oid�Yv�5&�e	
(��j1�.R��(
DX!~���\���+�1c�ЂH+��2���P����joA�YF96Lg�!�f�GA��>>%��w�,��P�����F��:&��t��X��M
?��� �A�ˠ6��L�F��x6&&Ȕ���g�2^�0Ծ*�OC-w�F&��19Ȕ���‹m�vBa�)��;Q�8�je�9�q�w���O�h�T��(h]�Z�<K��T�#s��_����^
IEND�B`�PK�X
z66anandtech.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch Anandtech.
'''

from calibre.web.feeds.news import BasicNewsRecipe


class anan(BasicNewsRecipe):

    title = 'Anandtech'
    description = 'comprehensive Hardware Tests'
    __author__ = 'Oliver Niesner, Armin Geller'  # 2014-02-27 AGE: update
    use_embedded_content = False
    language = 'en'
    timefmt = ' [%d %b %Y]'
    oldest_article = 7
    max_articles_per_feed = 40
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'

    cover_url = 'http://www.anandtech.com/content/images/globals/header_logo.png'
    masthead_url = 'http://www.anandtech.com/content/images/globals/printheader.png'

    keep_only_tags = [
        dict(name='section', attrs={'class': ['main_cont']}),
    ]
    remove_tags = [
        dict(name='div', attrs={'class': ['print',
                                          'breadcrumb_area noprint',
                                          'fl-rt noprint',
                                          'blog_top_right', ]})
    ]

    feeds = [('Anandtech', 'http://www.anandtech.com/rss/')]

    def print_version(self, url):
        # return url.replace("0Cshow0C", "0Cprint0C") # 2013-09-07 AGE: update
        return url.replace("/show/", "/print/")  # 2014-02-27 AGE: update
PK�X&y!1��anchorage_daily.png�PNG


IHDR  ���IDATx^��_L\E�g��.P��,���/P�PXXH�]��)�
m,M�'�c�&��oU�}�I}�11�h�TE}�QѢi�T�WJ7�O��Ϝ�������sg��~�;�]��Dž	I�7�^����b����Bk�i�̈́><"����o	��;��!	E��]�ي�����j�����KH	+���Y%	)6�	T+rSV���QH��.A�}�@�ˆ���aX
�3��k���5lԡ� G�A Xq������P�B�X�
tY�%��1\%x�~�cPZ}�G�_�!��	)���
�R����)���'Yr�w�x��㉶=�t�Õ�٧�W��i{"�h��ndd�5VQ�ҁ��ʊ�K?wz �{F����}�{d�;{yrj����믝颭;w�͍�3'S���C�&o�r*3�:P\�e�����xyYQ��E��j.��s9S�?N�e�O?�o���A�h�ԉdg[���Y0���hK�����\Nr^	��A�[3��՟�wI������V�-gq���c4�/.-_�:Id���g(9s[���Z�+˅V?O�~��5JG^>���Qbo@u��VO�6s���$�G�k2@�T���2?�l��nҤbg�KgG}��俟��C���+V	�h��4���%p�ʶ����?��i��77~�P��zgks�`��E�.j�c�e&��~a������ȶC��Ó��ë������ثɯ�VϽ}%��}���'�!�gG�t�ˉ_l�����K.�L�ѓl(+-~�?ne���>f��.�q���
��@�۴��5��2��Ğ��|�﹅�Ά/~m��=]M$��GRze�Em���Q��W.,��J�7�UF"~�%>ucNK�u%�Q���(�y�o!9<\MS<�!iGO���3a2��PI��(Mҧ�ٷ=�Ѿk�{�O��Q`b{�Q���I��A7�W���aYV���ᐠB
D����*�@��rn�	�k1��o2B�qg�
���@�jp�'�u`��!�pI�x����T9� ��p�p\�K�wt�E�dP)�ZN@c(\���9i�H��⸺��[��P&�;w-<��:�Nڅ' �]���@ե�-�M�r����IEND�B`�PK�X����anchorage_daily.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1278347258(BasicNewsRecipe):
    title = u'Anchorage Daily News'
    __author__ = 'rty'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Alaska News', u'http://www.adn.com/rss-feeds/feed/all'),
             (u'Politics', u'http://www.adn.com/rss-feeds/feed/politics'),
             ]
    description           = ''''Alaska's Newspaper'''
    publisher = 'http://www.adn.com'
    category = 'news, Alaska, Anchorage'
    language = 'en'
    extra_css = '''
                p{font-weight: normal;text-align: justify}
               '''
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en'
    encoding = 'utf-8'
    conversion_options = {'linearize_tables': True}
    masthead_url = 'http://media.adn.com/includes/assets/images/adn_logo.2.gif'

PK�X��Yyyandhrajyothy_ap.png�PNG


IHDR�a@IDAT8�m�KlTu�߽w��t��q�����")��k}�hbܐ�QÆ$��D�c���F%
��&��P�-S�}�郶��u�]�&�z��w��%G� ���ɔ���(�C�.�J�}��^���f�:�A6���J��ξ�#��M!�{Bj
��Z�B��{�$��xfW9��g}�qc6���ϻF��u������
�^�������/��H4@��"N��R꼮�*��o�E�<sn�6���XK

�|��#�u�j2k|�;I��EcuC�V0Ӧ��
��d�����J�]�2Fe��'J1-E�O�8m:�ڧ/>R���Ro}5�\Id��2}��#��g����N���ǁe��m��d��R/�?T��j�^�|<E*cj�A��絏iJa�<8��ߢ��6�+⥽!B�.�(G�;��j��i�r����6V�N�6�Z_��p}<���%ڻF�b)���Fx�b��M���a{����'�,t��ZQJ������/�_�cg�Ǯ�$��4>P��b���Ŵ�h:m�Ȅi�>�\' �k͛�:J��l�R�{��8%�n,K�i��W�L�'�h�&W�+�Y\N�����<�lE�w�yW�7m"�s�cd���U�P�w���]n�X�+�g�p����y��AC�9ŭ�$��
9���qۮ"��d�3��U�}�c����h��{���TҲ�l�z�6C;�Js��J���<A�`����`�W��5wn)>,"	�hPJ�Ri����c�\p��-��6��v����E�V��?gւ���J���lΣ�b�6	�="b�{�l�[���6�IEND�B`�PK�X)��4��andhrajyothy_ap.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import json
from datetime import date
from collections import defaultdict

# figure out your local edition id from the log of this recipe
edi_id = 182 # NTR VIJAYAWADA - 182

today = date.today().strftime('%d/%m/%Y')

# for older edition
# today = '15/01/2024'

day, month, year = (int(x) for x in today.split('/'))
dt = date(year, month, day)
today = today.replace('/', '%2F')

index = 'https://epaper.andhrajyothy.com'

class andhra(BasicNewsRecipe):
    title = 'ఆంధ్రజ్యోతి - ఆంధ్రప్రదేశ్'
    language = 'te'
    __author__ = 'unkn0wn'
    masthead_url = 'https://upload.wikimedia.org/wikipedia/commons/0/01/Andhra_Jyothi_newspaper_logo.png'
    timefmt = ' [' + dt.strftime('%b %d, %Y') + ']'
    description = 'Articles from the ABN Andhra Jyothy epaper, digital edition'
    encoding = 'utf-8'
    remove_empty_feeds = True

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            self.title = 'ఆంధ్రజ్యోతి ' + dt.strftime('%b %d, %Y')

    extra_css = '''
        .cap { text-align:center; font-size:small; }
        img { display:block; margin:0 auto; }
    '''

    def parse_index(self):

        self.log(
            '\n***\nif this recipe fails, report it on: '
            'https://www.mobileread.com/forums/forumdisplay.php?f=228\n***\n'
        )

        get_edition = index + '/Home/GetEditionsHierarchy'
        edi_data = json.loads(self.index_to_soup(get_edition, raw=True))
        self.log('## For your local edition id, modify this recipe to match your edi_id from the cities below\n')
        for edi in edi_data:
            if edi['org_location'] in {'Magazines', 'Navya Daily'}:
                    continue
            self.log(edi['org_location'])
            cities = []
            for edi_loc in edi['editionlocation']:
                cities.append(edi_loc['Editionlocation'] + ' - ' + edi_loc['EditionId'])
            self.log('\t', ',\n\t'.join(cities))

        self.log('\nDownloading: Edition ID - ', edi_id)
        url = index + '/Home/GetAllpages?editionid=' + str(edi_id) + '&editiondate=' + today
        main_data = json.loads(self.index_to_soup(url, raw=True))

        feeds_dict = defaultdict(list)

        for page in main_data:
            sec_name = page['PageNo'] + 'వ పేజీ'
            if page['PageNumber'] == 'Page 1':
                self.cover_url = page['HighResolution']
            art = index + '/Home/getingRectangleObject?pageid=' + str(page['PageId'])
            raw2 = self.index_to_soup(art, raw=True)
            art_data = json.loads(raw2)
            for snaps in art_data:
                section = sec_name
                url = str(snaps['OrgId'])
                if snaps['ObjectType'] == 4:
                    continue
                feeds_dict[section].append({"title": '', "url": url})
        return [(section, articles) for section, articles in feeds_dict.items()]

    def preprocess_raw_html(self, raw, *a):
        data = json.loads(raw)
        body = ''
        for x in data['StoryContent']:
            if x['Headlines']:
                if len(x['Headlines']) > 0:
                    body += '<h1>' + x['Headlines'][0].replace('\n', ' ') + '</h1>'
                for y in x['Headlines'][1:]:
                    body += '<h4>' + y.replace('\n', ' ') + '</h4>'
        if data['LinkPicture']:
            for pics in data['LinkPicture']:
                if pics['fullpathlinkpic']:
                    body += '<div><img src="{}"></div>'.format(pics['fullpathlinkpic'])
                if pics['caption']:
                    body += '<div class="cap">' + pics['caption'] + '</div><p>'
        for x in data['StoryContent']:
            if x['Body'] and x['Body'] != '':
                body += '<span class="body">' + x['Body'] + '</span>'
        # if data['filepathstorypic']: # this gives you a snap image of the article from page
        #     body += '<div><img src="{}"></div>'.format(data['filepathstorypic'].replace('\\', '/'))
        if body.strip() == '':
            self.abort_article('no article')
        return '<html><body><div>' + body + '</div></body></html>'

    def populate_article_metadata(self, article, soup, first):
        article.url = '***'
        h1 = soup.find('h1')
        h4 = soup.find('h4')
        body = soup.find(attrs={'class':'body'})
        if h4:
            article.summary = self.tag_to_string(h4)
            article.text_summary = article.summary
        elif body:
            article.summary = ' '.join(self.tag_to_string(body).split()[:15]) + '...'
            article.text_summary = article.summary
        article.title = 'ఆంధ్రజ్యోతి'
        if h1:
            article.title = self.tag_to_string(h1)
        elif body:
            article.title = ' '.join(self.tag_to_string(body).split()[:7]) + '...'

    def print_version(self, url):
        return index + '/User/ShowArticleView?OrgId=' + url
PK�X��Yyyandhrajyothy_tel.png�PNG


IHDR�a@IDAT8�m�KlTu�߽w��t��q�����")��k}�hbܐ�QÆ$��D�c���F%
��&��P�-S�}�郶��u�]�&�z��w��%G� ���ɔ���(�C�.�J�}��^���f�:�A6���J��ξ�#��M!�{Bj
��Z�B��{�$��xfW9��g}�qc6���ϻF��u������
�^�������/��H4@��"N��R꼮�*��o�E�<sn�6���XK

�|��#�u�j2k|�;I��EcuC�V0Ӧ��
��d�����J�]�2Fe��'J1-E�O�8m:�ڧ/>R���Ro}5�\Id��2}��#��g����N���ǁe��m��d��R/�?T��j�^�|<E*cj�A��絏iJa�<8��ߢ��6�+⥽!B�.�(G�;��j��i�r����6V�N�6�Z_��p}<���%ڻF�b)���Fx�b��M���a{����'�,t��ZQJ������/�_�cg�Ǯ�$��4>P��b���Ŵ�h:m�Ȅi�>�\' �k͛�:J��l�R�{��8%�n,K�i��W�L�'�h�&W�+�Y\N�����<�lE�w�yW�7m"�s�cd���U�P�w���]n�X�+�g�p����y��AC�9ŭ�$��
9���qۮ"��d�3��U�}�c����h��{���TҲ�l�z�6C;�Js��J���<A�`����`�W��5wn)>,"	�hPJ�Ri����c�\p��-��6��v����E�V��?gւ���J���lΣ�b�6	�="b�{�l�[���6�IEND�B`�PK�XQg����andhrajyothy_tel.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import json
from datetime import date
from collections import defaultdict

# figure out your local edition id from the log of this recipe
edi_id = 225 # TELANGANA MAIN II - 225

today = date.today().strftime('%d/%m/%Y')

# for older edition
# today = '15/01/2024'

day, month, year = (int(x) for x in today.split('/'))
dt = date(year, month, day)
today = today.replace('/', '%2F')

index = 'https://epaper.andhrajyothy.com'

class andhra(BasicNewsRecipe):
    title = 'ఆంధ్రజ్యోతి - తెలంగాణ'
    language = 'te'
    __author__ = 'unkn0wn'
    masthead_url = 'https://upload.wikimedia.org/wikipedia/commons/0/01/Andhra_Jyothi_newspaper_logo.png'
    timefmt = ' [' + dt.strftime('%b %d, %Y') + ']'
    description = 'Articles from the ABN Andhra Jyothy epaper, digital edition'
    encoding = 'utf-8'
    remove_empty_feeds = True

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            self.title = 'ఆంధ్రజ్యోతి ' + dt.strftime('%b %d, %Y')

    extra_css = '''
        .cap { text-align:center; font-size:small; }
        img { display:block; margin:0 auto; }
    '''

    def parse_index(self):

        self.log(
            '\n***\nif this recipe fails, report it on: '
            'https://www.mobileread.com/forums/forumdisplay.php?f=228\n***\n'
        )

        get_edition = index + '/Home/GetEditionsHierarchy'
        edi_data = json.loads(self.index_to_soup(get_edition, raw=True))
        self.log('## For your local edition id, modify this recipe to match your edi_id from the cities below\n')
        for edi in edi_data:
            if edi['org_location'] in {'Magazines', 'Navya Daily'}:
                    continue
            self.log(edi['org_location'])
            cities = []
            for edi_loc in edi['editionlocation']:
                cities.append(edi_loc['Editionlocation'] + ' - ' + edi_loc['EditionId'])
            self.log('\t', ',\n\t'.join(cities))

        self.log('\nDownloading: Edition ID - ', edi_id)
        url = index + '/Home/GetAllpages?editionid=' + str(edi_id) + '&editiondate=' + today
        main_data = json.loads(self.index_to_soup(url, raw=True))

        feeds_dict = defaultdict(list)

        for page in main_data:
            sec_name = page['PageNo'] + 'వ పేజీ'
            if page['PageNumber'] == 'Page 1':
                self.cover_url = page['HighResolution']
            art = index + '/Home/getingRectangleObject?pageid=' + str(page['PageId'])
            raw2 = self.index_to_soup(art, raw=True)
            art_data = json.loads(raw2)
            for snaps in art_data:
                section = sec_name
                url = str(snaps['OrgId'])
                if snaps['ObjectType'] == 4:
                    continue
                feeds_dict[section].append({"title": '', "url": url})
        return [(section, articles) for section, articles in feeds_dict.items()]

    def preprocess_raw_html(self, raw, *a):
        data = json.loads(raw)
        body = ''
        for x in data['StoryContent']:
            if x['Headlines']:
                if len(x['Headlines']) > 0:
                    body += '<h1>' + x['Headlines'][0].replace('\n', ' ') + '</h1>'
                for y in x['Headlines'][1:]:
                    body += '<h4>' + y.replace('\n', ' ') + '</h4>'
        if data['LinkPicture']:
            for pics in data['LinkPicture']:
                if pics['fullpathlinkpic']:
                    body += '<div><img src="{}"></div>'.format(pics['fullpathlinkpic'])
                if pics['caption']:
                    body += '<div class="cap">' + pics['caption'] + '</div><p>'
        for x in data['StoryContent']:
            if x['Body'] and x['Body'] != '':
                body += '<span class="body">' + x['Body'] + '</span>'
        # if data['filepathstorypic']: # this gives you a snap image of the article from page
        #     body += '<div><img src="{}"></div>'.format(data['filepathstorypic'].replace('\\', '/'))
        if body.strip() == '':
            self.abort_article('no article')
        return '<html><body><div>' + body + '</div></body></html>'

    def populate_article_metadata(self, article, soup, first):
        article.url = '***'
        h1 = soup.find('h1')
        h4 = soup.find('h4')
        body = soup.find(attrs={'class':'body'})
        if h4:
            article.summary = self.tag_to_string(h4)
            article.text_summary = article.summary
        elif body:
            article.summary = ' '.join(self.tag_to_string(body).split()[:15]) + '...'
            article.text_summary = article.summary
        article.title = 'ఆంధ్రజ్యోతి'
        if h1:
            article.title = self.tag_to_string(h1)
        elif body:
            article.title = ' '.join(self.tag_to_string(body).split()[:7]) + '...'

    def print_version(self, url):
        return index + '/User/ShowArticleView?OrgId=' + url
PK�X%�Dpaaandroid_com_pl.png�PNG


IHDR��h6(IDATx�KkSA��sfn�I�-E�ޕ
����S
�� ]�����Q�_-��67�w��y��^�ڀ*
�K1/FΞ�,�l�d#%R�F'�^=�q<�lX�TH%'ڶ�d��ж�AB���J��%�گ:JQB����*�*��ꢨ�k���OI+�Va8�%KӠA�qG "�A?L&�/N�\���w���
�)�!2�'��t���x��ѧ�Xb�tf�N��O�����Mm�����=/_�����_u���-��	�v����f8����9<$F�t.�E]���N��e�1�-�u9��k�ّ������%.Z���HGU�H�/V��>ckK����w�q�&ggī�d�,����4��KoM�]����������D��e6@��9˹�^
����Ʉ�=F#�S����iPE2"��P
M˝;���X&���T��7��"g�l�aF��)!�
8�%�۸3���39{�Vڄ*"�#�;�lo�ZQ
f��3�$Z�M�(NI\re�EMʘaFδ�Y�O��̼�IEND�B`�PK�X��`���android_com_pl.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class Android_com_pl(BasicNewsRecipe):
    title = u'Android.com.pl'
    __author__ = 'fenuks'
    description = u'Android.com.pl - to największe w Polsce centrum Android OS. Znajdziesz tu: nowości, forum, pomoc, recenzje, gry, aplikacje.'
    category = 'Android, mobile'
    language = 'pl'
    cover_url = 'http://android.com.pl/wp-content/themes/android/images/logo.png'
    oldest_article = 8
    max_articles_per_feed = 100
    keep_only_tags = [dict(name='div', attrs={'class': ['title', 'post-content']})]
    remove_tags_after = [{'class': 'post-content'}]
    remove_tags = [dict(name='ul', attrs={'class': 'tags small-tags'}), dict(name='a', attrs={'onclick': 'return ss_plugin_loadpopup_js(this);'})]
    preprocess_regexps = [
        (re.compile(u'<p>.{,1}</p>', re.DOTALL), lambda match: '')]
    feeds = [(u'Android', u'http://android.com.pl/feed/')]
PK�Xx��}��animal_politico.png�PNG


IHDR  D����PLTE�9?����8>�7=�6<�:@�AG���6=����x|�<B�����������������5;�4:�w{����=C�������HN�5<����EK�>C�`e�vz�������>D�����������������������jo�?E�z~����nr�dh������fj�^c�DI�����LR�os�OT������BH�������ch�TY�;A���@F���������bg�GM�SX�{�rv����NS������FL�JO�cg���������CH������?D������gl�IO������������V[�FK������~�������UZ���QV����������@E�������������pu���Z_��������gk�Y^�kp�{��IDATx��σ�D1��N���ڶm۶m���N��9�v�Xą �fh��]鸲;��Qc��LLFVf�⍵����>9o���v�bLRE"~K���)�-U*�4 =��wdI+x6rr�������TP\R��|eUu���'F
x��45K<�ֶײ���Kt���@��>����A`��4?��<2:���Ɓ	7���)`Z0��,07�Uy
��W��k�
Z��ܢ�l�%|W���Ç8RP�8h
��"�:�Μ�����*�����L��G�S���`��/L�$E�b�SIEND�B`�PK�X�ʎ��	�	animal_politico.recipe#!/usr/bin/env python
# encoding: utf-8

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 AnimalPolitico(BasicNewsRecipe):
    title = u'Animal Político'
    description = u'Noticias Políticas'
    __author__ = 'Jose Ortiz'
    masthead_url = 'https://www.animalpolitico.com/wp-content/themes/animalpolitico-2019/static/assets/logo_black.svg'
    language = 'es_MX'
    ignore_duplicate_articles = {'title', 'url'}
    conversion_options = {
        'tags': 'News, Mexico',
        'publisher': 'Animal Politico',
        'comments': description
    }

    keep_only_tags = [classes('ap_single_first ap_single_content ax_single')]
    remove_tags = [classes('ap_single_sharers_head ap_single_sharers_share')]

    def parse_index(self):
        soup = self.index_to_soup('http://www.animalpolitico.com/')
        articles = []
        for a in soup(**{
                'name': 'a',
                'attrs': {
                    'href': True, 'title': True,
                    'data-author': True, 'data-type': True,
                    'data-home-title': True
                }
        }):
            title = a['title']
            url = a['href']
            author = a['data-author']
            self.log('\t', title, ' at ', url)

            articles.append({'title':  title,
                             'author': author,
                             'url':    url})
        ans = {}
        for article in articles:
            if re.match(r'https?://www\.animalpolitico\.com/elsabueso/.', article['url'], re.I):
                ans.setdefault('El Sabueso', []).append(article)
            elif re.match(r'https?://www\.animalpolitico\.com/.', article['url'], re.I):
                ans.setdefault('Noticias', []).append(article)
            elif re.match(r'https?://www\.animalgourmet\.com/.', article['url'], re.I):
                ans.setdefault('Comida', []).append(article)

        return [(sec, ans[sec]) for sec in sorted(ans)]

    def populate_article_metadata(self, article, soup, first):
        if re.match(r'https?://www\.animalpolitico\.com/.', article.url, re.I):
            article.formatted_date = self.tag_to_string(
                soup.find(
                    **classes('ap_single_first')).find(
                        **classes('ap_single_first_info_date')))
PK�XU�-��	�	anthony_muroni.png�PNG


IHDR  ��	]IDATx^-UY�\��=Ý�����nc��"}"(H$A<$y�!o�_��H�2		)���@���`� ���ئ��q�5ܪ;�ν'��lUU_��{��^�����u-����?s����O}��/��!	M�BS�$�%����/���LOk�R�8�����7_�Ə~��B$w�o\��i�e�z�E˲|����+W��8��A<B)��՛�6�<���,��*K�9���k�<�'���U����������7�G�x��W_y�f��ĩc{{{��?�GI���tlG�-U�E�u�)��H!�e��w^X;{"�e����>e�e+������{�c�;��P��$I"$	gэ�ۯ���rxx�f9S4U�����^���2��QI�T�r��q�칓��?����_ۺw������$�TQ��E�
��²���j��ɇ�x�}"I��x���pG�x2�(q��� �u]��$D8���Ξ;��c�N�����IEA�^�-+MsQ�K������n�;v'/rUUKK�n�RV�l ����?ح��P�9��Le�3����RJ�N���(��L�J��������w�y�w�����z�N%)��@+E�e��π�h2��$
�(�u�b�����,K�h:�g�����<��01t}��;Q>��oݤ�\xi�#�aO&��/w��k;�mZ��l�k
�L�f߲,Ppݭk�
����+D����/^4
���|뭿tڽ�}睿*O?�$x���F�C!*�
�d⇦�#�����v���"�����log_�B�yUT�{�_��
!P{E�;��<����'?'��f������0�(�u�;Z�5M�,�r�[^nxn��BnF+5O����j�Ċ
�Ë���^�J��7�8��B<�gQ�&�|2��Q��`�P�ɚc���N�-`�l�!��1j��;�ڙ7�|;A��%���XDY�{�U��y'�C��Q0DU�<�t����V�G���;B�8\s�۷o_�ti:��?��g��@P/J(%4��MF9��@J�v<F����y��a;&f�)!�U���δ�S�N�u��孭��w����
�2Q �P���3���t�1�+Q�ypp�Ly��,�&��k�fE@���Wǁ��=���K�����`0��V�Ykx�n2���<�y�b�&/JB�(I�
haV��	�q���4M9W!�ݝ}�>r��J.�S��0�f���w�������C�Q����"T��fDJU��<�3����)K!���4@^sNR�����y���᾿����w���qf��B+5E��\�5��B�ǞAM.;XF"�-whY�ꞡ* �%]?�HfhZY̙S	�%�̴t�d%s�i��n����j����eBn=Ǟ��3�),�r�p���$�,Nnl݊��7�e!榡%IH%r�*��KK�^���4O[�/-�:]L
n���//
:͖繚�A�\��a#P�#1+T]Ùai�F�j�O=��ک��i���nKSy�QG ��ޮ���0���NR�tb=�GÌ��c�2�B������y�*E�c�D��c�N�vm���M��(�|>�CLè;��yN��eQ�p2��Q�тQ�vƸ����0a&����$������];�ڨه�H�!�.�L���$��\|
U�K)d�9��
�0��0��\�px<��'\�m�V ��8�>����śV����g��fI�-T��\��k:�D!�\U�5X����N&SQJöt�ۼ�}c�6�J	�-{�
!|c0�L���I�0�F��<����X�S�΂\�B��zGU�yV~�G��L�lQT`�	N��,EQ�Յ��p?&	K*�_I ���"܈$������e��ô�Ip��޽����<M+�q�gJ��3�hԺ�d�/��`3Eu��0R���0JUU�%K3\��]�ϻW>��2](�ׄ$�Nm]Vd�&��(�T�u ��ڔ��d����繬h���TSa�5I�ď'�������	��4ky^%K�i��yVI�k���Y�ƲbY^�~E�f9�fQ�
1�E��{����ڕ����GW�z��¡KDIst���Q*}�ċ�3F�J�,��S��,�0�tK[��2�a	Po��q�)�SHʋBB0$e�C���3�?�F��e8��
�*L�4L��-e7⊂ic�a1��$G�|]N�Y!*J9����d�R�R�q�gP�I��x],.�t��H��Q��%J T�GQ���j9$��2-ү�;�E�g֞E�R0\a����D�@�ġ����E��T�!� /jg�I<&��<K�BQ��
W��0�"�kU�G��IEND�B`�PK�XUP�(anthony_muroni.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1501589429(AutomaticNewsRecipe):
    title = 'AnthonyMuroni.it (sardu)'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup = True
    language = 'sc'
    __author__ = 'tzium'

    feeds = [
        ('AnthonyMuroni.it (sardu)', 'http://www.anthonymuroni.it/su/feed/'),
    ]
PK�Xh�����antyweb.png�PNG


IHDR�aLIDATxڬS��[}�����vc.k[Am�=^��x���3k;��{�8i�����
��`�bA�N���J���a�s�O��n�.�P�t)����iӐ>u*����t{�@<f��%&	��s~͞K�5{/"�����Ç�� �@AX*�,A^p��g���a{�E���QN���
��o^|ل	x}�,���Q�lS&����hR� ?���E"n�b��R�"Eb"�3OES�l�EJ
�k��ޕ�]�	|��,��OQ�u+DD��>tϟ�+'m
>]��,r��5��M�b��ƍC�Ǐ0ܿ�A�y��Ȥ�[�r؉�HN��f�̛NJ�Y������Y���
��a�H� 5
>�##E����3f�`��������>�'M���3x��Xu6�H�rCB��̨(�H�sZit�B�l#e�U���L���3��� ��#��<z4<'ȏ���Nj�Ad�!���d$��t� c�Jd&'��'PR���jVR��E�(�z��J,F}AT���k�x��=>�0:��g2X��x<p�����m���6��F�U�M*Е�IEND�B`�PK�X!���antyweb.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.news import BasicNewsRecipe


class AntywebRecipe(BasicNewsRecipe):
    encoding = 'utf-8'
    __license__ = 'GPL v3'
    __author__ = u'Artur Stachecki <artur.stachecki@gmail.com>, adrianf0'
    language = 'pl'
    version = 1
    title = u'Antyweb'
    category = u'News'
    description = u'Blog o internecie i nowych technologiach'
    cover_url = ''
    remove_empty_feeds = True
    auto_cleanup = False
    no_stylesheets = True
    use_embedded_content = False
    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    simultaneous_downloads = 10
    # zignoruj zduplikowane artykuły o takich samych tytułach LUB adresach
    ignore_duplicate_articles = {'title', 'url'}
    scale_news_images = True
    conversion_options = {'tags': u'news, aplikacje mobilne, Android, iOS, Windows Phone ',
                          'smarten_punctuation': True,
                          'publisher': 'AntyWeb'
                          }  # opcje konwersji.

    keep_only_tags = []
    keep_only_tags.append(dict(name='h1'))
    keep_only_tags.append(dict(name='section', attrs={'class': 'article'}))
    remove_tags = []
    remove_tags.append(dict(name='div', attrs={'class': 'ac-footer group'}))

    feeds = [
        (u'News', 'http://feeds.feedburner.com/antyweb'),
        (u'Felietony', 'http://feeds.feedburner.com/AntywebFelietony'),
        (u'Apple', 'http://feeds.feedburner.com/AntywebApple'),
        (u'Gry', 'http://feeds.feedburner.com/AntywebGry'),
        (u'Mobile', 'http://feeds.feedburner.com/AntywebMobile'),
        (u'Startups', 'http://feeds.feedburner.com/AntywebStartups'),
        (u'Google', 'http://feeds.feedburner.com/AntywebGoogle'),
        (u'Microsoft', 'http://feeds.feedburner.com/AntywebMicrosoft')
    ]

    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
PK�X~sj���ap.png�PNG


IHDR  D���2PLTE�������41�52���kkk������fff000HHHbbblll�����(((555wwwxxx���������


~~~������666888<<<BBBIIIRRRTTTVVVXXX___dddeeeggg&&&������������������������������������������������������������������������������������������'''***+++���������������������,,,222�2.444f��tRNS����y6��IDATx���vD1��{�1j��Զm��_Bu]���9���S ���H���hG�aB{��|���t�,7~�ޅ����+3�@���@�-���d�9���<���A;P�]��-�{ &ƀ!��C���@�8IA���2�[B�%&80&�	t/�Hs0���]a��`�Lp�|�uk�	��`�������?;.��F_�E �|��_��aK���ӏDŽ�ɯ�?N��<wjP9���IEND�B`�PK�XN�>��
�
	ap.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2017, Kovid Goyal <kovid at kovidgoyal.net>

import json

from calibre.web.feeds.news import BasicNewsRecipe, classes
from calibre.utils.date import utcnow, parse_date


class AssociatedPress(BasicNewsRecipe):

    title = u'Associated Press'
    description = 'Global news'
    __author__ = 'Kovid Goyal'
    use_embedded_content = False
    language = 'en'
    encoding = 'utf-8'
    no_stylesheets = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = False
    oldest_article = 1.5

    keep_only_tags = [
        classes('Page-headline Page-lead Page-storyBody Page-authorinfo'),
    ]
    remove_tags = [
        classes('Page-actions Enhancement'),
        dict(name='source'),
    ]
    remove_attributes = ['srcset']
    extra_css = '''
    .Figure-caption {
    font-style: italic;
    font-size: smaller;
    margin-left: 1rem; margin-right: 1rem;
    }
    '''

    def parse_index(self):
        feeds = []
        limit = self.test[0] if self.test else 100
        for front in (
            'topnews sports politics entertainment usnews oddities'
            ' Travel technology lifestyle business Health science intlnews'.split()
        ):
            name = {
                'topnews': 'Top News',
                'intlnews': 'International',
                'usnews': 'U.S. News'
            }.get(front, front).capitalize()
            feeds.append([name, self.parse_section(front)])
            if len(feeds) >= limit:
                break
        return feeds

    def parse_section(self, front):
        url = 'https://afs-prod.appspot.com/api/v2/feed/tag?tags=apf-' + front
        self.log('Processing section:', front, 'at', url)
        data = self.index_to_soup(url, raw=True)
        data = json.loads(data)
        cards = data.get('cards', ())
        articles = []

        for card in cards:
            for article in card['contents']:
                url = article['localLinkUrl']
                title = article.get('headline', article.get('flattenedFirstWords'))
                if not title:
                    continue
                title = title.split('\u2014')[-1]
                updated = article.get('updated')
                if updated:
                    updated = parse_date(updated, assume_utc=True)
                    delta = utcnow() - updated
                    if (delta.days*24*3600 + delta.seconds) > 24*3600*self.oldest_article:
                        self.log('Skipping', title, 'as it is too old')
                        continue
                self.log('\tFound article:', title, 'at', url)
                articles.append({'title': title, 'url': url})
        self.log('')
        return articles
PK�X�]FH��apcom.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gabriele Marini, based on Darko Miletic'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
description = 'Italian daily newspaper - 14-05-2010'

'''
http://www.apcom.NET/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Apcom(BasicNewsRecipe):
    __author__ = 'Marini Gabriele'
    description = 'Italian daily newspaper'

    cover_url = 'http://www.apcom.net/img/logoAP.gif'
    title = u'Apcom'
    publisher = 'TM News S.p.A.'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 7
    max_articles_per_feed = 50
    use_embedded_content = False
    recursion = 100

    no_stylesheets = True
    conversion_options = {'linearize_tables': True}
    remove_javascript = True

    keep_only_tags = [
        dict(name='div', attrs={'id': 'ag_center'})
    ]

    feeds = [
        (u'Globale',  u'http://www.apcom.net/rss/globale.xml '),
        (u'Politica', u'http://www.apcom.net/rss/politica.xml'),
        (u'Cronaca', u'http://www.apcom.net/rss/cronaca.xml'),
        (u'Econimia', u'http://www.apcom.net/rss/economia.xml'),
        (u'Esteri', u'http://www.apcom.net/rss/esteri.xml'),
        (u'Cultura', u'http://www.apcom.net/rss/cultura.xml'),
        (u'Sport', u'http://www.apcom.net/rss/sport.xml')
    ]
PK�X��2��apod.png�PNG


IHDR��h6�IDAT=��O�P�_{z�nCT�	b�����L��_��/�?�c|��%4*�l�NЍ��Xw�Ӯ=	F�O�s���kN�)M|O��[O�ߖ̒�*]Ų$���+�����%/��}���:;��/�3�Fˣ� ������@ �=x�ޣ��͜�<=�6
�Z��(
F��GF���{��a䒿R����S��SSA]�ˎK`�P1�mW/��8w���ر�h|"-Ćp����յvh��E�ٓ�݌���>=������䅇zg&��g3�<�����V(�E��o^��r �lY�p��A9<}��#i��=�7k��Hd��;�a`50*��G�.m؄2^�h|5�����m;�l$���I�V�:6q��Չ�4l�˩��%��XJ$8J+]��b�X�C�,[3~�l1*!�/�����ΐ���h�n.o��6�n�y��ҙR����Q�	��i�^�Y�Gcf�j{�A��(��F��m>,%��GXS)�d�����42����,�d�j�(V�ӹ�+k��1qt�*�|I2�`e�WOwϱ�������zz3�;]o���Y�"�`��%$!`g��r���h,~��~c���m�`����!�9�)HU��"&pHer�Ç�]�*U��rYA*�JP��և���/IEND�B`�PK�Xޙ�IIapod.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class APOD(BasicNewsRecipe):
    title = u'Astronomy Picture of the Day'
    __author__ = 'Starson17'
    description = 'Astronomy Pictures'
    language = 'en'
    use_embedded_content = False
    no_stylesheets = True
    cover_url = 'http://apod.nasa.gov/apod/image/1003/m78_torregrosa.jpg'
    remove_javascript = True
    recursions = 0
    oldest_article = 14
    remove_attributes = ['onmouseover', 'onmouseout']

    feeds = [
        (u'Astronomy Picture of the Day', u'http://apod.nasa.gov/apod.rss')
    ]

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''

    def postprocess_html(self, soup, first_fetch):
        center_tags = soup.findAll(['center'])
        p_tags = soup.findAll(['p'])
        last_center = center_tags[-1:]
        last_center[0].extract()
        first_p = p_tags[:1]
        for tag in first_p:
            tag.extract()
        last2_p = p_tags[-2:]
        for tag in last2_p:
            tag.extract()
        return soup
PK�XN⼥��
app_funds.png�PNG


IHDR��h6IIDATxڍ�aK�P��k��P�ZEQ�$l.T�`�s�‘eŖh1WCP3-Rgi됸�Q[�w���sv_ć���G�U�1>]�%���D��/ay���]��K�+1��� �Ն�a�a��z�����J�;I\YZD��)�4�n����Lo��3A���Bq�x���ʸd`��>:+�SG���A��$�����Q_�^��}��'��Oa6t��`���*RK����}�'H���'���.	^3�(LJ&$?�Ll<g�u�&�6��2����C`/�9��:�~2����D@��UUj)F��8	@�E�r���$�1n����
�����>�IEND�B`�PK�Xk�ި�app_funds.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com>'

'''
appfunds.blogspot.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class app_funds(BasicNewsRecipe):
    title = u'APP Funds'
    __author__ = 'teepel <teepel44@gmail.com>'
    language = 'pl'
    description = 'Blog inwestora dla inwestorów i oszczędzających'
    INDEX = 'http://appfunds.blogspot.com'
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True

    feeds = [(u'blog', u'http://feeds.feedburner.com/blogspot/etVI')]
PK�X�6!�{{appledaily_tw.png�PNG


IHDR(-S�PLTE�5<���t�l����8?�OCI�qN�qPٟ[ۥa�om�m�q��z�و�أ�ᠫ���ϓ��ǭh�����������ޠo����t�s�?E�EK�KQ�u�iP�ag�hm�}j�b��n��z�������������������ì�������#�r��������8�{Z���tRNS@��f{IDATx^]�U�0�];I�����kWV���oҭU����2l	N:5�%36o�s9w���k��B�K~lr��}�Ր�zQ���Hl5�����Kycm��1�#
�#��g��!ǜA�|�?�āqIEND�B`�PK�X��E��appledaily_tw.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
import re

__license__ = 'GPL v3'
__author__ = 'YuLun Shih'


class AppledailyTW(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'YuLun Shih'
    title = u'蘋果日報 (台灣)'
    description = '24 小時陪你看新聞,我們是最勁爆、最八卦、最貼近大家生活的台灣蘋果日報!'
    cover_url = 'http://i.imgur.com/3pkzQbw.jpg'
    masthead_url = 'http://i.imgur.com/otLZwQq.gif'
    oldest_article = 1.5
    max_articles_per_feed = 25
    auto_cleanup = True
    simultaneous_downloads = 25
    language = 'zh_TW'
    tags = 'news, chinese, Taiwan'
    category = 'news, chinese, Taiwan'
    publisher = u'蘋果日報 (台灣)'
    publication_type = 'newspaper'
    no_stylesheets = True
    remove_empty_feeds = True
    extra_css = 'img { display:block; margin: 5px auto; width: 50%;}'
    remove_tags = [
        {'name': 'a', 'attrs': {'href': 'mailto:.*?'}},
        {'name': 'a', 'attrs': {'target': '_blank'}},
        {'name': 'hr'}
    ]
    conversion_options = {
        'title': title,
        'comments': description,
        'tags': category,
        'language': language,
        'publisher': publisher,
        'authors': publisher,
        'linearize_tables': True
    }
    feeds = [
        (u'頭條', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1077'),
        (u'要聞', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/11'),
        (u'政治', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/151'),
        (u'社會', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1066'),
        (u'生活', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/2724'),
        (u'地方綜合', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1076'),
        (u'論壇', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/824711'),
        (u'法庭', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/152'),
        (u'暖流', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/9499'),
        (u'投訴', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/16287'),
        (u'娛樂名人', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1600'),
        (u'木瓜霞吐槽', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/26153'),
        (u'直擊好萊塢', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/2890'),
        (u'亞洲哈燒星', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/6270'),
        (u'名人時尚', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1403917'),
        (u'強檔新片', 'http://www.appledaily.com.tw/rss/create/kind/col/type/35151804'),
        (u'勇闖星宅門', 'http://www.appledaily.com.tw/rss/create/kind/col/type/1761666'),
        (u'國際頭條', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31488833'),
        (u'國際新聞', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1697'),
        (u'中國新聞', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/13'),
        (u'雙語天下', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1945241'),
        (u'體育焦點', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/2153'),
        (u'大運動場', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/16289'),
        (u'籃球瘋', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/16'),
        (u'投打對決', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/2154'),
        (u'足球新聞', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31320925'),
        (u'運彩分析', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31320926'),
        (u'財經焦點', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/14'),
        (u'財經熱門話題', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1059'),
        (u'國際財經', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1052'),
        (u'投資理財', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1028'),
        (u'科技3C', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1048'),
        (u'金融保險', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1078'),
        (u'綜合產業', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/3847'),
        (u'頭家生意', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/5050'),
        (u'地產焦點', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1061'),
        (u'地產王', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31425399'),
        (u'中古好屋王', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31477902'),
        (u'家居王', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31477866'),
        (u'豪宅王', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31477901'),
        (u'蘋論', 'http://www.appledaily.com.tw/rss/create/kind/col/type/974972'),
        (u'司馬觀點', 'http://www.appledaily.com.tw/rss/create/kind/col/type/1635487'),
        (u'人間異語', 'http://www.appledaily.com.tw/rss/create/kind/col/type/2262677'),
        (u'論壇', 'http://www.appledaily.com.tw/rss/create/kind/col/type/836825'),
        (u'副刊頭條', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31477907'),
        (u'讓我更美', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/22'),
        (u'流行尖端', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/2452'),
        (u'消費高手', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1619'),
        (u'旅遊與探險', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/24'),
        (u'美食天地', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1898'),
        (u'健康醫療', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/177600'),
        (u'讓我自己來', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31478018'),
        (u'寵物 DIY', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/31478020'),
        (u'運勢與彩券', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/6199'),
        (u'3C通訊', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/23'),
        (u'車市快遞', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/1540'),
        (u'名采', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/25'),
        (u'人間事', 'http://www.appledaily.com.tw/rss/create/kind/sec/type/17822'),
    ]

    def preprocess_raw_html(self, raw_html, url):
        raw_html = re.sub((r'<a href=".*?<br><br>.*?<\/a>'), '', raw_html)
        raw_html = re.sub(
            (r'<title>(.*?)[\\s]+\|.*<\/title>', r'<title>\1<\/title>'), raw_html)
        return raw_html
PK�X�����
aprospect.png�PNG


IHDR�a�IDATx�mS3�]Q}k�ض����5��:���i⤍m�i�1���s�Y_Aq���G�rǁg���+��_�S��!CP
���P͝mX4��==�^����7f$__ņ�������4;��۷�v�.tZ-j�N�B�ԩh:wƆ2b1(=�>�O� 
��ݻA)���B!*��D��W��Eqq�?E���e�^^�}|�p�Z�]#����E+V���:��J��`llD�ѣ�;t�߿ST��^�D ،˳���%��]� �u�����
�@�h��@�G�K�A���<+b�ɓT���!��/�����Q�i�3��
ڈhBCQ0y2݉��(���62�:%y{�lBB R����%K�
G��)dP��3a�A�
gϦ��R�*֮E��w��v�v*��w���e�k��u�������<�RP*Z��S{;x�9�y5�����S*X�5t��2Ӂ��
�kL�Bb
�m�w<x@��P�֯�������\	�X�� ���Rj�p�<*757�1	�j4�0Z��P�q#*7oF�Çh<}��[��^"j�r�jP���B��E5ȟ0��g-�{ކ+�,E�T��W��ݍ����2��I�Ax�֭J
臲�?����[j���M�IEND�B`�PK�XA�,��aprospect.recipe#!/usr/bin/env  python
# License: GPLv3 Copyright: 2008, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe, classes


class AmericanProspect(BasicNewsRecipe):
    title = 'American Prospect'
    __author__ = 'Kovid Goyal'
    oldest_article = 300
    language = 'en'
    max_articles_per_feed = 100
    recursions = 0
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'

    use_embedded_content = False

    no_stylesheets = True

    keep_only_tags = [
        dict(id=['title', 'content']),
    ]
    remove_tags = [
        classes('slideout-close-btn media-options')
    ]

    def get_feeds(self):
        soup = self.index_to_soup('https://prospect.org/archive')
        for a in soup.findAll('a', href=True):
            href = a['href']
            if href.endswith('-issue/'):
                d = href.strip('/').split('/')[-1]
                self.timefmt = ' [{}]'.format(d.rpartition('-')[0])
                self.log('Found magazine URL', href)
                return [('Articles', href + 'index.rss')]
        return [('Articles', 'https://prospect.org/api/rss/all.rss')]
PK�X?+��  ara.png�PNG


IHDR  szz��IDATx�bz�l#��z��c��8�^m�m�:��"���F�ڶ��Ԏj۶�~�׫�ń���\|;8'�,�K��6ʈz�
8��Ex�#X�VȒ��0	Ϡ0��
=q��) c��W�(�s�1>-�C�Q�w�x��\�w��1d�	��x�4��[ ��>�@�
s'@ϑ�`u�B�]�@/��0�7�0��^B�,s}��y�� �f"c�6�S�2ʻ��w�-Au��09J���+a��LjP���p��_q
�)5h���(����SzP�!��H��g��Eq�8h�IX9t�-�D!|�*�9�hPzBJ��NP@���r�jk<�!�Oh�D��6�,�^Õ���������Ȇ���gT
ٳ҆��P�� sȇ��)��Nǵ��n�=���h��+Y� �G�,��&�c��	�4��[ng&t�f�S\�j���F���K"Zd�]‰IEND�B`�PK�X���BB
ara.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class Ara(BasicNewsRecipe):
    title = 'Ara (diari)'
    __author__ = 'santboia'
    description = ('Ara.cat is an online Catalan-language newspaper edited in Barcelona.'
                   ' It is ranked 2nd by unique monthly visitors among Catalan newspapers,'
                   ' with over 2 million monthly visitors and ca. 12 million pagew visited as at March 2022.')
    oldest_article = 2  # days
    max_articles_per_feed = 30  # articles
    auto_cleanup = True
    language = 'ca'
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}

    feeds = [
        ('Ara', 'https://www.ara.cat/rss/'),
    ]
PK�X�c[88ara_info.png�PNG


IHDR(-S/PLTE��������������䓓����@@@���FFF������������QQQQRS��Ü��SSSVVVLLLMMMXXWYYY]]]fffjjjkkknnnru}yyy���������������		���			'''������������������������������������������������(((111���222������444������������875���888���������������i<<<>=;��Z��???


��EEE������i�Y�IDATx^5�C�A�/��B�϶m۶��5�A���
�d�o���1�!���Ȟ]q�K�ұ�~^�O��2���Bd�`w/��˩��H�
�J�Q������Uj�.���yfk1֌���ǥ��:e}���/2�%Cs��}z�V�y��F�<�Ѡ����U5����_��zIc"�VA��Ebd��	����[?b�~IEND�B`�PK�XHW��ara_info.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = 'Ruben Pollan <meskio@sindominio.net>'
__docformat__ = 'restructuredtext en'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1335656316(BasicNewsRecipe):
    title = u'AraInfo.org'
    __author__ = 'Ruben Pollan'
    description = 'Regional newspaper from Aragon'
    language = 'es'

    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    cover_url = u'http://arainfo.org/wordpress/wp-content/uploads/2011/10/logo-web_alta.jpg'

    feeds = [
    (u'Movimientos', u'http://arainfo.org/category/movimientos/feed/'),
    (u'Econom\xeda', u'http://arainfo.org/category/economia/feed/'),
    (u'Ecolog\xeda', u'http://arainfo.org/category/ecologia/feed/'),
    (u'Culturas', u'http://arainfo.org/category/culturas/feed/'),
    (u'Altavoz', u'http://arainfo.org/category/altavoz/feed/')]
PK�X����arabian_business.png�PNG


IHDR00�`n�gIDATx��Y{����H.�q���9��������ܦ�r�����ʖV2�睝�>��+s��7�gg�Ι9�έ3�è�6~ѱ.�!�j�;�0�C�_�w�嗣l�|ԃ������)�.�7�܏0jfȨ5�፟�2C�<Y�v��߹*����_���)�ߧ1"��3ƈ�tCB%6R��g��!wı���/�,/ݵ�xѥ�w��.2�n`J��Y���?����8��t���b˿K-˝�Ż��(\um���e���7F4�#�i,��J�R
l���)=`�Q��v����}�J6W	����?A�Xr�y7ֹ�؍$BҚ6������3���|�g�7P��{�&���õ�7"Y��j�x�ɳ�^���`�<0�5<�l6΅�-���Гs�?���Q�r�}�M5@����jtSv�}��8�0�������R�ŗ�]�1��is�/�$/��
DQ��P}g�`
���!]��f�_������sE /������v��-w��qִ��^��c��E��`����s9��]�LOtt����'��8A6WZ{of�ݭyK�����8+W3C�<�=ejH2ĥԗ_�O9#�͎�6;�>���!���,�q�#PO�!Dѩ�7ʟ{������{�b&��V�443İ^O/G�~I���~O���vhU݉��>��I�Ld��[��H���>��DŽi�E>
��A����a  1���ֲ�}&@�2[l'=�d79+ׄ��X���m��k�1���GbO�� &��ut
�3�I �?p{{�-�"����Ǣ���TÐ�(A�(N��Wc7�g-�l�U��K�'��������>�P���/r��f�ʳf���sP���;'�R��ktE�Z�E�oJ�����M�*^u-d#P�t�kh�Ԥ,(��ֶ2z�ŗ˯�槿���R�y�k�"2 �
5)C��#k�2g����*��X��H��E
@q��
�2Ȕ�a/�ʚ:��I5BTQ�Lg��+QnC�
�Q�.���ϳ)����^k�e���GdX��UC��������3�ezʘ�Q$T�tX�u�l i@ac��Z�� ��Q	�Xe�+��n��9~:���NI�a��|R��C����yngwf�X:�E9��+R�J�~��#7�,�D�|1�j�Co�)-�t�:��˖�K��F��;
g�_8���y��{�y�Q����j� ��5�%�H�y�(�x���[m�	(	%Mබ���!R���[� a�a��YL>&�O���̓&���B4	��*L��3�Sc6P]dC�(�x`����e>�q��E�tp��+O��pV��:�$C���7�}����?�7ۚ]���vj��ցx̼WC#��ުgj��f�ى����w_z�'A���k��f/�:��Io�O�M�����7:#��&{�b���	!ׇ"7�(cmm�=��z��X��J�ӇyBa!,���i/�D{����]Q�J�>��Z�]
:����oG��5����۳Z����G����'"mo���$��t}Hs�m0�}�]�^%��쁇�����S���ZZ�7��gɇ�7MY�.�8e������?��bgûQt[��:,��P!u�ى��W_�Y�CK(��R��z?D��2�oSC�69����i�6tu�s�C��2e�_|�g���a��p�n[[�>�6;�(d4x�=��^g�������0#�W�D:U��N�ʹ>�ȸǶ��~A���^|Q�=9NY���H�X.._��זPڴ2��jQ����tk���:��nT4-w�Q�X�_rG��}�U����W^/�y��0�x��.^��*>�Q�
|��q�5u��~Q�J�3�Eq ۳Z��)�ȴ@�Mxe��EK|��t�Ù:�=��IIH�4�V�/��W�c���a���a��2 1R.&�|�j�P�:LXT^D�m¢��A���/�<7���HY
s�2�
���2�_	�/���1sT�� �0�ߕ2�pC�0��^H���D&H˯�2z��`֟8G��#�C
g�?ŨMYmL�L�p��O����GX����?e������SBIEND�B`�PK�X_ȭ�44arabian_business.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
www.arabianbusiness.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Arabian_Business(BasicNewsRecipe):
    title = 'Arabian Business'
    __author__ = 'Darko Miletic'
    description = 'Comprehensive Guide to Middle East Business & Gulf Industry News including,Banking & Finance,Construction,Energy,Media & Marketing,Real Estate,Transportation,Travel,Technology,Politics,Healthcare,Lifestyle,Jobs & UAE guide.Top Gulf & Dubai Business News.'  # noqa
    publisher = 'Arabian Business Publishing Ltd.'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    masthead_url = 'http://www.arabianbusiness.com/skins/ab.main/gfx/arabianbusiness_logo_sm.gif'
    extra_css             = """
                               body{font-family: Georgia,serif }
                               img{margin-bottom: 0.4em; margin-top: 0.4em; display:block}
                               .byline,.dateline{font-size: small; display: inline; font-weight: bold}
                               ul{list-style: none outside none;}
                            """

    conversion_options = {
        'comment': description, 'publisher': publisher, 'language': language
    }

    remove_tags_before = dict(attrs={'id': 'article-title'})
    remove_tags = [
        dict(name=['meta', 'link', 'base', 'iframe', 'embed', 'object']), dict(
            attrs={'class': 'printfooter'})
    ]
    remove_attributes = ['lang']

    feeds = [

    (u'Africa', u'http://www.arabianbusiness.com/world/Africa/?service=rss'),
    (u'Americas', u'http://www.arabianbusiness.com/world/americas/?service=rss'),
    (u'Asia Pacific', u'http://www.arabianbusiness.com/world/asia-pacific/?service=rss'),
    (u'Europe', u'http://www.arabianbusiness.com/world/europe/?service=rss'),
    (u'Middle East', u'http://www.arabianbusiness.com/world/middle-east/?service=rss'),
    (u'South Asia', u'http://www.arabianbusiness.com/world/south-asia/?service=rss'),
    (u'Banking & Finance', u'http://www.arabianbusiness.com/industries/banking-finance/?service=rss'),
    (u'Construction', u'http://www.arabianbusiness.com/industries/construction/?service=rss'),
    (u'Education', u'http://www.arabianbusiness.com/industries/education/?service=rss'),
    (u'Energy', u'http://www.arabianbusiness.com/industries/energy/?service=rss'),
    (u'Healthcare', u'http://www.arabianbusiness.com/industries/healthcare/?service=rss'),
    (u'Media', u'http://www.arabianbusiness.com/industries/media/?service=rss'),
    (u'Real Estate', u'http://www.arabianbusiness.com/industries/real-estate/?service=rss'),
    (u'Retail', u'http://www.arabianbusiness.com/industries/retail/?service=rss'),
    (u'Technology', u'http://www.arabianbusiness.com/industries/technology/?service=rss'),
    (u'Transport', u'http://www.arabianbusiness.com/industries/transport/?service=rss'),
    (u'Travel', u'http://www.arabianbusiness.com/industries/travel-hospitality/?service=rss'),
    (u'Equities', u'http://www.arabianbusiness.com/markets/equities/?service=rss'),
    (u'Commodities', u'http://www.arabianbusiness.com/markets/commodities/?service=rss'),
    (u'Currencies', u'http://www.arabianbusiness.com/markets/currencies/?service=rss'),
    (u'Market Data', u'http://www.arabianbusiness.com/markets/market-data/?service=rss'),
    (u'Comment', u'http://www.arabianbusiness.com/opinion/comment/?service=rss'),
    (u'Think Tank', u'http://www.arabianbusiness.com/opinion/think-tank/?service=rss'),
    (u'Arts', u'http://www.arabianbusiness.com/lifestyle/arts/?service=rss'),
    (u'Cars', u'http://www.arabianbusiness.com/lifestyle/cars/?service=rss'),
    (u'Food', u'http://www.arabianbusiness.com/lifestyle/food/?service=rss'),
    (u'Sport', u'http://www.arabianbusiness.com/lifestyle/sport/?service=rss')
    ]

    def print_version(self, url):
        return url + '?service=printer&page='

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for alink in soup.findAll('a'):
            if alink.string is not None:
                tstr = alink.string
                alink.replaceWith(tstr)
        return soup
PK�Xd����
arbetaren.png�PNG


IHDR  szz�pIDATx^m�ipVղ�����v��d !HD����x.PP! J	���D�A!��$=2^dJL� @�o޻o�P��U]����굞�U��W��]o`���wm7�6X�
���B��	cJN�>2����1}�������9�+*$�:;

öA�V��I~G��3�D4x;�6fX����2-�?PIFeLN��_�x��]�V��	����s�'G�~|�9�d�lL����=iܑ6�.
%�E���b�{?�]�͍��o[�ῺE��]���a��[Q���{��)�|��̳C�>�p�(X�ѯcj�Q?G��b#����̼��hP0T7*�!��y�/��*�����R&Jװ�>l
�DsD��">��ݶ-�9o|P�����1lƝ�_ɳ�M�5y�V�Sj���\ٹ�tE4�rb��?6

D�t��i&J��%�j����̴�m��<��7�Þ2bG^�ң�hh�aw��vU�۷�k��C��'�O>�(E���p��~�����FW�f���u4,�$��C��sU���n�:�>��{@�Fdh�[0;g&��rq�!<����������sb2�q�q��+E��'ج�����s_�xR��ջ0ÂY��Ə��@�;�5�1��26&B8�`#ЫgK
�ri�
.�Hh���ş1a\7�^76�e�ٴ�,�=MJ�(l�E��Q\�t��P7��J�)?�VN^=�G05_���Z5h.>��!'	H��^��ow?9��Ò7`�.�b�8�z	�
���8xW�"�YK�uhΗ_e��;`����e<�`M�rD�������5��M�����[�^�#�*wb()�z/���O���P$%@�ȝ5�Y���;��^h�,/�q"��@��@�tĆmaтxb�Q^ل����gC�$�W�cM�m���mü�ŧɝ�̘�b�H�EZ%!�.,c"k
be��/ �-��W�*��v�;�I���Gz=�<���l���C��vJձ.b�v��]
e��ȉ:Ȑ4dsaG���V�$!I���Xd˜����;ДQ��7^�5�/
"o�z^ޗ���7]Rcx����+�+A|�X��;/�v�h��o}�!�R1����oh2��n�,���+��0��?����@���6�\��o�x�O�]��
mڷ����Jz�h��.�,T<h1(|8��1�
#��<�a�P*ێ���u����_��U��,}�윕<�L�u��3�>2�,4���9oF׺��6��H~�=f��V՟���3+����s�ˏ.��Ո�u)g��y;�۷�d(�]�C�8st�Ei�i5������B���6jdQӧ�zw�O?�� ,2���`��7Asc�u����D^�|�&Ǐ��T({���Ԑ��C����R.4
�~
���sv���)l��3gm~-��Q�<�x��7Vl<y��ʡàA}��u��g+�9W��x	8Zb�H|^?�d4�aL$W���շ���efN
>�[��fl��6	����e��>�ϜOA�(jjP����a�ڸ�#�hy&��F����Eb[.4��0�{�7��_�j�oc`�����ߋy�P7-1S�}4������`���Mt44�?e��!.��gNVg��6�<�=d���^��9�/]\��e�{�z%JZ%"};#�#ޓ�rs�.�V#�s��-yD�\��N�J�QC�nA�3���oiH���[�Zvmj+{#s��K���[&N˙��d�����a�?�7�A|�gx�q�֭[���L�:�I���n]Ae�+�z���Ύ�Y�MY?Y�#�
�����R�#����8w>�?����̞w���3�q


�{�͆M?�6�n��� ����躏�p?z�N�e��rEГ����3��F����T4��y;����a�ܿw�~_?v�=υ�7		�e�V?7k֌ ?�-�9�ykߩv����	�r����mE2jxo�à]�^l�����ֿ�7�n���k�
�𯕬�p��cj�qz?ޓ���j�tl#��vB�v��`�?�|�7G��:�ސ��G�%&��(
��jwy�2�id���ޖ �?6����,͋���Nɝ'c� _��*���o��Ȉ���=�c۞�iC�L;ٽ)z��~S�t�hH����q$ktXq�4&��ɔ�)�}�Ó�=�I�VԽ>��Lm-k
���Oq8�BV�"�j+�7w���i!�,)�c�C�Ȓ�!R�����\;�$�S1Ry$Q��Hޜ�DR[!Mc�W��??of�\��hW�j�ĩ8�*����e�o\�cjh������Gѹ�2cY�v.7��r?�,Q��5���(�H�;���݌�(eՁ���3�P~��C��=���e�(G.�V�P�^x�C��ځ�ʽ{~zYӄ��R������{�K��b��h:ܮ�CD�نҒ+�W��@�T�e��Ѵ��]�KW��/�)Z�v�hl��l�  h��z�7�|~(�������ב�-��j��AƨX�.���K�$6i��?y��-Y��w��|�'+��4�z�j�E��؁hD���'T���-�N�V���+�͓���}�oH��S��Vp�:���[��cWY��)t��[��ӓ\����]8`��
���&�(��Ұ�ƹ��;���y�<_�ukW<�p������N@���M?Q����,��o�p*��(.�����ɚ5g^�t���[1�*�E����Ͷ# ��Ͽ|��h.�F0P����<�Gz���
+��q!��M�D�y��˵���AĢ}�؋�~�I��7����l
���Vw�*�;��"T���/��w�_�i�̳��oܺehHX���ܸ��7��~�er�����6=����LA�`a"���v�
��?�#wǥ���CUl�`ZV�z�F�IYK��]�n���8.#�`^A�L�ǔy���°���>��VT4}Ƅ�E�s���F��oS�&�4�ѽ @4м(�eт��aNG���s1���J���|i`��th/}n��s��p���+w��zw��/D�|�%��F�{�ʼ��ؖ�IEND�B`�PK�X�0��arbetaren.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Arbetaren_SE(BasicNewsRecipe):
    title = u'Arbetaren'
    __author__ = 'Jonatan Nyberg'
    description = u'Nyheter fr\xe5n Arbetaren'
    publisher = 'Arbetaren'
    category = 'news, politics, socialism, Sweden'
    oldest_article = 7
    delay = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'sv'
    auto_cleanup   = True
    auto_cleanup_keep = '//div[@class="thumbnail"]'
    auto_cleanup_keep = '//div[@id="article-image"]'
    auto_cleanup_keep = '//div[@id="article-image"]|//span[@class="important"]'

    feeds = [(u'Nyheter', u'https://www.arbetaren.se/feed')]
PK�X<e��arcadia.png�PNG


IHDR  D����PLTEm�����o�����q�������|���������������r��p��n�����������u�����t��n�����s���������������������������������v�����������������������w��y��z��s������������������������}��~��������������������������������IDATx���Cb,@@���m�vr���o�V��4z�3����`�\���a�3���mg��A,u�#�^0�ps�N�K�kB	Į��h��o��m���(�����
� �Z�&����0�J3�j,�����o�l�?H�^&i�7�J���0VB
`>��5�s�N�q�ʸ��o��	.|��1�(�f�ENvf�6��z'��}fpIEND�B`�PK�X_�M��arcadia.recipe# -*- coding: utf8 -*-

from calibre.web.feeds.recipes import BasicNewsRecipe
import re


class Arcadia_BBS(BasicNewsRecipe):
    title = u'Arcadia'
    __author__ = 'Masahiro Hasegawa'
    language = 'ja'
    encoding = 'utf8'
    filter_regexps = [r'ad\.jp\.ap\.valuecommerce.com', ]
    timefmt = '[%Y/%m/%d]'
    remove_tags_before = dict(name='a', attrs={'name': 'kiji'})

    sid_list = []  # some sotory id

    def parse_index(self):
        result = []
        for sid in self.sid_list:
            s_result = []
            soup = self.index_to_soup(
                'http://www.mai-net.net/bbs/sst/sst.php?act=dump&all=%d'
                % sid)
            sec = soup.findAll('a', attrs={'href': re.compile(r'.*?kiji')})
            for s in sec[:-2]:
                s_result.append(dict(title=s.string,
                                     url="http://www.mai-net.net" + s['href'],
                                     date=s.parent.parent.parent.findAll('td')[
                                         3].string[:-6],
                                     description='', content=''))
            result.append((s_result[0]['title'], s_result))
        return result
PK�X݉���arcamax.png�PNG


IHDR  ���IDATx�}��$���%
$@ @���)h���������.�=����}]��$]E=�lM��Jn�QN�t\Д���%+���4'YU��b��3�w��b��)6���Ԛ��'XGОd$)��C�ݒN+�׎b���_0+4��,�B@[P���`i�FYIs�c���5�V�wɕX�y0�j��Q�}J���#�,P2�%#Xc��p�r%��r��0�`���0LY� 
�sb�^Q��MZ�J|9�ȹ�M9�o�>��xK�:6�i��q�S�����*V��H�1��<g�����ݍ�[��iB�c�+!�$j3�X�8�$K:��INO`���T[��KPT.��!��z����;���wqƕ-�W^R�̛]f���9����}(��(��Ed�ӟ����poo��hR��T�p�*/�$������}�Sk����<X�j��}���Ϗ2w�8튺�)a�d�;���ݓ�PL�ĝiA�Ϝ9��#���l_�^z��k�6=	���Ӧc`�U
�����������<����[K�!�׺ͨ��px��6YPG�v�k1u��:!O�~����'d-1nW�<�C�x��F4�`���@�1^��4�z�~�k����o��ޝ5l����o\�dK��OQ�LZ��g�E�Ӗ��;>
�[�������>�d���z8��xڊ;Mϔ�tT��ye&cHq:%10
�=Ռ;����sg�?G��[cMi}��v��Je�TuѬ`"�$�`ӊ�@�ONƜ
%��^+��W��ٷƠ�)�
��VS�4_�P3��HJ�E���`}3�f�%����n>|� �Օ�����
�u=э�*B��-`wk��ɏ�ix��r�۴
��v#WgIN"�QYsX�spz\Z&���7���x{����&���SOZ�]�F��F�E�+�My�E��`=�6LP�w:� �塓�@��v��vw�w��wv����W�~�B�s�pE�T8+���d��U+b��!�}d�����8��-��M��کk�'ֆN,����+��<2<NH5���0�#�f E��M��_�<>^�e�EH��<!��8t�N�,��#�����T��H׹i��/!�L����|3bo�>��u��}�W���W���YF�F�yWds��C��@j�%��c��kמ�����bz,c�4�����'����6���4��^™H8�O�t��o|�Z)�	�TEאc,����B�����?::<�/|�$$�ċY��;P��R��O�/_���Gs��DIS��2HX]��7�ok7��z��3���)��~�pe��
�5��:�����w��q�ኢb��EA3�ڼrپ��3�9Ì�
f�!r�Ӣ��'B�}g�/��������ow���‡ߗ@��C =,M��?��ϵ�����T���o���G<�X�"����!�IA��C�F#,����4
k-j���wp�/#��
�"c���}��9U"�8�V<�إ}��ԏ�R<1�����D�[�NZ�:!��0��$^��tܸ�Ep�>�j]2��L�#�Vat�ڣf&vc�ܩ����*F�W���K��M��IEND�B`�PK�X;��33arcamax.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = 'Copyright 2010 Starson17'
'''
www.arcamax.com
'''

import os
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryDirectory


class Arcamax(BasicNewsRecipe):
    title = 'Arcamax'
    __author__ = 'Kovid Goyal'
    description = u'Family Friendly Comics - Customize for more days/comics: Defaults to 7 days, 25 comics - 20 general, 5 editorial.'
    category = 'news, comics'
    language = 'en'
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    simultaneous_downloads = 1
    cover_url = 'https://www.arcamax.com/images/pub/amuse/leftcol/zits.jpg'

    # ###### USER PREFERENCES - SET COMICS AND NUMBER OF COMICS TO RETRIEVE ##
    num_comics_to_get = 7
    # CHOOSE COMIC STRIPS BELOW - REMOVE COMMENT '# ' FROM IN FRONT OF DESIRED
    # STRIPS

    conversion_options = {'linearize_tables': True, 'comment': description, 'tags': category, 'language': language
                          }

    keep_only_tags = [
        dict(name='header', attrs={'class': 'fn-content-header bluelabel'}),
        dict(name='figure', attrs={'class': ['comic']}),
    ]

    def parse_index(self):
        feeds = []
        self.panel_tdir = PersistentTemporaryDirectory('arcamax')
        self.panel_counter = 0
        for title, url in [
                # ####### COMICS - GENERAL ########
                # (u"9 Chickweed Lane", u"https://www.arcamax.com/thefunnies/ninechickweedlane"),
                # (u"Agnes", u"https://www.arcamax.com/thefunnies/agnes"),
                # (u"Andy Capp", u"https://www.arcamax.com/thefunnies/andycapp"),
                (u"BC", u"https://www.arcamax.com/thefunnies/bc"),
                # (u"Baby Blues", u"https://www.arcamax.com/thefunnies/babyblues"),
                # (u"Beetle Bailey", u"https://www.arcamax.com/thefunnies/beetlebailey"),
                (u"Blondie", u"https://www.arcamax.com/thefunnies/blondie"),
                # u"Boondocks", u"https://www.arcamax.com/thefunnies/boondocks"),
                # (u"Cathy", u"https://www.arcamax.com/thefunnies/cathy"),
                # (u"Daddys Home", u"https://www.arcamax.com/thefunnies/daddyshome"),
                (u"Dilbert", u"https://www.arcamax.com/thefunnies/dilbert"),
                # (u"Dinette Set", u"https://www.arcamax.com/thefunnies/thedinetteset"),
                (u"Dog Eat Doug", u"https://www.arcamax.com/thefunnies/dogeatdoug"),
                # (u"Doonesbury", u"https://www.arcamax.com/thefunnies/doonesbury"),
                # (u"Dustin", u"https://www.arcamax.com/thefunnies/dustin"),
                (u"Family Circus", u"https://www.arcamax.com/thefunnies/familycircus"),
                (u"Garfield", u"https://www.arcamax.com/thefunnies/garfield"),
                # (u"Get Fuzzy", u"https://www.arcamax.com/thefunnies/getfuzzy"),
                # (u"Girls and Sports", u"https://www.arcamax.com/thefunnies/girlsandsports"),
                # (u"Hagar the Horrible", u"https://www.arcamax.com/thefunnies/hagarthehorrible"),
                # (u"Heathcliff", u"https://www.arcamax.com/thefunnies/heathcliff"),
                # (u"Jerry King Cartoons", u"https://www.arcamax.com/thefunnies/humorcartoon"),
                # (u"Luann", u"https://www.arcamax.com/thefunnies/luann"),
                # (u"Momma", u"https://www.arcamax.com/thefunnies/momma"),
                # (u"Mother Goose and Grimm", u"https://www.arcamax.com/thefunnies/mothergooseandgrimm"),
                (u"Mutts", u"https://www.arcamax.com/thefunnies/mutts"),
                # (u"Non Sequitur", u"https://www.arcamax.com/thefunnies/nonsequitur"),
                # (u"Pearls Before Swine", u"https://www.arcamax.com/thefunnies/pearlsbeforeswine"),
                # (u"Pickles", u"https://www.arcamax.com/thefunnies/pickles"),
                # (u"Red and Rover", u"https://www.arcamax.com/thefunnies/redandrover"),
                # (u"Rubes", u"https://www.arcamax.com/thefunnies/rubes"),
                # (u"Rugrats", u"https://www.arcamax.com/thefunnies/rugrats"),
                (u"Speed Bump", u"https://www.arcamax.com/thefunnies/speedbump"),
                (u"Wizard of Id", u"https://www.arcamax.com/thefunnies/wizardofid"),
                (u"Zits", u"https://www.arcamax.com/thefunnies/zits"),
        ]:
            self.log('Finding strips for:', title)
            articles = self.make_links(url, title)
            if articles:
                feeds.append((title, articles))
            if self.test and len(feeds) >= self.test[0]:
                break
        return feeds

    def make_links(self, url, title):
        current_articles = []
        num = self.num_comics_to_get
        while num > 0:
            num -= 1
            raw = self.index_to_soup(url, raw=True)
            self.panel_counter += 1
            path = os.path.join(self.panel_tdir, '%d.html' %
                                self.panel_counter)
            with open(path, 'wb') as f:
                f.write(raw)
            soup = self.index_to_soup(raw)
            a = soup.find(name='a', attrs={'class': ['prev']})
            prev_page_url = 'https://www.arcamax.com' + a['href']
            title = self.tag_to_string(
                soup.find('title')).partition('|')[0].strip()
            if 'for' not in title.split():
                title = title + ' for today'
            date = self.tag_to_string(
                soup.find(name='span', attrs={'class': ['cur']}))
            self.log('\tFound:', title, 'at:', url)
            current_articles.append(
                {'title': title, 'url': 'file://' + path, 'description': '', 'date': date})
            if self.test and len(current_articles) >= self.test[1]:
                break
            url = prev_page_url
        current_articles.reverse()
        return current_articles

    def preprocess_html(self, soup):
        for img in soup.findAll('img', src=True):
            if img['src'].startswith('/'):
                img['src'] = 'https://arcamax.com' + img['src']
        return soup

    extra_css = '''
        img {max-width:100%; min-width:100%;}
    '''
PK�Xl.a{{arizona_republic.png�PNG


IHDR  szz�BIDATx�ŖsxdY‡��3���gڶm۶�ow��8�TUlu%U��6Ҷs��g�g����x���X��D������ℵ�ȣc�8i��oW"�����
Z�Ӻl���qo~Z.�+B��<�撕�P�~�Y�Y	DN�G��/��K�R���H�E#�/�nB�i�X���\h�/��G|$\��{��EQS����s,Fxa�o"Cb�[ZJJ���H��c��[b'�E��Cϙ���ݯh*ܠ��l��!�Mt��Aʘ�`�"��#����J�'h�^�/��������m��L�
]w���0�9?�8��yJ���/��
i�Ө���g|��%LG7���f�X7�I��<V`Kp�p���)QK���� ���.h�*l��78;X�_=���0���`Alۂ��>{xۭ���>����*xF7����9x|�0��?�I���)�W}GJGjRG!���s��=��DB�Z�n��4�֓�n%��q���N��R�%�F�_��6	�K��O����fL�d�6�߃�&���g�㔄��g������	����OX,X���jp��=�Rq�m�I�r��H��@�%ޅ��P�>�W��?����	��雋��)^!�
��j9��S�;%�$;o�_�is���ɝO��Ƽ�p�
.xp�t�cZؿ�z��>�7!�3f���Q��}��-�JS�S��6�/��3nQ!c�j
':��s�vW��u1�(w055PY�ס�
ʭCO�aL	!R$�H3��6�:s�CΘ��$���� K��mX4�YO�M5Wh��q2UA�B)�7��*�_��3p�\˅�Px��,�#��=D�C҇��\���V��K���lZǞ�}Q�|
�
��!CV��ID������4	���P��P���\˖�ǧkù�
WҠ�2�S��9Ľ�� {$�7�[���CX�Ƽ�^%��0z�IG#�%Z.	
���
�V(є�xlJ�d���(��0&�˜9�(Wr��\͔��(V�$�����l*KX�:'Vtc�z����mY�y���$�A�;�%$��t��fa���c\��?�}.%µ=(�S �ۀ�[��MM+�۪x�
��#'ۇt���9D6�����2FA�8H�=!�%L�8��R"
�;J�cFi�wظ����T�b���!Ml�(ɚv��~�=M2r�JfB�Ȑ"�!�[��(��R ��@��սDo�x�ꁾ��x��C��d����	��a�j�_�VA�rȝi�!c�%�-�i�O@�Y��Q�ۙx��X�nd������cك�)�҇�m�Q���=�{��!'�o-%�{�!YTW5?���"�s9e�F�7���$��n�\d�~�2^�TKN>v:4h�Z�#��ٿ�;�1�7��}��bH�����M��1p%���(>���'A���6Cpv��b�@�[��ƈp���#|��(�T��%_l���q8����W@�H�M��>JtW��T��e�ږ&ڽ���6��<�CK�-�L� ���qr��C`�Z�[9�!y�~���Pzõ|(�
�o��is]�.T��E��R�
��)��s7e�g.�N�̱��B�(9cQnDI���VP��!V�+�Ju��n���_�,FU!�;EDb��4���-So��8LrW����O@�v/��i�R�T�ؽ	�_<�q�|ነ�7	8�u"%�_�G�
ם���������c6]
m�Pjh|��Dpauޚ�2�ř�1�R
t�wd���Vl߶^~�W�]���+)�C�>�IEND�B`�PK�XU�XG��arizona_republic.recipe__license__ = 'GPL v3'
__copyright__ = '2010, jolo'
'''
azrepublic.com
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1307301031(BasicNewsRecipe):
    title = u'AZRepublic'
    __author__ = 'Jim Olo'
    language = 'en'
    description = "The Arizona Republic is Arizona's leading provider of news and information, and has published a daily newspaper in Phoenix for more than 110 years"  # noqa
    publisher = 'AZRepublic/AZCentral'
    masthead_url = 'http://freedom2t.com/wp-content/uploads/press_az_republic_v2.gif'
    cover_url = 'http://www.valleyleadership.org/Common/Img/2line4c_AZRepublic%20with%20azcentral%20logo.jpg'
    category = 'news, politics, USA, AZ, Arizona'

    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True
#    extra_css      = '.headline {font-size: medium;} \n .fact { padding-top: 10pt  }'
    extra_css = ' body{ font-family: Verdana,Helvetica,Arial,sans-serif } .headline {font-size: medium} .introduction{font-weight: bold} .story-feature{display: block; padding: 0; border: 1px solid; width: 40%; font-size: small} .story-feature h2{text-align: center; text-transform: uppercase} '  # noqa

    remove_attributes = ['width', 'height', 'h2', 'subHeadline', 'style']
    remove_tags = [
        dict(name='div', attrs={
             'id': ['slidingBillboard', 'top728x90', 'subindex-header', 'topSearch']}),
        dict(name='div', attrs={
             'id': ['simplesearch', 'azcLoginBox', 'azcLoginBoxInner', 'topNav']}),
        dict(name='div', attrs={
             'id': ['carsDrop', 'homesDrop', 'rentalsDrop', 'classifiedDrop']}),
        dict(name='div', attrs={'id': ['nav', 'mp', 'subnav', 'jobsDrop']}),
        dict(name='h6', attrs={'class': ['section-header']}),
        dict(name='a', attrs={'href': ['#comments']}),
        dict(name='div', attrs={
             'class': ['articletools clearfix', 'floatRight']}),
        dict(name='div', attrs={
             'id': ['fbFrame', 'ob', 'storyComments', 'storyGoogleAdBox']}),
        dict(name='div', attrs={
             'id': ['storyTopHomes', 'openRight', 'footerwrap', 'copyright']}),
        dict(name='div', attrs={
             'id': ['blogsHed', 'blog_comments', 'blogByline', 'blogTopics']}),
        dict(name='div', attrs={
             'id': ['membersRightMain', 'dealsfooter', 'azrTopHed', 'azrRightCol']}),
        dict(name='div', attrs={'id': ['ttdHeader', 'ttdTimeWeather']}),
        dict(name='div', attrs={
             'id': ['membersRightMain', 'deals-header-wrap']}),
        dict(name='div', attrs={
             'id': ['todoTopSearchBar', 'byline clearfix', 'subdex-topnav']}),
        dict(name='h1',  attrs={'id': ['SEOtext']}),
        dict(name='table', attrs={'class': ['ap-mediabox-table']}),
        dict(name='p', attrs={'class': ['ap_para']}),
        dict(name='span', attrs={'class': ['source-org vcard', 'org fn']}),
        dict(name='a', attrs={
             'href': ['http://hosted2.ap.org/APDEFAULT/privacy']}),
        dict(name='a', attrs={
             'href': ['http://hosted2.ap.org/APDEFAULT/terms']}),
        dict(name='div', attrs={'id': ['onespot_nextclick']}),
    ]

    feeds = [
        ('Local', 'http://rssfeeds.azcentral.com/phoenix/local'),
        ('Nation', 'http://rssfeeds.azcentral.com/phoenix/nation'),
        ('Business', 'http://rssfeeds.azcentral.com/phoenix/business'),
        ('Politics', 'http://rssfeeds.azcentral.com/phoenix/politics'),
        ('Fact check', 'http://rssfeeds.azcentral.com/phoenix/fact-check'),
        ('Opinions', 'http://rssfeeds.azcentral.com/phoenix/opinions'),
        ('Things to Do', 'http://rssfeeds.azcentral.com/phoenix/thingstodo'),
        ('Events', 'http://rssfeeds.azcentral.com/phoenix/events'),
        ('Dining', 'http://rssfeeds.azcentral.com/phoenix/dining'),
        ('Movies &amp; TV', 'http://rssfeeds.azcentral.com/phoenix/moviesandtv'),
        ('Kids', 'http://rssfeeds.azcentral.com/phoenix/kids'),
        ('Arts', 'http://rssfeeds.azcentral.com/phoenix/arts'),
        ('Music', 'http://rssfeeds.azcentral.com/phoenix/music'),
        ('Celebrities', 'http://rssfeeds.azcentral.com/phoenix/celebrities'),
        ('Travel &amp; Explore', 'http://rssfeeds.azcentral.com/phoenix/travelandexplore'),
        ('Arizona History', 'http://rssfeeds.azcentral.com/phoenix/az-history'),
        ('Sports', 'http://rssfeeds.azcentral.com/phoenix/sports'),
        ('Suns', 'http://rssfeeds.azcentral.com/phoenix/suns'),
        ('Diamondbacks', 'http://rssfeeds.azcentral.com/phoenix/diamondbacks'),
        ('Coyotes', 'http://rssfeeds.azcentral.com/phoenix/coyotes'),
        ('ASU', 'http://rssfeeds.azcentral.com/phoenix/asu'),
        ('UA', 'http://rssfeeds.azcentral.com/phoenix/ua'),
        ('High School Sports', 'http://rssfeeds.azcentral.com/high-school-sports'),
        ('Chandler', 'http://rssfeeds.azcentral.com/phoenix/chandler'),
        ('Gilbert', 'http://rssfeeds.azcentral.com/phoenix/gilbert'),
        ('Glendale &amp; Peoria', 'http://rssfeeds.azcentral.com/phoenix/glendaleandpeoria'),
        ('Mesa', 'http://rssfeeds.azcentral.com/phoenix/mesa'),
        ('Phoenix', 'http://rssfeeds.azcentral.com/phoenix/phoenix'),
        ('Scottsdale', 'http://rssfeeds.azcentral.com/phoenix/scottsdale'),
        ('SW Valley', 'http://rssfeeds.azcentral.com/phoenix/swvalley'),
        ('Suprise', 'http://rssfeeds.azcentral.com/phoenix/surprise'),
        ('Tempe &amp; Ahwatukee', 'http://rssfeeds.azcentral.com/phoenix/tempe'),
    ]
PK�X����arret_sur_images.png�PNG


IHDR�alIDATxڍ�)�� ��"��ȑ#c�Hdl$�EFFb�������S��2I�B��jY��>ky���yV��K)���g� 2���_���mQ.Dm1�M#r�2�h��(��,ssraWʇr9�${���.8G@1�w�|s:�*P[�:n�kY�ְ`�L4��E�Í�;�!�����Tt���ߢ �օ����~�)��F
��(Uo�������8eW��N�Z���U�'y�W�uH��7~.bm]浈"*��#�UR�Z��׈�7�5�C��3�b�b�k
�5����A�~�oct��S�_-���(��O�b�
",���뜳��s�$MX0Ǝ������>
Z�K��IEND�B`�PK�XW}��arret_sur_images.recipefrom __future__ import unicode_literals

__license__ = 'WTFPL'
__author__ = '2013, François D. <franek at chicour.net>'
__description__ = 'Get some fresh news from Arrêt sur images'


from calibre.web.feeds.recipes import BasicNewsRecipe


class Asi(BasicNewsRecipe):

    title = 'Arrêt sur images'
    __author__ = 'François D. (aka franek)'
    description = 'Global news in french from news site "Arrêt sur images"'

    oldest_article = 7.0
    language = 'fr'
    needs_subscription = True
    max_articles_per_feed = 100

    simultaneous_downloads = 1
    timefmt = '[%a, %d %b %Y %I:%M +0200]'
    cover_url = 'http://www.arretsurimages.net/images/header/menu/menu_1.png'

    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True

    feeds = [
        ('vite dit et gratuit', 'http://www.arretsurimages.net/vite-dit.rss'),
        ('Toutes les chroniques', 'http://www.arretsurimages.net/chroniques.rss'),
        ('Contenus et dossiers', 'http://www.arretsurimages.net/dossiers.rss'),
    ]

    conversion_options = {'smarten_punctuation': True}

    remove_tags = [dict(id='vite-titre'), dict(id='header'), dict(id='wrap-connexion'), dict(id='col_right'),
                   dict(name='div', attrs={'class': 'bloc-chroniqueur-2'}), dict(id='footercontainer')]

    def print_version(self, url):
        return url.replace('contenu.php', 'contenu-imprimable.php')

    def get_browser(self):
        # Need to use robust HTML parser
        br = BasicNewsRecipe.get_browser(self, use_robust_parser=True)
        if self.username is not None and self.password is not None:
            br.open('http://www.arretsurimages.net/index.php')
            br.select_form(nr=0)
            br.form.set_all_readonly(False)
            br['redir'] = 'forum/login.php'
            br['username'] = self.username
            br['password'] = self.password
            br.submit()
        return br
PK�X�,��ars_technica.png�PNG


IHDR(-SKPLTE���������2��A��H��~�������� ��#�Ι�ը��m�ܷ��|����P��^��i���$�NJq��.uIDATx^e�G�@Ĩ���)�i�X�ȋF�()�S1�PsG@�U��?���y���y�	��	~��i��Yp粯+��n��X���Z�Nr���]���4����4���Mӧ�` b���OIEND�B`�PK�X(�Z�>>ars_technica.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
arstechnica.com
'''

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 ArsTechnica(BasicNewsRecipe):
    title = u'Ars Technica'
    language = 'en'
    __author__ = 'Darko Miletic, Sujata Raman, Alexis Rohou, Tom Sparks'
    description = 'Ars Technica: Serving the technologist for 1.2 decades'
    publisher = 'Conde Nast Publications'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    remove_empty_feeds = True
    extra_css             = '''
    body {font-family: Arial,sans-serif}
    .heading{font-family: "Times New Roman",serif}
    .byline{font-weight: bold; line-height: 1em; font-size: 0.625em; text-decoration: none}
    img{display: block}
    .caption-text{font-size:small; font-style:italic}
    .caption-byline{font-size:small; font-style:italic; font-weight:bold}
    .video, .page-numbers, .story-sidebar { display: none }
    .image { display: block }
    '''

    keep_only_tags = [
        dict(itemprop=['headline', 'description']),
        classes('post-meta article-guts standalone'),
    ]

    remove_tags = [
        classes('site-header video corner-info article-expander left-column related-stories'),
        dict(name=['object', 'link', 'embed', 'iframe', 'meta']),
        dict(id=['social-left', 'article-footer-wrap']),
        dict(name='nav', attrs={'class': 'subheading'}),
    ]
    remove_attributes = ['lang', 'style']

    # Feed are found here: http://arstechnica.com/rss-feeds/
    feeds = [
        ('Ars Technica', 'http://feeds.arstechnica.com/arstechnica/index'),
        ('Features', 'http://feeds.arstechnica.com/arstechnica/features'),
        ('Technology Lab', 'http://feeds.arstechnica.com/arstechnica/technology-lab'),
        ('Gear &amp; Gadgets', 'http://feeds.arstechnica.com/arstechnica/gadgets'),
        ('Ministry of Innovation', 'http://feeds.arstechnica.com/arstechnica/business'),
        ('Risk Assessment', 'http://feeds.arstechnica.com/arstechnica/security'),
        ('Law &amp; Disorder', 'http://feeds.arstechnica.com/arstechnica/tech-policy'),
        ('Infinite Loop', 'http://feeds.arstechnica.com/arstechnica/apple'),
        ('Opposable Thumbs', 'http://feeds.arstechnica.com/arstechnica/gaming'),
        ('Scientific Method', 'http://feeds.arstechnica.com/arstechnica/science'),
        ('The Multiverse', 'http://feeds.arstechnica.com/arstechnica/multiverse'),
        ('Cars Technica', 'http://feeds.arstechnica.com/arstechnica/cars'),
        ('Staff', 'http://feeds.arstechnica.com/arstechnica/staff-blogs'),
        ('Open Source', 'http://feeds.arstechnica.com/arstechnica/open-source'),
        ('microsoft', 'http://feeds.arstechnica.com/arstechnica/microsoft'),
        ('software', 'http://feeds.arstechnica.com/arstechnica/software'),
        ('telecom', 'http://feeds.arstechnica.com/arstechnica/telecom'),
        ('Internet', 'http://feeds.arstechnica.com/arstechnica/web'),
    ]

    recursions = 1

    def is_link_wanted(self, url, tag):
        return re.search(r'/[0-9]/$', url) is not None

    def postprocess_html(self, soup, first_fetch):
        if not first_fetch:
            for x in soup.findAll(itemprop=['headline', 'description']):
                x.extract()
            for x in soup.findAll(**classes('post-meta')):
                x.extract()
        return soup
PK�X�0�2��asahi_shimbun_en.png�PNG


IHDR  D����PLTE���������OOORRRSSSTTT\\\hhhoooqqq������������������������������秧������������


���   ^^^___bbbiiijjjkkknnnwww|||������###���������������,,,�����������%%������������---������999���������������FFFIIILLL������������곳			������UUUXXXYYY[[[]]]������VVVWWW������������������...���ZZZ///������111������������666���������777������888��```����aaa����  �""�##����**���eee�..�//���fff===����CC???���CCC�TT�UUEEE�ZZmmm�bb����iippp�nn����qqJJJ�uu����yyrrr������tttއ�uuu!!!��xxx㚚yyy䞞䟟墢zzz{{{


���謬譭}}}QQQ괴칹������ŀ����񁁁�����م������߆������������$$$���'''(((���������nHs
IDATxڝ҃�Q��k۶m۶۶m۶m�������<u�Y����ʞ���裒eg�d�^�5�n�|Z��Ƽi*�F��~A��?�^��doa �I�w�h�nUk3���Bl���l�_�JS���3`�m��Ot�G��5�w� p��Zc��N[��}�zcFQ�	 �{�u�i���
u�։'0Q`p{�TJ\b��M�;�:��d T
����;<=kf:�
kU��.����i�1a������5�����ܭ�j�a�Q��Hո�-��-�wO69�]W]��R����bJ��s��aC�j2���v�4�3w������`���U-Od�Hu��d�0�#X���DSj!�~��\fiiy��I'���m	��W����U��ܰ��w����]ǯ�zN�>?�v�ޓo@��b�| M�p���l��`ԏM�~C~%Z�
���>e��FƘ��=�/��tY�U���Hc�Ŧ<��p�{d����s�BqvSNY/JIEND�B`�PK�X&���asahi_shimbun_en.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = "GPL v3"
__copyright__ = "2022, Albert Aparicio Isarn <aaparicio at posteo.net>"

"""
https://www.asahi.com/ajw/
"""

from datetime import datetime

from calibre.web.feeds.news import BasicNewsRecipe


class AsahiShimbunEnglishNews(BasicNewsRecipe):
    title = "The Asahi Shimbun"
    __author__ = "Albert Aparicio Isarn"

    description = ("The Asahi Shimbun is widely regarded for its journalism as the most respected daily newspaper in Japan."
                   " The English version offers selected articles from the vernacular Asahi Shimbun, as well as extensive"
                   " coverage of cool Japan,focusing on manga, travel and other timely news.")
    publisher = "The Asahi Shimbun Company"
    publication_type = "newspaper"
    category = "news, japan"
    language = "en_JP"

    index = "https://www.asahi.com"
    masthead_url = "https://p.potaufeu.asahi.com/ajw/css/images/en_logo@2x.png"

    oldest_article = 3
    max_articles_per_feed = 40
    no_stylesheets = True
    remove_javascript = True

    remove_tags_before = {"id": "MainInner"}
    remove_tags_after = {"class": "ArticleText"}
    remove_tags = [{"name": "div", "class": "SnsUtilityArea"}]

    def get_whats_new(self):
        soup = self.index_to_soup(self.index + "/ajw/new")
        news_section = soup.find("div", attrs={"class": "specialList"})

        new_news = []

        for item in news_section.findAll("li"):
            title = item.find("p", attrs={"class": "title"}).string
            date_string = item.find("p", attrs={"class": "date"}).next
            date = date_string.strip()
            url = self.index + item.find("a")["href"]

            new_news.append(
                {
                    "title": title,
                    "date": datetime.strptime(date, "%B %d, %Y").strftime("%Y/%m/%d"),
                    "url": url,
                    "description": "",
                }
            )

        return new_news

    def get_top6(self, soup):
        top = soup.find("ul", attrs={"class": "top6"})

        top6_news = []

        for item in top.findAll("li"):
            title = item.find("p", attrs={"class": "title"}).string
            date_string = item.find("p", attrs={"class": "date"}).next
            date = date_string.strip()
            url = self.index + item.find("a")["href"]

            top6_news.append(
                {
                    "title": title,
                    "date": datetime.strptime(date, "%B %d, %Y").strftime("%Y/%m/%d"),
                    "url": url,
                    "description": "",
                }
            )

        return top6_news

    def get_section_news(self, soup):
        news_grid = soup.find("ul", attrs={"class": "default"})

        news = []

        for item in news_grid.findAll("li"):
            title = item.find("p", attrs={"class": "title"}).string
            date_string = item.find("p", attrs={"class": "date"}).next
            date = date_string.strip()

            url = self.index + item.find("a")["href"]

            news.append(
                {
                    "title": title,
                    "date": datetime.strptime(date, "%B %d, %Y").strftime("%Y/%m/%d"),
                    "url": url,
                    "description": "",
                }
            )

        return news

    def get_section(self, section):
        soup = self.index_to_soup(self.index + "/ajw/" + section)

        section_news_items = self.get_top6(soup)
        section_news_items.extend(self.get_section_news(soup))

        return section_news_items

    def get_special_section(self, section):
        soup = self.index_to_soup(self.index + "/ajw/" + section)
        top = soup.find("div", attrs={"class": "Section"})

        special_news = []

        for item in top.findAll("li"):
            item_a = item.find("a")

            text_split = item_a.text.strip().split("\n")
            title = text_split[0]
            description = text_split[1].strip()

            url = self.index + item_a["href"]

            special_news.append(
                {
                    "title": title,
                    "date": "",
                    "url": url,
                    "description": description,
                }
            )

        return special_news

    def parse_index(self):
        # soup = self.index_to_soup(self.index)

        feeds = [
            ("What's New", self.get_whats_new()),
            ("National Report", self.get_section("national_report")),
            ("Politics", self.get_section("politics")),
            ("Business", self.get_section("business")),
            ("Asia & World - China", self.get_section("asia_world/china")),
            ("Asia & World - Korean Peninsula", self.get_section("asia_world/korean_peninsula")),
            ("Asia & World - Around Asia", self.get_section("asia_world/around_asia")),
            ("Asia & World - World", self.get_section("asia_world/world")),
            ("Sci & Tech", self.get_section("sci_tech")),
            ("Culture - Style", self.get_section("culture/style")),
            ("Culture - Cooking", self.get_section("culture/cooking")),
            ("Culture - Movies", self.get_section("culture/movies")),
            ("Culture - Manga & Anime", self.get_section("culture/manga_anime")),
            ("Travel", self.get_section("travel")),
            ("Sports", self.get_section("sports")),
            ("Opinion - Editorial", self.get_section("opinion/editorial")),
            ("Opinion - Vox Populi", self.get_section("opinion/vox")),
            ("Opinion - Views", self.get_section("opinion/views")),
            ("Special", self.get_special_section("special")),
        ]

        return feeds
PK�X�TTasco_de_vida.png�PNG


IHDR(-SPPLTE


!#   !# !"!!! ""!"""""7%""###9$$$(#!/$ '''(((+++,,,>&---&03'03...///.12/13111222B4/]+E4/`+~'l-???@@@AAABBBEEEGGGJJJMMM|=&NNNQQQRRR�6
�7[[[�3�:
�:	]]]```�<�9�@�Bqqq�C�D�Gzzz~~~���������������������������������������ұ�ø������������������������������������������������������������������L?�IDATx�c�SCzr�(@�A
����jp>E>�'+�'3cl�� �
�����*���~r��0��&�AjbB�nLf|v�����)����W~`��HF�����:�ITxhNt�C\������o��k���En�����<�YRJX��Oz|�����2ХJ윂l�b�<<�@wps���	rr	�K@
�s���'/���~IEND�B`�PK�X��p��asco_de_vida.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HindustanTimes(BasicNewsRecipe):
    title = u'Asco de vida'
    language = 'es'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    keep_only_tags = dict(name='div', attrs={'class': 'box story'})

    feeds = [
        ('News',
         'http://feeds2.feedburner.com/AscoDeVida'),
    ]
PK�X���RRasia_one.png�PNG


IHDR  szz�IDATx��Wl���
���=:A!U�����m
��r�\fffff�c�����
�}�?{c8[e\i�0�����.��iDQQ��S�O��TK�ꪹ=�S�o`�<d�W��X��U�c���������iE�t��`�wU�;��.��}��i�Kz��ls���Au���v����^ljl�}��ɮ;V2~u<��\x4/�ā�"��A>vd2!�L�S2H���=�i=�cL�_�m�����j�U|�����r
6\��o"S�
H���Ú���Q���;��ڨS�֞+C>���Hl0���
��K�\G|ie^��u��%���]�3��R ��y1�sL�PM��(�2�
�E�S��L+�ހ���y��a������ ���?K��BV*
j,���P8�>��M_HlgNd5�O��5�>Ud�Ov.Ŧ���>���g2w	O�*�4�1��oL�U�r>\�Kk�%o��וp;���J8K�s��+}	��L�� N�'?��܉�ﻱ.�o���}m���/�k�3�Y�~_�l?��1s��@����_cP�,㶆��~�&���i
���,j�*i�eC��������-����T�ګ��H@�d�x�����S�[�����Xv����ΨO�x|�y9i���T�VCʗGþ����Fw2�x���	:I8%�쨗2"�<��b�c��H�Ѩ����:2D?�!!�oO"��y-��N�q�5����Jx[K�2E)��$�V�1��(������lM8�CƗ�H��4�@&G!ӖGh@�k�h
$,"|��_��w|�wܜ�j�.����Ng�0��n��)X�|"���@�I=)9q.$����~X���E������ె���i�ŋ6t��/���z��8�C�h</�d�YM�
01:�ߗ��,���k����o��8C���y�J7�ሀ)��a���4��R	wZr��%�z���D���l'�w%�i6пϼ�M��Ӏ���9.����x��u��ؽLhT{Kn�)a�ԁ8f�s?Lo)LH3�=��3R�53�%L��lZ�e!P*z�PRs�4�qb;�����id�s����e����U`Z2`�@~.�|�a&;,�_��Zq��<1L��u�ͬ�4���0pY7wY�s����ǀ8-aG���ؿ��t$qR��\��Q�ԏ��{��x��"�?��G10���}
 ������]��y��%��q�0=HV�������e�Z)X=��)�/`���%I٭�nl7���wܑ��h0'��J
D���~�R�P��^��0؞>��Sd~�?!w�ɚK�͐:��#[��
��X��t!�BA�*�Wg�r%�ᐆ\��8�ɀ�%�y�e�#Z�{W��$�|�$�J�&W2+n]r֋�uTk␝H>����D��K%�N/�㨾�J��K)+ra2j��R�u�\�5����]�{���_˿��D�N||��l�gx�ͳ?�>������<Ϸ=��?�y�[#%�N��IEND�B`�PK�X�,/,llasia_one.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Bruce <bruce at dotdoh.com>'
'''
asiaone.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AsiaOne(BasicNewsRecipe):
    title = u'AsiaOne'
    oldest_article = 2
    max_articles_per_feed = 100
    __author__ = 'Bruce'
    description = 'News from Singapore Press Holdings Portal'
    no_stylesheets = False
    language = 'en_SG'
    remove_javascript = True
    remove_tags = [dict(name='span', attrs={'class': 'footer'})]
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'headline'}),
        dict(name='div', attrs={
             'class': ['article-content', 'person-info row']})
    ]

    feeds = [
        ('Singapore', 'http://asiaone.feedsportal.com/c/34151/f/618415/index.rss'),
        ('Asia', 'http://asiaone.feedsportal.com/c/34151/f/618416/index.rss')

    ]
PK�X[mj�		asianreviewofbooks.png�PNG


IHDR��h6�IDATx�e�QKA���#I�0��2����z�2� �I���G�O ����`b�
��B@��$�(�B����m��'-�0�������{��.�g5栥�2G���fQ�5j�hj@5�"
B�X8bD��̙ݢ[�f�섪���7[7��ԉ��{
;��L�C,h�gӃ/�۽#*�k�)��P"Аv�v&.��~�;�:�ERE��X�@�D9��$���~N��&�`���@^���a��N�%��ص�:��40 i�n��~��q�l(�~�~�(�w?��<iQ�\fL���/��'�)���EZ���w�t�[����^��
B�!�<>�B,���P/��V�p��|�Wѓ���Y���
L���º`�
{�jΨ8_�7>�'�C�J��>
��p�S��'�Ѫ�|�v�֭�N���D
6�����u�J'/t�R����e_���EH���&�IEND�B`�PK�X\=d۝�asianreviewofbooks.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2012-2017, Darko Miletic <darko.miletic at gmail.com>'
'''
asianreviewofbooks.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AsianReviewOfBooks(BasicNewsRecipe):
    title = 'The Asian Review of Books'
    __author__ = 'Darko Miletic'
    description = 'In addition to reviewing books about or of relevance to Asia, the Asian Review of Books also features long-format essays by leading Asian writers and thinkers, to providing an unparalleled forum for discussion of key contemporary issues by Asians for Asia and a vehicle of intellectual depth and breadth where leading thinkers can write on the books, arts and ideas of the day. Widely quoted and referenced, with an archive of more than one thousand book reviews, it is the only web resource dedicated to Asian books. And now, with the addition of the new premium content, the Asian Review of Books, is a must-read publication.'  # noqa
    publisher = 'The Asian Review of Books'
    category = 'literature, books, reviews, Asia'
    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    language = 'en_CN'
    publication_type = 'magazine'
    auto_cleanup = True
    masthead_url = 'https://i2.wp.com/asianreviewofbooks.com/content/wp-content/uploads/2016/09/ARBwidelogo.png'
    extra_css             = """
                               body{font-family: "Droid Serif", serif}
                               .entry-title {font-family: "Playfair Display", serif}
                               img {display: block}
                            """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    feeds = [(u'Articles', u'http://asianreviewofbooks.com/content/feed/')]
PK�X�"r��astro_news_pl.png�PNG


IHDR(-S�PLTE111Zkk�ss�{{�{{猌����RR�ZZ�RR�cc�cc�kk�!1ss�ss�{{΄�焄�{��9���))R��絵���JB�JJ�!!9RR�RR�)))J���B������99k���99{BB������ZZ�JJ�11cJJ�cc�))c���))))BB{{{֥�ޜ�筭�11R��ƽ������������kk�11B���tRNS@��f�IDATx�MO�uDQ}�߶�Xs4��W��F����ߌ���{8��o��|���9��=);~/�&�<YR�~/`��b�Z
�kQTK�����1���r6۝-6���`h��aƖ����9���F�`܎`��㚮oH���E1�tK��p�x��Qe���b��|F�>мd�I������t>�oj��I�R�IEND�B`�PK�X�V�
��astro_news_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AstroNEWS(BasicNewsRecipe):
    title = u'AstroNEWS'
    __author__ = 'fenuks'
    description = u'AstroNEWS regularnie dostarcza wiadomości o wydarzeniach związanych z astronomią i astronautyką. Informujemy o aktualnych odkryciach i wydarzeniach naukowych, zapowiadamy ciekawe zjawiska astronomiczne. Serwis jest częścią portalu astronomicznego AstroNET prowadzonego przez miłośników astronomii i zawodowych astronomów.'  # noqa
    category = 'astronomy, science'
    language = 'pl'
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    cover_url = 'http://news.astronet.pl/img/logo_news.jpg'
    remove_attributes = ['width', 'align']
    remove_tags = [dict(name='hr')]
    feeds = [(u'Wiadomości', u'http://news.astronet.pl/rss.cgi')]

    def print_version(self, url):
        return url.replace('astronet.pl/', 'astronet.pl/print.cgi?')
PK�XϽ���athens_news.png�PNG


IHDR��h6�IDATx�u�	o�@���P� �Mcb�V!Z�CQjO���"�t�]v�yo��+J^�E��y�Ӥ���L/��a�^�1!��_�9WU5MSEQ� ��&�aߧpj�e%IR��
���v�"��eL.��
��4z8lۮS!���`0��Pk�ߓ"F�uQی�v��1	�j�Z����c~
�fQs����(���q�SN�ic�b��$�CrDZ��4���OE��_A���o6l��Phh��0�
�着�`v���ȥi�����g���G����a�F<�+\�i�������k@QԧG�u=�٦��(���A��$v[-I;��s�e:����Qv���8N�V�9s���i?�LէTD��IEND�B`�PK�XT��$
$
athens_news.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
www.athensnews.gr
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AthensNews(BasicNewsRecipe):
    title = 'Athens News'
    __author__ = 'Darko Miletic'
    description = 'Greece in English since 1952'
    publisher = 'NEP Publishing Company SA'
    category = 'news, politics, Greece, Athens'
    oldest_article = 1
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en_GR'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://www.athensnews.gr/sites/athensnews/themes/athensnewsv3/images/logo.jpg'
    extra_css             = """
                               body{font-family: Arial,Helvetica,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                               .big{font-size: xx-large; font-family: Georgia,serif}
                               .articlepubdate{font-size: small; color: gray; font-family: Georgia,serif}
                               .lezanta{font-size: x-small; font-weight: bold; text-align: left; margin-bottom: 1em; display: block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    remove_tags = [
        dict(name=['meta', 'link'])
    ]
    keep_only_tags = [
        dict(name='span', attrs={'class': 'big'}), dict(
            name='td', attrs={'class': ['articlepubdate', 'text']})
    ]
    remove_attributes = ['lang']

    feeds = [

    (u'News', u'http://www.athensnews.gr/category/1/feed'),
    (u'Politics', u'http://www.athensnews.gr/category/8/feed'),
    (u'Business', u'http://www.athensnews.gr/category/2/feed'),
    (u'Economy', u'http://www.athensnews.gr/category/11/feed'),
    (u'Community', u'http://www.athensnews.gr/category/5/feed'),
    (u'Arts', u'http://www.athensnews.gr/category/3/feed'),
    (u'Living in Athens', u'http://www.athensnews.gr/category/7/feed'),
    (u'Sports', u'http://www.athensnews.gr/category/4/feed'),
    (u'Travel', u'http://www.athensnews.gr/category/6/feed'),
    (u'Letters', u'http://www.athensnews.gr/category/44/feed'),
    (u'Media', u'http://www.athensnews.gr/multimedia/feed')
    ]

    def print_version(self, url):
        return url + '?action=print'

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X�+���atlantic.png�PNG


IHDR�W�?6PLTE�������������쿿柟ُ�ӏ�Ҁ���pp�``�PP�@@�  ����(��eIDATx�u�� ���n�{�H~��M'S?�+Z�
D��a��������}m!�`(c��+�_oe0�FC}��ԻU�Sg�;�fb
���3�IEND�B`�PK�X�N	�M$M$atlantic.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
import json
from xml.sax.saxutils import escape, quoteattr

from calibre.web.feeds.news import BasicNewsRecipe, prefixed_classes as prefix_classes, classes

web_version = False
test_article = None
# test_article = 'https://www.theatlantic.com/health/archive/2020/12/covid-19-second-surge/617415/?utm_source=feed'


# {{{ parse article JSON
def process_image_block(lines, block):
    caption = block.get('captionText')
    caption_lines = []
    if caption:
        if block.get('attributionText', '').strip():
            caption += ' (' + block['attributionText'] + ')'
        caption_lines.append('<p style="font-style: italic">' + caption + '</p>')
    lines.append('<div style="text-align: center"><img src={}/>'.format(quoteattr(block['url'])))
    lines.extend(caption_lines)
    lines.append('</div>')


def json_to_html(raw):
    data = json.loads(raw)
    # open('/t/p.json', 'w').write(json.dumps(data, indent=2))
    data = sorted((v['data'] for v in data['props']['pageProps']['urqlState'].values()), key=len)[-1]
    article = json.loads(data)['article']
    lines = []
    lines.append('<h1 style="align: center">' + escape(article['title']) + '</h1>')
    lines.append('<h2 style="align: center">' + escape(article['dek']) + '</h2>')
    auts = ', '.join(x['displayName'] for x in article['authors'])
    if auts:
        lines.append('<p style="align: center">by ' + escape(auts) + '</p>')
    if article.get('leadArt') and 'image' in article['leadArt']:
        process_image_block(lines, article['leadArt']['image'])
    for item in article['content']:
        tn = item.get('__typename', '')
        if tn.endswith('Image'):
            process_image_block(lines, item)
            continue
        html = item.get('innerHtml')
        if html is None or '</iframe>' in html:
            continue
        if 'innerHtml' not in item:
            continue
        tagname = item.get('tagName', 'P').lower()
        lines.append('<{0}>{1}</{0}>'.format(tagname, html))
    return '<html><body><div id="from-json-by-calibre">' + '\n'.join(lines) + '</div></body></html>'


class NoJSON(ValueError):
    pass


def extract_html(soup):
    script = soup.findAll('script', id='__NEXT_DATA__')
    if not script:
        raise NoJSON('No script tag with JSON data found')
    raw = script[0].contents[0]
    return json_to_html(raw)

# }}}


class TheAtlantic(BasicNewsRecipe):

    if web_version:
        title = 'TheAtlantic.com'
        description = 'News and editorial about politics, culture, entertainment, tech, etc. Contains many articles not seen in The Atlantic magazine'
    else:
        title = 'The Atlantic'
        description = 'Current affairs and politics focussed on the US'
        INDEX = 'https://www.theatlantic.com/magazine/'

    __author__ = 'Kovid Goyal'
    language = 'en'
    encoding = 'utf-8'

    keep_only_tags = [
        dict(itemprop=['headline']),
        classes(
            'c-article-header__hed c-rubric article-header c-article-meta c-lead-media'
            ' lead-img article-cover-extra article-body article-magazine article-cover-content'
        ),
        prefix_classes(
            'ArticleHeader_root__ ArticleLayoutSection_main__ ArticleBody_root__'
        ),
        dict(itemprop='articleBody'),
        # these are for photos articles
        dict(id=['article-header', 'from-json-by-calibre']),
        classes('photos'),
    ]
    remove_tags = [
        classes(
            'c-ad c-share-social c-recirculation-link social-kit-top letter-writer-info callout secondary-byline embed-wrapper'
            ' offset-wrapper boxtop-most-popular social-icons hints read-more c-article-writer__social'
        ),
        prefix_classes('ArticleRecirc_inline__'),
        {
            'name': ['meta', 'link', 'noscript', 'aside', 'h3']
        },
        {
            'attrs': {
                'class': ['offset-wrapper', 'boxtop-most-popular']
            }
        },
        {
            'attrs': {
                'class': lambda x: x and 'article-tools' in x
            }
        },
        {
            'src': lambda x: x and 'spotxchange.com' in x
        },
    ]
    remove_tags_after = classes('article-body')

    no_stylesheets = True
    remove_attributes = ['style']
    extra_css = '''
        .credit { text-align: right; font-size: 75%; display: block }
        .figcaption { font-size: 75% }
        .caption { font-size: 75% }
        .lead-img { display: block }
        p.dropcap:first-letter {
        float: left; text-transform: uppercase; font-weight: bold; font-size: 5.55em; line-height: 0.83;
        margin: 0; padding-right: 7px; margin-bottom: -2px; text-align: center;
        }
    '''

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.set_cookie('inEuropeanUnion', '0', '.theatlantic.com')
        return br

    def preprocess_raw_html(self, raw_html, url):
        try:
            return extract_html(self.index_to_soup(raw_html))
        except NoJSON:
            self.log.warn('No JSON found in: {} falling back to HTML'.format(url))
        except Exception:
            self.log.exception('Failed to extract JSON data from: {} falling back to HTML'.format(url))
        return raw_html

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-srcset': True}):
            # img['src'] = img['data-srcset'].split()[0]
            data_srcset = img['data-srcset']
            if ',' in data_srcset:
                img['src'] = data_srcset.split(',')[0]
            else:
                img['src'] = data_srcset.split()[0]
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup

    def print_version(self, url):
        ans = url.partition('?')[0] + '?single_page=true'
        if '/video/' in ans:
            ans = None
        return ans

    if web_version and not test_article:

        use_embedded_content = False

        feeds = [
            ('The Atlantic', 'https://www.theatlantic.com/feed/all/'),
            ('Best of The Atlantic', 'https://www.theatlantic.com/feed/best-of/'),
            ('Politics | The Atlantic', 'https://www.theatlantic.com/feed/channel/politics/'),
            ('Business | The Atlantic', 'https://www.theatlantic.com/feed/channel/business/'),
            ('Culture | The Atlantic', 'https://www.theatlantic.com/feed/channel/entertainment/'),
            ('Global | The Atlantic', 'https://www.theatlantic.com/feed/channel/international/'),
            ('Technology | The Atlantic', 'https://www.theatlantic.com/feed/channel/technology/'),
            ('U.S. | The Atlantic', 'https://www.theatlantic.com/feed/channel/national/'),
            ('Health | The Atlantic', 'https://www.theatlantic.com/feed/channel/health/'),
            ('Video | The Atlantic', 'https://www.theatlantic.com/feed/channel/video/'),
            ('Sexes | The Atlantic', 'https://www.theatlantic.com/feed/channel/sexes/'),
            ('Education | The Atlantic', 'https://www.theatlantic.com/feed/channel/education/'),
            ('Science | The Atlantic', 'https://www.theatlantic.com/feed/channel/science/'),
            ('News | The Atlantic', 'https://www.theatlantic.com/feed/channel/news/'),
            ('Press Releases | The Atlantic', 'https://www.theatlantic.com/feed/channel/press-releases/'),
            ('Newsletters | The Atlantic', 'https://www.theatlantic.com/feed/channel/newsletters/'),
            ('The Atlantic Photo', 'https://feeds.feedburner.com/theatlantic/infocus'),
            ('Notes | The Atlantic', 'https://feeds.feedburner.com/TheAtlanticNotes'),
        ]
    else:
        def parse_index(self):
            if test_article:
                return [('Articles', [{'title': 'Test article', 'url': test_article}])]
            soup = self.index_to_soup(self.INDEX)
            img = soup.find(**prefix_classes('IssueDescription_cover__'))
            if img is not None:
                self.cover_url = img['src']
            current_section, current_articles = 'Cover Story', []
            feeds = []
            for x in soup.findAll(**prefix_classes('TocFeaturedSection_heading__ TocSection_heading__ TocHeroGridItem_hedLink___ TocGridItem_hedLink__')):
                cls = x['class']
                if not isinstance(cls, str):
                    cls = ' '.join(cls)
                title = self.tag_to_string(x).strip()
                if 'Section' in cls:
                    if current_articles:
                        feeds.append((current_section, current_articles))
                    current_section, current_articles = title, []
                    self.log(current_section)
                    continue
                url = x['href']
                current_articles.append({'title': title, 'url': url})
                self.log('\t', title, url)
            if current_articles:
                feeds.append((current_section, current_articles))
            return feeds


if __name__ == '__main__':
    import sys

    from calibre.ebooks.BeautifulSoup import BeautifulSoup
    print(extract_html(BeautifulSoup(open(sys.argv[-1]).read())))
PK�Xf��YYatlantic_com.png�PNG


IHDR  D����PLTE��������������"'�.2�55�����"���������������������5;�8;�BB��"+�BF�NP�'.�PP�]_�JN�RT�FL�Y\�Z]�Z_�]`�mo�np�`c�ei���������������''��������������������������������������""�������"�������'�+2�58��������wz�~��~����+.�vx��������wz�58�88������������������������~~�pt��ik�jm�������������mo�no�np�|}������22�������������������w{����|~�vx���w��HRIDATx�|�Ӄ#0��f��8�w=ۻ]۶m�6���K��Of�`��<�x���<��'z�~M3"���k��w��q@��8�e�R't�q��ظck�2)O$���0R����M������D���8�	a��jAU+މ:�Mj���!H`����u�A/�P�����>}`%x����#4��2��J���HŌ��VT�1��=�vl���]����r�^��(R���
�-r��<���L�#3�@b��Մ�,=L����������(`��]�s��_�D�h -H���)�
����P_�H�z� g �0��P�29��5IEND�B`�PK�XLz��L$L$atlantic_com.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
import json
from xml.sax.saxutils import escape, quoteattr

from calibre.web.feeds.news import BasicNewsRecipe, prefixed_classes as prefix_classes, classes

web_version = True
test_article = None
# test_article = 'https://www.theatlantic.com/health/archive/2020/12/covid-19-second-surge/617415/?utm_source=feed'


# {{{ parse article JSON
def process_image_block(lines, block):
    caption = block.get('captionText')
    caption_lines = []
    if caption:
        if block.get('attributionText', '').strip():
            caption += ' (' + block['attributionText'] + ')'
        caption_lines.append('<p style="font-style: italic">' + caption + '</p>')
    lines.append('<div style="text-align: center"><img src={}/>'.format(quoteattr(block['url'])))
    lines.extend(caption_lines)
    lines.append('</div>')


def json_to_html(raw):
    data = json.loads(raw)
    # open('/t/p.json', 'w').write(json.dumps(data, indent=2))
    data = sorted((v['data'] for v in data['props']['pageProps']['urqlState'].values()), key=len)[-1]
    article = json.loads(data)['article']
    lines = []
    lines.append('<h1 style="align: center">' + escape(article['title']) + '</h1>')
    lines.append('<h2 style="align: center">' + escape(article['dek']) + '</h2>')
    auts = ', '.join(x['displayName'] for x in article['authors'])
    if auts:
        lines.append('<p style="align: center">by ' + escape(auts) + '</p>')
    if article.get('leadArt') and 'image' in article['leadArt']:
        process_image_block(lines, article['leadArt']['image'])
    for item in article['content']:
        tn = item.get('__typename', '')
        if tn.endswith('Image'):
            process_image_block(lines, item)
            continue
        html = item.get('innerHtml')
        if html is None or '</iframe>' in html:
            continue
        if 'innerHtml' not in item:
            continue
        tagname = item.get('tagName', 'P').lower()
        lines.append('<{0}>{1}</{0}>'.format(tagname, html))
    return '<html><body><div id="from-json-by-calibre">' + '\n'.join(lines) + '</div></body></html>'


class NoJSON(ValueError):
    pass


def extract_html(soup):
    script = soup.findAll('script', id='__NEXT_DATA__')
    if not script:
        raise NoJSON('No script tag with JSON data found')
    raw = script[0].contents[0]
    return json_to_html(raw)

# }}}


class TheAtlantic(BasicNewsRecipe):

    if web_version:
        title = 'TheAtlantic.com'
        description = 'News and editorial about politics, culture, entertainment, tech, etc. Contains many articles not seen in The Atlantic magazine'
    else:
        title = 'The Atlantic'
        description = 'Current affairs and politics focussed on the US'
        INDEX = 'https://www.theatlantic.com/magazine/'

    __author__ = 'Kovid Goyal'
    language = 'en'
    encoding = 'utf-8'

    keep_only_tags = [
        dict(itemprop=['headline']),
        classes(
            'c-article-header__hed c-rubric article-header c-article-meta c-lead-media'
            ' lead-img article-cover-extra article-body article-magazine article-cover-content'
        ),
        prefix_classes(
            'ArticleHeader_root__ ArticleLayoutSection_main__ ArticleBody_root__'
        ),
        dict(itemprop='articleBody'),
        # these are for photos articles
        dict(id=['article-header', 'from-json-by-calibre']),
        classes('photos'),
    ]
    remove_tags = [
        classes(
            'c-ad c-share-social c-recirculation-link social-kit-top letter-writer-info callout secondary-byline embed-wrapper'
            ' offset-wrapper boxtop-most-popular social-icons hints read-more c-article-writer__social'
        ),
        prefix_classes('ArticleRecirc_inline__'),
        {
            'name': ['meta', 'link', 'noscript', 'aside', 'h3']
        },
        {
            'attrs': {
                'class': ['offset-wrapper', 'boxtop-most-popular']
            }
        },
        {
            'attrs': {
                'class': lambda x: x and 'article-tools' in x
            }
        },
        {
            'src': lambda x: x and 'spotxchange.com' in x
        },
    ]
    remove_tags_after = classes('article-body')

    no_stylesheets = True
    remove_attributes = ['style']
    extra_css = '''
        .credit { text-align: right; font-size: 75%; display: block }
        .figcaption { font-size: 75% }
        .caption { font-size: 75% }
        .lead-img { display: block }
        p.dropcap:first-letter {
        float: left; text-transform: uppercase; font-weight: bold; font-size: 5.55em; line-height: 0.83;
        margin: 0; padding-right: 7px; margin-bottom: -2px; text-align: center;
        }
    '''

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.set_cookie('inEuropeanUnion', '0', '.theatlantic.com')
        return br

    def preprocess_raw_html(self, raw_html, url):
        try:
            return extract_html(self.index_to_soup(raw_html))
        except NoJSON:
            self.log.warn('No JSON found in: {} falling back to HTML'.format(url))
        except Exception:
            self.log.exception('Failed to extract JSON data from: {} falling back to HTML'.format(url))
        return raw_html

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-srcset': True}):
            # img['src'] = img['data-srcset'].split()[0]
            data_srcset = img['data-srcset']
            if ',' in data_srcset:
                img['src'] = data_srcset.split(',')[0]
            else:
                img['src'] = data_srcset.split()[0]
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup

    def print_version(self, url):
        ans = url.partition('?')[0] + '?single_page=true'
        if '/video/' in ans:
            ans = None
        return ans

    if web_version and not test_article:

        use_embedded_content = False

        feeds = [
            ('The Atlantic', 'https://www.theatlantic.com/feed/all/'),
            ('Best of The Atlantic', 'https://www.theatlantic.com/feed/best-of/'),
            ('Politics | The Atlantic', 'https://www.theatlantic.com/feed/channel/politics/'),
            ('Business | The Atlantic', 'https://www.theatlantic.com/feed/channel/business/'),
            ('Culture | The Atlantic', 'https://www.theatlantic.com/feed/channel/entertainment/'),
            ('Global | The Atlantic', 'https://www.theatlantic.com/feed/channel/international/'),
            ('Technology | The Atlantic', 'https://www.theatlantic.com/feed/channel/technology/'),
            ('U.S. | The Atlantic', 'https://www.theatlantic.com/feed/channel/national/'),
            ('Health | The Atlantic', 'https://www.theatlantic.com/feed/channel/health/'),
            ('Video | The Atlantic', 'https://www.theatlantic.com/feed/channel/video/'),
            ('Sexes | The Atlantic', 'https://www.theatlantic.com/feed/channel/sexes/'),
            ('Education | The Atlantic', 'https://www.theatlantic.com/feed/channel/education/'),
            ('Science | The Atlantic', 'https://www.theatlantic.com/feed/channel/science/'),
            ('News | The Atlantic', 'https://www.theatlantic.com/feed/channel/news/'),
            ('Press Releases | The Atlantic', 'https://www.theatlantic.com/feed/channel/press-releases/'),
            ('Newsletters | The Atlantic', 'https://www.theatlantic.com/feed/channel/newsletters/'),
            ('The Atlantic Photo', 'https://feeds.feedburner.com/theatlantic/infocus'),
            ('Notes | The Atlantic', 'https://feeds.feedburner.com/TheAtlanticNotes'),
        ]
    else:
        def parse_index(self):
            if test_article:
                return [('Articles', [{'title': 'Test article', 'url': test_article}])]
            soup = self.index_to_soup(self.INDEX)
            img = soup.find(**prefix_classes('IssueDescription_cover__'))
            if img is not None:
                self.cover_url = img['src']
            current_section, current_articles = 'Cover Story', []
            feeds = []
            for x in soup.findAll(**prefix_classes('TocFeaturedSection_heading__ TocSection_heading__ TocHeroGridItem_hedLink___ TocGridItem_hedLink__')):
                cls = x['class']
                if not isinstance(cls, str):
                    cls = ' '.join(cls)
                title = self.tag_to_string(x).strip()
                if 'Section' in cls:
                    if current_articles:
                        feeds.append((current_section, current_articles))
                    current_section, current_articles = title, []
                    self.log(current_section)
                    continue
                url = x['href']
                current_articles.append({'title': title, 'url': url})
                self.log('\t', title, url)
            if current_articles:
                feeds.append((current_section, current_articles))
            return feeds


if __name__ == '__main__':
    import sys

    from calibre.ebooks.BeautifulSoup import BeautifulSoup
    print(extract_html(BeautifulSoup(open(sys.argv[-1]).read())))
PK�Xix����attac_es.png�PNG


IHDR  ��uIDATx��V�SY��ь�Ur���c��4L` �w���:���݉#����7Ľw_�\Ӟ�v�|�{��v��]^���ܸq��nt:�F����\.���wXP�{���#��~;���1��DRWW�AV(�|�Z,��v�0���x����/����7����LJJJMM��������7�����W^���Y�V,11���p8���aWmm���=	���D~~~ff�" )�������T�T���ƺ�������d�]����������-�w̠��@�T��:VVV.\�p����vP�ryGG��K�����TUUA@-//�h4�Oa%� �|>��N:�v�����,2����tcc�����/_����	E�dg����}��T�~tuu���s8�H������OH`+��<:=����ë��!�����.fdd�0�@XVX#�"H�d2J���*;y��뇇���`��8ƎS�`y=�J���V�U�V�3ͪH��1��D&'��D|�6&Z��D��iTJ2���F�#é�d&+��V����$&'K�45G���"�W�E$&0Y���Yn���GF��D��3�)�� ��g��S �@��#���vqH��ۯ���dQ~�5YxE��.�ۯ��I��+��V�2�s��dž�Pt�ݷ��0�x��,
,#հ8o��!���L�O��tu�CC�G�F��;;��MJ<�C�%$�`�&yb�K��b��UV�<wδ*[��c�ZW^���.{�k-�7_n77kT��J�?;#?u�ie9@���[55G�J��'���l��>z�$�`����0��C[Ԃ(�\��ի[-� ��K�r}vKI�//�Z ��"�qy	cDV�~nn�/�r��m�VL�n�V�8�/��ve!q!"LM�-
Ї�񑝞.Ӛb��O���A�ff �:���cR�U�|9����2lV��־�F����?�pA�«�����WD`$�?�����%�<)�>��N�
���П`��GO�^z�!��q�@���X��jx<MT�2��݆F�7_c�18<��H
/��„�`�QZa�:�O$Ă`�j�ydZr�x!)�p9�6�M�#uyttH�(���y-�c��l��v��n����f���n�z�n���i
Tx[��z��s��'���@Q8Ij��`����6����UTR2=3���[WM�ͭ��p�����(
^-�edfv^�������/wuw�
8^�>��Z�$)���١iz{k,pNЛ4\	p2p���m�14��j����-$���phRu�}1��j��;�e�|�}m��.�?�}'�/I�!IEND�B`�PK�X{T}}attac_es.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe


class AttacEspanaRecipe (BasicNewsRecipe):
    __author__ = 'Marc Busqué <marc@lamarciana.com>'
    __url__ = 'http://www.lamarciana.com'
    __version__ = '1.0.2'
    __license__ = 'GPL v3'
    __copyright__ = '2012, Marc Busqué <marc@lamarciana.com>'
    title = u'attac.es'
    description = u'La Asociación por la Tasación de las Transacciones Financieras y por la Ayuda a los Ciudadanos (ATTAC) es un movimiento internacional altermundialista que promueve el control democrático de los mercados financieros y las instituciones encargadas de su control mediante la reflexión política y la movilización social.'  # noqa
    url = 'http://www.attac.es'
    language = 'es'
    tags = 'contrainformación, información alternativa'
    oldest_article = 7
    remove_empty_feeds = True
    no_stylesheets = True

    def get_extra_css(self):
        if not self.extra_css:
            br = self.get_browser()
            self.extra_css = br.open_novisit(
                'https://raw.githubusercontent.com/laMarciana/gutenweb/master/dist/gutenweb.css').read().replace('@charset "UTF-8";', '')
        return self.extra_css

    cover_url = u'http://www.attac.es/wp-content/themes/attacweb/images/attaces.jpg'

    feeds = [
        (u'Attac', u'http://www.attac.es/feed'),
    ]
PK�X}���FFauto.png�PNG


IHDR  szz�
IDATx^ŗ}�UU��?k����_�TD@��7�t�qJ��2�b����s�X�F�D�Ԙ�LeV��2�������2���� \���{���k?�ݹ���.��]�c?�9�>kΞy��x�N>�!�!Ϣ��ΐ�iǰ2�I
����4n`�9�&�H���H��aL�5�Nz��g�&�:���`8MS���S=���n�7�QK��48�SQ�!Tb� 7��s�\O"AZ�-�h��ތ68�G9}��D@�v�G�)�&�����Ñ���DJ��ޅQu�.��w��_md�/�w�`���J�EZ.����>�7�V�)l��Ǯ;�-���/h��Z|!^�XjA�K/ÿ���_[���ѵ_���z--m��uw6z��oze�j�z}����>Nh�d�^jD��ͭر��`;_}�7�~���y��`��P��̀o8�<�Y+V�����߿�$��c��l�9so�v��}{��o~���Ìr�0��)�J��\oD�@���;.������9R��O@� (K6��2��=O�����S:�Qkz�l�c����W��\��_���OA�dS $���5��52�	q��G?�M���!�y��}����,[���
�<�lq�q��o����uc<G�PHJ��[| �����Qm�t6�[�ĞP�A�ƕ�6@
!�-?�|�c �K�S��E,�M���g_]�ݽ�\ҏ�py��s$h"���<����'��<Jr�(�fC5�S��"Y��ģ;��)[�<#��]}�8���[�-�
	P�?��a0(��2�\4���A�zɟ���g�s��ئM(�wʁA�D��mn�O���k��0~�2�@���ߟ��P��F���I1@�+���,�v͋ն�w.�z�r�R��j�Ҋ���*�`�)C�v&Ϝ�
�8��?���Q�^����h�V��(4!-	U4_?#L��g��_��䉵kgQ��^?�rY�a�M8(Đw>~�@��Qp��ʁ�7M�<����$�i���f�E0(BR?��9~EO�e�Y�4��v�\j;���Jl+Tl
���������JZk<2h�1 
�O4�Bݰ��(
@�A>v߻�I<��^^��Jz��E����O��@AK�n�	��������$$
B�h ��!"NN	�����h#�����]�W�SKA�(,��(�%�
)�(��9rW]������V)����rn��J�~1}���HG�FG�!)��	
xR��&&&����ޔ�������q�x�3��j�?_�n^N��e�N�cI V��]:�ʄ�mE*!��l. �X����)���u�E�<J8B,AJ&%8EU�4��y_ �>���ԇr�`�#J����Y���ӟy���IL�@�d;
X!Q� �i�wJ'�S�r�bvuz���L�S
E�\sJ�8$7�B8o�!��sKG�hN*�b�Ŵ[�U�,]��[޿xߌ
O>�_��y����J{��6��&�?���s����k�Ȣ��o��1Z��5�9�(M��)�����N��N
"����I��� ܆��"��A�h���sh}�'`-�%�4�%�A�x��<
浔�5J9'��
x�^	 ���v�¦O��� 
��٫a��9��3��hU}��4L��}CPgZ�g'�a&�!5�7�?��h��d(�{��>�%�8hhC�IEND�B`�PK�XHm[auto.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'GabrieleMarini, based on Darko Miletic'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>, Gabriele Marini'
__version__ = 'v1.02 Marini Gabriele '
__date__ = '14062010'
__description__ = 'Italian daily newspaper'

'''
http://www.corrieredellosport.it/
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Auto(BasicNewsRecipe):
    __author__ = 'Gabriele Marini'
    description = 'Auto and Formula 1'

    cover_url = 'http://www.auto.it/res/imgs/logo_Auto.png'

    title = u'Auto'
    publisher = 'CONTE Editore'
    category = 'Sport'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 60
    max_articles_per_feed = 30
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher, '--ignore-tables'
    ]

    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + \
        description + '"\ntags="' + category + '"\nlinearize_tables=True'

    keep_only_tags = [
        dict(name='h2', attrs={'class': ['tit_Article y_Txt']}),
        dict(name='h2', attrs={'class': ['tit_Article']}),
        dict(name='div', attrs={'class': ['box_Img newsdet_new ']}),
        dict(name='div', attrs={'class': ['box_Img newsdet_as ']}),
        dict(name='table', attrs={'class': ['table_A']}),
        dict(name='div', attrs={'class': ['txt_Article txtBox_cms']}),
        dict(name='testoscheda')]

    feeds = [
        (u'Tutte le News',  u'http://www.auto.it/rss/articoli.xml'),
        (u'Prove su Strada',  u'http://www.auto.it/rss/prove+6.xml'),
        (u'Novit\xe0',    u'http://www.auto.it/rss/novita+3.xml')
    ]
PK�X��/��
auto_blog.png�PNG


IHDR  szz�OIDATxڥWt*�&,Vw����e���swwwwwwww����ݥ�R6��^�M�i~�O�۞���$�o2����5��%|��;��UMf�LU��}�㬖[|m-���ڷiL��g׏��m|O��'�_u���'���B1��Olܶ�ƍg�_�lԢ3ޮЩ�U�/���-��H�9Xk��4ㅰw��b&��7
�ĭ� �ez�a��"��pzޮB�� @��:>�41Wk� 'i"�x�k�� 4�p�f2��ڭh4�Y8
�&N�{��^c��p��k�oW�'j#�'��A�T���;��W
F�o����.�|(��Zay���Q�-�T�ŵ>�&�]����l�#���#x7�Z�\'�U>�"	sw���{
`�$P5�	\�m����'���#��N��~}��n�.�^:΢IE8܃��_BT���$�+;KC�_���Ya��0�
�������V�,SP�4����p�j��sx������~B��<�|Z^���=�?��v�6ƪ1����Z~B���r�ܮ�Qq�i�&��9�F���DӅĞ�Ȏ���г��P;�=������͐�sIT���C�Ӿ<p�~����1s���J��Ͳx���鯵r60�w���6����)\�$5��;�a��ȍ�{q-�?�iZ����=���_������i�ԯ^mB���R5�������t:Mb����rH���{����wtww�����C�����.W�)̸��,�����b&�<�����3!� Ɖdr�������n���

���km=xQ��~��Q�/�Z�^i��<���G?ړ��ۇ������YEQ���z'&���?	�vl:��?s�w��Ósd�ag�y�ב���m�~m\Z����$>�o���l�)�*�!����###���]����TU%G_���}��?��R���x����CN>��V����Uރ�A/)��}b	��e)������?8�;j��;�{��J�o�x�"x��Yt�3�`�4-�n�ħ�Iح�N�?Xmmm�,����칩i4�eYv���)��V�I
�mn��
@�3�k>t�L��333�������z��9;3C.Wp��m�<��*�
�_�
'~N����h�	�$��'ϖ��#SSS(�HT��
�p�f���p��s�~r�0�PM~S-i��.B�@�90g���:�G�8��^b3�)�򰫴�'г�E���r.�r��Tn	�^�|�y_�).�&�~xH*�������T��R�f��u;"A7nK�f7�B��^<}%��U�hV?(�oO~�{����`����2��կn�R߃r*���������l���W�|<��D&_�G?�\�H�x�u�����-\�����2��w6 l�5@�|�佰�W*,���x�欸E�������	n����r��}"sWY�4�����cy&+�<�`�K�za{+nj\�#�}(DŽC+{^kF���_�h�⺌cY��DI&�ްG��B|�qwt^9�8*��^K����%8џ$�Ë��ʯ=�*�B����K;��+i~i}E0��::���oYY�{/��'ծA���EZ�p�D�6��=��N��)&�j�z�*�ԑGL�({���$-�[��'�!"���Rjz����ivq?{6<�wO4��An��4S$�

s���A�<.���r�9�q
%����G���ځj�
����Q�������%���O�0��<	<ϟ�A
�1���fԯ|��
��8��?%rUz�IEND�B`�PK�X�1+
��auto_blog.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AutoBlog(BasicNewsRecipe):
    title = u'Auto Blog'
    __author__ = 'Welovelucy'
    language = 'en'
    description = 'Auto industry news'
    oldest_article = 7
    max_articles_per_feed = 100

    feeds = [(u'AutoBlog', u'http://www.autoblog.com/rss.xml')]

    def print_version(self, url):
        return url + 'print/'
PK�X}���FFauto_prove.png�PNG


IHDR  szz�
IDATx^ŗ}�UU��?k����_�TD@��7�t�qJ��2�b����s�X�F�D�Ԙ�LeV��2�������2���� \���{���k?�ݹ���.��]�c?�9�>kΞy��x�N>�!�!Ϣ��ΐ�iǰ2�I
����4n`�9�&�H���H��aL�5�Nz��g�&�:���`8MS���S=���n�7�QK��48�SQ�!Tb� 7��s�\O"AZ�-�h��ތ68�G9}��D@�v�G�)�&�����Ñ���DJ��ޅQu�.��w��_md�/�w�`���J�EZ.����>�7�V�)l��Ǯ;�-���/h��Z|!^�XjA�K/ÿ���_[���ѵ_���z--m��uw6z��oze�j�z}����>Nh�d�^jD��ͭر��`;_}�7�~���y��`��P��̀o8�<�Y+V�����߿�$��c��l�9so�v��}{��o~���Ìr�0��)�J��\oD�@���;.������9R��O@� (K6��2��=O�����S:�Qkz�l�c����W��\��_���OA�dS $���5��52�	q��G?�M���!�y��}����,[���
�<�lq�q��o����uc<G�PHJ��[| �����Qm�t6�[�ĞP�A�ƕ�6@
!�-?�|�c �K�S��E,�M���g_]�ݽ�\ҏ�py��s$h"���<����'��<Jr�(�fC5�S��"Y��ģ;��)[�<#��]}�8���[�-�
	P�?��a0(��2�\4���A�zɟ���g�s��ئM(�wʁA�D��mn�O���k��0~�2�@���ߟ��P��F���I1@�+���,�v͋ն�w.�z�r�R��j�Ҋ���*�`�)C�v&Ϝ�
�8��?���Q�^����h�V��(4!-	U4_?#L��g��_��䉵kgQ��^?�rY�a�M8(Đw>~�@��Qp��ʁ�7M�<����$�i���f�E0(BR?��9~EO�e�Y�4��v�\j;���Jl+Tl
���������JZk<2h�1 
�O4�Bݰ��(
@�A>v߻�I<��^^��Jz��E����O��@AK�n�	��������$$
B�h ��!"NN	�����h#�����]�W�SKA�(,��(�%�
)�(��9rW]������V)����rn��J�~1}���HG�FG�!)��	
xR��&&&����ޔ�������q�x�3��j�?_�n^N��e�N�cI V��]:�ʄ�mE*!��l. �X����)���u�E�<J8B,AJ&%8EU�4��y_ �>���ԇr�`�#J����Y���ӟy���IL�@�d;
X!Q� �i�wJ'�S�r�bvuz���L�S
E�\sJ�8$7�B8o�!��sKG�hN*�b�Ŵ[�U�,]��[޿xߌ
O>�_��y����J{��6��&�?���s����k�Ȣ��o��1Z��5�9�(M��)�����N��N
"����I��� ܆��"��A�h���sh}�'`-�%�4�%�A�x��<
浔�5J9'��
x�^	 ���v�¦O��� 
��٫a��9��3��hU}��4L��}CPgZ�g'�a&�!5�7�?��h��d(�{��>�%�8hhC�IEND�B`�PK�X$a*�
�
auto_prove.recipe#!/usr/bin/env python
from __future__ import print_function
__license__   = 'GPL v3'
__author__ = 'GabrieleMarini, based on Darko Miletic'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>, Gabriele Marini'
__version__ = 'v1.02 Marini Gabriele '
__date__ = '10, January 2010'
__description__ = 'Italian daily newspaper'

'''
http://www.corrieredellosport.it/
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AutoPR(BasicNewsRecipe):
    __author__ = 'Gabriele Marini'
    description = 'Auto and Formula 1'

    cover_url = 'http://www.auto.it/res/imgs/logo_Auto.png'

    title = u'Auto Prove'
    publisher = 'CONTE Editore'
    category = 'Sport'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 60
    max_articles_per_feed = 20
    use_embedded_content = False
    recursion = 100

    remove_javascript = True
    no_stylesheets = True

    # html2lrf_options = [
    #                      '--comment', description
    #                    , '--category', category
    #                    , '--publisher', publisher
    #                    , '--ignore-tables'
    #                    ]

    keep_only_tags = [
        dict(name='h2', attrs={'class': ['tit_Article y_Txt']}),
        dict(name='h2', attrs={'class': ['tit_Article']}),
        dict(name='div', attrs={'class': ['box_Img newsdet_new ']}),
        dict(name='div', attrs={'class': ['box_Img newsdet_as ']}),
        dict(name='table', attrs={'class': ['table_A']}),
        dict(name='div', attrs={'class': ['txt_Article txtBox_cms']}),
        dict(name='testoscheda')]

    def parse_index(self):
        feeds = []
        for title, url in [
            ("Prove su Strada", "http://www.auto.it/rss/prove+6.xml")
        ]:
            soup = self.index_to_soup(url)
            soup = soup.find('channel')
            print(soup)

            for article in soup.findAllNext('item'):
                title = self.tag_to_string(article.title)
                date = self.tag_to_string(article.pubDate)
                description = self.tag_to_string(article.description)
                link = self.tag_to_string(article.guid)
#               print article
                articles = self.create_links_append(link, date, description)
                if articles:
                    feeds.append((title, articles))
            return feeds

    def create_links_append(self, link, date, description):
        current_articles = []

        current_articles.append(
            {'title': 'Generale', 'url': link, 'description': description, 'date': date}),
        current_articles.append({'title': 'Design', 'url': link.replace(
            'scheda', 'design'), 'description': 'scheda', 'date': ''}),
        current_articles.append({'title': 'Interni', 'url': link.replace(
            'scheda', 'interni'), 'description': 'Interni', 'date': ''}),
        current_articles.append({'title': 'Tecnica', 'url': link.replace(
            'scheda', 'tecnica'), 'description': 'Tecnica', 'date': ''}),
        current_articles.append({'title': 'Su Strada', 'url': link.replace(
            'scheda', 'su_strada'), 'description': 'Su Strada', 'date': ''}),
        current_articles.append({'title': 'Pagella', 'url': link.replace(
            'scheda', 'pagella'), 'description': 'Pagella', 'date': ''}),
        current_articles.append({'title': 'Rilevamenti', 'url': link.replace(
            'scheda', 'telemetria'), 'description': 'Rilevamenti', 'date': ''})

        return current_articles
PK�X�mu��autobild.png�PNG


IHDR��h6�IDATxڅ��Ka�o�� �-'��D��G'��P�@QAJ1�T4QD,��\WU�;�.�{��x�/_��u�ߗNN�HGG�d�c�V�doO���~L�y�>�F��@�T�����X�������7���^/�b��&~��V�M>C!��a/=\���v�^#��c���Ih4L�c
هE���f+��á�Y2�e]�S�J�e$<�f�V��D.'�d�h3��"*pN�d2�\�E� �p��N���ȝ�y�n��D"���#B�h�w7�67�����c��햔
8��>�l���Y(��x�\N|~�$�����w��~ֻ���r��4�Y*�
��8��t~&5�d4������S�Bqfd6DQA���ױ��Y���4T������KFp�m�IEND�B`�PK�Xc��&::autobild.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
auto-bild.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AutoBild(BasicNewsRecipe):
    title = u'Auto Bild'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'Auto'
    publisher = 'Auto Bild'
    oldest_article = 50
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Auto'
    encoding = 'utf-8'
    cover_url = 'http://www.auto-bild.ro/images/autobild.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'box_2 articol clearfix'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['detail']}), dict(name='a', attrs={'id': ['zoom_link']}), dict(
            name='div', attrs={'class': ['icons clearfix']}), dict(name='div', attrs={'class': ['pub_articol clearfix']})

    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['pub_articol clearfix']})
    ]

    feeds = [
        (u'Feeds', u'http://www.auto-bild.ro/rss/toate')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�-�p�
�
automatiseringgids.png�PNG


IHDR00�`n�
�IDATx^}Wk�]�u^k�}������[%���%�IhT�����W�_���
�ԴUM�Uh��T
폂U�›p�J�ʅ҄�8��Ǯ{<㙹��}���Z�s�>��k�{f���k����E	a���8�
 ���� 
����:EPBW�#��"0�@-�啶�B�2��	���3�4���r������H���U��؅�U�V��GT�耤(��#+;P����!�jiiZ��RD]��]��7�4`����z`ĠLL�����D>��#�e��Z�:��`�r
Y%(����Xz@O@�V`�'=>(>9��u�����s��	/i���D��P�S�^��B�!g݈؎:nM8�)E2�����T���Ȱ��u�A���e �J�=P����[WM��f����;�4���E@�i۪�
J#�N��.�`R�ΩRo�y��Ǐ��3�+gܬ�E�h�G��_���@I���Վ́HTeU)/,"�R��l}��LG��c����G��_��77��㍿[,
�j���5Y�J0'cQ{�D�/H�j�ˬy��:�(��|���?x}�O���<{v�R4fө��l-cE�"��t�h�K�ڽ�xq���0R�,���6~���t�����*Nj;�HN	���X��(���e���*?����7z�SB�nw%1ls�򾐦��id;����q%e�cu�V�zѮ�ёn���X~�_��M%},j���\�ʶ����o�z.ZL��B��?�+(X?��Ñ�4�:su9��(.y#��>rrU�ي��󞧖niC���+�n.���	܏.W@$��l_K>��9�"�t�fh dX-�
@h��寡9b8t�x�S�&<�ߢ;�N�n��'�f���W�W�{�ۋ:bTu�J���TVe�&�k''�1!�R�* ��Hr^���S�l#�&������_�~�I4�*��#������#���Z��Nxi�4B��I�
��a8���2�����X'��HXA��ɴ/�o"*��^��U'{� Ujٕ���JRqdzL �ꠂ}'"'���m���C@�E�Ɯ�H�y���k���-$*�&3OQ�����5a�'@UPbg
Na,�u|��@��D�(���ٳ�ë��B�q�͖&kb#D��֫�D�ҍ*D�v.
�"�:uMՑ��VjL8�vx�x�3Ħ�rQ�z%@�	����$*�[Ns�j��Mcq��cIJo"������*���9EX��+���G�2���;�Ҷ���コ�Щ��b*x`��}���+�b���%��6��,�{����6?W<�<���Ͻt!D����lE�l����k+�1-K�ѠqL��p�XnM|����m�=�
ѿ>޽���[-��˟}q�m���ES�pv�W>�iH�教9+�vي���XUk�t��I���%��ξ*;+ĭ/,}���h(T�\G1#��A��w�O+�#����#>[����b�_M�u!m�V���G�CJ����C���&%:�����8�ie|��
b%վ�mO�RU�����#�ʿ��A��X���r.k���de$���
�c�u��W^]g��$=��tSۏ�Z5�����K{�x��{���X9��󕵛�[��������g�?�v_�c��:Ǻ���[����<��Y>��I]��e*Q���R��h��'�����}����>FcnBT�N����?��;��Ga5H;`��B�9���1+��|��8::�4F����%*�X�!8�@�ԃ���_=ܽ�hw�����W�jJb O���޳V<�pE9 fB
�H��ī�����10�J�Hތ *���
���/�/_(tޓ�y0��X�
4�۟��2��P7����-;��c� K�7��~lBm��6B�����/���ba�B���bl�����,�$����Y�"((����?=��J@�wg�O�h�<�5m`""�F"@��~`j�e,�Y��(F�=�w���4�Vӣ�#pB��MU-oBժ�@D�@U@���HU��.0��&���jT�ZJ3���]�ԫ8 0n�j ^5�j!�(��l,ef��ڀ0x��������J��b,
��6�DP�
��e@S.k*9k'��ЩB��o�9ٗՠ熼<�.亞�6K7/��C�x����XJ?�,2���T�鷎u�a��]�W��iM�0
̼����wO���=O.�}�p��vk�Hv�&��4����"���F��/t^<��jH�T�xfM�jd-�s�J��_�\��w?��С�N
%�h�i6+�+�5D���?���a���7���7z�<�*[٘Ҙ�d��}H�1
��=x���=�:���A��A����ݸy"�����c���Q�FS������޳��lz�����D�Ǫ�lį[uMt�DLR��Qq�E���A�xYv�Lcgty'6����=�G���",@�f�F'(�#�v��w~�u��֞�#I�>B=�%�b��T �v
��X���.^��q�t&gX�<9VQ�m49B�G�@P<"�FGA���s��.o���U�n��if�3��r���N�3hyg���|k�Q�	�h�𪇏ʥs����҂�X��FEo<C��t�bru�1(qTFEB(����f��7�|s��W����t[�%0��T�+z�w����J�0q�Q�FZP53o��2�/U2�R#���0�@����ᾟ����yauN����)��y�И�Hs��	-)Zi�
)9��B�!�]���<��+9DnQU����=*#�,�Z�@��*�8�^���1\�T�}1Q��AYQ�F��O�s�_�	|d5?҉�Źo��/pD���r�-�M�׶�|݌�S[h�/�#x�0݄��@�����%q�B�A>�g�_>�:T1̙�s�\�E����&:$c��KcHt�_�"�S���U���#r"BFdr�臛���Hjm�#h:��:X�MU{O��^1�WߵG��⚟X�:p@*����D����
$~n�'!"G�j�����i5�3#2�P�����Cx�D{q����|�h�D#E'����S@E��07At㎖U^l�0�&Z-ٯ)���`Y���Qq��o��}�o?���Chz���)J�T�}�#��"G�3�8x��w� ���Hh0b?v��p��0A#:�S��/=�0����k�w�����Ϟ��E=�y
��^�S�"îIO�w�N'�k��Ԏ�B5AA%�}Vm�y!�ӝ�o���[l9z��n�l���h�ʙ�?y�''z��U�#��I� ��"�M��g[��l}lw�ꝓ�&/�v;'�L��[�2���2g�qai�?Ϭ>3lw^=�;o�t�)��R0=@��*IEND�B`�PK�X�]�L��automatiseringgids.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class autogids(BasicNewsRecipe):
    title = u'Automatiseringgids IT'
    oldest_article = 7
    __author__ = 'DrMerry'
    description = 'IT-nieuws van Automatiseringgids'
    language = 'nl'
    publisher = 'AutomatiseringGids'
    category = 'Nieuws, IT, Nederlandstalig'
    simultaneous_downloads = 5
    timefmt = ' [%a, %d %B, %Y]'
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    publication_type = 'newspaper'
    encoding = 'utf-8'
    cover_url = 'http://www.automatiseringgids.nl/binaries/content/gallery/ag/marketing/ag-avatar-100x50.jpg'
    keep_only_tags = [dict(name='div', attrs={'class': ['content']})]

    preprocess_regexps = [
        (re.compile(r'(<h3>Reacties</h3>|<h2>Zie ook:</h2>|<div style=".*</div>|<a[^>]*>|</a>)', re.DOTALL | re.IGNORECASE),
         lambda match: ''),
    ]

    feeds = [(u'Actueel', u'http://www.automatiseringgids.nl/rss.aspx')]
PK�XW0�hh
autosport.png�PNG


IHDR(-S�PLTE�����������EGD
	,.-QSR��������-26BGK����������)+*Z^]��������񢦩!inr������������]a`������v||BGJ$'#'���������������	
" �������AIK�����������$#('=FE��������
ELR��������ڼ����.8:COO�������ɢ�����bkp[di\ejOX]}�������������ߢ��mx|?MN%04��������㳾�&/6,5<�������$'1?B������t�	z�����:IN
|����ͦ��?HO	DKQ���|��o~�APU^mrP]c5BH+6<%+ox���������������������������N\_��������������۴����䞬�!4<?����������������������kvz���������������������������fqu������������]cceijSUT���������������	6AC���������,22vvv���&13
NY[���������ekk)//&('�����������������nIDAT�cd`��cD,��ʀ����|\@�����,�PG@�gpXȐ���)צg2�j�i����,a\�P��@��x.��ˠ�x��$�/�I'��IEND�B`�PK�X�b�}BBautosport.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'MrStefan <mrstefaan@gmail.com>'

'''
www.autosport.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class autosport(BasicNewsRecipe):
    title = u'Autosport'
    __author__ = 'MrStefan <mrstefaan@gmail.com>'
    language = 'en_GB'
    description = u'Daily Formula 1 and motorsport news from the leading weekly motor racing magazine. The authority on Formula 1, F1, MotoGP, GP2, Champ Car, Le Mans...'  # noqa
    masthead_url = 'http://cdn.images.autosport.com/asdotcom.gif'
    remove_empty_feeds = True
    oldest_article = 1
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True

    keep_only_tags = []
    keep_only_tags.append(dict(name='h1', attrs={'class': 'news_headline'}))
    keep_only_tags.append(
        dict(name='td', attrs={'class': 'news_article_author'}))
    keep_only_tags.append(
        dict(name='td', attrs={'class': 'news_article_date'}))
    keep_only_tags.append(dict(name='p'))

    feeds = [(u'ALL NEWS', u'http://www.autosport.com/rss/allnews.xml')]
PK�X�����avantaje.png�PNG


IHDR#R#��PLTE����x�t�z�v�q������B��-��������
��|������w�������m�0�����9��2�������)����������
~�z�=�����b��\��X��R�����$���������z����y�������x����������H��w��t��q�������������������6�������l��j��������������{�����������������y
gIDATx^��Ů1Ю*��q�S��9��!q�D��"����G�����4nke����w�V��{�� Hq�r�>!v�ij:|pr��Yh�����
�md���V�e��#i9#XQ�'K;���{��&Ҟ�@�T�'~KZ�J�*�y\����M1� ��.(�N�Zi��[��Xt���Y&�6��8n��}��o���ۇS>��
OY�Zk�A�z{�!h�-������v[o����Ty�L9e�n%-��-!f�BK�3F���3��= ���&����ܕvY"��Wo]~��8��(�ӥn�x1Ey�o�NLđ��C��7�5t�y��>G����������-"��IEND�B`�PK�X���O��avantaje.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
avantaje.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Avantaje(BasicNewsRecipe):
    title = u'Avantaje'
    __author__ = u'Silviu Cotoar\u0103'
    description = u''
    publisher = u'Avantaje'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Stiri'
    encoding = 'utf-8'
    cover_url = 'http://www.avantaje.ro/images/default/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'articol'}), dict(name='div', attrs={
            'class': 'gallery clearfix'}), dict(name='div', attrs={'align': 'justify'})
    ]

    remove_tags = [
        dict(name='div', attrs={'id': ['color_sanatate_box']}), dict(name='div', attrs={'class': ['nav']}), dict(name='div', attrs={'class': ['voteaza_art']}), dict(name='div', attrs={'class': ['bookmark']}), dict(name='div', attrs={'class': ['links clearfix']}), dict(name='div', attrs={'class': ['title']})  # noqa
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['title']})
    ]

    feeds = [
        (u'Feeds', u'http://feeds.feedburner.com/Avantaje')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�[�44aventurilapescuit.png�PNG


IHDR��h6�IDATx�c�������gϞ���5�]����VTT���Ϝ;�Oüy������L�bc��ӽ��;�]áC�|��K�*�⊲��U��J���ʉIJ|��5�������DF�g�|j�N��G����ܼ�E��k�2">�46����Ƿ��b2�ǥWgf���������EÒ%Kr�K/y�?�W~i�:8qSYuBNvhdd*@
�����������S��&ε�iY���99iii���!!!W�\A�PVQ���{�-���Q{N^DfzjZZfff��;wE��iSs��Ng���ەU�T�T
4>!!!444>>�ɓ'(�^�jaaa��z�����Κ�ƒR�q	�r��111�~�B����?ss1E�ٙ�?�}�y��WV�gg�y�20TVWc��+V;[ZuE�?�L[TQ���(%��#,~�����oni� (`dҗ��lna��q�J�i��ׯs-�
�fd	U�.�uز|F���=:�k���{^�{�)�Q&�Z�IEND�B`�PK�X9�)+��aventurilapescuit.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
aventurilapescuit.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AventuriLaPescuit(BasicNewsRecipe):
    title = u'Aventuri La Pescuit'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'Aventuri La Pescuit'
    publisher = 'Aventuri La Pescuit'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Pescuit,Hobby'
    encoding = 'utf-8'
    cover_url = 'http://www.aventurilapescuit.ro/images/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'Article'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['right option']}), dict(
            name='iframe', attrs={'scrolling': ['no']})
    ]

    remove_tags_after = [
        dict(name='iframe', attrs={'scrolling': ['no']})
    ]

    feeds = [
        (u'Feeds', u'http://www.aventurilapescuit.ro/sections/rssread/1')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�j���
avisen_dk.png�PNG


IHDR��h6jIDAT8O5RKhSQ���U���F-ZAZ�W.*
�+	I�A�>�M��bԢ�7�)�h�"�bD�U����q!����u��}�ܙ9g��9 ��B#-���JQXmm~-�b�&V�HFx>V/��Z0��#}}��u�*x�s�
f��R��y��|��e����B��<��@s.O8<��I`)�} ��rhd�Y`	���e����l	�wN�s��>ˢG��#���b�Y/n�S���mԳm&��wS�g�A����|�R5�R���- �6ƈ� ��(D�VX�6m�]y��ʴ��f�=m�M��@��%Nm5�>�i�N̏��UI}|+.u�vGT���#ɉ�f�7:'��b$[�j�[�ϓ����TʪVe���M���@��J��b|���5���zU�B;��K�C+�'%Y�1�� r
t�4�Gř��nPc��h��˝b8E��F=q]����y��̻�q�a{=@d�����!q�5�Cb���v�c�k��-�%�+�?w���Q9(��"5�`+�`�"�2Y��|hQjxE�YEe#9"w�+�I\4X$[�Ȭ�`E���F��
������z;jIEND�B`�PK�X���avisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Avisen.dk
'''


class WwwAvisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Avisen.dk'
    description = ('Nyheder, artikler, seneste nyt, nyhedsarkiv, kommentarer og blogs. Avisen.dk dækker bredt,'
                   ' men har fokus på arbejdslivet. Avisen.dk - går arbejdet bedre')
    category = 'newspaper, news, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
                ('Nyheder fra Avisen.dk', 'http://www.avisen.dk/rss.aspx'),
    ]

PK�XTA���avto-magazin.png�PNG


IHDR��h6sIDATx�}h�a���~1w;sw���%�Z�P�$RJ���
�RH�?���X�E�D

�C��973��}��>��Hv̩gF��F'�l���F�_CJ]�9�+�hB��c�Q�iI��1p�MC�`xX�4��IǬX\�� �E��0w��$��u���jN)Lt���گ�Y!����lE�bp����S�S�0v����B��™�*lW�P�o�-��a��e�?wm���|�+�"m;̏łT�/�n\�vV�����=��DFc�����|!�U��#�?~��k�b�:��C��5'�熹|�+0ҝ}�h�襮R���΃���@���S�����l%[���Ût�K���е}�������twg�yeS|�0�F�̉��?�蛝2��gdW�x�V��y�m�~��H�ԃj�����._|Y��C���;{��p�t.���%Z���%�@�th�|���{��
���i�u0�Lm�D�$t.��m�†�3������Do/#�n�?�zX	�"|��nO�?�	XWR1�J�A(oI�
/Jĥ_9
4������`ǜ`lT��@B�¸�nt�`��9C"աO����W DIEND�B`�PK�X��l���avto-magazin.recipe__license__ = 'GPL v3'
__copyright__ = '2010, BlonG'
'''
avto-magazin.si
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Dnevnik(BasicNewsRecipe):
    title = u'Avto Magazin'
    __author__ = u'BlonG'
    description = u'Za avtomobilisti\xc4\x8dne frike, poznavalce in nedeljske \xc5\xa1oferje.'
    oldest_article = 7
    max_articles_per_feed = 20
    labguage = 'sl'
    no_stylesheets = True
    use_embedded_content = False
    language = 'sl'

    conversion_options = {'linearize_tables': True}

    cover_url = 'https://sites.google.com/site/javno2010/home/avto_magazin_cover.jpg'

    extra_css = '''
    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
    h2{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''

    keep_only_tags = [
        dict(name='div', attrs={'id': '_iprom_inStream'}),
        #   dict(name='div', attrs={'class':'entry-content'}),
    ]

    remove_tags = [
        dict(name='div', attrs={'id': 'voteConfirmation'}),
        dict(name='div', attrs={'id': 'InsideVote'}),
        dict(name='div', attrs={'class': 'Zone234'}),
        dict(name='div', attrs={'class': 'Comments'}),
        dict(name='div', attrs={'class': 'sorodneNovice'}),
        dict(name='div', attrs={'id': 'footer'}),
    ]

    feeds = [
        (u'Novice', u'http://www.avto-magazin.si/rss/')
    ]
PK�X��
Ǯ�
azstarnet.png�PNG


IHDR(-SPLTE�������������)�tRNS@��fJIDATx�m��
 E�WVH^�\���b���B����V��i�A�'&?�刁�ǻ*�^/��ATc�z��IEND�B`�PK�X��^�a	a	azstarnet.recipe
__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
azstarnet.com
'''
try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode
from calibre.web.feeds.news import BasicNewsRecipe


class Azstarnet(BasicNewsRecipe):
    title = 'Arizona Daily Star'
    __author__ = 'Darko Miletic'
    description = 'news from Arizona'
    language = 'en'
    publisher = 'azstarnet.com'
    category = 'news, politics, Arizona, USA'
    oldest_article = 3
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    masthead_url = 'http://azstarnet.com/content/tncms/live/global/resources/images/logo.gif'
    needs_subscription = True

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('http://azstarnet.com/')
        if self.username is not None and self.password is not None:
            data = urlencode({'m': 'login', 'u': self.username, 'p': self.password, 'z': 'http://azstarnet.com/'
                                     })
            br.open('http://azstarnet.com/app/registration/proxy.php', data)
        return br

    remove_tags = [dict(name=['object', 'link', 'iframe', 'base', 'img'])]

    feeds = [

    (u'Local News', u'http://azstarnet.com/search/?f=rss&t=article&c=news/local&l=25&s=start_time&sd=desc'),
    (u'National News', u'http://azstarnet.com/search/?f=rss&t=article&c=news/national&l=25&s=start_time&sd=desc'),
    (u'World News', u'http://azstarnet.com/search/?f=rss&t=article&c=news/world&l=25&s=start_time&sd=desc'),
    (u'Sports', u'http://azstarnet.com/search/?f=rss&t=article&c=sports&l=25&s=start_time&sd=desc'),
    (u'Opinion', u'http://azstarnet.com/search/?f=rss&t=article&c=news/opinion&l=25&s=start_time&sd=desc'),
    (u'Movies', u'http://azstarnet.com/search/?f=rss&t=article&c=entertainment/movies&l=25&s=start_time&sd=desc'),
    (u'Food', u'http://azstarnet.com/search/?f=rss&t=article&c=lifestyles/food-and-cooking&l=25&s=start_time&sd=desc')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def print_version(self, url):
        return url + '?print=1'
PK�XX�\��b365realitatea.png�PNG


IHDR���R$PLTE����""�DD�UU�ww����������'�+�tRNS@��fJIDATx�c`` `1�4�gUttt�
��`!��(�̘ѱ:ʘ=*���x� D{G� ��pK��j�����IEND�B`�PK�Xf#��eeb365realitatea.recipe# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
b365.realitatea.net
'''

from calibre.web.feeds.news import BasicNewsRecipe


class b365Realitatea(BasicNewsRecipe):
    title = u'b365 Realitatea'
    __author__ = u'Silviu Cotoar\u0103'
    publisher = u'b365 Realitatea'
    description = u'b365 Realitatea'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Romania,Bucuresti'
    encoding = 'utf-8'
    cover_url = 'http://b365.realitatea.net/wp-content/themes/b/images/b365-logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'newsArticle'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'date'}), dict(name='dic', attrs={'class': 'addthis_toolbox addthis_default_style'}), dict(
            name='div', attrs={'class': 'related_posts'}), dict(name='div', attrs={'id': 'RelevantiWidget'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': 'RelevantiWidget'})
    ]
    feeds = [
        (u'\u0218tiri', u'http://b365.realitatea.net/rss-full/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�"��b92.png�PNG


IHDR00�`n��IDATx��XYlQ�y30��V+�J�Z�X�֢�u_j��&n��C5~�c���F��cL�5Z�k��UP#u�U�Zk�,30ޙ�)Z���d^[�fz���=��0�A�˦A��]��!��2e�B�����B��eD7�=$²�dX��\9�T��J�M�9�>������8��AM�1l��j
���ꚪN=y�i�q8�T*ł%���)�����/�/��(��e�i����rM��5_��P�E
±̾rmENOUJ�8�m��m�y?5���BS��K�Z���*5C�_9_s����P(	8��$	���!r@�α�<L�4�8�1&B?��mͰ��<͔�#���!2#�ra��R�T�"�G��H�6Ĩ�S��
��G�4�����8V��
�0���)�w�������%e���*`�V+���1
5�����M�#4�%m0mk	>{��	�6��M��NW����B ���$��s��ܗ�?�+���bl�Gώ��`	�@+�ŔJ1kaIJa+�v]�t�&faqp���Ϻͳ��2���ҡ�|�Ug�V��ԛ ���f0����7FN���d*W�t�}z�C���@]���Z92�3T%�Jr��9cʭ�@�s=�(��Dg�SJh^]�m!-��^;�b��"uzm�)����O�-��`U�"srT��̣ƙ3���~t��.�F�3��p(zhOu[K �
�Az�E7Ц���H�=q��O#�D���9�)��Q0�`��&���G�߲L,ϲqo}��u�ˆ�`ac�˒-,䕎���0h��k�W�A���J�;ؗO��C�H<�Ժ��+ҡ��AH����)Z���fk��X�REւ~����g�1��~y,�j]3�n� F8m�Ѱ<�ĭ�}�(�$���~�黷
K���M��K[��u��s��b@aX
���%���LR"A���>���*�j�p#�����νؽ�
�"Q�p0r����F��Z����!?
5���e�au�F���W�n^|�ߧ� �_Гw�D�s؃����`$��s̯��ͪ��G��7�H�|^�
���ľr��������_�[J�2�B�����>������t#���`	��VgN.z�ˀ��w�!��|�e�߽����ɦ�;F�d]A�.��6F��$P��8�7�/��>�5IEND�B`�PK�X��W�^
^

b92.recipe
__license__ = 'GPL v3'
__copyright__ = '2008-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
b92.net
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe


class B92(BasicNewsRecipe):
    title = 'B92'
    __author__ = 'Darko Miletic'
    description = 'Najnovije vesti iz Srbije, regiona i sveta, aktuelne teme iz sveta politike, ekonomije, drustva, foto galerija, kolumne'
    publisher = 'B92'
    category = 'news, politics, Serbia'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'cp1250'
    language = 'sr'
    publication_type = 'newsportal'
    masthead_url = 'http://b92s.net/v4/img/new-logo.png'
    extra_css             = """
                                @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                                body{font-family: Arial,Helvetica,sans1,sans-serif}
                                .article-info2,.article-info1{text-transform: uppercase; font-size: small}
                                img{display: block}
                                .sms{font-weight: bold}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    preprocess_regexps = [
        (re.compile(u'\u0110'), lambda match: u'\u00D0'),
        (re.compile(r'<html.*?<body>', re.DOTALL | re.IGNORECASE),
         lambda match: '<html><head><title>something</title></head><body>')
    ]

    keep_only_tags = [dict(attrs={'class': ['article-info1', 'article-text']})]
    remove_attributes = ['width', 'height', 'align',
                         'hspace', 'vspace', 'border', 'lang', 'xmlns:fb']
    remove_tags = [
        dict(name=['embed', 'link', 'base', 'meta', 'iframe']), dict(
            attrs={'id': 'social'})
    ]

    feeds = [

    (u'Vesti', u'http://www.b92.net/info/rss/vesti.xml'),
    (u'Biz', u'http://www.b92.net/info/rss/biz.xml'),
    (u'Sport', u'http://www.b92.net/info/rss/sport.xml'),
    (u'Zivot', u'http://www.b92.net/info/rss/zivot.xml'),
    (u'Kultura', u'http://www.b92.net/info/rss/kultura.xml'),
    (u'Automobili', u'http://www.b92.net/info/rss/automobili.xml'),
    (u'Tehnopolis', u'http://www.b92.net/info/rss/tehnopolis.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for alink in soup.findAll('a'):
            if alink.string is not None:
                tstr = alink.string
                alink.replaceWith(tstr)
        return soup
PK�XQIJJ
ba_herald.png�PNG


IHDR��h6IDATx����N�@�&"ҙ�,tat���LKxw>MC��Ш胺)׹x�Q����'���?�2��.t�'�eK�ü��V����		r�3��y���y�MYj�Uh�����'�4+S��n$�l��y��J�.M`W;	��mT�gPgp�$~��� ����1�+���`�Z�����I��G��/��'@�*p��Al�^��>z?�yR��ޖ4u�@��,���(jt�:CBGM&Z|e�%��ʋ�߳�.q	����IEND�B`�PK�X���//ba_herald.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.buenosairesherald.com
'''

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class BuenosAiresHerald(BasicNewsRecipe):
    title = 'Buenos Aires Herald'
    __author__ = 'Darko Miletic'
    description = 'A world of information in a few words'
    publisher = 'Editorial Nefir S.A.'
    category = 'news, politics, Argentina'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en_AR'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://www.buenosairesherald.com/img/logo.jpg'
    INDEX = 'http://www.buenosairesherald.com'
    extra_css             = """
                               body{font-family: Arial,Helvetica,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                               h1{font-family: Georgia,serif}
                               #fecha{text-align: right; font-size: small}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [dict(name=['meta', 'link', 'iframe'])]
    keep_only_tags = [dict(attrs={'class': 'nota_texto p'})]

    feeds = [

    (u'Argentina', u'http://www.buenosairesherald.com/argentina'),
    (u'World', u'http://www.buenosairesherald.com/world'),
    (u'Latin America', u'http://www.buenosairesherald.com/latin-america'),
    (u'Sports', u'http://www.buenosairesherald.com/sports')
    ]

    def print_version(self, url):
        artidraw = url.rpartition('/article/')[2]
        artid = artidraw.partition('/')[0]
        return 'http://www.buenosairesherald.com/articles/print.aspx?ix=' + artid

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(0, ('Fetching feed') + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            soup = self.index_to_soup(feedurl)
            for item in soup.findAll('div', attrs={'class': 'nota_texto_seccion'}):
                description = self.tag_to_string(item.h2)
                atag = item.h2.find('a', href=True)
                if atag is not None:
                    url = self.INDEX + atag['href']
                    title = description
                    date = strftime(self.timefmt)
                    articles.append({
                        'title': title, 'date': date, 'url': url, 'description': description
                    })
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X:�f���babyonline.png�PNG


IHDR���R0PLTE�������������ڴ�Ҝ�ʄ���l��T�j|�^t�RlWz�|mIDATx�c@�� �'f-a``� ���{����IIcC�s�LC��(�� �
d��̠}��PY/xB��� �V<�A�m�v�)��R,�/3�`�k;/Ei��IEND�B`�PK�X��l��babyonline.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
babyonline.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class BabyOnline(BasicNewsRecipe):
    title = u'Baby Online'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'De la p\u0103rinte la p\u0103rinte'
    publisher = u'Baby Online'
    oldest_article = 50
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Copii,Mame'
    encoding = 'utf-8'
    cover_url = 'http://www.babyonline.ro/images/default/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'article_container'})
    ]

    remove_tags = [
        dict(name='div', attrs={'id': 'bar_nav'}),
        dict(name='div', attrs={'id': 'service_send'}),
        dict(name='div', attrs={'id': 'other_videos'}),
        dict(name='div', attrs={'class': 'dot_line_yellow'}),
        dict(name='a', attrs={'class': 'print'}),
        dict(name='a', attrs={'class': 'email'}),
        dict(name='a', attrs={'class': 'YM'}),
        dict(name='a', attrs={'class': 'comment'}),
        dict(name='div', attrs={'class': 'tombstone_cross'}),
        dict(name='span', attrs={'class': 'liketext'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': 'service_send'})
    ]

    feeds = [
        (u'Feeds', u'http://www.babyonline.ro/rss_homepage.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XC��ppbadania_net.png�PNG


IHDR�a7IDATx�cb���g�qC��0V���/~�1��-�?lKe|#��X0N���������
�'�����	��1,�����m�n�dQA!�\,� ���3�a�.0�w0r1x9X������7¢��	��f֚
: >��~(�(������Ș	�� ۍ��~���gge��o>�|�1F���˫ *`�� ���Ͽ� 1fFV
�������bFu�i����k�mk�o�8�x�z+�m��A'�,_��LA�0�@%��OAL��TU^�ү�|?~2�z����7�o^�ߛ��5T����|p@��,����_o���)�����Yy
��b�y���0(,R\��@�Q��?t�5��n�zL8�����~����)�*𓏁���g��Օ�A��b��_����~�ʘ_�5]$�m���;'>�w
:�o�8��dZ���?����sw��b�>� ��H�]�ףf�Ɯ��w�-\{�j�����]�X��BÒ���/��2uSڤ�{A�aa���`9m�IEND�B`�PK�Xa2D��badania_net.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class BadaniaNet(BasicNewsRecipe):
    title = u'badania.net'
    __author__ = 'fenuks'
    description = u'chcesz wiedzieć więcej?'
    category = 'science'
    language = 'pl'
    cover_url = 'http://badania.net/wp-content/badanianet_green_transparent.png'
    extra_css = '.alignleft {float:left; margin-right:5px;} .alignright {float:right; margin-left:5px;}'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    preprocess_regexps = [
        (re.compile(r"<h4>Tekst sponsoruje</h4>", re.IGNORECASE), lambda m: ''), ]
    remove_empty_feeds = True
    use_embedded_content = False
    remove_tags = []
    keep_only_tags = [dict(name='article')]
    feeds = [
    (u'Psychologia', u'http://badania.net/category/psychologia/feed/'),
    (u'Technologie', u'http://badania.net/category/technologie/feed/'),
    (u'Biologia', u'http://badania.net/category/biologia/feed/'),

    (u'Chemia', u'http://badania.net/category/chemia/feed/'),
    (u'Zdrowie', u'http://badania.net/category/zdrowie/'),
    (u'Seks', u'http://badania.net/category/psychologia-ewolucyjna-tematyka-seks/feed/')]
PK�X�R�baikaljournal.png�PNG


IHDR  ��YIDATxڭVc�4Y��m۶m۶m۶m�6�m��6f�N���NN�<得�$�Gb>�ñp��#�=y�*�~��k���Jw�9@�Ց�P(��;r�0*�m�mρ6]�@y��X�|�= U:�RQ4�_�b-0 =7�(2�L�?'���,C�µs� ���"K~��s�A;��ηnp�i���V͚3�p���[�:ks���`b���$�H
,V�ߟ9@�&�������f�P�x�x���Ѵ7N��R
_�p����"e9%�:.���Mnw�<��&Z�r0R��A3J����/V��ؾg4W��#Wm `�x~g��(�|(A�+_�+�����R��DA���4��yO,v�4�d��.U�"�`��
L|0��k6��8c�kv�=#�"	���BT���{x�+3&�$3+O���S"���.���<�s�9KT0��&��Vw]�t��~�[�:t�&_&O�o�tL.~]��/��C���A�0�*�<$�����Y�b�x�{�Kd�ָ�����狸�V#'�(Z.�i�n~k0��-��3�*��s�ѯ�]1q�Tx|���y�U�0��X�����V�t�9it�6��>s>�GHO�$�f\?��ɔ�*�;�P�m__�
i$��H�*U���)�C,��R��x���?��<e��=>~�fk�R���ɐ1d�A*�A��&�=պ�6��ؠ��Ǔ9����2,'����Lg��JN�"��<��x�X�"E�6�|
�WY������[,�_�k�J����|�Epπ�xDDž�`"S)ߪS�i�B�Mj��ʣԠx5>�o\j?~ڢGG�^_�~3�Ҧ�3/u.0��	.J��TW�3���o?���Y�^#�.*�]����$���\	��DV��Pb��~��ڿ���x�&L�r��@�������@�EZ��јI�ĺS�ٰn��K}Y�~��µ�
z�M��K�D����P�	����r�r~�O�ŀ6A�
Ct$�@�ϗ���!�����=� �~�o�E'yg0|���5(�]??(�'?~��2�ۧpWjF����֏5:�Ϗ���1�^�/N@�>d̚M��M$)�8��/X���0�pbp\(�t8
�:�Bgh1o)��kԯ�w�+��,P�m�E���ۃ��9���{_��ӸP�Tz�;�5;����f�h���v3�D%�H�����X*���"hY��i�_�U���ꍌj��⃋����C�6�*���3T�нx������o�}���I?�\�M���?�ٓ��=h0IEND�B`�PK�X<԰��baikaljournal.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class BaikalJournal(BasicNewsRecipe):
    title = '\u041B\u044E\u0434\u0438 \u0411\u0430\u0439\u043A\u0430\u043B\u0430'
    __author__ = 'bugmen00t'
    description = '\u041D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0439 \u0430\u0432\u0442\u043E\u0440\u0441\u043A\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0436\u0443\u0440\u043D\u0430\u043B \u043E \u0436\u0438\u0437\u043D\u0438 \u0432 \u0421\u0438\u0431\u0438\u0440\u0438 \u0438 \u0432\u043E\u043A\u0440\u0443\u0433 \u0411\u0430\u0439\u043A\u0430\u043B\u0430, \u043E\u043F\u0438\u0441\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0436\u0438\u0437\u043D\u044C \u0432 \u0441\u0438\u0431\u0438\u0440\u0441\u043A\u043E\u0439 \u0433\u043B\u0443\u0431\u0438\u043D\u043A\u0435.'  # noqa
    publisher = '\u041E\u043B\u044C\u0433\u0430 \u041C\u0443\u0442\u043E\u0432\u0438\u043D\u0430, \u0415\u043B\u0435\u043D\u0430 \u0422\u0440\u0438\u0444\u043E\u043D\u043E\u0432\u0430'  # noqa
    category = 'blog'
    cover_url = u'https://baikal-journal.ru/wp-content/themes/baikal/assets/img/logo-full.svg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 30
    max_articles_per_feed = 10

    remove_tags = [
        dict(name='div', attrs={'class': 'distance-badge'}),
        dict(name='div', attrs={'class': 'lead-footer__sharing'}),
        dict(name='div', attrs={'class': 'm-block-ctaline'}),
        dict(name='div', attrs={'class': 'm-block-readmore format-inline'}),
        dict(name='footer'),
        dict(name='div', attrs={'class': 'related-block'}),
        dict(name='div', attrs={'class': 'selection-block'}),
        dict(name='div', attrs={'class': 'last-cta'})
    ]

    feeds = [(
        '\u041B\u044E\u0434\u0438 \u0411\u0430\u0439\u043A\u0430\u043B\u0430',
        'https://baikal-journal.ru/feed/'
    )]
PK�X1~�22balkaninsight.png�PNG


IHDR��h6�IDATx�c�O"�����u&)�QP�ڣ��.�8��f��܊�+�OCCZ�3�|�v����B�
�p�C�������i�������0
�~���p��;��Ԯm���[d+GL{��3Pv��
@
��m�Q4��U���hP��a�4�N�����
'�r�$����M���
�TT9s?�۷�$\�ޣ�2{�#�^9��r�çw�z�5���e�0�g����!���蔖H��_0�;�IEND�B`�PK�X��9J
J
balkaninsight.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
balkaninsight.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class BalkanInsight(BasicNewsRecipe):
    title = 'Balkan Insight'
    __author__ = 'Darko Miletic'
    description = 'Get exclusive news and in depth information on business, politics, events and lifestyle in the Balkans. Free and exclusive premium content.'
    publisher = 'BalkanInsight.com'
    category = 'news, politics, Balcans'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = False
    use_embedded_content = False
    encoding = 'utf-8'
    masthead_url = 'http://www.balkaninsight.com/templates/balkaninsight/images/aindex_02.jpg'
    language = 'en'
    publication_type = 'newsportal'
    remove_empty_feeds = True
    extra_css             = """ @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                                @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                                .article_description,body{font-family: Arial,Verdana,Helvetica,sans1,sans-serif}
                                img{margin-bottom: 0.8em}
                                h1,h2,h3,h4{font-family: Times,Georgia,serif1,serif; color: #24569E}
                                .article-deck {color:#777777; font-size: small;}
                                .main_news_img{font-size: small} """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [dict(name='div', attrs={'id': 'article'})]
    remove_tags = [
        dict(name=['object', 'link', 'iframe'])
    ]

    feeds = [

    (u'Albania', u'http://www.balkaninsight.com/?tpl=653&tpid=144'),
    (u'Bosnia', u'http://www.balkaninsight.com/?tpl=653&tpid=145'),
    (u'Bulgaria', u'http://www.balkaninsight.com/?tpl=653&tpid=146'),
    (u'Croatia', u'http://www.balkaninsight.com/?tpl=653&tpid=147'),
    (u'Kosovo', u'http://www.balkaninsight.com/?tpl=653&tpid=148'),
    (u'Macedonia', u'http://www.balkaninsight.com/?tpl=653&tpid=149'),
    (u'Montenegro', u'http://www.balkaninsight.com/?tpl=653&tpid=150'),
    (u'Romania', u'http://www.balkaninsight.com/?tpl=653&tpid=151'),
    (u'Serbia', u'http://www.balkaninsight.com/?tpl=653&tpid=152')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�XD�_--
balkanist.png�PNG


IHDR  V%(�IDAT8�c�O0����?l��Ǭ�����~�����o~s���_�\�5���I��Κ���pb�_��m��O] �0��9�!�s�GbҵW�Ǽa� w����[ s����=�j2�7��_��?�6�c��g�C�����]ʿ]�Y8�����ʮq��3|�Z�w�0h¿��_.>O�\�&\ܣ��@�N�C�m�Y�R<��{>�dt%���l�7 _�rw�x��35������O:n=6�H������BC�R�
�_�zP�g��5�}�~@�p�����b�SBo�j��j4�Դ�i��w����=��/�8��ٜ����=�x~�x���u��
D�s���T8�:Mpc|�v� ��"���￀��Q�r�R�#ZgS�K��.Y!�֦��	�M>7��
1gR�ė%�s^1�o5��7�G,P��c���xw���O�n��r���{�?_xq�����n���� ��)��#E<,��D�<u��|��:�YUIEND�B`�PK�X6�g��balkanist.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2017, Darko Miletic <darko.miletic at gmail.com>'
'''
http://balkanist.net/magazine
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Pagina12(BasicNewsRecipe):
    title = 'Balkanist'
    __author__ = 'Darko Miletic'
    description = 'Balkanist is an experimental, bilingual platform featuring politics, analysis, culture, and criticism for a smart international audience underwhelmed by what is currently on offer. Our aim is to provide bold, uncompromising coverage of the Balkan region and everything to its East. We are currently entirely independent, self- and reader-funded, and are not affiliated with any organization, company, or government institution.'  # noqa
    publisher = 'Balkanist'
    category = 'news, politics, Balkans'
    oldest_article = 30
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'magazine'
    auto_cleanup = True
    masthead_url = 'http://media.balkanist.net/2013/07/Balkanist-Magazine-cover.png'
    ignore_duplicate_articles = {'url'}
    extra_css = """
                               body{font-family: Lora,serif}
                               img{margin-top:1em; margin-bottom: 1em; display:block}
                           """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link']),
    ]

    feeds = [
        (u'Magazine', u'http://balkanist.net/magazine/feed/'),
        (u'News', u'http://balkanist.net/news/feed/'),
        (u'Commentary', u'http://balkanist.net/commentary/feed/'),
        (u'Arts and Culture', u'http://balkanist.net/arts-and-culture/feed/'),
        (u'Politics', u'http://balkanist.net/politics/feed/'),
    ]
PK�X	;~��baltimore_sun.png�PNG


IHDR  D����PLTE�s�x
�}�������!��ЍЏӕԗԘԘԙ֛֜םןןء٢٥$ڦ'ڦ(ڧ(ڧ)ۧ+ۨ+ܪ1ݭ6ޯ>�F�H�M�V�W�\�b�i��k��m��r��s��~���·�Ѝ�ό�ґ�ՙ�ۥ�ۨ�ܪ�ޮ����������������,��.�����������N��_�������4���IDATx�l��b1����cP*U=��̸f��?M�����|�����6Zn�j?�x�VT�����l^�Y끦j>����Q#i�q/\g�m��Tn�a�L�[���G#�3�q�3���p��)H&���}Rl�c=�:���H��-<�IVJ�>���a�PM�ii|���� ��J{�`�l��s�h��^��̊zw���m
�:#%�/X�P�e
RBx	}�O�B�"���\���d�D?��@����["L�`T�dJ�[�E�OTWD���\__7��ѓ�F�Epx1i��0�o�]���ϯo�/��7�?��
������:
rK�YUd����Y�=�M@�ot�3�	�x�;<��95�*����u�ӇľqT���fIEND�B`�PK�Xx�zK��baltimore_sun.recipefrom __future__ import with_statement
__license__ = 'GPL 3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__copyright__ = '2012 Josh Hall<jwtheiv@gmail.com>'
__docformat__ = 'restructuredtext en'

from calibre.web.feeds.news import BasicNewsRecipe


class BaltimoreSun(BasicNewsRecipe):

    title = 'The Baltimore Sun'
    __author__ = 'Kovid Goyal'
    description = 'Complete local news and blogs from Baltimore'
    language = 'en'
    version = 2.5
    compress_news_images = True
    compress_news_images_auto_size = 8
    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = False

    ignore_duplicate_articles = {'title'}
    keep_only_tags = [
        dict(name=['div'], attrs={'class': ['trb_ar_hl', 'trb_ar_hl_t',
                                            'trb_ar_la', 'trb_ar_by',
                                            'trb_ar_dateline', 'trb_ar_page']}),
    ]
    remove_tags = [
        dict(name=['meta', 'link']),
    ]

    feeds = [
        # News ##
        (u'Top Headlines', u'http://feeds.feedburner.com/baltimoresun/news/rss2'),
        (u'Breaking News', u'http://feeds.feedburner.com/baltimoresun/news/local/annearundel/rss2'),
        (u'Top Maryland', u'http://feeds.feedburner.com/baltimoresun/news/local/rss2'),
        (u'Baltimore City', u'http://feeds.feedburner.com/baltimoresun/news/local/baltimore_city/rss20xml'),
        (u'Education', u'http://feeds.feedburner.com/baltimoresun/news/education/rss2'),
        (u'Local Politics', u'http://feeds.feedburner.com/baltimoresun/news/local/politics/rss2'),
        (u'Weather', u'http://feeds.feedburner.com/baltimoresun/news/weather/site/rss2'),
        (u'Nation/world', u'http://feeds.feedburner.com/baltimoresun/news/nationworld/rss2'),

        # Sports##
        (u'Top Sports', u'http://feeds.feedburner.com/baltimoresun/sports/rss2'),
        (u'Orioles/Baseball', u'http://www.baltimoresun.com/sports/orioles/rss2.0.xml'),
        (u'Ravens/Football', u'http://feeds.feedburner.com/baltimoresun/sports/football/rss2'),

        # Entertainment ##
        (u'Arts & Theater', u'http://feeds.feedburner.com/baltimoresun/entertainment/galleriesmuseums/rss2'),
        (u'Movies', u'http://www.baltimoresun.com/entertainment/movies/rss2.0.xml'),
        (u'Music & Nightlife', u'http://www.baltimoresun.com/entertainment/music/rss2.0.xml'),
        (u'Restaurants & Food', u'http://www.baltimoresun.com/entertainment/dining/rss2.0.xml'),
        (u'TV/Media', u'http://www.baltimoresun.com/entertainment/tv/rss2.0.xml'),

        # Life ##
        (u'Health&Wellness', u'http://www.baltimoresun.com/health/rss2.0.xml'),
        (u'Home & Garden', u'http://www.baltimoresun.com/features/home-garden/rss2.0.xml'),
        (u'Living Green', u'http://www.baltimoresun.com/features/green/rss2.0.xml'),
        (u'Fashion', u'http://www.baltimoresun.com/features/fashion/rss2.0.xml'),
        (u'Travel', u'http://www.baltimoresun.com/travel/rss2.0.xml'),

        # Business ##
        (u'Top Business', u'http://www.baltimoresun.com/business/rss2.0.xml'),
        (u'Technology', u'http://www.baltimoresun.com/business/technology/rss2.0.xml'),
        (u'Real Estate', u'http://www.baltimoresun.com/classified/realestate/rss2.0.xml'),
        (u'Investing', u'http://www.baltimoresun.com/business/money/rss2.0.xml'),

        # Opinion##
        (u'Sun Editorials', u'http://www.baltimoresun.com/news/opinion/editorial/rss2.0.xml'),
        (u'Op/Ed', u'http://www.baltimoresun.com/news/opinion/oped/rss2.0.xml'),

        # News Blogs ##
        (u'InsideEd', u'http://www.baltimoresun.com/news/maryland/education/blog/rss2.0.xml'),
        (u'Maryland Politics', u'http://www.baltimoresun.com/news/maryland/politics/blog/rss2.0.xml'),
        (u'Maryland Weather', u'http://www.baltimoresun.com/news/weather/weather-blog/rss2.0.xml'),
        (u'Second Opinion', u'http://www.baltimoresun.com/news/opinion/second-opinion-blog/rss2.0.xml'),
        (u'Sun Investigates', u'http://www.baltimoresun.com/news/maryland/sun-investigates/rss2.0.xml'),
        (u'You Dont Say', u'http://www.baltimoresun.com/news/language-blog/rss2.0.xml'),

        # Business Blogs ##
        (u'BaltTech', u'http://www.baltimoresun.com/business/technology/blog/rss2.0.xml'),
        (u'Consuming Interests', u'http://www.baltimoresun.com/business/consuming-interests-blog/rss2.0.xml'),
        (u'The Real Estate Wonk', u'http://www.baltimoresun.com/business/real-estate/wonk/rss2.0.xml'),

        # Entertainment Blogs ##
        (u'ArtSmash', 'http://www.baltimoresun.com/entertainment/arts/artsmash/rss2.0.xml'),
        (u'Midnight Sun', u'http://www.baltimoresun.com/entertainment/music/midnight-sun-blog/rss2.0.xml'),
        (u'Read Street', u'http://www.baltimoresun.com/features/books/read-street/rss2.0.xml'),
        (u'Z on TV', u'http://www.baltimoresun.com/entertainment/tv/z-on-tv-blog/rss2.0.xml'),

        # Life Blogs ##
        (u'Baltimore Insider', u'http://www.baltimoresun.com/features/baltimore-insider-blog/rss2.0.xml'),
        (u'Picture of Health', u'http://www.baltimoresun.com/health/blog/rss2.0.xml'),

        # Sports Blogs ##
        (u'Orioles Insider', u'http://baltimore.feedsportal.com/c/34255/f/623100/index.rss'),
        (u'Ravens Insider', u'http://www.baltimoresun.com/sports/ravens/ravens-insider/rss2.0.xml'),
        (u'The Schmuck Stops Here', u'http://www.baltimoresun.com/sports/schmuck-blog/rss2.0.xml'),
    ]
PK�XЈ��))bangkok_biz.png�PNG


IHDR  D���<PLTE?�?����Ao�?�1c������K����q����ҁ��"W����Q{���ڐ��a���v@tRNS@0�5y��IDATx���E��0�a��	��?�{w��6H�xR�*��e�-P��0��: �g����c�70$T��7��nf���+h���1��|��T#dк�@�@�&@sY&|:�&�
r�h8=i/ _@m6\:7�/��ӱ/7��R<#�bIEND�B`�PK�X�Q�i��bangkok_biz.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1290689337(BasicNewsRecipe):
    __author__ = 'Anat R.'
    language = 'th'
    title = u'Bangkok Biz News'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    feeds = [(u'Headlines',
              u'http://www.bangkokbiznews.com/home/services/rss/home.xml'),
             (u'Politics', u'http://www.bangkokbiznews.com/home/services/rss/politics.xml'),
             (u'Business', u'http://www.bangkokbiznews.com/home/services/rss/business.xml'),
             (u'Finance', u' http://www.bangkokbiznews.com/home/services/rss/finance.xml'),
             (u'Technology', u' http://www.bangkokbiznews.com/home/services/rss/it.xml')]
    remove_tags_before = dict(name='div', attrs={'class': 'box-Detailcontent'})
    remove_tags_after = dict(name='p', attrs={'class': 'allTags'})
    remove_tags = []
    remove_tags.append(dict(name='div', attrs={'id': 'content-tools'}))
    remove_tags.append(dict(name='p', attrs={'class': 'allTags'}))
    remove_tags.append(dict(name='div', attrs={'id': 'morePic'}))
    remove_tags.append(dict(name='ul', attrs={'class': 'tabs-nav'}))
PK�X�'6X��bangkokpost.png�PNG


IHDR  ���IDATxڵVo��/q��~`��R��`YV��)�03sJ3333�afN��x����5���n�
�]BN�}Q(�=�s�?����@����L�V�mN�ZQ\;�iǿ����X3�m�;�P9`A���w��-a��4��ZE�>�ք�+Āmj�%���_���^B�֧��vr��BQ�`��Mvy�tm]"[[Z7v�f	c�*��K�+�b�x���6����Y�?*—�c�������f�f�6oll@m��441�{�͹����3��#<�jnq��`rza����ާe�0����Go�J�Ok�#������ְ����-ݣ��3�L\���K����{3<9�`�dT!�(�W#@~��.4���t�E�ʠ��sjf��U3C$����S����.xk�/S�WX�Ah����,2����C�:�<�L�ZV�C98�����^�3�>e��b�?p�uzn�����"�@P.4��m4��He'�|��D�rC9%�h*_1%�6�cjz���(!��u�V��Bszn	~q�YK
x���p	���5BT,�
+PL�o���vBy`|�plNk���xLϯg��K)G1
����U�{��!K��=�-&[���UeS?@Y_�^���W���uF����Z֑M��7Լ�_�[0}�R`[�U}����ws���881��b�?��O��'�|Ǧ�;�4��^r�(�e��)BXY__�����]r���/h�a\!��h�|�-�Zd�bG�*yۭ疨��U�������zQ.�&*�4˘�4k�~[�8JE}#�ܖ+�*|G$�R�15�8E��ߤ�֒�L9�<�_f�.�/���?x
/��Wkp�_g�X�d�4��	��29�Q��ȩU��&�u�.�XmYڪ�`U,�i������|9�[E��GE:�E$��!���
2�����%�����hb���ƺ�{�X��k�"�AB��|3��_��Jn6��N�ANi��D(TJY�wt�� }z~�eo�����6��E��z���#��i�.����x�
)�s�%7�3z�!��k6�W�}�ł�|��~j,����	�_��H�is�U.�b\�:�~�`R�1b�C]�<��j�%��_�}Ȃ�'�e�ߛ"F��rY&j���Yu����*ua	.�$ٸh��g,��5в�L,h(m��-mr�ˤκ�?%\���̾�6:5˜�R�d㳟�{4����3i'����u��
E��Z״
��<�y�\5��6�9�-��%���{��]\^��4_魂9g��V�Ė�ȥw�"��a\R(8HXW<��kZ��w �1��C�Q��C��Tu@�+l2�5��H�`��k��-%��Qau�#�R���+%D��`��#@BNk��/Kʛ���~�Ϋ#x���{�8CG~;��T�?���l^j4�V�;�IEND�B`�PK�XՕ��QQbangkokpost.recipefrom 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 BangkokPostRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en_TH'
    version = 1

    title = u'Bangkok Post'
    publisher = u'Post Publishing PCL'
    category = u'News'
    description = u'The world\'s window to Thailand'

    oldest_article = 7
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False

    # Feeds from: http://www.bangkokpost.com/rss/
    feeds = []
    feeds.append(
        (u'Breaking News', u'http://www.bangkokpost.com/rss/data/breakingnews.xml'))
    feeds.append(
        (u'Top Stories', u'http://www.bangkokpost.com/rss/data/topstories.xml'))
    feeds.append((u'News', u'http://www.bangkokpost.com/rss/data/news.xml'))
    feeds.append(
        (u'Business', u'http://www.bangkokpost.com/rss/data/business.xml'))
    feeds.append(
        (u'Opinion', u'http://www.bangkokpost.com/rss/data/opinion.xml'))
    feeds.append(
        (u'Travel', u'http://www.bangkokpost.com/rss/data/travel.xml'))
    feeds.append(
        (u'Leisure', u'http://www.bangkokpost.com/rss/data/leisure.xml'))
    feeds.append(
        (u'Entertainment', u'http://www.bangkokpost.com/rss/data/entertainment.xml'))
    feeds.append((u'Auto', u'http://www.bangkokpost.com/rss/data/auto.xml'))
    feeds.append((u'Life', u'http://www.bangkokpost.com/rss/data/life.xml'))
    feeds.append((u'Tech', u'http://www.bangkokpost.com/rss/data/tect.xml'))

    keep_only_tags = [
        classes('article-headline article-content'),
    ]

    def print_version(self, url):
        if '.com/vdo/' in url:
            url = None
        return url
PK�X�q\ɣ�bankier_pl.png�PNG


IHDR(-SPLTE2d,:TD>LdF<�J,�N$�V�^���fFIDATx����0@�쿱M�:������µr��F�S"�6S��,��N��fa(���r��V��$�p�"^IEND�B`�PK�Xa��bankier_pl.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com>'

'''
bankier.pl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class bankier(BasicNewsRecipe):
    title = u'Bankier.pl'
    __author__ = 'teepel <teepel44@gmail.com>'
    language = 'pl'
    description = 'Polski portal finansowy. Informacje o: gospodarka, inwestowanie, finanse osobiste, prowadzenie firmy, kursy walut, notowania akcji, fundusze.'  # noqa
    masthead_url = 'http://www.bankier.pl/gfx/hd-mid-02.gif'
    INDEX = 'http://bankier.pl/'
    remove_empty_feeds = True
    oldest_article = 1
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    simultaneous_downloads = 5

    keep_only_tags = []
    keep_only_tags.append(dict(name='div', attrs={'align': 'left'}))

    remove_tags = []
    remove_tags.append(dict(name='table', attrs={'cellspacing': '2'}))
    remove_tags.append(dict(name='div', attrs={'align': 'center'}))
    remove_tags.append(dict(name='img', attrs={'src': '/gfx/hd-mid-02.gif'}))

    feeds = [
        (u'Wiadomości dnia', u'http://feeds.feedburner.com/bankier-wiadomosci-dnia'),
        (u'Finanse osobiste', u'http://feeds.feedburner.com/bankier-finanse-osobiste'),
        (u'Firma', u'http://feeds.feedburner.com/bankier-firma'),
        (u'Giełda', u'http://feeds.feedburner.com/bankier-gielda'),
        (u'Rynek walutowy', u'http://feeds.feedburner.com/bankier-rynek-walutowy'),
        (u'Komunikaty ze spółek', u'http://feeds.feedburner.com/bankier-espi'),
    ]

    def print_version(self, url):
        segment = url.split('.')
        urlPart = segment[2]
        segments = urlPart.split('-')
        urlPart2 = segments[-1]
        return 'http://www.bankier.pl/wiadomosci/print.html?article_id=' + urlPart2
PK�Xl����bar_and_bench.png�PNG


IHDR  D����PLTE������������������������������������������������������e$h����r��t��|��}�d"g�������i*l�h�f%i�w�������g&j�����ϻЃO��l�������j+m�i���ۜs�����v�p4sk,m�~���������k,n���̶�h(k���|D~�������������������{D~���w=y���������d#gn1q}F���I�I�������_��c��M�ɲʰ��k-n��粑����������������������Ѿ҃O����������yA|����������O����н�Ư����u;xv<xǯ�g(jg'j�w����������u:w�i�ǰ������m0p͸Λq��Y��P�r6uh)k�U��V��W�s7ut9v���t9w�m���ޚp����o2r����y�o3r�����������������j�p3sҿ��j�ptRNS $&(046@�����R��IDATx�u��#A��^�&�g��ڶm۶mۿu�TWg&z����3dXKC
�׵'�vx�z��?��Zp��ʔ�P��(�Ԍ'p%�����9TgY6t����~0��w��tAj�//ZI�<��'��p��^C"l������[�P���x�`��?W��O��=����l�q��jP&1O�`�,<F�`���8XK֩�3�'�,ޤc��
���3Ry�d���b ��:�H$�k���I9��?����r'Q��$6p���Y�|��h4:��[�ҟ9@�A�e{p��18���G|��8�?�^��lpB>|���ֺ{dUnh��51+�`�b�V�
��N%�`���v
�u����N*=�
j�1����=��	��Ƙ�Z9�GIr@�	o�IEND�B`�PK�Xk��q�	�	bar_and_bench.recipefrom calibre.web.feeds.news import BasicNewsRecipe, prefixed_classes
from calibre.ptempfile import PersistentTemporaryFile

class bar(BasicNewsRecipe):
    title = 'Bar and Bench'
    __author__ = 'unkn0wn'
    description = (
        'Bar & Bench is the premier online portal for Indian legal news. News, interviews,'
        ' and columns related to the Supreme Court of India and the High Courts are published.'
        )
    language = 'en_IN'
    masthead_url = 'https://gumlet.assettype.com/barandbench/2019-12/7a743b15-5d5d-44d7-96c2-13616780ed95/brand_2x.png'

    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['height', 'width', 'style']

    keep_only_tags = [
        prefixed_classes(
            'text-story-m_header-details__ text-story-m_hero-image__ text-story-m_story-content-inner-wrapper__'
        )
    ]

    remove_tags = [
        prefixed_classes(
            'text-story-m_story-tags__ story-footer-module__metype__'
        ),
        dict(name = 'svg')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        return soup

    ignore_duplicate_articles = {'title'}
    resolve_internal_links  = True
    remove_empty_feeds = True

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/', 'podcast-'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = []

    sections = [
        'news', 'columns', 'interviews', 'law-firms', 'apprentice-lawyer', 'legal-jobs'
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:barandbench.com{}&hl=en-IN&gl=IN&ceid=IN:en'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    feeds.append(('Others', a.format('')))
PK�X����barrons.png�PNG


IHDR���R*PLTE&w&4�R\�`j�ox������è���������������Έ��HIDATx�c@�3gN�Y1�Ǡ�#ƈ�0Μ�a()�@�|��P����`�q��u�0��p�h x�[1�IEND�B`�PK�X�����barrons.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes, prefixed_classes
from collections import defaultdict
from datetime import date
import re

class barrons(BasicNewsRecipe):
    title = 'Barron\'s Magazine'
    __author__ = 'unkn0wn'
    description = (
        'Barron\'s is an American weekly magazine/newspaper published by Dow Jones & Company. Founded in 1921 as a sister '
        'publication to The Wall Street Journal, Barron\'s covers U.S. financial information, market developments, and '
        'relevant statistics.'
    )
    language = 'en_US'
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['height', 'width', 'style']
    encoding = 'utf-8'
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://www.barrons.com/asset/barrons/images/barrons-logo.png'
    delay = 1

    extra_css = '''
        img {display:block; margin:0 auto;}
        .figc { font-size:small; text-align:center; }
        .imageCredit { color:#404040; font-size:x-small; }
        .headline__category, .article-prebody { font-size:small; color:#404040; }
        .sub-head { color:#202020; }
    '''

    keep_only_tags = [
        classes('headline articleLead article-prebody'),
        dict(name='section', attrs={'subscriptions-section':'content'})
    ]
    remove_tags = [
        dict(name=['meta', 'link', 'svg', 'button', 'i-amphtml-sizer']),
        classes('wsj-ad dynamic-inset-overflow newsletter-inset')
    ]

    def preprocess_html(self, soup):
        for figc in soup.findAll('figcaption'):
            figc['class'] = 'figc'
            for p in figc.findAll('p'):
                p.name = 'div'
        for by in soup.findAll(**classes('byline')):
            for p in by.findAll('p'):
                p.name = 'span'
        for h2 in soup.findAll('h2'):
            h2.name = 'h4'
        for iframe in soup.findAll('amp-iframe'):
            wsj = iframe.find('amp-img')
            if wsj:
                wsj.decompose()
            data = re.search(r'datawrapper-chart-(.{5})', iframe['src'])
            if data:
                iframe.name = 'img'
                iframe['src'] = 'https://datawrapper.dwcdn.net/' + data.group(1) + '/full.png'
        for amp in soup.findAll('amp-img'):
            if not amp.find('img', attrs={'src':True}):
                if amp.has_attr('src'):
                    amp['src'] = amp['src'] + '&pixel_ratio=1.5'
                    amp.name = 'img'
            else:
                amp.img['src'] = amp.img['src'] + '&pixel_ratio=1.5'
        return soup

    def get_browser(self, *args, **kwargs):
        kwargs['user_agent'] = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
        br = BasicNewsRecipe.get_browser(self, *args, **kwargs)
        br.addheaders += [
            ('Referer', 'https://www.google.com/'),
            ('X-Forwarded-For', '66.249.66.1')
        ]
        return br

    def parse_index(self):
        archive = self.index_to_soup('https://www.barrons.com/magazine?archives=' + date.today().strftime('%Y'))
        issue = archive.find(**prefixed_classes('BarronsTheme--archive-box--'))
        self.timefmt = ' [' + self.tag_to_string(issue.find(**prefixed_classes('BarronsTheme--date--'))) + ']'
        self.log(self.timefmt)
        self.cover_url = issue.img['src'].split('?')[0]

        ans = defaultdict(list)

        for articles in archive.findAll(**prefixed_classes('BarronsTheme--story--')):
            section = 'Magazine'
            strap = articles.find_previous_sibling(**prefixed_classes('BarronsTheme--strap--'))
            if strap:
                label = strap.find(**prefixed_classes('BarronsTheme--label--'))
                if label:
                    section = self.tag_to_string(label).strip()
            a = articles.find(**prefixed_classes('BarronsTheme--heading'))
            title = self.tag_to_string(a).strip()
            url = a.a['href']
            desc = ''
            byl = articles.find(**prefixed_classes('BarronsTheme--byline--'))
            if byl:
                desc += self.tag_to_string(byl)
            ttr =  articles.find(**prefixed_classes('BarronsTheme--time-to-read--'))
            if ttr:
                desc += self.tag_to_string(ttr)
            summ = articles.find(**prefixed_classes('BarronsTheme--summary--'))
            if summ:
                desc += ' | ' + self.tag_to_string(summ)
            self.log('\t', title, ' ', url, '\n\t', desc)
            ans[section].append({'title': title, 'url': url, 'description': desc})
        return [(section, articles) for section, articles in ans.items()]

    def print_version(self, url):
        return url.split('?')[0].replace('/articles/', '/amp/articles/')
PK�X�s�bay_citizen.png�PNG


IHDR  ��tRNSn���IDATx^��Mh\U������G��ɴ�iZ)�P,h��Dč+�.�,-�{7"�;�EEB�NJKōڢ-�T���ؚbZ�=M&�L��ν�]t�}e�b~���q��s�#<�0�k����J��q�)L��r���N���nέ�1=��8�4(��[�?}e�7�[��YP�U�"J��=39�ɅKժ1HU(<�5��Ͻ4 �~y�V�hi1,	m�����o|���}�
�*H#b/[M�i8��(%LV��յ�ݘ86L�"p�o�%ۇ�E��~��
!
��x��|qy�9��4�<fV%��M�@�t��7�bx���1Y��Z�&���)Z�A+<E��Z�O�w�&�؇:�q��5P���,(��4�M@�l����pD�A�b����������>����+����]wJ�%Ο���œ��eXrvT����8#'>�h�$q���`��/<�R�}����:z�JѢݻ�G01��E0�}k>�N_�~t�z��b�I`4�{�7����N)RN���v<�]Zӽz����w?\���O�E[�'�6f�j5�<)e��?��b"�1�F^=4v�7/O|y�1�9�9""Қ���֊��x����5��ˇLJ����ɩɫH��(d@�/<(���j=��Ǝ�[��D����(��
*�=猵Y�QJ��s���x�%�1��"�Vk[�2��8�EA�"���u��3�tUCԫTvگ�H�|@J��fci\�|h�*���mJ)�^����xuv����$�w�@�
�b��|�����<��Y�Fq��k���,ijϠ4����P�TZ!�����M~��I㒤�  ����y��Bi��(m�������?0֦����_���G����ʟy���^��o�E�o�;{��W��
�̹�;�%]IEND�B`�PK�X�:Sbay_citizen.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class TheBayCitizen(BasicNewsRecipe):
    title = 'The Bay Citizen'
    language = 'en'
    __author__ = 'noah'
    description = 'The Bay Citizen'
    publisher = 'The Bay Citizen'
    INDEX = u'http://www.baycitizen.org'
    category = 'news'
    oldest_article = 2
    max_articles_per_feed = 20
    no_stylesheets = True
    masthead_url = 'http://media.baycitizen.org/images/layout/logo1.png'
    feeds = [('Main Feed', 'http://www.baycitizen.org/feeds/stories/')]
    keep_only_tags = [dict(name='div', attrs={'class': 'story'})]
    remove_tags = [
        dict(name='div', attrs={'class': 'socialBar'}),
        dict(name='div', attrs={'id': 'text-resize'}),
        dict(name='div', attrs={'class': 'story relatedContent'}),
        dict(name='div', attrs={'id': 'comment_status_loading'}),
    ]

    def append_page(self, soup, appendtag, position):
        pager = soup.find('a', attrs={'class': 'stry-next'})
        if pager:
            nexturl = self.INDEX + pager['href']
            soup2 = self.index_to_soup(nexturl)
            texttag = soup2.find('div', attrs={'class': 'body'})
            for it in texttag.findAll(style=True):
                del it['style']
            newpos = len(texttag.contents)
            self.append_page(soup2, texttag, newpos)
            texttag.extract()
            appendtag.insert(position, texttag)

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        self.append_page(soup, soup.body, 3)
        garbage = soup.findAll(id='story-pagination')
        [trash.extract() for trash in garbage]
        garbage = soup.findAll('em', 'cont-from-prev')
        [trash.extract() for trash in garbage]
        return soup
PK�Xq$�XXbbc.png�PNG


IHDR7���IDATx�c����y�&2$�I^�X
��-�_w�IEND�B`�PK�Xv�5= 6 6
bbc.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2020, Kovid Goyal <kovid at kovidgoyal.net>

import json

from calibre import prepare_string_for_xml
from calibre.web.feeds.recipes import BasicNewsRecipe


# Article JSON parser {{{
def serialize_image(block):
    yield '<div>'
    block = block['model']
    img = block['image']
    alt = prepare_string_for_xml(img.get('alt') or '', True)
    for q in ('originalSrc', 'src'):
        if q in img:
            src = prepare_string_for_xml(img[q])
            break
    else:
        raise ValueError('No src found in img block: {}'.format(img))
    yield '<img src="{}" alt="{}"/>'.format(src, alt)
    caption = block.get('caption')
    if caption and caption.get('type') == 'text':
        yield '<div>'
        yield from serialize_paragraph(caption)
        yield '</div>'
    yield '</div>'


def block_tag(name, generator):
    yield '<' + name + '>'
    yield from generator
    yield '</' + name + '>'


def serialize_paragraph(block):
    block = block['model']
    for x in block['blocks']:
        xt = x['type']
        if xt == 'fragment':
            styles = []
            model = x['model']
            for attr in model['attributes']:
                if attr == 'bold':
                    styles.append('font-weight: bold')
                elif attr in ('italic', 'italics'):
                    styles.append('font-style: italic')
            if styles:
                prefix = '<span style="{}">'.format('; '.join(styles))
                suffix = '</span>'
            else:
                prefix = suffix = ''
            yield prefix + prepare_string_for_xml(model['text']) + suffix
        elif xt == 'urlLink':
            model = x['model']
            yield '<a href="{}">{}</a>'.format(prepare_string_for_xml(model['locator'], True), prepare_string_for_xml(model['text']))


def serialize_list(block):
    for x in block['model']['blocks']:
        if x['type'] == 'listItem':
            yield from block_tag('li', serialize_paragraph(x))


def serialize_text(block):
    block = block['model']
    for x in block['blocks']:
        xt = x['type']
        if xt == 'paragraph':
            yield from block_tag('p', serialize_paragraph(x))
        elif xt == 'unorderedList':
            yield from block_tag('ul', serialize_list(x))
        elif xt == 'orderedList':
            yield from block_tag('ol', serialize_list(x))
        else:
            raise KeyError('Unknown block type: ' + x['type'])


def serialize_contributor(contributor):
    if 'title' in contributor:
        yield '<h3>' + prepare_string_for_xml(contributor['title']) + '</h3>'
    if 'subtitle' in contributor:
        yield '<div>' + prepare_string_for_xml(contributor['subtitle']) + '</div>'


def parse_article_json(root, abort_article):
    data = root['data']
    has_media_experience = False
    for key in data:
        if key.startswith('article?'):
            article = data[key]['data']
            break
        elif key.startswith('media-experience?'):
            has_media_experience = True
    else:
        if has_media_experience:
            abort_article('Skipping video article')
            return
        raise KeyError('No article found in data keys: {}'.format(data.keys()))
    lines = []
    if article.get('headline'):
        lines.append('<h1>{}</h1>'.format(prepare_string_for_xml(article['headline'])))
    if article.get('contributor'):
        lines.extend(serialize_contributor(article['contributor']))
    for block in article['content']['model']['blocks']:
        bt = block.get('type')
        if bt == 'image':
            lines.extend(serialize_image(block))
        elif bt == 'text':
            lines.extend(serialize_text(block))
    return '<html><body id="main-content">' + '\n'.join(lines) + '</body></html>'


def parse_raw_html(html, abort_article):
    q = '>window.__INITIAL_DATA__="{'
    idx = html.find(q)
    if idx < 0:
        raise ValueError('Failed to find JSON')
    data = html[idx + len(q) - 2:]
    idx = data.find('}";</script>')
    data = data[:idx+2]
    data = json.loads(data)
    root = json.loads(data)
    return parse_article_json(root, abort_article)


if __name__ == '__main__':
    print(parse_raw_html(open('/t/raw.html').read(), print))
# }}}


class BBCNews(BasicNewsRecipe):

    # Select / de-select the feeds you want in your ebook.
    feeds = [
        ("News Home", "https://feeds.bbci.co.uk/news/rss.xml"),
        ("UK", "https://feeds.bbci.co.uk/news/uk/rss.xml"),
        ("World", "https://feeds.bbci.co.uk/news/world/rss.xml"),
        # ("England", "https://feeds.bbci.co.uk/news/england/rss.xml"),
        # ("Scotland", "https://feeds.bbci.co.uk/news/scotland/rss.xml"),
        # ("Wales", "https://feeds.bbci.co.uk/news/wales/rss.xml"),
        # ("N. Ireland", "https://feeds.bbci.co.uk/news/northern_ireland/rss.xml"),
        # ("Africa", "https://feeds.bbci.co.uk/news/world/africa/rss.xml"),
        # ("Asia", "https://feeds.bbci.co.uk/news/world/asia/rss.xml"),
        # ("Europe", "https://feeds.bbci.co.uk/news/world/europe/rss.xml"),
        # ("Latin America", "https://feeds.bbci.co.uk/news/world/latin_america/rss.xml"),
        # ("Middle East", "https://feeds.bbci.co.uk/news/world/middle_east/rss.xml"),
        ("US & Canada", "https://feeds.bbci.co.uk/news/world/us_and_canada/rss.xml"),
        ("Politics", "https://feeds.bbci.co.uk/news/politics/rss.xml"),
        ("Science/Environment",
         "https://feeds.bbci.co.uk/news/science_and_environment/rss.xml"),
        ("Technology", "https://feeds.bbci.co.uk/news/technology/rss.xml"),
        ("Magazine", "https://feeds.bbci.co.uk/news/magazine/rss.xml"),
        ("Entertainment/Arts",
         "https://feeds.bbci.co.uk/news/entertainment_and_arts/rss.xml"),
        # ("Health", "https://feeds.bbci.co.uk/news/health/rss.xml"),
        # ("Education/Family", "https://feeds.bbci.co.uk/news/education/rss.xml"),
        ("Business", "https://feeds.bbci.co.uk/news/business/rss.xml"),
        ("Special Reports", "https://feeds.bbci.co.uk/news/special_reports/rss.xml"),
        ("Also in the News", "https://feeds.bbci.co.uk/news/also_in_the_news/rss.xml"),
        # ("Newsbeat", "https://www.bbc.co.uk/newsbeat/rss.xml"),
        # ("Click", "http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/programmes/click_online/rss.xml"),
        # ("Blog: Mark D'Arcy (Parliamentary Correspondent)", "https://feeds.bbci.co.uk/news/correspondents/markdarcy/rss.sxml"),
        # ("Blog: Robert Peston (Business Editor)", "https://feeds.bbci.co.uk/news/correspondents/robertpeston/rss.sxml"),
        # ("Blog: Stephanie Flanders (Economics Editor)", "https://feeds.bbci.co.uk/news/correspondents/stephanieflanders/rss.sxml"),
        ("Sport Front Page",
         "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/front_page/rss.xml"),
        # ("Football", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/football/rss.xml"),
        # ("Cricket", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/cricket/rss.xml"),
        # ("Rugby Union", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/rugby_union/rss.xml"),
        # ("Rugby League", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/rugby_league/rss.xml"),
        # ("Tennis", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/tennis/rss.xml"),
        # ("Golf", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/golf/rss.xml"),
        # ("Motorsport", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/motorsport/rss.xml"),
        # ("Boxing", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/boxing/rss.xml"),
        # ("Athletics", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/athletics/rss.xml"),
        # ("Snooker", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/snooker/rss.xml"),
        # ("Horse Racing", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/horse_racing/rss.xml"),
        # ("Cycling", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/cycling/rss.xml"),
        # ("Disability Sport", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/disability_sport/rss.xml"),
        # ("Other Sport", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/rss.xml"),
        # ("Olympics 2012", "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/olympics_2012/rss.xml"),
        # ("N. Ireland Politics", "https://feeds.bbci.co.uk/news/northern_ireland/northern_ireland_politics/rss.xml"),
        # ("Scotland Politics", "https://feeds.bbci.co.uk/news/scotland/scotland_politics/rss.xml"),
        # ("Scotland Business", "https://feeds.bbci.co.uk/news/scotland/scotland_business/rss.xml"),
        # ("E. Scotland, Edinburgh & Fife", "https://feeds.bbci.co.uk/news/scotland/edinburgh_east_and_fife/rss.xml"),
        # ("W. Scotland & Glasgow", "https://feeds.bbci.co.uk/news/scotland/glasgow_and_west/rss.xml"),
        # ("Highlands & Islands", "https://feeds.bbci.co.uk/news/scotland/highlands_and_islands/rss.xml"),
        # ("NE. Scotland, Orkney & Shetland", "https://feeds.bbci.co.uk/news/scotland/north_east_orkney_and_shetland/rss.xml"),
        # ("South Scotland", "https://feeds.bbci.co.uk/news/scotland/south_scotland/rss.xml"),
        # ("Central Scotland & Tayside", "https://feeds.bbci.co.uk/news/scotland/tayside_and_central/rss.xml"),
        # ("Wales Politics", "https://feeds.bbci.co.uk/news/wales/wales_politics/rss.xml"),
        # ("NW. Wales", "https://feeds.bbci.co.uk/news/wales/north_west_wales/rss.xml"),
        # ("NE. Wales", "https://feeds.bbci.co.uk/news/wales/north_east_wales/rss.xml"),
        # ("Mid. Wales", "https://feeds.bbci.co.uk/news/wales/mid_wales/rss.xml"),
        # ("SW. Wales", "https://feeds.bbci.co.uk/news/wales/south_west_wales/rss.xml"),
        # ("SE. Wales", "https://feeds.bbci.co.uk/news/wales/south_east_wales/rss.xml"),
        # ("Newyddion - News in Welsh", "https://feeds.bbci.co.uk/newyddion/rss.xml"),
        # ("Gwleidyddiaeth", "https://feeds.bbci.co.uk/newyddion/gwleidyddiaeth/rss.xml"),
        # ("Gogledd-Ddwyrain", "https://feeds.bbci.co.uk/newyddion/gogledd-ddwyrain/rss.xml"),
        # ("Gogledd-Orllewin", "https://feeds.bbci.co.uk/newyddion/gogledd-orllewin/rss.xml"),
        # ("Canolbarth", "https://feeds.bbci.co.uk/newyddion/canolbarth/rss.xml"),
        # ("De-Ddwyrain", "https://feeds.bbci.co.uk/newyddion/de-ddwyrain/rss.xml"),
        # ("De-Orllewin", "https://feeds.bbci.co.uk/newyddion/de-orllewin/rss.xml"),
    ]

    #    **** SELECT YOUR USER PREFERENCES ****

    # Title to use for the ebook.
    #
    title = 'BBC News'

    # A brief description for the ebook.
    #
    description = u'BBC web site ebook created using rss feeds.'

    # The max number of articles which may be downloaded from each feed.
    # I've never seen more than about 70 articles in a single feed in the
    # BBC feeds.
    #
    max_articles_per_feed = 100

    # The max age of articles which may be downloaded from each feed. This is
    # specified in days - note fractions of days are allowed, Eg. 2.5 (2 and a
    # half days). My default of 1.5 days is the last 36 hours, the point at
    # which I've decided 'news' becomes 'old news', but be warned this is not
    # so good for the blogs, technology, magazine, etc., and sports feeds.
    # You may wish to extend this to 2-5 but watch out ebook creation time will
    # increase as well. Setting this to 30 will get everything (AFAICT) as long
    # as max_articles_per_feed remains set high (except for 'Click' which is
    # v. low volume and its currently oldest article is 4th Feb 2011).
    #
    oldest_article = 1.5

    # Number of simultaneous downloads. 20 is consistently working fine on the
    # BBC News feeds with no problems. Speeds things up from the default of 5.
    # If you have a lot of feeds and/or have increased oldest_article above 2
    # then you may wish to try increasing simultaneous_downloads to 25-30,
    # Or, of course, if you are in a hurry. [I've not tried beyond 20.]
    #
    simultaneous_downloads = 20

    # The format string for the date shown on the ebook's first page.
    # List of all values: https://docs.python.org/library/time.html
    # Default in news.py has a leading space so that's mirrored here.
    # As with 'feeds' select/de-select by adding/removing the initial '#',
    # only one timefmt should be selected, here's a few to choose from.
    #
    # [Fri, 14 Nov 2011] (Calibre default)
    timefmt = ' [%a, %d %b %Y]'
    # timefmt = ' [%a, %d %b %Y %H:%M]'       # [Fri, 14 Nov 2011 18:30]
    # timefmt = ' [%a, %d %b %Y %I:%M %p]'    # [Fri, 14 Nov 2011 06:30 PM]
    # timefmt = ' [%d %b %Y]'                 # [14 Nov 2011]
    # timefmt = ' [%d %b %Y %H:%M]'           # [14 Nov 2011 18.30]
    # timefmt = ' [%Y-%m-%d]'                 # [2011-11-14]
    # timefmt = ' [%Y-%m-%d-%H-%M]'           # [2011-11-14-18-30]

    #
    #    **** IMPORTANT ****
    #
    #    DO NOT EDIT BELOW HERE UNLESS YOU KNOW WHAT YOU ARE DOING.
    #
    #    DO NOT EDIT BELOW HERE UNLESS YOU KNOW WHAT YOU ARE DOING.
    #
    #    I MEAN IT, YES I DO, ABSOLUTELY, AT YOU OWN RISK. :)
    #
    #    **** IMPORTANT ****
    #

    # Author of this recipe.
    __author__ = 'Kovid Goyal'

    # Specify English as the language of the RSS feeds (ISO-639 code).
    language = 'en_GB'

    # Set publisher and publication type.
    publication_type = 'newspaper'
    encoding = 'utf-8'
    use_embedded_content = False

    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    resolve_internal_links = True

    def preprocess_raw_html(self, raw_html, url):
        return parse_raw_html(raw_html, self.abort_article)
PK�X��íeebbc_brasil.png�PNG


IHDR  V%(tRNSv��8IDAT8�c�O0�*��(��1
F�� Q�C<�Y��IEND�B`�PK�X��}�~~bbc_brasil.recipe##
# Title:        BBC News, Sport, and Blog Calibre Recipe
# Contact:      mattst - jmstanfield@gmail.com
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    mattst - jmstanfield@gmail.com
##
# Written:      November 2011
# Last Edited:  2011-11-19
##

__license__ = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'
__copyright__ = 'mattst - jmstanfield@gmail.com'


'''
BBC News, Sport, and Blog Calibre Recipe
'''

# Import the regular expressions module.
import re

# Import the BasicNewsRecipe class which this class extends.
from calibre.web.feeds.recipes import BasicNewsRecipe


class BBCBrasilRecipe(BasicNewsRecipe):

    #
    #    **** IMPORTANT USERS READ ME ****
    #
    #  First select the feeds you want then scroll down below the feeds list
    #  and select the values you want for the other user preferences, like
    #  oldest_article and such like.
    #
    #
    #  Select the BBC rss feeds which you want in your ebook.
    #  Selected feed have NO '#' at their start, de-selected feeds begin with a '#'.
    #
    #  Eg.  ("News Home", "http://feeds.bbci.co.uk/... - include feed.
    #  Eg. #("News Home", "http://feeds.bbci.co.uk/... - do not include feed.
    #
    # There are 68 feeds below which constitute the bulk of the available rss
    # feeds on the BBC web site. These include 5 blogs by editors and
    # correspondents, 16 sports feeds, 15 'sub' regional feeds (Eg. North West
    # Wales, Scotland Business), and 7 Welsh language feeds.
    #
    # Some of the feeds are low volume (Eg. blogs), or very low volume (Eg. Click)
    # so if "oldest_article = 1.5" (only articles published in the last 36 hours)
    # you may get some 'empty feeds' which will not then be included in the ebook.
    #
    # The 15 feeds currently selected below are simply my default ones.
    #
    # Note: With all 68 feeds selected, oldest_article set to 2,
    # max_articles_per_feed set to 100, and simultaneous_downloads set to 10,
    # the ebook creation took 29 minutes on my speedy 100 mbps net connection,
    # fairly high-end desktop PC running Linux (Ubuntu Lucid-Lynx).
    # More realistically with 15 feeds selected, oldest_article set to 1.5,
    # max_articles_per_feed set to 100, and simultaneous_downloads set to 20,
    # it took 6 minutes. If that's too slow increase 'simultaneous_downloads'.
    #
    # Select / de-select the feeds you want in your ebook.
    #
    feeds = [
        (u'Primeira P\xe1gina', u'http://www.bbc.co.uk/portuguese/index.xml'),
        (u'\xdaltimas Not\xedcias',
         u'http://www.bbc.co.uk/portuguese/ultimas_noticias/index.xml'),
        (u'Internacional',
         u'http://www.bbc.co.uk/portuguese/topicos/internacional/index.xml'),
        (u'Brasil', u'http://www.bbc.co.uk/portuguese/topicos/brasil/index.xml'),
        (u'Am\xe9rica Latina',
         u'http://www.bbc.co.uk/portuguese/topicos/america_latina/index.xml'),
        (u'Economia', u'http://www.bbc.co.uk/portuguese/topicos/economia/index.xml'),
        (u'Sa\xfade', u'http://www.bbc.co.uk/portuguese/topicos/saude/index.xml'),
        (u'Ci\xeancia e Tecnologia',
         u'http://www.bbc.co.uk/portuguese/topicos/ciencia_e_tecnologia/index.xml'),
        (u'Cultura', u'http://www.bbc.co.uk/portuguese/topicos/cultura/index.xml'),
        (u'V\xeddeos e Fotos',
         u'http://www.bbc.co.uk/portuguese/videos_e_fotos/index.xml'),
        (u'Especiais', u'http://www.bbc.co.uk/portuguese/especiais/index.xml')
    ]

    #    **** SELECT YOUR USER PREFERENCES ****

    # Title to use for the ebook.
    #
    title = 'BBC Brasil'

    # A brief description for the ebook.
    #
    description = u'Not\xedcias do Brasil e do mundo pela British Broadcasting Corporation'

    # The max number of articles which may be downloaded from each feed.
    # I've never seen more than about 70 articles in a single feed in the
    # BBC feeds.
    #
    max_articles_per_feed = 100

    # The max age of articles which may be downloaded from each feed. This is
    # specified in days - note fractions of days are allowed, Eg. 2.5 (2 and a
    # half days). My default of 1.5 days is the last 36 hours, the point at
    # which I've decided 'news' becomes 'old news', but be warned this is not
    # so good for the blogs, technology, magazine, etc., and sports feeds.
    # You may wish to extend this to 2-5 but watch out ebook creation time will
    # increase as well. Setting this to 30 will get everything (AFAICT) as long
    # as max_articles_per_feed remains set high (except for 'Click' which is
    # v. low volume and its currently oldest article is 4th Feb 2011).
    #
    oldest_article = 1.5

    # Number of simultaneous downloads. 20 is consistently working fine on the
    # BBC News feeds with no problems. Speeds things up from the default of 5.
    # If you have a lot of feeds and/or have increased oldest_article above 2
    # then you may wish to try increasing simultaneous_downloads to 25-30,
    # Or, of course, if you are in a hurry. [I've not tried beyond 20.]
    #
    simultaneous_downloads = 20

    # Timeout for fetching files from the server in seconds. The default of
    # 120 seconds, seems somewhat excessive.
    #
    timeout = 30

    # The format string for the date shown on the ebook's first page.
    # List of all values: http://docs.python.org/library/time.html
    # Default in news.py has a leading space so that's mirrored here.
    # As with 'feeds' select/de-select by adding/removing the initial '#',
    # only one timefmt should be selected, here's a few to choose from.
    #
    # [Fri, 14 Nov 2011] (Calibre default)
    timefmt = ' [%a, %d %b %Y]'
    # timefmt = ' [%a, %d %b %Y %H:%M]'       # [Fri, 14 Nov 2011 18:30]
    # timefmt = ' [%a, %d %b %Y %I:%M %p]'    # [Fri, 14 Nov 2011 06:30 PM]
    # timefmt = ' [%d %b %Y]'                 # [14 Nov 2011]
    # timefmt = ' [%d %b %Y %H:%M]'           # [14 Nov 2011 18.30]
    # timefmt = ' [%Y-%m-%d]'                 # [2011-11-14]
    # timefmt = ' [%Y-%m-%d-%H-%M]'           # [2011-11-14-18-30]

    #
    #    **** IMPORTANT ****
    #
    #    DO NOT EDIT BELOW HERE UNLESS YOU KNOW WHAT YOU ARE DOING.
    #
    #    DO NOT EDIT BELOW HERE UNLESS YOU KNOW WHAT YOU ARE DOING.
    #
    #    I MEAN IT, YES I DO, ABSOLUTELY, AT YOU OWN RISK. :)
    #
    #    **** IMPORTANT ****
    #

    # Author of this recipe.
    __author__ = 'Carlos Laviola'

    language = 'pt_BR'

    # Set tags.
    tags = 'news, sport, blog'

    # Set publisher and publication type.
    publisher = 'BBC'
    publication_type = 'newspaper'

    # Disable stylesheets from site.
    no_stylesheets = True

    # Specifies an override encoding for sites that have an incorrect charset
    # specified. Default of 'None' says to auto-detect. Some other BBC recipes
    # use 'utf8', which works fine (so use that if necessary) but auto-detecting
    # with None is working fine, so stick with that for robustness.
    encoding = None

    # Sets whether a feed has full articles embedded in it. The BBC feeds do
    # not.
    use_embedded_content = False

    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True

    # Create a custom title which fits nicely in the Kindle title list.
    # Requires "import time" above class declaration, and replacing
    # title with custom_title in conversion_options (right column only).
    # Example of string below: "BBC News - 14 Nov 2011"
    #
    # custom_title = "BBC News - " + time.strftime('%d %b %Y')

    '''
    # Conversion options for advanced users, but don't forget to comment out the
    # current conversion_options below. Avoid setting 'linearize_tables' as that
    # plays havoc with the 'old style' table based pages.
    #
    conversion_options = { 'title'       : title,
                           'comments'    : description,
                           'tags'        : tags,
                           'language'    : language,
                           'publisher'   : publisher,
                           'authors'     : publisher,
                           'smarten_punctuation' : True
                         }
    '''

    conversion_options = {'smarten_punctuation': True}

    # Specify extra CSS - overrides ALL other CSS (IE. Added last).
    extra_css = 'body { font-family: verdana, helvetica, sans-serif; } \
                 .introduction, .first { font-weight: bold; } \
                 .cross-head { font-weight: bold; font-size: 125%; } \
                 .cap, .caption { display: block; font-size: 80%; font-style: italic; } \
                 .cap, .caption, .caption img, .caption span { display: block; text-align: center; margin: 5px auto; } \
                 .byl, .byd, .byline img, .byline-name, .byline-title, .author-name, .author-position, \
                    .correspondent-portrait img, .byline-lead-in, .name, .role, .bbc-role { display: block; \
                    text-align: center; font-size: 80%; font-style: italic; margin: 1px auto; } \
                 .story-date, .published, .datestamp { font-size: 80%; } \
                 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: 175%; font-weight: bold; } \
                 h2 { text-align: center; font-size: 150%; font-weight: bold; } \
                 h3 { text-align: center; font-size: 125%; font-weight: bold; } \
                 h4, h5, h6 { text-align: center; font-size: 100%; font-weight: bold; }'

    # Remove various tag attributes to improve the look of the ebook pages.
    remove_attributes = ['border', 'cellspacing', 'align', 'cellpadding', 'colspan',
                         'valign', 'vspace', 'hspace', 'alt', 'width', 'height']

    # Remove the (admittedly rarely used) line breaks, "<br />", which sometimes
    # cause a section of the ebook to start in an unsightly fashion or, more
    # frequently, a "<br />" will muck up the formatting of a correspondant's byline.
    # "<br />" and "<br clear/>" are far more frequently used on the table formatted
    # style of pages, and really spoil the look of the ebook pages.
    preprocess_regexps = [(re.compile(r'<br[ ]*/>', re.IGNORECASE), lambda m: ''),
                          (re.compile(r'<br[ ]*clear.*/>', re.IGNORECASE), lambda m: '')]

    # Create regular expressions for tag keeping and removal to make the matches more
    # robust against minor changes and errors in the HTML, Eg. double spaces, leading
    # and trailing spaces, missing hyphens, and such like.
    # Python regular expression ('re' class) page:
    # http://docs.python.org/library/re.html

    # ***************************************
    # Regular expressions for keep_only_tags:
    # ***************************************

    # The BBC News HTML pages use variants of 'storybody' to denote the section of a HTML
    # page which contains the main text of the article. Match storybody variants: 'storybody',
    # 'story-body', 'story body','storybody ', etc.
    storybody_reg_exp = '^.*story[_ -]*body.*$'

    # The BBC sport and 'newsbeat' (features) HTML pages use 'blq_content' to hold the title
    # and published date. This is one level above the usual news pages which have the title
    # and date within 'story-body'. This is annoying since 'blq_content' must also be kept,
    # resulting in a lot of extra things to be removed by remove_tags.
    blq_content_reg_exp = '^.*blq[_ -]*content.*$'

    # The BBC has an alternative page design structure, which I suspect is an out-of-date
    # design but which is still used in some articles, Eg. 'Click' (technology), 'FastTrack'
    # (travel), and in some sport pages. These alternative pages are table based (which is
    # why I think they are an out-of-date design) and account for -I'm guesstimaking- less
    # than 1% of all articles. They use a table class 'storycontent' to hold the article
    # and like blq_content (above) have required lots of extra removal by
    # remove_tags.
    story_content_reg_exp = '^.*story[_ -]*content.*$'

    # Keep the sections of the HTML which match the list below. The HTML page created by
    # Calibre will fill <body> with those sections which are matched. Note that the
    # blq_content_reg_exp must be listed before storybody_reg_exp in keep_only_tags due to
    # it being the parent of storybody_reg_exp, that is to say the div class/id 'story-body'
    # will be inside div class/id 'blq_content' in the HTML (if 'blq_content' is there at
    # all). If they are the other way around in keep_only_tags then blq_content_reg_exp
    # will end up being discarded.
    keep_only_tags = [dict(name='table', attrs={'class': re.compile(story_content_reg_exp, re.IGNORECASE)}),
                      dict(name='div',   attrs={'class': re.compile(
                           blq_content_reg_exp, re.IGNORECASE)}),
                      dict(name='div',   attrs={'id': re.compile(
                           blq_content_reg_exp, re.IGNORECASE)}),
                      dict(name='div',   attrs={'class': re.compile(
                           storybody_reg_exp, re.IGNORECASE)}),
                      dict(name='div',   attrs={'id': re.compile(storybody_reg_exp, re.IGNORECASE)})]

    # ************************************
    # Regular expressions for remove_tags:
    # ************************************

    # Regular expression to remove share-help and variant tags. The share-help class
    # is used by the site for a variety of 'sharing' type links, Eg. Facebook, delicious,
    # twitter, email. Removed to avoid page clutter.
    share_help_reg_exp = '^.*share[_ -]*help.*$'

    # Regular expression to remove embedded-hyper and variant tags. This class is used to
    # display links to other BBC News articles on the same/similar subject.
    embedded_hyper_reg_exp = '^.*embed*ed[_ -]*hyper.*$'

    # Regular expression to remove hypertabs and variant tags. This class is used to
    # display a tab bar at the top of an article which allows the user to switch to
    # an article (viewed on the same page) providing further info., 'in depth' analysis,
    # an editorial, a correspondant's blog entry, and such like. The ability to handle
    # a tab bar of this nature is currently beyond the scope of this recipe and
    # possibly of Calibre itself (not sure about that - TO DO - check!).
    hypertabs_reg_exp = '^.*hyper[_ -]*tabs.*$'

    # Regular expression to remove story-feature and variant tags. Eg. 'story-feature',
    # 'story-feature related narrow', 'story-feature wide', 'story-feature narrow'.
    # This class is used to add additional info. boxes, or small lists, outside of
    # the main story. TO DO: Work out a way to incorporate these neatly.
    story_feature_reg_exp = '^.*story[_ -]*feature.*$'

    # Regular expression to remove video and variant tags, Eg. 'videoInStoryB',
    # 'videoInStoryC'. This class is used to embed video.
    video_reg_exp = '^.*video.*$'

    # Regular expression to remove audio and variant tags, Eg. 'audioInStoryD'.
    # This class is used to embed audio.
    audio_reg_exp = '^.*audio.*$'

    # Regular expression to remove pictureGallery and variant tags, Eg. 'pictureGallery'.
    # This class is used to embed a photo slideshow. See also 'slideshow'
    # below.
    picture_gallery_reg_exp = '^.*picture.*$'

    # Regular expression to remove slideshow and variant tags, Eg. 'dslideshow-enclosure'.
    # This class is used to embed a slideshow (not necessarily photo) but both
    # 'slideshow' and 'pictureGallery' are used for slideshows.
    slideshow_reg_exp = '^.*slide[_ -]*show.*$'

    # Regular expression to remove social-links and variant tags. This class is used to
    # display links to a BBC bloggers main page, used in various columnist's blogs
    # (Eg. Nick Robinson, Robert Preston).
    social_links_reg_exp = '^.*social[_ -]*links.*$'

    # Regular expression to remove quote and (multi) variant tags, Eg. 'quote',
    # 'endquote', 'quote-credit', 'quote-credit-title', etc. These are usually
    # removed by 'story-feature' removal (as they are usually within them), but
    # not always. The quotation removed is always (AFAICT) in the article text
    # as well but a 2nd copy is placed in a quote tag to draw attention to it.
    # The quote class tags may or may not appear in div's.
    quote_reg_exp = '^.*quote.*$'

    # Regular expression to remove hidden and variant tags, Eg. 'hidden'.
    # The purpose of these is unclear, they seem to be an internal link to a
    # section within the article, but the text of the link (Eg. 'Continue reading
    # the main story') never seems to be displayed anyway. Removed to avoid clutter.
    # The hidden class tags may or may not appear in div's.
    hidden_reg_exp = '^.*hidden.*$'

    # Regular expression to remove comment and variant tags, Eg. 'comment-introduction'.
    # Used on the site to display text about registered users entering
    # comments.
    comment_reg_exp = '^.*comment.*$'

    # Regular expression to remove form and variant tags, Eg. 'comment-form'.
    # Used on the site to allow registered BBC users to fill in forms, typically
    # for entering comments about an article.
    form_reg_exp = '^.*form.*$'

    # Extra things to remove due to the addition of 'blq_content' in
    # keep_only_tags.

    # <div class="story-actions"> Used on sports pages for 'email' and 'print'.
    story_actions_reg_exp = '^.*story[_ -]*actions.*$'

    # <div class="bookmark-list"> Used on sports pages instead of 'share-help' (for
    # social networking links).
    bookmark_list_reg_exp = '^.*bookmark[_ -]*list.*$'

    # <div id="secondary-content" class="content-group">
    # NOTE: Don't remove class="content-group" that is needed.
    # Used on sports pages to link to 'similar stories'.
    secondary_content_reg_exp = '^.*secondary[_ -]*content.*$'

    # <div id="featured-content" class="content-group">
    # NOTE: Don't remove class="content-group" that is needed.
    # Used on sports pages to link to pages like 'tables', 'fixtures', etc.
    featured_content_reg_exp = '^.*featured[_ -]*content.*$'

    # <div id="navigation">
    # Used on sports pages to link to pages like 'tables', 'fixtures', etc.
    # Used sometimes instead of "featured-content" above.
    navigation_reg_exp = '^.*navigation.*$'

    # <a class="skip" href="#blq-container-inner">Skip to top</a>
    # Used on sports pages to link to the top of the page.
    skip_reg_exp = '^.*skip.*$'

    # Extra things to remove due to the addition of 'storycontent' in keep_only_tags,
    # which are the alternative table design based pages. The purpose of some of these
    # is not entirely clear from the pages (which are a total mess!).

    # Remove mapping based tags, Eg. <map id="world_map">
    # The dynamic maps don't seem to work during ebook creation. TO DO:
    # Investigate.
    map_reg_exp = '^.*map.*$'

    # Remove social bookmarking variation, called 'socialBookMarks'.
    social_bookmarks_reg_exp = '^.*social[_ -]*bookmarks.*$'

    # Remove page navigation tools, like 'search', 'email', 'print', called
    # 'blq-mast'.
    blq_mast_reg_exp = '^.*blq[_ -]*mast.*$'

    # Remove 'sharesb', I think this is a generic 'sharing' class. It seems to appear
    # alongside 'socialBookMarks' whenever that appears. I am removing it as well
    # under the assumption that it can appear alone as well.
    sharesb_reg_exp = '^.*sharesb.*$'

    # Remove class 'o'. The worst named user created css class of all time. The creator
    # should immediately be fired. I've seen it used to hold nothing at all but with
    # 20 or so empty lines in it. Also to hold a single link to another article.
    # Whatever it was designed to do it is not wanted by this recipe. Exact
    # match only.
    o_reg_exp = '^o$'

    # Remove 'promotopbg' and 'promobottombg', link lists. Have decided to
    # use two reg expressions to make removing this (and variants) robust.
    promo_top_reg_exp = '^.*promotopbg.*$'
    promo_bottom_reg_exp = '^.*promobottombg.*$'

    # Remove 'nlp', provides heading for link lists. Requires an exact match due to
    # risk of matching those letters in something needed, unless I see a variation
    # of 'nlp' used at a later date.
    nlp_reg_exp = '^nlp$'

    # Remove 'mva', provides embedded floating content of various types. Variant 'mvb'
    # has also now been seen. Requires an exact match of 'mva' or 'mvb' due to risk of
    # matching those letters in something needed.
    mva_or_mvb_reg_exp = '^mv[ab]$'

    # Remove 'mvtb', seems to be page navigation tools, like 'blq-mast'.
    mvtb_reg_exp = '^mvtb$'

    # Remove 'blq-toplink', class to provide a link to the top of the page.
    blq_toplink_reg_exp = '^.*blq[_ -]*top[_ -]*link.*$'

    # Remove 'products and services' links, Eg. desktop tools, alerts, and so on.
    # Eg. Class="servicev4 ukfs_services" - what a mess of a name. Have decided to
    # use two reg expressions to make removing this (and variants) robust.
    prods_services_01_reg_exp = '^.*servicev4.*$'
    prods_services_02_reg_exp = '^.*ukfs[_ -]*services.*$'

    # Remove -what I think is- some kind of navigation tools helper class, though I am
    # not sure, it's called: 'blq-rst blq-new-nav'. What I do know is it pops up
    # frequently and it is not wanted. Have decided to use two reg expressions to make
    # removing this (and variants) robust.
    blq_misc_01_reg_exp = '^.*blq[_ -]*rst.*$'
    blq_misc_02_reg_exp = '^.*blq[_ -]*new[_ -]*nav.*$'

    # Remove 'puffbox' - this may only appear inside 'storyextra', so it may not
    # need removing - I have no clue what it does other than it contains links.
    # Whatever it is - it is not part of the article and is not wanted.
    puffbox_reg_exp = '^.*puffbox.*$'

    # Remove 'sibtbg' and 'sibtbgf' - some kind of table formatting classes.
    sibtbg_reg_exp = '^.*sibtbg.*$'

    # Remove 'storyextra' - links to relevant articles and external sites.
    storyextra_reg_exp = '^.*story[_ -]*extra.*$'

    remove_tags = [dict(name='div',  attrs={'class': re.compile(story_feature_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        share_help_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        embedded_hyper_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        hypertabs_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        video_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        audio_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        picture_gallery_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        slideshow_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        quote_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        hidden_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        comment_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        story_actions_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        bookmark_list_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'id': re.compile(
                        secondary_content_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'id': re.compile(
                        featured_content_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'id': re.compile(
                        navigation_reg_exp, re.IGNORECASE)}),
                   dict(name='form', attrs={'id': re.compile(
                        form_reg_exp, re.IGNORECASE)}),
                   dict(attrs={'class': re.compile(
                        quote_reg_exp, re.IGNORECASE)}),
                   dict(attrs={'class': re.compile(
                        hidden_reg_exp, re.IGNORECASE)}),
                   dict(attrs={'class': re.compile(
                        social_links_reg_exp, re.IGNORECASE)}),
                   dict(attrs={'class': re.compile(
                        comment_reg_exp, re.IGNORECASE)}),
                   dict(attrs={'class': re.compile(
                        skip_reg_exp, re.IGNORECASE)}),
                   dict(name='map', attrs={'id': re.compile(
                        map_reg_exp, re.IGNORECASE)}),
                   dict(name='map', attrs={'name': re.compile(
                        map_reg_exp, re.IGNORECASE)}),
                   dict(name='div', attrs={'id': re.compile(
                        social_bookmarks_reg_exp, re.IGNORECASE)}),
                   dict(name='div', attrs={'id': re.compile(
                        blq_mast_reg_exp, re.IGNORECASE)}),
                   dict(name='div', attrs={'class': re.compile(
                        sharesb_reg_exp, re.IGNORECASE)}),
                   dict(name='div', attrs={
                       'class': re.compile(o_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        promo_top_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        promo_bottom_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={
                       'class': re.compile(nlp_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        mva_or_mvb_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        mvtb_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        blq_toplink_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        prods_services_01_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        prods_services_02_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        blq_misc_01_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        blq_misc_02_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': re.compile(
                        puffbox_reg_exp, re.IGNORECASE)}),
                   dict(attrs={'class': re.compile(
                        sibtbg_reg_exp, re.IGNORECASE)}),
                   dict(attrs={'class': re.compile(
                        storyextra_reg_exp, re.IGNORECASE)}),
                   dict(name='div',  attrs={'class': 'tools-container'}),
                   dict(name='div',  attrs={'class': 'tools-container-end'}),
                   dict(name='div',  attrs={
                       'class': 'g-block story-body contextual-links'}),
                   dict(name='div',  attrs={'class': ' g-w11 sidebar'})
                   ]

    # Uses url to create and return the 'printer friendly' version of the url.
    # In other words the 'print this page' address of the page.
    #
    # There are 3 types of urls used in the BBC site's rss feeds. There is just
    # 1 type for the standard news while there are 2 used for sports feed urls.
    # Note: Sports urls are linked from regular news feeds (Eg. 'News Home') when
    # there is a major story of interest to 'everyone'. So even if no BBC sports
    # feeds are added to 'feeds' the logic of this method is still needed to avoid
    # blank / missing / empty articles which have an index title and then no
    # body.
    def print_version(self, url):

        # Handle sports page urls type 01:
        if (url.find("go/rss/-/sport1/") != -1):
            temp_url = url.replace("go/rss/-/", "")

        # Handle sports page urls type 02:
        elif (url.find("go/rss/int/news/-/sport1/") != -1):
            temp_url = url.replace("go/rss/int/news/-/", "")

        # Handle regular news page urls:
        else:
            temp_url = url.replace("go/rss/int/news/-/", "")

        # Always add "?print=true" to the end of the url.
        print_url = temp_url + "?print=true"

        return print_url

    # Remove articles in feeds based on a string in the article title or url.
    #
    # Code logic written by: Starson17 - posted in: "Recipes - Re-usable code"
    # thread, in post with title: "Remove articles from feed", see url:
    # http://www.mobileread.com/forums/showpost.php?p=1165462&postcount=6
    # Many thanks and all credit to Starson17.
    #
    # Starson17's code has obviously been altered to suite my requirements.
    def parse_feeds(self):

        # Call parent's method.
        feeds = BasicNewsRecipe.parse_feeds(self)

        # Loop through all feeds.
        for feed in feeds:

            # Loop through all articles in feed.
            for article in feed.articles[:]:

                # Match key words and remove article if there's a match.

                # Most BBC rss feed video only 'articles' use upper case 'VIDEO'
                # as a title prefix. Just match upper case 'VIDEO', so that
                # articles like 'Video game banned' won't be matched and
                # removed.
                if 'VIDEO' in article.title:
                    feed.articles.remove(article)

                # Most BBC rss feed audio only 'articles' use upper case 'AUDIO'
                # as a title prefix. Just match upper case 'AUDIO', so that
                # articles like 'Hi-Def audio...' won't be matched and removed.
                elif 'AUDIO' in article.title:
                    feed.articles.remove(article)

                # Most BBC rss feed photo slideshow 'articles' use 'In Pictures',
                # 'In pictures', and 'in pictures', somewhere in their title.
                # Match any case of that phrase.
                elif 'IN PICTURES' in article.title.upper():
                    feed.articles.remove(article)

                # As above, but user contributed pictures. Match any case.
                elif 'YOUR PICTURES' in article.title.upper():
                    feed.articles.remove(article)

                # 'Sportsday Live' are articles which contain a constantly and
                # dynamically updated 'running commentary' during a live sporting
                # event. Match any case.
                elif 'SPORTSDAY LIVE' in article.title.upper():
                    feed.articles.remove(article)

                # Sometimes 'Sportsday Live' (above) becomes 'Live - Sport Name'.
                # These are being matched below using 'Live - ' because removing all
                # articles with 'live' in their titles would remove some articles
                # that are in fact not live sports pages. Match any case.
                elif 'LIVE - ' in article.title.upper():
                    feed.articles.remove(article)

                # 'Quiz of the week' is a Flash player weekly news quiz. Match only
                # the 'Quiz of the' part in anticipation of monthly and yearly
                # variants. Match any case.
                elif 'QUIZ OF THE' in article.title.upper():
                    feed.articles.remove(article)

                # Remove articles with 'scorecards' in the url. These are BBC sports
                # pages which just display a cricket scorecard. The pages have a mass
                # of table and css entries to display the scorecards nicely. Probably
                # could make them work with this recipe, but might take a whole day
                # of work to sort out all the css - basically a formatting
                # nightmare.
                elif 'scorecards' in article.url:
                    feed.articles.remove(article)

        return feeds

# End of class and file.
PK�X��íee
bbc_es.png�PNG


IHDR  V%(tRNSv��8IDAT8�c�O0�*��(��1
F�� Q�C<�Y��IEND�B`�PK�X1h�1��
bbc_es.recipe__license__ = 'GPL v3'
__author__ = 'Luis Hernandez'
__copyright__ = 'Luis Hernandez<tolyluis@gmail.com>'
__version__ = 'v1.0'
__date__ = '29 January 2011'

'''
http://www.bbc.co.uk/mundo/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1294946868(BasicNewsRecipe):

    title = u'BBC Mundo'
    publisher = u'BBC'

    __author__ = 'Luis Hernandez'
    description = 'BBC World for spanish readers'

    cover_url = 'http://1.bp.blogspot.com/_NHiOjk_uZwU/TEYy7IJAdAI/AAAAAAAABP8/coAE-pJ7_5E/s1600/bbcmundo_h.png'
    oldest_article = 2
    max_articles_per_feed = 100

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False

    language = 'es'
    remove_empty_feeds = True
    encoding = 'UTF-8'
    timefmt = '[%a, %d %b, %Y]'

    remove_tags_before = dict(name='div', attrs={'class': ['g-group']})
    remove_tags_after = dict(name='div', attrs={'class': [' g-w8']})

    remove_tags = [
        dict(name='ul', attrs={'class': ['document-tools blq-clearfix', 'blq-clearfix']}), dict(name='div', attrs={'class': ['box bx-quote-bubble', 'socialmedia-links', 'list li-carousel', 'list li-plain rolling-news', 'list li-plain', 'box bx-livestats', 'li-tab content', 'list li-relatedlinks', 'list li-relatedinternetlinks']})  # noqa
    ]

    feeds = [

    (u'Portada', u'http://www.bbc.co.uk/mundo/index.xml'),
    (u'Ultimas Noticias', u'http://www.bbc.co.uk/mundo/ultimas_noticias/index.xml'),
    (u'Internacional', u'http://www.bbc.co.uk/mundo/temas/internacional/index.xml'),
    (u'Economia', u'http://www.bbc.co.uk/mundo/temas/economia/index.xml'),
    (u'America Latina', u'http://www.bbc.co.uk/mundo/temas/america_latina/index.xml'),
    (u'Ciencia', u'http://www.bbc.co.uk/mundo/temas/ciencia/index.xml'),
    (u'Salud', u'http://www.bbc.co.uk/mundo/temas/salud/index.xml'),
    (u'Tecnologia', u'http://www.bbc.co.uk/mundo/temas/tecnologia/index.xml'),
    (u'Cultura', u'http://www.bbc.co.uk/mundo/temas/cultura/index.xml')
    ]
PK�X�fk���bbc_fast.png�PNG


IHDR  D���PLTE���������|x��tRNS@��fOIDATx��Ё�0C���7��
F��}��Ý��l��B�F6P*/�GW8w׈ C�w@h�]��?�gg74���j&PIEND�B`�PK�X�r,ffbbc_fast.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2020, Kovid Goyal <kovid at kovidgoyal.net>

import json

from calibre import prepare_string_for_xml
from calibre.web.feeds.recipes import BasicNewsRecipe


# Article JSON parser {{{
def serialize_image(block):
    yield '<div>'
    block = block['model']
    img = block['image']
    alt = prepare_string_for_xml(img.get('alt') or '', True)
    for q in ('originalSrc', 'src'):
        if q in img:
            src = prepare_string_for_xml(img[q])
            break
    else:
        raise ValueError('No src found in img block: {}'.format(img))
    yield '<img src="{}" alt="{}"/>'.format(src, alt)
    caption = block.get('caption')
    if caption and caption.get('type') == 'text':
        yield '<div>'
        yield from serialize_paragraph(caption)
        yield '</div>'
    yield '</div>'


def block_tag(name, generator):
    yield '<' + name + '>'
    yield from generator
    yield '</' + name + '>'


def serialize_paragraph(block):
    block = block['model']
    for x in block['blocks']:
        xt = x['type']
        if xt == 'fragment':
            styles = []
            model = x['model']
            for attr in model['attributes']:
                if attr == 'bold':
                    styles.append('font-weight: bold')
                elif attr in ('italic', 'italics'):
                    styles.append('font-style: italic')
            if styles:
                prefix = '<span style="{}">'.format('; '.join(styles))
                suffix = '</span>'
            else:
                prefix = suffix = ''
            yield prefix + prepare_string_for_xml(model['text']) + suffix
        elif xt == 'urlLink':
            model = x['model']
            yield '<a href="{}">{}</a>'.format(prepare_string_for_xml(model['locator'], True), prepare_string_for_xml(model['text']))


def serialize_list(block):
    for x in block['model']['blocks']:
        if x['type'] == 'listItem':
            yield from block_tag('li', serialize_paragraph(x))


def serialize_text(block):
    block = block['model']
    for x in block['blocks']:
        xt = x['type']
        if xt == 'paragraph':
            yield from block_tag('p', serialize_paragraph(x))
        elif xt == 'unorderedList':
            yield from block_tag('ul', serialize_list(x))
        elif xt == 'orderedList':
            yield from block_tag('ol', serialize_list(x))
        else:
            raise KeyError('Unknown block type: ' + x['type'])


def serialize_contributor(contributor):
    if 'title' in contributor:
        yield '<h3>' + prepare_string_for_xml(contributor['title']) + '</h3>'
    if 'subtitle' in contributor:
        yield '<div>' + prepare_string_for_xml(contributor['subtitle']) + '</div>'


def parse_article_json(root, abort_article):
    data = root['data']
    has_media_experience = False
    for key in data:
        if key.startswith('article?'):
            article = data[key]['data']
            break
        elif key.startswith('media-experience?'):
            has_media_experience = True
    else:
        if has_media_experience:
            abort_article('Skipping video article')
            return
        raise KeyError('No article found in data keys: {}'.format(data.keys()))
    lines = []
    if article.get('headline'):
        lines.append('<h1>{}</h1>'.format(prepare_string_for_xml(article['headline'])))
    if article.get('contributor'):
        lines.extend(serialize_contributor(article['contributor']))
    for block in article['content']['model']['blocks']:
        bt = block.get('type')
        if bt == 'image':
            lines.extend(serialize_image(block))
        elif bt == 'text':
            lines.extend(serialize_text(block))
    return '<html><body id="main-content">' + '\n'.join(lines) + '</body></html>'


def parse_raw_html(html, abort_article):
    q = '>window.__INITIAL_DATA__="{'
    idx = html.find(q)
    if idx < 0:
        raise ValueError('Failed to find JSON')
    data = html[idx + len(q) - 2:]
    idx = data.find('}";</script>')
    data = data[:idx+2]
    data = json.loads(data)
    root = json.loads(data)
    return parse_article_json(root, abort_article)


if __name__ == '__main__':
    print(parse_raw_html(open('/t/raw.html').read(), print))
# }}}


class BBC(BasicNewsRecipe):
    title = 'BBC News (fast)'
    __author__ = 'Kovid Goyal'
    description = 'Visit BBC News for up-to-the-minute news, breaking news, video, audio and feature stories. BBC News provides trusted World and UK news as well as local and regional perspectives. Also entertainment, business, science, technology and health news.'  # noqa
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'BBC'
    category = 'news, UK, world'
    language = 'en_GB'
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher,
    }
    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    resolve_internal_links = True

    feeds = [
        ('Top Stories', 'https://feeds.bbci.co.uk/news/rss.xml'),
        ('Science/Environment',
         'https://feeds.bbci.co.uk/news/science_and_environment/rss.xml'),
        ('Technology', 'https://feeds.bbci.co.uk/news/technology/rss.xml'),
        ('Entertainment/Arts',
         'https://feeds.bbci.co.uk/news/entertainment_and_arts/rss.xml'),
        ('Magazine', 'https://feeds.bbci.co.uk/news/magazine/rss.xml'),
        ('Business', 'https://feeds.bbci.co.uk/news/business/rss.xml'),
        ('Politics', 'https://feeds.bbci.co.uk/news/politics/rss.xml'),
        ('Health', 'https://feeds.bbci.co.uk/news/health/rss.xml'),
        ('US&Canada', 'https://feeds.bbci.co.uk/news/world/us_and_canada/rss.xml'),
        ('Latin America', 'https://feeds.bbci.co.uk/news/world/latin_america/rss.xml'),
        ('Europe', 'https://feeds.bbci.co.uk/news/world/europe/rss.xml'),
        ('South Asia', 'https://feeds.bbci.co.uk/news/world/south_asia/rss.xml'),
        ('England', 'https://feeds.bbci.co.uk/news/england/rss.xml'),
        ('Asia-Pacific', 'https://feeds.bbci.co.uk/news/world/asia_pacific/rss.xml'),
        ('Africa', 'https://feeds.bbci.co.uk/news/world/africa/rss.xml')
    ]

    def preprocess_raw_html(self, raw_html, url):
        return parse_raw_html(raw_html, self.abort_article)
PK�Xq$�XX
bbc_ru.png�PNG


IHDR7���IDATx�c����y�&2$�I^�X
��-�_w�IEND�B`�PK�X�C&Ɠ�
bbc_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class BBC(BasicNewsRecipe):
    title = u'BBC Russian'
    description = u'\u0420\u0443\u0441\u0441\u043A\u0430\u044F \u0441\u043B\u0443\u0436\u0431\u0430 BBC'
    __author__ = 'bugmen00t'
    publication_type = 'newspaper'
    oldest_article = 14
    max_articles_per_feed = 50
    language = 'ru'
    cover_url = 'https://news.files.bbci.co.uk/ws/img/logos/og/russian.png'
    auto_cleanup = False
    no_stylesheets = True

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='main', attrs={'aria-hidden': 'true'})

    remove_tags = [
        dict(name='section', attrs={'role': 'region'}),
        dict(name='footer'),
        dict(name='aside')
    ]

    feeds = [(
        u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438 BBC',
        'https://feeds.bbci.co.uk/russian/rss.xml'
    )]
PK�X�fk���
bbc_sport.png�PNG


IHDR  D���PLTE���������|x��tRNS@��fOIDATx��Ё�0C���7��
F��}��Ý��l��B�F6P*/�GW8w׈ C�w@h�]��?�gg74���j&PIEND�B`�PK�XU1��
�
bbc_sport.recipe__license__ = 'GPL v3'
__copyright__ = '2010, limawhiskey <limawhiskey at gmail.com>'
'''
news.bbc.co.uk/sport/
'''
import re
from calibre.web.feeds.recipes import BasicNewsRecipe


class BBC(BasicNewsRecipe):
    title = 'BBC Sport'
    __author__ = 'limawhiskey, Darko Miletic, Starson17'
    description = 'Sports news from UK. A fast version that does not download pictures'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'BBC'
    category = 'sport, news, UK, world'
    language = 'en_GB'
    publication_type = 'newsportal'
    extra_css = ' body{ font-family: Verdana,Helvetica,Arial,sans-serif } .introduction{font-weight: bold} .story-feature{display: block; padding: 0; border: 1px solid; width: 40%; font-size: small} .story-feature h2{text-align: center; text-transform: uppercase} '  # noqa
    preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')]
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': ['ds', 'mxb']}),
        dict(attrs={'class': ['story-body', 'storybody']})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['storyextra', 'share-help', 'embedded-hyper',
                                          'story-feature wide ', 'story-feature narrow', 'cap', 'caption', 'q1', 'sihf',
                                          'mva', 'videoInStoryC', 'sharesb', 'mvtb']}),
        dict(name=['img']), dict(name=['br'])
    ]

    remove_attributes = ['width', 'height']

    feeds = [
        ('Sport Front Page',
         'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/front_page/rss.xml'),
        ('Football', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/football/rss.xml'),
        ('Cricket', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/cricket/rss.xml'),
        ('Formula 1', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/motorsport/formula_one/rss.xml'),
        ('Commonwealth Games', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/commonwealth_games/delhi_2010/rss.xml'),
        ('Golf', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/golf/rss.xml'),
        ('Rugby Union', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/rugby_union/rss.xml'),
        ('Rugby League', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/rugby_league/rss.xml'),
        ('Tennis', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/tennis/rss.xml'),
        ('Motorsport', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/motorsport/rss.xml'),
        ('Boxing', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/boxing/rss.xml'),
        ('Athletics', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/athletics/rss.xml'),
        ('Snooker', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/snooker/rss.xml'),
        ('Horse Racing', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/horse_racing/rss.xml'),
        ('Cycling', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/cycling/rss.xml'),
        ('Disability Sport', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/disability_sport/rss.xml'),
        ('Other Sport', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/rss.xml'),
        ('Olympics 2012', 'http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/olympics/london_2012/rss.xml'),
    ]
PK�Xq$�XX
bbc_uk.png�PNG


IHDR7���IDATx�c����y�&2$�I^�X
��-�_w�IEND�B`�PK�X7�rr
bbc_uk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class BBC(BasicNewsRecipe):
    title = u'BBC Ukrainian'
    description = u'BBC News \u0423\u043A\u0440\u0430\u0457\u043D\u0430'
    __author__ = 'bugmen00t'
    publication_type = 'newspaper'
    oldest_article = 14
    max_articles_per_feed = 50
    language = 'uk'
    cover_url = 'https://news.files.bbci.co.uk/ws/img/logos/og/ukrainian.png'
    auto_cleanup = True
    no_stylesheets = True

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='main', attrs={'aria-hidden': 'true'})

    remove_tags = [
        dict(name='section', attrs={'role': 'region'}),
        dict(name='footer'),
        dict(name='aside')
    ]

    feeds = [(
        u'\u041D\u043E\u0432\u0438\u043D\u0438 BBC',
        'https://feeds.bbci.co.uk/ukrainian/rss.xml'
    )]
PK�X��íeebbcvietnamese.png�PNG


IHDR  V%(tRNSv��8IDAT8�c�O0�*��(��1
F�� Q�C<�Y��IEND�B`�PK�XK�M�bbcvietnamese.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Huan Komrade T <huantnh at gmail.com>'
'''
bbc.co.uk
'''

from calibre.web.feeds.news import BasicNewsRecipe


class BBCVietnamese(BasicNewsRecipe):
    title = u'BBC Vietnamese'
    __author__ = 'Huan Komrade T'
    description = 'Vietnam news and current affairs from the British Broadcasting Corporation'
    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://www.bbc.co.uk/vietnamese/index.xml'),
        ('Vietnam', 'http://www.bbc.co.uk/vietnamese/vietnam/index.xml'),
        ('Business', 'http://www.bbc.co.uk/vietnamese/business/index.xml'),
        ('Culture', 'http://www.bbc.co.uk/vietnamese/culture/index.xml'),
        ('Football', 'http://www.bbc.co.uk/vietnamese/football/index.xml'),
        ('Forum', 'http://www.bbc.co.uk/vietnamese/forum/index.xml'),
        ('In Depth', 'http://www.bbc.co.uk/vietnamese/indepth/index.xml'),
    ]

    def print_version(self, url):
        return url.replace('http://www.bbc.co.uk/vietnamese/', 'http://www.bbc.co.uk/vietnamese/lg/')
PK�X�8Va��bellingcat_en.png�PNG


IHDR  V%(�IDAT8�c`t@n�R|���߄W��������ic��`d���l�A@��������>x�3����MƊ�}L���
����x�9����~�\�lom,
j�	�]�	����<0���T,
����)�Ա(P�=�H�G۱C��6.C��+%��`i��vݤi�����S���{�N�dfd17Xa�IEND�B`�PK�X��Y×�bellingcat_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Bellingcat(BasicNewsRecipe):
    title = 'Bellingcat'
    __author__ = 'bugmen00t'
    description = 'Bellingcat is an independent international collective of researchers, investigators and citizen journalists using open source and social media investigation to probe a variety of subjects – from Mexican drug lords and crimes against humanity, to tracking the use of chemical weapons and conflicts worldwide. With staff and contributors in more than 20 countries around the world, we operate in a unique field where advanced technology, forensic research, journalism, investigations, transparency and accountability come together.'  # noqa
    publisher = 'Stichting Bellingcat'
    category = 'blog'
    cover_url = u'https://www.bellingcat.com/app/uploads/2018/04/bellingcat_HP_logo_black.jpg'
    language = 'en'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 60
    max_articles_per_feed = 10

    remove_tags_before = dict(name='div', attrs={'class': 'container'})

    remove_tags_after = dict(name='div', attrs={'class': 'container'})

    remove_tags = [
        dict(name='div', attrs={'class': 'social social--share'}),
        dict(name='div', attrs={'class': 'singular__related'})
    ]

    feeds = [('Bellingcat', 'https://www.bellingcat.com/feed/')]
PK�X�8Va��bellingcat_es.png�PNG


IHDR  V%(�IDAT8�c`t@n�R|���߄W��������ic��`d���l�A@��������>x�3����MƊ�}L���
����x�9����~�\�lom,
j�	�]�	����<0���T,
����)�Ա(P�=�H�G۱C��6.C��+%��`i��vݤi�����S���{�N�dfd17Xa�IEND�B`�PK�X1�]l��bellingcat_es.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Bellingcat(BasicNewsRecipe):
    title = 'Bellingcat'
    __author__ = 'bugmen00t'
    description = 'Bellingcat es un colectivo internacional independiente de investigadores y periodistas ciudadanos que usan informaci\u00F3n de fuente abierta y redes sociales para investigar una gran variedad de temas, desde carteles de droga en M\u00E9xico y cr\u00EDmenes de lesa humanidad hasta el rastreo de armas qu\u00EDmicas en zonas de conflicto alrededor del mundo. Nosotros operamos en un campo \u00FAnico donde la tecnolog\u00EDa avanzada, las investigaciones forenses, el periodismo, y la transparencia y responsabilidad se unen.'  # noqa
    publisher = 'Stichting Bellingcat'
    category = 'blog'
    cover_url = u'https://www.bellingcat.com/app/uploads/2018/04/bellingcat_HP_logo_black.jpg'
    language = 'es'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 300
    max_articles_per_feed = 10

    remove_tags_before = dict(name='div', attrs={'class': 'container'})

    remove_tags_after = dict(name='div', attrs={'class': 'container'})

    remove_tags = [
        dict(name='div', attrs={'class': 'social social--share'}),
        dict(name='div', attrs={'class': 'singular__related'})
    ]

    feeds = [('Bellingcat', 'https://es.bellingcat.com/feed/')]
PK�X�8Va��bellingcat_fr.png�PNG


IHDR  V%(�IDAT8�c`t@n�R|���߄W��������ic��`d���l�A@��������>x�3����MƊ�}L���
����x�9����~�\�lom,
j�	�]�	����<0���T,
����)�Ա(P�=�H�G۱C��6.C��+%��`i��vݤi�����S���{�N�dfd17Xa�IEND�B`�PK�X5u���bellingcat_fr.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Bellingcat(BasicNewsRecipe):
    title = 'Bellingcat'
    __author__ = 'bugmen00t'
    description = 'Bellingcat est un groupe international ind\u00E9pendant de chercheurs, d\u0027enqu\u00EAteurs et de journalistes citoyens utilisant \u00E0 la fois: enqu\u00EAtes \u0027open source\u0027 et r\u00E9seaux sociaux, pour sonder une vari\u00E9t\u00E9 de sujets - trafiquants de drogue mexicains, crimes contre l\u0027humanit\u00E9, suivi de l\u0027utilisation d\u0027armes chimiques et conflits dans le monde entier. Nous op\u00E9rons dans un domaine unique dans lequel technologie de pointe, recherche m\u00E9dico-l\u00E9gale, journalisme, enqu\u00EAtes, transparence et responsabilit\u00E9 se rencontrent.'  # noqa
    publisher = 'Stichting Bellingcat'
    category = 'blog'
    cover_url = u'https://www.bellingcat.com/app/uploads/2018/04/bellingcat_HP_logo_black.jpg'
    language = 'fr'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 300
    max_articles_per_feed = 10

    remove_tags_before = dict(name='div', attrs={'class': 'container'})

    remove_tags_after = dict(name='div', attrs={'class': 'container'})

    remove_tags = [
        dict(name='div', attrs={'class': 'social social--share'}),
        dict(name='div', attrs={'class': 'singular__related'})
    ]

    feeds = [('Bellingcat', 'https://fr.bellingcat.com/feed/')]
PK�X�8Va��bellingcat_ru.png�PNG


IHDR  V%(�IDAT8�c`t@n�R|���߄W��������ic��`d���l�A@��������>x�3����MƊ�}L���
����x�9����~�\�lom,
j�	�]�	����<0���T,
����)�Ա(P�=�H�G۱C��6.C��+%��`i��vݤi�����S���{�N�dfd17Xa�IEND�B`�PK�XfV�iY
Y
bellingcat_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Bellingcat(BasicNewsRecipe):
    title = '\u0411\u0435\u043B\u043B\u0438\u043D\u0433\u043A\u044D\u0442 (bell\u00BFngcat)'
    __author__ = 'bugmen00t'
    description = 'Bellingcat \u2014 \u044D\u0442\u043E \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u0430\u044F \u043C\u0435\u0436\u0434\u0443\u043D\u0430\u0440\u043E\u0434\u043D\u0430\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0440\u0430\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u0438 \u0433\u0440\u0430\u0436\u0434\u0430\u043D\u0441\u043A\u0438\u0445 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438 \u0438 \u0441\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u0435\u0442\u0438 \u0434\u043B\u044F \u0440\u0430\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u0439 \u043D\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0442\u0435\u043C\u044B \u2014 \u043E\u0442 \u043C\u0435\u043A\u0441\u0438\u043A\u0430\u043D\u0441\u043A\u0438\u0445 \u043D\u0430\u0440\u043A\u043E\u043A\u0430\u0440\u0442\u0435\u043B\u0435\u0439 \u0438 \u043F\u0440\u0435\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0439 \u043F\u0440\u043E\u0442\u0438\u0432 \u0447\u0435\u043B\u043E\u0432\u0435\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u043E \u043E\u0442\u0441\u043B\u0435\u0436\u0438\u0432\u0430\u043D\u0438\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0445\u0438\u043C\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u043E\u0440\u0443\u0436\u0438\u044F \u0438 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u0432 \u043F\u043E \u0432\u0441\u0435\u043C\u0443 \u043C\u0438\u0440\u0443 \u2014 \u0441\u043E\u0447\u0435\u0442\u0430\u044F \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438, \u043A\u0440\u0438\u043C\u0438\u043D\u0430\u043B\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u044D\u043A\u0441\u043F\u0435\u0440\u0442\u0438\u0437\u044B, \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u0438\u043A\u0443, \u0440\u0430\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u044F \u0438 \u0431\u043E\u0440\u044C\u0431\u0443 \u0437\u0430 \u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C \u0438 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0441\u0442\u044C.'  # noqa
    publisher = 'Stichting Bellingcat'
    category = 'blog'
    cover_url = u'https://www.bellingcat.com/app/uploads/2018/04/bellingcat_HP_logo_black.jpg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 60
    max_articles_per_feed = 10

    remove_tags_before = dict(name='div', attrs={'class': 'container'})

    remove_tags_after = dict(name='div', attrs={'class': 'container'})

    remove_tags = [
        dict(name='div', attrs={'class': 'social social--share'}),
        dict(name='div', attrs={'class': 'singular__related'})
    ]

    feeds = [('Bellingcat', 'https://ru.bellingcat.com/feed/')]
PK�X�8Va��bellingcat_uk.png�PNG


IHDR  V%(�IDAT8�c`t@n�R|���߄W��������ic��`d���l�A@��������>x�3����MƊ�}L���
����x�9����~�\�lom,
j�	�]�	����<0���T,
����)�Ա(P�=�H�G۱C��6.C��+%��`i��vݤi�����S���{�N�dfd17Xa�IEND�B`�PK�Xē�	�
�
bellingcat_uk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Bellingcat(BasicNewsRecipe):
    title = '\u0411\u0435\u043B\u043B\u0456\u043D\u0433\u043A\u0435\u0442 (bell\u00BFngcat)'
    __author__ = 'bugmen00t'
    description = '\u0411\u0435\u043B\u043B\u0456\u043D\u0433\u043A\u0435\u0442 \u2014 \u043D\u0435\u0437\u0430\u043B\u0435\u0436\u043D\u0438\u0439 \u043C\u0456\u0436\u043D\u0430\u0440\u043E\u0434\u043D\u0438\u0439 \u043A\u043E\u043B\u0435\u043A\u0442\u0438\u0432 \u0434\u043E\u0441\u043B\u0456\u0434\u043D\u0438\u043A\u0456\u0432, \u0441\u043B\u0456\u0434\u0447\u0438\u0445 \u0456 \u0433\u0440\u043E\u043C\u0430\u0434\u044F\u043D\u0441\u044C\u043A\u0438\u0445 \u0436\u0443\u0440\u043D\u0430\u043B\u0456\u0441\u0442\u0456\u0432, \u044F\u043A\u0456 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u044E\u0442\u044C \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0456 \u0434\u0436\u0435\u0440\u0435\u043B\u0430 \u0442\u0430 \u0441\u043E\u0446\u0456\u0430\u043B\u044C\u043D\u0456 \u043C\u0435\u0440\u0435\u0436\u0456 \u0434\u043B\u044F \u0440\u043E\u0437\u0441\u043B\u0456\u0434\u0443\u0432\u0430\u043D\u043D\u044F \u0440\u0456\u0437\u043D\u043E\u043C\u0430\u043D\u0456\u0442\u043D\u0438\u0445 \u0442\u0435\u043C \u2014 \u0432\u0456\u0434 \u043C\u0435\u043A\u0441\u0438\u043A\u0430\u043D\u0441\u044C\u043A\u0438\u0445 \u043D\u0430\u0440\u043A\u043E\u0431\u0430\u0440\u043E\u043D\u0456\u0432 \u0456 \u0437\u043B\u043E\u0447\u0438\u043D\u0456\u0432 \u043F\u0440\u043E\u0442\u0438 \u043B\u044E\u0434\u0441\u0442\u0432\u0430, \u0434\u043E \u0432\u0456\u0434\u0441\u0442\u0435\u0436\u0435\u043D\u043D\u044F \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043D\u043D\u044F \u0445\u0456\u043C\u0456\u0447\u043D\u043E\u0457 \u0437\u0431\u0440\u043E\u0457 \u0442\u0430 \u043A\u043E\u043D\u0444\u043B\u0456\u043A\u0442\u0456\u0432 \u0443 \u0432\u0441\u044C\u043E\u043C\u0443 \u0441\u0432\u0456\u0442\u0456. \u041C\u0438 \u043F\u0440\u0430\u0446\u044E\u0454\u043C\u043E \u0432 \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0456\u0439 \u0441\u0444\u0435\u0440\u0456, \u0434\u0435 \u043F\u0435\u0440\u0435\u0434\u043E\u0432\u0456 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0456\u0457, \u0441\u0443\u0434\u043E\u0432\u043E-\u043C\u0435\u0434\u0438\u0447\u043D\u0456 \u0434\u043E\u0441\u043B\u0456\u0434\u0436\u0435\u043D\u043D\u044F, \u0436\u0443\u0440\u043D\u0430\u043B\u0456\u0441\u0442\u0438\u043A\u0430, \u0440\u043E\u0437\u0441\u043B\u0456\u0434\u0443\u0432\u0430\u043D\u043D\u044F, \u043F\u0440\u043E\u0437\u043E\u0440\u0456\u0441\u0442\u044C \u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0456\u0441\u0442\u044C \u043E\u0431\u2019\u0454\u0434\u043D\u0443\u044E\u0442\u044C\u0441\u044F.'  # noqa
    publisher = 'Stichting Bellingcat'
    category = 'blog'
    cover_url = u'https://www.bellingcat.com/app/uploads/2018/04/bellingcat_HP_logo_black.jpg'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 60
    max_articles_per_feed = 10

    remove_tags_before = dict(name='div', attrs={'class': 'container'})

    remove_tags_after = dict(name='div', attrs={'class': 'container'})

    remove_tags = [
        dict(name='div', attrs={'class': 'social social--share'}),
        dict(name='div', attrs={'class': 'singular__related'})
    ]

    feeds = [('Bellingcat', 'https://uk.bellingcat.com/feed/')]
PK�X~�#���benchmark_pl.png�PNG


IHDR��h6�IDATx�AʎQ��s�}�(���3�#K 0SJ*[P&�M,�T�ȐR*
�}�=G���4� �V@^�v�ڝ�w/2�E�ܶ-�Yt��Sp�T�.�`��أ�G��` �h�4���-H� E�a�1��������3��0�n��0��M��W�n����M$f�඀$V"�_,]���vM�H�g�ڮ�j��}1����g��?��s��OS�&��ۺD`y�5�m�ۜ���'����R�Ơ{[on�ݏ������CGV�����&)J[�v�Z��s�I�-�ZF��Ԉ�q4Z knXY����  ���BZ�-�TUŀ$�4�`H������ۓ��j:�f��������IEND�B`�PK�Xۢ��%
%
benchmark_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re
from calibre.ebooks.BeautifulSoup import Comment


class BenchmarkPl(BasicNewsRecipe):
    title = u'Benchmark.pl'
    __author__ = 'fenuks'
    description = u'benchmark.pl, recenzje i testy sprzętu, aktualności, rankingi, sterowniki, porady, opinie'
    masthead_url = 'http://www.benchmark.pl/i/logo-footer.png'
    cover_url = 'http://www.benchmark.pl/i/logo-dark.png'
    category = 'IT'
    language = 'pl'
    oldest_article = 8
    max_articles_per_feed = 100
    extra_css = 'ul {list-style-type: none;}'
    no_stylesheets = True
    use_embedded_content = False
    preprocess_regexps = [(re.compile(u'<h3><span style="font-size: small;">&nbsp;Zobacz poprzednie <a href="http://www.benchmark.pl/news/zestawienie/grupa_id/135">Opinie dnia:</a></span>.*</body>',  # noqa
        re.DOTALL | re.IGNORECASE), lambda match: '</body>'), (re.compile(u'Więcej o .*?</ul>', re.DOTALL | re.IGNORECASE), lambda match: '')]  # noqa

    keep_only_tags = [dict(id=['articleHeader', 'articleGallery']), dict(
        name='div', attrs={'class': ['m_zwykly', 'gallery']}), dict(id='article')]
    remove_tags_after = dict(id='article')
    remove_tags = [dict(name='div', attrs={'class': ['comments', 'body', 'kategoria', 'socialize', 'thumb', 'panelOcenaObserwowane', 'categoryNextToSocializeGallery', 'breadcrumb', 'footer', 'moreTopics']}), dict(name='table', attrs={ 'background': 'http://www.benchmark.pl/uploads/backend_img/a/fotki_newsy/opinie_dnia/bg.png'}), dict(name='table', attrs={'width': '210', 'cellspacing': '1', 'cellpadding': '4', 'border': '0', 'align': 'right'})]  # noqa

    INDEX = 'http://www.benchmark.pl'
    feeds = [(u'Aktualności', u'http://www.benchmark.pl/rss/aktualnosci-pliki.xml'),
             (u'Testy i recenzje', u'http://www.benchmark.pl/rss/testy-recenzje-minirecenzje.xml')]

    def append_page(self, soup, appendtag):
        nexturl = soup.find(attrs={'class': 'next'})
        while nexturl:
            soup2 = self.index_to_soup(nexturl['href'])
            nexturl = soup2.find(attrs={'class': 'next'})
            pagetext = soup2.find(name='div', attrs={'class': 'body'})
            tag = appendtag.find('div', attrs={'class': 'k_ster'})
            if tag:
                tag.extract()
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
        if appendtag.find('div', attrs={'class': 'k_ster'}):
            appendtag.find('div', attrs={'class': 'k_ster'}).extract()
        for r in appendtag.findAll(attrs={'class': 'changePage'}):
            r.extract()

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        for a in soup.findAll('a', href=True):
            if not a['href'].startswith('http'):
                a['href'] = self.INDEX + a['href']
        for r in soup.findAll(attrs={'class': ['comments', 'body']}):
            r.extract()
        tag1 = soup.find(attrs={'class': 'inlineGallery'})
        if tag1:
            for tag in tag1.findAll('li'):
                tag['style'] = 'float: left; margin-right: 10px;'
            tag1.findNext('p')['style'] = 'clear: both;'
        return soup
PK�X�;���
�
beppe_grillo.png�PNG


IHDR  ��tRNSn��	pHYs��
nIDATHKUVipg�{W+�JZ�m[�[���-I��+P
c���!���U`��L�����3W[���iz�MZ'i�ԱQ�c˖%[�u��]�|JJ[>�ήfg�{��y��Mӄ>�.�{����ͱE"��,Aᇧ����x<62_Y2M�M���^�6���\.Nj�X*x��j��S���@QGO�<	��U���W���������gw��yW��Y���*����9�\��i�*�"��M�: ȨV��\��t�� ��0A���o�>���޾�(m�z��7��a�Ñ�d/�^z�#�&��i��B���b�����Tj-I�X�BQH���|�%8���1�y�f��r�ɍ�MY��++�`�ɹϜ~����a8m�W�W�ទ��ϟ�d$Ir{�%Y�Ln��.��
>t��gN|�s�Aq����c�4��cS]����A���7Z�ޟ�x�^x��uuu�77��J������Nbg;�b�zP���tOo���i�dI��`�n�A\ICa+M�S�������h4[$��a�F���w�zkgk%pE�6o��R1OQ�����"(`��/�s�n���t������7�_����bn`��@O7h�����s�OO|�`l��`�a�K+q�R����+�����5ju6���&�W��ǬV[��
�#࡝`?��Mm�vR^�kxtT�LYW�ǏXX��::Xkn��뙌����ܣ�n2�*�*����NF�����}��+�ꡩ)�7T�0���8�!H�2��&�9v�І"����LC�	��h�?8q��ˉ]G�`�{E_Z\~�3��������0������w�-.^�-����Bi��#l������~�IC�[�j���h)�i)�o��H&��_�����c~ꅿ�2Y����ñ��{�V���hcخH�G�A��h$�X���iO�� �����x�z 6$���^���;VU0�/��{jce9Η���X���!U#-��iO
�/A MV�V��c���m��k����݆���Ĥ?�d88���n,������NZ+dX�04mm+U�Ta�B�qQ�u�@����Ύ J

�HBU�Ԁ�&NZL�I_��^�r�_g�M�ў~��@ɖ������ss�-��bA�{ �	y+{�`O�f"�ε%�����x��"n�lB�jt����H$LZh����o'���}|b���0�Kg�[�����b�����ѠK;2>1=�O�-,bu�bji�)��cPUZΖ��9�s���SJ����A���-v��
�8��KN��Y|��A[�	Zv�®���p�7�q��J��SG�h"q�P(�l�TC0�T1��+7i+��H���G:�=�}�
@��?���/��O��uC����/O�E�V-7���)�m.�)�*��� 丄wꚆ9��ȕ\�D
�%�M����_�o�r�E� ��}����޳?	�g^���k�6�ף	���L$j��b�x��j)����f�A�j�PMCu�Y�I��!���)���vws��<����x����((�Y!��Զ�1�H��fS��+�PL�gw�@]�(I𙭛��v�jIn�)���]���,�������9�� h!���eh��,,M�n���f
�t{	���U�	9�����k|r�u8>��Or�{=^A�$�#㸰�]�V20����{�D���J^������-6�����������A"PH@j{���o�H
N3�ȄUi����
J���|1[��C�9���ӖiH!������e�j�z�Y���/
�?��q�I�v�K�L�
�V��Fmg��^*e��X��tNj�k��*Vq�� �n6 ���]|8r��`��O+h�ol��7��A��:���/]�F��z��f�̦R���H�j��B��$����`�N�j��*�(�=���L�{��}P�'
����?���8����3�~\W剱!3NV$'m��}�t��Đ�C��-
�m�~�X[ws6�����CS���	�
��u(𰳳�ʩr����n���W�ֶj�R0x��[��;8%�+@�o�Jt63+7�7��Sӏ�<54<
�e��?�)>w��u}nnnaqh���Kl8�o>Y��o�U3lv�@ٜ�`j;�L$��\�Ov����݋k�R����n��8�A���n��� A����z��d2Y����V�bt���w�ܾ��7Ϝ]���vSOM�;��Q���.�o�=�
kw��8߅$(��5o݊��\�Bv���lk�����nR4�]���X�^InoU����mg��hf���A�Z�d�zq�bE�Tiw/�������l��ׯ_�$����J[�BR�����{n#s��톬�Z(�୓sx=��Ǻ|�)�*8*�����Wӂ
C��SQ�Tz�$�7�ʲF��\<σ3����.�ki�Ix�$����勛��{� ����{ �ْ����m�F�&�q������X�^�J��3�������Sy��ʨ�T�ɰ���+�Q1�ɦv�|K��b(h�y�'F�����\.��Ng �/�ꆘw���IEND�B`�PK�Xc҅���beppe_grillo.recipe__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1327747616(BasicNewsRecipe):
    title = u'Beppe Grillo'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Beppe Grillo', u'http://feeds.feedburner.com/beppegrillo/atom')]
    description = 'Blog of the famous comedian and politician Beppe Grillo - v1.00 (28, January 2012)'
    __author__ = 'faber1971'

    language = 'it'
PK�XQ$M0~~berliner_zeitung.png�PNG


IHDR  D���uPLTELiq8"�&tRNS��2��*Xu!i�F��&���a�
���P����9���IDATx^u�뒣 `E@T��{��d�T9�K�O�S���l��L��}��=��"��0��B�eQ�l�.�H1��]aU�H�bx�͊�a}��Ȩs�-�"�Z�����N�u���*�Q��o�S��kz����X�}V��6q�����Q��"ۛ��G$� �.`{�1���X�s�7����&=��<h���8�&��YA��8��h�Vmf�!Ic0>sZE@�b�����$�L��a(��}B����8�O��@��tu��=�*|wz>�S��A��l�Tw�
����#'�����!f�̃�w9�c��O���z�p�������Ĝ��SY#�������]�vR��Ϭ��4�p�d2�g,ߋ���?�1vq_ZxIEND�B`�PK�X���`rrberliner_zeitung.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)})


class BerlinerZeitung(BasicNewsRecipe):
    title = 'Berliner Zeitung'
    __author__ = 'Kovid Goyal'
    language = 'de'
    description = 'Berliner Zeitung RSS'
    timefmt = ' [%d.%m.%Y]'
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True

    # oldest_article = 7.0
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    publication_type = 'newspaper'

    keep_only_tags = [
        classes('dm_article_body dm_article_header'),
    ]
    remove_tags = [
        classes('dm_article_share'),
    ]

    feeds = [x.split() for x in [
        'Berlin http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23699382-asYahooFeed.xml',
        'Brandenburg http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23699570-asYahooFeed.xml',
        'Politik http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23699614-asYahooFeed.xml',
        'Wirtschaft http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23699644-asYahooFeed.xml',
        'Sport http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23699874-asYahooFeed.xml',
        'Kultur http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23700020-asYahooFeed.xml',
        'Panorama http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23700178-asYahooFeed.xml',
        'Wissen http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23700222-asYahooFeed.xml',
        'Digital http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23700594-asYahooFeed.xml',
        'Ratgeber http://www.berliner-zeitung.de/blueprint/servlet/xml/berliner-zeitung/23700190-asYahooFeed.xml',
    ]]
PK�X�"н�berlingske_dk.png�PNG


IHDR��h6�IDATxڕP-s�P�_PQQQ��P��@DTD �@D �@ �x�@D ��'Q��6o��i3�`vn��v�Z:�@K;�	-*�J��v������.��s�uۏ�xy�0�>fM;�+���On*���l�'^�uۋ~�z��in�*��ˆ
ؤ���A�@F�C�,�.�}�ÖUN�0˗���J��>P4-t 7�����a*Ⰲ��� #�H'8lXm�X�"̭��ɞ�W�D8N���ȭ�p/_B��s��u2�Z��vmE8�w���:�0�Ey�vu�%G��g�&V:�.��!G�.� Enc�s�Z@�y)��ӽb���WСNUW���Z�B�##���3�ۘ�D�
����Ġ&:�VIEND�B`�PK�X�>�L��berlingske_dk.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
berlingske.dk
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Berlingske_dk(BasicNewsRecipe):
    title = 'Berlingske Tidende'
    __author__ = 'Darko Miletic'
    description = 'News from Denmark'
    publisher = 'berlingske.dk'
    category = 'news, politics, Denmark'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    use_embedded_content = False
    remove_javascript = True
    publication_type = 'newspaper'
    encoding = 'utf8'
    language = 'da'
    auto_cleanup = True
    extra_css             = '''
                            .manchet {color:#888888;}
                            .dateline {font-size: x-small; color:#444444;}
                            .manchet,.dateline { font-family: Cambria,Georgia,Times,"Times New Roman",serif }
                            .body {font-family: Arial,Helvetica,sans-serif }
                            '''

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [

    (u'Breaking news', u'http://www.b.dk/breaking/rss'),
    (u'Seneste nyt', u'http://www.b.dk/seneste/rss'),
    (u'Topnyheder', u'http://www.b.dk/top/rss'),
    (u'Danmark', u'http://www.b.dk/danmark/seneste/rss'),
    (u'Verden', u'http://www.b.dk/verden/seneste/rss'),
    (u'Klima', u'http://www.b.dk/klima/seneste/rss'),
    (u'Debat', u'http://www.b.dk/debat/seneste/rss'),
    (u'Koebenhavn', u'http://www.b.dk/koebenhavn/seneste/rss'),
    (u'Politik', u'http://www.b.dk/politik/seneste/rss'),
    (u'Kultur', u'http://www.b.dk/kultur/seneste/rss')
    ]
PK�X΅A��
berria.png�PNG


IHDR  szz��IDATxڭ�c�i�c�sm��۶m۶m۶��m��t��z.��{OՓ���8����w��Eɻ�!Y@��k�9C֐��SR���B��O.��������#��&���'�h�՚��O�M�%
B�HJ�M\�L�Wm�~�6�����s%������v'T9D����]zr_&n=��$B�UL*��o6+�?��T�|��<��\|c<
O�P�9�q$0�@��r=>�����.�Ҷ��I`���vĥd�[@�l��<ylF��߯�b=j4[���?�j�,�N��
T�$�v�^�;�0�u��مZ�eT%6��K�k�’����8z+ٹ�#9=[+џ��C�&kU�H5x��
d��!7?�"53-g��ޡ"�F((G%~�5�;}{E`��$.<�Fm�/�]8iV ��a����<�n���I����<�����"���g�jϸB�U��x
�_��oGHl,c���3�bE��'���<��b����cx������f�R ��( ������˷*YNQG]3\ֺ* /��vi%h��Q)�@�/�P��* m��޻��fd�Wѩ�
����! �89�����;�CD�"	1��-, �����Zy��w ���`���<W/�Ac}Wd)���q�A�n�2Nú$QE@��i�oɕ���ǽv��eL�~�^�'�Y�ʹ�W��X~�1~���0��W��6�
����Ʊ|�]�`��W\Vl��HR��N�A��*�&�����Y�wg����t;��<XF|�}���I�(�.����3Iճ�����]�b�����3D�_{�)>�ˏ=��,"!]���/�1i�m��kX�e�����Ҝ�S�T�H�ב�[+�4��|��V-QU�bu�k~�KgD���d=���gi0u��8�����w��k�6d7�E^�XG�����I�����Cݽ"�IEND�B`�PK�X��~�
biamag.png�PNG


IHDR22)�x��PLTE���# ����"������΁$ !����!��6��#��� ��Z&"#�Ї��������Y��y/+,!956)&'FBCLII��&+'(ROP��'��.��.TQR��<��=��Idbb��H{xy}}����~������������������������������������kIDATx^��׎!��LI�u{�����<J�����wdB���m���8�-�%#,׎�	����Z!�������C�Տu�F%|��Y��F.@
�jol$U�k"� �2���5Z���YQ7z�9����d�\#�1L��O!���(I!MI!�tR��oI�9�daɞ��JB'{Mx��e���j� 8��Jڡ1[D��i��̳W���?��SA��쀚�
�**0�/��>������`�]�W`Y�`\Id�����Xg��Q5m��o���.J�
�IEND�B`�PK�X�H���
biamag.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
bianet.com.tr
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Radikal_tr(BasicNewsRecipe):
    title = 'BiaMag'
    __author__ = 'Osman Kaysan'
    description = 'Independent News from Turkey'
    publisher = 'BiaMag'
    category = 'news, politics, Turkey'
    oldest_article = 15
    max_articles_per_feed = 120
    masthead_url = 'http://bianet.org/images/biamag_logo.gif'
    language = 'tr'
    no_stylesheets = True

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True, 'remove_paragraph_spacing': True,
    }

    remove_tags_before = dict(name='div', attrs={'class': 'manset'})
    remove_tags = [dict(name='ul', attrs={'class': ['altul']}), dict(name='div', attrs={'id': ['habermenu']}), dict(
        name='div', attrs={'class': ['mail']}), dict(name='div', attrs={'class': ['from']})]
    remove_tags_after = dict(name='div', attrs={'id': 'habermenu'})

    feeds = [(u'BiaMag', u'http://www.bianet.org/biamag.rss')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X��~�
biamag_en.png�PNG


IHDR22)�x��PLTE���# ����"������΁$ !����!��6��#��� ��Z&"#�Ї��������Y��y/+,!956)&'FBCLII��&+'(ROP��'��.��.TQR��<��=��Idbb��H{xy}}����~������������������������������������kIDATx^��׎!��LI�u{�����<J�����wdB���m���8�-�%#,׎�	����Z!�������C�Տu�F%|��Y��F.@
�jol$U�k"� �2���5Z���YQ7z�9����d�\#�1L��O!���(I!MI!�tR��oI�9�daɞ��JB'{Mx��e���j� 8��Jڡ1[D��i��̳W���?��SA��쀚�
�**0�/��>������`�]�W`Y�`\Id�����Xg��Q5m��o���.J�
�IEND�B`�PK�X^#(��biamag_en.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
bianet.com.tr
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Radikal_tr(BasicNewsRecipe):
    title = 'Bianet-English'
    __author__ = 'Osman Kaysan'
    description = 'Independent News Network from Turkey(English)'
    publisher = 'Bianet'
    category = 'news, politics, Turkey'
    oldest_article = 7
    max_articles_per_feed = 150
    masthead_url = 'http://bianet.org/images/english_logo.gif'
    language = 'en_TR'
    no_stylesheets = True

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True, 'remove_paragraph_spacing': True,
    }

    remove_tags_before = dict(name='div', attrs={'class': 'manset'})
    remove_tags = [dict(name='ul', attrs={'class': ['altul']}), dict(name='div', attrs={'id': ['habermenu']}), dict(
        name='div', attrs={'class': ['mail']}), dict(name='div', attrs={'class': ['from']})]
    remove_tags_after = dict(name='div', attrs={'id': 'habermenu'})

    feeds = [(u'Bianet-English', u'http://www.bianet.org/english.rss')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X��~�
bianet.png�PNG


IHDR22)�x��PLTE���# ����"������΁$ !����!��6��#��� ��Z&"#�Ї��������Y��y/+,!956)&'FBCLII��&+'(ROP��'��.��.TQR��<��=��Idbb��H{xy}}����~������������������������������������kIDATx^��׎!��LI�u{�����<J�����wdB���m���8�-�%#,׎�	����Z!�������C�Տu�F%|��Y��F.@
�jol$U�k"� �2���5Z���YQ7z�9����d�\#�1L��O!���(I!MI!�tR��oI�9�daɞ��JB'{Mx��e���j� 8��Jڡ1[D��i��̳W���?��SA��쀚�
�**0�/��>������`�]�W`Y�`\Id�����Xg��Q5m��o���.J�
�IEND�B`�PK�X5��
bianet.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
bianet.com.tr
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Radikal_tr(BasicNewsRecipe):
    title = 'Bianet'
    __author__ = 'Osman Kaysan'
    description = 'Independent News from Turkey'
    publisher = 'Bianet'
    category = 'news, politics, Turkey'
    oldest_article = 7
    max_articles_per_feed = 120
    masthead_url = 'http://bianet.org/images/bianet_logo.gif'
    language = 'tr'
    no_stylesheets = True

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True, 'remove_paragraph_spacing': True,
    }

    remove_tags_before = dict(name='div', attrs={'class': 'manset'})
    remove_tags = [dict(name='ul', attrs={'class': ['altul']}), dict(name='div', attrs={'id': ['habermenu']}), dict(
        name='div', attrs={'class': ['mail']}), dict(name='div', attrs={'class': ['from']})]
    remove_tags_after = dict(name='div', attrs={'id': 'habermenu'})

    feeds = [(u'Bianet', u'http://bianet.org/bianet.rss')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XFP�-��big_oven.png�PNG


IHDR  szz��IDATxڽV�#I��\۶m۶�۶m۶���b;ݹ���ӻ��A�9��$�[�޻U�-��3�9�v�%N#�m)j�CD8U$@#�8��	Ћ�YƏ���/P~�	�����!�v-j:t@u�6/\�z9�Ê@���G�ړO.��C|���E"p����t��
�6m�����c�![]-��H@>����y�r�z�ȅB0�z�}�sh�8�5
J�F����i9��˅�t����z��S)������:UN@-�c=x�ܷW/��O�PG���	��ܹ~_|��t�s�ݯR���U�
�"�w��sƗ����=ZN�y(Z|��7r��f}�I(M���~��-�@�|�?�|��;n�
I�fd�dw=�lO<��z����y��
��#�9s����|���n�!��G����o����iE�RNXA+�^�*Y�ڲ%�s�rTD��_��=Pݩ�˖��\0ǫ�r��͚��uk�"W���djj`���n#C:���;��g�5���J�}_�gk�	��(������'�`;'!|�Х&' �ng0
�� �Ŵ��k�V��R_9'��4���~��������P�]�.����z����[1ٶڸ�!�X��WI+^���H�/�7a؊W�Ď;�V��r�;r���W~(�r��N��'�[19�ڢE�����gC�/C��(�l�=��n�Zu���ej�^�����`�Y~'xG����,۷˗����S�B��/��c�@O&�V�;�K�����QʈP!+Έl&�h�o���s���d�kDn%��V�z|���{��v�
������'��Xծ�)��w�wϴ?���+�r�y��o-��8��{�OL����VL�)�"�n��Xa![�o)n���j e	��IEND�B`�PK�X�I500big_oven.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class BigOven(BasicNewsRecipe):
    title = 'BigOven'
    __author__ = 'Starson17'
    description = 'Recipes for the Foodie in us all. Registration is free. A fake username and password just gives smaller photos.'
    language = 'en'
    category = 'news, food, recipes, gourmet'
    publisher = 'Starson17'
    use_embedded_content = False
    no_stylesheets = True
    oldest_article = 24
    remove_javascript = True
    remove_empty_feeds = True
    cover_url = 'http://www.software.com/images/products/BigOven%20Logo_177_216.JPG'
    max_articles_per_feed = 30
    needs_subscription = True

    conversion_options = {'linearize_tables': True, 'comment': description, 'tags': category, 'publisher': publisher, 'language': language
                          }

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('http://www.bigoven.com/account/login?ReturnUrl=/')
            br.select_form(nr=1)
            br['Email'] = self.username
            br['Password'] = self.password
            br.submit()
        return br

    remove_attributes = ['style', 'font']

    def get_article_url(self, article):
        url = article.get('feedburner_origlink', article.get('link', None))
        front, middle, end = url.partition('comhttp//www.bigoven.com')
        url = front + 'com' + end
        return url

    keep_only_tags = [dict(name='div', attrs={'id': ['nosidebar_main']})]

    remove_tags_after = [dict(name='div', attrs={'class': ['display-field']})]

    remove_tags = [dict(name='ul', attrs={'class': ['tabs']})]

    preprocess_regexps = [
        (re.compile(r'Want detailed nutrition information?', re.DOTALL), lambda match: ''),
        (re.compile(r'\(You could win \$100 in our ', re.DOTALL), lambda match: ''),
    ]

    def preprocess_html(self, soup):
        for tag in soup.findAll(name='a', text=re.compile(r'.*View Metric.*', re.DOTALL)):
            tag.parent.parent.extract()
        for tag in soup.findAll(text=re.compile(r'.*Try BigOven Pro for Free.*', re.DOTALL)):
            tag.extract()
        for tag in soup.findAll(text=re.compile(r'.*Add my photo of this recipe.*', re.DOTALL)):
            tag.parent.extract()
        for tag in soup.findAll(name='a', text=re.compile(r'.*photo contest.*', re.DOTALL)):
            tag.parent.extract()
        for tag in soup.findAll(name='a', text='Remove ads'):
            tag.parent.parent.extract()
        for tag in soup.findAll(name='ol', attrs={'class': ['recipe-tags']}):
            tag.parent.extract()
        return soup

    feeds = [(u'Recent Raves', u'http://www.bigoven.com/rss/recentraves'),
             (u'Recipe Of The Day', u'http://feeds.feedburner.com/bigovencom-RecipeOfTheDay')]
PK�X�E�rrbig_picture.png�PNG


IHDR��h69IDAT(S}R=o�@�/;.nBK�"iغ4*SU1"�@#	)Hl#*�?B��R�Xt��cKQ�HULp�Ͼ�M���d��<��<�C�t!�1F� �ɰhUY(���8�R��r�U���q�ؖRb�0���_���Ҝ5c|�bp��R���h�y��¹�z��ť[K�non~q��,{<�������}y���ϓЀrwdٽ�;���C�Lǃ���1&a���R��m;���%��)��*�CF11�9\P0RR%gg4��0=��0#c��w�.݉�B���B)�d���10(�R(`k�q�o����z�?|��s��
\7��%��|�R�V+�K��
���x�������
0���<O�R�F�Q(����r����$(�� `�Z��}?�>�Q�W!�cT�ZH6M���v:xf�f��U� �����鹣���K�v�^��C�p��g���oL����>~����^o�~�Ղ+�f��d2�H@��˕Օ�_��j�:��?6oJ�@:�63NrdF�~L&�\*�S���1�'lIEND�B`�PK�X��:2��big_picture.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class BigPicture(BasicNewsRecipe):
    title = u'The Big Picture'
    __author__ = 'Welovelucy'
    description = ('Macro perspective on capital markets, economy, technology'
                   ' and digital media')
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100

    feeds = [(u'Big Picture', u'http://feeds.feedburner.com/TheBigPicture')]
PK�X,055biggovernment.png�PNG


IHDR ˞n��IDATx�b �VT�^O��6{�{2q>۶m۶m۶m۶m�mq���\�z�o�O2����jY��x����y��9�e�"̈-�w��OS�L=���'�ͼf9�7�X����$���(~�x�f:@�Ҿ|Oc�"���JĜ!�NJ�Z㿊Ws}�Ei��s;r9���h!f��kdB��L_bF3�s!;�,EB2�Пvb�k�P2@J�%3�s/�(�(��+;�&s����fb�ԕ
�/3�r�6�b>����<�I,D`Mޠ����ʲBj�AL&r#E+�*��D�&�43��X���@L��������d�Y��9�3��2���
�b�2���c7
��״�KL�r����r�n�͘�r��%u,���F�vj�
Nͤ��6��;�����y��#>���$*X�مgК�������i �ĝT�,�Sϡ��|6��c~���lK?b2�E)������$;3�Q@`}^�s>M>�����SԲ
���,OYHIޠ���"p
�@Eeiϩ p=��|,�;�d�S��^���X�%p��	�$�r%sQr%�P�a��-�X�7��P֚���G3�I�C`z26`O���$�<� �����dKOU\M=�c.�#8����&mP� ��\,«�I�=ILz�aj2�d~����ќB`!��,NLN�xV&�Dz�\N�v>e��B�\�������¶��*G�z��߮�R��Kq
w���lI`�%��q�QI��}�a�	\Ac��7��elFwb2��2ͺ72�X·��\��w�7Ʉ+d��Z������.��d.�.��a��4�!P�X�3��%OD+�:1��_8��I%��PF������Č1C���ؘ/���.d�a-�ac�~ar�8�QE( ?>����N=�������bF?.eΙ9���w3�6�L���f�nFiߍw�Dډ%43�>��*g�jVd>6�2~��ViJF�dz���=�����IEND�B`�PK�X��w|--biggovernment.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class BigGovernmentRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en'
    version = 1

    title = u'Big Government'
    publisher = u'Andrew Breitbart'
    category = u'Political blog'
    description = u'Political news from the USA'

    oldest_article = 30
    max_articles_per_feed = 100
    use_embedded_content = True

    feeds = [(u'Big Government', u'http://feeds.feedburner.com/breitbart')]

    conversion_options = {'comments': description, 'tags': category, 'language': 'en',
                          'publisher': publisher}

    extra_css = '''
                body{font-family:verdana,arial,helvetica,geneva,sans-serif;}
                img {float: left; margin-right: 0.5em;}
                '''
PK�X,055bighollywood.png�PNG


IHDR ˞n��IDATx�b �VT�^O��6{�{2q>۶m۶m۶m۶m�mq���\�z�o�O2����jY��x����y��9�e�"̈-�w��OS�L=���'�ͼf9�7�X����$���(~�x�f:@�Ҿ|Oc�"���JĜ!�NJ�Z㿊Ws}�Ei��s;r9���h!f��kdB��L_bF3�s!;�,EB2�Пvb�k�P2@J�%3�s/�(�(��+;�&s����fb�ԕ
�/3�r�6�b>����<�I,D`Mޠ����ʲBj�AL&r#E+�*��D�&�43��X���@L��������d�Y��9�3��2���
�b�2���c7
��״�KL�r����r�n�͘�r��%u,���F�vj�
Nͤ��6��;�����y��#>���$*X�مgК�������i �ĝT�,�Sϡ��|6��c~���lK?b2�E)������$;3�Q@`}^�s>M>�����SԲ
���,OYHIޠ���"p
�@Eeiϩ p=��|,�;�d�S��^���X�%p��	�$�r%sQr%�P�a��-�X�7��P֚���G3�I�C`z26`O���$�<� �����dKOU\M=�c.�#8����&mP� ��\,«�I�=ILz�aj2�d~����ќB`!��,NLN�xV&�Dz�\N�v>e��B�\�������¶��*G�z��߮�R��Kq
w���lI`�%��q�QI��}�a�	\Ac��7��elFwb2��2ͺ72�X·��\��w�7Ʉ+d��Z������.��d.�.��a��4�!P�X�3��%OD+�:1��_8��I%��PF������Č1C���ؘ/���.d�a-�ac�~ar�8�QE( ?>����N=�������bF?.eΙ9���w3�6�L���f�nFiߍw�Dډ%43�>��*g�jVd>6�2~��ViJF�dz���=�����IEND�B`�PK�X(���bighollywood.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
bighollywood.breitbart.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class BigHollywood(BasicNewsRecipe):
    title = 'Big Hollywood'
    __author__ = 'Darko Miletic'
    description = 'News and articles from the media world'
    publisher = 'Big Hollywood'
    category = 'news, media, art, literature, movies, politics, USA, Hollywood'
    oldest_article = 7
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'blog'
    extra_css             = """
                               body{font-family: Arial,sans-serif }
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [dict(attrs={'class': 'postcontent'})]
    remove_tags = [
        dict(name=['meta', 'link', 'link', 'iframe', 'embed', 'object']), dict(
            name='p', attrs={'class': ['post_meta_links', 'postfooter']})
    ]
    remove_attributes = ['original', 'onclick']

    feeds = [(u'Articles', u'http://bighollywood.breitbart.com/feed/')]

    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:
                    if limg['src'].endswith('BlogPrintButton.png'):
                        limg.extract()
                    item.name = 'div'
                    item.attrs = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�Xk��bild_de.png�PNG


IHDR�a�IDATxڝ�Mj�@D'7��0�������!)�4m��EU�ͳ�5�ߧ�{K_
�i+
�w�T8�9�w����[Y^��^w��Y��ѽ_���%L
d���>�
9��<N�~�Y�`P�Y��ѳ�@���%[�G��@����`��~�hN�zt?o�
5��=���*�*��t�H�
���#xWx$�V��3IEND�B`�PK�X=�SPZZbild_de.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function

'''
bild.de
'''

import re
from calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1303841067(BasicNewsRecipe):
    title = 'Bild.de'
    __author__ = 'schuster'
    description = 'RSS-Feeds von Bild.de'
    language = 'de'

    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    remove_empty_feeds = True

    masthead_url = 'http://a3.l3-images.myspacecdn.com/images02/56/0232f842170b4d349779f8379c27e073/l.jpg'

    # By default, no local news feeds will be fetched. To change this,
    # just uncomment the lines for the regions you are interested in.
    feeds = [
        ('Politik', 'http://www.bild.de/rss-feeds/rss-16725492,feed=politik.bild.html'),
        ('Unterhaltung', 'http://www.bild.de/rss-feeds/rss-16725492,feed=unterhaltung.bild.html'),
        ('Sport', 'http://www.bild.de/rss-feeds/rss-16725492,feed=sport.bild.html'),
        ('Lifestyle', 'http://www.bild.de/rss-feeds/rss-16725492,feed=lifestyle.bild.html'),
        ('Ratgeber', 'http://www.bild.de/rss-feeds/rss-16725492,feed=ratgeber.bild.html'),
        ('Auto', 'http://www.bild.de/rss-feeds/rss-16725492,feed=auto.bild.html'),
        ('Digital', 'http://www.bild.de/rss-feeds/rss-16725492,feed=digital.bild.html'),
        ('Spiele', 'http://www.bild.de/rss-feeds/rss-16725492,feed=spiele.bild.html'),
        ('Leserreporter', 'http://www.bild.de/rss-feeds/rss-16725492,feed=leserreporter.bild.html'),
        #        ('Berlin', 'http://www.bild.de/rss-feeds/rss-16725492,feed=Newsticker.bild.html'),
        #        ('Bremen', 'http://www.bild.de/rss-feeds/rss-16725492,feed=bremen.bild.html'),
        #        ('Chemnitz', 'http://www.bild.de/rssfeeds/rss3/rss3-20745882,feed=ressort-regio-chemnitz.bild.html'),
        #        ('Dresden', 'http://www.bild.de/rss-feeds/rss-16725492,feed=dresden.bild.html'),
        #        ('Düsseldorf', 'http://www.bild.de/rss-feeds/rss-16725492,feed=duesseldorf.bild.html'),
        #        ('Frankfurt/Main', 'http://www.bild.de/rss-feeds/rss-16725492,feed=regio-frankfurt.bild.html'),
        #        ('Hamburg', 'http://www.bild.de/rss-feeds/rss-16725492,feed=hamburg.bild.html'),
        #        ('Hannover', 'http://www.bild.de/rss-feeds/rss-16725492,feed=regio-hannover.bild.html'),
        #        ('Köln', 'http://www.bild.de/rss-feeds/rss-16725492,feed=regio-koeln.bild.html'),
        #        ('Leipzig', 'http://www.bild.de/rss-feeds/rss-16725492,feed=leipzig.bild.html'),
        #        ('München', 'http://www.bild.de/rss-feeds/rss-16725492,feed=muenchen.bild.html'),
        #        ('Ruhrgebiet', 'http://www.bild.de/rss-feeds/rss-16725492,feed=ruhrgebiet.bild.html'),
        #        ('Saarland', 'http://www.bild.de/rssfeeds/rss3/rss3-20745882,feed=regional-saarland.bild.html'),
        #        ('Stuttgart', 'http://www.bild.de/rss-feeds/rss-16725492,feed=regio-stuttgart.bild.html')
    ]

    keep_only_tags = [
        dict(name='article')
    ]

    remove_tags = [
        dict(name=['aside', 'iframe']),
        dict(
            attrs={'class': ['socialbar', 'social-sharing flank', 'vel', 'back']}),
        dict(name='img', attrs={'alt': 'logo'}),
        dict(name='div', attrs={'class': re.compile('infoEl')}),
        dict(name='span', attrs={'class': re.compile('loupe')})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'itemprop': re.compile('articleBody')})
    ]

    def preprocess_html(self, soup):
        # skip articles without relevant content
        if not soup.find('article'):
            self.abort_article()
        # remove all style attributes
        for item in soup.findAll(attrs={'style': True}):
            del item['style']
        # remove <br> within headlines
        for h1 in soup.findAll('h1'):
            for br in h1.findAll('br'):
                br.replaceWith(' ')
        # remove all links
        for a in soup.findAll('a'):
            a.replaceWith(a.renderContents().decode('utf-8'))
        return soup
PK�XP�v�billorielly.png�PNG


IHDR  �Tg�-PLTEtt�tt�tt�tt�tt�tt�tt�tt�tt�tt�tt�tt�tt�tt��tRNS @P`p��������sM�IDAT(�c`�XW-E���d>��w�C�L]+x������]a�
����{�V* Z���
b@Xサ
6�]D�H ��@ă!!��t���0�Ϡ�@�A�h��
��(l�
�{	rF��BIEND�B`�PK�X��v00billorielly.recipe#!/usr/bin/env python

# ebook-convert.exe c:\billorielly.recipe c:\test -vv

from calibre.web.feeds.recipes import BasicNewsRecipe


class BillOReilly(BasicNewsRecipe):
    cover_url = 'http://images.billoreilly.com/images/headers/borbanner.jpg'
    title = u"Bill O'Reilly"
    __author__ = 'Rob Lammert - rob.lammert[at]gmail.com'
    description = u"Articles from Bill O'Reilly's website and his Fox New's website"
    language = 'en'
    oldest_article = 7.0
    max_articles_per_feed = 100
    recursions = 0
    encoding = 'utf8'
    no_stylesheets = True
    remove_javascript = True

    def parse_index(self):
        feeds = []

        articles_shows = self.bo_parse_shows(
            'http://www.billoreilly.com/show?action=tvShowArchive')
        articles_columns = self.bo_parse_columns(
            'http://www.billoreilly.com/columns')

        if articles_shows:
            feeds.append(("O'Reilly Factor", articles_shows))

        if articles_columns:
            feeds.append(("Newspaper Column", articles_columns))

        return feeds

    def bo_parse_shows(self, url):
        soup = self.index_to_soup(url)
        links = soup.find(attrs={'class': 'showLinks'})

        current_articles = []
        counter = 0
        for lnk in links.findAllNext(attrs={'class': ['showLinks']}):
            if counter <= 5:
                title = self.tag_to_string(lnk)
                url = lnk.get('href', False)

                if not url or not title:
                    continue

                if url.startswith('/'):
                    url = 'http://www.billoreilly.com' + url + \
                        '&dest=/pg/jsp/community/tvshowprint.jsp'

                self.log('\t\tFound article:', title)
                self.log('\t\t\t', url)
                current_articles.append(
                    {'title': title, 'url': url, 'description': '', 'date': ''})
                counter += 1
        return current_articles

    def bo_parse_columns(self, url):
        soup = self.index_to_soup(url)
        links = soup.find(attrs={'id': 'bold'})

        current_articles = []
        counter = 0
        for lnk in links.findAllNext(attrs={'id': ['bold']}):
            test = lnk.get('class', False)
            if counter <= 5 and test == 'defaultLinks':
                title = self.tag_to_string(lnk)
                url = lnk.get('href', False)

                if not url or not title:
                    continue

                if url.startswith('/'):
                    url = 'http://www.billoreilly.com' + url + '&printerFriendly=true"'

                self.log('\t\tFound article:', title)
                self.log('\t\t\t', url)
                current_articles.append(
                    {'title': title, 'url': url, 'description': '', 'date': ''})
                counter += 1
        return current_articles
PK�X�0��birgun_gazetesi.png�PNG


IHDR  ��tRNSn��	pHYs��|IDATH�ݖM�S1��
\���p	�CHu�΅��;���p!�PЅ�"q=�@](~0TE�3+뛓��3-3��vcx�\�}��sN:���RJcԵ�����2�R�֘q�ɇ3:��ч�������*Ә@�CLT_O\��4Z�
�>�%#ħ������6����9�;����Ж�I�v�]�\�v�o\9��p�Ar	Y0(�c\G*[#��ȁZW��8|�>H(<�
w�;�V�y��e;�'BY	�+�LE1��<�a̞����8�ڝ����"��8�cP�z��z"&��.?��e
�|�s���ߕ̫.̢���4��0���n�~��Ӝ��Z:5/��g?S��ib�KH�.Ȫ���9���'֝�dB�+E|c� '+�Mx'Q}��cN_(�Pz:��w��@���Vz��,݂[Wy#��An	�	�A�sw ��9����*�R��>����%�.g�&B��ؘE��7�m��SK���3B���Xu��|�p�n؄��[�#��uRE�y���b�7�S�)�s�}?}�O.L�d
��Xvp(��5�T���x��f?��+��x4@31�Sz���w|@�
ŷ��Nw$S��ވ�ܦ��g�F��)+�IEND�B`�PK�X��5��birgun_gazetesi.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

from calibre.web.feeds.news import BasicNewsRecipe


class Birgun (BasicNewsRecipe):

    title = u'Birgün Gazetesi'
    __author__ = u'Osman Kaysan'
    oldest_article = 7
    max_articles_per_feed = 150
    use_embedded_content = False
    description = 'Birgun gazatesi haberleri, kose yazarlari'
    publisher = 'Birgün'
    category = 'news,haberler,turkce,gazete,birgun'
    language = 'tr'
    no_stylesheets = True
    publication_type = 'newspaper'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True, 'remove_paragraph_spacing': True,
    }

    cover_img_url = 'http://www.birgun.net/i/birgun.png'
    masthead_url = 'http://www.birgun.net/i/birgun.png'

    remove_attributes = ['width', 'height']

    remove_tags_before = dict(name='h2', attrs={'class': 'storyHeadline'})
    remove_tags_after = dict(name='tr', attrs={'valign': 'top'})
    remove_tags = [dict(name='div', attrs={'id': 'byLine'}), dict(name='div', attrs={'class': 'toollinks'}), dict(name='div', attrs={
        'class': 'main-lead'}), dict(name='div', attrs={'class': 'addthis_toolbox addthis_default_style'}), dict(name='a', attrs={'class': 'addthis_button'})]

    remove_empty_feeds = True

    feeds = [

    (u'Güncel', u'http://www.birgun.net/actuels.xml'),
    (u'Köşe Yazarları', u'http://www.birgun.net/writer.xml'),
    (u'Politika', u'http://www.birgun.net/politics.xml'),
    (u'Ekonomi', u'http://www.birgun.net/economic.xml'),
    (u'Çalışma Yaşamı', u'http://www.birgun.net/workers.xml'),
    (u'Dünya', u'http://www.birgun.net/worlds.xml'),
    (u'Yaşam', u'http://www.birgun.net/lifes.xml')
    ]
PK�X%W�ppbirmingham_evening_mail.png�PNG


IHDR  D����PLTE�&�������������������(��a��f��r��|��}�dž�Ɋ�ˎ��V�������������������������*���8��<��A��C�������٬�ϗ�գ�ե����I����������������$��IDATx���5Z�P��3ǯk�ݓ��h�����L�6��1����w]J��q�a�R��}m�3p>��g�;p�R��gY�����0P�OM�,K�v�8
\.�}���?�ڪ����݀׋�~>��"��O��c�DJ��`��~��4�
��(AIEND�B`�PK�X&�@|�
�
birmingham_evening_mail.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre import browser
import re


class AdvancedUserRecipe1306097511(BasicNewsRecipe):
    title = u'Birmingham Evening Mail'
    description = 'News for Birmingham UK'
    # timefmt = ''
    __author__ = 'Dave Asbury'
    # 1/5/14
    masthead_url = 'http://images.icnetwork.co.uk/upl/icbirmingham/apr2004/6/5/0007417F-982A-107F-969980BFB6FA0000.jpg'
    oldest_article = 2
    max_articles_per_feed = 10
    # linearize_tables = True
    remove_empty_feeds = True
    remove_javascript = True
    no_stylesheets = True
    remove_attributes = ['style']
    # auto_cleanup = True
    language = 'en_GB'
    compress_news_images = True
    compress_news_images_max_size = 30
    ignore_duplicate_articles = {'title', 'url'}

    remove_tags = [
        dict(attrs={'class': 'gallery-data'}),
        dict(attrs={'class': 'ir btn-fullscreen'}),
        dict(attrs={'class': 'tools clearfix'}),
        dict(attrs={'class': 'shareButtons'}),

    ]
    keep_only_tags = [
        dict(name='h1'),
        dict(attrs={'class': 'lead-text'}),
        # dict(attrs={'class' : 'styleGroup article-header'}),
        # dict(attrs={'class' : 'body '}),
        dict(attrs={'class': 'tmCol article'}), ]

    feeds = [
        (u'Local News', u'http://www.birminghammail.co.uk/news/local-news/rss.xml'),
        (u'UK News', u'http://www.birminghammail.co.uk/news/uk-news/rss.xml'),
        (u'Sport', u'http://www.birminghammail.co.uk/sport/rss.xml'),
        (u'Whats On', u'http://www.birminghammail.co.uk/whats-on/rss.xml'),
        (u'Lifestyle', u'http://www.birminghammail.co.uk/lifestyle/rss.xml'),
    ]
    extra_css = '''
        h1{font-weight:bold;}
        h2{font-weight:normal;font-size:75%;}
        figure {font-size:50%;}
        #body{font-size:14px;}
        #.photo-caption {display: block;margin-left: auto;margin-right: auto;width:100%;font-size:40%;}
        #.publish-info {font-size:50%;}
        img {display: block;margin-left: auto;margin-right: auto;width:100%;font-size:50%;}
    '''

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.birminghammail.co.uk')
        cov = soup.find(attrs={'src': re.compile(
            'http://images.icnetwork.co.uk/upl/birm')})
        cov = str(cov)
        cov2 = re.findall(
            r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', cov)

        cov = str(cov2)
        cov = cov[2:len(cov) - 2]

        cover_url = cov
        br = browser()
        br.set_handle_redirect(False)
        try:
            br.open_novisit(cov)
            cover_url = cov
        except:
            cover_url = 'http://s.birminghammail.co.uk/skins/birminghammail/gfx/follow-media.jpg'

        return cover_url
PK�X����&&birmingham_post.png�PNG


IHDR(-S,PLTE0v���B�B�=?B�B�A�	3x<~C�C�C�q�����������<~3x4y
6zC�8|C�?�@�%K�)N�2V�5X�6X�6Y�7Y�7Y�7Z�8Z�9[�@�q��r��A������‘��A���Ɩ�Ǘ�ǘ�ș��9|�����������9|e��:}=;}u��v��w��}��~��>�A�A�;}��œ�ē�Ŕ��:|@9\�Ab�Cc�Ee���Ȟ�̢�ά�Ӯ���������������Pn�Qo�Rp�Yv�]y�������������c~�T]��IDATx�u��C1D3ɳ�o۶mm���ڸ�C"�g��85y�;�.aB�	|����c�j�p*�`�����#Q_��Rz��ν���@Gm�9�Ĺ��7i�]V�羡�e<$�"��>�rGZE�&[�KJ��u/E:�),�	��5���e�M�\�_�3j����{�0vƇy��I9�8�')ضIEND�B`�PK�X	k���birmingham_post.recipefrom __future__ import print_function
from calibre.web.feeds.news import BasicNewsRecipe
import re
import mechanize


class AdvancedUserRecipe1306097511(BasicNewsRecipe):
    title = u'Birmingham post'
    description = 'Author D.Asbury. News for Birmingham UK'
    __author__ = 'Dave Asbury'
    cover_url = 'http://profile.ak.fbcdn.net/hprofile-ak-snc4/161987_9010212100_2035706408_n.jpg'
    oldest_article = 2
    max_articles_per_feed = 20
    linearize_tables = True
    remove_empty_feeds = True
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True
    language = 'en_GB'
    compress_news_images = True
    cover_url = 'http://profile.ak.fbcdn.net/hprofile-ak-snc4/161987_9010212100_2035706408_n.jpg'

    masthead_url = 'http://www.trinitymirror.com/images/birminghampost-logo.gif'

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.birminghampost.net')
        # look for the block containing the sun button and url
        cov = soup.find(attrs={'height': re.compile(
            '3'), 'alt': re.compile('Post')})
        print()
        print('%%%%%%%%%%%%%%%', cov)
        print()
        cov2 = str(cov['src'])
        print('88888888 ', cov2, ' 888888888888')

        # cover_url=cov2
        # return cover_url
        br = mechanize.Browser()
        br.set_handle_redirect(False)
        try:
            br.open_novisit(cov2)
            cover_url = cov2
        except:
            cover_url = 'http://profile.ak.fbcdn.net/hprofile-ak-snc4/161987_9010212100_2035706408_n.jpg'
        return cover_url

    feeds = [
        (u'West Mids. News',
         u'http://www.birminghampost.net/news/west-midlands-news/rss.xml'),
        (u'UK News', u'http://www.birminghampost.net/news/uk-news/rss.xml'),
        (u'Sports', u'http://www.birminghampost.net/midlands-birmingham-sport/rss.xml'),
        (u'Bloggs & Comments', u'http://www.birminghampost.net/comment/rss.xml')

    ]
PK�X�~7g��bitacora.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = '2010, Gustavo Azambuja <hola at gazambuja.com>'
'''
bitacora.com.uy
'''

from calibre.web.feeds.news import BasicNewsRecipe


class General(BasicNewsRecipe):
    title = 'bitacora.com.uy'
    __author__ = 'Gustavo Azambuja'
    description = 'Noticias de Uruguay'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 5
    encoding = 'iso-8859-1'
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 2
    max_articles_per_feed = 100
    keep_only_tags = [dict(id=['txt'])]
    remove_tags = [
        dict(name='div', attrs={'class': 'tablafoot'}),
        dict(name=['object', 'h4']),
        dict(name=['object', 'link'])
    ]

    remove_attributes = ['width', 'height', 'style', 'font', 'color']

    extra_css = '''
                h1{font-family:Geneva, Arial, Helvetica, sans-serif;color:#154B7A;}
                h3{font-size: 14px;color:#999999; font-family:Geneva, Arial, Helvetica, sans-serif;font-weight: bold;}
                h2{color:#666666; font-family:Geneva, Arial, Helvetica, sans-serif;font-size:small;}
                p {font-family:Arial,Helvetica,sans-serif;}
                '''
    feeds = [
        (u'Titulares', u'http://www.bitacora.com.uy/anxml.cgi?15')
    ]

    def get_cover_url(self):
        cover_url = None
        index = 'http://www.bitacora.com.uy'
        soup = self.index_to_soup(index)
        link_item = soup.find('img', attrs={'class': 'imgtapa'})
        if link_item:
            cover_url = "http://www.bitacora.com.uy/" + link_item['src']
        return cover_url

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X�biz_portal.png�PNG


IHDR  D����PLTE���(((���'''   %%%---���***���,,, ���"""""###%UUV			���������333''(??A������������((*556	  "YYY>>?�����������������������������		������[[\�����ޯ��TTU[[[KKL������===wwx���������###���--,���������//0������--/���ccd�����������ዋ����KKK���666jjk���������XXX���}}~���ZZ[EEE��������྾�002���<<<������335������99:777  QQQ���^^`�����==>''%llm^^^GGH������YYZ���ddeJJKRRR��ȷ��VVX���������lll������GGG��ƍ��]]^��������������̥�������ʏ��c�&OtRNS@��f�IDATxڌ��A@��{l�y��ۍm۶m�v~hF��}(�A�~:#�U�1C&E�\�kɿp��s2ȿ�'$�!��T��1��,N�<�*�Wق�
�ς���g��8����c�c-�� ���WVL1���g +�s<�oz�4OQ����[��xX75Êy�#������ͅGCT��<���q�c�Tdz@�T�3���`���BXպz�P:�$��H�7,[޻�[�Wָ�"���Hk��g`#�]��f��m)�wp,��]�=o� v���+�6�Tß�D9�=|��cݾp���S����T	g������վ`\E�zM �@�߸y˾���� ���Q������F��=H����1<��^1(�<{�����/AD|�1b��a�-h�w��[����O�����H�J,��̙^#hY�_�Z/	�%�2II婚`�!����D�e^VQ`�Ɵ��P��$��IEND�B`�PK�X,q����biz_portal.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1283848012(BasicNewsRecipe):
    description = 'This is a recipe of BizPortal.co.il.'
    cover_url = 'http://www.bizportal.co.il/shukhahon/images/bizportal.jpg'
    title = u'BizPortal'
    language = 'he'
    __author__ = 'marbs'
    extra_css = 'img {max-width:100%;} body{direction: rtl;},title{direction: rtl; } ,article_description{direction: rtl; }, a.article{direction: rtl; } ,calibre_feed_description{direction: rtl; }'  # noqa
    simultaneous_downloads = 5
    remove_javascript = True
    timefmt = '[%a, %d %b, %Y]'
    remove_empty_feeds = True
    oldest_article = 1
    max_articles_per_feed = 100
    remove_attributes = ['width']
    simultaneous_downloads = 5
    remove_tags = [dict(name='img', attrs={'scr': ['images/bizlogo_nl.gif']})]
    max_articles_per_feed = 100

    feeds = [(u'חדשות שוק ההון', u'http://www.bizportal.co.il/shukhahon/messRssUTF2.xml'),
             (u'חדשות וול סטריט בעברית',
              u'http://www.bizportal.co.il/shukhahon/images/bizportal.jpg'),
             (u'שיווק ופרסום', u'http://www.bizportal.co.il/shukhahon/messRssUTF145.xml'),
             (u'משפט', u'http://www.bizportal.co.il/shukhahon/messRssUTF3.xml'),
             (u'ניתוח טכני', u'http://www.bizportal.co.il/shukhahon/messRssUTF5.xml'),
             (u'דיני עבודה ושכר', u'http://www.bizportal.co.il/shukhahon/messRssUTF6.xml'),
             (u'מיסוי', u'http://www.bizportal.co.il/shukhahon/messRssUTF7.xml'),
             (u'טאבו', u'http://www.bizportal.co.il/shukhahon/messRssUTF8.xml'),
             (u'נדל"ן', u'http://www.bizportal.co.il/shukhahon/messRssUTF160.xml'),
             ]

    def print_version(self, url):
        split1 = url.split("=")
        print_url = 'http://www.bizportal.co.il/web/webnew/shukhahon/biznews02print.shtml?mid=' + \
            split1[1]
        return print_url
PK�X
B>	blesk.png�PNG


IHDR  D���3PLTE�$����������qv�8?������U[�*2����ci�GM���������Zbh��IDATx^��9�0E��5��O;� '|;r�W�x }��M�\l��B�;R�3_�M�
��b���!RWw/DlD-��!8����G|���C<��.@	�J�ӲuU�)��<D�xo��<�W��!'	�
�
��U������W�7�f��U0IEND�B`�PK�X��x�__blesk.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe
import re


class bleskRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Blesk'
    publisher = u''
    description = 'blesk.cz'
    oldest_article = 1
    max_articles_per_feed = 20
    use_embedded_content = False

    feeds = [
        (u'Zprávy', u'http://www.blesk.cz/rss/7'),
        (u'Blesk', u'http://www.blesk.cz/rss/1'),
        (u'Sex a tabu', u'http://www.blesk.cz/rss/2'),
        (u'Celebrity', u'http://www.blesk.cz/rss/5'),
        (u'Cestování', u'http://www.blesk.cz/rss/12')
    ]

    language = 'cs'
    cover_url = 'http://img.blesk.cz/images/blesk/blesk-logo.png'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                            """

    remove_attributes = []
    remove_tags_before = dict(name='div', attrs={'id': ['boxContent']})
    remove_tags_after = dict(name='div', attrs={'class': ['artAuthors']})
    remove_tags = [dict(name='div',   attrs={'class': ['link_clanek']}),
                   dict(name='div',   attrs={'id': ['partHeader']}),
                   dict(name='div',   attrs={'id': ['top_bottom_box', 'lista_top']})]
    preprocess_regexps = [(re.compile(r'<div class="(textovytip|related)".*',
                                      re.DOTALL | re.IGNORECASE), lambda match: '</body>')]

    keep_only_tags = [dict(name='div', attrs={'class': 'articleContent'})]

    visited_urls = {}

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        if url in self.visited_urls:
            self.log.debug('Ignoring duplicate: ' + url)
            return None
        else:
            self.visited_urls[url] = True
            self.log.debug('Accepting: ' + url)
            return url
PK�X�����blic.png�PNG


IHDR��h6uIDATx�c����놆{��#�2�b�,���(���{ ������W��_p������S�b�v�~��q��	���ҳ��@#!��޸y��E�Rw�5(��QQ��<IJ��nG'
w�# ���MM9��	�4#��	]�	�'��pw����Â�+Z���5���x�ۋ��s�AT�k���i�j��;wno۾b���T�b�p[F�
K�/���
�W�T�A�p��D}U��8��9��8~|�������pw�;p�޶��H�4q2
/SR�c��|	�ׇ+�&�۬�o���	b�������E�� �`Š��漚�IJ�"0�LMuvpH<��`	'o�ِ�
�����f�`IEND�B`�PK�X�X��blic.recipe
__license__ = 'GPL v3'
__copyright__ = '2008-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
blic.rs
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Blic(BasicNewsRecipe):
    title = 'Blic'
    __author__ = 'Darko Miletic'
    description = 'Blic.rs online verzija najtiraznije novine u Srbiji donosi najnovije vesti iz Srbije i sveta, komentare, politicke analize, poslovne i ekonomske vesti, vesti iz regiona, intervjue, informacije iz kulture, reportaze, pokriva sve sportske dogadjaje, detaljan tv program, nagradne igre, zabavu, fenomenalni Blic strip, dnevni horoskop, arhivu svih dogadjaja'  # noqa
    publisher = 'RINGIER d.o.o.'
    category = 'news, politics, Serbia'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    masthead_url = 'http://www.blic.rs/resources/images/header/header_back.png'
    language = 'sr'
    publication_type = 'newspaper'
    extra_css             = """
                               @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                               @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                               body{font-family: Georgia, serif1, serif}
                               .articledescription,#nadnaslov,.article_info{font-family: Arial, sans1, sans-serif}
                               .img_full{float: none}
                               #nadnaslov{font-size: small}
                               #article_lead{font-size: 1.5em}
                               h1{color: red}
                               .potpis{font-size: x-small; color: gray}
                               .article_info{font-size: small}
                               img{margin-bottom: 0.8em; margin-top: 0.8em; display: block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]
    remove_tags_before = dict(name='div', attrs={'id': 'article_info'})
    remove_tags = [
        dict(name=['object', 'link', 'meta', 'base', 'object', 'embed'])]
    remove_attributes = ['width', 'height', 'm_id',
                         'm_ext', 'mlg_id', 'poll_id', 'v_id']

    feeds = [

    (u'Politika', u'http://www.blic.rs/rss/Vesti/Politika'),
    (u'Tema Dana', u'http://www.blic.rs/rss/Vesti/Tema-Dana'),
    (u'Svet', u'http://www.blic.rs/rss/Vesti/Svet'),
    (u'Drustvo', u'http://www.blic.rs/rss/Vesti/Drustvo'),
    (u'Ekonomija', u'http://www.blic.rs/rss/Vesti/Ekonomija'),
    (u'Hronika', u'http://www.blic.rs/rss/Vesti/Hronika'),
    (u'Beograd', u'http://www.blic.rs/rss/Vesti/Beograd'),
    (u'Srbija', u'http://www.blic.rs/rss/Vesti/Srbija'),
    (u'Vojvodina', u'http://www.blic.rs/rss/Vesti/Vojvodina'),
    (u'Republika Srpska', u'http://www.blic.rs/rss/Vesti/Republika-Srpska'),
    (u'Reportaza', u'http://www.blic.rs/rss/Vesti/Reportaza'),
    (u'Dodatak', u'http://www.blic.rs/rss/Vesti/Dodatak'),
    (u'Zabava', u'http://www.blic.rs/rss/Zabava'),
    (u'Kultura', u'http://www.blic.rs/rss/Kultura'),
    (u'Slobodno Vreme', u'http://www.blic.rs/rss/Slobodno-vreme'),
    (u'IT', u'http://www.blic.rs/rss/IT'),
    (u'Komentar', u'http://www.blic.rs/rss/Komentar'),
    (u'Intervju', u'http://www.blic.rs/rss/Intervju')
    ]

    def print_version(self, url):
        return url + '/print'

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.blic.rs/')
        alink = soup.find('a', attrs={'id': 'blic_naslovna_print'})
        if alink:
            return 'http://www.blic.rs' + alink['href']
        return None
PK�X��ߜ�bloomberg-business-week.png�PNG


IHDR  D����PLTEGpL�����������Ŷ����ޗ�����VVV???��������𤤤���444������bbbNNNrrr   kkk���)))���#I6tRNS�<��.�����]	M���p�"��IDATxڅӇ��0��I��Ǔ���.���v�c�!'ݯ��|"��H��gO<\�
#���e68F��>٠�I���Ə<�x�/0q�	_
��]}�]���	�\��8+��dH:1�]r�r��W�Q�G`T �۶����G�B�|�K��w�1Jb�f���;�3Rp|�3_(m'`��4��
E�tp�.���]���ZI��i>�2��H5���ex��x(D�O]��c�Pv�3ְ�@��cU��ѡF��w j~�����=��Ҭ�/ʂ9�
�N�Nj��tM�hy�Y�	·�(Y��['�X[�x�3��/xba��k
�derΚJ��J_�{!;^O����_{q8~d?G���ې
��k8��n-�x%��F����_D��@�\����aIEND�B`�PK�X�4��&�&bloomberg-business-week.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from html5_parser import parse
import json
import random
import time

def get_contents(x):
    if x == '':
        return ''
    otype = x.get('type', '')
    if otype == 'text':
        if 'attributes' in x:
            if 'strong' in x['attributes']:
                return '<strong>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</strong>'
            if 'emphasis' in x['attributes']:
                return '<em>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</em>'
            return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
        return x.get('value', '') + ''.join(map(get_contents, x.get('content', '')))
    elif otype == 'br':
        return '<br>'
    elif otype == 'paragraph':
        return '<p>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</p>'
    elif otype == 'heading':
        return '<h3>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</h3>'
    elif otype == 'list':
        return '<ul>' + ''.join(map(get_contents, x.get('content', ''))) + '</ul>'
    elif otype == 'listItem':
        return '<li>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</li>'
    elif otype == 'quote':
        return '<blockquote class="col">' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</blockquote>'
    elif otype == 'media':
        if x['subType'] == 'photo':
            return '<div><div class="img"><img src="{}"></div><div class="cap">{}<div>{}</div></div></div>'.format(
                x['data']['photo']['src'], x['data']['photo']['caption'], x['data']['photo']['credit'])
        elif x['subType'] == 'chart':
            if x['data'] and x['data']['chart']:
                return '<div class="img"><img src="{}"></div>'.format(x['data']['chart']['fallback'])
    elif otype == 'link':
        if 'data' in x:
            if 'href' in x['data']:
                return '<a href="' + x['data']['href'] + '">' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</a>'
            return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
        return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
    elif otype == 'entity':
        if x['subType'] == 'story':
            if x['data'] and x['data']['link'] and x['data']['link']['destination']:
                if 'web' in x['data']['link']['destination']:
                    return '<a href="' + x['data']['link']['destination']['web'] + '">' + x.get('value', '') + ''.join(
                        map(get_contents, x.get('content', ''))) + '</a>'
                return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
            return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
        return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
    elif otype in {'div', 'callout'}:
        return '<div>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</div>'
    elif not any(x == otype for x in ['', 'ad', 'inline-newsletter', 'tabularData']):
        if any(b in x for b in ['value', 'content']):
            return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'

    return ''

class Bloomberg(BasicNewsRecipe):
    title = u'Bloomberg Businessweek'
    language = 'en'
    __author__ = 'unkn0wn'
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}
    resolve_internal_links = True
    masthead_url = 'https://assets.bwbx.io/s3/javelin/public/hub/images/BW-Logo-Black-cc9035fbb3.svg'
    description = (
        'Bloomberg Businessweek helps global leaders stay ahead with insights and in-depth analysis on the people,'
        ' companies, events, and trends shaping today\'s complex, global economy.'
    )

    simultaneous_downloads = 1

    extra_css = '''
        .auth {font-size:small; font-weight:bold;}
        .time, .chart, .css--lede-byline, .css--lede-timestamp {font-size:small;}
        .subhead {font-style:italic; color:#404040;}
        em, .col {color:#202020;}
        .cat {font-size:small; color:gray;}
        .news-figure-caption-text, .cap, .img, .css--caption-outer-wrapper {font-size:small; text-align:center;}
        .news-figure-credit {font-size:small; text-align:center; color:#202020;}
    '''

    remove_tags = [
        dict(name=['button', 'svg']),
        dict(name='div', attrs={'id':['bb-that', 'bb-nav']}),
        classes('twitter-logo bb-global-footer __sticky__audio__bar__portal__ css--social-wrapper-outer')
    ]

    def get_browser(self, *a, **kw):
        kw['user_agent'] = 'Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/119.0'
        br = BasicNewsRecipe.get_browser(self, *a, **kw)
        br.set_handle_redirect(False)
        return br

    def parse_index(self):
        soup = self.index_to_soup('https://www.bloomberg.com/businessweek')
        bw = soup.find('a', href=lambda x: x and x.startswith('/magazine/businessweek/'))
        edition = 'https://www.bloomberg.com' + bw['href']
        self.log('Downloading ', edition)
        self.cover_url = bw.find('img')['src'].replace('25x19', '600x800')
        soup = self.index_to_soup(edition)
        if timefmt := soup.find(attrs={'class':lambda x: x and x.startswith('styles_MagazineTitle__')}):
            self.timefmt = ' [' + (self.tag_to_string(timefmt).replace(' Issue', '')).strip() + ']'

        feeds = []
        for div in soup.findAll(attrs={'class':lambda x: x and x.startswith(
                ('styles_MagazineFeatures__', 'styles_MagazineStoryList__')
            )}):
            h3 = div.find(attrs={'class':lambda x: x and x.startswith(
                ('styles_featuresTitle__', 'styles_magazineSectionTitle__')
            )})
            sec = self.tag_to_string(h3)
            self.log(sec)
            articles = []
            for art in div.findAll(attrs={'data-component':'headline'}):
                a = art.find('a', href=True)
                url = a['href']
                if url.startswith('http') is False:
                    url = 'https://www.bloomberg.com' + a['href']
                title = self.tag_to_string(a)
                articles.append({'title': title, 'url': url})
                self.log('\t', title, '\n\t\t', url)
            if articles:
                feeds.append((sec, articles))
        return feeds

    def preprocess_raw_html(self, raw, *a):
        root = parse(raw)
        m = root.xpath('//script[@data-component-props="ArticleBody"]')
        if not m:
            m = root.xpath('//script[@data-component-props="FeatureBody"]')
            if not m:
                m2 = root.xpath('//script[@id="__NEXT_DATA__"]')
                if not m2:
                    return raw
        if m:
            data = json.loads(m[0].text)
            data = data['story']

        else:
            data = json.loads(m2[0].text)
            data = data['props']['pageProps']['story']

        title = '<h1>' + data['headline'] + '</h1>'

        cat = subhead = lede = auth = caption = ''

        if 'primaryCategory' in data and data['primaryCategory'] is not None:
                cat = '<p class="cat">' + data['primaryCategory'] + '</p>'

        if len(data['abstract']) != 0 and len(data['abstract']) == 2:
                subhead = '<div class="subhead"><p>' + data['abstract'][0] + '</p><p>' + data['abstract'][1] + '</p></div>'
        else:
            if 'summary' in data:
                subhead = '<div class="subhead"><p>' + data['summary'] + '</p></div>'

        if 'byline' in data and data['byline'] is not None:
                auth = '<div><span class="auth">' + data['byline']\
                 + '</span> | <span class="time">' + data['publishedAt'][:-14] + '</span></div>'

        if 'ledeImageUrl' in data and data['ledeImageUrl'] is not None:
                lede = '<p id="img"><img src="{}">'.format(data['ledeImageUrl'])

        if 'ledeDescription' in data and data['ledeDescription'] is not None:
                caption = '<span class="cap">' + data['ledeDescription'] + '</span>'
        else:
            if 'lede' in data and data['lede'] is not None:
                    if 'alt' in data['lede'] and data['lede']['alt'] is not None:
                            caption = '<span class="cap">' + data['lede']['alt'] + '</span>'

        if m:
            time.sleep(3)
            body = data['body']
        else:
            body = ''
            body_data = data['body']['content']
            for x in body_data:
                body += get_contents(x)
            pause = random.choice((5, 6, 7, 8, 9))
            self.log('Delay: ', pause, ' seconds')
            time.sleep(pause)
        return '<html><body>' + cat + title + subhead + auth + lede + caption + '<div>' + body + '</div></body></html>'

    def preprocess_html(self, soup):
        for icon in soup.findAll('img', attrs={'class':'video-player__play-icon'}):
            icon.decompose()
        for div in soup.findAll('div', attrs={'class':'chart'}):
            nos = div.find('noscript')
            if nos:
                nos.name = 'span'
        for img in soup.findAll('img', attrs={'data-native-src':True}):
            if img['data-native-src'].__contains__('videos') is False:
                img['src'] = img['data-native-src']
            else:
                img['src'] = ''
        for img in soup.findAll('img', attrs={'src':lambda x: x and x.endswith(('-1x-1.jpg', '-1x-1.png'))}):
            img['src'] = img['src'].replace('-1x-1', '750x-1')
        return soup
PK�X��ߜ�
bloomberg.png�PNG


IHDR  D����PLTEGpL�����������Ŷ����ޗ�����VVV???��������𤤤���444������bbbNNNrrr   kkk���)))���#I6tRNS�<��.�����]	M���p�"��IDATxڅӇ��0��I��Ǔ���.���v�c�!'ݯ��|"��H��gO<\�
#���e68F��>٠�I���Ə<�x�/0q�	_
��]}�]���	�\��8+��dH:1�]r�r��W�Q�G`T �۶����G�B�|�K��w�1Jb�f���;�3Rp|�3_(m'`��4��
E�tp�.���]���ZI��i>�2��H5���ex��x(D�O]��c�Pv�3ְ�@��cU��ѡF��w j~�����=��Ҭ�/ʂ9�
�N�Nj��tM�hy�Y�	·�(Y��['�X[�x�3��/xba��k
�derΚJ��J_�{!;^O����_{q8~d?G���ې
��k8��n-�x%��F����_D��@�\����aIEND�B`�PK�X���X'X'bloomberg.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from html5_parser import parse
from calibre.ptempfile import PersistentTemporaryFile
import json
import random
import time

def get_contents(x):
    if x == '':
        return ''
    otype = x.get('type', '')
    if otype == 'text':
        if 'attributes' in x:
            if 'strong' in x['attributes']:
                return '<strong>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</strong>'
            if 'emphasis' in x['attributes']:
                return '<em>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</em>'
            return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
        return x.get('value', '') + ''.join(map(get_contents, x.get('content', '')))
    elif otype == 'br':
        return '<br>'
    elif otype == 'paragraph':
        return '<p>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</p>'
    elif otype == 'heading':
        return '<h3>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</h3>'
    elif otype == 'list':
        return '<ul>' + ''.join(map(get_contents, x.get('content', ''))) + '</ul>'
    elif otype == 'listItem':
        return '<li>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</li>'
    elif otype == 'quote':
        return '<blockquote class="col">' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</blockquote>'
    elif otype == 'media':
        if x['subType'] == 'photo':
            return '<div><div class="img"><img src="{}"></div><div class="cap">{}<div>{}</div></div></div>'.format(
                x['data']['photo']['src'], x['data']['photo']['caption'], x['data']['photo']['credit'])
        elif x['subType'] == 'chart':
            if x['data'] and x['data']['chart']:
                return '<div class="img"><img src="{}"></div>'.format(x['data']['chart']['fallback'])
    elif otype == 'link':
        if 'data' in x:
            if 'href' in x['data']:
                return '<a href="' + x['data']['href'] + '">' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</a>'
            return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
        return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
    elif otype == 'entity':
        if x['subType'] == 'story':
            if x['data'] and x['data']['link'] and x['data']['link']['destination']:
                if 'web' in x['data']['link']['destination']:
                    return '<a href="' + x['data']['link']['destination']['web'] + '">' + x.get('value', '') + ''.join(
                        map(get_contents, x.get('content', ''))) + '</a>'
                return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
            return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
        return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'
    elif otype in {'div', 'callout'}:
        return '<div>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</div>'
    elif not any(x == otype for x in ['', 'ad', 'inline-newsletter', 'tabularData']):
        if any(b in x for b in ['value', 'content']):
            return '<i>' + x.get('value', '') + ''.join(map(get_contents, x.get('content', ''))) + '</i>'

    return ''


class Bloomberg(BasicNewsRecipe):
    title = u'Bloomberg'
    language = 'en'
    __author__ = 'unkn0wn'
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url', 'title'}
    masthead_url = 'https://assets.bbhub.io/company/sites/70/2022/09/logoBBGblck.svg'
    description = ('Bloomberg delivers business and markets news, data, analysis, and video'
                   ' to the world, featuring stories from Businessweek and Bloomberg News.')

    simultaneous_downloads = 1

    extra_css = '''
        .auth {font-size:small; font-weight:bold;}
        .time, .chart {font-size:small;}
        .subhead {font-style:italic; color:#404040;}
        em, .col {color:#202020;}
        .cat {font-size:small; color:gray;}
        .news-figure-caption-text, .cap, .img {font-size:small; text-align:center;}
        .news-figure-credit {font-size:small; text-align:center; color:#202020;}
    '''

    articles_are_obfuscated = True
    resolve_internal_links = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', attrs={'href':lambda x: x and x.startswith('https://www.bloomberg.com')})
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/', 'podcast'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.abort_article('Aborting Video article')
        self.log('Found link: ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    def get_browser(self, *a, **kw):
        kw['user_agent'] = 'Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/119.0'
        br = BasicNewsRecipe.get_browser(self, *a, **kw)
        br.set_handle_redirect(False)
        return br

    feeds = [
        ('Features',
            'https://news.google.com/rss/search?q=when:27h+allinurl:bloomberg.com%2Fnews%2Ffeatures%2F&hl=en-US&gl=US&ceid=US:en'),
        ('Opinion', 'https://news.google.com/rss/search?q=when:27h+allinurl:bloomberg.com%2Fopinion%2F&hl=en-US&gl=US&ceid=US:en'),
        ('Newsletters',
            'https://news.google.com/rss/search?q=when:27h+allinurl:bloomberg.com%2Fnews%2Fnewsletters%2F&hl=en-US&gl=US&ceid=US:en'),
        ('News',
            'https://news.google.com/rss/search?q=when:27h+allinurl:bloomberg.com%2Fnews%2Farticles%2F&hl=en-US&gl=US&ceid=US:en'),
        ('Others', 'https://news.google.com/rss/search?q=when:27h+allinurl:https%3A%2F%2Fwww.bloomberg.com&hl=en-US&gl=US&ceid=US:en')
    ]

    def preprocess_raw_html(self, raw, *a):
        root = parse(raw)
        m = root.xpath('//script[@data-component-props="ArticleBody"]')
        if not m:
            m = root.xpath('//script[@data-component-props="FeatureBody"]')
            if not m:
                m2 = root.xpath('//script[@id="__NEXT_DATA__"]')

        if m:
            data = json.loads(m[0].text)
            data = data['story']

        elif m2:
            data = json.loads(m2[0].text)
            data = data['props']['pageProps']['story']

        art_url = data['url']
        if not art_url.startswith('http'):
            art_url = 'https://www.bloomberg.com' + art_url

        title = '<h1 title="{}">'.format(art_url) + data['headline'] + '</h1>'

        cat = subhead = lede = auth = caption = ''

        if 'primaryCategory' in data and data['primaryCategory'] is not None:
                cat = '<p class="cat">' + data['primaryCategory'] + '</p>'

        if len(data['abstract']) != 0 and len(data['abstract']) == 2:
                subhead = '<div class="subhead"><p>' + data['abstract'][0] + ' </p><p>' + data['abstract'][1] + '</p></div>'
        else:
            if 'summary' in data:
                subhead = '<div class="subhead"><p>' + data['summary'] + '</p></div>'

        if 'byline' in data and data['byline'] is not None:
                auth = '<div><span class="auth">' + data['byline']\
                 + '</span> | <span class="time">' + data['publishedAt'][:-14] + '</span></div>'

        if 'ledeImageUrl' in data and data['ledeImageUrl'] is not None:
                lede = '<p class="img"><img src="{}">'.format(data['ledeImageUrl'])

        if 'ledeDescription' in data and data['ledeDescription'] is not None:
                caption = '<span class="cap">' + data['ledeDescription'] + '</span>'
        else:
            if 'lede' in data and data['lede'] is not None:
                    if 'alt' in data['lede'] and data['lede']['alt'] is not None:
                            caption = '<span class="cap">' + data['lede']['alt'] + '</span>'

        if m:
            time.sleep(3)
            body = data['body']
        elif m2:
            body = ''
            body_data = data['body']['content']
            for x in body_data:
                body += get_contents(x)
            pause = random.choice((5, 6, 7, 8, 9))
            self.log('Delay: ', pause, ' seconds')
            time.sleep(pause)
        return '<html><body>' + cat + title + subhead + auth + lede + caption + '<div>' + body + '</div></body></html>'

    def preprocess_html(self, soup):
        for icon in soup.findAll('img', attrs={'class':'video-player__play-icon'}):
            icon.decompose()
        for div in soup.findAll('div', attrs={'class':'chart'}):
            nos = div.find('noscript')
            if nos:
                nos.name = 'span'
        for img in soup.findAll('img', attrs={'data-native-src':True}):
            if img['data-native-src'].__contains__('videos') is False:
                img['src'] = img['data-native-src']
            else:
                img['src'] = ''
        for img in soup.findAll('img', attrs={'src':lambda x: x and x.endswith(('-1x-1.jpg', '-1x-1.png'))}):
            img['src'] = img['src'].replace('-1x-1', '750x-1')
        return soup

    def populate_article_metadata(self, article, soup, first):
        article.url = soup.find('h1')['title']
        article.summary = self.tag_to_string(soup.find('div', attrs={'class':'subhead'}))
        article.text_summary = self.tag_to_string(soup.find('div', attrs={'class':'subhead'}))
        article.title = article.title.replace(' - Bloomberg', '')
PK�X%7�	11bookforummagazine.png�PNG


IHDR  szz�	pHYs��~��IDATX��m
� ��P	H@B%LB%LB%L�$L���:�\IӬ�5\ߥ#y�p�'p�RJ�\�BP{�5���6؂$i���7 �[@<$\r���'s@��ס�ݼ��`R�̀��@Q�!�$��`$��U]�&$�݌�?ӌF	��s�o��J�)}L�(6$q�t��)A�{?A%E8i�$�%	`�����h�Qs8���c`��_VK�5��'�IEND�B`�PK�X}
�jjbookforummagazine.recipefrom urllib.parse import urljoin

from calibre.web.feeds.news import BasicNewsRecipe

_issue_url = ""


class BookforumMagazine(BasicNewsRecipe):
    title = "Bookforum"
    description = (
        "Bookforum is an American book review magazine devoted to books and "
        "the discussion of literature. https://www.bookforum.com/print"
    )
    language = "en"
    __author__ = "ping"
    publication_type = "magazine"
    encoding = "utf-8"
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = False
    compress_news_images = True
    compress_news_images_auto_size = 8

    keep_only_tags = [dict(class_="blog-article")]
    remove_tags = [dict(name=["af-share-toggle", "af-related-articles"])]

    extra_css = """
    .blog-article__header { font-size: 1.8rem; margin-bottom: 0.4rem; }
    .blog-article__subtitle { font-size: 1.2rem; font-style: italic; margin-bottom: 1rem; }
    .blog-article__writer { font-size: 1rem; font-weight: bold; color: #444; }
    .blog-article__book-info { margin: 1rem 0; }
    .article-image-container img, .blog-article__publication-media img {
        display: block; max-width: 100%; height: auto;
    }
    .blog-article__caption { font-size: 0.8rem; display: block; margin-top: 0.2rem; }
    """

    def preprocess_html(self, soup):
        # strip away links that's not needed
        for ele in soup.select(".blog-article__header a"):
            ele.unwrap()
        return soup

    def parse_index(self):
        soup = self.index_to_soup(
            _issue_url if _issue_url else "https://www.bookforum.com/print"
        )
        meta_ele = soup.find("meta", property="og:title")
        if meta_ele:
            self.timefmt = f' [{meta_ele["content"]}]'

        cover_ele = soup.find("img", class_="toc-issue__cover")
        if cover_ele:
            self.cover_url = urljoin(
                "https://www.bookforum.com",
                soup.find("img", class_="toc-issue__cover")["src"],
            )

        articles = {}
        for sect_ele in soup.find_all("div", class_="toc-articles__section"):
            section_name = self.tag_to_string(
                sect_ele.find("a", class_="toc__anchor-links__link")
            )
            for article_ele in sect_ele.find_all("article"):
                title_ele = article_ele.find("h1")
                sub_title_ele = article_ele.find(class_="toc-article__subtitle")
                articles.setdefault(section_name, []).append(
                    {
                        "title": self.tag_to_string(title_ele),
                        "url": article_ele.find("a", class_="toc-article__link")[
                            "href"
                        ],
                        "description": self.tag_to_string(sub_title_ele)
                        if sub_title_ele
                        else "",
                    }
                )
        return articles.items()
PK�X�=���
boortz.png�PNG


IHDR(-SPLTE������俾����ws�YXZH�7�fiIDATxm���@A$����ӭ�&<��Bv���X=��	0z|�)��HZ����AR��Ў�����yXi��=ַ�4l]_h�>���},ѿ��Y�D_˳��V��ߎ�IEND�B`�PK�X�^�ww
boortz.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Tony Stegall'
__copyright__ = '2010, Tony Stegall or Tonythebookworm on mobiread.com'
__version__ = '1.04'
__date__ = '27, September 2010'
__docformat__ = 'restructuredtext en'


from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1282101454(BasicNewsRecipe):
    title = 'Nealz Nuze'
    language = 'en'
    __author__ = 'TonytheBookworm'
    description = 'Neal Boortz Show Radio Notes'
    publisher = 'Neal Boortz'
    category = 'news, politics, USA, talkshow'
    oldest_article = 1
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = True
    masthead_url = 'http://boortz.com/images/nuze_logo.gif'
    conversion_options = {'linearize_tables': True}
    feeds = [
        ('NUZE', 'http://boortz.com/nealz_nuze_rss/rss.xml')

    ]
PK�X�jK��borse_online.png�PNG


IHDR(-SPLTE333fff����3f�ff�f������W��tRNS@��f^IDATxڍ��A����fw��Lt�Gm�`���]�ef�����T)@�/SjP%��5� ��jLt� ��A�����q�B��s`d�^F����2
�IEND�B`�PK�X&LMMborse_online.recipe# vim:fileencoding=utf-8
from calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1303841067(BasicNewsRecipe):

    title = u'Börse-online'
    __author__ = 'schuster, Armin Geller'  # AGE upd 2013-11-29
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'de'
    remove_javascript = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    encoding = 'utf-8'
    timefmt = ' [%a, %d %b %Y]'

    cover_url = 'http://www.wirtschaftsmedien-shop.de/s/media/coverimages/7576_2013107.jpg'
    masthead_url = 'http://upload.wikimedia.org/wikipedia/de/5/56/B%C3%B6rse_Online_Logo.svg'

    feeds = [(u'Börsennachrichten', u'http://www.boerse-online.de/rss'),
             (u'Märkte', u'http://www.boerse-online.de/rss/maerkte'),
             (u'Chartanalyse', u'http://www.boerse-online.de/rss/maerkte/chartanalyse'),
             (u'Aktien', u'http://www.boerse-online.de/rss/aktie'),
             (u'Aktien-Chartanalyse',
              u'http://www.boerse-online.de/rss/aktie/chartanalyse'),
             (u'zertifikate', u'http://www.boerse-online.de/rss/zertifikat')
             ]

    def print_version(self, url):
        s1, s2 = url.rsplit('/', 1)
        return 'http://www.boerse-online.de/nachrichten/drucken/' + s2
PK�X�.��VV
borsen_dk.png�PNG


IHDR�aIDATx�c�O!����5Z�
SπQFS"�SЖ�nU�IEND�B`�PK�X��Ifrrborsen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Børsen.dk
'''


class Borsen_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'Børsen.dk'
    description           = ('Meget mere end Danmarks førende erhvervsavis. Børsen sætter dagsordenen for erhvervslivet.'
                             ' Vi skriver interessant og med kant. På alle platforme.')
    category              = 'newspaper, news, finance, politics, economy, sport, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = False
    language              = 'da'

    keep_only_tags = [
        dict(name="h1", attrs={'itemprop': 'headline'}),
        dict(name="div", attrs={'itemprob': 'datePublished'}),
        dict(name="div", attrs={'itemprop': 'articleBody'}),
    ]

    # Feed are found here:
    # http://borsen.dk/kundeservice/smartphone_tablet_og_rss/rss-feeds.html
    feeds = [
        ('Nyheder', 'http://borsen.dk/rss/'),
        ('Breaking news feed', 'http://borsen.dk/rss/breaking'),
        ('Penge', 'http://borsen.dk/rss/penge/'),
        ('Topnyheder', 'http://borsen.dk/rss/topnyheder/'),
        ('Privat økonomi', 'http://borsen.dk/rss/privatoekonomi/'),
        ('Økonomi', 'http://borsen.dk/rss/oekonomi/'),
        ('Politik', 'http://borsen.dk/rss/politik/'),
        ('Finans', 'http://finans.borsen.dk/rss/'),
        ('Sport', 'http://borsen.dk/rss/sport/'),
    ]
PK�X6��		boston.com.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿	pHYs��~�tIME�	 �d�IDATHǝ�mhVe�ksN7gl���\˅H3�"Ss�L2�e?,��ͅ�}(-\��Ya�,�/�I	k������>և%5#ÕZ�6�<��;{7���s�y�:�}��<��1Q�9f)U$W:�h2ۈ1�&���9�[�q��c��
ا({y�
���Ya�"�N�>����\ԣ/��[m�{V�o��_��t�'jU[�n���U"���D��4�D�������&0���9
Tٞq�R��Qh�>��K��d$N�=ݠ���]�S*�A��W�\����\��m�L�� x�%�F�[e�v>�`7���Pam_� �ʴl�yZ�v��{�B��cF�/n�~�kt
�f�geVŌE:m7yxi�q�+וuÀ�V:l����S59�v%�#)��n�c����%��;'�?`}<~��p<�I��%���V�e���`]L����bB�ju� �FC<*uBl�ژ\�B������f[�t�A�1����B�ד5Y>�Q��t	Κ�A_\6�mlL�볽�z��!O�=�jB
�8Pl���1վ�5�g�G�����
��2��A�ɑ�\�n��_���1.l��%g�l�~�j���)��JW�/.��ڝ{��!51�Y���'����x�j�yP�#��@.x���8�5���Om�~��9?f<�I{<oN�/y+��!Ǎ^ԝ|%j�f�;mad���\t���M�G-��$�F�G��r��������3N�$P��%tEXtdate:create2022-09-18T21:03:57+00:00R��b%tEXtdate:modify2022-09-18T21:03:55+00:00�pY�IEND�B`�PK�XϺ�yyboston.com.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals
import json
import pprint
from datetime import timedelta
from calibre.utils.date import utcnow
from calibre.utils.iso8601 import parse_iso8601

from calibre.web.feeds.recipes import BasicNewsRecipe


oldest_article = 1  # days, includes articles that were published no more than the specified number of days ago


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def class_as_string(x):
    if isinstance(x, (list, tuple)):
        x = ' '.join(x)
    return x


def class_startswith(*prefixes):

    def q(x):
        if x:
            x = class_as_string(x)
            for prefix in prefixes:
                if x.startswith(prefix):
                    return True
        return False

    return dict(attrs={'class': q})


# From: https://www3.bostonglobe.com/lifestyle/comics?arc404=true
comics_to_fetch = {
    "ADAM@HOME": 'ad',
    "ARLO & JANIS": 'aj',
    # "CUL DE SAC": 'cds',
    # "CURTIS": 'kfcrt',
    "DILBERT": 'dt',
    "DOONESBURY": 'db',
    "DUSTIN": 'kfdus',
    "F MINUS": 'fm',
    "FOR BETTER OR WORSE": 'fb',
    # "GET FUZZY": 'gz',
    # "MOTHER GOOSE & GRIMM": 'tmmgg',
    # "JUMPSTART": 'jt',
    "MONTY": 'mt',
    # "POOCH CAFE",
    "RHYMES WITH ORANGE": 'kfrwo',
    # "ROSE IS ROSE": 'rr',
    # "ZIPPY THE PINHEAD": 'kfzpy',
    "ZITS": 'kfzt'
}


def extract_json(raw_html):
    idx = raw_html.find('Fusion.contentCache={')
    close_idx = raw_html.find('</script>', idx)
    raw = raw_html[idx:close_idx]
    raw = raw[raw.find('{'):]
    idx = raw.find(';Fusion')
    raw = raw[:idx]
    # open('/t/raw.html', 'w').write(raw)
    data = json.loads(raw, strict=False)
    # open('/t/raw.json', 'w').write(json.dumps(data, indent=2))
    return data


def absolutize_url(url):
    if url.startswith("//"):
        return "https:" + url
    if url.startswith('/'):
        url = "https://www.bostonglobe.com" + url
    return url


def parse_section(raw_html):
    data = extract_json(raw_html)['content-feed']
    now = utcnow()
    cutoff_date = now - timedelta(days=oldest_article)

    def text(e):
        if not e:
            return ''
        return e.get('basic') or e.get('native', '')

    for group in data.values():
        for elem in group['data']['content_elements']:
            date = parse_iso8601(elem['publish_date'])
            if date < cutoff_date:
                continue
            title = text(elem['headlines'])
            description = text(elem.get('description'))
            try:
                url = absolutize_url(elem['canonical_url'])
            except KeyError:
                continue
            yield {'title': title, 'url': url, 'description': description, 'date': ' '  + str(date.date())}


def main():
    for sec in 'metro world'.split():
        for item in parse_section(open('/t/{}.html'.format(sec)).read()):
            print(item)


# if __name__ == '__main__':
#     main()


class BostonGlobeSubscription(BasicNewsRecipe):

    title = "Boston Globe"
    __author__ = 'Kovid Goyal'
    description = 'The Boston Globe'
    language = 'en'
    timefmt = ' [%a, %d %b, %Y]'
    keep_only_tags = [
        class_startswith('headline |', 'subheader |', 'byline |', 'image |', 'lead |', 'body |', 'comic-debug'),
    ]
    remove_tags = [
        classes('inline-newsletter ad skip-nav article-footer sharebar arc_ad'),
        dict(id='continue_button'),
        dict(name=['meta', 'link'])
    ]
    remove_tags_after = dict(attrs={'class': lambda x:x and x.startswith('body |')})
    remove_attributes = ['style']
    no_stylesheets = True
    scale_news_images = 1600, 1200
    ignore_duplicate_articles = {'url'}
    # simultaneous_downloads = 1

    def image_url_processor(self, baseurl, url):
        return absolutize_url(url)

    def parse_index(self):
        feeds = []
        for sec in 'metro sports nation world business opinion lifestyle arts'.split():
            articles = list(parse_section(self.index_to_soup(absolutize_url('/' + sec), raw=True).decode('utf-8')))
            if articles:
                self.log(sec.capitalize())
                self.log(pprint.pformat(articles))
                feeds.append((sec.capitalize(), articles))
                if self.test:
                    del articles[self.test[1]:]
                    if len(feeds) >= self.test[0]:
                        break

        articles = []
        for title, slug in comics_to_fetch.items():
            articles.append({'title':title, 'url':'https://www.bostonglobe.com/games-comics/comics/{}/'.format(slug)})
        if articles:
            feeds.append(('Comics', articles))
        return feeds

    def preprocess_raw_html(self, raw_html, url):
        soup = self.index_to_soup(raw_html)
        meta = soup.find(attrs={'name': 'description'}, content=True)
        if meta is not None and meta['content'].startswith('Comics: '):
            meta = soup.find(property='og:image', content=True)
            img_url = 'https://cloudfront-us-east-1.images.arcpublishing.com/bostonglobe/' + meta['content'].split('/')[-1]
            title = self.tag_to_string(soup.find('title'))
            raw_html = '<html><body><h1 class="headline |">{}</h1><div class="image |"><img src="{}"></div></body></html>'.format(title, img_url)
        return raw_html

    def preprocess_html(self, soup):
        for img in soup.findAll('img'):
            fs = img.get('data-src')
            if fs:
                img['src'] = fs
        return soup
PK�X�~��**!boston_globe_print_edition.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
from calibre.web.feeds.news import BasicNewsRecipe, classes
from collections import defaultdict
from datetime import date

def class_as_string(x):
    if isinstance(x, (list, tuple)):
        x = ' '.join(x)
    return x

def class_startswith(*prefixes):

    def q(x):
        if x:
            x = class_as_string(x)
            for prefix in prefixes:
                if x.startswith(prefix):
                    return True
        return False

    return dict(attrs={'class': q})

def absolutize_url(url):
    if url.startswith("//"):
        return "https:" + url
    if url.startswith('/'):
        url = "https://www.bostonglobe.com" + url
    return url


class BostonGlobePrint(BasicNewsRecipe):
    title = "Boston Globe | Print Edition"
    __author__ = 'Kovid Goyal, unkn0wn'
    description = 'The Boston Globe - Today\'s Paper'
    language = 'en'

    keep_only_tags = [
        class_startswith('headline |', 'subheader |', 'byline |', 'image |', 'lead |', 'body |', 'comic-debug'),
    ]
    remove_tags = [
        classes('inline-newsletter ad skip-nav article-footer sharebar arc_ad'),
        dict(id='continue_button'),
        dict(name=['meta', 'link'])
    ]
    remove_tags_after = dict(attrs={'class': lambda x:x and x.startswith('body |')})
    remove_attributes = ['style', 'height', 'width']
    no_stylesheets = True
    scale_news_images = 1600, 1200
    ignore_duplicate_articles = {'url'}
    # simultaneous_downloads = 1

    def image_url_processor(self, baseurl, url):
        return absolutize_url(url)

    def get_cover_url(self):
        cover = 'https://img.kiosko.net/' + str(
            date.today().year
        ) + '/' + date.today().strftime('%m') + '/' + date.today(
        ).strftime('%d') + '/us/boston_globe.750.jpg'
        br = BasicNewsRecipe.get_browser(self, verify_ssl_certificates=False)
        try:
            br.open(cover)
        except:
            index = 'https://en.kiosko.net/us/np/boston_globe.html'
            soup = self.index_to_soup(index)
            for image in soup.findAll('img', src=True):
                if image['src'].endswith('750.jpg'):
                    return 'https:' + image['src']
            self.log("\nCover unavailable")
            cover = None
        return cover

    def parse_index(self):

        soup = self.index_to_soup('https://www.bostonglobe.com/todays-paper/')
        if timefmt := soup.find(**classes('todays-date')):
            self.timefmt = ' [' + self.tag_to_string(timefmt) + ']'

        feeds_dict = defaultdict(list)

        for div in soup.findAll('section', attrs={'id':['sp-top-main', 'sp-middle-main']}):
            for a in div.findAll('a', href=lambda x: x and x.startswith('/' + str(date.today().year) + '/')):
                section = 'Front Page'
                if bar := a.findParent(**classes('container')).find_previous_sibling(**classes('title_bar')):
                    section = self.tag_to_string(bar)
                url = absolutize_url(a['href'])
                title = self.tag_to_string(a.find('h2'))
                desc = ''
                if d := a.find(**classes('deck')):
                    desc = self.tag_to_string(d)

                self.log(section, '\n\t', title, '\n\t', desc, '\n\t\t', url)
                feeds_dict[section].append({"title": title, "url": url, "description": desc})
        return [(section, articles) for section, articles in feeds_dict.items()]

    def preprocess_raw_html(self, raw_html, url):
        soup = self.index_to_soup(raw_html)
        meta = soup.find(attrs={'name': 'description'}, content=True)
        if meta is not None and meta['content'].startswith('Comics: '):
            meta = soup.find(property='og:image', content=True)
            img_url = 'https://cloudfront-us-east-1.images.arcpublishing.com/bostonglobe/' + meta['content'].split('/')[-1]
            title = self.tag_to_string(soup.find('title'))
            raw_html = '<html><body><h1 class="headline |">{}</h1><div class="image |"><img src="{}"></div></body></html>'.format(title, img_url)
        return raw_html

    def preprocess_html(self, soup):
        for img in soup.findAll('img'):
            fs = img.get('data-src')
            if fs:
                img['src'] = fs
        return soup
PK�XtJ(��boxis.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1501590114(AutomaticNewsRecipe):
    title = 'Boxis'
    oldest_article = 240
    max_articles_per_feed = 100
    auto_cleanup = True
    language = 'sc'
    __author__ = 'tzium'

    feeds = [
        ('Boxis', 'http://www.boxis.it/sc/feed/'),
    ]
PK�X����bq_prime.png�PNG


IHDR  ��lIDATx^�VLSg�Ͻ�E���-�Byt�jA��1��Q��,�lF��5C�-��l.�Y1�KfF6��-���eY�s�|�6^�`Q[�XJ�;�my�Fd�'r�{��w����$�����`��,2:�QaI��,�#$�y2�������D����0|x�<���`�Z��jf�B�J� ���m���W�Z���v
�b2X��� �U��5��r�(;�<}<�)v�ٿ�hۚ��m��f��ym�w�xG��L����D�~��;_5���Lƒ�ՋrКlq��r8�O^���zq����w�q����6ϲY�-_t��}OM4|�}��:�'W�����{6TݴW�7��8�����@�$�0OA$�k�.�"����T�.|%�f9z��ڛ�ɲ=�!F�t�t"�/VVd$�V�����АdT4�
hYv���{Y��EN���񨡋Vj��,�
8I�6�X���S�x��J����GhDx~N�Ru���z�)Љ���i�DЈ�H8�5�b&1.���E����x�&#5��ͮ�^�/�O5'�ad6w�����8ԅ����~-��).����ׯ�&~=M����-`l�F�e۝]'�Vc΃XY
�:t��>^IeC��3-�ܬ��x��]���f�Q]�6*o��v��Z�m�4��k r�D²���X�������js�����T�ĸ{۾_����aXLI@8F��D��|�^�7c2r�mn=|�ӽ0��r�=�v����;��|��.s_��4�{�ZU0/s�Ltg��V����r��e��?���0h�v,ь{�=Y���%G�:[�@/��` �D�@�m��dh�|�p�+���u���<Q�aΞd��7������x��C�+��ۆ�I�Q��RH0�kc##�W�d�%�p�����N�5�e��w4�_�	[R|�۫&M�<q��G<^�?L�ws�	�,�q���Ӎ�����S�MWo�Of�����f|x^F�d�����Cg��8�d���T���) �"�w�a�� 1H�gp�8=yK�̹V�dž�ٸ`�[�YVc�b��禧�~�r/f���*S�zI��(��ϲl\����#4p�p�uSl��D�pcBB�b��t�Lzt[�c�_mє�͋��0u^Z��H�
��ٔ�d:!Z�|��?JE�H����I�7]j�J���F"%(L�ұ�p�9td���s��^Gw�8O����B�@��=�s
m����k[;�5%k#)������3J%�d����3�K�G�YФ�@@&[W�D�,Qa�珐>�Gp�#���&�}�Ύ�����}}9�vIEND�B`�PK�X9���bq_prime.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class bq(BasicNewsRecipe):
    title = u'BQ Prime'
    description = 'Bloomberg Quint: India’s premier multi-platform business and financial news company.'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    oldest_article = 2  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://www.bqprime.com/icons/bqprime-blue.svg'
    ignore_duplicate_articles = {'url'}

    keep_only_tags = [
        classes(
            'story-base-template-m__story-content__1sSai print-story-card story-element-text'
        ),
        dict(name='img', attrs={'property': 'og:image'})
    ]

    remove_tags = [
        classes(
            'desktop-hidden desktop-only bm-container bookmark-m__bookmark-container__30eHl bookmark-m__container__23o1v'
        ),
        dict(name='div', attrs={'id': 'piano-preview-story'})
    ]

    feeds = [
        ('Articles', 'https://www.bqprime.com/stories.rss'),
    ]

    def preprocess_raw_html(self, raw_html, url):
        return raw_html.replace('<meta property="og:image" content=',
                                '<img property="og:image" src=')

    def preprocess_html(self, soup):
        pic = soup.find('img', attrs={'property': 'og:image'})
        head = soup.find('h1')
        if pic and head:
            head.append(pic)
        return soup
PK�X�����brand_eins.png�PNG


IHDR  V%(gAMA���a cHRMz%������u0�`:�o�_�F	pHYsN�N�sjhtIME�9�I�bKGD���̿�IDAT8�c�O0�W���)��.V���O��}x���@@�� B
���#�~�V�}4B�],�:Nnu��1X�ť����_jY
��P��>�O�)�����^��9bUU�LY�
6���
�JZĦ�3�B0c�$��m�P������������x���*]�R�ӻ�㈋��s���qh��M��S:|�%tEXtdate:create2015-04-24T11:57:03+02:00�f$s%tEXtdate:modify2015-04-24T11:57:03+02:00�;��IEND�B`�PK�X4�
��brand_eins.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals

__license__ = 'GPL v3'
__version__ = '0.2'

'''
brand eins.de
'''
from calibre.web.feeds.news import BasicNewsRecipe
from collections import OrderedDict


class BrandEins(BasicNewsRecipe):

    title = u'brand eins'
    __author__ = 'Nikolas Mangold-Takao, Thomas Schlenkhoff'
    language = 'de'
    description = u'brand eins beschreibt den momentanen Wandel in Wirtschaft und Gesellschaft.'
    publisher = u'brand eins Verlag GmbH & Co. oHG'
    category = 'politics, business, wirtschaft, Germany'

    PREFIX = 'http://www.brandeins.de/'
    INDEX = PREFIX + 'archiv/listeansicht.html'

    use_embedded_content = False
    resolve_internal_links = True

    no_stylesheets = True
    needs_subscription = False

    delay = 1
    summary_length = 200
    simultaneous_downloads = 5
    remove_javascript = True

    keep_only_tags = dict(name='div', attrs={'id': 'content'})

    # remove share image from articles
    remove_tags = [dict(name='div', attrs={'id': 'oms_gpt_billboard'}),
                   dict(name='div', attrs={'id': 'oms_gpt_rectangle'}),
                   dict(name='h3', attrs={'class': 'sharing-headline'}),
                   dict(name='div', attrs={'class': 'sharing-links'}),
                   dict(name='aside', attrs={'class': 'articleAside'})]

    remove_tags_before = dict(
        name='div', attrs={'class': 'innerContent typeArticle'})
    remove_tags_after = dict(name='div', attrs={'id': 'socialshareprivacy'})

    extra_css      = '''
    body, p {text-align: left;}
    .headline {font-size: x-large;}
    h2 {font-size: medium;}
    h1 {font-size: large;}
    em.Bold {font-weight:bold;font-style:normal;}
    em.Italic {font-style:italic;}
    '''

    def parse_index(self):
        issue = ""

        soup = self.index_to_soup(self.INDEX)
        issue_list = soup.findAll('div', attrs={'class': 'details'})

        issue_map = {}
        i = 0
        for entry in issue_list:
            title = self.tag_to_string(entry.find(
                'h3', attrs={'class': 'like-h1'}))
            issue_string = self.tag_to_string(
                entry.find('span', attrs={'class': 'meta'}))
            year = issue_string[8:]
            month = issue_string[5:-5]
            yyyymm = "{}{}".format(year, month)
            link = entry.findAll('a')[0]
            issue_map[yyyymm] = link.get('href')
            self.log('- ', year, month, title, link.get('href'))

            # Issue 1 (most recent) has only few articles online,
            # Issue 2 and 3 (2nd and 3rd recent) is not completely online.
            # Issue 4 (4th recent) is completely online, hence i == 3

            if issue == "" and i == 3:
                issue = yyyymm
            i += 1

        url = 'http://brandeins.de/' + issue_map[issue]
        self.log('Issue to get: ', issue, title, url)
        self.issue_url = url  # save to extract cover

        return self.parse_issue(url)

    def parse_issue(self, url):
        soup = self.index_to_soup(url)
        feeds = OrderedDict()

        for item in soup.findAll(attrs={'class': lambda x: 'ihv_item' in (x or '').split()}):
            a = item.findParent('a', href=True)
            if a is None:
                continue
            url = self.PREFIX + a['href']
            title = self.tag_to_string(item.find(attrs={'class': 'ihv_title'}))
            sec = self.tag_to_string(
                item.find(attrs={'class': 'ihv_page_category'}).findAll('span')[-1])
            if sec not in feeds:
                feeds[sec] = []
            desc = ''
            for p in item.findAll('p'):
                desc += self.tag_to_string(p)
            feeds[sec].append(
                {'title': title, 'url': url, 'description': desc})
            self.log('Found article:', title, 'at', url)

        return [(st, articles) for st, articles in feeds.items() if articles]

    def get_cover_url(self):
        # the index does not contain a usable cover, but the 'Welt in
        # Zahlen'-article contains it
        cover_article = "{}{}".format(
            self.issue_url, 'die-welt-in-zahlen.html')
        self.log('Cover article URL: %s' % cover_article)
        soup = self.index_to_soup(cover_article)
        img = soup.find('section', 'asideSection no-content').find('img')
        self.log('Found cover image url: %s' % img['src'])
        return (self.PREFIX + img['src'])

    def preprocess_raw_html(self, raw_html, url):
        return raw_html.replace('<p>• ', '<p>')
PK�XV�����brasil_de_fato.png�PNG


IHDR  D����PLTE��������������������!�?D�����MR����8=����9>� &����������OT�����7=���˖��]a�����ד"(Ԩ���ۚ16��������mq����BG���dh�����������AF͚���HM�PU�"�|�Z_�{~��˙/5ƒ��05���ɑ���������38���vzݹ�����SW�UYݻ�������ʫTX�CH�KO�)/����� &‚�������ٱ���Ǜ28����tw�>C�bf׮��V[�UZ���"�}��*0���6;�`d�IM�FK���=B�ptƒ�����_cң��ϝ���������Õ',د�����[`ǎ�Ŋ��+1ć��+0�^b̗������ܡAF�x|�FJƌ����Ƌ�������������ժ��VZ�!�TY�GL�AEթ�‚��W[�\`�Y]�IN���~n�tRNSB�����Y�IDATxڅ���3AE��8��߶m۶m�m>�~1�rK��3�R�5Z��F
�뀘ѩU�" cTWo�U	�;n�>�s��Xs���;���d4�"��/~��Q�3��!$����ȱf� ��օ@�t[i,�ȣ�����`������
<���c	܎г�9¾�@�GL�3@G�Ǚ�̺`;�q�EZ�Zi�
!w_n��
�M��lu{��e���Y�2�"�U����µ�f��[>�	��kx+R�;��^�6%����$�3�"S���;[��	d-b
�Oم�Z��R��;w�l
Sp~xr�s�����7<������u�H�'MHo�]�x� d���
���Un�\����EY�~��lxn>)�jqj��#����/�U�cy;�	�uvy@IEND�B`�PK�X��X4��brasil_de_fato.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BrasilDeFato(BasicNewsRecipe):
    news = True
    title = u'Brasil de Fato'
    __author__ = 'Alex Mitrani'
    description = u'Uma visão popular do Brasil e do mundo.'
    publisher = u'SOCIEDADE EDITORIAL BRASIL DE FATO'
    category = 'news, politics, Brazil, rss, Portuguese'
    oldest_article = 10
    max_articles_per_feed = 100
    summary_length = 1000
    language = 'pt_BR'

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    masthead_url = 'http://www.brasildefato.com.br/sites/default/files/zeropoint_logo.jpg'
    keep_only_tags = [dict(name='div', attrs={'id': 'main'})]
    remove_tags = [dict(name='div', attrs={'class': 'links'})]
    remove_tags_after = [dict(name='div', attrs={'class': 'links'})]

    feeds = [
    (u'Nacional', u'http://www.brasildefato.com.br/rss_nacional'),
    (u'Internacional', u'http://www.brasildefato.com.br/rss_internacional'),
    (u'Entrevista', u'http://www.brasildefato.com.br/rss_entrevista'),
    (u'Cultura', u'http://www.brasildefato.com.br/rss_cultura'),
    (u'Análise', u'http://www.brasildefato.com.br/rss_analise')
             ]
PK�X0}L5llbreaking_mad.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1467715002(BasicNewsRecipe):
    title = 'Breaking Mad'
    __author__ = 'bugmen00t'
    description = 'Breaking Mad - пока смерть не насмешит нас. Breakingmad - это агрегатор самых странных и драматичных новостей с жизнеутверждающим эффектом. Breakingmad - это все, что вы должны знать о России и не только.'  # noqa
    publisher = 'BreakingMad'
    category = 'news'
    cover_url = u'http://breakingmad.me/images/logo.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = False

    oldest_article = 100
    max_articles_per_feed = 50

    feeds = [
        ('Общий канал', 'http://breakingmad.me/ru/rss'),
        ('Страшное', 'http://breakingmad.me/ru/terrible/rss'),
        ('Смешное', 'http://breakingmad.me/ru/comedy/rss'),
        ('Странное', 'http://breakingmad.me/ru/weird/rss'),
        ('Популярное', 'http://breakingmad.me/ru/popular/rss'),
    ]

    remove_tags_before = dict(name='div', attrs={'class': 'news-row'})
    remove_tags_after = dict(name='div', attrs={'class': 'news-bottom'})
    remove_tags = [
        dict(name='div', attrs={
            'class': 'news-bottom-center'
        }),
        dict(name='span', attrs={
            'class': 'ico-link news-bottom-link'
        })
    ]
PK�X�LUx<<breakingmad.png�PNG


IHDR  D���3PLTE      %  $  #  #  "  $  $ # " ! " # # # 
88�tRNS 0@P`p��������#���IDATx�}�An!DѢ�a���A��µ}S�l��,zvi�r�ҩ��}��:C��n�D��
����_��f?!x�{��u�/��	���������
7�t��]wk���{� �LRip
jx��c�u����
I0_�4��d��L��W��8�0��e2�+i��IEND�B`�PK�XI�Ms��
brecha.png�PNG


IHDR  D���PLTE������			�����������������縸������ҽ��������������hhh999�������Y�i���	LLL���J	%%%HHHsss(((���������������YYYNNN�paaa���X������������qqq������PPP��𓓓��������ӂ��iii   fff���***��Φ��yyy<<<���������������KKK������666555������zzz�Z��tRNS@��f!IDATxڽ҃��@���QP����m��_�N֙T?��84��=�����u�W{�-���^�ٹO,���oi�2�-��g�B��
��X�H;A����Uͮ��(��l�gƈXi�ȕ��ã����6(۹q�1���j�@ajz&?n^
jD�D�u�H4
�WV����Ex"�ȟ/�c6I�#�ns+��wl���Q�^m��`c����0'�g��lpA�}�l!�&ĥ�1W��@��m��zQy�]��ߜ�BzZR�|G_�	ӏ#�uK�IEND�B`�PK�XGZM
brecha.recipefrom __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.brecha.com.uy
'''

try:
    from urllib.parse import urlencode, quote
except ImportError:
    from urllib import urlencode, quote
from calibre.web.feeds.news import BasicNewsRecipe


class Brecha(BasicNewsRecipe):
    title = 'Brecha Digital'
    __author__ = 'Darko Miletic'
    description = 'Brecha , Cultura ,Sociales , Separatas, Lupas, Vueltas de Montevideo y toda la infomacion que caracteriza a este semanario'
    publisher = 'Brecha'
    category = 'brecha, digital, prensa, uruguay, semanario, sociedad, politica, cultura'
    oldest_article = 7
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'es_UY'
    remove_empty_feeds = True
    publication_type = 'magazine'
    auto_cleanup = True
    needs_subscription = 'optional'
    masthead_url = 'http://www.brecha.com.uy/templates/ja_nex/themes/orange/images/logo.png'
    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
    }

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('http://www.brecha.com.uy/index.php/acceder-miembros')
        if self.username is not None and self.password is not None:
            data = urlencode({'task': 'login', 'view': 'register', 'username': self.username, 'password': self.password
                                     })
            br.open(
                'http://www.brecha.com.uy/index.php/index.php?option=com_osemsc&controller=register', data)
        return br

    remove_tags = [
        dict(name=['meta', 'link']),
        dict(name='div', attrs={'id': 'js_ja'}),
        dict(name='ul', attrs={'class': 'actions'})
    ]
    remove_attributes = ['lang', 'border']

    feeds = [
        (u'Politica', u'http://www.brecha.com.uy/index.php/politica-uruguaya?format=feed&type=rss'),
        (u'Mundo', u'http://www.brecha.com.uy/index.php/mundo?format=feed&type=rss'),
        (u'Mapamundi', u'http://www.brecha.com.uy/index.php/mundo/mapamundi?format=feed&type=rss'),
        (u'Cultura', u'http://www.brecha.com.uy/index.php/cultura?format=feed&type=rss'),
        (u'Vueltas de Montevideo',
         u'http://www.brecha.com.uy/index.php/cultura/vueltas-de-montevideo?format=feed&type=rss'),
        (u'Secos y Mojados', u'http://www.brecha.com.uy/index.php/cultura/secos-y-mojados?format=feed&type=rss'),
        (u'Literarias', u'http://www.brecha.com.uy/index.php/cultura/literarias?format=feed&type=rss'),
        (u'Sociedad', u'http://www.brecha.com.uy/index.php/sociedad?format=feed&type=rss'),
        (u'Especiales', u'http://www.brecha.com.uy/index.php/especiales?format=feed&type=rss'),
        (u'Contratapa', u'http://www.brecha.com.uy/index.php/contratapa?format=feed&type=rss')
    ]

    def print_version(self, url):
        return url + '?tmpl=component&print=1&layout=default&page='

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.brecha.com.uy/index.php')
        for image in soup.findAll('img', alt=True):
            if image['alt'].startswith('Tapa '):
                return 'http://www.brecha.com.uy' + quote(image['src'])
        return None
PK�X��6 ��brewiarz.png�PNG


IHDR��h6�IDATx�
�M��Q@�~�׻�/�ÅP(�dd���djf�Rf2Q�J�
eB(\tp���~⦅�8�fk���;/�1\k�1�(᛺��m�=�~�WU�L2ٹ}ǶQB��[L��EQ@�YUX�h�6g��$�8BƬ�)��mӡgR,��}��{�$#SD�3�Vȍ���e��E���U34m]��Kxd2�a^9�͗�UL��ÀM皪�v���k{F�0�}[-�/��J�	-�qY���n�>�]?8O`�a������])�iמ�6v"&B����ڗX��Q�r�����'9����P9H��>���U�3�5Qp�Ϸ~��ƕ"�*��Ӈ屳G�]BB�6��?gu˔�oo�~x���o��o�۽)nN�_9�#b�E�8sv�����*��kW�}�a�q�a�AjI�/��XAi�U��g�9R�)�„��ۻ)�m6�֫�Z1�T
��ʌ}��8�|b�HÁ2����˷z�ao=�FĦ̔VH b@�T_��_I��oK1Ւ���q�m���})�?]���(16��x(�}e��o��.���{���dĀA.�z#�N���E&ٶ������G��g'h�s���9E�'��+a��w�c�G-+(�^f�Z��/�y&��IEND�B`�PK�X,X�eOObrewiarz.recipe#!/usr/bin/env python

from __future__ import print_function
__license__   = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe
import datetime
import re


class brewiarz(BasicNewsRecipe):
    title = u'Brewiarz'
    __author__ = 'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'
    description = u'Serwis poświęcony Liturgii Godzin (brewiarzowi) - formie codziennej modlitwy Kościoła katolickiego.'
    masthead_url = 'http://brewiarz.pl/images/logo2.gif'
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    publication_type = 'newspaper'
    next_days = 1

    def parse_index(self):
        dec2rom_dict = {"01": "i", "02": "ii", "03": "iii", "04": "iv",
                        "05": "v", "06": "vi", "07": "vii", "08": "viii",
                        "09": "ix", "10": "x", "11": "xi", "12": "xii"}

        weekday_dict = {"Sunday": "Niedziela", "Monday": "Poniedziałek", "Tuesday": "Wtorek",
                        "Wednesday": "Środa", "Thursday": "Czwartek", "Friday": "Piątek", "Saturday": "Sobota"}

        now = datetime.datetime.now()

        feeds = []
        for i in range(0, self.next_days):
            url_date = now + datetime.timedelta(days=i)
            url_date_month = url_date.strftime("%m")
            url_date_month_roman = dec2rom_dict[url_date_month]
            url_date_day = url_date.strftime("%d")
            url_date_year = url_date.strftime("%Y")[2:]
            url_date_weekday = url_date.strftime("%A")
            url_date_weekday_pl = weekday_dict[url_date_weekday]

            url = "http://brewiarz.pl/" + url_date_month_roman + "_" + \
                url_date_year + "/" + url_date_day + url_date_month + "/index.php3"
            articles = self.parse_pages(url)
            if articles:
                title = url_date_weekday_pl + " " + url_date_day + \
                    "." + url_date_month + "." + url_date_year
                feeds.append((title, articles))
            else:
                sectors = self.get_sectors(url)
                for subpage in sectors:
                    title = url_date_weekday_pl + " " + url_date_day + "." + \
                        url_date_month + "." + url_date_year + " - " + subpage.string
                    url = "http://brewiarz.pl/" + url_date_month_roman + "_" + url_date_year + \
                        "/" + url_date_day + url_date_month + \
                        "/" + subpage['href']
                    print(url)
                    articles = self.parse_pages(url)
                    if articles:
                        feeds.append((title, articles))
        return feeds

    def get_sectors(self, url):
        sectors = []
        soup = self.index_to_soup(url)
        sectors_table = soup.find(name='table', attrs={'width': '490'})
        sector_links = sectors_table.findAll(name='a')
        for sector_links_modified in sector_links:
            link_parent_text = sector_links_modified.findParent(
                name='div').text
            if link_parent_text:
                sector_links_modified.text = link_parent_text.text
            sectors.append(sector_links_modified)
        return sectors

    def parse_pages(self, url):
        current_articles = []
        soup = self.index_to_soup(url)
        www = soup.find(attrs={'class': 'www'})
        if www:
            box_title = www.find(text='Teksty LG')
            article_box_parent = box_title.findParent('ul')
            article_box_sibling = article_box_parent.findNextSibling('ul')
            for li in article_box_sibling.findAll('li'):
                link = li.find(name='a')
                ol = link.findNextSibling(name='ol')
                if ol:
                    sublinks = ol.findAll(name='a')
                    for sublink in sublinks:
                        link_title = self.tag_to_string(
                            link) + " - " + self.tag_to_string(sublink)
                        link_url_print = re.sub(
                            'php3', 'php3?kr=_druk&wr=lg&', sublink['href'])
                        link_url = url[:-10] + link_url_print
                        current_articles.append({'title': link_title,
                                                 'url': link_url, 'description': '', 'date': ''})
                else:
                    if link.findParent(name='ol'):
                        continue
                    else:
                        link_title = self.tag_to_string(link)
                        link_url_print = re.sub(
                            'php3', 'php3?kr=_druk&wr=lg&', link['href'])
                        link_url = url[:-10] + link_url_print
                        current_articles.append({'title': link_title,
                                                 'url': link_url, 'description': '', 'date': ''})
            return current_articles
        else:
            return None

    def preprocess_html(self, soup):
        footer = soup.find(name='a', attrs={'href': 'http://brewiarz.pl'})
        footer_parent = footer.findParent('div')
        footer_parent.extract()

        header = soup.find(text='http://brewiarz.pl')
        header_parent = header.findParent('div')
        header_parent.extract()

        subheader = soup.find(text='Kolor szat:').findParent('div')
        subheader.extract()

        color = soup.find('b')
        color.extract()

        cleaned = self.strip_tags(soup)

        div = cleaned.findAll(name='div')
        div[1].extract()
        div[2].extract()
        div[3].extract()

        return cleaned

    def strip_tags(self, soup_dirty):
        VALID_TAGS = ['p', 'div', 'br', 'b',
                      'a', 'title', 'head', 'html', 'body']

        for tag in soup_dirty.findAll(True):
            if tag.name not in VALID_TAGS:
                for i, x in enumerate(tag.parent.contents):
                    if x == tag:
                        break
                else:
                    print("Can't find", tag, "in", tag.parent)
                    continue
                for r in reversed(tag.contents):
                    tag.parent.insert(i, r)
                tag.extract()

        return soup_dirty
PK�X��Kzbrhat.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class Brhat(BasicNewsRecipe):
    title          = 'Brhat'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 365
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('Main', 'https://brhat.in/feed/'),
    ]
PK�X�[�|^^brigitte_de.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿tIME�;��WfIDATHǥ��K�@�!�R$�Uj��R�:'۹c��"�:g��?@��Y�8I�N�P���ҡ�I� y���~�{�rċ�=�/��^�P�N��b��	�T���t����0
a^p"��iH���@��VNM�h��\F�몺R��ж��������Q�%�Ft��'�q7�AH�y�AZP�Χ�Gx�?�Φ�\��q�:A�"I�W^���h#�<~�a��a��?=@w"Q�
G��_!@��hW�T��;
xP��D�$_���E�0?�)Ҙ��Q	���ĞV���ۨ�����
R�r�������w��Uk�ۙ��,X�/���Iq%tEXtdate:create2022-07-22T07:12:08+00:00���_%tEXtdate:modify2022-07-22T07:12:08+00:00��n�IEND�B`�PK�X�����brigitte_de.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe(BasicNewsRecipe):

    title = u'Brigitte.de'
    __author__ = 'schuster'
    oldest_article = 14
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'de'
    remove_javascript = True
    remove_empty_feeds = True
    timeout = 10
    cover_url = 'http://www.medienmilch.de/typo3temp/pics/Brigitte-Logo_d5feb4a6e4.jpg'
    masthead_url = 'http://www.medienmilch.de/typo3temp/pics/Brigitte-Logo_d5feb4a6e4.jpg'

    remove_tags = [dict(attrs={'class': ['linklist', 'head', 'indent right relatedContent', 'artikel-meta segment', 'segment', 'comment commentFormWrapper segment borderBG', 'segment borderBG comments', 'segment borderBG box', 'center', 'segment nextPageLink', 'inCar']}),  # noqa
                   dict(id=['header', 'artTools', 'context', 'interact',
                            'footer-navigation', 'bwNet', 'copy', 'keyboardNavigationHint']),
                   dict(name=['hjtrs', 'kud'])]

    feeds = [(u'Mode', u'http://www.brigitte.de/mode/feed.rss'),
             (u'Beauty', u'http://www.brigitte.de/beauty/feed.rss'),
             (u'Luxus', u'http://www.brigitte.de/luxus/feed.rss'),
             (u'Figur', u'http://www.brigitte.de/figur/feed.rss'),
             (u'Gesundheit', u'http://www.brigitte.de/gesundheit/feed.rss'),
             (u'Liebe&Sex', u'http://www.brigitte.de/liebe-sex/feed.rss'),
             (u'Gesellschaft', u'http://www.brigitte.de/gesellschaft/feed.rss'),
             (u'Kultur', u'http://www.brigitte.de/kultur/feed.rss'),
             (u'Reise', u'http://www.brigitte.de/reise/feed.rss'),
             (u'Kochen', u'http://www.brigitte.de/kochen/feed.rss'),
             (u'Wohnen', u'http://www.brigitte.de/wohnen/feed.rss'),
             (u'Job', u'http://www.brigitte.de/job/feed.rss'),
             (u'Erfahrungen', u'http://www.brigitte.de/erfahrungen/feed.rss'),
             ]
PK�X��@��bsi_news.png�PNG


IHDR  D����PLTETTT___kkk�������������PPPQQQRRR]]]^^^555dddeeeiiijjj???���������������������������������������������������CCC������GGGJJJ������KKKOOO666999���������:::@@@������������������HHH������������������MMM���������"""SSS������������###XXX$$$***---���```aaa...333���444���������������LLL���   III���������������������NNN,,,000222UUU���WWWYYY[���[[[���\���\\\���������			888������������������ccc���;;;������fff���������ggg���������������hhhjBBB������nnnpppuuu���������������������wwwyyy������zzz{{{}}}DDD����������������&������������������������М�����EEEFFF�S��IDATx���Cc]A�y�m�2�mۮm۶m۶m��vr��q��}��უ-`���K5LVX�q����Wk[B|�n�^����H7����hƖs��	�u�E��A�����ڗ��n�2ǡzV?�zr�L@٭�r]۪\��b�s���
�/���٣�:�,dM�%���S��w��~���OahT	`���M�����������bde#`�l��f�tq�p��%ܳ�'���&WD�?���ӫV*ڥ]�s� r�;Q@Д6��
x!�v�b����ID��h��X��t���v'�T�E4�0��p��bFW+� �>��jD�t?�ܴjI�i�N�6#�1*�7��^OyB*�U���z�S��W�_P��P�K��6�o*�7ɹ���@���7�b�朂�Qy�3�方:ag��>�O��d��!i�a�v������?�
�5a�˚f���c�1Tf&��	��X����|�7C໡
���IEND�B`�PK�X3��
�
bsi_news.recipe#!/usr/bin/env python
from __future__ import absolute_import, division, print_function, unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


class germanyBSI(BasicNewsRecipe):
    # Title of the Recipe
    # title = 'News des Bundesamt für Sicherheit in der Informationstechnik'
    title = 'BSI News - DE'
    cover_url = 'https://www.bsi.bund.de/SiteGlobals/Frontend/Images/BSI/logo.png'
    # Author
    __author__ = 'Volker Heggemann, VoHe'
    # oldest article to download (in days) 									---- can be edit by user
    oldest_article = 7
    # describes itself, 						 							---- can be edit by user
    max_articles_per_feed = 100
    # speed up the download on fast computers be careful (I test max.20)
    # ---- can be edit by user
    simultaneous_downloads = 10
    # description, some Reader show this in titlepage
    description = u'News from BSI'
    # Who published the content?
    publisher = u'Newsfeeds des BSI'
    # What is the content of?
    category = u'Sie erfahren, wenn neue Nachrichten auf der Internetseite des BSI veröffentlicht werden'
    # describes itself, 						 							---- can be edit by user
    use_embedded_content = False
    # describes itself, 						 							---- can be edit by user
    language = 'de'
    # encoding of content. e.g. utf-8, None, ...
    # ---- can be edit by user
    encoding = None  # 'utf-8' doesn't work here
    # Removes javascript- why keep this, we only want static content
    remove_javascript = True
    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True

    # remove the rubbish (in ebook)
    auto_cleanup = True
    # now the content description and URL follows
    # feel free to add, wipe out what you need	 							---- can be edit by user
    #
    # some of this are double
    #
    #
    # Make some tests, may you first comment all of them out, and step by step you add what you'll need?
    #

    feeds = [
        ('BSI - Germany - Sicherheitshinweise des Buerger-CERT',
         'https://www.bsi-fuer-buerger.de/SiteGlobals/Functions/RSSFeed/RSSNewsfessBSIFB/RSSNewsfeed_BuergerCERT.xml'
         ),
        ('BSI - Germany - Aktuelle Informationen BSI f\xfcr B\xfcrger',
         'https://www.bsi-fuer-buerger.de/SiteGlobals/Functions/RSSFeed/RSSNewsfessBSIFB/RSSNewsfeed_Buerger_aktuelle_Informationen.xml'
         ),
        ('Kurzinformationen des CERT-Bund zu Sicherheitsl\xfccken und Schwachstellen in IT-Systemen',
         'https://www.bsi.bund.de/SiteGlobals/Functions/RSSFeed/RSSNewsfeed/RSSNewsfeed_WID.xml'
         ),
        ('BSI - Germany - RSS-Newsfeed (Presse-, Kurzmitteilungen und Veranstaltungshinweise)',
         'https://www.bsi.bund.de/SiteGlobals/Functions/RSSFeed/RSSNewsfeed/RSSNewsfeed.xml'
         ),
    ]
PK�X�('‘�	bt_dk.png�PNG


IHDR���R!PLTE��AA�QQ�aa������������������T�E+IDAT[c` p��\��j�*�n��VE���23�R
 YQf��3�IEND�B`�PK�Xǃ�9eebt_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
BT Nyheder
'''


class Bt_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'BT Nyheder'
    category              = 'newspaper, news, localnews, sport, politics, health, entertainment, music, crime, cars, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://www.bt.dk/rss-feeds
    feeds = [
        ('Top nyheder', 'http://www.bt.dk/bt/top/rss'),
        ('Seneste nyheder', 'http://www.bt.dk/nyheder/seneste/rss'),
        ('Underholdning', 'http://www.bt.dk/underholdning/seneste/rss'),
        ('Forbrug', 'http://www.bt.dk/forbrug/seneste/rss'),
        ('Sundhed', 'http://www.bt.dk/sundhed/seneste/rss'),
        ('Krimi', 'http://www.bt.dk/krimi/seneste/rss'),
        ('Politik', 'http://www.bt.dk/politik/seneste/rss'),
        ('Misik', 'http://www.bt.dk/musik/seneste/rss'),
        ('Utroligt', 'http://www.bt.dk/utroligt/seneste/rss'),
        ('Biler', 'http://www.bt.dk/biler/seneste/rss'),
        ('Digital', 'http://www.bt.dk/digital/seneste/rss'),
    ]
PK�X0Ĭ���
bucataras.png�PNG


IHDR��h6qIDATx5�kKa�s����YK�LS"�$A���f��~XE}�� 3��ԨB3�\��8�3��$����p�A�%���0��
��*]ۺ�2(�����	P��c��#C��WlI��1�D���FF�w�:o]eM!P��%��Q0!�!�����{ �7�1V1�����8B�*�1�<[�]Ϻ�X���H194�ĉ5���3��*�my`�R�?���~��������@D��hfyK���zC�����������廭NVdO���\X�;7�<� K���#D��^�^9sn*�r�Tz����Ƨ�/�H��R"3�`"D��+���[����l�Y]��������DM�Di!�ܽA�����|����<�7�ݵo�QVۻ�A��j.|�ZK��g������=��G��N� 9����K�cdm]u���2�Ȇ���z_ڇ�ge"eTK1���v��?7o\������0_�#��}����f�#�DFC�"/MU�w=�u:0rZ]�z]j���mt��>��q��X��J�B�p�Nkq���N<�W�=h�O�PV�yUK����y�}�zmsg�k1�cS�(�x��i4�IEND�B`�PK�X�oМ��bucataras.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
bucataras.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Bucataras(BasicNewsRecipe):
    title = u'Bucataras'
    __author__ = u'Silviu Cotoar\u0103'
    description = ''
    publisher = 'Bucataras'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Bucatarie,Retete'
    encoding = 'utf-8'
    cover_url = 'http://www.bucataras.ro/templates/default/images/pink/logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'titlu'}), dict(name='div', attrs={
            'class': 'contentL'}), dict(name='div', attrs={'class': 'contentBottom'})

    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['sociale']}), dict(name='div', attrs={'class': ['contentR']}), dict(
            name='a', attrs={'target': ['_self']}), dict(name='div', attrs={'class': ['comentarii']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['comentarii']})
    ]

    feeds = [
        (u'Feeds', u'http://www.bucataras.ro/rss/retete/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�N�@��buchreport.png�PNG


IHDR  ��tRNSn��	pHYs��nIDATH��_HSQ��Ӆ�c���!b�DQAH/BI���ė�0�(z1H�%��T�(�ϛAF�%�Dl;��M�S7��v�]��{��ڌ��:��ٹ�s~�����(SI��7�M+
�V"8�5�V�hu`/�\Q:����Woȳ.�'
�}/�m)��@{�:�?f�����:6,6�,
�]̓���_�x� �Uk.��F�A�:D��T �[���:9���΢.�r����S`by����[uT��ÿt��+��!D�C�Qz�^�(Q��Qrs�ڻaY���I@�u�t�a�v!�(&���6��k�Z}3(��P�s�`%����Nc��8�8�a�
������k���I~�Z
�(�X��H������K&�3��)�(�����%�R������ZD���֚/�ߧ��0Ѷ/��^I�[-���՗À��S����Y����`�F�ZH�M-n�,�N5���"#�ĊJ�b�z���
� >v��D*��Foc���Y��W�grqɳ�f6%��J�zkj�K+�v@�8����ոo��`"�<�Hg���Q}Sv�`�

���3�E��I�9`~�Q�v����>����F�,v�JF�t��a���Ir����a���hש�.5���Z�^�&���>9dž2�z��5_(`��3S�JJQ֣�������X!�������q4 ��8��M�ɩ���D�i�#�����<�
Q-Q�'�i��JFbh�e~��Kzg�T��;�x�w�y��i�l���E�Бxh�`�dCWص:qE�)]m�j����������f{1�F! ��=��-����~jc[�
\ )IEND�B`�PK�X�ٝMMbuchreport.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe

'''Calibre recipe to convert the RSS feeds of the Buchreport to an ebook.'''


class Buchreport(BasicNewsRecipe):
    __author__ = 'a.peter'
    __copyright__ = 'a.peter'
    __license__ = 'GPL v3'
    description = 'Buchreport'
    version = 4
    title = u'Buchreport'
    timefmt = ' [%d.%m.%Y]'
    encoding = 'cp1252'
    language = 'de'

    extra_css = 'body  { margin-left: 0.00em; margin-right: 0.00em; } \
                     article, articledate, articledescription { text-align: left; } \
                     h1 { text-align: left; font-size: 140%; font-weight: bold; } \
                     h2 { text-align: left; font-size: 100%; font-weight: bold; font-style: italic; } \
                     h3 { text-align: left; font-size: 100%; font-weight: regular; font-style: italic; } \
                     h4, h5, h6 { text-align: left; font-size: 100%; font-weight: bold; }'

    oldest_article = 7.0
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    publication_type = 'newspaper'

    remove_tags_before = dict(name='h2')
    remove_tags_after = [
        dict(name='div', attrs={'style': ["padding-top:10px;clear:both"]})
    ]
    remove_tags = [
        dict(name='div', attrs={'style': ["padding-top:10px;clear:both"]}),
        dict(name='iframe'),
        dict(name='img')
    ]

    feeds = [
        (u'Buchreport', u'http://www.buchreport.de/index.php?id=5&type=100')
    ]

    def get_masthead_url(self):
        return 'http://www.buchreport.de/fileadmin/template/img/buchreport_logo.jpg'
PK�X�	��[[buckmasters.png�PNG


IHDR  ��tRNSn��IDATHKcxg�Lzc����ᜑ�JM�iyU.nFFF<���x�[K�^Cm)iann&\�4�`�<���ES�YMCGR����V������(/
-"Uu)~~ZD����|4��l�U�88hh��231��uMhd0��靹.��a������6d&#�
�~��{}.��\T�}+���c�o쓀��=cy�4�Z`�4�������7��Oùw0.†>`H�@Ȃ�J�A�A��O��0,��&��؂��Y��!�-�Am�߿�O����~������Et�CZY���O�]O�>�"�G+g\X|Ű���9��t�E��D�f��D�&��s�y������}*9��C���ep�a����3�g\�d&�o:��f�a�,i�X"�,`�B�,L=�,PqM+��0J�̂�W�ݡU&�-ƭ_3m,�^���l0d�nG6�j����p���,Xp��}7�o64�`�-�3%��c���
sRZ�	O�IEND�B`�PK�X�����buckmasters.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class AdvancedUserRecipe1282101454(BasicNewsRecipe):
    title = 'BuckMasters In The Kitchen'
    language = 'en'
    __author__ = 'TonytheBookworm & Starson17'
    description = 'Learn how to cook all those outdoor varments'
    publisher = 'BuckMasters.com'
    category = 'food,cooking,recipes'
    oldest_article = 365
    max_articles_per_feed = 100
    conversion_options = {'linearize_tables': True}
    masthead_url = 'http://www.buckmasters.com/Portals/_default/Skins/BM_10/images/header_bg.jpg'
    keep_only_tags = [
        dict(name='table', attrs={'class': ['containermaster_black']})
    ]
    remove_tags_after = [dict(name='div', attrs={'align': ['left']})]
    feeds = [
        ('Recipes', 'http://www.buckmasters.com/DesktopModules/DnnForge%20-%20NewsArticles/RSS.aspx?TabID=292&ModuleID=658&MaxCount=25'),
    ]

    def preprocess_html(self, soup):
        item = soup.find('a', attrs={'class': ['MenuTopSelected']})
        if item:
            item.parent.extract()
        for img_tag in soup.findAll('img'):
            parent_tag = img_tag.parent
            if parent_tag.name == 'a':
                ntag = new_tag(soup, 'p')
                ntag.insert(0, img_tag)
                parent_tag.replaceWith(ntag)
            elif parent_tag.name == 'p':
                if not self.tag_to_string(parent_tag) == '':
                    new_div = new_tag(soup, 'div')
                    ntag = new_tag(soup, 'p')
                    ntag.insert(0, img_tag)
                    parent_tag.replaceWith(new_div)
                    new_div.insert(0, ntag)
                    new_div.insert(1, parent_tag)
        return soup
PK�Xj]�M��buenosaireseconomico.png�PNG


IHDR��h6LIDATx�c�O" ]C����D@��~<}�z㶷;��ݾ����������w��[@��?����f��{�ٴ���w�}?�k�d����v�ޟ�_Κ�]�J����ɤi�L,��b����2���礡��I3���}��כ���{�t�Y ����M�AY���ϟ@
�O��-��_�v9 ���wKk���{LZ���
'4�^�\{35h'ÿ?N��X���
O&L{����#������2~����
�O��20�ST�l��N�w�j�͚�|�c2j@�߫i<e`�n��'�<����1=s�L�b��LJ����7��>nIEND�B`�PK�X�똈��buenosaireseconomico.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2009-2016, Darko Miletic <darko.miletic at gmail.com>'
'''
www.diariobae.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class BsAsEconomico(BasicNewsRecipe):
    title = 'Buenos Aires Economico'
    __author__ = 'Darko Miletic'
    description = 'Diario BAE es el diario economico-politico con mas influencia en la Argentina. Fuente de empresarios y politicos del pais y el exterior. El pozo estaria aportando en periodos breves un volumen equivalente a 800m3 diarios. Pero todavia deben efectuarse otras perforaciones adicionales.'  # noqa
    publisher = 'Diario BAE'
    category = 'news, politics, economy, Argentina'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'es_AR'
    masthead_url = 'http://static.cronica.com.ar/FileAccessHandler.ashx?code=635959869637084622'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    extra_css             = """
                               body{font-family: Georgia,"Times New Roman",Times,serif}
                               img{display: block; margin-top: 1em}
                            """
    conversion_options = {
        'comment'  : description,
        'tags'     : category,
        'publisher': publisher,
        'language' : language
    }

    keep_only_tags = [dict(name='div', attrs={'class':'post'})]
    remove_tags = [
                    dict(name=['meta', 'base', 'iframe', 'link', 'lang'])
                    ,dict(attrs={'class':'pdfprnt-bottom-right'})
                  ]

    feeds = [(u'Articles', u'http://www.diariobae.com/feed/getfeed')]

    def get_cover_url(self):
        cover = None
        soup = self.index_to_soup('http://www.diariobae.com/')
        tag = soup.find('a', rel='lightbox[tapa]', href=True)
        if tag:
            cover = tag['href']
        return cover
PK�X��_
_
buffalo_news.recipe__license__ = 'GPL v3'
__author__ = 'Todd Chapman'
__copyright__ = 'Todd Chapman'
__version__ = 'v0.2'
__date__ = '2 March 2011'

'''
http://www.buffalonews.com/RSS/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class BuffaloNews(BasicNewsRecipe):
    title = u'Buffalo News'
    oldest_article = 2
    language = 'en'
    __author__ = 'ChappyOnIce, Krittika Goyal'
    max_articles_per_feed = 20
    encoding = 'utf-8'
    masthead_url = 'http://www.buffalonews.com/buffalonews/skins/buffalonews/images/masthead/the_buffalo_news_logo.png'
    auto_cleanup = True
    remove_empty_feeds = True

    feeds = [
        (u'City of Buffalo', u'http://www.buffalonews.com/city/communities/buffalo/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Southern Erie County',
         u'http://www.buffalonews.com/city/communities/southern-erie/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Eastern Erie County', u'http://www.buffalonews.com/city/communities/eastern-erie/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Southern Tier', u'http://www.buffalonews.com/city/communities/southern-tier/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Niagara County', u'http://www.buffalonews.com/city/communities/niagara-county/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Business', u'http://www.buffalonews.com/business/?widget=rssfeed&view=feed&contentId=77944'),
        (u'MoneySmart', u'http://www.buffalonews.com/business/moneysmart/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Bills & NFL', u'http://www.buffalonews.com/sports/bills-nfl/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Sabres & NHL', u'http://www.buffalonews.com/sports/sabres-nhl/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Bob DiCesare', u'http://www.buffalonews.com/sports/columns/bob-dicesare/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Bucky Gleason', u'http://www.buffalonews.com/sports/columns/bucky-gleason/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Mark Gaughan', u'http://www.buffalonews.com/sports/bills-nfl/inside-the-nfl/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Mike Harrington', u'http://www.buffalonews.com/sports/columns/mike-harrington/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Jerry Sullivan', u'http://www.buffalonews.com/sports/columns/jerry-sullivan/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Other Sports Columns', u'http://www.buffalonews.com/sports/columns/other-sports-columns/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Life', u'http://www.buffalonews.com/life/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Bruce Andriatch', u'http://www.buffalonews.com/city/columns/bruce-andriatch/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Donn Esmonde', u'http://www.buffalonews.com/city/columns/donn-esmonde/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Rod Watson', u'http://www.buffalonews.com/city/columns/rod-watson/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Entertainment', u'http://www.buffalonews.com/entertainment/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Off Main Street', u'http://www.buffalonews.com/city/columns/off-main-street/?widget=rssfeed&view=feed&contentId=77944'),
        (u'Editorials', u'http://www.buffalonews.com/editorial-page/buffalo-news-editorials/?widget=rssfeed&view=feed&contentId=77944')
    ]
PK�XK���buffalonews.png�PNG


IHDR  V%(	pHYs��~�<IDAT��͋�Q��}��Q2q�;K�f��f�����B����,Y*[��HH�(�L2E)j�l,�ݏ�KJ�:�)1U�+��Tj;JU5��s‚gFB�W(�K
e�K.��L�4UU�,۔Jg�s}釾��Ng�wRj(�o�sF���e��:��:!5���]Ϣ[6ܱ�
��Y�RC��F�[rӶ�V�p�*RC	���SXt�!+V��JU�yohh�E�<�!5�4��@��u�����P��S��w�Lz�
~
��L4��i쫹Nu�Uj�⤞���P��8n�'RK�E�-5����0�~��YnѴzIEND�B`�PK�X��+��bugun_gazetesi.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class Bugun (BasicNewsRecipe):

    title = u'BUGÜN Gazetesi'
    __author__ = u'thomass'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    encoding = 'UTF-8'
    publisher = 'thomass'
    category = 'news, haberler,TR,gazete'
    language = 'tr'
    publication_type = 'newspaper '
    # h1{ font-size:10%;font-weight: bold} '#ctl00_ortayer_haberBaslik{
    # 'font-size:10%;font-weight: bold'}
    extra_css = ' div{font-size: small} h2{font-size: small;font-weight: bold} #ctl00_ortayer_haberBaslik{font-size:20px;font-weight: bold} '
    # introduction{} .story-feature{display: block; padding: 0; border: 1px
    # solid; width: 40%; font-size: small} .story-feature h2{text-align:
    # center; text-transform: uppercase} '
    conversion_options = {
        'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }
    cover_img_url = 'http://www.bugun.com.tr/images/bugunLogo2011.png'
    masthead_url = 'http://www.bugun.com.tr/images/bugunLogo2011.png'

    keep_only_tags = [dict(name='h1', attrs={'class': ['haberBaslik']}), dict(name='h2', attrs={'class': ['haberOzet']}), dict(
        name='div', attrs={'class': ['haberGriDivvvv']}), dict(name='div', attrs={'id': ['haberTextDiv']}), ]

    remove_empty_feeds = True

    feeds = [
        (u'Son Dakika', u'http://www.bugun.com.tr/haberler.xml'),
        (u'Yazarlar', u'http://www.bugun.com.tr/rss/yazarlar.xml'),
        (u'Gündem', u'http://www.bugun.com.tr/rss/gundem.xml'),
        (u'Ekonomi', u'http://www.bugun.com.tr/rss/ekonomi.xml'),
        (u'Spor', u'http://www.bugun.com.tr/rss/spor.xml'),
        (u'Magazin', u'http://www.bugun.com.tr/rss/magazin.xml'),
        (u'Teknoloji', u'http://www.bugun.com.tr/rss/teknoloji.xml'),
        (u'Yaşam', u'http://www.bugun.com.tr/rss/yasam.xml'),
        (u'Medya', u'http://www.bugun.com.tr/rss/medya.xml'),
        (u'Dünya', u'http://www.bugun.com.tr/rss/dunya.xml'),
        (u'Politika', u'http://www.bugun.com.tr/rss/politika.xml'),
        (u'Sağlık', u'http://www.bugun.com.tr/rss/saglik.xml'),
        (u'Tarifler', u'http://www.bugun.com.tr/rss/yemek-tarifi.xml'),




    ]
PK�X���;MMbusiness_insider.png�PNG


IHDR��h6IDATx�c��ϱ�J�@@�&h�n��`���A@���	&�0	��;��gN�*�H�i�Nʍ
V��`bdbdd�QQ*�
�^S7��bdbb���6
O=}���/_3[���n?|r��S�ðT ꚿ������-c�@102���(��˷+wl9|BYVJMA�����������@ =@Q0���?�~��#XP$�e��
����rq�h�/۾����0� \�Wq�����exZ�={��� : ��b ��ϟ�6�,읱�����蜈�yP�2��� �W�}?gÎ���E{:���@���@`��~��u��ufff=5% �g�,��b@���7 ���w`�f���4;+� /� ?����ɫ7/ݹT�������Y��u4����H7�¨����/ߴ�_���o59
�g��J�
[�i
��2��T٤��uj�Cf�oI�MZ)�"�e6ie�i��YU^�.95.�@T�S�D��`v
�@D�l�ς:F�ߜ]�	IEND�B`�PK�X��4�\	\	business_insider.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.businessinsider.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Business_insider(BasicNewsRecipe):
    title = 'Business Insider'
    __author__ = 'Darko Miletic'
    description = 'Noticias de Argentina y el resto del mundo'
    publisher = 'Business Insider, Inc.'
    category = 'news, politics, finances, world'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = True
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    masthead_url = 'http://static.businessinsider.com/assets/images/logos/tbi_print.jpg'
    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
    }

    remove_tags = [
        dict(name=['meta', 'link']), dict(attrs={'class': 'feedflare'})
    ]
    remove_attributes = ['lang', 'border']

    feeds = [

    (u'Latest', u'http://feeds2.feedburner.com/businessinsider'),
    (u'Markets', u'http://feeds.feedburner.com/TheMoneyGame'),
    (u'Wall Street', u'http://feeds.feedburner.com/clusterstock'),
    (u'Tech', u'http://feeds.feedburner.com/typepad/alleyinsider/silicon_alley_insider'),
    (u'The Wire', u'http://feeds.feedburner.com/businessinsider/thewire'),
    (u'War Room', u'http://feeds.feedburner.com/businessinsider/warroom'),
    (u'Sports', u'http://feeds.feedburner.com/businessinsider/sportspage'),
    (u'Tools', u'http://feeds.feedburner.com/businessinsider/tools'),
    (u'Travel', u'http://feeds.feedburner.com/businessinsider/travel')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll('a'):
            if item['href'].startswith('http://feedads'):
                item.extract()
            else:
                if item.string is not None:
                    tstr = item.string
                    item.replaceWith(tstr)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�XC�b��business_standard.png�PNG


IHDR��h6�IDATx��QD��BTD���AA��B�*B�@����@@���έ�������j����fi�C��Y���Sġ$,�c}J8
mi�xX�����	1e(\�F`m$$�TX�!��C�$��$�"���	2(���M;�U\���@�&�'�u�,��y�d����oXp�j��.�m�`�>8کin�r���gM�ڿ%��������r���έlXH-"&Ȭ����}\?_��,�ҵ��\�郷����_�F/Σ�ǁp�~�����MQ�т����܍+;�5�5aD��'!s� D�����Ӷ�d�����8��%#/��z��^=3b��!1��7�m�ܬ�?�6����$�'�N����4��o
-�!&x��L���/����j\8~��#��_:ss�f�wo�)a�Wzu�b���m3~�7w����+�X�n�vg����Q6-"��S����M�n��ο_��D���|��^�wx��]t����J#��HTz�p��6
nui��S����}9�e^��Ņ��'�9ۿۅ)CI~@��Y�vĄE2��H��c���� #�Jf�u������$�b�
���hG��x�,AB�ct�4�Q�g�ߠ��.�e
n�37IIEND�B`�PK�XH0B��business_standard.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile
from html5_parser import parse
from datetime import datetime
import json

class BusinessStandard(BasicNewsRecipe):
    title = 'Business Standard'
    __author__ = 'unkn0wn'
    description = "India's most respected business daily"
    language = 'en_IN'
    masthead_url = 'https://bsmedia.business-standard.com/include/_mod/site/html5/images/business-standard-logo.png'

    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['width', 'height', 'float', 'style']

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.magzter.com/IN/Business-Standard-Private-Ltd/Business-Standard/Newspaper/')
        for citem in soup.findAll('meta', content=lambda s: s and s.endswith('view/3.jpg')):
            return citem['content']

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based')

    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    resolve_internal_links = True
    max_articles_per_feed = 20

    extra_css = '''
        img {display:block; margin:0 auto;}
        .auth, .cat { font-size:small; color:#202020; }
        .cap { font-size:small; text-align:center; }
    '''

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        soup = self.index_to_soup(url)
        link = soup.find('a', attrs={'href':lambda x: x and x.startswith('https://www.business-standard.com')})
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/multimedia/',
        ]
        if any(x in link['href'] for x in skip_sections):
            self.abort_article('skipping video links ', link['href'])
        self.log('Found ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = []

    sections = [
        'india-news', 'economy', 'opinion', 'markets', 'companies', 'industry', 'finance', 'world-news',
    #    'politics', 'cricket', 'sports', 'technology', 'book', 'education', 'specials'
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:business-standard.com{}&hl=en-IN&gl=IN&ceid=IN:en'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    # feeds.append(('Others', a.format('')))

    def preprocess_raw_html(self, raw, *a):
        root = parse(raw)
        m = root.xpath('//script[@id="__NEXT_DATA__"]')

        data = json.loads(m[0].text)

        img_url = None
        if 'articleImageUrl' in data['props']['pageProps']['articleSchema']:
            img_url = data['props']['pageProps']['articleSchema']['articleImageUrl']

        art_url = 'https://www.business-standard.com' + data['props']['pageProps']['url']

        data = data['props']['pageProps']['data']

        title = '<h1 title="{}">'.format(art_url) + data['pageTitle'] + '</h1>'

        cat = subhead = lede = auth = caption = ''

        if 'defaultArticleCat' in data and data['defaultArticleCat'] is not None:
            if 'h1_tag' in data['defaultArticleCat'] and data['defaultArticleCat']['h1_tag'] is not None:
                cat = '<div><p class="cat">' + data['defaultArticleCat']['h1_tag'] + '</p></div>'

        if 'metaDescription' in data and data['metaDescription'] is not None:
            subhead = '<h3>' + data['metaDescription'] + '</h3>'
            self.art_desc = data['metaDescription']

        date = (datetime.fromtimestamp(int(data['publishDate']))).strftime('%b %d, %Y | %I:%M %p')

        authors = []
        if 'articleMappedMultipleAuthors' in data:	
            for aut in data['articleMappedMultipleAuthors']:
                authors.append(data['articleMappedMultipleAuthors'][str(aut)]) 
        auth = '<div><p class="auth">' + ', '.join(authors) + ' | ' + data['placeName'] + ' | ' + date + '</p></div>'

        if 'featuredImageObj' in data:
            if 'url' in data['featuredImageObj']:
                if img_url is not None:
                    lede = '<p class="cap"><img src="{}">'.format(img_url)
                else:
                    lede = '<p class="cap"><img src="{}">'.format(data['featuredImageObj']['url'])
            if 'alt_text' in data['featuredImageObj']:
                caption = '<span>' + data['featuredImageObj']['alt_text'] + '</span></p>'

        body = data['htmlContent']

        return '<html><body>' + cat + title + subhead + auth + lede + caption + '<div><p></p>' + body + '</div></body></html>'

    def populate_article_metadata(self, article, soup, first):
        article.url = soup.find('h1')['title']
        article.summary = self.tag_to_string(soup.find('h3'))
        article.text_summary = self.tag_to_string(soup.find('h3'))
        article.title = article.title.replace(' - Business Standard', '')
PK�XC�b��business_standard_print.png�PNG


IHDR��h6�IDATx��QD��BTD���AA��B�*B�@����@@���έ�������j����fi�C��Y���Sġ$,�c}J8
mi�xX�����	1e(\�F`m$$�TX�!��C�$��$�"���	2(���M;�U\���@�&�'�u�,��y�d����oXp�j��.�m�`�>8کin�r���gM�ڿ%��������r���έlXH-"&Ȭ����}\?_��,�ҵ��\�郷����_�F/Σ�ǁp�~�����MQ�т����܍+;�5�5aD��'!s� D�����Ӷ�d�����8��%#/��z��^=3b��!1��7�m�ܬ�?�6����$�'�N����4��o
-�!&x��L���/����j\8~��#��_:ss�f�wo�)a�Wzu�b���m3~�7w����+�X�n�vg����Q6-"��S����M�n��ο_��D���|��^�wx��]t����J#��HTz�p��6
nui��S����}9�e^��Ņ��'�9ۿۅ)CI~@��Y�vĄE2��H��c���� #�Jf�u������$�b�
���hG��x�,AB�ct�4�Q�g�ߠ��.�e
n�37IIEND�B`�PK�Xgy�_��business_standard_print.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from html5_parser import parse
from datetime import datetime
import json

today = datetime.today().strftime('%d-%m-%Y')

# today = '20-09-2023'

day, month, year = (int(x) for x in today.split('-'))
dt = datetime(year, month, day)

class BusinessStandardPrint(BasicNewsRecipe):
    title = 'Business Standard Print Edition'
    __author__ = 'unkn0wn'
    description = "India's most respected business daily, Articles from Today's Paper"
    language = 'en_IN'
    masthead_url = 'https://bsmedia.business-standard.com/include/_mod/site/html5/images/business-standard-logo.png'
    encoding = 'utf-8'
    timefmt = ' [' + dt.strftime('%b %d, %Y') + ']'
    resolve_internal_links = True
    remove_empty_feeds = True

    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['width', 'height', 'float', 'style']

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            self.title = 'Business Standard ' + dt.strftime('%b %d, %Y')

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based')

    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    resolve_internal_links = True

    extra_css = '''
        img {display:block; margin:0 auto;}
        .auth, .cat { font-size:small; color:#202020; }
        .cap { font-size:small; text-align:center; }
    '''

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.magzter.com/IN/Business-Standard-Private-Ltd/Business-Standard/Newspaper/')
        for citem in soup.findAll('meta', content=lambda s: s and s.endswith('view/3.jpg')):
            return citem['content']

    def parse_index(self):
        if dt.weekday() == 6:
            self.log.warn(
                'Business Standard Does Not Have A Print Publication On Sunday. The Reports'
                ' And Columns On This Page Today Appeared In The Newspaper\'s Saturday Edition.'
            )
        url = 'https://apibs.business-standard.com/category/today-paper?sortBy=' + today
        raw = self.index_to_soup(url, raw=True)
        data = json.loads(raw)
        data = data['data']

        feeds = []

        for section in data:
            if section == 'EpaperImage':
                continue
            self.log(section)
            articles = []
            for article in data[section]:
                title = article['heading1']
                desc = article['sub_heading']
                url = 'https://www.business-standard.com' + article['article_url']
                self.log('\t', title, '\n\t', desc, '\n\t\t', url)
                articles.append({'title': title, 'description':desc, 'url': url})
            if articles:
                feeds.append((section, articles))
        return feeds

    def preprocess_raw_html(self, raw, *a):
        root = parse(raw)
        m = root.xpath('//script[@id="__NEXT_DATA__"]')

        data = json.loads(m[0].text)

        img_url = None
        if 'articleImageUrl' in data['props']['pageProps']['articleSchema']:
            img_url = data['props']['pageProps']['articleSchema']['articleImageUrl']

        art_url = 'https://www.business-standard.com' + data['props']['pageProps']['url']

        data = data['props']['pageProps']['data']

        title = '<h1 title="{}">'.format(art_url) + data['pageTitle'] + '</h1>'

        cat = subhead = lede = auth = caption = ''

        if 'defaultArticleCat' in data and data['defaultArticleCat'] is not None:
            if 'h1_tag' in data['defaultArticleCat'] and data['defaultArticleCat']['h1_tag'] is not None:
                cat = '<div><p class="cat">' + data['defaultArticleCat']['h1_tag'] + '</p></div>'

        if 'metaDescription' in data and data['metaDescription'] is not None:
            subhead = '<h3>' + data['metaDescription'] + '</h3>'
            self.art_desc = data['metaDescription']

        date = (datetime.fromtimestamp(int(data['publishDate']))).strftime('%b %d, %Y | %I:%M %p')

        authors = []
        if 'articleMappedMultipleAuthors' in data:	
            for aut in data['articleMappedMultipleAuthors']:
                authors.append(data['articleMappedMultipleAuthors'][str(aut)]) 
        auth = '<div><p class="auth">' + ', '.join(authors) + ' | ' + data['placeName'] + ' | ' + date + '</p></div>'

        if 'featuredImageObj' in data:
            if 'url' in data['featuredImageObj']:
                if img_url is not None:
                    lede = '<p class="cap"><img src="{}">'.format(img_url)
                else:
                    lede = '<p class="cap"><img src="{}">'.format(data['featuredImageObj']['url'])
            if 'alt_text' in data['featuredImageObj']:
                caption = '<span>' + data['featuredImageObj']['alt_text'] + '</span></p>'

        body = data['htmlContent']

        return '<html><body>' + cat + title + subhead + auth + lede + caption + '<div><p></p>' + body + '</div></body></html>'
PK�X�AL��business_today.png�PNG


IHDR  D���SPLTE����������������			���,,,GGGHHH���


���������+++�����yyy���fff###������������iii���hhh�����KKKSSSccc;;;EEE


������������������111������������---///���������sss���������������������������������^^^tttwww���222666������***(((���)))������������000������!!!777������8)�^IDATx����#E�[�ڈ�l{l۶m���C��I����G`�X�|iዐ�	��
C�6xwq$;���=x��p���z�gIHD
| PN�*��7@Oԁ��u�A�-����i�*��O]��������V�&?��Z$W+��i���7(�����%��̂��S���)�>���S�����Q�^�N{����$w���#�,Ɂ�+�Q:��Ą����/-�̣�\W`i>"*��=p�	��_u��ȗɨp2ofb �-��	,��ZD�T���{�u{Cv��ɥ���8������d�׏��}rbIJ��
P��y�֤D�;���(���/嶨I%IEND�B`�PK�Xj���rrbusiness_today.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class BT(BasicNewsRecipe):
    title = u'Business Today Magazine'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    encoding = 'utf-8'
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}
    description = (
        'Business Today is an Indian fortnightly business magazine published by Living Media India Limited,'
        ' in publication since 1992. Best downloaded on Sundays, at the end and the middle of the month'
    )
    masthead_url = 'https://akm-img-a-in.tosshub.com/businesstoday/resource/img/logo.png'

    keep_only_tags = [
        classes('story-heading sab-head-tranlate-sec brand-detial-main main-img field--name-body'),
    ]

    remove_tags = [
        dict(name=['link', 'meta', 'svg', 'button', 'script']),
        dict(name='a', attrs={'title': 'videos'}),
        classes(
            'tranding-topics-main newsltter-iframe hedlineteg stoybday-ad story-recommended-chunk '
            'banner_content'
        )
    ]
    extra_css = '''
        img {display:block; margin:0 auto;}
        em { color:#202020; }
        .main-img { font-size:small; text-align:center; }
        .summary {font-style:italic; color:#202020; }
    '''

    def parse_index(self):
        self.log(
            '\n***\nif this recipe fails, report it on: '
            'https://www.mobileread.com/forums/forumdisplay.php?f=228\n***\n'
        )
        soup = self.index_to_soup('https://www.businesstoday.in')
        a = soup.findAll('a', attrs={'class':'mag_sld_img'})[1]
        self.cover_url = a.img['data-src'].split('?')[0]
        url = a['href']
        self.log('issue =', url)
        self.timefmt = ' [' + url.split('/')[-1] + ']'
        soup = self.index_to_soup(url)
        section = None
        sections = {}

        for tag in soup.findAll(
            'div', attrs={'class': ['magazin-top-left', 'section-ordering']}
        ):
            sec = tag.find(('span', 'h1'))
            section = self.tag_to_string(sec)
            self.log(section)
            sections[section] = []

            for a in tag.findAll(
                'a',
                href=lambda x: x and x.
                startswith('https://www.businesstoday.in/magazine/')
            ):
                url = a['href']
                title = self.tag_to_string(a)
                self.log('\t', title)
                self.log('\t\t', url)
                sections[section].append({'title': title, 'url': url})

        feeds = []

        # Insert feeds in specified order, if available

        feedSort = ['Editor\'s Note']
        for i in feedSort:
            if i in sections:
                feeds.append((i, sections[i]))

        # Done with the sorted feeds

        for i in feedSort:
            del sections[i]

        # Append what is left over...

        for i in sections:
            feeds.append((i, sections[i]))

        return feeds

    def preprocess_html(self, soup):
        auth = soup.find(**classes('brand-detial-main'))
        if auth:
            ul = auth.find('ul')
            if ul:
                ul.decompose()
        for vid in soup.findAll('a', attrs={
                'href': lambda x: x and 'businesstoday.in/videos' in x
            }):
            vid.decompose()
        summ = soup.find(**classes('summary'))
        if summ:
            h2 = summ.find('h2')
            if h2:
                h2.name = 'p'
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src'].split('?')[0]
        return soup
PK�X�d1���businessworldin.png�PNG


IHDR��h6�IDATxڝ�� C����;�N��>�"c4���0�GE|����RT��?T��lxQ�Qֶ2��6�YTS�L���� &�q�c^
�d�'�%�IW#��@�43z��,``��mK�36hLrp������۔�!+Ln�����kM):��S��"���h�Z���꽿���j4��Q��IEND�B`�PK�X�؞Z>>businessworldin.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.businessworld.in
'''

from calibre.web.feeds.news import BasicNewsRecipe


class BusinessWorldMagazine(BasicNewsRecipe):
    title = 'Business World Magazine'
    __author__ = 'Kovid Goyal'
    description = 'News from India'
    category = 'news, politics, finances, India, Asia'
    no_stylesheets = True
    encoding = 'utf-8'
    language = 'en_IN'
    oldest_article = 2

    keep_only_tags = [
        dict(attrs={'class': ['main-article']}),
    ]
    remove_tags = [
        dict(id='video_n_ad_div'),
        dict(attrs={'class': ['meta-tools', 'social-article']}),
    ]
    remove_tags_after = dict(attrs={'class': 'social-article'})

    feeds = ['http://www.businessworld.in/rss/all-article.xml']

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-original': True}):
            img['src'] = img['data-original']
        for ins in soup.findAll(attrs={'class': 'adsbygoogle'}):
            ins.parent.extract()
        return soup
PK�XIC�O��cachys_blog.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class cachys_blog(BasicNewsRecipe):
    # with the knowledge and consent of the owner
    title = 'Cachys Blog'
    cover_url = 'https://upload.wikimedia.org/wikipedia/commons/f/f1/Caschys_Blog_Logo.png'
    # Author of the recipe
    __author__ = 'Volker Heggemann, VoHe'
    # description, some Reader show this in titlepage
    description = u'Smart Home, Software, Hardware, Mobile Computing & Co.'
    # Who published the content?
    publisher = u'https://stadt-bremerhaven.de/'
    # What is the content of?
    category = u'Technik - News'
    use_embedded_content = False
    language = 'de'
    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True

    # remove the rubbish (in ebook)
    auto_cleanup = True
    # now the content description and URL follows
    oldest_article = 2
    max_articles_per_feed = 100

    feeds = [
        ('Cachys', 'https://stadt-bremerhaven.de/feed/'),
    ]
PK�X��_|��cacm.png�PNG


IHDR(-SPLTE2�555���������\&�LIDATxڍϵ�P��$�o����`[`��q�߀R$�:���S\_�J�Z��WagX{�kE�h>������{�@��*IEND�B`�PK�X��Pn��cacm.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class CACM(BasicNewsRecipe):
    title = "ACM CACM Magazine"
    description = "Published on day 1 of every month."
    language = 'en'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('ACM CACM', 'https://cacm.acm.org/magazine.rss'),
    ]

    def get_cover_url(self):
        """
        Parse out cover URL from cover page.
        Example:
        From: https://cacm.acm.org/system/assets/0004/2570/April2022.Cover.1000x1338.large.jpg?1647524668&1647524668
        Get:  https://cacm.acm.org/system/assets/0004/2570/April2022.Cover.1000x1338.jpg
        """

        soup = self.index_to_soup("https://cacm.acm.org/")
        a_img = soup.find("a", class_="menuCover")
        img_url = a_img.img["src"]
        img_url = img_url.split("?")[0]
        img_url = img_url.replace(".large", "")
        return img_url
PK�X�Fe&cafcaf_dergisi.png�PNG


IHDR  ��tRNSn���IDATxڍVP[>c;�3;����������
uw/�"aq^*h�b�H���C�!���!$D�w��<���v��s��|�ܥ��(��Zu%��=��sIS��/Y􊆮~��<��P�<�U�/n~F�d�����&s��^���
cb�r�/���ފM��D��~�b��`����{䜟V.��"�X,�Z\C�L'�ۻKڻ�0��B�(D�@tY�Q��:�&�|��~�u���
b���\єR�)��͢ŏ�M.�A�o�vB��}�WOw�-q��L�JE�L^�l����v+���f�,��2�T6��O��R�Y\nlYc��~V���UU����J��'��)�4E̥�i�%DP�}��e0cc�A=�Ә���?�]V�Q(-�ف���(J�P�
!d>���!�;1/���s(c���v��q>D����o�wC����p���l�~��z��l�ae�j=���Ytq%X���h4a���zJ���
�D��;�
���7�-ݺ���6�r/<=��
�յ3��5��}��B�e���4eͰ�0��>���#�}��q�3pn}fy�-.��F��[�� ���Y^����ƍ���ԛ���%�e�!D��|�����t��j~@�j��rC�@s�맴B�Q�`�ǫ^R�!�p��z�r��ԙ~��f:��
3F���H�;��ʀq����5��X�l�?�$��&oj�~��Rg	ɲ��
��4��S�!��!1��(��1�y~���Dw 7[���w[!@�P��9q�8U`X-ܲ���8�3J�aR	��^���x?��Lt�D�-h?�g�_�{c�����Y``w�/��œ-�p�#&��%��3+j�
������Z���d"���v�RZ��則9qc��}�JI��z[Oϕ�� .��(%��I�
~.6�G�:��1�o3I�T��ʻm`$ʵt{Gl�CN� ��(	�eϫه���t����)5_���x�#L-á)n�v3��8�	��eT��E��_A��4{#G	nP�%��"E7}b9Pҡ�^aW����:�R�Q�� b��gZ�)�ۀX�j0o���a�3��=gb1�~��ÛOrw��y���x��CD�bEvy�G]„"����������p,|��;>����q*�� i�Gp��3Ti
Ŵl��zZQ�P�^�
�h���%��R�+��%�o$t�܍B
�̰���Dtȃsi4y�%@���8�����
���F��9"��1�C	h�@���c�RO/oG��{~y�/���*��<Υ5�F��O/���{Y;�L�)�k�����٥-�?�24i��`h�����8�L?Y������>�]Y'Bw�)t�̝���a15g��v)�B#�o��ޕJ�{.s��NJg�<9�q��p�3�n�n?�Jq4�N� o�`�c��zh/j�A�x��.��YG��7��!S� rLP�!��%�`��߽�)%-�t^�>&U0��?�{�|D�$[��_P��\ޮ�C"x����&hg�(��(������@1p���t�m�:w�ϓ@�>��=ӑ>��~�`p�&�n=1�U1Y�W
�{�F1�2:V�uF�@�bg+{�m�����n�����5[��F4vj8x�L=��o��K�9Y�C��,�\_o���}����>���|���bg]��7EMC��[�ǁN,�fA����
܇��gq�����J�r����8R���w�
�0�X����-H��x�h��
�yt��_�vac����#��^��7;}��ÅQov���ǎ~¿r����R>[��~>0.�W��ď27���_�'�����֣}�F�+7J�M�K��YZ���OM|$��/�)�VD7�3�Ŕ��q����Z�
S4	�֓�IEND�B`�PK�X�#r�bbcafcaf_dergisi.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1325259641(BasicNewsRecipe):
    language = 'tr'
    __author__ = 'asalet_r'
    title = u'CafCaf Dergisi'
    oldest_article = 7
    max_articles_per_feed = 20
    auto_cleanup = True

    feeds = [(u'CafCaf', u'http://www.cafcafdergisi.net/feed/rss/')]
PK�X�lg#��
calcalist.png�PNG


IHDR  D���3PLTE���������DS�w�܈�ᙡ�$������]"�ZtRNS"DU�����|p`\IDATx���S�@@�1�f���n��BJc�/�Rn�c�%�J�>p�YxS�wA��N�����YDoo
�@|�s�+��V)!.A�+9��+�IEND�B`�PK�Xx��
�
calcalist.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class AdvancedUserRecipe1283848012(BasicNewsRecipe):
    description = 'This is a recipe of Calcalist.co.il'
    cover_url = 'https://images1.calcalist.co.il//picserver3/wcm_upload_dev/2022/09/15/Hk9OzwlWi/calcalistlogn.png'
    title = u'Calcalist'
    language = 'he'
    __author__ = 'marbs'
    extra_css = 'img {max-width:100%;} body{direction: rtl;},title{direction: rtl; } ,article_description{direction: rtl; }, a.article{direction: rtl; } ,calibre_feed_description{direction: rtl; }'  # noqa
    simultaneous_downloads = 5
    remove_javascript = True
    timefmt = '[%a, %d %b, %Y]'
    oldest_article = 1
    max_articles_per_feed = 100
    remove_attributes = ['width']
    simultaneous_downloads = 5
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'mainTitle'}),
        dict(name='h2', attrs={'class': 'subTitle'}),
        dict(name='div', attrs={'class': 'ArticleBodyComponent'}),
    ]
    remove_tags = [dict(name='p', attrs={'text': ['&nbsp;']})]
    max_articles_per_feed = 100
    preprocess_regexps = [
        (re.compile(r'<p>&nbsp;</p>', re.DOTALL | re.IGNORECASE), lambda match: '')
    ]

    feeds = [
        (u" דף הבית", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-8,00.xml"),
        (u" 24/7", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3674,00.xml"),
        (u" באזז", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3673,00.xml"),
        (u" משפט", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3772,00.xml"),
        (u" רכב", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3783,00.xml"),
        (u" אחריות וסביבה", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3781,00.xml"),
        (u" דעות", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3791,00.xml"),
        (u" תיירות ותעופה", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3784,00.xml"),
        (u" קריירה", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3782,00.xml"),
        (u" אחד העם", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3768,00.xml"),
        (u" המלצות ואזהרות", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3771,00.xml"),
        (u" הייטק והון סיכון", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3928,00.xml"),
        (u" חדשות טכנולוגיה", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3778,00.xml"),
        (u" תקשורת", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-4471,00.xml"),
        (u" אינטרנט", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3773,00.xml"),
        (u" מכשירים וגאדג'טים", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3777,00.xml"),
        (u" המדריך", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3880,00.xml"),
        (u" אפליקציות", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3998,00.xml"),
        (u" Play", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3792,00.xml"),
        (u" הכסף", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-9,00.xml"),
        (u" עולם", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-13,00.xml"),
        (u" פרסום ושיווק", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-5,00.xml"),
        (u" פנאי", u"http://www.calcalist.co.il/GeneralRSS/0,16335,L-3,00.xml"),
        (u" עסקי ספורט", u"http://WallaNewsw.calcalist.co.il/GeneralRSS/0,16335,L-18,00.xml")
    ]
PK�X�6��;;calgary_herald.png�PNG


IHDR  D���1PLTE4h�]��^��^��n�Ǧ�ܭ��O����ڞ��j��Lz���ψ�ы�ҏ�ӑ�Ԓ�Փ�՘��P��]�����_��f�Į�߯�����`��a�‰��b����疴֪�޴��������琰�c��{��g�Ć�Ж��m�ƞ�ٟ��p�ǥ��q�Ȩ�����q��r��u������������x��y��5i����|�������������d�Ê��P����Ό�Ҍ�ҍ�ҍ�ӎ��>p���Ԑ��g��i��P��j�Ŕ�Δ�Ք�֕�Օ��R��n����օ�Ї�З�װ����]����������;m����9l�N�x��c��n�Ù�כ�؜��T��o��Y����ڠ��p�ǡ��Y����ۤ��Y��Z����ܧ��s��t�ɩ�ک��?p�v�ʮ��w��Eu�Ew�Ex���ܴ��z��{�˶����������Fv�_�������}��~��������~��Fv������灦���������������邧�_�����������Fx�<n�����=o�������������O����=o������������IDATxڅ��#Q��/���ض͵m۶m۶���Oj��{|�'��[��J�E�gK �!�b�w�2"0���?fx��Yx�B�[���<��P1����`P3;�4�`�Ke蹶]��QU�B�g�O���10�T��[�Dy����צ>��o�1��i�Y��ZL�4��_��;�
�0�|���m;|1����������38Ձ�cB"^�eF��T��;���,0��ޅ���aY��Jr���LI�6�x�� ����;2�@_�Q�'�C�� �E�&T�"��)9��h����=��'^�/}�eِHH��؈�I��FNJ�xnڒ��o7:S)Z39�a���	jy�3ϳ��A��赗�	Ά�m��h1�WT��*��03�Y]��g�6w��9����\9����
���4v�b�8�IEND�B`�PK�X�Q�>4>4calgary_herald.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
__license__ = 'GPL v3'

'''
www.canada.com
'''
import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class CanWestPaper(BasicNewsRecipe):

    postmedia_index_pages = [
        (u'Headlines', u'/index.html'),
        (u'Ottawa & Area', u'/news/ottawa/index.html'),
        (u'Vancouver', u'/news/vancouver/index.html'),
        (u'Calgary', u'/news/calgary/index.html'),
        (u'Edmonton', u'/news/edmonton/index.html'),
        (u'Montreal', u'/news/montreal/index.html'),
        (u'Fraser Valley', u'/news/fraser-valley/index.html'),
        (u'British Columbia', u'/news/bc/index.html'),
        (u'Alberta', u'/news/alberta/index.html'),
        (u'Canada', u'/news/canada/index.html'),
        (u'National', u'/news/national/index.html'),
        (u'Politics', u'/news/politics/index.html'),
        (u'Insight', u'/news/insight/index.html'),
        (u'Special Reports', u'/news/specialreports/index.html'),
        (u'Gangs', u'/news/gangs/index.html'),
        (u'Education', u'/news/education/index.html'),
        (u'Health', u'/news/health/index.html'),
        (u'Environment', u'/news/environment/index.html'),
        (u'World', u'/news/world/index.html'),
        (u'Police Blotter', u'/news/crime-and-justice/index.html'),
        (u'Crime', u'/news/blotter/index.html'),
        (u'Around Town', u'/news/topic.html?t=keyword&q=Around+Town'),
        (u'Diplomatica', u'/news/diplomatica/index.html'),
        (u'Opinion', u'/opinion/index.html'),
        (u'Columnists', u'/columnists/index.html'),
        (u'Editorials', u'/opinion/editorials/index.html'),
        (u'Letters', u'/opinion/letters/index.html'),
        (u'Business', u'/business/index.html'),
        (u'Sports', u'/sports/index.html'),
        (u'Arts', u'/entertainment/index.html'),
        (u'Life', u'/life/index.html'),
        (u'Technology', u'/technology/index.html'),
        (u'Travel', u'/travel/index.html'),
        (u'Health', u'/health/index.html')
    ]

    # un-comment the following six lines for the Vancouver Province
    # title = u'Vancouver Province'
    # url_prefix = 'http://www.theprovince.com'
    # description = u'News from Vancouver, BC'
    # std_logo_url = 'http://www.theprovince.com/images/logo_theprovince.jpg'
    # logo_url = 'vplogo.jpg'
    # fp_tag = 'CAN_TP'

    # un-comment the following six lines for the Vancouver Sun
    # title = u'Vancouver Sun'
    # url_prefix = 'http://www.vancouversun.com'
    # description = u'News from Vancouver, BC'
    # std_logo_url = 'http://www.vancouversun.com/images/logo_vancouversun.jpg'
    # logo_url = 'vslogo.jpg'
    # fp_tag = 'CAN_VS'

    # un-comment the following six lines for the Calgary Herald
    title = u'Calgary Herald'
    url_prefix = 'http://www.calgaryherald.com'
    description = u'News from Calgary, AB'
    std_logo_url = 'http://www.calgaryherald.com/images/logo_calgaryherald.jpg'
    logo_url = 'chlogo.jpg'
    fp_tag = 'CAN_CH'

    # un-comment the following six lines for the Edmonton Journal
    # #    title = u'Edmonton Journal'
    # #    url_prefix = 'http://www.edmontonjournal.com'
    # #    description = u'News from Edmonton, AB'
    # #    std_logo_url = 'http://www.edmontonjournal.com/images/logo_edmontonjournal.jpg'
    # #    logo_url = 'ejlogo.jpg'
    # #    fp_tag = 'CAN_EJ'
    #
    # un-comment the following six lines for the Ottawa Citizen
    # #    title = u'Ottawa Citizen'
    # #    url_prefix = 'http://www.ottawacitizen.com'
    # #    description = u'News from Ottawa, ON'
    # #    std_logo_url = 'http://www.ottawacitizen.com/images/logo_ottawacitizen.jpg'
    # #    logo_url = 'oclogo.jpg'
    # #    fp_tag = 'CAN_OC'
    #
    # un-comment the following six lines for the Montreal Gazette
    # #    title = u'Montreal Gazette'
    # #    url_prefix = 'http://www.montrealgazette.com'
    # #    description = u'News from Montreal, QC'
    # #    std_logo_url = 'http://www.montrealgazette.com/images/logo_montrealgazette.jpg'
    # #    logo_url = 'mglogo.jpg'
    # #    fp_tag = 'CAN_MG'

    Kindle_Fire = False
    masthead_url = std_logo_url

    url_list = []
    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    encoding = 'utf-8'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: small;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                .photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                #photocredit { font-size: xx-small; font-weight: normal; }'''

    keep_only_tags = [dict(name='div', attrs={'id': re.compile('story')})]

    remove_tags = [{'class': 'comments'}, {'class': 'comment-intro'}, {'class': 'storytab'},
                   dict(name='div', attrs={'class': 'section_title'}), dict(name='div', attrs={'class': 'sharebar'}), dict(
                       name='div', attrs={'class': 'navbar'}), dict(name='div', attrs={'class': 'morelinks'}),
                   dict(name='h2', attrs={'id': 'photocredit'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='div', attrs={'id': 'soundoff'}),
                   dict(name='div', attrs={'id': re.compile('flyer')}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def get_cover_url(self):
        from datetime import timedelta, date
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        # delete empty id attributes--they screw up the TOC for unknown reasons
        divtags = soup.findAll('div', attrs={'id': ''})
        if divtags:
            for div in divtags:
                del(div['id'])

        pgall = soup.find('div', attrs={'id': 'storyphoto'})
        if pgall is not None:  # photo gallery perhaps
            if (soup.find('div', attrs={'id': 'storycontent'}) is None):
                allpics = new_tag(soup, 'div')
                first_img = pgall.find('div', 'storyimage')
                if first_img is not None:
                    first_img.extract()
                    tlist = pgall.find('div', attrs={'id': 'relatedthumbs'})
                    if tlist is not None:
                        for atag in tlist.findAll('a'):
                            img = new_tag(soup, 'img')
                            srcpre, sep, srcpost = atag.img[
                                'src'].partition('?')
                            img['src'] = srcpre
                            pdesc = new_tag(soup, 'p')
                            pdesc.insert(0, atag.img['alt'])
                            pdesc['class'] = 'photocaption'
                            div = new_tag(soup, 'div')
                            div.insert(0, pdesc)
                            div.insert(0, img)
                            allpics.append(div)
                pgall.replaceWith(allpics)

        for pg in soup.findAll('div', attrs={'id': 'storyphoto'}):
            pg.extract()
        return self.strip_anchors(soup)

    def parse_index(self):

        articles = {}
        ans = []

        def handle_article(adiv, key):
            if adiv.name == 'h1' or adiv.name == 'h3':
                h1tag = adiv
            else:
                h1tag = adiv.h1
                if h1tag is None:
                    h1tag = adiv.h3
            if h1tag is not None:
                atag = h1tag.a
                if atag is not None:
                    url = atag['href']
                    if url.startswith('/'):
                        url = self.url_prefix + url
                    if not url.startswith(self.url_prefix):
                        print("Rejected " + url)
                        return
                    if url in self.url_list:
                        print("Rejected dup " + url)
                        return
                    self.url_list.append(url)
                    title = self.tag_to_string(atag, False)
                    if 'VIDEO' in title.upper():
                        return
                    if 'GALLERY' in title.upper():
                        return
                    if 'PHOTOS' in title.upper():
                        return
                    dtag = adiv.find('div', 'content')
                    description = ''
                    print("URL " + url)
                    print("TITLE " + title)
                    if dtag is not None:
                        stag = dtag.span
                        if stag is not None:
                            if ''.join(stag['class']) != 'timestamp':
                                description = self.tag_to_string(stag, False)
                        else:
                            description = self.tag_to_string(dtag, False)
                        print("DESCRIPTION: " + description)
                    if key not in articles:
                        articles[key] = []
                    articles[key].append(dict(
                        title=title, url=url, date='', description=description, author='', content=''))

        def parse_web_index(key, keyurl):
            print("Section: " + key + ': ' + self.url_prefix + keyurl)
            try:
                soup = self.index_to_soup(self.url_prefix + keyurl)
            except:
                print("Section: " + key + ' NOT FOUND')
                return
            ans.append(key)
            mainsoup = soup.find('div', 'bodywrapper')
            footer = mainsoup.find(attrs={'id': 'footerfeature'})
            if footer is not None:
                footer.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['genericfeature']}):
                wdiv.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['headline', 'featurecontent']}):
                handle_article(wdiv, key)

        for (k, url) in self.postmedia_index_pages:
            parse_web_index(k, url)
        ans = [(key, articles[key]) for key in ans if key in articles]
        return ans
PK�X/�OOcamera_di_commercio_di_bari.png�PNG


IHDR  ��tRNSn��IDATxڕ�C`d[dz��rl�=���{~m�v�c��b�m$��TPH!�Kcs=���g���|�����O��|�Ǐ�����j�N��b���Ʈ����=�y�+���W����drA�b�T:�L�B�\.
E������@`���������A�ǎ�h4�k���1�NLNM�H$:11���Kd3���^�?�ή����~�_x��VXX�Ng���ŋE�U5|�����%�|�xF�T�(-����t:�J=�̉|�׫��ٵ�����dr��噘�<w�b���p8�'�dt>�H$3�"ѹs��k}���˭#���{���y׻���wvw�v{}C���t2��hte�m�2�������2���f4�$R�%R9L����319���U[W�/���.҂H$Q�TB0�R
+�*
�g,�D��vGqI��h{{gskk}ccww�k��/u��y�����z������}fv�^�R�F��Vk����.h�q�˓[];::�X�U���b�|%�N$�Jg|�t�N���ҧ?�������h4666���199���ol&W�XL9�<u�����x�I��7.J�ز��M"��^�R�d��G?�\����
��Z�B�B����7n^�~��pR�U��)�F*W�WT��7�	�իW�A̱�
�ͳss++i�d�c�<���X��f��yL��hN�Eb�H�T
)�*��j4�V�Ї��x�G��!\����I��駦��xT����=�
�#Cã��ݙlˠE�r�B!]�*8 S@�x�|>z��3ѯjh�<S�/\���L���'<^���GW�<�H���������.�BI�@`IX��¢�H4j2��X��?��/�����@ǀN@?q�������Ą�bM&S���?+������L��͛HsN�R|9�Qiqq�fwHer�<#�rt��}EDb7�(��? �B(�j�C|��[Z�p���Z��|Ɛ(����e�T/*.E-%��r��f�ܽ{�޽���|�G^����jN�xI*:hk���C��\�KE%����	��m�Ϝǽ S^Q�,&�‘H2��H�_��ť吉9�s0byo�V���}�� �*AG�7o�2�,(� ֑ѱ@(����q�w��9m�LX�v{�ʫ�)6�74W[��0M�Vo�D�6;� b��B��͛7i�l�y�~��j0Ɇ?���&�K߹s��p�ϠH���pY�����|E�3Pgaqtw��h	W���Z����F���翲���	M�\nޙ��`����h,���͟�	�`{��P���1�-�y�P^QY��O��b4��?�	�lv;�|�%`t�E�!$���E�`�2<<
y�����%��^�
u�DbTt�1W�Ng�&��kh���Tj%���#��$�۝�g]����giB���#�EB�%��0�]o�E��!*���;2�,bq0�#�#cȃ1]<
b�)���~�H`o��E��*�C,��-��;�.��Bs�p�U��ّo���(�\���R,
1��l�����ݴ�z�H1����������2o�&�&�rkkp�(gajZt�E���v�u�J;88 0����A_�Ù���_�"p�F��"$�0
����
D�}�v&���x"�x؏de&S+�O*��G>�n�/�?����4˂޾~h��666�0��ȸ�B%J�����[�3:6��o^},����/�������C����"�0g �ං���s?R$$��W�X�USS�����\[��@�^�|���桡��$.���T��r���_�����O⑭���H���2�-h	�108vtv���c7<Ű��կ�W��^?��O�g7zBa$H<46��,�w�����\n��{>��+���/w���6��ǽ�`�i��d�#! NI766}��_y���_���7D���a ����+���x�ת��V~�3cIEND�B`�PK�XƝ�)"camera_di_commercio_di_bari.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1331729727(BasicNewsRecipe):
    title = u'Camera di Commercio di Bari'
    oldest_article = 7
    __author__ = 'faber1971'
    description = 'News from the Chamber of Commerce of Bari'
    language = 'it'
    max_articles_per_feed = 100
    auto_cleanup = True
    masthead_url = 'http://www.ba.camcom.it/grafica/layout-bordo/logo_camcom_bari.png'
    feeds = [(u'Camera di Commercio di Bari',
              u'http://feed43.com/4715147488845101.xml')]


__license__ = 'GPL v3'
__copyright__ = '2012, faber1971'
__version__ = 'v1.00'
__date__ = '17, April 2012'
PK�X�{�''canardpc.png�PNG


IHDR  ���IDATx^��mlSU������Q֮l��c0^� �m�	$��� ���E�Y���1ш�����F>(�$$qg�d0an�{���v��uu9z˹t�}�N�{�>��9�is��P�x�oT-H��p߈�+A�V!�$�u����D������*�U4V��)��s�p@e�<��mj߹L_%͋����/����4�u��=�f�{��[s����6M�	���$X��W>��s�'0,�����]]�|�[^����r�����c'�h~��4d������7t��WBh��r�;sƴ`�M��������n�F�b�m~Mחt5A�9U=r�87�xZ�رx���tTy��M�o��
p���
,` ��XAE`��9�ҹ�������k�u1��a����Ax8��]L�_�*���
\�]2��?r!"2�	)Da���|9)�x�j4�ԩ(
�KJ��|dU'� �B��`�,(����B��/-)ٴp��rZ[��Q4;*��f�$I��h������ZMMCg�w>߻.p�*�M���)2d�*��8&�YYX,H�lll�wAb^o��	���~��N[�/mDˡ�>��PL���ɨ*���dy?�⚚Pmmp` 8�%X��#ȿd�9��d��/�G�h�;@��q/�v������A[E �!-
=�ўR���+��3MM��T�!)�P�Cb1�������j�ۿOee�%oػ�q��k�ҭ;�R�����x(�WQQ�Ӊ`n,�a۶����|��o���3?��M����`L�a`T^/CCH���ޯ�-/.^�pT��a���#?嚵3�96T���f ��6*�^/z6��y���۽��Y23����NL�o&-�AK ��M*���L�HD��30�
�#�����)&F������@��N�������	�P���Mv ��`��p���ݼ������wެ� ݐu�KXĚ	w��ƍ��l��ɓtt��d4�����g׮�in��4ABqC`�b�������n��rٲ�Fc(k��.ݽ{��c<Gi1��o�-�`B�GPd�B�X��2"*L�D�Ǹ	�LǢ/_�f d�ϫT!E�!E�Lϓ{��n�|���C|�{Q�(9�5qX۟��|'�؞��6���s�4a�.4H���f�`\��{S�E^�#�^e%a��B�~Q{'�ne�JR^&~��4�����IEND�B`�PK�X�L��canardpc.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1271446252(BasicNewsRecipe):
    title = u'CanardPC'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'fr'
    __author__ = 'zorgluf'
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [(u'CanardPC', u'http://www.canardpc.com/feed.php')]
PK�Xd���||capes_n_babes.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class CapesnBabesRecipe(BasicNewsRecipe):
    title = u'Capes n Babes'
    language = 'en'
    description = 'The Capes n Babes comic Blog'
    __author__ = 'skyhawker'
    oldest_article = 31
    max_articles_per_feed = 100
    use_embedded_content = True
    feeds = [(u'Capes & Babes', u'feed://www.capesnbabes.com/feed/')]
PK�X�T2���capital.png�PNG


IHDR��h6�IDATxڅ�QK�P��O<ۂ�*����@H�YZPv�]��MWe��0��F-�n�D�!B(��r���X�Bڲ�c���˹�=�9;cL��S''U�M���4��0��Jd��BאL`F������IC��p�h�0�XYV].�s
k��GG�Sp��0r�¢�s�GY�p��[���P��m�H$"�rjwWA����t:�"�ڟi��M�^I��M!�;���Z]
�B�`F��-���\����C�S�Cf������V���ѝ�w�����b��l^�q}���g6�B���H�}`Q��ff�d,/a�b,��T/n��Xub����\��+�i�K���]���<w�ûE�l6�v=,�q0�z��h�V{k�6��ԔI�U��OS7	������i��캀���6W���IEND�B`�PK�X�k�>��capital.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
capital.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Capital(BasicNewsRecipe):
    title = 'Capital'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'\u0218tiri din Rom\u00e2nia'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania'
    encoding = 'utf-8'
    remove_javascript = True
    publisher = 'Capital'
    cover_url = 'http://www.mediapress.ro/imagini/sigla-capital-s16.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [dict(name='div', attrs={'class': 'single one_article'})
                      ]

    remove_tags = [dict(name='div', attrs={'class': 'single_details'}), dict(name='div', attrs={'class': 'tx-addoceansbanners-pi1'})
                   ]

    feeds = [(u'\u0218tiri', u'http://www.capital.ro/rss.html')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X� bggcapital_de.png�PNG


IHDR  szz�.IDATx�b���?#����M[P{YD�uQ�e4>63�cs���233���/m�eqWffff�up:���rۼc�s̶W#�4�~�r4�c�X���e���I�|����K�����̗�b@X�=�2�7m�_�5�R�8�V�U���`�i����Q|�к�p�YH���r�b������V��&��
-"������<�`�>��񂡀���K �T�{���׸*X%0���ۉt2ˉ��IA��]��m�G~^y�U���{�ګ��I��0�(�J�;΀r��i'R�f�"F���;z�!�t��ƛ��a0T�21 	Ğ�:o.�3���)���o�����O��������o�.���}���O ���`�*���*Q�x�UYG?��	N��ݻaxp}$���p��W��s8�h��&$b).�U¦L���}3���v�q^شq3+��]�`jc���}��Gp�u7����R>�c� ;�`z8�S�8ِ�����?o�9}v����ҳ�15�M�.�p�~g�t�� ;^���<C��ԗ|h�
|�y��t_>�L�]�����J�����A8����f����
��՗=˖�<�X�J��:5��{�v�Z-�J���K�Yb��e���_{�u��h�j�ћ/�ږ�e:t�������A�}���:�+�ƫ���8s�Fd[}�T��
(���C]{��k��v��{�O]G:�|�_v%`�ID�����,]~��b� $���4H����3ϲJ������}��۷�	���;|��w�o4[��_�<����˽�{3–�F�!�(�k��֮Y���.ڨ(3�;�9���?���Fm���g�~&�^�6o�7ݸ0C�&��)���8�
�&>�E;��x?�x�o�a$䗛�<�=�i�:� ڂ�9�5^�=�DE��מEϽ�>�S&��!n��ړKXڻ
�V�'xq�^{���\doQ�f%(p�I���R�1��AK���y��ۂ�����,�.n�����
�
IEND�B`�PK�XoCTE�
�
capital_de.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function

'''
capital.de
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1305470859(BasicNewsRecipe):
    title = 'Capital.de'
    __author__ = 'schuster'
    description = 'RSS-Feed von Capital.de'
    publisher = 'Gruner+Jahr GmbH & Co KG'
    language = 'de'

    oldest_article = 14
    max_articles_per_feed = 35
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False

    conversion_options = {'smarten_punctuation': True,
                          'publisher': publisher}

    cover_source = 'http://shop.capital.de/abos/capital/'
    masthead_url = 'http://www.capital.de/files/capital/layout/logo.png'

    feeds = [
        ('Capital.de', 'http://www.capital.de/partner-feeds/rss.xml')
    ]

    keep_only_tags = [
        dict(name='div', attrs={
             'class': 'grid_8 alpha omega layout_full block'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'article_header'}),
        dict(name='br', attrs={'class': 'clear'})
    ]

    remove_attributes = ['height', 'width']

    extra_css = 'h1 {font-size: 1.6em; text-align: left} \
                 h2 {font-size: 1em; text-align: left} \
                 .copyright {font-size: 0.6em} \
                 .caption {font-size: 0.6em}'

    def get_cover_url(self):
        soup = self.index_to_soup(self.cover_source)
        img_span = soup.find('span', {'class': re.compile('coverimage')})
        self.cover_url = img_span.find('img', src=True)['src']
        return self.cover_url

    def preprocess_html(self, soup):
        # remove all articles without relevant content
        tags = soup.findAll('li', {'class': 'tag-chain-item'})
        for li in tags:
            if 'BILDERSTRECKE' in self.tag_to_string(li).upper():
                self.abort_article()
        # remove list of tags
        tags = soup.find('ul', {'class': 'tag-chain'})
        if tags:
            tags.extract()
        # remove all style attributes
        for item in soup.findAll(style=True):
            del item['style']
        # remove all local hyperlinks
        for a in soup.findAll('a', {'href': True}):
            if a['href'] and 'http' not in a['href']:
                del a['href']
        # remove picture(s) of author(s)
        for div in soup.findAll('div', {'class': 'ce_text block'}):
            if div.find('hr'):
                for hr in div.findAll('hr'):
                    hr.extract()
                for img in div.findAll('img'):
                    img.extract()
        return soup
PK�X���capital_gr.png�PNG


IHDR  D����PLTE9`��f1/b�:b�>b��cH�d1�g2�d(�d1:`�9a��e1���<a�-U�+S�.V�0W�0a�;`�;a�,T�=a�=b�=c�>d��i2,T�4[�=b�/a�2c�<d�9^�2Y�2e�8^�6]�=b�)Nw<b�@f��gL>c�>bYy�����i+�l3!?`9_�9`�:_�:`�/E_;`�/Hc;b�<a�/Qx&Ir'Mw0V�'P0X�0X�(Mw(Oz(Q=f�=f�>c�#@`1Y�>d�>e�>f�>g�?d�?g�@Si@d�1c�1d�1d�2X�)Oz2Z�2[�)R�7]����"7O<b`o�+S$CfJg�Km�LQVLn�PZeEh�Im�JXh3X�"Fo`~�a�3Z�3[����������0T~�����<b� 4K9^4R1Y�8Y0b�!@d=d�!Ci1X�9X@g�@g�Aa�Ai�BJUEJPQr�RYbR^kVv�Xx�+T�$Fn4BT4[�cy�e��g��h��j��m��rrrrsttuwwvu{��&Eh6\�6]�-T&Fk�����������������������������š�Ü�ĝ����Ğ�ş�Ƣ�������ΰ����б�������Ѵ�ӷ�������ż�ؽ�������ٿ��dJ���7^�8^�.S|������������������������������������������������������������������������f1�������f*8_�8a�9\�������&Iq�'N
tRNS��������������_>�IDATx�}���@��Y�Lj���׶m۶m۶m۶m��{�����CHr�HɄd9t�i���F��,����
�{.��[V��s%Ń2������B�d�� �n)(���~���R.PK��5�K7=����Kq@�����c~嵽u���zl������f�zq8�LY��:�.��A��a�\��_G1s�S���g����|�;��}��E��.Q0�ͣ��7К(0C\�0�r��G�i��I;�k�/]�glmm�+�Hoh�p��A`����ŕ�8����	��*�q<�
�V���n㬔���Ԇl����7kJ$�_|�U�u�j`���j�4���w!ҟuc�P.�g\�P#{�o$��j6U�ܥ�玶M�|���V�k�b�7��)�Ab�<\��y���r�rI��H���!�/��꿊�O%�~�H�l���!RZ����"+�ҲIEND�B`�PK�Xy"hcapital_gr.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class Capital(BasicNewsRecipe):
    title = 'Capital.gr'
    __author__ = 'Stelios'
    description = 'Financial News from Greece'
    oldest_article = 3
    publisher = 'Capital.gr'
    category = 'news, GR'
    language = 'el'
    encoding = 'windows-1253'
    cover_url = 'http://files.capital.gr/images/caplogo.gif'
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    keep_only_tags = [
        dict(name='h1'),
        dict(name='p'),
        dict(name='span', attrs={'id': ["textbody"]})
    ]

# 3 posts seemed to have utf8 encoding
    feeds = [
        (u'\u039F\u039B\u0395\u03A3 \u039F\u0399 \u0395\u0399\u0394\u0397\u03A3\u0395\u0399\u03A3',
         'http://www.capital.gr/news/newsrss.asp?s=-1'),
        (u'\u0395\u03A0\u0399\u03A7\u0395\u0399\u03A1\u0397\u03A3\u0395\u0399\u03A3',
         'http://www.capital.gr/news/newsrss.asp?s=-2'),
        (u'\u0391\u0393\u039F\u03A1\u0395\u03A3',
         'http://www.capital.gr/news/newsrss.asp?s=-3'),
        (u'\u039F\u0399\u039A\u039F\u039D\u039F\u039C\u0399\u0391',
         'http://www.capital.gr/news/newsrss.asp?s=-4'),
        (u'\u03A7\u03A1\u0397\u039C. \u0391\u039D\u0391\u039A\u039F\u0399\u039D\u03A9\u03A3\u0395\u0399\u03A3',
         'http://www.capital.gr/news/newsrss.asp?s=-6'),
        (u'\u039C\u03CC\u03BD\u03B9\u03BC\u03B5\u03C2 \u03C3\u03C4\u03AE\u03BB\u03B5\u03C2: \u039C\u0395 \u0391\u03A0\u039F\u03A8\u0397',
         'http://www.capital.gr/articles/articlesrss.asp?catid=4'),
        (u'\u039C\u03CC\u03BD\u03B9\u03BC\u03B5\u03C2 \u03C3\u03C4\u03AE\u03BB\u03B5\u03C2: \u03A3\u0399\u03A9\u03A0\u0397\u03A4\u0397\u03A1\u0399\u039F',
         'http://www.capital.gr/articles/articlesrss.asp?catid=6'),
        (u'\u039C\u03CC\u03BD\u03B9\u03BC\u03B5\u03C2 \u03C3\u03C4\u03AE\u03BB\u03B5\u03C2: \u03A0\u0399\u03A3\u03A9 \u0391\u03A0\u039F \u03A4\u0399\u03A3 \u0393\u03A1\u0391\u039C\u039C\u0395\u03A3',  # noqa
         'http://www.capital.gr/articles/articlesrss.asp?catid=8'),
    ]
PK�X`I�`��caravan_magazine.png�PNG


IHDR  D���+PLTE���111bbbnnn555ccc{{{CCC...$$$VVV������III222"""RRR������xxx```���mmm�����������hhh???///���fff���ZZZ���ddd���&&&���������������ppp''',,,OOO���qqq��𓓓iii\\\������]]]444���������777��Ƒ�����eee������:::���ooo������LLL������>>>������������AAA666SSSEEEBBBNNN!!!������ggg���������� �EtRNS������8����,�<�~>�@����/��{�.��k��B��I��ŝ���-=�l93C2�;7m���Ҏ��IDATx�}�c�A��;�'k;��z�k��m۶m���V��(}����]�}E07˩ә|�e^=e��8�: �����d��g,�cfB��C�<�N	�J�����7��>�����Mk�~�9�i�����f����d*�����;�h�)~���M�0��v�zT=�E�ʭ����7"a���\~����f!��GB��
�Td�&���W� ��(�бR�
)z�!y�R.X�:�C�4��.�h�@�>��@��t�<����_�C��ځI�K��D��'YI�`�{98	
*���� R:�SC�l`��8�NA�y�;�.ę$�=�h%���\���P{y;�[�)���k�z��B	�X�TCj�}'�w�A�U�b�R�ǍO��=��x��(�O�\H�w�?|���Q�)�^�������"�܅4�EU�wqa��zl�%�b��+��W:jR��_����IEND�B`�PK�X�05�``caravan_magazine.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>

import json

from mechanize import Request

from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class CaravanMagazine(BasicNewsRecipe):

    title = 'Caravan Magazine'
    __author__ = 'Kovid Goyal, Gobelinus, unkn0wn'
    description = 'An Indian Journal of politics and culture'
    language = 'en_IN'
    timefmt = ' [%b, %Y]'
    encoding = 'utf-8'
    needs_subscription = 'optional'

    no_stylesheets = True

    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}
    resolve_internal_links = True

    extra_css = '''
        blockquote {color:#202020;}
        #fig-c {text-align:center; font-size:small;}
        em {color:#202020;}
        .article-footer {font-size:small;}
        .date, .pre-title {font-size:small; color:#404040;}
        .authors {font-size:small; font-weight:bold;}
    '''

    remove_tags = [
        classes('related-articles'),
        dict(name='meta'),
        dict(attrs={'class': ['share-with', 'img-wrap abs']}),
    ]

    def get_browser(self, *args, **kw):
        br = BasicNewsRecipe.get_browser(self, *args, **kw)
        if not self.username or not self.password:
            return br
        data = json.dumps({'email': self.username, 'name': '', 'password': self.password})
        if not isinstance(data, bytes):
            data = data.encode('utf-8')
        rq = Request(
            url='https://caravanmagazine.in/api/users/login',
            data=data,
            headers={
                'Accept': 'application/json, text/plain, */*',
                'Origin': 'https://caravanmagazine.in',
                'Referer': 'https://caravanmagazine.in/',
                'Content-type': 'application/json;charset=UTF-8',
            },
            method='POST'
        )
        res = br.open(rq).read()
        res = res.decode('utf-8')
        self.log('Login request response: {}'.format(res))
        res = json.loads(res)
        if res['code'] != 200 or res['message'] != "Login success":
            raise ValueError('Login failed, check your username and password')
        return br

    # To parse article toc
    def parse_index(self):
        base_url = 'https://www.caravanmagazine.in/'
        soup = self.index_to_soup('{0}magazine'.format(base_url))
        if magdate := soup.find('h6', attrs={'class':'magazine-date'}):
            self.timefmt = ' [' + self.tag_to_string(magdate).strip() + ']'

        # find current issue cover
        feeds = []
        sections = soup.find(attrs={'class': lambda x: x and 'current-magazine-issue' in x.split()}).find(
                attrs={'class': lambda x: x and 'sections' in x.split()})
        for section in sections.findAll(attrs={'class': lambda x: x and 'section' in x.split()}):
            a = section.find('a')
            section_title = self.tag_to_string(a)
            self.log('\nSection:', section_title)
            articles = []
            for article in section.findAll('article'):
                details = article.find(attrs={'class': lambda x: x and 'details' in x.split()})
                pre = details.find(attrs={'class': lambda x: x and 'pre-heading' in x.split()})
                if pre is not None:
                    pre.extract()
                a = details.find('a')
                url = base_url + a['href'].lstrip('/')
                title = self.tag_to_string(a)
                desc = self.tag_to_string(details.find('div'))
                self.log('\t', title, url)
                articles.append({'title': title, 'description': desc, 'url': url})
            if articles:
                feeds.append((section_title, articles))

        return feeds

    def get_cover_url(self):
        soup = self.index_to_soup(
            'https://www.readwhere.com/magazine/delhi-press/The-Caravan/5326'
        )
        for citem in soup.findAll(
            'meta', content=lambda s: s and s.endswith('/magazine/300/new')
        ):
            return citem['content'].replace('300', '600')

    def print_version(self, url):
        if not self.username or not self.password:
            return url.replace('.in/','.in/amp/')
        return url

    def preprocess_html(self, soup):
        if not self.username or not self.password:
            keep_only_tags = [classes('main-content')]
            for fc in soup.findAll('figcaption'):
                fc['id'] = 'fig-c'
            for img in soup.findAll('amp-img'):
                img.name = 'img'
            if h6 := soup.find('h6'):
                h6.name = 'h4'
        else:
            keep_only_tags = [
                classes('post-title short-desc author-details cover'),
                dict(itemprop='articleBody'),
            ]
            for div in soup.findAll(itemprop='image'):
                for img in div.findAll('img'):
                    img['src'] = div['content']
            for img in soup.findAll(attrs={'data-src': True}):
                img['src'] = img['data-src']

        body = new_tag(soup, 'body')
        for spec in keep_only_tags:
            for tag in soup.find('body').findAll(**spec):
                body.insert(len(body.contents), tag)
        soup.find('body').replaceWith(body)
        return soup
PK�X`I�`��caravan_magazine_hindi.png�PNG


IHDR  D���+PLTE���111bbbnnn555ccc{{{CCC...$$$VVV������III222"""RRR������xxx```���mmm�����������hhh???///���fff���ZZZ���ddd���&&&���������������ppp''',,,OOO���qqq��𓓓iii\\\������]]]444���������777��Ƒ�����eee������:::���ooo������LLL������>>>������������AAA666SSSEEEBBBNNN!!!������ggg���������� �EtRNS������8����,�<�~>�@����/��{�.��k��B��I��ŝ���-=�l93C2�;7m���Ҏ��IDATx�}�c�A��;�'k;��z�k��m۶m���V��(}����]�}E07˩ә|�e^=e��8�: �����d��g,�cfB��C�<�N	�J�����7��>�����Mk�~�9�i�����f����d*�����;�h�)~���M�0��v�zT=�E�ʭ����7"a���\~����f!��GB��
�Td�&���W� ��(�бR�
)z�!y�R.X�:�C�4��.�h�@�>��@��t�<����_�C��ځI�K��D��'YI�`�{98	
*���� R:�SC�l`��8�NA�y�;�.ę$�=�h%���\���P{y;�[�)���k�z��B	�X�TCj�}'�w�A�U�b�R�ǍO��=��x��(�O�\H�w�?|���Q�)�^�������"�܅4�EU�wqa��zl�%�b��+��W:jR��_����IEND�B`�PK�X�|˜�caravan_magazine_hindi.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>

import json

from mechanize import Request

from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(
        attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)}
    )


class CaravanMagazineHindi(BasicNewsRecipe):

    title = 'Caravan Magazine in Hindi'
    __author__ = 'Kovid Goyal, Gobelinus, Aareet Mahadevan'
    description = 'An Indian Journal of politics and culture'
    language = 'hi'
    timefmt = ' [%b, %Y]'
    encoding = 'utf-8'
    needs_subscription = 'optional'

    no_stylesheets = True

    keep_only_tags = [
        classes('post-title short-desc author-details cover'),
        dict(itemprop='articleBody'),
    ]

    remove_tags = [
        dict(name='meta'),
        dict(attrs={'class': ['share-with', 'img-wrap abs']}),
    ]
    remove_attributes = ['style']

    def get_browser(self, *args, **kw):
        br = BasicNewsRecipe.get_browser(self, *args, **kw)
        if not self.username or not self.password:
            return br
        data = json.dumps({
            'email': self.username,
            'name': '',
            'password': self.password
        })
        if not isinstance(data, bytes):
            data = data.encode('utf-8')
        rq = Request(
            url='https://caravanmagazine.in/api/users/login',
            data=data,
            headers={
                'Accept': 'application/json, text/plain, */*',
                'Origin': 'https://caravanmagazine.in',
                'Referer': 'https://caravanmagazine.in/',
                'Content-type': 'application/json;charset=UTF-8',
            },
            method='POST'
        )
        res = br.open(rq).read()
        res = res.decode('utf-8')
        self.log('Login request response: {}'.format(res))
        res = json.loads(res)
        if res['code'] != 200 or res['message'] != "Login success":
            raise ValueError('Login failed, check your username and password')
        return br

    # To parse article toc
    def parse_index(self):
        base_url = 'https://www.caravanmagazine.in/'
        soup = self.index_to_soup('{0}magazine'.format(base_url))

        # find current issue cover
        feeds = []
        sections = soup.find(
            attrs={
                'class': lambda x: x and 'current-magazine-issue' in x.split()
            }
        ).find(attrs={'class': lambda x: x and 'sections' in x.split()})
        for section in sections.findAll(
            attrs={'class': lambda x: x and 'section' in x.split()}
        ):
            a = section.find('a')
            section_title = self.tag_to_string(a)
            self.log('\nSection:', section_title)
            articles = []
            for article in section.findAll('article'):
                details = article.find(
                    attrs={'class': lambda x: x and 'details' in x.split()}
                )
                pre = details.find(
                    attrs={'class': lambda x: x and 'pre-heading' in x.split()}
                )
                if pre is not None:
                    pre.extract()
                a = details.find('a')
                url = base_url + a['href'].lstrip('/') + '-hindi'
                title = self.tag_to_string(a)
                desc = self.tag_to_string(details.find('div'))
                self.log('\t', title, url)
                articles.append({'title': title, 'description': desc, 'url': url})
            if articles:
                feeds.append((section_title, articles))

        return feeds

    def preprocess_html(self, soup):
        for div in soup.findAll(itemprop='image'):
            for img in div.findAll('img'):
                img['src'] = div['content']
        for img in soup.findAll(attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X������	carta.png�PNG


IHDR:����IDATx�R� ��s�[�&WSY�	d��Ԣdi��\�u�� �S�y7�r>5��nI��>�t4�sX+�x6@�c���@p�0���Ҷ��8��YS��g!P�{})k�K���{���HJ�_�k�9h�IEND�B`�PK�Xf�U�JJcarta.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net, Armin Geller>'


class Carta(BasicNewsRecipe):
    # Update 2017-09-01
    # Armin Geller

    title = u'Carta'
    description = 'Authors blog for politics, economics and digital community'
    __author__ = 'Armin Geller'  # AGe Update 2017-09-01

    timefmt = ' [%a %d %b %Y]'
    oldest_article = 14
    max_articles_per_feed = 50
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    encoding = 'utf-8'
    language = 'de'

    cover_url = 'http://www.carta.info/wp-content/themes/carta2014/img/carta-logo.svg'  # AGe Update 2014-10-05 new cover
    masthead_url = 'http://upload.wikimedia.org/wikipedia/de/b/ba/Carta_logo.png'
    #    masthead_url   ='http://www.carta.info/wp-content/themes/carta2014/img/carta-logo.svg'
    extra_css = '''
                      h2 {font-size: 1.3em; font-style: italic}
                      .excerpt {font-size: 1.2em; font-style: italic}
                      '''

    keep_only_tags = [
        dict(name='div', attrs={'class': ['article-text', 'author']}),
        dict(name='p', attrs={'class': 'tags'}),
    ]

    remove_tags = [
        dict(name='ul', attrs={'class': 'meta'}),
    ]

    feeds = [
        (u'CARTA - Standard', u'http://feeds2.feedburner.com/carta-standard-rss'),
        (u'CARTA - Homepage', u'http://feeds2.feedburner.com/carta-homepage-rss'),
        (u'CARTA - Agenda', u'http://feeds2.feedburner.com/carta-agenda-rss'),
        (u'CARTA - Ökonomie', u'http://feeds2.feedburner.com/carta-oekonomie-rss'),
        (u'CARTA - Medien', u'http://feeds2.feedburner.com/carta-medien-rss'),
    ]
PK�X�d���catavencii.png�PNG


IHDR��h6�IDATx�c��9�G���l�1����/��@����X���M�0���4����7Jܾ�WV ����e����%8�K��}C�@�T�4�(:�G����n[��bP1Bän�L��ʸk����@{P5L�j�b���������Y(gh���" !Ɗ���Y��s$
��V.PٶF�O�,޿4�t@�`m���+�
�MAA�����/�aff�k��d���U�g3Xx�
{vӀ��	\����!4�U���9��V�&)";IM���[Og&���;�s��~O�;��� !�����%p����ၪ��X
��`?!���(jJ���65�~���1HL��O�9Syy����ɲ5TKkR���`���O�o:��}�������xm�������A6@�K�k7�IEND�B`�PK�XS��catavencii.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
catavencii.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Catavencii(BasicNewsRecipe):
    title = u'Ca\u0163avencii'
    __author__ = u'Silviu Cotoar\u0103'
    publisher = u'Ca\u0163avencii'
    description = u'Ca\u0163avencii'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Romania'
    encoding = 'utf-8'
    cover_url = 'http://www.simonatache.ro/wp-content/uploads/2011/06/catavencii-logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'content'})
    ]

    remove_tags = [
        dict(name='div', attrs={'id': 'breadcrumbs'}), dict(name='span', attrs={
            'class': 'info'}), dict(name='div', attrs={'id': 'social-media-article'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': 'social-media-article'})
    ]
    feeds = [
        (u'\u0218tiri', u'http://www.catavencii.ro/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�
/[[
catavencu.png�PNG


IHDR''���"IDAT8�c�O` _��iV�$�niJ��I�)�G�;�R���?�?�X�S�[ݜ�u�>|x���_/�LJ�ġn��K��a����]��C�ۢe��L��-/^�}߅U]\�N>NFQu�����8�w���^W������y%k�^��������7��ŷ��LYP�v���۳��K:}RU���b~^[[���U��w+�c�[^t�Y\Ir��]I.V�J"�7�'a���9O7�7%T^��ULNU,y�c�b0��o��2K��f`a`�0s�p��#{C.��K\���*����¦T����О}G��EW��]UD@L^��� ~nKmݡ۶�/څ��BĮ&	n�Hi��{w&����m���a�v�o�V�����s,8q,@�c��[�f������ޞ�AU�A�\;��H�y�
�Z&��;�j��h.Ff.�8ˀ�K�*����߲E�x��*ȸy�0�Y,\�hM�Rt�M�=gA�UdFtҼ,;�����͟�4q����3g/��_Q9�6�)v�3fM\}]]c˴�K|Uj��?�kkw���S&M�0?#�6%l�����՟�k�Oi��4�#C�}O{wN��+�_�(�-����ѓه���L
l��C#U�B�u67NLً��l�]�+7/o��yս���Q��D�2&&^V�d>��5YS��;��Y��l�(���/�b}k��ghv��uRfh�+� o��G��Z����|)��G�g9�/�������ڂ�\kUWS�dp�����;���o�`b�q�j�.E�}|cIJQ��IEND�B`�PK�X����JJcatavencu.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
academiacatavencu.info
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AcademiaCatavencu(BasicNewsRecipe):
    title = u'Academia Ca\u0163avencu'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'Academia Catavencu. Pamflete!'
    publisher = u'Ca\u0163avencu'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare'
    encoding = 'utf-8'
    cover_url = 'http://www.inpolitics.ro/Uploads/Articles/academia_catavencu.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'entry-title'}),
        dict(name='div', attrs={'class': 'entry-content'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['mr_social_sharing_wrapper']}), dict(
            name='div', attrs={'id': ['fb_share_1']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': ['fb_share_1']})
    ]

    feeds = [
        (u'Feeds', u'http://www.academiacatavencu.info/feed')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X��ѷ��catholic_daily_readings.png�PNG


IHDR(-S'PLTE�b�d�a�k�k�l�l�l�l����������#tRNS@��fJIDATxڍ�A@0DQɈ}��Z�0V��yU��L�C<��R4Q�a`�p��Z��]��{�����Ey����T'��1�V�IEND�B`�PK�X�%���catholic_daily_readings.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1328971305(BasicNewsRecipe):
    title = u'Catholic Daily Readings'
    language = 'en'
    __author__ = 'adoucette'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
    (u'Daily Readings - USCCB', u'http://www.usccb.org/bible/readings/rss/'),
    (u'Daily Reflection - One Bread One Body', u'http://www.presentationministries.com/general/rss.asp'),

    (u'Mass Readings - Universalis', u'http://www.universalis.com/atommass3.xml'),
    (u'Saint Of The Day - CNA', u'http://feeds.feedburner.com/catholicnewsagency/saintoftheday')]
PK�X
����catholic_news_agency.png�PNG


IHDR  D����PLTEI������cA��������!I�)Q���ֽ�����������������签֔�ƥ����1Q�����k�����)I����ה������������������!I����/�NtRNS@��fIDATx^}�玄0�B�^��^��vc��n~2�-�J�;�m��
F4���Ğy��B�d����;3qX����]z�r�.���=��-�Dd��x��>t�4y}f/9p��DM�B�CF��FqA����`c�#�'�
q��q?.>��3�(�A�䊌a��z3��_�(W#^[|��7Dd�,8"�G�񵍅r���E�rI� Z,pT��>X��
}NCI�th�v����j���]�?�6ӷ.�IEND�B`�PK�X�V��catholic_news_agency.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1301972345(BasicNewsRecipe):
    title = u'Catholic News Agency'
    language = 'en'
    __author__ = 'Jetkey'
    oldest_article = 5
    max_articles_per_feed = 20

    feeds = [(u'U.S. News', u'http://feeds.feedburner.com/catholicnewsagency/dailynews-us'),
             (u'Vatican', u'http://feeds.feedburner.com/catholicnewsagency/dailynews-vatican'),
             (u'Bishops Corner',
              u'http://feeds.feedburner.com/catholicnewsagency/columns/bishopscorner'),
             (u'Saint of the Day', u'http://feeds.feedburner.com/catholicnewsagency/saintoftheday')]
PK�X��A33cato.png�PNG


IHDR��7��IDAT(�c����8E��Z�2+kJ�r�!��J:/i�%�0,�{��
L����̎�a21�����������B�3m��:ѥa���W��xp*��c��3	�4P��m��+B�(`���) �!RO�/ǣ n��Yx�`���$N��z��l���MzE(����2��o؊��ū�Y�⤞��\���]�\��U♗��eW֔�I)�s&�M�*9c��`��5v,IEND�B`�PK�X���=��cato.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class CATOInstitute(BasicNewsRecipe):
    title = u'The CATO Institute'
    description      	= "The Cato Institute is a public policy research organization — a think tank — \
dedicated to the principles of individual liberty, limited government, free markets and peace.\
 Its scholars and analysts conduct independent, nonpartisan research on a wide range of policy issues."
    __author__ = '_reader'
    __date__ = '05 July 2012'
    __version__ = '1.0'
    cover_url = 'http://www.cato.org/images/logo.jpg'
    masthead_url = 'http://www.cato.org/images/logo.jpg'
    language = 'en'
    oldest_article = 30  # days
    max_articles_per_feed = 100
    needs_subscription = False
    publisher = 'CATO Institute'
    category = 'commentary'
    tags = 'commentary'
    publication_type = 'blog'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    simultaneous_downloads = 10
    recursions = 0
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = True

    conversion_options = {
        'comments': description,
        'tags': tags,
        'language': language,
        'publisher': publisher,
        'authors': publisher,
        'smarten_punctuation': True
    }

    feeds = [
        (u'Cato Recent Op-Eds', u'http://feeds.cato.org/CatoRecentOpeds'),
        (u'Cato Homepage Headlines', u'http://feeds.cato.org/CatoHomepageHeadlines'),
        (u'Cato Media Updates', u'http://feeds.cato.org/CatoMediaUpdates'),
        (u'Cato@Liberty', u'http://feeds.cato.org/Cato-at-liberty'),
        (u'Cato Unbound', u'http://feeds.feedburner.com/cato-unbound'),
        (u'Education and Child Policy',
         u'http://www.cato.org/rss/ra.xml?name=education-child-policy'),
        (u'Finance, Banking & Monetary Policy',
         u'http://www.cato.org/rss/ra.xml?name=finance-banking-monetary-policy'),
        (u'Government and Politics',
         u'http://www.cato.org/rss/ra.xml?name=government-politics'),
        (u'International Economics & Development',
         u'http://www.cato.org/rss/ra.xml?name=international-economics-development'),
        (u'Political Philosophy',
         u'http://www.cato.org/rss/ra.xml?name=political-philosophy'),
        (u'Social Security', u'http://www.cato.org/rss/ra.xml?name=social-security'),
        (u'Telecom, Internet & Information Policy',
         u'http://www.cato.org/rss/ra.xml?name=telecom-internet-information-policy'),
        (u'Energy and Environment',
         u'http://www.cato.org/rss/ra.xml?name=energy-environment'),
        (u'Foreign Policy and National Security',
         u'http://www.cato.org/rss/ra.xml?name=foreign-policy-national-security'),
        (u'Health Care', u'http://www.cato.org/rss/ra.xml?name=health-care'),
        (u'Law and Civil Liberties',
         u'http://www.cato.org/rss/ra.xml?name=law-civil-liberties'),
        (u'Regulatory Studies', u'http://www.cato.org/rss/ra.xml?name=regulatory-studies'),
        (u'Tax and Budget Policy',
         u'http://www.cato.org/rss/ra.xml?name=tax-budget-policy'),
        (u'Trade and Immigration',
         u'http://www.cato.org/rss/ra.xml?name=trade-immigration')
    ]

    def print_version(self, url):
        R_unbound = re.compile(r'(^.*cato-unbound.*)(\/\?utm_source.*$)',
                               re.DOTALL | re.IGNORECASE)  # CATO Unbound
        R_pubs = re.compile(r'(^.*\/publications\/.*$)',
                            re.DOTALL | re.IGNORECASE)  # CATO Publications
        if re.match(R_unbound, url):
            printURL = r'\g<1>' + '/print/'
        elif re.match(R_pubs, url):
            printURL = url + '?print'
        else:
            printURL = url + '/print/'
        return printURL
PK�X�Lc��cbc_canada.png�PNG


IHDR  szz��IDATx�b ����^0vQ�תm۶m�vP�
k�nlԶm�v{�O�0�̤�V/�-Λ��m��w�
�)(�^4�p\�o��u�EdB7��n��a$K����c>�x�W��iaT�j��	�0]�R[SE�Ҹ�BpR�7���5�(�Bp
�m^� �=���	���&A����	�	p�8�0\���}D6�E����
�CձLK��pI�
�q�Q'�Ѯq��!(�چ��%Z���ꨀP�fѨ��^WS�������07�P�WD2���=�7�O���3��+2L�t�ԧ���#!���x�oB�Em�!ذ�=�b2S�S�:���9�Ge,a�`��1�/U��9�,�@��؈��zw�_fa�%@7������u���w�[0��(�Q%K�a��d����&L����8��B
� ��k�~�Tư+����A,>��ebz�Sp	�� %�*���SN(��8�\Be�^��R��t��c��ሮ�>�j��4E�z�7�~�r4�~�}�Z+�3��(c���G�,SP�%@0.D�C��6��0��P	_
S�B��.�)��ځ�ʸf�w�!�/d��[��Oơ��FZ=�a;v`�ik�:��d��h����
	�d�� '�<��Sb����	f &1��s�>�"sl���Z��"��ZIEND�B`�PK�X�L!55cbc_canada.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1384137533(BasicNewsRecipe):
    title = u'CBC Canada'
    language = 'en_CA'
    __author__ = 'rty'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True

    feeds = [(u'Top Stories', u'http://rss.cbc.ca/lineup/topstories.xml'),
             (u'World', u'http://rss.cbc.ca/lineup/world.xml'),
             (u'National', u'http://rss.cbc.ca/lineup/canada.xml'),
             (u'Toronto', u'http://rss.cbc.ca/lineup/canada-toronto.xml'),
             (u'Business', u'http://rss.cbc.ca/lineup/business.xml'),
             (u'Politics', u'http://rss.cbc.ca/lineup/politics.xml'),
             (u'Sci & Tech', u'http://rss.cbc.ca/lineup/technology.xml'),
             (u'Offbeat', u'http://rss.cbc.ca/lineup/offbeat.xml')]
PK�X{�255cbn.png�PNG


IHDR  D���iPLTE��������//�CC�SS����������ϧ��gg�ww������������𳋋���翿�۳�����À���cc����e8OtRNS@��fzIDATx^}��V�@`_Mo�-���Ց�
D?s���I%��_K� ���G�3�o�|��'��:�b��z��	:��K��dgF�%":�5�?����55' �5o@ù��������{�`E��dg������j�����p�i�t[�i�kt��xT��w���eTB�wU�,�����5��d�J37u���m�<���+=8�uVo
�@�k�Ti��;��<
.�5�U�:L@�� ~?G[E'�����ΰ��e�>OpyL3�
�<�	�	�2���
p��B$�����K�V� ms�2���P�R�Y���`

Ӽ.��'��&K�����#�����PچEl�7DpR�sW#-x�>��|q5�IEND�B`�PK�X���ll
cbn.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class CBN(BasicNewsRecipe):
    title = u'CBN News'
    __author__ = 'Roger'
    # TODO: I just noticed this is downloading 25+ articles, while
    # the online site is only publishing at most 7 articles daily.
    # So, somehow this needs to be fixed it only downloads max 7 articles
    oldest_article = 7
    max_articles_per_feed = 100

    description = 'The Christian Broadcasting Network'
    publisher = 'http://www.cbn.com/'
    category = 'news, religion, spiritual, christian'
    language = 'en'

    # Make article titles, author and date bold, italic or small font.
    # TODO: Could use a smaller title text
    # TODO: Italicize Author and Publisher?
    #
    # http://www.cbn.com/App_Themes/Common/base.css,
    # http://www.cbn.com/App_Themes/CBNNews/article.css",
    # ... and many more style sheets.
    # extra_css = '''
    #                .story_item_headline { font-size: medium; font-weight: bold; }
    #                .story_item_author { font-size: small; font-style:italic; }
    #                .signature_line { font-size: small; }
    #            '''

    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en'
    encoding = 'iso-8859-1'
    conversion_options = {'linearize_tables': True}

    # TODO: No masterhead_url for CBN, using one I grepped from a news article
    # (There's a better/higher contrast blue on white background image, but
    # can't get it or it's too big -- embedded into a larger jpeg?)
    masthead_url = 'http://www.cbn.com/templates/images/cbn_com_logo.jpg'

    keep_only_tags = [
        dict(name='h1', attrs={'id': 'articleTitle'}),
        dict(name='div', attrs={'class': 'articleAuthor'}),
        dict(name='div', attrs={'class': 'articleDate'}),
        dict(name='div', attrs={'class': 'articleText'}),
    ]

    remove_tags = [
        # The article image is usually Adobe Flash Player Image
        # The snapshot .jpg image files of the video are found
        # within a URL folder named "PageFiles_Files"
        # Filter this for now.
        # (Majority of images seem to be Adobe Flash.)
        dict(name='div', attrs={'class': 'articleImage'}),
    ]

    # Comment-out or uncomment any of the following RSS feeds according to your
    # liking.
    # A full list can be found here: http://www.cbn.com/rss.aspx

    feeds = [
        (u'World', u'http://www.cbn.com/cbnnews/world/feed/'),
        (u'US', u'http://www.cbn.com/cbnnews/us/feed/'),
        (u'Inside Israel', u'http://www.cbn.com/cbnnews/insideisrael/feed/'),
        (u'Politics', u'http://www.cbn.com/cbnnews/politics/feed/'),
        (u'Christian World News', u'http://www.cbn.com/cbnnews/shows/cwn/feed/'),
        (u'Health and Science', u'http://www.cbn.com/cbnnews/healthscience/feed/'),
        (u'Finance', u'http://www.cbn.com/cbnnews/finance/feed/'),
    ]
PK�X��g�33
cd_action.png�PNG


IHDR��h6�IDATx�u�Q/cQ��=w҉����>�x�0�_0�_0�`��	!�TH���E��R"���h�
�J@Z�W@@�d�U��t�v}{��n��婦�s�&-�J�ҿ�����s���z���'jG:wK�*S��ǁ�r�o�b�+��h�l[a���_#�-'�5o��6z7%����r�n��YHa�u�h�����P��1��4RJ|_�`t?l�v���&����iK�N�fKQ�|�+o(<2�"�O��֌���*9�p+_W�0g3y�8���C���'5c,�S��6	`�\:
�9节F@X�{v�.��E�����;
B�7g�3ep
�c��1�H��l�#��V|tg��+�+�^��7C��I��{�����Qh���?��B�
O1���姉��I�`��+�܃$\���YSCꗓ��-��c��W�b`&�x�Z�[GSi�����8d�s�116���^a�~�2�IEND�B`�PK�X�+����cd_action.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class CD_Action(BasicNewsRecipe):
    title = u'CD-Action'
    __author__ = 'fenuks'
    description = 'Strona CD-Action (CDA), największego w Polsce pisma dla graczy.Pełne wersje gier, newsy, recenzje, zapowiedzi, konkursy, forum, opinie, galerie screenów,trailery, filmiki, patche, teksty. Gry komputerowe (PC) oraz na konsole (PS3, XBOX 360).'  # noqa
    category = 'games'
    language = 'pl'
    index = 'http://www.cdaction.pl'
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    keep_only_tags = dict(id='news_content')
    remove_tags_after = dict(name='div', attrs={'class': 'tresc'})
    feeds = [(u'Newsy', u'http://www.cdaction.pl/rss_newsy.xml')]

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.cdaction.pl/magazyn/')
        self.cover_url = 'http://www.cdaction.pl' + \
            soup.find(id='wspolnik').div.a['href']
        return getattr(self, 'cover_url', self.cover_url)

    def preprocess_html(self, soup):
        for a in soup.findAll('a', href=True):
            if 'http://' not in a['href'] and 'https://' not in a['href']:
                a['href'] = self.index + a['href']
        return soup
PK�X4���cdrinfo_pl.png�PNG


IHDR�aGIDATx�b\��K,VnК	(�`��8<�Wqc5�m�=�kۘ���l�fP�n���=�ź_�
�Ǜ�)zO�����z=����*g�7��(YE��'���3�
�Í.����vU�@a}[��J� ]����KG�n��[M�!B�m��d��_���3�7���*�֡rDW�r��qe'�U4�ĸ*�6��ߑ��@���'s0�ί>�$�R�HY�����(�ogF�y,��-�Mݖ[,k�W7n�
d�>n�y�o��a4�c���)��#���Gn݋O^,!��]=����rÉ.�f"!��H<��k�k����=Ϋi�W֝��}d�#��]�( ��		���`Z�Y���Q�)X3*Hp�	�
�#�E�HJwhQL�6���:u�aw�ĒQ�T�5��gFU��i�R��*2Ec(N�oͶ����3��kV�K��&��z8���qwnim�<l$�M-K��8#ݰ}ﻃ�#��%�Aj�y�rI"Ф&ᮠѝ��y57���g6%�â�ƧP�ln�Le0�䗜2�7������=]�K��?�,�jC��SIEND�B`�PK�X���3��cdrinfo_pl.recipe__license__ = 'GPL v3'
import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment


class cdrinfo(BasicNewsRecipe):
    title = u'CDRinfo.pl'
    __author__ = 'fenuks'
    description = u'Serwis poświęcony archiwizacji danych. Testy i recenzje nagrywarek. Programy do nagrywania płyt.  Dyski twarde, dyski SSD i serwery sieciowe NAS. Rankingi dyskow twardych, najszybsze dyski twarde, newsy, artykuły, testy, recenzje, porady, oprogramowanie. Zestawienie nagrywarek, najnowsze biosy do nagrywarek, programy dla dysków twardych.'  # noqa
    category = 'it, hardware'
    # publication_type = ''
    language = 'pl'
    # encoding = ''
    # extra_css = ''
    cover_url = 'http://www.cdrinfo.pl/gfx/graph3/top.jpg'
    # masthead_url = ''
    use_embedded_content = False
    oldest_article = 777
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    remove_javascript = True
    remove_attributes = ['style', 'onmouseover']
    preprocess_regexps = [(re.compile(u'<p[^>]*?>Uprzejmie prosimy o przestrzeganie netykiety.+?www\\.gravatar\\.com</a>\\.</p>', re.DOTALL), lambda match: ''),
                          (re.compile(u'<p[^>]*?>.{,2}</p>', re.DOTALL), lambda match: '')]
    ignore_duplicate_articles = {'title', 'url'}

    keep_only_tags = [
        dict(name='input', attrs={'name': 'ref'}), dict(id=['text', 'text2'])]
    remove_tags = [dict(attrs={'class': ['navigation', 'sociable', 'last6news']}), dict(
        name=['hr', 'br']), dict(id='respond')]
    remove_tags_after = dict(id='artnawigacja')
    feeds = [(u'Wiadomości', 'http://feeds.feedburner.com/cdrinfo'),
             (u'Recenzje', 'http://www.cdrinfo.pl/rss/rss_recenzje.php'),
             (u'Konsole', 'http://konsole.cdrinfo.pl/rss/rss_konsole_news.xml'),
             (u'Pliki', 'http://www.cdrinfo.pl/rss/rss_pliki.xml')
             ]

    def preprocess_html(self, soup):
        if soup.find(id='artnawigacja'):
            self.append_page(soup, soup.body)
        return soup

    def append_page(self, soup, appendtag):
        baseurl = 'http://cdrinfo.pl' + \
            soup.find(name='input', attrs={'name': 'ref'})['value'] + '/'
        if baseurl[-2] == '/':
            baseurl = baseurl[:-1]
        tag = soup.find(id='artnawigacja')
        div = tag.find('div', attrs={'align': 'right'})
        while div:
            counter = 0
            while counter < 5:
                try:
                    soup2 = self.index_to_soup(baseurl + div.a['href'])
                    break
                except:
                    counter += 1
            tag2 = soup2.find(id='artnawigacja')
            div = tag2.find('div', attrs={'align': 'right'})
            pagetext = soup2.find(attrs={'class': 'art'})
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
            for r in soup2.findAll(attrs={'class': 'star-rating'}):
                r.extract()
            for r in soup2.findAll(attrs={'class': 'star-rating2'}):
                r.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
        tag.extract()
PK�X���CC	cedar.png�PNG


IHDRaa�ϣ
IDATx���$���Y�l+��ne��ٶ_f���VV�gm۶m۶m���譽j����[����ʃ����Ԣf*1�G��X�<S���q� Q�EΜ%�qA�ܝpd��ܿtЛ��vžQ��߬��FyN�'L��}V�(-�i8A9�
A����A�j:4J2���q¸�H�X�O]��ʙp�h�
J+�(I=����lgN���%f���^u@b����
��f���]3�U�����:���(�W�Z�=�R�'������ǰ+�!GT��o7�xg��������R��1��B�A�X!;���ۯ�S�b��*ʙ�ӯ49�鬳��MA����;����-<��7*&���	���8�NA� S����:r.��]Mʹ�
��3z߭����S���ir��n
���ɛ=ȿ�����q��p4�տ;o޼7��ظ)��7����?_CM������'f{l���_����h�T���>�?������ �d�vMAzHz��{�,��ȹ�Vh�9G
�C����x%�K�����ӻ�*(��YK�fٞT��������L9�?������j	Q�ߍsf"!N��M���G�'��v�z�i'��Aߩ��M�����3������nn��G�N�O�� �E�q�-�f~�A�y�/j�y>��\�`Q�9A��VI�x�y�yÛ��Yn�U�Ɏ��N8XP�5���/�l��9
�(��U��)|�z�S��ː�+I��$�q�Za�<i��gPd���M�*��+�U�q�q�!���TL�����o�t5/1���wR
�4{�C�|��ɼMޘ����1�ޯT��a�@�Jت;M����.���S�4۰���~'r�%�n����R��!���I%f;��J���%���G���v�i�B�v;�X.̼�}5I�J���z#H?A��M%�I=�h����M�X�s�@���5��!�2rί�����A�7�N0�6�W�@�!��w���~����1�苕3"�T������wG�-���3F7.�Z���2w��Hv��%�8C��L�z���� �I[ƨ&f�r���H�<��Bf2���<�wy o��(
g.�R�I!`��.r�_�گ���Ũ������_��=7��M�0��S�6��ʔ��
rm2�4bq�j���E$W�~-u����{�?ߏ<�N�� �����!t�ӈ�T�=ј��7�&A�F�l��=�ːr�q(��/8t��IP�ũ��rR��C�9y������l�4�9�>��$���f�)�:�IM�#|C{�fhnfӜm�X-��X�/��έ]-�3�t��d�̠_[�Ĝ9��
5�,��m{�/3:^D��n�8�a��i��(5�W��%�B��|��
S3z�p���pB^�]%Lq2YK�
�92��b���y��a.�'����� �bg4T��98��1د�Z�m���NH���s��(��u�'v~�D��p��C���3��r�ٰ@9�7��8��"apq�	�dS�J�8��ߡ���������4���麝�M|/ek�1��Wj���3�A���nM#}�4l�=5��$xr	�kfѹ{����P�9Wf�JPl��!옐y��VN��#r�S��ؖ�n�͹����Y���u9��A�!���Ȫ��eBj�؉�E�kg�t�!�at��3�A�M��PX���N�[48hNZr���j$O9�Âr}Bej��C
�QX�Au�"�D.�T�C��K��=�{CO��r���ۿNd�)h�$C��D��
Ae}|�����B������.�E/BQ�'�x.z5�,��(��f�8BZ7�D.4̒=:�Ԭϙ7�#��w�y���B��3�7��$�6_"��@C�2��b��B�R�+����)0�(�

�m�9A�}�1WB+g��ɃT�q0�7,*.f��	̓���:-��"�ܜ�Éٍ�������F���������z̘!�z�~:�?m�8B�*����?�s�BhJY�Z��pRsoȹ�B�C5�G���f�VG���׆PQ S�\#T���P���B�4rw�MBE6�IMՃ���P�4N����C\�%O�
���:�#�/q *8S@SW��q��
~���D��\]0f}O�
gtcEN?��幼�O.E�A
�d��坐�/Z�=sKn���x�K蛖\)M.��9�AH�S�'Rvz���k��g�92�b�0���d
�p�a
*3�-?�n���L��**tEt�t��IM��0�����"G�ӑ����_��Ÿg�\�D�����0�	X�'�P���p�q8P�.l��
�cZ��Z1�	9�Eht�]*QŸN�~>����� �sJ��ALnpG�qA� ���<2�M[^���#���"�D͇n�*�{�v^�Q$�=�Q%�E���>�;�%�/�ޥ��dv�[?vW����~�~8�R~��n�W
<�T�aN�(��2�nUaܺ77�u��Cg��̵~���4�� 7� ���d��AɁ8,$��\))gv�意���2�N�����5
��Q��
4�G�:�8�{e�O��`䮂��ZMf�A�~0�8!�|>��0X��-��q&aI4��)$)�)�^Q��_�[�?t!}�"��)p�'P��߉��Ɨ{���'�!%dN��Q�=I8m��Q�0H��_uW1�:�$�;�}m��[��'cp�lA�D�'@�	%Z�v�fA�Dzы�&CLK�X\�E�6i�ϴL3IEND�B`�PK�X�=-O__cedar.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Cedar(BasicNewsRecipe):
    title = u'\u041A\u0435\u0434\u0440'
    description = u'\u041D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0435 \u043C\u0435\u0434\u0438\u0430 \u043E\u0431 \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u0435'  # noqa
    __author__ = 'bugmen00t'
    publication_type = 'blog'
    oldest_article = 30
    max_articles_per_feed = 20
    language = 'ru'
    cover_url = 'https://kedr.media/wp-content/themes/kedrmedia_gutenberg/assets/img/logo-bg.svg'
    auto_cleanup = True
    no_stylesheets = False

    remove_tags_before = dict(name='div', attrs={'class': 'post-header'})

    remove_tags_after = dict(name='div', attrs={'class': 'post-content'})

    feeds = [(
        u'\u0418\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u044F',
        'https://kedr.media/category/research/feed'
    ),
             (
                 u'\u0418\u0441\u0442\u043E\u0440\u0438\u0438',
                 'https://kedr.media/category/stories/feed'
             ),
             (
                 u'\u041C\u043D\u0435\u043D\u0438\u044F',
                 'https://kedr.media/category/opinions/feed'
             ),
             (
                 u'\u0418\u043D\u0442\u0435\u0440\u0432\u044C\u044E',
                 'https://kedr.media/category/interview/feed'
             ),
             (
                 u'\u041E\u0431\u044A\u044F\u0441\u043D\u044F\u0435\u043C',
                 'https://kedr.media/category/explain/feed'
             )]
PK�X�m둹
�
ceska_pozice.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class ceskaPoziceRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Česká pozice'
    description = 'Česká pozice'
    oldest_article = 2
    max_articles_per_feed = 20

    feeds = [
        (u'Všechny články', u'http://www.ceskapozice.cz/rss.xml'),
        (u'Domov', u'http://www.ceskapozice.cz/taxonomy/term/16/feed'),
        (u'Chrono', u'http://www.ceskapozice.cz/chrono/feed'),
        (u'Evropa', u'http://www.ceskapozice.cz/taxonomy/term/17/feed')
    ]

    language = 'cs'
    cover_url = 'http://www.ceskapozice.cz/sites/default/files/cpozice_logo.png'
    remove_javascript = True
    no_stylesheets = True
    domain = u'http://www.ceskapozice.cz'
    use_embedded_content = False

    remove_tags = [dict(name='div',   attrs={'class': ['block-ad', 'region region-content-ad']}),
                   dict(name='ul',   attrs={'class': 'links'}),
                   dict(name='div',   attrs={
                        'id': ['comments', 'back-to-top']}),
                   dict(name='div',   attrs={
                        'class': ['next-page', 'region region-content-ad']}),
                   dict(name='cite')]

    keep_only_tags = [dict(name='div',   attrs={'id': 'content'})]

    visited_urls = {}

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        if url in self.visited_urls:
            self.log.debug('Ignoring duplicate: ' + url)
            return None
        else:
            self.visited_urls[url] = True
            self.log.debug('Accepting: ' + url)
            return url

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body, 3)
        return soup

    def append_page(self, soup, appendtag, position):
        pager = soup.find('div', attrs={'class': 'paging-bottom'})
        if pager:
            nextbutton = pager.find('li', attrs={'class': 'pager-next'})
            if nextbutton:
                nexturl = self.domain + nextbutton.a['href']
                soup2 = self.index_to_soup(nexturl)
                texttag = soup2.find('div', attrs={'class': 'main-body'})
                for it in texttag.findAll('div', attrs={'class': 'region region-content-ad'}):
                    it.extract()
                    for it in texttag.findAll('cite'):
                        it.extract()
                        newpos = len(texttag.contents)
                        self.append_page(soup2, texttag, newpos)
                        texttag.extract()
                        appendtag.insert(position, texttag)
                        pager.extract()
PK�X�B�iiceskapozice.png�PNG


IHDR  ��tRNSn��	pHYs��	IDATHǝ�َ���Yd�)Q��R���ٗ8c�a��g�]��d��U�q|c`�m���^��Vk�(�"�UU�b.Z�3�$��"�N�Z�_��4��+�v{k��{XkwJ��R(H�,��+J�8���;�a�}�F`��R`�	!�ҭ��Jk�ju�Jͪ׫�vk�S�LMQ%Q�U�g�̛�\�3���ͽ��?����J�	!ҍ�k[;��mߺ����͢��f�ݬW�%CSe��2�����(5�-�x.z�/����׽9�+�i�Uo�too߹���߮Z
�_���+
FXNV[Uckow��Axy9�9�Ae����ȷ	�7���X��ѝ��a{g��lnYƁ�l�	���_g����d�\��͏?J[5
�u����9�l5�r�v�OfPim�ܺ��;h5;��B�r�O����ϿBߞ��	$��6J<�Tsn�l	�-QŔ���pƖ�k;?i�4��jn�l��oZƞ�Zc}�����.�/�� \�!�9`�{�9?~�=���O�}D�R�(�C�g���7�R��64ݔ�լ5+��}���g���桯��\�ƕ�+�=5��j�
��έCr��
��;��bks7��(�$0�jg�P+�"�]۶ʅ�3�������կ��+��a�h�d�}�G��^��O�_V����/^� ����ͳ5�`�z�\�h���Xt��iwx�i���g��¨����ĀPAmұ5�Ϟ>�~�0e��*����fV�y�`�"IªnT굚e*��ф�Sq�6�(~km�
 	�ϭNQ��­(E���"��B�P���j%tu+kQ��ŢU*)�������`f�!�'r�\3SU�-�ME�\r��1'�Bϰ�:R����!M5J%E-Ȳ�0��y.#Q�%��(#A�s�!�J��g�� �� _ɜSK@2�d�!�B� "Y�B�۔��Ҕ,I��R��"O21Mu�Wٲ���"�$�S��9N�hf�DQ
�JE(�x�EI��	�4��kc4K}o�ZVr 
�4�"a��Fwhp���6j� ���¹7t�_�('����@�:8�"�\7�,[�0
fS�\��	+�Ք�a����r�CFi)�B���/\W�K"�>��_U+���<'���?��I�X<�.\�J�%Y'~��MKy��t�/�������MDJG\P@�f
���D���V��7�̑d�lo6�S�t��p>[� p����r�ٓiW�mY�~�>���*��oJ�s9�o���F����~����]��g����_f�2�<�N���]�y��(��:��~@����>(7�r��~V_�?]��[���>��������E�0:����x<�׎�ণE�̾8O�,M:�Y*5����?I�4�ǖ)&@."M�7��߿���>���<�L������w�WkGC��$�v�<ԍb�r>,�:���^�ѝb�r� �hb*���q:q�N��t>s'�^<_s���[~�]{��#�h֚MJ�}�o6닃�tk��jV�0��\�zH�3�]���&�?�s��Ɨ�~�eƮ߇�3��z�Vn�V�U׃?s�v���j���h2�L���`p1���F���=���>h�\yr�ul�4w�=�d$0�%E@����{ě�%�ݡ���7��e�/ә=t���'?x���a�r�_�J�Z?A0>?M°��,Džj�Sѐ�U	�7�z����`:�4MB?tg�u�x�?���B�۶c������^��9�"��a���b�N���ًgWaM�c��uĺ	x30Ʈ�Joxv<�ܪ�:+�@W|'3Ƕ���Z_�o��U��i�#d��
���t�ͺ���b�{��1�Xc��iz���(!�!�Q�$Q��37
��B]���p���Y&߷GI���4���zU��������§�b:�$ɒd挳8ZW�����di�J��q�X?�{=�����I��MIEND�B`�PK�X��66ceske_noviny.png�PNG


IHDR�a�IDATxڴ�C��1S�X�k۶m۶m۶m۶����4��7q2_,�G"n�W!�3v�S�'��&X�L��YI��ȱ�N�s����n	׽���/��v�;>��G\��a�Jts�m��Z��C������i?럨�8�K7�#�S�tX<{�w����|��pe���LD��B�����<	�ݠ�k5���&��x��XO�^���tçn#m�&���!��,��Ɖ�w��~..= [��4����Q���T s�a\�����C�E����zl A������N�7!�T!^�v<~�ΛyON�B�E3���	9K��[��AD쪔�9
�̥�g�Zt�/'*�i��c �x5�������k6�ar�U��/B|�S�֨p������Jݓ>�j0����nA����C�Ɨ�39���Lڴ/?�eY,���)�W�$�
Ox��C�vb�xN�n�	��_�C/Uv<S�Ba�,_�����~�}�IEND�B`�PK�X���.��ceske_noviny.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class ceskenovinyRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'České Noviny'
    description = 'ceskenoviny.cz'
    oldest_article = 1
    max_articles_per_feed = 20

    feeds = [
        (u'Domácí', u'http://www.ceskenoviny.cz/sluzby/rss/domov.php')
    ]

    language = 'cs'
    cover_url = 'http://i4.cn.cz/grafika/cn_logo-print.gif'
    remove_javascript = True
    no_stylesheets = True

    remove_attributes = []
    filter_regexps = [r'img.aktualne.centrum.cz']

    keep_only_tags = [dict(name='div', attrs={'id': 'clnk'})]
PK�X�j���cesky_rozhlas_6.png�PNG


IHDR  ��tRNSn��eIDATx^Օ]��E�t7�r��])�
A��-�����%�VYr�NM׭X���9?�O���T�������_�n��˼��PH�A��}�';����N#�'i��P>MJ��w���W׿��j���>������r|�ܿ�~g������ve���՟�뤹�:"'"�-K9�����[�~��zz��è��je��Kl�.;�["U��"wWƳ+���?'}���6c�Ǡ>��9�lv��m�:����G�&ՀN��C@X.�f/�{tE��e��k�f��!��$�P�s�F�``�%������mXݯ�M��;R�:	D�����RZ��8f�
�Z�n[���:uAA�	:" {d:�f3�oF�\���/�zu����dh� 9�DBA8�vYJZ�z�e[�8�uo��ռ�n���b".(��o�h��h���5�m=�RR}��*�
����V�>�m��%2-+	5�㻋��\MTS;�nR��-�4�'N�Soo��^�2�0:�)�
D8E��6�����}?�f�8~8�÷��W�p<�C�uAt�$�1?����w�����^�����Y�WH��OI�RI]^�O�d&R��4=��`OvQ���/��0ߦe%	�A$�D��8�ށ���`���o�������ɲ�]�P#�</b����fJ�}��[T�N��ͼ{���\�b��D,X#Y�-e{)��<��f��9��r�2B�ݒ���;�475���}yxX�7Z���'Z0�tn��\W��K���=K$!���|��T󔓜	xZ0ML��;X�"��	�Dndkx����or�����8���3��q7��<����7���I H�� \��c
� Y>�O��`���0��)��nCj�H�� ��9j���r�V��狂R�_Kզ�
�#�:�C�@��9V �ɨ>���]�q�y���'lh��A��qp�������p�ͺ�����糑ƺ���JIUI �H�șmPZ�.���_��d��n��^V�*Ȁ�9Bʩ�r����|1�'�t�0�$��$��I��R��.���x2����/.�4p:�IEND�B`�PK�X��>�88cesky_rozhlas_6.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class cro6Recipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Český rozhlas 6'
    description = 'Český rozhlas 6'
    oldest_article = 1
    max_articles_per_feed = 20

    feeds = [
        (u'Český rozhlas 6', u'http://www.rozhlas.cz/export/cro6/')
    ]

    language = 'cs'
    cover_url = 'http://www.rozhlas.cz/img/e5/logo/cro6.png'
    remove_javascript = True
    no_stylesheets = True

    remove_attributes = []
    remove_tags = [dict(name='div',   attrs={'class': ['audio-play-all', 'poradHeaders', 'actions']}),
                   dict(name='p', attrs={'class': ['para-last']})]

    keep_only_tags = [dict(name='div', attrs={'id': 'article'})]
PK�XgRG�cetnixploitation.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
chetnixploitation.blogspot.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Chetnixploitation(BasicNewsRecipe):
    title = 'Chetnixploitation'
    __author__ = 'Darko Miletic'
    description = 'Filmski blog'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'sr'
    publication_type = 'blog'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = True
    extra_css = ' @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: "Trebuchet MS",Trebuchet,Verdana,sans1,sans-serif} .article_description{font-family: sans1, sans-serif} img{margin-bottom: 0.8em; border: 1px solid #333333; padding: 4px } '  # noqa

    conversion_options = {
        'comment': description, 'tags': 'film, blog, cetnici, srbija, ex-yu', 'publisher': 'Son of Man', 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]
    feeds = [(u'Posts', u'http://chetnixploitation.blogspot.com/feeds/posts/default')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XGG����
cgm_pl.png�PNG


IHDR:���cIDATx�c�
`�+�P�*�/+/�c
���s_<uʜ5-'Zw���*�o�O���u��rS�w����%�f��L����./e?�`� �0�;�`);s>��#~j֒IEND�B`�PK�Xf�||
cgm_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class CGM(BasicNewsRecipe):
    title = u'CGM'
    oldest_article = 7
    __author__ = 'fenuks'
    description = u'Codzienna Gazeta Muzyczna'
    masthead_url = 'http://www.cgm.pl/img/header/logo.gif'
    cover_url = 'http://www.krafcy.com/foto/tinymce/Image/cgm%281%29.jpg'
    category = 'music'
    language = 'pl'
    use_embedded_content = False
    remove_empty_feeds = True
    max_articles_per_feed = 100
    no_stylesheets = True
    extra_css = 'div {color:black;} strong {color:black;} span {color:black;} p {color:black;} h2 {color:black;} img {display: block;} ul.galleryImagesList {list-style: none;} li.item {float: left;} .calibrenavbar {clear: both;}'  # noqa
    remove_tags_before = dict(id='mainContent')
    remove_tags_after = dict(name='div', attrs={'class': 'fbContainer'})
    remove_tags = [dict(name='div', attrs={'class': ['fbContainer', 'socials']}),
                   dict(name='p', attrs={
                        'class': ['tagCloud', 'galleryAuthor']}),
                   dict(id=['movieShare', 'container']), dict(name='br')]
    feeds = [(u'Informacje', u'http://www.cgm.pl/rss.xml'), (u'Polecamy', u'http://www.cgm.pl/rss,4,news.xml'),
             (u'Recenzje', u'http://www.cgm.pl/rss,1,news.xml')]

    def preprocess_html(self, soup):
        gallery = soup.find('div', attrs={'class': 'galleryFlash'})
        if gallery and gallery.div:
            img = gallery.div
            gallery.img.extract()
            if img:
                img = img['style']
                img = 'http://www.cgm.pl' + \
                    img[img.find('url(') + 4:img.find(')')]
                gallery.contents[1].name = 'img'
                gallery.contents[1]['src'] = img
                pos = len(gallery.contents)
                gallery.insert(pos, BeautifulSoup('<br />'))

        for item in soup.findAll(style=True):
            del item['style']
        ad = soup.findAll('a')
        for r in ad:
            if 'www.hustla.pl' in r['href'] or 'www.ebilet.pl' in r['href']:
                r.extract()
        return soup
PK�X�ǻ���champion.png�PNG


IHDR(-S0PLTE���#$�34�GH�WX�mn�}~ؑ�०纺���������������{IDATx�b��.�@����:leyk����r�
Uȣ�т�-*4�F �����e�%�ʑ�+��^԰�����N��n�I� �����N:�'��G�#��
�	$Ꭱ��a�
"�#�:�IEND�B`�PK�Xu���champion.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1434054160(BasicNewsRecipe):
    title = 'Champion.com.ua'
    __author__ = 'rpalyvoda'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'uk'
    cover_url = 'http://www.champion.com.ua/images/logo.gif'
    masthead_url = 'http://www.champion.com.ua/images/logo.gif'
    auto_cleanup = True

    feeds = [
        ('\u0421\u0442\u0440\u0456\u0447\u043a\u0430 \u043d\u043e\u0432\u0438\u043d',
         'http://www.champion.com.ua/rss/'),
        ('\u041f\u0443\u0431\u043b\u0456\u043a\u0430\u0446\u0456\u0456',
         'http://www.champion.com.ua/rss/view_pubs/'),
        ('\u0424\u0443\u0442\u0431\u043e\u043b',
         'http://www.champion.com.ua/rss/id_415/'),
        ('\u0422\u0435\u043d\u0456\u0441',
         'http://www.champion.com.ua/rss/id_2682/'),
        ('\u041b\u0435\u0433\u043a\u0430 \u0430\u0442\u043b\u0435\u0442\u0438\u043a\u0430',
         'http://www.champion.com.ua/rss/id_2390/'),
        ('\u0420\u0435\u0491\u0431\u0456',
         'http://www.champion.com.ua/rss/id_2690/'),
        ('\u0424\u0435\u0445\u0442\u0443\u0432\u0430\u043d\u043d\u044f',
         'http://www.champion.com.ua/rss/id_5961/'),
        ('\u0428\u0430\u0445\u0438', 'http://www.champion.com.ua/rss/id_2697/'),
        ('\u0410\u0432\u0442\u043e\u0441\u043f\u043e\u0440\u0442',
         'http://www.champion.com.ua/rss/id_2604/'),
        ('\u0411\u043e\u043a\u0441', 'http://www.champion.com.ua/rss/id_476/'),
        ('\u0411\u0430\u0441\u043a\u0435\u0442\u0431\u043e\u043b',
         'http://www.champion.com.ua/rss/id_475/'),
        ('\u0413\u0430\u043d\u0434\u0431\u043e\u043b',
         'http://www.champion.com.ua/rss/id_2703/'),
        ('\u0425\u043e\u043a\u0435\u0439', 'http://www.champion.com.ua/rss/id_479/'),
        ('\u041b\u0438\u0436\u0456', 'http://www.champion.com.ua/rss/id_2704/'),
        ('\u0411\u0456\u0430\u0442\u043b\u043e\u043d',
         'http://www.champion.com.ua/rss/id_474/'),
        ('\u0424\u0456\u0433\u0443\u0440\u043d\u0435 \u043a\u0430\u0442\u0430\u043d\u043d\u044f',
         'http://www.champion.com.ua/rss/id_2698/'),
    ]
PK�X��n���
cherta.png�PNG


IHDR  D����PLTE���������������������������������������������������������������������������������������FFFeee����������������+++������...555vvvwww{{{���������������������������������222''';;;���DDD���������HHHLLLPPP���UUUZZZ"""��ttRNS
()+0Z[����������������JIDATxڄ�r�0��53��a��ef��}:rŞ�7�o^��lxAR�q�lR���S�I�rl���{�B
8=�-"mc;+T����a�?gڃ��Pʡߟ��ň�e祍�M�+Yܑ�x,H�'��I<d��a#@@Jy��2��
�oW��+\l	<ط߄���oDŽt�A%�6��vr�j���_렀��{BuŃdڧK�� ���џ������ �fϓNj�n�&�� ��}�G�1�d�pۻ(!ĦV���
B6�j�M�Z���sڶ��B��dؐ�4)^}�*l�L7��"	<C�B8�^'���IEND�B`�PK�X���SS
cherta.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Cherta(BasicNewsRecipe):
    title          		  = '\u0427\u0435\u0440\u0442\u0430'
    __author__            = 'bugmen00t'
    description           = ' \u0418\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B\u0435, \u0432\u0430\u0436\u043D\u044B\u0435 \u0438 \u0433\u043B\u0443\u0431\u043E\u043A\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u044B \u043F\u0440\u043E \u043D\u0430\u0441\u0438\u043B\u0438\u0435 \u0438 \u043D\u0435\u0440\u0430\u0432\u0435\u043D\u0441\u0442\u0432\u043E \u0432 \u0420\u043E\u0441\u0441\u0438\u0438.'  # noqa
    publisher             = 'cherta.media'
    category              = 'blog'
    cover_url = u'https://cherta.media/wp-content/uploads/2022/01/cherta_snippet2.png'
    language              = 'ru'
    no_stylesheets        = False
    remove_javascript = False
    auto_cleanup   = False
    oldest_article = 30
    max_articles_per_feed = 30

    remove_tags_before = dict(name='div', attrs={'class':'single-story'})

    remove_tags_after = dict(name='div', attrs={'class':'single-page__footer-info'})

    remove_tags =   [
        dict(name='div', attrs={'class': 'single-content-link'}),
        dict(name='div', attrs={'class': 'single-page__footer-info_links clearfix'}),
        dict(name='div', attrs={'class': 'single-article-tags-wrapper'})
        ]

    feeds = [
        ('\u0418\u0441\u0442\u043E\u0440\u0438\u0438', 'https://cherta.media/story/feed/'),
        ('\u0418\u043D\u0442\u0435\u0440\u0432\u044C\u044E', 'https://cherta.media/interview/feed/')
    ]
PK�X������chetnixploitation.png�PNG


IHDR  D���*PLTE�������Z�ھ���z"�ƞ�r�������r����f�%h�tRNS@��f~IDATxڽ�1Eј?�_��1�A��ܺ���X�5�5`'��̠�bx#� rQ�SUP�5��x`����B�^�x�'A<��}�`~j��?�07�i`��5�$��O&�{8���Z0F!3�IEND�B`�PK�X�X�]]chicago_breaking_news.png�PNG


IHDR(-S\PLTE		  !!"#$$ # # #!#"#!"%!"&!"& "'#$*#& # " !!!!!! #!#"!#dM9tS/xU2�h;hfgkjl������������������ÿ������������������������������������������������������������������������������������������̠�͞�̝�����m��]��C��B��B��B��=�4�0�0�.�/�-�-�/�3�(�!ېBF\ʩtRNS@��f�IDATx�c�64����F�C�$%��릪J@���!	j���̸�P�,
�|�@Nv�|d�[���D /6��K�#PG�"`h��  梤PQ,�qr�4��iJZ�zKx�C�xc�<��e ��6v�&6�ֶ�&+FFeF#sF�S����YYA���O@��IEND�B`�PK�X���OOchicago_breaking_news.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
chicagobreakingnews.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ChicagoBreakingNews(BasicNewsRecipe):
    title = 'Chicago Breaking News'
    __author__ = 'Darko Miletic'
    description = 'Breaking News from Chicago'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = True
    publisher = 'Chicago Breaking News'
    category = 'news, politics, USA, Chicago'
    encoding = 'utf8'
    language = 'en'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    feeds = [(u'Breaking news', u'http://feeds2.feedburner.com/ChicagoBreakingNews/')]

    def preprocess_html(self, soup):
        for item in soup.findAll('a'):
            if item['href'].find('http://feedads.googleadservices.com') > -1:
                item.extract()
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll(color=True):
            del item['color']
        for item in soup.findAll(size=True):
            del item['size']
        return soup
PK�X
�''chicago_tribune.png�PNG


IHDR  D���3PLTE-',>:>MKN\[^jkmxz|����������������������������12���IDATx���E�0Dёdk��2��e�6?fl����@������X��I{x�GP�����d��Z߾�Ӡ�@�N�t@�4r`8�eT�y(ɰ
�OP~uL���"A恞�����
-�S=�΁��!�G�p
�Xijij��L%><�����5^X|$��j��m�j�
^ڟ�#IEND�B`�PK�X,t���
�
chicago_tribune.recipefrom __future__ import with_statement
__license__ = 'GPL 3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'

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)})


def absolutize(x):
    x = x.lstrip('/')
    if not x.startswith('https:'):
        x = 'https://www.chicagotribune.com/' + x
    return x


class ChicagoTribune(BasicNewsRecipe):

    title = 'Chicago Tribune'
    __author__ = 'Kovid Goyal'
    description = 'Politics, local and business news from Chicago'
    language = 'en'
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    compress_news_images = True
    compress_news_images_auto_size = 5

    keep_only_tags = [
        dict(name='h1'),
        classes('byline-container pb-f-utilities-lead-art pb-f-article-gallery'),
        dict(attrs={'data-type': 'text'}),
    ]

    remove_tags = [
        classes('trb_ar_cont trb_ar_main_ad trb_em_r_cc'),
    ]

    def ct_articles(self, slug):
        url = absolutize(slug)
        soup = self.index_to_soup(url)
        for div in soup.findAll(**classes('pb-f-homepage-story pb-f-homepage-story-feed')):
            h = div.find(('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))
            a = h.find('a', href=True)
            title = self.tag_to_string(a)
            url = absolutize(a['href'])
            self.log('\t', title, url)
            desc = ''
            p = div.find(**classes('preview-text'))
            if p:
                desc = self.tag_to_string(p)
            self.log('\t\t', desc)
            yield {'title': title, 'description': desc, 'url': url}

    def parse_index(self):
        feed = []
        for slug, title in (
                ('news/breaking', 'Breaking News'),
                ('sports', 'Sports'),
                ('business', 'Business'),
                ('entertainment', 'Entertainment'),
                ('dining', 'Chicago Dining'),
                ('columns', 'Tribune Voices'),
        ):
            self.log('Found section:', title)
            articles = list(self.ct_articles(slug))
            if articles:
                feed.append((title, articles))
        return feed

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-baseurl': True}):
            img['src'] = img['data-baseurl']
        return soup

    def skip_ad_pages(self, soup):
        text = soup.find(text='click here to continue to article')
        if text:
            a = text.parent
            url = a.get('href')
            if url:
                return self.index_to_soup(url, raw=True)
PK�X���n::china_economic_net.png�PNG


IHDR(-S2PLTEW����"�!�	��� vwܻ����ƃ	�
��
�
���{|�LP�MR�PS�TX�ad�`d�pr�mp�ww�ux�z}�z}‚�Ĉ�Ǝ�dݼ�f�#� $��z��!��!#�#���������������������
�HK�sui��km���#&�	��	�ʒ�ʖ�˖�Ν�Ѥ�ի�լ�֭�ׯ����� %�"%�+/�7;�9>�>B�NP�����������IL�J�+�IDATx�E���E{c�Ʒm۶m�	��9���zh٪]H5!�gaW���}��US[�#`��mq��J}f������{���y��l�a��z��
��,����[�I~W������z�wt��G\�ю��=ݳ��,ԧ��
�Un�}C����Tl�kL�Ty|�5ĵ�QTN�<�"w�M�IEND�B`�PK�X��!�==china_economic_net.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1278162597(BasicNewsRecipe):
    __author__ = 'rty'
    title = u'China Economic Net'
    oldest_article = 7
    max_articles_per_feed = 100

    publisher = 'www.ce.cn - China Economic net - Beijing'
    description = 'China Economic Net Magazine'
    category = 'Economic News Magazine, Chinese, China'
    feeds = [
        (u'Stock Market 股市', u'http://finance.ce.cn/stock/index_6304.xml'),
        (u'Money 理财', u'http://finance.ce.cn/money/index_6301.xml'),
        (u'Health 健康', u'http://www.ce.cn/health/index_6294.xml'),
        (u'Technology 科技', u'http://sci.ce.cn/mainpage/index_6307.xml'),
        (u'Domestic Politics 国内时政', u'http://www.ce.cn/xwzx/gnsz/index_6273.xml')
    ]
    masthead_url = 'http://finance.ce.cn/images/08mdy_logo.gif'
    extra_css = '''
        @font-face {font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\n
    body {margin-right: 8pt; font-family: 'DroidFont', serif;}\n
                    h1 {font-family: 'DroidFont', serif;}\n
                    .articledescription {font-family: 'DroidFont', serif;}
            '''
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'zh_CN'
    encoding = 'gb2312'
    conversion_options = {'linearize_tables': True}

    keep_only_tags = [

        dict(name='h1', attrs={'id': 'articleTitle'}),
        dict(name='div', attrs={'class': 'laiyuan'}),
        dict(name='div', attrs={'id': 'articleText'}),
    ]
PK�X�z���china_post.png�PNG


IHDR  szz��IDATx���dQ��̉�����������TUU53L3S333U03L
0�0�TME��̼�D� 8�}�x�s^��Z>.�{w��{�q���4�z!��(���c;���>P�1\�n
�mS(p����,f��W0h`b�:��zR���� �X�0�CC &	��M����!��YG⡅edz��w���|��e=�j�1�gF�.����o�
Gc5�����St��&	��Q}�k�cl�ҳ��k�h��la�=s�Q|!x��IYJ�8�n���t��Q4�<�X�oZ0�a���}L��n���
�!�O�����D�x�?��<�-7��DE&��1�cr
0������`b1|�d��a<�X�0��
,�1L�*���Ջ���P���1�f�<�<�wj�Fe�9�s���]4`�ɬVoQB1+�(j�oPt�[�h�5�!+@9��ER",8����g��Sl���f�v��v!���lϴo���]�}|D�{�>��鋫��� ���]f�g��`�|)��B`P�'���;@���s�`ĺg1����A��5�1u��C�8����;f��O�X�.�	'Q�����V����Ď�0�����'aA��ȶq.43k.P��᪼��IEND�B`�PK�X4�= ��china_times.png�PNG


IHDR(-SqPLTE�����' � �!�%�%�&��OI��E?��"�(!����HB�IC�#�QK걮볱����"�!�?9�B<�C=�D>��!��KE�NH���"���#�$���TO�VP�ZT�]Y�`[�c^�fa�kf�+%�,%�-'������������/(�3,�QL�%��nj�sn�sn�tp�vq�vr�ws�xt�yt�{ހ}ރߊ���ᏊⓏ║䙖坙埝栝栞梞磠礡訥������
�
����������������������������������������������3-�71�������93�ˤ��IDATx�M��rDCo�Y۶m�v׶��k�A0J�)���OM��T�31U*�Yv\8Gc�D�/�������+�om���cD�(��q�w���[��ν��'�
�6L�����$b[q24��bgw}ۚԉ	/�wmn�=^\�1�5��!��0t�|�qs�
O�S�-�[�u�'��_�4]TXA���d���7�K����[�+������S�IEND�B`�PK�X�GB�china_times.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
# dug from http://www.mobileread.com/forums/showthread.php?p=1012294

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1277443634(BasicNewsRecipe):
    title = u'中時電子報'
    oldest_article = 1
    max_articles_per_feed = 100

    feeds = [(u'焦點要聞', u'http://feeds.feedburner.com/chinatimes/chinatimes-focus'),
             (u'生活新聞', u'http://feeds.feedburner.com/chinatimes/chinatimes-life'),
             (u'社會新聞', u'http://feeds.feedburner.com/chinatimes/chinatimes-society'),
             (u'兩岸國際', u'http://feeds.feedburner.com/chinatimes/chinatimes-international'),
             (u'時論廣場', u'http://feeds.feedburner.com/chinatimes/chinatimes-comment'),
             (u'藝文副刊', u'http://feeds.feedburner.com/chinatimes/chinatimes-philology'),
             (u'地方新聞', u'http://feeds.feedburner.com/chinatimes/chinatimes-local'),
             (u'財經焦點', u'http://feeds.feedburner.com/chinatimes/chinatimes-finance'),
             (u'運動天地', u'http://feeds.feedburner.com/chinatimes/chinatimes-sport'),
             (u'娛樂新聞', u'http://feeds.feedburner.com/chinatimes/chinatimes-showbiz'),
             (u'時尚消費', u'http://feeds.feedburner.com/chinatimes/chinatimes-fashion'),
             # (u'財經', u'http://rss.chinatimes.com/rss/finance-u.rss'),  # broken links
             # (u'股市', u'http://rss.chinatimes.com/rss/stock-u.rss')  # broken links
             ]

    __author__ = 'einstuerzende, updated by Eddie Lau'
    __version__ = '1.1'
    language = 'zh'
    publisher = 'China Times Group'
    description = 'China Times (Taiwan)'
    category = 'News, Chinese, Taiwan'
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    auto_cleanup = True
    encoding = 'utf-8'
    conversion_options = {'linearize_tables': True}
    masthead_url = 'http://www.fcuaa.org/gif/chinatimeslogo.gif'
    cover_url = 'http://www.fcuaa.org/gif/chinatimeslogo.gif'
PK�X��AU��chinadaily.png�PNG


IHDR�a�IDATx��Q3t&A��mۨ�;۶՝�ŏ*��m۶ٿ��EުJ��>�)t 2��O�ž��A�o������QW����$��8VL#��bOA�Y6�Hؼ�:Z���|��
��C���{��(H00���o�bKSRR���srz�.��5���{���{��KHe}�����w��?Erm������p�'��7�����
0��3���R 	�-Gc�V�W�CB�����ƾ����l���j�@\�
L�vMK�`��������G,G>���,,��ui���E���� ��9F,��@C��r�M�]C{4s.�\|
KZ~�.))�g0#rp�;I������U����Zz
��jT�EW�A5D_�R��L�Ls\d�a`>�!������^{�z�	���[��G�H��VO]�n��`�a���;�Z'sDIEND�B`�PK�X�e���
chipro.png�PNG


IHDR(-SPLTE�����������N+�EIDATx�e�
�0C����<����>@���%�Ԝ4 �w��.hVD�_�� X��$ϨO7(�W�IEND�B`�PK�X0��q��
chipro.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
chip.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ChipRo(BasicNewsRecipe):
    title = u'Chip Online'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'Chip Online'
    publisher = 'Chip Online'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,IT'
    encoding = 'utf-8'
    cover_url = 'http://www.chip.ro/images/logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h2', attrs={'class': 'contentheading clearfix'}), dict(name='span', attrs={
            'class': 'createby'}), dict(name='div', attrs={'class': 'article-content'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['sharemecompactbutton']}), dict(name='div', attrs={'align': ['left']}), dict(name='div', attrs={
            'align': ['center']}), dict(name='th', attrs={'class': ['pagenav_prev']}), dict(name='table', attrs={'class': ['pagenav']})
    ]

    feeds = [
        (u'Feeds', u'http://www.chip.ro/index.php?option=com_ninjarsssyndicator&feed_id=9&format=raw')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X"��k[[
chosun.png�PNG


IHDR(-S�PLTE�����@>ܱ��22�������!���矟ꫪ믮��ڷ``�����̥88�GE�ONΓ���((��fd٪���zx�}|޵�߹�Ἴ䔓�

�dd��� �Ȅ�����������������������������-+����53�98�~�
qIDATxڌ��@D��c۶�g��rX���s�Tl�:��^u���7P�y���dWn��̈B�:���]�$t.-��!�3=�BH�
���Un�s;�a��ݐ��n'�tQ�#���3�ʣIEND�B`�PK�X�\""
chosun.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2015, Hoje Lee <hojelei at gmail.com>'
'''
Profile to download Chosun.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ChosunDotcom(BasicNewsRecipe):
    language = 'ko'
    title = u'조선일보'
    description = u'조선닷컴 기사'
    __author__ = 'Hoje Lee'
    oldest_article = 7
    max_articles_per_feed = 10
    auto_cleanup = True

    feeds = [
        (u'정치',    'http://www.chosun.com/site/data/rss/politics.xml'),
        (u'조선비즈', 'http://biz.chosun.com/site/data/rss/rss.xml'),
        (u'사회',    'http://www.chosun.com/site/data/rss/national.xml'),
        (u'문화',    'http://www.chosun.com/site/data/rss/culture.xml'),
        (u'국제',    'http://www.chosun.com/site/data/rss/international.xml'),
        (u'오피니언', 'http://www.chosun.com/site/data/rss/editorials.xml'),
        (u'스포츠',  'http://www.chosun.com/site/data/rss/sports.xml'),
        (u'연예',    'http://www.chosun.com/site/data/rss/ent.xml'),
    ]
PK�X�7����	chowk.png�PNG


IHDR  �Tg�0PLTE&3
@
M
Zgt���� �#�!&*��YtRNS@��fqIDAT(�c`��?`p���*nU�Q���r?L�?+�Ab*��5 *&R��El�$1��*LU0;���
��C�����<�S�{T�^4�h���% �zL��IEND�B`�PK�X�*�__chr_mon.png�PNG


IHDR7���&IDATx�c��L �cB~E ����"Ad�ʀj�@	�c^wIEND�B`�PK�X�����chr_mon.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.csmonitor.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class CSMonitor(BasicNewsRecipe):
    title = 'The Christian Science Monitor - daily'
    __author__ = 'Darko Miletic'
    description = 'The Christian Science Monitor is an international news organization that delivers thoughtful, global coverage via its website, weekly magazine, daily news briefing, and email newsletters.'  # noqa
    publisher = 'The Christian Science Monitor'
    category = 'news, politics, USA'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://www.csmonitor.com/extension/csm_base/design/csm_design/images/csmlogo_179x46.gif'
    extra_css             = """
                               body{font-family: Arial,Tahoma,Verdana,Helvetica,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                               .head {font-family: Georgia,"Times New Roman",Times,serif}
                               .sByline,.caption{font-size: x-small}
                               .hide{display: none}
                               .sLoc{font-weight: bold}
                               ul{list-style-type: none}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link', 'iframe', 'object', 'embed']), dict(attrs={'class': re.compile('(^|| )podStoryRel($|| )', re.DOTALL)}), dict(
            attrs={'class': ['bottom-rel', 'hide']}), dict(attrs={'id': ['pgallerycarousel_enlarge', 'pgallerycarousel_related']})
    ]
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'head'}), dict(name='h2', attrs={'class': 'subhead'}), dict(attrs={'class': [
            'sByline', 'thePhoto', 'ui-body-header']}), dict(attrs={'class': re.compile('(^|| )sBody($|| )', re.DOTALL)})
    ]
    remove_attributes = ['xmlns:fb']

    feeds = [

    (u'USA', u'http://rss.csmonitor.com/feeds/usa'),
    (u'World', u'http://rss.csmonitor.com/feeds/world'),
    (u'Politics', u'http://rss.csmonitor.com/feeds/politics'),
    (u'Business', u'http://rss.csmonitor.com/feeds/wam'),
    (u'Commentary', u'http://rss.csmonitor.com/feeds/commentary'),
    (u'Books', u'http://rss.csmonitor.com/feeds/books'),
    (u'Arts', u'http://rss.csmonitor.com/feeds/arts'),
    (u'Environment', u'http://rss.csmonitor.com/feeds/environment'),
    (u'Innovation', u'http://rss.csmonitor.com/feeds/scitech'),
    (u'Living', u'http://rss.csmonitor.com/feeds/living'),
    (u'Science', u'http://rss.csmonitor.com/feeds/science'),
    (u'The Culture', u'http://rss.csmonitor.com/feeds/theculture'),
    (u'The Home Forum', u'http://rss.csmonitor.com/feeds/homeforum'),
    (u'Articles', u'http://rss.csmonitor.com/feeds/csarticles')
    ]

    def append_page(self, soup):
        pager = soup.find('div', attrs={'class': 'navigation'})
        if pager:
            nexttag = pager.find(attrs={'id': 'next-button'})
            if nexttag:
                nurl = 'http://www.csmonitor.com' + nexttag['href']
                soup2 = self.index_to_soup(nurl)
                texttag = soup2.find(
                    attrs={'class': re.compile('(^|| )sBody($|| )', re.DOTALL)})
                if texttag:
                    appendtag = soup.find(
                        attrs={'class': re.compile('(^|| )sBody($|| )', re.DOTALL)})
                    for citem in texttag.findAll(attrs={'class': [re.compile('(^|| )podStoryRel($|| )', re.DOTALL), 'bottom-rel', 'hide']}):
                        citem.extract()
                    self.append_page(soup2)
                    texttag.extract()
                    pager.extract()
                    appendtag.append(texttag)

    def preprocess_html(self, soup):
        self.append_page(soup)
        pager = soup.find('div', attrs={'class': 'navigation'})
        if pager:
            pager.extract()
        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 = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', src=True):
            if 'scorecardresearch' in item['src']:
                item.extract()
        return soup
PK�Xku�|christian_post.png�PNG


IHDR  �Tg�-PLTEu���%y���V��9�س��H����j������}���쏻�5W^�IDAT(�c`J�)4H()))@��/V��T����h{8%h�X��DaccCi ��pOi��	m��k��R�M��l��k�hS��V%6bFX�$��ii�GAR,׹W&_���
��X���qE�-��J4j���	�("\4"IEND�B`�PK�Xr�3sschristian_post.recipe# created by sexymax15 ....sexymax15@gmail.com
# christian post recipe
from calibre.web.feeds.news import BasicNewsRecipe


class ChristianPost(BasicNewsRecipe):

    title = 'The Christian Post'
    __author__ = 'sexymax15'
    description = 'Homepage'
    language = 'en'
    no_stylesheets = True
    use_embedded_content = False
    oldest_article = 30
    max_articles_per_feed = 15

    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True

    feeds = [
        ('Homepage', 'http://www.christianpost.com/services/rss/feed/'),
        ('Most Popular', 'http://www.christianpost.com/services/rss/feed/most-popular'),
        ('Entertainment', 'http://www.christianpost.com/services/rss/feed/entertainment/'),
        ('Politics', 'http://www.christianpost.com/services/rss/feed/politics/'),
        ('Living', 'http://www.christianpost.com/services/rss/feed/living/'),
        ('Business', 'http://www.christianpost.com/services/rss/feed/business/'),
        ('Opinion', 'http://www.christianpost.com/services/rss/feed/opinion/')
    ]

    def print_version(self, url):
        return url + 'print.html'
PK�X�VT�||chronicle_higher_ed.png�PNG


IHDR  D���UPLTE7W���:Z)K8X*L0Q4T9Y:Y9Y9X.O/P+M3T8X���5U,N-N3S���:Z4U-O&I���1R���8X:Y������&Up���
B`������5V=\.PDb7WGo����,M;Z���(K��������h��4T5U������Jr����(JGd8X(KOk���6`y
9Y������A_���1R'I���4`y(Wq������ Jg;[���k��;Z���<f~JgUw����k��9Y<[���6V*Xs������DbJr�Z|�Ru�<[&H0R���k��8W���Tx�������8c|���7`z=\Ho�B`���>i�������Fd������@_>e~e��^|�]��6V������	9X6W;Z6W/Ys���������:Y9X=b{c��n��e��x��4Th�������ۚ��^��|��������3T2[u2\v9XSx�������l��.O?i�����EcJg���������ܠ��������������2S
@^`��������������#Qm2S5UHe'Vq.[u3`yNk
?^(J2R�0{v�IDATx^��ӲdAE{�6/m�m۶m۶m�w�����gb&�V��\��bL�u�*Z4�<~Ӕ��C!������&�+������V���kڻ�6�)f��蝶�k�7o=v���R��j���m���u���f��@7#0O�@�^\'$I������4��
1җTk4�`ld|���Pi5��t20ejH�Z)��/�t�ԣ���V\����a�R�%F���K�Í�j��|RXlh��,Ų�Q������Ј&��\"V�z��V�B�ш
=��›�b���	֜��Ǝ���m�A��}��89x(�1|�ϘZG��qz�&��9��Y�
y�9�DžR~�%	Q�ȥ��e��������t��ά�������O�>+�⹜s=����o���]�s�$H��O���|���G��/W�I�B����0���^MK0�?�o�DY�>IEND�B`�PK�X��l�
�
chronicle_higher_ed.recipeimport re
from calibre.web.feeds.recipes import BasicNewsRecipe
from collections import OrderedDict


class Chronicle(BasicNewsRecipe):

    title = 'The Chronicle of Higher Education'
    __author__ = 'Rick Shang'

    description = 'Weekly news and job-information source for college and university faculty members, administrators, and students.'
    language = 'en'
    category = 'news'
    encoding = 'UTF-8'
    keep_only_tags = [
        dict(name='div', attrs={'class': ['article', 'blog-mod']}),
    ]
    remove_tags = [dict(name='div', attrs={'class': ['related module1', 'maintitle', 'entry-utility', 'object-meta']}),
                   dict(name='div', attrs={
                        'id': ['section-nav', 'icon-row', 'enlarge-popup', 'confirm-popup']}),
                   dict(name='a', attrs={'class': 'show-enlarge enlarge'})]
    no_javascript = True
    no_stylesheets = True

    needs_subscription = True

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('http://chronicle.com/myaccount/login')
            br.select_form(nr=1)
            br['username'] = self.username
            br['password'] = self.password
        br.submit()
        return br

    def parse_index(self):
        # Go to the issue
        soup0 = self.index_to_soup('http://chronicle.com/section/Archives/39/')
        issue = soup0.find('ul', attrs={'class': 'feature-promo-list'}).li
        issueurl = "http://chronicle.com" + issue.a['href']

        # Find date
        dates = self.tag_to_string(issue.a).split(': ')[-1]
        self.timefmt = u' [%s]' % dates

        # Find cover
        cover = soup0.find('div', attrs={
                           'class': 'side-content'}).find(attrs={'src': re.compile("photos/biz/Current")})
        if cover is not None:
            if "chronicle.com" in cover['src']:
                self.cover_url = cover['src']
            else:
                self.cover_url = "http://chronicle.com" + cover['src']
        # Go to the main body
        soup = self.index_to_soup(issueurl)
        div = soup.find('div', attrs={'id': 'article-body'})

        feeds = OrderedDict()
        section_title = ''
        for post in div.findAll('li'):
            articles = []
            a = post.find('a', href=True)
            if a is not None:
                title = self.tag_to_string(a)
                url = "http://chronicle.com" + a['href'].strip()
                sectiontitle = post.findPrevious('h3')
                if sectiontitle is None:
                    sectiontitle = post.findPrevious('h4')
                section_title = self.tag_to_string(sectiontitle)
                desc = self.tag_to_string(post.find('p'))
                articles.append({'title': title, 'url': url,
                                 'description': desc, 'date': ''})

                if articles:
                    if section_title not in feeds:
                        feeds[section_title] = []
                    feeds[section_title] += articles
        ans = [(key, val) for key, val in feeds.items()]
        return ans

    def preprocess_html(self, soup):
        # process all the images
        for div in soup.findAll('div', attrs={'class': 'tableauPlaceholder'}):

            noscripts = div.find('noscript').a
            div.replaceWith(noscripts)
        for div0 in soup.findAll('div', text='Powered by Tableau'):
            div0.extract()
        return soup
PK�X�v��
cicero.png�PNG


IHDR  szz��IDATx�՗�dIEcl�m۶m�m۶m��2׶mۮ�Y����ΉB*^�~|�2xf�}�A�T1Ɨ�ч�F�B�[��Y�k�3OӅf_��3�}�]���Ct��ǫ���s�1ч�%��rw�$�Ͳ$��:��f�{A��
V�B���eܣ	H��q �!!"����
�xL�$׆th3�Z�_2ߘP*�CT��Jfs�V6?�T��R��
�e�%|+i�
���̚���v���'�X�Ȩ�;��l���8�T6��	@�K��(>7�?\�6͜\.<ٵ��7/\�1E!Ӥn��z��9,c^F>�EW)���J����nI��a����m.�}D�g��!�W[��f�|1��e��^�lV~%z�cR��
�|�+� �b��o�#���j�{v��h{�����d[N�Cl��+i�ZP.�H>g|��ȆPC����߲�57w1g<B�k�q��sg`�K!��ҡg,Yur�(���'��K^��i�J��_��k���M�
w�\H���Q����V���O�Gzw�
��+Cd�
]p��X9�!`R0���J�W��O��x��S)n�fN��kN��aI��p���,�t��Wߤ)��1���Mn���W�&��lF�'"c[^�<Z�5w���j�]�܆�FRt�`ɨ[V�2@ן��z]�\����|	�׈5�M������Z��c
[���ъnU,nG��p��[�=͒Y;�AX�&��A�y(��ěmL,�1E�4����y��刌)\�(�P=�݁ؿ%3'c
J�*�+0�S�*ῐ�V�*O�n7���Z%����	�
.FԂ;L�st2c
�@`�:��Y�\PͷXseC��^G˛�#��v����2,��<���Vp5�CD����/T�f�NWM+)}pu��k�eX�x�xX�jB����:�."��\��2��!�v��'��ޑ�2X�^.��iI[�ؕ�U�w�
��
ZF�3�xι�t��VoWkF�]Ҩxn��E�����_X���vQ��!Ϻ�=O�{ϓzy��{7^��RYsk_W��-,iU��+�u��.i�z#R�,Џ��L�ޔ yr,r
r5kc��?����E�	d�a�j�˕/��!�ǁ7q��`!�"�~�R��G�NʔT>S5���C8P��3�	�\u ��{'�Ֆ��� ��̋���Q.n�I��&��3�n��IEND�B`�PK�X�{��
�

cicero.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1316245412(BasicNewsRecipe):
    title = u'Cicero Online'
    description = u'Magazin f\xfcr politische Kultur (RSS Version)'
    publisher = 'Ringier Publishing GmbH'
    category = 'news, politics, Germany'
    language = 'de'
    encoding = 'UTF-8'
    __author__ = 'Armin Geller'  # Upd. 2011-09-23

    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    auto_cleanup = False

#    remove_javascript = True

    remove_tags = [
        dict(name='div', attrs={'id': ["header", "navigation", "skip-link",
                                       "header-print", "header-print-url", "meta-toolbar", "footer"]}),
        dict(name='div', attrs={'class': ["region region-sidebar-first column sidebar", "breadcrumb",
                                          "breadcrumb-title", "meta", "comment-wrapper",
                                          "field field-name-field-show-teaser-right field-type-list-boolean field-label-above",
                                          "page-header",
                                          "view view-alle-karikaturen view-id-alle_karikaturen view-display-id-default view-dom-id-1",
                                          "pagination",
                                          "view view-letzte-videos view-id-letzte_videos view-display-id-default view-dom-id-1",
                                          "view view-letzte-videos view-id-letzte_videos view-display-id-default view-dom-id-2",  # 2011-09-23
                                          "view view-alle-karikaturen view-id-alle_karikaturen view-display-id-default view-dom-id-2",  # 2011-09-23
                                          ]}),
        dict(name='div', attrs={'title': ["Dossier Auswahl"]}),
        dict(name='h2', attrs={'class': ["title comment-form"]}),
        dict(name='form', attrs={
             'class': ["comment-form user-info-from-cookie"]}),
        dict(name='table', attrs={
             'class': ["mcx-social-horizontal", "page-header"]}),
    ]

    feeds = [
        (u'Das gesamte Portfolio', u'http://www.cicero.de/rss.xml'),
        (u'Berliner Republik', u'http://www.cicero.de/berliner-republik.xml'),
        (u'Weltb\xfchne', u'http://www.cicero.de/weltbuehne.xml'),
        (u'Kapital', u'http://www.cicero.de/kapital.xml'),
        (u'Salon', u'http://www.cicero.de/salon.xml'),
        # seems not to be in use at the moment
        (u'Blogs', u'http://www.cicero.de/blogs.xml'),
    ]

    def print_version(self, url):
        return url + '?print'

#    def get_cover_url(self):
# return 'http://www.cicero.de/sites/all/themes/cicero/logo.png' # need to
# find a good logo on their home page!
PK�XP�5�JJcincinnati_enquirer.png�PNG


IHDR  szz�IDATx^�y�U��?�����x3��6,"�������jc-�6�5��$j1��m�F�Z�iP��J �j�-"Ű+�l���.o���w�=5�!�c���O?�7��w�M~B)ŗ��KF�<�4Cq��^����[�ə��K��v�e4^���a`�W@}�sB^�D����̼��3���(!�S�$| ��p�^ߪ�!�T�G�F��s��z>3M9θI�c�g��h爠�(͠|���̒qL>�d�w��'�x�U-����K٤��Z]��?�l�0�g�@���)��N��p��+��@v�Xp�0��gC�Z�����FY��E $��!���o�q`pC����ͦ����=a����(��-�/��l�\����/~�>�e�Z��,�k��-��������u?��3�X˽M��n���kٞ�cV�W�oÎ���xW����h�U&m�x���*���u�,�w:�i�Q|8c-���M$����pLV��5 ev�~��b�C�n$fx�ռD�,5����a^��2�w�I㲧�WȀԙ�2Tu�wx�-������eGP~��W�#�%��v�
�6�ӯVj=3���k��Ѿ�~�������ϴ�.��uO�X<�oN1��A�st����H9�0O��f��X2����'P��p�*ʰm���	�(8Bӆ�<������`Je�#H$C��,�]��N������y9˜Ep@y,t�DH��DQ�X��˙<l>ȴݫy���
�Ao'����'a_5�ه�1dK?�%��yFS8��5L�'-��c�S���q�Zn����x�X��T
I��P�"�E3p�G"ۻ0�G;wt �T�	�L:�޳p���A��A?���:݇��Ǐƾȶ럣#갾a!����g��\Ӽ�w�)H�>=I(�j���q"#�8FC#zC2/���O
r6L�����Q�N0bq���p����K�¥,l��6�"���y���ɟ/'[Qgz�4"�;�`��2�k&bWW��Dv��<{��u	esT��C�E�pЮ
�����<$0x�j��q.���s��;K��Ѹ��ȁ��Əӌ싂(P%~�)U��F��� ��>;���ͦ�O���F�_gd�&(( �d	�i���Q�\�^_��� ���}M-��j�А�]�
��N�"��,@K�����)�@H����ς ��({$IM,���##��U�ǩ��D�Doˣ}ş�-�� pu���B�jPJ����-�H0�W��	 �9�H
��A&�rd,Ɉ��r�Pt(�(��Ye�d
�U����f��1p(i�(�;�hkM#R��2i�AD��`�8��N�D;�A��^�1�] O౜f���A�n���%�>��e ��KZ�EL���i�2�H^�C$@�A�E��Ǚ2嵐g[p�
z1�L�qDŽ�K�:����&�|zeK�	��6x�"���g���C	��8���Ē{W���pk�?�(TYn���Dž���|E�
c������=}�G]�T^��TR���P�E]�{0�%(��0�`����⯊1�=�N� !h:H�I4r��z�Z_R�A�x�F���4����L��[oo۶{��h��6��"��a�2[Rd�=��i�G�H�|���Py#dx@�<(�	Ht܂M˰{��c�=>��*����s�Xw��/�FS|!CϞR,6#�,VT�J�yԘ�q�:�X�Թ#so��\��A�d�B�!/ze����p1q��t�X����M��g4�wj=�:g2�}J1��()��V��Gb5%ȎKh�(촁rN���<P;�z���W0�@>�qƕ��W�(�-�?�^y�u�	���IJL�s(������Ė\
������TN�f8t�A�P2�m�x'�?o�<�Q٥%3*oNv�vr��
xC����[!o3�$�� ��P�`8����F��1z�IEND�B`�PK�X��/`e	e	cincinnati_enquirer.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2009 Kovid Goyal <kovid at kovidgoyal.net>'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1234144423(BasicNewsRecipe):
    title = u'Cincinnati Enquirer'
    oldest_article = 7
    language = 'en'

    __author__ = 'Joseph Kitzmiller and Sujata Raman'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    encoding = 'cp1252'
    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-size:large; color:#0E5398; }
                    h2{color:#666666;}
                   .blog_title{color:#4E0000; font-family:Georgia,"Times New Roman",Times,serif; font-size:large;}
                   .sidebar-photo{font-family:Arial,Helvetica,sans-serif; color:#333333; font-size:30%;}
                   .blog_post{font-family:Arial,Helvetica,sans-serif; color:#222222; font-size:xx-small;}
                   .article-bodytext{font-family:Arial,Helvetica,sans-serif; font-size:xx-small; color:#222222;font-weight:normal;}
                   .blog caitlin{font-family:Arial,Helvetica,sans-serif; font-size:xx-small; color:#222222; font-weight:normal;}
                   .ratingbyline{font-family:Arial,Helvetica,sans-serif; color:#333333; font-size:50%;}
                   .author{font-family:Arial,Helvetica,sans-serif; color:#777777; font-size:50%;}
                   .date{font-family:Arial,Helvetica,sans-serif; color:#777777; font-size:50%;}
                   .padding{font-family:Arial,Helvetica,sans-serif; font-size:70%; color:#222222; font-weight:normal;}
                    '''

    keep_only_tags = [
        dict(name='div', attrs={'class': ['padding', 'sidebar-photo', 'blog caitlin']})]

    remove_tags = [
        dict(name=['object', 'link', 'table', 'embed']), dict(name='div', attrs={'id': ["pluckcomments", "StoryChat"]}), dict(
            name='div', attrs={'class': ['articleflex-container', ]}), dict(name='p', attrs={'class': ['posted', 'tags']})
    ]

    feeds = [(u'Cincinnati Enquirer',
              u'http://rss.cincinnati.com/apps/pbcs.dll/section?category=rssenq01&mime=xml')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll(face=True):
            del item['face']
        return soup
PK�XCZlT��cinco_dias.png�PNG


IHDR  ��tRNSn��	pHYs���IDATH��[H�a�߫!$B��0�(���+�
?E�H,���� ��r����V�Ѳ��(�	����C�k�>7�Ii��-kRD���ӂ��n����}x��y��a%���� �P�����A���RKCRK)Z��Z��(A�ċ�-!�$)0(�h1���|��Q����P�8_�����̙-6���3�G�wsJ���}'kfmV�-gst���ZM�����w�Ǣ���-����Fg�ݳ��ީ/�V��й�:��<O�V��gz���p�a���r�'�����n׺��e��V�L��ַ����T�����D���<I,�^���	9?��))��
��H��mgюB��j�e_�	��Y�#��w�)$A�_E%IW�W�]Nx�)u��H@�<�]ignHk�J�<��"0(�P�>�|p���+Z�$)����Ӎ=�\oz��?2�ύc<�r�[���<T���
jO��.=������Q��PHM�$���xF��v�:��e,V;�uƅ�s��B��!W�T�j��N�ˡiʵe�-�SɊ��~��f�KHb%E���U�?�����U��"q�c/���v�|��,9<]C�S9�3�$wP|1?�R�Df��
<��;�&�����t�f���M�Η᡹_m[�0�6
&%(��+/Y�J(����<i�հ1�36"̭>�W�5���O��g���v�ب.�,=�2˨D�)-�!]��,��l�z�z��G����h���e�V{����Qo�L�#[��g3w�0�W�o�)�>�3Ԑ�~���2Ã�푐��8�;|�)"SB˗_�Z��	|ߊ��]�E0�&�K�[U��A@���S��>��IEND�B`�PK�X\�Z-
-
cinco_dias.recipe__license__ = 'GPL v3'
__author__ = 'Luis Hernandez'
__copyright__ = 'Luis Hernandez<tolyluis@gmail.com>'
__version__ = 'v1.2'
__date__ = '31 January 2011'

'''
http://www.cincodias.com/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1294946868(BasicNewsRecipe):

    title = u'Cinco Dias'
    publisher = u'Grupo Prisa'

    __author__ = 'Luis Hernandez'
    description = 'spanish web about money and business, free edition'

    cover_url = 'http://www.prisa.com/images/logos/logo_cinco_dias.gif'
    oldest_article = 2
    max_articles_per_feed = 100

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False

    language = 'es'
    remove_empty_feeds = True
    encoding = 'ISO-8859-1'
    timefmt = '[%a, %d %b, %Y]'

    keep_only_tags = [
        dict(name='div', attrs={'class': ['cab_articulo cab_noticia', 'pos_3', 'txt_noticia', 'mod_despiece']}), dict(
            name='p', attrs={'class': ['cintillo']})
    ]

    remove_tags_before = dict(name='div', attrs={'class': ['publi_h']})
    remove_tags_after = dict(
        name='div', attrs={'class': ['tab_util util_estadisticas']})

    remove_tags = [
        dict(name='div', attrs={'class': ['util-1', 'util-2', 'util-3', 'inner estirar', 'inner1', 'inner2', 'inner3', 'cont', 'tab_util util_estadisticas', 'tab_util util_enviar', 'mod_list_inf', 'mod_similares', 'mod_divisas', 'mod_sectores', 'mod_termometro', 'mod post', 'mod_img', 'mod_txt', 'nivel estirar', 'barra estirar', 'info_brujula btnBrujula', 'utilidad_brujula estirar']}), dict(name='li', attrs={'class': ['lnk-fcbook', 'lnk-retweet', 'lnk-meneame', 'desplegable', 'comentarios', 'list-options', 'estirar']}), dict(name='ul', attrs={'class': ['lista-izquierda', 'list-options', 'estirar']}), dict(name='p', attrs={'class': ['autor']})  # noqa
    ]

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h1{font-family: sans-serif; font-size:150%; font-weight:bold; text-align: justify; }
                               h3{font-family: sans-serif; font-size:100%; font-style: italic; text-align: justify; }
                                 """

    feeds = [

    (u'Ultima Hora', u'http://www.cincodias.com/rss/feed.html?feedId=17029'),
    (u'Empresas', u'http://www.cincodias.com/rss/feed.html?feedId=19'),
    (u'Mercados', u'http://www.cincodias.com/rss/feed.html?feedId=20'),
    (u'Economia', u'http://www.cincodias.com/rss/feed.html?feedId=21'),
    (u'Tecnorama', u'http://www.cincodias.com/rss/feed.html?feedId=17230'),
    (u'Tecnologia', u'http://www.cincodias.com/rss/feed.html?feedId=17106'),
    (u'Finanzas Personales', u'http://www.cincodias.com/rss/feed.html?feedId=22'),
    (u'Fiscalidad', u'http://www.cincodias.com/rss/feed.html?feedId=17107'),
    (u'Vivienda', u'http://www.cincodias.com/rss/feed.html?feedId=17108'),
    (u'Tendencias', u'http://www.cincodias.com/rss/feed.html?feedId=17109'),
    (u'Empleo', u'http://www.cincodias.com/rss/feed.html?feedId=17110'),
    (u'IBEX 35', u'http://www.cincodias.com/rss/feed.html?feedId=17125'),
    (u'Sectores', u'http://www.cincodias.com/rss/feed.html?feedId=17126'),
    (u'Opinion', u'http://www.cincodias.com/rss/feed.html?feedId=17105')
    ]
PK�X#�J}��cinebel_be.png�PNG


IHDR(-S�PLTE���}�6y�5��<v�4r�4��:o�)q�+��7��8��.��:��;s�4|�,~�3�5��7��/��7��7��6��3��5��3��4��<��P��=��T��;��@��>��J��k��r�ш�������������������k�)r�p�0t�(s�0v�/��>��>z�'z�(x�2z�2}�)}�>��3��7��%��4��4��-��3��4��9��I��0��:��8��:��R��H��F��B��O��P��C��>��6��B��T��W��P��`��h��Y��X��c��j��r��~�˂��{�Б��z���ԗ�Պ�ׁ�Ֆ�֌�֛�ۤ�ۧ��������������������������������������������EN��IDATx�\��b�@����m׶m۶�O/��������@p6�%~�$I|����0�H����H~���4o������.��WCU-Y�U��s��ʈg�������O�z(���(����|s�_y�����6߲���X.sgv��e��jj����͉���x>J�N��&A�9��DhD�n��a?��06���,7w���V���X�?�3`��(ʡ���IEND�B`�PK�XC��7yycinebel_be.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2011, Lionel Bergeret <lbergeret at gmail.com>'
'''
cinebel.be
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Cinebel(BasicNewsRecipe):
    title = u'Cinebel'
    __author__ = u'Lionel Bergeret'
    description = u'Cinema news from Belgium in French'
    publisher = u'cinebel.be'
    category = 'news, cinema, movie, Belgium'
    oldest_article = 15
    language = 'fr'

    max_articles_per_feed = 20
    no_stylesheets = True
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    filterDuplicates = True

    keep_only_tags = [
        dict(name='span', attrs={'class': 'movieMainTitle'}), dict(name='div', attrs={'id': 'filmPoster'}), dict(
            name='div', attrs={'id': 'filmDefinition'}), dict(name='div', attrs={'id': 'synopsis'})
    ]

    feeds = [

    (u'Les sorties de la semaine', u'http://www.cinebel.be/Servlets/RssServlet?languageCode=fr&rssType=0'),
    (u'Top 10', u'http://www.cinebel.be/Servlets/RssServlet?languageCode=fr&rssType=2')
    ]

    def preprocess_html(self, soup):
        for alink in soup.findAll('a', href=True):
            tstr = "Site officiel: " + alink['href']
            alink.replaceWith(tstr)
        return soup

    def get_cover_url(self):
        cover_url = 'http://www.cinebel.be/portal/resources/common/logo_index.gif'
        return cover_url
PK�XBq�KKcio.png�PNG


IHDR  ��IDATx^�VKlU���|<v�W�PCJ-�� �Z!�φb��`Q�V,lX�EPu��u��%T��J!mR��!qb�8����}8�3T���H,�439s�|Ϲ�
�4�7��E����y�G�ҀHC�p+	��()���R`��P���)�;�`����k�ʏm�7�O��uooM�`��m~�_kHY��;��>������~4�<~��W.=t�Tn���\|����Pϗ�^>��+Z�g���ىQ;6\��גN�����7�}73�ˤ,K�ׯ�!9��o|�̩�?@���Kߞ`�歯�{~o���}�7)!���Ż�s��o7�uZy�Y��axR
C5�@5\Ʉi;�}z��T��J���d,�m�k�?�-*q¼��D�x�
>D��R�z���cL����~j�Buu
�0%~�%�!F�76i9)�B/��T��z�N1]t��,983
��x��W#��;  Ф1��x�;�,QʚBn
�i�+��転�tzj
~�$�S�����I�Š���.B6���4��8e�����D�*���]�� �+��0,�H2��Ԇ߁WI�*sL.�hO��a�=�B9i�8 �\��%�
�[ߏP�3���\7?�5���A�(�R)�Ng�=��j[�B=j��_Vw���M�2�
h�);hZ��aJB�Ok�wHX����[Y^�S'����~(t3�/�'Q�K�*�ÓC�i��{(�E-�ݩ׃9����@nz��#�Sd!���n{��*c��	V���-L��v�Zq����&��nue-�I��;K��&�'= ��� ��=jمng��0	=渌c��g����&�@u}��:;g��o�����5?�ug�0��2V�}���I$GÒ��A�1�a�B����q;�d� �dL���&�c�j�G�(�$[�K]�k��9;{�����J��C���sf,���+/�Q���𳅄�ҧJ�w6����hlHJ��3���h:F�E���79��z�IEND�B`�PK�X0-����
cio.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.01'
__date__ = '14, January 2010'
__description__ = 'CIO is the leading information brand for today s busy chief information officer. '

'''
http://www.cio.co.uk/
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile


class cio(BasicNewsRecipe):
    __author__ = 'Lorenzo Vigentini'
    description = 'CIO is the leading information brand for today\'s busy chief information officer.'
    cover_url = 'http://media.cio.co.uk/graphics/shared/cio-logo.gif'

    title = 'CIO '
    publisher = 'IDG Communication'
    category = 'IT, technology, business, industry'

    language = 'en'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 7
    max_articles_per_feed = 10
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True

    temp_files = []
    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        br.open(url)
        response = br.follow_link(url_regex='&print&intcmp=ROSATT2$', 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

    keep_only_tags = [
        dict(name='div', attrs={'id': 'mainContent'})
    ]

    feeds = [
        (u'News', u'http://www.cio.co.uk/rss/feeds/cio-news.xml'),
        (u'Debate', u'http://www.cio.co.uk/rss/feeds/cio-debate.xml'),
        (u'Analysis', u'http://www.cio.co.uk/rss/feeds/cio-analysis.xml'),
        (u'Opinion', u'http://www.cio.co.uk/rss/feeds/cio-opinion.xml'),
        (u'In-Depth', u'http://www.cio.co.uk/rss/feeds/cio-in-depth.xml'),
        (u'Change management',
         u'http://www.cio.co.uk/rss/feeds/cio-change-management-management.xml'),
        (u'Regulatory compliance',
         u'http://www.cio.co.uk/rss/feeds/cio-regulatory-compliance-management.xml'),
        (u'Business strategy',
         u'http://www.cio.co.uk/rss/feeds/cio-business-strategy-management.xml'),
        (u'Technology', u'http://www.cio.co.uk/rss/feeds/cio-technology-management.xml'),
        (u'Security', u'http://www.cio.co.uk/rss/feeds/cio-security-management.xml'),
        (u'Soft skills', u'http://www.cio.co.uk/rss/feeds/cio-soft-skills-management.xml'),
        (u'The CIO career',
         u'http://www.cio.co.uk/rss/feeds/cio-cio-career-management.xml'),
        (u'Budgets', u'http://www.cio.co.uk/rss/feeds/cio-budgets-management.xml'),
        (u'Supplier management',
         u'http://www.cio.co.uk/rss/feeds/cio-supplier-management-management.xml'),
        (u'Board politics',
         u'http://www.cio.co.uk/rss/feeds/cio-board-politics-management.xml'),
        (u'Enterprise software',
         u'http://www.cio.co.uk/rss/feeds/cio-enterprise-software-technology.xml'),
        (u'Mobile and wireless',
         u'http://www.cio.co.uk/rss/feeds/cio-mobile-wireless-technology.xml'),
        (u'Security', u'http://www.cio.co.uk/rss/feeds/cio-security-technology.xml'),
        (u'Storage', u'http://www.cio.co.uk/rss/feeds/cio-storage-technology.xml'),
        (u'Desktop and client',
         u'http://www.cio.co.uk/rss/feeds/cio-desktop-client-technology.xml'),
        (u'Outsourcing', u'http://www.cio.co.uk/rss/feeds/cio-outsourcing-technology.xml'),
        (u'Internet and e-commerce',
         u'http://www.cio.co.uk/rss/feeds/cio-internet-technology.xml'),
        (u'Database management',
         u'http://www.cio.co.uk/rss/feeds/cio-database-management-technology.xml'),
        (u'Communications and networking ',
         u'http://www.cio.co.uk/rss/feeds/cio-communication-networking-technology.xml'),
        (u'Grid computing',
         u'http://www.cio.co.uk/rss/feeds/cio-grid-computing-cloud-technology.xml'),
        (u'Enterprise search',
         u'http://www.cio.co.uk/rss/feeds/cio-enterprise-search-technology.xml'),
        (u'CRM ', u'http://www.cio.co.uk/rss/feeds/cio-crm-technology.xml'),
        (u'Ade McCormack ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-ade-mccormack.xml'),
        (u'Andy Hayler ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-andy-hayler.xml'),
        (u'CEB ', u'http://www.cio.co.uk/rss/feeds/cio-opinion-ceb.xml'),
        (u'CIO Staff ', u'http://www.cio.co.uk/rss/feeds/cio-opinion-cio-staff.xml'),
        (u'Dave Pepperell ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-dave-pepperell.xml'),
        (u'Elliot Limb ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-elliot-limb.xml'),
        (u'Freeform Dynamics ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-freeform-dynamics.xml'),
        (u'Giles Nelson ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-giles-nelson.xml'),
        (u'Mark Chillingworth ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-mark-chillingworth.xml'),
        (u'Martin Veitch ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-martin-veitch.xml'),
        (u'Mike Altendorf ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-mike-altendorf.xml'),
        (u'Richard Steel ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-richard-steel.xml'),
        (u'Richard Sykes ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-richard-sykes.xml'),
        (u'Rob Llewellyn ',
         u'http://www.cio.co.uk/rss/feeds/cio-opinion-rob-llewellyn.xml'),
        (u'Free thinking ',
         u'http://www.cio.co.uk/rss/feeds/cio-blog-free-thinking.xml'),
        (u'Leading CIOs ',
         u'http://www.cio.co.uk/rss/feeds/cio-blog-leading-cios.xml'),
        (u'CIO News View ',
         u'http://www.cio.co.uk/rss/feeds/cio-blog-cio-news-view.xml'),
        (u'CIO Blog ', u'http://www.cio.co.uk/rss/feeds/cio-blog-cio-blog.xml'),
        (u'Transformation CIO ',
         u'http://www.cio.co.uk/rss/feeds/cio-blog-transformation-cio.xml')
    ]
PK�X
�7llcio_magazine.png�PNG


IHDR  ��tRNSn��	pHYs���+IDATH��Umh[U���p	��pI		#�%c�Yi�ͨmi�vh���:��ZV۹U�2Q�Ł�#(��ADdV�M6�����>:e���snnnҴ�M���{�Q[�?�Q8\�{����y�#�tH[[�>@ ��(}a#dT�C�h��R�l{���@�2O�$�S��$/�}\	2���1/c�2s)�7�0�<�ftso��7��$v7'�7��H�OG����E�)�ѓ�:`LϤOͧ_|�xfV� ���;56�zr<�ĸh�E05R����d~�g}p��̈{�5�M����y�u'�r�R��:<T�W�ξ��1������ٕ��C}x!V0,5�d���'f�"EAZfH�$�.]^~�&Ex{���ij���&FW�/�~�.l������μ~�N�U�0��[���,nᾐS+��r�� �^��(48���ï1=[}���#([���"a��|�=��捛�X�_�Zs�El�й��d��R�hيC*da}�=?8�\PN���|�v������$PUl��ZkB�s_�P�t%:�i2w�K\��ƛt��2k���q2��F6ӕ`@�n�yFq5�%:�\���g�U�2��/৫�{]�P�k���np�b�JQ��w�ys�n���6������M�ێ�����ە��r��Q�HѰ�V���%�za�h�S�&{�_�"w�+�7�R�G��`P��J�y�����vt�*"
+/ �*�z�����t��(�����d�e{)9n%�}��˭|t��S�7x�"Z�J�R�
ZK�`%��.5Z b�����-��ɾ~��i��T��y�v�̫b�.�+��fμb.-�ڢq��?T���ǞB���$�bLL�H��cZ�}e�(��͆b��h��S��/��͟�n^�u����9c��1u\h��H	�kL7�5f���BE\�]���	��G�F�\C��r��5I��hFe&��^�k��R��3_�ͨ��R�?xp��-��%���rlTlխIEND�B`�PK�X�����cio_magazine.recipefrom __future__ import print_function
# Los primeros comentarios son las dificultades que he tenido con el Piton
# Cuando da error UTF8 revisa los comentarios (acentos). En notepad++ Search, Goto, posicion y lo ves.
# Editar con Notepad++ Si pone - donde no debe es que ha indentado mal... Edit - Blank operations - tab to space
# He entendido lo que significa el from... son paths dentro de pylib.zip...
# Con from importa solo un simbolo...con import,la libreria completa
from calibre.web.feeds.news import BasicNewsRecipe
# sys no hace falta... lo intente usar para escribir en stderr
from calibre import strftime
# Para convertir el tiempo del articulo
import string
import re
# Para usar expresiones regulares
# Visto en pylib.zip... la primera letra es mayuscula
# Estas dos ultimas han sido un vago intento de establecer una cookie (no
# usado)


class CIO_Magazine(BasicNewsRecipe):
    title = 'CIO Magazine'
    oldest_article = 14
    max_articles_per_feed = 100
    auto_cleanup = True
    __author__ = 'Julio Map'
    description = 'CIO is the leading information brand for today-s busy Chief information Officer - CIO Magazine bi-monthly '
    language = 'en'
    encoding = 'utf8'
    cover_url = 'http://www.cio.com/homepage/images/hp-cio-logo-linkedin.png'

    remove_tags_before = dict(name='div', attrs={'id': 'container'})
# Absolutamente innecesario... al final he visto un print_version (ver mas
# adelante)

# Dentro de una revista dada...
# issue_details contiene el titulo y las secciones de este ejemplar
# DetailModule esta dentro de issue_details contiene las urls y resumenes
# Dentro de un articulo dado...
# Article-default-body contiene el texto. Pero como digo, he encontrado
# una print_version

    no_stylesheets = True
    remove_javascript = True

    def print_version(self, url):
        # A esta funcion le llama el sistema... no hay que llamarla uno mismo (porque seria llamada dos veces)
        # Existe una version imprimible de los articulos cambiando
        # http://www.cio.com/article/<num>/<titulo> por
        # http://www.cio.com/article/print/<num> que contiene todas las paginas
        # dentro del div id=container
        if url.startswith('/'):
            url = 'http://www.cio.com' + url
        segments = url.split('/')
        printURL = '/'.join(segments[0:4]) + '/print/' + segments[4] + '#'
        return printURL

    def parse_index(self):
        #######################################################################
        #    This method should be implemented in recipes that parse a website
        # instead of feeds to generate a list of articles. Typical uses are for
        # news sources that have a Print Edition webpage that lists all the
        # articles in the current print edition. If this function is implemented,
        # it will be used in preference to BasicNewsRecipe.parse_feeds().
        #
        # It must return a list. Each element of the list must be a 2-element
        # tuple of the form ('feed title', list of articles).
        #
        # Each list of articles must contain dictionaries of the form:
        #
        # {
        # 'title'       : article title,
        # 'url'         : URL of print version,
        # 'date'        : The publication date of the article as a string,
        # 'description' : A summary of the article
        # 'content'     : The full article (can be an empty string). This is used by FullContentProfile
        # }
        #
        # For an example, see the recipe for downloading The Atlantic.
        # In addition, you can add 'author' for the author of the article.
        #######################################################################

        # Primero buscamos cual es la ultima revista que se ha creado
        soupinicial = self.index_to_soup('http://www.cio.com/magazine')
        # Es el primer enlace que hay en el DIV con class content_body
        a = soupinicial.find(
            True, attrs={'class': 'content_body'}).find('a', href=True)
        INDEX = re.sub(r'\?.*', '', a['href'])
        # Como cio.com usa enlaces relativos, le anteponemos el domain name.
        if INDEX.startswith('/'):  # protegiendonos de que dejen de usarlos
            INDEX = 'http://www.cio.com' + INDEX
        # Y nos aseguramos en los logs que lo estamos haciendo bien
        print("INDEX en parse_index: ", INDEX)

    # Ya sabemos cual es la revista... procesemosla.
        soup = self.index_to_soup(INDEX)

        articles = {}
        key = None
        feeds = []
        # Para empezar nos quedamos solo con dos DIV, 'heading' y ' issue_item'
        # Del primero sacamos las categorias (key) y del segundo las urls y
        # resumenes
        for div in soup.findAll(True,
                                attrs={'class': ['heading', 'issue_item']}):

            if ''.join(div['class']) == 'heading':
                key = string.capwords(self.tag_to_string(div.span))
                print("Key: ", key)  # Esto es para depurar
                articles[key] = []
                feeds.append(key)

            elif ''.join(div['class']) == 'issue_item':
                a = div.find('a', href=True)
                if not a:
                    continue
                url = re.sub(r'\?.*', '', a['href'])
                print("url: ", url)  # Esto es para depurar
                # Ya para nota, quitar al final las dos ultimas palabras
                title = self.tag_to_string(a, use_alt=True).strip()
                # No es la fecha de publicacion sino la de colecta
                pubdate = strftime('%a, %d %b')
                # Dentro de la div 'issue_item' el unico parrafo que hay es el
                # resumen
                summary = div.find('p')
                # Si hay summary la description sera el summary... si no, la
                # dejamos en blanco
                description = ''

                if summary:
                    description = self.tag_to_string(summary, use_alt=False)
                    print("Description = ", description)

                # Esto esta copiado del NY times
                feed = key if key is not None else 'Uncategorized'
                if feed not in articles:
                    articles[feed] = []
                if 'podcasts' not in url:
                    articles[feed].append(
                        dict(title=title, url=url, date=pubdate,
                             description=description,
                             content=''))
        feeds = [(k, articles[k]) for k in feeds if k in articles]
        return feeds
PK�X.&s�QQciperchile.png�PNG


IHDR  D���mPLTE��('''&))(&%)(��,)(&%%&'�0#
'$$*��'%��(2��b.*��+	slT% 58l���*��(�࡙�:�Ά��,���������b��E�Ͳ�+��+˸-6G1'3D.42C	.>#%HY��36+,'�ܟL��4��7�豼���d��,=��Ղ.��u�}/�}.��*/�ه�p��*�z/��*~�)|�+*��~�%w�j{�(t�*p�*p�)�h,xuH>����,��,bx)�^-�^,/}�eu[kX]s(Yo*~T+QbRQaRQg*n��͉�З��,�Mþ-FQ:ZtCP7JDPh5K&Md/E'5C5BDXA;CX-<%<(71'�ە��+��+ʗY�ӌG^)E[&��b`y%.#)	&5$#-"
"'!%''	))Ͷ.̶-��+(��**'��*�͕��*���&���ۧ.��)��)��*��)�/��)�ɓ��(�/�����(
�0�0��(��i#��W�ʊ"!"
��I
�6�Ð�<�˜�^���IDATx�]���H���ZUg{��۶m۶m۶m��Μ�y�~O(%|7���-�J3�z�J4`�Vi�(�c!��q�m)v)��>G�A�}��<���ui
2�u7r�R=C�hr�A��~�Ȣ+��X�/�
H�_Y�����=��E�wH5�)yR�j-��Ai��3��н{ǝ��e(3D�O�sI��P 2��e�%����m���I�:E�!�XR���U�n�]�ʰ⼊2#�KO�K�k�5=���u�Vb>�>�)���n�ֶ�����	�H@��0����n���I�����>� �d<-�AI���u���$&�*���K��x�l�b�dJN�S�}���Y�{��X��jR"�z��<w��M6�]|�� \r��f=q�7�߻����z�KG�	�n������v�5����,'7`�t�H���5���V\(�Y���4`I�LԞ�%W5�x?�օ2��������.�`�ş���Pnk������>r!Ԡ�F��`n>��`�9�8�7�l�-P�`e��p0��9�;�.��i\�7w����K�i����J�`�`t��k�f�kkqe��V�4귋��~���v�ȇ�@�(̱��IH|��#�1�=�[�>��ӂ�&�@�M��]�"����"c���V7q�u�%pIEND�B`�PK�X!�Em��ciperchile.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
ciperchile.cl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class CiperChile(BasicNewsRecipe):
    title = 'CIPER Chile'
    __author__ = 'Darko Miletic'
    description = 'El Centro de Investigacion e Informacion Periodistica (CIPER) es una institucion independiente que desarrolla reportajes de investigacion de acuerdo a principios de maxima calidad e integridad profesional. Para lograr dicho objetivo, los profesionales de CIPER incorporan a las tecnicas propias del reporteo el uso sistematico de las leyes chilenas que norman el libre acceso a la informacion, de manera que los documentos que se obtengan por esta via esten puestos a disposicion del publico sin restricciones.'  # noqa
    publisher = 'CIPER'
    category = 'news, politics, Chile'
    oldest_article = 15
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'es_CL'
    auto_cleanup = False
    remove_empty_feeds = True
    publication_type = 'blog'
    masthead_url = 'http://ciperchile.cl/wp-content/themes/cipertheme/css/ui/ciper-logo.png'
    extra_css             = """
                               body{font-family: Arial,sans-serif}
                               .excerpt{font-family: Georgia,"Times New Roman",Times,serif; font-style: italic; font-size: 1.25em}
                               .author{font-family: Georgia,"Times New Roman",Times,serif; font-style: italic; font-size: small}
                               .date{font-family: Georgia,"Times New Roman",Times,serif; font-size: small; color: grey}
                               .epigrafe{font-size: small; color: grey}
                               img{margin-bottom: 0.4em; display:block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link']),
        dict(attrs={'class': ['articleSharingTools', 'articleNav']})
    ]
    remove_attributes = ['lang']
    remove_tags_before = dict(name='p', attrs={'class': 'epigrafe'})
    remove_tags_after = dict(name='div', attrs={'class': 'articleBody'})
    keep_only_tags = [dict(name='div', attrs={'class': 'articleElements'})]

    feeds = [

    (u'Opinion del lector', u'http://ciperchile.cl/category/opinion-del-lector/feed/'),
    (u'Reportajes de investigacion', u'http://ciperchile.cl/category/reportajes-de-investigacion/feed/'),
    (u'Actualidad y Entrevistas', u'http://ciperchile.cl/category/actualidad-y-entrevistas/feed/'),
    (u'Opinion', u'http://ciperchile.cl/category/opinion/feed/'),
    (u'Accesso a la informacion', u'http://ciperchile.cl/category/acceso-a-la-informacion/feed/'),
    (u'Libros', u'http://ciperchile.cl/category/libros/feed/'),
    (u'Blog', u'http://ciperchile.cl/category/blog/feed/')
    ]
PK�X&�C�cityavisen_dk.png�PNG


IHDR  D���3PLTEMv���P��@z������ß�̯��������X�����p��0n�`�� c�����IDATx���E1D���?m]ï��]��~h�-@�:H�cՁ�'�lg�46f	��>�E���X�����:�e`Q�z��rˠ�ܾ�p�H�3�^n� k~�_A+ށ@K��y��ʙWu�$�؞y0P�9����IEND�B`�PK�X�޼�cityavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
City Avisen
'''


class CityAvisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'City Avisen'

    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('City Avisen', 'http://minby.dk/city-avisen/feed/'),
        ('Kommentarer til City Avisen', 'http://minby.dk/city-avisen/comments/feed/'),

    ]

PK�XV�-''cjr.png�PNG


IHDR  D����PLTE�P'�������P'�R'����������R+�Z8�oN��f��i��r��u��~�J�J+�L�F�������J����D�P'�R+������������N"�H�R'�J��|�L����L"����F����������L�wU�_��x��z�;��~�N'����J����B����5����T+�T.�U.�W2�xU����D��i��m��p��s�Y2�Z5��~�];�_;�@�b=�b@�eB�kJ�mJ�rP�sR����H�`=�{Y�������������}\�~\����5��g�=��j��g��i��k��m�"��n��o��n�nJ��s�oL��u��u��w��w��v��w�pN�\5��z��{��{�pN��}��~�rP�]8���uR�uT�c@�L"�xW�zW�{Y�fD�gD�gF�\�]�_�iH�`����`��b��c�����g�����g�jF��}`��JtRNS������������������������f���IDATx�b``���x�`Q`���<qm��޳����S۶m�����-������<Qem��MB�#)_�%$��)�m�@���l�o�^%R�z}�_����g�bۻ)w�dH`y�!s���S�0zv���3Ί_�	B��]������p���i�N�Dž��t�r�nͼ7�21�ѕ7��	�-l�����faU��z���)a��_��n��0.�J�����as�)k�ŷ����K�H3��-��Q�f�Sŕlg�M�F��R�4;WB���!\�/��Xw�2m?h�>�*��\�$T�ܸp�OaՇsQ���@S���%'��`d��EN�ja�e��v�A�؇_4�5�	�S� �ĉ��t����f���5�-�E�9�c�1j�3v$`��A�����ȫ�$khgg��g��nDM$ߎ_����v$��B�dC���V}��TUQ+��O4�bf�Fb��$�a���ܺړ�L��\������O0�IEND�B`�PK�X�EUJ��
cjr.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class CJR(BasicNewsRecipe):
    title = u'Columbia Journalism Review'
    __author__ = u'Xanthan Gum'
    description = 'News about journalism.'
    language = 'en'

    oldest_article = 7
    max_articles_per_feed = 100

    feeds = [(u'News Stories', u'http://www.cjr.org/index.xml')]

    def print_version(self, url):
        return url + '?page=all&print=true'
PK�Xܓ#�HH
clarin.png�PNG


IHDR�aIDATx�}��]I������U�Rl۶m۶mb�N!�m�3��:���Ij�?�2�W�p�&��umT�
��m���U�tx��_���xIS|�3�1%H�|�!���Z�2���a��ю��Ɋ�EQ���h�߾1��CD��D~�9�z=��ZD���2�N��d����w���S�v��D�C�E�g�u�럸���v�O�|���oh^���'�y/U��!����ߥ�Q�s�8�OVVanl�B"���JD�ѣS��V�%����P�dy�)뇼v��x��g�4i7��]�jQs�A��p���A��p�2,T*���p�1��_�=��J�./DJ��)ر�W_|��=�]��QSt%���>xB�J_��gI���L}��6�EC�	� B<�4&8���h��:����_v"���=wo���������~oÓM�aN��y�]�5$=��.�p���Wv'����ޭ��Kf����t���K#թ�������=��9?���IEND�B`�PK�X�?�Voo
clarin.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

from __future__ import unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2008-2016, Darko Miletic <darko.miletic at gmail.com>'
'''
clarin.com
'''

try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class Clarin(BasicNewsRecipe):
    title = 'Clarín'
    __author__ = 'Darko Miletic, updated by GGsalas'
    description = 'Clarin.com. Noticias de la Argentina y el mundo. Información actualizada las 24 horas y en español. Informate ya'
    publisher = 'Grupo Clarin'
    category = 'news, politics, Argentina'
    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    encoding = 'utf8'
    delay = 1
    language = 'es_AR'
    publication_type = 'newspaper'
    needs_subscription = 'optional'
    INDEX = 'http://www.clarin.com'
    LOGIN = 'https://app-pase.clarin.com/pase-registracion/app/pase/ingresarNavegable?execution=e1s1'
    cover_url = strftime('http://tapas.clarin.com/tapa/%Y/%m/%d/%Y%m%d_thumb.jpg')

    compress_news_images = True
    scale_news_images_to_device = True
    compress_news_images_max_size = 10  # kB

    # To get all the data (images)
    auto_cleanup = False

    extra_css = """
      h1#title {
        line-height: 1em;
        margin: 0 0 .5em 0;
      }
      p.volanta {
        font-size: .7em;
        margin-bottom: .5em;
      }
      .bajada h2 {
        font-size: 1em;
        line-height: 1em;
        color: #666666;
        margin: 0 0 1em 0;
      }
      .figcaption {
        font-style: italic;
        font-size: .9em;
        margin-bottom: .5em;
      }
    """

    conversion_options = {
      'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
      dict(name='p'  , attrs={'class'   : 'volanta'}),
      dict(name='h1' , attrs={'id': 'title'}),
      dict(name='div', attrs={'class'   : 'bajada'}),
      dict(name='div', attrs={'id'   : 'galeria-trigger'}),
      dict(name='div', attrs={'class'   : 'body-nota'})

    ]

    remove_tags = [
        dict(name=['meta', 'base', 'link', 'iframe', 'embed', 'object']),
        dict(attrs={'class': ['tags-bar', 'breadcrumb', 'share-bar', 'share', 'sp__SM']}),
        dict(name='div', attrs={'class': lambda x: x and 'r-nota' in x.split()}),
        dict(attrs={'id': ['relacionadas']}),
        dict(name='a', attrs={'class':'content-new'})
    ]

    remove_tags_after = dict(name='div', attrs={'id': 'relacionadas'})

    remove_attributes = ['lang']

    # Images on highlights view
    def populate_article_metadata(self, article, soup, first):
        if first and hasattr(self, 'add_toc_thumbnail'):
            picdiv = soup.find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, picdiv['src'])

    feeds = [
      (u'Lo Ultimo', u'http://www.clarin.com/rss/lo-ultimo/'),
      (u'Politica', u'http://www.clarin.com/rss/politica/'),
      (u'Opinion', u'https://www.clarin.com/rss/opinion/'),
      (u'Cultura', u'https://www.clarin.com/rss/cultura/'),
      (u'Economia', u'https://www.clarin.com/rss/economia/'),
      (u'Tecnologia', u'https://www.clarin.com/rss/tecnologia/'),
      (u'RevistaN', u'https://www.clarin.com/rss/revista-enie/'),
      (u'Viva', u'https://www.clarin.com/rss/viva/'),
      (u'Deportes', u'http://www.clarin.com/rss/deportes/'),
      (u'Mundo', u'http://www.clarin.com/rss/mundo/'),
      (u'Espectaculos', u'http://www.clarin.com/rss/espectaculos/'),
      (u'Sociedad', u'http://www.clarin.com/rss/sociedad/'),
      (u'Ciudades', u'http://www.clarin.com/rss/ciudades/'),
      (u'Policiales', u'http://www.clarin.com/rss/policiales/'),
      (u'Internet', u'http://www.clarin.com/rss/internet/')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.INDEX)
        if self.username is not None and self.password is not None:
            data = urlencode({'ingresar_ingresar_paseForm': 'ingresar_ingresar_paseForm',
                                     'ingresar_ingresar_email_paseInputComponent': self.username,
                                     'ingresar_ingresar_palabraClave_paseInputComponent': self.password,
                                     'ingresar_ingresar_ingresar_paseButton': 'Ingresar',
                                     'javax.faces.ViewState': 'e1s1'  # noqa
                                     })
            br.open(self.LOGIN, data)
        return br

    def preprocess_html(self, soup):
        for img in soup.findAll(['img'], attrs={'data-big': True}):
            img['src'] = img['data-big']

        for figCaption in soup.findAll(['figcaption']):
            figCaption.name = 'div'
            figCaption['class'] = 'figcaption'

        return soup

    def postprocess_html(self, soup, first_fetch):
        for t in soup.findAll(['a']):
            t.name = 'strong'

        nonBreakSpace = u'\xa0'
        for empty in soup.findAll('p', string=nonBreakSpace):
            empty.extract()

        return soup
PK�X���ό�clarion_ledger.png�PNG


IHDR  szz�SIDATx��P\Y�!�qw��wwg������t7.q"���=��	��}{��t-� �z�>h����i�����n�;��"bj������lA�k�y�r�a��b�RD*
S����oxR��@���X�,VD������O�Z�#.���
�F���r}?�D)����|�
�8zM��f�"Z�ڿJ�[FqǨ�ܺ`�j	�f���G
;D��Da]p=��}���=4y��2�G
_sC�r��&+���45;6)�kV��s"_�]x�����/�&d�b�!��<��Bx�<�D�ⱨ����?ؘ��PF����;���%Ĥ�Z�P�O����Ӹ��$n:��L��̙�E����}�%�/Wc��N+��xf}���)܋;��r���;�
�V'�*��3A�������v|׃�_Oᆉ���5[�/x;z(55%�Y�ȼ�4�U�|�H�L�ou���O�g�p�_9�B��k�#�|O ��.��@��G?���AǷ�b�g4wG~˸�H,U
'��B/?�M@-^�W#z�@�h�_����<`t���bS�Fbb��O�t�΃N��q���1�����æ0�a���ÙX�_؆$u箵�;ܙ{���ɝv��M	�6�"�}� 䕾ȫÐG� �~`ca�E`�,H���R�2H�=����]Hhwd�z��\�w7ɬ���y�^^�>G�j�6��n�AJ�e@Az�$���Pz���;*�� ��KYl<~���iLN_�����dTR�M
\l,൷�i&ЫhPpb��m�/l��3���m��v8�
.�Ӱjyyc��J�H��BQ�H���~W��ט�����lB˙��}��d�.��J�.�`���+-�-���&�.��x�6��Ǎ�%�AGBZ���Ƞ���L�#�`��q_�m�v.	�*,Z���@Ih�S��(��a�[����tX5�K�`�/����K$�M,�K3�r�j��ˎcΜ�~8J�A�I������@u!T��҃�Ǣ1縠���:�H�G߱�8�[f��&�hb>7bm��#����2����p�2h�(@ɡ+I%��=]�\,��e�P�M^��γ��%�U�q;v_����kD&���^A��GK�Y�]M�u	�泉h[�'���io��lG�����m�ܹ~�r$�A�^���)�K�sp
h%hg7�幣m�~>	��,�@m2�*���O{�}�L�����2'"�cv���il^�E�9�_��&/��
��,�A�f����a>��Z����z�3hX5<01q>�,�"`l�b�_�|�G��u����x��fY�>
N�C�N��	�D@�A�A����z���yl(�M�&��'I.ܸ*��65-_�?��"�dʓ�k���MN�1,M�o=�I��h֣8���9��	�Ip�f�D삇s�!	������dzc�{�vyn��o�w.ȝc\�
j���5�^��8�	���|����<c>��r����@��ַdoΉ�7�.�Sl����AnKO���u�lz�QtKNy8��#{���w�����6;@5$%HX+��w�(���{���Un���'���(,��͐���<�՜
�pK����Wa�8��4;��Jd7�[��������&��Y^vK�W\S��Q����Ο/���y��o,w�����<:���G�~2��q�#/6>�t�~�/��r�-L���'l�&��=#�ʣc6ȍ?��?3j���C#3��绾��B�ϖ�zN�D��&�ʂN�?�����q�zj�w�L���1�������+��g0<IEND�B`�PK�X�1�clarion_ledger.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class ClarionLedger(BasicNewsRecipe):
    title = u'Clarion Ledger'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    language = 'en'
    __author__ = 'cr4zyd'

    feeds = [
    (u'Local News', u'http://www.clarionledger.com/apps/pbcs.dll/oversikt?Category=RSS01'),
    (u'Breaking News', u'http://www.clarionledger.com/apps/pbcs.dll/section?Category=RSS'),

    (u'Sports', u'http://www.clarionledger.com/apps/pbcs.dll/oversikt?Category=RSS02'),
    (u'Business', u'http://www.clarionledger.com/apps/pbcs.dll/oversikt?Category=RSS03')]

    keep_only_tags = [dict(name='div', attrs={'class': 'article-headline'}),
                      dict(name='div', attrs={'class': 'article-bodytext'})]
    remove_tags = [dict(name=['img', 'script', 'li']),
                   dict(name='p', attrs={'class': 'ratingbyline'}),
                   dict(name='div', attrs={'class': 'article-tools'}),
                   dict(name='div', attrs={
                       'class': 'article-pagination article-pagination-top'}),
                   dict(name='div', attrs={
                       'class': 'article-pagination article-pagination-bottom'}),
                   dict(name='div', attrs={'class': 'articleflex-container'})]
PK�X�Y�wwclic_rbs.png�PNG


IHDR  szz�>IDATx�b�`�G{3@��=G��m�6��ضm۶m۶m۶�z���`3��Ͼ�vX�u�/�${�=���e���'�~���|>��v$�o�y�p�r�	l#�~m�_6���-0M?��I�D��l&���E��pa�I8q�:w�$F~���$����\$��vg]�ӹlP���;F����@k���C���`�X���z�#�)~|p�\�.���kCg�ܧ`P��x�Ү]��|y��n��TgH���{d�ح�`�����ϻ��r\�	\\8��
T*�M��Ĵ�Q�J=XLj	l|�
����
��&�(�-�L��L�mE�f�0�o|���;$E�R�pvIX1�nO`4��ͫ&A��Ѵj
x�N���gS�
#;&E��٤S~�k��k7��@�jqoC�� ��#;'��y��AЯU
|88����P�o\UG{�6)��7��W{�8^H��1�Ɏ��1
1Շ��je����p_����4pD��a�����N�`Spɞ��7�[|G��kJ���I�6G����k��z�\XF�9�ff��jϩ��I�桶p���O�#��f��������{�L9�vf��t࢞�Ê��3=��M���3���*��c�'��E'o0EX7.�|���Ȑ9'\&ׁ�Hf�O��g�vzoU�N��a�50P+�&�^��T-�A�wưvIQ��	�Kf�2�_6���X�kڡ�QkD�?oM|��\���DRU(�WׄN��d0-�eJ�A����Q��	�W�N�iy䴔)�U�$�f �M�j7�3����L��N����rD,�\^�_�U��C�$��
!e�)W�@��i�+�ˆ��7P���=d��ؠR&n���'E�Z�Q4�-k���tn���}��(5z�m�t�R
3�
4�U����ِE�Y�.���6�����9(e� 2�6��d��%�D�ަ����$��vB�F��[���!k	~&�u��B����;�L��_��#���W�S�W�E��HΓ�d,)DB+����_����@,J�wIEND�B`�PK�X]1r5
5
clic_rbs.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class ClicRBS(BasicNewsRecipe):
    title = u'ClicRBS'
    language = 'pt'
    __author__ = 'arvoredo'
    oldest_article = 3
    max_articles_per_feed = 9
    cover_url = 'http://www.publicidade.clicrbs.com.br/clicrbs/imgs/logo_clic.gif'

    remove_tags = [
        dict(name='div', attrs={
             'class': ['clic-barra-inner', 'botao-versao-mobile ']})
    ]

    remove_tags_before = dict(name='div ', attrs={'class': 'descricao'})
    remove_tags_before = dict(name='div', attrs={'id': 'glb-corpo'})
    remove_tags_before = dict(name='div', attrs={'class': 'descricao'})
    remove_tags_before = dict(name='div', attrs={'class': 'coluna'})
    remove_tags_after = dict(name='div', attrs={'class': 'extra'})
    remove_tags_after = dict(name='div', attrs={'id': 'links-patrocinados'})
    remove_tags_after = dict(name='h4', attrs={'class': 'tipo-c comente'})
    remove_tags_after = dict(name='ul', attrs={'class': 'lista'})

    feeds = [

    (u'zerohora.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?uf=1&local=1&channel=13'),
    (u'diariocatarinense.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?uf=2&local=18&channel=67'),
    (u'Concursos e Emprego', u'http://g1.globo.com/Rss2/0,,AS0-9654,00.xml'),
    (u'Pioneiro.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?channel=87&uf=1&local=1'),
    (u'Economia, zerohora.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=801&uf=1&local=1&channel=13'),
    (u'Esportes, zerohora.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=802&uf=1&local=1&channel=13'),
    (u'Economia, Pioneiro.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=1180&channel=87&uf=1&local=1'),
    (u'Política, Pioneiro.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=1185&channel=87&uf=1&local=1'),
    (u'Mundo, Pioneiro.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=1184&channel=87&uf=1&local=1'),
    (u'Catarinense, Esportes, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=&theme=371&uf=2&channel=2'),
    (u'Geral, Pioneiro.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=1183&channel=87&uf=1&local=1'),
    (u'Estilo de Vida, zerohora.com, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=805&uf=1&local=1&channel=13'),
    (u'Corrida, Corrida, Esportes, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=1313&theme=15704&uf=1&channel=2'),
    (u'Jornal de Santa Catarina, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?espid=159&uf=2&local=18'),
    (u'Grêmio, Futebol, Esportes, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=11&theme=65&uf=1&channel=2'),
    (u'Velocidade, Esportes, clicRBS', u'http://www.clicrbs.com.br/jsp/rssfeed.jspx?sect_id=1314&theme=2655&uf=1&channel=2')
    ]

    extra_css = '''
                    cite{color:#007BB5; font-size:xx-small; font-style:italic;}
                    body{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                    h3{font-size:large; color:#082963; font-weight:bold;}
                    #ident{color:#0179B4; font-size:xx-small;}
                    p{color:#000000;font-weight:normal;}
                    .commentario p{color:#007BB5; font-style:italic;}
                '''
PK�X��		climate_progress.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
climateprogress.org
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class ClimateProgress(BasicNewsRecipe):
    title = 'Climate Progress'
    __author__ = 'Darko Miletic'
    description = "An insider's view of climate science, politics and solutions"
    publisher = 'Climate Progress'
    category = 'news, ecology, climate, blog'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = True
    encoding = 'utf-8'
    language = 'en'

    lang = 'en'
    direction = 'ltr'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    extra_css = '''
                h2{color:#003366;font-size: large ;font-family:Arial,Helvetica,sans-serif; font-weight:bold;}
                h3{color:#003366;font-size: small ;font-family:Arial,Helvetica,sans-serif; font-weight:bold;}
                h4{color:#003366;font-size: x-small ;font-family:Arial,Helvetica,sans-serif; font-weight:bold;}
                .date{color:#333333; font-size:xx-small; font-family:Arial,Helvetica,sans-serif; font-style:italic}
                a{color:#339966;}
                body{font-family:Georgia,Times New Roman,Times,serif; font-size:x-small;color:#333333;}
                '''

    feeds = [(u'Posts', u'http://feeds.feedburner.com/climateprogress/lCrX')]

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return self.adeify_images(soup)
PK�XT)<N��cm_journal.png�PNG


IHDR�a�IDATx�̒�A���m۶m;Vmێڨv�"j�}�{����S���<?�5nɯ��L�Z�1J�����5i�c
�EUb:v%y�
E���f=�+U������FtrR��$��1���H��D��$�G���޽K�C�,^F���ܺM˜q(�j#"� {��`�Ƞ��e��ס"8�/a�bPڴG�ɖ�����S�z�Q��Bm�Cp0�,�{N.n���s�qVT�A¸Ɉ�c�#I_��!Pk5Bi�+
C���10�Áң��d셅��P5�����־��j�>T��"�?Sx88���U��e��<kޫd����k��d2N����	�UE;r4��<\N���!�F-��R��=�q��9�:{�‡�ee��Y��9��$�AC0��`%n�0�l9�E54=q�߫?Z���5��yj5���Ĉ���ZUyPF�cIEND�B`�PK�X��[ˡ�cm_journal.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class CMJornal_pt(BasicNewsRecipe):
    title = 'Correio da Manha - Portugal'
    __author__ = 'jmst'
    description = 'As noticias de Portugal e do Mundo'
    publisher = 'Cofina Media'
    category = ''
    oldest_article = 1
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'pt'
    extra_css = ' .publish{font-style: italic; line-height: 1.2em; border-bottom: 1px dotted; padding: 5px 0} .entity{line-height: 1.2em} .overview{line-height:1.2em} '  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(name=['h2', 'h1']), dict(name='div', attrs={'class': ['news']})
    ]

    remove_tags = [
        dict(name=['object', 'embed', 'iframe']), dict(
            name='a', attrs={'href': ['#']})
    ]

    feeds = [

    (u'Actualidade', u'http://www.cmjornal.xl.pt/rss/rss.aspx?channelID=00000009-0000-0000-0000-000000000009'),
    (u'Portugal', u'http://www.cmjornal.xl.pt/rss/rss.aspx?channelID=00000010-0000-0000-0000-000000000010'),
    (u'Economia', u'http://www.cmjornal.xl.pt/rss/rss.aspx?channelID=00000011-0000-0000-0000-000000000011'),
    (u'Mundo', u'http://www.cmjornal.xl.pt/rss/rss.aspx?channelID=00000091-0000-0000-0000-000000000091'),
    (u'Desporto', u'http://www.cmjornal.xl.pt/rss/rss.aspx?channelID=00000012-0000-0000-0000-000000000012'),
    (u'TV & Media', u'http://www.cmjornal.xl.pt/rss/rss.aspx?channelID=00000092-0000-0000-0000-000000000092')
    ]

    def print_version(self, url):
        return url.replace('noticia.aspx', 'Imprimir.aspx')
PK�XO��;��
cnetjapan.png�PNG


IHDR�aqIDATx�]ϻkTA��ofn������Eh�� �X�BE"�(X�h�+��^E!���۠`4$�}���;3Ǜ���|�3�0�*�#�G���b�G"��Y�R�>��=�k��H���-�.े�!����D�Q5Y���k�:�8�@�o��.%3N���A���<��P���
D]R0RSn���j)�-���ڕP2P�+�i���4�������#�� 	,_�C��@�P��,�;�e�d]�x�υ�MÍI���@%II?�'�9CuY�)����T�i$	��ɞo3$�R/'q}�&?�x.�N��Vs�[��W������2�q�.���*G��4UB�<B�{�@�Ƀ��i����ُ
��<{My�F�
�fu��_�>t�9�t7������[w5չ�j!��M���%��)�hl�vi�5�|J��zM�з���L�:[���*��cM���P��EB�
?�c��c�o)��=�7�@4���5�'R��B�"U'T���+�'�Ţ���*��5�$�b⼚�^���> T�񰯭��.p"/�H%�C���C/��p���m��±Ld�V�J<��W
�0I���%�>@��IEND�B`�PK�X?A
cnetjapan.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class CNetJapan(BasicNewsRecipe):
    title = u'CNET Japan'
    oldest_article = 3
    max_articles_per_feed = 30
    __author__ = 'Hiroshi Miura'

    feeds = [(u'CNet News', u'http://feed.japan.cnet.com/rss/index.rdf'),
             (u'CNet Blog', u'http://feed.japan.cnet.com/rss/blog/index.rdf')
             ]
    language = 'ja'
    encoding = 'utf-8'
    remove_javascript = True

    preprocess_regexps = [
        (re.compile(type(u'')(r'<!--\u25B2contents_left END\u25B2-->.*</body>'), re.DOTALL | re.IGNORECASE | re.UNICODE),
         lambda match: '</body>'),
        (re.compile(r'<!--AD_ELU_HEADER-->.*</body>', re.DOTALL | re.IGNORECASE),
            lambda match: '</body>'),
        (re.compile(type(u'')(r'<!-- \u25B2\u95A2\u9023\u30BF\u30B0\u25B2 -->.*<!-- \u25B2ZDNet\u25B2 -->'), re.UNICODE),
            lambda match: '<!-- removed -->'),
    ]

    remove_tags_before = dict(id="contents_l")
    remove_tags = [
        {'class': "social_bkm_share"},
        {'class': "social_bkm_print"},
        {'class': "block20 clearfix"},
        dict(name="div", attrs={'id': 'bookreview'}),
        {'class': "tag_left_ttl"},
        {'class': "tag_right"}
    ]
    remove_tags_after = {'class': "block20"}

    def parse_feeds(self):

        feeds = BasicNewsRecipe.parse_feeds(self)

        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if re.search(r'pheedo.jp', curarticle.url):
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []

        return feeds
PK�XO��;��cnetjapan_digital.png�PNG


IHDR�aqIDATx�]ϻkTA��ofn������Eh�� �X�BE"�(X�h�+��^E!���۠`4$�}���;3Ǜ���|�3�0�*�#�G���b�G"��Y�R�>��=�k��H���-�.े�!����D�Q5Y���k�:�8�@�o��.%3N���A���<��P���
D]R0RSn���j)�-���ڕP2P�+�i���4�������#�� 	,_�C��@�P��,�;�e�d]�x�υ�MÍI���@%II?�'�9CuY�)����T�i$	��ɞo3$�R/'q}�&?�x.�N��Vs�[��W������2�q�.���*G��4UB�<B�{�@�Ƀ��i����ُ
��<{My�F�
�fu��_�>t�9�t7������[w5չ�j!��M���%��)�hl�vi�5�|J��zM�з���L�:[���*��cM���P��EB�
?�c��c�o)��=�7�@4���5�'R��B�"U'T���+�'�Ţ���*��5�$�b⼚�^���> T�񰯭��.p"/�H%�C���C/��p���m��±Ld�V�J<��W
�0I���%�>@��IEND�B`�PK�X�����cnetjapan_digital.recipefrom __future__ import unicode_literals
import re
from calibre.web.feeds.news import BasicNewsRecipe


class CNetJapanDigital(BasicNewsRecipe):
    title = u'CNET Japan Digital'
    oldest_article = 3
    max_articles_per_feed = 30
    __author__ = 'Hiroshi Miura'

    feeds = [(u'CNet digital', u'http://feed.japan.cnet.com/rss/digital/index.rdf')]
    language = 'ja'
    encoding = 'Shift_JIS'
    remove_javascript = True

    preprocess_regexps = [
        (re.compile((r'<!--\u25B2contents_left END\u25B2-->.*</body>'), re.DOTALL | re.IGNORECASE | re.UNICODE),
         lambda match: '</body>'),
        (re.compile(r'<!--AD_ELU_HEADER-->.*</body>', re.DOTALL | re.IGNORECASE),
            lambda match: '</body>'),
        (re.compile((r'<!-- \u25B2\u95A2\u9023\u30BF\u30B0\u25B2 -->.*<!-- \u25B2ZDNet\u25B2 -->'), re.UNICODE),
            lambda match: '<!-- removed -->'),
    ]

    remove_tags_before = dict(id="contents_l")
    remove_tags = [
        {'class': "social_bkm_share"},
        {'class': "social_bkm_print"},
        {'class': "block20 clearfix"},
        dict(name="div", attrs={'id': 'bookreview'}),
        {'class': "tag_left_ttl"},
        {'class': "tag_right"}
    ]
    remove_tags_after = {'class': "block20"}

    def parse_feeds(self):

        feeds = BasicNewsRecipe.parse_feeds(self)

        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if re.search(r'pheedo.jp', curarticle.url):
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []

        return feeds
PK�XO��;��cnetjapan_release.png�PNG


IHDR�aqIDATx�]ϻkTA��ofn������Eh�� �X�BE"�(X�h�+��^E!���۠`4$�}���;3Ǜ���|�3�0�*�#�G���b�G"��Y�R�>��=�k��H���-�.े�!����D�Q5Y���k�:�8�@�o��.%3N���A���<��P���
D]R0RSn���j)�-���ڕP2P�+�i���4�������#�� 	,_�C��@�P��,�;�e�d]�x�υ�MÍI���@%II?�'�9CuY�)����T�i$	��ɞo3$�R/'q}�&?�x.�N��Vs�[��W������2�q�.���*G��4UB�<B�{�@�Ƀ��i����ُ
��<{My�F�
�fu��_�>t�9�t7������[w5չ�j!��M���%��)�hl�vi�5�|J��zM�з���L�:[���*��cM���P��EB�
?�c��c�o)��=�7�@4���5�'R��B�"U'T���+�'�Ţ���*��5�$�b⼚�^���> T�񰯭��.p"/�H%�C���C/��p���m��±Ld�V�J<��W
�0I���%�>@��IEND�B`�PK�X����cnetjapan_release.recipefrom __future__ import unicode_literals
import re
from calibre.web.feeds.news import BasicNewsRecipe


class CNetJapanRelease(BasicNewsRecipe):
    title = u'CNET Japan release'
    oldest_article = 3
    max_articles_per_feed = 30
    __author__ = 'Hiroshi Miura'

    feeds = [(u'CNet Release', u'http://feed.japan.cnet.com/rss/release/index.rdf')]
    language = 'ja'
    encoding = 'Shift_JIS'
    remove_javascript = True

    preprocess_regexps = [
        (re.compile((r'<!--\u25B2contents_left END\u25B2-->.*</body>'), re.DOTALL | re.IGNORECASE | re.UNICODE),
         lambda match: '</body>'),
        (re.compile(r'<!--AD_ELU_HEADER-->.*</body>', re.DOTALL | re.IGNORECASE),
            lambda match: '</body>'),
        (re.compile((r'<!-- \u25B2\u95A2\u9023\u30BF\u30B0\u25B2 -->.*<!-- \u25B2ZDNet\u25B2 -->'), re.UNICODE),
            lambda match: '<!-- removed -->'),
    ]

    remove_tags_before = dict(id="contents_l")
    remove_tags = [
        {'class': "social_bkm_share"},
        {'class': "social_bkm_print"},
        {'class': "block20 clearfix"},
        dict(name="div", attrs={'id': 'bookreview'}),
        {'class': "tag_left_ttl"}
    ]
    remove_tags_after = {'class': "block20"}

    def parse_feeds(self):

        feeds = BasicNewsRecipe.parse_feeds(self)

        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if re.search(r'pheedo.jp', curarticle.url):
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []

        return feeds
PK�XO��;��cnetnews.png�PNG


IHDR�aqIDATx�]ϻkTA��ofn������Eh�� �X�BE"�(X�h�+��^E!���۠`4$�}���;3Ǜ���|�3�0�*�#�G���b�G"��Y�R�>��=�k��H���-�.े�!����D�Q5Y���k�:�8�@�o��.%3N���A���<��P���
D]R0RSn���j)�-���ڕP2P�+�i���4�������#�� 	,_�C��@�P��,�;�e�d]�x�υ�MÍI���@%II?�'�9CuY�)����T�i$	��ɞo3$�R/'q}�&?�x.�N��Vs�[��W������2�q�.���*G��4UB�<B�{�@�Ƀ��i����ُ
��<{My�F�
�fu��_�>t�9�t7������[w5չ�j!��M���%��)�hl�vi�5�|J��zM�з���L�:[���*��cM���P��EB�
?�c��c�o)��=�7�@4���5�'R��B�"U'T���+�'�Ţ���*��5�$�b⼚�^���> T�񰯭��.p"/�H%�C���C/��p���m��±Ld�V�J<��W
�0I���%�>@��IEND�B`�PK�Xm��7��cnetnews.recipe__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
Changelog:
2011-09-24
Changed cover (drMerry)
2011-10-13
Updated Cover (drMerry)
2014-03-28
Update by Armin Geller
news.cnet.com
further updated by Bonni Salles
My updates use the current rss feeds for CNet and eliminates extraneous areas and
sets the oldest_article to 1 as the feed generally has the present day and one day before.
You may want to set it to download daily for this reason.
'''

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 CnetNews(BasicNewsRecipe):
    title = 'CNET News'
    __author__ = 'Kovid Goyal'
    description = 'Tech news and business reports by CNET News. Focused on information technology, core topics include computers, hardware, software, networking, and Internet media.'  # noqa
    publisher = 'CNET'
    category = 'news, IT, USA'
    encoding = 'utf-8'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    compress_news_images = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    use_embedded_content = False
    no_stylesheets = True
    recursions = 1

    remove_tags = [
        dict(name='div', attrs={'id': 'livefyreContainer'}),
        dict(section=['tag', 'shortcodeRelatedLinks']),
        dict(attrs={'class': ['ad-inline-product-carousel-top',
                              'author-social', 'row controls', 'launchGallery', 'topWrap']}),
        dict(name='a', attrs={'class': 'subHead',
                              'data-component': 'imageGalleryModal'}),
        dict(attrs={'data-component': 'sharebar'}),
        dict(name=['link', 'meta']),
        classes('playerControls video share-button'),
    ]

    keep_only_tags = [
        dict(name='h1'),
        dict(section='author'),
        dict(id=["article-body", 'cnetReview']),
        dict(attrs={'class': 'deal-content'}),
    ]

    feeds = [
        # (u'All of CNET', u'http://www.cnet.com/rss/all/'),
        (u'CNET News', u'http://www.cnet.com/rss/news/'),
        (u'CNET Reviews', u'http://www.cnet.com/rss/reviews/'),
        (u'CNET How To', u'http://www.cnet.com/rss/how-to/'),
        (u'CNET iPhone Update', u'http://www.cnet.com/rss/iphone-update/'),
        (u'CNET Crave', u'http://www.cnet.com/rss/crave/'),
        (u'CNET Car Tech', u'http://www.cnet.com/rss/car-tech/'),
        (u'CNET Android Update', u'http://www.cnet.com/rss/android-update/'),
        (u'CNET Gaming', u'http://www.cnet.com/rss/gaming/'),
        (u'CNET Cheapskate', u'http://www.cnet.com/rss/cheapskate/'),
    ]

    def get_article_url(self, article):
        ans = BasicNewsRecipe.get_article_url(self, article)
        if ans and ('cnet.com/videos/' in ans or 'cnet.com/pictures/' in ans):
            ans = None
        return ans

    def is_link_wanted(self, url, tag):
        return tag.findParent(attrs={'class': 'pageNav'}) is not None

    def preprocess_html(self, soup):
        for attr in 'data-original data-src'.split():
            for img in soup.findAll('img', attrs={attr: True}):
                img['src'] = img[attr].strip()
        return soup

    def postprocess_html(self, soup, first_fetch):
        for div in soup.findAll(attrs={'class': 'pagination'}):
            div.extract()
        for div in soup.findAll(attrs={'data-update-area': 'pagination'}):
            div.extract()
        for h1 in soup.findAll(itemprop='headline'):
            h1.extract()
            if first_fetch:
                soup.find('body').insert(1, h1)
        for img in soup.findAll('img'):
            img['height'] = img['width'] = ''
        return soup
PK�XU����cnn.png�PNG


IHDR))�����PLTE������tt�66���{{�ꔔ�����hh�kk�``�SS�JJ�EE�??��((�""뛛����莎興億��������������XX�ZZ�������PP洴�EEﯯ⬬�55�,,⧧좢��������

���؏������ﴴޛ����ᔔ�TT�yy���त�JJ��k��IDATx�b�`���A(�<�nSw����VK����5���k���Q7�u��;�jݠe�q<�Q�Bo�L�N�
Bː���"��eq�Ž������ZҸd��l	dQ"�-��n���:��;ZΒ�&���i8�
���SUQ�ɿM?��^D�T���`�v��?ꐨ�݇*�M�U&��y�]��L���]B����d�}����lL�n�a��C��9?ϭ�I�+�d��E��^�.Ԓ���F�W�9Ǿ�Q~k IY-Gk^x�ș���[��mbk�0��/�,��D]�N��aFʦ�<����ۂ�ecD���*�m�`�vvА�r�M�����B1#��cO:���8��M��LB�����_(���!f0�k��V�3����X�IWR���!�C��楣��� ,SMM�a�qGM�-�S��EIEND�B`�PK�X�?��0	0	
cnn.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
Profile to download CNN
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes


class CNN(BasicNewsRecipe):

    title = 'CNN'
    description = 'Global news'
    timefmt = ' [%d %b %Y]'
    __author__ = 'Kovid Goyal'
    language = 'en'

    no_stylesheets = True
    use_embedded_content = False
    oldest_article = 2
    ignore_duplicate_articles = {'url'}
    max_articles_per_feed = 25
    remove_attributes = ['style', 'height', 'width']
    keep_only_tags = [
        classes('headline__wrapper headline__sub-container article__main'),
    ]
    remove_tags = [classes('video-inline_carousel')]

    feeds = [
        ('Top News', 'http://rss.cnn.com/rss/cnn_topstories.rss'),
        ('World', 'http://rss.cnn.com/rss/cnn_world.rss'),
        ('U.S.', 'http://rss.cnn.com/rss/cnn_us.rss'),
        # ('Sports', 'http://rss.cnn.com/rss/si_topstories.rss'),
        ('Business', 'http://rss.cnn.com/rss/money_latest.rss'),
        ('Politics', 'http://rss.cnn.com/rss/cnn_allpolitics.rss'),
        ('Law', 'http://rss.cnn.com/rss/cnn_law.rss'),
        ('Technology', 'http://rss.cnn.com/rss/cnn_tech.rss'),
        ('Science & Space', 'http://rss.cnn.com/rss/cnn_space.rss'),
        ('Health', 'http://rss.cnn.com/rss/cnn_health.rss'),
        ('Entertainment', 'http://rss.cnn.com/rss/cnn_showbiz.rss'),
        ('Education', 'http://rss.cnn.com/rss/cnn_education.rss'),
        ('Offbeat', 'http://rss.cnn.com/rss/cnn_offbeat.rss'),
        ('Most Popular', 'http://rss.cnn.com/rss/cnn_mostpopular.rss')
    ]

    def get_article_url(self, article):
        ans = BasicNewsRecipe.get_article_url(self, article)
        ans = ans.partition('?')[0]
        if '.com/videos/' in ans:
            ans = None
        return ans

    def get_masthead_url(self):
        masthead = 'http://i.cdn.turner.com/cnn/.element/img/3.0/global/header/intl/hdr-globe-central.gif'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(masthead)
        except:
            self.log("\nCover unavailable")
            masthead = None
        return masthead

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'src':lambda x: x and x.endswith('.svg')}):
            img.extract()
        return soup
PK�X"��L��coda.png�PNG


IHDR  �s��IDATH��ԽkSa�_���R+X��Q�@Q�4vT�A�����c'A�E'�\܄.q�k��mR�������*6MsL���I���9˽�������귦��#�n�
�(aٜ����������qޖz�k����K�3a_�O�X\���	�[d�DEx�k�"��^{o���Y���T+�i�Û�;b�6]Nx`Y ��{��p��!<oTG$�#m�u�VϿ�ې`JwYt��H"-�[H0R��+�5���WCАU"�)_|j���*a���"N�]Q�T�"&�ɘ2*Y�ƱX{�1���cZA P��۰�� �ө�6�Y(���Ajr��MqI�[���7㱗���](Up����'���M�e����@�{��]-5���������)6���*�r_�[���`�� ig��VZ�N�B�m_�DuP���>xޘ�6������~�eIEND�B`�PK�X�"[__coda.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Coda(BasicNewsRecipe):
    title = 'Coda'
    __author__ = 'bugmen00t'
    description = 'Coda Story reports on major currents shaping our world from disinformation to authoritarian technologies to the war on science. Coda stays on these stories to reveal why they matter, how they are connected and where they are heading next.'  # noqa
    publisher = 'Natalia Antelava & Ilan Greenberg'
    category = 'blog'
    cover_url = u'https://www.codastory.com/wp-content/uploads/2021/05/AT_thumbnail_512x512.png'
    language = 'en_RU'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 180
    max_articles_per_feed = 50

    remove_tags_before = dict(name='div', attrs={'class': 'article'})

    remove_tags_after = dict(name='div', attrs={'class': 'article'})

    remove_tags = [
        dict(name='li', attrs={'class': 'material-meta__type'}),
        dict(name='div', attrs={'class': 'more'})
    ]

    feeds = [('CODA', 'https://www.codastory.com/feed/')]
PK�X"��L��coda_ru.png�PNG


IHDR  �s��IDATH��ԽkSa�_���R+X��Q�@Q�4vT�A�����c'A�E'�\܄.q�k��mR�������*6MsL���I���9˽�������귦��#�n�
�(aٜ����������qޖz�k����K�3a_�O�X\���	�[d�DEx�k�"��^{o���Y���T+�i�Û�;b�6]Nx`Y ��{��p��!<oTG$�#m�u�VϿ�ې`JwYt��H"-�[H0R��+�5���WCАU"�)_|j���*a���"N�]Q�T�"&�ɘ2*Y�ƱX{�1���cZA P��۰�� �ө�6�Y(���Ajr��MqI�[���7㱗���](Up����'���M�e����@�{��]-5���������)6���*�r_�[���`�� ig��VZ�N�B�m_�DuP���>xޘ�6������~�eIEND�B`�PK�X\�Ucoda_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Coda(BasicNewsRecipe):
    title                 = 'Coda \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u043E\u043C'
    __author__            = 'bugmen00t'
    description           = 'Coda - \u043C\u0435\u0434\u0438\u0430, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0432\u044B\u044F\u0432\u043B\u044F\u0435\u0442 \u0441\u0432\u044F\u0437\u0438 \u043C\u0435\u0436\u0434\u0443 \u0441\u043E\u0431\u044B\u0442\u0438\u044F\u043C\u0438 \u0438 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0435\u0442 \u0441\u043B\u0435\u0434\u0438\u0442\u044C \u0437\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u044F\u043C\u0438 \u0434\u0430\u0436\u0435 \u043F\u043E\u0441\u043B\u0435 \u0442\u043E\u0433\u043E, \u043A\u0430\u043A \u043E\u043D\u0438 \u043E\u043D\u0438 \u043F\u0440\u043E\u043F\u0430\u043B\u0438 \u0438\u0437 \u043F\u043E\u0432\u0435\u0441\u0442\u043A\u0438. Coda \u043F\u043E\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044F \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0441\u0430\u043C\u0438 \u043A\u0440\u0438\u0437\u0438\u0441\u044B, \u043D\u043E \u0438 \u0432 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0438\u0445 \u043E\u043A\u0440\u0443\u0436\u0430\u0435\u0442'  # noqa
    publisher             = 'Natalia Antelava & Ilan Greenberg'
    category              = 'blog'
    cover_url = u'https://www.codastory.com/wp-content/uploads/2021/05/AT_thumbnail_512x512.png'
    language              = 'ru'
    no_stylesheets        = False
    remove_javascript = False
    auto_cleanup   = False
    oldest_article = 180
    max_articles_per_feed = 50

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='div', attrs={'class': 'article'})

    remove_tags =   [
        dict(name='li', attrs={'class': 'material-meta__type'}),
        dict(name='div', attrs={'class': 'more'})
        ]

    feeds = [
        ('CODA', 'https://www.codastory.com/ru/feed/')
    ]
PK�X	glGGcoding_horror.png�PNG


IHDR:���IDATx�b��Yt�P���	�J��"�4��}�w���#�L�L|�\Q������4]~��1122��Y�6�013���X*?1��l�Ȫ�ͬ��˦���$fF����|�_��(�y��*dm��HG.���E��́��OB���
����Uc������i̕�߲���	?���51���ݰ���P����nh����ؘ�����-���4+�Լ3���e`)���"��>`{�5�5g>ݮIEND�B`�PK�X�(-��coding_horror.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.codinghorror.com/blog/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class CodingHorror(BasicNewsRecipe):
    title = 'Coding Horror'
    __author__ = 'Darko Miletic'
    description = 'programming and human factors - Jeff Atwood'
    category = 'blog, programming'
    publisher = 'Jeff Atwood'
    language = 'en'
    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = True
    encoding = 'utf8'
    auto_cleanup = True

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'authors': publisher
    }

    remove_tags = [
        dict(name=['object', 'link']), dict(
            name='div', attrs={'class': 'feedflare'})
    ]

    feeds = [(u'Articles', u'http://feeds2.feedburner.com/codinghorror')]
PK�X�S�V��	colta.png�PNG


IHDR(-SPLTE����!!�!!�!!^���!!0-��tRNSo���EIDATx�uεQB�/�oxw';7�q���/���,7Gc�ݦ��VH��a����0i�.#L��:�p��8��G�IEND�B`�PK�X4��fppcolta.recipe# vim:fileencoding=UTF-8
from __future__ import unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


class Colta(BasicNewsRecipe):
    language = 'ru'
    __author__ = 'bug_me_not'
    title = u'Colta.ru'
    description = 'Всё о культуре и духе времени'
    publisher = 'OpenSpace.ru'
    category = 'news'
    cover_url = u'http://www.colta.ru/assets/logo-afb684c3d35fc1f6f103f9fb638c8ec1.png'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = True

    oldest_article = 21
    max_articles_per_feed = 200

    feeds = [(u'Colta.ru', u'http://www.colta.ru/feed')]

    remove_tags_before = dict(name='section', attrs={'id': 'content'})
    remove_tags_after = dict(name='div', attrs={'class': 'content'})
    remove_tags = [
        dict(name='div', attrs={'id': 'right'}),
        dict(name='div', attrs={'class': 'soc_block'}),
        dict(name='a', attrs={'class': 'help_site like_material'}),
        dict(name='div', attrs={'class': 'share'}),
        dict(name='div', attrs={'class': 'comments_head'}),
        dict(name='div', attrs={'id': 'disqus_thread'})
    ]
PK�X��s��columbusdispatch.png�PNG


IHDR(-SPPLTECd�C��r����ر�p��b��W��<��Sp�x�m�]�Y�d�Z�r� w��������}�t����Y���4��'��&��"�� ������w��o�l�b�j��Z�g�������%��"}�{�6������;������r�p�����C��>��o��]��v�n��k�nމ��i�fЍ��5S�6��U�[�a�c�
h�
j�0��.��-��^�M�G�C�>�9�4�@�E�9�
F�J�|���({�(|�$�롯�Ec�,��$I��������|���������/�dptRNS@��f�IDATx�=����A����Lmn͵m۶��Gu�Ź�p�����VҲ�RH/%(dg�5cp�2w|��R>��v��Y/I|n�W����.g�R�X��+x���܏8�_m��PF�_�(�v�}/�W�?�0�G=t߀GO�Z���eר��"c�Nƅ���L&6�r٭qg>��<��GBݬ�|��>���ҕ�[s���y`nd۴N/�H��-v= L�)�IEND�B`�PK�X��''columbusdispatch.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class ColumbusDispatchRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en'
    version = 1

    title = u'The Columbus Dispatch'
    publisher = u'The Columbus Dispatch'
    category = u'News, Newspaper'
    description = u'Daily newspaper from central Ohio'

    use_embedded_content = False
    remove_empty_feeds = True
    oldest_article = 1.2
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True
    # Feeds from http://www.dispatch.com/live/content/rss/index.html
    feeds = [
        ('Local',
         'http://www.dispatch.com/content/syndication/news_local-state.xml'),
        ('National',
         'http://www.dispatch.com/content/syndication/news_national.xml'),
        ('Business',
         'http://www.dispatch.com/content/syndication/news_business.xml'),
        ('Editorials',
         'http://www.dispatch.com/content/syndication/opinion_editorials.xml'),
        ('Columnists',
         'http://www.dispatch.com/content/syndication/opinion_columns.xml'),
        ('Life and Arts',
         'http://www.dispatch.com/content/syndication/lae_life-and-arts.xml'),
        ('OSU Sports',
         'http://www.dispatch.com/content/syndication/sports_osu.xml'),
        ('Auto Racing',
         'http://www.dispatch.com/content/syndication/sports_auto-racing.xml'),
        ('Outdoors',
         'http://www.dispatch.com/content/syndication/sports_outdoors.xml'),
        ('Bengals',
         'http://www.dispatch.com/content/syndication/sports_bengals.xml'),
        ('Indians',
         'http://www.dispatch.com/content/syndication/sports_indians.xml'),
        ('Clippers',
         'http://www.dispatch.com/content/syndication/sports_clippers.xml'),
        ('Crew',
         'http://www.dispatch.com/content/syndication/sports_crew.xml'),
        ('Reds',
         'http://www.dispatch.com/content/syndication/sports_reds.xml'),
        ('Blue Jackets',
         'http://www.dispatch.com/content/syndication/sports_bluejackets.xml'),
    ]
PK�XL���..common_dreams.png�PNG


IHDR  szz��IDATx�ŗ�gǯ�:kŪ��V�+*��2cEvET�Q�TET��YU+b�*"����E���s���9'�8D�UUU��*N�q8��Z_;y��3�'?o�}c�����޷`�y+�57]X���� �K~&W����o�
����7R@��	v�-��'��'X������R��,�@'�
}D���m�@�"3r��]��!���$����(A[��0rL��#G�vV� �^�S8��	I��y[����	T!-������o�.���n�U8�s��J�%���ח�8,ԟd}��
���`� �|ӭ��@Ļ�+�T[�g�3��Ԍ��+dz���ê<�@�%�ilB	��,@A��)����1#I-�+0L��k��r�
%`H����+מI�������z�)@D�C.��@�X|)�V���NIр��L��z���\�yU���,n�ř�O�W���`��s0!�
�XD�,�6��G�YP_�@��wr߅��M���O�bH����_����n���~�=�J.(�#pdqI���gD�h&��U�U���,�"��X��Q��M���u��uk?��3��)�o �#��	��?�����zȦT����28qS �#I�N�Y0��te6Cz�j��
�_�"l��,Z3p�`Y�*C�S�~P��K=K�-0s�8B@�?���� ��	�d�p,�a�b��(��4!���d��G�Wl[=�۳x�5��^ٌd�����I5�B�!k�
C�j���;�gE[mǁ!]	ރ�ݐ\�	B�a�w���)���jH|Ր���>�c��4�����`�ߒ�>����%�CH���l�_D����r!M)\��	�p��"�6-�uxl=ٖ���q�r�=/"�K�.��C��Q�}��r��?��Ğ
�B�JY�n�q�
6�Ѭ�X�^��Y���(ѪN>��X��pۄ�>�������%j@c}zq�IEND�B`�PK�X���common_dreams.recipe#!/usr/bin/env python
##
# Title:        Common Dreams
##
# License:      GNU General Public License v3 -
# http://www.gnu.org/copyleft/gpl.html

# Feb 2012: Cleaned up the output to have only the main article

__license__ = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'
'''
commondreams.org
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class CommonDreams(BasicNewsRecipe):
    # Identify the recipe

    title = u'Common Dreams'
    description = u'Breaking News & Views for the Progressive Community.'
    cover_url = 'https://s3.amazonaws.com/s3.commondreams.org/images/common-dreams.png'
    __author__ = u'XanthanGum'
    language = 'en'

    oldest_article = 7
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True

    # Specify extra CSS - overrides ALL other CSS (IE. Added last).
    extra_css = 'body { font-family: verdana, helvetica, sans-serif; } \
                 .introduction, .first { font-weight: bold; } \
                 .cross-head { font-weight: bold; font-size: 125%; } \
                 .cap, .caption { display: block; font-size: 80%; font-style: italic; } \
                 .cap, .caption, .caption img, .caption span { display: block; margin: 5px auto; } \
                 .byl, .byd, .byline img, .byline-name, .byline-title, .author-name, .author-position, \
                    .correspondent-portrait img, .byline-lead-in, .name, .bbc-role { display: block; \
                    font-size: 80%; font-style: italic; margin: 1px auto; } \
                 .story-date, .published { font-size: 80%; } \
                 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 { font-size: 175%; font-weight: bold; } \
                 h2 { font-size: 150%; font-weight: bold; } \
                 h3 { font-size: 125%; font-weight: bold; } \
                 h4, h5, h6 { font-size: 100%; font-weight: bold; }'

    # Remove the line breaks and float left/right and picture width/height.
    preprocess_regexps = [(re.compile(r'<br[ ]*/>', re.IGNORECASE), lambda m: ''),
                          (re.compile(
                              r'<br[ ]*clear.*/>', re.IGNORECASE), lambda m: ''),
                          (re.compile(r'float:.*?'), lambda m: ''),
                          (re.compile(r'width:.*?px'), lambda m: ''),
                          (re.compile(r'height:.*?px'), lambda m: ''),
                          (re.compile(r'<a.*?>'), lambda m: ''),
                          (re.compile(r'</a>'), lambda m: ''),
                          ]

    # Main article is inside this tag
    keep_only_tags = [dict(name='h1', attrs={'class': 'node__title managed-node-title'}),
                      dict(name='div', attrs={'class': ['field field--name-field-article-img field--type-image field--label-hidden',
                                                        'field field--name-body field--type-text-with-summary field--label-hidden']}),
                      ]

    # Identify the news feeds

    feeds = [(u'Headlines', u'https://www.commondreams.org/feed/headlines_rss'),
             (u'Further News Articles',
              u'https://www.commondreams.org/feed/further_rss'),
             (u'Views', u'https://www.commondreams.org/feed/views_rss'),
             (u'Progressive Newswire', u'https://www.commondreams.org/feed/newswire_rss')]
PK�XI]Zwwcomputerworld_dk.png�PNG


IHDR(-SJPLTE&Kw)Lv*Kv*Kx���*Mw+Jv������*Jy������)Kx+Ly,Kw+Kz+Lw)Jw*Ly,Ky6W�8X�Uo�������������*Kt+I{*Iu+Jx+Jy*Lz-Ix-Jv6V*Mu)Lt9V�Ec�Fd�Gd�Jb�Sp�Tq�(KuVp�Wo�bz�d{�d{�q��q��r��s��~��~��~���������������������(Mw��������ɪ�ʫ�ʷ�ѷ�Ҹ�Թ�Ѻ��������������������������������)Ix)Ju���������������+Kt�����'Lv+Lu������'Lx���*Lr���,Hw)Ky>A<�IDATx^
�3�DQ�����\۶m��ӝ����U�PU�9��N�x@L�#B���\�
�wȵOVuvՈ��p�hN�r�8c�`^�Ne���5w-k�8~���[����s���S63&�{b��A,9*g�)/�C�G�������
yL�Lm]��Mk������Vb�{�\�~��=|��{�����L�t�)!sP�P�ďĚ	���͎�ȩv�%9��w��aIEND�B`�PK�XD�JJcomputerworld_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Computerworld.dk
'''


class WwwComputerworld_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Computerworld.dk'
    description = ('Nyheder, analyser, viden, blogs og debat om it. Computerworld er dit medie om det digitale Danmark.'
                   ' Computerworld skriver om nye teknologier, hardware, software, informationssamfundet, internettet,'
                   ' it-branchen, telebranchen, it-ledelse, it-strategi, forretnings-it , it-job og meget mere.')
    category = 'technology, news, business, linux, opensource, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Computerworld', 'http://www.computerworld.dk/rss/artikler'),
        ('Teknologi', 'http://www.computerworld.dk//rss/tag/teknologi'),
        ('Samfund', 'http://www.computerworld.dk//rss/tag/samfund'),
        ('Erhverv', 'http://www.computerworld.dk//rss/tag/erhverv'),
        ('Branchen', 'http://www.computerworld.dk/rss/tag/branchen'),
        ('Distributører', 'http://www.computerworld.dk/rss/tag/distributoerer'),
        ('Forhandlere', 'http://www.computerworld.dk/rss/tag/forhandlere'),
        ('It-markedet', 'http://www.computerworld.dk/rss/tag/it-markedet'),
        ('Biometri', 'http://www.computerworld.dk/rss/tag/biometri'),
        ('Datakriminalitet', 'http://www.computerworld.dk/rss/tag/datakriminalitet'),
        ('Digital sikkerhed', 'http://www.computerworld.dk/rss/tag/digital_sikkerhed'),
        ('Hackere', 'http://www.computerworld.dk/rss/tag/hackere'),
        ('Phishing', 'http://www.computerworld.dk/rss/tag/phishing'),
        ('Sikkerhedshuller', 'http://www.computerworld.dk/rss/tag/sikkerhedshuller'),
        ('Spyware', 'http://www.computerworld.dk/rss/tag/spyware'),
        ('Virus og orme', 'http://www.computerworld.dk/rss/tag/virus_og_orme'),
        ('Open source', 'http://www.computerworld.dk/rss/tag/open_source'),
        ('Standarder', 'http://www.computerworld.dk/rss/tag/standarder'),
        ('Linux', 'http://www.computerworld.dk/rss/tag/linux'),
        ('Computerworld - Blogs', 'http://www.computerworld.dk/rss/blog'),
        ('Computerworld - Apple-bloggen', 'http://www.computerworld.dk/rss/blog/apple-bloggen'),
        ('Computerworld - Bagsiden', 'http://www.computerworld.dk/rss/blog/bagsiden'),
        ('Computerworld - It-sikkerhed', 'http://www.computerworld.dk/rss/blog/itsikkerhed'),
        ('Linux', 'http://www.computerworld.dk/rss/tag/linux'),
        ('Computerworld Events', 'http://job.computerworldevents.dk/rss'),
        ('IDG Kurser', 'http://job.idgkurser.dk/rss/'),

    ]

PK�XlZ����computerworld_pl.png�PNG


IHDR(-S3PLTE�#1�1>�?K�LX�Ze�hr�v�䑘知뭲�����������mIDATx��A� ��p��Jy�f�]#[ɛ�
.�����ˀ�~�q
�sh3(fjw&�{�&GjWpqL��V@+�5R9���M(��(�Juq9�����_ݼ��y#IEND�B`�PK�XE!���computerworld_pl.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
import re
from calibre.web.feeds.news import BasicNewsRecipe


class Computerworld_pl(BasicNewsRecipe):
    title = u'Computerworld.pl'
    __author__ = 'fenuks'
    description = u'Serwis o IT w przemyśle, finansach, handlu, administracji oraz rynku IT i telekomunikacyjnym - wiadomości, opinie, analizy, porady prawne'
    category = 'IT'
    language = 'pl'
    masthead_url = 'http://g1.computerworld.pl/cw/beta_gfx/cw2.gif'
    cover_url = 'http://g1.computerworld.pl/cw/beta_gfx/cw2.gif'
    no_stylesheets = True
    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False
    preprocess_regexps = [(re.compile(u'Zobacz również:', re.IGNORECASE), lambda m: ''),
                          (re.compile(u'[*]+reklama[*]+', re.IGNORECASE), lambda m: ''), ]
    keep_only_tags = [dict(name='article')]
    remove_tags = [dict(attrs={'class': ['share_tools nocontent', 'rec']}),
         dict(name='ul',attrs={'class':'tags'}),
         dict(name='ol'),
         dict(id=['topComment', 'bottom_tools'])]

    feeds = [(u'Wiadomo\u015bci', u'https://www.computerworld.pl/news?rss')]
PK�X4>�Ը�consortium_news.png�PNG


IHDR  D���{PLTE�wvs334+,0��蔔����IHE�����ߵ��QPP�}yffe;<=mmn���!)#!!_^\""%,�������[WQ���tkaQ��
���r�A9kJB�������a?:�4+D����IDATx�b��"E;a�&uoq�n��w��`�T�-�3��O�c�.+�D�{���R(EZ�J��@�ʏZJ���)�Qb˲V2e�sSf=&�[��Q7�Ũ��k%&��Jf��2:����Ȣ���2'��֒�1*Ú�R3}aD�19���&5a۶!�&4h�.r�t��U�UU�a�7FS
,:�T��nA���O��F��+zP@'=�@�
�;���(����/�]ᖗ6U^�RG0��!��o��[,���Mi���v�a�(O�8�O�iUT�����(����C��L�g���u�y
y�՜u]b=Tﺚ�L|����/�D�BΨ�S�iVU��T���vs�Ϻ��K��z=7j�g��UW=�w�;]�va��
�.�6��dp���Wὲ
�7�}�	��	ؿ�|>�H���z?pߠ�y���;�q>^���8�a��r�kb؝�˟�0p|ϰ
��W�)�>~g0�oIEND�B`�PK�XֹE�

consortium_news.recipe#!/usr/bin/env python
##
# Title:        Consortium News
##
# License:      GNU General Public License v3 -
# http://www.gnu.org/copyleft/gpl.html

# Feb 2012: Initial release
__license__ = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'
'''
consortiumnews.com
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe


class ConsortiumNews(BasicNewsRecipe):

    title = u'Consortium News'
    publisher = 'Copyright © 2012 Consortiumnews. All Rights Reserved.'
    language = 'en'
    __author__ = 'kiavash'

    oldest_article = 7
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True

    # Flattens all the tables to make it compatible with Nook
    conversion_options = {'linearize_tables': True}

    remove_attributes = ['border', 'cellspacing', 'align', 'cellpadding', 'colspan',
                         'valign', 'vspace', 'hspace', 'alt', 'width', 'height']

    # Specify extra CSS - overrides ALL other CSS (IE. Added last).
    extra_css = 'body { font-family: verdana, helvetica, sans-serif; } \
                 .introduction, .first { font-weight: bold; } \
                 .cross-head { font-weight: bold; font-size: 125%; } \
                 .cap, .caption { display: block; font-size: 80%; font-style: italic; } \
                 .cap, .caption, .caption img, .caption span { display: block; margin: 5px auto; } \
                 .byl, .byd, .byline img, .byline-name, .byline-title, .author-name, .author-position, \
                    .correspondent-portrait img, .byline-lead-in, .name, .bbc-role { display: block; \
                    font-size: 80%; font-style: italic; margin: 1px auto; } \
                 .story-date, .published { font-size: 80%; } \
                 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 { font-size: 175%; font-weight: bold; } \
                 h2 { font-size: 150%; font-weight: bold; } \
                 h3 { font-size: 125%; font-weight: bold; } \
                 h4, h5, h6 { font-size: 100%; font-weight: bold; }'

    # Remove the line breaks and float left/right and picture width/height.
    preprocess_regexps = [(re.compile(r'<br[ ]*/>', re.IGNORECASE), lambda m: ''),
                          (re.compile(r'<br[ ]*clear.*/>',
                                      re.IGNORECASE), lambda m: ''),
                          (re.compile(r'float:.*?'), lambda m: ''),
                          (re.compile(r'width:.*?px'), lambda m: ''),
                          (re.compile(r'height:.*?px'), lambda m: ''),
                          (re.compile(r'<a.*?>'), lambda h1: ''),
                          (re.compile(r'</a>'), lambda h2: ''),
                          ]

    # Main article is inside this tag
    keep_only_tags = [
        dict(name='div', attrs={'id': lambda x: x and 'post-' in x})]

    remove_tags = [
        # remove 'Share this Article'
        dict(name='div', attrs={'class': 'sociable'}),
        dict(name='p', attrs={'class': 'tags'}),    # remove 'Tags: ... '
    ]

    feeds = [(u'Consortium News', u'http://feeds.feedburner.com/Consortiumnewscom')]
PK�XI�Z���"contemporary_argentine_writers.png�PNG


IHDR  D���0PLTE��������������1��T��y����������������AtRNSG�����ORIDATx�l�!W������:�|����n����h?yӹ���TD�TJ���du�ZJm�����o��d��H���Y�MI���Er�S�<q��%�s�8�|��#�=���;�[��y�sX��E	�gb�o�“_���Ǹ�������aϒ��L����ø�F]���RD�����@�y�*�V@�S�3/��h�ьq!��#v����%F�d�	y0ZƂQ"�HT,5��B�Dm����
R0��0���~i�ٲ��,��}��
-`�j�F��_̆Y-���E��r�M+���}��s<3����=��z�3/�����߰�(IEND�B`�PK�X���؀�%contemporary_argentine_writers.recipe__license__ = 'GPL v3'
__copyright__ = '2013, Darko Miletic <darko.miletic at gmail.com>'
'''
contemporaryargentinewriters.wordpress.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class contemporaryargentinewriters(BasicNewsRecipe):
    title = 'Contemporary Argentine Writers'
    __author__ = 'Darko Miletic'
    description = 'Short stories by Argentine writers (and others) translated into English'
    publisher = 'Dario Bard'
    category = 'fiction, literature, Argentina, english'
    oldest_article = 25
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = True
    language = 'en_AR'
    remove_empty_feeds = True
    publication_type = 'blog'
    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'Posts', u'http://contemporaryargentinewriters.wordpress.com/feed/')]
PK�X���Dcontropiano.png�PNG


IHDR  szz��IDATx����������s�潱m۶�Bl۶m۶m۶1�Y�Ѩ�S���m�?T�Iy�ߕm�Ei-AWQ�'S�U��|�=��gI\Je��<HG16��q#uE>��R��pE[�8�#R��16�4�1
�(2V�k��I�x�	�\�U����w��^>�&D1'_��q�'q�O�!�Δ�µ��)�B5�T2>��߰&���"�e��s�������e�lD��,U=W��(.$���NR>�n��]}l��q0�2>9�3�����[gJ:���T�Y�Im���_��W��3Q,O��ξ&aY��r^���iɪx5"�1=s�Abk5t�3�=H@�< ���9ٔ�y��踬ψ�Y�*:˲�'�I2�O9Ŋ$ ��+�x�Ѓ5V��5ڵ!zNh�tikt����"bK�2#���P,^̀
��XS��g��0�Y-�E%���a9K3 ��\�b!�*(�W���8���B�	(�y�r�$A�$��$�&��|���b,Mk3�H���q���k��B�����0�;��i�e-6a���,I5���������)'�&�R#�����-Nf+6d{.bbF���I�ؘ�)#c:��F��y�x�aDc����|D�f"Lj2rd���u��T�CH��+7�S�H=��n<O��Lď�At�=��#=��
]�H�������j@�E|��m#����)��IEND�B`�PK�XO2
�sscontropiano.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe(BasicNewsRecipe):
    title = u'Contropiano'
    oldest_article = 7
    max_articles_per_feed = 25
    language = 'it'
    __author__ = 'michele'

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True

    keep_only_tags = [
        dict(name='div', attrs={'class': ['category-archive single']}),
        dict(name='div', attrs={'class': ['content-post']})
    ]

    remove_tags = [
        dict(name='span', attrs={'id': ['postviews']}),
        dict(name='div', attrs={'class': ['social-share']}),
        dict(name='p', attrs={'class': ['firma-redazione']})
    ]

    remove_tags_after = dict(name='p', attrs={'class': ['firma-redazione']})

    feeds = [
        (u'Politica',
         u'http://contropiano.org/news/politica-news/feed'),
        (u'Internazionale',
         u'http://contropiano.org/news/internazionale-news/feed'),
        (u'Aggiornamenti in breve',  u'http://contropiano.org/news/aggiornamenti-in-breve/feed'),
        (u'Economia',
         u'http://contropiano.org/news/news-economia/feed'),
        (u'Ambiente',
         u'http://contropiano.org/news/ambiente-news/feed'),
        (u'Scienza',
            u'http://contropiano.org/news/scienza-news/feed'),
        (u'Cultura',
         u'http://contropiano.org/news/cultura-news/feed'),
        (u'Locali', u'http://contropiano.org/regionali/feed'),
        (u'Lavoro', u'http://contropiano.org/news/lavoro-conflitto-news/feed'),
        (u'Malapolizia',  u'http://contropiano.org/news/malapolizia-news/feed'),
        (u'Interventi', u'http://contropiano.org/interventi/feed'),
        (u'Documenti', u'http://contropiano.org/documenti/feed'),
        (u'Vignette', u'http://contropiano.org/vignette/feed'),
        (u'Altro',
            u'http://contropiano.org/altro/feed')
    ]
PK�Xp��7corriere_della_sera_en.png�PNG


IHDR(-SiPLTE����������JMJRQR���cac101���989������sqs������),)�����������������ﵲ����{}{141! !kmkJQRe|hIDATm�W�0�]:��~�Cb���I=�XE���A�=��/>d�hkP1�%Q�6���`
e�
٩%#���C۞�r��(W��Ԛ�n� 1��i��7���?�*IEND�B`�PK�Xp���jjcorriere_della_sera_en.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini, based on Darko Miletic'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.02'
__date__ = '14, March 2010'
__description__ = 'Italian daily newspaper (english version)'
# NOTE: the feeds url are broken on the main site as the permalink structure has been changed erroneously ie:
# actual link in feed   http://www.corriere.it/english/10_marzo_11/legitimate_impediment_approved_de9ba480-2cfd-11df-a00c-00144f02aabe.shtml
# this needs to be change to
# real feed URL
# http://www.corriere.it/International/english/articoli/2010/03/11/legitimate_impediment_approved.shtml
'''
http://www.corriere.it/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ilCorriereEn(BasicNewsRecipe):
    author = 'Lorenzo Vigentini, based on Darko Miletic'
    description = 'Italian daily newspaper (english version)'

    cover_url = 'http://images.corriereobjects.it/images/static/common/logo_home.gif?v=200709121520'
    title = u'Il Corriere della sera (english) '
    publisher = 'RCS Digital'
    category = 'News, politics, culture, economy, general interest'

    language = 'en'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 5
    max_articles_per_feed = 100
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True

    def get_article_url(self, article):
        articleUrl = article.get('link')
        segments = articleUrl.split('/')
        basename = '/'.join(segments[:3]) + '/' + \
            'International/english/articoli/'

    # the date has to be redone with the url structure
        mlist1 = ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno',
                  'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre']
        mlist2 = ['01', '02', '03', '04', '05',
                  '06', '07', '08', '09', '10', '11', '12']
        myDate = segments[4].split('_')
        x = 0
        for x in range(11):
            if myDate[1] == mlist1[x]:
                noMonth = mlist2[x]
                break

        newDateUrl = '20' + myDate[0] + '/' + noMonth + '/' + myDate[2] + '/'

    # clean the article title
        articleURLseg = segments[5].split('-')
        myArticle = (articleURLseg[0])[:-9] + '.shtml'

        myURL = basename + newDateUrl + myArticle
        # print myURL
        return myURL

    keep_only_tags = [
        dict(name='div', attrs={'class': ['news-dettaglio article', 'article']})]

    remove_tags = [
        dict(name=['base', 'object', 'link', 'embed']),
        dict(name='div', attrs={'class': 'news-goback'}),
        dict(name='ul', attrs={'class': 'toolbar'})
    ]

    remove_tags_after = dict(name='p', attrs={'class': 'footnotes'})

    feeds = [
        (u'News', u'http://www.corriere.it/rss/english.xml')
    ]
PK�Xp��7corriere_della_sera_it.png�PNG


IHDR(-SiPLTE����������JMJRQR���cac101���989������sqs������),)�����������������ﵲ����{}{141! !kmkJQRe|hIDATm�W�0�]:��~�Cb���I=�XE���A�=��/>d�hkP1�%Q�6���`
e�
٩%#���C۞�r��(W��Ԛ�n� 1��i��7���?�*IEND�B`�PK�X*�0�corriere_della_sera_it.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe

__author__ = 'Ruben Scopacasa'
__license__ = 'GPL v3'
__copyright__ = '2019, Ruben Scopacasa <ruben.scopacasa at gmail.com>'
__version__ = 'v1.00'
__date__ = '22, April 2019'


class CorriereDellaSeraRecipe(BasicNewsRecipe):
    title = u'Il Corriere della sera'
    publisher = 'RCS Digital'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 3
    max_articles_per_feed = 100
    simultaneous_downloads = 5

    no_stylesheets = True
    remove_tags_before = dict(name='h1')
    remove_tags = [dict(id='gallery')]
    ignore_duplicate_articles = {'title', 'url'}

    feeds = [
        ('Homepage', 'http://xml2.corriereobjects.it/rss/homepage.xml'),
        ('Editoriali', 'http://xml2.corriereobjects.it/rss/editoriali.xml'),
        ('Cronache', 'http://xml2.corriereobjects.it/rss/cronache.xml'),
        ('Politica', 'http://xml2.corriereobjects.it/rss/politica.xml'),
        ('Esteri', 'http://xml2.corriereobjects.it/rss/esteri.xml'),
        ('Economia', 'http://xml2.corriereobjects.it/rss/economia.xml'),
        ('Cultura', 'http://xml2.corriereobjects.it/rss/cultura.xml'),
    ]

    def print_version(self, url):
        return url.replace('.shtml', '_print.html')

    def get_cover_url(self):
        return 'http://www.corriere.it/rss/images/logo_small.gif'
PK�X��k��corriere_dello_sport.png�PNG


IHDR(-SKPLTE�*�����Q_�����}���5E�&7�R_�oz�ny��4D���������������CQ�`l����`m����f�,kIDATxڝ��a1�$����
W)_�A'�dz#���L|��j�m��[�
����ߑ:Y��9��:�'�ڱ�$RyI��1�78A}_��������1FgcJ\>�Z�ʪIEND�B`�PK�X~dfddcorriere_dello_sport.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'GabrieleMarini, based on Darko Miletic'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>, Gabriele Marini'
__version__ = '  '
__date__ = '14-06-2010'
__description__ = 'Italian daily newspaper'

'''
http://www.corrieredellosport.it/
'''
from calibre.web.feeds.news import BasicNewsRecipe


class ilCorrieredelloSport(BasicNewsRecipe):
    __author__ = 'Gabriele Marini'
    description = 'Italian daily newspaper'

    cover_url = 'http://edicola.corrieredellosport.it/newsmem/corsport/prima/nazionale_prima.jpg'

    title = u'Il Corriere dello Sport'
    publisher = 'CORRIERE DELLO SPORT s.r.l. '
    category = 'Sport'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 10
    max_articles_per_feed = 100
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher, '--ignore-tables'
    ]

    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + \
        description + '"\ntags="' + category + '"\nlinearize_tables=True'

    keep_only_tags = [
        dict(name='h1', attrs={'class': ['tit_Article']}),
        dict(name='h1', attrs={'class': ['tit_Article_mondiali']}),
        dict(name='div', attrs={'class': ['box_Img']}),
        dict(name='p', attrs={'class': ['summary', 'text']})]

    feeds = [
        (u'Primo Piano',  u'http://www.corrieredellosport.it/rss/primo_piano.xml'),
        (u'Calcio',  u'http://www.corrieredellosport.it/rss/Calcio-3.xml'),
        (u'Formula 1',    u'http://www.corrieredellosport.it/rss/Formula-1-7.xml'),
        (u'Moto',         u'http://www.corrieredellosport.it/rss/Moto-8.xml'),
        (u'Piu visti',    u'http://www.corrieredellosport.it/rss/piu_visti.xml')
    ]
PK�XJ�H���cosmopolitan.png�PNG


IHDR(-S PLTE�	����CJ�SY�\b��ޥ�૮�����������������������	ߨ��Z_��]c�_d�af�ag�ch�ej�lq�mr�mr�pu�qv�rw�sx�uz�w|�#т�҅�ԉ�Վ�֏�ؔ�ؖ�ٖ�ٗ��"�#+⯲㲵㴶漾罿��������������������ְ&.�-4��ߴ29�����������3:����7>�������
�MT�NT�
ݣ��������ܠ��!)ަ�ٗ�۞���ط9@�?F�����x}�{��ݡ������IDATxڝG�����z�_��m���z���`��M@���1�� �`	�$6^��Oi�~�Y��DI�&�.b�r_rzI��5>"�}��*��@���0�@Wg�{N��&��MD����qA�S)+�
���9�pk�4'��d1|a����"�A&���IEND�B`�PK�XG�
o

cosmopolitan.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = '2010, Gustavo Azambuja <hola at gazambuja.com>'
'''
Muy Interesante
'''

from calibre.web.feeds.news import BasicNewsRecipe


class General(BasicNewsRecipe):
    title = 'Cosmopolitan'
    __author__ = 'Gustavo Azambuja'
    description = 'Revista Cosmopolitan, Edicion Espanola'
    language = 'es'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 1
    encoding = 'utf8'
    remove_javascript = True
    no_stylesheets = True
    conversion_options = {'linearize_tables': True}

    oldest_article = 180
    max_articles_per_feed = 100
    keep_only_tags = [
        dict(id=['contenido']),
        dict(name='td', attrs={'class': ['contentheading', 'txt_articulo']})
    ]
    remove_tags = [
        dict(name='div', attrs={'class': ['breadcrumb', 'bloque1', 'article', 'bajo_title',
                                          'tags_articles', 'otrosenlaces_title', 'otrosenlaces_parent', 'compartir']}),
        dict(name='div', attrs={'id': 'comment'}),
        dict(name='table', attrs={'class': 'pagenav'}),
        dict(name=['object', 'link'])
    ]
    remove_attributes = ['width', 'height', 'style', 'font', 'color']

    extra_css = '''
                h1{font-family:Geneva, Arial, Helvetica, sans-serif;color:#154B7A;}
                h3{font-size: 14px;color:#999999; font-family:Geneva, Arial, Helvetica, sans-serif;font-weight: bold;}
                h2{color:#666666; font-family:Geneva, Arial, Helvetica, sans-serif;font-size:small;}
                img {float:left; clear:both; margin:10px}
                p {font-family:Arial,Helvetica,sans-serif;}
                '''
    feeds = [
        (u'Articulos', u'http://feeds.feedburner.com/cosmohispano/FSSt')
    ]

    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 soup

    def get_cover_url(self):
        index = 'http://www.cosmohispano.com/revista'
        soup = self.index_to_soup(index)
        link_item = soup.find('img', attrs={'class': 'img_portada'})
        if link_item:
            cover_url = "http://www.cosmohispano.com" + link_item['src']
        return cover_url
PK�X3�m���cosmopolitan_de.png�PNG


IHDR  D����PLTE����������������������������������������~�����������r��w����y��|��}��r��s��s��v��J{�g��~��i��j��f��b��b��f��l��[��Hz�Y��\��\��d��K|�e��^��K|�]��^��P��_��a��W��Y��S��]��\��X��X��X��\��Y��T��X��S��Q��^��W��V��Q��R��U��R��V��R��S��L|�P�P��R��Q��U��R��N~�Q��V��P��P��S��N~�O�M}�N~�P��O�S��P��P�O�P��P��Hy�Hz�I{�L|�M}�N~�P��L|�L}�K|�L|�L}�M}�M~�N~�O�P��Hz�Iz�J|�L}�Hz�Hz�Gz�Gz�Hy�Hy�I{�Iz�J{�Gy�J|�K|���~tRNS
  (**,,00044<>@HLNPPPPPZbdfffrrtzz|~����������������������������������������������������������������l�TIDATx^}��vA�F�����]��'�%�T�s%��f�圞;��ŗ5�ݿ힮թCK�)���#*�̇�FS�U��MP�ɇY`a?��'��B�?�\��r0�SZ�ƗQ��ž�F����-
6��8��8J�������

f�w��f�Jkzyǯ_�pvQ���:���K�{�P�Հ�(�kE-xEA-x�����S�W�;?ǖ����bS.ښV�5�f�*s�;���EaYy'�d`#F�u�]
pq��*�q0�	��q)�FtO~X#n���
��Cawy_ y3#U�ꏆ: �Re�?�j�ȐT݂SO���ϯH��e���,�,IEND�B`�PK�X�'
�ppcosmopolitan_de.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1305567197(BasicNewsRecipe):
    title = u'Cosmopolitan.de'
    __author__ = 'schuster'
    oldest_article = 7
    language = 'de'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    cover_url = 'http://www.cosmopolitan.com/cm/shared/site_images/print_this/cosmopolitan_logo.gif'
    remove_tags_before = dict(name='h1', attrs={'class': 'artikel'})
    remove_tags_after = dict(name='div', attrs={'class': 'morePages'})
    extra_css = '''
                    h2{font-family:Arial,Helvetica,sans-serif; font-size: x-small;}
                    h1{ font-family:Arial,Helvetica,sans-serif;  font-size:x-large; font-weight:bold;}
                '''
    remove_tags = [dict(id='strong'),
                   dict(title='strong'),
                   dict(name='span'),
                   dict(name='li', attrs={'class': 'large'}),
                   dict(name='ul', attrs={
                        'class': 'articleImagesPortrait clearfix'}),
                   dict(name='p', attrs={'class': 'external'}),
                   dict(name='a', attrs={'target': '_blank'}), ]
    feeds = [(u'Komplett', u'http://www.cosmopolitan.de/rss/allgemein.xml'),
             (u'Mode', u'http://www.cosmopolitan.de/rss/mode.xml'),
             (u'Beauty', u'http://www.cosmopolitan.de/rss/beauty.xml'),
             (u'Liebe&Sex', u'http://www.cosmopolitan.de/rss/liebe.xml'),
             (u'Psychologie', u'http://www.cosmopolitan.de/rss/psychologie.xml'),
             (u'Job&Karriere', u'http://www.cosmopolitan.de/rss/job.xml'),
             (u'Lifestyle', u'http://www.cosmopolitan.de/rss/lifestyle.xml'),
             (u'Shopping', u'http://www.cosmopolitan.de/rss/shopping.xml'),
             (u'Bildergalerien', u'http://www.cosmopolitan.de/rss/bildgalerien.xml')]
PK�X������cosmopolitan_uk.png�PNG


IHDR  ��tRNSn���IDATxڝVl#;]Q�H�"E�gfH�������阙�������aN�^֋�9�m.��Ȳ,kw<o��x�L�C�Vi5��^��~���;֮�?w��(��8��靫W~���w�sWHF�Ѩ�j��":z���KU�d���%�Y�y��V���}��ʜ�˗č������(����޳e#�ȤM�:e�KrZ�sDŽ�����u�K'e�]�0y���=������O�}�X]A;,��Et;��r��wI�(���
������m��Xp�d�	�ֺ�>��K�ǿ��,���!�
��$�lRK=�~,U�M����^tM�f���b%C����!y��K1������%9����%�>?�_ҋ!�=H�3d�C,�#����#����@��~L��P����`�á��)��я��gH�sd�}ܗ/��p%�a�D=��^�dn�M8���pN�/��c�R��<��ΐ}�b�h�|d��v�!�����dY�#�$^��1/MB��q��U_�{��.��F��f�qx�P����
��[d�=0�p���(5֐W��Q�Ѩ�SGv�~/
��Z4c�R��箻,������]v����� ���t�oҏ��E0�0 �–��U�J�g]�#=@=���π)^�h@��������P���~~����.\�h'*����8�u��Fx
��cB�h�*,����ΐ���x
�#��N���`�s��:'S���(޺��
�BF�Sᰊ�i��Sb�e�
|��q�fF�
r�!&5)�UW�{��w�
IX�(�5���+f�lx�.�����_e~��6C�L9l�0ش,w���y�vL(�Z&�b�7��
�����ql�( "[n6Q�x�q��i̔��a�-]��w`1,�>9����AvvF��)]R�\��)�bl������C�ث�e�� #m"��aql�ԅU9�#k\uU��q��]:uק)8��0���|�d��}������εJ-R.3d*2Ӵ�`�ݸl1:�_��¡�D����_>v�v�m>a�|�i��z$�$�O�U�pѠ�m۹v����{с"��#��&Ct(�@#�猣�����l
y�7;P�/��@�7_oo5(Ie门���,&�ϑ�'�P4�[J�ـ���j�۸������jr2�0������G��(GK�j��j+��#�f��d�sh����(�4~��j�r��߽�>``g���KL;#�prz�.�i��T��އ +���J�7�'�����P!�^��(�#�+������6@E/����Sڙ��T��3P���aC�
5����3���C�A0@R�^�pr���,hw77$��D��#f����b�	*a���u`����H��3����)Z��(_��˓�b����O	�sO?}���
��x�4��!��@� �䶯��^'�z�ؑ^�zE����|�MU~6N�d!]���ҥSrA��T��!P[����?���t 8��Gᄈcú�4WmU�j����8���ڊ��]����{*Fz�c0�>�R�v�brҿ���p�ąS&�����S�u:]�p��'�+z#hZIEND�B`�PK�X�P��

cosmopolitan_uk.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1390635673(BasicNewsRecipe):
    title = u'Cosmopolitan UK'
    description = 'Womens Fashion, beauty and Gossip for women from COSMOPOLITAN -UK'
    language = 'en_GB'

    __author__ = 'Dave Asbury'
    # 2/2/14
    oldest_article = 28
    max_articles_per_feed = 10
    compress_news_images = True
    compress_news_images_max_size = 20
    auto_cleanup_keep = '//div[@class="articleHeading"]'
    auto_cleanup = True
    ignore_duplicate_articles = {'title', 'url'}
    no_stylesheets = True
    masthead_url = 'http://www.cosmopolitan.co.uk//cm/cosmopolitanuk/site_images/site_logo.gif'
    cover_url = 'http://www.natmagnewsletters.co.uk/CIRCULES/CosmoXXLCover.jpg'
    # kovids code

    def preprocess_raw_html(self, raw_html, url):
        for pat, f in [
            (re.compile(r':: [\w].+</title>',
                        re.DOTALL), lambda m: '</title>'),

        ]:
            raw_html = pat.sub(f, raw_html)
        return raw_html

    feeds = [
        (u'Love & Sex', u'http://www.cosmopolitan.co.uk/love-sex/rss/'),
        (u'Men', u'http://cosmopolitan.co.uk/men/rss/'),
        (u'Fashion', u'http://cosmopolitan.co.uk/fashion/rss/'),
        (u'Hair & Beauty', u'http://cosmopolitan.co.uk/beauty-hair/rss/'),
        (u'LifeStyle', u'http://cosmopolitan.co.uk/lifestyle/rss/'),
        (u'Cosmo On Campus', u'http://cosmopolitan.co.uk/campus/rss/'),
        (u'Celebrity Gossip', u'http://cosmopolitan.co.uk/celebrity-gossip/rss/')]
PK�X�։�
cosmos.png�PNG


IHDR  D����PLTE/v����6z�0w�1w�q��|����W��L����크���o��f��G��=������6{������@��P��`�����M��l����C���������}�՝�ߙ���������������3y�t���k��n��4y���T�Ǿ����x��1x���ا���������H��������g��E��?��R��~��Z��S�����������p����[�����A�����������D$�"�IDATx���C�Q��Y6ڶm������Ǽ��!ԆR#�X>Y(eLLQ#��<����A��I�֠����E%[0C���l+	H׶��c�-7�' ������,�Y�%�
��<v��Pnw�r�tt��x�&�|��կ��I�8�������E�ĥZ\]��F��45���47ϿR ����^sr����\Jm�1�O�dIEND�B`�PK�X�/�/;;
cosmos.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class CosmosMagazine(BasicNewsRecipe):
    title = "Cosmos Magazine"
    description = (
        "Cosmos is a quarterly science magazine with 4 editions a year (Mar, Jun, Sep, Dec)."
        "It is produced by The Royal Institution of Australia Inc (RiAus)."
    )
    language = 'en_AU'
    __author__ = 'yodha8'
    oldest_article = 90
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('Cosmos', 'https://cosmosmagazine.com/feed'),
    ]
PK�X�Ⅵ||cotidianul.png�PNG


IHDR(-S�PLTE���������������������������������!"�2/�$�1.����/3�����QT�ec�vs�AA�SV���������vs�VT����RU�BE����������������������dg�������TT5xt��IDAT�b1���d{��Lf���R7�p�6,7���j�vN��lg����޴Y��d��Ǜy�O�y�".�~�\]SD�,�
-1��� K@�Ms�0��������k z뽿|~aL��Ϻ���")�&5&����H��@�F��ZИIEND�B`�PK�X�F�	�	cotidianul.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
cotidianul.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Cotidianul(BasicNewsRecipe):
    title = u'Cotidianul'
    __author__ = u'Silviu Cotoar\u0103'
    description = u''
    publisher = u'Cotidianul'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri'
    encoding = 'utf-8'
    cover_url = 'http://www.cotidianul.ro/images/cotidianul.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'class': 'titlu'}), dict(name='div', attrs={
            'class': 'gallery clearfix'}), dict(name='div', attrs={'align': 'justify'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['space']}), dict(
            name='div', attrs={'id': ['title_desc']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['space']}), dict(
            name='span', attrs={'class': ['date']})
    ]

    feeds = [
        (u'Feeds', u'http://www.cotidianul.ro/rssfeed/ToateStirile.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�S3���counterpunch.png�PNG


IHDR  D����PLTE��������"+�.5����+++���222�8=�;@��������"""���5;�����;@��������888�"'ppp�28�������◘������jjj�'ᕗᖗnnn�'.�+2ooo�25...���䥦䥧䦦䦧檫������貳賳鶷���긹vvvttt���쾿�ᑓ���◗���===���������������������������28'''�=B�DH◙㚜㛜����HL�JN�LR�NP�����\������������555�@@@������""�}}}����5;�������������������58�����ƾ�����DDDNNNPPP������������������������������������WWW�`b�rt�su��������22�����IDATxڅ��;A�{fֵ�m۶m۶ͧ�nv���'
�ˎ�%���F�cF��
�>�Pc�@�\5���r�'L|8~�9{��)��&��i;��Z��E�$RE�,�b�<�3B���Ӡ.�lw���%YD��^�O�n�!tm��RB�=�� J�*��H��3D�X�����%-p���r&�h)��x��ł6��r<����/���R`0��~!����{4<򾰸x��AX�`Q(pF$�.?3�+�|A�B��{�G�m`Un~�{՚6kb�q
(�YT�tQ��=u��
7;���B�ȏ�	�|�/0p�!��ϼ|�?�u�0�7���@��+�i�[l���f����=b�}�Y�5��?�@��l��
��a���9xxx�N0 �rMT����IEND�B`�PK�Xc��11counterpunch.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Counterpunch(BasicNewsRecipe):
    title = u'Counterpunch'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    language = 'en'

    feeds = [(u'Counterpunch', u'http://www.counterpunch.org/category/article/feed/')]
PK�X�e��countryfile.png�PNG


IHDR  D����PLTE3��������7��������9��5��6����������0��9���%�����<��5��=����,�����K��/��������~�Ñ����z�/�������ƚ��5�� �����'�����i�������k��M������*��y��V��_���������ǂ��:��F�����(�����ύ��A�������2�����L���������,�����}��������-��������[�����-�������m�����t�����v�����0�����(����鏹�#����Ԑ�������f����ѧ��s��"��%��`�����H���������������X������G�����{�€�����������N����r��"��B��>��,��������IDATx�b@�|B""B|���sj��b͛�۵�o�u�m۶m�K�M�F~n3OIT��c���f)l��6�~��])�b��ѭi8H'w�m����~����5����ZVlbh�g������jS�ݐ!�����}n��@b'��U��ѹ8���jŽC ���`Og!���+x���p �i*�������ؖ��m\W�<'�!�U#h��rD �x�XI~��g�Ю��xq��$מ��<U#��3 @�MQA-ݚ<}��乐�3A��H�-��M�8�T�C�O}pF���_笷�T�w�b�	�&�bݽ� �����Q��#��F�%��y�0�/*�y�t����5	GR�ro�6YNR�wM��"k���8��#�Ǭ�ڃ����|�fv�V��-��/�~����=�ؘ�޾��AM��?IEND�B`�PK�XR�X���countryfile.recipefrom calibre import browser
from calibre.web.feeds.news import BasicNewsRecipe
import re


class AdvancedUserRecipe1325006965(BasicNewsRecipe):
    title = u'Countryfile.com'
    __author__ = 'Dave Asbury'
    description = 'The official website of Countryfile Magazine'
    # last updated 24.10.14
    language = 'en_GB'
    oldest_article = 30
    max_articles_per_feed = 25
    remove_empty_feeds = True
    no_stylesheets = True
    auto_cleanup = True
    compress_news_images = True
    ignore_duplicate_articles = {'title', 'url'}

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.countryfile.com/magazine')
        cov = soup.find(attrs={'class': re.compile(
            'imagecache imagecache-250px')})  # 'width' : '160',
        cov = str(cov)
        cov = cov[10:]
        cov = cov[:-135]
        # print '++++ ',cov,' ++++'
        br = browser()

        br.set_handle_redirect(False)
        try:
            br.open_novisit(cov)
            cover_url = cov
        except:
            cover_url = 'http://www.countryfile.com/sites/default/files/imagecache/160px_wide/cover/2_1.jpg'
        return cover_url

    preprocess_regexps = [
        (re.compile(r' \| Countryfile.com', re.IGNORECASE | re.DOTALL), lambda match: '')]
    feeds = [
        (u'Country News', u'http://www.feed43.com/7204505705648666.xml'),
        (u'Articles', u'http://www.feed43.com/8542080013204443.xml'),
    ]
PK�X��T;CCcourier_mail.png�PNG


IHDR  ��
IDATxbx'�JSh���f�8~l|�m۶m۶m۶m۶m7���I����i^m-�;�]�o
B��	�c��b�������HRgv�X�I�T�f��'�Ӑ1⮌�$L��L��&�,��`] }ve�xu�l>WA�r����B��\�D\��xѷ�0��Xl�L߶�<{^jۙ$J-T���\c�>+��G����q|�"ƁC6ϋ5�q��H-ۛ�.؊b=z�.Z&���Θ㘦�8��gꢥ��;x�ǖem�F��i�~C]����F��շlǬ�~�����=W�,�L�
6�d鴍[�!��C�ҕ`����%Թ]�h^�꺎�>�C7G7ܝ}��ُwe�,�dϿ�=>��D�k���F���v,��f=���/9��
\��X���ғ���8r��&B�ܨ�]�2B,�Y�0��(�H��a�!b��n�He>Jw���!��L��
,����^GwZO�
�j� ���Յ2�1���Fl�b�|�Al������2~r G�Z������,���X�\�BRf�)J�8v�1�CG�!|�br���a���9@� x���K��a.����sbϿB�* 32�`K2�P9�5����{���e�:�lE�h���*�e�4.v���_�i^�iK�-��K�cY�@w��ly��G��.%�S@k�Uh�-_Ȑ$�j������(1pd̉آ��F��o�k�,��D<Q�tDP�.=��w�W�����᡿L�B������q���IEND�B`�PK�X�32cccourier_mail.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import datetime


class Politics(BasicNewsRecipe):
    title = u'The Courier-Mail'
    description = 'Breaking news headlines for Brisbane and Queensland, Australia. The Courier-Mail is owned by News Corp Australia.'
    language = 'en_AU'
    __author__ = 'Krittika Goyal, James Cridland'
    oldest_article = 3  # days
    max_articles_per_feed = 20
    use_embedded_content = False

    d = datetime.datetime.today()
    cover_url='http://mfeeds.news.com.au/smedia/NCCOURIER/NCCM_1_' + d.strftime('%Y_%m_%d') + '_thumb_big.jpg'
    masthead_url='https://couriermail.digitaleditions.com.au/images/couriermail-logo.jpg'

    no_stylesheets = True
    auto_cleanup = True
    handle_gzip = True

    feeds = [
        ('Top Stories', 'http://www.couriermail.com.au/rss'),
        ('Breaking', 'https://www.couriermail.com.au/news/breaking-news/rss'),
        ('Queensland', 'https://www.couriermail.com.au/news/queensland/rss'),
        ('Technology', 'https://www.couriermail.com.au/technology/rss'),
        ('Entertainment', 'https://www.couriermail.com.au/entertainment/rss'),
        ('Finance','https://www.couriermail.com.au/business/rss'),
        ('Sport', 'https://www.couriermail.com.au/sport/rss'),
    ]

# This isn't perfect, but works rather better than it once did. To do - remove links to subscription content.
PK�X�D�
	
	courrier.png�PNG


IHDR  szz��IDATx^ŗ[���݇����>fϞӞ�d&�I�ɤ�hT�Q�V��TKUl�Z,��-�U��B��V�H�Ri4ƒ��6�Qb�'�$3��$�����=��@e�M����n���Y�,����P<�k�L���7^������z\�g8p�6��3�;�����o�T���;V��fҘ~�	�����B&�3?��M��%;�{��-2�݉����>��n��~e���N���c���K(R�qr'԰��B��b8�IUKB�y�&?Z*�OZ��8t�5x�c�L��G%M�B��Ȯ=Odo��Йap�����]]�@	H�P�S�xDvͦnU�ۧ�`\��]�g �o�f+���l�y����^X�wG^�PϮ�H�41�wڟ�g/�߷)���&Y����Ƀo$��~��<���g���t@L(5L��>3����w=J0���k�̡{wA���8G���(x� �t0����!�<e�M��
�f��gQ�ce̕eX��`-
D@:@-�Ȅ�[Z�1X�������w��W���v�)����!4���}���&�yd�O!���8;o�7F�x�z��o1fg�b�#{84p��S�e��d�I/Gw��9�~�wln�+��}��I8�x�\5�w����������A)D)[L����o<�'��—�+�Sϝ�Ϸ����y�� �k�e���n�$"r���{����*���l�o��xTcO�^� �]�2[���{���7(�;���sĻ\}3ϾK{9�³�(���z�yF[�h~�|��t#O�\��v<ě�}�S��ebi~4���N\Z�0��-���}��U�R^|���V���K����=3��p�>�Z��B�RLt0�N��<X��]@^S��t�Zf
���B���YOAM`E��:#��W������2)���M�#�$I��XM�]��uk.�+�'M�OE�50�%#�gҴ
B���P
,�b�����Z
]����e�ͮe/�m2q�K��Wh%�8�@A�����L�@_�@��%fV!Z>�`�M�4��Q*Z�0ov�3���.��z=���
��B@Ӈ��V��h�@�%c��hΛ,N��\,=����ۚN+�A����@@@d<�x���8�oAF"�.Eʫ�����t˅�K�5O���1�
�^���$�7��sMW� �΀0�����83;��+"G�
��D�b)z�n
:�3݌���`KH�ߌq��.���1
|!A ����IH��ױ�cz؁$�Л��H�JČ*��#�@� g�ȭ�"p k�8�]�򁳅V nv�30 %�1'(bLV�(�bH���Eq&�l5�Z2�Z�Y'2����I�@Ö�;��O&{(�.
 �jg��Q�rH̲@Yh
�\D�#���a6�
@z�
ɸ6z$�!�͆�8n*�aՏ�7��8p��
P(��xL#&��T���l?�R Bt��J�mRU���B����qf!���Q�|�8���P�X��sy.�D�+ �!:\������k|�܆μ��%
�'�*���C�8�<p��"���ge����54�i�i��BS����>b�$�i�ռ��l����Z_��H����<��Ua0�L��D��x7GW�
������4��Ai�P�aB�|���
l���0N�1@-HQ�?�d�ګ�Fe9@6��<�:|�N����j�,(��5kp�>�e�d�p�.���X5��=��՛���t��Wd��RLfH��>�{���/ػ�$��:�]W.~8��1Φ8u��}�m��ZR�z��}���$�8P���\�0�_j�P�yt3`>H�����d����;��VwEX5�d�f�9D�V��֖�$�շ'���n�@��)�ӋÜ��ݗ��#6��'j���"�ࣱ޹L�6F�瞌����
7C�r��� C�c�O�m���2{���l2 �"|��sS�q�AI4
����1WHp1��Htϥl�Y�wNtn;nժx�(��~�B:�9.X�����of(�c��3��b'�Z9�!�Z
h�H:eD#DK�W��$�<�9x<m/�h�� �Vi�`�/�j�<���AV���˗w��؃�G�5�,�ƚ�����;z�����5���*Jt�>�%�s�
1V�7Q��IEND�B`�PK�Xc�courrier.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class CourierPress(BasicNewsRecipe):
    title = u'Courier Press'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25

    remove_stylesheets = True
    remove_tags = [
        dict(name='iframe'),
    ]

    feeds = [
        ('Courier Press',
         'http://www.courierpress.com/rss/headlines/news/'),
    ]

    def preprocess_html(self, soup):
        story = soup.find(name='div', attrs={'id': 'article_body'})
        soup = BeautifulSoup(
            '<html><head><title>t</title></head><body></body></html>')
        body = soup.find(name='body')
        body.insert(0, story)
        return soup
PK�XKO�>>courrierinternational.png�PNG


IHDR  D���QPLTE*';6MG_Xsj�{������������������4
tRNS6Gq����񝘽�IDAT��90�d{�ko�P)�̌0��
 ��23�A�ۀb�zVe��g0��O����mpwÂz��໽�Ӡ*�E!_�?�s����^�P��g�;u�sv��jM�<?��� r���i%_�r�?�V��T��4@���T�|�o����};��x����X�+��|ڀx�[%�Lf��ι�7���'��Ww�3'�?s�U��	��m���5�z'���ӢګO�W�~�Z����a�)�M���x�Z1��;�l�2A�B>}�ٻ
��p���C_���Fg7�3�썾�ξ�~�0p�����s�9�+�1�/�g��\�p���
�!��ϡ�POJ
�}Q09�����0g��J}o���3�����M�/IEND�B`�PK�X�M�::courrierinternational.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

__license__ = 'GPL v3'
__copyright__ = '2009, Mathieu Godlewski <mathieu at godlewski.fr>\
2015, Rémi Vanicat <vanicat at debian.org'
'''
Courrier International
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class CourrierInternational(BasicNewsRecipe):
    title = 'Courrier International'
    __author__ = 'Mathieu Godlewski <mathieu at godlewski.fr>'
    description = 'Global news in french from international newspapers'
    oldest_article = 7
    language = 'fr'

    max_articles_per_feed = 50
    no_stylesheets = True

    html2lrf_options = ['--base-font-size', '10']

    keep_only_tags = [
        dict(name='div', attrs={'class': 'article-content'}),
    ]

    remove_tags = [
        dict(name='aside', attrs={'class': re.compile(
            'article-sitesocial|article-ad|article-tertiary|view-ci-service-article')}),
        dict(name='button', attrs={'id': re.compile(
            'action-zen-off-(top|bottom)')}),
    ]

    needs_subscription = "optional"
    login_url = 'http://www.courrierinternational.com/login'

    def get_browser(self):
        def is_form_login(form):
            return "id" in form.attrs and form.attrs['id'] == "user-login-form"
        br = BasicNewsRecipe.get_browser(self)
        if self.username:
            br.open(self.login_url)
            br.select_form(predicate=is_form_login)
            br['name'] = self.username
            br['pass'] = self.password
            br.submit()
        return br

    def preprocess_html(self, soup):
        for link in soup.findAll("a", href=re.compile('^/')):
            link["href"] = 'http://www.courrierinternational.com' + link["href"]
        return soup

    feeds = [
        # Some articles requiring subscription fails on download.
        ('Tous', 'http://www.courrierinternational.com/feed/all/rss.xml'),
        ('France', 'https://www.courrierinternational.com/feed/category/6260/rss.xml'),
        ('Europe', 'https://www.courrierinternational.com/feed/category/6261/rss.xml'),
        ('Ameriques', 'https://www.courrierinternational.com/feed/category/6262/rss.xml'),
        ('Asie', 'https://www.courrierinternational.com/feed/category/6263/rss.xml'),
        ('Afrique', 'https://www.courrierinternational.com/feed/category/6264/rss.xml'),
        ('Moyen-Orient', 'https://www.courrierinternational.com/feed/category/6265/rss.xml'),
        ('Expat', 'https://www.courrierinternational.com/feed/category/6994/rss.xml'),
        ('Business', 'https://www.courrierinternational.com/feed/category/6991/rss.xml'),
        ('Culture', 'https://www.courrierinternational.com/feed/category/6270/rss.xml'),
        ('Economie', 'https://www.courrierinternational.com/feed/category/6266/rss.xml'),
        ('Écrans', 'https://www.courrierinternational.com/feed/category/7342/rss.xml'),
        ('Éducation', 'https://www.courrierinternational.com/feed/category/6997/rss.xml'),
        ('Environnement', 'https://www.courrierinternational.com/feed/category/6267/rss.xml'),
        ('Infographie', 'https://www.courrierinternational.com/feed/category/6281/rss.xml'),
        ('Lifestyle', 'https://www.courrierinternational.com/feed/category/7426/rss.xml'),
        ('Planète buzz', 'https://www.courrierinternational.com/feed/category/6680/rss.xml'),
        ('Politique', 'https://www.courrierinternational.com/feed/category/6681/rss.xml'),
        ('Santé', 'https://www.courrierinternational.com/feed/category/6682/rss.xml'),
        ('Sport', 'https://www.courrierinternational.com/feed/category/6273/rss.xml'),
        ('Tendances', 'https://www.courrierinternational.com/feed/category/6282/rss.xml'),
        ('Réveil', 'https://www.courrierinternational.com/feed/category/8224/rss.xml'),
        ('Enquêtes', 'https://www.courrierinternational.com/feed/category/6678/rss.xml'),
        ('Histoire', 'https://www.courrierinternational.com/feed/category/6679/rss.xml'),
        ('Sciences & Techno', 'https://www.courrierinternational.com/feed/category/6268/rss.xml'),
        ('Voyage', 'https://www.courrierinternational.com/feed/category/6271/rss.xml'),
    ]
PK�X�8Mڶ�cracked_com.png�PNG


IHDR  szz�}IDATxڴ�tc[�w��m۶m۶mO�ڶm�v�3�ت���X+7�)yy]�o���]l"*���
�g��deeu+,,l!/++�޽�V~~��P�����!Gn4:��E��Y�2�	x�8T��0 AOOw��˗&�w,�Y1ʔP^^.�t������)�5�2���ܺar��
�B���<�$���*��C[��홃��"�JPQy�+ؘ=�*0�0��"��+ $$d��_����>�Nc��)��ׯ���둗�>��˅?V�Xa�d�;�@� �L���b�K�[��(~�pO�/  `�H$�Ѧ%�V�y�޽�<4Y��E�޽{���s��) ..n�H�1������
��/Z��J��/_>7r0���~��:yH��̘1�k�
�������gM���iW�f�}*((����Fزe��7�T�,,,����>�����p����*���F����3d�DEE�rppX� GG�ETA����Q���� BC'�ٺ�߿7z��e���j�`y���#
�C�`��##�
G�4/��ܲvXLnnn����f��:�V0Lڟ��5`�Ώ���3%p��O�G��?8�����>|x�_Ku�h��vj(
0�64��R�8p@@1���&﨟�
6�6��aR���VH����7���&�k/���"7@RRR/����0PEE|L掍�>������K�P�r.P��ؑ:����Z`��|o�A-�$��r?o�������'Eڟ��փ�U�>�����=�#F��`A�}�rrrz5x��!��mkVL�X!�m۶i��f���߻ޠ�����g�<��,���YaAq����V��Ƕd���}���θk��^y%��000p��o߾mִi�a���$>������%��<Ëz����;w�������&#�̡-m��<yҍ�S^�/^t��71c�׿ �MK�eL�����AAt��u��Q}zf��T?حTH$��Ni$�?�h��Xk��D��Q#t�eW�˖-s���*��'O�������#@�TZ�������ܜ���k.R{������^��IEND�B`�PK�X�y|K��cracked_com.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Cracked(BasicNewsRecipe):
    title = u'Cracked.com'
    __author__ = 'UnWeave'
    language = 'en'
    description = "America's Only HumorSite since 1958"
    publisher = 'Cracked'
    category = 'comedy, lists'
    oldest_article = 3  # days
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    remove_javascript = True
    use_embedded_content = False
    recursions = 11
    remove_attributes = ['size', 'style']

    feeds = [(u'Articles', u'http://feeds.feedburner.com/CrackedRSS/')]

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(name='div', attrs={
             'class': ['content-content', 'contentWrapper', 'content-header',]}),
        dict(name='article', attrs={'class': [
             'module article dropShadowBottomCurved', 'module blog dropShadowBottomCurved',]}),
    ]

    remove_tags = [
        dict(name='section', attrs={
             'class': ['socialTools', 'quickFixModule', 'continue-reading']}),
        dict(attrs={'class':['socialShareAfterContent', 'socialShareModule',
             'continue-reading', 'social-share-bottom list-inline']}),
        dict(name='div', attrs={'id': ['relatedArticle', 'content-card-top',
             'recommendedForYourPleasure', 'navbar', 'flashbackModuleWrap', 'moreRecommendedArticles']}),
        dict(name='div', attrs={'class': [
            'comments-wrap', 'container continue-reading', 'row breadcrumbs-wrapper', 'btn-social-favorites col',
            'hidden-social col', 'ajax-loader comments-loader-bottom', 'flashback-module-new',
            'card-md-list card-sm-list card-xs-list',
            'popular-module card-md-list card-sm-list card-xs-list', 'col-md-12 list-title',
            'content-cards d-flex flex-wrap',
            'google-plus btn btn-social', 'twitter btn btn-social',
            'facebook btn btn-social', 'row social-share-top-wrapper']}),
        dict(name='h4', attrs={'class': ['mobile-ad-label']}),
        dict(name='ul', attrs={'id': ['breadcrumbs', 'socialShare']}),
        dict(name='ul', attrs={'class': ['list-unstyled offcanvas-sections']}),
        dict(name='div', attrs={
             'class': ['bannerAd hidden-sm hidden-md hidden-lg introAd']})
    ]

    def is_link_wanted(self, url, a):
        return a['class'] == 'next' and a.findParent('nav', attrs={'class':'PaginationContent'}) is not None

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-img':True}):
            img['src'] = img['data-img']
        for img in soup.findAll('img', attrs={'data-original':True}):
            img['src'] = img['data-original']
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        return soup

    def postprocess_html(self, soup, first_fetch):
        for div in soup.findAll(attrs={'class':'PaginationContent'}):
            div.extract()
        if not first_fetch:
            for div in soup.findAll(attrs={'class':'meta'}):
                div.extract()

        return soup
PK�X�l{��credit_slips.png�PNG


IHDR22�]�nIDATxڼ�YHTa��Yԙ�TܲƲ2K�("�
�^�z	��̀^{	$"���|SPLE�\s�
�Y�qu����~�C�03���{�w����>������C���2�VVV�:+���j��a����pX�-//�@w	H�@ ���3H�---
���TTT�����u|���ӧO�<yr���.9rd�޽QQQ111����
Xmvv�ʕ+�!B3&`:v�ؙ3gl6������%��H٭[�@������H�ٜ��Ș����ݽ�lI�!����Ç_�~�ܹsiii�%O<x���˅��]��������Ç�^�*///--mhhx��uQQ������"0|0�-���|>�x.%944T\\��ѡ�1l�,�_lm\T��ƹ���XIIISSSX�uMxǒ��@�zEIz['� ֵ/QGFF�X��[q�#m��hؖQ��D���9ͨ2 ��n@�-�Ӊ�4X�<�,+��At�d�mj(���3�MOO�ӫ�	^YY������y��`:�㬣���LY�u�����%���$���r������ÇUUU���<�E����ك���On nPX����U�X��7<<,@���h����tԃҺ�a7o��8z��1��ӧO�����N�5���UX�'#����o2�xB�8	���q��=��q��bq8SSS�8��*��:Ϟ={��mܲ���nf�ZT�o��B�DU�HK�6Qj(1%����Ą5��M�t��|�����nWWW��EG���+���\�UmY��a1�b�)�i�Zq���d%;�{�ӧ�є0� ���f�He�FrĨ�T___U]�����Յn*�~�*(�s��իWsss/_��[���ֲIA�&��4c)��J0���sh��d��˸,\�t�o����M�y�A����{��ٳg�q���}}}$���āO�5B�>"5��y��Y3�U����_�'�0�W%�����%jaa!2C�33�d�r��� p)`��bcc���߿e�Rk��~%���gj��v�.̣��/B��&��q+�t��+�LMM]5с=.>9))''�f��}�rua�@�i2k��r/]cS���Y����,+�Z���p����,.�{��L@0G�q���x@n���$���ϷTT����ݫ(�������_a��z@������-iKoĄ������`r&J��2`7&��%Ȑ�����<�-�`etF��CTO8� ��-��	�T��;��0�������r�	.���CH��ɓ'�?~��)*F�(3��F��W�	V�9))I`�k�F�㔔W����ͱQ�BAQw �k�d�8q��+!!�d@�s|�x�ߪ�\��Zۿ߱�P!vg���c��cΰ��_V�#�\���:,�+G�5����~�fw�1Ea�u>ک�S-Z��@U"$�D�����%.�7H�(Z�tf:�cq����}����]�}߽�
<[�V��� �15+�7p^5���Qk�i`uu}uu�2P��$�R1�wJ�S6ڽ����œ5e�&YC�zNhÜ�8%a��hK�
�L���w�?~\�v{�Z�n^^~��%����صk����`}H��O�}��qp��mAf��*s��$����<g�S�� ����B��`Š�oC$�3�fH����H��#R���X��B�~�� �@��$�2e�T�ʄ�8>%���x��%�i��!��+�� �z��&�DgJ�}
�!�>�Tk��B����U>�ddqr�b����^_�~����"S��0��&�b%�:�x�%���uLQX�˗/_�rE�v�_��\�%��h������NLNn��0_�偏p�={����G�ʇK������cbj���Hsl`Kui�ѽ{�mUf�;�.�$_x*H$)kbo�I���ݻ�Lv��!�z���ם�޾}���=�D/���2���}�KaW���u�Ktj_�Ӂ\�0P���…/^d)
c1�h�pj۬�
�E�~�_�4Ic5�u�
7{�>��7�8�0?L㑭
��_hm��u'�:C��!�LX�INOO���B�1z����R�,٘؍e��������ޙ|ڬ�{�1�N�C�ؚ�	Y�b�_`%GH��D1����Ǹ(zg����Wִ7���_J6+dB�i5��r��C��8��VtB����6�hA�gPb}����!`{S�@�0�W�j����/�͊�ʹ�P�@L��z�k���/���-uGk"L)���A��Q{�Z�9
L���}�'�=�O�7�Ix0���S��&4�;Y��ݸy������)�����*�tDU�(ǎ��5�[R��h%']�z��	UV�sX1���.s�uQ�X3�"p��l*1��N�O�4���z;�*�*����+�����_���%q�����ۛG�u�9���zVʬ+��-�ۯܸq��kr�'���ƪ�r��E;�#,��|���\���H5⵲��d�js�;1*7}�4�=�����v
_=A��־�{��no�����j(�K�P�"8khU�[zy�������퇘��=q�s�U�".׭�RK2�t��i��e�ɬǫ������*RX���{+>�S<M�є<�6��8t��U�w�&-..��yrr�}�S�����B�����"��;xp��L��`�$�z�1\�b�5Y��I'�J�Z�lVmL�:���$[�b7P�#A��aa��E�^�T���%9�Z��5;��K���55LF����
R�^��dtƂ��\Y�[{K����������Պ����`*�Ѣ����OΟ?��L� ���I�:���'���,S.
��I�oB�0��U�Z*'��Ճ�#�S�Wiwu�`J��>s��#s�_��x���D��A�o·*vT�4F��z�����x��+ǎQ�ܡ���f�Vp�g"γ��z�fD}0�����������nps�L��?�tT<�,~Ki��=�k铉�����xb�<�9�BS������1y-���B�f��o�r�y���1�K���k��5kn	]��Y\����q>�}MؿM]��k��[“_�9<e�-��\�
M~�o�w���R���@IEND�B`�PK�X�����credit_slips.recipe#!/usr/bin/env python
__license__ = 'GPL 3'
__copyright__ = 'zotzo'
__docformat__ = 'restructuredtext en'

from calibre.web.feeds.news import BasicNewsRecipe


class CreditSlips(BasicNewsRecipe):
    language = 'en'
    __author__ = 'zotzot'
    version = 2
    title = u'Credit Slips.org'
    publisher = u'Bankr-L'
    category = u'Economic blog'
    description = u'A discussion on credit and bankruptcy'
    cover_url = 'http://bit.ly/eAKNCB'
    oldest_article = 15
    max_articles_per_feed = 100
    use_embedded_content = True
    no_stylesheets = True
    remove_javascript = True

    conversion_options = {
        'comments': description,
        'tags': category,
        'language': 'en',
        'publisher': publisher,
    }

    feeds = [
        (u'Credit Slips', u'http://www.creditslips.org/creditslips/atom.xml')
    ]

    extra_css =    '''
                       .author {font-family:Helvetica,sans-serif; font-weight:normal;font-size:small;}
                       h1      {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                       p       {font-family:Helvetica,Arial,sans-serif;font-size:small;}
                       body    {font-family:Helvetica,Arial,sans-serif;font-size:small;}
                   '''

    def populate_article_metadata(self, article, soup, first):
        h2 = soup.find('h2')
        h2.replaceWith(h2.prettify() + '<p><em>Posted by ' +
                       article.author + '</em></p>')
PK�Xݡ��
crikey.png�PNG


IHDR  D����PLTE�$$�((�''�((�((�((�((�))�''�((�))�((�''�))��((�((�))�  �((�((�))�**�((�''�++�((�((�((�((�))�((�))�((�((�((�((�((�((�''�++�&&�((�((�$$�''�((�&&�((�$$�((�((�((�))�''�((����������������++�����\\�,,�jj����qq����������FF����00�--��������ll�cc�..����;;��������RR���99���ss�**�nn����������~~�||�))������������bb���22�11���??�]]�������XX�������mm�LL����NN���__�����������^^���dd�����������zz�oo��������tt�8;,8tRNSY���X
&���%	�����1�.�́��W����U"����-��ȗV�Ȩ]�IDATx�b@F&f@���HD��m۶�����ڶ�g�{z�Zg�Y����P���B�Z������I���{�Dco���
�dj`�6�������yy��rk�QR��X9�Q��xA7�Q���0��ף��.�N�w��1��}*| `?��)�u>������s��@�t�2��u�!k�E��qTg�NmP}�
1q�%Q��z�0��M�/)�<i�U�s��7N�bQ\B�J���‰����(� p�Mg�>���&�<6<q<y��53<C��K�^�DzL+�(_��&r�����DZO�u0|%�Id��	�Q�]����J�z���L�k}���!�cX� et���/[�܌�^���I72�Ul�iw�+��R���i.���A�F��"ӳ�Tief�`~aa��b]!�@��E:��IEND�B`�PK�X�ȭ!AA
crikey.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2021, Alistair Francis alistair@alistair23.me'
__docformat__ = 'restructuredtext en'

from urllib.parse import urlencode
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 Crikey(BasicNewsRecipe):
    title = 'Crikey'
    description = 'Australian News'
    __author__ = 'Alistair Francis'
    language = 'en_AU'

    use_embedded_content = True
    needs_subscription = True

    keep_only_tags = [
        classes('article-body'),
    ]

    feeds = [
        ('Politics', 'https://www.crikey.com.au/politics/feed'),
        ('World', 'https://www.crikey.com.au/world/feed'),
        ('Media', 'https://www.crikey.com.au/media/feed'),
        ('Buisness', 'https://www.crikey.com.au/business/feed'),
        ('Coronavirus', 'https://www.crikey.com.au/coronavirus/feed'),
        ('Culture', 'https://www.crikey.com.au/life/feed'),

    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('https://www.crikey.com.au/')

        if self.username is not None and self.password is not None:
            postdata = urlencode({
                'username': self.username,
                'password': self.password
            })
            br.open(
                'https://www.crikey.com.au',
                data=postdata,
                timeout=self.timeout
            )

            br.set_handle_refresh(True)

        return br
PK�X�o�cronica.png�PNG


IHDR�a�IDATx�b�:J
�rap_�k۶m�A��vP۶mی�u���O��Ϟd�3%�^�|V�`��C�M���78���4HH�O�鳝�;�/�I��e���5��p��w����5��I�V�[.��"���5�[�Tn���
�l���C���[O��m����Y�^pf��x���GA�k2��4���#X�x(���l��TR�=��/��M�jv�`�����z�\�\�`��y�P����_R������'���}ț7b������B��Õ/�A@~���Oi��p�u�L��	��-��-*���f�<�l�gV>�mț
E�j�B�.^�qA��I���8����ZV��(����=O�8l��t�q���l(E&kZ1���҃��3��%^7�������k���P�.!Z�x�ć�D�PO&�e.�?��'���ٰt5|u�IEND�B`�PK�X@�ƈ�
�
cronica.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2018, Darko Miletic <darko.miletic at gmail.com>'
'''
www.cronica.com.ar
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Veintitres(BasicNewsRecipe):
    title = 'Cronica'
    __author__ = 'Darko Miletic'
    description = 'Últimas noticias'
    publisher = 'Grupo Crónica'
    category = 'politica, noticias generales, Argentina'
    oldest_article = 15
    max_articles_per_feed = 100
    no_stylesheets = False
    use_embedded_content = False
    encoding = 'utf-8'
    masthead_url = 'https://www.cronica.com.ar/export/sites/cronica/arte/logos/logoCronica.svg_799932565.svg'
    language = 'es_AR'
    remove_javascript = True
    publication_type = 'magazine'
    remove_empty_feeds = True
    auto_cleanup = True
    auto_cleanup_keep = '//h1'
    resolve_internal_links = True
    INDEX = "https://www.cronica.com.ar"
    extra_css = """
                                img{margin-bottom: 0.8em}
                            """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    feeds = [
        (u'Policiales', u'https://www.cronica.com.ar/seccion/policiales/'),
        (u'Politica', u'https://www.cronica.com.ar/seccion/politica/'),
        (u'General', u'https://www.cronica.com.ar/seccion/info-general/'),
        (u'Mundo', u'https://www.cronica.com.ar/seccion/mundo/'),
        (u'Opinion', u'https://www.cronica.com.ar/seccion/opinion/'),
        (u'Deportes', u'https://www.cronica.com.ar/seccion/deportes/'),
        (u'Cosa de locos', u'https://www.cronica.com.ar/seccion/cosa-de-locos/'),
        (u'Espectaculos', u'https://www.diarioshow.com/seccion/espectaculos/'),
    ]

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(
                0,
                _('Fetching feed') + ' %s...' %
                (feedtitle if feedtitle else feedurl)
            )
            articles = []
            soup = self.index_to_soup(feedurl)
            for item in soup.findAll('a', attrs={'class': 'cover-link'}):
                url = self.INDEX + item['href']
                if feedtitle == 'Espectaculos':
                    url = 'https://www.diarioshow.com' + item['href']
                title = item['title']
                articles.append({
                    'title': title,
                    'date': '',
                    'url': url,
                    'description': ''
                })
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X������csid.png�PNG


IHDR(-S3PLTE���焵�����_��������j������芹������t���tRNSZøO�
NIDATx�m�� @Q�k�e��|
�7�B�J�
����*њ���J��Qb�@��;�~���$|�{���,-��dρIEND�B`�PK�Xj�E]		csid.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
csid.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class CSID(BasicNewsRecipe):
    title = u'Ce se \u00eent\u00e2mpl\u0103 doctore?'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Ce se \u00eent\u00e2mpl\u0103 doctore?'
    publisher = 'CSID'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Femei,Health,Beauty'
    encoding = 'utf-8'
    cover_url = 'http://www.csid.ro/images/default/csid.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'content floatleft'})
    ]

    remove_tags = [
        dict(name='div', attrs={'id': ['article_links']}), dict(
            name='div', attrs={'id': ['tags']}), dict(name='p', attrs={'id': ['tags']})
    ]

    remove_tags_after = [
        dict(name='p', attrs={'id': ['tags']})
    ]

    feeds = [
        (u'Feeds', u'http://www.csid.ro/rss/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X"2H�WWct24.png�PNG


IHDR  szz�IDATx��5�1��J_a�l�$�w�,��X�K�����85��R�Y�ಓ���;�]�&�d���*j�ʑ�/�⹅�ṅvgA٣�5��~��6�w9i6�oR����܁����k;�0���s�n��?}��
G���'�c�*�T�lL�ҧr�g>�'Hݝ<* �y6��ye��jTe>������N��z5��
����)#��χ��/��B���S�A���‡v��R=�^���2�ad��ȩxi�fW����W �L��CY��6�ԗ8��|�G㨞rA��$�K��RoY3г%�0�; џ�$0}=��Ճ�h�p�8�ػ �f��4�΁������.ؙ=	U��s��@"�
�H��{�h��b�,�]���sFg}���ДP�%�7�fܗr#�/�,��7�?y/�.�4�n�y �����?%mO4�Td
���?��/�����_z�~;<�_|����-��k�3��^�LDUT�gcf?3�kIEND�B`�PK�Xk�j@��ct24.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1339974788(BasicNewsRecipe):
    title = u'\u010cT24'
    oldest_article = 1
    language = 'cs'
    __author__ = 'zoidozoido'
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
    (u'Hlavn\xed zpr\xe1vy', u'http://www.ceskatelevize.cz/ct24/rss/hlavni-zpravy/'),
    (u'Dom\xe1c\xed', u'http://www.ceskatelevize.cz/ct24/rss/domaci/'),
    (u'Sv\u011bt', u'http://www.ceskatelevize.cz/ct24/rss/svet/'),
    (u'Regiony', u'http://www.ceskatelevize.cz/ct24/rss/regiony/'),

    (u'Kultura', u'http://www.ceskatelevize.cz/ct24/rss/kultura/'),
    (u'Ekonomika', u'http://www.ceskatelevize.cz/ct24/rss/ekonomika/'),
    (u'Sport - hlavn\xed zpr\xe1vy', u'http://www.ceskatelevize.cz/ct4/rss/hlavni-zpravy/'),
    (u'OH 2012', u'http://www.ceskatelevize.cz/ct4/rss/oh-2012/')]
    remove_tags = [dict(name='img')]
PK�X!�Ng��cubadebate.png�PNG


IHDR�aGIDATxڔ��A���?�fP;|qm۶m�϶m#�m���s'�[�$ߎ������ÇtQXiiܼ{���X<x��(�h,�t�3��a�O��̙CAe%������2q�D���A�f�hTW�[??0���f�_Q���?>>>
/��c���F���Spupq�2���2�劓��sss�nݺO��#G�66`m���
LMa�h2������Haaa�F;;;���Oj"!a���	:v��gς�%�hAA$���I��iӆ��k�.�w�N۶m�:u�sMV*k	: +�At�@ⳳiԨ+W�PȠ.2U���w"8BC!$ΟGY}=�GBVǎ�P��…�j���^M���c�2�����PU����͛���DG�kb��Rc�M�"eA�^&�RH��Q�3�/^зo_=�R���n��V�B_�5hҤ�z4P�/^��jXO�<��4gȐW�#�o�A�EDD��&�0_Ȑ�G`޼yoO%���������7��7���'O��Q�~������o��?�LFГ۷O�ӧs����G�y���S��L��BA^F3� IEND�B`�PK�X-,�
��cubadebate.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
cubadebate.cu
'''

from calibre.web.feeds.news import BasicNewsRecipe


class CubaDebate(BasicNewsRecipe):
    title = 'CubaDebate'
    __author__ = 'Darko Miletic'
    description = 'Contra el Terorismo Mediatico'
    oldest_article = 15
    language = 'es_CU'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    publisher = 'Cubadebate'
    category = 'news, politics, Cuba'
    encoding = 'utf-8'
    masthead_url = 'http://www.cubadebate.cu/wp-content/themes/cubadebate/images/logo.gif'
    publication_type = 'newsportal'
    extra_css             = """
                               #BlogTitle{font-size: xx-large; font-weight: bold}
                               body{font-family: Verdana, Arial, Tahoma, sans-serif}
                            """

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [dict(name='div', attrs={'id': 'Outline'})]
    remove_tags_after = dict(name='div', attrs={'id': 'BlogContent'})
    remove_tags = [
        dict(name=['link', 'base', 'embed', 'object', 'meta', 'iframe']), dict(
            attrs={'id': 'addthis_container'})
    ]

    feeds = [(u'Articulos', u'http://www.cubadebate.cu/feed/')]
    remove_attributes = ['width', 'height', 'lang']

    def print_version(self, url):
        return url + 'print/'

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�X�Y��__cumhuriyet.png�PNG


IHDR  D����PLTE��*�,����#�	!�$�
$�
%�'�'�)�� �+� �����(�(�)�
"��%�!7�)>�_o����&����������� ����7J�M_�#����1�2�5� �"8�#8�%;�(=�����:N�;N�AS�AT�1�N_�Vf�Zj�\l�^n��ap�aq�et�fu�gv�n|�s��t��z��}��~��~��*��������������������&�+������-����������������.����������/��������������0��������������2F������5I�!����)?�BU�"�������,A���FX�����������.C�����������������/C�1E��B=yIDATx^���n�0�¸�\ffffff�afz����ntn���4��5S �'�QET(EL@N��u���4��gr҇7G�̱ZDq� n��@D��iH��e��:G�@p�,$�k�)Z�����RXV8���I[��U�Q�=��v���]�+ٸ�c1#����|��H�o��r6  �@�����_���z�	~Q���#p_k`/�v�N���:�e���V�/q�H�.&dzm�R��Zȟ���1����:h��%�X��0Wݷ��[�5�w����o�	��YJ���=��m�B�
�5�-ÆK���E�§c�T&�I
7�
ȵ8�R��D�W���}�O�;��IEND�B`�PK�X�� ���cumhuriyet.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Cumhuriyet(BasicNewsRecipe):
    title = 'Cumhuriyet'
    __author__ = 'ims'
    description = 'News from Turkey'
    language = 'tr'
    publisher = 'Cumhuriyet'
    oldest_article = 1
    max_articles_per_feed = 10
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    ignore_duplicate_articles = {'title', 'url'}

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'baslik'}),
        dict(name='h2', attrs={'class': 'spot'}),
        dict(name='div', attrs={'class': 'haberKaynagi'}),
        dict(name='div', attrs={'class': 'yayin-tarihi'}),
        dict(name='div', attrs={'class': 'haberMetni'}),
    ]

    remove_tags = [
        dict(name=['button', 'svg']),
        dict(name='ul', attrs={'class': 'breadcrumbs'}),
        dict(name='div', attrs={'class': 'google-news'}),
        dict(name='div', attrs={'class': 'iliskiliHaberler'}),
    ]

    feeds = [
        ('Gundem',  'https://www.cumhuriyet.com.tr/rss/9999'),
        ('Dünya',   'https://www.cumhuriyet.com.tr/rss/4'),
        ('Türkiye', 'https://www.cumhuriyet.com.tr/rss/3'),
        ('Ekonomi', 'https://www.cumhuriyet.com.tr/rss/5'),
        ('Kultur Sanat', 'https://www.cumhuriyet.com.tr/rss/6'),
        ('Siyaset', 'https://www.cumhuriyet.com.tr/rss/2'),
        ('Bilim ve Teknoloji', 'https://www.cumhuriyet.com.tr/rss/10'),
        ('Tarım', 'https://www.cumhuriyet.com.tr/rss/19'),
    ]
PK�X�o����curierulnational.png�PNG


IHDR  D����PLTE# %!"*&'+'(2/0301523634745856IFGKHJNLMPNOQOQSQRTRSXVW\�[�Y�X�W�]�a�!c�#d�&f�)i�+j�-k�.l�1n�2o�3p�5q�8s�=v�?x�Ay�C{�G~�I�K��M��P��R��T��W��X��[��^��a��a��c��e��g��i��l��k��m��p��s��u��x��y��z��|��~����������������É�Ê�č�ŏ�Ƒ�ǒ�Ȗ�ʙ�̘�˚�̞�Π�Ϣ�Ф�Ѧ�Ҩ�Ӫ�ԫ�խ�ְ�ױ�ײ�ص�ڷ�۸�ۺ�ܾ����������������������������������De}Ad}Ac|?b|>a{@bz=_x:^y9]v5Zu1Uo)\)^�-^�-`�.`�0a�1c�2d�4d�6f�QwLs IfA_nw�IDATx�]n�T��{�I2���oK� ��
�B�JxBBBB<J��t2c{|�Eq	H�
r
�	�B\�-�k\
��>�X
����p����'`%�""~+/��)�W"�zt/�����C��/?��|�����S��n�u7�O2ƛys�p?v��z�n?_��n��+���s��n�nfٖ�a�V���4Mٖ�y!ѕe�}:���ㇺ����y!��eYߛ��m�׮uW$ZC��
�����D�@��n�]!�$��< ��5�I�M�,h��豽��>�����ݗ1�^,�ó���:����ֺ[�:��^w�R�Q̥�=���I���e�_����!�����a�'�Т��~���q��Cf���q�h �h �D��4�>�h�v�H` �'	�@ ~�ף�hj�s�X�P[�'����0�~�V5�K�E��ѡom5��ں��]_����5�� ��Y��m'C�IEND�B`�PK�X�ڤ�]]curierulnational.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
curierulnational.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class CurierulNal(BasicNewsRecipe):
    title = u'Curierul Na\u0163ional'
    __author__ = u'Silviu Cotoar\u0103'
    description = ''
    publisher = 'Curierul Na\u0163ional'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri'
    encoding = 'utf-8'
    cover_url = 'http://www.curierulnational.ro/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'col1'}), dict(
            name='img', attrs={'id': 'placeholder'})
    ]

    remove_tags = [
        dict(name='p', attrs={'id': ['alteArticole']}), dict(name='div', attrs={'id': ['textSize']}), dict(
            name='ul', attrs={'class': ['unit-rating']}), dict(name='div', attrs={'id': ['comments']})
    ]

    remove_tags_after = [
        dict(name='ul', attrs={'class': 'unit-rating'})
    ]

    feeds = [
        (u'Feeds', u'http://www.curierulnational.ro/feed.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�Ǩ��currenttime.png�PNG


IHDR  D���3PLTE0 �0�+�,�-�-�.�.�-�+�-�-�.�+�*�-�Bo>�tRNS 0@P`p��������#��IDATx�b ����A6�B��v���u��I�H���Gr��1���-㆞�<�^[���烢�����
l!����d	��V�Y�l���͝'���`��״N�cL̥���Ts�~C�mB�t
���ڶ�<���i^���E����ϋ���;�.+�5��ɼ+�^�"=�iJw�A�꯭e������1
Z-5����؜N�CMH�m�1���
�Q��(8?+�Cq>i=�c����W$~�23S`���⓵IEND�B`�PK�Xs��Xrrcurrenttime.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class CurrentTime(BasicNewsRecipe):
    title = '\u041D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435 \u0432\u0440\u0435\u043C\u044F'
    __author__ = 'bugmen00t'
    description = '\u0422\u0435\u043B\u0435\u043A\u0430\u043D\u0430\u043B "\u041D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435 \u0412\u0440\u0435\u043C\u044F" \u0440\u0430\u0441\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u043E \u0432\u0430\u0436\u043D\u044B\u0445 \u043D\u043E\u0432\u043E\u0441\u0442\u044F\u0445 \u0438 \u0437\u043B\u043E\u0431\u043E\u0434\u043D\u0435\u0432\u043D\u044B\u0445 \u0442\u0435\u043C\u0430\u0445, \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u044F \u0430\u0443\u0434\u0438\u0442\u043E\u0440\u0438\u0438 \u0442\u043E, \u0447\u0442\u043E \u043D\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043C\u043E\u0433\u0443\u0442 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0442\u044C \u043C\u0435\u0441\u0442\u043D\u044B\u0435 \u0421\u041C\u0418: \u043D\u043E\u0432\u043E\u0441\u0442\u0438 \u0431\u0435\u0437 \u0446\u0435\u043D\u0437\u0443\u0440\u044B, \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u043E\u0431\u043C\u0435\u043D \u043C\u043D\u0435\u043D\u0438\u044F\u043C\u0438, \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u0435 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C.'  # noqa
    publisher = 'RFE/RL ("\u0420\u0430\u0434\u0438\u043E \u0421\u0432\u043E\u0431\u043E\u0434\u043D\u0430\u044F \u0415\u0432\u0440\u043E\u043F\u0430"/"\u0420\u0430\u0434\u0438\u043E \u0421\u0432\u043E\u0431\u043E\u0434\u0430") \u043F\u0440\u0438 \u0443\u0447\u0430\u0441\u0442\u0438\u0438 VoA ("\u0413\u043E\u043B\u043E\u0441 \u0410\u043C\u0435\u0440\u0438\u043A\u0438")'  # noqa
    category = 'newspaper'
    cover_url = u'https://www.currenttime.tv/Content/responsive/RFE/ru-RU-TV/img/top_logo_news.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 14
    max_articles_per_feed = 20

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'body-container'})

    remove_tags = [
        dict(name='div', attrs={'class': 'publishing-details '}),
        dict(name='div', attrs={'class': 'separator'}),
        dict(name='div', attrs={'class': 'links'}),
        dict(name='div', attrs={'class': 'share--box'}),
        dict(name='aside'),
        dict(name='div', attrs={'class': 'media-block also-read'}),
        dict(name='div', attrs={'class': 'media-block-wrap'}),
        dict(name='div', attrs={'class': 'media-download'}),
        dict(name='div', attrs={'class': 'wsw__embed'}),
        dict(name='div', attrs={'class': 'share--box'}),
        dict(name='div', attrs={'class': 'prog-hdr'}),
        dict(name='div', attrs={'class': 'dropdown__holder'}),
        dict(name='div', attrs={'id': 'ymla-section'}),
        dict(name='div', attrs={'id': 'comments'}),
        dict(name='a', attrs={'class': 'back-to-top-link'}),
        dict(name='footer'),
        dict(name='li', attrs={'class': 'socials block-socials'}),
        dict(name='div', attrs={'data-sp_api': 'pangea-video'})
    ]

    feeds = [
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.currenttime.tv/api/zgbip_e_tpp_'
        ),
        (
            '\u0421\u0435\u043C\u044C \u0441\u043E\u0440\u043E\u043A',
            'https://www.currenttime.tv/api/ztktpyeimupt'
        ),
        (
            '\u042D\u043A\u0441\u043A\u043B\u044E\u0437\u0438\u0432',
            'https://www.currenttime.tv/api/zpyomoe-rimi'
        ),
        (
            '\u0412\u044B\u0431\u043E\u0440 \u0440\u0435\u0434\u0430\u043A\u0446\u0438\u0438',
            'https://www.currenttime.tv/api/zqk-poekpbpo'
        ),
        (
            '\u0420\u043E\u0441\u0441\u0438\u044F',
            'https://www.currenttime.tv/api/zuvmpvepo_pv'
        ),
        (
            '\u0423\u043A\u0440\u0430\u0438\u043D\u0430',
            'https://www.currenttime.tv/api/zkvmptemo_pt'
        ),
        (
            '\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u044C',
            'https://www.currenttime.tv/api/zvvmm_eoo_mt'
        ),
        ('\u0410\u0437\u0438\u044F', 'https://www.currenttime.tv/api/zbvtpqetoupq'),
        (
            '\u0415\u0432\u0440\u043E\u043F\u0430',
            'https://www.currenttime.tv/api/z-vmpoevo_pi'
        ),
        (
            '\u0410\u043C\u0435\u0440\u0438\u043A\u0430',
            'https://www.currenttime.tv/api/zbvmpieto_pp'
        ),
        (
            '\u0411\u043B\u0438\u0436\u043D\u0438\u0439 \u0412\u043E\u0441\u0442\u043E\u043A',
            'https://www.currenttime.tv/api/zrvtppeuqupm'
        ),
        (
            '\u041B\u043E\u043D\u0433\u0440\u0438\u0434\u044B',
            'https://www.currenttime.tv/api/zibmmyejv_my'
        ),
        (
            '\u0420\u0435\u043F\u043E\u0440\u0442\u0430\u0436',
            'https://www.currenttime.tv/api/zrpppqeujppo'
        ),
        (
            '\u0420\u0435\u043F\u043E\u0440\u0442\u0430\u0436\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B \u0412\u0435\u0447\u0435\u0440',
            'https://www.currenttime.tv/api/zvrrmoeourmp'
        ),
        (
            '\u0418\u043D\u0442\u0435\u0440\u0432\u044C\u044E',
            'https://www.currenttime.tv/api/zqpppoekjppi'
        ),
        (
            '\u0418\u043D\u0444\u043E\u0433\u0440\u0430\u0444\u0438\u043A\u0430',
            'https://www.currenttime.tv/api/zmqmpyebumpv'
        )
    ]
PK�XI�Z���cvecezla.png�PNG


IHDR  D���0PLTE��������������1��T��y����������������AtRNSG�����ORIDATx�l�!W������:�|����n����h?yӹ���TD�TJ���du�ZJm�����o��d��H���Y�MI���Er�S�<q��%�s�8�|��#�=���;�[��y�sX��E	�gb�o�“_���Ǹ�������aϒ��L����ø�F]���RD�����@�y�*�V@�S�3/��h�ьq!��#v����%F�d�	y0ZƂQ"�HT,5��B�Dm����
R0��0���~i�ٲ��,��}��
-`�j�F��_̆Y-���E��r�M+���}��s<3����=��z�3/�����߰�(IEND�B`�PK�X�����cvecezla.recipe
__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
cvecezla.wordpress.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class CveceZla(BasicNewsRecipe):
    title = 'Cvece zla i naopakog'
    __author__ = 'Darko Miletic'
    description = 'Haoticnost razmisljanja poradja haoticnost pisanja. Muzika, stripovi, igre, knjige, generalno glupiranje...'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'sr'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = False
    publication_type = 'blog'
    extra_css = ' @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: "Trebuchet MS",Trebuchet,Verdana,sans1,sans-serif} .article_description{font-family: sans1, sans-serif} img{display: block } '  # noqa

    conversion_options = {
        'comment': description, 'tags': 'igre, muzika, film, blog, Srbija', 'publisher': 'Mehmet Krljic', 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    remove_tags_before = dict(attrs={'class': 'navigation'})
    remove_tags_after = dict(attrs={'class': 'commentlist'})
    remove_tags = [
        dict(attrs={'class': ['postmetadata alt', 'sharedaddy sharedaddy-dark sd-like-enabled sd-sharing-enabled',
                              'reply', 'navigation']}), dict(attrs={'id': 'respond'})
    ]

    feeds = [(u'Clanci', u'http://cvecezla.wordpress.com/feed/')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�Xy�77cyberpresse.png�PNG


IHDR  D����PLTE���������
�����E;��������
�������;0�G>�^U�e\��������������������?4�������!�%�%�&�'�+ �, �,!�/#�3'�4(�=3�>3��B9�	�E<�F;�F<�G=��H>�K@�LA�QH�SJ�TJ�TK�
�f]�h`�un�|u�|w�~x�{��������������������������������������������������������������
�����]T��_W�7,��<1�=2��
�6+�WN�����������	�bZ�d[�:0���������ٻ�`IDATx�����@��~3���v׶���ض}�gj���'�K=!L,���V�펋���s�nW�(��zSW����]��'����wi	�k��u��<Uz�(x��ݑI��"Xz�zLF��2��B�G<C�a���[���|���ٟ{��s!�<�q���r��}b�7���l��/��(-�V �����f�ZR���Ec����P��*�������6�eY�<x�������¡�߿���G�p	�X{���g����I��z`DxLs�㞓�b
����'�(��ok7�i�s�K����l�Ϥ���bN+K��n[�����7�K�ΚN��K�IEND�B`�PK�X�c��	�	cyberpresse.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Cyberpresse(BasicNewsRecipe):

    title = u'Cyberpresse'
    __author__ = 'balok and Sujata Raman'
    description = 'Canadian news in French'
    language = 'fr'

    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    html2lrf_options = ['--left-margin=0', '--right-margin=0',
                        '--top-margin=0', '--bottom-margin=0']
    encoding = 'utf-8'

    keep_only_tags = [dict(name='div', attrs={'class': 'article-page'}),
                      dict(name='div', attrs={'id': 'articlePage'}),
                      ]

    extra_css = '''
                    .photodata{font-family:Arial,Helvetica,Verdana,sans-serif;color: #999999; font-size: 90%; }
                    h1{font-family:Georgia,Times,serif ; font-size: large; }
                    .amorce{font-family:Arial,Helvetica,Verdana,sans-serif; font-weight:bold;}
                    .article-page{font-family:Arial,Helvetica,Verdana,sans-serif; font-size: x-small;}
                    #articlePage{font-family:Arial,Helvetica,Verdana,sans-serif; font-size: x-small;}
                    .auteur{font-family:Georgia,Times,sans-serif; font-size: 90%; color:#006699 ;}
                    .bodyText{font-family:Arial,Helvetica,Verdana,sans-serif; font-size: x-small;}
                    .byLine{font-family:Arial,Helvetica,Verdana,sans-serif; font-size: 90%;}
                    .entry{font-family:Arial,Helvetica,Verdana,sans-serif; font-size: x-small;}
                    .minithumb-auteurs{font-family:Arial,Helvetica,Verdana,sans-serif; font-size: 90%; }
                    a{color:#003399; font-weight:bold; }
                '''

    remove_tags = [
        dict(name='div', attrs={
             'class': ['centerbar', 'colspan', 'share-module']}),
        dict(name='p', attrs={'class': ['zoom']}),
        dict(name='ul', attrs={'class': ['stories']}),
        dict(name='h4', attrs={'class': ['general-cat']}),
    ]

    feeds = [(u'Manchettes', u'http://www.cyberpresse.ca/rss/225.xml'),
             (u'Capitale nationale', u'http://www.cyberpresse.ca/rss/501.xml'),
             (u'Opinions', u'http://www.cyberpresse.ca/rss/977.xml'),
             (u'Insolite', u'http://www.cyberpresse.ca/rss/279.xml')
             ]

    def postprocess_html(self, soup, first):

        for tag in soup.findAll(name=['i', 'strong']):
            tag.name = 'div'

        return soup
PK�X	l����cynewslive.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime, timedelta


class CyNewsLiveRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en_CY'
    version = 1

    title = u'Cyprus News Live'
    publisher = u'The Cyprus Weekly'
    category = u'News, Newspaper'
    description = u'News from Cyprus'

    use_embedded_content = False
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True

    pubTime = None
    minTime = None
    articleCount = 0

    INDEX = 'http://www.cynewslive.com'

    feeds = []
    feeds.append(
        ('News: Cyprus', 'http://www.cynewslive.com/main/92,0,0,0-CYPRUS.aspx'))
    feeds.append(
        ('News: World', 'http://www.cynewslive.com/main/78,0,0,0-UKWORLD.aspx'))
    feeds.append(
        ('Sport: Football', 'http://www.cynewslive.com/main/82,0,0,0-FOOTBALL.aspx'))
    feeds.append(
        ('Sport: Rugby', 'http://www.cynewslive.com/main/83,0,0,0-RUGBY.aspx'))
    feeds.append(
        ('Sport: Cricket', 'http://www.cynewslive.com/main/85,0,0,0-CRICKET.aspx'))
    feeds.append(
        ('Sport: Tennis', 'http://www.cynewslive.com/main/84,0,0,0-TENNIS.aspx'))
    feeds.append(
        ('Sport: Other', 'http://www.cynewslive.com/main/86,0,0,0-OTHER.aspx'))
    feeds.append(
        ('Business: Local', 'http://www.cynewslive.com/main/100,0,0,0-LOCAL.aspx'))
    feeds.append(
        ('Business: Foreign', 'http://www.cynewslive.com/main/101,0,0,0-FOREIGN.aspx'))
    feeds.append(
        ('Environment', 'http://www.cynewslive.com/main/93,0,0,0-ENVIRONMENT.aspx'))
    feeds.append(
        ('Culture', 'http://www.cynewslive.com/main/208,0,0,0-CULTURE.aspx'))

    keep_only_tags = []
    keep_only_tags.append(
        dict(name='div', attrs={'class': 'ArticleCategories'}))

    extra_css = '''
                body{font-family:verdana,arial,helvetica,geneva,sans-serif ;}
                '''

    def parse_index(self):
        answer = []
        for feed in self.feeds:
            self.articleCount = 0
            articles = []
            soup = self.index_to_soup(feed[1])

            table = soup.find('table', attrs={'id': 'ctl00_cp_ctl01_listp'})
            if table:
                self.pubTime = datetime.now()
                self.minTime = self.pubTime - \
                    timedelta(days=self.oldest_article)

                self.find_articles(table, articles)

            answer.append((feed[0], articles))

        return answer

    def postprocess_html(self, soup, first):
        for el in soup.findAll(attrs={'style': True}):
            del el['style']

        for el in soup.findAll('font'):
            el.name = 'div'
            for attr, value in el:
                del el[attr]

        return soup

    def find_articles(self, table, articles):
        for div in table.findAll('div', attrs={'class': 'ListArticle'}):
            el = div.find('div', attrs={'class': 'ListArticle_T'})
            title = self.tag_to_string(el.a)
            url = self.INDEX + el.a['href']

            description = self.tag_to_string(
                div.find('div', attrs={'class': 'ListArticle_BODY300'}))

            el = div.find('div', attrs={'class': 'ListArticle_D'})
            if el:
                dateParts = self.tag_to_string(el).split(' ')
                monthNames = {'January': 1, 'February': 2, 'March': 3, 'April': 4, 'May': 5, 'June': 6,
                              'July': 7, 'August': 8, 'September': 9, 'October': 10, 'November': 11,
                              'December': 12}
                timeParts = dateParts[3].split(':')
                self.pubTime = datetime(year=int(dateParts[2]), month=int(monthNames[dateParts[1]]),
                                        day=int(dateParts[0]), hour=int(timeParts[0]),
                                        minute=int(timeParts[1]))

            if self.pubTime >= self.minTime and self.articleCount <= self.max_articles_per_feed:
                articles.append(
                    {'title': title, 'date': self.pubTime, 'url': url, 'description': description})
                self.articleCount += 1
            else:
                return
PK�X. 2JJcyprus_weekly.png�PNG


IHDR  D���wPLTE����\J��TBdN�z\F������Ě
�����~�v|^lV,�j|f̦Ģ�~�~,&������vlRD6dRt^����$L6ԦԪ�f|n
�n��4&�z����j$4"<*��ܺ����ܲ\R����tR���rlN|bD2lZ,"����Ħ�n�vdJ<&���r����|j$�����~�rĞtb<.Ī�n������tVtZdV��L>ԲTJ\N��̮4*��l^�zlJ̲T>LBL:k
��IDATx�}��]=�'ɶ�m[׶m�c{k��wr\�NF�Yofb�/ �p���`bK†��LK�$�%Iq�,���01%�[t.�����c�a���N,��	 -u��� t�/��m�H�;�J�r%���[��i���a;�(44���<،�<�r@��5@Ű����N��i������Nhk����  p�m\��F -�%���n�P��*F(A��0���
�D"aòO��!�GS��Ż
^�CR�>�VSeY�mq�ϯ���Ba	�qRU���#�%"��nwAu��a�z���`'׏Ʈ �Z%i�..F�QS
�r$�蛿�!�؟�=�S�v�~�L`՘r�Xu�1G�I��=<�r`�)�����S��/�U�1��D��%cAJK@�loL
�΅-	����cJ�%O��(մ�`2xO��(�S�E��Hp~�oL"��[>T@�JGC�!>y�^J+�ʫ���h
@�4��:��v�.e���_��8O$�K���(9��o��k�/�g��s�A�O2����Q>'a]u�(��W�~a>s�k�4��~v@���Y�\��d>|�>�5�{��)TO�`��\p'��d�� �{�h�7�M�~��E�m���{Xq� nIEND�B`�PK�X��  cyprus_weekly.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime, timedelta


class CyNewsLiveRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en_CY'
    version = 1

    title = u'Cyprus Weekly'
    publisher = u'The Cyprus Weekly'
    category = u'News, Newspaper'
    description = u'News from Cyprus'

    use_embedded_content = False
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True

    pubTime = None
    minTime = None
    articleCount = 0

    INDEX = 'http://www.cyprusweekly.com.cy/main/default.aspx'

    feeds = []
    feeds.append(
        ('News: Cyprus', 'http://www.cyprusweekly.com.cy/main/92,0,0,0-CYPRUS.aspx'))
    feeds.append(
        ('News: World', 'http://www.cyprusweekly.com.cy/main/78,0,0,0-UKWORLD.aspx'))
    feeds.append(('Sport: Football',
                  'http://www.cyprusweekly.com.cy/main/82,0,0,0-FOOTBALL.aspx'))
    feeds.append(
        ('Sport: Rugby', 'http://www.cyprusweekly.com.cy/main/83,0,0,0-RUGBY.aspx'))
    feeds.append(
        ('Sport: Cricket', 'http://www.cyprusweekly.com.cy/main/85,0,0,0-CRICKET.aspx'))
    feeds.append(
        ('Sport: Tennis', 'http://www.cyprusweekly.com.cy/main/84,0,0,0-TENNIS.aspx'))
    feeds.append(
        ('Sport: Other', 'http://www.cyprusweekly.com.cy/main/86,0,0,0-OTHER.aspx'))
    feeds.append(
        ('Business: Local', 'http://www.cyprusweekly.com.cy/main/100,0,0,0-LOCAL.aspx'))
    feeds.append(('Business: Foreign',
                  'http://www.cyprusweekly.com.cy/main/101,0,0,0-FOREIGN.aspx'))
    feeds.append(('Whats On: Places of Interest',
                  'http://www.cyprusweekly.com.cy/main/123,0,0,0-PLACES-OF-INTEREST.aspx'))
    feeds.append(('Whats On: Going Out',
                  'http://www.cyprusweekly.com.cy/main/153,0,0,0-GOING-OUT.aspx'))
    feeds.append(('Whats On: Arts & Entertainment',
                  'http://www.cyprusweekly.com.cy/main/135,0,0,0-ARTS--and-ENTERTAINMENT.aspx'))
    feeds.append(('Whats On: Things To Do',
                  'http://www.cyprusweekly.com.cy/main/136,0,0,0-THINGS-TO-DO.aspx'))
    feeds.append(('Whats On: Shopping Guide',
                  'http://www.cyprusweekly.com.cy/main/142,0,0,0-SHOPPING-GUIDE.aspx'))
    feeds.append(
        ('Culture', 'http://www.cyprusweekly.com.cy/main/208,0,0,0-CULTURE.aspx'))
    feeds.append(
        ('Environment', 'http://www.cyprusweekly.com.cy/main/93,0,0,0-ENVIRONMENT.aspx'))
    feeds.append(
        ('Info', 'http://www.cyprusweekly.com.cy/main/91,0,0,0-INFO.aspx'))

    keep_only_tags = []
    keep_only_tags.append(
        dict(name='div', attrs={'class': 'ArticleCategories'}))

    extra_css = '''
                body{font-family:verdana,arial,helvetica,geneva,sans-serif ;}
                '''

    def parse_index(self):
        answer = []
        for feed in self.feeds:
            self.articleCount = 0
            articles = []
            soup = self.index_to_soup(feed[1])

            table = soup.find('table', attrs={'id': 'ctl00_cp_ctl01_listp'})
            if table:
                self.pubTime = datetime.now()
                self.minTime = self.pubTime - \
                    timedelta(days=self.oldest_article)

                self.find_articles(table, articles)

            answer.append((feed[0], articles))

        return answer

    def postprocess_html(self, soup, first):
        for el in soup.findAll(attrs={'style': True}):
            del el['style']

        for el in soup.findAll('font'):
            el.name = 'div'
            for attr, value in el:
                del el[attr]

        return soup

    def find_articles(self, table, articles):
        for div in table.findAll('div', attrs={'class': 'ListArticle'}):
            el = div.find('div', attrs={'class': 'ListArticle_T'})
            title = self.tag_to_string(el.a)
            url = self.INDEX + el.a['href']

            description = self.tag_to_string(
                div.find('div', attrs={'class': 'ListArticle_BODY300'}))

            el = div.find('div', attrs={'class': 'ListArticle_D'})
            if el:
                dateParts = self.tag_to_string(el).split(' ')
                monthNames = {'January': 1, 'February': 2, 'March': 3, 'April': 4, 'May': 5, 'June': 6,
                              'July': 7, 'August': 8, 'September': 9, 'October': 10, 'November': 11,
                              'December': 12}
                timeParts = dateParts[3].split(':')
                self.pubTime = datetime(year=int(dateParts[2]), month=int(monthNames[dateParts[1]]),
                                        day=int(dateParts[0]), hour=int(timeParts[0]),
                                        minute=int(timeParts[1]))

            if self.pubTime >= self.minTime and self.articleCount <= self.max_articles_per_feed:
                articles.append(
                    {'title': title, 'date': self.pubTime, 'url': url, 'description': description})
                self.articleCount += 1
            else:
                return
PK�Xp!���czas_gentlemanow.png�PNG


IHDR��h6�IDATx�=�mHSa�����^��vw��Sgi�Dl�Y�V"����/� ��(@� *@"�"�B �,���,"+C)H�R�:�s�m��}��C��`(2rkb�HC�Ӿ�g95��p��F��=�x��ݗ��%%6u!�~�Γ�f��Ρ�D�@������G�eU>�~��&�I�	6бg�޳o����p4��LG��R�!�Y�A�ˢl����3���� �
@�������-�Zrt{�
I[[gey�#�����2]���@a�@)��1^o� �ní(��� ���	��������LU0CSU=��1�Rb�7�����ض�lB)�P�/��H-T�}���焾�J�r��DO{=B�ۑα�R_Ny�c���}���;s��r,��6���[��oh�@�H��)�BJHD�ty5`++�	�	�#�]��ș�����_�Uz��&M��$Ǔd2I	c� e�\�aZ�tUj�W����r;���9�ѝ�w�2y��޲�l������.��h<�8�Y�m�}"�Q����z{`g�á.,���Dq=��x=nE��B�?��(2å
v׹�i��fwyK���rx���ަHdӓ���������ib}��`�]c]���n������KPY��mD�USCK����=-��IEND�B`�PK�XS�OOczas_gentlemanow.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai
from calibre.web.feeds.news import BasicNewsRecipe


class CzasGentlemanow(BasicNewsRecipe):
    title = u'Czas Gentlemanów'
    __author__ = 'fenuks'
    description = u'Historia mężczyzn z dala od wielkiej polityki'
    category = 'blog'
    language = 'pl'
    cover_url = 'https://czasgentlemanow.pl/wp-content/uploads/2012/10/logo-Czas-Gentlemanow1.jpg'
    ignore_duplicate_articles = {'title', 'url'}
    oldest_article = 7
    max_articles_per_feed = 100
    extra_css = '.gallery-item {float:left; margin-right: 10px; max-width: 20%;} .alignright {text-align: right; float:right; margin-left:5px;}\
    .wp-caption-text {text-align: left;} img.aligncenter {display: block; margin-left: auto; margin-right: auto;} .alignleft {float: left; margin-right:5px;}'
    no_stylesheets = True
    remove_empty_feeds = True
    use_embedded_content = False
    keep_only_tags = [dict(name='div', attrs={'class': 'post-wrapper'})]
    remove_tags = [dict(attrs={'class': ['awac-wrapper', 'post-bottom', 'comment', 'seperate']})]
    feeds = [
    (u'Charakter', u'https://czasgentlemanow.pl/category/charakter/feed/'),
    (u'Wizerunek', u'https://czasgentlemanow.pl/category/wizerunek/feed/'),
    (u'Relacje międzyludzkie', u'https://czasgentlemanow.pl/category/relacje-miedzyludzkie/feed/')]
PK�X�.R�FFdachauer_nachrichten.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X9_�H��dachauer_nachrichten.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Dachauer Nachrichten'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Landkreis Dachau', u'http://www.merkur-online.de/lokales/dachau/rssfeed.rdf'),
    (u'Lkr. Dachau', u'http://www.merkur-online.de/lokales/dachau/landkreis/rssfeed.rdf'),
    (u'Odelzhausen', u'http://www.merkur-online.de/lokales/dachau/odelzhausen/rssfeed.rdf'),
    (u'Altom\xfcnster', u'http://www.merkur-online.de/lokales/dachau/altomuenster/rssfeed.rdf'),
    (u'Markt Indersdorf', u'http://www.merkur-online.de/lokales/dachau/markt-indersdorf/rssfeed.rdf'),
    (u'Karlsfeld', u'http://www.merkur-online.de/lokales/dachau/karlsfeld/rssfeed.rdf'),
    (u'Dachau', u'http://www.merkur-online.de/lokales/dachau/dachau/rssfeed.rdf'),
    (u'Petershausen', u'http://www.merkur-online.de/lokales/dachau/petershausen/rssfeed.rdf'),
    (u'Haimhausen', u'http://www.merkur-online.de/lokales/dachau/haimhausen/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/dachau/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�Xՙ��%%dagens_industri.png�PNG


IHDR  D���PLTE�����������)&���т��51���2/��QN�^[�a_�gd�ki��������������Ч
�����������������������vt�wu�xv�|z�}{�~{�51�'#�����׬� �,)�#�JG�pnܠ�֎�ؔ���������Ӷ74�om�pm��;7�62ؕ�ؕ�ٖ�ڜ��+'�@=����������������҅�ݢ�ߩ�૪ଫᯮ䵴䶵������罻��ǽ<�IDATx�ݒr�cǶm��O�zc��t����p>�'=�|_vߚ�j��_�^�pN@~�l�'�.�Z�LB�r~ B����?���lm�>Z�Xj��d�(m�N��y�s�E^��2T�R����Jra�S�J�b��#,����`�AQ��]ί�L03�ŧҾ�|������=����cnP��
����/���$��4�
��D �`
IEND�B`�PK�X��wffdagens_industri.recipe# -*- coding: utf-8 -*-

__license__ = 'GPLv3'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1311450855(BasicNewsRecipe):
    title = u'Dagens Industri'
    __author__ = 'Jonas Svensson'
    description = 'Economy news from Sweden'
    publisher = 'DI'
    category = 'news, politics, Sweden'
    oldest_article = 2
    delay = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'sv'

    feeds = [(u'DI', u'https://di.se/rss')]

    keep_only_tags = [dict(name='h1', attrs={'id': 'ctl00_ExtraWideContentRegion_WideContentRegion_MainRegion_MainContentRegion_MainBodyRegion_headlineNormal'}), dict( name='div', attrs={'id': 'articleBody'})]  # noqa

    remove_tags = [
        dict(name='div', attrs={'class': 'article-actions clear'}), dict(name='div', attrs={'class': 'article-action-popup'}), dict(name='div', attrs={'class': 'header'}), dict(name='div', attrs={'class': 'content clear'}), dict(name='div', attrs={'id': 'articleAdvertisementDiv'}), dict(name='ul', attrs={'class': 'action-list'})  # noqa
    ]
PK�X7�8�oodagensmedicin_dk.png�PNG


IHDR  D����PLTEz������������	���|�{������#�������h�ǫ���T��}���|�������ݔ����H���F�����P��U��C��2��{�������-��S��L��|�Q��������_�����m����{��������������o��~����������z����������
�����}�ϣ��(���������������V�����ۛ��v�������s�ˋ�Ԛ��|������������$��������%�������}���Ю��|�������
�����������������E���������Z��@��������������O���������ҍ��J��^����\�������@��.�������[��D�����B�����3��������R�������f��4���#+_IDATx�ԑ�$1@�۶g�ֶm۶m���T����2�5>�f��@T '��`Cg&5�kAM;a�
��=���%��A
��@^N�
-_�U�ÿ	�S`i���q"�I�(��2��H"�E�JO�jMR2��Nj�9 �����Fo�����l�M� �Ó����2��PaD�ʪjx~1q�u�&����&��bE�6�t���K��B���N������q
�v<�i�
,�#Xu?c�8jO8]�X��uΉa�_Xt{XY]C:�����¶��Rfg��jҶ=1^�}�s�i�!�̑�p��b|�gz?�/W�h����&�	i��H0q�C��S��!����L��`:<IEND�B`�PK�X ��

dagensmedicin_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Dagens Medicin
'''


class Dagensmedicin_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'Dagens Medicin'
    description           = 'Uafhængig nyhedsavis om sundhedssektoren'
    category              = 'news, medicin, healthcare, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://dagensmedicin.dk/feeds
    feeds = [
        ('Dagens Medicin', 'http://dagensmedicin.dk/feed/'),
        ('Leder', 'http://dagensmedicin.dk/sektion/opinion/leder/rss'),
        ('Kommentarer til Dagens Medicin', 'http://dagensmedicin.dk/comments/feed/'),
        ('Almen Praksis ', 'http://dagensmedicin.dk/sektion/almen-praksis/rss'),
        ('Cancer', 'http://dagensmedicin.dk/sektion/cancer/rss'),
        ('Hjerte-kar', 'http://dagensmedicin.dk/sektion/hjerte-kar/rss'),
        ('Psykiatri', 'http://dagensmedicin.dk/sektion/psykiatri/rss'),
        ('Diabetes', 'http://dagensmedicin.dk/sektion/diabetes/rss'),
        ('Debat', 'http://dagensmedicin.dk/sektion/opinion/debat/rss'),
        ('Blogs', 'http://dagensmedicin.dk/sektion/opinion/blogs/rss'),
        ('Stikpillen', 'http://dagensmedicin.dk/sektion/opinion/stikpillen/rss'),
    ]
PK�X��MT--dagenspharma_dk.png�PNG


IHDR  D���PLTE�%�&�@J�PY�������t{���ܚ��+6�5?���*�������3>�OX�&1���6@�u|Ӂ�Յ������1<׌��������R[�NWْ����ऩ���ܛ�४�����CL�����JS���������ջ<F���AK����_g���涺᧬���1;ԃ��`h�:D�)� +ݜ��kr����`i���Ԅ�嵹�!,���渻���ؐ��s{�IS绿�2=��ݶ.9�;E�&⫯����*ԃ��+�v~�bj�\d�%1�9��IDATx���z�@@�m�Fj۶y�{�����}
�`������>��v�yx����S���s�o�l��I9@V�@��׷�%���-w��h^:��g}@��;�_L��*�N���Q���t��t���r��E6���`}���5�
��Q�v���S|�������ئ���y�������� D�U8���@?��T�!�.�&@dIEND�B`�PK�XB��$$dagenspharma_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Dagens Pharma
'''


class Dagenspharma_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'Dagens Pharma'
    description           = 'Først med professionelles nyheder om medicin'
    category              = 'medicin, healthcare, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://dagenspharma.dk/feeds/
    feeds = [
        ('Dagens Pharma', 'http://dagenspharma.dk/feed/'),
        ('Kommentarer til Dagens Pharma', 'http://dagenspharma.dk/comments/feed/'),
        ('Regulering &#8211; Dagens Pharma', 'http://dagenspharma.dk/sektion/regulering/rss'),
        ('Tilskud &#8211; Dagens Pharma', 'http://dagenspharma.dk/sektion/tilskud/rss'),
    ]
PK�X�W%q��daily_express.png�PNG


IHDRF4�S�IDATxڕR�JQ�#�����~�?z���(��(��хD3��(!�H�ZXj�:Gg�9�vu<3�mfj2�J-���f���ex��>���/���:�*�	��Ɩ��HC��zϙFjO\[�4�G߬�Z�'i�!&@��ua�S�a��u�9�`��pO'�B4IN,f���YLe{j�$�M�~bx*c���cw)�ܡ�~-��uT�	�_��H���d[Q����X� 5���f�O�q���T$��v��-킑06��7@��ǜ�-����������||�}���Hϋ�\.����l,I��)0��oc����9��(��"�W�w��~�b%�#o:=E_�)T�%_@����4�݄�p�K���0߲,�.�MLg���G��5���y��&�QyIEND�B`�PK�X� 3daily_express.recipe# vim:fileencoding=UTF-8
from __future__ import unicode_literals
from __future__ import print_function

import re

from calibre.web.feeds.news import BasicNewsRecipe
from calibre import browser


class AdvancedUserRecipe1390132023(BasicNewsRecipe):
    title = u'Daily Express'
    __author__ = 'Dave Asbury'
    # 1.8.15 official feedburner feeds live again
    # 27.6.15 using feed43 as rss feeds dead
    # feed 43 string = <div {*}<a href="{%}"{*}<h4>{%}</h4>
    oldest_article = 1.5
    language = 'en_GB'
    max_articles_per_feed = 10
    compress_news_images = True
    compress_news_images_max_size = 20
    ignore_duplicate_articles = {'title', 'url'}
    masthead_url = 'http://cdn.images.dailyexpress.co.uk/img/page/express_logo.png'
    auto_cleanup_keep = '//*[@class="author"]|//section[@class="photo changeSpace"]'
    auto_cleanup = True
    no_stylesheets = False

    preprocess_regexps = [
        (re.compile(r'\| [\w].+?\| [\w].+?\| Daily Express',
                    re.IGNORECASE | re.DOTALL), lambda match: ''),

    ]
    feeds = [

        # (u'UK News', u'http://feed43.com/3460616116055543.xml'),
        # http://www.express.co.uk/posts/rss/1/uk'),
        (u'UK News', u'http://feeds.feedburner.com/daily-express-uk-news'),
        (u'World News', u'http://feeds.feedburner.com/daily-express-world-news'),
        # (u'World News',u'http://feed43.com/5650105317448722.xml'),
        # http://www.express.co.uk/posts/rss/78/world'),
        (u'Showbiz News', u'http://feeds.feedburner.com/daily-express-showbiz-news'),
        # (u'Showbiz News',u'http://feed43.com/2564008080442425.xml'),
        (u'Finance', u'http://feeds.feedburner.com/daily-express-finance-news'),
        # (u'Finance',u'http://feed43.com/8636615325246501.xml'),
        # http://www.express.co.uk/posts/rss/21/finance'),
        # (u'Sport - Boxing',u'http://feed43.com/7570233481503246.xml'),
        (u'Sport - Boxing', u'http://feeds.feedburner.com/daily-express-boxing-news'),
        (u'Sport - Rugby Union',
         u'http://feeds.feedburner.com/daily-express-rugby-union-news'),
        # (u'Sport - Rugby Union',u'http://feed43.com/4235483647118470.xml'),
        # (u'Sport - Others',u'http://feed43.com/6106345668326737.xml'),
        (u'Sport - Others', u'http://feeds.feedburner.com/daily-express-other-sport-news'),
        # http://www.express.co.uk/posts/rss/65/sport'),
        (u'Entertainment', u'http://feeds.feedburner.com/daily-express-entertainment-news'),
        # (u'Entertainment',u'http://feed43.com/8864645080210731.xml'),
        # http://www.express.co.uk/posts/rss/18/entertainment'),
        (u'Lifestyle', u'http://feeds.feedburner.com/daily-express-life-and-style-news'),
        # (u'Lifestyle',u'http://feed43.com/8705161426770855.xml'),
        # http://www.express.co.uk/posts/rss/8/life&style'),
        (u'Travel', u'http://feeds.feedburner.com/daily-express-travel'),
        # (u'Travel',u'http://feed43.com/6547373884767554.xml'),
    ]
    # starsons code

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        for feed in feeds:
            for article in feed.articles[:]:
                print('article.title is: ', article.title)
                if 'WATCH:' in article.title.upper():
                    feed.articles.remove(article)

        return feeds

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.express.co.uk/ourpaper/')
        cov = soup.find(attrs={'src': re.compile(
            'http://cdn.images.express.co.uk/img/covers/')})
        cov = str(cov)
        cov2 = re.findall(
            'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', cov)

        cov = str(cov2)
        cov = cov[2:len(cov) - 2]

        # cover_url=cov
        br = browser()
        br.set_handle_redirect(False)
        try:
            br.open_novisit(cov)
            cover_url = cov
        except:
            cover_url = 'http://cdn.images.express.co.uk/img/static/ourpaper/header-back-issue-papers.jpg'

        return cover_url

    extra_css = '''
                    #h1{font-weight:bold;font-size:175%;}
                    h2{display: block;margin-left: auto;margin-right: auto;width:100%;font-weight:bold;font-size:175%;}
                    #p{font-size:14px;}
                    #body{font-size:14px;}
                    .newsCaption {display: block;margin-left: auto;margin-right: auto;width:100%;font-size:40%;}
                    .publish-info {font-size:50%;}
                    .photo img {display: block;margin-left: auto;margin-right: auto;width:100%;}
      '''
PK�X�ۑ]((daily_mail.png�PNG


IHDR  ���IDATx�c`��F[4j�H��'r�`�΢�7���\�#|��]O���v�X�Cv���߿��v?������������o!����Et_x����{�z�ax7�}��;\�ǯ�[Wݽ������L�?�%M��ς%��aj���ɬ���v�Ͼ���s4�Qdυ��#�ɛu
(nZ|��'D�|��n@q�Ƴ�YDɓ/cZD�}´�H��s,��L?p��?�t����|α�5,�޶����@��+T� s�U���8�h7,����h��G�8�J8D�}�~��;��"u"9g&�T�a�XO��X0m�#��=ymG���p����Y1�(cۍ��q@�hX�K$Lq���q�V^��	��vdM����|��$>ur�l;�.�����7��=���Y~��7���+Ơ]o�x��}�=`
�,e[q����.��M>t�;s�����1���G-��WU�>�IEND�B`�PK�X ���daily_mail.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals
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 TheDailyMail(BasicNewsRecipe):
    title = u'The Daily Mail'
    oldest_article = 2
    language = 'en_GB'

    __author__ = 'Kovid Goyal'
    simultaneous_downloads = 1
    max_articles_per_feed = 50
    use_embedded_content = False
    compress_news_images = True
    compress_news_images_auto_size = 8
    no_stylesheets = True

    keep_only_tags = [
        dict(name='h1'),
        classes('author-section byline-section'),
        dict(itemprop='articleBody'),
    ]
    remove_tags = [
        classes('related-carousel')
    ]

    feeds = [
        (u'Home', u'http://www.dailymail.co.uk/home/index.rss'),
        (u'News', u'http://www.dailymail.co.uk/news/index.rss'),
        (u'Sport', u'http://www.dailymail.co.uk/sport/index.rss'),
        (u'TV and Showbiz', u'http://www.dailymail.co.uk/tvshowbiz/index.rss'),
        (u'Femail', u'http://www.dailymail.co.uk/femail/index.rss'),
        (u'Health', u'http://www.dailymail.co.uk/health/index.rss'),
        (u'Science and Technology', u'http://www.dailymail.co.uk/sciencetech/index.rss'),
        (u'Money', u'http://www.dailymail.co.uk/money/index.rss'),
        (u'Property', u'http://www.dailymail.co.uk/property/index.rss'),
        (u'Motoring', u'http://www.dailymail.co.uk/motoring/index.rss'),
        (u'Travel', u'http://www.dailymail.co.uk/travel/index.rss')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll(attrs={'data-src':True}):
            img['src'] = img['data-src']
        all_h1s = soup.findAll('h1')
        for h1 in all_h1s[1:]:
            h1.extract()
        return soup
PK�X�ɻ��daily_mirror.png�PNG


IHDR���R*PLTE��;;�JJ�hh�ww�������������������N�EJIDAT[c`�Lw�pܽ�d���XP�`q�`@�������!R��t���}�7{0�A��IEND�B`�PK�Xx�}o��daily_mirror.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre import browser
import re


class AdvancedUserRecipe1306061239(BasicNewsRecipe):
    title = u'The Daily Mirror'
    description = 'News as provided by The Daily Mirror -UK'

    __author__ = 'Dave Asbury'
    # last updated 1/5/14
    language = 'en_GB'
    # cover_url = 'http://yookeo.com/screens/m/i/mirror.co.uk.jpg'

    masthead_url = 'http://www.nmauk.co.uk/nma/images/daily_mirror.gif'

    compress_news_images = True
    compress_news_images_max_size = 15
    oldest_article = 1.5
    max_articles_per_feed = 10
    remove_empty_feeds = True
    remove_javascript = True
    no_stylesheets = True
    ignore_duplicate_articles = {'title'}

    keep_only_tags = [
        dict(name='h1'),
        dict(name='div', attrs={'class': 'lead-text'}),
        dict(name='figure', attrs={'class': 'inline-image clearfix '}),
        dict(name='div', attrs={'class': 'styleGroup clearfix'}),
        dict(name='div', attrs={
            'class': 'widget relatedContents pictures widget-editable viziwyg-section-70 inpage-widget-2230659'}),
        dict(name='div', attrs={'class': 'body '}),
    ]

    remove_tags = [
        dict(attrs={'class': [
             'article sa-teaser type-opinion', 'image-gallery', 'gallery-caption']}),
        dict(attrs={'class': 'comment'}),
        dict(name='title'),
        dict(name='ul'),
        dict(name='ul', attrs={'class':  'clearfix breadcrumbs '}),
        dict(name='ul', attrs={'id': 'login-201109171215'}),
        dict(name='div', attrs={
             'class': ['inline-ad span-16 last', 'caption']}),
    ]

    preprocess_regexps = [
        (re.compile(r'- mirror.co.uk', re.IGNORECASE | re.DOTALL), lambda match: ''),
        (re.compile(r'<span class="image-credit">Getty</span>',
                    re.IGNORECASE | re.DOTALL), lambda match: ''),
    ]

    feeds = [
        (u'UK News', u'http://www.mirror.co.uk/news/uk-news/rss.xml'),
        (u'world News', u'http://www.mirror.co.uk/news/world-news/rss.xml'),
        (u'Sports', u'http://www.mirror.co.uk/sport/rss.xml'),
        (u'3AM', u'http://www.mirror.co.uk/3am/rss.xml'),
        (u'Lifestyle', u'http://www.mirror.co.uk/lifestyle/rss.xml')


        # example of commented out feed not needed
        # ,(u'Travel','http://www.mirror.co.uk/advice/travel/rss.xml')
    ]
    extra_css = '''
    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.politicshome.com/uk/latest_frontpage.html')
# look for the block containing the mirror button and url
        cov = soup.find(attrs={
                        'style': 'background-image: url(http://www.politicshome.com/images/sources/source_frontpage_button_92.gif);'})
        cov2 = str(cov)
        cov2 = 'http://www.politicshome.com' + cov2[9:-142]
# cov2 now contains url of the page containing pic
        soup = self.index_to_soup(cov2)
        cov = soup.find(attrs={'id': 'large'})
        cov = str(cov)
        cov2 = re.findall(
            r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', cov)
        cov2 = str(cov2)
        cov2 = cov2[2:len(cov2) - 2]
        # cov2 now is pic url, now  go back to original function
        br = browser()
        br.set_handle_redirect(False)
        try:
            br.open_novisit(cov2)
            cover_url = cov2
        except:
            cover_url = 'http://profile.ak.fbcdn.net/hprofile-ak-snc4/373019_6149699161_1710984811_n.jpg'

        return cover_url
PK�X���daily_telegraph.png�PNG


IHDR(-S�PLTEAt�Cu�Bu�Bt����Ct�Cu�Bu�Cv�Ct����������������Du����������Du�o��p��q��t��u����������Č�Œ�ȫ�ԯ�ձ�׷�ٸ�ڸ�۹�۹�۹�ܺ�ۿ����������������Hw�������������������Kx�Ly����Q|�^��b��h��i������������������i����X>�IDATx^=�E��@����y�����g�Z�����K��n.Y
˗�`2�?���ÅFx����Q��q5{q�z_�F����q��tK�s�AD�6�
�E�q�#
.Ja�
�x�P-NpCr�^-܋{B:���T:a��N�)M���h�_Ogp0���?�D��ޡV���>>��V���2UiC�t��˪bIEND�B`�PK�X�g�))daily_telegraph.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

'''
http://www.news.com.au/dailytelegraph/
'''
from calibre.web.feeds.news import BasicNewsRecipe


class DailyTelegraph(BasicNewsRecipe):
    title = u'Daily Telegraph'
    __author__ = u'Adrian G.'
    language = 'en_AU'

    description = u'Daily Telegraph News'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    no_javascript = True

    timefmt = ' [%A, %d %B, %Y]'
    encoding = 'utf-8'

    keep_only_tags = [dict(name='div', attrs={'id': 'story'})]

    extra_css = '''
                  h1{font-family:Georgia,"Times New Roman",Times,serif; font-weight:bold; font-size:large;}
                  .cT-storyDetails{font-family:Arial,Helvetica,sans-serif; color:#666666;font-size:x-small;}
                  .articleBody{font-family:Arial,Helvetica,sans-serif; color:black;font-size:small;}
                  .cT-imageLandscape{font-family:Arial,Helvetica,sans-serif; color:#333333 ;font-size:x-small;}
                  .source{font-family:Arial,Helvetica,sans-serif; color:#333333 ;font-size:xx-small;}
                  #content{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                  .pageprint{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                  #bylineDetails{font-family:Arial,Helvetica,sans-serif; color:#666666;font-size:x-small;}
                  .featurePic-wide{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                  #idfeaturepic{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                  h3{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;}
                  h2{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;}
                  h4{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;}
                  h5{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;}
                  body{font-family:Arial,Helvetica,sans-serif; font-size:x-small;}
                '''

    remove_tags = [
        dict(name='div', attrs={'id': ['comments', 'story-related-coverage']}),
        dict(name='div', attrs={'class': [
             'story-header-tools', 'story-footer', 'story-extras', 'story-related']}),
        dict(name='div', attrs={
             'class': ['promo-image', 'story-extras story-extras-2']}),
        dict(name='div', attrs={'class': ['assistive sidebar-jump']})
    ]

    feeds = [
        (u'Top Stories', u'http://feeds.news.com.au/public/rss/2.0/dtele_top_stories_253.xml'),
        (u'National News',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_national_news_202.xml'),
        (u'World News', u'http://feeds.news.com.au/public/rss/2.0/dtele_world_news_204.xml'),
        (u'NSW and ACT', u'http://feeds.news.com.au/public/rss/2.0/dtele_nswact_225.xml'),
        (u'Arts', u'http://feeds.news.com.au/public/rss/2.0/dtele_art_444.xml'),
        (u'Business News', u'http://feeds.news.com.au/public/rss/2.0/dtele_business_226.xml'),
        (u'Entertainment News',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_entertainment_news_201.xml'),
        (u'Lifestyle News',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_lifestyle_227.xml'),
        (u'Music', u'http://feeds.news.com.au/public/rss/2.0/dtele_music_441.xml'),
        (u'Sport',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_sport_203.xml'),
        (u'Soccer',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_sports_soccer_344.xml'),
        (u'Rugby Union',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_sports_rugby_union_342.xml'),
        (u'Property Confidential',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_property_confidential_463.xml'),
        (u'Property - Your Space',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_property_yourspace_462.xml'),
        (u'Confidential News',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_entertainment_confidential_252.xml'),
        (u'Confidential Biographies',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_confidential_biographies_491.xml'),
        (u'Confidential Galleries',
         u'http://feeds.news.com.au/public/rss/2.0/dtele_confidential_galleries_483.xml'),
    ]
PK�XP�`55daily_writing_tips.png�PNG


IHDR�a�IDATxڤ�C`41���m۶m۶m۶m۬m�����i��/0a�e> 	��
��$IK@uB��t���v�n���.�y4~>6��i؊�k6���5�w쩤7��i��\��F���k���J��>o�í�cp|����c�1K�u���M<;u�-�Gq~�z��;̙e��
�ɤy�6�O��{�-�?b*Ώ_��[?���mީ',�򆭜\���Spw�D�l%���qj�
N)N/YŁ)�8�r='H����gڈ��-a����{�#&h�u��/��t�vx~�ɥ6��8w�����}w�W�����nВezp{�~n��=t@]�����+'j����\ڸ�I�j30wB��Z�$����\hՓ�U���9�ؘ�vq�^{~:�#ǘT�6�6CH��y
3�D%~��|��	s9ݠ#��w�����*�`�a.T���K�GЮ7�j��(+@�y�ȘWO�<J���q>o�+ghIEND�B`�PK�X�|���daily_writing_tips.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class DailyWritingTips(BasicNewsRecipe):
    title = u'Daily Writing Tips'
    language = 'en_GB'
    __author__ = 'NotTaken'
    oldest_article = 7  # days
    max_articles_per_feed = 40
    use_embedded_content = True
    no_stylesheets = True
    auto_cleanup = False
    encoding = 'utf-8'

    feeds = [
        ('Latest tips',
         'http://feeds2.feedburner.com/DailyWritingTips'),
    ]
PK�X�t����dailyreckoning.png�PNG


IHDR��h6�IDATx�
�߫Q��5g��0;0�@�
A���xB"Q^�ɿ�o��M
!�$E(��E��u�{wg�̙�k��~��
��1��`�5���@Xj����v�he^
�Ƌ��y>0l�ݐ0�4Ð{�F�r*h�������(�(�`��l�]��+�>`Gu�*Pq+]�#La!��`�$���w��Λΐ����$�4++�!�G�]'��O��/5韩/��K�O��b�k�ܾ����9ٰ,�-r��W����xp%�}���>��o�^��4�ߙ�:�?Ԛ�H=X�,ʜz����o"p�3	��>�y�YH��
�3ɋ����T�i<b�	=���K*{!~�h�ںmIY��D<f{���X[*!�����j�GR)5��i���GI�ܚ0���aG��*� �ԉ���-��Y�����)V'�o�<�G����zc	��΅~��~��BX�y��S�H7
�^���jɱSk�o�vǶ�m�ܿj�;>>�=�,�뛗�'��no���������;k{����ΰ5��B2sQd�,E�B�/�Tު���F��F���a��45���)�9���bL5b$��.��Fc!Fb���yNyEBG�⵺�!FK��#;�ӣ#�Ɉ�A`��m�+q�ْ3�\)���}etaR,a0R֏���e3��$IEND�B`�PK�X�u��vvdailyreckoning.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
dailyreckoning.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class dailyreckoning_us(BasicNewsRecipe):
    title = 'The Daily Reckoning - US edition'
    __author__ = 'Darko Miletic'
    description = 'Worldwide business and financial news and articles'
    publisher = 'Agora Financial, LLC.'
    category = 'news, business, finances, money, banking'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'
    extra_css = ' #BlogTitle{font-size: x-large; font-weight: bold} #BlogDate{font-size: small} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Articles', u'http://feeds.feedburner.com/dailyreckoning?format=xml')]

    keep_only_tags = [dict(name='div', attrs={'id': 'Outline'})]

    remove_tags = [
        dict(name=['object', 'link', 'base']), dict(
            name='hr', attrs={'class': 'Divider'})
    ]

    remove_tags_after = dict(name='hr', attrs={'class': 'Divider'})

    def get_article_url(self, article):
        return article.get('feedburner_origlink', article.get('link'))

    def print_version(self, url):
        return url + 'print/'
PK�XqF#Cdailytportal.png�PNG


IHDR(-SEPLTE$3#2$3%4$5$7%4#3$/#1<^hqlv��������������������������������k�)��IDATx�	R�Ĵ2��Y����JLj�Heµ]���G�Z��4�h�������Q�TR�g?��x���ιU5�����B�
��.-x�%z-�đs�<�{��s �@a *󳻈 (��'@ h!�?�+���%IEND�B`�PK�X�ڏ/dailytportal.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
daily.tportal.hr
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Pagina12(BasicNewsRecipe):
    title = 'Daily tportal.h'
    __author__ = 'Darko Miletic'
    description = 'News from Croatia'
    publisher = 'tportal.hr'
    category = 'news, politics, Croatia'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'en_HR'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    extra_css             = """
                               body{font-family: Verdana,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                               h1,h2{color: #2D648A; font-family: Georgia,serif}
                               .artAbstract{font-size: 1.2em; font-family: Georgia,serif}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link', 'embed', 'object', 'iframe', 'base']), dict(
            name='div', attrs={'class': 'artInfo'})
    ]
    remove_attributes = ['lang']

    keep_only_tags = dict(attrs={'class': 'articleDetails'})

    feeds = [(u'News', u'http://daily.tportal.hr/rss/dailynaslovnicarss.xml')]

    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 = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�X����dainik_bhaskar.png�PNG


IHDR  ��tRNSn��SIDATx^�Vio#�}���d��9�=��c<`�S �l�n���o�l��E�dC��̌��C�lAェb�i��!��3DPf`@���J������+�k��d�D��,b�<�(
+�Vvae:��/kd�1�\Vr����y��~r�b���s�[��In�v:�����Ϻ�@.N��s��7������/�\߿+>����.L����|�Z�����fPU8��H��G�z�����.�/(2"��8�--�x\��=w4��!�v�����@m?'P	�*�G��	x%��و�/�W 'D~�m���;t2t��Ӄ�U�v��نތ$�����.��р�<�2�;�l`I���^�s�=�h�ĩ}�[;��9?��0�_k4(�L���4``R�(ɐ3��:j4���LW��t����Cys��O�۳��8�rO��ܹF
Ƥ����H&�g������
V�nU$�>c���CW�����uP�G����P�6@��aI������G=T���+e��=]
u��3L�J��w#�(�c��a�a���av:
���{\�T�	�v�ةP
�t6���wd�e��T%z��CF~(�/\
q֕��ce[����tI��AD�ee�����t�d�e���!(#dו��S+�e�bu�#��)�T9��L�I�@F]1�D�����EI2'�!19S3�,��J�Gx�LGJY"������|��yl):u1��l�
YZ7_��q�7�|'���a��X7�$kh�:jZ�����څy���脘b\E��e��ZP��'�B��0�����ق��λ������L�+]X��$0]�~��)n�ְ���#т)B�k<-�����"�V���/��\/���Cs5i�gm�I"�:*����w����c\���|t��?� `5�kbfJ�{�Q��"3��,YCʆmj�9�8��U���[��+��M����v��5T�@:o�Z%2<�3$�##�Bu{�{��T��?^5?\�?]���]xSM��:G��f��$�q���楱��������p�x��	�z7Uk��huU]�Դ�q^�Y��aޢ�P�;��[���Ok=u��5ѿ^i���Ӈ';���^[�5���|m�'|�ǯv�p��elO�u����WO����ˉ�ͬ��]��@N��|$�!���E��~4ov�\M†	���q7ä����w�A��>�2�aXq�@���N�x\�툧Uܑu
��˯ ���Q�GI����u��WQ?{�~"`@�}M]��p����4�cIEND�B`�PK�X>Ο���dainik_bhaskar.recipe#!/usr/bin/env  python

from calibre.web.feeds.news import BasicNewsRecipe, classes


class DainikBhaskar(BasicNewsRecipe):
    title = 'दैनिक भास्कर'
    description = (
        'Dainik Bhaskar is an Indian Hindi-language daily newspaper owned by the Dainik Bhaskar Group.'
        ' It is ranked 4th in the world by circulation and is the largest newspaper in India by circulation.')
    language = 'hi'
    __author__ = 'unkn0wn'
    oldest_article = 1  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    masthead_url = 'https://tse4.mm.bing.net/th?id=OIP.t6kK1-rSpzNbSerwzD5qbQHaDY'
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}

    def get_cover_url(self):
        soup = self.index_to_soup('https://epaper.bhaskar.com/')
        tag = soup.find(attrs={'class': 'scaleDiv'})
        if tag:
            self.cover_url = tag.find('img')['src'].replace("_ss.jpg", "_l.jpg")
        return super().get_cover_url()

    keep_only_tags = [
        classes('f5afa1d3'),
    ]

    remove_tags = [
        classes('_3c197847 _66d97d7f e0d43c76 bhaskar-widget-container-class _28e65306 _8adadf19 _07c65a39'),
        dict(name='svg'),
    ]

    feeds = [
        ('देश ', 'https://www.bhaskar.com/rss-v1--category-1061.xml'),
        ('ओपिनियन', 'https://www.bhaskar.com/rss-v1--category-1944.xml'),
        ('विदेश ', 'https://www.bhaskar.com/rss-v1--category-1125.xml'),
        ('ओरिजिनल', 'https://www.bhaskar.com/rss-v1--category-4587.xml'),
        ('बिजनेस', 'https://www.bhaskar.com/rss-v1--category-1051.xml'),
        ('स्पोर्ट्स ', 'https://www.bhaskar.com/rss-v1--category-1053.xml'),
        ('मैगजीन ', 'https://www.bhaskar.com/rss-v1--category-1057.xml'),
        ('करिअर ', 'https://www.bhaskar.com/rss-v1--category-11945.xml'),
        # https://www.bhaskar.com/rss
    ]
PK�XL����
dallas.png�PNG


IHDR  ��tRNSn���IDATH�cP�W�)b0���ih�������@EY9Y�ɱ���ó��A]YE^Z��Ʃ((�k�8�چ%��EGD8�ک**�+6dd�<y�d���-MMe%�U���֭]{���gO�~����ϟ߿����,M��x�k���9}�?q`��uX�_]{��Ϳ�"���ϟ���?x����ׯ_�#"�aHr*���.�˟��?kƌys�Ι5k�����>V��6�K-�[���E��K��:7+{��m�e�E�����II���~��b���I"8�>mʔ߿�z�
hbqa!Pb7�Ϟ=�X�j�Jrr2�ׁ~~>|q��-[���"��|��	Ă5�W�c���Tvf&$2o݄ZL�@��9��Ҋ"��XXvwv���b�����	���Q�q�1Օ��޽#߂�ʪ'���
b�6�@C��<\\]������4��HO��+�9jAE%�xpsrv���{F��F�G��>u��+�At떽�
���HM�
�����,�x��-�AL*^���������׮�Y۔S-�A�LZ&?'b��
��VZ\L�d
��@���58 PK]�L�c0&��
�n�r�ԩĸx3cow���v+3s
U`QL�p֮YC�@W���˸���ݹs��˗?|�s���]����CB�Րl�P+�Ͽw�.�j��G�j���]�fFƤv�tL���
L����?~�@��W�ʀF�5q�@N~ɢE@#��_^R�O��`�]�~(u�q7gg\�Ԕ��}��I`<Cj|dL?m-�.�M�i��*l��u��	�@�4^�l8ᬓ�a�o�ެ�t`�:��5��%SWG���ڊҲ��l+s*[���d�nI2��5�r���ʗIEND�B`�PK�X���HH
dallas.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class DallasNews(BasicNewsRecipe):
    title = u'The Dallas Morning News'
    language = 'en'
    oldest_article = 2  # days
    max_articles_per_feed = 25

    no_stylesheets = True
    use_embedded_content = False
    auto_cleanup = True

    feeds = [
        ('News',
         'http://www.dallasnews.com/news.rss'),
        ('Local News',
         'http://www.dallasnews.com/news/local-politics.rss'),
        ('State Politics',
         'http://www.dallasnews.com/news/texas-politics.rss'),
        ('Religion',
         'http://www.dallasnews.com/life/faith.rss'),
        ('Crime',
         'http://www.dallasnews.com/news/crime.rss'),
        ('Celebrity News',
         'http://www.dallasnews.com/entertainment/celebrity-news/?rss&listname=TopStories'),
        ('Business',
         'http://www.dallasnews.com/business.rss'),
        ('Arts',
         'http://www.dallasnews.com/arts.rss'),
        ('Life',
         'http://www.dallasnews.com/life.rss'),
        ('Opinion',
         'http://www.dallasnews.com/opinion.rss'),
    ]
PK�X�9v�	danas.png�PNG


IHDR�a�IDATxڥ��aD'(���.%eŶm۶m۶m۶u��n��vϾ^�m�L��DDF��3�n���{�K7g�"�#���B�E�F�A��2��G̽�)<�"u�aՅ/D$��3��;�����?��<��;D��W�%�_C�A��C�������`i��H��Hu�x���V��������;�0�Zb��[?��
@��}�l���g�9�8�4���w�DFE����,��/��C�"ݎ"�E���<�	U�����u��Q���|�H; ���4�M?mp�8���u�~��i��`���{��o��4�K�]/�u���WH�H�������ͬ-@��/Mgũ��z��U�2p�֏����J�o"����asԗ�h>��
���5j[��L1M]mN��7(�!�#�]"��s��t�+�3��[|� ���)�h�"Ji��IEND�B`�PK�Xe^;;danas.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2008-2018, Darko Miletic <darko.miletic at gmail.com>'
'''
danas.rs
'''

from calibre.web.feeds.news import BasicNewsRecipe
from datetime import date


class Danas(BasicNewsRecipe):
    title = 'Danas'
    __author__ = 'Darko Miletic'
    description = 'Dnevne novine sa vestima iz sveta, politike, ekonomije, kulture, sporta, Beograda, Novog Sada i cele Srbije.'
    publisher = 'DAN GRAF d.o.o.'
    category = 'danas Dnevne novine politika drustvo ekonomija svet sport beograd vojvodina periskop terazije Beograd Srbija Novi Sad Nis Kragujevac Vojvodina politics Serbia'  # noqa
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = False
    use_embedded_content = False
    encoding = 'utf-8'
    masthead_url = 'https://www.danas.rs/wp-content/themes/danas/assets/public/images/danas-logo.png'
    language = 'sr'
    remove_javascript = True
    publication_type = 'newspaper'
    remove_empty_feeds = True
    auto_cleanup = True
    auto_cleanup_keep = '//div[@class="post-intro-above"] //h1[@class="post-title"] | //div[@class="post-intro-title"] | //div[@class="post-meta-wrapper"]'
    resolve_internal_links = True
    extra_css = """
                                .author{font-size: small}
                                .published {font-size: small}
                                img{margin-bottom: 0.8em}
                            """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    feeds = [
        (u'Politika', u'https://www.danas.rs/rubrika/politika/feed/'),
        (u'Drustvo', u'https://www.danas.rs/rubrika/drustvo/feed/'),
        (u'Dijalog', u'https://www.danas.rs/rubrika/dijalog/feed/'),
        (u'Ekonomija', u'https://www.danas.rs/rubrika/ekonomija/feed/'),
        (u'Svet', u'https://www.danas.rs/rubrika/svet/feed/'),
        (u'Sport', u'https://www.danas.rs/rubrika/sport/feed/'),
        (u'Kultura', u'https://www.danas.rs/rubrika/kultura/feed/'),
        (u'Scena', u'https://www.danas.rs/rubrika/scena/feed/'),
        (u'Zivot', u'https://www.danas.rs/rubrika/zivot/feed/'),
        (u'Auto', u'https://www.danas.rs/rubrika/auto/feed/'),
        (u'IT', u'https://www.danas.rs/rubrika/tehnologije/feed/'),
        (u'Ljudi', u'https://www.danas.rs/rubrika/ljudi/feed/'),
        (u'Beograd', u'https://www.danas.rs/rubrika/beograd/feed/'),
        (u'Famozno', u'https://www.danas.rs/kolumnista/svetislav-basara/feed/'),
    ]

    def get_cover_url(self):
        months = ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul',
                  'avgust', 'septembar', 'oktobar', 'novembar', 'decembar']
        td = date.today()
        monthname = months[td.month - 1]
        lurl = td.strftime("https://www.danas.rs/naslovna/naslovna-strana-za-%d-" + monthname + "-%Y/")
        soup = self.index_to_soup(lurl)
        al = soup.find('div', attrs={'class':'corax-image'})
        if al and al.img:
            return al.img['src']
        return None
PK�X����dark_horizons.png�PNG


IHDR(-S0PLTE�����M��'��j
�>	�	a
=	
%.��m�zIDATx�An� �l�v)4�k<�GF�ýu�zo�_���a���	(�"`FA�"���!��l���0��Q"c�O���$(���a>��ҵ�^�n]��r=��z�F:���IEND�B`�PK�XFʂB,,dark_horizons.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1317580312(BasicNewsRecipe):
    title = u'Dark Horizons'
    language = 'en'
    __author__ = 'Jaded'
    description = 'News, images, video clips and reviews of current and upcoming blockbuster films. '
    category = 'movies, tv, news'
    oldest_article = 7
    max_articles_per_feed = 100
    cover_url = 'http://a4.sphotos.ak.fbcdn.net/hphotos-ak-ash2/164168_148419801879765_148410081880737_225532_464073_n.jpg'
    masthead_url = 'http://www.darkhorizons.com/graphics/2/logo_print.png'
    auto_cleanup = True

    feeds = [
    (u'News', u'http://www.darkhorizons.com/feeds/news.atom'),
    (u'Features', u'http://www.darkhorizons.com/feeds/features.atom'),
    (u'Reviews', u'http://www.darkhorizons.com/feeds/reviews.atom')]
PK�XK�����dark_reading.png�PNG


IHDR���R-PLTEBBBXXXkkk}}}����������������������������f��KIDAT�c` �{�����[��9/�-`�{��N�� ��]���^�w`)�\P�,��_'ؽaxA�U)? eF��8IEND�B`�PK�XfF�#dark_reading.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2014, Brandon S Allbery <allbery.b at gmail.com>'
'''
Dark Reading:  protect the business.  enable access.
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DarkReading(BasicNewsRecipe):
    title = u'Dark Reading'
    __author__ = 'Brandon Allberry'
    language = 'en'
    description = u'Dark Reading is the premier online resource helping information security professionals manage the balance between protection and access. It offers breaking news and analysis on attacks, breaches and vulnerabilities, as well as strategies for protecting enterprise data. It also offers guidance on setting risk management and compliance policies.'  # noqa
    oldest_article = 7
    max_articles_per_feed = 100
    keep_only_tags = [dict(attrs=['article-content', 'heading'])]
    masthead_url = u'http://img.deusm.com/darkreading/DR-logo.png'
    cover_url = u'http://img.deusm.com/darkreading/DR-logo.png'
    remove_tags = [
        dict(name='div', attrs={'id': 'first-level-nav-container'}),
        dict(name='div', attrs={'id': 'search-box'}),
        dict(name='div', attrs={'id': 'mobile-menu-nav'}),
        dict(name='div', attrs={'id': 'mobile-menu-profile'}),
        dict(name='div', attrs={'id': 'mobile-menu-search'}),
        dict(name='div', attrs={'id': 'mobile-menu-rss'}),
        dict(name='div', attrs={'id': 'second-level'}),
        dict(name='div', attrs={'id': 'third-level'}),
        dict(name='div', attrs={'id': 'aside-main'}),
        dict(name='div', attrs={'id': 'third-level'}),
        dict(name='div', attrs={'id': 'more-insights'}),
        dict(name='div', attrs={'class': 'more-insights-item'})
                   ]
    feeds = [(u'All', u'http://www.darkreading.com/rss_simple.asp')]
PK�Xٚ�TTdarknet.png�PNG


IHDR  D����PLTE�������������������������������������������������֬�������������δ����ʼ�Ҥ��̜������ʄ�Ҭ����μ�����d�ʴ�����d�œԾ��ʬ��d��̬�ܴ��ľ���dĺܼ��̾����̺�ľ�Ժ���$�´��ܴ���Dܾl��l�����ܼ�tܾ\��ļ������d��4Ķ�̶�ܪ�䪄�̶��dԮ�Ԫ��,�$Ԫ�̮��\�Dܞ�����������<̮ț��������,�TIJd��4�4�DĮl��|ܢd���������TĦ|��|̢t�4����T��ܢ<Ԟd�������4̚T�$�����t��\�����l�,�����dܒ�,ĒT̆|�$Ě$�ĒD�4܂D��DĆl��L��4��|�z��<��������t�~4����v|����4�n�v�~��vD����~D�~t�b�~�t��t��|�l�~T�z|�f$�vL�zlt�|d���r�l~|d�ttv�lv�tvt�nTlv|T~�|nd�j<�b,\r|tb��bLvtdn\�^<�bdflLn|Tf��V,|^<�VDDb�<f�lf$Tf\Df�LfldZ\�RT^dd^4lNl\VlTZ\tN<TN�\VDdR<L^<|J$LVd\V4LRl\FdDRTlF$t>$\F4d>,DFTTF$LJ$\B�.d>d6$D:\l2T><:L,.4b(�htRNS@��f)IDATx�=QI��0}��N�4
- �$6��!��Bp�̑?�	��U�b=��m�6Nb'� Č�l��{#�0���Z�:��^ָ����l裡���%�ßI
���`��_t�V�ȥ���u���Br�")o����0��T�s�?}���C��Ny� �v�v�u����oN<ڮ��P�����Ѹ���K�Y�ҫ=?�p�g��������K��~�)�Z%�����p��L��
l�A�X�qk�=�{��bg�_8CQ�e��CB�7E\�ʨni<���rʐK/�Y���v���U�O���n��C
����=��k� �C��.�� 0�"�S"��OӸ��my�����q u�8@�M���O�<��U3!:���[%@
��e���{ ��rP|�3�q����]�n����*������4oR�yS7~a�=|�½��?�,B�Ih�j���/�'���6�
�I�^�:�<
�g͋���TrX�����WI��\bx����u��Lh0E?�����A�W�j���>g?��8�$ٻeB�
�k�Kd�}g�][W�d;���ܽ���;�=��O6�٦y2��_���[��V�ɑ��zP���+P[g�~����]�'� N�����'a�d�vsO��L0	��6`E״U�ʬ��0�F�o�*&ǑTe����h�T1s�&v�W�HQ:=�3�-4-�s
�O�#GH�����Mv��|Iŕ��}&��T�>���� L�ʈ��5QSDcA�gBJ�Tǩ��7��
⺫;�ԔIEND�B`�PK�X��__darknet.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch darknet.
'''

from calibre.web.feeds.news import BasicNewsRecipe


class darknet(BasicNewsRecipe):

    title = 'darknet'
    description = 'Ethical hacking and security news'
    __author__ = 'Oliver Niesner'
    language = 'en'

    use_embedded_content = False
    timefmt = ' [%b %d %Y]'
    max_articles_per_feed = 40
    no_stylesheets = True
    oldest_article = 180

    remove_tags = [dict(id='navi_top'),
                   dict(id='navi_bottom'),
                   dict(id='nav'),
                   dict(id='top-ad'),
                   dict(id='login_suche'),
                   dict(id='navi_login'),
                   dict(id='breadcrumb'),
                   dict(id='subtitle'),
                   dict(id='bannerzone'),
                   dict(name='span', attrs={'class': 'rsaquo'}),
                   dict(name='span', attrs={'class': 'next'}),
                   dict(name='span', attrs={'class': 'prev'}),
                   dict(name='span', attrs={'class': 'comments'}),
                   dict(name='div', attrs={'class': 'news_logo'}),
                   dict(name='div', attrs={'class': 'nextprev'}),
                   dict(name='div', attrs={'class': 'tags'}),
                   dict(name='div', attrs={'class': 'Nav'}),
                   dict(name='p', attrs={'class': 'news_option'}),
                   dict(name='p', attrs={'class': 'news_foren'})]
    remove_tags_after = [dict(name='div', attrs={'class': 'meta-footer'})]

    feeds = [('darknet', 'http://feedproxy.google.com/darknethackers')]
PK�X�Km��
data_news.png�PNG


IHDR  V%(tRNSv��8aIDAT8O��[HTQ�׾���9M���BARQbe�ea/Jh��ٓhD��D�]+�"�z�VXY�B���	�Ҡ��h"-*ʻ�،����Dć���k����0�4�	�R��4m��L���
0L	�� �X�@8��7�c�G��� �Td:�l"���@'�a������WA�;q�x�ɡSp�Դ$�`�� F���PU�Bh��<�EpV�H����!G��s�{<�\|ؾ2gA8!0���TK�g�ky��%?7��{r�~v�

	�n�4#P��p�6�����~P:�
�-��=V�{�n��?Qs�;���k�3��0ӭ����Ñ}���.����\�ni_��Xy;6��o7��\�̌����]E+R �1Y��u��N3T��0@�z�|w�<^,l1����P2k��#B�t�BΡwvV�͋ő�]����?�A���5_���OZ���;U]��gm�HK�7'�α���9d[�:oI�`�çU��7�?�S9�8T����Xo�u�R�Q=���押���E�o`yRS~����r;j\��o5���W[��-D��h~��$(4"l�T���(��	&~t�Du��IEND�B`�PK�Xr%���data_news.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1468055030(BasicNewsRecipe):
    title          		  = 'DataNews'
    __author__            = 'oCkz7bJ_'
    description           = 'Technology / Best Practice / Business'
    publisher             = 'Roularta Media Group'
    category              = 'news, information technology, Belgium'
    language              = 'nl_BE'

    oldest_article        = 2
    max_articles_per_feed = 100
    auto_cleanup   		  = True
    no_stylesheets        = True
    use_embedded_content  = False
    remove_javascript     = True

    cover_url    = 'http://datablend.be/wp-content/uploads/2014/01/Data_News_logo-short.jpg'
    masthead_url = 'http://datanews.knack.be/images/svg/logos/logo_Site-DataNews-NL.svg'

    # Source: http://datanews.knack.be/rss/
    feeds          = [
        ('Technology', 'http://datanews.knack.be/ict/feed.rss'),
        ('Opinie', 'http://datanews.knack.be/ict/opinie/feed.rss'),
        ('Gadgets', 'http://datanews.knack.be/ict/gadgets/feed.rss'),
        ('Foto', 'http://datanews.knack.be/ict/foto/feed.rss'),
        ('Nieuws', 'http://datanews.knack.be/ict/nieuws/feed.rss'),
        ('Reviews', 'http://datanews.knack.be/ict/reviews/feed.rss'),
        ('Startups', 'http://datanews.knack.be/ict/start-ups/feed.rss'),
    ]
PK�Xbj4,��
datasport.png�PNG


IHDR  szz�|IDATx^��	�Uՙǿ�s�}[/t7�,
�NK�
�0&PP	D	j���R.P��QSe�1�H&�&��3��S�@hYlVeh�n	�`wKw�׼~����s���ql�_��u�^��w����v��R
��Db+8��h
W�Y6��k�|�B�珛�S��={$ԭ=�Q��9s$��~HF��t��诇�M�V�mT]���6�ӽ�u����q�y��n�LQ����O���/��!��)
��.�\J��I��Β9QRboY�çzw�x��5��;��Wg���~�?�Ԇ��|����+^� h�P\���`������/ݳ��Ⱥ]�Cn�΂��K*�pG�0���鶌�Wm�4���5!�F���,�s{�7-]����=2d\ytA��w%|�g|�S�kvB�)����>��۟L�[w���\
c�j�U*
8T��t}YI�!Vt�Go�U�ྜ2���Մ�3@�AF)(h�����r�h�M8���e4!J!��o���,ԍ�"�0�r�ܹ������:��]}�F�JC_v�+�[�h=E�ꖷT
�N�nO����ze��c�]���g�2�`Μކ�&���ޚ��>��.0�L�&�Jk@��@@�B�>T��j�������	�}�Qƍ(+�]�)�cv��C��3#�ܜz>��;5 #��Wm$P!ϥ,p�{�	 b�o��\?���|ZS��{�i���%��7z?�:��`mS��S��k�KBNC���`\����MU{�fQ�q�u0���cS�4�X����6�sal�������u�-[x�;���쭊�G�:3=O�Φ�"��Z�Z��(x#���5�b�1�ם�'G���¶R�u�v��khY����1�Aa��オ�7�!���?��
Hz���s @m��)�gXD�;�~oZe��"�Q3����Z�%ju��/k)��}!˪-��r�`� ��;	ғŖ����L�l���D|IA�Bm��DP�D
���e����ƅ�C��&��e�o��W�����'�4<qjR��r��?v���('�MH:%	"��lli8����O
1xR| ��:#9�@��.�I��5��/#�f�I5�6���"��R{�ѣG-�W�ѥ��ȨV }h��}s.]��a6���e����D�g���픱��P
H�U�6P+dn$?���w����gR9۶��39W?�ͻ��4ߊ������7�,
ӓ����.?�����m1t=���y)0np#��✻Zɾ��nF��g'y;�����/���mӦ�tϗG��D3	����x�+���G��q6�6��O4Z�=vC,�hQ�avhi�[S���G�O���m
�Pc������	Ò[��O;������/e���f� x���Dw��#nA�ɖtAJ%�Qߜ�W���ֽ�NQ5���&v~���g�ӹ/��m`���l��|8%�q����7��0���	��+m�J-m$H *��&�S�����
-mQ���A4u���8��g9��s�d|LYY��ζA�,__kY�i��2��օ<m�6?c��){3(���BY6vU��>*���O'�ٹ����a�����Rޝ�|�LH55q>��C�/^p��`̹0v�C�῞�ɺ��c��8��J�fc�|V�{j�W
)�`���ɇ�k&8Z�78�+��H$E��%�!�+�h��P�so�mK�߳��Ц]�0�ip;"�6&@�1��V"go2R�ϥқ�/��iu�X9��q�d��)�]>���:r�3?�(�1���I)��JR����c ��PZ�3R\�$��w����IQ�y�wã=�����Lh�qk�!�,�Gaۺ���aG��[*���ˢ$2nx�+��QB��t F+2�h$�PJ�D!F)C@����ݝB�7(U�Bm�ɲD{"=�h[���O�"A��Ƹ���0����|���S#��\ػ���U���,e�f����1��W���jLP%5�!�נ�Ě'V��@@u]�����o�Z%V����Fˋ��|�@��5�
G���`X�=���?-q�[�-�
�1���@��PJAr�T2c�ֳ6���W��B�=���87
�U���0���d9-OG�T3�\4*!�c��	�GJ�HC;Y1M*eEm������TR�4��f-��M�[׼����iMkқU��&�$���0�F(���8����չ~�
��,H��6���Q��oA��(�\����p�P�/Ԁ�k�(�����ѿzV������ް:��B_�3��fSc��}S���IE���Y��RQ�tN�*2Z��;��wHj��s�Nk�ړΙ��,t�S���1`����N��]�M8c��u���%�Z9qIS'�u1C�cR
��
�|UD��֯*k���������i�A.�.Rf�]4�չ�j1�m%�#��BD$T
�n����>�����ԫ�O�~�g慌�%��i2M"+�(���9ủ&���q%X��7m��ox�&͘щ�&�"��k,Vgی����鶰C-Bi�竲��|��1f�Pj_��=g����q�3���TB-P4@�?�Z�909}ۈ��g�2_�uukKko5vpE�]�>�Z�Leǔ����F#�eϻn"���'���M���ʏ"�]YY<�~�te{F��|�F�tpi�t/]H����fvI�x�X���/��Kcc��G�wm��.��W���ӟ���a�G�?��u��=�lݱc|���϶��7����ݰz�����f�K�イ�<�_�����ܓ�����GAPp�IEND�B`�PK�X'����datasport.recipe__license__ = 'GPL v3'
__author__ = 'faber1971'
description = 'Italian soccer news website - v1.00 (17, December 2011)'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1324114272(BasicNewsRecipe):
    title = u'Datasport'
    language = 'it'
    __author__ = 'faber1971'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Datasport', u'http://www.datasport.it/calcio/rss.xml')]
PK�X^��FFdaum_net.png�PNG


IHDR  ��tRNSn���IDATx^��M�]gǟ�����-c��I�q��J��4�ָ(~ą�FPPJ� THWݩ��"�…�(�t�͢�P4鴍����ClK�̜{��~�������LQЇ?������9�p/�PZO�Ῥ茁�o�Ro@�42�'���?�u.��UΈ@$=f�@�CE��W^|n����?=R�;�v(Ns��w�YȸM#��0E���䙬B���S����V�{�ɳO�~��ʠ-�r�B���z�]�&�٠.�S�����?���w�]^�t��=D� �gg�-)J�Aq*�B�.%�Lw�s����eg
c$��ғ�"{Q����NAq`��h��wz��/���Qz7��2����o��xAT<ItP��W>���=���XZ��C�U[㇑T��*'3�x@�#r�<�t��UR���/��s��&Am��� d����(B�)�b�+�͂��P������B�~���sg��?��587P+������Gn�v��r�X�MM3�����|�d�XC��������೧��y~�1=A�����+/����K�������n?t+[��ʡ��^�����������C�I��r�rP�+�x�]�'Z�i�M5]\���K���O0���U��+��-������[�i�d��}��x�(F>F��[�R��i�Թ�O�^=q����+%'��ho������>�*E�|�s����P`�U�Q�/���oI�tS�%zMF�]~�m/�����H4F�9����=._~�Ƥ�h#*0��w<�s/��,B��"F�l�waJtU�
�]M]�b��P:@,��t�:Y{��$!�
�Z��w���b�Ӭ�N� �_m6��ԘP'_�>� ���@i�
��8q��-�0�S�Ey�U[Q{�jI盿�U�u,#��D�F�b�Zkf֥`�E�޺�?zre1uoL���]3o����7?�ę{�)�G�Cv�ڝ?#7�;yl���5�.��VqV�M��Ѽxe�����X9QR��R@�Goۯ)�X�5]���w����c���3��7e	�<���ׯ�Op#��/��@������@�ؑte����!��ܵuW��™��a��x�����=���8��8B�@�C�FK�(ž�Im[^]e��U�Z��`�yV�{f�i���߃��0�x�x�E�i�m'~���m�-��Bܘ��:����+�տ5��k�8���ݥ0�X��D����(YfK��d�2��p�S�1K
�\�o��\]+��[4���#	M�[���X¾�R9`�3$I�$=�*^���i|���>�@�r�zY�a	���G%���tC�;���'�=1�t�4zL�
��dG����3`.�L
b�bZ������n���`g�8�߭]��:o�%:��@@���Kw��
T^	�o.�1:BI�ߗ��/�t�?ɻ����������c��CIEND�B`�PK�X�,iWWdaum_net.recipeimport re
from datetime import date, timedelta

from calibre.web.feeds.recipes import BasicNewsRecipe


class MediaDaumRecipe(BasicNewsRecipe):
    title = u'\uBBF8\uB514\uC5B4 \uB2E4\uC74C \uC624\uB298\uC758 \uC8FC\uC694 \uB274\uC2A4'
    description = 'Articles from media.daum.net'
    __author__ = 'trustin'
    language = 'ko'
    max_articles = 100

    timefmt = ''
    masthead_url = 'http://img-media.daum-img.net/2010ci/service_news.gif'
    cover_margins = (18, 18, 'grey99')
    no_stylesheets = True
    remove_tags_before = dict(id='GS_con')
    remove_tags_after = dict(id='GS_con')
    remove_tags = [dict(attrs={'class': [
        'bline',
        'GS_vod',
    ]}),
        dict(id=[
            'GS_swf_poll',
            'ad250',
        ]),
        dict(name=['script', 'noscript', 'style', 'object'])]
    preprocess_regexps = [
        (re.compile(r'<\s+', re.DOTALL | re.IGNORECASE),
         lambda match: '&lt; '),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*){3,}', re.DOTALL | re.IGNORECASE),
            lambda match: ''),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*</div>', re.DOTALL | re.IGNORECASE),
            lambda match: '</div>'),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*</p>', re.DOTALL | re.IGNORECASE),
            lambda match: '</p>'),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*</td>', re.DOTALL | re.IGNORECASE),
            lambda match: '</td>'),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*</strong>', re.DOTALL | re.IGNORECASE),
            lambda match: '</strong>'),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*</b>', re.DOTALL | re.IGNORECASE),
            lambda match: '</b>'),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*</em>', re.DOTALL | re.IGNORECASE),
            lambda match: '</em>'),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*</i>', re.DOTALL | re.IGNORECASE),
            lambda match: '</i>'),
        (re.compile(r'\(\uB05D\)[ \t\r\n]*<br[^>]*>.*</div>', re.DOTALL | re.IGNORECASE),
            lambda match: '</div>'),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*<div', re.DOTALL | re.IGNORECASE),
            lambda match: '<div'),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*<p', re.DOTALL | re.IGNORECASE),
            lambda match: '<p'),
        (re.compile(r'(<br[^>]*>[ \t\r\n]*)*<table', re.DOTALL | re.IGNORECASE),
            lambda match: '<table'),
        (re.compile(r'<strong>(<br[^>]*>[ \t\r\n]*)*', re.DOTALL | re.IGNORECASE),
            lambda match: '<strong>'),
        (re.compile(r'<b>(<br[^>]*>[ \t\r\n]*)*', re.DOTALL | re.IGNORECASE),
            lambda match: '<b>'),
        (re.compile(r'<em>(<br[^>]*>[ \t\r\n]*)*', re.DOTALL | re.IGNORECASE),
            lambda match: '<em>'),
        (re.compile(r'<i>(<br[^>]*>[ \t\r\n]*)*', re.DOTALL | re.IGNORECASE),
            lambda match: '<i>'),
        (re.compile(u'(<br[^>]*>[ \t\r\n]*)*(\u25B6|\u25CF|\u261E|\u24D2|\(c\))*\[[^\]]*(\u24D2|\(c\)|\uAE30\uC0AC|\uC778\uAE30[^\]]*\uB274\uC2A4)[^\]]*\].*</div>', re.DOTALL | re.IGNORECASE),  # noqa
            lambda match: '</div>'),
    ]

    def parse_index(self):
        today = date.today()
        articles = []
        articles = self.parse_list_page(articles, today)
        articles = self.parse_list_page(articles, today - timedelta(1))
        return [('\uBBF8\uB514\uC5B4 \uB2E4\uC74C \uC624\uB298\uC758 \uC8FC\uC694 \uB274\uC2A4', articles)]

    def parse_list_page(self, articles, date):
        if len(articles) >= self.max_articles:
            return articles

        for page in range(1, 10):
            soup = self.index_to_soup('http://media.daum.net/primary/total/list.html?cateid=100044&date=%(date)s&page=%(page)d' % {
                                      'date': date.strftime('%Y%m%d'), 'page': page})
            done = True
            for item in soup.findAll('dl'):
                dt = item.find('dt', {'class': 'tit'})
                dd = item.find('dd', {'class': 'txt'})
                if dt is None:
                    break
                a = dt.find('a', href=True)
                url = 'http://media.daum.net/primary/total/' + a['href']
                title = self.tag_to_string(dt)
                if dd is None:
                    description = ''
                else:
                    description = self.tag_to_string(dd)
                articles.append(
                    dict(title=title, description=description, url=url, content=''))
                done = len(articles) >= self.max_articles
                if done:
                    break
            if done:
                break
        return articles

    def preprocess_html(self, soup):
        return self.strip_anchors(soup)

    def strip_anchors(self, soup):
        for para in soup.findAll(True):
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(
                        a.renderContents().decode('utf-8', 'replace'))
        return soup
PK�X�!���dawn.png�PNG


IHDR  D����PLTE���������*%'���"(#%������-(*���'"#,'(������ yxx���^]]���gff���0--������`_`���dcc	������ꁁ�% "	��Ԃ�����������/*,���ecc-,,��������º�����		SRR���2/0(%'���UTT������ECE977�������Ѵ��������0-/������>==VUUjii�������������*'(�����������������թ�����302���# "������0//	hfg\[[���������������������_^^0,-MKL���fde�������������ܵ��rqq VVV������>=>"  ,(*,((%""���}}|[Z[_]]caappp,%'���edda_`mkl}~���������[9�JtRNS@��f�IDATxڄ��1���$c|�m�nm۶m۶�k�l�L��{��X�U�`����X}7T���ξ�� X�;5i�����7P�jtM�d���^�1�PubkN�<���~�U���i4}�6B7<7�·��s����BVBM]Y�l+�;:���(���҈�,uf��ۗ��(i�W�a�7��Aٳ����Lh/�-�9�ͻk�Y��V�驀
�')���ɀ�V���\I�3�
���݀��|�X�E2n�c��}�6�\qȑ^9�&��؀�#G�ɱ��\0P�^�*�Ezɹ�X�I0�iq�@]S�+���^�.u_�

�G~[ٵ0�~�˿}�����#(�I�v��<���Y���%�^5�P0Qӛ���W7��7W��}��9s��_r:��ˈȼP�#+0��"��K�;��IEND�B`�PK�X?�jXdawn.recipefrom 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 DawnRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en_PK'
    version = 1

    title = u'Dawn'
    publisher = u'Dawn Media Group'
    category = u'News, Pakistan'
    description = u'Leading English Newspaper of Pakistan covering national & international news'

    use_embedded_content = False
    remove_empty_feeds = True
    oldest_article = 2
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'
    keep_only_tags = [
        classes('template__header template__main')
    ]
    # Feeds from
    # http://www.dawn.com/wps/wcm/connect/dawn-content-library/dawn/services/rss
    feeds = []
    feeds.append((u'Latest News', u'http://feeds.feedburner.com/dawn-news'))

    conversion_options = {'comments': description, 'tags': category, 'language': 'en',
                          'publisher': publisher}

    extra_css = '''
                body{font-family:verdana,arial,helvetica,geneva,sans-serif;}
                center {font-size: xx-small; color: #666666;}
                strong {font-size: small; font-weight: bold;}
                span.news_headline {font-size: xx-large; font-weight: bold; margin: 0em; padding: 0em}
                span.news_byline {font-size: x-small; color: #696969; margin-top: 1em;}
                '''
PK�X��_,--daytona_beach.png�PNG


IHDR  V%(sRGB����IDAT8�c�O0'o>��f�����O?~|�E����� ��i9�_�64���jůP�iV�= hp�
������@"�����u�?A��`�����5�ǯൽ�E�
��4�W��2�N�
>���_�G��C�_Zq((�
M���/^��8�A�ӆ��v�at���EU�͠���#c�h��;0@
}J&;𦨿���&�'��O���\�x_��q�1�IEND�B`�PK�Xw��0;;daytona_beach.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class DaytonBeachNewsJournal(BasicNewsRecipe):
    title = 'Daytona Beach News Journal'
    __author__ = 'BRGriff'
    publisher = 'News-JournalOnline.com'
    description = 'Daytona Beach, Florida, Newspaper'
    category = 'News, Daytona Beach, Florida'
    oldest_article = 1
    max_articles_per_feed = 100
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en'
    filterDuplicates = True
    remove_attributes = ['style']

    keep_only_tags = [dict(name='div', attrs={'class': 'page-header'}),
                      dict(name='div', attrs={'class': 'asset-body'})
                      ]
    remove_tags = [dict(name='div', attrs={'class': ['byline-section', 'asset-meta']})
                   ]

    feeds = [
        # ####NEWS#####
        (u"News", u"http://www.news-journalonline.com/rss.xml"),
        (u"Breaking News",
         u"http://www.news-journalonline.com/breakingnews/rss.xml"),
        (u"Local - East Volusia",
         u"http://www.news-journalonline.com/news/local/east-volusia/rss.xml"),
        (u"Local - West Volusia",
         u"http://www.news-journalonline.com/news/local/west-volusia/rss.xml"),
        (u"Local - Southeast",
         u"http://www.news-journalonline.com/news/local/southeast-volusia/rss.xml"),
        (u"Local - Flagler",
         u"http://www.news-journalonline.com/news/local/flagler/rss.xml"),
        (u"Florida", u"http://www.news-journalonline.com/news/florida/rss.xml"),
        (u"National/World",
         u"http://www.news-journalonline.com/news/nationworld/rss.xml"),
        (u"Politics", u"http://www.news-journalonline.com/news/politics/rss.xml"),
        (u"News of Record",
         u"http://www.news-journalonline.com/news/news-of-record/rss.xml"),
        # ###BUSINESS####
        (u"Business", u"http://www.news-journalonline.com/business/rss.xml"),
        # (u"Jobs", u"http://www.news-journalonline.com/business/jobs/rss.xml"),
        # (u"Markets", u"http://www.news-journalonline.com/business/markets/rss.xml"),
        # (u"Real Estate", u"http://www.news-journalonline.com/business/real-estate/rss.xml"),
        # (u"Technology", u"http://www.news-journalonline.com/business/technology/rss.xml"),
        # ###SPORTS####
        (u"Sports", u"http://www.news-journalonline.com/sports/rss.xml"),
        (u"Racing", u"http://www.news-journalonline.com/racing/rss.xml"),
        (u"Highschool", u"http://www.news-journalonline.com/sports/highschool/rss.xml"),
        (u"College", u"http://www.news-journalonline.com/sports/college/rss.xml"),
        (u"Basketball", u"http://www.news-journalonline.com/sports/basketball/rss.xml"),
        (u"Football", u"http://www.news-journalonline.com/sports/football/rss.xml"),
        (u"Golf", u"http://www.news-journalonline.com/sports/golf/rss.xml"),
        (u"Other Sports",
         u"http://www.news-journalonline.com/sports/other/rss.xml"),
        # ###LIFESTYLE####
        (u"Lifestyle", u"http://www.news-journalonline.com/lifestyle/rss.xml"),
        # (u"Fashion", u"http://www.news-journalonline.com/lifestyle/fashion/rss.xml"),
        (u"Food", u"http://www.news-journalonline.com/lifestyle/food/rss.xml"),
        # (u"Health", u"http://www.news-journalonline.com/lifestyle/health/rss.xml"),
        (u"Home and Garden",
         u"http://www.news-journalonline.com/lifestyle/home-and-garden/rss.xml"),
        (u"Living", u"http://www.news-journalonline.com/lifestyle/living/rss.xml"),
        (u"Religion", u"http://www.news-journalonline.com/lifestyle/religion/rss.xml"),
        # (u"Travel", u"http://www.news-journalonline.com/lifestyle/travel/rss.xml"),
        # ###OPINION####
        # (u"Opinion", u"http://www.news-journalonline.com/opinion/rss.xml"),
        # (u"Letters to Editor", u"http://www.news-journalonline.com/opinion/letters-to-the-editor/rss.xml"),
        # (u"Columns", u"http://www.news-journalonline.com/columns/rss.xml"),
        # (u"Podcasts", u"http://www.news-journalonline.com/podcasts/rss.xml"),
        # ###ENTERTAINMENT####    ##Weekly Feature##
        (u"Entertainment", u"http://www.go386.com/rss.xml"),
        (u"Go Out", u"http://www.go386.com/go/rss.xml"),
        (u"Music", u"http://www.go386.com/music/rss.xml"),
        (u"Movies", u"http://www.go386.com/movies/rss.xml"),
        # (u"Culture", u"http://www.go386.com/culture/rss.xml"),

    ]

    extra_css = '''
                    .page-header{font-family:Arial,Helvetica,sans-serif; font-style:bold;font-size:22pt;}
                    .asset-body{font-family:Helvetica,Arial,sans-serif; font-size:16pt;}

      '''
PK�X���dbb.png�PNG


IHDR  ���IDATH��Vio��"��S�x��,��%�R�8
���(�v�"@�/���F�h��.8ujر,QE4E��x�\�Ar�ECv] 藾�����<�>3��K��K�?�߽�힯���b.�:���Ǐi��d�م��^�gF���,��<o�&t�߿�z��$$����h������������.�dY�4m~~�T*�r���c���f�6��}�6��OQT��E���KKK�Ŏ`���+�꺎����!��v���x��>��8.���Ν;���p��>}
����k����.»��RUղ,PD�����SD}�;�t�#�8b��������}� GV�	�PQ����^4���‘�`�@%���w�"�Z�G`�����͛��݃%�@��%!PSƀ�/�!G|��X,&	Xݺu�\���b����$I#3�P�V���M����QB�gL�P��NNNR��G��
��y����m��M.s!$��Lۄ��v��F,�$�\��0�Aw�gc+�er<7={I�mȊ��ݮ�6�j�����K�]����%��8]��dw�ipU��d�o|��PЯ�;Z�i�f�V�7�'��N�����t:5���r�Z��z'��������ۦ�����V;���no+�J`g�Hdbj���v���ߎ����X,�P���dGW�I�(��ݗ����/��=1�R��~��7������h��ft�W���;�i���𢔘���|��������?��'?NVΈDeK�TU���zd�o��I0��م�V�{����Q�!m�j4� ���
A���^$]����G�<rH�cY/C�n>_�����G��#�H&�{��{���z�4O�$���{�(����zBD���pH�4�ïP��Xұ�z]�|J�t�'�X84�4�p�����]��ذ���/�(A�R,�?k���_?�՗U-�2GO���E��T�^9�iw��C��?]���IY4��Sj���D�����a���I���Õ��4Aۆ�N�f�z@���i"�`F��=�P>.���4j�ݭ�8v�B2fZv�t	(�r��hӲ�t�v�B��,_.W��o�6������͎jt�+��i;z=�$�����T2f'��C��t�ʕ+L�OW�M���2Ǣ�4�/�G��=sh�����D<aI���l��8����x2���j�\!i��$"���2�����X$��Ƭ�^��HSD���;�j���^�Ԭу�l$|���o|���A>�=xQ��2�#a�,Ų�W��}Z��G�����GG��̤,{�a��j�d��G��H�"�GO|�'�D�4�����R�㟾���9�n
x%29#{�'�c�q)�7Z��vZ�F����D:]o�\��r,������|�t*�X݅�wuj":7���<�]�� ���(����D*i�/y<Y����8:��v�F
�Z.�$'Sj�Y��(�d�����e{XrP8���]���J4N���I�z�r�V�	r��i-���]�l�{f����>��3��F�$�@pjvn���:#*��uȱϳ(_���8�o^\w�)�Eyr<�X9P(����[�4tl�i�b^E�ڥ���P��ڦ�+�!=ix�A��G��a9��6�:3�8�T��9�V*�G%q��R��m9 )�BQ6���^N��ۍZn��m�[Mv4��a��Nj�|@�V��}=��rbۥ+Ȱ���*j��ΐZ���I!��/��<m�V�r��آ�̥!��v�[8O	���l46^l4U�e詘�I�KP^�'����(93ðbދB�"�.ӫq�����w�Q�Gw:L�uF�j$�H������u��p��9irjf;�U8)[�6���y5L{05���;0�^�S��C�B��\����1s�f1�Bc1[�6i�Y][OO�_nmJ%��ۺ�L��<�2di��k��i�p��_U@��l���,��������c�hh�xCf�LDA���{�`�4����k ���¡�#���swX��91�l�y`����AM��aa0TI�Y�Y�bX;{te@�o�~��病!{��$@�����Z���K�(;5N�EgIEND�B`�PK�X��<+��
dbb.recipe# -*- coding: utf-8

__license__ = 'GPL v3'
__author__ = 'Luis Hernandez'
__copyright__ = 'Luis Hernandez<tolyluis@gmail.com>'

'''
http://www.filmica.com/david_bravo/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1294946868(BasicNewsRecipe):

    title = u'Blog de David Bravo'
    publisher = u'Filmica'

    __author__ = 'Luis Hernández'
    description = 'blog sobre leyes, p2p y copyright'
    cover_url = 'http://www.elpais.es/edigitales/image.php?foto=par/portada/1551.jpg'

    oldest_article = 365
    max_articles_per_feed = 100

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False

    encoding = 'ISO-8859-1'
    language = 'es'
    timefmt = '[%a, %d %b, %Y]'

    keep_only_tags = [
        dict(name='div', attrs={'class': ['blog', 'date', 'blogbody', 'comments-head',
                                          'comments-body']}), dict(name='span', attrs={'class': ['comments-post']})
    ]

    remove_tags_before = dict(name='div', attrs={'id': ['bitacoras']})
    remove_tags_after = dict(name='div', attrs={'id': ['comments-body']})

    extra_css = ' p{text-align: justify; font-size: 100%} body{ text-align: left; font-family: serif; font-size: 100% } h2{ font-family: sans-serif; font-size:75%; font-weight: 800; text-align: justify } h3{ font-family: sans-serif; font-size:150%; font-weight: 600; text-align: left } img{margin-bottom: 0.4em} '  # noqa

    feeds = [(u'Blog', u'http://www.filmica.com/david_bravo/index.rdf')]
PK�X&�Ӡ��de_redactie_be.png�PNG


IHDR  D���.PLTEU@@@�f3�+II�@9730<Z<�
6=:59537S>�
6UA�S@�86979987687766677VA�68T@�78687UB�TA�676T@�VB�77TB�7UA�TA�876767677VA�UA�7778ü���������6���������������������������������������7������������������������7���������7������7���������77�v�v�w�8���7~o�}m�{k����wh�7wf����sc����7���kY�������67���cQ�7aN�7���������UA�]J�]I�UA�ZG�ZF�7UA�77VB�7VB�7UA�cog��tRNS	%%&'()/68:?@ABMOTUZ^abbcddfnqrxxyz~�������������������������������������������������������������������������������������������������������������������������F����IDATxڵ���A��[۶m۶�nm{Y��fr�X��чw���c��Hj�� ��M�4�k��ˆ
��ݰa4Z�Y�y"֑\���<`69��v�+�fa��eSo`?�c5�l�a3'���a���u�ӱ��Zk�	�y�d6�E����-ئ���Nn�$�;�R~��S!�6r,f��=��4~�H�X�&�l�idO�[�\���`��\L ��c�K23�uw�T0y� `p��*�(�Ł`�t%���k:~M�����^�ͣi5Ҫpp���ss��;��]��}�l�sv���zFK�1��_N�_�xb9ҽ;�e��hxl>T��cN�o��͛��_tv����d���d�U��S�`����3>�wF�Tp�����`���m�W�[�"�C�8: 5ܿl���$IEND�B`�PK�XrE<�de_redactie_be.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe


class DeRedactie(BasicNewsRecipe):
    title = u'De Redactie.be'
    __author__ = u'erkfuizfeuadjfjzefzfuzeff'
    description = u'News from Belgium in Dutch'
    oldest_article = 7
    language = 'nl_BE'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='title'), dict(name='div', attrs={'id': 'intro'}), dict(name='h3'),
        dict(name='h1'), dict(name='span', attrs={'class': 'media_holder'}),
        dict(name='div', attrs={'class': 'divider image'}),
        dict(name='div', attrs={'class': 'paragraph'})
    ]

    feeds = [
        (u'Hoofdpunten', u'http://deredactie.be/cm/vrtnieuws?mode=atom'),
        (u'Binnenland', u'http://deredactie.be/cm/vrtnieuws/binnenland?mode=atom'),
        (u'Politiek', u'http://deredactie.be/cm/vrtnieuws/politiek?mode=atom'),
        (u'Buitenland', u'http://deredactie.be/cm/vrtnieuws/buitenland?mode=atom'), (
            u'Cultuur en Media',
            u'http://deredactie.be/cm/vrtnieuws/cultuur+en+media?mode=atom'
        ), (u'Economie', u'http://deredactie.be/cm/vrtnieuws/economie?mode=atom'),
        (u'Ook dat nog', u'http://deredactie.be/cm/vrtnieuws/ookdatnog?mode=atom'), (
            u'Regionaal Antwerpen',
            u'http://deredactie.be/cm/vrtnieuws/regio/antwerpen?mode=atom'
        ), (
            u'Regionaal Brussel',
            u'http://deredactie.be/cm/vrtnieuws/regio/brussel?mode=atom'
        ), (
            u'Regionaal Limburg',
            u'http://deredactie.be/cm/vrtnieuws/regio/limburg?mode=atom'
        ), (
            u'Regionaal Oost-Vlaanderen',
            u'http://deredactie.be/cm/vrtnieuws/regio/oostvlaanderen?mode=atom'
        ), (
            u'Regionaal Vlaams-Brabant',
            u'http://deredactie.be/cm/vrtnieuws/regio/vlaamsbrabant?mode=atom'
        ), (
            u'Regionaal West-Vlaanderen',
            u'http://deredactie.be/cm/vrtnieuws/regio/westvlaanderen?mode=atom'
        )
    ]
PK�XWk�9  de_standaard.png�PNG


IHDR��h6�IDATx�c�O"`x���ӧO_<��ѣǏ��M��ׯ_�xd������S&O�RS�����p�����*/-���P���s2�4Tմ�52�ҳ22V�Z��@??�gϞ
+*(`a`����_vF�����Ν=�����Žj�J�"��4TT?}�d�����@G��Ǐ��JQ�p�Y��-Z��!"4���DJb������ρڀz����~���'O�h(-*���jhlh�fc���IOM=r�0D���R�s�?{������
�\����_�~aѐ��
�~��5���u�,L�x�9�,�=<������0`�@O�8!�������t�}��!^����o߾)����B4�?���{��i�Ν�45����=kPZ]Y��n�j������,/-�:y��������&M�������
D��-�������cǎ%'$����޼qJ�ĵ�`%���b(�>lIEND�B`�PK�X����de_standaard.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
import re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1467571059(BasicNewsRecipe):
    title                 = 'De Standaard'
    __author__            = 'Darko Miletic, Aimylios, oCkz7bJ_'
    description           = 'De Standaard'
    publisher             = 'Mediahuis'
    category              = 'news, politics, Belgium'
    language              = 'nl_BE'

    oldest_article        = 2
    max_articles_per_feed = 100
    no_stylesheets        = True
    use_embedded_content  = False
    remove_javascript     = True

    cover_url    = 'http://www.standaard.be/extra/assets/extra/dslive/headers/ds-black.svg'
    masthead_url = 'http://tonysweb.be/m/img/tijdschriften/de_standaard.svg'

    # Source: http://www.standaard.be/rssfeeds
    feeds          = [
        # Nieuws
        ('Binnenland', 'http://www.standaard.be/rss/section/1f2838d4-99ea-49f0-9102-138784c7ea7c'),
        ('Buitenland', 'http://www.standaard.be/rss/section/e70ccf13-a2f0-42b0-8bd3-e32d424a0aa0'),
        ('Cultuur', 'http://www.standaard.be/rss/section/ab8d3fd8-bf2f-487a-818b-9ea546e9a859'),
        ('Media', 'http://www.standaard.be/rss/section/eb1a6433-ca3f-4a3b-ab48-a81a5fb8f6e2'),
        ('Economie', 'http://www.standaard.be/rss/section/451c8e1e-f9e4-450e-aa1f-341eab6742cc'),
        ('Sport', 'http://www.standaard.be/rss/section/8f693cea-dba8-46e4-8575-807d1dc2bcb7'),
        ('Beroemd en Bizar', 'http://www.standaard.be/rss/section/113a9a78-f65a-47a8-bd1c-b24483321d0f'),
        # Standaard.biz
        ('Overzicht', 'http://www.standaard.be/rss/section/a30afc42-3737-4301-8f8a-5b6833855457'),
        ('Economie', 'http://www.standaard.be/rss/section/212b8b54-bd91-4c8b-942c-8029e8797d36'),
        ('Bedrijven', 'http://www.standaard.be/rss/section/6aa8d4fa-4b9a-40d5-aa8f-87ac72472f27'),
        ('Consument', 'http://www.standaard.be/rss/section/46025691-2ec4-4a06-b6d7-9773686a24a7'),
        ('Beurs', 'http://www.standaard.be/rss/section/74cef9d1-3b28-4b90-943a-ce685bf6ed6e'),
        ('Marketing & Media', 'http://www.standaard.be/rss/section/9bdf4a14-f8bf-4439-aaf1-344181f73e73'),
        ('Mobilia', 'http://www.standaard.be/rss/section/270b7f8f-dd73-44cb-b622-9f7200a439a7'),
        # Lifestyle
        ('Mode', 'http://www.standaard.be/rss/section/3a4b39a1-e58f-42e4-8ae9-a0f90f97f27f'),
        ('Beauty', 'http://www.standaard.be/rss/section/51dd6a40-e297-409c-af25-9f0301159a1c'),
        ('Culinair', 'http://www.standaard.be/rss/section/ec1dbffa-a00b-48e6-96f0-00d215f90744'),
        ('Reizen', 'http://www.standaard.be/rss/section/eed96e23-ed90-4818-83ab-adabf8caf0f4'),
        ('Design & Wonen', 'http://www.standaard.be/rss/section/f4dd4e8d-6cb1-4eef-abc2-06b0e3d72de4'),
        ('Gezondheid & Psycho', 'http://www.standaard.be/rss/section/a166bb48-b6b4-4c1a-beb3-9f0301160b75'),
        ('Glamour', 'http://www.standaard.be/rss/section/06b5429e-beb1-4e76-909c-9f0301162a9c'),
        ('Lifestyleblog', 'http://www.standaard.be/rss/section/246d27cb-ce7b-4245-bad4-a09f0119b450'),
        # Weblogs
        ('Autoblog', 'http://www.standaard.be/rss/tag/autoblog'),
        ('Beursexperts', 'http://www.standaard.be/rss/tag/beursexperts'),
        ('En nu even elders', 'http://www.standaard.be/rss/tag/blog-en-nu-even-elders'),
        ('Marketingblog', 'http://www.standaard.be/rss/tag/marketingblog'),
        ('TV-blog', 'http://www.standaard.be/rss/tag/tv-blog'),
        # Interactie
        ('Opinies', 'http://feeds.feedburner.com/dso-meningen-opinie')
    ]

    keep_only_tags = [
        dict(name='header', attrs={'class':'article__header'}),
        dict(name='footer', attrs={'class':'article__meta'}),
        dict(name='article', attrs={'class':'article-full'}),
        dict(name='figure', attrs={'class':'article__image'})
    ]

    remove_tags = [
        dict(name=['embed', 'object']),
        dict(name='div', attrs={'class':['note NotePortrait', 'note']}),
        dict(name='ul', attrs={'class':re.compile('article__share')}),
        dict(name='div', attrs={'class':'slideshow__controls'}),
        dict(name='a', attrs={'role':'button'}),
        dict(name='figure', attrs={'class':re.compile('video')})
    ]

    remove_attributes = ['width', 'height']

    def preprocess_html(self, soup):
        del soup.body['onload']
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X��~|==deadspin.png�PNG


IHDR  ��IDATxڵ�M�A�{GE�*t�%M&2�>��������S���\6���Ld$�hҡPVY�=U��֜��g�������Z����'O�V��ſ����+��ho��?P���[7��ꊇ�����g�Q�O���*BRr!b�dP{��l�"���C��o-���>�t�PGڄ`�^��d+M�\n��*�Bv��b�w�}��dY
��X����|�	�J��p+\nfu]�t�N�՘MkNdǁ \��ba���{���LM1Ơ'C���;�^¥��`�H�>�=�7K`i��؊�;EU�!�j����k����b�A�քp��+Y �����wv{l�GR�!pA�S,�c���Ő$�L�x@�6S]�i�d�4����_X�"���{c��u%Q)���| 5I��>z���r�*C�3��в����޹\T���DyOn�@�]V��d�@�;�Sp>%<
ңuj߻^���%��s�TRPz�O���*)C�m��j��*�$hp!0��r�?n�7����TZI�c�-���r�ڤ�r���Ԁ��B��F�O)�Y�&X���.~'C��#�;/TN;�'9�uBӌM�82tY�\!���8٣��N$�}�ڷ�lR�� ��g_��>J$�u��H�*�[0�Iv��
�Y�LH�g���?�>��,w��.2-�R߻��C�2@���t�\�
���ɭ�����	)�т��W�����J�?<����y|岱昱�Ոyr����t6���!�fW�z#:��6���NS��d�*u,��{뺮��X��;��}Ժ2F�:�v���Y��t���1L [ji��>u<��{��	�\�7A�X��K��oa�@��g����ΕYa�Hj[�/��U1���![dF��CjZ�A�C����(�(%�R���Fj�l�)�{n,{'���`���cUe�/����`� d�m{ƏVaŌ;.�e�z�I�CkC�F|�a�X����Ɯ�V�,ؽ�N�쟴_�}����Z�ހ�=e��\dȠ�
J`R�����:ߑ
aV�C���˝�7o ��8�Rē��jWd��9I��s���lN�u�k�k׮Q�k(���1���c �}ד`�H���ޒ �Q`o�34�7@�ps�*�a
I���2�Ŝ���`��Ӏ!~A#����_�:R×ޢ��l�Ը��
߻���>�����/ln�I;��1V�c!�pIEND�B`�PK�X�l��deadspin.recipe__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
deadspin.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Deadspin(BasicNewsRecipe):
    title = 'Deadspin'
    __author__ = 'NA'
    description = "Deadspin, Sports News without Access, Favor, or Discretion."
    publisher = 'deadspin.com'
    category = 'news, sports, meltdowns'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = True
    language = 'en'
    masthead_url = 'http://cache.gawkerassets.com/assets/deadspin.com/img/logo.png'
    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        {'class': 'feedflare'},
    ]

    feeds = [(u'Articles', u'http://deadspin.com/rss/vip')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X?*�DDdebunkingdenialism.png�PNG


IHDR  ��	pHYs��~��IDATHǍV�sTY>�ݺӝ4i��#j���X�#8�T9�eY��f�/��b�O<������P���ld!��]�r�Nw��%�M������}���Z�.���y_|��3�'�PVYc}��wF��.z���9�
u��6<c?���	<��(�l�χ)%ŗv9ⲅ�X�v��V���[��)�Kq<
F.\�|��$g�߮#H)'�#��������yggG��L��֙ƚ�W�eݝ��`�r�J��Z]]��߿~�������.��z����S�Ne�`�m�	�n�{��=������RO�(�BH&/^�X�V�us�d� ev�,C8}X�8?~�xT*M��x���6�d�w:~	�m��g��M�4B�̲��� ]��k!;wv��X���5#�"E�e�)ˌ�R���P�`�0D=����J�:S�j�SV�,�9���m��r��� K�8g<J�̏�R�yR����P��3�+��z�ޘ�ח���1&�I�~����0�u�����g�fTo�*sz����v��BJ/�6!�*2C$���j�K�y0�,*�`������1����h8��r���%J��Ř�����{���N�j�Ђ�jN�"8x@!�剥3��չų�a��~��y������~t�rs0�d��<�QV\����6��9οV��,#����ƥo���ǎ�v:����Z��8��u6}vhK����0������ç{��6���<��ޱD����I�Kʵ��ӕ;��ø2��4�N�FO8:�6�a��N2���'��O�������3������~SC���i9֏�?���w���/�}p�Ӎ�ݓ��t��l��l����ŷ�y{��**vkk�4;w��?��Ü�I*ߣTY?�RKF9�9S|-�ݻ��^nI'V`Q<�.�
C�T�(
�|cfw�S�W��^�zTD��L���tQĥ'��$�:Ԋ�����cfI����3:OR�@9+����G�>q��
�hM�֕|�����ƾ(ѕ�Ϻ�ww�Q)
FU��k��;��<�f��bw{�jdY���u��M�@j�Z �'��T�eܛp�#�U
�ß�9����@,5�™23��Y�v?�*3`<
OQ1�8?t��_�4M�GI"�BB�v9!"�w��Dp�<��i�*�2Lc������D�̆��`���P���ۨ�Z�v�<@j�����a��p��F�:Z�<��C�R�r�t!
�^�h�Z�UD3[��b;H}q�p-[L*�<��h��R�r��?�U�\�8	�S����p����i��(�؉l1���j�T��fY���4�'�pYxLR�|/����0��e�%p�pɑ��DW�~4:�@�2��0�xK;�B8J�����<��U�mVO4_[t�ڵD3d&�i���@péP*�5/'$�!�'e�jTƆ���aJ��JFgr�2��&�?���3��fgg���'��OW��0��u��ǔ����q?�t8������V���܃�F����o�r_�-��s��R���Ȱ�ȫ��>@ϲ��ոұy
2�r�V�5�^����csK����.,.Ο���d��	C�>F�dXC��2��)�- ]����O��T��,W��O4z�7�h6�v��-���_�Nw��0�N�px��M�VtU�
%���q}JWv>�c��P.��,�w;�|���?X[[{�٣�˸�����|��~�+P-���?��J(���8�B�(�ɜ��gxaP��o�m0�mll^8w�ƍ��:=-�0�(=�QG<�8a�JB�IŒ��D
[a�Hd��T*�=}���q�+S<{���EO߽ׄ���;���.]���a���#��<�J�4C��8��%�&�1�<%Fn7dz���h��|����]'�i�
/�� ���c��Y���iy�IEND�B`�PK�Xk�OOdebunkingdenialism.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Bellingcat(BasicNewsRecipe):
    title = 'Debunking Denialism'
    __author__ = 'bugmen00t'
    description = 'Debunking Denialism is a website dedicated to the refutation of pseudoscience and denialism by applying scientific skepticism and defending evidence-based science. Fighting pseudoscience and quackery with reason and evidence.'  # noqa
    publisher = 'Debunking Denialism'
    category = 'blog'
    cover_url = u'https://i0.wp.com/debunkingdenialism.com/wp-content/uploads/2017/06/cropped-newestblavatar.jpg'
    language = 'en'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 60
    max_articles_per_feed = 10

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='div', attrs={'class': 'above-entry-meta'}),
        dict(name='time', attrs={'class': 'updated'}),
        dict(name='p', attrs={'class': 'ddtag'}),
        dict(name='div', attrs={'class': 'sharedaddy sd-sharing-enabled'}),
        dict(
            name='div',
            attrs={
                'class':
                'sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded'
            }
        )
    ]

    feeds = [('Debunking Denialism', 'https://debunkingdenialism.com/feed/')]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-orig-file': True}):
            img['src'] = img['data-orig-file']
        return soup
PK�XmOA�::deccan_herald.png�PNG


IHDR�aIDATxڬ���Y��,��m۶�b8�8c۶m�0�m�Kω�v�����%+3�BI{[��������1f��XZX|?@?��r�J��T� %9��������&(0Pl���������|� 8(��������X�?����Pcld�B� !![[[���ɔ�ssr����|�N��h�����NLt>>��=P�¹󘙙�R��y���ʪw�������\�r�sg�r��M������%//��p�<zLRR�����ڽp�����D�7�ߐ2�����*�������dT*���'5���é'���D������X�d)z�������@xx�X���,���pCBB� ���w��d555̘:M�y�U�WH�?'>.���g''l���;k6�6l`��s��I._�Ď���,!>-MMN?���;8�o?�Μ��_�V([8w+�-�Ёl۲��RNj����퍬�����8bcb�;V�9�(��f<:F�KdB��E���
|ng�.��gIEND�B`�PK�X~X-yydeccan_herald.recipefrom calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe, classes

class herald(BasicNewsRecipe):
    title = 'Deccan Herald'
    __author__ = 'unkn0wn'
    description = 'Deccan Herald is an Indian English language daily newspaper published from the Indian state of Karnataka.'
    language = 'en_IN'
    no_stylesheets = True
    remove_attributes = ['height', 'width', 'style']
    ignore_duplicate_articles = {'url', 'title'}
    encoding = 'utf-8'
    
    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/bengaluru-crime/', '/metrolife/',
            '/karnataka-districts/', '/brandspot/', '/entertainment/',
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping section')
            
        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name
    
    keep_only_tags = [
        classes('article-title article-author__name'),
        dict(name='div', attrs={'id':'main-content'})
        
    ]
    
    remove_tags = [
        classes(
            'storyShare social-media-icons in_article_video static_text'
            ' nl-optin-mobile dk_only article-banner-adver-wrapper wb_holder'
            ' field-name-field-tags section-full strip--business'
        )
    ]
    
    feeds = [
        ('Nation', 'https://news.google.com/rss/search?q=when:27h+allinurl:deccanherald.com%2Fnational%2F&hl=en-IN&gl=IN&ceid=IN:en'),
        ('Karnataka', 'https://news.google.com/rss/search?q=when:27h+allinurl:deccanherald.com%2Fstate%2F&hl=en-IN&gl=IN&ceid=IN:en'),
        ('Opinion', 'https://news.google.com/rss/search?q=when:27h+allinurl:deccanherald.com%2Fopinion%2F&hl=en-IN&gl=IN&ceid=IN:en'),
        ('City', 
            'https://news.google.com/rss/search?q=when:27h+allinurl:deccanherald.com%2Fcity%2F&hl=en-IN&gl=IN&ceid=IN:en'),
        ('Business', 'https://news.google.com/rss/search?q=when:27h+allinurl:deccanherald.com%2Fbusiness%2F&hl=en-IN&gl=IN&ceid=IN:en'),
        ('World', 
            'https://news.google.com/rss/search?q=when:27h+allinurl:deccanherald.com%2Finternational%2F&hl=en-IN&gl=IN&ceid=IN:en'),
        ('Sports',
            'https://news.google.com/rss/search?q=when:27h+allinurl:deccanherald.com%2Fsports%2F&hl=en-IN&gl=IN&ceid=IN:en'),
        ('Others', 'https://news.google.com/rss/search?q=when:27h+allinurl:deccanherald.com&hl=en-IN&gl=IN&ceid=IN:en'),
    ]PK�X��!��defensenews.png�PNG


IHDR  ��~IDATx�ܔ�<9��k�mM�Tw%��JW�]�Y���^ۻ�Y�m�6�{��S����Vj���$���~~�"�F�Y���T�,C}�@`��܃-��|��eb�٘�b�ve���^|U��D��X�"��]�"��<�%^"�R��Fͥ�<Z�/���_���U{3o����D˕�؅M2�*I)�fޱ�{�����G�L	�d��^�a�f��E2�l�w`���j��}�x9��Z7��-��e&0p^����C�2�zJ;�凒6�s*�!��*�Yy72}��]a�-�40��*y�Nd��v�nDe��~m`�5���z�����2��v�s�n�yw�>q�l1��������^|-Y��V�ߥ6�0���J72�]�>9������WY�!z��cg:�w8��óph�yR<h7^��4�}�M�A��8}���j�#p��p�ϊ�[��K^hލ��j�I��7����������3BƝѧYyW`�C�r���yF�=/z��#��)zd�h��~D�]/��$���WC�a7�27��x��4��fV��y~hV�E��僒.9���͉-���ک��^C˜|	�kFR�z�i�JN�!O]��B2�6�ΛXQ�7��!�q�]M��h��9��Z�7�=��r�z�7]���S#Պ�t�wYmF�C|�)h�v�.wz�/�]hJ�/CJ%d7��%Y"'�޻��u�˻��~��ײ�S2�"��$�(�)�$J�a%����xJ ��"B��1��K�����zv̽�ل2��K�aJ���'�V�R�M@h�2�۔s�~�����O?�tvv���E	YYY�eŔ�j'%P%��PB��)AM�~�`)Q���ӴL�_6n�8>>����������?�������(()ihh())���*++k�������������:��2�P(��pO��!(�"�W�BY*aC	�$J��$U�(@���
�*�RIE��r�`.�Cי93�?�Ό>ߟ��7�m�$�`0H��)��n7�r��p�t:��"��T*�-
��`�p8���౓$B���y<{��r�L�����l����f��fw�]�Ѩ����B�]��*�F��_.�_��j��N�����A�N�s>�'�I���v��t���,K$@���j��@%�C��'k��f3��X, ����0J��a�P[� �h4Z,Hl��Z�L�z���lV��Z��F�Q��C��hb�Iq!j�F"��������aSa��VT1)�B���z9���].W�R!�d2�ܞo��d�e6���8�@ʥR��j�`���)h�Z�†H�Z��Y!.љ��|��
�ː�W��v��_�?����p��A0IEND�B`�PK�X��/��defensenews.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
www.defensenews.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DefenseNews(BasicNewsRecipe):
    title = 'Defense News'
    __author__ = 'Darko Miletic'
    description = 'Find late-breaking defense news from the leading defense news weekly'
    publisher = 'Gannett Government Media Corporation'
    oldest_article = 31
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    ignore_duplicate_articles = {'url'}
    masthead_url = 'http://www.defensenews.com/images/logo_defensenews2.jpg'
    extra_css             = """
                               body{font-family: Arial,Helvetica,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                               .info{font-size: small; color: gray}
                            """
    remove_attributes = ['style', 'lang']

    keep_only_tags = [
        dict(attrs={'class': ['ody-hgroup', 'ody-article']}),
    ]
    remove_tags = [
        dict(name=['meta', 'link']),
        dict(attrs={'class': ['toolbar', 'toolsShareWrap', 'ody-bo-sm ',
                              'ody-comments', 'ody-related-links', 'left', 'right']}),
        dict(id=['factsMore', 'ody-nextstoryslider']),
    ]

    feeds = [

    (u'Europe', u'http://www.defensenews.com/rss/europe'),
    (u'Americas', u'http://www.defensenews.com/rss/americas'),
    (u'Asia & Pacific rim', u'http://www.defensenews.com/rss/asia-pacific-rim'),
    (u'Middle east & Africa', u'http://www.defensenews.com/rss/middle-east-africa'),
    (u'Air', u'http://www.defensenews.com/rss/air-warfare'),
    (u'Land', u'http://www.defensenews.com/rss/land-warfare'),
    (u'Naval', u'http://www.defensenews.com/rss/naval-warfare')
    ]
PK�X�s�v��degentenaar.png�PNG


IHDR  D����PLTEu�8������鄼��F��N���Š����%�����������,�ɍ��2��6��y�;��y�|�U��\��^��k��q��r��|��~�,�Ɏ���������u��î���������w�����"��������������������w�x���H�IDATx^���1Eї2�����*��h�4�v�ʋ��e�@T`����<S��Kf;0���_�����̗`k1G����6\2@��"�������h��Z����E=x�����@Y����s��jaB�}L,#�F0��S��j6��|d�����IEND�B`�PK�X+����degentenaar.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.nieuwsblad.be
'''
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class DeGentenaarOnline(BasicNewsRecipe):
    title = 'De Gentenaar'
    __author__ = 'Darko Miletic'
    description = 'News from Belgium in Dutch'
    publisher = 'De Gentenaar'
    category = 'news, politics, Belgium'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'nl_BE'

    lang = 'nl-BE'
    direction = 'ltr'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + \
        category + \
        '"\noverride_css=" p {text-indent: 0cm; margin-top: 0em; margin-bottom: 0.5em} "'

    keep_only_tags = [dict(name='span', attrs={
                           'id': ['lblArticleTitle', 'lblArticleIntroduction', 'lblArticleMainText']})]
    remove_tags = [dict(name=['embed', 'object'])]

    feeds = [

    (u'Snelnieuws', u'http://feeds.nieuwsblad.be/nieuws/snelnieuws'),
    (u'Binnenland', u'http://feeds.nieuwsblad.be/nieuws/binnenland'),
    (u'Buitenland', u'http://feeds.nieuwsblad.be/nieuwsblad/buitenland'),
    (u'Economie', u'http://feeds.nieuwsblad.be/economie/home'),
    (u'Economie', u'http://feeds.nieuwsblad.be/economie/home'),
    (u'Algemeen', u'http://feeds.nieuwsblad.be/life/algemeen'),
    (u'Film', u'http://feeds.nieuwsblad.be/life/film'),
    (u'Boek', u'http://feeds.nieuwsblad.be/life/boeken'),
    (u'Muziek', u'http://feeds.nieuwsblad.be/life/muziek'),
    (u'Podium', u'http://feeds.nieuwsblad.be/life/podium'),
    (u'TV & radio', u'http://feeds.nieuwsblad.be/life/tv')
    ]

    def print_version(self, url):
        return url.replace('/Detail.aspx?articleid', '/PrintArticle.aspx?ArticleID')

    def get_article_url(self, article):
        return article.get('guid',  None)

    def preprocess_html(self, soup):
        del soup.body['onload']
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll('span'):
            item.name = 'div'
            if item.get('id') == 'lblArticleTitle':
                item.name = 'h3'

        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return soup
PK�Xk(�--delco_times.png�PNG


IHDR  ���IDATx^��[odGǫ�o��u�]g�J-"B<�o<�"y�	m����e�8�@��:�����3s�}NWS�3c#0���ߥ��_��=#~��WG���b�$�Z��0��=���B!E�Ou�ό|����D���Yќ\V��\+��-@
�
�1b
�3t��P�#b
O�6�1jn�6Z��ڣE}�pMc+z���H�*4%P�i!BD�)T�Un8�ȑ�遠�d��ܒժ�ЅP����������{��q�$�.)QB Gnpǧ�_����u���PjO52:ϔ[g-���͏��Ż�g?���=T&A&n
���u��9���=�V`5Hi�s3�JI%�R�;��V����w@}?��� ���d���`��7���#0M+O�IxD�ңr��j�,*��B(��(����Q�i���)Ak��V��ѡUӲV�i�gZ[k
�d&�w]�wmW�U���=o���D E"G.2�d�8�0/{:<z����<��_�<8{���t)X���7/_���������BZ�r�:Bp�/E �e0�y=��Y#?������߾�8?�9�Ɉ|]�ߝ�=���������Ҁ�F3w
LL�i�8R�23 v�Ɠ˶t�\��r��i��p[ ��
��韕�i%iqj��d.���H�I���viu*�i�-��KeP�F@�� ��l�����`�с@��(nV�TT:ge�߁�w`N�f�[�!%�,7wv��]�MLf��֖��:q�!��h#`$Ug
�2Q��;!�T#k�x���C��N8*��Z�[CO�49J%�����(z����@�v��\7�uS�|s�D� �P@�(��A���5I�
%,
�v�.�(\�"f\��M��8�r�
V��Xu�8�����Ηp��KF�\,�,�����װ-[�|Y�b=��s�E�v�(���p�������j;h]T����#�<S�X�ɇ~��Z����Z�B�0�����|���\7�M����&��x��Z��
��F%mo�@l��gC��eϺʺF�B�����-I7Y�ص\�6�p��,Q��tÄ��-�n�'������@D�K���B4ZYc�5BJX��R���
�$��B�^���n֨�(�L�BjHf�l�ٱ�V�\��:]��D�I�=�O�}�O�ځ}�k�b����hˢOV��ˢ�ڮ�
I�ֹ�P��',�a��� �U�}S�%�8�{q�����<y��Ǐ?`{����|��ǧ�e���#�)[H�񶜎�+7�HəQ�\�\繞'?�r�1���{�B��׿~�����ǿ��ç�����5�1���lb�Ī�tÄ\3v��z�3�D�B�
6�
��Z���&�<p]q��,����&e�P\M�$��o�̨�����LՃY�*
E�GFI�D���P���.���t0����A�zNE<Q7�<ؙ�;�g/��8X[IEND�B`�PK�X��=��delco_times.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HindustanTimes(BasicNewsRecipe):
    title = u'Delcoe Times'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('News',
         'http://www.delcotimes.com/?rss=news'),
        ('Sports',
         'http://www.delcotimes.com/?rss=sports'),
        ('Business',
         'http://business-news.thestreet.com/the-delaware-county-daily-times/rss/109393'),
        ('Entertainment',
         'http://www.delcotimes.com/?rss=entertainment'),
    ]
PK�X��Y�88demagog.cz.png�PNG


IHDR  ��tRNSn��	pHYs.#.#x�?v�IDATH�c`�8xؠl~6�4����[�t�E�>K��e��G��\�[A���0�1e��٫1z�h�6��
�k��O��@F�d<2��@�g����d�Y�_2lߥa1�>��|ϴ��i{6�8[W
bA��i�]�6j��2��u
v�!�X���w�VK�4��!�Ɇ��39`(L�y��\Lk����A�B<��2��r@�ߥټ&�tdk��>b��ωb��hu1�
`��g:�۱;P_��
P��W��c�9������i6߳l��$P�?�N�[&i�>��ns:̨�HF���
L�<w��ߧ�o40`�1|=ƴ�RA9�A�VJ�tFF�CO�-0'�tR5�A��l� ��}�,x
6�i6}t���F��s	�	��!�tppɰ9b��LN6y8BU�wD
t
�ᗣ��M��Fs�)�e��m(��ƙ��*��s[�֛+����/�-g9��K��n
-��VJ�⌍�
�� &v`�_�4�4���Ά��$?�SA������J?�%SH`��f������(!?�A�0���\�a&�#�)/*�i��FY��
=�R��V�@'��4�4�B�wjא��C�0��t��8���^�+`��iH0ЩʤE���V�S��rW��Z
/<
/���DP��+��GR���_)P���kN��/f��HӒ�l�����O�w/B�w)`��^	/IEND�B`�PK�XRB���demagog.cz.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe
import re


class demagogRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Demagog.cz'
    publisher = u''
    description = 'demagog.cz'
    oldest_article = 6
    max_articles_per_feed = 20
    use_embedded_content = False
    remove_empty_feeds = True

    feeds = [
        (u'Aktuality', u'http://demagog.cz/rss')
    ]

    language = 'cs'
    cover_url = 'http://demagog.cz/content/images/demagog.cz.png'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                .vyrok_suhrn{margin-top:50px; }
                .vyrok{margin-bottom:30px; }
                            """

    remove_tags = [dict(name='a', attrs={'class': 'vyrok_odovodnenie_tgl'}),
                   dict(name='img', attrs={'class': 'vyrok_fotografia'})]
    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(name='div', attrs={'class': 'vyrok_text_after'})
    preprocess_regexps = [(re.compile(
        r'(<div class="vyrok_suhrn">)', re.DOTALL | re.IGNORECASE), lambda match: '\1<hr>')]
PK�X���democracy_journal.png�PNG


IHDR  szz�|IDATx����^Q����i΋˜���g3s���4/Ͷm[Ϭ���|�;�����a=0pZ�ma���K).�ṅϹ�����0W�GM��(>����浀��~��1���'B��{^?
* ��l�ct�;i��
l�6J�����+��-)�hx��i�a����?���N���
0���R[����@���=�0�>��DJC�;~��@P��1|`a�+�����g`�Ǜ�0�8���+@ê_�z1X�4\�K#��Y�f`��AZga�t#��k
݃��e�C^���R��50�}�b`P�6&w���ؚIlVлN7��-70����%�Q.)8o`��UfK���|6�<��SܘIEND�B`�PK�XQ�Cc��democracy_journal.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class AdvancedUserRecipe1361743898(BasicNewsRecipe):
    title = u'Democracy Journal'
    description = '''A journal of ideas. Published quarterly.'''
    __author__ = u'David Nye'
    language = 'en'
    oldest_article = 90
    max_articles_per_feed = 30
    no_stylesheets = True
    auto_cleanup = True

    def parse_index(self):
        articles = []
        feeds = []
        soup = self.index_to_soup("http://www.democracyjournal.org")
        for x in soup.findAll(href=re.compile(r"http://www\.democracyjournal\.org/\d*/.*php$")):
            url = x.get('href')
            title = self.tag_to_string(x)
            articles.append({'title': title, 'url': url,
                             'description': '', 'date': ''})
        feeds.append(('Articles', articles))
        return feeds

    def print_version(self, url):
        return url + '?page=all'
PK�X*)��democracy_now.png�PNG


IHDR(-SPLTE���������������������������������������������;AB>FF?EF^ffcjjhppouvqwxszz���������������������������������������������������������������������������������������


�������������������������������������� %*+',,,12������1785<<9?A������9@A:AB������:AC#D�IDATx�EM�`K���l۶m��ƌ~j���d2z�.�_J�A��Vf)
����=�f����f0-�����iV�
��=�։�h��U�R_Q�t<�n/_͡d����S�Tt	2d�~����S�ʹ.���H
��l�F���9��%����-���>N�|�k*�R���������,[FE$C�VIEND�B`�PK�X�F��xxdemocracy_now.recipe# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class DemocracyNowRecipe(BasicNewsRecipe):
    title = u'Democracy now!'
    __author__ = u'Antoine Beaupré'
    description = 'A daily TV/radio news program, hosted by Amy Goodman and Juan Gonzalez, airing on over 1,100 stations, pioneering the largest community media collaboration in the United States.'  # noqa
    language = 'en'
    cover_url = 'http://www.democracynow.org/images/dn-logo-for-podcast.png'

    oldest_article = 1
    max_articles_per_feed = 10
    publication_type = 'magazine'

    auto_cleanup = False
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True

    feeds = [
        (u'Daily news', u'http://www.democracynow.org/democracynow.rss')]

    keep_only_tags = [dict(name='div', attrs={'id': 'page'}), ]
    remove_tags = [dict(name='div', attrs={'id': 'topics_list'}),
                   dict(name='div', attrs={'id': 'header'}),
                   dict(name='div', attrs={'id': 'footer'}),
                   dict(name='div', attrs={'id': 'right'}),
                   dict(name='div', attrs={'id': 'left-panel'}),
                   dict(name='div', attrs={'id': 'top-video-content'}),
                   dict(name='div', attrs={'id': 'google-news-date'}),
                   dict(name='div', attrs={'id': 'story-donate'}),
                   dict(
                   name='div', attrs={'id': 'transcript-expand-collapse'}),
                   dict(name='span', attrs={'class': 'show-links'}),
                   dict(name='span', attrs={'class': 'storyNav'}),
                   dict(name='div', attrs={'class': 'headline_share'}),
                   dict(name='div', attrs={'class': 'mediaBar'}),
                   dict(name='div', attrs={'class': 'shareAndPrinterBar'}),
                   dict(name='div', attrs={'class': 'utility-navigation'}),
                   dict(name='div', attrs={'class': 'bottomContentNav'}),
                   dict(name='div', attrs={'class': 'recentShows'}),
                   dict(
                   name='div', attrs={'class': 'printer-and-transcript-links'}),
                   ]
PK�X�k���demorgen_be.png�PNG


IHDR�a�IDATx�c���?#%h��bR��@�����@�yJ[3��(6)ҮHb�p���]���@Eg��gB
(��j���T�	�p���i�j�
�
)��P3$�l�0iE�5��<(����P͝`M:f���:H�Y�Ѥ�b-�Z�N�IEND�B`�PK�XF	Q��demorgen_be.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008, Darko Miletic <darko.miletic at gmail.com>'
'''
demorgen.be
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DeMorganBe(BasicNewsRecipe):
    title = u'De Morgen'
    __author__ = u'Darko Miletic'
    description = u'News from Belgium in Dutch'
    oldest_article = 7
    language = 'nl_BE'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='div', attrs={'class': 'art_box2'}), dict(name='h1'),
        dict(name='p', attrs={'class': 'article__subtitle'}),
        dict(name='p', attrs={'class': 'article__intro fjs-article__intro'}),
        dict(name='div', attrs={'class': 'article__body__container first'}),
        dict(name='h4'), dict(name='p', attrs={'class': 'article__body__paragraph'})
    ]

    feeds = [
        (u'Nieuws', u'http://www.demorgen.be/nieuws/rss.xml'),
        (u'De Gedachte', u'http://www.demorgen.be/degedachte/rss.xml'),
        (u'Financiele morgen', u'http://www.demorgen.be/financielemorgen/rss.xml'),
        (u'Financiele morgen', u'http://www.demorgen.be/financielemorgen/rss.xml'),
        (u'Sport', u'http://www.demorgen.be/sport/rss.xml'),
        (u'Bis', u'http://www.demorgen.be/bis/rss.xml'),
        (u'Magazine', u'http://www.demorgen.be/magazine/rss.xml'),
        (u'De stand der dingen', u'http://www.demorgen.be/standderdingen/rss.xml')
    ]
PK�X�z]�		den_of_geek.png�PNG


IHDR��h6�IDATx�=oVU���s_xZZ�.����A5U7���Bb`.!a�����7M:��`b��I�j�C_�����-���~�#D�:H�V})�/U0�r�2�1�n�[��)m�uL"�7.��f�GGVs��Oo����DuԿ�{&0���?M^��'�&$
��s_�,��ξ隞�y��RhB�f^�x޵���v���T���Q(�hҊ�0�Z_��ifU}���")�B��B���('�|Q�`��dJC��f`�o3�x�#8}��U����Z:␐������W}wޤ꒎����s�U�Sk7���⊫�x;뫞�ғȡ>S'�7=��
l?v���[,�!��&՚�����ZE�o�Éϔߝy&��z::&��/�*���]�ޛjCCC��J"��Tm^�C����"Id�D��}C&�G��$�D9�!�x`L<�IEND�B`�PK�X��e���den_of_geek.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1316944753(BasicNewsRecipe):
    title = u'Den of Geek'
    __author__ = 'Jaded'
    language = 'en'
    description = 'From science fiction enthusiasts through to gaming fanatics, Den of Geek has become the one-stop UK website for people genuinely passionate about their entertainment media. Den of Geek covers popular culture but always with an edgy, UK centric slant that sets it apart from the crowd.'  # noqa
    category = 'Movies, TV, Games, Comics, Cult, News, Reviews'
    language = 'en'

    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    no_stylesheets = True
    use_embedded_content = True
    publication_type = 'newsportal'
    masthead_url = 'http://www.denofgeek.com/siteimage/scale/0/0/logo.gif'
    cover_url = 'http://a5.sphotos.ak.fbcdn.net/hphotos-ak-snc6/166479_180131695357862_139191826118516_354818_4993703_n.jpg'

    feeds = [
    (u'Movies', u'http://www.denofgeek.com/movies/rss/'),
    (u'TV', u'http://www.denofgeek.com/television/rss/'),
    (u'Comics & Books', u'http://www.denofgeek.com/comics/rss/'),
    (u'Games', u'http://www.denofgeek.com/games/rss/'),
    (u'DVD/Blu-ray', u'http://www.denofgeek.com/Reviews/rss/')]
PK�X��,]]denik.cz.png�PNG


IHDR  D����PLTE1�Y�Y����V�V�J�M��R�S�P�I�Q�B�T�T�?�J�W�G���N����������N�U�;�C�R�F�A�	L�E�P�?�F�J�\�A�B�U�J��L����=����L����Q�`�"\� .�!0�A�e�f�<�C�d�'1�5�G�Q�F�7�<�C�H�L�<�9�H�S�\�N�	5�J�Z�
7�E�:�<�;�\�F�H�J�<�;�@�3�B�6�@�M�&M�(E�)K�)T�)u�*t�*��-r�/P�1R�1o�3Y�5t�8]�8��;X�<o�@N�@`�Dv�D{�E[�IV�Iw�I��Ji�Jk�M]�M{�N~�P`�W\�]l�`{�eo�e|�il�jz�j��l{�m��m��n��o|�p}�qx�ru�s��t��us�v��v��x��x��x�~�����������ᇕ����������盙���ԣ����٨�ت����ά�����ۯ�������������ȹ�ݻ�����𽧲���î�İ���������˴�ͼ����ζ�ι�ѻ���������������
D�����������������A�������B����<���C�O�������������������������0�����������������������C�S�X�������7�u��IDATxڅ�C`�@��3׶j��m۶m۶m۶m�6��M.�������\�՚�g��܁�=��
�*�g�	7 �h��L%�)fL�;p�I�h�R&'���&H��$w uw���2��s���*�֯q~�绻V�]�Qf#?G����"�V��~�w���CDi�R.��iZ�[��mi{_F�.>�w��N�~��= �-R��"Uh� ����0��T�޿W��"t�A�j�L&;?�x��ӄ�����Ӆ�…��@=��6���/��T���оi���!�D������<ȵ�8�
�����E��1�$.f��`=����E�����蹭k���q��������
�Oو�񑮑"��u�|���Az�1�d�y[W
��Rpw�h�/���L�������$�H�K˝��H�9< o��D�h����(y��+�͜( ��$�J�b���w����?���%E,	Ν�������9��ݚ�m@���"�-)�F�Lv�!q�������{IEND�B`�PK�X��=��denik.cz.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class ceskyDenikRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'denik.cz'
    publisher = u''
    description = u'Český deník'
    oldest_article = 1
    max_articles_per_feed = 20
    use_embedded_content = False
    remove_empty_feeds = True

    feeds = [
        (u'Z domova', u'http://www.denik.cz/rss/z_domova.html'), (u'Pražský deník - Moje Praha',
                                                                  u'http://prazsky.denik.cz/rss/zpravy_region.html')
    ]

    language = 'cs'
    cover_url = 'http://g.denik.cz/images/loga/denik.png'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                            """

    remove_tags = []
    keep_only_tags = [dict(name='div', attrs={'class': 'content'})]
    remove_tags_after = dict(name='p', attrs={'class': 'clanek-autor'})
PK�X"�Kffdenik_referendum.png�PNG


IHDR  D����PLTE%������&�=�7R�|�����%�����&������7�8�8�9�9�9�:�;�<�'�=�?� >� ?�!@�#B�%C�*G�+H�+I�.L�/L�/L�0M�1M�3O�6R�'�9T�;U�;V�>X�>Y�?[�@Z�@Z�B\�C]�E^�E_�F_�Ha�Ia�Ib�Jc�Kc�Tk�Yo�Yp�Zr�[q�^s�^s�`u�f{�h~�l�o��o��y��{��{��(�|�����������������������������������������)�,����������������������������������������������������������������������
,�����������������������������������������������������������,�
/�1���3�����6����z�5�JIDATxڝ�Cc3Q��'v>Զ�Զm۶m�͏mϙ��{}�^@m#��d{��c��<�m�-�M�{�+�7�4'0*�Al��I�W:p�f
�j�g�V��0�x�\X(����&��eoIV����
�b>���VЂ��3op��{ɠ��$cA��6pT@M%h��B�,��� |����0� �遊FpT�3%,��泠�͵���/��Qh䁖87;U�
�E��� 5P0K�(P�X�첆`>�
�i�A��`n�`�8.HǾ0I���I0�Pnx�_"��
�0}y_|���1���{^��Y�:���t�V|rl�IEND�B`�PK�Xw��Hrrdenik_referendum.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class denikReferendumRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Den\u00edk Referendum'
    publisher = u''
    description = ''
    oldest_article = 1
    max_articles_per_feed = 20

    feeds = [
        (u'Deník Referendum', u'http://feeds.feedburner.com/DenikReferendum')
    ]

    language = 'cs'
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = []
    remove_tags_after = dict(name='div', attrs={'class': ['text']})
    remove_tags = [dict(name='div', attrs={'class': ['box boxLine', 'box noprint', 'box']}),
                   dict(name='h3', attrs={'class': 'head alt'})]

    keep_only_tags = [dict(name='div',   attrs={'id': ['content']})]
PK�Xj��&��
denikn.cz.png�PNG


IHDR(-SQPLTE�*�>8�A:����JA����iZ�F=��ָB;��m]�00�&-�VJ�D<�63㹬㺮�H?�?9��������ڹE<��ҸC;қ	\dIDATxڍ΅
C1����[��?���Ŷ ?|H�9�12P-�""a@-���yk��o�a_�t\�t6�a�?�=�6A�fo�:�(^�R|zا��7ݶ����IEND�B`�PK�X�е�r
r
denikn.cz.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime


CZ_DAYS = ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne']
CZ_MONTHS = ['led', 'úno', 'bře', 'dub', 'kvě', 'čen', 'čec', 'srp', 'zář', 'říj', 'lis', 'pro']


def cz_title_time():
    """
    Helper function to return date with czech locale.
    Uses hardcoded lookup table of day and month names as strftime requires
    locale change that is not thread safe.
    """
    today = datetime.today()
    weekday = CZ_DAYS[today.weekday()]
    month = CZ_MONTHS[today.month-1]
    return '{weekday}, {day} {month} {year}'.format(weekday=weekday,
                                                    day=today.day,
                                                    month=month,
                                                    year=today.year)


class DenikNRecipe(BasicNewsRecipe):
    """
    Recipe for the RSS feed of https://denikn.cz/
    """

    title = u'Deník N'
    __author__ = 'Robert Mihaly'
    publisher = u'N Media'
    description = u'Deník N - Nezávislý český deník'

    # For daily feed
    oldest_article = 1
    max_articles_per_feed = 20

    # The default 120 seems too long
    timeout = 30

    # Custom title used in conversion_options below
    custom_title = u'Deník N - ' + cz_title_time()

    # Select the feeds to process
    feeds = [
        # (u'Vše', 'https://denikn.cz/feed'),
        (u'Česko', 'https://denikn.cz/cesko/feed/'),
        (u'Svět', 'https://denikn.cz/svet/feed'),
        (u'Ekonomika', 'https://denikn.cz/ekonomika/feed'),
        # (u'Komentáře', 'https://denikn.cz/nazory/feed'),
        (u'Kultura', 'https://denikn.cz/kultura/feed'),
        (u'Věda a technologie', 'https://denikn.cz/veda/feed'),
        (u'Sport', 'https://denikn.cz/sport/feed'),
    ]

    language = 'cs'
    cover_url = 'https://denikn.cz/wp-content/themes/dn-2-cz/logo.svg'
    remove_javascript = True

    publication_type = 'newspaper'
    tags = 'news'

    # This could be 'optional', but there isn't much content if not subscribed
    needs_subscription = True
    # None auto-detects, otherwise 'utf8' could be also used
    encoding = None

    # Full articles are not embedded
    use_embedded_content = False

    auto_cleanup   = True
    remove_empty_feeds = True

    ignore_duplicate_articles = {'title', 'url'}

    compress_news_images = True
    scale_news_images_to_device = True

    resolve_internal_links = True

    # Use gzip transfers
    handle_gzip = True

    # Add custom title with Czech dates and correctly display publisher
    conversion_options = {
        'title'       : custom_title,
        # 'comments'    : description,
        # 'tags'        : tags,
        # 'language'    : language,
        'publisher'   : publisher,
        # 'authors'     : publisher,
        # 'smarten_punctuation' : True
    }

    # Handle login here
    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://predplatne.denikn.cz/sign/in/')
            br.select_form(id='frm-signInForm')
            br['username']   = self.username
            br['password'] = self.password
            br.submit()
        return br
PK�X#�T��denver_post.png�PNG


IHDR  V%(tRNSv��8�IDATe�ϋUe����y�{�ܙ�Wmp���$�2�PQ�t�
�f�C� H�\� زM"QX�q#�.[���_���4.��
jG��,�z��\9��y4cw{"��?]��\5%}��}�)�0O}l�	-O!��a�o���b]B��XE$2ȋ�X�#�H��$E��hj
6�ιP��\��gc(�бRtǾ��_�\���ڧ��|v}��vf�p�n��|�s���$
��k.ٓ#8sL�q��i�����ݯ:T���}�"����0)�ã��w�TC[��s8J�l�G׾���,���5dM�0isVI1M\v)#�B8
�2�{�t�N��Y�u�{u�-:�a����X��qG�#��J���ٻ c/3U��]��jj���p�獛Q�.e��R���q�d�^#!����vd��Ҹ�v�	B��b�j�8���	��r��au�g�D�����x|�c��_c5H��A@P%�����叏�����y�a�r��c@\�pyP���(�q�ch:L��QZ2�;�`+<��t�d5V�Xԁ�k@X%	�X��f�m��2l�N�ѶB�#��s���$�݇BXۤ�żj�`�{�(o����V�C��)�QIEND�B`�PK�Xx�C44denver_post.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals

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 DenverPost(BasicNewsRecipe):
    title = u'Denver Post'
    language = 'en'
    __author__ = 'Kovid Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 20

    no_stylesheets = True
    use_embedded_content = False
    keep_only_tags = [
        dict(name='h1'),
        classes('subheadline byline header-features article-body'),
    ]
    remove_tags = [
        classes('related'),
        dict(attrs={'data-config-video-id': True}),
    ]

    feeds = [
        ('Top Stories',
         'http://feeds.denverpost.com/dp-news-topstories'),
        ('Business',
         'http://feeds.denverpost.com/dp-business'),
        ('Sports',
         'http://feeds.denverpost.com/dp-sports'),
        ('Lifestyles',
         'http://feeds.denverpost.com/dp-lifestyles'),
        ('Politics',
         'http://feeds.denverpost.com/dp-politics'),
        ('Entertainment',
         'http://feeds.denverpost.com/dp-entertainment'),

    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
            del img['height']
            del img['width']
        return soup
PK�X�����der_standard.png�PNG


IHDR00`�	�PLTE��������tRNS@��f|IDATx��ҁ�P���g��c׮p%��A��·T�{}R���:"�?������%;?����
�i���竌P���̀j]��Y��Hc�"�cu��@~ 1z�M����H��7���p��IEND�B`�PK�XOL��der_standard.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, division, absolute_import, print_function

__license__ = 'GPL v3'
__copyright__ = '2009, Gerhard Aigner <gerhard.aigner at gmail.com>'

''' http://www.derstandard.at - Austrian Newspaper '''

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 DerStandardRecipe(BasicNewsRecipe):
    title = u'derStandard'
    __author__ = 'Gerhard Aigner and Sujata Raman and Marcel Jira and Peter Reschenhofer'
    description = u'Nachrichten aus Österreich'
    publisher = 'derStandard.at'
    category = 'news, politics, nachrichten, Austria'
    use_embedded_content = False
    remove_empty_feeds = True
    no_stylesheets = True
    encoding = 'utf-8'
    language = 'de_AT'

    oldest_article = 1
    max_articles_per_feed = 100
    ignore_duplicate_articles = {'title', 'url'}

    masthead_url = 'http://images.derstandard.at/2012/06/19/derStandardat_1417x274.gif'

    feeds = [
        (u'International', u'https://www.derstandard.at/rss/international'),
        (u'Inland', u'https://www.derstandard.at/rss/inland'),
        (u'Wirtschaft', u'https://www.derstandard.at/rss/wirtschaft'),
        (u'Web', u'https://www.derstandard.at/rss/web'),
        (u'Sport', u'https://derStandard.at/rss/Sport'),
        (u'Panorama', u'https://derStandard.at/rss/Panorama'),
        (u'Etat', u'https://derStandard.at/rss/Etat'),
        (u'Kultur', u'https://derStandard.at/rss/Kultur'),
        (u'Wissenschaft', u'https://derStandard.at/rss/Wissenschaft'),
        (u'Gesundheit', u'https://derStandard.at/rss/Gesundheit'),
        # (u'Bildung', u'https://derStandard.at/rss/Bildung'),
        # (u'Meinung', u'https://derStandard.at/rss/Meinung'),
        (u'Lifestyle', u'https://derStandard.at/rss/Lifestyle'),
        # (u'Reisen', u'https://derStandard.at/rss/Reisen'),
        # (u'Familie', u'https://derstandard.at/rss/Familie'),
        # (u'Meinung', u'https://derStandard.at/rss/Meinung'),
        # (u'User', u'https://derStandard.at/rss/User'),
        (u'Karriere', u'https://derStandard.at/rss/Karriere'),
        # (u'Immobilien', u'https://derstandard.at/rss/Immobilien'),
        # (u'Automobil', u'https://derstandard.at/rss/Automobil'),
        (u'dieStandard', u'https://derStandard.at/rss/diestandard'),
        (u'Newsroom', u'https://www.derstandard.at/rss'),
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.set_simple_cookie('DSGVO_Check', '', '.derstandard.at')
        headers = {
            'X-Requested-With': 'XMLHttpRequest',
            'Content-Type': 'application/json; charset=UTF-8',
            'DNT': '1',
            'Pragma': 'no-cache',
            'Cache-Control': 'no-cache'
        }
        import mechanize
        req = mechanize.Request(url='https://apps.derstandard.at/privacyprotection/api/agree', data=None, headers=headers, method='POST')
        br.open(req)
        return br

    keep_only_tags = [
        classes('article-header article-body article-origins article-subtitle article-pubdate'),
    ]

    remove_tags = [
        dict(name=['link', 'iframe', 'style', 'hr']),
        dict(attrs={'class': ['lookup-links', 'media-list']}),
        dict(name='form', attrs={'name': 'sitesearch'}),
        dict(name='div', attrs={'class': ['socialsharing', 'block video',
                                          'blog-browsing section',
                                          'diashow', 'supplemental']}),
        dict(name='div', attrs={'id': 'highlighted'})
    ]

    remove_attributes = ['width', 'height']
PK�X�
���deredactie.png�PNG


IHDR  D����PLTE			��������������������������娧�LLM���������������((*�����܋�����������MLN������������NNP�����犉�������������nnpnnq�����⋊����  "779LLN���GFH���<<===>���##%���	^^`>>?�MMPutx~~����??A���MMN������������������������,,-�����ש������������ϸ�����""#_^a"""������������}|���--/���������///��苋���ν��ZY[��������TSU���nmp������	YY[������CCE���`_c������###���vux������������AAC������mmo���������667������EEF	JHK���ffhssv���������??Bwvy������iik]]_vvyAAB������556��ۍ��?>AihkPNQ���JJKCBE]\^uux'''�����Ƀ�����``c������vuy��������Ɣ�����rrt323{z~***335���qps���GGJ���������lln('(yy|���XVYllo:9<HHKNNQ������sru���//0���KKM���~}�������������:::��̟�����222lkn���000���)փtRNS@��f�IDATx�b 0V2TÌ�c����e�����]F����ضm۶=k۶m۶m��O�.V���'5�@��r��_�)@.�F����ﴂL?@�@���nSI���V	1V���`BP��H��3|�Ȭl<aʍO�j�&���
�m�$���BKn�@�^]�K88�F�0I!9�$��|���9���}^��L���S�c`װ��0������a��̠�[��gs���ú�B�
^���
W�i��"	~���Г�P"���"��u���<��SE~.��e�a��Gt;�f��C�:99x{gdx|�]��P�f�(�c�qm�PH��,ˣX��\〺��0��s���e��"z�-C;;s��L ��Z$uo_�`���]��̴v�U�d��^a�bi�jX��@$����6o�껝G��;���(��	������-����啢,i��
=tXv����%'O���zAB�Y��\/�٥V�luE}���n\x7�7M��N_˶[�۲jU����;�p/�~]�F���S�SB�?��0�O�ڪ�#}[\�P���S�����S��0K.�=�B�E��e�y��s���Dj"��R��w����%c��@ �	m	�ȸ$�EIEND�B`�PK�XwSC�O
O
deredactie.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class deredactie(BasicNewsRecipe):
    title = u'Deredactie.be'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    cover_url = 'http://www.deredactie.be/polopoly_fs/1.510827!image/2710428628.gif'
    language = 'de'
    keep_only_tags = []
    __author__ = 'malfi'
    keep_only_tags.append(dict(name='div', attrs={'id': 'articlehead'}))
    keep_only_tags.append(dict(name='div', attrs={'id': 'articlebody'}))
    remove_tags = []
    remove_tags.append(dict(name='div', attrs={'id': 'story'}))
    remove_tags.append(dict(name='div', attrs={'id': 'useractions'}))
    remove_tags.append(dict(name='hr'))

    extra_css = '''
     h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
     h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
     p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
     body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
     '''

    def parse_index(self):
        categories = []
        catnames = {}
        soup = self.index_to_soup(
            'http://www.deredactie.be/cm/vrtnieuws.deutsch')
        for elem in soup.findAll('li', attrs={'id': re.compile("^navItem[2-9]")}):
            a = elem.find('a', href=True)
            m = re.search('(?<=/)[^/]*$', a['href'])
            cat = str(m.group(0))
            categories.append(cat)
            catnames[cat] = a['title']
            self.log("found cat %s\n" % catnames[cat])

        feeds = []

        for cat in categories:
            articles = []
            soup = self.index_to_soup(
                'http://www.deredactie.be/cm/vrtnieuws.deutsch/' + cat)
            for a in soup.findAll('a', attrs={'href': re.compile("deutsch.*/[0-9][0-9][0-9][0-9][0-9][0-9]_")}):
                skip_this_article = False
                url = a['href'].strip()
                if url.startswith('/'):
                    url = 'http://www.deredactie.be' + url
                myarticle = ({'title': self.tag_to_string(
                    a), 'url': url, 'description': '', 'date': ''})
                for article in articles:
                    if article['url'] == url:
                        skip_this_article = True
                        self.log("SKIPPING DUP %s" % url)
                        break
                if skip_this_article:
                    continue
                articles.append(myarticle)
                self.log("Adding URL %s\n" % url)
            if articles:
                feeds.append((catnames[cat], articles))
        return feeds
PK�XK�ឆ�derin_dusunce.png�PNG


IHDR��h6MIDATx�c�J�Kb▖�������4 ������݋�M
@9�hD�a�L"ECI��`�����F�Q���?�w����IEND�B`�PK�XS7sUUderin_dusunce.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1324913694(BasicNewsRecipe):
    title = u'Derin Dusunce'
    language = 'tr'
    __author__ = 'asalet_r'
    oldest_article = 7
    max_articles_per_feed = 20
    auto_cleanup = True

    feeds = [(u'Derin D\xfc\u015f\xfcnce', u'http://www.derindusunce.org/feed/')]
PK�Xc�6��
descopera.png�PNG


IHDR(-S\PLTE.A>VVq _~"h�CZRp3IZuZyVzIaNh&s��{_3`rD_){�4x�D|�l����������������z��\�}h'm�qwb�uTyaBVZO.Q]7S_.Uh p�6gtPhrkxy{�{��u������ʡm0hi��ت�ڵ�������������fiOl��tl\ruXyxRP��������tiA���X]CL��FSC.KT���O��0Zg_���×ڴ�AgyBeqβ�Snw]px`|�αxŨ|��|��v���a��x��z����������m��������i��[��m��s��wWheHdcG[e��e��`'AG��{�Ϥ:s���h�ܦ��e���d�x��zxa���~��tRNS@��f�IDATx^%�c�A��j�qm۾k۶m��d�wϷ��J^����n���sS����H������N��z^�f�%���>	�-5�.�x�����ﵽ�ө�v�����U*
��̬<ׯ���͹�=�����,g������`e4�1f6���z��i�R�X��^��݀`j��
u����НI�E����Z�
@\�
��]�H�XL/"�9�?�b�1�dYF}����]��C�/�t"&<%f�IEND�B`�PK�X�9��descopera.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
descopera.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Descopera(BasicNewsRecipe):
    title = u'Descoper\u0103'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'E lumea ta'
    publisher = 'Descopera'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Descopera'
    encoding = 'utf-8'
    cover_url = 'http://www.descopera.ro/images/header_images/logo.gif'
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    feeds = [
        (u'Feeds', u'http://www.descopera.ro/rss')
    ]
PK�X�Pt��descopera_org.png�PNG


IHDR��h6�IDATx��=kSQ�s�r_�p�`��KA'�b��,�Y�E'�\:����o"�`݃v�E0hN�9�yL/t�N�(���k-3 "��c�e-�(Is�ZKJ1�\q���BUcf2ƨ��F����`C\"�8��O�)�hC))C�Wz�j���aP�8
�/�+�V�JD(�q�Nv�|�ͫ���߹���ܷ�/b��!��hɆM.?z�������᧏��#�<j�n�+��<�� DJ	s����<V$�<AIk����B~�_�?�C�N5�T
�9�G��\��
@J[����g���f��^�VY�9�1i��Z*���轧�pxw0H�4V�6f:����n����_��)��-�<O���Z��(B�i����r�k��4KӼ(��v�	�_s����������@"�;��Ԣ�!�ԠIEND�B`�PK�XZb7�descopera_org.recipe# -*- coding: utf-8 -*-
'''
descopera.org
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Descopera(BasicNewsRecipe):
    title = u'Descoperă.org'
    __author__ = 'Marius Ignătescu'
    description = 'Descoperă. Placerea de a cunoaște'
    publisher = 'descopera.org'
    category = 'science, technology, culture, history, earth'
    language = 'ro'
    oldest_article = 14
    max_articles_per_feed = 100
    encoding = 'utf8'
    no_stylesheets = True
    extra_css = ' body{ font-family: Verdana,Helvetica,Arial,sans-serif } .introduction{font-weight: bold} .story-feature{display: block; padding: 0; border: 1px solid; width: 40%; font-size: small} .story-feature h2{text-align: center; text-transform: uppercase} '  # noqa
    keep_only_tags = [dict(name='div', attrs={'class': ['post']})]
    remove_tags = [dict(name='div', attrs={'class': [
                        'topnav', 'box_a', 'shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge']})]
    remove_attributes = ['width', 'height']
    cover_url = 'http://www.descopera.org/wp-content/themes/dorg/styles/default/img/b_top.png?width=400'
    feeds = [(u'Articles', u'http://www.descopera.org/feed/')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X*i����desiring_god.png�PNG


IHDR  D���$PLTE���〇���fn�@J�?J������~Y�IDATxڼх� DяS��.u�x�bч;�oݝXOp�;q��Ҳ
��� �� ��A&��7�D����%m��ೡ��7���$
 W ��n���O���n��k����iP ��'���3/����2$y�IEND�B`�PK�X
���desiring_god.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Peter Grungi <p dot grungi at gmail dot com>'

from calibre.web.feeds.news import BasicNewsRecipe


class DesiringGodEnglish(BasicNewsRecipe):
    title = u'Desiring God'
    __author__ = 'Peter Grungi'
    language = 'en'

    cover_url = 'http://cdn0.desiringgod.org/images/layout/breadcrumbs_dg_mark.png'
    masthead_url = 'http://cdn0.desiringgod.org/images/layout/breadcrumbs_dg_mark.png'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    publisher = 'Desiring God Ministries'
    author = 'Desiring God Ministries'

    feeds = [(u'Desiring God Blog', u'http://feeds.feedburner.com/DGBlog?format=xml')]
PK�X4-�	detroit_news.png�PNG


IHDR  ���IDATx���<M����߶m۶m۶m{��m۶m�z���j�UWWedfDf� �m���o���i|a�j%o�U޶��sOqҪ�8i�Q���h�I"�������ɻ��{Aָ���>�f+WEY[���9;DZ���Ż9{=z�+E�~2�f�f��m��������+��^8_8�R�����T5�~�w5��u>4��(�-�/����#Fc�r�f?��%��eE�&y�C���oHpwI��V���5m�qЌ�������*��J��c�mX�|p�8;==$���I�Ν%y�N����/~���� ٧�BUY|�����(+��겜�xʎ� �x����"���SD��vS|�!����RR��d�bE�^R��?���3@k�c�<}���F6�v'�xD��ϛ�ߘ�]��mmaR�O��ﭷ�J~���:t�5os!�g�CG����:Y"&���a<���N1e�Q�9���_�k�`!�^k���m��t%
4i2��˥	��Yif+WJ%Z��!�����(@y��O>9�z��SUi� 
��gX�h�FPt텿a�F���\[��,ɉ�z�%P���뵫2��ˊ*K�mv�V��v㺢ko�K���)��)[�܉���p�%KI���G!��ں
���(d�!F�ΜFQQV��eyY6;wAx]meFx0A��f�\���<�ߍ���./�?r���"#,�|��!=�,�n '>��07/1���8�û��¬Ȱ��Vnk%9�	�$Z��"��4�������P%�����fl�PKP�����LC�*Uu��S����[�����7�8;
+8vzX���)O��p)�e}]z�T��%'?���%�� ��~^�/k�i��e��n�;�;r��CaZ���~�9P7��H)$�+�,�eG�)��^�a<!� 梨%)ݷ���6��+�6=�p�,D����t>�����Icƣ�
���^�,�Av<sZT��A����O�
`l��	i���zK%?�r@��V��|����B��d4�9�޼Bp���;���a$��5L�H�`�v�A�2f�8��k�P�(�ʜ�@���~D��d�"�C'	.�Ϟ�P}_<�|p?3"�b�F�
WH�����=\ �ԡ˕+\dP��73F��I�6�vVh�\	<z?y�s㣹��nܠ����E$����8�Q,�	�BYT��$�!@�;r�+�����/�[7����M�!E�/��u)eTr�����K*��՗OZ���d�"���*E贶
@#�0����1��I��x�$QG�Ẓޠ��W,�!b�Ef@@�1�6{��4k��S�p��
2 Xu�TOXG�R�O��*<��T)
��[F�a����}���y��S��?�|�����ғE.��I������_���:P��3IEND�B`�PK�X�վ�EEdetroit_news.recipefrom calibre.web.feeds.news import BasicNewsRecipe

import re


class AdvancedUserRecipe1297291961(BasicNewsRecipe):
    title = u'Detroit News'
    language = 'en'
    __author__ = 'DTM'
    oldest_article = 2
    max_articles_per_feed = 20
    no_stylesheets = True
    conversion_options = {
        'linearize_tables': True,
    }

    feeds = [
        (u'Headlines', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss&mime=xml'),
        (u'Nation/World', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss09&mime=xml'),
        (u'Metro/State', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss36&mime=xml'),
        (u'Wayne County', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss01&mime=xml'),
        (u'Oakland County',
         u'http://www.detnews.com/apps/pbcs.dll/section?category=rss02&mime=xml'),
        (u'Macomb County', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss03&mime=xml'),
        (u'Livingston County',
         u'http://detnews.com/apps/pbcs.dll/section?category=rss04&mime=xml'),
        (u'Politics/Government',
         u'http://www.detnews.com/apps/pbcs.dll/section?category=rss10&mime=xml'),
        (u'Editorials', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss07&mime=xml'),
        (u'Columnists', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss43&mime=xml'),
        (u'Charlie LeDuff',
         u'http://detnews.com/apps/pbcs.dll/section?category=rss54&mime=xml'),
        (u'Religion', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss11&mime=xml'),
        (u'Technology', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss12&mime=xml'),
        (u'Commuting', u'http://detnews.com/apps/pbcs.dll/section?category=rss05&mime=xml'),
        (u'Schools', u'http://detnews.com/apps/pbcs.dll/section?category=rss06&mime=xml'),
        (u'Obituaries', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss08&mime=xml'),
        (u'Autos Insider', u'http://detnews.com/apps/pbcs.dll/section?category=rss25&mime=xml'),
        (u'Drive', u'http://detnews.com/apps/pbcs.dll/section?category=rss26&mime=xml'),
        (u'Business', u'http://detnews.com/apps/pbcs.dll/section?category=rss21&mime=xml'),
        (u'Personal Finance',
         u'http://detnews.com/apps/pbcs.dll/section?category=rss23&mime=xml'),
        (u'Real Estate', u'http://detnews.com/apps/pbcs.dll/section?category=rss24&mime=xml'),
        (u'Movies', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss28&mime=xml'),
        (u'TV', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss40&mime=xml'),
        (u'Music/Nightlife',
         u'http://www.detnews.com/apps/pbcs.dll/section?category=rss30&mime=xml'),
        (u'Celebrities', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss51&mime=xml'),
        (u'The Arts', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss27&mime=xml'),
        (u'Food', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss29&mime=xml'),
        (u'Homestyle', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss31&mime=xml'),
        (u'The Green Life',
         u'http://www.detnews.com/apps/pbcs.dll/section?category=rss53&mime=xml'),
        (u'Lifestyle', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss32&mime=xml'),
        (u'Health', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss34&mime=xml'),
        (u'Travel', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss52&mime=xml'),
        (u'Advice', u'http://www.detnews.com/apps/pbcs.dll/section?category=rss50&mime=xml'),
        (u'Pistons', u'http://detnews.com/apps/pbcs.dll/section?category=rss13&mime=xml'),
        (u'Lions', u'http://detnews.com/apps/pbcs.dll/section?category=rss14&mime=xml'),
        (u'Tigers', u'http://detnews.com/apps/pbcs.dll/section?category=rss15&mime=xml'),
        (u'Red Wings', u'http://detnews.com/apps/pbcs.dll/section?category=rss16&mime=xml'),
        (u'Michigan State',
         u'http://detnews.com/apps/pbcs.dll/section?category=rss18&mime=xml'),
        (u'University of Michigan',
         u'http://detnews.com/apps/pbcs.dll/section?category=rss17&mime=xml'),
        (u'Motor Sports', u'http://detnews.com/apps/pbcs.dll/section?category=rss20&mime=xml'),
        (u'Golf', u'http://detnews.com/apps/pbcs.dll/section?category=rss47&mime=xml'),
        (u'Outdoors', u'http://detnews.com/apps/pbcs.dll/section?category=rss19&mime=xml')
    ]

    def print_version(self, url):
        p = re.compile(r'(/\d{4}|/-1)/(rss|ENT|LIFESTYLE|OPINION|METRO)\d*')
        m = p.search(url)
        return url.replace(m.group(), '&template=printart')
PK�X��%��deutsche_welle_bs.png�PNG


IHDR(-S�PLTEh�j�l�o�q�s�v�x�z�}�~�����������l�n�t�v�z�|�~���������u�}����������{�����������������{��ҡ��������!���ޖ��������.����������^������P�����������;�������^��T����t����=��������������������ݕ��������������_����Y��������������x��������X����R�����������M��e�����/��.�������s�����$����@������3�����L������*�������5�������������F����������	���������6��IDAT]�A
�@���q�m�
:F'�ݦME�hD��07����<��	w����Y��nEC�)����2���qVѓ���k+NsW2W?�%�2�6�� zuL���e<�t¶����ZyuZ/�yI^^�D#o��o��IEND�B`�PK�X��5���deutsche_welle_bs.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

class DeutscheWelle_bs(BasicNewsRecipe):
    title = 'Deutsche Welle'
    __author__ = 'unkn0wn'
    description = 'Vijesti iz Njemacke i svijeta'
    publisher = 'Deutsche Welle'
    category = 'news, politics, Germany'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    language = 'bs'
    publication_type = 'newsportal'
    remove_empty_feeds = True
    remove_javascript = True
    masthead_url = 'http://www.dw-world.de/skins/std/channel1/pics/dw_logo1024.gif'
    
    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['height', 'width', 'style']
    
    keep_only_tags = [
        dict(name='article')
    ]
    
    remove_tags = [
        dict(name=['footer', 'source']),
        dict(attrs={'data-tracking-name':'sharing-icons-inline'}),
        classes('kicker advertisement vjs-wrapper')
    ]
    
    feeds = [
        (u'Politika', u'http://rss.dw-world.de/rdf/rss-bos-pol'),
        (u'Evropa', u'http://rss.dw-world.de/rdf/rss-bos-eu'),
        (u'Kiosk', u'http://rss.dw-world.de/rdf/rss-bos-eu'),
        (u'Ekonomija i Nuka', u'http://rss.dw-world.de/rdf/rss-bos-eco'),
        (u'Kultura', u'http://rss.dw-world.de/rdf/rss-bos-cul'),
        (u'Sport', u'http://rss.dw-world.de/rdf/rss-bos-sp')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].split()[6]
        return soup
PK�X��%��deutsche_welle_de.png�PNG


IHDR(-S�PLTEh�j�l�o�q�s�v�x�z�}�~�����������l�n�t�v�z�|�~���������u�}����������{�����������������{��ҡ��������!���ޖ��������.����������^������P�����������;�������^��T����t����=��������������������ݕ��������������_����Y��������������x��������X����R�����������M��e�����/��.�������s�����$����@������3�����L������*�������5�������������F����������	���������6��IDAT]�A
�@���q�m�
:F'�ݦME�hD��07����<��	w����Y��nEC�)����2���qVѓ���k+NsW2W?�%�2�6�� zuL���e<�t¶����ZyuZ/�yI^^�D#o��o��IEND�B`�PK�X��ͧ��deutsche_welle_de.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

class DeutscheWelle(BasicNewsRecipe):
    title = 'Deutsche Welle'
    description = 'Nachrichten der Deutschen Welle (DW)'
    publisher = 'DW - info@dw.com'
    language = 'de'
    __author__ = 'unkn0wn'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    remove_javascript = True
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['height', 'width', 'style']

    keep_only_tags = [
        dict(name='article')
    ]

    remove_tags = [
        dict(name=['footer', 'source']),
        dict(attrs={'data-tracking-name':'sharing-icons-inline'}),
        classes('kicker advertisement vjs-wrapper')
    ]
    
    # watch out https://www.dw.com/de/service/rss/s-9773 for description of possible rss feeds
    feeds = [
        ('Nachrichten', 'http://rss.dw.com/xml/rss-de-news'),
        ('Wissenschaft', 'http://rss.dw.com/xml/rss-de-wissenschaft'),
        ('Sport', 'http://rss.dw.com/xml/rss-de-sport'),
        ('Deuschland entdecken', 'http://rss.dw.com/xml/rss-de-deutschlandentdecken'),
        ('Presse', 'http://rss.dw.com/xml/presse'),
        ('Politik', 'http://rss.dw.com/xml/rss_de_politik'),
        ('Wirtschaft', 'http://rss.dw.com/xml/rss-de-eco'),
        ('Kultur und Leben', 'http://rss.dw.com/xml/rss-de-cul'),
        ('Thema des Tages', 'http://rss.dw.com/xml/rss-de-top'),
    ]
    
    def preprocess_html(self, soup):
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].split()[6]
        return soup
PK�X��%��deutsche_welle_en.png�PNG


IHDR(-S�PLTEh�j�l�o�q�s�v�x�z�}�~�����������l�n�t�v�z�|�~���������u�}����������{�����������������{��ҡ��������!���ޖ��������.����������^������P�����������;�������^��T����t����=��������������������ݕ��������������_����Y��������������x��������X����R�����������M��e�����/��.�������s�����$����@������3�����L������*�������5�������������F����������	���������6��IDAT]�A
�@���q�m�
:F'�ݦME�hD��07����<��	w����Y��nEC�)����2���qVѓ���k+NsW2W?�%�2�6�� zuL���e<�t¶����ZyuZ/�yI^^�D#o��o��IEND�B`�PK�X�����deutsche_welle_en.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

class DeutscheWelle_en(BasicNewsRecipe):
    title = 'Deutsche Welle'
    __author__ = 'unkn0wn'
    description = 'News from Germany and the world'
    publisher = 'Deutsche Welle'
    language = 'en'

    oldest_article = 2
    max_articles_per_feed = 50
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['height', 'width', 'style']
    
    keep_only_tags = [
        dict(name='article')
    ]
    
    remove_tags = [
        dict(name=['footer', 'source']),
        dict(attrs={'data-tracking-name':'sharing-icons-inline'}),
        classes('kicker advertisement vjs-wrapper')
    ]
    
    feeds = [
        ('World', 'http://rss.dw.de/rdf/rss-en-world'),
        ('Germany', 'http://rss.dw.de/rdf/rss-en-ger'),
        ('Europe', 'http://rss.dw.de/rdf/rss-en-eu'),
        ('Business', 'http://rss.dw.de/rdf/rss-en-bus'),
        ('Culture & Lifestyle', 'http://rss.dw.de/rdf/rss-en-cul'),
        ('Sports', 'http://rss.dw.de/rdf/rss-en-sports'),
        ('Visit Germany', 'http://rss.dw.de/rdf/rss-en-visitgermany'),
        ('Asia', 'http://rss.dw.de/rdf/rss-en-asia'),
        ('Top Stories', 'http://rss.dw-world.de/rdf/rss-en-top'),
    ]
    
    def preprocess_html(self, soup):
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].split()[6]
        return soup
PK�X��%��deutsche_welle_es.png�PNG


IHDR(-S�PLTEh�j�l�o�q�s�v�x�z�}�~�����������l�n�t�v�z�|�~���������u�}����������{�����������������{��ҡ��������!���ޖ��������.����������^������P�����������;�������^��T����t����=��������������������ݕ��������������_����Y��������������x��������X����R�����������M��e�����/��.�������s�����$����@������3�����L������*�������5�������������F����������	���������6��IDAT]�A
�@���q�m�
:F'�ݦME�hD��07����<��	w����Y��nEC�)����2���qVѓ���k+NsW2W?�%�2�6�� zuL���e<�t¶����ZyuZ/�yI^^�D#o��o��IEND�B`�PK�X�2G�]]deutsche_welle_es.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

class DeutscheWelle_es(BasicNewsRecipe):
    title = 'Deutsche Welle'
    __author__ = 'unkn0wn'
    description = 'Noticias desde Alemania y mundo'
    publisher = 'Deutsche Welle'
    language = 'es'

    oldest_article = 2
    max_articles_per_feed = 50
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}

    remove_attributes = ['height', 'width', 'style']

    keep_only_tags = [
        dict(name='article')
    ]
    
    remove_tags = [
        dict(name=['footer', 'source']),
        dict(attrs={'data-tracking-name':'sharing-icons-inline'}),
        classes('kicker advertisement vjs-wrapper')
    ]

    feeds = [
        ('Titulares', 'http://rss.dw-world.de/rdf/rss-sp-top'),
        ('Noticias de Alemania', 'http://rss.dw-world.de/rdf/rss-sp-ale'),
        ('Internacionales', 'http://rss.dw-world.de/rdf/rss-sp-inter'),
        ('Cultura', 'http://rss.dw-world.de/rdf/rss-sp-cul'),
        ('Ciencia y Tecnología', 'http://rss.dw-world.de/rdf/rss-sp-cyt'),
        ('Economía', 'http://rss.dw-world.de/rdf/rss-sp-eco'),
        ('La prensa opina', 'http://rss.dw-world.de/rdf/rss-sp-press'),
        ('Ecología', 'http://rss.dw-world.de/rdf/rss-sp-ecol'),
        ('Futbol alemán', 'http://rss.dw-world.de/rdf/rss-sp-fut'),
        ('Conozca Alemania', 'http://rss.dw-world.de/rdf/rss-sp-con')
    ]

 
    def preprocess_html(self, soup):
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].split()[6]
        return soup
PK�X��%��deutsche_welle_hr.png�PNG


IHDR(-S�PLTEh�j�l�o�q�s�v�x�z�}�~�����������l�n�t�v�z�|�~���������u�}����������{�����������������{��ҡ��������!���ޖ��������.����������^������P�����������;�������^��T����t����=��������������������ݕ��������������_����Y��������������x��������X����R�����������M��e�����/��.�������s�����$����@������3�����L������*�������5�������������F����������	���������6��IDAT]�A
�@���q�m�
:F'�ݦME�hD��07����<��	w����Y��nEC�)����2���qVѓ���k+NsW2W?�%�2�6�� zuL���e<�t¶����ZyuZ/�yI^^�D#o��o��IEND�B`�PK�X�G1Kttdeutsche_welle_hr.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

class DeutscheWelle_hr(BasicNewsRecipe):
    title = 'Deutsche Welle'
    __author__ = 'unkn0wn'
    description = 'Vesti iz Njemacke i svijeta'
    publisher = 'Deutsche Welle'
    category = 'news, politics, Germany'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    language = 'hr'
    publication_type = 'newsportal'
    remove_empty_feeds = True
    masthead_url = 'http://www.dw-world.de/skins/std/channel1/pics/dw_logo1024.gif'
    remove_javascript = True
    
    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['height', 'width', 'style']

    keep_only_tags = [
        dict(name='article')
    ]
    
    remove_tags = [
        dict(name=['footer', 'source']),
        dict(attrs={'data-tracking-name':'sharing-icons-inline'}),
        classes('kicker advertisement vjs-wrapper')
    ]
    
    feeds = [
        (u'Svijet', u'http://rss.dw-world.de/rdf/rss-cro-svijet'),
        (u'Europa', u'http://rss.dw-world.de/rdf/rss-cro-eu'),
        (u'Njemacka', u'http://rss.dw-world.de/rdf/rss-cro-ger'),
        (u'Vijesti', u'http://rss.dw-world.de/rdf/rss-cro-all')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].split()[6]
        return soup
PK�X��%��deutsche_welle_pt.png�PNG


IHDR(-S�PLTEh�j�l�o�q�s�v�x�z�}�~�����������l�n�t�v�z�|�~���������u�}����������{�����������������{��ҡ��������!���ޖ��������.����������^������P�����������;�������^��T����t����=��������������������ݕ��������������_����Y��������������x��������X����R�����������M��e�����/��.�������s�����$����@������3�����L������*�������5�������������F����������	���������6��IDAT]�A
�@���q�m�
:F'�ݦME�hD��07����<��	w����Y��nEC�)����2���qVѓ���k+NsW2W?�%�2�6�� zuL���e<�t¶����ZyuZ/�yI^^�D#o��o��IEND�B`�PK�X/n����deutsche_welle_pt.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

class DeutscheWelle_pt(BasicNewsRecipe):
    title = 'Deutsche Welle'
    __author__ = 'unkn0wn'
    description = 'Noticias desde Alemania y mundo'
    publisher = 'Deutsche Welle'
    category = 'news, politics, Germany'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    language = 'pt'
    publication_type = 'newsportal'
    remove_empty_feeds = True
    masthead_url = 'http://www.dw-world.de/skins/std/channel1/pics/dw_logo1024.gif'
    
    
    remove_javascript = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['height', 'width', 'style']
    
    def preprocess_html(self, soup):
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].split()[6]
        return soup

    keep_only_tags = [
        dict(name='article')
    ]
    
    remove_tags = [
        dict(name=['footer', 'source']),
        dict(attrs={'data-tracking-name':'sharing-icons-inline'}),
        classes('kicker advertisement vjs-wrapper')
    ]

    feeds = [(u'Noticias', u'http://rss.dw-world.de/rdf/rss-br-all')]
PK�X��%��deutsche_welle_ru.png�PNG


IHDR(-S�PLTEh�j�l�o�q�s�v�x�z�}�~�����������l�n�t�v�z�|�~���������u�}����������{�����������������{��ҡ��������!���ޖ��������.����������^������P�����������;�������^��T����t����=��������������������ݕ��������������_����Y��������������x��������X����R�����������M��e�����/��.�������s�����$����@������3�����L������*�������5�������������F����������	���������6��IDAT]�A
�@���q�m�
:F'�ݦME�hD��07����<��	w����Y��nEC�)����2���qVѓ���k+NsW2W?�%�2�6�� zuL���e<�t¶����ZyuZ/�yI^^�D#o��o��IEND�B`�PK�X�gT���deutsche_welle_ru.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class DeutscheWelle(BasicNewsRecipe):
    title = u'Deutsche Welle \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u043E\u043C'
    description = u'\u0420\u0443\u0441\u0441\u043A\u0430\u044F \u0440\u0435\u0434\u0430\u043A\u0446\u0438\u044F Deutsche Welle: \u043D\u043E\u0432\u043E\u0441\u0442\u0438, \u0430\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430, \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0438 \u0440\u0435\u043F\u043E\u0440\u0442\u0430\u0436\u0438 \u0438\u0437 \u0413\u0435\u0440\u043C\u0430\u043D\u0438\u0438 \u0438 \u0415\u0432\u0440\u043E\u043F\u044B, \u043D\u0435\u043C\u0435\u0446\u043A\u0438\u0439 \u0438 \u0435\u0432\u0440\u043E\u043F\u0435\u0439\u0441\u043A\u0438\u0439 \u0432\u0437\u0433\u043B\u044F\u0434 \u043D\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 \u0420\u043E\u0441\u0441\u0438\u0438 \u0438 \u043C\u0438\u0440\u0435,  \u043F\u0440\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0441\u043E\u0432\u0435\u0442\u044B \u0434\u043B\u044F \u0442\u0443\u0440\u0438\u0441\u0442\u043E\u0432 \u0438 \u0442\u0435\u0445, \u043A\u0442\u043E \u0436\u0435\u043B\u0430\u0435\u0442 \u0443\u0447\u0438\u0442\u044C\u0441\u044F \u0438\u043B\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u0432 \u0413\u0435\u0440\u043C\u0430\u043D\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0442\u0440\u0430\u043D\u0430\u0445 \u0415\u0432\u0440\u043E\u0441\u043E\u044E\u0437\u0430.'  # noqa
    __author__ = 'bugmen00t, unkn0wn'
    publication_type = 'newspaper'
    oldest_article = 2
    max_articles_per_feed = 100
    language = 'ru'
    # cover_url = 'https://www.dw.com/cssi/dwlogo-print.gif'

    remove_javascript = True
    no_stylesheets = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['height', 'width', 'style']
    
    def preprocess_html(self, soup):
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].split()[6]
        return soup

    keep_only_tags = [
        dict(name='article')
    ]
    
    remove_tags = [
        dict(name=['footer', 'source']),
        dict(attrs={'data-tracking-name':'sharing-icons-inline'}),
        classes('kicker advertisement vjs-wrapper')
    ]

    feeds = [
        (
            u'\u0412\u0435\u0441\u044C \u0441\u0430\u0439\u0442',
            'https://rss.dw.com/xml/rss-ru-all'
        ),
        (
            u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'http://rss.dw.de/xml/rss-ru-news'
        ),
        (
            u'\u041F\u043E\u043B\u0438\u0442\u0438\u043A\u0430 \u0438 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E',
            'http://rss.dw.de/xml/rss-ru-pol'
        ),
        (
            u'\u042D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0430',
            'http://rss.dw.de/xml/rss-ru-eco'
        ),
        (
            u'\u0410\u0432\u0442\u043E\u043C\u043E\u0431\u0438\u043B\u044C',
            'http://rss.dw.de/xml/rss-ru-auto'
        ),
        (
            u'\u041A\u0443\u043B\u044C\u0442\u0443\u0440\u0430 \u0438 \u0441\u0442\u0438\u043B\u044C \u0436\u0438\u0437\u043D\u0438',
            'http://rss.dw.de/xml/rss-ru-cul'
        ),
        (u'\u0420\u043E\u0441\u0441\u0438\u044F', 'http://rss.dw.de/xml/rss-ru-rus'),
        (
            u'\u0413\u0435\u0440\u043C\u0430\u043D\u0438\u044F',
            'http://rss.dw.de/xml/rss-ru-ger'
        ),
        (u'\u0415\u0432\u0440\u043E\u043F\u0430', 'http://rss.dw.de/xml/rss-ru-eu'),
        (
            u'\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u044C',
            'http://rss.dw.de/xml/rss-ru-bel'
        ),
        (
            u'\u0423\u0447\u0435\u0431\u0430 \u0438 \u043A\u0430\u0440\u044C\u0435\u0440\u0430',
            'http://rss.dw.de/xml/rss-ru-campus-karriere'
        ),
        (u'\u0423\u0447\u0435\u0431\u0430 ', 'http://rss.dw.de/xml/rss-ru-campus'),
        (
            u'\u041A\u0430\u0440\u044C\u0435\u0440\u0430 ',
            'http://rss.dw.de/xml/rss-ru-karriere'
        ),
        (
            u'\u0422\u0443\u0440\u0438\u0441\u0442\u0443 \u043D\u0430 \u0437\u0430\u043C\u0435\u0442\u043A\u0443',
            'http://rss.dw.de/xml/rss-ru-discover-ger'
        )
    ]
PK�X��%��deutsche_welle_sr.png�PNG


IHDR(-S�PLTEh�j�l�o�q�s�v�x�z�}�~�����������l�n�t�v�z�|�~���������u�}����������{�����������������{��ҡ��������!���ޖ��������.����������^������P�����������;�������^��T����t����=��������������������ݕ��������������_����Y��������������x��������X����R�����������M��e�����/��.�������s�����$����@������3�����L������*�������5�������������F����������	���������6��IDAT]�A
�@���q�m�
:F'�ݦME�hD��07����<��	w����Y��nEC�)����2���qVѓ���k+NsW2W?�%�2�6�� zuL���e<�t¶����ZyuZ/�yI^^�D#o��o��IEND�B`�PK�X�Rl��deutsche_welle_sr.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

class DeutscheWelle_sr(BasicNewsRecipe):
    title = 'Deutsche Welle'
    __author__ = 'unkn0wn'
    description = 'Vesti iz Nemacke i sveta'
    publisher = 'Deutsche Welle'
    category = 'news, politics, Germany'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    language = 'sr'
    publication_type = 'newsportal'
    remove_empty_feeds = True
    masthead_url = 'http://www.dw-world.de/skins/std/channel1/pics/dw_logo1024.gif'
    remove_javascript = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['height', 'width', 'style']
    
    def preprocess_html(self, soup):
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].split()[6]
        return soup

    keep_only_tags = [
        dict(name='article')
    ]
    
    remove_tags = [
        dict(name=['footer', 'source']),
        dict(attrs={'data-tracking-name':'sharing-icons-inline'}),
        classes('kicker advertisement vjs-wrapper')
    ]
    
    feeds = [
        (u'Politika', u'http://rss.dw-world.de/rdf/rss-ser-pol'),
        (u'Srbija', u'http://rss.dw-world.de/rdf/rss-ser-pol-ser'),
        (u'Region', u'http://rss.dw-world.de/rdf/rss-ser-pol-region'),
        (u'Evropa', u'http://rss.dw-world.de/rdf/rss-ser-pol-eu'),
        (u'Nemacka', u'http://rss.dw-world.de/rdf/rss-ser-pol-ger'),
        (u'Svet', u'http://rss.dw-world.de/rdf/rss-ser-pol-ger'),
        (u'Pregled stampe', u'http://rss.dw-world.de/rdf/rss-ser-pol-ger'),
        (u'Nauka Tehnika Medicina', u'http://rss.dw-world.de/rdf/rss-ser-science'),
        (u'Kultura', u'feed:http://rss.dw-world.de/rdf/rss-ser-cul')
    ]

PK�X�3\\deutschland_funk.recipe# -*- coding: utf-8 -*-
#from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe

__license__   = 'GPL v3'
__copyright__ = '2014, 2023 Armin Geller'

'''
Fetch Deutschlandfunk & Deutschlandfunk Kultur
'''
##
## Written:      2014-08-29
## Last Edited:  2023-04-26
## Version:1.6
## New RSS source: https://www.deutschlandfunk.de/rss-angebot-102.html

class AdvancedUserRecipe1432200863(BasicNewsRecipe):

    title            = 'Deutschlandfunk & Deutschlandfunk Kultur'
    __author__       = 'Armin Geller'
    publisher        = 'Deutschlandfunk'
    category         = 'Radio, News, Politics, Social, Culture, Nature, Environmental'
    timefmt          = ' [%a, %d %b %Y]'
    language         = 'de'
    encoding         = 'UTF-8'
    publication_type = 'News feed'
    oldest_article   = 2
    max_articles_per_feed = 100
    auto_cleanup     = False

    extra_css      =  '''
                      h1, h2 {font-size: 1.6em; text-align: left}
                      .article-header-description {font-size: 1em; font-style: italic; font-weight: normal;margin-bottom: 1em}
                      .b-image-figure, .caption-figure.is-left, .b-image-credits {font-size: .75em; font-weight: normal;margin-bottom: .75em}
                      '''



    feeds = [
              ('DLF Nachrichten', 'https://www.deutschlandfunk.de/nachrichten-100.rss'),
              ('DLF Politikportal', 'https://www.deutschlandfunk.de/politikportal-100.rss'),
              ('DLF Wirtschaft', 'https://www.deutschlandfunk.de/wirtschaft-106.rss'),
              ('DLF Wissen', 'https://www.deutschlandfunk.de/wissen-106.rss'),
              ('DLF Kulturportal', 'https://www.deutschlandfunk.de/kulturportal-100.rss'),
              ('DLF Europa', 'https://www.deutschlandfunk.de/europa-112.rss'),
              ('DLF Gesellschaft', 'https://www.deutschlandfunk.de/gesellschaft-106.rss'),
              ('DLF Sportportal', 'https://www.deutschlandfunk.de/sportportal-100.rss'),
              ('DLF-Kultur Politik', 'https://www.deutschlandfunkkultur.de/politik-114.rss'),
              ('DLF-Kultur Bücher', 'https://www.deutschlandfunkkultur.de/buecher-108.rss'),
              ('DLF-Kultur Musikportal', 'https://www.deutschlandfunkkultur.de/musikportal-100.rss'),
              ('DLF-Kultur Wissenschaft', 'https://www.deutschlandfunkkultur.de/wissenschaft-108.rss'),
              ('DLF-Kultur Meinung / Debatte', 'https://www.deutschlandfunkkultur.de/meinung-debatte-100.rss'),
              ('DLF-Kultur Umwelt', 'https://www.deutschlandfunkkultur.de/umwelt-104.rss'),
              ('DLF-Kultur Philosophie', 'https://www.deutschlandfunkkultur.de/philosophie-104.rss'),
              ('DLF-Kultur Psychologie', 'https://www.deutschlandfunkkultur.de/psychologie-100.rss'),
              ('DLF-Kultur Geschichte', 'https://www.deutschlandfunkkultur.de/geschichte-136.rss'),
              ('DLF-Kultur Leben', 'https://www.deutschlandfunkkultur.de/leben-108.rss'),
              ('DLF-Kultur Bühne', 'https://www.deutschlandfunkkultur.de/buehne-100.rss'),
              ('DLF-Kultur Film / Serie', 'https://www.deutschlandfunkkultur.de/film-serie-100.rss'),
            ]
    keep_only_tags = [
                        dict(name='nav', attrs={'class':'b-breadcrumbs'}), # DLF articles
                        dict(name='article', attrs={'class':'b-article'}), # DLF articles
                        dict(name='div', attrs={'class':[
                                                         'b-section-article-head-area',
                                                         'b-section-editor-content',
                                                        ]}),    # DLF Kultur articles
                     ]

    remove_tags = [
                    dict(name='div', attrs={'class':[
                                                  #   'article-header-actions',
                                                     'b-article-extended-emphasis is-teaser-list u-space-bottom-xl',
                                                     'article-extended-emphasis-teaser-group',
                                                     'b-embed-opt-in js-embed-opt-in',
                                                    ]}),                   # DLF articles
                    dict(name='ul', attrs={'class':['b-social-icons']}),   # DLF articles

                    dict(name='ul', attrs={'class':['b-social-icons']}),      # DLF Kultur articles
                    dict(name='div', attrs={'class':'b-footer-area-series'}), # DLF Kultur articles
                    dict(name='div', attrs={'id':'weekender'})
                  ]
PK�X���B��developpez.png�PNG


IHDR�aWIDATxڕ�leaDᳶm۶m۶m۶m�
ֻ�����j��/�x	�g!��*e�=jH����@�ڗ��ksrLަGfn%OaAe�J1��rżCk��8:|P_���Α�N$D �+З��m��]�P�z���
,��U��#�T_]�p�ł���D�g4
��L{$�P��~���X�"����^r��Y^�=��d���R�:vV�-������ݽ�MC�\�i�3��e��R�\��dd�'מ}
ml��j�i�`��Q:�I4�yyϮ���mIF�i*Ѳ�����1�W+r�G��Ua�/L�K�YX2m��*��E�9K���ٚ��T��Z{kl�
xIEND�B`�PK�X�T�j��developpez.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1301849956(BasicNewsRecipe):
    title = u'Developpez.com'
    description = u'Toutes les news du site Developpez.com'
    publisher = u'Developpez.com'
    timefmt = ' [%a, %d %b, %Y]'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'ISO-8859-1'
    language = 'fr'
    __author__ = 'louhike'
    remove_javascript = True
    keep_only_tags = [dict(name='div', attrs={'class': 'content'})]

    feeds = [(u'Tous les articles', u'http://www.developpez.com/index/rss')]

    def get_cover_url(self):
        return 'http://javascript.developpez.com/template/images/logo.gif'
PK�X�[Z��dhnet_be.png�PNG


IHDR�axIDATx�Ւ��p�@UP����
� )@@� (A �M
 �A͋��gc���{����Q~^��r�l6c8���t:4�M��*����:�\�J�B�T"������v�����v�|�x<X�V�R)j�(ʷ���v��F��d2A4����	��_�ٶ\@��B4��B!v��Ӊr��-X`�Tķh:��D�;���%��H�x�l6��8,���n���g�Ţ��~���;�-h�&!����z ��h�ܐ���B�:��;� ���M��+�˅�� ��L&���3�2Q��BAz�a$�Ib����[0�/�`�!ʲ4N�'
�&J#�Z��{�
��E9�!}IEND�B`�PK�Xa�[T��dhnet_be.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2011, Lionel Bergeret <lbergeret at gmail.com>'
'''
dhnet.be
'''

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class DHNetBe(BasicNewsRecipe):
    title = u'La Derniere Heure'
    __author__ = u'Lionel Bergeret'
    description = u'News from Belgium in French'
    publisher = u'dhnet.be'
    category = 'news, Belgium'
    oldest_article = 3
    language = 'fr'
    masthead_url = 'http://www.dhnet.be/images/homepage_logo_dh.gif'

    max_articles_per_feed = 20
    no_stylesheets = True
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'

    keep_only_tags = [
        dict(name='div', attrs={'id': 'articleText'}), dict(
            name='div', attrs={'id': 'articlePicureAndLinks'})
    ]

    feeds = [
        (u'La Une', u'http://www.dhnet.be/rss'), (u'La Une Sports',
                                                  u'http://www.dhnet.be/rss/dhsports/'), (u'La Une Info', u'http://www.dhnet.be/rss/dhinfos/')
    ]

    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

    def get_cover_url(self):
        cover_url = strftime(
            'http://pdf-online.dhnet.be/pdfonline/image/%Y%m%d/dh_%Y%m%d_nam_infoge_001.pdf.L.jpg')
        return cover_url
PK�X"�h��di.png�PNG


IHDR�a�IDATxڜ�C�UA�o�mc����m۶m۶�ڄMvm�����y�;q§Ž3s�;��c"���^�t˕��l��}���M!����g�q`���y$�g�DƾɈ�b��T��L$�c�߄����}C_�4	ƎQ�,h���n0v���&��� ��
���~��5��Ef���F(���)���;f���9�	���Oϡ�+�����%�\��աt�	��y���O%
`_�ŝ��uΊ@~�4���j`��k�%�[E}�cM��8F�
]��v½s&��I��Z�.G�ԆUL]Ӄ�e��S�Y�����B��ٕ��򎟦�0�/�u�'�_�g>1վEi��و�k�{nA/�r~H��~�Hɧo�����;�i|�_G��տ_�A���CIEND�B`�PK�XW�KK	di.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8

__license__ = 'GPL v3'
__author__ = 'Mori'
__version__ = 'v. 0.5'
'''
di.com.pl
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re


class DziennikInternautowRecipe(BasicNewsRecipe):
    __author__ = 'Mori'
    language = 'pl'

    title = u'Dziennik Internautów'
    publisher = u'Dziennik Internaut\u00f3w Sp. z o.o.'
    description = u'Internet w \u017cyciu i biznesie. Porady, wywiady, interwencje, bezpiecze\u0144stwo w Sieci, technologia.'

    max_articles_per_feed = 100
    oldest_article = 7
    cover_url = 'http://di.com.pl/pic/logo_di_norm.gif'

    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'

    extra_css = '''
            .fotodesc{font-size: 75%;}
            .pub_data{font-size: 75%;}
            .fotonews{clear: both; padding-top: 10px; padding-bottom: 10px;}
            #pub_foto{font-size: 75%; float: left; padding-right: 10px;}
    '''

    feeds = [
        (u'Dziennik Internaut\u00f3w', u'http://feeds.feedburner.com/glowny-di')
    ]

    keep_only_tags = [
        dict(name='div', attrs={'id': 'pub_head'}),
        dict(name='div', attrs={'id': 'pub_content'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'poradniki_context'}),
        dict(name='div', attrs={'class': 'uniBox'}),
        dict(name='object', attrs={}),
        dict(name='h3', attrs={}),
        dict(attrs={'class': 'twitter-share-button'})
    ]

    preprocess_regexps = [
        (re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
        [
            (r', <a href="http://di.com.pl/komentarze,.*?</div>', lambda match: '</div>'),
            (r'<div class="fotonews".*?">',
             lambda match: '<div class="fotonews">'),
            (r'http://di.com.pl/pic/photo/mini/',
             lambda match: 'http://di.com.pl/pic/photo/oryginal/'),
            (r'\s*</', lambda match: '</'),
        ]
    ]

    def skip_ad_pages(self, soup):
        if 'Advertisement' in soup.title:
            nexturl = soup.find('a')['href']
            return self.index_to_soup(nexturl, raw=True)
PK�X!����diagonal.png�PNG


IHDR  D����PLTE���������'((���"##%''(**,--���#%%���   ""���*,,	������������		799���			   _`a��������������������?AAmno�~fgg���������=>>������|~������������%%%JKKHJJ'(*SUU�����������������������������]^^���������MMN���jkk���`aaPQQ������hii>??z{{iij���'''����ggh�������XYZSTT���yzz���������������������\]](*,��⛜������%((���"""ZZ[������EFF���*,-LMM���###������fgh���ghi������QQQ���^^_add�������������(�qtRNS@��f�IDATx^��S�,A��BCcm۶�m۶m�ޭ�و�S{�k�'�"�-��ЍpΉ�?f=�Іݝ{W����C�%E�+Al�o�iLV��v��hFl�������4�W�20EQl�ؚ
])�	//W��
T����fR���J\|��QE�a�>��V0�m"*�Z3=�"%`��b�P��d����r@v���u��A*�/�
�?����!]�:��$2�8G=В=�TN�S.P��3�?$Ϟ�qA�A���-��/a�\�+�[_����7oݾ���{&-��y���H|�As��
=i|���[�*�M��,��(�%�i���e1U��ƴp���	��!�ǫ��������kŚ��?�~��m"�Ň�ǡ��$�^z��|��/�/��x�Y�1V;��}�IEND�B`�PK�XU�1€�diagonal.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
__license__ = 'GPL v3'
__copyright__ = 'Ruben Pollan <meskio@sindominio.net>'
__docformat__ = 'restructuredtext en'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1335657507(BasicNewsRecipe):
    title = u'diagonal'
    __author__ = 'Ruben Pollan'
    description = 'Periodico quincenal de actualidad critica'
    language = 'es'

    oldest_article = 15
    max_articles_per_feed = 100
    auto_cleanup = True
    cover_url = u'http://diagonalperiodico.net/IMG/siteon0.jpg'

    feeds = [(u'Panorama', u'http://diagonalperiodico.net/-Panorama-.html?page=backend'),
             (u'Global', u'http://diagonalperiodico.net/-Global,104-.html?page=backend'),
             (u'Fotonoticia - Galería',
              u'http://diagonalperiodico.net/-Fotonoticia-Galeria-.html?page=backend'),
             (u'Libertades y Derechos',
              u'http://diagonalperiodico.net/-Libertades-y-Derechos,77-.html?page=backend'),
             (u'Saberes', u'http://diagonalperiodico.net/-Saberes,78-.html?page=backend'),
             (u'En movimiento',
              u'http://diagonalperiodico.net/-En-movimiento-.html?page=backend'),
             (u'Culturas', u'http://diagonalperiodico.net/-Culturas,89-.html?page=backend'),
             (u'Cuerpo', u'http://diagonalperiodico.net/-Cuerpo,99-.html?page=backend'),
             (u'La plaza', u'http://diagonalperiodico.net/-La-plaza-.html?page=backend'),
             (u'Enfoques', u'http://diagonalperiodico.net/-Enfoques,106-.html?page=backend'),
             (u'Humor - Galería',
              u'http://diagonalperiodico.net/-Humor-Galeria-.html?page=backend'),
             (u'Entrevistas digitales',
              u'http://diagonalperiodico.net/-Entrevistas-Digitales-.html?page=backend'),
             (u'Cartas a diagonal',
              u'http://diagonalperiodico.net/-Cartas-a-Diagonal-.html?page=backend'),
             (u'Blogs', u'http://diagonalperiodico.net/-Blogs-.html?page=backend')]

    def get_article_url(self, article):
        link = article.get('link')
        return 'http://diagonalperiodico.net/' + link
PK�X`�	�kkdiario_cordoba.png�PNG


IHDR  ��tRNSn��	pHYs��IDATHǵV]hK��@�P!�%��!���!��R�(��VT��"���)�p�E_�A�A,*EP�B�i����^c���k�5Mc���3��a�lP�a3Cfϙ��oP.���mG�ry���RT���X�ز�^0�
��U�t1[f��q�X�^[i_
%�ξLGFa�F�\:C�+����&
#������&v��._��uJ� v�aH����ݘ�����Ɓ,:�|+�͑�%g ��1r�ڂ��%{"�'��]�ݙ�GR�W[v�Ҩ�o��m�
$Q;�F���bL�-�}1Ed&�T�+��=u��5��#��¥1��Щ�+`���Q��e_���=]0�%s��GO8�Zpxx�s�+~Lf:��q�c�M";F.M�4 FmI䀬�'�5`:����7�Q��b���V�������1*?���=�޼��M!��W���	���iI�H��C���&9��+�6��N���R�%Dsܣ�&�0v�@��!hE�+�V*0o�Cs�`�.a���@w�>���6T*���"�){�?is)9�1F�@����*��?�2[va$(<�>�e��zO�?逛x�n��D�N�q ��C��Т��|z�&����_����>A
"o�o�/�H��=�sPK�x�q�'����Sg6��Y��4QO�FAX��^ő��^�(�Z�%Iu[]����D��i�gM�P�����|�n
ѹnV�f͎�}��Mh�j�
&)��A���mޙ�6Q�0)a�N\x�tj��ԉ�M5��S1[JoؖDN5���S�x�]�$OHj1r2و�h��-	�ѱ'�$�vA
�(>#z߆� �(��!D
�O���\2
5μQ�X��V��Q.��d]2�`�hs�<i.8u-�%4�?��	��O�Cb�i��Y�%/z�B+����]�1�c��{
�{ =|��CL���\?y���X�ז��A��Ҙ4�x���0
��ʯ�
��Ց6�t��ձ��/����żH�e���}}��53��̑IEND�B`�PK�X��j��diario_cordoba.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
diariocordoba.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Diariosur(BasicNewsRecipe):
    title = u'Diario Cordoba'
    __author__ = u'Francisco'
    description = u'News Cordoba'
    oldest_article = 5
    max_articles_per_feed = 100
    delay = 0
    timeout = 120
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'UTF-8'
    remove_javascript = True
    language = 'es'
    extra_css = 'body{font-family: Arial,Helvetica,sans-serif}'

    remove_attributes = ['height', 'width']

    keep_only_tags = [
        dict(name='div', attrs={'id': 'contenidos'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'Recorte'}),
        dict(name='div', attrs={'id': 'comentarios'}),
        dict(name='div', attrs={'id': 'CajaAccesoCuentaUsuario'}),
        dict(name='div', attrs={'id': 'cajacomparte'}),
        dict(name='div', attrs={'class': 'FormularioDeAcceso'}),
        dict(name='div', attrs={'class': 'TextoFormularioDeAcceso'}),
        dict(name='div', attrs={'class': 'Recorte'}),
        dict(name='div', attrs={'id': 'IframeCajaComparte'}),
        dict(name='div', attrs={'id': 'CintilloComentario'}),
        dict(name='div', attrs={'id': 'EscribeComentario'}),
        dict(name='div', attrs={'class': 'Nota'}),
        dict(name='div', attrs={'id': 'FormularioComentario'}),
        dict(name='div', attrs={'id': 'Comparte'}),
        dict(name='iframe', attrs={'id': 'IframeCajaComparte'}),
        dict(name='ul', attrs={'class': 'herramientasDeNoticia'}),
        dict(name='div', attrs={'id': 'NoticiaEnPapel'}),
        dict(name='div', attrs={'class': 'navegaNoticias'}),
        dict(name='p', attrs={'class': 'RecorteEnNoticias'}),
        dict(name='ul', attrs={'class': 'herramientasDeNoticia'}),
        dict(name='div', attrs={'class': 'navegaNoticias'}),
        dict(name='div', attrs={'id': 'CajaComparte'}),
        dict(name='div', attrs={'id': 'Comparte'})



    ]

    html2lrf_options = [
        '--comment', description, '--base-font-size', '6', '--category', 'news, Spain', '--ignore-tables'
    ]

    feeds = [
        (u'Ultima Hora', 'http://www.diariocordoba.com/rss/ultimahora.xml'),
        (u'Tema del Dia', 'http://www.diariocordoba.com/rss/106.xml'),
        (u'Local', 'http://www.diariocordoba.com/rss/101.xml'),
        (u'Provincia', 'http://www.diariocordoba.com/rss/102.xml'),
        (u'Andalucia', 'http://www.diariocordoba.com/rss/1.xml'),
        (u'Opinion', 'http://www.diariocordoba.com/rss/100.xml'),
        (u'Deportes', 'http://www.diariocordoba.com/rss/4.xml'),
        (u'Espa\xc3\xb1a', 'http://www.diariocordoba.com/rss/7.xml'),
        (u'Internacional', 'http://www.diariocordoba.com/rss/6.xml'),
        (u'Economia', 'http://www.diariocordoba.com/rss/5.xml'),
        (u'Cultura', 'http://www.diariocordoba.com/rss/3.xml'),
        (u'Sociedad', 'http://www.diariocordoba.com/rss/103.xml'),
        (u'Gente', 'http://www.diariocordoba.com/rss/204.xml'),
        (u'Noticias Curiosas', 'http://www.diariocordoba.com/rss/205.xml'),
        (u'Tecnologia', 'http://www.diariocordoba.com/rss/206.xml')


    ]
PK�X
|Y��diario_de_noticias.png�PNG


IHDR  szz�aIDATx�b�����b@���X����Ŷ��&��m۶m����,��p�m���fkpʫ�M2�u�L���Y�,��+]�D��DC��x}���ǿL'��^�J���B�����EEE���bUii����,�F/���{��D�A����ek������+,M,C>��p�DG$'گQk.��v8{�{��mY��vGw���6��:��F���x�뛻p�B ���f�3��/���I6����!�����f���@pr*���e��R*+
��lfK�sI�&��y���͕!��٢�`x�w����r]����K���h|������ީ��Aش�q;�����J�:��<�R�ٞ�l���?��뷼S���5db�ܣ�@
������)S�p�8�Q�/n��n�[m?��;��Q���S��M���h�{<��A�p� �X�揥���Qox����*�OQs��f:^�k8K�K6���L�W�`2�e�qոV�@�I~�
k��(%Z�<������l$�G;`6�^ʹ��!����a�
�+L��.}_�aL:�2����k W�T�h����i����q��ִ`���量I��e2x��ϓ�
<)�i_��'�v4��y����+7�w��%��6��p��C#z1�X��_��a�>�U�zrXN�
Z�f{�/U�KĒ�Țf�D���x���H6�J��;�w
�aj�:	��c��؂�˗�T�ښ�H4��b1���&D���/N_�_��UW\�/�k��$�H\Oz>����ڑJ&��u�=�1��e�Y�F9	dd���
��IEND�B`�PK�X��ɦ��diario_de_noticias.recipe# vim:fileencoding=UTF-8

from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1365070687(BasicNewsRecipe):
    title = 'Diário de Notícias'
    oldest_article = 7
    language = 'pt'
    __author__ = 'Jose Pinto'
    max_articles_per_feed = 100
    keep_only_tags = [dict(name='div', attrs={'id': 'cln-esqmid'})]
    remove_tags = [dict(name='table', attrs={'class': 'TabFerramentasInf'})]

    feeds = [(u'Portugal', u'http://feeds.dn.pt/DN-Portugal'),
             (u'Globo', u'http://feeds.dn.pt/DN-Globo'),
             (u'Economia', u'http://feeds.dn.pt/DN-Economia'),
             (u'Ci\xeancia', u'http://feeds.dn.pt/DN-Ciencia'),
             (u'Artes', u'http://feeds.dn.pt/DN-Artes'),
             (u'TV & Media', u'http://feeds.dn.pt/DN-Media'),
             (u'Opini\xe3o', u'http://feeds.dn.pt/DN-Opiniao'),
             (u'Pessoas', u'http://feeds.dn.pt/DN-Pessoas')
             ]
PK�XD�@��diario_el_pueblo.png�PNG


IHDR  ��tRNSn��	pHYs���IDATH��UMK1�)!C/���(BKՃ�"�kmk���n�Rh1��^v�˼��{/Q���%HW�8��?R5�Z�k�]��^?���?v\Z��JC7[�^�X��Gz��+�}HM�ڈ��A�_��И�ME�&Ј�=�$�gp�^٥�p��n�M�V"��_�k�ROp.��NZ1�)�9-�*G���(�Xl��q��U��S���uQ"�)�X��?��sw^
�HFds&��"5$�K~�0v�dA��mX΂�[�qđ�R�ͮ��ȉ�̹i��YPV�b�;����q,<	x�� Gq\Y�b�^��n|l?c�b�]8���`5'���NZ�*Ƹc�ŮJ��3E��1�⫝̸"����Y5��ķ�p ���:�4�BJ=���3�IEND�B`�PK�X2��EJJdiario_el_pueblo.recipe#!/usr/bin/env python
##
# Title:        Diario El Pueblo News and Sports Calibre Recipe
# Contact:      Carlos Alves - <carlosalves90@gmail.com>
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    Carlos Alves - <carlosalves90@gmail.com>
##
# Written:      September 2013
# Last Edited:  2018-02-13
##
__license__ = 'GPL v3'
__author__ = '2013, Carlos Alves <carlosalves90@gmail.com>'
'''
diarioelpueblo.com.uy
'''

from calibre.web.feeds.news import BasicNewsRecipe


class General(BasicNewsRecipe):
    title = 'Diario El Pueblo'
    __author__ = 'Carlos Alves'
    description = 'Noticias de Salto - Uruguay'
    tags = 'news, sports'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 5
    encoding = 'utf8'
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 2
    max_articles_per_feed = 100
    keep_only_tags = [dict(name='div', attrs={'class': 'post-alt blog'})]

    remove_tags = [
        dict(
            name='div',
            attrs={
                'class': ['hr', 'titlebar', 'volver-arriba-right', 'navigation']
            }
        ),
        dict(name='div', attrs={
            'id': 'comment suckerfish crp_related'.split(),
        }),
        dict(name='h3', attrs={
            'class': ['post_date']
        }),
        dict(name=['object', 'link'])
    ]

    extra_css = '''
                h1{font-family: Georgia,"Times New Roman",Times,serif}
                h3{font-family: Georgia,"Times New Roman",Times,serif}
                h2{font-family: Georgia,"Times New Roman",Times,serif}
                p{font-family: Verdana,Arial,Helvetica,sans-serif}
                body{font-family: Verdana,Arial,Helvetica,sans-serif}
                img{margin-bottom: 0.4em; display:block;}
                '''

    feeds = [(u'Articulos', u'http://www.diarioelpueblo.com.uy/feed')]

    def get_cover_url(self):
        return None

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X����diario_extra.png�PNG


IHDR  �Tg�0PLTE������  �00�@@�PP�``�pp��������������������$tRNS@��faIDATx^��A� D�ZXX�,���,�B,�B-`�ngz��e��o�SU��6-��®|�zD00p����!@��0'�캼�q�N��~�'3g�_�IEND�B`�PK�X����		diario_extra.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class goonews(BasicNewsRecipe):
    __author__ = 'Douglas Delgado'
    title = u'Diario Extra'
    publisher = 'Sociedad Periodistica Extra Limitada'
    description = 'Diario de circulacion nacional de Costa Rica.'
    category = 'Spanish, Entertainment'
    masthead_url = 'http://www.diarioextra.com/img/apariencia/logo.png'

    oldest_article = 7
    delay = 1
    max_articles_per_feed = 100
    auto_cleanup = True
    encoding = 'utf-8'
    language = 'es_CR'
    use_embedded_content = False
    remove_empty_feeds = True
    remove_javascript = True
    no_stylesheets = True

    feeds = [(u'Nacionales',
              u'http://www.diarioextra.com/includes/rss_text.php?id=1'),
             (u'Internacionales',
              u'http://www.diarioextra.com/includes/rss_text.php?id=2'),
             (u'Sucesos',
              u'http://www.diarioextra.com/includes/rss_text.php?id=3'),
             (u'Deportes',
              u'http://www.diarioextra.com/includes/rss_text.php?id=6'),
             (u'Espectaculos',
              u'http://www.diarioextra.com/includes/rss_text.php?id=7'),
             (u'Opinion',
              u'http://www.diarioextra.com/includes/rss_text.php?id=4')]

    def get_cover_url(self):
        index = 'http://kiosko.net/cr/np/cr_extra.html'
        soup = self.index_to_soup(index)
        for image in soup.findAll('img', src=True):
            if image['src'].endswith('cr_extra.750.jpg'):
                return image['src']
        return None

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:30px;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal; font-style:italic; font-size:18px;}
                '''
PK�X_��kdiario_ibiza.png�PNG


IHDR(-S#PLTEPxQxRyRzT{T{U{U|!V}"W}#X~%Y'[)\�+]�+^�,^�.`�2c�9h�It�W|�[��^��^��`��c��d��e��f��g��h��l��s��y��z����������������������������������������������������������¢�������Ĥ����è�ǩ�ū�Ǭ�ʭ�ɲ�Ʋ�γ�dz�̳�κ�˽�Ϳ�������������������������������������������������������������������������V��IDATU��J�P��/7��������$��*�� Hݺ��:�bѡ���kzN�4g��f
Co9�Y|��}\M���˖��Ϥ9yy�>�g�$�(ތ7��J �(��J&$��b@� �3�BF)�E!a��<�J"�����K=پ��Gw�e�w��욡UF�v�P��(a7�M�IEND�B`�PK�X��+"��diario_ibiza.recipe__license__ = 'GPL v3'
__author__ = 'Joan Tur, based on El Pais version by Jordi Balcells & elargentino.com version by Darko Miletic'
description = 'Principal periodico de las islas Pitiusas, Ibiza y Formentera (Espanya) - v1.06 (29/04/2011)'
__docformat__ = 'restructuredtext en'

'''
diariodeibiza.es
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DiarioDeIbiza(BasicNewsRecipe):
    __author__ = 'Joan Tur, cullet'
    description = 'Principal periodico de las islas Pitiusas, Ibiza y Formentera (Espanya) - v1.06 (29/04/2011)'

    cover_url = 'http://estaticos01.diariodeibiza.es//elementosWeb/mediaweb/images/logo.jpg'
    title = u'Diario de Ibiza digital'
    publisher = u'Editorial Prensa Iberica'
    category = 'News, politics, culture, economy, general interest'
    language = 'es'

    encoding = 'iso-8859-1'

    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 2
    max_articles_per_feed = 20

    use_embedded_content = False
    recursion = 5

    remove_javascript = True
    no_stylesheets = True

    keep_only_tags = [
        dict(name='div', attrs={'class': [
             'noticia_titular', 'epigrafe', 'subtitulo', 'actualizada', 'noticia_fecha', 'noticia_texto']}),
        dict(name='font', attrs={'class': ['actualizada']})
    ]

    feeds = [
        (u'Portada de Ibiza', u'http://www.diariodeibiza.es/elementosInt/rss/1'),
        (u'Pitiuses i Balears', u'http://www.diariodeibiza.es/elementosInt/rss/2'),
        (u'Opini\xf3n', u'http://www.diariodeibiza.es/elementosInt/rss/3'),
        (u'Nacional', u'http://www.diariodeibiza.es/elementosInt/rss/4'),
        (u'Internacional', u'http://www.diariodeibiza.es/elementosInt/rss/5'),
        (u'Econom\xeda', u'http://www.diariodeibiza.es/elementosInt/rss/6'),
        (u'Deportes', u'http://www.diariodeibiza.es/elementosInt/rss/7'),
        (u'Sociedad', u'http://www.diariodeibiza.es/elementosInt/rss/8'),
        (u'Ciencia', u'http://www.diariodeibiza.es/elementosInt/rss/11'),
        (u'Tecnolog\xeda', u'http://www.diariodeibiza.es/elementosInt/rss/12'),
        (u'Gente', u'http://www.diariodeibiza.es/elementosInt/rss/13'),
        (u'Sucesos', u'http://www.diariodeibiza.es/elementosInt/rss/15'),
        (u'Cultura', u'http://www.diariodeibiza.es/elementosInt/rss/16Piti')
    ]
PK�X0�lldiario_la_republica.png�PNG


IHDR  D���|PLTE��������*+�;<�=>�23���34�>>�==�67�+,��ww�������ꡢ�34�%&驩��������룣�fg�'(�WX�����������멪�rs�*+�!"�|}��������ﹺ�����������~~�#$�<>ﰱ�������Z[�&'��`a�������>?�67�hi���������HI��()ꞟ�������9:��JJ�����%&蘘�������op�럠����:;�KL�&'�!"ㄅ�������tu��,-짧����MO����RS�MN㇈�����䎏�&'���������䉊�23���������fg�9:�^_�������BC�OP၁�EF��$%��~������yz� ꟟����rr��FG�����./�)*�99������vw��JK�//����9:��VV�����uv��������;;�|}���叐�'(�WX�����뱱硢褤����~�yz������cd��IJ������}~�tt���������ss碣�����ႃ�"#�zz꣤�.0��)*�::�()�12�+,�NO�vw�uv�HJ� !RA�xtRNS�ί�!�IDAT8���;h�a���iE�"�Y�"���(�'� u���7�(��A��)�4�V��"�� B!^��K�T����sH��=���qx?Q��	�5�5 ^o-��@g3C+l�e:�Rh�*b��' �Q�Wq���st��i̗�h��Iu�~��T�ߧ�;��أoNh�T>��C:�������Ζ����l���A>���1��>�_u�[�B{0��Ŕ��J�I��%��d)�N�ԙ��ޯ���j�\ uX}qY�V�!�Gԯ��D��c�.��!v<���sT���|4��?7?f�~f���M���m���z>���������V��C��A2��?�$�@v�:�2�bn��*~����
=r
 }��|��_�†F�bU�軲fi%�����r�)�9�IEND�B`�PK�X��}}diario_la_republica.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1317341449(BasicNewsRecipe):
    title = u'Diario La Republica'
    __author__ = 'CAVALENCIA'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    language = 'es_CO'

    feeds = [(u'Diario La Republica',
              u'http://www.larepublica.com.co/rss/larepublica.xml')]
PK�X�2]�diario_sport.png�PNG


IHDR  szz��IDATx�b�.9ɒ�A��q��m�m�l��m�\۶m��ؓ�G�^��074��7�����9"���U/�~0��� l6�
`��_(<0p�{za�3�Ӗk�+�|a�L>�����p�?_����^�s�V0a(.��@t�[�c잇0��z�ob5�v#�{C1I������qL<�2��0z��l���m���/`8�Fz?���LcE�ϾiD< ��ৠll��/e}�uu�ZͼfR(0��/��m�f�h1�۟�|����tPTT@Y[�t��(�+!	�X^��D(����
�
��:��KE��.�A�����tu�J�Y������P7�0P55�4?�,
�JK 	��d��@?)������B����?���".����6�$��C|�$��{ʚ:��"膇����B���yKJ!>s�X@t��x#7�i��[@�'y�e2\zi:;�jl�*=��KK���+�h�z�8`��������t/{l@�X��n���A�����,By`$3M�����Bf&��ݽ\���hZڠio�Q.�䍷!ظ�nnP�@����f��iYY��x�!`��){b.<������V���I�-���K5��2VV��k�}�0�Lc�����\`�-~�U�m�&7�a�?�{j\/ǀ�/���BE&��Ӑ���ᖛ �����̏? ��Yk֠��; MK�N(�Q:ES3���B��]̫hmG�}�B��	��8$i��ݻ��hG����Ƞ�*Gg����^�ቚ�(T������v(B�_ ��Q�~9�Su.�>�!a���A�5�2��Ӈy��P��I��(�
@9�*�#Q����K�}�G���n��A��]c
��C����D�{�?�]AE��G~ʼ�1/ן�|_��|,c	�^<�
�`��9���ծ�?�	�3��IEND�B`�PK�X@9s?\\diario_sport.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class DiarioSport(BasicNewsRecipe):
    title = u'Diario Sport'
    oldest_article = 2
    max_articles_per_feed = 75
    __author__ = 'Jefferson Frantz'
    description = 'Todas las noticias del Barça y del mundo del deporte en general'
    timefmt = ' [%d %b, %Y]'
    language = 'es'
    no_stylesheets = True

    feeds = [(u'Sport', u'http://feeds.feedburner.com/sport/ultimahora')]

    extra_css              = '''
                                h2{font-family: serif; font-size: small; font-weight: bold; color: #000000; text-align: justify}
                                '''

    keep_only_tags = [dict(name='div', attrs={'id': ['noticiasMedio']})]

    remove_tags = [
        dict(name=['object', 'link', 'script', 'ul']), dict(name='div', attrs={'id': ['scrAdSense', 'herramientas2', 'participacion', 'participacion2', 'bloque1resultados', 'bloque2resultados', 'cont_vinyetesAnt', 'tinta', 'noticiasSuperior', 'cintillopublicidad2']}), dict( name='p', attrs={'class': ['masinformacion', 'hora']}), dict(name='a', attrs={'class': ["'link'"]}), dict(name='div', attrs={'class': ['addthis_toolbox addthis_default_style', 'firma', 'pretitularnoticia']}), dict(name='form', attrs={'id': ['formularioDeBusquedaAvanzada']})  # noqa
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def postprocess_html(self, soup, first_fetch):
        img = soup.find('img', src='/img/videos/mascaravideo.png')
        if img is not None:
            img.extract()

        return soup
PK�X9;;diariovasco.png�PNG


IHDR(-STPLTE�'>�����������BV�]n����5J��Pb�x�����k{��]o��x��Pc��BW�kz��4J톒���2%etRNS@��f�IDATx�M�UB@13[��8��'->?ɚ-��^�^��Bi^z?�[z��B��9�1��H��j���q=�
U�UR�9�	\�wR^]��d�2�ZF&և��"�*�m�Y_����Ev��&^f^���&�&m��|���G����,]�*�IEND�B`�PK�X{	�@@diariovasco.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.diariovasco.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DiarioVasco(BasicNewsRecipe):
    title = 'Diario Vasco'
    __author__ = 'Darko Miletic'
    description = 'Noticias de pais Vasco y el resto del mundo'
    publisher = 'Diario Vasco'
    category = 'news, politics, Spain'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'es'
    remove_empty_feeds = True
    masthead_url = 'http://www.diariovasco.com/img/rd.logotipo2_dvasco.gif'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} .photo-caption{font-size: x-small} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(attrs={'id': 'title'}), dict(attrs={'class': [
            'overhead', 'headline', 'subhead', 'date', 'text', 'noticia_cont', 'desarrollo']})
    ]
    remove_tags = [dict(name='ul')]
    remove_attributes = ['width', 'height']

    feeds = [

    (u'Ultimas Noticias', u'http://www.diariovasco.com/rss/feeds/ultima.xml'),
    (u'Portada', u'http://www.diariovasco.com/portada.xml'),
    (u'Politica', u'http://www.diariovasco.com/rss/feeds/politica.xml'),
    (u'Deportes', u'http://www.diariovasco.com/rss/feeds/deportes.xml'),
    (u'Economia', u'http://www.diariovasco.com/rss/feeds/economia.xml'),
    (u'Mundo', u'http://www.diariovasco.com/rss/feeds/mundo.xml'),
    (u'Cultura', u'http://www.diariovasco.com/rss/feeds/cultura.xml'),
    (u'Gente', u'http://www.diariovasco.com/rss/feeds/gente.xml'),
    (u'Contraportada', u'http://www.diariovasco.com/rss/feeds/contraportada.xml')
    ]
PK�X��٬��
diepresse.png�PNG


IHDR��h6rIDATxڍ�1HBQ�-��!Z��ln��Z
ArxA�"�b�
b
�mACA
�	*)	,Z*�hs�#H������}]����������7L��P�x���e#�N����<���*�����`i-�����=Vꕫ;I��;�]��nu����l��ۋ��ƊCR ��ŌM�AI�v�u|Vw��pK&+��ڬEd������?�JB���+|L����x����Bv�-����>����P2SxykJ\������Z�ѽ���,o�lhi3d�:��f�ٺ���t�>!~y6�`,@hs幺��\:�����c�����H0��9����*�I)�<��B���Vo�g�'�j%�%��IEND�B`�PK�X�k��		diepresse.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function

__license__ = 'GPL v3'
__copyright__ = '2009, Gerhard Aigner <gerhard.aigner at gmail.com>'

''' http://www.diepresse.at - Austrian Newspaper '''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class DiePresseRecipe(BasicNewsRecipe):
    title = 'Die Presse'
    __author__ = 'Gerhard Aigner'
    description = 'DiePresse.com - Die Online-Ausgabe der Österreichischen Tageszeitung Die Presse.'
    publisher = 'Die Presse Verlags-Gesellschaft m.b.H. Co KG'
    language = 'de_AT'
    category = 'news, politics, nachrichten, Austria'
    use_embedded_content = False
    remove_empty_feeds = True
    no_stylesheets = True

    recursions = 0
    oldest_article = 1
    max_articles_per_feed = 100

    preprocess_regexps = [
        (re.compile(r'Textversion', re.DOTALL), lambda match: ''),
    ]

    remove_tags = [dict(name='hr'),
                   dict(name='br'),
                   dict(name='small'),
                   dict(name='img'),
                   dict(name='div', attrs={'class': 'textnavi'}),
                   dict(name='h1', attrs={'class': 'titel'}),
                   dict(name='a', attrs={'class': 'print'}),
                   dict(name='div', attrs={'class': 'hline'})]

    remove_tags_after = [
        dict(name='div', attrs={'class': 'articletext'})
    ]

    feeds = [
        ('Politik', 'http://diepresse.com/rss/Politik'),
        ('Wirtschaft', 'http://diepresse.com/rss/Wirtschaft'),
        ('Europa', 'http://diepresse.com/rss/EU'),
        ('Panorama', 'http://diepresse.com/rss/Panorama'),
        ('Sport', 'http://diepresse.com/rss/Sport'),
        ('Kultur', 'http://diepresse.com/rss/Kultur'),
        ('Leben', 'http://diepresse.com/rss/Leben'),
        ('Tech', 'http://diepresse.com/rss/Tech'),
        ('Wissenschaft', 'http://diepresse.com/rss/Science'),
        ('Bildung', 'http://diepresse.com/rss/Bildung'),
        ('Gesundheit', 'http://diepresse.com/rss/Gesundheit'),
        ('Recht', 'http://diepresse.com/rss/Recht'),
        ('Spectrum', 'http://diepresse.com/rss/Spectrum'),
        ('Meinung', 'http://diepresse.com/rss/Meinung')
    ]

    def print_version(self, url):
        return url.replace('home', 'text/home')
PK�X���L��digit_magazine.png�PNG


IHDR  D���hPLTE�%�����'���� (�#,�"*���������#�	�'����	������ ��,3�����������������*0�GL���������y|�����9>�MQ�������������� *�������	�	�gj�������(�����#*����,-��������V[�07������ ��dh��������������������������w{�������06���������7>���������������������������������������FK�gk�KP����07�����"(�"�"�_D�IDATx^��C�1��q�k۶m۶�o�;g}����E��|]Ϲ5�X<�<f�ҺY��g���e�T�U��z"�"a4�%5�p1�h`V�V%A5]�S���
�p�LZ��v� K�ή`���*��C�#pQ@}l\�'ؤlJ�g�s�`.��b%X�`u�ZW{C�ش2A!K3��m����Kp@~xtqprz&���Q��C� �]]������9J�{��뛕�H�
���ˊ��ϯ��h]:ε��?P 
;b[WIEND�B`�PK�X5��L
L
digit_magazine.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe, classes


class Digit(BasicNewsRecipe):
    title = u'Digit Magazine'
    description = 'Digit caters to the largest community of tech buyers, users and enthusiasts in India.'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    oldest_article = 30  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    masthead_url = 'https://www.digit.in/images/digit_logo.png'
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'title', 'url'}

    def get_cover_url(self):
        soup = self.index_to_soup(
            'https://store.digit.in/cart.php?category_id=139&year='
        )
        tag = soup.find(attrs={'class': 'previous-magazines'})
        if tag:
            self.cover_url = tag.find('img')['src']
        return super().get_cover_url()

    keep_only_tags = [
        classes(
            'big_img_container highlights_cont Top-sponsered Text-sponsered heading-wraper article_video'
            'article-inside-container skoar_desc New-desk pros-Cons Review-reting For-table col-md-7'
            'review-inside-container price_wrap key_specifications'
        ),
    ]

    remove_tags = [
        classes(
            'adsAdvert Video-wraper article_share auth_social breadcrumbwrap textads_list rel_articles_container'
        ),
    ]

    feeds = [
        ('Features', 'http://feeds.feedburner.com/digit/latest-features'),
        ('Reviews', 'http://feeds.feedburner.com/digit/latest-review'),
        ('Laptops', 'https://feeds.feedburner.com/digit/latest-laptops'),
        ('PC Components', 'https://feeds.feedburner.com/digit/latest-pc-components'),
        ('Tablets', 'https://feeds.feedburner.com/digit/latest-tablets'),
        ('TVs', 'https://feeds.feedburner.com/digit/latest-tvs'),
        (
            'Wearable devices',
            'https://feeds.feedburner.com/digit/latest-wearable-devices'
        ),
        ('How-to', 'https://feeds.feedburner.com/digit/how-to'),
        ('Entertainment', 'https://feeds.feedburner.com/digit/latest-entertainment'),
        ('Gaming', 'http://feeds.feedburner.com/digit/latest-gaming'),
        ('Software', 'https://feeds.feedburner.com/digit/latest-software'),
        ('Audio-Video', 'https://feeds.feedburner.com/digit/latest-audio-video'),
        # ('Apps', 'https://feeds.feedburner.com/digit/latest-apps'),
        # ('Mobile Phones', 'https://feeds.feedburner.com/digit/latest-mobile-phones'),
        # For more : https://www.digit.in/rss-feed/
    ]
PK�X��
H�
�
digital_arts.png�PNG


IHDR00�`n�
�IDATx^�XypTGz�w̥��4:�Bdsk��x1Ǧ�a���YS��$��b�����Sv�pa��کlR���]p�����F
�!Y�H���<����yof$���?�7�z�u���w��ͅ���Ǐ7�k �$� BH�?�%��#V3��,�'j�OFE��
*ȵ���~�?v���ӧ��` YN���Y	����Ȭ��O�BOzŗ_~����
_�e}"�@T�T�D�"���d)��ʲم=�18�(�W_}ū��O|YOzF=�n�#�֖hva_�P���ܞ]4*�H�!B�xA��G!k@��ġ)��J�b81��8Z�s,�Z�k詫�A����x��l��������iS����{<��e�ۭ6�a<��� xoooGg���|���&iD�z�=�-��`LH�Z���DH�$�d9QUU�q�f��I~�=O�|��.���?��ဒ�&I��ץj2�T
8Q>l������0�ʋ(@�(���F�q�=�1:�b�1�̙��S����h"$\z ����Q�9�+
:�:�G�x��Ń��2�Â���X�z�_�X������?�&L���Qy:�����p�*<�����a��y����\�cb��#�`�Yh�����t��Ŧ��7��0F��2N�[�`�/~!Z,0>|Ba��Kt�7��SQ��R��T���<k�W5��d�%�2\(�ME;��߾���v��Y���^����G?�0��\�-X��{�eISM�V�Qat�ɸq���ϕ�&�3�66�.	��TF�!m��EuJ�iƢ~��ʕ+���{�t޺�g��b���%O�,��,kj倳0n�Čٝ���![�%Z]�X5�R+����!�9Y�"1+�x�⡃�CSvV1v��)SdYf���6�籪���gh@�zQ���Q2�0��YMn�Mi�C #`���$M�e�̙�
HU�qn\�M
]��:����d���{�V��}��R:�$I6Q�d��x�g�D"Ѵ�RYU��0@c���Ӑ�g�������E�T�|�^r������)5��
$f��Zgg'����n��j�2@���b15��5�"�����5}�Mf�"*͒Y���F���윪�B�h$�eX���"ފ2Y����N�D(ր�����?'�
]qє�ƬY:�;F�`8�*.I�,I�^�����D��|S^AK�%�O�U1��_�{dNM�섳"��(f8���\�mtȈyLd�Yx�}&Ӌ�]JH����xd;����nK��	�PA!7m�A1m�N�23P�O�Z,?n���4�W�`�L�6���pd� �HDcQ^�����<p={�3��P�����j�%Y�r2�cCd�@Õ:���$3��=�b������P8�Iئ��M��G��(�ƐRIZ�Y��-�9����)�63>��Lj�l#3��������4����`�*�_*�2wx��t2јƯ8j#e)�Г�j�3�1�d;�2��l+)u����j�7�;'�S�E6�6/��(i6��gF���r!e�EdJ=RdT��,hdp��n��[�~���&�#7�ۿnlt�֙�M�]|��ђ��`����h�f�����℣Sp:D��bq���T' ,U�
�<�(�F|�XgW�T��R�
�U�s�w���e�h®�E"�ӊ���GKn�}�/<����9��u�#���//+�V�f��o����ǭv��F�ȥ�=
vO��vS��7����m�%P�ě�ݙ�Y)?#^�1"{�Eـ���˿^�ڃ�f�r�y�l���o۾ݳ{wOO�C���W�����^F�ؤ��������t�̣��0�!@��CB%�2�W���p�r�yG�+__�DD�Hʙ(�
��^.�TD``!����N��heL��J�LJ�X�D���)�7Mh��FF�������O�;�7DQĆzG��H��4�&kW��x%�L�`
�H���V.׌)�R�(�BhsD�l˜=7�Gu�"����:[_��'O^�zU�eA p��k�"L�!��$v*T��������b�
�'��LxB�+\�5�C�P�����o�)���(7/�nw<���1~�������������{hh�ؓ�%T �I۵�b��<�n�� �h��а�Y��SΏ-D�4�"�ɺ"ܸ�J���p����@��m{ȣI�5��ɩM4To��I
�
���?�f�p8�R�Ih�zL�!h(�a�4�l�%��
 6��y���D�yx��42|�Q��x���r�ܹK�,]�x�'�f޼y�V�B�ehH9N��kjj$).K��u�R~�lٳ�=�˂b�^�,~$6�`��uC)����lwL%��$+ʟ�}����o����~����^+-+[�p�c�=�r��!�F���,׮[7�����شysaa�$��1,��f��
ר���^���91�T���eBS~����f!�E^I���j����
p�8����V�\��֭��:q�����
�VUM�2Mt�o��fgGǯ�ly衇z{{���njNҀ���I�?F�+%���k?���(�7ŁIڨ8���]�*/����Z����J�SE�$�B���O�\��;n��6�w�ޖ���?�ن
�=�
�<r���}�8��ѣ�6mz��7o�2�����m۶-]����WO<q���۶1;[����&��j�S_J<p0��Ī���-EԵE��se�ai�s�_*s��$�މ��0�p8�K��#����^�z��	O=��ۇ��j���<yr��߾};D���?��P8�l�2OA�]��&ĉ��H�^u\��r���v'.��=\���J���z>��p�ZKj�����e$���������kf�‚FB|@6{��;_���o�CN��f��ED.�+���W.j������?���XA/Q:��q��,�j��p:7����D3	�>���r��yuuut���H�z��u8�GV�\�h.�(�:���3gΜ5k�@v���ގ����F������?q�wk�6�Y7���}SZ@���"J�Wɉ�H�t�D��&2aaq�z*�k׮#�y��B�f�ss7o���J:�'���F��3Ϝ={Cv���t688
�����?�_�L:}\�A:�F��	���D�Do����v?:�G��D<�0��a5b�"��aŊ��A8��)�ʾ}��:::v��
f̚5kzMͅ��ߏ�z�ЃBF�����yc��c�}^'�V�K�E6��aYL%ZP����B.
81@"'H3^��~/	���������jg�8�<�c�ԩS�&�3x3
Ȯ�ħ�AX��v�q��={&����s��l�$�d�Q��׉
1�Xb{���6n�}�1 A�|�r���7���t����M������+jX9\IEND�B`�PK�X�0����digital_arts.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.01'
__date__ = '14, January 2010'

'''
http://media.digitalartsonline.co.uk/
'''

from calibre.web.feeds.news import BasicNewsRecipe

temp_files = []
articles_are_obfuscated = True


class digiArts(BasicNewsRecipe):
    __author__ = 'Lorenzo Vigentini'
    description = ('Digital Arts - comprehensive coverage of the art of '
                   'graphic design, 3D, animation, video, effects, web and '
                   'interactive design, in print and online.')  # noqa
    cover_url = 'http://media.digitalartsonline.co.uk/graphics/logo_digital_arts.gif'

    title = 'Digital Arts Magazine  '
    publisher = 'IDG Communication'
    category = ('Multimedia, photo, video, computing, product reviews, '
                'editing, cameras, production')

    language = 'en'
    encoding = 'cp1252'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 30
    max_articles_per_feed = 100
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = False

    keep_only_tags = [
        dict(name='h1', attrs={'itemprop': 'headline'}),
        dict(name='span', attrs={'itemprop': 'author'}),
        dict(name='section', attrs={'class': 'articleBody'}),
    ]

    # Feed are found here: http://www.digitalartsonline.co.uk/rss/
    feeds = [
        ('Latest News Articles',
         'http://www.digitalartsonline.co.uk/rss/feeds/digitalarts-news.xml'),
        ('Latest Tutorials',
         'http://www.digitalartsonline.co.uk/rss/feeds/digitalarts-tutorials.xml'),
        ('Latest Reviews',
         'http://www.digitalartsonline.co.uk/rss/feeds/digitalarts-reviews.xml'),
        ('Latest Features',
         'http://www.digitalartsonline.co.uk/rss/feeds/digitalarts-features.xml'),
    ]
PK�X"RL]iidigitaljournal.png�PNG


IHDR(-SPLTE�n��tRNS@��fIDATx�c�
�`�`<�qەF�IEND�B`�PK�X���Hdigitaljournal.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
digitaljournal.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DigitalJournal(BasicNewsRecipe):
    title = 'Digital Journal'
    __author__ = 'Darko Miletic'
    description = 'A Global Citizen Journalism News Network'
    category = 'news, politics, USA, world'
    publisher = 'Digital Journal'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    language = 'en'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(id='article_text'),
    ]

    remove_tags = [
        dict(attrs={'class': lambda x: x and 'article-top-social' in x}),
    ]

    feeds = [

    (u'Latest News', u'http://digitaljournal.com/rss/?feed=latest_news'),
    (u'Business', u'http://digitaljournal.com/rss/?feed=top_news&depname=Business'),
    (u'Entertainment', u'http://digitaljournal.com/rss/?feed=top_news&depname=Entertainment'),
    (u'Environment', u'http://digitaljournal.com/rss/?feed=top_news&depname=Environment'),
    (u'Food', u'http://digitaljournal.com/rss/?feed=top_news&depname=Food'),
    (u'Health', u'http://digitaljournal.com/rss/?feed=top_news&depname=Health'),
    (u'Internet', u'http://digitaljournal.com/rss/?feed=top_news&depname=Internet'),
    (u'Politics', u'http://digitaljournal.com/rss/?feed=top_news&depname=Politics'),
    (u'Religion', u'http://digitaljournal.com/rss/?feed=top_news&depname=Religion'),
    (u'Science', u'http://digitaljournal.com/rss/?feed=top_news&depname=Science'),
    (u'Sports', u'http://digitaljournal.com/rss/?feed=top_news&depname=Sports'),
    (u'Technology', u'http://digitaljournal.com/rss/?feed=top_news&depname=Technology'),
    (u'World', u'http://digitaljournal.com/rss/?feed=top_news&depname=World'),
    (u'Arts', u'http://digitaljournal.com/rss/?feed=top_news&depname=Arts')
    ]
PK�X-�58��digitalspy_uk.png�PNG


IHDR@@����0PLTE3D�AP�N]�\i�iv�w����������ǭ�ϻ��������������TibpLIDATx��Չj� ���x��{���6��0`�-���Ο������ޙǷH��8l�T����'���!��P�8�7b)���㪈�* l��q��Ls` ,�9P104� �����J0��M�J�~�R���	v�N���
�/��@@�À�)�b�ŀ���ݮ��؅e0�B@%� ���.�l̘�@�͋�^
t*�q끮�����7n!�[�'���+���51�@D��5_{��8_����2<"fO��u�U�!�»�y�g���e����][$��{ǬZ��ώf&���s�Na�M��130
F>kF�V��bIEND�B`�PK�X�K�digitalspy_uk.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.digitalspy.co.uk
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DigitalSpyUK(BasicNewsRecipe):
    title = 'Digital Spy - UK Edition'
    __author__ = 'Darko Miletic'
    description = 'Entertainment news about the biggest TV shows, films and celebrities, updated around the clock.'
    publisher = 'Digital Spy Limited.'
    category = 'news, showbiz, big brother, x factor, torchwood, doctor who, tv, media, sky, freeview, cable'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'en_GB'
    remove_empty_feeds = True
    extra_css = ' body{font-family: Verdana,Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} .info{font-size: small} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [dict(name=['link'])]
    remove_attributes = ['height', 'width']
    keep_only_tags = [dict(name='div', attrs={'id': 'content'})]

    feeds = [

    (u'News', u'http://www.digitalspy.co.uk/rss/zones/gb/all.xml'),
    (u'Big Brother', u'http://www.digitalspy.co.uk/rss/zones/gb/bigbrother.xml'),
    (u'Entertainment', u'http://www.digitalspy.co.uk/rss/zones/gb/entertainment.xml'),
    (u'General', u'http://www.digitalspy.co.uk/rss/zones/gb/general.xml'),
    (u'Media', u'http://www.digitalspy.co.uk/rss/zones/gb/media.xml')
    ]
PK�Xk9���digizone.png�PNG


IHDR(-S3PLTE���씘紹����fk�(*�������?|�48���S�In���rwa.`�tRNS@��fuIDATx�eOED!����?�S�Bx�<��?$Q3���6hB�$�k��0�E��c��D�U�R_����XQ�/�"B	!{��}al�A.�ǵ`<��8�.�A٢�%��l�`W��U����V�IEND�B`�PK�X�:����digizone.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Tomas Latal<latal.tomas at gmail.com>'

from calibre.web.feeds.news import BasicNewsRecipe


class DigiZoneCZ(BasicNewsRecipe):
    title = 'DigiZone'
    __author__ = 'Tomas Latal'
    __version__ = '1.0'
    __date__ = '30 April 2011'
    description = u'Aktuality a \u010dl\xe1nky z DigiZone.cz'
    oldest_article = 1
    max_articles_per_feed = 10
    encoding = 'iso-8859-2'
    publisher = 'Internet Info s.r.o.'
    category = 'digitalni vysilani, televize, CZ'
    language = 'cs'
    publication_type = 'newsportal'
    no_stylesheets = True
    remove_javascript = True
    extra_css               = 'p.perex{font-size: 1.2em; margin: 0 0 10px 0;line-height: 1.4;padding: 0 0 10px 0;font-weight: bold;} \
                               p.perex img {display:none;} \
                               .urs p {margin: 0 0 0.8em 0;}'

    feeds = [
        (u'Aktuality', u'http://rss.digizone.cz/aktuality'),
        (u'\u010cl\xe1nky', u'http://rss.digizone.cz/clanky')
    ]

    remove_tags_before = dict(id=['p-article', 'p-actuality'])

    remove_tags_after = dict(id=['p-article', 'p-actuality'])

    remove_tags = [
        dict(attrs={'class': ['path', 'mth', 'lbtr', 'serial', 'enquiry',
                              'links', 'dp-n', 'side', 'op-ab', 'op-view', 'op-sub', 'op-list', ]}),
        dict(id=['opinions', 'discussionList', 'similarItems',
                 'sidebar', 'footer', 'opl', 'promo-box'])
    ]
PK�X������dilbert.png�PNG


IHDR���R-PLTE������������٧�Ɨ�ſ��������~�{r~hOTI:1)!���HpIDATx�c```��S�Vu�9Ӕ�2�Bn�F)`F��q:�Q��fu��,�&8���<ԱӦ��>�f��2p�b+-���`c�����dl�bp,
V�vi��z��WvQ�IEND�B`�PK�X,�UCCdilbert.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

import os
import tempfile
from calibre.web.feeds.recipes import BasicNewsRecipe


class Dilbert(BasicNewsRecipe):
    title = u'Dilbert'
    __author__ = 'TechnoCat'
    description = 'Dilbert, by Scott Adams. Includes last three or so comics and blog entries.'
    cover_url = 'http://dilbert.com/assets/dilbert-logo-4152bd0c31f7de7443b4bc90abd818da.png'
    auto_cleanup = True
    encoding = 'utf8'
    language = 'en'
    needs_subscription = False
    no_stylesheets = True
    oldest_article = 7
    remove_javascript = True
    recursions = 0
    max_articles_per_feed = 20
    debugMessages = True
    BASE_URL = 'http://dilbert.com'  # Note no www.
    COMIC_DIV_TAG = 'img-comic-container'
    BLOG_DIV_TAG  = 'media'
    tempfiles = []

    # Creates a temp file for the wrapped image url
    def writeImage(self, title, imageURL) :
        tempFile = tempfile.NamedTemporaryFile(delete=False)
        self.tempfiles.append(tempFile)
        tempFile.write('<html><head><title>'+title+'</title></head><body>')
        tempFile.write(imageURL.prettify())
        tempFile.write('</body></html>')
        tempFile.flush()
        tempFile.close()
        return tempFile.name

    def cleanUpTempFiles(self):
        for tempFile in self.tempfiles:
            tempFile.close()
            os.unlink(tempFile.name)

    def cleanup(self):
        self.cleanUpTempFiles()

    # Extract comic links from the soup
    # Returns a list of comics (articles) as:
    # {
    # 'title'       : article title,
    # 'url'         : URL of print version,
    # 'date'        : The publication date of the article as a string,
    # 'description' : A summary of the article
    # 'content'     : The full article (can be an empty string). This is used by FullContentProfile
    # }
    def comicFeed(self, soup) :
        feedset = []
        for comicContainer in soup.findAll('div', {'class': self.COMIC_DIV_TAG}) :
            comic = comicContainer.find('img')
            if comic is not None:
                filelink = self.writeImage(comic['alt'], comic)
                feedset.append(
                    dict(title=comic['alt'], url='file://'+filelink,  description=comic['alt'], content=''))
        return feedset

    def blogFeed(self, soup) :
        feedset = []
        for blogContainer in soup.findAll('div', {'class': self.BLOG_DIV_TAG}) :
            blog = blogContainer.find('a', {'class':'link-blended'})
            if blog is not None:
                feedset.append(
                    dict(title=blog['title'], url=blog['href'], description=blog['title'], content=''))
        return feedset

    def parse_index(self):
        root = self.index_to_soup(self.BASE_URL)
        comics = self.comicFeed(root)
        blogs =  self.blogFeed(root)
        return [('Comics', comics), ('Blog Entries', blogs)]
PK�Xo��Q��dilemaveche.png�PNG


IHDR��h6yIDATx�c���ۤ	�[[;��!���}b��U+V�9}��ׯ�Qûw�ԕ�y�������������eow��_�޿o�o /-�,������e$$E�C���={�SP!��r�x��
N�\	aEY9��0a~>
�"�
u�gN����U����*���|�9�1��g@����-!"
�DJL|�=��N��p��]5%e�%�B‹.db�
899YYYA� ���,������3�Bw����ľ~���˗�i��!�}��`���TQP
I`��E���K<(���KI#ǝ�������$
�K�f�:u�@��?��K>|�H|�����{{W,_~��5��
�bѴ3�tIEND�B`�PK�X�pJJdilemaveche.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
__license__   = 'GPL v3'
__copyright__ = u'2014-01-09, Silviu Cotoar\u0103, Marius Popescu'
'''
dilemaveche.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DilemaVeche(BasicNewsRecipe):
    # apare vinerea, mai pe dupa-masa,depinde de Luiza cred (care se semneaza
    # ca fiind creatorul fiecarui articol in feed-ul RSS)
    title = u'Dilema Veche'
    # inspirat din scriptul pentru Le Monde. Inspired from the Le Monde script
    __author__ = 'song2'
    description = '"Sint vechi, domnule!" (I.L. Caragiale)'
    publisher = 'Adevarul Holding'
    oldest_article = 7
    language = 'ro'
    max_articles_per_feed = 150
    encoding = 'utf-8'
    simultaneous_downloads = 5
    masthead_url = 'http://www.dilemaveche.ro/sites/all/themes/dilema/theme/dilema_two/layouter/dilema_two_homepage/logo.png'
    needs_subscription = True
    use_embedded_content = False
    publication_type = 'magazine'
    remove_javascript = True
    no_stylesheets = True
    remove_empty_feeds = True
    feeds = [
        ('Editoriale si opinii - Situatiunea',
         'http://www.dilemaveche.ro/taxonomy/term/37/0/feed'),
        ('Editoriale si opinii - Pe ce lume traim',
         'http://www.dilemaveche.ro/taxonomy/term/38/0/feed'),
        ('Editoriale si opinii - Bordeie si obiceie',
         'http://www.dilemaveche.ro/taxonomy/term/44/0/feed'),
        ('Editoriale si opinii - Talc Show',
         'http://www.dilemaveche.ro/taxonomy/term/39/0/feed'),
        ('Tema saptamanii', 'http://www.dilemaveche.ro/taxonomy/term/19/0/feed'),
        ('La zi in cultura - Dilema va recomanda',
         'http://www.dilemaveche.ro/taxonomy/term/58/0/feed'),
        ('La zi in cultura - Carte',
         'http://www.dilemaveche.ro/taxonomy/term/14/0/feed'),
        ('La zi in cultura - Film',
         'http://www.dilemaveche.ro/taxonomy/term/13/0/feed'),
        ('La zi in cultura - Muzica',
         'http://www.dilemaveche.ro/taxonomy/term/1341/0/feed'),
        ('La zi in cultura - Arte performative',
         'http://www.dilemaveche.ro/taxonomy/term/1342/0/feed'),
        ('La zi in cultura - Arte vizuale',
         'http://www.dilemaveche.ro/taxonomy/term/1512/0/feed'),
        ('Societate - Ieri cu vedere spre azi',
         'http://www.dilemaveche.ro/taxonomy/term/15/0/feed'),
        ('Societate - Din polul opus',
         'http://www.dilemaveche.ro/taxonomy/term/41/0/feed'),
        ('Societate - Mass comedia',
         'http://www.dilemaveche.ro/taxonomy/term/43/0/feed'),
        ('Societate - La singular si la plural',
         'http://www.dilemaveche.ro/taxonomy/term/42/0/feed'),
        ('Oameni si idei - Educatie',
         'http://www.dilemaveche.ro/taxonomy/term/46/0/feed'),
        ('Oameni si idei - Polemici si dezbateri',
         'http://www.dilemaveche.ro/taxonomy/term/48/0/feed'),
        ('Oameni si idei - Stiinta si tehnologie',
         'http://www.dilemaveche.ro/taxonomy/term/47/0/feed'),
        # online only articles
        ('Dileme on-line', 'http://www.dilemaveche.ro/taxonomy/term/5/0/feed'),
        # once per month, 6-7 day of the month
        ('Dilemateca', 'http://dilemaveche.ro/taxonomy/term/21/0/feed'),
        # children, once-twice per year
        ('Dilematix', 'http://dilemaveche.ro/taxonomy/term/20/0/feed'),
        ('Dilema Studiilor Postuniversitare',
         'http://dilemaveche.ro/taxonomy/term/1635/0/feed')  # once per year, July
    ]
    remove_tags_before = dict(name='div', attrs={'class': 'spacer_10'})
    remove_tags = [
        dict(name='div', attrs={'id': ['adshop_widget_428x60']}),
        dict(name='div', attrs={'id': ['gallery']}),
        dict(name='div', attrs={'class': ['art_related_left']}),
        dict(name='a', attrs={'class': ['prevPage']}),
        dict(name='a', attrs={'class': ['nextPage']}),
        dict(name='div', attrs={'class': ['article_details']}),
        dict(name='div', attrs={'id': ['comments']}),
        dict(name='ul', attrs={'class': ['social-buttons-list']}),
        dict(name='a', attrs={'class': ['editie']}),
        dict(name='div', attrs={'class': 'simple_overlay'}),
        dict(name='div', attrs={'class': 'c_right_column'}),
        dict(name='div', attrs={'id': 'content_right'}),
        dict(name='div', attrs={'class': 'box_shadow_top'}),
        dict(name='div', attrs={'class': 'box_shadow_bottom'}),
        dict(name='div', attrs={'id': ['footer']}),
        dict(name='div', attrs={'class': ['clear spacer_20']}),
        dict(name='div', attrs={'id': ['adh-footer']}),
        dict(name='div', attrs={'id': ['skyright']}),
        dict(name='div', attrs={'id': ['closure']})
    ]
    remove_tags_after = [
        dict(name='div', attrs={'id': ['adshop_widget_428x60']})
    ]
    extra_css             = """
        body{font-family: Georgia,Times,serif }
        img{margin-bottom: 0.4em; display:block}
                            """

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open(
                'http://pay.dilemaveche.ro/autentificare/?redirect=http%3A%2F%2Fdilemaveche.ro%2F%2F&return=true')
            br.select_form(nr=0)
            br['username'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def preprocess_html(self, soup):
        return self.adeify_images(soup)

    def get_cover_url(self):
        # small, from the current number article: http://dilemaveche.ro/sites/default/files/imagecache/articol_teaser/DV517web-1_copy.JPG
        # medium, from the homepage PDF link: http://dilemaveche.ro/sites/default/files/imagecache/editie_small/DV517web-1_copy_0.JPG
        # big, from the current number article, click on the samll image:
        # http://dilemaveche.ro/sites/default/files/imagecache/image_gallery_large/DV517web-1_copy.JPG
        cover_url = None
        soup = self.index_to_soup('http://dilemaveche.ro')
        link_item = soup.find('div', attrs={'class': 'box_dr_pdf_picture'})
        if link_item and link_item.a:
            cover_url = link_item.a['href']
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover_url)
        except:  # daca nu gaseste pdf-ul
            self.log("\nPDF indisponibil")
            link_item = soup.find('div', attrs={'class': 'box_dr_pdf_picture'})
            if link_item and link_item.img:
                cover_url = link_item.img['src']
            br = BasicNewsRecipe.get_browser(self)
            try:
                br.open(cover_url)
            except:  # daca nu gaseste nici imaginea mica mica
                print('nu este nici pdf nici imagine')
                cover_url = 'http://www.dilemaveche.ro/sites/all/themes/dilema/theme/dilema_two/layouter/dilema_two_homepage/logo.png'
        return cover_url
    cover_margins = (10, 15, '#ffffff')
PK�XƟ���dingoo_a320.recipe# vim:fileencoding=UTF-8
from __future__ import unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


class Dingoo(BasicNewsRecipe):
    language = 'ru'
    __author__ = 'bug_me_not'
    title = u'Dingoo A320. \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u0440\u0435\u0441\u0443\u0440\u0441'
    description = 'Портативная игровая консоль Dingoo A320 и другие необычные гаджеты'
    publisher = 'Emulate.SU'
    category = 'console'
    cover_url = u'http://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Dingoo_A320_White.jpg/300px-Dingoo_A320_White.jpg'
    no_stylesheets = False
    remove_javascript = True

    oldest_article = 20
    max_articles_per_feed = 200

    feeds = [(u'A320', u'http://feeds.feedburner.com/ru_dingoo')]

    remove_tags_before = dict(name='div', attrs={'class': 'posttitle'})
    remove_tags_after = dict(name='div', attrs={'class': 'article'})
    remove_tags = [dict(name='iframe')]
PK�X�^��discover_magazine.png�PNG


IHDR��h6�IDATx��mh�a��sX�j*U)�����R1�'U|�I!ڋAA(�3�l)��^�6���3��P��%{�s�9�}]���ǽW]U�߯��4r.��`����cw��JdNq�^<��~�
뜪DƩi\RI�/‡[�z^D03^�bjZ�{��
;�4�kI~zH&���n��R8�0���Ӄz�0[��8�K����1O��B�R�=�}Gm�R�0/}���a��Z#�Q]Bӟ7|���ubX��e���ɬp���4�ܠ��j97F
�<x����Qt�KO9�#t��zXg�߈|j��M�����f/Pz	9��h��5I9=Go/�ܘ�-˥�Fl�>�o4[!lÎR�;�V��rߦJ#���۵��I_ZדX�6���O[	e*�°k�V%|�U$�hX({�!
<Pe�g�
&��������M�*{ ����^��kþ����k�A�c#�q��P�Ei��v������h�7�����xPb4�����H�^HDn�c"�|l��ƍ�`K�X��gF5��*�=�<�K)#�+9{���r��L0��8��I�Y��FR��zc_af
�m��:���:�V��m�kFm��&VGJ��zo��Y��i�c
!~��/w�i�4�`Γc�`�FcĒ�A�{?��Μ��]��T��9E�f��_P|a[gIEND�B`�PK�X�p�݋�discover_magazine_monthly.png�PNG


IHDR  ��tRNSn��	pHYs��+IDATH�c`�`�p��>������ؘ��i�=+�E�G�*$?
�>U���7ML���j7"�899�^��H!��J�8N��"2Ȋ2�^vv���Ã]"VT��`x���?��7ujTiiNW��3g��8trr��߿���oBB���˗U�V8p@]]}�����ͯ^��z�jII���޽T���� QF~7�~Y���ǁ܇�TVN�4iƌ{�����������������ӧ����͛w��yyy��


@57n�055�����`'ĂS� TUT,Z���ظ�����666@(������7a�`�~��(4�ҥKFVV�q���'O��@6???8D%�00���E~��?eJTIqAO��+�Ϟ=���?�Իw�~��
dM�y�&�\�� `����ݻWWW�h<�p�\�E��D�0����	�sh�r���{]Fᥤ�K�[�d�;GL����5��&<�A�@@$G$5�D��,���lj,�@dH�0
���	q����`)r
��b颂IEND�B`�PK�X���,�� discover_magazine_monthly.recipe#!/usr/bin/env python
from __future__ import unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2015 Michael Marotta <mikefm at gmail.net>'
# Written April 2015
# Last edited 4/17/15
'''
discovermagazine.com
'''
import re
import json
try:
    from http.cookiejar import Cookie
except ImportError:
    from cookielib import Cookie
import mechanize
from calibre.web.feeds.news import BasicNewsRecipe


class DiscoverMagazine(BasicNewsRecipe):

    title = 'Discover Magazine Monthly'
    __author__ = 'Kovid Goyal'
    description = 'Monthly magazine version of Discover Magazine (not rss feed).'
    language = 'en'
    encoding = 'utf-8'
    simultaneous_downloads = 20
    tags = 'news, technology, science'
    INDEX = 'http://discovermagazine.com'

    keep_only_tags = [
        {'attrs': {'class': ['headline', 'deck', 'belowDeck',
                             'mediaContainer', 'segment', 'cover']}},
    ]
    remove_tags = [dict(name='div', attrs={
                        'class': ['ladder', 'mobile', 'popular', 'open', 'scistarter']})]

    # Login {{{
    needs_subscription = True

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        rq = mechanize.Request(
            'https://secure.kalmbach.com/kserv/api/authentication/login', headers={
                'Content-Type': 'application/json; charset=UTF-8',
                'Referer': 'http://discovermagazine.com',
                'Accept': 'application/json, text/javascript, */*; q=0.01',
                'Accept-Language': 'en-US,en;q=0.5',
                'Origin': 'http://discovermagazine.com',
            }, data=json.dumps(
                {'appId': '2', 'email': self.username, 'password': self.password}))
        br.set_debug_http(True)
        br.open(rq)
        data = json.loads(br.open(rq).read())
        if not data.get('success'):
            raise ValueError('Failed to login')
        session_id = data['sessionId']
        if hasattr(br, 'set_cookie'):
            br.set_cookie('KSERV', session_id, 'discovermagazine.com')
        else:
            c = Cookie(
                None, 'KSERV', session_id,
                None, False,
                'discovermagazine.com', True, False,
                '/', True,
                False, None, False, None, None, None)
            br.cookiejar.set_cookie(c)
        res = br.open('http://discovermagazine.com')
        br.set_debug_http(False)
        raw = res.read()
        if b'>Logout<' not in raw:
            raise ValueError('Failed to login')
        return br

    # End login }}}

    no_stylesheets = True
    preprocess_regexps = [(re.compile(r'<br[ ]*/>', re.IGNORECASE), lambda m: ''),
                          (re.compile(r'<br[ ]*clear.*/>', re.IGNORECASE), lambda m: '')]

    extra_css = 'body { font-family: helvetica, sans-serif; } \
                 .belowdeck {font-style: italic; padding=bottom: 10px; max-width: none} \
                 .caption {font-style: italic; padding=bottom: 10px; max-width: none} \
                 .caption1 {font-style: italic; padding=bottom: 10px; max-width: none} \
                 h2 { text-align: left; font-size: 1em; font-weight: bold; }}'

    def parse_index(self):
        # gets current month from homepage and append to index
        soup = self.index_to_soup(self.INDEX)
        c = soup.find(name=['a'], attrs={
                      'title': ['See inside the current issue of Discover Magazine']})
        currentMonth = self.tag_to_string(c['href'])
        self.INDEX = self.INDEX + currentMonth
        # continue parsing
        soup = self.index_to_soup(self.INDEX)
        col = soup.find(attrs={'class': 'issue'})
        current_section, current_articles = None, []
        feeds = []
        # find cover
        cover = soup.find('div', attrs={'class': 'cover'})
        if cover is not None:
            img = cover.find('img', src=True)
            if img is not None:
                self.cover_url = 'http://www.discovermagazine.com' + \
                    img['src'].replace(' ', '%20')  # [:-7]
        # parse articles
        for tag in col.findAll(name=['h3', 'div'], attrs={'class': ['bottomBorder', 'headline']}):
            if tag.name == 'h3':
                if current_section and current_articles:
                    feeds.append((current_section, current_articles))
                current_section = self.tag_to_string(tag).capitalize()
                current_articles = []
                self.log('Found section:', current_section)
            elif current_section:
                a = tag.find('a', href=True)
                if a is not None:
                    title = self.tag_to_string(a)
                    url = 'http://www.discovermagazine.com' + a['href']
                    if title and url:
                        p = tag.find('div', attrs={'class': 'snippet'})
                        desc = self.tag_to_string(p) if p is not None else ''
                        current_articles.append(
                            {'title': title, 'url': url, 'description': desc})
                        self.log('\tArticle:', title, '[%s]' % url)
                        self.log('\t\t', desc)
        if current_section and current_articles:
            feeds.append((current_section, current_articles))
        return feeds
PK�XE�w��disinformatico.png�PNG


IHDR  D���*PLTE�f�r�z"��Z��r�������ƞ�ھ��������%��tRNS@��fIDATxڽ���0@Q�Q��[Q1�/����	�q-܇v�v<5[�&(�hd$͠@FVU�"�K��\<uY<GVM@�0s@7>��[��{�A�W�֧�U�gѬ�M+X�c����^���&'|��GsM8�UIEND�B`�PK�X��R:CCdisinformatico.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Disinformatico(BasicNewsRecipe):
    title = u'Il Disinformatico - Paolo Attivissimo'
    oldest_article = 7
    max_articles_per_feed = 25
    auto_cleanup = False
    use_embedded_content = False
    description = 'Un blog di Paolo Attivissimo, giornalista informatico e cacciatore di bufale'
    publisher = 'http://attivissimo.blogspot.it'
    language = 'it'
    __author__ = 'isspro'
    publication_type = 'blog'

    conversion_options = {'title': title,
                          'comments': description,
                          'language': language,
                          'publisher': 'Paolo Attivissimo',
                          'authors': 'Paolo Attivissimo',
                          'smarten_punctuation': True
                          }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'post hentry'})
    ]

    remove_tags = [
        dict(name='span', attrs={'id': 'NumCom'}),
        dict(name='div', attrs={'id': 'PostFooter'})
    ]

    extra_css = '''
        h1 {font-size:x-large;}
        .post-body {margin: 0pt;}
        .post-timestamp {margin-right: 0pt;}
    '''

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        # Loop through all feeds.
        for feed in feeds:
            # Loop through all articles in feed.
            for article in feed.articles[:]:
                if 'podcast' in article.title:
                    feed.articles.remove(article)

        return feeds

    feeds = [(u'Home', u'http://feeds.feedburner.com/Disinformatico')]
PK�X��VRdistrowatch_weekly.png�PNG


IHDR  ���IDATx^�V[l�?g����m���B�5kPA�BM��?�[�x'Qy����b"	�`򇈴D%RĪ����B��Զ@)-�쥻���9�o�,�톥b�/�3�|3�n�;�`��m���gj@H䲀�!��&c:�L0ƠgJ)BXpU���1��-���q��#t�{���\v8;�2DGW�#�kre=��<�8^!JwP���!�Қ��4��ˁ_:,v���[D��>P:�A�z75Y�a[�u�J�O�m���Q�� �g��A�WG��N\R��5�j�:p����	1Ucl_�8���[o2��l��t�m���8!֙�<��?��0d0fe`啽�0���C�~�����h��a��/
��wn��M؆�����m
�	��
n�|����)��t��< ��gU�U<����[�Ow�|�;~�s�2�CYO��cBO;����d�c�Q=K�%5߀(b�����1�����?��n���v7wM�fey�ѻB��*�Z�<��9�/�ȡ"-�>)K����VD�H��I�-+�j�B��F�\�:�re��$ �F@E�)QE�e�H���b>a�3c�0�*��d|I閿L--V�M�1�v W����$��±i� ��n����%F�$��JI�JJ\�Y�+�zB���%ID���eS��[��n
���x*��a���(poxXAf6P8&I� �n�e �d�J�M���5(T�6<n	hJQPM���çJAM!���Si����/�� &u�!L�EEl�����[�+hr��ـ��)�mb���'���j,f\����ׅ���XJ��&�~�v��0�f�W�|q�LSC�hXZ�8��W?Q���g���jֽ���s�6}u��L�lݒG��˳�s��xٰ,�Т���tu*�2��ז3���Cѻkϭ7���wE�{�#;�vG|#@*bl�ĴO�i
@ޥ^�%��g�S�L���M��Pj.����1|-�w1�|a�%��b�1F�u{v����sf2i�R�.z�'�l�>���D\3�8���ƭ�~x㹻�{eQu$�u�$�	 n�!c���W�g��p|�I
%�c����h˖΍�*����
š@(�i�5&���R�
J�Rή�g�CS�E�>_?�:TY̫��H�3�D(�^p-ʍ�*R��H���	c/<}ϲ�Z��
�qPJ�I+>eQBA�6�+q�rH��D�p��ԕ�salUUJG��ݡ��:v���1�F��CLʬh"��D�i�o���N.��*��o3(ˁ��Q~YVFy�g|�+_m��N��G�k�����q�lǽsڌ�&V��80f��06��&��&b̲ىSη-���i>q4�� ��GG�l.dP`{�ٳ%���<��
����G�R��Z	�62_�\0� s��I�T��_�m�?�B��9%4IEND�B`�PK�XE�{{distrowatch_weekly.recipe#!/usr/bin/env python

__license__ = "GPL v3"

"""DistroWatch Weekly"""

from calibre.web.feeds.news import BasicNewsRecipe
import datetime


class DistroWatchWeekly(BasicNewsRecipe):
    title = "DistroWatch Weekly"
    description = "Weekly news about Linux distributions"
    category = "Linux, Technology, News"
    oldest_article = 14
    language = "en"
    max_articles_per_feed = 50
    no_stylesheets = True
    use_embedded_content = False
    timefmt = " [%A, %d %B, %Y]"
    auto_cleanup = False

    keep_only_tags = [
        dict(
            attrs={
                "class":
                lambda x: x and ("News1" in x)
            }
        )
    ]

    def _get_mag_date(self):
        """Return date of latest weekly issue."""

        d = datetime.date(2022, 6, 20)
        t = datetime.date.today()
        ld = None
        while d <= t:
            ld = d
            d += datetime.timedelta(days=7)
        return ld

    def parse_index(self):

        # Get URL of latest mag page
        ld = self._get_mag_date()
        url = ld.strftime("https://distrowatch.com/weekly.php?issue=%Y%m%d")
        url = url.lower()
        title = ld.strftime("DistroWatch Weekly for %Y-%m-%d")

        # Get articles
        stories = [{
            "url": url,
            "title": title,
        },]
        index = [
            ("Articles", stories),
        ]

        return index
PK�X&>��VVdivahair.png�PNG


IHDR��h6IDATx�c������T`fV��W��Q_[������
"��KF�7���罜=����?�<���ۿ����\]�e�?�4��?����ӿ�8U�4�IHx��~��o�n�~��ߟ?��&v%EUU6A&nF&&��eۧO�mhX4w�ϟ?��ߺu�-0�����ݻwϜ9s��	�

s7o6�����gkk+Јy��y�fӦM@�E�M
677� �ߺ��t:И���ׯ_���5������'((��߿@K�������j^޺���d����80i�$ 788x�ڵ��������N���z�
�ttt�V�[����ʕ+.##�U�"##�J���v�X��֭�g1]�}{�ƍ!!!@{�θ~�:D������	ۤ�{RS�$č��oo��t	�[���л@�?�~�xp����w�R/��UT8� π5v@:߿�x��k�.�UU�+*@�ҿ?~�~���ٷ��.��•b�����_/_�ߺ�ai�U[���J@7`�
֯_��;����f`�-M4up4Y��2��IEND�B`�PK�X�v��^^divahair.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
divahair.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DivaHair(BasicNewsRecipe):
    title = u'Diva Hair'
    language = 'ro'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Coafuri, frizuri, tunsori ..'
    publisher = u'Diva Hair'
    category = u'Ziare,Stiri,Coafuri,Femei'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True
    cover_url = 'http://www.divahair.ro/imgs/logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='td', attrs={'class': 'spatiuart'}), dict(
            name='div', attrs={'class': 'spatiuart'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'categorie'}), dict(name='div', attrs={
            'class': 'gri gri2 detaliiart'}), dict(name='div', attrs={'class': 'articol_box_bottom'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': 'articol_box_bottom'})
    ]

    feeds = [(u'\u0218tiri', u'http://www.divahair.ro/feed')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XE���iidjurslandsposten_dk.png�PNG


IHDR  D���PLTE>99>99>99>99>99>99>99>99>99���<77=88>99;66ZVV���KFF@;;:55���JEE������UQQ������fbb���UPP���=77C>>IDD���������a\\���YUU��鄁�������D??a]]������XSS]YY|xx���FBB?::eaawssLGG���������;55�����ӗ����������뿾�NII^YY���[VVXTT������yuuqmm���hdd������\WW��������ɖ��WSS������~zzGBB\XXFAA���A<<l+v�	tRNS������I��IDATx��҃�CA��g.wc=۶m����Ňtipʭi.]�Gs��x5]�ofn�����4i�!��9`Y�Fa������i`}3?{��	�_�ov=��C0���aQ�ƁH�����}�̬0�\XX\Z^Y�z����Fbk���MʃC�t �%��~�_�@��+���&��MP���>I><>=������\9���G�2�Y��6��1�M������}�{�9�RB����IEND�B`�PK�Xy��G��djurslandsposten_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
DjurslandsPosten
'''


class DjurslandsPosten_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'DjurslandsPosten'
    description = 'Lokale og regionale nyheder'
    category = 'newspaper, news, localnews, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Nyheder', 'http://www.dinby.dk/djurslandsposten/rss'),
    ]

PK�X��	dn_se.png�PNG


IHDR  D���3PLTE���������������RRR���������fff~~~FFF:::��U6�tRNS@��f�IDATx^����@@Qn_����յR�w1��&�t����0��+�_��"�y��9?�Aq�����v7�Q�9P���t`����	�}�w@�oZ��pQ����}��_��{�3z^�,]%�����M�U�2�sp��IEND�B`�PK�X��5$$dn_se.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
dn.se
'''
from calibre.web.feeds.news import BasicNewsRecipe


class DN_se(BasicNewsRecipe):
    title = 'Dagens Nyheter'
    __author__ = 'Darko Miletic'
    description = 'News from Sweden'
    publisher = 'Dagens Nyheter'
    category = 'news, politics, Sveden'
    oldest_article = 2
    delay = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'sv'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [

    (u'Nyheter', u'https://www.dn.se/m/rss/toppnyheter'),
    (u'Ekonomi', u'https://www.dn.se/ekonomi-rss'),
    (u'Sport', u'https://www.dn.se/sport-rss'),
    (u'Debatt', u'https://www.dn.se/debatt-rss'),
    (u'Ledare', u'https://www.dn.se/ledare-rss'),
    (u'Kultur', u'https://www.dn.se/kultur-rss')
    ]

    keep_only_tags = [dict(name='div', attrs={'id': 'article-content'})]
    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(name='div', attrs={'id': 'byline'})
    remove_tags = [
        dict(name=['object', 'link', 'base']), dict(
            name='div', attrs={'id': 'hook'})
    ]
PK�X�7���dna.png�PNG


IHDR  ���IDATx���OQ���:Kg��;��Rpy�Fc|�bH���nH�#a���T+"Z6%V�Ed	�Q�B0!���r��Z���䦹g�9�;�=�5��,�t�TU@PxD�5s�nR���X�����!�3<����575��ח;��q��8+�j}Dִ���]���_ohϜT��k~,YB���u蠽�X���Q0��I��G�32{7�x�aa1�r��9�a�<���2`bX�\↻$&�n�	�go1����2@j�
Quj��\J�@M .NLD�s��R:1=*�p���$��ef�{E���Cc��A�OV�i�����rS܋�1������1j��K6_q��^K�[[l�6;��Q�~w��NJ���6}k�2����qz;��c����;r�3�!’ꔐ�֊��Q��)Q04LD�wl�l!(4
g��Y����F���\�1�����$��V��#=֋Q��05���L��Sc��Q1��s|`{��W;��QlՁ����T:2�ZV֦iY��v\�Qh�G��m��2���"@s벮+�ޝ��N�Q]z✂w���E\����/\���jW���F�{�9uy4vB�F���>q9��҃�ʤ1�`<�)@��7���M��>��,EUێ���dF��^�
���ST��ɂ2����IEND�B`�PK�X�u#		
dna.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class DNAIndia(BasicNewsRecipe):

    title = 'DNA India'
    description = 'Mumbai news, India news, World news, breaking news'
    __author__ = 'Kovid Goyal'
    language = 'en_IN'

    encoding = 'cp1252'
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('Top News', 'http://www.dnaindia.com/syndication/rss_topnews.xml'),
        ('Popular News', 'http://www.dnaindia.com/syndication/rss_popular.xml'),
        ('Recent Columns', 'http://www.dnaindia.com/syndication/rss_column.xml'),
        ('Mumbai', 'http://www.dnaindia.com/syndication/rss,catid-1.xml'),
        ('India', 'http://www.dnaindia.com/syndication/rss,catid-2.xml'),
        ('World', 'http://www.dnaindia.com/syndication/rss,catid-9.xml'),
        ('Money', 'http://www.dnaindia.com/syndication/rss,catid-4.xml'),
        ('Sports', 'http://www.dnaindia.com/syndication/rss,catid-6.xml'),
        ('After Hours', 'http://www.dnaindia.com/syndication/rss,catid-7.xml')
    ]

    def print_version(self, url):
        match = re.search(r'newsid=(\d+)', url)
        if not match:
            return url
        return 'http://www.dnaindia.com/dnaprint.asp?newsid=' + match.group(1)

    def postprocess_html(self, soup, first_fetch):
        for t in soup.findAll(['table', 'tr', 'td']):
            t.name = 'div'

        a = soup.find(href='http://www.3dsyndication.com/')
        if a is not None:
            a.parent.extract()
        return soup
PK�X�xuNNdnevni_avaz.png�PNG


IHDR��h6IDATxڕ�1LTAE���
,˂Y@#$ƨ����(Q����c���6vV6��ؘ`a�����& �A��l��3�Y����[����K�3؏�@��^�]�^6�N� ��]�yz�7~J�%`@��h�D�D�9{:�n��غ�H�eB�������X}�+u��՛�H;�&A@Áh�Bx���-/��F�E,?=�,,��f
���a�k߱�Sy��8�)�?(?~��'ž}b?������ �=jN��Ak0W��Ƴ���.S]
�8�S�Y���k�� �.�6�>lo�z�)GÃ�!ǿ������E��䛸����0�
���Rt�G�׍yX�޾W�j��Y75��y$�lnRE(�1'�T �G:�Ϟ�L����A�nJ�sbݔ�T,�e;3���oD�@*���$���n�b^��U�DR*������C6‰�T�W
0{��b�Њ����R~�ǯ{��/���ak[PSg�Ummp��{$	�`�_��=7#�����}��xbߒl�$IEND�B`�PK�X��sNNdnevnik.png�PNG


IHDR��h6IDATx�c���߿������[O�pېl�"�pE����)����"V������?M����0b�c�Wb��B}J��Rs��\]�������w��R�Y�I�St��2��u*V����P}bC��m�" 	TR
�B��4�U����p��]�i� ��'�3�)P��&(�.p���C��	 w�U3L�e��*;߹�Hg���ՁRP�~�%773خ��
A������G��{r�w��=��+��cP]��0A
��O����H tGP꓉�[sTC50�5Ԟ���!h{!�`d
v���aN��.3�ջ�nr�ߊ����+
{��.P��\���5�;�9@�yz2��5wv1�x�h�d�`��dM�`U_���WP�5�����Z=��A2Ae��И���o��:��1�W֩T
4���<Hbb�'Վ�s�f�3���>�:�OAi���[�`	���!�����m�3^f�*<rg�k������vt%����IEND�B`�PK�X�a`dnevnik.recipe__license__ = 'GPL v3'
__copyright__ = '2010, BlonG'
'''
dnevnik.si
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Dnevnik(BasicNewsRecipe):
    title = u'Dnevnik.si'
    __author__ = u'BlonG'
    description = u'''Dnevnik je \u010dasnik z ve\u010d kot polstoletno zgodovino.
  Pod sloganom \xbb\u017divljenje ima besedo\xab na svojih straneh prina\u0161a
  bralcem bogastvo informacij, komentarjev in kolumen in raznovrstnost
  pogledov, zaznamovanih z odgovornostjo do posameznika in \u0161ir\u0161e
  dru\u017ebe.'''
    oldest_article = 3
    max_articles_per_feed = 20
    language = 'sl'
    no_stylesheets = True
    use_embedded_content = False

    cover_url = 'https://sites.google.com/site/javno2010/home/dnevnik_cover.jpg'

    extra_css = '''
    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''

    keep_only_tags = [
        dict(name='div', attrs={'id': '_iprom_inStream'}),
        dict(name='div', attrs={'class': 'entry-content'}),
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'fb_article_top'}),
        dict(name='div', attrs={'class': 'related'}),
        dict(name='div', attrs={'class': 'fb_article_foot'}),
        dict(name='div', attrs={'class': 'spreading'}),
        dict(name='dl', attrs={'class': 'ad'}),
        dict(name='p', attrs={'class': 'report'}),
        dict(name='div', attrs={'class': 'hfeed comments'}),
        dict(name='dl', attrs={'id': 'entryPanel'}),
        dict(name='dl', attrs={'class': 'infopush ip_wide'}),
        dict(name='div', attrs={'class': 'sidebar'}),
        dict(name='dl', attrs={'class': 'bottom'}),
        dict(name='div', attrs={'id': 'footer'}),
    ]

    feeds = [

    (u'Slovenija', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=13'),
    (u'Svet', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=14'),
    (u'EU', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=116'),
    (u'Poslovni dnevnik', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=5'),
    (u'Kronika', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=15'),
    (u'Kultura', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=17'),
    (u'Zdravje', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=18'),
    (u'Znanost in IT', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=19'),
    (u'(Ne)verjetno', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=20'),
    (u'E-strada', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=21'),
    (u'Svet vozil', u'http://www.dnevnik.si/rss/?articleType=1&articleSection=22')
    ]
PK�X��g�uudnevnik_cro.png�PNG


IHDR  D����PLTE����������������������������GL����y|������؀���ѱ��ʡ
���������������������������\`�fi���Ͼ��IM�_c��"'ը�����CF���׈�ו��"&ث��op�ڝ��!���߿�ᶸ�(-�]`������ĺ��nq����|�MQɍ���Ӭʮ��z|��TX��!z�J4tRNS@��fEIDATx^��Ֆ�0+�v�̼����?�R���ns_=g�HQ�P���袼/:'�P6����O������Y���@�1�D��s����w������k�` U��P9@B���j)�`�m`?6l���Š����HNؔю
T������[N�̀
�l����z�� ha+kP��b�ߴmHgM��i��.���.�k�5���L��6�dRO_+������m5�%���w�$G2��:�(�֎aT����ʑҎ!@��Six���G�]Y��;�.൦��!���I���/8�"</�DIEND�B`�PK�X{x̴

dnevnik_cro.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
dnevnik.hr
'''

import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class DnevnikCro(BasicNewsRecipe):
    title = 'Dnevnik - Hr'
    __author__ = 'Darko Miletic'
    description = "Vijesti iz Hrvatske"
    publisher = 'Dnevnik.hr'
    category = 'news, politics, Croatia'
    oldest_article = 2
    max_articles_per_feed = 100
    delay = 4
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'hr'

    lang = 'hr-HR'
    direction = 'ltr'
    extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif}'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [dict(name='div', attrs={'id': 'article'})]

    remove_tags = [
        dict(name=['object', 'link', 'embed']), dict(name='div', attrs={
            'class': 'menu'}), dict(name='div', attrs={'id': 'video'})
    ]

    remove_tags_after = dict(name='div', attrs={'id': 'content'})

    feeds = [(u'Vijesti', u'http://rss.dnevnik.hr/index.rss')]

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction

        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]

        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return self.adeify_images(soup)
PK�X��u+��dnevnik_mk.recipe#!/usr/bin/env python
from __future__ import print_function

__author__ = 'Darko Spasovski'
__license__ = 'GPL v3'
__copyright__ = '2011, Darko Spasovski <darko.spasovski at gmail.com>'
'''
dnevnik.com.mk
'''

import re
import datetime
from calibre.web.feeds.news import BasicNewsRecipe
from calibre import browser
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class Dnevnik(BasicNewsRecipe):

    INDEX = 'http://www.dnevnik.com.mk'
    __author__ = 'Darko Spasovski'
    title = 'Dnevnik - mk'
    description = 'Daily Macedonian newspaper'
    masthead_url = 'http://www.dnevnik.com.mk/images/re-logo.gif'
    language = 'mk'
    publication_type = 'newspaper'
    category = 'news, Macedonia'
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False

    preprocess_regexps = [(re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
                          [
        # Remove anything before the start of the article.
        (r'<body.*?<\?xml version=\"1.0\"\?><!--Article start-->', lambda match: '<body>'),

        # Remove anything after the end of the article.
        (r'<!--Article end.*?</body>', lambda match: '</body>'),
    ]
    ]

    extra_css = """
                    body{font-family: Arial,Helvetica,sans-serif}
                    .WB_DNEVNIK_Naslov{FONT-WEIGHT: bold; FONT-SIZE: 18px; FONT-FAMILY: Arial, Verdana, Tahoma; TEXT-DECORATION: none}
                """

    conversion_options = {
        'comment': description,
        'tags': category,
        'language': language,
        'linearize_tables': True
    }

    def parse_index(self):
        datum = datetime.datetime.today().strftime('%d.%m.%Y')
        soup = self.index_to_soup(
            self.INDEX + '/default.asp?section=arhiva&arhDatum=' + datum)
        feeds = []
        for section in soup.findAll('td', attrs={'class': 'WB_DNEVNIK_ArhivaFormTitle'}):
            sectionTitle = section.contents[0].string
            if sectionTitle.lower().startswith('online'):
                # Skip online articles
                continue
            containerTable = section.findPrevious(
                name='table').findNextSibling(name='table')
            if containerTable is None:
                print('No container table found - page layout may have been changed.')
                continue
            articles = []
            for article in containerTable.findAll('a', attrs={'class': 'WB_DNEVNIK_ArhivaFormText'}):
                title = self.tag_to_string(article, use_alt=True).strip()
                articles.append({'title': title, 'url': 'http://www.dnevnik.com.mk/' +
                                 article['href'], 'description': '', 'date': ''})
            if articles:
                feeds.append((sectionTitle, articles))
        return sorted(feeds, key=lambda section: self.get_weight(section))

    def get_weight(self, section):
        """
        Returns 'weight' of a section.
        Used for sorting the sections based on their 'natural' order in the printed edition.
        """
        natural_order = {u'во фокусот': 1, u'актуелно': 2, u'економија': 3,
                         u'отворена': 4, u'свет': 5, u'интервју': 6, u'џубокс': 7,
                         u'репортажа': 8, u'наш туризам': 9, u'живот': 10,
                         u'автомобилизам': 11, u'спорт': 12, u'омнибус': 13}
        if section[0].string.lower() in natural_order:
            return natural_order[section[0].string.lower()]
        else:
            return 999  # section names not on the list go to the bottom

    def get_cover_url(self):
        datum = datetime.datetime.today().strftime('%d.%m.%Y')
        soup = self.index_to_soup(
            self.INDEX + '/default.asp?section=arhiva&arhDatum=' + datum)
        anchor = soup.find('a', attrs={'class': 'WB_DNEVNIK_MoreLink'})
        if anchor is not None:
            raw = browser().open_novisit(
                self.INDEX + '/' + anchor['href']).read()
            cover_soup = BeautifulSoup(raw)
            url = cover_soup.find(
                'div', attrs={'class': 'WB_DNEVNIK_Datum2'}).findNext('img')['src']
            return self.INDEX + '/' + url
        return ''
PK�XE�w��dobanevinosti.png�PNG


IHDR  D���*PLTE�f�r�z"��Z��r�������ƞ�ھ��������%��tRNS@��fIDATxڽ���0@Q�Q��[Q1�/����	�q-܇v�v<5[�&(�hd$͠@FVU�"�K��\<uY<GVM@�0s@7>��[��{�A�W�֧�U�gѬ�M+X�c����^���&'|��GsM8�UIEND�B`�PK�XXV�d��dobanevinosti.recipe
__license__ = 'GPL v3'
__copyright__ = '2013, Darko Miletic <darko.miletic at gmail.com>'
'''
dobanevinosti.blogspot.com
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe


class DobaNevinosti(BasicNewsRecipe):
    title = 'Doba Nevinosti'
    __author__ = 'Darko Miletic'
    description = 'Filmski blog'
    oldest_article = 15
    max_articles_per_feed = 100
    language = 'sr'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = True
    publication_type = 'blog'
    auto_cleanup = True
    extra_css             = """
                               @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                               body{font-family: "Trebuchet MS",Trebuchet,Verdana,sans1,sans-serif}
                               img{margin-bottom: 0.8em; display:block;}
                            """

    conversion_options = {
        'comment': description, 'tags': 'film, blog, srbija, tv', 'publisher': 'Dimitrije Vojinov', 'language': language
    }
    remove_attributes = ['lang', 'border']
    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    feeds = [(u'Tekstovi', u'http://dobanevinosti.blogspot.com/feeds/posts/default')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�X�OfV��dobreprogamy.png�PNG


IHDR�aHIDATxڅ�pmY��m۶m۶mۊm۶m۶m'kN!�o�UM�'�~��	�Y���(�m�J���GL��X�4fZ�ݘ�.m�='�b�3��L��,ez�p�1�Q��}��Fv��ߞmۧ�<b�K=s�;����1����G|/��ܐ8�#ݼwyc�؆@�1SY깋�$�ɰ���4J�.iJG)��(6�?RW��Ļ��
S!ԄFSxo�[�z!ϴRl�tttܛ��.^���;jov �z,C��)Ժ�A{�-�'��b�r��W �M��Q�?@G�2�Tۢ�^od�7ǟ��U_�Bm?ړ5Q�5.�y�%��c�7ǗK>���aZ�P�+��q�Y�@��;�4��CY��!vk�G��%�x}ޞ]�{+���9;9�I�&ͧ4���\'�;�!�w[��۶a���x��9=z����c��H�>m�Rg��dL��܇a�x��!rrr`kk��G�~v��L`�3�IZL�I��n���'b˖-022³gϰa�lz��{���u,u�G�o����G/UUU�|�۶mÉ'lll���󿊈����������ϟ[����e��_[���M�IEND�B`�PK�X��,PPdobreprogamy.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class Dobreprogramy_pl(BasicNewsRecipe):
    title = 'Dobreprogramy.pl'
    __author__ = u'fenuks & Tomasz Długosz'
    __licence__ = 'GPL v3'
    category = 'IT'
    masthead_url = 'http://static.dpcdn.pl/css/Black/Images/header_logo_napis_fullVersion.png'
    cover_url = 'http://userlogos.org/files/logos/Karmody/dobreprogramy_01.png'
    description = u'Aktualności i blogi z dobreprogramy.pl'
    encoding = 'utf-8'
    index = 'http://www.dobreprogramy.pl/'
    no_stylesheets = True
    language = 'pl'
    extra_css = '.title {font-size:22px;}'
    oldest_article = 8
    max_articles_per_feed = 100
    remove_attrs = ['style', 'width', 'height']
    preprocess_regexps = [(re.compile(
        type(u'')(r'<div id="\S+360pmp4">Twoja przeglądarka nie obsługuje Flasha i HTML5 lub wyłączono obsługę JavaScript...</div>')), lambda match: '')]
    keep_only_tags = [dict(name='h1'), dict(
        attrs={'class': ['entry single']}), dict(id='phContent_divArticle')]
    remove_tags = [dict(attrs={'class': ['newsOptions', 'noPrint', 'komentarze', 'tags  font-heading-master', 'social nested-grid  grid-margin-px15-top clearfix no-mobile', 'page-info text-h4 font-heading grid-margin-px15-top color-annotation clearfix', 'series grid-margin-px30-top']}), dict(id='komentarze'), dict(id='phContent_ctl02_sBreadcrumb'), dict(name='iframe')]  # noqa

    feeds = [(u'Aktualności', 'http://feeds.feedburner.com/dobreprogramy/Aktualnosci'),
             ('Blogi', 'http://feeds.feedburner.com/dobreprogramy/BlogCzytelnikow')]

    def preprocess_html(self, soup):
        for a in soup('a', href=True):
            if 'http://' not in a['href'] and 'https://' not in a['href']:
                a['href'] = self.index + a['href']
        for r in soup.findAll('iframe'):
            r.parent.extract()
        return soup

    def postprocess_html(self, soup, first_fetch):
        for r in soup.findAll('span', text=''):
            if not r.string:
                r.extract()
        return soup

    extra_css = '''
        h1 { font-size:130% }
    '''
PK�X��)�doghousediaries.png�PNG


IHDR  ���IDATx��w�F��'��238^333������4 �#p�(���&�R8Ծs�X�ӻ���C�_�
�"��]��Q9 r�^l��F�A��Y�;�v��hG�N�؅E� y��HL b!d��v,�"qdQ���PQ}��8��V���;&'���`82ԑ� �B|�B�A�ж�T9:���#�ﳴ�\,,8��r..�kK��Ԕ�c�޼q��@MyQt��WU�ؼ�X����᥆��W�n߿���S_S�����S�.���|@��_Ј�`h�"f��3�<�TRz�A인ز��vt,��bC����J�$&�6�K��4�7�#���U���u��uM�a�O��v��m����Y5:��_���vnn]��������k����n����^Ia� /mk�n�Q�DO��RBD{�ҩ��J�{��h8�`��:��"�=���z�����SU6*��SA���ND��'J�FD��C֦zS"'!�S�"7�`f|�lQ�GQL��ʊ��^#S��ɩYIb�	�WU�}~'�8
�hq~j�Hj��]D���H7���\�,���
<@��1B�ǁ���>k}�O5�)A��XS���+zrX��h��3��c�^U���!�T36v�j5^���u���.Y�M�C�X"'R�{:�v]h�'R�����'8h""�	� �mf��#G$Y1�t�O��it��㉂\�ff12@Ȇ�_�����;�#	��a�ƥ�J��p�nT��#�s����0���/�V{k|�E�Ÿ;�[Ξ��ԭ(�6B�Cv��Pֳ�_�����f'&6WW�V���F�-�_�8���GQڡ�"���:�d��Tenm%��:��u>)�TJҙܼ8��Y_�Ȳ
��h8��C��E�ȊW(�d]݊䥱`�ȹ��`��*���:�P��Ǧ��~9�<���IEND�B`�PK�Xa�y��doghousediaries.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2012, NiLuJe <niluje at ak-team.com>'

'''
Fetch DoghouseDiaries.
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class DoghouseDiaries(BasicNewsRecipe):
    title = 'Doghouse Diaries'
    description = 'A webcomic.'
    __author__ = 'NiLuJe'
    language = 'en'

    use_embedded_content = False
    # 14 comics per fetch (not really days... but we can't easily get the date
    # of individual comics, short of parsing each one...)
    oldest_article = 14

    cover_url = 'http://www.thedoghousediaries.com/logos/logo3.png'
    masthead_url = 'http://www.thedoghousediaries.com/logos/logo3.png'

    keep_only_tags = [dict(name='img', attrs={'class': re.compile("comic-item*")}), dict(
        name='h1'), dict(name='div', attrs={'class': 'entry'}), dict(name='p', id='alttext')]
    remove_tags = [dict(name='div', attrs={'class': 'pin-it-btn-wrapper'}), dict(
        name='span'), dict(name='div', id='wp_fb_like_button')]
    remove_attributes = ['width', 'height']
    no_stylesheets = True

    # Turn image bubblehelp into a paragraph (NOTE: We run before the
    # remove_tags cleanup, so we need to make sure we only parse the
    # comic-item img, not the pinterest one pulled by the entry div)
    preprocess_regexps = [
        (re.compile(r'(<img.*src="http://thedoghousediaries.com/comics/.*title=")([^"]+)(".*>)'),
         lambda m: '%s%s<p id="alttext"><strong>%s</strong></p>' % (m.group(1), m.group(3), m.group(2)))
    ]

    def parse_index(self):
        INDEX = 'http://www.thedoghousediaries.com/'

        soup = self.index_to_soup(INDEX)
        articles = []
        # Since the feed sucks, and there's no real archive, we use the 'Quick
        # Archive' thingie, but we can't get the date from here, so stop after
        # 14 comics...
        for item in soup.findAll('option', {}, True, None, self.oldest_article + 1):
            # Skip the quick archive itself
            if (item['value'] != '0'):
                articles.append({
                    'title': self.tag_to_string(item).encode('UTF-8'),
                    'url': item['value'],
                    'description': '',
                    'content': '',
                })

        return [('Doghouse Diaries', articles)]
PK�X����dominion.png�PNG


IHDR  szz�aIDATxڭ�Pi�uww�B-uW8�é '������W���;��ꎄ�!���{73�d†	L3���d4ww����Ct�b]�YC��B�K��t1>���ѩb:��/�6��6�����ۡ`�k�AWn��,aL �t.t�t≊���#5��jb~�Aѿ1�"��@����͓�ˤا��2!ng�͙<��+�R	t�b�A-�c�&L��b~E�c��,v?)@�ZC��x�.�Ü�
Бj&�V.��m(gB��=�Y���Lb�%�ry1Z���Ɲ�mp�W�`�Qs��f:"n��	�S���j�������rtn@��e?_��X���}f��B&�Aq;���%"##����/���-[�������P��Nю8^,�@�z1�#���N�|��U�5�(��C�"--
,L�>}��_�����\Uc�G=�^�����.�IVf�I���%~���T�',,]�tK�������Fj�
�:L��Ӿ��|[mF�����(��MһHV�@���
0��r1��J%t���0sgd۔��Yy�D��3����H�}�2��~)%K�����j�|�…hӦM��b�G5��Ub��B��Yя�ȧ��ς�\��W���ѱI��u�Oaa�Vj�ĉ�8R\�TaՆ
�s��o���N��c)��* �| 9�r��)3��J��m��u���0���̼�:�sV�;v�08�����Ça,�7W��K�dQb��򄴡�,v�!�Zx2����GCC��?���	|�ai9%�
�(P�p3�c�ƍF�������U�y�6$O1�~���y?��:w�l���ѣQSS)�x*���+ؽ����f��ǃ{��JKK���e˖�C��J�kC���pY�׾����2�g���h)�As��AXXXH
XYYI��_b��g�r��,��l����v�p� � pssC^^���aQ�Y�fA�Z��_,�g�����*���3	B�nH"���͛QTT�D`���FV)gk�˴Ǎ�@\&�cQ��/�}�>}��={6��S�������?~�����C�������G����	�#.���@�Fy���=�8�
�B��.EQ5�}�=�6��(p���ȌK'
�>{ Ԡ���̜9�E�����Cu���7����"QB�$�H.��Y�əD��E�XBCCann�l�xZZZ����\��3��E��&}Xq.�
�x&C�6C
���݋�...pvvƮ]�����"ڣ�3
����AR�rV^�E2�;L"�S��Ak��8D��}s. p�]QB�$L�9X��#��_f�>����R�ǔ��'qPvR+���LBF�ߠ�*��3�!���h�v��0WY��W"���K�qf^ �Ȏ t���ݳ�M���ʻ�r^f�,�,���	�xY�P{9��'G<szY+�A�2;D-ٌ;���s���J�E8H��:,xQ��7A��g�$T[�C��P<Zm��o"e�5"�l�g����D���z3G�״[�Fz��Z��‹��^2��ܕkv3��%��&#�?vD
LT"IEND�B`�PK�X0�����dominion.recipefrom 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 stuffconz(BasicNewsRecipe):
    title = u'stuff.co.nz'
    language = 'en_NZ'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25

    keep_only_tags = [
        classes('sics-component__headline sics-component__byline sics-component__story')
    ]
    remove_tags = [
        dict(name=['meta', 'link', 'style']),
        classes('sics-component__sharebar'),
    ]

    remove_stylesheets = True
    feeds = [
        ('Dominion Post',
         'http://www.stuff.co.nz/rss/dominion-post'),
        ('National',
         'http://www.stuff.co.nz/rss/national'),
        ('World',
         'http://www.stuff.co.nz/rss/world'),
        ('Business',
         'http://www.stuff.co.nz/rss/business'),
        ('Technology',
         'http://www.stuff.co.nz/rss/technology'),
        ('Sport',
         'http://www.stuff.co.nz/rss/sport'),
        ('Entertainment',
         'http://www.stuff.co.nz/rss/entertainment'),
        ('Life and Style',
         'http://www.stuff.co.nz/rss/life-style'),

    ]
PK�X\�\WHH	donga.png�PNG


IHDR  D���8PLTE
y{���
z}���}�M��������
}�������~�
y|}�P��S������ĥ�Χ��
{}�����~������8�����������M���������������ߒ������Ϟ��{~>�����A��
z|��������%��������������k��m��t�����v��������,�����Ô��.����Ӏ����³�Ԑ��\��&��l��'��s�����+��u�����/��7����Ž��������������~������ �����O�����$��~�T��Y��Z��[����ڇ>1^tRNS@��f�IDATx^����0�3N���L���.33�}�78I��͑V��̧�������J��~Ug�c�J	Lm!\-!����pWߌ�qn�.V]1%��-2e���n�̨�h���~8�S#��S�(lhb�/;��M
�6v���~+у�Xh�ysG��E�nh���,=݃����"
���;"ZKρ�R�F��
�[FeK��|R�|U[�n(@,��^���Ǟ��A�^y�pY�dsX/�q��������:rY�V��0켥"�[�L�񮵏"�:CYCV���8d1��G��k���s�ݖ@]�f	?)qh�H�I�s3��4ʓ���u젧u:iT�Ώ[���֜j��
6e�ɰ��a��sX��f��̑篊f`��mώ�Z?m��$�ߍؗ�؛�s��>��=cqRW/}yS��r���IEND�B`�PK�X���##donga.recipeimport re
from calibre.web.feeds.recipes import BasicNewsRecipe

# Comment out sections you are not interested in
sections = [
    ("정치", "politics"),
    ("사회", "national"),
    ("경제", "economy"),
    ("국제", "international"),
    ("사설칼럼", "editorials"),
    ("의학과학", "science"),
    ("문화연예", "culture"),
    ("스포츠", "sports"),
    ("사람속으로", "inmul")
    # Following sections are marked as marked optional
    # as default. Uncomment to enable.
    # , (u'건강', 'health')
    # , (u'레저', 'leisure')
    # , (u'도서', 'book')
    # , (u'공연', 'show')
    # , (u'여성', 'woman')
    # , (u'여행', 'travel')
    # , (u'생활정보', 'lifeinfo')
]


class Donga(BasicNewsRecipe):
    language = "ko"
    title = "동아일보"
    description = "동아일보 기사"
    __author__ = "Minsik Cho"
    ignore_duplicate_articles = {"title", "url"}
    compress_news_images = True
    no_stylesheets = True
    oldest_article = 2
    encoding = "utf-8"

    # RSS Feed in syntax:
    # https://rss.donga.com/[sections].xml
    feeds = [(title, "https://rss.donga.com/" + section + ".xml") for (title, section) in sections]

    # Remove logo and print buttons
    remove_tags = [
        dict(name="div", attrs={"class": "popHeaderWrap"}),
        dict(name="div", attrs={"class": "etc"}),
    ]

    def print_version(self, url):
        # Original url in syntax:
        # https://www.donga.com/news/[sections]/article/all/[date]/[gid]/1
        # Return print version url with syntax:
        # https://www.donga.com/news/View?gid=[gid]&date=[date]
        reobject = re.search("(?<=/all/)([0-9]*)/([0-9]*)", url)
        date = reobject.group(1)
        gid = reobject.group(2)

        return "https://www.donga.com/news/View?gid=" + gid + "&date=" + date
PK�X�.R�FFdorfener_anzeiger.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�J�11dorfener_anzeiger.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Dorfener Anzeiger'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard', u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Landkreis Erding', u'http://www.merkur-online.de/lokales/erding/rssfeed.rdf'),
    (u'Lkr. Erding', u'http://www.merkur-online.de/lokales/erding/landkreis/rssfeed.rdf'),
    (u'Dorfen', u'http://www.merkur-online.de/lokales/erding/dorfen/rssfeed.rdf'),
    (u'Flughafen', u'http://www.merkur-online.de/lokales/erding/flughafen/rssfeed.rdf'),
    (u'Taufkirchen', u'http://www.merkur-online.de/lokales/erding/taufkirchen/rssfeed.rdf'),
    (u'Erding', u'http://www.merkur-online.de/lokales/erding/erding/rssfeed.rdf'),
    (u'Moosinning', u'http://www.merkur-online.de/lokales/erding/moosinning/rssfeed.rdf'),
    (u'Wartenberg', u'http://www.merkur-online.de/lokales/erding/wartenberg/rssfeed.rdf'),
    (u'Forstern', u'http://www.merkur-online.de/lokales/erding/forstern/rssfeed.rdf'),
    (u'Bockhorn', u'http://www.merkur-online.de/lokales/erding/bockhorn/rssfeed.rdf'),
    (u'Finsing', u'http://www.merkur-online.de/lokales/erding/finsing/rssfeed.rdf'),
    (u'St. Wolfgang', u'http://www.merkur-online.de/lokales/erding/st-wolfgang/rssfeed.rdf'),
    (u'Isen', u'http://www.merkur-online.de/lokales/erding/isen/rssfeed.rdf'),
    (u'Holzland', u'http://www.merkur-online.de/lokales/erding/holzland/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/erding/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�XE�w��dosisdiarias.png�PNG


IHDR  D���*PLTE�f�r�z"��Z��r�������ƞ�ھ��������%��tRNS@��fIDATxڽ���0@Q�Q��[Q1�/����	�q-܇v�v<5[�&(�hd$͠@FVU�"�K��\<uY<GVM@�0s@7>��[��{�A�W�֧�U�gѬ�M+X�c����^���&'|��GsM8�UIEND�B`�PK�X���VVdosisdiarias.recipe__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
http://www.dosisdiarias.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class DosisDiarias(BasicNewsRecipe):
    title = 'Alberto Montt en dosis diarias'
    __author__ = 'Darko Miletic'
    description = 'Mire sin compromiso y si le gusta vuelva'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = True
    encoding = 'utf-8'
    publisher = 'Alberto Montt'
    category = 'comic, blog, spanish'
    language = 'es'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    remove_tags = [dict(name='div', attrs={'class': 'feedflare'})]

    feeds = [(u'Dosis diaria', u'http://feeds.feedburner.com/montt')]
PK�X�ť��dot_net.png�PNG


IHDR�alIDATxڝ��a@�i�F����]D�k۶Զm�g۶m���n�����yc�K�1%�u#K����$;~<�(�\ɒ���\�F]����[Z��q�,�ޟ�0����U85
3��M�g�:!��� -R�j43�,1j*�4��181S8~ߡ��l���!=*�ai_K���"D���
r���f���Ē��^3��bt>��8>�n���7!'	��`Y?+����m�Ar(TWH���̐����(	`e�V�p�<vy	g��^����E31�J�4H���u�t�RmO/h
����]i�sg�G�RY��5��f~\߯JKss7T��z�D���Dme�V�2�b|'�KIEND�B`�PK�X�L�LLdot_net.recipe__license__ = 'GPL v3'
__copyright__ = '2014, Bonni Salles - post in forum for help'
'''
Creative Blog (formerly .net magazine)
'''

from calibre.web.feeds.news import BasicNewsRecipe


class creativeblog(BasicNewsRecipe):
    title = u'Creative Blog'
    __author__ = 'Bonni Salles'
    oldest_article = 7
    publication_type = 'blog'
    max_articles_per_feed = 100
    description = 'Web Design and Tutorials from Creative Blog (part of .Net Magazine and others)'
    publisher = 'Creative Blog'
    category = 'internet, web design'
    language = 'en'
    encoding = 'utf-8'
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    auto_cleanup = True
# presently this is set to download the whole group of blogs for the feed.  If you want
# to limit it to the specific sections of the blog that you want to download.

    feeds = [
        (u'Creative Blog', u'http://www.creativebloq.com/feed/'),
        #                      (u'3D', u'http://www.creativebloq.com/feed/3d'),
        #                      (u'Adobe', u'http://www.creativebloq.com/feed/adobe'),
        #                      (u'Animation', u'http://www.creativebloq.com/feed/animation'),
        #                      (u'Apple', u'http://www.creativebloq.com/feed/apple'),
        #                      (u'Branding', u'http://www.creativebloq.com/feed/branding'),
        #                      (u'Graphic Design', u'http://www.creativebloq.com/feed/graphic-design'),
        #                      (u'Illustration', u'http://www.creativebloq.com/feed/illustration'),
        #                      (u'News', u'http://www.creativebloq.com/feed/news'),
        #                      (u'Opinion', u'http://www.creativebloq.com/feed/opinion'),
        #                      (u'Tutorials', u'http://www.creativebloq.com/feed/tutorial'),
        #                      (u'Typography', u'http://www.creativebloq.com/feed/typography'),
        #                      (u'Video', u'http://www.creativebloq.com/feed/video'),
        #                      (u'web design', u'http://www.creativebloq.com/feed/web-design'),
    ]
PK�X����
dotpod.png�PNG


IHDR  szz��IDATxڬ�3�-V�c��ӆ}�7a�A�l�{׶m۶m��Z���o�=���}�����%=Kz��1��z��%��N���G�G����>'�)��FS.�Q(X�T*��*���C҃��)=l�r9!�ɰ������2DBr945�Nb��FG��A�-��d<R*�jz�c##�����fg�����PH�2���FX-جV�m6�C!T��
�6ғ��3vD�Q���]�����$��u��R����-f3��|>|^/�.\N'�<� ��]�7��Î��;�u�Z���݅��!Z��W̹�n���
l�߇H8�8E#�P0��M��#��0����,�b�Yq��y\�x�o^G[K3�z�)�a��"�1�JH%0,��R)�r9d���1~���d�ײ��#=�G��:��8�_���'��ܹu�;���b��G���LON�b1�ٜ7�b�H0I����A��� }���x�JS������#��?n�8�r���hG{k��H�W��;���@7�c�m)����/�'��U�ݵ��é�8�]d�e�`}�G�m�&�QNfΟc %���7|���"�Y��9��
�H?Z�hk�[qp�^�<~�ON��L&9C6���1��;�q�5H�b6��p�MrQ�N����"���
���џlL���م[7�����j����Sv�eƶ��۶}�m۶m�*�Q��L���Vξ�ڇ�====�MFۑ�k�п�lݺEQ��]�ٷo/�S�f�j��gk.0��.f�Ұ\��;(*���v�9s� Т�P��r���S�̘���{-�y�-\ :��<�Qљd\*ż�wk=a�8�8�b��$��}�D���n�E�C?����J!�Q]��[�|�L�6�ZRnI�i�ܓTs2�b.�j�`YxpMշb�o��%����T��>������CѰdSI)��RK����kQ2��2	�Oϳ5�BL�p_N�^gPtu5U
D6��f�*aj]�)̈A�o�Z�(c��U8@��,\�@:�kCݠD��=?z�x��;r�P	����Ge:LGo�YFB���U���K�d�Uke����s#G�ӧ郸[� �~h���_��II��?G8�n�b�\�)�5�('{[�|�2q;�jF\F���P3u��1	�<R@yip���uv�2:���X0"X��rA��a�G H������xHs�˘Ϥ�{��\�1�B��ۑ�_�ؔb���{�CE1�;#��I�w��W�@�d��E�~�j�uh]����;�U�ؿ���^������ܱ�8�&�e�H-��'I�7_���Vj��W�*_����`�̚):��f�aU�C^��P[�����x$�m(��#���K�p?k�W+f�m��6�8�g���|���
L8�kVԀ�\v�|�՗��6�T�}�l���6O����N�:l�'!kNdP8�����J	�y��2w
�Y[�U�04�ϱ�(jf�rQ���+�c^pd�\V�r�Y�����h �2*�����r*p�RA��ҰRR��ֹ��Q���݈^�)�@���j�u5�`D@]��1ɥ�G5���G

�i��Y̔H=�j�t���	͠���ƚ*.�@Q��z�Q�h݊
�$���OT�R|�� RNW��E����Rq�X�z�B�FLP�
����,�/�E�~���9:��	�}
`��mx��t�o�_2b?ղw�Wڒ@Ȉ�f�R'd�[t�w_)H'�|�з�}l�[}2�5z����g�&
@nu��l$0b� �j�釛3�>K���'�ij�XCH%�N5�����'N�r�<���Y��|8��Q��qH�{`��o�X�.�g��O�wm�)R=sAL>IEND�B`�PK�X�����
dotpod.recipe__license__ = 'GPL v3'
__copyright__ = '2011-2011, Federico Escalada <fedeescalada at gmail.com>'

from calibre.web.feeds.news import BasicNewsRecipe


class Dotpod(BasicNewsRecipe):
    __author__ = 'Federico Escalada'
    description = 'Tecnologia y Comunicacion Audiovisual'
    encoding = 'utf-8'
    language = 'es'
    max_articles_per_feed = 100
    no_stylesheets = True
    oldest_article = 7
    publication_type = 'blog'
    title = 'Dotpod'
    authors = 'Federico Picone'

    conversion_options = {
        'authors': authors, 'comments': description, 'language': language
    }

    feeds = [('Dotpod', 'http://www.dotpod.com.ar/feed/')]

    remove_tags = [dict(name='div', attrs={'class': 'feedflare'})]
PK�XV�2���	dovod.png�PNG


IHDR  D���PLTE444AAASSSUUUVUZVVZWVZWVZWW[XW[XV[XWZXW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XX\XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[YW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XW[XX[XW[XW[XW[XW\XW[XX\YW\YX\�VbVtRNS"$&.268:>BDFHNTVZ\`jnprtz|�������������������������������������g9IDAT��#��,!����Ȫ�=.�DC��?��5�=zE��Z�8'Y��U�N���U9�*[�pqʶ�)��cC�v7�!��Y+"EeR�1h�Haƚ�(�S�_Se�o敢�7E%�>	�`�*�^�g��0�8�[=v���*'���uH�0�m�<Z��Tk���SX�hKS]�k���:Es��[�-�rTY�V-���%��:��+�=���:B[̢0���(N��*	_�*�0�/�'�靪d����3����G�u�IIEND�B`�PK�X�|��dovod.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Dovod(BasicNewsRecipe):
    title = '\u0414\u043E\u0432\u043E\u0434'
    __author__ = 'bugmen00t'
    description = '\u0421\u0430\u0439\u0442 \u00AB\u0414\u043E\u0432\u043E\u0434\u00BB \u043F\u043E\u043B\u0443\u0447\u0438\u043B \u0441\u0432\u043E\u0451 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0432 \u0447\u0435\u0441\u0442\u044C \u0440\u0430\u043D\u0435\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u00AB\u0414\u043E\u0432\u043E\u0434 \u2014 \u0412\u043B\u0430\u0434\u0438\u043C\u0438\u0440\u0441\u043A\u0438\u0435 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u0434\u0438\u0441\u043A\u0443\u0441\u0441\u0438\u0438\u00BB. \u041D\u0430\u0448\u0430 \u0446\u0435\u043B\u044C \u2014 \u043E\u0441\u0432\u0435\u0449\u0435\u043D\u0438\u0435 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u044B\u0445 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E-\u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0432\u043E\u043F\u0440\u043E\u0441\u043E\u0432 \u0438 \u0438\u0445 \u043E\u0442\u043A\u0440\u043E\u0432\u0435\u043D\u043D\u043E\u0435 \u0438 \u043E\u0441\u043C\u044B\u0441\u043B\u0435\u043D\u043D\u043E\u0435 \u043E\u0431\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435.'  # noqa
    publisher = '\u0418\u043B\u044C\u044F \u041A\u043E\u0441\u044B\u0433\u0438\u043D, \u041A\u0438\u0440\u0438\u043B\u043B \u0418\u0448\u0443\u0442\u0438\u043D'
    category = 'blog'
    cover_url = u'https://pbs.twimg.com/profile_images/1498229545505284099/l9V1l59Z_400x400.jpg'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 10

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='div', attrs={'class': 'entry-content'})

    feeds = [('\u0414\u043E\u0432\u043E\u0434', 'https://www.dovod.online/feed/')]
PK�X{A�xdown_to_earth.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class My_Feeds(BasicNewsRecipe):
    title = 'Down To Earth'
    language = 'en_IN'
    oldest_article = 20
    __author__ = 'Amit'
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    center_navbar = True
    use_embedded_content = False
    remove_empty_feeds = True
    keep_only_tags = [
        classes('detail-heading content-main news-basic-info news-banner news-detail-content')
    ]
    remove_tags = [
        classes('add-comment btn hindi_detail_link single-news-letter'),
        dict(id=['comments', 'breadcrumb', 'node_related_stories']),
        dict(attrs={'class': ['commentCount', 'box']})
    ]

    feeds = [
        ('All', 'https://www.downtoearth.org.in/rss/all'),
    ]
PK�X>0�$$downtoearth.png�PNG


IHDR  D���	pHYs��~��PLTE��������
�
��
�
���������	�
���
������������������!��� �!� �!�!�%�&�'� )�"�"�#�(� )�"+�$-�(,�(0�*2�.4�(0�)1�)2�*2�/6�8?�9A�:A�>F�?F�;C�=D�?F�GM�FM�FN�JP�MT�NU�TY�U\�Za�`g�jj�kk�fi�hn�ns�pv�qw�rw�sy�tz�uz�u{�}�쎓혜휠������������������������������������������������������������Ew)IDAT8˽ӱNQ��β�C�E�l@����XA���J6&�6vJ���
�ƨd֕f��
��K��<9���?����
��%��Z���j�a�Jn$����������#7qbn�P-w&���	’?<4��=�}�e�\�<A�p,���=rd왷^ڰ� d,ye���M��C_�Kʂ ��9��u[��$Ah��ZQ^�F�G�l$}q˺��N傮 =Q%eQ���k�,��E}�w�y�w!<0S+-ZSkU
4QO?Aؖ�
�����"bz�������IYMz��IEND�B`�PK�XPXs���	dr_dk.png�PNG


IHDR��h6XIDATx�c��$	�4̛�C$F�c����W��������ڶ"8cJۜ]A|6�Yɂ'}�����g����#	�Z�5UIEND�B`�PK�Xt��[[dr_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2023, Joel Davies <joeld.dev at gmail.com>

from calibre.web.feeds.news import BasicNewsRecipe

class DRNyheder(BasicNewsRecipe):

    # Feeds are found here: https://www.dr.dk/nyheder/dr-nyheder-som-rss-feed
    feeds          = [
        ('Seneste nyt', 'https://www.dr.dk/nyheder/service/feeds/senestenyt'),
        ('Indland', 'https://www.dr.dk/nyheder/service/feeds/indland'),
        ('Udland', 'https://www.dr.dk/nyheder/service/feeds/udland'),
        ('Penge', 'https://www.dr.dk/nyheder/service/feeds/penge'),
        ('Politik', 'https://www.dr.dk/nyheder/service/feeds/politik'),
        #('Sporten', 'https://www.dr.dk/nyheder/service/feeds/sporten'),
        #('Seneste sport', 'https://www.dr.dk/nyheder/service/feeds/senestesport'),
        ('Viden', 'https://www.dr.dk/nyheder/service/feeds/viden'),
        ('Kultur', 'https://www.dr.dk/nyheder/service/feeds/kultur'),
        ('Musik', 'https://www.dr.dk/nyheder/service/feeds/musik'),
        ('Mit Liv', 'https://www.dr.dk/nyheder/service/feeds/mitliv'),
        ('Mad', 'https://www.dr.dk/nyheder/service/feeds/mad'),
        ('Vejret', 'https://www.dr.dk/nyheder/service/feeds/vejret'),
        ('Regionale', 'https://www.dr.dk/nyheder/service/feeds/regionale'),
        ('DR Hovedstadsområdet', 'https://www.dr.dk/nyheder/service/feeds/regionale/kbh'),
        ('DR Bornholm', 'https://www.dr.dk/nyheder/service/feeds/regionale/bornholm'),
        ('DR Syd og Sønderjylland', 'https://www.dr.dk/nyheder/service/feeds/regionale/syd'),
        ('DR Fyn', 'https://www.dr.dk/nyheder/service/feeds/regionale/fyn'),
        ('DR Midt- og Vestjylland', 'https://www.dr.dk/nyheder/service/feeds/regionale/vest'),
        ('DR Nordjylland', 'https://www.dr.dk/nyheder/service/feeds/regionale/nord'),
        ('DR Trekantområdet', 'https://www.dr.dk/nyheder/service/feeds/regionale/trekanten'),
        ('DR Sjælland', 'https://www.dr.dk/nyheder/service/feeds/regionale/sjaelland'),
        ('DR Østjylland', 'https://www.dr.dk/nyheder/service/feeds/regionale/oestjylland')
    ]

    title                       = 'DR Nyheder'
    __author__                  = 'Joel Davies'
    publisher                   = 'DR Nyheder'
    description                 = 'Her finder du nyheder fra DR.'
    category                    = 'news, politics, money, culture, sport, science, Denmark'
    publication_type 	        = 'newspaper'
    encoding                    = 'utf8'
    language                    = 'da'
    oldest_article              = 4 # 2 might be best
    max_articles_per_feed       = 50 # 100 better, this is just for testing
    no_stylesheets              = True
    use_embedded_content        = False
    auto_cleanup                = False
    remove_empty_feeds 	        = True
    ignore_duplicate_articles   = {'title', 'url'}
    simultaneous_downloads      = 20
    compress_news_images        = True
    masthead_url                = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/DR_logo.svg/1024px-DR_logo.svg.png'

    extra_css = '''
        .dre-byline__contributions {
            margin-bottom: 10px;
        }

        .dre-byline__contributions div {
            display: inline;
        }

        .dre-byline__contribution + .dre-byline__contribution:before {
            display: inline;
            content: ", ";
        }

        .dre-standard-article__figure {
            margin-bottom: 30px;
            text-align: center;
        }

        .dre-picture {
            margin-bottom: 10px;
        }

        .dre-picture__image {
            max-width: 100%;
            height: auto;
        }

        .dre-standard-article__figure-caption {
            font-size: .85em;
            color: #575757;
        }
        '''

    # Skip articles with /stories/ URL as these are Instagram story-style interactive pieces that play videos
    # Also DRTV as these are just links to the live TV channel
    def preprocess_raw_html(self, raw_html, url):
        if '/stories/' in url or '/drtv/' in url:
            self.abort_article('Skipping unsupported article type')
        return raw_html

    # Generate cover from the first image on the dr.dk homepage
    def get_cover_url(self):
        cover_url = None
        soup = self.index_to_soup('https://www.dr.dk/')
        main_content = soup.find('ul', attrs={'class': 'dre-grid-layout'})
        cover_item = main_content.find('img')
        if cover_item:
            cover_url = cover_item['src']
        return cover_url


    keep_only_tags = [

        dict(name="h1", attrs={'class': 'dre-article-title__heading'}), # Title
        dict(name="div", attrs={'class': 'dre-article-byline'}), # Author
        dict(name="figure", attrs={'class': 'dre-standard-article__figure'}), # Comment out to remove images
        dict(name="p", attrs={'class': 'dre-article-body-paragraph'}), # All body text of the article
        dict(name="article", attrs={'itemtype': 'http://schema.org/NewsArticle'}),
        #dict(name="h1", attrs={'class': 'hydra-latest-news-page-short-news__title'}),
        #dict(name="p", attrs={'class': 'hydra-latest-news-page-short-news__paragraph'}),
        #dict(name="div", attrs={'class': 'dre-speech'}),
        #dict(name="div", attrs={'itemprop': 'author'})
    ]

    remove_tags = [
        dict(name='ol', attrs={'class': 'hydra-latest-news-page__list'}),
        dict(name='div', attrs={'class': [
            'hydra-latest-news-page-short-news__share', 'hydra-latest-news-page-short-news__a11y-container',
            'hydra-latest-news-page-short-news__meta', 'hydra-latest-news-page-short-news__image-slider', 'dre-byline__dates']}),
        dict(name="source"),
        #dict(name='menu', attrs={'class': 'share'}),
        #dict(name='menu', attrs={'class': 'dr-site-share-horizontal'}),
    ]

    # Fixes images having the wrong aspect ratio
    remove_attributes = ['width', 'height']
PK�Xpx&�))drivelry.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class drivelrycom(BasicNewsRecipe):
    title = u'drivelry.com'
    language = 'en'
    description = 'A blog by Mike Abrahams'
    __author__ = 'Krittika Goyal'
    oldest_article = 60  # days
    max_articles_per_feed = 25

    remove_stylesheets = True
    remove_tags_after = dict(name='div', attrs={'id': 'bookmark'})
    remove_tags = [
        dict(name='iframe'),
        dict(name='div', attrs={'class': ['sidebar']}),
        dict(name='div', attrs={'id': ['bookmark']}),
    ]

    feeds = [
        ('drivelry.com',
         'http://feeds.feedburner.com/drivelry'),

    ]

    def preprocess_html(self, soup):
        story = soup.find(name='div', attrs={'id': 'main'})
        soup = BeautifulSoup('''
<html><head><title>t</title></head><body>
<p>To donate to this blog: <a href="http://www.drivelry.com/thank-you/">click here</a></p>
</body></html>
''')
        body = soup.find(name='body')
        body.insert(0, story)
        return soup
PK�X��s�lldrytooling_pl.png�PNG


IHDR��h63IDATx�c`��6�+t�`p�LP�zL�xh_H?{����@Y0�F 6DG�4�ʍ+n�?����1y�&����@5�f��:ͼd��K�������LKV�Mڌ���7tH�hP�|@�_Nˣ��g�Vغ6v�i���<��9�f!4��[eMʞ�qձ;�_{����wʧ�����^~�d�%��N��)l0{��k&w���Z*�p>~���;C|r蔾�po�@]
9!���� ������~����-�2�i&N�]���������k�a=�3!�a���zP�B͸.��v��~ސI|!�Ă:�������[��T���
T�Pp70���Ba3�&_����9G������w�I �8B��3)��"H<�U.����/�ݪ�
�N���t6$4�1�2U*��w���,<)��:
Ә��9�%Ӵ�������O&��*�8�"t�Hpg����>���]t�f<���2E.zb�����������1�8�&��N�r�W�^���4@�B,�[5y�e�Jì�IJA��F�YIEND�B`�PK�X�®Wffdrytooling_pl.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1337668045(BasicNewsRecipe):
    title = u'Drytooling.com.pl'
    masthead_url = 'http://drytooling.com.pl/images/drytooling-kindle.png'
    cover_url = 'http://drytooling.com.pl/images/drytooling-kindle.png'
    description = u'Drytooling.com.pl jest serwisem wspinaczki zimowej, alpinizmu i himalaizmu. Jeśli uwielbiasz zimę, nie możesz doczekać się aż wyciągniesz szpej z szafki i uderzysz w Tatry, Alpy, czy może Himalaje, to znajdziesz tutaj naprawdę dużo interesujących Cię treści! Zapraszamy!'  # noqa
    __author__ = u'Damian Granowski'
    language = 'pl'
    oldest_article = 100
    max_articles_per_feed = 20
    auto_cleanup = True

    feeds = [
    (u'Newsy', u'http://drytooling.com.pl/rss?format=feed&type=rss')]
PK�X
��UUdunya_bizim.png�PNG


IHDR  ��tRNSn��
IDATx�哅�#_ǃ���c�a�RZ�.ݳ.�����e������������K��C�w�s�^�>6��|2�d��2 9��f����P��WT�`�G��a���n��_�v�,n3su�&nR�H�?Pd��N^����b6����5�S�(�}t��Q%�C@%�4�vY�
ZO��G��LzJ<��"=}�{@�(����}Y*���pF~�Q��;-1��c}�f6�
�ULj5
Oy%�iXf�f�Ԅ�x��m���V��8�G����(�~o	�����D����#�
9�����4�x	D>Z��%U�T��dR)�u��޲TH���.
Z���:1<��`�����ж�2�L�42Y/�WV���I%��FUE��9��F��f0+���<����n~K�뒴���N��N��u��]"*��WI+q��e8QԷ�t�/M9���p:,^���9��"U���#��y��������tv�d��mS7��:�sӛ��vs@Dr��±��x��44,L�B�:���!�]5�m��ͣ��`w*'u�l��Z��d�`��ok���VB��
g�K{[��O0pe>B�
��3O��r%`d�$�'&v6��D��b��x��J��?��Ԁ���IX��m����4����o8��L��C�L@l���Bܥ�����~�̝��?�}��Lvd�s�c3"�C��i}Ȩ��+Z��/d�An+%��6|���G:^	�S�̇�N�E�k�0��+��>O�8"�@�В����=S�:ĥ�W�^�z2s1�U�@�`��]�-�$wFL#�cU$��$�y��#�(sH�g��!md}�8ǴݧLD]��v�(s];۔٭�6����a��H�	m�k{Q�^H�M�&�J�kX/c��qW)}I�#ʌ&��9Y�,buF[)wE���u��ae$A�V?���Bޞ�xΌ�>���JDsY
#."�D����I��b%}�䥥-	�'�g�JO$�
⯭JŢ���_�9|�)K�����	�VD�ӂ�w1IEND�B`�PK�X�LJdunya_bizim.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1390492898(BasicNewsRecipe):
    title = u'D\xfcnya Bizim'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    __author__ = 'asalet_r'
    language = 'tr'

    feeds = [
    (u'Ayr\u0131nt\u0131 Defteri', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=58'),
    (u'Baba Kitaplar', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=4'),
    (u'\xc7-al\u0131nt\u0131', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=33'),
    (u'Dar\xfclmedya', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=49'),
    (u'Denemedi Deme', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=72'),
    (u'DevriAlem', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=67'),
    (u'Duyduk duymad\u0131k demeyin', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=48'),
    (u'G\xfczel Mekanlar', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=43'),
    (u'\u0130stanbul Bizim', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=62'),
    (u'\u0130yi Haberler', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=18'),
    (u'\u0130yi M\xfczikler', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=2'),
    (u'Kalite Dergiler', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=3'),
    (u'K\u0131sa K\u0131sa', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=55'),
    (u'Konu\u015fa Konu\u015fa', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=24'),

    (u'Medyada D\xfcnyaBizim', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=64'),
    (u'Mizah', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=29'),
    (u'M\xfcstesna G\xfczeller', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=65'),
    (u'Nerede Ne Var?', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=66'),
    (u'Not Defteri', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=71'),
    (u'O \u015eimdi Nerede?', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=52'),
    (u'Olsa Ke\u015fke', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=34'),
    (u'Orada Ne Oldu?', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=38'),
    (u'\xd6nemli Adamlar', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=1'),
    (u'Sinema', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=23'),
    (u'Tart\u0131\u015fa tart\u0131\u015fa', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=39'),
    (u'Yay\u0131n Y\xf6netmeninden', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=69'),
    (u'Yeni \u015eeyler', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=57'),
    (u'Zekeriya Sofras\u0131', u'http://www.dunyabizim.com/servisler/rss.php?kategoriID=60')]
PK�X����&
&
dunya_bulteni.png�PNG


IHDR  ��	�IDATHKM�ۏd�U��>תsN]������{z�:�A�8R�<`9,�@0�"Y<�CAB"����-�d)��U@@�2��H&��!�x<�xzz��{��u�s?��x0��{���@D��8� B��t�ݹ{�����a/�� �����lk�|ne~m��:��CB�"�'P�Ȥʱ}��[���N|��$�s�t���d����|³?���~�s�Z��
����"�2�n��_��k�q�	P ��L�*�N�h�C�Ħ����#�_���~�矲," �_��T�x��_��;���P��9�
v���5�jMT�����EBị㓽�N��uo_Yl��[Ϸ�*��}|e�>�H��w^z��+
���AƱhW&&j�Q�9݈��`%ǺzyEe�����nw��Ȣq�����'�ri��@D�2W��Hu����>���y��i�q[��n�zCP�՜b\�|Mǵ�3e�Y���:��~Š���[�Ǜ���Z)~��_[=�����{/� ɾ�g�p�G�������kWV�Ecy�Y�Z�WB�IR�^^i5�$�A�ԫ�Ӎ�Lsd344�s4�x��,SGD
�}�o�u�p*ss�'�]hN�MݨU�s��;��4`f1����(u��1��f�c�阊�2�����+���	A������71U��'�-�,�z���Y�>ߜ,0��ԲL��A���`Ћ�����N�$4���������ٳ^�����l#F��o�|���ӗ./�T�7L]C�f�\tBJ���\�����k3nQ��떽µ��բ�	�{�.6��Z��L��7nJ��x$nܸ��F��[ZY���,�QdT��� 2Jӹz������[UgB*"��:r<�2�B�ai<���x���a�ݽ���L�ʕ�mS�jm����7L�<
�O'p�l;�3��b��Q�{�n��i�Z����(d�@�4���}��s%���Y,ڮ3:ͧ����t��
��G]M�0
=�� qf����{�����z{��ZQ�|�x0'h��1U�ΝM�c`�l�����FF6N�,�R�mS�	W������ԜG�թ�VO:��a��F%ӹ��K�;*�Y�B���A�����?�у I�Yh�v.����CDd�m��������8�.Mo����A��L�͐o��u�X�/��}ey��g�dEK�P��2-���d4��q�gq����z�l��z���0��������g.-Ԫ���=���$q�3��Ŧ�l����ڤ��6�����ZS�#`
A("�ܺ[��ñ㙄�f�x<��1I��w�>������%�8ܺ�aj��h��9z�������=�8�h��璐8)�#(�h�ZѶ���������a l�H9i�r�@0�o-�iꚶpfR�Hq�|m��g��T�jE�\d��#��+���c,�Pp��p�!�`Џ#r�-YDRӭ�N_J��'�3SLJ�(�M�(خ�Q*�fY�L�:Y0���ȇ�Ұ��8���m(��2i�*�ij�S�`<ʬ�q��D�z��*,��v]�ԨV9gJ�\@SJ�)�a�۝�{�Y�����~�*���5M*���(M3��L!mSi<Y�LT*��O֪�	�P����N�I��I�#R��0� ʲ�h�σ��4�O>�]��\�O�y$�{[R�8N1��<��V�uJ�ew�ؓ��䣍d2�2�srA�'D�k^�Ea��;'{�Z"2sS\��k���?�s?��W��Ʊ߉{���T�s]7�����Į�h�\��n�''���޽��i
��ե\d�z���N����#���i��g����`.������n����ʼn�¹�S@RDD���n�V������[�A�۵mI�+�8"U�Ng8�*?ʓC	�w�镋�V��*����j�P�'���cP@D��8"v��w�}O����^{���pvv���b���Uf��A��S���0���x��
"b�+$'�k_���o�W��v�<�2��mۈ���Y��ϲ̶,�F�)���a���቎Ā�ѐ�(�Fk�s/��b�V�_U!u{�W����F7$�Yu�+yn�U��$ɕ��Lf"��63��t0ĜDa�4PJd2�ם�^�����"��EDtx��W�|�퓦�L˲��J�*9��,<S��4���%"eBr���C%c��y�W���*CDB�O�Q�����O����?�2�4 $D�H)%$W
���,׈@A�Ar�����W�����
)�U.�|�w^}���А���""I��$�P�CN�Yt]�K_~���iCg��mZ7>=�(
� ]gQ�^��w�������s"�!�2f\V����s��Lٱ�q��\�s�.����)"!�0��l�&b�۝;w7llo<��u}D�+��ff�O\������c?MS�0\�<O׵����t���?�IEND�B`�PK�X��ttdunya_bulteni.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1390492898(BasicNewsRecipe):
    title = u'D\xfcnya B\xfclteni'
    __author__ = 'asalet_r'
    language = 'tr'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
    (u'Dosya', u'http://www.dunyabulteni.net/servisler/rss/haberler/181'),
    (u'Makale-Yorum', u'http://www.dunyabulteni.net/servisler/rss/haberler/174'),
    (u'T\xfcrkiye', u'http://www.dunyabulteni.net/servisler/rss/haberler/44'),
    (u'\u015eehrin Nabz\u0131', u'http://www.dunyabulteni.net/servisler/rss/haberler/195'),
    (u'D\xfcnya', u'http://www.dunyabulteni.net/servisler/rss/haberler/31'),
    (u'Tarih Dosyas\u0131', u'http://www.dunyabulteni.net/servisler/rss/haberler/157'),
    (u'Dubam', u'http://www.dunyabulteni.net/servisler/rss/haberler/163'),
    (u'K\xfclt\xfcr Sanat', u'http://www.dunyabulteni.net/servisler/rss/haberler/66'),
    (u'Haber Analiz', u'http://www.dunyabulteni.net/servisler/rss/haberler/123'),
    (u'Ekonomi', u'http://www.dunyabulteni.net/servisler/rss/haberler/40'),

    (u'R\xf6portaj', u'http://www.dunyabulteni.net/servisler/rss/haberler/153'),
    (u'Bilim Teknoloji', u'http://www.dunyabulteni.net/servisler/rss/haberler/128'),
    (u'Aile-Sa\u011fl\u0131k', u'http://www.dunyabulteni.net/servisler/rss/haberler/75'),
    (u'E\u011fitim', u'http://www.dunyabulteni.net/servisler/rss/haberler/80'),
    (u'Gezi-\u0130zlenim', u'http://www.dunyabulteni.net/servisler/rss/haberler/90'),
    (u'Hayat\u0131n \u0130\xe7inden', u'http://www.dunyabulteni.net/servisler/rss/haberler/200'),
    (u'Yazarlar\u0131m\u0131z', u'http://www.dunyabulteni.net/servisler/rss/yazarlar/5'),
    (u'Konuk Yazarlar', u'http://www.dunyabulteni.net/servisler/rss/yazarlar/6'),
    (u'Al\u0131nt\u0131 Yaz\u0131lar', u'http://www.dunyabulteni.net/servisler/rss/yazarlar/7')]
PK�X���I�	�	dunyahalleri.png�PNG


IHDR  ��tRNSn��	8IDATxڕ�LZm��"1!11�i�!��@��@�t��]]�tu/������V˼l�hѺG]���-r��A����=X�wϣ�3~��������~��w �'���$���~�/�q^��2oo�?��C�tqpa�����L�m�6Gl#��x
��������"�h=�r�U�;�Rj	5���
��H7l��2�qB%�����}V�����V�b���S�y��	���*r��t��22�������g,��g�N,���4���Ϲ��#��o����Z?�=?��n�}��e>y�b]beX���8j����ӆ�S��/�M����1|�		�V����G�CJ�6�8u�\Ϛ��m?�]�CC8�y�
�	��S�
YUk�R����c�M�Jf���Z6_��/B��#a�]����UO��L>o��<[j��MAR��Ɂ����*H�y8����t8�,2$|���/�΂y��%�,��đ���Jg�,�K��d�N�#�a5=[��b�]�B��H�\�������q1�tX�l߹��[����<����Έ7�lD���`�3�[�ʆ���%B2�I��fVu~s�)x�~k�so����@9J��s�3�x��
�6�B�٭G[��5�36L�l~.��F	f�-[ї={�a����2C�E�x��!d��{uܩ��\�_s�P�q@���N��:�ׯ@)�'g����|ˇE3oK�N"�E��a�W[�G��t����Ư�o�%)��g�l��������AN��gE�<�|*3rr�X�Y�)m��s��+w79���
�	db��c��إpbqo�q��M����lq�4
��#!
Ec��<��2��M;�F!����i���ު��<�����,2��yrh�r�|���n�FxiB�3�ע[��-7k�9s�֐S� <n-p�5>��<�<$��d(���7�'�O�.:3�-��w��XT��׸r1��@�-��ʑ� ����C�I���y���/a�ǖ���D"ѣ"J0A0���@�"#���|����*	�Gd7�b�֝V����KS+�}]|9Y:vCS�B
�c��/�
�B�=�ڞ��/�n����n���$
��iwm�ӕ�2,�8�sYqY���-��*:���[�3���ހ��wo:�K�36�x$"��v���������m\��Բހ�j̮�Z��U��bU?�W�2�۾?�O�~�ze��@;���z#G�`yܜl:^��g��8��j��?~�n($���'N�F�v�������a�Y�4$(�dȯ?�.���#�Q�m�s�������d�$���w����Cz��'$� 
���۶����<�c�T��vJZ�{D3Z�����ɑ�{�Jb�O�����*�![����3�w���W���
z���^O�`�y*YdV��
�~<�9lzk�|�m��KL�L�q���Ss���pV�A����3�����i�He��(R�<�Э�n��Qo�5�r�=R��0v$������C���$����0��we���#ݛ��7nz
�5����+����7U�8~�;:����������9�H�}?�!�
N������r�*ypd�e��ϓ�)��Ts�x.L��uܩKP�;�h~ _���uY`�������{���`��EFy�LU���^p��W��L���,N9V�圫y��+2������H�t�E������hx&����ڃl�fp�ǻ������O�쮵��`5�M`��J��1��C|9���0���k�|�4����֏='j���ΐ�@js8l#XV���~v��ª���9�i��b/:�e�)���Ѿ��yax^~�����XM�}���5/hI�]��:�j@̸v�)}����M��z�l�_�FǿX~+�]�t�,FC��Mg��V��u_�ᅽ�K�@�W�d���uM�X�[i��Oι\����ߚ筂��K��{���������'Ԓ�xd(x���n<+���O�ֳ6�j!�X*��exI0�tx/++�S�ƹ�1Y���e���z0�xk���0FQϮ�l?=�|i�(a'T��1fa16��T�p<6�>�����Ϭ@)~k��v��Q]�d����;��^T�F�T�, �̜fk���.�]������ik����D]�v�s���k���=bE�4v�e��z�Z5��!��tO��|}}�衴jRB�P�M�‚cqf�~��T
�ٻ����h��a|�iT�`�Yl�E"���I0��a�Mh�KK�+�IEND�B`�PK�X�G��dunyahalleri.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""www.dunyahalleri.com"""
import locale
import os
import re

from shutil import copyfile

from calibre import strftime
from calibre.ebooks.BeautifulSoup import Tag
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.utils.resources import get_path
from PIL import Image, ImageDraw, ImageFont

__license__ = 'GPL v3'
__copyright__ = '2017, sukru alatas / alatas.org'


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class DunyaHalleri(BasicNewsRecipe):
    title = 'Dünya Halleri'
    description = 'Gözden Kaçanlar Rehberi'
    timefmt = ' [%a, %d %b, %Y]'
    publication_type = 'blog'
    language = 'tr'
    locale = 'tr_TR'  # for localized month names
    simultaneous_downloads = 5

    needs_subscription = False
    scale_news_images = True

    remove_tags_before = dict(name='span', attrs={'itemprop': 'reviewBody'})
    remove_tags_after = dict(
        name='div', attrs={'class': 'sharedaddy sd-sharing-enabled'})
    remove_tags = [dict(name=['script', 'noscript', 'style', 'footer']),
                   dict(attrs={'class': ['jsharedaddy sd-sharing-enabled',
                                         'cb-sticky-sidebar', 'sharedaddy sd-sharing-enabled']}),
                   dict(id=['jp-relatedposts', 'tldr-post-summary', 'tldr-post-summary-buttons'])]
    encoding = 'utf_8'
    no_stylesheets = True

    extra_css = '.caption {color: #998; font-style: italic; font-size: 8pt}'
    __author__ = 'Sukru Alatas'
    feeds = [(u"Genel Gündem",
              'https://www.dunyahalleri.com/genel-gundem/feed/'),
             (u"Teknoloji / Bilim",
              'https://www.dunyahalleri.com/teknoloji-bilim/feed/'),
             (u"İnternet / Girişimler",
              'https://www.dunyahalleri.com/internet-girisimler/feed/'),
             (u"Tasarım / İnovasyon",
              'https://www.dunyahalleri.com/tasarim-inovasyon/feed/'),
             (u"Kültür / Sanat", 'https://www.dunyahalleri.com/kultur-sanat/feed/')]
    oldest_article = 7
    max_articles_per_feed = 50

    COVER_WIDTH, COVER_HEIGHT = 590, 750
    masthead_url = 'https://www.dunyahalleri.com/wp-content/uploads/2016/07/dh-logo-transparan.png'
    cover_url = ''
    cover_img_url = 'https://i0.wp.com/www.dunyahalleri.com/wp-content/uploads/2016/04/dh-favico-v2.png'
    cover_img_path = ''

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        # for localized month names
        locale.setlocale(locale.LC_TIME, self.locale)

        if self.output_profile.short_name.startswith('kindle'):
            # Reduce image sizes to get file size below amazon's email
            # sending threshold
            self.web2disk_options.compress_news_images = True
            self.web2disk_options.compress_news_images_auto_size = 5
            self.log.warn(
                'Kindle Output profile being used, reducing image quality '
                'to keep file size below amazon email threshold')

    def preprocess_html(self, soup):
        span = soup.findAll('span', {'itemprop': 'reviewBody'}, limit=1)[0]

        # title insert
        article_title = soup.title.contents[0]
        article_title.replace(u' - Dünya Halleri', '')
        h2 = new_tag(soup, 'h2')
        h2.append(article_title)
        span.insert(0, h2)

        # featured image insert
        meta = soup.findAll('meta', {'property': 'og:image'}, limit=1)[0]
        if meta:
            img = new_tag(soup, 'img')
            img.attrs = [('src', meta['content'])]
            span.insert(1, img)

        # gallery normalization
        for div in soup.findAll('div', {'itemtype': 'http://schema.org/ImageGallery'}):
            p = new_tag(soup, 'p')
            for img in div.findAll('img'):
                img.attrs = [(key, value)
                             for key, value in img.attrs if key in ['src']]
                p.append(img)
            div.replaceWith(p)

        # youtube embedded normalization
        # this block finds the cover image for each embedded youtube video then
        # changes it to "a href" and "img"
        for iframe in soup.findAll('iframe'):
            a = new_tag(soup, 'a')
            caption = new_tag(soup, 'pre')
            img = new_tag(soup, 'img')

            m = re.match(
                r'https\:\/\/(www\.)?youtube.com\/(embed\/|watch\?v\=)'
                r'(?P<vid>.*?)(([\?\&].*)|$|\n)',
                iframe['src'])
            if m:
                # youtube
                img_src = 'https://img.youtube.com/vi/' + \
                    m.group('vid') + '/0.jpg'
                a_href = 'https://www.youtube.com/watch?v=' + m.group('vid')
            else:
                # not youtube
                # default cover image for non-youtube embedded pages
                img_src = 'http://www.warnerclassics.com/img_style/default_video_m.jpg'
                a_href = iframe['src']

            img.attrs = [('src', img_src)]
            caption.append('Video: ' + a_href)
            caption.attrs = [('class', 'caption')]
            a.attrs = [('href', a_href), ('target', '_blank')]
            a.append(img)
            a.append(caption)
            iframe.replaceWith(a)
        return soup

    # cover generator
    # original version
    # https://www.mobileread.com/forums/showpost.php?p=866553&postcount=5
    def get_cover_img_url(self):
        return getattr(self, 'cover_img_url', None)

    def _download_cover_img(self):
        old_cu = None
        try:
            old_cu = self.get_cover_url()
        except:
            pass
        new_cu = self.get_cover_img_url()
        self.cover_url = new_cu
        self._download_cover()

        outfile = os.path.join(self.output_dir, 'cover_img.jpg')
        copyfile(self.cover_path, outfile)
        self.cover_url = old_cu
        self.cover_img_path = outfile

    def download_cover_img(self):
        try:
            self._download_cover_img()
            self.report_progress(
                1, ('Downloaded cover to %s') % self.cover_img_path)
        except:
            self.log.exception('Failed to download cover img')
            self.cover_img_path = None

    def draw_text(self, draw, text, text_size, top):
        font_path = get_path('fonts/liberation/LiberationSerif-Bold.ttf')
        font = ImageFont.truetype(font_path, text_size)
        width, height = draw.textsize(text, font=font)
        left = max(int((self.COVER_WIDTH - width) / 2.), 0)
        draw.text((left, top), text, fill=(0, 0, 0), font=font)
        return height

    def default_cover(self, cover_file):
        title = self.title
        date = strftime('%d %B %Y')
        author = u'www.dunyahalleri.com'
        # Texts
        img = Image.new(
            'RGB', (self.COVER_WIDTH, self.COVER_HEIGHT), 'white')
        draw = ImageDraw.Draw(img)
        bottom = 15
        bottom += self.draw_text(draw, title, 42, bottom)
        bottom += 50
        bottom += self.draw_text(draw, date, 32, bottom)
        bottom += self.draw_text(draw, author, 32, self.COVER_HEIGHT - 45)
        # Logo
        self.download_cover_img()
        if getattr(self, 'cover_img_path', None) is not None:
            logo_file = self.cover_img_path
            self.report_progress(
                1, ('using cover img from %s') % logo_file)
            logo = Image.open(logo_file, 'r')
            width, height = logo.size
            left = max(int((self.COVER_WIDTH - width) / 2.), 0)
            top = max(int((self.COVER_HEIGHT - height) / 2.), 0)
            img.paste(logo, (left, top))
        img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE)
        img.convert('RGB').save(cover_file, 'JPEG')
        cover_file.flush()
        return True
PK�X���I�	�	dunyahalleri_haftaninozeti.png�PNG


IHDR  ��tRNSn��	8IDATxڕ�LZm��"1!11�i�!��@��@�t��]]�tu/������V˼l�hѺG]���-r��A����=X�wϣ�3~��������~��w �'���$���~�/�q^��2oo�?��C�tqpa�����L�m�6Gl#��x
��������"�h=�r�U�;�Rj	5���
��H7l��2�qB%�����}V�����V�b���S�y��	���*r��t��22�������g,��g�N,���4���Ϲ��#��o����Z?�=?��n�}��e>y�b]beX���8j����ӆ�S��/�M����1|�		�V����G�CJ�6�8u�\Ϛ��m?�]�CC8�y�
�	��S�
YUk�R����c�M�Jf���Z6_��/B��#a�]����UO��L>o��<[j��MAR��Ɂ����*H�y8����t8�,2$|���/�΂y��%�,��đ���Jg�,�K��d�N�#�a5=[��b�]�B��H�\�������q1�tX�l߹��[����<����Έ7�lD���`�3�[�ʆ���%B2�I��fVu~s�)x�~k�so����@9J��s�3�x��
�6�B�٭G[��5�36L�l~.��F	f�-[ї={�a����2C�E�x��!d��{uܩ��\�_s�P�q@���N��:�ׯ@)�'g����|ˇE3oK�N"�E��a�W[�G��t����Ư�o�%)��g�l��������AN��gE�<�|*3rr�X�Y�)m��s��+w79���
�	db��c��إpbqo�q��M����lq�4
��#!
Ec��<��2��M;�F!����i���ު��<�����,2��yrh�r�|���n�FxiB�3�ע[��-7k�9s�֐S� <n-p�5>��<�<$��d(���7�'�O�.:3�-��w��XT��׸r1��@�-��ʑ� ����C�I���y���/a�ǖ���D"ѣ"J0A0���@�"#���|����*	�Gd7�b�֝V����KS+�}]|9Y:vCS�B
�c��/�
�B�=�ڞ��/�n����n���$
��iwm�ӕ�2,�8�sYqY���-��*:���[�3���ހ��wo:�K�36�x$"��v���������m\��Բހ�j̮�Z��U��bU?�W�2�۾?�O�~�ze��@;���z#G�`yܜl:^��g��8��j��?~�n($���'N�F�v�������a�Y�4$(�dȯ?�.���#�Q�m�s�������d�$���w����Cz��'$� 
���۶����<�c�T��vJZ�{D3Z�����ɑ�{�Jb�O�����*�![����3�w���W���
z���^O�`�y*YdV��
�~<�9lzk�|�m��KL�L�q���Ss���pV�A����3�����i�He��(R�<�Э�n��Qo�5�r�=R��0v$������C���$����0��we���#ݛ��7nz
�5����+����7U�8~�;:����������9�H�}?�!�
N������r�*ypd�e��ϓ�)��Ts�x.L��uܩKP�;�h~ _���uY`�������{���`��EFy�LU���^p��W��L���,N9V�圫y��+2������H�t�E������hx&����ڃl�fp�ǻ������O�쮵��`5�M`��J��1��C|9���0���k�|�4����֏='j���ΐ�@js8l#XV���~v��ª���9�i��b/:�e�)���Ѿ��yax^~�����XM�}���5/hI�]��:�j@̸v�)}����M��z�l�_�FǿX~+�]�t�,FC��Mg��V��u_�ᅽ�K�@�W�d���uM�X�[i��Oι\����ߚ筂��K��{���������'Ԓ�xd(x���n<+���O�ֳ6�j!�X*��exI0�tx/++�S�ƹ�1Y���e���z0�xk���0FQϮ�l?=�|i�(a'T��1fa16��T�p<6�>�����Ϭ@)~k��v��Q]�d����;��^T�F�T�, �̜fk���.�]������ik����D]�v�s���k���=bE�4v�e��z�Z5��!��tO��|}}�衴jRB�P�M�‚cqf�~��T
�ٻ����h��a|�iT�`�Yl�E"���I0��a�Mh�KK�+�IEND�B`�PK�XFd�)�(�(!dunyahalleri_haftaninozeti.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""www.dunyahalleri.com/haftanin-ozeti"""
import locale
import os
import re

from shutil import copyfile

from contextlib import closing
from calibre.ebooks.BeautifulSoup import BeautifulSoup, BeautifulStoneSoup, Tag
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.utils.resources import get_path
from PIL import Image, ImageDraw, ImageFont

__license__ = 'GPL v3'
__copyright__ = '2017, sukru alatas / alatas.org'


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class DunyaHalleri_HaftaninOzeti(BasicNewsRecipe):
    title = 'Dünya Halleri - Haftanın Özeti'
    description = ('Geçen hafta boyunca Türkiye ve dünyadan haber,'
                   ' site, yazılım, donanım, cihaz, video ve trendler...')
    timefmt = ' [%a, %d %b, %Y]'
    publication_type = 'blog'
    language = 'tr'
    locale = 'tr_TR'  # for localized month names
    simultaneous_downloads = 5

    needs_subscription = False
    scale_news_images = True

    remove_tags_before = dict(name='section', attrs={'itemprop': 'articleBody'})
    remove_tags_after = dict(name='div', attrs={'class': 'cb-alert cb-blue'})
    remove_tags = [dict(name=['ol', 'h4', 'script', 'noscript', 'style', 'footer']),
                   dict(name='h1', attrs={
                       'class': 'entry-title cb-entry-title entry-title cb-title'}),
                   dict(attrs={'class': ['cb-alert cb-blue', 'woo-sc-box  info   ',
                                         'sharedaddy sd-sharing-enabled', 'jp-relatedposts']}),
                   dict(id=['post-pagination', 'plp_inital_pagination'])]
    encoding = 'utf_8'
    no_stylesheets = True
    INDEX = 'https://www.dunyahalleri.com/haftanin-ozeti/feed/'
    extra_css = '.caption {color: #998; font-style: italic; font-size: 8pt}'
    __author__ = 'Sukru Alatas'

    COVER_WIDTH, COVER_HEIGHT = 590, 750
    issue_title = ''
    issue_date = ''
    masthead_url = ''
    cover_url = ''
    cover_img_url = ''
    cover_img_path = ''

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        # for localized month names
        locale.setlocale(locale.LC_TIME, self.locale)

        if self.output_profile.short_name.startswith('kindle'):
            # Reduce image sizes to get file size below amazon's email
            # sending threshold
            self.web2disk_options.compress_news_images = True
            self.web2disk_options.compress_news_images_auto_size = 5
            self.log.warn(
                'Kindle Output profile being used, reducing image quality '
                'to keep file size below amazon email threshold')

    # BeautifulSoup xml parser extension
    # If you use index_to_soup with xml or rss, it outputs lots of garbage node,
    #   and change the tree for its own.
    # This function very very similar copy of index_to_soup but it uses
    # BeautifulStoneSoup instead of BeautifulSoup
    def xml_to_soup(self, url_or_raw, raw=False):
        if re.match(r'\w+://', url_or_raw):
            br = self.clone_browser(self.browser)
            open_func = getattr(br, 'open_novisit', br.open)
            with closing(open_func(url_or_raw)) as f:
                _raw = f.read()
            if not _raw:
                raise RuntimeError(
                    'Could not fetch index from %s' % url_or_raw)
        else:
            _raw = url_or_raw

        if raw:
            return _raw

        if not isinstance(_raw, type(u'')) and self.encoding:
            if callable(self.encoding):
                _raw = self.encoding(_raw)
            else:
                _raw = _raw.decode(self.encoding, 'replace')

        from calibre.ebooks.chardet import strip_encoding_declarations, xml_to_unicode
        from calibre.utils.cleantext import clean_xml_chars

        if isinstance(_raw, type(u'')):
            _raw = strip_encoding_declarations(_raw)
        else:
            _raw = xml_to_unicode(
                _raw, strip_encoding_pats=True, resolve_entities=True)[0]

        _raw = clean_xml_chars(_raw)
        return BeautifulStoneSoup(_raw)  # <== the difference

    def parse_index(self):
        from dateutil.parser import parse

        # RSS parsing
        index = self.xml_to_soup(self.INDEX)

        channel = index.rss.channel

        self.description = channel.description.contents[0]
        self.masthead_url = channel.url.contents[0]

        item = channel.item
        self.issue_title = item.title.contents[0]
        self.issue_date = parse(item.pubdate.contents[0])

        base_url = item.link.contents[0]
        cover_img_desc = BeautifulSoup(item.description.contents[0])
        # this is necessary for cover generator
        self.cover_img_url = cover_img_desc.img['src']

        soup = self.index_to_soup(base_url)
        articles = {}
        key = None
        ans = []

        for li in soup.findNext('ol').findAll('li'):
            a = li.find('a', href=True)

            if not a:
                url = base_url
                feed = self.tag_to_string(li, use_alt=True).strip()
                pubdate = self.issue_date.strftime('%a, %d %b')
            else:
                url = base_url + re.sub(r'\.\/', '', a['href'])
                feed = self.tag_to_string(a, use_alt=True).strip()
                pubdate = self.issue_date.strftime('%a, %d %b')

            title = self.issue_title + \
                ' (' + self.issue_date.strftime('%d %B %Y') + ')'

            if feed not in articles:
                articles[feed] = []
                ans.append(feed)

            articles[feed].append(
                dict(title=title, url=url, date=pubdate, description='', content=''))

        ans = [(key, articles[k]) for k in ans if k in articles]
        return ans

    def preprocess_html(self, soup):
        # gallery normalization
        for div in soup.findAll('div', {'itemtype': 'http://schema.org/ImageGallery'}):
            p = new_tag(soup, 'p')
            for img in div.findAll('img'):
                img.attrs = [(key, value)
                             for key, value in img.attrs if key in ['src']]
                p.append(img)
            div.replaceWith(p)

        # youtube embedded normalization
        # this block finds the cover image for each embedded youtube video then
        # changes it to "a href" and "img"
        for iframe in soup.findAll('iframe'):
            a = new_tag(soup, 'a')
            caption = new_tag(soup, 'pre')
            img = new_tag(soup, 'img')

            m = re.match(
                r'https\:\/\/(www\.)?youtube.com\/(embed\/|watch\?v\=)'
                r'(?P<vid>.*?)(([\?\&].*)|$|\n)',
                iframe['src'])
            if m:
                # youtube
                img_src = 'https://img.youtube.com/vi/' + \
                    m.group('vid') + '/0.jpg'
                a_href = 'https://www.youtube.com/watch?v=' + m.group('vid')
            else:
                # not youtube
                # default cover image for non-youtube embedded pages
                img_src = 'http://www.warnerclassics.com/img_style/default_video_m.jpg'
                a_href = iframe['src']

            img.attrs = [('src', img_src)]
            caption.append('Video: ' + a_href)
            caption.attrs = [('class', 'caption')]
            a.attrs = [('href', a_href), ('target', '_blank')]
            a.append(img)
            a.append(caption)
            iframe.replaceWith(a)
        return soup

    # cover generator
    # original version https://www.mobileread.com/forums/showpost.php?p=866553&postcount=5
    def get_cover_img_url(self):
        return getattr(self, 'cover_img_url', None)

    def _download_cover_img(self):
        old_cu = None
        try:
            old_cu = self.get_cover_url()
        except:
            pass
        new_cu = self.get_cover_img_url()
        self.cover_url = new_cu
        self._download_cover()

        outfile = os.path.join(self.output_dir, 'cover_img.jpg')
        copyfile(self.cover_path, outfile)
        self.cover_url = old_cu
        self.cover_img_path = outfile

    def download_cover_img(self):
        try:
            self._download_cover_img()
            self.report_progress(
                1, ('Downloaded cover to %s') % self.cover_img_path)
        except:
            self.log.exception('Failed to download cover img')
            self.cover_img_path = None

    def draw_text(self, draw, text, text_size, top):
        font_path = get_path('fonts/liberation/LiberationSerif-Bold.ttf')
        font = ImageFont.truetype(font_path, text_size)
        width, height = draw.textsize(text, font=font)
        left = max(int((self.COVER_WIDTH - width) / 2.), 0)
        draw.text((left, top), text, fill=(0, 0, 0), font=font)
        return height

    def default_cover(self, cover_file):
        title = self.issue_title
        date = self.issue_date.strftime(
            '%d %B %Y').decode('utf8', 'replace')
        author = u'www.dunyahalleri.com/haftanin-ozeti'
        # Texts
        img = Image.new(
            'RGB', (self.COVER_WIDTH, self.COVER_HEIGHT), 'white')
        draw = ImageDraw.Draw(img)
        bottom = 15
        bottom += self.draw_text(draw, title, 42, bottom)
        bottom += 50
        bottom += self.draw_text(draw, date, 32, bottom)
        bottom += self.draw_text(draw, author, 32, self.COVER_HEIGHT - 45)
        # Logo
        self.download_cover_img()
        if getattr(self, 'cover_img_path', None) is not None:
            logo_file = self.cover_img_path
            self.report_progress(
                1, ('using cover img from %s') % logo_file)
            logo = Image.open(logo_file, 'r')
            width, height = logo.size
            logo = logo.resize(
                (self.COVER_WIDTH, (self.COVER_WIDTH * height / width)), Image.Resampling.LANCZOS)
            width, height = logo.size
            left = max(int((self.COVER_WIDTH - width) / 2.), 0)
            top = max(int((self.COVER_HEIGHT - height) / 2.), 0)
            img.paste(logo, (left, top))
        img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE)
        img.convert('RGB').save(cover_file, 'JPEG')
        cover_file.flush()
        return True
PK�X�7Ŵ�dvhn.png�PNG


IHDR  ��tRNSn��	pHYs��TIDATH��T]H�Q>W�� �!�ED]$Qt�M7��"�m�Ӵ�$�
E�(�4�A��l�}���Y�͟�IZ��TV��N]�i��Ϝ�=�t�.�+�����y�y�y�H�)�_uuu�oHUl|�O��0JTf�8C�J@���sx��
i'�*��ȉ���D��4�%�F�*��*�2�T
�J7f����$؛ao�X�ksz��&���е��o:�L+/s�]�U� e�*�����{����VQJSFE���T�+:�W��?szeto��n��{�����Ѷ��G|kw��woAp0��8�h[^�Jp
j�9K{�$� ɚ���F�Q��0�RSark��8���ƚǞ��8F��4؇�X^EL;���������0v�@�;� g��"I��p��Cd�S��1���_�<�O�>�`���A���_�*˞���0w�1����}�$���Čvai�2ݘ�ǭs����`���Ֆ!rP��b'T�z�楕��U�R0��w�J������@p޿�_���WC��6����/��
�u��DC9؞׌Jx1���G�9�B��������?��i���[,=�8��*�(Q�ʉL�o.���!B��Ej�`D��B�3]n�3Hrb��~��v��E�CE�-Y���߁��I��2G;p�y[npֽڕo�e�dq�qg����0��-1�&q���Bk��9\�
�l�S��g�ٽ���8���8��水wP�)���2���g��8�D-�8%OF���
��І:�
�(	���mT�m�A��a���_FEt\GD��~�l���]�IEND�B`�PK�Xҧ�dvhn.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1302341394(BasicNewsRecipe):
    title = u'DvhN'
    __author__ = 'Reijndert'
    oldest_article = 7
    max_articles_per_feed = 200

    no_stylesheets = True
    cover_url = 'http://members.home.nl/apm.de.haas/calibre/DvhN.jpg'
    language = 'nl'
    country = 'NL'
    version = 1
    publisher = u'Dagblad van het Noorden'
    category = u'Nieuws'
    description = u'Nieuws uit Noord Nederland'
    timefmt = ' %Y-%m-%d (%a)'

    keep_only_tags = [dict(name='div', attrs={'id': 'fullPicture'}), dict(name='div', attrs={'id': 'articleText'})
                      ]

    remove_tags = [
        dict(name='span', attrs={'class': 'location'})
    ]

    preprocess_regexps = [
        (re.compile(r'<a.*?>'), lambda h1: ''), (re.compile(r'</a>'), lambda h2: ''), (re.compile(r'Word vriend van Dagblad van het Noorden op Facebook'),
                                                                                       lambda h3: ''), (re.compile(r'Volg Dagblad van het Noorden op Twitter'), lambda h3: '')  # noqa
    ]

    feeds = [
    (u'Drenthe', u'http://www.dvhn.nl/nieuws/drenthe/index.jsp?service=rss'),
    (u'Groningen', u'http://www.dvhn.nl/nieuws/groningen/index.jsp?service=rss'),
    (u'Nederland', u'http://www.dvhn.nl/nieuws/nederland/index.jsp?service=rss'),
    (u'Wereld', u'http://www.dvhn.nl/nieuws/wereld/index.jsp?service=rss'),
    (u'Economie', u'http://www.dvhn.nl/nieuws/economie/index.jsp?service=rss'),
    (u'Sport', u'http://www.dvhn.nl/nieuws/sport/index.jsp?service=rss'),
    (u'Cultuur', u'http://www.dvhn.nl/nieuws/kunst/index.jsp?service=rss'),
    (u'24 Uur', u'http://www.dvhn.nl/nieuws/24uurdvhn/index.jsp?service=rss&selectiontype=last24hours')
             ]

    extra_css = '''
                body {font-family: verdana, arial, helvetica, geneva, sans-serif;}
                '''
PK�X�(�ccdwutygodnik.png�PNG


IHDR��h6*IDATx�c�O" W��֭Y�h�����w��ͫV�DCkV���3H��3ǧM���H]Eu�̙&�F@6&:v�(ï_�l-��K3sWW CUQ�������6�7�� ?o�[�n1�?w(�������c��#����6 �����n�turN�Or���T��ڊS2g҄�@E*
�/\ħb6�T��zz�"�4��󧺢����
������
�K�M�
ŧ��ݻ@�@9=-��ЈP*�/�����db`��I;��7gs�ϝA;�m�z��iӁ�Dy�#��"+x���IEND�B`�PK�X'�9���dwutygodnik.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'Łukasz Grąbczewski 2011'
__version__ = '2.0'

import re
import os
from calibre import walk
from calibre.utils.zipfile import ZipFile
from calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe


class dwutygodnik(BasicNewsRecipe):
    __author__ = u'Łukasz Grąbczewski'
    title = 'Dwutygodnik'
    language = 'pl'
    publisher = 'Narodowy Instytut Audiowizualny'
    publication_type = 'magazine'
    description = u'Strona Kultury: literatura, teatr, film, sztuka, muzyka, felietony, rozmowy'

    conversion_options = {
        'authors': 'Dwutygodnik.com', 'publisher': publisher, 'language':
        language, 'comments': description, 'no_default_epub_cover': True,
        'preserve_cover_aspect_ratio': True
    }

    def build_index(self):
        browser = self.get_browser()
        browser.open('http://www.dwutygodnik.com/')

        # find the link
        epublink = browser.find_link(text_regex=re.compile('Wydanie EPUB'))

        # download ebook
        self.report_progress(0, _('Downloading ePUB'))
        response = browser.follow_link(epublink)
        book_file = PersistentTemporaryFile(suffix='.epub')
        book_file.write(response.read())
        book_file.close()

        # convert
        self.report_progress(0.2, _('Converting to OEB'))
        oeb = self.output_dir + '/INPUT/'
        if not os.path.exists(oeb):
            os.makedirs(oeb)
        with ZipFile(book_file.name) as f:
            f.extractall(path=oeb)

        for f in walk(oeb):
            if f.endswith('.opf'):
                return f
PK�X�8�t..
dzieje_pl.png�PNG


IHDR�a�IDATxڍ�C�A���m۶mc�b[�,c'�ضm��fa�ߴ�'�k����m�U�4M�;�j~O�A?{vJ��i��[xgO���Ie�v��_�۶�8,��q
�kY���}��u5r�m�f�A]Pذ<D�����5;.r��*��Ua�����4�?޹T��]��¤@b1�X��`�k���֊ro^
�S#u�]�P�8�E��<3�|k�wnִ2x�)�:D�����Ayh��¡�\3_>����K��Av��z���S��a<�8\�޽�7  �q�T�����Kȱ�	P*@�(�V�S8���|x��Eз=�;�_D�̉jT��X���>���R�n��U��z�������#uA�B05���L5R����Y�6�c��3H�K��Ou��:�9e4u�x�T�𭚗oDz��,��z�̷/�������(PW+�K-�(;59�f�-�x�j���CHN��IEND�B`�PK�Xۤ`�dzieje_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment


class Dzieje(BasicNewsRecipe):
    title = u'dzieje.pl'
    __author__ = 'fenuks'
    description = 'Dzieje.pl - najlepszy portal informacyjno-edukacyjny dotyczący historii Polski XX wieku. Archiwalne fotografie, filmy, katalog postaci, quizy i konkursy.'  # noqa
    cover_url = 'http://www.dzieje.pl/sites/default/files/dzieje_logo.png'
    category = 'history'
    language = 'pl'
    ignore_duplicate_articles = {'title', 'url'}
    extra_css = '.imagecache-default {float:left; margin-right:20px;}'
    index = 'http://dzieje.pl'
    oldest_article = 8
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'title'}), dict(id='content-area')]
    remove_tags = [dict(attrs={'class': 'field field-type-computed field-field-tagi'}),
                   dict(id='dogory'), dict(name='blockquote')]

    def append_page(self, soup, appendtag):
        tag = appendtag.find('li', attrs={'class': 'pager-next'})
        if tag:
            while tag:
                url = tag.a['href']
                if not url.startswith('http'):
                    url = 'http://dzieje.pl' + tag.a['href']
                soup2 = self.index_to_soup(url)
                pagetext = soup2.find(
                    id='content-area').find(attrs={'class': 'content'})
                for r in pagetext.findAll(attrs={'class': ['fieldgroup group-groupkul', 'fieldgroup group-zdjeciekult', 'fieldgroup group-zdjecieciekaw', 'fieldgroup group-zdjecieksiazka', 'fieldgroup group-zdjeciedu', 'field field-type-filefield field-field-zdjecieglownawyd']}):  # noqa
                    r.extract()
                comments = pagetext.findAll(
                    text=lambda text: isinstance(text, Comment))
                # appendtag.insert(pos, pagetext)
                tag = soup2.find('li', attrs={'class': 'pager-next'})
            for r in appendtag.findAll(attrs={'class': ['item-list', 'field field-type-computed field-field-tagi', ]}):
                r.extract()
            comments = appendtag.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()

    def find_articles(self, url):
        articles = []
        soup = self.index_to_soup(url)
        tag = soup.find(id='content-area').div.div
        for i in tag.findAll('div', recursive=False):
            temp = i.find(attrs={'class': 'views-field-title'}).span.a
            title = temp.string
            url = self.index + temp['href']
            # i.find(attrs={'class':'views-field-created'}).span.string
            date = ''
            articles.append({'title': title,
                             'url': url,
                             'date': date,
                             'description': ''
                             })
        return articles

    def parse_index(self):
        feeds = []
        feeds.append((u"Wiadomości", self.find_articles(
            'http://dzieje.pl/wiadomosci')))
        feeds.append((u"Kultura i sztuka", self.find_articles(
            'http://dzieje.pl/kulturaisztuka')))
        feeds.append((u"Film", self.find_articles('http://dzieje.pl/kino')))
        feeds.append((u"Rozmaitości historyczne",
                      self.find_articles('http://dzieje.pl/rozmaitości')))
        feeds.append(
            (u"Książka", self.find_articles('http://dzieje.pl/ksiazka')))
        feeds.append(
            (u"Wystawa", self.find_articles('http://dzieje.pl/wystawa')))
        feeds.append((u"Edukacja", self.find_articles(
            'http://dzieje.pl/edukacja')))
        feeds.append((u"Dzieje się", self.find_articles(
            'http://dzieje.pl/wydarzenia')))
        return feeds

    def preprocess_html(self, soup):
        for a in soup('a', href=True):
            if not a['href'].startswith('http'):
                a['href'] = self.index + a['href']
        self.append_page(soup, soup.body)
        return soup
PK�XwR���dziennik_baltycki.png�PNG


IHDR��h6�IDATx���NSq�s�����b0,4!$�E�7uup�	|��Gpuus2Ƹ� F��MH�������-F'��,K\��.��0c���D�� #�
�@�N\@F��S�ÓY�j��k�l���N{seވ��]�"�ʭr��(�'�^�v��F��Ƶ��;���aJ�p|��ί��O������17!�����[��vn�~��N�<�X_n&�ݥ���C#�L��Gg�>E+Tמjw�P�.@2Za�FFf\2�����ݫ��e|xkicy�?���?X��B�IԵO�q�s	/�m������ׇg�����^7W�G��{ߒ1��3���Fݟ��޸
�/5�4��C��w$@����CF�
+��
I�������	#����qA�!\�o������IEND�B`�PK�X0��eedziennik_baltycki.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class DziennikBaltycki(BasicNewsRecipe):
    title = u'Dziennik Ba\u0142tycki'
    __author__ = 'fenuks'
    description = u'Gazeta Regionalna Dziennik Bałtycki. Najnowsze Wiadomości Trójmiasto i Wiadomości Pomorskie. Czytaj!'
    category = 'newspaper'
    language = 'pl'
    masthead_url = 'http://s.polskatimes.pl/g/logo_naglowek/dziennikbaltycki.png?24'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}
    keep_only_tags = [dict(name='section', attrs={'class': 'zajawka'}),
        dict(name='section', attrs={'id': 'tresc'})
]
    remove_tags = [dict(name='div', attrs={'class':['materialyZKategorii','materialyPodobne']}), dict(name='a', attrs={
        'class': 'czytajDalej'}), dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})]

    feeds = [
    (u'Wiadomo\u015bci', u'http://www.dziennikbaltycki.pl/rss/dziennikbaltycki_wiadomosci.xml?201302'),
    (u'Sport', u'http://dziennikbaltycki.feedsportal.com/c/32980/f/533756/index.rss?201302'),
    (u'Rejsy', u'http://www.dziennikbaltycki.pl/rss/dziennikbaltycki_rejsy.xml?201302'),
    (u'Biznes na Pomorzu', u'http://www.dziennikbaltycki.pl/rss/dziennikbaltycki_biznesnapomorzu.xml?201302'),
    (u'GOM', u'http://www.dziennikbaltycki.pl/rss/dziennikbaltycki_gom.xml?201302'),
    (u'Opinie', u'http://www.dziennikbaltycki.pl/rss/dziennikbaltycki_opinie.xml?201302'),
    (u'Pitawal Pomorski', u'http://www.dziennikbaltycki.pl/rss/dziennikbaltycki_pitawalpomorski.xml?201302')]

    def print_version(self, url):
        return url.replace('artykul', 'drukuj')

    def skip_ad_pages(self, soup):
        if 'Advertisement' in soup.title:
            nexturl = soup.find('a')['href']
            return self.index_to_soup(nexturl, raw=True)

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.prasa24.pl/gazeta/dziennik-baltycki/')
        self.cover_url = soup.find(id='pojemnik').img['src']
        return getattr(self, 'cover_url', self.cover_url)
PK�X�1�dziennik_lodzki.png�PNG


IHDR��h6�IDATx�c�}vI��?р,
_�0я�iǮ�T'��o]z?F|�d���N�N�HUCEO̅�,�A���i� "X�Tmom�k�Ώ?����@?D�Ȍb�C]= :q�8a
s*� �͝����G[z�k�Xꁨp��32��h���u5@
>�^@���5�+Ļ��j�jdԀ=���D�`d������8Ĥoe�IEND�B`�PK�X?U]��	�	dziennik_lodzki.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class DziennikLodzki(BasicNewsRecipe):
    title = u'Dziennik \u0141\xf3dzki'
    __author__ = 'fenuks'
    description = u'Gazeta Regionalna Dziennik Łódzki. Najnowsze Wiadomości Łódź. Czytaj Wiadomości Łódzkie!'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    masthead_url = 'http://s.polskatimes.pl/g/logo_naglowek/dzienniklodzki.png?24'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}
    remove_tags_after = dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})
    remove_tags = [dict(id='mat-podobne'), dict(name='a', attrs={'class': 'czytajDalej'}), dict(attrs={
        'src': 'http://nm.dz.com.pl/dz.png'}), dict(name='a', attrs={'href': 'http://www.dzienniklodzki.pl/piano'})]

    feeds = [
    (u'Na sygnale', u'http://www.dzienniklodzki.pl/rss/dzienniklodzki_nasygnale.xml?201302'),
    (u'\u0141\xf3d\u017a', u'http://www.dzienniklodzki.pl/rss/dzienniklodzki_lodz.xml?201302'),
    (u'Opinie', u'http://www.dzienniklodzki.pl/rss/dzienniklodzki_opinie.xml?201302'),
    (u'Pieni\u0105dze', u'http://dzienniklodzki.feedsportal.com/c/32980/f/533763/index.rss?201302'),
    (u'Kultura', u'http://dzienniklodzki.feedsportal.com/c/32980/f/533762/index.rss?201302'),
    (u'Sport', u'http://dzienniklodzki.feedsportal.com/c/32980/f/533761/index.rss?201302'),
    (u'Akcje', u'http://www.dzienniklodzki.pl/rss/dzienniklodzki_akcje.xml?201302'),
    (u'M\xf3j Reporter', u'http://www.dzienniklodzki.pl/rss/dzienniklodzki_mojreporter.xml?201302'),
    (u'Studni\xf3wki', u'http://www.dzienniklodzki.pl/rss/dzienniklodzki_studniowki.xml?201302'),
    (u'Kraj', u'http://www.dzienniklodzki.pl/rss/dzienniklodzki_kraj.xml?201302'),
    (u'Zdrowie', u'http://www.dzienniklodzki.pl/rss/dzienniklodzki_zdrowie.xml?201302')]

    def print_version(self, url):
        return url.replace('artykul', 'drukuj')

    def skip_ad_pages(self, soup):
        if 'Advertisement' in soup.title:
            nexturl = soup.find('a')['href']
            return self.index_to_soup(nexturl, raw=True)

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.prasa24.pl/gazeta/dziennik-lodzki/')
        self.cover_url = soup.find(id='pojemnik').img['src']
        return getattr(self, 'cover_url', self.cover_url)
PK�X.�"?��dziennik_pl.png�PNG


IHDRb�xgIDATx5�KKTQ�9���3�kF�I�)[IA"䧈�M��B�l�n�4��S���q|���}ι�sο2���hD'J�Vа�;��m��N�(���S��+��ӵ㥚�A�s���<�Ҏ�Ԝ/ǾH%���*|[w��v�FWٚS�	%6��8H���F��։HP�9�գ�wS��*���G�j3��e��v�e��O�5;U�b�kNÍ�O��zx�����{~KH��'�$T�~b���zk�:��ֽT?�6r�R�/C_o[���p��T;q�*D��j;�	�:���BޔZ���b��eP2��v$�_�s�$K4i�������u?-�\"e��J�J�t��э��}'G��
�
�Ưm���-�g��h��5%d�?sy��7&�92FI1k�8=���ͭ� i��"�A)7�P��]/	E6kR���>�q"{9(5jD�G)�!X�J�V6�5M���,�nx�+L�g��g���@�Wn�U�\9�#������͓�b�L �N8��c]��u��ٙ+S�#�����(�z�eY�����|Y�+=Ɲ�����H�P"��T�B� �ԁ�Å|��˸I���<�&��IEND�B`�PK�XG�

dziennik_pl.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

from calibre.web.feeds.news import BasicNewsRecipe
import re
from calibre.ebooks.BeautifulSoup import Comment


class Dziennik_pl(BasicNewsRecipe):
    title = u'Dziennik.pl'
    __author__ = 'fenuks'
    description = u'Wiadomości z kraju i ze świata. Wiadomości gospodarcze. Znajdziesz u nas informacje, wydarzenia, komentarze, opinie.'
    category = 'newspaper'
    language = 'pl'
    masthead_url = 'http://5.s.dziennik.pl/images/logos.png'
    cover_url = 'http://5.s.dziennik.pl/images/logos.png'
    no_stylesheets = True
    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    extra_css = 'ul {list-style: none; padding: 0; margin: 0;} .foto {float: left;} .clr {clear: both;}'
    preprocess_regexps = [(re.compile("Komentarze:"), lambda m: ''), (re.compile(
        '<p><strong><a href=".*?">&gt;&gt;&gt; CZYTAJ TAKŻE: ".*?"</a></strong></p>'), lambda m: '')]
    keep_only_tags = [dict(id='article')]
    remove_tags = [dict(name='div', attrs={'class': ['art_box_dodatki', 'new_facebook_icons2', 'leftArt', 'article_print', 'quiz-widget', 'belka-spol', 'belka-spol belka-spol-bottom', 'art_data_tags', 'cl_right', 'boxRounded gal_inside']}), dict(name='a', attrs={'class': ['komentarz', 'article_icon_addcommnent']}), dict(name='ins'), dict(name='br')]  # noqa
    feeds = [(u'Wszystko', u'http://rss.dziennik.pl/Dziennik-PL/'),
             (u'Wiadomości', u'http://rss.dziennik.pl/Dziennik-Wiadomosci'),
             (u'Gospodarka', u'http://rss.dziennik.pl/Dziennik-Gospodarka'),
             (u'Kobieta', u'http://rss.dziennik.pl/Dziennik-Kobieta'),
             (u'Auto', u'http://rss.dziennik.pl/Dziennik-Auto'),
             (u'Rozrywka', u'http://rss.dziennik.pl/Dziennik-Rozrywka'),
             (u'Film', u'http://rss.dziennik.pl/Dziennik-Film'),
             (u'Muzyka', u'http://rss.dziennik.pl/Dziennik-Muzyka'),
             (u'Kultura', u'http://rss.dziennik.pl/Dziennik-Kultura'),
             (u'Nauka', u'http://rss.dziennik.pl/Dziennik-Nauka'),
             (u'Podróże', u'http://rss.dziennik.pl/Dziennik-Podroze/'),
             (u'Nieruchomości', u'http://rss.dziennik.pl/Dziennik-Nieruchomosci')]

    def skip_ad_pages(self, soup):
        tag = soup.find(name='a', attrs={'title': 'CZYTAJ DALEJ'})
        if tag:
            new_soup = self.index_to_soup(tag['href'], raw=True)
            return new_soup

    def append_page(self, soup, appendtag):
        tag = soup.find('a', attrs={'class': 'page_next'})
        if tag:
            appendtag.find(
                'div', attrs={'class': 'article_paginator'}).extract()
        while tag:
            soup2 = self.index_to_soup(tag['href'])
            tag = soup2.find('a', attrs={'class': 'page_next'})
            if not tag:
                for r in appendtag.findAll('div', attrs={'class': 'art_src'}):
                    r.extract()
            pagetext = soup2.find(name='div', attrs={'class': 'article_body'})
            for dictionary in self.remove_tags:
                v = pagetext.findAll(
                    name=dictionary['name'], attrs=dictionary['attrs'])
                for delete in v:
                    delete.extract()
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
            if appendtag.find('div', attrs={'class': 'article_paginator'}):
                appendtag.find(
                    'div', attrs={'class': 'article_paginator'}).extract()

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        return soup
PK�X�V�S��dziennik_polski.png�PNG


IHDR(-S�PLTE����żDG�AE�CD�B]�H`�Peܟ������,;�44�11�{{�9A�7?䅕�**ܡ��
������'������+�3�$>�*8���		��((�''�%%�""�  �������""�����������""�%/�16�;<�9B�DD�FF�CT�DS�DM�

�����!�Xn�Zj�]d�fh�fu�nx�r|�rt�pr�k~�q��}}�"�ww�qt�cf�bb�Z\�@G�;A�
!�(�'Ђ�ڃ�ၓ�&犘⑑䔔锘ꖗ햝ꐛ䙙朜��'ݡ�ࡥ蠮흧����)����������$����/�5�/��������1h>��tRNS@��f�IDATx^E��vAЪcmĶm۶m���\`�<�Q�x��~��S�ڼ(=]��S|keȞ|"_'\��+�9#'�|q<��(o�JЫ���	�{���(F��QKs��d��E�QU��w�r'v��B��2�V.�0h��^Q��oq�d�z 
�Di�w/���<4�\Ѣ��L�4;\4u���޴��m������~�ۆ���8�hvt��a/��`T�IEND�B`�PK�X3�f���dziennik_polski.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__author__ = 'grzegorz.maj@dziennik.krakow.pl>'

'''
http://dziennikpolski24.pl
Author: grzegorz.maj@dziennik.krakow.pl
'''
from calibre.web.feeds.news import BasicNewsRecipe


class DziennikPolski24(BasicNewsRecipe):

    title = u'Dziennik Polski'
    publisher = u'Grupa Polskapresse'

    __author__ = 'grzegorz.maj'
    description = u'Wiadomości z wydania Dziennika Polskiego'
    oldest_article = 1
    max_articles_per_feed = 50
    needs_subscription = True

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    extra_css = '.date{margin-top: 4em;} .logo_author{margin-left:0.5em;}'

    publication_type = 'newspaper'
    cover_url = 'http://www.dziennikpolski24.pl/_p/images/logoDP24-b.gif'
    INDEX = 'http://dziennikpolski24.pl/'

    encoding = 'utf-8'
    language = 'pl'

    keep_only_tags = [

        dict(name='div', attrs={'class': ['toolbar']}), dict(name='h1'), dict(name='h2', attrs={'class': ['teaser']}), dict(name='div', attrs={'class': ['picture']}), dict(name='div', attrs={'id': ['showContent']}), dict(name='div', attrs={'class': ['paging']}), dict(name='div', attrs={'class': ['wykupTresc']})  # noqa
    ]

    remove_tags = [

    ]

    feeds = [

    (u'Kraj', u'http://www.dziennikpolski24.pl/rss/feed/1151'),
    (u'Świat', u'http://www.dziennikpolski24.pl/rss/feed/1153'),
    (u'Gospodarka', u'http://www.dziennikpolski24.pl/rss/feed/1154'),
    (u'Małopolska', u'http://www.dziennikpolski24.pl/rss/feed/1155'),
    (u'Kultura', u'http://www.dziennikpolski24.pl/rss/feed/1156'),
    (u'Opinie', u'http://www.dziennikpolski24.pl/rss/feed/1158'),
    (u'Kronika Nowohucka', u'http://www.dziennikpolski24.pl/rss/feed/1656'),
    (u'Na bieżąco', u'http://www.dziennikpolski24.pl/rss/feed/1543'),
    (u'Londyn 2012', u'http://www.dziennikpolski24.pl/rss/feed/2545'),
    (u'Piłka nożna', u'http://www.dziennikpolski24.pl/rss/feed/2196'),
    (u'Siatkówka', u'http://www.dziennikpolski24.pl/rss/feed/2197'),
    (u'Koszykówka', u'http://www.dziennikpolski24.pl/rss/feed/2198'),
    (u'Tenis', u'http://www.dziennikpolski24.pl/rss/feed/2199'),
    (u'Formuła 1', u'http://www.dziennikpolski24.pl/rss/feed/2203'),
    (u'Lekkoatletyka', u'http://www.dziennikpolski24.pl/rss/feed/2204'),
    (u'Żużel', u'http://www.dziennikpolski24.pl/rss/feed/2200'),
    (u'Sporty motorowe', u'http://www.dziennikpolski24.pl/rss/feed/2206'),
    (u'Publicystyka sportowa', u'http://www.dziennikpolski24.pl/rss/feed/2201'),
    (u'Kolarstwo', u'http://www.dziennikpolski24.pl/rss/feed/2205'),
    (u'Inne', u'http://www.dziennikpolski24.pl/rss/feed/2202'),
    (u'Miasto Kraków', u'http://www.dziennikpolski24.pl/rss/feed/1784'),
    (u'Region nowosądecki', u'http://www.dziennikpolski24.pl/rss/feed/1795'),
    (u'Region Małopolski Zachodniej', u'http://www.dziennikpolski24.pl/rss/feed/1793'),
    (u'Region tarnowski', u'http://www.dziennikpolski24.pl/rss/feed/1797'),
    (u'Region podhalański', u'http://www.dziennikpolski24.pl/rss/feed/1789'),
    (u'Region olkuski', u'http://www.dziennikpolski24.pl/rss/feed/1670'),
    (u'Region miechowski', u'http://www.dziennikpolski24.pl/rss/feed/1806'),
    (u'Region podkrakowski', u'http://www.dziennikpolski24.pl/rss/feed/1787'),
    (u'Region proszowicki', u'http://www.dziennikpolski24.pl/rss/feed/1804'),
    (u'Region wielicki', u'http://www.dziennikpolski24.pl/rss/feed/1802'),
    (u'Region podbeskidzki', u'http://www.dziennikpolski24.pl/rss/feed/1791'),
    (u'Region myślenicki', u'http://www.dziennikpolski24.pl/rss/feed/1800'),
    (u'Autosalon', u'http://www.dziennikpolski24.pl/rss/feed/1294'),
    (u'Kariera', u'http://www.dziennikpolski24.pl/rss/feed/1289'),
    (u'Przegląd nieruchomości', u'http://www.dziennikpolski24.pl/rss/feed/1281'),
    (u'Magnes', u'http://www.dziennikpolski24.pl/rss/feed/1283'),
    (u'Magazyn Piątek', u'http://www.dziennikpolski24.pl/rss/feed/1293'),
    (u'Pejzaż rodzinny', u'http://www.dziennikpolski24.pl/rss/feed/1274'),
    (u'Podróże', u'http://www.dziennikpolski24.pl/rss/feed/1275'),
    (u'Konsument', u'http://www.dziennikpolski24.pl/rss/feed/1288')
    ]

    def append_page(self, soup, appendtag):
        loop = False
        tag = soup.find('div', attrs={'class': 'paging'})
        if tag:
            loop = True
            li_nks = tag.findAll('li')
            appendtag.find('div', attrs={'class': 'paging'}).extract()
        if appendtag.find('ul', attrs={'class': 'menuf'}):
            appendtag.find('ul', attrs={'class': 'menuf'}).extract()
        while loop:
            loop = False
            for li_nk in li_nks:
                link_tag = li_nk.contents[0].contents[0].string
                if u'następna' in link_tag:
                    soup2 = self.index_to_soup(
                        self.INDEX + li_nk.contents[0]['href'])
                    if soup2.find('div', attrs={'id': 'showContent'}):
                        pagetext = soup2.find(
                            'div', attrs={'id': 'showContent'})
                        pos = len(appendtag.contents)
                        appendtag.insert(pos, pagetext)
                        if soup2.find('div', attrs={'class': 'rightbar'}):
                            pagecont = soup2.find(
                                'div', attrs={'class': 'rightbar'})
                            tag = pagecont.find(
                                'div', attrs={'class': 'paging'})
                            li_nks = tag.findAll('li')
                            loop = True

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('http://www.dziennikpolski24.pl/pl/moje-konto/950606-loguj.html')
            br.select_form(nr=1)
            br["user_login[login]"] = self.username
            br['user_login[pass]'] = self.password
            br.submit()
        return br

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        return soup
PK�Xt#���dziennik_wschodni.png�PNG


IHDR(-S0PLTE��"�"3�3D�DU�Uf�fw�w�������������}�dtRNS@��fYIDATx�� �=�(0��o�Q��O@,��""D����å�T]�tv�k���7�/�'��V�lbuL���)�%�IEND�B`�PK�X�^Q��dziennik_wschodni.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment


class DziennikWschodni(BasicNewsRecipe):
    title = u'Dziennik Wschodni'
    __author__ = 'fenuks'
    description = u'Dziennik Wschodni - portal regionalny województwa lubelskiego.'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    extra_css = 'ul {list-style: none; padding:0; margin:0;}'
    INDEX = 'http://www.dziennikwschodni.pl'
    masthead_url = INDEX + '/images/top_logo.png'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    ignore_duplicate_articles = {'title', 'url'}

    preprocess_regexps = [(re.compile(u'Czytaj:.*?</a>', re.DOTALL), lambda match: ''), (re.compile(u'Przeczytaj także:.*?</a>', re.DOTALL | re.IGNORECASE), lambda match: ''),  # noqa
                          (re.compile(u'Przeczytaj również:.*?</a>', re.DOTALL | re.IGNORECASE), lambda match: ''), (re.compile(u'Zobacz też:.*?</a>', re.DOTALL | re.IGNORECASE), lambda match: '')]  # noqa

    keep_only_tags = [dict(id=['article', 'cover', 'photostory'])]
    remove_tags = [dict(id=['articleTags', 'articleMeta', 'boxReadIt', 'articleGalleries', 'articleConnections',
                            'ForumArticleComments', 'articleRecommend', 'jedynkiLinks', 'articleGalleryConnections',
                            'photostoryConnections', 'articleEpaper', 'articlePoll', 'articleAlarm', 'articleByline']),
                   dict(attrs={'class': 'articleFunctions'})]

    feeds = [(u'Wszystkie', u'http://www.dziennikwschodni.pl/rss.xml'),
             (u'Lublin', u'http://www.dziennikwschodni.pl/lublin.xml'),
             (u'Zamość', u'http://www.dziennikwschodni.pl/zamosc.xml'),
             (u'Biała Podlaska',
              u'http://www.dziennikwschodni.pl/biala_podlaska.xml'),
             (u'Chełm', u'http://www.dziennikwschodni.pl/chelm.xml'),
             (u'Kraśnik', u'http://www.dziennikwschodni.pl/krasnik.xml'),
             (u'Puławy', u'http://www.dziennikwschodni.pl/pulawy.xml'),
             (u'Świdnik', u'http://www.dziennikwschodni.pl/swidnik.xml'),
             (u'Łęczna', u'http://www.dziennikwschodni.pl/leczna.xml'),
             (u'Lubartów', u'http://www.dziennikwschodni.pl/lubartow.xml'),
             (u'Sport', u'http://www.dziennikwschodni.pl/sport.xml'),
             (u'Praca', u'http://www.dziennikwschodni.pl/praca.xml'),
             (u'Dom', u'http://www.dziennikwschodni.pl/dom.xml'),
             (u'Moto', u'http://www.dziennikwschodni.pl/moto.xml'),
             (u'Zdrowie', u'http://www.dziennikwschodni.pl/zdrowie.xml'),
             ]

    def get_cover_url(self):
        soup = self.index_to_soup(
            self.INDEX + '/apps/pbcs.dll/section?Category=JEDYNKI')
        nexturl = self.INDEX + soup.find(id='covers').find('a')['href']
        soup = self.index_to_soup(nexturl)
        self.cover_url = self.INDEX + \
            soup.find(id='cover').find(name='img')['src']
        return getattr(self, 'cover_url', self.cover_url)

    def append_page(self, soup, appendtag):
        tag = soup.find('span', attrs={'class': 'photoNavigationPages'})
        if tag:
            number = int(tag.string.rpartition('/')[-1].replace('&nbsp;', ''))
            baseurl = self.INDEX + \
                soup.find(attrs={'class': 'photoNavigationNext'})['href'][:-1]

            for r in appendtag.findAll(attrs={'class': 'photoNavigation'}):
                r.extract()
            for nr in range(2, number + 1):
                soup2 = self.index_to_soup(baseurl + str(nr))
                pagetext = soup2.find(id='photoContainer')
                if pagetext:
                    pos = len(appendtag.contents)
                    appendtag.insert(pos, pagetext)
                pagetext = soup2.find(attrs={'class': 'photoMeta'})
                if pagetext:
                    pos = len(appendtag.contents)
                    appendtag.insert(pos, pagetext)
                pagetext = soup2.find(attrs={'class': 'photoStoryText'})
                if pagetext:
                    pos = len(appendtag.contents)
                    appendtag.insert(pos, pagetext)

            comments = appendtag.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        return soup
PK�XL	�@��dziennik_zachodni.png�PNG


IHDR(-SNPLTE���������5���늚�������|�����B[��������3N����n��h|�Ph����6P�����������^IDATx^u�G� D�j�9����ڀ
��
o
��r��1�<�� )AC��N���R����1T��'���A�3`s؀O|��g� B�)�?���X{٘tIEND�B`�PK�X�"-�	�	dziennik_zachodni.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class DziennikZachodni(BasicNewsRecipe):
    title = u'Dziennik Zachodni'
    __author__ = 'fenuks'
    description = u'Gazeta Regionalna Dziennik Zachodni. Najnowsze Wiadomości Śląskie. Wiadomości Śląsk. Czytaj!'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    masthead_url = 'http://s.polskatimes.pl/g/logo_naglowek/dziennikzachodni.png?24'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}
    remove_tags_after = dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})
    remove_tags = [dict(id='mat-podobne'), dict(name='a', attrs={'class': 'czytajDalej'}), dict(attrs={
        'src': 'http://nm.dz.com.pl/dz.png'}), dict(attrs={'href': 'http://www.dziennikzachodni.pl/piano'}), dict(name='aside')]

    feeds = [
    (u'Wszystkie', u'http://dziennikzachodni.feedsportal.com/c/32980/f/533764/index.rss?201302'),
    (u'Wiadomo\u015bci', u'http://dziennikzachodni.feedsportal.com/c/32980/f/533765/index.rss?201302'),
    (u'Regiony', u'http://www.dziennikzachodni.pl/rss/dziennikzachodni_regiony.xml?201302'),
    (u'Opinie', u'http://www.dziennikzachodni.pl/rss/dziennikzachodni_regiony.xml?201302'),
    (u'Blogi', u'http://www.dziennikzachodni.pl/rss/dziennikzachodni_blogi.xml?201302'),
    (u'Serwisy', u'http://www.dziennikzachodni.pl/rss/dziennikzachodni_serwisy.xml?201302'),
    (u'Sport', u'http://dziennikzachodni.feedsportal.com/c/32980/f/533766/index.rss?201302'),
    (u'M\xf3j Reporter', u'http://www.dziennikzachodni.pl/rss/dziennikzachodni_mojreporter.xml?201302'),
    (u'Na narty', u'http://www.dziennikzachodni.pl/rss/dziennikzachodni_nanarty.xml?201302'),
    (u'Drogi', u'http://www.dziennikzachodni.pl/rss/dziennikzachodni_drogi.xml?201302'),
    (u'Pieni\u0105dze', u'http://dziennikzachodni.feedsportal.com/c/32980/f/533768/index.rss?201302')]

    def print_version(self, url):
        return url.replace('artykul', 'drukuj')

    def skip_ad_pages(self, soup):
        if 'Advertisement' in soup.title:
            nexturl = soup.find('a')['href']
            return self.index_to_soup(nexturl, raw=True)

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.prasa24.pl/gazeta/dziennik-zachodni/')
        self.cover_url = soup.find(id='pojemnik').img['src']
        return getattr(self, 'cover_url', self.cover_url)
PK�X2'���dziennikzwiazkowy.png�PNG


IHDR�a�IDATx�b�gi񿓗����>	1�0�nr�����;f�S�v����A�Q�vT��Al{s��8W�m��E��S�r��w�c��#�rq��bL��ׁ�E`j�}Q��WR�!�
k��09	,-z=��p�<�\sS�����n|�h�WT���!����Db$	�JK��>��)
��:�caj
;�qǾ}�p��
J��tE�����ׯ)f�c���@��5�Ks
<y�9�X�*���
�bbb迸���^AA��dc�Z�� �˗�Y[[K̮�@n�����ɞ&I�¯�HJ����W���zbV���	����o{{{���l℄b///bln"����@yy9���3qrr2���-qff&166�r�ʿ+�y�X�V;66�}&����|������2R�[�ne�n�[ ߃���B���e���S_�8==�����X��+kj0�݅l3p�v6X��p��)
�$	>>>ؾ};Z[[�$��ڵyyyHOO����!�rka~voRR`����Pij���lb�x�����O_�ĭǏq�s�j
�@ҕK00��po/�Ob�` �Q��@W'&���څ�%4��2�Dp�.cOG��ӳ-5�T�dm�lאx�"�؁˷�E6�Oxc�4f���gE%����YIEND�B`�PK�X�?����dziennikzwiazkowy.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Informacje_USA(BasicNewsRecipe):
    title = u'Dziennik Związkowy'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = 'fenuks & Tomasz Długosz'
    description = u'Najstarsza polskojęzyczna gazeta codzienna w USA'
    category = 'news'
    language = 'pl'
    cover_url = 'http://dziennikzwiazkowy.com/wp-content/uploads/2014/08/LogoDZPDN1.png'
    no_stylesheets = True
    use_embedded_content = False
    keep_only_tags = [dict(name='div', attrs={'class': 'panel'})]
    remove_tags = [dict(name='div', attrs={'class': ['social-buttons left', 'video-carousel', 'p-title',
                                                     'article-foot', 'comments-block']}), dict(attrs={'id': ['writecomment', 'blueimp-gallery']})]
    feeds = [(u'Informacje', u'http://dziennikzwiazkowy.com/feed/')]

    extra_css = '''
        h1 { font-size:130% }
    '''
PK�X
��a!!ebeltoftlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X��}}ebeltoftlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Adresseavisen Ebeltoft
'''


class EbeltoftLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Adresseavisen Ebeltoft'
    description = 'Lokale og regionale nyheder, sport, kultur fra Ebeltoft og omegn på ebeltoft.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Adresseavisen Ebeltoft', 'http://ebeltoft.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Adresseavisen Ebeltoft', 'http://ebeltoft.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Adresseavisen Ebeltoft', 'http://ebeltoft.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Adresseavisen Ebeltoft', 'http://ebeltoft.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Adresseavisen Ebeltoft', 'http://ebeltoft.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Adresseavisen Ebeltoft', 'http://ebeltoft.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X�.R�FFebetrsberger_zeitung.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�QL0]]ebetrsberger_zeitung.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Ebersberger Zeitung'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard', u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Landkreis Ebersberg', u'http://www.merkur-online.de/lokales/ebersberg/rssfeed.rdf'),
    (u'Lkr. Ebersberg', u'http://www.merkur-online.de/lokales/ebersberg/landkreis/rssfeed.rdf'),
    (u'Glonn/Assling', u'http://www.merkur-online.de/lokales/ebersberg/glonn-assling/rssfeed.rdf'),
    (u'Markt Schwaben', u'http://www.merkur-online.de/lokales/ebersberg/markt-schwaben/rssfeed.rdf'),
    (u'Poing', u'http://www.merkur-online.de/lokales/ebersberg/poing/rssfeed.rdf'),
    (u'Grafing', u'http://www.merkur-online.de/lokales/ebersberg/grafing/rssfeed.rdf'),
    (u'Ebersberg', u'http://www.merkur-online.de/lokales/ebersberg/ebersberg/rssfeed.rdf'),
    (u'Vaterstetten', u'http://www.merkur-online.de/lokales/ebersberg/vaterstetten/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/ebersberg/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�Xtc���
echo_dnia.png�PNG


IHDR(-SyPLTESPP���������������������������������/��*��7��1��-��4��*��!������
������������������"��!��'��3��%��F��V��R��N��G��G��L��N��Q��B��N��M��J��L��H�[�`�i�v���������|�{�������������������ܷ�����������������������������������������������������������������������������������������������������Ԝ�ϖ�ѓ�؆�ہ��y��z��|�̄��m��c��Z��&��#�����������������������������������������������z�r�n�o�i�	c�a�^�]�X|SwV�V�!e�-k�M[aMZ`pXMdVOWSR]ZYd__fcbhedjfdmiholkxkdzojvrq{xv^JAYIAQGCNJIGCBOC=SD<A627327/-���������������������������������������"�3tRNS@��fIDATx�c��ݦ6F��-�M�|Lufv\�9��&M�WD����쨲�v��������;�
�\�3��TX�20�����
8����C�s�z������Y�n���|f���y�K�V20D��t⎿��x�T~N�(C�Ƅ��D	�P���F�,ѝ�!܌�0�ffd.dd�I�,��������#��m��Ҝ�8�|`ab�adh��.�����綖��_ #Cפ��%}/�b��8L�c�y�bO�Q�_UIEND�B`�PK�X6��?echo_dnia.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment


class EchoDnia(BasicNewsRecipe):
    title = u'Echo Dnia'
    __author__ = 'fenuks'
    description = u'Echo Dnia - portal regionalny świętokrzyskiego radomskiego i podkarpackiego. Najnowsze wiadomości z Twojego regionu, galerie, video, mp3.'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    extra_css = 'ul {list-style: none; padding:0; margin:0;}'
    INDEX = 'http://www.echodnia.eu'
    masthead_url = INDEX + '/images/top_logo.png'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}

    preprocess_regexps = [(re.compile(u'Czytaj:.*?</a>', re.DOTALL), lambda match: ''), (re.compile(u'Przeczytaj także:.*?</a>', re.DOTALL | re.IGNORECASE), lambda match: ''),  # noqa
                          (re.compile(u'Przeczytaj również:.*?</a>', re.DOTALL | re.IGNORECASE), lambda match: ''), (re.compile(u'Zobacz też:.*?</a>', re.DOTALL | re.IGNORECASE), lambda match: '')]  # noqa

    keep_only_tags = [dict(id=['article', 'cover', 'photostory'])]
    remove_tags = [dict(id=['articleTags', 'articleMeta', 'boxReadIt', 'articleGalleries', 'articleConnections',
                            'ForumArticleComments', 'articleRecommend', 'jedynkiLinks', 'articleGalleryConnections',
                            'photostoryConnections', 'articleEpaper', 'articlePoll', 'articleAlarm', 'articleByline', 'articleZoomText']),
                   dict(attrs={'class': 'articleFunctions'})]

    feeds = [(u'Wszystkie', u'http://www.echodnia.eu/rss.xml'),
             (u'Świętokrzyskie', u'http://www.echodnia.eu/swietokrzyskie.xml'),
             (u'Radomskie', u'http://www.echodnia.eu/radomskie.xml'),
             (u'Podkarpackie', u'http://www.echodnia.eu/podkarpackie.xml'),
             (u'Sport \u015bwi\u0119tokrzyski',
              u'http://www.echodnia.eu/sport_swi.xml'),
             (u'Sport radomski', u'http://www.echodnia.eu/sport_rad.xml'),
             (u'Sport podkarpacki', u'http://www.echodnia.eu/sport_pod.xml'),
             (u'Pi\u0142ka no\u017cna', u'http://www.echodnia.eu/pilka.xml'),
             (u'Praca', u'http://www.echodnia.eu/praca.xml'),
             (u'Dom', u'http://www.echodnia.eu/dom.xml'),
             (u'Auto', u'http://www.echodnia.eu/auto.xml'),
             (u'Zdrowie', u'http://www.echodnia.eu/zdrowie.xml')]

    def get_cover_url(self):
        soup = self.index_to_soup(
            self.INDEX + '/apps/pbcs.dll/section?Category=JEDYNKI')
        nexturl = self.INDEX + soup.find(id='covers').find('a')['href']
        soup = self.index_to_soup(nexturl)
        self.cover_url = self.INDEX + \
            soup.find(id='cover').find(name='img')['src']
        return getattr(self, 'cover_url', self.cover_url)

    def append_page(self, soup, appendtag):
        tag = soup.find('span', attrs={'class': 'photoNavigationPages'})
        if tag:
            number = int(tag.string.rpartition('/')[-1].replace('&nbsp;', ''))
            baseurl = self.INDEX + \
                soup.find(attrs={'class': 'photoNavigationNext'})['href'][:-1]

            for r in appendtag.findAll(attrs={'class': 'photoNavigation'}):
                r.extract()
            for nr in range(2, number + 1):
                soup2 = self.index_to_soup(baseurl + str(nr))
                pagetext = soup2.find(id='photoContainer')
                if pagetext:
                    pos = len(appendtag.contents)
                    appendtag.insert(pos, pagetext)
                pagetext = soup2.find(attrs={'class': 'photoMeta'})
                if pagetext:
                    pos = len(appendtag.contents)
                    appendtag.insert(pos, pagetext)
                pagetext = soup2.find(attrs={'class': 'photoStoryText'})
                if pagetext:
                    pos = len(appendtag.contents)
                    appendtag.insert(pos, pagetext)

            comments = appendtag.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        return soup
PK�Xkf�%echo_moskvy.png�PNG


IHDR  szz��IDATX��[�uǧ��=���?s��х� "$)���"���Z!��&kE74z(���4�F/�RD�C/a�HjdP��ͼ�[��e-�}�g~#�e��%��Ï��o~���ę8��sP�l��u�c:�snV���$�S,��<��5hfC{Odz�O2��=-���%7 I��i�|��~/�x�a�c�N��}޻7K��Y���!�šHqEѴ0gy��v.��j�̝�=�oi�vx^�������/���w�=�o2�5d]�ܻ��|d�V.�g��u�a��8\��U�%���.VW*�K��`
����wo�����kG`{��P~�@�2�O�S�,�{�d�}����R�	@�@?�A��c���~��S�
���h��"Ԏ!���d'����,J��ʀ��ϙ2�,L�X�����{��\��*J4��!f@)|�����G�v�ʗ�ӌ��r`<�~�)@�	��E��`���,��{��W$��J���K�N{3��M�B�B��E�RZP�$)9[����{ǜ��=�w�*Y� �j��(9��a�}2(�q�Fw�?i);f!��+d���+�ƿ�u��^�@���Я8W<�*>��C�y���D�:լ ��E�V�my]j@sx~����'�ߒy^W��0��{B��}?�wp�6����7�`�Q9��0Z���]��Y�E3��
P����`����x�m��ܻޗ���v%)�<n b¹�Q��aE�Ĕ!ս��hB��,��:���h�;e���x�m8M�(�����(!�C���`~Wm���y�k�
i�-��
���;5��N4>��
�e���'��So
ċ2�~�CI�
"mE6��o;a3tE6!��?�\�:�o�s�i�h+�].�<�42z�#@��|mS�_a��&�(���$��} <σL�N9:�����%�'��j���K�
����$|T9i#�C�H��z�9�W	�t��]�-#�
F���z���&�`���T^�1J�ɔl
'�f��X�L�ױ1k�fED9�
����A�f����\7d��i�]}�thYi8!�J"8X��9�C~V���C��IM1[B	asOi��C��4^!��[�5=�$N�W-���	��w�vM�ph��[�m�8~�F:RV�>��"��6��g�'�=$m��VIEND�B`�PK�X�U���echo_moskvy.recipefrom __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe

class EchoMsk(BasicNewsRecipe):
    title          	  = '\u042D\u0425\u041E'
    __author__            = 'bugmen00t'
    description           = ('\u042D\u0425\u041E - \u043A\u0430\u043A \u043D\u0430 \u0441\u0442\u0430\u0440\u043E\u043C'
                             ' \u0434\u043E\u0431\u0440\u043E\u043C \u0440\u0430\u0434\u0438\u043E')
    publisher             = 'Radio Echo GmbH'
    category              = 'news'
    cover_url = u'https://echofm.online/logo.png'
    language              = 'ru'
    no_stylesheets        = True
    remove_javascript = False
    auto_cleanup   = False
    oldest_article = 7
    max_articles_per_feed = 50

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags =   [
        dict(name='span', attrs={'class': 'sc-7b4cbb79-0 guzUFC'}),
        dict(name='div', attrs={'class': 'sc-f94c4ef5-0 frGiYu'}),
        dict(name='div', attrs={'class': 'sc-f94c4ef5-0 frGiYu'})
        ]

    feeds = [
        ('\u0413\u043B\u0430\u0432\u043D\u043E\u0435', 'https://echofm.online/feed'),
        ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://echofm.online/news/feed'),
        ('\u041C\u043D\u0435\u043D\u0438\u044F', 'https://echofm.online/opinions/feed'),
        ('\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B', 'https://echofm.online/documents/feed')
    ]
PK�X\\�-��echo_online.png�PNG


IHDR�a�IDATxڕ�3�]A�׳um�]\����ԩRu�&���ضm�+3����{�c�~����N����S�1ě�'�����cy
�Y����^x��>Zmq�k�\9���Ea]X��=D��ɯG��ݪMY>l��7k��4 �Tn��	v�Z�#<��e�8�'Ȁ���3�M����5�xFpVp��A
B�P�z���� ��vL�7nr��zϵ�R�P�=hU�Aq�x�'u��/�x�L�X����,�Y�y�?��nq��i΢�f]P���?�<�n���}���\r5���xe�>�6�����KyM��������R�Ac��h+ׇyJ&
D��+��<�zZ���\x����-3�O�]�Rx��sD�����?�<|=>IFIEND�B`�PK�X,�߫<<eclipseonline.png�PNG


IHDR  �s�IDATH���]h�q���l>�6��p�����p�R�煸�[%)�v�ʕ	��W������1�6_K�q<n�v���;�{����_����2�1�)K�ڨ�3����u��\�?�*�4�jl��qoͰ��n�S
&i�b��x充���Ņ6��;�
96��k�� 澊$�4e�ɳ�J<��h��ʠI�˺��p�*�%�I�k�7""�l,�T(|v�t�NJ��#"�/EMR@�������L������@�GD6F���o7�Lg�&s�}T+e�*=:u˔��i9Λn���a�>[]q���z���O���r�>a��y�c`�Eë_���k�3�&�J6���7���2�c��R@�R����J�Z]���~��%]�۫�<�vBj���R�i�n��`%r#�k�7]."�*�=�Q��@q�Z̵P�J�Nz^��^��팗>��7M,^��쟘4���P%��٪T&���KO���v��[/Fw|*<�j��%�IEND�B`�PK�X��meclipseonline.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class EclipseOnline(BasicNewsRecipe):

    #
    # oldest_article specifies the maximum age, in days, of posts to retrieve.
    # The default of 32 is intended to work well with a "days of month = 1"
    # recipe schedule to download "monthly issues" of Eclipse Online.
    # Increase this value to include additional posts. However, the RSS feed
    # currently only includes the 10 most recent posts, so that's the max.
    #
    oldest_article = 32

    title = u'Eclipse Online'
    description = u'"Where strange and wonderful things happen, where reality is eclipsed for a little while with something magical and new." Eclipse Online is edited by Jonathan Strahan and published online by Night Shade Books. http://www.nightshadebooks.com/category/eclipse/'  # noqa
    publication_type = 'magazine'
    language = 'en'

    __author__ = u'Jim DeVona'
    __version__ = '1.0'

    # For now, use this Eclipse Online logo as the ebook cover image.
    # (Disable the cover_url line to let Calibre generate a default cover, including date.)
    cover_url = 'http://www.nightshadebooks.com/wp-content/uploads/2012/10/Eclipse-Logo.jpg'

    # Extract the "post" div containing the story (minus redundant metadata)
    # from each page.
    keep_only_tags = [
        dict(name='div', attrs={'class': lambda x: x and 'post' in x})]
    remove_tags = [
        dict(name='span', attrs={'class': ['post-author', 'post-category', 'small']})]

    # Nice plain markup (like Eclipse's) works best for most e-readers.
    # Disregard any special styling rules, but center illustrations.
    auto_cleanup = False
    no_stylesheets = True
    remove_attributes = ['style', 'align']
    extra_css = '.wp-caption {text-align: center;} .wp-caption-text {font-size: small; font-style: italic;}'

    # Tell Calibre where to look for article links. It will proceed to retrieve
    # these posts and format them into an ebook according to the above rules.
    feeds = ['http://www.nightshadebooks.com/category/eclipse/feed/']
PK�X(�__ecogeek.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
EcoGeek.org
'''

import os
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryDirectory


class EcoGeek(BasicNewsRecipe):
    title = 'EcoGeek'
    __author__ = 'Darko Miletic'
    description = 'EcoGeek - Technology for the Environment Blog Feed'
    publisher = 'EcoGeek'
    language = 'en'
    no_stylesheets = True

    def parse_index(self):
        tdir = PersistentTemporaryDirectory('_ecogeek')
        articles = []
        soup = self.index_to_soup('http://feeds2.feedburner.com/EcoGeek')
        for i, article in enumerate(soup.findAll('div', attrs={'class': 'article'})):
            fname = os.path.join(tdir, '%d.html' % i)
            with open(fname, 'wb') as f:
                f.write(type(u'')(article).encode('utf-8'))
            articles.append({
                'title': self.tag_to_string(article.find('h2')),
                'url': 'file://' + fname.replace(os.sep, '/'),
            })
        return [('EcoGeek', articles)]
PK�X��>�GGeconomia.png�PNG


IHDR  D����PLTE���&&&


���������:::+++������hhh������444����fq���[[[������yyy>>>������LLL�������4C������EEE�����ޙ���������׍�����___���eee����}�{{{RRR��������������پ��������kFI�*6���~~~�#��������v��������'7��㲲�󉒆���������_k������������ggg��������������������4C���������"""����U`�P^TTTCCC%�
�&�Zf�����������������GT������LY������������Ă��ttt���tRNS@��fuIDATx�}Ӄ�#A���m�۶�;k۶m��I�N�S8(�W���W;����2����m���"+���`"*ŀ�2��j`P�ޫHxj�hRM�A�W�SjHǰ�p���~�d*h�L�ߖJڣXq���?5=3  2NM�)�o%�JK�2M/vkK����'���V��Qi߫ג���d�]�d�j.�����pm��O���E_���f�U�chr��x�C��N�M
�S�ö��?���U�O����&��x9���nf?�y�l���#��( z)?V� ѕ���T3���nv0�X��UtCM���q�Jؙ�B�Ú���6�����~JVd0����6O�nS`�,��5����0HC���*u�D8IEND�B`�PK�Xt?�economia.recipefrom calibre.web.feeds.news import BasicNewsRecipe
try:
    from urllib.parse import quote
except ImportError:
    from urllib import quote


class EconomiaMagazine(BasicNewsRecipe):
    title = u'Economia Magazine'
    __author__ = 'Kovid Goyal'
    description = 'Economia - Intelligence & Insight for ICAEW Members'
    language = 'en_GB'
    BASE = 'http://economia.icaew.com/'
    no_stylesheets = True

    keep_only_tags = [
        dict(name='h1'),
        dict(name='figure', attrs={
             'class': lambda x: x and 'figure' in x.split()}),
        dict(attrs={'class': 'intro articleCopy'.split()})
    ]

    def image_url_processor(cls, baseurl, iurl):
        if iurl:
            return baseurl + quote(iurl)
        return baseurl + '404.jpeg'

    def preprocess_raw_html(self, raw_html, url):
        return raw_html.replace('src=""', '')

    def parse_index(self):
        soup = self.index_to_soup('http://economia.icaew.com/')
        img = soup.find('img', src=lambda x: x and 'Magazine covers' in x)
        self.cover_url = self.BASE + quote(img['src'].encode('utf-8'))
        soup = self.index_to_soup(self.BASE + img.parent['href'])
        self.timefmt = ' [%s]' % self.tag_to_string(
            soup.find('title')).split('|')[0].strip()
        ans = []
        for div in soup.findAll('div', attrs={'class': 'articlePreview'}):
            h2 = div.find('h2')
            section_title = self.tag_to_string(h2).strip()
            self.log('Found section:', section_title)
            articles = []
            for li in div.findAll('li'):
                h3 = li.find('h3')
                title = self.tag_to_string(h3)
                a = h3.find('a', href=True)
                url = self.BASE + a['href']
                p = li.find('p')
                self.log('\t', title, 'at', url)
                articles.append({'title': title, 'url': url,
                                 'description': self.tag_to_string(p)})
            if articles:
                ans.append((section_title, articles))
        return ans
PK�X���
economico.png�PNG


IHDR:����IDATWc02226 i�0��B���""��&`#��޾yL�Ї��������	�~6jA�0m��B����T�E�w�W�"��P37�!Ð�)5T_x��kf��������Wu�Pb�?�bH��	Hn��P[SMF�"`$���mEYe�8=�;�����f�ݸK
,`�3���k�Νy1G������������j�>�FqnS)�|�IEND�B`�PK�X�bteconomico.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Economico(BasicNewsRecipe):
    title = u'Economico'
    language = 'pt'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    encoding = 'utf-8'
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('Ultima Hora',
         'http://economico.sapo.pt/rss/ultimas'),
        ('Em Foco',
         'http://economico.sapo.pt/rss/emfoco'),
        ('Mercados',
         'http://economico.sapo.pt/rss/mercados'),
        ('Empresas',
         'http://economico.sapo.pt/rss/empresas'),
        ('Economia',
         'http://economico.sapo.pt/rss/economia'),
        ('Politica',
         'http://economico.sapo.pt/rss/politica'),
    ]
PK�X�C��
economist.png�PNG


IHDR  D����PLTE��������	����������VS����������������tr�#��������	��_^��������������	��������][�����		�������������`^��	�������^\����}�TR�HF����	��XU�qo�KH��*(��������������da�\[�ig�oo��30�,*�0-����YU����US��		�MK� �{y����jh�32�����-,�``���������������HE�JF������	��������vt򣢉d7�2IDATx�͒�z�@�3:�ql��m۶m�o^�3�mח�̿�&�'�S����!��(�Z�Y�_y�By&�PO��U�U����9h��Lօ%�w�b`�������"h�9� ��.GY�1@O@�c�g�p4 ��ԙ@U��4]S�,�y��edb��2:�n��&�C��N�,�`phX�d��������TR����Y��4�:H�)�0�/�,䇉�qY2�D�e�_rF&�+ª����͟m�m?`gwo��!��K�#����u�&x�y�~R�z��W%f�'=��+�|�7IEND�B`�PK�X|�nl$3$3economist.recipe#!/usr/bin/env  python
# License: GPLv3 Copyright: 2008, Kovid Goyal <kovid at kovidgoyal.net>

import json
from html5_parser import parse
from lxml import etree
from collections import defaultdict

from calibre import replace_entities
from calibre.ebooks.BeautifulSoup import NavigableString, Tag
from calibre.utils.date import parse_only_date
from calibre.web.feeds.news import BasicNewsRecipe

# For past editions, set date to, for example, '2020-11-28'
edition_date = None


def E(parent, name, text='', **attrs):
    ans = parent.makeelement(name, **attrs)
    ans.text = text
    parent.append(ans)
    return ans


def process_node(node, html_parent):
    ntype = node.get('type')
    if ntype == 'tag':
        c = html_parent.makeelement(node['name'])
        c.attrib.update({k: v or '' for k, v in node.get('attribs', {}).items()})
        html_parent.append(c)
        for nc in node.get('children', ()):
            process_node(nc, c)
    elif ntype == 'text':
        text = node.get('data')
        if text:
            text = replace_entities(text)
            if len(html_parent):
                t = html_parent[-1]
                t.tail = (t.tail or '') + text
            else:
                html_parent.text = (html_parent.text or '') + text


def safe_dict(data, *names):
    ans = data
    for x in names:
        ans = ans.get(x) or {}
    return ans


class JSONHasNoContent(ValueError):
    pass


def load_article_from_json(raw, root):
    # open('/t/raw.json', 'w').write(raw)
    try:
        data = json.loads(raw)['props']['pageProps']['content']
    except KeyError as e:
        raise JSONHasNoContent(e)
    if isinstance(data, list):
        data = data[0]
    body = root.xpath('//body')[0]
    for child in tuple(body):
        body.remove(child)
    article = E(body, 'article')
    E(article, 'h4', data['subheadline'], style='color: red; margin: 0')
    E(article, 'h1', data['headline'], style='font-size: x-large')
    E(article, 'div', data['description'], style='font-style: italic')
    E(article, 'div', (data['datePublishedString'] or '') + ' | ' + (data['dateline'] or ''), style='color: gray; margin: 1em')
    main_image_url = safe_dict(data, 'image', 'main', 'url').get('canonical')
    if main_image_url:
        div = E(article, 'div')
        try:
            E(div, 'img', src=main_image_url)
        except Exception:
            pass
    for node in data.get('text') or ():
        process_node(node, article)


def cleanup_html_article(root):
    main = root.xpath('//main')[0]
    body = root.xpath('//body')[0]
    for child in tuple(body):
        body.remove(child)
    body.append(main)
    main.set('id', '')
    main.tag = 'article'
    for x in root.xpath('//*[@style]'):
        x.set('style', '')
    for x in root.xpath('//button'):
        x.getparent().remove(x)


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class NoArticles(Exception):
    pass


def process_url(url):
    if url.startswith('/'):
        url = 'https://www.economist.com' + url
    return url


class Economist(BasicNewsRecipe):

    title = 'The Economist'
    language = 'en'
    encoding = 'utf-8'
    masthead_url = 'https://www.livemint.com/lm-img/dev/economist-logo-oneline.png'

    __author__ = "Kovid Goyal"
    description = (
        'Global news and current affairs from a European'
        ' perspective. Best downloaded on Friday mornings (GMT)'
    )
    extra_css = '''
        .headline {font-size: x-large;}
        h2 { font-size: small;  }
        h1 { font-size: medium;  }
        em.Bold {font-weight:bold;font-style:normal;}
        em.Italic {font-style:italic;}
        p.xhead {font-weight:bold;}
        .pullquote {
            float: right;
            font-size: larger;
            font-weight: bold;
            font-style: italic;
            page-break-inside:avoid;
            border-bottom: 3px solid black;
            border-top: 3px solid black;
            width: 228px;
            margin: 0px 0px 10px 15px;
            padding: 7px 0px 9px;
        }
        .flytitle-and-title__flytitle {
            display: block;
            font-size: smaller;
            color: red;
        }
        img {display:block; margin:0 auto;}
        '''
    oldest_article = 7.0
    resolve_internal_links = True
    remove_tags = [
        dict(name=['script', 'noscript', 'title', 'iframe', 'cf_floatingcontent', 'aside', 'footer']),
        dict(attrs={'aria-label': "Article Teaser"}),
        dict(attrs={
                'class': [
                    'dblClkTrk', 'ec-article-info', 'share_inline_header',
                    'related-items', 'main-content-container', 'ec-topic-widget',
                    'teaser', 'blog-post__bottom-panel-bottom', 'blog-post__comments-label',
                    'blog-post__foot-note', 'blog-post__sharebar', 'blog-post__bottom-panel',
                    'newsletter-form','share-links-header','teaser--wrapped', 'latest-updates-panel__container',
                    'latest-updates-panel__article-link','blog-post__section'
                ]
            }
        ),
        dict(attrs={
                'class': lambda x: x and 'blog-post__siblings-list-aside' in x.split()}),
        classes(
            'share-links-header teaser--wrapped latest-updates-panel__container'
            ' latest-updates-panel__article-link blog-post__section newsletter-form blog-post__bottom-panel'
        )
    ]
    keep_only_tags = [dict(name='article', id=lambda x: not x)]
    no_stylesheets = True
    remove_attributes = ['data-reactid', 'width', 'height']
    # economist.com has started throttling after about 60% of the total has
    # downloaded with connection reset by peer (104) errors.
    delay = 1

    needs_subscription = False

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            # Reduce image sizes to get file size below amazon's email
            # sending threshold
            self.web2disk_options.compress_news_images = True
            self.web2disk_options.compress_news_images_auto_size = 5
            self.log.warn('Kindle Output profile being used, reducing image quality to keep file size below amazon email threshold')

    def get_browser(self, *args, **kwargs):
        # Needed to bypass cloudflare
        kwargs['user_agent'] = 'common_words/based'
        br = BasicNewsRecipe.get_browser(self, *args, **kwargs)
        br.addheaders += [('Accept-Language', 'en-GB,en-US;q=0.9,en;q=0.8')]
        return br

    def preprocess_raw_html(self, raw, url):
        # open('/t/raw.html', 'wb').write(raw.encode('utf-8'))
        root = parse(raw)
        if '/interactive/' in url:
            return '<html><body><article><h1 class="headline">' + root.xpath('//h1')[0].text + '</h1><em>' \
                        + 'This article is supposed to be read in a browser' \
                            + '</em></article></body></html>'
        script = root.xpath('//script[@id="__NEXT_DATA__"]')
        if script:
            try:
                load_article_from_json(script[0].text, root)
            except JSONHasNoContent:
                cleanup_html_article(root)
        for div in root.xpath('//div[@class="lazy-image"]'):
            noscript = list(div.iter('noscript'))
            if noscript and noscript[0].text:
                img = list(parse(noscript[0].text).iter('img'))
                if img:
                    p = noscript[0].getparent()
                    idx = p.index(noscript[0])
                    p.insert(idx, p.makeelement('img', src=img[0].get('src')))
                    p.remove(noscript[0])
        for x in root.xpath('//*[name()="script" or name()="style" or name()="source" or name()="meta"]'):
            x.getparent().remove(x)
        # the economist uses <small> for small caps with a custom font
        for x in root.xpath('//small'):
            if x.text and len(x) == 0:
                x.text = x.text.upper()
                x.tag = 'span'
                x.set('style', 'font-variant: small-caps')
        for x in root.xpath('//figcaption'):
            x.set('style', 'text-align:center; font-size:small;')
        for x in root.xpath('//cite'):
            x.tag = 'blockquote'
            x.set('style', 'color:#404040;')
        raw = etree.tostring(root, encoding='unicode')
        return raw

    def publication_date(self):
        if edition_date:
            return parse_only_date(edition_date, as_utc=False)
        url = self.browser.open("https://www.economist.com/printedition").geturl()
        return parse_only_date(url.split("/")[-1], as_utc=False)

    def parse_index(self):
        # return [('Articles', [{'title':'test',
        #     'url':'https://www.economist.com/interactive/briefing/2022/06/11/huge-foundation-models-are-turbo-charging-ai-progress'
        # }])]
        if edition_date:
            url = 'https://www.economist.com/weeklyedition/' + edition_date
            self.timefmt = ' [' + edition_date + ']'
        else:
            url = 'https://www.economist.com/printedition'
        # raw = open('/t/raw.html').read()
        raw = self.index_to_soup(url, raw=True)
        # with open('/t/raw.html', 'wb') as f:
        #     f.write(raw)
        soup = self.index_to_soup(raw)
        # nav = soup.find(attrs={'class':'navigation__wrapper'})
        # if nav is not None:
        #     a = nav.find('a', href=lambda x: x and '/printedition/' in x)
        #     if a is not None:
        #         self.log('Following nav link to current edition', a['href'])
        #         soup = self.index_to_soup(process_url(a['href']))
        ans = self.economist_parse_index(soup)
        if not ans:
            raise NoArticles(
                'Could not find any articles, either the '
                'economist.com server is having trouble and you should '
                'try later or the website format has changed and the '
                'recipe needs to be updated.'
            )
        return ans

    def economist_parse_index(self, soup):
        script_tag = soup.find("script", id="__NEXT_DATA__")
        if script_tag is not None:
            data = json.loads(script_tag.string)
            # open('/t/raw.json', 'w').write(json.dumps(data, indent=2, sort_keys=True))
            # self.title = 'The Economist | ' + safe_dict(data, "props", "pageProps", "content", "image", "main", "headline")
            self.timefmt = ' [' + safe_dict(data, "props", "pageProps", "content", "datePublishedString") + ']'
            self.cover_url = safe_dict(data, "props", "pageProps", "content", "image", "main", "url", "canonical")
            self.log('Got cover:', self.cover_url)

            feeds_dict = defaultdict(list)
            for part in safe_dict(data, "props", "pageProps", "content", "hasPart", "parts"):
                section = safe_dict(part, "print", "section", "headline") or ''
                title = safe_dict(part, "headline") or ''
                url = safe_dict(part, "url", "canonical") or ''
                if not section or not title or not url:
                    continue
                desc = safe_dict(part, "description") or ''
                sub = safe_dict(part, "subheadline") or ''
                if sub and section != sub:
                    desc = sub + ' :: ' + desc
                feeds_dict[section].append({"title": title, "url": url, "description": desc})
                self.log(' ', title, url, '\n   ', desc)
            return [(section, articles) for section, articles in feeds_dict.items()]
        else:
            return []

    def eco_find_image_tables(self, soup):
        for x in soup.findAll('table', align=['right', 'center']):
            if len(x.findAll('font')) in (1, 2) and len(x.findAll('img')) == 1:
                yield x

    def postprocess_html(self, soup, first):
        for img in soup.findAll('img', srcset=True):
            del img['srcset']
        for table in list(self.eco_find_image_tables(soup)):
            caption = table.find('font')
            img = table.find('img')
            div = new_tag(soup, 'div')
            div['style'] = 'text-align:left;font-size:70%'
            ns = NavigableString(self.tag_to_string(caption))
            div.insert(0, ns)
            div.insert(1, new_tag(soup, 'br'))
            del img['width']
            del img['height']
            img.extract()
            div.insert(2, img)
            table.replaceWith(div)
        return soup

    def canonicalize_internal_url(self, url, is_link=True):
        if url.endswith('/print'):
            url = url.rpartition('/')[0]
        return BasicNewsRecipe.canonicalize_internal_url(self, url, is_link=is_link)
PK�X�FE'economist_espresso.png�PNG


IHDR@@%�sBIT��O��IDATh��?hwǿ�w'ɗ�Utȃ�8N:x����[��nwkJ��x���CI;i3�%PJi-Z�����:Ƹ�&��
�R�;���~��bUT�$���9L�q��ッt��O�G���H;]2i�	H�L@�d���0U�\_�r�N��1�$��wGo)��9��FAJ�,Y2	"B�0�4`�$� �!%�y��w󦲆�����
�44�U�ڋ��"�k�0�X��ҥ���DGw��@�!w�"6L��±Űyt�z�V��r��_����6���}{=z��kF��R�
�n}{�,KO�:6��ǟZ�ќ��W�y��S;��IA{u.�_}�B���&�&�6�Ƶk�˔�����a��ɱ%�����_}0'��]�zE���I^�߻���D���c{��W^'5�˻�s��/�'9��
�����\����:+�#���e�T%Gs��j��r{M�u��,�o�
����>ΰ��H�\���1�@q}�p�*�*-��3���{�pؖa�^�#I��Q�Xx�
ʟpJ3H/f���q�I�1GF��+�@9���e��)����j��B#n��(h�K����R����r����|����w�����닋��r9B�N�lnnd�����B7��A�Z���-╕���ܟ2i�	�fvv�S�j�������011��h��F@lC����azz@�^W��L3f�.��u\[[�,����@2Qann��
3sg�y���]�j��}G�����Je{{�V�����̖e������U*�����glwwW?��,,,����~�I)�Jj9(�'���S�P=٨<B333[[[�V'�^QEQԵ���D����u�$�����q�<O-��������=�nC��|[��IEND�B`�PK�X�hG��	�	economist_espresso.recipe'''
https://www.economist.com/the-world-in-brief
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Espresso(BasicNewsRecipe):
    title = 'The Economist Espresso'
    language = 'en'
    __author__ = 'unkn0wn'
    description = (
        'Espresso is a rich, full-flavoured shot of daily global analysis'
        ' from the editors of The Economist to get you up to speed, fast.'
         'Maximise your understanding of the most significant business, '
         'economic, political and cultural developments globally.'
    )
    cover_url = 'https://downloadr2.apkmirror.com/wp-content/uploads/2021/10/75/615777cc6611b.png'
    no_stylesheets = True
    remove_attributes = ['height', 'width', 'style']
    use_embedded_content = False
    masthead_url = 'https://www.livemint.com/lm-img/dev/economist-logo-oneline.png'

    extra_css = '''
        h1 { text-align:center; }
        ._main-image, ._description, .sub { text-align:center; font-size:small; }
        ._quote-container { font-size:x-large; font-style:italic; color:#202020; }
    '''

    keep_only_tags = [
        dict(name='main', attrs={'id':'content'})
    ]

    remove_tags = [
        classes('_podcast-promo _newsletter-promo-container _time-last-updated')
    ]

    def parse_index(self):
        return [
            ('Espresso',
                [
                    {
                        'title': 'The World in Brief',
                        'url': 'https://www.economist.com/the-world-in-brief',
                        'description': 'Catch up quickly on the global stories that matter'
                    },
                ]
            ),
        ]

    def preprocess_html(self, soup):
        if h1 := soup.find('h1'):
            if p := h1.find_next_sibling('p'):
                p['class'] = 'sub'
        for hr in soup.findAll(attrs={'class':['_gobbet', '_article']}):
            nt = new_tag(soup, 'hr')
            hr.append(nt)
        return soup

    def get_browser(self, *args, **kwargs):
        # Needed to bypass cloudflare
        kwargs['user_agent'] = 'common_words/based'
        br = BasicNewsRecipe.get_browser(self, *args, **kwargs)
        br.addheaders += [('Accept-Language', 'en-GB,en-US;q=0.9,en;q=0.8')]
        return br
PK�X|�nl$3$3economist_free.recipe#!/usr/bin/env  python
# License: GPLv3 Copyright: 2008, Kovid Goyal <kovid at kovidgoyal.net>

import json
from html5_parser import parse
from lxml import etree
from collections import defaultdict

from calibre import replace_entities
from calibre.ebooks.BeautifulSoup import NavigableString, Tag
from calibre.utils.date import parse_only_date
from calibre.web.feeds.news import BasicNewsRecipe

# For past editions, set date to, for example, '2020-11-28'
edition_date = None


def E(parent, name, text='', **attrs):
    ans = parent.makeelement(name, **attrs)
    ans.text = text
    parent.append(ans)
    return ans


def process_node(node, html_parent):
    ntype = node.get('type')
    if ntype == 'tag':
        c = html_parent.makeelement(node['name'])
        c.attrib.update({k: v or '' for k, v in node.get('attribs', {}).items()})
        html_parent.append(c)
        for nc in node.get('children', ()):
            process_node(nc, c)
    elif ntype == 'text':
        text = node.get('data')
        if text:
            text = replace_entities(text)
            if len(html_parent):
                t = html_parent[-1]
                t.tail = (t.tail or '') + text
            else:
                html_parent.text = (html_parent.text or '') + text


def safe_dict(data, *names):
    ans = data
    for x in names:
        ans = ans.get(x) or {}
    return ans


class JSONHasNoContent(ValueError):
    pass


def load_article_from_json(raw, root):
    # open('/t/raw.json', 'w').write(raw)
    try:
        data = json.loads(raw)['props']['pageProps']['content']
    except KeyError as e:
        raise JSONHasNoContent(e)
    if isinstance(data, list):
        data = data[0]
    body = root.xpath('//body')[0]
    for child in tuple(body):
        body.remove(child)
    article = E(body, 'article')
    E(article, 'h4', data['subheadline'], style='color: red; margin: 0')
    E(article, 'h1', data['headline'], style='font-size: x-large')
    E(article, 'div', data['description'], style='font-style: italic')
    E(article, 'div', (data['datePublishedString'] or '') + ' | ' + (data['dateline'] or ''), style='color: gray; margin: 1em')
    main_image_url = safe_dict(data, 'image', 'main', 'url').get('canonical')
    if main_image_url:
        div = E(article, 'div')
        try:
            E(div, 'img', src=main_image_url)
        except Exception:
            pass
    for node in data.get('text') or ():
        process_node(node, article)


def cleanup_html_article(root):
    main = root.xpath('//main')[0]
    body = root.xpath('//body')[0]
    for child in tuple(body):
        body.remove(child)
    body.append(main)
    main.set('id', '')
    main.tag = 'article'
    for x in root.xpath('//*[@style]'):
        x.set('style', '')
    for x in root.xpath('//button'):
        x.getparent().remove(x)


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class NoArticles(Exception):
    pass


def process_url(url):
    if url.startswith('/'):
        url = 'https://www.economist.com' + url
    return url


class Economist(BasicNewsRecipe):

    title = 'The Economist'
    language = 'en'
    encoding = 'utf-8'
    masthead_url = 'https://www.livemint.com/lm-img/dev/economist-logo-oneline.png'

    __author__ = "Kovid Goyal"
    description = (
        'Global news and current affairs from a European'
        ' perspective. Best downloaded on Friday mornings (GMT)'
    )
    extra_css = '''
        .headline {font-size: x-large;}
        h2 { font-size: small;  }
        h1 { font-size: medium;  }
        em.Bold {font-weight:bold;font-style:normal;}
        em.Italic {font-style:italic;}
        p.xhead {font-weight:bold;}
        .pullquote {
            float: right;
            font-size: larger;
            font-weight: bold;
            font-style: italic;
            page-break-inside:avoid;
            border-bottom: 3px solid black;
            border-top: 3px solid black;
            width: 228px;
            margin: 0px 0px 10px 15px;
            padding: 7px 0px 9px;
        }
        .flytitle-and-title__flytitle {
            display: block;
            font-size: smaller;
            color: red;
        }
        img {display:block; margin:0 auto;}
        '''
    oldest_article = 7.0
    resolve_internal_links = True
    remove_tags = [
        dict(name=['script', 'noscript', 'title', 'iframe', 'cf_floatingcontent', 'aside', 'footer']),
        dict(attrs={'aria-label': "Article Teaser"}),
        dict(attrs={
                'class': [
                    'dblClkTrk', 'ec-article-info', 'share_inline_header',
                    'related-items', 'main-content-container', 'ec-topic-widget',
                    'teaser', 'blog-post__bottom-panel-bottom', 'blog-post__comments-label',
                    'blog-post__foot-note', 'blog-post__sharebar', 'blog-post__bottom-panel',
                    'newsletter-form','share-links-header','teaser--wrapped', 'latest-updates-panel__container',
                    'latest-updates-panel__article-link','blog-post__section'
                ]
            }
        ),
        dict(attrs={
                'class': lambda x: x and 'blog-post__siblings-list-aside' in x.split()}),
        classes(
            'share-links-header teaser--wrapped latest-updates-panel__container'
            ' latest-updates-panel__article-link blog-post__section newsletter-form blog-post__bottom-panel'
        )
    ]
    keep_only_tags = [dict(name='article', id=lambda x: not x)]
    no_stylesheets = True
    remove_attributes = ['data-reactid', 'width', 'height']
    # economist.com has started throttling after about 60% of the total has
    # downloaded with connection reset by peer (104) errors.
    delay = 1

    needs_subscription = False

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            # Reduce image sizes to get file size below amazon's email
            # sending threshold
            self.web2disk_options.compress_news_images = True
            self.web2disk_options.compress_news_images_auto_size = 5
            self.log.warn('Kindle Output profile being used, reducing image quality to keep file size below amazon email threshold')

    def get_browser(self, *args, **kwargs):
        # Needed to bypass cloudflare
        kwargs['user_agent'] = 'common_words/based'
        br = BasicNewsRecipe.get_browser(self, *args, **kwargs)
        br.addheaders += [('Accept-Language', 'en-GB,en-US;q=0.9,en;q=0.8')]
        return br

    def preprocess_raw_html(self, raw, url):
        # open('/t/raw.html', 'wb').write(raw.encode('utf-8'))
        root = parse(raw)
        if '/interactive/' in url:
            return '<html><body><article><h1 class="headline">' + root.xpath('//h1')[0].text + '</h1><em>' \
                        + 'This article is supposed to be read in a browser' \
                            + '</em></article></body></html>'
        script = root.xpath('//script[@id="__NEXT_DATA__"]')
        if script:
            try:
                load_article_from_json(script[0].text, root)
            except JSONHasNoContent:
                cleanup_html_article(root)
        for div in root.xpath('//div[@class="lazy-image"]'):
            noscript = list(div.iter('noscript'))
            if noscript and noscript[0].text:
                img = list(parse(noscript[0].text).iter('img'))
                if img:
                    p = noscript[0].getparent()
                    idx = p.index(noscript[0])
                    p.insert(idx, p.makeelement('img', src=img[0].get('src')))
                    p.remove(noscript[0])
        for x in root.xpath('//*[name()="script" or name()="style" or name()="source" or name()="meta"]'):
            x.getparent().remove(x)
        # the economist uses <small> for small caps with a custom font
        for x in root.xpath('//small'):
            if x.text and len(x) == 0:
                x.text = x.text.upper()
                x.tag = 'span'
                x.set('style', 'font-variant: small-caps')
        for x in root.xpath('//figcaption'):
            x.set('style', 'text-align:center; font-size:small;')
        for x in root.xpath('//cite'):
            x.tag = 'blockquote'
            x.set('style', 'color:#404040;')
        raw = etree.tostring(root, encoding='unicode')
        return raw

    def publication_date(self):
        if edition_date:
            return parse_only_date(edition_date, as_utc=False)
        url = self.browser.open("https://www.economist.com/printedition").geturl()
        return parse_only_date(url.split("/")[-1], as_utc=False)

    def parse_index(self):
        # return [('Articles', [{'title':'test',
        #     'url':'https://www.economist.com/interactive/briefing/2022/06/11/huge-foundation-models-are-turbo-charging-ai-progress'
        # }])]
        if edition_date:
            url = 'https://www.economist.com/weeklyedition/' + edition_date
            self.timefmt = ' [' + edition_date + ']'
        else:
            url = 'https://www.economist.com/printedition'
        # raw = open('/t/raw.html').read()
        raw = self.index_to_soup(url, raw=True)
        # with open('/t/raw.html', 'wb') as f:
        #     f.write(raw)
        soup = self.index_to_soup(raw)
        # nav = soup.find(attrs={'class':'navigation__wrapper'})
        # if nav is not None:
        #     a = nav.find('a', href=lambda x: x and '/printedition/' in x)
        #     if a is not None:
        #         self.log('Following nav link to current edition', a['href'])
        #         soup = self.index_to_soup(process_url(a['href']))
        ans = self.economist_parse_index(soup)
        if not ans:
            raise NoArticles(
                'Could not find any articles, either the '
                'economist.com server is having trouble and you should '
                'try later or the website format has changed and the '
                'recipe needs to be updated.'
            )
        return ans

    def economist_parse_index(self, soup):
        script_tag = soup.find("script", id="__NEXT_DATA__")
        if script_tag is not None:
            data = json.loads(script_tag.string)
            # open('/t/raw.json', 'w').write(json.dumps(data, indent=2, sort_keys=True))
            # self.title = 'The Economist | ' + safe_dict(data, "props", "pageProps", "content", "image", "main", "headline")
            self.timefmt = ' [' + safe_dict(data, "props", "pageProps", "content", "datePublishedString") + ']'
            self.cover_url = safe_dict(data, "props", "pageProps", "content", "image", "main", "url", "canonical")
            self.log('Got cover:', self.cover_url)

            feeds_dict = defaultdict(list)
            for part in safe_dict(data, "props", "pageProps", "content", "hasPart", "parts"):
                section = safe_dict(part, "print", "section", "headline") or ''
                title = safe_dict(part, "headline") or ''
                url = safe_dict(part, "url", "canonical") or ''
                if not section or not title or not url:
                    continue
                desc = safe_dict(part, "description") or ''
                sub = safe_dict(part, "subheadline") or ''
                if sub and section != sub:
                    desc = sub + ' :: ' + desc
                feeds_dict[section].append({"title": title, "url": url, "description": desc})
                self.log(' ', title, url, '\n   ', desc)
            return [(section, articles) for section, articles in feeds_dict.items()]
        else:
            return []

    def eco_find_image_tables(self, soup):
        for x in soup.findAll('table', align=['right', 'center']):
            if len(x.findAll('font')) in (1, 2) and len(x.findAll('img')) == 1:
                yield x

    def postprocess_html(self, soup, first):
        for img in soup.findAll('img', srcset=True):
            del img['srcset']
        for table in list(self.eco_find_image_tables(soup)):
            caption = table.find('font')
            img = table.find('img')
            div = new_tag(soup, 'div')
            div['style'] = 'text-align:left;font-size:70%'
            ns = NavigableString(self.tag_to_string(caption))
            div.insert(0, ns)
            div.insert(1, new_tag(soup, 'br'))
            del img['width']
            del img['height']
            img.extract()
            div.insert(2, img)
            table.replaceWith(div)
        return soup

    def canonicalize_internal_url(self, url, is_link=True):
        if url.endswith('/print'):
            url = url.rpartition('/')[0]
        return BasicNewsRecipe.canonicalize_internal_url(self, url, is_link=is_link)
PK�X�C��economist_world_ahead.png�PNG


IHDR  D����PLTE��������	����������VS����������������tr�#��������	��_^��������������	��������][�����		�������������`^��	�������^\����}�TR�HF����	��XU�qo�KH��*(��������������da�\[�ig�oo��30�,*�0-����YU����US��		�MK� �{y����jh�32�����-,�``���������������HE�JF������	��������vt򣢉d7�2IDATx�͒�z�@�3:�ql��m۶m�o^�3�mח�̿�&�'�S����!��(�Z�Y�_y�By&�PO��U�U����9h��Lօ%�w�b`�������"h�9� ��.GY�1@O@�c�g�p4 ��ԙ@U��4]S�,�y��edb��2:�n��&�C��N�,�`phX�d��������TR����Y��4�:H�)�0�/�,䇉�qY2�D�e�_rF&�+ª����͟m�m?`gwo��!��K�#����u�&x�y�~R�z��W%f�'=��+�|�7IEND�B`�PK�X���/�0�0economist_world_ahead.recipe#!/usr/bin/env  python
# License: GPLv3 Copyright: 2008, Kovid Goyal <kovid at kovidgoyal.net>

import json
from html5_parser import parse
from lxml import etree

from calibre import replace_entities
from calibre.ebooks.BeautifulSoup import NavigableString, Tag
from calibre.web.feeds.news import BasicNewsRecipe


def E(parent, name, text='', **attrs):
    ans = parent.makeelement(name, **attrs)
    ans.text = text
    parent.append(ans)
    return ans


def process_node(node, html_parent):
    ntype = node.get('type')
    if ntype == 'tag':
        c = html_parent.makeelement(node['name'])
        c.attrib.update({k: v or '' for k, v in node.get('attribs', {}).items()})
        html_parent.append(c)
        for nc in node.get('children', ()):
            process_node(nc, c)
    elif ntype == 'text':
        text = node.get('data')
        if text:
            text = replace_entities(text)
            if len(html_parent):
                t = html_parent[-1]
                t.tail = (t.tail or '') + text
            else:
                html_parent.text = (html_parent.text or '') + text


def safe_dict(data, *names):
    ans = data
    for x in names:
        ans = ans.get(x) or {}
    return ans


class JSONHasNoContent(ValueError):
    pass


def load_article_from_json(raw, root):
    # open('/t/raw.json', 'w').write(raw)
    try:
        data = json.loads(raw)['props']['pageProps']['content']
    except KeyError as e:
        raise JSONHasNoContent(e)
    if isinstance(data, list):
        data = data[0]
    body = root.xpath('//body')[0]
    for child in tuple(body):
        body.remove(child)
    article = E(body, 'article')
    E(article, 'h4', data['subheadline'], style='color: red; margin: 0')
    E(article, 'h1', data['headline'], style='font-size: x-large')
    E(article, 'div', data['description'], style='font-style: italic; color: #202020;')
    E(article, 'div', (data['datePublishedString'] or '') + ' | ' + (data['dateline'] or ''), style='color: gray; margin: 1em')
    main_image_url = safe_dict(data, 'image', 'main', 'url').get('canonical')
    if main_image_url:
        div = E(article, 'div')
        try:
            E(div, 'img', src=main_image_url)
        except Exception:
            pass
    for node in data.get('text') or ():
        process_node(node, article)


def cleanup_html_article(root):
    main = root.xpath('//main')[0]
    body = root.xpath('//body')[0]
    for child in tuple(body):
        body.remove(child)
    body.append(main)
    main.set('id', '')
    main.tag = 'article'
    for x in root.xpath('//*[@style]'):
        x.set('style', '')
    for x in root.xpath('//button'):
        x.getparent().remove(x)


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class NoArticles(Exception):
    pass


def process_url(url):
    if url.startswith('/'):
        url = 'https://www.economist.com' + url
    return url


class Economist(BasicNewsRecipe):

    title = 'The Economist World Ahead'
    language = 'en'
    encoding = 'utf-8'

    __author__ = "Kovid Goyal"
    description = (
        'The World Ahead is The Economist’s future-gazing publication. It prepares audiences for what is to '
        'come with mind-stretching insights and expert analysis—all in The Economist’s clear, elegant style.'
        ' Best downloaded in late November.'
    )
    extra_css = '''
        .headline {font-size: x-large;}
        h2 { font-size: small;  }
        h1 { font-size: medium;  }
        em.Bold {font-weight:bold;font-style:normal;}
        em.Italic {font-style:italic;}
        p.xhead {font-weight:bold;}
        .pullquote {
            float: right;
            font-size: larger;
            font-weight: bold;
            font-style: italic;
            page-break-inside:avoid;
            border-bottom: 3px solid black;
            border-top: 3px solid black;
            width: 228px;
            margin: 0px 0px 10px 15px;
            padding: 7px 0px 9px;
        }
        .flytitle-and-title__flytitle {
            display: block;
            font-size: smaller;
            color: red;
        }
        img {display:block; margin:0 auto;}
        '''
    oldest_article = 7.0
    resolve_internal_links = True
    remove_tags = [
        dict(name=['script', 'noscript', 'title', 'iframe', 'cf_floatingcontent', 'aside', 'footer']),
        dict(attrs={'aria-label': "Article Teaser"}),
        dict(attrs={
                'class': [
                    'dblClkTrk', 'ec-article-info', 'share_inline_header',
                    'related-items', 'main-content-container', 'ec-topic-widget',
                    'teaser', 'blog-post__bottom-panel-bottom', 'blog-post__comments-label',
                    'blog-post__foot-note', 'blog-post__sharebar', 'blog-post__bottom-panel',
                    'newsletter-form','share-links-header','teaser--wrapped', 'latest-updates-panel__container',
                    'latest-updates-panel__article-link','blog-post__section'
                ]
            }
        ),
        dict(attrs={
                'class': lambda x: x and 'blog-post__siblings-list-aside' in x.split()}),
        classes(
            'share-links-header teaser--wrapped latest-updates-panel__container'
            ' latest-updates-panel__article-link blog-post__section newsletter-form blog-post__bottom-panel'
        )
    ]
    keep_only_tags = [dict(name='article', id=lambda x: not x)]
    no_stylesheets = True
    remove_attributes = ['data-reactid', 'width', 'height']
    # economist.com has started throttling after about 60% of the total has
    # downloaded with connection reset by peer (104) errors.
    delay = 1

    needs_subscription = False

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            # Reduce image sizes to get file size below amazon's email
            # sending threshold
            self.web2disk_options.compress_news_images = True
            self.web2disk_options.compress_news_images_auto_size = 5
            self.log.warn('Kindle Output profile being used, reducing image quality to keep file size below amazon email threshold')


    def get_browser(self, *args, **kwargs):
        # Needed to bypass cloudflare
        kwargs['user_agent'] = 'common_words/based'
        br = BasicNewsRecipe.get_browser(self, *args, **kwargs)
        br.addheaders += [('Accept-Language', 'en-GB,en-US;q=0.9,en;q=0.8')]
        return br

    def preprocess_raw_html(self, raw, url):
        # open('/t/raw.html', 'wb').write(raw.encode('utf-8'))
        root = parse(raw)
        if '/interactive/' in url:
            return '<html><body><article><h1 class="headline">' + root.xpath('//h1')[0].text + '</h1><em>' \
                        + 'This article is supposed to be read in a browser' \
                            + '</em></article></body></html>'
        script = root.xpath('//script[@id="__NEXT_DATA__"]')
        if script:
            try:
                load_article_from_json(script[0].text, root)
            except JSONHasNoContent:
                cleanup_html_article(root)
        for div in root.xpath('//div[@class="lazy-image"]'):
            noscript = list(div.iter('noscript'))
            if noscript and noscript[0].text:
                img = list(parse(noscript[0].text).iter('img'))
                if img:
                    p = noscript[0].getparent()
                    idx = p.index(noscript[0])
                    p.insert(idx, p.makeelement('img', src=img[0].get('src')))
                    p.remove(noscript[0])
        for x in root.xpath('//*[name()="script" or name()="style" or name()="source" or name()="meta"]'):
            x.getparent().remove(x)
        # the economist uses <small> for small caps with a custom font
        for x in root.xpath('//small'):
            if x.text and len(x) == 0:
                x.text = x.text.upper()
                x.tag = 'span'
                x.set('style', 'font-variant: small-caps')
        for x in root.xpath('//figcaption'):
            x.set('style', 'text-align:center; font-size:small;')
        for x in root.xpath('//cite'):
            x.tag = 'blockquote'
            x.set('style', 'color:#404040;')
        raw = etree.tostring(root, encoding='unicode')
        return raw

    def parse_index(self):
        # return [('Articles', [{'title':'test',
        #     'url':'https://www.economist.com/interactive/briefing/2022/06/11/huge-foundation-models-are-turbo-charging-ai-progress'
        # }])]
        url = 'https://www.economist.com/the-world-ahead'
        # raw = open('/t/raw.html').read()
        raw = self.index_to_soup(url, raw=True)
        # with open('/t/raw.html', 'wb') as f:
        #     f.write(raw)
        soup = self.index_to_soup(raw)
        # nav = soup.find(attrs={'class':'navigation__wrapper'})
        # if nav is not None:
        #     a = nav.find('a', href=lambda x: x and '/printedition/' in x)
        #     if a is not None:
        #         self.log('Following nav link to current edition', a['href'])
        #         soup = self.index_to_soup(process_url(a['href']))
        ans = self.economist_parse_index(soup)
        if not ans:
            raise NoArticles(
                'Could not find any articles, either the '
                'economist.com server is having trouble and you should '
                'try later or the website format has changed and the '
                'recipe needs to be updated.'
            )
        return ans

    def economist_parse_index(self, soup):
        script_tag = soup.find("script", id="__NEXT_DATA__")
        if script_tag is not None:
            data = json.loads(script_tag.string)
            # open('/t/raw.json', 'w').write(json.dumps(data, indent=2, sort_keys=True))
            self.title = safe_dict(data, "props", "pageProps", "content", "headline")
            # self.cover_url = 'https://mma.prnewswire.com/media/2275620/The_Economist_The_World_Ahead_2024.jpg?w=600'

            feeds = []

            for coll in safe_dict(data, "props", "pageProps", "content", "collections"):
                section = safe_dict(coll, "headline") or ''
                self.log(section)
                articles = []
                for part in safe_dict(coll, "hasPart", "parts"):
                    title = safe_dict(part, "headline") or ''
                    url = safe_dict(part, "url", "canonical") or ''
                    if not title or not url:
                        continue
                    desc = safe_dict(part, "description") or ''
                    sub = safe_dict(part, "subheadline") or ''
                    if sub:
                        desc = sub + ' :: ' + desc
                    self.log('\t', title, '\n\t', desc, '\n\t\t', url)
                    articles.append({'title': title, 'description':desc, 'url': url})
                if articles:
                    feeds.append((section, articles))
            return feeds

    def eco_find_image_tables(self, soup):
        for x in soup.findAll('table', align=['right', 'center']):
            if len(x.findAll('font')) in (1, 2) and len(x.findAll('img')) == 1:
                yield x

    def postprocess_html(self, soup, first):
        for img in soup.findAll('img', srcset=True):
            del img['srcset']
        for table in list(self.eco_find_image_tables(soup)):
            caption = table.find('font')
            img = table.find('img')
            div = new_tag(soup, 'div')
            div['style'] = 'text-align:left;font-size:70%'
            ns = NavigableString(self.tag_to_string(caption))
            div.insert(0, ns)
            div.insert(1, new_tag(soup, 'br'))
            del img['width']
            del img['height']
            img.extract()
            div.insert(2, img)
            table.replaceWith(div)
        return soup

    def canonicalize_internal_url(self, url, is_link=True):
        if url.endswith('/print'):
            url = url.rpartition('/')[0]
        return BasicNewsRecipe.canonicalize_internal_url(self, url, is_link=is_link)
PK�X���GGecotrend.png�PNG


IHDR��h6IDAT}�]KQ��sfv]w��-�5��2����@�(
�}���1�,�� �M� Ht�L/Lr���y93O9yW��Q�~��$D�@H��Å+�bA)�F8""�<_��V��}o��F����J噙f�D��m�uo���i���X��QlS��4N�؈���4�I�y{|r�(c�0$��
+�B���{��������E�P���e�M���WA�i4�;��c�5��o\yE?�v�Ý�ˏ���B�0GIb�T������Z���~��Sp�@D�@).]�Q���g{^;�u�1�F�L9�~c&ct��csF��FG/�N'I�B�B��<o���*�N^�[�ԪCӝ�Fwo��+�4D$����}rO5����[ա�w�&nf��4rY&]? �N�mj����𙙠��}?BNA�T*�}�t~(����Qo�f�q'�H�
�d2??��U�	��3A[���u �O�ތ~p��G��YIEND�B`�PK�X9K�8NNecotrend.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
globaleconomicanalysis.blogspot.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class GlobalEconomicAnalysis(BasicNewsRecipe):
    title = "Mish's Global Economic Trend Analysis"
    __author__ = 'Darko Miletic'
    description = 'Thoughts on the global economy, housing, gold, silver, interest rates, oil, energy, China, commodities, the  dollar, Euro, Renminbi, Yen, inflation, deflation, stagflation, precious metals, emerging markets, and policy decisions that affect the global markets.'  # noqa
    publisher = 'Mike Shedlock'
    category = 'news, politics, economy, banking'
    oldest_article = 7
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = True
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'blog'
    masthead_url = 'http://www.pagina12.com.ar/commons/imgs/logo-home.gif'
    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
    }

    remove_tags = [
        dict(name=['meta', 'link', 'iframe', 'object', 'embed']), dict(
            attrs={'class': 'blogger-post-footer'})
    ]
    remove_attributes = ['border']

    feeds = [
        (u'Articles', u'http://feeds2.feedburner.com/MishsGlobalEconomicTrendAnalysis')]
PK�X�1�xxecuisine.png�PNG


IHDR�a?IDATx�c@w#�������_(>
�b$������l*��g#��ۖ���O�7����Y��w��_?���h��5e@�,�'B�iM<܀oW�`�TȀtɇ�^����$\�����M���p�,��e�i�?�H�m���)<���b3�%�l����+�TDbS�d�e<�7�qY86�� 
�1�A�+6�"�<��x7�L�[3�D������j�^�%��h���(�@��uE�I9�t%0�AI�aq�X3ӓ���e_��X����	���@쀜�04˦�A ~�Pv
���@\]ըIEND�B`�PK�X��U�ZZecuisine.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
ecuisine.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class EcuisineRo(BasicNewsRecipe):
    title = u'eCuisine'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Reinventeaz\u0103 pl\u0103cerea de a g\u0103ti'
    publisher = 'eCuisine'
    oldest_article = 50
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Retete,Bucatarie'
    encoding = 'utf-8'
    cover_url = 'http://www.ecuisine.ro/sites/all/themes/ecuisine/images/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h1', attrs={'id': 'page-title'}
             ), dict(name='div', attrs={'class': 'field-item even'})
    ]

    remove_tags = [
        dict(name='ul', attrs={'id': ['recipe-tabs']}), dict(name='div', attrs={'class': ['recipe-body-rating clearfix']}), dict(name='div', attrs={'class': ['recipe-body-flags']}), dict(name='div', attrs={'id': ['tweetmeme_button']}), dict(name='div', attrs={ 'class': ['fbshare']}), dict(name='a', attrs={'class': ['button-rounded']}), dict(name='div', attrs={'class': ['recipe-body-related']}), dict(name='div', attrs={'class': ['fbshare']}), dict(name='div', attrs={'class': ['link-wrapper']})  # noqa
    ]

    feeds = [
        (u'Feeds', u'http://www.ecuisine.ro/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XY�ٻ�
edebistan.png�PNG


IHDR��h6�IDAT�M��U����ț0�XbV� 8�A��Vnu���U�BZ�ZL��6�+W�?�Vbt��G�����~�s�'��h\
"R1��!�JQ�{o�tک�Ƈh�3TT���Y�	�{5֓�K/w�p��kHUI��d�,kkY�r�x���:w{��Q>uf�vv�O[NEhX
+�f��g��xs�\x�{$��y���_<�5�8G�2�U��[N_�9�/��L��Y�oQW���7�p#��a�G�v�Q)��ٿ�>����⯃4��DZ�Xu�:|���Y�z/����$��V�	Q��xRݻ��#�!�"��ҽ�ͮ�|b�]=���M��
M_�}�d�<��|C�ZA C�K����&��A���*؈u g
4�i�&�X|�?�4QX�$1p�o�BE�?w�����
1kI;����v�^]{��c�
��@��h�6¿��{+Q�&�I[_����ꫧ�����+�`�yk��œa4�
19��Vt�'�B��?\p�~RBY�"눭�ܕ�ӗ������h/o͊��z	�����?ϪR��;����O;���
��BjǨ�e]�q=7k�̣�B�����[�1�HiT
T!�&��	����B�P���^��4�IEND�B`�PK�X��3bbedebistan.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1390492898(BasicNewsRecipe):
    title = u'Edebistan'
    __author__ = 'asalet_r'
    language = 'tr'
    oldest_article = 7
    max_articles_per_feed = 30
    auto_cleanup = True

    feeds = [(u'Edebistan', u'http://www.edebistan.com/index.php/feed/')]
PK�XK�ឆ�edebiyat_haber.png�PNG


IHDR��h6MIDATx�c�J�Kb▖�������4 ������݋�M
@9�hD�a�L"ECI��`�����F�Q���?�w����IEND�B`�PK�X������edebiyat_haber.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1420467110(AutomaticNewsRecipe):
    title = 'Edebiyat Haber'
    language = 'tr'
    __author__ = 'asalet_r'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('Edebiyat Haber', 'http://feeds.feedburner.com/feedburner/edebiyathaber'),
    ]
PK�X�"4��edge_conversations.png�PNG


IHDR  ��tRNSn��	pHYs���IDATH��ӡ
�@��/
���d1�({
A0�ҲUP�`_@�ࣚ��0�}���I�$I����@ K[|�('�8��E��1
�������Q�@x
�l�rf�"n���“;G����%'�ر��б�I�G�(��2����?xP��/�%IEND�B`�PK�X�|yJ��edge_conversations.recipe__license__ = 'GPL v3'
__copyright__ = '2012 Levien van Zon <levien@zonnetjes.net>'

'''
Fetch Edge.org conversations
'''
from calibre.web.feeds.news import BasicNewsRecipe


class EdgeConversationRSS(BasicNewsRecipe):
    title = u'Edge.org Conversations'
    __author__ = 'levien'
    language = 'en'
    description = '''Edge.org offers "open-minded, free ranging, intellectually
    playful ... an unadorned pleasure in curiosity, a collective expression of
    wonder at the living and inanimate world ... an ongoing and thrilling
    colloquium.'''
    oldest_article = 60
    max_articles_per_feed = 100
    no_stylesheets = True
    auto_cleanup = True

    feeds = [(u'Edge RSS', u'http://edge.org/feed')]
PK�Xa�nƤ�editor_and_publisher.png�PNG


IHDR  ��kIDATx^}�Is�H�S��U媲
L@pb~�D��q��:b��q�V�J��eʘ蘘ײJ��M��h���	J�;X!a-ڰյ�T��DJ��`E�B��
�rZk������h�&��'��'t�#�b������~�T��aT���7�����z^�(�Z�=�\?lt���b#k.%H�]k޼�pª��(2:T�n軮����~q�ʅ�	���c!Z�#D���FGZh'��d4�`B�T腣�qh��~���3v{;��B����w����{V۲��~;���ms�껊WO?�a�?�X��x�,�8UY"7s��z���ƬV��4M�����	51ڮ���ڶ������B=��g������������OY��:I�(4Q2�%��q��Չ������6qJHonn�b�\��$@�.q$�x,?�������uU�Q��	����x8��S�;t�_�uUB��_>���˗�u]7u��O����ӟM� :��P9Pmmj|β<+�����v��:DIJ޺�!7뛛�˫�o������|N$֛ۏ?Fq���/�<�X�J��h~2�����4+2
5X���Ͷ�����ɳgY^���v���*ù\,5��|�X�<�1�kZ,P��4I0�.���fy��`��a����>x�v��뫪�ڮ[.�i��vj���(I���Ǐ��Β8qEa���s�@_]^�|��4���m뚊Ƴ��dw�i�]��ͦv�?;;���=�e&�7M���ϟ��_`��>�c4ɠ�o��p�C}�p/N�b�1j�Ƭ(�*f�y1�o�;������ѣGgg���gad�P����86@k��<}Z9����߾}k��t��4�e�Vr�,!\M�7mGX��f��ň�2�G�	}��MSJ��t�� ������(L�L��Ѿ� ���+�5
#�1/
zS9��萹J��� BI;�93@Q�%�Ӑ��͆�l�	z; ��xf��8�q�K� ݥlo�> 8�\���b���9Nʟ)~<�TW�4�Kes�J-\9�C<�����ɡ6�b޾���K�F�(�4I84*��I	4�Lg�5T�@#�MSE	�O�ť� p_-�|p�7��"��ġ��-�cit�aBQ���3\��̧��MА�^�9Y�Q�iFT��@߅b�F=cM�њ��8�V(���n����^�f��>jX�3s*)#N1�R��q����3Z�R�3B�q�s�_4E�t�M5�޽�/�y��)�,1��Y��e#���hcḰ���.7�f�ct8�j��?��j���\��e�۾��6�ط������@�k��"�'�~@��8e�����y{q��,��`�������+Y��kϱ�"\�7{wh��'i�Ȟ��W4�Ht�#��:�ZG#JV�I�
��(S�@��
5އQ�����ʩ����F�aɐ��c�����݆O�?����gt�*u8��1
ņ=�^��������]�4��)�	�o�;����7uĚ���1�W����&���RrtD5p�zzg���"����t���֧��N��(F�d~z�y�g�h�M��1�H,\0���ʼ����%V�4%�IEND�B`�PK�X����editor_and_publisher.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2010 elsuave'

from calibre.web.feeds.news import BasicNewsRecipe


class EandP(BasicNewsRecipe):
    title = u'Editor and Publisher'
    __author__ = u'elsuave (modified from Xanthan Gum)'
    description = 'News about newspapers and journalism.'
    publisher = 'Editor and Publisher'
    category = 'news, journalism, industry'
    language = 'en'
    max_articles_per_feed = 25
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    cover_url = 'http://www.editorandpublisher.com/images/EP_main_logo.gif'
    remove_javascript = True
    auto_cleanup = True

    html2lrf_options = [
        '--comment', description,
        '--category', category,
        '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    # Font formatting code borrowed from kwetal

    extra_css = '''
                 body{font-family:verdana,arial,helvetica,geneva,sans-serif ;}
                 h1{font-size: xx-large;}
                 h2{font-size: large;}
                '''

    # Remove commenting/social media lins

    remove_tags_after = [dict(name='div', attrs={'class': 'clear'})]

    feeds = [
        (u'Editor & Publisher', u'http://www.editorandpublisher.com/feed/'),
        (u'Comments', u'http://www.editorandpublisher.com/comments/feed/'),
    ]
PK�X��|NNeditoriali.png�PNG


IHDR�aIDATx�c�O!6�0j��]x�.y3�IEND�B`�PK�X1�!5QQeditoriali.recipe__version__ = 'v1.0'
__date__ = '7, April 2012'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1332847053(BasicNewsRecipe):
    title = u'Editoriali'
    __author__ = 'faber1971'
    description = 'Leading articles on Italy by the best Italian editorials'
    language = 'it'

    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True
    conversion_options = {'linearize_tables': True}
    masthead_url = 'http://folkbulletin.folkest.com/wp-content/uploads/editoriale1.jpg'
    feeds = [(u'Micromega', u'http://temi.repubblica.it/micromega-online/feed/'), (u'Corriere della Sera', u'http://xml.corriereobjects.it/rss/editoriali.xml'),
             (u'La Stampa', u'http://www.lastampa.it/cmstp/rubriche/oggetti/rss.asp?ID_blog=25'), (u"Italia dall'estero", u'http://italiadallestero.info/feed')]
PK�X�Y�<<edmonton_journal.png�PNG


IHDR  ��tRNSn���IDATH���OSA�k|�hH4�o&.��@��bP�
TJ�AQ��b�ZP�HWZ�v�e�!
ܕ�l��Yg��c��o$���3s��|�;iӅԂ�rx���u7���k���6����`�����4��m
Sn��,
�H�@l�ё[���t�0��>ٙ]):�d|����P+M��0[o������,`����2k"+W�4ly�Ȇ�w�kb&�q�y
�êݞLٸ&z4}�d��-�<~?�o�H�p���TV#�+e�2��F��LV~Q�5�D]��)�7y�p�NxRO�>J
�i6�ӬSS����ʯ!c7���x�YXi,�2��*i��9��#@{�p>b��.�Tv�'u�\��|�
�Tv�l]���#���39Va��^Lx�e^}U�`�zt��UW�XA��p\�xM:��V o�����mZf�c�v-r^�^V�`����V����|Y�d�0X�c63F�JS��[Q@r�#=Z�(~uֻ��ث��=�4��Ȭ	�9�Vi��(,TCY�mѣ�p�N��yue��3��f�I��^>���
Jh�St�pк=�JR#�Ȯ�F]�["�&��P
�T����GǢ#��Y������7�D�jȐ�͈�Ї�@�;sh�ɑ���Y!^i�y�_ޚ�"!Q$���e�:��ro5U����ѵ��C�
����Z1b��n��,WS��˝�������!P(,X�IEND�B`�PK�X����3�3edmonton_journal.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
__license__ = 'GPL v3'

'''
www.canada.com
'''
import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class CanWestPaper(BasicNewsRecipe):

    postmedia_index_pages = [
        (u'Headlines', u'/index.html'),
        (u'Ottawa & Area', u'/news/ottawa/index.html'),
        (u'Vancouver', u'/news/vancouver/index.html'),
        (u'Calgary', u'/news/calgary/index.html'),
        (u'Edmonton', u'/news/edmonton/index.html'),
        (u'Montreal', u'/news/montreal/index.html'),
        (u'Fraser Valley', u'/news/fraser-valley/index.html'),
        (u'British Columbia', u'/news/bc/index.html'),
        (u'Alberta', u'/news/alberta/index.html'),
        (u'Canada', u'/news/canada/index.html'),
        (u'National', u'/news/national/index.html'),
        (u'Politics', u'/news/politics/index.html'),
        (u'Insight', u'/news/insight/index.html'),
        (u'Special Reports', u'/news/specialreports/index.html'),
        (u'Gangs', u'/news/gangs/index.html'),
        (u'Education', u'/news/education/index.html'),
        (u'Health', u'/news/health/index.html'),
        (u'Environment', u'/news/environment/index.html'),
        (u'World', u'/news/world/index.html'),
        (u'Police Blotter', u'/news/crime-and-justice/index.html'),
        (u'Crime', u'/news/blotter/index.html'),
        (u'Around Town', u'/news/topic.html?t=keyword&q=Around+Town'),
        (u'Diplomatica', u'/news/diplomatica/index.html'),
        (u'Opinion', u'/opinion/index.html'),
        (u'Columnists', u'/columnists/index.html'),
        (u'Editorials', u'/opinion/editorials/index.html'),
        (u'Letters', u'/opinion/letters/index.html'),
        (u'Business', u'/business/index.html'),
        (u'Sports', u'/sports/index.html'),
        (u'Arts', u'/entertainment/index.html'),
        (u'Life', u'/life/index.html'),
        (u'Technology', u'/technology/index.html'),
        (u'Travel', u'/travel/index.html'),
        (u'Health', u'/health/index.html')
    ]

    # un-comment the following six lines for the Vancouver Province
    # title = u'Vancouver Province'
    # url_prefix = 'http://www.theprovince.com'
    # description = u'News from Vancouver, BC'
    # std_logo_url = 'http://www.theprovince.com/images/logo_theprovince.jpg'
    # logo_url = 'vplogo.jpg'
    # fp_tag = 'CAN_TP'

    # un-comment the following six lines for the Vancouver Sun
    # title = u'Vancouver Sun'
    # url_prefix = 'http://www.vancouversun.com'
    # description = u'News from Vancouver, BC'
    # std_logo_url = 'http://www.vancouversun.com/images/logo_vancouversun.jpg'
    # logo_url = 'vslogo.jpg'
    # fp_tag = 'CAN_VS'

    # un-comment the following six lines for the Calgary Herald
    # title = u'Calgary Herald'
    # url_prefix = 'http://www.calgaryherald.com'
    # description = u'News from Calgary, AB'
    # std_logo_url = 'http://www.calgaryherald.com/images/logo_calgaryherald.jpg'
    # logo_url = 'chlogo.jpg'
    # fp_tag = 'CAN_CH'

    # un-comment the following six lines for the Edmonton Journal
    title = u'Edmonton Journal'
    url_prefix = 'http://www.edmontonjournal.com'
    description = u'News from Edmonton, AB'
    std_logo_url = 'http://www.edmontonjournal.com/images/logo_edmontonjournal.jpg'
    logo_url = 'ejlogo.jpg'
    fp_tag = 'CAN_EJ'

    # un-comment the following six lines for the Ottawa Citizen
#     title = u'Ottawa Citizen'
#     url_prefix = 'http://www.ottawacitizen.com'
#     description = u'News from Ottawa, ON'
#     std_logo_url = 'http://www.ottawacitizen.com/images/logo_ottawacitizen.jpg'
#     logo_url = 'oclogo.jpg'
#     fp_tag = 'CAN_OC'

    # un-comment the following six lines for the Montreal Gazette
#     title = u'Montreal Gazette'
#     url_prefix = 'http://www.montrealgazette.com'
#     description = u'News from Montreal, QC'
#     std_logo_url = 'http://www.montrealgazette.com/images/logo_montrealgazette.jpg'
#     logo_url = 'mglogo.jpg'
#     fp_tag = 'CAN_MG'

    Kindle_Fire = False
    masthead_url = std_logo_url

    url_list = []
    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    encoding = 'utf-8'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: small;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                .photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                #photocredit { font-size: xx-small; font-weight: normal; }'''

    keep_only_tags = [dict(name='div', attrs={'id': re.compile('story')})]

    remove_tags = [{'class': 'comments'}, {'class': 'comment-intro'}, {'class': 'storytab'},
                   dict(name='div', attrs={'class': 'section_title'}), dict(name='div', attrs={'class': 'sharebar'}), dict(
                       name='div', attrs={'class': 'navbar'}), dict(name='div', attrs={'class': 'morelinks'}),
                   dict(name='h2', attrs={'id': 'photocredit'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='div', attrs={'id': 'soundoff'}),
                   dict(name='div', attrs={'id': re.compile('flyer')}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def get_cover_url(self):
        from datetime import timedelta, date
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        # delete empty id attributes--they screw up the TOC for unknown reasons
        divtags = soup.findAll('div', attrs={'id': ''})
        if divtags:
            for div in divtags:
                del(div['id'])

        pgall = soup.find('div', attrs={'id': 'storyphoto'})
        if pgall is not None:  # photo gallery perhaps
            if (soup.find('div', attrs={'id': 'storycontent'}) is None):
                allpics = new_tag(soup, 'div')
                first_img = pgall.find('div', 'storyimage')
                if first_img is not None:
                    first_img.extract()
                    tlist = pgall.find('div', attrs={'id': 'relatedthumbs'})
                    if tlist is not None:
                        for atag in tlist.findAll('a'):
                            img = new_tag(soup, 'img')
                            srcpre, sep, srcpost = atag.img[
                                'src'].partition('?')
                            img['src'] = srcpre
                            pdesc = new_tag(soup, 'p')
                            pdesc.insert(0, atag.img['alt'])
                            pdesc['class'] = 'photocaption'
                            div = new_tag(soup, 'div')
                            div.insert(0, pdesc)
                            div.insert(0, img)
                            allpics.append(div)
                pgall.replaceWith(allpics)

        for pg in soup.findAll('div', attrs={'id': 'storyphoto'}):
            pg.extract()
        return self.strip_anchors(soup)

    def parse_index(self):

        articles = {}
        ans = []

        def handle_article(adiv, key):
            if adiv.name == 'h1' or adiv.name == 'h3':
                h1tag = adiv
            else:
                h1tag = adiv.h1
                if h1tag is None:
                    h1tag = adiv.h3
            if h1tag is not None:
                atag = h1tag.a
                if atag is not None:
                    url = atag['href']
                    if url.startswith('/'):
                        url = self.url_prefix + url
                    if not url.startswith(self.url_prefix):
                        print("Rejected " + url)
                        return
                    if url in self.url_list:
                        print("Rejected dup " + url)
                        return
                    self.url_list.append(url)
                    title = self.tag_to_string(atag, False)
                    if 'VIDEO' in title.upper():
                        return
                    if 'GALLERY' in title.upper():
                        return
                    if 'PHOTOS' in title.upper():
                        return
                    dtag = adiv.find('div', 'content')
                    description = ''
                    print("URL " + url)
                    print("TITLE " + title)
                    if dtag is not None:
                        stag = dtag.span
                        if stag is not None:
                            if ''.join(stag['class']) != 'timestamp':
                                description = self.tag_to_string(stag, False)
                        else:
                            description = self.tag_to_string(dtag, False)
                        print("DESCRIPTION: " + description)
                    if key not in articles:
                        articles[key] = []
                    articles[key].append(dict(
                        title=title, url=url, date='', description=description, author='', content=''))

        def parse_web_index(key, keyurl):
            print("Section: " + key + ': ' + self.url_prefix + keyurl)
            try:
                soup = self.index_to_soup(self.url_prefix + keyurl)
            except:
                print("Section: " + key + ' NOT FOUND')
                return
            ans.append(key)
            mainsoup = soup.find('div', 'bodywrapper')
            footer = mainsoup.find(attrs={'id': 'footerfeature'})
            if footer is not None:
                footer.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['genericfeature']}):
                wdiv.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['headline', 'featurecontent']}):
                handle_article(wdiv, key)

        for (k, url) in self.postmedia_index_pages:
            parse_web_index(k, url)
        ans = [(key, articles[key]) for key in ans if key in articles]
        return ans
PK�X���yy
eenadu.png�PNG


IHDR  ��tRNSn��.IDAT�ml�g�u�s��<�=��Җvm)�n�U��`���2�n�f���#K��"
���h�$�lK��2��b���e(�e�Z�Ӟ���/aI	��O�a�>�?G�o��~��0�:!%�������f�Y��bn]x���/�N]̉�Ӷ�en^Qe˔�B(�d�����ݘ����dg˳�}�D�%��:�֎����ƻ�*=�^�
sQt_�bK�n���N|v�DŽ�tWXj�ǎ����o~gMjS�����z3�h��p��
�b���94��kTS�������������VPTy፩�qK
7����3�(x���C��^�W���zo�焨���b��;0��b+\C`����avUvٮ�C�;%A(E`���
r_�"��پ���k�RsD����J9r�΃���Q"ؖ��&3�����J|X��CɖU%���$E֖嘿�2�|7����ڭosk���ݾ��<t���=o�޹�H�T��j�N�\I��B3�W�A�_9g߽��<��p�c"��]�Ɉ&�̸*���N{z��� 5���h��ܟ��h�#65Okcf��ނՐ���^����^�bĖ��(6H)A0�v8��r$"���B��
:t!���+Dֵ��$@�0���e1l%���p�\|%�yO@����޵R�$3A�exEDc�[��{�7WѺ&�:-��u�
���X�H$S���7!B��]��{ϰ$	P�@ۺM��B7CC����ϴ'w~�=3�W���
vS�@۶�tl�Z�rl�RR�gO�s��M\e	4�H+�
!��f��L}|�64�^B�-��pB�蹓^���S����w�w<dV>��ڟ����lMܖ1���%b�p�a��-���[�'R!S�bA(�
�D���Ki=]�5�lxw>��ڹ�LlL�Ց��ݰ�������A�o�5�u�ŧ�DGV4�U�+���T�Hq\��R��6Q�x���/<x�Ԅ�P�e��;�0?�Ě�.e����-��4Cg働�Mҟ�G�!��%�w5�?^��c'~�6�X��u�=�:c���Y3���,�b5mV�MZs�4j]�w�5"��m�����
@��(��&CHD�D�Q����I����O����ҐT�#{pd&��q�F
�x��<�L�9�@Y)�5H'5`*�c�|��V}��ڜ�/sѱ�`�<�K;5.I��e)\����$v��roT� 	Wi�%P�`u�������I�W���ybu���۱cbE
3H�H�z]�w�3H\H�ӷ[<�1d̀��ٹ2��� :7O��Y�X	�Hl:u�<ċ2���#�����=b:j(w�X�͐���s�jWy1�e�,���S�D�Q��}��?4C�0�Pd�����m���F� y�,��ʜi{�?�0��8y�]�4#!@��d���GԌ�F4+h	@B���(��(� 8�JbYI���"�:A~��@��I�!��d�-�N�=�����7Y�ꀏ��IEND�B`�PK�X����
eenadu.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from datetime import date, datetime, timedelta
from calibre.utils.date import parse_date
import re


class eenadu_ts(BasicNewsRecipe):
    title = 'ఈనాడు - తెలంగాణ'
    __author__ = 'unkn0wn'
    description = 'THE LARGEST CIRCULATED TELUGU DAILY'
    language = 'te'
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True
    remove_attributes = ['height', 'width', 'style']
    ignore_duplicate_articles = {'url', 'title'}
    masthead_url = 'https://dxxd96tbpm203.cloudfront.net//img/logo.png'
    cover_url = 'https://d66zsp32hue2v.cloudfront.net/Eenadu/2022/08/08/GTH/5_01/d5041804_01_mr.jpg'
    encoding = 'utf-8'
    remove_empty_feeds = True
    extra_css = '.pub-t{font-size:small; font-style:italic;}'

    keep_only_tags = [
        dict(name='h1'),
        dict(**classes('pub-t')),
        classes('fullstory text-justify contlist-cont'),
        dict(name='span', attrs={'id': 'PDSAIApbreak'}),
    ]

    remove_tags = [
        dict(name='span', attrs={'style': 'float:left; margin-right:10px;'}),
        dict(
            name='p',
            attrs={
                'style':
                'font-size: 18px !important; margin: 0px; margin-top: -15px; text-align: center;flex: 1;'
            }
        ),
        dict(name='aside', attrs={'class': lambda x: x and x.startswith('thumb')}),
        dict(name='br'),
        classes('sshare-c tags andbeyond_ad fnt20 arti more2 offset-tb1 msb-list')
    ]

    def parse_index(self):
        section_list = [
            ('తెలంగాణ తాజా వార్తలు', 'telangana'),
            ('సంపాదకీయం', 'telangana/editorial'),
            ('తెలంగాణ ప్రధానాంశాలు', 'telangana/top-news'),
            ('తెలంగాణ జిల్లా వార్తలు', 'telangana/districts'),
            # ('క్రైమ్', 'crime'),
            ('పాలిటిక్స్', 'politics'),
            ('జాతీయం', 'india'),
            ('బిజినెస్', 'business'),
            ('అంతర్జాతీయం', 'world'),
            ('క్రీడలు', 'sports'),
            # ('సినిమా', 'movies'),
            # ('చదువు', 'education'),
            # ('సుఖీభవ', 'health'),
            # ('ఈ-నాడు', 'technology'),
            # ('మకరందం', 'devotional'),
            # ('ఈ తరం', 'youth'),
            # ('ఆహా', 'recipes'),
            # ('హాయ్ బుజ్జీ', 'kids-stories'),
            # ('స్థిరాస్తి', 'real-estate'),
        ]
        is_sunday = date.today().weekday() == 6
        if is_sunday:
            section_list.append(('సండే మ్యాగజైన్', 'sunday-magazine'))
        feeds = []

        # For each section title, fetch the article urls
        for section in section_list:
            section_title = section[0]
            section_url = 'https://www.eenadu.net/' + section[1]
            self.log(section_title, section_url)
            soup = self.index_to_soup(section_url)
            articles = self.articles_from_soup(soup)
            if articles:
                feeds.append((section_title, articles))
        return feeds

    def articles_from_soup(self, soup):
        ans = []
        for link in soup.findAll(
            attrs={
                'class': ['telugu_uni_body', 'thumb-content-more', 'owl-carousel']
            }
        ):
            for a in link.findAll('a', attrs={'href': True}):
                url = a['href']
                if url.startswith('https') is False:
                    url = 'https://www.eenadu.net/' + url

                try:
                    desc = self.tag_to_string(a.find('div')).strip()
                except Exception:
                    desc = ''

                for h3 in a.findAll('h3'):
                    title = self.tag_to_string(h3).strip()
                    sub = re.escape(title)
                    desc = re.sub(sub, '', desc).strip()

                    if not title or not url:
                        continue

                    self.log('\t', title, '\n\t', desc, '\n\t\t', url)
                    ans.append({'title': title, 'url': url, 'description': desc})
        return ans

    def preprocess_html(self, soup):
        div = soup.find('div', **classes('pub-t'))
        if div:
            date = parse_date(
                self.tag_to_string(div).strip().replace('Published : ', '').replace(
                    'Updated : ', ''
                ).replace(' IST', ':00.000001')
            ).replace(tzinfo=None)
            today = datetime.now()
            if (today - date) > timedelta(1.15):
                self.abort_article('Skipping old article')
        else:
            self.abort_article('not an article')
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X���yy
eenadu_ap.png�PNG


IHDR  ��tRNSn��.IDAT�ml�g�u�s��<�=��Җvm)�n�U��`���2�n�f���#K��"
���h�$�lK��2��b���e(�e�Z�Ӟ���/aI	��O�a�>�?G�o��~��0�:!%�������f�Y��bn]x���/�N]̉�Ӷ�en^Qe˔�B(�d�����ݘ����dg˳�}�D�%��:�֎����ƻ�*=�^�
sQt_�bK�n���N|v�DŽ�tWXj�ǎ����o~gMjS�����z3�h��p��
�b���94��kTS�������������VPTy፩�qK
7����3�(x���C��^�W���zo�焨���b��;0��b+\C`����avUvٮ�C�;%A(E`���
r_�"��پ���k�RsD����J9r�΃���Q"ؖ��&3�����J|X��CɖU%���$E֖嘿�2�|7����ڭosk���ݾ��<t���=o�޹�H�T��j�N�\I��B3�W�A�_9g߽��<��p�c"��]�Ɉ&�̸*���N{z��� 5���h��ܟ��h�#65Okcf��ނՐ���^����^�bĖ��(6H)A0�v8��r$"���B��
:t!���+Dֵ��$@�0���e1l%���p�\|%�yO@����޵R�$3A�exEDc�[��{�7WѺ&�:-��u�
���X�H$S���7!B��]��{ϰ$	P�@ۺM��B7CC����ϴ'w~�=3�W���
vS�@۶�tl�Z�rl�RR�gO�s��M\e	4�H+�
!��f��L}|�64�^B�-��pB�蹓^���S����w�w<dV>��ڟ����lMܖ1���%b�p�a��-���[�'R!S�bA(�
�D���Ki=]�5�lxw>��ڹ�LlL�Ց��ݰ�������A�o�5�u�ŧ�DGV4�U�+���T�Hq\��R��6Q�x���/<x�Ԅ�P�e��;�0?�Ě�.e����-��4Cg働�Mҟ�G�!��%�w5�?^��c'~�6�X��u�=�:c���Y3���,�b5mV�MZs�4j]�w�5"��m�����
@��(��&CHD�D�Q����I����O����ҐT�#{pd&��q�F
�x��<�L�9�@Y)�5H'5`*�c�|��V}��ڜ�/sѱ�`�<�K;5.I��e)\����$v��roT� 	Wi�%P�`u�������I�W���ybu���۱cbE
3H�H�z]�w�3H\H�ӷ[<�1d̀��ٹ2��� :7O��Y�X	�Hl:u�<ċ2���#�����=b:j(w�X�͐���s�jWy1�e�,���S�D�Q��}��?4C�0�Pd�����m���F� y�,��ʜi{�?�0��8y�]�4#!@��d���GԌ�F4+h	@B���(��(� 8�JbYI���"�:A~��@��I�!��d�-�N�=�����7Y�ꀏ��IEND�B`�PK�X>��eenadu_ap.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from datetime import date, datetime, timedelta
from calibre.utils.date import parse_date
import re


class eenadu_ap(BasicNewsRecipe):
    title = 'ఈనాడు - ఆంధ్రప్రదేశ్'
    __author__ = 'unkn0wn'
    description = 'THE LARGEST CIRCULATED TELUGU DAILY'
    language = 'te'
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True
    remove_attributes = ['height', 'width', 'style']
    ignore_duplicate_articles = {'url', 'title'}
    masthead_url = 'https://dxxd96tbpm203.cloudfront.net//img/logo.png'
    cover_url = 'https://d66zsp32hue2v.cloudfront.net/Eenadu/2022/08/03/CAN/5_01/bfff5654_01_mr.jpg'
    encoding = 'utf-8'
    remove_empty_feeds = True
    extra_css = '.pub-t{font-size:small; font-style:italic;}'

    keep_only_tags = [
        dict(name='h1'),
        dict(**classes('pub-t')),
        classes('fullstory text-justify contlist-cont'),
        dict(name='span', attrs={'id': 'PDSAIApbreak'}),
    ]

    remove_tags = [
        dict(name='span', attrs={'style': 'float:left; margin-right:10px;'}),
        dict(
            name='p',
            attrs={
                'style':
                'font-size: 18px !important; margin: 0px; margin-top: -15px; text-align: center;flex: 1;'
            }
        ),
        dict(name='aside', attrs={'class': lambda x: x and x.startswith('thumb')}),
        dict(name='br'),
        classes('sshare-c tags andbeyond_ad fnt20 arti more2 offset-tb1 msb-list')
    ]

    def get_cover_url(self):
        from datetime import date
        cover = 'https://img.kiosko.net/' + str(
            date.today().year
        ) + '/' + date.today().strftime('%m') + '/' + date.today(
        ).strftime('%d') + '/in/eenadu.750.jpg'
        br = BasicNewsRecipe.get_browser(self, verify_ssl_certificates=False)
        try:
            br.open(cover)
        except:
            index = 'https://es.kiosko.net/in/np/eenadu.html'
            soup = self.index_to_soup(index)
            for image in soup.findAll('img', src=True):
                if image['src'].endswith('750.jpg'):
                    return 'https:' + image['src']
            self.log("\nCover unavailable")
            cover = None
        return cover

    def parse_index(self):
        section_list = [
            ('ఆంధ్రప్రదేశ్ తాజా వార్తలు', 'andhra-pradesh'),
            ('సంపాదకీయం', 'andhra-pradesh/editorial'),
            ('ఆంధ్రప్రదేశ్ ప్రధానాంశాలు', 'andhra-pradesh/top-news'),
            ('ఆంధ్రప్రదేశ్ జిల్లా వార్తలు', 'andhra-pradesh/districts'),
            # ('క్రైమ్', 'crime'),
            ('పాలిటిక్స్', 'politics'),
            ('జాతీయం', 'india'),
            ('బిజినెస్', 'business'),
            ('అంతర్జాతీయం', 'world'),
            ('క్రీడలు', 'sports'),
            # ('సినిమా', 'movies'),
            # ('చదువు', 'education'),
            # ('సుఖీభవ', 'health'),
            # ('ఈ-నాడు', 'technology'),
            # ('మకరందం', 'devotional'),
            # ('ఈ తరం', 'youth'),
            # ('ఆహా', 'recipes'),
            # ('హాయ్ బుజ్జీ', 'kids-stories'),
            # ('స్థిరాస్తి', 'real-estate'),
        ]
        is_sunday = date.today().weekday() == 6
        if is_sunday:
            section_list.append(('సండే మ్యాగజైన్', 'sunday-magazine'))
        feeds = []

        # For each section title, fetch the article urls
        for section in section_list:
            section_title = section[0]
            section_url = 'https://www.eenadu.net/' + section[1]
            self.log(section_title, section_url)
            soup = self.index_to_soup(section_url)
            articles = self.articles_from_soup(soup)
            if articles:
                feeds.append((section_title, articles))
        return feeds

    def articles_from_soup(self, soup):
        ans = []
        for link in soup.findAll(
            attrs={
                'class': ['telugu_uni_body', 'thumb-content-more', 'owl-carousel']
            }
        ):
            for a in link.findAll('a', attrs={'href': True}):
                url = a['href']
                if url.startswith('https') is False:
                    url = 'https://www.eenadu.net/' + url

                try:
                    desc = self.tag_to_string(a.find('div')).strip()
                except Exception:
                    desc = ''

                for h3 in a.findAll('h3'):
                    title = self.tag_to_string(h3).strip()
                    sub = re.escape(title)
                    desc = re.sub(sub, '', desc).strip()

                    if not title or not url:
                        continue

                    self.log('\t', title, '\n\t', desc, '\n\t\t', url)
                    ans.append({'title': title, 'url': url, 'description': desc})
        return ans

    def preprocess_html(self, soup):
        div = soup.find('div', **classes('pub-t'))
        if div:
            date = parse_date(
                self.tag_to_string(div).strip().replace('Published : ', '').replace(
                    'Updated : ', ''
                ).replace(' IST', ':00.000001')
            ).replace(tzinfo=None)
            today = datetime.now()
            if (today - date) > timedelta(1.15):
                self.abort_article('Skipping old article')
        else:
            self.abort_article('not an article')
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X
��a!!egedallokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X'���~~egedallokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Egedal
'''


class EgedalLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Egedal'
    description = 'Lokale, regionale nyheder, sport og kultur i Egedal, Stenløse, Ølstykke, Ganløse, Gundsø, Slangerup, Roskilde på egedal.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Egedal', 'http://egedal.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Egedal', 'http://egedal.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Egedal', 'http://egedal.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Egedal', 'http://egedal.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Egedal', 'http://egedal.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Egedal', 'http://egedal.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X��m��	egirl.png�PNG


IHDR��h6PIDATx�c�O"l����S�ϟ??~����o��G;�o?y�
o߼ٵs�I��[Z+J�c#c\��]\�;��߻����sfω���PU�������q�I���_�v�.\��]2�s��	�)�y�3������VV��EÜY�ܜ��L����獗�o��|����U�>�@�}��J@�]\^Rz��= ����w�i�X�5o�o߾��?/\�u˖}{�nX�~Ƕ�/^~�ߑ�}�t���@��~�� �^̰���I��˿��q�5�����=�@����O?U�'6i��?��,u��f5�
�x�\�S�5IEND�B`�PK�X����egirl.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
egirl.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class EgirlRo(BasicNewsRecipe):
    title = u'egirl'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Necesar pentru tine'
    publisher = u'egirl'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Femei'
    encoding = 'utf-8'
    cover_url = 'http://www.egirl.ro/images/egirlNou/logo_egirl.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'content_art'}), dict(
            name='div', attrs={'class': 'content_articol'})
    ]

    feeds = [
        (u'Feeds', u'http://www.egirl.ro/rss/egirl.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�w&���	eioba.png�PNG


IHDR(-S�PLTE8q�9q�:r�;s�;s�<s�<t�=t�=t�>t�=s�<s�Bx�By�F{�G|�K�L��N��Q��R��V��W��[��\��a��a��e��f��j��j��n��n��p��q��r��r��s��t��t��u��u��v��y��}�⁩儬抬ފ�܊�ۇ�چ�چ�܂�ۊ�ڋ�ݍ��⓴䘸曺蝼꠿왻펴여嘭嘭㗫㖫㕪匫����������������������������������������������������{��z��{��z��{��{��|��}��~��y��y��w��s��r��r��o��l��k��k��j��j��j��i��m��q��t��i��e��b��Y��V��������������J�I�I�H�H�G��F��E��D�9�8�6�5ٱDرDذBٲG�b��tRNS@��f�IDATx�=JQ��y�������Ґ؈Xyo��B��l����\�H��{�I��Z��/@�0y����-9t]�ͪ��Ʊ#�覍S�[���̜�8��v]�����ZN����]�VN�{3{N�>օS+& y�Y��m}��ʃ*�U�ij+K�n��$�Het�j��A;>��Z�8'� ��?�iI�9�IEND�B`�PK�X��??eioba.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.news import BasicNewsRecipe


class eioba(BasicNewsRecipe):
    title = u'eioba'
    __author__ = 'fenuks'
    description = u'eioba.pl - daj się przeczytać!'
    cover_url = 'http://www.eioba.org/lay/logo_pl_v3.png'
    language = 'pl'
    oldest_article = 7
    remove_empty_feeds = True
    max_articles_per_feed = 100
    extra_css = '#ctl0_body_Topic {font-weight: bold; font-size:30px;}'
    keep_only_tags = [dict(id=['ctl0_body_Topic', 'articleContent'])]
    feeds = [(u'Wszyskie kategorie', u'http://feeds.eioba.pl/eioba-pl-top'),
             (u'Technologia', u'http://www.eioba.pl/feed/categories/1.xml'),
             (u'Nauka', u'http://www.eioba.pl/feed/categories/12.xml'),
             (u'Finanse', u'http://www.eioba.pl/feed/categories/7.xml'),
             (u'Życie', u'http://www.eioba.pl/feed/categories/5.xml'),
             (u'Zainteresowania', u'http://www.eioba.pl/feed/categories/420.xml'),
             (u'Społeczeństwo', u'http://www.eioba.pl/feed/categories/8.xml'),
             (u'Rozrywka', u'http://www.eioba.pl/feed/categories/10.xml'),
             (u'Rożne', u'http://www.eioba.pl/feed/categories/9.xml')
             ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�XlX��[[
ekantipur.png�PNG


IHDR  ��tRNSn��IDATxڍVl�}"K�,E����w��)C@�`�i?�2��C���Ka昶�09�pf�:ο/<^��ѱ�ޜ���0�s�-��&�T��]��O���3#2���K@ҭ�z$��%��#P�B*G�&~�Ri�"��N�D�}|��뛼�r��%GD�/5x��Sv����蝋����-;�)��1m#К0�P�"���r��Zb+�t/~��ڢ�ٹ��N�:���h�1,��1�ԕ�e�%�p��mㅜ��){�WfK1Y�M�rJ��nY59��b[d|�%�d��X� ���}��q�to∼ �Ԗ]b�U4�������Zsˆ�E�m|�@)�_��
��}�s�3b�^�4��1;�?2i��g�j� ���R�K;�/J�g8��C ��s��e=��RK���C��>���n���ܟ^��O4�"2S��VzBj
�>΍-��5\�3ȗx=D}&���Ngvك�k�n7�ߪi�i�{�on��+������
Ś3˚cL��~I��
��%
��
sOH�٧�Vlr�>�_\�,���� 2���d>�*���|I��&T��V��)y���D:[B��S��}4���||�)�����ʣʂc��C�B�?��bL� ���\�O���B6Z��
S٦r�+3�B��3���7����o��&q�����z1��g����I��:��u�_�e~�e���f`�ą��	g/	,V'��8X�ͥ,mq���r8]�#U�.}��Ff�)���'S�O�1R�%�x�|��_w��!�\����,��X�jl�e�:,�����Es���,��Yr�����@��̶���^h�Wj�f�	�-	���K^�)��Bjt��v+����A,)bJ�?[���P"
P�@|�V`�d�-C
���V�r��n
�{~����@�d�D��d���$�;I�O���E
��ƓB�a��W�X��WK8A��'�ړ�g����\(�*h�)3F��î����龱��i���c�]C��#S�Y���vN���{F�z�'��'�î�q���t�6&yRA����!��yh}8���bC$�Dk#6��:f��q3���6�ý�W�O�l�EP����Z@�k�b��2 ��gW��\P�g��նjKl„���}�_�*��O���o����71^_F�+�G�C���4�`��m�~�Oe:o������s=����S���<�έ���4c����1�b���&s��A՛s������#k����%��M	8�քc�^��Z�lb��8�10:�]`���?,4Dj
�3Xy��"�Ɏ���/�h-�YMC��{��n~EC^ȸ��So�s8`�9���c��7��g��N��.6�X�z �P?K
?�+���@p��!�1��O�E��b�sj���;Ϟ_��~
�m�V��#�w�«C|-����G�<C���aw�N=��Y(���:��f�����ql�"��};D��Y��w��D���OZ�&4�P����;41=�Ǜ���[�gׄJ�p�
5 ��k�x�=�f.�C��y��m%��6
4և�v��A����y“P�ݏCT���33e����D[y����@2hb'�y����g'��ë"=��W��,>��(���ko�[�r�Ⱦ�Ύ�1"�|e�T�lV�W��*�٧��`m����u�5�.�� �@���0m�])�}I�X{�'��O����Z��]C~/!�HIEND�B`�PK�Xh4���ekantipur.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1314326622(BasicNewsRecipe):
    title = u'Ekantipur'
    __author__ = 'Manish Bhattarai'
    description = 'News from the No.1 News Portal In Nepal'
    language = 'en_NP'
    oldest_article = 7
    max_articles_per_feed = 25
    masthead_url = 'http://www.ekantipur.com/images/logo.gif'
    remove_empty_feeds = True
    remove_tags_before = dict(id='main-content')
    remove_tags_after = dict(id='view-comments')
    remove_tags = [dict(attrs={'class': ['lang fltl', 'bdtop', 'ratings', 'news-tool', 'comment', 'post-ur-comment', 'asideBox', 'commentsbox', 'related-sidebar-row related-news']}),  # noqa
                   dict(id=['menu_container', 'top_container', 'news_container',
                            'top_right', 'sidebar', 'news-detail-img', 'footer-wrapper']),
                   dict(name=['script'])]

    feeds = [
    (u'Top Stories', u'http://www.ekantipur.com/en/rss/top-stories/'),
    (u'National', u'http://www.ekantipur.com/en/rss/national/1'),
    (u'Capital', u'http://www.ekantipur.com/en/rss/capital/7'),
    (u'Business', u'http://www.ekantipur.com/en/rss/business/3'),
    (u'World', u'http://www.ekantipur.com/en/rss/world/5'),

    (u'Sports', u'http://www.ekantipur.com/en/rss/sports/4'),
    (u'Mixed Bag', u'http://www.ekantipur.com/en/rss/mixed-bag/14'),
    (u'Health & Living', u'http://www.ekantipur.com/en/rss/health-and-living/19'),
    (u'Entertainment', u'http://www.ekantipur.com/en/rss/entertainment/6')]
PK�Xo�����ekathemerini.png�PNG


IHDR  D����PLTE(((%%%   !!!"""###&&&''')))***$$$$%$


+++'(',,,




---...&'&��*%tRNS@��f�IDATxڥ΅��@��?<#f�y�v�����*��?8Z�k�?pU��x��E���#��ِ��ґ�Ox2��,���J =���4�v�%>�d���Y�ȡ.���YIVxrѨiGW	k�y^�L3�%$%bJ��;�s���Q�d��S��teN���Y���s`R���+�T7�:�L��)��?��:-up^wIy"|evV$]ULQy/����8����I�KyR�.��r{dwǫPg�35q)bm7�0X�(4�d��ح���u�� M���|���^��xp6�ɹe���.F<r��c��H�k��l�=���;���Y>'!��6Ҵ��戛H�&w[��7
�1�8<�ƓI,�rڐ����[;m4�T�~0�ƶ6FS���79
��}<"3�F���QUx�����]ˌ7��/x{�a�IEND�B`�PK�X#N�[��ekathemerini.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup
from lxml import etree


class Ekathimerini(BasicNewsRecipe):
    title = 'ekathimerini'
    __author__ = 'Thomas Scholl'
    description = 'News from Greece, English edition'
    masthead_url = 'http://wwk.kathimerini.gr/webadmin/EnglishNew/gifs/logo.gif'
    max_articles_per_feed = 100
    oldest_article = 100
    publisher = 'Kathimerini'
    category = 'news, GR'
    language = 'en_GR'
    encoding = 'windows-1253'
    conversion_options = {'linearize_tables': True}
    no_stylesheets = True
    delay = 1
    keep_only_tags = [dict(name='td', attrs={'class': 'news'})]

    rss_url = 'http://ws.kathimerini.gr/xml_files/latestnews.xml'

    def find_articles(self, idx, category):
        for article in idx.findAll('item'):
            cat = u''
            cat_elem = article.find('subcat')
            if cat_elem:
                cat = self.tag_to_string(cat_elem)

            if cat == category:
                desc_html = self.tag_to_string(article.find('description'))
                description = self.tag_to_string(BeautifulSoup(desc_html))

                a = {
                    'title':  self.tag_to_string(article.find('title')),
                    'url': self.tag_to_string(article.find('link')),
                    'description': description,
                    'date': self.tag_to_string(article.find('pubdate')),
                }
                yield a

    def parse_index(self):
        idx_contents = self.browser.open(self.rss_url).read()
        idx = etree.fromstring(idx_contents, parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False))

        cats = sorted({self.tag_to_string(subcat)
                         for subcat in idx.xpath('//*[local-name()="subcat"]')})

        feeds = [(u'News', list(self.find_articles(idx, u'')))]

        for cat in cats:
            feeds.append((cat.capitalize(), list(
                self.find_articles(idx, cat))))

        return feeds

    def print_version(self, url):
        return url.replace('http://www.ekathimerini.com/4dcgi/', 'http://www.ekathimerini.com/4Dcgi/4dcgi/')
PK�XGppekologia_pl.png�PNG


IHDR�a7IDATx���3t`A�Y۶��n�ݨ�픱m;Ml۶U�N�T��r��3���=νg�����x��@0��lTP	�j�`x��i8�6|F��H�l k!�
�6�A�bD��7} ��Z�C?�lTp<�#8z9�:�ܪ�?�V)	�I`�

���:u^%6k4 �b��C��_�_F0���z��I-�sat�
�l[�.��he}Jo�� �
����)T�.:��je�k���aq �u#�)��K�i�D-�Ϭ)B�t\�RS۴�p��5��Q������EA5�p
�F�=���Q@���gIEND�B`�PK�X�+��ekologia_pl.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai
from calibre.web.feeds.news import BasicNewsRecipe
import re


class EkologiaPl(BasicNewsRecipe):
    title = u'Ekologia.pl'
    __author__ = 'fenuks'
    description = u'Portal ekologiczny - eko, ekologia, ochrona przyrody, ochrona środowiska, przyroda, środowisko online. Ekologia i ochrona środowiska. Ekologia dla dzieci.'  # noqa
    category = 'ecology'
    language = 'pl'
    cover_url = 'http://www.ekologia.pl/assets/images/logo/ekologia_pl_223x69.png'
    ignore_duplicate_articles = {'title', 'url'}
    extra_css = '.title {font-size: 200%;} .imagePowiazane {float:left; margin-right:5px; width: 200px;}'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    remove_javascript = True
    use_embedded_content = False
    remove_attrs = ['style']
    keep_only_tags = [dict(attrs={'class': 'contentParent'})]
    remove_tags = [dict(
        attrs={'class': ['ekoLogo', 'powrocArt', 'butonDrukuj', 'widget-social-buttons']})]

    feeds = [
    (u'Wiadomo\u015bci', u'http://www.ekologia.pl/rss/20,53,0'),
    (u'\u015arodowisko', u'http://www.ekologia.pl/rss/20,56,0'),
    (u'Styl \u017cycia', u'http://www.ekologia.pl/rss/20,55,0')]

    def print_version(self, url):
        id = re.search(r',(?P<id>\d+)\.html', url).group('id')
        return 'http://drukuj.ekologia.pl/artykul/' + id
PK�X�.���ekot.png�PNG


IHDR(-S�PLTE������JLL���"#"���WXW$%$%&&&&&)***++...;;;<==BCCWYXXYYY[[]`_bddkmltvv|~~����������������������������������������������������������������������������������������������������֫jIDATxڵ��Q@��۶m��W�s�38#ǟ]�ZY;l��76#VCu\��c:���`�ȧ��p�ȴD�1R��>Oz�ST��~�z�s�*/?�����
?}9
]8�IEND�B`�PK�X�`H���ekot.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Ekot_SE(BasicNewsRecipe):
    title = 'Ekot'
    __author__ = 'Joakim Lindskog'
    description = 'Nyheter fr\xc3\xa5n Ekot'
    publisher = 'Ekot'
    category = 'news, politics, Sweden'
    oldest_article = 7
    delay = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'sv'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [dict(name='h1', attrs={'class': 'newsH2'}),
                      dict(name='div', attrs={'class': 'articleTop'}),
                      dict(name='div', attrs={'class': 'newsIntro'}),
                      dict(name='div', attrs={'class': 'newsText'})]
    remove_tags = [
        dict(name=['object', 'link', 'base']), dict(
            name='span', attrs={'class': 'relLink'})
    ]

    feeds = [(u'Ekot', u'https://api.sr.se/api/rssfeed/rssfeed.aspx?rssfeed=83'),
             (u'Utrikes', u'https://api.sr.se/api/rssfeed/rssfeed.aspx?rssfeed=3304'),
             (u'Radiosporten', u'https://api.sr.se/api/rssfeed/rssfeed.aspx?rssfeed=179')]

    def print_version(self, url):
        return url.replace('https://sverigesradio.se/cgi-bin/ekot/artikel.asp',
                           'https://sverigesradio.se/cgi-bin/isidorpub/PrinterFriendlyArticle.asp') + '&ProgramID=83'
PK�X��ǘ�el_colombiano.png�PNG


IHDR  D���)PLTE���������������


������������222�����������qqq@@@���nnnppp���������]]]***			�������������������ddd��������������������������������������!!!��㫫�VVV���������������E���������<<<������������������柟������Y���������������������q��*IDATx^���n�0�����Pdfffffx����J��v�J=�&���_�d���jhx_I���L�0�lrp��@�o��&���3$qR��&ɒ�q�f
_H�!]�H-<D�H+�J	�LD�2
C����c5���@�')���� g�P0�`�q����te��������(*��HBH�1<2:�1�6)$S��������<%,��0W ��UgM�olnm��"���M�ߴp(�GP�'�g���]�Ľ��{mA��ۻ���'$���b���{5U~�'Gf���IEND�B`�PK�X�x��HHel_colombiano.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1311790237(BasicNewsRecipe):
    title = u'Periódico El Colombiano'
    __author__ = 'BIGO-CAVA'
    language = 'es_CO'
    cover_url = 'http://www.elcolombiano.com/images/logoElColombiano348x46.gif'
    remove_tags_before = dict(id='contenidoArt')
    remove_tags_after = dict(id='enviaTips')
    remove_tags_after = dict(id='zonaPata')
    oldest_article = 1
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    masthead_url = 'http://www.elcolombiano.com/images/logoElColombiano348x46.gif'
    publication_type = 'newspaper'

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h1{font-family: sans-serif; font-size:150%; font-weight:bold; text-align: justify; }
                               h3{font-family: sans-serif; font-size:100%; font-style: italic; text-align: justify; }
                                 """

    feeds = [(u'Portada', u'http://www.elcolombiano.com/rss/portada.xml'),
             (u'Antioquia', u'http://www.elcolombiano.com/rss/Antioquia.xml'),
             (u'Colombia', u'http://www.elcolombiano.com/rss/Colombia.xml'),
             (u'Economia', u'http://www.elcolombiano.com/rss/Economia.xml'),
             (u'Internacional', u'http://www.elcolombiano.com/rss/Internacional.xml'),
             (u'Politica', u'http://www.elcolombiano.com/rss/Politica.xml'),
             (u'Cultura', u'http://www.elcolombiano.com/rss/Cultura.xml'),
             (u'Entretenimiento', u'http://www.elcolombiano.com/rss/Farandula.xml'),
             (u'Tecnologia', u'http://www.elcolombiano.com/rss/Tecnologia.xml'),
             (u'Television', u'http://www.elcolombiano.com/rss/Television.xml'),
             (u'Vida y Sociedad', u'http://www.elcolombiano.com/rss/Vida.xml'),
             (u'Turismo', u'http://www.elcolombiano.com/rss/Turismo.xm'),
             (u'Salud', u'http://www.elcolombiano.com/rss/Salud.xml'),
             (u'Ciencia', u'http://www.elcolombiano.com/rss/Ciencia.xml')]

    remove_tags = [dict(name='div', attrs={'class': 'objetosRelacionados'}),
                   dict(name='div', attrs={
                        'class': 'notasRelacionadas contenedor'}),
                   dict(name='div', attrs={'class': 'comentarios'}),
                   dict(name='div', attrs={'class': 'mapaDelSitio'}),
                   dict(name='div', attrs={'class': 'creditos'}),
                   dict(name='div', attrs={'class': 'votos'}),
                   dict(name='div', attrs={'class': 'divopt2'}),
                   dict(name='div', attrs={'class': 'comentarios'}),
                   dict(name='div', attrs={'class': 'pestanasLateral'}),
                   dict(name='div', attrs={'class': 'resumenSeccion'}),
                   dict(name='div', attrs={'class': 'zonaComercial'}),
                   dict(name='div', attrs={'id': 'zonaPata'})]
PK�X��77el_confidencial.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
__license__ = 'GPL v3'
__author__ = 'hmeza'
__description__ = 'El Confidencial - El diario de los lectores influyentes'
__version__ = 'v1.00.000'
__date__ = '27, April 2023'
'''
https://www.elconfidencial.com/
'''


from calibre.web.feeds.news import BasicNewsRecipe


class ElConfidencial(BasicNewsRecipe):
    title = u'El Confidencial'
    oldest_article = 7.0
    __author__ = 'hmeza'
    description = 'El Confidencial - El diario de los lectores influyentes'
    timefmt = ' [%d %b, %Y]'
    publication_type = 'newspaper'
    language = 'es'
    encoding = 'utf-8'
    no_stylesheets = True
    remove_javascript = True

    feeds = [
        (u'ACTUALIDAD - España', 'https://rss.elconfidencial.com/espana/'),
        (u'ACTUALIDAD - Mundo', 'https://rss.elconfidencial.com/mundo/'),
        (u'ACTUALIDAD - Comunicación', 'https://rss.elconfidencial.com/comunicacion/'),
        (u'ACTUALIDAD - Sociedad', 'https://rss.elconfidencial.com/sociedad/'),
        (u'OPINIÓN - A.casado', 'https://rss.blogs.elconfidencial.com/espana/al-grano/'),
        (u'OPINIÓN - J.a.zarzalejos', 'https://rss.blogs.elconfidencial.com/espana/notebook/'),
        (u'OPINIÓN - C.sánchez', 'https://rss.blogs.elconfidencial.com/espana/mientras-tanto/'),
        (u'OPINIÓN - El confidente', 'https://rss.blogs.elconfidencial.com/espana/el-confidente/'),
        (u'COTIZALIA - Mercados', 'https://rss.elconfidencial.com/mercados/'),
        (u'COTIZALIA - Economía', 'https://rss.elconfidencial.com/economia/'),
        (u'COTIZALIA - Empresas', 'https://rss.elconfidencial.com/empresas/'),
        (u'COTIZALIA - Finanzas personales', 'https://rss.elconfidencial.com/mercados/finanzas-personales/'),
        (u'COTIZALIA - Vivienda', 'https://rss.elconfidencial.com/vivienda'),
        (u'COTIZALIA - Fondos de inversión', 'https://rss.elconfidencial.com/mercados/fondos-de-inversion/'),
        (u'TEKNAUTAS - Aplicaciones', 'https://rss.elconfidencial.com/tags/temas/apps-9337/'),
        (u'TEKNAUTAS - Emprendedores', 'https://rss.elconfidencial.com/tags/economia/emprendedores-4800/'),
        (u'TEKNAUTAS - Gadgets', 'https://rss.elconfidencial.com/tags/temas/gadgets-9340/'),
        (u'TEKNAUTAS - Hardware', 'https://rss.elconfidencial.com/tags/temas/hardware-9341/'),
        (u'TEKNAUTAS - Internet', 'https://rss.elconfidencial.com/tags/temas/internet-9342/'),
        (u'TEKNAUTAS - Móviles', 'https://rss.elconfidencial.com/tags/otros/moviles-8601/'),
        (u'TEKNAUTAS - Redes sociales', 'https://rss.elconfidencial.com/tags/temas/redes-sociales-9344/'),
        (u'DEPORTES - Fútbol', 'https://rss.elconfidencial.com/deportes/futbol/'),
        (u'DEPORTES - Baloncesto', 'https://rss.elconfidencial.com/deportes/baloncesto/'),
        (u'DEPORTES - Fórmula 1', 'https://rss.elconfidencial.com/deportes/formula-1/'),
        (u'DEPORTES - Motociclismo', 'https://rss.elconfidencial.com/deportes/motociclismo/'),
        (u'DEPORTES - Tenis', 'https://rss.elconfidencial.com/deportes/tenis/'),
        (u'DEPORTES - Ciclismo', 'https://rss.elconfidencial.com/deportes/ciclismo/'),
        (u'DEPORTES - Golf', 'https://rss.elconfidencial.com/deportes/golf/'),
        (u'DEPORTES - Otros deportes', 'https://rss.elconfidencial.com/deportes/otros-deportes/'),
        (u'ACV - Alimentación', 'https://rss.elconfidencial.com/tags/otros/alimentacion-5601/'),
        (u'ACV - Bienestar', 'https://rss.elconfidencial.com/tags/temas/bienestar-9331/'),
        (u'ACV - Educación', 'https://rss.elconfidencial.com/tags/temas/educacion-9332/'),
        (u'ACV - Psicología', 'https://rss.elconfidencial.com/tags/temas/psicologia-9333/'),
        (u'ACV - Salud', 'https://rss.elconfidencial.com/tags/otros/salud-6110/'),
        (u'ACV - Sexualidad', 'https://rss.elconfidencial.com/tags/temas/sexualidad-6986/'),
        (u'ACV - Trabajo', 'https://rss.elconfidencial.com/tags/economia/trabajo-5284/'),
        (u'CULTURA - Libros', 'https://rss.elconfidencial.com/tags/otros/libros-5344/'),
        (u'CULTURA - Arte', 'https://rss.elconfidencial.com/tags/otros/arte-6092/'),
        (u'CULTURA - Cine', 'https://rss.elconfidencial.com/tags/otros/cine-7354/'),
        (u'CULTURA - Música', 'https://rss.elconfidencial.com/tags/otros/musica-5272/'),
        (u'VANITATIS - Actualidad', 'https://rss.vanitatis.elconfidencial.com/noticias/'),
        (u'VANITATIS - Tendencias', 'https://rss.vanitatis.elconfidencial.com/estilo/'),
        (u'VANITATIS - Televisión', 'https://rss.vanitatis.elconfidencial.com/television/'),
        (u'VANITATIS - Casas reales', 'https://rss.vanitatis.elconfidencial.com/casas-reales/'),
        (u'VANITATIS - Blogs', 'https://rss.blogs.vanitatis.elconfidencial.com/'),
        (u'ALIMENTE - Nutrición', 'https://rss.alimente.elconfidencial.com/nutricion/'),
        (u'ALIMENTE - Consumo', 'https://rss.alimente.elconfidencial.com/consumo/'),
        (u'ALIMENTE - Gastronomía', 'https://rss.alimente.elconfidencial.com/gastronomia-y-cocina/'),
        (u'ALIMENTE - Bienestar', 'https://rss.alimente.elconfidencial.com/bienestar/'),
        (u'ALIMENTE - Recetas', 'https://rss.alimente.elconfidencial.com/recetas/'),
        (u'GENTLEMAN - Gentlemanía', 'https://rss.gentleman.elconfidencial.com/gentlemania/'),
        (u'GENTLEMAN - Nombres propios', 'https://rss.gentleman.elconfidencial.com/personajes/'),
        (u'GENTLEMAN - Style', 'https://rss.gentleman.elconfidencial.com/estilo-hombre/'),
        (u'GENTLEMAN - Gourmet', 'https://rss.gentleman.elconfidencial.com/gourmet/'),
        (u'GENTLEMAN - Relojes', 'https://rss.gentleman.elconfidencial.com/relojes/')
    ]
PK�XV�Ć
el_correo.png�PNG


IHDR  D���PLTE�!���������/����"�%��������������&����'����(�	)�u������������ܿ5�"�
-���������▣��������{��9�(Dᑠ�)E�l�o��o��Ja�6��7�Yo�[p穴鯹鰺����塭椯�F^�1K�C[㜩䝪�������������`t�g{�k~�~���܀�ވ�ߌ������㙦㚧㛨�,H�*Eᒠ����-�$�������p��s�P4�IDATx^��ŊA���qww�Uwwwy�٦ �`����wʄ��e.�i�P���l7꾇g8E�4�Ϝ=�R�3#茴e�~�<���R�V��X�-��~��670���qG�<�l#�Y�y�2�,؂Ҋ��\����F>�\���%3��h�I�n�!ҙ�ݐ�J��=k��$����}1��w}�m�x�s���n�IEND�B`�PK�X��>��el_correo.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '08 Januery 2011, desUBIKado'
__author__ = 'desUBIKado'
__description__ = 'Daily newspaper from Biscay'
__version__ = 'v0.14'
__date__ = '10, September 2017'
'''
http://www.elcorreo.com/
'''

import time
import re
from calibre.web.feeds.news import BasicNewsRecipe


class elcorreo(BasicNewsRecipe):
    __author__ = 'desUBIKado'
    description = 'Daily newspaper from Biscay'
    title = u'El Correo'
    publisher = 'Vocento'
    category = 'News, politics, culture, economy, general interest'
    oldest_article = 1
    delay = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    masthead_url = 'http://www.elcorreo.com/vizcaya/noticias/201002/02/Media/logo-elcorreo-nuevo.png'
    language = 'es'
    timefmt = '[%a, %d %b, %Y]'
    encoding = 'utf-8'
    remove_empty_feeds = True
    remove_javascript = True

    feeds = [
        (u'Portada', u'http://www.elcorreo.com/rss/atom/portada'),
        (u'Mundo', u'http://www.elcorreo.com/rss/atom/?section=internacional'),
        (u'Bizkaia', u'http://www.elcorreo.com/rss/atom/?section=bizkaia'),
        (u'Guipuzkoa', u'http://www.elcorreo.com/rss/atom/?section=gipuzkoa'),
        (u'Araba', u'http://www.elcorreo.com/rss/atom/?section=araba'),
        (u'La Rioja', u'http://www.elcorreo.com/rss/atom/?section=larioja'),
        (u'Miranda', u'http://www.elcorreo.com/rss/atom/?section=miranda'),
        (u'Economía', u'http://www.elcorreo.com/rss/atom/?section=economia'),
        (u'Culturas', u'http://www.elcorreo.com/rss/atom/?section=culturas'),
        (u'Politica', u'http://www.elcorreo.com/rss/atom/?section=politica'),
        (u'Tecnología', u'http://www.elcorreo.com/rss/atom/?section=tecnologia'),
        (u'Gente - Estilo', u'http://www.elcorreo.com/rss/atom/?section=gente-estilo'),
        (u'Planes', u'http://www.elcorreo.com/rss/atom/?section=planes'),
        (u'Athletic', u'http://www.elcorreo.com/rss/atom/?section=athletic'),
        (u'Alavés', u'http://www.elcorreo.com/rss/atom/?section=alaves'),
        (u'Bilbao Basket', u'http://www.elcorreo.com/rss/atom/?section=bilbaobasket'),
        (u'Baskonia', u'http://www.elcorreo.com/rss/atom/?section=baskonia'),
        (u'Deportes', u'http://www.elcorreo.com/rss/atom/?section=deportes'),
        (u'Jaiak', u'http://www.elcorreo.com/rss/atom/?section=jaiak'),
        (u'La Blanca', u'http://www.elcorreo.com/rss/atom/?section=la-blanca-vitoria'),
        (u'Aste Nagusia', u'http://www.elcorreo.com/rss/atom/?section=aste-nagusia-bilbao'),
        (u'Semana Santa', u'http://www.elcorreo.com/rss/atom/?section=semana-santa'),
        (u'Festivales', u'http://www.elcorreo.com/rss/atom/?section=festivales')
    ]

    keep_only_tags = [
        dict(name='div', attrs={'class': ['col-xs-12 col-sm-12 col-md-8 col-lg-8']})
    ]

    remove_tags = [
        dict(
            name='div',
            attrs={
                'class': [
                    'voc-topics voc-detail-grid ', 'voc-newsletter ',
                    'voc-author-social'
                ]
            }
        ),
        dict(name='section', attrs={'class': ['voc-ficha-detail voc-file-sports']})
    ]

    remove_tags_before = dict(
        name='div', attrs={'class': 'col-xs-12 col-sm-12 col-md-8 col-lg-8'}
    )
    remove_tags_after = dict(
        name='div', attrs={'class': 'col-xs-12 col-sm-12 col-md-8 col-lg-8'}
    )

    _processed_links = []

    def get_article_url(self, article):
        link = article.get('link', None)

        if link is None:
            return article

        # modificamos la url de las noticias de los equipos deportivos para que funcionen, por ejemplo:
        # http://athletic.elcorreo.com/noticias/201407/27/muniain-estrella-athletic-para-20140727093046.html
        # http://m.elcorreo.com/noticias/201407/27/muniain-estrella-athletic-para-20140727093046.html?external=deportes/athletic

        parte = link.split('/')

        if parte[2] == 'athletic.elcorreo.com':
            link = 'http://www.elcorreo.com/' + parte[3] + '/' + parte[
                4
            ] + '/' + parte[5] + '/' + parte[6] + '?external=deportes/athletic'
        else:
            if parte[2] == 'baskonia.elcorreo.com':
                link = 'http://www.elcorreo.com/' + parte[3] + '/' + parte[
                    4
                ] + '/' + parte[5] + '/' + parte[6] + '?external=deportes/baskonia'
            else:
                if parte[2] == 'bilbaobasket.elcorreo.com':
                    link = 'http://www.elcorreo.com/' + parte[3] + '/' + parte[
                        4
                    ] + '/' + parte[5] + '/' + parte[
                        6
                    ] + '?external=deportes/bilbaobasket'
                else:
                    if parte[2] == 'alaves.elcorreo.com':
                        link = 'http://www.elcorreo.com/' + parte[3] + '/' + parte[
                            4
                        ] + '/' + parte[5] + '/' + parte[
                            6
                        ] + '?external=deportes/alaves'

        # A veces el mismo articulo aparece en la versión de Alava y en la de Bizkaia. Por ejemplo:
        # http://www.elcorreo.com/alava/deportes/motor/formula-1/201407/27/ecclestone-quiere-briatore-ayude-20140727140820-rc.html
        # http://www.elcorreo.com/bizkaia/deportes/motor/formula-1/201407/27/ecclestone-quiere-briatore-ayude-20140727140820-rc.html
        # para controlar los duplicados, unificamos las url para que sean siempre de bizkaia (excepto para la sección "araba")

        if ((parte[3] == 'alava') and (parte[4] != 'araba')):
            link = link.replace('elcorreo.com/alava', 'elcorreo.com/bizkaia')

        # Controlamos si el artículo ha sido incluido en otro feed para eliminarlo

        if link not in self._processed_links:
            self._processed_links.append(link)
        else:
            link = None

        return link

    # Recuperamos la portada de papel (la imagen format=1 tiene mayor resolucion)

    def get_cover_url(self):
        cover = None
        st = time.localtime()
        year = str(st.tm_year)
        month = "%.2d" % st.tm_mon
        day = "%.2d" % st.tm_mday
        # http://info.elcorreo.com/pdf/07082013-viz.pdf
        cover = 'http://info.elcorreo.com/pdf/' + day + month + year + '-viz.pdf'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover)
        except:
            self.log("\nPortada no disponible")
            cover = 'http://www.elcorreo.com/vizcaya/noticias/201002/02/Media/logo-elcorreo-nuevo.png'
        return cover

    # Para cambiar el estilo del texto

    extra_css = '''
        h1 {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:28px;}
        h2 {font-family:georgia,serif; font-style:italic; font-weight:normal;font-size:16px;color:#4D4D4D;}
        h3 {font-family:georgia,serif; font-weight:bold;font-size:18px;}
    '''

    preprocess_regexps = [

        # Para presentar la imagen de los video incrustados
        (
            re.compile(r'stillURLVideo: \'', re.DOTALL | re.IGNORECASE),
            lambda match: '</script><img src="'
        ),
        (
            re.compile(r'.jpg\',', re.DOTALL | re.IGNORECASE),
            lambda match: '.jpg"><SCRIPT TYPE="text/JavaScript"'
        ),

        # Para quitar el punto de la lista
        (
            re.compile(r'<li class="destacada">', re.DOTALL | re.IGNORECASE),
            lambda match: '<div class="destacada"></div>'
        )
    ]
PK�X��<��
�
el_cultural.recipefrom __future__ import print_function
from calibre.web.feeds.recipes import BasicNewsRecipe


class RevistaElCultural(BasicNewsRecipe):

    title = 'Revista El Cultural'
    __author__ = 'Jefferson Frantz'
    description = 'Revista de cultura'
    timefmt = ' [%d %b, %Y]'
    language = 'es'

    no_stylesheets = True
    remove_javascript = True

    extra_css = 'h1{ font-family: sans-serif; font-size: large; font-weight: bolder; text-align: justify } h2{ font-family: sans-serif; font-size: small; font-weight: 500; text-align: justify } h3{ font-family: sans-serif; font-size: small; font-weight: 500; text-align: justify } h4{ font-family: sans-serif; font-weight: lighter; font-size: medium; font-style: italic; text-align: justify } .rtsArticuloFirma{ font-family: sans-serif; font-size: small; text-align: justify } .column span-13 last{ font-family: sans-serif; font-size: medium; text-align: justify } .rtsImgArticulo{font-family: serif; font-size: small; color: #000000; text-align: justify}'  # noqa

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']

        return soup

    keep_only_tags = [dict(name='div', attrs={'class': [
                           'column span-13 last']}), dict(name='div', attrs={'class': ['rtsImgArticulo']})]

    remove_tags = [
        dict(name=['object', 'link', 'script', 'ul']), dict(
            name='div', attrs={'class': ['rtsRating']})

    ]

    # TO GET ARTICLES IN SECTION
    def ec_parse_section(self, url, titleSection):
        print('Section: ' + titleSection)
        soup = self.index_to_soup(url)
        div = soup.find(attrs={'id': 'gallery'})
        current_articles = []

        for a in div.findAllNext('a', href=True):
            if a is None:
                continue
            title = self.tag_to_string(a)

            url = a.get('href', False)
            if not url or not title:
                continue

            if not url.startswith('/version_papel/' + titleSection + '/'):
                if len(current_articles) > 0 and not url.startswith('/secciones/'):
                    break
                continue

            if url.startswith('/version_papel/' + titleSection + '/'):
                url = 'http://www.elcultural.es' + url

            self.log('\t\tFound article:', title[0:title.find("|") - 1])
            self.log('\t\t\t', url)
            current_articles.append({'title': title[0:title.find("|") - 1], 'url': url,
                                     'description': '', 'date': ''})

        return current_articles

    # To GET SECTIONS
    def parse_index(self):
        feeds = []
        for title, url in [
            ('LETRAS',
             'http://www.elcultural.es/pdf_sumario/cultural/Sumario_El_Cultural_en_PDF'),
            ('ARTE',
             'http://www.elcultural.es/pdf_sumario/cultural/Sumario_El_Cultural_en_PDF'),
            ('CINE',
             'http://www.elcultural.es/pdf_sumario/cultural/Sumario_El_Cultural_en_PDF'),
            ('CIENCIA',
             'http://www.elcultural.es/pdf_sumario/cultural/Sumario_El_Cultural_en_PDF'),
            # ('OPINION',
            # 'http://www.elcultural.es/pdf_sumario/cultural/Sumario_El_Cultural_en_PDF'),
            ('ESCENARIOS',
             'http://www.elcultural.es/pdf_sumario/cultural/Sumario_El_Cultural_en_PDF'),
        ]:
            articles = self.ec_parse_section(url, title)
            if articles:
                feeds.append((title, articles))

        return feeds
PK�X�VJJ
el_diario.png�PNG


IHDR  D����PLTEP�J~JJ�J�J�JI�K�DwG}J�JK|@�I�J�JJ�UqH|J�GzL}JJ�K�G�J�I�J�J�FtJ�JJ�KK�J�J�J�J�J�J�JJJ�J�I�KJ�M�K�I|JU�J�J�3fQyJ�KJJ�G�JJ�KxJ�J~J�J{J���L����KW�����r��	P����0l�#c���������솩�"b������S�����@w�4o���������p��/k����5p�����Ax�\����M� a�<u�������N�������U����g��L����=u�\�U�O�Z����[��G|�R�����R���Ú��F|����S�$d�q����Х��'f�6p����n��h��)g����I~�V�Z����_�P���¤��T�%d��������
Q�>v�����ItRNS]����ɠ\+��)����	'�/��,$�����ZV��������
�#���������|���7�IDATx�lЃ��Q�F줶ݧ�����ڶ���g�u�|?�gF���gf������e���C�o�/����#Qq(ǘل�$S�`�jq�̡��函kŬ[��O��Q�L�yf�F�M0�3����]���l�à�E��O���ma�[A�*e�Ps�
�&2�}R��:j��e��P`��;�T<�t�Sv����s��I�N�v��iv��e��������J���l~�oJ��s�"���y���o��燅�Q��_�	v�oK��?�މ)Y��N��K��A��+�;0wkl|ti�]���V��z9�t�j�!�Mqt��L`�UR�*_�6EDw�?�|�l���R��37&0o>D���,,��[�(�hq:T���(ml�A�$**α��%ki{l�ށ�1�0�]������4��5Z��Bμ�0q��/(���#!�$w���IEND�B`�PK�X,���el_diario.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class ElDiario(BasicNewsRecipe):
    title = u'elDiario.es'
    oldest_article = 7.0
    __author__ = 'Dirk Gómez'
    description = 'elDiario.es - Noticias a pesar de todo'
    timefmt = ' [%d %b, %Y]'
    publication_type = 'newspaper'
    language = 'es'
    encoding = 'utf-8'
    no_stylesheets = True
    remove_javascript = True

    feeds = [
        (u'Últimas Noticias de eldiario.es', u'https://www.eldiario.es/rss/'),
    ]
PK�XH��jXXel_diplo.png�PNG


IHDR�aIDATx�c �f�_�V��K��r��y}K?0�����\�9���GC
���}��	%�{�h@�?M��Ɋ�ׂ��_�B2g��͉0�[{��b�
?��'��8�k+<�.�%�)A/|�P���k����4�� ��{a���O�kĈ�4���	c��*�_;��e������^�޼��r3(����4��Q��A���D���jD�r�{���%��S���!����7}
�/q?�J��v���cV�jb����l6$�IEND�B`�PK�Xa
/��el_diplo.recipe# -*- mode: python; coding: utf-8; -*-
# vim: set syntax=python fileencoding=utf-8

__license__ = "GPL v3"
__copyright__ = "2023, Tomás Di Domenico <tdido at tdido.eu>"

"""
www.eldiplo.org
"""

from calibre.web.feeds.news import BasicNewsRecipe


class ElDiplo2023(BasicNewsRecipe):
    title = "Le Monde Diplomatique - cono sur"
    __author__ = "Tomás Di Domenico"
    description = "Publicación de Le Monde Diplomatique para el cono sur."
    publisher = "Capital Intelectual"
    category = "News, Politics, Argentina, Uruguay, Paraguay, South America, World"
    oldest_article = 31
    no_stylesheets = True
    encoding = "utf8"
    use_embedded_content = False
    language = "es_AR"
    remove_empty_feeds = True
    publication_type = "magazine"
    delay = 1
    simultaneous_downloads = 1
    timeout = 8
    needs_subscription = True
    ignore_duplicate_articles = {"url"}
    temp_files = []
    fetch_retries = 10
    handle_gzip = True
    compress_news_images = True
    scale_news_images_to_device = True
    masthead_url = (
        "https://www.eldiplo.org/wp-content/themes/_polenta_/assets/diplo.png"
    )
    INDEX = "https://www.eldiplo.org/"

    conversion_options = {"series": "El Dipló", "publisher": publisher, "base_font_size": 8, "tags": category}

    keep_only_tags = [dict(name=["article"])]

    remove_tags = [dict(name=["button"])]

    extra_css = """
        .entry-title {
            text-align: center;
        }
        .text-right {
            text-align: right;
        }
        .bajada {
            display: block;
            font-family: sans-serif;
            text-align: center;
            font-size: 110%;
            padding: 2%;
        }
        .Destacado{
            display: block;
            font-size: 120%;
            font-weight: bold;
            font-style: italic;
            padding-left: 10%;
            padding-right: 10%;
        }
    """

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.INDEX)
        if self.username is not None and self.password is not None:
            br.select_form(id="loginform")
            br["log"] = self.username
            br["pwd"] = self.password
            br.submit()
        return br

    def get_cover_url(self):
        soup_index = self.index_to_soup(self.INDEX)
        tag_sumario = soup_index.find("span", text="Sumario")
        url_sumario = "https://www.eldiplo.org" + tag_sumario.parent["href"]

        soup = self.index_to_soup(url_sumario)

        container = soup.find("div", class_="px-16")
        url = container.find("img")["src"]

        return getattr(self, "cover_url", url)

    def _process_article(self, article):
        url = article.find("a", href=True, attrs={"class": "title"})["href"]
        title = self.tag_to_string(article).replace("Editorial", "Editorial: ")
        try:
            title, authors = title.split(", por")
            authors = f"por {authors}"
        except ValueError:
            authors = ""
        self.log("title: ", title, " url: ", url)
        return {"title": title, "url": url, "description": authors, "date": ""}

    def preprocess_html(self, soup):
        font_size = "90%"

        # make the footnotes smaller
        for p in soup.find("div", id="nota_pie").findChildren("p", recursive=False):
            p["style"] = f"font-size: {font_size};"

        return soup

    def parse_index(self):
        soup_index = self.index_to_soup(self.INDEX)

        tag_sumario = soup_index.find("span", text="Sumario")

        if tag_sumario is None:
            return None

        url_sumario = "https://www.eldiplo.org" + tag_sumario.parent["href"]
        self.log(url_sumario)

        soup_sumario = self.index_to_soup(url_sumario)

        feeds = []
        articles = []
        dossiers = []

        sumario = soup_sumario.find("div", class_="sumario")

        for section in sumario.find_all("div", recursive=False):
            classes = section.attrs["class"]

            if "dossier" in classes:
                dtitle = self.tag_to_string(section.find("h3"))
                darticles = []
                for article in section.find_all("div", recursive=False):
                    darticles.append(self._process_article(article))
                dossiers.append((dtitle, darticles))
            else:
                articles.append(self._process_article(section))
        feeds.append(("Artículos", articles))
        feeds += dossiers

        return feeds
PK�X�C��YYel_economista.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
__license__ = 'GPL v3'
__author__ = 'hmeza'
__description__ = 'El Economista - El diario de los lectores influyentes'
__version__ = 'v1.00.000'
__date__ = '27, April 2023'
'''
https://www.elconfidencial.com/
'''


from calibre.web.feeds.news import BasicNewsRecipe


class ElConfidencial(BasicNewsRecipe):
    title = u'elEconomista.es'
    oldest_article = 7.0
    __author__ = 'hmeza'
    description = 'elEconomista.es'
    timefmt = ' [%d %b, %Y]'
    publication_type = 'newspaper'
    language = 'es'
    encoding = 'utf-8'
    no_stylesheets = True
    remove_javascript = True

    feeds = [
        (u'elEconomista economía', u'https://www.eleconomista.es/rss/rss-economia.php'),
        (u'elEconomista gestion', u'https://www.eleconomista.es/rss/rss-gestion.php'),
        (u'elEconomista tecnología', u'https://www.eleconomista.es/rss/rss-category.php?category=tecnologia'),
        (u'Selección elEconomista', u'https://www.eleconomista.es/rss/rss-seleccion-ee.php'),
        (u'Mercados', u'https://www.eleconomista.es/rss/rss-mercados.php'),
    ]
PK�XHry77el_espectador.png�PNG


IHDR  ���IDATx^�VkLT��;w�!�Q$�!���FVR6�
mZ���Ĥ�������1Z�EJ��Qk?��<l��VCшJeA��C�!��dy-���>�厞,��.�3g~�9gf��a�n�#z��:ɈO�D���97�9�AdJi���t)T�zL�t�3fj
c��(*�gD㊢�x�9I�*	���i��T>�8���NE�zk�������P3��)j�F��@(	UU5*�5M;�Y�/W���F���c="�9DzaD�f0�3��QK���)�S�9W������qǞ�t�p��Ƃ#�q�����5��X��i�QfL�LzZx��\[de�X�^O�����>O����aj�^����ghhྞ^)�Q~]&�����x|F�5������������W��0��Ep�p8��퇋�>.�����6	I�1#����`j�‚�0d���QSS��O�TQQ��fu4�����_._�znv��u웣���W�\)��"��BǏݴ9Z��@�~sӯ��_���:z�؁��6.)>b���y:��m����<�-����ŠS�v�Eolh"$�>�Ha�ĉo��S��\�2��ͤ�b�������T�����H�#H{����c�)˖�������.hm�n~��W^FAP�ɑ�k׺�n݊�J���g�0E,III��G0�Z�dH24�f�Bݤ\���x�y�fUUUqq���"C�>$a�KK�>t���L�sZF�t��p Z~s#.R�`����s�]��kj�X�y����PSS��$�D����wɒ%��L�!݈�@tx�	[KK-�nll���ݸq��ƻ1�u�=	5�E���3gάZ�
X̥{A��$�ɓ'U���>33e��bw�)���Ϟ=`YX�q^�t�B3Ӆ�����e����.���%�1�X�ٳ��ʲ����٨y( ��@������jg��[r�LO�a�@���s6���ۂ{���aA+
��"���rss���4#�X��˃�۶mC�d��'��d�֭���C�)�xZ`+��v���ҥK�9�L#�̌���LKK������E�Q�SFܣ�bEZII		����O���&Q���B6��/G����r�p,�|}}����H��;㒡��M��w;�Źx��
 ܠ�I�D��o��'�s��`:�s>:<����@`�b*4��=D~����y_����t���� ���ɐ��X,v�xdhWʍqbb������ݕ����3�q돤EI�8�nw_�}�P3�''�Z[��Ν���������peey��zkk+2����^/�T�`0x��
���KL�]s�&*S�@���:�N��
���Q$	]D�a���tÆ
�j1�(�>�#����cD��z���~��%!����磓����Z���5���&
C���r
S|�4)A�cccri�I�0GN�?E�0��ɞ]��'ҟǿ	*��[L�IEND�B`�PK�X)���el_espectador.recipe# coding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class ColombiaElEspectador(BasicNewsRecipe):
    title = u'Periódico el Espectador'
    __author__ = 'BIGO-CAVA'
    cover_url = 'http://www.elespectador.com/sites/elespectador.com/themes/elespectador/images/logo.gif'
    remove_tags_before = dict(id='content')
    remove_tags_after = [dict(name='div', attrs={'class': 'paginacion'})]
    language = 'es_CO'
    remove_tags = [dict(name='div', attrs={'class': 'herramientas_nota'}),
                   dict(name='div', attrs={'class': 'relpauta'}),
                   dict(name='div', attrs={'class': 'recursosrelacionados'}),
                   dict(name='div', attrs={'class': 'nav_negocios'})]
    #                      dict(name='div', attrs={'class':'ico-mail2'}),
    #                    dict(name='div', attrs={'id':'caja-instapaper'}),
    # dict(name='div', attrs={'class':'modulo herramientas'})]
    oldest_article = 2
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    masthead_url = 'http://www.elespectador.com/sites/elespectador.com/themes/elespectador/images/logo.gif'
    publication_type = 'newspaper'

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h1{font-family: sans-serif; font-size:150%; font-weight:bold; text-align: justify; }
                               h3{font-family: sans-serif; font-size:100%; font-style: italic; text-align: justify; }
                                 """

    feeds = [(u'Política   ', u' http://www.elespectador.com/noticias/politica/feed'),
             (u'Judicial', u'http://www.elespectador.com/noticias/judicial/feed'),
             (u'Paz', u'http://www.elespectador.com/noticias/paz/feed'),
             (u'Economía', u'http://www.elespectador.com/economia/feed'),
             (u'Soy Periodista', u'http://www.elespectador.com/noticias/soyperiodista/feed'),
             (u'Investigación', u'http://www.elespectador.com/noticias/investigacion/feed'),
             (u'Educación', u'http://www.elespectador.com/noticias/educacion/feed'),
             (u'Salud', u'http://www.elespectador.com/noticias/salud/feed'),
             (u'El Mundo', u'http://www.elespectador.com/noticias/elmundo/feed'),
             (u'Nacional', u'http://www.elespectador.com/noticias/nacional/feed'),
             (u'Bogotá', u'http://www.elespectador.com/noticias/bogota/feed'),
             (u'Deportes', u'http://www.elespectador.com/deportes/feed'),
             (u'Tecnología', u'http://www.elespectador.com/tecnologia/feed'),
             (u'Actualidad', u'http://www.elespectador.com/noticias/actualidad/feed'),
             (u'Opinión', u'http://www.elespectador.com/opinion/feed'),
             (u'Editorial', u'http://www.elespectador.com/opinion/editorial/feed')]
PK�X`J���el_faro.png�PNG


IHDRݭ�'PLTE<����	rtRNS"DUfw�����2�UIDAT�c`�p��
��@�l���`�hm�B(��sc��{�&��8�rN�z�,s���@!�%P�7��:� �';���IEND�B`�PK�Xq��;��el_faro.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class ElFaroDeVigo(BasicNewsRecipe):
    title = u'El Faro de Vigo'
    oldest_article = 1
    max_articles_per_feed = 100
    __author__ = 'Jefferson Frantz'
    description = 'Noticias de Vigo'
    timefmt = ' [%d %b, %Y]'
    language = 'es'
    encoding = 'cp1252'
    no_stylesheets = True
    remove_javascript = True

    feeds = [
        (u'Galicia', u'http://www.farodevigo.es/elementosInt/rss/4'),
        (u'España', u'http://www.farodevigo.es/elementosInt/rss/6'),
        (u'Mundo', u'http://www.farodevigo.es/elementosInt/rss/7'),
        (u'Economía', u'http://www.farodevigo.es/elementosInt/rss/10'),
        (u'Sociedad y Cultura', u'http://www.farodevigo.es/elementosInt/rss/8'),
        (u'Sucesos', u'http://www.farodevigo.es/elementosInt/rss/9'),
        (u'Deportes', u'http://www.farodevigo.es/elementosInt/rss/11'),
        (u'Agenda', u'http://www.farodevigo.es/elementosInt/rss/21'),
        (u'Gente', u'http://www.farodevigo.es/elementosInt/rss/24'),
        (u'Televisión', u'http://www.farodevigo.es/elementosInt/rss/25'),
        (u'Ciencia y Tecnología', u'http://www.farodevigo.es/elementosInt/rss/26')]

    extra_css              = '''.noticia_texto{ font-family: sans-serif; font-size: medium; text-align: justify }
                                h1{font-family: serif; font-size: x-large; font-weight: bold; color: #000000; text-align: center}
                                h2{font-family: serif; font-size: medium; font-weight: bold; color: #000000; text-align: left}
                                .enlacenegrita10{font-family: serif; font-size: small; font-weight: bold; color: #000000; text-align: left}
                                .noticia_titular{font-family: serif; font-size: x-large; font-weight: bold; color: #000000; text-align: center}'''

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']

        url = 'http://estaticos00.farodevigo.es//elementosWeb/mediaweb/images/compartir/barrapunto.gif'
        fitem = soup.find('img', src=url)
        if fitem:
            par = fitem.parent
            par.extract()
        url = 'http://estaticos01.farodevigo.es//elementosWeb/mediaweb/images/compartir/barrapunto.gif'
        fitem = soup.find('img', src=url)
        if fitem:
            par = fitem.parent
            par.extract()
        url = 'http://estaticos02.farodevigo.es//elementosWeb/mediaweb/images/compartir/barrapunto.gif'
        fitem = soup.find('img', src=url)
        if fitem:
            par = fitem.parent
            par.extract()

        return self.adeify_images(soup)

    def postprocess_html(self, soup, first_fetch):
        divs = soup.findAll(True, {'class': 'enlacenegrita10'})
        for div in divs:
            div['align'] = 'left'

        return soup

    keep_only_tags = [dict(name='div', attrs={'class': ['noticias']})]

    remove_tags = [
        dict(name=['object', 'link', 'script', 'ul', 'iframe', 'ol']), dict(name='div', attrs={'class': [
            'noticiadd2', 'cintillo2', 'noticiadd', 'noticiadd2']}), dict(name='div', attrs={'class': ['imagen_derecha', 'noticiadd3', 'extraHTML']})

    ]
PK�X�co��el_malpensante.png�PNG


IHDR  ��tRNSn��	pHYs��,�GIDAT�Io�W�s��Ͷ��ح��i��$��Uj�	v,�[l��b�c�iKD�t"Cǩ�8v���o��s@���Φ��V7�lY�`u��\���߻�G71�D@`����tF^��}[/yz���Z����L=1����)0����O\~ӳ/�(廞�tp��Ӆ���C�6�`&��ŗ<}�r.ʹ�M�M>�膇�������)j��9�3����q���u������}|ͧ���3S�X�,�
Yc�
$���������^�tl�o_���?�	4*L!�Z�
�G0��
$�x��pu��������6$�)�аix�S?r��=����ק�ʟ���;���2*qb��t���}�p�z`P`n�Wl��ҷm�u>��On}�����.Y�fB�(I�\���-��u;��CI
���6ް�������s�3�~�{?��E�k�C% �ʞr]���
����I�a�����#��:z�s�q�m�_��dO�&�$!����)K�X�d}I���ή	00��@_��?ҩŮ����|���]��ń�E+F!#J�H9P��s�%���:�+�w������5kFeb�	�@�R+fB2�-2�9gz�9����bj�#�yK�0��d���+�sMG�j�Xu6,E��NN�g���0T�6-���C[O�~`(0�2��*�v&w=���fC���M�Fo�΅�v�9ܶ�����4�Z����}'�
�Q�t{�D���x���k���c�#��5��|�s��yOo�0J�k7������$%	}�X?�8�+�驷\�������Z�����Ģ֖�޺Ѻ!�����D.�]y&��-�U�'����R1ֿ�pϤR#����0V���g�ZB�L(��^)o�F�)�ʎ�HI���<ɂ@$S���U�L(d�$%]aAK-Vbb��3u#����)ju���'ǪDIR#E1I�8QU�B�ȓv�i�"ĖF����􅽙EG�W�D�]h�$�b��u�������RM+&!��J�f@|��A��h�eeK�j-q�ܴ:ЙjZ��mYʤJ�S$9��*@�L��B)O4ھηma�h���m�7m�3��$]��SW�,�ʮ<���v��9�8cԓ��K��l�-��V/Y۲��?�=k����z�lM��#e�G���{�|�(\�ӑ›.���M�]�$FZ-2��Z�K��\��p���?���Ԧ�<J�M���.鎔�ũX�������g�@R.뎔��z�䆽�ܽ︠0����+���X5��uG�8V��IQHR��k[1�岙�ֶ��ꎣ�˗ﻏ������@�J�i�f�Z��6��
�[J!W�D�P���x�;w��=t�r4ꖾAT?6���c��6J�Lhą����,���;����z����c����TݨQ�(h�-�_|�`���MÁnW�ɂ@�ę��N8���z�}�����9�筜����U�B-�Z��8��ɞ���R��#�
V�2�IEND�B`�PK�X<�-J��el_malpensante.recipe# coding=utf-8
# https://github.com/iemejia/calibrecolombia

'''
http://www.elmalpensante.com/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ElMalpensante(BasicNewsRecipe):
    title = u'El Malpensante'
    language = 'es_CO'
    __author__ = 'Ismael Mejia <iemejia@gmail.com>'
    cover_url = 'http://elmalpensante.com/img/layout/logo.gif'
    description = 'El Malpensante'
    oldest_article = 30
    simultaneous_downloads = 20
    use_embedded_content = True
    remove_empty_feeds = True
    max_articles_per_feed = 100
    feeds = [(u'Artículos', u'http://www.elmalpensante.com/articulosRSS.php'),
             (u'Malpensantías',
              u'http://www.elmalpensante.com/malpensantiasRSS.php'),
             (u'Margaritas', u'http://www.elmalpensante.com/margaritasRSS.php'),
             # This one is almost the same as articulos so we leave articles
             #              (u'Noticias', u'http://www.elmalpensante.com/noticiasRSS.php'),
             ]
PK�X�A�33el_mercurio_chile.png�PNG


IHDR��h6�IDATx�eR�KTQ=�͌�����)�V%&D" T�6Q�/T�����V�Z�j��h�&�~����4�ꙣ�3�͛wo�_N.���9��>y�����h����4(�<�Ֆ�Ih���;�ke�����RW&N�.�o��/�(n�05QHٍ����x
��P���s��c� S����ۏ+��P���F�zja��H��@�$��O+?�*��ܮ^��鈭3I����B��5˷yO���&
��@�fB����&*����]�\F����n�������}��Cq�=�9x�]��6bg�n=�[Z
@�T �����j�UiS��½�.|.�mB�!B
�:���
CJZ�SG��
�9�P�t45αs�&D={|���9ֺ�Z`��"���ޱ�����m�*D���C'�D8<в }��4pN�hԾ�O޸7sm������<@�2(WG�
,s�(���<�,U�*K����)(�����F�oDIEND�B`�PK�X�h&]
]
el_mercurio_chile.recipe#!/usr/bin/env python
# -*- coding: utf-8 mode: python -*-

__license__ = 'GPL v3'
__copyright__ = '2009-2015, Darko Miletic <darko.miletic at gmail.com>'
__docformat__ = 'restructuredtext es'
'''
www.emol.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ElMercurio(BasicNewsRecipe):
    title = 'Emol.com - El sitio de noticias online de Chile'
    __author__ = 'Darko Miletic'
    description = 'El sitio de noticias online de Chile'
    publisher = 'El Mercurio S.A.P.'
    category = 'news, politics, Chile'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf8'
    masthead_url = 'http://static.emol.cl/emol50/img/logo_emol.gif'
    remove_javascript = True
    use_embedded_content = False
    language = 'es_CL'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': ['cont_iz_titulobajada', 'info-notaemol-por',
                                          'info-notaemol-porfecha']}), dict(name='div', attrs={'id': 'texto_noticia'})
    ]
    remove_tags = [
        dict(name='div', attrs={'id': 'cont_iz_cuerpo_relacionados'})]

    feeds = [

    (u'Nacional', u'http://www.emol.com/noticias/nacional/todas.aspx'),
    (u'Mundo', u'http://www.emol.com/noticias/internacional/todas.aspx'),
    (u'Deportes', u'http://www.emol.com/noticias/deportes/todas.aspx'),
    (u'Espectaculos', u'http://www.emol.com/noticias/cultura/todas.aspx'),
    (u'Tecnologia', u'http://www.emol.com/noticias/economia/todas.aspx')
    ]

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(0, _('Fetching feed') + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            soup = self.index_to_soup(feedurl)
            arts = soup.find('div', attrs={'id': 'caja_listado_noticia_todas'})
            if arts:
                for item in arts.findAll('div', attrs={'class': 'listado'}):
                    atag = item.find('a')
                    ptag = item.find('span')
                    url = atag['href']
                    title = self.tag_to_string(atag)
                    description = self.tag_to_string(ptag)
                    articles.append({
                        'title': title, 'date': '', 'url': url, 'description': description
                    })
                totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X��ws��el_mostrador.png�PNG


IHDR  D����PLTE666���RRR���������


UUUvvvnnn���HHHrrr:::lll���OOOggg���jjj9"i@U4
���...���������			��񷷷[[[��㵵�hhhqqq���{{{`:�y&׃*ԁ)�_ <<<����ccc������+++��鋋���۪��������,�s$ւ)؃*bbb���555)))���sss��Г��������N2�(�TFFF���777(((��峴�2!�v%oC������444BBBKKK������TTT���;;;������+)(nC�~(�g!&aaaiiiWWW&&&222III000===ooo:;;F+jA^9!�����IDAT�1J�@��@�`C��]D�n�J;�yw�
�pp�t�\�ť���TA�AT�$f�(N}���'m��-a�&���J�k�ѱ��U���D������c�+V��RvM֦ߓ�^-fV�:#���*��`I�i<V'0xA�Ǭ�ľP���t����p�_E�ŖωO}�KF�#�k�0�>�����Q��1�~�'��!)�IEND�B`�PK�Xr{W��el_mostrador.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1313609361(BasicNewsRecipe):
    news = True
    title = u'El Mostrador'
    __author__ = 'Alex Mitrani'
    description = u'Chilean online newspaper'
    publisher = u'La Plaza S.A.'
    category = 'news, rss'
    oldest_article = 7
    max_articles_per_feed = 100
    summary_length = 1000
    language = 'es_CL'
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    masthead_url = 'http://www.elmostrador.cl/assets/img/logo-elmostrador-m.jpg'
    remove_tags_before = dict(name='div', attrs={'class': 'news-heading cf'})
    remove_tags_after = dict(name='div', attrs={'class': 'footer-actions cf'})
    remove_tags = [dict(name='div', attrs={'class': 'footer-actions cb cf'}), dict(name='div', attrs={'class': 'news-aside fl'}), dict(name='div', attrs={'class': 'footer-actions cf'}), dict(name='div', attrs={'class': 'user-bar', 'id': 'top'}), dict(name='div', attrs={'class': 'indicators'}), dict(name='div', attrs={'id': 'header'})  # noqa
                   ]

    feeds = [
    (u'Temas Destacados', u'http://www.elmostrador.cl/destacado/feed/'),
    (u'El D\xeda', u'http://www.elmostrador.cl/dia/feed/'),
    (u'Pa\xeds', u'http://www.elmostrador.cl/noticias/pais/feed/'),
    (u'Mundo', u'http://www.elmostrador.cl/noticias/mundo/feed/'),
    (u'Negocios', u'http://www.elmostrador.cl/noticias/negocios/feed/'),
    (u'Cultura', u'http://www.elmostrador.cl/noticias/cultura/feed/'),
    (u'Vida en L\xednea', u'http://www.elmostrador.cl/vida-en-linea/feed/'),
    (u'Opini\xf3n & Blogs', u'http://www.elmostrador.cl/opinion/feed/')
             ]
PK�X��v�GGel_mundo_co.png�PNG


IHDRVu\�IDATx�c��L�~$�IEND�B`�PK�X��QNNel_mundo_co.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class ColombiaElMundo02(BasicNewsRecipe):
    title = u'Periódico El Mundo'
    __author__ = 'BIGO-CAVA'
    language = 'es_CO'
    cover_url = 'http://www.elmundo.com/portal/img/logo_mundo2.png'
    remove_tags_before = dict(id='miga_pan')
    remove_tags_after = [
        dict(name='div', attrs={'class': 'cuadro_opciones_new1'})]
    remove_tags = [dict(name='div', attrs={'class': 'ruta'}),
                   dict(name='div', attrs={'class': 'buscador'}),
                   dict(name='div', attrs={'class': 'iconos'}),
                   dict(name='div', attrs={'class': 'otros_iconos'}),
                   dict(name='div', attrs={'class': 'cuadro_opciones_new1'}),
                   dict(name='div', attrs={'class': 'otras_noticias'}),
                   dict(name='div', attrs={'class': 'notas_relacionadas'}),
                   dict(name='div', attrs={'id': 'lateral_2'})]
    oldest_article = 2
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    masthead_url = 'http://www.elmundo.com/portal/img/logo_mundo2.png'
    publication_type = 'newspaper'

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h1{font-family: sans-serif; font-size:150%; font-weight:bold; text-align: justify; }
                               h3{font-family: sans-serif; font-size:100%; font-style: italic; text-align: justify; }
                                 """

    feeds = [(u'Opinión', u'http://www.elmundo.com/images/rss/opinion.xml'),
             (u'Economía', u'http://www.elmundo.com/images/rss/noticias_economia.xml'),
             (u'Deportes', u'http://www.elmundo.com/images/rss/deportes.xml'),
             (u'Política   ', u'http://www.elmundo.com/images/rss/noticias_politica.xml'),
             (u'Antioquia', u'http://www.elmundo.com/images/rss/noticias_antioquia.xml'),
             (u'Nacional   ', u'http://www.elmundo.com/images/rss/noticias_nacional.xml'),
             (u'Internacional',
              u'http://www.elmundo.com/images/rss/noticias_internacional.xml'),
             (u'Servicios Públicos',
              u'http://www.elmundo.com/images/rss/noticias_servicios_publicos.xml'),
             (u'Infraestructura',
              u'http://www.elmundo.com/images/rss/noticias_infraestructura.xml'),
             (u'Mobilidad', u'http://www.elmundo.com/images/rss/noticias_movilidad.xml'),
             (u'Derechos Humanos',
              u'http://www.elmundo.com/images/rss/noticias_derechos_humanos.xml'),
             (u'Vida', u'http://www.elmundo.com/images/rss/vida.xml'),
             (u'Cultura', u'http://www.elmundo.com/images/rss/cultura.xml')]
PK�X�Ma11el_mundo_today.png�PNG


IHDR  ��tRNSn��	pHYs��,��IDATH��VKH�Q�V?�"b����
%��M�9�-����1dj��s�m�Ԣ(���FA��,,C�"�,Bz9���9�ޙ����hVy��sϹ���s��{�H�@�G�U
�|�� X
#�B�D5�4��9�����E5g��ܪߜ��^J�H�V&�~�;�w��c!�8�پ0�5��[�]�v��V�VoLJ1N���R�N���i�{��FT8���z��f"�ʷ<5�[�U�(��Fi�Xjm�$�`�o����xN��2"����$|�p�	��a�����q��0ܬQ ���ط�oc�*�	�+x<�G>B�Q7[�1T ��1Չ�v\j�.i
~�"��r~7��X�,�|eH��S�(���g�d!56��@�@ �p;�K�Z��[+<�!�D6_��0قl
?#��"��
�^e��;I2�/�M�?OlaKV^4�rofz0�e�9d.Qs���$�?�f\Պf
�@n2���i�餓��HNj5=׆�N��S���ʲ�EZ�r��Ip9���1%���&��e�׋�[���u	LZ�_�X��y����:~*����3������^�'�r�1U}���x}�h�>E��V������K1�9?>M��1<�3��D�	(�K�߻�a��3(���!ƒxs�{�or�
	uoU?jP�˚*Uc�	I��NR6j�I)��Kt㣿A�O	*���V	iP0ͦIEND�B`�PK�X�]���el_mundo_today.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class ElMundoTodayRecipe(BasicNewsRecipe):
    title = 'El Mundo Today'
    description = u'La actualidad del ma\u00f1ana'
    category = 'Noticias, humor'
    cover_url = 'http://www.elmundotoday.com/wp-content/themes/EarthlyTouch/images/logo.png'
    oldest_article = 15
    max_articles_per_feed = 60
    auto_cleanup = False
    no_stylesheets = True
    remove_javascript = True
    language = 'es'
    use_embedded_content = False
    publication_type = 'blog'

    preprocess_regexps = [
        (re.compile(r'</title>.*<!--Begin Article Single-->', re.DOTALL),
         lambda match: '</title></head><body>'),
        (re.compile(r'<img alt="" src="http://www.elmundotoday.com/wp-content/themes/emt/images/otrassecciones-line.gif">'),
         lambda match: ''),
        (re.compile(r'<div style="clear: both;"></div>.*</body>', re.DOTALL),
         lambda match: '</body>')
    ]

    keep_only_tags = [
        dict(name='div', attrs={'class': 'post-wrapper '})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'social4i'}),
        dict(name='span', attrs={'class': 'num-comentarios'})
    ]

    remove_attributes = ['href', 'title', 'alt']

    extra_css = '''
        .antetitulo{font-variant:small-caps; font-weight:bold} .articleinfo{font-size:small}
        img{margin-bottom:0.4em; display:block; margin-left:auto; margin-right:auto}
    '''

    feeds = [('El Mundo Today', 'http://www.elmundotoday.com/feed/')]
PK�X�;�44el_nacional.png�PNG


IHDR  D����PLTE��?��?��B	��A		��?��?��B��B��=��?��?n[��A�:��?�9��?ֵ6%	��A�k ��-9/��(5,޸7�9_N��(��>��A��B	7,��A��?B7�:��C��-p\��=��>��>~h ��=7/߸7��>}h dS��?��A��?SE<2Ϭ5��?iX�:jY�l 90:0��:=3}g ��>gU߽9��A�:��*��Ej ze��<��B��?��BhVZJߺ7��?�9 	��-r^ͪ3��>zd��AcRߺ9#	��0#	o\kY��<ӯ5i �j ��<90��*p]RCaQ�|%��tRNS@��fbIDATx���â�A�j��rl;�=�m�z������4�;�p�#uI*�08�
���BH��t3ŕr��g�l����8�_�]`5�ﲶ[�tWNY��L�
�D���у;�;���;z��)iB�Z�O�|�{���p�&iAU<?������a}3@E|G��+���{�q�����̥s"�}��������?p�����68d/�ߩ޻/g!������|T
��O�,h���^z��&\�D�ؾ��I"�}n���-Mf�J��i��v�6��5D)�?:��q��o!uõ_�1*�)�\��<���+�;��ߩ�L�7���F�;���A����IEND�B`�PK�X$JZGGel_nacional.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class ElNacional(BasicNewsRecipe):
    title = 'ElNacional.cat'
    description = (
        'ElNacional.cat is an online Catalan-language newspaper edited in Barcelona.'
        ' It is ranked 1st by unique monthly visitors among Catalan newspapers,'
        ' with over 3.3 million monthly visitors as at March 2022.')
    oldest_article = 2  # days
    max_articles_per_feed = 30  # articles
    auto_cleanup = True
    language = 'ca'
    __author__ = 'santboia'
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}

    feeds = [
        ('Portada', 'https://www.elnacional.cat/uploads/feeds/feed_ca.xml'),
    ]
PK�X1ډ%jjel_observador.png�PNG


IHDR  ��1IDATx�c`h(�-�`��^:Í�o�}�����?vݽ�b,�h�߿��w@s�����ޝ�#Jwo�ݷk����>.۽����L�&�����?\x�L��
MSc��+o�}-��H�*����~	4���_m���2����pǖ��nv6�`G=�����{/�|��\E�����������-�-�iy��K����Z���{��!>9��r��k�,[�8D&D0�n���	[t8�t����*I�S�~��q�&a���	��b�v�Lgn������@�GcJI�̚�H�H�0�36T��r��駏�-�y�$P���N�-P��
q�쳧[�9��ǟ?�X54��1��@]Sz��������R��������7������o���M�[���_��ΛABa,�}���^��t�y�!�}�h��u��
w߿flL)`���$d��O��UdV8��}�p�S�%�Y���B}r���'�����j���2�[֯�~�_�,�^�\x�l���|x�p��2jU�t�[8��IEND�B`�PK�X]iڷ�el_observador.recipe#!/usr/bin/env python
##
# Last Edited:  2018-02-13 Carlos Alves <carlosalves90@gmail.com>
##

__license__ = 'GPL v3'
__author__ = '2010, Yuri Alvarez<me at yurialvarez.com>'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'

'''
elobservador.com.uy
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Noticias(BasicNewsRecipe):
    title = 'El Observador'
    __author__ = 'yrvn'
    description = 'Noticias desde Uruguay'
    tags = 'news, sports, entretainment'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 5
    encoding = 'utf8'
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 2
    max_articles_per_feed = 100
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'detail-title newDetailTextChange'}),
        dict(name='div', attrs={'class': 'cuerpo air newDetailTextChange'})
    ]
    remove_tags = [
        dict(name='div', attrs={
             'class': ['fecha', 'copyright', 'story_right']}),
        dict(name='div', attrs={'class': ['photo', 'social']}),
        dict(name='div', attrs={'id': 'widget'}),
        dict(name=['object', 'link'])
    ]

    remove_attributes = ['width', 'height', 'style', 'font', 'color']

    extra_css = '''
                h1{font-family: Georgia,"Times New Roman",Times,serif}
                h3{font-family: Georgia,"Times New Roman",Times,serif}
                h2{font-family: Georgia,"Times New Roman",Times,serif}
                p{font-family: Verdana,Arial,Helvetica,sans-serif}
                body{font-family: Verdana,Arial,Helvetica,sans-serif}
                img{margin-bottom: 0.4em; display:block;}
                '''

    feeds = [
        (u'Portada', u'http://www.elobservador.com.uy/rss/home.xml'),
    ]

    def get_cover_url(self):
        return None

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X�����el_pais.png�PNG


IHDR(-S-PLTE!  .--<;;JIIXWWtss�������������������������
�WUIDATx�mυ
� Eч����#G<B��#Y@�ɿDy�|�xx�@� �~��
�!�e�����	+���a�H��sG����a�IEND�B`�PK�X�LW�]]el_pais.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Alvaro Beiro, improving Jordi Balcells work based on an earlier version by Lorenzo Vigentini & Kovid Goyal'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
description = 'Main daily newspaper from Spain - v1.05 (13, March 2023)'
__docformat__ = 'restructuredtext en'

'''
elpais.es
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ElPais(BasicNewsRecipe):
    __author__ = 'Kovid Goyal & Lorenzo Vigentini & Jordi Balcells & Alvaro Beiro'
    description = 'Main daily newspaper from Spain'

    title = u'El Pa\xeds'
    publisher = u'Ediciones El Pa\xeds SL'
    category = 'News, politics, culture, economy, general interest'
    publication_type = 'newspaper'

    language = 'es'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 2.1
    max_articles_per_feed = 25

    use_embedded_content = False
    recursion = 5

    remove_javascript = True
    no_stylesheets = True

    extra_css = '''
span._db {max-width: 100%; height: auto;}
.a_m_p {font-size: .75rem;}
.a_m_m {text-transform: uppercase; padding-top: 0.5rem;}
div.a_md_a {text-align: center; text-transform: uppercase; font-size: .8rem;}
'''

    keep_only_tags = [
        dict(attrs={'class': [
                              'article_header',
                              'article_body',
                              'a_t',
                              'a_st',
                              'articulo-titulares',
                              'articulo-apertura',
                              'articulo__contenedor'
                              'a_e_m',
                              'a_md_a',
                             ]}),
        dict(name='div', attrs={'class': 'a_c',}),

    ]

    remove_tags = [
        dict(
            attrs={'class': [
                              'sumario__interior',
                              'articulo-trust',
                              'compartir',
                              'articulo-tags',
                              'outbrain',
                              'more_info',
                              'articulo-apoyos',
                              'top10',
                              'a_ei',
                              'w-cta',
                              'ph-v_b',
                             ]
                    },
            ),
        dict(id='cta_id'),
        dict(name='svg'),
    ]

    remove_attributes = ['width', 'height']

    feeds = [
        (u'Espa\xf1a', u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/espana/portada'),
        (u'Internacional',
         u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/internacional/portada'),
        (u'Economía', u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/economia/portada'),
        (u'Opinión', u'http://ep00.epimg.net/rss/elpais/opinion.xml'),
        (u'Ciencia', u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/ciencia/portada'),
        (u'Tecnología',
         u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/tecnologia/portada'),
        (u'Cultura', u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/cultura/portada'),
        (u'Estilo', u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/estilo/portada'),
        (u'Deportes', u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/deportes/portada'),
        (u'Televisión', u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/television/portada'),
        (u'Sociedad', u'https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/sociedad/portada'),
        (u'Blogs', u'http://ep01.epimg.net/rss/elpais/blogs.xml'),
    ]

    def get_cover_url(self):
        from datetime import date
        cover = ('https://srv00.epimg.net/pdf/elpais/snapshot/' +
                 str(date.today().year) + '/' + date.today().strftime('%m') + '/elpais/' +
                 str(date.today().year) +  date.today().strftime('%m') + date.today().strftime('%d') + 'Big.jpg')
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover)
        except:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def image_url_processor(cls, baseurl, url):
        splitUrl = url.split("cloudfront-")
        parsedUrl = 'https://cloudfront-' + splitUrl[1]
        return parsedUrl
PK�X�����el_pais_babelia.png�PNG


IHDR  D���	pHYs��,��PLTE			    ""  #""%##%%%'%%'''(''(((*((,**,,,-,,---///0--0//000200322333533555655666966977999:99<99<::<<<=::=<<>==A??BAACBBCCCECCEEEFCCFEEFFFGFFGGGHGGJHHJJJKJJNNNQPPRQQTSSUTTUUUXVVYYY[ZZ[[[^]]_^^a``caadccdddeddfeegffhgghhhihhjiikiilkkmllnmmpoovvvwwwxxxyxx{zz|||}||}}}~~~�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������8`ÎtRNS@��f�IDAT}�]oTU��w�Ι�(v�S���	���11^.����xkl�(5�:P���2�L��^�&5��<���	>m%\���*�]�$�i.���߇�7g��*뫭\��߲�

xP���W��oW��d�!y��9s�7�G'U�I����$ӽ%��́P'K�6��{�d�}�zF�9�}�4f) ���N�?�?̴�z�
��"+�ޞ��jD�ݦ�H����?��F�ӟ,@8w����R�˝�iwpcG�����٬Ӭ˳�۶6��,�'�.8���f�T7Ub
g���?�J~�ӿ��Z?����2�)Uc���F��:�����%+^���9-,-V"��A�����>X<ViAx-6�ݐ���C�����R�sΑ��g�k'����L? g��]^��I�ܦ7�!�EgQ+i6����=d	x�F��~܋�<�� �k%I��Z����oU( U^��	��_��W�z����E��4.�L{�/�?�p
���_�ԣ� ������X(&��cE�r�ԼqFpV��mډa�C���5!M�BS�!�_���Ǡ�áG��mg�n}�.z�9���&�j�y���
l�PN���"V%��9o�){36�(-�IEND�B`�PK�X$vC�>>el_pais_babelia.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class ElPaisBabelia(BasicNewsRecipe):

    title = 'El Pais Babelia'
    __author__ = 'oneillpt'
    description = 'El Pais Babelia'
    INDEX = 'http://www.elpais.com/suple/babelia/'
    language = 'es'

    remove_tags_before = dict(name='div', attrs={'class': 'estructura_2col'})
    keep_tags = [dict(name='div', attrs={'class': 'estructura_2col'})]
    remove_tags = [dict(name='div', attrs={'class': 'votos estirar'}),
                   dict(name='div', attrs={'id': 'utilidades'}),
                   dict(name='div', attrs={'class': 'info_relacionada'}),
                   dict(name='div', attrs={'class': 'mod_apoyo'}),
                   dict(name='div', attrs={'class': 'contorno_f'}),
                   dict(name='div', attrs={'class': 'pestanias'}),
                   dict(name='div', attrs={'class': 'otros_webs'}),
                   dict(name='div', attrs={'id': 'pie'})
                   ]
    remove_javascript = True

    def parse_index(self):
        articles = []
        soup = self.index_to_soup(self.INDEX)
        feeds = []
        for section in soup.findAll('div', attrs={'class': 'contenedor_nuevo'}):
            section_title = self.tag_to_string(section.find('h1'))
            articles = []
            for post in section.findAll('a', href=True):
                url = post['href']
                if url.startswith('/'):
                    url = 'http://www.elpais.es' + url
                    title = self.tag_to_string(post)
                    if str(post).find('class=') > 0:
                        klass = post['class']
                        if klass != "":
                            self.log()
                            self.log('--> post:  ', post)
                            self.log('--> url:   ', url)
                            self.log('--> title: ', title)
                            self.log('--> class: ', klass)
                            articles.append({'title': title, 'url': url})
            if articles:
                feeds.append((section_title, articles))
        return feeds
PK�X�-���el_pais_uy.png�PNG


IHDR  ���IDATx�}�s�#���dֻ�6���ڶ�k�˱m۶�8�5�ŚW���v�cU}�ۧO�:�"G��#�>��K�N*���C)��_�H�~599IH��$�@S��w�m.լ�I�=�FxbrOM��#�mS��Q���r��4�B;�j��Ŗ��q悗�m�U�#	��æh��7�S�@G8�>	�%��h��;��68���H�/Nצ�=�8ĵ#�$}c���5!ۮf��P�����EJb<�I
ĜS��+ᇒE���[�ԂW*[�:�օ#:���ln�pE�[tc�s}�R�c�FO��4����@�X
��m�/~�/��pş�̆�F�����|�os#�r��•^���G��3�hװ��כ�#�.�g��_|��^/�V�4t?��>��}!Y��Oe��^���ڭϵ^�����a�TFi'�{Ҍ��hw|v��i��rV���������>w�j��T�t���c���Ak��Ѣ/.Y�I�23{Ld�Z�2��r�����5�A��Oc��v:3p������V;�7�p'DŽ^Ζ�y�c�KF��0�򫢴St��F�ހ��z�+M���U�|!ә,:e��@t���)��W6&!rj�s�ߧ�>1�*�n\H�+��=���`�������
�<����#5H;sW9�ү�t+�X�=���W��~�9���[��ݤTi[G$�^��K�<�Å��p}���Ş��`t��"3�#�zg�Q�J�ZK{Z�!��L_��� Sj���H�Y|}���8�gZ�<M8�4=	�ġ]��u1�I �����_�����T:�J��~IwdБvD?�	gZ�D#Й�}X;�XG6gM�Aϊ����o	�}w�h���׋�w	���_���Mp���#:#�[P�DS=+�ib-��'r֗^�w��s������p���d#I?T
Ι��l��bTτ2�����eF�Ҟ�!����1Dg8���0��r��#Z8��i���{Ə��w
�\b��“y���7G
�]��X��z8l�_(!��I��͔v:�:�o�K��Yb*3�K�$J	AL�3xq�\lǾ��2����:M!u����tF��ڛ�̵b��v��~��fW
R�S�8��P֎�69@ǜ�*�����;#3�Z��r���U'�Ţ�6Obל���#@OS=�o�h��̌�wL�V�?�g���Gdj�r��|Nҿ+�oH��mVl��*J[�sV<09CfFn���2��k�R�<���}���{3����`���v����4�ʌ\s:��m�E�iu��@"_f�+�����M�{�j04�-B.�}W�̄7�D^fdƲ	Α�d�n�	�Pj�
s�Q�Y�Y.i�JӃ�[T�*\��e�5�^n��M<C�Pyg�Y��1э�϶˺�Ч2]�E����.��ft{\™��~c�t�M`��M֍�>���Fc����D��e�ˁ��e|*�	h:��pH�������q!�o�q���{%�2	����̈́]�GZyB	�N���i0L>�%��+��Q#����q�|G�3`W
lO��{���B�*�Bs���1C-|�a���L*���Ă�caC${C��C>.Sj~r·/}-,���kg�ư34}g
l�tX��٫?=����$�soK�f�C��
j3Ӿ-6�`�� X��>��w1�S�K�d^<lIEND�B`�PK�X\&wu

el_pais_uy.recipe#!/usr/bin/env python
##
# Last Edited:  2018-02-13 Carlos Alves <carlosalves90@gmail.com>
##

__license__ = 'GPL v3'
__author__ = '2010, Gustavo Azambuja <hola at gazambuja.com>'
'''
http://www.elpais.com.uy/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class General(BasicNewsRecipe):
    title = 'El Pais - Uruguay'
    __author__ = 'Gustavo Azambuja'
    description = 'Noticias de Uruguay y el resto del mundo'
    publisher = 'EL PAIS S.A.'
    category = 'news, politics, Uruguay'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 2
    encoding = 'utf-8'
    publication_type = 'newspaper'
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 2
    max_articles_per_feed = 20
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'title'}),
        dict(name='div', attrs={'class': 'composite-captioned-image'}),
        dict(name='div', attrs={'class': 'content-modules'})
    ]

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }
    remove_tags = [
        dict(name='div', attrs={
             'class': ['date_text', 'comments', 'form_section', 'share_it']}),
        dict(name='div', attrs={
             'id': ['relatedPosts', 'spacer', 'banner_izquierda', 'right_container']}),
        dict(name='p', attrs={'class': 'FacebookLikeButton'}),
        dict(name=['object', 'form']),
        dict(name=['object', 'table'])]

    extra_css = '''
                h1{font-family: Georgia,"Times New Roman",Times,serif}
                h3{font-family: Georgia,"Times New Roman",Times,serif}
                h2{font-family: Georgia,"Times New Roman",Times,serif}
                p{font-family: Verdana,Arial,Helvetica,sans-serif}
                body{font-family: Verdana,Arial,Helvetica,sans-serif}
                img{margin-bottom: 0.4em; display:block;}
                '''

    feeds = [
        (u'Ultimo Momento',
         u'https://www.elpais.com.uy/rss/')
    ]

    def get_cover_url(self):
        cover_url = None
        index = 'https://www.elpais.com.uy/impresa/'
        soup = self.index_to_soup(index)
        link_item = soup.find('a', attrs={'class': 'page-link link-module'})
        # print link_item
        if link_item:
            cover_url = 'https://www.elpais.com.uy' + link_item.get('href')
        return cover_url

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X��F*el_periodico.png�PNG


IHDR  ��tRNSn���IDATxڥV�$K�PEt�D|۶m�^��޳mcf��ٶm�����_u����W䢻��̗�]�����&eU^e<38J8gY�,��r�,���h,��e��<���W��f䇝ƾ�a�{�}�q�.+8�!��[XB�=&�u^pz�;<�s��Z���e)�ˠ+���H	��?�e�Đ����9W�"@r2�YZ��Z�,�~Y�O|�{�+��	�}U\X�@�����i܊=�w�-���̷䙑�;��i��ǯ��s���j�Qñ2\)�’�?�<ڪ~�ï��(�ϣ�Pa@�B+�]?`�F�>�?t�~��ZY��mG����pS�2O,�s���u������(����{���2D*�[3t��r��/~�OZ����+��R�R`
�@��i��f��޳u�T��������x��R�Q�up�7����uN��Kv��"]<x�Z
�f=~9j�L]�+��B`��C�~�J�:��c��Y�J��N�H�Z����$چ1x��J7<C�'97>��K1��G].�y�����\扎�� R���?գ ��=�����m����B:�Z�"�j_�4@� $�}�.���6�?,������^ʪ9Q�h*x��S<�XB���F�Ҫ_�3��U��w�iz<�x�b��QKs��54�>��Y|��-^K�6g��!�zmM�З�]g���N��u��|�SZ�
s��?I�D�sM,�d�S��
q�ⓗ�t�I�% y��!XCH����{5�GzO����f���L\C@�Y�M��sd�ƃȒ�� =�4>�V��t�*������qq+�V��-��T�c+�L�RN;-���6#q�@;����ű�ٴZ�Xnc�E{@���4�Ǩb�q_ۢ�tT�;�Y�D�����E�7QW�q�4]B�--�|+6��S��ȝ�/��2.z_��\$U<��V��i��y��ݩ�,�(��5ƕo��i��N�o�Zx����Lĩ�J$���P^Q�f�t茍�4z����F����7��J��wTHY<����������O��K��D�T�}&zW���+ͭ軸Š���F̎�ώ������i�1�Kp˨�a�t@$x|��Gێ]+����mD�X������
~/�o,�b�Xf���s��.eW�r�3)�/C4,�ba,�����7�4{�ߜIEND�B`�PK�X��NNel_periodico.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '04 December 2010, desUBIKado'
__author__ = 'desUBIKado'
__description__ = 'Daily newspaper from Aragon'
__version__ = 'v0.10'
__date__ = '09, September 2017'
'''
elperiodicodearagon.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class elperiodicodearagon(BasicNewsRecipe):
    title = u'El Periodico de Aragon'
    __author__ = u'desUBIKado'
    description = u'Noticias desde Aragon'
    publisher = u'elperiodicodearagon.com'
    category = u'news, politics, Spain, Aragon'
    oldest_article = 1
    delay = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'es'
    masthead_url = 'http://pdf.elperiodicodearagon.com/img/logotipo.gif'
    encoding = 'iso-8859-1'
    remove_empty_feeds = True
    remove_javascript = True

    feeds = [
        (u'Portada', u'http://zetaestaticos.com/aragon/rss/portada_es.xml'),
        (u'Arag\xf3n', u'http://zetaestaticos.com/aragon/rss/2_es.xml'),
        (u'Internacional', u'http://zetaestaticos.com/aragon/rss/4_es.xml'),
        (u'Espa\xf1a', u'http://zetaestaticos.com/aragon/rss/3_es.xml'),
        (u'Econom\xeda', u'http://zetaestaticos.com/aragon/rss/5_es.xml'),
        (u'Deportes', u'http://zetaestaticos.com/aragon/rss/7_es.xml'),
        (u'Real Zaragoza', u'http://zetaestaticos.com/aragon/rss/10_es.xml'),
        (u'Tecnyconta Zaragoza', u'http://zetaestaticos.com/aragon/rss/91_es.xml'),
        (u'Monta\xf1ismo', u'http://zetaestaticos.com/aragon/rss/354_es.xml'),
        (u'Opini\xf3n', u'http://zetaestaticos.com/aragon/rss/103_es.xml'),
        (u'Tema del d\xeda', u'http://zetaestaticos.com/aragon/rss/102_es.xml'),
        (u'Escenarios', u'http://zetaestaticos.com/aragon/rss/105_es.xml'),
        (u'Sociedad', u'http://zetaestaticos.com/aragon/rss/104_es.xml'),
        (u'Gente', u'http://zetaestaticos.com/aragon/rss/330_es.xml'),
        (u'Espacio 3', u'http://zetaestaticos.com/aragon/rss/328_es.xml'),
        (u'Fiestas del Pilar', u'http://zetaestaticos.com/aragon/rss/107_es.xml'),
        (u'Semana Santa', u'http://zetaestaticos.com/aragon/rss/385_es.xml'), (
            u'La crónica de Valdejal\xf3n',
            u'http://zetaestaticos.com/aragon/rss/206_es.xml'
        ), (
            u'La crónica de Campo de Borja',
            u'http://zetaestaticos.com/aragon/rss/208_es.xml'
        ), (
            u'La crónica de Ejea y sus pueblos',
            u'http://zetaestaticos.com/aragon/rss/212_es.xml'
        ), (
            u'La crónica del Bajo Gállego',
            u'http://zetaestaticos.com/aragon/rss/205_es.xml'
        ), (
            u'La crónica del Campo de Cariñena',
            u'http://zetaestaticos.com/aragon/rss/207_es.xml'
        ), (
            u'La crónica de la Ribera Alta del Ebro',
            u'http://zetaestaticos.com/aragon/rss/211_es.xml'
        ), (
            u'La crónica del Campo de Belchite',
            u'http://zetaestaticos.com/aragon/rss/331_es.xml'
        )
    ]

    remove_tags_before = dict(name='div', attrs={'class': 'Pagina'})
    remove_tags_after = dict(name='div', attrs={'class': 'ComentariosNew'})

    keep_only_tags = [dict(name='div', attrs={'class': 'Pagina'})]

    remove_tags = [
        dict(
            name='nav',
            attrs={'class': ['Compartir', 'HerramientasConversacion Herramientas']}
        ),
        dict(name='h5', attrs={'class': ['CintilloBox']}),
        dict(
            name='div',
            attrs={
                'class': [
                    'BoxMenu BoxMenuConFoto', 'BxGalerias', 'ConStick',
                    'HerramientasComentarioNew Herramientas', 'NumeroComentarioNew'
                ]
            }
        ),
        dict(
            name='div',
            attrs={
                'class': [
                    'BoxPestanas', 'Box', 'ColumnaDerecha',
                    'NoticiasRelacionadasDeNoticia',
                    'CintilloNoticiasRelacionadasDeNoticia'
                ]
            }
        ),
        dict(name='a', attrs={'class': ['IrA BotonLink']})
    ]

    # Recuperamos la portada de papel (la imagen format=1 tiene mayor resolucion)

    def get_cover_url(self):
        index = 'http://pdf.elperiodicodearagon.com/edicion.php'
        soup = self.index_to_soup(index)
        for image in soup.findAll('img', src=True):
            if image['src'].startswith('/funciones/img-public.php?key='):
                return 'http://pdf.elperiodicodearagon.com' + image['src']
        return None

    extra_css = '''
                    h1 {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:28px;}
                    h2 {font-family:Arial,Helvetica,sans-serif; font-style:italic;font-size:14px;color:#4D4D4D;}
                    h3 {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:18px;}
                '''
PK�Xi��##el_publico.png�PNG


IHDR  D���PLTE�5�2�4�3�2�3�4����3���"A�6�������z������������8�������;����4�5�1�6S����Pi䍝�������@[�.L吠�&E�5������Hb�:V�5Q����Vn颯�Qj�)G�e{�������������;W�6撢����j��
/�^u������cy���疥ㅖ㆘�������h}⁓�i疤������B]����0M�������}�㉙�Zq�l�厞�Jd�������%D�,J�9U�����䊛������!A���鞬�g}�0Nₔ撡����E`蚨����Wo�F`�n�꦳�`w螬�\s�+I��蝫������p��q�擣�*H꠭���頮�`v㇘�#B�Mf����䉚�(F�>����颰�������%C�Le䌜����Yp痦���;�[r⃕�x����=�9����Lf�|�‒�8T����!@�7쬷�Sl�s����䋜�:맴����Yq�z�멵��=�6���IDATx^m�c��@�$K�m׶m۶m�6�ଢ଼�I��������N�2P4�.�щM�`@�g�ܽ�p�'#=�^
8�m[��=Y����W�l��b�K|�j ���O�Y=1w��c�G8 >YbJN�;sea!�1���s��	�r��4��ɳ�8��E)|��ܥVv�C����oԾ��
���`�.즺ȫ_�����UT�OpK�$pJ��T��X���H59j4�1\6V��qj��&���[tߺMM��	Զ��dT��5
�$��	���
p��E���K����胊�'008T�a}з€�d%��e
_�l��rUʵ�0a�3A횪�I��;�k׆��L����=2�	d��x"���Q�"��wx%��%s약���7Ao�q���>2@�l�>}&�E�

P��#?�I��R�SO�#jIEND�B`�PK�XuxW<��el_publico.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gerardo Diez'
__copyright__ = 'Gerardo Diez<gerardo.diez.garcia@gmail.com>'
description = 'Main daily newspaper from Spain - v1.00 (05, Enero 2011)'
__docformat__ = 'restructuredtext en'

'''
publico.es
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class Publico(BasicNewsRecipe):
    title = u'Publico.es'
    __author__ = 'Gerardo Diez'
    publisher = u'Mediapubli Sociedad de Publicaciones y Ediciones S.L.'
    category = 'news, politics, finances, world, spain, science, catalunya'
    oldest_article = 1
    max_articles_per_feed = 100
    simultaneous_downloads = 10
    cover_url = u'http://imagenes.publico.es/css/img/logo_publico.gif'
    timefmt = '[%a, %d %b, %Y]'
    encoding = 'utf8'
    language = 'es'
    remove_javascript = True
    no_stylesheets = True
    keep_only_tags = dict(id='main')
    remove_tags = [
        dict(name='div', attrs={
             'class': ['Noticias_642x50', 'contInfo ancho']}),
        dict(name='ul', attrs={'class': ['navComentarios', 'comentarios']}),
        dict(name='div', attrs={
             'id': ['commentsContext', 'toolbar', 'comentarios']}),
        dict(name='h5', attrs={'id': 'comentarios'})
    ]
    feeds = [(u'Internacional', u'http://www.publico.es/estaticos/rss/internacional'),
             (u'Espa\xf1a', u'http://www.publico.es/estaticos/rss/espana'),
             (u'Dinero', u'http://www.publico.es/estaticos/rss/dinero'),
             (u'Ciencias', u'http://www.publico.es/estaticos/rss/ciencias'),
             (u'Culturas', u'http://www.publico.es/estaticos/rss/culturas'),
             (u'Deportes', u'http://www.publico.es/estaticos/rss/deportes'),
             (u'Televisi\xf3n y Gente',
              u'http://www.publico.es/estaticos/rss/televisionygente'),
             (u'Catalu\xf1a', u'http://www.publico.es/estaticos/rss/catalunya'),
             (u'Viajes', u'http://www.publico.es/estaticos/rss/viajes')]
PK�X��H�RR
el_tiempo.png�PNG


IHDR  D���oPLTE���$m�q�k�f�h�k�j�g�f�i�h�h�h�f�g�f�e�f�f�f�f�f�f�g�f�f�f�e�f�f�f�e�f�f�e����$tRNS	$*-.BLQghijkqz��������������R�RnIDATx��΃�P�Yۈ��[�m�}<��.�s!�Q����j�R������'KR����
��4U 
�{F��Q K�gk!�����Y���[���շ�ee]�
.��\�yIEND�B`�PK�X�' 

el_tiempo.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class ColombiaElTiempo02(BasicNewsRecipe):
    title = u'Periódico el Tiempo'
    __author__ = 'BIGO-CAVA'
    language = 'es_CO'
    cover_url = 'http://www.eltiempo.com/media/css/images/logo_footer.png'
    remove_tags_before = dict(id='contenidoArt')
    remove_tags_after = [dict(name='div', attrs={'class': 'modulo reporte'})]
    keep_only_tags = [dict(name='div', id='contenidoArt')]
    remove_tags = [dict(name='div', attrs={'class': 'social-media'}),
                   dict(name='div', attrs={'class': 'recomend-art'}),
                   dict(name='div', attrs={'class': 'caja-facebook'}),
                   dict(name='div', attrs={'class': 'caja-twitter'}),
                   dict(name='div', attrs={'class': 'caja-buzz'}),
                   dict(name='div', attrs={'class': 'ico-mail2'}),
                   dict(name='div', attrs={'id': 'caja-instapaper'}),
                   dict(name='div', attrs={'class': 'modulo herramientas'})]
    oldest_article = 2
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    masthead_url = 'http://www.eltiempo.com/media/css/images/logo_footer.png'
    publication_type = 'newspaper'

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h1{font-family: sans-serif; font-size:150%; font-weight:bold; text-align: justify; }
                               h3{font-family: sans-serif; font-size:100%; font-style: italic; text-align: justify; }
                                 """

    feeds = [(u'Colombia', u'http://www.eltiempo.com/colombia/rss.xml'),
             (u'Medellin', u'http://www.eltiempo.com/colombia/medellin/rss.xml'),
             (u'Economia', u'http://www.eltiempo.com/economia/rss.xml'),
             (u'Deportes', u'http://www.eltiempo.com/deportes/rss.xml'),
             (u'Mundo', u'http://www.eltiempo.com/mundo/rss.xml'),
             (u'Gente', u'http://www.eltiempo.com/gente/rss.xml'),
             (u'Vida de Hoy', u'http://www.eltiempo.com/vida-de-hoy/rss.xml'),
             (u'EEUU', u'http://www.eltiempo.com/mundo/estados-unidos/rss.xml'),
             (u'LatinoAmerica', u'http://www.eltiempo.com/mundo/latinoamerica/rss.xml'),
             (u'Europa', u'http://www.eltiempo.com/mundo/europa/rss.xml'),
             (u'Medio Oriente', u'http://www.eltiempo.com/mundo/medio-oriente/rss.xml'),
             (u'Vive in Medellin', u'http://medellin.vive.in/medellin/rss.xml'),
             (u'Don Juan', u'http://www.revistadonjuan.com/feedrss/'),
             (u'Alo', u'http://www.eltiempo.com/alo/rss.xml')]
PK�X{���bbel_universal.png�PNG


IHDR�a)IDATxڤ�C�XI�uu^Ƕm۶m�vƶm۶mۮtl�Y�?W�>	(��G�'}�x�㳿H�p�̟�{�1Lb�yUc��-���_����>E�E� ��
,�m�%#�6�)2�󀐴6��0�*�ijH����GH�O1��uM-lxbE{GǧG5�8��Kt������ti�YnY@��E���i�}o�?��7�1g����c�9-��4&��Ww��|�����k$�T�٥���V<��p�up
���c8z^�d�T��WFBN)�Imw�*;���o3[��١��dI7�й�|�c�>Zp˘%w��G麩Dž�B�?̼f�4�
o{ʚG�=��œ��ɰSDe�}s��;pZσ��|$�k;�
-��iȯ+n3�;ħ�Om�J@�"�JQe���!"�y7L�
MYǯ����v�Zb�eC_��)���pNߋM2v���G=�+!ͺ�4���f	�n[�s������B���Z�=�M�g˛N�L@o�'M�H|^�p��_��_�2�P�H]���zIEND�B`�PK�X~�L�	�	el_universal.recipe__license__   = 'GPL v3'
__copyright__ = '2009-2016, Darko Miletic <darko.miletic at gmail.com>'
'''
eluniversal.com.mx
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ElUniversal(BasicNewsRecipe):
    title                 = 'El Universal'
    __author__            = 'Darko Miletic'
    description           = ('Sitio líder de noticias minuto x minuto de México y el mundo, con información sobre política,'
                             ' ciudad; videos, interactividad, opinión, blogs')
    oldest_article        = 1
    max_articles_per_feed = 100
    publisher             = 'El Universal'
    category              = 'news, politics, Mexico'
    no_stylesheets        = True
    use_embedded_content  = False
    encoding              = 'utf8'
    auto_cleanup          = True
    auto_cleanup_keep     = ("//div[contains(concat(' ', normalize-space(@class), ' '),"
                             " ' field-name-field-resumen ')] | //div[@class='fechap'] |"
                             " //div[@class='hora'] | //div[contains(concat(' ', normalize-space(@class), ' '), ' field-name-field-fuente ')]")
    remove_javascript     = True
    remove_empty_feeds    = True
    ignore_duplicate_articles = {'url'}
    publication_type      = 'newspaper'
    language              = 'es_MX'
    extra_css = '''
                    body{font-family: Roboto, sans-serif}
                    .h1{font-family: "Duplicate Ionic Bold", serif}
                    .field-name-field-resumen{font-family: "Duplicate Ionic Light", serif; display: block; font-size: large;}
                '''
    feeds = [
              (u'Nacion', u'http://www.eluniversal.com.mx/seccion/1/rss.xml'),
              (u'Mundo', u'http://www.eluniversal.com.mx/seccion/5/rss.xml'),
              (u'Metropoli', u'http://www.eluniversal.com.mx/seccion/6/rss.xml'),
              (u'Estados', u'http://www.eluniversal.com.mx/seccion/13/rss.xml'),
              (u'Cartera', u'http://www.eluniversal.com.mx/seccion/14/rss.xml'),
              (u'Deportes', u'http://www.eluniversal.com.mx/seccion/15/rss.xml'),
              (u'Espectaculos', u'http://www.eluniversal.com.mx/seccion/133/rss.xml'),
              (u'Cultura', u'http://www.eluniversal.com.mx/seccion/17/rss.xml'),
              (u'Ciencia y salud', u'http://www.eluniversal.com.mx/seccion/16/rss.xml'),
              (u'Techbit', u'http://www.eluniversal.com.mx/seccion/5782/rss.xml'),
              (u'Periodismo de investigacion', u'http://www.eluniversal.com.mx/seccion/11363/rss.xml')
            ]

PK�XH�r�\\elclubdelebook.png�PNG


IHDR22�]�#IDATxڭYtE��=����Bz1`������b�X@"�ATQ@�T*RT�)
R�K	H�I~/��;��=G��쟝�y��}��.\�	!!b�Q	�ٹ�t�ҥV��4HL0��j��3�A�Y�q�N�����wEE��j�]��B�Zˮ-�-Gd������r������p��Y"6#I'
B	��Ub!����+V�p8�?H4���YYY�R�N�r��^ozz���Omݺu���=c6��e��RKѯ^�f��6��W�^]�t���I�ĵV�Z������(�v;�)C�Q(i�i��������?޳{���o7t蠌$���!�._�w���7�Fh�B���dM�U�i���Z��JE�4��&Q4�����Q���%�Z��^z�c��y���o
�C������/��SS=Q�4�iX[7
����(_i
��	T�ԕS9J��4֨4UiXSQS

�՚�h<�V��|�zpܣ�������d�G"dӦMF��z[�D���`��B)���*1����dz���n��͖����TW���A�&��͜�i���(	�HRy��Wkjj�l�R^^�}�e	8^0�>}:�$L�GJ���fb$�FA����7n����֭[���
��s��@ ��c(���H5��KpNϮ)k�!ݾ�u�!�٬�E
��r�������{
��h0N��4,�*6��@�0S%
}r؄;z����=��?f�ԛn�ݣ�=xNV�*�_�*5LՄ��y�x���VbG�1��+���<q�绹�cޯ����{1���C:�ш"`gej���m���h$�v�5kVN�k�=���6s�L\lذ��}�����^oD�����w��A)�D�Zh�&��We�-����
�<`�gO�#;;6E�v��np+-#��t��\���mZP
x͘1�U�V�v��ݻwaa!f���[n��0n����,���B^�6k�e�%����.�u�Y�d7����tg���Z�V,
�A���겲2��	���L��C��{��ؐ�{�bIv���,�5��[o��/���3�ྡÆ�^�V;z���w/^���_��:uj�[o�d��[�ߐۼy4Pgv�*k�Wr�e�$41)�8^Ak�I�$A�k7�X�C`�^�G8N̈���l�S\�2ej�^�6n�x�С�>�h���'��G����<��o�ђ$���;6m�ꪫ�oߎ�4gd�~��m��\fhz��傦@�4i�Ǒ��"J\�3[!��ԡC�y���ĩ�ϝ8�9SRR�H2���A<�}�*<�x�T��/?~�x�)	˟9}�H�%�O��}��b,8n�8�@1{�>�a\U�&�
�UX<E+K1��y��lLJJ�1�������b1�h�*??=7W�Z�-[��g����/_��G���}�\uAx���#`�EMLKKCT�1��u��8p��-*R��t���p���Pz:ؚ������Z�.��.Ɓ��!o�t_�V�U��͚�*=`w�Ή��Ξ[�hQ�����{
~GR1�'O��ow5�JL�ȼ�&��/6�9s�;�	Ojk*�B
�
�-��	"���c���{R9O ]
�l<�}��%��J`S��y���4"�|��:�;��_E����>���aNUUU�3�=w�\ӦM��N�{��}��ŰdGrjr*�Q	-�К4m������JMKc6	��B�'��e��Xl߇�PBŇ
��;0 �Iބ	����2��|*������x<���8,�𸼼����Fd��w���?`Ĉ�A
���0�;��UO]
R��Ƌ���c4�-�A���-���$�#�/_�A�H$��Ϣ8 Na�L��������[�s�f��X)
����u�]�?aٲe�{jjVn�;;;5-˷i��6��k������吷�E] ��XK�a(���kG�}�̙ܼ�S�N�\�N �}A�Ğ�aQ������ÈJA�l6������=3r�3َ���?�A���Ҳ�Z�����JJK+*++<U�~_$�9�q��Q����[�"����}�5o޼}��u���d^`��s	��x���h$a��(GO�&��`ͤI��**q��>�
4��Hw��r�W�DD*ф���\L�m��'z_5a� O�v�N�(�����+�;�e��-�$�Y���&�o�p�J�@l:���ĺ� jTyE<ٿ7;��U����*�T<~B�&��x-��X����Œ��,�� �Z�lٽ{w\,Y��c[�h�ꉇ�&TV74��x'�F>�䓉8�ҥ�����6mZ�&�B`�5�n]AKg0�h8$�I$J�:��S�h�"�*7�E^Nn�S��{�2sv
���LY
�< �"a=t��8��j�=����p~~~�A�\��[]5|�K�������/
!��Ʉ_���x]=��96�R E 9��!߀+��k׮Ld����!��4ª0��D-��@#�3na8�i�|�~��ʅ3#R��Q�SS�Z�l�$���H�	0�Q�랞�?{���eb��&'���A��~�>�/��J��{���oՋ��{�&
�@EE��Xm�#X����+�|�w��x$���7|����1^T�ݞx��ч^Q���,gh���	B���i$��Y�a��-\����׬Y3�GB�ܹ3�@�@�o޼9�#F$$$-����ôH��|�
r
`CI�֭ۨQ����rz:�eI�^�G���Bؾg���B�Q�_48�F8"�Yr�W^ye���|��=w�ܲ�߰ޡ��͚�!���k�:���m�6��Q�	U�:�|N9��#�lX������S�����^��q@"p�!��|�Z�!�[�@Lo۝��o,(|衇~��'���u�����
(�@�S�N��p�1\ �`vxv��=m�4�`$3��U��D\�9�W[{��)D��bq�ԕ��@��[�C��К�����>_-g�����c�(t���e��=���84��y�DIɥD>r�7ĕ��ЦMߠ3���:����
Ο=���g�Wp|��Q@�s�$c�==odb(
+;�Z�вkb4+R�V���1�X,�KЉ��- �m�r�
�#�pw���_}�U"W9�xN��~���C�۸r%Bw���'>\t�(�!�֣���y�����V2
-Y��
�p^�\0"�/�첳9N/�������aV^���u������cQ�}��l��=�%m��%���r�۶m۲m[ԏ��ZvRJM�еk瑟��D�'&;�'5p�I7�lt8����
��^����g �O�'J�رc�E�/	hA&�N@�;v�M�6�a�A/^�-�Ě�ڵC�@�G�K�|ۢ�q��K���'z��T,�9��SG#��3 ���Uk׮MJr`kƏ��Pؾ}'jT���x�/x��K�H�"�Pˎ:b�$)V+��b�˪"�8o���ɰ�j�w���.c�0��|�Jϸ���5+˖���������iOs�mV���l���7>��S�ڈG|�Z�z5��̙S"]�ZdKd���K��5��ٰ&�p��A
p��`�n,Xط.�K��z<����Y�⬸֋�l��E�۲1�b�j���b"�3�,�G@��^o5����gϾ9g�>���q@:rp�0�Fp��].�|	oIV&ȑ�k����ѝ&�g�Z��<!�C��M�E-�����$BĢ�P�
:!Q@������5���#10��"���ݹsgV���M�z����~+2~<S���}A1�A�`4����>|!0߼d$����=@���#Ye�+U��A��
oc�D���ɓ_��kĸ�Q��;vnC��ݻ3��ݹsE�O(S��-%�P	�y��}��w�Ϟ��b* �(^I�����Ǭ�ZF=��h��Ty�JՈ�nY8�V�p-)l�X��p��
[�jGQ���C�Ν�����h�U����N#M�%���y�I�W��E"$��l`�,+���c��f��q����7����-JO,�p���v���`AA�������e���PT�c�Q�c�IV�2O,:��x�ov؉&eEE۶�W�h|vaa�1��M����,�P�P1*��OjLV[�).؏xX�T;вKITmI)�;ހg�8z�Be�Ģa��Y�
�AE�P9D� ����-��f�f��T�v����4ph��iV/���o,�g�j׼�
/��r0�c-eoP�F�Ed;�ʸ&ke�z�(���<Tf�H,EQ��6�39���鎑o���oě���@���T��S&*Ts�A�W�⿿W
�)���*A0��A�3�TYca|���q'��^�3�r#_Y���`�,V)���ee�j�5��fWZA��kU�,�(�6��\�&�Va�dm���i�^o0!;�LI�p`v
g2�W�_��O={�$ۏ�����U���B+�̭��6�!k��oѢ
�$pR�
���u>�$+�n×����̤W�xd�惥�%�4iZ���-��*=J^�P^Q��!�?T��Z���$LF0�� `��TtP"&����ǠZ�7�Y^䍀�de]�ށ�}g�Vc�<KQ�����؂)�z�j�^��2S%��
M@V����+ �$d�?��PL����RD,l8|!ؿ`ڠg�>qN%d��o���ׯ__����ҳ{G�M��q��*]��.sF���=՚D���R&>�ew��BxE"
��6kuhE	�.6o�Wٺk?�D"���~u�\����C�_+�r�GF�<{���N6��&V��"#�gPƮ�^�G�wS�F��zA_ZVz�Ǟ}��{~n�΢R-CJ�"���aP8v�V�p��}7s_u���Ԝ��as����G�Tt�_�W�B���j=ZD�ٷ�p�ip��k\8���1�f�q���a��&�mZ���)S&N��q����^^U��I0N���sύ��-7_�b�;�D����	IEND�B`�PK�X�vFesselclubdelebook.recipe
__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
www.clubdelebook.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ElClubDelEbook(BasicNewsRecipe):
    title = 'El club del ebook'
    __author__ = 'Darko Miletic'
    description = 'El Club del eBook, es la primera fuente de informacion sobre ebooks de Argentina. Aca vas a encontrar noticias, tips, tutoriales, recursos y opiniones sobre el mundo de los libros electronicos.'  # noqa
    tags = 'ebook, libro electronico, e-book, ebooks, libros electronicos, e-books'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'es_AR'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = True
    publication_type = 'blog'
    masthead_url = 'http://dl.dropbox.com/u/2845131/elclubdelebook.png'
    extra_css             = """
                                body{font-family: Arial,Helvetica,sans-serif}
                                img{ margin-bottom: 0.8em;
                                     border: 1px solid #333333;
                                     padding: 4px; display: block
                                   }
                            """

    conversion_options = {
        'comment': description, 'tags': tags, 'publisher': title, 'language': language
    }

    remove_tags = [dict(attrs={'id': 'crp_related'})]
    remove_tags_after = dict(attrs={'id': 'crp_related'})

    feeds = [(u'Articulos', u'http://feeds.feedburner.com/ElClubDelEbook')]

    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 = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�X����t
t
elcohetealaluna.png�PNG


IHDR  ��tRNSn��
)IDATx�e�L���?�H�,Y�,ˊ�(J�EDA�A����V����vڻ���{�ҝris[�$l�
�@0&&$$!4����.�g}�}��ь�k2��%�8�R�'�V�������a4C+J����%"��$I�j�a�<mb�L��HF/�XY
I*%I`G�L�Z=1���HJE2�LO�q����T4�D'��	Ӗ��q���G/����_v��dҐDGK
�4���H
���o%��q)�A$�$pI�q�� �8�)�D� D��)����b�}=�+,zD�Ol�}�+��죥:�$��8�`�I$�$��Z��.<�������܇�v���|A;�k�5��VO���|�]��C!,���-\�+B�"�	!:��y�
 �i�"Yx;k�"��M��x��:z��9�kξG/�������M|���6�{�7m�_
���ad�:�q�����9�B��w��r�����u��h(�������,v'����������������>Ȉ^ ���^o�ۼ}��k�0��_XRki� 2�n�L���.�,����5��K�l@�(n�u,�x��WP,��,��1sA��"!q��V�w�o��9����1xb�|�M�&��;hm�@��c�S�yʴl�
�o1HJ�9>{Ǒ�y�wMoJk����jty�Z;Z��vw����*���R]+໛;��-����7؟<+'0�"�a�$�d�[�zہ3��=�u�Γ�o?[Ymkwv�F-z.o�!�a9y�^t�#0�ڻ+]�V���
w"��L�
������U����z�й�N�2$�3$f�[���Ƕ�;�4�r���r�z������Wr�48��U�wՍV���k�󏟻�$?�L�u����9�6�u����p(J��ħ�
c��X���3��s��vO��O��~t��m�̄@����~���[��k4
�e�]��ȥ߶�^�eG�.�PkR���58�d�_���q��sMs�7t����a�9��=��.xU�}�ɂ�e%u�}R4�Ƀ��>xa�����BR��A�@�`�V'�)
8��q���W�Ɨf�Cd��ՙ�����Kw[=�������͜����ai1@��!�,����9g9+UBUK$4�ɨF�d:*��l~Q�O�S��wۂ��Ģ��@y�s�����6��ޑ�2, ��
XHpq�AA��%Zm�B�Q�I*Ԛ�ۏM|0‡>�LD|���z7���rdi卅��W�.\{Xh��_�&A���(c��_/Z�ۏk��s�ꑳ�hF+�*%ڴuwD]=a�q��>QT֠(v�D��C���=v��飦_+��oTM+����VGY����g��Y����,�!g��3�v3�-m=as��ȅ�go<,ip���;d����1�/��5� �ϊ�J,_�+D���~n�:p���b�Ż�l�~|�c�o=��
��;y�֓�y��?0�|��.�����P���_����ç�U=IJz7��\U^���p�wK��%
-�z��ۏ
�U��[�]�ξ�Ű
TQEM}��֝��h��Me��1S>K^�6j~�6}�
>~��ӛ�_������b��s໥�+mtչ:�m�=s�?������k��E�w����me�-g��I���	���q�	c:�@���fs�����9�����9r�‹מ���!�"!9#��ࠃ����-����o��/���g��8,ǡ�K���:���'�������5\�����?{_a,*�Ϫ-�?�z���s�.�#���	�s�������h�1�3�Q�ԕ�����h�9u���2�.?|�Vq������d��C
����s�B8�����auȕ���|�Gr�x�2S��$)�n
���B�(B�l�~O��u���.�1��>4�ٻ�#w�Ig����b*������c|��в�e-\�<�$#p��e��� ��-B����[��,���<s{�_Gsv��m,�s�N��Ia񞣗�/�%�f0�l�喼�o��L��l��4�$Xx4k���ޭ�ٷr��Dž�'.�_��c���ux���ę$�5D��c�nXBb
��<��ҍ�(�L��cdHR��~�t	I���O[���غ��wBY���p��Mg� I��M��
����22�T�9P�(n?|I��0L5o��3W��� e8�J���pB�P�S�Qt#M��&ɕ#1<� u,�IJ���^�SP<��(��
�#�׳��MJ����?@=+������!'I9Mk�ԥl
+*e
4�$�"M�!�c��|�T�DQM��#�њ
9y�B������6s�w?�[�y��u��Y��%�Lg�Q�2��8�8�n�"n�\1\�.W���nJ�v�2~�B5:�H���R�	��4H�Is\�3c�"�{���S&�q#��Y�<=c���)+��Ԛ1`E?t�!c�&1K���I��1�>[���0z�.m�n�\]�<��;x����/N���ջ�P�;�_��I�IEND�B`�PK�X�selcohetealaluna.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2017 - 2018, Darko Miletic <darko.miletic at gmail.com>'
'''
www.elcohetealaluna.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class elcohetealaluna(BasicNewsRecipe):
    title                = 'El Cohete a la Luna'
    __author__           = 'Darko Miletic'
    description          = 'El nuevo portal de Horacio Verbitsky'
    publisher            = 'Horacio Verbitsky'
    category             = 'news, politics, Argentina'
    oldest_article       = 7
    no_stylesheets       = True
    encoding             = 'utf8'
    use_embedded_content = False
    language             = 'es_AR'
    remove_empty_feeds   = True
    publication_type     = 'newsportal'
    auto_cleanup         = False
    resolve_internal_links = True
    compress_news_images = True
    masthead_url         = 'https://www.elcohetealaluna.com/wp-content/uploads/2018/06/logo-menu.png'

    extra_css            = """
        body{font-family: Georgia, Times, "Times New Roman", serif}
        h1,h2,.post-author-name{font-family: Oswald, sans-serif}
        h2{color: gray}
        img{margin-top:1em; margin-bottom: 1em; display:block}
    """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags=[
       dict(name='div', attrs={'class': lambda x: x and 'post-header' in x.split()}),
       dict(name='div', attrs={'class': lambda x: x and 'entry-content' in x.split()}),
    ]

    feeds = [(u'Articulos', u'https://www.elcohetealaluna.com/feed/')]

    def preprocess_html(self, soup):
        for image in soup.findAll(name='img', attrs={'data-src': True}):
            image['src'] = image['data-src']
        return soup
PK�X���L77elcomercio.png�PNG


IHDR(-S`PLTE������������������������������������������ �ܒ�ׯ������������jj���j��\��O��A��4��&��6�6�IDATx�e���@E�݊8����]�N���#�����H�c�]='@���˙p�1��W#�0�7�N��^#��ɹrSq��v��������v�Ǡ����F)��L��E�V�<)@$j�ь��f�v=�Ѭ�7�M
ۆ����
j��l$IEND�B`�PK�X�|z�RRelcomercio.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
elcomercio.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ElComercio(BasicNewsRecipe):
    title = 'El Comercio '
    __author__ = 'Darko Miletic'
    description = "Gizmodo, the gadget guide. So much in love with shiny new toys, it's unnatural."
    publisher = 'GRUPO EL COMERCIO C.A.'
    category = 'news, Ecuador, politics'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = True
    language = 'es_EC'
    masthead_url = 'http://ww1.elcomercio.com/nv_images/headers/EC/logo_new_08.gif'
    extra_css = ' body{font-family: Arial,Verdana,sans-serif} img{margin-bottom: 1em} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_attributes = ['width', 'height']

    feeds = [(u'Articles', u'http://ww1.elcomercio.com/rss/titulares1.xml')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�5YYelcronista-arg.png�PNG


IHDR�a IDATx�c�
ڗ*1�.�`hY�H�ghYq��u�^ �$d�Ǯ�~P�$��_ E@�/�u����8v�W���)��1t/�FV�._��������p�|�-�L@�P���~1N:V�3��2@7u&�0�dв�.܀�屄5`��'�˝�0`�_��\�����X�DN�E��r� ɀ��ˤp��9���~�����T�[V�bƛ�0@�*E��O�YN4�ᕆ;35/���R�~�@v.$w���#���L�)�|em �b[�R	��UZ�JIEND�B`�PK�X�����elcronista-arg.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2018, Darko Miletic <darko.miletic at gmail.com>'
'''
www.cronista.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class ElCronistaArg(BasicNewsRecipe):
    title                = 'El Cronista'
    __author__           = 'Darko Miletic'
    description          = (
        'El Cronista Comercial es el Diario economico-politico mas valorado.'
        ' Es la fuente mas confiable de informacion en temas de economia, finanzas y negocios.')
    publisher            = 'El Cronista'
    category             = 'news, politics, Argentina'
    oldest_article       = 2
    no_stylesheets       = True
    encoding             = 'utf8'
    use_embedded_content = False
    language             = 'es_AR'
    remove_empty_feeds   = True
    publication_type     = 'newsportal'
    auto_cleanup         = True
    auto_cleanup_keep    = '//div[@class="header-bottom"] | //h1 | //h2'
    ignore_duplicate_articles = {'url'}
    masthead_url         = 'https://www.cronista.com/export/sites/diarioelcronista/arte/v2/lg_cronista_footer.png_665574830.png'
    extra_css            = """
        body{font-family: 'Source Sans Pro', sans-serif}
        h1,h2,h3,h4{font-family: 'Libre Baskerville', serif}
    """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Articulos', u'https://www.cronista.com/rss/feed.xml')]
PK�X�P�Y{{ele.png�PNG


IHDR(-S�PLTE�D�L�T�"T�.d�:l�>l�Fl�B|�V��R��N��^��^��^��f|�rl�zt�v��z��z��r��r��j��n��n��j��f��n��r��r��v��~��~��~��z�䆴슴슬쎤어��������즼쮔욄쎌�f��^��V��:��6��:��&��"4�4�,�~�z�rtRNS@��foIDATx�c�lQ�|RJ(���Z�|SMMe
$3}YEe$s}9cߚESքӒ�
.bëʣ����#*a◕124�֖��0s�
	
K�u1�rp�9��ʆ�,�m	���;IEND�B`�PK�X�/H��
ele.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
ele.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Ele(BasicNewsRecipe):
    title = u'Ele'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Dezv\u0103luie ceea ce e\u015fti'
    publisher = u'Ele'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Femei'
    encoding = 'utf-8'
    cover_url = 'http://www.tripmedia.ro/tripadmin/photos/logo_ele_mare.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'article_title'}), dict(
            name='div', attrs={'class': 'article_text'})
    ]

    feeds = [
        (u'Feeds', u'http://www.ele.ro/rss_must_read')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X��7���elektroda_pl.png�PNG


IHDR�a�IDATx�b����+���$��/��\Ȟ|-P:9�Da�-Gk��v.vξU���b۶m�v!�m����K��_�������������dġi��۷V�gUL�-/ʶݷ�v�ym���l�cǝ5Zm'��/XppHHD>�]v/Oﱯ:�9��X����
<�R�d��a��T������ٓ�$wٽ/��ޮ5�
J�g\B��s�4���c�OX�'N���`�#W(�g��$29����H�0�T�V{.yZ�{�bI�kmɈ�x�{�ڠA�rJ��T�ҫ?d@8^ 
jؾ}g���]V=>k�^o΀
�C��Goʗ�؟;v���G�3��DJ�^�D@U��o�($w9N�P�TL��-kܸi�:u��Y�̫^�?-�.�������	�RAA��
�|tTj"��}��4@�h4^����ǟ?b�ڎ�L�Mf�}��l�j2���=�ެ7����t�����U�c��\AZS�w����nw\�h�����=�"@<-�ñ�%�[��@Ł�'>*+++ON���h��hoQ��.Q������h�njS�T�ʕ��,^�~|լ���3fi0X.U�^=���[���p�b�tz�u�F�fATj
��{�{�d�ҽ�@�[���>60IEND�B`�PK�X�ݯK��elektroda_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class Elektroda(BasicNewsRecipe):
    title = u'Elektroda'
    oldest_article = 8
    __author__ = 'fenuks'
    description = 'Międzynarodowy portal elektroniczny udostępniający bogate zasoby z dziedziny elektroniki oraz forum dyskusyjne.'
    cover_url = 'http://demotywatory.elektroda.pl/Thunderpic/logo.gif'
    category = 'electronics'
    language = 'pl'
    max_articles_per_feed = 100
    no_stylesheets = True
    feeds = [(u'Elektroda', u'http://www.elektroda.pl/rtvforum/rss.php')]

    keep_only_tags = [dict(name='div', attrs={'class': 'title-wrap pull-left'}),
                      dict(name='ul', attrs={'class': 'topic-lists clearfix'})
    ]

    def preprocess_html(self, soup):
        tag = soup.find('span', attrs={'class': 'postbody'})
        if tag:
            pos = len(tag.contents)
            tag.insert(pos, BeautifulSoup('<br />'))
        return soup

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        for feed in feeds:
            for article in feed.articles[:]:
                article.title = article.title[article.title.find("::") + 3:]
        return feeds
PK�X]����elet_es_irodalom.png�PNG


IHDR�aaIDATxڭ��œa�S�m{�M�c��h�6m|��hbg�XM�s��k���L�
j�cP
r dƳ�x� �C����.�|��5pM|���}���"�y{�!f�<߹�'�V�|�+?����X7��Df�l�����0��h�/�ކ���]|~��2 ;އx&��>�AG'>���!^�>	(���^=m�{ۉ��z����rs��p�<ҡ?��2�O� �5f���c��4�DG�\dF{�a����M����t�vn6Ls�e`�����DZ[����WB3qk�t�=�I4�#6w
��_��y�\��<	B�Q@�蟽��V�ZՏ/�#��M*IEND�B`�PK�XY��	�	elet_es_irodalom.recipe##########################################################################
# Description:     http://es.hu/ RSS channel
# Author:      Bigpapa (bigpapabig@hotmail.com)
# Date:    2012.01.20. - V1.2
##########################################################################

from calibre.web.feeds.recipes import BasicNewsRecipe


class elet_es_irodalom(BasicNewsRecipe):
    title = u'\u00c9let \u00e9s Irodalom'
    __author__ = 'Bigpapa'
    oldest_article = 7
    # Az adott e-bookban tarolt cikkek feedenkenti maximalis szamat adja meg.
    max_articles_per_feed = 30
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'iso-8859-2'
    category = 'Cikkek'
    language = 'hu'
    publication_type = 'newsportal'
    extra_css = '.doc_title { font: bold 30px } .doc_author {font: bold 14px} '
    needs_subscription = 'optional'

    masthead_url = 'http://www.es.hu/images/logo.jpg'
    timefmt = ' [%Y %b %d, %a]'

# Nem ide a kódba kell beleírni a hozzáférés adatait, hanem azt akkor adod
# meg, ha le akarod tölteni!
    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('http://www.es.hu/')
            br.select_form(name='userfrmlogin')
            br['cusername'] = self.username
            br['cpassword'] = self.password
            br.submit()
        return br

    keep_only_tags = [
        dict(name='div', attrs={'class': ['doc_author', 'doc_title', 'doc']})
    ]

    remove_tags = [
        dict(name='a', attrs={'target': ['_TOP']}),
        dict(name='div', attrs={'style': [
             'float: right; margin-left: 5px; margin-bottom: 5px;', 'float: right; margin-left: 5px; margin-bottom: 5px;']}),

    ]

    feeds = [
        (u'Publicisztika', 'http://www.feed43.com/4684235031168504.xml'),
        (u'Interj\xfa', 'http://www.feed43.com/4032465460040618.xml'),
        (u'Visszhang', 'http://www.feed43.com/3727375706873086.xml'),
        (u'P\xe1ratlan oldal', 'http://www.feed43.com/2525784782475057.xml'),
        (u'Feuilleton', 'http://www.feed43.com/7216025082703073.xml'),
        (u'Pr\xf3za', 'http://www.feed43.com/8760248802326384.xml'),
        (u'Vers', 'http://www.feed43.com/1737324675134275.xml'),
        (u'K\xf6nyvkritika', 'http://www.feed43.com/1281156550717082.xml'),
        (u'M\u0171b\xedr\xe1lat', 'http://www.feed43.com/1851854623681044.xml')
    ]
PK�X����elmundo.png�PNG


IHDR(-S6PLTE���h��h��h��h��h��h��h��h��h��h��h��h��h��h��h��h��h��Ho?4tRNS`���p �@0�<�P����_IDATx�m��1Cf��9.����X�CLJ�$=I�t<�Ў�����O��?B@ )3)��R���о	�/!A�#��:���	�B$IEND�B`�PK�X��
��elmundo.recipefrom __future__ import print_function
# -*- mode: python -*-
# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8

__license__ = 'GPL v3'
__copyright__ = '2009-2017, Darko Miletic <darko.miletic at gmail.com>'
'''
elmundo.es
'''
import time
from calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe


class ElMundo(BasicNewsRecipe):
    title = 'El Mundo'
    __author__ = 'Darko Miletic'
    description = u'Lider de informacion en español'
    publisher = 'Unidad Editorial Informacion General S.L.U.'
    category = 'news, politics, Spain'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'iso8859_15'
    remove_javascript = True
    remove_empty_feeds = True
    language = 'es'
    ignore_duplicate_articles = {'url'}
    masthead_url = 'http://e00-elmundo.uecdn.es/assets/v7/img/svg/elmundo.svg'
    publication_type = 'newspaper'
    articles_are_obfuscated = True
    auto_cleanup = True
    temp_files = []
    extra_css                 = """
                                    body{font-family: "PT serif",Georgia,serif,times}
                                    .metadata_noticia{font-size: small}
                                    .pestana_GDP{font-size: small; font-weight:bold}
                                    h1 {color: #333333; font-family: "Clear Sans Bold",Arial,sans-serif,helvetica}
                                    .hora{color: red}
                                    .update{color: gray}
                                    """

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    remove_tags = [dict(attrs={'class': lambda x: x and ('aside-tools' or 'publicidad') in x.split()})]

    feeds = [

    (u'Portada', u'http://estaticos.elmundo.es/elmundo/rss/portada.xml'),
    (u'Deportes', u'http://estaticos.elmundo.es/elmundodeporte/rss/portada.xml'),
    (u'Economia', u'http://estaticos.elmundo.es/elmundo/rss/economia.xml'),
    (u'Espa\xf1a', u'http://estaticos.elmundo.es/elmundo/rss/espana.xml'),
    (u'Internacional', u'http://estaticos.elmundo.es/elmundo/rss/internacional.xml'),
    (u'Cultura', u'http://estaticos.elmundo.es/elmundo/rss/cultura.xml'),
    (u'Ciencia/Ecolog\xeda', u'http://estaticos.elmundo.es/elmundo/rss/ciencia.xml'),
    (u'Comunicaci\xf3n', u'http://estaticos.elmundo.es/elmundo/rss/comunicacion.xml'),
    (u'Televisi\xf3n', u'http://estaticos.elmundo.es/elmundo/rss/television.xml'),
    (u'Salud', u'http://estaticos.elmundo.es/elmundosalud/rss/portada.xml'),
    (u'Solidaridad', u'http://estaticos.elmundo.es/elmundo/rss/solidaridad.xml'),
    (u'Su vivienda', u'http://estaticos.elmundo.es/elmundo/rss/suvivienda.xml'),
    (u'Motor', u'http://estaticos.elmundo.es/elmundodeporte/rss/motor.xml'),
    (u'Madrid', u'http://estaticos.elmundo.es/elmundo/rss/madrid.xml'),
    (u'Barcelona', u'http://estaticos.elmundo.es/elmundo/rss/barcelona.xml'),
    (u'Pa\xeds Vasco', u'http://estaticos.elmundo.es/elmundo/rss/paisvasco.xml'),
    (u'Baleares', u'http://estaticos.elmundo.es/elmundo/rss/baleares.xml'),
    (u'Castilla y Le\xf3n', u'http://estaticos.elmundo.es/elmundo/rss/castillayleon.xml'),
    (u'Valladolid', u'http://estaticos.elmundo.es/elmundo/rss/valladolid.xml'),
    (u'Valencia', u'http://estaticos.elmundo.es/elmundo/rss/valencia.xml'),
    (u'Alicante', u'http://estaticos.elmundo.es/elmundo/rss/alicante.xml'),
    (u'Castell\xf3n', u'http://estaticos.elmundo.es/elmundo/rss/castellon.xml'),
    (u'Andaluc\xeda', u'http://estaticos.elmundo.es/elmundo/rss/andalucia.xml'),
    (u'Sevilla', u'http://estaticos.elmundo.es/elmundo/rss/andalucia_sevilla.xml'),
    (u'M\xe1laga', u'http://estaticos.elmundo.es/elmundo/rss/andalucia_malaga.xml')
    ]

    def get_cover_url(self):
        cover = self.masthead_url
        st = time.localtime()
        year = str(st.tm_year)
        month = "%.2d" % st.tm_mon
        day = "%.2d" % st.tm_mday
        cover = 'http://img.kiosko.net/' + year + '/' + \
            month + '/' + day + '/es/elmundo.750.jpg'
        try:
            self.browser.open(cover)
        except:
            self.log("\nPortada no disponible")
        return cover

    def get_obfuscated_article(self, url):
        count = 0
        tries = 5
        html = None
        while (count < tries):
            try:
                response = self.browser.open(url)
                html = response.read()
                count = tries
            except:
                print("Retrying download...")
            count += 1
        if html is not None:
            tfile = PersistentTemporaryFile('_fa.html')
            tfile.write(html)
            tfile.close()
            self.temp_files.append(tfile)
            return tfile.name
        return None

    def image_url_processor(self, baseurl, url):
        if url.startswith('//'):
            return 'http:' + url
        if url.startswith('file://'):
            return url.replace('file://', 'http://')
        return url
PK�X*�L���elpais_impreso.png�PNG


IHDR��h6�IDATxڕR�+Da�>^��v7YVYAQ8IR)GG7.�U.JqG�r%*8-Q-	(�U-����of̷��ze�͛73������<M����Og�& �ՎVt�u�6��g43�'���svq�{ ��Bp��˭��ɹ������wb���		�f��e$���e�)z~cff�J���7��n��F$WR
�����$���2OA�F�4y�*�0�1�M�B`(������]mM����X�>��_$�מ`Q�V/"��՝�{��,�/������B��&�xp|��r�f�]
T{KE�]K7��J
@$=AGi����K���!��gT94�l����.��u�~zx��*/� b�N��@B��t���t4��0��Y+�ޡ����"-T<J;I72�1��@>���I)���$���fR����[n�g�]IEND�B`�PK�Xl�O^elpais_impreso.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
__license__ = 'GPL v3'
__copyright__ = '2010-2014, Darko Miletic <darko.miletic at gmail.com>'
'''
elpais.com
'''

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class ElPais_RSS(BasicNewsRecipe):
    title = u'El País'
    __author__ = 'Darko Miletic'
    description = u'Noticias de última hora sobre la actualidad en España y el mundo: política, economía, deportes, cultura, sociedad, tecnología, gente, opinión, viajes, moda, televisión, los blogs y las firmas de EL PAÍS. Además especiales, vídeos, fotos, audios, gráficos, entrevistas, promociones y todos los servicios de EL PAÍS.'  # noqa
    publisher = 'EDICIONES EL PAIS, S.L.'
    category = 'news, politics, finances, world, spain'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'es'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://ep01.epimg.net/iconos/v1.x/v1.0/logos/cabecera_portada.png'
    cover_url = strftime(
        'http://srv00.epimg.net/pdf/elpais/1aPagina/%Y/%m/ep-%Y%m%d.pdf')
    extra_css             = """
                               h1{font-family: Georgia,"Times New Roman",Times,serif }
                               #subtitulo_noticia, .firma, .figcaption{font-size: small}
                               body{font-family: Arial,Helvetica,Garuda,sans-serif}
                               img{margin-bottom: 0.4em; display:block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(attrs={'id': ['titulo_noticia', 'subtitulo_noticia']}), dict(
            attrs={'class': ['firma', 'columna_texto', 'entrevista_p_r']})
    ]
    remove_tags = [
        dict(name=['iframe', 'embed', 'object']), dict(
            attrs={'class': 'disposicion_vertical'})
    ]

    feeds = [

    (u'Lo ultimo', u'http://ep00.epimg.net/rss/tags/ultimas_noticias.xml'),
    (u'America Latina', u'http://elpais.com/tag/rss/latinoamerica/a/'),
    (u'Mexico', u'http://elpais.com/tag/rss/mexico/a/'),
    (u'Europa', u'http://elpais.com/tag/rss/europa/a/'),
    (u'Estados Unidos', u'http://elpais.com/tag/rss/estados_unidos/a/'),
    (u'Oriente proximo', u'http://elpais.com/tag/rss/oriente_proximo/a/'),
    (u'Andalucia', u'http://ep00.epimg.net/rss/ccaa/andalucia.xml'),
    (u'Catalunia', u'http://ep00.epimg.net/rss/ccaa/catalunya.xml'),
    (u'Comunidad Valenciana', u'http://ep00.epimg.net/rss/ccaa/valencia.xml'),
    (u'Madrid', u'http://ep00.epimg.net/rss/ccaa/madrid.xml'),
    (u'Pais Vasco', u'http://ep00.epimg.net/rss/ccaa/paisvasco.xml'),
    (u'Galicia', u'http://ep00.epimg.net/rss/ccaa/galicia.xml'),
    (u'Sociedad', u'http://ep00.epimg.net/rss/sociedad/portada.xml'),
    (u'Deportes', u'http://ep00.epimg.net/rss/deportes/portada.xml'),
    (u'Cultura', u'http://ep00.epimg.net/rss/cultura/portada.xml'),
    (u'Cine', u'http://elpais.com/tag/rss/cine/a/'),
    (u'Economía', u'http://elpais.com/tag/rss/economia/a/'),
    (u'Literatura', u'http://elpais.com/tag/rss/libros/a/'),
    (u'Musica', u'http://elpais.com/tag/rss/musica/a/'),
    (u'Arte', u'http://elpais.com/tag/rss/arte/a/'),
    (u'Medio Ambiente', u'http://elpais.com/tag/rss/medio_ambiente/a/'),
    (u'Tecnologia', u'http://ep01.epimg.net/rss/tecnologia/portada.xml'),
    (u'Ciencia', u'http://ep00.epimg.net/rss/tags/c_ciencia.xml'),
    (u'Salud', u'http://elpais.com/tag/rss/salud/a/'),
    (u'Ocio', u'http://elpais.com/tag/rss/ocio/a/'),
    (u'Justicia y Leyes', u'http://elpais.com/tag/rss/justicia/a/'),
    (u'Guerras y conflictos', u'http://elpais.com/tag/rss/conflictos/a/'),
    (u'Politica', u'http://ep00.epimg.net/rss/politica/portada.xml'),
    (u'Opinion', u'http://ep01.epimg.net/rss/elpais/opinion.xml')
    ]

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        if url and ('/album/' not in url and '/futbol/partido/' not in url):
            return url
        self.log('Skipping non-article', url)
        return None

    def preprocess_raw_html(self, raw, url):
        return '<html><head><title>Untitled</title>' + raw[raw.find('</head>'):]
PK�X
37e��elpais_semanal.png�PNG


IHDR��h6�IDATxڕ��+Ca��i��$E��Z��(��Ԍ(���Ә��fþlڗ0MS3�ɫ��*NO��}�};���N�.g���b���>
�s"�� �%�����{�?����P}���V�&��FE�
ܡD�L_ݩ�؃�'��X�	u=�4�	j��#��I�ޡ]DZPӵ�`w(�z`��e4�H뾌br��i#="w`��<�Hf+�m�c�wM,X����[�m��77*���E�E�t�
"��e^�؅�m�
�
�ݡ��O"Jxs4�}?zvq�sԚ<�ց����Y��ɫ��sp��-�n��
j��B�<�M<�;B}�S3d���9Mn��5���mb*�%2+�`2�Ǝ>&��6��6X���M��,�g��*[d?ך�tf��6�<Ԗ�PY$����IF�P0����/ޟ�#IEND�B`�PK�X��9�ppelpais_semanal.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.elpais.com/suple/eps/
'''

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class ElPaisSemanal(BasicNewsRecipe):
    title = 'El Pais semanal'
    __author__ = 'Darko Miletic'
    description = 'Revista semanal de diario El Pais'
    publisher = 'EL PAIS S.L.'
    category = 'news, politics, Spain'
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'es'
    publication_type = 'magazine'
    masthead_url = 'http://www.elpais.com/im/tit_logo_int.gif'
    index = 'http://www.elpais.com/suple/eps/'
    extra_css = ' p{text-align: justify} body{ text-align: left; font-family: Georgia,"Times New Roman",Times,serif } h2{font-family: Arial,Helvetica,sans-serif} img{margin-bottom: 0.4em} '  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(attrs={'class': ['cabecera_noticia', 'contenido_noticia']})]
    remove_attributes = ['width', 'height']
    remove_tags = [dict(name='link')]

    def parse_index(self):
        articles = []
        soup = self.index_to_soup(self.index)
        for item in soup.findAll('a', attrs={'class': ['g19i003', 'g17r003', 'g17i003']}, href=True):
            description = ''
            title_prefix = ''
            feed_link = item
            url = 'http://www.elpais.com' + item['href'].rpartition('/')[0]
            title = title_prefix + self.tag_to_string(feed_link)
            date = strftime(self.timefmt)
            articles.append({
                'title': title, 'date': date, 'url': url, 'description': description
            })
        return [(soup.head.title.string, articles)]

    def print_version(self, url):
        return url + '?print=1'
PK�X�ژ�..elperiodico_catalan.png�PNG


IHDR(-SiPLTE����'Ut�Pm��%����sx�;B�-5��������������W]������돓遆j����ɠ���IP����Ϫ�������u�����`}�������r#p�IDATx^u�GBA�Ҧ�^��$HYa)G�������)�3?��L`��Cv�5�'A�133�Gu0��x�2��)3�7HA�%>w
n��C��~�*�s�;g
V0ZR2���'om���FIjIEND�B`�PK�X�ژ�..elperiodico_spanish.png�PNG


IHDR(-SiPLTE����'Ut�Pm��%����sx�;B�-5��������������W]������돓遆j����ɠ���IP����Ϫ�������u�����`}�������r#p�IDATx^u�GBA�Ҧ�^��$HYa)G�������)�3?��L`��Cv�5�'A�133�Gu0��x�2��)3�7HA�%>w
n��C��~�*�s�;g
V0ZR2���'om���FIjIEND�B`�PK�XB�
��elperiodico_spanish.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '30 October 2010, Jordi Balcells based on an earlier recipe by Darko Miletic <darko.miletic at gmail.com>'
'''
elperiodico.cat
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class ElPeriodico_cat(BasicNewsRecipe):
    title = 'El Periodico de Catalunya'
    __author__ = 'Jordi Balcells/Darko Miletic'
    description = 'Noticias desde Catalunya'
    publisher = 'elperiodico.com'
    category = 'news, politics, Spain, Catalunya'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    delay = 1
    encoding = 'cp1252'
    language = 'es'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    feeds = [(u'Portada', u'http://www.elperiodico.com/es/rss/rss_portada.xml'),
             (u'Internacional', u'http://elperiodico.com/es/rss/internacional/rss.xml'),
             (u'Sociedad', u'http://elperiodico.com/es/rss/sociedad/rss.xml'),
             (u'Ciencia y Tecnolog\xeda',
              u'http://elperiodico.com/es/rss/ciencia-y-tecnologia/rss.xml'),
             (u'Deportes', u'http://elperiodico.com/es/rss/deportes/rss.xml'),
             (u'Gente', u'http://elperiodico.com/es/rss/gente/rss.xml'),
             (u'Opini\xf3n', u'http://elperiodico.com/es/rss/opinion/rss.xml'),
             (u'Pol\xedtica', u'http://elperiodico.com/es/rss/politica/rss.xml'),
             (u'Barcelona', u'http://elperiodico.com/es/rss/barcelona/rss.xml'),
             (u'Econom\xeda', u'http://elperiodico.com/es/rss/economia/rss.xml'),
             (u'Cultura y espect\xe1culos',
              u'http://elperiodico.com/es/rss/cultura-y-espectaculos/rss.xml'),
             (u'Tele', u'http://elperiodico.com/es/rss/cultura-y-espectaculos/rss.xml')]

    keep_only_tags = [dict(name='div', attrs={'class': 'titularnoticia'}),
                      dict(name='div', attrs={'class': 'noticia_completa'})]

    remove_tags = [dict(name='div', attrs={'class': ['opcionb', 'opcionb last', 'columna_noticia']}),
                   dict(name='span', attrs={'class': 'opcionesnoticia'})
                   ]

    def print_version(self, url):
        return url.replace('/default.asp?', '/print.asp?')

    def preprocess_html(self, soup):
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X��7���elsevier.png�PNG


IHDR(-S�PLTE����������
�
�
����������ć��
�dj‹�Š�Ĥ�ݨ��������������������������t|�ry�x�uy�tx�wz�|��iq�cf�cc�ek�VZ�EP� -�,�&�#���ō����{����}���y��ɐ�̋�ʉ���ϊ��	�Ӎ������
Ę����DŽ�tRNS@��f�IDATx�U��0���u�l۶m�65���
idbq�yY#M3��m�/����6˜k���c�4�ܰ@����V��t&�=y��;��
����c�Q�qo��0P?���N�V9���	y�lc��|>�s��\��R�jZR
��I݄IEND�B`�PK�X5�u��	�	elsevier.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
elsevier.nl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Pagina12(BasicNewsRecipe):
    title = 'Elsevier.nl'
    __author__ = 'Darko Miletic'
    description = 'News from Holland'
    publisher = 'elsevier.nl'
    category = 'news, politics, Holland'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'nl'
    country = 'NL'
    remove_empty_feeds = True
    masthead_url = 'http://www.elsevier.nl/static/elsevier/stdimg/logo.gif'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em}  '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = dict(attrs={'id': 'artikel_container'})
    remove_tags_before = dict(attrs={'id': 'breadcrumb_container'})
    remove_tags_after = dict(attrs={'class': 'author_link'})
    remove_tags = [
        dict(attrs={'id': 'breadcrumb_container'}), dict(
            name='div', attrs={'class': 'pullout_vak'})
    ]
    remove_attributes = ['width', 'height']

    feeds = [

    (u'Laatste nieuws', u'http://www.elsevier.nl/web/RSS/Homepage-RSS.htm?output=xml'),
    (u'Nederland', u'http://www.elsevier.nl/web/RSS/Nederland-RSS.htm?output=xml'),
    (u'Politiek', u'http://www.elsevier.nl/web/RSS/Politiek-RSS.htm?output=xml'),
    (u'Europese Unie', u'http://www.elsevier.nl/web/RSS/Europese-Unie-RSS.htm?output=xml'),
    (u'Buitenland', u'http://www.elsevier.nl/web/RSS/Buitenland-RSS.htm?output=xml'),
    (u'Economie', u'http://www.elsevier.nl/web/RSS/Economie-RSS.htm?output=xml'),
    (u'Wetenschap', u'http://www.elsevier.nl/web/RSS/Wetenschap-RSS.htm?output=xml'),
    (u'Cultuur & Televisie', u'http://www.elsevier.nl/web/RSS/Cultuur-Televisie-RSS.htm?output=xml'),
    (u'Society', u'http://www.elsevier.nl/web/RSS/Society-RSS.htm?output=xml'),
    (u'Internet&/Gadgets', u'http://www.elsevier.nl/web/RSS/Internet-Gadgets-RSS.htm?output=xml'),
    (u'Comentaren', u'http://www.elsevier.nl/web/RSS/Commentaren-RSS.htm?output=xml')
    ]

    def print_version(self, url):
        return url + '?print=true'

    def get_article_url(self, article):
        return article.get('guid',  None).rpartition('?')[0]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X&�]77eltiempo_hn.png�PNG


IHDR��h6�IDATxڕR;oa��;�}��'���(B$�!b$�@��JG����_u�E

%A�0�`Rĉ��r�|���#��ͮvg��١k/~�4a���Z�Q�Gs��}��L�M�s15�:����U�+I�f�3ȹN�0۫{�\��V�Cx���j��KE׶S�i�F��j��Yw��[W]�����&�8��+c:�"������I���M����9k���\�歠���yM�3����z��IZ����n���Zn�������XC3��6����^���G��շ�O�=\Z�3�H� �3������jν+�ѥ��	Y{�ۃaD��-/՚�L�����ŦBk��`cmk�Qٲ��$3�c��D	��XQ%B*	����l.k��=%�0>
B��Q,�A�֚5��)c��7�#�`�E	��0 �"���R��$�ތW~&�y��Ä6+ɬ'}t�P�F��+��
�>g�:���WS��i��4��ȕIEND�B`�PK�X�W��eltiempo_hn.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.tiempo.hn
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class ElTiempoHn(BasicNewsRecipe):
    title = 'El Tiempo - Honduras'
    __author__ = 'Darko Miletic'
    description = 'Noticias de Honduras y mundo'
    publisher = 'El Tiempo'
    category = 'news, politics, Honduras'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'
    language = 'es_HN'

    lang = 'es-HN'
    direction = 'ltr'

    remove_tags = [dict(name=['form', 'object', 'embed', 'base'])]

    keep_only_tags = [dict(name='td', attrs={'id': 'mainbodycont'})]

    feeds = [(u'Noticias', u'http://www.tiempo.hn/index.php?format=feed&type=rss')]

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X)�)S��eluniversal_ve.png�PNG


IHDR���R0PLTE����ҹŮ�������~�svhh\MC?82,%!��z�JIDATx�c ��}C�O��3p|`��`a	a�0��`�J	�B�xuu^�����z���o�
�!~.΂�IEND�B`�PK�XX�I
�
�
eluniversal_ve.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2013, Darko Miletic <darko.miletic at gmail.com>'
'''
www.eluniversal.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class ElUniversal(BasicNewsRecipe):
    title = 'El Universal'
    __author__ = 'Darko Miletic'
    description = 'Noticias de Venezuela y el mundo. Avances informativos de ultimo minuto. Incluye secciones de politica, deportes, economia y mas.'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    encoding = 'cp1252'
    publisher = 'El Universal'
    category = 'news, Caracas, Venezuela, world'
    language = 'es_VE'
    publication_type = 'newspaper'
    masthead_url = 'http://cdn.eluniversal.com/images/eu4/back/logo-eluniversal.gif'
    cover_url = 'http://images.eluniversal.com//pdf/primeraPlana.pdf'
    extra_css              = """
                                .txt60{font-family: Tahoma,Geneva,sans-serif; font-size: small}
                                .txt29{font-family: Tahoma,Geneva,sans-serif; font-size: small; color: gray}
                                .txt38{font-family: Georgia,"Times New Roman",Times,serif; font-size: xx-large}
                                .txt35{font-family: Georgia,"Times New Roman",Times,serif; font-size: large}
                                body{font-family: Verdana,Arial,Helvetica,sans-serif}
                             """
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    remove_tags_before = dict(attrs={'class': 'header-print MB10'})
    remove_tags_after = dict(attrs={'id': 'SizeText'})
    remove_tags = [
        dict(name=['object', 'link', 'script', 'iframe', 'meta']), dict(
            attrs={'class': 'header-print MB10'})
    ]

    feeds = [

    (u'Ultimas Noticias', u'http://www.eluniversal.com/rss/avances.xml'),
    (u'Economia', u'http://www.eluniversal.com/rss/eco_avances.xml'),
    (u'Internacionales', u'http://www.eluniversal.com/rss/int_avances.xml'),
    (u'Deportes', u'http://www.eluniversal.com/rss/dep_avances.xml'),
    (u'Cultura', u'http://www.eluniversal.com/rss/cul_avances.xml'),
    (u'Nacional y politica', u'http://www.eluniversal.com/rss/pol_avances.xml'),
    (u'Ciencia y tecnologia', u'http://www.eluniversal.com/rss/cyt_avances.xml'),
    (u'Universo empresarial', u'http://www.eluniversal.com/rss/uni_avances.xml'),
    (u'Caracas', u'http://www.eluniversal.com/rss/ccs_avances.xml')
    ]

    def print_version(self, url):
        return url + '-imp'

    def get_article_url(self, article):
        return article.get('guid',  None)
PK�X��$`��eluniverso_ec.png�PNG


IHDR  D���PLTE����������YGH��IDATx�ݑ1rAi����S��+;��6a���0��YJ|�O+��5=&f�p,����C��+��<Ĭ�
�5`k��\-2�� mP�-'���,39#PNɦ|���5e���6�%��$m~��7K�2������+?C4�'����mj?#4g�IEND�B`�PK�XnF���	�	eluniverso_ec.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
eluniverso.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ElUniverso_Ecuador(BasicNewsRecipe):
    title = 'El Universo - Ecuador'
    __author__ = 'Darko Miletic'
    description = 'Noticias del Ecuador y el resto del mundo'
    publisher = 'El Universo'
    category = 'news, politics, Ecuador'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'es_EC'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://servicios2.eluniverso.com/versiones/v1/img/Hd/lg_ElUniverso.gif'
    extra_css             = """
                                body{font-family: Verdana,Arial,Helvetica,sans-serif; color: #333333 }
                                h2{font-family: Georgia,"Times New Roman",Times,serif; color: #1B2D60}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(attrs={'class': ['flechs', 'multiBox', 'colRecursos']}), dict(
            name=['meta', 'link', 'embed', 'object', 'iframe', 'base'])
    ]
    keep_only_tags = [dict(attrs={'class': 'Nota'})]
    remove_tags_after = dict(attrs={'id': 'TextoPrint'})
    remove_tags_before = dict(attrs={'id': 'FechaPrint'})

    feeds = [

    (u'Portada', u'http://www.eluniverso.com/rss/portada.xml'),
    (u'Politica', u'http://www.eluniverso.com/rss/politica.xml'),
    (u'Economia', u'http://www.eluniverso.com/rss/economia.xml'),
    (u'Sucesos', u'http://www.eluniverso.com/rss/sucesos.xml'),
    (u'Migracion', u'http://www.eluniverso.com/rss/migrantes_tema.xml'),
    (u'El Pais', u'http://www.eluniverso.com/rss/elpais.xml'),
    (u'Internacionales', u'http://www.eluniverso.com/rss/internacionales.xml'),
    (u'Deportes', u'http://www.eluniverso.com/rss/deportes.xml'),
    (u'Gran Guayaquill', u'http://www.eluniverso.com/rss/gran_guayaquil.xml'),
    (u'Entretenimiento', u'http://www.eluniverso.com/rss/arteyespectaculos.xml'),
    (u'Vida', u'http://www.eluniverso.com/rss/tuvida.xml'),
    (u'Opinion', u'http://www.eluniverso.com/rss/opinion.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X󡬵��
emg_en.png�PNG


IHDR��h6IDATx�c�O" Y�z�F0`&&& �߿���@i (�*�(��*�@�p���J�p��x����(���d"��Ͽpq=	��{���� �Z��_~�48n�e ��{�d�-�s�<�a|���0�v��j�M �xۍ�=w�|�	D�}G�"@�`�I #g�M��փ�!���:q��g�N=՜xB{�	&���a�`a2��@l& X�dM�Q��>�G}��&#,d�A
(�Ag�Q��T'7�yZ��T7HD�����@F��&3���9�`����U��A�|��h� ��@r�������ℓ@�˨?�#�]$���
`�1AT@�U��
�ʨ6�833$@6�lc
J `'�8�O��ϋ��NnvIEND�B`�PK�X�;Mgll
emg_en.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
emg.rs/en/news
'''

from calibre.web.feeds.news import BasicNewsRecipe


class emportal_en(BasicNewsRecipe):
    title = 'Ekonom:east News'
    __author__ = 'Darko Miletic'
    description = 'Daily business news from Serbia.'
    publisher = 'Ekonom:east Media Group'
    category = 'Business, SEE, Serbia, Belgrade, news, Ekonomist, EMportal'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    masthead_url = 'http://www.emg.rs/img/emportal-rss.png'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [dict(attrs={'class': ['text-share']})]
    keep_only_tags = [dict(attrs={'class': 'text'})]
    remove_tags_after = dict(attrs={'class': 'text-share'})
    remove_attributes = ['width', 'height']

    feeds = [(u'Serbia', u'http://www.emg.rs/en/news/serbia/rss.xml')]

    def print_version(self, url):
        return url.replace('.html', '.print.html')

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X龽empire_magazine.png�PNG


IHDR  D���lPLTE��ot����9@�:A�EK�GM�]c�ch�di�gl�ko��pu�qv�uz�{�|�����������������������������������������#���A���hIDATx���S�0��mo}�3֌jw��K=b�?H{D���wZ���-3�W�;3<���<y.�ҩ�G)�WU��=;^�i
̰8�^d m��#-|҂�
&?X�b
N�,YIEND�B`�PK�X(�ė�empire_magazine.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1341650280(BasicNewsRecipe):

    title = u'Empire Magazine'
    description = 'Author D.Asbury. Film articles from Empire Mag. '
    language = 'en'
    __author__ = 'Dave Asbury'
    # last updated 7/7/12
    remove_empty_feeds = True
    remove_javascript = True
    no_stylesheets = True
    max_articles_per_feed = 20
    cover_url = 'http://www.empireonline.com/images/magazine/cover.jpg'
    conversion_options = {
        'linearize_tables': True,
    }
    preprocess_regexps = [
        (re.compile(r'<a href="http://twitter.com/share.*?</a>',
                    re.IGNORECASE | re.DOTALL), lambda match: ''),
        (re.compile(r'<head>.*?<!-- CONTENT: START -->', re.IGNORECASE |
                    re.DOTALL), lambda match: '<head></head><!-- CONTENT: START -->'),
        (re.compile(r'<!-- LATEST NEWS HEADLINES: START -->.*?<!-- LATEST NEWS HEADLINES: END -->', re.IGNORECASE |
                    re.DOTALL), lambda match: '<!-- LATEST NEWS HEADLINES: START --><!-- LATEST NEWS HEADLINES: END -->'),
        (re.compile(r'<!-- RELATED FUTURE FILMS: START -->.*?<!-- RELATED FUTURE FILMS: END -->', re.IGNORECASE |
                    re.DOTALL), lambda match: '<!-- RELATED FUTURE FILMS: START --><!-- RELATED FUTURE FILMS: END -->'),
        (re.compile(r'<!-- CURRENT HIGHLIGHTS: START-->.*?<!-- CURRENT HIGHLIGHTS: END -->', re.IGNORECASE |
                    re.DOTALL), lambda match: '<!-- CURRENT HIGHLIGHTS: START--><!-- CURRENT HIGHLIGHTS: END -->'),
        (re.compile(r'<!-- RELATED REVIEWS: START -->.*?<!-- RELATED REVIEWS: END -->', re.IGNORECASE |
                    re.DOTALL), lambda match: '<!-- RELATED REVIEWS: START --><!-- RELATED REVIEWS: END -->'),
        (re.compile(r'<!-- RELATED INTERVIEWS -->.*?<!-- RELATED REVIEWS: END -->', re.IGNORECASE |
                    re.DOTALL), lambda match: '<!-- RELATED INTERVIEWS --><!-- RELATED REVIEWS: END -->'),
        (re.compile(r'<!-- CONTENT: END -->.*?</body>', re.IGNORECASE |
                    re.DOTALL), lambda match: '<!-- CONTENT: END --></body>'),
        (re.compile(r'<!-- STORY: END -->.*?</body>', re.IGNORECASE |
                    re.DOTALL), lambda match: '<!-- STORY: END --></body>'),
        (re.compile(r'<!-- RATINGS GUIDE: START-->.*?<!-- RATINGS GUIDE: END-->', re.IGNORECASE |
                    re.DOTALL), lambda match: '<!-- RATINGS GUIDE: START--><!-- RATINGS GUIDE: END-->'),
        (re.compile(r'<strong>SUBSCRIBE TO EMPIRE</strong>.*?</tbody>',
                    re.IGNORECASE | re.DOTALL), lambda match: '</tbody>'),
        (re.compile(r'<!-- USER REVIEWS: START -->.*?<!-- USER REVIEWS: END -->', re.IGNORECASE |
                    re.DOTALL), lambda match: '<!-- USER REVIEWS: START --><!-- USER REVIEWS: END -->'),
        (re.compile(r'Advertisement', re.IGNORECASE | re.DOTALL), lambda match: ''),
        (re.compile(r'<a name="haveyoursay".*?now to have your say.',
                    re.IGNORECASE | re.DOTALL), lambda match: ''),
    ]
    keep_only_tags = [
        # dict(name='h1'),
        # dict(attrs={'class' : 'mediumblack'}),
    ]
    remove_tags = [dict(name='td', attrs={'width': '200', 'valign': 'top'}),
                   dict(name='b'),
                   dict(name='a', attrs={'name': 'haveyoursay'}),
                   dict(attrs={'class': 'newslink'}),
                   ]

    feeds = [(u'News', u'http://feed43.com/7338478755673147.xml'),
             (u'Recent Features', u'http://feed43.com/4346347750304760.xml'),
             (u'Interviews', u'http://feed43.com/3418350077724081.xml'),
             (u'Film Reviews', u'http://feed43.com/2643703076510627.xml'),
             ]
PK�X����en_globes_co_il.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class En_Globes_Recipe(BasicNewsRecipe):
    description = 'This is en.globes.co.il.'
    cover_url = 'https://www.globes.co.il/images/GlobesEN-144x40.gif'
    title = u'Globes in English'
    language = 'en'
    __author__ = 'barakplasma'
    extra_css = 'img {max-width:100%;}'
    simultaneous_downloads = 5
    remove_javascript = True
    keep_only_tags = [
        dict(name='h1', attrs={'id': 'F_Title'}),
        dict(name='h2', attrs={'id': 'coteret_SubCoteret'}),
        dict(name='p', attrs={'id': None}),
    ]
    max_articles_per_feed = 100

    feeds = [
        (u"Main Headlines", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederNode?iID=942"),
        (u"Israeli stocks on Wall Street", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1392"),
        (u"All news", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=1725"),
        (u"Macro economics", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1389"),
        (u"Aerospace and defense", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1380"),
        (u"Real estate", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederKeyword?iID=1385"),
        (u"Energy and water", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1382"),
        (u"Start-ups and venture capital", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1397"),
        (u"Financial services", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1383"),
        (u"Tel Aviv markets", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1404"),
        (u"Healthcare", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1377"),
        (u"Telecommunications", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1386"),
        (u"Information technology", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1376"),
        (u"Transport and infrastructure", u"https://www.globes.co.il/WebService/Rss/RssFeeder.asmx/FeederKeyword?iID=1388"),
    ]
PK�X�dN��
endgadget.png�PNG


IHDR��h6iIDATxڕ��K�@�;#�wA�> �I"��(�$
,S�T[�6�:�S#��M���m�m����{�����nj����i��-V�z�1���?�!�T�'���	Uȉ0[
��P�˱
����(~L�p}�O���al{O�+�&��`��j�,�J�+��:��l���;��%��E�P����S���Z'3���8�0;X���֐��$^�WC���o��+A^2e�'`�&\p����w�r1�W�#j}ٚ4�w1j�*�S����ӁRնJU[��x90�<?�
۲����(LlzL�D8���'̟
�����JFR���S�P�k
UTC�oBs���8ʥ��IEND�B`�PK�X�;PR��endgadget.recipe#!/usr/bin/env python

__license__   = 'GPL v3'
__copyright__ = 'Copyright 2011 Starson17'
'''
engadget.com
'''

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 Engadget(BasicNewsRecipe):
    title                 = u'Engadget'
    __author__            = 'Starson17, modified by epubli'
    __version__           = 'v2.1'
    __date__              = '2023-09-19'
    description           = 'Tech news'
    language              = 'en'
    oldest_article        = 7
    max_articles_per_feed = 100
    no_stylesheets        = True
    use_embedded_content  = False
    remove_javascript     = True
    remove_empty_feeds    = True
    compress_news_images = True
    scale_news_images_to_device = True
    cover_url = 'https://upload.wikimedia.org/wikipedia/commons/b/bb/Engadget-logo.svg'

    keep_only_tags = [ 
        dict(name='div', attrs={'class':'caas-content-wrapper'}),
        dict(name='figure', attrs={'data-component':'DefaultLede'}),
        dict(name='div', attrs={'data-component':'ArticleHeader'}),
        dict(name='div', attrs={'class':['article-text','article-text c-gray-1 no-review']}),
        dict(name='figure')
    ]
    remove_tags = [
        dict(name='div', attrs={'class':'caas-content-byline-wrapper'}),
        dict(name='div', attrs={'data-component':'ArticleAuthorInfo'}),
        classes('caas-3p-blocked commerce-disclaimer notification-upsell-push article-slideshow athena-button email-form')
    ]

    feeds = [(u'Posts', u'https://www.engadget.com/rss.xml')]

    def parse_feeds(self):
      # Call parent's method.
      feeds = BasicNewsRecipe.parse_feeds(self)
      # Loop through all feeds.
      for feed in feeds:
        # Loop through all articles in feed.
        for article in feed.articles[:]:
          # Remove articles with '...' in the title.
          if 'best tech deals' in article.title:
              print('Removing:',article.title)
              feed.articles.remove(article)
          elif 'Podcast' in article.title:
              print('Removing:',article.title)
              feed.articles.remove(article)
          elif 'The Morning After' in article.title:
              print('Removing:',article.title)
              feed.articles.remove(article)
      return feeds

    def preprocess_html(self, soup):
        for attr in 'data-src data-src-mobile'.split():
            for img in soup.findAll('img'):
                try:
                    ds = img[attr].split()[0]
                    del img[attr]
                except KeyError:
                    continue
                if ds:
                    img['src'] = ds
        for divs in soup.findAll('div'):
            try:
                if divs['style'].split()[0].startswith('padding'):
                    print('Removing padding')
                    del divs['style']
            except KeyError:
                continue

        return soup

PK�X�dN��endgadget_ja.png�PNG


IHDR��h6iIDATxڕ��K�@�;#�wA�> �I"��(�$
,S�T[�6�:�S#��M���m�m����{�����nj����i��-V�z�1���?�!�T�'���	Uȉ0[
��P�˱
����(~L�p}�O���al{O�+�&��`��j�,�J�+��:��l���;��%��E�P����S���Z'3���8�0;X���֐��$^�WC���o��+A^2e�'`�&\p����w�r1�W�#j}ٚ4�w1j�*�S����ӁRնJU[��x90�<?�
۲����(LlzL�D8���'̟
�����JFR���S�P�k
UTC�oBs���8ʥ��IEND�B`�PK�X����endgadget_ja.recipe__license__ = 'GPL v3'
__copyright__ = '2010,2014, Hiroshi Miura <miurahr@linux.com>'
'''
japan.engadget.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class EndgadgetJapan(BasicNewsRecipe):
    title = u'Endgadget\u65e5\u672c\u7248'
    language = 'ja'
    __author__ = 'Hiroshi Miura'
    cover_url = 'http://skins18.wincustomize.com/1/49/149320/29/7578/preview-29-7578.jpg'
    masthead_url = 'http://www.blogsmithmedia.com/japanese.engadget.com/media/eng-jp-logo-t.png'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    language = 'ja'
    encoding = 'utf-8'
    index = 'http://japanese.engadget.com/'
    remove_javascript = True

    remove_tags_before = dict(name="header", attrs={'class': "header"})
    remove_tags_after = dict(name='div', attrs={'class': 'post-meta'})

    def parse_index(self):
        feeds = []
        newsarticles = []
        soup = self.index_to_soup(self.index)
        for topstories in soup.findAll('header', attrs={'class': 'post-header'}):
            itt = topstories.find('h2')
            itema = itt.find('a', href=True)
            itemtime = topstories.find('span', attrs={'class': 'time'})
            newsarticles.append({
                'title': itema.string, 'date': itemtime.string, 'url': itema['href'], 'description': ''
            })
        feeds.append(('Latest Posts', newsarticles))
        return feeds
PK�Xw�B�entrepeneur.png�PNG


IHDR�a�IDATxڝсFQ�b�!�#�#�G�GZ�Rv��`�����X�0�,T����q\�{��o�.ށCZSG6�/�h�-�&���БU����mV�wJyWxa)��lf1�[,���R�Ҧp�R�N!�-Ki���~�a)�s���t���,�)m
�,�)m
,�y���Ř5�M��/�XCW!�.%S?M�w�%�GV��	pNV�G��VԒ���S:����#G���IEND�B`�PK�X�l�	��entrepeneur.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'

from calibre.web.feeds.news import BasicNewsRecipe


class EntrepeneurMagRecipe(BasicNewsRecipe):
    __author__ = 'Kovid Goyal'
    language = 'en'

    title = u'Entrepeneur Magazine'
    publisher = u'Entrepreneur Media, Inc'
    category = u'Business'
    description = u'Online magazine on business, small business, management and economy'

    encoding = 'utf-8'

    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = [
        dict(attrs={'data-word-count': True}),
    ]
    remove_tags = [
        dict(attrs={'class': ['related-content']}),
    ]
    remove_attributes = ['style']

    INDEX = 'https://www.entrepreneur.com'

    def parse_index(self):
        soup = self.index_to_soup(self.INDEX + '/latest')
        articles = []
        for h3 in soup.findAll('h3'):
            a = h3.parent
            if a.name == 'a' and a.get('href'):
                url = self.INDEX + a['href']
                title = self.tag_to_string(h3)
                desc = ''
                if a.next_sibling and a.next_sibling.name == 'p':
                    desc = self.tag_to_string(a.next_sibling)
                articles.append({'title': title, 'url': url, 'description': desc})
                self.log(title, url)
        return [('Articles', articles)]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�Xd�K޿�eos_wetenschap.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿tIME�		(S�r^tEXtRaw profile type iptc
iptc
      28
3842494d040400000000000f1c026e00035246471c02000002000400
`�=�]IDATHǝ�_ht��ݔ>�8����z���i�ȲJ�|�A=�D�z��ܛ�+$�#Zo����1�Ld�n�v����.��vww���~��s��"j�Т�N��u�*n�r�;��&D�#�����,��3}ڬJ�UJ׍1�c�3cQJ:���B�'�E
�ŽBh�c�􍒔��H��Ii�!�Bب�yK�e��!t8+�zW+������e�܎�I��uڼ�4�KX�}EI�s�^Z���{)�P�
<��r��n5�jG��{��ʺ�>U�f��5{ׅ��zLK_*��:u�gA:�Ɣ��@���M�#��ft7/pF�Tl^`D��ټ�IiVO��Ҽ���+I���Fa��:��&�1����vɏ��tӋ�� <�4��v��Fmָ�!K�{��X0,�rD���~�~��By�oҵ�M�}��R�r��+I�vkU���[)��G�K��i�<�{<�)�*���
�*Ie�v���kU��!U���.�`�I)�0���T�e��pUJ%Cw���<n���o8o֔I3J*R*�vk�7q�Tłi_�cK�&�z�N�Nq�iڧG�J�V�*us�%tEXtdate:create2022-09-18T21:03:58+00:00����%tEXtdate:modify2022-09-18T21:03:56+00:00��CjIEND�B`�PK�X�$**��eos_wetenschap.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe


class EOSWetenschap(BasicNewsRecipe):
    title = u'EOS Wetenschap'
    __author__ = u'erkfuizfeuadjfjzefzfuzeff'
    description = u'Wetenschapsnieuws'
    oldest_article = 7
    language = 'nl'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='title'),
        dict(name='h1'),
        dict(name='img'),
        dict(name='p'),
    ]

    remove_tags = []

    feeds = [
        (u'Alle nieuwsberichten', u'http://eoswetenschap.eu/rss/artikels/all'),
        (u'Gezondheid', u'http://eoswetenschap.eu/rss/artikels/Gezondheid'),
        (u'Geneeskunde', u'http://eoswetenschap.eu/artikels/Geneeskunde'),
        (u'Voeding', u'http://eoswetenschap.eu/rss/artikels/Voeding'),
        (u'Sport', u'http://eoswetenschap.eu/rss/artikels/Sport'), (
            u'Natuur & Milieu',
            u'http://eoswetenschap.eu/rss/artikels/Natuur%20en%20Milieu'
        ), (u'Energie', u'http://eoswetenschap.eu/rss/artikels/Energie'), (
            u'Klimaatverandering',
            u'http://eoswetenschap.eu/rss/artikels/Klimaatverandering'
        ), (u'Natuur', u'http://eoswetenschap.eu/rss/artikels/Natuur'),
        (u'Gedrag', u'http://eoswetenschap.eu/rss/artikels/Gedrag'),
        (u'Psychologie', u'http://eoswetenschap.eu/rss/artikels/Psychologie'), (
            u'Hersenwetenschap',
            u'http://eoswetenschap.eu/rss/artikels/Hersenwetenschap'
        ), (u'Sociologie', u'http://eoswetenschap.eu/rss/artikels/Sociologie'), (
            u'Fundamenteel onderzoek',
            u'http://eoswetenschap.eu/rss/artikels/Onderzoek'
        ), (
            u'Natuur- en wiskunde',
            u'http://eoswetenschap.eu/rss/artikels/Natuur-%20en%20wiskunde'
        ), (u'Genetica', u'http://eoswetenschap.eu/rss/artikels/Genetica'),
        (u'Chemie', u'http://eoswetenschap.eu/rss/artikels/Chemie'),
        (u'Technologie', u'http://eoswetenschap.eu/rss/artikels/Technologie'),
        (u'Biotechnologie', u'http://eoswetenschap.eu/rss/artikels/Biotechnologie'),
        (
            u'Nanotechnologie',
            u'http://eoswetenschap.eu/rss/artikels/Nanotechnologie'
        ), (u'ICT', u'http://eoswetenschap.eu/rss/artikels/Internet'),
        (u'Mobiliteit', u'http://eoswetenschap.eu/artikels/Mobiliteit'),
        (u'Geschiedenis', u'http://eoswetenschap.eu/rss/artikels/Historisch'), (
            u'Archeologie- en paleontologie',
            u'http://eoswetenschap.eu/rss/artikels/Archeologie_Paleontologie'
        ), (
            u'Moderne geschiedenis',
            u'http://eoswetenschap.eu/rss/artikels/Moderne_geschiedenis'
        ), (u'Ruimte', u'http://eoswetenschap.eu/rss/artikels/Ruimte'),
        (u'Ruimtevaart', u'http://eoswetenschap.eu/rss/artikels/ruimtevaart'),
        (u'Kosmologie', u'http://eoswetenschap.eu/rss/artikels/Kosmologie')
    ]
PK�X��\��epl_talk.png�PNG


IHDR  ��tRNSn��	pHYs��iIDATH���]oU�眙9�۲۲�-����RJ��1\����^�/�c�P��@��&H�;���n���7vwfv�g�8%�	p���\��9�'��<hx���LL���ȃ�M�t3xӊ��8�+��>�Ծ,73bS`m�2���a�!�1�֟��-��(ġ
��._����QW�oi��u�T7�A������=@�	j�?Zύl�Q7��S�h�\�-��eԊ@ZÇe�x��������,i�
E�n�p�le�A=,� S$��΅7t=A5ْ�����,iJ�M�jJ|]����iL-H�;x�n�7fҊ����AW��sg��
�!��1>�m}XK/�&=��k	�ʦ������-'L�h�������[�i�6s�{��
v�������|u�Nk��r
���OW��7B=����F�7eKN�����kJI�j����U"l�@H�;���;����O�����
Y:�����Jڃ�}�՝�=`Û�=�I����|�>�(KZJ�&H1$R'b�#)��s�'r�ֿ=��
\��.û�d�pۼ���Q9,�H�H�iC�c������4?�WQ��2�D��)�j�!�T���փx��d�;8�3��S�u��{	.|x����\V��e2-�T�>�Y���u�h�`V"�K\���&S%_WP�
�A�l�^9
6��c�::�Z��Hy��n�X}4w���Ƀ���0ԍsnFwU�ţ!����J�*Vl��1ְvh����t>W�hd�w���ƳN�����Gx�0d�c{��hd�R�e��v�z΂G߱㙡������=�~�6
�R�����[\\Ћ�0
��V�\~��x��a����S��hqy��t̶��#��[8?m��h`��I;������!�h����S�5�@�2��3�Nj�b
t:��Jemm�\)
��\Y��|��-��8��� �Jq�-���A?�pœ\�L)�g��h88��$Y,�ԁ�ّ�c�4���v��q��3�P>�D.��C���{����	�H
J�1�	mD8}!`YVEYUy�O�$�"���I�(��N��*�h��0���^?�K�@����IEND�B`�PK�Xs��epl_talk.recipe#!/usr/bin/env python
__license__ = 'GPL 3'
__copyright__ = 'zotzo'
__docformat__ = 'restructuredtext en'
'''
http://www.epltalk.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class EPLTalkRecipe(BasicNewsRecipe):
    language = 'en'
    version = 2
    __author__ = 'rylsfan'

    title = u'EPL Talk'
    publisher = u'The Gaffer'
    publication_type = 'Blog'
    category = u'Soccer'
    description = u'News and Analysis from the English Premier League'
    cover_url = 'http://bit.ly/hJxZPu'

    oldest_article = 3
    max_articles_per_feed = 100
    use_embedded_content = True
    remove_javascript = True
    encoding = 'utf8'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        {'class': 'feedflare'},
        {'class': 'tweetmeme_button'},
        {'class': 'eplrelated'},
        {'p': 'Related posts:<ol>'},
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)

    feeds = [
        (u'EPL Talk', u'http://feeds.feedburner.com/EPLTalk'),
        (u'MLS Talk', u'http://feeds.feedburner.com/majorleaguesoccertalksite'),
    ]

    extra_css = '''
           h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
           h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
           p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
           body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
               '''
PK�X���epoch_times.png�PNG


IHDR  D���GPLTE'H���Rd|Xi�s�����������N`x���p�r�����)J�����������������������Yj�m|�n}�*@]0Ea4Ie6Kfu��u��v��w��y��{��~����������3R,L���t��������4S��¯�²�ij��+K���9Mi������������������������?SmAUoEXrH[t���K^v(I6TTf}Ug~��Ƶ�Ƿ�ȸ�ɺ�ʺ��Wi 7V���#:X\m�������������������������]n�_o�`p�br�������������cs�dt����gw����������������iy�v����IDATx���Sc�P��z�m۶mo����l��$O]�H)MO55�K�rr������w2���xY����6\�����=�:?^��CzTu�Ůr�E�Jk�㧏��4{��e�o�@�z�%X�~
�����G ��%�W`�3p�)���/�!B������~���|&?
�f�@��������>��u�,B��&p���On;��^�텲q��_�x|xp�ՙ��s�$5;�7IEND�B`�PK�X��P99epoch_times.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe, classes


class EpochTimes(BasicNewsRecipe):
    title = 'The Epoch Times'
    __author__ = 'Kovid Goyal'
    description = 'US general news'
    language = 'en'
    encoding = 'utf-8'
    oldest_article = 1.2
    max_articles_per_feed = 20
    ignore_duplicate_articles = {'url'}
    remove_attributes = ['height', 'width', 'style']
    remove_empty_feeds =  True
    no_stylesheets = True
    resolve_internal_links = True
    masthead_url = 'https://epochtimes-ny.newsmemory.com/eeLayout/epochtimes/1.0.a/images/webapp/banner.png'
    extra_css = '.post_caption, .text-sm, .uppercase {font-size:small;}'

    keep_only_tags = [
        dict(name='article')
    ]
    remove_tags = [
        classes('print:hidden h-header shortcode aspect-square'),
        dict(name=['button', 'svg']),
        dict(name='img', attrs={'src':lambda x: x and x.endswith('svg')})
    ]

	# feeds can be found at https://www.theepochtimes.com/rssfeeds
    feeds = [
        ('Special Series', 'https://feed.theepochtimes.com/health/special-series/feed'),
        ('US', 'https://feed.theepochtimes.com/us/feed'),
        ('China News', 'https://feed.theepochtimes.com/china/feed'),
        ('World', 'https://feed.theepochtimes.com/world/feed'),
        ('Opinion', 'https://feed.theepochtimes.com/opinion/feed'),
        ('Business & Markets', 'https://feed.theepochtimes.com/business/feed'),
        ('Science', 'https://feed.theepochtimes.com/science/feed'),
        ('Tech', 'https://feed.theepochtimes.com/tech/feed'),
        ('Health & Wellness', 'https://feed.theepochtimes.com/wellness/feed'),
        ('Epoch Taste', 'https://feed.theepochtimes.com/epoch-taste/feed'),
        ('Entertainment', 'https://feed.theepochtimes.com/entertainment/feed'),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        for fig_c in soup.findAll('figcaption'):
            fig_c['class'] = 'post_caption'
        return soup
PK�Xϴ|�rrepw.png�PNG


IHDR  I��PLTE�?���w�w�'IDAT[c` ؟?sB�{8a��#x�
 ��A2&GCS��IEND�B`�PK�X-�U��
epw.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>

from collections import OrderedDict
from calibre.web.feeds.news import BasicNewsRecipe


def absurl(x):
    if x.startswith('/'):
        x = 'http://www.epw.in' + x
        return x


class EconomicAndPoliticalWeekly(BasicNewsRecipe):
    title = 'Economic and Political Weekly'
    __author__ = 'Kovid Goyal'
    description = 'Economic and Political news from India'
    publisher = 'epw.in'
    category = 'news, finances, politics, India'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    simultaneous_downloads = 1
    encoding = 'utf-8'
    language = 'en_IN'
    publication_type = 'newspaper'
    masthead_url = 'http://www.epw.in/system/files/epw_masthead.png'

    keep_only_tags = [
        dict(id=['block-system-main', 'page-title']),
    ]

    def parse_index(self):
        soup = self.index_to_soup('http://www.epw.in/')
        main = soup.find('div', id='main-content')
        sections = OrderedDict()
        current_section = None

        for div in main.findAll(attrs={'class': lambda x: x and 'views-field-title' in x.split()}):
            section = self.tag_to_string(div.findParent(
                attrs={'class': 'block-inner'}).find('h2'))
            if section != current_section:
                current_section = section
                if section not in sections:
                    sections[section] = []
                self.log('\n\n' + section)
            title = self.tag_to_string(div)
            a = div.find('a', href=True)
            url = absurl(a['href'])
            desc = ''
            if a.get('title'):
                desc = a['title']
            else:
                d = div.findNextSibling(
                    attrs={'class': lambda x: x and 'views-field-body' in x.split()})
                if d is not None:
                    desc = self.tag_to_string(d)
            self.log('\t', title, url)
            self.log('\t\t', desc)
            sections[current_section].append(
                {'title': title, 'url': url, 'description': desc})

        current_section = 'Web Exclusive'
        sections[current_section] = []
        self.log('\n\n' + current_section)
        for div in main.findAll(attrs={'class': lambda x: x and 'views-field-nothing' in x.split()}):
            title = self.tag_to_string(div)
            elems = div.findAll('a', href=True)
            if len(elems) == 2:
                desc, title = map(self.tag_to_string, elems)
            else:
                title, desc = self.tag_to_string(elems[0]), ''
            url = absurl(elems[-1]['href'])
            self.log('\t', title, url)
            self.log('\t\t', desc)
            sections[current_section].append(
                {'title': title, 'url': url, 'description': desc})

        return [(t, articles) for t, articles in sections.items() if articles]
PK�Xϴ|�rrepw_magazine.png�PNG


IHDR  I��PLTE�?���w�w�'IDAT[c` ؟?sB�{8a��#x�
 ��A2&GCS��IEND�B`�PK�X���epw_magazine.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from collections import OrderedDict


def absurl(x):
    if x.startswith('/'):
        x = 'http://www.epw.in' + x
        return x


class epw(BasicNewsRecipe):
    title = 'EPW Magazine'
    __author__ = 'unkn0wn'
    description = 'Economic and Political news from India'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en_IN'
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'http://www.epw.in/system/files/epw_masthead.png'
    ignore_duplicate_articles = {'title', 'url'}

    keep_only_tags = [
        dict(name='h1', attrs={'id': 'page-title'}),
        classes(
            'field-name-field-secondary-title field-type-text region-content updated_field'
        )
    ]
    remove_tags = [
        classes('premium-message node-readmore tag_container mobile_article_info')
    ]

    def parse_index(self):
        soup = self.index_to_soup('https://www.epw.in/journal/epw-archive')
        div = soup.find('div', **classes('fieldset-wrapper'))
        a = div.find('a', href=lambda x: x and x.startswith('/journal/'))
        url = absurl(a['href'])
        self.log(self.tag_to_string(a))
        soup = self.index_to_soup(url)

        view = soup.findAll('div', **classes('views-field-field-cover-image'))[0]
        try:
            self.cover_url = view.find('img', src=True)['src'].split('?')[0].replace(
                '/styles/freeissue/public', ''
            )
        except Exception:
            # sometimes they dont add img src
            self.cover_url = 'https://www.epw.in/sites/default/files/cache/cover_images/2022/Cover_4June2022_Big.gif'

        feeds = OrderedDict()

        div = soup.find('div', attrs={'id': 'block-system-main'})
        for a in div.findAll('a', href=lambda x: x and x.startswith('/journal/')):
            articles = []
            url = absurl(a['href'])
            title = self.tag_to_string(a)
            view = a.findParent('h4'
                                ).findParent('div', **classes('views-field-title'))
            new = view.find_next_sibling('div')
            if new:
                desc = self.tag_to_string(new)
            h3 = view.findParent('div',
                                 **classes('views-row')).find_previous_sibling('h3')
            section_title = self.tag_to_string(h3)
            self.log('\t', title)
            self.log('\t', desc)
            self.log('\t\t', url)
            articles.append({'title': title, 'url': url, 'description': desc})

            if articles:
                if section_title not in feeds:
                    feeds[section_title] = []
                feeds[section_title] += articles
        ans = [(key, val) for key, val in feeds.items()]
        return ans
PK�X���l��equestria_daily.png�PNG


IHDR  szz��IDATx���p$Y��7�8W��6c;Y#��w�މ�vl�ڶm۶������W���~�E�a�����ph�\E��Q��UN)�p��ı3re�����=M���<�UT�R�;�B�sWLwK��,�v��,�LwMӸX1�US�lA�c2�H-�����X�a�j�C+�9����S�aj����Ff6�ɮ}1��
�kLt��%Š�)��IQ�j�HD�h��e����a��L�4P#�P-z�XtD�h�b�#�����DSE5%d��8���N��ڣ�ho�j\�t��W O$cy�R\�~�����Q�0BĢ�
��6�jNr�jj�z�4M�d��rw�]���{�ά<�
Cf��u-έ?���Z��#MDC��A"VQMK���:[�s�s�PS�	�l?
�8�J��8zN�ُ����{Q�<�E�H�ՔvcP�[���*j0�3D�bJ���]�W��ú�sp|����>U�H�a�?��_ˠ�ɣ�PW���K�>o>/ށ��oc��Y88w�:����x|�>�����������E��铂}K�j�o��ya�7���[Ƒ�{P;��oþe�eRD(�J��? ^x)�a�4���L��vcQ7
3��#70�|�"'*-`\���~,�7�h*�WTY~���:�nQ?���8n(��Q���"?~ �G��:e�Ƣ�IȆ,���3��4~����� � � $���$"�C��G���f�������U��k47��8�IA��B��1]"5��C�$"Q
@�䃖f�����#��k�DQ��4�Ưe���Hވ��4>h+����֒'�H�h�?#��5|��>������4~o���5~� �3}�H��m�	Q�"���|��sx�������a���IEND�B`�PK�Xy'!��equestria_daily.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.utils.date import parse_date, utcnow


class AdvancedUserRecipe1639926896(BasicNewsRecipe):
    __author__ = "Aisteru"
    __copyright__ = "2021, Timothée Andres <timothee dot andres at gmail dot com>"
    __license__ = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'

    title = "Equestria Daily"
    description = "Everything new in Equestria and beyond!"
    language = 'en'

    # Max. supported by website: 50
    max_articles_per_feed = 30

    compress_news_images = True
    compress_news_images_auto_size = 4
    no_stylesheets = True
    keep_only_tags = [{'name': 'div', 'class_': ['post', 'hentry']}]
    remove_tags = [{'name': 'div', 'class_': 'post-footer'}]
    extra_css = '.article_date { margin-left: 10px; }'

    # Masthead image dimensions
    MI_WIDTH = 600
    MI_HEIGHT = 200

    # To discard posts under a certain section, simply comment the whole line
    sections = [
        ("Art", 'Art'),
        ("News", 'News'),
        ("Fics", 'Fanfiction'),
        ("Media", 'Media'),
        ("Comics", 'Comic'),
        ("Community", 'Community'),
        ("Editorial", 'Editorial'),
    ]

    def get_masthead_url(self):
        soup = self.index_to_soup('https://www.equestriadaily.com')
        img = soup.select_one('#header img')
        return img['src']

    def parse_index(self):
        results = {}
        current_date = utcnow()

        def clean_description(description):
            lines = description.split('\n')
            return '\n'.join([line.strip() for line in lines if len(line.strip()) > 0])

        for (section_name, section_url_name) in self.sections:
            soup = self.index_to_soup(
                f'https://www.equestriadaily.com/search/label/{section_url_name}?max-results={self.max_articles_per_feed}')
            articles = soup.select('div.post.hentry')
            previous_post_date = current_date

            for article in articles:
                article_entry = {}

                header = article.select_one('h3 > a')
                article_entry['title'] = header.text
                article_entry['url'] = header['href']
                article_entry['date'] = article.select_one('span.post-timestamp').text.split('\n')[1]
                article_entry['description'] = clean_description(article.select_one('div.entry-content').text)
                article_entry['content'] = ''  # Must be empty

                post_date = previous_post_date

                try:
                    post_date = parse_date(article_entry['date'])
                    previous_post_date = post_date
                except Exception:
                    pass

                if (current_date - post_date).days <= self.oldest_article:
                    results.setdefault(section_name, []).append(article_entry)

        return [(section, results[section]) for section in results]
PK�X�.R�FFerdinger_anzeiger.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�A���erdinger_anzeiger.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Erdinger Anzeiger'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Landkreis Erding', u'http://www.merkur-online.de/lokales/erding/rssfeed.rdf'),
    (u'Lkr. Erding', u'http://www.merkur-online.de/lokales/erding/landkreis/rssfeed.rdf'),
    (u'Dorfen', u'http://www.merkur-online.de/lokales/erding/dorfen/rssfeed.rdf'),
    (u'Flughafen', u'http://www.merkur-online.de/lokales/erding/flughafen/rssfeed.rdf'),
    (u'Taufkirchen', u'http://www.merkur-online.de/lokales/erding/taufkirchen/rssfeed.rdf'),
    (u'Erding', u'http://www.merkur-online.de/lokales/erding/erding/rssfeed.rdf'),
    (u'Moosinning', u'http://www.merkur-online.de/lokales/erding/moosinning/rssfeed.rdf'),
    (u'Wartenberg', u'http://www.merkur-online.de/lokales/erding/wartenberg/rssfeed.rdf'),
    (u'Forstern', u'http://www.merkur-online.de/lokales/erding/forstern/rssfeed.rdf'),
    (u'Bockhorn', u'http://www.merkur-online.de/lokales/erding/bockhorn/rssfeed.rdf'),
    (u'Finsing', u'http://www.merkur-online.de/lokales/erding/finsing/rssfeed.rdf'),
    (u'St. Wolfgang', u'http://www.merkur-online.de/lokales/erding/st-wolfgang/rssfeed.rdf'),
    (u'Isen', u'http://www.merkur-online.de/lokales/erding/isen/rssfeed.rdf'),
    (u'Holzland', u'http://www.merkur-online.de/lokales/erding/holzland/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/erding/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X�����erhvervs_avisen_dk.png�PNG


IHDR��h6kIDATm��KTq��oyoޛ�ed�qO-������hC(�Z��!"��N�n-t�P��s� ���ʜ4r�2EA�gy��eN}>����y.�����3	�*Q<��}딻 W}7�z�VBS8�Gx:c\>��r*&����E���Z�/��7�ۄm�̦��+��L��EĒ�B�%�lЃ-Mu%��0�Z� �IP�Ps�pw�T�ҙ��oY�N:L��  ��d8s�x�Z]u�d|�gh���0t�,AA8�$/$�|-�)��f�hmؗϒ0tX��s�`d���0�L�q�������0Ҷ%(�L@��qpG�'>X��	��+������� LI�Q�ϔg8gN7�bW{��?���� �!�'ё�C2�r��s���(��E!+�"�ʵ~�P%�ޏ�>�H���?f�t4�a
��l�M�ş�t������=
-}Kl&�¶8��]�Eʋe��qC3�ۦ.J�fkM���񉩥b��h��&aWW{MW;�4�����w-�_��6K38c��09��
�����Js�"P��	�?s;(l�
�lXl�J��bӑ`���`�ȟ����t4aO�IEND�B`�PK�X��}�<<erhvervs_avisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Erhvervs&#149;Avisen: RSS feed: Seneste nyt - erhvervsavisen.dk
'''


class Erhvervsavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Erhvervs Avisen'
    description = 'Lokale, regionale nyheder, bolig, motor og job i Køge, Greve, Ringsted og Stevns på erhvervsavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Erhvervs Avisen', 'http://erhvervsavisen.dk/section/senestenytrss'),

    ]
PK�X
��a!!esbjerglokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X�4h=��esbjerglokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Esbjerg: RSS feed: Seneste nyt - esbjerg.lokalavisen.dk
'''


class EsbjergLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Esbjerg'
    description = 'Lokale og regionale nyheder, sport, kultur fra Esbjerg og omegn på esbjerg.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Esbjerg', 'http://esbjerg.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Esbjerg', 'http://esbjerg.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Esbjerg', 'http://esbjerg.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Esbjerg', 'http://esbjerg.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Esbjerg', 'http://esbjerg.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Esbjerg', 'http://esbjerg.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�Xv�))
esenja.png�PNG


IHDR(-S]PLTE��������������̼�̼�Ĵ�Ĵ�Ĭ�����������������������������������|��tz�lr�dn�dj�\b|T^|TZ|���H��tRNS@��fzIDATx�AN���j����͵���40�
��m��r\��'Z��	���|�ɤ2�b��62�W���G�Eee�U2Z)�m@��?MZx�����
��y�Z�
@K0/ל(��W�|IEND�B`�PK�Xd<ti��
esenja.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2010, matek09, matek09@gmail.com'

import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup, Comment


class Esensja(BasicNewsRecipe):

    title = u'Esensja'
    __author__ = 'matek09 & fenuks'
    description = 'Magazyn kultury popularnej'
    encoding = 'utf-8'
    no_stylesheets = True
    language = 'pl'
    remove_javascript = True
    masthead_url = 'http://esensja.pl/img/wrss.gif'
    oldest_article = 1
    URL = 'http://esensja.pl'
    HREF = '0'
    remove_attributes = ['style', 'bgcolor', 'alt', 'color']
    keep_only_tags = [dict(attrs={'class': 'sekcja'}), ]
    # keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'article'})
    remove_tags_after = dict(id='tekst')

    remove_tags = [dict(name='img', attrs={'src': ['../../../2000/01/img/tab_top.gif', '../../../2000/01/img/tab_bot.gif']}),
                   dict(name='div', attrs={'class': 't-title2 nextpage'}),
                   # dict(attrs={'rel':'lightbox[galeria]'})
                   dict(attrs={'class': ['tekst_koniec', 'ref', 'wykop']}),
                   dict(attrs={'itemprop': ['copyrightHolder', 'publisher']}),
                   dict(id='komentarze')

                   ]

    extra_css = '''
                                    .t-title {font-size: x-large; font-weight: bold; text-align: left}
                                    .t-author {font-size: x-small; text-align: left}
                                    .t-title2 {font-size: x-small; font-style: italic; text-align: left}
                                    .text {font-size: small; text-align: left}
                                    .annot-ref {font-style: italic; text-align: left}
                            '''

    preprocess_regexps = [(re.compile(r'alt="[^"]*"'), lambda match: ''),
                          (re.compile(
                              u'(title|alt)="[^"]*?"', re.DOTALL), lambda match: ''),
                          ]

    def parse_index(self):
        soup = self.index_to_soup('http://www.esensja.pl/magazyn/')
        a = soup.find('a', attrs={'href': re.compile('.*/index.html')})
        year = a['href'].split('/')[0]
        month = a['href'].split('/')[1]
        self.HREF = 'http://www.esensja.pl/magazyn/' + year + '/' + month + '/iso/'
        soup = self.index_to_soup(self.HREF + '01.html')
        self.cover_url = 'http://www.esensja.pl/magazyn/' + \
            year + '/' + month + '/img/ilustr/cover_b.jpg'
        feeds = []
        chapter = ''
        subchapter = ''
        articles = []
        intro = soup.find('div', attrs={'class': 'n-title'})
        '''
        introduction = {'title' : self.tag_to_string(intro.a),
                                        'url' : self.HREF + intro.a['href'],
                                        'date' : '',
                                        'description' : ''}
        chapter = 'Wprowadzenie'
        articles.append(introduction)
        '''

        for tag in intro.findAllNext(attrs={'class': ['chapter', 'subchapter', 'n-title']}):
            if tag.name in 'td':
                if len(articles) > 0:
                    section = chapter
                    if len(subchapter) > 0:
                        section += ' - ' + subchapter
                    feeds.append((section, articles))
                    articles = []
                if ''.join(tag['class']) == 'chapter':
                    chapter = self.tag_to_string(tag).capitalize()
                    subchapter = ''
                else:
                    subchapter = self.tag_to_string(tag)
                    subchapter = self.tag_to_string(tag)
                continue

            finalurl = tag.a['href']
            if not finalurl.startswith('http'):
                finalurl = self.HREF + finalurl
            articles.append({'title': self.tag_to_string(
                tag.a), 'url': finalurl, 'date': '', 'description': ''})

            a = self.index_to_soup(finalurl)
            i = 1

            while True:
                div = a.find('div', attrs={'class': 't-title2 nextpage'})
                if div is not None:
                    link = div.a['href']
                    if not link.startswith('http'):
                        link = self.HREF + link
                    a = self.index_to_soup(link)
                    articles.append({'title': self.tag_to_string(
                        tag.a) + ' c. d. ' + str(i), 'url': link, 'date': '', 'description': ''})
                    i = i + 1
                else:
                    break

        return feeds

    def append_page(self, soup, appendtag):
        r = appendtag.find(attrs={'class': 'wiecej_xxx'})
        if r:
            nr = r.findAll(attrs={'class': 'tn-link'})[-1]
            try:
                nr = int(nr.a.string)
            except:
                return
            baseurl = soup.find(attrs={'property': 'og:url'})[
                'content'] + '&strona={0}'
            for number in range(2, nr + 1):
                soup2 = self.index_to_soup(baseurl.format(number))
                pagetext = soup2.find(attrs={'class': 'tresc'})
                pos = len(appendtag.contents)
                appendtag.insert(pos, pagetext)
            for r in appendtag.findAll(attrs={'class': ['wiecej_xxx', 'tekst_koniec']}):
                r.extract()
            for r in appendtag.findAll('script'):
                r.extract()

            comments = appendtag.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        for tag in soup.findAll(attrs={'class': 'img_box_right'}):
            temp = tag.find('img')
            src = ''
            if temp:
                src = temp.get('src', '')
            for r in tag.findAll('a', recursive=False):
                r.extract()
            info = tag.find(attrs={'class': 'img_info'})
            text = str(tag)
            if not src:
                src = re.search('src="[^"]*?"', text)
                if src:
                    src = src.group(0)
                    src = src[5:].replace('//', '/')
            if src:
                tag.contents = []
                tag.insert(0, BeautifulSoup(
                    '<img src="{0}{1}" />'.format(self.URL, src)))
            if info:
                tag.insert(len(tag.contents), info)
        return soup
PK�XQ4I�88esensja_(rss).png�PNG


IHDR(-S]PLTE���������������|�������Ԅ����������Ĝ��������tz���Ĕ��lr�T^|���������TZ|\b|dn�������dj�����Wv�tRNS@��f�IDATx�T�BD!E�Ow���e�P�.}�.���%s��8�O:i�����
W@���A�
�Z�NNQ�(e�Jsa(��V��SNRJ�m���s,�R�9���Z&�8�
��/�Ϋ���x{	�޽�y2?��>���h>�IEND�B`�PK�XX4���esensja_(rss).recipe__license__ = 'GPL v3'
import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup, Comment


class EsensjaRSS(BasicNewsRecipe):
    title = u'Esensja (RSS)'
    __author__ = 'fenuks'
    description = u'Magazyn kultury popularnej'
    category = 'reading, fantasy, reviews, boardgames, culture'
    language = 'pl'
    encoding = 'utf-8'
    INDEX = 'http://www.esensja.pl'
    cover_url = ''
    masthead_url = 'http://esensja.pl/img/wrss.gif'
    use_embedded_content = False
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    remove_javascript = True
    ignore_duplicate_articles = {'title', 'url'}
    preprocess_regexps = [(re.compile(r'alt="[^"]*"'), lambda match: ''),
                          (re.compile(
                              u'(title|alt)="[^"]*?"', re.DOTALL), lambda match: ''),
                          ]
    remove_attributes = ['style', 'bgcolor', 'alt', 'color']
    keep_only_tags = [dict(attrs={'class': 'sekcja'}), ]
    remove_tags_after = dict(id='tekst')

    remove_tags = [dict(name='img', attrs={'src': ['../../../2000/01/img/tab_top.gif', '../../../2000/01/img/tab_bot.gif']}),
                   dict(name='div', attrs={'class': 't-title2 nextpage'}),
                   # dict(attrs={'rel':'lightbox[galeria]'})
                   dict(attrs={'class': ['tekst_koniec', 'ref', 'wykop']}),
                   dict(attrs={'itemprop': ['copyrightHolder', 'publisher']}),
                   dict(id='komentarze')
                   ]

    feeds = [(u'Książka', u'http://esensja.pl/rss/ksiazka.rss'),
             (u'Film', u'http://esensja.pl/rss/film.rss'),
             (u'Komiks', u'http://esensja.pl/rss/komiks.rss'),
             (u'Gry', u'http://esensja.pl/rss/gry.rss'),
             (u'Muzyka', u'http://esensja.pl/rss/muzyka.rss'),
             (u'Twórczość', u'http://esensja.pl/rss/tworczosc.rss'),
             (u'Varia', u'http://esensja.pl/rss/varia.rss'),
             (u'Zgryźliwi Tetrycy', u'http://esensja.pl/rss/tetrycy.rss'),
             (u'Nowe książki', u'http://esensja.pl/rss/xnowosci.rss'),
             (u'Ostatnio dodane książki', u'http://esensja.pl/rss/xdodane.rss'),
             ]

    def get_cover_url(self):
        soup = self.index_to_soup(self.INDEX)
        cover = soup.find(id='panel_1')
        self.cover_url = self.INDEX + \
            cover.find('a')['href'].replace(
                'index.html', '') + 'img/ilustr/cover_b.jpg'
        return getattr(self, 'cover_url', self.cover_url)

    def append_page(self, soup, appendtag):
        r = appendtag.find(attrs={'class': 'wiecej_xxx'})
        if r:
            nr = r.findAll(attrs={'class': 'tn-link'})[-1]
            try:
                nr = int(nr.a.string)
            except:
                return
            baseurl = soup.find(attrs={'property': 'og:url'})[
                'content'] + '&strona={0}'
            for number in range(2, nr + 1):
                soup2 = self.index_to_soup(baseurl.format(number))
                pagetext = soup2.find(attrs={'class': 'tresc'})
                pos = len(appendtag.contents)
                appendtag.insert(pos, pagetext)
            for r in appendtag.findAll(attrs={'class': ['wiecej_xxx', 'tekst_koniec']}):
                r.extract()
            for r in appendtag.findAll('script'):
                r.extract()

            comments = appendtag.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        for tag in soup.findAll(attrs={'class': 'img_box_right'}):
            temp = tag.find('img')
            src = ''
            if temp:
                src = temp.get('src', '')
            for r in tag.findAll('a', recursive=False):
                r.extract()
            info = tag.find(attrs={'class': 'img_info'})
            text = str(tag)
            if not src:
                src = re.search('src="[^"]*?"', text)
                if src:
                    src = src.group(0)
                    src = src[5:].replace('//', '/')
            if src:
                tag.contents = []
                tag.insert(0, BeautifulSoup(
                    '<img src="{0}{1}" />'.format(self.INDEX, src)))
            if info:
                tag.insert(len(tag.contents), info)
        return soup
PK�X��!�hh
eso_pl.png�PNG


IHDR(-S�PLTEy�y�z��z�{�x�z�w���{��s�u�w�v�w�{�=��3��w�z�y�z�z�w�Z��w��h��^�Ӂ��e����r�w�v�y�q�a��x��I��[�җ��2��z�_����y�z�v�D��}�R�ֆ��_��s�C�ˏ��/�Ʌ��%��x�y��Ǻ��`��Z��h��3��Z��k��|��z�t�w�w�'��
{�N��^��o��f��a��u�y�z�x�y�z�t�w�{��V��|��!��v�z�y�z�t�@�Қ��m����\��p�{�y�t�0�ʜ��v����H��z�x�w�Z��t��h��
x�x�p���p�x�y�y�*�Ě��9��-�ƥ��<��y�|�u�E�L�IDATWcdF�����_��xa�H@��Eܗ�������2w#�#3B�Ȍ�~L0�`k٣`���,��u?�aE���	�Z�En��	��Jgd���M0Q�)��q���0тgҌ�W���0޿|�IEND�B`�PK�X���%%
eso_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class ESO(BasicNewsRecipe):
    title = u'ESO PL'
    __author__ = 'fenuks'
    description = u'ESO, Europejskie Obserwatorium Południowe, buduje i obsługuje najbardziej zaawansowane naziemne teleskopy astronomiczne na świecie'
    category = 'astronomy'
    language = 'pl'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    use_embedded_content = False
    cover_url = 'https://www.eso.org/public/archives/logos/medium/eso-logo-black-outline.jpg'
    keep_only_tags = [dict(attrs={'class': 'subcl'})]
    remove_tags = [dict(id='lang_row'), dict(
        attrs={'class': ['pr_typeid', 'pr_news_feature_link', 'outreach_usage', 'hidden']})]
    feeds = [
    (u'Wiadomo\u015bci', u'http://www.eso.org/public/poland/news/feed/'),
    (u'Og\u0142oszenia', u'http://www.eso.org/public/poland/announcements/feed/'),
    (u'Zdj\u0119cie tygodnia', u'http://www.eso.org/public/poland/images/potw/feed/')]

    keep_only_tags = [
        dict(name='div',attrs={'class':'col-md-9 left-column'})]

    def preprocess_html(self, soup):
        for a in soup.findAll('a', href=True):
            if a['href'].startswith('/'):
                a['href'] = 'http://www.eso.org' + a['href']
        return soup
PK�X3}��55espn.png�PNG


IHDRr/DL��IDATx^m�i�&iu��<K�[�v߻��mz�Yzf�m
0f��؎	1� G��D92Y��$r6��+��H��&X8
�,��a��z���{��]��Y�	�{�����������OGU���0"5��UT=�s�?8��d?�U�;��&��Iq�A��§̑H��*�+P��An�ap�eV��ly�qzH9�\��L �Q-��  �2�H�ơ��D��N�"�L0
H�*�Q�G?��	�" �m�TVH��ZB�Ą�=.�@͸�Em���
�@^�|�W�f�[��I�*�E� �e����c"�U�@����������9C���E_�`e�p$�"K�a.:�����!�q��)�
5�7��y��A;*\��ƥ�=��f�8Q�b4�d�5G�ɠ5�,DdEb�a�#m�THXYH���$?�Bl4�X�q��ke«{��ڴ�|i<.��2��e�l�d|�[�T������X.��z�\����[��ãA��EY$��P���C!5b4*H���W���3�zԂd�a���,�@�0d�Jc�,�)��֟~��e{{s�Y��w=�я⁷c}!�HA	$�@8F�F��%$�|��
�?�B�i�)~�K����ǣW�;h:������R���Ya\D�"seTG�E��PA�"����~�^��׋�ݛ�Sj���AJ
&dB6�9w-�]��6,�@
�ɠ������B�2����f�HS(a��KG�Ω�}߯|����@ǽ����/X$A3�`
`AD���l�a��	P�B�75F㛾�7}�3�~���~�룓��-X�@�[_)�̀�i�h�bP@�o�#�`o��갋�x��-�|�_|i��� @E���
�Q��a�m~�Cu0,-�e
�úD�
����XOl������w�=�,g���/|�4�m.�	V!8�I�
8��
&3ǣ7��Ht�o0�0�K"���gt�s>񋏽xy��[��P{�6�p	&��1Vqܡ@K׋V�ς�X>����fuț;��|�p�� �M�	�g��N�:%Ȇ�r���~�ư�βX2��裏�A�����c�R]�f� ���
�FYI�
� �@����$�ݸ�jA�c	�O����mj{?���;����|���TvUaL��`J�@ׇ�w1Cf(	��Z�������V��`lb�P�@&�O�t'O"�P�ľ��ΠDeX3	�������Y�<���Oo��/�]O����Wj�MfT*|"�bO\��1���,�Ő@ �0��@V,)s\�J~�:�4�;{0���
�#k+�ԁ��$B,5C��٩��
�&'�E��Ơ��L{���`C��E,���Vp��P� ̳W�d������� �a�!0�9�A�@\~�C�SX��=�g�E�,!)�E `��l�;9�!�$�IfV��PaD�2��p�O��O#����^1G{����A01�& �PF@ 6
ˬe�l
9�,2�4��B3�b���Wv��f��(��8s�T�%%$��ԏ�Mg\_�'_�kkG9�1:�
c%�@�&#J��V�e��·,�h9_ؽ�U������/���u����(؊"�\���ڶe�(�(�{8mlLMHF�����CG`��N11����
��z�hu8hSC"�cRUc�s��BӔeiل4ec�������g_�0��_����XY>1ٛt�_Y����Ē�b*HgXVu�6�X.����w��SϝZ;��E�<:�2���n.o�Y�D
Пt�>�a+�E����Xs՘�4l�r�Ɣ�w�3I�D$��&@jTl6
.�����_n]�u08�|���X�\���JQ��%&k3�tl�J�i5�uPՐά��9�ۜ�~��;��?!v�L��k���i�J=_���qX��a��D��8SJ9&f6D��Y��6�٧����ͣ��U?��]�A;\�f2�qj�d�n][���C7�u�q2�ߣ���,�{K=��9ܮM{��
���8C�$�g�E�a�m{�7��������L�4������8v>sR�j6!N�Mc�
�YN���_�Go���~�g�Thޖ�:b,��Ź�F�vRajI!'�B�iE2�8�Vc���?��^=�vys}i}P�?��鰒�֙)�ºHtC�3��c���2���0\�ir����?���C��8�[Y�X����̦�k++G�K���ӝ�$�
>�'ѹW�8��_��v��VV��u�스������/�T��u@
j�XH�d�`2$��;����~f�Қs(
�[h�Hh)�@�*Ff0�g��V�t����6���z�m'�<�Ѵɓy�����jN��"�d-������ػ?�i|���
�V��q���"�Zt�P��:�̰1_��ǥ�!�0��}񩴺��_�U�}������&ֶp6%l��ܿ\�y�`g�ʜ#t�]��7>���V�Y4�h�qm��⿡�<!gb�F��R&/eq�oG�Il�hbNmkU�@.9�BTbT���,�������+�'����ɍ�ñ'p��DF���8�&%Yc\!�Y�D�sƛ�8�G�����wm%��]9u�QH��Q��ntWbe�dM� �c�E
��ٖ8��C�1U`_-���q�zXZk/�P�yw��W���2���g���WA0	��N��nx�_{7V{�Em����ʹ��n���/5^���	AV����D�
�|��<e׊�M�V�c��A3O&e����r3����xwwe���?����?>�wW�-l�m-C�X*�$��UhL��mS�B��L�CKUҼ]7�������ХK��|�X]^�|N\�La>8�&m��U�1�̒Y�)"	�Iٱ��:�_<�<����7#��/�Na�a�,7絨�t�/��/������wc���sm����׆�v}i�M��͞~�;':�۴VS���XC`�B����N��0�ȥ2
����<���pe��JB�V��1U
4�@6�^�=�Ǟ÷_�ugO�"�hi�Yc�� ĠrvI����������xj<�A���J�'���3�_���.&cmLɩ`\�nά����B7X׵� W����(J���K/��_��;�V��w���?��ų�`T��"�,{�/��l�"���d�O�,N�Յ]Y��-mn�z�,L8z��cC�J{��%�����^���*�9�̬l�Hg�����/��ϖ���i��g��B4s� J7�{�+����8�;�e�w>�[x�-o�G����>��LfCW:�B�Uꕫ7��?��A�-b���v|T-��{��l�z�}��Y��"��mn���+�/�`��U	��Aʒ�1Fkm�1Ŷ_VH��ǟ����
�Qd���oX,���X;uBv���F&��\?�u|/u����`ho4���7`4���K�PP�)֭W_}��z��:@+ێ��42�@�:���LfӦׁD;��y�q�|��a=�O�����q�k=m�t�TU���.�8.�F�x֛-`?�Y����b��{�[��2�8ͧ�Su��۳��>����_��q�\9o��u�˪~��w|��(��;��h��˛㹩�����숋|8��b�����SeCYY�	�L���Z�q<�q�m�li��ds�}��O�|�+_��(�YhXu��#��g~��ގ+F��
�����f��[L�֢r��$�)C�1(}���ۋ����}��C��p�8�mom^y�Wy�"�0��H�T�V˝������N���+E����+a�(+`3��
ͬ`tb]gv��N;�{��VAyg1Y9s�ֳ}aO������L�{��{Щr�"�l(k�x橕�tݔ�9��R����s
F3���B��\��[c��rG���8�b�介�>~���g6�YS����Ѳ�z�Xdb�%OdB�ݢ<�;Z5�%	���e� B� �DX�b��ٺI�+k�6]�?�6�]Q���w�t��m��I|+H(���������/��g+:������S��P@���tb{�N ��Xm���������Z1��'�^w~4��o�m�6hS[�6�M�(���G�lr���m�>P"R0P��3��޷δ���ja�ȅ�j�d��<�m/f�B1���eIkg�uz�����f�i��~��}��%-���hH�Ld� 6�Pw���qfo�dg��)��Sk'M�B��ܫ��� KIibi��QG��lΟ{U��v�{�8Y=�?m���)�B��1������F�bVw{���)c��E�I��T�����&�&B�>�a��@#�4�-P("A*h,�å��xd��u����*JI���K��a2.�7mSB��5�[��-/�+���b��!@<�<��F̪��r�
�
�µ�ZT7_�ß<U8���l�� ‰�u���n��)A>�I,�����i��O?��Z��s�����{/^���^7�P$)P�(M��ɑ��Y8�n�-6�vo=u���~��ݡW6���'��|�7�Ʀ��)�]L�dv��˷��(H��mR�)AB����Mr�A��UYT��2QM�����_����'�z[_��#m���⎛'];sH�@j
sF���O?s�ʕn�K�B��r�@P��ƻ���E���7�}�6���e@R���q��p�b�Z,
�'��I�(49'�^o4\s;���?��ݿ{el��,F���c}Ἧ�׺E����IӘv��m]~��~g���ej���~CS��7���MʋF�d-H7F��}U�NQ�"X�������TD��@���u���C�7$��CN�i:9�����>�а��D�
8=�h׆��ISv8��S����|�QMu�S���Y�(+v����Y��n^����
���x�8�I�d6�����	0YZAbF&�OfN͓_x�����w}�=�v:KsǕ	X	r<,8&�g"ѣ�!e"�Xk�]�/�/<���ʟ����y��vo����8��a���H�4�O��\E�M�V�'�SB�d@�, !�����{�@��/�Q��.پ�$&c)s����h2�a���4k�1�>4�&Ju�)��ηF���:@����-<�URXnZ�p6��w8w�%{��u���4�r��D_�	�]�j#�T��4
���VYwio���*[�̉�֝��P0~�4�1�mI�)#p�B�]��6���ů}����x�(]Ӿ�-�#�Ӡ*��Ķ�t��׾��!sc/�P�,V$��*�$��m�A���
���R�D���gO�ã2Ô�5�^��nV�o���qЄt}����O]��́4���PZC�蛀Jv��ܩfU5�w���R�}f�a�!3H91����RDX�.Z7Y�u�@Z�i�kJWBI�o�~]�qgb�"QVd«{[�޼��r��sܭ�n9�U��h
26D���"t��E�V`T����H���H����n�|�+�e�R*r����J�.7�����H(�߲SW�>���H�,�0>��6����Q0�2��0��յ��ҚY�Fe@A*`8+��	P�Š2�U9F��\��H��DJDL0� `&@�R6�� �ܫ �׶UH]M.թitf�լ�cg�ɤ�!�&B�<��q�Bo�ď!Vuz�R�0lY�����"�ײ�C(n�����^|�-�Vd�:ɜL"N�%uB��	�����
%4A���R��(wِ�e8+(��ܕDȋ�h�(�
�u����8;�Bd�Cq�(+��!�E�B`USHhA뺁�J��0��0�xC&[�	���n�?�9KV�Ĕ)'r�9*R������Z�Q2HDrV��Ȁ���чT�hBH�P(���?�—iaIEND�B`�PK�X_V�<�
�
espn.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

'''
espn.com
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import TemporaryFile


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class ESPN(BasicNewsRecipe):

    title = 'ESPN'
    description = 'Sports news'
    __author__ = 'Kovid Goyal and Sujata Raman'
    language = 'en'
    no_stylesheets = True

    use_embedded_content = False
    remove_javascript = True
    needs_subscription = 'optional'

    keep_only_tags = [
        classes('article-header article-body'),
    ]
    remove_tags = [
        classes('ad-slot article-social'),
    ]

    feeds = [
        ('Top Headlines', 'https://www.espn.com/espn/rss/news'),
        'https://www.espn.com/espn/rss/nfl/news',
        'https://www.espn.com/espn/rss/nba/news',
        'https://www.espn.com/espn/rss/mlb/news',
        'https://www.espn.com/espn/rss/nhl/news',
        'https://www.espn.com/espn/rss/golf/news',
        'https://www.espn.com/espn/rss/rpm/news',
        'https://www.espn.com/espn/rss/tennis/news',
        'https://www.espn.com/espn/rss/boxing/news',
        'https://www.espn.com/espn/rss/soccer/news',
        # 'http://soccernet.espn.go.com/rss/news',
        'https://www.espn.com/espn/rss/ncb/news',
        'https://www.espn.com/espn/rss/ncf/news',
        'https://www.espn.com/espn/rss/ncaa/news',
        # 'https://www.espn.com/espn/rss/outdoors/news',
        # 'http://sports.espn.go.com/espn/rss/bassmaster/news',
        'https://www.espn.com/espn/rss/oly/news',
        'https://www.espn.com/espn/rss/horse/news'
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if False and self.username and self.password:
            # ESPN has changed to a JS based login system, cant be bothered
            # revering it
            br.set_handle_refresh(False)
            url = ('https://r.espn.go.com/members/v3_1/login')
            raw = br.open(url).read()
            raw = re.sub(r'(?s)<form>.*?id="regsigninbtn".*?</form>', '', raw)
            with TemporaryFile(suffix='.htm') as fname:
                with open(fname, 'wb') as f:
                    f.write(raw)
                br.open_local_file(fname)

            br.form = list(br.forms())[0]
            br.form.find_control(
                name='username', type='text').value = self.username
            br.form['password'] = self.password
            br.submit().read()
            br.open('http://espn.go.com').read()
            br.set_handle_refresh(True)
        return br
PK�X����esquire.png�PNG


IHDR:����IDATWc`��G���-�5OB�����5�@��3�ـ|���O#H�X� �1�"T��[���BU����G?��~�ԇj�?1����0�i�1ĖC�6A�[|�X��������?�UP�_
���
���{fXPƤ�����"�xIEND�B`�PK�X������esquire.recipe__license__ = 'GPL v3'

'''
www.esquire.com
'''
from collections import defaultdict

from calibre.web.feeds.news import BasicNewsRecipe
from css_selectors import Select


def absolutize(url):
    if url.startswith('/'):
        url = 'https://www.esquire.com' + url
    return url


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class Esquire(BasicNewsRecipe):
    title = 'Esquire'
    __author__ = 'Kovid Goyal'
    description = 'Esquire: Man at His Best'
    publisher = 'Hearst Communications, Inc.'
    no_stylesheets = True
    encoding = 'utf-8'
    language = 'en'

    keep_only_tags = [
        classes('article-header gallery-header listicle-header listicle-body standard-header standard-body article-body gallery-main-view')
    ]

    remove_tags = [
        classes('article-body--share-container tags--top image-share share-gallery embedded-image--expand embedded-image--close')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup

    def parse_index(self):
        url = 'https://www.esquire.com'
        root = self.index_to_soup(url, as_tree=True)
        select = Select(root)
        feeds = defaultdict(list)

        for a in select('.cover-story-marquee a[href]'):
            title = self.tag_to_string(a).strip() or 'Cover Story'
            url = absolutize(a.get('href'))
            self.log('Cover story:', title, url)
            feeds['Cover Story'] = [{'title': title, 'url': url}]
            break

        for a in select('a[data-vars-cta]'):
            title = self.tag_to_string(a).strip()
            if not title:
                continue
            url = absolutize(a.get('href'))
            section = a.get('data-vars-cta')
            feeds[section].append({'title': title, 'url': url})
            self.log(title, url)

        ans = []
        for sec in sorted(feeds, key=lambda x: (x != 'Cover Story', x)):
            articles = feeds[sec]
            if articles:
                ans.append((sec, articles))
        return ans
PK�X=`�00estadao.png�PNG


IHDR(-SPLTEj���[���j��e��]��b��\����������r���������q�Ԅ��d����{��k�����m��\��������Y��t��c��M��|��j��S��[��U��K��T�����s����������ꃼ�����֎������ۆ�������l�˫�����T�������뀡�t��Q}����`������b�������������[�������i����b����ܽ��]��b�����t������ꚸО��W��O{�S������IDATx�5��DA���j����ڶm���Z���"�A��oBq�i|r����T=ɾx��+Rn���h����0�^��ɐ�B�ػ��0�RE~ݗ�c����Z��$��9̃�� �����dX�"��~Jj`i�e�!jk���r��S����bo?O�C2mtNN�,6�ݫ��M��}����c�u�g��Bc^���(۳�1�?�
>-5;d�A�X�z�IEND�B`�PK�X�%…��estadao.recipefrom __future__ import print_function
from calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime, timedelta
from calibre.ebooks.BeautifulSoup import Tag
from calibre.utils.magick import Image, PixelWand


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Estadao(BasicNewsRecipe):
    THUMBALIZR_API = ''  # ---->Get your at http://www.thumbalizr.com/ and put here
    LANGUAGE = 'pt_br'
    language = 'pt'
    LANGHTM = 'pt-br'
    ENCODING = 'utf'
    ENCHTM = 'utf-8'
    directionhtm = 'ltr'
    requires_version = (0, 7, 47)
    news = True

    title = u'Estad\xe3o'
    __author__ = 'Euler Alves'
    description = u'Brazilian news from Estad\xe3o'
    publisher = u'Estad\xe3o'
    category = 'news, rss'

    oldest_article = 4
    max_articles_per_feed = 100
    summary_length = 1000

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    timefmt = ' [%d %b %Y (%a)]'

    hoje = datetime.now() - timedelta(days=2)
    pubdate = hoje.strftime('%a, %d %b')
    if hoje.hour < 10:
        hoje = hoje - timedelta(days=1)
    CAPA = 'http://www.estadao.com.br/estadaodehoje/' + \
        hoje.strftime('%Y%m%d') + '/img/capadodia.jpg'
    SCREENSHOT = 'http://estadao.com.br/'
    cover_margins = (0, 0, 'white')
    masthead_url = 'http://www.estadao.com.br/estadao/novo/img/logo.png'

    keep_only_tags = [
        dict(name='div', attrs={'class': ['bb-md-noticia', 'corpo']})]
    remove_tags = [
        dict(name='div',
             attrs={'id': [
                 'bb-md-noticia-tabs'
             ]}), dict(name='div',
                       attrs={'class': [
                           'tags', 'discussion', 'bb-gg adsense_container'
                       ]}), dict(name='a'), dict(name='iframe'), dict(name='link'), dict(name='script')
    ]

    feeds = [

    (u'\xDAltimas Not\xEDcias', u'http://www.estadao.com.br/rss/ultimas.xml'),
    (u'Manchetes', u'http://www.estadao.com.br/rss/manchetes.xml'),
    (u'Brasil', u'http://www.estadao.com.br/rss/brasil.xml'),
    (u'Internacional', u'http://www.estadao.com.br/rss/internacional.xml'),
    (u'Cinema', u'http://blogs.estadao.com.br/cinema/feed/'),
    (u'Planeta', u'http://www.estadao.com.br/rss/planeta.xml'),
    (u'Ci\xEAncia', u'http://www.estadao.com.br/rss/ciencia.xml'),
    (u'Sa\xFAde', u'http://www.estadao.com.br/rss/saude.xml'),
    (u'Pol\xEDtica', u'http://www.estadao.com.br/rss/politica.xml')
    ]

    conversion_options = {
        'title': title, 'comments': description, 'publisher': publisher, 'tags': category, 'language': LANGUAGE, 'linearize_tables': True
    }

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        if not soup.find(attrs={'http-equiv': 'Content-Language'}):
            meta0 = new_tag(soup, 'meta', [
                        ("http-equiv", "Content-Language"), ("content", self.LANGHTM)])
            soup.head.insert(0, meta0)
        if not soup.find(attrs={'http-equiv': 'Content-Type'}):
            meta1 = new_tag(soup, 'meta', [
                        ("http-equiv", "Content-Type"), ("content", "text/html; charset=" + self.ENCHTM)])
            soup.head.insert(0, meta1)
        return soup

    def postprocess_html(self, soup, first):
        # process all the images. assumes that the new html has the correct
        # path
        for tag in soup.findAll('img', src=True):
            iurl = tag['src']
            img = Image()
            img.open(iurl)
            width, height = img.size
            print('img is: ', iurl, 'width is: ', width, 'height is: ', height)
            if img < 0:
                raise RuntimeError('Out of memory')
            pw = PixelWand()
            if(width > height and width > 590):
                print('Rotate image')
                img.rotate(pw, -90)
                img.save(iurl)
        return soup

    def get_cover_url(self):
        if self.THUMBALIZR_API:
            cover_url = self.CAPA
            try:
                soup = self.index_to_soup(cover_url)
                cover_item = soup.find('body')
                if cover_item:
                    cover_url = 'http://api.thumbalizr.com/?api_key=' + self.THUMBALIZR_API + \
                        '&url=' + self.SCREENSHOT + '&width=600&quality=90'
                return cover_url
            except Exception:
                cover_url = 'http://api.thumbalizr.com/?api_key=' + self.THUMBALIZR_API + \
                    '&url=' + self.SCREENSHOT + '&width=600&quality=90'
                return cover_url
PK�X�[鋴�eu_commission.png�PNG


IHDR  �g	PLTE���p�&�tRNS@��fYIDATx^���
� ��S��Ez"��yǑ����N:a^N��Jj&9��J��iһ
�&�
Hs6l�J�,��'ß�/��1#���o��K�z.^IEND�B`�PK�X,�˯B
B
eu_commission.recipefrom calibre.web.feeds.news import BasicNewsRecipe

LANGUAGE = 'de'


def feedlink(num):
    return u'http://europa.eu/rapid/syndication/QuickRSSAction.do?id=' +\
        str(num) + '&lang=' + LANGUAGE


class EUCommissionPress(BasicNewsRecipe):
    title = u'Pressemitteilungen der EU Kommission pro Politikbereich'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    cover_url = 'http://ec.europa.eu/wel/template_2007/images/banners/banner-background.jpg'
    __author__ = 'malfi'
    language = LANGUAGE
    keep_only_tags = []
    keep_only_tags.append(
        dict(name='div', attrs={'class': 'pressReleaseContentMain'}))
    remove_tags = []

    feeds = [
        (u'Pressemitteilung des Tages', feedlink(64)),
        (u'Presidency', feedlink(137)),
        (u'Foreign affairs and security policy', feedlink(138)),
        (u'Agriculture and rural development', feedlink(139)),
        (u'Budget and financial programming ', feedlink(140)),
        (u'Climate action', feedlink(141)),
        (u'Competition', feedlink(142)),
        (u'Development', feedlink(143)),
        (u'Digital agenda', feedlink(144)),
        (u'Economic and monetary affairs', feedlink(145)),
        (u'Education, culture, multilingualism and youth ', feedlink(146)),
        (u'Employment, social Affairs and inclusion ', feedlink(147)),
        (u'Energy', feedlink(148)),
        (u'Enlargment and European neighbourhood policy ', feedlink(149)),
        (u'Environment', feedlink(150)),
        (u'Health and consumer policy', feedlink(151)),
        (u'Home affairs', feedlink(152)),
        (u'Industry and entrepreneurship', feedlink(153)),
        (u'Inter-Institutional relations and administration', feedlink(154)),
        (u'Internal market and services', feedlink(155)),
        (u'International cooperation, humanitarian aid and crisis response', feedlink(
            156)),
        (u'Justice, fundamental rights and citizenship', feedlink(157)),
        (u'Maritime affairs and fisheries', feedlink(158)),
        (u'Regional policy', feedlink(159)),
        (u'Research and innovation', feedlink(160)),
        (u'Taxation and customs union, audit and anti-fraud', feedlink(161)),
        (u'Trade', feedlink(162)),
        (u'Transport', feedlink(163))
    ]
    extra_css = '''
     h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
     h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
     p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
     body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
     '''
PK�Xp��GGeuropa_press.png�PNG


IHDR  D���<PLTE�����������������DD�""爈뙙���������33�ff�UU��ww���tRNS����c7[�IDATx^����0ТI�.��_
��,w��UK)����tw���@𥔐t�P��
���$R: ԑ�J@;�@T��
f�$�~֌�n"����Pyܐ�rH�QA���:����;���Y$4�.�r�P�X6n�@�~� �k�8�ðN�|����;��IEND�B`�PK�X�c'���europa_press.recipe__license__ = 'GPL v3'
__author__ = 'Luis Hernandez'
__copyright__ = 'Luis Hernandez<tolyluis@gmail.com>'
__version__ = 'v1.0'
__date__ = '30 January 2011'

'''
www.europapress.es
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1294946868(BasicNewsRecipe):

    title = u'Europa Press'
    author = 'Luis Hernandez'
    description = 'spanish news agency'

    oldest_article = 2
    max_articles_per_feed = 100

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False

    language = 'es'
    timefmt = '[%a, %d %b, %Y]'

    remove_tags_before = dict(name='div', attrs={'class': ['nivel1 bg_3col']})
    remove_tags_after = dict(
        name='div', attrs={'id': ['ImprimirEnviarNoticia']})

    remove_tags = [
        dict(name='ul', attrs={'id': ['entidadesNoticia', 'MenuSecciones']}), dict(name='div', attrs={'id': ['ImprimirEnviarNoticia', 'PublicidadSuperior', 'CabeceraDerecha', 'Comentarios', 'comentarios full fbConnectAPI', 'ComentarEstaNoticia', 'ctl00_Superior_Main_MasEnChance_cajamasnoticias', 'gl_chn', 'videos_portada_derecha', 'galeria_portada_central', 'galeria_portada_central_boxes']}), dict(  # noqa
            name='div', attrs={'class': ['infoRelacionada', 'col_1', 'buscador', 'caja doblecolumna strong', 'CHANCE_EP_Encuesta_frontal text', 'seccionportada col_0', 'seccion header', 'text', 'pie caption_over']}), dict(name='a', attrs={'class': ['buscadorLabel']}), dict(name='span', attrs={'class': ['editado']}), dict(name='table'), dict(name='li') ]  # noqa

    feeds = [

    (u'Portada', u'http://www.europapress.es/rss/rss.aspx'),
    (u'Nacional', u'http://www.europapress.es/rss/rss.aspx?ch=66'),
    (u'Internacional', u'http://www.europapress.es/rss/rss.aspx?ch=69'),
    (u'Economia', u'http://www.europapress.es/rss/rss.aspx?ch=136'),
    (u'Deportes', u'http://www.europapress.es/rss/rss.aspx?ch=67'),
    (u'Cultura', u'http://www.europapress.es/rss/rss.aspx?ch=126'),
    (u'Sociedad', u'http://www.europapress.es/rss/rss.aspx?ch=73'),
    (u'Motor', u'http://www.europapress.es/rss/rss.aspx?ch=435'),
    (u'CHANCE', u'http://www.europapress.es/rss/rss.aspx?ch=549'),
    (u'Comunicados', u'http://www.europapress.es/rss/rss.aspx?ch=137')
    ]
PK�X 	��DD
europasur.png�PNG


IHDR  ��tRNSn��	pHYs���IDATH��V�KSQ�}�pa0��%��>}�>}�
J�Ӳ�(�(sS�z7w7]c�jDH��2J���"˰,z��:+��V���z�ټ^k�,:�8ܻ��<����!�m �#Wp�w�ݓ+8����-��M��fk�/���58d�!������ɟ͜>m%���:[� Q��2�W��@��U[�rsF�$�k��S2��6�W���>�~7���諏#���z��w
8]�T����������
���M�1��b%�C�FH�j
��:��'QLc����M��d�v�L�)qCO��5ϳd 0� TV#E�G~(JBUS�[����>=}v(�02lp�8����u'Uo��ۙUo7����m�qE�q1D��Tka�{��~�"�N ���B�I��nI�ߘlg{��y,�H4�t�9�wK��+Q+��{�]�2��p%�B��w��io#�*�m!��i	j���F�,.nnFPki��b)�(.�����z	P��i	��/��B*��y^���h<�Sa��N@�z�Ux��6�q�:������A���љ�E�`(x�5�8z�N�$�C4����	�\��vlL�* �t�J��U�,]F��iE)�,���T��+D�ZE��on�x0�ť�~�F�x��Ǒ��� l]��]r���3ّ�
�/T�q�,i��mgSAL�"`�¦lB�X)��l�|LZ{jB�Z���%l��L6��|��S�IK J���v���%&"@�(;u�ɉe2K����uUT^Ak60+�����<ɷ�bhq뉢$�C^<�=0���:�^�����]�&���_�~Ÿ�z��{"�Q�>�~La���^Of��5Z�f 6G��|�/<:�w�	h��!|�3C��G��#5�x�t㻢�{�W��Yܓi�G�CF
�]wB�_<��O��W���;�>Π��)��o}vdڙ7
�ɳ���D�,d�U�ڒ������.^9!��7��_q��ĐM�IEND�B`�PK�XZ���

europasur.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
europasur.es
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Europasur(BasicNewsRecipe):
    title = 'Europa Sur'
    __author__ = 'Darko Miletic'
    description = 'News in Spanish'
    publisher = 'Joly Digital'
    category = 'news, politics, Spanish'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    remove_empty_feeds = True
    delay = 2
    no_stylesheets = True
    encoding = 'cp1252'
    language = 'es'
    publication_type = 'newspaper'
    extra_css             = """ body{font-family: Verdana,Arial,Helvetica,sans-serif}
                                h2{font-family: Georgia,Times New Roman,Times,serif}
                                .subtitle{font-weight:bold}
                                .caption{font-size: small}
                                .body{font-size: 1.1em}
                                .info{color: #848484}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(attrs={'class': ['titles', 'current']}), dict(
            attrs={'id': 'newsBody'})
    ]
    remove_tags = [
        dict(name=['iframe', 'base', 'embed', 'object']), dict(name='a', attrs={
            'class': 'zoom thickbox'}), dict(name='div', attrs={'class': 'other'})
    ]
    remove_attributes = ['width', 'height']

    feeds = [

    (u'Portada', u'http://www.europasur.es/rss/articles.php'),
    (u'Deportes', u'http://www.europasur.es/rss/articles.php?sec=1224'),
    (u'Economia', u'http://www.europasur.es/rss/articles.php?sec=427'),
    (u'Espana', u'http://www.europasur.es/rss/articles.php?sec=437'),
    (u'Mundo', u'http://www.europasur.es/rss/articles.php?sec=428'),
    (u'Pasarela', u'http://www.europasur.es/rss/articles.php?sec=1958'),
    (u'Ocio y cultura', u'http://www.europasur.es/rss/articles.php?sec=1210'),
    (u'Opinion', u'http://www.europasur.es/rss/articles.php?sec=1195'),
    (u'Tecnologia', u'http://www.europasur.es/rss/articles.php?sec=1681'),
    (u'Salud', u'http://www.europasur.es/rss/articles.php?sec=2379')
    ]

    def image_url_processor(self, baseurl, url):
        artl, sep, width = url.rpartition('&an=')
        artid, sep, ext = artl.rpartition('.')
        article_id = artid.rpartition('/')[2]
        return 'http://media.grupojoly.com/cache/' + article_id + '_' + width + 'x' + width + '_' + ext + '000.' + ext
PK�X8�jffevangelizo.png�PNG


IHDR  ��tRNSn��IDATxڥV\Z_�7��2�ew�[b=]www�+�7[p	���\�W�q������q�y�:��122���߷o!�����5C�&��￵��+�����wpp066�y��������zc]���"ܺ���Yca�_`����t5Qcܽ�����Vtkk눰+�X1p�z�e3P���n�a�
�
��
f��m�>C�W#Blll~���+/3^�qfZ��8%���
�D5�<
�xP��������g������ٳ�u$�3F(���j&o�(%J^���X��)y���hQ~0tc܌fՑ�͛����ާ��|� ���t#9�H-�D��|mY-cˡ%j�� n��|+$�g
�C��x!6H�Y����m-��f�����({�U4�[���d�)�ДC	�m<�9,:r��̩��A�^���i��"ى��n���*�h\��#t���q$;��>\q=$"T�W #�b�zm<{�\����ϡi�HRP���o�<E�X�GW���*@G�t�9�ɋ��7Kc*_��թ�uц�&:#7��PRӔ4�4)�7f'`Tb�P$d1 ���ޏn0�c"fm��wn��A�V��q|;/-:�ĉc��E9��P֥�>b书�̙�>�.�r��1SC7�[�C���fIh#&�7ˢ��`'�]
��3ra�;r���wpPN<������MWK	d�`:H�!�#�VRN3g6K\h@ġ�ˣ<�Hz�L�x�đc���P��g���=�sMx#&Ыeo%�e��?�"�����.r@�1Ӥ��7��=�����	�z����\Α	/�$2�s�ıe�z�D�8%��YΞ�fO_Ȼ��GY#�	/�ߟ�~�L�4y7�)�\H9n��� �!��#>�g	�5"�Dۻ4�C�Ѩ���pU|����N
_*�y�Ͱޒ�I�Wqvo��Yѻ���x���nY�=q�
�@�	�D+2��8[�^���!z�E��c�������d���SR᲌�FZ����q���l�'����������bG���>��5X�U9��r�����J���#�Wˇ����h���s�Ϙ�s�X$��Dr%��t�ҙ�c#S*ҿr�`�K��ϟ7,*7S`��
���`PT��e��[�#bq��9a��a�B Q\��|���~����Iw�KhV�8�����փi�21��΋���ը	V�*�u�z��f}���Z��
nQ9�x��g�v�9<]��B9�I����t&��ف��<��hOri�mfO�$�Ā�Q�B�S��>�BN�"'���ɳ�nf���9����╧���]�����
���,��<�mv��8j�v;�y��eq����G�n��Y��9����\��X4rt5vYmnY��K�L�]X���EbE����n�7p`�w!C���v�[�����	�W�c�m�:�[M���+?�W��&��=ye��M7R�j5�(���!�~r�7�� �E�m��U��N��?p"���G�t�M�4��
�,�]U0eO�ög[�_3���	�o7��_86��09G�k��a�ݗ�	GIH��^փY	��<�:��t=Jrܗ��!ӹ�x�;�IkGF�8� �`|*����'5�Ln��V�4:�T�_.q;��t������y_(��G[��[���^QM��y���B��ԝe?p� Q��\©�u��
���F��Je�2F����.&�R��R���nכ,-:x�A	���� ~A�	�Φ�{ݠ9��y�V�]*��H��dک���b�ly���ƻ�w �[�Zh��g3�$�(:�Y@<B�#��ۓ�}nҜCk].�9��s9��r�伟ട�Zp]��w��/l��
��;.����7���eׅ�4��m�E�/��}&�j���m�	]�]q�t��ӦM�#wl0,Ep���KJɯ�ԴR�_)�/jGJA��x"�	��j�9�?a�vd570�IEND�B`�PK�X;a�%��evangelizo.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class Evangelizo(BasicNewsRecipe):
    title = 'Evangelizo.org'
    oldest_article = 2
    max_articles_per_feed = 30
    language = 'de'
    __author__ = 'Bobus'
    feeds = [
        ('EvangleliumTagfuerTag',
         'http://www.evangeliumtagfuertag.org/rss/evangelizo_rss-de.xml'),
    ]
    use_embedded_content = True
    preprocess_regexps = [
        (re.compile(
            r'&lt;font size="-2"&gt;([(][0-9]*[)])&lt;/font&gt;'), r'\g<1>'),
        (re.compile(r'([\.!]\n)'), r'\g<1><br />'),
    ]

    def populate_article_metadata(self, article, soup, first):
        article.title = re.sub(
            r'<font size="-2">([(][0-9]*[)])</font>', r'\g<1>', article.title)
        return
PK�X��Y  everett_herald.png�PNG


IHDR  D���lPLTE��77�??����""����		�

�WW�dd�oo�((���������������������������OO�����ϛ����������Պ��oIDATx�͒�0F�T�z�:���q�ݰn}���!��Rp;fӊ;Ⅹ�q�@GS��'���4V���I3�}"LD��H�f�X%����o�E~C[�G��oĵ*�ª#�[��+IEND�B`�PK�X߶Ԃ``everett_herald.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1295088390(BasicNewsRecipe):
    title = u'Everett Herald'
    language = 'en'
    __author__ = '77ja65'
    oldest_article = 7
    max_articles_per_feed = 50
    no_stylesheets = True
    auto_cleanup = True

    feeds = [(u'Local News', u'http://www.heraldnet.com/feed/')]
PK�X�cT&&
evz.ro.png�PNG


IHDR(-SEPLTE�,"�X?�eK߈n�|갚�qV�}b�K4�碋�<*�Ϳ�����������ͽ���裍�����wtRNS@��f�IDATx^=�U�0ņ�P�uj�ˣ��28;lz����T0F�0�3MŐCJ��:I����ny�x�j�rR!q���p'ɼcfs����?���_�5�b����^Aǜr�xG+���Ë��;��͊Z[�?+7����IEND�B`�PK�X0>rr
evz.ro.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
evz.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class EvenimentulZilei(BasicNewsRecipe):
    title = u'Evenimentul Zilei'
    __author__ = u'Silviu Cotoar\u0103'
    description = ''
    publisher = u'Evenimentul Zilei'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri'
    encoding = 'utf-8'
    cover_url = 'http://www.evz.ro/fileadmin/images/evzLogo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'single'}), dict(name='img', attrs={
            'id': 'placeholder'}), dict(name='a', attrs={'id': 'holderlink'})
    ]

    remove_tags = [
        dict(name='p', attrs={'class': ['articleInfo']}), dict(name='div', attrs={'id': [
            'bannerAddoceansArticleJos']}), dict(name='div', attrs={'id': ['bannerAddoceansArticle']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': ['bannerAddoceansArticleJos']})
    ]

    feeds = [
        (u'Feeds', u'http://www.evz.ro/rss.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�#b��
exiled.png�PNG


IHDR��h6cIDAT5�KKTa��3�9^H��,"+��� Rq��l�2���((���E*�"�L�Ef1:g���93��K6�� S"h
�
�B@5���jT���W���"X��� ��n��*�xiP��ק��d?~j��3ʠ(���`L���|Wf0>�?�8 �œ˅=g�Ct�l<��I���]���
���ʊ0�0�	�3���g�ܪ�-��1%>�v��vv��_R����,���=/�jb�M�p[�y.�%_�8a�*a��Jy���g01�Ժ/ln*��!�²C�@w	�Ϯg;Nbb�bq�
v�31�k�.a����F����ꣷ�ŽYDX������ ������gr��_��`&!��ҷ�葰�楡��X�&7<L�HD�
6�Ef&&����[?v�-��ٓ��G,�j�O����*l�+$����+[u���8�c�퉉|:�<⟽-��iab�J���k�鴛��8b�\*ܾEH�g:��yNʰ6:�M7S�� �l�ѐ^>�/,|�55���Ɩm�ن�ه�0��(+?ըQ`�=����b�/��?��I��������IEND�B`�PK�X���55
exiled.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2011, Darko Miletic <darko.miletic at gmail.com>'
'''
exiledonline.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Exiled(BasicNewsRecipe):
    title = 'Exiled Online'
    __author__ = 'Darko Miletic'
    description = "Mankind's only alternative since 1997 - Formerly known as The eXile"
    publisher = 'Exiled Online'
    category = 'news, politics, international'
    oldest_article = 15
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    remove_javascript = True
    language = 'en'
    publication_type = 'newsblog'
    masthead_url = 'http://exiledonline.com/wp-content/themes/exiledonline_theme/images/header-sm.gif'
    extra_css             = """
                               body{font-family: Arial,Helvetica,sans-serif}
                               #topslug{font-size: xx-large; font-weight: bold; color: red}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [dict(name='div', attrs={'id': 'main'})]

    remove_tags = [
        dict(name=['object', 'link']), dict(name='div', attrs={'class': 'info'}), dict(
            name='div', attrs={'id': ['comments', 'navig']})
    ]

    feeds = [(u'Articles', u'http://exiledonline.com/feed/')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for alink in soup.findAll('a'):
            if alink.string is not None:
                tstr = alink.string
                alink.replaceWith(tstr)
        return soup

    def get_article_url(self, article):
        raw = article.get('link',  None)
        final = raw + 'all/1/'
        return final
PK�X�J��ZZexpansion_spanish.png�PNG


IHDR  D���QPLTE���""")))���������������������������BBB���������MMM333UUU___999���wwwfff��W�IDATxڅ�b�0D�s���Z�r+�O��l�:�Y�33l�?��-��6��B `{��R�V�"���F�/о��T���g^a
���<|^̀B�	p8	�8�p��0�����!\d\ak/=/%��p�8�1�v��_�=�x������wN\��� i����aг���vs� ������j-���IEND�B`�PK�Xe%�%%expansion_spanish.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '5, January 2011 Gerardo Diez<gerardo.diez.garcia@gmail.com> & desUBIKado'
__author__ = 'desUBIKado, based on an earlier version by Gerardo Diez'
__version__ = 'v1.01'
__date__ = '13, November 2011'

'''
[url]http://www.expansion.com/[/url]
'''

import time
import re
from calibre.web.feeds.recipes import BasicNewsRecipe


class expansion_spanish(BasicNewsRecipe):
    __author__ = 'Gerardo Diez & desUBIKado'
    description = 'Financial news from Spain'
    title = u'Expansion'
    publisher = u'Unidad Editorial Internet, S.L.'
    category = 'news, finances, Spain'
    oldest_article = 2
    simultaneous_downloads = 10
    max_articles_per_feed = 100
    timefmt = '[%a, %d %b, %Y]'
    encoding = 'iso-8859-15'
    language = 'es'
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True
    remove_empty_feeds = True

    keep_only_tags = dict(
        name='div', attrs={'class': ['noticia primer_elemento']})

    remove_tags = [
        dict(name='div', attrs={'class': ['compartir', 'metadata_desarrollo_noticia', 'relacionadas', 'mas_info',
                                          'publicidad publicidad_textlink', 'ampliarfoto', 'tit_relacionadas', 'interact', 'paginacion estirar', 'sumario derecha']}),  # noqa
        dict(name='ul', attrs={
             'class': ['bolos_desarrollo_noticia', 'not_logged']}),
        dict(name='span', attrs={'class': ['comentarios']}),
        dict(name='p', attrs={
             'class': ['cintillo_comentarios', 'cintillo_comentarios formulario']}),
        dict(name='div', attrs={
             'id': ['comentarios_lectores_listado', 'comentar']})
    ]
    feeds = [
        (u'Portada', u'http://estaticos.expansion.com/rss/portada.xml'),
        (u'Portada: Bolsas', u'http://estaticos.expansion.com/rss/mercados.xml'),
        (u'Divisas', u'http://estaticos.expansion.com/rss/mercadosdivisas.xml'),
        (u'Euribor', u'http://estaticos.expansion.com/rss/mercadoseuribor.xml'),
        (u'Materias Primas',
         u'http://estaticos.expansion.com/rss/mercadosmateriasprimas.xml'),
        (u'Renta Fija', u'http://estaticos.expansion.com/rss/mercadosrentafija.xml'),
        (u'Portada: Mi Dinero',
         u'http://estaticos.expansion.com/rss/midinero.xml'),
        (u'Hipotecas', u'http://estaticos.expansion.com/rss/midinerohipotecas.xml'),
        (u'Cr\xe9ditos', u'http://estaticos.expansion.com/rss/midinerocreditos.xml'),
        (u'Pensiones', u'http://estaticos.expansion.com/rss/midineropensiones.xml'),
        (u'Fondos de Inversi\xf3n',
         u'http://estaticos.expansion.com/rss/midinerofondos.xml'),
        (u'Motor', u'http://estaticos.expansion.com/rss/midineromotor.xml'),
        (u'Portada: Empresas',
         u'http://estaticos.expansion.com/rss/empresas.xml'),
        (u'Banca', u'http://estaticos.expansion.com/rss/empresasbanca.xml'),
        (u'TMT', u'http://estaticos.expansion.com/rss/empresastmt.xml'),
        (u'Energ\xeda', u'http://estaticos.expansion.com/rss/empresasenergia.xml'),
        (u'Inmobiliario y Construcci\xf3n',
         u'http://estaticos.expansion.com/rss/empresasinmobiliario.xml'),
        (u'Transporte y Turismo',
         u'http://estaticos.expansion.com/rss/empresastransporte.xml'),
        (u'Automoci\xf3n e Industria',
         u'http://estaticos.expansion.com/rss/empresasauto-industria.xml'),
        (u'Distribuci\xf3n',
         u'http://estaticos.expansion.com/rss/empresasdistribucion.xml'),
        (u'Deporte y Negocio',
         u' [url]http://estaticos.expansion.com/rss/empresasdeporte.xml[/url]'),
        (u'Mi Negocio', u'http://estaticos.expansion.com/rss/empresasminegocio.xml'),
        (u'Interiores', u'http://estaticos.expansion.com/rss/empresasinteriores.xml'),
        (u'Digitech', u'http://estaticos.expansion.com/rss/empresasdigitech.xml'),
        (u'Portada: Econom\xeda y Pol\xedtica',
         u'http://estaticos.expansion.com/rss/economiapolitica.xml'),
        (u'Pol\xedtica', u'http://estaticos.expansion.com/rss/economia.xml'),
        (u'Portada: Sociedad', u'http://estaticos.expansion.com/rss/entorno.xml'),
        (u'Portada: Opini\xf3n',
         u'http://estaticos.expansion.com/rss/opinion.xml'),
        (u'Llaves y editoriales',
         u'http://estaticos.expansion.com/rss/opinioneditorialyllaves.xml'),
        (u'Tribunas', u'http://estaticos.expansion.com/rss/opiniontribunas.xml'),
        (u'Portada: Jur\xeddico',
         u'http://estaticos.expansion.com/rss/juridico.xml'),
        (u'Entrevistas', u'http://estaticos.expansion.com/rss/juridicoentrevistas.xml'),
        (u'Opini\xf3n', u'http://estaticos.expansion.com/rss/juridicoopinion.xml'),
        (u'Sentencias', u'http://estaticos.expansion.com/rss/juridicosentencias.xml'),
        (u'Mujer', u'http://estaticos.expansion.com/rss/mujer-empresa.xml'),
        (u'Catalu\xf1a', u'http://estaticos.expansion.com/rss/catalunya.xml'),
        (u'Funci\xf3n p\xfablica',
         u'http://estaticos.expansion.com/rss/funcion-publica.xml')
    ]

    # Obtener la imagen de portada

    def get_cover_url(self):
        cover = None
        st = time.localtime()
        year = str(st.tm_year)
        month = "%.2d" % st.tm_mon
        day = "%.2d" % st.tm_mday
        cover = 'http://img5.kiosko.net/' + year + '/' + \
            month + '/' + day + '/es/expansion.750.jpg'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover)
        except:
            self.log("\nPortada no disponible")
            cover = 'http://www.aproahp.org/enlaces/images/diario_expansion.gif'
        return cover

    # Para que no salte la publicidad al recuperar la noticia, y que siempre se recupere
    # la página web, mando la variable "t" con la hora "linux" o "epoch" actual
    # haciendole creer al sitio web que justo se acaba de ver la publicidad

    def print_version(self, url):
        st = time.time()
        segundos = str(int(st))
        parametros = '.html?t=' + segundos
        return url.replace('.html', parametros)

    _processed_links = []

    def get_article_url(self, article):

        # Para obtener la url original del artículo a partir de la de
        # "feedsportal"

        link = article.get('link', None)
        if link is None:
            return article
        if link.split('/')[-1] == "story01.htm":
            link = link.split('/')[-2]
            a = ['0B', '0C', '0D', '0E', '0F', '0G', '0N', '0L0S', '0A']
            b = ['.', '/', '?', '-', '=', '&', '.com', 'www.', '0']
            for i in range(0, len(a)):
                link = link.replace(a[i], b[i])
            link = "http://" + link

        # Eliminar artículos duplicados en otros feeds

        if link not in self._processed_links:
            self._processed_links.append(link)
        else:
            link = None

        return link

    # Un poco de css para mejorar la presentación de las noticias

    extra_css = '''
                    .entradilla {font-family:Arial,Helvetica,sans-serif; font-weight:bold; font-style:italic; font-size:16px;}
                    .fecha_publicacion,.autor {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:14px;}
                '''

    # Para presentar la imagen de los videos incrustados

    preprocess_regexps = [
        (re.compile(r'var imagen', re.DOTALL | re.IGNORECASE),
         lambda match: '--></script><img src'),
        (re.compile(r'.jpg";', re.DOTALL | re.IGNORECASE), lambda match: '.jpg">'),
        (re.compile(r'var id_reproductor', re.DOTALL | re.IGNORECASE),
         lambda match: '<script language="Javascript" type="text/javascript"><!--'),
    ]
PK�X���explosm.png�PNG


IHDR  ��tRNSn��ZIDATxڽUl;�E�,Y�4�n]QFѕ������efƤ܎���i�����K��o����+����A�32��A�!�^P�7�����k��?���}{�7��3��zT��}<��7�+�h����@�9�$��B�P�j���_��.p�7>z|!�-��A���en�����we{�~�A�x�S��V���E���
�mĵ"��ݺ?�[QP�*L�Ď���Ik�:+ h8�mˤ��d^P�EC���~z<���#������}�Hqpj�we+��j,��d�K�([n.�ι�w�Ųr=�q��т�$�?l�V���=�e��q�wjPc�Z����v�[�iy.�)�U��"�qU���BZS���us&���D�ӷ𻗰�E2���V*rͰ��28�9�Y��2g���K�S�%r����j���sҤP)�.R�1�u�NS��Cc%s�7�Rv.�4F��R�Mu5n�LZ[�4e����DT䎗�)!H)zХ���;�.���v)��W9DՅ7��d�
�I|�{���V#�_ȇ�;rhU�kM��9_�L�ȵ��*�]MJ����ý4�(s����O�ŕ�s[_!`�VjT_�<����p�g7�<7ػ��wSd�ws�p_-\H��a��l�f�1\����:�޿#^��'��Y3S��հy�pM�V��}�2�u�%.�à�2�rDkh}��P@��p�8âUr�n��Fˊ�_�3�͝6A�(���J�
�~~y#�\��6	S�޷�F�䮼<��Y��~?%�O�=u���;�������Sa��B���{>�-�md����DeS�@�J��8K3�qZ�'V��1�ע��8��?
G�{�o���J�e���Өv{�/���	�ae{�@�“�~2e2��k&��1g�Ys�
^���~�NRٌ���1���MaY�U�b3�Iɻ��r�;9z��r����	�I�� ��
�R��ӜN��Si���.pY
���~�jU8��_d�2O��j)�&	"xx�:�
F<��LJ۽��*y�"���
=l�p�7�J�f���bx�)�d�z�]�}P��� n+l[�sa�]{�q���S=5'�H�L�G57��D2�ȭ\՞�ĸIՐ��I�f�X-\�&�v�7�ӃlEPn�_�N��m���DʒI�
�t8�_��~<��{9NB��x
��C)��3��+Ŕd�=1�o�܎'�T�(��g��{�ݘ��&�wM����%-� ���=E�I�PE#Up�Fsp>���E�۱İ7�q�$�y�Hlid���!�-t��ؽ��+��O�Ɋ�v��iIEND�B`�PK�XQ
��explosm.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class Explosm(BasicNewsRecipe):
    title = u'Explosm Rotated'
    __author__ = 'Andromeda Rabbit'
    description = 'Explosm'
    language = 'en'
    use_embedded_content = False
    no_stylesheets = True
    oldest_article = 24
    remove_javascript = True
    remove_empty_feeds = True
    max_articles_per_feed = 10

    feeds = [
        (u'Explosm Feed', u'http://feeds.feedburner.com/Explosm')
    ]

    keep_only_tags = [
        dict(name='img', attrs={'alt': 'Cyanide and Happiness, a daily webcomic'})]
    remove_tags = [dict(name='div'), dict(name='span'), dict(name='table'), dict(
        name='br'), dict(name='nobr'), dict(name='a'), dict(name='b')]

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}'''

    def get_cover_url(self):
        return 'http://cdn.shopify.com/s/files/1/0059/1872/products/cyanidetitle_large.jpg?1295846286'

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)

        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if re.search(r'http://www.explosm.net/comics', curarticle.url) is None:
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []

        return feeds

    def skip_ad_pages(self, soup):
        # Skip ad pages served before actual article
        skip_tag = soup.find(name='img', attrs={
                             'alt': 'Cyanide and Happiness, a daily webcomic'})
        if skip_tag is None:
            return soup
        return None
PK�X���%%express_de.png�PNG


IHDR  D����PLTE�&�������yq�qi�sl��������������WM�4)����*����������\S�)�ia����������������������\S�kc������LB�+����KB����������2'������������4(����-!����e\�-!�H>���������������������������)�������, ����/$�vn�F<����{t����/#�:0����������xp����h`�B8���������C9�1&�OE�g^���z���������������SJ����nf��������VL�wo�um�>3����}�KA����d[����������]T�@5����bZ�����WN�MC�|u�."����D9�����������G=������[��KIDATx�b.��<(�=}�ض�l3�m��o�V����J�ѿ.� �\�W�[!��B4�ߌ?oLm8�3�?���B>~�"%ᇈ��	H�+(��)P��ht$슸ސI�`2��	���
|�\ӌ�Z6�#VBѿ*'�O��w���v�.w7	��sl��
֜��|�pq���/�=x/�G��k~@
����C�0B�~d4�@c���
��v��`C09�N�w�!��{�� ���<�� �-Sy���a�u���<؀�z��)�ʁm�J�d@��0̶oub�|���jO4vz�aT��F?�hw�IEND�B`�PK�X��/���express_de.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1303841067(BasicNewsRecipe):

    title = u'Express.de'
    __author__ = 'schuster'
    oldest_article = 2
    max_articles_per_feed = 50
    no_stylesheets = True
    use_embedded_content = False
    language = 'de'
    extra_css = '''
                    h2{font-family:Arial,Helvetica,sans-serif; font-size: x-small;}
                    h1{ font-family:Arial,Helvetica,sans-serif;  font-size:x-large; font-weight:bold;}
                '''
    remove_javascript = True
    remove_tags_befor = [dict(name='div', attrs={'class': 'Datum'})]
    remove_tags_after = [dict(name='div', attrs={'class': 'MoreNews'})]

    remove_tags = [dict(id='kalaydo'),
                   dict(id='Header'),
                   dict(id='Searchline'),
                   dict(id='MainNav'),
                   dict(id='Logo'),
                   dict(id='MainLinkSpacer'),
                   dict(id='MainLinks'),
                   dict(id='ContainerPfad'),  # neu
                   dict(title='Diese Seite Bookmarken'),

                   dict(name='span'),
                   dict(name='div', attrs={'class': 'spacer_leftneu'}),
                   dict(name='div', attrs={'class': 'button kalaydologo'}),
                   dict(name='div', attrs={'class': 'button stellenneu'}),
                   dict(name='div', attrs={'class': 'button autoneu'}),
                   dict(name='div', attrs={'class': 'button immobilienneu'}),
                   dict(name='div', attrs={'class': 'button kleinanzeigen'}),
                   dict(name='div', attrs={'class': 'button tiereneu'}),
                   dict(name='div', attrs={'class': 'button ferienwohnungen'}),
                   dict(name='div', attrs={'class': 'button inserierenneu'}),
                   dict(name='div', attrs={'class': 'spacer_rightneu'}),
                   dict(name='div', attrs={'class': 'spacer_rightcorner'}),
                   dict(name='div', attrs={'class': 'HeaderMetaNav'}),
                   dict(name='div', attrs={'class': 'HeaderSearchOption'}),
                   dict(name='div', attrs={'class': 'HeaderSearch'}),
                   dict(name='div', attrs={'class': 'sbutton'}),
                   dict(name='div', attrs={'class': 'active'}),
                   dict(name='div', attrs={'class': 'MoreNews'}),  # neu
                   dict(name='div', attrs={
                        'class': 'ContentBoxSubline'})  # neu
                   ]

    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

    feeds = [(u'Top-Themen', u'http://www.express.de/home/-/2126/2126/-/view/asFeed/-/index.xml'),
             (u'Regional - Köln',
              u'http://www.express.de/regional/koeln/-/2856/2856/-/view/asFeed/-/index.xml'),
             (u'Regional - Bonn',
              u'http://www.express.de/regional/bonn/-/2860/2860/-/view/asFeed/-/index.xml'),
             (u'Regional - Düsseldorf',
              u'http://www.express.de/regional/duesseldorf/-/2858/2858/-/view/asFeed/-/index.xml'),
             (u'Regional - Region',
              u'http://www.express.de/regional/-/2178/2178/-/view/asFeed/-/index.xml'),
             (u'Sport-News', u'http://www.express.de/sport/-/2176/2176/-/view/asFeed/-/index.xml'),
             (u'Fussball-News', u'http://www.express.de/sport/fussball/-/3186/3186/-/view/asFeed/-/index.xml'),
             (u'1.FC Köln News', u'http://www.express.de/sport/fussball/fc-koeln/-/3192/3192/-/view/asFeed/-/index.xml'),
             (u'Alemannia Aachen News',
              u'http://www.express.de/sport/fussball/alemannia/-/3290/3290/-/view/asFeed/-/index.xml'),
             (u'Borussia M~Gladbach',
              u'http://www.express.de/sport/fussball/gladbach/-/3286/3286/-/view/asFeed/-/index.xml'),
             (u'Fortuna D~Dorf', u'http://www.express.de/sport/fussball/fortuna/-/3292/3292/-/view/asFeed/-/index.xml'),
             (u'Basketball News',
              u'http://www.express.de/sport/basketball/-/3190/3190/-/view/asFeed/-/index.xml'),
             (u'Big Brother', u'http://www.express.de/news/promi-show/big-brother/-/2402/2402/-/view/asFeed/-/index.xml'),
             ]
PK�X��;��f1_ultra.png�PNG


IHDR(-S0PLTEt��..��NK�%�)!斓���jc���RJ��{��߸ˢGtRNS@��fpIDATx�E�U�E1C����>���$Ȕ ��$�[�l=����X�X�Vp#f���c2���0́Dl������#�w���>�r��.��P�
�x8��� �R2?�o�^|v]IEND�B`�PK�X��k[��f1_ultra.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class f1ultra(BasicNewsRecipe):
    title = u'Formuła 1 - F1 ultra'
    __license__ = 'GPL v3'
    __author__ = 'MrStefan <mrstefaan@gmail.com>, Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'
    description = u'Formuła 1, Robert Kubica, F3, GP2 oraz inne serie wyścigowe.'
    masthead_url = 'http://www.f1ultra.pl/templates/f1ultra/images/logo.gif'
    remove_empty_feeds = True
    oldest_article = 1
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True

    keep_only_tags = [(dict(name='div', attrs={'id': 'main'}))]
    remove_tags_after = [
        dict(attrs={'style': 'margin-top:5px;margin-bottom:5px;display: inline;'})]
    remove_tags = [
        (dict(attrs={'class': ['buttonheading', 'avPlayerContainer', 'createdate']}))]
    remove_tags.append(dict(attrs={'title': ['PDF', 'Drukuj', 'Email']}))
    remove_tags.append(dict(name='form', attrs={'method': 'post'}))
    remove_tags.append(dict(name='hr', attrs={'size': '2'}))

    preprocess_regexps = [(re.compile(r'align="left"'), lambda match: ''),
                          (re.compile(r'align="right"'), lambda match: ''),
                          (re.compile(r'width=\"*\"'), lambda match: ''),
                          (re.compile(r'\<table .*?\>'), lambda match: '')]

    extra_css = '''.contentheading { font-size: 1.4em; font-weight: bold; }
                   img { display: block; clear: both;}
                '''
    remove_attributes = ['width', 'height', 'position', 'float',
                         'padding-left', 'padding-right', 'padding', 'text-align']

    feeds = [
        (u'F1 Ultra', u'http://www.f1ultra.pl/index.php?option=com_rd_rss&id=1&Itemid=245')]
PK�X�s��f_secure.png�PNG


IHDR  szz��IDATx����tI�s�^cm۶m۶m۶mk۶mۮ��e�=���E�i�R�2��F(:��1�7��}����&�n��X*9Q���]�uXG�O�荵��1�KKq�p��x���o�=���O�N).��fm&�2�0˱�����Q�8OI�-�J�i��H�p'J�&^V'�Pz%�S���
�k�ty�P��@�����a��O�
�
��w������k����!|��'~Ï�sru�F̩#�nh��2����~GiI���ql�;�aU^S8Oˎ�Y�L�UM-/(ǹ‹��M=|�b�!�CQ��D!:��Q�Vkʾ:���ؓ�| ��?�[� ǎ�x�2��"�2J��"�c6�C}:���i��;씪��p�����E��^�"n�Qj1�N�q)>R���Y�t�C�dv6X�ՙa�V��4��b|<�ҥI�֨�i��7D��8I���l�V��C��Mw���J7�`+Ю�q����4�ă�pq/������V���3����!�����yUe�4�qGi�[��}κ����\���W�VC=
Q�x_��>.q��bB���4x}<�<�u�L���\�Y���:.�mn�8�����6ݨ��R�	�5�p(��R��s�B��
ݜ?k���]�z҅�tӨh��_3׸��V�<����0�`�\��}$s�A|�υ�P

�i�W�,+)�~pIEND�B`�PK�X^�If_secure.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1301860159(BasicNewsRecipe):
    title = u'F-Secure Weblog'
    language = 'en'
    __author__ = 'louhike'
    description = u'All the news from the weblog of F-Secure'
    publisher = u'F-Secure'
    timefmt = ' [%a, %d %b, %Y]'
    encoding = 'ISO-8859-1'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    keep_only_tags = [dict(name='div', attrs={'class': 'modSectionTd2'})]
    remove_tags = [dict(name='hr')]

    feeds = [(u'Weblog', u'http://www.f-secure.com/weblog/weblog.rss')]

    def get_cover_url(self):
        return 'http://www.f-secure.com/weblog/archives/images/company_logo.png'
PK�XY'�mhh
factcheck.png�PNG


IHDR�a/IDATxڄ��]_����u�ƪb��PFeX��z�i�nc'E�F�j[�Ξ[�$_�I��7�ճ
���~*��x/�	X?�c���	�k|-x+��}���L��������i�����E�Z{���ALJ���b�E>�$2𑫖��w(	DA���<�j	��T��d�������\t��G�K\q{v	�Z'f�|���p�d�?��y�)�K�XH��G���ԉ
&yL�(i�$��W.X��TD���nL,��f�d�ϝ�Fk���Q>	�c	?��*X5~�ÿ�p�d>�#2�L��-��P�W.&а�:�em	[��G��2�	q�����e�@� ��
��h�����(���=���u]U��F� ~�q���ږ� [0L!�vTd���
6C$j�VU�?�Q5GlGLp�*�.ɪ:A
����"�p�=�8�����S��%��1�]����)��*(���U��'�S�xb[Z$C�܀:�X�=�X?%��>G��_�[�Wx��w�6�|�J��IEND�B`�PK�XC��jSSfactcheck.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class FactCheckOrg(BasicNewsRecipe):
    title = u'Factcheck'
    __author__ = u'Michael Heinz'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    recursion = 0

    publication_type = 'magazine'
    masthead_url = 'http://factcheck.org/wp-content/themes/Streamline/images/headernew.jpg'
    cover_url = 'http://factcheck.org/wp-content/themes/Streamline/images/headernew.jpg'

    remove_tags = [dict({'id': ['footer', 'footerabout', 'sidebar']})]

    feeds = [(u'Factcheck', u'feed://www.factcheck.org/feed/')]
PK�X���4��fairbanks_daily.png�PNG


IHDR�a�IDATx�]��d	��ٶ/8��!�"�xc�m�6ƶ�۶m�V%�$�L��W�6���*�����?���މH�z߮zW�+V�����ݝ�_X�ͨd~a����\�]���Ї����/~�� ����}OL�
����gh�X���E��R�,*��@�N�s�� SV��#��a,��J������;��k���F���QȮ���rP��E{�.��3s��n[n
��<�D��]�Jxr)�����DXR)�]�J��j[��;9={��k���:D��V��7�|�4t�X��༿��i�S�ږ�|��7|,����r͇�5��VNz;(���nd:{'p3,���J;0F'�~����w�G)�16��;2X�և�9�{Q�\J"���k!��}������n���?���{�MQ��f��y��*N�'� :��1�$7p?:Ch��ujTY���w�wq�C��f�S3�����gfΊ��-_��2G^Z9%�՝ t
�bϯ�ql�}�����9���A��4i?QJL�e��@hR	Fnu�&�꓅)��C/�<�Q�e��Kn���.ĝ���J�yXr1
��i�@�ǂUn��Q�*�*Rj[�8�a�E-R��,r�Z����z{
���/m\N&"��#�F	4�fWu�H��\�V�%� ��E�"��ڴ��G��%�-�,��%�H���(�8�IEND�B`�PK�X��VVfairbanks_daily.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class FairbanksDailyNewsminer(BasicNewsRecipe):
    title = u'Fairbanks Daily News-miner'
    __author__ = 'Roger'
    oldest_article = 7
    max_articles_per_feed = 100
    description = 'The voice of interior Alaska since 1903'
    publisher = 'http://www.newsminer.com/'
    category = 'news, Alaska, Fairbanks'
    language = 'en'
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en'
    encoding = 'utf8'
    conversion_options = {'linearize_tables': True}
    auto_cleanup = True

    feeds = [
        (u'Alaska News',
         u'http://www.newsminer.com/search/?f=rss&t=article&c=news/alaska_news&l=50&s=start_time&sd=desc'),
        (u'Local News',
         u'http://www.newsminer.com/search/?f=rss&t=article&c=news/local_news&l=50&s=start_time&sd=desc'),
        (u'Business',
         u'http://www.newsminer.com/search/?f=rss&t=article&c=business&l=50&s=start_time&sd=desc'),
        (u'Politics',
         u'http://www.newsminer.com/search/?f=rss&t=article&c=news/politics&l=50&s=start_time&sd=desc'),
        (u'Sports',
         u'http://www.newsminer.com/search/?f=rss&t=article&c=sports&l=50&s=start_time&sd=desc'),
        (u'Opinion',
         u'http://www.newsminer.com/search/?f=rss&t=article&c=opinion&l=50&s=start_time&sd=desc'),
    ]
PK�X<��qqfan_graphs.png�PNG


IHDR(-S�PLTE���O�&P�&I� GI� I� K� O�%P�&H�]�7����Ԑ���G�H�I�J�J�
L�!M�"M�$N�$!O�(O�&O�!P�%%S-cQ�&T�(?�A�A��֓�����������������F������IDATx�\ȃQЙϳb�v���^��������m���|���Jed��1��!���V��8|ðm���nt�`���?�p�5��I�}��˄�RN��8"�E��2aTs�=���
�
h�{X2IEND�B`�PK�XJޔ�fan_graphs.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2011 zotzot'
__docformat__ = 'PEP8'
'''
www.fangraphs.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class FanGraphs(BasicNewsRecipe):
    title = u'FanGraphs'
    oldest_article = 21
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'Fangraphs'
    category = 'Baseball'
    language = 'en'
    publication_type = 'Blog'
    auto_cleanup = True

    description = 'Baseball statistical analysis, graphs, and projections.'
    __author__ = 'David Appelman'
    cover_url = 'http://bit.ly/g0BTdQ'

    feeds = [
        (u'Fangraphs', u'http://feeds.feedburner.com/FanGraphs?format=xml'),
        (u'Rotographs', u'http://feeds.feedburner.com/RotoGraphs?format=xml'),
        (u'NotGraphs', u'http://feeds.feedburner.com/NotGraphs?format=xml')]

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
'''
PK�Xq�y��fastcompany.png�PNG


IHDR00W���IDATx��Zu\i�$��{��{����u���.D��#�C�;!XH ����3S�Wϳ��8��?�7�CUwuuπOww�?�t)��Rq�u@���P:�F]׫5�4
?�?�o��	�yM�C�zw74[��b�.��4��-p�K,� 	�G�V���>���N�	��h��r�]�筆��8v��#�I�=S�D��E���FF$_�$����<*����n�	��Ί(�}�ΰ'о�h]{3����q���]�����N��n�NT�å)nEפ�J�If�[��
S5ʀ��;:a?��=Cо�^���1Z�܈��עe�5h]}�$Ѳ�j�CsF(*��0x%��6�:�:/��c�B\�!%��ƪ��P4�+�C��Bi.�-{1:#�Fk�h^����ye�\	I ���﯅i�G��w%R�.Ʈ�_E�o��쏑�jNE�����8W�� H(�:��E{��B��@�WlPZ
a>�-ژ�&f��/��p�V����>Be�|�5�o߅�7~��w���}79��R�>����	".U��X����i��7y��n�
OM2��A�3�WH��K|DP:7���	������K�@e�|�;�"��=�w��[D�=�|=�H��9�,��ɻ�0vxe��p�?L@��.�oJ����̼����$L?�5k>l��a͜/+��lfʈ����8<o"=��3�1	��*<Š܋�w�F�������(�ހ��2�
	�G�$�����)��n]��Y	���t�	HD�Ɵ�+�
؋6AiȒ}��Ci+�ȅ�4H�z�����C3�E8��2�QC~Ce�܃~�6��+��El]���RJ�)I���"@���r�m�%e�p�B��*٠�݃�!P�c��U{��3�V�JS�0@�4��)�ބ�Gb��Pf���C�l��%p�����D���dĎz��Dz�K��h'�!�5w�J��ץCt��ؔ�x��h^�N��Q�r��xGأZ���2&���L,	�{-�
�����(��d��<%1q��d�%��٤d���=_�F�lvVc���!g�l�W�����j���*��@]��z
�c~l�AZ��(�+Y��P��e�#)����x-�vſ	W՞��+Kp2t%��}��5�Py0���6���(���z4��8j��y�ո�ո�=��؍�w4CL~
���H@ne�����F�\�&r��h�|��	|�tff�}�O6l� Y�O�?`k˝$���*n��ʶ�(�݄���ߺP7GW4��M�{�~�U��=sL���!����`�,j�]��(3-�����ټ$��(���P��е��:+��
.C�IVİw8�
��&����Մ��d�ϰ�W��S�B��J���X��m��� �M/���|���e`��|�{>x��*��g�y�i�9P�$�Q��!����j�þ�к᧲<Ǜ}��	�>�އ�K����F+<���d:R��
Mǹ
�o�%c�˿��o�B��p��p1%Q�C$�7��_���(O�
{[���Y*�? �� 3[��=?A��y�Z	���C�V��B�Bl������E�����̹��ã��`� ��X��C��
�LxT���D��}Sc5H�Ȍ��gA��ZZ��4�!y��ކ�ܼ����$�Q�fS�����H"\�8�>��!eD�s�Mޗя�AY�}O]
��ռ&s��Et��	�w��Lx�M�I=���	�@��R������A)�3��p�:$	�G[+	����U�Mi)��F�д��t�	�]��F�_�
B��>ִ0$����v �qpsr{l�y���{*p��Ҙ
�����"�r��b�>,�nl�Aé,�'<��:b�ߏ����~�X��]э��l^�	�w���\
3��	�"�F몫��ke�RR��a-��
��8�p_L��'H�N�i^�]�gCĶY�u��>E�܋05f?��9�_@�f6�&?8�8�乑l��7n#�q)-���E��
f���nL�#���\
K�u��aYw��D�V �u���5�'���i��a��e3��L��サ�,�`��sQc���d,@��r����Y�o�~����87�=&�E�g�r�M�.*v�@7�M�D�G��
+��l鄹��ǧ�e�0��)��7%���P��6����3�:v����'zT}��_Z�܊6ĥ�Ë���x�m���%c�0	%�	��rN\<�WfZ�j�ò_$�w��=�+(
��XU���6��_@�Bd�g!=7i��Hˊ@Jf8
P{���9�͍2��C�ͥ����⍽��[K �#�F��֊B��,FyM2@I�Z�%���K9b����@�Os��sKTUN��|�
m<�_���_�Z����?�+_Gb��x�:�v;�/�i���S��<2���?�A��:,�:��],�@UdE�uU7�'�з�#�� ��8�2������_�P])~�E����f1`Ξ�xe�?��ߍ��y�w�O�� ,?]gsz�b�B+��h��vF"h/�#����G��ti��t�鴣��$Nąc��H���m�pt�:F���G5��ilc�a&�+}�$���xg�$�D�����ʲ��u�2�$���ϗcgA
v�"��.�s)s9Ay@d�wX�_�أv���x��V���-l�r�8��@|I'V�5aMF3d�71�ֈ��v�Z=P5��e�	�X�&���-s0(p�Ǻ�2�2��l�DG|H�A��m|�� :�?#�WJ=�UQ,RT��sKz+�?hw�_��
4N0���ݑ��2��ԺR\59�L��S{���M��3�N���E��&#�/�K:˸�����v�=x�4�8_�.G��"f؁���&l%^e��Z5o��7�a0��Ɲ���%~��kQ
��Y���8��6��b��:,9р�m8��;Q����2�|��o��36>cDd���֖�t�̽�����������(_��i�i6f�܊�5�ha���mĻ$(��0#6͒R{e��G���\x4����e�|~fq(�f���Ff��3��/���E�x:��ע�Ɇ�z+&$V���l��˂�x��'f�-��`�����ަj�Y�63�s��D\;�1	#X�yO����[!zDV�d�Rj��gAK�����j)���B���'��x	�M�bv���/]��7����|�x�э��.ܳ��'��f�L\E)
���ݣɛ��-��n>��
�QY�/C�Bf�� V%�gp�k예Ul쉌	�pV@��ڊ��<d	�:.ڢӭ~%.����<XB)�w��=Y���1�->��+r�^���RB�ϹsIf���
��ʄ������z�9�!��e�b(�b.d�/C+��H,Fm�C�++%��>��<ͽP]\mw�u��
Y����e�%��y2���Ɍ��
�(��T㖙y^$��7�U`��.9yUMo����,5F�@��9���R��T�0ӳ�x*����qXZ��e�x�B$�d��j�p:��э�9-�o�I��'(�����៍+���p���6|�p7��Ȕ��F��bM!������r��b;AlMIć�JA�-Jf��m����K��ٽ�
�[R� x����Dr:�[��
:C0it�Tf=�)�O�<���ڝȫ��Y˥}
��dž���Bl�k��$��{��8��\����<���>��,�>ooݨ
b�8OU%2��M�v��PY� GɕrJwy	�^؆G�q�hdJI���~im)v䷢��ADa;~:�}'	�ys�Q�y�q���-�I�'���+
i���#����N�Y����(��6������@I	�h�!�Sf;�\=CJ�@�C�:��;*�+Z�mKN���gdv
�.�ڂ�b.HI�Lȑǟ/,BBY'�NULݽ�ӿ��K<��h� �k��y^/-SHk\�Z�#ȅ��1=a�^B��x���#l��8v��R�F%��]c�Yl�xp�́�Kf�\0���n�)8v΄����yV�l\!��-���Pkp�x�(�O��g��T-\��"�8���)#�>/3���5�HNc��K��W#(3�ˌ������_ğǦ�f���2"錁���

��M�d_Hiq}Y�LB�uIJ�����"ЋD�7�.j�Xf�{�t�w�m���	=�MH�!��̄��{ �T�z�X6�,\?#��-����x;��_S�[��M�����7�#��SꞱYn����Q��X�x[U�q6!(=	c�2�8M8���`5��x���Ђ���q�r�r�2�����WNΖ.s
C��KbR6�}�rex$�b�;�iWŮ��̿
���Y€��.���	G��7?���ʬs.�i�Ҳo9��1>r��=���q�di��k�1��4�k?	���À ��ha��>T�^�����"/�0�jT�7�pi.�s��p�X�����ؑX����
���3-���D9B2��j��$FFUaWy'�
dӪп�Z�?E�/�,�AD8�E�H������aˉ�H,:�M�e�� `?��].j2�}(�'��f4����j	�P�����C�x@�V�W��|�Უ�bp�w���̺��H<݌w�Ϣ/�����n�-�D���90��<�P-v�u�MTT�1�O�+�j����V�GR����]�GY�jn~4;w.-ƃ�rxM?X�#�9z����x�����G(\��UT<��B>$s�6ٰ:�I�,8VGgiGQ�M�vz
�|�6�� �{v�;1��m�nuknNQ�K�R�c�]!O]��������U�B�?Ĵ~@�3�z"���<�+�Φ��;~��o`�@]�IEND�B`�PK�X����fastcompany.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.fastcompany.com
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class FastCompany(BasicNewsRecipe):
    title = 'Fast Company'
    __author__ = 'Darko Miletic'
    description = 'Where ideas and people meet'
    publisher = 'fastcompany.com'
    category = 'news, technology, gadgets, games'
    oldest_article = 15
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = True
    simultaneous_downloads = 1
    encoding = 'utf-8'
    lang = 'en'
    language = 'en'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    remove_tags = [dict(name=['embed', 'object']), dict(
        name='div', attrs={'class': 'feedflare'})]

    feeds = [(u'All News', u'http://feeds.feedburner.com/fastcompany/headlines')]

    def get_article_url(self, article):
        return article.get('guid',  None)

    def preprocess_html(self, soup):
        soup.html['xml:lang'] = self.lang
        soup.html['lang'] = self.lang
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        for item in soup.findAll('a'):
            sp = item['href'].find('http://feedads.g.doubleclick.net/')
            if sp != -1:
                item.extract()
        return self.adeify_images(soup)
PK�Xh�ѣ��favrskovavisen_dk.png�PNG


IHDR���R0PLTE����0��3r�@��p��qZk~Uc��ן�����86���������"a��qIDATc``�w
H�P`�[��xJ�5�q��ݛs/q-`�z����ao�y2�N�K�̻w\�e�ɶ{w�T~ �}�� �/T
�ج��n Ȋ�pKa��?0Y7xc~IEND�B`�PK�X�@���favrskovavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Favrskov Avisen
'''


class FavrskovAvisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Favrskov Avisen'
    description = 'Lokale og regionale nyheder'
    category = 'newspaper, news, localnews, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Nyheder', 'http://dinby.dk/favrskov-avisen/rss'),
    ]

PK�X
��a!!favrskovlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X�va(??favrskovlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Favrskovposten
'''


class FavrskovLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Favrskovposten'
    description = 'Lokale og regionale nyheder, sport og kultur fra Favrskov og omegn på favrskov.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Favrskovposten', 'http://favrskov.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Favrskovposten', 'http://favrskov.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Favrskovposten', 'http://favrskov.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Favrskovposten', 'http://favrskov.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Favrskovposten', 'http://favrskov.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Favrskovposten', 'http://favrskov.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X�>���
faznet.png�PNG


IHDR D����IDATxڵ��+K�;�z�k۶mk^�2�6�;k�ڶmo�իLg'Z<�'��TW�W�	*$t��S>?������B�f�8TX��S����Ys�J�#���M�4���ҽ�Z3�…g$(/� 4f�����͗"a����3��G�^ 
��ZՙM �x��@���o��p�T����ء�����	��m��.a��+c Y���;I@�oŸ�[��
��7l�਎��D�ܫ�:�/߿��Т|40�#Sk�l�^g0{��Oz�P&C�..���^�J.SW�:�V�0U �F�f��W:�'�C���2UYL��3c�l2$*=�^ݾ5�F3�w��ȎW@��KkV��E��(;wZE�zC*u��}��=�\n�2��
��L�%�V߬�"�F�z=z~��8�&�<���ݱL�~� �(&�:X���Ъ�Ҟ=7t�&=�.,=����-�B?|�~��s''�I�Ze�o���O����2�P�W�.k4]1���3���g`���/ <t��44w���ۃ��zx�B*t����E�Q�m��d0|jԘ��<�bBAȃ�6C5"
�"���!�#���kmA~�H�)��pa��7mL��^�)zC.�z�E,�
�S���6��i��|��PXD���~|��S��,�k�4����Y���9|63�=^�Ǐޒ�ؘk�7����t�꓂ȷ�ԉ�L�4
ƞ�x���+�>�(��9&��Y>���c�p��c|xx\�`���Dht��+a.بVij՜ΰ4o��=���>��3�����g����o�4=""e��x���86�jxx��
�W���IAB���t��w�DF�DG�F�h��NKN��	��Wf@^^�L&��L2�ب��d&�\�T©U(r[��N�y��x��	��O�ӗ/[���!6�ӼY�o߾V�^���X	Vw���d2���]��p�-pB�jת���70�_�[jԨ���gOOO�ݻv%�ǡR�w��f�X�qтy`ܸq~�^��D�8f��+�/^�h��y�=|���…�ҳG�`���,Y>� "��Šdge�*(0}<�;@'_�|���@��aRit���'��<�B+ط;�W��H$�ysf�y�E"6�f
ؽk;	x]@"V,/!���ݫDq��[���U6�f�jӦ"����M����l�S*��bšX,�#[�|�R��dп
���b�/��n��R�0~�ر����=|h�����ͅ����R�g��A�^�'�9|��9�WQ�~��z�3�l�b;�@{U�RY�Q�x<+�ˡR)͚6��m��QÆ�M��ڵk}��B��T*F�7Dfu�Z-޲o�n������۷o��O���ڞ�IEND�B`�PK�X]x;ˣ�
faznet.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
__license__   = 'GPL v3'
__copyright__ = '2008-2011, Kovid Goyal <kovid at kovidgoyal.net>, Darko Miletic <darko at gmail.com>'


class FazNet(BasicNewsRecipe):
    # Version 9.1
    # Update 2022-05-29
    # Armin Geller
    # new page layout

    title                 = 'FAZ.NET'
    __author__            = 'Kovid Goyal, Darko Miletic, Armin Geller'
    description           = 'Frankfurter Allgemeine Zeitung'
    publisher             = 'Frankfurter Allgemeine Zeitung GmbH'
    category              = 'news, politics, Germany'

    encoding              = 'utf-8'
    language              = 'de'

    max_articles_per_feed = 30
    no_stylesheets        = True
    remove_javascript     = True

    extra_css      =  '''
                      .atc-headlineemphasis, h1, h2 {font-size:1.6em; text-align:left}
                      .atc-HeadlineEmphasisText {font-size:0.6em; text-align:left; display:block; text-transform:uppercase;}
                      .atc-IntroText {font-size:1em; font-style:italic; font-weight:bold;margin-bottom:1em}
                      h3 {font-size:1.3em;text-align:left}
                      h4, h5, h6 {font-size:1em;text-align:left}
                      .textbox-wide {font-size:1.3em; font-style:italic}
                      .atc-ImageDescriptionText, .atc-ImageDescriptionCopyright {font-size: 0.75em; font-style:italic; font-weight:normal}
                      .atc-MetaItem {
                        font-size:0.6em; font-weight:normal; margin-bottom:0.75em; text-align:left;
                        list-style-type:none; text-transform:uppercase; display:inline-block}
                      .aut-Teaser_Avatar {font-size:0.6em; font-weight:bold; margin-bottom:0.75em; text-align:left}
                      .aut-Teaser_Name {font-size:0.6em; font-weight:bold; margin-bottom:0.75em; float:left; text-align:left}
                      .aut-Teaser_Description {font-size:0.6em; font-weight: normal; margin-bottom:0.75em; text-align:left; display:block}
                      .atc-Footer{font-size:0.6em; font-weight: normal; margin-bottom:0.75em; display:block}
                      '''

    keep_only_tags = [dict(name='article', attrs={'class':'atc'}),
                      dict(name='div', attrs={'id':'FAZContent'})
                     ]

    remove_tags_after = [dict(name='article', attrs={'class':'atc'})]

    remove_tags = [
                   dict(name='div', attrs={'class':[
                       'atc-ContainerSocialMedia',
                       'atc-ContainerFunctions_Interaction ',
                       'ctn-PlaceholderContent ctn-PlaceholderContent-is-in-article-medium',
                       'ctn-PlaceholderContent ctn-PlaceholderContent-is-in-article-medium ctn-PlaceholderContent-has-centered-content',
                       'ctn-PlaceholderBox ctn-PlaceholderBox-is-in-article-text-right',
                       'ctn-PlaceholderContent ctn-PlaceholderContent-is-in-article-text-left ctn-PlaceholderContent-is-in-article-small',
                       'aut-Follow aut-Follow-is-small-teaser',
                       'aut-Follow aut-Follow-is-teaser',
                       'js-ctn-PaywallTeasers ctn-PaywallTeasers',
                       'ctn-PaywallInfo_TeaserImageContainer',
                       'ctn-PaywallInfo_OfferContainer'
                   ]}),
                   dict(name='aside', attrs={'class':['atc-ContainerMore',
                                                     'atc-ContainerMoreOneTeaser'
                                                    ]}),
                   dict(name='span', attrs={'class':['data-button',
                                                     'o-VisuallyHidden'
                                                    ]}),
                   dict(name='a', attrs={'class':'btn-Base_Link'})
                  ]

    feeds = [
             ('FAZ.NET Aktuell', 'http://www.faz.net/aktuell/?rssview=1'),
             ('Politik', 'http://www.faz.net/aktuell/politik/?rssview=1'),
             ('Wirtschaft', 'http://www.faz.net/aktuell/wirtschaft/?rssview=1'),
             ('Feuilleton', 'http://www.faz.net/aktuell/feuilleton/?rssview=1'),
             ('Sport', 'http://www.faz.net/aktuell/sport/?rssview=1'),
             ('Lebensstil', 'http://www.faz.net/aktuell/lebensstil/?rssview=1'),
             ('Gesellschaft', 'http://www.faz.net/aktuell/gesellschaft/?rssview=1'),
             ('Finanzen', 'http://www.faz.net/aktuell/finanzen/?rssview=1'),
             ('Technik & Motor', 'http://www.faz.net/aktuell/technik-motor/?rssview=1'),
             ('Wissen', 'http://www.faz.net/aktuell/wissen/?rssview=1'),
             ('Reise', 'http://www.faz.net/aktuell/reise/?rssview=1'),
             ('Beruf & Chance', 'http://www.faz.net/aktuell/beruf-chance/?rssview=1'),
             ('Rhein-Main', 'http://www.faz.net/aktuell/rhein-main/?rssview=1')
            ]

    # For multipages:

    INDEX = ''

    def append_page(self, soup, appendtag, position):
        pager = soup.find('li',attrs={'class':'nvg-Paginator_Item nvg-Paginator_Item-to-next-page'})
        if pager:
            nexturl = self.INDEX + pager.a['href']
            soup2 = self.index_to_soup(nexturl)
            texttag = soup2.find('article', attrs={'class':'atc'})
            for cls in (
                    'atc-Header',
                    'atc-ContainerMore',
                    'atc-ContainerFunctions_Interaction',
                    'aut-Follow aut-Follow-is-small-teaser',
                    'aut-Follow aut-Follow-is-teaser'
                    ):
                div = texttag.find(attrs={'class':cls})
                if div is not None:
                    div.extract()
            newpos = len(texttag.contents)
            self.append_page(soup2,texttag,newpos)
            texttag.extract()
            pager.extract()
            appendtag.insert(position,texttag)

    # Find images

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body, 3)
        for img in soup.findAll('img', attrs={'data-retina-src':True}):
            img['src'] = img['data-retina-src']
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        return self.adeify_images(soup)

    # Some last cleanup

    def postprocess_html(self, soup, first_fetch):
        for div in soup.findAll('div',attrs={'class':['atc-ContainerFunctions js-som-Abbinder',
                                                      'ctn-PlaceholderContent ctn-PlaceholderContent-is-in-article-medium'
                                                     ]}):
            div.extract()
        return soup
PK�X�����
fc_knudde.png�PNG


IHDR00�`n�IIDATx^UX	x�ٽw�ߒ�,$ �@B-Z�%��*�V�Z�.�B���
U���ղغ�

X��R��F6� d!d]�}����_���}���̽�=�y�{������s�%�0�)�����}��W��8��O�:��̵�֦և~��y?Y�tiWG�$I�S��
֮]���ׯ��l2�x�֭�>޲�
�ȉ亮������t�T���ï����񉦄<Ǖ��uq�'bb��\*��XEӴK/���+V�x��0�fh�M(t٣��ފ'WDrN*v㻾�p�n��n`���޷{통�]wݰ����}WS���MG�Uue�̙3f�w]�2�'Q�	��X�y�UŲ,��x< �9�=�P_4d��q�u�~����	!��K*o���?���7�Ӛ�_y�=w/J�ӊ�x�w˭��������eO=>kڬ�ϯnkk߲�CM3�̙S\4X��d2��j&cɒ"s�w��
0����0���
��ӦcJ23]��ӭ�9�Ǎ��r������;ۿ���=�*/_�paS[�6Jpߢ{9%��|���E�u�u+V.�deђ{�[�׬y��ٗ]vYe�?�63^2�D���A I��愣��"����¨�������Rp�EB�&���l<����{o��;�|��--g����{޽���y�>�2tİ�n^��7_ق�u/g�}�/n�d�|���Y4�)�d&�A���B�P*���m�6����x���C$�NH��?V�p�/�W����Ʈd/Ҭ0����L[�O|�J������M�PQu�*'��G���5�j(/Ww������U�a�K-�����jj2�L��T*�����_q��i�i*L�8�
��m���V|�3��eӶ������S����jO�ʒ�����T۱�F�qTCHe�L��R����3����<��j��^<oN�_|��C���9z|�yÆ
+*)��b�����>�G�Q�ɄRUUm���z�N�ڮ+��O�P�\0e�yc.�3k��ݛ6�����
���(��������"+
�
�J(�T
��/>M��3���W���;n��UW\L$����cFtE���/B;0�?<"��
m!No�����3�j*����]]]}�nT�m�X��&d��0`�!�)!�Q\R��N�:�ZA��G����!���[=vT�k:������ayP��f��	�����1�ws�s?���o���Kz	�uI� l/p����!��m"
�ȗ�!2�(�p�U��֭���Y�����N���J���s�V�{cĥ#�1�&������Հ+m�u����B}����SM��U�?��!�51���k��ڈ��e���z���\��ټys"��ر墋.ڵkד˟
2l��ZI[hm�QmS�s|Hv�s����j(ݽ]5���ݝm]��jz��ΜmN�M����%��}��!C����#��Ç����y�C�)	�?f̘sG�������Z�d�m���|�˯w��n��f�
X�$�d�1�S��h�G�к�Հ
l���m��k��M�	���A�C5U\�Jֿ�w����S5�8���WUS@�]�u¥������N��	���7���e㝌RB�b�
�&�7Y	�Ha:���5W��7yH���MkϾ��]���n2�t8�d���߃y�l��E2��%�x,�!�`I2�23��a�CzΡ�׾�.�2���[���H6 ���}0Ol���z`�)�-P�	=R��o��S����&�b=��֏���V��!a(�����t�7���l۶,�����#�1����y�S�ǘ��ԁ��䖱��m�2�D���F� +���/?�.��Wֽ�Jo��*++�͛w��� W��sߦLF4H�D��e�&���-����[7;d�TVU��Pe��@$�
!R�7
 �,��`M �@��aQ��Hվ��|���o�TK
������I�	��P�6���r�$�.:�a�-IV(�dU��K#����<�©S�'b)��ќ��<�'�?�� *	� �<;p�
|`�X%���޽�A�CG���j��#����I��]/ɴ�$ԊQ��휜Ē6��uf8�(,�5¡�),B|뮻o�[�����Wܽ�zw���}݆7^^��ї7��p[�(TW�p��0dE�����w~������Z��hv�D�L=]c�PȶP�ԋǨ�I B!���1M&�PU��YS?ٺ�pePa��n�馞��!C�M?oܸr]���7oڶ��G�-{BpU������#F����e'N��o��+W����G†�D(��&����,���:�h�L�R���BƦM���{o���
6Pɛq�??����\-2�EK����Ϯ^%M�K�\������v�*hMkKu��\IF�f05M	sl��Ye�G4)�<�>�1�d�`���b1�����E�t��o�v�-7�t��LW҉.����G��'��57\��ן���}?�(C��X��UN~d��-S4i�ԊL��L��� �
�@��[����M-M-]��x)���Uq�����P�Iϯ~~Ҥ�y�y۷o��kg̘n��L�ú/x8Hk�t8`�$=�˨[��2�rEͣ���pÉ�D�wN�n���>e�U��*��@���?g�pӴ��ꪪƓ���b(�iРA����v�+/�'�@��KcϙB	�BYL&K���c}x�î@)�-��ߵ@7��\�v9�����Θ5ͱcT
��d��{ �=��@KIVߨ��MēgϞ���c��:V_�*�����P6{�%�
w���A!$�{�82	�Tr<b葦��Y���@Ut(�s٩ƚ]��x٪G2��	��)	18�RLr`����F-i���-� ���nTIQ� ׶�A�T��w<n��*�=d��s�'������Q`�_֯Y��
��A`Ij�@�Q5T49jY)���ڎ�k�����d
��l��3�4�%<���4!�/K�sLHT�i���+3����z��ȯ�l[7tN�ܼ�g�ޡ���_�I��:�VP�nȲ�Xx��YS�8�HA6��B��#��������\EհЏr��M6�1�v���3�2E�.K�Ʒ���)d,|������^{sÒ�e�XV@��)�s=(�m;��R�F���=��y�O���w���[7�������&���%�+�
9�LV�D��EQ}�&w�$n&x��-�g{~y��2�m���yo��~�iѼ��ĩ�j�
�
�G�C(���&�33��ښΎ�����C��'TV^�֖��o����ޱc�_�0sƅ��eecK�s��d0Mg:
L��;q����T�w
^0��kn̤-��%%��Th�h�k�r��Kh�cmM5��iʒ��okn����=^��k��'��i�t���ο1���/;���̞�����;O7�i<�r��)��LI(�̸'S�	�{n��{�(�/��S

Z�!7�>�т�o �c�(
u�v�{<�ۗ[T���{�տ�	�~�_ţF��D���G��L�<�P���y�xv�b���s�Kf�mmj^t���==�x*�H�*�����h.�N)Z������:��pD�d��sF)?�L�)��^ Y��,���I��Ϛ}qi�8E�pϱ7��G�Zٱc�F���	|wʔ��5G�$s�o;���џ}�+K�SN4R
�Y��9>ν=	���FtC���a��/�y��?��&��,W�fD%�
����dͷ��Ɵ���9U��9�i�O=�t���ٻg��3g^|ΰ�o^����~Afa���'�e1%!4`��k���g�~����8wތ�cJ`�-1�`�c��( B�%�]�@m#�<-F ]CK�������U����%W�d�u�`�y��D�U��U�pYi�eB��PT�S��bT0=��'���׋�\8y�}K����S�0F�2��M`r��1(�
k�ia?��i�#�X�1x�5Ʋ��RI3�ч���5?���nG�%]�.CG�$h8x��d9�?���N�Y�d�k��
�"-
*Kb��$�eY�7���,�9�e��Xfʱ3�#6�X&ϳe&c�����ξ��D2D}?�A�	x��q���UYY|ذ�?����+�[7�|��[#�Т��DhZ�`')�B9�����~�I��vJ��6	�H��Gg����{.�8�������R�+Jڧ0�7E�Ϡ��#�5��	Y-�|LKs����jsg�ln��F�bT7�j*�O��q���2��<`.�+�
<1$BC:��ؖ�)�z:����k���뷍U�)�؏�%
k'P''I��H
M�h��ݒ�)
ɳ];>s&�ٿj�wa&�:|T��VT\���Qhi��D���E%��a��dz�n(�ɦ��fL���?���p�O~��n`��;x��D�#d+���r_o��à��E~y�D;�-C�0�>�9V�ք�PgS�[P\2��hM�,��':�������YSW���Gr����9���a;?�5��]��:3�L�h���ݐ�k�# ���l�����5������M�ݮ@��j�.1���I��d���%�or���@�Av�_����EP�ܨ�a�U4O���٦��Ѓ���أ˷��`-g@�.��/>��ݦ��P"T�yi���>Y��i��i��NlW,US5�������^���f�H'6�&ᖐ<J�nO�C�O�xwc۪��1Ӄ%M� �(E�6A(%D��d����H�-�<t���-�[W�>vB4��E��w2@b�&�O��aa���̪:f�^.8�	�4�8DZk�DRV��D���8S.&ciXQ@���csۧI��̹�T}{fܤ2���
M@\
K����XsS�)��e�*x@�b$�#F�NWw��1��ŲsĒE��$�d@�fJ����јahɴͱ��'��:��}#��p����]Bą2�lW��T��t�����u�X�2,�ާ�
<�AT٭���b3�Y�_��x�Y���0��-�M�d]�N���}�8�,ji$�f��$VA����
���S�@OXv�,1D@B1I2��B��H�&)H�g�`=����13Q���}���dS��!Ȅ�H
�,��w�"Ԗ���R�p��}A�Rs����Q)ө��Kd.8��`�"��@X����$�>�h�@q� i;Pn�M�O6�e}Q��[��9�!�_:�?���2�IEND�B`�PK�XB��GGfc_knudde.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1347706704(BasicNewsRecipe):
    title = u'FC Knudde'
    __author__ = u'DrMerry'
    description = u'FC Knudde de populaire sport strip van Toon van Driel (http://www.toonvandriel.nl)'
    language = u'nl'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = False
    cover_url = 'http://a1.mzstatic.com/us/r1000/035/Purple/be/33/70/mzl.qkvshinq.320x480-75.jpg'
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    remove_tags_before = dict(id='title')
    remove_tags_after = dict(attrs={'class': 'entry-content rich-content'})
    use_embedded_content = True
    extra_css = 'img{border:0;padding:0;margin:0;width:100%}'

    feeds = [(u'FC Knudde', u'http://www.nusport.nl/feeds/rss/fc-knudde.rss')]
PK�X��N`��
fdb_pl.png�PNG


IHDR  D���0PLTE���ġ��O��b��������t�����8���Ի���̮������h�FyIDATx���
!E��5:���MA�����(�d�t(��HR�î+X:�.@�E����`�@�&
x[,�Yd8�#�����M�#��/ ���7�6 ��OM�����)Wb�OeIEND�B`�PK�X�F��
fdb_pl.recipe__license__ = 'GPL v3'
from calibre.web.feeds.news import BasicNewsRecipe


class FDBPl(BasicNewsRecipe):
    title = u'Fdb.pl'
    __author__ = 'fenuks'
    description = u'Wiadomości ze świata filmu, baza danych filmowych, recenzje, zwiastuny, boxoffice.'
    category = 'film'
    language = 'pl'
    extra_css = '.options-left > li {display: inline;} em {display: block;}'
    cover_url = 'https://i1.fdbimg.pl/hygg2xp1/480x300_magq39.jpg'
    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'}

    keep_only_tags = [dict(attrs={'class': ['row justify-content-center', 'figure']})]
    remove_tags = [
        dict(attrs={'class': ['news-footer infinite-scroll-breakepoit', 'list-inline text-muted m-0']})]
    feeds = []

    def parse_index(self):
        feeds = []
        feeds.append((u'Wiadomości', self.get_articles(
            'https://fdb.pl/wiadomosci?page={0}', 2)))
        return feeds

    def get_articles(self, url, pages=1):
        articles = []
        for nr in range(1, pages + 1):
            soup = self.index_to_soup(url.format(nr))
            for tag in soup.findAll(attrs={'class': 'col-xs-6 col-sm-4 col-md-4 col-lg-3'}):
                node = tag.find('h5')
                title = node.a.string
                url = node.a['href']
                date = ''
                articles.append({'title': title,
                                 'url': url,
                                 'date': date,
                                 'description': ''
                                 })
        return articles
PK�Xʜ^[��fe_india.png�PNG


IHDR���RPLTE��33�ff���������U��KIDAT�1�@�_x'��Y��~��
I�B�{��k��S4[25�t��6۸��L�:��O�!���B�AX��i��VL.IEND�B`�PK�X�->�o
o
fe_india.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
financialexpress.com
'''

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 FE_India(BasicNewsRecipe):
    title = 'The Financial Express'
    __author__ = 'Darko Miletic'
    description = 'Financial news from India'
    publisher = 'The Indian Express Limited'
    category = 'news, politics, finances, India'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'en_IN'
    remove_empty_feeds = True
    ignore_duplicate_articles = {'url'}
    publication_type = 'magazine'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [classes('wp-block-post-title wp-block-post-excerpt ie-network-post-meta-wrapper wp-block-post-featured-image wp-block-post-content')]
    remove_tags = [classes('parent_also_read')]
    remove_attributes = ['width', 'height']

    feeds = [
        # https://www.financialexpress.com/syndication/
        # Print feeds
        ('Front Page','https://www.financialexpress.com/print/front-page/feed/'),
        ('Corporate Markets','https://www.financialexpress.com/print/corporate-markets/feed/'),
        ('Economy','https://www.financialexpress.com/print/economy-print/feed/'),
        ('Opinion','https://www.financialexpress.com/print/edits-columns/feed/'),
        ('personal Finance','https://www.financialexpress.com/print/personal-finance-print/feed/'),
        # ('Brandwagon', 'https://www.financialexpress.com/print/brandwagon/feed/'),
        # Other Feeds
        ('Economy', 'https://www.financialexpress.com/economy/feed/'),
        ('Banking & finance', 'https://www.financialexpress.com/industry/banking-finance/feed/'),
        ('Opinion', 'https://www.financialexpress.com/opinion/feed/'),
        ('Editorial', 'https://www.financialexpress.com/editorial/feed/'),
        ('Budget', 'https://www.financialexpress.com/budget/feed/'),
        ('Industry', 'https://www.financialexpress.com/industry/feed/'),
        ('Market', 'https://www.financialexpress.com/market/feed/'),
        ('Jobs', 'https://www.financialexpress.com/jobs/feed/'),
        ('SME', 'https://www.financialexpress.com/industry/sme/feed/'),
        ('Mutual Funds', 'https://www.financialexpress.com/money/mutual-funds/feed/'),
        ('Health','https://www.financialexpress.com/lifestyle/health/feed'),
        # ('Health Care','https://www.financialexpress.com/healthcare/feed'),
        ('Science','https://www.financialexpress.com/lifestyle/science/feed'),
        ('Infrastructure','https://www.financialexpress.com/infrastructure/feed'),
        ('Money','https://www.financialexpress.com/money/feed'),
    ]

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.magzter.com/IN/The-Indian-Express-Ltd./Financial-Express-Mumbai/Business/')
        for citem in soup.findAll('meta', content=lambda s: s and s.endswith('view/3.jpg')):
            return citem['content']

    def preprocess_html(self, soup, *a):
        for img in soup.findAll(attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X��t���felicia.png�PNG


IHDR��h6�IDAT(�KHTQ�����^�w����CȂhD�a�QI-m��]A��	��F�&���E�� Z��0M:>���ι���Y��|�����#�BJ���/�JK�F���@@i�nm���&�J3�4֠G�u�P�R�Gk-���J�(8��#�8��PRR�`aI�pn5�j�](�d��u����c�i�!%�Q*���<�����f߁�ں��mgҹԯ��rrb�)Q$��t�T�ko��S����|�_^�%���m��	e?�&�t�>:��E��O�u
j��'�i������F�ޝ�ӯ�'�� ����A��c�������q��H�ȵ��w35�An!"[:$�A��67���1�}�J���7��澉�fp��r]Y��߲�P�[��^�:?�z�����x�҇w��JH\k�i�ӱ0 ��6!$��rV�`�N��ʛ��]fM���,�ى����l�9>{��L��i}a�NncftD��R��%ܡ���v�?��-�N/%�#e�[�N�rY�jOΠ
��ο������H�[m�^�~|�!P�vL0��LJ0ȈVG{F�2f�-��*�d�2φ^)h��<�+Ə��+���1��
/�R~k	�g�*�e��S
�C)�fU#f��<d~1v�F�����[�鿁�IEND�B`�PK�X%�Gfelicia.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
revistafelicia.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Felicia(BasicNewsRecipe):
    title = u'Revista Felicia'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'O revist\u0103 pentru sufletul t\u0103u'
    publisher = u'Revista Felicia'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste'
    encoding = 'utf-8'
    cover_url = 'http://www.3waves.net/uploads/image/logo-revista-felicia_03.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'header'}), dict(
            name='div', attrs={'id': 'contentArticol'})
    ]

    remove_tags = [
        dict(name='img', attrs={'src': ['http://www.revistafelicia.ro/templates/default/images/hdr_ultimul_nr.jpg']}), dict(
            name='div', attrs={'class': ['content']})
    ]

    feeds = [
        (u'Feeds', u'http://www.revistafelicia.ro/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X"���
fhm_uk.png�PNG


IHDR  ��tRNSn���IDAT�˯eY]���>��꾪.UբM��<��R�F;FB�Ȑ���G�0�c"q@b���@[E�Z�=P���_tQ]��s�y���⦕�iK
�D��@#3���.5�(g␌�$3�A&��C6�UJZ��2�D�
Y	$��.�(���%��wU�
Z�Q	r&hUJ�
9A����D�P) KI�Ek����&A@��AБ��T@$-�ɨ"�$�
�@T���F��	-Z�Pr��%�JZ�RR
��41�Vij�C�
�D�:{��,u�&�dL2TA���;�$*�R��TA���-�*�F@��TiѤm�Uy���ޘ�@Sc?��Q�c��Ԁ�0A;�a[�ۡ$c'��R#CE��R���Fu,����[R(`S,s��$Z��Rެo�GFZ��1�(���o&M���k��~e=�!qsya-�h{��M�g�y:��j���q0��p�R{L��v���rk�5�s0��b�;Zo~~aq�T���������0h���t�a�f�\���j���nj3����ի?�w�k���8o�m��뺇���7_��./O_�������w~�'�����_~�_����gfǿ�[/��~��o����Ű�/��ο�����n�`ݻo�^���z���f��߬���x�'�ymS���D�N��f?~�?lO��v�8����z�u&u~��/�����g��|��œn�~���ɸ^,ܞ��ŝ�g?V>|�i>N39�v�Y����E���P����߼=��;�G�'�~�ݿ��\�Ű�<�uj�EL�NRw��[������{�!����qsr~,6��y^���{o�+?y�7�h��==z��}=�{2ܬׇ῾�-��s��*�|i��=��"����(�x�<�G�.�ǫ��o��k���?��������a�����<�>:Cxwu����<����4M/^ŃO|f�ڮ&�(�&3CtR��$��n2ە���_���������O7�/>������_�լˎ�M�\���CϾ������7/<�I�?R&����z|Do[қ�u���^��4^x�����<4;im�8��?>�ه�������8��my�u�5���]�˛��_}��;�>��D�L���{��{�z���x�wv�dz�;��7����K�ԯv���ۯK�_~n2�>z�v{�Y/}��/���˟v����O�/��;v{�<6�z.l�55��u,�#��ao9uq)&Zuka��L:����a�qk1�G���r��8>>�l���M�S�iO2l�g��\����8T��8�H�&"�z�P����(_�-w]�G+mlm�1��]�BV��F*���"5�l��I��*�~��ޚ7v�<����{Y�^�O��h����4�Z��m��L&�:�`���O�K�I��Zk�&Wi'j���k��q?����6h$���Ĕ�2�l�(̘�7*� �l��T&Ҕ���3��4��kT��cB�h�A��Ѩ�PE5ڪ��l$�
� �ȠvR�cB@m�@����a�uR�
��i��B"� �D�5� ��hc@@4�h4	�FЈ
�mk��Q:#�`B4*ZUPI"	�F�D�.��CF%9�c$�3
 !I��"
4�������3��@@edO����B�Tԑ�
:J�f*�${vl�g�n�9�I�IEND�B`�PK�X-k��
fhm_uk.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1325006965(BasicNewsRecipe):
    title = u'FHM UK'
    description = 'Good News for Men.'
    cover_url = 'http://www.greatmagazines.co.uk/covers/large/w197/current/fhm.jpg'
    #   cover_url = 'http://profile.ak.fbcdn.net/hprofile-ak-snc4/373529_38324934806_64930243_n.jpg'
    masthead_url = 'http://www.fhm.com/App_Resources/Images/Site/re-design/logo.gif'
    __author__ = 'Dave Asbury'
    # last updated 7/10/12
    language = 'en_GB'
    oldest_article = 31
    max_articles_per_feed = 15
    remove_empty_feeds = True
    no_stylesheets = True

    keep_only_tags = [
        dict(name='h1'),
        dict(name='img', attrs={'id': 'ctl00_Body_imgMainImage'}),
        dict(name='div', attrs={
             'id': ['profileLeft', 'articleLeft', 'profileRight', 'profileBody']}),
        dict(name='div', attrs={
             'class': ['imagesCenterArticle', 'containerCenterArticle', 'articleBody', ]}),

    ]

    remove_tags = [
        dict(attrs={'id': ['ctl00_Body_divSlideShow']}),

    ]
    feeds = [
        # repeatable search = </div>{|}<a href="{%}"
        # class="{*}">{%}</a>{|}<p>{*}</p>
        (u'Homepage', u'http://rss.feedsportal.com/c/375/f/434908/index.rss'),
        (u'Funny', u'http://rss.feedsportal.com/c/375/f/434910/index.rss'),
        (u'Girls', u'http://rss.feedsportal.com/c/375/f/434913/index.rss'),
    ]

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
        '''
PK�X�����	fhmro.png�PNG


IHDR�aGIDATx�uS�,A�o۶m۶m۶m϶m۶mv%o6s��%��L�ֲ���կ_�h�С~�;w�����n�X��w�޽ȹ���d��޽{L۶mShƇ�"iϟ??���ŋ����ի�fΜi���߿7��ݻ���Ç�L�:�F�A�޽�Z�l�U�v�2��n
@��zݺu˶o�K4ظq㿑#Gz�g ؇{7n�8�Ҏ^k׮U9{��#h������������sv������(<������#s��'r��kժG+��О��+E
�ܹ�G���V�K�/�I�sǂ{w�<}��h�պut��G��%2~������ap���s|{��
���
��1ȱ��J`e�����y0e#�2���?�(
�M`���u�S޿ߛ��===�Ũ���^�����<�����^�����Ν;�x���ŋ�!'�۷Ob<���/---��0
2$@SSs)��͛��"�s��5���
�kz����mk�A`��	~�gϞQ�?~��+���� �����$&&���n߾}�����,`��y�1���؎|&88�o5aG����IEND�B`�PK�X�_,?;;fhmro.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
fhm.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class FHMro(BasicNewsRecipe):
    title = u'FHM Ro'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Pentru c\u0103 noi putem'
    publisher = 'FHM'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Reviste'
    encoding = 'utf-8'
    cover_url = 'http://www.fhm.com/App_Resources/Images/Site/re-design/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'contentMainTitle'}), dict(
            name='div', attrs={'class': 'entry'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['ratingblock ']}), dict(
            name='a', attrs={'rel': ['tag']})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['ratingblock ']}), dict(
            name='div', attrs={'class': ['socialize-containter']})
    ]

    feeds = [
        (u'Feeds', u'http://www.fhm.ro/feed')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�1�?��
fifty_two.png�PNG


IHDR  D���PLTE
$��������������e&6RIDATx�퐁�0��y9/����Np�FE+�4�X'�;|R]�A/�$H�̜"����"�o���8�S�ln��n
5IEND�B`�PK�X�njpPPfifty_two.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class fiftytwo(BasicNewsRecipe):
    title = u'Fifty Two'
    description = ('Every week, 52 publishes an essay that dives deep into an aspect of India’s history,'
        ' politics and culture. Each story will explain, recall or establish something interesting '
        'about life on our subcontinent, and tell readers why it matters to them.')
    language = 'en_IN'
    __author__ = 'unkn0wn'
    oldest_article = 30  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://fiftytwo.in//img/52-logo.png'
    # https://fiftytwo.in/img/favicon.png
    ignore_duplicate_articles = {'url'}
    extra_css = '.story-info, .story-notes, .story-intro {font-size:small; font-style:italic;}'

    keep_only_tags = [
        classes(
            'story-banner__container story-info story-slices story-notes'
        ),
    ]

    feeds = [
        ('Articles', 'https://fiftytwo.in/feed.xml'),
    ]
PK�X<8Q!��film_org_pl.png�PNG


IHDRv�@��IDATx�cX��������0
��/�!t�r��Ā@\�`3�:��Z��04�g�+���/X�*?J�$��
 �Ya,��+�S@�~q'	}:1�Do0�
���b�Voշ������ل�J_a�
�O�%(��?E_σ�gf[�胧�ւ�5�<V`=��[G-�c�;�7��p���?���%Xݭ��A��#��`}�����~�|��ﮙ�
�7�˳��I@�/��W�Е��0��M�r�~���L
JG�?���3]`z!�Q�J�e�,�A�	�@��n�R�|T]3L��r(}��D���V��e��u��k�-�����j|��
(ݎ��I���@hC!h�� K��l=���$���:�0�.��Ѕ�I��� t�-��0��q�O���IEND�B`�PK�X��>���film_org_pl.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai
from calibre.web.feeds.news import BasicNewsRecipe


class FilmOrgPl(BasicNewsRecipe):
    title = u'Film.org.pl'
    __author__ = 'fenuks'
    description = u"Recenzje, analizy, artykuły, rankingi - wszystko o filmie dla miłośników kina. Opisy efektów specjalnych, wersji reżyserskich, remake'ów, sequeli. No i forum filmowe. Jedne z największych w Polsce."  # noqa
    category = 'film'
    language = 'pl'
    cover_url = 'http://film.org.pl/wp-content/uploads/2015/02/film.org.pl_film.org_.pl_kmfviolet4.png'
    ignore_duplicate_articles = {'title', 'url'}
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    use_embedded_content = True

    remove_attributes = ['style', 'width', 'height']
    remove_tags = [dict(attrs={'class': 'shortcode-box right'})]

    feeds = [
        (u'Recenzje', u'http://film.org.pl/r/recenzje/feed/'),
        (u'Artyku\u0142', u'http://film.org.pl/a/artykul/feed/'),
        (u'Analiza', u'http://film.org.pl/a/analiza/feed/'),
        (u'Ranking', u'http://film.org.pl/a/ranking/feed/'),
        (u'Blog', u'http://film.org.pl/kmf/blog/feed/'),
        (u'Ludzie', u'http://film.org.pl/a/ludzie/feed/'),
        (u'Seriale', u'http://film.org.pl/a/seriale/feed/'),
        (u'Oceanarium', u'http://film.org.pl/a/ocenarium/feed/'),
        (u'VHS', u'http://film.org.pl/a/vhs-a/feed/'), ]
PK�X'���film_web.png�PNG


IHDR(-S'PLTE�������
��������������YW
tRNST��*��Z8Ʀ��l�nxIDATx�b�MNb c%��hDž�1wӿ0?1�|��2
6���SK���zZ�G�Z�@�D�H��<ғ���ؽgiwk�S*w��WQ��ST6����A�A�j/��_��[��.�FIEND�B`�PK�X6�
��film_web.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class FilmWebPl(BasicNewsRecipe):
    title          = 'FilmWeb'
    __author__        = 'fenuks'
    description   = u'Filmweb.pl - Filmy takie jak Ty Filmweb to największy i najczęściej odwiedzany polski serwis filmowy.'
    cover_url      = 'https://1.fwcdn.pl/an/np/49468/2018/15037.2.jpg'
    category       = 'movies'
    language       = 'pl'
    index = 'https://www.filmweb.pl'
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_javascript = True
    use_embedded_content = False
    extra_css      = ('.hdrBig {font-size:22px;} ul {list-style-type:none;} '
                      'ul.inline > li {display: inline;} '
                      'ul.sep-line > li + li::before {content: " | "} '
                      'ul.inline {padding:0px;} .vertical-align {display: inline-block;}')
    preprocess_regexps = [(re.compile(r'<body.+?</head>', re.DOTALL), lambda match: ''),  # fix malformed HTML with 2 body tags...
    (re.compile(u'(?:<sup>)?\\(kliknij\\,\\ aby powiększyć\\)(?:</sup>)?', re.IGNORECASE), lambda m: ''),
    (re.compile(type(u'')(r'(<br ?/?>\s*?<br ?/?>\s*?)+'), re.IGNORECASE), lambda m: '<br />')
    ]
    remove_tags = [dict(attrs={'class':['infoParent', 'likeBar',
                    'droptions-box pull-right', 'photoDesc', 'imageLicense', 'play big', 'shadow embed__icon--svg']})]
    remove_attributes = ['style',]
    keep_only_tags = [dict(attrs={'class': ['newsHdr hdrWithAuthor ', 'reviewHdr', 'newsContent newsPage', 'newsContent', 'hdr hdr-mega']})]
    feeds          = [(u'Filmy', u'https://www.filmweb.pl/feed/news/category/film'),
                         (u'Seriale', u'https://www.filmweb.pl/feed/news/category/serial'),
                         (u'Box office', u'https://www.filmweb.pl/feed/news/category/boxoffice'),
                         (u'Telewizja', u'https://www.filmweb.pl/feed/news/category/tv'),
                         (u'Festiwale, nagrody i przeglądy', u'https://www.filmweb.pl/feed/news/category/festival'),
                         (u'Multimedia', u'https://www.filmweb.pl/feed/news/category/multimedia'),
                         (u'Dystrybucja dvd/blu-ray', u'https://www.filmweb.pl/feed/news/category/dvd'),
                         (u'Gry wideo', u'https://www.filmweb.pl/feed/news/category/game'),
                         (u'Różne', u'https://www.filmweb.pl/feed/news/category/other'),
                         (u'Recenzje redakcji', u'https://www.filmweb.pl/feed/reviews/latest'),
                         (u'Recenzje użytkowników', u'https://www.filmweb.pl/feed/user-reviews/latest')
                          ]

    def preprocess_html(self, soup):
        for a in soup('a', href=True):
            if 'https://' not in a['href']:
                a['href'] = self.index + a['href']

        return soup
PK�X�R�&}}financial_times.png�PNG


IHDR  ��DIDATH���ي]�����v���ghu�ۦ��h�-Y��C�_"$o��<�_%�@cH�	�"��Ell�8r�F��j��s�j\�hM6	X�E]}k���/�O�I䤍2ek�m�i?��r����\�[�(˒l�ރ��\����dR���f:鍇�,�m�<׈1��E��H{�����$��E��A)�䷷�֦?�!��������:�����~���-)�UJc0��F5�Q*�)k=X3�m���I%0�,S4����[[,Ѕ!C���0�vښĪ��d%�
l|m5���u��K�3�^��ތX�e|p�We�@ۙ��Z�s����ZkzUS[U��WU�p�̆s7�<�Y5b"������tV�o�}u���)%͒!��յ�����M~p�ěo���q���++G��!��bn��ͥ���f4�)Ix��W^<�B�4��h�����jx�߿������
G��ҡC�_:S
G߬?�z�j5߾��o�	���/9���w�|����6?y���׮4��e�*�=��~���Ũ����b��v�G�|
Q+G�=�|it>���|�?���I���sgVWW�Xe7����b:u����ǣ�׷o���\��TY�u3�5�:D��.��M�s>������΍��֊�8�����ܿ�l]dB�MFH����3gN�8Z��tgɳHk˲$"�)K�2b
R�:$!V>��҉'���^:y�yp���Q�$Wh��A+Ap�_���VF1���1H�������>�E�ҥK�`���g�K�*ה(��(��o�LgZ%��,̏���$NH����SP�������7w�}��tk+�Tyo~�E�I-D��")J��u�Ds2�A&`���J@by��y�sgO]�˟��ı��ۺs;��Ҥ�w�[�J%Rc�1����iHIڟ��ŋ�j��Wk7~��_m����-J���YO�$+�t�M�)@�$t�`
��X@P��{�n�&�cG����ʇ	Q��δɕɉM�¢L$�ʠ3�rI|L������O� �48:S.\�Mv�����J�k{���H:��.�	�b҉	)D
f�I"DFd�mu��
����h�}�f��N��)$k=i'l�䡈HeY�$@Q��I����S�Pt�d��ݛ��QV�g��{S)�"a�J��dHbۦ���!H�
�=�u�9+!榱����~�}+��l��c��	�3MDi��7�@2^�/z��m��i޸��p����!�e�ٿ��T[���]�r�W����ᕕ����^9���7Ͽ����ewg��;Z^��k��]�~��/o���1y�Pgξ�z�WϾxpq��tRϦ$_��BB�Ce*+�3{��Ip�f��˲��.���ܤ�����Ƙ�m�R@���kΊBö�֦(���d���ݻ���L1�.�9�v]S���9�iDoE$ό�D�I�VEQ�zh�ޒ|�2
S��6�����>��l77c���)�(I�$ ��s�=U
ą��sEQx�%:E0,L`�P��w�>$β��	�mm۹��9V$D�B�{[��BH!�D����1�p�V�W$�t�V�"7!�`�g�s��^���#�2Z��
�M&f8KW�Jgy�!)!5�Ӣ(XIbŤI�K$����_"�D�0��{�!�t!�#ߊpz�]<��G!���)	�~�<��޷���5���	��k˓������R�|��0d�'W�m�O�Ӿ�g�u"~�3%$�]Z8@,��>�BzB�O%zR����?�Mw��IEND�B`�PK�Xऐ���financial_times.recipeimport json
import re
from calibre import browser
from urllib.parse import quote
from html5_parser import parse

from calibre.web.feeds.news import BasicNewsRecipe, classes


class ft(BasicNewsRecipe):
    title = 'Financial Times'
    language = 'en'
    __author__ = "Kovid Goyal"
    description = 'The Financial Times is one of the world’s leading news organisations, recognised internationally for its authority, integrity and accuracy.'
    oldest_article = 1.15
    max_articles_per_feed = 50
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'url'}
    resolve_internal_links = True
    remove_attributes = ['style', 'width', 'height']
    masthead_url = 'https://im.ft-static.com/m/img/masthead_main.jpg'
    simultaneous_downloads = 1

    extra_css = '''
        .article-info__time-byline {font-size:small; font-weight:bold; }
        .o-topper__visual, #fig, .main-image, .n-content-image { text-align:center; font-size:small; }
        blockquote, i { color:#5c5c5c; }
        .o-topper__standfirst { font-weight:bold; color:#202020; }
        .o-topper__topic { font-size:small; color:#5c5c5c; }
    '''

    keep_only_tags = [
        classes(
            'body_json o-topper__topic o-topper__headline o-topper__standfirst o-topper__visual article-info__time-byline main-image'
        ),
        dict(name='article', attrs={'id':'article-body'})
    ]

    remove_tags = [
        dict(name=['source', 'svg', 'button']),
        dict(name='aside', attrs={'class':'n-content-recommended--single-story flourish-disclaimer'}),
        dict(attrs={'data-layout-name':'card'}),
        classes('in-article-advert')
    ]

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.frontpages.com/financial-times/')
        return 'https://www.frontpages.com' + soup.find('img', attrs={'id':'giornale-img'})['src']

    # needs_subscription = 'optional'
    #
    # def get_browser(self, *args, **kw):
    #     br = super().get_browser(*args, **kw)
    #     if self.username and self.password:
    #         # ft.com uses a CAPTCHA on its login page so this sadly doesnt work
    #         br.open('https://accounts.ft.com/login?location=https%3A%2F%2Fwww.ft.com')
    #         br.select_form(id='email-form')
    #         br['email'] = self.username
    #         br.submit()
    #         br.select_form(id='login-form')
    #         br['password'] = self.password
    #         br.submit()
    #     return br

    def get_browser(self, *args, **kwargs):
        return self

    def clone_browser(self, *args, **kwargs):
        return self.get_browser()

    def open_novisit(self, *args, **kwargs):
        br = browser(user_agent='Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)')
        br.addheaders += [
            ('Referer', 'https://www.google.com/'),
            ('X-Forwarded-For', '66.249.66.1')
        ]
        return br.open_novisit(*args, **kwargs)

    open = open_novisit

    feeds = [
        ('FirstFT', 'https://www.ft.com/firstft?format=rss'),
        ('Opinion', 'https://www.ft.com/opinion?format=rss'),
        ('World', 'https://www.ft.com/world?format=rss'),
        ('US', 'https://www.ft.com/us?format=rss'),
        ('Companies', 'https://www.ft.com/companies?format=rss'),
        ('Tech', 'https://www.ft.com/technology?format=rss'),
        ('Markets', 'https://www.ft.com/markets?format=rss'),
        ('Climate', 'https://www.ft.com/climate-capital?format=rss'),
        ('Life & Arts', 'https://www.ft.com/life-arts?format=rss'),
        ('How to spend it', 'https://www.ft.com/htsi?format=rss'),
        ('Others', 'https://www.ft.com/rss/home/uk')
    ]

    def preprocess_raw_html(self, raw, *a):
        # with open('/t/raw.html', 'w') as f:
        #     f.write(raw)
        root = parse(raw)
        if root.xpath('//article[@id="article-body"]'):
            self.log('**has article content')
            return raw
        self.log('**no article content')
        m = re.search(r'type="application/ld\+json">[^<]+?"@type":"NewsArticle"', raw)
        raw = raw[m.start():]
        raw = raw.split('>', 1)[1]
        # with open('/t/raw.json', 'w') as f:
        #     f.write(raw)
        data = json.JSONDecoder().raw_decode(raw)[0]
        title = data['headline']
        body = data['articleBody']
        body = body.replace('\n\n', '<p>')
        author = ''
        if 'author' in data:
            try:
                author = data['author']['name']
            except TypeError:
                author = ' and '.join(x['name'] for x in data['author'])
        image = desc = title_image_url = ''

        def resize_img(img):
            a = 'https://www.ft.com/__origami/service/image/v2/images/raw/'
            b = quote(img, safe='')
            c = '?dpr=2&fit=scale-down&quality=medium&source=next&width=400'
            # use width = 200, 300, 400,.. 700...
            return a + b + c

        if data.get('image'):
            image_url = data['image']['url']
            if body.__contains__(image_url) is False:
                title_image_url = resize_img(image_url)
                image = '<p><img src="{}">'.format(title_image_url)
        # embedded image links

        def insert_image(m):
            url = m.group()[1:-1]
            if url.__contains__('studio') is False:
                url = resize_img(url)
            return '<span><img src="{}"></span></p><p>'.format(url)

        body = re.sub(r'\[https://\S+?\]', insert_image, body)
        if data.get('description'):
            desc = '<h2>' + data['description'] + '</h2>'
        html = '<html><body><div class="body_json"><h1>' + title + '</h1>' + desc + '<h3>' + author + '</h3>' + image + '<p>' + body
        return html

    def preprocess_html(self, soup):
        for con in soup.findAll(attrs={'class':'n-content-layout__slot'}):
            if con.find('figure'):
                con['id'] = 'fig'
        if h3 := soup.find(**classes('o-topper__standfirst')):
            h3.name = 'h3'
        return soup
PK�X��K��financialsense.png�PNG


IHDR��h6\IDATx�c�O"`�z��ŗϟ�������a�������9�����ڷ}��;g_<�v��a
������o_7��~��׏ϛꊁ�7o^9�dCi��
�P4���&}�;��߹"&ԅ��QXH��<�,�o�֭W�n�q�җ/_N�|rݑ��]?�{dž�)	�p_��D�����>�k͒>�
�_�<�w���{�D޹�(���E}�.��<��z����7w_<��p�ƅg���ز��D~���M�kݽ(+��vݦ�K�300x��_5{�	���i����\N����ks�v�l�

&'����楽 ^�|�~��ݛ�7U&�k���^=��ʩͫ���̚�����;�|��
���c�R�:�۶�;��@�/_mYT�gNJS�w<y|JkWιr��ٳǟ=�<�+��Q���UEE�����ӻ��:�uR<������s�7ݾuy���)=E�.��9��'o�~�������_�|��4���5�7�𾵷o_r�/[|���O�/����'p�����?�����{��Ӈ��7��~a�œ[��X��ݳ�o��aI|����0~��q'RjE�WDW���IEND�B`�PK�XB�J��financialsense.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
www.financialsense.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class FinancialSense(BasicNewsRecipe):
    title = 'Financial Sense'
    __author__ = 'Darko Miletic'
    description = 'Uncommon News & Views for the Wise Investor'
    publisher = 'Financial Sense'
    category = 'news, finances, politics, USA'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    masthead_url = 'http://www.financialsense.com/sites/default/files/logo.jpg'
    extra_css             = """
                               body{font-family: Arial,"Helvetica Neue",Helvetica,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                               h2{color: gray}
                               .name{margin-right: 5em}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link', 'base', 'object', 'embed', 'iframe'])]
    remove_tags_after = dict(attrs={'class': 'vcard'})
    keep_only_tags = [
        dict(attrs={'class': ['title', 'post-meta', 'content', 'item-title', 'vcard']})]
    remove_attributes = ['lang', 'type']

    feeds = [(u'Articles', u'http://feeds.feedburner.com/fso')]

    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 = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�Xx8���financiarul.png�PNG


IHDR��h6�IDATx�c���Ih�hض�KS�.]yc��F��Ϫ5Dhx��_�#�/F6o�l���j���KZ�=�R rycf�%(�ϻ785�F�h<H)�"=�/e584�[�F���K\ʟ}G����&.�(��аiȰ��/�����������p�ʗ��k޴�����Wo�����-<���i	����Ar�IEND�B`�PK�X@�:���financiarul.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
financiarul.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Financiarul(BasicNewsRecipe):
    title = u'Financiarul'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'FIN.ro'
    publisher = u'Financiarul'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri'
    encoding = 'utf-8'
    cover_url = 'http://www.financiarul.com/templates/default/images/logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'col2ContentLeftL'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['infoArticol']}), dict(name='ul', attrs={'class': 'navSectiuni'}), dict(name='div', attrs={'class': 'separator separatorTop'}), dict(name='div', attrs={'class': 'infoArticol infoArticolBottom'}), dict(name='ul', attrs={'class': ['related']}), dict(name='div', attrs={'class': ['slot panel300 panelGri300 panelGri300s panelGri300sm']})  # noqa
    ]

    remove_tags_after = [
        dict(name='ul', attrs={'class': ['related']})
    ]

    feeds = [
        (u'Feeds', u'http://www.financiarul.com/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�#/��financieele_dagblad.png�PNG


IHDR  D���@PLTE���������������Ѽ����{�}u��������΢ú���������������ö]WR  631,+)\VQ�˽�ƽ3��4��5��1��v��������WQM���ɹ�C?<��ϭǾh��x�����:75��ɞ��ske�������؍�zA>;���ͽ�KGC>:7�����������ғ���˾e^Y964$##SMIulf�ʼ�����X��E��P���������Ķ@=:&%$0.,TNJ��ɍ��6��F��t��[��7�������ȄzsB?<�ƹ������B��:���Ǿ����ޓ��GD@��ϓ��Q����҂����GC@��·��a����։��������������}��x���������λ��`ZU.,+����µ���>��6�������O��[����þ��`YTvo���Ͼ�ia\���~��K��|��d��M���ºvmf����̿^XS_XT�����Ҏ��R��V���Ž���`��e��i����ë��20.XRN�����������������Ϳ����MIDAT8O��?HBQ����'&5��T�K4Ѩ�M
B4�RaT �1áA"l(4���lT�5r�� �0(�wރ�9D���p�{�����J�8�""�
4_u\PmZ�q�k��(�}�}�S�»�5����u��������ʾ;�F�7EKm��A���KK�Y(��jn�S��!(�a�)���)�����j�i���c��q�w:�OEB��M�2dž$�*��@���MQ*Dy�� "��|Q��eX!֍=��܈,�M�B&K0��U�K""C���\�M��A�ȡ��j�Q��m�ZCI+hI{�?	p!oKA�IEND�B`�PK�XZ�Z�qqfinancieele_dagblad.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class fd(BasicNewsRecipe):
    title = u'Het Financieele Dagblad'
    __author__ = 'marvin_2'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    cover_url = 'http://www.fd.nl/static/gfx/logo-fd-164x78.gif'
    language = 'nl'

    keep_only_tags = (dict(name='div', attrs={'class': ['headlinearticle']}))
    remove_tags = [dict(name='span', attrs={'class': ['opties']})]

    feeds = [
        (u'Overzicht', u'https://fd.nl/laatste-nieuws?rss&profiel=OPENBAAR')


    ]
    extra_css = '''
        h1 {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:x-large;}
        p{font-family:Arial,Helvetica,sans-serif;}
        strong{font-weight:bold; margin-right:5pt;margin-top:20pt;}
        .datum_ie {font-style:italic;font-size:small;}
        img {align:left;}
        '''
PK�Xb�d��first_things.png�PNG


IHDR���R0PLTE�����ǀ�͐��A@�QP�a`�10�! �qp�ڰ��Ԡ���8IDAT�c`��L\�v�N0��*d,�0̲@&�`Rh��{(C,�V��s��IEND�B`�PK�XK�S�_	_	first_things.recipe#!/usr/bin/env python
from __future__ import unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2017, John Hutson <jfhutson at gmail.com>'
'''
firstthings.com
'''
import html5lib
from lxml import html
from calibre.web.feeds.news import BasicNewsRecipe


class FirstThings(BasicNewsRecipe):

    title = 'First Things'
    __author__ = 'John Hutson'
    description = 'America\'s Most Influential Journal of Religion and Public Life'
    INDEX = 'https://www.firstthings.com/current-edition'
    language = 'en'
    encoding = 'utf-8'

    no_stylesheets = True

    keep_only_tags = [
        dict(name='h1'),
        dict(attrs={'itemprop': ['author',]}),
        dict(attrs={'itemprop': 'articleBody'}),
        ]

    extra_css = '''
        .small-caps { font-variant: small-caps }
        .drop-cap { float: left; font-size: 75px; line-height: 60px; padding-top: 4px; padding-right: 8px; padding-left: 3px;}
        '''

    def preprocess_raw_html(self, raw, url):
        return html.tostring(html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False), method='html', encoding='unicode')

    def parse_index(self):
        soup = self.index_to_soup(self.INDEX)
        cover = soup.find('a', 'cover-link')
        if cover is not None:
            img = cover
            if img:
                self.cover_url = img['href']
        current_section, current_articles = 'Cover Story', []
        feeds = []
        for div in soup.findAll(['h3', 'h4', 'a']):
            if div.name == 'h3':
                if current_articles:
                    feeds.append((current_section, current_articles))
                current_articles = []
                current_section = self.tag_to_string(div)
                self.log('\nFound section:', current_section)
            elif div.name == 'h4':
                a = div.findChild('a')
                title = self.tag_to_string(a)
                url = a['href']
                desc = ''
                if url.startswith('/'):
                    url = 'https://www.firstthings.com/' + url
                elif div.name == 'a' and div.rel == 'author':
                    desc = self.tag_to_string(div)
                current_articles.append(
                    {'title': title, 'url': url, 'description': desc})

        if current_articles:
            feeds.append((current_section, current_articles))
        return feeds
PK�X�a�
firstpost.png�PNG


IHDR���R cHRMz&�����u0�`:�p��Q<PLTE����N7�N7�N7�����k�tRNSU��O�bKGD�HtIME�18j��JzTXtRaw profile type xmp8��UQ�"1��{�H�3���V��w�m���Z��1���4���~џ�x3��Lo^l1��UW.�Vͭ�&�y���i2��M�R]�):����Y'm�:V�U���7���Lٸ�ٛ���Af�X��6�أ@@6j3�u߸�g&?a`;�	���R��Z�#��i�ʛ䳈JX\:l��K��+K����;���H�nOdp��<F𬬪v(�)7���/��������[f��3�Ȅ�ر #G�o(���R@����Lu0��-¦���j'��A���)��~�DX�l(�!��^�p\�v\\k��@���>x(�Q|f�s�z؄ Ō��*�sQ;,�½���TO]C��횜�>��~�{�[�
�,X�
�{��KCE)H�P�4V1M
{!�r�@B��'�c{nL��|an��T%r�J�~�i���N��J̤�m�:FÚ�OʙvW�7-?�\S�l,�;DQڅ�̇�P5���Q�Fr:�W>�?H ����C~L�A���Y?z���JϷ��/%헿�~��?|�oKQL�PLIDAT�cH��$%%C--IPP
�`b�2 (�)I�PR�0�M$IP�T�0]C���R$�
�@))�q�9�O%tEXtdate:create2023-08-22T05:49:56+00:00
��%tEXtdate:modify2023-08-22T05:49:56+00:00dW*(tEXtdate:timestamp2023-08-22T05:49:56+00:003B*�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�PK�X����firstpost.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from calibre.ptempfile import PersistentTemporaryFile

# Firstpost feeds mix sections into other feeds, like explainers end up in opinion feed and opinions end up in India feed.
# change google_feeds to True to fetch right sections.
google_feeds = False

class firstpost(BasicNewsRecipe):
    title = 'Firstpost'
    __author__ = 'unkn0wn'
    description = (
        'Firstpost.com will serve as a trusted guide to the crush of news and ideas around you.'
        ' With thoughtful analysis and fearless views our team of editors and writers will track'
        ' news in India and the world and provide a perspective that is reflective of a changing dynamic.'
    )
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en_IN'
    remove_attributes = ['height', 'width', 'style']
    masthead_url = 'https://images.firstpost.com/wp-content/uploads/2016/03/FP-Logo.png?impolicy=website&width=600&height=60'
    max_articles_per_feed = 25
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    extra_css = '''
        .category-name, .author-info { font-size:small; color:#202020; }
        .wp-caption-text { font-size:small; text-align:center; }
    '''

    keep_only_tags = [
        classes('article-sect')
    ]

    remove_tags = [
        classes('art-rel-articles tags-wrap'),
        dict(name='svg'),
    ]

    feeds = []

    sections = [
        'india', 'politics', 'opinion', 'explainers', 'business',
        'world', 'web-stories', 'tech', 'artandculture', 'health', 'health-supplement',
        # 'photos', 'entertainment', 'living', 'education', 'sports', 'firstcricket',
    ]
    if not google_feeds:
        oldest_article = 1.2 # days
        for sec in sections:
            a = 'https://www.firstpost.com/rss/{}.xml'
            feeds.append((sec.capitalize(), a.format(sec)))
    else:
        articles_are_obfuscated = True

        def get_obfuscated_article(self, url):
            br = self.get_browser()
            soup = self.index_to_soup(url)
            link = soup.find('a', href=True)
            skip_sections =[ # add sections you want to skip
                '/video/', '/videos/', '/media/', '/vantage/'
            ]
            if any(x in link['href'] for x in skip_sections):
                self.log('Aborting Article ', link['href'])
                self.abort_article('skipping video links')
            self.log('Downloading ', link['href'])
            html = br.open(link['href']).read()
            pt = PersistentTemporaryFile('.html')
            pt.write(html)
            pt.close()
            return pt.name

        for sec in sections:
            a = 'https://news.google.com/rss/search?q=when:27h+allinurl:firstpost.com{}&hl=en-IN&gl=IN&ceid=IN:en'
            feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
        # feeds.append(('Others', a.format('')))

    def preprocess_html(self, soup):
        if h2 := soup.find('h2', attrs={'class':'category-name'}):
            h2.name = 'p'
        if h := soup.find('h2', attrs={'class':'inner-copy'}):
            h.name = 'p'
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        return soup
PK�XA2���fisco_oggi.png�PNG


IHDR  ��tRNSn���IDATH�c`��e�e$	�r�b���e6I�MT����X���I��OV�������4������#1Ir,�.$����MM''��N�����H !��-��4̓�V�(f� Fm�Ĥ`
Fr, ��=J�p،��
��B�#nMrR�����������ג"Gmi rВr�uT�sT� C)�y�J������쬬�¼�]^�G3UWja��՚�4>ף�Ge�����e0�	f*�`:�����H�\�B�%�0-(��k8��Z�X�l"D�XP����0%���ъ(	��B�!JWũHII�������W)����՗��z\���
0-�+Qb&�a�j������@q�,�@7�8-��3S�����y8]�1�H�,�(��.���������TM����8y�� c�Q Q���@��@�"�S-�l���Y �R�A�����Q�40�-8��H��RKj#�]f�&��xj+p�#��sP�"6}��!2}����*��2.k$9���l���3E�@�*�pE�JS *tV0�,�k����d;W�7x)Çp�w��n�(
��D+`��B�8�0wѕ
,怅>���	�W���4@��G�m�#��⢪�IEND�B`�PK�X��;QQfisco_oggi.recipe__license__ = 'GPL v3'
__author__ = 'faber1971'
description = 'Website of Italian Governament Income Agency (about revenue, taxation, taxes)- v1.00 (17, December 2011)'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1324112023(BasicNewsRecipe):
    title = u'Fisco Oggi'
    language = 'it'
    __author__ = 'faber1971'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    remove_javascript = True
    no_stylesheets = True

    feeds = [
    (u'Attualit\xe0', u'http://www.fiscooggi.it/taxonomy/term/1/feed'),
    (u'Normativa', u'http://www.fiscooggi.it/taxonomy/term/5/feed'),
    (u'Giurisprudenza', u'http://www.fiscooggi.it/taxonomy/term/8/feed'),
    (u'Dati e statistiche', u'http://www.fiscooggi.it/taxonomy/term/12/feed'),

    (u'Analisi e commenti', u'http://www.fiscooggi.it/taxonomy/term/13/feed'),
    (u'Bilancio e contabilit\xe0', u'http://www.fiscooggi.it/taxonomy/term/576/feed'),
    (u'Dalle regioni', u'http://www.fiscooggi.it/taxonomy/term/16/feed'),
    (u'Dal mondo', u'http://www.fiscooggi.it/taxonomy/term/17/feed')]
PK�X�1����fleshbot.png�PNG


IHDR  ��IDATxڵV�r1U<8````XPPX�)�'�2@A�aAA������A���#   ���St�\c���v4�nG~ow��Z'��V)�>��d.����FT=:��>�!lF_c|^�Y��@+|d�d�&�b���ϧ�a��wd
1+:VK�B��̓SBex��’ш=��3_
��'G�~B����諒4�n���P�.	|w퓇ڈ�4�Y܏_�X�����'�S��[q����O���~���D��LJ8`@�b�.�t��	��'s�B���~����Ł�va6ckɚ���W#3�t�e\o^ӆ��q"p��]��aM���O#R�bLZ�H@L";U��K���oB#Ğ4g@���!C4S�0_��B�����%%Hp��\3�fUO�Y �a�
kn�OR@E�M��ez�?AJ�"�LB��(!��#HN��������DAe0~A͒����@�|�I��Ab���B=�W�|�ee?�Q�@��a��B�#W��#ZOS;����Ƶ�a��}�4����v�{&C����R�5��2hm=t�LW���K��pK� �����˯��>�O���.��C
?*\~;���6b�*L&IIEND�B`�PK�X(U�?��fleshbot.recipe__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
fleshbot.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Fleshbot(BasicNewsRecipe):
    title = 'Fleshbot'
    __author__ = 'NA'
    description = "Fleshbot, Pure Filth."
    publisher = 'Fleshbot.com'
    category = 'news, sex, sex industry, celebs, nudes, adult, adult toys, sex toys'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = True
    language = 'en'
    masthead_url = 'http://fbassets.s3.amazonaws.com/images/uploads/2012/01/fleshbot-logo.png'
    extra_css             = '''
            body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
            img{margin-bottom: 1em}
            h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
                        '''
    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Articles', u'http://fleshbot.com/?feed=rss2')]

    remove_tags = [
        {'class': 'feedflare'},
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X����tt
flickr.png�PNG


IHDR  D����PLTE��������������������c�d��	i�5��:��T��U��Y��l��z�퉷�����������m�r�	������&��5��:��T��Y��l��z���������������&{�	}��tRNS=z��>g���IDATx���CD1�
���m���[��o�,�y~���$0�?��/Ͽ<�HTA��˖<[O���굠��G����p��=T�E�In��b�T��Wr�F��V�V�'Ƿ��KA�{��B?R}S�!�&{��`�#�y	f�q�#�ïIEND�B`�PK�X�����
flickr.recipe__license__ = 'GPL v3'
__author__ = 'Ricardo Jurado'
__copyright__ = 'Ricardo Jurado'
__version__ = 'v0.1'
__date__ = '22 February 2011'

'''
http://blog.flickr.net/
'''


from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1297031650(BasicNewsRecipe):

    title = u'Flickr Blog'
    masthead_url = 'http://flickrtheblog.files.wordpress.com/2008/11/flickblog_logo.gif'
    cover_url = 'http://flickrtheblog.files.wordpress.com/2008/11/flickblog_logo.gif'
    publisher = u''

    __author__ = 'Ricardo Jurado'
    description = 'Pictures Blog'
    category = 'Blog,Pictures'

    oldest_article = 120
    max_articles_per_feed = 10
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'UTF-8'
    remove_javascript = True
    language = 'en'

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h2{font-family: sans-serif; font-size:130%; font-weight:bold; text-align: justify; }
                               .published{font-family:Arial,Helvetica,sans-serif; font-size:80%; }
                               .posted{font-family:Arial,Helvetica,sans-serif; font-size:80%; }
                                 """

    keep_only_tags = [
        dict(name='div', attrs={'class': 'entry'})
    ]

    feeds = [
        (u'BLOG', u'http://feeds.feedburner.com/Flickrblog'),
    ]
PK�X����tt
flickr_es.png�PNG


IHDR  D����PLTE��������������������c�d��	i�5��:��T��U��Y��l��z�퉷�����������m�r�	������&��5��:��T��Y��l��z���������������&{�	}��tRNS=z��>g���IDATx���CD1�
���m���[��o�,�y~���$0�?��/Ͽ<�HTA��˖<[O���굠��G����p��=T�E�In��b�T��Wr�F��V�V�'Ƿ��KA�{��B?R}S�!�&{��`�#�y	f�q�#�ïIEND�B`�PK�Xl�Y��flickr_es.recipe__license__ = 'GPL v3'
__author__ = 'Ricardo Jurado'
__copyright__ = 'Ricardo Jurado'
__version__ = 'v0.1'
__date__ = '22 February 2011'

'''
http://blog.flickr.net/
'''


from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1297031650(BasicNewsRecipe):

    title = u'Flickr Blog'
    masthead_url = 'http://flickrtheblog.files.wordpress.com/2008/11/flickblog_logo.gif'
    cover_url = 'http://flickrtheblog.files.wordpress.com/2008/11/flickblog_logo.gif'
    publisher = u''

    __author__ = 'Ricardo Jurado'
    description = 'Pictures Blog'
    category = 'Blog,Pictures'

    oldest_article = 120
    max_articles_per_feed = 10
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'UTF-8'
    remove_javascript = True
    language = 'es'

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h2{font-family: sans-serif; font-size:130%; font-weight:bold; text-align: justify; }
                               .published{font-family:Arial,Helvetica,sans-serif; font-size:80%; }
                               .posted{font-family:Arial,Helvetica,sans-serif; font-size:80%; }
                                 """

    keep_only_tags = [
        dict(name='div', attrs={'class': 'entry'})
    ]

    feeds = [
        (u'BLOG', u'http://blog.flickr.net/es/feed/atom/')
    ]
PK�Xd����
fluter_de.png�PNG


IHDR  ��tRNSn���IDATH�c�O
���� 0ԉ����˗/�]�zN��z��W�~���d
�"��6��CVUV���IKK����0�HIJzyz�ؾ�h�kD�߿��~QQ@DD$?/���vD+W�D3������9?'W[[*��4��	�D���0���@�-�6	
�]��_<���H�۷c�ɞ]�������,���{��]�-HKMô��?�@����Q�� ����tFF��׮�/ZdC988֯_Ol@̆X`cm�i��+W�R?�<|�pVffDx���G��E�������ׯC�-$����/��n�?w^KSsoO������]�]�u�����Ͽ���_�~5��g ����+#�D@L�������nV�݂?~�_?nnLs�\]}����W,Y�[��d�߿}�MML1-�t�������_��SiE�`IEW�YU���؄���S,>�>j�����KF����)Db���֑���7�#��p��}��Ka���9Vg�P�zyx������l���ZZX�]��H�O�>	#�G�S��c/�&Ɍ����'L�0q�D�h�At��	�	ʛ�����IEND�B`�PK�X�Mz��fluter_de.recipe##
## Written:      2013-02-05
## Version:      v4.1
## Last update:  2013-02-05 V3, 2020-07-05 v4, 2023-06-16 v4.1
##
__license__   = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch fluter.de
'''

from calibre.web.feeds.news import BasicNewsRecipe

class AdvancedUserRecipe1313693926(BasicNewsRecipe):

    title = u' fluter. '
    description = 'fluter.de Magazin der Bundeszentrale für politische Bildung/bpb'
    language = 'de'
    encoding = 'UTF-8'

    __author__ = 'Armin Geller' # 2013-02-05 V3

    oldest_article = 14
    max_articles_per_feed = 50
    auto_cleanup = False

    feeds =  [
              (u'Inhalt:', u'https://www.fluter.de/rss.xml')
             ]

    keep_only_tags = [
                        dict(name='article', attrs={'class':'node node-article block fullWidth stage'})
                     ]

    remove_tags = [
                    dict(name='h2', attrs={'class':'element-invisible'})
                  ]

    extra_css =  '''
                 .field-group-format, .group_additional_info, .additional-info {display: inline-block; min-width: 8rem; text-align: center}
                 '''
PK�XMT�x�
�
focus_de.png�PNG


IHDR  szz�
QIDATx^��i���Y��}��}�{dz.{6��8�'i��!jjA��
$*�
ʒo !�(B%
 Z"���ťTA��K�,�����c�g:�g�3w���r7�-�B�>�_Gzt>�������b� �Қg����)I��c#���5`#p�oK�p]��W�S_k�
4
-t$�F PB�?Bi�A)T�
�R����1�)��L|T��������@�V��o60SIbӇH���jh�f,��M��	W��e��9�����/�*D����`�ѭ֮"�t?�8���,��JK����+X;	�4���R䲣��=�J�(ӿt
��Yֿr��' ��_��Oߧ�d��O�By��.]�W�A���#'���He�̥��bRq=a�i�DB�J�������#��ѵ�8��O�S���S���6�����߬�4�Mf�%�H��r�T�5���M��(�ҚE�m�ya��P��=��j+�b�^��5�ڳ|���Y,��'�$��g�CI|�s�X 2�G1(!�Z��4@ARjF�I�#Q0'�?(���R���~^�[�Ui>����MR�q���h�g�!B��lKN��؊�V���Xw��eQm{�>���"�L�A!U����/�;+E����I��kԱ�T��	�:���8q	��*��`a�˥u����._+�M�@��v�Zdd��n6����/�[K7x�__$o�%b�)��h�#�,�Qh���e�e�n���(w�������峜^�e�iq�q��l2 �b�C���B�������s��|����ށ/��t�cY��@6�뷮Q
,��C|w�Ϲ��2������:U�e���c���fO(��kŅ��J���g&�<����܇-�D�I=�L'<M��lI�/���X�M�u1��y|_��:�Էq��Qb$��@W��hSٹH�
��d�
�&��Ӵ��%>�����'lԈ�W�P�䝔U/�,��&Z��wgy��>vh�C9�جp�ߥ�Ui�cxF�p[Hz�9&��@�T<��k"�5)�����O�+
�])�-��xrGtqb�8��o���U��0���ᅨ �r����gn��fm��^aۼ���(�M[��1L�2��D@7�$�fm�1��o�#�.�	� �챖����
k~7�|�c�|r���e�^�቉���|��e�z�fۡ'	'G�^�b0dr��n��;�5FB	$�P(�%��O���2�������au��/񭕋x��m_�5o�S�-�����Q�?>{���9��>�����1\�MLڄ
�W/}���&s�1�Vw��	޸tpi���6	���32�:LUO"� ���
������tȤ�R|��
���O?�H�0[ի����ÐX�e�Q%e����i;z��~vJ-HLc�U��$
�;v39���*���z�K����l�=N]+Phj&��G>�9v��E�x�)�l켎0c��Ǹ���оG�c�Fx�o�D��"��yj�[���>�4/����.b��x:L�pn}���(��8+�Uf���N�Y(��X!����_ �u�H���i$h�$<u�n�]�$�)N�ւ�t��9�r�'�HG��;0F�6ج������5>~��nU9�Ye0e��i�_3�p�V��%n|ݓ�����0n>ϙ��M�}�'�*�(��/��W>�!�����G�F��X���Q&jJ�J3��2��1���B�<��f��w�_)�A�i|���HwQ�nu�]�")^-�Z]6�Mr�${b��2���ǐ"J��Rl�\)ֹ3�޴As;
b����+�0[���so�y*Lf��[6[����L)1�	��"l'wOe�i�7��p��v���N�_޿�R0��-[h޺]�;lcj������G���?¶��i>�K�װe��.~���y$�(�6n��k$�X\�9L&#(�ys�֡c���,��,�4|���)�<�@S�N/�Bp|�繺v���%J�_��Xߜ{ag���������0EW�>G�InԜ]7;��{��Bl5��ϱ|���q���J����7Z��1��"����z�l����"	A�A�\"�H��l���W�+8�Se��`,��iz�.�Z�@���c�9_,���l�!����w̭�I������A�h{H!�ia��bt��v�鵩H�����67��4��1�@H���CJJڞOO������Zi�fx��4��:��XE��ݡ��p�3�?�B"Jk�W����!�4�a;h|C��,V�+�$dB�w)9.C�خa4��E�Lg��;�X�^AZqZ�KX��
"bw��~�T�=Է��;
᝿��O)z�an�p d��)�!K�Ym�8Wir(��칄Ca�a�O����V�%f�w�M������<��ɏ��`���tJl�&�wܖ 
^�v�.����"�E��FY��S�LH�Qo��`�&o�8:�$A��Dk��H
ۍ)�b�z�j�6��������)�՝��U2Ï�S�N�ӥ��Bfp�vIEND�B`�PK�X��##focus_de.recipe'''
focus.de
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes

class AdvancedUserRecipe1305567197(BasicNewsRecipe):
    title = 'Focus (DE)'
    __author__ = 'unkn0wn'
    description = 'RSS-Feeds von Focus.de, best downloaded at the end of the week.'
    language = 'de'

    oldest_article = 7
    max_articles_per_feed = 25
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['width', 'height', 'style']
    masthead_url = 'https://www.focus-magazin.de/img/Focus_Logo.jpg'
    extra_css = '''
        .posMarker_oh { font-size:small; color:#404040; }
        .posMarker_he { font-size:large; font-weight:bold; }
        .leadIn { font-style:italic; color:#202020; }
        .caption { text-align:center; font-size:small; }
        .authorMeta, .displayDate { font-size:small; }
    '''

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.focus-magazin.de/')
        return soup.find('img', attrs={'class':'main-cover'})['src']

    feeds = [
        ('Politik', 'http://rss.focus.de/politik/'),
        ('Finanzen', 'http://rss.focus.de/finanzen/'),
        ('Gesundheit', 'http://rss.focus.de/gesundheit/'),
        ('Panorama', 'http://rss.focus.de/panorama/'),
        ('Digital', 'http://rss.focus.de/digital/'),
        ('Reisen', 'http://rss.focus.de/reisen/'),
        ('Andere', 'http://rss.focus.de')
    ]

    keep_only_tags = [
        classes('articleHead articleContent')
    ]

    remove_tags = [
        dict(name=['svg', 'script']),
        classes('socFbLikeShare video social_frame'),
        dict(attrs={'id': 'article-social-holder'})
    ]

    def preprocess_html(self, soup):
        if h1 := soup.find(attrs={'class':'articleIdentH1'}):
            h1.name = 'h1'
        if he := soup.find(**classes('posMarker_he')):
            he.name = 'div'
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        return soup
PK�X-�T��focus_pl.png�PNG


IHDR��h6LIDATxڕ��JA��ݙ3k��m�=g7�YTU�檙�EOQ�����Ա��3��ð�Q�/r�	�B�)��B���X.�2�v�|��f�$�>?އ��Q�p�0�QQuL��0z�������<,

�#�&���
��&�H�=�)����a50�[ijg���>�-V�3F�gw.̫���i�8O(l����i�
��P��ԉ�ia����!�
G��r�H���a2$͛��q!\�<5Ȧu��6�v�.Xx���KMBMc��ӭJ�^Y߬�*[������ƀr���ff�PR�9��FN9A��@.q-���
r�1�o��IEND�B`�PK�X@s��FFfocus_pl.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class NYTimes(BasicNewsRecipe):

    title = 'Focus'
    __author__ = 'Krittika Goyal'
    language = 'pl'
    description = 'Polish scientific monthly magazine'
    timefmt = ' [%d %b, %Y]'
    needs_subscription = False

    no_stylesheets = True
    keep_only_tags = dict(name='article', attrs={'class': 'content'})
    remove_tags_after = dict(name='div', attrs={'class': 'inner_article'})
    remove_tags = [
        dict(name='div', attrs={'class': ['social_btns']}),
    ]

    # TO GET ARTICLE TOC
    def nejm_get_index(self):
        return self.index_to_soup('http://www.focus.pl/')

    # To parse article toc
    def parse_index(self):
        soup = self.nejm_get_index()

        toc = soup.find('div', id='wrapper')

        articles = []
        feeds = []
        section_title = 'Focus Articles'
        for x in toc.findAll(True):
            if x.name == 'h1':
                # Article found
                a = x.find('a')
                if a is None:
                    continue
                title = self.tag_to_string(a)
                url = a.get('href', False)
                if not url or not title:
                    continue
                # if url.startswith('story'):
                url = 'http://www.focus.pl' + url
                self.log('\t\tFound article:', title)
                self.log('\t\t\t', url)
                articles.append({'title': title, 'url': url,
                                 'description': '', 'date': ''})
        feeds.append((section_title, articles))

        return feeds
PK�X]쭭��fokkeensukke.png�PNG


IHDR00W��|IDATx�՘Pٺ�Ow�`�qw�����q]ww�\4����[w�"D�@`� 3=�;�M������t�W-��r�B�nF�襛0��`Y�Ƞ����+�VT��z�k�?�-�į���wȘ�B&�Ļ$����J�Q�R�
�BD�ޗj1�K���^�݃�/�%��+�/��c����M�IN���D]��^�m�LFy�L�F�~��r�0=!{�DLJJix�S��>��u��~���J~\,�e�Qo����TZR���N@ҍ�E2��K�a���gI��x+G��Ϟ���
����r�2)"�
]�(��O���̀+�C�+�%hm>��8�0�/GO¦�e�>h?���v�l�ZDy��Z^o��EJ6���/&���y��7��o|0�?'%��)"v��s�(�
�F�?�����"3�ϞA�ywc<���1V���O��<�<N���³b8sz*4����#YU�C�컀�:���/���E�X��e��;sM	by�~��]���N��٨���g��S{ ^����&+i����>e�ݯ࿬Z��Zʷ0��7�=�.�� L�TB������):�JJ��4�*�p��aԊ��t�ӈⵈU�~?0� ��Ę�!�n�
��*O���i�P2���S[��>�t���FQe은QlG_V#{���,�r�:��<�՝U(y�LΜǂ�s���0�����Ǯ�
Y��On�x6h}�4t/��n@��G/�A�Ta��+��3`C�W�`��z�\��V��QT�&�f�ױ�*�ԌQ�00�Z�q���k�%R�f�f?h�}�|��2�:1�*чc(��p6�	|?` %3�!�Z0���ISO$��U�-��b�hV�NP���=�7�V��������wv��|2"�kގ������6�7N}���I�#+��&�2�?u� �h'Pq�(�2Ȟ�'M��������L���<��f穧�b��H�~3�|�3X�~FUH/�,�%�JT����'XV!﫱�U}U1�/��{�H�޺>`��~̌��e�?�F�G�,di�o�hk���q�գ9;#��#��]T,����B�ca�6��k7�e���.���ۼ������Ii;}1#�@V���X����]����60ধ�9mf�D̟?��dY��h�IK���釳����"9�-2p�C��r$�G$���\��9���	R֟6W�o�~��n�4Qx<M�ڽx̝x��~����OhXCg]ǐ�_P��c�~�)Y����+��d�n�QkbVH0�}�;u<
Z.��؎�k���/��ٱ|�v�.��`6�*�^�S�v8��g�!))��P�� m�`x?�}ئ��Pr�Ǣ��M��8���X��a~���P���6�P4�&o�?�!e����j��>���=!��z����ԉTjc���c�aT_n�9�����e,f[_�B��׏��Z��v����+��vڵ�'��x|g�˓ˊ"�0=�Z�&1�
�������H����f+m*0ב�E�l
�Ct/�0���;�^�;o�J�������l�.���z}������<v6��S�{�&3l`:%M������h��4�?�&ōC#��Q__O��Q�5>�{�I���n�ֵ�]��Y�篣i�
�vϟ1%��f�,��_���t��CF��&ի�՗�ޥuG��iTW��y�$�{;̓��'�.ύ�z	�{�X��2��rX�f]��*��ǟ�I���m*�=Шˠ��h~�~ج���1v�xs���n@w�lG�=�AAF�O�֋@�m�-T�9���;���w��+��b�[Pyyy���v,�{�Y�3�ɾ
x%=�˟��l�m֤��}�{'@���fǎ���̘1cWUz:N:)\:-��L
�i��v;---J�W�|�}w�ˢ��+й�;�{:~��g�\��y5qtpp$��hj�����)O�����]?<��p�%�9p�-���s�dL���&~�4_�uy6�6o;�^ҒRq��*(��C��bUq&�sxU�cK0n|�-'`6��K��SR��
h�FP�w|?��L�����	�8�0��n_���Xn�"��#б�z�G��;�J�� -VV"�Ӓj�����)��2M/#F�R���ON��qЮ����
���N���Ub��K;�����xíHDgc�7���1�~�U��z/�4�G�K���qK�C^����
���v���s�_��$�nދ
X�f�n��ͷ#{p��**���;o�f�艈	�>a4Mup�}��z!���n��ixd�v+�u�Xp�&�˚���@_?G��=21�;/
��?nݕ���cU�٬,��{n����>v,����,�v?pj���P,�W\q�b�D���L�aqnK2�d����5��y����N�H�"�9��8�MArb�1qd$�p��3y��4���7��l����>-��.���D썼�)���+/d~V^����aiF!�3��8����M��_FwJ�3�Ri�N־r�B썹����陹,L�gAf�Ȕ�R n�8Z]G��h�>8ؾ};��h|�~Z޾�ygf*DwDDDDe�D�@�ˬ�,fed�`s�����e����MgzZ��z�/2�ZeLLL)��g_r�t��~@f��|�JN;i��W^y}Xzt�������5��[HRh�
�":4꘍�}P��Imm�������s+��\˻���ig�S#��\�R)�(3��ű(��S3�?������r���=ҿ�KKK+�������Go����8ߺ�K
�)<����)DWd�yQ���2W�Y�O�38?���i�,̚,�e3�`:��@^t%&IEND�B`�PK�Xs�fokkeensukke.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class FokkeEnSukkeRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'nl'
    country = 'NL'
    version = 2

    title = u'Fokke en Sukke'
    publisher = u'Reid, Geleijnse & Van Tol'
    category = u'News, Cartoons'
    description = u'Popular Dutch daily cartoon Fokke en Sukke'

    conversion_options = {'comments': description,
                          'language': language, 'publisher': publisher}

    no_stylesheets = True
    extra_css = '''
                    body{font-family: verdana, arial, helvetica, geneva, sans-serif ; margin: 0em; padding: 0em;}
                    div.title {text-align: center; margin-bottom: 1em;}
                    '''

    INDEX = u'http://foksuk.nl'
    cover_url = 'http://foksuk.nl/content/wysiwyg/simpleimages/image350.gif'

    keep_only_tags = [dict(name='div', attrs={'class': 'cartoon'})]

    def parse_index(self):
        # A list with daynames as they _can_ appear in the index
        dayNames = ['maandag', 'dinsdag', 'woensdag',
                    'donderdag', 'vrijdag', 'zaterdag & zondag']
        soup = self.index_to_soup(self.INDEX)

        # Find the links for the various cartoons for this week and loop
        # through them
        index = soup.find('div', attrs={'class': 'selectcartoon'})
        links = index.findAll('a')
        maxIndex = len(links) - 1
        articles = []
        for i in range(1, len(links)):
            # There can be more than one cartoon for a given day (currently either one or two).
            # If there's only one, there is just a link with the dayname.
            # If there are two, there are three links in sequence: <a>dayname</a> <a>1</a> <a>2</a>.
            # In that case we're interested in the last two.
            if links[i].renderContents().decode('utf-8') in dayNames:
                # If the link is not in daynames, we processed it already, but if it is, let's see
                # if the next one has '1' as content
                if (i + 1 <= maxIndex) and (links[i + 1].renderContents().decode('utf-8') == '1'):
                    # Got you! Add it to the list
                    article = {'title': links[i].renderContents().decode('utf-8'
                        )+ ' 1', 'date': u'', 'url': self.INDEX + links[i + 1]['href'], 'description': ''}
                    articles.append(article)
                    # If there is a '1', there should be a '2' as well, but
                    # better save than sorry
                    if (i + 2 <= maxIndex) and (links[i + 2].renderContents().decode('utf-8') == '2'):
                        # Got you! Add it to the list
                        article = {'title': links[i].renderContents(
                        ).decode('utf-8') + ' 2', 'date': u'', 'url': self.INDEX + links[i + 2]['href'], 'description': ''}
                        articles.append(article)
                else:
                    # There is only one cartoon for this day. Add it to the
                    # list.
                    article = {'title': links[i].renderContents(
                    ).decode('utf-8'), 'date': u'', 'url': self.INDEX + links[i]['href'], 'description': ''}
                    articles.append(article)
        # Might as well use the weeknumber as title
        week = index.find('span', attrs={'class': 'week'}).renderContents().decode('utf-8')

        return [[week, articles]]

    def preprocess_html(self, soup):
        cartoon = soup.find('div', attrs={'class': 'cartoon'})

        title = ''
        img = soup.find('img', attrs={'alt': True})
        if img:
            title = img['alt']

        tag = new_tag(soup, 'div', [('class', 'title')])
        tag.insert(0, title)
        cartoon.insert(0, tag)

        # We only want the cartoon, so throw out the index
        select = cartoon.find('div', attrs={'class': 'selectcartoon'})
        if select:
            select.extract()

        freshSoup = self.getFreshSoup(soup)
        freshSoup.body.append(cartoon)

        return freshSoup

    def getFreshSoup(self, oldSoup):
        freshSoup = BeautifulSoup(
            '<html><head><title></title></head><body></body></html>')
        if oldSoup.head.title:
            freshSoup.head.title.append(self.tag_to_string(oldSoup.head.title))
        return freshSoup
PK�X�
#���fokus.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from datetime import datetime, timezone
from calibre.web.feeds.news import BasicNewsRecipe


WEB_SECTIONS = [
    ('Inrikes', 'inrikes'),
    ('Utrikes', 'utrikes'),
    ('Aktuellt', 'aktuellt'),
    ('Politik', 'politik'),
    ('Ekonomi', 'ekonomi'),
    ('Kultur', 'kultur'),
    ('Analys', 'analys'),
    ('Vetenskap', 'vetenskap'),
    ('Krönikor', 'kronika'),
    ('Opinion', 'opinion'),
    ('Veckans Fokus', 'veckans-fokus'),
    ('Synvinkel', 'synvinkel'),
    ('Minnesord', 'minnesord'),
    ('Debatt', 'debatt'),
    ('Andra kammaren', 'andra-kammaren'),
    ('Skuggkabinettet', 'skuggkabinettet'),
    ('Intervju', 'intervju'),
    ('Mötet', 'motet'),
    ('Veckans bråk', 'veckans-brak'),
    ('Johans Blogg', 'johans-blogg'),
]


class NoArticles(Exception):
    pass


class Fokus(BasicNewsRecipe):
    title = 'Fokus'
    main_url = 'https://www.fokus.se'
    description = "The last 7 days of news and articles from the Swedish current-affairs magazine 'Fokus'"
    encoding = 'utf-8'
    __author__ = 'Henrik Holm (https://github.com/h-holm)'
    language = 'se'
    ignore_duplicate_articles = {'title', 'url'}
    masthead_url = 'https://cdn.fokus.se/app/uploads/fokus/2022/05/12214931/fokus-logo.svg'
    no_stylesheets = True
    compress_news_images = True
    needs_subscription = 'optional'
    max_age = 7  # days
    remove_empty_feeds = True
    extra_css = 'img { display: block; width: 100%; height: auto }'

    remove_tags = [
        dict(name='div', attrs={'class': 'External-ad'}),
        dict(name='header', attrs={'class': 'Header'}),
        dict(name='div', attrs={'class': 'Header-expanded'}),
        dict(name='div', attrs={'class': 'Overlay'}),
        dict(name='div', attrs={'class': 'Search-expanded'}),
        dict(name='section', attrs={'class': 'Site__footer'}),
        dict(name='div', attrs={'class': 'Toaster'}),
        dict(name='div', attrs={'class': 'fbc-badge'}),
        dict(name='div', attrs={'class': 'Posts-by-related-cat'}),
        dict(name='div', attrs={'class': 'finite-scroll'}),
        dict(name='div', attrs={'class': 'Sidebar'}),
        dict(name='div', attrs={'id': 'single-comments'}),
        dict(name='footer', attrs={'class': 'Single__footer'}),
        dict(name='div', attrs={'class': 'Social-share'}),
        dict(name='div', attrs={'class': 'mediaconnect-paywall'}),
        dict(name='svg', attrs={'class': 'icon'}),
        dict(name='figure', attrs={'class': 'wp-block-audio'}),
    ]

    remove_tags_after = [
        dict(name='div', class_='Single__content'),
    ]

    keep_only_tags = [
        dict(name='h1', class_='Single__title'),  # Title.
        dict(name='h1', class_='Longread__title'),  # Alt. title.
        dict(name='p', class_='Single__lead'),  # Lead text.
        dict(name='p', class_='Longread__lead'),  # Alt. lead text.
        dict(name='figure', class_='Single__thumbnail'),  # Image.
        dict(name='figure', class_='Longread__thumbnail'),  # Alt. image.
        # dict(name='p', class_='Meta__author'),  # Author.
        # dict(name='time', class_='Meta__updated'),  # Last updated.
        # Main article.
        dict(name='div', class_='mediaconnect-protected-content'),
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username and self.password:
            br.open('https://www.fokus.se/auth/logga-in')
            br.select_form(name='loginForm')
            br['j_username'] = self.username
            br['j_password'] = self.password
            br.submit()
        return br

    def parse_article_blurb(self, article_blurb):
        desc = ''
        if a_tag := article_blurb.find('a', href=True):
            url = a_tag['href']
            if url.startswith('/'):
                url = f'{self.main_url}{url}'
            if title_tag := a_tag.find('h2', {'class': 'Blurb__title'}):
                title = self.tag_to_string(title_tag)
                if time_tag := a_tag.find('time', {'class': 'Blurb__date'}):
                    swedish_date_str = self.tag_to_string(time_tag)
                    datetime_str = time_tag['datetime']
                    datetime_time = datetime.strptime(
                        datetime_str, '%Y-%m-%dT%H:%M:%S%z')
                    now = datetime.now(timezone.utc)
                    delta = now - datetime_time
                    if delta.days > self.max_age:
                        self.log.debug(
                            f"\tSkipping article '{title}' as it is too old")
                    else:
                        if desc_tag := a_tag.find('div', {'class': 'Blurb__summary'}):
                            desc = self.tag_to_string(desc_tag)
                            if in_cooperation_with_tag := a_tag.find('p', {'class': 'Blurb__meta'}):
                                desc += f' ({self.tag_to_string(in_cooperation_with_tag)})'
                        return {'title': title, 'url': url, 'description': desc, 'date': swedish_date_str}

    def parse_web_section(self, soup, slug):
        def log(article):
            log_message = f"\t{article['title']} : {article['date']} : {article['url']}"
            if article.get('description'):
                log_message += f" : {article['description']}"
            self.log(log_message)
        try:
            article_blurbs = soup.find_all('article', {'class': 'Blurb'})
        except AttributeError:
            article_blurbs = []
        if not article_blurbs:
            raise ValueError(f'Failed to find article blurbs for slug: {slug}')
        for article_blurb in article_blurbs:
            if (article := self.parse_article_blurb(article_blurb)):
                log(article)
                yield article

    def parse_index(self):
        feeds = []
        for section_title, slug in WEB_SECTIONS:
            url = f'{self.main_url}/{slug}'
            try:
                soup = self.index_to_soup(url)
            except Exception:
                self.log.error(f'Failed to download section: {url}')
                continue
            self.log(f'Found section: {section_title}')
            articles = list(self.parse_web_section(soup, slug))
            if articles:
                feeds.append((section_title, articles))
        if not feeds:
            raise NoArticles(
                'Could not find any articles. Either the fokus.se server is having issues and '
                'you should try later or the website format has changed and the recipe needs '
                'to be updated.'
            )
        return feeds
PK�X���)��	folha.png�PNG


IHDR  D���PLTE�����������������������������������������������������������������������������������������پ�������������ն�޲�ݮ�۬�֯�Ӣ�ܬ�Ҫ�ѥ�դ�ɚ�✶Й�ё�ޚ�Θ�̞�ƕ�͒�ϕ�ɐ�ȕ�ŗ�Ð�č����Ŕ��������������������������������q��p��z��~��z��n��j��m��j��g��g��b��b��f��d��^��]��X��[��~��{��~��z��}��x��v��t��{��w��q��d��`��a��a��a��j��f��^��X��]��Z��U��T��U��Q��Z��Z��O��L��T~�L�I~�J}�Ay�N|�I|�Hx�O|�Ju�Ez�Ex�Dv�Et�At�@p�]}�Z{�Ux�Qt�Ow�Bm�Dj�@g�:r�>q�=r�=p�8o�8l�5m�3j�0i�.g�:k�:j�7j�4g�4d�0c�<c�9`�.e�+d�+b�)a�.a�'b�0_�6_�6]�0Z�*^�'^�%\�!\�!Y�,\�(\�)X�(U�&Y�$X�!U�'V�#S�V�V�U�T�S�Q�R�P�N�J�$R}!O}!Ly$GuOLJyJwJH{HFzFt@pCs@pF}D{
AyBu?p?v
>q<s<w9q=n;o	:k:m8l7j7n4l6i4h2j3f2f0c-g-d-a,a)d'b(](^%\#Z!XU���`IDATx�MoTU��=��;w�N[J+4
����7����K7]���Bh
�t�~��EB��{�e����D��s
u.�)�r6L*"��i�<T���ms��%��V�K�O�y�M��o��'
�>�H�in�/?�7�'뤤�8n˭O�3�z�ߟm�6��q�C��Ƕ�s��l�{�O�]���ͼ������~��VY���^ɋkjs-Q�:w}J�B��G����7_�5E�洈edDX���]��f�KEiRN�:>Mwn,��殦��;�����N�^��������dJĪ�R��<{�ΦZ�rP�[a���:�g��>:�x�X�hK]ZƳ_ʳw�t�h)��h�E��|u�<�iA��!u�H.òk�#�)(r���V����^�����MJ3���N�>�M�b�"5��v�����w�]m��@�Ȳ&E$�����lv#CH20]N{�)W�M$&�A�r�0!�I4
�(�(��<o�l^��/H�����Ȼ?��t(���o�Y�/�\L�X(P������7W1V�qr�-�u6̛VQ�&��8N�M�]ΈZ+Ԝ�S�?�=��.IEND�B`�PK�XWQ�G''folha.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.folha.uol.com.br
'''
from calibre.web.feeds.news import BasicNewsRecipe
try:
    from urllib.parse import quote_plus
except ImportError:
    from urllib import quote_plus


class Folha_de_s_paulo(BasicNewsRecipe):
    title = u'Folha de São Paulo - portal'
    __author__ = 'Darko Miletic'
    description = 'Um Jornala a servicao do Brasil'
    publisher = 'Folhapress'
    category = 'news, politics, Brasil'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'pt_BR'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://f.i.uol.com.br/fsp/furniture/images/lgo-fsp-430x50-ffffff.gif'
    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
    }

    remove_tags = [
        dict(name=['meta', 'link', 'base', 'iframe', 'embed', 'object'])]
    keep_only_tags = [dict(attrs={'id': 'articleNew'})]

    feeds = [

    (u'Poder', u'http://feeds.folha.uol.com.br/poder/rss091.xml'),
    (u'Mundo', u'http://feeds.folha.uol.com.br/mundo/rss091.xml'),
    (u'Mercado', u'http://feeds.folha.uol.com.br/mercado/rss091.xml'),
    (u'Cotidiano', u'http://feeds.folha.uol.com.br/cotidiano/rss091.xml'),
    (u'Esporte', u'http://feeds.folha.uol.com.br/esporte/rss091.xml'),
    (u'Ilustrada', u'http://feeds.folha.uol.com.br/ilustrada/rss091.xml'),
    (u'F5', u'http://feeds.folha.uol.com.br/f5/rss091.xml'),
    (u'Ciência', u'http://feeds.folha.uol.com.br/ciencia/rss091.xml'),
    (u'Tec', u'http://feeds.folha.uol.com.br/tec/rss091.xml'),
    (u'Ambiente', u'http://feeds.folha.uol.com.br/ambiente/rss091.xml'),
    (u'Bichos', u'http://feeds.folha.uol.com.br/bichos/rss091.xml'),
    (u'Celebridades', u'http://feeds.folha.uol.com.br/celebridades/rss091.xml'),
    (u'Comida', u'http://feeds.folha.uol.com.br/comida/rss091.xml'),
    (u'Equilibrio', u'http://feeds.folha.uol.com.br/equilibrioesaude/rss091.xml'),
    (u'Folhateen', u'http://feeds.folha.uol.com.br/folhateen/rss091.xml'),
    (u'Folhinha', u'http://feeds.folha.uol.com.br/folhinha/rss091.xml'),
    (u'Ilustrissima', u'http://feeds.folha.uol.com.br/ilustrissima/rss091.xml'),
    (u'Saber', u'http://feeds.folha.uol.com.br/saber/rss091.xml'),
    (u'Turismo', u'http://feeds.folha.uol.com.br/turismo/rss091.xml'),
    (u'Panel do Leitor', u'http://feeds.folha.uol.com.br/folha/paineldoleitor/rss091.xml'),
    (u'Publifolha', u'http://feeds.folha.uol.com.br/folha/publifolha/rss091.xml'),
    (u'Em cima da hora', u'http://feeds.folha.uol.com.br/emcimadahora/rss091.xml')
    ]

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        curl = url.partition('/*')[2]
        return curl

    def print_version(self, url):
        return 'http://tools.folha.com.br/print?site=emcimadahora&url=' + quote_plus(url)

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.folha.uol.com.br/')
        cont = soup.find('div', attrs={'id': 'newspaper'})
        if cont:
            ai = cont.find('a', href='http://www1.folha.uol.com.br/fsp/')
            if ai:
                return ai.img['src']
        return None
PK�X:�J	��folhadesaopaulo.png�PNG


IHDR(-STPLTE3f
=pFy MyP�&Y�3f�<o�J}�V|�`��X��f��~����������Ɣ�Ξ�ѥ�ث�ѳ�Ӄ��������������r_IDATxڍȅ
��s7\�����p�k���8��G��h��H��l������`)�28
��=��	]��HSzH�#8�<yC���.Y����ce[�IEND�B`�PK�X�)�

folhadesaopaulo.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class Folha(BasicNewsRecipe):
    title          = 'Folha de São Paolo'
    language       = 'pt_BR'
    __author__     = 'Bola de Fogo'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        (u'Poder', u'http://feeds.folha.uol.com.br/poder/rss091.xml'),
        (u'Cotidiano', u'http://feeds.folha.uol.com.br/cotidiano/rss091.xml'),
        ('Painel', 'http://painel.blogfolha.uol.com.br/feed/'),
        ('Josias', 'http://josiasdesouza.blogosfera.uol.com.br/feed/'),
        ('Milton Neves', 'http://blogmiltonneves.bol.uol.com.br/feed/'),
        ('Noblat', 'http://noblat.oglobo.globo.com/rss/ultimas.feed'),
        (u'Mercado', u'http://feeds.folha.uol.com.br/mercado/rss091.xml'),
        (u'Mundo', u'http://feeds.folha.uol.com.br/mundo/rss091.xml'),
        (u'Esporte', u'http://feeds.folha.uol.com.br/esporte/rss091.xml'),
        (u'Comida', u'http://feeds.folha.uol.com.br/comida/rss091.xml'),
        (u'Tec', u'http://feeds.folha.uol.com.br/tec/rss091.xml'),
        (u'Ilustrada', u'http://feeds.folha.uol.com.br/ilustrada/rss091.xml'),
        (u'Opiniao', u'http://feeds.folha.uol.com.br/opiniao/rss091.xml'),
        (u'Ciência', u'http://feeds.folha.uol.com.br/ciencia/rss091.xml'),
        (u'Equilíbrio e Saúde', u'http://feeds.folha.uol.com.br/equilibrioesaude/rss091.xml'),
        (u'Elio Gaspari', u'http://feeds.folha.uol.com.br/colunas/eliogaspari/rss091.xml'),
        (u'Tati Bernardi', u'http://feeds.folha.uol.com.br/colunas/tatibernardi/rss091.xml'),
        (u'PVC', u'http://feeds.folha.uol.com.br/colunas/pvc/rss091.xml'),
        (u'Clóvis Rossi', u'http://feeds.folha.uol.com.br/colunas/clovisrossi/rss091.xml'),
        (u'Hélio Schwartsman', u'http://feeds.folha.uol.com.br/colunas/helioschwartsman/rss091.xml'),
        (u'Janio de Freitas', u'http://feeds.folha.uol.com.br/colunas/janiodefreitas/rss091.xml'),
        (u'João Pereira Coutinho', u'http://feeds.folha.uol.com.br/colunas/joaopereiracoutinho/rss091.xml'),
        (u'Juca', u'http://feeds.folha.uol.com.br/colunas/jucakfouri/rss091.xml'),
        (u'Vinicius Torres Freitas', u'http://feeds.folha.uol.com.br/colunas/viniciustorres/rss091.xml'),
        (u'Monica Bergamo', u'http://feeds.folha.uol.com.br/colunas/monicabergamo/rss091.xml'),
        (u'Alexandre Schwartsman', u'http://feeds.folha.uol.com.br/colunas/alexandreschwartsman/rss091.xml'),
        (u'Vinicius Mota', u'http://feeds.folha.uol.com.br/colunas/viniciusmota/rss091.xml'),
        (u'Tostao', u'http://feeds.folha.uol.com.br/colunas/tostao/rss091.xml'),
        (u'Reinaldo Azevedo', u'http://feeds.folha.uol.com.br/colunas/reinaldoazevedo/rss091.xml'),
        (u'Contardo', u'http://feeds.folha.uol.com.br/colunas/contardocalligaris/rss091.xml'),
        (u'Samuel Pessoa', u'http://feeds.folha.uol.com.br/colunas/samuelpessoa/rss091.xml'),
        (u'Onbudsman', u'http://feeds.folha.uol.com.br/colunas/paula-cesarino-costa-ombudsman/rss091.xml'),
        ('Mariliz Pereira', 'http://feeds.folha.uol.com.br/colunas/marilizpereirajorge/rss091.xml'),
        ('X', 'http://xdesexo.blogfolha.uol.com.br/feed/'),
    ]
PK�X��folhadesaopaulo_sub.png�PNG


IHDR  D����PLTE����������x�y�y�����x�y�y�|�}�{�y�{�z�{�x�z�z�z�y�y�y�z�y�y�y�x�y�y�x�y�x�y�y�y�y�x�y�x�y�y�y�x�y�x�U}t2tRNS

"&()+69:GMjksu~������������������������B��IDATx���7�0EчID�s����q`����
:n}��C�j�oz|�(���o}j�IVȚ33���@gPV@T�(`(},�*`k��E�_���6yc`���Z��׿�R��]�f������7��$�;t�(7DIEND�B`�PK�X�\&BBfolhadesaopaulo_sub.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe

import re
import datetime


class FSP(BasicNewsRecipe):

    title = u'Folha de S\xE3o Paulo'
    __author__ = 'Joao Eduardo Bertacchi - lc_addicted, 2020 Leonardo Amaral - leleobhz'
    description = u'Printed edition contents. Folha subscription required (UOL subscription currently not supported).' + \
                  u' [Conte\xfado completo da edi\xe7\xe3o impressa. Somente para assinantes Folha. N\xE3o suporta assinantes UOL]'

    today = datetime.date.today()

    masthead_url = 'http://f.i.uol.com.br/fsp/furniture/images/lgo-fsp-430x50-ffffff.gif'

    language = 'pt_BR'
    no_stylesheets = True
    max_articles_per_feed = 100
    remove_javascript = True
    needs_subscription = True

    keep_only_tags = [
        dict(name='div', id='articleNew'), dict(
            name='table', attrs={'class': 'articleGraphic'}),
        dict(name='article', id='news'),
    ]

    publication_type = 'newspaper'
    simultaneous_downloads = 5

    remove_attributes = ['height', 'width']

    # The following is an attempt to fix the problem with the section names,
    # but whenever new sections are added it can generate accentuation
    # problems still
    section_dict = {'cotidian': 'cotidiano', 'ilustrad': 'ilustrada',
                    'quadrin': 'quadrinhos', 'opiniao': u'opini\xE3o',
                    'ciencia': u'cincia', 'saude': u'sa\xfade',
                    'ribeirao': u'ribeir\xE3o', 'equilibrio': u'equil\xedbrio',
                    'imoveis': u'im\xf3veis', 'negocios': u'neg\xf3cios',
                    'veiculos': u've\xedculos', 'corrida': 'folha corrida',
                    'turismo': 'turismo'}

    # this solves the problem with truncated content in Kindle
    conversion_options = {'linearize_tables': True}

    extra_css = """
#articleNew { font: 18px Times New Roman,verdana,arial; }
img { background: none !important; float: none; margin: 0px; }
.newstexts { list-style-type: none; height: 20px; margin: 15px 0 10px 0; }
.newstexts.last { border-top: 1px solid #ccc; margin: 5px 0 15px 0; padding-top: 15px; }
.newstexts li { display: inline; padding: 0 5px; }
.newstexts li.prev { float: left; }
.newstexts li.next { float: right; }
.newstexts li span { width: 12px; height: 15px; display: inline-block; }
.newstexts li.prev span { background-position: -818px -46px; }
.newstexts li.next span { background-position: -832px -46px; }
.newstexts li a { font: bold 12px arial, verdana, sans-serif; text-transform: uppercase; color: #999; text-decoration: none !important; }
.newstexts li a:hover { text-decoration: underline !important }
.headerart { font-weight: bold; }
.title { font: bold 39px Times New Roman,verdana,arial; margin-bottom: 15px; margin-top: 10px; }
.creditart, .origin { font: bold 12px arial, verdana, sans-serif; color: #999; margin: 0px; display: block; }
.headerart p, .fine_line p { margin: 0 !important; }
.fine_line { font: bold 18px Times New Roman,verdana,arial; }
.fine_line p { margin-bottom: 18px !important;  }
.fine_line p:first-child { font-weight: normal; font-style: italic; font-size: 20px !important; }
.eye { display: block; width: 317px; border-top: 2px solid #666; padding: 7px 0 7px; border-bottom: 2px solid #666; font-style: italic; font-weight: bold; }
.kicker { font-weight: bold; text-transform: uppercase; font-size: 18px; font-family: Times New Roman,verdana,arial !important; }
.blue { color: #000080; }
.red { color: #F00; }
.blue { color: #000080; }
.green { color: #006400; }
.orange { color: #FFA042; }
.violet { color: #8A2BE2; }
.text_footer { font-size: 15px; }
.title_end { font-size: 23px; font-weight: bold; }
.divisor { text-indent: -9999px; border-bottom: 1px solid #ccc; height: 1px; margin: 0; }
.star { background: none !important; height: 15px; }
.articleGraphic { margin-bottom: 20px; }
"""

    # This is the code for login, here a mini browser is called and id entered
    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://login.folha.com.br/login')
            br.select_form(action="https://login.folha.com.br/login")
            br['email'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    # Parsing the index webpage
    def parse_index(self):

        # In the last version, the index page has become simpler:
        INDEX = 'https://www1.folha.uol.com.br/fsp/'
        self.log('--> INDEX set ', INDEX)
        soup = self.index_to_soup(INDEX)

        feeds = []
        articles = []
        section_title = u'Primeira p\xe1gina'

        for post in soup.findAll('a'):
            strpost = str(post)
            if re.match('<a href="https://www1.folha.uol.com.br/.*/"><svg aria-hidden="true" class="icon icon--star"', strpost):
                if articles:
                    feeds.append((section_title, articles))
                    self.log()
                    self.log(
                        '--> new section found, creating old section feed: ', section_title)
                # section_title = post['name']
                section_title = self.tag_to_string(post)
                if section_title in self.section_dict:
                    section_title = self.section_dict[section_title]
                articles = []
                self.log('--> new section title:   ', section_title)
            elif strpost.startswith('<a href="/fsp/cp'):
                break
            elif strpost.startswith('<a href'):
                url = post['href']
                if url.startswith('http://www1.folha.uol.com.br/') or url.startswith('https://www1.folha.uol.com.br/') :
                    title = self.tag_to_string(post)
                    self.log()
                    self.log('--> post:  ', post)
                    self.log('--> url:   ', url)
                    self.log('--> title: ', title)
                    articles.append({'title': title, 'url': url})

        if articles:
            feeds.append((section_title, articles))

        del feeds[0]

        return feeds
PK�X�ެ�ttfolkebladet_dk.png�PNG


IHDR  ��;IDATHKM�[�]U�3k������N/)����B���Vc�M �@j��Z���U�f!��'�� ���)�@�	PB�����|�s�����>����$�f�?�w�~2={� �'����h
*Ma����hP�dA`(U%*�A���@��t�liC	�	 tJ
L`��B��(B��(0$/rC 4�a)��%0%Ƣ@�@Ȓ�9b(@1aX�

bB������[R��+OU1
����HѥLLI
)%�
B
�tÒL	��	x�B�D(_�$L@\��I�d��Q(�Ń�� �U47-�	L���ŷ(���tс��@`B�P����p�E��sd8�Π�� H��Х(@!D!�_g�L �!�I���I@�Àz��8k�K!#�p8���Z-N�0=��"�3S��Wu�	�X��8 ��,���Y�l†)�����k���?_;���$�YG�v�֬ś6n���[�~�o����j��B��;W�X�ґ��}��|xaj�͗\��;�oX�,�KDY�����=r���l7j�CD��z�kW�<��3��硃?~������^�aj�k��uݲV�����tk͆F�ן�x����~(I겼G�s����'&�m���v�Vof�D6n�xavzժ5QT�Q���V{LVM�u�^}����\��Z�z
��D�~���秧n����^9��d��D}c����*q}b�֛nٴn��ɓ��#&Ϟ���ދw3ݹΪ��WjHB��j�;�z~j2��Ti,[>��<���mW��/�R:�A�����}��w�����7^��ī��_�vӦM���M7ݴo߾_��^�Dz�׮��W�htj���_������Ү���V��m4@�Z��G�����;��y�m�n���ecLMu��V��j��j5Y^oջi�f�O}��A�]�&��E+�i��c2M��s@Lu��Z}j���|��ٳs�?���7�\�52R�8�q�1�AT���4��s2���9-���Z�i��o}����h8���+�ƊC�?�����a�`	��C�@�p���J���ǰ0�����I
��s��}��}_����.Ͳl~r�ښ@\y��~��/��9ʥ$�\�0�%�f�*B�ryff�a
��l�@S��t��+��b�z�oO<��3K�F=��&�?���w���"�Ѩ�\��Y��LD��B(�"�͕�Q��R�V�U�-'ٰ?�9�|o�l����7\�u˗���u�w�7y�\E���f�+�HGㅙ�j{�̹s�(�
G�zo�K�T�F�\ν���wOw�-o�6�)��+o:|���dw!�r��__<��c4+�J�֭]����?z߁�+�<��Y�$����N���[o�E��^>�r��q����"�vͪao�Bf9͎?��ɓ�^��jw$[���=7\[R��a��,U�Y�Q�U�S��''��({ڝv��{�ċL����\�i�s~f�|ɗb�|��yƤ�����|s�_��B2�;�A��1��~�?�<uQɗ�e��܅�jY2W�Z�R��4�/, �?:�'r깩�R%و�ۮ���];7_z�v}v����~����8�[Pa��]�F�Xn�nw5�]�R�{�07{��-���&��zMz��ArUx��2')"*Ε��(�
�$IӔd��(�"f����2�t�`�@1#��J�������Š!S��3U!�<�Ӑ�y&�[oB(�4��<K��R��R�S�Q��d@�c(T��BBh�1S�E�(L �U�7Z`$ �(E�:hP`0�
UUD53��	����<I@*�#H
@2gI�,A	�*a��D�$
�*��@B
� GA�T�(����&���@4[�#[D,%�P��
TE 
"@@H��R�4�(<(B@DT(� �Z@��$
f�R��fbF)
�J��"�����t'N d �d ���]���C�IEND�B`�PK�XFԓ��folkebladet_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Folkebladet
'''


class Folkebladet_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Folkebladet'
    description = 'Dine lokale nyheder på nettet'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Folkebladet', 'http://folkebladet.dk/feed/'),
        ('Kommentarer', 'http://folkebladet.dk/comments/feed/'),
    ]

PK�Xh�ѣ��folkebladetdjursland_dk.png�PNG


IHDR���R0PLTE����0��3r�@��p��qZk~Uc��ן�����86���������"a��qIDATc``�w
H�P`�[��xJ�5�q��ݛs/q-`�z����ao�y2�N�K�̻w\�e�ɶ{w�T~ �}�� �/T
�ج��n Ȋ�pKa��?0Y7xc~IEND�B`�PK�XM3z��folkebladetdjursland_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Folkebladet Djursland
'''


class FolkebladetDjursland_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Folkebladet Djursland'
    description = 'Lokale og regionale nyheder'
    category = 'newspaper, news, localnews, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Nyheder', 'http://dinby.dk/folkebladet-djursland/rss'),
    ]

PK�X4G�Z//folketidende_dk.png�PNG


IHDR  szz��IDATx�����AF�k�VP�6�ԶͰ�նm۶m�_O�Nvvfj�I�8�{ww<�������L�څB��j7�0&a7var{���|,GI��1�1>���/E}���tr	���*���b�ql�A4�+m ����hDQFB,
�1��AK]mfA4r( ����h�P����B�T�h���3,����N#q!���!���-��V��A��y��\�pΎ�u�:P@mH#����Z���|j@h����8�� �è��_FԀ�F.���1�e�+!7j
���ٸ5�)���Y�x��2��E\�Ѓ����\\�0��t_����\�d�\��4�&'�4�P��̈k�t�C�2R�x�r�oCl�|!����.-c'!�B6�*�&��X�`=<Ao����0���/����Ga8��#χ�]m�|��`1��2���|��1u�0#7Z���IEND�B`�PK�X~D���folketidende_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
folketidende.dk
'''


class Folketidende_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'folketidende.dk'
    description = 'Lokalt nyhedssite, med nyheder og lokalstof om Lolland og Falster'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('folketidende.dk - Lolland &amp; Falster samlet på et sted', 'http://folketidende.dk/rss-nyhedsbrev.xml'),

    ]

PK�X߇��00fontanka.png�PNG


IHDR  szz��IDATxڽW�#�E,�-� �����O�|�c�w���������]�+U�Ց�
g���0����=3&`�	�6ë���w���.��n]�6��r�9�o͍���Gu�U�]L�3�O�6���|I8�Ds��&f9�_Y��H_�x�7���v�5���C��5�/� ����g����eS�-�gZC����G�{��^p�|����O�?�j����彞�/��'��y)�
#�ɵ6VeVO:���@lvb�Z�Y��Q2h�&���/̊|ɧ�f(�eދL��k? �p&vE��d�_F��
�oG��n�]H_?���H�_gZ�"��\������By�_x����}��;�}z����W���`�a�}M�@?{t��㐾v�����;X�Fv�i�mT&��u&tE6r�S;��)�~�ߌ���b�`U�8⦠� �i2��!6��l���T�hg�t�Y��M������!���Cb�x�N*W��S&#���m�4���3w�!6�FL�nN�0yW�hZ����#�m"]�����g �w1��뱯#Ze�:��;�~p�_D��tS���ӲG�r���Q���i
��)��Ϲ)���g�"�s.�� ����O�)�W!�����(dp�gɮ� :�9c^bO�����R���ˇ �o���ԙ=�ܾgj7$����n�7��p6;f"�{�tD�i�PY�>�D%
�!��T���=�d�"+���#y���>���@:��i�40��"]+�kژ���D�@1 :
�s�=�I�=#v��B��Ĉ���<��H���sd���q�����[
u��혒���-�}2��PQ$v�ϑ�b����	�=3J����pF�Ŗz�ߗ�jȚ������	�B"�o�Wz>�����ad����-:4�<nD��n=W����A�.��=��^��j��5��DX��o��F�{��<����{зa1�^MS�Yn{5����� A|����jVpƅ
�uc	t��i�kL;f�k�>H˨
 �@��g���!��Zv<9o��{ldn�	
�)2�o���t����r����"�g.�K���ԙ��?�p�՚�~p� j]��}Q� �?��\b�(��̭ӈ/�� 犝�I7-��{�������@:���шt44�_�;���*A�~9���nף��L�~�!��X{���Ժi��b���eH�2�.#}�"6\��!�l��0׿f���.����"�҂�b�|��y���*��2%�X��Į������Ė 
��}����Mf��|�;a���Y��.{�_�'�b��0�}b!�v�)=�V�F�q��C."�5�"���_��l��vJ�
����[�\����5r�c~L��i4�x��yӧ��5�8�ߵ
��I]���Ҋ�9�?ͻ"�
q(�MqKiaJ�"pL���
��L�&��(xiC�Q�q?(�%�@8;A�t��InD�wi#}�$�,)�]Y��������[2�X
nJ�%� �v��e��C�\�4�IM�ت]2S���ٞ���!6��5�ݖ3��.�c� �U�d�-8��΄7Xn^�,2�Λ�Q�-/2:��0�J|\��;G��[��P����`rV�"�KǤL�^��G��Dz�h�8��y�����p8=K_�z����b	SGj�����Ou�ב_G1�x����~��ۘ]IEND�B`�PK�XW����fontanka.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Fontanka(BasicNewsRecipe):
    title = '\u0424\u043E\u043D\u0442\u0430\u043D\u043A\u0430'
    __author__ = 'bugmen00t'
    description = '\u0415\u0436\u0435\u0434\u043D\u0435\u0432\u043D\u043E\u0435 \u043F\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0441\u043A\u043E\u0435 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E-\u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0441\u0435\u0442\u0435\u0432\u043E\u0435 \u0438\u0437\u0434\u0430\u043D\u0438\u0435.'  # noqa
    publisher = '\u0410\u041E "\u0410\u0416\u0423\u0420-\u041C\u0415\u0414\u0418\u0410"'
    category = 'blog'
    cover_url = u'https://www.fontanka.ru/longreads/69505589/2015/images/tild3834-3362-4166-b239-366134363733____-01.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='section', attrs={'itemprop': 'articleBody'})

    remove_tags = [
        dict(name='div', attrs={'class': 'ADdj ADc5'}),
        dict(name='div', attrs={'class': 'DLj1'}),
        dict(name='div', attrs={'class': 'DTrp'}),
        dict(name='div', attrs={'class': 'EHed'}),
        dict(name='div', attrs={'class': 'FHwp'}),
        dict(name='div', attrs={'class': 'ENr-'}),
        dict(name='div', attrs={'class': 'ENt7'}),
        dict(name='div', attrs={'class': 't004'}),
        dict(name='div', attrs={'class': 't120'}),
        dict(name='div', attrs={'class': 't123'}),
        dict(name='div', attrs={'class': 't405'}),
        dict(name='div', attrs={'class': 't463'}),
        # For articles from https://doctorpiter.ru
        dict(
            name='div', attrs={'class': 'article__block article__block_type-links'}
        ),
        dict(name='div', attrs={'class': 'feedback-request-form__before'}),
        dict(name='div', attrs={'class': 'related-entities-container'}),
        dict(name='div', attrs={'class': 'tags article-footer__tags'}),
        dict(name='hr', attrs={'class': 'article-footer-divider'})
    ]

    feeds = [('Fontanka.ru', 'https://www.fontanka.ru/fontanka.rss')]
PK�XbW�dd
fooballua.png�PNG


IHDR  ��tRNSn��	pHYsOOc���IDATHǵVMoU=�7c�c��q\��M��*� Q���`��?�T��m�쑺���TR�4�uJp������{��p0���N�O�X�q��;W�|���!��c��!=�XĊ=���ގ�Ft~�+��HF�����ŭ�n�"�x��(���o7�Yʕ�b�aZ�Vz�Y��w�/^��O�[�V�RF0@��%>l*(��A�1烱���#�]��
��^0W�#&vy5���ǿ�+EC4 Em׾���.L�i
��Ԡ��y������B�����@�n�:Q-抱���~:v������n�Yh@
s�V:���Ԃ��:+���I׎�l�Y�-C`|�f4��NU!p�
c���7����H�J:����b�[�i8��`�4+N��̀�xګ՟ܽo�ס��x��d) �0�N���f+�J�$"�e�iK3l.~�8��8
���IX�Ow�T��f��v����ŠE�qH���k]���l��R�Ko�p�iX+�KL<|��R��>,-x�K҄��]��Ӥ��p����nn?X~�m�83(���ԼXi�#�ھ;Ŋ�p.�/=Z��Y��0�ͩ
O��q�$��������Z���A�@|�Ɓ�_�]�.L��Gf���un�?��G���ǯ��p?�Ҟ�!"�Tb��g+~������@E6�<u9��M����۵L�w�Tlӵp�\�&��Q�Z�
�s��1���߹w�i��2G��Ke��)C�p�`����Ħ�|��0�l�m��/fޙ�2QpT�h�N��s+�J�D�?��ZolmDI��g�����Hс��j1Wl'q��,�^_�<¨�F�"ۚ���ɏ��cw\�v�~�l
Y���)ӯ�'���g|�Q�tID��v����j>�gR�:N\�ˇ�ᯫ��Ǯ�%��F��m�U.@�a#T=�)���ͨ��p�	��|�
d&��b���2ʜa����’O0g�h�#_=g:T�@�!���q��H�IEND�B`�PK�X,��l��footballua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe

class FootballUA(BasicNewsRecipe):
    title = 'Football.UA'
    __author__ = 'bugmen00t'
    description = ('\u0421\u043F\u043E\u0440\u0442\u0438\u0432\u043D\u0438\u0439 \u043F\u043E\u0440\u0442\u0430\u043B'
                   ' \u0432 \u0423\u043A\u0440\u0430\u0457\u043D\u0456,'
                   ' \u043F\u0440\u0438\u0441\u0432\u044F\u0447\u0435\u043D\u0438\u0439 \u043B\u0438\u0448\u0435 \u0444\u0443\u0442\u0431\u043E\u043B\u0443.')
    publisher = 'United Media Holding group'
    category = 'news'
    cover_url = u'https://s.ill.in.ua/i/news/570x380/212/212438.jpg'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 20

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags =   [
         dict(name='div', attrs={'class': 'bottom-info'}),
         dict(name='div', attrs={'class': 'social-buttons'})
        ]

    feeds = [
        ('\u041D\u043E\u0432\u0438\u043D\u0438', 'https://football.ua/rss2.ashx'),
        ]
PK�XLު���
forbes.png�PNG


IHDR  D���PLTE�����������}��tIDATxڭ��CQBQ$�f��q�+
s�}	�
`�	o�:��6�vS$J��DuN�� `A)(P�n�|&JdY<��Ϡ���/@��{@]�	�y	�30��,��U�
����IEND�B`�PK�X�(���
forbes.recipefrom __future__ import absolute_import, division, print_function, unicode_literals
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 Forbes(BasicNewsRecipe):
    title = u'Forbes'
    description = 'Business and Financial News'
    __author__ = 'Kovid Goyal'
    oldest_article = 30
    max_articles_per_feed = 20
    language = 'en'
    encoding = 'utf-8'
    no_stylesheets = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True

    extra_css = '''
    div.fb-captioned-img {
        font-size: smaller;
        margin-top: 1em; margin-bottom: 1em;
    }
    div.fb-captioned-img img {
        display:block;
        margin-left: auto; margin-right: auto;
    }
    '''
    feeds = [
        (u'Latest', u'https://www.forbes.com/news/index.xml'),
        (u'Most Popular', u'https://www.forbes.com/feeds/popstories.xml'),
        (u'Technology', u'https://www.forbes.com/technology/index.xml'),
        (u'Business', u'https://www.forbes.com/business/index.xml'),
        (u'Sports Money', u'https://www.forbes.com/sportsmoney/index.xml'),
        (u'Leadership', u'https://www.forbes.com/leadership/index.xml'),
    ]

    keep_only_tags = [
        classes('article-headline-container hero-image-block article-body bottom-contrib-block')
    ]

    remove_tags = [
        classes('article-sharing'),
        dict(name='button'),
    ]

    def preprocess_html(self, soup):
        h = soup.find(**classes('hero-image-block'))
        if h is not None:
            h1 = soup.find(**classes('article-headline-container'))
            h.extract()
            h1.append(h)
        return soup

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.set_cookie('dailyWelcomeCookie', 'true', '.forbes.com')
        br.set_cookie('welcomeAd', 'true', '.forbes.com')
        return br

    # def parse_index(self):
    #     return [('Articles', [{'title':'Test', 'url':
    #         'http://www.forbes.com/sites/hamdiraini/2016/04/25/bazin-seeks-startups-to-accelerate-accorhotels-transformation/'}])]
PK�X����forbes_india.png�PNG


IHDR  D���	pHYs��~�PLTE					'''+++,,.---777>>>FFHGGGGGIHHHJJJKKKNNNOOOOOQPPRQQQSSS[[[[[]bbbcccgggiiiiikmmo}}~~~���������������������������������������������������������������������������������������������������������������������������������������������ƈ�.IDAT���n�`�ӟ��@7p#b����W�ѽ��eư1�1(m)f��s⛽	�&88�;S-B�JM�*�JLѪ2b��Br�{U��!#&��7:+'k��!#���{�;׾��n�,2"���F���k������X�U*��ᓑKs!#N��3OZ�l=�`��FȈ�
�£����$��.U�$�_ݺ���!#�Ѫ%�5�ZI�� 	v�$��w%�+dD/,�S�h�w��B%dD�N�ř���΅��ت���G��dPk����5zThM�4*j����`�2c�IEND�B`�PK�XKv�*��forbes_india.recipefrom calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1276934715(BasicNewsRecipe):
    title = u'Forbes India'
    __author__ = 'rty'
    description = 'India Edition Forbes'
    publisher = 'Forbes India'
    category = 'Business News, Economy, India'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en_IN'
    temp_files = []
    articles_are_obfuscated = True
    conversion_options = {'linearize_tables': True}
    feeds = [
        (u'Contents', u'http://business.in.com/rssfeed/rss_all.xml'),
    ]
    extra_css = '''
                   .t-10-gy-l{font-style: italic; font-size: small}
                   .t-30-b-d{font-weight: bold; font-size: xx-large}
                   .t-16-gy-l{font-weight: bold; font-size: x-large; font-syle: italic}
                   .storycontent{font-size: 4px;font-family: Times New Roman;}
                '''

    remove_tags_before = dict(name='div', attrs={'class': 'pdl10 pdr15'})

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        br.open(url)
        response = br.follow_link(url_regex=r'/printcontent/[0-9]+', 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 get_cover_url(self):
        index = 'http://business.in.com/magazine/'
        soup = self.index_to_soup(index)
        for image in soup.findAll('a', {"class": "lbOn a-9-b-d"}):
            return image['href']
            # return image['href'] + '.jpg'
        return None

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll(width=True):
            del item['width']
        return soup
PK�X�!�00
forbes_pl.png�PNG


IHDR��h6�IDATx�cX�~�C�KJJ�,�0*g`����a
:���zǎ�a��׷����#��P������
Q����`��`��P֠�]C}�~��t=C��ͫ�Ҡ��/'W+/����}}u��}�n���յ���ӧ_�>"����mm�
�{�� VX]��s����:����.�����^�8V
�uu;�#���F� N
`ŀ�j�sn;�T�G�	 
��%������IEND�B`�PK�X���<	<	forbes_pl.recipe#!/usr/bin/env python

__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe
import datetime
import re


class forbes_pl(BasicNewsRecipe):
    title = u'Forbes.pl'
    __author__ = 'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'
    description = u'Biznes, finanse, gospodarka, strategie, wiadomości gospodarcze, analizy finasowe i strategiczne.'
    oldest_article = 1
    index = 'http://www.forbes.pl'
    cover_url = 'http://www.forbes.pl/resources/front/images/logo.png'
    max_articles_per_feed = 100
    extra_css = '.Block-Photo {float:left; max-width: 300px; margin-right: 5px;}'
    preprocess_regexps = [(re.compile(u'<p>(<strong>)?(Czytaj|Zobacz) (też|także):.*?</p>', re.DOTALL),
                           lambda match: ''), (re.compile(u'<strong>Zobacz:.*?</strong>', re.DOTALL), lambda match: '')]
    remove_javascript = True
    no_stylesheets = True
    now = datetime.datetime.now()
    yesterday = now - datetime.timedelta(hours=24)
    yesterday = yesterday.strftime("%d.%m.%Y %H:%M:%S")
    pages_count = 4
    keep_only_tags = [dict(attrs={'class': [
                           'Block-Node Content-Article ', 'Block-Node Content-Article piano-closed']})]
    remove_tags = [dict(attrs={'class': [
                        'Keywords Styled', 'twitter-share-button', 'Block-List-Related Block-List']})]

    feeds = [(u'Wszystkie', 'http://www.forbes.pl/rss')]

    '''def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        return soup


    def append_page(self, soup, appendtag):
        cleanup = False
        nexturl = appendtag.find('a', attrs={'class':'next'})
        if nexturl:
            cleanup = True
        while nexturl:
            soup2 = self.index_to_soup(self.index + nexturl['href'])
            nexturl = soup2.find('a', attrs={'class':'next'})
            pagetext = soup2.findAll(id='article-body-wrapper')
            if not pagetext:
                pagetext = soup2.findAll(attrs={'class':'Article-Entry Styled'})
            for comment in pagetext.findAll(text=lambda text:isinstance(text, Comment)):
                comment.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
        if cleanup:
            for r in appendtag.findAll(attrs={'class':'paginator'}):
                r.extract()'''
PK�Xq��o��foreign_policy.png�PNG


IHDR  D����PLTE�������7%�vi�D3�w����������������������?.�zo�u�;)�x�8&�������L<�������������ZK����k]�oc�9(����pc����������������@/��������������P@���������������������������������9�"�tRNS@��f�IDATx��҃rQ��}NJ'΄k[�Zk��<�������p��J�k3�����(�PÛ�y'�s
�<���)Al+x���9�_�]�d���������ǣ۶�E��֬��U �]�v����0��ۇx�x��Q�+w�w���/��{�lsIEND�B`�PK�X{%m00foreign_policy.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'

from collections import defaultdict

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 ForeignPolicy(BasicNewsRecipe):
    title = u'Foreign Policy'
    language = 'en'
    __author__ = 'Kovid Goyal'
    description = 'International News'
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    resolve_internal_links = True
    encoding = 'utf-8'
    remove_attributes = ['style', 'height', 'width']

    extra_css = '''
        img {display:block; margin:0 auto;}
        .department-meta { font-size:small; color:#404040; }
        .dek-heading, .author-bio, .date-time { font-size:small; color:#202020; }
        .figure-image, .caption, .wp-caption { font-size:small; text-align:center; }
    '''

    keep_only_tags = [
        dict(name='article', attrs={'class':'article'})
    ]
    remove_tags = [
        dict(name=['meta', 'link', 'svg', 'button', 'iframe', 'aside']),
        classes(
            'share-links content-ungated related-articles fp-lightbox--overlay more-text myfp-article '
            'editors-note-in-post--v2 author-photo related-articles-carousel sidebar-box_right '
        ),
    ]
    remove_tags_after = [classes('post-content-main')]

    def parse_index(self):
        soup = self.index_to_soup('https://foreignpolicy.com/the-magazine')
        img = soup.find('img', attrs={'src': lambda x: x and '-cover' in x})
        if img:
            self.cover_url = img['src'].split('?')[0] + '?w=800?quality=90'
        current_section = None
        feeds_dict = defaultdict(list)
        soup = soup.find('main')
        for x in soup.findAll(name=('h2', 'h3')):
            if x.name == 'h2':
                current_section = self.tag_to_string(x)
                self.log(current_section)
                if current_section.lower() == 'recent issues':
                    break
            else:
                title = self.tag_to_string(x)
                a = x.parent
                url = a['href']
                desc = ''
                meta = a.findNext(attrs={'class':'meta-data -excerpt'})
                if meta:
                    desc += self.tag_to_string(meta)
                dek = a.findNext(attrs={'class':'dek-heading -excerpt'})
                if dek:
                    desc += ' | ' + self.tag_to_string(dek)
                self.log('\t', title, url, '\n\t', desc)
                feeds_dict[current_section].append({"title": title, "url": url, "description": desc})
        return [(section, articles) for section, articles in feeds_dict.items()]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'src':True}):
            img['src'] = img['src'].split('?')[0] + '?w=600?quality=90'
        return soup
PK�X�n�b��foreignaffairs.png�PNG


IHDR:����IDATx��!�'�@��@
p�
@
�H`l
L��>����`��GN�w�g	�?*��41���Y=�tY�3֗+g��>�ժC�+��m�R
��Y
{�k@���}�m6�E]�Qqa��+>α6����!%�ElX~�%%塪�%U����'4�(�MJJ{|��$�?sĸ'鵞�%��DP��SIEND�B`�PK�X4�foreignaffairs.recipe#!/usr/bin/env python
import json
import re

import html5lib
import mechanize
from lxml import html

from calibre.web.feeds.news import BasicNewsRecipe, classes


def as_article(source, log):
    url = source['url']
    title = source['title']
    desc = ''
    if source.get('field_subtitle'):
        desc += source['field_subtitle']
    if source.get('field_display_authors'):
        desc += ' by ' + source['field_display_authors']
    log(title, url)
    return {'url': url, 'title': title, 'description': desc}


def get_issue_data(br, log, node_id='1126213', year='2020', volnum='99', issue_vol='5'):
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Content-Type': 'application/json;charset=UTF-8',
        'Origin': 'https://www.foreignaffairs.com',
        'Referer': 'https://www.foreignaffairs.com',
    }

    def make_query(**kwds):
        size = kwds.pop('size', 1)
        is_filter = kwds.pop('filter', None)
        if is_filter:
            q = {'filter': [{'terms': {k:v}} for k, v in kwds.items()]}
        else:
            q = {'must': [{'term': {k:v}} for k, v in kwds.items()]}
        return {
            'from': 0,
            'post_filter': {'bool': q},
            "_source": {
                "includes": [
                    "nid", 'path', 'title', 'field_subtitle', 'field_display_authors',
                    'fa_node_type_or_subtype',

                    'field_issue_sspecial_articles__nid',
                    'field_issue_sspecial_header'
                ]
            },
            "query": {
                "match_all": {}
            },
            'sort': [{'field_sequence': "asc"}, {'fa_normalized_date': "desc"}],
            "size": size,
        }

    def get_data(data):
        search_url = 'https://www.foreignaffairs.com/fa-search.php'
        req = mechanize.Request(url=search_url,
                                data=json.dumps(data),
                                headers=headers,
                                method='POST')
        res = br.open(req)
        data = json.loads(res.read())
        return data['hits']['hits']

    feeds = []

    def as_article(source):
        title = source['title'][0]
        desc = ''
        fs = source.get('field_subtitle')
        if fs:
            desc = fs[0]
        aus = source.get('field_display_authors')
        if aus:
            desc += ' By ' + aus[0]
        url = 'https://www.foreignaffairs.com' + source['path'][0]
        return {'title': title, 'description': desc, 'url': url}

    issue_data = get_data(make_query(
        fa_node_type_or_subtype='Issue',
        field_issue_volume=issue_vol, field_issue_year=year,
        field_issue_volume_number=volnum
    ))[0]['_source']

    if 'field_issue_sspecial_articles__nid' in issue_data:
        main_sec_title = issue_data['title'][0]
        main_sec_nids = issue_data['field_issue_sspecial_articles__nid']
        articles_data = get_data(make_query(nid=main_sec_nids, filter=True, size=len(main_sec_nids)))
        articles = []
        log(main_sec_title)
        for entry in articles_data:
            source = entry['_source']
            articles.append(as_article(source))
            log('\t', articles[-1]['title'], articles[-1]['url'])
        feeds.append((main_sec_title, articles))

    articles_data = get_data(make_query(field_issue__nid=node_id, size=50))
    ans = {}
    for entry in articles_data:
        source = entry['_source']
        section = source['fa_node_type_or_subtype'][0]
        ans.setdefault(section, []).append(as_article(source))
    for sectitle in sorted(ans):
        articles = ans[sectitle]
        log(sectitle)
        if articles:
            for art in articles:
                log('\t', art['title'], art['url'])
            feeds.append((sectitle, articles))

    return feeds


class ForeignAffairsRecipe(BasicNewsRecipe):
    title = u'Foreign Affairs'
    __author__ = 'Kovid Goyal'
    language = 'en'
    publisher = u'Council on Foreign Relations'
    category = u'USA, Foreign Affairs'
    description = u'The leading forum for serious discussion of American foreign policy and international affairs.'

    no_stylesheets = True
    remove_javascript = True
    needs_subscription = 'optional'

    INDEX = 'https://www.foreignaffairs.com/magazine'

    keep_only_tags = [
        classes('article-header article-body article-lead-image article-body-text'),
    ]
    remove_tags = [
        classes('loading-indicator paywall article-footer article-tools')
    ]

    conversion_options = {'comments': description, 'tags': category, 'language': 'en',
                          'publisher': publisher}
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True

    def parse_index(self):
        soup = self.index_to_soup(self.INDEX)
        # get dates
        date = re.split(r'\s\|\s', self.tag_to_string(
            soup.head.title.string))[0]
        self.title = "Foreign Affairs ({})".format(date)
        self.timefmt = u' [%s]' % date
        link = soup.find('link', rel='canonical', href=True)['href']
        year, volnum, issue_vol = link.split('/')[-3:]
        self.cover_url = re.sub(
            r"_webp_issue_small_\dx",
            "_webp_issue_large_2x",
            soup.find(class_="subscribe-callout-image")["srcset"]
            .split(",")[0]
            .strip()
            .split(" ")[0],
        )

        cls = soup.find('body')['class']
        if isinstance(cls, (list, tuple)):
            cls = ' '.join(cls)
        node_id = re.search(r'\bpage-node-(\d+)\b', cls).group(1)
        br = self.cloned_browser
        feeds = get_issue_data(br, self.log, node_id, year, volnum, issue_vol)
        return feeds

    def clean_fa_html(self, root):
        for svg in tuple(root.iter('{*}svg')):
            svg.getparent().remove(svg)
        for meta in tuple(root.iter('{*}meta')):
            meta.getparent().remove(meta)
        return root

    def preprocess_raw_html(self, raw_html, url):
        root = html5lib.parse(raw_html, treebuilder='lxml',
                              namespaceHTMLElements=False).getroot()
        self.clean_fa_html(root)
        return html.tostring(root, encoding='unicode')

    def preprocess_html(self, soup):
        for img in soup.find_all('img', attrs={'srcset': True}):
            img['src'] = img['srcset'].split(',')[-1].strip().split(' ')[0].strip()
        return soup

    def get_browser(self):

        def select_form(form):
            return form.attrs.get('id', None) == 'fa-user-login-form'

        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://www.foreignaffairs.com/user/login')
            br.select_form(predicate=select_form)
            br.form['name'] = self.username
            br.form['pass'] = self.password
            br.submit()
        return br
PK�Xs�//
formulaas.png�PNG


IHDR��h6�IDATx�c�m�{K�
]��XV�#��׵������p�.�fQ��՛��S�~���^�'s*�L_p5:"~�?	��Sح����S��������g�kv�t?~��ח�ם#�>{��YUP
����.Xu���������s���^a�0x�v뽢F
�}��L^�ֹjŊ+W.�ؼ(������߿7�3ߟ��а/!g~_�ʄ��ϞU|�u���ͭ�4�!z>^�q34�^F%T���S������}���?�i8�P��p�:DP��+�nP
�BS��~�h��痮B�o�D�T�����_����\�t������_���~���y����7�������D�@5\5�����ۇ՝�']Ӂ���ѓk.?>|��-l�j��
	���Wk�5�������{���nGfC����AB�Å+
��������O���p�9�;��U@t�'�����6s�u�[s��]��ry����ց��Db�I�&m�TC�sIEND�B`�PK�X�E`!��formulaas.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
formula-as.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class FormulaAS(BasicNewsRecipe):
    title = u'Formula AS'
    __author__ = u'Silviu Cotoar\u0103'
    publisher = u'Formula AS'
    description = u'Formula AS'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Romania'
    encoding = 'utf-8'
    cover_url = 'http://www.formula-as.ro/_client/img/header_logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'item padded'})
    ]

    remove_tags = [
        dict(name='ul', attrs={'class': 'subtitle lower'})
    ]

    remove_tags_after = [
        dict(name='ul', attrs={'class': 'subtitle lower'}),
        dict(name='div', attrs={'class': 'item-brief-options'})
    ]
    feeds = [
        (u'\u0218tiri', u'http://www.formula-as.ro/rss/articole.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�Xo�6�CC
forsal.png�PNG


IHDR��h6
IDATxE��k�q���9g��/γ�eh���D�Jq�=���$�Rj�Q�$��+��$7����%*�"���=��������
ONP�I��C�f|UX~��^� ���Dgzf�l ϱ��9����V�Fχ�K������G������k�]C�C��x�Y�?�y��ɳ�ٹ套�G����^S�� -Y�rQ��͢
����';�~}]��B�8H)��L�z��G}Jь	Jf�Y���C^Y��v=��{?V�s�3u��Hf
Z
p$S���х���}-ϦOP�%�hM�A
��Ն��K�㝻g?p�܅��;4=6V2�&p�|U�r]���-�oâ�%c�(��,���Je�A�����JL�$')�PYb�'���W��( �D��'K��$x}
�	��I�(T4�D�L�"�M��E"!N��Xƨ�)��52���J�C%.�؞�=8V�d��K��s��⋛����M��f�N��5@&��E�9������-�+�IEND�B`�PK�X]#�T�	�	
forsal.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class ForsalPL(BasicNewsRecipe):
    title = u'Forsal.pl'
    __author__ = 'fenuks'
    description = u'Na portalu finansowym Forsal.pl znajdziesz najświeższe wiadomości finansowe i analizy. Kliknij i poznaj aktualne kursy walut, notowania giełdowe oraz inne wiadomości ze świata finansów.'  # noqa
    category = 'economy, finance'
    language = 'pl'
    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    cover_url = 'http://www.bizneswnieruchomosciach.pl/wp-content/uploads/2010/07/logo_forsal.jpg'
    no_stylesheets = True
    remove_tags = [dict(name='div', attrs={'class': 'related'}), dict(
        name='img', attrs={'title': 'Forsal'})]
    feeds = [
    (u'Najnowsze', u'http://forsal.pl/atom/najnowsze'),
    (u'Tylko na forsal.pl', u'http://forsal.pl/atom/tagi/forsal'),
    (u'Publicystyka', u'http://forsal.pl/atom/tagi/opinia'),
    (u'Bloomberg', u'http://forsal.pl/atom/tagi/bloomberg'),
    (u'Financial Times', u'http://forsal.pl/atom/tagi/financial_times'),
    (u'Gie\u0142da', u'http://forsal.pl/atom/tagi/gielda'),
    (u'Waluty', u'http://forsal.pl/atom/tagi/waluty'),
    (u'Surowce', u'http://forsal.pl/atom/tagi/surowce'),
    (u'Komenarze finasnowe', u'http://forsal.pl/atom/tagi/komentarz'),
    (u'Komentarze gie\u0142dowe', u'http://forsal.pl/atom/tagi/komentarz;gielda'),
    (u'Komentarze walutowe', u'http://forsal.pl/atom/tagi/komentarz;waluty'),

    (u'Makroekonomia', u'http://forsal.pl/atom/tagi/makroekonomia'),
    (u'Handel', u'http://forsal.pl/atom/tagi/handel'),
    (u'Nieruchomo\u015bci', u'http://forsal.pl/atom/tagi/nieruchomosci'),
    (u'Motoryzacja', u'http://forsal.pl/atom/tagi/motoryzacja'),
    (u'Finanse', u'http://forsal.pl/atom/tagi/finanse'),
    (u'Transport', u'http://forsal.pl/atom/tagi/transport'),
    (u'Media', u'http://forsal.pl/atom/tagi/media'),
    (u'Telekomunikacja', u'http://forsal.pl/atom/tagi/telekomunikacja'),
    (u'Energetyka', u'http://forsal.pl/atom/tagi/energetyka'),
    (u'Przemys\u0142', u'http://forsal.pl/atom/tagi/przemysl'),
    (u'Moja firma', u'http://forsal.pl/atom/tagi/moja_firma')]

    def print_version(self, url):
        url_id = re.search(u'/[0-9]+,', url)
        if url_id:
            return 'http://forsal.pl/drukowanie' + url_id.group(0)[:-1]
        else:
            return url
PK�X�V�oofortune_magazine.png�PNG


IHDR  ��tRNSn��	pHYs��IDATH���=k�P��M�H��G!''�
:AG��ݤ�Z�R�K��]\ܤ{�_���⢓y_����p;��
v[�`Bq�
�c�e��윻Z@�ZA�c	j��e��l��Fs�-K��
��<E/Rr�܊
d#��p���5�р�܀��e�<�3�M�::�H����@2���H�q@+�A-�b��{�p�HJ.��v��7����m�M�ߟ�\ ����Qx/m���5�N̛vA��'�7�R
�kIEND�B`�PK�X�V\T
T
fortune_magazine.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def prefix_classes(classes):
    q = classes.split()

    def test(x):
        if x:
            for cls in x.split():
                for c in q:
                    if cls.startswith(c):
                        return True
        return False
    return dict(attrs={'class': test})


class Fortune(BasicNewsRecipe):

    title = 'Fortune Magazine'
    __author__ = 'Rick Shang'

    description = 'FORTUNE is a global business magazine that has been revered in its content and credibility since 1930. FORTUNE covers the entire field of business, including specific companies and business trends, prominent business leaders, and new ideas shaping the global marketplace.'  # noqa
    language = 'en'
    category = 'news'
    encoding = 'UTF-8'
    keep_only_tags = [
        classes('amp-wp-title amp-wp-dek amp-header-meta amp-wp-article-featured-image amp-wp-article-content'),
    ]

    no_javascript = True
    no_stylesheets = True
    needs_subscription = 'optional'

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username and self.password:
            br.open('https://fortune.com/')
            br.select_form(id='sign-in-form')
            br['username'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def preprocess_html(self, soup, *a):
        for ai in soup.findAll(name='amp-img'):
            ai.name = 'img'
        return soup

    def parse_index(self):
        articles = []

        # Go to the latestissue
        soup = self.index_to_soup('https://fortune.com/section/magazine/')
        articles = []

        for li in soup.findAll('li', attrs={'class': lambda x: x and 'termArchiveContentList__item--' in x}):
            a = li.find('a', href=True)
            url = a['href'].rstrip('/') + '/amp'
            div = li.find(attrs={'class': lambda x: x and 'termArchiveContentListItem__title--' in x})
            title = self.tag_to_string(div)
            if title.startswith('Magazine'):
                title = title[len('Magazine'):]
            desc = ''
            div = li.find(attrs={'class': lambda x: x and 'termArchiveContentListItem__excerpt--' in x})
            if div is not None:
                desc = self.tag_to_string(div)
            self.log(title, url)
            articles.append({'title': title, 'url': url, 'description': desc})
        return [('Articles', articles)]
PK�X^O���fotoblogia_pl.png�PNG


IHDR�hM�rIDATx�c�@�?f0�[��y ��d���������>���,h
d|�Θf0�x��a�A^�?��,xA�L`�3@R ����y@�v�� ��@��;�U?Y�r�IEND�B`�PK�X?/W��fotoblogia_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Fotoblogia_pl(BasicNewsRecipe):
    title = u'Fotoblogia.pl'
    __author__ = 'fenuks'
    description = u'Jeden z największych polskich blogów o fotografii.'
    category = 'photography'
    language = 'pl'
    masthead_url = 'http://img.interia.pl/komputery/nimg/u/0/fotoblogia21.jpg'
    cover_url = 'http://fotoblogia.pl/images/2009/03/fotoblogia2.jpg'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    keep_only_tags = [dict(name='article')]
    remove_tags = [dict(attrs={'class': 'article-related'})]
    feeds = [(u'Wszystko', u'http://fotoblogia.pl/feed/rss2')]
PK�X���foxnews.png�PNG


IHDR(-SBPLTE   000@@@PPPppp�������������������������������PP������`IDATx�M���@�6-S��F�)S�B�e������ח���O$,��0G��(3c�ϊ�l�s�d��1˨~x��Z�Xe�d]{;/CW?.�zk�ՋF(IEND�B`�PK�X^�K��foxnews.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
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 FoxNews(BasicNewsRecipe):
    title = 'FOX News'
    __author__ = 'Darko Miletic'
    description = 'Breaking News from FOX'
    publisher = 'FOXNews.com'
    category = 'news, breaking news, latest news, current news, world news, national news, USA'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False

    language = 'en'
    remove_empty_feeds = True
    extra_css = """
        body{font-family: Arial,sans-serif }
        .caption{font-size: x-small}
        .author,.dateline{font-size: small}
    """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language}

    remove_attributes = ['xmlns', 'lang']
    ignore_duplicate_articles = {'title', 'url'}
    keep_only_tags = [
        dict(itemprop=['headline', 'articleBody']),
        dict(name='h1'),
        classes('byline author date source article-info article-body featured-image'),
    ]
    remove_tags = [
        classes('featured-video video-container'),
    ]

    feeds = [(u'Latest Headlines', u'http://feeds.foxnews.com/foxnews/latest'),
             (u'National', u'http://feeds.foxnews.com/foxnews/national'),
             (u'World', u'http://feeds.foxnews.com/foxnews/world'),
             (u'Politics', u'http://feeds.foxnews.com/foxnews/politics'),
             (u'Opinion', u'http://feeds.foxnews.com/foxnews/opinion'),
             (u'Science', u'http://feeds.foxnews.com/foxnews/science'),
             (u'Technology', u'http://feeds.foxnews.com/foxnews/tech'),
             (u'Health', u'http://feeds.foxnews.com/foxnews/health'),
             (u'Lifestyle', u'http://feeds.foxnews.com/foxnews/section/lifestyle'),
             (u'Travel', u'http://feeds.foxnews.com/foxnews/internal/travel/mixed')]
PK�X;��
fr_online.png�PNG


IHDR  szz��IDATx�c�F�(�����5q���d��'0'`��j��=%D; b�����Y���;�݈v�(���2R��+'��de�qȕq����Y����Q����-h�~��t���0���j�Ir����P�2$6��Ș�����Ҳ@�z$��@u@:�����А	H�����V�����f#9`��夥e(t& �DdCF���
� �yH�?�������%C����	�_D������Ⱦ���"0�x)u�V`�[�0�0vl��_�K���4B� ~�?���.A�L�}-�H� q�fCy��H�]tw���t�:����-$���@tu@�h��=�:��X��:����U�_Ta	�,�&#;���"�Qjlh���z�������bQW	�SU�D720H�f�(�0���\vIEND�B`�PK�X��`@��fr_online.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2010, Christian Schmitt'

'''
fr-online.de
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class FROnlineRecipe(BasicNewsRecipe):
    title = 'Frankfurter Rundschau'
    __author__ = 'maccs'
    description = 'Nachrichten aus D und aller Welt'
    encoding = 'utf-8'
    masthead_url = 'http://www.fr-online.de/image/view/-/1474018/data/823552/-/logo.png'
    publisher = 'Druck- und Verlagshaus Frankfurt am Main GmbH'
    category = 'news, germany, world'
    language = 'de'
    publication_type = 'newspaper'
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True
    oldest_article = 1   # Increase this number if you're interested in older articles
    max_articles_per_feed = 50  # Seems a reasonable number to me
    extra_css              = '''
                            body { font-family: "arial", "verdana", "geneva", sans-serif; font-size: 12px; margin: 0px; background-color: #ffffff;}
                            .imgSubline{background-color: #f4f4f4; font-size: 0.8em;}
                            .p--heading-1 {font-weight: bold;}
                            .calibre_navbar {font-size: 0.8em; font-family: "arial", "verdana", "geneva", sans-serif;}
                            '''
    remove_tags = [dict(name='div', attrs={'id': 'Logo'})]
    cover_url = 'http://www.fr-online.de/image/view/-/1474018/data/823552/-/logo.png'
    cover_margins = (100, 150, '#ffffff')

    feeds = []
    feeds.append(
        ('Startseite', u'http://www.fr-online.de/home/-/1472778/1472778/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Politik', u'http://www.fr-online.de/politik/-/1472596/1472596/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Meinung', u'http://www.fr-online.de/politik/meinung/-/1472602/1472602/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Wirtschaft', u'http://www.fr-online.de/wirtschaft/-/1472780/1472780/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Sport', u'http://www.fr-online.de/sport/-/1472784/1472784/-/view/asFeed/-/index.xml'))
    feeds.append(('Eintracht Frankfurt',
                  u'http://www.fr-online.de/sport/eintracht-frankfurt/-/1473446/1473446/-/view/asFeed/-/index.xml'))
    feeds.append(('Kultur und Medien',
                  u'http://www.fr-online.de/kultur/-/1472786/1472786/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Panorama', u'http://www.fr-online.de/panorama/-/1472782/1472782/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Frankfurt', u'http://www.fr-online.de/frankfurt/-/1472798/1472798/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Rhein-Main', u'http://www.fr-online.de/rhein-main/-/1472796/1472796/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Hanau', u'http://www.fr-online.de/rhein-main/hanau/-/1472866/1472866/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Darmstadt', u'http://www.fr-online.de/rhein-main/darmstadt/-/1472858/1472858/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Wiesbaden', u'http://www.fr-online.de/rhein-main/wiesbaden/-/1472860/1472860/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Offenbach', u'http://www.fr-online.de/rhein-main/offenbach/-/1472856/1472856/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Bad Homburg', u'http://www.fr-online.de/rhein-main/bad-homburg/-/1472864/1472864/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Digital', u'http://www.fr-online.de/digital/-/1472406/1472406/-/view/asFeed/-/index.xml'))
    feeds.append(
        ('Wissenschaft', u'http://www.fr-online.de/wissenschaft/-/1472788/1472788/-/view/asFeed/-/index.xml'))

    def print_version(self, url):
        return url.replace('index.html', 'view/printVersion/-/index.html')
PK�XK7���
frandroid.png�PNG


IHDR  szz�TIDATx�Ŗct�K���m۶���m۶�*�m�'UR;MmQ��Τ]����Y�-�<{�����/S�HN3�����%)�J���R���i��?Ȩ௸E�����e
Q(����1�O᯸�YN���4��pL�~����L�=Xz�@i��
� ����]4t�#�_�o"IVL3�؇��-�Y��`��<�|�g!�x�T�w5���S���*G��"%k��[
N����}pf� .2+O5F��p�#K%�2M�FӍ~ U	bKT<
N��ϱt3��/1�#�kѥ-��fu�r�S�j�x|M�CӮAs�N��y�AV�9�b��W�H���h4xcQUy0y7�|E�QͶ��"B__�J���36���7����}��e���.� J\
�96�&tt���uQ0��{�쵠kI/����!R��S�*xdϷZ�SD��m���n�>�n��j��|A�T��%��2}�A��O=��+T2Ū�V�
E5A Fx�}�i{L�͝V�5��id���L]�"��1z�Y�)�>n-B�-߈�C�c����`�.�@�3_Ϋv�@�>���\<��5˽
��7�xz�ʢO�TUF沋[$���`��a3,⚱�ly@���ށ,��VS+� ��5�C�~N( ��;tt5�ϸ��`'_��
�x�K�BV~�j��>(�M���j�P@��
�6��1a9�^�̅�ʃ�<�h1{�Z@Q�G��#�\�e����O(  �&��Vp�(���o�1�~����.Y�fߋ^����jwg~�2tu��.~���Y��S\�:͐\��`��� Џq��i�?
�p����9��K���}����Z�0��@Ϭ�k$����r�>�O(@���@S[)~��c�7�t!iЄ ��]��uM:n��F�[	�jT�)֌Y�={"���T��~h�ͼ/"���9�-���To���s���>}��ǯÏrBa�[��c��#b��u��5�'���5B����d�Έ���M��|9~�%��<�G���Qd�r�Fc������,ZH�����P��!��4�Bp"r��rzl��z;�䳡+��|9�G��x������AR�pHX����!b��H����\��@,��� spN]rl�P����M�|�¡ba��e?��rE�S�:��/ �tK��Ñ(���A���~��
�KJK��^@kֺkL�nn/��e���+[����b�[�L�1�贆�Ng�`/L��l��]�B8&O;@�$��������F�Bj�WH)���w�N���Xᒱp������X�IEND�B`�PK�X��!'DDfrandroid.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1318572550(BasicNewsRecipe):
    title = u'FrAndroid'
    language = 'fr'
    oldest_article = 2
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'FrAndroid', u'http://feeds.feedburner.com/Frandroid')]
PK�X;��frankfurter_rundschau.png�PNG


IHDR  szz��IDATx�c�F�(�����5q���d��'0'`��j��=%D; b�����Y���;�݈v�(���2R��+'��de�qȕq����Y����Q����-h�~��t���0���j�Ir����P�2$6��Ș�����Ҳ@�z$��@u@:�����А	H�����V�����f#9`��夥e(t& �DdCF���
� �yH�?�������%C����	�_D������Ⱦ���"0�x)u�V`�[�0�0vl��_�K���4B� ~�?���.A�L�}-�H� q�fCy��H�]tw���t�:����-$���@tu@�h��=�:��X��:����U�_Ta	�,�&#;���"�Qjlh���z�������bQW	�SU�D720H�f�(�0���\vIEND�B`�PK�X>���frankfurter_rundschau.recipe#!/usr/bin/env python

'''
fr-online.de
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class FR(BasicNewsRecipe):
    title = 'Frankfurter Rundschau'
    __author__ = 'Kovid Goyal'
    description = 'Nachrichten aus D und aller Welt'
    language = 'de'
    publication_type = 'newspaper'
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True
    oldest_article = 1   # Increase this number if you're interested in older articles
    max_articles_per_feed = 50  # Seems a reasonable number to me
    encoding = 'cp1252'

    keep_only_tags = [
        dict(id='fcms_page_main'),
    ]
    remove_tags = [
        dict(name='footer'),
        dict(id='comments'),
    ]

    feeds = [
        ('Startseite', u'http://www.fr.de/?_XML=rss'),
        ('Frankfurt', u'https://www.fr.de/frankfurt/?_XML=rss'),
        ('Rhein-Main', 'https://www.fr.de/rhein-main/?_XML=rss'),
        ('Politik', 'https://www.fr.de/politik/?_XML=rss'),
        ('Wirtschaft', 'https://www.fr.de/wirtschaft/?_XML=rss'),
        ('Sport', 'https://www.fr.de/sport/?_XML=rss'),
        ('Eintracht Frankfurt', 'https://www.fr.de/sport/eintracht/?_XML=rss'),
        ('Kultur', 'https://www.fr.de/kultur/?_XML=rss'),
        ('Wissen', 'https://www.fr.de/wissen/?_XML=rss'),
        ('Leben', 'https://www.fr.de/leben/?_XML=rss'),
        ('Panorama', 'https://www.fr.de/panorama/?_XML=rss'),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        main = soup.find(id='fcms_page_main')
        for i, tag in tuple(enumerate(main)):
            if getattr(tag, 'name', None):
                main.replaceWith(tag)
                break
        return soup
PK�XĊ�ddfreakonomics.png�PNG


IHDR22�]�+IDATx^͙K�d�Q�#�<�͛�ʬ���tw��3wσ���6c!�Xo+|ĆK��- ,#$�c!!��ac����3��{�3���^�y��nV��y�F��:
ݺR��?NF����}���$����uP����׏	KD�cz+�~�X̼^�@?E\����ǎ��U"ro�|'���BU������I�9gc"'�("�ZD���^��z��\|gzS�������{��_.�׮]{����]z݃;��{L�̾���@]�xP����F�U8�dn���o���/_]�E48������t�
hD-���0#��yk>�{4�9�
�h`2��,K�?�K�^~����~��7W�R�v8ECZ����l:�p�=�ѝ��̝�JDd���s�w߾�k&�Q��
y�w���3���g����k�������
®n��wS���qe�y_�}��?����v�Qu�䜝-��CD"����aI��r�M���֫���?�������ǯ��݃�\zσƠ6a��0�n��^�EV���7������^{���4���,)ƈ�� �N�(�RJAP�0_��/|�/��N�~�	nO6=
P�X�b;@�3e�TY;�c�ˡ��[���-��G>��|*����jMIXc��{+�um3�]�RQد~��?ḽw���������M��G��\�����v˝�l�\����[�x��˾TAneU��o����KA3��*��X����cf�����s��A���?zy��QX��,w�Ñ���3�a�"d��H!:*b�˶�9	����E1����6�O<�3��!�ތ�f(����[�3��������~9OW/
wÂ�,8PFu��bz�ɫ�ud
�iQ0sr6v�Ӑ��m8Z.��.JiC@�L�>�����R? 2g�-E�.�׎E���9|�k�~�W��'θpw�h�S�!L6+&)ɪ�U�]���p���A#H'�h�A�n8q�~��7����V��bV1�z_�-�%�}·n�z�س��0��:G]�&�$�i�BY- JG`����z�唅c�!$ev�o%*��]��~�)f6hUX�Q��`��AE�!߸��>��ew���A�ұ8E�p��1(��o�6��sB�Icά�hr�`]~���Y��$P$2����{�]cj?��$�{p0�gՆ,��ҹ�:H$�$l46�P�6v�u�\Av�Z��ʂФ�cN� �Ĭ��$t)�rFcd��{�ߠ�ڵ��š�S�X�5ݘEn%k��t9Y�X�..��.u�
�Փ1��4��܏Qc��YH�����:#Ģ��
XC�������*)%��*��U�J]��1fQǃ�T��1������(2+��1Kb�=�Ք ��b����$��ԮGa�š�����&a������`9kҔ����SL�����Y�k�0�$�$FAacL�u�����VR!b�3���=�k�N
Q�ֺcYӶ"1�"�t֘�2�~Т�DΑp�2��ʲB0�I{kĤ���h�ΠdB����g�@CD�f׏���r�8M�32�P���_���%��cd2�E�I�cdcjdg�
�m�
q60���tPG�<vìb����:�+���l�^	�X �{�Z2ol̼,B���m���0j�ID�)��֐�ĠL�3�fN��N�FpP���`�Y6̌ɋ	�X�4s�.�]�pz�Ɂ��X3��
��ͣxcU 
*`�E,W�QDT���������͒�tML!��Ƃ�%9B�G����`�Q���Jj7����,�JU�V�ɊfQ]���7�n��f+d���6q�Q�jf�(Y$�����/B�
�juY��4�gg[X��|�T
M�BE�Y�?
�[[E�v�all�S.�gUc�T������aR�o���N��"Π�)�̕�`̙E@"�N��E�	CΊ
֫/SUUw�jO����t�n�/�(���wG�׊��}"P%��8@��d52�uH��ؐ���b�j_٬9k
:�8�riTJ�(.�$Lj�-y��_��s�8���9�yhx��se^�^ܿ%ɢ��ֲ>ƠZ닢���G�:��^��eA
#5]REU�sL�5jʒ��;	�����)e
������^y�����<v���ȉk[�:Phd㢽�q-F�f=�-���1d�j�X-˲t�����ەV~�w�1Z䐙YXA�����Ya%I42�m����?���5����<X�`�S\ô���!v1�;��@ 99��HDo�c��pҴ�d0�����w_��gǝYfs'6q)qJhY�d��@e�˰���G���]��CC�:Zr�q��$rǹ��d$@B˻V��c6����/""�W"�?6l2���[�|skb�����[K\�a���E��)q�j3:�&�,%����W��ׯ|�Rڻs��`W���C���n����lG�apZ�1����E�H��Y7z{�,AD��`Ĝr�!��5]n�<�������=4�|�)daԬ"�V��Om}��K�����3,�I���:K�0�

"Vc��K29���<��>b�*��a5U=��.P{�?��wn��\wB�@L)��ؤţͭ.��-�|����UTz�:�	����\3#��Gl�I=9S˪�A�b=�,�;9
8�l��'�h�UZ"o���=��z��#�>{��m�����>�̷���.�kS
17���x�_Y��V�Ť"���-@b��DV0�D��7���ǻ��DZ�b�&8�l�T=�EE�HfT����綦�gCj����.K�]u��
!�e��W�Ǟ(���S�<a�A��,5�ҏLN��W��F9trǯ��%O�*���*�	��kiВU眈�qcT���@C�'���}�ѐ�*3-�<��ݛ�|���T�����`���"%̈́F37����o,���3�լpC���"{z�?���˜4v��PØꉎ0�~��L��� �d�=D�����ʛa2���͐Zd3�(��m�h����������h����u��o�[��X�E��(v̼��h�o`�$����[ן��o������s��f�TOT��`�p��@}�f�߽�����G�r�w(c�Pq���7�	5ZѾ}�P�H�����"��`��Z�.��[M�n޺��=/a6��Y9��Ģ���f;[gw�]W����X��5ޚ��pϭ������7�H�(s���y��������ý[{7�������]"͓Qq��K^�x~w{k�LU
aq�:B�~ D8�%��u}UE$gI��E�۴�b�S��`��ƣr���V�D�Șa��@O���O�G�F� w�sR��I�HVѨ��C�+�����OCU~������J�W�=K=n�*��DY�Y�'8���^?*��qV��P9�I�KD�%���=�{�pX�fX�GVM�&��;���'�N'��ƥ�	�O4��=�����rIEND�B`�PK�X�B�||freakonomics.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2011, Starson17'
__docformat__ = 'restructuredtext en'

from calibre.web.feeds.news import BasicNewsRecipe


class Freakonomics(BasicNewsRecipe):
    title = 'Freakonomics Blog'
    description = 'The Hidden side of everything'
    __author__ = 'Starson17'
    __version__ = '1.02'
    __date__ = '11 July 2011'
    language = 'en'
    cover_url = 'http://ilkerugur.files.wordpress.com/2009/04/freakonomics.jpg'
    use_embedded_content = False
    no_stylesheets = True
    oldest_article = 30
    remove_javascript = True
    remove_empty_feeds = True
    max_articles_per_feed = 50

    feeds = [(u'Freakonomics Blog', u'http://www.freakonomics.com/feed/')]
    keep_only_tags = [dict(name='div', attrs={'id': ['content']})]
    remove_tags_after = [
        dict(name='div', attrs={'class': ['simple_socialmedia']})]
    remove_tags = [dict(name='div', attrs={
                        'class': ['simple_socialmedia', 'single-fb-share', 'wp-polls']})]
    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''
PK�X
��a!!fredensborglokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X=�>99 fredensborglokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Uge-Nyt
'''


class FredensborgLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Uge-Nyt'
    description = 'Uge-Nyt: Lokale og regionale nyheder, sport og kultur fra Fredensborg, Kokkedal og Humlebæk på fredensborg.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Uge-Nyt', 'http://fredensborg.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Uge-Nyt', 'http://fredensborg.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Uge-Nyt', 'http://fredensborg.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Uge-Nyt', 'http://fredensborg.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Uge-Nyt', 'http://fredensborg.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Uge-Nyt', 'http://fredensborg.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X
��a!!fredericialokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�XC�f���fredericialokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Fredericia
'''


class FredericiaLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Fredericia'
    description = 'Lokale og regionale nyheder, sport, kultur fra Fredericia og omegn på fredericia.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Fredericia', 'http://fredericia.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Fredericia', 'http://fredericia.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Fredericia', 'http://fredericia.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Fredericia', 'http://fredericia.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Fredericia', 'http://fredericia.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Fredericia', 'http://fredericia.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X&�C�frederiksbergbladet_dk.png�PNG


IHDR  D���3PLTEMv���P��@z������ß�̯��������X�����p��0n�`�� c�����IDATx���E1D���?m]ï��]��~h�-@�:H�cՁ�'�lg�46f	��>�E���X�����:�e`Q�z��rˠ�ܾ�p�H�3�^n� k~�_A+ށ@K��y��ʙWu�$�؞y0P�9����IEND�B`�PK�XL.����frederiksbergbladet_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Frederiksberg Bladet
'''


class FrederiksbergBladet_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Frederiksberg Bladet'

    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Frederiksberg Bladet', 'http://minby.dk/frederiksberg-bladet/feed/'),
        ('Kommentarer til Frederiksberg Bladet', 'http://minby.dk/frederiksberg-bladet/comments/feed/'),

    ]

PK�X
��a!!frederikssundlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X�=���"frederikssundlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Frederikssund
'''


class FrederikssundLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Frederikssund'
    description = 'Lokale, regionale nyheder, sport og kultur fra Frederikssund, Jægerspris og omegn på frederikssund.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Frederikssund', 'http://frederikssund.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Frederikssund', 'http://frederikssund.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Frederikssund', 'http://frederikssund.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Frederikssund', 'http://frederikssund.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Frederikssund', 'http://frederikssund.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Frederikssund', 'http://frederikssund.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X��free_inquiry.png�PNG


IHDR  D���aPLTE���O�N�ZQl�U�T#�T$N�aQf�U�T%N�GPu�U
�T�T&O�O�iQf�U�T�T%O�
O�N�7P~�T"�TO�O��T-�TO�"O��T#O��S>�S?�U�T.P��S4�T)�T+O�N�JPssQ_O�O�O��T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T$�T�T$�T$�T$�T$�U�T$�T$�T$O�O�O�O�O�N�GPz�U�T"�T$�T$�T$�T$O�N��T!�T#�TO�N��U�U
�UO�O�O�O�O�O�O�O�O�O�O�O�O�N�N�N�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O��T$�T%O�O��T&O�O��E
�tRNSx@���G�Q�z	�&��v.B�%¦�s�����	UՀ���)��0;)
�Dj�SQaNy/+"'	'��#pr6M<�O+s8-����"����
$h�����КZu5�Jt�v7��	E��C=�w�Wϴ{b���ͺP&���IDATx�b�`�L�,�l `l†U;'P��̜
�n^>~66�#�8
	��ZY���aW &.!)%�f�p�L2�r�NG�]\�+`TPTr;r�����eA��>�G��(�
	
���B��@�w�/�qb۶m۶m���[�oz�S���� Q�WR (�;%5����OzHhFfVX�7���ܼ��Ȩ@tL���Vʠ�_��ʪ�8-����zz��Q~�	j�,-hm㡽��ݔ5���
cPT�Fx��0:F019��Iј���9�y��)�k~QD��WJ�`���u�<Z�&e�
�=�e�
v9�9��}��CG�'�Nig�%�r�,\���o��;Ѹo�
�lQ��2X����V[�N�`�E,�韉��IEND�B`�PK�X.lW�`
`
free_inquiry.recipe__license__ = 'GPL v3'
__copyright__ = '2022, Howard Cornett howard at myreadinglife.com>'
'''
www.secularhumanism.org
'''

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 FreeInquiry(BasicNewsRecipe):
    title = 'Free Inquiry'
    __author__ = 'Howard Cornett'
    description = ("America's Bimonthly Journal of Humanist Ideas")
    publisher = 'Center for Inquiry'
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'en'
    ignore_duplicate_articles = {'url'}
    remove_empty_feeds = True
    needs_subscription = True
    extra_css             = """
                            .entry-header{
                                          text-transform: uppercase;
                                          vertical-align: baseline;
                                          display: inline;
                                         }
                            ul li{display: inline}
                            """

    remove_tags = [
        classes(
            'main-navigation swp-social-panel see-more user-admin d-print-none post-18669 wc-memberships-message'
        ),
        dict(id=['sidebar-TOC', 'loginModal']),
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://secularhumanism.org/member-login/')
            br.select_form(name='loginform')
            br['log'] = self.username
            br['pwd'] = self.password
            br.submit()
        return br

    def parse_free_inquiry_index_page(self, currenturl, seen):
        self.log('Parsing index page', currenturl)
        soup = self.index_to_soup(currenturl)
        cover = soup.find('img', class_='attachment-medium')
        cover_img_split = cover['data-srcset'].split(',')[2]
        cover_img = cover_img_split.split()[0]
        if cover is not None:
            self.cover_url = cover_img
        for row in soup.findAll('div', attrs={'class': 'article-row'}):
            for info in row.findAll('div', attrs={'class': 'article-info'}):
                p = info.find('p')
                desc = p.text
                for span in info.findAll('span'):
                    if span.find('h5') is not None:
                        for h5 in span.find('h5'):
                            if h5 is not None:
                                art_title = h5
                            else:
                                art_title = ''
                            if span.a['href'] is not None:
                                url = span.a['href']
                            else:
                                url = ''
                            seen.add(url)
                            self.log('Found article:', art_title)
                            yield{
                                'title': art_title,
                                'url': url,
                                'description': desc
                            }

    def parse_index(self):
        baseurl = 'https://secularhumanism.org/latest/'
        articles = []
        seen = set()
        articles.extend(self.parse_free_inquiry_index_page(baseurl,seen))

        return [('Magazine Articles', articles)]
PK�X���P��freenature.png�PNG


IHDR(-SEPLTE� �1�3�7�< �B'�q]�r^�t`�wc�p�v���Ž�ǿ������������|ڏudIDATxڜ���@��F;�P��75�.rij�)�J�+/�|�2��z����P�*`~P���zC�߆����|E!-|[d�ȻQ/����cߢ@�
S�̎�IEND�B`�PK�X�""freenature.recipefrom 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 NatureNews(BasicNewsRecipe):
    title = u'Nature News'
    language = 'en'
    __author__ = 'Kovid Goyal'
    oldest_article = 31  # days
    remove_empty_feeds = True
    max_articles_per_feed = 50

    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    keep_only_tags = [
        classes('container-type-article'),
    ]
    remove_tags = [
        dict(id='related-articles'),
        classes('u-hide-print hide-print visually-hidden'),
        dict(name=['meta', 'link', 'source']),
    ]

    # News and comments
    feeds = [(u'Nature News', 'http://feeds.nature.com/nature/rss/current')]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', src=lambda x: x and x.startswith('//')):
            img['src'] = 'https:' + img['src']
            print(img)
        return soup
PK�X�3�
�
freeway.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = '2010, Gustavo Azambuja <hola at gazambuja.com>'
'''
http://freeway.com.uy
'''

from calibre.web.feeds.news import BasicNewsRecipe


class General(BasicNewsRecipe):
    title = 'freeway.com.uy'
    __author__ = 'Gustavo Azambuja'
    description = 'Revista Freeway, Montevideo, Uruguay'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 1
    encoding = 'utf8'
    remove_javascript = True
    no_stylesheets = True
    conversion_options = {'linearize_tables': True}

    oldest_article = 180
    max_articles_per_feed = 100
    keep_only_tags = [
        dict(id=['contenido']),
        dict(name='a', attrs={'class': 'titulo_art_ppal'}),
        dict(name='img', attrs={'class': 'recuadro'}),
        dict(name='td', attrs={'class': 'txt_art_ppal'})
    ]
    remove_tags = [
        dict(name=['object', 'link'])
    ]
    remove_attributes = ['width', 'height', 'style', 'font', 'color']

    extra_css = '''
                h1{font-family:Geneva, Arial, Helvetica, sans-serif;color:#154B7A;}
                h3{font-size: 14px;color:#999999; font-family:Geneva, Arial, Helvetica, sans-serif;font-weight: bold;}
                h2{color:#666666; font-family:Geneva, Arial, Helvetica, sans-serif;font-size:small;}
                img {float:left; clear:both; margin:10px}
                p {font-family:Arial,Helvetica,sans-serif;}
                '''

    def parse_index(self):
        feeds = []
        for title, url in [('Articulos', 'http://freeway.com.uy/revista/')]:
            articles = self.art_parse_section(url)
            if articles:
                feeds.append((title, articles))
        return feeds

    def art_parse_section(self, url):
        soup = self.index_to_soup(url)
        div = soup.find(attrs={'id': 'tbl_1'})

        current_articles = []
        for tag in div.findAllNext(attrs={'class': 'ancho_articulos'}):
            if tag.get('class') == 'link-list-heading':
                break
            for td in tag.findAll('td'):
                a = td.find('a', attrs={'class': 'titulo_articulos'})
                if a is None:
                    continue
                title = self.tag_to_string(a)
                url = a.get('href', False)
                if not url or not title:
                    continue
                if url.startswith('/'):
                    url = 'http://freeway.com.uy' + url
                p = td.find('p', attrs={'class': 'txt_articulos'})
                description = self.tag_to_string(p)
                self.log('\t\tFound article:', title)
                self.log('\t\t\t', url)
                self.log('\t\t\t', description)
                current_articles.append(
                    {'title': title, 'url': url, 'description': description, 'date': ''})

        return current_articles

    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 soup

    def get_cover_url(self):
        return 'http://freeway.com.uy/_upload/_n_foto_grande/noticia_1792_tapanoviembre2010.jpg'
PK�X�.R�FFfreisinger_tagblatt.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X3��rrfreisinger_tagblatt.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Freisinger Tagblatt'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Landkreis Freising', u'http://www.merkur-online.de/lokales/freising/rssfeed.rdf'),
    (u'Lkr. Freising', u'http://www.merkur-online.de/lokales/freising/landkreis/rssfeed.rdf'),
    (u'Neufahrn/Eching', u'http://www.merkur-online.de/lokales/freising/neufahrn-eching/rssfeed.rdf'),
    (u'Allershausen', u'http://www.merkur-online.de/lokales/freising/allershausen/rssfeed.rdf'),
    (u'Freising', u'http://www.merkur-online.de/lokales/freising/freising/rssfeed.rdf'),
    (u'Marzling', u'http://www.merkur-online.de/lokales/freising/marzling/rssfeed.rdf'),
    (u'Zolling', u'http://www.merkur-online.de/lokales/freising/zolling/rssfeed.rdf'),
    (u'Moosburg', u'http://www.merkur-online.de/lokales/freising/moosburg/rssfeed.rdf'),
    (u'Au/Hallertau', u'http://www.merkur-online.de/lokales/freising/au-hallertau/rssfeed.rdf'),
    (u'Veranstaltungen', u'http://www.merkur-online.de/lokales/freising/veranstaltungen-freising/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/freising/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X��""
frontline.png�PNG


IHDR  ��tRNSn���IDAT��O�\e���9�{��;�3Izfb���T��Z(X*.-�X�ƍ+?�+��7Ti"
XZ�@@a�IH&=3�fn��{α{R��y���3�Œ�`�\�m(�9R�3�h- ���\-���< �Q ��*�\@P��ST �sI��|")%Se�
]8��
8����ıNP)Y��9�z�m�b*���*�M�X\���TP���I���KṞN��.m���(�[2E��G�s��b��f��%�Z�qgN�\Nq�`.�@�A��R����3��ƌ2���~(�4����5紸 �z��D�7��ƿ���]}[�������q=�n~w�]�n~lw���n�I@y �%]Y]x�Ʌ�W=~^J%U��p�#��f����'ӷ����:w���S�#g����.���݉��ٖT��$L��M�nk�����
��w���a�������U+������]��֔��J�����&cf��!$g.K�v㚿���w{߸���o~��˯L��u�c`�����O�G�ݽ���p#���x,J�\y��߿�[����L�<��;��M�nZ�ǽ��7כ_�j:������KK>����h�v���Ƶ����v�{�[�����d
�	��Ӫ�~I++�ы�ݫJ���м���{��Ze�h��!������^-�
8�Kb��)�R(A0�;�FS=t���T�5��n��t�!�{�J=��5�}TA�T:ж�g�c	r$�i�"�I7���sg����A7��ͻq�]G�t�D�Ӷڶ��PP����x��-m���u�~���d�;y�w�Tw�V.ɠf���" >��0'  I��Ș	$��>�,
^�~�g�`����ۏ�[3f�H���J38���Kɂb@�$�Q՜!ȕi
"��1# ��`.P���
LH�u&�`N�>�b<�{�O{y�ۦ:��r����9 t��8D0#|FA�P��1h�YP ���{��?�q����B��KK/���f
���!�(���GB���L&4m�R�W���ƭ���G���--5�T�9�
sBJ1D�����ru�\,w7ovo��h[oۘN	gf��K������U���JM�u�v���"ӎ<|��۷
����=ZN�Y_��~7�d��'��ݽ�7��v.�q�&�7��&{{1��h��1W�Q}������v$r@�pX����B�����#g�,~oӛ	�)eg.
�<�N�L'�����{��_z�9rUK7�O�����N��7��x9}f�g�g�t����O���������ь��iݫ�/g�]�P�� K�Ћ?�?s)�5U���|�ݽkM��^�֎�������|d���2��;�R,�0O%�~O��5��͛��!���*3����ڏ6�L�G[{��t�6���n{�n��ݹkx��MI)��h�}���������.-k��*nf[[�>����~�6��QZcN�)%R.f���C����\��2��d��i
�FZ�FH��Ӏ�	88$fư��sZ )x6
�����렖�œ&u�W����ȁY�F�����cn�9$*IIJ�Jv%�ŒR�-�90PZ�����IR �"! ��GrZ�Z�H.|�p �G��pNIEND�B`�PK�X�fm
m
frontline.recipefrom collections import defaultdict
from calibre.web.feeds.news import BasicNewsRecipe, classes

class Frontline(BasicNewsRecipe):
    title = u'Frontline'
    __author__ = 'unkn0wn'
    description = 'Frontline, the fortnightly English magazine from the stable of The Hindu, has been a distinguished presence in the media world since 1984.'
    language = 'en_IN'
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    encoding = 'utf-8'
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://frontline.thehindu.com/theme/images/fl-online/frontline-logo.png'
    remove_attributes = ['height', 'width']
    resolve_internal_links = True
    extra_css = '''
        .environment, .publish-time, .author { font-size:small; color:#404040; }
        .caption { font-size:small; text-align:center; }
        img { display:block; margin:0 auto; }
        .question {font-weight:bold;}
    '''

    keep_only_tags = [
        dict(name='div', attrs={'class':'container article-section'})
    ]

    remove_tags = [
        classes(
            'breadcrumb comments-shares share-page article-video '
            'referpara slide-mobile title-patch hide-mobile related-stories'
        ),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-original':True}):
            if img['data-original'].endswith('1x1_spacer.png'):
                source = img.findPrevious('source', srcset=True)
                img.extract()
                if source:
                    source['src'] = source['srcset'].replace('_320','_1200')
                    source.name = 'img'
            else:
                img['src'] = img['data-original']
        for cap in soup.findAll(**classes('caption')):
            cap.name = 'figcaption'
        return soup

    def postprocess_html(self, soup, first_fetch):
        for src in soup.findAll('source'):
            src.extract()
        return soup

    def parse_index(self):
        soup = self.index_to_soup('https://frontline.thehindu.com/current-issue/')
            
        if cover := soup.find('div', attrs={'class':'magazine'}):
            self.cover_url = cover.find(**classes('sptar-image')).img['data-original'].replace('_320', '_1200')
            self.log('Cover ', self.cover_url)
            if desc := cover.find(**classes('sub-text')):
                self.description = self.tag_to_string(desc)
            
        feeds_dict = defaultdict(list)
        
        mag = soup.find(**classes('section-magazine'))
        for div in mag.findAll('div', attrs={'class':'content'}):
            a = div.find(**classes('title')).find('a')
            url = a['href']
            title = self.tag_to_string(a)
            section = 'Articles'
            if cat := div.find(**classes('label')):
                section = self.tag_to_string(cat)
            desc = ''
            
            if art := div.find(**classes('sub-text')):
                desc = self.tag_to_string(art)
            if auth := div.find(**classes('author')):
                desc = self.tag_to_string(auth) + ' | ' + desc
            if not url or not title:
                continue
            self.log(section, '\n\t', title, '\n\t', desc, '\n\t\t', url)
            feeds_dict[section].append({"title": title, "url": url, "description": desc})
        return [(section, articles) for section, articles in feeds_dict.items()]PK�X�:�fstream.png�PNG


IHDR(-S?PLTEBzBzBzBzBzBz@q�������`��N���Ϳ��P}���� Z�p�����0e����e�\tRNS!a���hϣ|IDATx�<��� D�Ep�V��������P?����w<�.�۰��B�ܬ�`i,��Q�"�p�e��*>���96��z>G�D���q�q��%�76�!k��1�akhN�����,��2�lIEND�B`�PK�X.��,,fstream.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class FIELDSTREAM(BasicNewsRecipe):
    title = 'Field and Stream'
    __author__ = 'Starson17 and Tonythebookworm'
    description = 'Hunting and Fishing and Gun Talk'
    language = 'en'
    no_stylesheets = True
    publisher = 'Starson17 and Tonythebookworm'
    category = 'food recipes, hunting, fishing, guns'
    use_embedded_content = False
    no_stylesheets = True
    oldest_article = 24
    remove_javascript = True
    remove_empty_feeds = True
    cover_url = 'http://www.arrowheadflyangler.com/Portals/1/Articles/FieldStream/Field%20and%20Stream%20March%20Fishing%20Edition%20Article%20Cover.jpg'  # noqa
    max_articles_per_feed = 10
    INDEX = 'http://www.fieldandstream.com'

    keep_only_tags = [
        dict(name='div', attrs={'class': ['article-wrapper']}),
    ]
    remove_tags = [
        dict(name='div', attrs={
             'class': lambda x: x and 'content-main-bottom' in x.split()}),
        dict(name='div', attrs={
             'class': lambda x: x and 'pw-widget' in x.split()}),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        for form in soup.findAll('form'):
            form.parent.extract()
        return soup

    def parse_index(self):
        feeds = []
        num = self.test[0] if self.test else 100
        for title, url in [
                ('Field Test', 'http://www.fieldandstream.com/blogs/field-test'),
                (u"Wild Chef", u"http://www.fieldandstream.com/blogs/wild-chef"),
                (u"The Gun Nuts", u"http://www.fieldandstream.com/blogs/gun-nut"),
                (u"Whitetail 365", u"http://www.fieldandstream.com/blogs/whitetail-365"),
                ('Field Notes', 'http://www.fieldandstream.com/blogs/field-notes'),
                (u"Fly Talk",  u"http://www.fieldandstream.com/blogs/flytalk"),
                (u"The Conservationist",
                 u"http://www.fieldandstream.com/blogs/conservationist"),
                ('The Lateral Line', 'http://www.fieldandstream.com/blogs/lateral-line'),
                ('Total Outdoorsman',
                 'http://www.fieldandstream.com/blogs/total-outdoorsman'),
                ('A Sportsman\'s Life',
                 'http://www.fieldandstream.com/blogs/a-sportsmans-life'),
        ]:
            self.log('Section:', title)
            articles = self.make_links(url)
            if articles:
                feeds.append((title, articles))
            if len(feeds) > num:
                break
        return feeds

    def make_links(self, url):
        current_articles = []
        soup = self.index_to_soup(url)
        for item in soup.findAll('h2'):
            link = item.find('a')
            if link:
                url = self.INDEX + link['href']
                title = self.tag_to_string(link)
                self.log('\t', title, 'at', url)
                current_articles.append(
                    {'title': title, 'url': url, 'description': '', 'date': ''})
        return current_articles
PK�X���K��fudzilla.png�PNG


IHDR(-STPLTEFPf�����Ԣ������ō��os�Zau���}s}�nc�UG޲��[#���PQb�Y0�TK���ej|PYm�W>nST�K4�L*�N)ZQ]�0�~ZIDATxڍ�1ё�)X����ɥ'�nsYIP�z3uF(�e`����`�p�@�dM���K�����7ѡ�[�~�{%�|��>�������I�IEND�B`�PK�X�W?�fudzilla.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2010 Starson17'
'''
fudzilla.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Fudzilla(BasicNewsRecipe):
    title = u'Fudzilla'
    __author__ = 'Starson17'
    language = 'en'

    description = 'Tech news'
    oldest_article = 7
    remove_javascript = True
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    remove_tags_before = dict(name='div', attrs={'class': ['padding']})

    remove_tags = [dict(name='td', attrs={'class': ['left', 'right']}),
                   dict(name='div', attrs={'id': ['toolbar', 'buttons']}),
                   dict(name='div', attrs={
                        'class': ['artbannersxtd', 'back_button']}),
                   dict(name='span', attrs={'class': ['pathway']}),
                   dict(name='th', attrs={
                        'class': ['pagenav_next', 'pagenav_prev']}),
                   dict(name='table', attrs={'class': ['headlines']}),
                   ]

    feeds = [
        (u'Posts', u'http://www.fudzilla.com/?format=feed')
    ]

    preprocess_regexps = [
        (re.compile(r'<p class="MsoNormal"> Welcome.*</p> ',
                    re.DOTALL | re.IGNORECASE), lambda match: '')
    ]
PK�X
��a!!furesoelokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�XDL11furesoelokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Furesø Avis
'''


class FuresoeLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Furesø Avis'
    description = 'Lokale og regionale nyheder, sport og kultur fra Farum, Værløse og Furesø på furesoe.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Furesø Avis', 'http://furesoe.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Furesø Avis', 'http://furesoe.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Furesø Avis', 'http://furesoe.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Furesø Avis', 'http://furesoe.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Furesø Avis', 'http://furesoe.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Furesø Avis', 'http://furesoe.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X�.R�FFfurstenfeldbrucker_tagblatt.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�U5��"furstenfeldbrucker_tagblatt.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Fürstenfeldbrucker Tagblatt'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Kreis F\xfcrstenfeldbruck', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/rssfeed.rdf'),
    (u'Lkr F\xfcrstenfeldbruck', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/landkreis/rssfeed.rdf'),
    (u'Germering', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/germering/rssfeed.rdf'),
    (u'F\xfcrstenfeldbruck', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/fuerstenfeldbruck/rssfeed.rdf'),
    (u'Grafrath', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/grafrath/rssfeed.rdf'),
    (u'Moorenweis/Geltendorf', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/moorenweis-geltendorf/rssfeed.rdf'),
    (u'Mammendorf', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/mammendorf/rssfeed.rdf'),
    (u'Maisach', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/maisach/rssfeed.rdf'),
    (u'Olching', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/olching/rssfeed.rdf'),
    (u'Puchheim', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/puchheim/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/fuerstenfeldbruck/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�Xއ��futurismic.png�PNG


IHDR��h6�IDATx�c0N����Rgh�Mш���8U'q����M�E֜�Y{�o?����
Gnx�-��A;~JFߖ�0��߿�U�5Lm\p��Х���뭲���`�7����
_��|��sp�J|lr�=��$����T;o?\Cے�@_�Ӡ7�l�n�����5b'�S�`hơk�L���!��`�K�ְz��3ռV/i��ē/M
��IEND�B`�PK�X�c&&futurismic.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
futurismic.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Futurismic(BasicNewsRecipe):
    title = 'Futurismic'
    __author__ = 'Darko Miletic'
    description = 'Near-future science fiction and fact since 2001'
    oldest_article = 15
    max_articles_per_feed = 100
    language = 'en'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = False
    publication_type = 'blog'
    extra_css = ' body{font-family: Arial,Verdana,sans-serif} '

    conversion_options = {
        'comment': description, 'tags': 'blog, sf', 'publisher': 'Futurismic', 'language': language
    }

    remove_attributes = ['width', 'height']
    keep_only_tags = [dict(attrs={'class': ['post', 'commentlist']})]
    remove_tags = [dict(attrs={'class': ['sociable', 'feedback', 'tagwords']})]
    feeds = [(u'Posts', u'http://feeds2.feedburner.com/futurismic_feed')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X-$J�	�	galaxys_edge.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

import re
import shutil

try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode
from calibre.ptempfile import PersistentTemporaryDirectory, PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1515196393(BasicNewsRecipe):
    title = "The Galaxy's Edge"
    __author__ = 'andyh2000'
    delay = 2
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True
    language = 'en'
    encoding = 'utf8'
    no_stylesheets = True

    extra_css = '.photo-caption { font-size: smaller }'

    def parse_index(self):
        soup = self.index_to_soup('http://www.galaxysedge.com/')
        cover_image = soup.find('div', attrs={'class':'ci-img'})
        cover_image = cover_image.find('img')
        self.cover_url = cover_image['src']
        issue_title = soup.find('h1')
        self.title = "Galaxy's Edge: " + self.tag_to_string(issue_title).lower().title()
        toc = soup.find('div', attrs={'class':'nav-tabs'})
        current_section = "Articles"
        current_articles = []
        feeds = []
        br = self.get_browser()
        self.ctdir = PersistentTemporaryDirectory()
        for x in toc.findAll(['li'], attrs={"class": re.compile(".*get_content.*")}):
            edwo = x.find('a')
            title = self.tag_to_string(edwo)
            self.log('\t\tFound article:', title)
            post_id = x["data-post-id"]
            cat_id = x["data-cat-id"]
            parent_id = x["data-parent-id"]
            self.log('\t\tdata-parent-id', parent_id)
            self.log('\t\tdata-cat-id', cat_id)
            self.log('\t\tdata-post-id', post_id)
            data = urlencode({'action':'get_content', 'cat_id':cat_id, 'parent_id':parent_id, 'post_id':post_id})
            r=br.open('http://www.galaxysedge.com/wp-content/themes/galaxyedge/get_content.php', data)
            content_file = PersistentTemporaryFile(suffix='.html', dir=self.ctdir)
            content_file.write(r.read())
            content_file.close()
            current_articles.append({'title': title, 'url':'file://' + content_file.name, 'description':'', 'date':''})
        if current_articles and current_section:
            feeds.append((current_section, current_articles))

        return feeds

    def cleanup(self):
        self.log("Deleting temp files...")
        shutil.rmtree(self.ctdir)
PK�XL� ��galicia_confidential.png�PNG


IHDR�a�IDATx�b����J� 2@(9Xq<�-�u͝�m۶m۶msm{�m��q�>���{U��G�1�H�KƞJ��'E��)�o�A�և�/G����y*5,?�|z0�h1���h��;^e2�뒿�|�P%��K��C���A�+��"������eq�.���}�N��yx�7>�\ɝ/�1�t>�2����{�/�H��aءx�Es%�������G�jt���O���d�𧈉�Snb�#��$Jl����/a^��\����R�����Ţ(c�!s���I:�M��)p�*�Ѕ
��Ε�]�~��Ǿ��KARo�t_�4,�i����`W�ĐMO�x�9�4�t��ec�����']�F6��+�d����{�V�A���l��q{RIEND�B`�PK�X��?�..galicia_confidential.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.web.feeds import Feed


class GC_gl(BasicNewsRecipe):
    title = u'Galicia Confidencial (RSS)'
    __author__ = u'Susana Sotelo Docío'
    description = u'Unha fiestra de información aberta a todos'
    publisher = u'Galicia Confidencial'
    category = u'news, society, politics, Galicia'
    encoding = 'utf-8'
    language = 'gl'
    direction = 'ltr'
    cover_url = 'http://galiciaconfidencial.com/imagenes/header/logo_gc.gif'
    oldest_article = 5
    max_articles_per_feed = 100
    center_navbar = False

    feeds = [(u'Novas no RSS', u'http://galiciaconfidencial.com/rss2/xeral.rss')]

    extra_css = u' p{text-align:left} '

    def print_version(self, url):
        return url.replace('http://galiciaconfidencial.com/nova/', 'http://galiciaconfidencial.com/imprimir/')

    def parse_index(self):
        feeds = []
        self.gc_parse_feeds(feeds)
        return feeds

    def gc_parse_feeds(self, feeds):
        rssFeeds = Feed()
        rssFeeds = BasicNewsRecipe.parse_feeds(self)
        self.feed_to_index_append(rssFeeds[:], feeds)

    def feed_to_index_append(self, feedObject, masterFeed):
        for feed in feedObject:
            newArticles = []
            for article in feed.articles:
                newArt = {
                    'title': article.title,
                    'url': article.url,
                    'date': article.date
                }
                newArticles.append(newArt)
            masterFeed.append((feed.title, newArticles))
PK�X��gamasutra_fa.png�PNG


IHDR��h6rIDATx�c���������['[6��O��Q���ȭ����J��1�������4*,U
��9%��U�4˭N�9��~��;3[��R)[[!U��2�4+��T��������_�w���(�TO3��"�t#�Pό}���Q���ϽW��-�,�T/4�v�161�w�#c#m7m�"3���W�u����2�B�M���.))1mmm�=t�
*,�8�P��C��@�DM#���<++���u�������g�)���vo�����"˥�%�����7mڴ;v�߿� �xzyj���%IH��G0����J�s)�K���͞=������sѢES�LqvvV�����f��c����¶?�X�e��JJH������A�!<y����/��|�B�앪d� �@E_����02���4B��
����ۇYG'�MP�j␮��Sttvg{�Hy��T;P��#����Fܻ�oB�zHurHwp���*�*����E�(d�ۻ�o���_�MS��搮㐯┯䔩�r
�)���%-�S����R]�M�a��u 
@A���tX��V�Ev���
�K]&�8�����r]"IEND�B`�PK�X�t���gamasutra_fa.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
gamasutra.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Gamasutra(BasicNewsRecipe):
    title = 'Gamasutra Featured articles'
    __author__ = 'Darko Miletic'
    description = 'The Art and Business of Making Games'
    publisher = 'Gamasutra'
    category = 'news, games, IT'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    masthead_url = 'http://www.gamasutra.com/images/gamasutra_logo.gif'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    remove_tags_before = dict(name="div", attrs={'class': 'page_item'})
    remove_tags = [
        dict(name='meta'), dict(name='link'), dict(name='hr'), dict(name='div', attrs={'class': 'hide-phone'}), dict(name='div', attrs={'class': 'nav_links'}),
        dict(name='div', attrs={'class': 'superfooter'}), dict(name='span', attrs={'class': 'comment_text'}), dict(name='a', attrs={'type': 'button'})
    ]
    remove_attributes = ['width', 'height', 'name']

    feeds = [
        (u'Feature Articles', u'http://feeds.feedburner.com/GamasutraFeatureArticles')]

    def print_version(self, url):
        return url.partition('?')[0] + '?print=1'
PK�X��gamasutra_news.png�PNG


IHDR��h6rIDATx�c���������['[6��O��Q���ȭ����J��1�������4*,U
��9%��U�4˭N�9��~��;3[��R)[[!U��2�4+��T��������_�w���(�TO3��"�t#�Pό}���Q���ϽW��-�,�T/4�v�161�w�#c#m7m�"3���W�u����2�B�M���.))1mmm�=t�
*,�8�P��C��@�DM#���<++���u�������g�)���vo�����"˥�%�����7mڴ;v�߿� �xzyj���%IH��G0����J�s)�K���͞=������sѢES�LqvvV�����f��c����¶?�X�e��JJH������A�!<y����/��|�B�앪d� �@E_����02���4B��
����ۇYG'�MP�j␮��Sttvg{�Hy��T;P��#����Fܻ�oB�zHurHwp���*�*����E�(d�ۻ�o���_�MS��搮㐯┯䔩�r
�)���%-�S����R]�M�a��u 
@A���tX��V�Ev���
�K]&�8�����r]"IEND�B`�PK�X6/u���gamasutra_news.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
gamasutra.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Gamasutra(BasicNewsRecipe):
    title = 'Gamasutra News'
    __author__ = 'Darko Miletic'
    description = 'The Art and Business of Making Games'
    publisher = 'Gamasutra'
    category = 'news, games, IT'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    masthead_url = 'http://www.gamasutra.com/images/gamasutra_logo.gif'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    remove_tags_before = dict(name="div", attrs={'class': 'page_item'})
    remove_tags = [
        dict(name='meta'), dict(name='link'),
        dict(name='hr'), dict(name='div', attrs={'class': 'hide-phone'}),
        dict(name='div', attrs={'class': 'nav_links'}), dict(name='div', attrs={'class': 'superfooter'}),
        dict(name='span', attrs={'class': 'comment_text'}), dict(name='a', attrs={'type': 'button'})
    ]
    remove_attributes = ['width', 'height', 'name']

    feeds = [(u'News', u'http://feeds.feedburner.com/GamasutraNews')]

    def print_version(self, url):
        return url.partition('?')[0] + '?print=1'
PK�X��N5��gamekult.png�PNG


IHDR  szz��IDATx�b Z- Yz(
�Xk۶��m۶m۶m۶m����I�{<��[�=tR�'W��68\������`-P,7:��$	�����V8^^b�wإ#�+k��V%��Uq�����zŇ�1π9`Rv,������Hޙ[+�/m���f��~{{n���T$�2��"�aq�7!
���Y&�.o�A���
�C��ָ�콡�Tj�P!W���|��u0o�c�����f�����+5��[�6!�!��g�7�>��4ʗ�ek��eYrYk�|4�N�����H?��}if���AL�
�lP��n���YL~��g��c�����gE�|a�#
��}�B
���^R�w�OKxs:J(�s�w;�Z�g<9�����?tD�}.c�s�VBnB� ����T�]��Q�j�·ѫ�JB�,�=dF���nܔ��E���5q^�we������HaM�2
�5k��l
X��n� a�,��rȧ�+�si��:�Z��]ٜxm
B��T���C-��A}�c�B��&}!�G����-��t$�k9Ҡ�fQ��k���ʖ(zӏP����_jc��Z�F�&��<wlr��T��fkr�n��{"0�K�aO�F���g��W�5@��K5S0��gV�к�6��@:Xq�9d���H,��"s��E�U^�R�T��4%��,��@m�<����m��mH!ϯ�4��R"R/#e�`�R@>�rvS��g�	/��x�I�� �de��N�1�,��Q\e>�%zF�%�ŷ�VB�m/�R> �Y>(H�cJ��+�D��Bf/�����|zf��ܓ�=�7g+y�h>���1�-�j�&���W�#��ћ�^���\)7���h1� dےL�@�UD~�?89X��}!fk�c;����e���$�����	ޜ5�"⡌��C���7��3�77�8�
 �5qu[	oC!�d8�=d��s9~��sN.���(҃=�������u��[�zk���;��V#C`_0)�b���{��
�l��7=�Byt�)[/��$	���`�傕��:�7i.�� {"�)�1����(IEND�B`�PK�X�U��gamekult.recipefrom __future__ import unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2013, Malah <malah at neuf dot fr>'
'''
Gamekult.com
'''

__author__ = '2013, Malah <malah at neuf dot fr>'
from calibre.web.feeds.news import BasicNewsRecipe


class GamekultCom(BasicNewsRecipe):
    title = u'Gamekult.com'
    __author__ = 'Malah'
    description = u'Toute l`actualité du jeu vidéo PC, consoles, mobiles.'
    oldest_article = 1.5
    language = 'fr'
    max_articles_per_feed = 100
    remove_empty_feeds = True
    use_embedded_content = False
    no_stylesheets = True
    ignore_duplicate_articles = {'title', 'url'}
    keep_only_tags = [dict(id=['story-page', 'story-body'])]
    remove_tags = [
        dict(name='div', attrs={'class': 'sharebar'}),
        dict(name='object', attrs={'type': 'application/x-shockwave-flash'}),
        dict(name='span', attrs={'class': 'share'}),
        dict(name='div', attrs={'class': 'story-pagination'}),
        dict(name='div', attrs={'class': 'pagination pagination-centered'}),
    ]

    masthead_url = u'https://upload.wikimedia.org/wikipedia/fr/9/9c/Logo_-_GAMEKULT.png'

    feeds = [
        ('Test', u'http://www.gamekult.com/feeds/test.html'),
        ('Actu', u'http://www.gamekult.com/feeds/actu.html'),
    ]
PK�X⩹���gameplay_pl.png�PNG


IHDR��h6�IDATx�}�
DCQ�_��H���"�0��,�-Yِ���Y�DJ%)(��d��$�&b�Aii���:�2l/������w>$Ū"�$��0I��(<߫���l����L����fN-ZU��p=�gFBP �(}���Y�c��lz�I"
�,�FRQXu!P���@�7h��3p4R�TX4�\V �<�F[ޞB��2�ž��D;{*��_`T�5��?�r��k�A�����KuŬ5YC���{3�=�E�
�����™�{��EX�:y��;l������s=��:�JSqL�[ɠ�*�{��(,Y����!
��|�5%���`����;^}5�WG��qإZ17K�a�_�-t�	B8���� q����@�w�wyQ�
/[?�E����IEND�B`�PK�X��E���gameplay_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Gameplay_pl(BasicNewsRecipe):
    title = u'Gameplay.pl'
    oldest_article = 7
    __author__ = 'fenuks'
    description = u'gameplay.pl - serwis o naszych zainteresowaniach, grach, filmach, książkach, muzyce, fotografii i konsolach.'
    category = 'games, movies, books, music'
    language = 'pl'
    index = 'https://gameplay.pl'
    masthead_url = 'https://gameplay.pl/img/gpy_top_logo.png'
    cover_url = 'https://gameplay.pl/img/gpy_top_logo.png'
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    keep_only_tags = [dict(
        name='div', attrs={'class':'news-container'})]
    remove_tags = [
        dict(name='div', attrs={'class': [
            'galeria', 'noedit center im', 'news_list', 'news_list_autor', 'stop_bot', 'tagi', 'news_tagi', 'social-16']}),
        dict(attrs={'usemap': '#map'}),
        dict(name='a', attrs={'class': ['pin-it-button', 'twitter-share-button']})
    ]
    feeds = [(u'Wiadomo\u015bci', u'https://gameplay.pl/rss/')]

    def image_url_processor(self, baseurl, url):
        if 'https' not in url:
            return 'https://gameplay.pl' + url[2:]
        else:
            return url

    def preprocess_html(self, soup):
        for a in soup('a', href=True):
            if '../' in a['href']:
                a['href'] = self.index + a['href'][2:]
        return soup
PK�X����gamespot.png�PNG


IHDR  szz�[IDATx�ŗ�A�k+l�Զ�ب۸�kی]\�5��n�F�����K���dgo>�M��f޾���6y9���`8n�O�J�$�C����I�P��IM�b��Aud���^-m�5�<Rb
�XF����Vb+%��kE���P�Q	�C��Urϰ�h�2�|��_`�.�"��H�3�ih��;04)����(<mC�S�O0H�E#Z?I�6�C}�s$^J����x�!�,[�>�,�3�.�:�_A�ڨ���xf���E�@�48���E�C�R�x�\�W�S`�Q44�x�l<]%��
v�.�I�H�E��F�y�x��r��$��i�B�Π^8^D7t �/i��~ևרXQLK����
��}�P��+�ꔁ���F�D�+�p�Qt*0���-��G�m��\-�K�p4��5��PoDW#�m:}/.W�F���=|;cD{
^��b�3:�h�a`	�6������V�Rb��e//1��߱p�$�������g	������O0��
��ý���:�E��呃�rpULD�g!G�%8���lz���bR�+C;�Ab��x>7��y\����:�IEND�B`�PK�X���gamespot.recipe__license__ = 'GPL v3'
__author__ = u'Marc Toensing'

from calibre.web.feeds.news import BasicNewsRecipe


class GamespotCom(BasicNewsRecipe):

    title = u'Gamespot.com Reviews'
    description = 'review articles from gamespot.com'
    language = 'en'
    __author__ = u'Marc T\xf6nsing'

    oldest_article = 7
    max_articles_per_feed = 40
    remove_empty_feeds = True
    no_stylesheets = True
    no_javascript = True

    feeds = [
        ('All Reviews', 'http://www.gamespot.com/rss/game_updates.php?type=5'),
        ('PC Reviews', 'http://www.gamespot.com/rss/game_updates.php?type=5&platform=5'),
        ('XBOX 360 Reviews',
         'http://www.gamespot.com/rss/game_updates.php?type=5&platform=1029'),
        ('Wii Reviews', 'http://www.gamespot.com/rss/game_updates.php?type=5&platform=1031'),
        ('PlayStation 3 Reviews',
         'http://www.gamespot.com/rss/game_updates.php?type=5&platform=1028'),
        ('PlayStation 2 Reviews',
         'http://www.gamespot.com/rss/game_updates.php?type=5&platform=7'),
        ('PlayStation Portable Reviews',
         'http://www.gamespot.com/rss/game_updates.php?type=5&platform=1024'),
        ('Nintendo DS Reviews',
         'http://www.gamespot.com/rss/game_updates.php?type=5&platform=1026'),
        ('iPhone Reviews',
         'http://www.gamespot.com/rss/game_updates.php?type=5&platform=1049'),
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'top_bar'}),
        dict(name='div', attrs={'class': 'video_embed'})
    ]

    def get_cover_url(self):
        return 'http://image.gamespotcdn.net/gamespot/shared/gs5/gslogo_bw.gif'

    def get_article_url(self, article):
        return article.get('link') + '?print=1'
PK�X��
�
gandul.png�PNG


IHDR  D���PLTE�����w|�/9�6�8�IDATxڕ�QjAQU�w�'��"�k�!h�3�  w�z�p0_�@(��U�Z�
Pm���ԇA��m��(��7HtL@��.`'f�:��Zq~�p���zj�X���#�\M��Nub��
߀�6��$����8�7�;�4����|��k�
h���E�XWp�D�dx9@�|3b���IEND�B`�PK�Xd��}��
gandul.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
gandul.info
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Gandul(BasicNewsRecipe):
    title = u'G\u00E2ndul'
    __author__ = u'Silviu Cotoar\u0103'
    publisher = 'Gandul'
    description = 'Cotidian Online'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania'
    encoding = 'utf-8'
    cover_url = 'http://storage0.dms.mpinteractiv.ro/media/1/1/1706/1064063/1/logo.jpg?width=400'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'article'})
    ]

    remove_tags = [
        dict(name='a', attrs={'class': 'photo'}), dict(
            name='div', attrs={'class': 'ad'})
    ]

    feeds = [
        (u'\u0218tiri', u'http://www.gandul.info/rss-stiri-prima-pagina.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�.R�FFgarmischer_tagblatt.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�#���garmischer_tagblatt.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Garmisch-Partenkirchener Tagblatt'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard', u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Kreis Garmisch-Partenkirchen', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/rssfeed.rdf'),
    (u'Lkr. Garmisch-Partenkirchen', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/landkreis/rssfeed.rdf'),
    (u'Oberammergau', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/oberammergau/rssfeed.rdf'),
    (u'Murnau', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/murnau/rssfeed.rdf'),
    (u'Garmisch-Partenkirchen', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/garmisch-partenkirchen/rssfeed.rdf'),
    (u'Mittenwald', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/mittenwald/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�XID�/��gazeta-prawna-calibre-v1.png�PNG


IHDR��h6�IDATx�cxh�J�P���C-��:
 ���Cu��j�@bhˡjД~(����䂗���C�_�|X�a^�������(/Ӡ$��9�������L/�?̬����xc���|p�C1��Z���܁��>�U$@Vˋ�nN�0��COP���C��rAli.��
�?>?��}�C9A�gT��V}�T� +�ar>X7�C)N�J�I��#�PU�(χ�� 'E�*�2>m�}�*�P�P�᱋���MVX��i~-�3`O�=T{Z�����_O�}(+�A���/�CW�q��5X�d^��<��PQL 
�i:RA�a��
9X�A������a��c�@~�ux����R�
D^�e|X�au���'.J@�/��^V<�Õ4�dA�U��=PJ%=�I������1IEND�B`�PK�XLl(��gazeta-prawna-calibre-v1.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = u'2020, Tomasz Jozwiak <tjozwiakgm@gmail.com>'
__author__ = u'Tomasz Jozwiak'
'''
gazetaprawna.pl
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class gazetaprawna(BasicNewsRecipe):
    version = 2
    title = u'Gazeta Prawna'
    __author__ = u'Tomasz Jozwiak'
    publisher = u'Infor Biznes'
    max_articles_per_feed = 30
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    category = 'newspaper'
    publication_type = 'newspaper'
    description = 'Polski dziennik gospodarczy'
    language = 'pl'
    encoding = 'utf-8'
    ignore_duplicate_articles = {'title', 'url'}
    use_embedded_content = False
    oldest_article = 1

    extra_css = '''
        .psavBigImgTitle {font-size:50%;}
        .psavImgContent {font-size:50%;}
        .leadDiv {font-weight: bold;}
        .date {font-size:50%;}
        .articleGate {font-style: italic; font-weight: normal; font-size:50%;}
    '''

    remove_tags_before = [
        dict(name='div', attrs={'class': ['article']}),
        dict(name='div', attrs={'itemprop': ['breadcrumb']})
    ]

    remove_tags_after = [
       dict(name='div', attrs={'class': ['articleBody', 'artPayWall', 'contentGalBottom', 'komentarze-forum']}),
    ]

    remove_tags = [
        dict(name='span', attrs={'class': ['psav_bigphoto', 'psav_speclinkarea', 'psav_video_target']}),
        dict(name='div', attrs={'class': ['shareArticleButtons nowe2', 'artPayWall', 'contentGalBottom', 'contentGalTop', 'video-target', 'komentarze-forum']}),
        dict(name=['link', 'meta', 'style']),
        dict(name='div', attrs={'itemprop': ['breadcrumb']}),
        dict(name='section', attrs={'class': ['videoSection']})
    ]

    feeds = [
        (u'Z ostatniej chwili', u'http://rss.gazetaprawna.pl/GazetaPrawna'),
        (u'Biznes i prawo gospodarcze', u'http://rss.gazetaprawna.pl/GazetaPrawna-Biznes'),
        (u'Prawo i wymiar sprawiedliwo\u015bci', u'http://rss.gazetaprawna.pl/GazetaPrawna-Prawo'),
        (u'Praca i ubezpieczenia', u'http://rss.gazetaprawna.pl/GazetaPrawna-Praca'),
        (u'Podatki i rachunkowo\u015b\u0107', u'http://rss.gazetaprawna.pl/GazetaPrawna-Podatki'),
        (u'Finanse - waluty i notowania', u'http://rss.gazetaprawna.pl/GazetaPrawna-Finanse'),
    ]

    def parse_feeds(self):
        self.log(_('Gazeta Prawna overrode parse_feeds()'))
        parsed_feeds = BasicNewsRecipe.parse_feeds(self)
        for n, feed in enumerate(parsed_feeds):
            for a, article in enumerate(feed):
                article.text_summary = re.sub(r'<\!\[CDATA\[', "", article.text_summary)
                article.text_summary = re.sub(r'\]\]', "", article.text_summary)
                article.summary = article.text_summary

        return parsed_feeds

    def preprocess_html(self, soup):
        for Img in soup.findAll(name='div', attrs={'class': ['psavBigImg']}):
            for img_tag in Img.findAll(name='img', attrs={'data-src': True}):
                img_tag['src'] = img_tag['data-src']
                del img_tag['data-src']
                # print(Img.prettify())

        for span in soup.findAll(name='span'):
            if len(self.tag_to_string(span)) > 1:
                span.append(" ")

        for locked in soup.findAll(name='div', attrs={'class': ['articleGate']}):
            locked.append(u"Przejd\u017a do artyku\u0142u na GazetaPrawna.pl aby zalogowa\u0107 si\u0119 lub wykupi\u0107 dost\u0119p")

        return soup

    def populate_article_metadata(self, article, soup, first):
        Img = soup.find(name='div', attrs={'class': ['psavBigImg']})
        if Img:
            img_tag = Img.find(name='img', attrs={'src': True})
            if img_tag:
                self.add_toc_thumbnail(article, img_tag['src'])
                self.log(_('adding thumbnail: %s to Article') % (img_tag['src']))
                article.author = 'Gazeta prawna.pl'
                if len(article.title) > 80:
                    title = article.title[:80]
                    title = title.rsplit(None, 1)
                    article.title = title[0]
                    self.log(_('The title cuting in %s to keep the thumbnail visible') % (article.url))

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.egazety.pl/infor/e-wydanie-dziennik-gazeta-prawna.html')
        self.cover_url = soup.find("a", {"class": "image cover-preview"}).img['src']
        return getattr(self, 'cover_url', self.cover_url)
PK�X�v����gazeta_krakowska.png�PNG


IHDR(-S3PLTE5Q�B\�Ng�[r�h}�t����Ǝ�˚�Ѧ�ױ�г���������������	NZIDATx�l��!w���M�g��d��o`�v��m:�Df�C�0+fH��Qc���I����@�b	�$�G��P-�?�'�0	��܌�IEND�B`�PK�X4ȏf��gazeta_krakowska.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class GazetaKrakowska(BasicNewsRecipe):
    title = u'Gazeta Krakowska'
    __author__ = 'fenuks'
    description = u'Gazeta Regionalna Gazeta Krakowska. Najnowsze Wiadomości Kraków. Informacje Kraków. Czytaj!'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    masthead_url = 'http://s.polskatimes.pl/g/logo_naglowek/gazetakrakowska.png?24'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}
    remove_tags_after = dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})
    remove_tags = [dict(id='mat-podobne'), dict(name='a', attrs={
        'class': 'czytajDalej'}), dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})]

    feeds = [
    (u'Fakty24', u'http://gazetakrakowska.feedsportal.com/c/32980/f/533770/index.rss?201302'),
    (u'Krak\xf3w', u'http://www.gazetakrakowska.pl/rss/gazetakrakowska_krakow.xml?201302'),
    (u'Tarn\xf3w', u'http://www.gazetakrakowska.pl/rss/gazetakrakowska_tarnow.xml?201302'),
    (u'Nowy S\u0105cz', u'http://www.gazetakrakowska.pl/rss/gazetakrakowska_nsacz.xml?201302'),
    (u'Ma\u0142. Zach.', u'http://www.gazetakrakowska.pl/rss/gazetakrakowska_malzach.xml?201302'),

    (u'Podhale', u'http://www.gazetakrakowska.pl/rss/gazetakrakowska_podhale.xml?201302'),
    (u'Sport', u'http://gazetakrakowska.feedsportal.com/c/32980/f/533771/index.rss?201302'),
    (u'Kultura', u'http://gazetakrakowska.feedsportal.com/c/32980/f/533772/index.rss?201302'),
    (u'Opinie', u'http://www.gazetakrakowska.pl/rss/gazetakrakowska_opinie.xml?201302'),
    (u'Magazyn', u'http://www.gazetakrakowska.pl/rss/gazetakrakowska_magazyn.xml?201302')]

    def print_version(self, url):
        return url.replace('artykul', 'drukuj')

    def skip_ad_pages(self, soup):
        if 'Advertisement' in soup.title:
            nexturl = soup.find('a')['href']
            return self.index_to_soup(nexturl, raw=True)

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.prasa24.pl/gazeta/gazeta-krakowska/')
        self.cover_url = soup.find(id='pojemnik').img['src']
        return getattr(self, 'cover_url', self.cover_url)
PK�XW�vD��gazeta_lubuska.png�PNG


IHDR(-S:PLTE�������	�
�
�
���$�!�$� %� #�$)�(*�01�22�35�33�ƾ�ǿ����
�
�
�������������������
��
�	���
���FF�HJ�ML�NN�PM�QM�SP�RQ�VQ�VP�XQ�XV�WW�VW�TU�ZX�]X�ZZ�`a�dd�ed�kd�si�sm�wn�ur�~t�||�~}�~ↁኃ㋅ፇ㐊䋋呑哐㔑㖏喑斐嘐昒嗔㘓團坘块枙柘槝禠覢驤ꪦ誧魦鮧魪鯪鯫谪賬곬붮뵰쵰귲�뻵뽷뿶��»���ý�ļ�þ�¿��������������������������������������������������������������������������������������������������ĺ������謣窡ߕ�ފ�����OM�MP�:tRNS@��f�IDATx�e��Z����Zd۶m۶m۶m���C�H��닾�m��dς/�}�F������������7U�\�SF�M<�:��g��*#it��R�	`:ܽڹ���?^m�'2�5�-�=������BR��O�sċG�w�4�VX4���КW�
���5�wT��D]�W=G�%��]�M}'!����U�e���y�Z� �r���y��z�+*�+��1�K���Y�,.���آ����GM.�*IEND�B`�PK�Xe����gazeta_lubuska.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class GazetaLubuska(BasicNewsRecipe):
    title = u'Gazeta Lubuska'
    __author__ = 'fenuks'
    description = u'Gazeta Lubuska - portal regionalny województwa lubuskiego.'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    extra_css = 'ul {list-style: none; padding:0; margin:0;}'
    INDEX = 'http://www.gazetalubuska.pl'
    masthead_url = INDEX + '/images/top_logo.png'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}

    feeds = [
    (u'Wszystkie', u'http://www.gazetalubuska.pl/rss.xml'),
    (u'Dreznenko', u'http://www.gazetalubuska.pl/drezdenko.xml'),
    (u'G\u0142og\xf3w', u'http://www.gazetalubuska.pl/glogow.xml'),
    (u'Gorz\xf3w Wielkopolski', u'http://www.gazetalubuska.pl/gorzow-wielkopolski.xml'),
    (u'Gubin', u'http://www.gazetalubuska.pl/gubin.xml'),
    (u'Kostrzyn', u'http://www.gazetalubuska.pl/kostrzyn.xml'),
    (u'Krosno Odrza\u0144skie', u'http://www.gazetalubuska.pl/krosno-odrzanskie.xml'),
    (u'Lubsko', u'http://www.gazetalubuska.pl/lubsko.xml'),
    (u'Mi\u0119dzych\xf3d', u'http://www.gazetalubuska.pl/miedzychod.xml'),
    (u'Mi\u0119dzyrzecz', u'http://www.gazetalubuska.pl/miedzyrzecz.xml'),
    (u'Nowa S\xf3l', u'http://www.gazetalubuska.pl/nowa-sol.xml'),
    (u'S\u0142ubice', u'http://www.gazetalubuska.pl/slubice.xml'),
    (u'Strzelce Kraje\u0144skie', u'http://www.gazetalubuska.pl/strzelce-krajenskie.xml'),
    (u'Sulech\xf3w', u'http://www.gazetalubuska.pl/sulechow.xml'),
    (u'Sul\u0119cin', u'http://www.gazetalubuska.pl/sulecin.xml'),
    (u'\u015awi\u0119bodzin', u'http://www.gazetalubuska.pl/swiebodzin.xml'),
    (u'Wolsztyn', u'http://www.gazetalubuska.pl/wolsztyn.xml'),
    (u'Wschowa', u'http://www.gazetalubuska.pl/wschowa.xml'),
    (u'Zielona G\xf3ra', u'http://www.gazetalubuska.pl/zielona-gora.xml'),
    (u'\u017baga\u0144', u'http://www.gazetalubuska.pl/zagan.xml'),
    (u'\u017bary', u'http://www.gazetalubuska.pl/zary.xml'),
    (u'Sport', u'http://www.gazetalubuska.pl/sport.xml'),
    (u'Auto', u'http://www.gazetalubuska.pl/auto.xml'),
    (u'Dom', u'http://www.gazetalubuska.pl/dom.xml'),
    (u'Praca', u'http://www.gazetalubuska.pl/praca.xml'),
    (u'Zdrowie', u'http://www.gazetalubuska.pl/zdrowie.xml')]

    keep_only_tags = [dict(id='article')]

    def get_cover_url(self):
        soup = self.index_to_soup(
            self.INDEX + '/apps/pbcs.dll/section?Category=JEDYNKI')
        nexturl = self.INDEX + soup.find(id='covers').find('a')['href']
        soup = self.index_to_soup(nexturl)
        self.cover_url = self.INDEX + \
            soup.find(id='cover').find(name='img')['src']
        return getattr(self, 'cover_url', self.cover_url)

    def decode_feedportal_url(self, url):
        link = url.rpartition('l/0L0S')[2][:-12]
        replaces = (('0B', '.'), ('0C', '/'), ('0H', ','),
                    ('0D', '?'), ('0F', '='), ('0A', '0'), ('0I', '_'))
        for t in replaces:
            link = link.replace(*t)
        return 'http://' + link

    def print_version(self, url):
        return self.decode_feedportal_url(url) + '&Template=printpicart'
PK�X��Neegazeta_pl_bydgoszcz.png�PNG


IHDR%=m"PLTE�!(�LtRNS@��f
IDATx�c��A��q����IEND�B`�PK�XR��l��gazeta_pl_bydgoszcz.recipe#!/usr/bin/env python

__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment
import re


class gw_bydgoszcz(BasicNewsRecipe):
    title = u'Gazeta Wyborcza Bydgoszcz'
    __author__ = 'fenuks'
    language = 'pl'
    description = 'Wiadomości z Bydgoszczy na portalu Gazeta.pl.'
    category = 'newspaper'
    publication_type = 'newspaper'
    masthead_url = 'http://bi.gazeta.pl/im/3/4089/m4089863.gif'
    INDEX = 'http://bydgoszcz.gazeta.pl'
    cover_url = 'http://bi.gazeta.pl/i/hp/hp2009/logo.gif'
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}

    # rules for gazeta.pl
    preprocess_regexps = [
        (re.compile(u'<b>Czytaj więcej</b>.*', re.DOTALL), lambda m: '</body>')]
    keep_only_tags = [dict(id='gazeta_article')]
    remove_tags = [dict(id=['gazeta_article_tools', 'gazeta_article_miniatures']), dict(
        attrs={'class': ['mod mod_sociallist', 'c0', 'fb', 'voteNeedLogin']})]
    remove_tags_after = dict(id='gazeta_article_body')

    feeds = [
        (u'Wiadomości', u'http://rss.feedsportal.com/c/32739/f/530239/index.rss')]

    def print_version(self, url):
        if 'feedsportal.com' in url:
            s = url.rpartition('gazeta0Bpl')
            u = s[2]
            if not s[0]:
                u = url.rpartition('wyborcza0Bpl')[2]
            u = u.replace('/l/', '/')
            u = u.replace('/ia1.htm', '')
            u = u.replace('0Dbo0F1', '')
            u = u.replace('/story01.htm', '')
            u = u.replace('0C', '/')
            u = u.replace('A', '')
            u = u.replace('0E', '-')
            u = u.replace('0H', ',')
            u = u.replace('0I', '_')
            u = u.replace('0B', '.')
            u = self.INDEX + u
            return u
        else:
            return url

    def preprocess_html(self, soup):
        tag = soup.find(id='Str')
        if soup.find(attrs={'class': 'piano_btn_1'}):
            return None
        elif tag and tag.findAll('a'):
            self.append_page(soup, soup.body)
        return soup

    def append_page(self, soup, appendtag):
        tag = soup.find('div', attrs={'id': 'Str'})
        try:
            baseurl = soup.find(name='meta', attrs={
                                'property': 'og:url'})['content']
        except:
            return 1
        link = tag.findAll('a')[-1]
        while link:
            soup2 = self.index_to_soup(baseurl + link['href'])
            link = soup2.find('div', attrs={'id': 'Str'}).findAll('a')[-1]
            if u'następne' not in link.string:
                link = ''
            pagetext = soup2.find(id='artykul')
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
        tag.extract()

    def image_url_processor(self, baseurl, url):
        if url.startswith(' '):
            return url.strip()
        else:
            return url
PK�X��Neegazeta_pl_krakow.png�PNG


IHDR%=m"PLTE�!(�LtRNS@��f
IDATx�c��A��q����IEND�B`�PK�X�-��#
#
gazeta_pl_krakow.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = 'teepel <teepel44@gmail.com> based on GW from fenuks'

'''
krakow.gazeta.pl
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re
from calibre.ebooks.BeautifulSoup import Comment


class gw_krakow(BasicNewsRecipe):
    title = u'Gazeta Wyborcza Kraków'
    __author__ = 'teepel <teepel44@gmail.com> based on GW from fenuks'
    language = 'pl'
    description = u'Wiadomości z Krakowa na portalu Gazeta.pl.'
    category = 'newspaper'
    publication_type = 'newspaper'
    # encoding = 'iso-8859-2'
    masthead_url = 'http://bi.gazeta.pl/im/5/8528/m8528105.gif'
    INDEX = 'http://krakow.gazeta.pl'
    cover_url = 'http://bi.gazeta.pl/i/hp/hp2009/logo.gif'
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}

    # rules for gazeta.pl
    preprocess_regexps = [
        (re.compile(u'<b>Czytaj więcej</b>.*', re.DOTALL), lambda m: '</body>')]
    keep_only_tags = [dict(id='gazeta_article')]
    remove_tags = [dict(id=['gazeta_article_tools', 'gazeta_article_miniatures']), dict(
        attrs={'class': ['mod mod_sociallist', 'c0', 'fb', 'voteNeedLogin']})]
    remove_tags_after = dict(id='gazeta_article_body')

    feeds = [(u'Wiadomości', u'http://rss.gazeta.pl/pub/rss/krakow.xml')]

    def print_version(self, url):
        if 'feedsportal.com' in url:
            s = url.rpartition('gazeta0Bpl')
            u = s[2]
            if not s[0]:
                u = url.rpartition('wyborcza0Bpl')[2]
            u = u.replace('/l/', '/')
            u = u.replace('/ia1.htm', '')
            u = u.replace('/story01.htm', '')
            u = u.replace('0C', '/')
            u = u.replace('A', '')
            u = u.replace('0E', '-')
            u = u.replace('0H', ',')
            u = u.replace('0I', '_')
            u = u.replace('0B', '.')
            u = self.INDEX + u
            return u
        else:
            return url

    def preprocess_html(self, soup):
        tag = soup.find(id='Str')
        if soup.find(attrs={'class': 'piano_btn_1'}):
            return None
        elif tag and tag.findAll('a'):
            self.append_page(soup, soup.body)
        return soup

    def append_page(self, soup, appendtag):
        tag = soup.find('div', attrs={'id': 'Str'})
        try:
            baseurl = soup.find(name='meta', attrs={
                                'property': 'og:url'})['content']
        except:
            return 1
        link = tag.findAll('a')[-1]
        while link:
            soup2 = self.index_to_soup(baseurl + link['href'])
            link = soup2.find('div', attrs={'id': 'Str'}).findAll('a')[-1]
            if u'następne' not in link.string:
                link = ''
            pagetext = soup2.find(id='artykul')
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
        tag.extract()

    def image_url_processor(self, baseurl, url):
        if url.startswith(' '):
            return url.strip()
        else:
            return url
PK�X��Neegazeta_pl_szczecin.png�PNG


IHDR%=m"PLTE�!(�LtRNS@��f
IDATx�c��A��q����IEND�B`�PK�X�.�{{gazeta_pl_szczecin.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment


class GazetaPlSzczecin(BasicNewsRecipe):
    title = u'Gazeta Wyborcza Szczecin'
    description = u'Wiadomości ze Szczecina na portalu Gazeta.pl.'
    __author__ = u'Michał Szkutnik'
    __license__ = u'GPL v3'
    language = 'pl'
    publisher = 'Agora S.A.'
    category = 'news, szczecin'
    INDEX = 'http://szczecin.gazeta.pl'
    cover_url = 'http://bi.gazeta.pl/i/hp/hp2009/logo.gif'
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}

    # rules for gazeta.pl
    preprocess_regexps = [
        (re.compile(u'<b>Czytaj więcej</b>.*', re.DOTALL), lambda m: '</body>')]
    keep_only_tags = [dict(id='gazeta_article')]
    remove_tags = [dict(id=['gazeta_article_tools', 'gazeta_article_miniatures']), dict(
        attrs={'class': ['mod mod_sociallist', 'c0', 'fb', 'voteNeedLogin']})]
    remove_tags_after = dict(id='gazeta_article_body')
    feeds = [(u'Wszystkie', u'http://rss.feedsportal.com/c/32739/f/530434/index.rss')]

    def print_version(self, url):
        if 'feedsportal.com' in url:
            s = url.rpartition('gazeta0Bpl')
            u = s[2]
            if not s[0]:
                u = url.rpartition('wyborcza0Bpl')[2]
            u = u.replace('/l/', '/')
            u = u.replace('/ia1.htm', '')
            u = u.replace('/story01.htm', '')
            u = u.replace('0C', '/')
            u = u.replace('A', '')
            u = u.replace('0E', '-')
            u = u.replace('0H', ',')
            u = u.replace('0I', '_')
            u = u.replace('0B', '.')
            u = self.INDEX + u
            return u
        else:
            return url

    def preprocess_html(self, soup):
        tag = soup.find(id='Str')
        if soup.find(attrs={'class': 'piano_btn_1'}):
            return None
        elif tag and tag.findAll('a'):
            self.append_page(soup, soup.body)
        return soup

    def append_page(self, soup, appendtag):
        tag = soup.find('div', attrs={'id': 'Str'})
        try:
            baseurl = soup.find(name='meta', attrs={
                                'property': 'og:url'})['content']
        except:
            return 1
        link = tag.findAll('a')[-1]
        while link:
            soup2 = self.index_to_soup(baseurl + link['href'])
            link = soup2.find('div', attrs={'id': 'Str'}).findAll('a')[-1]
            if u'następne' not in link.string:
                link = ''
            pagetext = soup2.find(id='artykul')
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
        tag.extract()

    def image_url_processor(self, baseurl, url):
        if url.startswith(' '):
            return url.strip()
        else:
            return url
PK�X��Neegazeta_pl_warszawa.png�PNG


IHDR%=m"PLTE�!(�LtRNS@��f
IDATx�c��A��q����IEND�B`�PK�X��

gazeta_pl_warszawa.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com> based on GW from fenuks'

'''
warszawa.gazeta.pl
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment


class gw_wawa(BasicNewsRecipe):
    title = u'Gazeta Wyborcza Warszawa'
    __author__ = 'teepel <teepel44@gmail.com> based on GW from fenuks'
    language = 'pl'
    description = 'Wiadomości z Warszawy na portalu Gazeta.pl.'
    category = 'newspaper'
    publication_type = 'newspaper'
    masthead_url = 'http://bi.gazeta.pl/im/3/4089/m4089863.gif'
    INDEX = 'http://warszawa.gazeta.pl'
    cover_url = 'http://bi.gazeta.pl/i/hp/hp2009/logo.gif'
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}

    # rules for gazeta.pl
    preprocess_regexps = [
        (re.compile(u'<b>Czytaj więcej</b>.*', re.DOTALL), lambda m: '</body>')]
    keep_only_tags = [dict(id='gazeta_article')]
    remove_tags = [dict(id=['gazeta_article_tools', 'gazeta_article_miniatures']), dict(
        attrs={'class': ['mod mod_sociallist', 'c0', 'fb', 'voteNeedLogin']})]
    remove_tags_after = dict(id='gazeta_article_body')

    feeds = [(u'Wiadomości', u'http://rss.gazeta.pl/pub/rss/warszawa.xml')]

    def print_version(self, url):
        if 'feedsportal.com' in url:
            s = url.rpartition('gazeta0Bpl')
            u = s[2]
            if not s[0]:
                u = url.rpartition('wyborcza0Bpl')[2]
            u = u.replace('/l/', '/')
            u = u.replace('/ia1.htm', '')
            u = u.replace('/story01.htm', '')
            u = u.replace('0C', '/')
            u = u.replace('A', '')
            u = u.replace('0E', '-')
            u = u.replace('0H', ',')
            u = u.replace('0I', '_')
            u = u.replace('0B', '.')
            u = self.INDEX + u
            return u
        else:
            return url

    def preprocess_html(self, soup):
        tag = soup.find(id='Str')
        if soup.find(attrs={'class': 'piano_btn_1'}):
            return None
        elif tag and tag.findAll('a'):
            self.append_page(soup, soup.body)
        return soup

    def append_page(self, soup, appendtag):
        tag = soup.find('div', attrs={'id': 'Str'})
        try:
            baseurl = soup.find(name='meta', attrs={
                                'property': 'og:url'})['content']
        except:
            return 1
        link = tag.findAll('a')[-1]
        while link:
            soup2 = self.index_to_soup(baseurl + link['href'])
            link = soup2.find('div', attrs={'id': 'Str'}).findAll('a')[-1]
            if u'następne' not in link.string:
                link = ''
            pagetext = soup2.find(id='artykul')
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
        tag.extract()

    def image_url_processor(self, baseurl, url):
        if url.startswith(' '):
            return url.strip()
        else:
            return url
PK�X���rrgazeta_pomorska.png�PNG


IHDRb��	PLTE����$T��.a$IDATx�c�XV50��,X� �'B@b"��!@~#Әk�IEND�B`�PK�X����
�
gazeta_pomorska.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class GazetaPomorska(BasicNewsRecipe):
    title = u'Gazeta Pomorska'
    __author__ = 'Richard z forum.eksiazki.org, fenuks'
    description = u'Gazeta Pomorska - portal regionalny'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    extra_css = 'ul {list-style: none; padding:0; margin:0;}'
    INDEX = 'http://www.pomorska.pl'
    masthead_url = INDEX + '/images/top_logo.png'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}

    feeds = [(u'Wszystkie', u'http://www.pomorska.pl/rss.xml'),
             (u'Region', u'http://www.pomorska.pl/region.xml'),
             (u'Bydgoszcz', u'http://www.pomorska.pl/bydgoszcz.xml'),
             (u'Nakło', u'http://www.pomorska.pl/naklo.xml'),
             (u'Koronowo', u'http://www.pomorska.pl/koronowo.xml'),
             (u'Solec Kujawski', u'http://www.pomorska.pl/soleckujawski.xml'),
             (u'Grudziądz', u'http://www.pomorska.pl/grudziadz.xml'),
             (u'Inowrocław', u'http://www.pomorska.pl/inowroclaw.xml'),
             (u'Toruń', u'http://www.pomorska.pl/torun.xml'),
             (u'Włocławek', u'http://www.pomorska.pl/wloclawek.xml'),
             (u'Aleksandrów Kujawski',
              u'http://www.pomorska.pl/aleksandrow.xml'),
             (u'Brodnica', u'http://www.pomorska.pl/brodnica.xml'),
             (u'Chełmno', u'http://www.pomorska.pl/chelmno.xml'),
             (u'Chojnice', u'http://www.pomorska.pl/chojnice.xml'),
             (u'Ciechocinek', u'http://www.pomorska.pl/ciechocinek.xml'),
             (u'Golub-Dobrzyń', u'http://www.pomorska.pl/golubdobrzyn.xml'),
             (u'Mogilno', u'http://www.pomorska.pl/mogilno.xml'),
             (u'Radziejów', u'http://www.pomorska.pl/radziejow.xml'),
             (u'Rypin', u'http://www.pomorska.pl/rypin.xml'),
             (u'Sępólno', u'http://www.pomorska.pl/sepolno.xml'),
             (u'Świecie', u'http://www.pomorska.pl/swiecie.xml'),
             (u'Tuchola', u'http://www.pomorska.pl/tuchola.xml'),
             (u'Żnin', u'http://www.pomorska.pl/znin.xml'),
             (u'Sport', u'http://www.pomorska.pl/sport.xml'),
             (u'Zdrowie', u'http://www.pomorska.pl/zdrowie.xml'),
             (u'Auto', u'http://www.pomorska.pl/moto.xml'),
             (u'Dom', u'http://www.pomorska.pl/dom.xml'),
             # (u'Reporta\u017c', u'http://www.pomorska.pl/reportaz.xml'),
             (u'Gospodarka', u'http://www.pomorska.pl/gospodarka.xml')]

    keep_only_tags = [dict(id='article')]

    def get_cover_url(self):
        soup = self.index_to_soup(
            self.INDEX + '/apps/pbcs.dll/section?Category=JEDYNKI')
        nexturl = self.INDEX + soup.find(id='covers').find('a')['href']
        soup = self.index_to_soup(nexturl)
        self.cover_url = self.INDEX + \
            soup.find(id='cover').find(name='img')['src']
        return getattr(self, 'cover_url', self.cover_url)

    def decode_feedportal_url(self, url):
        link = url.rpartition('l/0L0S')[2][:-12]
        replaces = (('0B', '.'), ('0C', '/'), ('0H', ','),
                    ('0D', '?'), ('0F', '='), ('0A', '0'), ('0I', '_'))
        for t in replaces:
            link = link.replace(*t)
        return 'http://' + link

    def print_version(self, url):
        return self.decode_feedportal_url(url) + '&Template=printpicart'
PK�X��gazeta_wroclawska.png�PNG


IHDR��h6�IDATx�cx�nI��?����{�uN���f>z���#�����h�#��+��k�|�2�:coc�>�KO�h�O���RZ{�p�ec�Ҫ)�@A�!4�
Q-g&	Q���=,Fh����6T(���\s���=A��o��
�>�p�ƪ��4tO���KM�����@�p�v$��[�~L%�����	�H�0N�(�:h�,���$*	���ϝIEND�B`�PK�X�T(��gazeta_wroclawska.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class GazetaWroclawska(BasicNewsRecipe):
    title = u'Gazeta Wroc\u0142awska'
    __author__ = 'fenuks'
    description = u'Gazeta Regionalna Gazeta Wrocławska. Najnowsze Wiadomości Wrocław, Informacje Wrocław. Czytaj!'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    masthead_url = 'http://s.polskatimes.pl/g/logo_naglowek/gazetawroclawska.png?24'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}
    remove_tags_after = dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})
    remove_tags = [dict(id='mat-podobne'), dict(name='a', attrs={
        'class': 'czytajDalej'}), dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})]

    feeds = [
    (u'Fakty24', u'http://gazetawroclawska.feedsportal.com/c/32980/f/533775/index.rss?201302'),
    (u'Region', u'http://www.gazetawroclawska.pl/rss/gazetawroclawska_region.xml?201302'),
    (u'Kultura', u'http://gazetawroclawska.feedsportal.com/c/32980/f/533777/index.rss?201302'),
    (u'Sport', u'http://gazetawroclawska.feedsportal.com/c/32980/f/533776/index.rss?201302'),
    (u'Z archiwum', u'http://www.gazetawroclawska.pl/rss/gazetawroclawska_zarchiwum.xml?201302'),

    (u'M\xf3j reporter', u'http://www.gazetawroclawska.pl/rss/gazetawroclawska_mojreporter.xml?201302'),
    (u'Historia', u'http://www.gazetawroclawska.pl/rss/gazetawroclawska_historia.xml?201302'),
    (u'Listy do redakcji', u'http://www.gazetawroclawska.pl/rss/gazetawroclawska_listydoredakcji.xml?201302'),
    (u'Na drogach', u'http://www.gazetawroclawska.pl/rss/gazetawroclawska_nadrogach.xml?201302')]

    def print_version(self, url):
        return url.replace('artykul', 'drukuj')

    def skip_ad_pages(self, soup):
        if 'Advertisement' in soup.title:
            nexturl = soup.find('a')['href']
            return self.index_to_soup(nexturl, raw=True)

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.prasa24.pl/gazeta/gazeta-wroclawska/')
        self.cover_url = soup.find(id='pojemnik').img['src']
        return getattr(self, 'cover_url', self.cover_url)
PK�X.��22gazeta_wspolczesna.png�PNG


IHDR�a�IDATx�b\�&9��A�j���ٶm�m3(����m��S����׹W�%��ݙ�[��aw�T�&�c[�v���ɵI��@n�M�o~+��"s�
j	U�p5E)�'���ūK��7��n�躟E�a \7��ǻ%ה��7���r�������+c4;Rٙ:���;��ޖk�z�7B���O�A���}�q@�ē���%�#�C�3�$BR�yr]e5�8�����d�?H-!��7�V���'[D�/�=y���gxP�J_
����
�N�z�O�B�UEc�E(�Ǝ�F�EWt|��&����y5�c{�dq�L4�'�BFf��B`������f`��3-[zH�϶�[hv
.a[O�5�)�߽�5n<@�[���ۇ��d��

`��~�»|�^2x��Ȣ���Y��4�گ��C\I�Җ�5�q��0�
@h�Cn�#<�M�f��ٙ���H���-q��u�?�T�c�.�@��d����
IEND�B`�PK�Xm(��gazeta_wspolczesna.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class GazetaWspolczesna(BasicNewsRecipe):
    title = u'Gazeta Wsp\xf3\u0142czesna'
    __author__ = 'fenuks'
    description = u'Gazeta Współczesna - portal regionalny.'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    extra_css = 'ul {list-style: none; padding:0; margin:0;}'
    INDEX = 'http://www.wspolczesna.pl'
    masthead_url = INDEX + '/images/top_logo.png'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}

    feeds = [
    (u'Wszystkie', u'http://www.wspolczesna.pl/rss.xml'),
    (u'August\xf3w', u'http://www.wspolczesna.pl/augustow.xml'),
    (u'Bia\u0142ystok', u'http://www.wspolczesna.pl/bialystok.xml'),
    (u'Bielsk Podlaski', u'http://www.wspolczesna.pl/bielsk.xml'),
    (u'E\u0142k', u'http://www.wspolczesna.pl/elk.xml'),
    (u'Grajewo', u'http://www.wspolczesna.pl/grajewo.xml'),
    (u'Go\u0142dap', u'http://www.wspolczesna.pl/goldap.xml'),
    (u'Hajn\xf3wka', u'http://www.wspolczesna.pl/hajnowka.xml'),
    (u'Kolno', u'http://www.wspolczesna.pl/kolno.xml'),
    (u'\u0141om\u017ca', u'http://www.wspolczesna.pl/lomza.xml'),
    (u'Mo\u0144ki', u'http://www.wspolczesna.pl/monki.xml'),
    (u'Olecko', u'http://www.wspolczesna.pl/olecko.xml'),
    (u'Ostro\u0142\u0119ka', u'http://www.wspolczesna.pl/ostroleka.xml'),
    (u'Powiat Bia\u0142ostocki', u'http://www.wspolczesna.pl/powiat.xml'),
    (u'Sejny', u'http://www.wspolczesna.pl/sejny.xml'),
    (u'Siemiatycze', u'http://www.wspolczesna.pl/siemiatycze.xml'),
    (u'Sok\xf3\u0142ka', u'http://www.wspolczesna.pl/sokolka.xml'),
    (u'Suwa\u0142ki', u'http://www.wspolczesna.pl/suwalki.xml'),
    (u'Wysokie Mazowieckie', u'http://www.wspolczesna.pl/wysokie.xml'),
    (u'Zambr\xf3w', u'http://www.wspolczesna.pl/zambrow.xml'),
    (u'Sport', u'http://www.wspolczesna.pl/sport.xml'),
    (u'Praca', u'http://www.wspolczesna.pl/praca.xml'),
    (u'Dom', u'http://www.wspolczesna.pl/dom.xml'),
    (u'Auto', u'http://www.wspolczesna.pl/auto.xml'),
    (u'Zdrowie', u'http://www.wspolczesna.pl/zdrowie.xml')]

    keep_only_tags = [dict(id='article')]

    def get_cover_url(self):
        soup = self.index_to_soup(
            self.INDEX + '/apps/pbcs.dll/section?Category=JEDYNKI')
        nexturl = self.INDEX + soup.find(id='covers').find('a')['href']
        soup = self.index_to_soup(nexturl)
        self.cover_url = self.INDEX + \
            soup.find(id='cover').find(name='img')['src']
        return getattr(self, 'cover_url', self.cover_url)

    def decode_feedportal_url(self, url):
        link = url.rpartition('l/0L0S')[2][:-12]
        replaces = (('0B', '.'), ('0C', '/'), ('0H', ','),
                    ('0D', '?'), ('0F', '='), ('0A', '0'), ('0I', '_'))
        for t in replaces:
            link = link.replace(*t)
        return 'http://' + link

    def print_version(self, url):
        return self.decode_feedportal_url(url) + '&Template=printpicart'
PK�X��Neegazeta_wyborcza.png�PNG


IHDR%=m"PLTE�!(�LtRNS@��f
IDATx�c��A��q����IEND�B`�PK�Xa�K��gazeta_wyborcza.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment
import re


class Gazeta_Wyborcza(BasicNewsRecipe):
    title = u'Gazeta Wyborcza'
    __author__ = 'fenuks, Artur Stachecki'
    language = 'pl'
    description = 'Wiadomości z Polski i ze świata. Serwisy tematyczne i lokalne w 20 miastach.'
    category = 'newspaper'
    publication_type = 'newspaper'
    # encoding = 'iso-8859-2'
    masthead_url = 'http://bi.gazeta.pl/im/5/10285/z10285445AA.jpg'
    INDEX = 'http://wyborcza.pl'
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}

    # rules for gazeta.pl
    preprocess_regexps = [
        (re.compile(u'<b>Czytaj więcej</b>.*', re.DOTALL), lambda m: '</body>')]
    keep_only_tags = [dict(id='gazeta_article')]
    remove_tags = [dict(id=['gazeta_article_tools', 'gazeta_article_miniatures']), dict(
        attrs={'class': ['mod mod_sociallist', 'c0', 'fb', 'voteNeedLogin']})]
    remove_tags_after = dict(id='gazeta_article_body')

    # rules for wyborcza.biz
    preprocess_regexps.append((re.compile(
        u'(<br>)?(<br>)?        Czytaj (także|też):.*?</a>\\.?<br>', re.DOTALL), lambda m: ''))

    feeds = [(u'Kraj', u'http://rss.feedsportal.com/c/32739/f/530266/index.rss'),
             (u'\u015awiat', u'http://rss.feedsportal.com/c/32739/f/530270/index.rss'),
             (u'Wyborcza.biz', u'http://wyborcza.biz/pub/rss/wyborcza_biz_wiadomosci.htm'),
             (u'Komentarze', u'http://rss.feedsportal.com/c/32739/f/530312/index.rss'),
             (u'Kultura', u'http://rss.gazeta.pl/pub/rss/gazetawyborcza_kultura.xml'),
             (u'Nauka', u'http://rss.feedsportal.com/c/32739/f/530269/index.rss'),
             (u'Opinie', u'http://rss.gazeta.pl/pub/rss/opinie.xml'),
             (u'Gazeta \u015awi\u0105teczna',
              u'http://rss.feedsportal.com/c/32739/f/530431/index.rss'),
             (u'Du\u017cy Format',
              u'http://rss.feedsportal.com/c/32739/f/530265/index.rss'),
             (u'Witamy w Polsce', u'http://rss.feedsportal.com/c/32739/f/530476/index.rss'),
             (u'M\u0119ska Muzyka',
              u'http://rss.feedsportal.com/c/32739/f/530337/index.rss'),
             (u'Lata Lec\u0105', u'http://rss.feedsportal.com/c/32739/f/530326/index.rss'),
             (u'Solidarni z Tybetem',
              u'http://rss.feedsportal.com/c/32739/f/530461/index.rss'),
             (u'W pon. - \u017bakowski',
              u'http://rss.feedsportal.com/c/32739/f/530491/index.rss'),
             (u'We wt. - Kolenda-Zalewska',
              u'http://rss.feedsportal.com/c/32739/f/530310/index.rss'),
             (u'\u015aroda w \u015brod\u0119',
              u'http://rss.feedsportal.com/c/32739/f/530428/index.rss'),
             (u'W pi\u0105tek - Olejnik',
              u'http://rss.feedsportal.com/c/32739/f/530364/index.rss'),
             (u'Nekrologi', u'http://rss.feedsportal.com/c/32739/f/530358/index.rss')
             ]

    def print_version(self, url):
        if 'feedsportal.com' in url:
            s = url.rpartition('wyborcza0Bpl')
            u = s[2]
            if not s[0]:
                u = url.rpartition('gazeta0Bpl')[2]
            u = u.replace('/l/', '/')
            u = u.replace('/ia1.htm', '')
            u = u.replace('/story01.htm', '')
            u = u.replace('0C', '/')
            u = u.replace('A', '')
            u = u.replace('0E', '-')
            u = u.replace('0H', ',')
            u = u.replace('0I', '_')
            u = u.replace('0B', '.')
            u = self.INDEX + u
            return u
        else:
            return url

    def preprocess_html(self, soup):
        tag = soup.find(id='Str')
        if soup.find(attrs={'class': 'piano_btn_1'}):
            return None
        elif tag and tag.findAll('a'):
            self.append_page(soup, soup.body)
        return soup

    def append_page(self, soup, appendtag):
        tag = soup.find('div', attrs={'id': 'Str'})
        try:
            baseurl = soup.find(name='meta', attrs={
                                'property': 'og:url'})['content']
        except:
            return 1
        link = tag.findAll('a')[-1]
        while link:
            soup2 = self.index_to_soup(baseurl + link['href'])
            link = soup2.find('div', attrs={'id': 'Str'}).findAll('a')[-1]
            if u'następne' not in link.string:
                link = ''
            pagetext = soup2.find(id='artykul')
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
        tag.extract()

    def get_cover_url(self):
        soup = self.index_to_soup('http://wyborcza.pl/0,76762,3751429.html')
        cover = soup.find(attrs={'class': 'gallerycontent'})
        self.cover_url = cover.ul.li.a.img['src'].replace('P.jpg', '.jpg')
        return getattr(self, 'cover_url', self.cover_url)

    def image_url_processor(self, baseurl, url):
        if url.startswith(' '):
            return url.strip()
        else:
            return url
PK�X4�u�EEgazetaua_ru.png�PNG


IHDR  szz�IDATXíWkOG�Y�?�6`�����D(R���U�*M���R@P��4U�V��DU��*EPP

�`���?��3fM\j�u��g�3s�=��sg��(�[\�,��,�����R��ee�^��6$�(6�^\�Ɖ$I:�h4��X�F�\����$�[�����HH&����8����:����A�s%����r�:��(��P(���ׯ�-//�wvv�T*%�C��������í�������S�a1E.���x~5N��ع�����������!������ê�*���>���h�477�i2�V�O�hO�w��,���맦�>�=11ѻ��Vspp��<�?ݔ�F�,	���ڗ/_���pí[�l;;tZA�X��PF�Mrp[[[O�<���Ç�~��%�t:��@�L&S��[�M`F���\՜����0�G�X;A�������UJ7��А�q�������z��	nŜ;��ӃEa���ի���A�B��, �D��R�L"��.--
��͍ ��y===��w�2::�3��ŚL6�mFF���WP
�w0��R�Q�`\��P���b��������!�TGC��������`|�[�V������i�:`6���yb�|K�ʀ~eeō�ӡ��V���k���c�n�o�kx̳	���y����6Jߡd�`ńP&i�U�����{{{�6�ɖ����݃A#�]h�D"�0�����`Q��!�Ͷ���oU������6��j
���Y__oDi��%�-�����p������(���C@Ǡ�)���qx�Ai��D/�e.
#2�Ё\ѡ4
`��Q�
#3P�ƒ,M
Rl˜��1�d��j��Y�?�W.΁bz������aL�������]̹L�PB�ʚ����������L)Eµ@���gZ?>66�Cn7vww���x<�L�w�����Y���*��c��4nnn�C�{�0����𴮮.�Q&��Uv���ea�N��elF")�̈F�4�lllP�tX
!	`���0[\֕�@)�A�f$��'PF'�T_F}�)mP�5Ŀ
��Bhj���zrbԳc�9����f;�G�f�w�Zo������8!��ԥ������F�gG��>�k�ŋZڦ�q-rEOʵ�RU �@�O��t����ݛ���O�02�����Zqt:��L���t��!�M&��p0v��3VT�PT5b�<���{��77y�f�{d�L$؈�$��@�48�M��mv[�ҥK��CCk]����潢M��Dzr�R"C�Y���EѼ
���!�m[>��0�׺�je=�Ǩ���&�BC]ݬE���N����l�f$�a�'��d�:��/��,%�a��:���i�lB�C�Y��\�DXw*�Z���|��M�&�q:B�N+�l�:W�@�v$�#,O���C�?~}�lbX�'�VFI����UH� ��p<�&!�7���a�:r�Y�_|ch��[y��r� ���
� gҮ\<~%{K�	+�D4</��ȢեY}��0��Y�D4���ic�*�Xb�s(_>���v}z��Z϶�� �IKi�J�&��G�uҤ�K�$�ʲlA����u55�S�'{�M�b�4�j�YD�IUOZ"�:Y��Q�S�6��Ȝ��T�
���*%�+�Yqf,��YV@�(��;],{��.���J�`gIEND�B`�PK�X����	�	gazetaua_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class GazetaUA(BasicNewsRecipe):
    title = 'Gazeta.ua'
    __author__ = 'bugmen00t'
    description = '\u0412\u0441\u0435\u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0430\u044F \u043E\u043D-\u043B\u0430\u0439\u043D \u0433\u0430\u0437\u0435\u0442\u0430. \u041E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u044B\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438 \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435 \u0438 \u0432 \u043C\u0438\u0440\u0435: \u0441\u043E\u0431\u044B\u0442\u0438\u044F, \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430, \u0441\u043F\u043E\u0440\u0442, \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u0430.'  # noqa
    publisher = '\u0418\u0437\u0434\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0430\u044F \u0433\u0440\u0443\u043F\u043F\u0430 "\u041D\u043E\u0432\u0430 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F"'  # noqa
    category = 'newspaper'
    cover_url = u'https://static2.gazeta.ua/img2/cache/preview/1064/1064219_w_450.jpg'
    language = 'ru_UK'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 50

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='section', attrs={'class': 'article-content clearfix'})

    remove_tags =   [
         dict(name='div', attrs={'class': 'mt5'}),
         dict(name='div', attrs={'class': 'interview-block'}),
         dict(name='p', attrs={'id': 'mce_0'}),
         dict(name='p', attrs={'id': 'mce_1'}),
         dict(name='p', attrs={'id': 'mce_2'}),
         dict(name='p', attrs={'id': 'mce_3'}),
         dict(name='p', attrs={'id': 'mce_4'}),
         dict(name='p', attrs={'id': 'mce_5'}),
         dict(name='p', attrs={'id': 'mce_6'}),
         dict(name='p', attrs={'id': 'mce_7'}),
         dict(name='p', attrs={'id': 'mce_8'}),
         dict(name='p', attrs={'id': 'mce_9'}),
         dict(name='p', attrs={'id': 'mce_10'}),
         dict(name='p', attrs={'id': 'mce_11'}),
         dict(name='p', attrs={'id': 'mce_12'}),
         dict(name='p', attrs={'id': 'mce_13'}),
         dict(name='p', attrs={'id': 'mce_14'}),
         dict(name='p', attrs={'id': 'mce_15'}),
         dict(name='p', attrs={'id': 'mce_16'}),
         dict(name='section', attrs={'class': 'w-marker-photo lg'})
        ]

    feeds = [
        ('Gazeta.ua', 'https://gazeta.ua/ru/rss')
        ]
PK�X4�u�EEgazetaua_ua.png�PNG


IHDR  szz�IDATXíWkOG�Y�?�6`�����D(R���U�*M���R@P��4U�V��DU��*EPP

�`���?��3fM\j�u��g�3s�=��sg��(�[\�,��,�����R��ee�^��6$�(6�^\�Ɖ$I:�h4��X�F�\����$�[�����HH&����8����:����A�s%����r�:��(��P(���ׯ�-//�wvv�T*%�C��������í�������S�a1E.���x~5N��ع�����������!������ê�*���>���h�477�i2�V�O�hO�w��,���맦�>�=11ѻ��Vspp��<�?ݔ�F�,	���ڗ/_���pí[�l;;tZA�X��PF�Mrp[[[O�<���Ç�~��%�t:��@�L&S��[�M`F���\՜����0�G�X;A�������UJ7��А�q�������z��	nŜ;��ӃEa���ի���A�B��, �D��R�L"��.--
��͍ ��y===��w�2::�3��ŚL6�mFF���WP
�w0��R�Q�`\��P���b��������!�TGC��������`|�[�V������i�:`6���yb�|K�ʀ~eeō�ӡ��V���k���c�n�o�kx̳	���y����6Jߡd�`ńP&i�U�����{{{�6�ɖ����݃A#�]h�D"�0�����`Q��!�Ͷ���oU������6��j
���Y__oDi��%�-�����p������(���C@Ǡ�)���qx�Ai��D/�e.
#2�Ё\ѡ4
`��Q�
#3P�ƒ,M
Rl˜��1�d��j��Y�?�W.΁bz������aL�������]̹L�PB�ʚ����������L)Eµ@���gZ?>66�Cn7vww���x<�L�w�����Y���*��c��4nnn�C�{�0����𴮮.�Q&��Uv���ea�N��elF")�̈F�4�lllP�tX
!	`���0[\֕�@)�A�f$��'PF'�T_F}�)mP�5Ŀ
��Bhj���zrbԳc�9����f;�G�f�w�Zo������8!��ԥ������F�gG��>�k�ŋZڦ�q-rEOʵ�RU �@�O��t����ݛ���O�02�����Zqt:��L���t��!�M&��p0v��3VT�PT5b�<���{��77y�f�{d�L$؈�$��@�48�M��mv[�ҥK��CCk]����潢M��Dzr�R"C�Y���EѼ
���!�m[>��0�׺�je=�Ǩ���&�BC]ݬE���N����l�f$�a�'��d�:��/��,%�a��:���i�lB�C�Y��\�DXw*�Z���|��M�&�q:B�N+�l�:W�@�v$�#,O���C�?~}�lbX�'�VFI����UH� ��p<�&!�7���a�:r�Y�_|ch��[y��r� ���
� gҮ\<~%{K�	+�D4</��ȢեY}��0��Y�D4���ic�*�Xb�s(_>���v}z��Z϶�� �IKi�J�&��G�uҤ�K�$�ʲlA����u55�S�'{�M�b�4�j�YD�IUOZ"�:Y��Q�S�6��Ȝ��T�
���*%�+�Yqf,��YV@�(��;],{��.���J�`gIEND�B`�PK�X��Y�	�	gazetaua_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class GazetaUA(BasicNewsRecipe):
    title = 'Gazeta.ua'
    __author__ = 'bugmen00t'
    description = '\u0412\u0441\u0435\u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 \u043E\u043D-\u043B\u0430\u0439\u043D \u0433\u0430\u0437\u0435\u0442\u0430. \u041E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u0456 \u043D\u043E\u0432\u0438\u043D\u0438 \u0437 \u0423\u043A\u0440\u0430\u0457\u043D\u0438 \u0456 \u0441\u0432\u0456\u0442\u0443: \u043F\u043E\u0434\u0456\u0457, \u043F\u043E\u043B\u0456\u0442\u0438\u043A\u0430, \u0441\u043F\u043E\u0440\u0442, \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u0430.'  # noqa
    publisher = '\u0422\u041E\u0412 "\u0412\u0438\u0434\u0430\u0432\u043D\u0438\u0447\u0430 \u043A\u043E\u043C\u043F\u0430\u043D\u0456\u044F "\u041D\u043E\u0432\u0430 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F"'  # noqa
    category = 'newspaper'
    cover_url = u'https://static2.gazeta.ua/img2/cache/preview/1064/1064219_w_450.jpg'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 50

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='section', attrs={'class': 'article-content clearfix'})

    remove_tags =   [
         dict(name='div', attrs={'class': 'mt5'}),
         dict(name='div', attrs={'class': 'interview-block'}),
         dict(name='p', attrs={'id': 'mce_0'}),
         dict(name='p', attrs={'id': 'mce_1'}),
         dict(name='p', attrs={'id': 'mce_2'}),
         dict(name='p', attrs={'id': 'mce_3'}),
         dict(name='p', attrs={'id': 'mce_4'}),
         dict(name='p', attrs={'id': 'mce_5'}),
         dict(name='p', attrs={'id': 'mce_6'}),
         dict(name='p', attrs={'id': 'mce_7'}),
         dict(name='p', attrs={'id': 'mce_8'}),
         dict(name='p', attrs={'id': 'mce_9'}),
         dict(name='p', attrs={'id': 'mce_10'}),
         dict(name='p', attrs={'id': 'mce_11'}),
         dict(name='p', attrs={'id': 'mce_12'}),
         dict(name='p', attrs={'id': 'mce_13'}),
         dict(name='p', attrs={'id': 'mce_14'}),
         dict(name='p', attrs={'id': 'mce_15'}),
         dict(name='p', attrs={'id': 'mce_16'}),
         dict(name='section', attrs={'class': 'w-marker-photo lg'})
        ]

    feeds = [
        ('Gazeta.ua', 'https://gazeta.ua/rss')
        ]
PK�XZ;(llgcn.png�PNG


IHDR(-S�PLTE����������������������� �	"�
"�
$�#�&�'�(�+�-�.�0�3�4� 2� 1� 3�"7�$:�)<�0@�1B�2C�1D�6I�:L�:K�<M�EW�HY�ap�/�.�'�	����tRNS@��flIDATxڝȃQМ�Y۶��`�݋� T�:�h�����s:-�D�gG�)q��X���<ft�F�V����a:}��n���*"���z8y�v�Pܭq6_��
N
�>2IEND�B`�PK�X�܆||
gcn.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class GCN(BasicNewsRecipe):
    title = u'Gazeta Codziennej Nowiny'
    __author__ = 'fenuks'
    description = u'nowiny24.pl - portal regionalny województwa podkarpackiego.'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    extra_css = 'ul {list-style: none; padding:0; margin:0;}'
    INDEX = 'http://www.nowiny24.pl'
    masthead_url = INDEX + '/images/top_logo.png'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['style']
    use_embedded_content = False

    feeds = [(u'Wszystkie', u'http://www.nowiny24.pl/rss.xml'),
             (u'Podkarpacie', u'http://www.nowiny24.pl/podkarpacie.xml'),
             (u'Bieszczady', u'http://www.nowiny24.pl/bieszczady.xml'),
             (u'Rzeszów', u'http://www.nowiny24.pl/rzeszow.xml'),
             (u'Przemyśl', u'http://www.nowiny24.pl/przemysl.xml'),
             (u'Leżajsk', u'http://www.nowiny24.pl/lezajsk.xml'),
             (u'Łańcut', u'http://www.nowiny24.pl/lancut.xml'),
             (u'Dębica', u'http://www.nowiny24.pl/debica.xml'),
             (u'Jarosław', u'http://www.nowiny24.pl/jaroslaw.xml'),
             (u'Krosno', u'http://www.nowiny24.pl/krosno.xml'),
             (u'Mielec', u'http://www.nowiny24.pl/mielec.xml'),
             (u'Nisko', u'http://www.nowiny24.pl/nisko.xml'),
             (u'Sanok', u'http://www.nowiny24.pl/sanok.xml'),
             (u'Stalowa Wola', u'http://www.nowiny24.pl/stalowawola.xml'),
             (u'Tarnobrzeg', u'http://www.nowiny24.pl/tarnobrzeg.xml'),
             (u'Sport', u'http://www.nowiny24.pl/sport.xml'),
             (u'Dom', u'http://www.nowiny24.pl/dom.xml'),
             (u'Auto', u'http://www.nowiny24.pl/auto.xml'),
             (u'Praca', u'http://www.nowiny24.pl/praca.xml'),
             (u'Zdrowie', u'http://www.nowiny24.pl/zdrowie.xml'),
             (u'Wywiady', u'http://www.nowiny24.pl/wywiady.xml')]

    keep_only_tags = [dict(id='article')]

    def get_cover_url(self):
        soup = self.index_to_soup(
            self.INDEX + '/apps/pbcs.dll/section?Category=JEDYNKI')
        nexturl = self.INDEX + soup.find(id='covers').find('a')['href']
        soup = self.index_to_soup(nexturl)
        self.cover_url = self.INDEX + \
            soup.find(id='cover').find(name='img')['src']
        return getattr(self, 'cover_url', self.cover_url)

    def decode_feedportal_url(self, url):
        link = url.rpartition('l/0L0S')[2][:-12]
        replaces = (('0B', '.'), ('0C', '/'), ('0H', ','),
                    ('0D', '?'), ('0F', '='), ('0A', '0'), ('0I', '_'))
        for t in replaces:
            link = link.replace(*t)
        return 'http://' + link

    def print_version(self, url):
        return self.decode_feedportal_url(url) + '&Template=printpicart'
PK�X���=��
geek_poke.png�PNG


IHDR  D����PLTEfff���===UUUyyy<<<WWW}}}{{{===VVVzzz;;;TTTyyy:::UUUyyy;;;TTTyyy;;;UUU>>>VVV;;;UUUyyyCCCYYY:::UUUxxx:::;;;???FFFNNNTTTUUUWWW[[[]]]___dddeeehhhlllmmmqqqsssuuuwwwxxx����"tRNS///OPPopp��������������������IDATx��E�@�\ffff��i
93K����X�H[�b
�L���8t����V�ڵP`��:L�Z����i�6����V�^���;���]�]B�e�x�r7Y`�ך��5�p��(dj�Я��
ͩI�4�1�$�Uh��`*�Va��*L���1�;��K>IEND�B`�PK�X�Tm
m
geek_poke.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re
from calibre.utils.magick import Image, create_canvas


class AdvancedUserRecipe1307556816(BasicNewsRecipe):
    title = u'Geek and Poke'
    __author__ = u'DrMerry'
    description = u'Geek and Poke Cartoons'
    publisher = u'Oliver Widder'
    author = u'Oliver Widder, DrMerry (calibre-code), calibre'
    oldest_article = 31
    max_articles_per_feed = 100
    language = u'en'
    simultaneous_downloads = 1
    timefmt = ' [%a, %d %B, %Y]'
    summary_length = -1
    no_stylesheets = True
    category = 'News.IT, Cartoon, Humor, Geek'
    use_embedded_content = False
    cover_url = 'http://geekandpoke.typepad.com/aboutcoders.jpeg'
    remove_javascript = True
    remove_empty_feeds = True
    publication_type = 'blog'
    masthead_url = None
    conversion_options = {
        'comments': '', 'tags': category, 'language': language, 'publisher': publisher, 'author': author
    }

    remove_tags_before = dict(name='p', attrs={'class': 'content-nav'})
    remove_tags_after = dict(name='div', attrs={'class': 'entry-content'})
    remove_tags = [dict(name='div', attrs={'class': 'entry-footer'}),
                   dict(name='div', attrs={'id': 'alpha'}),
                   dict(name='div', attrs={'id': 'gamma'}),
                   dict(name='iframe'),
                   dict(name='p', attrs={'class': 'content-nav'})]

    filter_regexps = [(r'feedburner\.com'),
                      (r'pixel.quantserve\.com'),
                      (r'googlesyndication\.com'),
                      (r'yimg\.com'),
                      (r'scorecardresearch\.com')]

    preprocess_regexps = [
        (re.compile(r'(<p>(&nbsp;|\s)*</p>|<a[^>]*>Tweet</a>|<a[^>]*>|</a>|<!--.*?-->|<h2[^>]*>[^<]*</h2>[^<]*)', re.DOTALL | re.IGNORECASE), lambda match: ''),
        (re.compile(r'(&nbsp;|\s\s)+\s*', re.DOTALL |
                    re.IGNORECASE), lambda match: ' '),
        (re.compile(r'(<h3[^>]*>)<a[^>]>((?!</a)*)</a></h3>', re.DOTALL |
                    re.IGNORECASE), lambda match: match.group(1) + match.group(2) + '</h3>'),
        (re.compile(r'(<img[^>]*alt="([^"]*)"[^>]*>)', re.DOTALL | re.IGNORECASE),
         lambda match: '<div id="merryImage"><cite>' + match.group(2) + '</cite><br>' + match.group(1) + '</div>'),
        (re.compile(r'<br( /)?>(<br( /)?>)+', re.DOTALL |
                    re.IGNORECASE), lambda match: '<br>'),
    ]

    extra_css = 'body, h3, p, div, span{margin:0px; padding:0px} h3.entry-header{font-size: 0.8em} div.entry-body{font-size: 0.7em}'

    def postprocess_html(self, soup, first):
        for tag in soup.findAll('img', src=True):
            iurl = tag['src']
            img = Image()
            img.open(iurl)
            # print '***img is: ', iurl, '\n****width is: ', width, 'height is:
            # ', height
            img.trim(0)
            # print '***TRIMMED img width is: ', width, 'height is: ', height
            left = 0
            top = 0
            border_color = '#ffffff'
            width, height = img.size
            # print '***retrieved img width is: ', width, 'height is: ', height
            height_correction = 1.17
            canvas = create_canvas(
                width, height * height_correction, border_color)
            canvas.compose(img, left, top)
            canvas.save(iurl)
        return soup

    feeds = ['http://feeds.feedburner.com/GeekAndPoke?format=xml']
PK�X
��a!!gentoftelokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X�/j�::gentoftelokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Villabyerne
'''


class GentofteLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Villabyerne'
    description = 'Lokale og regionale nyheder, sport og kultur fra Gentofte, Hellerup og Charlottenlund på gentofte.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Villabyerne', 'http://gentofte.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Villabyerne', 'http://gentofte.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Villabyerne', 'http://gentofte.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Villabyerne', 'http://gentofte.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Villabyerne', 'http://gentofte.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Villabyerne', 'http://gentofte.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X�%�1��geopolityka.png�PNG


IHDR�a�IDATx�]�YhqĿ��{dw��4���G��'�@�[D��z��"* "�/""�(�"����"
ޢV[k�ت%1�4I�n�=�� "�`�������q�h�`9n��CQ$�<"�P��j-k�l1�ӀafH�h�h
��%��& ɤa֢�@Or��i�NZ>(�����M�"J�|�m��\5E�ҥ�o3��E#�!Ә כ����l��|�����4��L�O�vmvT��mٓ
��IS�����ہ擛W&��h��:B�vl�rHDz�޽��KnQ�nw�m�:vt��bؕ}��?�I�f؄� �����gN�aY^z���e{�tOnm��^�){)$ҋ���s,VU>tp�O�_�zK�S�XLo3j�Lgӕ�l5�-����z~��;1	0$A�()�<r�A�����p7_}��km٢�������v�[,���||�� �1D �q�C�#��I����7n?���V�vj�̉���N!��2db�M�c��2!�`VT���/$�9�+4;�_y����c;7Tm���q�j_�ފ���e��6�H���=��'���o��T�/�7jM�m�m�|ϽTY#ˡ�>�f�f�_�j�?��j��?�C9z�嬙�Zu]�W6���\�2��u�f}ߝ؝&���W>{���!1NQ�do��^j�eq���z���B�nٖ&�t,a0`�9
DD���v�?��Q6��t����0�W�J)�1�`��^�����%Ā$Қ����G��D,q<R�~R���x�fX�^����7���sa%Dߔ�����~�I���-Co���'��q���]�_�����ʌ)�}�-�|�i��9����;��w��6n}�ݝ�>���A)�O$�(�i�L����ǘC|��LIEND�B`�PK�XWb5riigeopolityka.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1361379046(BasicNewsRecipe):
    title = u'Geopolityka.org'
    language = 'pl'
    __author__ = 'chemik111'
    oldest_article = 15
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Rss', u'http://geopolityka.org/component/k2/itemlist?format=feed&moduleID=200')]
PK�X�.R�FFgeretsrieder_merkur.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�XO��OOgeretsrieder_merkur.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Geretsrieder Merkur'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Wolfratshausen', u'http://www.merkur-online.de/lokales/wolfratshausen/rssfeed.rdf'),
    (u'Region Wolfratshausen', u'http://www.merkur-online.de/lokales/wolfratshausen/landkreis/rssfeed.rdf'),
    (u'Geretsried', u'http://www.merkur-online.de/lokales/wolfratshausen/geretsried/rssfeed.rdf'),
    (u'Stasdt Wolfratshausen', u'http://www.merkur-online.de/lokales/wolfratshausen/wolfratshausen/rssfeed.rdf'),
    (u'M\xfcnsing', u'http://www.merkur-online.de/lokales/wolfratshausen/muensing/rssfeed.rdf'),
    (u'Dietramszell', u'http://www.merkur-online.de/lokales/wolfratshausen/dietramszell/rssfeed.rdf'),
    (u'K\xf6nigsdorf', u'http://www.merkur-online.de/lokales/wolfratshausen/koenigsdorf/rssfeed.rdf'),
    (u'Eurasburg', u'http://www.merkur-online.de/lokales/wolfratshausen/eurasburg/rssfeed.rdf'),
    (u'Icking', u'http://www.merkur-online.de/lokales/wolfratshausen/icking/rssfeed.rdf'),
    (u'Egling', u'http://www.merkur-online.de/lokales/wolfratshausen/egling/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�XmD��88german_gov.png�PNG


IHDR  D���7PLTE���������fff@@@���EEEDDD�����ʼn��,,,CCCzzz������8TTT


���U88��������𱱱lll���HHH������ooo333\\\������===###:::��ݳ��;;;RRR���'''��򇇇������---���"""���PPP�����謬�pppsss�����������������찰�ttt888������


mmm������			$$$VVV���999���???&&&���������yyyXXX̷�������������555aaa�����eee���~~~�����ʎ��+++�����BBB���WWW���YYY������iii444��漼���ɍ�����777hhh��ƅ��������kkk[[[�������ූ��ZZZIII]]])))rrr666��Ĉ��OOO������ccc���MMM�����󑑑UUU|||���������GGGwww%%%������^^^xxx<<<>����IDATx^��S�$a��<Uն�m۶��m۶m�ۊ޾�fzv���x"���S&�N����H69;�<��y��J�e���gǦ+�As�m�8��D�.u����ǀQ�JT.-���uDq���?�#V�\��`�O��}��:��HM!��X,a�c�iv���
b��Y2��`��
�wdO��X�O3��U~�hz��s(i�á�����xq�3q��y�j���GBQ�;�b.�^/������u
%�<�><�&��Me�4�<�f��ɽ���\,�Ml�][�
@ʞ���%���N��PaB���tyy���*����/T�9VH���$4��{OL��/+���XE�n�l�p�f'�VK�Nv�5�ea���"�rƫZ^���EkZ��q���ŀ;��ە��_�Z<0�*��U�`Z��g�i���2�IEND�B`�PK�X	v�33german_gov.recipeimport re

from calibre.web.feeds.news import BasicNewsRecipe


class GermanGovernmentPress(BasicNewsRecipe):
    title = u'Pressemitteilungen der Bundesregierung'
    oldest_article = 14
    __author__ = 'malfi'
    max_articles_per_feed = 100
    no_stylesheets = True
    cover_url = 'http://www.bundesregierung.de/static/images/logoBR.gif'
    language = 'de'
    keep_only_tags = []
    keep_only_tags.append(dict(name='h2'))
    keep_only_tags.append(dict(name='div', attrs={'class': 'textblack'}))
    keep_only_tags.append(dict(name='div', attrs={'class': 'subtitle'}))
    keep_only_tags.append(dict(name='div', attrs={'class': 'text'}))
    remove_tags = []
    feeds = [
    (u'Pressemitteilungen', u'http://www.bundesregierung.de/Webs/Breg/DE/Service/RSS/Functions/bundesregierungPressemitteilungenRSS20,templateId=renderNewsfeed.rdf')]  # noqa
    extra_css = '''
     h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
     h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
     p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
     body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
     '''

    def print_version(self, url):
        m = re.search(r'^(.*).html$', url)
        return str(m.group(1)) + ',layoutVariant=Druckansicht.html'
PK�X���HHgezgin_dergi.png�PNG


IHDR  D����PLTE��������������������������������џ��~����A���޹�Ϛ����d�����ը���g�ܶ���ƈ�̕����-�Ň��g�����v��#����է��$����������:��H��,��V���������e��x�,tRNS 0@P`p���������������������������������my^�&IDATxڕ�b�0@���6n��hMp�~��	���n��MΗ׬c�������2�L4���s�=o�s��^&Ym6���c��lk?l�����;�8"GM��r�h�>�8G2S��H�	���
��P�L�}|;!�w2�{b�*r"���ŐG5'�����9Wh6o)�b��H�pH�L�)3>iT#k���垴zz��U���갖fX
p�1�Ig<��u�v�ye�ŵťܬܢ����t�<0�R\%DӼ&7���[8lI�mb�i���&�����m[��?�*D�ᔛ�IEND�B`�PK�X�VHaaagezgin_dergi.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1390492898(BasicNewsRecipe):
    title = u'Gezgin Dergi'
    __author__ = 'asalet_r'
    language = 'tr'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Gezgin Dergi', u'http://www.gezgindergi.com/feed/')]
PK�X�y��
gildia_pl.png�PNG


IHDR��h6�IDATx�c�gg����«��N��<?���¾��u����S��j����.l:���PQv������l�{~V��%=���Z�l��a���{#�b��N�n����0z{�х�y
2͂�
Sń?�޴�)�\[���5����7�y^eʁ���=��eMaL���Dn.��S��?n�t4~zx�����a����ɑ��pne���6��P�i�,,�xG�+�5�|������j�̫Z�e���V��Z�&��2�Ǧ��
�a��䇋s��_���o��<�’ꛛۗ���wD�n�
^�滭,�Lgڎ(�)j��o-YP����o����`P��:ERd��Z����s?]��oop}A9C��觳�g����B��åkk�儞m�ܕm���V�ʺ*���X6��i��"|��$|:QpS���O�?ښ�r_��}�wV�n�0�fc;��ymytG%C3;��&׷��Kͤ��
�p(������Z<T�g[-��X���PʢX�fR]ll@�l �a��iFI�Wf}�b�b��E��'�r�ٜ��+W���
�>vP�͎Ux���������?^n�t��E���e�8X��i�����.v6`4M�z�R��B�)�"9�ܵ�B
�9�<�$�NPo5�ec�h"`%����˓z�L�������W|8[i��p4k1+k/��=ll����,,�,f�U���@nK%H5D�_J7�7_IEND�B`�PK�XCEe??gildia_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class Gildia(BasicNewsRecipe):
    title = u'Gildia.pl'
    __author__ = 'fenuks'
    description = u'Fantastyczny Portal Kulturalny - newsy, recenzje, galerie, wywiady. Literatura, film, gry komputerowe i planszowe, komiks, RPG, sklep. Nie lekceważ potęgi wyobraźni!'  # noqa
    cover_url = 'http://www.film.gildia.pl/_n_/portal/redakcja/logo/logo-gildia.pl-500.jpg'
    category = 'culture'
    cover_url = 'http://portal.gildia.pl/images/logo-main.png'
    language = 'pl'
    oldest_article = 8
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}
    preprocess_regexps = [(re.compile(u'</?sup>'), lambda match: '')]
    ignore_duplicate_articles = {'title', 'url'}
    remove_tags = [dict(name='div', attrs={'class': [
                        'backlink', 'im_img', 'addthis_toolbox addthis_default_style', 'banner-bottom']})]
    keep_only_tags = [dict(name='div', attrs={'class': 'widetext'}), dict(name='article', attrs={'id': re.compile(r'post-\d+')})]
    feeds = [(u'Gry', u'http://www.gry.gildia.pl/rss'),
             (u'Literatura', u'http://www.literatura.gildia.pl/rss'),
             (u'Film', u'http://www.film.gildia.pl/rss'),
             (u'Horror', u'http://www.horror.gildia.pl/rss'),
             (u'Konwenty', u'http://www.konwenty.gildia.pl/rss'),
             (u'Plansz\xf3wki', u'http://www.planszowki.gildia.pl/rss'),
             (u'Manga i anime', u'http://www.manga.gildia.pl/rss'),
             (u'Star Wars', u'http://www.starwars.gildia.pl/rss'),
             (u'Techno', u'http://www.techno.gildia.pl/rss'),
             (u'Historia', u'http://www.historia.gildia.pl/rss'),
             (u'Magia', u'http://www.magia.gildia.pl/rss'),
             (u'Bitewniaki', u'http://www.bitewniaki.gildia.pl/rss'),
             (u'RPG', u'http://www.rpg.gildia.pl/rss'),
             (u'LARP', u'http://www.larp.gildia.pl/rss'),
             (u'Muzyka', u'http://www.muzyka.gildia.pl/rss'),
             (u'Nauka', u'http://www.nauka.gildia.pl/rss'),
             ]

    def skip_ad_pages(self, soup):
        content = soup.find('div', attrs={'class': 'news'})
        if content is None:
            return

        words = ('recenzj', 'zapowied', 'fragmen',
                 'relacj', 'wywiad', 'nominacj')
        document_title = soup.title.renderContents().decode('utf-8').lower()
        for word in words:
            if word in document_title:
                for link in content.findAll(name='a'):
                    if word in link['href'] or (link.string and word in link.string):
                        return self.index_to_soup(link['href'], raw=True)
        for tag in content.findAll(name='a', href=re.compile('/publicystyka/')):
            if 'Wi&#281;cej...' == tag.string:
                return self.index_to_soup(tag['href'], raw=True)

    def preprocess_html(self, soup):
        title = soup.title.renderContents().decode('utf-8').lower()
        for a in soup('a', href=True):
            if not a['href'].startswith('http'):
                if '/gry/' in a['href']:
                    a['href'] = 'http://www.gry.gildia.pl' + a['href']
                elif u'książk' in title or u'komiks' in title:
                    a['href'] = 'http://www.literatura.gildia.pl' + a['href']
                elif u'komiks' in title:
                    a['href'] = 'http://www.literatura.gildia.pl' + a['href']
                else:
                    a['href'] = 'http://www.gildia.pl' + a['href']
        return soup
PK�X�±''
github.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe

class GithubBlog(BasicNewsRecipe):
    title = u'Github Blog'
    language = 'en'
    description = 'Updates, ideas, and inspiration from GitHub to help developers build and design software.'
    cover_url = 'https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png'
    masthead_url = 'https://github.githubassets.com/assets/GitHub-Logo-ee398b662d42.png'

    oldest_article = 14

    keep_only_tags = [
        dict(name='div', attrs={'class': 'col-12 offset-lg-1 col-lg-10 col-xl-7 mt-5 mt-lg-10 mb-6 mb-lg-8' }),
        dict(name='section', attrs={'class': lambda x: x and 'post__content' in x.split(' ') })
    ]

    remove_tags = [
        dict(name='div', attrs={'class': lambda x: x and 'post-tags' in x.split(' ') }),
        dict(name='ul', attrs={'class': lambda x: x and 'post-hero__categories' in x.split(' ') })
    ]

    preprocess_regexps = [
        # Styles the article description
        (re.compile(r'(<p class="[^"]*f4-mktg[^>]*>)([^<]*)(</p>)'),
         lambda m: '<h3>%s</h3>' % (m.group(2)))
    ]

    use_embedded_content = False
    no_stylesheets = True

    feeds = [
        (u'Engineering', u'https://github.blog/category/engineering/feed/'),
        (u'Product', u'https://github.blog/category/product/feed/'),
        (u'Security', u'https://github.blog/category/security/feed/'),
        (u'Open Source', u'https://github.blog/category/open-source/feed/'),
        (u'Enterprise', u'https://github.blog/category/enterprise/feed/'),
        (u'Community', u'https://github.blog/category/community/feed/'),
        (u'Education', u'https://github.blog/category/education/feed/'),
        (u'Company', u'https://github.blog/category/company/feed/'),
        (u'Policy', u'https://github.blog/category/policy/feed/')
    ]
PK�X>�BKKgizmodo.png�PNG


IHDR  D���{PLTE���z��v����ʪ�ʖ����������޶�Ү��������⦺Ƣ�ƞ�������֊�����~��z����Ҷ����������������憞������������򒮺������������IDATx^��GA@���9;����ͼ`u��B4�@�@n�c`+�ޚ�I ?���^u��z[UB8�]_�%K.({�$	�X���D�����f�ӷ��2
]Z~HwH'`�."�ŷ��XS~�v0#�����NGlIEND�B`�PK�X�`����gizmodo.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
gizmodo.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Gizmodo(BasicNewsRecipe):
    title = 'Gizmodo'
    __author__ = 'Darko Miletic'
    description = "Gizmodo, the gadget guide. So much in love with shiny new toys, it's unnatural."
    publisher = 'gizmodo.com'
    category = 'news, IT, Internet, gadgets'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = True
    language = 'en'
    masthead_url = 'http://cache.gawkerassets.com/assets/gizmodo.com/img/logo.png'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Articles', u'http://feeds.gawker.com/gizmodo/vip?format=xml')]

    remove_tags = [
        {'class': 'feedflare'},
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�����gkt.png�PNG


IHDR  ��tRNSn��gIDAT�k�]�U��Z{�sϽw�~��vbc�!iR�C�ڴ��#��@� ��T$����)J���ģ��Q)P^A�&$R�4�BB��*u?q��]�㙱���{�9{���'^�
�"�>Eu�Ez�P֐1��d�fD�"����f�9��k]���t��$�^P@2��M��e��ҭ3?�r�G4��D�4�܎��#{P��CW�<�`���� ����#$,`C�n[�\�w_���״��8S���t�������w��>��2�a�N�J�b�@0�����{[��D�����/�^��{S����~"���5N6�����.��ö�V��U\�F0��x�-_x�/�٥�:�H�Vɛ6�z��Lhn&K���v����[�j��AD��%�3!@DA2ݭ��o��^w�^$��J�Tg(Sp�	�)�tts�%�/dv����<+AE"9��`c�O߼���|��֦֕T��{$oe���*34�Q	�/lSΝz���úo+R+A=��HDj���v7Y?���a�e#�U��j�����ct]���\s�}�o_^�����ݶ�a�	 ��H�(`��fs��ֳu��!VM3�j�:�Y���Tw0���L{[ʔ0��+WN��`A�[�{�#��
��C���//�e�$y���*
!�Hh��O�+a����7e8s1�x
&X1p@U0(8<�[sZ�����b\�b!�}��G�֣�u��aK���&�"��FSqA	NīA.hR\�s�P�W&ƨ�ˣn��g��3{v���ј��q�1
ق�
}�-�`���]�X`�)]��&lfV;քI��Dӧ�\�t[�>�A����Av�%��i�bT"P���m�u�<GE�2I\s[^��j��c��cy���x]�%��� ����@B�����u���ߪlK�G���3�7ƾs?w޽�t��i3Z.�}���ǎ������~d$AqC*P@[h�� ���mG>��wMlK;
�D6�s�c����?s�n/������/m���u���cf%�\񈫂�
d7$R��KD�u߃�.�å�x�h�c�g�z�rc�w�����U���-;�}2;	CD�@@H�P�FU5%ŬL���\������
�l;�׽�t�����͎�~�ľ�l?��𡓤mxI\b�A���PQfL��M�wr��_"Ʃ�ˣfZUְ0x��>1w��]��{Z6
�Dp,I�#:D:H�tf�R�7Ir��o���W��7��z�ش�7WV�qk�6E���g�����A|6��uh%p02�q"�PMA�L�g��/����{���>��t�1�Y��x��_��?�6��<�8{��zؐTwt��p"6!V^LB�Xz�{�/���_|��� %t��t��#��D�4���S_>����g��O����` 	G�ƈ:=1Mμ�#'��[HX��,x����?}�/wᚤ�Tj�]}�O��'~#W��bPaXQM.�GN|d��jH�	��aܾ����t%tsÓ������_��g��������4;�
r��`@�빮iS��;2�������Z������{����G�����[g��:|`ߖ9q0pb1�q�����<����/��W�]�����������_��+?�Xz�#m�_�~PC
�@'�����Ȱ�\^{�ɧ�\[��?~�/�e��7/\[=;>���q�f��#'uv���r���-�T!���BC7����J���+/���o.?����x���_(�[v���}�me��^Y����n�ފ����������za�W����7�p㿞��ե��>񡧾�W�%�(�;}����B�o<;�}����aPi�#U@$����~/2��z�����V���~'��'��Ij�X#��aϽ�v�_x��o�ۻ�s�}�o�<���\)����d&�d�ڹ����g�G���$��nT@2&-R�t�{(H��;�d����A��H��&ŀ5�t.�`Ni�U��h��T��}�X1�t�`�&ā8IEND�B`�PK�X �@
gkt.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class GKT(BasicNewsRecipe):
    title = u'General Knowledge Today'
    language = 'en_IN'
    __author__ = 'Kovid Goyal'
    oldest_article = 7  # days
    max_articles_per_feed = 20

    no_stylesheets = True
    no_javascript = True
    auto_cleanup = True

    def parse_index(self):
        securl = 'https://www.gktoday.in/current-affairs/'
        ans = {}

        def p_tags(h1):
            for sib in h1.next_siblings:
                if sib.name == 'h1':
                    break
                if sib.name == 'p':
                    yield sib

        def find_cat(ps):
            for p in ps:
                for a in p.findAll('a', rel='tag'):
                    return self.tag_to_string(a)

        for i in range(1, 6):
            page = '' if i == 1 else 'page/' + str(i)
            self.log('Trying:', securl + page)
            soup = self.index_to_soup(securl + page)
            container = soup.find(**classes('left_middle_content'))
            for h1 in container.findAll('h1'):
                title = self.tag_to_string(h1)
                a = h1.find('a')
                if a is None:
                    continue
                url = a['href']
                ps = tuple(p_tags(h1))
                category = find_cat(ps) or 'Unknown'
                ans.setdefault(category, []).append({
                    'title': title, 'url': url, 'description': self.tag_to_string(ps[0])})
                self.log('\t' + title + ' ' + url)
        return list(ans.items())
PK�X���آ�glamour.png�PNG


IHDR  D����PLTE���,7����)5�+6����*5��������*6������SU����/9�-8����+7�Ʈ�0:����sn����DI�����Խ��ë�9A�vp�������3=�7?������'3ܿʥ��=D�۾����жƛ��OR����1;�ql����2<�GL������Ψ��1:�Z[�Ѷ�if�TV�������HM��~�ڽ�.8����ٽ�LP�LP�������(4�y��{�jg����̲�lh�4=�������?F����rm������oj�RT�ϵ�YZ���՟����«�������&2���ĭ�����}�׻�@F����fd����ͳ�FK��|�3<����Ӹ�Ӹ�5>�uo���ӕ��XY�IM�����y�������������gd������Ґ��������8@����������xq�������ec�OR�>E�>E�~v��{������ͭ��Թ�zs����ŭ�]]��R��IDATxڝ���@���~㉓c�m۶m۶۟����)�Et�I���R&��@L,�l�v�bf������L��}3>`ڮ3�R��~�b�X)s��BՀ�e	`vW�%�����}�-
	d4ո��J Ҥ�.�|x�r�9u���Y,�Zֱ�g�v������~e/�?u�~>	`7���}G�l]Д���RBkm��9���S�\�[ ��[?8[jU�qA�0�O8�J
�.�j^��-+8��zOe�Z�u}o�wJ��{zu��]��V/�Їf1#�-�AAf���1`��n:q��s���7��u����c��ekPJ2	~��y@���(�65��rA�D:�p&룹�;Ͻ�}��?�0��H��}����!Q��?_^O?4@�u�qIEND�B`�PK�X��]�glamour.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1305547242(BasicNewsRecipe):
    title = u'Glamour (US)'
    oldest_article = 21
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'en'
    remove_javascript = True
    __author__ = 'Anonymous'
    auto_cleanup = True

    feeds = [
        (u'All Fashion',
         u'http://feeds.glamour.com/glamour/all_fashion'),
        (u'All Beauty',
         u'http://feeds.glamour.com/glamour/all_beauty'),
        (u'All Sex, Love & Life',
         u'http://feeds.glamour.com/glamour/sex_love_life'),
        (u'All Health & Fitness',
         u'http://feeds.glamour.com/glamour/health_fitness'),
        (u'Slaves to Fashion blog',
         u'http://feeds.glamour.com/glamour/slavestofashion'),
        (u'The Girls in the Beauty Department',
         u'http://feeds.glamour.com/glamour/thegirlsinthebeautydepartment'),
        (u'Smitten blog',
         u'http://feeds.glamour.com/glamour/smitten'),
        (u'Save the Date',
         u'http://feeds.feedburner.com/glamour/save-the-date'),
        (u'Save the Date',
         u'http://feeds.feedburner.com/glamour/save-the-date'),
        (u'Vitamin G blog',
         u'http://feeds.glamour.com/glamour/vitamin-g'),
    ]
PK�Xtv�]]glasgow_herald.png�PNG


IHDR  ��tRNSn��IDATH��V�O�p��P��Ь�\��"�"$L�HL�D^}��H4��������q3�(hb��^0��lإWO�ntl�u��''K�|�~�����,QA��LO������3_&F��O���&����?dp�Lp��B�^�ݺӎ#UJ���j���NA��5,˞io�]�=?ۑ�/��kC�;�`��a���?�{k��(%-(�!d����'�`����H$��-_�z��X,��ʒ�o^�\[[�8v]A<|����=�<@)�"��
�A?/���g������x������jLA��k�*%0��)8�,
�������Y��Vp����9m�������8�Z߀��<]!�߂�`�B [�&Aܢ�	W#@t`�,r���"y�\EР ��ʴD'A�EhmE�j8ȋ�H������8�����
��o�����y��mgavfe�H�!i��Md>�2	�d÷�10\���3zZa�zzo
z�zz���kD��ذ\�QJ/ڼLs3�"Yu�� n��^d�I6� #�PuЮU�#�lv�� �ж����ȍH�AC��ۤU���@��o���*B��-��
`\kk���E0@��>_C�0��/�����%^HA����f²>x5Ֆ��k��T�s�ӣ#�gO��y(!w�jʲ����g�s�i���>N�?<~��� T�x�y��Ջ�_K����b�y7�t�n�29�hgw�J���{��a�ٔ)e��=	
`gX�a5�a#,[��(�5#�K�d�_��yM�}�IEND�B`�PK�Xb�47DDglasgow_herald.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


class GlasgowHerald(BasicNewsRecipe):
    title = u'Glasgow Herald'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    language = 'en_GB'

    __author__ = 'Kovid Goyal'
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        (u'News', u'https://www.heraldscotland.com/news/rss/'),
        (u'Sport', u'https://www.heraldscotland.com/sport/rss/'),
        (u'Business', u'https://www.heraldscotland.com/business_hq/rss/'),
        (u'Lifestyle', u'https://www.heraldscotland.com/life_style/rss/'),
        (u'Arts & Entertainment', u'https://www.heraldscotland.com/arts_ents/rss/',),
        (u'Politics', u'https://www.heraldscotland.com/politics/rss/'),
        (u'Columnists', u'https://www.heraldscotland.com/opinion/columnists/rss/')

        ]
PK�X��Errglenn_greenwald.png�PNG


IHDR  ��9IDATx�}Vt$M��n�l�6��ͳm+�"�ٶ����l+6��_=}��z�W��������5��(Գ�9h
nrN�(z�B��UX�U �9�B���(D�w8�ӓ6<<F5�r���i�[>���������yV��ۺύ�5�y�}|jHP��X��
��-&�^�l��T�*�!)*t�D��?�M���r.���oyEe5"�L*�9��,�՗�S����n5%���h�ջ憞:�0��g�T���L�}�@��a�~�������dԩܡ�U�"�T�ܑ��N���ׁ�P�0��r&��U W(dr"��o�bSff�E"D���'0.,��9�n�h�a����+x_GJR��}�@W��kx����t\��,�kR�?� Q�X�,�R�@�������i�0b�5�q��3R��\.'X�7�>�6���GN��&4b���a��TB_&Wu������/�)c��:èu����V�U]����.�A�1�&��w1�"�v�_P�RՔݗ��x�
8����eU8k�BI����k?�p����={>�s��r։ʴ��9��p͈ɀh���Œ0�����F�l?��D+Q����擴��|��@�0U��zu�0|5�I'����>
�<�5ߨf��p�Q����U�M��Vks�
hq�������9l*����1�Xq���jZ@�8��������"����x`��"/�޸>��jᠶZ��@�	;mB��rAP]�\����10b#�ʇ��2_�Z ��H��y#����r5*}7h���'�;�^z��]��܂��p�v����]TS=�m5^3���N:��q�����N+V$�����W�>�DQ���R�9X�+���m��
�5e�Z�B.C�-��B%a�JN_���f]�K{=t�2��+�������Yُ�rT���TUVWV�y�����]G�:,�ޓS/t�j_��"Ɓ�[�	������������:���̞6�Z�i<r��+����D�Zw�.ƞ��۸�^}���kD����B�k$i�f����d):��)�I��r��N���i�q��$z���x�uȢh����}��}�O�4�
`�g��K�x��V"���"B�
�TTT)K���Z$~���?�| B�����>�����}�5�,����j�J��f̒p�'k2tg����ݷac�ԗ�C���3�/;<�j-����mz[��v�,��g�ŌZ�q?���Rd�M�~pH�K,��S0�Tk�(4�&��1��W]?��x@1`n8������V
t^v�V򇏟���F�z�+��D��qe��j���$�z��-g{>v���(�,�3…��0j�oƁ|+v�r��ܢr��/_]�M�KN�MJS�8�S3����*5P��]�`�:�P�@3kSߑK6�V�4����K�X̅�ӡ�4
a�O���c&�,.)a	�Y�T��'!��rx���C]��
�N��:�q]47��GC���cӔĕ��nE�x���.M2V��ɝIEND�B`�PK�X���ttglenn_greenwald.recipefrom calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1373130920(AutomaticNewsRecipe):
    title = u'Glenn Greenwald | guardian.co.uk'
    language = 'en_GB'
    __author__ = 'anywho'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Latest', u'http://www.guardian.co.uk/profile/glenn-greenwald/rss')]
PK�X�,���
glennbeck.png�PNG


IHDR  ��tRNSn��NIDATx^�Vmo\W���{w�k�__Bڐ��I�&���6u�
Z�"%��"�R�h��		>T�TMh���-&�i�(V܄��^;��r_Ι���V�`�>���93�y�̽� ds�L6��(7CX�@�R�!�cj���aԨ�u�O� ,�oZ���GJ��"�d�_o԰����Ҁ�+�`$�S��i��=Ȳ5 ���̬�5Ѷ_L-e�fF`Y>aF�Hi@��h���k�!A�4��O)DtIU\C�ᖾ #�j���K�
�� ���^�̺�|$k@�D���y�s���}��g<��~t�����=�.��}e��O|�[�x`/�[=Ϫ^��Lr���{?�9Cu��r�I`]iCn��^�cC~d���� ��m/# ��X
NC�Ƀ�w�O�b9��S�&ޛ<y����i|d����x�ݍzu0��
<{k-ĵ���ۻ%����s��_��?;��C�c>��t8�.T6`�V(��"b�$����%�����W�x��eo ��矿0~��,�lK�I
سw~p�����QT�f��M�L���]�qId-�xD��P;~��/��AtӚ�5XY�(��@��T(��$$�gNOzd%.D�ͱ�_�*��fjO�v7J�(gsY�u�RI"���z���P�8v���b�F<su�*��#k`J7�b��1"����m��Hh�q�K����=+�Z-��,r�Xh�$hD�$,�\�s�pg]d,���R���Q���	��`Ӣĉ�����ZD�'��8�M_�U�,Y�������ӝ$��1ĈD�V��[
AN5��@G�Q�1&�x�쿘3�ju�-�x��y-5�0Jnl�}��}�°NhS��"�Z��z��۷�~aq��Ϯ��o?6��(є�߶���J�V[�3�X�X��Ekq�s^�͛��. UY�|�=wn�]�P�'��ak��'��4\,�B"��	�R���G�@A�ko��W�����5R.�󥬩,����[����oޯ����.jAA�ԏ��_�<~����+�����G^��+G�b�އ��`�T ĩ�6�sTsz�a�2|t��i%������׸o�"�0X\X���{�{��'�y����1f�Z��C�G{{F�A�J}���ARA���k7��
��{��{�m
6�id�ʥ7^�بC�!�U�Gal߮$1.�:o�?��B0�*]��t|�Įms=�+O>:v����(G��?�n˝���эo�yb�,bi��0�M
<�K�䅣z����!�*��mۘTE�h �.-������/�H<*��րA{�:�������x����%tށ�������|�_�({��`�KX����"ҺxQsHĖ�3W4��R�+�u��<+�-�Oϔ}�k4����hecf���j�:��rEH�{��N$QZ��)��P<B"���"Z
���@���@�	���kk�b2d�B�f�sC�(� $l!���գ�2����Y��أ�b�\>fq��F\���(��g�̩�D�ި7���T�O�\lIEND�B`�PK�X�ZQ�
�
glennbeck.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag, Comment


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class GlennBeckRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en'
    version = 1

    title = u'Glenn Beck'
    publisher = u'Premiere Radio Networks'
    category = u'News, Opinion'
    description = u'The fusion of entertainment and enlightenment'

    oldest_article = 7
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False

    feeds = [(u'Glenn Beck', u'http://feeds.feedburner.com/GlennBeckArticles')]

    def preprocess_html(self, soup):
        # Their html is horribly broken; if we search for the div that has the content BeatifulSoup returns the div with only the headline and no content.
        # This is due to illegal nesting of tags. So we do it the hard way.

        # We can find this one, and we don't want it.
        div = soup.find('div', attrs={'id': 'extraInfo'})
        if div:
            div.extract()

        # Don't want these either.
        iframes = soup.findAll('iframe')
        [iframe.extract() for iframe in iframes]

        # Get empty document.
        freshSoup = self.getFreshSoup()

        # This is the broken div; but we can find the headline.
        newsDiv = soup.find('div', attrs={'class': 'news-detail'})
        if newsDiv:
            if newsDiv.h1:
                freshSoup.body.append(newsDiv.h1)

        # The content is  wrapped in <p></p> tags, most of the time anyway.
        counter = 0
        for p in soup.findAll('p'):
            if p.get('class') == 'smalltextwhite':
                # But we don't want this one.
                continue

            freshSoup.body.append(p)
            counter += 1

        # Debugging block

        # In some articles the content is not wrapped in <p></p> tags. In that case the counter is low.
        # 2 is the magic number that seems to work.
        if counter <= 2:
            # So they are playing hard-to-get: first throw out all comments.
            comments = soup.findAll(
                text=lambda text: isinstance(text, Comment))
            [comment.extract() for comment in comments]

            # Find all unwrapped strings.
            for txt in soup.findAll(text=True):
                raw = txt.strip()
                # Debugging line

                if (txt.parent.name == 'body' and len(raw) > 0) and not (len(raw) == 6 and raw == '&nbsp;'):
                    # This is our content; ignore the rest.
                    para = new_tag(freshSoup, 'p')
                    para.append(raw)
                    freshSoup.body.append(para)
                    counter += 1

            # Now if the counter is still 0 or 1 they did something completely
            # different and we still have an empty article. In a last attempt,
            # add the whole content div, just in case.
            if counter < 2:
                freshSoup.body.append(newsDiv)

            # Debugging block

        return freshSoup

    def getFreshSoup(self, title=None):
        if title:
            return BeautifulSoup('<html><head><title>' + str(title) + '</title></head><body></body></html>')
        else:
            return BeautifulSoup('<html><head><title></title></head><body></body></html>')
PK�XW���globaltimes.png�PNG


IHDR  �Tg�-PLTE�'�*5�IR�KT�go�v}�����������������For�tRNS@��f{IDATx^��Q
!�a,����Y8�����Z8X
�#!!�����{h�LJ7S��؇��풚���B���=��0����/x�k��h���c&�*;�����T���;��C~����IEND�B`�PK�XK񰵍
�
globaltimes.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(
        attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)}
    )


class GlobalTimes(BasicNewsRecipe):
    title = u'Global Times'
    __author__ = 'Jose Ortiz'  # lui1 at mobileread.com
    language = 'en_CN'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    keep_only_tags = [classes('article-title article-source row-content')]

    preprocess_regexps = [(
        re.compile(
            r'(?:<(?:br(?:\s*/)?|/br\s*)>(?:\s|'
            '\xA0'
            r'|&nbsp;)*){2,9}', re.U | re.I
        ), lambda match: '<p>'
    )]

    extra_css = '''
        :root {
            font-family: Arial, Helvetica, sans-serif;
        }

        .article-title {
            font-weight: bold;
            font-size: large;
        }

        .article-source, .row-content {
            font-size:small;
        }
        '''

    def parse_index(self):
        catnames = {}
        catnames["https://www.globaltimes.cn/china/politics/"] = "China Politics"
        catnames["https://www.globaltimes.cn/china/diplomacy/"] = "China Diplomacy"
        catnames["https://www.globaltimes.cn/china/military/"] = "China Military"
        catnames["https://www.globaltimes.cn/world/asia-pacific/"] = "Asia Pacific"
        catnames["https://www.globaltimes.cn/sci-tech"] = "Sci-Tech"
        feeds = []

        for cat in catnames:
            articles = []
            self.log(cat)
            soup = self.index_to_soup(cat)
            for a in soup.findAll(
                'a',
                attrs={
                    'href':
                    re.compile(
                        r'https?://www.globaltimes.cn/content/[0-9]{4,10}[.]shtml'
                    )
                }
            ):
                # Typical url http://www.globaltimes.cn/content/5555555.shtml
                url = a['href'].strip()
                title = self.tag_to_string(a).strip()
                if not title:
                    continue
                myarticle = ({
                    'title': title,
                    'url': url,
                    'description': '',
                    'date': ''
                })
                self.log("found '%s'" % title)
                articles.append(myarticle)
                self.log("Adding URL %s\n" % url)
            if articles:
                feeds.append((catnames[cat], articles))
        return feeds

    def postprocess_html(self, soup, first_fetch):
        for p in [p for p in soup('p') if len(p) == 0]:
            p.extract()
        return soup
PK�Xy�#�nnglobe_and_mail.png�PNG


IHDR  D���3PLTE������������������tRNS 0@P`p��������T���IDATxڄ�U� �C)d���'ur�T �w\O��m�<�ǥ��|�0Xp�B���Ȋ��a�C$Y��*��d�׷
�(.��*�"+7�Py+�w�o~�b�<_�㪴�|k�CZ?n$@F�rC� )�����]p��;�V?i���݆W~�L��F
�%�7�EgZ0�l�O�����I�L��ngFf�?Qm{v����\1k��b��Y��;�D� ��"�IEND�B`�PK�Xd�ŧzzglobe_and_mail.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>

from calibre.web.feeds.news import BasicNewsRecipe


def absolutize(href):
    if href.startswith('/'):
        href = 'https://www.theglobeandmail.com' + href
    return href


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class GlobeMail(BasicNewsRecipe):
    title = u'The Globe and Mail'
    __author__ = 'Kovid Goyal'
    encoding = 'utf-8'
    publisher = 'Globe & Mail'
    language = 'en_CA'
    ignore_duplicate_articles = {'title', 'url'}
    no_stylesheets = True
    remove_attributes = ['style']

    keep_only_tags = [
        classes('article-title c-article-meta l-article l-article-title')
    ]
    remove_tags = [
        classes('c-ad pb-f-commercial-dfp-ads pb-f-article-actions pb-f-article-meta article-toolbar'),
        dict(name='source'),
    ]

    def parse_index(self):
        ans = []
        for section in 'canada opinion politics sports life arts world real-estate'.split():
            if self.test and len(ans) >= self.test[0]:
                break
            soup = self.index_to_soup('https://www.theglobeandmail.com/{}/'.format(section))
            self.log('Processing section:', section)
            articles = list(self.parse_gm_section(soup))
            if articles:
                ans.append((section.capitalize(), articles))
        return ans

    def parse_gm_section(self, soup):
        for a in soup.findAll('a', href=True, attrs={'data-lt-pos': lambda x: x and x.endswith('featured')}):
            headline = a.find('div', 'c-card__hed-text')
            title = self.tag_to_string(headline)
            url = absolutize(a['href'])
            self.log('  ', title, 'at', url)
            yield {'title': title, 'url': url}
PK�X,�;���globes_co_il.png�PNG


IHDR  ��tRNSn��	pHYs���IDATHǵ�}LSW��_MHH���i��4�!,%,jFh	m���?\�elA�l�L0�P>7��QZ����b�c�����}�8G��n���'��~�-�k�B��h��旗��;�s�=� �pX�l!��y������Z$���]��aۤUz^�%mTe	a{�H��mn�B`p'�v�+�#/Sl
)�d���F�
�Oi������U����o��Ro��^��e��ҏ5 �qD�;�x暈�����?��������dH�&G����
4����OFO�,M2��=9Mkϡ:�c\Q������gW���vV��N�r�/E�%�u��Dc��Q�@���Ͱ�mU�i�@9"��}3���@0��Y>�<�
�PwV�Q�H�6�Q��v�����4F>�Xn8�3;�&&C�{}���
�ϖ�"���hCri�C8#5g��m��ч�m	���E�{߬R��2Pc������[����}�7Do�51�\����a�P�-I�@����Cu����*�M`5��b]E!�I����-Qf�0�L�Y�#�}oUw�^I�D2��u���Wk>���N�9��#GN�H��d��j��	O�Dvy�X������*�rra���e�n|�	 �hf�VP���fKqn���¿W^�C&�W�X�����vؘZ����O߽���3oh�� �tf��79�|���x*0�T��
�����}�`�����ob�x<��{�
�<���p�~���q^�]}�e��M�!sͰM�H�M�Eא���f=�������Ԣ<�A!
��35�W�<���;���?A��3·Z����9A��e���
ˉ6�A�rBF4�*kѬ4�U��Pn-4R�Af>�6����!"�vɅ�����P�/��������js^��R,Q�<���Nv�}�'�D�"�I��4z�X|�#�4՟��v$ȴȭ���V���L�w�܄geiyi!�Y����$�Q=U��9��NS,'��p%X��`�s�����W�t�ƀ!L�iR��/�W�U�T��J���R�E�<m/�b"L&�V��dz�Ug�3�@���[�*h���6��:F�_���F�d��=�q*2U���֤�YۙIEND�B`�PK�X�
aR�
�
globes_co_il.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1283848012(BasicNewsRecipe):
    description = 'This is Globes.co.il.'
    cover_url = 'https://images.globes.co.il/globes/logo-138-35-2.svg?ver=1'
    title = u'Globes'
    language = 'he'
    __author__ = 'marbs & barakplasma'
    extra_css = 'img {max-width:100%;} body{direction: rtl;max-width:100%;}title{direction: rtl; } article_description{direction: rtl; }, a.article{direction: rtl;max-width:100%;} calibre_feed_description{direction: rtl; }'  # noqa
    simultaneous_downloads = 5
    remove_javascript = True
    keep_only_tags = [
        dict(name='h1', attrs={'id': 'F_Title'}),
        dict(name='h2', attrs={'id': 'coteret_SubCoteretText'}),
        dict(name='div', attrs={'class': 'articleInner'}),
    ]
    timefmt = '[%a, %d %b, %Y]'
    oldest_article = 1
    max_articles_per_feed = 100
    remove_attributes = ['width', 'style']

    feeds = [
        (u"עידכוני RSS ", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=3038"),
        (u"כל הכתבות", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=2"),
        (u"שוק ההון", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=585"),
        (u"בארץ", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=9917"),
        (u"גלובלי ושוקי עולם", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=1225"),
        (u"גלובסטק", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=594"),
        (u"דין וחשבון", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=829"),
        (u"דעות", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=845"),
        (u"וידאו", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=2007"),
        (u"ליידי גלובס", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=3314"),
        (u"מגזין G", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=3312"),
        (u"nadlan", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=607"),
        (u"נתח שוק וצרכנות", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=821"),
        (u"מטבעות דיגיטליים", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=9758"),
        (u"קריירה", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iid=3266"),
        (u"תיירות", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iid=9010"),
        (u"רכב", u"https://www.globes.co.il/webservice/rss/rssfeeder.asmx/FeederNode?iID=3220")
    ]
PK�X�G�glos_wielkopolski.png�PNG


IHDR(-SZPLTE��������p��P��@��0�� ������m��v����������vsthefZWX?;<1-.# �������������������݊�9fIDATx�u�Y� EQ���y�i%��7!�C�(��~�V~a^|dA��u(��?Ȧ0}�du���l��+A��A��D� ߀�X�,�
,�[�=d���3���ӬIEND�B`�PK�X��A		glos_wielkopolski.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class GlosWielkopolski(BasicNewsRecipe):
    title = u'G\u0142os Wielkopolski'
    __author__ = 'fenuks'
    description = u'Gazeta Regionalna Głos Wielkopolski. Najnowsze Wiadomości Poznań. Czytaj Informacje Poznań!'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    masthead_url = 'http://s.polskatimes.pl/g/logo_naglowek/gloswielkopolski.png?24'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}
    remove_tags_after = dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})
    remove_tags = [dict(id='mat-podobne'), dict(name='a', attrs={'class': 'czytajDalej'}), dict(attrs={
        'src': 'http://nm.dz.com.pl/dz.png'}), dict(name='a', attrs={'href', 'http://www.gloswielkopolski.pl/newsletter/'})]

    feeds = [
    (u'Wszystkie', u'http://gloswielkopolski.feedsportal.com/c/32980/f/533779/index.rss?201302'),
    (u'Wiadomo\u015bci', u'http://gloswielkopolski.feedsportal.com/c/32980/f/533780/index.rss?201302'),
    (u'Sport', u'http://gloswielkopolski.feedsportal.com/c/32980/f/533781/index.rss?201302'),
    (u'Kultura', u'http://gloswielkopolski.feedsportal.com/c/32980/f/533782/index.rss?201302'),
    (u'Porady', u'http://www.gloswielkopolski.pl/rss/gloswielkopolski_porady.xml?201302'),
    (u'Blogi', u'http://www.gloswielkopolski.pl/rss/gloswielkopolski_blogi.xml?201302'),
    (u'Nasze akcje', u'http://www.gloswielkopolski.pl/rss/gloswielkopolski_naszeakcje.xml?201302'),
    (u'Opinie', u'http://www.gloswielkopolski.pl/rss/gloswielkopolski_opinie.xml?201302'),
    (u'Magazyn', u'http://www.gloswielkopolski.pl/rss/gloswielkopolski_magazyn.xml?201302')]

    def print_version(self, url):
        return url.replace('artykul', 'drukuj')

    def skip_ad_pages(self, soup):
        if 'Advertisement' in soup.title:
            nexturl = soup.find('a')['href']
            return self.index_to_soup(nexturl, raw=True)

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.prasa24.pl/gazeta/glos-wielkopolski/')
        self.cover_url = soup.find(id='pojemnik').img['src']
        return getattr(self, 'cover_url', self.cover_url)
PK�X�ݖP��	go4it.png�PNG


IHDR��h6�IDATx��IMQ��9w|�g�؈�����/@QY*+A%[��B�X)Pf�y�<3��p�p�}��z�B��m�p�����|SM <Ք�	N���b���іm;&�"��`���jg뎲A
�Z]�y�j�Y�~�t]V_��E��JqP�T<�W0?�\�������CO.a�=:C��]^��d���������w���qU�\�I�!mf`����
]L?#^���۟�S͋��RdU>���5Ͷ:3�{n82�^z*�|X�V���]�0�k����+@pӫ������%[��e�i�iB�r�{IU�X�a4u�(mh�[�S�-����q��}��꽙$m�`�7?�ul�Ø%=��Vw�����&q�\=;��};�v,����'^?�?~�9+�OQ�1sl�u�g?{��~3rb�L���>+�ק��>э��~����K��u{�O�F�`ͪ��鹮H����E�ۧ/�ݓ�7o����m.���Yo�R��`���o��z����͚:c��݀_�fo����/���~_�ޒV�G�/��VAJ��P����G;���G>{l�h�ٳ�In�T�:��c���CE#*�+�$�ʚHO�&7ڙ0Vm�"-2�y�XwAl~xt���
d}:nBIEND�B`�PK�XkQ�A��go4it.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
go4it.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Go4ITro(BasicNewsRecipe):
    title = u'go4it'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'Gadgeturi, Lifestyle, Tehnologie'
    publisher = 'go4it'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Reviste,Ziare,IT'
    encoding = 'utf-8'
    cover_url = 'http://www.go4it.ro/images/logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'subTitle clearfix'}), dict(
            name='div', attrs={'class': 'story'})
    ]

    remove_tags = [
        dict(name='span', attrs={'class': ['data']}), dict(
            name='a', attrs={'class': ['comments']})
    ]

    feeds = [
        (u'Feeds', u'http://feeds2.feedburner.com/Go4itro-Stiri')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�d9pp
go_comics.png�PNG


IHDR  D����PLTE����������i����������������]��F�����������e����&��=���������U���q��"��[��i����T����|����������!��E�����������x��������������o������*�����C��W��������/��0��A�����������H��	���������{��r����������&������>���R���S��<����v��f������������T��	����'��������D����b��8����y��z��5��g������A��m��9��Q��5��f����E��Y��.��{����������X����%����������������cIDATx���w�1��<��m�m��m۶��f���/�\gXFɪ&����4q$�KX����R��H	�I�N_
%��$���}���C�/
ăl�u8�Y�掆ݾ�H*�B��z{ؗPoUk�'����$��&9������H9L~%�<f�*P(@��%�eb�-��wx������������:M[��>���	|8@���z��Jp�l��*�g^'7ܛ�w��gY��_��_E��޼}��t����
���j�@��A�T:<2
�q�ʢ��진�"||db1i?}�㢗��߷�?BΟ�~��=�T\���w��tn�]^|da��IEND�B`�PK�X#ڡT5�5�go_comics.recipe__license__ = 'GPL v3'
__copyright__ = 'Copyright 2010 Starson17'
'''
www.gocomics.com
'''
import shutil, os
from calibre.constants import iswindows
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryDirectory
from calibre.utils.filenames import ascii_filename


def absolutize(url):
    if url.startswith('/'):
        url = 'http://www.gocomics.com' + url
    return url


class GoComics(BasicNewsRecipe):
    title = 'Go Comics'
    __author__ = 'Kovid Goyal'
    __version__ = '1.06'
    __date__ = '07 June 2011'
    description = u'200+ Comics - Customize for more days/comics: Defaults to 1 day, 25 comics - 20 general, 5 editorial.'
    category = 'news, comics'
    encoding = 'utf-8'
    language = 'en'
    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['style']

    # USER PREFERENCES - COMICS AND NUMBER OF COMICS TO RETRIEVE ########
    # num_comics_to_get - I've tried up to 99 on Calvin&Hobbes
    num_comics_to_get = 1
    # CHOOSE COMIC STRIPS BELOW - REMOVE COMMENT '# ' FROM IN FRONT OF DESIRED STRIPS
    # Please do not overload their servers by selecting all comics and 1000
    # strips from each!

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.addheaders = [('Referer', 'http://www.gocomics.com/')]
        return br

    def parse_index(self):
        feeds = []
        self.gocomics_dir = PersistentTemporaryDirectory('_gocomics')
        for i, (title, url) in enumerate([  # {{{
            # (u"The Academia Waltz",u"http://www.gocomics.com/academiawaltz"),
            # (u"Adam@Home",u"http://www.gocomics.com/adamathome"),
            # (u"Adult Children",u"http://www.gocomics.com/adult-children"),
            # (u"The Adventures of Business Cat",u"http://www.gocomics.com/the-adventures-of-business-cat"),
            # (u"Agnes",u"http://www.gocomics.com/agnes"),
            # (u"AJ and Magnus",u"http://www.gocomics.com/aj-and-magnus"),
            # (u"Lalo Alcaraz",u"http://www.gocomics.com/laloalcaraz"),
            # (u"Ali's House",u"http://www.gocomics.com/alis-house"),
            # (u"Alley Oop",u"http://www.gocomics.com/alley-oop"),
            # (u"Amanda the Great",u"http://www.gocomics.com/amanda-the-great"),
            # (u"Nick Anderson",u"http://www.gocomics.com/nickanderson"),
            # (u"Andertoons",u"http://www.gocomics.com/andertoons"),
            # (u"Andy Capp",u"http://www.gocomics.com/andycapp"),
            # (u"Angry Little Girls",u"http://www.gocomics.com/angry-little-girls"),
            (u"Animal Crackers", u"http://www.gocomics.com/animalcrackers"),
            # (u"Annie",u"http://www.gocomics.com/annie"),
            # (u"The Argyle Sweater",u"http://www.gocomics.com/theargylesweater"),
            # (u"Robert Ariail",u"http://www.gocomics.com/robert-ariail"),
            # (u"Arlo and Janis",u"http://www.gocomics.com/arloandjanis"),
            # (u"Ask a Cat",u"http://www.gocomics.com/ask-a-cat"),
            # (u"Ask Shagg",u"http://www.gocomics.com/askshagg"),
            # (u"At the Zoo",u"http://www.gocomics.com/at-the-zoo"),
            # (u"Aunty Acid",u"http://www.gocomics.com/aunty-acid"),
            # (u"The Awkward Yeti",u"http://www.gocomics.com/the-awkward-yeti"),
            (u"B.C.",u"http://www.gocomics.com/bc"),
            # (u"Back to B.C.",u"http://www.gocomics.com/back-to-bc"),
            # (u"Back in the Day",u"http://www.gocomics.com/backintheday"),
            # (u"bacon",u"http://www.gocomics.com/bacon"),
            # (u"Bad Machinery",u"http://www.gocomics.com/bad-machinery"),
            # (u"Bad Reporter",u"http://www.gocomics.com/badreporter"),
            # (u"Badlands",u"http://www.gocomics.com/badlands"),
            (u"Baldo",u"http://www.gocomics.com/baldo"),
            # (u"Ballard Street",u"http://www.gocomics.com/ballardstreet"),
            # (u"Banana Triangle",u"http://www.gocomics.com/banana-triangle"),
            # (u"Barkeater Lake Pandolph",u"http://www.gocomics.com/barkeaterlake"),
            # (u"The Barn",u"http://www.gocomics.com/thebarn"),
            # (u"Barney",u"http://www.gocomics.com/barneyandclyde"),
            # (u"Basic Instructions",u"http://www.gocomics.com/basicinstructions"),
            # (u"Beanie the Brownie",u"http://www.gocomics.com/beanie-the-brownie"),
            # (u"Beardo",u"http://www.gocomics.com/beardo"),
            # (u"Darrin Bell",u"http://www.gocomics.com/darrin-bell"),
            # (u"Ben",u"http://www.gocomics.com/ben"),
            # (u"Clay Bennett",u"http://www.gocomics.com/claybennett"),
            # (u"Lisa Benson",u"http://www.gocomics.com/lisabenson"),
            # (u"Steve Benson",u"http://www.gocomics.com/stevebenson"),
            # (u"Bent Objects",u"http://www.gocomics.com/bent-objects"),
            # (u"The Bent Pinky",u"http://www.gocomics.com/the-bent-pinky"),
            # (u"Berger & Wyse",u"http://www.gocomics.com/berger-and-wyse"),
            # (u"Berkeley Mews",u"http://www.gocomics.com/berkeley-mews"),
            # (u"The Best Medicine Cartoon",u"http://www.gocomics.com/the-best-medicine"),
            # (u"Betty",u"http://www.gocomics.com/betty"),
            # (u"Bewley",u"http://www.gocomics.com/bewley"),
            # (u"Biff& Riley",u"http://www.gocomics.com/biff-and-riley"),
            # (u"Big Nate",u"http://www.gocomics.com/bignate"),
            # (u"Big Nate: First Class",u"http://www.gocomics.com/big-nate-first-class"),
            # (u"The Big Picture",u"http://www.gocomics.com/thebigpicture"),
            # (u"Big Top",u"http://www.gocomics.com/bigtop"),
            # (u"Biographic",u"http://www.gocomics.com/biographic"),
            # (u"Birdbrains",u"http://www.gocomics.com/birdbrains"),
            # (u"Bleeker: The Rechargeable Dog",u"http://www.gocomics.com/bleeker"),
            # (u"Bliss",u"http://www.gocomics.com/bliss"),
            # (u"Bloom County",u"http://www.gocomics.com/bloomcounty"),
            # (u"Bloom County 2016",u"http://www.gocomics.com/bloom-county"),
            # (u"Bo Nanas",u"http://www.gocomics.com/bonanas"),
            # (u"Bob the Squirrel",u"http://www.gocomics.com/bobthesquirrel"),
            # (u"Chip Bok",u"http://www.gocomics.com/chipbok"),
            # (u"Boomerangs",u"http://www.gocomics.com/boomerangs"),
            # (u"The Boondocks",u"http://www.gocomics.com/boondocks"),
            (u"The Born Loser",u"http://www.gocomics.com/the-born-loser"),
            # (u"Matt Bors",u"http://www.gocomics.com/matt-bors"),
            # (u"Bottomliners",u"http://www.gocomics.com/bottomliners"),
            (u"Bound and Gagged",u"http://www.gocomics.com/boundandgagged"),
            # (u"Brain Squirts",u"http://www.gocomics.com/brain-squirts"),
            # (u"Break of Day",u"http://www.gocomics.com/break-of-day"),
            # (u"Breaking Cat News",u"http://www.gocomics.com/breaking-cat-news"),
            # (u"Steve Breen",u"http://www.gocomics.com/stevebreen"),
            # (u"Brevity",u"http://www.gocomics.com/brevitypanel"),
            # (u"Brewster Rockit",u"http://www.gocomics.com/brewsterrockit"),
            # (u"Chris Britt",u"http://www.gocomics.com/chrisbritt"),
            (u"Broom Hilda",u"http://www.gocomics.com/broomhilda"),
            # (u"The Buckets",u"http://www.gocomics.com/thebuckets"),
            # (u"Bully",u"http://www.gocomics.com/bully"),
            # (u"Buni",u"http://www.gocomics.com/buni"),
            # (u"Bushy Tales",u"http://www.gocomics.com/bushy-tales"),
            (u"Calvin and Hobbes",u"http://www.gocomics.com/calvinandhobbes"),
            # (u"Candorville",u"http://www.gocomics.com/candorville"),
            # (u"Stuart Carlson",u"http://www.gocomics.com/stuartcarlson"),
            # (u"Ken Catalino",u"http://www.gocomics.com/kencatalino"),
            # (u"Cathy",u"http://www.gocomics.com/cathy"),
            # (u"Cattitudeƒ??Doggonit",u"http://www.gocomics.com/cattitude-doggonit"),
            # (u"C'est la Vie",u"http://www.gocomics.com/cestlavie"),
            # (u"Cheap Thrills Cuisine",u"http://www.gocomics.com/cheap-thrills-cuisine"),
            # (u"Chuckle Bros",u"http://www.gocomics.com/chucklebros"),
            # (u"Citizen Dog",u"http://www.gocomics.com/citizendog"),
            # (u"The City",u"http://www.gocomics.com/thecity"),
            # (u"Claw",u"http://www.gocomics.com/claw"),
            # (u"Clear Blue Water",u"http://www.gocomics.com/clearbluewater"),
            # (u"Cleats",u"http://www.gocomics.com/cleats"),
            # (u"Close to Home",u"http://www.gocomics.com/closetohome"),
            # (u"The Comic Strip That Has A Finale Every Day",u"http://www.gocomics.com/the-comic-strip-that-has-a-finale-every-day"),
            # (u"Committed",u"http://www.gocomics.com/committed"),
            # (u"Compu-toon",u"http://www.gocomics.com/compu-toon"),
            # (u"The Conjurers",u"http://www.gocomics.com/the-conjurers"),
            # (u"Connie to the Wonnie",u"http://www.gocomics.com/connie-to-the-wonnie"),
            # (u"Cornered",u"http://www.gocomics.com/cornered"),
            # (u"Cow and Boy Classics",u"http://www.gocomics.com/cowandboy"),
            # (u"CowTown",u"http://www.gocomics.com/cowtown"),
            # (u"The Creeps",u"http://www.gocomics.com/the-creeps"),
            # (u"Crumb",u"http://www.gocomics.com/crumb"),
            # (u"Cul de Sac",u"http://www.gocomics.com/culdesac"),
            # (u"Dadding Badly",u"http://www.gocomics.com/dadding-badly"),
            # (u"Daddy's Home",u"http://www.gocomics.com/daddyshome"),
            # (u"The Daily Drawing",u"http://www.gocomics.com/the-daily-drawing"),
            # (u"Jeff Danziger",u"http://www.gocomics.com/jeffdanziger"),
            # (u"Dark Side of the Horse",u"http://www.gocomics.com/darksideofthehorse"),
            # (u"Matt Davies",u"http://www.gocomics.com/mattdavies"),
            # (u"Deep Dark Fears",u"http://www.gocomics.com/deep-dark-fears"),
            # (u"John Deering",u"http://www.gocomics.com/johndeering"),
            # (u"Diamond Lil",u"http://www.gocomics.com/diamondlil"),
            # (u"Dick Tracy",u"http://www.gocomics.com/dicktracy"),
            # (u"Dilbert Classics",u"http://www.gocomics.com/dilbert-classics"),
            # (u"The Dinette Set",u"http://www.gocomics.com/dinetteset"),
            # (u"Dinosaur Comics",u"http://www.gocomics.com/dinosaur-comics"),
            # (u"Dog Eat Doug",u"http://www.gocomics.com/dogeatdoug"),
            # (u"Dogs of C-Kennel",u"http://www.gocomics.com/dogsofckennel"),
            # (u"Domestic Abuse",u"http://www.gocomics.com/domesticabuse"),
            # (u"Doodle for Food",u"http://www.gocomics.com/doodle-for-food"),
            # (u"Doodle Town",u"http://www.gocomics.com/doodle-town"),
            # (u"Doonesbury",u"http://www.gocomics.com/doonesbury"),
            # (u"The Doozies",u"http://www.gocomics.com/thedoozies"),
            # (u"Dorris McComics",u"http://www.gocomics.com/dorris-mccomics"),
            # (u"Alex Norris",u"http://www.gocomics.com/dorris-mccomics"),
            # (u"Drabble",u"http://www.gocomics.com/drabble"),
            # (u"Dragon Girl",u"http://www.gocomics.com/dragon-girl"),
            # (u"Drive",u"http://www.gocomics.com/drive"),
            # (u"dro-mo",u"http://www.gocomics.com/dro-mo"),
            # (u"Dude and Dude",u"http://www.gocomics.com/dudedude"),
            # (u"The Duplex",u"http://www.gocomics.com/duplex"),
            # (u"Tim Eagan",u"http://www.gocomics.com/tim-eagan"),
            # (u"Edge City",u"http://www.gocomics.com/edge-city"),
            # (u"Edge of Adventure",u"http://www.gocomics.com/edge-of-adventure"),
            # (u"Eek!",u"http://www.gocomics.com/eek"),
            # (u"The Elderberries",u"http://www.gocomics.com/theelderberries"),
            # (u"Emmy Lou",u"http://www.gocomics.com/emmy-lou),
            # (u"Endtown",u"http://www.gocomics.com/endtown"),
            # (u"Eric the Circle",u"http://www.gocomics.com/eric-the-circle"),
            # (u"Everyday People Cartoons",u"http://www.gocomics.com/everyday-people-cartoons"),
            # (u"Eyebeam",u"http://www.gocomics.com/eyebeam"),
            # (u"F Minus",u"http://www.gocomics.com/fminus"),
            # (u"Family Tree",u"http://www.gocomics.com/familytree"),
            # (u"Farcus",u"http://www.gocomics.com/farcus"),
            # (u"Fat Cats",u"http://www.gocomics.com/fat-cats"),
            # (u"Flo and Friends",u"http://www.gocomics.com/floandfriends"),
            # (u"The Flying McCoys",u"http://www.gocomics.com/theflyingmccoys"),
            # (u"Foolish Mortals",u"http://www.gocomics.com/foolish-mortals"),
            (u"For Better or For Worse",u"http://www.gocomics.com/forbetterorforworse"),
            # (u"For Heaven's Sake",u"http://www.gocomics.com/forheavenssake"),
            # (u"Fort Knox",u"http://www.gocomics.com/fortknox"),
            # (u"Four Eyes",u"http://www.gocomics.com/four-eyes"),
            # (u"Fowl Language",u"http://www.gocomics.com/fowl-language"),
            # (u"FoxTrot",u"http://www.gocomics.com/foxtrot"),
            # (u"FoxTrot Classics",u"http://www.gocomics.com/foxtrotclassics"),
            # (u"Francis",u"http://www.gocomics.com/francis"),
            (u"Frank and Ernest",u"http://www.gocomics.com/frank-and-ernest"),
            # (u"Frankie Comics",u"http://www.gocomics.com/frankie-comics"),
            # (u"Frazz",u"http://www.gocomics.com/frazz"),
            # (u"Fred Basset",u"http://www.gocomics.com/fredbasset"),
            # (u"Free Range",u"http://www.gocomics.com/freerange"),
            # (u"Freshly Squeezed",u"http://www.gocomics.com/freshlysqueezed"),
            # (u"Frog Applause",u"http://www.gocomics.com/frogapplause"),
            # (u"From the Mo Willems Sketchbook",u"http://www.gocomics.com/from-the-mo-willems-sketchbook"),
            # (u"The Fusco Brothers",u"http://www.gocomics.com/thefuscobrothers"),
            (u"Garfield",u"http://www.gocomics.com/garfield"),
            # (u"Garfield Classics",u"http://www.gocomics.com/garfield-classics"),
            # (u"Garfield Minus Garfield",u"http://www.gocomics.com/garfieldminusgarfield"),
            # (u"Gasoline Alley",u"http://www.gocomics.com/gasolinealley"),
            # (u"Geech",u"http://www.gocomics.com/geech"),
            # (u"Gentle Creatures",u"http://www.gocomics.com/gentle-creatures"),
            # (u"The Gentleman's Armchair",u"http://www.gocomics.com/the-gentlemans-armchair"),
            # (u"Get a Life",u"http://www.gocomics.com/getalife"),
            (u"Get Fuzzy",u"http://www.gocomics.com/getfuzzy"),
            # (u"Gil",u"http://www.gocomics.com/gil"),
            # (u"Gil Thorp",u"http://www.gocomics.com/gilthorp"),
            # (u"Ginger Meggs",u"http://www.gocomics.com/gingermeggs"),
            # (u"Glasbergen Cartoons",u"http://www.gocomics.com/glasbergen-cartoons"),
            # (u"G-Man Webcomics",u"http://www.gocomics.com/g-man-webcomics"),
            # (u"Gnome Syndicate",u"http://www.gocomics.com/gnome-syndicate"),
            # (u"Goats",u"http://www.gocomics.com/goats"),
            # (u"The Fans!",u"http://www.gocomics.com/fan-art"),
            # (u"Bob Gorrell",u"http://www.gocomics.com/bobgorrell"),
            # (u"Graffiti",u"http://www.gocomics.com/graffiti"),
            # (u"Grand Avenue",u"http://www.gocomics.com/grand-avenue"),
            # (u"Gray Matters",u"http://www.gocomics.com/gray-matters"),
            # (u"Green Humour",u"http://www.gocomics.com/green-humour"),
            # (u"The Grizzwells",u"http://www.gocomics.com/thegrizzwells"),
            # (u"Half Full",u"http://www.gocomics.com/half-full"),
            # (u"Ham Shears",u"http://www.gocomics.com/ham-shears"),
            # (u"Walt Handelsman",u"http://www.gocomics.com/walthandelsman"),
            # (u"Phil Hands",u"http://www.gocomics.com/phil-hands"),
            # (u"Health Capsules",u"http://www.gocomics.com/healthcapsules"),
            # (u"Heart of the City",u"http://www.gocomics.com/heartofthecity"),
            (u"Heathcliff",u"http://www.gocomics.com/heathcliff"),
            # (u"Joe Heller",u"http://www.gocomics.com/joe-heller"),
            # (u"Rebecca Hendin",u"http://www.gocomics.com/rebecca-hendin"),
            # (u"Herb and Jamaal",u"http://www.gocomics.com/herbandjamaal"),
            # (u"Herman",u"http://www.gocomics.com/herman"),
            # (u"Hipster Picnic",u"http://www.gocomics.com/hipster-picnic"),
            # (u"Jerry Holbert",u"http://www.gocomics.com/jerryholbert"),
            # (u"Home and Away",u"http://www.gocomics.com/homeandaway"),
            # (u"Hot Comics for Cool People",u"http://www.gocomics.com/hot-comics-for-cool-people"),
            # (u"HUBRIS!",u"http://www.gocomics.com/hubris"),
            # (u"Human Cull",u"http://www.gocomics.com/human-cull"),
            # (u"The Humble Stumble",u"http://www.gocomics.com/humble-stumble"),
            # (u"Hutch Owen",u"http://www.gocomics.com/hutch-owen"),
            # (u"Imagine This",u"http://www.gocomics.com/imaginethis"),
            # (u"In Security",u"http://www.gocomics.com/in-security"),
            # (u"In the Bleachers",u"http://www.gocomics.com/inthebleachers"),
            # (u"In the Sticks",u"http://www.gocomics.com/inthesticks"),
            # (u"Inherit the Mirth",u"http://www.gocomics.com/inherit-the-mirth"),
            # (u"Ink Pen",u"http://www.gocomics.com/inkpen"),
            # (u"Inspector Danger's Crime Quiz",u"http://www.gocomics.com/inspector-dangers-crime-quiz"),
            # (u"Invisible Bread",u"http://www.gocomics.com/invisible-bread"),
            # (u"It's All About You",u"http://www.gocomics.com/itsallaboutyou),
            # (u"Jane's World",u"http://www.gocomics.com/janesworld"),
            # (u"Jen Sorensen",u"http://www.gocomics.com/jen-sorensen"),
            # (u"JetpackJr.",u"http://www.gocomics.com/jetpack-jr"),
            # (u"Jim Benton Cartoons",u"http://www.gocomics.com/jim-benton-cartoons"),
            # (u"Jim's Journal",u"http://www.gocomics.com/jimsjournal"),
            # (u"Joe Vanilla",u"http://www.gocomics.com/joevanilla"),
            # (u"Clay Jones",u"http://www.gocomics.com/clayjones"),
            # (u"JumpStart",u"http://www.gocomics.com/jumpstart"),
            # (u"Just Say Uncle",u"http://www.gocomics.com/just-say-uncle"),
            # (u"The K Chronicles",u"http://www.gocomics.com/thekchronicles"),
            # (u"Steve Kelley",u"http://www.gocomics.com/stevekelley"),
            # (u"Kid Beowulf",u"http://www.gocomics.com/kid-beowulf"),
            # (u"Kid Shay Comics",u"http://www.gocomics.com/kid-shay-comics"),
            # (u"KidSpot",u"http://www.gocomics.com/kidspot"),
            # (u"KidTown",u"http://www.gocomics.com/kidtown"),
            # (u"Kit 'N' Carlyle",u"http://www.gocomics.com/kitncarlyle"),
            # (u"Kitchen Capers",u"http://www.gocomics.com/kitchen-capers"),
            # (u"Kliban",u"http://www.gocomics.com/kliban"),
            # (u"Kliban's Cats",u"http://www.gocomics.com/klibans-cats"),
            # (u"The Knight Life",u"http://www.gocomics.com/theknightlife"),
            # (u"La Cucaracha",u"http://www.gocomics.com/lacucaracha"),
            # (u"Lard's World Peace Tips",u"http://www.gocomics.com/lards-world-peace-tips"),
            # (u"Last Kiss",u"http://www.gocomics.com/lastkiss"),
            # (u"Lay Lines",u"http://www.gocomics.com/lay-lines"),
            # (u"Learn to Speak Cat",u"http://www.gocomics.com/learn-to-speak-cat"),
            # (u"The Lefty Bosco Picture Show",u"http://www.gocomics.com/leftyboscopictureshow"),
            # (u"Legend of Bill",u"http://www.gocomics.com/legendofbill"),
            # (u"Leigh Luna Comics",u"http://www.gocomics.com/leigh-luna-comics"),
            # (u"Mike Lester",u"http://www.gocomics.com/mike-lester"),
            # (u"Liberty Meadows",u"http://www.gocomics.com/libertymeadows"),
            # (u"Li'l Abner",u"http://www.gocomics.com/lil-abner"),
            # (u"Lio",u"http://www.gocomics.com/lio"),
            # (u"Little Dog Lost",u"http://www.gocomics.com/littledoglost"),
            # (u"Little Fried Chicken and Sushi",u"http://www.gocomics.com/little-fried-chicken-and-sushi"),
            # (u"Little Nemo",u"http://www.gocomics.com/little-nemo"),
            # (u"Win- Lose- Drew",u"http://www.gocomics.com/drewlitton"),
            # (u"Lola",u"http://www.gocomics.com/lola"),
            # (u"Looks Good on Paper",u"http://www.gocomics.com/looks-good-on-paper"),
            # (u"Loose Parts",u"http://www.gocomics.com/looseparts"),
            # (u"The Lost Bear",u"http://www.gocomics.com/the-lost-bear"),
            # (u"Lost Side of Suburbia",u"http://www.gocomics.com/lostsideofsuburbia"),
            # (u"Lost Sheep",u"http://www.gocomics.com/lostsheep"),
            # (u"Chan Lowe",u"http://www.gocomics.com/chanlowe"),
            (u"Luann",u"http://www.gocomics.com/luann"),
            # (u"Luann Againn",u"http://www.gocomics.com/luann-againn"),
            # (u"Mike Luckovich",u"http://www.gocomics.com/mikeluckovich"),
            # (u"Lucky Cow",u"http://www.gocomics.com/luckycow"),
            # (u"Lug Nuts",u"http://www.gocomics.com/lug-nuts"),
            # (u"Lukey McGarryƒ??s TLDR",u"http://www.gocomics.com/lukey-mcgarrys-tldr"),
            # (u"Lunarbaboon",u"http://www.gocomics.com/lunarbaboon"),
            # (u"Magic in a Minute",u"http://www.gocomics.com/magicinaminute"),
            # (u"Magnificatz",u"http://www.gocomics.com/magnificatz"),
            # (u"Maintaining",u"http://www.gocomics.com/maintaining"),
            # (u"Making It",u"http://www.gocomics.com/making-it"),
            # (u"Maria's Day",u"http://www.gocomics.com/marias-day"),
            # (u"Gary Markstein",u"http://www.gocomics.com/garymarkstein"),
            (u"Marmaduke",u"http://www.gocomics.com/marmaduke"),
            # (u"The Martian Confederacy",u"http://www.gocomics.com/the-martian-confederacy"),
            # (u"MazeToons Puzzle",u"http://www.gocomics.com/mazetoons-puzzle"),
            # (u"Glenn McCoy",u"http://www.gocomics.com/glennmccoy"),
            # (u"Brian McFadden",u"http://www.gocomics.com/brian-mcfadden"),
            # (u"The Meaning of Lila",u"http://www.gocomics.com/meaningoflila"),
            # (u"Medium Large",u"http://www.gocomics.com/medium-large"),
            # (u"Meg Classics",u"http://www.gocomics.com/meg-classics"),
            # (u"Microcosm",u"http://www.gocomics.com/microcosm"),
            (u"The Middletons",u"http://www.gocomics.com/themiddletons"),
            # (u"Mike du Jour",u"http://www.gocomics.com/mike-du-jour"),
            # (u"Minimum Security",u"http://www.gocomics.com/minimumsecurity"),
            # (u"Moderately Confused",u"http://www.gocomics.com/moderately-confused"),
            # (u"Molebashed",u"http://www.gocomics.com/molebashed"),
            # (u"Molly and the Bear",u"http://www.gocomics.com/mollyandthebear"),
            (u"Momma",u"http://www.gocomics.com/momma"),
            # (u"Mom's Cancer",u"http://www.gocomics.com/moms-cancer"),
            # (u"Monty",u"http://www.gocomics.com/monty"),
            # (u"Jim Morin",u"http://www.gocomics.com/jimmorin"),
            # (u"Motley Classics",u"http://www.gocomics.com/motley-classics"),
            # (u"Mr. Lowe",u"http://www.gocomics.com/mr-lowe"),
            # (u"Mulligan",u"http://www.gocomics.com/mulligan"),
            # (u"Mustard and Boloney",u"http://www.gocomics.com/mustard-and-boloney"),
            # (u"Mutt & Jeff",u"http://www.gocomics.com/muttandjeff"),
            # (u"My Cage: New and Old",u"http://www.gocomics.com/mycage"),
            # (u"MythTickle",u"http://www.gocomics.com/mythtickle"),
            # (u"Nancy",u"http://www.gocomics.com/nancy"),
            # (u"Nancy Classics",u"http://www.gocomics.com/nancy-classics"),
            # (u"Nest Heads",u"http://www.gocomics.com/nestheads"),
            # (u"NEUROTICA",u"http://www.gocomics.com/neurotica"),
            # (u"New Adventures of Queen Victoria",u"http://www.gocomics.com/thenewadventuresofqueenvictoria"),
            # (u"Next Door Neighbors",u"http://www.gocomics.com/next-door-neighbors"),
            # (u"Nick and Zuzu",u"http://www.gocomics.com/nick-and-zuzu),
            (u"Non Sequitur",u"http://www.gocomics.com/nonsequitur"),
            # (u"The Norm 4.0",u"http://www.gocomics.com/the-norm-4-0"),
            # (u"The Norm Classics",u"http://www.gocomics.com/thenorm"),
            # (u"Not Invented Here",u"http://www.gocomics.com/not-invented-here"),
            # (u"Nothing is Not Something",u"http://www.gocomics.com/nothing-is-not-something"),
            # (u"Now Recharging",u"http://www.gocomics.com/now-recharging"),
            # (u"Off the Mark",u"http://www.gocomics.com/offthemark"),
            # (u"Oh Brother!",u"http://www.gocomics.com/oh-brother"),
            # (u"Jack Ohman",u"http://www.gocomics.com/jackohman"),
            # (u"Pat Oliphant",u"http://www.gocomics.com/patoliphant"),
            # (u"Ollie and Quentin",u"http://www.gocomics.com/ollie-and-quentin"),
            # (u"On A Claire Day",u"http://www.gocomics.com/onaclaireday"),
            # (u"One Big Happy",u"http://www.gocomics.com/onebighappy"),
            # (u"Ordinary Bill",u"http://www.gocomics.com/ordinary-bill"),
            # (u"Origins of the Sunday Comics",u"http://www.gocomics.com/origins-of-the-sunday-comics"),
            # (u"The Other Coast",u"http://www.gocomics.com/theothercoast"),
            # (u"The Other End",u"http://www.gocomics.com/the-other-end"),
            # (u"Out of the Gene Pool Re-Runs",u"http://www.gocomics.com/outofthegenepool"),
            # (u"Over the Hedge",u"http://www.gocomics.com/overthehedge"),
            # (u"Overboard",u"http://www.gocomics.com/overboard"),
            # (u"Owlturd",u"http://www.gocomics.com/owlturd"),
            # (u"Ozy and Millie",u"http://www.gocomics.com/ozy-and-millie"),
            # (u"Henry Payne",u"http://www.gocomics.com/henrypayne"),
            # (u"PC and Pixel",u"http://www.gocomics.com/pcandpixel"),
            (u"Peanuts",u"http://www.gocomics.com/peanuts"),
            # (u"Peanuts Begins",u"http://www.gocomics.com/peanuts-begins"),
            # (u"Peanuts Holiday Countdown",u"http://www.gocomics.com/peanuts-holiday-countdown"),
            (u"Pearls Before Swine",u"http://www.gocomics.com/pearlsbeforeswine"),
            # (u"Perry Bible Fellowship",u"http://www.gocomics.com/perry-bible-fellowship"),
            # (u"Joel Pett",u"http://www.gocomics.com/joelpett"),
            # (u"Phoebe and Her Unicorn",u"http://www.gocomics.com/phoebe-and-her-unicorn"),
            # (u"Pibgorn",u"http://www.gocomics.com/pibgorn"),
            # (u"Pibgorn Sketches",u"http://www.gocomics.com/pibgornsketches"),
            # (u"Pickles",u"http://www.gocomics.com/pickles"),
            # (u"Pictures in Boxes",u"http://www.gocomics.com/pictures-in-boxes"),
            # (u"Pie Comic",u"http://www.gocomics.com/pie-comic"),
            # (u"Pinkerton",u"http://www.gocomics.com/pinkerton"),
            # (u"Please Listen to Me",u"http://www.gocomics.com/please-listen-to-me"),
            # (u"Pluggers",u"http://www.gocomics.com/pluggers"),
            (u"Pooch Cafe",u"http://www.gocomics.com/poochcafe"),
            # (u"Poorcraft",u"http://www.gocomics.com/poorcraft"),
            # (u"Poorly Drawn Lines",u"http://www.gocomics.com/poorly-drawn-lines"),
            # (u"Pop Culture Shock Therapy",u"http://www.gocomics.com/pop-culture-shock-therapy"),
            # (u"Poptropica",u"http://www.gocomics.com/poptropica"),
            # (u"Pot-Shots",u"http://www.gocomics.com/pot-shots"),
            # (u"PreTeena",u"http://www.gocomics.com/preteena"),
            # (u"Prickly City",u"http://www.gocomics.com/pricklycity"),
            # (u"Promises-Promises",u"http://www.gocomics.com/promises-promises"),
            # (u"Questionable Quotebook",u"http://www.gocomics.com/questionable-quotebook"),
            # (u"The Quixote Syndrome",u"http://www.gocomics.com/the-quixote-syndrome"),
            # (u"Rabbits Against Magic",u"http://www.gocomics.com/rabbitsagainstmagic"),
            # (u"Raising Duncan",u"http://www.gocomics.com/raising-duncan"),
            # (u"Ted Rall",u"http://www.gocomics.com/ted-rall"),
            # (u"Michael Ramirez",u"http://www.gocomics.com/michaelramirez"),
            # (u"Marshall Ramsey",u"http://www.gocomics.com/marshallramsey"),
            # (u"Randolph Itch 2 a.m.",u"http://www.gocomics.com/randolphitch"),
            # (u"Tom Toles",u"http://www.gocomics.com/randolphitch"),
            # (u"Random Acts of Nancy",u"http://www.gocomics.com/random-acts-of-nancy"),
            # (u"Real Life Adventures",u"http://www.gocomics.com/reallifeadventures"),
            # (u"Reality Check",u"http://www.gocomics.com/realitycheck"),
            # (u"Red and Rover",u"http://www.gocomics.com/redandrover"),
            # (u"Reply All",u"http://www.gocomics.com/replyall"),
            # (u"Reply AllLite",u"http://www.gocomics.com/reply-all-lite"),
            # (u"Richard's Poor Almanac",u"http://www.gocomics.com/richards-poor-almanac"),
            # (u"Rip Haywire",u"http://www.gocomics.com/riphaywire"),
            # (u"Ripley's Believe It or Not",u"http://www.gocomics.com/ripleysbelieveitornot"),
            # (u"Robbie and Bobby",u"http://www.gocomics.com/robbie-and-bobby"),
            # (u"Rob Rogers",u"http://www.gocomics.com/robrogers"),
            (u"Rose is Rose",u"http://www.gocomics.com/roseisrose"),
            # (u"Rubes",u"http://www.gocomics.com/rubes"),
            # (u"Rudy Park",u"http://www.gocomics.com/rudypark"),
            # (u"Sarah's Scribbles",u"http://www.gocomics.com/sarahs-scribbles"),
            # (u"Saturday Morning Breakfast Cereal",u"http://www.gocomics.com/saturday-morning-breakfast-cereal"),
            # (u"Savage Chickens",u"http://www.gocomics.com/savage-chickens"),
            # (u"Scary Gary",u"http://www.gocomics.com/scarygary"),
            # (u"Scenes from a Multiverse",u"http://www.gocomics.com/scenes-from-a-multiverse"),
            # (u"Sheldon",u"http://www.gocomics.com/sheldon"),
            # (u"Drew Sheneman",u"http://www.gocomics.com/drewsheneman"),
            # (u"Shirley and Son Classics",u"http://www.gocomics.com/shirley-and-son-classics"),
            (u"Shoe",u"http://www.gocomics.com/shoe"),
            # (u"Shoecabbage",u"http://www.gocomics.com/shoecabbage"),
            # (u"Shortcuts",u"http://www.gocomics.com/shortcuts"),
            # (u"Shutterbug Follies",u"http://www.gocomics.com/shutterbug-follies"),
            # (u"Sketchshark Comics",u"http://www.gocomics.com/sketchshark-comics"),
            # (u"Sketchy Chics",u"http://www.gocomics.com/sketchy-chics"),
            # (u"Skin Horse",u"http://www.gocomics.com/skinhorse"),
            # (u"Skippy",u"http://www.gocomics.com/skippy"),
            # (u"Small Potatoes",u"http://www.gocomics.com/small-potatoes"),
            # (u"Snow Sez...",u"http://www.gocomics.com/snow-sez"),
            # (u"Snowflakes",u"http://www.gocomics.com/snowflakes"),
            # (u"Soulmates",u"http://www.gocomics.com/soulmates"),
            # (u"Soup to Nutz",u"http://www.gocomics.com/soup-to-nutz"),
            # (u"Speechless",u"http://www.gocomics.com/speechless"),
            # (u"Speed Bump",u"http://www.gocomics.com/speedbump"),
            # (u"Spirit of the Staircase",u"http://www.gocomics.com/spirit-of-the-staircase"),
            # (u"Spot the Frog",u"http://www.gocomics.com/spot-the-frog"),
            # (u"Jeff Stahler",u"http://www.gocomics.com/jeffstahler"),
            # (u"Scott Stantis",u"http://www.gocomics.com/scottstantis"),
            # (u"Starling",u"http://www.gocomics.com/starling"),
            # (u"Starslip",u"http://www.gocomics.com/starslip"),
            # (u"Sticky Comics",u"http://www.gocomics.com/sticky-comics"),
            # (u"Stone Soup",u"http://www.gocomics.com/stonesoup"),
            # (u"Stone Soup Classics",u"http://www.gocomics.com/stone-soup-classics"),
            # (u"Strange Brew",u"http://www.gocomics.com/strangebrew"),
            # (u"Dana Summers",u"http://www.gocomics.com/danasummers"),
            # (u"Sunny Street",u"http://www.gocomics.com/sunny-street"),
            # (u"The Sunshine Club",u"http://www.gocomics.com/the-sunshine-club"),
            # (u"Sunshine State",u"http://www.gocomics.com/sunshine-state"),
            # (u"Sweet and Sour Pork",u"http://www.gocomics.com/sweet-and-sour-pork"),
            # (u"Sylvia",u"http://www.gocomics.com/sylvia"),
            # (u"Paul Szep",u"http://www.gocomics.com/paulszep"),
            # (u"Tank McNamara",u"http://www.gocomics.com/tankmcnamara"),
            # (u"Tarzan",u"http://www.gocomics.com/tarzan"),
            # (u"@Tavicat",u"http://www.gocomics.com/tavicat"),
            # (u"Ten Cats",u"http://www.gocomics.com/ten-cats"),
            # (u"That is Priceless",u"http://www.gocomics.com/that-is-priceless"),
            # (u"That Monkey Tune",u"http://www.gocomics.com/that-monkey-tune"),
            # (u"That New Carl Smell",u"http://www.gocomics.com/that-new-carl-smell"),
            # (u"That's Life",u"http://www.gocomics.com/thats-life"),
            # (u"Thatababy",u"http://www.gocomics.com/thatababy"),
            # (u"Thin Lines",u"http://www.gocomics.com/thinlines"),
            # (u"(th)ink",u"http://www.gocomics.com/think"),
            # (u"Tiny Confessions",u"http://www.gocomics.com/tiny-confessions"),
            # (u"Tiny Sepuku",u"http://www.gocomics.com/tinysepuku),
            # (u"TOBY",u"http://www.gocomics.com/toby"),
            # (u"Today's Dogg",u"http://www.gocomics.com/todays-dogg"),
            # (u"Tom Toles",u"http://www.gocomics.com/tomtoles"),
            # (u"Tom the Dancing Bug",u"http://www.gocomics.com/tomthedancingbug"),
            # (u"Super-Fun-Pak Comix",u"http://www.gocomics.com/super-fun-pak-comix"),
            # (u"Too Much Coffee Man",u"http://www.gocomics.com/toomuchcoffeeman"),
            # (u"Tough Town",u"http://www.gocomics.com/tough-town"),
            # (u"Trivquiz",u"http://www.gocomics.com/trivquiz"),
            # (u"Truth Facts",u"http://www.gocomics.com/truth-facts"),
            # (u"Uncle Art's Funland",u"http://www.gocomics.com/uncleartsfunland"),
            # (u"Understanding Chaos",u"http://www.gocomics.com/understanding-chaos"),
            # (u"Unstrange Phenomena",u"http://www.gocomics.com/unstrange-phenomena"),
            # (u"Up and Out",u"http://www.gocomics.com/up-and-out"),
            # (u"The Upside Down World of Gustave Verbeek",u"http://www.gocomics.com/upside-down-world-of-gustave-verbeek"),
            # (u"U.S. Acres",u"http://www.gocomics.com/us-acres"),
            # (u"Gary Varvel",u"http://www.gocomics.com/garyvarvel"),
            # (u"ViewsAfrica",u"http://www.gocomics.com/viewsafrica"),
            # (u"ViewsAmerica",u"http://www.gocomics.com/viewsamerica"),
            # (u"ViewsAsia",u"http://www.gocomics.com/viewsasia"),
            # (u"ViewsBusiness",u"http://www.gocomics.com/viewsbusiness"),
            # (u"ViewsEurope",u"http://www.gocomics.com/viewseurope"),
            # (u"ViewsLatinAmerica",u"http://www.gocomics.com/viewslatinamerica"),
            # (u"ViewsMidEast",u"http://www.gocomics.com/viewsmideast"),
            # (u"Views of the World",u"http://www.gocomics.com/viewsoftheworld"),
            # (u"Viivi & Wagner",u"http://www.gocomics.com/viivi-and-wagner"),
            # (u"Faces of the News by Kerry Waghorn",u"http://www.gocomics.com/facesinthenews"),
            # (u"Wallace the Brave",u"http://www.gocomics.com/wallace-the-brave"),
            # (u"The Wandering Melon",u"http://www.gocomics.com/the-wandering-melon"),
            # (u"Warped",u"http://www.gocomics.com/warped"),
            # (u"Dan Wasserman",u"http://www.gocomics.com/danwasserman"),
            # (u"Watch Your Head",u"http://www.gocomics.com/watchyourhead"),
            # (u"WaynoVision",u"http://www.gocomics.com/waynovision"),
            # (u"Wee Pals",u"http://www.gocomics.com/weepals"),
            # (u"We the Robots",u"http://www.gocomics.com/we-the-robots"),
            # (u"Wicked Crispy",u"http://www.gocomics.com/wicked-crispy"),
            # (u"Widdershins",u"http://www.gocomics.com/widdershins"),
            # (u"Wide Open",u"http://www.gocomics.com/wide-open"),
            # (u"Signe Wilkinson",u"http://www.gocomics.com/signewilkinson"),
            # (u"Winston",u"http://www.gocomics.com/winston"),
            # (u"Wit of the World",u"http://www.gocomics.com/witoftheworld"),
            # (u"CartoonArts International",u"http://www.gocomics.com/witoftheworld"),
            (u"Wizard of Id",u"http://www.gocomics.com/wizardofid"),
            # (u"Wizard of Id Classics",u"http://www.gocomics.com/wizard-of-id-classics"),
            # (u"Wondermark",u"http://www.gocomics.com/wondermark"),
            # (u"Working Daze",u"http://www.gocomics.com/working-daze"),
            # (u"Working It Out",u"http://www.gocomics.com/workingitout"),
            # (u"World of Wonder",u"http://www.gocomics.com/world-of-wonder"),
            # (u"The Worried Well",u"http://www.gocomics.com/the-worried-well"),
            # (u"The Worst Thing I've Ever Done",u"http://www.gocomics.com/the-worst-thing-ive-ever-done"),
            # (u"Wrong Hands",u"http://www.gocomics.com/wrong-hands"),
            # (u"W.T. Duck",u"http://www.gocomics.com/wtduck"),
            # (u"Matt Wuerker",u"http://www.gocomics.com/mattwuerker"),
            # (u"WuMo",u"http://www.gocomics.com/wumo"),
            # (u"Wyatt",u"http://www.gocomics.com/wyatt"),
            # (u"Yenny Lopez",u"http://www.gocomics.com/yenny-lopez"),
            # (u"Zack Hill",u"http://www.gocomics.com/zackhill"),
            # (u"Zen Pencils",u"http://www.gocomics.com/zen-pencils"),
            # (u"Ziggy",u"http://www.gocomics.com/ziggy"),
            # (u"2 Cows and a Chicken",u"http://www.gocomics.com/2cowsandachicken"),
            # (u"9 to 5",u"http://www.gocomics.com/9to5"),
            # (u"9 Chickweed Lane",u"http://www.gocomics.com/9chickweedlane"),
        ]):  # }}}
            self.log('Working on: ', title, url)
            articles = self.make_links(title, url)
            if articles:
                feeds.append((title, articles))
            if self.test and i > 0:
                break
        return feeds

    def cleanup(self):
        try:
            shutil.rmtree(self.gocomics_dir)
        except EnvironmentError:
            pass

    def parse_comic_page(self, content):
        a = content.find('a', itemprop='image')
        if a is None:
            raise StopIteration()
        img = a.find('img')
        if img is None:
            raise StopIteration()
        img['srcset'] = ''
        title_parts = a['title'].split()
        title = ' '.join(title_parts[:-2])
        return {'h1':title, 'date':title_parts[-1], 'img':str(img)}

    def render_comic_page(self, data, num, title):
        fname = ascii_filename('%03d_%s' % (num, title)).replace(' ', '_')
        path = os.path.join(self.gocomics_dir, fname)
        html = '<html><body>{h1}<h2>{date}</h2><div>{img}</div></body></html>'.format(**data)
        with open(path, 'wb') as f:
            f.write(html.encode('utf-8'))
        return {'title':'Page %d of %s' % ((num + 1), title), 'url': ('file:' if iswindows else 'file://') + path.replace(os.sep, '/')}

    def make_links(self, title, url):
        soup = self.index_to_soup(url)
        div = soup.find(attrs={'class': lambda x: x and 'gc-deck' in x.split()})
        a = div.find('a', href=True)
        url = absolutize(a['href'])
        current_articles = []
        if self.test:
            self.num_comics_to_get = 2
        num = self.num_comics_to_get
        while num > 0:
            num -= 1
            page_soup = self.index_to_soup(url)
            if not page_soup:
                break
            content = page_soup.find(attrs={'class': lambda x: x and 'comic__image' in x.split()})
            if content is None:
                break
            current_articles.append(self.parse_comic_page(content))
            a = content.parent.find('a', attrs={'href':True, 'class':lambda x: x and 'fa-caret-left' in x.split()})
            if a is None:
                break
            url = a['href']
            if url.startswith('/'):
                url = 'http://www.gocomics.com' + url
        return [self.render_comic_page(ar, i, title) for i, ar in enumerate(reversed(current_articles))]
PK�X:݂е�goal.png�PNG


IHDR(-S�PLTE ,	--	,+,,+) -���	*!, *	//,��� +
.���,*
+.8.:���	 (!.*%<D)-:!*-8���,:2CM\js+,:,9#-':H���.;������,7+8���.- /
,*	!+
)* ,�a��IDATx�
H�+P�	j�kۺ������s3�2@�{���	f��������G)H��1B`9�gC����A����oCW�'m�v�M�{С�o/7��ӳ���`���fGB��>�'��Hx$�tO�p(V	��E5��^�xSQ�L�+��^����_��a�&`�c�T����Z�
���1IEND�B`�PK�X%8����goal.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1325677767(BasicNewsRecipe):
    title = u'Goal'
    oldest_article = 1
    language = 'it'
    max_articles_per_feed = 100
    auto_cleanup = True
    remove_tags_after = [dict(id='article_content')]
    feeds = [(u'Goal', u'http://www.goal.com/it/feeds/news?fmt=rss')]
    __author__ = 'faber1971'
    description = 'Sports news from Italy'
PK�X�RRgofin_pl.png�PNG


IHDR(-SAPLTE��������������������������������������������������������	�
��������������//�+2�'/���������������� !����\_�]_�[b�Xb����������������������������������Y\�HQ�HM�9=�5=�0:�18����|��}~�y��ko�ip�hl�ci�]b�������(.������'-�$+�$)�#(�������������%�#�!���
��������tRNS@��f�IDATx^e�ӒF��ƶ=k۶m�`+�{35��c8������C�E(�k�]������.�
��V ��迵���|iLX�O�Btӓ^"���f�T�jx>#�����ˎWdž�G��pZ����U11�P�M-�� )�ޯ��{�,Ax��|�h��V`=�L��Ό�~K�ξ}�IEND�B`�PK�Xn>����gofin_pl.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com>'

'''
gofin.pl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class gofin(BasicNewsRecipe):
    title = u'Gofin'
    __author__ = 'teepel <teepel44@gmail.com>'
    language = 'pl'
    description = u'Portal Podatkowo-Księgowy'
    INDEX = 'http://gofin.pl'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    simultaneous_downloads = 5
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        (u'Podatki', u'http://www.rss.gofin.pl/podatki.xml'),
        (u'Prawo Pracy', u'http://www.rss.gofin.pl/prawopracy.xml'),
        (u'Rachunkowo\u015b\u0107', u'http://www.rss.gofin.pl/rachunkowosc.xml'),
        (u'Sk\u0142adki, zasi\u0142ki, emerytury', u'http://www.rss.gofin.pl/zasilki.xml'),
        (u'Firma', u'http://www.rss.gofin.pl/firma.xml'),
        (u'Prawnik radzi', u'http://www.rss.gofin.pl/prawnikradzi.xml')]
PK�X�B<�{{golem_de.png�PNG


IHDR  D����PLTE���011PQQ`aapqq���fgg���@AA !!��������А����𯯯7����Ϗ��������������oppJKK*75���b�:���	WXX���6W_W�U^�^���=>>���9X2
���=��@d;3.L��&Qr/Q�zS�v&4&'<!(;(L>Y��Zik[\\(dr)5*67&'d�Qe�L EE KQ#SXAWEf�L&1H$���cdd@qU*L;.@?EoǛ?F1I"1��Y��LMM$3���$?/:5c�:���25*?"
qrrstt&��U02$ Kq=K��Y�jtuu|}}|��~3Q/3����V��l��j4;<2&??���2"��Z9X4:qc  0=��>\.3!;0?9%#A�����A��CqOGX8G�vH��&+�m�tRNS@����I/vIDATx�ՓӢ+1�8k�6�m۶m��'��{gM�X,���,Vޛ�d��u ��@��i�n$V�,
]S%�*8����s��占�;�̙͂����8
�=|�`�
庀���ݎ�n�[F���u�(K52J��B��q����M��U&z3�w3�P�Wo$'�"�օ'���+P������w���T�0�h�O**�ON^��~�j�X���un^��X�6H��“��̷�[�jc���+^�`�mA@~^(>�Ny�c3�/͘Ϩ�C	���B�S4|#�j��5��k�����345r��<��إ�᳦b����PU�A��D�� v�����BN���
IEND�B`�PK�X�;��golem_de.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1303841067(BasicNewsRecipe):

    title = u'Golem.de'
    __author__ = 'schuster'

    oldest_article = 7
    max_articles_per_feed = 10
    no_stylesheets = True
    use_embedded_content = False
    language = 'de'
    cover_url = 'http://www.e-energy.de/images/logo_golem.jpg'
    masthead_url = 'http://www.golem.de/staticrl/images/logo.png'
    extra_css = '''
                    h2{font-family:Arial,Helvetica,sans-serif; font-size: x-small;}
                    h1{ font-family:Arial,Helvetica,sans-serif;  font-size:x-large; font-weight:bold;}

                '''
    remove_javascript = True
    remove_tags_befor = [
        dict(name='header', attrs={'class': 'cluster-header'})]
    remove_tags_after = [dict(name='p', attrs={'class': 'meta'})]
    remove_tags = [dict(rel='nofollow'),
                   dict(name='header', attrs={'id': 'header'}),
                   dict(name='div', attrs={'class': 'dh1'}),
                   dict(name='label', attrs={'class': 'implied'}),
                   dict(name='section', attrs={'id': 'comments'}),
                   dict(name='li', attrs={'class': 'gg_prebackcounterItem'}),
                   dict(name='li', attrs={
                       'class': 'gg_prebackcounterItem gg_embeddedIndexCounter'}),
                   dict(name='img', attrs={
                       'class': 'gg_embeddedIconRight gg_embeddedIconFS gg_cursorpointer'}),
                   dict(name='div', attrs={'target': '_blank'})
                   ]

    def get_browser(self, *args, **kwargs):
        from calibre import browser
        kwargs['user_agent'] = 'mozilla'
        return browser(*args, **kwargs)

    def get_article_url(self, article):
        return article.get('id', article.get('guid', None))

    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

    feeds = [(u'Audio/Video', u'http://rss.golem.de/rss.php?tp=av&feed=RSS2.0'),
             (u'Foto', u'http://rss.golem.de/rss.php?tp=foto&feed=RSS2.0'),
             (u'Games', u'http://rss.golem.de/rss.php?tp=games&feed=RSS2.0'),
             (u'Handy', u'http://rss.golem.de/rss.php?tp=handy&feed=RSS2.0'),
             (u'Internet', u'http://rss.golem.de/rss.php?tp=inet&feed=RSS2.0'),
             (u'Mobile', u'http://rss.golem.de/rss.php?tp=mc&feed=RSS2.0'),
             (u'OSS', u'http://rss.golem.de/rss.php?tp=oss&feed=RSS2.0'),
             (u'Politik/Recht', u'http://rss.golem.de/rss.php?tp=pol&feed=RSS2.0'),
             (u'Security', u'http://rss.golem.de/rss.php?tp=sec&feed=RSS2.0'),
             (u'Desktop-Applikationen',
              u'http://rss.golem.de/rss.php?tp=apps&feed=RSS2.0'),
             (u'Software-Entwicklung',
              u'http://rss.golem.de/rss.php?tp=dev&feed=RSS2.0'),
             (u'Wirtschaft', u'http://rss.golem.de/rss.php?tp=wirtschaft&feed=RSS2.0'),
             (u'Hardware', u'http://rss.golem.de/rss.php?r=hw&feed=RSS2.0'),
             (u'Software', u'http://rss.golem.de/rss.php?r=sw&feed=RSS2.0'),
             (u'Networld', u'http://rss.golem.de/rss.php?r=nw&feed=RSS2.0'),
             (u'Entertainment', u'http://rss.golem.de/rss.php?r=et&feed=RSS2.0'),
             (u'TK', u'http://rss.golem.de/rss.php?r=tk&feed=RSS2.0'),
             (u'Wirtschaft', u'http://rss.golem.de/rss.php?r=wi&feed=RSS2.0'),
             (u'E-Commerce', u'http://rss.golem.de/rss.php?r=ec&feed=RSS2.0')

             ]
PK�X�����good_house_keeping.png�PNG


IHDR  ��tRNSn��	pHYsOOc���xIDATHǵV]hU>O�҇�����`Q�@@Z��*�J�y�d��nv7"�4-���H��6lZ��4B��XDc�66��V�5jZ���ܹ��3w���q3I
��p�LΝ�}��{��4%x�hS�v�J��R��9�b;@j1�Gs߲�}����\�+�@U94��"�4��P֤̝��@�׍,m���ߡ��� `%z#��Rh��� bpBZ�:@p��b�5-�Bi��`Zz�� 4@)�S�N�J��iY��
��5�R���Ҽi��'_z�$���G�^���UI+�P��%-��RYǘ]��p�q�7�5<ß�C,��	cK���<>��,����^�d<a��3���K�"�l��ެ�����#�f96"9(�?���R	�" �V�.�����:=�b��}~N���v�����̼#\��r|T�f�xD�hA#��K�r�՗/U��2��̎+^�n}2��e�O���{�g�HA�b��S�$4�f�p��u�
�z8V��<�h� �H��oz�\A�T>�.�H��Z�J�uj�52D>���Ez]m��ʱ� ���4 �����
&e<x��������]y��1�Ґ������l;*v�Źr�p91*��S�EE\K��w�L��6���k9zZ���6{�
���XvU�q)�sz7t�1��c��6�d'jV�]g���E76�ɪrߓ��v�#g}�5v�+X�W[���^>a�w�1=l����Tr����_���q����ZW�=*��pT���:s�YE/pXC���_�M�I$���%%�5�븄@�3{�;e<�o<p�?��ubگ�JnJ�7eQ�U�ٌ��F�ݝzd�2�I�S�w.pt���²/��6v1-.˔[�BY|�&���F�������`
Y�Y�*;�%Y����S�	��:�-}fߗH���o1_DJ��Bi��ˆ�>��!��ŭ���J~Z65���<:%/�x��ABu���b��䌛@��^�gPx0�x�ͼ��'Y}7�R_�-��R��@���K���w���D��.�W���}��嚬�n�J/TWY��+3Oϯ說Ɩ�u[�}�rGǑ�G����A�v����6�;6.�.��IEND�B`�PK�X��>���good_house_keeping.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1305547242(BasicNewsRecipe):
    title = u'Good House Keeping'
    language = 'en'
    __author__ = 'Anonymous'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True

    def print_version(self, url):
        if '/tips-for-making-desserts?' in url:
            return None
        segments = url.split('/')
        segments[-1] = segments[-1].split('?')[0]
        segments[-1] += '?page=all'
        printURL = '/'.join(segments[0:3]) + '/print-this/' + segments[-1]
        return printURL

    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

    feeds = [
        (u'Food and Recipes', u'http://www.goodhousekeeping.com/rss/recipes/'),
        (u'Home and Organizing', u'http://www.goodhousekeeping.com/rss/home/'),
        (u'Diet and Health', u'http://www.goodhousekeeping.com/rss/health/'),
        (u'Beauty and Anti-Aging', u'http://www.goodhousekeeping.com/rss/beauty/'),
        (u'Family and Relationships', u'http://www.goodhousekeeping.com/rss/family/'),
        (u'Holidays', u'http://www.goodhousekeeping.com/rss/holidays/'),
        (u'In the Test Kitchen', 'http://www.goodhousekeeping.com/rss/test-kitchen-blog/'),
    ]
PK�X�"�good_to_know.png�PNG


IHDR�a�IDATx�dR�\[<�Ƕm�N!�1�q!v��m۶mk�wm{;g��1ݧ�gX�f�}�9&\ɥ������U��'��2=�ꂊ'�9y��׊B	����	-�זڰ@�Gf࠴��f[샱�~�o�:�<M���j�շ�t0Θ��N��_P��4ih���o�hG��q��n�}��� T��I�%a�k�ܚ��%�6�<��W'�w�R`h�����CB��$�O��$ΉWr3]խ=�d���Nľ8���R𓭁�I��ϫ`�t���?�S�;�4��U�'�G����m��"�wC�=�(_��j����L�_a�r}m�G��_��(YC��?�)3�)]��H|�O�JEb�m�M�U�m֩)�!�Y*���6$�`�5��l����o���!�Ɗ�w��_�H@,^Y����<([���0�·��E��w��[�R��2B�<��C_o�6����7�����! ,��?������ǁ� K �D�-�	�[:QW��U�ڏه���'k��A콍��Z����`u�e�i��t�)�N��������k�`�f{�i�q+|iu�‡�i������ˠ3p̸
�ܻ4�'�M��#,K��LWa3���#���[y�) hKo��2=3	x�V�Nn�;O��T��? r�3�e/ֱs�5�KS�r�]%W��M�Z��kX�Y-���O(7��IEND�B`�PK�X��j���good_to_know.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1305547242(BasicNewsRecipe):
    title = u'Good to Know (uk)'
    oldest_article = 14
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    __author__ = 'Anonymous'
    language = 'en_GB'
    remove_tags = [
        dict(name='div', attrs={'class': ['articles_footer', 'printoptions']})]

    def print_version(self, url):
        return url + '/print/1'

    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

    feeds = [	(u'Family Conception Advice', u'http://www.goodtoknow.co.uk/feeds/family.rss'),
              (u'Family Health Advice', u'http://www.goodtoknow.co.uk/feeds/health.rss'),
              (u'Diet Advice', u'http://www.goodtoknow.co.uk/feeds/diet.rss'),
              (u'Food Advice', u'http://www.goodtoknow.co.uk/feeds/food.rss'),
              (u'Sex Advice', u'http://www.goodtoknow.co.uk/feeds/sex.rss'),
              (u'Easy Exercise', u'http://www.goodtoknow.co.uk/feeds/easyexercise.rss'),
              (u'Recipes', u'http://www.goodtoknow.co.uk/feeds/recipes.rss'),
              (u'Food Quick-tips', u'http://www.goodtoknow.co.uk/feeds/foodquicktips.rss'),
              ]
PK�X������google_news.png�PNG


IHDR  szz��IDATx^��k�\g��{�s河�q77�m1�i�o���P��b����EĴ~P�KRZo��_�@Ai4��Hom$���BI���Шk����lfvw��>J����-�g��<��y��a�2|R�?:��׎�@�XP���CA�l���o��G�Ӄ�����-f�S��/�|%i�����ΔBM@�A5��|	a��:P 
�m��Ev�6ٶq�F<�֒�o|�L��F�Lhh�.��������]������?������dZ@$����������
ol�py2�w��U�h_B�G�A�p��ٝ���P�	x��p9��z�����< �u�IOejdf����H�<�‹%��{uk� 6L��P��_�F6�"�Z�U�P��Uؘ�u�7Ҵ���� �z4D��͟@~����Ҁ��
�8��#O�C�+|r�=!7���R�3�c�;�.@`����r.�>q��S�b�ʽ�ni����pR�#"����@PP�PD�
8^�(>�
G,6akɄZ�JX��b@euq��b V�bnj�B�a�[ְ���V�G܊�
-�@��6�e�.Ua9@�A��4@��jW��; [�������?V��D��.G5�W�)Ͻ�="Խ��n�F+B�m��~E旔��X@ľ���
�U��U޽�c@�����g���	fW��ޱ9bY����a�8r-�t�ku7o�?,̧6��=�pȀ�џZ���Q�������s)//�w�;9��1{�u1<{a�M�J��G�Fn��}%���ݱmSQ���79�|�퍈U�gW����Z�\jF=T"��E�+�MnC�!P��=����P@��>�ׯ-�C���ЅG���VG^�x��K9��B�<0�(^x5��o�o�P��
�5Xh+c^�Z
��Ө	�m4�������0L�	K�w
��f(���A���.-1>�Tٷ�N��h-H�9ۥ����L`,�g
��p�B�gT8��
w���=���S��|l���>���uW�w�t�+Z\TmMlI`s,L$=�/5/_Z潷՘~W̕/;~}���rl���w'��ι�m#�f�y fj�#����֎��AM�zw��L��C���vNE|��5zy�D������ر%bi�|��]���g� 
�"n�~�Sh�j�p��G���O-Z=��1;��g�o�zހ�|igL'[���y�SO��&�&�d)j�-.43a�� 0�kB�L!�\�D
P3��g��(���=��tB��a��Ō�X͉%�;��&RPG�����Să0{r1��
Z����g���0$�`���ɳ�wOf�D���IEND�B`�PK�X�����
�
google_news.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile
import json

# a serarch topic, filled into the string below. You can change that to anything google news should be searched for...
terms_to_search_for = (
    'computer',
    'books',
)


class google_news_de(BasicNewsRecipe):
    # Title of the Recipe - this is a sample
    title = 'Google News'
    cover_url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Google_News_icon.svg/500px-Google_News_icon.svg.png'
    # Author
    __author__ = 'Volker Heggemann, VoHe, unkn0wn'
    # oldest article to download (in days) 									---- can be edit by user
    oldest_article = 1.25
    # describes itself, 						 							---- can be edit by user
    max_articles_per_feed = 200
    # speed up the download on fast computers be careful (I test max.20)
    # ---- can be edit by user
    simultaneous_downloads = 10
    # description, some Reader show this in titlepage
    description = u'Google News filter by your own recipe. Please read it in calibre software!'
    # What is the content of?
    category = u'NEWS'
    # describes itself, 						 							---- can be edit by user
    use_embedded_content = False
    remove_javascript = True
    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True

    # remove the rubbish (in ebook)
    auto_cleanup = True
    
    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/', 'podcast-'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Found link: ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    # now the content description and URL follows
    # feel free to add, wipe out what you need	 							---- can be edit by user
    #
    def get_feeds(self):
        url = "https://geolocation-db.com/json"
        data = self.index_to_soup(url, raw=True)
        data = json.loads(data)
        country_code = str(data['country_code']).lower()  # for me this is de
        city = data['city']
        self.feeds = [
            ('Google news Topnews for ' + country_code,
             'https://news.google.com/news?pz=1&cf=all&ned=' + country_code +
             '&hl=' + country_code + '&output=rss'),
        ]
        if city:
            location = '{},{}'.format(city, country_code)
            self.feeds.append(
                ('Google news for ' + location, 'https://news.google.' +
                country_code + '/news/rss/headlines/section/geo/' + location),
            )
        for searchfor in terms_to_search_for:
            self.feeds.append(
                ('Google news interested in ' + searchfor,
                 'https://news.google.com/news?cf=all&hl=' + country_code +
                 '+&pz=1&ned=' + country_code + '&q=' + searchfor + '&output=rss'))
        return BasicNewsRecipe.get_feeds(self)
PK�X^�K�WWgooglemobileblog.png�PNG


IHDR  D���
PLTE����������������������������������������������������������������������������������������������������������������������������������������������������C5��4�SB��ҥ7�VT������UH�D6����������\�u`��c��d�{8�V�ұ<�P�ׯ�XL���\P��.�eY�fZ�K>�E7F�bT�n�F85�`>�[��>�\>��5�TF�c������F��GI�e��}�߆�߈�������A��B��7�we�}g�~l���L?�SFw��{Ə��3�Ο�ǂ�I4�J=�la�rh�tj���w �v�x6�TL�g�ر�����������m��������������	��������������������!���������������ڷ�۸�ݼ��!��X��Y������¹�Ŀ�������������������������z1tRNS	

"#$%&'/02VWYZ������������������������� ��y�IDATx�}���`�^��|���ٶm۶�g���*�Ij��6��t9��t:�uv�P�fw�����*lYXdz�ɤ)�<�2�E��x��Т�{��M�ը��Òn�Ԉ�h �R��'��y$����vG��M��O�L�\����\~����6ĭ�wDb��Bx2�
tN��$�k;��-�/^M]��8)IC�P@9l�囇�;y��e��o��՜�Ԝ/”����'��*�0(���w�	/�/���0�9LƩ�X�	`�,���&T6^��	�����`&W8>��j)l�	��S�E�*"��%
;�
��I�9>p���3>)�ƒ�^�M^��ئ������S,/�&ME��2Ť*�����0��g���`�:ҵ��N߽nJ�ʝ}?!�-dh�#���L�{2�Hw��U�3C�QO��;�p*��۫��%�n({JIEND�B`�PK�X�<m2ZZgooglemobileblog.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1318572445(BasicNewsRecipe):
    title = u'Google Mobile Blog'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Google Mobile Blog', u'http://googlemobile.blogspot.com/atom.xml')]
PK�X�{==	gorky.png�PNG


IHDR  D����PLTE";'=���"=';���������������'@������+@���'2D���+@�������".D��������'=DLY.8H���������_en"2D=FT+8H'.B��������������+=".B�����������������'@��������ѝ�����\cn��������䙝�NW`����������������д��]cm��������������鑗����޶��=DT������NUb@JW���������8BP������{��ms{�����������������w}�mx������pw����tx���������������ܪ�����������'2F�����ks|��������򀄌��՜�������������ns|�����ⶺ����jrzkp{���t~�������������'B���u|����������.@+D���������������kr{+=mpz���Ï��JUf+BJUe����������6r�p�IDATx�l�s-1�?�k���g۶m۶m�>%�^�a�f7����2�yKlܢ3'���ƒ�J͝4�P\p���� lh���`�~�"���R]kCP�ѥZ9��l�"T&{g�����?VT�Ņ��_`d,*��јj����:�z���@�j,��ŏD��@s�G�/0�����N#����7�f�>�<��|��HH�=.^"%-]�q��UiX��^Cd('p]f��9�	��M=��գp�6�A؎�u�N�|�.x�,��C�('Fz��
h��Ȝ����m��e(��8���O�,�� �#�h��~����s�p���K�K���+���`�F�o���V
C}����?���J@��#Qr���G�*<ie�n�$V�g!���s�DL���ר_����چe�-����k)��
���<��Tبޖd����^-�R؈"�����x�gw�4:;�B��l��E�y�,]�|\�AE����[IEND�B`�PK�X�Z�-	-	gorky.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Gorky(BasicNewsRecipe):
    title          		  = '\u0413\u043E\u0440\u044C\u043A\u0438\u0439'
    __author__            = 'bugmen00t'
    description           = '\u041D\u0435\u043A\u043E\u043C\u043C\u0435\u0440\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u0440\u043E\u0435\u043A\u0442 \u043E \u043A\u043D\u0438\u0433\u0430\u0445 \u0438 \u0447\u0442\u0435\u043D\u0438\u0438.'  # noqa
    publisher             = '\u0410\u041D\u041E "\u0426\u0435\u043D\u0442\u0440 \u043F\u043E \u0441\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044E \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044F \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u044B \u0447\u0442\u0435\u043D\u0438\u044F \u0438 \u043A\u043D\u0438\u0433\u043E\u0438\u0437\u0434\u0430\u043D\u0438\u044F \u00AB\u0413\u043E\u0440\u044C\u043A\u0438\u0439 \u041C\u0435\u0434\u0438\u0430\u00BB"'  # noqa
    category              = 'blog'
    cover_url = u'https://gorky.media/wp-content/uploads/2016/09/gorky.png'
    language              = 'ru'
    no_stylesheets        = False
    remove_javascript = False
    auto_cleanup   = False
    oldest_article = 30
    max_articles_per_feed = 30

    remove_tags_before = dict(name='div', attrs={'id': 'td-outer-wrap'})

    remove_tags_after = dict(name='footer')

    remove_tags =   [
        dict(name='footer'),
        dict(name='nav', attrs={'class': 'navbar'}),
        dict(name='div', attrs={'class': 'hide'}),
        dict(name='div', attrs={'class': 'nav-new'}),
        dict(name='div', attrs={'class': 'top-panel '}),
        dict(name='div', attrs={'class': 'panel-nav'}),
        dict(name='div', attrs={'class': 'panel-nav _hide'}),
        dict(name='ul', attrs={'class': 'top-panel__bottom buttons-list _share'}),
        dict(name='ul', attrs={'class': 'buttons-list _share d_lg-none'})
        ]

    feeds = [
        ('\u0420\u0435\u0446\u0435\u043D\u0437\u0438\u0438', 'https://gorky.media/reviews/feed/'),
        ('\u0424\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u044B', 'https://gorky.media/fragments/feed/'),
        ('\u041A\u043E\u043D\u0442\u0435\u043A\u0441\u0442', 'https://gorky.media/context/feed/'),
        ('\u041F\u043E\u0434\u0431\u043E\u0440\u043A\u0438', 'https://gorky.media/books-collection/feed/')
    ]
PK�X������
gosc_full.png�PNG


IHDR��h6�IDATxڍ�!H�Q��(��AƂ�������,�dd��A�A�A�a���(�aY�a�� ��X���c�)<�{����FJ6vz�v�L�`+#�w%��G{	��w��YfaY79 F|�aiD^I:���Q^o�zY����BZ��벞e-�@�i:�_�zQ�ӂ�X�6��b諒�����Ӽ����}gR9��#��5def��zW��,h�c��!j��H,��G�����B,�4���Z�כZoB"��h���R��e�AdJf�(���gW�3�k���
���o�3���C�P����Yj0q�?{C�9��դհ�ֵ]=�hF��r[�q��k�Xt�+["�~(��Ünge-	MJ�u��,YNg���F�>��x�;.|-�(@`'p��+P���z�9�J�8�|�(Yt��t���/Q��8y.ZIEND�B`�PK�X6O���gosc_full.recipe# -*- coding: utf-8 -*-
from __future__ import unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2011, Piotr Kontek, piotr.kontek@gmail.com \
                 2013-2018, Tomasz Długosz, tomek3d@gmail.com'

from calibre.web.feeds.news import BasicNewsRecipe
import re
import time
from lxml import html


class GN(BasicNewsRecipe):
    __author__ = 'Piotr Kontek, Tomasz Długosz'
    title = u'Gość Niedzielny - pełny numer'
    publisher = 'Wydawnictwo Kurii Metropolitalnej w Katowicach'
    description = 'Ogólnopolski tygodnik katolicki - pełny numer sprzed 4 tygodni'
    encoding = 'utf-8'
    no_stylesheets = True
    language = 'pl'
    remove_javascript = True
    ignore_duplicate_articles = {'url'}
    masthead_url = 'http://gosc.pl/static/images/base/logotypes/100x68/gosc-niedzielny.png'

    def find_last_issue(self):
        raw = self.index_to_soup(
            'http://gosc.pl/wyszukaj/wydania/3.Gosc-Niedzielny/', raw=True)
        doc = html.fromstring(raw)
        page = doc.xpath(
            '//div[@class="search-result release-result"]/div[1]/div[1]/a/@href')

        if time.strftime("%w") in ['3', '4']:
            return page[5]
        else:
            return page[4]

    def parse_index(self):
        self.last_issue = self.find_last_issue()
        soup = self.index_to_soup('http://gosc.pl' + self.last_issue)
        self.cover_url = 'http://www.gosc.pl' + \
            soup.find('div', attrs={'class': 'fl-w100 release-wp'}
                      ).findAll('a')[-4].contents[0]['src']
        feeds = []
        # editorial:
        a = soup.find('div', attrs={'class': 'release-wp-b'})
        art = a.find('a')
        articles = [
            {'title': self.tag_to_string(art),
             'url': 'http://www.gosc.pl' + art['href'],
             'description': self.tag_to_string(a.find('p', attrs={'class': 'b lead'}))
             }]
        feeds.append((u'Na dobry początek', articles))
        # columns:
        for addr in soup.findAll('a', attrs={'href': re.compile('kategoria')}):
            if not addr.span:
                main_block = self.index_to_soup(
                    'http://www.gosc.pl' + addr['href'])
                articles = list(self.find_articles(main_block))
                if len(articles) > 0:
                    section = addr.contents[0]
                    feeds.append((section, articles))
        # not assigned content:
        page = 1
        not_assigned = []
        while True:
            soup = self.index_to_soup(
                'http://gosc.pl' + self.last_issue.replace('przeglad', 'wszystko') + '/' + str(page))
            articles = list(self.find_articles(soup))
            not_assigned.extend(articles)
            page += 1
            pages = soup.find('span', attrs={'class': 'pgr_nrs'})
            if str(page) not in [self.tag_to_string(x) for x in pages.findAll('a')]:
                break

        feeds.append((u'Nieprzypisane', not_assigned))
        return feeds

    def find_articles(self, main_block):
        for a in main_block.findAll('div', attrs={'class': ['infoBox']}):
            art = a.find('a')
            yield {
                'title': self.tag_to_string(art),
                'url': 'http://www.gosc.pl' + art['href'].split('.')[0],
                'date': self.tag_to_string(a.find('b', attrs={'class': 'time'})).replace('DODANE', ' '),
                'description': self.tag_to_string(a.find('div', attrs={'class': 'txt'}))
            }

    def append_page(self, soup, appendtag):
        chpage = appendtag.find(attrs={'class': 'pgr_nrs'})
        if chpage:
            for page in chpage.findAll('a'):
                soup2 = self.index_to_soup('http://gosc.pl' + page['href'])
                pagetext = soup2.find(attrs={'class': 'intextAd'})
                pos = len(appendtag.contents)
                appendtag.insert(pos, pagetext)

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        r = soup.find(attrs={'class': 'lightbox'})
        if r:
            r.contents[0]['src'] = r['href']
        return soup

    def postprocess_html(self, soup, first_fetch):
        for r in soup.findAll(attrs={'class': 'pgr'}):
            r.extract()
        for r in soup.findAll(attrs={'class': ['di_dr', 'doc_image']}):
            del r['style']
        '''
        for r in soup.findAll(attrs={'class': 'cm-i-a'}):
            r.replaceWith('<div style="clear:both"></div>' +
                          r.prettify() + '<div style="clear:both"></div>')
        '''
        return soup

    keep_only_tags = [
        dict(name='div', attrs={'class': ['cf txt ', 'cf txt att-audio']})
    ]

    remove_tags = [
        dict(name='p', attrs={'class': 'l l-2 doc-source'}),
        dict(name='span', attrs={'class': 'wykop'}),
        dict(name='div', attrs={'class': ['doc_actions', 'cf', 'fr1_cl','txt__social-icons','txt__tags','fb-like fb_iframe_widget', 'jp-audio', 'jp-jplayer']}),
        dict(name='div', attrs={'id': 'vote'}),
        dict(name='link'),
        dict(name='a', attrs={'class': 'img_enlarge'})
    ]

    extra_css = '''
            h1 {font-size:150%}
            p.limiter {font-size:150%; font-weight: bold}
            p.gn_subtitle {font-weight: bold}
            span.cm-i-a {text-transform:uppercase;font-size:50%}
            span.cm-i-p {font-style:italic; font-size:70%;text-align:right}
            span.gn_brb {color: red; font-weight: bold}
            div.txt__lead {font-weight: bold; font-size:150%}
        '''
PK�X������gosc_niedzielny.png�PNG


IHDR��h6�IDATxڍ�!H�Q��(��AƂ�������,�dd��A�A�A�a���(�aY�a�� ��X���c�)<�{����FJ6vz�v�L�`+#�w%��G{	��w��YfaY79 F|�aiD^I:���Q^o�zY����BZ��벞e-�@�i:�_�zQ�ӂ�X�6��b諒�����Ӽ����}gR9��#��5def��zW��,h�c��!j��H,��G�����B,�4���Z�כZoB"��h���R��e�AdJf�(���gW�3�k���
���o�3���C�P����Yj0q�?{C�9��դհ�ֵ]=�hF��r[�q��k�Xt�+["�~(��Ünge-	MJ�u��,YNg���F�>��x�;.|-�(@`'p��+P���z�9�J�8�|�(Yt��t���/Q��8y.ZIEND�B`�PK�X��ۻ{{gosc_niedzielny.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2011, Piotr Kontek, piotr.kontek@gmail.com \
                 2013-2018, Tomasz Długosz, tomek3d@gmail.com'

from calibre.web.feeds.news import BasicNewsRecipe
import re
from lxml import html


class GN(BasicNewsRecipe):
    __author__ = 'Piotr Kontek, Tomasz Długosz'
    title = u'Gość Niedzielny'
    publisher = 'Wydawnictwo Kurii Metropolitalnej w Katowicach'
    description = 'Ogólnopolski tygodnik katolicki - fragmenty artykułów z aktualnego numeru'
    encoding = 'utf-8'
    no_stylesheets = True
    language = 'pl'
    remove_javascript = True
    ignore_duplicate_articles = {'url'}
    masthead_url = 'http://gosc.pl/static/images/base/logotypes/100x68/gosc-niedzielny.png'

    def find_last_issue(self):
        raw = self.index_to_soup(
            'http://gosc.pl/wyszukaj/wydania/3.Gosc-Niedzielny/', raw=True)
        doc = html.fromstring(raw)
        page = doc.xpath(
            '//div[@class="search-result release-result"]/div[1]/div[2]/h1//a/@href')

        return page[0]

    def parse_index(self):
        self.last_issue = self.find_last_issue()
        soup = self.index_to_soup('http://gosc.pl' + self.last_issue)
        self.cover_url = 'http://www.gosc.pl' + \
            soup.find('div', attrs={'class': 'fl-w100 release-wp'}
                      ).findAll('a')[-4].contents[0]['src']
        feeds = []
        # editorial:
        a = soup.find('div', attrs={'class': 'release-wp-b'})
        art = a.find('a')
        articles = [
            {'title': self.tag_to_string(art),
             'url': 'http://www.gosc.pl' + art['href'],
             'description': self.tag_to_string(a.find('p', attrs={'class': 'b lead'}))
             }]
        feeds.append((u'Na dobry początek', articles))
        # columns:
        for addr in soup.findAll('a', attrs={'href': re.compile('kategoria')}):
            if not addr.span:
                main_block = self.index_to_soup(
                    'http://www.gosc.pl' + addr['href'])
                articles = list(self.find_articles(main_block))
                if len(articles) > 0:
                    section = addr.contents[0]
                    feeds.append((section, articles))
        # not assigned content:
        page = 1
        not_assigned = []
        while True:
            soup = self.index_to_soup(
                'http://gosc.pl' + self.last_issue.replace('przeglad', 'wszystko') + '/' + str(page))
            articles = list(self.find_articles(soup))
            not_assigned.extend(articles)
            page += 1
            pages = soup.find('span', attrs={'class': 'pgr_nrs'})
            if str(page) not in [self.tag_to_string(x) for x in pages.findAll('a')]:
                break

        feeds.append((u'Nieprzypisane', not_assigned))
        return feeds

    def find_articles(self, main_block):
        for a in main_block.findAll('div', attrs={'class': ['infoBox']}):
            art = a.find('a')
            yield {
                'title': self.tag_to_string(art),
                'url': 'http://www.gosc.pl' + art['href'].split('.')[0],
                'date': self.tag_to_string(a.find('b', attrs={'class': 'time'})).replace('DODANE', ' '),
                'description': self.tag_to_string(a.find('div', attrs={'class': 'txt'}))
            }

    def append_page(self, soup, appendtag):
        chpage = appendtag.find(attrs={'class': 'pgr_nrs'})
        if chpage:
            for page in chpage.findAll('a'):
                soup2 = self.index_to_soup('http://gosc.pl' + page['href'])
                pagetext = soup2.find(attrs={'class': 'intextAd'})
                pos = len(appendtag.contents)
                appendtag.insert(pos, pagetext)

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        r = soup.find(attrs={'class': 'lightbox'})
        if r:
            r.contents[0]['src'] = r['href']
        return soup

    def postprocess_html(self, soup, first_fetch):
        for r in soup.findAll(attrs={'class': 'pgr'}):
            r.extract()
        for r in soup.findAll(attrs={'class': 'cm-i-a'}):
            r.replaceWith('<div style="clear:both"></div>' + r.prettify() + '<div style="clear:both"></div>')
        return soup

    keep_only_tags = [
        dict(name='div', attrs={'class': ['cf txt ', 'cf txt att-audio']})
    ]

    remove_tags = [
        dict(name='p', attrs={'class': 'l l-2 doc-source'}),
        dict(name='span', attrs={'class': 'wykop'}),
        dict(name='div', attrs={'class': ['doc_actions', 'cf', 'fr1_cl','txt__social-icons','txt__tags','fb-like fb_iframe_widget', 'jp-audio', 'jp-jplayer']}),
        dict(name='div', attrs={'id': 'vote'}),
        dict(name='a', attrs={'class': 'img_enlarge'})
    ]

    extra_css = '''
            h1 {font-size:150%}
            p.limiter {font-size:150%; font-weight: bold}
            p.gn_subtitle {font-weight: bold}
            span.cm-i-a {text-transform:uppercase;font-size:50%}
            span.cm-i-p {font-style:italic; font-size:70%;text-align:right}
            span.gn_brb {color: red; font-weight: bold}
            div.txt__lead {font-weight: bold; font-size:150%}
        '''
PK�X+��Y��gram_pl.png�PNG


IHDR�a{IDATxڕSMkQ=�y�$3��jH�6�`C�iD��Q�R�+���O���B��.�#X
t�;�

�����D;����
S
�̝�y�y�h46K����!)%��򛦉f��S�V_8P�R��������ujG.�;�y���` �?}!� S������q}�9aX��Z���5��`��p/Щ�!�ę�9D�i����,k�QgA��$��4ظz
ޗmD�$�i�H�#�ɠ�����"m`��:�l�	L>|�0
�s|{����2�	F$���z=(025�v��L����;��n�~<�����:v����*1��cs�ۏ#9=�xМй�S���I����~��D���%���'%�j��#0�YV�D��8�,/���-��QR��1����|0�5BD��9��]|�q�O�����XF{����x�3���J��	�<^˧���Q�����
~���E����p&s8���N���h9�s�x��=�o߂h��6LF�e�]��k�&(O�mgH�fff�$i�Ԋ���G !!Aj��&
q�V��,���|������x��� �.���O�k�Z*�X#ta���=�"W���i���Ԏ.IEND�B`�PK�XM1�� 	 	gram_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class Gram_pl(BasicNewsRecipe):
    title = u'Gram.pl'
    __author__ = 'fenuks'
    description = u'Serwis społecznościowy o grach: recenzje, newsy, zapowiedzi, encyklopedia gier, forum. Gry PC, PS3, X360, PS Vita, sprzęt dla graczy.'
    category = 'games'
    language = 'pl'
    oldest_article = 8
    index = 'http://www.gram.pl'
    max_articles_per_feed = 100
    ignore_duplicate_articles = {'title', 'url'}
    no_stylesheets = True
    remove_empty_feeds = True
    cover_url = u'http://www.gram.pl/www/01/img/grampl_zima.png'
    keep_only_tags = [dict(id='articleModule')]
    remove_tags = [dict(attrs={'class': ['breadCrump', 'dymek', 'articleFooter',
                                         'twitter-share-button']}), dict(name='aside'), dict(id='metaColumn')]
    feeds = [(u'Informacje', u'http://www.gram.pl/feed_news.asp'),
             (u'Publikacje', u'http://www.gram.pl/feed_news.asp?type=articles')
             ]

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        for feed in feeds:
            for article in feed.articles[:]:
                if 'REKLAMA SKLEP' in article.title.upper() or u'ARTYKUŁ:' in article.title.upper():
                    feed.articles.remove(article)
        return feeds

    def preprocess_html(self, soup):
        tag = soup.find(name='div', attrs={'class': 'summary'})
        if tag:
            tag.find(attrs={'class': 'pros'}).insert(
                0, BeautifulSoup('<h2>Plusy:</h2>').h2)
            tag.find(attrs={'class': 'cons'}).insert(
                0, BeautifulSoup('<h2>Minusy:</h2>').h2)
            tag = soup.find(name='section', attrs={'class': 'cenzurka'})
            if tag:
                rate = tag.p.img['data-ocena']
                tag.p.img.extract()
                tag.p.insert(len(tag.p.contents) - 2,
                             BeautifulSoup('<h2>Ocena: {0}</h2>'.format(rate)).h2)
        for a in soup.findAll('a', href=True):
            if 'http://' not in a['href'] and 'https://' not in a['href']:  # noqa
                a['href'] = self.index + a['href']
        tag = soup.find(name='span', attrs={'class': 'platforma'})
        if tag:
            tag.name = 'p'
        return soup
PK�X	X�G�� grandes_corresponsales_es.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe


class GrandesCorresponsalesRecipe (BasicNewsRecipe):
    __author__ = 'Marc Busqué <marc@lamarciana.com>'
    __url__ = 'http://www.lamarciana.com'
    __version__ = '1.1.0'
    __license__ = 'GPL v3'
    __copyright__ = '2014, Marc Busqué <marc@lamarciana.com>'
    title = u'Grandes corresponsales'
    description = u'Corresponsales de verdad, de los que no se quedan en el hotel.'
    language = 'es'
    tags = 'información, internacional '
    oldest_article = 30
    remove_empty_feeds = True
    no_stylesheets = True

    def get_extra_css(self):
        if not self.extra_css:
            br = self.get_browser()
            self.extra_css = br.open_novisit(
                'https://raw.githubusercontent.com/laMarciana/gutenweb/master/dist/gutenweb.css').read().replace('@charset "UTF-8";', '')
        return self.extra_css

    feeds = [
        (u'Rafael Poch', u'http://blogs.lavanguardia.com/berlin/feed'),
        (u'Andy Robinson', u'http://blogs.lavanguardia.com/diario-itinerante/feed'),
        (u'Eugenio García Gascón', u'http://blogs.publico.es/balagan/feed/'),
        (u'Gervasio Sánchez', u'http://blogs.heraldo.es/gervasiosanchez/?feed=rss2'),
        (u'Rafael Ramos', u'http://blogs.lavanguardia.com/londres/feed'),
        (u'Olga Rodríguez', u'http://olgarodriguez.org/feed/'),
        (u'Mikel Ayestaran', u'http://www.mikelayestaran.com/blog/?feed=rss2'),
        (u'Hernán Zin', u'http://blogs.20minutos.es/enguerra/tag/corresponsales-guerra/feed/'),
        (u'Ramón Lobo', u'http://www.ramonlobo.com/feed/'),
        (u'Arturo Pérez-Reverte',
         u'http://feeds.feedburner.com/ArtculosDeArturoPrez-reverte'),
    ]
PK�X�\4���	grani.png�PNG


IHDR  �Tg�PLTE33�f����f>gH�tRNS@��fQIDATx^��A�0�Z���	�k�!�39e�X��pA�wЃӔ�����Jxr�ك����O(���Q"�&�&g�
�Dg���IEND�B`�PK�X���)��grani.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Grani(BasicNewsRecipe):
    title = '\u0413\u0440\u0430\u043D\u0438.\u0420\u0443'
    __author__ = 'bugmen00t'
    description = '\u0415\u0436\u0435\u0434\u043D\u0435\u0432\u043D\u0430\u044F \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0433\u0430\u0437\u0435\u0442\u0430. \u041E\u0431\u0437\u043E\u0440\u044B \u0438 \u0430\u043D\u0430\u043B\u0438\u0437 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0438 \u043C\u0438\u0440\u043E\u0432\u044B\u0445 \u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0441\u043E\u0431\u044B\u0442\u0438\u0439, \u0441\u0442\u0430\u0442\u044C\u0438 \u0438 \u0432\u0438\u0434\u0435\u043E \u043E \u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0437\u0430\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u044B\u0445.'  # noqa
    publisher = '\u041E\u041E\u041E "\u0424\u043B\u0430\u0432\u0443\u0441"'
    category = 'newspaper'
    cover_url = u'https://graniru.org/files/96172.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 30
    max_articles_per_feed = 50

    remove_tags_before = dict(name='h3')

    remove_tags_after = dict(name='div', attrs={'class': 'main-text clearfix'}),

    # Original feeds
    #    feeds = [
    #        ('\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B', 'https://graniru.org/export/all-atom.xml'),
    #        ('\u0421\u0442\u0430\u0442\u044C\u0438', 'https://graniru.org/export/articles-atom.xml')
    #        ]

    # Feeds from mirror site
    feeds = [
        (
            '\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://grani2.appspot.com/export/all-atom.xml'
        ),
        (
            '\u0421\u0442\u0430\u0442\u044C\u0438',
            'https://grani2.appspot.com/export/articles-atom.xml'
        ),
    ]

    # Mirror site feeds transformation
    def print_version(self, url):
        return url.replace('https://graniru.org/', 'https://grani2.appspot.com/')
PK�Xf�BB
granma.png�PNG


IHDR(-S�PLTE�����������������������������������������������������������������������������������Gg�StRNSH�����D��6}���oH;��I�#	��E�ns�3�w�ZO�H�͕�����7�)�k����&���C���W�,��k��IDAT�B�1;Q���E���_��v::���J��/I����j24<�>6��I&����ljs�W�P�YZfe5Y�7��T���Ѳ�����Eqx4s��i�,��r��Y\W�^ss�;�}�r���g��k�|��L�
��Z~��O3�x0IEND�B`�PK�Xf�D�
granma.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2019, Darko Miletic <darko.miletic at gmail.com>'
'''
granma.cu
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Granma(BasicNewsRecipe):
    title = 'Diario Granma'
    __author__ = 'Darko Miletic'
    description = 'Organo oficial del Comite Central del Partido Comunista de Cuba'
    publisher = 'Granma'
    category = 'news, politics, Cuba'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    masthead_url = 'http://www.granma.cu/static/img/granma-logo.png'
    language = 'es_CU'
    auto_cleanup      = True
    remove_javascript = True

    feeds = [(u'Noticias', u'http://www.granma.cu/feed')]
PK�X��/
granta.png�PNG


IHDR  V%(�IDAT8�c�O0�����7��~��VOL�	ru�s�,���)X�?���+,�B*'ϙRn�k`�W}ل_{㌍����d�}�+����h���Sl���������hB�����\����`\��^c#�yQ��<^��`���A�G4��6��U�,��r/z}]��`���A�{�!�)�ȠOP_q022لG�Vc#��x,446���$tk�P��"P�lc#�H
v�:�.*XbhddqI���w�z�O��	�`�����R4�W����᎛��~�oT�����A�#��������FW�!��h�,
�A|�502�[��^@K
��V�����q�$��P���T�s�fn�"+���z����{�@���pif�����u�|��@����MTiKsq����]hպO���
YᾞށqE��ο��%�����o��&?�byB�zIEND�B`�PK�Xpg�Z��
granta.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2018, Gary Arnold garnold@garyarnold.com'
__docformat__ = 'restructuredtext en'

'''
granta.com
'''
import re

from calibre.web.feeds.news import BasicNewsRecipe

# Set this variable to the URL of the issue you want to download, if not the current issue
force_issue_download = None

##################################################################
# Adapted from https://gist.github.com/FlyingTopHat/7cfdd5434ec704916174


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def plus_with_unknown_component(first_comp, second_comp, result):
    if result is None:
        return first_comp + second_comp

    component = (first_comp if second_comp is None else second_comp)
    return result - component


def subtract_with_unknown_component(first_comp, second_comp, result):
    if result is None:
        return first_comp - second_comp

    return (first_comp - result) if second_comp is None else (result + second_comp)


def multiply_with_unknown_component(first_comp, second_comp, result):
    if result is None:
        return first_comp * second_comp

    component = (first_comp if second_comp is None else second_comp)
    return result / component


def solve_captcha(captcha):
    # # Convert from a word problem into a numeric problem
    numeric_problem = ''
    for part in captcha.split(' '):
        numeric_problem = numeric_problem + str(text2num(part))

    # Parse into parts
    pattern = re.compile(
            u'(?P<first_component>[0-9]+)?'
            u'\\s*(?P<operator>[+×−])\\s*'
            u'(?P<second_component>[0-9]+)'
            u'\\s*(=)\\s*'
            u'(?P<result>[0-9]+)?', re.UNICODE)

    calculationParts = re.search(pattern, numeric_problem)
    if calculationParts is None:
        return 0

    operator = calculationParts.group('operator')

    result = calculationParts.group('result')
    result = int(result) if result is not None else None

    component_one = calculationParts.group('first_component')
    component_one = int(component_one) if component_one is not None else None

    component_two = calculationParts.group('second_component')
    component_two = int(component_two) if component_two is not None else None

    # Calculate answer
    answer = 0
    if operator == u'+':
        answer = plus_with_unknown_component(component_one, component_two, result)
    elif operator == u'×':
        answer = multiply_with_unknown_component(component_one, component_two, result)
    elif operator == u'−':
        answer = subtract_with_unknown_component(component_one, component_two, result)

    return answer
##################################################################


##################################################################
# Adapted from https://github.com/ghewgill/text2num/blob/master/text2num.py
# Removes external dependency on digify library
Small = {
    'zero': 0,
    'one': 1,
    'two': 2,
    'three': 3,
    'four': 4,
    'five': 5,
    'six': 6,
    'seven': 7,
    'eight': 8,
    'nine': 9,
    'ten': 10,
    'eleven': 11,
    'twelve': 12,
    'thirteen': 13,
    'fourteen': 14,
    'fifteen': 15,
    'sixteen': 16,
    'seventeen': 17,
    'eighteen': 18,
    'nineteen': 19,
    'twenty': 20,
    'thirty': 30,
    'forty': 40,
    'fifty': 50,
    'sixty': 60,
    'seventy': 70,
    'eighty': 80,
    'ninety': 90
}

Magnitude = {
    'thousand':     1000,
    'million':      1000000,
    'billion':      1000000000,
    'trillion':     1000000000000,
    'quadrillion':  1000000000000000,
    'quintillion':  1000000000000000000,
    'sextillion':   1000000000000000000000,
    'septillion':   1000000000000000000000000,
    'octillion':    1000000000000000000000000000,
    'nonillion':    1000000000000000000000000000000,
    'decillion':    1000000000000000000000000000000000,
}


def text2num(s):
    a = re.split(r"[\s-]+", s)
    n = 0
    g = 0
    for w in a:
        x = Small.get(w, None)
        if x is not None:
            g += x
        elif w == "hundred" and g != 0:
            g *= 100
        else:
            x = Magnitude.get(w, None)
            if x is not None:
                n += g * x
                g = 0
            else:
                return s
    return n + g
##################################################################


class Granta(BasicNewsRecipe):

    title = u'Granta'
    description = u'The Magazine of New Writing'
    language = 'en'

    __author__ = 'Gary Arnold'

    needs_subscription = 'optional'

    keep_only_tags = [
        classes(
            'article-header article-content article-feature-image-standard-container article-feature-image-full-width-container'
        ),
    ]
    remove_tags = [
        classes('social-share-container'),
    ]
    remove_attributes = ['style']

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username and self.password:
            # User has a subscription, log in
            response = br.open('https://granta.com/')

            # Get captcha solution
            captcha = '0'
            html = response.read()
            soup = self.index_to_soup(html)
            captcha_field = soup.find('input', attrs={'name': 'capcha'})
            captcha_question = ''
            if captcha_field is not None:
                captcha_question = captcha_field['placeholder']
                if captcha_question is not None:
                    captcha = str(solve_captcha(captcha_question))

            br.select_form(method="post", action="https://granta.com/")
            br['username'] = self.username
            br['password'] = self.password
            br['capcha'] = captcha
            self.log.info('Logging in with captcha ' + str(captcha_question) + ', solution ' + captcha)
            br.submit()

        return br

    def preprocess_html(self, soup):
        for div in soup.findAll(attrs={'data-background': True}):
            img = soup.new_tag('img')
            img['src'] = div['data-background']
            div.append(img)
        return soup

    def parse_index(self):
        if force_issue_download is None:
            soup = self.index_to_soup('https://granta.com/')

            # Get latest issue
            issueInfo = soup.find(**classes('featured_product__image'))
            issueAnchor = issueInfo.findParent('a', href=True)
            issueLink = issueAnchor.get('href')
        else:
            issueLink = force_issue_download

        self.log('Fetching issue:', issueLink)
        soup = self.index_to_soup(issueLink)
        # open('/t/raw.html', 'w').write(str(soup))

        # Find cover
        cover = soup.find(**classes('single-issue__cover-image'))
        if cover is not None:
            self.cover_url = cover['data-background']
            self.log.info('Found cover at:', self.cover_url)

        sections = {}
        for item in soup.findAll(**classes('single-contributor_related-row_container')):
            h6 = item.find('h6')
            section = self.tag_to_string(h6.find('a')).strip()
            sections.setdefault(section, [])
            h1 = item.find('h1')
            title = self.tag_to_string(h1).strip()
            url = h1.findParent('a')['href']
            author = self.tag_to_string(item.findAll('h3')[-1]).strip()
            desc = ''
            for p in item.findAll('p'):
                desc += self.tag_to_string(p)
            sections[section].append({
                'title': title, 'url': url, 'description': 'by ' + author + '. ' + desc})

            self.log.info('Found article:', title)
            self.log.info('\t', url)

        return [(sec, sections[sec]) for sec in sections]
PK�X�@����
grantland.png�PNG


IHDR  szz��IDATxڽ���J@߷͇o۶m۶m���l���Q����{z+�H��]u�S��{O����8
���
\�j8��A�߄2�7�a8�g����^$�Om�����
�r��;���Z�&�%��޵&��,�wy���,b}�j��k�����R��:�]sÞյ
�õ&'�<|ּ3�Ѝ���\^ȋ�2I>�}����@�յ�󘅅)�jv�}f�OV(+d��*J�F����N�$���������	��L��*J��k�8kr�2+y�F��1�h\ 1��U�����\Y��Պ�S������Ē"��R����U�_+F �(���p�d*+�D,����z�X6��9�He�sO�dy�����-�z^�M������i�Hf��"G�H<�mj-���U���� ��	��;Fb��h��'��u���1R�Z�[��ޕe�|��^.��Ž�C��Ǖ�a�Lb�Q�����w�l�H����$��>)�ݱD:H�
�7�S�����T�k�y�]��c�[8/�'�[s�>�f����g�<(+@��.F�I��EE�^b��4�}�en��m6t�����R�S�ڗ~"���T��������������.�'���]xپfXq(�W�<��B�ޢ����#-��<v)$j���\}D� �s�����w�j��5�����
�o0`"��(^@�R�OtT� uzcϼ��nt,`)��@�U�U�>��=�:��9�O������"��	ru��ڲ�vG�f�^&Q��k�U��m#�ɡkoܛ���9E���/�n^^��`��.�i�^���o���AX�KqQ�G�?�9 r��U�֟ʼ�:j�2��p>\7��<�c�7������G��5NIEND�B`�PK�Xgq�� 
 
grantland.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class GrantLand(BasicNewsRecipe):
    title = u"Grantland"
    description = 'Writings on Sports & Pop Culture'
    language = 'en'
    __author__ = 'barty on mobileread.com forum'
    max_articles_per_feed = 100
    no_stylesheets = True
    # auto_cleanup is too aggressive sometimes and we end up with blank
    # articles
    auto_cleanup = False
    timefmt = ' [%a, %d %b %Y]'
    oldest_article = 90

    cover_url = 'http://cdn0.sbnation.com/imported_assets/740965/blog_grantland_grid_3.jpg'
    masthead_url = 'http://a1.espncdn.com/prod/assets/grantland/grantland-logo.jpg'

    INDEX = 'http://www.grantland.com'
    CATEGORIES = [
        # comment out second line if you don't want older articles
        # (user friendly name, url suffix, max number of articles to load)
        ('Today in Grantland', '', 20),
        ('In Case You Missed It', 'incaseyoumissedit', 35),
    ]

    remove_tags = [
        {'name': ['style', 'aside', 'nav', 'footer', 'script']},
        {'name': 'h1', 'text': 'Grantland'},
        {'id': ['header', 'col-right']},
        {'class': ['connect_widget']},
        {'name': 'section', 'class': re.compile(r'\b(ad|module)\b')},
    ]

    preprocess_regexps = [
        # remove blog banners
        (re.compile(r'<a href="/blog/(?:(?!</a>).)+</a>',
                    re.DOTALL | re.IGNORECASE), lambda m: ''),
    ]

    def parse_index(self):
        feeds = []
        seen_urls = set()

        for category in self.CATEGORIES:

            (cat_name, tag, max_articles) = category
            self.log('Reading category:', cat_name)
            articles = []

            page = "%s/%s" % (self.INDEX, tag)
            soup = self.index_to_soup(page)

            main = soup.find('div', id='col-main')
            if main is None:
                main = soup

            for tag in main.findAll('a', href=re.compile(r'(story|post)/_/id/\d+')):
                url = tag['href']
                if url in seen_urls:
                    continue
                title = tag.string
                # blank title probably means <a href=".."><img /></a>.  skip
                if not title:
                    continue
                self.log('\tFound article:', title)
                self.log('\t', url)
                articles.append({'title': title, 'url': url})
                seen_urls.add(url)

                if len(articles) >= max_articles:
                    break

            if articles:
                feeds.append((cat_name, articles))

        return feeds
PK�Xu�����greensboro_news_and_record.png�PNG


IHDR�a�IDATx�b��<�P,�0�P4a
�a
!L
�!!����!^���Ե^m�b�!�(&D���x����9�8�I������}�=��1
v����L��Db��Jp����4*\
*�rV�
�SL�DE%q'�~�l��	x�m!>Ea��H6q`���Y��|�|a���IEND�B`�PK�X����!greensboro_news_and_record.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Walt Anthony <workshop.northpole at gmail.com>'
'''
www.news-record.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class NewsandRecord(BasicNewsRecipe):
    title = u'Greensboro News & Record'
    description = "News from Greensboro, North Carolina"
    __author__ = 'Walt Anthony'
    publisher = 'News & Record and Landmark Media Enterprises, LLC'
    category = 'news, USA'
    oldest_article = 3  # days
    max_articles_per_feed = 25
    summary_length = 150
    language = 'en'
    encoding = 'utf-8'
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [
        ('News', 'http://www.greensboro.com/search/?q=&t=article&l=10&d=&d1=&d2=&s=start_time&sd=desc&c[]=news,news/*&f=rss'),
        ('Greensboro News', 'http://www.greensboro.com/search/?q=&t=article&l=100&d=&d1=&d2=&s=start_time&sd=desc&nsa=eedition&c[]=news/local,news/crime,news/goverment,news/schools,news/rockingham_county,news/local,news/crime,news/goverment,news/schools,news/rockingham_county/*&f=rss'),  # noqa
        ('Business', 'http://www.greensboro.com/search/?q=&t=article&l=10&d=&d1=&d2=&s=start_time&sd=desc&c[]=business,business/*&f=rss'),
        ('Local Business', 'http://www.greensboro.com/search/?q=&t=article&l=100&d=&d1=&d2=&s=start_time&sd=desc&nsa=eedition&c[]=business/local_business,business/local_business/*&f=rss'),  # noqa
        ('Sports', 'http://www.greensboro.com/search/?q=&t=article&l=10&d=&d1=&d2=&s=start_time&sd=desc&c[]=sports,sports/*&f=rss'),
        ('College Sports', 'http://www.greensboro.com/search/?q=&t=article&l=100&d=&d1=&d2=&s=start_time&sd=desc&nsa=eedition&c[]=sports/college,sports/college/*&f=rss'),  # noqa
        ('Sports Extra', 'http://www.greensboro.com/search/?q=&t=article&l=100&d=&d1=&d2=&s=start_time&sd=desc&nsa=eedition&c[]=blogs/sports_extra,blogs/sports_extra/*&f=rss'),  # noqa
        ('Life', 'http://www.greensboro.com/search/?q=&t=article&l=10&d=&d1=&d2=&s=start_time&sd=desc&c[]=life,life/*&f=rss'),
    ]
PK�X
��a!!grenaalokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X�~�ZKKgrenaalokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Grenaa
'''


class GrenaaLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Grenaa'
    description = 'Lokale og regionale nyheder, sport, kultur fra Grenå og omegn på grenaa.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Grenaa', 'http://grenaa.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Grenaa', 'http://grenaa.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Grenaa', 'http://grenaa.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Grenaa', 'http://grenaa.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Grenaa', 'http://grenaa.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Grenaa', 'http://grenaa.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X
��a!!gribskovlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X>\�(__gribskovlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Ugeposten Gribskov
'''


class GribskovLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Ugeposten Gribskov'
    description = 'Lokale og regionale nyheder, sport og kultur fra Gribskov og omegn på gribskov.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Ugeposten Gribskov', 'http://gribskov.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Ugeposten Gribskov', 'http://gribskov.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Ugeposten Gribskov', 'http://gribskov.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Ugeposten Gribskov', 'http://gribskov.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Ugeposten Gribskov', 'http://gribskov.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Ugeposten Gribskov', 'http://gribskov.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�XX<)88grid_to.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class TheGrid(BasicNewsRecipe):
    #: The title to use for the ebook
    title = u'The Grid'

    #: A couple of lines that describe the content this recipe downloads.
    #: This will be used primarily in a GUI that presents a list of recipes.
    description = (u'The Grid is a weekly city magazine and daily website providing a fresh, '
                   'accessible voice for Toronto.')

    #: The author of this recipe
    __author__ = u'Yusuf W'

    #: The language that the news is in. Must be an ISO-639 code either
    #: two or three characters long
    language = 'en_CA'

    #: Publication type
    #: Set to newspaper, magazine or blog
    publication_type = 'newspaper'

    #: Convenient flag to disable loading of stylesheets for websites
    #: that have overly complex stylesheets unsuitable for conversion
    #: to ebooks formats
    #: If True stylesheets are not downloaded and processed
    no_stylesheets = True

    #: List of tags to be removed. Specified tags are removed from downloaded HTML.
    remove_tags_before = dict(name='div', id='content')
    remove_tags_after = dict(name='div', id='content')
    remove_tags = [
        dict(name='div', attrs={'class': 'right-content pull-right'}),
        dict(name='div', attrs={'class': 'right-content'}),
        dict(name='div', attrs={'class': 'ftr-line'}),
        dict(name='div', attrs={'class': 'pull-right'}),
        dict(name='div', id='comments'),
        dict(name='div', id='tags')
    ]

    #: Keep only the specified tags and their children.
    # keep_only_tags        = [dict(name='div', id='content')]

    cover_margins = (0, 0, '#ffffff')

    INDEX = 'http://www.thegridto.com'

    def get_cover_url(self):
        soup = self.index_to_soup(self.INDEX)
        cover_url = soup.find(
            attrs={'class': 'article-block latest-issue'}).find('img')['src']

        return cover_url

    def parse_index(self):

        # Get the latest issue
        soup = self.index_to_soup(self.INDEX)
        a = soup.find(
            'div', attrs={'class': 'full-content stuff-ftr'}).findAll('a')[2]

        # Parse the index of the latest issue
        self.INDEX = self.INDEX + a['href']
        soup = self.index_to_soup(self.INDEX)

        feeds = []
        for section in ['city', 'life', 'culture']:
            section_class = 'left-content article-listing ' + section + ' pull-left'
            div = soup.find(attrs={'class': section_class})

            articles = []
            for a in div.findAll(attrs={'class': 'post-title'}):
                title = self.tag_to_string(a)
                url = a['href']

                articles.append({'title': title, 'url': url,
                                 'description': '', 'date': ''})

            feeds.append((section, articles))
        return feeds
PK�X>r�&��grrm.png�PNG


IHDR  szz��IDATxڼ��[��j�sR۶m۶m۶m۶m۶��]ON���ַto��8�O��f]NO��|}8�V��N�4�cE�9A唘y)���P.�E-�U�4Н�� �N��v�`��$oh����Ӻb1�"D��P2���*Ą�����xz�4>�0�"u���O�JV#�4���s�J�R�q���Dk<��-?�=�~�j�'$�'��P
��w/��ֽ��O�h>V��/��)�/�b҉'J�Bƣ�Gl�O�z��f=�z���i�g��m�Q�`�y�@�Q�9����(�:�+�3�G�1���I��	�F�o���?��nG�W����\���΅�3��s�m�k�U�!�aK�Vo�|��xj�XP��JĘً �w�?����z����b�FTl���n��󗐪h%D�UFﺎk}&��9S�}��a�Ĺ�������SN�u=}�:�Ft7�a���wHV������
���k(��lD�ٗ�{�-�=���B�)�9��! J�Z�]����Ub�)���!���R�5���%��G���v����/���gm�/�+�O��P��z7��P�ߝ_L����)��~3�J����ާɔ�U��T��S�O1��T��4��t:8�IEND�B`�PK�X��rgrrm.recipe
__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
grrm.livejournal.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class NotABlog(BasicNewsRecipe):
    title = 'Not A Blog - George R.R. Martin'
    __author__ = 'Darko Miletic'
    description = 'George R.R. Martin'
    oldest_article = 15
    max_articles_per_feed = 100
    language = 'en'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = True
    publication_type = 'blog'

    conversion_options = {
        'comment': description, 'tags': 'sf, fantasy, game of thrones', 'publisher': 'George R.R. Martin', 'language': language
    }

    feeds = [(u'Posts', u'http://grrm.livejournal.com/data/rss')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X|t�@ffgry_online_pl.png�PNG


IHDR��h6-IDATx�c�a 	��l"����Ӏ�1��@��(���tKK$"py5�Z:IEND�B`�PK�X��#���gry_online_pl.recipefrom __future__ import print_function
import time
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment


class GryOnlinePl(BasicNewsRecipe):
    title = u'Gry-Online.pl'
    __author__ = 'fenuks'
    description = u'Wiadomości o grach, recenzje, zapowiedzi. Encyklopedia Gier zawiera opisy gier na PC, konsole Xbox360, PS3 i inne platformy.'
    category = 'games'
    language = 'pl'
    oldest_article = 13
    INDEX = 'http://www.gry-online.pl/'
    masthead_url = 'http://www.gry-online.pl/im/gry-online-logo.png'
    cover_url = 'http://www.gry-online.pl/im/gry-online-logo.png'
    max_articles_per_feed = 100
    no_stylesheets = True
    keep_only_tags = [dict(name='div', attrs={'class': [
                           'gc660', 'gc660 S013', 'news_endpage_tit', 'news_container', 'news']})]
    remove_tags = [
        dict({'class': ['nav-social', 'add-info', 'smlb', 'lista lista3 lista-gry', 'S013po', 'S013-npb', 'zm_gfx_cnt_bottom', 'ocen-txt', 'wiecej-txt', 'wiecej-txt2', 'social-for-old-news', 'social-for-old-rec']})]  # noqa
    feeds = [
        (u'Newsy', 'http://www.gry-online.pl/rss/news.xml'),
        ('Teksty', u'http://www.gry-online.pl/rss/teksty.xml')]

    def append_page(self, soup, appendtag):
        tag = appendtag.find('div', attrs={'class': 'n5p'})
        if tag:
            nexturls = tag.findAll('a')
            url_part = soup.find('link', attrs={'rel': 'canonical'})['href']
            url_part = url_part[25:].rpartition('?')[0]
            for nexturl in nexturls[1:-1]:
                finalurl = 'http://www.gry-online.pl/' + \
                    url_part + nexturl['href']
                for i in range(10):
                    try:
                        soup2 = self.index_to_soup(finalurl)
                        break
                    except:
                        print('retrying in 0.5s')
                        time.sleep(0.5)
                pagetext = soup2.find(attrs={'class': 'gc660'})
                for r in pagetext.findAll(name='header'):
                    r.extract()
                for r in pagetext.findAll(attrs={'itemprop': 'description'}):
                    r.extract()

                pos = len(appendtag.contents)
                appendtag.insert(pos, pagetext)
            for r in appendtag.findAll(attrs={'class': ['n5p', 'add-info', 'twitter-share-button', 'lista lista3 lista-gry', 'imh10b']}):
                r.extract()
            comments = appendtag.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
        else:
            tag = appendtag.find('div', attrs={'class': 'S018stronyr'})
            if tag:
                nexturl = tag.a
                url_part = soup.find(
                    'link', attrs={'rel': 'canonical'})['href']
                url_part = url_part[25:].rpartition('?')[0]
                while tag:
                    end = tag.find(attrs={'class': 'right left-dead'})
                    if end:
                        break
                    else:
                        nexturl = tag.a
                    finalurl = 'http://www.gry-online.pl/' + \
                        url_part + nexturl['href']
                    for i in range(10):
                        try:
                            soup2 = self.index_to_soup(finalurl)
                            break
                        except:
                            print('retrying in 0.5s')
                            time.sleep(0.5)
                    tag = soup2.find('div', attrs={'class': 'S018stronyr'})
                    pagetext = soup2.find(attrs={'class': 'gc660'})
                    for r in pagetext.findAll(name='header'):
                        r.extract()
                    for r in pagetext.findAll(attrs={'itemprop': 'description'}):
                        r.extract()

                    comments = pagetext.findAll(
                        text=lambda text: isinstance(text, Comment))
                    [comment.extract() for comment in comments]
                    pos = len(appendtag.contents)
                    appendtag.insert(pos, pagetext)
                for r in appendtag.findAll(attrs={'class': ['n5p', 'add-info', 'twitter-share-button', 'lista lista3 lista-gry', 'S018strony', 'imh10b']}):
                    r.extract()
                comments = appendtag.findAll(
                    text=lambda text: isinstance(text, Comment))
                for comment in comments:
                    comment.extract()

    def image_url_processor(self, baseurl, url):
        if url.startswith('..'):
            return url[2:]
        else:
            return url

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        return soup
PK�X(���gs24_pl.png�PNG


IHDR(-SKPLTE���A����M�������؞��~��?p�/d�X����L����@p� Y���0e����o��`��O|��������iIDATx^�Ϸ�0P�ג���_�M&V�x�4���'Ч��&��vk�����ӄ���3��2�����c��=�3I� o�j�P�t�#��,��j
~�}��_�x_��>�IEND�B`�PK�X�]����gs24_pl.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

import re
import string
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1322322819(BasicNewsRecipe):
    title = u'GS24.pl (Głos Szczeciński)'
    description = u'Internetowy serwis Głosu Szczecińskiego'
    __author__ = u'Michał Szkutnik'
    __license__ = u'GPL v3'
    language = 'pl'
    publisher = 'Media Regionalne sp. z o.o.'
    category = 'news, szczecin'
    oldest_article = 2
    max_articles_per_feed = 100
    auto_cleanup = True
    cover_url = "http://www.gs24.pl/images/top_logo.png"

    feeds = [
        # (u'Wszystko', u'http://www.gs24.pl/rss.xml'),
        (u'Szczecin', u'http://www.gs24.pl/szczecin.xml'),
        (u'Stargard', u'http://www.gs24.pl/stargard.xml'),
        (u'Świnoujście', u'http://www.gs24.pl/swinoujscie.xml'),
        (u'Goleniów', u'http://www.gs24.pl/goleniow.xml'),
        (u'Gryfice', u'http://www.gs24.pl/gryfice.xml'),
        (u'Kamień Pomorski', u'http://www.gs24.pl/kamienpomorski.xml'),
        (u'Police', u'http://www.gs24.pl/police.xml'),
        (u'Region', u'http://www.gs24.pl/region.xml'),
        (u'Sport', u'http://www.gs24.pl/sport.xml'),
    ]

    def get_article_url(self, article):
        s = re.search("""/0L0S(gs24.*)/story01.htm""", article.link)
        s = s.group(1)
        replacements = {"0B": ".", "0C": "/",
                        "0H": ",", "0I": "_", "0D": "?", "0F": "="}
        for (a, b) in replacements.items():
            s = string.replace(s, a, b)
        s = string.replace(s, "0A", "0")
        return "http://" + s

    def print_version(self, url):
        return url + "&Template=printpicart"
PK�X�*��gsp.png�PNG


IHDR(-S0PLTE�&$�=9�EA�TP�`^�pl�|㋉䜜쫦촴�½��������m�jIDATxm�Q� E����v�5���U��0�4�8\���‚�
\
�*�`vV�f�k�碿űG/ze�kq4=��W��Gڰ�]���W风qg}����8�	IEND�B`�PK�X1U�ee
gsp.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
gsp.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class GSP(BasicNewsRecipe):
    title = u'Gazeta Sporturilor'
    language = 'ro'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Gazeta Sporturilor'
    publisher = u'Gazeta Sporturilor'
    category = 'Ziare,Sport,Stiri,Romania'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True
    cover_url = 'http://www.gsp.ro/images/logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [dict(name='h1', attrs={'class': 'serif title_2'}), dict(name='div', attrs={'id': 'only_text'}), dict(name='span', attrs={'class': 'block poza_principala'})  # noqa
                      ]

    feeds = [(u'\u0218tiri', u'http://www.gsp.ro/rss.xml')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X��o���guardian.png�PNG


IHDR(-S�PLTE'a(a'a&_#X(a'a&a(a'a'a(`)b(b)b&_']'a)b���'`/f+d7l;o���1h��֣��F`�6S���ˈ��ax�<X�*Iz������Sk�?r��ض�ѱ��$Cu���������0N}������������j��[s�Nh�wLv�tRNS���J�ꩣ�H����ܣ�IDATx�5OzQ~����n���
���Rj�G��ݚ�co�:g�+�{U6�am�l��������ۀ��O�r<d����-�-�k{�#����в#���S�JԶ��0������t�f��Gı����4kҒ��=A��Ҳ�m;7c��m�j��ᷜO\\����p��]��N���\�����IEND�B`�PK�X���	��guardian.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

'''
www.guardian.co.uk
'''
from calibre import random_user_agent
from calibre.web.feeds.news import BasicNewsRecipe
from datetime import date


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class Guardian(BasicNewsRecipe):

    title = u'The Guardian and The Observer'
    is_observer = False
    base_url = "https://www.theguardian.com/uk"
    if date.today().weekday() == 6:
        is_observer = True
        base_url = "https://www.theguardian.com/observer"

    __author__ = 'Kovid Goyal'
    language = 'en_GB'

    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    encoding = 'utf-8'
    remove_empty_feeds = True
    no_stylesheets = True
    remove_attributes = ['style', 'width', 'height']
    ignore_duplicate_articles = {'title', 'url'}

    timefmt = ' [%a, %d %b %Y]'

    remove_tags = [
        dict(attrs={'class': lambda x: x and '--twitter' in x}),
        dict(attrs={'class': lambda x: x and 'submeta' in x.split()}),
        dict(attrs={'data-component': ['share', 'social', 'nav', 'nav2']}),
        dict(attrs={'data-link-name': 'block share'}),
        dict(attrs={'data-print-layout': 'hide'}),
        dict(id=['dfp-ad--survey', 'sub-nav-root', 'the-caption', 'bannerandheader']),
        {'for': 'the-checkbox'},
        dict(href=['#maincontent', '#navigation']),
        dict(role=['navigation', 'button']),
        dict(attrs={'class': lambda x: x and 'inline-expand-image' in x}),
        dict(name='a', attrs={'aria-label': lambda x: x and 'Share On' in x}),
        dict(name='a', attrs={'class': lambda x: x and 'social__action js-social__action--top' in x}),
        dict(name='div', attrs={'id': 'share-count-root'}),
        dict(attrs={'class': lambda x: x and 'modern-visible' in x.split()}),
        classes('badge-slot reveal-caption__checkbox mobile-only element-rich-link'),
        dict(name=['link', 'meta', 'style', 'svg', 'input', 'source', 'noscript', 'button']),
        dict(name='img', src=lambda x: x and 'https://sb.scorecardresearch.com/' in x),
    ]
    remove_tags_after = [
        classes('content__article-body js-bottom-marker article-body-commercial-selector'),
    ]

    extra_css = """
            img {
                max-width: 100% !important;
                max-height: 100% !important;
            }

            a span {
                color: #E05E02;
            }

            figcaption span {
                font-size: 0.5em;
                color: #6B6B6B;
            }
        """

    def get_browser(self, *a, **kw):
        # This site returns images in JPEG-XR format if the user agent is IE
        if not hasattr(self, 'non_ie_ua'):
            try:
                self.non_ie_ua = random_user_agent(allow_ie=False)
            except TypeError:
                self.non_ie_ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.111 Safari/537.36'
        kw['user_agent'] = self.non_ie_ua
        br = BasicNewsRecipe.get_browser(self, *a, **kw)
        return br

    def parse_section(self, section_url):
        soup = self.index_to_soup(section_url)
        for section in soup.findAll('section'):
            articles = []
            title = self.tag_to_string(section.find('h2'))
            if not title:
                continue
            self.log('Found section:', title)
            for li in section.findAll('li'):
                a = li.find('a', attrs={'href': True, 'aria-label': True})
                if a:
                    url = a['href']
                    if url.startswith('/'):
                        url = self.base_url.rpartition('/')[0] + url
                    self.log('\t', a['aria-label'], url)
                    articles.append({'title': a['aria-label'], 'url': url})
            if articles:
                yield title, articles

    def parse_index(self):
        feeds = list(self.parse_section(self.base_url))
        feeds += list(self.parse_section('https://www.theguardian.com/uk/sport'))
        return feeds
PK�X�bN��gulfnews.png�PNG


IHDR  D����PLTE��ߟ����������څ�����d_dgbggcgsosuquzvz}y}{���������������##&&��������������������RMR�������YTY������yuy@:@{w{B<B~z~HBH�}�JEJMHM���;5;tpt������QLQ""SNS���������������������VPVWRW������������������XSX������[��������]X]^Y^a\a���������������b]b������������c^c%%���'!'idi������iei���kfk���4.4IDIJDJ������������������������##������KFK���LGL������PKP������������& &TOT*#**$*���,&,-&-������\W\-'-/)/`[`���������������2,23-3���  ���������5/5e`e���faf������������fbf���606������717hch���:4:!!���<6<lglmim���pkpqmq���rnr���>8>���tot������?9?���������!!vrvxtx���A;AC=C|x|���F@FFAFGBG�|����""�~����������~����������������������������������HCHICI������������q���IDATx�c�h�.���p�nŐxȶD�fI�wN�F��7>�e�0��$���EE��3K��&�!t�:���ܰ��~��0�Y�������fa�l������>?�]{��4����9�Ȗ�d�
a1yױM]l��/S+�;��"�4�ez�K�L���Ԏ�nt�|�F�Y�l/�ދ��"_����"$�,�o�=��؝�H�%�'�R�M�)A�)k
��<]��b�?|�و�s/��%
Li��g))�<O|
ꯕ��I��+0M`�:��]��;�� ˻�I`��"�έ�( "�(!�98�t�s<;�T�y:�YqQ�d:��
��o[K	�3V10��԰�edgt��+в�y���ˠ3�i�j!vƻM�R,
;
=�V1K0p�+y-Hf�S�!_V�P�m�x_QE��`��{$k���j;L2P�V�ɲ�27䔕�o^`�u�G�����|G���O�^���[`�l����������|I���<��IEND�B`�PK�XΣ�R��gulfnews.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
gulfnews.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class GulfNews(BasicNewsRecipe):
    title = 'Gulf News'
    __author__ = 'Darko Miletic'
    description = 'News from United Arab Emirrates, persian gulf and rest of the world'
    publisher = 'Al Nisr Publishing LLC'
    category = 'news, politics, UAE, world'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    masthead_url = 'http://gulfnews.com/media/img/gulf_news_logo.jpg'
    extra_css             = """
                               body{font-family: Arial,Helvetica,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                               h1{font-family: Georgia, 'Times New Roman', Times, serif}
                               ol,ul{list-style: none}
                               .synopsis{font-size: small}
                               .details{font-size: x-small}
                               .image{font-size: xx-small}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link', 'object', 'embed']), dict(
            attrs={'class': ['quickLinks', 'ratings']}), dict(attrs={'id': 'imageSelector'})
    ]
    remove_attributes = ['lang']
    keep_only_tags = [
        dict(name='h1'), dict(
            attrs={'class': ['synopsis', 'details', 'image', 'article']})
    ]

    feeds = [

    (u'UAE News', u'http://gulfnews.com/cmlink/1.446094'),
    (u'Business', u'http://gulfnews.com/cmlink/1.446098'),
    (u'Entertainment', u'http://gulfnews.com/cmlink/1.446095'),
    (u'Sport', u'http://gulfnews.com/cmlink/1.446096'),
    (u'Life', u'http://gulfnews.com/cmlink/1.446097')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X��6XXgulli.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1259599587(BasicNewsRecipe):
    title = u'Gulli'
    description = 'News from Germany'
    language = 'de'
    __author__ = 'posativ'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True

    feeds = [(u'gulli:news', u'http://ticker.gulli.com/rss/')]

    remove_tags = [dict(name='div', attrs={'class': ['FloatL', '_forumBox']})]

    keep_only_tags = [dict(name='div', attrs={'id': ['_contentLeft']})]

    remove_tags_after = [dict(name='div', attrs={'class': ['_bookmark']})]

    extra_css = '''
                .byline {color:#666;margin-bottom:0;font-size:12px}
                .blockquote {color:#030303;font-style:italic;padding-left:15px;}
                img {align:center;}
                .li {list-style-type: none}
                '''
PK�XE����
gva_be.png�PNG


IHDR(-S�PLTE�u����������]��Z��V��^��h��h��e��c��a��_��]��^��U��T��O��L��J��I��G��E��D��A��@��?��J��Y��t��v��x��z��}����}�惽����������������������������������������������������������������������������������������r��}�������tRNS@��f�IDATx�c�,��,


Mm+e#�@������'���P�M���Ń���VL�C(�����kg i�+��(�����n)c�*�(�$���'.($eƢ"-i�������؍�Yϔ���ƟN	��K9�)IEND�B`�PK�X�!%�[	[	
gva_be.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
www.gva.be
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class GazetvanAntwerpen(BasicNewsRecipe):
    title = 'Gazet van Antwerpen'
    __author__ = 'Darko Miletic'
    description = 'News from Belgium in Dutch'
    publisher = 'Mediahuis'
    category = 'news, politics, Belgium'
    language = 'nl_BE'

    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True

    masthead_url = 'http://2.gvacdn.be/extra/assets/img/gazet-van-antwerpen-red.svg'

    feeds = [
        ('Stad & Regio', 'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/stadenregio'),
        ('Economie', 'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/economie'),
        ('Binnenland', 'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/binnenland'),
        ('Buitenland', 'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/buitenland'),
        ('Media & Cultuur', 'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/mediaencultuur'),
        ('Sport', 'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/sport')
    ]

    keep_only_tags = [
        dict(name='header', attrs={'class': 'article__header'}),
        dict(name='footer', attrs={'class': 'article__meta'}),
        dict(name='div', attrs={
             'class': ['article', 'article__body', 'slideshow__intro']}),
        dict(name='figure', attrs={'class': 'article__image'})
    ]

    remove_tags = [
        dict(name=['embed', 'object']),
        dict(name='div', attrs={'class': ['note NotePortrait', 'note']}),
        dict(name='ul', attrs={'class': re.compile('article__share')}),
        dict(name='div', attrs={'class': 'slideshow__controls'}),
        dict(name='a', attrs={'role': 'button'}),
        dict(name='figure', attrs={'class': re.compile('video')})
    ]

    remove_attributes = ['width', 'height']

    def preprocess_html(self, soup):
        del soup.body['onload']
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X�Fe&gwup.png�PNG


IHDR  ��tRNSn���IDATxڍVP[>c;�3;����������
uw/�"aq^*h�b�H���C�!���!$D�w��<���v��s��|�ܥ��(��Zu%��=��sIS��/Y􊆮~��<��P�<�U�/n~F�d�����&s��^���
cb�r�/���ފM��D��~�b��`����{䜟V.��"�X,�Z\C�L'�ۻKڻ�0��B�(D�@tY�Q��:�&�|��~�u���
b���\єR�)��͢ŏ�M.�A�o�vB��}�WOw�-q��L�JE�L^�l����v+���f�,��2�T6��O��R�Y\nlYc��~V���UU����J��'��)�4E̥�i�%DP�}��e0cc�A=�Ә���?�]V�Q(-�ف���(J�P�
!d>���!�;1/���s(c���v��q>D����o�wC����p���l�~��z��l�ae�j=���Ytq%X���h4a���zJ���
�D��;�
���7�-ݺ���6�r/<=��
�յ3��5��}��B�e���4eͰ�0��>���#�}��q�3pn}fy�-.��F��[�� ���Y^����ƍ���ԛ���%�e�!D��|�����t��j~@�j��rC�@s�맴B�Q�`�ǫ^R�!�p��z�r��ԙ~��f:��
3F���H�;��ʀq����5��X�l�?�$��&oj�~��Rg	ɲ��
��4��S�!��!1��(��1�y~���Dw 7[���w[!@�P��9q�8U`X-ܲ���8�3J�aR	��^���x?��Lt�D�-h?�g�_�{c�����Y``w�/��œ-�p�#&��%��3+j�
������Z���d"���v�RZ��則9qc��}�JI��z[Oϕ�� .��(%��I�
~.6�G�:��1�o3I�T��ʻm`$ʵt{Gl�CN� ��(	�eϫه���t����)5_���x�#L-á)n�v3��8�	��eT��E��_A��4{#G	nP�%��"E7}b9Pҡ�^aW����:�R�Q�� b��gZ�)�ۀX�j0o���a�3��=gb1�~��ÛOrw��y���x��CD�bEvy�G]„"����������p,|��;>����q*�� i�Gp��3Ti
Ŵl��zZQ�P�^�
�h���%��R�+��%�o$t�܍B
�̰���Dtȃsi4y�%@���8�����
���F��9"��1�C	h�@���c�RO/oG��{~y�/���*��<Υ5�F��O/���{Y;�L�)�k�����٥-�?�24i��`h�����8�L?Y������>�]Y'Bw�)t�̝���a15g��v)�B#�o��ޕJ�{.s��NJg�<9�q��p�3�n�n?�Jq4�N� o�`�c��zh/j�A�x��.��YG��7��!S� rLP�!��%�`��߽�)%-�t^�>&U0��?�{�|D�$[��_P��\ޮ�C"x����&hg�(��(������@1p���t�m�:w�ϓ@�>��=ӑ>��~�`p�&�n=1�U1Y�W
�{�F1�2:V�uF�@�bg+{�m�����n�����5[��F4vj8x�L=��o��K�9Y�C��,�\_o���}����>���|���bg]��7EMC��[�ǁN,�fA����
܇��gq�����J�r����8R���w�
�0�X����-H��x�h��
�yt��_�vac����#��^��7;}��ÅQov���ǎ~¿r����R>[��~>0.�W��ď27���_�'�����֣}�F�+7J�M�K��YZ���OM|$��/�)�VD7�3�Ŕ��q����Z�
S4	�֓�IEND�B`�PK�X�a�|''gwup.recipe##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds gwup.net
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1415183545(BasicNewsRecipe):
    title = u'GWUP | Die Skeptiker'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of GWUP  die Skeptiker'
    publisher = 'Gesellschaft zur wissenschaftlichen Untersuchung von Parawissenschaften e.V. (GWUP)'
    category = 'science and critical thinking, Germany'
    language = 'de'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Aktuelle Artikel', u'http://blog.gwup.net/feed/'),
             (u'Kommentare', u'http://blog.gwup.net/comments/feed/')]
PK�X�����	h3.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement

__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'

from calibre.web.feeds.news import BasicNewsRecipe


class H3(BasicNewsRecipe):
    title = u'H\xedrszerz\u0151'
    oldest_article = 5
    max_articles_per_feed = 50
    language = 'hu'

    __author__ = 'Ezmegaz'

    feeds = [
        (u'Belf\xf6ld',
         u'http://www.hirszerzo.hu/rss.belfold.xml'),
        (u'K\xfclf\xf6ld',
         u'http://www.hirszerzo.hu/rss.kulfold.xml'),
        (u'Profit',
         u'http://www.hirszerzo.hu/rss.profit.xml'),
        (u'Shake',
         u'http://www.hirszerzo.hu/rss.shake.xml'),
        (u'Publicisztika',
         u'http://www.hirszerzo.hu/rss.publicisztika.xml'),
        (u'Elemz\xe9s',
         u'http://www.hirszerzo.hu/rss.elemzes.xml'),
        (u'Sorok k\xf6z\xf6tt',
         u'http://www.hirszerzo.hu/rss.sorok_kozott.xml'),
        (u'Gal\xe9ria',
         u'http://www.hirszerzo.hu/rss.galeria.xml'),
        (u'Patro',
         u'http://www.hirszerzo.hu/rss.patro.xml')]
PK�X����haaretz_en.png�PNG


IHDR��7�cIDATx�c ��K�g�@,��
�\�C\����`&$h���0���'���@�	
�A�VP�����="�c�9��?�J`"��|�B*ev�f�IEND�B`�PK�XmV�T�
�
haaretz_en.recipe# -*- mode: python; coding: utf-8; -*-
# vim: set syntax=python fileencoding=utf-8

__license__ = 'GPL v3'
__copyright__ = '2010-2022, Darko Miletic <darko.miletic at gmail.com>'
'''
www.haaretz.com
'''

from calibre.web.feeds.news import BasicNewsRecipe
try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode


class Haaretz_en(BasicNewsRecipe):
    title = 'Haaretz'
    __author__ = 'Darko Miletic'
    description = "Haaretz.com is the world's leading English-language Website for real-time news and analysis of Israel and the Middle East."
    publisher = 'Haaretz'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en_IL'
    needs_subscription = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'url'}
    publication_type = 'newspaper'
    PREFIX = 'https://www.haaretz.com'
    LOGIN = 'https://services.haaretz.com/ms-sso/loginUrlEncoded'
    LOGOUT = 'https://services.haaretz.com/ms-sso/logout'
    extra_css             = """
                                body{font-family: Merriweather, "Helvetica Neue", Helvetica, Arial, sans-serif }
                                div.mx time{display: none}
                                div.my time{display: none}
                                div.mq time{display: none}
                                div.mr time{display: none}
                            """

    conversion_options = {
        'comment': description, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(name='div', attrs={'data-test': 'articleHeader'}),
        dict(attrs={'data-test': 'articleBodyImage'}),
        dict(name='div', attrs={'class': ['bu a b d e ', 'bu a b d e']}),
        dict(name='div', attrs={'data-test': 'articleBody'})
    ]
    remove_attributes = ['width', 'height']
    remove_tags = [
        dict(name=['div', 'ul', 'button', 'svg'], attrs={'data-test': [
            'audioPlayer', 'newsletter', 'relatedArticles', 'tags', 'writerAlertButton', 'IconAlefLogo']})
    ]

    feeds = [

    (u'Headlines', 'https://www.haaretz.com/srv/haaretz-latest-headlines'),
    (u'Opinion', 'https://www.haaretz.com/srv/opinion-rss'),
    (u'Security & Aviation', 'https://www.haaretz.com/srv/security-&-aviation-rss'),
    (u'Israel News', 'https://www.haaretz.com/srv/israel-news-rss'),
    (u'World News', 'https://www.haaretz.com/srv/world-news-rss'),
    (u'Jewish World', 'https://www.haaretz.com/srv/jewish-world-rss'),
    (u'Business', 'https://www.haaretz.com/srv/business-rss'),
    (u'Science & Health', 'https://www.haaretz.com/srv/science-&-health-rss'),
    (u'Life & Culture', 'https://www.haaretz.com/srv/life-&-culture-rss'),
    (u'Books', 'https://www.haaretz.com/srv/books-rss'),
    (u'Food', 'https://www.haaretz.com/srv/food-rss')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.PREFIX)
        if self.username is not None and self.password is not None:
            data = urlencode(
                {
                    'newsso': 'true',
                    'fromlogin': 'true',
                    'site': '85',
                    'layer': 'login',
                    'anonymousId': '16549476476914546',
                    'userName': self.username,
                    'password': self.password
                }
            )
            br.open(self.LOGIN, data)
        return br
PK�X8����habr.png�PNG


IHDR00`�	��PLTEw��v��������v��u��y��v��{���������z��}��������������������������ٸ������ֆ��������|�����������������������֏�Í�¬�������y��������t����懭�z�����{���������������������򂪼�j#�IDATx^��5��@DQ5�����0<�_���r�D_�~Y7+�T(.p����c�'���
t�l P@P�P����(�B�+�D�J��@�n��  �2���4<�(���Q"�&��|����:l������z:����0����s<��@�g[/�K� �!��(I�v���VEz�eMIEND�B`�PK�Xu#����habr.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Habr(BasicNewsRecipe):
    title = 'Habr'
    __author__ = 'bugmen00t'
    description = 'Russian collaborative blog about IT, computer science and anything related to the Internet'
    publisher = 'Habr Blockchain Publishing LTD'
    category = 'blog'
    cover_url = u'https://hsto.org/webt/f1/lq/ka/f1lqkaveikdfqkb_rip_4vq4s_8.png'
    language = 'en_RU'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 30
    max_articles_per_feed = 30

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'tm-misprint-area'})

    remove_tags = [
        dict(name='div', attrs={'class': 'tm-article-presenter__meta'}),
        dict(name='div', attrs={'class': 'tm-article-poll'})
    ]

    feeds = [('News', 'https://habr.com/en/rss/news/?fl=en'),
             ('All materials', 'https://habr.com/en/rss/all?fl=en')]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X8����habr_ru.png�PNG


IHDR00`�	��PLTEw��v��������v��u��y��v��{���������z��}��������������������������ٸ������ֆ��������|�����������������������֏�Í�¬�������y��������t����懭�z�����{���������������������򂪼�j#�IDATx^��5��@DQ5�����0<�_���r�D_�~Y7+�T(.p����c�'���
t�l P@P�P����(�B�+�D�J��@�n��  �2���4<�(���Q"�&��|����:l������z:����0����s<��@�g[/�K� �!��(I�v���VEz�eMIEND�B`�PK�X5}yg++habr_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Habr(BasicNewsRecipe):
    title = '\u0425\u0430\u0431\u0440'
    __author__ = 'bugmen00t'
    description = '\u041D\u0430 \u200B\u0425\u0430\u0431\u0440\u0435 \u200B\u0434\u0443\u043C\u0430\u044E\u0449\u0438\u0435 \u200B\u043B\u044E\u0434\u0438 \u200B\u0434\u0435\u043B\u044F\u0442\u0441\u044F \u200B\u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u043C \u200B\u200B\u043E\u043F\u044B\u0442\u043E\u043C. \u200B\u200B\u0417\u0434\u0435\u0441\u044C \u0431\u0443\u0434\u0435\u0442 \u200B\u200B\u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u043E \u200B\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u043E \u200B\u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0438\u0441\u0442\u0430\u043C \u200B\u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u0430\u043C, \u200B\u200B\u0430\u0434\u043C\u0438\u043D\u0430\u043C \u200B\u0438 \u0440\u0435\u043A\u043B\u0430\u043C\u0449\u0438\u043A\u0430\u043C, \u200B\u0430\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430\u043C \u200B\u0438 \u0434\u0438\u0437\u0430\u0439\u043D\u0435\u0440\u0430\u043C, \u200B\u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u0430\u043C \u200B\u0432\u044B\u0441\u0448\u0435\u0433\u043E \u200B\u0438 \u0441\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u200B\u0437\u0432\u0435\u043D\u0430, \u200B\u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0430\u043C \u200B\u043A\u0440\u0443\u043F\u043D\u044B\u0445 \u200B\u043A\u043E\u043C\u043F\u0430\u043D\u0438\u0439 \u200B\u0438 \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u200B\u0444\u0438\u0440\u043C, \u200B\u0430 \u0442\u0430\u043A\u0436\u0435 \u200B\u0432\u0441\u0435\u043C \u200B\u0442\u0435\u043C, \u200B\u0434\u043B\u044F \u043A\u043E\u0433\u043E \u200BIT \u2014 \u200B\u044D\u0442\u043E \u043D\u0435 \u043F\u0440\u043E\u0441\u0442\u043E \u200B\u0434\u0432\u0435 \u0431\u0443\u043A\u0432\u044B \u200B\u0430\u043B\u0444\u0430\u0432\u0438\u0442\u0430.'  # noqa
    publisher = 'Habr Blockchain Publishing LTD'
    category = 'blog'
    cover_url = u'https://habr.com/img/habr_ru.png'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 50

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'tm-misprint-area'})

    remove_tags = [
        dict(name='div', attrs={'class': 'tm-article-presenter__meta'}),
        dict(name='div', attrs={'class': 'tm-article-poll'})
    ]

    feeds = [
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://habr.com/ru/rss/news/?fl=ru'
        ),
        (
            '\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://habr.com/ru/rss/all/all/?fl=ru'
        ),
        (
            '\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u226510',
            'https://habr.com/ru/rss/all/top10/?fl=ru'
        ),
        (
            '\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u226525',
            'https://habr.com/ru/rss/all/top25/?fl=ru'
        ),
        (
            '\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u226550',
            'https://habr.com/ru/rss/all/top50/?fl=ru'
        ),
        (
            '\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u2265100',
            'https://habr.com/ru/rss/all/top100/?fl=ru'
        ),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X����GGhackernews.png�PNG


IHDR  ��tRNSn��	pHYsOOc����IDATH��V�+DQ��W���da%�QJvԘ��B��df��|D���S�,d+a!�BY�1B�'D4����9�=�$2�潢�n�w�9�~��sλ"�p�5ɹ�޵��3�"�-}o ��\N������g]�̇7��wյGf2se��h�!r��L��L�,iZ	#V\� r����I�]�I �	�a��|5�ׂ��eV�ASvZ���L~��Z��!��@5�yd]�LL�����[t$D?��­y6 ��,�<qH���-1ц��`-��x�g-9�: v�qm���.x�wWy�>�#��
�)���W@�u��Kw��*�BKbq�Yl`{�_��3��a/��%���t4���)d�[2��Q:5
����a^z-�uS��J�r�}*��b^*��D�W�v'��*�J�.@"�Um��6��8��[��u�V�+⿍��\�:]��*�7d��/^����+�����IEND�B`�PK�X�*‚��hackernews.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
'''
Hacker News
'''
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile
try:
    from urllib.parse import urlparse
except ImportError:
    from urlparse import urlparse
import re


class HNWithCommentsLink(BasicNewsRecipe):
    title = 'HN With Comments Link'
    __author__ = 'Tom Scholl & David Kerschner'
    description = u'Hacker News, run by Y Combinator. Anything that good hackers would find interesting, with a focus on programming and startups.'
    publisher = 'Y Combinator'
    category = 'news, programming, it, technology'
    delay = 1
    max_articles_per_feed = 30
    use_embedded_content = False
    no_stylesheets = True
    encoding = 'utf-8'
    language = 'en'
    requires_version = (0, 8, 16)

    feeds = [
        (u'Hacker News', 'https://news.ycombinator.com/rss')
    ]

    temp_files = []
    articles_are_obfuscated = True

    def get_readable_content(self, url):
        self.log('get_readable_content(' + url + ')')
        br = self.get_browser()
        f = br.open(url)
        html = f.read()
        f.close()

        return self.extract_readable_article(html, url)

    def get_hn_content(self, url):
        self.log('get_hn_content(' + url + ')')
        soup = self.index_to_soup(url)
        main = soup.find('tr').findNextSiblings('tr', limit=2)[1].td

        title = self.tag_to_string(main.find('td', 'title'))
        link = main.find('td', 'title').find('a')['href']
        if link.startswith('item?'):
            link = 'https://news.ycombinator.com/' + link
        readable_link = link.rpartition('http://')[2].rpartition('https://')[2]
        subtext = self.tag_to_string(main.find('td', 'subtext'))

        title_content_td = main.find('td', 'title').findParent(
            'tr').findNextSiblings('tr', limit=3)[2].findAll('td', limit=2)[1]
        title_content = u''
        if not title_content_td.find('form'):
            title_content_td.name = 'div'
            title_content = title_content_td.prettify()

        comments = u''
        for td in main.findAll('td', 'default'):
            comhead = td.find('span', 'comhead')
            if comhead:
                com_title = u'<h4>' + \
                    self.tag_to_string(comhead).replace(
                        ' | link', '') + u'</h4>'
                comhead.parent.extract()
                br = td.find('br')
                if br:
                    br.extract()
                reply = td.find('a', attrs={'href': re.compile('^reply?')})
                if reply:
                    reply.parent.extract()
                td.name = 'div'
                indent_width = (int(td.parent.find('td').img['width']) * 2) / 3
                td['style'] = 'padding-left: ' + str(indent_width) + 'px'
                comments = comments + com_title + td.prettify()

        body = u'<h3>' + title + u'</h3><p><a href="' + link + u'">' + readable_link + \
            u'</a><br/><strong>' + subtext + u'</strong></p>' + title_content + u'<br/>'
        body = body + comments
        return u'<html><title>' + title + u'</title><body>' + body + '</body></html>'

    def parse_feeds(self):
        a = super(HNWithCommentsLink, self).parse_feeds()
        self.hn_articles = a[0].articles
        return a

    def get_obfuscated_article(self, url):
        if url.startswith('https://news.ycombinator.com'):
            content = self.get_hn_content(url)
        else:
            # TODO: use content-type header instead of url
            is_image = False
            for ext in ['.jpg', '.png', '.svg', '.gif', '.jpeg', '.tiff', '.bmp', ]:
                if url.endswith(ext):
                    is_image = True
                    break

            if is_image:
                self.log('using image_content (' + url + ')')
                content = u'<html><body><img src="' + url + u'"></body></html>'
            else:
                content = self.get_readable_content(url)

            article = 0
            for a in self.hn_articles:
                if a.url == url:
                    article = a

        content = re.sub(r'</body>\s*</html>\s*$', '', content) + \
            article.summary + '</body></html>'

        if not isinstance(content, bytes):
            content = content.encode('utf-8')
        self.temp_files.append(PersistentTemporaryFile('_fa.html'))
        self.temp_files[-1].write(content)
        self.temp_files[-1].close()
        return self.temp_files[-1].name

    def is_link_wanted(self, url, tag):
        if url.endswith('.pdf'):
            return False
        return True

    def prettyify_url(self, url):
        return urlparse(url).hostname

    def populate_article_metadata(self, article, soup, first):
        article.text_summary = self.prettyify_url(article.url)
        article.summary = article.text_summary

#    def parse_index(self):
#        feeds = []
#        feeds.append((u'Hacker News',[{'title': 'Testing', 'url': 'https://news.ycombinator.com/item?id=2935944'}]))
#        return feeds
PK�X
��a!!haderslevlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X3+�X~~haderslevlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Haderslev
'''


class HaderslevLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Haderslev'
    description = 'Lokale og regionale nyheder, sport, kultur fra Haderslev og omegn på haderslev.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Haderslev', 'http://haderslev.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Haderslev', 'http://haderslev.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Haderslev', 'http://haderslev.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Haderslev', 'http://haderslev.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Haderslev', 'http://haderslev.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Haderslev', 'http://haderslev.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X�zNf!	!	
haksoz.png�PNG


IHDR  ���IDATxڕ�\Z�:���n�ӡK�����M�`����E����1��\��w�����}Nq�+r�mwmi��4���uJ��G���
�ɭa�?^X��v�_5���r���l�e���?���տ����Jnj�銊���3�f:�J�ғ�?g05�3��xRC�ƕ�����ǵ��ښ��a�1>�������/��_�sG�T!�����ݽ�7��ۿO�H��� �0�(��(��q}�;N�3
��_rb`^�EJ����A$߆]>�+vL����)�-���P��/ݽ|�"��v�8�tZ��]�+��j��lvD���9�4B��q�kg�A' g��G�H�mei�
����<� ;�(��8c,��19�6&�868�xa��c�YP^^TC�,>LS��E\8������:��gq�:�
RQ8�a���	�`�� ��3r��)�K>�q��<+=���t^��b�4���;��LO�$�ӹz�P�{5F�ѭO��֙���i�M����Zh�!q�Ȅ<���E5/
�ԛk����^5"���(��t�
�{�����?ؐ����ւ��p�s�#�����q�PIἿa 
�p\�� ���,'�"����Nq-5]�vi�?E��6���q��61���`�g'vD]R��u�+'�%,��\�</����Ɗ�����1�����z��Z���
�o� ˫������(��jz�$�Tt���Pw�]�#u��]�H��������.�]�1�=!��>t�Ycq`~5��.��������y�8����3O�+e9\�M�4n�pkm����폑ҟ���p�}�w�Ro�!o�.�͈��P�j>?�$�6B�C�/,~��Z��%ŋ�?|c�%8�L�=�����L�ff��I�Ut��S��v@���
�m���Hff��#�#����r�YM�
o\/����'W��Q�l�s�K���@
�%̋�m�L�"c��8@!. �5$]~�rQwR���8#"�|�6��[W�U����)��ɤe���
l�p61�x�ck�_Q܌R�T�j�'��?G_�M����/
D���_��Fr^/��K�G����h?B�##>���_�;;��Wse��6�7�A��~�f,wO(�X�����[_����DX����@��R�������%�u��D�L
-uO�ZFȻF�d/.,��Q��QB�W(��@������H!��H�^?�J7�V:!�z!�d����Z�)������zw��������Gq~=Z��Z7���A��xK�ȝ������Ec�x��8��"������;5�������\ב���5���8(�ԐRi���a��F�x��p�3,��4
qL�*Y]^��Z5o��3K���9�N��QH����VKtP���o�I)��Y��Mui�p���ښ&��3��|�4O�4K�����;���+\�t��uH�uH�K	r!<�[�fp@��:n�O2-����8;�+�*e3j�V&�g�<Z�L�ۤ�:��X_�4�$��`�,e��!�=F/�
�[�<�09�Xr���=*H���f�Y^\+�T�����W�
�+����3�Bp�XB�k�3��]H�BU�cF����J
�*i��ό��G�B܈����MF>'���������K�53�<f~����i0�3;ʛ,$���3K���!�������w�XT!�$9�~b ��Rj�ťũ��������lVw����Y�M�����tRu�_~r���0Zr0��WH���+��VrA�N�M��K�#��]�|����6lo�N�͔Pk��5�-���|SuwKU1�nfB�$+����Q��`k��ƕ�|��]%>ԉ�a�	��$%�TT�x �0��'�V���s`�g�{FKnZ������RY�����:��=M���_+[�|����9�
���rz����,��*�O���33ɻ�Ŧ�*�9Fn-��FN�J�j�:���;�WNj��”�r�+��X����#}�lfc-���~kmoQnm9�����,��Ϟx�3�ȭ
�*'��a*X�5P��i�%%�-�;f��{�Wx��M=U�.JZ#�*���&?\�W����Q�v�w��0��R���^��ʹY�����mS��hSm�����P��tr%X�?]]W~uq���/9�>�<	�!�;"C���9��GsK��og��L�����IEND�B`�PK�X��5�@@
haksoz.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1324739199(BasicNewsRecipe):
    title = u'Haks\xf6z'
    oldest_article = 7
    max_articles_per_feed = 20
    auto_cleanup = True
    language = 'tr'
    __author__ = 'asalet_r'

    feeds = [(u'Haks\xf6z', u'http://www.haksozhaber.net/rss/')]
PK�X
��a!!halsnaeslokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X`�;��hamilton_spectator.png�PNG


IHDR  ��tRNSn���IDATx���+I����m۶m۶�m۶mMl;c{&v��tk{����u��J�6�r��w���Ͽ/�W{��l���ώ��9�}v>��٥���9�ܩ'K›���{���]�_���W{FHK��+�աw�yg�*&��xs�x�rk�����,6WQv�,�L]��c���/x~����	�RGU����;w���%��!���ȫ�܇T�kBo�����E7�0s�/����}��&�ʜ��*����bs�у��ua���i#5O�5X��:��´<E-�W����QҒ��J���ա~�
�K�O����ZzJ6���*_^�
�D䙡-_j�>u�����t�!8,Q�D���M[�"�!��=m���7�z���)jJ��5T�ׇ���k軳w�4F�Z�9n�*�.�馼���:j�m�	v�	�N5;T�wo�1CU��?����P�O��2�]s����'�'S���}�lˍ3L/�t��"`D���"�q�Ls�]��168k�I�8��q��&�����\L[g��^0^�7��O,�!�싳�\�xs��i���Z��+���
k5T��|���T�R�4M9$���"	�ʨ�-�c�(�*�����җ���a0�eӵ���-4UZ*�pp_���ֆ�.�Y�oΛ�.��xEi:��|S^��vwۚ��6�=8ߖJ�M�C�ɩyd��k����P<��R'ŏ/�;�B'SÍp�$Cc$1JVұ���t�kG�"xtv�<[2��6�D*e,<@��C2]S~�L�GM0��z��/ _f��-����������s��2�p�,s4�g_"�2��A
��f���|�r��)�e
�}�Ѡm��q��`��}zK��o@E*�F�g�:���+/�	��\���#D�p������%Rp�O�ԌU��������J�+TZ����PI*E�~o�����z�u�f�����y��K��޹Y:�ֆ&*���$A�
�Tګ���CBF�FW�X�c����N=$��D���U��F��Q���3��̾�O2���Ԩ�}l�e%Y��h�e��A��0*��dQC�����.i�'�er@���7g�X2�M�|�]�EJ��?���G�85`\9����`NTbwϱ��!��E?@بC�N���9����6���9�`<�	
nq�1	`㼱�u��c�d5��(:�����ke�^3�x�3I#�|�Pze��@
�Q���_m�g�q�cS���a�Ip�h�(�$��1��lʳV+1F�UX�pC.��Ϊ�c�~r��M��L�;��EJ���O�^R��;�XX�OLM�R�m3y���5�O��彸Z;���]-�ַ����Ex��IEND�B`�PK�X9�p��hamilton_spectator.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from calibre.ptempfile import PersistentTemporaryFile

'''
Hamilton Spectator Calibre Recipe
'''


class HamiltonSpectator(BasicNewsRecipe):
    title = u'Hamilton Spectator'
    max_articles_per_feed = 50
    __author__ = u'unkn0wn'
    publisher = u'thespec.com'
    description = u'Ontario Canada Newspaper'
    category = u'News, Ontario, Canada'
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en_CA'
    encoding = 'utf-8'
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://bloximages.chicago2.vip.townnews.com/thespec.com/content/tncms/custom/image/c0094646-1108-11ee-8af0-b3954ce40e5e.png'

    ignore_duplicate_articles = {'title'}
    articles_are_obfuscated = True

    extra_css = '''
        .caption { font-size:small; text-align:center; }
        .authorList, .endnote_contrib { font-size:small; }
    '''

    keep_only_tags = [
        classes(
            'headline asset-summary authorList articleMainArt asset-body'
        )
    ]

    remove_tags = [
        dict(name=['svg', 'button']),
        dict(attrs={'id':['tncms-region-article_instory_top', 'tncms-region-article_bottom', 'asset-video-primary']}),
        classes(
            'tnt-blurred-image share-container subscriber-offers access-offers-in-page '
            'access-offers-wrapper tnt-ads-container adLabelWrapperManual shareIcons '
            'articleFeedbackCTA comments-container card-image'
        )
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-srcset':True}):
            for x in img['data-srcset'].split(','):
                if '640w' in x.split():
                    img['src'] = x.split()[0]
        return soup

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/', 'podcast'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = []

    sections = [
        'news', 'politics', 'opinion', 'business', 'sports', 'life', 'entertainment'
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:thespec.com{}&hl=en-CA&gl=IN&ceid=CA:en'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    feeds.append(('Others', a.format('')))
PK�XNz���handelsblatt.png�PNG


IHDR(-SNPLTE����� �������D�0��T�Z��d��p��Ϡ�۷������������������
F�MIDATxڝ�
�0�ٍ=��/ڟ`�C?|��Ep�.Hm+�9엩�zd4h�W�[�����ņa�D���Q�4�V�wtYQ'IEND�B`�PK�X����) ) handelsblatt.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Aimylios <aimylios at gmx.de>

from __future__ import unicode_literals, division, absolute_import, print_function

'''
handelsblatt.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Handelsblatt(BasicNewsRecipe):
    title = 'Handelsblatt'
    __author__ = 'Aimylios'  # based on the work of malfi and Hegi
    description = 'RSS-Feeds von Handelsblatt.com'
    publisher = 'Verlagsgruppe Handelsblatt GmbH'
    publication_type = 'newspaper'
    needs_subscription = 'optional'
    language = 'de'

    oldest_article = 2
    max_articles_per_feed = 15
    simultaneous_downloads = 10
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}

    conversion_options = {'smarten_punctuation': True,
                          'publisher': publisher}

    # uncomment this to reduce file size
    # compress_news_images          = True
    # compress_news_images_max_size = 16

    login_url = 'https://id.handelsblatt.com/login?service=https://www.handelsblatt.com'
    cover_source = 'https://www.ikiosk.de/shop/epaper/handelsblatt.html'
    masthead_url = 'https://www.handelsblatt.com/images/logo_handelsblatt/11002806/8-formatOriginal.png'

    feeds = [
        ('Top-Themen', 'http://www.handelsblatt.com/contentexport/feed/top-themen'),
        ('Politik', 'http://www.handelsblatt.com/contentexport/feed/politik'),
        ('Unternehmen', 'http://www.handelsblatt.com/contentexport/feed/unternehmen'),
        ('Finanzen', 'http://www.handelsblatt.com/contentexport/feed/finanzen'),
        ('Technologie', 'http://www.handelsblatt.com/contentexport/feed/technologie'),
        ('Panorama', 'http://www.handelsblatt.com/contentexport/feed/panorama')
    ]

    keep_only_tags = [
        dict(name='div', attrs={'class': ['vhb-article-container']})
    ]

    remove_tags = [
        dict(name='span', attrs={'class': ['vhb-colon', 'vhb-label-premium']}),
        dict(name='aside', attrs={'class': ['vhb-article-element vhb-left',
                                            'vhb-article-element vhb-left vhb-teasergallery',
                                            'vhb-article-element vhb-left vhb-shorttexts']}),
        dict(name='aside', attrs={'class': re.compile('vhb-club-events')}),
        dict(name='article', attrs={'class': ['vhb-imagegallery vhb-teaser',
                                              'vhb-teaser vhb-type-video']}),
        dict(name='small', attrs={'class': ['vhb-credit']}),
        dict(name='div', attrs={'class': ['dg_health', 'fb-post', 'header-bar',
                                          'lb_consent--placeholder',
                                          'lb-item embed', 'lb-post-actions',
                                          'mod--displaynone', 'white_content',
                                          'opinary-widget-wrapper',
                                          'vhb-article__content-element--shorttextgallery',
                                          'vhb-hollow-area vhb-hollow-area--col-1']}),
        dict(name='div', attrs={'class': re.compile('stepstone')}),
        dict(name='div', attrs={'class': re.compile('vhb-imagegallery')}),
        dict(name='div', attrs={'id': ['highcharts_infografik']}),
        dict(name='div', attrs={'id': re.compile('dax-sentiment')}),
        dict(name=['div', 'section'], attrs={'class': re.compile('slider')}),
        dict(name='a', attrs={'class': ['twitter-follow-button']}),
        dict(name='img', attrs={'class': ['highlight-icon', 'lb-author__avatar', 'pin-icon']}),
        dict(name='img', attrs={'alt': re.compile('Handelsblatt Morning Briefing')}),
        dict(name=['blockquote', 'button', 'link'])
    ]

    preprocess_regexps = [
        # insert ". " after the location at the beginning of an article
        (re.compile(r'(<span class="hcf-location-mark">[^<]+)(</span>)',
                    re.IGNORECASE), lambda match: match.group(1) + '. ' + match.group(2)),
        # insert ": " between title and text of captions
        (re.compile(r'(<em itemtype="text" itemprop="name" class="vhb-title">[^<]+)(</em>)',
                    re.IGNORECASE), lambda match: match.group(1) + ': ' + match.group(2)),
        # convert "data-src" to "src" attributes
        (re.compile(r'( data-src=")([^"]*")', re.IGNORECASE), lambda match: ' src="' + match.group(2))
    ]

    extra_css = 'h2 {font-size: 1em; text-align: left} \
                 h3 {font-size: 1em; text-align: left} \
                 h4 {font-size: 1em; text-align: left; margin-bottom: 0em} \
                 em {font-style: normal; font-weight: bold} \
                 .vhb-subline {font-weight: normal; text-transform: uppercase} \
                 .vhb-headline {font-size: 1.6em} \
                 .vhb-teaser-head {margin-top: 1em; margin-bottom: 1em} \
                 .vhb-hollow-area--innercontent {font-size: 0.6em} \
                 .hcf-location-mark {font-weight: bold} \
                 .lb-post-header {margin-top: 1em} \
                 .panel-body p {margin-top: 0em}'

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            try:
                br.open(self.login_url)
                br.select_form(nr=0)
                br['login'] = self.username
                br['password'] = self.password
                br.submit()
            except Exception as e:
                self.log('Login failed with error:', str(e))
        return br

    def get_cover_url(self):
        cover_url = ''
        soup = self.index_to_soup(self.cover_source)
        img = soup.find('img', {'alt': 'Handelsblatt - ePaper;', 'src': True})
        if img and img['src']:
            cover_url = img['src']
        return cover_url

    def print_version(self, url):
        main, sep, name = url.rpartition('/')
        return main + '/v_detail_tab_print/' + name

    def preprocess_html(self, soup):
        # remove all articles without relevant content (e.g., videos)
        article = soup.find('div', {'class': 'vhb-article-container'})
        if article is None:
            self.abort_article()
        return soup

    def postprocess_html(self, soup, first_fetch):
        # convert lists of author(s) and date(s) into simple text
        for cap in soup.find_all('div', {'class': re.compile('vhb-article-caption')}):
            cap.replace_with(cap.encode_contents().decode('utf-8').strip() + ' ')
        for row in soup.find_all('div', {'class': 'vhb-article-author-row'}):
            for ul in row.find_all('ul'):
                entry = ''
                for li in ul.find_all(lambda tag: tag.name == 'li' and not tag.attrs):
                    entry += self.tag_to_string(li).strip() + ', '
                for li in ul.find_all(lambda tag: tag.name == 'li' and tag.attrs):
                    entry += self.tag_to_string(li)
                ul.parent.replace_with(entry)
        # remove all local hyperlinks
        for a in soup.find_all('a', {'href': True}):
            if '.handelsblatt.com/' in a['href']:
                a.replace_with(a.encode_contents().decode('utf-8'))
        # make sure that all figure captions (including the source) are shown
        # without linebreaks by using the alternative text given within <img/>
        # instead of the original text (which is oddly formatted)
        for fig in soup.find_all('figcaption', {'class': 'vhb-inline-picture'}):
            cap = fig.find('img')['alt']
            fig.find('div', {'class': 'vhb-caption'}).replace_with(cap)
        # remove references to related articles
        for strong in soup.find_all('strong'):
            if strong.string and (re.match('^Mehr:? ?', strong.string) or re.match('^>>.*', strong.string)):
                p_parent = strong.find_parent('p')
                if p_parent:
                    p_parent.decompose()
        # clean up remainders of embedded content
        for div in soup.find_all('div', {'style': True}):
            if len(div.attrs) == 1:
                del div['style']
        return soup
PK�X�g��
hankyoreh.png�PNG


IHDR�a�IDATx�c�	�,����R�π�H���4@	��U���!��H����$�T5@��I�
�1k�0��K��
���?�bSb5�C5�G�7�5��	+c�*�aAؐ=XXJJ 
�B ���x:scS
�~��_,�QIEND�B`�PK�X2���hankyoreh.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2011, Seongkyoun Yoo <seongkyoun.yoo at gmail.com>'
'''
Profile to download The Hankyoreh
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Hankyoreh(BasicNewsRecipe):
    language = 'ko'
    title = u'한겨례'
    description = u'The Hankyoreh News articles'
    __author__ = 'Seongkyoun Yoo'
    oldest_article = 7
    max_articles_per_feed = 10
    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = [
        dict(name='div', attrs={'class': ['article-head']}),
        dict(name='div', attrs={'class': ['article-text']}),
    ]
    remove_tags = [
        dict(name='p', attrs={'class': ['category']}),
    ]
    remove_tags_after = dict(id={'ad_box01'})

    feeds = [
        (u'정치',     'http://www.hani.co.kr/ilram/rss/hkr_news_list_politics.xml'),
        (u'사회',     'http://www.hani.co.kr/ilram/rss/hkr_news_list_society.xml'),
        (u'문화',     'http://www.hani.co.kr/ilram/rss/hkr_news_list_culture.xml'),
        (u'스포츠',   'http://www.hani.co.kr/ilram/rss/hkr_news_list_sports.xml'),
        (u'사설·칼럼', 'http://www.hani.co.kr/ilram/rss/hkr_news_list_opinion.xml'),
        (u'만화만평', 'http://www.hani.co.kr/ilram/rss/hkr_news_list_cartoon.xml'),
    ]
PK�X�nJ�hankyoreh21.png�PNG


IHDR�a�IDATxڤ��K@�ضm۶�Bl�N1eƶQ�m�Y�ڞ�����=}%��hb�?�z�`��I�Ӆ��(|��j�S@��O�6팭c?�RF�r5���k�<�4M�b�o�g/��h&�3!��5qV2�ųl�O5��ӝc��l؇�A��%gI|�w8t�H���]bV{�٩DeEg�5iN��'䬅�����9v:J���N�JJ�GP�3���c�k�0J�k	ߺ����χV�6�g������MR�_6����jVc��P�9j��B�$�� ��a¡��0�s�8֡c��ZB�fdzu7�L��xM$P
��S��?���xH�nwb��:^���W0I��#�2n��hY��<'��b!��*�	��Wݰ�R��-�E�X�&�N�I8y��'�jH���ϟ?c��Р(45�N�1�Ľ�#�|��/Ë�]�aE���ٳ�)�P����IEND�B`�PK�X#R壎�hankyoreh21.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Seongkyoun Yoo <seongkyoun.yoo at gmail.com>'
'''
Profile to download The Hankyoreh
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Hankyoreh21(BasicNewsRecipe):
    title = u'Hankyoreh21'
    language = 'ko'
    description = u'The Hankyoreh21 Magazine articles'
    __author__ = 'Seongkyoun Yoo'
    oldest_article = 30
    max_articles_per_feed = 10
    no_stylesheets = True
    remove_javascript = True
    keep_only_tags = [
        dict(name='header', attrs={'class': ['article_head']}),
        dict(name='div', attrs={'class': ['article_body']}),
    ]
    remove_tags = [
        dict(name='div', attrs={'class': ['article_tools']}),
    ]

    feeds = [
        # ('전체기사',  'http://h21.hani.co.kr/rss/'),
        ('표지이야기', 'http://h21.hani.co.kr/rss/cover/'),
        ('특집',      'http://h21.hani.co.kr/rss/special/'),
        ('정치',      'http://h21.hani.co.kr/rss/politics/'),
        ('경제',      'http://h21.hani.co.kr/rss/economy/'),
        ('사회',      'http://h21.hani.co.kr/rss/society/'),
        ('세계',      'http://h21.hani.co.kr/rss/world/'),
        ('문화',      'http://h21.hani.co.kr/rss/culture/'),
    ]

    def get_article_url(self, article):
        org_url = BasicNewsRecipe.get_article_url(self, article)
        return "http://h21.hani.co.kr" + org_url if org_url[0] == '/' else org_url
PK�XDf;"��hannoversche_zeitung.png�PNG


IHDR(-S?PLTEj�"""###+++333666888DDDLLLUUUfffwww������������������������XIDATxڜ���@E��[]3�|���-�s.�0�=��B^�jg��s+r��y%�*�o!-���[
�M��#�a��S�2��IIEND�B`�PK�X�T�*��hannoversche_zeitung.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1287519083(BasicNewsRecipe):
    title = u'Hannoversche Allgemeine Zeitung'
    oldest_article = 1
    __author__ = 'Artemis'
    max_articles_per_feed = 30
    language = 'de'
    no_stylesheets = True

    feeds = [
        # (u'Schlagzeilen', u'http://www.haz.de/rss/feed/haz_schlagzeilen'),
        (u'Politik', u'http://www.haz.de/rss/feed/haz_politik'),
        (u'Wirtschaft', u'http://www.haz.de/rss/feed/haz_wirtschaft'),
        (u'Panorama', u'http://www.haz.de/rss/feed/haz_panorama'),
        (u'Wissen', u'http://www.haz.de/rss/feed/haz_wissen'),
        (u'Kultur', u'http://www.haz.de/rss/feed/haz_kultur'),
        (u'Sp\xe4tvorstellung', u'http://www.haz.de/rss/feed/haz_spaetvorstellung'),
        (u'Hannover & Region', u'http://www.haz.de/rss/feed/haz_hannoverregion'),
        (u'Netzgefl\xfcster', u'http://www.haz.de/rss/feed/haz_netzgefluester'),
        (u'Meinung', u'http://www.haz.de/rss/feed/haz_meinung'),
        (u'ZiSH', u'http://www.haz.de/rss/feed/haz_zish'),
        (u'Medien', u'http://www.haz.de/rss/feed/haz_medien'),
        # (u'Sport', u'http://www.haz.de/rss/feed/haz_sport'),
        # (u'Hannover 96', u'http://www.haz.de/rss/feed/haz_hannover96')
    ]

    remove_tags_before = dict(id='modul_artikel')
    remove_tags_after = dict(id='articlecontent')

    remove_tags = dict(id='articlesidebar')

    remove_tags = [
        dict(name='div', attrs={'class': ['articlecomment',
                                          'articlebookmark', 'teaser_anzeige', 'teaser_umfrage',
                                          'navigation', 'subnavigation']})
    ]
PK�X$�@==harpers.png�PNG


IHDR  ��tRNSn���IDATxڥV�$K�PEt�D���ٳm۶m۶m�-fm�{��mۻ�gW���7:e�+3_��@+ �#D��zr�8	��DŽ�B�h �@�V
(>�@�B�H���y��=}=SkG?3[����}<u�>�l,@d�~�rK@�{��z&��I�5�u��PQq��������;a�_�8�5�0d�+���A]�Z���!��o�w
��0Y?�V�����X&\]��*U=�!k(�{yEՃW�B�DK�1{�WMN�F�Z�o������8�H4io0d��؄4dE����1�[HteU5~*VW���Eť���/-���l�Ē�q.^_�튘����+��P�Q�O-A���~ߘ�H�U�\�s.�`E�������La���L�bj��ˋ�O+{��c֧e�2H�3$<�]�Dp���6�f��� +����-fΚ�m���\����D�����s��M �r�+<�l
`h�����uI"V��1�Z�O,@:�X{
�J��N��j��ا��o�Q�T<(*.��d�*�u�-4N-@�q��,�4ե��G%J�ˑsO�,%�逸�y"&!C�mÉ蕾�ӷ���Y����{�M����z�z�1p.Q�}��3+ecfl*-�T0u��=W�L�_��������98���ZG����Е��7gkEe�*�����F��B������q�jl��:)�N^�_X����h;�f�N8k觓G�l�ʨ���Cs7�"D̉�O��Q-S���$��^{`���h�����L��E��o���\�(�a\�R�v^B�|Q/Z�x(W�׃A������E�e���"��3{�XƦ8�d�ܝy�lX�.,*1c����&L�lȪȘ$�F30w�;G[���7i_����"Ɨ��ݤ��[��L�ݡ�ԏ_���R:c�!��+z�7���3��0��
�z��g&E�J5��K�����c���K�'K�#G4�#j��/=�0[�iɬ�q�fsu�!K	�.�,!͆�Z/v�ݵ�xMIϙ�� �jRO��ݸ�zv�
1�6���2�9ЎV�&�M����"=+O�E��xW��uČ�m~�;",V�i��F��9yE����S��D�F���S����?�?�c��%e����_V^��]�=4���k�mz�A�	O�=ū4�y����O��}��-�.o�iz�F0k���ޝߵ�W�6�?�����;
L�IEND�B`�PK�X_v�d�	�	harpers.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
harpers.org
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Harpers(BasicNewsRecipe):
    title = u"Harper's Magazine"
    __author__ = u'Darko Miletic'
    language = 'en'
    description = u"Harper's Magazine: Founded June 1850."
    publisher = "Harper's Magazine "
    category = 'news, politics, USA'
    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(
            class_=[
                "article-content",
                "template-index-archive",  # harper's index
            ]
        )
    ]
    remove_tags = [
        dict(
            class_=[
                "component-newsletter-signup",
                "sidebar",
                "header-meta",
                "component-from-author",
                "from-issue",
                "d-none",
                "COA_roles_fix_space",
                "section-tags",
                "aria-font-adjusts",
                "component-share-buttons",
                "index-footer",
                "index-prev-link",
                "comma",
            ]
        ),
        # for harper's index
        dict(
            class_=[
                "aria-font-adjusts",
                "component-share-buttons",
                "index-footer",
                "index-prev-link",
            ]
        ),
    ]
    remove_attributes = ["style", "width", "height"]

    extra_css = """
    h1.article-title { font-size: x-large; margin-bottom: 0.4rem; }
    .subheading, .post-subtitle { font-size: large; font-style: italic; margin-bottom: 1rem; }
    .byline { margin-bottom: 1rem }
    .article-hero-img img, .flex-section-image img, .wp-caption img {
        display: block; margin-bottom: 0.3rem; max-width: 100%; height: auto;
        box-sizing: border-box;
    }
    .wp-caption-text { font-size: small; margin-top: 0.3rem; }

    .author-bio { margin-top: 2.5rem; font-style: italic; }
    .author-bio em { font-weight: bold; }

    .index-item { font-size: large; margin: 1rem 0; }
    .index-statement > p { display: inline-block; margin: 0.5rem 0; }
    .index-statement > span { display: inline-block; }
    .index-statement .index-tooltip { font-size: small; }
    """


    feeds = [(u"Harper's Magazine", u'https://harpers.org/feed/')]
PK�X$�@==harpers_full.png�PNG


IHDR  ��tRNSn���IDATxڥV�$K�PEt�D���ٳm۶m۶m�-fm�{��mۻ�gW���7:e�+3_��@+ �#D��zr�8	��DŽ�B�h �@�V
(>�@�B�H���y��=}=SkG?3[����}<u�>�l,@d�~�rK@�{��z&��I�5�u��PQq��������;a�_�8�5�0d�+���A]�Z���!��o�w
��0Y?�V�����X&\]��*U=�!k(�{yEՃW�B�DK�1{�WMN�F�Z�o������8�H4io0d��؄4dE����1�[HteU5~*VW���Eť���/-���l�Ē�q.^_�튘����+��P�Q�O-A���~ߘ�H�U�\�s.�`E�������La���L�bj��ˋ�O+{��c֧e�2H�3$<�]�Dp���6�f��� +����-fΚ�m���\����D�����s��M �r�+<�l
`h�����uI"V��1�Z�O,@:�X{
�J��N��j��ا��o�Q�T<(*.��d�*�u�-4N-@�q��,�4ե��G%J�ˑsO�,%�逸�y"&!C�mÉ蕾�ӷ���Y����{�M����z�z�1p.Q�}��3+ecfl*-�T0u��=W�L�_��������98���ZG����Е��7gkEe�*�����F��B������q�jl��:)�N^�_X����h;�f�N8k觓G�l�ʨ���Cs7�"D̉�O��Q-S���$��^{`���h�����L��E��o���\�(�a\�R�v^B�|Q/Z�x(W�׃A������E�e���"��3{�XƦ8�d�ܝy�lX�.,*1c����&L�lȪȘ$�F30w�;G[���7i_����"Ɨ��ݤ��[��L�ݡ�ԏ_���R:c�!��+z�7���3��0��
�z��g&E�J5��K�����c���K�'K�#G4�#j��/=�0[�iɬ�q�fsu�!K	�.�,!͆�Z/v�ݵ�xMIϙ�� �jRO��ݸ�zv�
1�6���2�9ЎV�&�M����"=+O�E��xW��uČ�m~�;",V�i��F��9yE����S��D�F���S����?�?�c��%e����_V^��]�=4���k�mz�A�	O�=ū4�y����O��}��-�.o�iz�F0k���ޝߵ�W�6�?�����;
L�IEND�B`�PK�X��S���harpers_full.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-
# vi: set fenc=utf-8 ft=python :
# kate: encoding utf-8; syntax python;

__license__ = "GPL v3"
__copyright__ = "2008-2019, Darko Miletic <darko.miletic at gmail.com>"
"""
harpers.org - printed issue articles
This recipe only get's article's published in text format
images and pdf's are ignored
"""

from urllib.parse import urljoin

from calibre import browser
from calibre.web.feeds.news import BasicNewsRecipe

# overwrite this with a custom issue url, e.g. https://harpers.org/archive/2023/01/
_issue_url = ""


class Harpers_full(BasicNewsRecipe):
    title = "Harper's Magazine - articles from printed edition"
    __author__ = "Darko Miletic, updated by ping"
    description = "Harper's Magazine, the oldest general-interest monthly in America, explores the issues that drive our national conversation, through long-form narrative journalism and essays, and such celebrated features as the iconic Harper's Index."  # noqa
    publisher = "Harpers's"
    category = "news, politics, USA"
    oldest_article = 31
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = "en"
    encoding = "utf8"
    publication_type = "magazine"
    requires_version = (5, 0, 0)  # py3
    ignore_duplicate_articles = {"url"}
    base_url = "https://harpers.org"

    keep_only_tags = [
        dict(
            class_=[
                "article-content",
                "template-index-archive",  # harper's index
            ]
        )
    ]
    remove_tags = [
        dict(
            class_=[
                "component-newsletter-signup",
                "sidebar",
                "header-meta",
                "component-from-author",
                "from-issue",
                "d-none",
                "COA_roles_fix_space",
                "section-tags",
                "aria-font-adjusts",
                "component-share-buttons",
                "index-footer",
                "index-prev-link",
                "comma",
            ]
        ),
        # for harper's index
        dict(
            class_=[
                "aria-font-adjusts",
                "component-share-buttons",
                "index-footer",
                "index-prev-link",
            ]
        ),
    ]
    remove_attributes = ["style", "width", "height"]

    extra_css = """
    h1.article-title { font-size: x-large; margin-bottom: 0.4rem; }
    .subheading, .post-subtitle { font-size: large; font-style: italic; margin-bottom: 1rem; }
    .byline { margin-bottom: 1rem }
    .article-hero-img img, .flex-section-image img, .wp-caption img {
        display: block; margin-bottom: 0.3rem; max-width: 100%; height: auto;
        box-sizing: border-box;
    }
    .wp-caption-text { font-size: small; margin-top: 0.3rem; }

    .author-bio { margin-top: 2.5rem; font-style: italic; }
    .author-bio em { font-weight: bold; }

    .index-item { font-size: large; margin: 1rem 0; }
    .index-statement > p { display: inline-block; margin: 0.5rem 0; }
    .index-statement > span { display: inline-block; }
    .index-statement .index-tooltip { font-size: small; }
    """

    # Send cookie-less requests to get full article
    def get_browser(self, *args, **kwargs):
        return self

    def clone_browser(self, *args, **kwargs):
        return self.get_browser()

    def open_novisit(self, *args, **kwargs):
        br = browser()
        return br.open_novisit(*args, **kwargs)

    open = open_novisit

    def preprocess_html(self, soup):
        # General UI tweaks
        # move subheading to before byline (instead of where it is now, after)
        subheading_ele = soup.find(class_="subheading")
        byline_ele = soup.find(class_="byline")
        if byline_ele and subheading_ele:
            byline_ele.insert_before(subheading_ele.extract())

        # strip extraneous stuff from author bio
        for bio in soup.find_all(class_="author-bio"):
            for dec_ele in bio.find_all("br"):
                dec_ele.decompose()
            for unwrap_ele in bio.find_all("p"):
                unwrap_ele.unwrap()

        # remove extraneous hr
        for hr in soup.select(".after-post-content hr"):
            hr.decompose()
        return soup

    def parse_index(self):
        if not _issue_url:
            issues_soup = self.index_to_soup("https://harpers.org/issues/")
            curr_issue_a_ele = issues_soup.select_one("div.issue-card a")
            curr_issue_url = urljoin(self.base_url, curr_issue_a_ele["href"])
        else:
            curr_issue_url = _issue_url

        soup = self.index_to_soup(curr_issue_url)
        self.timefmt = (
            f' [{self.tag_to_string(soup.find("h1", class_="issue-heading")).strip()}]'
        )
        self.cover_url = soup.find("img", class_="cover-img")["src"]

        articles = {}
        for section_name in ("features", "readings", "articles"):
            section = soup.find("section", class_=f"issue-{section_name}")
            if not section:
                continue
            for card in section.find_all("div", class_="article-card"):
                title_ele = card.find(class_="ac-title")
                if not title_ele:
                    continue
                article_url = card.find("a")["href"]
                article_title = self.tag_to_string(title_ele)
                article_description = (
                    f'{self.tag_to_string(card.find(class_="ac-tax"))} '
                    f'{self.tag_to_string(card.find(class_="ac-subtitle"))}'
                ).strip()
                byline = card.find(class_="byline")
                if byline:
                    article_description += (
                        f' {self.tag_to_string(byline).strip().strip(",")}'
                    )
                articles.setdefault(section_name.title(), []).append(
                    {
                        "url": article_url,
                        "title": article_title,
                        "description": article_description,
                    }
                )
        return articles.items()
PK�X�^O��hatalska.png�PNG


IHDR��h6zIDATx�cp
N&	!4�v-X����T��!0!?!��X
�������j�\T
8@LvD5N
�Wn@��N_��!��.�y�?�Ұd�b5���j��%MCU�D�fN�?�
�@�.��f2��IEND�B`�PK�X��C��hatalska.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = 'teepel 2012'

'''
hatalska.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class hatalska(BasicNewsRecipe):
    title = u'Hatalska'
    __author__ = 'teepel <teepel44@gmail.com>'
    language = 'pl'
    description = u'Blog specjalistki z branży mediowo-reklamowej - Natalii Hatalskiej'
    oldest_article = 7
    masthead_url = 'http://hatalska.com/wp-content/themes/jamel/images/logo.png'
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    remove_javascript = True
    no_stylesheets = True

    remove_tags = []
    remove_tags.append(dict(name='div', attrs={'class': 'feedflare'}))

    feeds = [(u'Blog', u'http://feeds.feedburner.com/hatalskacom')]
PK�X�R!hbr.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿tIME�	^�t_�IDATHǭ�OH�qƟ��F�~�0���!�B!B�h-�Ka/
lAă0��ԩu�R���=��d�:XAӉ?��i8E�m���aT2���{���<ߗ�}��+m?�r�S�*#�Ѩ�K���T/�B�iYie�Y����B�^����L�T\�-Э�UFq�g�j�QX���7IR
ˣ���jԯ��wb]Q�o�0�QT��#���<27�s+���7�˝��P��J������!9�U|�v�3.��K�-����($�ԩ���crQ��IU�8q�[>_����S�в7>�q �ࣉ&|����Wpr���}�nNR�вҨ���%�kj.Ɖ�E�$�<��A#�$�f�b��Bi�Je��I0D��=�`/}|a�W�a��Czy�
�\�*gn!���g�V�`�H0�eܼc���`��M��;s\Ş��@�d�I�2�z�`�)�����3X�`�U�s�����f�֊k���<�<��c��X��p����4SG+3E�Y�9�sV��E,�x�3�Lp��"��"ަ���`�,�顝�$yBmaB���	�1� ͌��y��Z8�o�F��u�q�|���)|ܡ
[�H��������\��%���s���V��Z��^�b)�j+�r��������U��%tEXtdate:create2022-09-18T21:03:59+00:00��?%tEXtdate:modify2022-09-18T21:03:56+00:00��CjIEND�B`�PK�X�x'"ee
hbr.recipeimport json
import re
from collections import OrderedDict
from urllib.parse import urlencode, urljoin

from calibre import browser, random_user_agent
from calibre.web.feeds.news import BasicNewsRecipe, classes
from mechanize import Request

_issue_url = ""  # custom issue url


class HBR(BasicNewsRecipe):
    title = "Harvard Business Review"
    __author__ = "unkn0wn, updated by ping"
    description = (
        "Harvard Business Review is the leading destination for smart management thinking. "
        "Through its flagship magazine, books, and digital content and tools published on HBR.org, "
        "Harvard Business Review aims to provide professionals around the world with rigorous insights "
        "and best practices to help lead themselves and their organizations more effectively and to "
        "make a positive impact."
    )
    language = "en"
    masthead_url = "https://hbr.org/resources/css/images/hbr_logo.svg"
    publication_type = "magazine"
    encoding = "utf-8"
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = False
    compress_news_images = True
    ignore_duplicate_articles = {"url"}
    base_url = "https://hbr.org"

    remove_attributes = ["height", "width", "style"]
    extra_css = """
        h1.article-hed { font-size: x-large; margin-bottom: 0.4rem; }
        .article-dek {  font-size: large; font-style: italic; margin-bottom: 1rem; }
        .article-byline { margin-top: 0.7rem; font-size: medium; font-style: normal; font-weight: bold; }
        .pub-date { font-size: small; margin-bottom: 1rem; }
        img {
            display: block; margin-bottom: 0.3rem; max-width: 100%; height: auto;
            box-sizing: border-box;
        }
        .container--caption-credits-hero, .container--caption-credits-inline, span.credit { font-size: small; }
        .question { font-weight: bold; }
        .description-text {
            margin: 1rem 0;
            border-top: 1px solid gray;
            padding-top: 0.5rem;
            font-style: italic;
        }
        """

    keep_only_tags = [
        classes(
            "headline-container article-dek-group pub-date hero-image-content "
            "article-body standard-content"
        ),
    ]

    remove_tags = [
        classes(
            "left-rail--container translate-message follow-topic "
            "newsletter-container by-prefix related-topics--common"
        ),
        dict(name=["article-sidebar"]),
    ]

    def preprocess_raw_html(self, raw_html, article_url):
        soup = self.soup(raw_html)

        # break author byline out of list
        byline_list = soup.find("ul", class_="article-byline-list")
        if byline_list:
            byline = byline_list.parent
            byline.append(
                ", ".join(
                    [
                        self.tag_to_string(author)
                        for author in byline_list.find_all(class_="article-author")
                    ]
                )
            )
            byline_list.decompose()

        # Extract full article content
        content_ele = soup.find(
            "content",
            attrs={
                "data-index": True,
                "data-page-year": True,
                "data-page-month": True,
                "data-page-seo-title": True,
                "data-page-slug": True,
            },
        )
        endpoint_url = "https://hbr.org/api/article/piano/content?" + urlencode(
            {
                "year": content_ele["data-page-year"],
                "month": content_ele["data-page-month"],
                "seotitle": content_ele["data-page-seo-title"],
            }
        )
        data = {
            "contentKey": content_ele["data-index"],
            "pageSlug": content_ele["data-page-slug"],
        }
        headers = {
            "User-Agent": random_user_agent(),
            "Pragma": "no-cache",
            "Cache-Control": "no-cache",
            "Content-Type": "application/json",
            "Referer": article_url,
        }
        br = browser()
        req = Request(
            endpoint_url,
            headers=headers,
            data=json.dumps(data),
            method="POST",
            timeout=self.timeout,
        )
        res = br.open(req)
        article = json.loads(res.read())
        new_soup = self.soup(article["content"])
        # clear out existing partial content
        for c in list(content_ele.children):
            c.extract()  # use extract() instead of decompose() because of strings
        content_ele.append(new_soup.body)
        return str(soup)

    def parse_index(self):
        if not _issue_url:
            soup = self.index_to_soup(f"{self.base_url}/magazine")
            a = soup.find("a", href=lambda x: x and x.startswith("/archive-toc/"))
            cov_url = a.find("img", attrs={"src": True})["src"]
            self.cover_url = urljoin(self.base_url, cov_url)
            issue_url = urljoin(self.base_url, a["href"])
        else:
            issue_url = _issue_url
            mobj = re.search(r"archive-toc/(?P<issue>(BR)?\d+)\b", issue_url)
            if mobj:
                self.cover_url = f'https://hbr.org/resources/images/covers/{mobj.group("issue")}_500.png'

        self.log("Downloading issue:", issue_url)
        soup = self.index_to_soup(issue_url)
        issue_title = soup.find("h1")
        if issue_title:
            self.timefmt = f" [{self.tag_to_string(issue_title)}]"

        feeds = OrderedDict()
        for h3 in soup.find_all("h3", attrs={"class": "hed"}):
            article_link_ele = h3.find("a")
            if not article_link_ele:
                continue

            article_ele = h3.find_next_sibling(
                "div", attrs={"class": "stream-item-info"}
            )
            if not article_ele:
                continue

            title = self.tag_to_string(article_link_ele)
            url = urljoin(self.base_url, article_link_ele["href"])

            authors_ele = article_ele.select("ul.byline li")
            authors = ", ".join([self.tag_to_string(a) for a in authors_ele])

            article_desc = ""
            dek_ele = h3.find_next_sibling("div", attrs={"class": "dek"})
            if dek_ele:
                article_desc = self.tag_to_string(dek_ele) + " | " + authors
            section_ele = (
                h3.findParent("li")
                .find_previous_sibling("div", **classes("stream-section-label"))
                .find("h4")
            )
            section_title = self.tag_to_string(section_ele).title()
            feeds.setdefault(section_title, []).append(
                {"title": title, "url": url, "description": article_desc}
            )
        return feeds.items()
PK�X�Fe&heavy_metal_it.png�PNG


IHDR  ��tRNSn���IDATxڍVP[>c;�3;����������
uw/�"aq^*h�b�H���C�!���!$D�w��<���v��s��|�ܥ��(��Zu%��=��sIS��/Y􊆮~��<��P�<�U�/n~F�d�����&s��^���
cb�r�/���ފM��D��~�b��`����{䜟V.��"�X,�Z\C�L'�ۻKڻ�0��B�(D�@tY�Q��:�&�|��~�u���
b���\єR�)��͢ŏ�M.�A�o�vB��}�WOw�-q��L�JE�L^�l����v+���f�,��2�T6��O��R�Y\nlYc��~V���UU����J��'��)�4E̥�i�%DP�}��e0cc�A=�Ә���?�]V�Q(-�ف���(J�P�
!d>���!�;1/���s(c���v��q>D����o�wC����p���l�~��z��l�ae�j=���Ytq%X���h4a���zJ���
�D��;�
���7�-ݺ���6�r/<=��
�յ3��5��}��B�e���4eͰ�0��>���#�}��q�3pn}fy�-.��F��[�� ���Y^����ƍ���ԛ���%�e�!D��|�����t��j~@�j��rC�@s�맴B�Q�`�ǫ^R�!�p��z�r��ԙ~��f:��
3F���H�;��ʀq����5��X�l�?�$��&oj�~��Rg	ɲ��
��4��S�!��!1��(��1�y~���Dw 7[���w[!@�P��9q�8U`X-ܲ���8�3J�aR	��^���x?��Lt�D�-h?�g�_�{c�����Y``w�/��œ-�p�#&��%��3+j�
������Z���d"���v�RZ��則9qc��}�JI��z[Oϕ�� .��(%��I�
~.6�G�:��1�o3I�T��ʻm`$ʵt{Gl�CN� ��(	�eϫه���t����)5_���x�#L-á)n�v3��8�	��eT��E��_A��4{#G	nP�%��"E7}b9Pҡ�^aW����:�R�Q�� b��gZ�)�ۀX�j0o���a�3��=gb1�~��ÛOrw��y���x��CD�bEvy�G]„"����������p,|��;>����q*�� i�Gp��3Ti
Ŵl��zZQ�P�^�
�h���%��R�+��%�o$t�܍B
�̰���Dtȃsi4y�%@���8�����
���F��9"��1�C	h�@���c�RO/oG��{~y�/���*��<Υ5�F��O/���{Y;�L�)�k�����٥-�?�24i��`h�����8�L?Y������>�]Y'Bw�)t�̝���a15g��v)�B#�o��ޕJ�{.s��NJg�<9�q��p�3�n�n?�Jq4�N� o�`�c��zh/j�A�x��.��YG��7��!S� rLP�!��%�`��߽�)%-�t^�>&U0��?�{�|D�$[��_P��\ޮ�C"x����&hg�(��(������@1p���t�m�:w�ϓ@�>��=ӑ>��~�`p�&�n=1�U1Y�W
�{�F1�2:V�uF�@�bg+{�m�����n�����5[��F4vj8x�L=��o��K�9Y�C��,�\_o���}����>���|���bg]��7EMC��[�ǁN,�fA����
܇��gq�����J�r����8R���w�
�0�X����-H��x�h��
�yt��_�vac����#��^��7;}��ÅQov���ǎ~¿r����R>[��~>0.�W��ď27���_�'�����֣}�F�+7J�M�K��YZ���OM|$��/�)�VD7�3�Ŕ��q����Z�
S4	�֓�IEND�B`�PK�X˟�٢�heavy_metal_it.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1336289226(BasicNewsRecipe):
    title = u'Heavy Metal'
    oldest_article = 15
    max_articles_per_feed = 100
    auto_cleanup = False
    masthead_url = 'http://net-static2.tccstatic.com/template/tmw/img/tj.gif'
    feeds = [(u'Heavy Metal', u'http://www.heavy-metal.it/feed/')]
    keep_only_tags = [
        dict(name='div', attrs={'class': 'entry'})
    ]
    remove_tags_after = [
        dict(name='div', attrs={'class': 'sociable'})
    ]
    description = 'An Heavy metal Italian magazine'
    __author__ = 'faber1971'
    language = 'it'


__version__ = 'v1.0'
__date__ = '6, May 2012'
PK�X��5��	heise.png�PNG


IHDR(-SPLTE�����������̲�����������wwwfff��%hIDATx���0 �����sw�9ۙ���� K��%�������4�vUz��&�����.bqO��T�Y�Qy-P� ^r��	���M�?���IEND�B`�PK�X��77heise.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch heise.
'''

from calibre.web.feeds.news import BasicNewsRecipe


class heiseDe(BasicNewsRecipe):

    title = 'heise'
    description = 'Computernews from Germany'
    __author__ = 'Oliver Niesner'
    use_embedded_content = False
    language = 'de'
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 40
    no_stylesheets = True

    extra_css = '''
    .bild_links, .bild_bu_links {
        float:left;
        line-height:105%;
        margin:12px 1.4em 12px 0;
    }

    .bild_rechts, .bild_bu {
            float:right;
            line-height:105%;
            margin:12px 0 12px 1em;
            text-align:right;
    }

    .bild_zentriert {
            clear:both;
            line-height:105%;
            margin:.2em auto;
            text-align:center;
    }

    span.bild_links, span.bild_rechts, span.bild_zentriert {
            display:block;
    }
    '''

    remove_tags = [dict(id='navi_bottom'),
                   dict(id='software_tabbox'),
                   dict(id='heisetopnavi_sub_container'),
                   dict(id='navi_login'),
                   dict(id='heisetopnavi_search'),
                   dict(id='themen_aktuell'),
                   dict(id='navi_top'),
                   dict(id='logo_bereich'),
                   dict(name='div', attrs={'class': 'news_logo'}),
                   dict(name='div', attrs={'class': 'heisetopnavi_header'}),
                   dict(name='p', attrs={'class': 'teasermitbildundtext'}),
                   dict(name='div', attrs={'class': 'news_foren'}),
                   dict(name='p', attrs={'class': 'news_navi'})]

    remove_tags_after = [dict(name='div', attrs={'class': 'news_foren'})]

    feeds = [
        ('heise online', 'http://www.heise.de/newsticker/heise.rdf'),
        ('heise Developer', 'http://www.heise.de/developer/rss/news-atom.xml'),
        ('heise open', 'http://www.heise.de/open/news/news-atom.xml')
    ]

    def get_article_url(self, article):
        return article.link + "&view=print"
PK�X-0���heise_ct.png�PNG


IHDR  D����PLTE���������������������������������������������������������������������������000111���///222���...GGG���CCC������������333---������kkk������IIIOOO===���������<<<444888��땕�������������PPP������pppBBB���MMM���>>>���gggaaaooo999nmm���ZZZ������������fffjjj```������777������DDD~~~���gff555sssccc���655���������YXX���SSS���lkk]]]KKK��ꜜ����NNN������zyy������������EEE��̝�����^^^877������WWW��������ּ�������Ј��utt���yyy������ttt^]]��֊�����TTTuuurrr������ONN���|||211������JII:::������nnneee���???������YYY��������Ҡ�����LLL������0/0���AAA�����������UTT���vvvsrr�����������댋�������xxx������|{{����������������Ӧ��;;;���poocbbhhhRRR���,--������HHH����h�tRNS-q��;����:�F��<.�3����IDATx�T���$IF3ڶnD��m۶��m��c۶m�z��<95���j	/o_?���ڳ�A�!`*$8(0@<��a����@xX�O��@����8>~gn�N���㏊�]�]y�4�T���%�Y�!:J�G�Ѱ��<�Z��w�����i���u��"4~��*]���Ͽ���� &TL�c� q�R�Ku���$8WTlɝa�Bq��?�(W?�����?t'�� ��P�r��%iG���������<�ʗ�u[�6H��|B�mRr�,��B�,��q�l2!>�/d����J�_I�M2|k�|5?xSZ]��K�[Oʆ2`����4�ӥ���KJ��s๖Չ��֤���mR�,X�J/R�|<���R��N����d�
��ԩ�?IH��T͐���檱,�h�X���6I9\	d���~J�?WA�/��i�0jU;2 �C��T}$Sk��?R|�CU쵖�-��{��?� ��8u�Q)�wr�jw2bW��o�Yt�)�	N�:=g^(��#�Yƻ��jF��u���0�m�I�L��������e&0&r�(k�g:�(�Ԗ�m"灶����|�쪭���������=I����5w���ō���d��8ew�rc�����d�������zDe^��>�|QK��IEND�B`�PK�X�c��QQheise_ct.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe

__license__ = 'GPL v3'
__copyright__ = 'Ralf Hein - ralfhein at GMX dot DE'
'''
Heise Select Magazine - ct
'''


class heise_select(BasicNewsRecipe):
    issue = None
    # overwrite this for easy download of previous issues
    # issue = '/select/ct/2020/8'

    title = 'Heise ct'
    timefmt = ''
    __author__ = 'Ralf Hein'
    needs_subscription = True
    description = 'Das ct Magazin als ePaper. Benötigt Heise Plus Digitalabo (siehe https://www.heise.de/plus/)'
    publisher = 'Heise Verlag'
    authors = 'Heise Verlag'
    category = 'it'
    tags = 'Magazin, IT, computer, ct'
    publication_type = 'magazine'
    no_stylesheets = True
    use_embedded_content = False
    compress_news_images = True
    encoding = 'utf-8'
    language = 'de'

    conversion_options = {
        'base_font_size': 10,
        'no_inline_navbars': True,
        'language': language,
        'publisher': publisher,
        'authors': publisher
    }

    remove_tags = [
        dict(name='meta'),
        dict(name='link', attrs={'rel': 'icon'}),
        dict(name='link', attrs={'rel': 'dns-prefetch'}),
        dict(name='link', attrs={'rel': 'preconnect'}),
        dict(name='div', attrs={'class': 'meta__group--issue'}),
        dict(name='p', attrs={'class': 'comment'}),
        dict(name='div', attrs={'class': 'pswp'}),
        dict(name='div', attrs={'class': 'bottom-links'}),
    ]

    remove_tags_before = [dict(name='main')]
    remove_tags_after = [dict(name='main')]

    def parse_index(self):
        baseref = 'https://www.heise.de'
        # find current issue if not defined
        if self.issue is None:
            soup = self.index_to_soup(baseref + '/select')
            sec = soup.find('section', attrs={'class': 'magazine--ct'})
            self.issue = sec.find('a',
                                  attrs={'class': 'magazine__link--issue'},
                                  href=True)['href']

        issue_num = self.issue.replace('/select/ct/', '')
        # fix title with issue number to keep them neatly organised
        self.title += ' ' + issue_num.replace('/', '-')
        self.cover_url = 'https://www.heise.de/select/thumbnail/ct/' + issue_num

        soup = self.index_to_soup(baseref + self.issue)
        toc = []

        for h3 in soup.findAll('h3', attrs={'class': 'xp__inhalt__title'}):
            section_title = h3.text
            articles = []
            ul = h3.find_next('ul')

            for li in ul.findAll('li', attrs={'class': 'xp__toc__item'}):
                article_uri = li.find('a', attrs={'class': 'xp__link'})['href']
                article_title = li.find('span',
                                        attrs={
                                            'class': 'xp__toc__item-subtitle'
                                        }).text
                article = {
                    'title': article_title,
                    'url': baseref + article_uri
                }
                articles.append(article)
            toc.append((section_title, articles))

        return toc

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            loginURL = 'https://www.heise.de/sso/login?forward=%2Fselect'
            br.open(loginURL)
            br.select_form(action='/sso/login/login')
            br['username'] = self.username
            br['password'] = self.password
            br.submit()

        return br

    def preprocess_html(self, soup):
        # images are dynamically sized via js + a-img tag, epub can not work with this
        # construct ordinary img from it
        for aimg in soup.findAll('a', attrs={'class': 'js-pswp-image'}):
            if aimg['href'] is not None and aimg['data-pswp-bu'] is not None:
                img = soup.new_tag('img',
                                   src=aimg['href'],
                                   alt=aimg['data-pswp-bu'],
                                   style="display: block;")
            if img is not None:
                aimg.replaceWith(img)

        return soup
PK�X-0���heise_ix.png�PNG


IHDR  D����PLTE���������������������������������������������������������������������������000111���///222���...GGG���CCC������������333---������kkk������IIIOOO===���������<<<444888��땕�������������PPP������pppBBB���MMM���>>>���gggaaaooo999nmm���ZZZ������������fffjjj```������777������DDD~~~���gff555sssccc���655���������YXX���SSS���lkk]]]KKK��ꜜ����NNN������zyy������������EEE��̝�����^^^877������WWW��������ּ�������Ј��utt���yyy������ttt^]]��֊�����TTTuuurrr������ONN���|||211������JII:::������nnneee���???������YYY��������Ҡ�����LLL������0/0���AAA�����������UTT���vvvsrr�����������댋�������xxx������|{{����������������Ӧ��;;;���poocbbhhhRRR���,--������HHH����h�tRNS-q��;����:�F��<.�3����IDATx�T���$IF3ڶnD��m۶��m��c۶m�z��<95���j	/o_?���ڳ�A�!`*$8(0@<��a����@xX�O��@����8>~gn�N���㏊�]�]y�4�T���%�Y�!:J�G�Ѱ��<�Z��w�����i���u��"4~��*]���Ͽ���� &TL�c� q�R�Ku���$8WTlɝa�Bq��?�(W?�����?t'�� ��P�r��%iG���������<�ʗ�u[�6H��|B�mRr�,��B�,��q�l2!>�/d����J�_I�M2|k�|5?xSZ]��K�[Oʆ2`����4�ӥ���KJ��s๖Չ��֤���mR�,X�J/R�|<���R��N����d�
��ԩ�?IH��T͐���檱,�h�X���6I9\	d���~J�?WA�/��i�0jU;2 �C��T}$Sk��?R|�CU쵖�-��{��?� ��8u�Q)�wr�jw2bW��o�Yt�)�	N�:=g^(��#�Yƻ��jF��u���0�m�I�L��������e&0&r�(k�g:�(�Ԗ�m"灶����|�쪭���������=I����5w���ō���d��8ew�rc�����d�������zDe^��>�|QK��IEND�B`�PK�X���heise_ix.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe

__license__ = 'GPL v3'
__copyright__ = 'Ralf Hein - ralfhein at GMX dot DE'
'''
Heise Select Magazine - iX
'''


class heise_select(BasicNewsRecipe):
    issue = None
    # overwrite this for easy download of previous issues
    # issue = '/select/ix/2020/3'

    title = 'iX'
    timefmt = ''
    __author__ = 'Ralf Hein'
    needs_subscription = True
    description = 'Das iX Magazin als ePaper. Benötigt Heise Plus Digitalabo (siehe https://www.heise.de/plus/)'
    publisher = 'Heise Verlag'
    authors = 'Heise Verlag'
    category = 'it'
    tags = 'Magazin, IT, computer, ix'
    publication_type = 'magazine'
    no_stylesheets = True
    use_embedded_content = False
    compress_news_images = True
    encoding = 'utf-8'
    language = 'de'

    conversion_options = {
        'base_font_size': 10,
        'no_inline_navbars': True,
        'language': language,
        'publisher': publisher,
        'authors': publisher
    }

    # some code cleanup
    remove_tags = [
        dict(name='meta'),
        dict(name='link', attrs={'rel': 'icon'}),
        dict(name='link', attrs={'rel': 'dns-prefetch'}),
        dict(name='link', attrs={'rel': 'preconnect'}),
        dict(name='div', attrs={'class': 'meta__group--issue'}),
        dict(name='p', attrs={'class': 'comment'}),
        dict(name='div', attrs={'class': 'pswp'}),
        dict(name='div', attrs={'class': 'bottom-links'}),
    ]

    # content is neatly within <main> element
    remove_tags_before = [dict(name='main')]
    remove_tags_after = [dict(name='main')]

    def parse_index(self):
        baseref = 'https://www.heise.de'
        # find current issue if not defined
        if self.issue is None:
            soup = self.index_to_soup(baseref + '/select')
            sec = soup.find('section', attrs={'class': 'magazine--ix'})
            self.issue = sec.find(
                'a', attrs={'class': 'magazine__link--issue'}, href=True
            )['href']

        issue_num = self.issue.replace('/select/ix/', '')
        # fix title with issue number to keep them neatly organised
        self.title += ' ' + issue_num.replace('/', '-')
        self.cover_url = 'https://www.heise.de/select/thumbnail/ix/' + issue_num

        soup = self.index_to_soup(baseref + self.issue)
        toc = []

        for h3 in soup.findAll('h3', attrs={'class': 'xp__inhalt__title'}):
            section_title = h3.text
            articles = []
            ul = h3.find_next('ul')

            for li in ul.findAll('li', attrs={'class': 'xp__toc__item'}):
                article_uri = li.find('a', attrs={'class': 'xp__link'})['href']
                article_title = li.find(
                    'span', attrs={
                        'class': 'xp__toc__item-subtitle'
                    }
                ).text
                article = {'title': article_title, 'url': baseref + article_uri}
                articles.append(article)
            toc.append((section_title, articles))

        return toc

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            loginURL = 'https://www.heise.de/sso/login?forward=%2Fselect'
            br.open(loginURL)
            br.select_form(action='/sso/login/login')
            br['username'] = self.username
            br['password'] = self.password
            br.submit()

        return br

    def preprocess_html(self, soup):
        # images are dynamically sized via js + a-img tag, epub can not work with this
        # construct ordinary img from it
        for aimg in soup.findAll('a', attrs={'class': 'js-pswp-image'}):
            if aimg['href'] is not None and aimg['data-pswp-bu'] is not None:
                img = soup.new_tag(
                    'img',
                    src=aimg['href'],
                    alt=aimg['data-pswp-bu'],
                    style="display: block;"
                )
            if img is not None:
                aimg.replaceWith(img)

        return soup
PK�X-0���heise_open.png�PNG


IHDR  D����PLTE���������������������������������������������������������������������������000111���///222���...GGG���CCC������������333---������kkk������IIIOOO===���������<<<444888��땕�������������PPP������pppBBB���MMM���>>>���gggaaaooo999nmm���ZZZ������������fffjjj```������777������DDD~~~���gff555sssccc���655���������YXX���SSS���lkk]]]KKK��ꜜ����NNN������zyy������������EEE��̝�����^^^877������WWW��������ּ�������Ј��utt���yyy������ttt^]]��֊�����TTTuuurrr������ONN���|||211������JII:::������nnneee���???������YYY��������Ҡ�����LLL������0/0���AAA�����������UTT���vvvsrr�����������댋�������xxx������|{{����������������Ӧ��;;;���poocbbhhhRRR���,--������HHH����h�tRNS-q��;����:�F��<.�3����IDATx�T���$IF3ڶnD��m۶��m��c۶m�z��<95���j	/o_?���ڳ�A�!`*$8(0@<��a����@xX�O��@����8>~gn�N���㏊�]�]y�4�T���%�Y�!:J�G�Ѱ��<�Z��w�����i���u��"4~��*]���Ͽ���� &TL�c� q�R�Ku���$8WTlɝa�Bq��?�(W?�����?t'�� ��P�r��%iG���������<�ʗ�u[�6H��|B�mRr�,��B�,��q�l2!>�/d����J�_I�M2|k�|5?xSZ]��K�[Oʆ2`����4�ӥ���KJ��s๖Չ��֤���mR�,X�J/R�|<���R��N����d�
��ԩ�?IH��T͐���檱,�h�X���6I9\	d���~J�?WA�/��i�0jU;2 �C��T}$Sk��?R|�CU쵖�-��{��?� ��8u�Q)�wr�jw2bW��o�Yt�)�	N�:=g^(��#�Yƻ��jF��u���0�m�I�L��������e&0&r�(k�g:�(�Ԗ�m"灶����|�쪭���������=I����5w���ō���d��8ew�rc�����d�������zDe^��>�|QK��IEND�B`�PK�XLt����heise_open.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Anton Gillert <atx at binaryninja.de>'

'''
Fetch Heise Open.
'''
from calibre.web.feeds.news import BasicNewsRecipe


class HeiseOpenDe(BasicNewsRecipe):

    title = 'Heise Open'
    description = 'Opensource news from Germany'
    __author__ = 'Anton Gillert'
    use_embedded_content = False
    language = 'de'
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 40
    no_stylesheets = True

    feeds = [('Heise Open', 'http://www.heise.de/open/news/news-atom.xml')]

    def print_version(self, url):
        return url + '?view=print'

    remove_tags = [dict(id='navi_top'),
                   dict(id='navi_bottom'),
                   dict(name='div', attrs={'class': 'navi_top_logo'}),
                   dict(name='img', attrs={
                        'src': '/open/icons/open_logo_2009_weiss.gif'}),
                   dict(name='h5', attrs={'style': 'margin: 0.5em 0;'}),
                   dict(name='p', attrs={'class': 'news_datum'}),
                   dict(name='p', attrs={'class': 'size80'})]
    remove_tags_after = [dict(name='p', attrs={'class': 'size80'})]

    def get_cover_url(self):
        return 'http://www.heise.de/open/icons/open_logo_2009_weiss.gif'
PK�XC�b��helsingin_sanomat.png�PNG


IHDR  D���PPLTEL���<Ov>Pwv��)XP���=PvM@RxCU{O`�ds�m{�+Z������������������������3`����������8Ks5Hq	!R:Mt;Nu
"S"S%U(WNEW|HY~K\�M^�N_�*YSc�Vf�`o�bq�cr�+Zet�hv�iw�ky�lz�Ot��.\x��|����/]0^������L4a������4a�����������������í�ű�ȳ�ɴ�ʵ�� 5b���������������"7c#8d���$9e���%:e������������������������������&;f(=h���)=h������3Go�ҩw�IDATx���vkQ�sc��vj��m��_�Sp�)d/ljT�+��x�0��e�����5�+N��p�pZrsI�e�!��ib�0��!J>�0�e�3��gF}݇�`���o�/������E:ƀY���|ɆE�|q@�5ɻQT	1j}ĂY���G�4�q��2�SF�%9��la�����6W?9���7@;N���|o6�#WT�g��vTiʐ��;�AC����I*MK��%��|5�r܂�L�IEND�B`�PK�X�nݚ��helsingin_sanomat.recipefrom 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 AdvancedUserRecipe1298137661(BasicNewsRecipe):
    title = u'Helsingin Sanomat'
    __author__ = 'oneillpt'
    language = 'fi'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    keep_only_tags = [
        classes('article-title single-article'),
    ]
    remove_tags = [
        dict(attrs={'class':['hidden print-url', 'article-paywall']}),
        dict(style=lambda x: x and 'height: 0' in x),
    ]

    feeds = [
        (u'Uutiset - HS.fi', u'https://www.hs.fi/uutiset/rss/'),
    ]

    def preprocess_html(self, soup):
        for tag in soup.findAll(attrs={'data-mfp-src':True}):
            tag.name = 'img'
            tag['src'] = tag['data-mfp-src']
            tag['style'] = 'display:block'
        return soup
PK�X�Q|@@high_country_news.png�PNG


IHDR(-SAPLTE2X>a���<`DfDfMmIx������=`Ac8\Ef9]6[Hi3XOnUtSr Yw%]z(Zx(]{,c-c?q�3YK{�My�P}�Z��_��_��b��i��t��y��}�������������������à�ĩ��=a�������������������������������������������������������������5Z���������������@cAdBe
HiCe:^;_��̱�ϴ�Ѻ�ջ�Ӽ�Խ�׽�־��<_���������������Bt�Cs�Ct�Fk�Fo�Hw�Hx�G����IDATx^E����0�$u׶m�������:73�.� 9�<@ ��0�g8k��0B���{isEM�e�'�b7N���(���x[=�>��������K1�>��"���m�*�@�ӵ05�0ZH�O�s�v�6'����B�*��^&��k��~%� 5�~?}�,MV�@�ub~&���h�����IEND�B`�PK�X��k�..high_country_news.recipe# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2013, Armin Geller'
'''
Fetch High Country News
'''
from calibre.web.feeds.news import BasicNewsRecipe


class HighCountryNews(BasicNewsRecipe):
    ##
    # Written:      2012-01-28
    # Last Edited:  2023-06-30
    #
    # Remark:       Version 2.3
    #               Update language to fix how it appears in UI tree
    #               Version 2.2
    #               Update RSS feeds to hcn.org and keep the old feedburner feeds still in place
    #               as there are some old articles available only at feedburner adress
    #               2019-07-04
    #               Version 2.3
    #               New Page design at HighCountryNews
    #               2020-12-29
    #               Version 2.4
    #               Page design updates at HighCountryNews
    #               2021-01-11
    #               Version 2.5a
    #               Again changes in page design
    #               2021-01-12
    #               Version 2.5b
    #               test old feeds availability and check for new feeds
    #               2022-08-17
    #               Version 2.6
    #               css changes, some cleanup
    #

    title = u'High Country News'
    description = u'High Country News (RSS Version)'
    __author__ = 'Armin Geller'
    publisher = 'High Country News'
    category = 'News, Politics, Social, Nature, Environmental, Western United States, Native American'
    timefmt = ' [%a, %d %b %Y]'
    language = 'en'
    encoding = 'UTF-8'
    publication_type = 'newspaper'
    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    auto_cleanup = False
    remove_javascript = True
    remove_empty_feeds = True
    remove_attributes = ['width', 'height']
    use_embedded_content = False

    masthead_url = 'http://www.hcn.org/logo.jpg'
    cover_source = 'http://www.hcn.org/issues'

    def get_cover_url(self):
        cover_source_soup = self.index_to_soup(self.cover_source)
        preview_image_div = cover_source_soup.find(
            attrs={'class': 'articles'}
        )  # AGE 2014-09-18 new
        return preview_image_div.div.a.figure.img[
            'src']  # AGE 2014-09-18 newm take always the first one (hopefully)

    # AGe new extra css to get rid of ugly style
    # li for delete disc style,
    # caption and credit for description & author of pictures
    # main-topic

    remove_attributes = ['style']

    extra_css = '''
                      h1 {font-size: 1.6em; text-align: left}
                      h2 {font-size: 1em; font-style: italic; font-weight: normal}
                      h3 {font-size: 1.3em;text-align: left}
                      h4, h5, h6, {font-size: 1em;text-align: left}
                      li {list-style-type: none; Font-size: 1.0em}
                      .caption, .credit {font-size: 0.9em; font-style: italic}
                      .pullquote {font-size: 1.1em; font-weight: bold; font-style: italic}
                      .main-topic {font-size: 0.85em; font-weight: bold}
                      '''

    feeds = [
        (u'Most Recent',
         u'https://www.hcn.org/rss/most-recent/rss.xml'),  # AGE 2019-07-04 new
        (u'Current Issue',
         u'https://www.hcn.org/rss/current-issue/rss.xml'),  # AGE 2019-07-04 new
        (u'The Range blog', u'http://cdn.hcn.org/rss/range/RSS'
         ),  # AGE 2021-01-13 still available with old entries
        (u'Features', u'https://www.hcn.org/rss/features/rss.xml'),  # AGE 2021-01-13
        (u'Ranch Diaries',
         u'https://www.hcn.org/voices/ranchdiaries/RSS'),  # AGE 2021-01-13
        (u'Writers on the Range',
         u'https://www.hcn.org/rss/wotr/rss.xml'),  # AGE 2019-07-04 new
        (
            u'West Obsessed',
            u'https://feeds.soundcloud.com/users/soundcloud:users:299947441/sounds.rss'
        ),  # AGE 2016-12-04 new
        #            (u'The Range', u'http://feeds.feedburner.com/hcn/range?format=xml'), # AGE 2016-12-04 old feedburner
        (
            u'From the Blogs',
            u'http://feeds.feedburner.com/hcn/FromTheBlogs?format=xml'
        ),
        (
            u'Heard around the West',
            u'http://feeds.feedburner.com/hcn/heard?format=xml'
        ),
        (u'The GOAT Blog', u'http://feeds.feedburner.com/hcn/goat?format=xml'),
        (u'High Country Views', u'http://feeds.feedburner.com/hcn/HighCountryViews'),
    ]

    keep_only_tags = [
        dict(name='div', attrs={'id': 'content'}),
        dict(name='div', attrs={'class': 'opaque'}),
        dict(name='div', attrs={'id': 'main'}),
        dict(
            name='div',
            attrs={
                'class': ['row feature-row', 'small-12 columns', 'intro', 'dropcap']
            }
        ),
    ]

    remove_tags = [
        dict(
            name='div',
            attrs={
                'class': [
                    'large-4 columns right-portlets',
                    'pagination-share',
                    'large highlight newsletter-signup button',
                    'newsletter-signup portlet',
                    'document-actions',
                ]
            }
        ),
        dict(name='ul', attrs={'class': [
            'topics',
        ]}),
        dict(name='dl', attrs={'id': [
            'kssPortalMessage',
        ]}),
    ]

    # AGE 2014-09-18 this will stay for a while
    # but have no impact for now ...

    INDEX = ''

    def append_page(self, soup, appendtag, position):
        pager = soup.find('span', attrs={'class': 'next'})
        if pager:
            nexturl = self.INDEX + pager.a['href']
            soup2 = self.index_to_soup(nexturl)
            texttag = soup2.find('div', attrs={'class': 'article-text'})
            newpos = len(texttag.contents)
            self.append_page(soup2, texttag, newpos)
            texttag.extract()
            appendtag.insert(position, texttag)

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body, 3)
        pager = soup.find('div', attrs={'class': 'listingBar listingBar-article'})
        if pager:
            pager.extract()
        return self.adeify_images(soup)
PK�X��(��himal_southasian.png�PNG


IHDR  szz�YIDATx�bາ���2�h(
�5��=�v��wI���#I����H2a��ݥH \3��5G8�i����s�����e���a؂H=S؁8��ԓ�A�ŋ|™E�艝z����Ѭ*�'K��Aج��'q����ܣ֦��P�V.�Q�u�i�a 6U%7�zF��
�Z�+ S����s1���	Ĺ��2����.�//�&�('��(�/�’�%3��.�u	��/��T��k�[��H6`����+�'��v�ǖ�=ӇS8�۾Z���Tq��o=7Y]���!�mx�{�lCG�?��@K�Ï��?_�j0�N>e�IEND�B`�PK�X>�^��himal_southasian.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from datetime import datetime, timezone, timedelta
from calibre.utils.date import parse_date


class himal(BasicNewsRecipe):
    title = 'Himal Southasian'
    __author__ = 'unkn0wn'
    description = ('Himal Southasian is Southasia’s first and only regional magazine of politics and culture.'
    ' For over 30 years, Himal Southasian has challenged nationalist orthodoxies, and covered the region with '
    'imagination, rigour and irreverence, with contributions from some of the most interesting writers in the region.')
    language = 'en_IN'
    no_stylesheets = True
    remove_attributes = ['height', 'width', 'style']
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://www.himalmag.com/wp-content/themes/himaltheme-child/images/logo.svg'
    encoding = 'utf-8'
    remove_empty_feeds = True
    resolve_internal_links = True
    oldest_article = 30  # days

    extra_css = '''
        .sub-row, .img-caption, .wp-caption-text, .comments-info-box {font-size:small;}
        em, blockquote {color:#404040;}
    '''

    remove_tags = [
        dict(name='header'),
        dict(name='footer'),
        classes('skip-link single-btm share-info title-info post-categories comment-btn comment-line'),
    ]

    def parse_index(self):
        sel = self.index_to_soup('https://www.himalmag.com/category/regions/')
        nav_div = sel.find('div', attrs={'class':'category-sublist'})
        section_list = []

        for a in nav_div.findAll('a', href=True):
            section_list.append(
                (self.tag_to_string(a).strip(), a['href'])
            )
        feeds = []

        # For each section title, fetch the article urls
        for section in section_list:
            section_title = section[0]
            section_url = section[1]
            self.log(section_title, section_url)
            soup = self.index_to_soup(section_url)
            articles = self.articles_from_soup(soup)
            if articles:
                feeds.append((section_title, articles))
        return feeds

    def articles_from_soup(self, soup):
        ans = []
        div = soup.find('div', attrs={'id':'loadmore-wrap'})
        for h3 in div.findAll('h3'):
            a = h3.find('a', href=True)
            url = a['href']
            title = self.tag_to_string(a)
            desc = ''
            exp = h3.findNext('div', attrs={'class':'content-except'})
            if exp:
                desc = self.tag_to_string(exp)
            h4 = h3.findNext('h4')
            if h4:
                date = parse_date(self.tag_to_string(h4).split('|')[1].strip())
                today = (datetime.now(timezone.utc)).replace(microsecond=0)
                if (today - date) > timedelta(self.oldest_article):
                    url = ''

            if not url or not title:
                continue

            self.log('\t', title, '\n\t', desc, '\n\t\t', url)
            ans.append({'title': title, 'description':desc, 'url': url})
        return ans
PK�XYy{[��	hindu.png�PNG


IHDR  D����PLTE# ������FFHefhmoq���545���bcf=<>&"#RRUTTVUUW_`b(%&)&'fhjklo+()opsstwtvxuwyz|{}~�������,)*������������0-/���������������������������������������������������434������������������$!"����������*�IDATx���3C�d<k۶�_jm��W�_��/�'0���]����T������EQ.쁧M��E���1$�<������$Tn��T��G2s��`�3�x|�R� ����ρ
�)pNH�,N��J���L@��A����i��WRi��&IEND�B`�PK�X�M����hindu.recipeimport json
import re
from collections import defaultdict
from datetime import date
from calibre.web.feeds.news import BasicNewsRecipe, classes

def absurl(url):
    if url.startswith('/'):
        url = 'https://www.thehindu.com' + url
    return url

# Chennai is default edition, for other editions use 'th_hyderabad', 'th_bangalore', 'th_delhi', 'th_kolkata' etc
local_edition = None

# For past editions, set date to, for example, '2023-01-28'
past_edition = None

is_monday = date.today().weekday() == 0
is_friday = date.today().weekday() == 4
is_saturday = date.today().weekday() == 5
is_sunday = date.today().weekday() == 6

if past_edition:
    year, month, day = (int(x) for x in past_edition.split('-'))    
    dt = date(year, month, day)
    is_monday = dt.weekday() == 0
    is_saturday = dt.weekday() == 5
    is_sunday = dt.weekday() == 6

class TheHindu(BasicNewsRecipe):
    title = 'The Hindu'
    __author__ = 'unkn0wn'
    description = 'Articles from The Hindu, Today\'s Paper.'
    language = 'en_IN'
    no_stylesheets = True
    masthead_url = 'https://www.thehindu.com/theme/images/th-online/thehindu-logo.svg'
    remove_attributes = ['style', 'height', 'width']

    extra_css = '''
        .caption {font-size:small; text-align:center;}
        .author, .dateLine {font-size:small; font-weight:bold;}
        .subhead, .subhead_lead, .bold {font-weight:bold;}
        img {display:block; margin:0 auto;}
        .italic {font-style:italic; color:#202020;}
    '''

    ignore_duplicate_articles = {'url'}

    keep_only_tags = [
        classes('article-section')
    ]

    remove_tags = [
        classes('hide-mobile comments-shares share-page editiondetails')
    ]

    def preprocess_html(self, soup):
        for cap in soup.findAll('p', attrs={'class':'caption'}):
            cap.name = 'figcaption'
        for img in soup.findAll('img', attrs={'data-original':True}):
            img['src'] = img['data-original']
        return soup

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            if not past_edition:
                self.title = 'The Hindu ' + date.today().strftime('%b %d, %Y')
            else:
                self.title = 'The Hindu ' + dt.strftime('%b %d, %Y')

    def parse_index(self):
        mag_url = None
        global local_edition
        if local_edition or past_edition:
            if local_edition is None:
                local_edition = 'th_chennai'
            today = date.today().strftime('%Y-%m-%d')
            if past_edition:
                today = past_edition
                self.log('Downloading past edition of', local_edition + ' from ' + today)
            url = absurl('/todays-paper/' + today + '/' + local_edition + '/')
            if is_monday:
                mag_url = url + '?supplement=' + local_edition + '-epbs'
            if is_saturday:
                mag_url = url + '?supplement=' + local_edition + '-mp'
            if is_sunday:
                mag_url = url + '?supplement=' + local_edition + '-sm'
        else:
            url = 'https://www.thehindu.com/todays-paper/'
            if is_monday:
                mag_url = url + '?supplement=th_chennai-epbs'
            if is_friday:
                mag_url = url + '?supplement=th_chennai-fr'
            if is_saturday:
                mag_url = url + '?supplement=th_chennai-mp'
            if is_sunday:
                mag_url = url + '?supplement=th_chennai-sm'

        raw = self.index_to_soup(url, raw=True)
        soup = self.index_to_soup(raw)
        ans = self.hindu_parse_index(soup)
        cover = soup.find(attrs={'class':'hindu-ad'})
        if cover:
            self.cover_url = cover.img['src']
        if not ans:
            raise ValueError(
                    'The Hindu Newspaper is not published Today.'
                )
        if mag_url:
            self.log('\nFetching Magazine')
            soup = self.index_to_soup(mag_url)
            ans2 = self.hindu_parse_index(soup)
            if ans2:
                return ans + ans2
            self.log('\tMagazine not Found')
            return ans
        return ans

    def hindu_parse_index(self, soup):
        for script in soup.findAll('script'):
            if not self.tag_to_string(script).__contains__('grouped_articles = {"'):
                continue
            if script is not None:
                art = re.search(r'grouped_articles = ({\".*)', self.tag_to_string(script))
                data = json.JSONDecoder().raw_decode(art.group(1))[0]

                feeds_dict = defaultdict(list)

                a = json.dumps(data)
                for sec in json.loads(a):
                    for item in data[sec]:
                        section = sec.replace('TH_', '')
                        title = item['articleheadline']
                        url = absurl(item['href'])
                        desc = 'Page no.' + item['pageno'] + ' | ' + item['teaser_text'] or ''
                        self.log('\t', title, '\n\t\t', url)
                        feeds_dict[section].append({"title": title, "url": url, "description": desc})
                return [(section, articles) for section, articles in feeds_dict.items()]
            else:
                return []
PK�X뾐�))hindu_business_line.png�PNG


IHDR  ��tRNSn���IDATx^�V]lE��ݻ����Z@�A,��AD*�h4��	>!����5Q_LL�	�c�&1��T�XJ��T E��O�m{��{�Ό��kn�;�{v��wΜ�=CS��m��t���GF2)�`��yHF�Y!�DV���d*�{��Ɨ�-\؈X_�?�m��
4�) Z^���3N�	E[u��ر��=��ֶ�
�t �f:
z���e��̏d�`z��
����ps�pGY;�8��M�����S_[E�CpJ�?)X�:딎/�nm�"
QL�UŋRA���OH',tԦt<��w!.����d �r��)�NΙ*y�!��^:k��i�4���=:U4K^!��R�-z�[J8��3�k��À�Ѽc�ts%�K2���/O��>��y�ug�]���=�����}ֻ�����I��y%mu]{��n�8��������M����\�#�1�P�Q"�Ѫ�$[��MߝU+W��wO����8~r0�Ns�
�l;F�<�m2F�H睌�Mq�Sq�%�Ã�SC'�ǹ���[U��jK]��/z��/�퀆–�S�E/�k:��1�hh>!�t�0��[J�O]R����210Q�]|?܊�)S+���s(�C�k�C�u�y�������|�\�:��2�:(++�����F�	�ħV4V\�-��9�hmG\tz�������;�/�僵��[&��g������� Nd���$:�p�@ک��_G6�\������F:��%�x\:��4�8�é�?�O 䚇�r�'����c���싻{�����K�X
��Pj��:��ſ�%�ƀ<Ie���X�7;��nH��QxiO�pv��$�h�9���d��i9R��up����,9����b���H�.�(7�
f��T�xs��K�Ԇҥ��vϐbT�Z@ۏ�>:izJ归A��0gT/�ӕ2̨T
��坣��U�y]$�f(�勷
��l�zY}MR���@dU��֭��x�}��}ۯM�T%��YJ��N�<燳�Χ-��.�~��)�����^�(��Q�J�L��n>?r����b1�*dE��K�@ƶ2q�Ј�jy�̕ɷ��H�}]s��G�7UMZ~��%��I�<��	ӵ��� ���y�uê�1T��Rb��N�#��HhK׸^02e��P�LKCKS��+�~u̺9VL��4L��M5�U֤hPC׳�T���\��� ���	!2�w'g�����]�
�s\��~�r���#B����	M����e�g*;T���3:�%r|���s�Uݢ���iT\�����xEO�~P�@F[7��B5�_a�'5���* S���spu��p�Z�E��Q\�h|��At)"�����޾���u��	@�
�S��M�!�r]�R[")��]~66Ne2ǻ{֬m���b�;���D3c�/b��E���	.������M|.��IEND�B`�PK�X)[QQhindu_business_line.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class BusinessLine(BasicNewsRecipe):
    title = 'The Hindu BusinessLine'
    __author__ = 'unkn0wn'
    description = (
        'The Hindu BusinessLine is known for its credibility, accuracy, in-depth analysis of markets and sober coverage'
        ' of business news. BusinessLine reduces the daily grind of business to relevant, readable, byte-sized stories.'
        ' The newspaper is extensively followed by the decision makers and change leaders from the world of business.'
    )
    no_stylesheets = True
    use_embedded_content = False
    oldest_article = 1.15  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    language = 'en_IN'
    remove_attributes = ['height', 'width', 'padding-bottom']
    masthead_url = 'https://www.thehindubusinessline.com/theme/images/bl-online/bllogo.png'
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True

    def get_cover_url(self):
        soup = self.index_to_soup(
            'https://www.magzter.com/IN/THG-publishing-pvt-ltd/The-Hindu-Business-Line/Newspaper/'
        )
        for citem in soup.findAll(
            'meta', content=lambda s: s and s.endswith('view/3.jpg')
        ):
            return citem['content']

    keep_only_tags = [
        classes(
            'tp-title-inf bi-line leadtext lead-img-caption slide-moadal img-container'
        ),
        dict(
            name='div', attrs={'id': lambda x: x and x.startswith('content-body-')}
        )
    ]

    remove_tags = [
        classes(
            'swiper-button-prev left-arrow swiper-button-next right-arrow close cursor tagsBtm share-topic comment-rules vuukle-div paywallbox '
        )
    ]

    feeds = [
        (
            'Markets',
            'https://www.thehindubusinessline.com/markets/feeder/default.rss'
        ),
        (
            'Companies',
            'https://www.thehindubusinessline.com/companies/feeder/default.rss'
        ),
        (
            'Opinion',
            'https://www.thehindubusinessline.com/opinion/feeder/default.rss'
        ),
        (
            'Economy',
            'https://www.thehindubusinessline.com/economy/feeder/default.rss'
        ),
        (
            'Portfolio Premium',
            'https://www.thehindubusinessline.com/portfolio/feeder/default.rss'
        ),
        (
            'Info-Tech',
            'https://www.thehindubusinessline.com/info-tech/feeder/default.rss'
        ),
        (
            'Data-Stories',
            'https://www.thehindubusinessline.com/data-stories/feeder/default.rss'
        ),
        (
            'Money & Banking',
            'https://www.thehindubusinessline.com/money-and-banking/feeder/default.rss'
        ),
        ('News', 'https://www.thehindubusinessline.com/news/feeder/default.rss'),
    ]

    def preprocess_html(self, soup):
        for image in soup.findAll('source', attrs={'srcset': True}):
            image['src'] = image['srcset']
        for img in soup.findAll('img', attrs={'data-src-template': True}):
            img['src'] = img['data-src-template']
        return soup
PK�X뾐�))%hindu_business_line_print_edition.png�PNG


IHDR  ��tRNSn���IDATx^�V]lE��ݻ����Z@�A,��AD*�h4��	>!����5Q_LL�	�c�&1��T�XJ��T E��O�m{��{�Ό��kn�;�{v��wΜ�=CS��m��t���GF2)�`��yHF�Y!�DV���d*�{��Ɨ�-\؈X_�?�m��
4�) Z^���3N�	E[u��ر��=��ֶ�
�t �f:
z���e��̏d�`z��
����ps�pGY;�8��M�����S_[E�CpJ�?)X�:딎/�nm�"
QL�UŋRA���OH',tԦt<��w!.����d �r��)�NΙ*y�!��^:k��i�4���=:U4K^!��R�-z�[J8��3�k��À�Ѽc�ts%�K2���/O��>��y�ug�]���=�����}ֻ�����I��y%mu]{��n�8��������M����\�#�1�P�Q"�Ѫ�$[��MߝU+W��wO����8~r0�Ns�
�l;F�<�m2F�H睌�Mq�Sq�%�Ã�SC'�ǹ���[U��jK]��/z��/�퀆–�S�E/�k:��1�hh>!�t�0��[J�O]R����210Q�]|?܊�)S+���s(�C�k�C�u�y�������|�\�:��2�:(++�����F�	�ħV4V\�-��9�hmG\tz�������;�/�僵��[&��g������� Nd���$:�p�@ک��_G6�\������F:��%�x\:��4�8�é�?�O 䚇�r�'����c���싻{�����K�X
��Pj��:��ſ�%�ƀ<Ie���X�7;��nH��QxiO�pv��$�h�9���d��i9R��up����,9����b���H�.�(7�
f��T�xs��K�Ԇҥ��vϐbT�Z@ۏ�>:izJ归A��0gT/�ӕ2̨T
��坣��U�y]$�f(�勷
��l�zY}MR���@dU��֭��x�}��}ۯM�T%��YJ��N�<燳�Χ-��.�~��)�����^�(��Q�J�L��n>?r����b1�*dE��K�@ƶ2q�Ј�jy�̕ɷ��H�}]s��G�7UMZ~��%��I�<��	ӵ��� ���y�uê�1T��Rb��N�#��HhK׸^02e��P�LKCKS��+�~u̺9VL��4L��M5�U֤hPC׳�T���\��� ���	!2�w'g�����]�
�s\��~�r���#B����	M����e�g*;T���3:�%r|���s�Uݢ���iT\�����xEO�~P�@F[7��B5�_a�'5���* S���spu��p�Z�E��Q\�h|��At)"�����޾���u��	@�
�S��M�!�r]�R[")��]~66Ne2ǻ{֬m���b�;���D3c�/b��E���	.������M|.��IEND�B`�PK�Xig=hh(hindu_business_line_print_edition.recipeimport json
import re
from collections import defaultdict
from datetime import date
from calibre.web.feeds.news import BasicNewsRecipe, classes


def absurl(url):
    if url.startswith('/'):
        url = 'https://www.thehindubusinessline.com' + url
    return url


local_edition = None
# Chennai is default edition, for other editions use 'bl_hyderabad', 'bl_bangalore', 'bl_mumbai'


class BusinessLine(BasicNewsRecipe):
    title = 'The Hindu BusinessLine | Print Edition'
    __author__ = 'unkn0wn'
    description = (
        'The Hindu BusinessLine is known for its credibility, accuracy, in-depth analysis of markets and sober coverage'
        ' of business news. BusinessLine reduces the daily grind of business to relevant, readable, byte-sized stories.'
        ' The newspaper is extensively followed by the decision makers and change leaders from the world of business.'
    )
    language = 'en_IN'
    no_stylesheets = True
    masthead_url = 'https://www.thehindubusinessline.com/theme/images/bl-online/bllogo.png'
    remove_attributes = ['style', 'height', 'width']
    extra_css = '.caption{font-size:small; text-align:center;}'\
        '.author{font-size:small; font-weight:bold;}'\
        '.subhead, .subhead_lead {font-weight:bold;}'\
        'img {display:block; margin:0 auto;}'

    ignore_duplicate_articles = {'url'}

    keep_only_tags = [
        classes('articlepage')
    ]

    remove_tags = [
        classes('hide-mobile comments-shares share-page editiondetails author-img')
    ]

    def preprocess_html(self, soup):
        for cap in soup.findAll('p', attrs={'class':'caption'}):
            cap.name = 'figcaption'
        for img in soup.findAll('img', attrs={'data-original':True}):
            img['src'] = img['data-original']
        return soup

    def parse_index(self):
        dt = date.today().strftime('%Y-%m-%d')
        # For past editions, set date to, for example, '2023-01-28'
        # dt = '2023-01-28'
        if local_edition:
            url = absurl('/todays-paper/' + dt + '/' + local_edition + '/')
        else:
            url = absurl('/todays-paper/' + dt + '/bl_chennai/')
        raw = self.index_to_soup(url, raw=True)
        soup = self.index_to_soup(raw)
        ans = self.hindu_parse_index(soup)
        if not ans:
            raise ValueError(
                    'The Hindu BusinessLine Newspaper is not published Today.'
                )
        cover = soup.find(attrs={'class':'hindu-ad'})
        if cover:
            self.cover_url = cover.img['src']
        return ans

    def hindu_parse_index(self, soup):
        for script in soup.findAll('script'):
            if not self.tag_to_string(script).strip().startswith('let grouped_articles = {}'):
                continue
            if script is not None:
                art = re.search(r'grouped_articles = ({\".*)', self.tag_to_string(script))
                data = json.JSONDecoder().raw_decode(art.group(1))[0]

                feeds_dict = defaultdict(list)

                a = json.dumps(data)
                for sec in json.loads(a):
                    for item in data[sec]:
                        section = sec.replace('BL_', '')
                        title = item['articleheadline']
                        url = absurl(item['href'])
                        desc = 'Page no.' + item['pageno'] + ' | ' + item['teaser_text'] or ''
                        self.log('\t', title, '\n\t\t', url)
                        feeds_dict[section].append({"title": title, "url": url, "description": desc})
                return [(section, articles) for section, articles in feeds_dict.items()]
            else:
                return []
PK�XMLlXhindu_human_rights.png�PNG


IHDR  ��tRNSn��	pHYsOOc����IDATH�c` ��Ic	!~N�60R⩱��acc��<`3�Y���¹T6=^W�[I������F�'��v-��]A����-�8��^�Wiȓl_�lԍ[~����_��ʈP��`���h}/
~��>?�OU��@:��%7�e���ʠ4]%��"��rB/�޵���� ��N�3�Do���׼�O��?�s��2�הj@L�jn�g��F��}�
�fC� ��Ѻ���m.�jzu?�{��G�E2(����cu���>����ӗ���$��ц�]?<�����<[��؂�[�6^Z��e��3�xe)P/x@�t���] �\���ܦ9R�����Ҳ(�q���+
�����'r0a��!	U%'�ڍ ��i.%�U�G���� U_I��9~N12���X���7�L#e7	{9�
�Z+�YƳ��fy���nF�܍�� %
t;�
���Ԙ�n���|��9��?��8(�!c)%,VcuH�����L���>+,��Op6�w6�b�2��sQг_`�p5��n���`�'ȉ�ՁVo�Nǻ~*
:�;�v���0;�;��6��n�;�<�O�����.�<��tc����>�2}����~�k�VX����
*VEH�~p��׿�L�ÁA�&?`w�=�B���˓	��<<��ldfi!	�5^��KC>���"`п����C������H��݌�"'�W���h�h�s+��r~��(V�ߊ�χ:*Ie�NxGL63U 1��8M#�ktu=����|r��,U�8-t6��l�o�����!�U�k�TOf��MUm���Ԗ��?t���S �`ʟ�̶�Z�M�*��0w�Y%(��*�QL�3y�M�i��y6@6P�<N(T-��یH���-Mjc`�IEND�B`�PK�XB�-YYhindu_human_rights.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
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 HinduHumanRights(BasicNewsRecipe):
    title          = 'Hindu Human Rights'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('HHR main', 'https://www.hindusforhumanrights.org/en/home?format=rss'),
    ]
PK�XTa^Y__hindu_post.png�PNG


IHDR  ��tRNSn��IDATxڭV�#]��I�4�d��ڶ�>�o��]۶m۶m۶m���{2{g������;�.��&b�5®��=��P�F|sH'�_��4)K�I���L ��~��i4�%�&m�Ȧ�r;D���.�J�)�L�)�x~�b���Qn���/�
���.
�#�/r�I�t�W��a��hb���bQ�Ґn��E��8r��e��^?�)9`��{N]�(�\i#�$��z"4�p��dd��s��}��'�C�'�%()��X/�`�7��!��N�5�j�˨�[⺸�9�S�t<��mG��(��C�X��7��?�ډ��In��N�2�N4s�vX�H;QB0�N�†Y�)X8���S��lY�x�m������P�.�~��s�1���܁p�(�uL醹���&8�ƶC�X7��b⍶_�L�2���[T����g�k���1�523( �?�ơG%��^��IQF�F���>!��
eS�n�$��c���O���qrf��كشۗb�
l[�5Ӱ{J����PL"��1���#�DꈒQL'��)��&P�B5���),��q.=s�,�dcs�2�M�y|�$�����|*�X$�ə^+���B�b<f�B�"̓�x�W
3zb��1�1X������`�۩h��/f����"���:yqd+�Ɓ
صۖ`�b�؅	�p�4bF_�9=�bPC�5B�.&��b*��TLl�*�$�^�ݻ�7������1�w��wh���x��( �H�M�[zOQe������dgx��Ƅ�p��;���1�[yW���#J���`I>M]׃-/i04�̭Ի*��0@ՌX8�
�egH/�@I!�*(uM����,x�­h#��@���(����pfv�@x,��H�-�B�?;\�w]�No�W�
���4�K@�5��]8��ч*ߌ��W�}}�(�6s0����JD��~���#�?A�TN���c6����
��t.�eD���h0qۄ�~ttaxC�̅��6-
 Z�K�7Z6�敠��d�$�e�<P)b����p������c� ��9��K)w��Y�?l?��WP���S^c�e��c�uS�%��!	�ÿY45� �y�+��[ߐK�3��G������-�<
�HÛ���$Y$��/�_~�y��25U3�@D�_��"j�R�T��w#��ƩdV�]T����%y��+(�3K�z��[X��mt���H���k>mt6�_�=ѣt�GɯIEND�B`�PK�X��b((hindu_post.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
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 HinduPost(BasicNewsRecipe):
    title          = 'Hindu Post'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 3
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('Main', 'https://hindupost.in/feed/'),
    ]
PK�XYy{[��hindufeeds.png�PNG


IHDR  D����PLTE# ������FFHefhmoq���545���bcf=<>&"#RRUTTVUUW_`b(%&)&'fhjklo+()opsstwtvxuwyz|{}~�������,)*������������0-/���������������������������������������������������434������������������$!"����������*�IDATx���3C�d<k۶�_jm��W�_��/�'0���]����T������EQ.쁧M��E���1$�<������$Tn��T��G2s��`�3�x|�R� ����ρ
�)pNH�,N��J���L@��A����i��WRi��&IEND�B`�PK�XC��;;hindufeeds.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from datetime import date

class TheHindufeeds(BasicNewsRecipe):
    title = 'The Hindu (Feeds)'
    __author__ = 'unkn0wn'
    description = 'The Hindu, based on RSS feeds.'
    language = 'en_IN'
    no_stylesheets = True
    masthead_url = 'https://www.thehindu.com/theme/images/th-online/thehindu-logo.svg'
    remove_attributes = ['style', 'height', 'width']
    resolve_internal_links = True
    remove_empty_feeds = True
    max_articles_per_feed = 25
    oldest_article = 1.15  # days

    extra_css = '''
        .caption {font-size:small; text-align:center;}
        .author, .dateLine, .publish-time {font-size:small; font-weight:bold;}
        .subhead, .subhead_lead, .bold {font-weight:bold;}
        img {display:block; margin:0 auto;}
        .italic {font-style:italic; color:#202020;}
    '''

    ignore_duplicate_articles = {'url'}

    keep_only_tags = [
        classes('article-section')
    ]

    remove_tags = [
        dict(name='button'),
        dict(attrs={'target':'_self'}),
        classes(
            'hide-mobile comments-shares share-page editiondetails breadcrumb'
            ' related-topics related-stories also-read premium-label'
        )
    ]

    def preprocess_html(self, soup):
        for cap in soup.findAll('p', attrs={'class':'caption'}):
            cap.name = 'figcaption'
        for img in soup.findAll('img', attrs={'data-original':True}):
            if img['data-original'].endswith('1x1_spacer.png'):
                source = img.findPrevious('source', srcset=True)
                img.extract()
                if source:
                    source['src'] = source['srcset'].replace('_320','_1200')
                    source.name = 'img'
            else:
                img['src'] = img['data-original']
        for img in soup.findAll('img', attrs={'data-src-template':True}):
            img['src'] = img['data-src-template']
        return soup

    def postprocess_html(self, soup, first_fetch):
        for src in soup.findAll('source'):
            src.extract()
        return soup

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            self.title = 'The Hindu (Feeds) ' + date.today().strftime('%b %d, %Y')
           

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.thehindu.com/todays-paper/')  
        if cover := soup.find(attrs={'class':'hindu-ad'}):
            return cover.img['src']

    # https://www.thehindu.com/rssfeeds/
    feeds = [
        ('India', 'https://www.thehindu.com/news/national/feeder/default.rss'),
        ('States', 'https://www.thehindu.com/news/states/feeder/default.rss'),
        # ('Cities', 'https://www.thehindu.com/news/cities/feeder/default.rss'),
        ('Opinion', 'https://www.thehindu.com/opinion/feeder/default.rss'),
        ('Business', 'https://www.thehindu.com/business/feeder/default.rss'),
        ('World', 'https://www.thehindu.com/news/international/feeder/default.rss'),
        # ('Sport', 'https://www.thehindu.com/sport/feeder/default.rss'),
        ('Entertainment', 'https://www.thehindu.com/entertainment/feeder/default.rss'),
        # ('Crossword', 'https://crossword.thehindu.com/?utm_source=thehindu&utm_medium=mainmenufeeder/default.rss'),
        ('Science', 'https://www.thehindu.com/sci-tech/science/feeder/default.rss'),
        ('Life and Style', 'https://www.thehindu.com/life-and-style/feeder/default.rss'),
        ('thRead', 'https://www.thehindu.com/thread/feeder/default.rss')
    ]
PK�Xv�hhhinduism_today.png�PNG


IHDR  szz�/IDATxڝWpif�{�n���`q�k�ȹ�USٸ���ƫ���H��0��69�	K3��$��}�����Z®�p*����f���AY�R�-�ZcK7/P��]�������/!	����ݣ��;�x��
���`G}��J 6ᗞ�0�L�<]`�����<��I}F`q�`�,#�b�Z���
�My0L���=�?��~�dn���g:Ѱ�9Z ��>������cV[C��,��ۏ%�Y���MT���
ئ�_>&-٢�s.�ndo�����mPG��[��t-`���T<���&r���er��'�P�64 �(�AS���@
�/~���I� �s�…��9��0dvA���P��'�0�P�t�0�e�#A|�Q%矮Y�Ai���`���Ok'��?z�q�O6���U
�ȿ�k���*����);#ڥ�t���	�;^�mD���S�	b3^mwC��l�<O��?������[��r�jD��3�Zv��7���x��frxC�,�Kx�`��
�xfu�I��	�S�����3��N|����Ū"�N�
߻�r�־H�D��
��H �1��8�/)Tg���S�r}�4Q�r���BF�����wpV�e9k��bu�
�l >�q��2�DU*�׉�3!�5�1��H�1a6ܖ�m�c"8b���p�M���o
�E��λ���[�2AQ�~vu\hju*;��D,���O�|V�h����i�<f�R�Y�R�~CTG(���"8$'k��������!8��#���^)%��()�-P�_�8�U��Wd]=m�=��$�X'���;ug"6Xi@�%�ߔ�����KR��Z!��WI�@¢<����-���e�V8�H��m|�` �F���Qkէ����U����D�:	ͧ�BƗB�>&% f��Rƥa��-���mq[$�+�
�Q�CDWk�fY�W��rւ��5%a�p��-�h�)E��D���'-��ڎo���}�|��j �]�)����4���^�@<���@g��J@u'�L�^��7���h��ʊ�Q+�ǃ�_mwO|��-^���V��m�� גjH|�h8�
`R)xwU��#�"�ḿ������Ԏu���Md��R�9ߩ���Z�ӓ�PÇV}F��&8�o%��vާ�[�
Ho�O7vq+(/f�!�l@��B��
Y�Ą�i>Or��l��G���n$Ӈr'���)��N藬>��޿R�E+a��`�m$�_�
8bx��3�M�=�%�:̈́C��j]=��-��Q/�-�O�@���|�8�K�bfk��g�t�c�~��˙K�P�)���Yķ�S�6�*9�K\R`�#��ϰY��b��.����Y�xC���s�H^,m"��3�~�[͆Fճy# =}�:f���>&-���_���SM^>UlU���v����="����6�r�);���rj*I.�A1�4
��C(���0�	�UC�d6�æ@�1[F\߱��z���Q�b�4IEND�B`�PK�XSĥś�hinduism_today.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class HinduismToday(BasicNewsRecipe):
    title          = 'Hinduism Today'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 95
    max_articles_per_feed = 100
    auto_cleanup   = True
    feeds          = [
        ('Main', 'https://www.hinduismtoday.com/feed/'),
    ]
PK�X?8R-��
hindustan.png�PNG


IHDR  ��tRNSn��	pHYs=�=�1J �@IDATH����KSa�q����i��X���"*��"	
�
B�0o�El���b-�L��$I��j;g�\̭t1���2ufhM���=�(vcg?>����9�ɓ6eI)�M�]��W�׀�ۏ�Si2���UR0�!����1L���o6£?
WA9��Z͘���#V1n��Ğ<��g�fL��
���!�V_A�{]1������Y�ֻXM&Sң�삆��������0=��lz�GS���plމ��n�,��0`�@���8�?�	Y����z�d��6:����K��[/�:�plم%I��k'��w��� A���M��I������B$����N]1�6$	|j1A���X#ć6Tu��y�xD�����?G�t"���=~���
�j�J����h%6�_�9
i{)�#���V@��0��ދ�^� �g��?�x)���G<����i*�����N��W�]�Dz��$%��r# ���X|
��d�.7¨ق��<���#%G�șD�!��G��5H�E)�\�A.(��� �_���2Yi3�IEND�B`�PK�X����I	I	hindustan.recipe#!/usr/bin/env  python

from calibre.web.feeds.news import BasicNewsRecipe, classes


class LiveHindustan(BasicNewsRecipe):
    title = 'हिंदुस्तान'
    description = 'भरोसा नए हिन्दुस्तान का। दुनिया भर में रहने वाले हिन्दीभाषी लोगों को हिन्दुस्तान समाचार पत्र के व्यापक नेटवर्क. '
    language = 'hi'
    __author__ = 'unkn0wn'
    oldest_article = 1  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    masthead_url = 'https://www.livehindustan.com/static/images/new/logo/livehindustan.svg'
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}

    keep_only_tags = [
        classes('page-hdng stry-shrt-head img-hgt-blk athr-info tm-stmp stry-bdy'),
    ]

    remove_tags = [
        classes('prlads ads'),
        dict(name='section', attrs={'class':'glry-cnt mostvdtm main-wdgt glry-bg'}),
    ]
    remove_tags_after = [classes('stry-bdy')]

    feeds = [
        ('प्रमुख खबरें' ,'https://feed.livehindustan.com/rss/3127'),
        ('देश', 'https://feed.livehindustan.com/rss/4911'),
        ('विदेश', 'https://feed.livehindustan.com/rss/4913'),
        ('ओपिनियन', 'https://feed.livehindustan.com/rss/5165'),
        ('बिजनेस', 'https://feed.livehindustan.com/rss/4950'),
        ('क्रिकेट', 'https://feed.livehindustan.com/rss/4925'),
        ('खेल', 'https://feed.livehindustan.com/rss/4931'),
        ('विज्ञान', 'https://feed.livehindustan.com/rss/1349437'),
        ('गैजेट्स', 'https://feed.livehindustan.com/rss/4955'),
        ('क्राइम', 'https://feed.livehindustan.com/rss/469651'),
        ('करियर', 'https://feed.livehindustan.com/rss/4979'),
        # https://www.livehindustan.com/rss/#collapseOne3116
        ]

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.magzter.com/IN/HT-Digital-Streams-Ltd./Hindustan-Times-Hindi-New-Delhi/Newspaper/')
        for citem in soup.findAll('meta', content=lambda s: s and s.endswith('view/3.jpg')):
            return citem['content']
PK�XQj�88hindustan_times.png�PNG


IHDR  ��tRNSn���IDATxڥVl�H~"K�,����������o���M�
�9��m�2�m�z����2�F�xf��<�=��x����W�׹�BO�Vʲ�r�����; 9���z����_�(�6WP��r��_l.̦��+oJ(�K����H�0�}�u�ƹ~��#\к��%t����ǯ|"�P$ͱc��#�2c�2�����>e�~*����Q��e��I{y����O��Ⱦ��k�1���&�+�!>Ǧ�8x���u�v�;�9���)��S�; �A�
[����9�g�(�B�6ʴB"���i���M�ɰR�$XKT�2a�]�k����Ĝ�;7a)�ϕު�<Q|�2rf�����,{~���|��>�c�5�͵����B�K�se�{���V��V�ф�1�^}��׶n�1c�Kᬭ��=���k��qp4���H��`���FR�
�pY6U� ����|A$�?T�ң��Ob#	x~Uk(A
i�Y��o�p0���!�0z���\�t3_��&�4�8
�6�����n\��6ֵ�
����`"y�I��#}C��TY6�r3�1{G����&ܗ���
��s�cHJ)i��ɶ�^a��u���=�͡���Ff/����w�IȊ��h�?~��3��x�l��U������G�O�W����^�\Yp}]��0��N�
����[F.�:�m}�(�
�o�-ƹ+�8��u��'Ze��1p0K�U��2��K��Ʈ���U���0v����5��"� ��M2��.�)]P��<��L[nC3x�8`kqj�$��x�&���ǥY���8�59��wD�4��z `F��:tF߫ê�N����}g�k����p�vgZiP~2l��
�3n�h�I:l`����1(ʁr{���`���q�d�a���`98�Ѻԙ���Q���J���v(�ϰ9:���a��)^��K��Xj�4����{���-
=��T���Ȱ~n�At`�$�3/�)�ʌ����u�։h�
:G��=����=�^d��=
7��)Z'�u�-�+���@zAXi�I\�w#bu;���ے"�H\n0zIx��&���ZggB��Gm�Kl���T�D(�r���<�
"-B�� �W״���+�!>�Z��;�3*��$�غ��
WA9`�r��+o�|����{��/���R=Bu�@@ A�d����/ז9�8b
�Y�����i@��}�W�+n Ϩ����O���*’P7���~�hH�ءɛX���Kn���l�N��y�����t`��!�D�6��֌
_�*9�Y��+����m�~�j��4��Q�U�=��<َ\��3��n��A�p�E��v
c�����k[���X��P�L3��!crୣ�`Z�+�A5��(�o�^��E��}7�о���*��w��J+�H�r���o��/�@�����IEND�B`�PK�Xϩ����hindustan_times.recipe#!/usr/bin/env  python

from calibre.web.feeds.news import BasicNewsRecipe, classes


class HindustanTimes(BasicNewsRecipe):
    title = u'Hindustan Times'
    description = 'News from India.'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    oldest_article = 1  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    masthead_url = 'https://epaper.hindustantimes.com//Images/logo/logo.png'
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}
    extra_css = '.about-authors { font-size: smaller }'

    keep_only_tags = [
        classes('fullStory dateTime storyBy storyDetails detail freemiumText paywall'),
    ]

    remove_tags = [
        classes('htsWrapper shareArticle new__newsletter__signup signup__box subscribe freemium-card adMinHeight313'
                ' storyTopics embed_div shareIcons close-btn mainCoachmarks sharePopUp'),
        dict(name='div', attrs={'class':[]}),
        dict(name=['footer', 'button']),
    ]

    feeds = [
        ('Editorial','https://www.hindustantimes.com/feeds/rss/editorials/rssfeed.xml'),
        ('Opinion','https://www.hindustantimes.com/feeds/rss/opinion/rssfeed.xml'),
        ('HT Insight','https://www.hindustantimes.com/feeds/rss/ht-insight/rssfeed.xml'),
        ('Analysis','https://www.hindustantimes.com/feeds/rss/analysis/rssfeed.xml'),
        ('India News','https://www.hindustantimes.com/feeds/rss/india-news/rssfeed.xml'),
        ('World News','https://www.hindustantimes.com/feeds/rss/world-news/rssfeed.xml'),
        ('Business','https://www.hindustantimes.com/feeds/rss/business/rssfeed.xml'),
        ('Science','https://www.hindustantimes.com/feeds/rss/science/rssfeed.xml'),
        ('Education','https://www.hindustantimes.com/feeds/rss/education/rssfeed.xml'),
        ('Elections','https://www.hindustantimes.com/feeds/rss/elections/rssfeed.xml'),
        ('Sports','https://www.hindustantimes.com/feeds/rss/sports/rssfeed.xml'),
        ('Books','https://www.hindustantimes.com/feeds/rss/books/rssfeed.xml'),
        ('HT Weekend','https://www.hindustantimes.com/feeds/rss/ht-weekend/rssfeed.xml'),
        # ('Entertainment','https://www.hindustantimes.com/feeds/rss/entertainment/rssfeed.xml'),
        # ('Lifestyle',''https://www.hindustantimes.com/feeds/rss/lifestyle/rssfeed.xml'),
        # ('Cities',''https://www.hindustantimes.com/feeds/rss/cities/rssfeed.xml'),
        # ('Budget',''https://www.hindustantimes.com/feeds/rss/budget/rssfeed.xml')
        ]

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.magzter.com/IN/HT-Digital-Streams-Ltd./Hindustan-Times-Delhi/Newspaper/')
        for citem in soup.findAll('meta', content=lambda s: s and s.endswith('view/3.jpg')):
            return citem['content']

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�XQj�88hindustan_times_print.png�PNG


IHDR  ��tRNSn���IDATxڥVl�H~"K�,����������o���M�
�9��m�2�m�z����2�F�xf��<�=��x����W�׹�BO�Vʲ�r�����; 9���z����_�(�6WP��r��_l.̦��+oJ(�K����H�0�}�u�ƹ~��#\к��%t����ǯ|"�P$ͱc��#�2c�2�����>e�~*����Q��e��I{y����O��Ⱦ��k�1���&�+�!>Ǧ�8x���u�v�;�9���)��S�; �A�
[����9�g�(�B�6ʴB"���i���M�ɰR�$XKT�2a�]�k����Ĝ�;7a)�ϕު�<Q|�2rf�����,{~���|��>�c�5�͵����B�K�se�{���V��V�ф�1�^}��׶n�1c�Kᬭ��=���k��qp4���H��`���FR�
�pY6U� ����|A$�?T�ң��Ob#	x~Uk(A
i�Y��o�p0���!�0z���\�t3_��&�4�8
�6�����n\��6ֵ�
����`"y�I��#}C��TY6�r3�1{G����&ܗ���
��s�cHJ)i��ɶ�^a��u���=�͡���Ff/����w�IȊ��h�?~��3��x�l��U������G�O�W����^�\Yp}]��0��N�
����[F.�:�m}�(�
�o�-ƹ+�8��u��'Ze��1p0K�U��2��K��Ʈ���U���0v����5��"� ��M2��.�)]P��<��L[nC3x�8`kqj�$��x�&���ǥY���8�59��wD�4��z `F��:tF߫ê�N����}g�k����p�vgZiP~2l��
�3n�h�I:l`����1(ʁr{���`���q�d�a���`98�Ѻԙ���Q���J���v(�ϰ9:���a��)^��K��Xj�4����{���-
=��T���Ȱ~n�At`�$�3/�)�ʌ����u�։h�
:G��=����=�^d��=
7��)Z'�u�-�+���@zAXi�I\�w#bu;���ے"�H\n0zIx��&���ZggB��Gm�Kl���T�D(�r���<�
"-B�� �W״���+�!>�Z��;�3*��$�غ��
WA9`�r��+o�|����{��/���R=Bu�@@ A�d����/ז9�8b
�Y�����i@��}�W�+n Ϩ����O���*’P7���~�hH�ءɛX���Kn���l�N��y�����t`��!�D�6��֌
_�*9�Y��+����m�~�j��4��Q�U�=��<َ\��3��n��A�p�E��v
c�����k[���X��P�L3��!crୣ�`Z�+�A5��(�o�^��E��}7�о���*��w��J+�H�r���o��/�@�����IEND�B`�PK�X�z����hindustan_times_print.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import json
from datetime import date
from collections import defaultdict

# figure out your local_edition from the fetch news log of this recipe
local_edition = 'Delhi'

today = date.today().strftime('%d/%m/%Y')

# for older edition, change today
# today = '22/12/2023'

day, month, year = (int(x) for x in today.split('/'))
dt = date(year, month, day)
today = today.replace('/', '%2F')

index = 'https://epaper.hindustantimes.com'

class ht(BasicNewsRecipe):
    title = 'Hindustan Times Print Edition'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    masthead_url = 'https://www.htmedia.in/wp-content/uploads/2020/08/HT-dot-com-logo-product.png'
    timefmt = ' [' + dt.strftime('%b %d, %Y') + ']'
    description = 'Articles from the Hindustan Times epaper, digital edition'
    encoding = 'utf-8'
    delay = 1
    ignore_duplicate_articles = {'title'}

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            self.title = 'HT Print Edition ' + dt.strftime('%b %d, %Y')

    extra_css = '''
        .cap { text-align:center; font-size:small; }
        img { display:block; margin:0 auto; }
    '''

    def parse_index(self):

        self.log(
            '\n***\nif this recipe fails, report it on: '
            'https://www.mobileread.com/forums/forumdisplay.php?f=228\n***\n'
        )

        get_edition = index + '/Home/GetEditionSupplementHierarchy?EditionDate=' + today
        edi_data = json.loads(self.index_to_soup(get_edition, raw=True))
        cities = []
        for edi in edi_data:
            cities.append(edi['EditionName'])
        self.log('## For your local_edition, modify this recipe to match your city from the names below\n(', ', '.join(cities), ')\n')
        for edi in edi_data:
            if edi['EditionName'] == local_edition:
                edi_name = edi['EditionName']
                edi_id = str(edi['EditionId'])
        self.log('Downloading', edi_name, 'Edition')

        url = index + '/Home/GetAllpages?editionid=' + edi_id + '&editiondate=' + today
        main_data = json.loads(self.index_to_soup(url, raw=True))

        feeds_dict = defaultdict(list)

        for page in main_data:
            page_no = page['PageNumber']
            sec_name = page['NewsProPageTitle']
            if sec_name == 'Full Page Ad':
                continue
            if sec_name.startswith('Front'):
                self.cover_url = page['HighResolution']
            art = index + '/Home/getingRectangleObject?pageid=' + str(page['PageId'])
            self.log(sec_name, ' ', page_no)
            art_data = json.loads(self.index_to_soup(art, raw=True))
            for snaps in art_data:
                section = sec_name
                url = str(snaps['OrgId'])
                title = ' '.join(snaps['StoryTitle'].split()[:15])
                if not title:
                    continue
                desc = page_no
                self.log('\t', title, ' ', desc)
                feeds_dict[section].append({"title": title, "description": desc, "url": url})
        return [(section, articles) for section, articles in feeds_dict.items()]


    def preprocess_raw_html(self, raw, *a):
        data = json.loads(raw)
        body = ''
        for x in data['StoryContent']:
            if x['Headlines']:
                if len(x['Headlines']) > 0:
                    body += '<h1>' + x['Headlines'][0].replace('\n', ' ') + '</h1>'
                for y in x['Headlines'][1:]:
                    body += '<h4>' + y.replace('\n', ' ') + '</h4>'
        if data['LinkPicture']:
            for pics in data['LinkPicture']:
                if pics['fullpathlinkpic']:
                    body += '<div><img src="{}"></div>'.format(pics['fullpathlinkpic'])
                if pics['caption']:
                    body += '<div class="cap">' + pics['caption'] + '</div><p>'
        for x in data['StoryContent']:
            if x['Body']:
                body += x['Body']
        # if data['filepathstorypic']: # this gives you a snap image of the article from page
        #     body += '<div><img src="{}"></div>'.format(data['filepathstorypic'].replace('\\', '/'))
        return '<html><body><div>' + body + '</div></body></html>'

    def print_version(self, url):
        return index + '/User/ShowArticleView?OrgId=' + url

    def populate_article_metadata(self, article, soup, first):
        article.url = '***'
PK�X'Xd''hindutamil.png�PNG


IHDR�a�IDAT8����k\e�ߙsf���d&�&e��!I,��R,h�t�.��ۢ��
�.DD�W�TD�%V���6bӉi���I2�d2��9s.�������}��=BJ)��ZˢPj
I�B(B���&���S3��T���6���F˴	�U4U�f�[�f�X���B�'�A
�����I2f�_�W��7���M��˻�-��x��yַk��brd�{���u�#["Ը�R��J�xDG�)��J��m��Qfs�I�i��i`��O�c9�N]��J˴I%�OE٫v�7A�pH@J�uy�7.�g�����\=��'���u��N�'ύQi��F�tP6M�c����#��X��s��<��Qf-_�����,N�7�j�B���v\��˅��|u=K���:��az4��A<*)%����BZ�/�g�l���IN��1�[B�!�O����i01��	<O��w�}���9�}��^���zO��(�	�4n��x��\~{���	T�`*�[[��Jb5���>�6Cv��n��[��dv!G*��K�\CU���e�4�]��^}�wA��es�I�rX����z @��v<����w�9�b��.J�i��d�DT片�~!�lǣ�0�@�߳�u=<Or'W&���Nv�J<��۩s<=��A�"h�m޼r�����*�h�j���</?w�7�^��رȁ�~��J���#T&��R�|���IF����� 	!�?�<�e��C��^Q(���IEND�B`�PK�X$^{p
p
hindutamil.recipefrom calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe, classes

class hindutamil(BasicNewsRecipe):
    title = 'இந்து தமிழ் திசை'
    __author__ = 'unkn0wn'
    description = (
        'Hindu Tamil Thisai stands differentiated from the rest of the language dailies in Tamil Nadu '
        'through its unbiased news coverage, in-depth analysis of international, national and local issues.'
    )
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'ta'
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://static.hindutamil.in/hindu/static/store/images/logo.png'
    
    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based') 
    
    keep_only_tags = [
        classes('main-article')
    ]
    
    remove_tags = [
        classes('newsbot-ads article-details-ads-inner art-follow-title1 dont-miss-it')
    ]
        
    ignore_duplicate_articles = {'title'}
    remove_empty_feeds = True    

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = []

    sections = [
        ('தமிழகம்', 'tamilnadu'),
        ('இந்தியா', 'india'),
        ('கருத்துப் பேழை', 'opinion'),
        ('உலகம்', 'world'),
        ('வணிகம்', 'business'),
        # ('விளையாட்டு', 'sports'),
        # ('தமிழ் சினிமா', 'cinema'),
        ('தொழில்நுட்பம்', 'technology'),
        # ('இணைப்பிதழ்கள்', 'supplements'),
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:hindutamil.in%2Fnews{}&hl=ta-IN&gl=IN&ceid=IN:ta'
        feeds.append((sec[0], a.format('%2F' + sec[1] + '%2F')))
    # feeds.append(('Others', a.format('')))
PK�XD�*&&historia_pl.png�PNG


IHDR��h6�IDATx�u��o�@��{��S{�!�6J�
9!%�4%mB@�5�J��Ϙ���Z���X!j��Z��og������"IjsC��E�#;�"J�Z$X�xo�..:h <��I��,+n`/�,��_}���Y����>�H�Z�5���ъ���*�����z��ocI�����'e�@��C��I%q��q`�w2+:��%6V마�2/:xx���R�{�5�����#q����>1	v6�U��Zӟ�ouz*Â2�
�8��H3v(�8a}=x��P�d��t��M(�^��_w9�Ki�C8
���S�	xsquȂ�`X+W�ׅ�4���3�B��Ng�~57���<���V1��ZS�r
�?s:#��W)A8
��>O�B�y�<�L]�u\,��j���7�����m��Xws1J��g+�,gz�2'~��“����'g�R�`
Bm�n +Ə+BH���܁��S�/�5�<P���IEND�B`�PK�Xr����historia_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Historia_org_pl(BasicNewsRecipe):
    title = u'Historia.org.pl'
    __author__ = 'fenuks'
    description = u'Artykuły dotyczące historii w układzie epok i tematów, forum. Najlepsza strona historii. Matura z historii i egzamin gimnazjalny z historii.'  # noqa
    cover_url = 'http://lh3.googleusercontent.com/_QeRQus12wGg/TOvHsZ2GN7I/AAAAAAAAD_o/LY1JZDnq7ro/logo5.jpg'
    category = 'history'
    language = 'pl'
    oldest_article = 8
    extra_css = 'img {float: left; margin-right: 10px;} .alignleft {float: left; margin-right: 10px;}'
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = True
    max_articles_per_feed = 100
    ignore_duplicate_articles = {'title', 'url'}
    feeds = [(u'Wszystkie', u'http://historia.org.pl/feed/'),
             (u'Wiadomości', u'http://historia.org.pl/Kategoria/wiadomosci/feed/'),
             (u'Publikacje', u'http://historia.org.pl/Kategoria/artykuly/feed/'),
             (u'Publicystyka', u'http://historia.org.pl/Kategoria/publicystyka/feed/'),
             (u'Recenzje', u'http://historia.org.pl/Kategoria/recenzje/feed/'),
             (u'Projekty', u'http://historia.org.pl/Kategoria/projekty/feed/'), ]
PK�X�n��OOhistory_today.png�PNG


IHDR  D����PLTE�������������������BBB�����������������������������������������������


222III---���LLL������MMM������aaa���777OOO���������:::���FFF)))888RRR������BBB\\\JJJ999DDD���***���666���TTT}}}���
M��"tRNS������������������>e�IDATx^���n�0�Q&�0��:8�<efx�wi�T3�Һլ*�[�ő�I
���K�H֍mۏ������tQ����,g3P������Z|���q�%P��`��Љ�k��W�?�8��gu���{P�A�X:�ik"���`�acS|(�n�O
e�ǿ���|vnlW��g��dC���O>�k���~jmoX.��)�)?]'ђ�䅤^�8OIEND�B`�PK�X�c+T�
�
history_today.recipefrom collections import OrderedDict
import re
from calibre.web.feeds.news import BasicNewsRecipe


class HistoryToday(BasicNewsRecipe):

    title = 'History Today'
    __author__ = 'Rick Shang'

    description = 'UK-based magazine, publishing articles and book reviews covering all types and periods of history.'
    language = 'en'
    category = 'news'
    encoding = 'UTF-8'

    remove_tags = [dict(name='div', attrs={'class': ['print-logo', 'print-site_name', 'print-breadcrumb']}),
                   dict(name='div', attrs={'id': ['ht-tools', 'ht-tools2', 'ht-tags']})]
    no_javascript = True
    no_stylesheets = True

    needs_subscription = True

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://www.historytoday.com/user/login')
            br.select_form(nr=1)
            br['name'] = self.username
            br['pass'] = self.password
            res = br.submit()
            raw = res.read()
            if b'Session limit exceeded' in raw:
                br.select_form(nr=1)
            control = br.find_control('sid').items[1]
            sid = []
            br['sid'] = sid.join(control)
            br.submit()
        return br

    def parse_index(self):

        # Find date
        soup0 = self.index_to_soup('https://www.historytoday.com/')
        dates = self.tag_to_string(soup0.find(
            'div', attrs={'id': 'block-block-226'}).span)
        self.timefmt = u' [%s]' % dates

        # Go to issue
        soup = self.index_to_soup('https://www.historytoday.com/contents')
        cover = soup.find('div', attrs={
                          'id': 'content-area'}).find('img', attrs={'src': re.compile('.*cover.*')})['src']
        self.cover_url = cover
        self.log(self.cover_url)

        # Go to the main body

        div = soup.find('div', attrs={'class': 'region region-content-bottom'})

        feeds = OrderedDict()
        section_title = ''
        for section in div.findAll('div', attrs={'id': re.compile(r"block\-views\-contents.*")}):
            section_title = self.tag_to_string(
                section.find('h2', attrs={'class': 'title'}))
            sectionbody = section.find('div', attrs={'class': 'view-content'})
            for article in sectionbody.findAll('div', attrs={'class': re.compile(r"views\-row.*")}):
                articles = []
                subarticle = []
                subarticle = article.findAll('div')
                if len(subarticle) < 2:
                    continue
                title = self.tag_to_string(subarticle[0])
                originalurl = "https://www.historytoday.com" + \
                    subarticle[0].span.a['href'].strip()
                originalpage = self.index_to_soup(originalurl)
                printurl = originalpage.find(
                    'div', attrs={'id': 'ht-tools'}).a['href'].strip()
                url = "https://www.historytoday.com" + printurl
                desc = self.tag_to_string(subarticle[1])
                articles.append({'title': title, 'url': url,
                                 'description': desc, 'date': ''})

                if articles:
                    if section_title not in feeds:
                        feeds[section_title] = []
                    feeds[section_title] += articles

        ans = [(key, val) for key, val in feeds.items()]
        return ans

    def cleanup(self):
        self.browser.open('https://www.historytoday.com/logout')
PK�Xj����
hln_be.png�PNG


IHDRb��PLTE���a�V�tRNS@��f9IDATx�c

d`teepe�|�����˙��Ge93��u?�
&���%QBIEND�B`�PK�X��y���
hln_be.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.hln.be
'''

from calibre.web.feeds.news import BasicNewsRecipe


class HLN_be(BasicNewsRecipe):
    title = 'Het Laatste Nieuws'
    __author__ = 'Darko Miletic'
    description = 'News from Belgium in Dutch'
    publisher = 'HLN'
    category = 'news, politics, Belgium'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    encoding = 'utf-8'
    language = 'nl_BE'

    conversion_options = {
        'comments': description,
        'tags': category,
        'language': 'nl-NL',
        'publisher': publisher
    }

    remove_tags = [dict(name=['form', 'object', 'embed'])]

    keep_only_tags = [
        dict(name='article', attrs={'class': 'article art_detail'}),
    ]

    feeds = [
        (u'Alle nieuws', u'http://www.hln.be/rss.xml'),
        (u'Binnenland', u'http://www.hln.be/nieuws/binnenland/rss.xml'),
        (u'Buitenland', u'http://www.hln.be/nieuws/buitenland/rss.xml'),
        (u'Sport nieuws', u'http://www.hln.be/sport/rss.xml'),
        (u'Voetbal', u'http://www.hln.be/sport/voetbal/rss.xml'),
        (u'Wielrennen', u'http://www.hln.be/sport/wielrennen/rss.xml'),
        (u'Tennis', u'http://www.hln.be/sport/tennis/rss.xml'),
        (u'Formule 1', u'http://www.hln.be/sport/formule1/rss.xml'),
        (u'Auto en Motor sport', u'http://www.hln.be/sport/automotorsport/rss.xml'),
        (u'Meer sport', u'http://www.hln.be/sport/meersport/rss.xml'),
        (u'Timeout', u'http://www.hln.be/sport/timeout/rss.xml'),
        (u'You', u'http://www.hln.be/you/rss.xml'),
        (u'Fit & Gezond', u'http://www.hln.be/you/fitgezond/rss.xml'),
        (u'Sex & Relaties', u'http://www.hln.be/you/seksrelaties/rss.xml'),
        (u'Je Carrière', u'http://www.hln.be/you/carriere/rss.xml'), (
            u'Psycho', u'http://www.hln.be/you/psycho/rss.xml'
        ), (u'Je Kinderen', u'http://www.hln.be/you/kinderen/rss.xml'),
        (u'Lekker Eten', u'http://www.hln.be/you/lekkereten/rss.xml'), (
            u'Style', u'http://www.hln.be/you/style/rss.xml'
        ), (u'Celebrities', u'http://www.hln.be/stars/celebrities/rss.xml'), (
            u'Film', u'http://www.hln.be/stars/film/rss.xml'
        ), (u'Royalty', u'http://www.hln.be/stars/royalty/rss.xml'), (
            u'Kunst & Literatuur', u'http://www.hln.be/stars/kunstliteratuur/rss.xml'
        ), (u'TV', u'http://www.hln.be/stars/tv/rss.xml'), (
            u'Reizen', u'http://www.hln.be/reizen/rss.xml'
        ), (u'Planet', u'http://www.hln.be/planet/rss.xml'), (
            u'Extreme Aarde', u'http://www.hln.be/planet/extremeaarde/rss.xml'
        ), (u'Global Warming', u'http://www.hln.be/planet/globalwarming/rss.xml'), (
            u'Ecotips', u'http://www.hln.be/planet/ecotips/rss.xml'
        ), (u'Dieren', u'hhttp://www.hln.be/planet/dieren/rss.xml'), (
            u'Milieu', u'http://www.hln.be/planet/milieu/rss.xml'
        ), (u'Auto', u'http://www.hln.be/auto/rss.xml'), (
            u'iHLN', u'http://www.hln.be/ihln/rss.xml'
        ), (u'Multimedia', u'http://www.hln.be/ihln/multimedia/rss.xml'), (
            u'Internet', u'http://www.hln.be/ihln/internet/rss.xml'
        ), (u'Games', u'http://www.hln.be/ihln/games/rss.xml'), (
            u'Geld', u'http://www.hln.be/geld/rss.xml'
        ), (u'Economie', u'http://www.hln.be/geld/economie/rss.xml'), (
            u'Consument', u'http://www.hln.be/geld/consument/rss.xml'
        ), (u'Bizar', u'http://www.hln.be/bizar/rss.xml'), (
            u'Wetenschap', u'http://www.hln.be/wetenschap/rss.xml'
        ), (u'Muziek', u'http://www.hln.be/muziek/rss.xml'),
        (u'Muziek nieuws', u'http://www.hln.be/muziek/nieuws/rss.xml'), (
            u'Festivals en concerten',
            u'http://www.hln.be/muziek/festivalsconcerten/rss.xml'
        ), (u'Nieuwe platen', u'http://www.hln.be/muziek/nieuweplaten/rss.xml'),
        (u'Geld', u'http://www.hln.be/geld/rss.xml')
    ]
PK�X�`��%%hna.png�PNG


IHDR(-S�PLTE @�/H�(R�I�
?�?�>�>�<�<�	=�	?�?�7�8�6�;�<�=�?�@�A�A�A�B�B�C�C�>�:�C�C�D�G�C�F�E�B�M�K�L� T�#T�"\�3j�>j�>`�Fa�Rg�Xi�Sd�Vo�^y�cy�c{�`}�d��k��m�r~�y��~��}��{��y��������������������������������������������~��}��r��t��m��b��>p�et���~���������������������������������������pn�pm�li�ig�fa�c]�^[�\Z�ZW�ML�IE�EB�FA�A?�><�86�86�21�,(�+'�%$�!������
������
�	���������������
��.�
/�0�1�1�3�8�9�5�
5�*�mfL�tRNS@��f�IDATx]��J�@�s��ɥ�
X�P!ō���}:_ǽ�A@Wu%��$�$�ɸU?�G����}7�������2�}�gXem<�6]����G��a�0k�h��	Wͼ��P*fbx�?���5��Щp�u:d@��Y��늯"i3S�	���;ou~e�X�){�K���6M�p�{���z_��<̣l��I©��i'�������WFT���nIEND�B`�PK�X� C���
hna.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch Hessisch Niedersachsische Allgemeine.
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes


class hnaDe(BasicNewsRecipe):

    title = 'HNA'
    description = 'local news from Hessen/Germany'
    __author__ = 'Oliver Niesner'
    use_embedded_content = False
    language = 'de'
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 40
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'
    masthead_url = 'https://idcdn.de/west/assets/hna-de/img/logo--cf5324e1.svg'

    def get_cover_url(self):
        soup = self.index_to_soup('https://epaper.meinehna.de/')
        if a := soup.find('a', attrs={'class':'edition-cover__link'}):
            if citem := a.find('img', src=True):
                return citem['src']

    keep_only_tags = [
        dict(name='article', attrs={'class':lambda x: x and 'id-Story' in x.split()})
    ]
    remove_tags = [
        classes(
            'id-DonaldBreadcrumb id-StoryElement-interactionBar id-Recommendation '
            'id-Comments id-Comments--targetHelper id-StoryElement-inArticleReco'
        )
    ]

    feeds = [
        ('hna_soehre', 'http://feeds2.feedburner.com/hna/soehre'),
        ('hna_kassel', 'http://feeds2.feedburner.com/hna/kassel'),
        ('hna_KSV', 'http://feeds2.feedburner.com/hna/ksv'),
        ('hna_kultur', 'http://feeds2.feedburner.com/hna/kultur')
    ]
PK�X���xxhnonline.png�PNG


IHDR22)�x�#PLTE0d������Km�1d���������/cCf�������"Ly���Jl�2f���@p1e���r��Cs���2e	7j5hj�����6h��Iw���l���������^}�Vv�AqGu9^�Hk�<mEsp��������������2Y�/b��������\{�6i Jw
;l�����e��Ik����>b������Yx�������.`0eEh����.a4g~��?o������/V����1ea�3f4g���3Y����0W����Mo�<mk�����Dg���IDATx^���n�0��{m�y��������^�7�T�7��[��rd� ��'�K�N�4VqMÜ�څ,��Zh�T@5��yvH�v{�N���k��;�Sd���7��!�H�:m{
N�m	fZs�S��F���d�+h
C�K�����4�&�e"�{˚�&Ҷ�Ff}���2A[�;dv˵H�3h߉8pi��iR8D�&G�&'�ar�D�/�7��Q�WR,���ڞw���n�<>1�^�~-�~��Q��J1V���).�Vv)NWԘ�IEND�B`�PK�XԪR��
�
hnonline.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HNonlineRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'lacike'
    language = 'sk'
    version = 1

    title = u'HNonline'
    publisher = u'HNonline'
    category = u'News, Newspaper'
    description = u'News from Slovakia'
    cover_url = u'http://hnonline.sk/img/sk/_relaunch/logo2.png'

    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False
    remove_empty_feeds = True

    no_stylesheets = True
    remove_javascript = True

    # Feeds from: http://rss.hnonline.sk, for listing see
    # http://rss.hnonline.sk/prehlad
    feeds = []
    feeds.append((u'HNonline|Ekonomika a firmy',
                  u'http://rss.hnonline.sk/?p=kC1000'))
    feeds.append((u'HNonline|Slovensko', u'http://rss.hnonline.sk/?p=kC2000'))
    feeds.append((u'HNonline|Svet', u'http://rss.hnonline.sk/?p=kC3000'))
    feeds.append((u'HNonline|\u0160port', u'http://rss.hnonline.sk/?p=kC4000'))
    feeds.append((u'HNonline|Online rozhovor',
                  u'http://rss.hnonline.sk/?p=kCR000'))

    feeds.append((u'FinWeb|Spr\u00E1vy zo sveta financi\u00ED',
                  u'http://rss.finweb.hnonline.sk/spravodajstvo'))
    feeds.append((u'FinWeb|Koment\u00E1re a anal\u00FDzy',
                  u'http://rss.finweb.hnonline.sk/?p=kPC200'))
    feeds.append((u'FinWeb|Invest\u00EDcie',
                  u'http://rss.finweb.hnonline.sk/?p=kPC300'))
    feeds.append((u'FinWeb|Svet akci\u00ED',
                  u'http://rss.finweb.hnonline.sk/?p=kPC400'))
    feeds.append(
        (u'FinWeb|Rozhovory', u'http://rss.finweb.hnonline.sk/?p=kPC500'))
    feeds.append((u'FinWeb|T\u00E9ma t\u00FD\u017Ed\u0148a',
                  u'http://rss.finweb.hnonline.sk/?p=kPC600'))
    feeds.append((u'FinWeb|Rebr\u00ED\u010Dky',
                  u'http://rss.finweb.hnonline.sk/?p=kPC700'))

    feeds.append((u'HNstyle|Kult\u00FAra',
                  u'http://style.hnonline.sk/?p=kTC100'))
    feeds.append((u'HNstyle|Auto-moto', u'http://style.hnonline.sk/?p=kTC200'))
    feeds.append((u'HNstyle|Digit\u00E1l',
                  u'http://style.hnonline.sk/?p=kTC300'))
    feeds.append((u'HNstyle|Veda', u'http://style.hnonline.sk/?p=kTCV00'))
    feeds.append((u'HNstyle|Dizajn', u'http://style.hnonline.sk/?p=kTC400'))
    feeds.append(
        (u'HNstyle|Cestovanie', u'http://style.hnonline.sk/?p=kTCc00'))
    feeds.append(
        (u'HNstyle|V\u00EDkend', u'http://style.hnonline.sk/?p=kTC800'))
    feeds.append((u'HNstyle|Gastro', u'http://style.hnonline.sk/?p=kTC600'))
    feeds.append((u'HNstyle|M\u00F3da', u'http://style.hnonline.sk/?p=kTC700'))
    feeds.append((u'HNstyle|Modern\u00E1 \u017Eena',
                  u'http://style.hnonline.sk/?p=kTCA00'))
    feeds.append((u'HNstyle|Pre\u010Do nie?!',
                  u'http://style.hnonline.sk/?p=k7C000'))

    keep_only_tags = []
    keep_only_tags.append(dict(name='h1', attrs={'class': 'detail-titulek'}))
    keep_only_tags.append(
        dict(name='div', attrs={'class': 'detail-podtitulek'}))
    keep_only_tags.append(dict(name='div', attrs={'class': 'detail-perex'}))
    keep_only_tags.append(dict(name='div', attrs={'class': 'detail-text'}))

    extra_css = '''
                @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/LiberationSans.ttf)}
                body {font-family: sans1, serif1;}
                '''
PK�X
��a!!hoersholmlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X�l�77hoersholmlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Ugebladet
'''


class HoersholmLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Ugebladet'
    description = 'Lokale, regionale nyheder, sport og kultur i Hørsholm, Rungsted, Fredensborg og Humlebæk på hoersholm.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Ugebladet', 'http://hoersholm.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Ugebladet', 'http://hoersholm.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Ugebladet', 'http://hoersholm.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Ugebladet', 'http://hoersholm.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Ugebladet', 'http://hoersholm.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Ugebladet', 'http://hoersholm.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�XW�Veehola.png�PNG


IHDR(-S�PLTE��

��$�$$�?-�}}���--�66�=6�??�GG�VG�jj�p^�qk�tt�������������������������@@�}}�����������������������������������[��IDAT��N�`�s?@����m��Y-�شb�� �͵`�2Eg�_W��/9}�9���(�Uq
'm�^��vYJ�w~�#�ȚD�+Q�Cs��Nsb���n}�ud���ܪ�)�@����XF�d�/��Vn���r���f5��$�IEND�B`�PK�X�`�JJhola.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8
__license__ = 'GPL v3'
__copyright__ = '30 June 2012, desUBIKado'
__author__ = 'desUBIKado'
__description__ = 'Diario de actualidad, moda y belleza'
__version__ = 'v0.03'
__date__ = '28, Jul 2016'
'''
http://www.hola.com/
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class hola_es(BasicNewsRecipe):
    author = 'desUBIKado'
    description = 'Diario de actualidad, moda y belleza'
    title = u'¡Hola!'
    publisher = 'Hola S.L.'
    category = 'Spanish celebrities, Entertainment News, Royalty, Daily Variety, Hollywood'
    language = 'es'
    masthead_url = 'http://imagenes.hola.com/comunes/2008/logo-holacom.gif'
    timefmt = '[%a, %d %b, %Y]'
    oldest_article = 7
    delay = 1
    encoding = 'utf-8'
    max_articles_per_feed = 100
    use_embedded_content = False
    remove_empty_feeds = True
    remove_javascript = True
    no_stylesheets = True

    feeds = [

    (u'Famosos', u'http://www.hola.com/famosos/rss.xml'),
    (u'Realeza', u'http://www.hola.com/realeza/rss.xml'),
    (u'Cine', u'http://www.hola.com/cine/rss.xml'),
    (u'M\xfasica', u'http://www.hola.com/musica/rss.xml'),
    (u'Moda y modelos', u'http://www.hola.com/moda/portada/rss.xml'),
    (u'Belleza y salud', u'http://www.hola.com/belleza/portada/rss.xml'),
    (u'Ni\xf1os', u'http://www.hola.com/ninos/rss.xml')
    ]

    keep_only_tags = [
        dict(name='article', attrs={'class': ['body col-md-8 col-xs-12']})]

    remove_tags = [dict(name='div', attrs={'class': ['comments', 'news-share', 'sponsored-news']}),
                   dict(name='div', attrs={'itemprop': ['logo']}),
                   dict(name='span', attrs={'class': ['hidden']}),
                   dict(name='p', attrs={'class': ['hidden']}),
                   dict(name='section', attrs={'class': ['news-tags']})
                   ]

    remove_tags_after = dict(name='div', attrs={'class': 'comments'})

    # <span>VER GALERÍA<i data-icon="1" class="icon"></i></span>
    preprocess_regexps = [
        # Quitar VER GALERÍA
        (re.compile(r'<span>VER GALER', re.DOTALL | re.IGNORECASE), lambda m: '<!--'),
        (re.compile(r'class="icon"></i></span>',
                    re.DOTALL | re.IGNORECASE), lambda m: '-->'),
        # Quitar enlaces varios
        (re.compile(r'<p><a href="http://www.hola.com',
                    re.DOTALL | re.IGNORECASE), lambda m: '<!--'),
        (re.compile(r'<p style="text-align: center;">',
                    re.DOTALL | re.IGNORECASE), lambda m: '<!--'),
        (re.compile(r'<p style="line-height: 20.8px;"><a href="http://www.hola.com',
                    re.DOTALL | re.IGNORECASE), lambda m: '<!--'),
        (re.compile(r'</strong></a></p>',
                    re.DOTALL | re.IGNORECASE), lambda m: '-->')
    ]

    # Recuperamos la portada de papel (la imagen 520 tiene mayor resolucion)
    # http://www.hola.com/imagenes/revista/3727/portada-revista-hola-520.jpg
    def get_cover_url(self):
        index = 'http://www.hola.com/abono/ediciondigital/'
        soup = self.index_to_soup(index)
        for image in soup.findAll('img', src=True):
            if image['src'].endswith('portada-revista-hola-520.jpg'):
                return 'http://www.hola.com' + image['src']
        return None

    def get_article_url(self, article):
        url = article.get('guid', None)
        return url

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:30px;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal; font-style:italic; font-size:18px;}
                '''
PK�X�;��hollywood_reporter.png�PNG


IHDR��h6�IDATx�c8��B"G3I��(7I��/�!���@�!&0bd8��t���3�a6�H1�ϯ�ţbX��䪫8sr�22���$���	d�3�Tljb��f3�����>�����������������+���10����]Y錋��W/��܅����ԧ�{�UV�ge^%!��Ҽ������O�l�����99.v�&!�5`ݍ��XN��e޼�/Ϟ]�����(U����%[E�Vr�]��:r���%`��<��؀�2��e+�L��,>UBz���)���M���o
[^S3KSwgb��ҒE*Z�EE/a�ܐ�<��q��4�RI���+���I+/�]�/�RBa���
���
 )a��2!���K��ɨ���K+O�V��!!M��Y\�Y\H�e C��(6$F��$�a;����IEND�B`�PK�X�A[

hollywood_reporter.recipe__license__ = 'GPL v3'
__copyright__ = '2014, Darko Miletic <darko.miletic at gmail.com>'
'''
www.hollywoodreporter.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class THR_En(BasicNewsRecipe):
    title = 'The Hollywood Reporter'
    __author__ = 'Darko Miletic'
    description = 'Read about the latest in Hollywood and entertainment news from The Hollywood Reporter, your source for detailed movie reviews, celebrity styles, and industry blogs.'  # noqa
    publisher = 'The Hollywood Reporter'
    category = 'Entertainment news, Hollywood news, celebrity news, latest Hollywood news'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    auto_cleanup = True
    auto_cleanup_keep = "//div[contains(concat(' ', normalize-space(@class), ' '), ' image ')]"

    extra_css             = """
                               body{font-family: Georgia,Times,serif}
                               h1,h2,h3{font-family: "Vonness-Bold-Compressed",Helvetica,sans-serif}
                               .credit,.caption{font-family: Arial,sans-serif;}
                               .credit,.caption,.submitted{font-size: small; color: gray;}
                               .main_media_credit{clear: left; font-size: x-small; text-align: right; color: gray;}
                               img{margin-top: 0.5em; margin-bottom: 0.4em; display:block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [

    (u'Movies', u'http://feeds.feedburner.com/thr/film'),
    (u'TV', u'http://feeds.feedburner.com/thr/television'),
    (u'Style&Culture', u'http://feeds.feedburner.com/thr/style'),
    (u'International', u'http://feeds.feedburner.com/thr/international'),
    (u'Music', u'http://feeds.feedburner.com/thr/music'),
    (u'Tech', u'http://feeds.feedburner.com/TheHollywoodReporter-Technology'),
    (u'Awards', u'http://feeds.feedburner.com/thr/awards'),
    (u'Business', u'http://feeds.feedburner.com/thr/business'),
    (u'Asia', u'http://feeds.feedburner.com/HollywoodReporterAsia'),
    (u'Guilds and Labor', u'http://feeds.feedburner.com/thr/labor'),
    (u'Box Office', u'http://feeds.feedburner.com/thr/boxoffice'),
    (u'Real Estate', u'http://feeds.feedburner.com/thr/RealEstate'),
    (u'Politics', u'http://feeds.feedburner.com/thr/politics')
    ]
PK�X�.R�FFholzkirchener_merkur.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X!
m�holzkirchener_merkur.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Holzkirchener Merkur'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard', u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Region Holzkirchen', u'http://www.merkur-online.de/lokales/region-holzkirchen/holzkirchen/rssfeed.rdf'),
    (u'Wayarn', u'http://www.merkur-online.de/lokales/region-holzkirchen/weyarn/rssfeed.rdf'),
    (u'Warngau', u'http://www.merkur-online.de/lokales/region-holzkirchen/warngau/rssfeed.rdf'),
    (u'Valley', u'http://www.merkur-online.de/lokales/region-holzkirchen/valley/rssfeed.rdf'),
    (u'Ottering', u'http://www.merkur-online.de/lokales/region-holzkirchen/otterfing/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X�g�+\\horizons.png�PNG


IHDR���6QPLTEGpL���y3���|gЭ
tRNS:G�B1$*M �W'�q��;c!bMH�|��;��IDAT�-��0׸�n�)W��Ѓ䐐X�CA�(q�ٴ��\��ʶ>��Q��s%��Y��{n��7���f���='Swg�=�Å�Jb�	��W��!�����@eYT�*d�j�V�LN���z���7��
7��7xV�����_�>�=�1:�#�|IEND�B`�PK�X�q���horizons.recipe'''
https://www.cirsd.org/en/horizons
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes

class horizons(BasicNewsRecipe):
    title = 'Horizons'
    __author__ = 'unkn0wn'
    description = (' Horizons – Journal of International Relations and Sustainable Development.'
    ' Horizons serves as a high-level platform for influential voices from around the world to'
    ' provide informed analysis and conduct reasoned exchanges on the full spectrum of issues'
    ' that shape international developments.')
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://www.cirsd.org/bundles/olpublic/images/horizons-logo.jpg'
    ignore_duplicate_articles = {'url'}
    extra_css = 'em{color:#404040;}'

    keep_only_tags = [
        dict(name='div', attrs={'class':'article'})
    ]
    remove_tags = [
        classes('back-link'),
        dict(name='div', attrs={'class':'single-post-footer'})
    ]
    
    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, verify_ssl_certificates=False)

    def parse_index(self):
        soup = self.index_to_soup('https://www.cirsd.org/en/horizons')
        a = soup.findAll('a', href=True, attrs={'class':'horizon-gallery-box'})[0] #use 1 for previous edition
        url = a['href']
        if url.startswith('/'):
            url = 'https://www.cirsd.org' + url
        self.cover_url = a.find('img')['src']
        self.log(self.cover_url)
        issue = a.find('div', attrs={'class':'horizon-gallery-title'})
        if issue:
            self.title = self.tag_to_string(issue).strip()
            self.timefmt = ' [' + self.tag_to_string(issue).strip().replace('Horizons ', '')  + ']'
            self.log('Downloading Issue: ', self.timefmt, self.title)
        soup = self.index_to_soup(url)

        feeds = []
        for section in soup.findAll('h2', attrs={'class':'mt-3'}):
            secname = self.tag_to_string(section).strip()
            self.log(secname)
            articles = []
            div = section.findNext('div', attrs={'class':'mb-3'})
            for li in div.findAll('li', attrs={'class':'mb-2'}):
                a = li.find('a', href=True)
                url = a['href']
                if url.startswith('/'):
                    url = 'https://www.cirsd.org' + url
                title = self.tag_to_string(a)
                span = li.find('span', attrs={'class':'section-author'})
                desc = ''
                if span:
                    desc = self.tag_to_string(span).strip()
                self.log('\t', title, '\n\t', desc, '\n\t\t', url)
                articles.append({
                    'title': title,
                    'url': url,
                    'description': desc})
            if articles:
                feeds.append((secname, articles))
        return feeds
PK�X�����hornsherredavis_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Hornsherred Avis
'''


class Hornsherredavis_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'Hornsherred Avis'
    description           = 'Lokale nyheder fra Jægerspis, Skibby og Bramsnæs'
    category              = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article        = 30
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://hornsherredavis.dk/
    feeds = [
        ('Hornsherred Avis', 'http://hornsherredavis.dk/?feed=rss2'),
        ('Kommentarer til Hornsherred Avis', 'http://hornsherredavis.dk/?feed=comments-rss2'),
    ]
PK�X
��a!!hornsherredlokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X�&�(�� hornsherredlokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Hornsherred
'''


class HornsherredLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Hornsherred'
    description = 'Lokale og regionale nyheder, sport og kultur fra Hornsherred og omegn på hornsherred.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Hornsherred', 'http://hornsherred.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Hornsherred', 'http://hornsherred.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Hornsherred', 'http://hornsherred.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Hornsherred', 'http://hornsherred.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Hornsherred', 'http://hornsherred.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Hornsherred', 'http://hornsherred.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X���


hotair.png�PNG


IHDR��h6�IDATxڍ�1�0P�#�������k$���ٺ��.�[��U�vk=e���
yH��`�]Do�AU�}����Ľ�A|������*�4DG�BL���-�J-�Ɠpy/�%�����vI�d�Mp�zN˳��̉i�����P\$q���[��o�A4ܺ������0��tbd�S�%>�Z�RV?�J�Y�ăIEND�B`�PK�X�k�
hotair.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Walt Anthony <workshop.northpole at gmail.com>'
'''
www.hotair.com
'''

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 hotair(BasicNewsRecipe):
    title = u'Hot Air'
    __author__ = 'Walt Anthony'
    description = "The world's first, full-service conservative Internet broadcast network"
    publisher = 'Hot Air'
    category = 'news, politics, USA'
    oldest_article = 3
    max_articles_per_feed = 100
    summary_length = 150
    language = 'en'
    encoding = 'utf-8'
    use_embedded_content = False
    remove_javascript = True

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
            dict(name='h1'),
            classes('byline article-image article-text'),
    ]

    remove_tags = [dict(name=['iframe', 'small', 'embed', 'button',
                              'object', 'link', 'script', 'form'])]

    feeds = [
        ('Hot Air', 'http://feeds.feedburner.com/hotair/main'),
        ('The Greenroom', 'http://feeds2.feedburner.com/hotair/greenroom')
    ]
PK�X�Jl��hotcity.png�PNG


IHDR��7�KIDATx�c@�<���J���[�Qr��2x$�4[��վ�!5u�nw�`�K�S���_��R�O��-���szF���_�p�F�5���l��gbz��3��8�F���C�XQ7��WdB8pp�H�9H��$���G,
��	��i\�3�^>�@(����`VD���w|0�_LE�Ѩ�
5f��/l� ��c�;%�赿 NE+‚;
k
�ޑ�����`E��IY@�;>��H&�E�2�g��6�[<X~";rN�G��˟�!�s����n;\��9��]��;�T�[�8ju�iwW�9=�m��V�2gUIEND�B`�PK�X���		hotcity.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
hotcity.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class HotcityRo(BasicNewsRecipe):
    title = u'Hotcity'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Cultura urban\u0103 feminin\u0103'
    publisher = 'Hotcity'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste'
    encoding = 'utf-8'
    cover_url = 'http://www.hotcity.ro/i/bg_header.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'articol_title'}), dict(
            name='div', attrs={'class': 'text'})
    ]

    feeds = [
        (u'Feeds', u'http://www.hotcity.ro/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X0��hotnews.png�PNG


IHDR00`�	�HPLTE����������k��H��%�Ԏ���b������ڠ�����1����Hs���Ϊ��nnn%s��’�������IDATx���E�A@�hIp��M�v�̚�+y���W:�����t�������w��	�2����k�z/�l�(B�(��K RȢ��
 !J�9��Mr�^%���]���5��4g@��C:4���d\�_0�<�:��E|�cȳ�N�Γs��i�s������	(��̬�E$���p�;@�4➏q! ��ó]�p<���(��	�KEsS���Y�0T�Z�dIEND�B`�PK�X�LWMMhotnews.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
hotnews.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Hotnews(BasicNewsRecipe):
    title = 'Hotnews'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'\u0218tiri din Rom\u00e2nia'
    publisher = 'Hotnews'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania'
    encoding = 'utf-8'
    cover_url = 'http://www.hotnews.ro/images/new/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'title'}), dict(
            name='div', attrs={'id': 'articleContent'})
    ]

    feeds = [(u'\u0218tiri', u'http://www.hotnews.ro/rss/actualitate'), (u'English', u'http://www.hotnews.ro/rss/english')
             ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X��house_news.png�PNG


IHDR��h6�IDATxڅ��k�p�����@&^<��P<U�)(��S��Ae�i��:w�~vI���7KWۮ]�Tڦ���K2�ő�>%�aC
^�>����,w��
y�wTGY��_Z�24�‰�2���:��X���W����D��f>?�����f����qYQ��[�� b�1�'^B���Z�,�v]״LEU)�~�O���=
�"Iz4�@4[�v��p �25�<yS��Ns���,Y�&!H�����5ͨV�4�}�IV7��F�I���x)�mHc�i��-����/� ��C�L���	� Ȅ�ΰ7�;��%ߢk�H��Ր6��҈�'�M��93�`�g��J����V�\��ht��=u�pM}^?�&N.�d�R�l�q�5,��
8�e[y����B�Ȕ1�R�4�]1�j���Ye�?��r��N���:���5�MS/W�_鋱�2rYz��Z"�&2.�k�i�IEND�B`�PK�X�f%66house_news.recipe__license__ = 'GPL v3'
__copyright__ = '2012-2015, Eddie Lau'
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipeHouseNews(BasicNewsRecipe):
    title = u'The House News Bloggers 主場博客'
    __author__ = 'Eddie Lau'
    publisher = 'The House News Bloggers'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = False
    no_stylesheets = True
    language = 'zh'
    encoding = 'utf-8'
    description = 'http://thehousenewsbloggers.net'
    category = 'Chinese, Blogs, Opinion, News, Hong Kong'
    masthead_url = 'http://thehousenewsbloggers.files.wordpress.com/2014/09/screen-shot-2014-09-11-at-8-55-13.png'
    extra_css = 'img {display: block; margin-left: auto; margin-right: auto; margin-top: 10px; margin-bottom: 10px; max-height:90%;} p[class=date] {font-size:50%;} div[class=author] {font-size:75%;} p[class=caption] {font-size:50%;}'  # noqa
    feeds = [(u'Latest', u'http://thehousenewsbloggers.net/feed/')]
    keep_only_tags = [dict(name='h1', attrs={'class': ['title']}),
                      dict(name='span', attrs={'class': ['author vcard']}),
                      dict(name='time', attrs={'class': ['entry-date']}),
                      dict(name='section', attrs={'class': ['entry']})]
    remove_tags = [dict(name='div', attrs={'id': ['jp-post-flair']})]

    def populate_article_metadata(self, article, soup, first):
        if first and hasattr(self, 'add_toc_thumbnail'):
            picdiv = soup.find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, picdiv['src'])
PK�X��`ت�houston_chronicle.png�PNG


IHDR(-SPLTE�������������SIDATx���  ���@8�@@�' �IylBXt�[�	��{�b7 P���&��$��x@�h�
 ���
t��IEND�B`�PK�XҾ�_ ( (houston_chronicle.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
__license__   = 'GPL v3'
__copyright__ = '2018, Dale Furrow dkfurrow@gmail.com'
'''
chron.com
'''
import re
import time
from datetime import datetime
import traceback
import sys
from collections import OrderedDict

from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.utils.cleantext import clean_ascii_chars
from calibre.ebooks.BeautifulSoup import NavigableString
from calibre.utils.date import dt_factory, local_tz, utcfromtimestamp

regex_date_only = re.compile(r"""(?:January|February|March|April|
 {8}May|June|July|August|September|October|November|
 {8}December)\s[0-9]{1,2},\s20[01][0-9]""")
regex_time_only = re.compile(r"""[0-9]{1,2}:[0-9]{1,2} \w{2}""")
sentence_regex = re.compile(r"(\S.+?[.!?])(?=\s+|$)")
blog_regex = re.compile(r'post-\d+')

pages = OrderedDict([('news', ('/news/houston-texas/', ['business', 'sports'])),
                     ('business', ('/business/', ['sports'])),
                     ('sports', ('/sports/', ['business']))])

base_url = "http://www.chron.com"

# sports has 'core-package sports' class
xpath_general = """//div[contains(@class, 'centerpiece-tabs') or
                    contains(@class, 'wrapper') or
                    contains(@class, 'contentGroups') or
                    contains(@class, 'headline-list') or
                    contains(@class, 'core-package sports') or
                    contains(@class, 'news')]
                   //a[contains(@class, 'hdn-analytics')]"""

excluded_titles = ["Winning numbers", "TV-radio listings"]


def validate_link(page, link, title):
    other_category = page[1][1]
    if not title or len(title.strip()) < 5:
        print("{0} rejected, title too short".format(link))
        return None
    parts = link.split('/')
    if len(parts) > 3 and parts[3] in other_category:
        print("{0} rejected, covered in other section".format(link))
        return None
    for excluded_title in excluded_titles:
        if title.find(excluded_title) != -1:
            print("{0} rejected, excluded title".format(link))
            return None
    return link, title


def get_article_parsed(index_to_soup, this_url):
    return index_to_soup(this_url, as_tree=True)


def sort_subject(element_list):
    # priority of subjects
    subjects = ['news', 'neighborhood', 'entertainment']
    subjects.reverse()
    subject_dict = OrderedDict(zip(subjects, range(len(subjects))))
    rank_dict = OrderedDict([(rank, []) for rank in range(len(subjects) + 1)])
    for element in element_list:
        try:
            subj = element[0].split('/')[3]
        except Exception:
            subj = 'unknown'
        if subject_dict.get(subj) is not None:
            rank_dict[subject_dict[subj] + 1].append(element)
        else:
            rank_dict[0].append(element)
    # now return in reverse order, sorted
    combined_list = []
    for rank in range(len(subjects), -1, -1):
        article_list = rank_dict[rank]
        article_list.sort()
        combined_list.extend(article_list)
    return combined_list


def get_links_from_section_page(index_to_soup, page):
    page_doc = get_article_parsed(index_to_soup, base_url + page[1][0])
    els = page_doc.xpath(xpath_general)
    element_list = []
    for el in els:
        link = el.get('href').split('?')[0]
        title = el.text
        if title is None or len(title.strip()) < 5:
            link_id = link.split('/')[-1][:-3].split('-')[:-1]
            title = ' '.join(link_id)
        if link[:4] != 'http':
            link = base_url + link
        validated_link = validate_link(page=page, link=link, title=title)
        if validated_link is not None:
            element_list.append(validated_link)
    sorted_element_list = sort_subject(element_list)
    return [page[0], sorted_element_list]


def get_all_links_from_sections(index_to_soup):
    all_sections = []
    article_set = set()
    final_dict = OrderedDict()
    for item in pages.items():
        print("getting links from {0}".format(item[0]))
        all_sections.append(get_links_from_section_page(index_to_soup, item))
    for section in all_sections:
        section_id = section[0]
        article_list = section[1]
        final_dict[section_id] = []
        for article in article_list:
            if article[0] not in article_set:
                article_set.add(article[0])
                final_dict[section_id].append(article)
    return final_dict


# noinspection PyAbstractClass
class HoustonChronicle(BasicNewsRecipe):
    title = u'The Houston Chronicle'
    description = 'News from Houston, Texas'
    __author__ = 'Dale Furrow'
    language = 'en'
    no_stylesheets = True
    remove_attributes = ['style', 'xmlns']
    remove_empty_feeds = True
    timefmt = '[%a, %d %b %Y]'
    timestampfmt = '%Y%m%d%H%M%S'
    # ignore_duplicate_articles = {'url'}  #  defaults to None
    extra_css = '.article_date {display: none}'
    category = 'news, USA'
    masthead_url = 'http://www.chron.com/apple-touch-icon-76x76.png'
    keep_only_tags = [dict(name='div', attrs={'class': ['article-content', 'article-wrap']})]
    remove_tags = [dict(name='div', attrs={'social-title': True}),
                   dict(name='div', attrs={'class':
                                           ['control-panel', 'gallery-overlay-inner',
                                            'most-popular', 'asset-media mos-playlist',
                                            'asset_media asset-media']}),
                   dict(name='li', attrs={'class': ['hst-resgalleryitem taboola-frame hidden',
                                                    'hst-resgalleryitem hidden']}),
                   dict(name='ul', attrs={'class': 'clearfix'})]

    # max_articles_per_feed = 5  # for use in testing

    def get_article_description_from_doc(self, soup):
        description_chars_break = 140
        description_max_chars = 300
        try:
            els = soup.findAll('p')
            if len(els) > 0:
                out_text = ""
                this_ellipsis = ""
                for el in els:
                    if el is not None:
                        result = []
                        for descendant in el.contents:
                            if isinstance(descendant, NavigableString):
                                result.append(type(u'')(descendant).strip())
                        all_text = u' '.join(result)
                        if len(all_text) > 1:
                            sentences = re.findall(sentence_regex, all_text)
                            if sentences is not None and len(sentences) > 0:
                                for sentence in sentences:
                                    if len(out_text) < description_chars_break:
                                        out_text += sentence + " "
                                    else:
                                        if len(out_text) > description_max_chars:
                                            this_ellipsis = "..."
                                        return out_text[:description_max_chars] + this_ellipsis
                return out_text
            else:
                return "No Article description returned"
        except Exception as ex:
            self.log('Error on Article Description')
            traceback.print_exc(file=sys.stdout)
            print(str(ex))
            return ""

    @staticmethod
    def get_published_time_from_doc(page_doc):

        def get_regular_timestamp(date_string):
            try:
                out_date = datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%SZ")
                return out_date
            except ValueError:
                return None

        el = page_doc.findAll(
                lambda this_tag: this_tag.name == "time" and ('itemprop', 'datePublished') in this_tag.attrs)
        if len(el) == 1:
            return get_regular_timestamp(el[0].get('datetime'))
        else:
            return None

    def populate_article_metadata(self, article, soup, first):
        """
        Called when each HTML page belonging to article is downloaded.
        Intended to be used to get article metadata like author/summary/etc.
        from the parsed HTML (soup).

        :param article: A object of class :class:`calibre.web.feeds.Article`.
            If you change the summary, remember to also change the text_summary
        :param soup: Parsed HTML belonging to this article
        :param first: True iff the parsed HTML is the first page of the article.
        """
        summary = self.get_article_description_from_doc(soup)
        article_date = self.get_published_time_from_doc(soup)
        if article_date is not None:
            article_timestamp = float((article_date - utcfromtimestamp(0)).total_seconds())
            article.date = article_timestamp
            article.utctime = dt_factory(article_date.timetuple(), assume_utc=True, as_utc=True)
            article.localtime = article.utctime.astimezone(local_tz)
        summary_date = article.localtime.strftime("%Y-%m-%d %H:%M") if article_date is not None else "No Date"
        article.summary = "{0}: {1}".format(summary_date, summary)
        article.text_summary = clean_ascii_chars(article.summary)

    def parse_index(self):
        self.timefmt = ' [%a, %d %b, %Y]'
        self.log('starting parse_index: ', time.strftime(self.timestampfmt))
        feeds = []
        sections = get_all_links_from_sections(self.index_to_soup)
        for section_id, article_list in sections.items():
            self.log("Getting {0} section, {1:d} articles".format(section_id, len(article_list)))
            articles = []
            for article_info in article_list:
                self.log("Adding {0} to feed".format(article_info[0]))
                articles.append({'title': article_info[1], 'url': article_info[0],
                                 'description': '', 'date': ""})
            self.log("Appending {0:d} articles for {1}".format(len(articles), section_id))
            feeds.append((section_id, articles))
        self.log('finished parse_index: ', time.strftime(self.timestampfmt))
        return feeds

    def preprocess_html(self, soup):
        return soup
PK�X�'G��
howtogeek.png�PNG


IHDR(-S�PLTETC/��c�yJ��l���VWZ�ˉ���ѝ^�lD�}W;6.�s[�{軁�zd�͍������~}|sW6@1���imq�oK��^K5q_H�͍���{`@��]UJ<[M=����Փ���F@9kZC¢n�������щz\9�ߚ���4.(�j��ˎ��889{`A��kmg_]O?{m[�NJQUZKKM��ǽ�´���������WtRNS@��f�IDATx^m�E�A�_L��Aff�����Rv�v�,�d�"�1�`=��两O%A�ʡR��}�쁫B5�$��7k\_���Д'��3��*�2����C��E4����]QlF��p�����<
�(�YBo��dB���|�/^d&gǶK����5�xw`%+NO�/�����ӆ?G���j:�IEND�B`�PK�X��s��howtogeek.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1282101454(BasicNewsRecipe):
    title = 'How To Geek'
    language = 'en'
    __author__ = 'TonytheBookworm, PatStapleton (update 2020-05-20)'
    description = 'Daily Computer Tips and Tricks'
    publisher = 'Howtogeek'
    category = 'PC,tips,tricks'
    oldest_article = 2
    max_articles_per_feed = 100
    linearize_tables = True
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False

    keep_only_tags = [
        dict(id='main')
    ]
    remove_tags_after = dict(classes='affiliate-disclosure')
    remove_tags = [
        dict(name='a', attrs={'target': ['_blank']}),
        dict(name='table', attrs={'id': ['articleTable']}),
        dict(name='div',   attrs={'class': ['feedflare', 'article-share-widgets', 'related-articles', 'comments', 'nextup']}),
    ]

    feeds = [
        ('How-to Geek', 'https://www.howtogeek.com/feed/')

    ]

    def preprocess_html(self, soup, *a):
        for img in soup.findAll('img', attrs={'data-pagespeed-lazy-src': True}):
            img['src'] = img['data-pagespeed-lazy-src']
        return soup
PK�X�>�OOhoy.png�PNG


IHDR(-S�PLTE� �!�.�1�6�7�!=�">�2L�8Q�Ja�Kb�Lb�Rh�Si�Wl�Zo�_s�au�l~�q��r��{�݅�ߋ�ᕢ▣㛨㜨䝩堬槲鰺鱻굾�������������������������������������������������������MVIDATx�c�P�bSf�����T	X�q��i+��jj���,L�%��8
$�yAV��&2��":, v5V~C]F!if�?�{eLIEND�B`�PK�X3���
hoy.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2010, Francisco Javier Nieto <frjanibo at gmail.com>'
'''
www.hoy.es
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Hoy(BasicNewsRecipe):
    title = 'HOY'
    __author__ = 'Fco Javier Nieto'
    description = u'Noticias desde Extremadura'
    publisher = 'HOY'
    category = 'news, politics, Spain, Extremadura'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    delay = 1
    encoding = 'cp1252'
    language = 'es'

    feeds = [
        (u'Portada', u'http://www.hoy.es/portada.xml'),
        (u'Regional', u'http://www.hoy.es/rss/feeds/regional.xml'),
        (u'Prov de Badajoz', u'http://www.hoy.es/rss/feeds/prov_badajoz.xml'),
        (u'Prov de Caceres', u'http://www.hoy.es/rss/feeds/prov_caceres.xml'),
        (u'Badajoz', u'http://www.hoy.es/rss/feeds/badajoz.xml'),
        (u'Caceres', u'http://www.hoy.es/rss/feeds/caceres.xml'),
        (u'Merida', u'http://www.hoy.es/rss/feeds/merida.xml'),
        (u'Opinion', u'http://www.hoy.es/rss/feeds/opinion.xml'),
        (u'Nacional', u'http://www.hoy.es/rss/feeds/nacional.xml'),
        (u'Internacional', u'http://www.hoy.es/rss/feeds/internacional.xml'),
        (u'Economia', u'http://www.hoy.es/rss/feeds/economia.xml'),
        (u'Deportes', u'http://www.hoy.es/rss/feeds/deportes.xml'),
        (u'Sociedad', u'http://www.hoy.es/rss/feeds/sociedad.xml'),
        (u'Cultura', u'http://www.hoy.es/rss/feeds/cultura.xml'),
        (u'Television', u'http://www.hoy.es/rss/feeds/television.xml'),
        (u'contraportada', u'http://www.hoy.es/rss/feeds/contraportada.xml')
    ]

    keep_only_tags = [
        dict(name='h1', attrs={'class': ['headline']}),
        dict(name='h2', attrs={'class': ['subhead']}),
        dict(name='div', attrs={'class': ['text']})
    ]

    remove_tags = [
        dict(name=['object', 'link', 'script']), dict(
            name='div', attrs={'class': ['colC_articulo', 'peu']})
    ]

    remove_tags_after = [dict(name='div', attrs={'class': 'text'})]

    extra_css = '.headline {font: sans-serif 2em;}\n.subhead,h2{font: sans-serif 1.5em\n'

    def preprocess_html(self, soup):
        soup.html['dir'] = self.direction
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X��	���hrt.png�PNG


IHDR�ajIDATx���ja������W�5�*����
���.�K��Z�j���XYY�a%��Q��3����@���Jd�/�?���#����h[�����C�-�p�����
�`�h���{?��dQ�ڪ�z%�A@�PU�tq2a\KtrVH �Ě@����E]�!�+�4�l&�8��66��l8����(˚"[~��o�|ݧ(Z.ɋ6���޼�3�x4���%)@@P��S౸����2��_��ç/��x`㭀�`E�U���sEyw/q�ᓤ�fBą0�ɜ�RH`	0 R�"��5cM��t�k�bi�7�\H�Rr2��߾EZ�{��{����U��?��uQ�4��IEND�B`�PK�X~�i��
hrt.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
www.hrt.hr
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class HRT(BasicNewsRecipe):
    title = 'HRT: Vesti'
    __author__ = 'Darko Miletic'
    description = 'News from Croatia'
    publisher = 'HRT'
    category = 'news, politics, Croatia, HRT'
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'hr'

    lang = 'hr-HR'
    extra_css = '''@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                    body{font-family: serif1, serif} .article_description{font-family: serif1, serif}
                   .news-single-timedata{color:#20558A; font-size:x-small;}
                   .nsTitle{color:#20558A; font-size:large; font-weight:bold;}
                   a{color:#20558A;}
                   .external-link-new-window{color:#20558A;}

                '''

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [dict(name='div', attrs={'class': 'bigVijest'})]

    remove_tags = [dict(name=['object', 'link', 'embed'])]

    remove_tags_after = dict(name='div', attrs={'class': 'nsAuthor'})

    feeds = [

    (u'Vijesti', u'http://www.hrt.hr/?id=316&type=100&rss=vijesti'),
    (u'Sport', u'http://www.hrt.hr/?id=316&type=100&rss=sport'),
    (u'Zabava', u'http://www.hrt.hr/?id=316&type=100&rss=zabava'),
    (u'Filmovi i serije', u'http://www.hrt.hr/?id=316&type=100&rss=filmovi'),
    (u'Dokumentarni program', u'http://www.hrt.hr/?id=316&type=100&rss=dokumentarci'),
    (u'Glazba', u'http://www.hrt.hr/?id=316&type=100&rss=glazba'),
    (u'Kultura', u'http://www.hrt.hr/?id=316&type=100&rss=kultura'),
    (u'Mladi', u'http://www.hrt.hr/?id=316&type=100&rss=mladi'),
    (u'Manjine', u'http://www.hrt.hr/?id=316&type=100&rss=manjine'),
    (u'Radio', u'http://www.hrt.hr/?id=316&type=100&rss=radio')
    ]

    def preprocess_html(self, soup):
        soup.html['xml:lang'] = self.lang
        soup.html['lang'] = self.lang
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X}#q�==huffingtonpost.png�PNG


IHDR  szz�IDATx�b��3�?�2�WH���Ā��2B8��8�A��@`@ � ���8r�/���{x�yx���1��r���7vV�>�/�������b<`gH��R(h������lր�;+@@��T
@@��Lր��w�{�m
��}��
��+���+�5`ø�[FvV��B(h��AX��Cv��w��wv�t�����y��IEND�B`�PK�X@r?���huffingtonpost.recipefrom __future__ import print_function
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 HuffingtonPostRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal and Archana Raman'
    language = 'en'
    version = 2

    title = u'The Huffington Post'
    publisher = u'huffingtonpost.com'
    category = u'News, Politics'
    description = u'Political Blog'

    oldest_article = 1.1
    max_articles_per_feed = 100

    encoding = 'utf-8'
    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = [
        classes('entry__header entry__body')
    ]
    remove_tags = [
        classes('app-download-interstitial share-bar top-media--video advertisement extra-content'
                ' below-entry entry-inline-subscription-module related-articles')
    ]
    # Feeds from: http://www.huffingtonpost.com/syndication/
    feeds = []

    feeds.append(
        (u'Politics', u'http://www.huffingtonpost.com/feeds/verticals/politics/index.xml'))

    feeds.append(
        (u'Media', u'http://www.huffingtonpost.com/feeds/verticals/media/index.xml'))

    feeds.append(
        (u'Business', u'http://www.huffingtonpost.com/feeds/verticals/business/index.xml'))

    feeds.append(
        (u'Entertainment', u'http://www.huffingtonpost.com/feeds/verticals/entertainment/index.xml'))

    feeds.append(
        (u'Living', u'http://www.huffingtonpost.com/feeds/verticals/living/index.xml'))

    feeds.append(
        (u'Style', u'http://www.huffingtonpost.com/feeds/verticals/style/index.xml'))

    feeds.append(
        (u'Green', u'http://www.huffingtonpost.com/feeds/verticals/green/index.xml'))

    feeds.append(
        (u'Technology', u'http://www.huffingtonpost.com/feeds/verticals/technology/index.xml'))

    feeds.append(
        (u'Comedy', u'http://www.huffingtonpost.com/feeds/verticals/comedy/index.xml'))

    feeds.append(
        (u'World', u'http://www.huffingtonpost.com/feeds/verticals/world/index.xml'))

    feeds.append((u'Original Reporting',
                  u'http://www.huffingtonpost.com/tag/huffpolitics/feed'))

    extra_css = '''
                    h1{font-family :Arial,Helvetica,sans-serif; font-size:large;}
                    h2{font-family :Arial,Helvetica,sans-serif; font-size:medium; color:#000000;}
                    h3{font-family :Arial,Helvetica,sans-serif; font-size:medium; color:#000000;}
                    body{font-family:verdana,arial,helvetica,geneva,sans-serif ;}
                    #title_permalink{color:black;font-size:large;}
                    .date{color:#858585;font-family:"Times New Roman",sans-serif;}
                    .comments_datetime v05{color:#696969;}
                    .teaser_permalink{font-style:italic;font-size:xx-small;}
                    .blog_posted_date{color:#696969;font-size:xx-small;font-weight: bold;}
                    '''
# a[href]{color: blue; text-decoration: none; cursor: pointer;}

    def get_article_url(self, article):
        """
            Workaround for Feedparser behaviour. If an item has more than one <link/> element, article.link is empty and
            article.links contains a list of dictionaries.
            Todo: refactor to searching this list to avoid the hardcoded zero-index
        """
        link = article.get('link')
        print("Link:" + link)
        if not link:
            links = article.get('links')
            if links:
                link = links[0]['href']
                if not links[0]['href']:
                    link = links[1]['href']

        return link

    def postprocess_html(self, soup, first_fetch):
        for tag in soup.findAll('div', text="What's Your Reaction?"):
            tag.extract()

        for tg in soup.findAll('blockquote'):
            tg.extract()

        return soup
PK�X\�8h��huffingtonpost_uk.png�PNG


IHDR(-SHPLTE,qd/sf3vi7xlF�wT��U��U��k��l��r��y��������������������������������������2"$GIDATxڭ��PE_����V�>�;&�(���u�U�9�?k(����2�g�y��]��U����?��l��_�4|���m�IEND�B`�PK�X#�]�zzhurriyet.png�PNG


IHDRb��PLTE��#.���^P;�)IDAT[c8�����c"�#������zd�hh8�{'}��h%IEND�B`�PK�X��h�(	(	hurriyet.recipe##
# Title:        Hürriyet recipe for calibre
# Author:       Adrian Tennessee
# Contact:      adrian.tennessee at domainthatnobodytakes.com
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    Copyright 2015 Adrian Tennessee
##
# Written:      2015-07-11
# Last Edited:  2016-07-08
##

from calibre.web.feeds.news import BasicNewsRecipe


class Hurriyet(BasicNewsRecipe):
    __author__ = 'Adrian Tennessee (adrian.tennessee at domainthatnobodytakes.com)'
    __license__ = 'GPLv3'
    __copyright__ = '2015, Adrian Tennessee <adrian.tennessee at domainthatnobodytakes.com)'

    title = u'Hürriyet'
    language = 'tr'
    description = u'Hürriyet web site ebook'
    publisher = 'Doğan Media Group'
    category = 'news'
    cover_url = 'https://upload.wikimedia.org/wikipedia/en/4/4f/H%C3%BCrriyet_ilk_sayi.jpg'

    oldest_article = 7
    max_articles_per_feed = 50
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    encoding = None

    compress_news_images = True

    # some mild formatting
    extra_css = """.news-image { clear: left; }
           .news-detail-title { clear:left; }
           .col-md-7 { font-size:small; }
           .news-detail-spot { font-style:italic; font-size:smaller }"""

    keep_only_tags = [
        # title
        {'class': 'news-detail-title selectionShareable'},
        # date
        {'class': 'col-md-7 text-right'},
        # image
        {'class': 'news-image'},
        # detail
        {'class': 'news-detail-spot'},
        # text
        {'class': 'news-box'},
    ]

    feeds = [
        (u'Anasayfa', u'http://www.hurriyet.com.tr/rss/anasayfa'),
        (u'Gündem', u' http://www.hurriyet.com.tr/rss/gundem'),
        (u'Ekonomi', u'http://www.hurriyet.com.tr/rss/ekonomi'),
        (u'Magazin', u'http://www.hurriyet.com.tr/rss/magazin'),
        (u'Spor', u'http://www.hurriyet.com.tr/rss/spor'),
        (u'Planet', u'http://www.hurriyet.com.tr/rss/dunya'),
        (u'Teknoloji', u'http://www.hurriyet.com.tr/rss/teknoloji'),
        (u'Sağlık', u'http://www.hurriyet.com.tr/rss/saglik'),
        (u'Astroloji', u'http://www.hurriyet.com.tr/rss/astroloji'),
        (u'Ankara', u'http://www.hurriyet.com.tr/rss/ankara'),
        (u'Ege', u'http://www.hurriyet.com.tr/rss/ege')
    ]
PK�X��g���hvg.png�PNG


IHDR(-S�PLTE�y3����D��S����~;������������{6��_��L��L��M��N��N�<��T��W��W��Y��\��^�?��a��b��c��o���������������������@�������������Ŧ�Ǫ�ʮ�˰�̲�ѹ�Ѻ����������B������������C������������z6��E��������������H��K�)|�IDATxڅ��CQѳ/��۶�d���.�b���%�a��3^!�i����PcY�訮Aӑ���vr� b
t�C�g�J}-��B. OE��a`���vz��r���G�"̔L�l�C�o��&�n$���ҋIEND�B`�PK�X‘U�


hvg.recipe##########################################################################
# Description:	  http://hvg.hu/ RSS channel
# Author: 	  Bigpapa (bigpapabig@hotmail.com)
# Date:	  2011.12.20. - V1.1
##########################################################################

from calibre.web.feeds.news import BasicNewsRecipe


class hvg(BasicNewsRecipe):
    title = u'HVG'
    __author__ = 'Bigpapa'
    language = 'hu'
    oldest_article = 5		# Hany napos legyen a legregebbi cikk amit leszedjen.
    # Az adott e-bookban tarolt cikkek feedenkenti maximalis szamat adja meg.
    max_articles_per_feed = 5
    no_stylesheets = True
    encoding = 'utf8'
    extra_css = ' h2 { font:bold 28px} '

    remove_attributes = ['style', 'font', 'href']

    keep_only_tags = [
        dict(name='div', attrs={'id': ['pg-content']})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': [
             'box articlemenu', 'bannergoogle468', 'boxcontainer left', 'boxcontainer', 'commentbox']}),
        dict(name='table', attrs={'class': ['banner2', 'monocle']}),
        dict(name='div', attrs={
             'id': ['connect_widget_4cf63ca849ddf4577922632', 'sharetip', 'upprev_box']}),
        dict(name='div', attrs={
             'style': ['float: right; margin-bottom: 5px;', 'display: none;']}),
        dict(name='h3', attrs={'class': ['hthree']}),
        dict(name='ul', attrs={'class': ['defaultul']}),
        dict(name='form', attrs={'id': ['commentForm']}),
        dict(name='h6', attrs={'class': ['hthree']}),
        dict(name='h6', attrs={'class': ['more2']}),
        dict(name='img', attrs={'class': ['framed']}),
        dict(name='td', attrs={'class': [
             'greyboxbody', 'embedvideobody', 'embedvideofooter', 'embedvideobottom']}),



    ]

    feeds = [
        (u'Itthon', 'http://hvg.hu/rss/itthon'),
        (u'Vil\xe1g', 'http://hvg.hu/rss/vilag'),
        (u'Gazdas\xe1g', 'http://hvg.hu/rss/gazdasag'),
        (u'Tudom\xe1ny', 'http://hvg.hu/rss/tudomany'),
        (u'Panor\xe1ma', 'http://hvg.hu/rss/panorama'),
        (u'Karrier', 'http://hvg.hu/rss/karrier'),
        (u'Gasztron\xf3mia', 'http://hvg.hu/rss/gasztronomia'),
        (u'Helyi \xe9rt\xe9k', 'http://hvg.hu/rss/helyiertek'),
        (u'Kult\xfara', 'http://hvg.hu/rss/kultura'),
        (u'C\xe9gaut\xf3', 'http://hvg.hu/rss/cegauto'),
        (u'V\xe1llalkoz\xf3 szellem', 'http://hvg.hu/rss/kkv'),
        (u'Eg\xe9szs\xe9g', 'http://hvg.hu/rss/egeszseg'),
        (u'V\xe9lem\xe9ny', 'http://hvg.hu/rss/velemeny'),
        (u'Sport', 'http://hvg.hu/rss/sport')
    ]
PK�X�����hvidovreavis_dk.png�PNG


IHDR��h6kIDATm��KTq��oyoޛ�ed�qO-������hC(�Z��!"��N�n-t�P��s� ���ʜ4r�2EA�gy��eN}>����y.�����3	�*Q<��}딻 W}7�z�VBS8�Gx:c\>��r*&����E���Z�/��7�ۄm�̦��+��L��EĒ�B�%�lЃ-Mu%��0�Z� �IP�Ps�pw�T�ҙ��oY�N:L��  ��d8s�x�Z]u�d|�gh���0t�,AA8�$/$�|-�)��f�hmؗϒ0tX��s�`d���0�L�q�������0Ҷ%(�L@��qpG�'>X��	��+������� LI�Q�ϔg8gN7�bW{��?���� �!�'ё�C2�r��s���(��E!+�"�ʵ~�P%�ޏ�>�H���?f�t4�a
��l�M�ş�t������=
-}Kl&�¶8��]�Eʋe��qC3�ۦ.J�fkM���񉩥b��h��&aWW{MW;�4�����w-�_��6K38c��09��
�����Js�"P��	�?s;(l�
�lXl�J��bӑ`���`�ȟ����t4aO�IEND�B`�PK�X!�A((hvidovreavis_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class Hvidovre_Avis_dk(BasicNewsRecipe):
    title          = 'Hvidovre avis'
    language       = 'da'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup   = True
    feeds          = [
        ('Lokale nyheder', 'http://hvidovre.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Sport', 'http://hvidovre.lokalavisen.dk/section/senestesportrss'),
        ('112', 'http://hvidovre.lokalavisen.dk/section/seneste112rss'),
        ('Kultur', 'http://hvidovre.lokalavisen.dk/section/senestekulturrss'),
        ('Læserbreve', 'http://hvidovre.lokalavisen.dk/section/senestelaeserbreverss'),
    ]
PK�X
��a!!hvidovrelokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�Xߍ��..hvidovrelokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Hvidovre Avis
'''


class HvidovreLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Hvidovre Avis'
    description = 'Lokale og regionale nyheder, sport og kultur fra Hvidovre på hvidovre.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Hvidovre Avis', 'http://hvidovre.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Hvidovre Avis', 'http://hvidovre.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Hvidovre Avis', 'http://hvidovre.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Hvidovre Avis', 'http://hvidovre.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Hvidovre Avis', 'http://hvidovre.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Hvidovre Avis', 'http://hvidovre.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X~<y..ibm_smarter_planet.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1293122276(BasicNewsRecipe):
    title = u'Smarter Planet | Tumblr'
    __author__ = 'Jack Mason'
    author = 'IBM Global Business Services'
    publisher = 'IBM'
    language = 'en'
    category = 'news, technology, IT, internet of things, analytics'
    oldest_article = 14
    max_articles_per_feed = 30
    no_stylesheets = True
    use_embedded_content = False
    masthead_url = 'http://www.hellercd.com/wp-content/uploads/2010/09/hero.jpg'
    remove_tags_before = dict(id='item')
    remove_tags_after = dict(id='item')
    remove_tags = [dict(attrs={'class': ['sidebar', 'about', 'footer', 'description,' 'disqus', 'nav', 'notes', 'disqus_thread']}),
                   dict(id=['sidebar', 'footer', 'disqus', 'nav', 'notes',
                            'likes_container', 'description', 'disqus_thread', 'about']),
                   dict(name=['script', 'noscript', 'style'])]

    feeds = [(u'Smarter Planet Tumblr',
              u'http://smarterplanet.tumblr.com/mobile/rss')]
PK�X�id_pixel.png�PNG


IHDR(-SPLTE@���������>��Q1<(IDATxڝɩ0�������I�-d#]��U��M�����r��IEND�B`�PK�X�y�?�
�
id_pixel.recipe#!/usr/bin/env python2
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class IdPixel(BasicNewsRecipe):
    title = '\u0418\u0434\u0435\u0430\u043B\u044C\u043D\u044B\u0439 \u043F\u0438\u043A\u0441\u0435\u043B\u044C'
    cover_url = u'https://idpixel.ru/i/logo2x.png'
    description = '\u041D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043F\u0440\u043E\u0435\u043A\u0442 \u043E \u0440\u0435\u0442\u0440\u043E-\u0438\u0433\u0440\u0430\u0445 \u0438 \u0440\u0435\u0442\u0440\u043E-\u0442\u0435\u0445\u043D\u0438\u043A\u0435. \u0412\u043E\u0441\u044C\u043C\u0438\u0431\u0438\u0442\u043D\u044B\u0435 \u0438\u0433\u0440\u044B, \u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u0438\u0431\u0438\u0442\u043D\u044B\u0435 \u043A\u043E\u043D\u0441\u043E\u043B\u0438, \u0434\u043E\u043C\u0430\u0448\u043D\u0438\u0435 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u044B \u0441 \u0438\u0433\u0440\u0430\u043C\u0438 \u043D\u0430 \u043A\u0430\u0441\u0441\u0435\u0442\u0430\u0445 \u0438 \u0442\u0430\u043A \u0434\u0430\u043B\u0435\u0435. \u041C\u044B \u0438\u0449\u0435\u043C \u0440\u0435\u0442\u0440\u043E-\u043D\u043E\u0432\u043E\u0441\u0442\u0438 \u043F\u043E \u0432\u0441\u0435\u043C\u0443 \u0441\u0432\u0435\u0442\u0443 \u0438 \u0434\u043E\u043D\u043E\u0441\u0438\u043C \u0438\u0445 \u0434\u043E \u0432\u0430\u0441.'  # noqa
    publisher = '\u041C\u0438\u0445\u0430\u0438\u043B \u0421\u0443\u0434\u0430\u043A\u043E\u0432'
    category = 'news'
    __author__ = 'bugmen00t'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = True
    oldest_article = 100
    max_articles_per_feed = 50

    remove_tags_before = dict(name='div', attrs={'class': 'blog-post'})
    remove_tags_after = dict(
        name='div', attrs={'style': 'margin: 20px 0 0 2px;font-size: 16px;'}
    )
    remove_tags = [
        dict(
            name='div', attrs={'class': ' likely__widget likely__widget_vkontakte'}
        ),
        dict(name='div', attrs={'class': ' likely__widget likely__widget_twitter'}),
        dict(name='div', attrs={'class': ' likely__widget likely__widget_facebook'}),
        dict(name='div', attrs={'class': ' likely__widget likely__widget_telegram'}),
        dict(
            name='div',
            attrs={'class': ' likely__widget likely__widget_odnoklassniki'}
        ),
        dict(name='div', attrs={'class': 'comments_input_disabled'}),
        dict(name='div', attrs={'id': 'comments'})
    ]

    feeds = [(
        u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
        u'https://idpixel.ru/rss/news.rss'
    )]
PK�X�r�i��ideal_almeria.png�PNG


IHDR  D���3PLTE�!�@Y܀��Pf�/�`t��p�埬�0K�����������鯺� =����!�IyIDAT8���9�@�/�Jϰ��L����I���?3�J�VΜ���d��ڥ
HZ:0CpI�/�
0#�	�8�#��5�"P��G@ҵ(k@7�m̬
8R���9:VZ���O����IEND�B`�PK�X����N
N
ideal_almeria.recipe# encoding: utf-8 -*-

__license__ = 'GPL v3'
__author__ = 'Josemi Liébana <office at josemi-liebana.com>'
__copyright__ = 'Josemi Liébana'
__version__ = 'v0.1'
__date__ = '5 January 2012'


'''
www.ideal.es
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Ideal(BasicNewsRecipe):
    title = u'Ideal (Edición Almería)'
    __author__ = u'Josemi Liébana'
    description = u'Noticias de Almería y el resto del mundo'
    publisher = 'Ideal'
    category = u'News, Politics, Spain, Almería'
    publication_type = 'Newspaper'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'es'
    remove_empty_feeds = True
    masthead_url = u'http://www.ideal.es/img/rd.logotipo2_ideal.gif'
    cover_url = u'http://www.ideal.es/granada/noticias/201112/24/Media/Granada/portada--647x894.JPG'
    extra_css = u' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} .photo-caption{font-size: x-small} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(attrs={'id': 'title'}), dict(attrs={'class': [
            'overhead', 'headline', 'subhead', 'date', 'text', 'noticia_cont', 'desarrollo']})
    ]

    remove_tags = [dict(name='ul')]

    remove_attributes = ['width', 'height']

    feeds = [

    (u'Última Hora', u'http://www.ideal.es/almeria/rss/feeds/ultima.xml'),
    (u'Portada', u'http://www.ideal.es/almeria/portada.xml'),
    (u'Local', u'http://www.ideal.es/almeria/rss/feeds/granada.xml'),
    (u'Deportes', u'http://www.ideal.es/almeria/rss/feeds/deportes.xml'),
    (u'Sociedad', u'http://www.ideal.es/almeria/rss/feeds/sociedad.xml'),
    (u'Cultura', u'http://www.ideal.es/almeria/rss/feeds/cultura.xml'),
    (u'Economía', u'http://www.ideal.es/almeria/rss/feeds/economia.xml'),
    (u'Costa', u'http://www.ideal.es/almeria/rss/feeds/costa.xml'),
    (u'Puerta Purchena', u'http://www.ideal.es/almeria/rss/feeds/puerta_purchena.xml'),
    (u'Andalucía', u'http://www.ideal.es/almeria/rss/feeds/andalucia.xml'),
    (u'España', u'http://www.ideal.es/almeria/rss/feeds/espana.xml'),
    (u'Mundo', u'http://www.ideal.es/almeria/rss/feeds/internacional.xml'),
    (u'Vivir', u'http://www.ideal.es/almeria/rss/feeds/vivir.xml'),
    (u'Opinión', u'http://www.ideal.es/almeria/rss/feeds/opinion.xml'),
    (u'Televisión', u'http://www.ideal.es/almeria/rss/feeds/television.xml'),
    (u'Contraportada', u'http://www.ideal.es/almeria/rss/feeds/contraportada.xml')
    ]
PK�X�r�i��ideal_granada.png�PNG


IHDR  D���3PLTE�!�@Y܀��Pf�/�`t��p�埬�0K�����������鯺� =����!�IyIDAT8���9�@�/�Jϰ��L����I���?3�J�VΜ���d��ڥ
HZ:0CpI�/�
0#�	�8�#��5�"P��G@ҵ(k@7�m̬
8R���9:VZ���O����IEND�B`�PK�XuPs<�
�
ideal_granada.recipe# encoding: utf-8 -*-

__license__ = 'GPL v3'
__author__ = 'Josemi Liébana <office at josemi-liebana.com>'
__copyright__ = 'Josemi Liébana'
__version__ = 'v0.1'
__date__ = '5 January 2012'


'''
www.ideal.es
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Ideal(BasicNewsRecipe):
    title = u'Ideal (Edición Granada)'
    __author__ = u'Josemi Liébana'
    description = u'Noticias de Granada y el resto del mundo'
    publisher = 'Ideal'
    category = 'News, Politics, Spain, Granada'
    publication_type = 'Newspaper'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'es'
    remove_empty_feeds = True
    masthead_url = 'http://www.ideal.es/img/rd.logotipo2_ideal.gif'
    cover_url = 'http://www.ideal.es/granada/noticias/201112/24/Media/Granada/portada--647x894.JPG'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} .photo-caption{font-size: x-small} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(attrs={'id': 'title'}), dict(attrs={'class': [
            'overhead', 'headline', 'subhead', 'date', 'text', 'noticia_cont', 'desarrollo']})
    ]

    remove_tags = [dict(name='ul')]

    remove_attributes = ['width', 'height']

    feeds = [

    (u'Última Hora', u'http://www.ideal.es/granada/rss/feeds/ultima.xml'),
    (u'Portada', u'http://www.ideal.es/granada/portada.xml'),
    (u'Local', u'http://www.ideal.es/granada/rss/feeds/granada.xml'),
    (u'Deportes', u'http://www.ideal.es/granada/rss/feeds/deportes.xml'),
    (u'Sociedad', u'http://www.ideal.es/granada/rss/feeds/sociedad.xml'),
    (u'Cultura', u'http://www.ideal.es/granada/rss/feeds/cultura.xml'),
    (u'Economía', u'http://www.ideal.es/granada/rss/feeds/economia.xml'),
    (u'Costa', u'http://www.ideal.es/granada/rss/feeds/costa.xml'),
    (u'La Carrera', u'http://www.ideal.es/granada/rss/feeds/la_carrera.xml'),
    (u'Puerta Real', u'http://www.ideal.es/granada/rss/feeds/puerta_real.xml'),
    (u'Andalucía', u'http://www.ideal.es/granada/rss/feeds/andalucia.xml'),
    (u'España', u'http://www.ideal.es/granada/rss/feeds/espana.xml'),
    (u'Mundo', u'http://www.ideal.es/granada/rss/feeds/internacional.xml'),
    (u'Vivir', u'http://www.ideal.es/granada/rss/feeds/vivir.xml'),
    (u'Opinión', u'http://www.ideal.es/granada/rss/feeds/opinion.xml'),
    (u'Televisión', u'http://www.ideal.es/granada/rss/feeds/television.xml'),
    (u'Contraportada', u'http://www.ideal.es/granada/rss/feeds/contraportada.xml')
    ]
PK�X�r�i��ideal_jaen.png�PNG


IHDR  D���3PLTE�!�@Y܀��Pf�/�`t��p�埬�0K�����������鯺� =����!�IyIDAT8���9�@�/�Jϰ��L����I���?3�J�VΜ���d��ڥ
HZ:0CpI�/�
0#�	�8�#��5�"P��G@ҵ(k@7�m̬
8R���9:VZ���O����IEND�B`�PK�X�[9�	�	ideal_jaen.recipe# encoding: utf-8 -*-

__license__ = 'GPL v3'
__author__ = 'Josemi Liébana <office at josemi-liebana.com>'
__copyright__ = 'Josemi Liébana'
__version__ = 'v0.1'
__date__ = '5 January 2012'


'''
www.ideal.es
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Ideal(BasicNewsRecipe):
    title = u'Ideal (Edición Jaén)'
    __author__ = u'Josemi Liébana'
    description = u'Noticias de Jaén y el resto del mundo'
    publisher = 'Ideal'
    category = u'News, Politics, Spain, Jaén'
    publication_type = 'Newspaper'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'es'
    remove_empty_feeds = True
    masthead_url = 'http://www.ideal.es/img/rd.logotipo2_ideal.gif'
    cover_url = 'http://www.ideal.es/granada/noticias/201112/24/Media/Granada/portada--647x894.JPG'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} .photo-caption{font-size: x-small} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(attrs={'id': 'title'}), dict(attrs={'class': [
            'overhead', 'headline', 'subhead', 'date', 'text', 'noticia_cont', 'desarrollo']})
    ]

    remove_tags = [dict(name='ul')]

    remove_attributes = ['width', 'height']

    feeds = [

    (u'Última Hora', u'http://www.ideal.es/jaen/rss/feeds/ultima.xml'),
    (u'Portada', u'http://www.ideal.es/jaen/portada.xml'),
    (u'Local', u'http://www.ideal.es/jaen/rss/feeds/granada.xml'),
    (u'Deportes', u'http://www.ideal.es/jaen/rss/feeds/deportes.xml'),
    (u'Sociedad', u'http://www.ideal.es/jaen/rss/feeds/sociedad.xml'),
    (u'Cultura', u'http://www.ideal.es/jaen/rss/feeds/cultura.xml'),
    (u'Economía', u'http://www.ideal.es/jaen/rss/feeds/economia.xml'),
    (u'Costa', u'http://www.ideal.es/jaen/rss/feeds/costa.xml'),
    (u'Andalucía', u'http://www.ideal.es/jaen/rss/feeds/andalucia.xml'),
    (u'España', u'http://www.ideal.es/jaen/rss/feeds/espana.xml'),
    (u'Mundo', u'http://www.ideal.es/jaen/rss/feeds/internacional.xml'),
    (u'Vivir', u'http://www.ideal.es/jaen/rss/feeds/vivir.xml'),
    (u'Opinión', u'http://www.ideal.es/jaen/rss/feeds/opinion.xml'),
    (u'Televisión', u'http://www.ideal.es/jaen/rss/feeds/television.xml'),
    (u'Contraportada', u'http://www.ideal.es/jaen/rss/feeds/contraportada.xml')
    ]
PK�X��
��
idg_se.png�PNG


IHDR  D���6PLTE�����������������������������������K��VtRNS 0@P`p��������.p�IDATx^���� D]nE
��?�1!�}�)g<>�ؖ
��Q�L)��@ht{ ��dX5O�y�C���$�P�E��$G��n<!�o�ʆ��i�s�@l.>3��o���T�IF1]��F��"n�v8A��uMh&�c&���	��l_UO�ĕW7��Q���O��U��4}1��7ծ��fҲ�A���IŸ��f�T��LP�#�E�~[G���/�	<�^D����1�E\�|����+�:{���&�\X��S_�F
j��IEND�B`�PK�X��l��
idg_se.recipe__license__ = 'GPLv3'

from calibre.web.feeds.news import BasicNewsRecipe


class IDGse(BasicNewsRecipe):
    title = 'IDG'
    __author__ = 'Stanislav Khromov'
    language = 'sv'
    description = 'IDG.se'
    oldest_article = 1
    max_articles_per_feed = 256
    no_stylesheets = True
    encoding = 'utf-8'
    remove_javascript = True

    feeds = [(u'Dagens IDG-nyheter', u'http://feeds.idg.se/idg/ETkj?format=xml')]

    def get_article_url(self, article):
        return article.get('guid', None)

    def print_version(self, url):
        return url + '?articleRenderMode=print&m=print'

    def get_cover_url(this):
        return 'http://idgmedia.idg.se/polopoly_fs/2.3275!images/idgmedia_logo_75.jpg'

    keep_only_tags = [
        dict(name='h1'),
        dict(name='div', attrs={'class': ['divColumn1Article']}),
    ]
    # remove ads
    remove_tags = [
        dict(name='div', attrs={'id': ['preamble_ad']}),
        dict(name='ul', attrs={'class': ['share']})
    ]
PK�X�Z�	idnes.png�PNG


IHDR  szz��IDATxڼ���\���v2�m۶msm۶m۶m���S��wr�==�m�c��sES1v&
��A���ʼ���d}u�ץ�]��vGz��m��O,J����t��Vo����;6�,��/�@�ǿ<���>�Ȝ|j+d.�}g῏��l	��nB��#8 snXB��H|�}k�`�W|0ʚZ�p�!�>����W��~F��q�*}&_y��`��Ǩ!Ccb<L�X��0)&]|�2e���;�V��sy�F�W�h�{5Sp^p}I͆�F��d6Ȕo�ߕ\�<����\f����V���<X����z�-5�N��b4�,�#���=���*��x�ft�jK:_���t����gk0�uě��"�5�迫́�+ҙ�H�^�~����s؉��O�ц{>��N|SN���o/�%�X	]�rO����t��_%K|m��OpF��m����<�q�]�}D��N�@��3-�K�COP���G��1�D:eL�/o�d�!E�\H�X�TY�R�P�܂w�^`��
罒��ԅ���+r��C����z�d�&�]�p��0ט���|�9��`Uh�b�81ti�!C%���^�4S���'���MJ&��T��~��&�܄��'Fi�:!-�.!�9;qΑ��{Өd0�/8P Oνu8�ku�ܓ8�@��0�����Pg؎����P 
�a�L��1~��(���afG���sIEND�B`�PK�XX�����idnes.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class iHeuteRecipe(BasicNewsRecipe):
    __author__ = 'FunThomas'
    title = u'iDnes.cz'
    publisher = u'MAFRA a.s.'
    description = 'iDNES.cz Zprávy, Technet, Komiksy a další'
    oldest_article = 3
    max_articles_per_feed = 2

    feeds = [
        (u'Zprávy', u'http://servis.idnes.cz/rss.asp?c=zpravodaj'),
        (u'Sport', u'http://servis.idnes.cz/rss.asp?c=sport'),
        (u'Technet', u'http://servis.idnes.cz/rss.asp?c=technet'),
        (u'Mobil', u'http://servis.idnes.cz/rss.asp?c=mobil'),
        (u'Ekonomika', u'http://servis.idnes.cz/rss.asp?c=ekonomikah'),
        (u'Cestování', u'http://servis.idnes.cz/rss.asp?c=iglobe'),
        (u'Komixy', u'http://servis.idnes.cz/rss.asp?c=komiksy')
    ]

    encoding = 'cp1250'
    language = 'cs'
    cover_url = 'http://g.idnes.cz/u/loga-n4/idnes.gif'
    remove_javascript = True
    no_stylesheets = True

    remove_attributes = ['width', 'height']
    remove_tags = [dict(name='div',   attrs={'id': ['zooming']}),
                   dict(name='div',   attrs={
                        'class': ['related', 'mapa-wrapper']}),
                   dict(name='table', attrs={'id': ['opener-img', 'portal']}),
                   dict(name='table', attrs={'class': ['video-16ku9']})]
    remove_tags_after = [
        dict(name='div', attrs={'id': ['related', 'related2']})]

    keep_only_tags = [dict(name='div', attrs={'class': [
                           'art-full adwords-text', 'dil-day', 'art-full']}), dict(name='table', attrs={'class': ['kemel-box']})]

    def print_version(self, url):
        print_url = url
        split_url = url.split("?")
        if (split_url[0].rfind('dilbert.asp') != -1):  # dilbert komix
            print_url = print_url.replace('.htm', '.gif&tisk=1')
            print_url = print_url.replace('.asp', '.aspx')
        elif (split_url[0].rfind('kemel.asp') == -1):  # not Kemel komix
            print_url = 'http://zpravy.idnes.cz/tiskni.asp?' + split_url[1]
        # kemel                  kemel print page doesn't work
        return print_url

    extra_css = '''
                  h1 {font-size:125%; font-weight:bold}
                  h3 {font-size:110%; font-weight:bold}
                '''
PK�X�:�<��ieee_spectrum_mag.png�PNG


IHDR  ��tRNSn��	pHYs=�=�1J �GIDATH��VKH�Q���a \�h!��Bct��i��|��hc.�E"�A���i�F�MRPآЅ.L�A����1`&>�s;�k�z@��a�����|�Qڥ���C��6�2�.K3�,�
 �D�B��E����)�.PdSX��.l���Z���,b$�q %��wq�����0�Iim�z��Bs5�˱l*��2�z���}x��K({�y ���T�k�^4 ���*�����u
La`��7�}h��Fk�$&���ʓ��*��.�uR��H(�V0�R��#ޝ���\*RlP����8pn�l��W�	��J�1Ba��OS�B�D��ݮ3
/���7�����\�3c�hg��:�K9�<�w1�r�G
~B��K~h<G��ȭ�L��N���v�RELT������dUŕN���1���E����!�����2��"�`r/d�¬p5�M&����K�9ψ�*"��}Tbu�0#ޞwS�Y����
��8�x�2#�:��R�C���#�U�i�v�s�(�>�w���;�F^+5���O�M��}�\)I6��%Iv��/���.c{6������tE��FEi^��31�X��#�˰"��E{��N�!fWXu�"��^�%0

z�~x��59,��ٖlr���E��
0����k��Վdu`9q�h��i�M\���)��1R�C�LھIf�'nv��A��۝�����Ԏ��Z�f�|M�0��־0�nJhkf��=r[d�p)����P$�
8��pˋu'�T�=����4Fq�O#��,Vᦛl8�WC������[?O�_IEND�B`�PK�X��X�ccieee_spectrum_mag.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe
import datetime


class IEEESpectrumMagazine(BasicNewsRecipe):
    title = "IEEE Spectrum Magazine"
    language = 'en'
    __author__ = 'yodha8'
    description = "Published on day 1 of every month."
    oldest_article = 120  # Mag gathers articles published older than a month online. So we scan for 4 months in the feed.
    max_articles_per_feed = 100
    auto_cleanup = True

    # RSS feed for the current month
    now = datetime.datetime.now()
    year_month = now.strftime("%Y/%B").lower()
    month_feed_url = "https://spectrum.ieee.org/feeds/magazine/{}.rss".format(
        year_month
    )

    feeds = [
        ('IEEE Spectrum Magazine', month_feed_url),
    ]

    def get_cover_url(self):
        """Go to this month's URL and pull cover image from there."""
        month_url = "https://spectrum.ieee.org/magazine/{}".format(self.year_month)
        soup = self.index_to_soup(month_url)
        img_meta = soup.find("meta", property="og:image")
        img_url = img_meta["content"]
        return img_url
PK�X�*v��ieeespectrum.png�PNG


IHDR���R0PLTE��������������!��)��*��.��1��q��������\M[?IDAT[c`�ƙ�3���^���x~F�x�d���d��]Q��a0���Ԏƀ[
p�/�`èIEND�B`�PK�Xw��>ddieeespectrum.recipe'''
Fetch RSS-Feeds http://spectrum.ieee.org
'''

from calibre.web.feeds.news import BasicNewsRecipe


class IEEESpectrumOnline(BasicNewsRecipe):

    title = u'IEEE Spectrum Online'
    description = 'All the articles and blog posts from IEEE Spectrum online. This is not the magazine.'
    publisher = u'IEEE.org'
    __author__ = 'Armin Geller'
    category = 'news, electronics, IT, computer science'
    # Version: 1.0 AGe 2014-07-31
    # Version: 1.1 AGe 2019-02-18
    # Version: 1.2 AGe 2021-05-03
    language = 'en'
    encoding = 'utf-8'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True

    feeds = [
        ('IEEE Spectrum Recent Content', 'https://spectrum.ieee.org/rss/fulltext'),
        ('Spectrum videos', 'https://spectrum.ieee.org/rss/videos'),
        ('Blog: Automaton', 'https://spectrum.ieee.org/rss/blog/automaton/fulltext'),
        (
            'Blog: Energywise',
            'https://spectrum.ieee.org/rss/blog/energywise/fulltext'
        ),
        ('Blog: Nanoclast', 'https://spectrum.ieee.org/rss/blog/nanoclast/fulltext'),
        ('Blog: Tech Talk', 'https://spectrum.ieee.org/rss/blog/tech-talk/fulltext'),
        (
            'Blog: The Institute',
            'https://spectrum.ieee.org/rss/the-institute/fulltext'
        ),
        (
            'Blog: Cars That Think',
            'https://spectrum.ieee.org/rss/blog/cars-that-think/fulltext'
        ),
        (
            'Blog: Human OS',
            'https://spectrum.ieee.org/rss/blog/the-human-os/fulltext'
        ),
        (
            'Blog: Risk Factor',
            'https://spectrum.ieee.org/rss/blog/riskfactor/fulltext'
        ),
        (
            'Blog: View From the Valley',
            'https://spectrum.ieee.org/rss/blog/view-from-the-valley/fulltext'
        ),
        (
            'Topic: Aerospace',
            'https://spectrum.ieee.org/rss/blog/automaton/fulltext'
        ),
        ('Topic: Biomedical', 'https://spectrum.ieee.org/rss/biomedical/fulltext'),
        ('Topic: Energy', 'https://spectrum.ieee.org/rss/energy/fulltext'),
        ('Topic: Geek Life', 'https://spectrum.ieee.org/rss/at-work/fulltext'),
        ('Topic: History', 'https://spectrum.ieee.org/rss/tech-history/fulltext'),
        (
            'Topic: News From Around IEEE',
            'https://spectrum.ieee.org/rss/blog/news-from-around-ieee/fulltext'
        ),
        ('Topic: Robotics', 'https://spectrum.ieee.org/rss/robotics/fulltext'),
        ('Topic: Telecom', 'https://spectrum.ieee.org/rss/telecom/fulltext'),
        (
            'Topic: IEEE COVID-19 News & Resources',
            'https://spectrum.ieee.org/rss/the-institute/ieee-covid19-resources'
        ),
        ('Topic: At Work', 'https://spectrum.ieee.org/rss/at-work/fulltext'),
        ('Topic: Computing', 'https://spectrum.ieee.org/rss/computing/fulltext'),
        (
            'Topic: Gadgets',
            'https://spectrum.ieee.org/rss/consumer-electronics/fulltext'
        ),
        ('Topic: Green Tech', 'https://spectrum.ieee.org/rss/green-tech/fulltext'),
        (
            'Topic: Semiconductors',
            'https://spectrum.ieee.org/rss/semiconductors/fulltext'
        ),
        (
            'Topic: Transportation',
            'https://spectrum.ieee.org/rss/transportation/fulltext'
        ),
        (
            'Topic: Radio Spectrum Podcasts- NEW',
            'https://feeds.transistor.fm/radiospectrum'
        ),
    ]

    # Add 'https://spectrum.ieee.org' in front of image url for download images

    def image_url_processor(cls, baseurl, iurl):
        if iurl:
            return 'https://spectrum.ieee.org' + iurl
PK�X�	���
iekspries.png�PNG


IHDR���RPLTE�%�$�%�%�&�&�&���uUЮ;IDAT[c(6s$�Y��3�����*d��1�
d�)����W�nl���bbC$��	��IEND�B`�PK�X��Z�ttiekspries.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1434052728(BasicNewsRecipe):
    title = '\u0415\u043a\u0441\u043f\u0440\u0435\u0441'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = 'rpalyvoda'
    language = 'uk'
    cover_url = 'https://upload.wikimedia.org/wikipedia/uk/7/7b/Expres-logo.png'
    masthead_url = 'https://upload.wikimedia.org/wikipedia/uk/7/7b/Expres-logo.png'
    auto_cleanup = True

    feeds = [
        ('\u0413\u043e\u043b\u043e\u0432\u043d\u0456 \u043d\u043e\u0432\u0438\u043d\u0438',
         'http://expres.ua/rss.xml'),
        ('\u041b\u044c\u0432\u0456\u0432\u0441\u044c\u043a\u0456 \u043d\u043e\u0432\u0438\u043d\u0438',
         'http://lvivexpres.com/rss.xml'),
    ]
PK�Xy����ifzm.png�PNG


IHDR�a	pHYs��~��IDAT8�S�OQ���nK�P�T[�B�"D0�R9�!�Y*��cࠍxóh��U���T�Z�Yh�-��B�oFk�ċN�;�x�7�S�^���L&��\��ʆ�ʈ8b�b��.�U'�yWv��SV�y^J�I�Ӫܿ;�����	ܘ~l���/�>[.��ޠ�����Mf���l���-����m6s���F��s������%_ �)@��
�CpT1���C���lf��'ig�����\�B�0�j���=J�x��K�{��x414wn��c�@	��
�����o�=f	p�[tv��@���;���^]?���`�&&�t:-׮��L��f�.�xaG>����0��ї�EUs����o���j���]���P�UY�D�w��/V��ѐ�}�(
����v�P\g�}��a�\;�v�G������#n�������?�i�CN)Ӓ�w!�:K�V�={�1x@	��>2�����Y�o@Ȳ_�g��J��B���2�$X@D�ԥW2<��fZ\ܒ��	�����z������wjꢀ<�+�x��t��r-<��~[�c&�Y8=L��֍�{�g�Tu�`��6G��5ͭ%���?���_��X!^��IEND�B`�PK�X+27?�	�	ifzm.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import json

def json_to_html(raw, link):
    data = json.loads(raw)
    data = data['data']['content']
    title = '<h1 title="{}">'.format(link) + data['subject'] + '</h1>'
    auth = '<p><b>' + data['author'] + '</b></p>'
    sub = '<p class="intro"><i>' + data['introtext'] + '</i></p>'
    body = data['fulltext']
    return '<html><body><div>' + title + auth + sub + body + '</div></body></html>'


class infzm(BasicNewsRecipe):
    title = '南方周末'
    __author__ = 'unkn0wn'
    description = 'Southern Weekly (infzm.com), founded in 1984, is a Chinese weekly newspaper based in Guangzhou. Download Weekly.'
    language = 'zh'
    encoding = 'utf-8'
    no_stylesheets = True
    remove_javascript = True
    ignore_duplicate_articles = {'title'}
    remove_empty_feeds = True
    use_embedded_content = False
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'http://ssimg.kkod.cn/web/02/14227.gif'

    articles_are_obfuscated = True

    remove_tags = [dict(name=['video', 'svg', 'button'])]

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)['href'].split('?')[0]
        res_link = link.replace('https://www.infzm.com', 'https://api.infzm.com/mobile') \
            + '?platform=wap&version=1.89.0&machine_id=35458aa29603f2b246636e5492122b50&user_id=&token=&member_type='
        # if article is paywalled, add code to figure out machine_id
        raw = br.open(res_link).read()
        html = json_to_html(raw, link)
        return ({ 'data': html, 'url': link })

    extra_css = '''
        img {display:block; margin:0 auto;}
        .cm_pic_caption, .cm_pic_author { font-size:small; text-align:center; }
    '''

    feeds = [
        ('南方周末', 'https://news.google.com/rss/search?q=when:170h+allinurl:https%3A%2F%2Fwww.infzm.com&hl=zh-HK&gl=HK&ceid=HK:zh')
    ]

    def populate_article_metadata(self, article, soup, first):
        article.title = article.title.replace(' - 南方周末', '')
        article.url = soup.find('h1')['title']
        article.summary = self.tag_to_string(soup.find(attrs={'class':'intro'}))
        article.text_summary = self.tag_to_string(soup.find(attrs={'class':'intro'}))
PK�X{���''ihned.cz.png�PNG


IHDR  ��tRNSn��	pHYs���+�IDATH��VKkW���!`�0��B �@K�Hi�)!Yf�M ��E
�?&��(����R,�΋�ƱqhI�i�pb[�̝��i��h�y)߽9�-�Y��X�7g�wϹ�~W$�T�W#���@����3�{L(�}p2���;Q7�N��'�Lhdh,E#�K��n|0E�d�p��R��ա4=~Gë�=��[�d���R�o�a��u�a{WW�h�EϺ�@�]�_��Z���
?�l�1�����_u�M'xn8є*p���IN{��l�Z��z��`,�^[0�p�W�� ggu��Z�wu�G4E�eA_2�j���Gİ�!"Ȩ<�b!��`x��q�'�t�
�g�k��zI\~�7� �;��
�InJ�֬b�A��m{aL�]��j<�ׄ#��lV�=V��%�D��c4}�g�}��"�=�[��^2��x?rK�-�'�A���		
�b�y[^�tŗ�yj�浮/A�EH���7T�C�h�P�O��L/�T;]���†�šFK�=x�\?P-)���� lQ�@�L��4�d�w��j����[`���ѿ��&|�e���X�`�h	qy(IW�n�QW�*7�4�ۻEl~(��f����+�vh�r�Dz�����u��A�M�(�Ճi
�鴾�ݻ�ታ�8�t�	�?�M�2���cJ���\	�c�$$�J��cKIQ��y|�f�}И�t�HN��Ac�e�]��iL�����ȏ^��я������R\���u���Q���	�ONҨ�������1��3:+���̲է���A�~Yob�˶_�}�7s��y�@8nAk��ѹ��5�o(���Ru�1�;74#\�q)��b�!�-q���h��i�d�x��G�N�	yه�/��낙ع�z�m{n4��ή��n��-���^n)[���`�IEND�B`�PK�X�{���ihned.cz.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class ihnedRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'iHNed.cz'
    publisher = u''
    description = 'ihned.cz'
    oldest_article = 1
    max_articles_per_feed = 20
    use_embedded_content = False

    feeds = [
        (u'Zprávy', u'http://zpravy.ihned.cz/?m=rss'),
        (u'Hospodářské noviny', u'http://hn.ihned.cz/?p=500000_rss'),
        (u'Byznys', u'http://byznys.ihned.cz/?m=rss'),
        (u'Life', u'http://life.ihned.cz/?m=rss'),
        (u'Dialog', u'http://dialog.ihned.cz/?m=rss')
    ]

    language = 'cs'
    cover_url = 'http://rss.ihned.cz/img/0/0_hp09/ihned.cz.gif'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                            """

    remove_attributes = []
    remove_tags_before = dict(name='div', attrs={'id': ['heading']})
    remove_tags_after = dict(name='div', attrs={'id': ['next-authors']})
    remove_tags = [dict(name='ul',   attrs={'id': ['comm']}),
                   dict(name='div',   attrs={'id': ['r-big']}),
                   dict(name='div',   attrs={'class': ['tools tools-top']})]
PK�X{���''	ihned.png�PNG


IHDR  ��tRNSn��	pHYs���+�IDATH��VKkW���!`�0��B �@K�Hi�)!Yf�M ��E
�?&��(����R,�΋�ƱqhI�i�pb[�̝��i��h�y)߽9�-�Y��X�7g�wϹ�~W$�T�W#���@����3�{L(�}p2���;Q7�N��'�Lhdh,E#�K��n|0E�d�p��R��ա4=~Gë�=��[�d���R�o�a��u�a{WW�h�EϺ�@�]�_��Z���
?�l�1�����_u�M'xn8є*p���IN{��l�Z��z��`,�^[0�p�W�� ggu��Z�wu�G4E�eA_2�j���Gİ�!"Ȩ<�b!��`x��q�'�t�
�g�k��zI\~�7� �;��
�InJ�֬b�A��m{aL�]��j<�ׄ#��lV�=V��%�D��c4}�g�}��"�=�[��^2��x?rK�-�'�A���		
�b�y[^�tŗ�yj�浮/A�EH���7T�C�h�P�O��L/�T;]���†�šFK�=x�\?P-)���� lQ�@�L��4�d�w��j����[`���ѿ��&|�e���X�`�h	qy(IW�n�QW�*7�4�ۻEl~(��f����+�vh�r�Dz�����u��A�M�(�Ճi
�鴾�ݻ�ታ�8�t�	�?�M�2���cJ���\	�c�$$�J��cKIQ��y|�f�}И�t�HN��Ac�e�]��iL�����ȏ^��я������R\���u���Q���	�ONҨ�������1��3:+���̲է���A�~Yob�˶_�}�7s��y�@8nAk��ѹ��5�o(���Ru�1�;74#\�q)��b�!�-q���h��i�d�x��G�N�	yه�/��낙ع�z�m{n4��ή��n��-���^n)[���`�IEND�B`�PK�X��֣�ihned.recipeimport re
import time
from calibre import strftime
from calibre.web.feeds.recipes import BasicNewsRecipe


class IHNed(BasicNewsRecipe):

    stahnout_vsechny = True
    # True   = stahuje vsechny z homepage
    # False  = stahuje pouze dnesni clanky (ze dne, kdy je skript spusten)

    title = 'iHNed'
    __author__ = 'Karel Bílek'
    language = 'cs'
    description = 'Zprávy z iHNed.cz'
    timefmt = ' [%a, %d %b, %Y]'
    needs_subscription = False
    remove_tags = [dict(attrs={'class': ['borderbottom', 'web', 'foot', 'reklama', 'd-elm d-rellinks', 'd-elm']}),
                   dict(style=['text-align: center;']),
                   dict(id=['r-bfull']),
                   dict(name=['script', 'noscript', 'style'])]
    encoding = 'windows-1250'
    no_stylesheets = True
    remove_tags_before = dict(attrs={'class': 'd-nadtit'})
    remove_tags_after = dict(attrs={'class': 'like'})

    conversion_options = {
        'linearize_tables': True,
    }

    def preprocess_html(self, soup):

        def makeurl(wat):
            return "http://ihned.cz" + wat

        for h1 in soup.findAll('h1'):
            a = h1.find('a')
            if a:
                string = a.string
                if string:
                    soup.a.replaceWith(string)
        for a in soup.findAll('a',  href=True):
            cil = str(a['href'])
            if cil.startswith("/") or cil.startswith("index"):
                a['href'] = makeurl(cil)
        return soup

    def parse_index(self):

        def makeurl(wat):
            if wat.startswith("/") or wat.startswith("index"):
                return "http://ihned.cz" + wat
            else:
                return wat

        articles = {}  # vysledek, asi
        ans = []  # vsechny sekce

        articles["Hlavní"] = []
        ans.append("Hlavní")

        was = {}

        def parse_subpage(url, name):
            articles[name] = []
            ans.append(name)

            soup = self.index_to_soup(url)
            otvirak = soup.find(True, attrs={'class': ['otv']})
            if otvirak:

                # the code is copypasted here because I don't know python.
                # simple as that.
                a = otvirak.find('a', href=True)
                title = self.tag_to_string(a, use_alt=True).strip()
                txt = otvirak.find(True, attrs={'class': ['txt']})
                description = ''
                if txt:
                    match = re.match(
                        r'<div class="txt">\s*([^<]*)\s*<a', str(txt), re.L)
                    if match:
                        description = match.group(1)

                pubdate = strftime('%d. %m.')
                if title not in was:
                    articles[name].append(
                        dict(title=title, url=makeurl(a['href']), date=pubdate,
                             description=description,
                             content=''))

            otv234 = soup.find(True, attrs={'class': ['otv234', 'col2a']})
            if otv234:
                for ow in otv234.findAll(True, attrs={'class': ['ow']}):
                    a = ow.find('a', href=True)
                    title = self.tag_to_string(a, use_alt=True).strip()
                    description = ''
                    prx = ow.find(True, attrs={'class': ['prx']})
                    if prx:
                        description = str(prx.string)
                    nfo = ow.find(True, attrs={'class': ['nfo']})
                    pubdate = ''
                    if nfo:
                        dtime = time.localtime()
                        day = dtime[2]
                        month = dtime[1]

                        pubdate = strftime('%d. %m.')

                        match = re.search(r'([0-9]*)\.([0-9]*)\.', str(nfo))

                        if self.stahnout_vsechny or (int(day) == int(match.group(1)) and int(month) == int(match.group(2))):
                            if title not in was:
                                articles[name].append(
                                    dict(title=title, url=makeurl(a['href']), date=pubdate,
                                         description=description,
                                         content=''))

        soup = self.index_to_soup('http://ihned.cz/')
        otvirak = soup.find(True, attrs={'class': ['otv']})
        if otvirak:
            a = otvirak.find('a', href=True)
            title = self.tag_to_string(a, use_alt=True).strip()
            txt = otvirak.find(True, attrs={'class': ['txt']})
            description = ''
            if txt:
                match = re.match(
                    r'<div class="txt">\s*([^<]*)\s*<a', str(txt), re.L)
                if match:
                    description = match.group(1)

            pubdate = strftime('%d. %m.')
            feed = "Hlavní"
            articles[feed].append(
                dict(title=title, url=(a['href']), date=pubdate,
                     description=description,
                     content=''))
            was[title] = 1

        otvirak2345 = soup.find(True, attrs={'class': ['otv2345']})
        if otvirak2345:
            for otv2 in otvirak2345.findAll(True, attrs={'class': ['otv2-5']}):
                a = otv2.find('a', attrs={'class': ['tit2']}, href=True)
                title = self.tag_to_string(a, use_alt=True).strip()
                description = ''
                span = otv2.find('span')
                if span:
                    match = re.match(r'<span>\s*([^<]*)\s*<a', str(span), re.L)
                    if match:
                        description = match.group(1)
                feed = "Hlavní"
                pubdate = strftime('%d. %m.')
                articles[feed].append(
                    dict(title=title, url=(a['href']), date=pubdate,
                         description=description,
                         content=''))
                was[title] = 1

        parse_subpage("http://komentare.ihned.cz/", "Komentáře")
        parse_subpage("http://domaci.ihned.cz", "Domácí")
        parse_subpage("http://ekonomika.ihned.cz", "Ekonomika")
        parse_subpage("http://zahranicni.ihned.cz/", "Zahraničí")
        parse_subpage("http://finweb.ihned.cz/", "Finance")
        parse_subpage("http://digiweb.ihned.cz/", "DigiWeb")
        parse_subpage("http://kultura.ihned.cz/", "Kultura")
        parse_subpage("http://sport.ihned.cz/", "Sport")

        # seradi kategorie
        ans = self.sort_index_by(ans, {'Hlavni': 1, 'Domácí': 2, 'Ekonomika': 5, 'Zahraničí': 3,
                                       'Finance': 6, 'DigiWeb': 7, 'Kultura': 8, 'Sport': 9, 'Komentáře': 4})

        # vrati, ale pouze, kdyz je v kategoriich...
        ans = [(key, articles[key]) for key in ans if key in articles]
        return ans
PK�X�4��iht.png�PNG


IHDR  D���&PLTEmmm333�����������(((FFF���������WWW===���������qqq!!!������{{{���>>>wwwUUU���444KKKsss���(((


}}}���+++###^^^���			


555\\\���&&&vvv===���...������///YYY������


\\\���XXX333��Ү��������{{{���000PPP   ppp@@@(	$][tRNSp��j0�LX��� 0�Pp�[���@�ɤ�@�pL��<���܈��� �����`��j��X������d������`�t�dq�[��y���^C%IDATxڵ�cb�`�ᓉ3�qm�ڶ�3�"Ɗ�>��3^��xH�U0����d�8��3��	�o~�I�=G�i_ȯ0�F+L>�,��je�`�>j$[/���&����b��D��H+�P���OP��3��,��� �A��X|���N�*��=�#�^\�:
@��"i+�Ƃ�2�+�X��)��x��q_��
*�@��&ɭvPۉ�� ��=���>:H��>d��1z)���������s�D�]���ג��%�|5����u�Y�U�%�[�PYY.�E���bVX��rIEND�B`�PK�X{�⃭�
iht.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class NYTimesGlobal(BasicNewsRecipe):
    title = u'NY Times Global'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('NYTimes',
         'http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml'),
        ('NYTimes global',
         'http://www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml'),
        ('World',
         'http://www.nytimes.com/services/xml/rss/nyt/World.xml'),
        ('U.S.',
         'http://www.nytimes.com/services/xml/rss/nyt/US.xml'),
        ('Business',
         'http://feeds.nytimes.com/nyt/rss/Business'),
        ('Sports',
         'http://www.nytimes.com/services/xml/rss/nyt/Sports.xml'),
        ('Technology',
         'http://feeds.nytimes.com/nyt/rss/Technology'),
    ]
PK�X k�VWWiktibas.png�PNG


IHDR  ��IDATx����,K��g۶m۶���m۶=W�gޱ�������Y���_�Q��n*��_|��_^��_���=R�\Qáj{:'�G;���O�}fl!��O]U��Xi�GXx��|���p�=D����voխ'��7��{�k�^q���/����b�]#�.�D����K�_���#����td��V>���U�)�~+c��?M�w��7���ͽ�M-�5��n��rU8 �1&F@5���&�;�h~��F�ۘ�o
-���7��V4�n}��F{��p��O�u$�>2wf��O u��dn6�ԓ���PX~����~�X�ҹWN,�B丣�.z;2�ϳɟ���|8{��f&�_
ʈ2R>ʠ"���Zs��F{���-�=����$�|�2�t�w:���W��O>Q�v�������q*�x���c3��ǂ\���C��֐w܀��S���Қ�6��ݓ
PO*�����5��_�Br:}��]+mX��}���/��،�0M�8.|�<\E8��B����g�bkk7=�]�9��ܺ�gv<�k��Zso�6��IF�\������l��P@��
�_�/�Jn��)&�|0��k��7\�k���lm����OM,�=���H�����
< @ ��fW�L��}����d��:{E��2��ᅷ_��ԩ���ǹ���g%�%��r=Id(
["������C-'����?�z��-�"�\���tv�o}Lw�"��̽�~�@�����!Б$��+/�{�Ez�ٺ|�T�>5�;K���Ӽ�Yl���ةuL&tD.�5/�H���o�=K��N�G�ݚ[c��ՍDn����'$&���/�]s�>�/�g���x���U�uMm�c�ؓ��M�
7/��죯��^��W�/�^>�a�ӹ�矉�rv�'�>z}d�3dl�@
[�H���';���.���#Ο�d-�Н�2(V(�+|��,Z$&�u7Jm�X<~�U�H
�3e
%"P0��lW{�ݓ�8Y��:F�@	�ԕƒ�S܍Ѝr��ᗒL�C~���J���?��h�H�4O��C�#|�<~˝t�Ei*�����6_}Y��	�e�(�Bl���=�|�U��3կ�L��U����5�Mtb��!u퍉�O����;�:��7���G�'���}�y�3\�{���'��|xw��7='SmjB���>=x���=��\�\�t�>��{
��Á���h_{As�`{f���MO����Z�۟�~b��q^�Mu�/h�9�l2�*�
�|��)
ՉJ��@�x�33G���!s�}��ݥ����;����Y�F7]�L��t����&_� ����㥇�.��>��H�u|:��zT ���+�2���\#ED�$���<iBt���aP�\��,�����H/z�qi�}'��',F5�bU�E׷� "T��,mv�j�������^.��8�P�-DB��PF�x[;�APIL&k:5|�0tƔ{z����?�q�T�
�IEND�B`�PK�XE�93��iktibas.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1420471504(AutomaticNewsRecipe):
    title = '\u0130ktibas'
    language = 'tr'
    __author__ = 'asalet_r'
    oldest_article = 7
    max_articles_per_feed = 20
    auto_cleanup = True

    feeds = [
        ('\u0130ktibas Dergisi', 'http://www.iktibasdergisi.com/feed/'),
    ]
PK�X r���il_cambiamento.png�PNG


IHDR  D���
PLTE�����������~}���
���JKI@A?VWUdecqmk����]�`�f�*j���������()'ߺ�������231���9:8#$"������STR'(&��򼾻hig:;9�K�����h��i��q��p����͐�Α�Ҡ��ʠ�����ܱ������-/,�����������������Q�����B{����^GIF���/n������r�������������������٧�̂�������:t�y�ӝ��{�796�������>m������ܩ�&(%JLJݲ�NPMߴ��~������બ��;b����Hb���������.^��������������egd�@y��������kmj6%rtqw'S�R����������԰Í$]!;=:685��ϡ���T��Ҏ���k��d}=?<�|�՘����Y[X\^[��Һ^�ȷ��`w����&_�
N�t�	|2Zmol������/�؜�IDATx�e҃v&M�B�?�Fl۶���m�\ۼƍg���9�*`3�3ϭ��k�wZe3 tG��b
�W��\h��B�~|ı�e�0�6FF+`�;u��=��(���m>С$�J����4#�ˌ�c�@�t�H%�M ��%�3`stصIP��3�`xr7OJ��(�֮({�{|�›v_�`�Kr�@7"�qM�C�)3v�L��A�S4FHĨ�s����4Q*u��Dh�h3���(iyI�ǐs*N��j�� �𣗫��b ���"�t,� %�-�j�z��i�r���Υ,l������������r
z��a�(��-{+WS��n��nO-�,h����3.O�}k��u��1��e�xP�̫�rzc����]�̴4�f	Ņwp����5�9f�%t<A�3�'�8�T��u��ƌ�Iݜ�~��+��UU�S�F�q�xj>�b�׽M�_���b��_Zu���vG��'�!o??ʜ���H�P��@?�s�
1�}��qG�rSWJh>�̈���V�q���:he�iFfFѓ�w��f���'7.5祢z���Y	�d"Q��63Z�H;��C	�s�Ӏ�2af+�������u�p�gx[=b��IEND�B`�PK�Xk�IVVil_cambiamento.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class IC(BasicNewsRecipe):
    title = u'il Cambiamento'
    oldest_article = 12
    max_articles_per_feed = 50
    language = 'it'
    __author__ = 'ghib9'
    auto_cleanup = True
    use_embedded_content = False

    feeds = [(u'il Cambiamento', u'http://www.ilcambiamento.it/rss.xml')]
PK�XF��	++il_fatto.png�PNG


IHDR  D���PLTE" % "&$%*'(+#$,)*/./1%&1/03-,401423<89B$&E?@F88I'(IBBIGHOOORPOTSTU((U43V)'VVXYII\YZ`YZc>@dVUf-,gdehXXjONkSOsklvedyLL~tp�^\�kj�|{����ws�34�|{����oi����@@�{v�}|����IJ����NP�gg�\Z�7;����������')����NN�������������������������$(�zx����������78����������AD����������������]_�������������lk�����¿OP�������"�IK����*-�48�aa��"�WZ�uuÄ}��������ċ�Ķ��ź��&(�-1Ư��}Ǩ��$ȡ��utɒ�����*-ʲ�ʹ��cd�eeˉ�˛�˶�˼��¾����}|Ά��_`����WZв�ѳ��fdҊ�Ғ��}{ӝ��������stԒ�Ժ����Ղ�զ��������GI�ST�Y\�kk����HG�6<�be�jkؚ�ن�����-,�Z\�wwڋ�ڻ�����WXۇ�ۗ�ۤ��6:�>D�NQܼ�������ݶ�����JL������࿿�25�������:<�%+������䷲����)0�������)-�./�38�@A�¾�+0�%)�).����"'�9:����%�#)����������'�%�!%�������-1����%�,1����$*�����������������������������������������������������6�v��IDAT���ke��}�wgg�MvS�1�X�]�i�ː*bc
��J����ŋ/��(H=��J/����4�i������m�M&���K�x�C�<�a{��C���������߄�G��O-���a�{ORxY�e���a��&my���\��eO��D�za��2}�_;Z�L����ƗN�ޙ5��>�r����{�\]<xha��pJ�������-�K8���G��G�n
]S�5�A��_�|M��(�\z�ɮsa�e�<�<kDG�z�ԏ~~eqW�n��MK�>��G�:�$��ӱ�p �i�Is
�6^��B���cq��γ�k��μx�z��m��&�1�lV��4�h�v��ǩ��uc\��ۏ[�#h����#�q���� �����գ�,���!�P�:u=Iۜݷ�s���Z�#�j1OhP���N�[���Q���-�˕���1�����.M.��?
m.�=?�Kqkڅ�<���V9��
��|�/��x�S^y*�	
���f���?ՠ��7�c�����n�>O8gJ{���1TL��a�J����'w3�,#>�ʷ=U~��p��sӅ�����
M��L�R�5���ڬ>\�?��'��_�HpGV�`����m�	�JP�t7ۿ�\d��	��ͤꥒ�IsD��B�!��-�L���J��h"���c�8�i9G�Z:�Ai�s�a�v�'��W�����IEND�B`�PK�Xv�W�iiil_fatto.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1286477122(BasicNewsRecipe):
    title = u'Il Fatto Quotidiano'
    oldest_article = 7
    max_articles_per_feed = 25
    language = 'it'
    __author__ = 'egilh'

    feeds = [
        (u'Politica & Palazzo',
         u'http://www.ilfattoquotidiano.it/category/politica-palazzo/feed/'),
        (u'Giustizia & impunit\xe0',
         u'http://www.ilfattoquotidiano.it/category/giustizia-impunita/feed/'),
        (u'Media & regime',  u'http://www.ilfattoquotidiano.it/category/media-regime/feed/'),
        (u'Economia & Lobby',
         u'http://www.ilfattoquotidiano.it/category/economia-lobby/feed/'),
        (u'Lavoro & precari',
         u'http://www.ilfattoquotidiano.it/category/lavoro-precari/feed/'),
        (u'Ambiente & Veleni',
            u'http://www.ilfattoquotidiano.it/category/ambiente-veleni/feed/'),
        (u'Sport & miliardi',
         u'http://www.ilfattoquotidiano.it/category/sport-miliardi/feed/'),
        (u'Cronaca', u'http://www.ilfattoquotidiano.it/category/cronaca/feed/'),
        (u'Mondo', u'http://www.ilfattoquotidiano.it/category/mondo/feed/'),
        (u'Societ\xe0',  u'http://www.ilfattoquotidiano.it/category/societa/feed/'),
        (u'Scuola', u'http://www.ilfattoquotidiano.it/category/scuola/feed/'),
        (u'Tecno', u'http://www.ilfattoquotidiano.it/category/tecno/feed/'),
        (u'Terza pagina', u'http://www.ilfattoquotidiano.it/category/terza-pagina/feed/'),
        (u'Piacere quotidiano',
            u'http://www.ilfattoquotidiano.it/category/piacere-quotidiano/feed/'),
        (u'Cervelli in fuga',
         u'http://www.ilfattoquotidiano.it/category/cervelli-in-fuga/feed/'),
        (u'Documentati!', u'http://www.ilfattoquotidiano.it/category/documentati/feed/'),
        (u'Misfatto', u'http://www.ilfattoquotidiano.it/category/misfatto/feed/')
    ]
PK�Xa�\""
il_foglio.png�PNG


IHDR  V%(�IDAT8O��!��0@�9B��#�>�!(84̒i�e�^� ԒQ�qP%�JAſ M몎�����‡��3�xɤ�x߮��{o�JD�I�K-"�fO�8�Y{��+�8�~v�Ѽ������J�@�� fas3g�v��No���`�7�]�:�Ƹ�g]&C�7!6���h��������.W�DK��i��ߕq�#�UI�>B��m�R_7����fWIEND�B`�PK�XږV��il_foglio.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1373969939(BasicNewsRecipe):
    title = u'Il Foglio - Editoriali'
    oldest_article = 1
    max_articles_per_feed = 10
    auto_cleanup = False
    keep_only_tags = [
        dict(name='div', attrs={'class': 'sec_item'})
    ]
    feeds = [(u'Il Foglio - Editoriali',
              u'http://feed43.com/8814237344800115.xml')]
    no_stylesheets = True
    __author__ = 'faber1971'
    description = 'Leading articles from an Italian newspaper - v1.00 (16 July, 2013)'
    language = 'it'
    masthead_url = 'http://www.ilfoglio.it/media/img/interface/logo_testata_small.gif'
PK�X��`il_giornale.png�PNG


IHDR  szz��IDATxڭ��3K�c;��m۶m۶m��m۶m۶�5靝��M��9��ٞ��U�[I���R�g��[He2���۽����3���H"�m�������/'*'ȓ
�/ri9��HM������Z$�[����N�T��|r^�"̍�&�
f5����:�3K�|_��H��{����O�Þ�)����W�~;�+��h�xc{�y�aQ�fՋcu�����~b/m�;���	Τ��.)��Li��OQ4|?����:�)nV�8��ɇcRhQR*�8�j��zt�{*�o��M����(\���[?�ۆ6_����(\N�.�5�.���Zf�t��q��&v{���S]�si�{��w�z��K̟͛�n8;u�.��-�T�� �@��$����	d8?�X'��#���>x��ӏqf�	���
��
{jh�e�3���aɭ�T	H�4	m����pc^��_��"B����~�'����,��^!`��ǎzV,��͒8�袙��o�1�V��Ԅj1�P��&@xFT6H���Eg؀��w��{.�`}�d�KN*���pس
�æ�B�׎��?y8�����ٙs?6�K��{���Ke�R-Q�,�qUc8��S����qi���dS��i��Ћ�_���WBz��|����+��s��DDXC�hH=L�g:�F��n2C��l�g���-��\�! ��=�0�"��y���Ë���i^�]��{��j�
��	�!�3	�P@��2���~U'��}�������b��Ңe%K��$��_�:���g���=R�Ƙ�|�z�w��-~�Q���9�WB�,~em�,��C�t�'׈�6m��j/0X?�<�+� 3��F��jQx����m�%��"�#�f"��exs.R`r��ͨ ��Z��S��?��������D�����s��}rnH*�;��N)|���od���]x����CN���f��{�l�~�rk����t�ON�l����edm�TtO���,��c;u�i	��u�d���Qus���!���z-�E�/c��p�^�d���x�N�6�ˊЏ�Ǯ���!�~q�����ɷ�H��mGΑU-ԕ�KM��G� ���|N��du�.�D�Z�YYLN�u3��� �`V�+�~�D�R�&�Rr�-��ID�4+�G�v҈�m�/B=_K���p�@���<��h�UZ�"?��d
٭���~T}N%�|��q�V�IEND�B`�PK�X�ШGiiil_giornale.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gambarini, based on Darko Miletic'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
description = 'Italian daily newspaper - 09-11-2011'

'''
http://www.ilgiornale.it/
'''
from calibre.web.feeds.news import BasicNewsRecipe


class IlGiornale(BasicNewsRecipe):
    __author__ = 'GAMBARINI'
    description = 'Italian daily newspaper'

    cover_url = 'http://www.ilgiornale.it/img_v1/logo.gif'
    title = u'Il Giornale'
    publisher = 'Il Giornale ON-LINE S.r.l.'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False

    no_stylesheets = True
    conversion_options = {'linearize_tables': True}
    remove_javascript = True

    keep_only_tags = [dict(name='h1', attrs={
                           'class': 'entry-title'}), dict(name='div', attrs={'id': 'insertbox_text'})]

    feeds = [
        (u'Ultime Notizie', u'http://www.ilgiornale.it/rss.xml'),
        # (u'All\'Interno', u'http://www.ilgiornale.it/la_s.pic1?SID=8&RSS=S'),
        # (u'Esteri', u'http://www.ilgiornale.it/la_s.pic1?SID=6&RSS=S'),
        # (u'Economia', u'http://www.ilgiornale.it/la_s.pic1?SID=5&RSS=S'),
        # (u'Cultura', u'http://www.ilgiornale.it/la_s.pic1?SID=4&RSS=S'),
        # (u'Spettacoli', u'http://www.ilgiornale.it/la_s.pic1?SID=14&RSS=S'),
        # (u'Sport', u'http://www.ilgiornale.it/la_s.pic1?SID=15&RSS=S'),
        # (u'Tech&Web', u'http://www.ilgiornale.it/la_s.pic1?SID=35&RSS=S'),
        # (u'Edizione di Roma', u'http://www.ilgiornale.it/roma.pic1?SID=13&RSS=S'),
        # (u'Edizione di Milano', u'http://www.ilgiornale.it/milano.pic1?SID=9&RSS=S'),
        # (u'Edizione di Genova', u'http://www.ilgiornale.it/genova.pic1?SID=7&RSS=S')
    ]
PK�X��Uu��il_messaggero.png�PNG


IHDR�a�IDATx�b����Ң�nN�3m�lea�om۶׵mۊֶm۶m��FT7N�Zg�?I���Z�̝�S^�Ǐ�c8y��:;������~0}��E����4�cG�BEA��*P�W���,�u�o�^D�G@^J�E���<\\��{wɢ�����q�z��;�n��y��u8s�4._�Ϲ󠥪�kW���psv�`�߽���q������o�45ù3gQ_W���(��ͫ�hmmE��QS]���FGG����%9y\�|�����^<��&�k���`�`�`�K)^�__WG�ij�WhmiA04DL===8z�||����[7ob׎T8sc����������8X���PG�?���d$$��3Zj����`Պ8v�(B��7oQWf�{���奥�����3����	0�CCE�_@C}=b#������`��3���D(���Ջ���H]x���f �jTY1����-^�ӧNa``�F7!6�Ϟ>�wA����/�n��#6*[6mBgg'�j����3D��R�� �{��^�T��T�.1.jJ��iN�E���3���݃�����FDh��y�u**,����X[��-h��֭YKF���Œ�j���ׇ�������+xv�����)e�9�f�?绣� CIEND�B`�PK�X�ۦ�
�
il_messaggero.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gabriele Marini, based on Darko Miletic'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
description = 'Italian daily newspaper - v1.01 (04, January 2010)'

'''
http://www.messaggero.it/
'''
import time
from calibre.web.feeds.news import BasicNewsRecipe


class IlMessaggero(BasicNewsRecipe):
    __author__ = 'Gabriele Marini'
    description = 'Italian News'

#    cover_url      = 'http://www.ilmessaggero.it/img_tst/logomsgr.gif'
    title = u'Il Messaggero'
    publisher = 'Caltagirone Editore'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 5
    max_articles_per_feed = 100
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    extra_css = ' .bianco31lucida{color: black} '

    keep_only_tags = [dict(name='h1', attrs={'class': ['titoloLettura2', 'titoloart', 'bianco31lucida']}),
                      dict(name='h2', attrs={
                          'class': ['sottotitLettura', 'grigio16']}),
                      dict(name='span', attrs={'class': 'testoArticoloG'}),
                      dict(name='div',  attrs={'id': 'testodim'})
                      ]

    def get_cover_url(self):
        cover = None
        st = time.localtime()
        year = str(st.tm_year)
        month = "%.2d" % st.tm_mon
        day = "%.2d" % st.tm_mday
        cover = 'http://carta.ilmessaggero.it/' + year + \
            month + day + '/jpeg/MSGR_20_CITTA_1.jpg'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover)
        except:
            self.log("\nCover unavailable")
            cover = 'http://www.ilmessaggero.it/img_tst/logomsgr.gif'

        return cover

    feeds = [
        (u'HomePage', u'http://www.ilmessaggero.it/rss/home.xml'),
        (u'Primo Piano', u'http://www.ilmessaggero.it/rss/initalia_primopiano.xml'),
        (u'Economia e Finanza', u'http://www.ilmessaggero.it/rss/economia.xml'),
        (u'Politica', u'http://www.ilmessaggero.it/rss/initalia_politica.xml'),
        (u'Cultura', u'http://www.ilmessaggero.it/rss/cultura.xml'),
        (u'Tecnologia', u'http://www.ilmessaggero.it/rss/tecnologia.xml'),
        (u'Spettacoli', u'http://www.ilmessaggero.it/rss/spettacoli.xml'),
        (u'Edizioni Locali', u'http://www.ilmessaggero.it/rss/edlocali.xml'),
        (u'Roma', u'http://www.ilmessaggero.it/rss/roma.xml'),
        (u'Benessere', u'http://www.ilmessaggero.it/rss/benessere.xml'),
        (u'Sport', u'http://www.ilmessaggero.it/rss/sport.xml'),
        (u'Moda', u'http://www.ilmessaggero.it/rss/moda.xml')
    ]
PK�X���55il_post.png�PNG


IHDR(-S8PLTE��������	�����®����&��0����)��h��"�����l����(��4��W�������Z����/�̏����R��N��9�ί����h����p��1��B��.�̱��,�������K�Ӽ����G��k��e����<������+����`�؋�����Q��B����������5���D���������n�������
���ő�����3����m���Ǎ��V��
�õ�����$�����{�ގ��H�ҫ��������'��)��P�ԛ����������л^�IDATx�5N�A�R�X۶m�m�'���S��QW�&�{g��K���
�<���	�M�.	]����<\]{<��D��;�h��9:|"ف��/0�Jp嚷w�t� ���*��wq��|���_���iH(1h4G	&I)��2�\\e���V����j��P��k1���;]o��I���G���IEND�B`�PK�Xu$���
�
il_post.recipe#!/usr/bin/env python
##
# Title:        Il Post recipe for calibre
# Author:       Marco Scirea, based on a recipe by frafra
# Contact:      marco.prolog at gmail.com
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    Copyright 2019 Marco Scirea
##

from __future__ import absolute_import, division, print_function, unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe
from datetime import date, timedelta

dates = [ date.today().strftime('%Y/%m/%d'), (date.today() - timedelta(1)).strftime('%Y/%m/%d') ]

# ----------- CUSTOMIZATION OPTIONS START -----------

# Comment (add # in front) to disable the sections you are not interested in
# Commenta (aggiungi # davanti alla riga) per disabilitare le sezioni che non vuoi scaricare
sections = [
    ("Italia", "https://www.ilpost.it/italia/"),
    ("Mondo", "https://www.ilpost.it/mondo/"),
    ("Politica", "https://www.ilpost.it/politica/"),
    ("Tecnologia", "https://www.ilpost.it/tecnologia/"),
    ("Internet", "https://www.ilpost.it/internet/"),
    ("Scienza", "https://www.ilpost.it/scienza/"),
    ("Cultura", "https://www.ilpost.it/cultura/"),
    ("Economia", "https://www.ilpost.it/economia/"),
    ("Sport", "https://www.ilpost.it/sport/"),
    ("Media", "https://www.ilpost.it/media/"),
    ("Moda", "https://www.ilpost.it/moda/"),
    ("Libri", "https://www.ilpost.it/libri/"),
    ("Auto", "https://www.ilpost.it/auto/"),
    ("Konrad", "https://www.ilpost.it/europa/"),
]

# ----------- CUSTOMIZATION OPTIONS OVER -----------


class IlPost(BasicNewsRecipe):
    __author__ = 'Marco Scirea, unkn0wn'
    __license__ = 'GPL v3'
    __copyright__ = '2019, Marco Scirea <marco.prolog at gmail.com>'

    title = "Il Post"
    language = "it"
    description = (
        'Puoi decidere quali sezioni scaricare modificando la ricetta.'
        ' Di default le immagini sono convertite in scala di grigio per risparmiare spazio,'
        ' la ricetta puo\' essere configurata per tenerle a colori'
    )
    tags = "news"
    masthead_url = 'https://www.ilpost.it/error/images/ilpost.svg'
    ignore_duplicate_articles = {"title", "url"}
    no_stylesheets = True
    extra_css = ' .wp-caption-text { font-size:small; } '
    keep_only_tags = [dict(name='main', attrs={'id':lambda x: x and x.startswith('index_main-content__')})]
    remove_tags_before = [dict(name='article')]
    remove_tags_after = [dict(name='article')]
    remove_tags = [
        dict(attrs={'class':lambda x: x and x.startswith(
            ('index_actions__', 'index_il-post-comments___', 'index_art_tag__')
        )}),
        dict(attrs={'id':'audioPlayerArticle'})
    ]

    def parse_page(self, name, url):
        self.log.debug(url)
        soup = self.index_to_soup(url)
        entries = []
        for article in soup.findAll('article'):
            for link in article.findAll('a', href=True):
                if not any(x in link['href'] for x in dates):
                    continue
                title = self.tag_to_string(link.h2)
                desc = self.tag_to_string(link.p)
                if not title:
                    continue
                self.log('\t', title)
                entries.append({
                    "url": link["href"],
                    "title": title,
                    "description": desc
                })
        return (name, entries)

    def parse_index(self):
        feeds = []
        for section in sections:
            feeds.append(self.parse_page(section[0], section[1]))
        return feeds
PK�X�y�Giliteratura_cz.png�PNG


IHDR  D����PLTE���$M�   ```000Zy����������3f������������������ّ�����Mo����h��������������___�My���[z�������Ln����v���r����f����?c�?c�2X�1W����?o�:��tRNS@��fIDATxڭ��r� P_��޶����?0�Y�]�/9��c!�!��[]%����2��9�~]���z�+v�:�#&�]�����8K�)��??���	zm���)��GɁT=jsz+M�Эl�1�z�����8�8����F�/ܵ��<Ԁ�C�Y�:�Y���Ƥ�����p�GY���0T����V.0��sݏZ�{ɲ�k{��:���-�g
�_�bd|��Imm[�q3A�$��r����:���"��
<M|�x�
�*C\��?���1�IEND�B`�PK�X��Xiliteratura_cz.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class SmeRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'Abelturd'
    language = 'cs'
    version = 1

    title = u'iLiteratura.cz'
    publisher = u''
    category = u'News, Newspaper'
    description = u'O LITERATU\u0158E V CEL\xc9M SV\u011aT\u011a A DOMA'
    cover_url = 'http://www.iliteratura.cz/1_vzhled/1/iliteratura.gif'

    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False
    remove_empty_feeds = True

    no_stylesheets = True
    remove_javascript = True

    feeds = []
    feeds.append((u'\u010cl\xe1nky', u'http://www.iliteratura.cz/rss.asp'))

    keep_only_tags = []

    remove_tags = [dict(name='table'), dict(name='h3')]

    preprocess_regexps = [
        (re.compile(r'<h3>Souvisej.*</body>', re.DOTALL | re.IGNORECASE),
         lambda match: ''),
    ]

    def print_version(self, url):
        m = re.search('(?<=ID=)[0-9]*', url)

        return u'http://www.iliteratura.cz/clanek.asp?polozkaID=' + str(m.group(0)) + '&c=tisk'

    extra_css = '''
                  h1 {font-size:140%;font-family:georgia,serif; font-weight:bold}
                  h3 {font-size:115%;font-family:georgia,serif; font-weight:bold}
                '''
PK�X�
u�ilmanifesto.png�PNG


IHDR  D���:PLTE===>>>???@@@AAAABBBBBCCCDDDFFFGGGHHHIIIJJJKKKLLLLMMMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVXYYYYYZZZ[[[```ccceeefffhhhiiikkkmmmnnntttvuuvvvwuuwvvwwwxxxywwzyyzzz{zz{{{}}}~~~�~~����������������������������������������������������������������������������������������������������������������������������SS�TS�UT�������\Z�������lk�mk�nl�lj�lk�rp������������̂����������������ջ����ֻ�ּ�ּ����׾����ؾ����٢�پ����������������ޯ���������������������������������������������������������������������������������������������������������������������������������������������<����IDAT8�Ց�nA��3;{��8�B$� T�"%^!�~K���@
,Q��86�^���31)Т��H�W�9�ߧ��hꪪ�-�VA7ƦE-�f������<��"}3)Օ{+�oG����_4���(J��h0�	?,z��錪'1x}�?Or�7_�T���t��ubY��^_:��c���>�K�cn>;�'5������X� ���Q�t=lv�ܹ&k�yL%���P	\�=��^� �� r��:ܟE��h��^H�m(h�r�I�g��5�2K��=�oO^
�<_�:�z}�nb�r��M{�c}ע��d߱���r�������\�n�Y�:�
L�}+��l��-�h���;�Ft�<�^�ǩP��=5)I�
Q��	�o�La��IEND�B`�PK�Xw�R��ilmanifesto.recipefrom calibre import strftime
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup

MANIFESTO_BASEURL = 'http://www.ilmanifesto.it/'


class IlManifesto(BasicNewsRecipe):
    title = 'Il Manifesto'
    __author__ = 'Giacomo Lacava'
    description = 'quotidiano comunista - ultima edizione html disponibile'
    publication_type = 'newspaper'
    publisher = 'il manifesto coop. editrice a r.l.'
    language = 'it'

    oldest_article = 2
    max_articles_per_feed = 100
    delay = 1
    no_stylesheets = True
    simultaneous_downloads = 5
    timeout = 30
    auto_cleanup = True
    remove_tags = [dict(name='div', attrs={'class': 'column_1 float_left'})]
    remove_tags_before = dict(
        name='div', attrs={'class': 'column_2 float_right'})
    remove_tags_after = dict(id='myPrintArea')

    manifesto_index = None
    manifesto_datestr = None

    def _set_manifesto_index(self):
        if self.manifesto_index is None:
            startUrl = MANIFESTO_BASEURL + 'area-abbonati/in-edicola/'
            startSoup = self.index_to_soup(startUrl)
            lastEdition = startSoup.findAll('div', id='accordion_inedicola')[
                1].find('a')['href']
            del(startSoup)
            self.manifesto_index = MANIFESTO_BASEURL + lastEdition
            urlsplit = lastEdition.split('/')
            self.manifesto_datestr = urlsplit[-1]
            if urlsplit[-1] == '':
                self.manifesto_datestr = urlsplit[-2]

    def get_cover_url(self):
        self._set_manifesto_index()
        url = MANIFESTO_BASEURL + \
            'fileadmin/archivi/in_edicola/%sprimapagina.gif' % self.manifesto_datestr
        return url

    def parse_index(self):
        self._set_manifesto_index()
        soup = self.index_to_soup(self.manifesto_index)
        feedLinks = soup.find('div', id='accordion_inedicola').findAll('a')
        result = []
        for feed in feedLinks:
            articles = []
            feedName = feed.find('h2').string
            feedUrl = MANIFESTO_BASEURL + feed['href']
            feedSoup = self.index_to_soup(feedUrl)
            indexRoot = feedSoup.find('div', attrs={'class': 'column1'})
            for div in indexRoot.findAll('div', attrs={'class': 'strumenti1_inedicola'}):
                artLink = div.find('a')
                if artLink is None:
                    continue  # empty div
                title = artLink.string
                url = MANIFESTO_BASEURL + artLink['href']

                description = ''
                descNode = div.find('div', attrs={'class': 'text_12'})
                if descNode is not None:
                    description = descNode.string

                author = ''
                authNode = div.find('div', attrs={'class': 'firma'})
                if authNode is not None:
                    author = authNode.string

                articleText = ''
                article = {
                    'title': title,
                    'url': url,
                    'date': strftime('%d %B %Y'),
                    'description': description,
                    'content': articleText,
                    'author': author
                }
                articles.append(article)
            result.append((feedName, articles))
        return result

    def extract_readable_article(self, html, url):

        bs = BeautifulSoup(html)
        col1 = bs.find('div', attrs={'class': 'column1'})

        content = col1.find('div', attrs={'class': 'bodytext'})
        title = bs.find(id='titolo_articolo').string
        author = col1.find('span', attrs={'class': 'firma'})
        subtitle = ''
        subNode = col1.findPrevious('div', attrs={'class': 'occhiello_rosso'})
        if subNode is not None:
            subtitle = subNode
        summary = ''
        sommNode = bs.find('div', attrs={'class': 'sommario'})
        if sommNode is not None:
            summary = sommNode

        template = "<html><head><title>%(title)s</title></head><body><h1>%(title)s</h1><h2>%(subtitle)s</h2><h3>%(author)s</h3><div style='font-size: x-large;'>%(summary)s</div><div>%(content)s</div></body></html>"  # noqa
        del(bs)
        return template % dict(title=title, subtitle=subtitle, author=author, summary=summary, content=content)
PK�XP��gPPilsole24ore.png�PNG


IHDR  szz�IDATx���M�_l�6϶m#�m۶��mŶ����f���V��s��j�����A��t���IB?U�~>�����X��u[��-?����iMK�[�M�����]�y;��w�R�FUIk{7�)�Y�aSk���:8���
�(�/�lP�v��-z�]�y'{����{t��#?0�Mz�\'���4y����C#٠���ct>����
'��MA;���j�S����ū�����	�������a��j8I����b�<�#�M��8|"Лz�;w-��ZV�=�tY�B�OØ�q�>G�$\��R��`. �%�X��-������0��2|�D������>rƛ�\�]��N�l���l@X4K��<���^LI%B�j�צ���E������� W���B gN���N�Ķ�D8qV����K��ؤۀ�K�o�?��`��c�Qh�EL�֝ں��݇OqiX/��6v������Q�Y���bf7l<�m��ѻ�d��,\ͺ�Y�.��:������\��]嵂p���j�{���h��[��
����)�/]�Ԏ�s�EX�Q��}��Y�����:ʨg��D�BG[��7psŽ��:�m�4z���\�����߱�	��f-=GcgLxlC��P�q�$ZM�h���Iw%]2������5Lo�W��u��d�.]-�@T�E���'(P��{*�yY�N{��\�F���¢lҷ���Sy�����4f����a�^���M���r��Gp]�� 	G\`S,�pa��g�#��!�%z2��0#��m$-8}>܂���lb�׆��x�~���<x̩��1�z��#i+66p�|��B���]�Лs���۳f�nF��aA�������]�>{��Ì��yQh�
Rew<�S��CJ�]�L�L]��d�<�0���X����PP5v�e>k��}R
z��ya�ú��)���E�u8"X�A���TX�D�U��!�O>r�.+'�e���\S`{�XQ�[J���_��*�%oA%A���O9h6��
0��ʼz�(g������
_XX���
{�}�B�JãmGN��G�q!���
:#��sԵu�]�~-��M]��;k�`)|��3�<����g�I�t'oAM�<���]���xne�C��	)�]T�0x���*��))fR�+�Wh?D��$11�W$H�3$ѫ��
���u���{rjz������i�!�IEND�B`�PK�XX��j��ilsole24ore.recipe__author__ = 'Marco Saraceno'
__copyright__ = '2010, Marco Saraceno <marcosaraceno at gmail.com>'
description = 'Italian daily newspaper - v 1.1 (Mar14,2011)'

'''
http://www.ilsole24ore.com
'''

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 IlSole24Ore(BasicNewsRecipe):
    __author__ = 'Marco Saraceno'
    description = 'Italian financial daily newspaper'

    cover_url = 'http://www.shopping24.ilsole24ore.com/ProductRelated/rds/img/logo_sole.gif'
    title = u'Il Sole 24 Ore'
    publisher = 'Gruppo editoriale GRUPPO 24ORE'
    category = 'News, politics, culture, economy, financial, Italian'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    extra_css = '.headline {font-size: x-large;} \n .fact { padding-top: 10pt  }'
    no_stylesheets = True

    keep_only_tags = [
        classes('ahead atext')
    ]
    remove_tags = [
        classes('ahead-ltool')
    ]

    def get_article_url(self, article):
        link = article.get('link', None)
        if link is None:
            return article
        if link.split('/')[-1] == "story01.htm":
            link = link.split('/')[-2]
            a = ['0B', '0C', '0D', '0E', '0F', '0G', '0N', '0L0S', '0A']
            b = ['.', '/', '?', '-', '=', '&', '.com', 'www.', '0']
            for i in range(0, len(a)):
                link = link.replace(a[i], b[i])
            link = "http://" + link
        return link

    feeds          = [
        ('Italia', 'https://www.ilsole24ore.com/rss/italia.xml'),
        ('Mondo', 'https://www.ilsole24ore.com/rss/mondo.xml'),
        ('Economia', 'https://www.ilsole24ore.com/rss/economia.xml'),
        ('Finanzia', 'https://www.ilsole24ore.com/rss/finanza.xml'),
        ('Commenti', 'https://www.ilsole24ore.com/rss/commenti.xml'),
        ('Risparmio', 'https://www.ilsole24ore.com/rss/risparmio.xml'),
        ('Norme e Tributi', 'https://www.ilsole24ore.com/rss/norme-e-tributi.xml'),
        ('Management', 'https://www.ilsole24ore.com/rss/management.xml'),
        ('Cultura', 'https://www.ilsole24ore.com/rss/cultura.xml'),
        ('Tecnologia', 'https://www.ilsole24ore.com/rss/tecnologia.xml'),
        ('Food', 'https://www.ilsole24ore.com/rss/food.xml'),
        ('Moda', 'https://www.ilsole24ore.com/rss/moda.xml'),
        ('Motori', 'https://www.ilsole24ore.com/rss/motori.xml'),
        ('Casa', 'https://www.ilsole24ore.com/rss/casa.xml'),
        ('Viaggi', 'https://www.ilsole24ore.com/rss/viaggi.xml'),
        ('Salute', 'https://www.ilsole24ore.com/rss/salute.xml'),
        ('Arteconomy', 'https://www.ilsole24ore.com/rss/arteconomy.xml'),
        ('Sport', 'https://www.ilsole24ore.com/rss/sport24.xml'),
    ]

    def print_version(self, url):
        return url.replace('.shtml', '_PRN.shtml')
PK�X�&���imperatortravel.png�PNG


IHDR�a�IDATx�1H�a���}.������"�!��0� i0(����8p�nhK�j�%Z�� � ��hi)�p���;���+.1��>�+c�Gg�X��qXb�MZ��i�Ĉ��]ވ����MW���᫊~�d#��X���i�LW�~��Y��ORhK��-�.���H�Q%���۝��vɐ�Y$W�2+�_�NAIu�&�<��HIh�P[��-�n�^e�iU�_9&�m64��1��{s&���v����80CGR@L �S�*�Sr�I���,�"nm���$��-��5�SS�'�
D�@�f���3�=p��1&�(�Z&2��J�#1�kP�#��I����՘*4�
���H�@THZ���ѣ15��\Nc�W
8��p��'s�[hTJ�
���s�b넥ԏ�#�E�+?l���r�IEND�B`�PK�X�=�

imperatortravel.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
imperatortravel.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Imperatortravel(BasicNewsRecipe):
    title = u'Imperator Travel'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'C\u0103l\u0103torii'
    publisher = u'Imperator Travel'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Turism,Calatorii'
    encoding = 'utf-8'
    cover_url = 'http://www.imperatortravel.ro/images/header-1.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'class': 'article first_main_article'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['meta']}), dict(name='body', attrs={'class': ['transparent_widget ff3 win  Locale_en_US']}), dict(
            name='div', attrs={'class': ['connect_widget']}), dict(name='ul', attrs={'class': ['similar-posts']})
    ]

    remove_tags_after = [
        dict(name='ul', attrs={'class': ['similar-posts']})
    ]

    feeds = [
        (u'Feeds', u'http://feeds.feedburner.com/ImperatorTravels')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X��k&&impulse_de.png�PNG


IHDR  szz��IDATx���\aEߟ�mŵm�am۶m;�m�
�m{�Փ���\�}�ׇ~�������60��3~�a}��|�/p�BxaH�9R@DQ��!��٫�t̗�r[g#o7�s�x\b�#ߧ%��e�#T5O��^����ȓ�;��U�zR����pX���f@RG@t5�,%wi��'�����U�����] k�h��bjB\P��(񭤦����;�*$���M��j��gD��e��B��h�kR�WAӧhL�V c�� �#�l�Y�zR|g�+������P�M�-цK��LD�@L���ѐ&�QU�.���SB�
�\�,�7$����u����[W{�	��Vs�F��K!���և������&4�t�I�FpD�6
��TϘ�U�Ȝ��E6���l��S����}@�ك s�ć�.fXC����/�i�X�v,
�$�~�_�(��� <8��Q�:`��u54oW����IEND�B`�PK�X6��#��impulse_de.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1305470859(BasicNewsRecipe):
    title = u'Impulse.de'
    language = 'de'
    __author__ = 'schuster'
    oldest_article = 14
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    cover_url = 'http://www.bvk.de/files/image/bilder/Logo%20Impulse.jpg'

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h4{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    img {min-width:300px; max-width:600px; min-height:300px; max-height:800px}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''

    def print_version(self, url):
        return url.replace('#utm_source=rss2&utm_medium=rss_feed&utm_campaign=/', '?mode=print')
    remove_tags_bevor = [dict(name='h1', attrs={'class': 'h2'})]
    remove_tags_after = [dict(name='div', attrs={'class': 'artikelfuss'})]

    feeds = [(u'impulstest', u'http://www.impulse.de/rss/')]

    remove_tags = [dict(attrs={'class': ['navSeitenAlle', 'kommentieren', 'teaserheader', 'teasercontent', 'info', 'zwischenhead', 'kasten_artikel']}),
                   dict(id=['metaNav', 'impKopf', 'impTopNav', 'impSubNav', 'footerRahmen',
                            'gatrixx_marktinformationen', 'pager', 'weitere', 'socialmedia', 'rating_open']),
                   dict(span=['ratingtext', 'Gesamtranking', 'h3', '']),
                   dict(rel=['canonical'])]
PK�X(��gjj
in4_pl.png�PNG


IHDR��h61IDATx�]�[OQ�F���`�* w`A(�.,�,�ҥ� !�5m���M(�1|ľ[*44�<�!`2�='�9sf8O����/�f�4��I�
�D�ʅ�^��$��������A���P(2�ێ;�`(�w$ˆk�?����@a3��\�%���Aց��]�T�����
d ~@}{[�K�߽=�HZ)�	�s���dA���ɧ^��4���N���R�����
�L�Py��F�1��P�2!��D
��	_�T%A%���E����a<�pD��`��G����/p��+��m'[D.�Wɔ\%W�������^�?`IRɴ^�K��`(��D���fë�ĝ����\���v���R���� C3�r����o���\��
��P[��o�9==���vc�x�
e��2����#�\i1���R
ϸt:�b��jUƶ�z۠E:�N�=�x�[,z��qwW��//���Zl~�����l���71�S*�>�?��?pQ�5;|��~t;��b|����t�ER����j�
IEND�B`�PK�X��Jii
in4_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re
from calibre.ebooks.BeautifulSoup import Comment


class in4(BasicNewsRecipe):
    title = u'IN4.pl'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = 'fenuks'
    description = u'Serwis Informacyjny - Aktualnosci, recenzje'
    category = 'IT'
    language = 'pl'
    index = 'http://www.in4.pl/'
    no_stylesheets = True
    remove_empty_feeds = True
    preprocess_regexps = [
        (re.compile(u'<a title="translate into.*?</a>', re.DOTALL), lambda match: '')]
    keep_only_tags = [dict(name='div', attrs={'class': 'left_alone'})]
    remove_tags_after = dict(name='img', attrs={'title': 'komentarze'})
    remove_tags = [dict(name='img', attrs={'title': 'komentarze'})]
    feeds = [(u'Wiadomo\u015bci', u'http://www.in4.pl/rss.php'), (u'Recenzje',
                                                                  u'http://www.in4.pl/rss_recenzje.php'), (u'Mini recenzje', u'http://www.in4.pl/rss_mini.php')]

    def append_page(self, soup, appendtag):
        a = soup.findAll('a')
        nexturl = None
        for i in a:
            if i.string and 'następna str' in i.string:
                nexturl = 'http://www.in4.pl/' + i['href']
                i.extract()
        while nexturl:
            soup2 = self.index_to_soup(nexturl)
            pagetext = soup2.find(id='news')
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()
            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
            nexturl = None
            tag = soup2.findAll('a')
            for z in tag:
                if z.string and u'następna str' in z.string:
                    nexturl = 'http://www.in4.pl/' + z['href']
                    break

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        for a in soup.findAll('a', href=True):
            if 'http://' not in a['href'] and 'https://' not in a['href']:
                a['href'] = self.index + a['href']
        return soup
PK�XO�����	in_gr.png�PNG


IHDR�a�IDATx�͓��\Q������j?Bԍj۶m۶�k{���k�j���NB~gw0�{O)��_a��	0,A(����v�l�UT��K���:���}Y��KU<����P��I<���(��<z��3�e�m�o���۔��;v	ۺ�l>}��6ݷ#+*��QG^P\�e��3Wni"s��w��0��t�d2����Խ&dX�A+O�Od��)�x��"���a`Y.��7n���.^������4�ij&ϒ0~�Y�a��sw7��a䚳(�NCm-o߾����W�^��f&^/!�̱����'����m>Є\�������/ ����Çܼy�w��QZZ�,ੳ�����dz���nP�R8稢��M��z�8�޽�$I���^�^}d�C�R�Kܩq��o8��h4�������?V����+D�IEND�B`�PK�X��3��in_gr.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class ingr(BasicNewsRecipe):
    title = 'in.gr'
    __author__ = 'Stelios'
    description = 'News from Greece'
#    max_articles_per_feed  = 100
    oldest_article = 4
    publisher = 'in.gr'
    category = 'news, GR'
    language = 'el'
    encoding = 'utf8'
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    encoding = 'utf8'
    keep_only_tags = [
        dict(name='h1'),

        dict(name='div', attrs={'id': ['in-news-article']})
    ]
    remove_tags = [
        dict(name='em', attrs={'class': ['credits']}),
        dict(name='div', attrs={'class': ['article-tools-hor', 'promo-banners gAds', 'main', 'article-listen-player',
                                          'article-tools-hor-bttm', 'tools-sec', 'article-tools', 'article-listen-player-ver']})
    ]

    feeds = [
        (u'\u0395\u03BB\u03BB\u03AC\u03B4\u03B1',
         'http://rss.in.gr/feed/news/greece'),
        (u'\u0395\u03B9\u03B4\u03AE\u03C3\u03B5\u03B9\u03C2',
         'http://rss.in.gr/feed/news'),
        (u'\u039A\u03CC\u03C3\u03BC\u03BF\u03C2',
         'http://rss.in.gr/feed/news/world'),
        (u'\u0395\u03C0\u03B9\u03C3\u03C4\u03AE\u03BC\u03B7',
         'http://rss.in.gr/feed/news/science'),
        (u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2',
         'http://rss.in.gr/feed/news/culture')
    ]
PK�XT����inc.png�PNG


IHDR  �Tg�-PLTE��(>tRNS&(*,���������;IDAT(�c``뀃D�yi' >s.�{sf!pA00�
00�xC���1^P�������hIEND�B`�PK�X�a��
�

inc.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2014, Nikolas Mangold-Takao <nmangold at gmail.com>'
__version__ = '0.10'

from calibre.web.feeds.recipes import BasicNewsRecipe


class IncMagazineRecipe(BasicNewsRecipe):
    language = 'en'
    version = 1

    __author__ = 'Nikolas Mangold-Takao <nmangold at gmail.com>'

    title = u'Inc Magazine'
    publisher = u'Mansueto Ventures LLC'
    category = u'News, Business'
    description = u'Free account required to browse website. Handbook of the American Entrepeneur'

    # signup is free, without account browsing is limited and recipe won't work
    needs_subscription = True

    use_embedded_content = False
    remove_empty_feeds = True

    no_stylesheets = True
    remove_javascript = True

    INDEX = 'http://www.inc.com/magazine'

    remove_tags_before = dict(name='div', attrs={'id': 'outercontainer'})
    remove_tags = [dict(name='div', attrs={'id': 'morearticles'})]
    remove_tags_after = dict(name='div', attrs={'id': 'article-share-footer'})

    extra_css = '''
                div.byline {font-size: x-small; color: #696969; margin-top: 0.4em;}
                '''

    def get_browser(self):
        def has_login_name(form):
            try:
                form.find_control(name="email")
            except:
                return False
            else:
                return True

        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('http://www.inc.com/login')
            br.select_form(predicate=has_login_name)
            br['email'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def parse_index(self):
        soup = self.index_to_soup(self.INDEX)

        feeds = []
        articles = []

        # We need for sure 'toc-top-l-column' and 'toc-bot-l-column'
        # I am not sure about 'toc-top-r-column and 'toc-bot-r-column', seems
        # to be mostly ads
        for toc in soup.findAll('div', id=lambda x: x and x.endswith('-l-column')):
            # h1-h2-h3
            for article in toc.findAll('div', {'class': lambda x: x and x.startswith('toc-h')}):
                link = article.find('a')
                if link is None:
                    continue
                article_title = self.tag_to_string(link)
                article_link = link.get('href')
                articles.append({'title': article_title, 'url': article_link})
        feeds.append(('Articles', articles))  # TODO figure out sections
        return feeds

    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
PK�X�1@��	inc42.png�PNG


IHDR  szz��IDATX��Oh\u�?�ۗMM�lS�[S[�]Z=��zP��`A�A�)R,bEO-� hA<X�hQ�io�nJ�.�EӦ[M��4���v�o<�&}y�m��x�7of��f����`U��"�.G�b1�}�U(�%�WK���g��:͂uH |
�k��¸�z< 2
��94L`.��~	x8�.�Xh�Zu�F�
���k!Ό›�T��	�&�����6Oo/��<�V�UN��+�3��nGd'�M���k�<Sh���h�8���
o	�<���P*�����P`��j3o�*��������\�ׁg���7~{��{ᖡ��txC��~S�$���TJ�(��G�2��d�<
t�(lتnhȁ�h,$&?�Q>��N`����uf�)�KxG��,�*�Y��}I�X_zB��X���ѡ{�U�[g���d�G���:������X?�衾���tD�*t���Y�—yW�&�q�F��
�^'�ӛ�oM�ro��Sy�>7�E�䙛W"O���8l4�#���|Z�h_:a�bǸ
I�1�[ ݓ��Q��.�	�e �L�][L�m"m�)��sw��y�EO��T\�����6�Y�T[����В��+�ҵ����J�E�����q��\o*�އE�^�9l�bG�v�/xTI
u���We�wH'f����`�z`��k�#�#�c1�f�~Fj-��x����+�v<
n{Ym��
�Y8�6�xZx�ʆ��h�9(y�P��� 7j�n��Ek�ٿ|t7]�;.�+ߵB�l4���O�ɉB�3�$\	�vX��]4�W���Ǫ뼩�&�*����
���lqDJ�e�m������ͪ�D��m>�\v�mIEND�B`�PK�X�� y��inc42.recipefrom calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe, classes

class inc42(BasicNewsRecipe):
    title = 'Inc42'
    __author__ = 'unkn0wn'
    description = 'Inc42 is India’s largest tech media platform working with the mission to accelerate the GDP of India’s tech & startup economy.'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en_IN'
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://omcdn.inc42.com/users/d0ffd8ffa0d2/images/4477fc48bee71659696918-color-black-1-e1576150264134.png?width=224'
    
    keep_only_tags = [
        classes('entry-header entry-content'),
    ]
    
    remove_tags = [
        dict(name='button'),
        classes('also-read slick-list slides-three common-card'),
    ]
        
    ignore_duplicate_articles = {'title'}
    remove_empty_feeds = True    

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = []

    sections = [
        'features', 'buzz', 'startups', 'resources'
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:inc42.com{}&hl=en-IN&gl=IN&ceid=IN:en'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    feeds.append(('Others', a.format('')))
    
    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        return soup
PK�X�÷���independent.png�PNG


IHDR:����IDATx����0@ч�"aEB
���0� �A��d/~�=_�<�Ysw��z/<�>���x�Ym�U���$�5�^Յ�UU/����%�;��������s����wT5��Y�1��Z;�S�����1�1K2ѥIEND�B`�PK�X3Y���independent.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre import random_user_agent
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class TheIndependentNew(BasicNewsRecipe):

    title = u'The Independent'
    __author__ = 'Krittika Goyal'
    description             = 'The latest in UK News and World News from The \
                               Independent. Wide range of international and local news, sports \
                               news, commentary and opinion pieces.Independent News - Breaking news \
                               that matters. Your daily comprehensive news source - The \
                               Independent Newspaper'
    publisher = 'The Independent'
    oldest_article = 2.0
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    category = 'news, UK'
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    language = 'en_GB'
    publication_type = 'newspaper'
    encoding = 'utf-8'
    compress_news_images = True

    keep_only_tags = [
        dict(id=['articleHeader', 'main']),
        classes('headline sub-headline breadcrumb author publish-date hero-image body-content'),
    ]
    remove_tags = [
        classes('inline-related inline-readmore ad-wrapper icon-gallery i-gallery article-im-prompt apester-media'
                ' social-share i-amphtml-replaced-content gallery-btn related'),
        dict(name='amp-live-list'),
    ]
    remove_attributes = ['style']

    def get_browser(self, *a, **kw):
        # This site returns images in JPEG-XR format if the user agent is IE
        if not hasattr(self, 'non_ie_ua'):
            try:
                self.non_ie_ua = random_user_agent(allow_ie=False)
            except TypeError:
                self.non_ie_ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.111 Safari/537.36'
        kw['user_agent'] = self.non_ie_ua
        br = BasicNewsRecipe.get_browser(self, *a, **kw)
        return br

    def preprocess_html(self, soup):
        for img in soup.findAll('amp-img'):
            img.name = 'img'
            img['srcset'] = ''

        for div in soup.findAll(attrs={'class': 'full-gallery'}):
            imgs = {}
            for li in div.findAll('li', attrs={'data-gallery-item': True, 'data-original': True}):
                imgs[li['data-gallery-item']] = li['data-original']
                li.extract()
            for li in div.findAll('li', attrs={'data-gallery-legend': True}):
                src = imgs.get(li['data-gallery-legend'])
                if src is not None:
                    img = new_tag(soup, 'img')
                    img['src'] = src
                    img['style'] = 'display:block'
                    li.append(img)
        return soup

    feeds = [
        (u'News - UK',
         u'http://www.independent.co.uk/news/uk/rss'),
        (u'News - World',
         u'http://www.independent.co.uk/news/world/rss'),
        (u'News - Business',
         u'http://www.independent.co.uk/news/business/rss'),
        (u'News - People',
         u'http://www.independent.co.uk/news/people/rss'),
        (u'News - Science',
         u'http://www.independent.co.uk/news/science/rss'),
        (u'News - Media',
         u'http://www.independent.co.uk/news/media/rss'),
        (u'News - Education',
         u'http://www.independent.co.uk/news/education/rss'),
        (u'News - Obituaries',
         u'http://www.independent.co.uk/news/obituaries/rss'),
        (u'News - Corrections',
         u'http://www.independent.co.uk/news/corrections/rss'
         ),
        (u'Voices',
         u'http://www.independent.co.uk/voices/rss'
         ),
        (u'Environment',
         u'http://www.independent.co.uk/environment/rss'),
        (u'Sport - Athletics',
         u'http://www.independent.co.uk/sport/general/athletics/rss'
         ),
        (u'Sport - Cricket',
         u'http://www.independent.co.uk/sport/cricket/rss'),
        (u'Sport - Football',
         u'http://www.independent.co.uk/sport/football/rss'),
        (u'Sport - Golf',
         u'http://www.independent.co.uk/sport/golf/rss'),
        (u'Sport - Motor racing',
         u'http://www.independent.co.uk/sport/motor-racing/rss'
         ),
        (u'Sport - Olympics',
         u'http://www.independent.co.uk/sport/olympics/rss'),
        (u'Sport - Racing',
         u'http://www.independent.co.uk/sport/racing/rss'),
        (u'Sport - Rugby League',
         u'http://www.independent.co.uk/sport/general/rugby-league/rss'),
        (u'Sport - Rugby Union',
         u'http://www.independent.co.uk/sport/rugby/rugby-union/rss'
         ),
        (u'Sport - Sailing',
         u'http://www.independent.co.uk/sport/general/sailing/rss'
         ),
        (u'Sport - Tennis',
         u'http://www.independent.co.uk/sport/tennis/rss'),
        (u'Sport - Others',
         u'http://www.independent.co.uk/sport/general/others/rss'
         ),
        (u'Life & Style - Fashion',
         u'http://www.independent.co.uk/life-style/fashion/rss'
         ),
        (u'Life & Style -Food & Drink',
         u'http://www.independent.co.uk/life-style/food-and-drink/rss'
         ),
        (u'Life & Style - Health and Families',
         u'http://www.independent.co.uk/life-style/health-and-families/rss'
         ),
        (u'Life & Style - History',
         u'http://www.independent.co.uk/life-style/history/rss'
         ),
        (u'Life & Style - Gadgets & Tech',
         u'http://www.independent.co.uk/life-style/gadgets-and-tech/rss'
         ),
        (u'Life & Style - Motoring',
         u'http://www.independent.co.uk/life-style/motoring/rss'
         ),
        (u'Arts & Ents - Art',
         u'http://www.independent.co.uk/arts-entertainment/art/rss'
         ),
        (u'Arts & Ents - Architecture',
         u'http://www.independent.co.uk/arts-entertainment/architecture/rss'
         ),
        (u'Arts & Ents - Music',
         u'http://www.independent.co.uk/arts-entertainment/music/rss'
         ),
        (u'Arts & Ents - Classical',
         u'http://www.independent.co.uk/arts-entertainment/classical/rss'
         ),
        (u'Arts & Ents - Films',
         u'http://www.independent.co.uk/arts-entertainment/films/rss'
         ),
        (u'Arts & Ents - TV',
         u'http://www.independent.co.uk/arts-entertainment/tv/rss'
         ),
        (u'Arts & Ents - Theatre and Dance',
         u'http://www.independent.co.uk/arts-entertainment/theatre-dance/rss'
         ),
        (u'Arts & Ents - Comedy',
         u'http://www.independent.co.uk/arts-entertainment/comedy/rss'
         ),
        (u'Arts & Ents - Books',
         u'http://www.independent.co.uk/arts-entertainment/books/rss'
         ),
        (u'Travel', u'http://www.independent.co.uk/travel/rss'
         ),
        (u'Money', u'http://www.independent.co.uk/money/rss'),
        (u'IndyBest',
         u'http://www.independent.co.uk/extras/indybest/rss'),
    ]
PK�X}'��independent_australia.png�PNG


IHDR  D���4PLTE">���u��
$@3L3M1D\#?������%@#>)E#8Q\k~���&B&AM^rcr�+Fn{����/IIZo|�����(<U/BZ)D0J������Rbv"6P���,@X~�� 5O.H-AY���������$9R���������+?W-Hq�s��$8Rw��y��z��{��{��<Nd<Oe���>Pf?QgCTj���������������CUj���DUkDVkEVlFWmGXm������GYnHYn���'B'B%:SN_s������������������������)D���^n�������������_n�;MdTdxp}�p~�4M1K]l���Sdw1E\3G^5H_������$@et�3M��ŏ��o}����Uey���������%9RVfy���!6O��ż�����*>W���Wgz;Nd+?XI[o6I``o�������9LbO_t'<T0J���(C(D1K2LXg{Zi|Zj}[j}���������������������[k~%A.AY%A/C[
$?`o�ap�cq�*E4Miw�jw����������������jx�ky�*E">���,G
0��IDATx^��C�,A��j�ڶm�Ƶm۶m�����ΜS�S�y��Y�9+j{l��j'ȷ�֭�sw�c��s�rv����
�=;+�V��G)P�'��ͺl	(Zm��ң�+�d��Qy��2�QPSI���)X��\#������PC6�e�JF�$��0����A�jL/�T�Ǒ�K&�<� fQ�q�̺�<���(��15r �+f��Q;C&�/�c�)�@�,�V
J�ǜ�Qp��L�4Gc 
���2.��_����
M(��UJ�254�o����x�?��Hu�F�SX��[^�Xy��ƒ 9�/�U����r g2�}Z�r01ZK9�CAҰ��	78����U�`��[{B���}j�|�)�[�d��Ҥ���.�:+h��_�k���IEND�B`�PK�X@��?��independent_australia.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
#
from __future__ import unicode_literals, division, absolute_import, print_function

__license__ = 'GPL v3'
__copyright__ = '2020, Pat Stapleton <pat.stapleton at gmail.com>'
'''
Recipe for Independent Australia
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.web.feeds import Feed


class IndependentAustralia(BasicNewsRecipe):
    title = 'Independent Australia'
    language = 'en_AU'
    __author__ = 'Pat Stapleton'
    description = (
        'Independent Australia is a progressive journal focusing on politics, democracy, the environment, Australian history and Australian identity.'
        ' It contains news and opinion from Australia and around the world.')
    oldest_article = 7  # days
    max_articles_per_feed = 100

    feeds = [
        (
            'Independent Australia',
            'https://feeds.feedburner.com/IndependentAustralia'
        ),
    ]

    masthead_url = 'https://independentaustralia.net/t/2018/logo-2018-lg-h90.png'
    cover_url = 'https://independentaustralia.net/t/apple-touch-icon.png'
    #    cover_margins = (0,20,'#000000')
    scale_news_images_to_device = True
    oldest_article = 7  # days
    max_articles_per_feed = 100
    publication_type = 'newspaper'

    #    auto_cleanup   = True # enable this as a backup option if recipe stops working

    #    use_embedded_content = False # if set to true will assume that all the article content is within the feed (i.e. won't try to fetch more data)

    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = [
        dict(name='div', attrs={'class': "art-display"})
    ]  # the article content is contained in

    # ************************************
    # Clear out all the unwanted html tags:
    # ************************************
    remove_tags = [{
        'name': ['meta', 'link', 'noscript', 'script', 'footer']
    }, {
        'attrs': {
            'class': ['tagFooter', 'noshow', 'panelSubscription', 'mt-2']
        }
    }]

    # ************************************
    # Tidy up the output to look neat for reading
    # ************************************
    remove_attributes = ['width', 'height', 'style']
    extra_css = '.byline{font-size:smaller;margin-bottom:10px;}.inline-caption{display:block;font-size:smaller;text-decoration: none;}'
    compress_news_images = True

    feeds = [
        (
            'Independent Australia',
            'https://feeds.feedburner.com/IndependentAustralia'
        ),
    ]

    # ************************************
    # Break up feed into categories (based on BrianG's code snippet):
    # ************************************
    def parse_feeds(self):
        # Do the "official" parse_feeds first
        feeds = BasicNewsRecipe.parse_feeds(self)

        politicsArticles = []
        environmentArticles = []
        businessArticles = []
        lifeArticles = []
        australiaArticles = []
        # Loop thru the articles in all feeds to find articles with base categories in it
        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if curarticle.url.lower(
                ).find('independentaustralia.net/politics/') >= 0:
                    politicsArticles.append(curarticle)
                    delList.append(curarticle)
                elif curarticle.url.lower(
                ).find('independentaustralia.net/environment/') >= 0:
                    environmentArticles.append(curarticle)
                    delList.append(curarticle)
                elif curarticle.url.lower(
                ).find('independentaustralia.net/business/') >= 0:
                    businessArticles.append(curarticle)
                    delList.append(curarticle)
                elif curarticle.url.lower(
                ).find('independentaustralia.net/life/') >= 0:
                    lifeArticles.append(curarticle)
                    delList.append(curarticle)
                elif curarticle.url.lower(
                ).find('independentaustralia.net/australia/') >= 0:
                    australiaArticles.append(curarticle)
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []

        # If there are any of each base category found, create, append a new Feed object
        if len(politicsArticles) > 0:
            pfeed = Feed()
            pfeed.title = 'Politics'
            pfeed.image_url = None
            pfeed.oldest_article = 30
            pfeed.id_counter = len(politicsArticles)
            # Create a new Feed, add the articles, and append to "official" list of feeds
            pfeed.articles = politicsArticles[:]
            feeds.append(pfeed)
        if len(environmentArticles) > 0:
            pfeed = Feed()
            pfeed.title = 'Environment'
            pfeed.image_url = None
            pfeed.oldest_article = 30
            pfeed.id_counter = len(environmentArticles)
            # Create a new Feed, add the articles, and append to "official" list of feeds
            pfeed.articles = environmentArticles[:]
            feeds.append(pfeed)
        if len(businessArticles) > 0:
            pfeed = Feed()
            pfeed.title = 'Business'
            pfeed.image_url = None
            pfeed.oldest_article = 30
            pfeed.id_counter = len(businessArticles)
            # Create a new Feed, add the articles, and append to "official" list of feeds
            pfeed.articles = businessArticles[:]
            feeds.append(pfeed)
        if len(lifeArticles) > 0:
            pfeed = Feed()
            pfeed.title = 'Life'
            pfeed.image_url = None
            pfeed.oldest_article = 30
            pfeed.id_counter = len(lifeArticles)
            # Create a new Feed, add the articles, and append to "official" list of feeds
            pfeed.articles = lifeArticles[:]
            feeds.append(pfeed)
        if len(australiaArticles) > 0:
            pfeed = Feed()
            pfeed.title = 'Australia'
            pfeed.image_url = None
            pfeed.oldest_article = 30
            pfeed.id_counter = len(australiaArticles)
            # Create a new Feed, add the articles, and append to "official" list of feeds
            pfeed.articles = australiaArticles[:]
            feeds.append(pfeed)

        if len(feeds) > 1:  # cleanup empty first feed item
            if len(feeds[0]) == 0:
                del feeds[0]
        return feeds
PK�X��-qqindex_hu.png�PNG


IHDRb��	PLTE���x�~tRNS@��fIDAT[c`�(���J��`�׃IEND�B`�PK�X���22index_hu.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1348151548(BasicNewsRecipe):
    title = u'Index.hu'
    __author__ = 'laca'
    oldest_article = 2
    language = 'hu'
    masthead_url = 'http://index.hu/assets/images/index_logo.gif'
    auto_cleanup = True

    simultaneous_downloads = 1
    max_articles_per_feed = 50

    feeds = [(u'Belföld', u'http://index.hu/belfold/rss/'),
             (u'Külföld', u'http://index.hu/kulfold/rss/'),
             (u'Gazdaság', u'http://index.hu/gazdasag/rss/'),
             (u'Tech', u'http://index.hu/tech/rss/'),
             (u'Tudomány', u'http://index.hu/tudomany/rss/'),
             (u'Kultúr', u'http://index.hu/kultur/rss/'),
             (u'Sport Géza', u'http://sportgeza.hu/24ora/rss/'),
             (u'Vélemény', u'http://index.hu/velemeny/rss/'),
             (u'Velvet', u'http://velvet.hu/24ora/rss/'),
             (u'Totalcar', u'http://totalcar.hu/24ora/rss/'),
             (u'Dívány', u'http://divany.hu/24ora/rss/')]
PK�X�#`W��india_facts.png�PNG


IHDR  ��tRNSn��	pHYs���+�IDAT�A�A��^W�	�Dą �n�2^@/��;xw"�+At1��1IOj��&�fL���A�}\�
T� �8�	!L&��b4MӶ-�
O<�O��^�_2��[�_��P.��F��b��y����N�#��kx���f�o��ڮ;�Uij������0�Gͧۓ?�E���U({x�H_�Z�w�W�)�n��L����Jcm�j�e#�xʘ�ֺ�3�=�q+��i��lc�2O!�u���ꅔ�)d�_޻�&Y��8����;���)#f9��[U??y
$R"Fx�e�%m�@dK$�0�`��B
AA�����X�xi*�j<ڶeGU����ry�*���)q
8J4P�������˩���DLIEND�B`�PK�X���QCCindia_facts.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
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 IndiaFacts(BasicNewsRecipe):
    title          = 'IndiaFacts'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('India Facts main feed', 'https://www.indiafacts.org.in/feed/'),
    ]
PK�X�x���india_legal_magazine.png�PNG


IHDR  ��tRNSn��FIDAT�[���A�o����}�s&�L����M��v�P-HC� j��� �P�+�P�J��ЈE�
��R��b)�B���`L���4�q���s���k�k-�/|�}��X6y]ڸYo�]�vzr���K#�
IA!I���GeS�
	Y�PJW��5��V75�xt�h��g7Or�))���b�$�
n�~�ҋ\M	���HW�Ei�h��&G���\z��_���23M��H�θ��o�q���)�(�J���uK���??��+��ݥ|S>�A���w�s<��U�唎�( �F]�*�n������G�]<`�w7�=�Li��CJh���Bq%�|���P��X)�^|-n>q�����[��
�:�l3a` 2�H�2��_�/
�:�H��H���ѵvU��j�\ͻy��O}���;/nΖ���0I�I��=�����إJ͛��
��[?z�W~�;���0�c�H�nk���nm�?��>�Xjg'o]�\��>3��F��;�g?���t�sc�����ދ_{�`9?���/�R?Ktt��T��_/>�X��v���v�/]�_^�����4��ZC�e���x�O�~^�Z7��O����}�6,9��\f}B,������W�u5)���Bt�������FBDz{xp��.^x���l�W�����ْLb�g�4S�F����|�m�QMi�Ԝ7���݃��G�?x9Ĉ2�[���O�~bx���|~8�]C"ؐ���J\���M��z�J.�d:,��Zk!TM`���������@ ��'�?��^�.���@U�Y?��0�RZ)c�B8�~���3��H4�I�a�����qɽy�E��P$����͓��r~�Tk�{o�9���Y�9Șp�~ ��zqժ�hJS@��2��u�lqV[�߻Z	)�4����Vc���RH!�$��u@)��H�D"�-q#6��R��p�|7��Vk����@ ���J0�HA	�^�Tb��Ns��o��]W+�����}��w6K)u��$J.�"sv���ћ}lH-��Y���1�~���6��ch��r������ߚ�i4z�F^����D|q+�I�O%/���?����&�S�GG�|�c���f[Qk�no?��#'���v����M�g/=�d�����9?�-t�:~{{����ձ����{~��[�i�Zi���!���;�����[�1N�3�}9�*�mϕ�ب��ON�b��6��&[���J�i��X���Vk��ժ5��b�'3*_�D��O�����r������^���$�F�1v��mm�ݝc����m���}?KJ�c���[_ݎ/��/������B
Zk���lk�^ܜΟNa3�C)�Z[k-ƨ��5���SS�T�SJ$�G/�qz��~��_-�x��g�W)tTPȜA �Ɔ	y���A2��t�ז����ٽ)���ѹR~3�&5�Rj��I97.�=4
S�����c�%��t�O��o�N&���M~�ܹ����X�$�)H ��W�0�J��̾"�}� ��騟���V�M��e\�����:^��%:
��J)��4��:��A�V���d�aB)�޲N�1�%�M�Mg�	�����|s�u�7�C���F'M�)�LX�͗��nꏤ! R��1\�go��J�������Xk�̛�,�W�J�������k<�}�(J*����O�.�fץ���Ӿ�Q�N�\g��Q���k�X�$�%IP�T��

��RQH�7o����>�X�L�6"5��E�<�$��2EPH}�����!���IEND�B`�PK�X��<���india_legal_magazine.recipe#!/usr/bin/env  python

from calibre.web.feeds.news import BasicNewsRecipe, classes


class IndiaLegalLive(BasicNewsRecipe):
    title = 'India Legal Magazine'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    oldest_article = 7  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']

    masthead_url = 'https://d2r2ijn7njrktv.cloudfront.net/IL/uploads/2020/12/03181846/india-legal-live-logo-218x73-1.png'

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.indialegallive.com/')
        for citem in soup.findAll('img', src=lambda s: s and s.endswith('shot.jpg')):
            return citem['src']

    keep_only_tags = [
        dict(name='h1'),
        classes(
            'tdb_single_subtitle tdb_single_date tdb_single_featured_image tdb_single_content'
        ),
    ]
    remove_tags = [
        dict(name='div', attrs={'style':'position:absolute;top:0;left:-9999px;'}),
    ]

    feeds = [
        ('Courts', 'https://www.indialegallive.com/constitutional-law-news/courts-news/rss'),
        ('Ring Side', 'https://www.indialegallive.com/ringside/rss'),
        ('Cover Story Articles', 'https://www.indialegallive.com/cover-story-articles/rss'),
        ('Special', 'https://www.indialegallive.com/special/rss'),
        ('Columns', 'https://www.indialegallive.com/column-news/rss'),
    ]
PK�Xg��india_speaks_reddit.png�PNG


IHDR  szz��IDATxڭ��cY���-�Kc��ޱm۶m۶m۶m{&��~��W5����u�\���'��F�KY*��8=��Q�{�$�|�1̂s�D�*�8�L�lA'�/Ɠ��@�},�-<���"��L�^@.�쬄�����K���ܔ��d���w~��ia�p��چC�X�1?,
}�C�o"o�č\��2T8��=��ZX8�������xr��k����	�
z���
��Cn���s��-���.����(<�jo�s������.����f���SAkX
��ݵO!W�j�����G�[�#�fZ]�����w���-Cj��y��;K�~rJcwK�m-̦-�t*�{��qp�\9�����F����k�ؚ�N�mM�'��ՠe�Ʒ�ӻ�l��珌�0��1>4�T����1wO�j�,�Q3����)p~��x�֘�n���pz/v]�ԝ�ӫ�KG`o_���i�x�>~�6f��K���C��P;)l��tX=����C�bN/�	<�J�q�zKl������h��:޼�&Y���}{V`�g�o�%���9�`�[Tpy��V;�5��O0�����I�Oc�1� �v���aұ |x�%�]��{��k���cػ���Я��ƻ�h;��q�8!�kP;�]��F���Z0��Ѽf�|
s���-����o�Y=��=��0�+�ʮ��$����M���b�1����s�	�j�.�eؾ�H�l�u��Կ��A���g�{>����u=8�,3�^0�ac7,��d�| �c���n
���nF�ܺ�VLcg���8��:�=��|�T[�G��
E3��V��R
��������ֳ��
�׹0��
�*�]3O�NJ�/�����I���� �l��K6J�@oGq����tOzJ�P.�Yd�\��G�K2X2F�-9�4�Ir���	�H��[��IU��IEND�B`�PK�XM�__india_speaks_reddit.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
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 IndiaSpeaksReddit(BasicNewsRecipe):
    title          = 'IndiaSpeaksReddit'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('India Speaks Reddit main feed', 'https://www.reddit.com/r/IndiaSpeaks.rss'),
    ]

PK�X	��_��india_today.png�PNG


IHDR  ��tRNSn��	pHYs���+�IDATH���[HSa��nl�ns�snSw�
�"C#��A#���z	��	��ԃ�/�B�!>$D�[t3ug7S�0c�et��}#�n��>~Ogg����}S����Шq�ԈQ�O��F�t��w�K��bD�e�j6H|k��63"5NH�:DY�_��L�ń����v��M�>|{�خf��vl|�Z�9ج�&#/�]v��v����Z��!� R�@�P�$�ǡ�'K�x]ج@�N�dS-��^Ym"�����VL7�ф�k�1w���lD��X�I/��=y���@�n�lg;���",�_�j8���]ٽ����C� 2k_O��(�h)A�ދt��A$�q�7�!�����k�
�]����� ��,P>0Xa��*+�l��� ����0�?¤J���	ɘ���I���8b�+v3��������m,=CP�F�璹�X���3��z�َ��|����)�u���4�U�S���	̟;����Q�x@�!�!�s]�����!��$�!LiU��X�/��_�C�P�A������LLx��4�]O7ž2�=���NBl����X���m��� 3�ç����y�-:d3B�������S����y��l-~��B���,�[���8P&>wZ�Y���J�&� �'�z�IEND�B`�PK�XKQu���india_today.recipe
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class IndiaToday(BasicNewsRecipe):
    title = u'India Today Magazine'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}
    description = (
        'India’s Most Reputed, Credible and Popular news magazine.'
        ' Read the most preferred magazine of 9.5 million Indians to access highly researched and unbiased content.'
    )
    masthead_url = 'https://akm-img-a-in.tosshub.com/sites/all/themes/itg/logo.png'

    extra_css = '''
        #sub-d {font-style:italic; color:#202020;}
        .story__byline {font-size:small; text-align:left;}
        .body_caption, .mos__alt .caption, .caption-drupal-entity {font-size:small; text-align:center;}
        blockquote{color:#404040;}
    '''

    remove_tags = [
            classes('checkout__section sharing align-center-button amp-izooto-sub ads__container inline-story-add amp-ad readmore__box'),
            dict(name=(('amp-web-push-widget', 'amp-ad'))),
            dict(attrs={'id':'tab-link-wrapper-plugin'}),
            dict(name='div', attrs={'amp-access':'NOT granted'})
        ]

    def preprocess_raw_html(self, raw_html, url):
        return raw_html.replace('—', '--')

    def get_cover_url(self):
        soup = self.index_to_soup(
            'https://www.readwhere.com/magazine/the-india-today-group/India-Today/1154'
        )
        for citem in soup.findAll(
            'meta', content=lambda s: s and s.endswith('/magazine/300/new')
        ):
            return citem['content'].replace('300', '600')

    def parse_index(self):
        soup = self.index_to_soup('https://www.indiatoday.in/magazine')

        section = None
        sections = {}

        date = soup.find(attrs={'class':lambda x: x and x.startswith('MagazineEdition_edition__date')})
        edition = soup.find(attrs={'class':'prime__magazine'})
        self.timefmt = '(' + self.tag_to_string(edition).strip() +') [' + self.tag_to_string(date).strip() + ']'
        if p := edition.findNext('p'):
            self.description = self.tag_to_string(p)
        self.log('Downloading Issue: ', self.timefmt)

        for tag in soup.findAll('div', attrs={'class': lambda x: x and 'NoCard_story__grid__' in x}):
            sec = tag.find('div', attrs={'class': lambda x: x and 'NoCard_header__nav__' in x})
            section = self.tag_to_string(sec).strip()
            self.log(section)
            sections[section] = []

            for art in tag.findAll('article'):
                title = self.tag_to_string(art.find(attrs={'class':lambda x: x and 'NoCard_articletitle__' in x})).strip()
                url = art.find('a', href=True, title=True)['href']
                if url.startswith('/'):
                    url = 'https://www.indiatoday.in' + url
                desc = self.tag_to_string(art.find(attrs={'class':lambda x: x and 'NoCard_story__shortcont__' in x})).strip()
                self.log('\t', title, '\n\t', desc, '\n\t\t', url)
                sections[section].append({'title': title, 'url': url, 'description': desc})

        def sort_key(x):
            section = x[0]
            try:
                return (
                    'Editor\'s Note', 'Cover Story', 'The Big Story', 'Upfront',
                    'NATION', 'INTERVIEW'
                ).index(section)
            except Exception:
                return 99999999

        return sorted(sections.items(), key=sort_key)

    def preprocess_html(self, soup):
        if soup.find('div', attrs={'amp-access':'granted'}) is not None:
            keep_only_tags = [
                classes('strytitle strykicker story__byline srtymos'),
                dict(name='div', attrs={'amp-access':'granted'}),
            ]
        else:
            keep_only_tags = [
                classes('strytitle strykicker story__byline srtymos'),
                dict(name='div', attrs={'class':'description'}),
            ]
        body = new_tag(soup, 'body')
        for spec in keep_only_tags:
            for tag in soup.find('body').findAll(**spec):
                body.insert(len(body.contents), tag)
        soup.find('body').replaceWith(body)

        for img in soup.findAll('amp-img'):
            if not img.find('img'):
                img.name = 'img'
        h2 = soup.find('h2')
        if h2:
            h2.name = 'p'
            h2['id'] = 'sub-d'
        for quo in soup.findAll(attrs={'class':'quotes'}):
            quo.name = 'blockquote'
        return soup

    def print_version(self, url):
        return url.replace('.in/','.in/amp/')
PK�X4��m��indian_express.png�PNG


IHDR  D���!PLTE��,,�		����

����:ٹtRNS@��f�IDATxڭ��B!W}ֲ���H�tk߅92)p�y���
Nn�����n�ֈkN��3b�8�'�,�d0Ͱ�b0�x�y�ze�z�fT������##F]��
C���	Y
Q��@q�/y"Vb�"IEND�B`�PK�X'k�&��indian_express.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from datetime import datetime, timedelta
from calibre.utils.date import parse_date


class IndianExpress(BasicNewsRecipe):
    title = u'Indian Express'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    oldest_article = 1.15  # days
    max_articles_per_feed = 25
    encoding = 'utf-8'
    masthead_url = 'https://indianexpress.com/wp-content/themes/indianexpress/images/indian-express-logo-n.svg'
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}

    extra_css = '''
        #img-cap, .ie-authorbox, .author-block, #storycenterbyline { font-size:small; }
        blockquote { color:#404040; }
        em, #sub-d { color:#202020; font-style:italic; }
        img { display:block; margin:0 auto; }
    '''

    resolve_internal_links = True
    remove_empty_feeds = True

    keep_only_tags = [classes('heading-part full-details')]
    remove_tags = [
        dict(name='div', attrs={'id': 'ie_story_comments'}),
        dict(name='div', attrs={'class': lambda x: x and 'related-widget' in x}),
        dict(name='img', attrs={'src':lambda x: x and x.endswith('-button-300-ie.jpeg')}),
        dict(name='a', attrs={'href':lambda x: x and x.endswith('/?utm_source=newbanner')}),
        classes(
            'share-social appstext ie-int-campign-ad ie-breadcrumb custom_read_button unitimg copyright '
            'storytags pdsc-related-modify news-guard premium-story append_social_share ie-int-campign-ad '
            'digital-subscriber-only h-text-widget ie-premium ie-first-publish adboxtop adsizes immigrationimg '
            'next-story-wrap ie-ie-share next-story-box brand-logo quote_section ie-customshare osv-ad-class '
            'custom-share o-story-paper-quite ie-network-commenting audio-player-tts-sec o-story-list subscriber_hide '
            'author-social author-follow author-img premium_widget_below_article'
        )
    ]

    def parse_index(self):

        section_list = [
            ('Front Page', 'https://indianexpress.com/print/front-page/'),
            ('India', 'https://indianexpress.com/section/india/'),
            # ('Express Network', 'https://indianexpress.com/print/express-network/'),
            ('Delhi Confidential', 'https://indianexpress.com/section/delhi-confidential/'),
            ('Opinion', 'http://indianexpress.com/section/opinion/'),
            ('UPSC-CSE Key', 'https://indianexpress.com/section/upsc-current-affairs/'),
            ('Explained', 'https://indianexpress.com/section/explained/'),
            ('Business', 'https://indianexpress.com/section/business/'),
            # ('Political Pulse', 'https://indianexpress.com/section/political-pulse/'),
            ('Sunday Eye', 'https://indianexpress.com/section/express-sunday-eye/'),
            ('World', 'https://indianexpress.com/section/world/'),
            # ('Education', 'https://indianexpress.com/section/education/'),
            # ('Gadgets', 'https://indianexpress.com/section/technology/gadgets/'),
            ('Tech Review', 'https://indianexpress.com/section/technology/tech-reviews/'),
            # ('Techhook', 'https://indianexpress.com/section/technology/techook/'),
            # ('Laptops', 'https://indianexpress.com/section/technology/laptops/'),
            # ('Mobiles & Tabs', 'https://indianexpress.com/section/technology/mobile-tabs/'),
            ('Science', 'https://indianexpress.com/section/technology/science/'),
            ('Movie Review', 'https://indianexpress.com/section/entertainment/movie-review/'),
        ]

        feeds = []

        # For each section title, fetch the article urls
        for section in section_list:
            section_title = section[0]
            section_url = section[1]
            self.log(section_title, section_url)
            soup = self.index_to_soup(section_url)
            if '/world/' in section_url or '/explained/' in section_url:
                articles = self.articles_from_page(soup)
            else:
                articles = self.articles_from_soup(soup)
            if articles:
                feeds.append((section_title, articles))
        return feeds

    def articles_from_page(self, soup):
        ans = []
        for div in soup.findAll(attrs={'class':['northeast-topbox', 'explained-section-grid']}):
            for a in div.findAll('a', href=True):
                if not a.find('img') and '/section/' not in a['href']:
                    url = a['href']
                    title = self.tag_to_string(a)
                    self.log('\t', title, '\n\t\t', url)
                    ans.append({'title': title, 'url': url, 'description': ''})
        return ans

    def articles_from_soup(self, soup):
        ans = []
        div = soup.find('div', attrs={'class':['nation', 'o-opin']})
        for art in div.findAll(attrs={'class':['articles', 'o-opin-article']}):
            for a in art.findAll('a', href=True):
                if not a.find('img') and not ('/profile/' in a['href'] or '/agency/' in a['href']):
                    url = a['href']
                    title = self.tag_to_string(a)
                    desc = ''
                    if p:= art.find('p'):
                        desc = self.tag_to_string(p)
                    if da := art.find('div', attrs={'class':['date', 'o-opin-date']}):
                        date = parse_date(self.tag_to_string(da)).replace(tzinfo=None)
                        today = datetime.now()
                        if (today - date) > timedelta(self.oldest_article):
                            continue
                    self.log('\t', title, '\n\t', desc, '\n\t\t', url)
                    ans.append({'title': title, 'url': url, 'description': desc})
        return ans

    def get_cover_url(self):
        soup = self.index_to_soup(
            'https://www.magzter.com/IN/The-Indian-Express-Ltd./The-Indian-Express-Mumbai/Newspaper/'
        )
        for citem in soup.findAll('meta', content=lambda s: s and s.endswith('view/3.jpg')):
            return citem['content']

    def preprocess_html(self, soup):
        if h2 := soup.find('h2'):
            h2.name = 'p'
            h2['id'] = 'sub-d'
        for span in soup.findAll(
            'span', attrs={'class': ['ie-custom-caption', 'custom-caption']}
        ):
            span['id'] = 'img-cap'
        for img in soup.findAll('img'):
            noscript = img.findParent('noscript')
            if noscript is not None:
                lazy = noscript.findPreviousSibling('img')
                if lazy is not None:
                    lazy.extract()
                noscript.name = 'div'
        if span := soup.find('span', content=True, attrs={'itemprop':'dateModified'}):
            date = parse_date(span['content']).replace(tzinfo=None)
            today = datetime.now()
            if (today - date) > timedelta(self.oldest_article):
                self.abort_article('Skipping old article')
        return soup
PK�XA���indic_today.png�PNG


IHDR  D����PLTE������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JJJEEEGGG����ə��B��E�ٶ��������s�s�u�v�ɛ������������������x�y�����Ч�����������}	�ϥ���ȗ�}
�ݾ�Ȗ�ǖ�w�ܾ���





����ʛ�~������������������������&>kHtRNS.|���ͮz+?��ܙ<���=��8I��B>��ľ�@�;�l��k,ۘ悹9�27��:�ތ���8pIDAT��KOa���fh�
.
/�Q�R�Ƅ���6a�BYؠ,�R
&��^��2A�x�����[d������%��	}�a��Fr^�pT[W	�79n����]���"N4����!�|�����P��{J��M:���&��}ݚBЗ6I�7;����T�**�+���k���nS�w�ݷ\9�L�=�}Eag&9�Q�̙��IJ�S�TJ�G�Q��2JeIJ�$�)�t:�%%�F��@�}6������0e��~��������{j�t�J�����ۜlӅH�vi�m� �ո�q[K�	���;����:	���K�X���"٣O�5Ga��h����3�����F�}A���h�|�IEND�B`�PK�X�!�??indic_today.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
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 IndicToday(BasicNewsRecipe):
    title          = 'Indic Today'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('Indic Today Main feed', 'https://www.indica.today/feed/'),
    ]
PK�X�L![[
indy_star.png�PNG


IHDR  szz�"IDATx^��[��U���=�g��3ӡ��,�SZ)� �R��J�D��x��)Q!D��@U�0��)5�+�J��
P)=���-ء������}
�+�3����u���/��
�4�z$t
�>�K�&�S.R\�k���w��[���"���7��)˺f�U.x�f;&�+Qy��?�p�Hd��!
MW�O�
:��;m8p~���ʍۆ�y�F;0�a��SX��?�Q i�����������g��e�\bn�an�����"�����Mv��j&���X��8���vmd����%¥��q�q�:Z'b+��V�Y�i����q�mkj�>����;�8S��)bn�{��8
����r���i�G���?`�����y�
��iQB���_���8@��g� �&�B�z�9sY0Цb�Q� 0��:��n������8K&%(R�$���Y���@����`b�sO��9�%��	]ɤ|:-�S_4L0@!$����<L�)�Ά��U�3&ÌZ+TMc�(��dUҬZ�Uo$z���ċ��D��7�����4Ish�Ͱk�!DB�K�fx�y�?�D�vB�
	��ۈh4{�����k��
C-d����~�t���br�P�uѪvD�	AL��(K�	Z	q�i�j�d��Vy)��+��kxyp@�˦U˔w��g�\a
�	��"���H� l�Q�Q|����+��'PC����Ǐ!O��L�'����9�U��0"	s4"$d��4��=���k�^�����g��á� L�#iOҪҪ�E���qL&K�lҮ����1��k��<��!�E��(W���_�����${AB� �C��&I��ih��|5�+m��e���?훑�<�8�����=[>KR�M�
�e�5SS��´�$M�M��LS�����4!����r@��Rc�s���$e�i���+$uZ�ƧP������ɖ>�( 1}l��I��}���oa�jS�G�J�0�2�:I����*ᤸD1RG�N[5
�8(ʔGh�IBҔ��#HhNҮ$Hi]<k�l�E�L�}'`|�������[O����\�l7��]��h��6H�4]ٷ�,�f��:_\��g�pBv�W7ј��	
dF�b��9�.�n�JR��Dc.��y���ptn[v�̓^ܻ���n
9�lJ���BW�6��{����o����CT���7�"1]W��	��=Oj��}�|���]�{Iv�U��ם��Q_�hcƾ��s��1��.K
���0FKg܂'��(m
Ӧ���ѾS7W���=���~�
��S-�(������.�w�挟��,�}�h�Kzwu�?�iI�yoI�X_��⒍7�6����g��A�0�J+tӣ\�9oh�9�<&^vyq;1RP�%�o��i�*
��e����/	
��_���A~Q����(~Do�v@�.b3����i��ɸ���RC7�d�b߷�����ѷb�t��R?B�Q����>�Zny���g	IEND�B`�PK�X�Z} ��indy_star.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class IndianapolisStar(BasicNewsRecipe):
    title = u'Indianapolis Star'
    oldest_article = 10
    auto_cleanup = True
    language = 'en'
    __author__ = 'Owen Kelly'
    max_articles_per_feed = 100
    cover_url = u'http://www2.indystar.com/frontpage/images/today.jpg'
    feeds = [(u'Community Headlines', u'http://www.indystar.com/apps/pbcs.dll/section?Category=LOCAL&template=rss'),
             (u'News Headlines',
              u'http://www.indystar.com/apps/pbcs.dll/section?Category=NEWS&template=rss'),
             (u'Business Headlines',
              u'http://www.indystar.com/apps/pbcs.dll/section?Category=BUSINESS&template=rss'),
             (u'Politics and Government',
              u'http://www.indystar.com/apps/pbcs.dll/section?Category=NEWS05&template=rss'),
             (u'Lifestyle Headlines',
              u'http://www.indystar.com/apps/pbcs.dll/section?Category=LIVING&template=rss&mime=XML'),
             (u'Opinion Headlines',
              u'http://www.indystar.com/apps/pbcs.dll/section?Category=OPINION&template=rss&mime=XML')
             ]

    def print_version(self, url):
        return url + '&template=printart'
PK�X�ծ��infobae.png�PNG


IHDR���RPLTE����@�À����������_#IDAT[c`@��PFE;���e�82�#e(���������IEND�B`�PK�X/z�;�infobae.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2008-2021, Darko Miletic <darko.miletic at gmail.com>'
'''
infobae.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Infobae(BasicNewsRecipe):
    title = 'Infobae.com'
    __author__ = 'Darko Miletic and Sujata Raman'
    description = 'Infobae.com es el sitio de noticias con mayor actualizacion de Latinoamérica. Noticias actualizadas las 24 horas, los 365 días del año.'
    publisher = 'Infobae.com'
    category = 'news, politics, Argentina'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    auto_cleanup = True
    language = 'es_AR'
    encoding = 'utf8'
    remove_empty_feeds = True
    handle_gzip = True
    compress_news_images = True
    scale_news_images_to_device = True
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://www.infobae.com/pf/resources/images/logo_infobae_naranja.svg?d=662'
    extra_css             = '''
                              body{font-family: Arial,Helvetica,sans-serif}
                              img{display: block}
                              .categoria{font-size: small; text-transform: uppercase}
                            '''

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Ahora', u'https://www.infobae.com/feeds/rss/')]
PK�X��a��infomotori.png�PNG


IHDR  ��tRNSn���IDATx�l����0ŋ
׵�Zh	%�a��=���;>7\6|���}չo��pK�s~�Z�Ϯ4�f�R�3��a+�8C�%�Wz�{�Oh�� � �bX�Q�~mH:����
n��~�,�*�=�{������"�! �g�U��q�u���䶠/5�0q�,�J� �F�+�::���
�f��z�̈oC��C�/F~425")ЍL��1�}��bX`����֔��=����y�4�+AOİ�; @�C�e'7�����柍�����'�C�T�~�,E’�OF�; ���N�Y��v���R�3���ͷ�]�Ka(���9���8%�}�D4}����̍Do�Y5=R,�ܐvE�D���x�{���0�P'(��}_�v�4�)�aU�� 3$�cSYM��9"�F����=7�׈���a$����n����_�����!_���q��};�Z�M�^�"IC�|�>����~է��c�?i�sQP�+P���.;k۶m۶m���v�Q�L�N'ټ�/��͞=����]�eK���U���$=ڃ��u�]�qV�H�ҁP�P1��a�z��c<#�~�f¨�?���JDi���W.�Ľ#s]��/�#�(�L�|p�,*�yQ�y�bH_щ � ����j��W5��T�n=v��˥�Fob|��E�!�Ÿ�����]8C��/��%6���gر��IB$A�Ė#�U��"M�Ȃ8��܆o�B�+����S�(qkC�S�K��,��Ӣ߿V�]�a�����(�ϼo�q�*�����	�z�@�wYG�����0mu�2V�79�R���sg@Y�`$	R���z	{pǧR�h:SJ9z���@
�h� �d�����X��8J�N�����;��SD�1�|p)���(��HK�d� A��p(�ѓ�4����q�3YGr[7)l������:^*��|�L��s�f�HC, 	���J�i3L8����<0vX
dsD�����v�XͰ~��)�����c1�{C~?t��\���8�x����:�6�P�D�8=}�X-��weK���#�����K��,J�_�@�Ҫ��L���F-<��qͤ15%j�d�=u����z`>��u�6��6��z�TuZW]DZ�/l��i~��}n6D�D	H�4����	27�6�(��*�5��anRRlܱI�z�7�]��9�R+M�vV�\�~��V�C5cZg��z�H�#0!t�>�ʧQ��J�ݛ���S����v�dĞ>�M��<��)m�C���U�G��+�k��Ux�>��u���-<=�����x��~�Ry��0T�����L�W���;�FD/�'2R��O[����*��]k�fN�����F��Xlع�tx���>Î�eK����l�г|�R����`���e=:�.�Ψ_�n��_kh0CQ�/f
&3����(����n`߳���XSZW��|����v�S��^���m�[<������YKَ�\��p��==.�h~\>�f"�"�^pkLdLW���Os��0��iE8�2;֙Y����2u�w,}y@>�cR���-Ч�+[��pxyJ�ew‹�𪛎��r��0��SwIEND�B`�PK�X�Us��infomotori.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gabriele Marini, based on Darko Miletic'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
description = 'On Line Motor News - 01-05-2010'

'''
http://www.infomotori.it/
'''
from calibre.ebooks.BeautifulSoup import BeautifulSoup
from calibre.web.feeds.news import BasicNewsRecipe


class infomotori(BasicNewsRecipe):
    author = 'Gabriele Marini'
    title = u'Infomotori'
    cover = 'http://www.infomotori.com/content/files/anniversario_01.gif'
    oldest_article = 31
    max_articles_per_feed = 100
    recursion = 100
    use_embedded_content = False

    language = 'it'
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True
    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    def print_version(self, url):
        raw = self.browser.open(url).read()
        soup = BeautifulSoup(raw.decode('utf8', 'replace'))
        print_link = soup.find('a', {'class': 'printarticle'})

        return print_link['href']

    feeds = [(u'Ultime Novit\xe0', u'http://feeds.infomotori.com/ultimenovita'),
             (u'Auto: Ultime Novit\xe0 ',
              u'http://feeds.infomotori.com/autonovita'),
             (u'Moto: Ultime Novit\xe0 Moto',
              u'http://feeds.infomotori.com/motonovita'),
             (u'Notizie Flash',
              u'http://feeds.infomotori.com/infoflashmotori'),
             (u'Veicoli Ecologici e Mobilit\xe0 Sostenibile',
              u'http://feeds.infomotori.com/ecomotori'),
             (u'4x4 Fuoristrada, Crossover e Suv',
              u'http://feeds.infomotori.com/fuoristrada'),
             (u'Shopping Motori',
              u'http://feeds.infomotori.com/shoppingmotori')
             ]
PK�XNق���information_dk.png�PNG


IHDR(-S-PLTE�������������������qv�ci�U[�GM�*2�$���I��EMIDATx�e��A�q����[	Y�_�(�����%"]	S�4�"/X����x �}x�v��`7�o�S��r�w���k���IEND�B`�PK�X��Zغ
�
information_dk.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
information.dk
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Information_dk(BasicNewsRecipe):
    title = 'Information - Denmark'
    __author__ = 'Darko Miletic'
    description = 'News from Denmark'
    publisher = 'information.dk'
    category = 'news, politics, Denmark'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    use_embedded_content = False
    encoding = 'utf8'
    language = 'da'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [

    (u'Nyheder', u'https://www.information.dk/feed'),
    (u'Politik', u'https://www.information.dk/emne/politik/feed'),
    (u'Indland', u'https://www.information.dk/indland/feed'),
    (u'Udland', u'https://www.information.dk/udland/feed'),
    (u'Debat', u'https://www.information.dk/debat/feed'),
    (u'Kunst og kultur', u'https://www.information.dk/kultur/feed'),
    (u'Literatur', u'https://www.information.dk/litteratur/feed'),
    (u'Film', u'https://www.information.dk/emne/film/feed'),
    (u'Kunst', u'https://www.information.dk/emne/kunst/feed')
    ]

    keep_only_tags = [dict(name='article', attrs={}),
                      dict(name='div', attrs={'class': 'field-name-body'})]
    remove_tags_before = dict(name='h1', attrs={'class': 'print-title'})
    remove_tags_after = dict(name='div', attrs={'class': 'print-footer'})

    field_name_best_from_inf = '^.*?field-name-best-from-inf.*?$'
    related_stuff = '^.*?related-stuff.*?$'
    view_iv_seneste = '^.*?view-iv-seneste.*?$'
    view_iv_news_queue = '^.*?view-iv-news-queue.*?$'
    view_footer = '^.*?view-footer.*?$'
    field_name_recommendations = '^.*?field-name-recommendations.*?$'
    field_name_comments_label = '^.*?field-name-comments-label.*?$'
    field_name_no_comments = '^.?field-name-no-comments.*?$'
    comment = '^.*?comment.*?$'

    remove_tags = [dict(name=['object', 'link']),
                   dict(name='div', attrs={'id': 'node-article-full-group-date'}),
                   dict(name='div', attrs={'id': 'node-article-full-group-right'}),
                   dict(name='div', attrs={'id': 'node-article-non-subscriber-full-group-date'}),
                   dict(name='div', attrs={'id': 'node-article-non-subscriber-full-group-right'}),
                   dict(name='div', attrs={'class': re.compile(field_name_best_from_inf, re.IGNORECASE)}),
                   dict(name='div', attrs={'class': re.compile(related_stuff, re.IGNORECASE)}),
                   dict(name='div', attrs={'class': re.compile(view_iv_seneste, re.IGNORECASE)}),
                   dict(name='div', attrs={'class': re.compile(view_iv_news_queue, re.IGNORECASE)}),
                   dict(name='div', attrs={'class': re.compile(view_footer, re.IGNORECASE)}),
                   dict(name='div', attrs={'class': re.compile(field_name_recommendations, re.IGNORECASE)}),
                   dict(name='div', attrs={'class': re.compile(field_name_comments_label, re.IGNORECASE)}),
                   dict(name='div', attrs={'class': re.compile(field_name_no_comments, re.IGNORECASE)}),
                   dict(name='article', attrs={'class': re.compile(comment, re.IGNORECASE)}),
                   dict(name='h2', attrs={'class': 'pane-title'}),
                   dict(name='div', attrs={'id': 'comments'})]
PK�X�ӻ


infoworld.png�PNG


IHDR  ��tRNSn��	pHYs���+�IDATH��UmHSQ>�.���1d�0DŸC�EB��1�(�2JJ�S��G�Ԥef��}K�*�l��Y[�6�ii~���01����&Ï�Q?/��}�����^"w_�OY$X$����
�>Sn3g,�#��R�?�x�d	��-c:@)+��.�s8d_l✀�	Ŕ�]�C{_Kk��دo�7�����FҦ�~;/`U��`�����Q�+�dX��R���b���x��V�br�g��C9i�2U��w���iE��p�<���H�8�V�'�LLt>i��*�~�i����nPId���@�/�#��.Y��S�o��K˧ebv�b����1Ԫ�{/�(���%�ke*�PFĚ���ӾBV௯Q�,]�L��LKX>}:��7��0�6�X�q��.�C�*���說��27�Ꮶ��?x������\!�0Ep�1���
V` K�wRDW]�oP"JEa�50��4�	����Y)��-X�vu#��������;<����c�SE|>�/'���](A�`�\�(�u`PA���'��T��[@jJ��e���(I�ug&`a7�/C�\�
!1���Vb�8�Z�g��{��S�ˢ$��Z�.xA��$�b���A��g�!-���~��lw,<�0G�~�铲��׽��^Ʉݣ������B0'mZ1
�P1c�#v9����073	8���qbm�c�I���=俊��)���η
�l~ۤI#	��2a�p]�U$�*�`V{�JbR	?��S��ؑ���OH�y�M;R�v+�47N�]�Q�Vץ�uk[��3�ҩ��ϮT�~�T�!>��ɠ��ݒ�卻��-���7���b�w��؆x�6@�,!��֫����pP�Ҍ1��g!�ş�"��M��3M�X<	�IEND�B`�PK�X�(>eeinfoworld.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Rick Kellogg'
'''
Infoworld.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Engadget(BasicNewsRecipe):
    title = u'Infoworld.com'
    __author__ = 'Rick Kellogg'
    description = 'news'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    auto_cleanup = True

    feeds = [(u'Top Tech Stories', u'http://www.infoworld.com/index.rss'),
             (u'Today\'s Tech Headlines',
              u'http://www.infoworld.com/news/index.rss')]
PK�X%����infra_pl.png�PNG


IHDR��h6�IDATx�@
h�a~����e0m'��F��(��"	��`&$jDB���*�L���0k;e![3��v��~��#J��A*���>����xP��8
R%x���t���Gu�wT�OR� U�R�BBZ1�5�F���ъ��g^�4�EuX?�4�`*�R�&�̰̘e#E�O�~�����-���_TdlY�� ��Ѩ�l�ؖe�L�|źXGbSL�Y%�E��ކ�ю�OU)�Ԑ�������gy{�����Ĝ�ɲ��1�����
Zr&��,G�.S�I,�q�Lf������Hi����M/�ppⱲ�R�?z�y�\�"�5��Iw}{��ލ�㛳Ƿ�Om(ih�����M9o�#�ы��<޷��clUq���'J���î�'|m~򪥾fw�e%�3�ޝ7�aϖ�¼���3D�`���;*m#���bj����AWwv�F�La���v�Ȉ�v���Ӟ�pޡ��w�~�ʶ���%K)�&�
�e�]����d3��J#$Zn͟fJ[�V���5'��FR�
R��̉��6���4#$�f�Bq�_��u���/U�hkoy���cz 	@Zk�@��X�s�n�zYw�s�˿�=Ѐ�R�s.��ZGK����!p����m�͂2���B�s�H�q��B17�-�b.
$�TJ��RJi�����y�ͦIEND�B`�PK�X30�h��infra_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class INFRA(BasicNewsRecipe):
    title = u'INFRA'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = 'fenuks'
    description = u'Serwis Informacyjny INFRA - UFO, Zjawiska Paranormalne, Duchy, Tajemnice świata.'
    cover_url = 'http://i.imgur.com/j7hJT.jpg'
    category = 'UFO'
    index = 'http://infra.org.pl'
    language = 'pl'
    max_articles_per_feed = 100
    remove_empty_feeds = True
    remove_attrs = ['style']
    no_stylesheets = True
    keep_only_tags = [dict(id='ja-current-content')]
    feeds = [(u'Najnowsze wiadomo\u015bci', u'http://www.infra.org.pl/rss')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for a in soup.findAll('a', href=True):
            if 'http://' not in a['href'] and 'https://' not in a['href']:
                a['href'] = self.index + a['href']
        return soup
PK�X�"�GG
ing_dk.png�PNG


IHDR�aIDATxڝ�3�\QE� �m۶m۶��N�&�xb����N���?�fq}�z{�wd�-����c��c�
:�YK�q�h>~]w�c��+�����>w���w���s���Q�1���Xk8R{�`�p��3)9�U�~�`׋���Ճ�tt�����x�K=�`n0i2ES06������4ʌ�O�_�qE1Y�-1D��ُ���^3��h��4](��$L�'�L>J��?{H[LG)q9��J�b�(�i�J��X}<5	`h0m
�D�i�)s�+[L[qzՎ���Ë>6�"-��G�KHF��C�������G�xS^�v�Yja|
 �a�
�O���)�x:���fp���G>��3 ��)(}�G.
|�y��	0%0�HV@��d_�Q�!�HR���E�����%�5�&�f睁rV�emb����R2����h�k˒���B�� k��M/r,|����2-�S��m�)�je��H��G�f�I9W\[�2׼�q�(�Q��g����v���*IEND�B`�PK�X�͝p
ing_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Ingeniøren.dk
'''


class Ing_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Ingeniøren'
    language = 'da'
    description = 'Nyheder om teknologi og naturvidenskab for fagfolk og interesserede; artikler, blogs, debat, infografik, video.'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True

    keep_only_tags = [
        dict(name="div", attrs={'class': 'menu-article-current-title'}),
        dict(name="section", attrs={'class': 'byline'}),
        dict(name="section", attrs={'class': 'body'}),
    ]

    feeds          = [
        ('Biotek', 'https://ing.dk/rss/term/341'),
        ('Byggeri', 'https://ing.dk/rss/term/356'),
        ('Elektronik', 'https://ing.dk/rss/term/355'),
        ('Energi og Miljø', 'https://ing.dk/rss/term/354'),
        ('Forskning', 'https://ing.dk/rss/term/353'),
        ('Fødevare', 'https://ing.dk/rss/term/352'),
        ('Karriere', 'https://ing.dk/rss/term/350'),
        ('Produktion', 'https://ing.dk/rss/term/349'),
        ('Rumfart', 'https://ing.dk/rss/term/348'),
        ('Transport', 'https://ing.dk/rss/term/347'),
        ('Blogs', 'https://ing.dk/rss/blogs'),
        ('Spørg Scientariet', 'https://ing.dk/rss/term/287'),
    ]
PK�Xe�[���
inopressa.png�PNG


IHDR  ��tRNSn��	pHYs���+pIDATH�}Vko��>$�xu�$[�lY�ǩ�)��H��a�����eYS�slj�XQ$�"Y�$��C�\�Z����sy�@>�W"d��U-�j�1��@{�25,�G�O�����7c�k�:���IU	1'�8!i|��)�F�`0t�����$����;�m����9!�FQ6�0{�qnN�u�aq�AI�M�S�ET������"J79���Uݖ�eB��
g��tu5���潞 �x'%�M�Ŧm����z(��L�����h�mIZ�>#�1c_KҬ놾��j5\_g���e9?rוggE	��@�"��J3���(K��F��ͬ��+�~v�惡�y��J�s�����p��t��@PU1��)
Q��&��uef�0M��ɄRjf2T�[���!J��#U�F��ewGx��alo�w�J����O�0�Z^�(%�%E��iTEE��r9PU�߿O�_Ms�0n�HF�U(�մ?�b%�4M���y�Z���i4���y��!����upq��R&$�8�(���yD|�]Ω���)��4��˭�h���{2
��v{��w��1�H}�9[Z����$<?O���\.�<�<��r6+..���E��m]w�`�b:�
Bf,��|>��eܻ�.-��͛�ӡ�iƎ��|0����i�^\D�rH�*O�E�Z�?��]UE��:z^z0`�1��X�ro���r�L�!�M�V+���'j��y .?;c����vQU]?��`=��ٶpy���J�#"y>�fju�>~���Q���o6�~_��6�0�`x�n�����#�NW
���$A:��F�Uek������Ǐ��.q]����#v����=�JT
�1
Pe8$�C�'CÔr9�TJ1�R
��!AI�5L�76TJ����O�˗p�x{��!ѧRtqQkk���$G�HDQ�X�Y�N*��+R���hۊ�`��#u��&��u���fCL3���y��?�ۥ@hm

�����G��3�E�B��JI�nWa�T�c��,�yie%�2Pe8L�l��	��n,IJFO��GQ�ɿ�G��E1�߉"���]	6�,��X�ä�R�(��
���8�9���M)�
NN��C�&�6�&<#�����ٳ��AbŶY��W�B8M2VI�!�i2����%����U�F����&���=8���Ǖ�J�麻�g?}^�1<F� �u�.m`0�t�&��F����tfF�0�WU���>�:��s^<��R|�`'h��m
���痈v��Eee�M&��݀s67G�yB���J���/�F�M�<
5
�t-@
�b�0A��L��^��녂���v�����۷'�H���<]XЊEAe܇%t��x��H�ҧ"HE R�D�4�dq��
�^�z;ah�ǧ2!���᥯�J�u/�pΩ�KK(Vp:;����h���@h��8�Pڕ�	08%�}�}xtD��i�J�	0� :�D��Y!�$J��ΰv���C��n�.�0tZ�F��ɼ��>8:<|E��B]�ӫ�`X��"8:�
�
Lg[[B��r9L|��8�	����\���Z*�G	�(���8�[��ϖJj��s9���y�h��^%
����惸A����c7���}�WD~�FDz�����;y��qMfe��4�X԰:�3�r���@0{
������o��Ch��iD�u��n��n8ܝL�G�+��Ta��^/�(�;a�.�f����$Eo�
��$�b�N����/���e���<o6�x�ޯN�\��p�i�X����f�j�(�j�E�D]O�G�y��LNN�N^R�9����~����?�q�iL�d�:�i��؅��KG�1�,+N%������j�a(x_��JEYX�s��(:<?����޽{fY�i���q��lʦW����i~��,k��ͦ
�\Nl��(qn��p[�E���읝}�n�`Y��;���ё�4���BN8e�d�l�R�T2��L�w�]Bl�{�}��>|8�^�\&3��w���!uU]�d�鴙J���0�s��ɤ�8��o}2��a����IEND�B`�PK�X��9��inopressa.recipe# vim:fileencoding=UTF-8
from __future__ import unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


class Dingoo(BasicNewsRecipe):
    language = 'ru'
    __author__ = 'bug_me_not'
    title = u'\u0418\u043d\u043e\u041f\u0440\u0435\u0441\u0441\u0430'
    description = 'Иностранная пресса о России и не только'
    cover_url = u'http://static.inopressa.ru/img/inopressa-logo-light.gif'
    language = 'ru'
    oldest_article = 14
    max_articles_per_feed = 200

    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = True

    feeds = [(u'\u043e \u0420\u043e\u0441\u0441\u0438\u0438 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e',
              u'http://pda.inopressa.ru/rss')]

    remove_tags_before = dict(name='div', attrs={'class': 'article'})
    remove_tags_after = dict(name='div', attrs={'class': 'source'})
PK�XM*J�ttinquirer_net.png�PNG


IHDR��h6;IDATxڕ�QHSQ��S/�*�/�E��E*VF5�0B`6uZ&:d��,�4k����n9�9�
���fE���q�v�9︺M��Q33h��H@o^~\�9����i��RCt����ۥޕ�W/�ԇ(�
ZlQ�9�=���APi�P�B2A굞�t���, |�'Z��Y�1��į?&Wi�i3�Vh���yq���fՠ<m��K�~8Fc�}�
-G���d2٣�;�k���ڿ�0��|�yU�����!:G��r#99�z�
�$j�c�ZC
}@�4R=�Ap�ERf�}�u|I+�4�>��r��B?�}�����I����+�),~�toc�
�:����v汧��ݶ
��I���e�yw$�m���%�W��}���9�^�Kp�k9�D�2HEն�	&�� ��dr�Ȩ�:4�Gwf�,�����~D��n���(1��q\&t�B�n��:Ne�	J�E�fR���j��w��2���\��A����'G�p�Ï�b�?�/�Z)�L�u
Y��5������G�|/��:T�0'8�����/���tIEND�B`�PK�X�脓gginquirer_net.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.inquirer.net
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class InquirerNet(BasicNewsRecipe):
    title = 'Inquirer.net'
    __author__ = 'Krittika Goyal'
    description = 'News from Philipines'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'inquirer.net'
    category = 'news, politics, philipines'
    lang = 'en'
    language = 'en'

    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        (u'Inquirer', u'http://www.inquirer.net/fullfeed')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.set_handle_gzip(True)
        return br
PK�X��P���insan_okur.png�PNG


IHDR  ��tRNSn���IDATxڔ���P���'� �� 	�Ao�
H ��+��DU���q�1ۏ������<�燎�sV��l�ߣq��a0��aH7=B���Gd�*�4�c����i��!F|1Y�)�b�v�$]ױ/ض
�eY�<�@�u�,�4MQ$��֏�,K�\۶��"�q.��}�gs��8�M�HEI����eYq����ޯ�&�0�$�"�u�/�,�/���m 
���n��|�����,f���Qls}�N��0s�0�y-Ɲ�o��ȱc###a���J	|��5Y�WWW#�������0۹swww7
�����K��jbbBU���i��贂��1<�m����4�m��z�5<<���ښ(�Ǐ��Q���++kx²��p�xvv��yاE����w�q���|ߧQ�a���!DӴ��AE�9���ӧ���eI���������ab����V���)(�G]ׇ��p�y�K	$������AB���M�aAPeor�/(��g,��)�v�����@ ����M|/"`rsyy�������@�-���K��F��33���v>�Z{[{ScXa��
Uհ�S��ϟG�mmm����0a�Ȍ������wB��>�`.�~,g= �T�رc��Ȳ\<n�<i��������,+�ab����ֻ��R����_�99���aYX�%���`#
�pl�a�Q��N/��Y�m�k׶�8Y�����k����d�8ߋ���}�<�#�Hz{{�igf�wvh�5?�X�q��Yttt���}���#���q���J???�|tt�^_X���еPİ$����I�[�۬ϝgmh�:���wT��‚BD<88����z
Q�y����y�1�I�)��@zP��N͌���Z���܌��saa���	i�Fc`` :����B���y�0iP����c!?`�:����K,
#�:��v�����h �XWW;�s'�����w��iJ�����cƿ!�(Jp�Y���=�2���	��Op����}:�5�^�g<������C8�Ȇ���M��sb�������~do6�{zz��s����x(\������� t�7T�y�ymmmY>}�mƋ���?88���y�K����B&��0Ψ��r������y�F���!Eo/���4!��׈;� �B�h2Y��������ÃC�6���ț3���C�T$��GFE�w��pt|�����{=��/^���_�R�����O����*�rK���/_�{��=����b	D*��$xO$��$%'>z����T�T
�����Ғ����n
�����������c�8��b�ڬV�͆��m�qvT��`�١�Z,��'��an�~cs�`����G;�^����	��%���TJWIEND�B`�PK�X�o@�hhinsan_okur.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1390492898(BasicNewsRecipe):
    title = u'\u0130nsan Okur'
    __author__ = 'asalet_r'
    language = 'tr'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True

    feeds = [(u'\u0130nsan Okur', u'http://www.insanokur.org/?feed=rdf')]
PK�X�@R+��insider.png�PNG


IHDR  szz��IDATx�͗�\A�k3��ڌjƵ��Am۶۠�m�϶�5N��̛t�����7ɷ{q��B��Q�0��&�1�ij¦0jɜfr�>-�"�����U��N�@Z0��$"VKT@w&��(b�*���a�J͵P���"%�Bm6�FD$3-��d� ��<��˖'�hKx�\�	؉�4�E�ɽ�����;v*Ġ�"�|"��g�GT�Ut�pt�3��d��T�vy�]���8�'�.:�T���2�V�pdzP��(��V�6�!>Yi���I�OW����4㢗�l��oi�	��S�í?	2QR��5 �zNN'�r�W|A��|A�,yBf�C&:�1J���)������1*�& 1�yIm�a�4���ʻi��87�ؼ	NU�<�KҚ�ŗ���ˠx��4[���h�l��~
�`�*hYz��`z�e��@��3^���&�����B��a��o�^w���4)��|��'�M�����/x��|��n|MDb*֟~.}"���:�b˾���b�3�Z��B���b�q9.j��c��R�KoK��n<��'r�s�`_�-Y-|S��oJ��\i	�bL�%b�h��Ԏf���P��F��
?�b���I�PVA�xvR�����(�M�IEND�B`�PK�X�ׇ%  insider.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
import re

from calibre.web.feeds.news import BasicNewsRecipe


class insider(BasicNewsRecipe):
    __author__ = 'bubak'
    title = 'Insider'
    language = 'cs'

    remove_tags = [dict(name='div', attrs={'class': 'article-related-content'}), dict(name='div', attrs={'class': 'calendar'}), dict(name='span', attrs={'id': 'labelHolder'})  # noqa
                   ]

    no_stylesheets = True
    keep_only_tags = [
        dict(name='div', attrs={'class': ['doubleBlock textContentFormat']})]

    preprocess_regexps = [
        (re.compile(r'T.mata:.*', re.DOTALL | re.IGNORECASE), lambda m: '</body>')]
    needs_subscription = True

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('http://www.denikinsider.cz/')
        br.select_form(nr=0)
        br['login-name'] = self.username
        br['login-password'] = self.password
        res = br.submit()
        raw = res.read()
        if u'Odhlásit se'.encode('utf-8') not in raw:
            raise ValueError('Failed to login to insider.cz'
                             'Check your username and password.')
        return br

    def parse_index(self):
        articles = []

        soup = self.index_to_soup('http://www.denikinsider.cz')
        titles = soup.findAll('span', attrs={'class': 'homepageArticleTitle'})
        if titles is None:
            raise ValueError('Could not find category content')

        articles = []
        seen_titles = set()
        for title in titles:
            if title.string in seen_titles:
                continue
            article = title.parent
            seen_titles.add(title.string)
            url = article['href']
            if url.startswith('/'):
                url = 'http://www.denikinsider.cz/' + url
            self.log('\tFound article:', title, 'at', url)
            articles.append({'title': title.string, 'url': url, 'description': '',
                             'date': ''})
        return [(self.title, articles)]
PK�X4�
�
instapaper.png�PNG


IHDR99��s�PLTE���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ŀ�½����������������������������������������������������������������������������������������������������������������������������������������������������|}}z|}{{{yzzuvvqqrmmnhhhgghaabFFG;;;778334,--A蜭
iIDATx�l����0D�F��$JDj(��ܦ���/\�
`!���M�9��"q|^�%�c}Yq~�rƤç"�$B���Y0�i3��<��Ҹ$�	�G�%�	���Q��A�2����wP����.��M5�L�H�b�8ofEٛF0�����1�{X��H�]��u&�m/�v5 1���:ַ�JK�׺s"�!:����ԅ�F���ޮP�ݿ�YZ�qVSv�>�t�ಚ����Mt]��~z�9!�GĊ���� �ֶa0��9m�uR#E��#r�=-I��=��4��bZrX�Ba�ߴ��kLi6��6���W}﫧���)��t�t�Lb8$���j��>����~j�sn��3I,b'�]���T��Tb���r1a4�I͔J��b���`tsg������i������P}��r�3�B�:]*�NB�m�����vl��0P��t�	� pB���y�Qj!������?���{�k��f�"��`Ve�=n����z�9�u{��p��ݝ��|^�g���>Ž`̩ʣPb��4ͫ4�w��ɏ�}DX�0��8-���aΆfE�#���0jЗ�SJ�4�H��T���<��ٓ��&�TU>a�9�O�/ϳ)g�A����sF�^e�	ńy*)N��J��^�*q��u�%��Eu���̀{�
yOd0SӋ�r�h�
�Uu��8Gc9�^/|xgxD�q]��UC~-�u=��c�6�`uv���F8R��?}�����js�i��
�������b�Y/�X��˥�9���<����2�H1ȮA
���2���I���
0�'C9x�����4٪-$YU@�fm�Np;G>u�(���<����\��c~�1����я�LI�Єw�N�suO�QA��fg�3~H
�!��z�γ�#��ܶݻjת}�"�š��W�*��	@��4�raV��`馧w��:��X�c��Z'���=�Mt6��5܉z=����0���m]Dv�	t}�ĸI��l�HY�u~�m&�Jr��G�@ď���Q�t�#�M -�D�ݨ��KZ#zoSm����Q���IP���%�pk���h�5�䭸F:�$;�%l��)�'95��ي

�xG��Z���z$`/'�)<�$"���i�`�CQѮb��^ō�=1a�As-�6a
S�_9�/��X�Ϛ4�v`:�|S����`��P��m�e��E;}�2���8��[y��$
qAD�ٛ3���#pM� ���i� ���C�׻}��~ߕ#�G�d6K�8���r��U��svm'���<s5+1��-m����4;
��2ҒE��8�]�BE�'�3�vM}0ə��|�:��̍K���0C�,�"�ʃk	bc��@�[=k����W?���0R����f.%��AoP���Nrp��jafh?�2s��B/
�7�j�O��"ssi�N�>Bd3s~�@�ܻ��~��.Vc�!���{�5V��DZ�I�����s��+W��R��f�3K�^���|)+��P�f~���[��h&H��9�-o.�T�����b6���+��00Kz/��p���H���8�;��T��РJ�>6�ImV�Vғ�������;�y!�c�G�k1Eɯ3��
����,�(��kk��K@l��+.��hN��2Yb���g��j�O���6ґN��p�(eN�!0>�Ҁo�XNDX�\a�X>n���o+]��*�?><��C
��ww��0R��f-=*���%��\��8�Z��C���C����YM��H#��>�$8���RW˟�,�|�����V*)Ux8S��T�r���+�ʿU��o�Z�>�>W��
)N��w��$p�7%�
y�*�em.�,X��a�ҕ��n?�%��-?�e��_Ȇ_}��~kZ��U-;��˯�a�N]���a����|����v�y��?���7��׫,��p�VR�מ}eg됰
O�~�q���֨k��\���<�#t�wΚ!�u��EJZ�aV+������M���|� "��??�M��'�&I�U5E�A%
��FS�c�i�a~�Sh
�&�\�/=,�[-E�4E�~���|�"v�v�#9|'_?57fHj�B����'�GfU�a&Dz�,��4C{i�t�awu�Ӻ���EwX������}��:��K�
�6��&���a.h��A���k�����٭�Y�eKu�x�ǰ�X��EY.���A�`#�a� H���f�x�R�݌����E%�;^��+J��V� �q�P�~� ��S_{�Y3�LI�;rR�e[�OOCc�@�v�m[բ�31
�[舰�K�d8�C5���UA(�I$�	4� ��j��+����"�ql��	]Qr�=j�%��n
�� $10�b�U�tNK2�Q�X�e�$��#"�ϭ(�nj��� �4�M��(�#���O�1�>��m�:7��=�pA���ǣ~.�*�ǣ]�%IJK���مjcӮ����(Z��4I#�R�q��C���1���+��lF��rZ�]Cu�����ɨ���fq��4��c�:D� �q�p�޷��yA��~��I\��%UQ$A[�΄��|(��f����<0J��aa{���IEND�B`�PK�X<C�a&&instapaper.recipe# Calibre recipe for Instapaper.com (Stable version)
#
# Homepage: http://khromov.wordpress.com/projects/instapaper-calibre-recipe/
# Source: https://github.com/kovidgoyal/calibre/blob/master/recipes/instapaper.recipe

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1299694372(BasicNewsRecipe):
    title = u'Instapaper'
    __author__ = 'Darko Miletic, Stanislav Khromov, Jim Ramsay'
    publisher = 'Instapaper.com'
    category = 'info, custom, Instapaper'
    oldest_article = 365
    max_articles_per_feed = 100
#    reverse_article_order = True
    no_stylesheets = False
    extra_css = 'q { font-style: italic; } .size3mode { color: black; }'
    remove_javascript = True
    remove_tags = [
        dict(name='div', attrs={'id': 'text_controls_toggle'}),
        dict(name='script'),
        dict(name='div', attrs={'id': 'text_controls'}),
        dict(name='section', attrs={'class': 'primary_bar'}),
        dict(name='div', attrs={'class': 'modal_group'}),
        dict(name='div', attrs={'id': 'editing_controls'}),
        dict(name='div', attrs={'class': 'modal_name'}),
        dict(name='div', attrs={'class': 'highlight_popover'}),
        dict(name='div', attrs={'class': 'bar bottom'}),
        dict(name='div', attrs={'class': 'evernote_confirm'}),
        dict(name='div', attrs={'id': 'controlbar_container'}),
        dict(name='div', attrs={'id': 'footer'}),
        dict(name='div', attrs={'id': 'speedRead'}),
        dict(name='label')
    ]
    use_embedded_content = False
    needs_subscription = True
    INDEX = u'https://www.instapaper.com'
    LOGIN = INDEX + u'/user/login'

    feeds = [
        (u'Instapaper Unread', u'https://www.instapaper.com/u')
        #            (u'Instapaper Starred', u'https://www.instapaper.com/starred')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None:
            br.open(self.LOGIN)
            br.select_form(nr=0)
            br['username'] = self.username
            if self.password is not None:
                br['password'] = self.password
            br.submit()
        return br

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(0, 'Fetching feed' + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            soup = self.index_to_soup(feedurl)
            for item in soup.findAll('a', attrs={'class': 'article_title'}):
                articles.append({
                    'url': 'https://www.instapaper.com' + item['href'],
                    'title': item['title']
                })
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X6����intelligencer.png�PNG


IHDR  D����PLTE# %"% "% %   			  " 			"#  		' #' "���(tRNS@��f�IDATx^����� ��O��r�84
MH�e��� /�[6��=�CDu""ڃAEC��.�X��hzs ��1��R+.}���\;b�;�+U ������9`��q�����x��PJ]��.u̦i�A,s��> �B��P	����*w����+��o�r8�uzD3P����N@�x��Kp@���q!�43IEND�B`�PK�X�|>��intelligencer.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
Inteligencer.ca
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Inteligencer(BasicNewsRecipe):
    title = u'Intelligencer'
    oldest_article = 7
    max_articles_per_feed = 100
    encoding = 'utf-8'
    language = 'en'

    no_stylesheets = True
    use_embedded_content = False
    lang = 'en-CA'

    conversion_options = {
        'language': lang, 'pretty_print': True
    }

    remove_attributes = ['style', 'width', 'height',
                         'font', 'border', 'align', 'action', 'onload']

    keep_only_tags = [dict(name='td', attrs={'colspan': '2'})]

    remove_tags = [
        dict(name=['object', 'link', 'embed', 'iframe']), dict(
            name='div', attrs={'id': 'header'})
    ]
    feeds = [(u'Recent News', u'http://www.intelligencer.ca/rss/')]

    def print_version(self, url):
        return url.replace('/ArticleDisplay.aspx?', '/PrintArticle.aspx?')

    def preprocess_html(self, soup):
        for item in soup.findAll('td'):
            del item['colspan']
            item.name = 'div'
        return soup
PK�X�q���interfax.png�PNG


IHDR@@%��IDATx��Zt��cff&33sؖ��03G��C���
�N����̤�k��dtO��=�[[��H������
~hh��C@@.������bЫ����@�\��yWw�99�~�ͪ#G�n۾d��%[�	��l�kj��@����{���/J|��
36a�t
�_z�k�\�*�P�T��-]��-����av����VG�;]\�pv����>w���Z�=D��G�<:l<}�����.����d6�L�@����b@I_XQ~��33���Gfb ����#&��{��G�|+8D)P�!1'�I�X��m��щ�,^r�̚����R��b@ɐ�w�Ӈ��rfe���
-����j�'\�D$�dMqe�N� +�_���|@�_+�/"��+W�h�.����1�md�������vx'��۸�c52q����~H���I�$j�(I���C�a��
�_����&�5"��[������2�@���� ���8�����]\�LI�M��|�PGy.��C�"��$	:���J����_TQy 5u��-����11Ҙ�ظ�����i�X�K��'h�n6v�)�豦cǾ �]�}�z�fj[_RU��p��Ĕ	}��>��C�E���8��\j��#Z �Y�p�[�-_�>s�P�|���lt5���N>�����'F����#�4l��z2�1e�6G'���w�8@�?�d4��

C�{⯿�kjZ��P\뛛��Ϥ�����8�������1�tZ�o��ihB+��Hs5���1Kk8^\~��`�뛛�Sj?q���[Rr�vU�$6/���f��/��\y�zn��#�߯�\=mقK]]}
��Y�Y�����3(�놅�9�"�m�,�$���}����P�Cv�{@�k/���[Nq�-������\��>g(7�#�@���O?U������U��!7��gQ|�
�D2@�cv�����)��Հ@�?���K�r2M���xfm<�#!��L����\�MͿ;w����DŢ���\�֫��u�L\%��?8cͯr���~�A<���m߁��"�$q߾c��=@�#&�~1KK�~e�l�ɏ?rS!��e�]��{zx"��Z�h� �`���ի1!H&��D_p����NJZq�p^Y�CmC��w����흝�Û[[7��ʣG+*���.(��1�L�8����ꄆ�vt`?�&[;�<���w�Q��g>��'�߳����W��q9ޛ��^�����k)��>��{�<솕h$m'Mnnk���+�A��i��l�MM���0�z�$���<fk���)'�ݔ�(w��?9jtK{�U���Kg��\��f;������w*�}�[�s@h7^
az)'NP�+7�Y	
l5(�?��s�ܩ�� �~�-}���$�՗�;��z��y+4�b����SSѢ����;�������`J��T�{��(�u�� ��@��D>�퍷UV���~��UT���uRn�A�7m�h���a�Tބ넆+"�9�xb��|�={�ы�[�;w��_�ݳ��A�<e5����m�'�;MƎco�PZ����@�{|�(��4|�|�.W�g|$�x������z����w
a�E��7�Y9��w⊕�7@P���˗�7�r�1C�ŀ}��{@��W*�,]$�>J9~��[#(;�**��3���k�r�Ӝ��a��1m�Z��S-��g��/��/�^����6Y�LF�&��+1�7(FW�t��z�Y����ȿ�Lz:6Q��7�dF&H�ώ�xGg�YC�d��;����E���s��sAy�:��Z5��n��j��	�sQE��Ѐ�'��~���� �4�Y�]]��"D�^+���L��4�fj��?%�C]�.��h=Ǡ:r5�W�>1�׻�|{������޿��[RZY[[P^ny/ZLkKt�PL��2��_Fky>��Pℙ�Z�8b�P
{h{�º���GhB��A�g����g|��c��
�~lW�p���>32뉓��='G�w"��ʈ�����	G̟�;\����ԩ���7�Eɇf���k?~UtTͥ��p1�1~�$ǩ�Ŗ�����؏�U��
�94%IEND�B`�PK�X�s�6UUinterfax.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class InterfaxUAEN(BasicNewsRecipe):
    title = 'Interfax-Ukraine'
    __author__ = 'bugmen00t'
    description = 'The Interfax-Ukraine News Agency, founded in 1992, is subsidiary of Interfax Information Services.'
    publisher = 'Interfax-Ukraine News Agency'
    category = 'newspaper'
    cover_url = u'https://interfax.com.ua/static/articles/images/interfax_ukraine_logo_eng.svg'
    language = 'en_UK'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 3
    max_articles_per_feed = 30

    remove_tags_before = dict(
        name='article', attrs={'class': 'article article-content-view'}
    )

    remove_tags_after = dict(
        name='article', attrs={'class': 'article article-content-view'}
    )

    remove_tags = [
        dict(name='div', attrs={'class': 'grid article-content-secondary-header'}),
        dict(name='div', attrs={'class': 'article-tags'}),
    ]

    feeds = [('Latest news', 'https://en.interfax.com.ua/news/last.rss')]
PK�X���llinterfax_ua.png�PNG


IHDR  D����PLTE������==���;;88������=@���@B���=ZZ���25@@�����;=��˹��������������BD���8;������߼�������������������Yrs2RR���_ww�����Yrr_{{Pgg���.NPn��������������DF�����秲������DD������2TT���@@��������������BB������+LL�����񪴴���`ss������.PRn��������k�����������z��8WW��ᴾ�Hbc������`tuF_`�2WW;ZZ��������~����„����Ǐ�����������w����À��������bww������Fbb���;UW���'HH���i{{���.PPF`b���v��2PR�����ٔ�������������Ҷ��������r����쓟�58HH����պ��w�]�VIDATx��R�b.1�L��m�ضm�6j�6_����A6�RjO��g�ڻ/cG�r���`���Ϸ������/����1��=��K�(P`���Z�sK����Ѓ�i�_t]�x��9�*M����?��q*tF7鏜�JJ�y�xAsp�5$�+���c�Ư�b71~˒n�;�{�>S>�;D�Ɋ�Pa��O�=}&��H��Wx���L��񓚋z�~��0r�t�r +����4�E�`JE	�RYV^Q�y��kjM	�s����1�������Zi"��]�@wOo���ҁª��`j8��#��K����q����#�`:�O�` {�lb��3��ۘIEND�B`�PK�X�V"��interfax_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class InterfaxUAUA(BasicNewsRecipe):
    title = '\u0406\u043D\u0442\u0435\u0440\u0444\u0430\u043A\u0441-\u0423\u043A\u0440\u0430\u0457\u043D\u0430'
    __author__ = 'bugmen00t'
    description = '\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F \u043F\u0440\u043E \u043E\u0441\u0442\u0430\u043D\u043D\u0456 \u043F\u043E\u0434\u0456\u0457 \u0432 \u043F\u043E\u043B\u0456\u0442\u0438\u0446\u0456 \u0423\u043A\u0440\u0430\u0457\u043D\u0438, \u043A\u043B\u044E\u0447\u043E\u0432\u0456 \u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0456 \u0435\u043A\u043E\u043D\u043E\u043C\u0456\u0447\u043D\u0456 \u043D\u043E\u0432\u0438\u043D\u0438 \u0442\u0430 \u043E\u0441\u043D\u043E\u0432\u043D\u0456 \u043F\u043E\u0434\u0456\u0457 \u0432 \u043A\u0440\u0430\u0457\u043D\u0430\u0445 \u0421\u041D\u0414 \u0456 \u0441\u0432\u0456\u0442\u0443.'  # noqa
    publisher = '\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E \u00AB\u0406\u043D\u0442\u0435\u0440\u0444\u0430\u043A\u0441-\u0423\u043A\u0440\u0430\u0457\u043D\u0430\u00BB'  # noqa
    category = 'newspaper'
    cover_url = u'https://interfax.com.ua/static/articles/images/interfax_ukraine_logo_ukr.svg'
    language = 'uk'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 2
    max_articles_per_feed = 30

    remove_tags_before = dict(
        name='article', attrs={'class': 'article article-content-view'}
    )

    remove_tags_after = dict(
        name='article', attrs={'class': 'article article-content-view'}
    )

    remove_tags = [
        dict(name='div', attrs={'class': 'grid article-content-secondary-header'}),
        dict(name='div', attrs={'class': 'article-tags'}),
    ]

    feeds = [(
        '\u041D\u043E\u0432\u0438\u043D\u0438',
        'https://interfax.com.ua/news/last.rss'
    )]
PK�X�q���interfax_uk.png�PNG


IHDR@@%��IDATx��Zt��cff&33sؖ��03G��C���
�N����̤�k��dtO��=�[[��H������
~hh��C@@.������bЫ����@�\��yWw�99�~�ͪ#G�n۾d��%[�	��l�kj��@����{���/J|��
36a�t
�_z�k�\�*�P�T��-]��-����av����VG�;]\�pv����>w���Z�=D��G�<:l<}�����.����d6�L�@����b@I_XQ~��33���Gfb ����#&��{��G�|+8D)P�!1'�I�X��m��щ�,^r�̚����R��b@ɐ�w�Ӈ��rfe���
-����j�'\�D$�dMqe�N� +�_���|@�_+�/"��+W�h�.����1�md�������vx'��۸�c52q����~H���I�$j�(I���C�a��
�_����&�5"��[������2�@���� ���8�����]\�LI�M��|�PGy.��C�"��$	:���J����_TQy 5u��-����11Ҙ�ظ�����i�X�K��'h�n6v�)�豦cǾ �]�}�z�fj[_RU��p��Ĕ	}��>��C�E���8��\j��#Z �Y�p�[�-_�>s�P�|���lt5���N>�����'F����#�4l��z2�1e�6G'���w�8@�?�d4��

C�{⯿�kjZ��P\뛛��Ϥ�����8�������1�tZ�o��ihB+��Hs5���1Kk8^\~��`�뛛�Sj?q���[Rr�vU�$6/���f��/��\y�zn��#�߯�\=mقK]]}
��Y�Y�����3(�놅�9�"�m�,�$���}����P�Cv�{@�k/���[Nq�-������\��>g(7�#�@���O?U������U��!7��gQ|�
�D2@�cv�����)��Հ@�?���K�r2M���xfm<�#!��L����\�MͿ;w����DŢ���\�֫��u�L\%��?8cͯr���~�A<���m߁��"�$q߾c��=@�#&�~1KK�~e�l�ɏ?rS!��e�]��{zx"��Z�h� �`���ի1!H&��D_p����NJZq�p^Y�CmC��w����흝�Û[[7��ʣG+*���.(��1�L�8����ꄆ�vt`?�&[;�<���w�Q��g>��'�߳����W��q9ޛ��^�����k)��>��{�<솕h$m'Mnnk���+�A��i��l�MM���0�z�$���<fk���)'�ݔ�(w��?9jtK{�U���Kg��\��f;������w*�}�[�s@h7^
az)'NP�+7�Y	
l5(�?��s�ܩ�� �~�-}���$�՗�;��z��y+4�b����SSѢ����;�������`J��T�{��(�u�� ��@��D>�퍷UV���~��UT���uRn�A�7m�h���a�Tބ넆+"�9�xb��|�={�ы�[�;w��_�ݳ��A�<e5����m�'�;MƎco�PZ����@�{|�(��4|�|�.W�g|$�x������z����w
a�E��7�Y9��w⊕�7@P���˗�7�r�1C�ŀ}��{@��W*�,]$�>J9~��[#(;�**��3���k�r�Ӝ��a��1m�Z��S-��g��/��/�^����6Y�LF�&��+1�7(FW�t��z�Y����ȿ�Lz:6Q��7�dF&H�ώ�xGg�YC�d��;����E���s��sAy�:��Z5��n��j��	�sQE��Ѐ�'��~���� �4�Y�]]��"D�^+���L��4�fj��?%�C]�.��h=Ǡ:r5�W�>1�׻�|{������޿��[RZY[[P^ny/ZLkKt�PL��2��_Fky>��Pℙ�Z�8b�P
{h{�º���GhB��A�g����g|��c��
�~lW�p���>32뉓��='G�w"��ʈ�����	G̟�;\����ԩ���7�Eɇf���k?~UtTͥ��p1�1~�$ǩ�Ŗ�����؏�U��
�94%IEND�B`�PK�X�F�##interfax_uk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class InterfaxUARU(BasicNewsRecipe):
    title = '\u0418\u043D\u0442\u0435\u0440\u0444\u0430\u043A\u0441-\u0423\u043A\u0440\u0430\u0438\u043D\u0430'
    __author__ = 'bugmen00t'
    description = '\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0445 \u0441\u043E\u0431\u044B\u0442\u0438\u044F\u0445 \u0432 \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0435 \u0423\u043A\u0440\u0430\u0438\u043D\u044B, \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0438\u0435 \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438 \u0438 \u043E\u0441\u043D\u043E\u0432\u043D\u044B\u0435 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0432 \u0441\u0442\u0440\u0430\u043D\u0430\u0445 \u0421\u041D\u0413 \u0438 \u043C\u0438\u0440\u0430.'  # noqa
    publisher = '\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E \u00AB\u0418\u043D\u0442\u0435\u0440\u0444\u0430\u043A\u0441-\u0423\u043A\u0440\u0430\u0438\u043D\u0430\u00BB'  # noqa
    category = 'newspaper'
    cover_url = u'https://interfax.com.ua/static/articles/images/interfax_ukraine_logo_rus.svg'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 2
    max_articles_per_feed = 30

    remove_tags_before = dict(
        name='article', attrs={'class': 'article article-content-view'}
    )

    remove_tags_after = dict(
        name='article', attrs={'class': 'article article-content-view'}
    )

    remove_tags = [
        dict(name='div', attrs={'class': 'grid article-content-secondary-header'}),
        dict(name='div', attrs={'class': 'article-tags'}),
    ]

    feeds = [(
        '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
        'https://ru.interfax.com.ua/news/last.rss'
    )]
PK�X
~�Kff
intrefete.png�PNG


IHDR��h6-IDATx�e�1N�@EgǶ@I�Q���3 q���4�tT�Q�E ����N���Z3~zݼ�xͨ�]u1�Y���y\\�r�Hdz��ό2\�
#3+'vth�Y��J
��y6=�|����)��)
���g,Dy�X�qg���0)5/����zծBʒ��L$Jۺ�!�Մ0ڷ��8����O�˫���wC���*h��T�F������h��nIP��
誰(1�?$��5L]��t
PN_��]w1(\�{�1��_���a28��'�<��fww+�Ϡp����a�7IEND�B`�PK�X�[^>>intrefete.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
intrefete.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Intrefete(BasicNewsRecipe):
    title = u'\u00centre fete'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Petrece ziua cu stil, afl\u0103 ce e nou \u00eentre fete'
    publisher = u'Intre fete'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Femei'
    encoding = 'utf-8'
    cover_url = 'http://storage0.dms.mpinteractiv.ro/media/2/1401/16788/5878693/5/logo.jpg?width=300'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'article'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['author']}), dict(name='div', attrs={
            'class': ['tags']}), dict(name='iframe', attrs={'scrolling': ['no']})
    ]

    remove_tags_after = [
        dict(name='iframe', attrs={'scrolling': ['no']})
    ]

    feeds = [
        (u'Feeds', u'http://www.intrefete.ro/rss/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X!$�HHio9.png�PNG


IHDR�aIDATx�]�3�dY�'Oy�w����m�l��ݯK��mW��նU56�7fp}�s��r��\.w�ؙ�y�������p+mR���T��^���������o\v��1f����84�gȚ&��%w�0&X]f�������b��'�g�z���T62��jU����Qh���JT�22��l�
S�z�K'n8���oh����p���Wv�W����
S�g����Z:��v�� ��vኃ��|����'7q�̈B��:%���Pr>w��1�����:9C����%�-a�rt� �Ye'ӑ����.n`�X�a?��Ȑ��3���i��`�?B�V�lz
yE�Z��)R-!.�3���ǧ?��s8eV���D�a"��5�4;M1�2��V���b"�a5<͘)�Ihe�������>�
2��N��kV2��:Lp��N�~�=�v5g6O���Jtg7%�j?�B;�F9A���vƸ5F���U�2_�����Ll��#���
YI�f%�
"Q���j�M�|���^J��A���RE�_�P��T���W�(�G]߅�����I���M�Ƕ�襇����s9���?.ec��|Cȋ��w�!ji��H����'���z���A�����Ҏ%��uXE
?��&A�qnK6�;��f��Ɂ�qU��n�s�3ԧE]Ղ������[����9>��O���@�h���&L%��#O�+����r�u,�̝��g�c'�].�h��4��/����˯2���.狦�"0;��IEND�B`�PK�X��O�%%
io9.recipe__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
io9.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class i09(BasicNewsRecipe):
    title = 'io9'
    __author__ = 'NA'
    description = "io9, We Come From the Future."
    publisher = 'io9.com'
    category = 'news, science, education'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    auto_cleanup = True
    language = 'en'
    masthead_url = 'http://cache.gawkerassets.com/assets/io9.com/img/logo.png'
    extra_css             = '''
    body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
    img{margin-bottom: 1em}
    h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
                  '''
    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Articles', u'http://feeds.gawker.com/io9/vip?format=xml')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�Y���
iol_za.png�PNG


IHDR��h6�IDATx�%�]h�a��y����-���R�LSj�Q�܉���P�U7[�*6f$KP`+��Zb�m�X�Ύ�p^����}U�?�� h�B��&0f@�}�Y� 4t7`�h����3@!3�#�M5mƙ�x��ր�0�	B�`����Z���u�y�0���c�?17���Z]�m�ΦK������?y��r�q��m��_aLOﻍ���鱗V��s]�^v�v�c�R��G�n]�mƜ��]����l&�vܾ�ffjjkU,>�"�@�����C�
�C}KbTY4Un�ز4?bY�[/=|pǂ�LҶUD����gQ�<U09���f�@��8�Ӯ���˙Ԕ�v)%B��2��l��vS�p2�I�I�\�_T|���
5�D�gb���GƱ����҃��85�e�ۗ?�<����yJ=�z^^Q�|��5�do�@��N+bʚmc����+H�[J���Y�:�@k[X&�O�=ٸwO��:0y2:02T/+�#�F��--~�}�\Q�'�wh`P^mk�x��k<oF��Λ�O�H���N�-��X	%U4�Og�؃!fh `��Ik&�B�&kf�h��5� "��)�
�`���B0�����B(a��
B��-K���*K�IEND�B`�PK�XR'�N88
iol_za.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.iol.co.za/news
'''

from calibre.web.feeds.news import BasicNewsRecipe


class IOL_za(BasicNewsRecipe):
    title = 'IOL News'
    __author__ = 'Darko Miletic'
    description = "South Africa's Premier Online News Source. Discover the world of IOL, News South Africa, Sport, Business, Financial, World News, Entertainment, Technology, Motoring, Travel, Property, Classifieds and more."  # noqa
    publisher = 'Independent Newspapers (Pty) Limited.'
    category = 'news, politics, South Africa'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    auto_cleanup = False
    language = 'en_ZA'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    masthead_url = 'http://www.iol.co.za/polopoly_fs/iol-news5-1.989381!/image/464471284.png_gen/derivatives/absolute/464471284.png'
    extra_css             = """
                                body{font-family: Arial,Helvetica,sans-serif }
                                img{display: block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['object', 'embed', 'iframe', 'table', 'meta', 'link'])]
    keep_only_tags = [
        dict(attrs={'class': ['article_headers', 'byline', 'aticle_column']})]

    feeds = [

    (u'News', u'http://iol.co.za/cmlink/1.640'),
    (u'Business', u'http://www.iol.co.za/cmlink/1.730910'),
    (u'Sport', u'http://iol.co.za/cmlink/sport-category-rss-1.704'),
    (u'World', u'http://iol.co.za/cmlink/news-world-category-rss-1.653'),
    (u'Africa', u'http://iol.co.za/cmlink/news-africa-category-rss-1.654')
    ]
PK�XU1T��ionline_pt.png�PNG


IHDR��h6~IDATx�݋�jTq���?7�!I$M�.�"���
�Vb)��+�Z	ڈ�&`!�(����7{s�=�U:[��b`�����a+��0Zy1h�x��~9m��s�Fí������kL$�x�7��������FQM��fmko��09fExX
'�&���=z1;*��)�,��yJ)Ǥ\^�ǽ��tmse7G�HA�ZH)�`������]#���\Z��~��t	���T�d�1�������?r���G�8Q�O��2LK���e�ك��-[ە_��G/��mI!�G2L
k[�Mm�̧B6��Ì@:Hf�(�dz�98��C�oUBg�� 6+߻n����87�����U���[-;�AJ�л��.IEND�B`�PK�X��L���ionline_pt.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.ionline.pt
'''

from calibre.web.feeds.news import BasicNewsRecipe


class IOnline_pt(BasicNewsRecipe):
    title = 'ionline - Portugal'
    __author__ = 'Darko Miletic'
    description = 'News from Portugal'
    publisher = 'ionline.pt'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'pt'
    extra_css = ' .publish{font-style: italic; line-height: 1.2em; border-bottom: 1px dotted; padding: 5px 0} .entity{line-height: 1.2em} .overview{line-height:1.2em} '  # noqa

    conversion_options = {
        'comment': description, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(name=['h5', 'h1']), dict(name='div', attrs={
            'class': ['publish', 'overview', 'entity']})
    ]

    remove_tags = [
        dict(name=['object', 'embed', 'iframe'])
    ]

    feeds = [

    (u'Portugal', u'http://www.ionline.pt/rss/portugal.xml'),
    (u'Mundo', u'http://www.ionline.pt/rss/mundo.xml'),
    (u'Dinheiro', u'http://www.ionline.pt/rss/dinheiro.xml'),
    (u'Desporto', u'http://www.ionline.pt/rss/desporto.xml'),
    (u'Boa Vida', u'http://www.ionline.pt/rss/boavida.xml'),
    (u'iReporter', u'http://www.ionline.pt/rss/ireporter.xml'),
    (u'iBloges', u'http://www.ionline.pt/rss/iblogues.xml'),
    (u'Desporto', u'http://www.ionline.pt/rss/desporto.xml')
    ]

    def print_version(self, url):
        rest = url.rpartition('/')[2]
        lmain = rest.partition('-')[0]
        lurl = u'http://www.ionline.pt/interior/index.php?p=news-print&idNota=' + lmain
        return lurl
PK�X&��__iprofesional.png�PNG


IHDR��h6&IDATx�_KSa��+	���}@�:M 
� ��
�i�E�dXJ!���.-���JZ&��6)�b6�LK��y��&��Ƀ�` IF�Lf�&�`�@��r�2����l��Jfq5��ˮn�@ L�V��H�*'���w$]u�~ie��{�ox2�������1�K��l>Y\�,�oy ~����!�<&��Bˁ�k���$��ܸ`7�bU
5��|���XE�`z6'H!ɡ�߲�����
�݃Ս�x]vu#��	S�T<�iCH��,�L�B���tI��V{��!�
��w�0��#UZ���8u�IÃ�jۻ_OȜ��������N�?<Ts5r&I�0��1`�6vz�����'O&�L�	o$��[��h��o�ߛ��DˣW 	�7�/���{����9�ώM̗�������DD�;]Ea��(}cie�)��ů}�[]�C�L;�h���o'�R�ӽ#����/�H�p`p��	0&0���aG��pIEND�B`�PK�X��iprofesional.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

__copyright__ = '2011-2016, Darko Miletic <darko.miletic at gmail.com>'
'''
www.iprofesional.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class iProfesional(BasicNewsRecipe):
    title = 'iProfesional.com'
    __author__ = 'Darko Miletic'
    description = 'Las ultimas noticias sobre profesionales'
    publisher = 'Emprendimientos Corporativos S.A.'
    category = 'news, IT, impuestos, negocios, politics, Argentina'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'es_AR'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    masthead_url = 'http://www.iprofesional.com/img/header/logoiprofesional.png'
    extra_css             = """
                               body{font-family: "Open Sans", sans-serif}
                               img{margin-bottom: 0.4em; display:block}
                               .tituloprincipal{font-family: WhitneyBold, Arial, sans-serif;
                                                font-weight: bold;
                                                font-size: x-large;
                                                display: block; margin-bottom: 1em;}
                               .bajadanh{font-size: small; display: block; margin-bottom: 1em;}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
                       dict(name='div', attrs={'class': lambda x: x and 'tituloprincipal' in x.split()})
                       ,dict(name='div', attrs={'class': lambda x: x and 'bajadanh' in x.split()})
                       ,dict(name='div', attrs={'class': lambda x: x and 'datosautornh' in x.split()})
                       ,dict(name='div', attrs={'class': lambda x: x and 'fotonotanh' in x.split()})
                       ,dict(name='div', attrs={'class': lambda x: x and 'contenidonotanh' in x.split()})
                     ]
    remove_tags = [
        dict(name=['meta', 'link', 'base', 'embed', 'object', 'iframe'])]

    feeds = [

    (u'Ultimas noticias', u'http://feeds.feedburner.com/iprofesional-principales-noticias'),
    (u'Finanzas', u'http://feeds.feedburner.com/iprofesional-finanzas'),
    (u'Impuestos', u'http://feeds.feedburner.com/iprofesional-impuestos'),
    (u'Negocios', u'http://feeds.feedburner.com/iprofesional-economia'),
    (u'Comercio Exterior', u'http://feeds.feedburner.com/iprofesional-comercio-exterior'),
    (u'Tecnologia', u'http://feeds.feedburner.com/iprofesional-tecnologia'),
    (u'Management', u'http://feeds.feedburner.com/iprofesional-managment'),
    (u'Marketing', u'http://feeds.feedburner.com/iprofesional-marketing'),
    (u'Legales', u'http://feeds.feedburner.com/iprofesional-legales'),
    (u'Autos', u'http://feeds.feedburner.com/iprofesional-autos'),
    (u'Vinos', u'http://feeds.feedburner.com/iprofesional-vinos-bodegas')
    ]
PK�X��}���irish_independent.png�PNG


IHDR  szz��IDATx���d�a��圙L8��Lf�L2r&�$$ə9!�&330!9�LB����I�L�If��d�d23���?�^���{s>������{�>9�rgerk:�>���؁`�(@T3=���b���U����^8�M�G�v�3W�x��q�0Ђ8��I��wR��5 ����
��
��BO���q~�5�SY�3�-L�3�BЊ�A]��:�0kևOs��ф�'�kJ�y������9\��5�QA�v��ͽ��r:��%�7͋�0�#���	��Cso�SD�Kk=�=�S�Qո�D�#�����;h=
����:1���0�qG댝R�۸����bd;
���A����P�ze�6=�L�5���m��wMo)�^���56���D��~�3�	��v�-M������7�2�?��<��K�~93�������S5��b͌Ϩ=�C6ɉ��]�n���8T��	Ku�sb��#H Q5�b<����&
�B�f=�[�x|I|,ׇ?���#���<��i�!j����3�4�
q
bcų�C|R��ro����t�K�$���F�� N�Cv-�YxOPG�*v_H�/��yN�QBIEND�B`�PK�X�1����irish_independent.recipe__license__ = 'GPL v3'
__copyright__ = '2009 Neil Grogan'
#
# Irish Independent Recipe
#

from calibre.web.feeds.news import BasicNewsRecipe


class IrishIndependent(BasicNewsRecipe):
    title = u'Irish Independent'
    description = 'Irish and World news from Irelands Bestselling Daily Broadsheet'
    __author__ = 'Neil Grogan'
    language = 'en_IE'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    ignore_duplicate_articles = {'url'}

    keep_only_tags = [
        dict(name='div', attrs={'class':lambda x: x and '_contentwrapper' in x})
    ]

    remove_tags = [
        dict(name=['svg', 'button']),
        dict(name='div', attrs={'data-testid':['article-share', 'embed-video', 'inline-related-wrapper']})
    ]

    feeds = [
        ('Frontpage News', 'http://www.independent.ie/rss'),
        ('World News', 'http://www.independent.ie/world-news/rss'),
        ('Opinion', 'http://www.independent.ie/opinion/rss'),
        ('Business', 'http://www.independent.ie/business/rss'),
        ('Sport', 'http://www.independent.ie/sport/rss'),
        ('Life', 'http://www.independent.ie/life/rss'),
        ('Style', 'http://www.independent.ie/style/rss'),
        ('Entertainment', 'http://www.independent.ie/business/rss'),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll(attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X{R�ttirish_times.png�PNG


IHDR  D����PLTE���vvv������!!!   """'''((()))666===BBBVVV___gggmmmqqqrrrsss���������������������������������������������������-���tRNS�����IDATx��EB1�Mpww���x��%6��|m��6�)Fcn_��y-e>F�v"�|)^q@�;�֖]��y�.3w�	���|/X�^�)��v�d�R���B��)��n��@3sh�Oo�����ScA��Q{R@>z�ᕎ���T�J��IEND�B`�PK�XJ�.�<<irish_times.recipe__license__  = 'GPL v3'
__copyright__ = "2008, Derry FitzGerald. 2009 Modified by Ray Kinsella and David O'Callaghan, 2011 Modified by Phil Burns, 2013 Tom Scholl, 2016 by leo738"
'''
irishtimes.com
'''
import json
from uuid import uuid4
from mechanize import Request
try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode

from calibre.web.feeds.news import BasicNewsRecipe, classes


class IrishTimes(BasicNewsRecipe):
    title          = u'The Irish Times'
    __author__    = "Derry FitzGerald, Ray Kinsella, David O'Callaghan and Phil Burns, Tom Scholl"
    description = 'Daily news from The Irish Times'
    needs_subscription = True

    language = 'en_IE'

    masthead_url = 'http://www.irishtimes.com/assets/images/generic/website/logo_theirishtimes.png'

    encoding = 'utf-8'
    oldest_article = 1.0
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    remove_empty_feeds = True
    no_stylesheets = True
    temp_files = []
    keep_only_tags = [
        classes('custom-headline custom-subheadline lead-art-wrapper article-body-wrapper byline-text'),
    ]
    remove_tags = [
        dict(name='button'),
        classes('sm-promo-headline top-table-list-container single-divider interstitial-link'),
    ]
    remove_attributes = ['width', 'height']
    
    def get_cover_url(self):
        from datetime import date
        cover = 'https://img.kiosko.net/' + date.today().strftime('%Y/%m/%d') + '/ie/irish_times.750.jpg'
        br = BasicNewsRecipe.get_browser(self, verify_ssl_certificates=False) 
        try:
            br.open(cover)
        except:
            index = 'https://en.kiosko.net/ie/np/irish_times.html'
            soup = self.index_to_soup(index)
            for image in soup.find('img', attrs={'src': lambda x: x and x.endswith('750.jpg')}):
                if image['src'].startswith('/'):
                    return 'https:' + image['src']
                return image['src']
            self.log("\nCover unavailable")
            cover = None
        return cover

    def parse_index(self):
        soup = self.index_to_soup('https://www.irishtimes.com/')
        section = 'Home page'
        articles = []
        feeds = []
        for x in soup.findAll(name=['h3', 'article']):
            if x.name == 'h3':
                if 'writer_description' in x.get('class') or '':
                    continue
                articles and feeds.append((section, articles))
                section = self.tag_to_string(x)
                articles = []
                self.log('Section:', section)
                continue
            a = x.find('a', attrs={'class': lambda x: x and 'primary-font'}, href=True)
            if a is None:
                a = x.find('a', attrs={'class': lambda x: x and 'promo-headline' in x}, href=True)
            if a:
                q = ''.join(a['class'])
                if 'secondary-font' in q and section == 'Home page':
                    continue
                title = self.tag_to_string(a)
                url = a['href']
                if url.startswith('/'):
                    url = 'https://www.irishtimes.com' + url
                articles.append({'title': title, 'url': url})
                self.log('\t', title)
        articles and feeds.append((section, articles))
        return feeds

    def get_browser(self):
        # To understand the signin logic read signin javascript from submit button from
        # https://www.irishtimes.com/signin

        br = BasicNewsRecipe.get_browser(self, user_agent='curl/7.80.0')
        ip_data = json.loads(br.open('https://ipapi.co//json').read())
        br = BasicNewsRecipe.get_browser(self)
        url = 'https://www.irishtimes.com/signin'
        deviceid = str(uuid4()).replace('-', '')
        # Enable debug stuff?
        # br.set_debug_http(True)
        br.open(url).read()
        from pprint import pprint
        pprint(ip_data)
        br.set_cookie('IT_country', ip_data['country_code'], '.irishtimes.com')
        br.set_cookie('IT_eu', 'true' if ip_data['in_eu'] else 'false', '.irishtimes.com')
        rurl = 'https://www.irishtimes.com/auth-rest-api/v1/paywall/login'
        rq = Request(rurl, headers={
            'Accept': '*/*',
            'Accept-Language': 'en-US,en;q=0.5',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Origin': 'https://www.irishtimes.com',
            'Referer': url,
            'X-Requested-With': 'XMLHttpRequest',
            'sec-fetch-site': 'same-origin',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
        },  data=urlencode({'username': self.username, 'password': self.password, 'deviceid':deviceid, 'persistent':'on', 'rid': ''}))

        r = br.open(rq)
        raw = r.read()
        data = json.loads(raw)
        # print(data)
        if r.code != 200 or b'user_id' not in raw:
            pprint(data)
            raise ValueError('Failed to log in check username/password')

        # Set cookie
        br.set_cookie('IT_PW_AUTH', data['varnish_id'], '.irishtimes.com')

        # br.set_debug_http(False)
        return br
PK�X&o�
�
irish_times_free.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from calibre.ptempfile import PersistentTemporaryFile

class IrishTimes(BasicNewsRecipe):
    title          = 'The Irish Times (free)'
    __author__    = 'unkn0wn'
    description = 'Daily news from The Irish Times'
    language = 'en_IE'

    masthead_url = 'http://www.irishtimes.com/assets/images/generic/website/logo_theirishtimes.png'

    encoding = 'utf-8'
    max_articles_per_feed = 50
    remove_empty_feeds = True
    no_stylesheets = True

    keep_only_tags = [
        classes('custom-headline custom-subheadline lead-art-wrapper article-body-wrapper byline-text'),
    ]
    remove_tags = [
        dict(name=['button', 'svg']),
        classes('sm-promo-headline top-table-list-container single-divider interstitial-link'),
    ]

    remove_attributes = ['width', 'height']
    ignore_duplicate_articles = {'title'}
    resolve_internal_links  = True
    articles_are_obfuscated = True

    def get_cover_url(self):
        from datetime import date
        cover = 'https://img.kiosko.net/' + date.today().strftime('%Y/%m/%d') + '/ie/irish_times.750.jpg'
        br = BasicNewsRecipe.get_browser(self, verify_ssl_certificates=False) 
        try:
            br.open(cover)
        except:
            index = 'https://en.kiosko.net/ie/np/irish_times.html'
            soup = self.index_to_soup(index)
            for image in soup.find('img', attrs={'src': lambda x: x and x.endswith('750.jpg')}):
                if image['src'].startswith('/'):
                    return 'https:' + image['src']
                return image['src']
            self.log("\nCover unavailable")
            cover = None
        return cover

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/', '/podcast'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article', link['href'])
            self.abort_article('skipping video links')

        self.log('Found', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            # Reduce image sizes to get file size below amazon's email
            # sending threshold
            self.web2disk_options.compress_news_images = True
            self.web2disk_options.compress_news_images_auto_size = 5
            self.log.warn('Kindle Output profile being used, reducing image quality to keep file size below amazon email threshold')

    feeds = []

    sections = [
        'ireland', 'world', 'opinion', 'politics', 'crime-law', 'culture', 'business', 
        'life-style', 'health', 'sport', 'property', 'food', 'abroad', 'environment', 
        'obituaries'
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:irishtimes.com{}&hl=en-IE&gl=IE&ceid=IE:en'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    feeds.append(('Others', a.format('')))
PK�X�.R�FFisar-loisachbote.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�XU�]7LLisar-loisachbote.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Isar-Loisachbote'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Wolfratshausen', u'http://www.merkur-online.de/lokales/wolfratshausen/rssfeed.rdf'),
    (u'Region Wolfratshausen', u'http://www.merkur-online.de/lokales/wolfratshausen/landkreis/rssfeed.rdf'),
    (u'Geretsried', u'http://www.merkur-online.de/lokales/wolfratshausen/geretsried/rssfeed.rdf'),
    (u'Stasdt Wolfratshausen', u'http://www.merkur-online.de/lokales/wolfratshausen/wolfratshausen/rssfeed.rdf'),
    (u'M\xfcnsing', u'http://www.merkur-online.de/lokales/wolfratshausen/muensing/rssfeed.rdf'),
    (u'Dietramszell', u'http://www.merkur-online.de/lokales/wolfratshausen/dietramszell/rssfeed.rdf'),
    (u'K\xf6nigsdorf', u'http://www.merkur-online.de/lokales/wolfratshausen/koenigsdorf/rssfeed.rdf'),
    (u'Eurasburg', u'http://www.merkur-online.de/lokales/wolfratshausen/eurasburg/rssfeed.rdf'),
    (u'Icking', u'http://www.merkur-online.de/lokales/wolfratshausen/icking/rssfeed.rdf'),
    (u'Egling', u'http://www.merkur-online.de/lokales/wolfratshausen/egling/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X���8ddistorias.png�PNG


IHDR  D����PLTEL���WP��Q���ZU���X��\R��O��c��s��N����}^�ˍ����f]���^������V��P���]S����}��_���k����X�����Y��{��tM��z�������^��u���z��p����x���o������Ōf����y�Ɖa��b���[��nM��T�р����{f��e�Ƒ����km��Y�λƈ��|^��w����e��W�LjQ��\��W�ό����X�Î��Z��Y��`X�ϯ��������`����o�LJ��i��\m��w��_����s���g��s��h�Ĕ�������^n����c���h����m���r������ʁM�֓���ċ���S��U��Y�΁���������Lj`��b����e��s���[����r��a��������[}���Ʌ��g��i��������a��`�Ɖl������Čv���Ȇ��~|��x����R��|������ƉWIDATx���w�@�y�m�m��m۶͟��N��G�q��mt��#��6�c��x�����.�����2��W��D
�/��%eՠR_
�5/��?`�	,xjT���K#c2������S���G|� |�j���?~����of��dC��OQ�U&0�G�\��T^Q	U��w#D���7��ndM)%��!q"Z=��k���������˅6}��q�
8��Α`c�aA��|t�C\hId�B�`!*��S~>�'�����Ub��e.��R[!&HX\�X�WhX]�֔c����D�)0¢��o����1�n�){����==#�P$<�\��n�p6	�4�iIEND�B`�PK�X��i��istorias.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1501589422(AutomaticNewsRecipe):
    title          = 'Istòrias'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup   = True
    language       = 'sc'
    __author__     = 'tzium'

    feeds          = [
        ('Istòrias', 'http://www.istorias.it/feed'),
    ]
PK�X@e��'"'"istories.png�PNG


IHDR���^��!�IDATx�흅{I����������~���n�)/1���Bpw������3�
Ͱ�%��<3�>�,d�w���]�U�UՁ��럼��Y^�yiQQ~vVv���s�6��J��ۅ���3�ҭ���i�|�}M�F��t\�{'um;����O����+��|]İѳ��$�9��(//�G��˭-q�(x"��O����C��_�����>��i�2�y��7�տ9��-�
o�lzGT�z#�n8��Fr�7��?#�m<�#Zԏlvgx��hl�&�sw�C��^|jՏ_���[���_��HO|���I����݉q+��b֠^�h��V��h| �����V�Ƕ��\cZ���
Xc�F\��?�[ch��Ѿu>ѲAD�ہ���O��i�on�:�䮝 gzR)/��A'iN�ݳq�脗�������fwAh���ަ%H���!�É�x�lz'�T����
$��|�����#Z��xfL�o?g�I+-*t𢦗�����XƶL��“�a�#��U�>�pBى]��yr��ނ��&��3/�pʪ��N��q��AX6?'��g�9x����:��jϼ���3_��d�	]Z#fy ���`	w
H8��9�z�z�o'vlsBH�oP�l��ڴ��8��=�Tlb-E�7(�X����	�Zſ�t�o��Ƕm�x�Tyi��t��_8u�ؖM<����	�[G6�Cˡ�n��Z\G�l�N��X���\=�[�J.^�;%��-~��f�#[L�b�}lm��GR�
����!�.�<q���M��W�[4oW|�93�Μ�m����J�ٻpޡ�4�N�0b0�Up�8?����oF�����/2��'��ڰ?�i7��{�.�VP�u��i�
�� i��A24��W��2m��;�]�9|$-�b�O�$����=���k�rţ"�'�mx���
�wK&J&�h4�ѿG�k���S&IM>w�阙a��C��
ze	�fw� D���"Ƶ�/y�^���U��⢭3�L�*;��Vcv�&@�ُ��;�A~j���3-��>��,g�2�n�6��\`������s�C4�+�lIi�ُ���3�
�Ƨ���7j֠�(jO��\�	�V���r�u�}�\����,D��d�R�D�ş�wtujYI��^��|����9����0�	դ�sT�����<��X�H�.@�(�t�t���v_��bD�"1E�.LA{MSL��<��3��
2
�#��6ސ�?�޿�)�3�S~�ijϮ�"H��a �BU8�|�H�(���7�w��}{R�׆6BƂ����}��iqm��0g׏�@��46���w�omİ�9�=‡Eh���K�;�?d��v��L/d{�Xb��{����q��a��+��Q�-i��7�="�������;'#ݖ�7Ig�"�ne�I����:zy:�����Ԋ��)��l�O��e�!�[
�B>����@κ8�ݽ��f_K��]	L�i��-Ld9��W�;��;�/��c(uP%\��"�3���OO\9�����4c�Z����c9r�]�	���#	/?�1r9�`�)�;�]4ϴ<{���?eڢ&Ќak1��fDD�:���pp�O��t�T������a_J!BC<:(��Ъ:=�i�J`1\�-V����3�հ��a�-��xL
!��`tkÇ�=�q1����#iX&i#�c]�?�����+Mb*�3�[�C����8;����E�l��<��0e���!cx�xx����zṳ�L�^��]R������
���\������[��Zh�t�r�o�C^��;߬��F��lI
�PO>��s��_~_�Vl���7�vύǒ�G������Hƌ����X3�M��AH�%�9����6~�ރ�IČ�9�'�OZ%��k����o>�ȓ2�h�ˋ����DX���f���ԉ]ڰ�f���Q$-n&��^�'�0H�D��K4�~�c}��j�U0�wK3v�{I�����fl��̣��8�CF��	~ހ'����HGf��\��o�����%�w~�,\-�7��`�O�g~��@\̼�^a�CV,�
�D�Ȉ��e��=r�r!nj[��g�
�KO&�?��7�Ő8f�1�KJV|�v��tcr�
�Oȱ�!-�stU���3�"�'��{Q�e�p;Mf�+P:�X���f�s<�	��α����a��-����N���tG�B
RZX(�$�r��(�Ѭ�kk�_�>#q]�-�>�#���g����?Y ��?�a��V�=�k�	�bO��o�'M���|^�,��G?5�G�2� NQ~�hѐ��?���]/�>%��<cWN	`0B�E��@/-���\u����Em8�{�e��|���ʳ�%�ήc��s�=Z�ڶ��Џُ�).(���XG~V���$�P�-AUp��`QqBX��cG�F�_��eN�y�q��C���T��}�k(��O�����wnŖ�Sc�1�b�:�gq�׸��n��ktw}T��\M�c�Z�CՄ�r�C�~1L�'.N)%E�8�&��w�h����H'BLH���p�s�����$>!'5k`������vR#Kܿ DCu �B�\��;��O|�0�k��:bdg?�O>0�P&w��~1�p`�~%J��/��h��=d�����!�歕�t|�Vm��<-��G�kIc��c��()�>W�|�d�R����D�}�1�		��������E���<􇊥nA"l���U�a.�X��΅�ڹW2%�B���5[�l�FD\{��RbO	sf��_�~�c{��k���h��Pc6%��>��[�K�bU8�_�Ȭ�r
\}�K��_D��As;��u+��R�T]�uYq1�
d�vl������.��|�Y�]�
�wa��M�\E��@el�#v6ȃ?OG�%MD���s��߰��KIL�J'��B��s	<������
H_�����uQõ���~���[�gi�f۝��ԞIU���T��)��e���H�ACaFs�0S��-�=C�^w���J���	�ɜB[���5�� 1_��YlWZXD�;�aڟ��ު,E�5���Y��J��._�QV}d�;�AX�/�J/y�rP��J�&GP�U
���{���l��7?7�Ļ%��[�� ��w�J.Lz�=Z�kF�Q/.�8�=���3��
x��<3O
� ���P�aF��*x�I�R���Ж����lX��'�Bʯ?��t�<� �AQ���(�pԽ�:���n�L����E
��ސ��Τ�1�P#<A����ޗ|��n��뎒郧����~V/�}�'�f6�΀9�Jj)L�m*1��‰d��qC��9�v��@��]j��ԙ=s�e8�3Œ�Y�L��Sp��C�N.<טo��I������ ��7^4���<�6�{�	[Ui	�'��s�t	X�>x���S�Nay��.�*�G��?����=t��lڀ��f�}�$<q�A|�q��e��Tʣ$e��/c�h�#lǖ �چH��g����S:���b«�
��&m�KO��L���x�E�6���i=��r��>x��Lt@�J#9yW�P9��b�sO����Cj`����9V���
�Hr�Qv�Ζ�Hf�h'��Da�ԤVA��2�</eD$�����Z�S�e���x��x��P���i�'��À++��2���=|�
)RR�����!�]�b����\=�<�Oܞ�UhO��Nx��{��*w��}{�U�x�a����KKey��PST2�T�X�.E�'=���I�;1`��穪�!��<�Q�sM�aS0��ɓ|H�`o��X���T�ne[W��0��W$�a�jf̐�4�s+�NyHs�<���-3+�	��K�*�fM���l��XAۤ��H@<��F��b�aeb�Tv��n<k`Ϛ��r>�b��*��*��-�_~Z�@�΃�[���PLpFCʀJ�A�z���0��R���'���5aX�w;���������h�x�u�,�qa�]�r4���<
�����F�����
�]Q!^0�Tz����4�)V{����p^��<&����|��Q!QR�M&<xQ�9@�V�Ւَ��~��#Yx>x�^q�S'�g�ص-˼t��qsD���V�d�ۉ�8c�9��)"�cm�.L����
����:!F(c���p��L���S2�a���;'*�\A�D��<<�0*���#����Q��H��;��l�^��-[�����������H>��`���߆�y*E@�ߑ[�/D.U"�g��L1�,���I���"l烧����t�m�&]��
?��x@ZJZ:F��BZ8Z�n�lL&�W�������sc|�B�J�sh��PN�r����@B�*W!t惧H����t��0��,�h�����I�zn'����E'�C;1>�q�b��B��v�^�\��P#`�.��Cx�#\I84���>x�b�e���Fl:��
+!�!-XCm`�‚I��(�+/+,xYd*����C7
S�7��t����V��KFz:-�e���~��Ër���s��#X��c�7Zp����۔a�U�{�R���
������0ҙCrL'\ᘶ�H��߶�ڰ��=��Ul	�
�B���qԎ��ڌ�����]>x�0@��im��mv�u��+��
�Vݵ�A��2 %�
�L���b��/��G� �g�8YT.@*��I�_F;b��J��>Q��f*�Oup�r�aX�~r$��
!#�h�L<��)����>�{�I2tj91�:I�!��pw����+���ˤ,D��p��P�hBf�
�&���J)"�F�$���oG�L>������,
�Tg�T�hŷ_��@i	H�j�{�W�xq����Y�&��$�/�����,����h��=s@-����?oeO�Gu�\^H$WvnM������xT��@�ch@�ـ�Lf�W��լ�u�ത����r�8�M��[WKu
-�J��n
�(�f/�M�5���T!+T;[?�9����
�UA-{�%�?��������iA����;

��t�N<�aI(��Yʃ:|�a)&>=���W~��^�c���U<Vw)��a)Ո�'��<Z��4�
�;�s��EUp5�%��Etp�������"�YBr� ���]�zIv�(���ޞ_�*J�VT�j�d�qa��hh�ɰ�s�����q)������/�*��5��>Lu�+�KS�E%�dp_��9+E%�(i��Tx��߇~���U��SLT,�z�x��_��b���P�V�R�6ڈ�E�h\�XY�9�2v��T�׮z�|���C�*ES/ZAF�LS�%�@�tN'Iա:5c���^����
N���h~]�7��
.�,3���f�a�g����]c>�4? �{^����Ihf
L�'<w'��OӺ�5�2�6lݸ|΃�.�E"���R�&�.�A�<�	��Ɣ9�E�2Mw=,+pq\4�._(��3���pY԰��JO417�E^_֐�KN$bp:�.�6-]����.sgnAp���.Pb�
��?,�>�����|��YP�+���O�E^=�W�=�p\��)\sf���kQ�Ԉ<ȮB�W����Q
����)l���'�l	?vIM^�&�=� ֱKJ���q¤}vu� >˛��T��׵�8���,y`0�%Oh��u�s1�\�x֡��w���n*���jNޒz�2���V��Q5�Y-A�)�:��>Ȼ^]:\��fh��y�^�BP����rf�!������"0�Y��0��]N�Fm�I�[�
���%EaN5�Q�R>�-�g���4�0f���)�<����l��ש��!��u�=�}xKb�{�ة���Qb[��y��Ҫ��,:w�;���{�����p
��tv�R�N���6��*ü����%If��&Z�c�"�g�\��U��̀�E��?=��W|��A�f��k��|���e��r��o4���%M^)�(��o��;Z�WŽ�j�=��4A)"���%�����d������À���N��Qj��u�h��6�Ix����}��Y]��]�(��_�j����&J.��]��_~�a�ڃǤ~��~z��J:�K�E��f_�.i�N4��r@;�(��3�|ǏO���'4"�� }d�$�R��G��z������c'`-�w����DT���Aq|�Vx;��R}�|䌒���I�\ٌ[چ5��EQa����
��YVRL�4�_5~>r�B֥�X�S�9S��c�y��K��u	�?�-獝%��u�[/+$���/DM�?9�� ���#5����[A�7zJ]�g���|�R[Q1��?��M˿�\
���	X�?9��D+�&�R'"s�j#��<3)�>��:����Q�Z���Ԡ(/���x�JI��7<(X_��c���s�٘�1�� ��I�<�{5 ����_|
�@���B�"�]��>*�l�=x��=	�e�O�!?���?�u���rt��#�2�9��.���O���?�1�:�AGg�mw�vʯvz�8F�a&k���i)�\��Wf�=�xq|��Sĝj���D?�6���J������E���������N�\�0;�M�<�Y������'�]�
p�*O��\��R{g��ENj0g�V"�R�*+��
�Lp��	?����k�ւP���Ҕ�ɋ=F4c�q�]��
ഄ���N�,>p��`f�3�=��gֿ�k�ƶ��m��%���&�S[�ƒ��-��̑�%��aA���<&D�f��������<�ߩ=���e���U�E�l�‚��b�k_�2�pP���Q"�ʦ������*�bֹ���Wp�x��Ϡ
�c.m������Q	scaP��5-'a8��Ъ�Y�sB���	�Z�2��C<M(�Ĕ�D�6(�+�h_zU�Ux����a�Js��B�9�!4�
)�g�h\��[�E�Jf�3�(�c#W�{(�g�dB00���T'�#���9J������=��{-��S<��%ʢyؑ g��-��P y���]��g��y�q,?����wI�5�Q��}�).>��6E:��J"eR�����!�ch�1�2��:�Έ�P�,���GF`��'T�x�R�h��^���a�2Z�#wL؅�t	�b׆��S{v�n�e�)HK�4:a̮ټ�_AA)��\3�9��s��h�K�(�0�pBH����E�꧁����E�
���'�iB�.w57g]İ�D�V����=�9�y]c�I�ʊ�Oh
�h��#*	pTh=e׶3n��
�)!3�WW�<m0E ѨΗF��z>�Gy��ղ3ҝ5N�߇��X�`拸&�sX�����n��2[)��2�.*��߁�Cƿ��)L���"�"sMi�����	�W�"��1T�'�@�ù�K~�J�$�m����Oޣ=6�3�`�
G^A�5.0�����cq���b�S�
.�M����A�3ƍ�ڧ^$�iG�,v�(�KiI�9�Q�(P�2�*2Q�dy|�Ә��E��C�Q��g=և�E�_~(����;r�c}�E��c�M�-8o#�t�\W�I��`fq��/0x�!O��
�׉�z�~ϙ��Z�$8w�0ϑ�T���{p~�2�m���(0٭<�$[nр��h<���W���[�N����h�J
:@7(��mNf�D+���ޤ�ɘ�����mT�<8q�\B1�8�����h���"iqGQ���2�H�7Gun�9���]��ͣz'
8?���	#��^Ǐ�C�?
B�l:c�=�ن��$i��r�{�܅IE�>�0"9E, ��kp��=O�Z"��m��!b�Z��:��۶��X����I�
3u�H�L/fg�y`,�<�5�g�쌋N|�E�<d�4d�3���PˎY��n`���AQ;H�^���m��ɫ��F�l,������rr��a���15��"_G����@���sy�صڸ�xg��0:J.�aE��N���o܋OA>V/ؑ�Fyx�K{c����]����?��2�Lc-���h`�E�d���6�]n���R±d�3֛�	�׍�Qg��İ�3v&n{�4�Ed*�
E�i\K3.g�4��c���B�0&�=��n��c!8w�
l>x�2b�������t�Θ��ˏ	) �Z��D��@
�ݘ3��66��u�O<^���~�z=D08e��������8���`����v���T2ۢ���SM;&c�{�^J%
�c����u?8)?T13��Е����IEND�B`�PK�Xͯ���istories.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class IStories(BasicNewsRecipe):
    title = u'\u0412\u0430\u0436\u043D\u044B\u0435 \u0438\u0441\u0442\u043E\u0440\u0438\u0438'
    description = u'\u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0438\u0437\u0434\u0430\u043D\u0438\u0435, \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u0443\u044E\u0449\u0435\u0435\u0441\u044F \u043D\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u0441\u043A\u0438\u0445 \u0440\u0430\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u044F\u0445. \u041E\u0441\u043D\u043E\u0432\u0430\u043D\u043E \u0432 2020 \u0433\u043E\u0434\u0443 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u043C\u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u0430\u043C\u0438 \u0420\u043E\u043C\u0430\u043D\u043E\u043C \u0410\u043D\u0438\u043D\u044B\u043C \u0438 \u041E\u043B\u0435\u0441\u0435\u0439 \u0428\u043C\u0430\u0433\u0443\u043D.'  # noqa
    __author__ = 'bugmen00t'
    publisher = 'Roman Anin & Olesya Shmagun'
    publication_type = 'blog'
    oldest_article = 21
    max_articles_per_feed = 50
    language = 'ru'
    cover_url = 'https://static.istories.media/public/cover.png'
    auto_cleanup = False
    no_stylesheets = True

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='header'),
        dict(name='footer'),
        dict(name='form', attrs={'class': 'subscr'}),
        dict(name='div', attrs={'class': 'row'}),
        dict(name='div', attrs={'class': 'arrow-black'}),
        dict(name='div', attrs={'class': 'article-foot'}),
        dict(name='div', attrs={'class': 'article-toggle'}),
        dict(name='div', attrs={'class': 'article-soc'})
    ]

    feeds = [(
        u'\u0438\u0441\u0442\u043E\u0440\u0438\u0438',
        'https://istories.media/rss/all.xml'
    )]
PK�X�����ivanamilakovic.png�PNG


IHDR  ��IDATx^UTK�%U���Uu��ٴ�  ��H'0�IN�N9t��_`ԑ��� ����tl��44p��}��Yu�j�]u$w=n��Uk}k}�>z�_M&�j3;���/�me��y^�T)�ݬ�i��eU��v�m�ͦ��HiL�r��:��R^dE��LR�2�QB�{ܞ�F�v�5
I|<I)��a�_�L'��?>X-�]ۘ�R�b�sR��C����x�h8*
M��eY���5!����K�N���:�H��ִ��j�]������b�Z�cLLh�`0�"B2�(��,��T�b�,���n�~'ڻp��H��^�֋�j�9��ӛo�}8�N�ߙ�Hu>��N�)p)��M]����y��Zk$ӌs���Ͷ1��������Ž�f��z��k��7�>�/�F_۰i�I�@6�ۉ0���D�|��NNN�|���F��R����;�ۦ��1i��$$��_��=��dx��tx��M���BN�����Oo��wc��s�z����{��1���x<����p<b�3))o��mסH~���G��vlrt��\Bq����P�w�^�
g�to|:�{��7�b�{A���rl��[.K�
�ή���x�br|hH֮���Pe6�D@��,����髯�Jb<8:\z�3�\i��D@p8���}�n�4�?��r�0��t>N���8��Dd�+G���D��K�i|��ܼ	����G����,�dJ!X@����q(�q�O�^�h��|p�j��V�C2֠G�{3]7!�iH ޻M]E�K���B�!D)e�'\)�Ǣ�uJ�f�Ȭ�QD�e�h���i�ܬZm�͈sE4'"$ߚ�5��0�J��;�5��ei�#�
��yOJ	�c��Tök)�oԒ�QBVu%���H2���(M&�z�âH ��" ��n���sr�LM�6Da����<AS���Ll�H��Y�p9?�.J��P��$�ƢW>��(NFoc�餆h	���(��QS�4���{`oL]-�_x��ӏ��("�1""���Z�Lg�]����]��e.� �BJ� �@��%Wa�.
)$�,��m��b���~��"1�ڶ],���A;����.���\��n��r���p�[-7����)
��5�s&�l����uU}��u��ֻ���qb8(9��X�Qߵ�z3� $vm[���w������_��w���t��E#��<���dz�
cj��4��K�r�Q�x:�����%�d�e����ɱ.��~io�֣~D��y�.�.TQ�ڧ�����}�ҥ�%*j<o=��6�ܙ��D�x�Oo"h��r6��l[�D"
�mg��B�ڦ��o����w������~"��L����^�m���%�X0)���ɘ���i��G?L)�;;;�87�����_�������h4�R�B4���5/�QYf��vݶ�b�.��RFA ��)����:�F�Cv�i�����t�AD\�5����h�.p�s]lZ{�xC����-�j<�� �)%F�	0����&
��C"��u6@X�HB�%�6�m!r�l�ob��l�����r8�$q���R�&q!$�D�v�-�2 �;8�a��f	����t�$�Yv�6\��5�B�E?����R��n������������_�*U�'�|��$��b��k/{J)gB)�e$%���$�h��n�	"����c��q8l,��Ǧk��胳�
-	��8')�$�,˵FtP5%>z�֎`�ݢB+B窳Z�i\�EBX,כ�?�R+��.y%3��.�@q�TB
j
X�PO�	�c�փ�`�.:�XH�ܓ�+�3���*�UƉ��$<�Z�-�;�"I`BS0�@Q�X������V$���H��b����B���m[)��4/�"x��΅�� ~��w3֓��9�uz�M�+%e��R�C�N��x�ZW��2�)����YD�8qE�]t]b%��%.):u��>!U]o��!1ؐ8�\фj��b��
	��^���]�9Lk
A4���mo����z#�D������N�Ѻk���͑�όڭ�wAp�ʅ���s�k�f��y5�Z��scj�:� ^ָrX��z3O��IEND�B`�PK�X�(�3��ivanamilakovic.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
ivanamilakovic.blogspot.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class IvanaMilakovic(BasicNewsRecipe):
    title = u'Ivana Milaković'
    __author__ = 'Darko Miletic'
    description = u'Hronika mačijeg škrabala - priče, inspiracija, knjige, pisanje, prevodi...'
    oldest_article = 80
    max_articles_per_feed = 100
    language = 'sr'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = True
    publication_type = 'blog'
    extra_css             = """
                               @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                               body{font-family: Arial,Tahoma,Helvetica,FreeSans,sans1,sans-serif}
                               img{margin-bottom: 0.8em; border: 1px solid #333333; padding: 4px }
                            """

    conversion_options = {
        'comment': description, 'tags': 'knjige, blog, srbija, sf', 'publisher': 'Ivana Milakovic', 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    feeds = [(u'Posts', u'http://ivanamilakovic.blogspot.com/feeds/posts/default')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X!8���ixbt.png�PNG


IHDR  szz�]IDATx���Ӂ��۶m;���\���lc�f��N�3X��z�Z���	������E���JԮ�ʁ#�|{�<;d���/�L��[ػCֳEڵAʹF¾���u�y�9h�Yhx��$+�mKD��-�/Q�Yw����sx)�C��)|��ϕ(>\7�YM���i?�^�n�N��%8���JN/��	<�\;Tؔ}X佯��{ロ�
�̝��w~!��P��̲.�����K����	^!f[ҝ����ݬ[=����2�������\VOșP���mǶm�β�<SoO�S�����꽮����%gaeV7D�Q^Bmh	��"�y$}sHx�s�j��i��.���2�ђ�����程��N|M��0+�#����V��'4'/ј�@=���)2���Ǹ_ѽ��aVwD�M8���	��p���CD�0��n]�	sV&=G\30Kᦄ��pM���	�A�}{�r�!�܅��݄�݄�=�VfE�8��c�̗��w'xu�p�+�k>���m��[ ��=�w_�aV=2+�mf�z	�?$̫		��۶�lk`τo�U�:+O�̒��3�Mx�
��(�u��
�M2�&0��UfUo���j���z��z�	��vZ6`�Z�{�ꞿf�$����,���j��W�*5�����Y9Jx��aXJa����v�wga^m�X#���ge'��8	��r
�嫷�G?���F�R�����O�6+ߡ�sP߳�	�WW���>+y������ğ9�Y�Y�=[tpy��JvVv�	/����KG������-�h���p��+�W^Dq�JQ�<�������eIEND�B`�PK�X䢈f��ixbt.recipe#!/usr/bin/env python2
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class Ixbt(BasicNewsRecipe):
    title = 'iXBT.com'
    __author__ = 'bugmen00t'
    description = 'Специализированный российский информационно-аналитический сервер, освещающий вопросы аппаратного обеспечения персональных компьютеров, коммуникаций и серверов, 3D-графики и звука, цифрового фото и видео, Hi-Fi аппаратуры и проекторов, мобильной связи и периферии, игровых приложений и многого другого.'  # noqa
    publisher = 'www.ixbt.com'
    category = 'news'
    cover_url = u'https://www.ixbt.com/images/ixbt-logo-new.jpg'
    language = 'ru'
    auto_cleanup = True

    oldest_article = 30
    max_articles_per_feed = 100

    remove_tags_before = dict(name='div', attrs={'class': 'content'})

    remove_tags_after = dict(name='ul', attrs={'id': 'soc_ShareBlock'})

    feeds = [
        (
            u'\u0421\u0442\u0430\u0442\u044C\u0438',
            'http://www.ixbt.com/export/articles.rss'
        ),
        (
            u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'http://www.ixbt.com/export/news.rss'
        ),
        (
            'Свежие новости DVD и домашних кинотеатров',
            'http://www.ixbt.com/export/dvdnews.rss'
        ),
        (
            'Свежие новости из мира Apple',
            'http://www.ixbt.com/export/applenews.rss'
        ),
        (
            u'\u041F\u0440\u043E\u0446\u0435\u0441\u0441\u043E\u0440\u044B',
            'http://www.ixbt.com/export/sec_cpu.rss'
        ),
        (
            'Системные платы, память и чипсеты',
            'http://www.ixbt.com/export/sec_mainboard.rss'
        ),
        (
            u'D-\u0412\u0438\u0434\u0435\u043E \u0438 TV-\u0442\u044E\u043D\u0435\u0440\u044B',
            'http://www.ixbt.com/export/sec_video.rss'
        ),
        (
            u'\u0421\u0435\u0442\u0438 \u0438 \u0421\u0435\u0440\u0432\u0435\u0440\u044B',
            'http://www.ixbt.com/export/sec_comm.rss'
        ),
        (
            'Оптические приводы и носители информации',
            'http://www.ixbt.com/export/sec_optical.rss'
        ),
        (
            u'\u041F\u0440\u0438\u043D\u0442\u0435\u0440\u044B \u0438 \u041C\u0424\u0423',
            'http://www.ixbt.com/export/sec_printer.rss'
        ),
        (
            u'\u041C\u043E\u043D\u0438\u0442\u043E\u0440\u044B',
            'http://www.ixbt.com/export/sec_monitor.rss'
        ),
        (
            u'\u041D\u043E\u0441\u0438\u0442\u0435\u043B\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438',
            'http://www.ixbt.com/export/sec_storage.rss'
        ),
        (
            u'\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u0437\u0432\u0443\u043A',
            'http://www.ixbt.com/export/sec_multimedia.rss'
        ), (u'ProAudio', 'http://www.ixbt.com/export/sec_proaudio.rss'),
        (
            u'\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0432 \u0447\u0438\u0441\u043B\u0430\u0445',
            'http://www.ixbt.com/export/sec_digimage.rss'
        ),
        (
            'Проекторы, кино и домашние кинотеатры',
            'http://www.ixbt.com/export/sec_dvd.rss'
        ),
        (
            u'\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0435 \u0432\u0438\u0434\u0435\u043E',
            'http://www.ixbt.com/export/sec_divideo.rss'
        ),
        (
            u'\u041C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u0435 \u041F\u041A',
            'http://www.ixbt.com/export/sec_portopc.rss'
        ),
        (
            u'\u041C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430',
            'http://www.ixbt.com/export/sec_pda.rss'
        ),
        (
            u'\u0412\u0441\u0435\u0433\u0434\u0430 \u043D\u0430 \u0441\u0432\u044F\u0437\u0438',
            'http://www.ixbt.com/export/sec_mobile.rss'
        ),
        (
            'Корпуса, системы питания и охлаждения',
            'http://www.ixbt.com/export/sec_power.rss'
        ),
        (
            u'\u041A\u043E\u043B\u043E\u043D\u043A\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430',
            'http://www.ixbt.com/export/sec_editorial.rss'
        ), (u'iXBT Live', 'https://www.ixbt.com/live/rss/index/')
    ]
PK�X���izvestia.png�PNG


IHDR:����IDATx�5�1AQ��G0E�RW�B>�d�1�lLV�,�2(X��o�j�z��\��_��WF�Z7&�%�;� mI%;
���!��,(�!	��k��
����( 7�j���|����(�%w'�����Jxib����Z���[��i���x�#�S-*�5�S-��7��ʲ��z�0~�@���6��B��cIEND�B`�PK�X{
��izvestia.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
izvestia.ru
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Izvestia(BasicNewsRecipe):
    title = 'Izvestia'
    __author__ = 'Darko Miletic (with fixes by bugmen00t)'
    description = 'News from Russia'
    publisher = 'Izvestia'
    category = 'news, politics, Russia'
    oldest_article = 5
    max_articles_per_feed = 100
    auto_cleanup = False
    no_stylesheets = True
    use_embedded_content = False
    language = 'ru'
    publication_type = 'newspaper'
    cover_url = u'https://cdn.iz.ru/profiles/portal/themes/purple/images/favicons/apple-icon-180x180.png'

    remove_tags_before = dict(name='div', attrs={'role': 'article'})

    remove_tags_after = dict(name='div', attrs={'role': 'article'})

    remove_tags = [
        dict(name='div', attrs={'class': 'article_page__left__top__views'}),
        dict(name='div', attrs={'class': 'hash_tags'}),
        dict(name='div', attrs={'class': 'get_yandex_subscription_links'}),
        dict(name='div', attrs={'class': 'article_buttons_block'}),
        dict(name='div', attrs={'class': 'rubrics_btn'}),
        dict(name='div', attrs={'class': 'hidden'}),
        dict(name='div', attrs={'class': 'share_bottom2'}),
        dict(name='div', attrs={'class': 'recommendation-block'}),
        dict(name='div', attrs={'class': 'plug-text'}),
        dict(name='div', attrs={'class': 'get_news_link'}),
        dict(name='div', attrs={'itemprop': 'address'})
    ]

    feeds = [(u'Новости', u'https://iz.ru/xml/rss/all.xml')]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X&X���jacobinmag.png�PNG


IHDR  �Tg�-PLTE�@��� p��0�P`�b�tRNS@��fVIDAT(�c` 8
"�e���N���UH=U 
!�qB�a�$��@�$%Po	���@���4YT	T����&l��D�IEND�B`�PK�X����jacobinmag.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-
# vi: set ft=python :

__license__ = 'GPL v3'
__copyright__ = '2017, Darko Miletic <darko.miletic at gmail.com>'
'''
www.jacobinmag.com
'''

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 Jacobinmag(BasicNewsRecipe):
    title = 'Jacobin'
    __author__ = 'Darko Miletic'
    description = 'Jacobin is a leading voice of the American left, offering socialist perspectives on politics, economics, and culture.'
    publisher = 'Jacobin'
    category = 'news, politics, USA'
    oldest_article = 65
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'magazine'
    needs_subscription = 'optional'
    auto_cleanup = False
    issue_url = None
    PREFIX = 'https://www.jacobinmag.com'
    LOGIN = 'https://auth.jacobinmag.com/mini_profile?redirect=https%3A%2F%2Fwww.jacobinmag.com%2F'
    extra_css = """
        body{font-family: Antwerp, 'Times New Roman', Times, serif}
        img{margin-top:1em; margin-bottom: 1em; display:block}
        .entry-dek,.entry-author{font-family: Hurme-No3, Futura, sans-serif}
    """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    remove_tags = [
        dict(id=['post-header-share', 'post-print']),
        dict(name='form'),
    ]

    keep_only_tags = [
        classes('po__article')
    ]

    def parse_index(self):
        ans = []
        articles = []
        soup = self.index_to_soup('https://www.jacobinmag.com/store/issues')
        lurl = 'https://jacobinmag.com' + soup.find('a', text='View Issue')['href']
        feedtitle = 'Articles'
        self.log('Loading issue from', lurl)
        soup = self.index_to_soup(lurl)

        # Find cover url
        di = soup.find('figure', attrs={'class': lambda x: x and '__cover' in x})
        img = di.find('img')
        self.cover_url = img['src']
        # End find cover url

        # Get series title
        title = soup.find('h1', attrs={'class': lambda x: x and '__heading' in x})
        feedtitle = self.tag_to_string(title)

        # Scrape article links
        for section in soup.findAll('div', attrs={'class': lambda x: x and '__content' in x}):
            for art in section.findAll('article'):
                h1 = art.find('h1')
                a = h1.find('a')
                title = self.tag_to_string(a)
                url = 'https://jacobinmag.com' + a['href']
                desc = ''
                p = art.find('p')
                if p:
                    desc = self.tag_to_string(p)
                articles.append({'title': title, 'url': url, 'description': desc})
                self.log(title, 'at', url)
                if desc:
                    self.log('\t', desc)
        if articles:
            ans.append((feedtitle, articles))
        return ans

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.PREFIX)
        if self.username is not None and self.password is not None:
            br.open(self.LOGIN)
            br.select_form(nr=0)
            br['login.email'] = self.username
            br['login.password'] = self.password
            br.submit()
            page = br.response().read()
            soup = self.index_to_soup(page)
            div = soup.find('div', attrs={'id': 'redirect-target'})
            if div:
                br.open(div['data-redirect'])
        return br
PK�X��&qjagran_josh.png�PNG


IHDR  ��tRNSn���IDATx^��M�U���=u�v�t�t���L&�ɇ�C�b�U#ي
���NwB E4���΍���
�l^\��"�Y�P%�3�d:��U}��
�$ftcjq�����pЂ6� �?��W�KU|SW�:�J���`p~0��춯g>��vn0�A�v{�9��wc�:��g[��Z3O��gI�Q�x((.��Ϭ��2 �l�����{��?�i:�EÎ�,�Q�0B�]����ո��6�B�v���"�J�{A��r��v��i5�P9�J
@�T(���Q�7���ύ�kW�g������v_o�4�<ꏩq�AA�
�$���ϥ�S�O������:�������^�&���%�X�b�T�դ*�*1]�x0�`�NvA�&L���g�Qu�Vϥ�3�͔$/��V��X��K;�X�A�/�tE��u�2��D=u�P�W~��3�0�ӽ~mU�c��������� Q����븶.}�?��#
2�/ɻ���+�)H28����&O�Ɛn_^[�	K�4���)
׬^"ԉ�*�Xa=b�����9w���N�	����o��j��9=O��3ev��v*�����K�P�,����ǻ�Cot84+9Q�����j��@��@
]j�N���٭d�1��%=�:偏.����Ӷ���VT�{c$�V9����.�#�F�_��{L��Q�([�4�[{���O��>�v��[���E�1���!P��6��g�w����՞*�<D���N$�ڭ���v!{"%Q�N�y�c��YS���&$Y�)J��@����o�}��Ӊ�N��@�MF����!�������V�J4tS��C��Y#z��LcA,�Nԭ��J̐�(���y?i�W��R����\�1m����Q�C½	��
�p���q���~x����ި����rIEND�B`�PK�X��7��jagran_josh.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Politics(BasicNewsRecipe):
    title = u'Jagran Josh'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 3  # days
    max_articles_per_feed = 20
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('Jagran Josh',
         'http://www.jagranjosh.com/rss/josh/current_affairs.xml'),
    ]
PK�X�99jakarta_globe.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class JakartaGlobe(BasicNewsRecipe):
    title = u'Jakarta Globe'
    oldest_article = 3
    max_articles_per_feed = 100

    feeds = [
        (u'News', u'http://www.thejakartaglobe.com/news/feed/'),
        (u'Business', u'http://www.thejakartaglobe.com/business/feed/'),
        (u'Opinion', u'http://www.thejakartaglobe.com/opinion/feed/'),
        (u'Count me in', u'http://www.thejakartaglobe.com/count-me-in/feed/'),
        (u'International', u'http://www.thejakartaglobe.com/international/feed/'),
        (u'Sports', u'http://www.thejakartaglobe.com/sports/feed/'),
    ]
    __author__ = 'rty'
    publisher = 'JakartaGlobe.com'
    description = 'JakartaGlobe, Indonesia, Newspaper'
    category = 'News, Indonesia'

    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    auto_cleanup = True
    language = 'en_ID'
    encoding = 'utf-8'
    conversion_options = {'linearize_tables': True}
    masthead_url = 'http://www.thejakartaglobe.com/pages/2010/images/jak-globe-logo.jpg'
PK�X�n�eejakarta_post.png�PNG


IHDR  ��tRNSn��	pHYsOOc���IDATH�햿jTa�O5p��ǐ7A���};�����J�{�I��Z�P�Hve
$�[X�ws���ͮ[p��^.��~3�����`DIJC�@QF���.��B��v5���Gݦ��~K�Oݠ�`�;}h��x@���9xe׹��u�;���r�Ū�]��ѫ-�3�w!�K߹��9?;�!�?AF+�H6��x$���U�9�΁��2*r�����8-]T
@*x" �V��e�(�h��,b���>͐꼀��L�Y]��bh<3��sD�����%��X�'��e��h��JՆ���������*΁���l;w��X�un�j���:��_�+������u>�P7��7�}g��u�;�T����r��\�#b��F�Q���9;*g^��q�8���A4�Z=ٚ-�K���=皪��ˁW��uU�#F�%�F��*L�Qϙk�G�3�)}�����.�/rb���p#b=5���\����>�]�MIEND�B`�PK�XT%�a��jakarta_post.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2011, Adrian Gunawan <agunawan at adrnalin.com>'
__author__ = 'Adrian Gunawan'
__version__ = 'v1.0'
__date__ = '02 February 2011'

'''
http://www.thejakartapost.com/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class JakartaPost(BasicNewsRecipe):
    title = u'Jakarta Post'

    __author__ = u'Kovid Goyal'
    description = u'Indonesian Newspaper in English from Jakarta Post Online Edition'
    category = 'breaking news, national, business, international, Indonesia'
    language = 'en_ID'
    oldest_article = 2
    max_articles_per_feed = 100

    no_stylesheets = True
    no_javascript = True
    remove_empty_feeds = True

    timefmt = ' [%A, %d %B, %Y]'
    encoding = 'utf-8'
    ignore_duplicate_articles = {'title', 'url'}

    keep_only_tags = [
        dict(name='h1'),
        dict(attrs={'class': lambda x: x and 'byline' in x.split()}),
        dict(attrs={'class': lambda x: x and 'span-13' in x.split()}),
    ]
    remove_tags_after = dict(
        attrs={'class': lambda x: x and 'span-12' in x.split()})

    def parse_jp_section(self, url):
        soup = self.index_to_soup(url)
        for div in soup.findAll('div', attrs={'class': 'story'}):
            a = div.find('a', href=True)
            url = a.get('href')
            title = self.tag_to_string(a)
            p = div.find('p')
            desc = self.tag_to_string(p)
            self.log('\t', title, ' at ', url)
            yield {'title': title, 'url': url, 'description': desc}

    def parse_index(self):
        ans = []
        for sec in ('editors_choice channel/headlines channel/business channel/national channel/archipelago'
                    ' channel/jakarta channel/world channel/sports').split():
            title = (sec.partition('/')[2] or sec).replace('_', ' ').capitalize()
            articles = list(self.parse_jp_section(
                'http://www.thejakartapost.com/' + sec))
            self.log('Found section:', title)
            if articles:
                ans.append((title, articles))
            if self.test and len(ans) >= self.test[0]:
                break
        return ans
PK�X��x//jalopnik.png�PNG


IHDR  ���IDATxڵVA�A.o�j4:4&1�	C6B"��(������� �G��'B�$�a�b1�	�7[��vA��M|y�L���W�}U���իW�?��=z|�M"�y]����.]��0�ݻ��={®��^TR�Fu�Ǣ,��@�9w�rQVtF
����w���ѣG�!i��<�����{]N���SY�_�@���<�K��gT�yBX�@�c�_�����	}�#��Ҙ`e,�wX:�\������
�W����Y�,J "!��ǿwV�0��)Ɛe;�����%���
s�hш�;5UbQ�Nۖ!���s�͐}e�6����9�����^��	6�L�|4���j�~�Xgέ�Y�QK�,
�dl-\��"�c+�s�qRV�AP�D=V�|�MK\vp�U�o�����i�M�
��=��ZLF�7/C��?�c��(��F�
�kd0�5�Q�,�!f&PU���U�;��&7��A�?<0#�*�e�[	�^����Sf8g�!x�M�`\˲�~��&�,�9�m�3Y>��ֳ�*O�fބm%P�r���ɘ�}\�e-�\���� ��'�~o�������cwn�Vu���y>���ʽ�Ϟ���p.bI��g�/���j����j���6��d�Ob�$))10k6���Gث���;�2�U��g�C+�p�
aSh�ܖ��n$�J&9t1V�>�T��H��V���y"��$�E:��4�1F6�B��R�j#as+f5zJ"Nǩ����4�hBj�#��>!30�6f+��|��[:�{�9g�m����cu5$�բ����J�J)l���B��܂��a��������Z?����*ڐ��'v��I�6�_%Ն��ج@�Y^žV�(�I��[
߱�8?��|��TC�B�ӧO����n]�6�;��n�+3�,�q��G����7���5���f��7S�7x�%/�^��1v�D�U����C�ȩ�w�=������D��ܐ6IEND�B`�PK�X�b�Jzzjalopnik.recipe__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
jalopnik.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Jalopnik(BasicNewsRecipe):
    title = 'Jalopnik'
    __author__ = 'NA'
    description = "Jalopnik, Obsessed With The Cult of Cars."
    publisher = 'jalopnik.com'
    category = 'news, cars, spyshots'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'en'
    masthead_url = 'http://cache.gawkerassets.com/assets/jalopnik.com/img/logo.png'
    extra_css             = '''
    body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
    img{margin-bottom: 1em}
    h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
    h2{font-family :Arial,Helvetica,sans-serif; font-size:x-small}
                  '''
    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_attributes = ['width', 'height']
    keep_only_tags = [dict(attrs={'class': 'content permalink'})]
    remove_tags_before = dict(name='h1')
    remove_tags = [dict(attrs={'class': 'contactinfo'})]
    remove_tags_after = dict(attrs={'class': 'contactinfo'})

    feeds = [(u'Articles', u'http://feeds.gawker.com/jalopnik/full')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�Xx�t���	japaa.png�PNG


IHDR  ��tRNSn��\IDATx^��lTUƿ{�{w�
3�-Z��PR��7�]6��n���]ȒD7���b�%E,�	�.eAw!$��B"�1�҆���bK�c��λ�8}M:��v��r��$w�Μy��EN���x�ocڌ�Ϭ^�ak�[{^ٲ���\�Ċ�&L��~4H�85nҒ��n߷�_����ѱ��~q~o:��w|b{��K�>%��{� sh0d�8Q�s
Gͫzn���#��ON�|�@Dc`�7"���1m翻r�/�;_�͇�!D��3�u����� ��;���5n�Fk��?mu�ϿkZ��
�R���sp��U_�T��T���'k��Z��S�8g�c��<�+���]:�u���s��L�貚�O�2�(��B00ƙ~ҵ�A~�����
�d��{��r�#KV��G�9�?a\PJ1�.Y��x�T(
)�tuh=���G���ǭ��Iu�ؐ���@��R:J��KW'
F�T�	2P�r�@Ă�k�kpqY��eP��:���^2���糼�`�3Ĉ	�-c@Ȇ"e,0��}�2�Z��K�v���?>��'�w^
��DC����@?8H��y�)�fD�`�����w�5��i�$*)8��u�:2"�c��F��abaB6�@�Y���]�m�'b7
P$*����Ú�p��C|_qNY��@���#�>L��d	p�U����	kڌ��p�hr�88!�z#�G$/2��Q|��1�1��K�w剡�q{��%���8��p{ ��$?{����c�K����ﭦ�S������1vs@�9��e@�Peg
�'���:v�:X�P�`f�dRe�$@��6A�� �o	&p��)�/\=�[���Q1���d\�؜�,D�T�����������#�e�Аt���܁��C^-y�t4{�H���'��	�I�K ���������X��-x]hh`I'�N�mLL��{.��@�,�f�nÍA.�<+�J_����pj�sʉ[
R�쩍�)c2��F�
����Hp��SIP����mE�6H	���\@����:a�&­A�p|�CᶣŃՃm���᝖�h�[�.z��f�9�@)z�\�D�ں@�}L����1VF��&|�>dʽ�^�<���h������@D���h0�P�.c�Z|�n�z�@��A�g�Ɨ�W]9}�q[�ɐ`���A���Ƀ���}�V�ӟ�q��������|n]���Ƨ�4-�Ċ��kZ^{ti͎%�+PX*3�D:=���GX4�w��n��G�ml�~�ÅU�Q>�}8qH�\�J�z-��T!IEND�B`�PK�X�A�japaa.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1330393641(BasicNewsRecipe):
    title = u'JAAPA'
    __author__ = 'adoucette'
    language = 'en'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup = True

    def get_cover_url(self):
        cover_url = None
        soup = self.index_to_soup('http://www.jaapa.com')
        cover_item = soup.find(
            'img', src=re.compile(r'\w*?cover\w{1,22}\.jpg'))
        if cover_item:
            cover_url = cover_item['src']
        return cover_url

    feeds = [
        (u'CME Articles',
         u'http://feeds.feedburner.com/jaapacmearticles'),
        (u'A Day in the Life',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=490'),
        (u'Ask A Librarian',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=847'),
        (u'Case of the Month',
         u'http://feeds.feedburner.com/jaapacaseofthemonth'),
        (u'Clinical Watch',
         u'http://feeds.feedburner.com/jaapaclinicalwatch'),
        (u'Commentary',
         u'http://feeds.feedburner.com/jaapacommentary'),
        (u'Critically Appraised Topic',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=699'),
        (u'Dermatology Digest',
         u'http://feeds.feedburner.com/jaapadermatologydigest'),
        (u'Diagnostic Imaging Review',
         u'http://feeds.feedburner.com/jaapadiagnosticimagingreview'),
        (u'Editorial',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=759'),
        (u'From the Academy',
         u'http://feeds.feedburner.com/jaapafromtheacademy'),
        (u'Genomics in PA Practice',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=760'),
        (u'Humane Medicine',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=758'),
        (u'Inside the AAPA Policy Manual',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=1546'),
        (u'Interpreting ECGs',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=1624'),
        (u'Letters',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=808'),
        (u'PA Quandaries',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=496'),
        (u'Pharmacology Consult',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=1614'),
        (u'POEMs', u'http://feeds.feedburner.com/jaapapoems'),
        (u'Quick Recertification',
         u'http://feeds.feedburner.com/jaapaquickrecertificationseries'),
        (u'Sounding Board',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=698'),
        (u'The Surgical Patient',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=499'),
        (u'Topics in Infectious Diseases',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=2495'),
        (u"What's New", u'http://feeds.feedburner.com/jaapawhatsnew'),
        (u'When the Patient Asks',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=501'),
        (u"Women's Health",
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=2176'),
        (u'AAPA Special Article',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=1453'),
        (u'Case Reports',
         u'http://feeds.feedburner.com/jaapacasereports'),
        (u'Review Articles',
         u'http://feeds.feedburner.com/jaapareviewarticles'),
        (u'Surgical Reviews',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=505'),
        (u'Brief Report',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=2353'),
        (u'Research Corner',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=498'),
        (u'Research Reports',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=1024'),
        (u'The Art of Medicine',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=1289'),
        (u'Clinical Practice Guidelines',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=2102'),
        (u'Complementary and Alternative Medicine',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=2123'),
        (u'Drug Information',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=2089'),
        (u'Evidence-Based Medicine',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=1288'),
        (u'Patient Information',
         u'http://www.jaapa.com/pages/rss.aspx?sectionid=2122')]

    def print_version(self, url):
        return url.replace('/article/', '/printarticle/')
PK�XC��ҩ�japan_news.png�PNG


IHDR�apIDATxڭ́C1��[![d�L�-�E���"P
�"P�BQ��\��w������ƃ4�\��7�=*�c�����3g*��U
g`�3���πշw���{��j��-iIEND�B`�PK�Xv��9��japan_news.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class NewsOnJapan(BasicNewsRecipe):
    title = u'News On Japan'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('News',
         'http://newsonjapan.com/rss/top.xml'),
    ]
PK�X����xxjapan_times.png�PNG


IHDR  D����PLTENa%u)�.�#�"�����$�&�'�)�*�,�.�.�0�0�2�2�3�K �W0�fD�hD�cD�kU�ve�sf�}u��r��u��u��uŅuLjuԍu�uޥ�Ӭ�ɵ�����ź�ƺ�������������������������헑�YNYD�I0�G0����������������������������������<���OIDATx�ъ�Q�o�ϙ�@RI��
�[��!ܨH��\A��ǿ��T,<��y�+��	��?:�	���3\��$��L�i�r��r�������l�m��cSή�7V^��=7 l��Zb�@��}2�e;1*�) fo��@����)����.%0ѣ+e0�ı@�f.O������h���?���FH@��ҹx��>��� v@3�y�B�t�
���fN����ꆃ��!���ڤ�
X���u��ޫ�3��Gh3�,[�2LGm��Z�>3�~XIEND�B`�PK�X&��V�	�	japan_times.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = "GPL v3"
__copyright__ = (
    "2008-2013, Darko Miletic <darko.miletic at gmail.com>. "
    "2022, Albert Aparicio Isarn <aaparicio at posteo.net>"
)
"""
japantimes.co.jp
"""

from calibre.web.feeds.news import BasicNewsRecipe


class JapanTimes(BasicNewsRecipe):
    title = "The Japan Times"
    __author__ = "Albert Aparicio Isarn (original recipe by Darko Miletic)"
    description = (
        "The latest news from Japan Times, Japan's leading English-language daily newspaper"
    )
    language = "en_JP"
    category = "news, politics, japan"
    publisher = "The Japan Times"
    oldest_article = 2
    max_articles_per_feed = 150
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    encoding = "utf8"
    publication_type = "newspaper"
    masthead_url = "https://cdn-japantimes.com/wp-content/themes/jt_theme/library/img/japantimes-logo-tagline.png"
    extra_css = "body{font-family: Geneva,Arial,Helvetica,sans-serif}"

    conversion_options = {
        "comment": description,
        "tags": category,
        "publisher": publisher,
        "language": language,
    }

    remove_tags_before = {"name": "h1"}
    remove_tags_after = {"name": "ul", "attrs": {"class": "single-sns-area"}}
    keep_only_tags = [
        {"name": "div", "attrs": {"class": "padding_block"}},
        # {"name": "h5", "attrs": {"class": "writer", "role": "author"}},
        # {"name": "p", "attrs": {"class": "credit"}},
    ]
    remove_tags = [
        {"name": "div", "id": "no_js_blocker", "attrs": {"class": "padding_block"}},
        {"name": "div", "attrs": {"class": "single-upper-meta"}},
        {"name": "ul", "attrs": {"class": "single-sns-area"}},
    ]
    feeds = [
        (u"Top Stories", u"https://www.japantimes.co.jp/feed/topstories/"),
        (u"News", u"https://www.japantimes.co.jp/news/feed/"),
        (u"Opinion", u"https://www.japantimes.co.jp/opinion/feed/"),
        (u"Life", u"https://www.japantimes.co.jp/life/feed/"),
        (u"Community", u"https://www.japantimes.co.jp/community/feed/"),
        (u"Culture", u"https://www.japantimes.co.jp/culture/feed/"),
        (u"Sports", u"https://www.japantimes.co.jp/sports/feed/"),
    ]

    def get_article_url(self, article):
        rurl = BasicNewsRecipe.get_article_url(self, article)
        return rurl.partition("?")[0]

    def preprocess_raw_html(self, raw, url):
        return "<html><head>" + raw[raw.find("</head>") :]
PK�X_�܄��
javalobby.png�PNG


IHDR ">���IDATxڥWt"Iι�������3I��l�0��V�5�q�1l}���ݥ��
C����~#�U��e�]��4J��0c�[g�ߛ3rb�-}�{����8�%��Y��7�!#kO)�ތ3f���@�3�w��c�����-��(�:�'h��k���M�fΔ���y�r�L� >��6nh~j[�ڛ��ϥ|s?�\א�u�ӵz",k>��3e?19
��LكW%[�ڷ����̣���+�c�6Ək�DV�L��3�L�"/�ϝ�η��8jz�I���c�5{"o(���Tp�(����ƐbՀ��0�xs6kv.��7=w-;��tm�(���+�4�N�Im��g;C3v`�
���3��(�@y��!��]�N���m���e.���2VB�Y_�wGPi�?=�ŧ�΀2��+>o4Ma���tl<%G��ܹF�;��1���d�!4^!Z	P3�b/54
R0���xj+v%N�z3��pj��t�_N9��?����9�$��#�>���<��8lBth3�7ԇ
T)S]h�2��we.�XN�س[
�O=������y6�z�h}��?�}�\����Qh�I�5�O9��3�ߑM<gn�r���0Р�YLR�)�Q	��]�t
@~�IRBқ:�� �t	���� &kWu��@���l�Ȉ3�8����ź��u���Bg�����ǁ�ߠ�w�_��j���	Ļ��/���'�B�)k 6�A�ՠ�WW(N���U�	���@���2�O��3���@F� �f�'�A�7�V5I�$�%�b�5���4���]��T��\��{�ޒ��%��/֝�A�������m�Oc�<�e�f�A�6��
Z��LU�|M7]�J �[z����1�K�����<�S��fq�
�÷��M��9�>�E�=��U�G�<o���5�55X�Q�*��C�n<$�� ��
V�hc�{��#,���;h+��k�Eϫ���9x>�W�.��INZ9����mv.��3<�%?�k\��l��x��F�+����eZ����g�;�ײ�`b���� �0�j��
�WF�J��0c�:M���Vw�m��V�A�o�p�Z�ʛZ��M��ә4l!ґ�6�tŵ�Xj, �V��;�êDn�;�f�1��)�m�Z]A� �����6����Tʲ3��@@Y9� x��D�#�F�9SQ�Z��)�<tg��e�h{�R�A��*B��>���&o�&�Bfk(�".��A�= �9m�'B�y	�|�;��l#'��zB�h/�;��јf�Qa���ϯ)�`��PF���
'�}h2���>�V��N�F۴�4���A�aր�+;���i��J,W��ʈR	���H�{0~[nAXG+D��Ђj]p�����+�^�?y$2�����K��,P��L)���� �$dƆ�޾6�[���R��"Y
���V����z*�{��A�9m.K���ٌ��S��@`�u5�~��ґl�V��P�C��c�_����34�5���/f���̫��'�>���J�PW8�&l��V�

���%&�{}< ��L���ٞp�e��^
���p�8�S�󡿽��+�JH<e0<�-;�N^�	'ތ��MA�0	%gǧES%(69O$5cZ,M��-H$�'|�Ⱦ�
��`et�▰��9�R�R�#���cz+�r2�ֽ{9�:o$�=*�ƒՎ]���z�o'�T<U��
�~m���@�7敒�S˴���)e{{0̙]9K�!�s�
b��5�RW�^m���߯t��Ons�m(��I��g�݀�	D�Q{�-j�-o�Ue���瓂T�k��r^�9�zâ�L���w�־Kk��k'��>'��Eq�R��������ٻ՘[*������g�M����.��F��{����B���u1Gi�`^��G�j��~�#�h�'g�/�I���o������,�f�wB�dõ�x��7��|*�s�6���W%k��쮋�olV\�Q�����.�p��]9����P�r�1�1���D2�9ˇ����/��TY��
ju�/
X��u�����ܙ��b��~�s�ą'"\$��]m/Q8b�k�w��3�S���_C���Ї��BcO�yԠ,�p�~����a+w��ۿٓ���ROIEND�B`�PK�X6S9R[[javalobby.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Rick Kellogg'
'''
java.dzone.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Engadget(BasicNewsRecipe):
    title = u'Javalobby'
    __author__ = 'Rick Kellogg'
    description = 'news'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    remove_tags = [dict(name='div', attrs={'class': ["fivestar-static-form-item", "relatedContent", "pagination clearfix", "addResources"]}),
                   dict(name='div', attrs={'id': ["comments"]})]

    keep_only_tags = [dict(name='div', attrs={'id': ["article"]})]

    feeds = [(u'news', u'http://feeds.dzone.com/javalobby/frontpage')]

    def get_article_url(self, article):

        url = article.get('link', None)

        return url
PK�X2��o��
jb_online.png�PNG


IHDR��h6�IDATx
��k�W��9���gLjcTu��-nJP@�PPp�JD���+�@��.��Bm)�Pu#�bS�h�Q���h>�Dg��}�q�y�u)�@
�PA���1� RA�j���������,�I�B��HR6��w�-AXC#�ZN,1
��aR!f��2;����~;|��힒$Z��1C
�0��tA�ֳ�v�ƃ7/�sνz�?ᄎ3���n<�<��;�e����秮?�~�8��9u|_�ƶB^�N��Š����\��Wų���Z���͡�������ŋiJ��Ʌ$Uj��R��=4��^{4מyٱy?ŸV�^��#<�FJ�Zv�И���xsfv��廫e�<j/yI>�I5D-�q!�z�p�V�+�wm���Hf9XqB$1H1�I��^�������i�9�'�ț�}���h횋�tK��8
*�8�fxn-8�4:ܰ��'��.���ӏ���-�ʗ}Ղy�N�ܵs����m�E.\�����.v���.��d��S{��
Az�6�.�w�ed~�����O\����/>:Z~ߡZM d��5H�2�:E(�v`�JS�_^|&�TQ�� xQ"b"l�U���	0* �B	�ue%!�c(@P� �jz��H���IEND�B`�PK�X�ZGGjb_online.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
jbonline.terra.com.br
'''

from calibre.web.feeds.news import BasicNewsRecipe


class JBOnline(BasicNewsRecipe):
    title = 'Jornal Brasileiro Online'
    __author__ = 'Darko Miletic'
    description = 'News from Brasil'
    publisher = 'Jornal Brasileiro'
    category = 'news, politics, Brasil'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'cp1252'
    cover_url = 'http://jbonline.terra.com.br/img/logo_01.gif'
    remove_javascript = True

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    keep_only_tags = [dict(name='div', attrs={'id': 'corpoNoticia'})]

    remove_tags = [dict(name=['script', 'object', 'form'])]

    feeds = [(u'Todos as editorias',
              u'http://jbonline.terra.com.br/extra/rsstrjb.xml')]

    def preprocess_html(self, soup):
        ifr = soup.find('iframe')
        if ifr:
            ifr.extract()
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    language = 'pt'
PK�XW�+��jbpress.png�PNG


IHDR  D���APLTE���%%%BBBjjjkkk���111;;;>>>			CCCRRRSSSeeehhh%zzz���������������+++GGG===HHH}}}���???AAADDDEEEFFFIIIJJJKKKNNNTTTYYY\\\bbb"$$$������������������������


������������������)))���������������������������***���ݦ
������������000����666������������������<<<ȷ�tRNS@��fIDATx���SbD1��|����m۶��/�9��y��8�}��	��T���Y��ul�	[�L��EQ���\�v`��U�4_�o���f'���}9�.�_�dEQF/���n��Q��4�r�ϑ'�f�҃H��\�`�I7Q��H��z �+&�p)��ƀ�=�����H���Hiz@ð%�
�"�)�$t�#UD��6�V��clյH�nM�ڏ��x�[�evޒa,{��,cE}o���`�Y�)DMVMJIEND�B`�PK�X��1==jbpress.recipetry:
    from urllib.request import urlopen
except ImportError:
    from urllib2 import urlopen
import re
from calibre.web.feeds.news import BasicNewsRecipe


class JBPress(BasicNewsRecipe):
    title = u'JBPress'
    language = 'ja'
    description = u'Japan Business Press New articles (using small print version)'
    __author__ = 'Ado Nishimura'
    needs_subscription = True
    oldest_article = 7
    max_articles_per_feed = 100
    remove_tags_before = dict(id='wrapper')
    no_stylesheets = True

    feeds = [('JBPress new article', 'http://feed.ismedia.jp/rss/jbpress/all.rdf')]

    def get_cover_url(self):
        return 'http://www.jbpress.co.jp/common/images/v1/jpn/common/logo.gif'

    def get_browser(self):
        html = '''<form action="https://jbpress.ismedia.jp/auth/dologin/http://jbpress.ismedia.jp/articles/print/5549" method="post">
<input id="login" name="login" type="text"/>
<input id="password" name="password" type="password"/>
<input id="rememberme" name="rememberme" type="checkbox"/>
</form>
'''
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('http://jbpress.ismedia.jp/articles/print/5549')
            response = br.response()
            response.set_data(html)
            br.set_response(response)
            br.select_form(nr=0)
            br["login"] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def print_version(self, url):
        url = urlopen(url).geturl()  # resolve redirect.
        return url.replace('/-/', '/print/')

    def preprocess_html(self, soup):
        # remove breadcrumb
        h3s = soup.findAll('h3')
        for h3 in h3s:
            if re.compile('^JBpress&gt;').match(h3.string):
                h3.extract()
        return soup
PK�X_����
jeuxvideo.png�PNG


IHDR(-S-PLTE^�����;Ye�pzzz�-�����Z�[��	�������tRNS@��fjIDATx�u�A����= 9�h�O���:N̴�UJ,fB�^e�u����sC�)˄TD
D�5!#��,Z�:���
M������p]�O9�?y��-�[IEND�B`�PK�X��l��jeuxvideo.recipefrom __future__ import unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2013, Malah <malah at neuf dot fr>'
'''
JeuxVideo.com
'''

__author__ = '2013, Malah <malah at neuf dot fr>'

from calibre.web.feeds.news import BasicNewsRecipe


class JeuxVideoCom(BasicNewsRecipe):
    title = 'JeuxVideo.com'
    __author__ = 'Malah'
    description = 'La Référence des Jeux Vidéo sur PC et Consoles !'
    oldest_article = 1.5
    language = 'fr'
    max_articles_per_feed = 100
    remove_empty_feeds = True
    use_embedded_content = False
    no_stylesheets = True
    ignore_duplicate_articles = {'title', 'url'}
    keep_only_tags = [dict(id=['news_detail', 'test_txt', 'test_avis'])]
    remove_tags = [
        dict(name='div', attrs={'id': 'player_video_article'}),
        dict(name='div', attrs={'class': 'liste-fiches'})
    ]
    masthead_url = u'https://upload.wikimedia.org/wikipedia/commons/3/39/Jeuxvideocom.png'
    feeds = [
        (u'Section PC', u'http://www.jeuxvideo.com/rss/rss-pc.xml'),
        (u'Section Xbox One', u'http://www.jeuxvideo.com/rss/rss-xo.xml'),
        (u'Section PlayStation 4', u'http://www.jeuxvideo.com/rss/rss-ps4.xml'),
        (u'Section Xbox 360', u'http://www.jeuxvideo.com/rss/rss-360.xml'),
        (u'Section PlayStation 3', u'http://www.jeuxvideo.com/rss/rss-ps3.xml'),
        (u'Section Wii U', u'http://www.jeuxvideo.com/rss/rss-wiiu.xml'),
        (u'Section Wii', u'http://www.jeuxvideo.com/rss/rss-wii.xml'),
        (u'Section Nintendo 3DS', u'http://www.jeuxvideo.com/rss/rss-3ds.xml'),
        (u'Section Nintendo DS', u'http://www.jeuxvideo.com/rss/rss-ds.xml'),
        (u'Section PlayStation Vita', u'http://www.jeuxvideo.com/rss/rss-vita.xml'),
        (u'Section PlayStation Protable',
         u'http://www.jeuxvideo.com/rss/rss-psp.xml'),
        (u'Section Android', u'http://www.jeuxvideo.com/rss/rss-android.xml'),
        (u'Section Iphone', u'http://www.jeuxvideo.com/rss/rss-iphone.xml'),
        (u'Section Web', u'http://www.jeuxvideo.com/rss/rss-wb.xml'),
        (u'Autres news', u'http://www.jeuxvideo.com/rss/rss-news.xml'),
        (u'Autres vidéos', u'http://www.jeuxvideo.com/rss/rss-videos.xml'),
        (u'Autres articles', u'http://www.jeuxvideo.com/rss/rss.xml'),
    ]
PK�X~sy�FFjezebel.png�PNG


IHDR7���
IDATx�c���$�N��G�IEND�B`�PK�Xg����jezebel.recipe__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
jezebel.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Jezebel(BasicNewsRecipe):
    title = 'Jezebel'
    __author__ = 'NA'
    description = "Jezebel, Celebrity, Sex, Fashion for Women. Without Airbrushing."
    publisher = 'jezebel.com'
    category = 'news, cars, spyshots'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = True
    language = 'en'
    masthead_url = 'http://cache.gawkerassets.com/assets/jezebel.com/img/logo.png'
    extra_css             = '''
    body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
    img{margin-bottom: 1em}
    h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
    h2{font-family :Arial,Helvetica,sans-serif; font-size:x-small}
                  '''
    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Articles', u'http://feeds.gawker.com/jezebel/vip?format=xml')]

    remove_tags = [
        {'class': 'feedflare'},
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�jijinews.png�PNG


IHDR(-S�PLTE���������������������������������������������������������������ܻ�������������������������ޮ�ۭ�ګ�ڍ���⫾Ϧ�͡�ǟ�՘�ђ�܄�Ԅ�ҁ�Ӈ�Ŏ�����������g��{����x��u��u��q��m��r��b��[��\��Z��Y��A��v��S��S��?�� ��=��>��2��!��������������������������<��A~�Bt�Z~�?�5z�2x�?{�8p�8r�2n�,r�,p�"h�$d�?m�>l�:i�<f�;e�5e�z�f�o�g�e�S�X�V�W�W�V�U�V�U�S�X�S�R�
Z�P�N�C�B�I�H�K�J�J�I�E�;�CtHz@@t?p	?q=m:j8i7k7i1e-f̩|dtRNS@��f�IDATx�RE�϶]�m۶m�66�8ke+k�%��v���W�n@CWsk������N@Q_K[�������
l�tv�Hx4^7�*$8��I��J���ERN��bg�B2A�lt�<%�{	�6IR���d&�*�J�Y��b�$��&�%���I7���~���4�=����<�??�ɇW���?�7)8uv|rz;@XAuu~(�R826K��DIEND�B`�PK�X��m�IIjijinews.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>'
'''
www.jiji.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class JijiDotCom(BasicNewsRecipe):
    title = u'\u6642\u4e8b\u901a\u4fe1'
    __author__ = 'Hiroshi Miura'
    description = 'World News from Jiji Press'
    publisher = 'Jiji Press Ltd.'
    category = 'news'
    oldest_article = 6
    max_articles_per_feed = 100
    encoding = 'euc_jisx0213'
    language = 'ja'
    masthead_url = 'http://jen.jiji.com/images/logo_jijipress.gif'
    top_url = 'http://www.jiji.com/'

    feeds = [(u'\u30cb\u30e5\u30fc\u30b9',
              u'http://www.jiji.com/rss/ranking.rdf')]

    remove_tags_before = dict(id="article-area")
    remove_tags_after = dict(id="ad_google")

    def get_cover_url(self):
        cover_url = 'http://www.jiji.com/img/top_header_logo2.gif'
        soup = self.index_to_soup(self.top_url)
        cover_item = soup.find('div', attrs={'class': 'top-pad-photos'})
        if cover_item:
            cover_url = self.top_url + cover_item.img['src']
        return cover_url
PK�Xzx��joelonsoftware.png�PNG


IHDR:���SIDATx�U΋	!є��Mg�1p��!h�\���V�e$����[��i@���r�o�!��0�^q�5�4���vK��>?s�EIEND�B`�PK�X���U))joelonsoftware.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008, Darko Miletic <darko.miletic at gmail.com>'
'''
joelonsoftware.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Joelonsoftware(BasicNewsRecipe):

    title = 'Joel on Software'
    __author__ = 'Darko Miletic'
    description = 'Painless Software Management'
    language = 'en'

    no_stylesheets = True
    use_embedded_content = True
    oldest_article = 60

    cover_url = 'http://www.joelonsoftware.com/RssJoelOnSoftware.jpg'

    extra_css = '''
                h1{font-size: x-small; color:#BF3306;}
                h2{ color:#046380; font-size: large;}
                .date{ color:#046380; font-size: x-small;}
                .author{ color:#046380; font-size: small;}
                body{font-family:Georgia,serif;font-size: small;}
                '''

    html2lrf_options = ['--comment', description, '--category', 'blog,software,news', '--author', 'Joel Spolsky'
                        ]

    feeds = [(u'Articles', u'http://www.joelonsoftware.com/rss.xml')]
PK�X6�C�ccjohm.png�PNG


IHDR  D����PLTEI�����������䬬����������������������������###�����������ğ�������@@@������ttt������������I�͑��L������ˎ����⹸�iii������������7��rrr[�Ɖ������������ۡ�����111���5��������������������������������������ݻ��J����󭭭
����������􈈈�����������������t�ؚ�����UUU�SSS���000M��GGG��������"""uuu�����I�ͣ��STT����������YYY������KKK�����&&&��������J�����TTT�AAA�����<����������H������ޢ�����������(�Ɣ�������III��������@�ʝ����𴴴�2��#IDATx����bd�w۶5=�m۶m۶m;���ƶk}���!���|���C�>P&����ʊ�B�	t
O�˓	�l&=�ŬCtx��^ΉP�6��9Y8�4k!s�o�Jêt�n@�`���G�ks���A &��
Yw�b�B7�⒕�K��:x�T=%��nW�pt��̠`�P�gڀ�;@'39q>Y�7[<�#X��dq����S�9�A�,I甌־����o�(n+��ZB�NM.��k��^��@�U�vĦ\
`���7
�
$�G�S@žIEND�B`�PK�X0bb�8
8
johm.recipeimport re
from calibre.web.feeds.recipes import BasicNewsRecipe


class JournalofHospitalMedicine(BasicNewsRecipe):

    title = 'Journal of Hospital Medicine'
    __author__ = 'Kovid Goyal'
    description = 'Medical news'
    timefmt = ' [%d %b, %Y]'
    needs_subscription = True
    language = 'en'

    no_stylesheets = True
    keep_only_tags = [dict(id=['articleTitle', 'articleMeta', 'fulltext'])]
    remove_tags = [dict(attrs={'class': 'licensedContent'})]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('https://onlinelibrary.wiley.com/')
        br.select_form(nr=0)
        br['login'] = self.username
        br['password'] = self.password
        response = br.submit()
        raw = response.read()
        if '<h2>LOGGED IN</h2>' not in raw:
            raise Exception('Login failed. Check your username and password')
        return br

    # TO GET ARTICLE TOC
    def johm_get_index(self):
        return self.index_to_soup('https://shmpublications.onlinelibrary.wiley.com/toc/15535606/current')

    # To parse article toc
    def parse_index(self):
        soup = self.johm_get_index()
        toc = soup.find(id='issueTocGroups')
        feeds = []
        for group in toc.findAll('li', id=re.compile(r'group\d+')):
            gtitle = group.find(attrs={'class': 'subSectionHeading'})
            if gtitle is None:
                continue
            gtitle = self.tag_to_string(gtitle)
            arts = group.find(attrs={'class': 'articles'})
            if arts is None:
                continue
            self.log('Found section:', gtitle)
            articles = []
            for art in arts.findAll(attrs={'class': lambda x: x and 'tocArticle'
                                           in x}):
                a = art.find('a', href=True)
                if a is None:
                    continue
                url = a.get('href')
                if url.startswith('/'):
                    url = 'http://onlinelibrary.wiley.com' + url
                url = url.replace('/abstract', '/full')
                title = self.tag_to_string(a)
                a.extract()
                pm = art.find(attrs={'class': 'productMenu'})
                if pm is not None:
                    pm.extract()
                desc = self.tag_to_string(art)
                self.log('\tFound article:', title, 'at', url)
                articles.append({'title': title, 'url': url, 'description': desc,
                                 'date': ''})
            if articles:
                feeds.append((gtitle, articles))

        return feeds
PK�X%�*@88joongang.png�PNG


IHDR  szz��IDATxڭW�cM�g۶m۶���m�׶ƞͬ=���p&v����"'g��,�
�ﭪwӑ	�i�~��o$G�t�Z�ð�
{Y�pT����E��h��Wp�T���d
��(�{
�:�:Is^r���M��Y��QF�w�1������Z��j)^
bʵ4kԚ�t2kT��J���f"qԔ��P��mct�^�r�����mUHZ�!fߊ�����N��	1�f�W#k�U-�p��]��P�k�BL6�5}Y�L9�dj�q�D�c�R:����4-���µ�ýJc�_�� ��a-��W��,�,G�R��g)���k�G�V�k)M��!���wck`/��}hbcf�cQ$����>8Oi*m�RP�}sF���Ȣnc`:���C�K
��"�"2\
�?֖����AB;!�����0z���7D��"	�H!*'�Y�����(��
�I��yn���Ht�~�@α�A�^�
��߲1��᷷!�'�^���N��ǩ�'���Bo�]��o�@K�,�~����M��mӥ�O�u���\k"k�jj���[H4�^G/���Ǽ�s�$+s�5�cMH4���$�͟sL��Aj�D��D�:���a���{�NV�C4�I��+/����&��\�v}b�'��*/�^/lV+������/e0����9ĎO�=��;m��m��߇�e!�A�ӟ�d�]M��o{�w��0іW���}�������w��� =VJ��A[^�|5e�"��	h��X�,�x���
��,Ć'!6>-�S3?
ۮA���3�f0Xۺ��H���*_��{$(j�D��.8�_B\�A�G�`>$t�Q����)6�<b��kU7A��O=���ă�޷��>�4�J�]���bO���*���_E���W!\z��u9?�G�����n�G~���h���[�{��ܟ�(��(���Rh%��^�!�)d��nǭ7ޔ���QM�����R�Ş������m%B���`�u��Ud=�6�
�_sMV>���B9��iBk�T�k�g��_�N�ˢ�0��s�*y
�q�,����I��������9z����ǐ*<�|��vw:@*z���
��ɂs��`bR6Z�`�baA?W���|Wj����G�ז�H���,<|�(�2�
��C|��2�r�C�I�vZ��[��4�v�#��^��G���	��������Ib��ZK�"�
�+O�Km��z4���<�T�y����T�ϭ>�D�!Sk��5\\s��F�ܽ퉩�3r�x\T�����(:Ⴋ1��ZX�p��0P��~�����	���M_5�P?y�>��������]^UJh�A+�T�_��qMFO돧S�y�!�9�J��{D����L*�I�Z��^�8�?��������y��'D�w�
O����������o-"G՛���h��H�ow�IEND�B`�PK�X��{-MMjoongang.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2015, Hoje Lee <hojelei at gmail.com>'
'''
Profile to download Joongang Ilbo
'''

from calibre.web.feeds.news import BasicNewsRecipe


class JoongangIlbo(BasicNewsRecipe):
    language = 'ko'
    title = u'중앙일보'
    description = u'중앙일보 신문 기사'
    __author__ = 'Hoje Lee'
    oldest_article = 7
    max_articles_per_feed = 5
    auto_cleanup = True

    feeds = [
        # (u'전체기사', 'http://rss.joins.com/joins_news_list.xml'),
        (u'주요기사', 'http://rss.joins.com/joins_homenews_list.xml'),
        # (u'경제',     'http://rss.joins.com/joins_money_list.xml'),
        # (u'사회',     'http://rss.joins.com/joins_life_list.xml'),
        # (u'정치',     'http://rss.joins.com/joins_politics_list.xml'),
        # 많이 본 뉴스
        (u'전체기사', 'http://rss.joins.com/sonagi/joins_sonagi_total_list.xml'),
        (u'경제',     'http://rss.joins.com/sonagi/joins_sonagi_money_list.xml'),
        (u'스포츠',   'http://rss.joins.com/sonagi/joins_sonagi_sports_list.xml'),
        (u'연예',     'http://rss.joins.com/sonagi/joins_sonagi_star_list.xml'),
        (u'사회',     'http://rss.joins.com/sonagi/joins_sonagi_life_list.xml'),
        (u'정치',     'http://rss.joins.com/sonagi/joins_sonagi_politics_list.xml'),
        (u'지구촌',   'http://rss.joins.com/sonagi/joins_sonagi_world_list.xml'),
        (u'IT과학',   'http://rss.joins.com/sonagi/joins_sonagi_it_list.xml'),
        (u'사설',     'http://rss.joins.com/sonagi/joins_sonagi_opinion_list.xml'),
    ]
PK�X�`�

joop.png�PNG


IHDR��h6�IDATxڭ�O
�@�9MAY`;o�S�F�HI�'�v�ě�+q��`�!y|��=yM|���AҶ-�QP���y���m��}�(
����8�4���W�(��
��+��@OG�u]w]'�-��a/�|}@s�9
�G����`�xs�L�0"�#[]���ϔ�r6�a)� �sJ��Q�4�o+�O�IY�����^�<�eM�IEND�B`�PK�X�O�
�
joop.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag
import re


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class JoopRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'nl'
    country = 'NL'
    version = 1

    title = u'Joop'
    publisher = u'Vara'
    category = u'News, Politics, Discussion'
    description = u'Political blog from the Netherlands'

    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False

    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = []
    keep_only_tags.append(
        dict(name='div', attrs={'class': 'author_head clearfix photo'}))
    keep_only_tags.append(
        dict(name='h2', attrs={'class': 'columnhead smallline'}))
    keep_only_tags.append(
        dict(name='div', attrs={'class': re.compile('article.*')}))

    extra_css = '''
                body {font-family: verdana, arial, helvetica, geneva, sans-serif;}
                img {margin-right: 0.4em;}
                h3 {font-size: medium; font-style: italic; font-weight: normal;}
                h2 {font-size: xx-large; font-weight: bold}
                sub {color: #666666; font-size: x-small; font-weight: normal;}
                div.joop_byline {font-size: large}
                div.joop_byline_job {font-size: small; color: #696969;}
                div.joop_date {font-size: x-small; font-style: italic; margin-top: 0.6em}
                '''

    INDEX = 'http://www.joop.nl'

    conversion_options = {'comments': description, 'tags': category, 'language': language,
                          'publisher': publisher}

    def parse_index(self):
        sections = ['Politiek', 'Wereld', 'Economie',
                    'Groen', 'Media', 'Leven', 'Show', 'Opinies']
        soup = self.index_to_soup(self.INDEX)
        answer = []

        div = soup.find('div', attrs={'id': 'footer'})
        for section in sections:
            articles = []
            h2 = div.find(lambda tag: tag.name ==
                          'h2' and tag.renderContents().decode('utf-8') == section)
            if h2:
                ul = h2.findNextSibling('ul', 'linklist')
                if ul:
                    for li in ul.findAll('li'):
                        title = self.tag_to_string(li.a)
                        url = self.INDEX + li.a['href']
                        articles.append(
                            {'title': title, 'date': None, 'url': url, 'description': ''})

            answer.append((section, articles))

        return answer

    def preprocess_html(self, soup):
        div = soup.find('div', 'author_head clearfix photo')
        if div:
            h2 = soup.find('h2')
            if h2:
                h2.name = 'div'
                h2['class'] = 'joop_byline'
                span = h2.find('span')
                if span:
                    span.name = 'div'
                    span['class'] = 'joop_byline_job'
                div.replaceWith(h2)

        h2 = soup.find('h2', attrs={'class': 'columnhead smallline'})
        if h2:
            txt = None
            span = h2.find('span', 'info')
            if span:
                txt = span.find(text=True)
            div = new_tag(soup, 'div', attrs=[('class', 'joop_date')])
            div.append(txt)
            h2.replaceWith(div)

        return soup
PK�Xԝ-J��jot_down.png�PNG


IHDR  �s��IDATxڝ�]HSqƟ�K�\M�AR��QFTXQf���@,��"ʼ(�"Q2����"kvd7�u!D�I��qQ.a�}�����َ2��ܝ�=p�s�WZ�lJS�lJ��Z)�Z�Q���Q��*�=>8U[uCc�+R(���qr����oWj,�D��&�ȧ~���;�NV�\�j~8I�4����r?S��4r�V�8�y�RRt�Z�,l��'@Y8�N-"����_��h3q��(�@���,��J��͞O�ms�|=�࢜��`7��ejNN�A�����'�V�-L��ׅ��;8������Ԧ�A��V\�12�Q�XL7�t�A��H�im$og�ޛZ�`� �	�8��`IP-fF�j`6.l4��tDc�!hX���ˌ�U9<	�J���A�Д6��hjo�_�S��}�{1Ry��Ǣ���F���U��Cr�L�L�ap.���t��p?�7=���c;.��-^^s��8#o���Rɦ���g?�_��1n�K�e0��y����iF���(ǡ��"��:�Ը�X�	62�V��,��iBZ1w&m�Ǹq�*b�__=�\ޡ�1�#�팎U�+ѦCH����V�E3�ʣ8V��\�B˵O}�R��*�w�&���q�w˜IEND�B`�PK�XT�~���jot_down.recipe#!/usr/bin/env  python
__license__     = 'GPL v3'
__copyright__   = '23 June 2013, desUBIKado'
__author__      = 'desUBIKado'
__description__ = 'Contemporary Culture Magazine'
__version__     = 'v0.03'
__date__        = '28, July 2016'
'''
http://www.jotdown.es/
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class jotdown(BasicNewsRecipe):
    author        = 'desUBIKado'
    description   = 'Revista digital con magníficos y extensos artículos'
    title          = u'Jot Down - Contemporary Culture Magazine'
    publisher      = 'Wabi Sabi Investments, S.C.'
    category       = 'Opinion, culture, science, movies, TV shows, music, blogs'
    language       = 'es'
    timefmt        = '[%a, %d %b, %Y]'
    oldest_article = 7
    delay          = 1
    max_articles_per_feed = 20
    masthead_url   = 'http://www.jotdown.es/wp-content/uploads/2011/04/logoJotDown.png'
    use_embedded_content  = False
    remove_javascript = True
    no_stylesheets = True

    feeds          = [
                         (u'Portada', u'http://www.jotdown.es/feed/')
                     ]

    keep_only_tags     = [dict(name='div', attrs={'id':['content']}),
                          dict(name='div', attrs={'id':['comments']}),
                         ]

    remove_tags        = [dict(name='a', attrs={'href':['http://alternativaseconomicas.coop/']}),
                          dict(name='div', attrs={'class':['reply','after-meta','tags_list','wp_rp_wrap  wp_rp_plain','after-meta','share_box']}),
                          dict(name='div', attrs={'align':['center']}),
                          dict(name='span', attrs={'class':['fbreplace','says']}),
                          dict(name='img', attrs={'class':['avatar avatar-60 photo']}),
                          dict(name='li', attrs={'class':['post pingback']}),
                          dict(name='div', attrs={'id':'respond'})
                         ]

    remove_tags_after  = dict(name='div' , attrs={'id':'respond'})

    preprocess_regexps = [
        # To change the small size of the text
        (re.compile(r'font-size: small', re.DOTALL|re.IGNORECASE), lambda match: 'font-size: medium'),
        # To present the image of the embedded video
        (re.compile(r'<object type="application/x-shockwave-flash" data="http://www.youtube.com/v',
                    re.DOTALL|re.IGNORECASE), lambda match: '<img src="http://img.youtube.com/vi'),
        (re.compile(r'&rel=0&fs=1"', re.DOTALL|re.IGNORECASE), lambda match: '/0.jpg"><object'),
        # To remove the link of the category
        (re.compile(r'<div class="meta">', re.DOTALL|re.IGNORECASE), lambda match: '<div class="meta"><!-- '),
        (re.compile(r'</a>, <a href="http://www.jotdown.es/category', re.DOTALL|re.IGNORECASE), lambda match: ', <!--'),
        (re.compile(r'"category tag">', re.DOTALL|re.IGNORECASE), lambda match: '--> '),
        (re.compile(r'</a> &mdash;', re.DOTALL|re.IGNORECASE), lambda match: ''),
# To remove the link of the title
        (re.compile(r'<h1 class="title"><a href="', re.DOTALL|re.IGNORECASE), lambda match: '<h1 class="title"><div class="'),
        (re.compile(r'</a></h1>', re.DOTALL|re.IGNORECASE), lambda match: '</div></h1>')
    ]
PK�XEs-��journalgazette.png�PNG


IHDR���R0PLTE��������"�"�"�"�"�"�"�"�"�"�"8��tRNS��������wfUD3"���PIDATx�c@�+.�P��"��M``5���p5��9@p�C��uIT�J�R���bL1`��b��}�0&�X";h;I��IEND�B`�PK�Xow���journalgazette.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'somedayson & TonytheBookworm, revised by Cynthia Clavey'
__copyright__ = '2010, Cynthia Clavey cynvision@yahoo.com'
__version__ = '1.02'
__date__ = '05, september 2010'
__docformat__ = 'restructuredtext en'
from calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1283666183(BasicNewsRecipe):
    title = u'Journal Gazette Ft. Wayne IN'
    __author__ = 'cynvision'
    oldest_article = 1
    language = 'en'
    max_articles_per_feed = 8
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    auto_cleanup = True

    feeds = [(u'Opinion', u'http://www.journalgazette.net/opinion/rss/'),
             (u'Local News', u'http://www.journalgazette.net/news/local/rss/'),
             (u'Sports', u'http://www.journalgazette.net/sports/rss/'),
             (u'Business', u'http://www.journalgazette.net/business/rss/'),
             (u'Entertainment',
              u'http://www.journalgazette.net/entertainment/rss/'),
             (u'Food', u'http://www.journalgazette.net/food/'),
             (u'Blogs', u'http://www.journalgazette.net/blog/rss/'),
             ]
PK�Xy6kx��journalofaccountancy.png�PNG


IHDR@@%�	pHYs.#.#x�?vRIDATh�Zkl�u>�ܙ�ǒ�]��)E�DJrdY�\;ہ�>���i��W�#(���"��A[�h�h�ID��؎�z�o�"�7%r�X>��}�̽��Y.�҉c2�|��;�����9�~眻����
P(DЁ�s=��xvN�9P���/\@���3�3,T\ SJqp��d���
���w,
F��r�DR)`d ĝѳ�=��QY�'�̈���$�o�P��rd��}ss+@�x�܀0��T}�O?X�v\'X! 2+�����,��ۭ��Jg�`Yx����[n��Ͽ�\U$P�_�ɴ�D"�N�,��S��SR�#R�
��3
�Q���+�,)3�Rݼ����[[�R�����~�����v�����f�4th<T��3ݟ<�Q�$��c�^ 	a���ꢩ���6���dM�ǣ�\BJ�������y{.�$BE�reyyl�'C�c����C5H,X�#�����6�^�Y����,o�ۿ~��NgRn7�� ��ʯ����^����][wV����3`A�n�\VfL%�?�ѻo��H ��Q�R?����~vkq1��;s?�t+����yEBMӠx@�X�ڕ�\Vg ���>�Yy��p�\J5:��nd{[\�z/O:���%�H���$(Ff�pcsk�~��Z;}�I�u�������zI�W7T��k7" �����z����y'Z#��`D�QP0�&�i�����gδ�Y���|��ї�C`�\�Ĕ"`ΤL3�/�`��	۠��^����e�ҟ9w2��c#ف�)��hj�W
�y3�b� �"�b�ə�����F<�R��?��>��PfTR�P�cO�@��rف,�N�ͼ,�D��V]C���lu5�Ë���]H��_��/�:�Qӈ�ၽ���H�����õ��3�����t%>:2��J��2{z�J����{����ߜo�:z��A�յ���@XZZ��g�}�?���l~�;o,-%n��U
��������S�^JnB�!_���@�BG�G�6����o��fd�^�*�H��OWXZ��Q񕯼��\}ob��/„�ɳ����2|Z��M`�.��@��^���g
e
�X]k�|��+�\8z�^��kC�K!"����v,U�
�_|���u�<}��h�ƒ��Ҫ���
kT�~/��m\�:UR�J���87_�D��	�q{��v$B[�J;�)�J)MMS���'��/}���{muE��Z�c�ǻ������"�� !Hׄ\��p3�zm�����:��Z���,GFf��̏���
�:#&BDA��c���٩��N��*�;�����W�W֘�H�_H%3���?�nm;�r���Wh��BfltJ1�K@)i���B�퉳g;��Kj

UG[��"��ᡩd2�O(f̤����%�SO�꺆��`Y��f�,��]��Ā�8���z�ƍ�S'[(GD6q�d{E�A��S��L�RJ13�Ӟ(�����F�����l��I�а��������湯4�J9��Dx�����ĕ�}�]��Gꑘ��
=]������n�4��A)�7��􃱻�Ο}��D!�ǣ��:,�0?��3<iY�|r���L��K�vv���$�@$,�F��Xs�H�b+�UÃ��df�@C��M�Q)�Doߚy���p��	�e%���>2YYYVO�Ln��,�̙n�������v�zZ˃�>������,��L	7��㉞��5�{L���К7m	I�Og��xb;@���%�T�)���Nm|򩮒7	ړ���򠿽�Q
!FF����R���J����۩7�vtք`ƽ.r��ۭ�8�})"��&�b��N�jvf��w���m�i���Q��/L3+_iI�·����x``�3/�
�����)���N�\�[��~�������W�.��٬�,$H�������p؇���S��Y��͛7���A]'�M.F�A��
\��D[k��%���k�ﮙ#��<�\��^#1:�b���;�ľ��}��N]������q2�~��G+Hbhpf��I���1``p�w�N!bl+s��P��Љ㭕�e�&����?�h����?{'bY8>�>5u��:L��L!t�J)t�EX�,�̱���O�n��# 0!��ަ;M��w��5��ƚ]��d�9f����e��T�� ��0t
�ْ�����.�e˿�ԣi."
���p�
j���5J�D�럏�n(�a�����y��s:�#�eI����y�T����nޜlשׁo�FP}�>�D�Q��NLl��LKȄ���L<�$!��1��g��Ƶ��B���ee�e!�����ɧ�L%���;�DN��$�X-EV���=`o/���im-v��dU�����F2����`��̒�,�+�	��=�P��w�vש��;�c��TJm)?z�2�%yhh|td��XMm}�# H�S&�P��	��g��XR�,�)�%eXڍ!�`2X@�z������	V�[��{�����%+�[����C�L�����ă(?�Ϊn�Zgۑ�GD��z�c	��?�R�L"�Q,0k��X��+�ʽ���ѡ$+~�LճϞ64`��if�@_���8�ڬ?�>�p���u�)��hd8:qo^���@SHJu����}��t�R�K���Tl2�l������i���W_�l}}�H1p*��|�ou	�����"�v��+f�r���1d֢�?���X=3�D��~k��2�2MiJe�=D>'ע�o�u������VG���?y����e舚T���z��4�p�\�fk��G.>���;!�D��p���!%�����w�M�X)f��|�T���,����z��ǻ{�+�a�з�s�K�n���i���/|ṶV[gD"��,�H��z���6�;�D�%� ���].�n��+�Π��+z%-�_���1F�,����NE�_Ww�l{�J��k��f���?�8E������e��v:���y;;.<�T�ɶ�J?%��o����7�i;��Ǚ��U˱҃�aC'@)�_�ܹ�g��tڝb�cf�d,�|��D"�H��V��#����ol(����N9��x���n���݁Ҳ�ͬ%��ɲ��ގmh�;�TW[S�4��&A�<�����ꊶc
����.p4�
�,@�~�c�%>O��C!<x�
��	%+�낑����`f��Z��,6�J)Bi���$
:3!��Q)3����B�⌇b��1
��HG����*�dŖ���s�����	r{@D��	�&38{����v]��A�O"(QT��bp<�Ȁ��{�](n�1�B�4
��@P���G����3�W��o�b�]2@�y�i6�` Ǟ�h;.^��E�����y�>��5���^8UWT,��#k�x�{� lmZ�3�y\.H���3i�+%�g�rL%����w#Ʉ�ׇ��='��-m�����m��?{sZ3�i��g��6�����aM��t-�R���͍�Z0�JZ��n��a&'��������?�R]���|p/Ӳ�\�qe������8r�pb;�����X591���><4y��V;��s�ӟ>w����c��|�z�S-��^�n>{�����ky[��{�{cu��g���/!B}}�͛�/��t_������p��3�{��F��?�\��ށ��3g��Gkk������7g.�|�����VW�.�hO,�f�.��z}Bp(TZU���Pm0\R�L6�
O��u7C>B��Q0X����h��0.�<��&�ɥ�%��K��ա5��27	*�m��iV�+���2`����Or�pS����̲����U �4��W.O����j:e���V,����7�:3��`>s�n=�f>o��N����EW��
N��,O��ا��TJ�N��߳o��n'��3�`�?3'm�\�o��/���.�&67�� c}k[)^��XY����s��»�_^^��9p������KTx;��ɏ�]Y�6��YZ���(��)�r:J@�T�H*# 202��/��y�C0��b��5
�,�t�Dy�y�2�Ჽ�}��]Mv�PC���dKZ*���s9@D���?uRPTGU���{0�B�x�Wb��e$.H"�Ѥb\dGpu���5DTP�q�7��?��|S5݄�IEND�B`�PK�X8E�journalofaccountancy.recipe#!/usr/bin/python2
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2020, Jose Ortiz <jlortiz84 at gmail.com>

from __future__ import absolute_import, division, print_function, unicode_literals

import json
from time import sleep
from mechanize import Request
from contextlib import closing
from calibre.web.feeds.news import BasicNewsRecipe


def absolutize(url):
    if url.startswith('/'):
        url = ('https://www.journalofaccountancy.com' + url).partition('#')[0]
    return url


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(
        attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)}
    )


class JournalOfAccountancy(BasicNewsRecipe):
    __author__ = 'Jose Ortiz'
    language = 'en'
    title = u'Journal of Accountancy'
    description = (
        'A monthly journal of tax, financial reporting, auditing and other'
        ' topics of accountancy from American Institute of Certified Public'
        ' Accountants (AICPA).'
    )
    publication_type = 'magazine'
    masthead_url = 'http://developmentprofits.com/images/JournalOfAccountancy.jpg'
    no_stylesheets = True
    remove_javascript = True

    conversion_options = {
        'comments': description,
        'tags': 'News, Accountancy',
        'publisher': 'American Institute of Certified Public Accountants (AICPA)'
    }

    keep_only_tags = [classes('contentSectionArticlePage')]

    def parse_index(self):
        # ISSUES ######################
        issues_url = 'https://www.journalofaccountancy.com/issues.html'
        with closing(self.browser.open(issues_url)):
            pass
        ###############################

        common_headers = {
            'X-Requested-With': 'XMLHttpRequest',
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'DNT': '1',
            'Pragma': 'no-cache',
            'Cache-Control': 'no-cache'
        }

        URL_TEMPLATE = 'https://www.journalofaccountancy.com/content/jofa-home/issues/jcr:content/main-content-section/issuelibrary.%s.service'

        # INIT #################################################
        init_url = URL_TEMPLATE % 'init'
        init_headers = {'Referer': issues_url}
        init_headers.update(common_headers)

        self.log('\nINIT URL at ', init_url)
        with closing(self.browser.open(Request(init_url, None, init_headers))) as r:
            issue_path = json.loads(r.read())[0]['page']['path']
        ########################################################

        # FILTER ###############################
        filter_url = URL_TEMPLATE % ('filter.' + issue_path.split('/')[-2])
        filter_headers = {'issues': issue_path}
        filter_headers.update(init_headers)

        self.log('\nFILTER URL at ', filter_url)
        with closing(
            self.browser.open(Request(filter_url, None, filter_headers))
        ) as r:
            issue_data = json.loads(r.read())[0]
        ########################################

        self.cover_url = absolutize(issue_data['issueCover']['src'])
        self.log('cover_url at ', self.cover_url)
        self.timefmt = ' ' + issue_data['issueName']

        # INDEX ####################################
        index_url = absolutize(issue_path + '.html')
        self.log('INDEX URL at ', index_url)
        self.log('3 second pause')
        sleep(3)  # mimicking human user behavior
        with closing(self.browser.open(index_url)):
            pass
        ############################################

        service_headers = {'Referer': index_url}
        service_headers.update(common_headers)

        def get_data(service):
            service_url = (
                'https://www.journalofaccountancy.com' + issue_path +
                '/jcr:content/main-content-section/' + service + '.en.service'
            )
            self.log('\nSERIVICE URL at ', service_url)
            req = Request(service_url, None, service_headers)
            with closing(self.browser.open(req)) as r:
                return json.loads(r.read())

        def make_topic(category, articles):
            topic = (category, [])
            self.log(topic[0])
            for article in articles:
                title = article['articleTitle']
                url = absolutize(article['page']['path'] + '.html')
                desc = article.get('articleAbstract')
                self.log('\t', title, ' at ', url)
                topic[1].append({'title': title, 'url': url, 'description': desc})
            return topic

        ans = [
            make_topic('SPOTLIGHT', get_data('issuelanding/articles1')),
            make_topic('FEATURES', get_data('issuelanding/articles2'))
        ]

        for category, articles in get_data('articletypelist').items():
            ans.append(make_topic(category, articles))

        return ans
PK�X#^[WJJ	jp_dk.png�PNG


IHDR(-SoPLTE�������������������������ޔ�ތ�ބ��{��s��s��k��c��Z��Z��R��J��B��:��:��1��)��!��!�����潭�5�IDATx�u�EAE�=��p�[�6�0�����e�`��}�m�z'�|�8)�Mv��Ub�{�
��[/�N�Z,yի���9�/D�:���k���k�q�A�K#�I�]�a1e�,M�4ɶi�֩�z•d]',���9�{��p�����/*�IEND�B`�PK�X��܇��jp_dk.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
jp.dk
'''

from calibre.web.feeds.news import BasicNewsRecipe


class JP_dk(BasicNewsRecipe):
    title = 'Jyllands-Posten'
    __author__ = 'Darko Miletic'
    description = 'News from Denmark'
    publisher = 'jp.dk'
    category = 'news, politics, Denmark'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'da'
    auto_cleanup = True

    feeds = [
        (u'Tophistorier', u'http://www.jp.dk/rss/topnyheder.jsp'),
        (u'Seneste nyt',
         u'http://jp.dk/index.jsp?service=rssfeed&submode=seneste'),
        (u'Indland', u'http://www.jp.dk/rss/indland.jsp'),
    ]
PK�X61̄�	jpost.png�PNG


IHDRb��	PLTE�g�BtRNS@��f)IDATx�c@�Q@""��``a���D3��
t�|�	^�ajpIEND�B`�PK�X������jpost.recipefrom 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 JerusalemPost(BasicNewsRecipe):

    title = 'Jerusalem Post'
    description = 'News from Israel and the Middle East'
    use_embedded_content = False
    language = 'en'
    keep_only_tags = [
        classes('margin-container-body article-title article-subline article-inner-content-breaking-news'),
    ]
    remove_tags = [
        classes('share-buttons hide-for-premium'),
    ]
    remove_attributes = ['style']
    no_stylesheets = True

    __author__ = 'Kovid Goyal'
    max_articles_per_feed = 10
    no_stylesheets = True

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based')

    feeds = [
        ('Top Stories', 'https://www.jpost.com/Rss/RssFeedsHeadlines.aspx'),
        ('Arab Israeli Conflict', 'https://www.jpost.com/rss/rssfeedsarabisraeliconflict.aspx'),
        ('US Politics', 'https://www.jpost.com/rss/rssfeedsamerican-politics'),
        ('Israel News', 'https://www.jpost.com/rss/rssfeedsisraelnews.aspx'),
        (
            'Middle East News',
            'https://www.jpost.com/rss/rssfeedsmiddleeastnews.aspx'
        ),
        ('International News', 'https://www.jpost.com/rss/rssfeedsinternational'),
        ('Opinion', 'https://www.jpost.com/Rss/RssFeedsOpinion.aspx'),
    ]
PK�XC8

��jpost_fr.png�PNG


IHDR��h6KIDATx�c0�\����~���01"����?n�S�P.�ӀɠX�R���2��X
؃�=4`F0�����Ƌ(eIEND�B`�PK�X��R���jpost_fr.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class JerusalemPost(BasicNewsRecipe):
    title = 'Jerusalem post'
    language = 'fr'
    __author__ = 'TonytheBookworm'
    description = 'The Jerusalem Post (in French)'
    publisher = 'jpost'
    category = 'news'
    oldest_article = 30
    max_articles_per_feed = 100
    linearize_tables = True
    no_stylesheets = True
    remove_javascript = True

    masthead_url = 'http://static.jpost.com/JPSITES/images/JFrench/2008/site/jplogo.JFrench.gif'

    remove_tags = [
        dict(name='a', attrs={'href': ['javascript:window.print()']}),
        dict(name='div', attrs={'class': ['bot']}),

    ]

    feeds = [
        ('NEWS', 'http://fr.jpost.com/servlet/Satellite?collId=1216805762036&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench En route vers la paix',
         'http://fr.jpost.com/servlet/Satellite?collId=1216805762201&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench Politique', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737334&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench Securite', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737338&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench Moyen Orient',
         'http://fr.jpost.com/servlet/Satellite?collId=1215356737342&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench Diplomatie / Monde',
         'http://fr.jpost.com/servlet/Satellite?collId=1215356737346&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench Economie / Sciences',
         'http://fr.jpost.com/servlet/Satellite?collId=1215356737358&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench Societe', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737354&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench Opinions', 'http://fr.jpost.com/servlet/Satellite?collId=1215356737350&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench Monde juif',
         'http://fr.jpost.com/servlet/Satellite?collId=1215356737366&pagename=JFrench%2FPage%2FRSS'),
        ('JFrench Culture / Sport',
         'http://fr.jpost.com/servlet/Satellite?collId=1215356737362&pagename=JFrench%2FPage%2FRSS')
    ]

    def print_version(self, url):
        split1 = url.split("cid=")
        # for testing only -------
        # print 'SPLIT IS: ', split1
        # print 'ORG URL IS: ', url
        # ---------------------------
        idnum = split1[1]  # get the actual value of the id article
        # for testing only --------------------
        # print 'the idnum is: ', idnum
        # --------------------------------------
        print_url = 'http://fr.jpost.com/servlet/Satellite?cid=' + \
            idnum + '&pagename=JFrench%2FJPArticle%2FPrinter'
        # for testing only -------------------------
        # print 'PRINT URL IS: ', print_url
        # ------------------------------------------
        return print_url

    # example of how links should be formatted
    # -------------------------------------------------------------------------
    # org   version =  http://fr.jpost.com/servlet/Satellite?pagename=JFrench/JPArticle/ShowFull&cid=1282804806075
    # print version =  http://fr.jpost.com/servlet/Satellite?cid=1282804806075&pagename=JFrench%2FJPArticle%2FPrinter
    # -------------------------------------------------------------------------
PK�X���66jsonline.png�PNG


IHDR  ���IDATx�c��GS�0j��C�ä�GO=>s�9��9����r˖�w=���ǟ�_=�������&��U[����DC�åg���P��o���޺����?!*I�@3v	܂�ۮ��-2W���(���O��eAݔ7�!�u$n�o[r"x��d�J�K��Co�
|���b�b�S.�����y�λ|3�-�OY���/�0�W���jQB����G�>|���O5�ȡ`��;o����y'�f��-h����W~������j@�m޺{�UfO:He��&g-\e��ӔZ0g�y`�)�Tr�>J-��W_̳�E\�6@�̬G�@��_~.�r�v���|��(��Ͽ��}THEӖ�y��3r��c�pdi�,�[yMV6b�v�R��z	�ĐJr��e��ZqX4"[�_��j5��'�&n��,m%���W_�P�ʼ��=��Wo��C��&,�f����4o����gr'��Z=�l���nL�McIIEND�B`�PK�X�/��jsonline.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class JSOnline(BasicNewsRecipe):
    title = u'Milwaukee Journal Sentinel'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 2  # days
    max_articles_per_feed = 25

    no_stylesheets = True
    remove_tags_before = dict(name='div', attrs={'id': 'wrapper'})
    remove_tags = [
        dict(name='iframe'),
        dict(name='div', attrs={'class': [
             'right_float', 'headlines', 'side_section_container poll', 'side_section_container html']}),
    ]

    feeds = [
        ('Main Headlines',
         'http://www.jsonline.com/rss?c=y&path=%2F'),
        ('Business',
         'http://www.jsonline.com/rss?c=y&path=%2Fbusiness'),
        ('Milwaukee marketplace',
         'http://www.jsonline.com/rss?c=y&path=%2Fmarketplace'),
        ('Top Entertainment Stories',
         'http://www.jsonline.com/rss?c=y&path=%2Fentertainment%2Ftopstories'),
        ('Arts and Books',
         'http://www.jsonline.com/rss?c=y&path=%2Fentertainment%2Farts'),
        ('Movies',
         'http://www.jsonline.com/rss?c=y&path=%2Fentertainment%2Fmovies'),
        ('Music and Nightlife',
         'http://www.jsonline.com/rss?c=y&path=%2Fentertainment%2Fmusicandnightlife'),
        ('Dining',
         'http://www.jsonline.com/rss?c=y&path=%2Ffeatures%2Fdining'),
        ('Fashion',
         'http://www.jsonline.com/rss?c=y&path=%2Ffeatures%2Ffashion'),
        ('Health and Fitness',
         'http://www.jsonline.com/rss?c=y&path=%2Ffeatures%2Fhealth'),
        ('Top Metro Stories',
         'http://www.jsonline.com/rss?c=y&path=%2Fnews%2Ftopstories'),
        ('Crime',
         'http://www.jsonline.com/rss?c=y&path=%2Fnews%2Fcrime'),
        ('Sports',
         'http://www.jsonline.com/rss?c=y&path=%2Fsports'),
    ]

    # def print_version(self, url):
    # return url+'/0'

    def preprocess_html(self, soup):
        story = soup.find(name='div', attrs={'id': 'mainContent'})
        soup = BeautifulSoup(
            '<html><head><title>t</title></head><body></body></html>')
        body = soup.find(name='body')
        body.insert(0, story)
        return soup
PK�X����jurnalulnational.png�PNG


IHDR��h6�IDATx�-Q�KTA�������4���H+T
"h�%*	��2"
�z����@𵷀z�HX�I*��5w��u�ww��53���{`f��ǜ���"�xnd�-�0��.��R�L�>�T��%�!`�@	Y{\y;�ȣ�C���ol�M=���8��4��*0!���@������r��T��q������Bv�垨B�����:�q���ؓ��
ѵ�{7�wG����S>EQ��a�ޮ��8���H������y���w=T1W�x].��τ�i�𹔚��i�BRW�зD�h���N&P��B�C�u���0����p~�[�͗�1>=C|�� �vZ�q5!A��r��{�P�
�S��~.L��f��Wӆa$�_�{k������a���9O���(C����Ɍ����9�_��.qI�,Bw�]�
G�����F�0ۮ�}���<�!�cXA��^g[v}��é��9���$-���Dw\E����N�[�-���/x_��Je�X*o�`�Z��4��z�A��n��#���Ѷ�#��
�J�ӽ�66�X�)R޲�%���x2տ��h���&�g�2�fr?�"_X��0F-�ֵp�����?O�V��X��IEND�B`�PK�XR�P��jurnalulnational.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
jurnalul.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class JurnalulNational(BasicNewsRecipe):
    title = u'Jurnalul Na\u0163ional'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'\u0218tiri din Rom\u00e2nia'
    publisher = 'Jurnalul National'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania'
    encoding = 'utf-8'
    cover_url = 'http://www.jurnalul.ro/images/sigla.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'h3 art_title'}), dict(
            name='div', attrs={'class': 'only_text'})
    ]

    feeds = [

    (u'\u0218tiri', u'http://www.jurnalul.ro/rss/stiri-3028.html'),
    (u'Special', u'http://www.jurnalul.ro/rss/special-3001.html'),
    (u'Sport', u'http://www.jurnalul.ro/rss/sport-3035.html'),
    (u'Bani Afaceri', u'http://www.jurnalul.ro/rss/bani-afaceri-3006.html'),
    (u'Viata Sanatoasa', u'http://www.jurnalul.ro/rss/viata-sanatoasa-3010.html'),
    (u'Stiinta Tehnica', u'http://www.jurnalul.ro/rss/stiinta-tehnica-3019.html'),
    (u'Timp Liber', u'http://www.jurnalul.ro/rss/timp-liber-3022.html'),
    (u'Fun', u'http://www.jurnalul.ro/rss/fun-3038.html'),
    (u'Acum 20 de ani', u'http://www.jurnalul.ro/rss/acum-20-de-ani-3073.html')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X���2!!jutarnji.png�PNG


IHDR�a�IDATx�]�OLQ���7o�1�x@�PR�%V�P)��B6v*,	Ql,,�X"�(R�3�_3o��xE����=�9�NW��{��󼽡�-1��Fc��H��\�2�!�
�A<|�4i������VG8��2�T"o�0FC
a2��S _<��B>���ak8�q��y�e��lRK�EJ�8��~o�p�A=n|��M�l�pj��۔�{�g�P(`☨>�����=I��Xg������j3{��l�l�y�Bw�<2G�aDg�6\gq��u�+�C�ͧ�3�V(I��5JF-\Nw�O ��r_�u��4���[���zh��$f��"Ѷ���\�K��+��Gd����k�(Jb"�$I���r�HT/���W�a���_(E�X����|~�P��8�љ9�\����_d*����O��J1��AƝ8C��Qt�?10���Cktm�z�!]��K�C��5����s'����J����X�"z��7_~�t�r�<_��4w�3D�;k�ŋ��C� �|FAĘ���ɓϝ6����GB��U��m��kxK��.\�׍	�E<t	�x���ڔ)���}ꑼ1���[�׾��bj�ʄ�5*2Ƙ�!���E!a�����b|�ʼ��N;��w�Ka]�~�'o��6Ɣ�l
ƠI���	̜^g�ܹ�lҿ�%����ˮǯ���.��U���)2թ1{��Nu�����k`����IEND�B`�PK�X%��OOjutarnji.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2009, Darko Miletic <darko.miletic at gmail.com>'
'''
jutarnji.hr
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Jutarnji(BasicNewsRecipe):
    title = 'Jutarnji'
    __author__ = 'Darko Miletic'
    description = 'Hrvatski portal'
    publisher = 'Jutarnji.hr'
    category = 'news, politics, Croatia'
    oldest_article = 2
    max_articles_per_feed = 100
    delay = 1
    language = 'hr'

    no_stylesheets = True
    use_embedded_content = False
    encoding = 'cp1250'
    lang = 'hr-HR'
    direction = 'ltr'
    extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{text-align: justify; font-family: serif1, serif} .article_description{font-family: sans1, sans-serif} .vijestnaslov{font-size: x-large; font-weight: bold}'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    remove_tags = [
        dict(name=['embed', 'hr', 'link', 'object']), dict(
            name='a', attrs={'class': 'a11'})
    ]

    feeds = [

    (u'Naslovnica', u'http://www.jutarnji.hr/rss'),
    (u'Sport', u'http://www.jutarnji.hr/sport/rss'),
    (u'Jutarnji2', u'http://www.jutarnji.hr/j2/rss'),
    (u'Kultura', u'http://www.jutarnji.hr/kultura/rss'),
    (u'Spektakli', u'http://www.jutarnji.hr/spektakli/rss'),
    (u'Dom i nekretnine', u'http://www.jutarnji.hr/nekretnine/rss'),
    (u'Uhvati ritam', u'http://www.jutarnji.hr/kalendar/rss')
    ]

    def print_version(self, url):
        main, split, rest = url.partition('.jl')
        rmain, rsplit, rrest = main.rpartition(',')
        return 'http://www.jutarnji.hr/ispis_clanka.jl?artid=' + rrest

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction

        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]

        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return self.adeify_images(soup)
PK�Xiђ\��juve_la_stampa.png�PNG


IHDR  D���bPLTE8`���FkBg����������>e<cJn�Zz�d��n�������Ŧ��������������������
=dIm��� Lp-Vx���.Wy������Mo�Qs�Ej�Ej�Fk[|�]}�^~�b��c��	9ad��e��GlHm	:as��v��w��y��|��������������������������������Ko�����¡�¢��Ko
:b��ǩ�Ǫ�Ȭ�ʭ�ʮ�˴�ϸ�ѹ�Ҿ�տ�������������������������������)Su���?e���Bh���r��-Wyr��Dj��4\}������8_���9`����>d�@e����Af�Ci������Di��IDATx����A��b��ڶm�V��w����@���
%�R��l}�0%L��W�I��ܵG)���FE�R�ib�呥190�}�����`���j!dw�`���f�̖+A�Xw��W�m}�_�|
��a0@�coC��Wұ��!벑^r<IK�!3�~肟J�}��e@�5�)�Л"��x��e��r���E�9�J`�GN��J@����6���f=�?[��vIc�ٕ���ڌ���d"�v�6�\5�/PZ�YE Y.PF}IEND�B`�PK�X��!��juve_la_stampa.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1336504510(BasicNewsRecipe):
    title = u'Juve - La Stampa'
    oldest_article = 1
    language = 'it'
    max_articles_per_feed = 100
    auto_cleanup = True
    masthead_url = 'http://www3.lastampa.it/fileadmin/media/sport/quijuve/top_quijuve.jpg'
    feeds = [(u'Qui Juve - La Stampa', u'http://feed43.com/2352784107537677.xml')]
    remove_tags = [dict(name='div', attrs={
                        'class': ['article-toolbar', 'sezione sezione-news', 'intestazione']})]

    description = 'News about Juventus from La Stampa'
    __author__ = 'faber1971'


__version__ = 'v1.0'
__date__ = '8, May 2012'
PK�X`gIjssjuventudrebelde.png�PNG


IHDR  D���gPLTE���5]�4\������4\�2Z�3[�����Ag�F���������!��4]�1Z�,�����Ej����������2[�Y��`��g��g��h��j��k��	��������������ٸ�����2[����������:��:��;a�;��<c�>d�>d�y��z��z��{��{��{��}��}�����񃜾��������Ő��������ƒ��������>e�?����%��+�����
�������������Gl�7^�6^�l��m��n��p����Gk����a��
���������8_�q��s��t��u��x��G���I��Jn�Ko�9������1Y�
���������������׵���������K��Lo�Qs�T��U��Xy�X��X����������������Yz���������3\���b���������������������������������c��d�����e����f�����f���������f�����������������������������]{���IDATx^��c��@��Lxh�ڶm�^۶m۶m�Gm�sv��T��5Ouwj(� m܂��E5�	=r��X<��K�tS�حD<�hoR�Ii�W��_l�H�

ǽ=������<��)�0�
_š�kp;�`0���"�<,iGU�N�����h*�h&@�:�a�Ͻ��3	P��i�����pC��2��Tφ
z�0��m�p�z;R��~��'���A��R��vt�5�1�S�e�j9<��2P� ��";F�ϋD�A�]�t�srxv?Y�%_D|��G$�;C�&ԃ���Hj ��:����'Fdl�xtY�E���:f���й��մTr�W�k��H��Dr��Аz�e����م�7!�m�7�n!�U`A��8k�H��“M5R-W:�+Nn�Cdw��5�Ys�>�Ꙙ+�ː�C�b��~R��62�IEND�B`�PK�X�I���juventudrebelde.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Oscar Megia Lopez'
'''
juventudrebelde.cu
'''
import re
from calibre.web.feeds.recipes import BasicNewsRecipe


class JuventudRebelde(BasicNewsRecipe):
    title = u'Juventud Rebelde'
    __author__ = 'Oscar Megia Lopez'
    description = 'Periodico cubano'
    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'Juventud Rebelde'
    category = 'Noticias'
    language = 'es'
    publication_type = 'Periodico'
    extra_css = ' body{ font-family: Verdana,Helvetica,Arial,sans-serif } .title{font-weight: bold} .read{display: block; padding: 0; border: 1px solid; width: 40%; font-size: small} .story-feature h2{text-align: center; text-transform: uppercase} '  # noqa
    preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')]
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': ['title']}), dict(
            attrs={'class': ['read']}), dict(attrs={'class': ['author']})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['share']}),
    ]

    remove_attributes = ['width', 'height']

    feeds = [
    (u'Generales', u'http://www.juventudrebelde.cu/get/rss/grupo/generales/'),
    (u'Internacionales', u'http://www.psychologytoday.com/blog/romance-redux/feed'),
    (u'Ciencia y Tecnica', u'http://www.juventudrebelde.cu/get/rss/noticias/ciencia-tecnica/'),
    (u'Opini\xf3n', u'http://www.juventudrebelde.cu/get/rss/noticias/opinion/'),
    (u'Cuba', u'http://www.juventudrebelde.cu/get/rss/noticias/cuba/'),
    (u'Cultura', u'http://www.juventudrebelde.cu/get/rss/noticias/cultura/'),
    (u'Deportes', u'http://www.juventudrebelde.cu/get/rss/noticias/deportes')]
PK�X����~~	jv_dk.png�PNG


IHDR  D���PPLTE���������ܱ�����������
����������������������������%���|�ū�پ��J��M��N��D�������P��Q��R��V��Y��]��mľpſq�y��z������ȉ�ˑ�Ζ�С�զ�ר��	����ڭ��������������޵�޷�߹���������������������������� �����������
��������*��+��������2�����������5����8�����������������������������������8��=��C������IDATx���r�A@���smĶY�m�v�_��̞ _��(%�[��W3n�%��A��3�>U����+r�t���r2�㫴�)��V�庒�z$��K��#9�(>����Յ��Y�;��L��Z��q[B~�{�h�d7�35���	I�&���Q�Sv�`Z���=�練�"g��,i�U�f����B^uƛ���f�
�����12�FJ�;�)���m�Y�ƙ��IEND�B`�PK�X��ܦ��jv_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
JydskeVestkysten | JV.dk | jv.dk
'''


class WwwJv_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'JydskeVestkysten | JV.dk | jv.dk'
    description = 'JydskeVestkysten'
    category = 'newspaper, news, localnews, lifestyle, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 25
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Nyheder', 'http://www.jv.dk/rss/nyheder'),
        ('Indland', 'http://www.jv.dk/rss/indland'),
        ('Udland', 'http://www.jv.dk/rss/udland'),
        ('Kultur', 'http://www.jv.dk/rss/kultur'),
        ('Livsstil', 'http://www.jv.dk/rss/livsstil'),
        ('Hus &amp; Have', 'http://www.jv.dk/rss/husoghave'),
        ('Billund', 'http://www.jv.dk/rss/billund'),
        ('Esbjerg', 'http://www.jv.dk/rss/esbjerg'),
        ('Haderslev', 'http://www.jv.dk/rss/haderslev'),
        ('Kolding', 'http://www.jv.dk/rss/kolding'),
        ('Sønderborg', 'http://www.jv.dk/rss/soenderborg'),
        ('Skjern-Tarm', 'http://www.jv.dk/rss/tarm'),
        ('Tønder', 'http://www.jv.dk/rss/toender'),
        ('Varde', 'http://www.jv.dk/rss/varde'),
        ('Vejen', 'http://www.jv.dk/rss/vejen'),
        ('Aabenraa', 'http://www.jv.dk/rss/aabenraa'),

    ]

PK�X�6�-��kahokushinpo.png�PNG


IHDR  szz�zIDATx^��m�UW����{�s�{睷�
Qf,h����6m4��m0���1��XcbkUд�%��&�HۀBM#m�Hb,`�*3��0�����Ν��s�2u��@F��ϗ�ig��>��-��G��s��$Q�e��"h��{
TSr@���s��FX�������'U��#�(�ȹ�@��k1P+�) `��
�*��:��>���|�-L��3�`�NB�*���$��!���%M���p\�*KB�w�emA��SI�6#�@�I/��p @�瓥w���8{��o��s��)�Ña���ʩqϦL�-�%((�LP��z+Gpf��$~#^��~�n�
4��s<�=���*�C�S�z��P�P���w�ق��W��{į{�̳��o�=��.��fYs̴5~�7m$�9T�N��㩣C�㔮3c<vr�A���س���r
�^�Fu)0�*�j^�XT4s�����F�nc����f�9Jh���~����ƈ�z7�/,j+�(��K�P���
�1���`�9� M��.�
x� �+\�T	i,<z{N�[G�Î%FP�g0�X��P�����0;�9�d�F�:�Js	�]��x���R�]��^A�Ò�P��WP�Y,�U�.0I��Z�A����r�Vo��p�os�X\���Чz펦
�)�郅��HRň�;��x�*�
��*u��-� �OO��3g<K��ߌ�8��9�S�`3@���s(DB�\�*��x!�־��fo�;��g�>����#O1��s�@�t�YȔI)��'�7,���t����kaj��ϴ�bly;�����Uѝ})+��\}sP*�2���1���@Sl�3`OTR�
�7T�3J�3�'
,����."�W�
��##��DȀL��]��%��&�x�
�:��3�8�.�\Z8���z:s�[D8yU�2\��2\��l9�H=��s6\�%�C |��a^h��.Xᰩ�_<����0ZcA%ei� �g!…*l�*C��g�V�{�zG��X�)��g``Y�1�
�LGq1ग़Ur��
�<]e߱
�?	/wþ���` �Z$��a�l�z���Eh��Q�������� ���B�rh�y���1����d�@9�+W���I=��_�lU&Q�����|v��̫��r�BpƂJq�g�k��I�fD6���r��`���1��A��!����I<!�g���v�/c�	X��{��?b$}�@n#MN�ܯ���U�)��/��'�D����pW�B����z��&`
�3����?�
��Φ/��=���h�f�o�X@�\�*���)�g{V�d���4L��S�%�����?��q���o����\����_8F-y��=D�3�i��GہCz��P�O��3�!��m��/�d���iٌ����*�3��W_��/�\\���L�"�x��[J(��ƈ��:"��0��m�畆�=(U��1#��I�^CLg�����n:{Lj�.�v6�C�^�y3�2ЅP�ʤ�;����+=�+IEND�B`�PK�X6^
��kahokushinpo.recipe__license__ = 'GPL v3'
__copyright__ = '2010,2014, Hiroshi Miura <miurahr@linux.com>'
'''
www.kahoku.co.jp
'''

from calibre.web.feeds.news import BasicNewsRecipe


class KahokuShinpoNews(BasicNewsRecipe):
    title = u'\u6cb3\u5317\u65b0\u5831'
    __author__ = 'Hiroshi Miura'
    oldest_article = 2
    max_articles_per_feed = 20
    description = 'Tohoku regional news paper in Japan'
    publisher = 'Kahoku Shinpo Sha'
    category = 'news, japan'
    language = 'ja'
    encoding = 'Shift_JIS'
    no_stylesheets = True

    feeds = [(u'news', u'http://www.kahoku.co.jp/rss/index_thk.xml')]

    keep_only_tags = [{'class': "category"}, {'class': "ttl"}, {
        'class': 'photoimg'}, {'class': "txt"}, {'class': "data"}]
PK�X
��a!!kaloeviglokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X��wwkaloeviglokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Kalø Vig
'''


class KaloevigLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Kalø Vig'
    description = 'Lokale og regionale nyheder, sport og kultur fra Hornslet og omegn på kaloevig.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Kalø Vig', 'http://kaloevig.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Kalø Vig', 'http://kaloevig.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Kalø Vig', 'http://kaloevig.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Kalø Vig', 'http://kaloevig.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Kalø Vig', 'http://kaloevig.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Kalø Vig', 'http://kaloevig.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�Xq䝇��kamikaze.png�PNG


IHDR(-SBPLTE<Tl�
�
�
�
��
�����$�$�$�$�$�������!\a�tRNS@��ffIDATx�mO�@n��R��W�~u�"�U��1`
���5Ud���1�H8S|c�����_����V��R���/4؊�a�V|V-���jm+i>7�����V�Gh= ��ɁIEND�B`�PK�X�Ǣ�kamikaze.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
kamikazeonline.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Kamikaze(BasicNewsRecipe):
    title = u'Kamikaze'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'S\u0103pt\u0103m\u00e2nal sc\u0103pat de sub control'
    publisher = 'Kamikaze'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste'
    encoding = 'utf-8'
    cover_url = 'http://www.kamikazeonline.ro/wp-content/themes/kamikaze/images/kamikazeonline_header.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'content'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['connect_confirmation_cell connect_confirmation_cell_no_like']}), dict(name='h3', attrs={
            'id': ['comments']}), dict(name='ul', attrs={'class': ['addtoany_list']}), dict(name='p', attrs={'class': ['postmetadata']})
    ]

    remove_tags_after = [
        dict(name='p', attrs={'class': ['postmetadata']})
    ]

    feeds = [
        (u'Feeds', u'http://www.kamikazeonline.ro/feed/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X��7fMM
karlsruhe.png�PNG


IHDR�aIDATxڥ��_���Uq�*��2V��m��S�Am۶�3�z��Mw��I�<�̼7�%�T�L�����s5�
��U�����:@q,��H���Y�J0�|1&�)�����
���� W
C�e}���o 7�Hso�w]7�@UH��"�#����-�K���Z~uW�G��7�n��23�
]K&Q=�LI*��d����F�E�p�S��*�	�\]u54��)2���ҳb�H���ܦ
��[���S��[#ji������?��5	�y6�̿��>CeQ��-R<�:�B,0kP��4!��-x\�w��&�@���;%x7���	��5�z-W�g��%�x�1 >��@3	U1$���;�b��[0k�^|S�T�/��@T��@�b�a��4��#sv����q��sh���]���Sy��P�2�gdοFZ���9Q���?�{�|�%׫a�(��6��)�l��S���t�$
ְD���Յ��S�S���/�JzQ7���IEND�B`�PK�XyYq�=
=
karlsruhe.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class KANewsRecipe(BasicNewsRecipe):
    title = u'KA-News.de'
    description = u'Nachrichten aus Karlsruhe, Deutschland und der Welt.'
    __author__ = 'tfeld'
    lang = 'de'
    language = 'de'
    no_stylesheets = True

    oldest_article = 7
    max_articles_per_feed = 100

    feeds = [
        (u'News aus Karlsruhe', 'http://www.ka-news.de/storage/rss/rss/karlsruhe.xml'),
        (u'Kulturnachrichten aus Karlsruhe',
         'http://www.ka-news.de/storage/rss/rss/kultur.xml'),
        (u'Durlach: News aus Durlach',
         'http://www.ka-news.de/storage/rss/rss/durlach.xml'),
        (u'Stutensee: News aus Stutensee Blankenloch, Büchig, Friedrichstal, Staffort, Spöck',
         'http://www.ka-news.de/storage/rss/rss/stutensee.xml'),
        (u'Bruchsal: News aus Bruchsal',
         'http://www.ka-news.de/storage/rss/rss/bruchsal.xml'),
        (u'Wirtschaftsnews aus Karlsruhe',
         'http://www.ka-news.de/storage/rss/rss/wirtschaft.xml'),
        (u'ka-news.de - Sport', 'http://www.ka-news.de/storage/rss/rss/sport.xml'),
        (u'KSC-News - News rund um den KSC',
         'http://www.ka-news.de/storage/rss/rss/ksc.xml'),
        (u'ka-news.de - BG Karlsruhe',
         'http://www.ka-news.de/storage/rss/rss/basketball.xml')
    ]

    preprocess_regexps = [
        (re.compile(r'width:[0-9]*?px', re.DOTALL |
                    re.IGNORECASE), lambda match: ''),
    ]

    remove_tags_before = dict(id='artdetail_ueberschrift')
    remove_tags_after = dict(id='artdetail_unterzeile')
    remove_tags = [dict(name=['div'], attrs={'class': 'lbx_table'}),
                   dict(name=['div'], attrs={'class': 'lk_zumthema'}),
                   dict(name=['div'], attrs={'class': 'lk_thumb'}),
                   dict(name=['div'], attrs={'class': 'lk_trenner'}),
                   dict(name=['div'], attrs={'class': 'lupen_container'}),
                   dict(name=['script']),
                   dict(name=['span'], attrs={'style': 'display:none;'}),
                   dict(name=['span'], attrs={'class': 'comm_info'}),
                   dict(name=['h3'], attrs={'id': 'artdetail_unterzeile'})]

    # removing style attribute _after_ removing specific tags above
    remove_attributes = ['width', 'height', 'style']

    extra_css = '''
         h1{ font-size:large; font-weight:bold;  }
         h2{ font-size:medium; font-weight:bold; }
    '''

    def get_cover_url(self):
        return 'http://www.ka-news.de/storage/scl/techkanews/logos/434447_m1t1w250q75s1v29681_ka-news-Logo_mit_Schatten_transparent.png'
PK�X����karsi_gazete.png�PNG


IHDR  D���mPLTE�33����55�66�,,�((�%%����22�--��00�::햖�77�  �""�''����77����//�##�**�33�������BB�������LL�CC���������99�		�����쎎��������99싋��22����������������tt�쉉�pp�����삂�����������헗셅�MM���������UU�55�ff�cc�������[[������oo�쓓�썍�<<�\\눈�����쏏�kk�**�??�]]�������^^�XX����dd������{{����파뀀슊�55�QQ�00��������������^^�������퓓�XX��HH�xx�yy�FF�::��HH�������KK�>>�����쒒�����oo�����[[�������\\���������끁������33�//����KK����퍍��ee�����������AA�((�������ll�ZZ�������섄�NN�JJ�<<�rr�����``�66�2��2IDATxڍ��A@����Unm۶۳m۶m۶��t����&��…+��p5�������8�r�<!���i	r12f=�t^A��hy����R�����ƍY�Q�ޕ����R��1*6v䞽ӊf�_�-Z���r�_a�Z��B�7��7�ۼ�{����A��G)�8EX����O7q<q����'%EG��N/1�L߯�M�	C4C#%}���ɳ�������J��:s��9�,��[+�!F.]ֹb%���tV+Qa��
Ѷ��z�Y�Q��N�3C;�:,���EH�����m�e��zЋ�eg� �z�]��f��W|@ �.�y�C-�(9r�#Q�Q��~�D�)�N�9k�r=��x.����&q^�k0�o�|�3�r��J�5D{A�u�
`�U�	��[��ݭA��|�ʬ%n����Tm֓:�g���_�	����"���m�f]u�dı)�ݔ�>�����]���B��]9�y˗��񪊊�?��&��iO��Q����)R��_f�`K�-^��޶����ճ|V��IEND�B`�PK�X��ɲ�karsi_gazete.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1441607918(BasicNewsRecipe):
    title = 'Karsi Gazete'
    __author__ = 'Voltran'
    language = 'tr'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('G\xfcndem', 'http://www.karsigazete.com.tr/rss/post/1.xml'),
        ('Yazarlar', 'http://www.karsigazete.com.tr/rss/columnist'),
        ('Bilim & Teknoloji', 'http://www.karsigazete.com.tr/rss/post/4.xml'),
        ('Asayi\u015f', 'http://www.karsigazete.com.tr/rss/post/23.xml'),
        ('\xc7evre', 'http://www.karsigazete.com.tr/rss/post/17.xml'),
        ('D\xfcnya', 'http://www.karsigazete.com.tr/rss/post/2.xml'),
        ('E\u011fitim', 'http://www.karsigazete.com.tr/rss/post/10.xml'),
        ('Ekonomi', 'http://www.karsigazete.com.tr/rss/post/3.xml'),
        ('Genel', 'http://www.karsigazete.com.tr/rss/post/18.xml'),
        ('Kad\u0131n', 'http://www.karsigazete.com.tr/rss/post/12.xml'),
        ('K\xfclt\xfcr & Sanat', 'http://www.karsigazete.com.tr/rss/post/6.xml'),
        ('Magazin', 'http://www.karsigazete.com.tr/rss/post/20.xml'),
        ('Politika', 'http://www.karsigazete.com.tr/rss/post/22.xml'),
        ('R\xf6portaj', 'http://www.karsigazete.com.tr/rss/post/11.xml'),
        ('Sa\u011fl\u0131k', 'http://www.karsigazete.com.tr/rss/post/8.xml'),
        ('Spor', 'http://www.karsigazete.com.tr/rss/post/5.xml'),
        ('Televizyon', 'http://www.karsigazete.com.tr/rss/post/26.xml'),
        ('Ya\u015fam', 'http://www.karsigazete.com.tr/rss/post/7.xml'),
    ]
PK�X2�9h��kath_net.png�PNG


IHDR  ��tRNSn��	pHYsOOc���:IDATHǭVKLW}��FB����
E��ꢛH�4R�j�K��DT�OL��W
Qm�|��)I?B	i�c{[��	'����SpOl�a��Ϯ��fb]��3o��s��x����Cnt�2Y���k�+lF�j�q���p�E�:�B�W�M�;���"��cM�.���\�ِ1j�&�K'�pҟʗdUe� )�n' �:�D��⩷�P���xBU�}�� |�ލp5���f�"�;����'��Ud�)�p�L�kQUׅ-�I�K�.��4�Q�桍�b�8%�>x��h ��ҹ�:�����p��DX>��_�8˳�O���/o���0��t$�x��N�\	�s�@QV*�Z(�mX��]a��e��[\X/���8�y��!�� �n� 0��iji>S���)AT�(�v#�W�͋Z�wR���,�h5_���$E�68�DV��d�(¡�;�����.kږ��wQV����9�>��ޥ j��KwV7J��Q���W&�:h���Q�3M��M�J��&����6瑫�PY��APd��v�vѧn�@`��Kv팡�}����MQ�^ɿ]��	D�U]6/�X��ѡ0`0WAluF�{�i�g&��)����q_��F�g�w@�7�����o���7G~�D�Eb��k~��@��C���r�
_�*lɣ3kȀ�7���7����2���t��
��y���j���Zi�@N����ߏ^TTUgNr��J�^IB9x!aY\1��U
f�烊�����bF�,�]�W���zH]�
?z�����g�QS�@�>�T��/TU�Z)zze9_�Ot��fSi�v��h�O��F�jw.rũTw��3Z�W�g��6P���!A���'���2�{��V�^<��IO�ڝ�9��[l�@��~E=^�$��ӗs-<�v���)��uܬ�m�b,�m)/n���� �o�6�H�7]�Y6�慊�\a����Ca�E�mNЃ��d&�f����-���S����`[ef��C0�y3.]��h�7���F�iIEND�B`�PK�X�;;;kath_net.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1608358960(BasicNewsRecipe):
    title          = 'kath.net'
    __author__ = 'mseliger'
    description = u'Katholische Nachrichten'
    oldest_article = 7
    language = 'de'
    max_articles_per_feed = 25
    auto_cleanup   = True
    no_stylesheets = True
    encoding = 'utf-8'

    feeds          = [
        ('kath.net', 'https://www.kath.net/ticker/index.xml'),
    ]

    def print_version(self, url):
        return url.replace('https://www.kath.net/news/', 'https://www.kath.net/print/')

    def get_browser(self, *a, **kwargs):
        kwargs['verify_ssl_certificates'] = False
        return BasicNewsRecipe.get_browser(self, *a, **kwargs)

    extra_css = 'td.textb {font-size: medium;}'
PK�X��kathemerini.png�PNG


IHDR��7��IDAT(Sc`�hF9SIN0p�����Qdd��\f�*��*�,tA�B~�I��9��̵��c+p�x���ˊ���.�]r�T�~l?X�����c��
�A<+��]*9�&��qL`���:�x�>ԍ``��O��Q�o�wC!�]���9J��+�30x;[4����f����(,W�h�&v��f�s�Y�I��R�T�3QY��ڨ\v��9�&u�m�;�X�j!L���ݠ�o+�����Q�)�K��ϕ���Pw���1���D�[�Sn��a�����hlKG�Y��J�0O������S�W(\�;%�����*��``�W� �[�Yk��E��K�L��+*J�wM2(�'uTj���\�W�����Di��#�²��͹ãܢC�v�UZ*H�y�j�����������IU��|RS�7��;��;�<��Sj�a��4eQeGQ+`l�b~Ě�MAIEND�B`�PK�X?�U�kathemerini.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class Kathimerini(BasicNewsRecipe):
    title = 'Kathimerini'
    __author__ = 'jenniepet'
    description = 'News from Greece'
    max_articles_per_feed = 100
    oldest_article = 1
    publisher = 'Kathimerini'
    category = 'news, GR'
    language = 'el'
    encoding = 'utf-8'
    conversion_options = {'linearize_tables': True}
    no_stylesheets = True
    remove_tags_before = dict(id='site-body')
    remove_tags_after = [dict(id='social')]
    remove_tags = [
        dict(attrs={'class': ['post-tools', 'edition edition_PRINT']})]
# to remove images comment the line above and uncomment the line below
#    remove_tags            = [dict(attrs={'class':['post-tools', 'edition edition_PRINT', 'clearing-featured-img']})]

# Categories In order of Appearance: Politics-1-2-3, Greece-1-2, World-1-2, People-Specials
# Greek Economy-1-2, Business, International Economy, Real Estate
    feeds = [(
        u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03BA\u03AE', 'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=2&type=&edition=PRINT&author=0&fromDate=&toDate='),  # noqa
        (u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03BA\u03AE 2',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=2&type=&edition=PRINT&author=0&fromDate=&toDate=&page=1'),
        (u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03BA\u03AE 3',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=2&type=&edition=PRINT&author=0&fromDate=&toDate=&page=2'),
        (u'\u0395\u03BB\u03BB\u03AC\u03B4\u03B1',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=4&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'\u0395\u03BB\u03BB\u03AC\u03B4\u03B1 2',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=4&type=&edition=PRINT&author=0&fromDate=&toDate=&page=1'),
        (u'\u039A\u03CC\u03C3\u03BC\u03BF\u03C2',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=5&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'\u039A\u03CC\u03C3\u03BC\u03BF\u03C2 2',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=5&type=&edition=PRINT&author=0&fromDate=&toDate=&page=1'),
        (u'\u03A0\u03C1\u03CC\u03C3\u03C9\u03C0\u03B1',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=41&cat=42&cat=43&cat=24&cat=25&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AE \u039F\u03B9\u03BA\u03BF\u03BD\u03BF\u03BC\u03AF\u03B1',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=17&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AE \u039F\u03B9\u03BA\u03BF\u03BD\u03BF\u03BC\u03AF\u03B1 2',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=17&type=&edition=PRINT&author=0&fromDate=&toDate=&page=1'),
        (u'\u0395\u03C0\u03B9\u03C7\u03B5\u03B9\u03C1\u03AE\u03C3\u03B5\u03B9\u03C2',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=18&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'\u0394\u03B9\u03B5\u03B8\u03BD\u03AE\u03C2 \u039F\u03B9\u03BA\u03BF\u03BD\u03BF\u03BC\u03AF\u03B1',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=19&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'Real Estate', 'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=21&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'\u03A0\u03B5\u03C1\u03B9\u03B2\u03AC\u03BB\u03BB\u03BF\u03BD',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=6&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'\u0395\u03C0\u03B9\u03C3\u03C4\u03AE\u03BC\u03B7',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=7&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'\u03A4\u03B5\u03C7\u03BD\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=47&cat=48&cat=49&cat=50&cat=51&type=&edition=PRINT&author=0&fromDate=&toDate='),
        (u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=31&cat=32&cat=33&cat=34&cat=35&cat=36&cat=37&cat=38&cat=39&type=&edition=PRINT&author=0&fromDate=&toDate='),  # noqa
        (u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2 2',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=31&cat=32&cat=33&cat=34&cat=35&cat=36&cat=37&cat=38&cat=39&type=&edition=PRINT&author=0&fromDate=&toDate=&page=1'),  # noqa
        (u'\u03A4\u03B1\u03BE\u03AF\u03B4\u03B9\u03B1',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=11&cat=10&cat=12&cat=14&cat=15&cat=13&type=&edition=PRINT&author=0&fromDate=&toDate='),  # noqa
        (u'\u0391\u03B8\u03BB\u03B7\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2',
         'http://www.kathimerini.gr/rss?i=news.el.search&q=&t=0&w=&c=&s=p&cat=3&type=&edition=PRINT&author=0&fromDate=&toDate=')
    ]

    def get_cover_url(self):
        import time
        return 'http://s.kathimerini.gr/resources/issue-cover/%s.jpg' % time.strftime('%d-%m-%Y')
PK�X�g�6��kellog_insight.png�PNG


IHDR  D���nPLTEO!p������nH����P"q���T'tS&s������rM�sN�uQ��r�������R%s�����µ��ʼ�����Q#r���U)u���������oJ����W+wQ$rS't���rN�O"ptO�tP�T(tvR�yV�zW��_��`��a��c��g��h��j��l�U(t�t��v��}����R$r���V)uW+vR%rZ.y������������������������Z/y[0y��ź�Ƽ�ȼ�ɽ�ɾ�ʾ�ʾ�ʿ����ó�ô�Ʒ�\1zͿ������������������������������������a8������������b9�������f>����f>����g?�h@�iB�kE�P#qoI�P"p���pK�>0f�IDATx^��C�Q��ۺ�m۶m��ߓNn�3��yW���T�J���_Q�N��/���>!q�`���`[8z��ʚ��>��Q�a���.2�#4C�y�T�\��)NEI�@&U�-�|��SO��@]1:e�uAٓ�j72H��O8"�o\��:]�x 㦎@��9�0Zl�'��
��ر���	�x����w��qĚ
A�)�򨹻S�M��w�Jnw�2��x���Y��y<��Ybm�t}��J�?�"u�&�IEND�B`�PK�X��j���kellog_insight.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement

__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'


from calibre.web.feeds.news import BasicNewsRecipe


class KellogInsight(BasicNewsRecipe):

    title = 'Kellog Insight'
    __author__ = 'Kovid Goyal and Sujata Raman'
    description = 'Articles from the Kellog School of Management'
    no_stylesheets = True
    encoding = 'utf-8'
    language = 'en'
    auto_cleanup = True
    use_embedded_content = False

    oldest_article = 60

    extra_css = '''
                h1{font-family:arial; font-size:medium; color:#333333;}
                .col-one{font-family:arial; font-size:xx-small;}
                .col-two{font-family:arial; font-size:x-small; }
                h2{font-family:arial; font-size:small; color:#666666;}
                h3{font-family:arial; font-size:small; color:#333333;text-transform: uppercase; font-weight:normal;}
                h4{color:#660000;font-family:arial; font-size:x-small;}
                .col-two-text{font-family:arial; font-size:x-small; color:#333333;}
                '''

    feeds = [
        ('Articles', 'http://insight.kellogg.northwestern.edu/index.php/Kellogg/RSS')]

    def get_article_url(self, article):
        # Get only article not blog links
        link = BasicNewsRecipe.get_article_url(self, article)
        if link and '/article/' in link:
            return link
        self.log('Skipping non-article', link)
        return None

    def preprocess_html(self, soup):

        for tag in soup.findAll(name=['span']):
            tag.nextSibling.name = 'h4'

        return soup
PK�X�V���kerrang.png�PNG


IHDR  ���IDATx���e��;���ض���n۶m�ݯ��j���7����4S����~X��ƫ��PԖ�T����k+뺚ZU�>5�
~�|AQi�~�Hj;I����L���i췮uceܤ���S������K@����6���O���UI�gWҲ���b���#�̶��*�R����G�V6V�4�@���4�4��.���pl���V�XCo���}CXК�bqU)�q���ˣ���y�7��F���O�������f0@@'�؃M�-��W�l�b�Z��Q��D�h���I�#uuѼ觖�����}��)������ګ[�>61�U�{T`RV].�T�֙g}ߏ�,� �a��s�KQ��$���GҘ�#c%�P���99)
h�����hQ�BZ�����d�[j�3��s�t�I��8'����1�C5 S\^2tk�ִՓR��&`Hdغw&*��ħe��c�QW��=C�*m	ӎ��#E%Ek�w��O��:�0����*t��V��5��@VB3��g\�{��\ܪZj�Gxi[Y�X��a[y]%e�=@T��LdA;Mx"�
�x�5vv\��)\<�5�L��e�gea}����@���:H�<�R#,մ�'.��I����8�%YX'�D����"�i�ۮ��c�,��=i����?��dmGc���#}}�4�3�$���Y^�t�Nŗ��"�D	h����ϩ@���qē�R.1͵�!������|��Ȅ��<5p��G�!����`��;`UӪ:K��Ā�d��d�G	Jb ���4=,~aE@:�&�v,���;�˭������#�I�>>ԑ����xC������S�K�U�[�x��3o�#$�}�ٶ��Y$c�AC��@�V���|�J%�h	s,]2h��?}17r�o�^���{�<2�c�L�c㌦ܚ"''l��-�N�::Ɣ���q.�f2G�x� Ҫ���f�$h���R0+AyX?�b�܇���s����R�=q������^��o�qs^(�~�o�0S�A<zj�px��I�l�??g�ql���?0�o疨�&��fy�gW"~aN������(��G�����b�f�;��0�-�������4�"�07!����jE����?�m�nӼ7}s>����-�?7\���v�92��2�*o�M��m��ON�'\��d��(���߫��RY�ͲUm����s�kz�Җ5�q󄎎c&J��!3tcٵ}�9�r&�o���"�{��2���Ħ�6
/�+X'��͉#�_�Mk�>��[M����#����7�z9��B$�N�_
��B�ƁV���f��7,h@�~�����+��?�;�K1���A�IEND�B`�PK�X�6�bbkerrang.recipe#!/usr/bin/env python

__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe


class kerrang(BasicNewsRecipe):
    title = u'Kerrang!'
    __author__ = 'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'en_GB'
    description = u'UK-based magazine devoted to rock music published by Bauer Media Group'
    oldest_article = 7
    masthead_url = 'http://images.kerrang.com/design/kerrang/kerrangsite/logo.gif'
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    recursions = 0

    keep_only_tags = []
    keep_only_tags.append(dict(attrs={'class': ['headz', 'blktxt']}))

    extra_css = '''       img { display: block; margin-right: auto;}
                        h1 {text-align: left; font-size: 22px;}'''

    feeds = [(u'News', u'http://www.kerrang.com/blog/rss.xml')]

    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
PK�X&�C�kgsenghavebladet_dk.png�PNG


IHDR  D���3PLTEMv���P��@z������ß�̯��������X�����p��0n�`�� c�����IDATx���E1D���?m]ï��]��~h�-@�:H�cՁ�'�lg�46f	��>�E���X�����:�e`Q�z��rˠ�ܾ�p�H�3�^n� k~�_A+ށ@K��y��ʙWu�$�؞y0P�9����IEND�B`�PK�X.|��,,kgsenghavebladet_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Kgs. Enghave Bladet
'''


class KgsEnghaveBladet_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Kgs. Enghave Bladet'
    description = 'lokalavisen med alle dine lokale nyheder'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Kgs. Enghave Bladet', 'http://minby.dk/kgs-enghave-bladet/feed/'),
        ('Kommentarer til Kgs. Enghave Bladet', 'http://minby.dk/kgs-enghave-bladet/comments/feed/'),

    ]

PK�X�:Dɑ � 
kholod.png�PNG


IHDR����i XIDATx��o�����C�`��/	`��R�D��P����T�*9)?���)�H��� ?��R"*���+�!���Jc��N%ޏ�m�ޝ��ٙ���ޙ�̽w�T�,���3���wΜC ����s�B��ܯ��ی+�@,�B4���2�y"Y�&R$��ȸ2��7�6�ܠ��ieHv�����L���P��<{=�f$�@������LۑL��oA+r?ΰ���M��
�o�4�?��,AX���dۈd�p# �9�)!�)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r �)"�r \e[�e����s,ϓ���L|�'�SSǗ	�Ŕ&c�,@Jp竳#�.�?gئ �m�;���ٯnK�CH &<}���.��"�p�Cw<𶿌�����!)jZ�hZ�<%�@Jp���i)h����J�DH
 %x����vM=:o :�R�v+u:yOC�Ă��j�^�0�1�E��X%/�I�.KĆ��:�Sg�'�Ψl�T��N��R}^���~J����L�6yS<�K2��/KeG%3�9\�׀9	/ �$Z!��a#�뒖�-���2g�׎�`�b��`�@3�g������/�m��������O>�Jd	K!�ǡ�H�w��Úe2��v�/m��	b֏ܤ�k�p
7��j�?�׃�Pf����|Ui�������=n[
+{CI(˜XO�<i�kL�S�Ө��@�����~����)�A,[ Ʒ�6�a�F�$#;�~
{�l��nxÝ�Ƈ
�!ꂷ7���8 �6ɍ�?:+�����8
%�@Jp�C��a��%g|LJX�s(b�Hge��t�3���	�WQ���ųa2}7L��m�Q��yX���2"�#��j""������~Z<&+ &�(R�}6���34�5���a}=|��*�G���~����1(�R�c3(<��)��;����#R�2�2o$�e�,�N����@��2�i��Wx�e��<&�G�����{���9ɼ_�V����x��8��o��'�r,źI�b?�z�$Ȇ�ao��ZW��<O4ڬ�yw���h����K��;)���s��!a"o���(���Z��'��
n~rz�:_��O�`�e��
w�G`�b[�")4>���ƈ�t9u�h�~	�]�	m|,j��ݠ/.��!�ux����L2�q�ǫ�v���&��*�ڏՏ�}':�hb��ĂO��ۑ��vd�3F�WQ�į����ö7��W�#j�rz��v"��;����h)�-V�~い�w�tw�#�L�^R�]��֏ ��x׻*�T�'���Vн��=�x ��#��c`��w�	�ײ�λ��P�,J:kݍ���ÝNnrlZ�|u�f�D����%p���K]t"�J��[I��ŋ��R�(��j���o�:�0�ޠr.�k���WB��2��"�����Q�Dz')��	��N�с�$����y�ɠ�ZB;�dU��G��	��h�xՓ��]*
y�m�@�aG�$�#�c��x M���S���Қ����a@N�
̠{��=Ѭ��4��������s�t�nu���V�e���PW��{#٬e��U17������N�o����~v�� �oп�.L:k�_S��htq@�x8ک���j��I*��nI��Υ/A-������m15�.HG��V�M���n���e���q���;7��k}�y���H ^<\����������[�v��:5$��hV�!FD�E��������:"�ݒ�b ��vd��{����w��t��h�U\�n����;s�I����ࡳ�AgӀ�n<}}�!X���꾟������sj�_6t�=ڇm�GЕi@��x8�a�(����~�R����sEЙ�H����F@���"�>�i<#�-#�̫v�:�#kHՎ�ˍ�\�#4��;[���m<\u�{X<�
�rp��2��3������u^��?��2��U4��b�\53 8�{*DFЙ0N�~���C��;��;��`ٝ�~��x�#f�+`2�~��9׋��\�]�@���gӉ,��:�5��G<\�(���Uf�@�w6m�*����#��G<�W��ww��S x
�V�,�����%Ά�MD���e&�s ��OT
��N�0���G<�Ӱ�4Kc����m�ꭢ���uϛq]�x��9����?�����EЅ;�w�3���,.�p�oI��A@���0� �#�j�%�����L�<8�"���#�b�#.!,��D�FЅ�c| �#�|��(,���"�yY�t����Ռ��pb�xtl��tT��� *�x8�@��z���cG��#���+i������SKM���8��K<ܤ��ߐ"O�3/�N�.�ə�3=��G<\�9�^s1(l�
�E�"�?xҟ?-��G<\�Їq�Ŧ(n�������չ��v�=8�:�9��f|��.=��3F�����r��Sr��m޼��/�6��CF�7Ei�(��ʻ�t���l��n�+?.�g �c���X����]iw`>g�Y�Ӧ���#���7<m�"v�����b���s�І�ҙ
�� -�)[@Z�=D�2����E)K@Z��%L�ګ�x���Sv�Df(�_>�D+3@�sn(��)|2h�VV��f��cF�2$>o�,LB�
 �͸�)�L���7��HeH|vL޹.*@���
�+L��ϰ,"_�0I$>����$;��,��r�@�)�:�|��"����B��nh:ϩ�Wz	�m��z���ehS�^�+�2z"���a�����c�29Ĥ������g9��������Z��:1)���uQgӄ}o�տ��C�ڭb����n�����@g���l@:u��
�����t+�W�LK<��z�WɁk����|Y�m��ˢ��k����k��0-�@�ҫjA�:<KX�2h:�]3�5�XRu�쌭�`R_z�ǥΦ6����s�����}򍢧,��Wf%�׬��k�F�C�J��-pϴ�j����⛷7�*aA�/^C(��Wd����֓{���]�t�@X�^�r�q�^s��y�G���0�a]zu���Ľ:B0���4�v���UY(ƥW�V?$V�����bJ�����.�:�
;�Qa��}�Mj�¡��jP�KD
*���nZ*��Z�C��櫴�KH�6L��K4��['���Rz��:��Q��K��#|���%�ҫ���5'�>���)�n��"�ҫM��5)��pM�C�"���/.�/����]�բq�ZDo���`�!�K�6/������q�q�����!U�ڲedc�/N
N.>�{I��^r�%�4Гi�ɵn�=�KJ{)%B����s�C�c�eˉ��E+#�
�ο_߬�^ɻo�۝��[x_0�I���7�����3�c?�5�W{�^��p�A	���]���9k���֫��>(A���z�6�� ɭW��񚥜�\ԏ��-$�����5�CNХ�uZ?��筹,��WMN�22�.�{5���j.����z���d��t�|�B��&��RR��W���U9A��Y�O8�u��ڸ��[��<\�Ϝ��S�ݓ�c��m���y![��<�.(AW]����B�Xl���pҫ(�ٯv}��_/�~�b��*��M
J�UN��k���B,�^Ey��]���������b��*��=���<�~.x��ԹU���WQ�hP���p��;uS�Jb��*��J�UNt��e��B,�^Ey�QP�n0��_iؐ:_�b�z5Cy8���A7��4Mf�+_�i��o8Ey���]�����-��p!��W���᪠��é$�R�]D!��W����Q���éC]^���2�zU+�P%��<�Z�?���^�
:����z�(v���j�� �
������D�w��pft0'>��7<x}]�AЭl~w�����6W@�e!A�|6JPNV�%��e��sZH����(�y8YA�DQ�pn�tQ��p��.�P�q!����d�ù.�FС=���Cy8�h���
:��s_�Fй�p����Z(d��s��d�õQ�A����
:��3R�����F�X/1���W��~!��h!y*��A˼qr$n\z8YA7LD'7�v�f���}��ݵ�w�s����B�z8YA�����[��imWu�?,$�>��>u���<���æC���+N����+G1(t�NV�=IJ�+��2�Ȫ�z�|?�NV�a3h�*g��z��׀�p����9�����M�R;�c�;a��R#��7�ߩG�ą��t��T����x8YAO|�ڊ+'+����9r��ft�/-%�/|�j�ޙ�
��;NY^�um´׷io��г_�҉gK'aqѳ�Ű����{�@���p	׷K�9x��(���$PR�lo��~nG�pÎ_��[�*$���W!�h�
	��h
�
	���x&�
	0��?�
	�d�
	��m�Bƒ��G���q��/�B�v"+$l�"�B–G,�B¦`Rg-�B¶y~m�6��kcɰ���گ@!asbIA׼��}���k\H��^V�Q���͚�cel�Ќ#/S/��<\�^?4��
u��N��pj�dl�����q-��<�?v
����*
N��<\�����<V�_����pj���s�����(�	:By���i�W��/R�i=�~��?k��%���:��>�g��헨�tu�K/ms1�ya}�: AG(�����g����tu�Cv5�]��w	%����L=��s	%��=ܥΧ�˜	���M.��'����M��e&A��.��;7C� Ag�p3�V���å�B�8a�pS%�,<��t'
�ߐ�?����M����p3�^�Q�)NI�
%un�����!A��N]R�*�fg����p3G/�bz���a!}��zfg����p
�t=���N���z7uP����5�^�u�CDž�o���5�" '���k���!)��=\�U@9Ag�p��	:u���S��pʯS2��	DFЙ<\��V�%��Yg�%c+b�I:'�I�.��8sZHɛ�GcN�	Ag�pr�u\�E�or����y��ɜ�d����}v���#�_u��[��7(�qu}Pb<�t�|W��5�x8�w��-,.�{j\O�U:���	:���?]C��j�[%V#�^�zqq��ƏN�����s��h�����K�|yq0�X:��"+���TJu\����;�}]�yŸ9;A��p�|<s������g��(۸�[52\@+J̳S����fHY�.�v�C�|��"8�j.�d<�,I�*�y�P��Cy���y!���Z��X:��k'�b!�P���_���Cy�62�X:��k!�P���Cy8���B,��9�|b!�P�u����y8Ǚ�B�.������fn
�t���pN3?��
�H��\f�
�t*H�0�TH���z8w��Bj��9�|�tx�*sVȁ���*���s�y+�s~x�"�>.<����<�}^�Y�G�2O�q��+$|C�JC�J�e���{�_	������%�����}�ګ���^��i��2=x텀�^�=�H����o�pRH���o������3f��a�W�����x���>�k�,$��)Q��O���s�5�Q���S��'��u�o�b���~JI<������ �I����x^�&����B����,�T%9�9��������~.:�=hxAɻ�hVH�C�:��F���%@.>�\,y��;Z��ˌLn
ɫ�Gtda)y����^5�]�1�����`
)���gO1��i�>)���_hal���B��jaL|^�\����A���'����+������B4�~��wPM�C�wP��E�x^tTH��u�'�!���=��o�|~�(�8�z�gf1�D��E7�͐5AB$�$&D�_����41���F<�M��cY��~��Y*D�鮮��������~�SC��$;�M�~�꽩��{��z���ag ��&�8�H��:�?>D���3t��6tb�a���B.{������̐�{���,�ަ�)�����Mr:Ϻ�۬�/;�G�s�]��C�Y�aӝ�Lc����j��q��
��g�'Ϝe��:��N@�BK���U�p�^dR�wU����V��J' WP��{R1e���ď�*�)�g��%U@$�,�_��+8�0�]j"Eģ��9����С
H������+TD���;;'�x�*Rg
��䭹����b����8�e"����w#�"�\�T
DKUR�0J�r�`�O��$�1*:�O�8����5��h��b^}(S���SI6 R��F*�Ȫ��kT�N��������6�q�Z\@�%�����ר��DS�w!o��G��c�	HG��H{"<~�Fw� ��#�{1a�Zs+{�F��UƏ}���W�wS�h��Z��S�Z73� Q>e�� `��5:���a'���S���� �?��|�\�wy�p�T�@4�����<u�{G��[t��PJ�w��kviK��K[d��R��e��@�5k�.����0��>�Q٘Gf �	$�/)%�T%���� z;}
�WR���D��T�G��#<~�F%��h�+po�z%v��[t��M.텔<~�F��%�ݢfZW->q���W{�`�õ�SO���:fOfFA�`=����5�%�
Dc��h;am�qt��{�L��%����x�@�� pg�1�9t���H���]�\�_�fR���|�)�����es�ˮ����B�[k�q$r��;C���qTdO�q/��m�$���]�޳_�b�ׂ�#������M��w���وHZ/��%đ9���� ��M��|�7�=O���_<@����+��,g����g�@�$�;T��/A��ϐ���Hb?����%ص�2�-�Q�y�\e�[���~�?�� �A�ҥށ H8C,�$œ���w+�p���K8�$����@}���ż�����Q�WA���p��H��nX,�
����O���{,������A��J�ԖL��w�QN1�$��.�B���vЭX���AW��2' !~�
J?ÒU���Rw�q-Yj�GSy-Y���?\��8M��~8=@:;�
t����8�<:�#�(���S��M?�. uGڛ�sh��܀|��뾊�6r;��t�~]�����AW����C��TN��u��_�R�N'�vݲ���t�h��P�6�E^A=r�،c|7m�������pz�<vЕ
�`F�a�k�:C��C�7#�ӛ�9Eϋ�0��Y�?�B�������
�栣��ɍp0��7v�ģ 'Ŗ� r�~��o,�o|�/d���?�7���	�&7��7��d����arj����y�"��'��O�83��
A�g���U�uj2�P�B�SVӱ�g�2 ��`���o�7~�_�{b+ 
 �>��[���^*�D���f?vH�]'@	23�H2��N���6p
��?��(�g11O�a�@�b�,�d�&�0Y ��1L�a�@�b�,�d�&�0Y ��1L�a�@�b�,�d�&�0Y ��1L�a�@�b�,�d�&�0Y ��1L�a�@�b�,�4�@�ur���1Lb7y�"�v��E2��A��H-*ҩ���@	p�JԢ�C��i��DAd�
�dt�C�`AZzfD�`���?
6+G����@k���v*5���O�v��Hyw<��A���ȡ�g�����	�����IEND�B`�PK�X9N�[[
kholod.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Kholod(BasicNewsRecipe):
    title = u'\u0425\u043E\u043B\u043E\u0434'
    description = u'\u0418\u0441\u0442\u043E\u0440\u0438\u0438 \u043E \u0420\u043E\u0441\u0441\u0438\u0438: \u043C\u044B \u0438\u0449\u0435\u043C \u0437\u0430\u0445\u0432\u0430\u0442\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u043F\u043E \u0432\u0441\u0435\u0439 \u0420\u043E\u0441\u0441\u0438\u0438, \u0430 \u043F\u043E\u0442\u043E\u043C \u0440\u0430\u0441\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C \u0432\u0430\u043C.'  # noqa
    __author__ = 'bugmen00t'
    publisher = '\u0422\u0430\u0438\u0441\u0438\u044F \u0411\u0435\u043A\u0431\u0443\u043B\u0430\u0442\u043E\u0432\u0430'
    publication_type = 'blog'
    oldest_article = 14
    max_articles_per_feed = 200
    language = 'ru'
    cover_url = 'https://image.simplecastcdn.com/images/93a97011-6988-4787-8242-e202b2840fde/08e85f64-9901-44e1-b20c-7da01c5ce0c0/holodpodcastlogo.jpg'
    auto_cleanup = False
    no_stylesheets = False

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(
        name='div', attrs={'class': 'article__content the-content text-column'}
    )

    remove_tags = [dict(name='div', attrs={'class': 'inlinemore'})]

    feeds = [(
        u'\u0410\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u043E',
        'https://holod.media/sections/daily/feed/'
    ),
             (
                 u'\u0418\u0441\u0442\u043E\u0440\u0438\u0438',
                 'https://holod.media/sections/stories/feed/'
             ),
             (
                 u'\u041C\u043D\u0435\u043D\u0438\u044F',
                 'https://holod.media/sections/opinions/feed/'
             ),
             (
                 u'\u0418\u043D\u0442\u0435\u0440\u0432\u044C\u044E',
                 'https://holod.media/sections/interviews/feed/'
             ),
             (
                 u'\u041E\u0431\u044A\u044F\u0441\u043D\u044F\u0435\u043C',
                 'https://holod.media/sections/explainers/feed/'
             )]
PK�XAN
���
kholod_en.png�PNG


IHDR  V%(	pHYs��~�uIDAT8˝��OA��bn{�&$&�[C6%��qD�lL�E��-�����
M����z��E��.ŏZX0�׾���T��^&3�e��y^��%�w��>xhF%)m>hn`5�x�Ԓf�Bm3��X.dS���?�R�][�
T��J2Y,���U��*�RXw*��
���AT����Su���S走�r�c�ǁ)���K2_����z �F��Mao�:Y
�V�D�I���'�?�;�&�`��	�w5�%j;n ���}�]<U����Y}B"^k�$�Hh�xu�����>�\]�d�Ħ��3C�0��]�/Rp�[v��v��a���%F`(Q��T���E.
|a����9pg@�_ ck]�-P�O,j�ͻ lgo�0]���&W��&��ap���7�M�o�b�o��Y�un�m��I�m%~J0�v4۵P�L�x�	��v.5��=�$��Ԏ���Iܬ_�nֆ���:D��f�2k���s��ye7���~`��4�Lg�)��6*cz�����;��7�V�E�r'�kYJ_�����ta��ا_n�S�d��<08
������si)���o�������FUIEND�B`�PK�Xb�T��kholod_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Kholod(BasicNewsRecipe):
    title = u'Holod Media'
    description = u'Internet media whose authors search for exciting stories all over Russia and then tell them to readers.'
    __author__ = 'bugmen00t'
    publisher = 'Taisiya Bekbulatova'
    publication_type = 'blog'
    oldest_article = 60
    max_articles_per_feed = 100
    language = 'en_RU'
    cover_url = 'https://image.simplecastcdn.com/images/93a97011-6988-4787-8242-e202b2840fde/08e85f64-9901-44e1-b20c-7da01c5ce0c0/holodpodcastlogo.jpg'
    auto_cleanup = False
    no_stylesheets = False

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(
        name='div', attrs={'class': 'article__content the-content text-column'}
    )

    remove_tags = [dict(name='div', attrs={'class': 'inlinemore'})]

    feeds = [(u'Holod Media', 'https://holod.media/en/feed/'),
             (u'Opinion', 'https://holod.media/en/sections/opinion/feed/'),
             (u'Q&A', 'https://holod.media/en/sections/qa/feed/'),
             (u'Magazine', 'https://holod.media/en/sections/magazine/feed/')]
PK�X���\\
kidney.png�PNG


IHDR  D����PLTE������,/�26�DG�HK�RU�SV�TW�XZ�`c�ad�cf�dg�ik�km�y{�~�υ�Ј�ы�ь�Ӑ�ӑ�Ԕ�Օ�Ֆ�֗�֘�֙�כ�؜�؝�ٟ�٠�ۤ�ۥ�ܧ�ޫ�ޭ�߮����������0.U�tRNS@��f}IDAT�
�P��)fDk��1

�������ݥ%�_�x+�M=�*���Lc�$��E�R��V&1q� �}trQm�즶rE�#R�
#C���\�pV9
zDrK���T%(=]�Z ��/I(Ip�IEND�B`�PK�XW6ȋ
kidney.recipe# -*- coding: utf-8 -*-

import time

from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class JASN(BasicNewsRecipe):
    title = u'Journal of the American Society of Nephrology'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 31  # days
    max_articles_per_feed = 25
    delay = 5
    needs_subscription = True

    INDEX = 'http://jasn.asnjournals.org/current.shtml'
    no_stylesheets = True
    remove_tags_before = dict(name='h2')
    remove_tags = [
        dict(name='iframe'),
        dict(name='td', attrs={'id': ['jasnFooter']}),
        dict(name='table', attrs={'id': "jasnNavBar"}),
        dict(name='table', attrs={'class': 'content_box_outer_table'}),
        dict(name='th', attrs={'align': 'left'})
    ]

    # TO LOGIN
    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        self.kidney_toc_soup = BeautifulSoup(br.open(self.INDEX).read())
        toc = self.kidney_toc_soup.find(id='tocTable')
        t = toc.find(text=lambda x: x and '[Full&nbsp;Text]' in x)
        a = t.findParent('a', href=True)
        url = a.get('href')
        if url.startswith('/'):
            url = 'http://jasn.asnjournals.org' + url
        br.open(url)
        br.select_form(name='UserSignIn')
        br['username'] = self.username
        br['code'] = self.password
        response = br.submit()
        raw = response.read()
        if b'Sign Out' not in raw:
            raise ValueError('Failed to log in, is your account expired?')
        return br

    # TO GET ARTICLE TOC
    def jasn_get_index(self):
        return self.index_to_soup('http://jasn.asnjournals.org/current.shtml')

    # To parse article toc
    def parse_index(self):
        parse_soup = self.jasn_get_index()

        div = parse_soup.find(id='tocBody')

        current_section = None
        current_articles = []
        feeds = []
        for x in div.findAll(True):
            if x.name == 'h2':
                # Section heading found
                if current_articles and current_section:
                    feeds.append((current_section, current_articles))
                current_section = self.tag_to_string(x)
                current_articles = []
                self.log('\tFound section:', current_section)
            if current_section is not None and x.name == 'strong':
                title = self.tag_to_string(x)
                a = x.parent.parent.find(
                    'a', href=lambda x: x and '/full/' in x)
                if a is None:
                    continue
                url = a.get('href', False)
                if not url or not title:
                    continue
                if url.startswith('/'):
                    url = 'http://jasn.asnjournals.org' + url
                self.log('\t\tFound article:', title)
                self.log('\t\t\t', url)
                current_articles.append({'title': title, 'url': url,
                                         'description': '', 'date': ''})

        if current_articles and current_section:
            feeds.append((current_section, current_articles))

        return feeds

    def preprocess_html(self, soup):
        for a in soup.findAll(text=lambda x: x and '[in this window]' in x):
            a = a.findParent('a')
            url = a.get('href', None)
            if not url:
                continue
            if url.startswith('/'):
                url = 'http://jasn.asnjournals.org' + url
                img = isoup = None
                try:
                    isoup = self.index_to_soup(url)
                except:
                    time.sleep(5)
                    try:
                        isoup = self.index_to_soup(url)
                    except:
                        continue
                img = isoup.find(
                    'img', src=lambda x: x and x.startswith('/content/'))

            if img is not None:
                img.extract()
                table = a.findParent('table')
                table.replaceWith(img)
        return soup
PK�X0��\��kirkusreviews.png�PNG


IHDR  D���gAMA���asRGB��� cHRMz&�����u0�`:�p��Q<�PLTEi�j�h�i�i�h�j�j�l�~�ȯ�ݧ�ڟ�֝�֞�֤�ح�ܙ��)w�9����ڢ��R��g�G��q�������������w��V��o�h�"r�^�����������h��0{�f�l�������(v�e�b��������<��g�f����Z�������'v���ϝ�ՠ��"s�[������q�`������o�b������n����m����c������k��������������#s�p������m�������������Ք����p�g���С�ד�Ѽ�����;��1|����7��l���������!r������k�}��x��s��r��|��'v�u��{��u��r��v��|�Ǫ���ց�bKGD�����	pHYs.#.#x�?vuIDAT8�͑�;BQ�Os�,�P\���=J(%k����[�,�B�/W�iyJ�G��rf��w�g��"�LP���*����E���N"����
�M4(�J�Lڬla
��U%iCT�k:�����ƞ޾~�؂�"���%v�4<2j��%.�1�f�O�V۸�)��L N�|f�MM�Ȳ33�p���ܞ�
z���Eo%=���[�����K�5�:�A���P-���mTu�&ag��=�S���w���/���BD~����#�c��˂�#��G[>��	�)
�~5r1m���g��q`(B�/܈��1���D������a;���1�;yr=�$�Ʉ�U����G"�L����%Q���|aX���7ҷE��xy�%tEXtdate:create2019-12-21T11:03:45+00:00�I�C%tEXtdate:modify2019-12-21T11:03:45+00:00�;�FtEXtsoftwareImageMagick 6.7.8-9 2014-05-12 Q16 http://www.imagemagick.org܆�tEXtThumb::Document::Pages1���/tEXtThumb::Image::height192r�tEXtThumb::Image::Width192Ӭ!tEXtThumb::Mimetypeimage/png?�VNtEXtThumb::MTime1576926225k�`�tEXtThumb::Size0BB��>�VtEXtThumb::URIfile:///mntlog/favicons/2019-12-21/f92b798e1353cedfa012c37aed46affa.ico.png�Tu�IEND�B`�PK�X�ıkirkusreviews.recipefrom urllib.parse import urljoin

from calibre.web.feeds.news import BasicNewsRecipe


class KirkusReviews(BasicNewsRecipe):
    title = "Kirkus Reviews"
    description = ("Kirkus Reviews is an American book review magazine founded in 1933 by Virginia Kirkus."
                   " The magazine is headquartered in New York City. Released twice monthly on the 1st/15th.")
    language = "en"
    __author__ = "ping"
    publication_type = "magazine"
    masthead_url = (
        "https://d1fd687oe6a92y.cloudfront.net/img/kir_images/logo/kirkus-nav-logo.svg"
    )
    encoding = "utf-8"
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = False
    ignore_duplicate_articles = {"url"}
    compress_news_images = True
    compress_news_images_auto_size = 6
    max_articles_per_feed = 99

    keep_only_tags = [
        dict(
            class_=[
                "article-author",
                "article-author-img-start",
                "article-author-description-start",
                "single-review",
            ]
        )
    ]
    remove_tags = [
        dict(
            class_=[
                "sidebar-content",
                "article-social-share-desktop-first",
                "article-social-share-desktop-pagination",
                "article-social-share-mobile",
                "share-review-text",
                "like-dislike-article",
                "rate-this-book-text",
                "input-group",
                "user-comments",
                "show-all-response-text",
                "button-row",
                "hide-on-mobile",
                "related-article",
                "breadcrumb-row",
                "shop-now-dropdown",
            ]
        )
    ]
    remove_tags_after = [dict(class_="single-review")]

    extra_css = """
    .image-container img { max-width: 100%; height: auto; margin-bottom: 0.2rem; }
    .photo-caption { font-size: 0.8rem; margin-bottom: 0.5rem; display: block; }
    .book-review-img .image-container { text-align: center; }
    .book-rating-module .description-title { font-size: 1.25rem; margin-left: 0; text-align: center; }
    """

    def preprocess_html(self, soup):
        h1 = soup.find(class_="article-title")
        book_cover = soup.find("ul", class_="book-review-img")
        if book_cover:
            for li in book_cover.find_all("li"):
                li.name = "div"
            book_cover.name = "div"
            if h1:
                book_cover.insert_before(h1.extract())
        return soup

    def parse_index(self):
        issue_url = "https://www.kirkusreviews.com/magazine/current/"
        soup = self.index_to_soup(issue_url)
        issue = soup.find(name="article", class_="issue-container")
        cover_img = issue.select(".issue-header .cover-image img")
        if cover_img:
            self.cover_url = cover_img[0]["src"]

        h1 = issue.find("h1")
        if h1:
            self.timefmt = f" [{self.tag_to_string(h1)}]"  # edition

        articles = {}
        for book_ele in soup.find_all(name="div", class_="issue-featured-book"):
            link = book_ele.find("a")
            if not link:
                continue
            section = self.tag_to_string(book_ele.find("h3")).upper()
            articles.setdefault(section, []).append(
                {"url": urljoin(issue_url, link["href"]), "title": link["title"]}
            )
        for post_ele in issue.select("div.issue-more-posts ul li div.lead-text"):
            link = post_ele.find("a")
            if not link:
                continue
            section = self.tag_to_string(post_ele.find(class_="lead-text-type")).upper()
            articles.setdefault(section, []).append(
                {
                    "url": urljoin(issue_url, link["href"]),
                    "title": self.tag_to_string(link),
                }
            )
        for section_ele in issue.select("section.reviews-section"):
            section_articles = []
            for review in section_ele.select("ul li.starred"):
                link = review.select("h4 a")
                if not link:
                    continue
                description = review.find("p")
                section_articles.append(
                    {
                        "url": urljoin(issue_url, link[0]["href"]),
                        "title": self.tag_to_string(link[0]),
                        "description": ""
                        if not description
                        else self.tag_to_string(description),
                    }
                )
            if not section_articles:
                continue
            section = self.tag_to_string(section_ele.find("h3")).upper()
            if section not in articles:
                articles[section] = []
            articles.setdefault(section, []).extend(section_articles)

        return articles.items()
PK�X��v�GG
kitekinto.png�PNG


IHDRVu\�IDATx�c��L�~$�IEND�B`�PK�X4T0u��kitekinto.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1498286429(AutomaticNewsRecipe):
    title = 'Kitekint\u0151'
    language = 'hu'
    __author__ = 'pofa'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('Gazdas\xe1gpolitika', 'http://kitekinto.hu/gazdasagpolitika/feed/'),
        ('Eur\xf3pai \xfcgyek', 'http://kitekinto.hu/europai-ugyek/feed/'),
        ('Eur\xf3p\xe1n k\xedv\xfcl', 'http://kitekinto.hu/europan-kivul/feed/'),
        ('Vesz\xe9lyz\xf3n\xe1k', 'http://kitekinto.hu/veszelyzonak/feed/'),
        ('V\xe1llalati h\xedrek', 'http://kitekinto.hu/vallalati-hirek/feed/'),
        ('T\u0151zsde', 'http://kitekinto.hu/tozsde/feed/'),
        ('Aut\xf3', 'http://kitekinto.hu/auto/feed/'),
        ('Kult\xfara', 'http://kitekinto.hu/kultura/feed/'), ]
PK�X=*�dXXkitsapun.png�PNG


IHDR  szz�IDATx^��{�]U�k�}��N��y����
�G+
yiI@E���÷�$VI�`�h B�� 1��#�����P��@K�34P�TB[[y��ef�=g��deg24���}�����Z�Z�^y�k�͙�
UŌI�(�V��1b��m�͊��հ�M����)�zR
 Bʹ��4���';f���R��"�"By�M�ɹ.�Q'dUr+TU$��(�$�h�`���0��~��$-b�΢;0���A�
��5�LnR=���1x���E��14k!c�k;�F��IPL[������Cی�캻�<
�`V����Գ����D>;_�+��c51%�#��g���KW�|��\u���6<@3~�N���2U6���Nw��k�Cw�,�b��/��ȓ4���b b ��{�����iZ$T|��[�����������^;i�^���s���'OFm���O�n���nD�#R�Abn�Xc㣼�o��/��=��i�#�0��xb��s�=����a�7/���>�*R2�d�1()C`����0��G}q��aG
ڜ1'�1g	�W_��k3;���H�TGR4�J��{`�((ɔ֔lJ(��R:V��A�g�^Z����;�>��xs�3�y�k=�@]	U��'��@4HA�BB�܀2N�5�C�'���,[u����yg�V���u*�s�CՉ�i��e �l����=)����k�W1�*����yw�V:U�T��\ʩ���Ϥ���B�@!����s3ȭw=����y�W��G����{���H�T	RĉA���L�QE�E�a8L1i��b�E�g���#�?��ɫ�~��J{�M����� ���*�9�i��)|����8|`��[����Hwz�B ��1�����R��$�A���r9�
��q4��&���>������@C�U0�UPb�*�ZD��ܔ/��R�NB�x�!0p�1,��Zb�e��n^��K��I)��:%��������D5����2��=Gr��=�3r��99��m�6N�"�-�5-BD0ˈ���D������i��%S<lA2A���Xw��E�]����4
U��ڒ�_�dh�)>*e�R
��'5A]��GWI������9,�h-/=u�k�)��@�b�H�1��]��U�d�`*>�|A�m矛�Ċ��'3f/bŚ1���X�CH��;�ߋ!
��@ܑ,���-�C�]� �)��o2��m�z�
����ً\ԋ�݊���1��II*�A�;B��D�p��J�9��QB�# AȪ"v�u�l�7�������/����~�5Mi6�N�l���&�r�d�`8�3�4BB�t|)F��v�3/�yR�м%��ٛ����ȹϘ�>�_@B��?���30l�Ƅ�1ڈ� ����b�]���yX�� �)�/�e��8��/�m����)U��` �g`OR5�&�	dU�?PR���B���乇�Y��BUD,:�"��3��07d z�J��-Fx s�YA
,C����BN��ʡw��g�ʋ���E�|�׾���hi���H���t@ڻ�a�t��.��$�C	x*rΈո�HV�(��4�p��Q�	[�i��]�*1�t�
�|gv鹗a�3G�V����NI�Q�Vջ1�mCՉ�~�)6?�/�,]�ƻ��'~A
-�>hL�%�;Z�(�o]s����L��뚷�z���_��~}Ӆt�Ϡ[C�j�"^�
�3K&N~֧�2�?��GoG�tg$��e
b���
������KY|�2�b���WF�=$,���?�RwU�Eܭ�7F�s.��>r�%[D�-��s`����Y�PȽ̚�\���5�����lX��M���W�9vn�1�kf@'�	��Ln��'"q��o�K���m��W�<��{
��:��tۑ�G������_��93�s�t�2>Б}sgȎ�Nجy~�	�����\��jjg�8IEND�B`�PK�X�����kitsapun.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.kitsapun.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Kitsapsun(BasicNewsRecipe):
    title = 'Kitsap Sun'
    __author__ = 'Darko Miletic'
    description = 'News from Kitsap County'
    publisher = 'Scripps Interactive Newspapers Group'
    category = 'news, Kitsap county, USA'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 50
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    auto_cleanup = True

    feeds = [(u'News', u'http://www.kitsapsun.com/feeds/rss/news'),
             (u'Sports', u'http://www.kitsapsun.com/feeds/rss/sports'),
             (u'Entertainment',
              u'http://www.kitsapsun.com/feeds/rss/entertainment'),
             (u'Lifestyles', u'http://www.kitsapsun.com/feeds/rss/lifestyle'),
             (u'Opinion', u'http://www.kitsapsun.com/feeds/rss/opinion'),
             ]
PK�X�C���kleinezeitung.png�PNG


IHDR  D����PLTE������������������������
�����
�������鷷ن��^^�
����
噙����������	���ߟ��椣��nn�ts�11������㩨篯黺�{z�`_㽽����ݶ�43�SS������A@�12����
�䤤ᙙ�11�UU�
䚚ތ��zy������rr�	���
��
鹹�~ԁ���ָ$$�]\���ڗ��

�
��
������܌�鸸����ed���11��	�yx�����鸷��ܻ����10�SR���	��! ����>>������11���漻�32�CC�yy㙙��,+�dd��؁�ݖ���ii������		���KJ��xx�}}��ij��Ļ98�''꭭�
���䱱�ssޏ�ޗ�ف�����^]ه��__��  �xx݉��bb��ww�vv�ss�tt�rr�||�BB�܄�ߍ�䝜♙樧ݏ��
��
���	�
�
�
���LtRNSM���N���O���<���IDATx���CbQ��u�m�v�Ķm۶m�lc��?<磨�а�

q�H[I��0zFEӃp*<H��!B�(xv�3���e�I*N�LV�"����!�\��r9�
::4�6rv}��W\"���'+�����N�[�o‰qt&n��*|x|z~y}{���S
f��s8�y����%���"����������j��FDq�rpH9<�0�3�sd�l<�񗖍+��k�l}C��Mvv�l	�G�81�[��/��J�2I2?%��&��32�3��汱��wPptr��t�ys���<<k���6nڼe���ڱs��=�{��?p���#G�?q���3gϝ�p�@Nԗ.�
^�*(�z�DD@A}]9�De�o��󋋋�K�`IQ�=��C8��W���ʅ;�s�2�'��Iz��IEND�B`�PK�X=>��JJkleinezeitung.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function

from calibre.web.feeds.news import BasicNewsRecipe


class KleineZeitungRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'de_AT'
    version = 1

    title = u'Kleine Zeitung'
    publisher = u'Kleine Zeitung GmbH & Co KG'
    category = u'News, Newspaper'
    description = u'Nachrichten aus \u00D6sterreich'

    use_embedded_content = False
    remove_empty_feeds = True
    oldest_article = 2
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True

    masthead_url = 'https://cdn-kl.niceshops.com/images/logos/logo_kleine_invoice.jpg'

    feeds = [
        ('Nachrichten', 'http://www.kleinezeitung.at/rss/nachrichten'),
        ('Politik', 'http://www.kleinezeitung.at/rss/politik'),
        ('Wirtschaft', 'http://www.kleinezeitung.at/rss/wirtschaft'),
        ('Österreich und die Welt', 'http://www.kleinezeitung.at/rss/chronik'),
        ('Leben', 'http://www.kleinezeitung.at/rss/leben'),
        ('Sport', 'http://www.kleinezeitung.at/rss/sport'),
        #        ('Ennstal', 'http://www.kleinezeitung.at/rss/rss_ennstal'),
        #        ('Graz & Umgebung', 'http://www.kleinezeitung.at/rss/rss_graz'),
        #        ('Leoben', 'http://www.kleinezeitung.at/rss/rss_leoben'),
        #        ('Murtal', 'http://www.kleinezeitung.at/rss/rss_murtal'),
        #        ('Mürztal', 'http://www.kleinezeitung.at/rss/rss_muerztal'),
        #        ('Oststeier', 'http://www.kleinezeitung.at/rss/rss_oststeier'),
        #        ('Süd & Südwest', 'http://www.kleinezeitung.at/rss/rss_suedsuedwest'),
        #        ('Südost & Süd', 'http://www.kleinezeitung.at/rss/rss_sueostsued'),
        #        ('Weiz', 'http://www.kleinezeitung.at/rss/rss_weiz'),
        #        ('Weststeier', 'http://www.kleinezeitung.at/rss/rss_weststeier'),
        #        ('Feldkirchen', 'http://www.kleinezeitung.at/rss/rss_feldkirchen'),
        #        ('Klagenfurt', 'http://www.kleinezeitung.at/rss/rss_klagenfurt'),
        #        ('Lavanttal', 'http://www.kleinezeitung.at/rss/rss_lavanttal'),
        #        ('Oberkärnten', 'http://www.kleinezeitung.at/rss/rss_oberkaernten'),
        #        ('Osttirol', 'http://www.kleinezeitung.at/rss/rss_osttirol'),
        #        ('St. Veit', 'http://www.kleinezeitung.at/rss/rss_stveit'),
        #        ('Villach', 'http://www.kleinezeitung.at/rss/rss_villach'),
        #        ('Völkermarkt', 'http://www.kleinezeitung.at/rss/rss_voelkermarkt')
    ]

    remove_tags_before = dict(attrs={'class': 'hline'})
    remove_tags_after = [dict(name='div', attrs={'class': 'articletext'})]
    remove_tags = [dict(name='hr')]

    extra_css = '''
                h1 {text-align: left;}
                '''

    def print_version(self, url):
        main, sep, id = url.rpartition('/')
        return main + '/print.do'

    def preprocess_html(self, soup):
        if soup.find('div', {'class': 'articletext'}) is None:
            self.abort_article()
        return soup
PK�Xi��@@klubknjige.recipe
__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
klub-knjige.blogspot.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class KlubKnjige(BasicNewsRecipe):
    title = 'Klub knjige'
    __author__ = 'Darko Miletic'
    description = 'literarni blog'
    oldest_article = 30
    max_articles_per_feed = 100
    language = 'sr'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = True
    publication_type = 'blog'
    extra_css             = """
                               @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                               body{font-family: Arial,Tahoma,Helvetica,FreeSans,sans1,sans-serif}
                               img{margin-bottom: 0.8em; border: 1px solid #333333; padding: 4px }
                            """

    conversion_options = {
        'comment': description, 'tags': 'knjige, blog, srbija, sf', 'publisher': 'Klub Knjige', 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    feeds = [(u'Posts', u'http://klub-knjige.blogspot.com/feeds/posts/default')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X(k�Z==km_blog.png�PNG


IHDR(-S{PLTE�����������������������������������������������������Լ�Լ�̴�̴�Ĭ�Ĭ�Ĭ�����������������������������|��|��|��t��t��dv��̇8tRNS@��fpIDATxڭH�����m��s�&g<qd��1RT ��f9��Zz�:|�9��xu������8]���0<��}Ɛ�;��?T��y�ھ�OȇI���L��C�`�M�7=po!��n(:IEND�B`�PK�Xh��Ń�km_blog.recipe
__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com>, Artur Stachecki <artur.stachecki@gmail.com>'

'''
korwin-mikke.pl/blog
'''

from calibre.web.feeds.news import BasicNewsRecipe


class km_blog(BasicNewsRecipe):
    title = u'Korwin-Mikke Blog'
    __author__ = 'teepel <teepel44@gmail.com>'
    language = 'pl'
    description = 'Wiadomości z bloga korwin-mikke.pl/blog'
    INDEX = 'https://korwin-mikke.pl/blog'
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    remove_empty_feeds = True

    feeds = [(u'blog', u'https://korwin-mikke.pl/blog/rss')]

    keep_only_tags = [dict(name='div', attrs={'class': ['header-standard header-classic single-header', 'post-image', 'post-entry blockquote-style-1']})]

    remove_tags = [dict(name='div', attrs={'class': 'penci-hide-tagupdated'})]
PK�X��אSSknack_be.png�PNG


IHDR  D���APLTE�"�������$�~�����hj��������z{��������������������GJ����bd�������������������#������np����������oq�������pq����������qr�km�PT����-3������������%,�������#�HL����'-�su��������vx�y{�TV����������z|�Y[�Z\�^`�6;����������ce������������df��������������������������8<�������BF���6˽��IDATx�b`&�`T�JyX� �� ��\��ضm�6�kj[��|���q�~@{
h����6�]5�/g��2&7����<%겍?���g�@�LM�4�=�D�?`���*�ƜkM���T�;�]?���b��#׼4���U@�>�� �1�F�͡���]1޿=nM3�`����#����Z����j
"�6U�Y�
Ww"�䤨\IEND�B`�PK�XZ��OOknack_be.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe


class KnackBE(BasicNewsRecipe):
    title = u'Knack.be'
    __author__ = u'erkfuizfeuadjfjzefzfuzeff'
    description = u'News from Belgium in Dutch'
    oldest_article = 7
    language = 'nl_BE'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='title'), dict(name='h1', attrs={'itemprop': 'name'}),
        dict(name='figure', attrs={'class': 'image'}),
        dict(name='p', attrs={'class': 'lead'}),
        dict(name='div', attrs={'class': 'article-body span8'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'Paywall'}),
        dict(name='div', attrs={'class': 'teaser header-opinion'})
    ]

    feeds = [(u'Nieuws', u'http://www.knack.be/nieuws/feed.rss'),
             (u'België', u'http://www.knack.be/nieuws/belgie/feed.rss'),
             (u'Wetenschap', u'http://www.knack.be/nieuws/wetenschap/feed.rss'),
             (u'Planet Earth', u'http://www.knack.be/nieuws/planet-earth/feed.rss'),
             (u'Mensen', u'http://www.knack.be/nieuws/mensen/feed.rss'),
             (u'Boeken', u'http://www.knack.be/nieuws/boeken/feed.rss'),
             (u'Opinie', u'http://www.knack.be/nieuws/opinie/feed.rss'),
             (u'Wereld', u'http://www.knack.be/nieuws/wereld/feed.rss'),
             (u'Gezondheid', u'http://www.knack.be/nieuws/gezondheid/feed.rss'),
             (u'Auto', u'http://www.knack.be/nieuws/auto/feed.rss'),
             (u'Ondertussen', u'http://www.knack.be/nieuws/ondertussen/feed.rss')]
PK�XB��q~~knife_media.png�PNG


IHDR  szz�EIDATxڴ���Q�?��U2KTh@�IU�)�DD�(�(%ŰV�U#"UD!*P�)Њ�E��w�l
��{�;�.��9��!��,�����>�N#���.���������V�R	�J�n�N��x~���7�"���l6d2�Wr�|�l6[;�L"��t��x<b<��H$��f3y<
�d4��p^����~�T�R����
��H&��B� �^�f.�v;��D�Q��j͛L��@ ��u:��j�J�d0���	�������\.�f�	���I$�J�"�F�}�b1���ϗ����^��F�x�Z�d����8q�V�9�H/���r�X,X�m���"��*7e(��D��xzz"���r4�P(��M���\.AD�D"f��u0>�Ov��3�LP��Y�m��~��l�o�V��A�ض�M��m;�Yf۶m�m��~�m��T��x���y���:���_��	'���G������6����������SO�UW]Uvꩧnq��G�-����߿���Monj��F=���i�E��.�ٲ8�y���.�o�K�,)c'.��!��#�|�������M�����D*��dSIe���	v����Ъ�?�<�@�w}&>���R4y_<}} ��3�l��5��5�����H�33x�����C�L
��w�y����Sڜ*+*`���
x�K0�-b ��)���m�H�ޠP ��C*��!*8CPUY�>����?P��#c����p»|��5�SV]� �E���Y��ŕ&j�NAf���?�Tzf�y��������!M�'o��&ۊk �-@(��Lq�C���	
ŵ6� 5(�v����o������a2��g�Riٙe�1�����cj��o&vAeq�3�;���.�m(2�bɵ�)Hds�b��
1i�D��,A$�iz��h"9� q��`���68�\h^�Ɏ�H�|����X|^e��SZÃ?�Uc��Z��!�Q
�g�
EvxNA��̧t.r������m��aN<�H�AP($B�9(�+��s8�"�)�͂�j��84�{��n�&q�vcN���.�o-2��o;��d�5z�����j�A�ъ6�a�t��1:�m�a�тE��0�҂�b��q�յ����?�B�'��%TpvZ��Oىh2EJnТ��G`X��<�����*r��kU�HPev��f��@x��' �V[0�3
Zʅ�`ڿM6P�{MRH�oB)L��������2K�,8�H����
��fN)W�v��K��J-]y6�3�<����`Jk��ƿ��{����Ď��pP�
�pN�=�
��9�I$��d�I:�ǵ�ƈRs"�����TӴ�G&pBk�grLJ�d�<�v�(�S�I:���"G^��k��kF���݃�(���b"v<MeB
�37��*.���C���5�OC+�;�/w�U�!�3;�{���<�����ۭ�����v�I_�3IEND�B`�PK�X�V�-��knife_media.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class KnifeMedia(BasicNewsRecipe):
    title = '\u041D\u043E\u0436'
    __author__ = 'bugmen00t'
    description = '\u0418\u043D\u0442\u0435\u043B\u043B\u0435\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u044B\u0439 \u0436\u0443\u0440\u043D\u0430\u043B \u043E \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u0435 \u0438 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435'  # noqa
    publisher = '\u041C\u0438\u0445\u0430\u0438\u043B \u0426\u044B\u0433\u0430\u043D, \u0422\u0430\u0442\u044C\u044F\u043D\u0430 \u041A\u043E\u044D\u043D'
    category = 'blog'
    cover_url = u'https://knife.media/feature/pdd/img/knife_logo.33a98aee.svg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 14
    max_articles_per_feed = 30

    remove_tags_before = dict(name='div', attrs={'class': 'entry-header'})

    remove_tags_after = dict(name='div', attrs={'class': 'entry-content'})

    remove_tags = [
        dict(name='aside'),
        dict(name='div', attrs={'class': 'entry-header__share share'}),
        dict(name='div', attrs={'class': 'entry-comments'}),
        dict(name='div', attrs={'class': 'entry-footer'}),
        dict(name='div', attrs={'class': 'entry-bottom'}),
        dict(name='figure', attrs={'class': 'figure figure--similar'})
    ]

    feeds = [(
        '\u041B\u043E\u043D\u0433\u0440\u0438\u0434\u044B',
        'https://knife.media/category/longreads/feed/'
    ),
             (
                 '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
                 'https://knife.media/category/news/feed/'
             )]
PK�X
��a!!koegelokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�XC!��66koegelokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lørdagsavisen
'''


class KoegeLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lørdagsavisen'
    description = 'Lokale, regionale nyheder, bolig, motor og job i Køge, Greve, Ringsted og Stevns på koege.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lørdagsavisen', 'http://koege.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lørdagsavisen', 'http://koege.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lørdagsavisen', 'http://koege.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lørdagsavisen', 'http://koege.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lørdagsavisen', 'http://koege.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lørdagsavisen', 'http://koege.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X
��a!!koldinglokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X9X8�\\koldinglokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Kolding
'''


class KoldingLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Kolding'
    description = 'Lokale og regionale nyheder, sport, kultur fra Kolding og omegn på kolding.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Kolding', 'http://kolding.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Kolding', 'http://kolding.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Kolding', 'http://kolding.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Kolding', 'http://kolding.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Kolding', 'http://kolding.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Kolding', 'http://kolding.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�Xծ&���komchadluek.png�PNG


IHDR  D���`PLTE�$&�$&�$&�$&�$&�$&�$&�$&�$&�$&�$&�$&�$&�$&�$&����$&������[\���������MO����vw�?A�����24dd�tRNS����`߯@P� p�0�`�5IDATx�b p
'�D
A(���we��]^��:�t*eYJ�ޏl���G�xn�+�y��\Ҏ,Y���?q��TtB��:%���� ��,�B<)�-����^�z����?c�����f�X�u��,UBo�t�`0j�|�-��p�047��������B�1f�C	��R2І9�P��)n��[�u�Q�NȘ/��%<��q��y��@g�-��2v�*�OGy'뇛�u���b���|�Z4r;��IEND�B`�PK�X+H�5
5
komchadluek.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class KomChadLuek(BasicNewsRecipe):

    title = 'KomChadLuek'
    description = 'Komchadluek News'
    __author__ = 'ballsaii and Chotechai'
    __license__ = 'GPL v3'
    publisher = 'Nation Media Group'
    category = 'news, Thai'
    language = 'th'

    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True

    cover_url = 'http://www.komchadluek.net/images_layout2/komchadluek_headerlogo.png'

    keep_only_tags = []
    keep_only_tags.append(dict(name='h2'))
    keep_only_tags.append(dict(name='div', attrs={'id': 'news_detail_news'}))

    remove_tags_after = [dict(name='hr')]

    feeds = (
        (u'\u0e01\u0e32\u0e23\u0e40\u0e21\u0e37\u0e2d\u0e07',
         'http://www.komchadluek.net/rss/politic.xml'),
        (u'\u0e15\u0e48\u0e32\u0e07\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28',
         'http://www.komchadluek.net/rss/sport.xml'),
        (u'\u0e40\u0e01\u0e29\u0e15\u0e23',
         'http://www.komchadluek.net/rss/agriculture.xml'),
        (u'\u0e15\u0e48\u0e32\u0e07\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28',
         'http://www.komchadluek.net/rss/foreign.xml'),
        (u'\u0e1a\u0e31\u0e19\u0e40\u0e17\u0e34\u0e07',
         'http://www.komchadluek.net/rss/entertainment.xml'),
        (u'\u0e1c\u0e39\u0e49\u0e2b\u0e0d\u0e34\u0e07-\u0e41\u0e1f\u0e0a\u0e31\u0e48\u0e19',
         'http://www.komchadluek.net/rss/fashion.xml'),
        (u'\u0e1e\u0e23\u0e30\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07',
         'http://www.komchadluek.net/rss/amulet.xml'),
        (u'\u0e20\u0e39\u0e21\u0e34\u0e20\u0e32\u0e04-\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e04\u0e21\u0e17\u0e49\u0e2d\u0e07\u0e16\u0e34\u0e48\u0e19',
         'http://www.komchadluek.net/rss/local.xml'),
        (u'\u0e25\u0e38\u0e07\u0e41\u0e08\u0e48\u0e21',
         'http://www.komchadluek.net/rss/unclecham.xml'),
        (u'\u0e44\u0e25\u0e1f\u0e4c\u0e2a\u0e44\u0e15\u0e25\u0e4c',
         'http://www.komchadluek.net/rss/lifestyle.xml'),
        (u'\u0e40\u0e28\u0e23\u0e29\u0e10\u0e01\u0e34\u0e08-\u0e01\u0e32\u0e23\u0e15\u0e25\u0e32\u0e14',
         'http://www.komchadluek.net/rss/economic.xml'),
        (u'\u0e2d\u0e32\u0e2b\u0e32\u0e23',
         'http://www.komchadluek.net/rss/food.xml'),
        (u'\u0e04\u0e19\u0e23\u0e31\u0e01\u0e1a\u0e49\u0e32\u0e19-\u0e22\u0e32\u0e19\u0e22\u0e19\u0e15\u0e4c',
         'http://www.komchadluek.net/rss/homecar.xml'),
        (u'\u0e14\u0e39\u0e14\u0e27\u0e07-\u0e42\u0e2b\u0e23\u0e32\u0e28\u0e32\u0e2a\u0e15\u0e23\u0e4c',
         'http://www.komchadluek.net/rss/horoscope.xml'),
        (u'\u0e27\u0e34\u0e17\u0e22\u0e4c\u0e28\u0e32\u0e2a\u0e15\u0e23\u0e4c-\u0e44\u0e2d\u0e17\u0e35',
         'http://www.komchadluek.net/rss/scienceit.xml'),
        (u'\u0e28\u0e32\u0e2a\u0e19\u0e32 \u0e28\u0e34\u0e25\u0e1b\u0e30-\u0e27\u0e31\u0e12\u0e19\u0e18\u0e23\u0e23\u0e21 \u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e2a\u0e38\u0e02',  # noqa
         'http://www.komchadluek.net/rss/artculture.xml'),
        (u'\u0e01\u0e32\u0e23\u0e28\u0e36\u0e01\u0e29\u0e32',
         'http://www.komchadluek.net/rss/education.xml'),
        (u'\u0e1a\u0e17\u0e04\u0e27\u0e32\u0e21',
         'http://www.komchadluek.net/rss/article.xml'),
        (u'\u0e2d\u0e32\u0e0a\u0e0d\u0e32\u0e01\u0e23\u0e23\u0e21',
         'http://www.komchadluek.net/rss/crime.xml')
    )
PK�X�g���kommersant.png�PNG


IHDR(-SPLTE����������f�tRNS@��fOIDATx�]�
A�6��>�������G�1��#���\�
?������b��	�G�_c�X�I�<C��}������KIEND�B`�PK�XL��6��kommersant.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

__license__ = 'GPL v3'
__copyright__ = '2010-2013, Darko Miletic <darko.miletic at gmail.com>'
'''
www.kommersant.ru
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes


class Kommersant_ru(BasicNewsRecipe):
    title = 'Kommersant'
    __author__ = 'Darko Miletic (with fixes by bugmen00t)'
    description = 'News from Russia'
    publisher = 'Kommersant'
    category = 'news, politics, Russia'
    oldest_article = 7
    max_articles_per_feed = 50
    no_stylesheets = True
    use_embedded_content = False
    language = 'ru'
    publication_type = 'newspaper'
    cover_url = 'https://iv.kommersant.ru/ContentFlex/images/logo.png'

    remove_tags_before = dict(name='header', attrs={'class': 'doc_header'})

    remove_tags_after = dict(
        name='div', attrs={'class': 'doc__text document_authors'}
    )

    remove_tags = [
        dict(name='ul', attrs={'class': 'crumbs'}),
        dict(name='div', attrs={'class': 'hide_desktop'}),
        dict(name='div', attrs={'class': 'incut incut--right'}),
        dict(name='div', attrs={'class': 'incut incut--left'}),
        dict(name='div', attrs={'class': 'incut incut--center'}),
        dict(name='div', attrs={'class': 'ba'}),
        dict(name='div', attrs={'id': 'lenta'}),
        dict(name='div', attrs={'class': 'layout basement_news__body'}),
        dict(name='footer', attrs={'class': 'footer'}),
        dict(name='section', attrs={'class': 'potd'}),
        dict(name='footer', attrs={'class': 'doc_footer'}),
        classes('ui-modal__hide'),
        dict(name='div', attrs={'class': 'adv_interscroll hide_desktop'}),
        dict(name=['button', 'source']),
    ]

    def preprocess_html(self, soup):
        for tag in soup.findAll(attrs={'data-lazyimage-src': True}):
            tag['src'] = tag['data-lazyimage-src']
        return soup

    feeds = [
        (
            '\u0413\u043B\u0430\u0432\u043D\u043E\u0435',
            'https://www.kommersant.ru/rss/main.xml'
        ),
        (
            '\u0413\u0430\u0437\u0435\u0442\u0430 "\u041A\u043E\u043C\u043C\u0435\u0440\u0441\u0430\u043D\u0442"',
            'https://www.kommersant.ru/rss/daily.xml'
        ),
        (
            '\u041B\u0435\u043D\u0442\u0430 \u043D\u043E\u0432\u043E\u0441\u0442\u0435\u0439',
            'https://www.kommersant.ru/RSS/news.xml'
        ),
        (
            '\u041C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B \u0441 \u0441\u0430\u0439\u0442\u0430',
            'https://www.kommersant.ru/RSS/corp.xml'
        ),
        (
            '\u0420\u0430\u0434\u0438\u043E \u041A\u043E\u043C\u043C\u0435\u0440\u0441\u0430\u043D\u0442\u044A-FM',
            'https://www.kommersant.ru/RSS/radio.xml'
        ),
        (
            '\u0422\u0435\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F',
            'https://www.kommersant.ru/RSS/tema.xml'
        ),
        (
            '\u0416\u0443\u0440\u043D\u0430\u043B \u00AB\u041E\u0413\u041E\u041D\u0401\u041A\u00BB',
            'https://www.kommersant.ru/RSS/ogoniok.xml'
        ),
        (
            '\u0416\u0443\u0440\u043D\u0430\u043B \u00AB\u041A\u043E\u043C\u043C\u0435\u0440\u0441\u0430\u043D\u0442\u044A WEEKEND\u00BB',
            'https://www.kommersant.ru/RSS/weekend.xml'
        ),
        (
            'Журнал «Коммерсантъ АВТОПИЛОТ»',
            'https://www.kommersant.ru/RSS/auto.xml'
        ),
        (
            '\u041F\u043E\u043B\u0438\u0442\u0438\u043A\u0430',
            'https://www.kommersant.ru/rss/section-politics.xml'
        ),
        (
            '\u042D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0430',
            'https://www.kommersant.ru/RSS/section-economics.xml'
        ),
        (
            '\u0411\u0438\u0437\u043D\u0435\u0441',
            'https://www.kommersant.ru/rss/section-business.xml'
        ),
        (
            '\u0412 \u043C\u0438\u0440\u0435',
            'https://www.kommersant.ru/rss/section-world.xml'
        ),
        (
            '\u041F\u0440\u043E\u0438\u0441\u0448\u0435\u0441\u0442\u0432\u0438\u044F',
            'https://www.kommersant.ru/rss/section-accidents.xml'
        ),
        (
            '\u041E\u0431\u0449\u0435\u0441\u0442\u0432\u043E',
            'https://www.kommersant.ru/rss/section-society.xml'
        ),
        (
            '\u041A\u0443\u043B\u044C\u0442\u0443\u0440\u0430',
            'https://www.kommersant.ru/rss/section-culture.xml'
        ),
        (
            '\u0421\u043F\u043E\u0440\u0442',
            'https://www.kommersant.ru/rss/section-sport.xml'
        ), ('Hi-Tech', 'https://www.kommersant.ru/RSS/section-hitech.xml'),
        (
            '\u0410\u0432\u0442\u043E',
            'https://www.kommersant.ru/RSS/Autopilot_on.xml'
        ),
        (
            '\u0421\u0442\u0438\u043B\u044C',
            'https://www.kommersant.ru/RSS/section-style.xml'
        ),
        (
            '\u0421\u0430\u043D\u043A\u0442-\u041F\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433',
            'https://www.kommersant.ru/rss/regions/piter_all.xml'
        ),
        (
            '\u0412\u043E\u0440\u043E\u043D\u0435\u0436',
            'https://www.kommersant.ru/rss/regions/vrn_all.xml'
        ),
        (
            '\u0415\u043A\u0430\u0442\u0435\u0440\u0438\u043D\u0431\u0443\u0440\u0433',
            'https://www.kommersant.ru/rss/regions/ekaterinburg_all.xml'
        ),
        (
            '\u0418\u0436\u0435\u0432\u0441\u043A',
            'https://www.kommersant.ru/rss/regions/izhevsk_all.xml'
        ),
        (
            '\u041A\u0430\u0437\u0430\u043D\u044C',
            'https://www.kommersant.ru/rss/regions/kazan_all.xml'
        ),
        (
            '\u041A\u0440\u0430\u0441\u043D\u043E\u0434\u0430\u0440',
            'https://www.kommersant.ru/rss/regions/krasnodar_all.xml'
        ),
        (
            '\u041A\u0440\u0430\u0441\u043D\u043E\u044F\u0440\u0441\u043A',
            'https://www.kommersant.ru/rss/regions/krasnoyarsk_all.xml'
        ),
        (
            '\u041D\u0438\u0436\u043D\u0438\u0439 \u041D\u043E\u0432\u0433\u043E\u0440\u043E\u0434',
            'https://www.kommersant.ru/rss/regions/nnov_all.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0438\u0431\u0438\u0440\u0441\u043A',
            'https://www.kommersant.ru/rss/regions/novosibirsk_all.xml'
        ),
        (
            '\u041F\u0435\u0440\u043C\u044C',
            'https://www.kommersant.ru/rss/regions/perm_all.xml'
        ),
        (
            '\u0420\u043E\u0441\u0442\u043E\u0432-\u043D\u0430-\u0414\u043E\u043D\u0443',
            'https://www.kommersant.ru/rss/regions/rostov_all.xml'
        ),
        (
            '\u0421\u0430\u043C\u0430\u0440\u0430',
            'https://www.kommersant.ru/rss/regions/samara_all.xml'
        ),
        (
            '\u0421\u0430\u0440\u0430\u0442\u043E\u0432',
            'https://www.kommersant.ru/rss/regions/saratov_all.xml'
        ),
        ('\u0423\u0444\u0430', 'https://www.kommersant.ru/rss/regions/ufa_all.xml'),
        (
            '\u0427\u0435\u043B\u044F\u0431\u0438\u043D\u0441\u043A',
            'https://www.kommersant.ru/rss/regions/chelyabinsk_all.xml'
        )
    ]
PK�Xa��||kommunalsundhed_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Kommunal Sundhed
'''


class Kommunalsundhed_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'Kommunal Sundhed'
    description           = 'Nyheder til kommunale ledere, der arbejder med sundhed og sygdom'
    category              = 'medicin, healthcare, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://kommunalsundhed.dk/
    feeds = [
        ('Kommunal Sundhed', 'http://kommunalsundhed.dk/feed/'),
        ('Kommentarer', 'http://kommunalsundhed.dk/comments/feed/'),
    ]
PK�XLx�//
kompas.png�PNG


IHDR  ��tRNSn��	pHYsOOc����IDAT��[�G�ᷪzj�簳��mlr@�\�(\p���ς��D��x���wֳs�������
A���y}���?<�=�*�o͟n�?ߺ���q�X�	6k�V�XomH���t8�8^��c�-ˊ�
�-�]�<��ڋ��n��i�O�P�ˬܟK+ə�c'ŠX�=%�ѧ�4��qW�9�R��j�H��K�V����
��'��(�F�	���@���Tf�/�HyB�zdR�$n�/�����H=]��t6�q�w�? @�6��+Qe��=x�S�GQ {�V����E��2���������@��D�[:=��e���0�x���O�$4�����uRHE�rdAY 9u�+��HX���ش�C0D��Qy��	��D���H-CB-R��<seA��T������b˂|��	�״zD��������Noo�߱f�U'�����v/��4��5��s%�[ |��R|C>ez�b�����6�7�����û;햹~���|F��{igK�x��*V�b%FBm|J�C"��[�����!�@������O��hT#M/m�M4�|QT��I�-��(��kM���,�-�2�?@i���"��ջ�t�M��ڴݪn�,�b6�2W�5�7"(�3��K�<�ͩ��ft���41"F�6v����N�v{�vg���h�^V��F)6����)q�b+޶�kU�'�s�)�;�.J�=�m+�u�n;Q1��O�n/2��z��fX���"(ЂT��%�_����Hm�V�)���}�.("��I�c��F�M��Rɫ����%1�%Fb4D�2h֪���*^�6��f��MXq�ɝo�F�V2��n�n��h�C<<����t6+'���#Z���Wէz������x&AUm��VSS/S_��D���a����x���Vjع�7���ݫ�k�nE)*�ۖ��@�T��.?Sg��뼪^,�8�H��e�;��|*�e��a�������=��>y�������/�j|&� hQ�@�c��u���?��W#ɟ/�_'ͳ�K=��[�SzN�����V*!��.��y��UV}u2ֶ��������$w�H����z��x����/��\�Z��2�]ʍ����S�X&'�Ҿ��Y�W�YNu�q:nB8�Ե�!����A�6��0ڭOjw~2�~>��?�	 `�!ߏ���;��p�Ͳ�gZ�B��W���r���X)5�E����˧�l�/Ͽ̦�;���Ja��!�Ve'����Jwj"h�I�VR����;�Qc0>��mwi�������os˚�`,+^H���T�U�:D�Ϛ�(�{B�G��ja&�f����e�&� l8H�Z�F}�;�9n[��.�5��&YI�5&B�}�������/�YI��VX<8��l4`����>1�G"�cd%�~����T�����	oiHivqY��	��
�!�
�7�/3��2z��3D �x@x͆f��!�Ǹ��h�P���LNd�
�SDX�X��[5�Cw��1y��
�El���/�~��s�	�����/E4Uԝ���n̻4�)�[h�8������Hƚ���QWGyS4̈́EɌd����rL/����7�9o�!aCૹT��h)iN[�Y���t(���9�#�Ǹ9k�5�=$l<����%�ʭ~�'����I�3���;�1�&��3Ot8p+IEND�B`�PK�Xy�6�**
kompas.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2011, Adrian Gunawan <agunawan at adrnalin.com>'
__author__ = 'Adrian Gunawan'
__version__ = 'v1.0'
__date__ = '02 February 2011'

'''
http://www.kompas.com/
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Kompas(BasicNewsRecipe):
    title = u'Kompas'
    masthead_url = 'http://stat.k.kidsklik.com/data/2k10/kompascom2011/images/logo_kompas.png'
    cover_url = 'http://stat.k.kidsklik.com/data/2k10/kompascom2011/images/logo_kompas.png'

    __author__ = u'Adrian Gunawan'
    description = u'Indonesian News from Kompas Online Edition'
    category = 'local news, international, business, Indonesia'
    language = 'id'
    oldest_article = 5
    max_articles_per_feed = 100

    no_stylesheets = True
    use_embedded_content = False
    no_javascript = True
    remove_empty_feeds = True

    timefmt = ' [%A, %d %B, %Y]'
    encoding = 'utf-8'

    keep_only_tags = [dict(name='div', attrs={'class': 'content_kiri_detail'})]

    extra_css = '''
                  h1{font-family:Georgia,"Times New Roman",Times,serif; font-weight:bold; font-size:large;}
                  .cT-storyDetails{font-family:Arial,Helvetica,sans-serif; color:#666666;font-size:x-small;}
                  .articleBody{font-family:Arial,Helvetica,sans-serif; color:black;font-size:small;}
                  .cT-imageLandscape{font-family:Arial,Helvetica,sans-serif; color:#333333 ;font-size:x-small;}
                  .source{font-family:Arial,Helvetica,sans-serif; color:#333333 ;font-size:xx-small;}
                  #content{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                  .pageprint{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                  #bylineDetails{font-family:Arial,Helvetica,sans-serif; color:#666666;font-size:x-small;}
                  .featurePic-wide{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                  #idfeaturepic{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                  h3{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;}
                  h2{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;}
                  h4{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;}
                  h5{font-family:Georgia,"Times New Roman",Times,serif; font-size:small;}
                  body{font-family:Arial,Helvetica,sans-serif; font-size:x-small;}
                '''

    remove_tags = [
        dict(name='div', attrs={'class': [
             'c_biru_kompas2011', 'c_abu01_kompas2011', 'c_abu_01_kompas2011', 'right', 'clearit']}),
        dict(name='div', attrs={
             'id': ['comment_list', 'comment_paging', 'share']}),
        dict(name='form'),
        dict(name='ul'),
    ]

    preprocess_regexps = [
        (re.compile(r'<!--TERKAIT -->.*<!--TERKAIT END -->',
                    re.DOTALL | re.IGNORECASE), lambda match: ''),
        (re.compile(r'<strong>Sent Using.*</body>',
                    re.DOTALL | re.IGNORECASE), lambda match: ''),
        (re.compile(r'<strong>Kirim Komentar Anda</strong>',
                    re.DOTALL | re.IGNORECASE), lambda match: ''),
        (re.compile(r'<a[^>]*>Kembali ke Index Topik Pilihan</a>',
                    re.DOTALL | re.IGNORECASE), lambda match: ''),
    ]

    feeds = [
        (u'Nasional', u'http://www.kompas.com/getrss/nasional'),
        (u'Regional', u'http://www.kompas.com/getrss/regional'),
        (u'Internasional', u'http://www.kompas.com/getrss/internasional'),
        (u'Megapolitan', u'http://www.kompas.com/getrss/megapolitan'),
        (u'Bisnis Keuangan',
         u'http://www.kompas.com/getrss/bisniskeuangan'),
        (u'Kesehatan', u'http://www.kompas.com/getrss/kesehatan'),
        (u'Olahraga', u'http://www.kompas.com/getrss/olahraga'),
    ]
PK�Xӟ����kompiutierra.png�PNG


IHDR(-SnPLTE��Y��Y��Y��Y��X��Y��Y��Y��V��V��V��V��V��V��V��S��S��S��S��S��S��T��O��O��O��O��O��O��Q��K��K��K��K��K��K��L��G��G��G��F��G��H��B��B��B��B��B��I��=��=��=��8��8��8��8��8��7��3��3��3��4��3��3��/��/��/��/��/��.��*��*��*��*��*��*��)��&��&��&��&��&��&��&��"��"��"��"��"��"����������������������������������Y��V��S��O��K��G��B��=��8��3��/��*��&��"����^1<�jtRNS	��#"�	��!W�w	��(��/	��Dٯ	��|��a	���� 	����	��	����	���J	���	��`��	��8��C	��%��	��!W��	��#(��7?J*xIDATWca``d�`���Ș�0��##�ȏ v �#V�3 �T��w���@
@l@Fp1�B��G�X-�����x��"��@�g~�1�>B��B��=q>�o�z�-ǁ�IEND�B`�PK�X;0kompiutierra.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

__license__ = 'GPL v3'
__copyright__ = '2015, lcd1232, malexey1984@gmail.com'
__author__ = 'lcd1232'

from calibre.web.feeds.news import BasicNewsRecipe


class Computerra(BasicNewsRecipe):
    title = u'\u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0440\u0430'
    __author__ = 'lcd1232 (with fixes by bugmen00t)'
    description = 'Компьютерра: все новости про компьютеры, железо, новые технологии, информационные технологии'
    cover_url = 'https://yt3.ggpht.com/ytc/AKedOLRCMA71rKaP4HfL2W26A-VdvsBj9BcOo7S6poTR=s900-c-k-c0x00ffffff-no-rj'
    language = 'ru'
    oldest_article = 100
    max_articles_per_feed = 50
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = False
    conversion_options = {'linearize_tables': True}
    simultaneous_downloads = 5

    remove_tags_before = dict(name='div', attrs={'id': 'article'})

    remove_tags_after = dict(name='div', attrs={'class': 'article-body'})

    remove_tags = [dict(name='div', attrs={'class': 'cta-row'})]

    feeds = [(
        u'\u041A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0440\u0430',
        'https://www.computerra.ru/feed/'
    )]
PK�Xe�����konflikty_zbrojne.png�PNG


IHDR(-S0PLTE"""333DDDUUUfffwww���������������������H�}tRNS@��fhIDATx��� �=D$ ~��f���s�Y`;I[�>��$/���$�PWkk�j����y�����c/�����`������
�c�a�x߅*�����k�IEND�B`�PK�XRI�h��konflikty_zbrojne.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.news import BasicNewsRecipe


class Konflikty(BasicNewsRecipe):
    title = u'Konflikty Zbrojne'
    __author__ = 'fenuks'
    cover_url = 'http://konflikty.pl/wp-content/uploads/2014/07/konflikty.pl-logo.png'
    language = 'pl'
    description = u'Zbiór ciekawych artykułów historycznych, militarnych oraz recenzji książek, gier i filmów. Najświeższe informacje o lotnictwie, wojskach lądowych i polityce.'  # noqa
    category = 'military, history'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    keep_only_tags = [
        dict(name='h1'),
        dict(name='div', attrs={'id': 'page-content'})]

    remove_tags = [dict(name='aside'), dict(name='p', attrs={'id': 'breadcrumbs'}), dict(name='div', attrs={'class': [
        'tags clearfix', 'post-tags clearfix', 'post-nav section-container clearfix', 'about-author section-container clearfix vcard', 'post-related section-container clearfix', ]}), dict(name='div', attrs={'id': 'disqus_thread'})]  # noqa

    feeds = [(u'Konflikty Zbrojne', u'http://www.konflikty.pl/feed')]

    extra_css = '''
        h1 { font-size:130% }
    '''
PK�X�փ�77kopalniawiedzy.png�PNG


IHDR���IDATx�-ϱj�0��<��r�
,�|�tt*���r�tq��� � $p%GB@��P\7�.�C�o��X�� �����l�W�,Uv0�`#<�$�>��"`9Ӵ�v�g��->0�8��I�Q��P�i"�s�prg�c��v��R?��5-���.���oڱ�S)y}(&4_��1e�dz�s��`w�J���H����uM���뵭t���aյ�������)/Va��Fm�˿�ס�1IEND�B`�PK�Xl�ISkopalniawiedzy.recipe__license__ = 'GPL v3'
__copyright__ = '2011 Attis <attis@attis.one.pl>, 2012 Tomasz Długosz <tomek3d@gmail.com>'
__version__ = 'v. 0.1'

import re
from calibre.web.feeds.recipes import BasicNewsRecipe


class KopalniaWiedzy(BasicNewsRecipe):
    title = u'Kopalnia Wiedzy'
    publisher = u'Kopalnia Wiedzy'
    description = u'Ciekawostki ze świata nauki i techniki'
    encoding = 'utf-8'
    __author__ = 'Attis & Tomasz Długosz'
    language = 'pl'
    oldest_article = 7
    max_articles_per_feed = 100
    INDEX = u'http://kopalniawiedzy.pl/'
    remove_javascript = True
    remove_empty_feeds = True
    no_stylesheets = True

    remove_tags = [{'name': 'p', 'attrs': {'class': 'keywords'}}, {'name': 'div', 'attrs': {'class': 'sexy-bookmarks sexy-bookmarks-bg-caring'}},
                   {'name': 'div', 'attrs': {'class': 'article-time-and-cat'}}, {'name': 'p', 'attrs': {'class': 'tags'}}]
    remove_tags_after = dict(attrs={'class': 'ad-square'})
    keep_only_tags = [
        dict(name="div", attrs={'class': 'article-text text-small'})]
    extra_css = '.topimage {margin-top: 30px}'

    preprocess_regexps = [
        (re.compile(u'<a .* rel="lightboxText" .*><img (.*)></a>'),
         lambda match: '<img class="topimage" ' + match.group(1) + '>'),
        (re.compile(u'<br  /><br  />'),
         lambda match: '<br/>')
    ]

    feeds = [
        (u'Biologia', u'http://kopalniawiedzy.pl/wiadomosci_biologia.rss'),
        (u'Medycyna', u'http://kopalniawiedzy.pl/wiadomosci_medycyna.rss'),
        (u'Psychologia', u'http://kopalniawiedzy.pl/wiadomosci_psychologia.rss'),
        (u'Technologie', u'http://kopalniawiedzy.pl/wiadomosci_technologie.rss'),
        (u'Ciekawostki', u'http://kopalniawiedzy.pl/wiadomosci_ciekawostki.rss'),
        (u'Artykuły', u'http://kopalniawiedzy.pl/artykuly.rss')
    ]

    def is_link_wanted(self, url, tag):
        return ''.join(tag['class']) == 'next'

    def remove_beyond(self, tag, next):
        while tag is not None and getattr(tag, 'name', None) != 'body':
            after = getattr(tag, next)
            while after is not None:
                ns = getattr(tag, next)
                after.extract()
                after = ns
            tag = tag.parent

    def append_page(self, soup, appendtag, position):
        pager = soup.find('a', attrs={'class': 'next'})
        if pager:
            nexturl = self.INDEX + pager['href']
            soup2 = self.index_to_soup(nexturl)
            texttag = soup2.find('div', attrs={'id': 'articleContent'})

            tag = texttag.find(attrs={'class': 'pages'})
            self.remove_beyond(tag, 'nextSibling')

            newpos = len(texttag.contents)
            self.append_page(soup2, texttag, newpos)

            appendtag.insert(position, texttag)

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body, 3)

        for item in soup.findAll('div', attrs={'class': 'pages'}):
            item.extract()

        for item in soup.findAll('p', attrs={'class': 'wykop'}):
            item.extract()

        return soup
PK�X�����
korben.png�PNG


IHDR  D���PLTE'	+%!5
): $$$$-%,2%-?&().)),9++$',5F..7L/02A1.32"2(*37E44--5<P60976<7?H8"99:@:CV;,;05<*#<*.>!?.$?G\@AGA1*B$BDQD48DPkE/0FEKFK^H+H:@HNSHPbI62L,*NEHNTfO"P77P>8QbR.'R0-RSTT]nU9.UD<XVhY:6Z6*ZX^[1#[JB[fu\C<\F6]Zg`EGaTQb>,bJ;biwc:2dC=d`jf9%gPCi$jA2j`ZlN>lr�mJ9mm{nRIpsI?tTBtYTvZKv~�x.(ya[zR=zaSzmczu|{XG|*#|?1|~�}bN�H<�SG�]O����gY����dR�he�qc�\J�{v�jY��y����to�sa�:7����]N�i[�fV�r_�PH�{x��m�������xg��~����m_�oY�u_��z�������~k��u��p�ZY�vf�~j�l[��|����������mf��t�OS�������k]��r�Za�}p��{����������jf��u����_c�mn����������������wx�������jp��x����������������������������zpœ����Ģ���Ʈ�ƺ����ǔ�Ȭ���˛�˯�̶��¹���ϛ�ϼ�Я���Ѧ�Һ�Ӿ�ԏ�Ԛ�Է��������ö�ɾ�������˿�����������������������������������������������p(DtRNS@��f6IDAT8O���ke��gv�ڝݙ�n�&��61�!5��E��@R=z�y�<�^TO�<��E�DD����
IhR��d?gw�cߙ�֫�큟����zUy�
H�$<��Ʈ%���O��$QM�4I��T�]�܈���E0r0"M�e0u��
��Q"QU)T) K�$�1�)���@6)$	1Y֌t
U[P�t0�B$�P$���Q�b|L0�����Eꃧ۪�qUIq�e��M+�k`j>`Z�T	�5��\Q�7i��,r��[+�"�\¸�.V�澮&���n���0"Oj��^ +
*?��g@	��;^hOšz{��Z^�x�C����[*8�/�����GlvJR��}Wo����#�L�{/=�320C�}T��#_�b�=�]{\�r]p	�t�J��7���#�;u��]���	��&`���K�+�=4s8�lx:���:V+��FԺ��|����e���~u�x��#N&�s������M0�M>TE
o�}Ոc������M*&�r�X�+���nL}y����Ru~vN�#�x�,�g�-�ٕI76�N�����r�ܳ�r�8k37;�i��~Yv�s`��N�=(֓�o;��K=���������+;�a���b��1�~��8���9��7n�eD�뤾�L+%�eY;b��N����a�1���ޖ�)�һ�o��Z�S��j�r���|�P���7��i�Ѓ��h�A!�{�Yo��Q?���r� )u/����pmܣO���;Z�7�7y�^T��H���S4�3^��ql�c�IEND�B`�PK�X�r�:{{
korben.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1318619728(BasicNewsRecipe):
    title = u'Korben'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Korben', u'http://feeds2.feedburner.com/KorbensBlog-UpgradeYourMind')]

    def get_masthead_url(self):
        masthead = 'http://korben.info/wp-content/themes/korben-steaw/hab/logo.png'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(masthead)
        except:
            self.log("\nCover unavailable")
            masthead = None
        return masthead
PK�X�t["uukorea_herald.png�PNG


IHDR%=m"PLTE�����z��tRNS@��fIDAT[c\����b\�˸�
�� U�w!~L5�IEND�B`�PK�X=���korea_herald.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Seongkyoun Yoo <Seongkyoun.yoo at gmail.com>'
'''
Profile to download KoreaHerald
'''
from calibre.web.feeds.news import BasicNewsRecipe


class KoreaHerald(BasicNewsRecipe):
    title = u'KoreaHerald'
    language = 'en'
    description = u'Korea Herald News articles'
    __author__ = 'Seongkyoun Yoo'
    oldest_article = 15
    recursions = 3
    max_articles_per_feed = 15
    no_stylesheets = True
    keep_only_tags = [
        dict(name='h1', attrs={
                'class':'title_sec'}),
        dict(name='h4', attrs={
                'class':'stitle_sec'}),
        dict(id='articleText')
    ]

    feeds = [
        ('National', 'http://www.koreaherald.com/rss/020100000000.xml'),
        ('Business', 'http://www.koreaherald.com/rss/020200000000.xml'),
        ('Life&Style', 'http://www.koreaherald.com/rss/020300000000.xml'),
        ('Entertainment', 'http://www.koreaherald.com/rss/020400000000.xml'),
        ('Sports', 'http://www.koreaherald.com/rss/020500000000.xml'),
        ('Opinion', 'http://www.koreaherald.com/rss/020600000000.xml'),
        ('English Cafe', 'http://www.koreaherald.com/rss/021000000000.xml')
    ]
PK�X�bllkosmonauta_pl.png�PNG


IHDR��h63IDATx�cP2�ObbQ�������3�r��f*�ϗ7Y ���Ou
��z^��š+����,f�51[�)i��_}5��ש3{��b?in`A}�{t��̆��>�fK�͖I�/a��h������S��}�J빕�
j��1\���j!h�
h)������3�/`��,��B�d!��f �`e�-f��C~Cis�<���8�WH�͕3���31�H�lT���!��r���g�P\� ��%|�c�n��j�{L=�	�OW0�i��,���%��"N��"������7�Z�񗮾r�5g 4�/d�4�A`���b��w�?{�eסG��`ɚ���$�Z��;�� �
hP�_�����\�����Ij���,��5W����t&p+�	qu=}��!�x7C+O�����1
������
!��
o���=P��ǩ0En���R�ж��B�N��`/P�;�&�>�&�1��&�t���d���!?e�ʫ��_d�g��� ��4�`��� 	��jӁHR6Pлb:�P<M��+4=�IEND�B`�PK�Xe�,��kosmonauta_pl.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

from calibre.web.feeds.news import BasicNewsRecipe


class Kosmonauta(BasicNewsRecipe):
    title = u'Kosmonauta.net'
    __author__ = 'fenuks'
    description = u'polskojęzyczny portal w całości dedykowany misjom kosmicznym i badaniom kosmosu.'
    category = 'astronomy'
    language = 'pl'
    cover_url = 'http://bi.gazeta.pl/im/4/10393/z10393414X,Kosmonauta-net.jpg'
    no_stylesheets = True
    oldest_article = 7
    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['style']
    max_articles_per_feed = 100
    feeds = [(u'Kosmonauta.net', u'http://www.kosmonauta.net/feed')]

PK�X\�E���
kotaku.png�PNG


IHDR(-SPLTE�����������Z��JIDATx���
��@;�k�J|�ON>+9�j`sA%�6yRW(okw�e�j\J\q�j�X+^��|Y��w�<B�IEND�B`�PK�XU�2}}
kotaku.recipe__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
kotaku.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Kotaku(BasicNewsRecipe):
    title = 'Kotaku'
    __author__ = 'NA'
    description = "Kotaku, the Gamer's Guide."
    publisher = 'kotaku.com'
    category = 'news, games, Internet, xbox 360, playstation 3, tips and tricks'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = True
    language = 'en'
    masthead_url = 'http://cache.gawkerassets.com/assets/kotaku.com/img/logo.png'
    extra_css             = '''
    body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
    img{margin-bottom: 1em}
    h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
                  '''
    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Articles', u'http://feeds.gawker.com/kotaku/vip?format=xml')]

    remove_tags = [
        {'class': 'feedflare'},
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X&v����kp.png�PNG


IHDR:����IDATx�1+���}}pXJ&�f�?H�`��`6*��*����,V���dU,���U���.�^�y��
���T���)U)~o��NG$�|^�?�l���P�>w_;[��F���pfo��,j~%~omAJ�|�3ur��"�X��?X�u?Z�Z��U�K�����	�UQP��@��B ���D�h�<�IEND�B`�PK�X�����	kp.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class KrytykaPolitycznaRecipe(BasicNewsRecipe):
    __author__ = u'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'
    version = 1

    title = u'Krytyka Polityczna'
    category = u'News'
    description = u' Lewicowe pismo zaangażowane w bieg spraw publicznych w Polsce.'
    cover_url = ''
    masthead_url = 'https://krytykapolityczna.pl/file/2015/09/krytyka-logo.png'
    remove_empty_feeds = True
    no_stylesheets = True
    oldest_article = 7
    max_articles_per_feed = 50
    recursions = 0

    simultaneous_downloads = 3

    keep_only_tags = [(dict(name='h1')),
       (dict(name='div', attrs={'class': ['entry-meta','post-preview','entry-details', 'entry-content']}))]

    remove_tags = [(dict(attrs={'class': ['_ning_zone_inner','book-item site-commerc','wp-embedded-content',
                    'read-also','meta-date-modified updated', 'textwidget']}))]

    feeds = [('Wszystkie', 'https://www.krytykapolityczna.pl/rss')]
PK�X���Ɏ�krebs_on_security.png�PNG


IHDR�aUIDATx�폁�0D�'�_�A�)�9�mNA�>����`/�����,r�"�TU��Z\�2S��m֫/����n���_.��\��ӹIEND�B`�PK�X��{krebs_on_security.recipe__license__ = 'GPL v3'
__copyright__ = 'Jelle van der Waa <jelle@vdwaa.nl>'

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 KrebsOnSecurity(BasicNewsRecipe):

    title = u'Krebs on Security'
    publisher = u'Brian Krebs'
    __author__ = 'Jelle van der Waa'
    description = 'In-depth Security news and investigation'
    category = 'security, news'
    cover_url = 'http://krebsonsecurity.com/wp-content/themes/krebsads/krebsads/images/header.jpg'
    oldest_article = 14
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    keep_only_tags = [
        classes('entry-header entry-content entry-meta')
    ]
    remove_attributes = ['width', 'height']
    feeds = [(u'Krebs on security', u'http://feeds.feedburner.com/KrebsOnSecurity')]
PK�X��%��kresy_pl.png�PNG


IHDR�atIDATx�e��iǿ�m۶�۶m'��v2�����^����9��{�a�_M�i-�ŝ�����.X$Տ%�)�̙+��8�_n#� �O����[��8k�#FV(~�ԙYm�A�c��Cc���6�O?�nȰ�����:�A�W�mk׏W��c������d3#Z˱����e�X��s�C?|D����(������!��_�4M�Ï]X����߮�_������ڻ���ٝ_h
�)��<�Nl��HY4�q¤2l�3�T����\AV�`Z$��k���IJ-!�,������B����n_.�_�T��8�lf�ն~�q:P[T�(��d�A
��9���CGv`��=}�2�o�,V��CP,�˂E�>�'�ѓO���@��3���^@E�#$�7}����.^�"��s$�������=B�'O/��l�}��,�	u���:\଒Uk8�}�"$��?��NX��b�3O��/�Ym�#�ð̞k�oݶG?lx�:+�U�c����ܵ������$�V�8�3Ī�T�ō@:��s/z(	��@��c���N�
v!�>]���Y�r��E��_R��nCr���*=��0fl@��W��w)ø�>,�h]��8-'�q�^��̹�����M�L҉[M��]F��o�&�>����2��%Q�����a�.�o2�S��������(��w�l
V������%y��?��B������>;�>�d������$M���Nz<�}!����L���dq4�y�o�mDE�4cB��e&�V��L�)��_��/����_[XԯJM���4eZ9�<�}B�?+��
�,B����3Ŧ����[�x���b��[q������dj���IEND�B`�PK�X���44kresy_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Kresy(BasicNewsRecipe):
    title = u'Kresy'
    __author__ = 'fenuks'
    description = u'portal społeczności kresowej'
    language = 'pl'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    keep_only_tags = [dict(name='div', attrs={'class': ['big-slider big-preview single-big', 'entry-content-wrapper clearfix standard-content']})]
    remove_tags = [dict(attrs={'class': ['entry-footer', 'kresy_donate']})]
    feeds = [(u'Wszystkie', u'https://www.kresy.pl/rss')]
PK�X!,,��kristeligt_dagblad_dk.png�PNG


IHDR(-S�PLTEF�S����S�M�S�&m�2u�N�T�Q� i�L�O�������P�R�Q�U�R�U�X�	Y�b�e�R�#i�#k�R�+p�,q�G�5w�7y�>}�>~�@|�D��W��]��c��k��m��t��|�Ʉ�͞�מ�ح�ݱ����������������������L������J�P����������O�������%g�g�T����8L���IDATx�dN�@�_�Im۶��>�3�c	c��N��.��B��J�Qe,bL��N��#k��X�/�p(u4�L��z8��B}�5�K@�8�]�M��C'T�Ë�Ҩ1P��M�U�,z_�[��m����X��C���9�['D�;.#�[H{
�>�IEND�B`�PK�Xu5$��kristeligt_dagblad_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class KristeligtDagblad(BasicNewsRecipe):
    title          = 'Kristeligt Dagblad'
    language = 'da'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup   = True

    # All feeds are found here: http://www.kristeligt-dagblad.dk/rss
    feeds          = [
        ('Leder', 'http://www.kristeligt-dagblad.dk/rss/leder'),
        ('Danmark', 'http://www.kristeligt-dagblad.dk/rss/danmark'),
        ('Udland', 'http://www.kristeligt-dagblad.dk/rss/udland'),
        ('Liv & Sjæl', 'http://www.kristeligt-dagblad.dk/rss/liv'),
        ('Familieliv', 'http://www.kristeligt-dagblad.dk/rss/familieliv'),
        ('Kronik', 'http://www.kristeligt-dagblad.dk/rss/kronik'),
        ('Kirke & Tro', 'http://www.kristeligt-dagblad.dk/rss/kirke'),
        ('Debat', 'http://www.kristeligt-dagblad.dk/rss/debat'),
        ('Kultur', 'http://www.kristeligt-dagblad.dk/rss/kultur'),
        ('B\xf8ger', 'http://www.kristeligt-dagblad.dk/rss/boganmeldelse'),
        ('Film', 'http://www.kristeligt-dagblad.dk/rss/filmanmeldelse'),
    ]
PK�X����krstarica_en.png�PNG


IHDR(-SPLTE   ��    ##,-6124��123   !  ""!+*/03//4/.5,.6!014  RLTM\U]VaZc\e]f^risjtkukwlt�z�{�|�~���
��
��
��
��
����
��
��	Ʋм�������������������������� ������E�tRNS@��f�IDATx�u���PE?�Զm�6��6��#��rc���'`)fՐ�7���c����mqׂ��(L�Ba�
�)�w^�e�<� m3�⧰$۫ ��i�n��4�s�>�>���j�n�7P�J|���o��.8E�Kp��G�����IEND�B`�PK�X�;j
<<krstarica_en.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
vesti.krstarica.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Krstarica_en(BasicNewsRecipe):
    title = 'Krstarica - news in english'
    __author__ = 'Darko Miletic'
    description = 'News from Serbia and world'
    publisher = 'Krstarica'
    category = 'news, politics, Serbia'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    encoding = 'utf-8'
    language = 'en'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + \
        category + \
        '"\noverride_css=" p {text-indent: 0em; margin-top: 0em; margin-bottom: 0.5em}"'

    feeds = [

    (u'Daily news', u'http://vesti.krstarica.com/index.php?rss=1&rubrika=aktuelno&lang=1'),
    (u'Serbia', u'http://vesti.krstarica.com/index.php?rss=1&rubrika=scg&lang=1'),
    (u'Politics', u'http://vesti.krstarica.com/index.php?rss=1&rubrika=politika&lang=1'),
    (u'Economy', u'http://vesti.krstarica.com/index.php?rss=1&rubrika=ekonomija&lang=1'),
    (u'Culture', u'http://vesti.krstarica.com/index.php?rss=1&rubrika=kultura&lang=1'),
    (u'Sports', u'http://vesti.krstarica.com/index.php?rss=1&rubrika=sport&lang=1')
    ]

    def preprocess_html(self, soup):
        mtag = '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>'
        soup.head.insert(0, mtag)
        titletag = soup.find('h4')
        if titletag:
            realtag = titletag.parent.parent
            realtag.extract()
            for item in soup.findAll(['table', 'center']):
                item.extract()
            soup.body.insert(1, realtag)
            realtag.name = 'div'
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll(align=True):
            del item['align']
        return soup
PK�X�%���ksiazka_pl.png�PNG


IHDR��h6�IDATx��YhSA�3�ͽi�j�M5���������U\P�WiUwK����Q��.�֥iM����͝{g��f�e�;p��@�ܯպK��g��xt#�h��2�2��wo޶
�O����]ʨ�at1�}=�&4���&Y4���{f>7\��lm�踩�v��%��ή��f(`h���w�a�{�7ʵ~����bQ	y�D���!�J�\a4������}�c��l�J�&N���5k�]]���ֿ|����h��t\@���nK�b5�P8,Q4�T:��Ǜ��J�<X�pў�._-d���@(1�M�E���Y2Cvx@��c��q6���-�ŷ�[w� ��
�`9
)�@@��F�e&dHq_׎9z�t+�VR(P�7Q���6�����T3�I��>���d<R ���[ԥO�\�K%���$ŝ]��_�|ij�IF ِT
����9N�8w���sb��)Y�m۶�Z<t��A"56�$
�!3x�m�=&��mmn>s�X,��=�z$(ϓɸ�0��;�?_�=m��ٙ
F⻯f��[7oBN�dH"���\Հ��u�W��_�/�|�ڊu��߼1*=
:�p�J�����}rf�ݹ{��9�iN�y�B[�����I��IȯY62�wcz̒��`يe+��N%R�P��R2$��[c�<\�^IEND�B`�PK�XeC�11ksiazka_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class Ksiazka_net_pl(BasicNewsRecipe):
    title = u'książka.net.pl'
    __author__ = 'fenuks'
    description = u'Portal Księgarski - tematyczny serwis o książkach. Wydarzenia z rynku księgarsko-wydawniczego, nowości, zapowiedzi, bestsellery, setki recenzji. Niezbędne informacje dla każdego miłośnika książek, księgarza, bibliotekarza i wydawcy.'  # noqa
    cover_url = 'http://www.ksiazka.net.pl/fileadmin/templates/ksiazka.net.pl/images/1PortalKsiegarski-logo.jpg'
    category = 'books'
    language = 'pl'
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    preprocess_regexps = [
        (re.compile(u'Podoba mi się, kupuję:'), lambda match: '<br />')]
    remove_tags_before = dict(name='div', attrs={'class': 'm-body'})
    remove_tags_after = dict(name='div', attrs={'class': 'm-body-link'})
    remove_tags = [
        dict(attrs={'class': ['mk_library-icon', 'm-body-link', 'tagi']})]
    feeds = [(u'Wiadomości', u'http://www.ksiazka.net.pl/?id=wiadomosci&type=100'),
             (u'Książki', u'http://www.ksiazka.net.pl/?id=ksiazki&type=100'),
             (u'Rynek', u'http://www.ksiazka.net.pl/?id=rynek&type=100')]

    def image_url_processor(self, baseurl, url):
        if (('file://' in url) and ('www.ksiazka.net.pl/' not in url)):
            return 'http://www.ksiazka.net.pl/' + url[8:]
        elif 'http://' not in url:
            return 'http://www.ksiazka.net.pl/' + url
        else:
            return url
PK�X]�LL	kstar.png�PNG


IHDR�aIDATx�m�ma�������v YH��� I$��*
J*)R$	�*Q��
�$��Yv����]3(�S����s�9�
#�H�=y�ܴ�&լ��)��y���k�OF�ۿ�*69yj�E����	�
@JA�V�44"��R!��hoCzh��7��;�:���(VR�i���5RI��yC��E�G��u��˧�s��ʈaW��id�9����߸�2G�.���S����{!��57b;����$�u���ݓ\�Ƈ\=Gy.����K�B�r���_�W�_i�_�X=y$�{wG6��u�6�F��I���C3��grE?�F�30���S(՚�
�=�Щ]��kg���v���[N�$c[T�y_0g�E�	�γy�v-�H<ϥ^o��F�Q^��¢�x���$X��R��x��>z���vp��}�V�|>O�G�b.˺Cg�d���xM�a��$���������Go�����1Nǘ�]w�q��Ib��b����o�|@U��ԝ3ǁ.�s�&7�}�w�4��
�V�"����=!���B�e�GѵK[f�:˅��=�qA���y��ZiH�UYy��G��T���8l�2�or\��	-��l��cx���ڳ<f`��	4��E��iK$�%_?�F(Ul��G�k{|ϣ�r�u+�M�S�&�h�;7�9/�]{��ãK����JH)���!���W>�P��B�'��f�L�x���3��u��_>�G����f�0������NaW�3�IEND�B`�PK�X��t{{kstar.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1282101454(BasicNewsRecipe):
    title = 'Kansas City Star'
    language = 'en'
    __author__ = 'TonytheBookworm'
    description = 'www.kansascity.com feed'
    publisher = 'Tony Stegall'
    category = 'news, politics, USA, kansascity'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    auto_cleanup = True

    masthead_url = 'http://media.kansascity.com/images/site_logo_340x60.gif'

    feeds = [
        ('kansascity.com', 'http://www.kansascity.com/?widgetName=rssfeed&widgetContentId=6199&getXmlFeed=true'),

    ]
PK�X0o|��
kudika.png�PNG


IHDR(-S�PLTE���������������������������������������ܾ�Զ�Բ�̦�̦�Ě�ĒĴv��r��f��j��f��b��^��V��J��F��:��:��6��2��.��*��*��&��"����������������
�|
�|�|�t|-�K�tRNS@��f�IDATx]�KJCAD�Su� 
G�W�Tp���KЙ����d�������m�ap|<��g�2@�MǼ��`H`#[�zBQi@}����S��`,��"��E���j�����׽����>-V����W��h`\� yW��m��^.�GD	�MS�9��>IEND�B`�PK�X�f���
kudika.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
kudika.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Kudika(BasicNewsRecipe):
    title = u'Kudika'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Revist\u0103 pentru femei'
    publisher = 'Kudika'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Femei'
    encoding = 'utf-8'
    cover_url = 'http://img.kudika.ro/images/template/page-logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'header_recommend_article'}),
        dict(name='div', attrs={'id': 'intertext_women'})
    ]

    remove_tags = [
        dict(name='p', attrs={'class': ['page_breadcrumbs']}), dict(name='div', attrs={
            'class': ['standard']}), dict(name='div', attrs={'id': ['recommend_allover']})
    ]

    feeds = [(u'Feeds', u'http://www.kudika.ro/feed.xml')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X̞�00kudy_z_nudy.png�PNG


IHDR�a�IDATxڔ��[��y�n�Զmۈ��v�Զm۶m�=�9��}m�d��2kKd�\�K���8��Z|W;!�>�G�k�w��#A�
���y��\�+�8K�Zgdq�?G����3�5N}� ���62�j���|`!7�r[A�-�������H�X?uk�ĵ�W;2�r�Ŷ@�ibW����}ߠ��y�q�Z�_=E�n��	m��=���H��}X���^��K���;��/�����>���@׌��4e�����j�̷�~0��Q�R|q0Ef��Ġ��o�>}��+xe7��/[t���6mS�?RL#fp��<~g�n��a�N���:�P	@��������Ɓ�K⇜!�����c�E\;�,VE��"�Q��&sF��X��xʎ��u�2���RC �P������٭g��>��e�Lr��sm���įPe���g��1�Ud��l�71H)i�T1��IEND�B`�PK�X���zzkudy_z_nudy.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class kudyznudyRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Kudy z nudy'
    publisher = u''
    description = 'kudyznudy.cz'
    oldest_article = 3
    max_articles_per_feed = 20
    use_embedded_content = False

    feeds = [
        (u'Praha nejnovější',
         u'http://www.kudyznudy.cz/RSS/Charts.aspx?Type=Newest&Lang=cs-CZ&RegionId=1')
    ]

    language = 'cs'
    cover_url = 'http://www.kudyznudy.cz/App_Themes/KzN/Images/Containers/Header/HeaderLogoKZN.png'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                            """

    remove_attributes = []
    remove_tags_before = dict(
        name='div', attrs={'class': ['C_WholeContentPadding']})
    remove_tags_after = dict(
        name='div', attrs={'class': ['SurroundingsContainer']})
    remove_tags = [dict(name='div',   attrs={
                        'class': ['Details', 'buttons', 'SurroundingsContainer', 'breadcrumb']})]

    keep_only_tags = []
PK�X�����kukuburi.png�PNG


IHDR�aeIDATxڄ�C��K@��v϶c{۶9Fc۶g�ݱm�c�89�/��w6Uu}�r�Er|
�G��xr�cչ�j�X4��p
Cm�H\�s7Pr|�0
�&rLY�
��^e���,�N]�12^*�0,��߄x�j��Tv�豉Dy
$NJ�ܷ��w�<��.*|j(_R�E��i$�[�����A�a׹qh<d��!jQ�J;�:1��¡4 F���0xXf^EMP#�>I8-.._�����2+%f\��R�$;>���)$OΦ.�B�H�|�k���e9z�Y�Q�#�	�G�߀f�	��A�i9���	EQӆL�Qj��͛H�T�)\P�b��a1F$1��q,�o*�}��P���]{�Z�h��Dʩ3�IY�)��4�nCY�����A[��j1����{�Q�)�����p�s1u��-QĘ�Ih��L����NVDM�*V$[ع~��ڍkl\��BU	�AVlZ����c�1�D3>�Ԩ"������g8��8�"��/���r�9yр�$jT�3�����V�Kz}ŻDҀ�ə4���9�͛h�Ā�.�z�;w�ο�U��t��E
K�:�L�z���Amj��0;����WI^IEND�B`�PK�X�_**kukuburi.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'Mori'
__version__ = 'v. 0.1'
'''
Kukuburi.com
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re


class KukuburiRecipe(BasicNewsRecipe):
    __author__ = 'Mori'
    language = 'en'

    title = u'Kukuburi'
    publisher = u'Ramón Pérez'
    description = u'KUKUBURI by Ram\xc3\xb3n P\xc3\xa9rez'

    no_stylesheets = True
    remove_javascript = True

    oldest_article = 100
    max_articles_per_feed = 100

    feeds = [
        (u'Kukuburi', u'http://feeds2.feedburner.com/Kukuburi')
    ]

    preprocess_regexps = [
        (re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
        [
            (r'<!--.*?-->', lambda match: ''),
            (r'<div class="feedflare".*?</div>', lambda match: '')
        ]
    ]
PK�X1j,��
kurier.png�PNG


IHDR��h6bIDATxڔ�A
�@��������f\��L/P�
��BGH� �Ts����@�^:�ᛟ���o��E�J��3�3��u�8"c@�R����^�
���}w�㶝F�ܖ�ܲ�e	�D�l�W$�9��W�=��z^#�TUA6����&�3��eY.as¬�QQ@�i�)�s��8ξ�1[�� � TiZ�1�X�w(%	�!|w���˃|�b�D��/N		I!
��,�<oi���Ǹ�O��j8#'���
'88�00|Z�
�}ZZv���4v��A�m;��{("!��߾�	=�p
�ƁGӛ��g��O���E^M�x����"�HD�AoJ��$IEND�B`�PK�X��
kurier.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function

__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'

'''
kurier.at
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Kurier(BasicNewsRecipe):
    title = 'Kurier'
    __author__ = 'Darko Miletic'
    description = 'News from Austria'
    publisher = 'KURIER'
    category = 'news, politics, Austria'
    oldest_article = 2
    max_articles_per_feed = 100
    timeout = 30
    no_stylesheets = True
    use_embedded_content = False
    language = 'de_AT'
    remove_empty_feeds = True
    publication_type = 'newspaper'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [
        ('Politik', 'http://kurier.at/politik/xml/rss'),
        ('Wirtschaft', 'http://kurier.at/wirtschaft/xml/rss'),
        ('Chronik', 'http://kurier.at/chronik/xml/rss'),
        ('Kultur', 'http://kurier.at/kultur/xml/rss'),
        ('Leben', 'http://kurier.at/leben/xml/rss'),
        ('Menschen', 'http://kurier.at/menschen/xml/rss'),
        ('Sport', 'http://kurier.at/sport/xml/rss')
    ]

    keep_only_tags = [
        dict(name='article', attrs={'class': re.compile('main-article')})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'social-media-container'}),
        dict(name='section', attrs={'class': 'tags'}),
        dict(name='section', attrs={'class': re.compile('comment-box')}),
        dict(name='section', attrs={'class': re.compile('related-content')}),
        dict(name='section', attrs={'class': re.compile('article-slider')}),
        dict(name='section', attrs={'class': re.compile('commentcontainer')}),
        dict(name='blockquote')
    ]

    remove_attributes = ['width', 'height']

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�Xbs�!!kurier_lubelski.png�PNG


IHDR(-SfPLTE���f�@������������$0��p�����U[P��`��h�a����~�Ȇ��������������Ȏ������ y��8?�!-g�Ҳ/H�8Zt��vIDATx�e�Ł�@�P˞�v?3�_d���;I����v���
�p�(n�p��`�9���������&��Ѵ����B�4��W	@����]nm"x�7(�����U/D����<IEND�B`�PK�X�T�q��kurier_lubelski.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class KurierLubelski(BasicNewsRecipe):
    title = u'Kurier Lubelski'
    __author__ = 'fenuks'
    description = u'Gazeta Regionalna Kurier Lubelski. Najnowsze Wiadomości Lublin. Czytaj Informacje Lublin!'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    masthead_url = 'http://s.polskatimes.pl/g/logo_naglowek/kurierlubelski.png?24'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}
    remove_tags_after = dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})
    remove_tags = [dict(id='mat-podobne'), dict(name='a', attrs={
        'class': 'czytajDalej'}), dict(attrs={'src': 'http://nm.dz.com.pl/dz.png'})]

    feeds = [
    (u'Wiadomo\u015bci', u'http://kurierlubelski.feedsportal.com/c/32980/f/533785/index.rss?201302'),
    (u'Region', u'http://www.kurierlubelski.pl/rss/kurierlubelski_region.xml?201302'),
    (u'Sport', u'http://kurierlubelski.feedsportal.com/c/32980/f/533786/index.rss?201302'),
    (u'Kultura', u'http://kurierlubelski.feedsportal.com/c/32980/f/533787/index.rss?201302'),
    (u'Rozmaito\u015bci', u'http://www.kurierlubelski.pl/rss/kurierlubelski_rozmaitosci.xml?201302'),

    (u'Dom', u'http://www.kurierlubelski.pl/rss/kurierlubelski_dom.xml?201302'),
    (u'Serwisy', u'http://www.kurierlubelski.pl/rss/kurierlubelski_serwisy.xml?201302'),
    (u'Motofakty', u'http://www.kurierlubelski.pl/rss/kurierlubelski_motofakty.xml?201302'),
    (u'M\xf3j Reporter', u'http://www.kurierlubelski.pl/rss/kurierlubelski_mojreporter.xml?201302'),
    (u'Praca', u'http://www.kurierlubelski.pl/rss/kurierlubelski_praca.xml?201302')]

    def print_version(self, url):
        return url.replace('artykul', 'drukuj')

    def skip_ad_pages(self, soup):
        if 'Advertisement' in soup.title:
            nexturl = soup.find('a')['href']
            return self.index_to_soup(nexturl, raw=True)

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.prasa24.pl/gazeta/kurier-lubelski/')
        self.cover_url = soup.find(id='pojemnik').img['src']
        return getattr(self, 'cover_url', self.cover_url)
PK�X�f�kurier_poranny.png�PNG


IHDR(-SPLTE���������f��U�wU�3"�|udGIIDATxڍ���0EQ�I����~�r�]����).�f�;����I{���5�p�G�V��\�,��"U�Tz��~�,,IEND�B`�PK�X����	�	kurier_poranny.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class KurierPoranny(BasicNewsRecipe):
    title = u'Kurier Poranny'
    __author__ = 'fenuks'
    description = u'Kurier Poranny | poranny.pl - portal miejski Białegostoku,informacje,wydarzenia'
    category = 'newspaper'
    language = 'pl'
    encoding = 'iso-8859-2'
    extra_css = 'ul {list-style: none; padding:0; margin:0;}'
    INDEX = 'http://www.poranny.pl'
    masthead_url = INDEX + '/images/top_logo.png'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    no_stylesheets = True
    ignore_duplicate_articles = {'title', 'url'}
    use_embedded_content = False

    feeds = [(u'Wszystkie', u'http://www.poranny.pl/rss.xml'),
             (u'Białystok', u'http://www.poranny.pl/bialystok.xml'),
             (u'Bielsk Podlaski', u'http://www.poranny.pl/bielskpodlaski.xml'),
             (u'Czarna Białostocka',
              u'http://www.poranny.pl/czarnabialostocka.xml'),
             (u'Hajnówka', u'http://www.poranny.pl/hajnowka.xml'),
             (u'Łapy', u'http://www.poranny.pl/lapy.xml'),
             (u'Sokółka', u'http://www.poranny.pl/sokolka.xml'),
             (u'Supraśl', u'http://www.poranny.pl/suprasl.xml'),
             (u'Wasilków', u'http://www.poranny.pl/wasilkow.xml'),
             (u'Sport', u'http://www.poranny.pl/sport.xml'),
             (u'Praca', u'http://www.poranny.pl/praca.xml'),
             (u'Kultura', u'http://www.poranny.pl/kultura.xml'),
             (u'Dom', u'http://www.poranny.pl/dom.xml'),
             (u'Auto', u'http://www.poranny.pl/auto.xml'),
             (u'Polityka', u'http://www.poranny.pl/polityka.xml')]

    keep_only_tags = [dict(id='article')]

    def get_cover_url(self):
        soup = self.index_to_soup(
            self.INDEX + '/apps/pbcs.dll/section?Category=JEDYNKI')
        nexturl = self.INDEX + soup.find(id='covers').find('a')['href']
        soup = self.index_to_soup(nexturl)
        self.cover_url = self.INDEX + \
            soup.find(id='cover').find(name='img')['src']
        return getattr(self, 'cover_url', self.cover_url)

    def decode_feedportal_url(self, url):
        link = url.rpartition('l/0L0S')[2][:-12]
        replaces = (('0B', '.'), ('0C', '/'), ('0H', ','),
                    ('0D', '?'), ('0F', '='), ('0A', '0'), ('0I', '_'))
        for t in replaces:
            link = link.replace(*t)
        return 'http://' + link

    def print_version(self, url):
        return self.decode_feedportal_url(url) + '&Template=printpicart'
PK�X����kurier_szczecinski.png�PNG


IHDR�a�IDATx�b�(�N��]A�����m����m�m�۶�g���ٶmە�g�N�oاNMu��t?�Ӫ��J�Q+�t
�ݬ9,�u�{��nQ��?���m��c��.��ẋ��_�tnި�ϫ��U��Ix�z�L庀ը~����-�M������,���p��Y����� ��w�%A��lP��x����k
�s�VWW���2��烟��n�QP��+���fɅ����8�םܜlTVV��0K.�9�];x���1���EܻwF���2y�	�l���R�^���]�Q[[Ú333��(����E:HEƒ8|��zU�v��)&@�~�Q�G��������5TWW�b6��F{{;(++�bP$8V�7h�k1QXYYAKKvlwA��������hmmeQQQ�f��A�[t�:���� ?������<q�����C0::�АLLL`nnׯ_�I��sZu���������ک�I���Oi�#99cc����AggVWW���o/r��ś!8���3(�w���555,���Z
.�����̦!����`�n5�'��2\���Q�Z�RJH������ގ��.,S6a�������	�l�Kȅ�P�6m��OJ[�l���m��m�G0�=�ڪ#6��Md��:b"�f���(��I<Hp����L8�IEND�B`�PK�X�N<vb
b
kurier_szczecinski.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class KurierSzczecinski(BasicNewsRecipe):
    title = u'Kurier Szczeci\u0144ski'
    __author__ = 'fenuks'
    description = u'24Kurier jest portalem Kuriera Szczecińskiego. Zawiera aktualności ze Szczecina oraz wiadomości regionalne z  województwa zachodniopomorskiego.'  # noqa
    category = 'newspaper'
    language = 'pl'
    cover_url = 'http://www.24kurier.pl/Administracja/Img/24kurier_logo-copy-po-zapis'
    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'}

    keep_only_tags = [dict(attrs={'class': 'section'})]
    remove_tags = [dict(attrs={'class': ['Ikonki', 'rek', 'artComments']})]
    remove_tags_after = dict(attrs={'class': 'artComments'})
    feeds = [
    (u'Aktualno\u015bci', u'http://www.24kurier.pl/cmspages/articles_rss.aspx'),
    (u'Kraj', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=kraj'),
    (u'\u015awiat', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=swiat'),
    (u'Sport', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=sport'),
    (u'Kultura', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=kultura'),
    (u'Gospodarka', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=gospodarka'),
    (u'Nauka', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=nauka'),
    (u'Region', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=region'),
    (u'Szczecin', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=szczecin'),
    (u'Bia\u0142ogard', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=bialogard'),
    (u'Choszczno', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=choszczno'),
    (u'Drawsko', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=drawsko'),
    (u'Goleni\xf3w', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=goleniow'),
    (u'Gryfice', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=gryfice'),
    (u'Gryfino', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=gryfino'),
    (u'Kamie\u0144 Pomorski', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=kamien'),
    (u'Ko\u0142obrzeg', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=kolobrzeg'),
    (u'Koszalin', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=koszalin'),
    (u'\u0141obez', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=lobez'),
    (u'My\u015blib\xf3rz', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=mysliborz'),
    (u'Police', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=police'),
    (u'Pyrzyce', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=pyrzyce'),
    (u'S\u0142awno', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=slawno'),
    (u'Stargard', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=stargard'),
    (u'Szczecinek', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=szczecinek'),
    (u'\u015awidwin', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=swidwin'),
    (u'\u015awinouj\u015bcie', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=swinoujscie'),
    (u'Wa\u0142cz', u'http://www.24kurier.pl/cmspages/articles_rss.aspx?dzial=walcz')]
PK�X��|||kyivpost_ar.png�PNG


IHDR  szz�CIDATx�b������Q Z�Ǝ ��xm�l��j�m�Qm۶�m�o��d�2;��O>���B�HE�����4T��Vs����U��_h8.X�zg �qZ1لUh�r����F?��V��i(����x�`��zR-����MH��	0U�y��q�P�駀ڮ`��$�c�h^���q�v{'���tn�W�����؞�t�16/`˜��]U����4&�%��%L�$��JZgks���zR�K�0<�c-�`����;�
��=�F�ߪ���	�!�g�~�-.�
��N��L����ӷH^cO��ъ�wԈ�r<���O�oZ6�d}�_���O�r\2xU7�_�Xp�R��Rz��]^)G��	�*����x��9b-������ ƴ��p�<@�f�8���P�B�Caw�i9��F;`��B�uƧ���ڑWtڧ�!ih�_������H�X�"�Ul��h
_�-��k�r��lPs�kB?9@)�L�`�;:���6Eh*����A�[�ꛡ�.45J�]3u�9��J�~_IEND�B`�PK�X����
�
kyivpost_ar.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class KyivPost(BasicNewsRecipe):
    title = '\u0643\u064A\u064A\u0641 \u0628\u0648\u0633\u062A (Kyiv Post)'
    __author__ = 'bugmen00t'
    description = '\u0643\u064A\u064A\u0641 \u0628\u0648\u0633\u062A \u0647\u064A \u0635\u062D\u064A\u0641\u0629 \u0623\u0648\u0643\u0631\u0627\u0646\u064A\u0629 \u062A\u0635\u062F\u0631 \u0628\u0627\u0644\u0644\u063A\u0629 \u0627\u0644\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629 \u0648\u0647\u064A \u0641\u0627\u0626\u0632\u0629 \u0628\u0645\u064A\u062F\u0627\u0644\u064A\u0629 Missouri Honor 2014 \u0644\u0644\u062E\u062F\u0645\u0629 \u0627\u0644\u0645\u062A\u0645\u064A\u0632\u0629 \u0641\u064A \u0627\u0644\u0635\u062D\u0627\u0641\u0629. \u0635\u062F\u0631\u062A \u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u0645\u0637\u0628\u0648\u0639\u0629 \u0627\u0644\u0623\u0648\u0644\u0649 \u0645\u0646 \u0627\u0644\u0635\u062D\u064A\u0641\u0629 \u0641\u064A 18 \u0623\u0643\u062A\u0648\u0628\u0631 1995\u060C \u0648\u062A\u0645 \u0646\u0634\u0631\u0647\u0627 \u0639\u0644\u0649 \u0627\u0644\u0625\u0646\u062A\u0631\u0646\u062A \u0641\u064A \u0639\u0627\u0645 1997. \u0648\u0643\u0627\u0646 \u062C\u0645\u0647\u0648\u0631\u0647\u0627 \u0627\u0644\u0639\u0627\u0644\u0645\u064A \u064A\u0646\u0645\u0648 \u0628\u0627\u0637\u0631\u0627\u062F \u0645\u0646\u0630 \u0630\u0644\u0643 \u0627\u0644\u062D\u064A\u0646 \u060C \u0648\u0628\u0644\u063A \u0630\u0631\u0648\u062A\u0647 \u0628\u0623\u0643\u062B\u0631 \u0645\u0646 65 \u0645\u0644\u064A\u0648\u0646 \u0645\u0634\u0627\u0647\u062F\u0629 \u0644\u0644\u0635\u0641\u062D\u0629 \u0641\u064A \u0639\u0627\u0645 2014. \u0634\u0639\u0627\u0631 \u0627\u0644\u0635\u062D\u064A\u0641\u0629 \u0647\u0648 \u201C\u0635\u0648\u062A \u0623\u0648\u0643\u0631\u0627\u0646\u064A\u0627 \u0644\u0644\u0639\u0627\u0644\u0645\u201D\u060C \u0648\u0627\u0644\u0630\u064A \u062D\u0644 \u0641\u064A \u0639\u0627\u0645 2018 \u0645\u062D\u0644 \u0627\u0644\u0634\u0639\u0627\u0631 \u0627\u0644\u0633\u0627\u0628\u0642 \u201C\u0627\u0644\u0627\u0633\u062A\u0642\u0644\u0627\u0644. \u062A\u0648\u0627\u0635\u0644 \u0627\u062C\u062A\u0645\u0627\u0639\u064A. \u0627\u0644\u062B\u0642\u0629\u201D. \u0643\u0644\u0627 \u0627\u0644\u0634\u0639\u0627\u0631\u064A\u0646 \u064A\u0639\u0643\u0633\u0627\u0646 \u0627\u0644\u062A\u0632\u0627\u0645 \u0627\u0644\u0635\u062D\u064A\u0641\u0629 \u0628\u0623\u0639\u0644\u0649 \u0627\u0644\u0645\u0639\u0627\u064A\u064A\u0631 \u0627\u0644\u0635\u062D\u0641\u064A\u0629 \u0648\u0627\u0644\u0623\u062E\u0644\u0627\u0642\u064A\u0629.'  # noqa
    publisher = 'BIZNESGRUPP TOV'
    category = 'newspaper'
    cover_url = u'https://www.kyivpost.com/wp-content/themes/kyivpost/assets/img/svg/logo-foot.svg'
    language = 'ar_uk'
    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 20

    remove_tags_before = dict(attrs={'class': 'single-article'})

    remove_tags_after = dict(attrs={'class': 'post-author-block'})

    remove_tags = [
        dict(attrs={'class': 'post-label-and-topic'}),
        dict(attrs={'class': 'sidebar-start'}),
        dict(attrs={'class': 'correction'}),
        dict(attrs={'id': 'correction'}),
        dict(attrs={'class': 'ad_between_paragraphs'}),
        dict(attrs={'id': 'insert-post-by-topic'})
    ]

    feeds = [(
        '\u0627\u0644\u0625\u062E\u0628\u0627\u0631\u064A\u0629',
        'https://www.kyivpost.com/ar/feed'
    )]
PK�X��|||kyivpost_en.png�PNG


IHDR  szz�CIDATx�b������Q Z�Ǝ ��xm�l��j�m�Qm۶�m�o��d�2;��O>���B�HE�����4T��Vs����U��_h8.X�zg �qZ1لUh�r����F?��V��i(����x�`��zR-����MH��	0U�y��q�P�駀ڮ`��$�c�h^���q�v{'���tn�W�����؞�t�16/`˜��]U����4&�%��%L�$��JZgks���zR�K�0<�c-�`����;�
��=�F�ߪ���	�!�g�~�-.�
��N��L����ӷH^cO��ъ�wԈ�r<���O�oZ6�d}�_���O�r\2xU7�_�Xp�R��Rz��]^)G��	�*����x��9b-������ ƴ��p�<@�f�8���P�B�Caw�i9��F;`��B�uƧ���ڑWtڧ�!ih�_������H�X�"�Ul��h
_�-��k�r��lPs�kB?9@)�L�`�;:���6Eh*����A�[�ꛡ�.45J�]3u�9��J�~_IEND�B`�PK�X��#��kyivpost_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class KyivPost(BasicNewsRecipe):
    title = 'Kyiv Post'
    __author__ = 'bugmen00t'
    description = 'The Kyiv Post is Ukraine\u2019s English-language newspaper. The newspaper\u2019s first print edition came out on Oct. 18, 1995, and went online in 1997. The newspaper\u2019s motto is \u201CUkraine\u2019s Global Voice,\u201D which in 2018 replaced the previous motto of \u201CIndependence. Community. Trust.\u201D Both slogans reflect the newspaper\u2019s commitment to the highest journalistic and ethical standards.'  # noqa
    publisher = 'BIZNESGRUPP TOV'
    category = 'newspaper'
    cover_url = u'https://www.kyivpost.com/wp-content/themes/kyivpost/assets/img/svg/logo-foot.svg'
    language = 'en_UK'
    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 20

    remove_tags_before = dict(attrs={'class': 'single-article'})

    remove_tags_after = dict(attrs={'class': 'post-author-block'})

    remove_tags = [
        dict(attrs={'class': 'post-label-and-topic'}),
        dict(attrs={'class': 'sidebar-start'}),
        dict(attrs={'class': 'correction'}),
        dict(attrs={'id': 'correction'}),
        dict(attrs={'class': 'ad_between_paragraphs'}),
        dict(attrs={'id': 'insert-post-by-topic'})
    ]

    feeds = [('News', 'https://www.kyivpost.com/feed')]
PK�X��|||kyivpost_ua.png�PNG


IHDR  szz�CIDATx�b������Q Z�Ǝ ��xm�l��j�m�Qm۶�m�o��d�2;��O>���B�HE�����4T��Vs����U��_h8.X�zg �qZ1لUh�r����F?��V��i(����x�`��zR-����MH��	0U�y��q�P�駀ڮ`��$�c�h^���q�v{'���tn�W�����؞�t�16/`˜��]U����4&�%��%L�$��JZgks���zR�K�0<�c-�`����;�
��=�F�ߪ���	�!�g�~�-.�
��N��L����ӷH^cO��ъ�wԈ�r<���O�oZ6�d}�_���O�r\2xU7�_�Xp�R��Rz��]^)G��	�*����x��9b-������ ƴ��p�<@�f�8���P�B�Caw�i9��F;`��B�uƧ���ڑWtڧ�!ih�_������H�X�"�Ul��h
_�-��k�r��lPs�kB?9@)�L�`�;:���6Eh*����A�[�ꛡ�.45J�]3u�9��J�~_IEND�B`�PK�X'��c��kyivpost_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class KyivPost(BasicNewsRecipe):
    title = 'Kyiv Post'
    __author__ = 'bugmen00t'
    description = '\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 \u0430\u043D\u0433\u043B\u043E\u043C\u043E\u0432\u043D\u0430 \u0433\u0430\u0437\u0435\u0442\u0430, \u043D\u0430\u0433\u043E\u0440\u043E\u0434\u0436\u0435\u043D\u0430 \u0443 2014 \u0440\u043E\u043A\u0443. \u041F\u0435\u0440\u0448\u0438\u0439 \u0434\u0440\u0443\u043A\u043E\u0432\u0430\u043D\u0438\u0439 \u043F\u0440\u0438\u043C\u0456\u0440\u043D\u0438\u043A \u0433\u0430\u0437\u0435\u0442\u0438 \u0432\u0438\u0439\u0448\u043E\u0432 18 \u0436\u043E\u0432\u0442\u043D\u044F 1995 \u0440\u043E\u043A\u0443, \u0430 \u0432 \u0406\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0432\u0430\u0440\u0456\u0430\u043D\u0442\u0456 Kyiv Post \u0437\u2019\u044F\u0432\u0438\u043B\u0430\u0441\u044C \u0432 1997 \u0440\u043E\u0446\u0456. \u0414\u0435\u0432\u0456\u0437 \u0433\u0430\u0437\u0435\u0442\u0438: \u00AB\u0413\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u0438\u0439 \u0433\u043E\u043B\u043E\u0441 \u0423\u043A\u0440\u0430\u0457\u043D\u0438\u00BB, \u044F\u043A\u0438\u0439 \u0443 2018 \u0440\u043E\u0446\u0456 \u0437\u0430\u043C\u0456\u043D\u0438\u0432 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0456\u0439 \u0434\u0435\u0432\u0456\u0437 \u00AB\u041D\u0435\u0437\u0430\u043B\u0435\u0436\u043D\u0456\u0441\u0442\u044C. \u0421\u043F\u0456\u043B\u044C\u043D\u043E\u0442\u0430. \u0414\u043E\u0432\u0456\u0440\u0430.\u00BB \u041E\u0431\u0438\u0434\u0432\u0430 \u0433\u0430\u0441\u043B\u0430 \u0432\u0456\u0434\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u044C \u0442\u0435, \u0449\u043E \u0443 \u0432\u0438\u0434\u0430\u043D\u043D\u0456  \u0434\u043E\u0442\u0440\u0438\u043C\u0443\u044E\u0442\u044C\u0441\u044F \u043D\u0430\u0439\u0432\u0438\u0449\u0438\u0445 \u0436\u0443\u0440\u043D\u0430\u043B\u0456\u0441\u0442\u0441\u044C\u043A\u0438\u0445 \u0442\u0430 \u0435\u0442\u0438\u0447\u043D\u0438\u0445 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u0456\u0432.'  # noqa
    publisher = 'BIZNESGRUPP TOV'
    category = 'newspaper'
    cover_url = u'https://www.kyivpost.com/wp-content/themes/kyivpost/assets/img/svg/logo-foot.svg'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 20

    remove_tags_before = dict(attrs={'class': 'single-article'})

    remove_tags_after = dict(attrs={'class': 'post-author-block'})

    remove_tags = [
        dict(attrs={'class': 'post-label-and-topic'}),
        dict(attrs={'class': 'sidebar-start'}),
        dict(attrs={'class': 'correction'}),
        dict(attrs={'id': 'correction'}),
        dict(attrs={'class': 'ad_between_paragraphs'}),
        dict(attrs={'id': 'insert-post-by-topic'})
    ]

    feeds = [
        ('\u041D\u043E\u0432\u0438\u043D\u0438', 'https://www.kyivpost.com/uk/feed')
    ]
PK�Xm��TTkyungyhang.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2011, Seongkyoun Yoo <seongkyoun.yoo at gmail.com>'
'''
Profile to download The Kyungyhang
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re


class Kyungyhang(BasicNewsRecipe):
    title = u'Kyungyhang'
    language = 'ko'
    description = u'The Kyungyhang Shinmun articles'
    __author__ = 'Seongkyoun Yoo'
    oldest_article = 7
    max_articles_per_feed = 10
    no_stylesheets = True
    remove_javascript = True

    preprocess_regexps = [
        (re.compile("<div class='ad_movFocus'.*</html>",
                    re.DOTALL | re.IGNORECASE), lambda match: '</html>'),
    ]

    keep_only_tags = [
        dict(name='div', attrs={'class': ['article_title_wrap']}),
        dict(name='div', attrs={'class': ['viewHeader']}),
        dict(name='span', attrs={'class': ['article_txt']})
    ]

    remove_tags_after = dict(id={'sub_bottom'})

    remove_tags = [
        dict(name='div', attrs={'class': ['widget_top_dable']}),
        dict(name='div', attrs={'class': ['article_bottom_ad']}),
        dict(name='div', attrs={'class': ['article_date']}),
        dict(name='iframe'),
        dict(id={'TdHot'}),
        dict(name='div', attrs={
            'class': ['btn_list', 'bline', 'linebottom', 'bestArticle']}),
        dict(name='dl', attrs={'class': ['CL']}),
        dict(name='ul', attrs={'class': ['tab']}),
    ]

    feeds = [
        (u'정치',    'http://www.khan.co.kr/rss/rssdata/politic_news.xml'),
        (u'경제',    'http://www.khan.co.kr/rss/rssdata/economy_news.xml'),
        (u'사회',    'http://www.khan.co.kr/rss/rssdata/society_news.xml'),
        (u'세계',    'http://www.khan.co.kr/rss/rssdata/kh_world.xml'),
        (u'스포츠',  'http://www.khan.co.kr/rss/rssdata/kh_sports.xml'),
        (u'문화',    'http://www.khan.co.kr/rss/rssdata/culture_news.xml'),
        (u'연예',    'http://www.khan.co.kr/rss/rssdata/kh_entertainment.xml'),
        (u'IT',      'http://www.khan.co.kr/rss/rssdata/it_news.xml'),
        (u'오피니언', 'http://www.khan.co.kr/rss/rssdata/opinion_news.xml'),
    ]
PK�X��	Nl_espresso.png�PNG


IHDR  D���%PLTE������*������*����������)�)��-�.6�(�(�)�+�/�-�'��!����@L�%��'�&�'������%�,�=?�?F� .�"/�'�y��|��18����������8<�.;�/6�KP�1�<@��6B�7B�>H�?I�14�WZ�Zb�pw�5A�<J�GR�DK�HN�MO�NV�Y]�W[�YY�^a��(�(�	�~���僆吏抎掐疗蓘覩�	�
����(��X[�ae��.8��;B�1@�>E���1=�9G�:D�4@�
�*�)�	��)�>H�DP�EQ�FK�FL�FM�FQ�FR�GP�HS�S\�S^�Zd�y}�{���%-�BI�+�-���.�/� �CJ�0�,�NS�%��(4餧ꛜ괷쬯챴췺칹����������������������������������)1�)5����������+3�,7����-?�)&�/0a�=�IDATxڼ�Ú$Q@�tf�۶�i۶m�_۶�zes�g�_K4*p
�m�޽T��}������}��8�)�Tq��!
Cǰ��~�	�ޑ��˅Tpn����$���~��]��� _��Sx9���fg��L���d8�ϰ��@H�1a���À�g+^1[Fp�(R�l5f��~��C5�F�@�m�%��Z�	�pNy�f0�Ʌ0J�Yd����2g~�7_�hW��=v�>�@-?y
�ȯc#U��
�]�[����n�:�E�h�;��%*)*�^i8����4�-����Ґc5�z p��'�U#�E��5�Z�f�ֺ�����s]���&�����G�.?��c�^���"��h�t���2Z��d���҅�L��7�?��Q�	�IEND�B`�PK�X8��@@l_espresso.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini, Gabriele Marini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.02'
__date__ = '10, January 2010'
__description__ = 'Italian weekly magazine'

'''espresso.repubblica.it'''

from calibre.web.feeds.news import BasicNewsRecipe


class Espresso(BasicNewsRecipe):
    __author__ = 'Lorenzo Vigentini, Gabriele Marini, Krittika Goyal'
    description = 'Italian weekly magazine'

    cover_url = 'http://espresso.repubblica.it/images/logo_espresso.gif'
    title = 'L\'Espresso '
    publisher = 'Gruppo editoriale L\'Espresso'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
#    encoding       = 'cp1252'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 16
    max_articles_per_feed = 100
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        (u'Homepage', u'http://kpm.data.kataweb.it/kpm3eolx/rss/home'),
        (u'Local', u'http://kpm.data.kataweb.it/kpm3eolx/rss/local'),
        (u'Style & Design',
         u'http://kpm.data.kataweb.it/kpm3eolx/rss/style_design'),
        (u'Opinioni', u'http://kpm.data.kataweb.it/kpm3eolx/rss/opinioni'),
        (u'Rubriche', u'http://kpm.data.kataweb.it/kpm3eolx/rss/rubriche'),
        (u'Limes', u'http://temi.repubblica.it/limes/feed/'),
        (u'Chiesa: HomePage',
         u'http://data.kataweb.it/rss/chiesa/homepage/it'),
        (u'Chiesa: Speciali e Focus',
         u'http://data.kataweb.it/rss/chiesa/speciali_e_focus/it')
    ]
PK�XRy�ˇ�l_vivs_ghazieta.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1356270446(BasicNewsRecipe):
    title = u'\u041b\u044c\u0432\u0456\u0432\u0441\u044c\u043a\u0430 \u0433\u0430\u0437\u0435\u0442\u0430'
    oldest_article = 7
    __author__ = 'rpalyvoda'
    max_articles_per_feed = 100
    language = 'uk'
    cover_url = 'http://lvivska.com/sites/all/themes/biblos/images/logo.png'
    masthead_url = 'http://lvivska.com/sites/all/themes/biblos/images/logo.png'
    auto_cleanup = True
    feeds = [
        (u'\u041d\u043e\u0432\u0438\u043d\u0438',
         u'http://lvivska.com/rss/news.xml'),
        (u'\u041f\u043e\u043b\u0456\u0442\u0438\u043a\u0430',
         u'http://lvivska.com/rss/politic.xml'),
        (u'\u0415\u043a\u043e\u043d\u043e\u043c\u0456\u043a\u0430',
         u'http://lvivska.com/rss/economic.xml'),
        (u'\u041f\u0440\u0430\u0432\u043e', u'http://lvivska.com/rss/law.xml'),
        (u'\u0421\u0432\u0456\u0442', u'http://lvivska.com/rss/world.xml'),
        (u'\u0416\u0438\u0442\u0442\u044f',
         u'http://lvivska.com/rss/life.xml'),
        (u'\u041a\u0443\u043b\u044c\u0442\u0443\u0440\u0430',
         u'http://lvivska.com/rss/culture.xml'),

        (u'\u041b\u0430\u0441\u0443\u043d',
         u'http://lvivska.com/rss/cooking.xml'),
        (u'\u0421\u0442\u0438\u043b\u044c',
         u'http://lvivska.com/rss/style.xml'),
        (u'Galicia Incognita', u'http://lvivska.com/rss/galiciaincognita.xml'),
        (u'\u0421\u043f\u043e\u0440\u0442',
         u'http://lvivska.com/rss/sport.xml'),
        (u'\u0415\u043a\u043e\u043b\u043e\u0433\u0456\u044f',
         u'http://lvivska.com/rss/ecology.xml'),
        (u"\u0417\u0434\u043e\u0440\u043e\u0432'\u044f",
         u'http://lvivska.com/rss/health.xml'),
        (u'\u0410\u0432\u0442\u043e', u'http://lvivska.com/rss/auto.xml'),
        (u'\u0411\u043b\u043e\u0433\u0438', u'http://lvivska.com/rss/blog.xml')
    ]
PK�X�OO
la_cuarta.png�PNG


IHDR(-SuPLTE����""�����UU�33�"�33���������3"�3"�ff�""�UU݈��33�wf�ww�ff�"���fU�33�DD�DD�DD����wwe�x�tRNS@��f�IDATx^U���0@��P��?q޲J�}��,+��K��:�mӴ�iVmH0��}�10	��bD!��D[���B����r�q�8/Ou��.��U?X2��=Y��!��ȡ���.(u�T��HB%��IEND�B`�PK�Xj�ڸccla_cuarta.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
lacuarta.cl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LaCuarta(BasicNewsRecipe):
    title = 'La Cuarta'
    __author__ = 'Darko Miletic'
    description = 'La Cuarta Cibernetica: El Diario popular'
    publisher = 'CODISA, Consorcio Digital S.A.'
    category = 'news, politics, entertainment, Chile'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'cp1252'
    remove_javascript = True

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    keep_only_tags = [dict(name='div', attrs={'class': 'articulo desplegado'})]

    remove_tags = [
        dict(name='ul'), dict(name='div', attrs={'id': ['toolbox', 'articleImageDisplayer', 'enviarAmigo']}), dict(name='div', attrs={'class': [
            'par ad-1', 'par ad-2']}), dict(name='input'), dict(name='p', attrs={'id': ['mensajeError', 'mensajeEnviandoNoticia', 'mensajeExito']}), dict(name='strong', text='PUBLICIDAD')  # noqa
    ]

    def preprocess_html(self, soup):
        mtag = '<meta http-equiv="Content-Language" content="es-CL"/>'
        soup.head.insert(0, mtag)
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    feeds = [(u'Noticias', u'http://lacuarta.cl/app/rss?sc=TEFDVUFSVEE=')]

    language = 'es_CL'
PK�X�&<s��la_gazetta_del_mezzogiorno.png�PNG


IHDR  ��tRNSn��DIDATxڍVpM�1f��ݽ����������-���G���TB��z�K�!�q��M	��y찻o�wOw���o��h4�iǎ�g͚�l����W̞=�K���
N��?����g��.��DQ&�q�>\�paȐaDR��?(?��3h�@ëWJ����߾}7bĈ��i/Z�X���(%{�7���{EQ%Y
� A1C�����e��A6�֪��w��[�a��4���~s����/'��,+�`���M-Z���,U�V�KI���E�7R:�!OۄG���jmܪ�6h|���^vSR�F��b 8����_�ؘ+f�ɨ
3ߦ]
諷WF[�9ͧ�d
$�E�Ŝ��=}ZP�������~� ��}q���d(X�4_�+W���ޭ{OE���9��4\�3��dI��^���� -+Æ
���>�F���C�HN����L�T��d�U]��/��W�^g�S�f-<����|>��C��#J�JV��s�.�u�7bϖ�kp:�����"�k^s������벜�]�d|���h�r�pe�ӅQ�>��1.]�v��������ݓ�[��b;�|�����\I$ER����
'XM������u��$����(��6��a�Ħg�=��v���퓭n�,ә���a�*,c��N�9�`��dD�ęԝ�jժT���Q�屑_dhѳnYMG,�@��I]�"�z5)7�PF�s��C]?f��y>mР�~<�4�F�1��u��z�DUJG�K��t��=���̚}f�Â�^�$v̜9+�Ϻ��$H�<�:<����/��=�����
Om���G`A0�Ǵi�p�t�T�j	��$�7a&�\������$h)u�EP����`�Ņ�ot�
��bq�s��!T�…��8�aI�[��?�ms|�+�;_9V>�~��\�8��5����>_�]P:��8�F�9L&�f͚(:�1\�����ss�Y����g?����L��Ϳa4�.�;��an0����P��lي9C�x��R]"��?�P�
:6Y�v��~��-�{l�)����"Ժu+�W�0`��
�N�V�h�	��F���bk�CKN��w� x���߈@�2 �xh��ELp��5�i�^l- ���ڠU)���CpJOJ��LZ
��m	�O���Z��8����0f�XҮɅ��q���#����-#�S��9�,�[I��<�jvf��ɏi��=>���A�&�2����t��5C��̎�z�f�{2��>��U��$�ob8�ے�^,2[�tY�J��~Æ
��S �"�����?�1�O�f�In� �P�pА�T�r�l��Oa��W.�nkݶ}~\>x};P�H�[b�"�r� cE��F��4��Q�a��v��K�`�/_!**
��HHY0�������D��S��h���x����+_)�ɥmb,\T��c`̉���c�]���S�Ñ��/����o޼=a„�~���Q'�„���t�ŋ��^��d�R�J���܄C�Z;�~��IEND�B`�PK�X{qjSee!la_gazetta_del_mezzogiorno.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2012, faber1971'
__version__ = 'v1.01'
__date__ = '29, May 2012'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1324038402(BasicNewsRecipe):
    title = u'La Gazzetta del Mezzogiorno'
    language = 'it'
    __author__ = 'faber1971'
    description = 'Italian regional magazine - Apulia'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = False
    masthead_url = 'http://www.lagazzettadelmezzogiorno.it/images/GdM_Nuova_Testata_Interna.gif'
    feeds = [
        (u'Home page', u'http://www.lagazzettadelmezzogiorno.it/rss.php?IDCategoria=1')]
    remove_tags = [
        dict(name='table', attrs={'width': '100%'}),
        dict(name='div', attrs={'style': [
            'text-align:center; padding:5px; background-color:#B51C1F;', 'float:right; margin:0px 0px 4px 7px; border-left:2px dotted #B0CBE6; width:200px;']}),
        dict(name='td', attrs={'colspan': '5'}), dict(name='td', attrs={'width': '300'})
    ]

    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

    remove_javascript = True
    conversion_options = {'linearize_tables': True}
    extra_css = '''
        .font7 {color: #555555; font-family: "Verdana"; font-size: 23px; font-weight: 700; height: auto; text-align: left; text-decoration: none; }
        .font16 { color: #000000; font-family: "Arial"; font-size: 14px; font-weight: 400; text-align: left; }
                '''
PK�X>��I__la_gazzeta_dello_sport.png�PNG


IHDR  D����PLTE   .&"/($=1/=30=31K::K>=K?=L@>LA>LA?LB?LC@LDALEBYHHZIIgPRuY]�dh�il�im�kn�lo�mo�np�oq�pr�qs�rs�tu�vv�wx�ns�sx����y��}�������������������ʙ�˟�ή�ϼ�٢�٥�۳�竹笺筻簽豾������������������������������������������������������������������������������������������������������������������������������������������������������������������������Y�{tRNS@��f0IDAT8OUӽ��U��{~ֻI!M#$X*6v��:`i�!�HK[O��<�(�	b$�L�g,�|�]�̺�b~��s�0�#]���wD�;���~C� 3��
J]Uw��Z���n�:�í�
�ȵ"b����>���ͩ�?r������'�=�$�43��n�&��׳W�e�)r�#o�Z�&�0����s��Y�/ >�?<.�c�UJ<3V�#ֆ{�m����@Rv*=#��+^��/ڌ��wK��̈e`3f&kU��{ڊ�l�I��������Lۥ�����f�AY|�3o�f����b�<2s��8��\�73�`�<���`�4~�G�.�4��f�S���L����Ԛ���o@uiKR�*+��l`����*u+���
/�V�{kW���>�`�C��_*����n�.w3c�y���w�ޯw�ސ��
F}���5p|���]�>�af���g��}V�{a�1Լ�胏_��Ͻ7���+c��93#iW�w.k��r�hu���m�T��9b���!��[@j��L�=~��~�爵�IEND�B`�PK�X���L��la_gazzeta_dello_sport.recipe#!/usr/bin/env python
from __future__ import print_function
__license__   = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.02'
__date__ = '10, January 2010'
__description__ = 'Sport news from the most read sport newspaper in Italy'

'''www.gazzetta.it'''

from calibre.web.feeds.news import BasicNewsRecipe


class laGazzetta(BasicNewsRecipe):
    __author__ = 'Lorenzo Vigentini'
    description = 'Sport news from the most read sport newspaper in Italy'

    cover_url = 'http://www.gazzetta.it/primapagina/images/prima_pagina_grande.png'
    title = 'La Gazzetta dello Sport '
    publisher = 'RCS Digital'
    category = 'Sport News'

    language = 'it'
    encoding = 'cp1252'
    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

    keep_only_tags = [dict(name='div', attrs={'id': 'articolo'})]

    remove_tags = [
        dict(name='ul', attrs={'id': ['service-toolbar', 'sections-menu']}),
        dict(name='div', attrs={'id': [
             'header', 'rightcol', 'sponsored', 'vxFlashPlayer', 'footer', 'print-box']}),
        dict(name='iframe', attrs={'id': 'mirago-feed'}),
        dict(name='a', attrs={'id': 'commenta-up'}),
        dict(name='cite', attrs={'class': ['signature', 'parag-title']}),
        dict(name='a', attrs={'class': ['last-comment', 'button-bold2']}),
        dict(name=['base', 'object', 'link', 'a', 'script', 'noscript'])
    ]

    extra_css      = '''
                        h1 {font: sans-serif large;}
                        h2 {font: sans-serif medium;}
                        h3 {font: sans-serif small;}
                        h4 {font: sans-serif bold small;}
                        p  {font:10pt helvetica}
                        dd {font:8pt helvetica}
                      '''

    feeds = [
        (u'Calcio', u'http://www.gazzetta.it/rss/Calcio.xml'),
        (u'Formula 1', u'http://www.gazzetta.it/rss/Formula1.xml'),
        (u'Motomodiale', u'http://www.gazzetta.it/rss/Motomondiale.xml'),
        (u'Motori', u'http://www.gazzetta.it/rss/Motori.xml'),
        (u'Ciclismo', u'http://www.gazzetta.it/rss/Ciclismo.xml'),
        (u'Basket', u'http://www.gazzetta.it/rss/Basket.xml'),
        (u'Tennis', u'http://www.gazzetta.it/rss/Tennis.xml'),
        (u'Pallavolo', u'http://www.gazzetta.it/rss/Pallavolo.xml'),
        (u'Vela', u'http://www.gazzetta.it/rss/Vela.xml'),
        (u'Atletica', u'http://www.gazzetta.it/rss/Atletica.xml'),
        (u'Altri Sport', u'http://www.gazzetta.it/rss/Sport_Vari.xml')
    ]

    def print_version(self, url):
        segments = url.split('/')
        basename = '/'.join(segments[:3]) + '/'
        subPath = '/'.join(segments[3:7]) + '/'
        articleURL = (segments[len(segments) - 1])[:-6]
        myArticleSegs = articleURL.split('.')
        myArticle = myArticleSegs[0]
        printVerString = myArticle + '_print.html'
        myURL = basename + subPath + printVerString
        print('this is the url: ' + myURL)
        return basename + subPath + printVerString
PK�Xv�6��la_jornada.png�PNG


IHDR(-S�PLTE����������	��)/�QU盝��$*�������-3�.3�06�28�28�38�49�8=�8=�:?�=B�@E�DI�GL�JO�KO�!�VZ�W\�[`盞�`d�di��%+蠢衣�	�	�*0�+1�����,1�MR���"�#�#�%�fj�gk�jn�lp�mq�qu�rv�tw�x|�y}�z~�|�~��߁�⃆ℇ�≌⊍䏒吓呔㑔敘料癜皝� &�"(�"(�#)硣ꤧꦨ駪챳체�����ソ���������&,������������������(.�������������������
�������������
�¢%tRNS@��f�IDATx�=ʃ�Eк6ƶm۶m�����A!D�>C�8�G���p��]�ߚ)��q�1Q����Y;���
t.;���\�<�f-�������
+h�'c�->2��m\X����{�Q�ٹ~�����#���I</&���A�Ӣ�L��z<��n�H/gSc`F}���l��?��W����^��"h�Mj ��"�ȿ�J>��_��"�)�>,IEND�B`�PK�X\�O��la_jornada.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2012, Darko Miletic <darko.miletic at gmail.com>, Rogelio Domínguez <rogelio.dominguez@gmail.com>'
'''
www.jornada.com.mx
'''

import re
try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode
try:
    from urllib.parse import urlparse, urlunparse, parse_qs
except ImportError:
    from urlparse import urlparse, urlunparse, parse_qs
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class LaJornada_mx(BasicNewsRecipe):
    title = 'La Jornada (Mexico)'
    __author__ = 'Darko Miletic/Rogelio Domínguez'
    description = 'Noticias del diario mexicano La Jornada'
    publisher = 'DEMOS, Desarrollo de Medios, S.A. de C.V.'
    category = 'news, Mexico'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'es_MX'
    remove_empty_feeds = True
    cover_url = strftime("http://www.jornada.com.mx/%Y/%m/%d/portada.pdf")
    masthead_url = 'http://www.jornada.com.mx/v7.0/imagenes/la-jornada-trans.png'
    publication_type = 'newspaper'
    extra_css             = """
                                body{font-family: "Times New Roman",serif }
                                .cabeza{font-size: xx-large; font-weight: bold }
                                .documentFirstHeading{font-size: xx-large; font-weight: bold }
                                .credito-articulo{font-variant: small-caps; font-weight: bold }
                                .foto{text-align: center}
                                .pie-foto{font-size: 0.9em}
                                .credito{font-weight: bold; margin-left: 1em}
                                .credito-autor{font-variant: small-caps; font-weight: bold }
                                .credito-titulo{text-align: right}
                                .hemero{text-align: right; font-size: 0.9em; margin-bottom: 0.5em }
                                .loc{font-weight: bold}
                                .carton{text-align: center}
                                .credit{font-weight: bold}
                                .sumario{font-weight: bold; text-align: center}
                                .text{margin-top: 1.4em}
                                p.inicial{display: inline; font-size: xx-large; font-weight: bold}
                                p.s-s{display: inline; text-indent: 0}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    preprocess_regexps = [
        (re.compile(r'<div class="inicial">(.*)</div><p class="s-s">', re.DOTALL | re.IGNORECASE),
         lambda match: '<p class="inicial">' + match.group(1) + '</p><p class="s-s">')
    ]

    keep_only_tags = [
        dict(name='div', attrs={'class': ['documentContent', 'cabeza', 'sumarios',
                                          'credito-articulo', 'text', 'carton']}), dict(name='div', attrs={'id': 'renderComments'})
    ]
    remove_tags = [
        dict(name='div', attrs={'class': ['buttonbar', 'comment-cont']})]

    feeds = [

    (u'Opinion', u'http://www.jornada.com.mx/rss/opinion.xml'),
    (u'Cartones', u'http://www.jornada.com.mx/rss/cartones.xml'),
    (u'Politica', u'http://www.jornada.com.mx/rss/politica.xml'),
    (u'Economia', u'http://www.jornada.com.mx/rss/economia.xml'),
    (u'Mundo', u'http://www.jornada.com.mx/rss/mundo.xml'),
    (u'Estados', u'http://www.jornada.com.mx/rss/estados.xml'),
    (u'Capital', u'http://www.jornada.com.mx/rss/capital.xml'),
    (u'Sociedad y justicia', u'http://www.jornada.com.mx/rss/sociedad.xml'),
    (u'Ciencias', u'http://www.jornada.com.mx/rss/ciencias.xml'),
    (u'Cultura', u'http://www.jornada.com.mx/rss/cultura.xml'),
    (u'Gastronomia', u'http://www.jornada.com.mx/rss/gastronomia.xml'),
    (u'Espectaculos', u'http://www.jornada.com.mx/rss/espectaculos.xml'),
    (u'Deportes', u'http://www.jornada.com.mx/rss/deportes.xml'),
    (u'Ultimas noticias', u'http://www.jornada.com.mx/ultimas/news/RSS')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def get_article_url(self, article):
        # Get link to original article URL
        rurl = article.get('guid',  None)
        if not rurl:
            # Use the "link" attribute as failover
            return article.get('link', None)
        # Remove "partner" query param
        u = urlparse(rurl)
        query = parse_qs(u.query)
        query.pop('partner', None)
        u = u._replace(query=urlencode(query, True))
        return urlunparse(u)
PK�X�첺�la_nacion_cr.png�PNG


IHDR�a�IDATx�b���?
���;�qr�r��h~۶m۶m��rm۶m��m'Oc{�����}�t��G�x|8�n\.�x���2���������ˣ�����"�l�D<&n�6;n��d2E}}=�4M�����cӸ��tĢ����o_�֑/�@�>cصk^�WBt]���R�x��{�\z�G��ؗ\t�;\rǻ�.W�!�g,�b6��H@]]٬BCC�8���Is���s�}�������=�9�<�)��1#���a��m�vJJJ1�A������D"ū�������>���i���䖧~�ڇ��G�bԄ98	�#���(��K��Gz���������9��ؾ}v��)���f),,$����g�z
����9���Y�b�99��V��ݘ|>�l�a�LeNX�l�q0FB��]7H�!��p_���b��l��(��3��� ���Zv��EDt4�QN߃�[���EU5
�䤐2����KP���q.��λ�#z���[�x�}_r�C߰j���z��#�L<'���_�y�����?:n6�_��	���O�ה�;]��� 2?
`~ OO��'�d��L5�L�=K�(ڡ���+**�HUU�=�*�[qq�qv�K<�WUa��IEND�B`�PK�X�S�2la_nacion_cr.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class crnews(BasicNewsRecipe):
    __author__ = 'Douglas Delgado'
    title = u'La Nacion Costa Rica'
    publisher = 'GRUPO NACION GN, S. A.'
    description = 'Diario de circulacion nacional de Costa Rica. Recipe creado por Douglas Delgado (doudelgado@gmail.com) para su uso con Calibre por Kovid Goyal'  # noqa
    category = 'Spanish, Entertainment'
    masthead_url = 'http://www.nacion.com/App_Themes/nacioncom/Images/logo_nacioncom.png'

    oldest_article = 7
    delay = 1
    max_articles_per_feed = 100
    auto_cleanup = True
    encoding = 'utf-8'
    language = 'es_CR'
    use_embedded_content = False
    remove_empty_feeds = True
    remove_javascript = True
    no_stylesheets = True

    feeds = [
    (u'Portada', u'http://www.nacion.com/rss/'),
    (u'Ultima Hora', u'http://www.nacion.com/rss/latest/'),
    (u'Nacionales', u'http://www.nacion.com/rss/nacional/'),
    (u'Entretenimiento', u'http://www.nacion.com/rss/ocio/'),
    (u'Sucesos', u'http://www.nacion.com/rss/sucesos/'),
    (u'Deportes', u'http://www.nacion.com/rss/deportes/'),
    (u'Internacionales', u'http://www.nacion.com/rss/mundo/'),
    (u'Economia', u'http://www.nacion.com/rss/economia/'),
    (u'Vivir', u'http://www.nacion.com/rss/vivir/'),
    (u'Tecnologia', u'http://www.nacion.com/rss/tecnologia/'),
    (u'Opinion', u'http://www.nacion.com/rss/opinion/')]

    def get_cover_url(self):
        index = 'http://kiosko.net/cr/np/cr_nacion.html'
        soup = self.index_to_soup(index)
        for image in soup.findAll('img', src=True):
            if image['src'].endswith('cr_nacion.750.jpg'):
                return image['src']
        return None

    def get_article_url(self, article):
        url = article.get('guid', None)
        return url

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:30px;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal; font-style:italic; font-size:18px;}
                '''
PK�Xf�	�SSla_nueva.png�PNG


IHDR(-SPPLTE
_�l�k�i�k�i�k�l�h� m�0w�C��m��c�d�!m�j�K��d�e�/w�e�j�K��M��P��R��j���ؤ�ئ�٭������������/v�f�f�b�`�4z�i��i��k��5{�6{�7|�=��@��~���Ȁ�Ʌ�ˈ�̉��i�!n�#n�U��\��^��^��b��f��f��h����p��1x�T��U��4y�#o�s��v��|��F��$o�&q�'q�'q���ߺ�����䌴Δ�і�қ�՟�֠�֡�ע��@��@�� m�i�G��f�)r�+s�+t�������������,u����-u�.v�/v�n>h*�IDATx�m������m�o۶m�h�T��pw���`]5(2D�A��*�2Dž"q�K�uր0
H囯����K����M�Vk��/�]c�*���ݕ.���lHs�Hxv�Љ���;����(����������\�-�,&����2�E<�����C�p"�b���)K=~3��]�IEND�B`�PK�X&����la_nueva.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__author__ = 'Luis Hernandez'
__copyright__ = 'Luis Hernandez<tolyluis@gmail.com>'
description = 'Diario independiente de Asturias - v1.0 - 27 Jan 2011'

'''
www.lne.es
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1294946868(BasicNewsRecipe):

    title = u'La Nueva España'
    publisher = u'Editorial Prensa Iberica'

    __author__ = 'Luis Hernandez'
    description = 'Diario independiente de Asturias'
    cover_url = 'http://estaticos00.lne.es//elementosWeb/mediaweb/images/iconos/logo2.jpg'

    oldest_article = 3
    max_articles_per_feed = 100

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False

    encoding = 'ISO-8859-1'
    language = 'es'
    timefmt = '[%a, %d %b, %Y]'

    keep_only_tags = [
        dict(name='div', attrs={'class': ['noticia_titular', 'subtitulo', 'noticiadd2', 'noticia_texto']}), dict(
            name='div', attrs={'id': ['noticia_texto']})
    ]

    extra_css = ' p{text-align: justify; font-size: 100%} body{ text-align: left; font-family: serif; font-size: 100% } h1{ font-family: sans-serif; font-size:150%; font-weight: 600; text-align: justify; } h2{ font-family: sans-serif; font-size:120%; font-weight: 500; text-align: justify } '  # noqa

    remove_tags_before = dict(name='div', attrs={'class': ['contenedor']})
    remove_tags_after = dict(name='div', attrs={'class': ['fin_noticia']})

    remove_tags = [
        dict(name='div', attrs={'class': ['epigrafe', 'antetitulo', 'bloqueclear', 'bloqueclear_video', 'cuadro_multimedia', 'cintillo2',
                                          'editor_documentos', 'noticiadd', 'noticiadd3', 'noticiainterior', 'fin_noticia']}), dict(name='div', attrs={'id': ['evotos']})  # noqa
    ]

    feeds = [

    (u'Al minuto', u'http://www.lne.es/elementosInt/rss/AlMinuto'),
    (u'General', u'http://www.lne.es/elementosInt/rss/55'),
    (u'Nacional', u'http://www.lne.es/elementosInt/rss/43'),
    (u'Internacional', u'http://www.lne.es/elementosInt/rss/44'),
    (u'Economia', u'http://www.lne.es/elementosInt/rss/45'),
    (u'Deportes', u'http://www.lne.es/elementosInt/rss/47'),
    (u'Campeones', u'http://www.lne.es/elementosInt/rss/65'),
    (u'Sociedad', u'http://www.lne.es/elementosInt/rss/46'),
    (u'Sucesos', u'http://www.lne.es/elementosInt/rss/48'),
    (u'Galeria', u'http://www.lne.es/elementosInt/rss/51'),
    (u'Cultura', u'http://www.lne.es/elementosInt/rss/66'),
    (u'Motor', u'http://www.lne.es/elementosInt/rss/62'),
    (u'Opinion', u'http://www.lne.es/elementosInt/rss/52'),
    (u'Asturias', u'http://www.lne.es/elementosInt/rss/42'),
    (u'Oviedo', u'http://www.lne.es/elementosInt/rss/31'),
    (u'Gijon', u'http://www.lne.es/elementosInt/rss/35'),
    (u'Aviles', u'http://www.lne.es/elementosInt/rss/36'),
    (u'Nalon', u'http://www.lne.es/elementosInt/rss/37'),
    (u'Cuencas', u'http://www.lne.es/elementosInt/rss/38'),
    (u'Caudal', u'http://www.lne.es/elementosInt/rss/39'),
    (u'Oriente', u'http://www.lne.es/elementosInt/rss/40'),
    (u'Occidente', u'http://www.lne.es/elementosInt/rss/41'),
    (u'Mar y Campo', u'http://www.lne.es/elementosInt/rss/63'),
    (u'Ultima', u'http://www.lne.es/elementosInt/rss/50')
    ]
PK�XP�B�99la_pausa_caffe.png�PNG


IHDR��h6IDATU�[LRa�?WA��H�K�k�i�UC*M��=�d[�zlv�z�6�C[��Z�^Z�l��P,+o�4��Kd*��9 p��V/�}��x��l(���A@0.x~ei5!�� �f�\4�AŒ�-�S�ŕ�j�����D�\�.x߿2���0���@:qJە��*�rY�����ϳ�$�����|��N	1�{A[Y�z�AA"��� ��|�0h����ZCe�]���vU�!ݮ���L�9��ތ��C�����9d�:�v��tG5ℵ��9���`|�xCqg�+w����bt�e��3��{�^=�W�����/{�l��z�-�"=��f�ǚ>�Ȅ@(���9����>��~w="��3�Oz��
&�"�+�s�P
��-��;��eU;�@@qaZ�)�rh�0��5���G���rS�T��jLJ�.��Y�r>�+0���t�ܠ"V��*t[34����ōu\L�I�<y�efֵ&�_z\�%�O]u|2'�G���ScyYA��c��=�~ 	��ųN��7�C\mE�6/G�"ϐ�~.��K��k���W�\J����w�٩��B.�[Z�����q�R�M��)�7�!IJq.�+;cb%��I{�N�6
�J$�n<��Jv�si��y}+�ؼ����$�H*c�d�B&�{*�&-#v��Ml�):7?[A�>�JW��ED&�YC�Ƈ��
�!��"Q���""B &�|j�lcii�F�%vD%��d���)��
`T[\�� IEND�B`�PK�XY[���la_pausa_caffe.recipe__version__ = 'v1.0'
__date__ = '13, February 2011'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1329125921(BasicNewsRecipe):
    title = u'La pausa caff\xe8'
    __author__ = 'faber1971'
    description = 'An Italian satirical blog'
    language = 'it'

    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    no_stylesheets = True
    feeds = [(u'La pausa caff\xe8', u'http://feeds.feedburner.com/LapausaCaffe')]
PK�X��fssla_razon_bo.png�PNG


IHDR  I��PLTE�@@���"�G(IDATx�c0``���p�J���	�,B/�<S��N0�	v�'����IEND�B`�PK�XE��!W
W
la_razon_bo.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2011, Darko Miletic <darko.miletic at gmail.com>'
'''
www.la-razon.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LaRazon_Bol(BasicNewsRecipe):
    title = u'La Razón - Bolivia'
    __author__ = 'Darko Miletic'
    description = 'El diario nacional de Bolivia'
    publisher = 'Praxsis S.R.L.'
    category = 'news, politics, Bolivia'
    oldest_article = 1
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'es_BO'
    publication_type = 'newspaper'
    remove_empty_feeds = True
    masthead_url = 'http://www.la-razon.com/static/LRZRazon/images/lrz-logo.png'
    extra_css             = """ body{font-family: Georgia,"Times New Roman",Times,serif}
                                img{margin-bottom: 0.4em; display: block}
                                .meta{font-size: small; font-family: Arial,Helvetica,sans-serif}
                            """
    INDEX = 'http://www.la-razon.com/'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [dict(name='div', attrs={'class': ['pg-hd', 'pg-bd']})]
    remove_tags = [
        dict(name=['meta', 'link', 'form', 'iframe', 'embed', 'object']), dict(
            name='div', attrs={'class': 'bd'})
    ]
    remove_attributes = ['width', 'height']

    feeds = [

    (u'Editorial', u'http://www.la-razon.com/rss/opinion/editorial/'),
    (u'Nacional', u'http://www.la-razon.com/rss/nacional/'),
    (u'Economia', u'http://www.la-razon.com/rss/economia/'),
    (u'Ciudades', u'http://www.la-razon.com/rss/ciudades/'),
    (u'Sociedad', u'http://www.la-razon.com/rss/sociedad/'),
    (u'Mundo', u'http://www.la-razon.com/rss/mundo/'),
    (u'La Revista', u'http://www.la-razon.com/rss/la_revista/'),
    (u'Sociales', u'http://www.la-razon.com/rss/sociales/'),
    (u'Mia', u'http://www.la-razon.com/rss/suplementos/mia/'),
    (u'Marcas', u'http://www.la-razon.com/rss/marcas/'),
    (u'Escape', u'http://www.la-razon.com/rss/suplementos/escape/'),
    (u'El Financiero', u'http://www.la-razon.com/rss/suplementos/financiero/'),
    (u'Tendencias', u'http://www.la-razon.com/rss/suplementos/tendencias/')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def get_cover_url(self):
        soup = self.index_to_soup(self.INDEX)
        lightbox = soup.find(
            'div', attrs={'class': 'lightbox lightbox-frontpage'})
        return lightbox.img['src']
PK�X���o��la_republica.png�PNG


IHDR@@�.OIDATx���Qm�0� 0�@(�B(�@(�P(�@(�@C0�l{�l7K�e��Z�O���%�b�1��c�k`��R�7@��REO���@u�aVe2ƺ��h��>���Izm��uhsTpP�A�/n�#��!�/�_�8�T3��Xp�TS`��>���z�n���Z��  �z��/������
d
 YB^�a����,&�~��"DhA�
=�TQ��Z�2
�5D�&F`
0�-0#�	2rG*����3uy8��5�vw�[��J�@E��
!�G���5A��U�_���C����������WIEND�B`�PK�Xy�x�LLla_republica.recipefrom __future__ import print_function
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini, based on Darko Miletic, Gabriele Marini; minor fixes by faber1971'
__copyright__ = '2009-2012, Darko Miletic <darko.miletic at gmail.com>, Lorenzo Vigentini <l.vigentini at gmail.com>, faber1971'

'''
http://www.repubblica.it/
'''

from calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe


class LaRepubblica(BasicNewsRecipe):
    title = 'La Repubblica'
    __author__ = 'Lorenzo Vigentini, Gabriele Marini, Darko Miletic, faber1971'
    description = 'il quotidiano online con tutte le notizie in tempo reale. News e ultime notizie. Tutti i settori: politica, cronaca, economia, sport, esteri, scienza, tecnologia, internet, spettacoli, musica, cultura, arte, mostre, libri, dvd, vhs, concerti, cinema, attori, attrici, recensioni, chat, cucina, mappe. Le citta di Repubblica: Roma, Milano, Bologna, Firenze, Palermo, Napoli, Bari, Torino.'  # noqa
    masthead_url = 'http://www.repubblica.it/static/images/homepage/2010/la-repubblica-logo-home-payoff.png'
    publisher = 'Gruppo editoriale L\'Espresso'
    category = 'News, politics, culture, economy, general interest'
    language = 'it'
    timefmt = '[%a, %d %b, %Y]'
    oldest_article = 1
    encoding = 'utf8'
    use_embedded_content = False
    no_stylesheets = True
    publication_type = 'newspaper'
    articles_are_obfuscated = True
    temp_files = []
    extra_css               = """
                               img{display: block}
                              """

    remove_attributes = ['width', 'height', 'lang', 'xmlns:og', 'xmlns:fb']

    def get_article_url(self, article):
        link = BasicNewsRecipe.get_article_url(self, article)
        if link and '.repubblica.it/' not in link:
            link2 = article.get('id', article.get('guid', None))
            if link2:
                link = link2
        return link.rpartition('?')[0]

    def get_obfuscated_article(self, url):
        count = 0
        while (count < 10):
            try:
                response = self.browser.open(url)
                html = response.read()
                count = 10
            except:
                print("Retrying download...")
            count += 1
        self.temp_files.append(PersistentTemporaryFile('_fa.html'))
        self.temp_files[-1].write(html)
        self.temp_files[-1].close()
        return self.temp_files[-1].name

    keep_only_tags = [
        dict(attrs={'class': 'articolo'}),
        dict(attrs={'class': 'body-text'}),
        dict(name='p', attrs={'class': 'disclaimer clearfix'}),
        dict(name='div', attrs={'id': 'main'}),
        dict(attrs={'id': 'contA'})
    ]

    remove_tags = [
        dict(name=['object', 'link', 'meta', 'iframe', 'embed']),
        dict(name='span', attrs={'class': 'linkindice'}),
        dict(name='div', attrs={
             'class': ['bottom-mobile', 'adv adv-middle-inline']}),
        dict(name='div', attrs={
             'id': ['rssdiv', 'blocco', 'fb-like-head', 'sidebar']}),
        dict(name='div', attrs={
             'class': ['utility', 'fb-like-button', 'archive-button']}),
        dict(name='div', attrs={'class': 'generalbox'}),
        dict(name='ul', attrs={'id': 'hystory'})
    ]

    feeds = [
        (u'Homepage', u'http://www.repubblica.it/rss/homepage/rss2.0.xml'),
        (u'Cronaca', u'http://www.repubblica.it/rss/cronaca/rss2.0.xml'),
        (u'Esteri', u'http://www.repubblica.it/rss/esteri/rss2.0.xml'),
        (u'Economia', u'http://www.repubblica.it/rss/economia/rss2.0.xml'),
        (u'Politica', u'http://www.repubblica.it/rss/politica/rss2.0.xml'),
        (u'Scienze', u'http://www.repubblica.it/rss/scienze/rss2.0.xml'),
        (u'Tecnologia',
         u'http://www.repubblica.it/rss/tecnologia/rss2.0.xml'),
        (u'Scuola e Universita',
         u'http://www.repubblica.it/rss/scuola_e_universita/rss2.0.xml'),
        (u'Ambiente', u'http://www.repubblica.it/rss/ambiente/rss2.0.xml'),
        (u'Cultura', u'http://www.repubblica.it/rss/spettacoli_e_cultura/rss2.0.xml'),
        (u'Persone', u'http://www.repubblica.it/rss/persone/rss2.0.xml'),
        (u'Sport', u'http://www.repubblica.it/rss/sport/rss2.0.xml'),
        (u'Calcio', u'http://www.repubblica.it/rss/sport/calcio/rss2.0.xml'),
        (u'Motori', u'http://www.repubblica.it/rss/motori/rss2.0.xml'),
        (u'Roma', u'http://roma.repubblica.it/rss/rss2.0.xml'),
        (u'Torino', u'http://torino.repubblica.it/rss/rss2.0.xml'),
        (u'Milano', u'feed://milano.repubblica.it/rss/rss2.0.xml'),
        (u'Napoli', u'feed://napoli.repubblica.it/rss/rss2.0.xml'),
        (u'Bari', u'http://bari.repubblica.it/rss/rss2.0.xml'),
        (u'Palermo', u'feed://palermo.repubblica.it/rss/rss2.0.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(['hgroup', 'deresponsabilizzazione', 'per']):
            item.name = 'div'
            item.attrs = []
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def preprocess_raw_html(self, raw, url):
        return '<html><head>' + raw[raw.find('</head>'):]
PK�XR@����la_rioja.png�PNG


IHDR�a�IDATxڝ��A���F�ն�uԶm[Am�ncֶm{�{��Ϳ��I����d�Zn�M���8|��`���<e�d�=�|y�e��V����]��Kf/9s�1/ؘ���D&�v�ŀ��}m��<p���� �	�m7���ݾz	OЮM[�W��ʢ1�OHzz:�r�d���8���'`�٨L9�C''��^��0(�	�"��ھ��f|�i�ʔ /�,��r���R��~3@Ua�������$C>��pܹ��k���ˤ��x���盷�W�!���e�h���O�ҀiB[�	� �+8n�	��@߳ږ�Zw(s�n�R۶R�!0�y�}%��V��}��Щ�y�:F�9�� �a��A<��&o6Kχ��)J�IEND�B`�PK�X��uA��la_rioja.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.larioja.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LaRioja(BasicNewsRecipe):
    title = 'La Rioja'
    __author__ = 'Arturo Martinez Nieves'
    description = 'Noticias de La Rioja y el resto del mundo'
    publisher = 'La Rioja'
    category = 'news, politics, Spain'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'es'
    remove_empty_feeds = True
    masthead_url = 'http://www.larioja.com/includes/manuales/larioja/include-lariojapapeldigital-zonac-fondocabecera01.jpg'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} .photo-caption{font-size: x-small} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(attrs={'id': 'title'}), dict(attrs={'class': [
            'overhead', 'headline', 'subhead', 'date', 'text', 'noticia_cont', 'desarrollo']})
    ]
    remove_tags = [dict(name='ul')]
    remove_attributes = ['width', 'height']

    feeds = [

    (u'Ultimas Noticias', u'http://www.larioja.com/rss/feeds/ultima.xml'),
    (u'Portada', u'http://www.larioja.com/rss/feeds/portada.xml'),
    (u'Mundo', u'http://www.larioja.com/rss/feeds/mundo.xml'),
    (u'Espana', u'http://www.larioja.com/rss/feeds/espana.xml'),
    (u'Region', u'http://www.larioja.com/rss/feeds/region.xml'),
    (u'Comarcas', u'http://www.larioja.com/rss/feeds/comarcas.xml'),
    (u'Deportes', u'http://www.larioja.com/rss/feeds/deportes.xml'),
    (u'Economia', u'http://www.larioja.com/rss/feeds/economia.xml'),
    (u'Cultura', u'http://www.larioja.com/rss/feeds/cultura.xml'),
    (u'Opinion', u'http://www.larioja.com/rss/feeds/opinion.xml'),
    (u'Sociedad', u'http://www.larioja.com/rss/feeds/sociedad.xml')

    ]
PK�XQ�빛�la_segunda.png�PNG


IHDR  ��tRNSn��	pHYs��;IDATH��V]LRa���v667/��m�nں�+o��R/j�ο!��� "� '���,��lZ���2�4��4Cd"��H���K���5�c�u�w�q�x��}��=�A�EN�e����JO)0����R�,�˓��
a*;1�CF	��������A��Fs8���CIfS��֢�wh��//�Q#��������O-�`=���Dv�Vpk��uŢBUE	�p�J~��(b$� �_��j��<�V�ī��[����������x��G��
��IR�&� 5�cd�B�Y]�����"Y���1�\���NH�d,�s4�cp�M���
f }1��p����swy��^�����e*�[�2��4�l����f5�K3�A$���7QE.R�bV�"��|A��x
�+�k�5��Q_wf�	3Qb�.��^��bY�	J���\4ɡ	�"�q@�yJ[˗�:.	��A�yᜡ��JV0!�Oe�d4�m����k�n�a�o賃X6V�Q�d�&S���2��г"7�JX��pfu9�����'����W_/���4̮��|]�O�$J�bQ$�IE7J�����H��¦�����E���jt5;�#E!u~R%�2p�<H��1�m4��(�;��v�pר˿��J�[m���$AJ.���s1��?b?߸A�}@�h:A%������Z��wt"e>�8�<�bD`��UyG�3������F��)� ���K�u����x~�s�#�]#�6n�<�1���g5��^����~}���?�e{IEND�B`�PK�X���ila_segunda.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
lasegunda.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LaSegunda(BasicNewsRecipe):
    title = 'La Segunda'
    __author__ = 'Darko Miletic'
    description = 'El sitio de noticias online de Chile'
    publisher = 'La Segunda'
    category = 'news, politics, Chile'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'cp1252'
    masthead_url = 'http://www.lasegunda.com/imagenes/logotipo_lasegunda_Oli.gif'
    remove_empty_feeds = True
    language = 'es_CL'
    extra_css = ' .titulonegritastop{font-size: xx-large; font-weight: bold} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    remove_tags_before = dict(attrs={'class': 'titulonegritastop'})
    remove_tags = [dict(name='img')]
    remove_attributes = ['width', 'height']

    feeds = [

    (u'Noticias de ultima hora', u'http://www.lasegunda.com/rss20/index.asp?canal=0'),
    (u'Politica', u'http://www.lasegunda.com/rss20/index.asp?canal=21'),
    (u'Cronica', u'http://www.lasegunda.com/rss20/index.asp?canal=20'),
    (u'Internacional', u'http://www.lasegunda.com/rss20/index.asp?canal=23'),
    (u'Deportes', u'http://www.lasegunda.com/rss20/index.asp?canal=24'),
    (u'Epectaculos/Cultura', u'http://www.lasegunda.com/rss20/index.asp?canal=25'),
    (u'Educacion', u'http://www.lasegunda.com/rss20/index.asp?canal=26'),
    (u'Ciencia y Tecnologia', u'http://www.lasegunda.com/rss20/index.asp?canal=27'),
    (u'Solidaridad', u'http://www.lasegunda.com/rss20/index.asp?canal=28'),
    (u'Buena Vida', u'http://www.lasegunda.com/rss20/index.asp?canal=32')
    ]

    def print_version(self, url):
        rest, sep, article_id = url.partition('index.asp?idnoticia=')
        return u'http://www.lasegunda.com/edicionOnline/include/secciones/_detalle_impresion.asp?idnoticia=' + article_id
PK�X=@�JJ
la_stampa.png�PNG


IHDR(-SxPLTE!(.$(1CKVR\hsz�ux�~�����������������������������������������������������Wz��IDAT�B�0�s�K�nٳ����8�oLs��!��>e�{��}mY� �V׏�A����
�����}a\'�.��t§Ғ�$��_IM�+�4l�b)!Hyes^�'Ȓfk�� ��R�a<>m�cr��&�O�ڧD��d�IEND�B`�PK�X*�,1��la_stampa.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gabriele Marini, based on Darko Miletic'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
__description__ = 'La Stampa 28/12/2012'

'''
http://www.lastampa.it/
'''
from calibre.web.feeds.news import BasicNewsRecipe


class LaStampa(BasicNewsRecipe):

    title = u'La Stampa'
    language = 'it'
    __author__ = 'Gabriele Marini'
    oldest_articlce = 7  # for daily schedule
    max_articles_per_feed = 50
    recursion = 100
    cover_url = 'http://www1.lastampa.it/edicola/PDF/1.pdf'
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True

    conversion_options = {'linearize_tables': True}
    remove_attributes = ['colspan']

    extra_css = ' .boxocchiello2{font-size: small} .catenaccio{font-style: italic} .titoloRub{font-size: xx-large; font-weight: bold } .titologir{font-size: xx-large; font-weight: bold } .sezione{font-weight: bold} '  # noqa

    def get_article_url(self, article):
        link = article.get('links')
        if link:
            return link[0]['href']

    keep_only_tags = [
        dict(attrs={'class': ['boxocchiello2', 'titoloRub', 'titologir', 'autore-girata', 'luogo-girata', 'catenaccio', 'sezione', 'articologirata', 'bodytext', 'news-single-img', 'ls-articoloCorpo', 'ls-blog-list-1col']}),  # noqa
        dict(name='div', attrs={'id': 'corpoarticolo'})
    ]

    remove_tags = [dict(name='div', attrs={'id': ['menutop', 'fwnetblocco']}),
                   dict(
                       attrs={'class': ['ls-toolbarCommenti', 'ls-boxCommentsBlog']}),
                   dict(name='table', attrs={
                        'id': ['strumenti', 'imgesterna']}),
                   dict(name='a', attrs={'class': ['linkblu', 'link']}),
                   dict(name='span', attrs={
                        'class': ['boxocchiello', 'boxocchiello2', 'sezione']})
                   ]
    feeds = [(u'BuonGiorno', u'http://www.lastampa.it/cultura/opinioni/buongiorno/rss.xml'),
             (u'Jena', u'http://www.lastampa.it/cultura/opinioni/jena/rss.xml'),
             (u'Editoriali', u'http://www.lastampa.it/cultura/opinioni/editoriali'),
             (u'Finestra sull America',
                 u'http://lastampa.feedsportal.com/c/32418/f/625713/index.rss'),
             (u'HomePage', u'http://www.lastampa.it/rss.xml'),
             (u'Politica Italia', u'http://www.lastampa.it/italia/politica/rss.xml'),
             (u'ArciItaliana', u'http://www.lastampa.it/rss/blog/arcitaliana'),
             (u'Cronache', u'http://www.lastampa.it/italia/cronache/rss.xml'),
             (u'Esteri', u'http://www.lastampa.it/esteri/rss.xml'),
             (u'Danni Collaterali',
                 u'http://www.lastampa.it/rss/blog/danni-collaterali'),
             (u'Economia', u'http://www.lastampa.it/economia/rss.xml'),
             (u'Tecnologia ', u'http://www.lastampa.it/tecnologia/rss.xml'),
             (u'Spettacoli', u'http://www.lastampa.it/spettacoli/rss.xml'),
             (u'Sport', u'http://www.lastampa.it/sport/rss.xml'),
             (u'Torino', u'http://www.lastampa.it/cronaca/rss.xml'),
             (u'Motori', u'http://www.lastampa.it/motori/rss.xml'),
             (u'Scienza', u'http://www.lastampa.it/scienza/rss.xml'),
             (u'Cultura', u'http://www.lastampa.it/cultura/rss.xml'),
             (u'Scuola', u'http://www.lastampa.it/cultura/scuola/rss.xml'),
             (u'Benessere', u'http://www.lastampa.it/scienza/benessere/rss.xml'),
             (u'Cucina', u'http://www.lastampa.it/societa/cucina/rss.xml'),
             (u'Casa', u'http://www.lastampa.it/societa/casa/rss.xml'),
             (u'Moda', u'http://www.lastampa.it/societa/moda/rss.xml'),
             (u'Giochi', u'http://www.lastampa.it/tecnologia/giochi/rss.xml'),
             (u'Viaggi', u'http://www.lastampa.it/societa/viaggi/rss.xml'),
             (u'Ambiente', u'http://www.lastampa.it/scienza/ambiente/rss.xml')
             ]
PK�X3!�.��la_tercera.png�PNG


IHDR(-S?PLTE'7I���u��(8I�&6H)9J"3EBP`5DUk,;M$4F��P]l%6H-=N���(7IUcsamz��n=ZIDATxڅ�
CAё�-���a��G�`�M��^��?��ȷ�����$��	sX/z�=h:����/u�p���v���X,~xw(hBT-a���IEND�B`�PK�X��/R6	6	la_tercera.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
latercera.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LaTercera(BasicNewsRecipe):
    news = True
    title = 'La Tercera'
    __author__ = 'Darko Miletic and Alex Mitrani'
    description = 'El sitio de noticias online de Chile'
    publisher = 'La Tercera'
    category = 'news, politics, Chile'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    remove_empty_feeds = True
    language = 'es_CL'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    keep_only_tags = [
        dict(name='h1', attrs={'class': ['titularArticulo']}), dict(name='h4', attrs={'class': ['bajadaArt']}), dict(
            name='h5', attrs={'class': ['autorArt']}), dict(name='div', attrs={'class': ['articleContent']})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['boxCompartir', 'keywords']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['keywords']})
    ]

    feeds = [
    (u'La Tercera', u'http://www.latercera.com/app/rss?sc=TEFURVJDRVJB&ul=1'),
    (u'Politica', u'http://www.latercera.com/app/rss?sc=TEFURVJDRVJB&category=674'),
    (u'Nacional', u'http://www.latercera.com/app/rss?sc=TEFURVJDRVJB&category=680'),
    (u'Mundo', u'http://www.latercera.com/app/rss?sc=TEFURVJDRVJB&category=678'),
    (u'Negocios', u'http://www.latercera.com/app/rss?sc=TEFURVJDRVJB&category=655'),
    (u'Santiago', u'http://www.latercera.com/feed/manager?type=rss&sc=TEFURVJDRVJB&citId=9&categoryId=1731'),
    (u'Tendencias', u'http://www.latercera.com/app/rss?sc=TEFURVJDRVJB&category=659'),
    (u'Educacion', u'http://www.latercera.com/app/rss?sc=TEFURVJDRVJB&category=657'),
    (u'Cultura', u'http://www.latercera.com/feed/manager?type=rss&sc=TEFURVJDRVJB&citId=9&categoryId=1453'),
    (u'Entretención', u'http://www.latercera.com/app/rss?sc=TEFURVJDRVJB&category=661'),
    (u'Deportes', u'http://www.latercera.com/app/rss?sc=TEFURVJDRVJB&category=656')
             ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X��Z��la_tribuna.png�PNG


IHDR  ��tRNSn��SIDATxڥVt+[��o۶m�6jc�m+��K^��7����U۶����w�Y͔��f|'g�{���eZf��9��`0��&��/�5��/���!��thF��sQ֜�#~I�=C�à��^���>�K-N�jýׁO�}�ݝʾaf1�@���?�F����6ɞ� }n���-g��<�Sٌw� ��Ӯ�8��f�����v{�$\;;�����{��n>g��j�3��W��10�R�pܦ��Վ���@�㩉��ݟ���l&�����ߧ�3Z��<86�,�X�-�k���aǽ��'1H���O��]
=��l��~:�Y�J5�JvUg�z�p��l�{J<�V�����4�M:B�w�q�~��<�&�ݞw20utb�EVr#�D�7Цޝ��-��Ž�)����$���L��QJ�����TY�1�9f��l��^���(Å唌��\4��Q��"�u�|ԟ�b1G����Zߵ�ԿE�{0����Z�T�&Sk8����g�<g���,� ����Ŧw���F��g����I?�&&B�Ӟ�U�3�`�sHz	��������{9��Y팅e��:���8M���W��݃�Q��v��mDw;I�K[�V_AVy��6Fq@Čz�)H5jVoh��h��������W��ú7�@�g�`b�����\ŏ�rnWF�'�Uc�6	��@�z�~G���k�
�����h�p���-�
�aq:h��G���g#�ha��թٹoy?�@�؞\�D�v�'2���x��czv}
L%����Ly�M��9�d���(D<�,�����:s���]��q�m=�������_��ON�`%1Ӻ�~h�'ӊ�d(c�R
�aڟ��=�,�װ�*�WX�A+$�-	�L�����Ί�v��8��*[��19�/��;����Nƍ6���6�"�!�D䫃�onS��S>�*��*�|�'D�}��֡���e1������L��_���D�=Etb:�w��1|}�;T[��1��M�"	g���=C/�z���~v-B��A�|���]�cLn�"*����d�yuF�NU�#tB���WX��R�4���EN�qB�-]HY
W�������r4�pmi߈�N{�c�"� 0�w��#>W�Y���"B5����^������j\�W����FhK�[Q@�W������	�	P)A�Ñ�}�:��&��W#[�l��Ӌ'gf��A��x�C��O��"@�þIH���B��9/t`�*6�n;.��"���tK~#Sԯ�A��i��T���u�
���c���'��&��Q�#�p!��9�X��/[W�B*IEND�B`�PK�X�&l�1
1
la_tribuna.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__author__ = 'Luis Hernandez'
__copyright__ = 'Luis Hernandez<tolyluis@gmail.com>'
__version__ = 'v1.0'
__date__ = '01 Feb 2011'

'''
http://www.promecal.es/
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1294946868(BasicNewsRecipe):

    title = u'La Tribuna de'
    publisher = u'Grupo PROMECAL'

    __author__ = 'Luis Hernández'
    description = 'Varios diarios locales del grupo PROMECAL'

    oldest_article = 3
    max_articles_per_feed = 50

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False

    encoding = 'utf-8'
    language = 'es'
    timefmt = '[%a, %d %b, %Y]'

    keep_only_tags = [
        dict(name='div', attrs={'id': ['articulo']}), dict(name='div', attrs={
            'class': ['foto']}), dict(name='p', attrs={'id': ['texto']})
    ]

    remove_tags_before = dict(name='div', attrs={'class': ['comparte']})
    remove_tags_after = dict(name='div', attrs={'id': ['relacionadas']})

    remove_tags = [
        dict(name='div', attrs={'id': ['relacionadas']}), dict(
            name='h3'), dict(name='h5')
    ]

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{text-align: left; font-family: serif; font-size: 100%}
                               h1{font-family: sans; font-size:150%; font-weight: bold; text-align: justify;}
                               h2{font-family: sans-serif; font-size:85%; font-style: italic; text-align: justify;}
                               h4{font-family: sans; font-size:75%; font-weight: bold; text-align: center;}
                               img{margin-bottom: 0.4em}
                                """

    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

    feeds = [

    (u'Albacete', u'http://www.latribunadealbacete.es/rss.html'),
    (u'Avila', u'http://www.diariodeavila.es/rss.html'),
    (u'Burgos', u'http://www.diariodeburgos.es/rss.html'),
    (u'Ciudad Real', u'http://www.latribunadeciudadreal.es/rss.html'),
    (u'Palencia', u'http://www.diariopalentino.es/rss.html'),
    (u'Puertollano', u'http://www.latribunadepuertollano.es/rss.html'),
    (u'Talavera de la Reina', u'http://www.latribunadetalavera.es/rss.html'),
    (u'Toledo', u'http://www.latribunadetoledo.es/rss.html'),
    (u'Valladolid', u'http://www.eldiadevalladolid.com/rss.html')
    ]
PK�X]��F,,la_voce.png�PNG


IHDR  ���IDATx^��A����Efɦ$H���U|V�:�l�0�;i0K��&33�m�MZ0=rH��Q������q����C�o7���!�]���ղ�1gBw���v9��_��]Jׯ�����8��H��J���]�/sg�R�@��B_���a��4ͦNΰpV��M��ZK)�"�9���R%���=W����
�� ��
hd�H`t��i���]S��F���$B\�`9�LKA ?Vg����G�0�`��/@`�]�7qp7eW�X�`�m{��L<mB�@)�1\��YUl*��V*�����(pY1K���g:�gڧL�pbz�ϴ5Ѷ.K��m�Z�Cf�Ԫ�n����o�Ȓ�%��M�T��(��VP�Φ!zHI������?|��HĻ���+���u���O���z��E��}��'Riή�q	%�ąO�RK�g�FƜ��謤��R��s��nn^ޏ���)��^/� �izOA		�R��M�C�l��~��p��mo��J呍� �#	�
O��<z���m�G�g�9O9�$a���(-�T}�ɜ��ywK,-Z��w0��淹m���lu]4��d2f�,��wK���J`@5z�H�3	ҙN�B!T���is&��P,!���"I��b��)M�!��*�,	�%,����t�D�1f��??��ڦ4sa{W��^ܬCf�K�^��8��3n��)��2��='8�"0������zP��n�4w�	)�p��4���Z�ϑT�����F!qU�!f8�)�b�")�O���jp呐�4�ƀW*�S�Ü-JN{@���GUk���q���K�
���9�’���'�	%Iq'�a�6@��e]���a�3���{���f^�
B��>�n�b�8͞,E(8*���䊄�E)�S�s-Cݕ���B��nƅR�PDY7��04E�1f�f6�E�z���x&�����_}_e�
��IEND�B`�PK�X��}��la_voce.recipe__license__ = 'GPL v3'
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1324114228(BasicNewsRecipe):
    title = u'La Voce'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    masthead_url = 'http://www.lavoce.info/binary/la_voce/testata/lavoce.1184661635.gif'
    feeds = [(u'La Voce', u'http://www.lavoce.info/feed/')]
    __author__ = 'faber1971'
    description = 'Italian website on Economy - v1.02 (27, December 2012)'
    language = 'it'
PK�XN����lalibre_be.png�PNG


IHDR(-S0PLTE���[r�[e{�e p��,p�J�P��p�����������������*OC�tRNS@��fFIDATxڭ��!ł;�_���/��̃�ԃɐ� c�1Ƹ3#>Bq�i�:!\"���_-t+D����7V�� ��XIEND�B`�PK�X.�r���lalibre_be.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2011, Lionel Bergeret <lbergeret at gmail.com>'
'''
lalibre.be
'''

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class LaLibre(BasicNewsRecipe):
    title = u'La Libre Belgique'
    __author__ = u'Lionel Bergeret'
    description = u'News from Belgium in French'
    publisher = u'lalibre.be'
    category = 'news, Belgium'
    oldest_article = 3
    language = 'fr'
    masthead_url = 'http://www.lalibre.be/img/logoLaLibre.gif'

    max_articles_per_feed = 20
    no_stylesheets = True
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'

    remove_tags_before = dict(name='div', attrs={'class': 'extraMainContent'})
    remove_tags_after = dict(name='div', attrs={'id': 'articleText'})

    remove_tags = [dict(name='div', attrs={'id': 'strongArticleLinks'})]

    feeds = [

    (u'L\'actu', u'http://www.lalibre.be/rss/?section=10'),
    (u'Culture', u'http://www.lalibre.be/rss/?section=5'),
    (u'Economie', u'http://www.lalibre.be/rss/?section=3'),
    (u'Libre Entreprise', u'http://www.lalibre.be/rss/?section=904'),
    (u'Sports', u'http://www.lalibre.be/rss/?section=2'),
    (u'Societe', u'http://www.lalibre.be/rss/?section=12')
    ]

    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

    def get_cover_url(self):
        cover_url = strftime(
            'http://pdf-online.lalibre.be/pdfonline/image/%Y%m%d/llb_%Y%m%d_nam_libre_001.pdf.L.jpg')
        return cover_url
PK�XV�
���lamebook.png�PNG


IHDR�a�IDATx�c<@X��?6��FV�..��E��5�߹��/_{���e	�a6�9�w�˜9y�?�bP� \0�غ�(6=��Rz��qF#�w�W���Orz�xH�e����)3D+�G�';I�izA�?�VcGGU|YIEND�B`�PK�X����lamebook.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class LamebookRecipe(BasicNewsRecipe):
    title = 'Lamebook'
    __author__ = 'atordo'
    description = 'Funny Facebook Statuses, Fails, LOLs and More - The Original'
    cover_url = 'http://www.lamebook.com/wp-content/themes/lamebook/images/h1-new2.png'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = False
    no_stylesheets = True
    remove_javascript = True
    language = 'en'
    use_embedded_content = False
    publication_type = 'blog'
    reverse_article_order = True
    encoding = 'utf-8'

    keep_only_tags = [
        dict(name='div', attrs={'class': 'entry'}), dict(
            name='ol', attrs={'class': 'commentlist'})
    ]

    remove_tags = [
        dict(name='div', attrs={'style': [
             'clear: left; float: left; margin: 0 15px 0 0;', 'float: left; margin: 0 15px 0 0;']})
    ]

    feeds = [('Lamebook', 'http://feeds.feedburner.com/Lamebook')]
PK�X��+��lameuse_be.png�PNG


IHDR  ��tRNSn���IDATxڵV�+;�X 0eX�R�������������������>w�W������}o���ڽ�d�k��&"A�t������
EU����˟j�إ�`S!H����C^���Qؠ-�a��?Yk&Dӱ_�^WE��N�Z�f�غ�$�vA����x6;��BӞݰ�����Y$�$Im��ċw���Y�(�^���{y"�-��">_G�%�}dv��wy	�z��
�qs�"�g7�K�)���J�Y>�+0i��zM�K�����|��(/q2���
�"�'�kJ-�54Gd�^jZ��c��7�qg���ijx�U<�2�W܀}�Ba%�����S	Tz�KHM)����4T�{7����x�}̝�v�<
?�p�����d(1����Ez��Pׅ�-v���ph�1h4��w]kBx	v-V�peW�P�/L�U^��Re���G��V��b�\����?���h��h����9��}7��ҳ��%�Ȥ�i�)"��†|����&�_��횹�u��_�`�4L����w�
��\|5~�z�y��ӡL$��Er�*��rqɑ#��wL�vj��^w=�K��Q�a�ݰ��(�
��+C�Y������*������*!�<ڲ/8�l8X
>�^���1x�C{*H�L���S�p۲�k���,����V%�8��r1z�
|���֨�j�+oB����N���w�@���p	�@ě:���?�O���+KuG~b"<�<2��ީ,Wi��YvU�<:�d���Xov�%��6�
����G�wk��#O���}�bL�j��ǜ��A	��d��N0c&�f�si�PA�d����%���-�0D��05if7��Kn�����3/�b��f��;�/�w9h�Z-=�s@���3YF�Ԡą))Up�&"#�HV���,�E&�>�*�k)HKE3Ѹ�q��2Ņ�%�~����a��豸�^h�w�"#�R*�Ŏ/#N3��J6�	Ǟ��n��w�q�}��f�r>��^�l@Q�bWr��BSK�v5C%�F�MKPL��l_�;�\��p���:O�&�&u���٦Fڵ�b�{}[��bx��ݮ���"��2��I����֬�����w�
�[�w��j�%㻝�����~�����nI}�IEND�B`�PK�X%��q	q	lameuse_be.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2011, Lionel Bergeret <lbergeret at gmail.com>'
'''
lameuse.be
'''

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class LaMeuse(BasicNewsRecipe):
    title = u'La Meuse'
    __author__ = u'Lionel Bergeret'
    description = u'News from Belgium in French'
    publisher = u'lameuse.be'
    category = 'news, Belgium'
    oldest_article = 3
    language = 'fr'
    masthead_url = 'http://www.lameuse.be/images/SPV3/logo_header_LM.gif'

    max_articles_per_feed = 20
    no_stylesheets = True
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'

    keep_only_tags = [
        dict(name='div', attrs={'id': 'article'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'sb-group'}), dict(name='div', attrs={'id': 'share'}), dict(name='div', attrs={'id': 'commentaires'}), dict(name='ul', attrs={'class': 'right liensutiles'}), dict(name='ul', attrs={'class': 'bas liensutiles'}), dict(name='p', attrs={'class': 'ariane'}), dict(name='div', attrs={'class': 'inner-bloc'}), dict(name='div', attrs={'class': 'block-01'})  # noqa
    ]

    feeds = [

    (u'Actualite', u'http://www.lameuse.be/services/fils_rss/actualite/index.xml'),
    (u'Belgique', u'http://www.lameuse.be/services/fils_rss/actualite/belgique/index.xml'),
    (u'Monde', u'http://www.lameuse.be/services/fils_rss/actualite/monde/index.xml'),
    (u'Societe', u'http://www.lameuse.be/services/fils_rss/actualite/societe/index.xml'),
    (u'Faits Divers', u'http://www.lameuse.be/services/fils_rss/actualite/faits_divers/index.xml'),
    (u'Economie', u'http://www.lameuse.be/services/fils_rss/actualite/economie/index.xml'),
    (u'Science', u'http://www.lameuse.be/services/fils_rss/actualite/science/index.xml'),
    (u'Sante', u'http://www.lameuse.be/services/fils_rss/actualite/sante/index.xml'),
    (u'Insolite', u'http://www.lameuse.be/services/fils_rss/magazine/insolite/index.xml'),
    (u'Cinema', u'http://www.lameuse.be/services/fils_rss/culture/cinema/index.xml'),
    (u'Musique', u'http://www.lameuse.be/services/fils_rss/culture/musique/index.xml'),
    (u'Livres', u'http://www.lameuse.be/services/fils_rss/culture/livres/index.xml')
    ]

    def get_cover_url(self):
        cover_url = strftime(
            'http://pdf.lameuse.be/pdf/lameuse_%Y-%m-%d_LIEG_ACTUALITE_1.PDF')
        return cover_url
PK�XƝ����lanacion.png�PNG


IHDR�a�IDATx�eS�]mˏrP��q;vm�k�n���_m۶m۶q�����\&�N����$���G�=!�%��#��y�9�_+r�v��lj��%��}�����:���g��INr�QU�m��[���9lR`��@���Y����:R�k��
�^����O��A�]�ëT�QR
�r�8��G��J���d;��V,p*�
�yw�L�������]�Ѹ��e�6�,A�*��:q��;O�>{+�sw�eK۔r��r�Z�P�&�z��4������=?�2��3_~�F�jO �\Q�T֥'o���r��K��%�y6�o�1��è�~�"Ó��"�.s�\�k\�V�����nruY�4��6�q�22C�qy,��xK�H��<[k%7_����X�Ѕǯ�]�B�{�D�8${�?�������~�j	�!k��2a��:{G�h�y����dÅ{�y�R��i2ʴE�c���v��=+�x��Ǥ<s������]��W�q�M+�䎐Y�g���8�J����|9I-6��ԝ�*+3�Ri�Oʮ��
�;m��l���\��BU+L��
�
���D��M��a�玌nY�(%�y��!z~�q����LƮpJIEND�B`�PK�X�"�K��lanacion.recipe__copyright__ = '2008-2015, Darko Miletic <darko.miletic at gmail.com>'
'''
lanacion.com.ar
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Lanacion(BasicNewsRecipe):
    title = 'La Nacion'
    __author__ = 'Darko Miletic'
    description = "lanacion.com - Informacion actualizada las 24 horas, con noticias de Argentina y del mundo"
    publisher = 'La Nacion S.A.'
    category = 'news, politics, Argentina'
    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False
    auto_cleanup = False
    no_stylesheets = True
    encoding = 'utf8'
    language = 'es_AR'
    publication_type = 'newspaper'
    remove_empty_feeds = True
    masthead_url = 'http://www.lanacion.com.ar/_ui/desktop/imgs/layout/logos/ln-home.gif'
    extra_css             = """
                                h1{font-family: TheSans,Arial,sans-serif}
                                body{font-family: Arial,sans-serif}
                                img{display: block}
                                .firma,.fecha{font-size: small}
                                .epigrafe-columna{font-size: x-small}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['iframe', 'embed', 'object', 'meta', 'link', 'button']), dict(attrs={'id': [
            'herramientas-sociales', 'comunidad', 'ranking-nota', 'footer']}), dict(attrs={'class': ['mas-sobre-tema', 'cinturon-notas floatFix', 'cinturon-notas']})  # noqa
    ]

    remove_tags_before = dict(attrs={'id': 'nota'})
    remove_tags_after = dict(attrs={'class': 'en-esta-nota'})

    feeds = [

    (u'Politica', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=30'),
    (u'Deportes', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=131'),
    (u'Economia', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=272'),
    (u'Sociedad', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=7773'),
    (u'Seguridad', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=7775'),
    (u'Buenos Aires', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=7774'),
    (u'Opinion', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=28'),
    (u'Espectaculos', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=120'),
    (u'El Mundo', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=7'),
    (u'Revista', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=494'),
    (u'Enfoques', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=421'),
    (u'Comercio Exterior', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=347'),
    (u'Tecnologia', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=432'),
    (u'Turismo', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=504'),
    (u'Al volante', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=371'),
    (u'El Campo', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=337'),
    (u'Moda y Belleza', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=1312'),
    (u'Inmuebles Comerciales', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=1363'),
    (u'Countries', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=1348'),
    (u'Comunidad', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=1344'),
    (u'adnCultura', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=6734'),
    (u'The WSJ Americas', u'http://contenidos.lanacion.com.ar/herramientas/rss/categoria_id=6373')
    ]

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.lanacion.com.ar/edicion-impresa')
        atap = soup.find(attrs={'class': 'tapa'})
        if atap:
            li = atap.find('img')
            if li:
                return li['src']
        return None
PK�X���t��lanacion_chile.png�PNG


IHDR(-S-PLTE�������������xp�h`�`_�`P�//���Β�?IDATx�]��A0֕��s%π�.�Y�;05����J�p���}E���F֠��q�X���;�KIEND�B`�PK�XB�l��lanacion_chile.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
lanacion.cl
'''
try:
    from urllib.parse import quote
except ImportError:
    from urllib import quote

from calibre.web.feeds.news import BasicNewsRecipe


class LaNacionChile(BasicNewsRecipe):
    title = 'La Nacion Chile'
    __author__ = 'Darko Miletic'
    description = 'El sitio de noticias online de Chile'
    publisher = 'La Nacion'
    category = 'news, politics, Chile'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'cp1252'
    cover_url = 'http://www.lanacion.cl/prontus_noticias_v2/imag/site/logo.gif'
    remove_javascript = True

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    keep_only_tags = [dict(name='div', attrs={'class': 'bloque'})]

    feeds = [(u'Noticias', u'http://www.lanacion.cl/rss.xml')]

    def print_version(self, url):
        toprint = quote(url, ':/')
        return u'http://www.lanacion.cl/cgi-bx/imprimir.cgi?_URL=' + toprint

    def preprocess_html(self, soup):
        del soup.body['onload']
        soup.head.base.extract()
        item = soup.find('a', attrs={'href': 'javascript:window.close()'})
        if item:
            item.extract()
        mtag = '<meta http-equiv="Content-Language" content="es-CL"/>'
        soup.head.insert(0, mtag)
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    language = 'es_CL'
PK�X����||lapoliticaonline_ar.png�PNG


IHDR���RPLTE ���������&'+O�<�%IDAT�c` 82*(*�P�@�A$�J���R�O�IEND�B`�PK�X����	�	lapoliticaonline_ar.recipe__copyright__ = '2015, Darko Miletic <darko.miletic at gmail.com>'
'''
www.lapoliticaonline.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LaPoliticaOnline_AR(BasicNewsRecipe):
    title = 'La Politica Online'
    __author__ = 'Darko Miletic'
    description = "Informacion actualizada las 24 horas, con noticias de Argentina y del mundo"
    publisher = 'La Politica Online SA'
    category = 'news, politics, Argentina'
    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False
    auto_cleanup = False
    no_stylesheets = True
    encoding = 'latin1'
    language = 'es_AR'
    publication_type = 'newspaper'
    remove_empty_feeds = True
    masthead_url = 'http://www.lapoliticaonline.com/0/img/header/logo.gif'
    extra_css             = """
                                .title,.vsmcontent{font-family: Georgia,"Times New Roman",Times,serif}
                                body{font-family: Arial,Helvetica,sans-serif}
                                .galleryfooter{font-size: small; color: gainsboro;}
                                img{display: block}
                                .title{font-size: x-large; font-weight: bold; line-height: 2em;}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['iframe', 'embed', 'object', 'meta', 'link', 'button']), dict(
            attrs={'class': ['share-related', 'controls oneimage', 'toolbar', 'itemheader']})
    ]

    remove_tags_before = dict(name='div', attrs={'class': 'title'})
    remove_tags_after = dict(attrs={'id': 'vsmcontent'})

    feeds = [

    (u'Politica', u'http://www.lapoliticaonline.com/files/rss/politica.xml'),
    (u'Economia', u'http://www.lapoliticaonline.com/files/rss/economia.xml'),
    (u'Ciudad', u'http://www.lapoliticaonline.com/files/rss/ciudad.xml'),
    (u'Provincia', u'http://www.lapoliticaonline.com/files/rss/provincia.xml'),
    (u'Conurbano', u'http://www.lapoliticaonline.com/files/rss/conurbano.xml'),
    (u'Mendoza', u'http://www.lapoliticaonline.com/files/rss/mendoza.xml'),
    (u'Santa Fe', u'http://www.lapoliticaonline.com/files/rss/santafe.xml'),
    (u'Transporte', u'http://www.lapoliticaonline.com/files/rss/transporte.xml'),
    (u'Energia', u'http://www.lapoliticaonline.com/files/rss/energía.xml'),
    (u'Judiciales', u'http://www.lapoliticaonline.com/files/rss/judiciales.xml')
    ]
PK�X��Hcclaprensa.png�PNG


IHDR(-S�PLTE������������������������[�0z�2|�)u�t�����2{�"q�4|�5}�B��C��D��F��i���ۙ��f�`�	a�G��I��L��M��T��W��]��`��c��n��q��o�*v�/y���ާ���������� o������������Q�`tRNS��fkIDATxڭ�a��o�;۶�g�0�;��x�j�;@^���;\[N�*-��,�d#�$#���������RUE��"��H�s�mI���*n#�{�/��Ԇ<�$�Mw�+IEND�B`�PK�XE�%�vvlaprensa.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2008-2016, Darko Miletic <darko.miletic at gmail.com>'
'''
laprensa.com.ar
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LaPrensa(BasicNewsRecipe):
    title = 'La Prensa'
    __author__ = 'Darko Miletic and Sujata Raman'
    description = 'Informacion Libre las 24 horas'
    publisher = 'La Prensa'
    category = 'news, politics, Argentina'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    remove_javascript = True
    language = 'es_AR'
    lang = 'es'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'
    filter_regexps = [r'.*archive.aspx.*']

    remove_tags = [
        dict(name='td', attrs={'class': ["link-registro", "link-buscador"]}),
        dict(name='td', attrs={
             'id': ["TDTabItem1", "TDTabItem2", "TDTabItem3", "TDTabItem4"]}),
        dict(name='table', attrs={'class': ["marco-botonera"]}),
        dict(name='tr', attrs={'class': ["messages", "IUTabItemSelected"]}),
        dict(name='input', attrs={'id': "txt_allfields"}),
        dict(name='div', attrs={
             'id': ["TabItem1", "TabItem2", "TabItem3", "TabItem4", "RCPanel"]}),
        dict(name='span', attrs={'id': ["GWCNavigatorControl", "_ctl15"]}),
        dict(name='span', attrs={'class': ["ranking-titulo", "IUTab"]}),
        dict(name='a', attrs={'class': ["link-registro", ]}),
        dict(name='img', src="/versions/1/imgs/icono-comentario.gif"),
        dict(name='img', src="/versions/1/imgs/logo.gif"),
        dict(name='img', src="/versions/1/imgs/boton-ingresar-roll.gif"),
        dict(name='img', src="/versions/1/imgs/icono-recomendar.gif"),
        dict(name='button'),
        dict(name='img', src="/versions/1/imgs/boton-votar-roll.gif"),
        dict(name='img', src="/versions/1/imgs/boton-ingresar.gif"),
        dict(name='img', src="/versions/1/imgs/icono-imprimir.gif"),
        dict(name='img', src="/versions/1/imgs/icono-ampliar-letra.gif"),
        dict(name='img', src="/versions/1/imgs/icono-reducir-letra.gif"),
        dict(name='img', src="/versions/1/imgs/pix-trans.gif"),
        dict(name='img', src="/versions/1/imgs/icono-buscador.gif"),
        dict(name='img', src="/versions/1/imgs/separador-linea-azul.gif"),
        dict(name='img', src=" /versions/1/imgs/separador-linea.gif"),
        dict(name='a', text="Powered by Civinext Groupware - V. 2.0.3567.23706"),
        dict(name='img', height="0")
    ]

    extra_css = '''
                    .seccion{font-size:xx-small;}
                    body{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                    .titulo-noticia-principal{font-size:large; color:#00427B; font-weight:bold;}
                    .texto-subtitulos{font-weight:bold;font-size:x-small;}
                    .fecha{font-size:xx-small;}
                    .volanta{font-size:xx-small;}
                '''

    feeds = [

    (u'Politica', u'http://www.laprensa.com.ar/ResourcesManager.aspx?Resource=Rss.aspx&Rss=4'),
    (u'Economia', u'http://www.laprensa.com.ar/ResourcesManager.aspx?Resource=Rss.aspx&Rss=5'),
    (u'Opinion', u'http://www.laprensa.com.ar/ResourcesManager.aspx?Resource=Rss.aspx?Rss=6'),
    (u'El Mundo', u'http://www.laprensa.com.ar/ResourcesManager.aspx?Resource=Rss.aspx?Rss=7'),
    (u'Actualidad', u'http://www.laprensa.com.ar/ResourcesManager.aspx?Resource=Rss.aspx?Rss=8'),
    (u'Deportes', u'http://www.laprensa.com.ar/ResourcesManager.aspx?Resource=Rss.aspx?Rss=9'),
    (u'Espectaculos', u'http://www.laprensa.com.ar/ResourcesManager.aspx?Resource=Rss.aspx?Rss=10')
    ]

    def preprocess_html(self, soup):

        for t in soup.findAll(['table', 'td', 'tr', 'span', 'tbody']):
            t.name = 'div'
        for t in soup.findAll(['hr']):
            t.extract()

        mtag = '<meta http-equiv="Content-Language" content="es-AR"/>'
        soup.head.insert(0, mtag)
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll(align="center"):
            del item['align']
        for item in soup.findAll(bgcolor="ffffff"):
            del item['bgcolor']
        return soup
PK�XB�=
��laprensa_hn.png�PNG


IHDR(-SPLTENN��7+;6�tRNS@��f'IDATx�c��H"���ك`r�.pk1̮g�7N�IEND�B`�PK�Xݡ)�laprensa_hn.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.laprensahn.com
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class LaPrensaHn(BasicNewsRecipe):
    title = 'La Prensa - Honduras'
    __author__ = 'Darko Miletic'
    description = 'Noticias de Honduras y mundo'
    publisher = 'La Prensa'
    category = 'news, politics, Honduras'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'
    language = 'es_HN'

    lang = 'es-HN'
    direction = 'ltr'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + \
        '"\npretty_print=True\noverride_css=" p {text-indent: 0cm; margin-top: 0em; margin-bottom: 0.5em} "'

    remove_tags = [dict(name=['form', 'object', 'embed'])]

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'titulo1'}), dict(
            name='div', attrs={'class': ['sumario11', 'hora', 'texto']})
    ]

    feeds = [(u'Noticias', u'http://feeds.feedburner.com/laprensa_titulares')]

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X����laprensa_ni.png�PNG


IHDR(-S�PLTE���������������� �� ��.��4��9��8��B��R��[��]��`��r��}������w������������������������������������������������������������������������������������������������������䯼ˡ�ƒ��{��`��?��3��$��8����������������������rhtRNS@��f�IDATx�c h)�ˉ�C�jR�.<쌬"� ��0#��������
P@[YUB��<���D�O\��T����ZS������$b,��������jc����ttu�	�	�+����
�A`X��y`C��}����.IEND�B`�PK�X��s߂	�	laprensa_ni.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
laprensa.com.ni
'''

import datetime
import time
from calibre.web.feeds.news import BasicNewsRecipe


class LaPrensa_ni(BasicNewsRecipe):
    title = 'La Prensa - Nicaragua'
    __author__ = 'Darko Miletic'
    description = 'LA PRENSA - EL Diario de los Nicaraguenses'
    publisher = 'La Prensa'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'cp1252'
    remove_javascript = True
    language = 'es_NI'

    months_es = ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',
                 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre']
    current_month = months_es[datetime.date.today().month - 1]
    current_index = time.strftime(
        "http://www.laprensa.com.ni/archivo/%Y/" + current_month + "/%d/noticias/")

    feeds = [(u'Portada', current_index + 'portada/')]

    def print_version(self, url):
        return url.replace('.shtml', '_print.shtml')

    def preprocess_html(self, soup):
        del soup.body['onload']
        mtag = '<meta http-equiv="Content-Language" content="es-NI"/>'
        soup.head.insert(0, mtag)
        atag = soup.find('span', attrs={'class': 'mas_noticias'})
        if atag:
            atag.extract()
        btag = soup.find('a', attrs={'href': '/archivo'})
        if btag:
            btag.extract()
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(0, _('Fetching feed') + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            soup = self.index_to_soup(feedurl)
            for item in soup.findAll('a', attrs={'class': ['titular', 'titulonotamed']}):
                description = ''
                url = feedurl + item['href']
                title = self.tag_to_string(item)
                date = time.strftime(self.timefmt)
                articles.append({
                    'title': title, 'date': date, 'url': url, 'description': description
                })
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X,ZDDlas_vegas_review.png�PNG


IHDR  szz�IDATx���d�a���8�L&9��aNr�9��΁ɐa���@�	3�$�L�a`��d&�L�0�$��+?��������x����>��3fvv�����|��5<��<�3YE3(�nH�6V���hI�XV=�y���[�s
t�
Co0�#�jX�%|�<�(��
9|�I]ׂ�5����Z;�Bt�&7�[����zM��֥x��~¤��8L֑?y�~��#k.��r��&�����bT��h��`��*
Y�r_<��0�C�ԗY���o���7ՙ���0�K�d>���� ���c�� R�D�<�@f�1Lfb���:��`r!�=����ej5��&;��9|H��vbͤ�oDP��&:8�%�b�?���c�|D�P��k�X�1�aVANS����O�x�aQ�L6S�@�5D�
��	X��
}�Y��҅�+&�@{�
�L���׳��죃1��Y(c���<�n��?���/�v�e�IEND�B`�PK�X�����las_vegas_review.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1274742400(BasicNewsRecipe):

    title = u'Las Vegas Review Journal'
    __author__ = 'Kovid Goyal'
    language = 'en'

    oldest_article = 7

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    auto_cleanup = True

    feeds = [
        (u'Top Stories', u'http://www.reviewjournal.com/rss.xml'),
        (u'News', u'http://www.reviewjournal.com/news/feed'),
        (u'Business', u'http://www.reviewjournal.com/business/feed'),
        (u'Opinion', u'http://www.reviewjournal.com/opinion/feed'),
        (u'Neon', u'http://www.reviewjournal.com/neon/feed'),
        (u'Sports', u'http://www.reviewjournal.com/sports/feed')]
PK�X��\ޞ�latimes.png�PNG


IHDR:���eIDATxڅ�Q
� D+	���I��I�	���I@B%�-!��,������M�3�n#gk`�)�b:T��}N(��(NH/�*�2��e>�������C1�A�G�IEND�B`�PK�X���7��latimes.recipe#!/usr/bin/env python

import re
from collections import defaultdict

from calibre.web.feeds.news import BasicNewsRecipe

DIR_COLLECTIONS = [['world'],
                   ['nation'],
                   ['politics'],
                   ['opinion', 'op-ed', 'opinion-la', 'editorials',
                       'readersreact', 'topoftheticket', 'endorsements'],
                   ['local', 'lanow', 'california', 'crime',
                       'abcarian', 'education', 'weather'],
                   ['business', 'hollywood', 'technology'],
                   ['sports'],
                   ['entertainment', 'movies', 'music',
                       'tv', 'arts', 'gossip', 'envelope'],
                   ['books'],
                   ['food', 'jonathon-gold', 'dailydish'],
                   ['health'],
                   ['style', 'laaffairs', 'pets'],
                   ['science', 'sciencenow'],
                   ['home'],
                   ['travel'],
                   ['fashion']]


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def absurl(url):
    if url.startswith('/'):
        url = 'https://www.latimes.com' + url
    return url


def what_section(url):
    parts = url.split('/')
    return parts[-4].capitalize()


class LATimes(BasicNewsRecipe):
    title = 'Los Angeles Times'
    __author__ = 'Jose Ortiz'
    description = 'The Los Angeles Times is a leading source of news on Southern California, entertainment, movies, television, music, politics, business, health, technology, travel, sports, environment, economics, autos, jobs, real estate and other topics affecting California'  # noqa
    category = 'news, politics, USA, Los Angeles, world'
    oldest_article = 1
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    compress_news_images = True
    compress_news_images_auto_size = 5
    language = 'en'
    remove_empty_feeds = True
    ignore_duplicate_articles = {'url'}
    publication_type = 'newspaper'
    cover_url = 'http://www.latimes.com/includes/sectionfronts/A1.pdf'

    keep_only_tags = [
        classes('headline page-lead-media authors published-date page-article-container'),
        dict(attrs={'data-element':'story-body'}),
    ]

    remove_tags= [
        classes('google-dfp-ad-wrapper enhancement')
    ]

    def parse_index(self):
        index = 'https://www.latimes.com/'
        pat = r'^https://www\.latimes\.com/[^/]+?/story/20\d{2}-\d{2}-\d{2}/\S+'
        articles = self.find_articles(index, pat)
        for collection in DIR_COLLECTIONS:
            if self.test:
                continue
            topdir = collection.pop(0)
            collection_index = index + topdir + '/'
            articles += self.find_articles(collection_index, pat)
            for subdir in collection:
                sub_index = collection_index + subdir + '/'
                articles += self.find_articles(sub_index, pat)

        feeds = defaultdict(list)
        for article in articles:
            section = what_section(article['url'])
            feeds[section].append(article)

        return [(k, feeds[k]) for k in sorted(feeds)]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            if img.findParent('a', href='http://www.latimes.com/opinion/la-letter-to-the-editor-htmlstory.html') \
               is img.parent and img['data-src'].endswith('/la-letter-to-the-editor'):
                img.parent.extract()
            else:
                img['src'] = img['data-src']
        return soup

    def find_articles(self, index, pattern):
        self.log('Downloading and parsing index: ', index)
        self.log('Pattern: ', pattern)
        try:
            soup = self.index_to_soup(index)
        except:
            self.log('Failed to download ', index)
            return []
        if soup.main is not None:
            alinks = soup.main.findAll('a', {'href': re.compile(pattern)})
        else:
            alinks = soup.findAll('a', {'href': re.compile(pattern)})
        alinks = [a for a in alinks if len(
            a.contents) == 1 and a.find(text=True, recursive=False)]
        articles = [
            {'title': self.tag_to_string(a), 'url': absurl(a['href'])} for a in alinks]
        self.log('Found: ', len(articles), ' articles.\n')
        return articles
PK�X=�0�cc
latribuna.png�PNG


IHDR��7�*IDATx��A(���o�%�I�L*R��(N�U �*qq梦�%[J4�)I�XLK
3���
nS�q�u����� �ͽc��Ѫ�g-����"j�K#B3&�����ܢ�zv�� ��H��d�T'�8٧>�0�$
�u�m$������ͪˑ�씴T��wE��̥�S>��
��{��{�9gq<w�Y��h���a'��(��vz��s^�`�me�R��`*�
p����B�
��m�-�vX�G�D͔�c�>m��&;X�����>!JC����*k�Ol=n\���v��Љ�7;���Un%IEND�B`�PK�X#���u	u	latribuna.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.latribuna.hn
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class LaTribuna(BasicNewsRecipe):
    title = 'La Tribuna - Honduras'
    __author__ = 'Darko Miletic'
    description = 'Noticias de Honduras y mundo'
    publisher = 'La Tribuna'
    category = 'news, politics, Honduras'
    oldest_article = 2
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'
    language = 'es_HN'

    lang = 'es_HN'
    direction = 'ltr'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + \
        '"\npretty_print=True\noverride_css=" p {text-indent: 0cm; margin-top: 0em; margin-bottom: 0.5em} "'

    remove_tags = [dict(name=['form', 'object', 'embed'])]

    keep_only_tags = [
        dict(name='p', attrs={'id': ['BlogTitle', 'BlogDate']}), dict(
            name='div', attrs={'id': 'BlogContent'})
    ]

    feeds = [(u'Noticias', u'http://www.latribuna.hn/web2.0/?feed=rss')]

    def print_version(self, url):
        return url + '&print=1'

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def get_cover_url(self):
        cover_url = None
        soup = self.index_to_soup('http://www.latribuna.hn/web2.0/')
        cover_item = soup.find('div', attrs={'class': 'portada_impresa'})
        if cover_item:
            cover_url = cover_item.a.img['src']
        return cover_url
PK�X�f��&&lavanguardia.png�PNG


IHDR  ��tRNSn���IDATH�c`�)b�`�Y� �� �	{���&��Q_
�4����jd��*d�
��d��3s�GV	d[��H��@�'�|ړ�/�}����� ����o߽_�f/�B��@�f.���ç�Aj��Ç�s�l�$D<�vYiE=y���>e�]*�ń�RL#�5��ęk@5s�p�׈d"���e�hĂ3�oHjEc���;�߹�T�4�AГAԇ�T��Q���W��������!��Һ�@�Wb5����rA[w��xb��2���(�޹��/��˱���A�+�|������� �=����ok6�
@��hD|���.^��D{�
`A�ϤY����كz��d��=S�B,�~롲I2������o>�x厌n,� d����gѫ7��*�`ı@q`��j�C����M�ՆOl�y��|8�6n?���3�<�K�@�ev���h0�x��2x�z�|���oY%�(-M��Q�8r�
�f�Z�5i��߿���G/��50��A,���ٙ7�$��?z��@�[�&�#P���ϟ㧯~��z&1�'��a���t����ur���`��G7#bAߴ5�b>Ԭ2�a�+�c�)�響|s�"��I���&T�Z�i�1`����!�E�`ݐ��Od�ܪ�V���ĥN2�-��C��-�AaN/���)�sIEND�B`�PK�X L�)
)
lavanguardia.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.lavanguardia.es
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class LaVanguardia(BasicNewsRecipe):
    title = 'La Vanguardia Digital'
    __author__ = 'Darko Miletic'
    description = u'Noticias desde España'
    publisher = 'La Vanguardia'
    category = 'news, politics, Spain'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    delay = 5
    language = 'es'

    direction = 'ltr'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    feeds = [

    (u'Portada', u'http://feeds.feedburner.com/lavanguardia/home'),
    (u'Cultura', u'http://feeds.feedburner.com/lavanguardia/cultura'),
    (u'Deportes', u'http://feeds.feedburner.com/lavanguardia/deportes'),
    (u'Economia', u'http://feeds.feedburner.com/lavanguardia/economia'),
    (u'El lector opina', u'http://feeds.feedburner.com/lavanguardia/lectoropina'),
    (u'Gente y TV', u'http://feeds.feedburner.com/lavanguardia/gente'),
    (u'Internacional', u'http://feeds.feedburner.com/lavanguardia/internacional'),
    (u'Internet y tecnologia', u'http://feeds.feedburner.com/lavanguardia/internet'),
    (u'Motor', u'http://feeds.feedburner.com/lavanguardia/motor'),
    (u'Politica', u'http://feeds.feedburner.com/lavanguardia/politica'),
    (u'Sucesos', u'http://feeds.feedburner.com/lavanguardia/sucesos')
    ]

    keep_only_tags = [
        dict(name='div', attrs={'class': 'detalle  noticia'})
    ]

    remove_tags = [
        dict(name=['object', 'link', 'script']), dict(
            name='div', attrs={'class': ['colC', 'peu', 'jstoolbar']})
    ]

    remove_tags_after = [dict(name='div', attrs={'class': 'text'})]

    def preprocess_html(self, soup):
        soup.html['dir'] = self.direction
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X�f��&&"lavanguardia_corresponsales_es.png�PNG


IHDR  ��tRNSn���IDATH�c`�)b�`�Y� �� �	{���&��Q_
�4����jd��*d�
��d��3s�GV	d[��H��@�'�|ړ�/�}����� ����o߽_�f/�B��@�f.���ç�Aj��Ç�s�l�$D<�vYiE=y���>e�]*�ń�RL#�5��ęk@5s�p�׈d"���e�hĂ3�oHjEc���;�߹�T�4�AГAԇ�T��Q���W��������!��Һ�@�Wb5����rA[w��xb��2���(�޹��/��˱���A�+�|������� �=����ok6�
@��hD|���.^��D{�
`A�ϤY����كz��d��=S�B,�~롲I2������o>�x厌n,� d����gѫ7��*�`ı@q`��j�C����M�ՆOl�y��|8�6n?���3�<�K�@�ev���h0�x��2x�z�|���oY%�(-M��Q�8r�
�f�Z�5i��߿���G/��50��A,���ٙ7�$��?z��@�[�&�#P���ϟ㧯~��z&1�'��a���t����ur���`��G7#bAߴ5�b>Ԭ2�a�+�c�)�響|s�"��I���&T�Z�i�1`����!�E�`ݐ��Od�ܪ�V���ĥN2�-��C��-�AaN/���)�sIEND�B`�PK�X�ALy�
�
%lavanguardia_corresponsales_es.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe


class LaVanguardiaCorresponsalesRecipe (BasicNewsRecipe):
    __author__ = 'Marc Busqué <marc@lamarciana.com>'
    __url__ = 'http://www.lamarciana.com'
    __version__ = '1.0.2'
    __license__ = 'GPL v3'
    __copyright__ = '2012, Marc Busqué <marc@lamarciana.com>'
    title = u'La Vanguardia - Blogs de los corresponsales'
    description = u'Blogs de los corresponsales de La Vanguardia en este mismo periódico'
    url = 'http://www.lavanguardia.com/blogs/index.html'
    language = 'es'
    tags = 'información, internacional '
    oldest_article = 30
    remove_empty_feeds = True
    no_stylesheets = True

    def get_extra_css(self):
        if not self.extra_css:
            br = self.get_browser()
            self.extra_css = br.open_novisit(
                'https://raw.githubusercontent.com/laMarciana/gutenweb/master/dist/gutenweb.css').read().replace('@charset "UTF-8";', '')
        return self.extra_css

    feeds = [
        (u'Marc Bassets - Diario de Washington',
         u'http://blogs.lavanguardia.com/washington/feed'),
        (u'Rafael Poch - Diario de Berlín',
         u'http://blogs.lavanguardia.com/berlin/feed'),
        (u'Eusebio Val - Diario de Roma', u'http://blogs.lavanguardia.com/roma/feed'),
        (u'Robert Mur - Diario de Buenos Aires',
         u'http://blogs.lavanguardia.com/buenos-aires/feed'),
        (u'Isidre Ambrós - Diario de Pekín',
         u'http://blogs.lavanguardia.com/pekin/feed'),
        (u'Beatriz Navarro - Diario de Bruselas',
         u'http://blogs.lavanguardia.com/bruselas-navarro/feed'),
        (u'Lluis Uría - Diario de París',
         u'http://blogs.lavanguardia.com/paris-uria/feed'),
        (u'Tomás Alcoverro - Diario de Beirut',
         u'http://blogs.lavanguardia.com/beirut/feed'),
        (u'Enrique Cymerman - Diario de Jerusalén',
         u'http://blogs.lavanguardia.com/jerusalen-cymerman/feed'),
        (u'Jordi Joan Baños - Diario de India',
         u'http://blogs.lavanguardia.com/india/feed'),
        (u'Gonzalo Aragonés - Diario de Moscú',
         u'http://blogs.lavanguardia.com/moscu/feed'),
        (u'Andy Robinson - Diario itinerante',
         u'http://blogs.lavanguardia.com/diario-itinerante/feed'),
        (u'Rafael Ramos - Diario de Londres',
         u'http://blogs.lavanguardia.com/londres/feed'),
        (u'Rafael Ramos - El cocinero de Downing Street',
         u'http://blogs.lavanguardia.com/el-cocinero-de-downing-street/feed'),
        (u'Ricardo Ginés Echevarría - Diario de Estambul',
         u'http://blogs.lavanguardia.com/estambul/feed'),
    ]
PK�X����lavenir_be.png�PNG


IHDR  szz�tIDATx�͗x][���m��m�vrm�6¿n�"vj�v�6c�w퓜��չ�_�/N�=3�ך��;n��uW�Q|=7�Og������՟�	����vcG�-y/Ж�,�S{P7�}Z���V1n�����W���wB�m���7uH��.�`D��3�qҝ�O����$u�i>8�5�27%���k�Z�Mp�a�r��:La�{�#NUΌ����{i�(q�_‰��?�}K�ؕ?}b=�5BD��r;E�!\a�e�;
u9�r�r&�/�J�V�N�!@֖1>֓_!���e����_j��)%�f���8#�X��-2Q�|u2D�
Bd��]���z�k~/��+��*�_�	a���|7/���˗�C��t�_@�����¶KI���U.,�z��Iwp%�#��f�q aU�򵻦���b#�DM�'a��\n��ZͭM�����|:#�=a�"Rd�^�.��B�=�YH�%ꪜS��#�,vv�ܘgx���n��u8�k�'����
&(2�]���i�P9�Z�zKJ�8��;��چVذ��24Յ���4Ǽ�Wv-�C�33s�S5�e5�����	髹�ʺ���g��Z-޾�T#��
��U�j�N~�u��z7�'��*�rS%��Z��`�ε,۶��ۗ�f�ZN�=�R��M|��]f7"�;�>ȝ�*��p��`��$�S���lƯLC]i5���G��n��Uz�~E右�a��([6
���	��{�`�@m%��q
��b貯H(�G
�x��{1Ny�연����O�L�D��1(�37�D��G��N>~��0�D!�6Ŀ�����i������mBƶ$&mκcKQ�dI9V��x����h�sAw�_I������7�q;�/��b����@Q�"�.��×��kT�����w�{�Ɠc���AeV�14&mc7����(YT�Թ�9��W�����T%X~p>J�ٹ��lx��gx��'�\:���V9�������
�+yש�(5x�$Iu�Z�Ȕ�ɷ��q�=_���z�f<@�(��q"p�;NnB���t�$V��c��8��M�)�O�	nEZ|0݋��p�lW
�����y)]���>�`��*��m�e��%�Ȥlw.{�޸,G�b?�Q�l8�������}/W�G��2
Q�&�\��V��r��O��%����Uck+'��x���2��u�/�Tbɲ���z66��h�<L��4Z�ZPj�-���h="���n��<��Vh��mU�eT�b4�'��_磙���;͵����~�S����,�#�B��&|_��WO���47�A47�r��%�wh��-$�p4����y/lG�Ve+NS1;���=�9~x뗤��
V�S�d�J+�4�c�>��qM��'��XO<��`?��>����71��[���V�W�(��F4t��WX3�%����#$��I���T��\��B*�U��O���1�-��<r
�_��Pl.�������c,�qg�n\� :~�Ĺ	�cy��X�v�b1Q����\$&�B�/&M�R�c'�׉����)�ӏ~�r�h�rz�z9M�x9�=��"=Zr�z���z��X�x�KIEND�B`�PK�X'(���lavenir_be.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2011, Lionel Bergeret <lbergeret at gmail.com>'
'''
lavenir.net
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LAvenir(BasicNewsRecipe):
    title = u'L\'Avenir'
    __author__ = u'Lionel Bergeret'
    description = u'News from Belgium in French'
    publisher = u'lavenir.net'
    category = 'news, Belgium'
    oldest_article = 3
    language = 'fr'

    max_articles_per_feed = 20
    no_stylesheets = True
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'

    keep_only_tags = [
        dict(name='div', attrs={'class': 'photo'}), dict(name='p', attrs={
            'class': 'intro'}), dict(name='div', attrs={'class': 'article-body'})
    ]

    feeds = [

    (u'Belgique', u'http://www.lavenir.net/rss.aspx?foto=1&intro=1&section=info&info=df156511-c24f-4f21-81c3-a5d439a9cf4b'),
    (u'Monde', u'http://www.lavenir.net/rss.aspx?foto=1&intro=1&section=info&info=1642237c-66b9-4e8a-a8c1-288d61fefe7e'),
    (u'Societe', u'http://www.lavenir.net/rss.aspx?foto=1&intro=1&section=info&info=12e1a2f4-7e03-4cf1-afec-016869072317')
    ]

    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

    def get_cover_url(self):
        cover_url = 'http://www.lavenir.net/extra/Static/journal/Pdf/1/UNE_Nationale.PDF'
        return cover_url
PK�XE���OO
le_gorafi.png�PNG


IHDR  ��IDATx^�V
LUe>��Ͻ�{�r��+(��(NMj?SK��T,�r��g�Mg�֖:7k�Yjm&s��4��2���4E������{�{�9!�sc���~���{���|$[��0	I�HW
#]1MQ����2��a�,me;˸ll��q���el`���(�*E1(K�a�Qb�=;=yB�+3-	00B~8�¡�,��L�i:�¦8ln���� )�0�A�Pc��谕�-{h��9YiIq6��(JQ^��n��z�;0�Ҵ��dg�sJ�#��W_}1b��e��
^�Xp,1�p�z���開$r�fg͟Fb��G����;4ڃ���u��zq��F�C�Vv֜��R�Z!?"�F�`��v%طW>��K�<�\�+51���u�H��"+jD�DE�F�X�m/>Y�|Ea�K\r�%!��VQ� /�iă��ו��<]���[�_�^�{�v�'����p�����2�Z� ��#e����iգ6+k��7��{����&_ Dc��Kӎ8k~n��%%����X�dU�F/ c�pIᬂ�]���U�~�cߠW��,(��E����{�Ξ�������	C������Ȳ���3��<V�tE�eI��PA!����K��o�&=B��`b�{n�d3����c��bW��u���C�%�]�x���b(�s��@4�]�f����znq��b`�C�>*}|$�����Վ�Ȩ�=���W����q���	�I�@L.�tkL"�@2�@�C�;X�lE��(�T�4�v/|`F{g_�嶆+�!a2���ܬ3}����~��R����&;m;^_��v҈RV��
h�*��
�0����A
�����KK� 
�$
���I�n"��夏��W�F�,Z������hތS�xQ����w��;����d|C�V��$#�d���[X��e�2N� 9ڌ�<��l�0tQ~fk�5�GD^�V����!ch���in���T3�֒@�W%��F
���ߟF����i�*ֿ}!����bł]o�1�P���u�
y��)����̜r_vJ[W?��T�aT����x�p,1��������a�HKM.[T�p��aj� ��
��1��@FO?� ���@ʗ>��y��[���i�3W>rl�26?5\��{��(��x�rm�'r2��#5F�I�������XZ��/�
�h��ׄ�����o�P��-����Φ�^Y�خͫ�vn�>���7��>%�[,�k�s׸��({�#�PN�!�`�t��p'BLD��x}�}'�~�`����^�3���=P�Ж����}�j|��8x^<V]W�yO��?c��E��L�&|hw��o}|��9���.��޳��#/�w�ⵎ���I�^�,A ,He�p�����7����_VV4sj6��v+���D���C}3��{}ƀ:q�q�����n
s<\�`�n����$��&�1E�t:��g)I�:���<�!�|���4F�
��o���@���<IEND�B`�PK�X��_f��le_gorafi.recipefrom __future__ import unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2013, Malah <malah at neuf dot fr>'
'''
Le GORAFI.fr
'''

__author__ = '2013, Malah <malah at neuf dot fr>'
from calibre.web.feeds.news import BasicNewsRecipe


class legorafi(BasicNewsRecipe):
    title = u'Le GORAFI.fr'
    __author__ = 'Malah'
    description = u'Depuis 1826, toute l\'information de sources contradictoires'
    oldest_article = 7
    language = 'fr'
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    keep_only_tags = [
        dict(name='div', attrs={'class': 'entry-content'}),
        dict(name='h3', attrs={'id': 'comments-title'}),
    ]
    remove_tags = [
        dict(name='div', attrs={'id': 'soshake-sharebox'}),
        dict(name='div', attrs={'class': 'social-ring'}),
        dict(name='div', attrs={'class': 'entry-utility'}),
        dict(name='div', attrs={'id': 'respond'}),
    ]
    masthead_url = u'http://web.gweno.free.fr/img/logositeter.png'
    couverture_url = u'http://www.legorafi.fr/wp-content/uploads/2013/02/iconegorafi.png'
    feeds = [
        (u'Articles', u'http://www.legorafi.fr/feed/'),
    ]
PK�X1��3UUle_journal.png�PNG


IHDR  ��IDATHǵV]l\G>���ٻ޵w��i�vR����V�M�����*�x���
�x��"A�"�x�/<����A��M

���iT�rcHc��v�]�z���;���NH	g^��̹::�!3ý<����r�f��/���u$CRk�Nd�0�Bi}��~�6d`-#���4g��>�H�ϝs| 엾P�֪���ır��~g�5k��:��%��jǕ"�����6�eI��N�fL��˦��pk��U*��z���?����W�c�ͱ��t6,��ohh���S;��t�
���w���^��I%�cQ�U�&1d]�`�5�"5��u����9�v��'��"m6�["�zB����Οf�����rL5WU1�0��BA��~q�f���ߝ�#�N�����(N��
u���@CE`H�z�� �����L̋J����<�t��<Ic��>�7ľ�>�4_�s�zʞx���"tJ/���_�,��>9�P7�[j����s�7�A�i�~�=�ZYi�
�:
�ꍵ�^�>/1k�wh��W�Ee
c�o%u5��I������o��(�!ÊP "��>���v�[���k�cc���#�%!H��dt�a���0S"`B@00#
.��T���˒e�k��5<��@x��"e4��6�#ݶ��J0i�OF�y���kV�L�,�Q�=E&h�w��g�<�E��C��4�ռ�86�?���'���ӳV��@�xm(/_
/��r�P���.�~Ζ{�w/Z0��e�`�{�6>��չ��];�S��Q�o̼�Y��C�h��yo�~ge�]
�V�V�8�D�:��dw��8�_�Tƞy��ܩ��}�[��-���Ϥ���s�8q3NqP\����ġL�x2��–n�qᲈ$GZgX8FY��C�I_AX����L7�~�wa�?��4��㡃��/ɩ	����
�bl���߂LI�
C�A��y����l���p��Ĺe�S�F/�uw�/7�ׇz��f~�jg��}l��7�?�s�	|���j�R���\'?l.]
��gՃ��?�a��g���_�N{�W�!�1���"n7����6�:Qd��f��3N����s�}��s@}�L�W��
v%4۰�`�� 2�w��f*,M�q�_;��}�zc�&X��Lm�-���„;&n��
�RB�������%��u�a�[3Xr�
���"2@�ߒI��*
D>�^��N�V��R[��qp@� �֩Rօ���R��W2Õ(��j�#���#I���>f�n(���{�e$d���Q�����YWNTjg��+�|�����h���yG���Xa������j|,��!����`�.u �e���E=3�� k+Db-�<�2i*�H�Y K(d'�$R�%`Nt�$���O���� ���MƷ�"��؅rf���ߝX�78�v�$�4ߔvx;��鯻ʟ�"
& �t�H��n���|;m�'t�5IEND�B`�PK�X80�&&le_journal.recipe__author__ = ' (lrfurtado@yahoo.com.br)'

from calibre.web.feeds.news import BasicNewsRecipe


class LeJournalDeMontrealRecipe(BasicNewsRecipe):

    title = u'Le Journal de Montreal'
    description = u'Le Journal de Montreal'
    __author__ = 'Luciano Furtado'
    language = 'fr'

    oldest_article = 7
    use_embedded_content = 0
    max_articles_per_feed = 15

    remove_tags = [
        dict(name='ul', attrs={'id': 'mainNav'}),
        dict(name='div', attrs={'id': 'boxPolitique'}),
        dict(name='div', attrs={'id': 'boxScoop'}),
        dict(name='div', attrs={'id': 'DossierSpec'}),
        dict(name='div', attrs={'id': 'channelBoxes'}),
        dict(name='div', attrs={'id': 'sectionBoxes'}),
        dict(name='div', attrs={'id': 'header'}),
        dict(name='div', attrs={'id': 'footer'}),
        dict(name='div', attrs={'id': 'navbarCanoe_container'}),
        dict(name='div', attrs={'id': 'popularCanoe'}),
        dict(name='div', attrs={'id': 'textAds'}),
        dict(name='div', attrs={'id': '24heures'}),
        dict(name='div', attrs={'class': 'bottomBox clear'}),
        dict(name='div', attrs={'class': 'articleControls thin'}),
    ]

    feeds = [
        (u'Actualites',
         u'http://www.canoe.com/rss/feed/nouvelles/ljm_actualites.xml'),
        (u'Arts et spectacle',
         u'http://www.canoe.com/rss/feed/nouvelles/ljm_arts.xml'),
        (u'Sports',
         u'http://www.canoe.com/rss/feed/nouvelles/ljm_sports.xml'),
        (u'Chroniques',
         u'http://www.canoe.com/rss/feed/nouvelles/ljm_chroniques.xml'),
    ]
PK�XsW8��le_monde.png�PNG


IHDR  V%(	pHYs!�!��htEXtSoftwarewww.inkscape.org��<IDAT8�c`2@��<��ޓ��h�D<)!+���� ��V�@����o�bt`�*��
n������9��}r��?*U��dM{��X�է��(3�o��Q2``����'7�eTy�`��~��g��1�StV'^�����9!�i�@���B�D��������G��)��_�̀G��nK������Y�,�������pH���`�X��׹�6JC9����`+�����m$Ap�R���@TM'�b�[$6h2[�	2T'IEND�B`�PK�X&}B�i(i(le_monde.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2012'

'''
lemonde.fr
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes
from datetime import date
import re


class LeMonde(BasicNewsRecipe):
    title = 'Le Monde'
    __author__ = 'veezh, Martin Villard'
    description = 'Les flux RSS du Monde.fr'
    publisher = 'Société Editrice du Monde'
    publication_type = 'newspaper'
    needs_subscription = 'optional'
    language = 'fr'
    encoding = 'utf-8'

    oldest_article = 1
    no_stylesheets = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    reverse_article_order = True
    remove_empty_feeds = True

    conversion_options = {
        'publisher': publisher
    }

    masthead_url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Le_monde_logo.svg/800px-Le_monde_logo.svg.png'

    feeds = [
        ('International : Europe ', 'https://www.lemonde.fr/europe/rss_full.xml'),
        ('International : Amériques ', 'https://www.lemonde.fr/ameriques/rss_full.xml'),
        ('International : Afrique ', 'https://www.lemonde.fr/afrique/rss_full.xml'),
        ('International : Asie Pacifique', 'https://www.lemonde.fr/asie-pacifique/rss_full.xml'),
        ('International : Proche-Orient', 'https://www.lemonde.fr/proche-orient/rss_full.xml'),
        ('International : Royaume-Uni', 'https://www.lemonde.fr/royaume-uni/rss_full.xml'),
        ('International : Etats-Unis', 'https://www.lemonde.fr/etats-unis/rss_full.xml'),
        ('International : La une', 'https://www.lemonde.fr/international/rss_full.xml'),
        ('France : Politique ', 'https://www.lemonde.fr/politique/rss_full.xml'),
        ('France : Société ', 'https://www.lemonde.fr/societe/rss_full.xml'),
        ('France : Les décodeurs', 'https://www.lemonde.fr/les-decodeurs/rss_full.xml'),
        ('France : Justice ', 'https://www.lemonde.fr/justice/rss_full.xml'),
        ('France : Police ', 'https://www.lemonde.fr/police/rss_full.xml'),
        ('France : Campus ', 'https://www.lemonde.fr/campus/rss_full.xml'),
        ('France : Education', 'https://www.lemonde.fr/education/rss_full.xml'),
        ('Economie : Entreprises ', 'https://www.lemonde.fr/entreprises/rss_full.xml'),
        ('Economie : Argent ', 'https://www.lemonde.fr/argent/rss_full.xml'),
        ('Economie : Économie française', 'https://www.lemonde.fr/economie-francaise/rss_full.xml'),
        ('Economie : Industrie', 'https://www.lemonde.fr/industrie/rss_full.xml'),
        ('Economie : Emploi ', 'https://www.lemonde.fr/emploi/rss_full.xml'),
        ('Economie : Immobilier ', 'https://www.lemonde.fr/immobilier/rss_full.xml'),
        ('Economie : Médias', 'https://www.lemonde.fr/medias/rss_full.xml'),
        ('Economie : La une', 'https://www.lemonde.fr/economie/rss_full.xml'),
        ('Planète: Climat ', 'https://www.lemonde.fr/climat/rss_full.xml'),
        ('Planète: Agriculture ', 'https://www.lemonde.fr/agriculture/rss_full.xml'),
        ('Planète: Environnement', 'https://www.lemonde.fr/environnement/rss_full.xml'),
        ('Planète: La une', 'https://www.lemonde.fr/planete/rss_full.xml'),
        ('Sciences : Espace ', 'https://www.lemonde.fr/espace/rss_full.xml'),
        ('Sciences : Biologie ', 'https://www.lemonde.fr/biologie/rss_full.xml'),
        ('Sciences : Médecine ', 'https://www.lemonde.fr/medecine/rss_full.xml'),
        ('Sciences : Physique ', 'https://www.lemonde.fr/physique/rss_full.xml'),
        ('Sciences : Santé', 'https://www.lemonde.fr/sante/rss_full.xml'),
        ('Sciences : La une', 'https://www.lemonde.fr/sciences/rss_full.xml'),
        ('Culture : Cinéma ', 'https://www.lemonde.fr/cinema/rss_full.xml'),
        ('Culture : Musiques ', 'https://www.lemonde.fr/musiques/rss_full.xml'),
        ('Culture : Télévision et radio', 'https://www.lemonde.fr/televisions-radio/rss_full.xml'),
        ('Culture : Le Monde des livres', 'https://www.lemonde.fr/livres/rss_full.xml'),
        ('Culture : Arts ', 'https://www.lemonde.fr/arts/rss_full.xml'),
        ('Culture : Scènes', 'https://www.lemonde.fr/scenes/rss_full.xml'),
        ('Culture : La une', 'https://www.lemonde.fr/culture/rss_full.xml'),
        ('Opinions : La une', 'https://www.lemonde.fr/idees/rss_full.xml'),
        ('Opinions : éditoriaux', 'https://www.lemonde.fr/editoriaux/rss_full.xml'),
        ('Opinions : chroniques ', 'https://www.lemonde.fr/chroniques/rss_full.xml'),
        ('Opinions : tribunes', 'https://www.lemonde.fr/tribunes/rss_full.xml'),
        ('Pixels : Jeux vidéo', 'https://www.lemonde.fr/jeux-video/rss_full.xml'),
        ('Pixels : Culture web', 'https://www.lemonde.fr/cultures-web/rss_full.xml'),
        ('Pixels : La une', 'https://www.lemonde.fr/pixels/rss_full.xml'),
        ('Sport : Football ', 'https://www.lemonde.fr/football/rss_full.xml'),
        ('Sport : Rugby ', 'https://www.lemonde.fr/rugby/rss_full.xml'),
        ('Sport : Tennis ', 'https://www.lemonde.fr/tennis/rss_full.xml'),
        ('Sport : Cyclisme ', 'https://www.lemonde.fr/cyclisme/rss_full.xml'),
        ('Sport : Basket', 'https://www.lemonde.fr/basket/rss_full.xml'),
        ('Sport : La une', 'https://www.lemonde.fr/sport/rss_full.xml'),
        ('M le mag : L’époque ', 'https://www.lemonde.fr/m-perso/rss_full.xml'),
        ('M le mag : Styles ', 'https://www.lemonde.fr/m-styles/rss_full.xml'),
        ('M le mag : Gastronomie ', 'https://www.lemonde.fr/gastronomie/rss_full.xml'),
        ('M le mag : Recettes du Monde', 'https://www.lemonde.fr/les-recettes-du-monde/rss_full.xml'),
        ('M le mag : Sexo', 'https://www.lemonde.fr/sexo/rss_full.xml'),
        ('M le mag : La une', 'https://www.lemonde.fr/m-le-mag/rss_full.xml'),
        ('Actualités : A la une', 'https://www.lemonde.fr/rss/une.xml'),
        ('Actualités : En continu', 'https://www.lemonde.fr/rss/en_continu.xml'),
        ('Actualités : Vidéos ', 'https://www.lemonde.fr/videos/rss_full.xml'),
        ('Actualités : Portfolios', 'https://www.lemonde.fr/photo/rss_full.xml'),
    ]

    keep_only_tags = [
        classes('article__header'),
        dict(name='section', attrs={'class': ['article__cover', 'article__content', 'article__heading',
                                              'article__wrapper']})
    ]

    remove_tags = [
        classes('article__status meta__reading-time meta__social multimedia-embed'),
        dict(name=['footer', 'link', 'meta', 'svg', 'button']),
        dict(name='img', attrs={'class': ['article__author-picture']}),
        dict(name='section', attrs={'class': 
			[
				'inread js-services-inread', 'catcher catcher--inline', 'inread inread--NL js-services-inread', 
				'article__reactions', 'author', 'catcher', 'portfolio', 'services-inread'
			]
		})
    ]

    remove_attributes = [
        'data-sizes', 'height', 'sizes', 'width'
    ]

    preprocess_regexps = [
        # insert space between author name and description
        (re.compile(r'(<span class="[^"]*author__desc[^>]*>)([^<]*</span>)',
                    re.IGNORECASE), lambda match: match.group(1) + ' ' + match.group(2)),
        # insert " | " between article type and description
        (re.compile(r'(<span class="[^"]*article__kicker[^>]*>[^<]*)(</span>)',
                    re.IGNORECASE), lambda match: match.group(1) + ' | ' + match.group(2))
    ]

    extra_css = '''
        h2 { font-size: 1em; }
        h3 { font-size: 1em; }
        .article__desc { font-weight: bold; }
        .article__fact { font-weight: bold; text-transform: uppercase; }
        .article__kicker { text-transform: uppercase; }
        .article__legend { font-size: 0.6em; margin-bottom: 1em; }
        .article__title { margin-top: 0em; }
    '''

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            try:
                br.open('https://secure.lemonde.fr/sfuser/connexion')
                br.select_form(nr=0)
                br['email'] = self.username
                br['password'] = self.password
                br.submit()
            except Exception as e:
                self.log('Login failed with error:', str(e))
        return br

    def get_cover_url(self):
        # today's date is a reasonable guess for the ID of the cover
        cover_id = date.today().strftime('%Y%m%d')
        # soup = self.index_to_soup('https://www.lemonde.fr/')
        # a = soup.find('a', {'id': 'jelec_link', 'style': True})
        # if a and a['style']:
            # url = a['style'].split('/')
            # if len(url) > 5 and url[3].isdigit():
                # overwrite guess if actual cover ID was found
                # cover_id = url[3]
        return 'https://www.lemonde.fr/thumbnail/journal/' + cover_id + '/1000/1490'

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        # skip articles without relevant content (e.g., videos)
        for el in 'blog chat live podcasts portfolio video visuel'.split():
            if '/' + el + '/' in url:
                self.log('Skipping URL', url)
                self.abort_article()
        return url

    def preprocess_html(self, soup):
        # when an image is available in multiple sizes, select the smallest one
        for img in soup.find_all('img', {'data-srcset': True}):
            data_srcset = img['data-srcset'].split()
            if len(data_srcset) > 1:
                img['src'] = data_srcset[0]
                del img['data-srcset']
        return soup

    def postprocess_html(self, soup, first_fetch):
        # remove local hyperlinks
        for a in soup.find_all('a', {'href': True}):
            if '.lemonde.fr/' in a['href']:
                a.replace_with(self.tag_to_string(a))
        # clean up header
        for ul in soup.find_all('ul', {'class': 'breadcrumb'}):
            div = soup.new_tag('div')
            category = ''
            for li in ul.find_all('li', {'class': True}):
                category += self.tag_to_string(li).strip().upper() + ' - '
                div.string = category[:-3]
            ul.replace_with(div)
        return soup
PK�XT�9�le_monde_diplomatique_fr.png�PNG


IHDR  D���9PLTE������wvχ�ܩ��UT�DC�����ʭ33���֘��""㺺�fe���������J�IDATx^��7�0CQ`�Y��kY,
���fP�IK��$���>C(�������l�"X����xnIly�� ��k��
�$-��xt�jЃC�Ѝ@t�>���bD7��{�_\��SoM�OqIEND�B`�PK�XNV_�''le_monde_diplomatique_fr.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2013'
'''
monde-diplomatique.fr
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.web.feeds import feeds_from_index


def absurl(url):
    if url.startswith('/'):
        url = 'http://www.monde-diplomatique.fr' + url
    return url


class LeMondeDiplomatiqueSiteWeb(BasicNewsRecipe):
    title = u'Le Monde diplomatique.fr'
    __author__ = 'Gaëtan Lehmann'
    description = "Le Monde diplomatique est un mensuel français d’information et d’opinion à la ligne éditoriale nettement engagée en faveur d'une gauche de rupture avec le capitalisme. Il aborde de nombreux sujets — géopolitique, relations internationales, économie, questions sociales, écologie, culture, médias, …"  # noqa
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup = True
    publisher = 'monde-diplomatique.fr'
    category = 'news, France, world'
    language = 'fr'
    masthead_url = 'http://www.monde-diplomatique.fr/squelettes/images/logotyfa.png'
    timefmt = ' [%d %b %Y]'
    no_stylesheets = True

    feeds = [(u'Blogs', u'http://blog.mondediplo.net/spip.php?page=backend'),
             (u'Archives', u'http://www.monde-diplomatique.fr/rss/')]

    preprocess_regexps = [
        (re.compile(r'<title>(.*) - Les blogs du Diplo</title>'),
         lambda m: '<title>' + m.group(1) + '</title>'),
        (re.compile(r'<h2>(.*) - Les blogs du Diplo</h2>'),
         lambda m: '<h2>' + m.group(1) + '</h2>'),
        (re.compile(r'<title>(.*) \(Le Monde diplomatique\)</title>'),
         lambda m: '<title>' + m.group(1) + '</title>'),
        (re.compile(r'<h2>(.*) \(Le Monde diplomatique\)</h2>'),
         lambda m: '<h2>' + m.group(1) + '</h2>'),
        (re.compile(r'<h3>Grand format</h3>'), lambda m: '')]

    remove_tags = [dict(name='div', attrs={'class': 'voiraussi liste'}),
                   dict(name='ul', attrs={
                        'class': 'hermetique carto hombre_demi_inverse'}),
                   dict(name='a', attrs={'class': 'tousles'}),
                   dict(name='h3', attrs={'class': 'cat'}),
                   dict(name='div', attrs={'class': 'logodiplo'}),
                   dict(name='img', attrs={'class': 'spip_logos'}),
                   dict(name='p', attrs={'id': 'hierarchie'}),
                   dict(name='div', attrs={'class': 'espace'})]

    conversion_options = {
        'comments': description,
        'tags': category,
        'publisher': publisher,
        'linearize_tables': True
    }

    remove_empty_feeds = True

    filterDuplicates = True

    # don't use parse_index - we need it to send an exception so we can mix
    # feed and parse_index results in parse_feeds
    def parse_index_valise(self):
        articles = []
        soup = self.index_to_soup('http://www.monde-diplomatique.fr/carnet/')
        cnt = soup.find('ul', attrs={'class': 'liste double'})
        for item in cnt.findAll('li'):
            description = ''
            feed_link = item.find('a', href=True)
            title = self.tag_to_string(item.find('h3'))
            desc = item.find('div', attrs={'class': 'intro'})
            date = item.find('div', attrs={'class': 'dates_auteurs'})
            if desc:
                description = desc.string
            if feed_link:
                articles.append({
                    'title': title,
                    'date': self.tag_to_string(date),
                    'url': absurl(feed_link['href']),
                    'description': description
                })
        return [("La valise diplomatique", articles)]

    def parse_index_cartes(self):
        articles = []
        soup = self.index_to_soup('http://www.monde-diplomatique.fr/cartes/')
        cnt = soup.find('ul', attrs={'class': 'liste_vignettes hautcartes'})
        for li in cnt.findAll('li'):
            feed_link = li.find('a', href=True)
            h3 = li.find('h3')
            authorAndDate = li.find('div', attrs={'class': 'dates_auteurs'})
            author_date = self.tag_to_string(authorAndDate).split(', ')
            author = author_date[0]
            date = author_date[-1]
            if feed_link:
                title = self.tag_to_string(h3)
                articles.append({
                    'title': title,
                    'date': date,
                    'url': absurl(feed_link['href']),
                    'description': author
                })
        return [("Cartes", articles)]

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        valise = feeds_from_index(self.parse_index_valise(), oldest_article=self.oldest_article,
                                  max_articles_per_feed=self.max_articles_per_feed,
                                  log=self.log)
        cartes = feeds_from_index(self.parse_index_cartes(), oldest_article=self.oldest_article,
                                  max_articles_per_feed=self.max_articles_per_feed,
                                  log=self.log)
        feeds = valise + feeds + cartes
        return feeds
PK�X*��ۖ�le_monde_en.png�PNG


IHDR(-SPLTE333fff���������A�?IDATxڝɵ�A�#'fj��G�e�2nиQj̱f'`^��G`b���M�p�/��X!'Q/�IEND�B`�PK�X����le_monde_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

__license__ = 'GPL v3'
__copyright__ = '2022'

'''
lemonde.fr/en
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class LeMonde(BasicNewsRecipe):
    title = 'Le Monde in English'
    __author__ = 'Darko Miletic (based on veezh recipe)'
    description = 'Le Monde in English'
    publisher = 'Société Editrice du Monde'
    publication_type = 'newspaper'
    needs_subscription = 'optional'
    language = 'en'

    oldest_article = 2
    max_articles_per_feed = 15
    no_stylesheets = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}

    conversion_options = {
        'publisher': publisher
    }

    masthead_url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Le_monde_logo.svg/800px-Le_monde_logo.svg.png'

    feeds = [
        ('Frontpage', 'https://www.lemonde.fr/en/rss/une.xml'),
        ('International', 'https://www.lemonde.fr/en/international/rss_full.xml'),
        ('Politics', 'https://www.lemonde.fr/en/politics/rss_full.xml'),
        ('France', 'https://www.lemonde.fr/en/france/rss_full.xml'),
        ('Economy', 'https://www.lemonde.fr/en/economy/rss_full.xml'),
        ('Environment', 'https://www.lemonde.fr/en/environment/rss_full.xml'),
        ('Science', 'https://www.lemonde.fr/en/science/rss_full.xml'),
        ('Pixels', 'https://www.lemonde.fr/en/pixels/rss_full.xml'),
        ('Culture', 'https://www.lemonde.fr/en/culture/rss_full.xml'),
        ('Opinion', 'https://www.lemonde.fr/en/opinion/rss_full.xml'),
        ('Our Times', 'https://www.lemonde.fr/en/our-times/rss_full.xml'),
    ]

    keep_only_tags = [
        classes('article__header'),
        dict(name='section', attrs={'class': ['article__content', 'article__heading',
                                              'article__wrapper']})
    ]

    remove_tags = [
        classes('article__status meta__date meta__reading-time meta__social multimedia-embed'),
        dict(name=['footer', 'link']),
        dict(name='img', attrs={'class': ['article__author-picture']}),
        dict(name='section', attrs={'class': ['article__reactions', 'author', 'catcher',
                                              'portfolio', 'services-inread']})
    ]

    remove_attributes = [
        'data-sizes', 'height', 'sizes', 'width'
    ]

    preprocess_regexps = [
        # insert space between author name and description
        (re.compile(r'(<span class="[^"]*author__desc[^>]*>)([^<]*</span>)',
                    re.IGNORECASE), lambda match: match.group(1) + ' ' + match.group(2)),
        # insert " | " between article type and description
        (re.compile(r'(<span class="[^"]*article__kicker[^>]*>[^<]*)(</span>)',
                    re.IGNORECASE), lambda match: match.group(1) + ' | ' + match.group(2))
    ]

    extra_css = '''
        h2 { font-size: 1em; }
        h3 { font-size: 1em; }
        .article__desc { font-weight: bold; }
        .article__fact { font-weight: bold; text-transform: uppercase; }
        .article__kicker { text-transform: uppercase; }
        .article__legend { font-size: 0.6em; margin-bottom: 1em; }
        .article__title { margin-top: 0em; }
    '''

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://secure.lemonde.fr/sfuser/connexion')
            br.select_form(nr=0)
            br['email'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        # skip articles without relevant content (e.g., videos)
        for el in 'blog chat live podcasts portfolio video visuel'.split():
            if '/' + el + '/' in url:
                self.log(url)
                self.abort_article()
        return url

    def preprocess_html(self, soup):
        # when an image is available in multiple sizes, select the smallest one
        for img in soup.find_all('img', {'data-srcset': True}):
            data_srcset = img['data-srcset'].split()
            if len(data_srcset) > 1:
                img['src'] = data_srcset[-2]
                del img['data-srcset']
        return soup

    def postprocess_html(self, soup, first_fetch):
        # remove local hyperlinks
        for a in soup.find_all('a', {'href': True}):
            if '.lemonde.fr/' in a['href']:
                a.replace_with(self.tag_to_string(a))
        # clean up header
        for ul in soup.find_all('ul', {'class': 'breadcrumb'}):
            div = soup.new_tag('div')
            category = ''
            for li in ul.find_all('li', {'class': True}):
                category += self.tag_to_string(li).strip().upper() + ' - '
                div.string = category[:-3]
            ul.replace_with(div)
        return soup
PK�X�w5��le_monde_sub.png�PNG


IHDR  D���DPLTE����
 !,":-R@]HpWx]�q����ϡӤԥ٨ܫެ��������lTrYUB;.�uS@��\G^I_JaKbLcMeNhQiR����v\w\
{`~b�f�h�j�k�l�m#$�v�z�{�&3(6*������������Ęř=/C4קI9کL;ݬN=������Q?	����������YEZF[G�.FIDATx���Sc�@�Mζ�j۶m��⦆n7/�M�|I��EJ�����"�e��Q2^���{�ނJ�l����P7�&�l�
�af�,(M��s9�����*�X�9��@!ƃ}>��Bd#�j�~8߁6x
px�V�@�'�%6+0�[ b���M�@\�2pd���.3��T`}0��4���{zj��h/�
n��w`+6�[������ȍ�ʣԲڒ�})� �����zOf"�_��IEND�B`�PK�X��.j22le_monde_sub.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai
from __future__ import absolute_import, division, print_function, unicode_literals

__author__ = 'S. Durand <sylvaindurand@users.noreply.github.com>'
__license__ = 'GPL v3'

'''
lemonde.fr
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes
from datetime import date
import re


class LeMondeNumerique(BasicNewsRecipe):
    title = 'Le Monde: Édition abonnés'
    __author__ = 'Sylvain Durand'
    description = 'La version numérique du quotidien Le Monde'
    publisher = 'Société Editrice du Monde'
    publication_type = 'newspaper'
    needs_subscription = True
    language = 'fr'

    no_stylesheets = True
    ignore_duplicate_articles = {'title', 'url'}

    conversion_options = {
        'publisher': publisher
    }

    masthead_url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Le_monde_logo.svg/800px-Le_monde_logo.svg.png'

    lm_sections = [
        'international:International',
        'politique:Politique',
        'societe:Société',
        'economie:Éco',
        'culture:Culture',
        'idees:Idées',
        'planete:Planète',
        'sport:Sport',
        'sciences:Sciences',
        'pixels:Pixels',
        'campus:Campus'
    ]

    keep_only_tags = [
        classes('article__header'),
        dict(name='section', attrs={'class': ['article__content', 'article__heading',
                                              'article__wrapper']})
    ]

    remove_tags = [
        classes('article__status meta__date meta__reading-time meta__social multimedia-embed'),
        dict(name=['footer', 'link']),
        dict(name='img', attrs={'class': ['article__author-picture']}),
        dict(name='section', attrs={'class': ['article__reactions', 'author', 'catcher',
                                              'portfolio', 'services-inread']})
    ]

    remove_attributes = [
        'data-sizes', 'height', 'sizes', 'width'
    ]

    preprocess_regexps = [
        # insert space between author name and description
        (re.compile(r'(<span class="[^"]*author__desc[^>]*>)([^<]*</span>)',
                    re.IGNORECASE), lambda match: match.group(1) + ' ' + match.group(2)),
        # insert " | " between article type and description
        (re.compile(r'(<span class="[^"]*article__kicker[^>]*>[^<]*)(</span>)',
                    re.IGNORECASE), lambda match: match.group(1) + ' | ' + match.group(2))
    ]

    extra_css = '''
        h2 { font-size: 1em; }
        h3 { font-size: 1em; }
        .article__desc { font-weight: bold; }
        .article__fact { font-weight: bold; text-transform: uppercase; }
        .article__kicker { text-transform: uppercase; }
        .article__legend { font-size: 0.6em; margin-bottom: 1em; }
        .article__title { margin-top: 0em; }
    '''

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            try:
                br.open('https://secure.lemonde.fr/sfuser/connexion')
                br.select_form(nr=0)
                br['email'] = self.username
                br['password'] = self.password
                br.submit()
            except Exception as e:
                self.log('Login failed with error:', str(e))
        return br

    def get_cover_url(self):
        # today's date is a reasonable guess for the ID of the cover
        cover_id = date.today().strftime('%Y%m%d')
        soup = self.index_to_soup('https://www.lemonde.fr/')
        a = soup.find('a', {'id': 'jelec_link', 'style': True})
        if a and a['style']:
            url = a['style'].split('/')
            if len(url) > 5 and url[3].isdigit():
                # overwrite guess if actual cover ID was found
                cover_id = url[3]
        return 'https://www.lemonde.fr/thumbnail/journal/' + cover_id + '/1000/1490'

    def parse_index(self):
        ans = []
        for x in self.lm_sections:
            s, section_title = x.partition(':')[::2]
            self.log('Processing section', section_title, '...')
            articles = list(self.parse_section('https://www.lemonde.fr/%s/' % s))
            if articles:
                ans.append((section_title, articles))
        return ans

    def parse_section(self, url):
        soup = self.index_to_soup(url)
        for article in soup.find_all('section', {'class': 'teaser'}):
            # extract URL
            a = article.find('a', {'class': 'teaser__link', 'href': True})
            if a is None:
                continue
            url = a['href']
            # skip articles without relevant content (e.g., videos)
            for el in 'blog chat live newsletters podcasts portfolio video visuel'.split():
                if '/' + el + '/' in url:
                    url = None
                    break
            if url is None:
                continue
            # extract title
            h3 = article.find('h3', {'class': 'teaser__title'})
            if h3 is None:
                continue
            title = self.tag_to_string(h3)
            # extract description
            desc = ''
            p = article.find('p', {'class': 'teaser__desc'})
            if p is not None:
                desc = self.tag_to_string(p)
            self.log('\tFound article', title, 'at', url)
            yield {'title': title, 'url': url, 'description': desc}

    def preprocess_html(self, soup):
        # when an image is available in multiple sizes, select the smallest one
        for img in soup.find_all('img', {'data-srcset': True}):
            data_srcset = img['data-srcset'].split()
            if len(data_srcset) > 1:
                img['src'] = data_srcset[-2]
                del img['data-srcset']
        return soup

    def postprocess_html(self, soup, first_fetch):
        # remove local hyperlinks
        for a in soup.find_all('a', {'href': True}):
            if '.lemonde.fr/' in a['href']:
                a.replace_with(self.tag_to_string(a))
        # clean up header
        for ul in soup.find_all('ul', {'class': 'breadcrumb'}):
            div = soup.new_tag('div')
            category = ''
            for li in ul.find_all('li', {'class': True}):
                category += self.tag_to_string(li).strip().upper() + ' - '
                div.string = category[:-3]
            ul.replace_with(div)
        return soup
PK�X(ٌ��le_monde_sub_paper.png�PNG


IHDR  V%(	pHYs!�!��htEXtSoftwarewww.inkscape.org��<!IDAT8�c�O0���+�e����"3����ߋ��{Y�t�[ P�������8�������*�a��@�d�Dn GH��
T�����@�����20����ȫ����@��'10�t��zs
DAD�I����U�W�C9^���J�
��S�����?>�V/�)x����?������Q�X�{YA��P�#!�E��'H�<PL�,�
 
.+-�~g���
�2;�Nf�I0�Bo��9��D5w~Q�&ƾ4Y,-	&���IEND�B`�PK�XM���""le_monde_sub_paper.recipe#!/usr/bin/env  python

__license__ = 'GPL v3'
__copyright__ = '2012, 2013, Rémi Vanicat <vanicat at debian.org>'
'''
Lemonde.fr: Version abonnée
'''

import os, zipfile, re, time
from calibre.constants import preferred_encoding

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile


class LeMondeAbonne(BasicNewsRecipe):

    title = u'Le Monde: Édition abonnés papier'
    __author__ = u'Rémi Vanicat'
    description = u'Actualités'
    category = u'Actualités, France, Monde'
    publisher = 'Le Monde'
    language = 'fr'
    needs_subscription = True
    no_stylesheets = True
    smarten_punctuation = True
    remove_attributes = [
        'border', 'cellspacing', 'display', 'align', 'cellpadding', 'colspan',
        'valign', 'vscape', 'hspace', 'alt', 'width', 'height'
    ]
    extra_css = ''' li{margin:6pt 0}
                    ul{margin:0}

                    div.photo img{max-width:100%; border:0px transparent solid;}
                    div.photo{font-family:inherit; color:#333; text-align:center;}
                    div.photo p{text-align:justify;font-size:.9em; line-height:.9em;}

                    @page{margin:10pt}
                    .ar-txt {color:#000; text-align:justify;}
                    h1{text-align:left; font-size:1.25em;}

                    .auteur{text-align:right; font-weight:bold}
                    .feed{text-align:right; font-weight:bold}
                    .po-ti2{font-weight:bold}
                    .fen-tt{font-weight:bold;font-size:1.1em}
    '''

    zipurl_format = 'http://medias.lemonde.fr/abonnes/editionelectronique/%Y%m%d/html/%y%m%d.zip'
    coverurl_format = '/img/%y%m%d01.jpg'
    masthead_url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Le_monde_logo.svg/800px-Le_monde_logo.svg.png'
    path_format = "%y%m%d"

    keep_only_tags = [
        dict(name=['h1']),
        dict(name='div', attrs={'class': 'photo'}),
        dict(name='div', attrs={'class': 'po-ti2'}),
        dict(name='div', attrs={'class': 'ar-txt'}),
        dict(name='div', attrs={'class': 'po_rtcol'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'po-ti'}),
        dict(name='div', attrs={'class': 'po-copy'})
    ]

    article_id_pattern = re.compile("[0-9]+\\.html")
    article_url_format = 'http://www.lemonde.fr/journalelectronique/donnees/protege/%Y%m%d/html/'

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('https://secure.lemonde.fr/sfuser/connexion')
        br.select_form(name='connection')
        br['connection[mail]'] = self.username
        br['connection[password]'] = self.password
        br.submit()
        return br

    decalage = 24 * 60 * 60  # today Monde has tomorow date

    def get_cover_url(self):
        url = time.strftime(self.coverurl_format, self.ltime)
        return self.articles_path + url

    def parse_index(self):
        browser = self.get_browser()

        second = time.time()
        second += self.decalage

        for i in range(7):
            self.ltime = time.gmtime(second)
            self.timefmt = time.strftime(" %A %d %B %Y",
                                         self.ltime).decode(preferred_encoding)
            url = time.strftime(self.zipurl_format, self.ltime)
            try:
                response = browser.open(url)
                continue
            except Exception:
                second -= 24 * 60 * 60

        tmp = PersistentTemporaryFile(suffix='.zip')
        self.report_progress(0.1, _('downloading zip file'))
        tmp.write(response.read())
        tmp.close()

        zfile = zipfile.ZipFile(tmp.name, 'r')
        self.report_progress(0.1, _('extracting zip file'))

        zfile.extractall(self.output_dir)
        zfile.close()

        path = os.path.join(
            self.output_dir, time.strftime(self.path_format, self.ltime), "data"
        )

        self.articles_path = path

        files = os.listdir(path)

        nb_index_files = len([
            name for name in files if re.match("frame_gauche_[0-9]+.html", name)
        ])

        flux = []

        article_url = time.strftime(self.article_url_format, self.ltime)

        for i in range(nb_index_files):
            filename = os.path.join(path, "selection_%d.html" % (i + 1))
            with open(filename, 'rb') as tmp:
                soup = self.index_to_soup(tmp.read())
            title = soup.find('span').contents[0]
            if title == "Une":
                title = "À la une"
            if title == "Evenement":
                title = "L'événement"
            if title == "Planete":
                title = "Planète"
            if title == "Economie - Entreprises":
                title = "Économie"
            if title == "L'Oeil du Monde":
                title = "L'œil du Monde"
            if title == "Enquete":
                title = "Enquête"
            if title == "Editorial - Analyses":
                title = "Horizons"
            if title == "Le Monde Economie":
                title = "Économie"
            if title == "Lettre et chronique":
                title = "Idées"
            if title == "Le Monde Géo et politique":
                title = "Géopolitique"
            if title == "Météo - Jeux - Ecrans":
                title = "Économie & Entreprise"
            tmp.close()

            filename = os.path.join(path, "frame_gauche_%d.html" % (i + 1))
            with open(filename, 'rb') as tmp:
                soup = self.index_to_soup(tmp.read())
            articles = []
            for link in soup.findAll("a"):
                article_file = link['href']
                article_id = self.article_id_pattern.search(article_file).group()
                article = {
                    'title': link.contents[0],
                    'url': article_url + article_id,
                    'description': '',
                    'content': ''
                }
                articles.append(article)
            tmp.close()

            flux.append((title, articles))

        return flux


# Local Variables:
# mode: python
# End:
PK�X٘:.��le_nouvel_observateur.png�PNG


IHDR���RPLTE�1H�`r������������D>IDAT[c(�b��!A!f�B�"%�)��Je�e��,���%��l	@5!�A��)X��)�2�Z��IEND�B`�PK�X�>���le_nouvel_observateur.recipefrom __future__ import unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2013, Malah <malah at neuf dot fr>'
'''
Le Nouvel Observateur
'''

__author__ = '2013, Malah <malah at neuf dot fr>'

from calibre.web.feeds.news import BasicNewsRecipe


class LeNouvelObs(BasicNewsRecipe):
    title = u'Le Nouvel Observateur'
    __author__ = 'Malah'
    description = u'Actualités en temps réel, Info à la Une'
    oldest_article = 1
    language = 'fr'
    max_articles_per_feed = 25
    use_embedded_content = False
    ignore_duplicate_articles = ('title', 'url')
    remove_empty_feeds = True
    no_stylesheets = True
    masthead_url = u'https://upload.wikimedia.org/wikipedia/fr/f/f9/Le_Nouvel_observateur.png'
    feeds = [
        (u'Politique', u'http://tempsreel.nouvelobs.com/politique/rss.xml'),
        (u'Société', u'http://tempsreel.nouvelobs.com/societe/rss.xml'),
        (u'Monde', u'http://tempsreel.nouvelobs.com/monde/rss.xml'),
        (u'Economie', u'http://tempsreel.nouvelobs.com/economie/rss.xml'),
        (u'Culture', u'http://tempsreel.nouvelobs.com/culture/rss.xml'),
        (u'High Tech', u'http://obsession.nouvelobs.com/high-tech/rss.xml'),
        (u'Education', u'http://tempsreel.nouvelobs.com/education/rss.xml'),
        (u'Services', u'http://tempsreel.nouvelobs.com/services/rss.xml'),
        (u'Sport', u'http://tempsreel.nouvelobs.com/sport/rss.xml'),
        (u'CinéObs', u'http://cinema.nouvelobs.com/articles.rss'),
        (u'TéléObs', u'http://teleobs.nouvelobs.com/rss.xml'),
        (u'Autres Actualités', u'http://tempsreel.nouvelobs.com/rss.xml'),
    ]
    keep_only_tags = [
        dict(name='h1', attrs={'id': 'obs-article-title'}),
        dict(name='div', attrs={'class': 'obs-date'}),
        dict(name='div', attrs={'class': 'art-auteur'}),
        dict(name='h2', attrs={'class': 'obs-article-intro'}),
        dict(name='div', attrs={'id': 'obs-article-keywords'}),
        dict(name='div', attrs={'id': 'obs-article-mainpic'}),
        dict(name='div', attrs={'itemprop': 'articleBody'}),
        dict(name='img', attrs={'id': 'ObsImg'}),
        dict(name='p', attrs={'class': 'date-media'}),
        dict(name='p', attrs={'id': 'ObsDesc'}),
    ]
PK�X�n�
�
le_peuple_breton.png�PNG


IHDR**J�^	pHYsNNw�#
�IDATX	���^wu�s�w��}�w�O<���%�� !!I�BIڂ�H��V�OU��V��uMK)вS
�R�@���vLO�=�;����~�s�����\ݟ�GGz�tσ"o�a涍�Qs����5�ٍ��~gj�--��:��W;�����ķ3�m�!�R���s���^��ng�L[@11Ќd�����|�s���w���ԠZ�����
�{�ƿ�<�{k�hѲ��l�4"*ŚZœ�g�Y�\�3ٝ^w��C�����z��ߙ�M=�ti�g���K�4�M�Iض��`�$D�&1<JԚ��&B�/�%��+��||��s'����E���~�����ƜQ����р�ɚ�j䨘QD1��
qd(�N�*�g�K�'�����>���o�i�wΟy���7��*��RPX	#
ATL\�`"�H0F$&O��VB��Lt���o9�����}��t~�k�Կ������|�˧����`^��rb0Q)��m~s��~	����\� e��ae뭫�X����f~3�&�_����}�gVE�@ho� "��@$��)��H�n�@ `�.\��m�����7
<�ԟR��xq��s��8s��[�9;o%$
�
��(
QE8i��a ,��h)T*�DE��A�����ų�08�6�����$�~c�/��gl� ۖE��ckb f�@�'Zra[k�Z��%
"�k���V)� �	�ƒBm�R����7_9s�|�20��~w��3g�}�b�][�����	`T�!y$L�ڷ"�IԌ�(Ӷ�@���
��FT�H���=,��Uӯq��W׾q�_���->��O^��>�An_J�U� ��4����L�ޘ��3J��A�N�j�KZ�ܳr�z�枔2�ԙ�ۦ�x���ˇ��h��ܵ>?{�r��@��|�v��}��4�,CWe.��{��h]��߆��tgc�Zcc��NP�`oeey���=���FY����sgL�a�PB���~e��o/ΒN��K��{O߭=
�ͥK��~��v�M]�	�g\f^�[�C�G��i��n&�t���4�D���q�dw!�;)Y���t|��"x,���P����_��Ym�az}k����ܭ��p&E���F'��<��8�{c��M����P/�YӢ��*L���F���i	EpV�U#
�����+G��(�7�v_zyp�q��/&��\ٻA0�AQ��y|n|�8��l|*�|>�"m��Pt�}]��ltS�|��̋�Y���☒�,�GV[N�,���<�83~�
�?�'?��p�m��G�_���dVdJ����b���e���ERu��i��K� ?�st���5��f �h"4����k�Ͽب�O<��g>-s=��y&-�4�^c'�^r�;z|m3�ޥ�dž`�܎]��
����j�pL���7a�
��j� ����Y���X�\f3�V�UC>k�G��/1�6�:��ݡ�����u^��B�Q�r�Q��e�fX;:����n@�U�U�Ƙ0��B��	�� (fa�N����eq���i&��E�iP�DU�0�fZ���@���]�܉q̖��H�N�����֝�ZG&�S�	Q
,Qa@���S���}�S��V/.CAP'�/��<����26&*P(KM���^��JA�
1)�6ꭺnF#?[LU�OR�T;��i���4CdF�N���6
l�����O���n*v0����H�n� 	�� ɠR�DH:)���"�1��W���M��$L+�
���r���Z��.� =�ɔ�<WK�W��w�/]�Y��
Fa�j�47!b�Z�u�bG4f�����i���!J$½�-5X0�κ�Y�sҳ�6A*�~�B��M�cGw�S�[~���f������E�)

�>M�jZJ;Tn��\���2ĖIU�׭�P�H�S��(�L5:iy��z��b���1и�����_.u�?����_�A�����;|��lB.vq����q�rRտ��ܪ˝��B)�WER�����pZ˝s��͡R�Cj��ǹ�
���^b-��:(d��n�O��yM�V�]o�&I𵢪Pj�����zq�N��F�j�Io�R��tVVH-yj���p0O�,�w�92}�)6�1&"#4k�����=�Hr�Σ1�-j+i�Qh�5��?���R��Isac-�'�|Ǥ��eNz�����mw>s��hvc�8,�(�~�Z���$��. (e��ڡ��_���5�ϯ���A5��{ۡ,(H{����5�K�:����}����CI26i�N�M��K�6K�ip���K���c�`��<#�<Ch�X���/H�)����D�ckg���k�5Tc��y�~�i��h46ϻ^:гۿ8d
�6H��i�n�Q�J���jEh@��Z��	�HFRn)��FI!��[����[���TU��c����;�{?��w��Gۼr�K��2b�b@#U�"9�AG+aU=J�t��Q�����_���QSSd=���3!M�tw�_W�_X��^����#�Q��}��^�V�.#��ɂ%����?һcf�IԂ�v&F���o��;�.�d��Vgi��KF��\����ݲ�����{߉��*������랕�?<>���I�#��N�T4��s�L�r'��ȶE#D���i.]�^��H����z-�E�(�CiR=��OekG��-@�z����/�V܏.�!�!(H3�f!��*�1�D�(���	uu �уJ�8��p!�#
�tH��B��{�>�1*�_=3�z'����6o�����	V��I��B'��=�`�X� zR�D�I�2��b0D���x�*���f�N�����1 ��+Ӥ��#�v��}�qo�U�>`}�ʢQ ,�N#zE�4
k%"�6*%���I"
e�J�;	�Z���Ou� X��o<�z�|b!�Ϝ��9=��"D`֚���� 3�!�@�۬f�"��D0I��='6mN����?Z~������o��W/~�s?��z�0�`!�b�7�l� �B!��� 0���M���qn|���٥�~��}@���F�Nn��ܥ3��+��;�l����L'�"� 1��"bD�$��@ܴAT��&�����'�>�E�;�+��j㵛�������q�e�	`$�
�FEH�*������vl|>��c��Z����uL��O����W/}���^�nm�>i+�w�ER����8�}�LMb��?���9�N���b-�v2����^_�,ׯ�7o@� D�Q��Y6�4�H�N�=pᄏ��+�낢w��I��˲��{{��ϓ�O���l��.��@�ϩn�~���qP��&��IEND�B`�PK�Xū`..le_peuple_breton.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
# author:  <lionel.plais@ilp-web.net>


class LePeupleBreton(BasicNewsRecipe):
    title = 'Le Peuple Breton'
    __author__ = 'Lionel Plais'
    description = u'Aujourd\'hui, être libre c\'est être informé'
    oldest_article = 90
    language = 'fr'
    cover_img_url = 'http://lepeuplebreton.bzh/wp-content/uploads/2017/11/le-peuple-breton-logo.jpg'
    masthead_url = cover_img_url
    remove_javascript = True
    no_stylesheets = True

    keep_only_tags = [
        dict(name='article'),
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['share-post', 'juiz_sps_links', 'counters_both', 'juiz_sps_displayed_bottom']}),
    ]

    feeds = [
        (u'À la Une', u'http://lepeuplebreton.bzh/category/a-la-une/feed/'),
        (u'Bretagne', u'http://lepeuplebreton.bzh/category/themes/bretagne/feed/'),
        (u'France', u'http://lepeuplebreton.bzh/category/lieu/france/feed/'),
        (u'International', u'http://lepeuplebreton.bzh/category/lieu/international-fr/feed/'),
        (u'Point de vue', u'http://lepeuplebreton.bzh/category/themes/point-de-vue/feed/'),
        (u'Économie', u'https://lepeuplebreton.bzh/category/themes/economie/feed/'),
        (u'Écologie', u'http://lepeuplebreton.bzh/category/themes/ecologie/feed/'),
        (u'Santé', u'http://lepeuplebreton.bzh/category/themes/sante/feed/'),
        (u'Culture & Sport', u'http://lepeuplebreton.bzh/category/themes/culture/feed/'),
    ]

    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
PK�X��]�ttle_temps.png�PNG


IHDR  D����PLTE�+�+޷��,������Ȉ�Ā��[jˎ��`n��|��}��+=�-?�AR�BR�,�^l�^m�,�w��-�.�/ł�ȇ�ȇ��/�2ϗ�Ҟ�Ӡ�Ԣ�ԣ�ت�ث�٬�٬�ܵ�ݷ��2޹�ߺ�� 3�����!5����"5G�G�IDATx��Ӄڃ`�W�~�����-��=���#pC�P%���c�ư��ޔH���"���+nt��-���2��4�d��9�a�?�Y����w��a�����	Hr޶.0+~
��%����G��4sV�ӣ��=��(���IEND�B`�PK�X�Ԇ4##le_temps.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
# License: GPLv3 Copyright: 2009, Kovid Goyal <kovid at kovidgoyal.net>

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 LeTemps(BasicNewsRecipe):
    title = u'Le Temps'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = 'Kovid Goyal'
    description = 'French news. Needs a subscription from https://www.letemps.ch'
    no_stylesheets = True
    remove_javascript = True
    encoding = 'UTF-8'
    language = 'fr'
    needs_subscription = True
    use_embedded_content = False
    remove_empty_feeds = True

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('https://www.letemps.ch/user/login')
        br.select_form(action='/user/login')
        br['name'] = self.username
        br['pass'] = self.password
        raw = br.submit().read()
        if b'href="/subscribe"' in raw:
            raise ValueError(
                'Failed to login to letemps.ch. Check '
                'your username and password'
            )
        return br

    keep_only_tags = [
        classes('picture-cover article-content'),
    ]

    remove_tags = [
        dict(name=['button', 'source']),
        classes('share related-news'),
    ]

    feeds = [
        (u'Actualité', u'https://letemps.ch/rss/site/'),
        (u'Actualité - Monde', u'https://letemps.ch/rss/site/actualite/monde'),
        (
            u'Actualité - Suisse & régions',
            u'https://letemps.ch/rss/site/actualite/suisse_regions'
        ), (u'Actualité - Sport', u'https://letemps.ch/rss/site/actualite/sports'),
        (
            u'Actualité - Sciences & Environnement',
            u'https://letemps.ch/rss/site/actualite/sciences_environnement'
        ),
        (
            u'Actualité - Multimédia',
            u'https://letemps.ch/rss/site/actualite/multimedia'
        ),
        (u'Actualité - Société', u'https://letemps.ch/rss/site/actualite/societe'),
        (
            u'Actualité - Société | Quoi de neuf',
            u'https://letemps.ch/rss/site/actualite/societe/quoi_de_neuf'
        ), (u'Economie & Finance', u'https://letemps.ch/rss/site/economie_finance'),
        (
            u'Economie & Finance - Finance',
            u'https://letemps.ch/rss/site/economie_finance/finance'
        ),
        (
            u'Economie & Finance - Fonds de placement',
            u'https://letemps.ch/rss/site/economie_finance/fonds_placement'
        ),
        (
            u'Economie & Finance - Carrières',
            u'https://letemps.ch/rss/site/economie_finance/carrieres'
        ), (u'Culture', u'http://letemps.ch/rss/site/culture'),
        (u'Culture - Cinémas', u'https://letemps.ch/rss/site/culture/cinema'),
        (u'Culture - Musiques', u'https://letemps.ch/rss/site/culture/musiques'),
        (u'Culture - Scènes', u'https://letemps.ch/rss/site/culture/scenes'),
        (
            u'Culture - Arts plastiques',
            u'https://letemps.ch/rss/site/culture/arts_plastiques'
        ), (u'Culture - Livres', u'https://letemps.ch/rss/site/culture/livres'),
        (u'Lifestyle - Luxe', u'https://letemps.ch/rss/site/lifestyle/luxe'),
        (u'Lifestyle - Mode', u'https://letemps.ch/rss/site/lifestyle/mode'),
        (
            u'Lifestyle - Horlogerie & Joaillerie',
            u'https://letemps.ch/rss/site/lifestyle/horlogerie_joaillerie'
        ), (u'Lifestyle - Design', u'https://letemps.ch/rss/site/lifestyle/design'),
        (u'Lifestyle - Voyages', u'https://letemps.ch/rss/site/lifestyle/voyages'),
        (
            u'Lifestyle - Gastronomie',
            u'https://letemps.ch/rss/site/lifestyle/gastronomie'
        ),
        (
            u'Lifestyle - Architecture & Immobilier',
            u'https://letemps.ch/rss/site/lifestyle/architecture_immobilier'
        ),
        (
            u'Lifestyle - Automobile',
            u'https://letemps.ch/rss/site/lifestyle/automobile'
        ), (u'Opinions', u'http://letemps.ch/rss/site/opinions'),
        (
            u'Opinions - Editoriaux',
            u'https://letemps.ch/rss/site/opinions/editoriaux'
        ), (u'Opinions - Invités', u'https://letemps.ch/rss/site/opinions/invites'),
        (
            u'Opinions - Chroniques',
            u'https://letemps.ch/rss/site/opinions/chroniques'
        ),
        (u'Opinions - Chappatte', u'https://letemps.ch/rss/site/opinions/chappatte')
    ]
PK�X/g�<<ledevoir.png�PNG


IHDR��h6IDATx�c���#I��?���8w�\iiILL��ի�.]��Ç�}}�[�nmݺ���OOO/(0���6`��@JSS���:%%�۷o�NB�����ƍ7nDq��`aKKK311�۷�'�;�ÇQ��?2�8	�b����
�9�Ǐ�����Cuҿ���~��1P����|N:z����'>'��9���'��<e2����h��~~�f��&N���>�"L
��޻O"9���}�&��IEND�B`�PK�X{v�..ledevoir.recipe__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini and Olivier Daigle'
__copyright__ = '2012, Lorenzo Vigentini <l.vigentini at gmail.com>, Olivier Daigle <odaigle _at nuvucameras __dot__ com>'
__version__ = 'v1.01'
__date__ = '17, March 2013'
__description__ = 'Canadian Paper '

'''
http://www.ledevoir.com/
'''

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 ledevoir(BasicNewsRecipe):
    author = 'Lorenzo Vigentini'
    description = 'Canadian Paper. A subscription is optional, with it you get more content'

    cover_url = 'http://www.ledevoir.com/images/ul/graphiques/logo_devoir.gif'
    title = u'Le Devoir '
    publisher = 'leDevoir.com'
    category = 'News, finance, economy, politics'

    language = 'fr'
    encoding = 'utf-8'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 1
    max_articles_per_feed = 50
    min_articles_per_feed = 0
    use_embedded_content = False
    needs_subscription = 'optional'

    compress_news_images = True
    compress_news_images_auto_size = 4

    remove_javascript = True
    no_stylesheets = True
    remove_empty_feeds = True

    keep_only_tags = [
        dict(name='h1'),
        dict(attrs={'class': 'col-xs-14 col-sm-7 col-md-9 col-lg-10'}),
    ]
    remove_tags = [
            classes('category-nav social')
    ]

    feeds = [
        (u'A la une', 'http://www.ledevoir.com/rss/manchettes.xml'),
        (u'Édition complete',
         'http://feeds2.feedburner.com/fluxdudevoir'),
        (u'Opinions', 'http://www.ledevoir.com/rss/opinions.xml'),
        (u'Chroniques', 'http://www.ledevoir.com/rss/chroniques.xml'),
        (u'Politique', 'http://www.ledevoir.com/rss/section/politique.xml?id=51'),
        (u'International',
         'http://www.ledevoir.com/rss/section/international.xml?id=76'),
        (u'Culture', 'http://www.ledevoir.com/rss/section/culture.xml?id=48'),
        (u'Environnement',
         'http://www.ledevoir.com/rss/section/environnement.xml?id=78'),
        (u'Societe', 'http://www.ledevoir.com/rss/section/societe.xml?id=52'),
        (u'Economie', 'http://www.ledevoir.com/rss/section/economie.xml?id=49'),
        (u'Sports', 'http://www.ledevoir.com/rss/section/sports.xml?id=85'),
        (u'Art de vivre',
         'http://www.ledevoir.com/rss/section/art-de-vivre.xml?id=50')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('http://www.ledevoir.com/auth/login')
            br.select_form(action='/auth/login')
            br['login[courriel]'] = self.username
            br['login[password]'] = self.password
            br.submit()
        return br
PK�X���x44	leduc.png�PNG


IHDR  ��tRNSn��	pHYs���IDATHǭ�ߋ�F��.!�0��2	3�0	YtA�VK�Z�R(m�+���m�|�E
}�[����ݻ?����j+V���#zf��z-ۻ���a���=��X�`�f�<��+�Q�o\kJ�1�]��U�i�"��h�\L�J#�Ul�b��Z�c���S|��ϙ [��-U^�k�P��n*��T�S�WH�;�D����q�5�%ź�\Uź*���UE���ͼ3!`A�T	��bS�-IJ�H�o��y5��>��e���*~�tG�_���Vd�&��}��>1��-�a�[�ޓdO��E�X[��$xv>�F��,����N������S�>��3I.��{y���( ��g��7�?Ut�HgM�.W�x�6�0v=1��td��%�0�����$y��$?0��;d�$�`�خ˯�8��q�a�~]�.-S`�7��gl�x��
��zۨ����Z���q�>#�j��MS���mI~��1Xl�wM'�gK��V|�fo��Ⱦm�����tk�^�U���Yke:N,6d1�zB��1�X�TY��uh��
�oI6/�~�6��_i_���Mn`�6�F{�����D98���4|���.�tN�;U�U�ͪ���i�Œ,A�y��� @��;:�G�#��i�1�}�}�@ض�y�R��ُ��S���5�׈�1�?��Tt���!��I�0��� ���C�*�y�C����Ki�U]��o*u��C��4)Ia�aEqz�oi�k���b	�
� II��𢬄<^7'gO�y���g^�A�ږkۇ��y��T0>S7�O��=>�y�n�1�dm"�
Y��^;ʼn��1�G�1��+^ζ��vXS��B�����a˜񦙁����#/7E�_��r���FU��?�4�r'	O�Ab!��H��#�fx9�4�~0,��(nM}� ����_�:o��x�IEND�B`�PK�X"6yQ

leduc.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1292550626(BasicNewsRecipe):
    title = 'Leduc - Wetaskiwin Pipestone Flyer'
    __author__ = 'Brian Hahn'
    description = '''Provides news from central Alberta, Canada.  This is a
 weekly publication that provides coverage from the Cities of Leduc and
 Wetaskiwin, including news from two complete counties, plus the towns and
 villages within.  The counties of Leduc and Wetaskiwin provide news
 coverage of agriculture, sports, government, family, events and opinion.
 This publication updated weekly every Thursday.'''
    oldest_article = 13
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    publisher = 'Pipestone Publishing'
    category = 'News, Alberta, Canada'
    language = 'en_CA'
    encoding = 'iso-8859-1'
    cover_url = 'http://www.pipestoneflyer.ca/images/calibre-cover.jpg'
    remove_tags_before = dict(id='ContentPanel')
    remove_tags_after = dict(id='ContentPanel')
    remove_tags = [dict(name='div',
                        attrs={'id': 'StoryNav'}), dict(name='div',
                                                        attrs={'id': 'BottomAds'}), dict(name='div', attrs={'id': 'MoreStoryLinks'})]
    extra_css = 'img { margin:5px }'
    feeds = [
        ('Feature', 'http://www.pipestoneflyer.ca/Feature.rss'),
        ('Editors Desk', 'http://www.pipestoneflyer.ca/Editor%27s%20Desk.rss'),
        ('Letters', 'http://www.pipestoneflyer.ca/Letters.rss'),
        ('A Loco Viewpoint',
         'http://www.pipestoneflyer.ca/A%20Loco%20Viewpoint.rss'),
        ('Lifes Doorway', 'http://www.pipestoneflyer.ca/Life%27s%20Doorway.rss'),
        ('From the Otherside',
         'http://www.pipestoneflyer.ca/From%20the%20Otherside.rss'),
        ('Opinion', 'http://www.pipestoneflyer.ca/Opinion.rss'),
        ('Community', 'http://www.pipestoneflyer.ca/Community.rss'),
        ('Sports', 'http://www.pipestoneflyer.ca/Sports.rss'),
        ('Chambers', 'http://www.pipestoneflyer.ca/Chambers.rss'),
        ('Government', 'http://www.pipestoneflyer.ca/Government.rss'),
        ('Travel ', 'http://www.pipestoneflyer.ca/Travel%20.rss'),
        ('Environment', 'http://www.pipestoneflyer.ca/Environment.rss'),
        ('Health', 'http://www.pipestoneflyer.ca/Health.rss'),
        ('Funnies', 'http://www.pipestoneflyer.ca/Funnies.rss'),
        ('Events', 'http://www.pipestoneflyer.ca/Events.rss'),
        ('Faith', 'http://www.pipestoneflyer.ca/Faith.rss'),
        ('News and Views', 'http://www.pipestoneflyer.ca/News%20and%20Views.rss'),
        ('Obituaries', 'http://www.pipestoneflyer.ca/Obituaries.rss'),
        ('Police Blotter', 'http://www.pipestoneflyer.ca/Police%20Blotter.rss'),
        ('Careers', 'http://www.pipestoneflyer.ca/Careers.rss'),
    ]
PK�X���͇�
lega_nerd.png�PNG


IHDR(-S�PLTEp�Xp�Xp�Xp�Xp�Xp�X9�K:�M:�M;�M;�M<�O<�P?�SD�YF�\I�_K�bM�dM�eN�fc�se�up�XqȀsɃtɅuɅwʇxˉ΍�є��p��s�ڪ�ۯ�߷�勱厳搷㿹ᖽ晽皿�����������0�tRNS`{~����p��IDATx�MȃQEщ��m�_�Z�s��n]OD/O�4�.t��C՝���Jj,�c��`��y�p�	,Xg��ɲZD0&С3���	4dA�ASm����6����|��<_���~>��g�ҭx*nt��$^JJ�Lt��[��(�C`ܟIEND�B`�PK�X�g����lega_nerd.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1326135232(BasicNewsRecipe):
    title = u'Lega Nerd'
    description = 'nerd / geek culture, pc, comics, music, culture'
    language = 'it'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Lega Nerd', u'http://feeds.feedburner.com/LegaNerd')]
    __author__ = 'faber1971'


__version__ = 'v1.0'
__date__ = '9, January 2011'
PK�X�.]���
legeartis.png�PNG


IHDR�a_IDATx�b@�d�1`��84��*{���-q)qwZ��ݝu�L���c�G�⏌�ɳ��<�'J�$I�%����������^�==0�		p]]�158��`���el��sg1U8��dR����a�(����	^`�X���V�c�������Pһ^`�وǎ�d��QQظ����W��T�	q��"kxhkSbv;��V@X��0�	\.q[T;11`����sO
,K���	<�*p=>R�Z����t�q��G�WV��KJ���Ѐs��T�	A �uu(`�o�+���	�^^��18��(�
n7��������q��h�Q^�,��0�����^x�2nɈ�FIEND�B`�PK�X����legeartis.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
'''
czasopismo.legeartis.org
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LegeArtisRecipe(BasicNewsRecipe):
    __author__ = 'Mori, Tomasz D\u0142ugosz'
    language = 'pl'

    title = u'Lege Artis'
    publisher = u'Olgierd Rudak'
    description = u'Prawie wszystko, co chcieliby\u015bcie wiedzie\u0107 o prawie, ale wstydzili\u015bcie si\u0119 zapyta\u0107'

    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    extra_css = '''
            img{clear: both;}
    '''

    feeds = [
        (u'Lege Artis', u'http://czasopismo.legeartis.org/feed')
    ]
PK�X,��llleggo_it.png�PNG


IHDR��h63IDATx�M��o�a���|��Li\��TƸD�X	A,$V,�mB\C�&�DdB""�E7"iI+�膅�������vf���XL+=9�srr��� ��.�@af@D<�l�Ȓe��r���Ą&.q>�ܼ�LЈ�:<��ܺM��jO���N=y��"�v�E�I7���Ů�<İb���}�ʃ��g�-��iLf7�;�����k|���?j>���FS!�~�!@�t|L��+��doߕ�B�����7ȼ�������v�9���&��d�`Ӡ���������y:�;mdD�%߾kSu����"(d�C��!_��/h��#��ޖi�ȇ��j����7�U�@:J�M�B$��B�}��wҕ:�,+1L���\��ش9��XY�q�H��/X!�F�����t�^���QI��Gv��
"d�C�R��g�b����H׭m
N��h�8�>��u���8�so�!kB�ΧI"�<{Y�o�x5�w�b��'g�LE��Hhf��o�Y��*$ϟψFf�A;ѹ�,�2m�IEND�B`�PK�X\�
		leggo_it.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gabriele Marini, based on Darko Miletic'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
description = 'Italian daily newspaper - v1.00 05-05-2010'

'''
http://www.leggo.it
'''
import time
from calibre.web.feeds.news import BasicNewsRecipe


class LeggoIT(BasicNewsRecipe):
    __author__ = 'Gabriele Marini'
    description = 'Italian Free daily newspaper'

#    cover_url      = 'http://www.leggo.it/img/logo-leggo2.gif'
    title = u'Leggo.it'
    publisher = 'Ced Caltagirone Editore S.p.A.'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 5
    max_articles_per_feed = 100
    use_embedded_content = False
    recursion = 100

    no_stylesheets = True
    remove_javascript = True
    conversion_options = {'linearize_tables': True}

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'nero22'}),
        dict(name='div', attrs={'id': 'testodim'})
    ]
    feeds = [
        (u'Home Page', u'http://www.leggo.it/rss/home.xml'),
        (u'Italia', u'http://www.leggo.it/rss/italia.xml'),
        (u'Esteri', u'http://www.leggo.it/rss/esteri.xml'),
        (u'Economia', u'http://www.leggo.it/rss/economia.xml'),
        (u'Sport', u'http://www.leggo.it/rss/sport.xml'),
        (u'Gossip', u'http://www.leggo.it/rss/gossip.xml'),
        (u'Spettacoli', u'http://www.leggo.it/rss/spettacoli.xml'),
        (u'Salute', u'http://www.leggo.it/rss/salute.xml'),
        (u'Scienza', u'http://www.leggo.it/rss/scienza.xml')
    ]

    def get_cover_url(self):
        cover = None
        st = time.localtime()
        year = str(st.tm_year)
        month = "%.2d" % st.tm_mon
        day = "%.2d" % st.tm_mday
        cover = 'http://www.leggo.it/' + year + month + day + '/jpeg/LEGGO_ROMA_1.jpg'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover)
        except:
            cover = 'http://www.leggo.it/' + year + month + day + '/jpeg/LEGGO_ROMA_3.jpg'
            br = BasicNewsRecipe.get_browser(self)
            try:
                br.open(cover)
            except:
                self.log("\nCover unavailable")
                cover = 'http://www.leggo.it/img/logo-leggo2.gif'
        return cover
PK�X鈹��legitymizm.png�PNG


IHDR�a�IDATxڕ���A�/jlֶm�j7jP۶ۘ�۠�����3���O�&_2�ݙ�װz �auE�1c(�����kPM���˛�hz��2f�܉�hVG����_Z
hzH�_�{2P��k�^�@�7�M�;b7<�Q�@œ��ݰJ9k����
�O'w�g@�cƎ��c1��?�;��,<c���5��+o�z�mZ��;7�9c��	�nj����3��j�t��޼���r��r�zhz���x~$tm�v
-������MO�;x,�P�	'B�q�j*�_c�ܾhzax,�P��/ۇ�.��]�td*���<��vn����+��@�=�]����۲nO��q��Q���X@TUܼ:2�w�䒋g�����1��Pb���Rr�؜��^@���,&�/�O�Ym�IEND�B`�PK�X�MNw
w
legitymizm.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = u'2010, Tomasz Dlugosz <tomek3d@gmail.com>'
'''
legitymizm.org
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Legitymizm(BasicNewsRecipe):
    title = u'Organizacja Monarchist\xf3w Polskich'
    description = u'Portal legitymistyczny'
    language = 'pl'
    oldest_article = 7
    __author__ = u'Tomasz D\u0142ugosz'
    max_articles_per_feed = 100
    cover_url = 'http://www.legitymizm.org/img_omp/logo.gif'
    no_stylesheets = True

    feeds = [(u'Aktualno\u015bci i publicystyka',
              u'http://www.legitymizm.org/rss.php')]

    keep_only_tags = [dict(name='div', attrs={'id': 'szeroka_kolumna'})]
    remove_tags = [dict(name='div', attrs={'class': 'koniec_tresci_wlasciwej'}),
                   dict(name='div', attrs={'class': 'return'})]

    extra_css = '''
        body { font-family: Georgia, 'Times New Roman', Times, serif; }
        h1 { color: #898981; font-weight: normal; font-size: 26px; letter-spacing: -1px; line-height: 23px; text-align: left; }
        h2, h3 { font-weight: normal; font-size: 20px; line-height: 23px; letter-spacing: -1px; margin: 0 0 3px 0; text-align: left; }
        #szeroka_kolumna { float: left; line-height: 20px; }
        #szeroka_kolumna ul.wykaz { list-style-type: none; margin: 0 0 1.2em 0; padding: 0; }
        #szeroka_kolumna ul.wykaz li.wykaz_2 { font-weight: bold; margin: 0.6em 0 0 0; }
        #szeroka_kolumna ul.wykaz a { text-decoration: none; }
        #szeroka_kolumna ul.wykaz li.wykaz_1 { margin: 0 0 0 1.3em; }
        #szeroka_kolumna ul.wykaz li.wykaz_2 ul { margin: 0; padding: 0 0 0 1.3em; }
        #szeroka_kolumna h3.autor { background-color: #898981; color: #f9f9f8; margin: -25px 0px 30px 0; text-align: left; padding: 0 0 0 2px; }
        .tresc_wlasciwa { border-top: 1px solid #898981; padding: 30px 0px 0px 0px; position: relative; }
        #cytat { font-size: 11px; line-height: 19px; font-style: italic; text-align: justify; }
        #cytat img { width: 100px; height: 105px; float: right; margin: 3px 0 0 10px; }
        .duzy_cytat { padding: 20px 20px 10px 20px; margin: 0 0 1.2em 0; }
        #szeroka_kolumna img, #szeroka_kolumna object { padding: 3px; border: 1px solid #898981; }
        #szeroka_kolumna img.ilustracja { margin: 0px 10px 0 0; float: left; }
        p { margin: 0 0 1.2em 0; }
        #cytat p.sentencja { margin: 0; }
        #cytat p.sentencja:first-letter { font-size: 44px; line-height: 33px; margin: 0 2px 0 0; font-style: normal; float: left; display: block; }
        p.autor { text-transform: uppercase; color: #898981; font-style: normal; text-align: left; }
    '''
PK�XQE)��leipzer_volkszeitung.png�PNG


IHDR  ��tRNSn��>IDATxڭ��c��Ƨ-g5x�K�@���R[ww���{�������v���i�w�s�'�ͺ�Z`�w���\����2[I뀎��*�Re�K����{�R
��a~����%v�+>�Kþ�g�O�m?��N��Qoz�?n�UW�H��[��+
���'ex�+���:�
<�T�M�g]�iX��M�X
��"b�51�5tTg��-���<M�n{��%5VR�\���<��^k�|���WG��?j���sWNN.�U�{;)X�z���o����T�w^D���M�%o�A��n�,6�:70K�#c�UK>�x͠���|숟a�I��7��W��e��5|����+4y�P�>n��a/�����s�:p�)�W���J�]
����ޯTw2�S���j*}0��n�PB�Xl�=|��}�����gk�,���������}Mơ�z3Sk��O�h�r�%6�e��D�9O���6��~��*����r}���w$���%�ARf-i�F��Z����E�Jmȗ�J͠�q �\���
<�I@�ڞy\�����IG8S��W$�Q��	d*�� `���Ti�nP�}(4|���,��Qo*��3Cv?�M��E���b�/x.k��1O�8���.�3�x���?��}�O�v��R�͛��E�g�YD"��~��m�_u��.��wǯ���d*5$cWY��>{t�-Bϱy�����P�v����<�=���Α���GA��	<S��yO}��>l�G�4���<����M����yO�D���{C#P�@�[��(l_����	UU��_j\�N�ߴ�q�RLU��d$��q��XC�)����+ո鹴�����˟��l�l[�+�������6��xo0�Bf�j{c�Qnb�0������{�5��d���P��V"8S�7[aON�c�*�z%�ư����~�.>��cq�����WFYI�YZl�wɧ���)*��D87?kj��IIg������Z�k��	@3���OA]��
3���?19OeY��Na�`�B�}�h}�ˀ�S�G,���u&b�'��)��sc�5Kɛ�e��@��?Xd\u�0��-7A����<ֵ$}�<��]���sg�es��U�^��f
j��_>�+��iw�nI!��ky���a{�t�a�B�;AS��$$"kSV�"ivj���%WT���s��dr���UzW�LE4�<��]�Q��-��b�~
z�S���ڞ���~��xXQ'�Mվ���/�8�+kލ�t�"'������g�IEND�B`�PK�Xz9���leipzer_volkszeitung.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe

'''Calibre recipe to convert the RSS feeds of the Leipziger Volkszeitung to an ebook.'''


class SportsIllustratedRecipe(BasicNewsRecipe):
    __author__ = 'a.peter'
    __copyright__ = 'a.peter'
    __license__ = 'GPL v3'
    language = 'de'
    description = 'Leipziger Volkszeitung Online RSS'
    version = 1
    title = u'Leipziger Volkszeitung Online RSS'
    timefmt = ' [%d.%m.%Y]'

    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    publication_type = 'newspaper'

    keep_only_tags = [dict(name='div', attrs={'class': 'article'})]
    remove_tags = [
        dict(name='div', attrs={'class': ['ARTICLE_MORE', 'clearfloat']})]

    feeds = [(u'Leipzig',           u'http://nachrichten.lvz-online.de/rss/leipzig-rss.xml'),
             (u'Mitteldeutschland',
              u'http://nachrichten.lvz-online.de/rss/mitteldeutschland-rss.xml'),
             (u'Brennpunkte',
              u'http://nachrichten.lvz-online.de/rss/brennpunkte-rss.xml'),
             (u'Polizeiticker',
              u'http://nachrichten.lvz-online.de/rss/polizeiticker-rss.xml'),
             (u'Boulevard',
              u'http://nachrichten.lvz-online.de/rss/boulevard-rss.xml'),
             (u'Kultur',            u'http://nachrichten.lvz-online.de/rss/kultur-rss.xml'),
             (u'Sport',             u'http://nachrichten.lvz-online.de/rss/sport-rss.xml'),
             (u'Regionalsport',
              u'http://nachrichten.lvz-online.de/rss/regionalsport-rss.xml'),
             (u'Knipser',           u'http://nachrichten.lvz-online.de/rss/knipser-rss.xml')]

    def get_masthead_url(self):
        return 'http://www.lvz-online.de/resources/themes/standard/images/global/logo.gif'
PK�XC�z��lemonde_dip.png�PNG


IHDR  D���0PLTE���""�33�DC�UT�fe�wvχ�֘�ܩ�㺺�����������I��IDATx��҅�PD��o��6�;��n��E�!�OveX�E82�K����4a]y"ٔ@&�P
��Пo����
V��[؂���;෠k���T�0�`He�����!=���	�T��IEND�B`�PK�X�a@B��lemonde_dip.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2011, Darko Miletic <darko.miletic at gmail.com>'
'''
mondediplo.com
'''

try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class LeMondeDiplomatiqueEn(BasicNewsRecipe):
    title = 'Le Monde diplomatique - English edition'
    __author__ = 'Darko Miletic'
    description = "Le Monde diplomatique is the place you go when you want to know what's really happening. This is a major international paper that is truly independent, that sees the world in fresh ways, that focuses on places no other publications reach. We offer a clear, considered view of the conflicting interests and complexities of a modern global world. LMD in English is a concise version of the Paris-based parent edition, publishing all the major stories each month, expertly translated, and with some London-based commissions too. We offer a taster of LMD quality on our website where a selection of articles are available each month."  # noqa
    publisher = 'Le Monde diplomatique'
    category = 'news, politics, world'
    no_stylesheets = True
    oldest_article = 31
    delay = 1
    encoding = 'utf-8'
    needs_subscription = True
    masthead_url = 'http://mondediplo.com/squelettes/pics/logo-30.gif'
    publication_type = 'magazine'
    PREFIX = 'http://mondediplo.com/'
    LOGIN = PREFIX + '2009/09/02congo'
    INDEX = PREFIX + strftime('%Y/%m/')
    use_embedded_content = False
    language = 'en'
    extra_css              = """
                                body{font-family: "Luxi sans","Lucida sans","Lucida Grande",Lucida,"Lucida Sans Unicode",sans-serif}
                                .surtitre{font-size: 1.2em; font-variant: small-caps; margin-bottom: 0.5em}
                                .chapo{font-size: 1.2em; font-weight: bold; margin: 1em 0 0.5em}
                                .texte{font-family: Georgia,"Times New Roman",serif} h1{color: #990000}
                                .notes{border-top: 1px solid #CCCCCC; font-size: 0.9em; line-height: 1.4em}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.LOGIN)
        if self.username is not None and self.password is not None:
            data = urlencode({'login': self.username, 'pass': self.password, 'enter': 'enter'
                                     })
            br.open(self.LOGIN, data)
        return br

    keep_only_tags = [
        dict(name='div', attrs={'id': 'contenu'}), dict(
            name='div', attrs={'class': 'notes surlignable'})
    ]
    remove_tags = [dict(name=['object', 'link', 'script', 'iframe', 'base'])]
    remove_attributes = ['height', 'width', 'name', 'lang']

    def parse_index(self):
        articles = []
        soup = self.index_to_soup(self.INDEX)
        cnt = soup.find('div', attrs={'class': 'som_num'})
        for item in cnt.findAll('li'):
            description = ''
            feed_link = item.find('a', href=True)
            if feed_link is None:
                continue
            desc = item.find('div', attrs={'class': 'chapo'})
            if desc:
                description = desc.string
            url = self.PREFIX + feed_link['href'].partition('/../')[2]
            title = self.tag_to_string(feed_link)
            date = strftime(self.timefmt)
            articles.append({
                'title': title, 'date': date, 'url': url, 'description': description
            })
        return [(self.title, articles)]

    def get_cover_url(self):
        cover_url = None
        soup = self.index_to_soup(self.INDEX)
        cover_item = soup.find('div', attrs={'class': 'current'})
        if cover_item:
            ap = cover_item.find('img', attrs={'class': 'spip_logos'})
            if ap:
                cover_url = self.INDEX + ap['src']
        return cover_url

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll('a'):
            if item.string is not None:
                str = item.string
                item.replaceWith(str)
            else:
                str = self.tag_to_string(item)
                item.replaceWith(str)
        return soup
PK�X��z��lenta_ru.png�PNG


IHDR  V%(tRNSv��8	pHYs��jIDAT8�c`v����2����$pK�1��ߋ���/��z�U����_���
�S�A
T0����Ն�
WP���<8#��/f�� ��F~��a��J�B)ίN�IEND�B`�PK�X3���lenta_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1645563203(BasicNewsRecipe):
    title          = 'Lenta.ru - Новости'
    __author__ = 'MrBeef12'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True
    language = 'ru'

    feeds          = [
        ('Lenta.ru - Новости России и мира сегодня', 'https://lenta.ru/rss/'),
    ]
PK�X�q���lepoint.png�PNG


IHDR�acIDATx�b8���wTS�?�XK��Ű�*@�s��@�q�	 � �	(���ez��@�d���U�u˶z��0[ȆR�e�h~�E;�tg���{�o=?lV�eY��]jQ��;Ԡ�]�C����Za��}"�V ��Y����)�A�g���{��B�p!�f�:����oxf ���dR۵"}@��p�t���F��E5������\��b��,�	��|�y<H~]R��¡�\�Q�FQs8pe�kwL���t�xy����B�
<�R�pW�<�Q�,P��?�wE���xU�L�Z�]U!b1�r?�F�f�&防tBe�Qi��	_���@�T�����J>a�IEND�B`�PK�X^'�i

lepoint.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2011 Aurélien Chabot <contact@aurelienchabot.fr>'
'''
LePoint.fr
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class lepoint(BasicNewsRecipe):

    title = 'Le Point'
    __author__ = 'calibre'
    description = 'Actualités'
    encoding = 'utf-8'
    publisher = 'LePoint.fr'
    category = 'news, France, world'
    language = 'fr'

    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 15
    no_stylesheets = True
    remove_empty_feeds = True
    filterDuplicates = True

    extra_css = '''
                    h1 {font-size:xx-large; font-family:Arial,Helvetica,sans-serif;}
                    .chapo {font-size:xx-small; font-family:Arial,Helvetica,sans-serif;}
                    .info_article {font-size:xx-small; color:#4D4D4D; font-family:Arial,Helvetica,sans-serif;}
                    .media_article {font-size:xx-small; color:#4D4D4D; font-family:Arial,Helvetica,sans-serif;}
                    .article {font-size:medium; font-family:Arial,Helvetica,sans-serif;}
                '''

    remove_tags = [
        dict(name='iframe'),
        dict(name='div', attrs={'class': ['entete_chroniqueur']}),
        dict(name='div', attrs={'class': ['col_article']}),
        dict(name='div', attrs={'class': ['signature_article']}),
        dict(name='div', attrs={'class': ['util_font util_article']}),
        dict(name='div', attrs={'class': ['util_article bottom']})
    ]

    keep_only_tags = [dict(name='div', attrs={'class': ['page_article']})]

    remove_tags_after = dict(
        name='div', attrs={'class': ['util_article bottom']})

    feeds = [
        (u'À la une', 'http://www.lepoint.fr/rss.xml'),
        ('International', 'http://www.lepoint.fr/monde/rss.xml'),
        ('Tech/Web', 'http://www.lepoint.fr/high-tech-internet/rss.xml'),
        ('Sciences', 'http://www.lepoint.fr/science/rss.xml'),
        ('Economie', 'http://www.lepoint.fr/economie/rss.xml'),
        (u'Socièté', 'http://www.lepoint.fr/societe/rss.xml'),
        ('Politique', 'http://www.lepoint.fr/politique/rss.xml'),
        (u'Médias', 'http://www.lepoint.fr/medias/rss.xml'),
        ('Culture', 'http://www.lepoint.fr/culture/rss.xml'),
        (u'Santé', 'http://www.lepoint.fr/sante/rss.xml'),
        ('Sport', 'http://www.lepoint.fr/sport/rss.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def get_masthead_url(self):
        masthead = 'http://www.lepoint.fr/images/commun/logo.png'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(masthead)
        except:
            self.log("\nCover unavailable")
            masthead = None
        return masthead
PK�X�3��::lequipe.png�PNG


IHDR(-S5PLTE�	��������������	�
�
����
���$�(�)�*� ,� -�!-�!.�".�$0�)5�+7�/;�1<�2=�9D�:E�EO�FP�IS�V_�V`�[e�\e�^g�_h�dl�fn�iq�u}�v~�x��������������������������������������������������������������������������������������������������x~�IDAT�o/Ba�s�}�R���o2�P>2�;f�."��s��m�n
J�E9�]W�N���S�r�y��/ޗ���V���n?a��Zr3��x����	?��ƪ�$<�Yw�tK"^f��>�e&Q�%��PU$F�*:Ã�@2]�~_$�i��-r��t�����3H�U0��vAj���f�K�ê��IEND�B`�PK�X% eG��lequipe.recipe#!/usr/bin/env python

__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe


class leequipe(BasicNewsRecipe):
    title = u'l\'equipe'
    __author__ = 'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'fr'
    description = u'Retrouvez tout le sport en direct sur le site de L\'EQUIPE et suivez l\'actualité du football, rugby, basket, cyclisme, f1, volley, hand, tous les résultats sportifs'  # noqa
    oldest_article = 1
    masthead_url = 'http://static.lequipe.fr/v6/img/logo-lequipe.png'
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    recursions = 0

    keep_only_tags = []
    keep_only_tags.append(dict(attrs={'id': ['article']}))

    remove_tags = []
    remove_tags.append(dict(attrs={
                       'id': ['partage', 'ensavoirplus', 'bloc_bas_breve', 'commentaires', 'tools']}))
    remove_tags.append(dict(attrs={'class': ['partage_bis', 'date']}))

    feeds = [(u'Football', u'http://www.lequipe.fr/rss/actu_rss_Football.xml'),
             (u'Auto-Moto', u'http://www.lequipe.fr/rss/actu_rss_Auto-Moto.xml'),
             (u'Tennis', u'http://www.lequipe.fr/rss/actu_rss_Tennis.xml'),
             (u'Golf', u'http://www.lequipe.fr/rss/actu_rss_Golf.xml'),
             (u'Rugby', u'http://www.lequipe.fr/rss/actu_rss_Rugby.xml'),
             (u'Basket', u'http://www.lequipe.fr/rss/actu_rss_Basket.xml'),
             (u'Hand', u'http://www.lequipe.fr/rss/actu_rss_Hand.xml'),
             (u'Cyclisme', u'http://www.lequipe.fr/rss/actu_rss_Cyclisme.xml'),
             (u'Autres Sports', u'http://pipes.yahoo.com/pipes/pipe.run?_id=2039f7f4f350c70c5e4e8633aa1b37cd&_render=rss')
             ]

    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
PK�X�����
les_echos.png�PNG


IHDR  ���IDATx���cY��l�v�m۶m۶mq�;h۶m�{2o�5�8��©{/�����g�Ї�2~fL�܉3�~]]�������(?��"���L�Tc�j3�t�g>�C[�c��ի�/�[��Պ�ի׮	\�.h�Ơ�|�c
�4ԧ���w�����i�QT��`H�Tw7&�����ή�ή�̬�H�IO�NIi(*��	�wn{ϝ�{W�kV3
�%�MMA�/_��ri��(���!���+�#�?/�����EI��[�ˣ���̢(�K��,YA���(������|��M��[����fP����������[[����@���E��q��;�FC��%%����\NI` �l��n-����
ݵ��(/�'J`�;�5p@iHᢵ��.7�,4�u�(T���3��α��x���׷���տMUY8�GרU]��(�D�<����wO��͑G�l�u�x��ÑG��&��.�CYz��C��ӥ��`C�-
�x�16t�0>��Ӧ���o,+�4]im�����*��Lzp?l�.�eK�koiA�L-!b�i��oe\lMZZmFFsU�䏨CYX_݋<=c/��:q�;r�G�o�{�(��H~x����6Ih�k`����ҡK'�E�7m�<v4�������p�*!�>/�>/7��;w��I~p��<�k�Tx�"��&��6F�W��99"�Ļw�uH{�"�J��~�w�B"|�Z_�6�"'#�|�c��\n­��ðN@Z�O�hkf
!�􀵵����@N��*BJf7D?��D"���#
�g[3��=a���������m�8���Ts@&b��2�cʤ�˗�^���v���O�nk���Qt����PՔ��aC�RB<⯔�O$L2�E�1��(���	)O���֊��p��d�57�W��*+�@��=�G�9���Y6�Q��$>�l��Ҝ=t0��P�	@s8�b=�X���R`I�?w�Hl|(#���.�D�����(���Ҡ�ֆ|�:�Y��-�]��Ao���r�S'��B�p8�Q��oXOWS�
CN];g������p�/�j���s��=��V���8!�����!7U��8,_i�T�~�[���4��29t���3�cϝ�ؿ�g�\�n]�_�J/-��8���P���
B�k��#�������]IEND�B`�PK�X9����les_echos.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HindustanTimes(BasicNewsRecipe):
    title = u'Les Echos'
    language = 'fr'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('Articles',
         'http://rss.feedsportal.com/c/499/f/413824/index.rss'),
    ]
PK�X?D}��
lescienze.png�PNG


IHDR  szz�UIDATx���T���%d,�{]���}��!<�z����U�
��ۺ��uW\�}ߴ�0��˱���3s�\r�Z�c�$�LH�Ep\����@%����/C8�wDBNp��i��z����A�5��=�<
�@�ax�rH�;�~���k��.�	������|��o��F��>�r�A-P�8_�D迨��Q��"�F�$AA�$00@vHŋ��ǀ�q��B���{�-����'��4ʍF�� ���E�\��	
�f�y�J�r�����ua	vrssչ���

�7,쵧�M��\ҿ���Q��[��R���X�����	�������	������nc�y�鸒�w
���ˆ�������k֭]�nQAC}�j�{ۍt�|��!z��-�Ҷ����Z����s���Y�:mǎ����i]]݇cƌ~�1�r�)ɴ�G��+-����K?1���	t�z�v��ѝ����̬�Ǐ�QԞ={=�ܳ�rqq�ð8�:N�G?���j?r�������3\?4B<���� �i���78th�Vuu���އ�]ʼn��3�����Zk�7_ќ�ci�����Mݰ�6�@L��x�O3S{��j����-vvʱ�����Gfg��o�X(�^\�Ͽ�"�
s��������
��tח�t�����,Y��ނF�
�Lgoo�)���-^�/��Z�uKno��3�tB�i�n��`h�Ү�t�����1+L&�����y���$'ω3%&LݰaC�E����?-��Oa)��=�Q~F�*��V�DRf�`uvv����m6����
�]TTtR��i�E�i�z��ז���*(,0O�dP2��/Nm��FɎ)u�f���(j�hkk�LHH��K���w��j���e��Z�(�J�V�q���ɇ��C=P��C�ô��M��3gΜ�17`(@NqV�:�N�qU(�Bܰm3����������å��^��I��8	C�n,)�$�������[!�'>AVn48�
NIY���w��˲�A�o�O�tI�l.�,�ϳ3������1����#i9u���@�B���������9X�A�
{�
���,�lL���U`#�x�փ��֪���
{'"��F�p2��9�!Ҡ{~CNβ�S�������с�����6�;n
mn��ɶ�e�)�'N�蠨����ٳg��&������cVHy��;Sy>='1~[���UZ�H��yTp����ML�Di^�
�d ��trȔFe�f�Π�k�ʕ�P��o�����<w���.�3BC*��2�W�\�"��6^x���2?2ZY��S���`�2 �C�C����Dn�j�x�Q=<%<,���~�������{��������ue�+���_�0�?8h������܉��� ��+	O���HJ���Z����7iuv���S�9z�����Ƅ-[�4£��
9b"���nz,�m�jb}�`�����#>D\��釥决@�1�F(6gLJ%ֽL|g�#W�0��b���C�`4�2�g�A??_r�.����|�XIEND�B`�PK�Xm��fflescienze.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Daniele Forsi'

from calibre.web.feeds.recipes import BasicNewsRecipe


class LeScienze(BasicNewsRecipe):
    title = 'Le Scienze'
    description = 'Edizione italiana di Scientific American'
    publication_type = 'magazine'
    language = 'it'
    conversion_options = {
        'publisher': 'Le Scienze S.p.A.',
        'tags': 'science',
    }

    INDEX = 'http://www.lescienze.it/utility/2011/10/17/news/lista_rss-589690/'
    masthead_url = 'http://www.lescienze.it/static/images/logo-le-scienze.png'
    no_stylesheets = True
    extra_css = '''
    .img-left,.img-right{font-style:italic;font-size:75%;padding:1em;margin:auto;}
    .summary{font-style:italic;font-size:120%;}
    '''
    keep_only_tags = [
        dict(name='article', attrs={'class': 'main-article'}),
    ]
    remove_tags = [
        dict(attrs={'class': [
            'adv adv-middle',
            'colsx',
            'correlati',
            'social-toolbar-foot',
            'tags',
        ]}),
    ]
    remove_empty_feeds = True

    def get_feeds(self):
        soup = self.index_to_soup(self.INDEX)
        feeds = []

        for link in soup.findAll('a'):
            href = link.get('href')
            if href.endswith('.xml'):
                title = link.string
                feeds.append((title, href))

        return feeds
PK�Xh����
lesoir_be.png�PNG


IHDR  ��tRNSn���IDATx^��Kl�G�93�=�}�u�:'u7n�ڭ��(QP%$*Zʣb�����Blٱ`��TU�Hl����T*
��M�y�:�s}_���9�!Gt�P�it3�9�?Tƪ3'Gf*M�m
e�""�OD�L���Y��^m|�N��z�u<654:eJ����H����d��Ϝ���Q�HU��hT�I�x@D��C��Dt��P��x$�
�Bk����&"���
Eb�u�RdXx{�n#>i���(39��&��b:qB���^���M�=R�g�\	c����wI���t�7�+��k�d`�EFh/&���k:��ԋ�b�,"a�r��d�V-������=���i�$�`�~�]����%�j�Y�@��;�gf-"p�y�����v2wr���Gf�X<v�� ��������G&k!�j�I�R{��+f�h�
�Z;�����o>6W����/-__�d-�쁱��ɱc�&*CŒQ1|��*��v0X��4ăD�@�9(V�h��L����}q���y����"�����ك�Z����\[_/����.0"�k	��X��nHs%Tah�<�Kx�W�� '���V��n�w��'�o?f]G�C�8��P���D�(b�JY'=ON�2fvz��C�!n��
�oo&h��Ќ�����h����و��'xi�H b�9`n
<ٴ��Ů�{஑��^}�J�B}k��_�)���VJ�haE���$�
'�Dg~�2��p;ױ"]l4U�q���]�wz2�c9p�~�Z}k�ټ���m�>\k\o��w�6F�J)+f"@������M�.w��k2d�jh��ę�c��Y�k|�!�eKW����|�ҍF�FAk� "�9�
E��\<k�^�m�n��u�~��\��f�r}#K�,\�Z+��jcB�]s������
F�\n��V�uY��}Q\�8@$���/)_�uQal�0><r|fzan�w�&p{���_��������{�S'9���Y)�Fӱ'�H���� �,\'�o4�Xobs�a�2��쩇N,����?��o������+��Ó])!�sM,:ԠmZ1vX@C X؛�$kt�9L��XDd3o_?��o_�4[?�ޓƘ���tmx����~�T1�I���h�DB�`�j�pOm�E��띴���n�r'��n#�_}��ǎ T�H9�8Hi( ��s���<^�|��<��g����������F��A�����c����tқ��v��k�������"�`��P�<���L<�p2�y\�榧Ļ~��Y��w����u]������  �J�y�ݢ��0Xs�;km/MA\�'N/n⑋�®z���[�~�n��0RJ	+�H`����\��_�����&�G�;�;I�Oo������ͥ+F�9h��<@b�2�f�~��{�x�|�y�-)O���Q!�6���6M{7�k�.\~��v�Z*�q!,�M��x��%Vjw����A��t���=�9"�B�F2țm�	⡑�BX)�Q��mX�f%��=	y�k��j�F)�u��!J�g����	1�Q)�J)*&f����.��
���^cu��  ����Y�֬
y/�Y�{��%�w��(�'��߹P �X��Tu��q��ʒ�SP(!��M�N�:2H��o	��s�Ϝ��u�Xmcv"Q�B`E¨��}s9Y���ǟ������}����p�������gG�/��	|f�Xs�(�Zm�~�͚
�%��n���m'��}Ͼp���'�"�`|!��]:O:��zw�F��1��؃B"���@�+������؃g�����7�phA�IEND�B`�PK�Xzi�Slesoir_be.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2011, Lionel Bergeret <lbergeret at gmail.com>'
'''
lesoir.be
'''

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class LeSoirBe(BasicNewsRecipe):
    title = u'Le Soir'
    __author__ = u'Lionel Bergeret'
    description = u'News from Belgium in French'
    publisher = u'lesoir.be'
    category = 'news, Belgium'
    oldest_article = 3
    language = 'fr'
    masthead_url = 'http://pdf.lesoir.be/pdf/images/SOIR//logo.gif'

    max_articles_per_feed = 20
    no_stylesheets = True
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'

    keep_only_tags = [
        dict(name='div', attrs={'id': 'story_head'}), dict(
            name='div', attrs={'id': 'story_body'})
    ]

    remove_tags = [
        dict(name='form', attrs={'id': 'story_actions'}), dict(name='div', attrs={
            'id': 'sb-share'}), dict(name='div', attrs={'id': 'sb-subscribe'})
    ]

    feeds = [

    (u'Belgique', u'http://www.lesoir.be/actualite/belgique/rss.xml'),
    (u'France', u'http://www.lesoir.be/actualite/france/rss.xml'),
    (u'Monde', u'http://www.lesoir.be/actualite/monde/rss.xml'),
    (u'Regions', u'http://www.lesoir.be/regions/rss.xml'),
    (u'Vie du Net', u'http://www.lesoir.be/actualite/vie_du_net/rss.xml'),
    (u'Petite Gazette', u'http://www.lesoir.be/actualite/sciences/rss.xml')
    ]

    def get_cover_url(self):
        cover_url = strftime(
            'http://pdf.lesoir.be/pdf/%Y-%m-%d_BRUX_UNE_1.PDF')
        return cover_url
PK�X�B��
�
letsgetcritical.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class LetsGetCritical(BasicNewsRecipe):
    title = u"Let's Get Critical"
    description = 'Curation / aggregation of criticisms of the arts and culture '
    language = 'en'
    __author__ = 'barty on mobileread.com forum'
    max_articles_per_feed = 100
    no_stylesheets = False
    timefmt = ' [%a, %d %b, %Y]'
    oldest_article = 365
    auto_cleanup = True
    INDEX = 'http://www.letsgetcritical.org'
    CATEGORIES = [
        # comment out categories you don't want
        # (user friendly name, system name, max number of articles to load)
        ('Architecture', 'architecture', 30),
        ('Art', 'art', 30),
        ('Books', 'books', 30),
        ('Design', 'design', 30),
        ('Digital', 'digital', 30),
        ('Food', 'food', 30),
        ('Movies', 'movies', 30),
        ('Music', 'music', 30),
        ('Television', 'television', 30),
        ('Other articles', '', 10)
    ]

    def parse_index(self):
        self.cover_url = 'http://www.letsgetcritical.org/wp-content/themes/lets_get_critical/images/lgc.jpg'
        feeds = []
        seen_urls = set()
        regex = re.compile(r'http://(www\.)?([^/:]+)', re.I)

        for category in self.CATEGORIES:

            (cat_name, tag, max_articles) = category

            tagurl = '' if tag == '' else '/category/' + tag.lower()
            self.log('Reading category:', cat_name)

            articles = []
            pageno = 1

            while len(articles) < max_articles and pageno < 100:

                page = "%s%s/page/%d" % (self.INDEX, tagurl,
                                         pageno) if pageno > 1 else self.INDEX + tagurl
                pageno += 1

                self.log('\tReading page:', page)
                try:
                    soup = self.index_to_soup(page)
                except:
                    break

                posts = soup.findAll('div', attrs={'class': 'post_multi'})
                if len(posts) == 0:
                    break

                for post in posts:
                    dt = post.find('div', attrs={'class': 'title'})
                    atag = dt.find('a')
                    url = atag['href']
                    # skip promotionals and duplicate
                    if url.startswith('http://letsgetcritical') or url.startswith('/') or url in seen_urls:
                        continue
                    seen_urls.add(url)
                    title = self.tag_to_string(atag)
                    self.log('\tFound article:', title)
                    self.log('\t', url)
                    desc = post.find('blockquote')
                    desc = self.tag_to_string(desc) if desc else ''
                    m = regex.match(url)
                    if m:
                        desc = "[%s] %s" % (m.group(2), desc)
                    date = ''
                    p = post.previousSibling
                    # navigate up sibling to find date
                    while p:
                        if ''.join(p.get('class') or '') == 'singledate':
                            date = self.tag_to_string(p)
                            break
                        p = p.previousSibling
                    articles.append(
                        {'title': title, 'url': url, 'description': desc, 'date': date})
                    if len(articles) >= max_articles:
                        break

            if articles:
                feeds.append((cat_name, articles))

        return feeds
PK�X�
Ĥ��levante.png�PNG


IHDR  V%(tRNSv��8	pHYs���IDAT8˥ӿK�A�g:8��� ABD(���A�A�P�AE��v�"�VpzU\�P�YȠ������+�uE���qH��므�r7|x���TU�
ʹ����ԗ�����M���0L4@��x�A�qW=�����WI�Й��)T=����V ,��.� w�>g�I忂	�<���"���˙�*I�cP�-w��2٠���a�r7�4��<Wb�iXwH��GH�T�{���gF}�	!~p	!">�\��\���#/""������\�
SM�3
tO!�6��c�з��U��n0ȞR�ES>�1��ԯe!HaG#َ~�%�SRi������}l(F-��M�G?�����֗��	��D��Ħa�IEND�B`�PK�X�Q�CClevante.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class LevanteRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    version = 1
    language = 'es'
    description = u'El Mercantil Valenciano'
    title = u'Levante'

    oldest_article = 2
    max_articles_per_feed = 100
    encoding = 'latin1'
    no_stylesheets = True
    remove_javascript = True

    # Feeds taken from http://www.levante-emv.com/servicios/rss/rss.jsp?pServicio=rss
    # Feed titles are without accented characters for now. Hope to resolve
    # this in the future.
    feeds = []
    feeds.append(
        (u'Portada Valencia', u'http://www.levante-emv.com/elementosInt/rss/1'))
    feeds.append(
        (u'Portada Castello', u'http://www.levante-emv.com/elementosInt/rss/2'))
    feeds.append(
        (u'Portada Alacant', u'http://www.levante-emv.com/elementosInt/rss/3'))
    feeds.append(
        (u'Lo Mas Leido', u'http://www.levante-emv.com/elementosInt/rss/LoMas'))
    feeds.append(
        (u'Seccion al minuto', u'http://www.levante-emv.com/elementosInt/rss/AlMinuto'))
    feeds.append((u'Comunidad Valenciana',
                  u'http://www.levante-emv.com/elementosInt/rss/19'))
    feeds.append(
        (u'Valencia', u'http://www.levante-emv.com/elementosInt/rss/16'))
    feeds.append(
        (u'Castello', u'http://www.levante-emv.com/elementosInt/rss/4'))
    feeds.append(
        (u'Alacant', u'http://www.levante-emv.com/elementosInt/rss/17'))
    feeds.append(
        (u'Comarcas', u'http://www.levante-emv.com/elementosInt/rss/12'))
    feeds.append((u'Espana', u'http://www.levante-emv.com/elementosInt/rss/6'))
    feeds.append(
        (u'Internacional', u'http://www.levante-emv.com/elementosInt/rss/7'))
    feeds.append(
        (u'Opinion', u'http://www.levante-emv.com/elementosInt/rss/5'))
    feeds.append(
        (u'Economia', u'http://www.levante-emv.com/elementosInt/rss/8'))
    feeds.append(
        (u'Sociedad', u'http://www.levante-emv.com/elementosInt/rss/9'))
    feeds.append(
        (u'Sucesos', u'http://www.levante-emv.com/elementosInt/rss/10'))
    feeds.append(
        (u'Deportes', u'http://www.levante-emv.com/elementosInt/rss/11'))
    feeds.append((u'Motor', u'http://www.levante-emv.com/elementosInt/rss/31'))
    feeds.append(
        (u'Panorama', u'http://www.levante-emv.com/elementosInt/rss/18'))
    feeds.append(
        (u'Salud y Vida', u'http://www.levante-emv.com/elementosInt/rss/20'))
    feeds.append(
        (u'Ciencia y Salud', u'http://www.levante-emv.com/elementosInt/rss/44'))
    feeds.append((u'Ciencia e Investigacion',
                  u'http://www.levante-emv.com/elementosInt/rss/23'))
    feeds.append(
        (u'Ensenanza', u'http://www.levante-emv.com/elementosInt/rss/22'))
    feeds.append((u'Fiestas y Tradiciones',
                  u'http://www.levante-emv.com/elementosInt/rss/24'))
    feeds.append(
        (u'Club Diario', u'http://www.levante-emv.com/elementosInt/rss/26'))
    feeds.append(
        (u'Juntos', u'http://www.levante-emv.com/elementosInt/rss/33'))
    feeds.append(
        (u'Integrados', u'http://www.levante-emv.com/elementosInt/rss/35'))
    feeds.append(
        (u'Agenda', u'http://www.levante-emv.com/elementosInt/rss/36'))
    feeds.append(
        (u'Cultura', u'http://www.levante-emv.com/elementosInt/rss/39'))
    feeds.append(
        (u'Tecnologia', u'http://www.levante-emv.com/elementosInt/rss/40'))
    feeds.append((u'Gente', u'http://www.levante-emv.com/elementosInt/rss/41'))
    feeds.append(
        (u'Television', u'http://www.levante-emv.com/elementosInt/rss/42'))
    feeds.append(
        (u'Participa', u'http://www.levante-emv.com/elementosInt/rss/45'))

    keep_only_tags = [dict(name='div', attrs={'class': 'noticia_titular'}),
                      dict(name='div', attrs={'class': 'subtitulo'}),
                      dict(name='div', attrs={'id': 'noticia_texto', 'class': 'noticia_texto'})]

    def preprocess_html(self, soup):
        # Nuke some real crappy html
        theirHead = soup.head
        theirHead.extract()
        myHead = new_tag(soup, 'head')
        soup.insert(0, myHead)

        return soup
PK�X0XFc��lexpress.png�PNG


IHDR(-S0PLTE��/�.� ,�+LLL� -� ,� -� -�!,KKK� -LLL�!-7k�&tRNS !?@I_����~Ӏ�IIDATxڅ�	
�0CѸ/��ok4h����|�]���f�Ǥ���S���.<P���`�|���-e�����K�m��KIEND�B`�PK�XH���w
w
lexpress.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2011 Aurélien Chabot <contact@aurelienchabot.fr>'
'''
Lexpress.fr
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class lepoint(BasicNewsRecipe):

    title = 'L\'express'
    __author__ = 'calibre'
    description = 'Actualités'
    publisher = 'LExpress.fr'
    category = 'Actualité, France, Monde'
    language = 'fr'

    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 15
    no_stylesheets = True
    remove_empty_feeds = True
    filterDuplicates = True

    extra_css = '''
                    h1 {font-size:xx-large; font-family:Arial,Helvetica,sans-serif;}
                    .current_parent, p.heure, .ouverture {font-size:xx-small; color:#4D4D4D; font-family:Arial,Helvetica,sans-serif;}
                    #contenu-article {font-size:medium; font-family:Arial,Helvetica,sans-serif;}
                    .entete { font-weiht:bold;}
                '''

    remove_tags = [
        dict(name='iframe'),
        dict(name='div', attrs={'class': ['barre-outil-fb']}),
        dict(name='div', attrs={'class': ['barre-outils']}),
        dict(id='bloc-sommaire'),
        dict(id='footer-article')
    ]

    keep_only_tags = [
            classes('article_header_content article_content')
    ]

    feeds = [
        (u'À la une', 'http://www.lexpress.fr/rss/alaune.xml'),
        ('International', 'http://www.lexpress.fr/rss/monde.xml'),
        ('Tech/Web', 'http://www.lexpress.fr/rss/high-tech.xml'),
        (u'Sciences/Santé', 'http://www.lexpress.fr/rss/science-et-sante.xml'),
        (u'Envronnement', 'http://www.lexpress.fr/rss/environnement.xml'),
        ('Economie', 'http://www.lepoint.fr/economie/rss.xml'),
        (u'Socièté', 'http://www.lexpress.fr/rss/societe.xml'),
        ('Politique', 'http://www.lexpress.fr/rss/politique.xml'),
        (u'Médias', 'http://www.lexpress.fr/rss/medias.xml'),
        ('Culture', 'http://www.lexpress.fr/rss/culture.xml'),
        ('Sport', 'http://www.lexpress.fr/rss/sport.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def get_masthead_url(self):
        masthead = 'http://static.lexpress.fr/imgstat/logo_lexpress.gif'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(masthead)
        except:
            self.log("\nCover unavailable")
            masthead = None
        return masthead
PK�X���@@liberation.png�PNG


IHDR  ��IDATx�cx��JS4j����Qq�5-@������2�\"mb h4�ܧ�roc�,Z�y���!�O�$!V����L@�Oą^�:|��u�ƿ?���߯_^8�������cAn�2�b\61`�#6��¼/�?4�~?����O�������޼��iû��gZ��y��3��i"���g�j�r3�m�������'������_��y�TV�d�����R�}?ϙ��-\�����'��h}ac�D�b
�Sy`P��v�߷o䙋t߿��o��H`1<�y�uŲ?O����r�&���-/쬀�M�|���ޗ߳��'p�������ɗ��_G�>����z�x��ib��w���E���|�y�Ի���F�@'�eC\9뙺�۬�o��"�C�N�����y�_�>��;=�(��I�CcݏS'�~�
u���~��U�b���,* ��H��—��?Ϙ����0<Ӥ��D4*��[�6j��q6cN�1SIEND�B`�PK�XS�"�?
?
liberation.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2008, Darko Miletic <darko.miletic at gmail.com>'

'''
liberation.fr
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Liberation(BasicNewsRecipe):
    title = 'Libération'
    __author__ = 'calibre'
    description = 'Actualités'
    publication_type = 'newspaper'
    language = 'fr'

    oldest_article = 2
    max_articles_per_feed = 30
    no_stylesheets = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    needs_subscription = 'optional'

    masthead_url = 'https://www.liberation.fr/pf/resources/images/liberation.png?d=47'

    feeds = [
        ('Libération', 'https://www.liberation.fr/arc/outboundfeeds/rss/?outputType=xml'),
        ('Accueil', 'https://www.liberation.fr/arc/outboundfeeds/collection/accueil-une/?outputType=xml')
    ]

    keep_only_tags = [
        dict(name='div', attrs={'class': 'left-article-section'})
    ]

    remove_tags = [
        dict(name=['button', 'source']),
        dict(attrs={'class': ['ts-share-bar']}),
        dict(name='div', attrs={'class': [
            'article-dossier', 'color_background_green', 'display_block', 'tag-container'
        ]})
    ]

    remove_attributes = [
        'height', 'width'
    ]

    extra_css = '''
        h2, h3, h4, h5, h6 { font-size: 1em; }
        .image-metadata { font-size: 0.6em; margin-top: 0em; margin-bottom: 1.6em; }
    '''

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            try:
                br.open('http://token.liberation.fr/accounts/login/')
                br.select_form(nr=0)
                br['email'] = self.username
                br['password'] = self.password
                br.submit()
            except Exception as e:
                self.log('Login failed with error: ' + str(e))
        return br

    def get_cover_url(self):
        soup = self.index_to_soup('https://journal.liberation.fr/')
        cover = soup.find(name='img', attrs={'class': 'ui image'})
        if cover is not None and cover['src'] is not None:
            self.cover_url = 'https:' + cover['src']
        return self.cover_url

    def postprocess_html(self, soup, first_fetch):
        # remove local hyperlinks
        for a in soup.find_all('a', {'href': True}):
            if '.liberation.fr/' in a['href']:
                a.replace_with(self.tag_to_string(a))
        return soup
PK�X.��3ccliberatorio_politico.png�PNG


IHDR  D���NPLTE�������������ܠ�֏�р����p��o��`��_��P��O��@��?��0��/�� ���������3mtRNS 0?@P_p����������������I��IDATx^���� ��[)h)�Q��Q��h���[����S�ӹ�k��r
��R���}V�"�3`�+��@#�H�3X����
����ge�*q�� 4H����F��[���>`��-�t��/���	���;{��vG�Q��տ� �2�D�9j=�6B�ہ˰IEND�B`�PK�X=o�MMliberatorio_politico.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1334649829(BasicNewsRecipe):
    title = u'Liberatorio Politico'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    masthead_url = 'http://liberatorio.altervista.org/wp-content/uploads/2012/01/Testata-LIBERATORIO-Altervista1.jpg'
    feeds = [(u'Liberatorio Politico', u'http://liberatorio.altervista.org/feed/')]
    __author__ = 'faber1971'
    description = 'Inquiry journalism - a blog on Molfetta, Land of Bari, Apulia and Italy - v1.00 (07, April 2012)'
    language = 'it'
PK�XH�2ס�
libero.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gabriele Marini, based on Darko Miletic'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
description = 'Italian daily newspaper - 13-05-2010'

'''
http://www.libero-news.it/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LiberoNews(BasicNewsRecipe):
    __author__ = 'Marini Gabriele'
    description = 'Italian daily newspaper'

    cover_url = 'http://www.edicola.liberoquotidiano.it/vnlibero/fpcut.jsp?testata=milano'
    title = u'Libero '
    publisher = 'EDITORIALE LIBERO s.r.l 2006'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 7
    max_articles_per_feed = 50
    use_embedded_content = False
    recursion = 100

    no_stylesheets = True
    conversion_options = {'linearize_tables': True}
    remove_javascript = True

    keep_only_tags = [
        dict(name='div', attrs={'class': 'Articolo'}),
        dict(name='article')
    ]
    remove_tags = [
        dict(name='div', attrs={
             'class': ['CommentaFoto', 'Priva2', 'login_commenti', 'box_16']}),
        dict(name='div', attrs={'id': ['commentigenerale']})
    ]
    feeds = [
        (u'Politica', u'http://www.libero-news.it/rss.jsp?sezione=14'),
        (u'Italia',   u'http://www.libero-news.it/rss.jsp?sezione=15'),
        (u'Esteri', u'http://www.libero-news.it/rss.jsp?sezione=16'),
        (u'Economia', u'http://www.libero-news.it/rss.jsp?sezione=17'),
        (u'Cultura', u'http://www.libero-news.it/rss.jsp?sezione=18'),
        (u'Scienze', u'http://www.libero-news.it/rss.jsp?sezione=19'),
        (u'Tecnologia', u'http://www.libero-news.it/rss.jsp?sezione=20'),
        (u'LifeStyle', u'http://www.libero-news.it/rss.jsp?sezione=22'),
        (u'Sport', u'http://www.libero-news.it/rss.jsp?sezione=23'),
        (u'Costume e Societ\xc3\xa0', u' http://www.libero-news.it/rss.jsp?sezione=24'),
        (u'Milano', u'http://www.libero-news.it/rss.jsp?sezione=26'),
        (u'Roma', u'http://www.libero-news.it/rss.jsp?sezione=27'),
        (u'Alimentazione', u'http://www.libero-news.it/rss.jsp?sezione=29')
    ]
PK�Xh�U�kklibertad_digital.png�PNG


IHDR��h62IDATx�-R�n�@�Iֈ��/ �.j��(��,b;���v]���`G)R�%A!Ǐ�J�چ�i i �
Q�	�g8�5�f�s�9��f�b�T�T']0p���Лq����j��6z��}��G�w�mO���֏Sj4�>�<�?|y��T�I5I3��p�
c؊|QVs^|���,[��V>�4��v�I��]?<�:DDP�����m�V�t[w Q���
��W��#���3�E�����u����(���@(	礉�+w7N�(�� ��ɾ��9��Va�9<�q��6�����R���R��cMq~��M�Rs�ظ•�Tc�;�h�]���A�rs3^j��Ȗ;~��X��(]0у����.4��F���+�G ��;��3Rm���.�p��i��Q~�z&��=YE��d$~bx?�څ?HZN��0ڳ�f�L��]�C�e�Ÿ#� wJq@�OC���3�f��xIx`�H�1x-7Ƙ�`�-ɗkn[S���%"��
�4f.�%8���S�������X��.�IEND�B`�PK�X���	�	libertad_digital.recipe__license__ = 'GPL v3'
__copyright__ = '2013, Darko Miletic <darko.miletic at gmail.com>'
'''
www.libertaddigital.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LibertadDigital(BasicNewsRecipe):
    title = 'Libertad Digital'
    __author__ = 'Darko Miletic'
    description = 'En Libertad Digital encontraras noticias y opinion sobre: España, el Mundo, Internet, sociedad, economia y deportes'
    publisher = 'Libertad Digital S.A.'
    category = 'noticias, ultima hora, españa, internet, mundo, economia, sociedad, Libertad Digital'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'es'
    remove_empty_feeds = True
    publication_type = 'website'
    masthead_url = 'http://s.libertaddigital.com/images/logo.gif'
    extra_css             = """
                               body{font-family: Verdana,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link', 'iframe', 'embed', 'object']), dict(
            name='p', attrs={'class': 'copyright'})
    ]
    remove_attributes = ['lang']

    feeds = [

    (u'Portada', u'http://feeds2.feedburner.com/libertaddigital/deportes'),
    (u'Opinion', u'http://feeds2.feedburner.com/libertaddigital/opinion'),
    (u'España', u'http://feeds2.feedburner.com/libertaddigital/nacional'),
    (u'Internacional', u'http://feeds2.feedburner.com/libertaddigital/internacional'),
    (u'Libre Mercado', u'http://feeds2.feedburner.com/libertaddigital/economia'),
    (u'Chic', u'http://feeds2.feedburner.com/libertaddigital/el-candelabro'),
    (u'Internet', u'http://feeds2.feedburner.com/libertaddigital/internet'),
    (u'Deportes', u'http://feeds2.feedburner.com/libertaddigital/deportes')
    ]

    def get_article_url(self, article):
        return article.get('guid',  None)

    def print_version(self, url):
        art, sep, rest = url.rpartition('/')
        aart, asep, artid = art.rpartition('-')
        return 'http://www.libertaddigital.com/c.php?op=imprimir&id=' + artid

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X��a WWliberty_times.png�PNG


IHDR�aIDATx�b�Y���5� ��˜p/wYww���h�w�/��<����yn���Ū�["�-�ԩ�=5�)�,�)���H=�%�N�����l��H��(��(3�'�۠/��b���"�)Z�u�y�"�lOfI�ـ�~>_}Q2�
�,3�D��D�/&���ݻ`�5�-���1k~����:~�B8%�:�Ov5��bG�Y�@��h�H�q<�L��
&�o����?Z��-��Oo��6Z-n�w��JQO�o��S��K�_������_���H���!.��U�IEND�B`�PK�X���6��liberty_times.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
# dug from http://www.mobileread.com/forums/showthread.php?p=1012294


from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1277443634(BasicNewsRecipe):
    title = u'自由電子報'
    oldest_article = 1
    max_articles_per_feed = 100

    feeds = [(u'即時', u'https://news.ltn.com.tw/rss/all.xml'),
             (u'政治', u'https://news.ltn.com.tw/rss/politics.xml'),
             (u'社會', u'https://news.ltn.com.tw/rss/society.xml'),
             (u'生活', u'https://news.ltn.com.tw/rss/life.xml'),
             (u'評論', u'https://news.ltn.com.tw/rss/opinion.xml'),
             (u'國際', u'https://news.ltn.com.tw/rss/world.xml'),
             (u'財經', u'https://news.ltn.com.tw/rss/business.xml'),
             (u'體育', u'https://news.ltn.com.tw/rss/sports.xml'),
             (u'娛樂', u'https://news.ltn.com.tw/rss/entertainment.xml'),
             (u'地方', u'https://news.ltn.com.tw/rss/local.xml'),
             (u'人物', u'https://news.ltn.com.tw/rss/people.xml'),
             (u'蒐奇', u'https://news.ltn.com.tw/rss/novelty.xml')
    ]

    __author__ = 'einstuerzende, updated by Eddie Lau'
    __version__ = '1.2'
    language = 'zh'
    publisher = 'Liberty Times Group'
    description = 'Liberty Times (Taiwan)'
    category = 'News, Chinese, Taiwan'
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    encoding = 'utf-8'
    conversion_options = {'linearize_tables': True}
    masthead_url = 'https://cache.ltn.com.tw/images/rwd_ltnlogo.png',
    cover_url = 'https://cache.ltn.com.tw/images/rwd_ltnlogo.png'
    auto_cleanup = True
PK�X9KӁQQlidovky.png�PNG


IHDR  szz�IDATx^�VklU�����'}��*X(��?�G �"E- �E		F�A#Uc*�(��1B�GS�Bbi
���&<�Z��iY�������㝓ev'�`���d2ߜ�<�9���?�r��e��C�w�
��'���Աz޸mS
kįǛ_��w���?������L^'*6�z�5�'#()�:�w��AHnv���$%&�N��賮��OP@�N���&H��5��maC:c���Cc�t���{�.���	�z񙙣P8$
N�`��4��7d;OIrcqy1r3�l^H�}S�z�a�M��#P2"�>g�>��p����A��T/�0}B>fL,Pi,t��u:q�UHv`A�{��ʊq��V�L5
��9�<�����IJ��̩9���k~�d��roK��]��`eί��/E�/w����#�>��r'7�?�b'�xm5�ݲ��� ����2�U+���3�o��'�!_k���)�V��@�x	��2ӌ6������X�T}��~KY�����$lZ>Yi���Ip��|��ޭ|��]��!h �8�����Iia������L|��i�.�A���i��"Ĉ�=(�� q����
�5eL��:�����NCp"�_y
,�B:����s�H��T�O�ĴG
�Ԕ"��ﭚ�Ƌ��6��_p(�O��������A6�X���c��l�*��Q���t��;�����I���o"bP�vL�&���x��z|�e	��1g��xgU)���!��#�Fp�n��3tr��%y4h;��������G�"{A�9�Ĥ"K<Η2k�Wr��(��K�ػy1���d>O`B(s����
hh�Bj��	�p�i!��[ %@Q�i��E(�M�@��].�d�����uU����ȩ���^2�a@��%l~vF2���0?[��M+��?؏�Y)��J��*S�� �~���rO=nCQq�^!h����N+��+g�,���P���������%?2��z�JK��O�œ��3J�k�"L.)��� ��}��Qw�o(�y`aDM�4�C��KWڱ�׆;�`1�(�*�_��E����˽=�x	zY�?`i�
�32%=�al�Y��m~\j�[#�S`��\UK��g0���M����,��]!���М�6Q��<8�"�61 �L&dB�G"�q��iU /#��FG !�0gpʿb�a��ڮ�z 2ҒU�.]/zz�)��N/��߰�3Г�	q��N��޹v��K���J�ԥIEND�B`�PK�X����lidovky.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe
import re


class lnRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'lidovky'
    publisher = u''
    description = 'lidovky.cz'
    oldest_article = 1
    max_articles_per_feed = 20

    feeds = [
        (u'Události', u'http://www.lidovky.cz/export/rss.asp?r=ln_domov'),
        (u'Svět', u'http://www.lidovky.cz/export/rss.asp?r=ln_zahranici'),
        (u'Byznys', u'http://www.lidovky.cz/export/rss.asp?c=ln_byznys'),
        (u'Věda', u'http://www.lidovky.cz/export/rss.asp?r=ln_veda'),
        (u'Názory', u'http://www.lidovky.cz/export/rss.asp?r=ln_nazory'),
        (u'Relax', u'http://www.lidovky.cz/export/rss.asp?c=ln_relax')
    ]

    language = 'cs'
    cover_url = 'http://g.lidovky.cz/o/lidovky_ln3b/lidovky-logo.png'
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = []
    remove_tags_before = dict(name='div', attrs={'id': ['content']})
    remove_tags_after = dict(name='div', attrs={'class': ['authors']})
    preprocess_regexps = [(re.compile(
        r'<div id="(fb-root)".*', re.DOTALL | re.IGNORECASE), lambda match: '</body>')]

    keep_only_tags = []
PK�X�t֣lifehacker.png�PNG


IHDR  ���IDATx�!n܉����0��Z���ӂ���=��;PA�#,X�   `������~�	�ذ���UU(T؆�����`Χ��O_>]��g���
�l!0�)���so��~�t}<�x=�/O�_�����6�Pa[���x�7Ƕ�v�2�u�qܯN��0��$�T������0K��� R
��P�q�`� FA�mUIl�f�
�`0�H`[������Y��ac�Fն!���h��l�P�`[�`3���f"H������?�����Ԏ��$m���l�Q�*���]�>?�������o�ff[��̀mF`�^{�z�q�^�t����t���Oa�ml��И�f�v�����Ӈ.םχ�~;v��o?o3�<����N�.��q���vۓ�����~{~�\�	���m6Qxy�}{�۶_������������@6(�!Uyy��t��;Χ�
����ر�8���at����� ���H*����l���c�mXz���
��f�<J�T�S�qU�P�Pc6U2l���S�-0lېh`HU�l�6U�  QU!�k�l�
�� ۀm
�* $�4 h�m۶�/�
�v�DR������ܟo�O��������Wf���A� ��~\N�{q�߿}���z�>}z�`6�0`�f�ql{���~>_���vT�K�^߀M E;f�l;���t꿿���Os����f��1J�PU`�I��x�������_^�����	���^��yWap��_���c�
ʰ��T__n��~�ۇ���˷��^��~~�?�//��o�w�q;>��ϗ���o�:	����*6�:�a;6[Uff
H��d��0sL1��`� �!��9�++��IEND�B`�PK�X�D�11lifehacker.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2017, Kovid Goyal <kovid at kovidgoyal.net>
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 LifeHacker(BasicNewsRecipe):
    title = u'LifeHacker'
    __author__ = 'Kovid Goyal'
    language = 'en'
    description = u'Tips, tricks, and downloads for getting things done.'
    publisher = u'lifehacker.com'
    oldest_article = 4
    max_articles_per_feed = 20
    summary_length = 1000

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    remove_attributes = ['style']

    keep_only_tags = [
        dict(name='h1'),
        classes('headline author post-content js_post-content'),
    ]
    remove_tags = [
        classes('magnifier commerce-inset gmg-avatar js_ad-dynamic instream-native-video inset--story js_commerce-inset-permalink'),
        dict(id='lifehacker-avatar-svg'),
        dict(name='aside'),
    ]
    remove_tags_after = classes('post-content')

    feeds = [(u'Articles', u'https://lifehacker.com/rss')]

    def preprocess_html(self, soup):

        def choose_from_srcset(raw):
            parts = raw.split()
            if len(parts) > 2:
                return parts[2]
            return parts[0]

        for img in soup.findAll(attrs={'data-srcset':True}):
            img['src'] = choose_from_srcset(img['data-srcset'])
        return soup
PK�XR�� @@lifehacker_pl.png�PNG


IHDR��h6IDATx�
���q�ύ����N���6	j�$ �
��3�A��	���""^!Bb�hU�n��6��[�^�w_�?�T㯭kQΥ"R�"U���1����֛7tb�BY���d
0�D��%�8{���s�������f�9f~p:�:ߥ�۶��*�m#��;Bzͺ�<P�O����+��M��|z��ʉ�3�����Ne�B��F�6s�p���a[V?��K��א��97���ɋì�K��ټ��o_bȘ1iʎ��,��x�?iO~��<9kB����}e�]��Kp�j��t��ū6��I�,��z��к��G����Y�������0�b�bm5�H+��f��O^�aB���9�Ozk��Gs8A�D��:iE!<β�.���D��ߵ�p��,��"�h\��R�8��㒦w��;{&k,�7,���]W_E�E��p"��d�.����";��W���j��o�dv���FR���\��6�*���[��6̅+.fhhj����X+[)F�l?�׃'NX�t%4��_|��)Zj��ؖ�A8~�{"!]Q��f�ڹT�$�#��@�?�|�#�v̞���mk7�{y>>dHX.����n��D���~}�T~��71��x�u�1��[Y��سl�7B�`��?]�1|�"�Q�&U"���xh���\��C-���'���&�gH�y����C�X�m���&O^�r�x���u��qh�a����"ل��5��`�K�L_7aN��@C_��<�d�MIEND�B`�PK�Xn�[���lifehacker_pl.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = 'MrStefan'

'''
www.lifehacking.pl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class lifehacking(BasicNewsRecipe):
    title = u'Lifehacker Polska'
    __author__ = 'MrStefan <mrstefaan@gmail.com>'
    language = 'pl'
    description = u'Lifehacking - sposoby na zwiększanie własnej wydajności. Ułatwiaj sobie życie, wykorzystując wiedzę, metody, technologie, przydatne strony ...'  # noqa
    masthead_url = 'http://lifehacking.pl/wp-content/themes/lifehacking/images/lifehackerlogo.png'
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True

    feeds = [(u'Lifehacker polska', u'http://feeds.feedburner.com/pl_lh')]

    keep_only_tags = [
        dict(name='header', attrs={'class': 'td-post-title'}),
        dict(name='div', attrs={'class': 'td-post-content'})]
PK�X�H�&&liganet_ru.png�PNG


IHDR  D����PLTE�9�������q��d��Mu�|���F����B������������ R�Eo�)Y�Sz�������4a�^��<g�x������M���Y~������P�f��Gp����Pw�����1_����i�엄�tRNS@��fGIDATx�e҅#A�3���9���^��]�(��L�8��_C�iϏbW�?P
aR~��]����`D�z&O2���o*y�M=a��mǻ�/>�^>��::kq�E��Pe�ub`�o�'�G2V|�����E���~H�ϫ��Y" �O�kr֊j�#��ܺ���K�L��I͉
O83�h�U�v<�jf$+y�1S��'�3��@�����6�]���'ƪxDY�)�:?H&bL�/����%����R�9�x���wy�:�-�<�O:?�P���G�'y�#:Y��4�ݕ�������:�6[�PF�{�/�o`�����IEND�B`�PK�X؊ё�!�!liganet_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class LigaNet(BasicNewsRecipe):
    title = '\u041B\u0406\u0413\u0410.net'
    __author__ = 'bugmen00t'
    description = '\u0414\u0456\u043B\u043E\u0432\u0438\u0439 \u043D\u043E\u0432\u0438\u043D\u043D\u0438\u0439 \u043F\u043E\u0440\u0442\u0430\u043B'
    publisher = 'Ligamedia'
    category = 'blog'
    cover_url = u'https://www.liga.net/design/images/logo_liga.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'id': 'news-text'})

    remove_tags = [
        dict(name='footer'),
        dict(name='div', attrs={'class': 'more-link red'}),
        dict(name='div', attrs={'class': 'read-too'}),
        dict(name='div', attrs={'class': 'to-send-row'}),
        dict(name='div', attrs={'class': 'hint-row'}),
        dict(name='div', attrs={'class': 'chronicle-top-eye'}),
        dict(name='div', attrs={'class': 'chronicle-top-comm comm-btns'}),
        dict(name='div', attrs={'class': 'chronicle-news m-t-30'}),
        dict(name='div', attrs={'class': 'right-inner-content'}),
        dict(name='div', attrs={'class': 'right-part'}),
        dict(name='div', attrs={'class': 'hreflang-link'}),
        dict(name='div', attrs={'class': 'vakansii-block-article'}),
        dict(
            name='div', attrs={'class': 'col-12 col-md p-side-10 sp-card-paddings'}
        ),
        dict(
            name='div',
            attrs={'class': 'social-shares d-flex justify-content-center'}
        ),
        dict(name='div', attrs={'class': 'social-shares d-block'}),
        dict(name='div', attrs={'class': 'social-likes clearfix hidden-1280 '}),
        dict(name='div', attrs={'class': 'soc-item comm-btns'}),
        dict(name='div', attrs={'class': 'soc-buttons'}),
        dict(
            name='div',
            attrs={'class': 'warning m-t-20 d-none d-md-none d-lg-block'}
        ),
        dict(name='div', attrs={'id': 'news-list-right'}),
        dict(name='div', attrs={'id': 'premium_mobile'}),
        dict(name='div', attrs={'id': 'premium2_mobile'}),
        dict(name='div', attrs={'class': 'marketing-block'}),
        dict(name='span', attrs={'class': 'social-likes__button'}),
        dict(name='div', attrs={'class': 'marketing-block'})
    ]

    feeds = [
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://www.liga.net/news/top/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.liga.net/news/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u0441\u0442\u0430\u0442\u044C\u0438',
            'https://www.liga.net/news/articles/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u0438\u043D\u0442\u0435\u0440\u0432\u044C\u044E',
            'https://www.liga.net/news/interview/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u043C\u043D\u0435\u043D\u0438\u044F',
            'https://www.liga.net/news/opinion/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u0444\u043E\u0442\u043E\u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://www.liga.net/news/photo/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430',
            'https://www.liga.net/news/politics/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0430',
            'https://www.liga.net/news/economics/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E',
            'https://www.liga.net/news/society/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u043C\u0438\u0440',
            'https://www.liga.net/news/world/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u0441\u0442\u043E\u043B\u0438\u0446\u0430',
            'https://www.liga.net/news/capital/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u0441\u043F\u043E\u0440\u0442',
            'https://www.liga.net/news/sport/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u0437\u0434\u043E\u0440\u043E\u0432\u044C\u0435',
            'https://www.liga.net/news/health/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438: \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u0430',
            'https://www.liga.net/news/culture/rss.xml'
        ),
        (
            '\u0412\u0441\u0435 \u043C\u043D\u0435\u043D\u0438\u044F',
            'https://www.liga.net/opinion/rss.xml'
        ),
        (
            '\u0411\u0438\u0437\u043D\u0435\u0441: \u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://www.liga.net/biz/top/rss.xml'
        ),
        (
            '\u0411\u0438\u0437\u043D\u0435\u0441: \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.liga.net/biz/news/rss.xml'
        ),
        (
            '\u0411\u0438\u0437\u043D\u0435\u0441: \u0441\u0442\u0430\u0442\u044C\u0438',
            'https://www.liga.net/biz/articles/rss.xml'
        ),
        (
            '\u0411\u0438\u0437\u043D\u0435\u0441: \u0438\u043D\u0442\u0435\u0440\u0432\u044C\u044E',
            'https://www.liga.net/biz/interview/rss.xml'
        ),
        (
            '\u0411\u0438\u0437\u043D\u0435\u0441: \u043C\u043D\u0435\u043D\u0438\u044F',
            'https://www.liga.net/biz/opinion/rss.xml'
        ),
        (
            '\u0411\u0438\u0437\u043D\u0435\u0441: \u0444\u043E\u0442\u043E\u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://www.liga.net/biz/photo/rss.xml'
        ),
        (
            '\u0424\u0438\u043D\u0430\u043D\u0441\u044B: \u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://www.liga.net/fin/export/top.xml'
        ),
        (
            '\u0424\u0438\u043D\u0430\u043D\u0441\u044B: \u043C\u043D\u0435\u043D\u0438\u044F',
            'https://www.liga.net/fin/opinion/rss.xml'
        ),
        (
            '\u0424\u0438\u043D\u0430\u043D\u0441\u044B: \u0431\u0430\u043D\u043A\u0438',
            'https://www.liga.net/fin/export/bank.xml'
        ),
        (
            '\u0424\u0438\u043D\u0430\u043D\u0441\u044B: \u0441\u0442\u0440\u0430\u0445\u043E\u0432\u0430\u043D\u0438\u0435',
            'https://www.liga.net/fin/export/insurance.xml'
        ),
        (
            '\u0424\u0438\u043D\u0430\u043D\u0441\u044B: \u043A\u0440\u0438\u043F\u0442\u043E\u044D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0430',
            'https://www.liga.net/fin/crypto/rss.xml'
        ),
        (
            '\u0424\u0438\u043D\u0430\u043D\u0441\u044B: \u0444\u043E\u043D\u0434\u044B',
            'https://www.liga.net/fin/export/funds.xml'
        ),
        (
            'Tech: \u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://www.liga.net/tech/top/rss.xml'
        ),
        (
            'Tech: \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438',
            'https://www.liga.net/tech/technology/rss.xml'
        ),
        (
            'Tech: \u0442\u0435\u043B\u0435\u043A\u043E\u043C',
            'https://www.liga.net/tech/telecom/rss.xml'
        ),
        (
            'Tech: \u0433\u0430\u0434\u0436\u0435\u0442\u044B',
            'https://www.liga.net/tech/gadgets/rss.xml'
        ),
        (
            'Tech: \u0441\u0432\u043E\u0439 \u0431\u0438\u0437\u043D\u0435\u0441',
            'https://www.liga.net/tech/own-business/rss.xml'
        ),
        (
            'Tech: \u0431\u0430\u0442\u0442\u043B\u044B',
            'https://www.liga.net/tech/battles/rss.xml'
        ),
        (
            '\u0411\u043B\u043E\u0433\u0438: \u0432\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://www.liga.net/rss/blog.xml'
        )
    ]
PK�X�H�&&liganet_ua.png�PNG


IHDR  D����PLTE�9�������q��d��Mu�|���F����B������������ R�Eo�)Y�Sz�������4a�^��<g�x������M���Y~������P�f��Gp����Pw�����1_����i�엄�tRNS@��fGIDATx�e҅#A�3���9���^��]�(��L�8��_C�iϏbW�?P
aR~��]����`D�z&O2���o*y�M=a��mǻ�/>�^>��::kq�E��Pe�ub`�o�'�G2V|�����E���~H�ϫ��Y" �O�kr֊j�#��ܺ���K�L��I͉
O83�h�U�v<�jf$+y�1S��'�3��@�����6�]���'ƪxDY�)�:?H&bL�/����%����R�9�x���wy�:�-�<�O:?�P���G�'y�#:Y��4�ݕ�������:�6[�PF�{�/�o`�����IEND�B`�PK�X��|�rrliganet_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class LigaNet(BasicNewsRecipe):
    title = '\u041B\u0406\u0413\u0410.net (UA)'
    __author__ = 'bugmen00t'
    description = '\u0414\u0456\u043B\u043E\u0432\u0438\u0439 \u043D\u043E\u0432\u0438\u043D\u043D\u0438\u0439 \u043F\u043E\u0440\u0442\u0430\u043B'
    publisher = 'Ligamedia'
    category = 'blog'
    cover_url = u'https://www.liga.net/design/images/logo_liga.png'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'id': 'news-text'})

    remove_tags = [
        dict(name='footer'),
        dict(name='div', attrs={'class': 'more-link red'}),
        dict(name='div', attrs={'class': 'read-too'}),
        dict(name='div', attrs={'class': 'to-send-row'}),
        dict(name='div', attrs={'class': 'hint-row'}),
        dict(name='div', attrs={'class': 'chronicle-top-eye'}),
        dict(name='div', attrs={'class': 'chronicle-top-comm comm-btns'}),
        dict(name='div', attrs={'class': 'chronicle-news m-t-30'}),
        dict(name='div', attrs={'class': 'right-inner-content'}),
        dict(name='div', attrs={'class': 'right-part'}),
        dict(name='div', attrs={'class': 'hreflang-link'}),
        dict(name='div', attrs={'class': 'vakansii-block-article'}),
        dict(
            name='div', attrs={'class': 'col-12 col-md p-side-10 sp-card-paddings'}
        ),
        dict(
            name='div',
            attrs={'class': 'social-shares d-flex justify-content-center'}
        ),
        dict(name='div', attrs={'class': 'social-shares d-block'}),
        dict(name='div', attrs={'class': 'social-likes clearfix hidden-1280 '}),
        dict(name='div', attrs={'class': 'soc-item comm-btns'}),
        dict(name='div', attrs={'class': 'soc-buttons'}),
        dict(
            name='div',
            attrs={'class': 'warning m-t-20 d-none d-md-none d-lg-block'}
        ),
        dict(name='div', attrs={'id': 'news-list-right'}),
        dict(name='div', attrs={'id': 'premium_mobile'}),
        dict(name='div', attrs={'id': 'premium2_mobile'}),
        dict(name='div', attrs={'class': 'marketing-block'}),
        dict(name='span', attrs={'class': 'social-likes__button'}),
        dict(name='div', attrs={'class': 'marketing-block'})
    ]

    feeds = [
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u0433\u043E\u043B\u043E\u0432\u043D\u0456 \u043C\u0430\u0442\u0435\u0440\u0456\u0430\u043B\u0438',
            'https://www.liga.net/newsua/top/rss.xml'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u0432\u0441\u0456 \u043C\u0430\u0442\u0435\u0440\u0456\u0430\u043B\u0438',
            'https://www.liga.net/newsua/all/rss.xml'
        )
    ]
PK�X�b�lightspeed_magazine.png�PNG


IHDR  ���IDATx^}V{�U�]�;�9�9�k�)o��� ��Z[�bڴ��4U����Z�&P�F�Ҵ���i�;jCcc�"UdPFQ
��sfx
̓��3���Քs�f�Ǖs�:���[{�ϕUSF����B�!IUD�"�J�J`=���������B^H,h�0� �5�t�q��
�����'�����L֝s���}��-&���!!╄��S�N;�;���Y$�tڏ��Lq�?���j�)��1ƞ)��A�[n����|�@��}���g�#"$���/�Q?6���K��w�r�`�t_fW�'��x���s��7�˜�s潸i�؏^Gv<��p�3[Z��Z盤�@�9�^�#Em)�����^�hB�!�6k�y���2�Jg^��Km��_N�xo�'�gsʲT�̪k;�B�3�$��,�Ā��Q�D�����+�j���b�)�D��h��Ϯ�]����r?l�5b=��aL�Z�: C�u��۾� ���>
��0�wNK��^y�C�ͧ�zl�|�0�xD��)8�9v���7|w\�����ר�R�%�b_C ��;�ذ��,ly�-�B� >aXR@�"E`H�+���9�g�a5<�M��/����;�U7K*f@�?�}d��{��B^	�.(��8���Q	�{ď$z�n��ҫ[6�{��ʋ\��3g�'N/X���!��H���@8@�Hx�@�w����g���g�gf��D~�Ḋ�p��b����A2=���t���P����h箺��ۖ,Yn'_"���u�S�G��a�$� r �,V7��;t�cN�4������y���G׮~��k�=��=�i�;�Lr�a����I�-�ć��Ѹ��e��=�����Yս�~������g��vu��L�`���7F@�LF��$����'��ڶ�Vgf~[�~x^A�?���o��q�#ߘ1#�N3���8�h�R|�Ѱ��a���I�����8��\w���l�N��&��p�˿�d�M=���mx��1#� Km*a^��A#������t#��~���uk��
i�'�a��b'��|��e��k~��/�maI2�% \H�0$�AU*Z��A5����{�_s���sV�m�����Կ���k��Gҽ]#����h�(I�(�%���ϊ�{h��_?����o��c����O� ��7�֮~���r4hH@F
�k(�sD�b�CE]��˾�L$�<�ٳ�n������q�]j؛��zI���^�H8Q�#y�_���Y���1�����i'���e�����y�=�G��(C��z�I��4�)rZQ�Z��&��I�[ȵ�~�zR�/��t��kk$w�L%<a8 �ψ@�YY��J@@b�|����`�(�$U�0�/��qٲ�ӧL|@��۱D��X��Gn�����^9���K@�@/������P< ���L�������@���T��F�
et_��fhO��@츋&<��[�WL��
�!�a_J�+I��Z�W�/�	jw�zsT>W2�(JDp����I�u붆�+�4�0<S
�!��u�����O� ����q�رǟz��
+���ch'4("L9S��~��6�;��Xcc"绺O���&�����y���ٺ��|n��[��-N{ŝ��?��p������7ͷf�@���7}�K/�-"_C���6���zF�*/����������������ч�ol��MO*}���TУl' � ���*�����jOR���>c��1T�;W�Zm�Ҙ2��ȃe�<���U����*	a�@,��,�%r��j H/噸.a�&<q�zE�TCF" ��x"�D��12�T��D�o���j�����IފIEND�B`�PK�X�N�р�lightspeed_magazine.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1366025923(BasicNewsRecipe):
    title = u'Lightspeed Magazine'
    language = 'en'
    __author__ = 'Jose Pinto'
    oldest_article = 31
    max_articles_per_feed = 100
    auto_cleanup = True
    use_embedded_content = False
    feeds = [(u'Lastest Stories', u'http://www.lightspeedmagazine.com/rss-2/')]
PK�X6�;QQlimba_sarda.png�PNG


IHDR  ��tRNSn��	pHYs���IDATH�c�Oc�0j���=�����@����h.a��46�,�
��͐�׮@����Z_�|iIa��@�:�����~��Z0i� ���5a„������gg�9s�MMM@����]�p�������))ɻv�rrr���c����c`XR��n�=?5��u��@���jAmm%�����������8qBLL���G6n��������'��R/]�7o޼={w�9u:#3}�K�o^��{ڔ3�^?| ��%�~��URRTQQ��`?w��	�ss�44ԁ
��۟������������u˖�--�3fL�����:u[ya"C)/c� G���D?wH$@-���Y�v����߿��ɣG�̟?���o߾�|�P��KW�Z������=z�ݻ7ǎ�2e҃�_�|�����l��n����1
�;��i�/~��_d����C�?x�FJ���ɣ�ݨ��Z@:��fǀ�IIEND�B`�PK�X�i5��limba_sarda.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1501589422(AutomaticNewsRecipe):
    title = 'Limba Sarda 2.0'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup = True
    language = 'sc'
    __author__ = 'tzium'

    feeds = [
        ('Limba Sarda 2.0', 'http://salimbasarda.net/feed/'),
    ]
PK�XjVb���	limes.png�PNG


IHDR(-S�PLTE����5�5�5�5�xD�u6�5�}=�|6�5�5}F��H��I��I��J��M��O��S��T~�U}�Yv�\q�_m�_m�bi�ec�fb�h_�j\�kY�lX�nU�pQ�rO�sM�tL�tK�xF�xE�:A�;A�zA�|?�9;�;;�<;�>;�?:�B:�D:�~<�K9�L9�O9�P9�S9�:�Z8�[8�\8�`8�d7�g7�8�i7�j7�k7�n7�p7�q6�r6�t6�v6�z7�y6�6�5�5�5w��3tRNS7��������ba$4�IDAT�=JA�}�3��boc/x�@���xA	hJ�lfw�2J�Kobz�w޻���zO?g/���C���� �h���lR��Fda3�UE�dh���&+�4��o����V�”�깨�LI�%��ܱ6=۩�%��d=�A�~ُy�ʴ�������d�З����H����IEND�B`�PK�X}��limes.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2012, faber1971'
__version__ = 'v1.00'
__date__ = '16, April 2012'
__description__ = 'Geopolitical Italian magazine'


from calibre.web.feeds.news import BasicNewsRecipe


class Limes(BasicNewsRecipe):
    description = 'Italian weekly magazine'
    __author__ = 'faber1971'

    cover_url = 'http://temi.repubblica.it/UserFiles/limes/Image/Loghi/logo-limes.gif'
    title = 'Limes'
    category = 'Geopolitical news'

    language = 'it'
#    encoding       = 'cp1252'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 16
    max_articles_per_feed = 100
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True
    masthead_url = 'http://temi.repubblica.it/UserFiles/limes/Image/Loghi/logo-limes.gif'

    feeds = [
        (u'Limes', u'http://temi.repubblica.it/limes/feed/')
    ]

    keep_only_tags = [
        dict(name='div', attrs={'class': ['testo', 'copertina', 'occhiello', 'firma', 'didascalia',
                                          'content-second-right', 'detail-articles', 'titolo-local', 'generic-articles']}),
        dict(name='div', attrs={
             'class': ['generic-articles', 'summary', 'detail-articles']}),
        dict(name='div', attrs={'id': ['content-second-right', 'content2']})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['servizi', 'aggiungi', 'label-web',
                                          'bottom-mobile', 'box-abbonamenti', 'box-cerca', 'big', 'little', 'stampaweb']}),
        dict(name='div', attrs={'id': [
             'topheader', 'header', 'navigation-new', 'navigation', 'content-second-left', 'menutext']}),
        dict(name='ul', attrs={'id': 'user-utility'}),
        dict(name=['script', 'noscript', 'iframe'])
    ]
PK�X�@�wwlinux_magazine.png�PNG


IHDR:���>IDATx�c�
8��9P*>|�@h���	E��Z���~˖�
0��`ph�qb�T,�V��IEND�B`�PK�X�5��linux_magazine.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008-2015  , Darko Miletic <darko.miletic at gmail.com>'
'''
linux-magazine.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LinuxMagazine(BasicNewsRecipe):
    title = 'Linux Magazine'
    __author__ = 'Darko Miletic'
    description = 'Linux news'
    publisher = 'Linux Magazine'
    category = 'news, linux, open source, software'
    language = 'en'
    encoding = 'utf-8'
    oldest_article = 35
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = dict(
        name='div', attrs={'class': lambda x: 'full' in (x or '').split()})

    remove_tags_after = dict(name='div', attrs={'id': 'disqus_thread'})
    remove_tags = [
        dict(name='div', attrs={'class': ['attribute-relatedcontent',
                                          'social_bookmarks',
                                          'paginate']}), dict(name='div', attrs={'id': 'articlebox'})
    ]

    feeds = [(u'Linux Magazine Full Feed',
              u'http://www.linux-magazine.com/rss/feed/lmi_full')]
PK�XYPG4

linux_news_de.png�PNG


IHDR  szz��IDATx����$I��ٶm۶m۶�l��ڶm�}3uߺ֓��t�ſIe�o��;�؆i�d�R�@�`S�����q6�IUl*u9���&���J�!_�qJ_ӄQ�Y�q.�x��`�I|ʡ���RZ��8��J����`sE�?�jd3U�M�uy�i~d�長G�߰F<y�ؐZ�r��	��8��:,ϱɲ�p}Nb���ؗCY.�s1S|��^֏8���e����8��U�߁�䠨|[�h>��D�_V��M��YH�e�0Z��F��1�i���C&�S��>"��9+F��0�����F�"@���L6Z�1$�[]�a2SIx+:p�3�z�[؛lU8�Ɍ�2�x�e�"��gl+Їz�S��R�-�ͅ���Yn����N��ؘ?	��*ƕ�X��+s�H�HRS��+��	@
�qS+ �&���ǖ za�IR5�n&vM�Q�m�Xn��@]V���4%� �c���Qݺ�!�/=��E�p'1l	��2�ηE�S�v���vcP� ���d� ��F����]ȓmc�&�̝$�x}z�y�#Ќm��Q��	��k�e�Ͽ�39�U4q�����+���(с{ٟ-�,��8���N�@�9+�a4���Hz�-�^���Y���ՍC��H�"E��*[�]�~��!���4�#�Sh�o<ž,7��"�3q��DIEND�B`�PK�X�վ�linux_news_de.recipe#!/usr/bin/env python2
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1591780224(BasicNewsRecipe):
    title          = 'Linux News'
    # Title of the Recipe
    cover_url = 'https://linuxnews.de/wp-content/themes/linuxnews/images/linuxnews-logo.png'
    # Author
    __author__ = 'Volker Heggemann, VoHe'
    # oldest article to download (in days)
    oldest_article = 4
    # speed up the download on fast computers be careful (I test max.20)
    # ---- can be edit by user
    simultaneous_downloads = 10
    # description, some Reader show this in titlepage
    description = u'Linux news - from https://linuxnews.de'
    # Who published the content?
    publisher = u'https://linuxnews.de'
    # What is the content of?
    category = u'Linux'
    use_embedded_content = False
    language = 'de'
    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True

    # remove the rubbish (in ebook)
    auto_cleanup = True
    # now the content description and URL follows
    # feel free to add, wipe out what you need	 							---- can be edit by user
    #
    # some of this are double
    #
    #
    # Make some tests, may you first comment all of them out, and step by step you add what you'll need?
    #

    feeds          = [
        ('Linux News', 'http://feeds.feedburner.com/linuxnewsde?fmt=xml'),
    ]
PK�X�
 �MMlinuxportal_pl.png�PNG


IHDR�aIDATx�U�m�MQ����>s�f0�BE����R%��R(CJEQ����)H���1�<{/'T���~=k�k���Q��m�K���]S���;W5�=)�����<�,�~��)����%78:+�L���Ų���֐h�&� $	�b���:��q�5N��`�j�{5i���A�\F�f!)g��7� 
QE�IU�j9��O��	�����3�Z�_Cuz1��!�5�� FqN��Y��vϽ�9D�
g�º���Q�Ab�#
��G�C������&|��dd���T�hN�D^�WqD��P�2��ަ������e`��>Gh�af"�W�?��O	
�����v��7�C�$�.Y0��B��Kz��EC&1���*�PTb;�ѻ��;�yj~c�$��6��$�|ũ�m6<0�
�PA=�@�^����<�oZ�@�D1�2P(V�W�}R�~��T<���G>Уf�͓s;�bNjH�*������_���W�J�<h��#�o�}f~gk��*�D��nۮ��I�BJeC����G�Q(a�VI4�<]���T���t���'�?������XU��w�>?0�\��:#���Pp5_r�¨��U�g_+�Vl8{k��;�y����
6�u�xQ.^�NX��-/3��N�#����*�[���=ɕ�5�:�HZ�T�q�C��6�.	��Kٶ�wt�,��5`=^A0��Q����N�-{mu>{�����^8�B�ņc�Mw�k�B�3��HU��O=��mx�_��p!ͬ��IEND�B`�PK�X��w%%linuxportal_pl.recipe__license__ = 'GPL v3'
from calibre.web.feeds.news import BasicNewsRecipe


class LinuxPortal(BasicNewsRecipe):
    title = u'LinuxPortal'
    __author__ = 'fenuks'
    description = u'Na LinuxPortal.pl znajdziesz wiadomości o systemie Linux, open source oraz Androidzie.'
    category = 'it'
    language = 'pl'
    cover_url = 'http://www.linuxportal.pl/templates/css/loga/Linuxportal.gif'
    masthead_url = 'http://www.linuxportal.pl/templates/css/loga/Linuxportal.gif'
    use_embedded_content = False
    oldest_article = 7
    max_articles_per_feed = 20
    no_stylesheets = True
    remove_empty_feeds = True
    remove_javascript = True
    remove_attributes = ['style', 'font']
    ignore_duplicate_articles = {'title', 'url'}
    auto_cleanup = True

    def parse_index(self):
        feeds = []
        feeds.append((u'Wszystkie wiadomości', self.get_articles(
            'http://www.linuxportal.pl/news/wszystkie')))
        return feeds

    def get_articles(self, url):
        articles = []
        blacklist = {'dobreprogramy.pl', 'osworld.pl', 'osnews.pl', }
        nexturl = url
        counter = 0
        skip = False
        while counter < self.max_articles_per_feed:
            soup = self.index_to_soup(nexturl)
            nexturl = soup.find(attrs={'title': 'Starsze wyniki'})['href']
            for tag in soup.findAll(attrs={'class': 'lista_wizyt_kol_tytul_news'}):
                title = tag.h2.a.string
                url = tag.find(attrs={'class': 'linkzrodlo'})['href']
                date = ''
                for item in blacklist:
                    if item in url:
                        counter -= 1
                        skip = True
                        break
                if skip:
                    skip = False
                    continue

                articles.append({'title': title,
                                 'url': url,
                                 'date': date,
                                 'description': ''
                                 })
                counter += 1
        return articles
PK�XɺPPlist_apart.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿kIDATHǭToLVe����j���9���26ۢlkR�
�>X�ֈ
[��mJ
��2!���Z��d�
6�-��G+�-�'�������‹lo�g���>���9�s�cY���69%�AA��� �~6"�LС����A�vP	S��tp0䟍k�e�~5�.�����;�N��(}�7�!zU��m�!&M�+�}���m��z�JƁe�Ԧ]������6\ ɍ�5#��SՂ^�y�f;Z�3c���2;�58��U�	��Q_�O��v�␉�AW��	�^v	�íx�ޓ��=H���߈K�n`;��ų����%(R߰A9�p��)�6�:�.�H8H���·(º�!�Ea�fU��� ��8�7�X+*|>ʎ�7�9ڈu���ѧ�N�(jq˃��4v�*~_�"��V���=�ێ���AΙr5N��gP%��u%��Sz`��	�ŎE%��F5ѱ��2܋5ޗ�q�
2�]�Y�:O%l
�s�Qʧ�etR�p_�~+51\$)�/��ic�v�C]��(�?~�s7��.�uj	/�n�f����	���,>��a�ɳ�ڸM�+}&��MpTO��٢I�ۗ�?5q� -A�iz�ѲIT��O|�v������D���+vN��}m�Eq �7ѨwB�M�j�W��G�1E���`��@�{�ɭ*[���*�A�\+�ʤZt�/R���4I�߯����EBX����<��ѐi�,sNj"vk���_%'ʹ֥%p�����h�Ƨ�+R��qL�[Փ�)�oc=^�T^�
�_��
l�,������σ�?Ў&^������T$��0��F,��qw���sl��F)V"���b��2S̽�sH��ky{ W,J9�M��nLj{�����A��P�X�R�����Κ~�:)^"��c|U��=�v�n^a���.�EK�֘G���*¥I���[1�������&�����{�5Y�A���u��)a/}�=�o��>|��c�5��tr�".lK1%��q�U'�I,��Q�mJ��P������-�T�C4/�ɓ��PW�8�XӬh�L7�hʨм�ѐ�Bt�57���֛��������w�%tEXtdate:create2022-07-22T07:12:08+00:00���_%tEXtdate:modify2022-07-22T07:12:08+00:00��n�IEND�B`�PK�X������list_apart.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe
import re


class AListApart (BasicNewsRecipe):
    __author__ = 'Marc Busqué <marc@lamarciana.com>'
    __url__ = 'http://www.lamarciana.com'
    __version__ = '2.0.1'
    __license__ = 'GPL v3'
    __copyright__ = '2012, Marc Busqué <marc@lamarciana.com>'
    title = u'A List Apart'
    description = u'A List Apart Magazine (ISSN: 1534-0295) explores the design, development, and meaning of web content, with a special focus on web standards and best practices. This recipe retrieve articles and columns.'  # noqa
    language = 'en'
    tags = 'web development, software'
    oldest_article = 120
    remove_empty_feeds = True
    encoding = 'utf8'
    cover_url = u'https://alistapart.com/wp-content/uploads/2019/03/cropped-icon_navigation-laurel-512.jpg'

    def get_extra_css(self):
        if not self.extra_css:
            br = self.get_browser()
            self.extra_css = br.open_novisit(
                'https://raw.githubusercontent.com/laMarciana/gutenweb/master/dist/gutenweb.css').read().decode('utf-8').replace('@charset "UTF-8";', '')
        return self.extra_css

    feeds = [
        (u'A List Apart', u'https://alistapart.com/main/feed'),
    ]

    def image_url_processor(self, baseurl, url):
        if re.findall(r'alistapart\.com', url):
            return 'http:' + url
        else:
            return url
PK�X0?��##live_law.png�PNG


IHDR  ��tRNSn���IDATx�b���Q�]Jc���i��8UF�;��g���l�rˬm��&�ڥU�}v��*[_߼��<�s�Jw�+�{:���
&,.��k�Xݤ.�a�:t�k�/�ϺLe�͠t^ʠ�'���HU�*ר<�9~	��@�8;�F�C;!3�����(w���,L����30�E~jk�W�޺Y|[cܙ��>LG8�?�̠��jw��c�-�]�m�wb	���bо7h��tB��=�ڍL�.�u��b� �ϲ`����7��9�4�5�j�("A�^�i�lG0R'y띎��@�R'bl��7���(Фމ��:B�N���-&m�a�+�c�'\�k�����L�Pbl&,�~�i�N类��ȗ0m��Xy!�~NH���p�o�YL��P:=�Z,챮��5��q8��b	���B
��:ݠu���)6�e,f�����wD0�m�W�m�glqKX�
�A�tq����t"�ܧrw��c��P���/���\�P<Ge��Q�$u��X�U0��ebd\ �
L@�H�l������r��4����J�a�_l�M�#�2��}�`��/�	ɁB%+Q��� ֈa6��e�����rp��Ig��"�6T9a�ι�DbI��;I�מWZsA� .rM���z�j��+���K���N�\��R.���<�0FA`�8�@%\N�_��&����  	"*.�����a�)}U~�>]C1������0���}���~����v�}�6+�w�Ek�����C?\��0B�ק!�w��C�
uw��v�Y�N�&�ɍ<N�Y����]�����8�eS�V}�f��M�4,�q��!|�>>>B7M�����{�WW������C�<�Ї�:����wgg��������Kc�4-@���OOD����k�Y�6���j�M�T�,���7365����<F�(2N����ZIEND�B`�PK�X�8U�
�
live_law.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from datetime import datetime, timezone, timedelta
from calibre.utils.date import parse_date


def absurl(x):
    if x.startswith('/'):
        x = 'https://www.livelaw.in' + x
    return x


class livelaw(BasicNewsRecipe):
    title = 'Live Law'
    __author__ = 'unkn0wn'
    description = (
        'Live Law is a comprehensive legal news portal which is committed to providing accurate'
        ' and honest news about legal developments.'
    )
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en_IN'
    remove_attributes = ['height', 'width', 'style']
    masthead_url = 'https://www.livelaw.in/images/logo.png'
    oldest_article = 2
    max_articles_per_feed = 20
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    extra_css = '[data-datestring]{font-size:smaller;}'

    keep_only_tags = [
        classes(
            'trending_heading author-on-detail details-date-time detail_img_cover details-content-story'
        )
    ]

    remove_tags = [
        classes('in-image-ad-wrap'),
        dict(
            name='div',
            attrs={'id': lambda x: x and x.startswith('inside_post_content_ad')}
        ),
        dict(name='div', attrs={'id': lambda x: x and x.startswith('filler_ad')})
    ]

    def articles_from_soup(self, soup):
        ans = []
        div = soup.find('div', **classes('news_listing_section_mixin'))
        for h2 in div.findAll('h2', **classes('text_heading')):
            a = h2.find('a', href=True)
            title = self.tag_to_string(a)
            url = absurl(a['href'])
            d = h2.find_next_sibling('div')
            date = parse_date(
                self.tag_to_string(d).replace(' AM GMT', ':00 +0530'
                                              ).replace(' PM GMT', ':00 +0530')
            )
            today = (datetime.now(timezone.utc)).replace(microsecond=0)
            if (today - date) > timedelta(self.oldest_article):
                url = ''

            if not url or not title:
                continue

            self.log('\t', title)
            self.log('\t\t', url)
            ans.append({'title': title, 'url': url})
        return ans

    def parse_index(self):
        soup = self.index_to_soup('https://www.livelaw.in')
        nav_div = soup.find('div', **classes('navbar_center'))
        section_list = []

        # Finding all the section titles that are acceptable
        for a in nav_div.findAll(['a']):
            if self.is_accepted_entry(a):
                section_list.append((self.tag_to_string(a), absurl(a['href'])))
        feeds = []

        # For each section title, fetch the article urls
        for section in section_list:
            section_title = section[0]
            section_url = section[1]
            self.log(section_title, section_url)
            soup = self.index_to_soup(section_url)
            articles = self.articles_from_soup(soup)
            if articles:
                feeds.append((section_title, articles))
        return feeds

    def is_accepted_entry(self, entry):
        # Those sections in the top nav bar that we will omit
        omit_list = [
            'videos', 'job-updates', 'events-corner', 'sponsored', 'hindi.livelaw.in', 'javascript:void(0);',
        ]
        is_accepted = True
        for omit_entry in omit_list:
            if entry['href'].endswith(omit_entry):
                is_accepted = False
                break
        return is_accepted
PK�X:S�UUlivemint.png�PNG


IHDR  D���BPLTELiq���������@��ɀ��0������� ����`�Ϗ����P�ݯ���tRNS0@p���.�6h�IDATx�͓U� ���z��N��e��*8q��8¨K�ǂ?��;�ޯ[�p�u������p����-�i�-��dž<�� k+"���?C�i�|�ˆ�����/,!�X�d�t�6�E�np�
��l�Y�Lj���}UW���(&�*`W�o��"2���`�p�	CX!儤��>��Tz��X�oϙ�	Q�fIEND�B`�PK�X&�
w��livemint.recipeimport json
import re
from datetime import date
from calibre.web.feeds.news import BasicNewsRecipe, classes

is_saturday = date.today().weekday() == 5

class LiveMint(BasicNewsRecipe):
    title = 'Live Mint'
    description = 'Financial News from India.'
    language = 'en_IN'
    __author__ = 'Krittika Goyal, revised by unkn0wn'
    oldest_article = 1.15  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://images.livemint.com/static/livemint-logo-v1.svg'

    remove_empty_feeds =  True
    resolve_internal_links = True
    
    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            self.title = 'Mint | ' + date.today().strftime('%b %d, %Y')
            if is_saturday:
                self.title = 'Mint Lounge | ' + date.today().strftime('%b %d, %Y')

    if is_saturday:
        
        def get_cover_url(self):
            soup = self.index_to_soup('https://lifestyle.livemint.com/')
            if citem := soup.find('div', attrs={'class':'headLatestIss_cover'}):
                return citem.img['src'].replace('_tn.jpg', '_mr.jpg')
        
        masthead_url = 'https://lifestyle.livemint.com/mintlounge/static-images/lounge-logo.svg'

        oldest_article = 6.5 # days

        extra_css = '''
            #story-summary-0 {font-style:italic; color:#202020;}
            .innerBanner, .storyImgSec {text-align:center; font-size:small;}
            .author {font-size:small;}
        '''

        keep_only_tags = [
            classes('storyPageHeading storyContent innerBanner author')
        ]
        remove_tags = [
            dict(name=['meta', 'link', 'svg', 'button', 'iframe']),
            classes('hidden-article-url sidebarAdv similarStoriesClass moreFromSecClass linkStories publishDetail'),
            dict(attrs={'id':['hidden-article-id-0', 'hidden-article-type-0']})
        ]

        feeds = [
            ('Lounge News', 'https://lifestyle.livemint.com/rss/news'),
            ('Food', 'https://lifestyle.livemint.com/rss/food'),
            ('Fashion', 'https://lifestyle.livemint.com/rss/fashion'),
            ('How to Lounge', 'https://lifestyle.livemint.com/rss/how-to-lounge'),
            ('Smart Living', 'https://lifestyle.livemint.com/rss/smart-living'),
            ('Health', 'https://lifestyle.livemint.com/rss/health'),
            ('Relationships', 'https://lifestyle.livemint.com//rss/relationships')
        ]

        def preprocess_html(self, soup):
            if h2 := soup.find('h2'):
                h2.name = 'p'
            for also in soup.findAll('h2'):
                if self.tag_to_string(also).strip().startswith('Also'):
                    also.extract()
            for img in soup.findAll('img', attrs={'data-img': True}):
                img['src'] = img['data-img']
            return soup
    else:
        
        def get_cover_url(self):
            soup = self.index_to_soup(
                'https://www.magzter.com/IN/HT-Digital-Streams-Ltd./Mint-Mumbai/Newspaper/'
            )
            for citem in soup.findAll('meta', content=lambda s: s and s.endswith('view/3.jpg')):
                return citem['content']

        extra_css = '''
            img {display:block; margin:0 auto;}
            #img-cap {font-size:small; text-align:center;}
            .summary, .highlights, .synopsis {
                font-weight:normal !important; font-style:italic; color:#202020;
            }
            h2 {font-size:normal !important;}
            .author-widget {font-size:small; font-style:italic; color:#404040;}
            em, blockquote {color:#202020;}
            .moreAbout, .articleInfo, .metaData, .psTopicsHeading, .topicsTag {font-size:small;}
        '''

        keep_only_tags = [
            dict(name='article', attrs={'id':lambda x: x and x.startswith(('article_', 'box_'))}),
            classes('contentSec')
        ]
        remove_tags = [
            dict(name=['meta', 'link', 'svg', 'button', 'iframe']),
            classes(
                'trendingSimilarHeight moreNews mobAppDownload label msgError msgOk taboolaHeight'
                ' socialHolder imgbig disclamerText disqus-comment-count openinApp2 lastAdSlot bs_logo'
                ' datePublish sepStory premiumSlider moreStory Joinus moreAbout milestone benefitText'
            )
        ]

        feeds = [
            ('Companies', 'https://www.livemint.com/rss/companies'),
            ('Opinion', 'https://www.livemint.com/rss/opinion'),
            ('Money', 'https://www.livemint.com/rss/money'),
            ('Economy', 'https://www.livemint.com/rss/economy'),
            ('Politics', 'https://www.livemint.com/rss/politics'),
            ('Science', 'https://www.livemint.com/rss/science'),
            ('Industry', 'https://www.livemint.com/rss/industry'),
            ('Education', 'https://www.livemint.com/rss/education'),
            ('Sports', 'https://www.livemint.com/rss/sports'),
            ('Technology', 'https://www.livemint.com/rss/technology'),
            ('News', 'https://www.livemint.com/rss/news'),
            ('Mutual Funds', 'https://www.livemint.com/rss/Mutual Funds'),
            ('Markets', 'https://www.livemint.com/rss/markets'),
            ('AI', 'https://www.livemint.com/rss/AI'),
            ('Insurance', 'https://www.livemint.com/rss/insurance'),
            ('Budget', 'https://www.livemint.com/rss/budget'),
            ('Elections', 'https://www.livemint.com/rss/elections'),
        ]

        def preprocess_raw_html(self, raw, *a):
            if '<script>var wsjFlag=true;</script>' in raw:
                m = re.search(r'type="application/ld\+json">[^<]+?"@type": "NewsArticle"', raw)
                raw1 = raw[m.start():]
                raw1 = raw1.split('>', 1)[1].strip()
                data = json.JSONDecoder().raw_decode(raw1)[0]
                value = data['hasPart']['value']
                body = data['articleBody'] + '</p> <p>'\
                        + re.sub(r'(([a-z]|[^A-Z])\.|\.”)([A-Z]|“[A-Z])', r'\1 <p> \3', value)
                body = '<div class="FirstEle"> <p>' +  body  + '</p> </div>'
                raw = re.sub(r'<div class="FirstEle">([^}]*)</div>', body, raw)
                return raw
            else:
                return raw

        def preprocess_html(self, soup):
            for strong in soup.findAll('strong'):
                if strong.find('p'):
                    strong.name = 'div'
            for embed in soup.findAll('div', attrs={'class':'embed'}):
                if nos := embed.find('noscript'):
                    nos.name = 'span'
            for span in soup.findAll('figcaption'):
                span['id'] = 'img-cap'
            for auth in soup.findAll('span', attrs={'class':lambda x: x and 'articleInfo' in x.split()}):
                auth.name = 'div'
            for span in soup.findAll('span', attrs={'class':'exclusive'}):
                span.extract()
            for img in soup.findAll('img', attrs={'data-src': True}):
                img['src'] = img['data-src']
            if wa := soup.find(**classes('autobacklink-topic')):
                if p := wa.findParent('p'):
                    p.extract()
            return soup

        def populate_article_metadata(self, article, soup, first):
            article.title = article.title.replace('<span class="webrupee">₹</span>','₹')
PK�XtC�Wlivescience.png�PNG


IHDR  ��tRNSn��	pHYs���IDATH��YL�WǏ�DCWD�}{�4v`��l��C����(P�4�4nĔM2�(Ht���%.�AۇFCc�j@ǁ�mAe���͠�`tL�����f�w��;�s�9���`���m�0'g}�|�9��iC9]��6�۟�o$b�W�!Xx0��F�{֤sl`�I��6N
��"���TK�qh�B�,�g�K<��Gz������	d�ө:�%�<�1�i��*gqۍK����#�n�?m���'���!mZ
X=��2��S5i��R��q�v!=Yc���T�@E5qr��G�M�XGp�������1��(�rr��C�����t�u�p17ͥ�)X@�xwN@* ;�DR�~t:ڰ�L"Z�cU(�k���M�~�=8Ou[�T�F<6�̋����Q$=H{x���<>QbDH�~����d����T�V���MtR�\�L����P�xH����$��m�.>Xutɟ�!u5Tƚ.��ʂ�8�,^zP ��9�����ث��nX5O�ae0Y������'g�d
>l��ZZ�
k���;��;ك�tyVL�@K$V��6��L��x�IA��q�p+�@����y�4X�D��L
Y��1���e#�֎�J�!��+����k���;�6�+��=y��K2 |�jIr�H]
L��03:qCVM]��K*
���~2M�m~�
�Y1L��$a~�T����e�g�J
���]�����'PJ{�վ��G�����10}A�a��U0E�]��Z�\�[B��>9D���[ :�=Ӏ��+�a�N�w�.	�F�/���+�4�p�0
��޲�����c�ةx�����Ƥ���e��Ğ,��4_{[�����Ҋ��<�����W1��I�ny��g�v�9��?�Yo^��IEND�B`�PK�X:��o  livescience.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class LiveScience(BasicNewsRecipe):
    title = "Live Science"
    description = "For the science geek in everyone! Stories on the latest findings from science journals and institutions. Sourced from livescience.com"
    __author__ = 'yodha8'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('Live Science All Articles', 'https://www.livescience.com/feeds/all'),
    ]
PK�X��bbliving_stones.png�PNG


IHDR  szz�)IDATxڥ��%ME�mk۶���h�xm��m۶m��7IOrRy��o��tWݩ����*V$o��]끷�'�S�>���0Fd@�<��.�CⲸ*N�ub��&>�����d��[�}G4{E,Q��C�O�$†ϵy�߸#$�"�{w/��1�@t�Ѵ"�y[��
;b�@LL�w��	��
�8Q��v��x�۹!�2�&w&��U�m��LX
��0�-)ց��"���\�bf�SqA�w�8�`�5qI<6B��Q�'C���.B�:��`�9\�?���b���J?
��P���ѧ�	�-Q�i�a�Z�����`�.�����K�6ĺ�,Z�
��=��k�R@W>L�6x~G|�g����b�q��pT�%���`��(�L~B��gG��\ʎa<mZ�<�D^ƃTX3��;"�Xl�뒞��4p��!j��(�`�_���T�)�Yn��b�(�1��+�oS�ut`xa�
3���1n)mbL~�ð�Ӱ�Y�ΈΘ��?1n	l�}ωO�5������]��y�1Q�%1�q��Ӹ|�<E��Xh�گS�Shm���k0Ӏ�s�}��1�[�edў	���l�,��.���TB�|��/B6��ׁ�1����A�o��o���`(Tz�E��ą*��O�6�����󗢂�8
��bM��#�Q���+�������#�S.��ſ�'�F�\��v��(ډw�;�W�A��0�O<M��b��#>J�K�'�x[�/J���R"��4�o�=^JTn��@|IEND�B`�PK�X��Y
��living_stones.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Peter Grungi <p dot grungi at gmail dot com>'

from calibre.web.feeds.news import BasicNewsRecipe


class LivingStonesPastorsBlog(BasicNewsRecipe):
    title = u'Living Stones Pastors Blog'
    __author__ = 'Peter Grungi'
    language = 'en'

    oldest_article = 90
    max_articles_per_feed = 10
    auto_cleanup = True
    cover_url = 'http://blogs.livingstonesreno.com/wp-content/uploads/2011/08/blogBGRD_norepeat.jpg'
    masthead_url = 'http://www.livingstonesreno.com/podcast/LSpodcastnew.jpg'
    publisher = 'Living Stones Church of Reno, NV'
    language = 'en'
    author = 'Living Stones Church of Reno, NV'

    feeds = [
        (u'LS Blog', u'http://blogs.livingstonesreno.com/feed?utm_source=calibre&utm_medium=rss')]

    def full_version(self, url):
        import re
        newurl = re.sub(r'\?.*', '', url)
        return newurl
PK�X��P��	lomza.png�PNG


IHDR��7�OIDATx�AKSq���l�l�Z�$�
�$�"(�� �>��N���7�t�^�]�:t�$�F�,&jc{�m���U6*I������˞�-�%��CGZa���so��}5M]��V�}�j� ��-�G��U�1�Qzb�$3�=+��uôZS�ۧ�CCA%R��
�(����GBMe�B+-[s��iXUL���)G���5M'��������jy�c�yCɆ=mg�k�Xs�<5�m��hҬR�
w��?�vZ~�hSt��m�g_}36�治�>��i&���L����T���$I�$@
.XT��Yu"���IEND�B`�PK�XSݵVlomza.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Lomza(BasicNewsRecipe):
    title = u'4Łomza'
    __author__ = 'fenuks'
    description = u'Regionalny portal. Najświeższe informacje z regionu, kulturalne, sportowe. Ogłoszenia, baza biznesu, forum.'
    cover_url = 'http://www.4lomza.pl/i/logo4lomza_m.jpg'
    language = 'pl'
    oldest_article = 15
    no_stylesheets = True
    extra_css = '#foto {float: right; max-width: 200px; margin-left: 10px;} #fotogaleria > div {float:left;} .br {clear: both;}'
    max_articles_per_feed = 100
    remove_tags = [
        dict(name='div', attrs={'class': ['bxbanner', 'drukuj', 'wyslijznajomemu']})]
    keep_only_tags = [dict(name='div', attrs={'id': 'srodek'})]
    feeds = [(u'Łomża', u'http://feeds.feedburner.com/4lomza.pl')]
PK�X�N�P��london_free_press.png�PNG


IHDR�atIDATx�c���?^����cמZ��r!5k��)!MV��&W���_�kߨ�:x#�f�����
��f�er��������g.\5�P6�`�I��S<~?C�s��K��U�fH��ӽr2܀�y�ZH5�.k��?~��
Xu�z�H��=}�� ؀[Oު2���%�&��?������f��IHuŢM���hU�������5i�R
pɟ��ׯ_�`fm��B�ra�޽{�6�ԍg������ڍ�j`�|��������Ow8��Z)��Sl�q2�|���KKv���z��5�O�>q�
�j߲���I\�ɨ��K:�-.ݱk�;P�0��R2�3n�{�
T솮�PR0����IEND�B`�PK�X��/�  london_free_press.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class LondonFreePress(BasicNewsRecipe):
    title = u'London Free Press'
    __author__ = 'rty'
    oldest_article = 4
    max_articles_per_feed = 100

    publisher = 'lfpress.com'
    description = 'Ontario Canada Newspaper'
    category = 'News, Ontario, Canada'
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en_CA'
    encoding = 'utf-8'
    conversion_options = {'linearize_tables': True}

    feeds = [
        (u'News', u'http://www.lfpress.com/news/rss.xml'),
        (u'Comment', u'http://www.lfpress.com/comment/rss.xml'),
        (u'Entertainment', u'http://www.lfpress.com/entertainment/rss.xml '),
        (u'Money', u'http://www.lfpress.com/money/rss.xml '),
        (u'Life', u'http://www.lfpress.com/life/rss.xml '),
        (u'Sports', u'http://www.lfpress.com/sports/rss.xml ')
    ]

    keep_only_tags = [
        dict(name='div', attrs={'id': 'article'}),
    ]
    remove_tags = [
        dict(name='div', attrs={'id': 'commentsBottom'}),
        dict(name='div', attrs={'class': ['leftBox', 'bottomBox clear']}),
        dict(name='ul', attrs={'class': 'tabs dl contentSwap'}),
    ]
    remove_tags_after = [
        dict(name='div', attrs={'class': 'bottomBox clear'}),
    ]
PK�XG��2DDlos_danieles.png�PNG


IHDR  D����PLTE�"���� ��!��!�'
� ��*�"�����lX�'	�y�&�����?%�>$���K3�����yg�)����nZ��#�K2�}k�<!����s`�B(����+��������&	�Q:�w����Q9�:������[E�}l�~m�cM�D+������YB�{��-���%�o\�������aL�.�#���������7��������~�{i��zh�������2����R:����������¹�,�/�*
�����������we���jV����J2����5�$�t������N6�.�û�%�V?����(�7��R;�����L4�W@�p������xf�S;������Ļ�ļ������$�-�8�<"�8�3��bIIDATx�ős�@��w����6j۶m��/�5�vGk<K����xdּ2R��Q�j��w��^�?�� �Wz~q�����z,�HǶ7o��)Lc���	�Xw}���;��� �v�����.��BD����G�aμ�:3+;����6�@a��t"��V�5P��J_	P��P
PcTa�KQyb�
�b�"!�&-�iE�"-��F��a�vA,n��&��n���аx��1��wN495��9�M�\`����"8��Z
.�V�Q���fr���0o;wvu{���H�H�ơ���9K0z����W.�H.?d�wIEND�B`�PK�XT)��los_danieles.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1618167843(BasicNewsRecipe):
    title          = 'Los Danieles – Columnas sin techo'
    __author__ = 'CAVALENCIA'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True
    language = 'es_CO'

    feeds          = [
        ('Los Danieles – Columnas sin techo', 'https://losdanieles.com/feed/'),
    ]
PK�X�����los_tiempos_bo.png�PNG


IHDR:����IDATx�]�!� DQ:6� �1u�N���X��b#�*�� .
�eH&Y���| Ia諐�ft��r�PP���Y�O�\����(1D��C����N�l�@/0츃��;(��F߀3�M4�|P���`�0�V��z��x���@�IEND�B`�PK�X�]���	�	los_tiempos_bo.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.lostiempos.com
'''

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class LosTiempos_Bol(BasicNewsRecipe):
    title = 'Los Tiempos - Bolivia'
    __author__ = 'Darko Miletic'
    description = 'El periódico de mayor circulación en la ciudad de Cochabamba, Bolivia'
    publisher = 'Los Tiempos'
    category = 'news, politics, Bolivia'
    oldest_article = 1
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'es_BO'
    publication_type = 'newspaper'
    delay = 1
    remove_empty_feeds = True
    cover_url = strftime(
        'http://www.lostiempos.com/media_recortes/%Y/%m/%d/portada_gd_1.jpg')
    masthead_url = 'http://www.lostiempos.com/img_stat/logo_tiempos_sin_beta.jpg'
    extra_css             = """ body{font-family: Arial,Helvetica,sans-serif }
                                img{margin-bottom: 0.4em}
                                h1,.hora,.breadcum,.pie_foto{font-family: Georgia,"Times New Roman",Times,serif}
                                .hora,.breadcum,.pie_foto{font-size: small}
                                .en_gris,.pie_foto{color: #666666}
                                """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [dict(name='div', attrs={'id': 'articulo'})]
    remove_tags = [
        dict(name=['meta', 'link', 'form', 'iframe', 'embed', 'object', 'hr']), dict(
            attrs={'class': ['caja_fonts sin_border_bot', 'pub', 'twitter-share-button']})
    ]
    remove_attributes = ['width', 'height']

    feeds = [

    (u'Nacional', u'http://www.lostiempos.com/rss/lostiempos-nacional.xml'),
    (u'Local', u'http://www.lostiempos.com/rss/lostiempos-local.xml'),
    (u'Deportes', u'http://www.lostiempos.com/rss/lostiempos-deportes.xml'),
    (u'Economía', u'http://www.lostiempos.com/rss/lostiempos-economia.xml'),
    (u'Internacional', u'http://www.lostiempos.com/rss/lostiempos-internacional.xml'),
    (u'Vida y Futuro', u'http://www.lostiempos.com/rss/lostiempos-vida-y-futuro.xml'),
    (u'Tragaluz', u'http://www.lostiempos.com/rss/lostiempos-tragaluz.xml'),
    (u'Opiniones', u'http://www.lostiempos.com/rss/lostiempos-opiniones.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X�F^�&&losservatoreromano_it.png�PNG


IHDR  ��tRNSn���IDATxڵ��_�o�B��Pʖ�7bw�"�Ҷ`�`�9�lw��v��߳��1ߓ����>7x'j�H:>�|
>pd"A1�M
Jx$�x@Q�IZ=��{~���/��Z>��C�U���B��}�9�g�N�D�A��l����BL��4��W����Оo�>�lbb>�2d,����vji�����m*�<�[}X<���H8�\2��Kk�g�Ǵ�������r��6��/�8�Z&[����z"��x��_+�T1P�w��Z�xV88=��5
~��gm����7��7ٝ�L�qq�^]w#�8d�S5�g�J���:.xb���U]M��RiD&����p�y�ޞ�\JD
>�D�{LghW���?Q4֑+�}������Ѫko�*w���W��;C�E�M��n��hn���c2�0�ء�
X��E.bA���;�!1����]3xDd�P�<�xQ��W}N[ÕU3o�6���s��NB��b���Cп���g+�j��(ثe��,w������˓�c����W�Q��P��r/�'���t��r���[<�=_�=[<�{��/�"�5��z����j�a�9
���lj�>]qc�B"��(��_̎;g���?;f�4R�<s�ږ���ͯz[֬S.C�A��#V�����Sd7#�����g�5�f��w˷W����I��~��_�c�Mی��b!���A�c:�z�*���	���_�?u��5�|!f����ݐ�a�?��n��ן���f6��|�2���@zK(�����F�����e0]�Շ1�nxL� ��<*�C��9�4�j�hxo�HĀT�>M�����*&>(345��Ii�(l�
��}~c?ݥ�@������)�]@�Am5O��ѩn���~����L���ש��ے�Y%�rv�uy��ǗΩ�f�Y#k���"_[��~Й9����r2�)l��Ddo��4ڷ�Z�w� �[�:.�ɘy��e��(≘���Z�kR�CV��}����H%lJdq8��Z V�;����u�NBW�<~���`�,��/
��j6#�?K�L�+�W��+OnU|:U�D�*��l��=�d�_-��:�
"�2�|���i2\��;&z�m�Rv}����Ċ�W�1u��q�}&�hG�T��#��� C������	M3�C]R�����V��y��%bi'�]�C��ƞg��Y60o�5Kj�l>�ơ���>k4�h\&�I���z�GN����FZ�����z ��UV�_��!�lq'�p'��5�!f��g�5
���ru%���Y��;���=���m�0�,�7�|��,�����``ab�c����á@μ�F�U4҉���H��{��;��|�
�)E^'�֊10�ģ�����X�5��O����|t�6~�z4O4r����M��O���-�O�U�����ݣ�ѩ�%]�F7l�o?�\�D,NXNIEND�B`�PK�X� ��losservatoreromano_it.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.vatican.va/news_services/or/or_quo
'''


from calibre.web.feeds.news import BasicNewsRecipe


class LOsservatoreRomano_it(BasicNewsRecipe):
    title = "L'Osservatore Romano"
    __author__ = 'Darko Miletic'
    description = 'Quiornale quotidiano, politico, religioso del Vaticano'
    publisher = 'La Santa Sede'
    category = 'news, politics, religion, Vatican'
    no_stylesheets = True
    INDEX = 'http://www.vatican.va'
    FEEDPAGE = INDEX + '/news_services/or/or_quo/index.html'
    CONTENTPAGE = INDEX + '/news_services/or/or_quo/text.html'
    use_embedded_content = False
    encoding = 'cp1252'
    language = 'it'
    publication_type = 'newspaper'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    def parse_index(self):
        articles = []
        articles.append({
            'title': self.title, 'date': '', 'url': self.CONTENTPAGE, 'description': ''
        })
        return [(self.title, articles)]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X
lW@{{lrb.png�PNG


IHDR:���BIDATxڝ��	@B�ɝ�τ8�3	�E.�+H�P���mM�ω�'���'	)��*���/g`u�KCO�IEND�B`�PK�X'�2ى�
lrb.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2019, Kovid Goyal <kovid at kovidgoyal.net>
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)})


def absolutize(href):
    if href.startswith('/'):
        href =  'https://www.lrb.co.uk' + href
    return href


class LondonReviewOfBooksPayed(BasicNewsRecipe):
    title = 'London Review of Books'
    __author__ = 'Kovid Goyal'
    description = 'Literary review publishing essay-length book reviews and topical articles on politics, literature, history, philosophy, science and the arts by leading writers and thinkers'  # noqa
    category = 'news, literature, UK'
    publisher = 'LRB Ltd.'
    language = 'en_GB'
    no_stylesheets = True
    delay = 1
    encoding = 'utf-8'
    INDEX = 'https://www.lrb.co.uk'
    publication_type = 'magazine'
    needs_subscription = True
    requires_version = (3, 0, 0)

    keep_only_tags = [
        classes('article-header--title paperArticle-reviewsHeader article-content letters-content'),
    ]
    remove_tags = [
        classes('social-button article-mask lrb-readmorelink article-send-letter article-share'),
    ]
    remove_attributes = ['width', 'height']

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username and self.password:
            br.open('https://www.lrb.co.uk/login')
            br.select_form(id='login_form')
            br['_username'] = self.username
            br['_password'] = self.password
            raw = br.submit().read()
            if b'>My Account<' not in raw:
                raise ValueError('Failed to login check username and password')
        return br

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-srcset': True}):
            for x in img['data-srcset'].split():
                if '/' in x:
                    img['src'] = x
        return soup

    def parse_index(self):
        articles = []
        soup = self.index_to_soup(self.INDEX)
        container = soup.find(attrs={'class': 'issue-grid'})
        img = container.find('img')
        self.cover_url = img['data-srcset'].split()[-2]
        h3 = container.find('h3')
        self.timefmt = ' [{}]'.format(self.tag_to_string(h3))
        a = img.findParent('a')
        soup = self.index_to_soup(absolutize(a['href']))
        grid = soup.find(attrs={'class': 'toc-grid-items'})
        articles = []
        for a in grid.findAll(**classes('toc-item')):
            url = absolutize(a['href'])
            h3 = a.find('h3')
            h4 = a.find('h4')
            title = '{}: {}'.format(self.tag_to_string(h3), self.tag_to_string(h4))
            self.log(title, url)
            articles.append({'title': title, 'url': url})

        return [('Articles', articles)]
PK�X
lW@{{
lrb_payed.png�PNG


IHDR:���BIDATxڝ��	@B�ɝ�τ8�3	�E.�+H�P���mM�ω�'���'	)��*���/g`u�KCO�IEND�B`�PK�X*ݭ��ludwig_mises.png�PNG


IHDR  ��tRNSn���IDATx^��kl��ϝ�cgֻ뵽~�c␐��6���$�@)�B�R�E)헶�
�
�*�~�h�*E@!�h�ACd(Qp�	���zwvvv^�ֻ�PB�ڣ;F�s���\�ݪ~C4��ph��=+n:IԹv�s<�|�2��+���a�
<���}^R-�'&�:�����PÝFd�����d����
c}�f'&���p"�m����'���"@�`�D����DQcWnl��Pͪ�倫��w�:3C��/\�q����y�{��6��)H��`�S_*A��3�"�U\���;��֗���p]%dI��$��c��ytߍN+���K��%����g�B�g3�dR���0S���e8'?�W�yj��譇_YZ�A�l^8�(��RDR@}'
{�t��r�G˿�M?�o�R�ϒ�Kd��6��:��O����ۛ����ve���k�4�?�AHq1��������~|��c�o�
@���H����m��Ȗ�-�L�a�p�	%7�d��y��@�0���_���;'�W�}�>=,�d��V4�b4��z��ڱ>2>�n�I!ͱ��8\T	���X9�.5�43�UQ�h�]��0�D��fGl�#�"�������tDQ�]��)s\�r������o6������ϭ�����T7��T�o9����o\w�����Y����x0�s�$͔�%V:93�m�C{�6�@ �������Y����̜�)91$�y���{.q\��v�k4��w7�Z�uj�r�s�ѳ�H�\��(sM��q�
��N8�X�E$��Nِ] �ȉʌj���Ό�����ٽ�f�,rp��)�1
L����;���ђ����p����b�'�����8.�φ<{\�#�}MK�n_2֧�|(O�����+��v�L���e��W$�%Z4���K%���(
�4ϡ'�\���Z�c�ѵr3��x�*M��w�X�瑭�baj�l\��c�m��
��r1(a�9�
��oœg��{������M�����r�
�:�2tb��
�����&��3Ova3�����y`�G�C��T���鱣���t�޾�	@�dG�2�����=~�3��N�;]�����eS��A��I*����"��D��3�Z�4L�@<y*�)M���6pX��̟d��������#��L/�ȅb�:V��&T5��\&EM�"D�	��Η��K)Y�r�zz�W5�zM�N�$�6�l�����z�k���6�ۛ���c�LT�|��]!��xV��	(@|�y_���̴�W�̈́���X�(�N�洜���n���N�tl�hP�j%VD�C���ݩ�oq��'��u�MPOP4��<)#��kczpب~y�ݝ���@���B�+d2�,;��],y��^x0ud/������H~v�slH�8B���Fvf`��ɕkךv,�2�9�� ���3�j�}�%��K�@
G�pU�7�_`��(���DM���tzV�v��o�֎T'��7[�
d��PV�(:|�h]+qB��"����8����9^��B=?��>jju
�lt�$�]�I�^V���P�bT��|�-��e����:wD2�|,	P7�"��|J�#(�i����o�a��O�*��6/�j�aA}�1{<p5x&���}=60��Y0�!�#�<!�/�rHw�E��1-���<m��Ǔ���2�vi�W��n�;�|@BI�s=��h�;,��r��'�Y��(���8ƨF�65���o�������+~�� I�Q#>p�_�4@q��_��Ħ{�p�k�|;GD�y��hu8�H�+}߅c�n����2ѻ{'��9M48��͎]|ٕ@@ʯ�����j� 7��U��f���;�u�,zL�����S}gc�C�5���g�s%G �QRl�����~�o6���{�^|߫�;��̺''6<���_�㩩Ƶ�Ȁ.�%�
�CJ�2��o�'q�5�}/���ڻ~����<��s��ӂm�l��ӭw>��:�*���U�K-�.\S���W�<��U;֭�zy�+�|�I��7�,IEND�B`�PK�X�!>��ludwig_mises.recipefrom calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1373130372(AutomaticNewsRecipe):
    title = u'Ludwig von Mises Institute'
    __author__ = 'anywho'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Daily Articles (Full text version)',
              u'http://feed.mises.org/MisesFullTextArticles'),
             (u'Mises Blog Posts',
              u'http://mises.org/blog/index.rdf')]
PK�X�P�luns_a_venres.png�PNG


IHDR  ��tRNSn��	pHYs���IDATH��VKhA��B P	E<�"�T{��A��z�}[A�&Q�V�l���h��Z�೭B��`��l��6M�M���fS�y��L��M_�˗���?��7�]�k�[�X[�/��BE����jB�o8DP�mp�Hk/�X��u͊]�c�"�m@�h�rAL��s���t�;�G��D=;�9����h��O��%8�VCy�������ǻ�P�Vv�O��U��j�8� ��~�Y8ѡ�)���"�_Md�����H�� ���џ�bv���VںH��/�P����'h��ME��Og2ҙT:���']`��費c$�"�)���@���Ah��	T�G;�m�~Oֽ��	�Ő����>
#x=dj���'Q���,�z`���J�\M��gcY�kR�8
�J��Vz�̲zڞ�@�$�Ɏ�I^R�-�%$RL�e:8n0
bBOZ��Nͳ&p%���nK��K��9�+U�Qa��'a԰���j?����%P��-�b�f�4μ��n~�NO:�=�^���SQ_�
%�9F�><�]�}�L MU��/�[��{�(�m�~��l�&������|nn�j�P��h�6��M7�㘆K�����v�g��+;���w����,��Yƅ�b��\���6��T�)B3��K�BΟN�՟bpT��17}�_����Y8�b�Y�õϱ����O�+��{'�U���ا�����S�@{0ޡ��]a-�o����:�cÚ�� j�Q*�U�� ��Q{�dQ��f`�U�Ѱ�JV��.ڥp����+�12�KUo��+�L�c�ܹ��Jg{���mV��=<�䛫�Q4��+F�Q&�ܕ	C��ci��Z�BlhV�Zl(����,K��a��n���G��7��|�ra�sw�	*��t�ޏ
S�WIEND�B`�PK�Xj�2��luns_a_venres.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.news import BasicNewsRecipe


class LV_gl(BasicNewsRecipe):
    title = u'De Luns a Venres (RSS)'
    __author__ = u'Susana Sotelo Docío'
    description = u'O gratuíto galego'
    publisher = u'Galiciaé'
    category = u'news'
    encoding = 'utf-8'
    language = 'gl'
    direction = 'ltr'
    cover_url = 'http://lv.galiciae.com/new_estilos/lv/logo.gif'
    oldest_article = 2
    max_articles_per_feed = 200
    center_navbar = False

    feeds = [
        (u'Galicia', u'http://lv.galiciae.com/cache/rss/sec_galicia_gl.rss'),
        (u'Cultura', u'http://lv.galiciae.com/cache/rss/sec_cultura_gl.rss'),
        (u'Mundo', u'http://lv.galiciae.com/cache/rss/sec_mundo_gl.rss'),
        (u'Cidadanía', u'http://lv.galiciae.com/cache/rss/sec_ciudadania_gl.rss'),
        (u'Tecnoloxía', u'http://lv.galiciae.com/cache/rss/sec_tecnologia_gl.rss'),
        (u'España', u'http://lv.galiciae.com/cache/rss/sec_espana_gl.rss'),
        (u'Deportes', u'http://lv.galiciae.com/cache/rss/sec_deportes_gl.rss'),
        (u'Economía', u'http://lv.galiciae.com/cache/rss/sec_economia_gl.rss'),
        (u'Lercheo', u'http://lv.galiciae.com/cache/rss/sec_gente_gl.rss'),
        (u'Medio ambiente', u'http://lv.galiciae.com/cache/rss/sec_medioambiente_gl.rss'),
        (u'España/Mundo', u'http://lv.galiciae.com/cache/rss/sec_espanamundo_gl.rss'),
        (u'Sociedade', u'http://lv.galiciae.com/cache/rss/sec_sociedad_gl.rss'),
        (u'Ciencia', u'http://lv.galiciae.com/cache/rss/sec_ciencia_gl.rss'),
        (u'Motor', u'http://lv.galiciae.com/cache/rss/sec_motor_gl.rss'),
        (u'Coches', u'http://lv.galiciae.com/cache/rss/sec_coches_gl.rss'),
        (u'Motos', u'http://lv.galiciae.com/cache/rss/sec_motos_gl.rss'),
        (u'Industriais', u'http://lv.galiciae.com/cache/rss/sec_industriales_gl.rss')
    ]

    extra_css = u' p{text-align:left} '
    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\nencoding="' + \
        encoding + '"\ntags="' + category + \
        '"\noverride_css=" p {text-align:left; text-indent: 0cm} "'

    def print_version(self, url):
        url += '?imprimir&lang=gl'
        return url
PK�X�ǘ++lupa.png�PNG


IHDR(-SfPLTE�������ssꔔꗗ뚚�������~~恁燇苋鑑�		��44쟟��II����������������]]�����dd��\ZtRNS�CP:jsIDATx�]ϵAD��ݭ�"�G�a�>�� ^
�H�r,�p�
������+k�
[Iu�^P�;��g�7�!���
�/�W�u�s-��\Aj�p����/�l-�#�IEND�B`�PK�Xr1B��lupa.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Tomas Latal<latal.tomas at gmail.com>'

from calibre.web.feeds.news import BasicNewsRecipe


class LupaCZ(BasicNewsRecipe):
    title = 'Lupa'
    __author__ = 'Tomas Latal'
    __version__ = '1.0'
    __date__ = '30 April 2011'
    description = u'Zpr\xe1vi\u010dky a \u010dl\xe1nky z Lupa.cz'
    oldest_article = 2
    max_articles_per_feed = 10
    encoding = 'utf8'
    publisher = 'Internet Info s.r.o.'
    category = 'IT,news,CZ'
    language = 'cs'
    publication_type = 'newsportal'
    no_stylesheets = True
    remove_javascript = True
    extra_css               = 'p.perex{font-size: 1.2em;margin: 0 0 10px 0;line-height: 1.4;padding: 0 0 10px 0;font-weight: bold;} \
                               p.perex img {display:none;} \
                               .urs p {margin: 0 0 0.8em 0;}'

    feeds = [
        (u'Zpr\xe1vi\u010dky', u'http://rss.lupa.cz/zpravicky'),
        (u'\u010cl\xe1nky', u'http://rss.lupa.cz/clanky')
    ]

    remove_tags_before = dict(id='main')

    remove_tags_after = [dict(id='main')]

    remove_tags = [
        dict(attrs={'class': ['author clear', 'tags-rubrics', 'box border style1 links clear', 'enquiry clear', 'serial', 'box border style1 TitleList',
                              'breadcrumb clear', 'article-discussion box border style1 monitoringComponentArticle', 'link-more border prev-next clear']}),
        dict(id=['discussionList', 'similarItems',
                 'sidebar', 'footer', 'opl', 'promo-box'])
    ]
PK�XFZ����lvivs_ks_ghazieta.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1356270446(BasicNewsRecipe):
    title = u'\u041b\u044c\u0432\u0456\u0432\u0441\u044c\u043a\u0430 \u0433\u0430\u0437\u0435\u0442\u0430'
    __author__ = 'rpalyvoda'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'uk'
    cover_url = 'http://lvivska.com/sites/all/themes/biblos/images/logo.png'
    masthead_url = 'http://lvivska.com/sites/all/themes/biblos/images/logo.png'
    auto_cleanup = True
    feeds = [
    (u'\u041d\u043e\u0432\u0438\u043d\u0438', u'http://lvivska.com/rss/news.xml'),
    (u'\u041f\u043e\u043b\u0456\u0442\u0438\u043a\u0430', u'http://lvivska.com/rss/politic.xml'),
    (u'\u0415\u043a\u043e\u043d\u043e\u043c\u0456\u043a\u0430', u'http://lvivska.com/rss/economic.xml'),
    (u'\u041f\u0440\u0430\u0432\u043e', u'http://lvivska.com/rss/law.xml'),
    (u'\u0421\u0432\u0456\u0442', u'http://lvivska.com/rss/world.xml'),
    (u'\u0416\u0438\u0442\u0442\u044f', u'http://lvivska.com/rss/life.xml'),
    (u'\u041a\u0443\u043b\u044c\u0442\u0443\u0440\u0430', u'http://lvivska.com/rss/culture.xml'),

    (u'\u041b\u0430\u0441\u0443\u043d', u'http://lvivska.com/rss/cooking.xml'),
    (u'\u0421\u0442\u0438\u043b\u044c', u'http://lvivska.com/rss/style.xml'),
    (u'Galicia Incognita', u'http://lvivska.com/rss/galiciaincognita.xml'),
    (u'\u0421\u043f\u043e\u0440\u0442', u'http://lvivska.com/rss/sport.xml'),
    (u'\u0415\u043a\u043e\u043b\u043e\u0433\u0456\u044f', u'http://lvivska.com/rss/ecology.xml'),
    (u"\u0417\u0434\u043e\u0440\u043e\u0432'\u044f", u'http://lvivska.com/rss/health.xml'),
    (u'\u0410\u0432\u0442\u043e', u'http://lvivska.com/rss/auto.xml'),
    (u'\u0411\u043b\u043e\u0433\u0438', u'http://lvivska.com/rss/blog.xml')]
PK�Xj��R��lwn.png�PNG


IHDR(-SPLTE���������������4YtRNS@��fTIDATx�b�]��
1��}��7���BN�
B셏�6�,$�	��f"�%�#���9lE�YOc�����o"l��'�H=LJ7�k���X!IEND�B`�PK�X���)��
lwn.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
lwn.net
'''

from calibre.web.feeds.news import BasicNewsRecipe


class LWN(BasicNewsRecipe):
    title = u'lwn'
    __author__ = 'Oliver Niesner'
    description = 'Linux Weekly News'
    oldest_article = 54
    language = _('English')
    max_articles_per_feed = 100
    needs_subscription = True
    language = 'en'
    remove_javascript = True
    simultaneous_downloads = 1
    delay = 1
    LOGIN = 'https://lwn.net/login'

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open(self.LOGIN)
            br.select_form(name='loginform')
            br['Username'] = self.username
            br['Password'] = self.password
            br.submit()
        return br

    remove_tags = [
        dict(name='td', attrs={'class': 'LeftColumn'}),
        dict(name='td', attrs={'class': 'NavLink'}),
        dict(name='div', attrs={'class': 'FormattedComment'}),
        dict(name='td', attrs={'class': 'MCTopBanner'}),
        dict(name='div', attrs={'class': 'CommentBox'})
    ]

    feeds = [
        (u'lwn', u'http://lwn.net/headlines/newrss'),
    ]

    def postprocess_html(self, soup, first):
        for tag in soup.findAll(name=['table', 'tr', 'td']):
            tag.name = 'div'
        return soup

    def print_version(self, url):
        return url.replace('rss', '?format=printable')
PK�X��Q���lwn_free.png�PNG


IHDR  szz��IDATxڵWt$Y]۶cu�wk�m۶m����vF�Iu���;黯�I�3F��s���{
��Z_�J�q����DŽ:RB1"�{�y�6~!!t�]]�"�F����<r���p�!<[W�OJ	�Zו���ԥ;Zv�'�xo��6��B���w󖢀�u��{^D��sWB��#[e�˯�
��H�RB��0m�*<��Sx���Չ��2�҃;��^�13��̍�:Ϣ�_�1b�b�\�?=&����D��Hא��{�l��D�(8�C>���7�I��ꛠ�$��F���}P�«���#`lٔ@�N{��C�^DDĵ��d�G*`^w�#�F�&�j?��E����4ꍡ2r,.Y���rN���W�����;=��G"�?($/z���<&� }Y0��B��Ԝi����عk7fϙ��ΐ����Q�7�0m6r�
���;���ۣ���Hl��h������m�Ѯ}{�=Gq��qp^�,������&MHLI�HJJ���w�|�n�*,,�0rsp��UTTTBo0�l�bɒ���Z�l�;vb�����4L@����g|*!)���,*�����]!��AQQj#�y=A�iӧ#9%�EݹK��g�ldPI���\�O穆.�����t�Y�c�É#9<&+�]υ��۴}�p�ȑ�����E��$[�x�޽���X�b���߿Gr�
�6��5�HN{&�@�0hy(�>�{�}���Jv6��B����b��۷�ä�?�x�}��򷉸X$�L�"ع��b��0r����������.�)K6���"�����	ä��0��bQ��2a2[�sˎ��Oe
@9W��;ٞ	�cW�^��кM����ɯ��ʻ`��\�T��a9Em$��e�I�(��!�w1�B� �[����7�����ԩ,+R�3���ʠ��!
p�p
�jDQ鈔3ʢ�	��1�{��kA�6��93�L8�P�^��+�`��A������Q�ڋe���@eP=�+/22��+�A�Ό)0[,,N�P�Z�g�:���S��c�.U�/�xU�Pʎ�z�����׃3�2=˂'�*�虩)����F��^cS$"�I�l�D�w��[�$�6�x��d؜�J��xF*���"d��A�J͈��Mh@c2�:)ٷ��_Tj��x ����!n#>RY��Ey�5���?��}�c�h"g�fB�6xE6{ۥ�R�jx�'�#��#� 4���&+�M@5JdBʚ�L��X�+�@~A.\�H��c�X��Y��(3\�zEE%�1o1*8�����������s�"�М��㙝o�U�…����q_��ӿ �?1�;�)*I�]4����*�/��.�N�����7@�—Eyg?M@�E}�{��J&��X�;hĔ�WK�OHyy9J�ʐ�����D�!��	�Dsށ�'������6B�U��jޏ&KX݉��#Y��b����	���j�j���Gv?���b�-A�ܰ�{|�ܝ���I�N�j>�"�<g��k�#ť�@*|����ܼK�M#�i�PBG�߄?	����)�eS�T�(8��>	�焞�lKK��{F}�c��0k梐�E���iR��l"&J�e-��W�Rġ�񣾻�jg�fXLH�IEND�B`�PK�XYj�
��lwn_free.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class LWNFree(BasicNewsRecipe):
    title = "LWN Linux Weekly News (Free)"
    language = 'en'
    __author__ = 'yodha8'
    description = "LWN is published every Thursday. This recipe skips current week's articles (subscriber-only) and pulls free articles from previous week."
    oldest_article = 28  # So we can grab previous week articles.
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('LWN Articles', 'https://lwn.net/headlines/Features'),
    ]

    def parse_feeds(self):
        """Remove paid articles and articles older than a week."""

        prev_feeds = super().parse_feeds()

        remove_articles = []
        weekly_count = 0

        for article in prev_feeds[0]:

            # Paid article
            if "[$]" in article.title:
                remove_articles.append(article)
                continue

            # Count how many free weekly edition we passed
            if "Weekly Edition" in article.title:
                weekly_count += 1

            # Remove all articles starting from 2nd free weekly edition
            if weekly_count > 1:
                remove_articles.append(article)

        # Remove everything but prev week's free articles
        for pa in remove_articles:
            prev_feeds[0].remove_article(pa)

        return prev_feeds
PK�Xj��R��lwn_weekly.png�PNG


IHDR(-SPLTE���������������4YtRNS@��fTIDATx�b�]��
1��}��7���BN�
B셏�6�,$�	��f"�%�#���9lE�YOc�����o"l��'�H=LJ7�k���X!IEND�B`�PK�X�4CSTTlwn_weekly.recipe#!/usr/bin/env python

from __future__ import print_function
__license__   = 'GPL v3'
__copyright__ = '2011, Davide Cavalca <davide125 at tiscali.it>'
'''
lwn.net
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re
import sys


class WeeklyLWN(BasicNewsRecipe):
    title = 'LWN.net Weekly Edition'
    description = 'Weekly summary of what has happened in the free software world.'
    __author__ = 'Davide Cavalca'
    language = 'en'
    site_url = u'http://lwn.net'

    no_stylesheets = True
    remove_javascript = True
    extra_css = '''pre,code,samp,kbd,tt { font-size: 80% }
                   blockquote {margin-left:0 }
                   DIV.BigQuote,SPAN { font-style:oblique }
                   DIV.FeatureByline,DIV.GaByline { background-color:#EEE }
                   DIV.tlr { background-color:#EED; border-style:groove; }
                   * { color: black }'''

    cover_url = site_url + '/images/lcorner.png'
    # masthead_url = 'http://lwn.net/images/lcorner.png'
    publication_type = 'magazine'

    keep_only_tags = [dict(attrs={'class': ['PageHeadline', 'ArticleText']})]
    remove_tags = [dict(name=['h2', 'form'])]

    preprocess_regexps = [
        # Remove the <hr> and "Log in to post comments"
        (re.compile(r'<hr [^>]+>\s*\n\s*.*?comments[)]'), lambda m: ''),
    ]

    conversion_options = {
        'no_inline_navbars': True,
    }

    oldest_article = 7.0
    needs_subscription = 'optional'

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://lwn.net/login')
            br.select_form(name='loginform')
            br['Username'] = self.username
            br['Password'] = self.password
            br.submit()
        return br

    def print_version(self, url):

        # Strip off anchor
        url = url.split('#')[0]

        # Prepend site_url
        if url[0:len(self.site_url)] != self.site_url:
            url = self.site_url + url

        # Append printable URL parameter
        print_param = '?format=printable'
        if url[-len(print_param):] != print_param:
            url += print_param

        return url

    def parse_index(self):
        if self.username is not None and self.password is not None:
            index_url = self.print_version('/current/bigpage')
        else:
            index_url = self.print_version('/free/bigpage')
        soup = self.index_to_soup(index_url)
        curr = soup.body

        articles = {}
        ans = []

        section = self.tag_to_string(soup.title)
        subsection = None

        while True:
            curr = curr.findNext(
                attrs={'class': ['SummaryHL', 'Cat1HL', 'Cat2HL']})

            if curr is None:
                break

            text = self.tag_to_string(curr.contents[0])
            cclass = ''.join(curr['class'])

            if 'Cat2HL' in cclass:
                subsection = text

            elif 'Cat1HL' in cclass:
                section = text
                subsection = None

            elif 'SummaryHL' in cclass:
                article_title = text
                if not article_title:
                    article_title = _('Undefined article title')

                if subsection:
                    section_title = "%s: %s" % (section, subsection)
                else:
                    section_title = section

                # Most articles have anchors in their titles, *except* the
                # security vulnerabilities
                article_anchor = curr.find(
                    name='a', attrs={'href': re.compile('^/Articles/')})

                if article_anchor:
                    article_url = article_anchor.get('href')
                    if not article_url:
                        print('article_url is None for article_anchor "%s": "%s"'
                            % (str(article_anchor), article_title), file=sys.stderr)
                        continue

                else:
                    self.log.warn('article_anchor is None for "%s"; skipping' % article_title)
                    article_url = None
                    continue

                if section_title not in articles:
                    articles[section_title] = []
                if section_title not in ans:
                    ans.append(section_title)

                articles[section_title].append({
                    'url': article_url,
                    'title': article_title,
                    'description': '', 'content': '', 'date': '',
                })

            else:
                self.log.error("lwn_weekly.recipe: something bad happened; should not be able to reach this")

        ans = [(section2, articles[section2])
               for section2 in ans if section2 in articles]
        # from pprint import pprint
        # pprint(ans)

        return ans

# vim: expandtab:ts=4:sw=4
PK�X
��a!!!lyngby-taarbaeklokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X=�K%��$lyngby-taarbaeklokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Det grønne område
'''


class Lyngby_taarbaekLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Det grønne område'
    description = 'Lokale, regionale nyheder, sport og kultur i Lyngby-Taarbæk, Virum, Holte, Nærum, Vedbæk og Skodsborg på lyngby-taarbaek.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Det grønne område', 'http://lyngby-taarbaek.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Det grønne område', 'http://lyngby-taarbaek.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Det grønne område', 'http://lyngby-taarbaek.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Det grønne område', 'http://lyngby-taarbaek.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Det grønne område', 'http://lyngby-taarbaek.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Det grønne område', 'http://lyngby-taarbaek.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X ���
mac_world.png�PNG


IHDR  D���3PLTE/��/��/��/��/��/��/��1��1��1��1��1��1��1��1��2�̡�tjtRNS 0@P`p��������#���IDATx^��K�@PϷ���Z��ƌT�omYN�km
� +6���9}S1V�ZsF���d
��Fd@�(�tH]$�儴���AhLCoLa����*G�3R�|��>����NTl
��@�����=
i#��nIEND�B`�PK�X,e�F
F
mac_world.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.01'
__date__ = '14, January 2010'
__description__ = 'Macworld is an independent journal not affiliated with Apple Computer.'

'''
http://www.macworld.co.uk/
'''

from calibre.web.feeds.news import BasicNewsRecipe

temp_files = []
articles_are_obfuscated = True


class macWorld(BasicNewsRecipe):
    __author__ = 'Lorenzo Vigentini'
    description = 'Macworld is an independent journal not affiliated with Apple Computer.'
    cover_url = 'http://images.macworld.com/images/templates/v4/mw-logo.gif'

    title = 'Mac World '
    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 = 20
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        (u'MacWorld Headlines', u'http://rss.macworld.com/macworld/news'),
        (u'How-To', u'http://rss.macworld.com/macworld/howto'),
        (u'Security', u'http://rss.macworld.com/macworld/topics/security'),
        (u'MAC IT', u'http://rss.macworld.com/macworld/topics/mac_it'),
        (u'Business Mac', u'http://rss.macworld.com/macworld/topics/business_mac'),
        (u'Reviews', u'http://rss.macworld.com/macworld/reviews'),
        (u'Products: Mac', u'http://rss.macworld.com/macworld/products/mac'),
        (u'Products: iPod', u'http://rss.macworld.com/macworld/products/ipod'),
        (u'Products: iPhone', u'http://rss.macworld.com/macworld/products/iphone'),
        (u'Products: Software', u'http://rss.macworld.com/macworld/products/mac/software'),
        (u'OSX Hints', u'http://rss.macworld.com/macworld/weblogs/macosxhints'),
        (u'Mac Gems', u'http://rss.macworld.com/macworld/weblogs/macgems'),
        (u'Mac 911', u'http://rss.macworld.com/macworld/weblogs/mac911'),
        (u'Game Room', u'http://rss.macworld.com/macworld/topics/games'),
        (u'Editos notes', u'http://rss.macworld.com/macworld/weblogs/editors'),
        (u'Creative notes', u'http://rss.macworld.com/macworld/weblogs/creative'),
        (u'Playlist', u'http://rss.macworld.com/macworld/weblogs/ipodblog'),
        (u'Mobile', u'http://rss.macworld.com/macworld/weblogs/mobile'),
        (u'From the lab', u'http://rss.macworld.com/macworld/weblogs/macworldlab'),
        (u'MacUser', u'http://rss.macworld.com/macworld/weblogs/macuser')
    ]
PK�Xͺ;�11mac_world_uk.png�PNG


IHDR  ���IDATx^�VMlE������iԦ��)Q��6�_��JP�q녟����s���VB傸�R5=�4��I|�n�8u��v��3Nv�]�p�h���{�}����.��N.�1�a�[#B��(��M V�L"H��?�99�⾅Y�j�'�Ź*��`1`��z�`B!P��?p?�Z�s![l�?~b0�a��ާS%�V��Gz>~� ao��m�Bfm!�{o8���8�?�{�,J_G0U���~4�\�u��\�:r���Cɐ|d *DD��C���w��i�>��}8���T��O806�w0cmj�>Ɍ+O� �乁�����]Ũ�yyo��'���)�tȀ��Tz�~m�A�K�`�X߾���$S�q�O:cG3�ھy(�`b7��:�!��c�Sw{����U�`��h�ǁ��G�’4(�(4���c�ݭ`��#�g��R01T0Czp��{㯪nya�������w�3z�<St
|�壣Y��&^�]����'��H��n&hv��m��
�6�I�
Z-������W�%��;u����铇��D!.gK���4�	�Y ���ҭ��n}��/^ݗ��71_�zg�[\j�?)Y(o|9Y��<P;f
$�搋
�
M�B���M��賎Ϯ]˭�6�\7gט�r�	E�� r�7��[��U7��_s�Uox�of�AVQ S�Q���埗�ں�W���%ӗ;����
�vDQ��oo&�u�Ľ
�P��[[S$C�L.�ᥲ��O�Jm�-}],�*�]��]D���
񛹕k���I�sE�C�B*����@�C�P���?�ٓ ����n�Y��)�@!8��]� �m����d�P|���t'BH!$��"�*�C���X^ߐn0�q��\�#���A�X�%��f�����y�r�6W��=>�Pv,���-T���d��K��0�j��6ɑ�َ:B��'���󋸣�,á��y�IEND�B`�PK�Xb$�mac_world_uk.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.01'
__date__ = '14, January 2010'
__description__ = 'Macworld is a publication of IDG Communication in the UK specifically on the Apple Mac.'

'''
http://www.macworld.co.uk/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class pcMag(BasicNewsRecipe):
    __author__ = 'Lorenzo Vigentini'
    description = 'Macworld is a publication of IDG Communication in the UK specifically on the Apple Mac.'
    cover_url = 'http://media.macworld.co.uk/images/masthead.jpg'

    title = 'Mac World UK '
    publisher = 'IDG Communication'
    category = 'Apple, Mac, computing, product reviews, UK'

    language = 'en_GB'
    timefmt = '[%a, %d %b, %Y]'

    max_articles_per_feed = 25
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        (u'MacWorld Headlines', u'http://www.macworld.co.uk/latest/rss'),
        (u'Reviews', u'http://www.macworld.co.uk/news/rss'),
        (u'Masterclass', u'http://www.macworld.co.uk/how-to/rss'),
        (u'MacWorld Team', u'http://www.macworld.co.uk/review/rss'),
        (u'Andy Ihnatko', u'http://www.macworld.co.uk/latest/iphone/rss'),
        (u'Andy Penfold', u'http://www.macworld.co.uk/latest/ipad/rss'),
        (u'Jonny Evans', u'http://www.macworld.co.uk/latest/mac/rss'),
        (u'Karen Haslam', u'http://www.macworld.co.uk/latest/apple/rss')
    ]
PK�X����
macity.png�PNG


IHDR  ��tRNSn���IDATxڭ�lK�W��J'�dE�eY���)���'7P|��9N��233�I��}q�.3>
3��to���4���ff|�Ah�<�\5yB!�+����e�TY-����#�٘�@��فp�-r'@���D"|ĺ�{�S+x�
���\9N��?� �+���,w�9	��n�܁����ǣ�m�K�2@?x �5����;Z��5.�\/n� ��%e�Z��m�f�~$W�W*M�7��'��;T��
���}�ඔ�����¿���iI�ˀH�w_��1�	�rM�ʸ�KM^Qm��9E5��[�WPb5���E3z�u�W��o��eӊ��Ղu���jr�M+�?=]H�_�v��څ����s#�۶4�/�:v7w�����*�#sGÅ����������Bf �_V��w����G�.�_��Ե��{wS�e�:�rb���q�V��n,s3�Ҙ��UR�~
!�/���+{%�H���8ؒ�W�6+f�m�)�b�����Dj%�X�~<s3ƹrp�2'��|O\b���b3��D�"�x�
>�ʷ�������2j�b�M��y��܌U��/�Z�N[�x/�W!�"�^`���b�pj�qVx��(�yLi�0��k����.ZB|�iZ�e GYC~`V�f'�i&2ӗ(2P.u*��2�o�?�i�rM��D�@�9�����m\iӨ��1em�*:��$�_�$�2e�*$�����5��5SR�~�HI��<��0���1C�oY�C��u`o���O��qe�c*�}f��:�U��cP�Mp�fr���E�@���4�d�*���3�&4��#+�[�n&jX��wV�^���
�b��e�CJ��@�4MH�f�)�7;��j���,w�ٵPa���?��g6�0mܿg&��X���3���喈	��2�(��Һ7/AD')ٳ��
3X�qZ�mǍ�K͵���N=��:�X( w�\�[��6�P�������{%$0G�=��A���w�K��]j�%q���Z,c�[Z�#c#��U�y_��{�R	) ʑ�#��
��[�2��ihiw����Wi��E�u��*T~�~�-!�R2���G�4��53�wU�5!��xN}�؄�w
�U�[G�̓�Y�S��Q�|��Z�?��C��v0��ʾI��P�a�"�S�*���S��D��]��7Aן@�B��g qzhA�i�u��s|�
VUz��A�E&��|�€���*�/�=@Fe1��J�_q��2��p�AO�$+�y�Xdp
��G�"<�D&���������\�QQ0�bF�	G�� E6���a����?���
bW��\�(�لIEND�B`�PK�X��|suu
macity.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1325766771(BasicNewsRecipe):
    title = u'Macity'
    language = 'it'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    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'Macity', u'http://www.macitynet.it.feedsportal.com/c/33714/f/599513/index.rss')]
    __author__ = 'faber1971'
    description = 'Apple and hi-tech news'
PK�X������macleans.png�PNG


IHDR�a�IDATx�b��aR's0�?$� �
�8��}���e��3+6� @,�U�BUQ2�0�M@�M��Na�,kvݽس���jn~ka�����s8���{��w�$I�L&�f��Dz̓#�w3?o_���!wdih6��Z-r����>�Û���u��7�MY�,��~i�H$ت�n���P�k��^�9%��L��#^_;�D"��4
��J&�@??G{�7xz,og�����M�XD����=���)W�R�F��V+��>��Z�&�z�3_����}�N�����i��f���TM�n�b��J��lF�Z���R���F����n�����z=��1��B��d2��ac]l�������$�I��2�pY.���x�T*E6�@Q�^/�~��a�B�j8��X,(�Jx<���N�q
�W����GZIEND�B`�PK�X��yWWmacleans.recipe#!/usr/bin/env python
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1308306308(BasicNewsRecipe):
    title = u'Macleans Magazine'
    language = 'en_CA'
    __author__ = 'Medius'
    oldest_article = 7
    cover_url = 'http://www.rogersmagazines.com/rms_covers/md/CLE_md.jpg'

    use_embedded_content = False

    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True
    remove_tags = [dict(id='header'), {'class': 'comment'}]
    remove_tags_after = {'class': 'pagination'}

    feeds = [
    (u'Canada', u'http://www2.macleans.ca/category/canada/feed/'),

    (u'World', u'http://www2.macleans.ca/category/news-politics/world/feed/'),
    (u'Business', u'http://www2.macleans.ca/category/business/feed/'),
    (u'Arts & Culture', u'http://www2.macleans.ca/category/arts/feed/'),
    (u'Opinion', u'http://www2.macleans.ca/category/opinion/feed/'),
    (u'Health', u'http://www2.macleans.ca/category/life/health/feed/'),
    (u'Sports', u'http://www2.macleans.ca/category/life/sports/feed/'),
    (u'Environment', u'http://www2.macleans.ca/category/life/environment/feed/'),
    (u'Technology', u'http://www2.macleans.ca/category/life/technology/feed/'),
    (u'Travel', u'http://www2.macleans.ca/category/life/travel/feed/'),
    (u'Blog Central', u'http://www2.macleans.ca/category/blog-central/feed/')]
PK�X>4���macrobusiness.png�PNG


IHDR  ��`IDATxb�Oc0�,���/��ZЍEA~k۶m۶m۶�ڶm۶����A�87~�j�X�&BH���������{ `���o�T���i%%�7n�އp|GݺC'�*SR�1!�ۦ_���P����; Дh�o�I�������CF�-m��h�~�O���6tzС#�kݣ��Б��<iZ�8�n��:c��L�^��#
�n;`0B��l�^��D0 ��ɸW�1���244EĽ|����e�@���(�ACٳټ�QU%8;%?�u�l8�ΜS���i��9�5
9q�kڽw���`@���y��A��7�
@̷�������7dgR(�;w#�n�`RD$��@'��V���8fL�%�6�����b�&�&��֤��3k�����?�����9��
"[���4v4�
�Dn��*3�y�8x,^J+-���m���-�ޡ) ]EռU[3�u�%������e�3,�~vFe�φM09�]��(!�}Hv��~�prLl}@���U���J$�%p�9���2����9��5d��ڣ��
�����s�w���ZT�sNNq5J�uR0�߾c��v�rLL���_��Z�6o�6MI��rt���a08�b@+#y.]��2arUF�(8E0��:X��ĭ"���*�e�n�.��Eعp���uBf4X�Uk`E���P�p�e�H�S0k�ƌh�7.�/���3�N9�,�*=�i<�4qz�l<�4�ٰј
��P���|��ȱ�w��o��njw3!�����v����1~���A�GLJ^:?�(y���j~�^(��?x�k��Kn����Y(IEND�B`�PK�X9�Vb��macrobusiness.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe(BasicNewsRecipe):
    title          = 'Macrobusiness'
    language       = 'en_AU'
    __author__     = '2018robert'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup   = True
    needs_subscription = 'optional'

    feeds          = [
        ('Macrobusiness', 'https://www.macrobusiness.com.au/feed'),
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://www.macrobusiness.com.au/my-account/')
            br.select_form(class_=lambda x: 'login' in x)
            br['username']   = self.username
            br['password'] = self.password
            br.submit()
        return br
PK�Xe�CVVmaekyung.png�PNG


IHDR�aIDATx�͌��XQEOTam��ҨQm��Զ���c۞y�k�t��N���>K�(��$���J�Ϊ�����w��)h+hǀ{��K���E�*hρ���l��h��s�Ο��1@������/�Q>��?���BY��w�|���8�W?^CI��/*�s�)Oׂ�N�c��(�srLй/6�ވ���@wb|����si:q�9=��X�{�>�c��F�k�O�Yt/��GU�Q��+�:9������7U��c���a���~�����F�#\�IEND�B`�PK�X0T��maekyung.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2015, Hoje Lee <hojelei at gmail.com>'
'''
Profile to download Maeil Business
'''

from calibre.web.feeds.news import BasicNewsRecipe


class MaeilBusiness(BasicNewsRecipe):
    language = 'ko'
    title = u'매일경제'
    description = u'매일경제 신문 기사'
    __author__ = 'Hoje Lee'
    oldest_article = 7
    max_articles_per_feed = 10
    auto_cleanup = True

    feeds = [
        (u'헤드라인',  'http://file.mk.co.kr/news/rss/rss_30000001.xml'),
        # (u'전체뉴스',  'http://file.mk.co.kr/news/rss/rss_40300001.xml'),
        (u'경제',      'http://file.mk.co.kr/news/rss/rss_30100041.xml'),
        (u'정치',      'http://file.mk.co.kr/news/rss/rss_30200030.xml'),
        (u'사회',      'http://file.mk.co.kr/news/rss/rss_50400012.xml'),
        (u'국제',      'http://file.mk.co.kr/news/rss/rss_30300018.xml'),
        (u'기업ㆍ경영', 'http://file.mk.co.kr/news/rss/rss_50100032.xml'),
        (u'증권',      'http://file.mk.co.kr/news/rss/rss_50200011.xml'),
        (u'부동산',    'http://file.mk.co.kr/news/rss/rss_50300009.xml'),
        (u'문화ㆍ연예', 'http://file.mk.co.kr/news/rss/rss_30000023.xml'),
        (u'패션',      'http://file.mk.co.kr/news/rss/rss_72000001.xml'),
        (u'스포츠',    'http://file.mk.co.kr/news/rss/rss_71000001.xml'),
        (u'게임',      'http://file.mk.co.kr/news/rss/rss_50700001.xml'),
        (u'오피니언',  'http://file.mk.co.kr/news/rss/rss_30500041.xml'),
    ]
PK�X9�ʇ))magyar_nemzet.png�PNG


IHDR  ��tRNSn��	pHYs���IDATHǵ�kH�W��)B�B�(�T&N������:[��d���Ysi���}�11�j�d�:f�l��D����D�%�5�Qc4j�֨���n��!�1}w��˛�>��w�s9'������&0N�ϟa�����}��e��M!㑀!F�qKKKV��n����u�ݤkvv�PZ����ih�����q8�񹶺�e��D����@|>��BA���/��J��h�?-�zg����INH�&91鏀��E�̌̉�	b'�������B8lN<��A����]hʿ/��qtz��.����N%�l&0hFGG[[[Ix����f;s:���dIdž����������*UduH���O��P�ժ�|���d"ю��e	���č�ơ��T�s$��TUd�������d�/<�Ȩ�h|���R��N�����USS����?���p��B>��[���4�lV��Q����-:���А��n8`}}]Q����b� ��z=%���ǝ���r��Lu����h#v�l~������p=�WMO��J��48���l,ʤ����2�_����BG��I�%UX�!��ͿQ����W���ѹ�Swwɢ0�b{[���4�ł�R���n�ٺ)�J��[U��Ŝ��Ɵ)�!)IB�\�X�¦�����
,r9�\�0��`�h���B������f�tQ����͡���T(���\^$�9��L�r�m�8��v�w��r��XlL��}�u�=Б��;qR����tRhz=|����\>y�Җ��4:�F�
0�
8��S�y0j�ۣ��g���S
Fט��O>�Q��҃1P�G�sЋʠ
A㻛�0muuuffF��Gs����^���w���~�B"<��L��
�h��������,4pO���`�s+++ql9�(�h�pO/޾EEh I		L&���;d$�� ���]x�ˣXr�"bg��j���ƾ��0�D���77���www�4ڼ�\`ЋO`~�wO�Ѣ�7Ŋ
EuU5&���(Z��x���'=��T(����100��-/^,����a�0�#��=>�����|b���r8����C[[[!k�H�˗.}!�ʤ��x$b)y�D��k������eЈEQ�8�)�{�T&KP��D��c�c}�dy9�ĖXY�K���H��������|�IEND�B`�PK�X�R����magyar_nemzet.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1556388146(AutomaticNewsRecipe):
    title = 'Magyar Nemzet'
    __author__ = 'pofa'
    language = 'hu'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('Magyar Nemzet', 'https://magyarnemzet.hu/feed/?'),
    ]
PK�Xiq�R��maharashtra_times.png�PNG


IHDR  D����PLTE[����^�\�\����L�]�N�K�T����U�K����[�V�	\�V����Y�Q����������,n����~��R�Z����	]���{����d�Ğ�ڸ��M�X�f����2q����Q�R�?�s�ɢ��C�Z����^�������J��`����}��f��Q�_���Z�������������X�^�Y�^�a�P�}��*m�T�F�������L�P�:�p��e�G~�~�����]�}��N���y�ʯ��,m���U����������������^�������]�_�{��	Z�Z�������]�r�Ȝ��<v�V�^�M�L�z��c�Ā��h��M�G~���֔��:v���(IDATx^��C�lA����u��ضm۶m������ճﳩ�Y�҈
�-Y$357j�}8�U�]�ʽ^WAՌ��#u�ډi��0G��z]׷�������H��K#{<Zi@{�V����=��[�冥&��V�slt@�׋��,EF�޾��1tdt�'$irjZcvn����ʪ  εu��)
���m�ٵZ��	A��C��cJO�S�����ˈ#z���I����]�v� %ʣA�œ1���cϦ��-/�o������APJ�PU;E �^>��)�����IEND�B`�PK�X��մ�maharashtra_times.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HindustanTimes(BasicNewsRecipe):
    title = u'Maharashtra Times'
    language = 'mr'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('News',
         'http://maharashtratimes.indiatimes.com/rssfeeds/2429656.cms'),
    ]
PK�X·C��mail_and_guardian.png�PNG


IHDR�a�IDATx�]SC�&;���3�9>_���m�e�c�}m۶m��Nw���W��Jէ� >B~�JJ�$��7y՗ef���utt��B����X��;uv���^����^s���� 4B���Ȓ0��}•[��ܽr��&r�߹UU�=���-��it47��BCAd�HN�$�� _�[7�.�)�f͆��jM��AA5����xe�=x�&��@��@�~�Dd!�ܧ��,*��3468}Ze ʨˀ&&���iz�6}RYM�
��J��W[�Ѣ�۷��s�,��R�M���<��D���l�P���o�k��޽��,,_���p��Qe:׮)�0��;���6`@]4�_�>y8(!߰�Iu���͗4�f����\�|��U��Fk����D���{CX�(��Ke����΢Yو��_}U�c�ŋz��$��>"ui`+w%�kdFSR�6�X_�squ	Ǐ+ιt���M�o��	��}���ED($��@�v�޼�����0��F��0ǎ�ٯ�C3��Ȉ���P����1�޿����up�݃'.�{�.��W��Q��>t.D�����+�KN�.P�J����Q�F'2*J�]!я�'��Q�t��P�IEND�B`�PK�X@�d��mail_and_guardian.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1295081935(BasicNewsRecipe):
    title = u'Mail & Guardian ZA News'
    __author__ = '77ja65'
    language = 'en_ZA'
    oldest_article = 7
    max_articles_per_feed = 30
    no_stylesheets = True
    masthead_url = 'http://c1608832.cdn.cloudfiles.rackspacecloud.com/mg_logo.gif'
    remove_tags_after = [dict(id='content')]

    feeds = [
        (u'National News', u'http://www.mg.co.za/rss/national'),
        (u'Top Stories', u'http://www.mg.co.za/rss'),
        (u'Africa News', u'http://www.mg.co.za/rss/africa'),
        (u'Sport', u'http://www.mg.co.za/rss/sport'),
        (u'Business', u'http://www.mg.co.za/rss/business'),
        (u'And In Other News', u'http://www.mg.co.za/rss/and-in-other-news'),
        (u'World News', u'http://www.mg.co.za/rss/world')
    ]

    def print_version(self, url):
        return url.replace('http://www.mg.co.za/article/',
                           'http://www.mg.co.za/printformat/single/')

    extra_css = '''
                     h1{font-family:Arial,Helvetica,sans-serif; font-
 weight:bold;font-size:large;}
                     h2{font-family:Arial,Helvetica,sans-serif; font-
 weight:normal;font-size:small;}
                 '''
PK�XM�D��mainichi.png�PNG


IHDR��h6�IDATxm�h�a��|�ﯻ���6��Ym%A�����)U�`TT��$+�4Je��
�k�����	v��nw��u��QC��ؼ#�~z�)���qH���܌[�H�d����Q���S�$����E<e��0�����x��s�cs�VA"��!�&B[������
3��ȴ�@������(�)Xy\{�����ڹ::s�^u��Ӥo��5d�L@
�H�+��M�;dպ��?]�{��"l +;�
�M�\iN�~�Й���e�]+b�S͖��
ck'��k�{W�P�Dܶ�͗��)f��߹u��ܞ煺}�;��!�����0B��"�ue�a�D�Pہ�%S̜��WTO����m��J6_�}�q`��>|��F��@Vj�	%�ޛ}������y�t�{sW����Ƴ ����%SPן巷~i���Ku�q4�`�SM��c��`[j"�v'Ə�3��C��'M/�GE-��˜�@8q㧡a���Yr�(:�2%8F�m�����5�N5����Sò�|��,�Km&������(����S�,�teГzd�I4�|6�H2�����'E B��D�׃_��,	��L9IEND�B`�PK�X���(ddmainichi.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>'
'''
www.mainichi.jp
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class MainichiDailyNews(BasicNewsRecipe):
    title = u'\u6bce\u65e5\u65b0\u805e'
    __author__ = 'Hiroshi Miura'
    oldest_article = 2
    max_articles_per_feed = 20
    description = 'Japanese traditional newspaper Mainichi Daily News'
    publisher = 'Mainichi Daily News'
    category = 'news, japan'
    language = 'ja'
    index = 'http://mainichi.jp/select/'
    remove_javascript = True
    masthead_title = u'MAINICHI DAILY NEWS'

    remove_tags_before = {'class': "NewsTitle"}
    remove_tags_after = {'class': "NewsBody clr"}

    def parse_feeds(self):

        feeds = BasicNewsRecipe.parse_feeds(self)

        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if re.search(r'pheedo.jp', curarticle.url):
                    delList.append(curarticle)
                if re.search(r'rssad.jp', curarticle.url):
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []

        return feeds

    def parse_index(self):
        feeds = []
        soup = self.index_to_soup(self.index)
        topstories = soup.find('ul', attrs={'class': 'MaiLink'})
        if topstories:
            newsarticles = []
            for itt in topstories.findAll('li'):
                itema = itt.find('a', href=True)
                if itema:
                    newsarticles.append({
                        'title': itema.string, 'date': '', 'url': itema['href'], 'description': ''
                    })
            feeds.append(('latest', newsarticles))
        return feeds
PK�XGs<WWmainichi_en.png�PNG


IHDR  ��tRNSn��IDATx�u�P#[�ǧ����������n늅u��wᮻ�+�dBH&J lp�4�0��d�`�����{A�d�;�
�8�0&G���(Q���΋1FM2�m�0s`;{��q ���pFtqq���;g�/���AE�ґ�*��~-
Ɖ�U�d#�}GS=^FĚ��k�n�/m6ע��L¨|�}���/���#��c�îKi�ok<ˆ,谩gt��N�FdZ4K�a~vV��%���;�u��u���Œ�S�&smi��_ݾ1����ao�nn��<�X���W�^�/�9��9�m��_�� 
�&��љ�Z��s�>I�L%-~9��ZOq}o-v��=S�+K ��ƨ�bv��j驊��K_�v���J��+\_�r���0fG�/�=ء�*�=�[���]��еq���mQ��DaM أ\/
����B�D0��xj�Xx���T��d��yO&Z�����x�Vs�yx�O�����ݖ`�a��3��9R�]�?�ߘ|��Z֢��;m�u��֛t&$'�,2�Z,���,�r�$��Z�Z�Jsֵ!���=O3p��D�G�ĝ$��~Y��n�����{���ˏ̱\'�7�0r�7*��mHQP�
���7�}�u r������*�h�R'�#���u��z��+m��h��M�6���Z���=3̯.�aJG��9y�N���}�c����`O�_^g�>c��<�?#��ֿ�zKeE��/�gcaI��>�h��{�dJ9�0�/k=���0������~�S���bg��2�*�h)��V�&#���Q�>~��_��)�i�Tg��FY�����*�,��Z�-�)���*7݀)u�]�/¯��>��6P�"�ڒ[C���Z���J!Z$�4Zdl�1";�p)J�꫄�O���l���Nc��F��z.E����`>���M˪�u�'ԣ��W}�d]m�n�
ݦo�j��<�{�
@!�ף�a�sY	�ի�W@����[�p(�hj���͓�?2���Cߞ8�j�����!!Z@��p��P����[t"A�k�_pf���j
:���4&�t�^���U�맙?Lw1�h�kL�l�i�Z�i�IG"E	�+��R�Ο1�5�.6M�����$�0V<#l5HG)""�X�����2���A`�I���զ#��l>s�Q�0(E��D
����qĬ~w�㾄ܟ�x�2+�։	��?Ns>85��
�2*.������yt�:	`��=M~y�1�H)֖� ���������	��8v���(��R%��&(�GJ��NJ,�w�:�PZ����7i�o��r�݊��Q��	`?>R�t�;K��(�ؼ����ڳ��E��_q�0F$n�/��M���Dm�A|s�6�˓�Q��D$!�3:�d�[���ڙ?�r�9���ӝ�
J}k���W���>�?�}%5:~t��O�]�8#��ʰcZ|��a�5#����p-Pf=�,A�雦�?�~��'S��V����y��6T4uN�W�%��/��H36�~����9^M�Fl�B��o�f�堪���'�${En~��'x?ݵ�R�*ciH��k쎢�7�!��P0�P	D�z���~�YCQ��x���!i�n7�"��Jw���R��E��M(�͵��<xBPʃ(Ӛ���[%Nj��$-���L��߯� Pt,&3��uӍ���{f�
��1ֵt��gS$wU[��K���x��u�&�q�
6q�W��ƌEYs��
�?#F�oV5�1{|HR�Sw�������:�Ab�pq�b�W�鵅vF���m�&Z��BÃs��E.h����_�\'2�7�5
�`zv0�2tA�رۋFm���VD	�<T�q>�h!���D���z�'�t\�ij�m����[�l"^?�h^��3xڤ;#��7)韌'0��m�����#���4�;Dfu�p���Y7p�G&>t�k��"�É���w�+b%9];IEND�B`�PK�XYn����mainichi_en.recipe"""
www.mainichi.jp/english
"""

from calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe

class MainichiEnglishNews(BasicNewsRecipe):
    title = u"The Mainichi"
    __author__ = 'unkn0wn'

    description = "Japanese traditional newspaper Mainichi news in English"
    publisher = "Mainichi News"
    publication_type = "newspaper"
    category = "news, japan"
    language = "en_JP"

    index = "http://mainichi.jp/english/"
    masthead_url = index + "images/themainichi.png"

    no_stylesheets = True
    remove_javascript = True
    auto_cleanup = True

    ignore_duplicate_articles = {'title'}

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = [
        ('Articles', 'https://news.google.com/rss/search?q=when:48h+allinurl:mainichi.jp%2Fenglish%2Farticles%2F&hl=en-US&gl=US&ceid=US:en')
    ]
PK�XM�D��mainichi_science_news.png�PNG


IHDR��h6�IDATxm�h�a��|�ﯻ���6��Ym%A�����)U�`TT��$+�4Je��
�k�����	v��nw��u��QC��ؼ#�~z�)���qH���܌[�H�d����Q���S�$����E<e��0�����x��s�cs�VA"��!�&B[������
3��ȴ�@������(�)Xy\{�����ڹ::s�^u��Ӥo��5d�L@
�H�+��M�;dպ��?]�{��"l +;�
�M�\iN�~�Й���e�]+b�S͖��
ck'��k�{W�P�Dܶ�͗��)f��߹u��ܞ煺}�;��!�����0B��"�ue�a�D�Pہ�%S̜��WTO����m��J6_�}�q`��>|��F��@Vj�	%�ޛ}������y�t�{sW����Ƴ ����%SPן巷~i���Ku�q4�`�SM��c��`[j"�v'Ə�3��C��'M/�GE-��˜�@8q㧡a���Yr�(:�2%8F�m�����5�N5����Sò�|��,�Km&������(����S�,�teГzd�I4�|6�H2�����'E B��D�׃_��,	��L9IEND�B`�PK�Xw���mainichi_science_news.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>'
'''
www.mainichi.jp
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class MainichiDailyScienceNews(BasicNewsRecipe):
    title = u'\u6bce\u65e5\u65b0\u805e(Science)'
    __author__ = 'Hiroshi Miura'
    oldest_article = 2
    max_articles_per_feed = 20
    description = 'Japanese traditional newspaper Mainichi Daily News - science'
    publisher = 'Mainichi Daily News'
    category = 'news, japan'
    language = 'ja'
    index = 'http://mainichi.jp/select/science'
    remove_javascript = True
    masthead_title = u'MAINICHI DAILY NEWS'

    remove_tags_before = {'class': "NewsTitle"}
    remove_tags_after = {'class': "NewsBody clr"}

    def parse_feeds(self):

        feeds = BasicNewsRecipe.parse_feeds(self)

        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if re.search(r'rssad.jp', curarticle.url):
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []

        return feeds

    def parse_index(self):
        feeds = []
        soup = self.index_to_soup(self.index)
        topstories = soup.find('ul', attrs={'class': 'MaiLink'})
        if topstories:
            newsarticles = []
            for itt in topstories.findAll('li'):
                itema = itt.find('a', href=True)
                if itema:
                    newsarticles.append({
                        'title': itema.string, 'date': '', 'url': itema['href'], 'description': ''
                    })
            feeds.append(('Science', newsarticles))
        return feeds
PK�X!%����malaya_business_insight.png�PNG


IHDR  ���IDATx^���o\GƟsf����o�vh^�6I��JE@�Q��—HE���� �/(��~C|@B
-R�P�BQQ������"u�ƾ1~�׹3s�����ӨE�O{��9���sΌ�!�~[�W�e��R�
��cE���!�&|��,@��9�!��'�G+�f
��:�C`VP�t���r�h�Tl�]&M���}�����}"8��+;J���",�v��nw�W;og^{�i/�h��)$�?���>$�h\D�K�gZ�B�:�^>�h4;��с~yW.]��˿^x㕿���5��~��X�w���+��ԱN���"�/^�۩���c���{���K����[S"
tbfgo?��o�~�*@HC%Eõ�/�7J��fwb�bP�ȓO<][�]W$^ ��o�N?��"�D`&���j#�wGƊ:� �!�-h4��93��o��V,����W�Nف��^'�����d��$m�A�ڽ�s�\[�X0F,7H$5���ʭlA1��o=��p���hC���ձ��4�L꿼��Y;��o�ߘ�rD}b
y�{�#'4�+C�@_������
 "!D� `M�ч��&�\m�/��D�@A��3G�U[y�uTR5^|o�$*:ؠ��gA0�ȥ����g�U�D�D��_8��w�&��w����P���LJ^���i��R" ���J�z��v42p��j~�v�a��V �%�4��t�v+K�Z�D������;�q9_��<��E����U�A>��L\��'"�q��~w_�X�u+[l�my�D� M�\�g��R@,�_��{?ؙ��g�<8���$�Z&��7'��#�c�J�xn||�G
J�� �T��+++Z�DTR�r������<w�?	�X�aƨ�u�<u���$����A��@6�Y�Js�Q�C@(����w:L����]x������'CDH(� k͗��@��b�lƨWnbjfNi�J�M\}{�f���>`�b6�aVF�Z{6�` �㶕T�9�(��z+=�A&��.^�����!b�P���}�L��`=�SbF[/ �PG)�:�Xh.O��Y��Z=���[��2~e�}û��N��>�|N��܍�z���}=�XgG'~���e7�v�?��V�Ü�o�5^�
(#���a想���}�m��=|x�;27wmzj��q���$�\�Wgʏ�ӯi�t>�]�p�5ZPN�P��C�+K�6Lu�r
�Qt�m�nxt-t��h����I�8L8=��!xA[�f=�EQ)�����~�2�6����8�J�g��4�I�6��3Z_��ܻ|��3�!�B��j|�/��`�$"�IEND�B`�PK�X<9�GGmalaya_business_insight.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe
import time


class MalayaBusinessInsight(BasicNewsRecipe):
    title = u'Malaya Business Insight'
    custom_title = "Malaya Business Insight - " + \
        time.strftime('%d %b %Y %I:%M %p')
    __author__ = 'jde'
    __date__ = '07 June 2012'
    __version__ = '1.2'
    description = "The Malaya Business Insight is a broadsheet newspaper in the Philippines.  The newspaper's name was derived from the Filipino word that means 'freedom'."  # noqa
    language = 'en_PH'
    publisher = 'Malaya Business Insight'
    category = 'news, Philippines'
    tags = 'news, Philippines'
    cover_url = 'http://www.malaya.com.ph/templates/ja_teline_iv/images/logo.png'
    masthead_url = 'http://www.malaya.com.ph/templates/ja_teline_iv/images/logo.png'
    oldest_article = 1.5  # days
    max_articles_per_feed = 25
    simultaneous_downloads = 20
    publication_type = 'newspaper'
    timefmt = ' [%a, %d %b %Y %I:%M %p]'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = False

    keep_only_tags = [
        dict(name='div', attrs={'id': 'ja-main'})
    ]

    remove_tags = [
        dict(name='a', attrs={'class': 'ja-back-btn'}), dict(name='li', attrs={'class': 'print-icon'}), dict(name='li', attrs={'class': 'email-icon'}), dict(name='p', attrs={'class': 'dnn'}), dict(name='span', attrs={'class': 'breadcrumbs pathway'}), dict(name='dt', attrs={'class': 'article-info-term'}), dict(name='div', attrs={'class': 'ja-articles-mainwrap'}), dict(name='h1', attrs={'class': 'componentheading'}), dict(name='div', attrs={'id': 'ja-content-mass-top'})  # noqa
    ]

    conversion_options = {'title': custom_title,
                          'comments': description,
                          'tags': tags,
                          'language': language,
                          'publisher': publisher,
                          'authors': publisher,
                          'smarten_punctuation': True
                          }

    feeds = [

    (u'Business', u'http://www.malaya.com.ph/index.php/business?format=feed&amp;type=rss'),
    (u'Market', u'http://www.malaya.com.ph/index.php/business/market?format=feed&amp;type=rss'),
    (u'Shipping and Transportation', u'http://www.malaya.com.ph/index.php/business/shipping-and-transportation?format=feed&amp;type=rss'),
    (u'Business Incidental', u'http://www.malaya.com.ph/index.php/business/business-incidental?format=feed&amp;type=rss'),
    (u'Banking and Finance', u'http://www.malaya.com.ph/index.php/special-features/banking-and-finance?format=feed&amp;type=rss'),
    (u'Motoring', u'http://www.malaya.com.ph/index.php/special-features/motoring?format=feed&amp;type=rss'),
    (u'Info Tech - Telecoms', u'http://www.malaya.com.ph/index.php/special-features/infotech-telecoms?format=feed&amp;type=rss'),
    (u'Property', u'http://www.malaya.com.ph/index.php/special-features/property?format=feed&amp;type=rss'),
    (u'Environment', u'http://www.malaya.com.ph/index.php/special-features/environment?format=feed&amp;type=rss'),
    (u'Agriculture', u'http://www.malaya.com.ph/index.php/special-features/agriculture?format=feed&amp;type=rss'),
    (u'News - National', u'http://www.malaya.com.ph/index.php/news/nation?format=feed&amp;type=rss'),
    (u'News - International', u'http://www.malaya.com.ph/index.php/news/international?format=feed&amp;type=rss'),
    (u'Sports', u'http://www.malaya.com.ph/index.php/sports?format=feed&amp;type=rss'),
    (u'Entertainment', u'http://www.malaya.com.ph/index.php/entertainment?format=feed&amp;type=rss'),
    (u'Living', u'http://www.malaya.com.ph/index.php/living?format=feed&amp;type=rss'),
    (u'Opinion', u'http://www.malaya.com.ph/index.php/opinion?format=feed&amp;type=rss')
    ]
PK�X�5�~22malaysian_mirror.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Tony Stegall'
__copyright__ = '2010, Tony Stegall or Tonythebookworm on mobiread.com'
__version__ = '1'
__date__ = '16, October 2010'
__docformat__ = 'English'


from calibre.web.feeds.news import BasicNewsRecipe


class MalaysianMirror(BasicNewsRecipe):
    title = 'MalaysianMirror'
    __author__ = 'Tonythebookworm'
    description = 'The Pulse of the Nation'
    language = 'en'
    no_stylesheets = True
    publisher = 'Tonythebookworm'
    category = 'news'
    use_embedded_content = False
    no_stylesheets = True
    oldest_article = 24

    remove_javascript = True
    remove_empty_feeds = True
    conversion_options = {'linearize_tables': True}
    extra_css = '''
                    #content_heading{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}

                    td{text-align:right; font-size:small;margin-top:0px;margin-bottom: 0px;}

                    #content_body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [dict(name='table', attrs={'class': ['contentpaneopen']})
                      ]
    remove_tags = [dict(name='table', attrs={'class': ['buttonheading']})]
    ##########################################################################

    max_articles_per_feed = 10

    '''
    Make a variable that will hold the url for the main site because our links do not include the index
    '''

    INDEX = 'http://www.malaysianmirror.com'

    def parse_index(self):
        feeds = []
        for title, url in [
            (u"Media Buzz", u"http://www.malaysianmirror.com/media-buzz-front"),
            (u"Life Style", u"http://www.malaysianmirror.com/lifestylefront"),
            (u"Features", u"http://www.malaysianmirror.com/featurefront"),


        ]:
            articles = self.make_links(url)
            if articles:
                feeds.append((title, articles))
        return feeds

    def make_links(self, url):
        title = 'Temp'
        current_articles = []
        soup = self.index_to_soup(url)
        for item in soup.findAll('div', attrs={'class': 'contentheading'}):
            # print 'item is: ', item
            link = item.find('a')
            # print 'the link is: ', link
            if link:
                url = self.INDEX + link['href']
                title = self.tag_to_string(link)
                # print 'the title is: ', title
                # print 'the url is: ', url
                # print 'the title is: ', title
                current_articles.append(
                    {'title': title, 'url': url, 'description': '', 'date': ''})  # append all this
        return current_articles

    def preprocess_html(self, soup):
        for item in soup.findAll(attrs={'style': True}):
            del item['style']
        return soup
PK�X�bm�rrmallorca_zeitung.png�PNG


IHDR  ��tRNSn��'IDAT��Y��e�����sf��Z���(
�6a�m
�e�5���nL��Ҁ!�#�J�B�H% h(P)ԁ�*dha�҂�Y;�پ�}���r!f��
�B���gŊ�����


��/-Z�}��-[�,X���9���ܽ{���>z��A�����nرcG>�����b��lٲT*�s�No��՛7o���SSS�Z�����|>�iӦÇ{+W�,�Ac�Ĝk��jKKKww�Wg�!�c��"�N���$$EH��G*��g5i�A9"�8%��#"p�Q��Cu@�/$@R `�@�U�AE&�HX	"��d³��2�UiS	:'��S��(��"�a-HO�	�>��/�˜QN���+.蜜.Yk�2�L�񶻞>5U�X�ySύ+�~�{��&Ti��B	O2Y-���'���_�+7h{b��7oY9�9}�{1^{򥁍v
�J��i:�y���{wE��窭��w�o_��M�ߙ���fI�l2�&�G�]a:�v}r�j�*�x��9�/]�uΒ�Ao���
�t�R50ƈHL}��C���-��e�����o�d�m�A��I&;}�=.zH7�}o��qt�Q\
�-��)y���:��$�p�ٔw����v�['k2
��k���+c�:<����ڞ�*���j5w�f��qXK�`F���5��/*��B�4��^�?������S�8��8�G�H�0�D���$൴��qk5�!vJ0�;��x���Ŏ̋o�{t$�M�S��~��K�D�j`-�"���R}�7|�YM߹�}�lNL�1T%ix�*�NN�.�����S����$�>ٕM|��yh���!HU��"�::^��G�N���H޴�6=E$T��B�j��ԺU]a�{�O�'g*����?X��h����D@%�4j˼y�_�ڽ}�j��A��33�sl0!��cY�tq����92Vu���_�9�R���E��T%5�X�����~�s��ט/oF��Z�#U�@���Dը{a��E*|���;'fN��lWK�T�����TUR����QS
s�}����
�AUIT��Q�Z'�W�]z敁��=��W,cŎh��C��į�=���_s�.��G`�sN��X�����:Tj���s:�?�r��g�����T�P��)}��?�_�����wo��f�9hi2I?��T:jk;����.n�m��L`�
�Ō��D�J�.ָV��V��}��K��o�._���EC
��G'�MJ�RHY2�Nf�^F�\�B6�:˹X��~2饁�'M��xHs���흷U��hg{�,.���b��m	Q�x譁�'������3�-.�/>��P*UC��}�)���68��c�C���K*���a�ji֜�䉡�w�����v/�zJ�V����
n�byo�q�ܲq�l%�ͭ�*�fk>7x��%��>U��S�Nϳ7~=J$��I�s?���?�\�n�2�sY�Bfg=k��M����Xc<k�J5�([+���LUBm���w��@h��K"c���	N#@P��xd\��@���� k
ɉR`�;|8:u��@|�z�Vx��#"hpN@�h�F�X�'#c�
�C�6�>��/��8
�ȑ#��Ӟ�9�)����0���l�\^�pawww"�p����L&3�L��]��dC6�mnnN$$1gA�?���}}}��o��F�V\�h��s6<<�w��}�����O8���aߓIEND�B`�PK�X�]�ccmallorca_zeitung.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class MallorcaZeitung(BasicNewsRecipe):
    title = 'Mallorca Zeitung'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    __author__ = 'vo_he'
    description = 'Immer informiert dank Mallorca Zeitung und RSS '
    publisher = 'https://www.mallorcazeitung.es/servicios/rss/rss.jsp'
    publication_type = 'all'
    language = 'de'
    cover_url = 'http://getlogo.net/wp-content/uploads/2020/06/mallorca-zeitung-logo-vector.png'

    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True

    scale_news_images = (600, 800)

    masthead_url = 'http://getlogo.net/wp-content/uploads/2020/06/mallorca-zeitung-logo-vector.png'
    #
    # delete or mark with a # sign what you don't be interested in
    #
    feeds = [
        ('Aktuelles', 'https://www.mallorcazeitung.es/elementosInt/rss/3'),
        ('Arbeitswelt', 'https://www.mallorcazeitung.es/elementosInt/rss/37'),
        ('Auswanderer', 'https://www.mallorcazeitung.es/elementosInt/rss/75'),
        ('Behörden', 'https://www.mallorcazeitung.es/elementosInt/rss/36'),
        ('Food', 'https://www.mallorcazeitung.es/elementosInt/rss/76'),
        ('Gesellschaft', 'https://www.mallorcazeitung.es/elementosInt/rss/5'),
        ('Gesundheit', 'https://www.mallorcazeitung.es/elementosInt/rss/23'),
        ('Immobilien', 'https://www.mallorcazeitung.es/elementosInt/rss/42'),
        ('Kultur', 'https://www.mallorcazeitung.es/elementosInt/rss/5'),
        ('Leben', 'https://www.mallorcazeitung.es/elementosInt/rss/8'),
        ('Lokales', 'https://www.mallorcazeitung.es/elementosInt/rss/4'),
        ('Mallorca Boulevard',
         'https://www.mallorcazeitung.es/elementosInt/rss/72'),
        ('Meinung', 'https://www.mallorcazeitung.es/elementosInt/rss/9'),
        ('Native AD', 'https://www.mallorcazeitung.es/elementosInt/rss/43'),
        ('Promis', 'https://www.mallorcazeitung.es/elementosInt/rss/74'),
        ('Recht und Steuern',
         'https://www.mallorcazeitung.es/elementosInt/rss/38'),
        ('Report', 'https://www.mallorcazeitung.es/elementosInt/rss/30'),
        ('Sport', 'https://www.mallorcazeitung.es/elementosInt/rss/7'),
        ('Style', 'https://www.mallorcazeitung.es/elementosInt/rss/77'),
        ('Szene', 'https://www.mallorcazeitung.es/elementosInt/rss/73'),
        ('Tiere', 'https://www.mallorcazeitung.es/elementosInt/rss/26'),
        ('Travel', 'https://www.mallorcazeitung.es/elementosInt/rss/78'),
        ('Unternehmen', 'https://www.mallorcazeitung.es/elementosInt/rss/41'),
        ('Unterwegs', 'https://www.mallorcazeitung.es/elementosInt/rss/35'),
        ('Meistgelesen',
         'https://www.mallorcazeitung.es/elementosInt/rss/LoMas'),
        ('Schlagzeilen',
         'https://www.mallorcazeitung.es/elementosInt/rss/AlMinuto'),
    ]
PK�X�g��RR
mandidner.png�PNG


IHDR  ��tRNSn��	pHYs���+�IDATH�c`�``"6(�# 18����
�Y�ڎ �D�.-'c!3
~]~+ h'�$�*�,&&R����%�,�"T�N8pt�x�ӕ׷�j��ԡ?�T#�G�5Mim��v��]�@YG#��h��<U���m��;����$4���-��Y٠3�Rh%P�)dǒ:-���Q
���4V4��-�Ւa#�6p���j�]V�4�L�ŵq
@�.ZЦd'��a�Z���Ywy����Dh�j��U!Z���9�,��d�V�`e����0�Z@�Dr�~T̴���`.[Z��ܛ�AU�ºV]`z�@[���Bu`��`n�Q�$l0�ˉq�D�m��:c�>�u��<2bl��5�9h��n}`��b3�f�
�@�[��e�����|�/�{1`n
��u�F	0K�H��P0{�l X0�^����Fs��R~�bU9�N�T��&E��IEND�B`�PK�X�Ht ��mandidner.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1541708734(AutomaticNewsRecipe):
    title = 'Mandiner'
    language = 'hu'
    __author__ = 'pofa'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
        ('Mandiner', 'http://mandiner.hu/rss/'),
    ]
PK�Xˌ��W	W	manila_standard_today.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe
import time


class ManilaStandardToday(BasicNewsRecipe):
    title = u'Manila Standard Today'
    custom_title = "Manila Standard Today - " + \
        time.strftime('%d %b %Y %I:%M %p')
    __author__ = 'jde'
    __date__ = '06 June 2012'
    __version__ = '1.0'
    description = 'The Manila Standard Today is the fourth-largest broadsheet newspaper in the Philippines as of 2006. Initially established as the Manila Standard, it merged with another newspaper of record, Today, on March 6, 2005. It was the first newspaper merger in the Philippines.'  # noqa
    language = 'en_PH'
    publisher = 'Manila Standard Today'
    category = 'news, Philippines'
    tags = 'news, Philippines'
    cover_url = 'http://www.manilastandardtoday.com/wp-content/uploads/Manila-Standard-Today-June-06-12.jpg'
    masthead_url = 'http://www.manilastandardtoday.com/wp-content/uploads/Manila-Standard-Today-June-06-12.jpg'
    oldest_article = 1.5  # days
    max_articles_per_feed = 25
    simultaneous_downloads = 20
    publication_type = 'newspaper'
    timefmt = ' [%a, %d %b %Y %I:%M %p]'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = False

    keep_only_tags = [
        dict(name='div', attrs={'id': 'main'})
    ]

    conversion_options = {'title': custom_title,
                          'comments': description,
                          'tags': tags,
                          'language': language,
                          'publisher': publisher,
                          'authors': publisher,
                          'smarten_punctuation': True
                          }

    feeds = [

    (u'Headlines', u'http://news.manilastandardtoday.com/feed/'),
    (u'Nation', u'http://news.manilastandardtoday.com/archives/nation/feed/'),
    (u'Business', u'http://business.manilastandardtoday.com/feed/'),
    (u'Metro', u'http://news.manilastandardtoday.com/archives/metro/feed/'),
    (u'Sports', u'http://sports.manilastandardtoday.com/feed/'),
    (u'Entertainment', u'http://entertainment.manilastandardtoday.com/feed/'),
    (u'Opinion', u'http://opinion.manilastandardtoday.com/feed/'),
    (u'Lifestyle', u'http://lifestyle.manilastandardtoday.com/feed/')
    ]
PK�X;�x���	marca.png�PNG


IHDR��h6�IDATxڵ�1
�0D��[yAO�=l�v�9�P�� �a�l��l�/b�`����ٺҔ}�qTI�.K6�������@
�4IQ�T�m�,+D:��Y�<纪��UŮ3�4���i�"���]@�A?`
m�Me��IEND�B`�PK�X�L�ǝ�marca.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2009-2011, Darko Miletic <darko.miletic at gmail.com>'
'''
www.marca.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Marca(BasicNewsRecipe):
    title = 'Marca'
    __author__ = 'Darko Miletic'
    description = 'Noticias deportivas'
    publisher = 'marca.com'
    category = 'news, sports, Spain'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    delay = 1
    encoding = 'iso-8859-15'
    language = 'es'
    publication_type = 'newsportal'
    masthead_url = 'http://estaticos.marca.com/deporte/img/v3.0/img_marca-com.png'
    extra_css             = """
                                body{font-family: Tahoma,Geneva,sans-serif}
                                h1,h2,h3,h4,h5,h6{font-family: 'LatoBlack',Tahoma,Geneva,sans-serif}
                                .cab_articulo h4 {font-family: Georgia,"Times New Roman",Times,serif}
                                .antetitulo{text-transform: uppercase}
                            """

    feeds = [(u'Portada', u'http://estaticos.marca.com/rss/portada.xml')]

    keep_only_tags = [
        dict(name='div', attrs={'class': ['cab_articulo', 'cuerpo_articulo']})]
    remove_attributes = ['lang']
    remove_tags = [
        dict(name=['object', 'link', 'script', 'embed', 'iframe',
                   'meta', 'base']), dict(name='div', attrs={'class': 'tabs'})
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def get_article_url(self, article):
        return article.get('guid',  None)
PK�X�:;̧�
marctv.png�PNG


IHDR  D����PLTE��U��?�f�f��m�j�u��x�q�s�n�
z�	�	z�{�w�w�x��y�y�y�z�}�z�x�z�	x�	}�	z�x�{�{�}�|�|�y�|�|�{�y�{�{�	{�{�z�z�{�{�|�{�z�{�|�{�|�{�|�	|�|�{�{�|�|�|�|�|�|�{�|�|�|�{�{�|�{�|�	|�|�|�|�|�|�|�|�|�}�}�|�{�{�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�|�}�}�	��	��
�	��
��
��
��	��
��
����~�
��
�}�
��
��
��
��
��N��|tRNS
 $&,,.034567789DHIJPRVXYZ__ikllmrstuxyz{������������������������������������������������������������$IDATx�m���@�O�l���m۶m,�&w&\�����q�z�w�*A*0� dh!+��|���-À�Q��wF%�˭)�\Hh�^���<߿�FB��G��K�v� ��v`��%���Y�v��z:��ͽI�s�@��aP	]Έ�lp
�Qp�]Pwr�$.d�@��n`�j#kG��e�L���8��r�O����Xe�o���r�^���FY�n!�	��YΤ��Y�U	`_%Éf���o��W�Qj�%�	,�;1i��HqK�Z�d
3P�t&S�F�b?�1�>��Qt�0Yĉ��>�Y�z�ۆ�"t�<��	'|kb���8>����A�c8�}>U.x\������h��w>U�>8|	��q��نPT��J�ak��$z�T��)��v��"��i���U/G,O◠�H��Q�]��L��o�-���x��g�4��
>�٢�l\�U�����;ځ�ם��/������1 ���ıgn�ۃ킟����h0�fT|�{����YR�q�յ+��IEND�B`�PK�X-,��aa
marctv.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch MarcTV.
'''

from calibre.web.feeds.news import BasicNewsRecipe


class MarcTVde(BasicNewsRecipe):

    title = 'Marc Toensings Visionen'

    description = 'Marc Toensings Visionen'

    language = 'de'

    __author__ = 'Marc Toensing'

    max_articles_per_feed = 40

    oldest_article = 665

    use_embedded_content = False

    remove_tags = []

    keep_only_tags = dict(name='div', attrs={'class': ["content"]})

    feeds = [
    (u'Spiele', u'http://feeds.feedburner.com/marctv/spiele'),
    (u'Leben', u'http://feeds.feedburner.com/marctv/leben'),
    (u'Medien', u'http://feeds.feedburner.com/marctv/medien')]

    extra_css = '.#wrapper .entry p img{width:620px; height: 270px;}'

    def get_cover_url(self):
        return 'http://marctv.de/marctv.png'
PK�XK��F��marine_corps_times.png�PNG


IHDR  D����PLTE�B<����J@�D<CCC�A;999����J@FFF333533}?:�C<�E=�I?���LLL���?54843BBBJ75;;;R86yyy�D=���k<8�?:A54�J@888���}}}�E=�G>t=9�H?�I?�����𤤤���<44y>9O75������F>l<8YZZHHHX96r=9���@@@���H?���555�I?]^^���???�?:�J@v=9f;7�A;���N75�B<�E=�������@:433p<8�E=���777���DDD�@:BCC���AAAMMMK75���B54����C<MNNeee<<<�D<TTT�I?U86F65{>9h;8IJJ�I@�����ΊA;����A;��Ĉ����ɉ@;b:7����H?ccc����I@���C64vuuM75OPP���:::�A;���EEE���������=54___?:�E=633��榦��D=`:7���jjj666��МC<���@54ooo���H?����I@�?:�C<�D=���_:7�F>�G>�g_IDATx����dП�m۶��k{l۶m�'���S/$���xv)sW��<ˈ��djYB@f�ן3ZN#zπ��y!��� ��P^�Co�6):CX>�6)��ٟ;ؤ_�S��/�-��'��ay>*m���g��$��LQ�lhB��X��Dg����*#p����c�,ERۚ���)h��
::�|��'#��3�;�
�2��Z�V�Ҏ,�XZ7��5qz�$|�����(��S���P���_.s4ŷr��,PP��
���s��<�7����i�
~P-��z��a�V�4���x7�v@��J������/�!!�b$d�^��@2,����<_`�]��IEND�B`�PK�X�˶��marine_corps_times.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class MarineCorpsTimes(BasicNewsRecipe):
    title = 'Marine Corps Times'
    __author__ = 'jde'
    __date__ = '16 May 2012'
    __version__ = '1.0'
    description = 'News of the U.S. Marine Corps'
    language = 'en'
    publisher = 'MarineCorpsTimes.com'
    category = 'news, U.S. Marine Corps'
    tags = 'news, U.S. Marine Corps'
    cover_url = 'http://www.marinecorpstimes.com/images/logo_marinetimes-alert.jpg'
    masthead_url = 'http://www.marinecorpstimes.com/images/logo_marinetimes-alert.jpg'
    oldest_article = 7  # days
    max_articles_per_feed = 25
    publication_type = 'newspaper'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = True

    feeds = [

        ('News',   'http://www.MarineCorpstimes.com/rss_news.php'),
        ('Benefits',   'http://www.MarineCorpstimes.com/rss_benefits.php'),
        ('Money',   'http://www.MarineCorpstimes.com/rss_money.php'),
        ('Careers & Education',  'http://www.MarineCorpstimes.com/rss_careers.php'),
        ('Community',  'http://www.MarineCorpstimes.com/rss_community.php'),
        ('Off Duty',   'http://www.MarineCorpstimes.com/rss_off_duty.php'),
        ('Entertainment',  'http://www.MarineCorpstimes.com/rss_entertainment.php'),
        ('Guard & Reserve',  'http://www.MarineCorpstimes.com/rss_guard.php'),
    ]
PK�X�Meo�	�	marketing_magazine.png�PNG


IHDR  ��	wIDAT�K�\�]�y���L�<5�H’�IlcRT !|H;>
{d�M�bvP�M*UP`H��,ٲa4cI3���t��{Ϲ�������o�V���L�#b[6�t~7O��q~v�֍!����ތ8}r�$ɓ��7���|a<X������Y8��1Zk!9=9�p|�HDqIIH��:Y^�6yכ�$$gl��G�������ٓ$M�R�A�Z��,�l�0���h(�S*����>�i��nʘ7-�$�i>�;�+:^m��G�Aoo2��|����'��]cM]o]�l�j� �"�f�ANLSwG��(k	��,6�D��~�����ﻦ�|o8�`2����,y�pOJ�4�w�S��z��"�(G�4
�	ݛL�������~���'�e���//_�}���C������.&;=���/��qg0�6��nn����qָ�d����N|�ʼ�џ|�2�I�Ѡ?�ݼ?�v:	����G�^��1���hzs�Bx��AG{c@������Z;��0�pNM�8��^�SHF�no�C�'����\F1'�,zv���IDz׻�3Li���{G�ﮮ�s�D�h�#�/�~��`���|����h#�,��׃��0��C��##���$�V�*�eY+��d�?�bo)!�{��s�J�������'���L���x�E,F1r0�@�>xI$xk�㫲�uZ���d0x��E9e�jZjj}���O?�����|H0Q0�oqy�<pJ�u�RU�j�\��e��1�qD�[A�N�3�hcD[UO����$��XM@�[��o0"�Hl�-�#���ۯ^�z���Z���s8�����l:��y^V��@��R(�#)�ʠj���ֺ�n((I�)���^}��jU�Nƽ�@Ji����.a��w�a���F�EU�>~BU���iQP���w�޼�x_߭�ռ��G��d�!�U%)?9<8>�ߜ_��Θ�/�|�X��>� ˒~��`0�.W8ؔQ[�����C��/^��Tӛj>]6���uOG�"nMA�s��[���}��?L���/*����O����Q��n���'�@cڶ�PO& �fy�4W�w�EM)=z�(e$��h�#Y�\����^�����A�ww����r�к.���7��p�v��|U�}p��'�G�I$׫��?����_u�����_�U�-�\��h�ǐȁY�*y^$Is���r�Z�V�x�)�����P��~�?�z�O��}|vv���[�˛�s>i��@�9e����L"�P �� !�6c(t�6��T�9�����<mT�����g��}����mWm��$�i<FT �)�p�:k���e��XF��R���e[��'=���15^�j�	��"��c��r��"�,"��0�X`�2�y�A�9�
��I�!��I.��/��%�x�Z��10
��0*�{;�D,���N"��-��V�E\X%�C�F8C7JL���.����wt2��'��^������8G��A���w��q`���	W�n�릭s��.��ZD�
���o�F	����G�u� @ށi�(�`��~}�@�@k(K�C�B�9˒8bԨm��B��;cL�jDX�B��Ng+����z�P�˜���vf���p�a����["����j�
��K����*�`(���])4 "���O��f;�? ��\�j����r�P��Zow�y5_�͆"�1NQ.4Κ4���*���V����5 $8]�w���h��_�ꟲDFԵ����y��q�������(�(Xt;��x�Z��ѓS.�4M�
���C`�u-YO!�l�Ż���Uh�v��M��ں:�eE��(�T�W(�m��lz�Z�庢����D����8�����b�Dp��w=�!`�5���?�T E�z;�ݠ�߼~�/���J[Ӧ2��G2��d<�iD!�q�U-���7�׷�1	
�*=�
��_�}3��L
�פH{�^�3U�֒�p�9���#��XUu��y7��X�	��V��ּx�
q���L`c�XV��{u}|22-��zC���~��{=�ޮ�(����"��F&QDm�����-����כ��Q��]y�4OD��'?����m��E����AC�B$B̵�8�Q�"�'Rj�Hk�Bߜ_���?ϋ.e�q.x��$�8"ɠ��A�o�__T��Zk�8Dx�d{#�P�E�7I���R)�7��ʘJ�?<Qn�q��B1��F�1z|t@b��?�ٖ�j�u�����	�
	��x�c������gl]�t�u�8�o���[����?��2�/�IEND�B`�PK�XZg����marketing_magazine.recipe__license__ = 'GPL v3'
__author__ = 'faber1971'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1327062445(BasicNewsRecipe):
    title = u'Marketing Magazine'
    description = 'Collection of Italian marketing websites'
    language = 'it'
    __author__ = 'faber1971'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    remove_javascript = True
    no_stylesheets = True
    conversion_options = {'linearize_tables': True}
    remove_tags = [
        dict(name='ul', attrs={'id': 'ads0'})
    ]
    masthead_url = 'http://www.linkedin-marketing.it/blog/wp-content/uploads/2012/03/pb.jpg'
    feeds = [
    (u'MarketingArena', u'http://feeds.feedburner.com/marketingarena'),
    (u'My Marketing', u'http://feed43.com/0537744466058428.xml'),
    (u'My Marketing_', u'http://feed43.com/8126723074604845.xml'),
    (u'Marketing Journal', u'http://feeds.feedburner.com/marketingjournal/jPwA'),
    (u'Venturini', u'http://robertoventurini.blogspot.com/feeds/posts/default?alt=rss'),
    (u'Brandforum news', u'http://www.brandforum.it/rss/news'),

    (u'Brandforum papers', u'http://www.brandforum.it/rss/papers'),
    (u'SintBlog', u'http://sint-blog.blogspot.com/feeds/posts/default'),
    (u'Ninja Marketing', u'http://feeds.feedburner.com/NinjaMarketing'),
    (u'Bloguerrilla', u'http://feeds.feedburner.com/Bloguerrilla'),
    (u'Nonconvenzionale', u'http://feeds.feedburner.com/nonconvenzionale'),
    (u'Disambiguando', u'http://giovannacosenza.wordpress.com/feed/')]
PK�X�<�S��marketing_sensoriale.png�PNG


IHDR�aYIDATx�u�â�G�)��2��
�d���m۶m۶m�=u��~����\�Z�&� ���X$��"�I%2�S�������,���j�����!��R�˫o��<3�#D�+$D�SZ8FE��c[��*<
m����)��Q�>��-�͉@��P;�Rչw)N"!����ftD�Ձ��mS����4;�����|'���j�A�}`آ�j�ɑ
�Z�����Ի�U3<��\���W !-�K�jP-{!�~�N�@]�4����8"�Y�]
Sc���g�^�g��D��Y���IC���t�	PV��hu4���
+u�B8ENv���G��ؐ�jޜ��^�����v|�X_�r��XB}].�Ey�I����ihYg/�K���ؓN�#�cy�^�����ҊR)cwg!�!��u
�ZY-���#f��?�Ԏ]�q� 022bzz��h�4bw.�#d��.�/���\ڪZ�{ٿ����9x��)��֜G�q��hU���.
LLL.�@��A����Y\���Ç�)�a�’eH�<���Z+=�JA{��f�����-{�������x��=�Y���GIEND�B`�PK�XG:�,MMmarketing_sensoriale.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.utils.ipc.simple_worker import fork_job
from calibre.ptempfile import PersistentTemporaryFile

js_fetcher = '''

import calibre.web.jsbrowser.browser as jsbrowser

def grab(url):
    browser = jsbrowser.Browser()
    #10 second timeout
    browser.visit(url, 10)
    browser.run_for_a_time(10)
    html = browser.html
    browser.close()
    return html

    '''


class MarketingSensoriale(BasicNewsRecipe):

    title = u'Marketing sensoriale'
    __author__ = 'NotTaken'
    description = 'Marketing Sensoriale, il Blog'
    category = 'Blog'
    oldest_article = 7
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'it'
    remove_empty_feeds = True
    recursions = 0
    requires_version = (0, 8, 58)
    auto_cleanup = False
    simultaneous_downloads = 1
    articles_are_obfuscated = True

    remove_tags_after = [dict(name='div', attrs={'class': ['article-footer']})]

    def get_article_url(self, article):
        return article.get('feedburner_origlink',  None)

    def get_obfuscated_article(self, url):
        result = fork_job(js_fetcher, 'grab', (url,),
                          module_is_source_code=True)

        html = result['result']
        if isinstance(html, type(u'')):
            html = html.encode('utf-8')
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = [(u'Marketing sensoriale',
              u'http://feeds.feedburner.com/MarketingSensoriale?format=xml')]
PK�X-�==martinfowler.recipefrom calibre.web.feeds.news import BasicNewsRecipe

class MartinFowler(BasicNewsRecipe):
    title = 'Martin Fowler Blog'
    description = 'Software development is a young profession, and we are still learning the techniques and building the tools to do it effectively.'
    language = 'en'
    oldest_article = 14

    keep_only_tags = [
        dict(name='main')
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'bio'}),
        dict(name='div', attrs={'class': 'article-card'}),
        dict(name='hr', attrs={'class': 'bodySep'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': lambda x: x and 'paperBody' in x.split()})
    ]

    use_embedded_content = False
    no_stylesheets = True

    feeds = [
        (u'Martin Fowler Blog', u'https://martinfowler.com/feed.atom')
    ]
PK�X�����maskinbladet_dk.png�PNG


IHDR(-S�PLTEp�r�u�x�|�}� |�!�#��$��%��&��(��)~�)��*��+��-|�.~�/��0��1��1��3�3��3��3��5��5��6��L��M��N��N��N��P��P��Q��S��\��d��e��g��h��i��i��k��k����̄�ǣ�ڧ�۴��������������������������������������������������������������������������Gi
f�IDAT��J�P���ۚ��`�-N������ɀ�S�� H���]�)``S}6"W���]�?�w��$�oc��o����]�j�1�r^&�W��L�t���e����8e%3-��dF(V�ul��b���RPJp�������i��|j,�*4e
����D���DZIEND�B`�PK�X�2.maskinbladet_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Maskinbladet.dk
'''


class Maskinbladet_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'Maskinbladet'
    description           = ('Landbrugets største, uafhængige nyhedskilde med adgang '
                             'til nye og brugte landbrugs- og entreprenørmaskiner')
    category              = 'news, localnews, farming, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://www.maskinbladet.dk/
    feeds = [
        ('Maskinbladet', 'http://www.maskinbladet.dk/rss'),
    ]
PK�XL!��VVmateusz_czytania.png�PNG


IHDR(-SuPLTE��������������������T�����������|��l���L��D������<��D��\��<��4��,��$��$��������L����t��?܀�IDATx^U�E��0�Q�'�Ahd���NV�-���}0?��
�o��h��d�[�?� ��״�^�Jkp�|"t�}��m��_�SU�H�s,�C�1���r��z��+�o��*�9���
I�#�8uq�d�Prm�G�����wM��IEND�B`�PK�X���U��mateusz_czytania.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com>'

'''
http://www.mateusz.pl/czytania
'''

from calibre.web.feeds.news import BasicNewsRecipe


class czytania_mateusz(BasicNewsRecipe):
    title = u'Czytania na ka\u017cdy dzie\u0144'
    __author__ = 'teepel <teepel44@gmail.com>'
    description = u'Codzienne czytania z jednego z najstarszych polskich serwisów katolickich.'
    language = 'pl'
    INDEX = 'http://www.mateusz.pl/czytania'
    oldest_article = 1
    remove_empty_feeds = True
    no_stylesheets = True
    auto_cleanup = True
    remove_javascript = True
    simultaneous_downloads = 2
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Czytania', u'http://mateusz.pl/rss/czytania/')]

    remove_tags = []
    remove_tags.append(dict(name='p', attrs={'class': 'top'}))

    # thanks t3d
    def get_article_url(self, article):
        link = article.get('link')
        if 'kmt.pl' not in link:
            return link
PK�X'7��xxmatichon.png�PNG


IHDR  D���%PLTE�����������������������������稨�mmm���������������������������RS�RS��������SSS___������������������������WW�LL������67������www444���������^^^���lll999���```&&&������


���xxxzzz���uuuCCC�������68���YZ������fff��ݣ�������Հ��UUU���PPPbbb)))����KK����46���TTT���|||���~~~���������XXXaaa�;<����?@���DDD\\\���000}}}���...{{{����ML����44���hhh���'''���NNN������ggg###���������//�������rsOOO������---%%%�������������������������pq�^^��Ϙ�������𫫫��׈����������փ��̯��gg�cd����������\]�FH�FG�FG�YY���~q��IDAT8�cd G������/V,���##�7��L\����
�@�`�`����;��5#�&#>��QԈq�'����?��_�1>T`<�ȸ�A�qc��?v���	U�����\��Kw^�32f1�z��xO���G��6j�P����&��&3�Ie�����w�@�RQ�J7'F�r.@�N����ۼ/H�=�k�ad\��0�������~�=�X��o�R�1f)X0�C��gb���ԢX�a��h�����Lߕ'�iIEND�B`�PK�X����ZZmatichon.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1290412756(BasicNewsRecipe):
    __author__ = 'Anat R.'
    title = u'Matichon'
    oldest_article = 7
    language = 'th'
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    feeds = [(u'News', u'http://www.matichon.co.th/rss/news_article.xml'),
             (u'Columns', u'http://www.matichon.co.th/rss/news_columns.xml'),
             (u'Politics', u'http://www.matichon.co.th/rss/news_politic.xml'),
             (u'Business', u'http://www.matichon.co.th/rss/news_business.xml'),
             (u'World', u'http://www.matichon.co.th/rss/news_world.xml'),
             (u'Sports', u'http://www.matichon.co.th/rss/news_sport.xml'),
             (u'Entertainment', u'http://www.matichon.co.th/rss/news_entertainment.xml')]
    keep_only_tags = []
    keep_only_tags.append(dict(name='h3', attrs={'class': 'read-h'}))
    keep_only_tags.append(dict(name='p', attrs={'class': 'read-time'}))
    keep_only_tags.append(dict(name='div', attrs={'class': 'news-content'}))
PK�X@��7��max_planck.png�PNG


IHDR�aHIDATx�US�\Q���O�s�R۶mkm_�m�4�u�d���1���Z
_l1܎���{��֪��g؍
@}8�'�ěl��i�px��KE|wl<K%��⣕C���hH�\�ɺ��k�n,������p�n��osTW ��-�r���xG���j�F�z
��q%@�R��`:�;�87�ʤYY�c��;��ͯe�σ'������HK^�Z���R�\Y�?����}��%0R��V4,�`�|�΍��~
a���OB�p�Y��J��I���Wc6��[*ʌ~d�
m�E:���0[-%���H���u<S)�l�6�E\��v	!���ъ'<$�#�z]e�j�6�(��d�e�R�䆪�\��E}0؎�CPމ>9G���
q^P�&�=�-�X�p6���IL��j��߫Qb&��)����FV���5��v5!.~�%#E��W�r�&ۦ��J��S5ie�D�)��u��+U���j_YW����a��:Ư�#'A��V�;�]%��&�0X�mR���ʦ���%m{7�TȠ��'(IEND�B`�PK�X|�����max_planck.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1303841067(BasicNewsRecipe):

    title = u'Max-Planck-Gesellschaft'
    description = 'Forschungs-News-Feed der Max-Planck-Gesellschaft'
    __author__ = 'schuster, a.peter'
    __license__ = 'GPL v3'
    version = 2

    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'de'
    remove_javascript = True
    timefmt = ' [%d.%m.%Y]'

    remove_tags = [dict(attrs={'class': ['box_url', 'print_kontakt']}),
                   dict(id=['skiplinks']),
                   dict(name='div', attrs={
                        'id': ['print_options', 'print_head']}),
                   dict(name='div', attrs={'class': ['col2_box_meta']}),
                   dict(name='a', attrs={'class': ['toggle_description']}),
                   dict(name='span', attrs={'class': ['lens']})]

    def print_version(self, url):
        print_url = url + '?print=yes'
        return print_url

    feeds = [(u'Forschung', u'http://www.mpg.de/de/forschung.rss')]

    def get_masthead_url(self):
        return 'http://www.mpg.de/images/logo_print.png'
PK�X�<c	mayra.png�PNG


IHDR�a�IDATxڍ�3�\A����>M��v�8�b�v�>۶m�um�Մ�-.g��99�P�
Z��/��?TC-��lo hZPk�u����`N9��u�=�����do0�:��Qu3i� �k=��7`�1�1�����"�ʏ��o�2����f�<�I܉W�>U��H����Q����r"iAY�ˠV��i�F�IFd̓�xt������#���C}m3��۱0��ޞA�j�%���ȉ���0F@�)8n���{m�]��j@EY
�F148���Z2nj�E�3�K��$]���*x^�񘚜�����$���I��B`��|�Dcɝ�^Qƫ|o��>�O����
d�@�lz�(�]�JT�G��^���+pg�#����:���$��6'�`�={�-��I�D.m`��<��� �,�t�ܑ�`v݅\�7�_@j�Hd���,/��'aG�
H�DIEND�B`�PK�X}�&mayra.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
mayra.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Mayra(BasicNewsRecipe):
    title = u'Mayra'
    language = 'ro'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Traieste urban, cool, sexy'
    publisher = 'Mayra'
    category = 'Ziare,Stiri,Reviste'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True
    cover_url = 'http://img.konkurs.ro/img/concursuri-cu-premii/147/14672_front.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'article_details'})
    ]

    remove_tags = [
        dict(name='div', attrs={'id': 'LikePluginPagelet'}), dict(name='p', attrs={
            'id': 'tags'}), dict(name='span', attrs={'id': 'tweet-button'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': 'LikePluginPagelet'})
    ]

    feeds = [(u'\u0218tiri', u'http://www.mayra.ro/rss')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�;�%%mdj.png�PNG


IHDR  ���IDATm��neGrн#2Ϲ#�X�J�n����4`�Ђ�ę�gȌ�}Y��䵨�4@��;���� �BO��gH�NI�S�V̊���F(I3��)�9��)3#37�� �g�#� (���H��$�HI2��ɪ��(L)zD�!!�0����I"�	\�.��%�͊� ��l��F�@ (!@�N�E@�L%i+,ޢ�hŽ��� I77CF���Z
��@����H!�H�g�(N��f�`W:$�����i4�3H"$�x�x���0#�Ya����7��@�3�F#M8�$R�0@����33�XD�J@��(@Bt�����;��L3����Ij˚R�^KqRo�X$-@g�GҌ�2-E� �$1ҢKn�� �"�<E�m�(�i]s]�}m���!���0�0@R&�-�-��f�q4Z[�޻��"��lw�ZJ��eYi�����j�Ž�}~==��.��˫�C-fN�hm�N��wOO����ǟ>[��i~yz��X-Nj�ˋ�a�������?�=??
��ӏ׻�
Z�����7_Ak?����-������ߗe>Fd��ۯ�|��;���Q�����/�>�w��es��>_��1����Y�S�������ã'?��lG�����_���pئ��ח�o����������_���z��׿��2M���/_�t��G�q��c^
�2���Ϸw���� Bm���W,m_�~�Ҽ��O��6�:���f�ۏ^5���rw�^O����.6�-j���x<���};T��XZ1�����8�V��n���;�^��?�����eY�q;lF�83���~��^�y�����`�)�p<,�F��8l� }������<�-��ᡌ�����z�gVZ�yA[?\]
�<>=���\F|��q�e3ͭ��.�NI�P*��=ں���R���f3F[[kQ��̜�8M��a{q1�����k~yْ���?Ĵ��4O'���yiˊ����w�>}�v����Ǐ��6O���R�L�
�mm벢V/�n������ۻ��x���"�֦͋u]�y]W��@�~{����=�>}2������GE��
�:t��y܎>��w�61jw.�!��U|E�ڼ}y�,��q���P�e�{~|�N�a/eSQ�)}��rz9��l�O_�6��xyiC}y=ݭ�cJ���ew�~V<,S��������K[�im���/��4췇��yYc-Rp���Wf�6l�����~o���)����nsy!����r�y����'I�����Ӄ�ry������p�����S���a�Rkٌ,@�6��.�
��:�bR[֞!w���:ԋ�+xyy~~yz4i��o����/�f���\VЬ%!��l�	=J�܌(A�E�p�:Ј���b�*�٠����hF����
gn6�,�Z�3���Y���
��:�����R({�2f�nfx#R⍑F# @Rd��tH����f���,��Yd���R�"�bF��!���L%	�$AH��g�=;�%�)��D�iլЍ�ʈ��F	A���i �f��"m�b�2�u���$(�VI���R$V��I�@� X��h@��Q�`[���g��8S�\;��fH@�F�%��#� �O17J� 	H  �3�1w$!@ŸHH� ���bF�2E#�3�@��	g���?%�q��H�������7y;bK�TIEND�B`�PK�X
�P%%
mdj.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1282101454(BasicNewsRecipe):
    title = 'Marietta Daily Journal'
    __author__ = 'Tony Stegall'
    language = 'en'
    description = 'Marietta Ga and Metro Atlanta News'
    publisher = 'MDJ'
    category = 'news,politics,Georgia,USA'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    auto_cleanup = True

    feeds = [
        ('Local News', 'http://www.mdjonline.com/search/?f=rss&amp;t=article&amp;c=news/local&amp;l=50&amp;s=start_time&amp;sd=desc'),  # noqa
        ('Sports', 'http://www.mdjonline.com/search/?f=rss&amp;t=article&amp;c=sports&amp;l=50&amp;s=start_time&amp;sd=desc'),
        ('Obits', 'http://www.mdjonline.com/search/?f=rss&amp;t=article&amp;c=obituaries&amp;l=50&amp;s=start_time&amp;sd=desc'),
        ('Editorial & oped', 'http://www.mdjonline.com/search/?f=rss&amp;t=article&amp;c=opinion/mdj_editorials&amp;l=50&amp;s=start_time&amp;sd=desc'),  # noqa
        ('Lifestyle', 'http://www.mdjonline.com/search/?f=rss&amp;t=article&amp;c=news/lifestyle&amp;l=50&amp;s=start_time&amp;sd=desc'),  # noqa
        ('Blogs', 'http://www.mdjonline.com/search/?f=rss&amp;t=article&amp;c=opinion/blogs&amp;l=50&amp;s=start_time&amp;sd=desc')  # noqa
    ]
PK�Xvϒ�LL
media2.png�PNG


IHDR��h6IDATxu�KKTa��xΙ�㘓�RH�Q�*�
��(h� �	�6A��("�*,3@4J'��6:��{�����#"4R�6I���h��$92��fdш�/�uyk|~���3�Їd�c�p:E|lvm�M�Ƌ�ቴc�g3ɻ%�J�%}Z�K�"�'�9_*��ӧ�E��}�[��ƚ8Q�ˑ�Dlp<$X"!H)1����PyǞ�W{�c�^Wv�@��
L_�s�T32�f6����H[�����ZDWzs�{|d&~�����Cy�(��h��#��ٖ�m2/�����s����!@���8�~�8p�Gfa=}0�5UQm9a=9Ue��m+S
����3%p`=��cϿE��<j#��RIe�m��>���U�$��{��x��k��+����<PXN�]�^	��n�N��mǶ�q�*�7����NJj�:��c����h��+[�6V�Z;��.��T��0�10��yM��P
��f'��Z�f�w��"��A0]�/���	%Q����IEND�B`�PK�XMW溘�
media2.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = 'teepel'

from calibre.web.feeds.news import BasicNewsRecipe


class media2_pl(BasicNewsRecipe):
    title = u'Media2'
    __author__ = 'teepel <teepel44@gmail.com>'
    language = 'pl'
    description = u'Media2.pl to jeden z najczęściej odwiedzanych serwisów dla profesjonalistów z branży medialnej, telekomunikacyjnej, public relations oraz nowych technologii.'  # noqa
    masthead_url = 'http://media2.pl/res/logo/www.png'
    cover_url = 'http://media2.pl/res/logo/www.png'
    INDEX = 'http://media2.pl'
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    remove_attributes = ['style']
    ignore_duplicate_articles = {'title', 'url'}
    extra_css = '''.news-lead{font-weight: bold; }'''

    keep_only_tags = [dict(name='div', attrs={'class': 'news-item tpl-big'})]
    remove_tags = [dict(name='span', attrs={'class': 'news-comments'}), dict(name='div', attrs={'class': ['item-sidebar', 'news-inline-promo nobbtext']}),
                   dict(name='div', attrs={'class': 'news-tags'})]

    feeds = [(u'Media2', u'http://feeds.feedburner.com/media2'), (u'Internet', u'http://feeds.feedburner.com/media2/internet'),
             (u'Media', 'http://feeds.feedburner.com/media2/media'), (u'Telekomunikacja',
                                                                      'http://feeds.feedburner.com/media2/telekomunikacja'),
             (u'Reklama/PR', 'http://feeds.feedburner.com/media2/reklama-pr'), (u'Technologie',
                                                                                'http://feeds.feedburner.com/media2/technologie'),
             (u'Badania', 'http://feeds.feedburner.com/media2/badania')
             ]

    def image_url_processor(self, baseurl, url):
        if url[0] == '/':
            url = self.INDEX + url
        return url
PK�X:9�(��media_zone.png�PNG


IHDR����ѷ�IDATx��!�*O�LXذ`��YL��d2��d1Y�r�`4�X"ȃy�xp� ��6�r,����ԝ]��7?�ug��?g���4�:��=ח0��HJ�s=�J�=d��%n;7��,=�xy�G��f��(�׌�A֖�t�����ddD4�$�I)2"�;��'�A™�›[�-��U:|i�c!!e#ڼ1�L$&尨�=:\$��q��>��
�$��;��-����B�Mc�G¯�'�|$�+�fᝓ�6�
�BGr���	E�ڄ��?R��5pXI��Zp�NN=^��@h�7�K���NC;��IH�z�K��$7	�X<�$~���N���'����(]�zI�FG[�xc�P���ە�>C	)ۇAq�,YJFc_yJ�de��7�K­|�R+�~�����p^]�ǫ��x2���\O7���F1���>(Da�^9�I��R{_Y�t�Tџ�o���׊�nW���A�iԴ�x��
T�����*����I�Z��gU"���t��rY
%��j��vk�B`�ގ���$����,At�d`�uCK	jz�o�e֠\�����T"�PL~3Cv �)���*o�+��2P�ɒ��*�����T|Tm�fw���)����jL��i��]���03�����EG�+A�%
V#�%���$��Jh-Q�qIV�j�,A��]���ZK���]AZK�y�P=�]�X�jޙd��?]��D��LTl*���Q�T���k�:K�����=C	Q�>��<�����Q��T,��.�b�u�\k	���Q�-�:���<$�0
}���e<�%⵰�~��@�%��&�V,{�������?�u� []�u�IFe���#���*��INfAU���IB���Y^3�J�ĝ"�Q�xIP.���f���H$~�n�~���h��n�U�&Aٓ�·3�$���gY����^݊��-$��tT �Y%��OG�R�R"?8x���~�$b��b�3yJ���L<%D���$��2� ��W��'�U��r���(.-�F�T񖔙
;�p}�X���UV\j�:�n�۽-+�e$�J*��2���K��(�j����_*P��IEND�B`�PK�X���?��media_zone.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class MediaZona(BasicNewsRecipe):
    title = '\u041c\u0435\u0434\u0438\u0430\u0417\u043e\u043d\u0430'
    __author__ = 'bugmen00t'
    description = 'Общественно-политическое издание, сделавшее акцент на функционировании закона в России. По мнению авторитетных медиаэкспертов, по цитируемости и посещаемости формат «Медиазоны» оказался ведущим форматом новостного издания в России 2015 года. «Медиазона» пишет о реально происходящем в России, первой улавливая векторы развития общества.'  # noqa
    publisher = 'zona.media'
    category = 'news'
    cover_url = u'https://zona.media/s/share/default_mz.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = True

    oldest_article = 30
    max_articles_per_feed = 100

    remove_tags_before = dict(
        name='section', attrs={'class': 'mz-layout-content__row pt0 clearfix'}
    )

    remove_tags_after = dict(name='div', attrs={'class': 'mz-publish__wrapper'})

    remove_tags = [
        dict(name='div', attrs={'class': 'mz-agent-banner'}),
        dict(name='section', attrs={'data-share-id': 'post'})
    ]

    feeds = [
        (
            '\u041C\u0435\u0434\u0438\u0430\u0437\u043E\u043D\u0430 ',
            'https://zona.media/rss'
        ),
        (
            '\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u044C',
            'https://mediazona.by/rss'
        ),
        (
            '\u0426\u0435\u043D\u0442\u0440\u0430\u043B\u044C\u043D\u0430\u044F \u0410\u0437\u0438\u044F',
            'https://mediazona.ca/rss'
        ),
    ]
PK�X��O��mediafax.png�PNG


IHDR��h6�IDATx��KTq����<5C�R/:�S��$� (j�jhqhlv����j����HL�hȊ hH=�ݻ�1F�����Lb�ק4(�Q�����S(�/���gO
4�'-?R���=��}�3|L���
����mW���`kÓ�r���b7��~j�/H���9�}7ի�(@��{K*S>����ᾕw�'�_R��%D$�ynf���ovw|ٱ��l���
� ���P���'k�e=��N�rԀ�C
	h�
�
��y���waA!��!@
!@��2�u�S6��N�/�Zb��@�	�
�C効s2��8Ss����bLa��b���F���_�D��J#��_T1=��b��V��u|��)��vˏbT�(�t�~�t�o|��r�1�޴�)YC��X28DO֔����!i����C�E�\�&	�M��Q�IEND�B`�PK�X�@>]mediafax.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
mediafax.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Mediafax(BasicNewsRecipe):
    title = 'Mediafax'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'\u0218tiri din Rom\u00e2nia'
    publisher = 'Mediafax'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania'
    encoding = 'utf-8'
    cover_url = 'http://storage0.dms.mpinteractiv.ro/media/1/1/1706/4134575/2/logo-mediafax-mass-media-news.jpg?width=400'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher

    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'news tabs-container'})
    ]

    remove_tags = [
        dict(name='ul', attrs={'class': ['CategoryNews']}), dict(
            name='div', attrs={'class': ['read']})
    ]

    remove_tags_after = [dict(name='div', attrs={'class': 'cmsItemViews'})]

    feeds = [
        (u'Actualitate', u'http://www.mediafax.ro/rss/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X
�
��mediaindonesia.png�PNG


IHDR  D����PLTE���������������			���CCE�������������������������{{}���RRSMMNAABeefccd���llm���``a__`���^^_���������KKL**,��������������LLL777���������((*	��ꠠ�JKK333���***022���������rrt������||}���NNPTTV������qqrRSSkkl���%%'??A��Ⲳ�������'''���iij����999������TTUGGHLMM���XXY���UUVRQS���ppr���PPQ<<<hhi��د�������ן��������xxyQQR���667������666(((������ ���������KKK���BBC��׬��==>000�����Ù�����233���iik]]^���VVX������>>?���gghZZ[������jjjnnojjk~~����=�tRNS@��f�IDATxڤ҃v�1��o��Vm�=�m۶m�6���>�,�z����П1(�r|"ݵSڔ._T�^�7^��4�m,ؾ�xf��<cG����q��j���1�	����m�4kyxJ�!��*�n
��wu����0�
<��O��{���N�l98�Ԝif�=Sx�/�
fϙC�)[�о-�,1k��X�,��[��\�-������
6��asM`�8�hJ�Lj:�a�N�Q�&��;��=��%¾B�d��PUi��G���F��� �=8E���)N���ԟ�t�Bp�R%�w@���!�5K�u��aݏu����-��lߎH�;�X	ҽ����Ь,O8Y!�c�'qRf��SSճ��/_��o*�x���������/_Cm�>r`p���Ġu,��:��-�0b�8l�/�|�DQ1}��IEND�B`�PK�X�&���mediaindonesia.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2011, bakthariq AT gmail.com'
'''
m.mediaindonesia.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class Media(BasicNewsRecipe):
    title = u'Media Indonesia'
    __author__ = 'bakthariq'
    oldest_article = 1
    max_articles_per_feed = 500
    timefmt = ' [%a, %b %d, %Y]'
    language = 'id'
    category = 'News, Indonesia'
    publisher = 'Media Indonesia'
    encoding = 'utf-8'
    no_stylesheets = True
    description = 'Indonesian Media Indonesia newsportal'
    cover_url = 'http://m.mediaindonesia.com/public/img/logo.gif'
    no_javascript = True

    remove_tags = [dict(id=['atas', 'merah', 'putih']), dict(name='a')]
    remove_tags_after = [dict(id="putih")]

    extra_css             = '''
                            .judul {font-size: x-large;}
                            .tgl {font-size: x-small;color:#333333;}
                            .foto {font-size: x-small;}
    '''

    feeds = [
    (u'Polhukam', u'http://www.mediaindonesia.com/rss/1/polhukam'),
    (u'Ekonomi dan Bisnis', u'http://www.mediaindonesia.com/rss/2/ekonomi-dan-bisnis'),

    (u'Internasional', u'http://www.mediaindonesia.com/rss/6/internasional'),
    (u'Olahraga', u'http://www.mediaindonesia.com/rss/3/olahraga'),
    (u'Sepakbola', u'http://www.mediaindonesia.com/rss/4/sepakbola'),
    (u'Megapolitan', u'http://www.mediaindonesia.com/rss/5/megapolitan'),
    (u'Sains dan Teknologi', u'http://www.mediaindonesia.com/rss/7/sains-dan-teknologi'),
    (u'Humaniora', u'http://www.mediaindonesia.com/rss/14/humaniora'),
    (u'Hiburan', u'http://www.mediaindonesia.com/rss/10/hiburan'),
    (u'Opini', u'http://www.mediaindonesia.com/rss/11/opini')]
PK�XN����
mediapart.png�PNG


IHDR(-S0PLTE������������������������ݻ�̪�̪�̙�����wc\r/~IDATxU��0@�BR����USUu;�L_�3���Α��9��"�R+�@K���1>Ѻu|�n=zOp�e�֣(�)0�+�^g-�V�N�j]Z��TQ{�U�=�,��L`0�/m	��U�IEND�B`�PK�XrS++mediapart.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
#
# 11 Jan 2021 -  L. Houpert - Major changes in the Mediapart recipe:
#   1) Summary of the article are noow available
#   2) Additional sections  International, France, Economie and Culture have
# been added through custom entries in the function my_parse_index.
#   3) Fix the cover image so it doesn't disappear from the Kindle menu
# ( cover image format is changed to .jpeg)
# 14 Jan 2021 - Add Mediapart Logo url as masthead_url and change cover
#   by overlaying the date on top of the Mediapart cover
# 22 Mar 2023 - Switch to Google feeds

from __future__ import unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2021, Loïc Houpert <houpertloic at gmail .com>. Adapted from: 2016, Daniel Bonnery; 2009, Mathieu Godlewski; 2010-2012, Louis Gesbert'  # noqa
'''
Mediapart
'''

from datetime import datetime, timezone, timedelta
from calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe, classes

class Mediapart(BasicNewsRecipe):
    title = 'Mediapart'
    __author__ = 'Loïc Houpert, unkn0wn'
    description = 'Global news in French from news site Mediapart'
    publication_type = 'newspaper'
    language = 'fr'
    needs_subscription = True

    use_embedded_content = False
    no_stylesheets = True

    keep_only_tags = [
        classes(
            'news__heading__top news__heading__center news__body__center__article'
        )
    ]

    remove_tags = [
        classes('action-links media--rich read-also login-subscribe print-source_url'),
        dict(name='svg'),
    ]

    conversion_options = {'smarten_punctuation': True}

    masthead_url = "https://raw.githubusercontent.com/lhoupert/calibre_contrib/main/mediapart_masthead.png"

    ignore_duplicate_articles = {'title'}
    resolve_internal_links  = True
    remove_empty_feeds = True

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = []

    sections = [
        'france', 'international', 'economie', 'culture-idees', 'politique', 'ecologie', 'fil-dactualites'
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:mediapart.fr%2Fjournal{}&hl=fr-FR&gl=FR&ceid=FR:fr'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    feeds.append(('Autres', a.format('')))

    def get_browser(self):
        # -- Handle login

        def is_form_login(form):
            return "id" in form.attrs and form.attrs['id'] == "logFormEl"

        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://www.mediapart.fr/login')
            br.select_form(predicate=is_form_login)
            br['name'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def default_cover(self, cover_file):
        '''
        Create a generic cover for recipes that don't have a cover
        '''
        from qt.core import QImage, QPainter, QPen, Qt, QFont, QRect
        from calibre.gui2 import ensure_app, load_builtin_fonts, pixmap_to_data

        def init_environment():
            ensure_app()
            load_builtin_fonts()

        def create_cover_mediapart(date):
            ' Create a cover for mediapart adding the date on Mediapart Cover'
            init_environment()
            # Get data
            image_url = 'https://raw.githubusercontent.com/lhoupert/calibre_contrib/main/mediapart.jpeg'
            data = self.index_to_soup(image_url, raw=True)
            # Get date and hour corresponding to french time zone
            today = datetime.now(timezone.utc) + timedelta(hours=1)
            wkd = today.weekday()
            french_weekday={0:'Mon',1:'Mar',2:'Mer',3:'Jeu',4:'Ven',5:'Sam',6:'Dim'}
            day = french_weekday[wkd]+'.'
            date = day + ' ' + today.strftime('%d %b. %Y')
            edition = today.strftime('Édition de %Hh')

            # Get Cover data
            img  = QImage()
            img.loadFromData(data)

            # Overlay date on cover
            p = QPainter(img)
            pen = QPen(Qt.black)
            pen.setWidth(6)
            p.setPen(pen)
            font = QFont()
            font.setFamily('Times')
            font.setPointSize(72)
            p.setFont(font)
            r = QRect(0, 600, 744,100)
            p.drawText(r, Qt.AlignmentFlag.AlignJustify | Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignCenter, date)
            p.end()

            # Overlay edition information on cover
            p = QPainter(img)
            pen = QPen(Qt.black)
            pen.setWidth(4)
            p.setPen(pen)
            font = QFont()
            font.setFamily('Times')
            font.setItalic(True)
            font.setPointSize(66)
            p.setFont(font)
            # Add date
            r = QRect(0, 720, 744,100)
            p.drawText(r, Qt.AlignmentFlag.AlignJustify | Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignCenter, edition)
            p.end()
            return pixmap_to_data(img)

        try:
            today=datetime.today()
            date = today.strftime('%d %b %Y')
            img_data = create_cover_mediapart(date)
            cover_file.write(img_data)
            cover_file.flush()
        except Exception:
            self.log.exception('Failed to generate default cover')
            return False
        return True
PK�X�SMMmediterraneo.png�PNG


IHDR  ��tRNSn��IDATxڵV�"M�			�dr���ݺ9wwwwwwww[w�_���aX���M���T�{�]Eu�,J,��Cp"vW�=T�G[ͷ�0���A`P�PTp"��X�<դCiLڄ8�nQ��*{
�08a��D�J�<~H�*�Ɖ���l�>@�I6n�P�P��"I�d�\�M�{� C�W3r`N�8�,�N��W_�K9K��\b� E&3���4b�X�S�SI�>|�
fE/�w?�Ic�x�#�J �+�n/>%X,��0��4�1�^�?V{�ݢz���k�Z�x�7_�j��w<����d���a�x�9Rgr
�r��F�%X��l}�w���|�����N�"5Sn �v��3�����N�s��Sr�/�Ӵ�.7��KU`�;/�t�4����+!��E��Fޮ�;�ӗ�~Z�@��R5
i���S�QD��S4�I��'�9�"�qsI�H=J$���+�[rT4·�}y�5�N�"����d���d�yRo
��JڄN�_WTj����������"�gRTT�/p�ׄ����M�����n�c�Ʉ�wj����9��r:�\q��s;�����!�#D�a׈�8@;������r�.�ע�V3o=%�K+��!�I�H_����/��t��B�:O`�,�ѳ��Q��"~O�$mC��m9x������<���*+ϕ�N>y1a�^���|�5����i�*5�@q��GRgRۡ33s\#𜶄F�V��&��<"��/,�K��a't>�E��ո���əy����wc���ǘ�]����m;tFf��5٤E�'ip��{>	��p����}F��b���:��E�g��U�v����Y}j3�j]#��
��Z5���_q�A�h�+����P8��_����5�=A�U �?v����k@�����?�F��jj����B�;��O���o_;��\#�=K5�b�"x��-�aá�P�[S��Z���z	h$O����x�I\�[��)AzV>�a����rh[jt���;�l�X��A���H��P�ֲZ���5?��>:
�Q���UQO����K�Y~d����w�_������N[.�h�4���zɶs�v]\������顅
ֶ�W�`��ջ/� ���Y�Hnk��c����\�xۛ-o
�� ؾ����ʼnQ@�h��7-.^*��e����>-������
˓	�eIEND�B`�PK�X��F�++mediterraneo.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = 'benages, based on elperidicodearagon.com by desUBIKado'
__author__ = 'benages'
__description__ = 'Daily newspaper from Castellón'
__version__ = 'v0.10'
__date__ = '07, March 2019'
'''
elperiodicomediterraneo.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class elperiodicomediterraneo(BasicNewsRecipe):
    title = u'El Periódico Mediterráneo'
    __author__ = u'benages'
    description = u'Noticias desde Castellón'
    publisher = u'elperiodicomediterraneo.com'
    category = u'news, politics, Spain, Castellón'
    oldest_article = 1
    delay = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'es'
    masthead_url = 'http://pdf.elperiodicomediterraneo.com/img/logotipo.gif'
    encoding = 'iso-8859-1'
    remove_empty_feeds = True
    remove_javascript = True

    # The index of feeds is in https://www.elperiodicomediterraneo.com/info/rss.php
    feeds = [
        (u'Portada', u'https://est.zetaestaticos.com/mediterraneo/rss/portada_es.xml'),
        (u'Ultima hora', u'https://est.zetaestaticos.com/mediterraneo/rss/ultimahora_es.xml'),
        (u'Castell\xf3n', u'https://est.zetaestaticos.com/mediterraneo/rss/2_es.xml'),
        (u'Vila-Real', u'https://est.zetaestaticos.com/mediterraneo/rss/102_es.xml'),
        (u'Comarcas', u'https://est.zetaestaticos.com/mediterraneo/rss/10_es.xml'),
        (u'Comunitat', u'https://est.zetaestaticos.com/mediterraneo/rss/230_es.xml'),
        (u'Espa\xf1a', u'https://est.zetaestaticos.com/mediterraneo/rss/3_es.xml'),
        (u'Opini\xf3n', u'https://est.zetaestaticos.com/mediterraneo/rss/103_es.xml'),
        (u'Internacional', u'https://est.zetaestaticos.com/mediterraneo/rss/4_es.xml'),
        (u'Econom\xeda', u'https://est.zetaestaticos.com/mediterraneo/rss/5_es.xml'),
        (u'Deportes', u'https://est.zetaestaticos.com/mediterraneo/rss/7_es.xml'),
        (u'Villarreal', u'https://est.zetaestaticos.com/mediterraneo/rss/288_es.xml'),
        (u'Castell\xf3n CF', u'https://est.zetaestaticos.com/mediterraneo/rss/319_es.xml'),
        (u'Sucesos', u'https://est.zetaestaticos.com/mediterraneo/rss/105_es.xml'),
        (u'Sociedad', u'https://est.zetaestaticos.com/mediterraneo/rss/106_es.xml'),
        (u'Espectaculos', u'https://est.zetaestaticos.com/mediterraneo/rss/107_es.xml'),
        (u'Televisi\xf3n', u'https://est.zetaestaticos.com/mediterraneo/rss/324_es.xml'),
    ]

    remove_tags_before = dict(name='div', attrs={'class': 'Pagina'})
    remove_tags_after = dict(name='div', attrs={'class': 'ComentariosNew'})

    keep_only_tags = [dict(name='div', attrs={'class': 'Pagina'})]

    remove_tags = [
        dict(
            name='nav',
            attrs={'class': ['Compartir', 'HerramientasConversacion Herramientas']}
        ),
        dict(name='h5', attrs={'class': ['CintilloBox']}),
        dict(
            name='div',
            attrs={
                'class': [
                    'BoxMenu BoxMenuConFoto', 'BxGalerias', 'ConStick',
                    'HerramientasComentarioNew Herramientas', 'NumeroComentarioNew'
                ]
            }
        ),
        dict(
            name='div',
            attrs={
                'class': [
                    'BoxPestanas', 'Box', 'ColumnaDerecha',
                    'NoticiasRelacionadasDeNoticia',
                    'CintilloNoticiasRelacionadasDeNoticia'
                ]
            }
        ),
        dict(name='a', attrs={'class': ['IrA BotonLink']})
    ]

    # Recuperamos la portada de papel (la imagen format=1 tiene mayor resolucion)

    def get_cover_url(self):
        index = 'http://pdf.elperiodicomediterraneo.com/edicion.php'
        soup = self.index_to_soup(index)
        for image in soup.findAll('img', src=True):
            if image['src'].startswith('/funciones/img-public.php?key='):
                return 'http://pdf.elperiodicomediterraneo.com' + image['src']
        return None

    extra_css = '''
                    h1 {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:28px;}
                    h2 {font-family:Arial,Helvetica,sans-serif; font-style:italic;font-size:14px;color:#4D4D4D;}
                    h3 {font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:18px;}
                '''
PK�X{�3��medscape.png�PNG


IHDR(-SPLTE
o�{�������pBIDATx�}�@���w.տ�_���G��Ȁ_�
.H/(��?��C��OT?�n�)��IEND�B`�PK�X�B���medscape.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Tony Stegall'
__copyright__ = '2010, Tony Stegall or Tonythebookworm on mobileread.com'
__version__ = '1'
__date__ = '01, October 2010'
__docformat__ = 'English'


from calibre.web.feeds.recipes import BasicNewsRecipe


class MedScrape(BasicNewsRecipe):

    title = 'MedScape'
    __author__ = 'Tony Stegall'
    description = 'Nursing News'
    language = 'en'
    timefmt = ' [%a, %d %b, %Y]'
    needs_subscription = True
    masthead_url = 'http://images.medscape.com/pi/global/header/sp/bg-sp-medscape.gif'
    no_stylesheets = True
    remove_javascript = True
    conversion_options = {'linearize_tables': True}
    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}


                    p.authors{text-align:right; font-size:small;margin-top:0px;margin-bottom: 0px;}
                    p.postingdate{text-align:right; font-size:small;margin-top:0px;margin-bottom: 0px;}
                    h2{text-align:right; font-size:small;margin-top:0px;margin-bottom: 0px;}


                    p{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''

    remove_tags = [dict(name='div', attrs={'class': ['closewindow2']}),
                   dict(name='div', attrs={'id': ['basicheaderlinks']})
                   ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://profreg.medscape.com/px/getlogin.do')
            br.select_form(name='LoginForm')
            br['userId'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    feeds = [
        ('MedInfo', 'http://www.medscape.com/cx/rssfeeds/2685.xml'),
    ]

    def print_version(self, url):
        # the original url is: http://www.medscape.com/viewarticle/728955?src=rss
        # the print    url is: http://www.medscape.com/viewarticle/728955_print
        print_url = url.partition('?')[0] + '_print'
        # print 'the printable version is: ',print_url
        return print_url

    def preprocess_html(self, soup):
        for item in soup.findAll(attrs={'style': True}):
            del item['style']
        return soup
PK�X1,��
meduza.png�PNG


IHDR  D����PLTE



��XYF/6+2('rW:��UP=)a?J9&C4#�~PTA,+#aK3�lE>2%�sJ_I0��S�wM�cA�c@jR7mޢ2tRNS�!!��髫��8�IDATx^�ʇn�0EѡlKf��}{���^�% +@���>�{�3����ȅ6>�,d�T��;�B��p�A���i"����g<ٝ�d-��s�>/y�ձL���# ޔ�MZ�\0}���\g���/���NE�p'�9�I��2�=9@  �9@މ�'�'	�9�2D�̓�m����%h�FԨ�@38^5�z�)�5�ߕʴN˞d�b�35u���v`�u� �I�w+�vl�[/K�5�0�vs`��/�I��mT�IEND�B`�PK�X|y�##
meduza.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Meduza(BasicNewsRecipe):
    title = u'Meduza'
    description = u'Russian- and English-language independent news website, based in Latvia. It was founded in 2014 by a group of former employees of the then independent Lenta.ru news website. Every day we bring you the most important news and feature stories from hundreds of sources in Russia and across the former Soviet Union.'  # noqa
    __author__ = 'bugmen00t'
    publisher = 'Medusa Project SIA'
    publication_type = 'blog'
    oldest_article = 21
    max_articles_per_feed = 100
    language = 'en_RU'
    cover_url = 'https://meduza.io/impro/E_cJMv0IQxOC45z-YXeGuzuPB2kQ_A1XsZYrdByOCnk/fill/1200/0/ce/0/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNi83/MTgvODcyL29yaWdp/bmFsLzVPSmRDdWc1/bC1JVG9lTXBqSHFH/ZXcucG5n.png'  # noqa
    auto_cleanup = False
    no_stylesheets = False

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'GeneralMaterial-article'})

    remove_tags = [
        dict(name='div', attrs={'id': 'div-gpt-ad'}),
    ]

    feeds = [
        (u'News', 'https://meduza.io/rss2/en/news'),
        (u'Feature stories', 'https://meduza.io/rss2/en/stories'),
    ]
PK�X1,��
meduza_ru.png�PNG


IHDR  D����PLTE



��XYF/6+2('rW:��UP=)a?J9&C4#�~PTA,+#aK3�lE>2%�sJ_I0��S�wM�cA�c@jR7mޢ2tRNS�!!��髫��8�IDATx^�ʇn�0EѡlKf��}{���^�% +@���>�{�3����ȅ6>�,d�T��;�B��p�A���i"����g<ٝ�d-��s�>/y�ձL���# ޔ�MZ�\0}���\g���/���NE�p'�9�I��2�=9@  �9@މ�'�'	�9�2D�̓�m����%h�FԨ�@38^5�z�)�5�ߕʴN˞d�b�35u���v`�u� �I�w+�vl�[/K�5�0�vs`��/�I��mT�IEND�B`�PK�X�79�))meduza_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Meduza(BasicNewsRecipe):
    title = u'Meduza'
    description = u'\u041C\u0435\u0436\u0434\u0443\u043D\u0430\u0440\u043E\u0434\u043D\u043E\u0435 \u0440\u0443\u0441\u0441\u043A\u043E\u044F\u0437\u044B\u0447\u043D\u043E\u0435 \u0438\u0437\u0434\u0430\u043D\u0438\u0435. \u041C\u044B \u0432\u044B\u0431\u0438\u0440\u0430\u0435\u043C \u0434\u043B\u044F \u0432\u0430\u0441 \u0441\u0430\u043C\u044B\u0435 \u0432\u0430\u0436\u043D\u044B\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438 \u0438 \u0433\u043E\u0442\u043E\u0432\u0438\u043C \u043B\u0443\u0447\u0448\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u044B \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \u043F\u0440\u043E\u0438\u0441\u0445\u043E\u0434\u0438\u0442 \u0432 \u0420\u043E\u0441\u0441\u0438\u0438 \u0438 \u043C\u0438\u0440\u0435.'  # noqa
    __author__ = 'bugmen00t'
    publisher = 'Medusa Project SIA'
    publication_type = 'blog'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'ru'
    cover_url = 'https://meduza.io/impro/E_cJMv0IQxOC45z-YXeGuzuPB2kQ_A1XsZYrdByOCnk/fill/1200/0/ce/0/aHR0cHM6Ly9tZWR1/emEuaW8vaW1hZ2Uv/YXR0YWNobWVudHMv/aW1hZ2VzLzAwNi83/MTgvODcyL29yaWdp/bmFsLzVPSmRDdWc1/bC1JVG9lTXBqSHFH/ZXcucG5n.png'  # noqa
    auto_cleanup = False
    no_stylesheets = False

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'GeneralMaterial-article'})

    remove_tags = [dict(name='div', attrs={'id': 'div-gpt-ad'})]

    feeds = [
        (
            u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://meduza.io/rss2/news'
        ),
        (
            u'\u0418\u0441\u0442\u043E\u0440\u0438\u0438',
            'https://meduza.io/rss2/articles'
        ),
    ]
PK�XM��M��mel.png�PNG


IHDR  V%(WIDAT8�͓�j�P���6i���
-ut�98	��^C�T��^�С��T;n� �W��$b���g�UsJW���}��;	�$!�!q:���Fōھ`�ąnn
פHؿ���2��E�kkۚ�w�4* |�5�+�6E�b�=!$�*e�̖VQ;4S��jR�z$�΀B|���
��O��>Z�ւGB��'0��g�הw�	�g��h���U
�
��t�7}�0�����Ja����񐜨'd����z��M���v&Fq�&�v��ݹ�^�	t�C`"��P^.���7���g���Ų�#G^�(H:�w�+瘄��4y��;���e�pPO���o��^�d]�@IEND�B`�PK�Xۢr�
�

mel.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Mel(BasicNewsRecipe):
    title = '\u041C\u0435\u043B'
    __author__ = 'bugmen00t'
    description = '\u041C\u0435\u0434\u0438\u0430 \u043F\u0440\u043E \u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u0438 \u0432\u043E\u0441\u043F\u0438\u0442\u0430\u043D\u0438\u0435 \u0434\u0435\u0442\u0435\u0439'  # noqa
    publisher = '\u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0438\u0437\u0434\u0430\u043D\u0438\u0435 \u00AB\u041C\u0435\u043B\u00BB'
    category = 'blog'
    cover_url = u'https://static.mel.fm/images/project/site/dummyLogo.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 50

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='div', attrs={'class': 'b-pb-article__body'})

    remove_tags = [
        dict(name='div', attrs={'class': 'b-ad-space__horizontal-centering'}),
        dict(
            name='div',
            attrs={
                'class':
                'subscriptionBlock b-pb-publication-body__publication-newsletter-form'
            }
        ),
        dict(
            name='div',
            attrs={
                'class':
                'subscriptionBlock b-pb-article__publication-newsletter-form b-pb-article__publication-newsletter-form-post'
            }
        ),
        dict(
            name='div',
            attrs={
                'class': 'newsletter-form b-pb-article__publication-newsletter-form'
            }
        ),
        dict(name='div', attrs={'class': 'bottom-wrapper'}),
        dict(
            name='div',
            attrs={
                'class':
                'b-pb-article__right-column b-pb-article__right-column_without-cover b-pb-article__right-column_on-post-page'
            }
        ),
        dict(
            name='div',
            attrs={
                'class':
                'b-pb-article__right-column b-pb-article__right-column_with-cover'
            }
        ),
        dict(name='div', attrs={'class': 'main-tag'}),
        dict(name='div', attrs={'class': 'main-tag_mobile'}),
        dict(name='div', attrs={'class': 'publication-header__counter'}),
        dict(
            name='div',
            attrs={
                'class':
                'smi2-news-container smi2-news-container_desktop smi2-news-container_desktop-news'
            }
        ),
        dict(
            name='div',
            attrs={'class': 'smi2-news-container smi2-news-container_desktop'}
        ),
        dict(
            name='div',
            attrs={
                'class':
                'smi2-news-container smi2-news-container_mobile smi2-news-container_mobile-news'
            }
        ),
        dict(
            name='div',
            attrs={'class': 'smi2-news-container smi2-news-container_mobile'}
        )
    ]

    feeds = [(
        '\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
        'https://mel.fm/rss/default-all'
    ),
             (
                 '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
                 'https://mel.fm/rss/default-news'
             )]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�XSn�{{melbourne_herald_sun.png�PNG


IHDR  ��BIDATx����X�S�m۶m۶���m۶m��S�H�����Ź�
��w��	rB;�T��%F+QZ��u��V?Y�NV��Vi��I�q�oǐ_��u�
�������T�-��[��N��U8����Y��&�y]��:py���u�RM�FP�᤼F�Tj%��K��;̼�xx�A�m�������w6�<�qOQ���t�v��'�'3m36ґuTx�~�GS�g����!���j�&0&��ˌC�������_�ǀ��D���&X/��+1�vL�
�H"�J�b����l�s�Q�-D�b꫙f䗣�-�eߘjO�
���
T�q��Fޛ���7x�(��Y9�|>�.&2�;qs_��������_�h�
ľ6�K?-r����XO"�w^�U�	�	3�`v����8%+���0ךLe�l0�O���VpV'n�N�3�.�H�u�*�Ƚ��7�,m�_�B�,�R�����9��N�A̋�`r�n�[���w��UZI��˙��!��'��t�3��p���e� N$��ʦ�"&3p�öz�.(�4�o`��0ep�.���tnr`�'F�Ig��Yq�S6��%tH�����w�F֝CL�&����~h��: ��0`��k�Ҋ�`SƂ}�>-�=��'XTX6֞m��
�Sr9����;�w\$ǘ�G��Zc�
 UHk৿�3��4�v.�o	�a���w
7���_9$�d)�A��Ћ9dκ+K?F���@��h�E��y�9���M�X�媞��������Y��r�=�ЕS���y�tq���AQ�w5�l:zw��24����N�8�#�TC�V���R�̏s,�8�9�:�4d�����9�#1p����o�;�pb����v0��8��M�Hj�I�ŭ##UKL�T,���!ӥ;�r�R�E~+��g�m��r���%�<�����)6XMI�f�p�5}�v��W���(�˝s73�udx��s�U�i��Q٭h�]�7��*`�pF�����(I
�R���)�RR�hR'C*��fM,�M��^@E�IEND�B`�PK�X�?{�88melbourne_herald_sun.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2009, Matthew Briggs'
__docformat__ = 'restructuredtext en'

'''
http://www.herald sun.com.au/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class DailyTelegraph(BasicNewsRecipe):
    title = u'Melbourne Herald Sun'
    __author__ = u'Ray Hartley'
    description = (u'Victorian and National News'
                   '. You will need to have a subscription to '
                   'http://www.heraldsun.com.au to get full articles.')
    language = 'en_AU'

    oldest_article = 2
    needs_subscription = 'optional'
    max_articles_per_feed = 30
    remove_javascript = True
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en_AU'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://resources2.news.com.au/cs/heraldsun/images/header-and-footer/logo.gif'
    extra_css             = """
                               body{font-family: Arial,Helvetica,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                               .caption{display: inline; font-size: x-small}
                            """

    conversion_options = {
        'comment': description, 'language': language
    }

    keep_only_tags = [dict(attrs={'id': 'story'})]
    remove_tags_before = dict(attrs={'class': 'story-header'})
    remove_tags_after = dict(attrs={'class': 'story-footer'})
    remove_tags = [
        dict(name=['meta', 'link', 'base', 'iframe', 'embed', 'object', 'media-metadata', 'media-reference', 'media-producer']
             ), dict(attrs={'class': ['story-header-tools', 'story-sidebar', 'story-footer', 'story-summary-list']})
    ]
    remove_attributes = ['lang']

    feeds = [
    (u'Breaking News', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_breakingnews_206.xml'),
    (u'Business', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_business_207.xml'),
    (u'Entertainment', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_entertainment_208.xml'),
    (u'Health Science', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_health_212.xml'),
    (u'Music', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_music_449.xml'),
    (u'National News', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_national_209.xml'),
    (u'Sport News', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_sport_213.xml'),
    (u'AFL   News', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_afl_205.xml'),

    (u'State News', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_vic_214.xml'),
    (u'Technology', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_tech_215.xml'),
    (u'World News', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_world_216.xml'),
    (u'Opinion',  u'http://feeds.news.com.au/public/rss/2.0/heraldsun_opinion_210.xml'),
    (u'Andrew Bolt', u'http://blogs.news.com.au/heraldsun/andrewbolt/index.php/xml/rss_2.0/heraldsun/hs_andrewbolt/'),
    (u'Afl - St Kilda', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_afl_stkilda_565.xml'),
    (u'Terry McCrann', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_tmccrann_224.xml'),
    (u'The Other side', u'http://feeds.news.com.au/public/rss/2.0/heraldsun_otherside_211.xml')]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username and self.password:
            br.open('http://www.heraldsun.com.au')
            br.select_form(nr=1)
            br['username'] = self.username
            br['password'] = self.password
            raw = br.submit().read()
            if b'>log out' not in raw.lower():
                raise ValueError('Failed to log in to www.heralsun'
                                 ' are your username and password correct?')
        return br

    def get_article_url(self, article):
        return article.id
PK�Xy�2�	�	men24_gr.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class Men24(BasicNewsRecipe):
    title = 'Men24.gr'
    __author__ = 'Stelios'
    description = 'Greek Mens portal'
    oldest_article = 14
    max_articles_per_feed = 100
    language = 'el'
    cover_url = 'http://www.men24.gr/ast/img/men24Logo.jpg'
    category = 'magazines, GR'
    language = 'el'
    encoding = 'windows-1253'
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    extra_css       = '''
                        .artPrintTitle{font-family :Arial,Helvetica,sans-serif; font-weight: bold; font-size:large;}
                        .artPrintSubtitle{font-family :Arial,Helvetica,sans-serif; font-size:x-small;}
                     '''
    remove_tags = [
        dict(name='td', attrs={'class': ['artPrintCategory']}),
        dict(name='table', attrs={'class': ['footer']}),
        dict(name='img')
    ]
    feeds = [
        (u'\u038C\u03BB\u03B5\u03C2 \u03BF\u03B9 \u03B5\u03B9\u03B4\u03AE\u03C3\u03B5\u03B9\u03C2',
         'http://www.men24.gr/svc/rss/lastNews/'),
        (u'\u03A3\u03C4\u03C5\u03BB',
         'http://www.men24.gr/svc/rss/categoryNews/?category=style'),
        (u'Fitness', 'http://www.men24.gr/svc/rss/categoryNews/?category=fitness'),
        (u'Gadgets', 'http://www.men24.gr/svc/rss/categoryNews/?category=gadgets'),
        (u'\u0394\u03B9\u03B1\u03C3\u03BA\u03AD\u03B4\u03B1\u03C3\u03B7',
         'http://www.men24.gr/svc/rss/categoryNews/?category=fun'),
        (u'\u03A7\u03C1\u03AE\u03BC\u03B1 \u03BA\u03B1\u03B9 \u039A\u03B1\u03C1\u03B9\u03AD\u03C1\u03B1',
         'http://www.men24.gr/svc/rss/categoryNews/?category=money'),
        (u'Special Edition', 'http://www.men24.gr/svc/rss/categoryNews/?category=special'),
        (u'\u0388\u03C1\u03C9\u03C4\u03B1\u03C2 \u03BA\u03B1\u03B9 Sex',
         'http://www.men24.gr/svc/rss/categoryNews/?category=love'),
        (u'\u0386\u03BD\u03C4\u03C1\u03B5\u03C2 \u03C4\u03BF\u03C5 24',
         'http://www.men24.gr/svc/rss/categoryNews/?category=men'),
        (u'\u0393\u03C5\u03BD\u03B1\u03AF\u03BA\u03B5\u03C2',
         'http://www.men24.gr/svc/rss/categoryNews/?category=women'),
        (u'\u039F\u03B4\u03B7\u03B3\u03BF\u03AF',
         'http://www.men24.gr/svc/rss/categoryNews/?category=guides'),
        (u'\u03A4\u03B6\u03CC\u03B3\u03BF\u03C2',
         'http://www.men24.gr/svc/rss/categoryNews/?category=gamble')

    ]

    def print_version(self, url):
        return url.replace('.asp', '.print.asp')
PK�X�=x���mens_day_out.png�PNG


IHDR  ��tRNSn���IDATx�4��d!@��V�������}�<2k4��hCrT�be�U=:(T����wq(�>�z��&T���_J�{�T�M���5���$1��f�)���>�~�~�xa�Z���>ӡKi�Фb�dvU��h}��������!86?�9��E��Y1��y�E+b�ev���W��ّz��^��f��?DUs�c�̿?c'�o_ֶ�l۶m۶��y�m��Hrѷo�^w�E���TW�9�^��� )�f2Y��е���ײ�'~��g���v��;��?��Swwg02̉K6��?j�/��)XL�I0
�_z�Pp��>��>�W,����1�i͙B�v����;�pО{�t�u������ՅE�9�eBP@��"�0�ox�qu���������
�B�b�V��f
hh�Q�,��g�(%�Z%,�Y�A	=eƚ��|f����ت-�45]uù������7�B��APf�K߁��XH���^�PV"�8!���Ν�\[�pL�������%_y�N0�����+��s-*@)�2�:�h~F.	��3�!DE�����4d�gk&U�siSff�b�������퇯~|�Ύ��A��5�{���޿�;��� `ejeS,��	ec3dP�����=���
����i�����<h��P�&Uy�׻�_���o����Ο�<��.A�����(��X����'��^��9;7��yٚ��g���f3S�z�w�8䧇nD���u�|�!��v(��m�9#8�r�ƃ_��
���i�*MJW{]fN���������v����'����S��~���g���Y������c#4@X�z��������^���B��G��v��.��r��l=r��C�9��o��w@��S�1d&��E��h�)],96Õ�'����g�=��?'췗
}�z�E���57c���/�✓���Z�~��܃�:�p��Bc��dj��)ePB�]|�1s򹹹�ʝf����}7�3���Gn�ێ��~��������N�x�vt�l��	P����P���|�fq;��9���u���ދ���YKÏ�X�pykͳ�_�7�T�䞛�˦g����6\u����FA�S)@d��9f���ϟ�MM��NO%�[����?/�����V�g�V�&#�]DP�LJ�`�䉈�r�i�}��B*>��^K4;�����q�?*��Ka�aр��-<m��a!��%�6�O=x��Y��T�Z�vrmͼ��#v�u��Mc+�}�x��0�	�6��P�Z@n��Vw�@3PV"�8�)N������&1%_<~�h{�*x�Q�50���פ$i0b��۬�4p�;�vM�$�����ՕS2�~�̗�i/m�)0�)���b���m>,4�ƴ^B���+�v�ڮQ۠1fd�s��]��j���vE�&?�Z��E/
I����4+���\�4Ez���LJ��67M����kw]��ѻ����T���׮�_�p��7���u]��5^z��uk�~�ч��� aTV͘���0����9��#'d����3�&e�㲙�3��v��w�O�;�g/<���~+ɥ`��4��M�&c�H�E0�P���/�z��gq��^���o8���sx�A��'�������2@��a�q�n�X��!q�0�a(I�"�4���^��C9�H�fa!{���1a��u0�&L:g�7�KG[�*��:�<H�k}�o
z׀U���'6���f�6[����2��8^�3/L�z(Bx0ƚ��ȁ�$��V�?�.�q��
��@M����vUѥ��S�gۦ�Җ|�BWs׀���]:n��|�x�Cm�V�r?�!ZkL��IEND�B`�PK�X���11mens_day_out.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
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 MensDayOut(BasicNewsRecipe):
    title          = 'Mens Day Out'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('MDO main', 'https://mensdayout.com/feed/'),
    ]
PK�X�j���mens_health.png�PNG


IHDR:����IDATWc�?�oB� �s�tT�>���o�'L�@xR�9���ѫ��~Qn���[�,�����`BWHK�v�������=V�93�A�ؐ�h�U�x?����!��ӷ��C޽�~�+X�|��Y��Q��|�F����3K����<�D�z�yJ�����0C�v�uљ?��?��lٶm�g0םŊ�knIEND�B`�PK�X�9&BBmens_health.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1305636254(BasicNewsRecipe):
    title = u'Mens Health (US)'
    language = 'en'
    __author__ = 'Anonymous'
    oldest_article = 14
    max_articles_per_feed = 100

    feeds = [(u'News', u'http://blogs.menshealth.com/health-headlines/feed')]
PK�X�!㊙�merco_press.png�PNG


IHDR(-S�PLTE:V{Ry�Lp�Ot�Il�U}����Fg�s�������ŭ�ͮ�ϱ�Ҹ��Tr�^��_��a}�c��f��h��k��n��o��o��q��Cc�w��z��|�����������������������<X~��������������Ô�������—�ę��>\���Þ�Ǭ�ˬ��Uv����A_���Ѱ��W�����Z������������������������\���ĚIDATx�]��A���ڶm;���ܿ
Q�!A�G�J�L �+���j]??��a��uȘ���Atg�(z'!�t���	��p���M��%_J=���D�*�3ܤ*�f/�2��%���!h�K��IEND�B`�PK�X���((merco_press.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class MercoPress(BasicNewsRecipe):
    title = u'Merco Press'
    description = u"Read News, Stories and Insight Analysis from Latin America and Mercosur. Politics, Economy, Business and Investments in South America."
    cover_url = 'http://en.mercopress.com/web/img/en/mercopress-logo.gif'

    __author__ = 'Russell Phillips'
    language = 'en'

    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    extra_css = 'img{padding-bottom:1ex; display:block; text-align: center;}'
    remove_tags = [dict(name='a')]

    feeds = [('Antarctica', 'http://en.mercopress.com/rss/antarctica'),
             ('Argentina', 'http://en.mercopress.com/rss/argentina'),
             ('Brazil', 'http://en.mercopress.com/rss/brazil'),
             ('Falkland Islands', 'http://en.mercopress.com/rss/falkland-islands'),
             ('International News', 'http://en.mercopress.com/rss/international'),
             ('Latin America', 'http://en.mercopress.com/rss/latin-america'),
             ('Mercosur', 'http://en.mercopress.com/rss/mercosur'),
             ('Paraguay', 'http://en.mercopress.com/rss/paraguay'),
             ('United States', 'http://en.mercopress.com/rss/united-states'),
             ('Uruguay://en.mercopress.com/rss/uruguay')]
PK�XA"��	mesec.png�PNG


IHDR���R-PLTE^E"hQ1r\?|hN�t]�l��{����������������+�tRNS@��f<IDAT�c`A(��Puo��dĽ{���%�Xދ�� �D���������YsF��D�y
IEND�B`�PK�X��$		mesec.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Tomas Latal<latal.tomas at gmail.com>'

from calibre.web.feeds.news import BasicNewsRecipe


class MesecCZ(BasicNewsRecipe):
    title = u'M\u011b\u0161ec'
    __author__ = 'Tomas Latal'
    __version__ = '1.0'
    __date__ = '30 April 2011'
    description = u'Zpr\xe1vi\u010dky a \u010dl\xe1nky z Mesec.cz'
    oldest_article = 1
    max_articles_per_feed = 10
    encoding = 'utf8'
    publisher = 'Internet Info s.r.o.'
    category = 'finance,CZ'
    language = 'cs'
    publication_type = 'newsportal'
    no_stylesheets = True
    remove_javascript = True
    extra_css               = 'p.perex{font-size: 1.2em;margin: 0 0 10px 0;line-height: 1.4;padding: 0 0 10px 0;font-weight: bold;} \
                               p.perex img {display:none;} \
                               .urs p {margin: 0 0 0.8em 0;}'

    feeds = [
        (u'Aktuality', u'http://www.mesec.cz/rss/aktuality/'),
        (u'\u010cl\xe1nky', u'http://www.mesec.cz/rss/clanky/')
    ]

    remove_tags_before = dict(id='main')

    remove_tags_after = [dict(id='main')]

    remove_tags = [
        dict(attrs={'class': ['author clear', 'tags-rubrics', 'box border style1 links clear', 'enquiry clear', 'serial', 'box border style1 TitleList',
                              'breadcrumb clear', 'article-discussion box border style1 monitoringComponentArticle', 'link-more border prev-next clear']}),
        dict(id=['discussionList', 'similarItems',
                 'sidebar', 'footer', 'opl', 'promo-box'])
    ]
PK�X�r� ��metro_montreal.png�PNG


IHDR  D����PLTEy;���}A|@����|?�F��Ÿ�����|?���������{>|@���1�^2�_3�`4�`7�c:�e@�jC�lR�xW�zY�}c��g��k��m��q��u������ç�Ƭ�ȯ�Ȱ���{?	}A��ƺ�Ȼ�ȼ��������
}B����������������������������E���������������������������������������|@�I�������M����������N����P����ɰ�ʲ{=�����$�Un��o��o���Ms��s��t��t��
~By��z��}��}��~��~��~��������������������O����¦�§
~C�ç�è�ĩ�ĩ�Ū�ūm��~C�ʳ�˳�Ͷ�Ͷ�θ�Ϲ�ҽ�Ҿ!�R!�R"�S���
D(�W��Ǻ��*�Y,�[��ɼ��.�Z��˿�˿����������������0�]������0�^1�\���������h��
}A�E�������F6�c�F8�b�������G;�e<�g������������������@�i���{>�I�LD�m���F�n���G�nK�r�HS�wT�w����T�xT�yU�yU�z��IX�|Y�|�������J������[�~[����\�]�]��`��a��c������Ke���KM�s�ǭ�����O�u�Ƭ�ƫ�PD �R �R���{IDATxڅ�3�-M୯g���ڶm�m۶m۸�m�6���l�o��)20Ib�����CBt�o�f�,��0�f�����L0�ŀ�=��:�����ɨ���!���A�U"�>�.@�Y_|��Cbr^�[_��1�K�p5n%�y>�	\�"�~H�_^�'���Սb���T�=��rs���;�D���5bs?`��In���U���-���?~��ݺ�9���a/X��+$��|�׻E�>�����0F��$
j�����>���_��!��~އ�8`=�2���[Rfu��F�A�V�8�~�Z�R��[��B���sy��>��|A��+���g�-���A�X46�c�ɻK��Ç5⣼?� 
�D����I΂�-�3�W�,�6=;n����&��t��$uj$E�����-��(*�>�Q�.��w<�WКv��eF�5}�\b��|?�'�LF�S�m:��b~<�7�šTi�J���ej[7����@-����¿�+p��c@k�A@�
�4D��fˀŗ�*^��MÀ(X'>l��n�7Z7	���Tw`�'�~.=���Ӹ��I����%N��4�{"ҋK���5�=^f�1�y�S�Ñ�T��qIEND�B`�PK�X_���metro_montreal.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Metro_Montreal(BasicNewsRecipe):

    title = u'M\xe9tro Montr\xe9al'
    __author__ = 'Jerry Clapperton'
    description = 'Le quotidien le plus branch\xe9 sur le monde'
    language = 'fr'

    oldest_article = 7
    max_articles_per_feed = 20
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True
    encoding = 'utf-8'
    extra_css = '.headline {font-size: x-large;} \n .fact {padding-top: 10pt}'

    remove_tags = [dict(attrs={'id': 'buttons'})]

    feeds = [
        (u"L'info", u'http://journalmetro.com/linfo/rss'),
        (u'Monde', u'http://journalmetro.com/monde/rss'),
        (u'Culture', u'http://journalmetro.com/culture/rss'),
        (u'Sports', u'http://journalmetro.com/sports/rss'),
        (u'Paroles', u'http://journalmetro.com/paroles/rss')
    ]

    def print_version(self, url):
        return url.replace('article', 'ArticlePrint') + '?language=fr'
PK�X$����metro_news_nl.png�PNG


IHDR��h6RIDATx�c`�6"
�p|�<���U@�I�����R�@K������)����al� mX4x�39k�uV�v���ܾ����O��g]�
n3��0�뷯����ץ�W��ؔ͝�S3u�u�}��û:��A�`�#G��梳w��������5{��}O�8s�~�ӷ�*D�0��5x0��n?s4�:C%�f�i�O��eU`mά�k̤fn^Q�`�a 
Κ
Ѯ���t*����=m�
��)�Nm7�u�p�_Yrٌ�UG�0�h501���������aԭ�d�m�nn�&)�b�k������.ZR�@W�D:�7�,��o)߽tfR{�����=[u���;+����_/��V�U0�U%�q��#E�{�]�����ƥ3����
G�eMn��XΚyQ�ߟ�c-�3��f�ܸ�i�
�m9yh��={Ο�3�,�z�T�ꞿ{
�Y[V���7q����O~��~z ��,���h�Ma,0j�=z��/��|�`҆�RN�ԅ=�����z��}A�un�L�=(�]u�f�H�N��� �	JBȪ��{�_y��IEND�B`�PK�X�ܚ��+�+metro_news_nl.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import print_function
from calibre.web.feeds.news import BasicNewsRecipe
import re
from calibre.utils.magick import Image

''' Version 1.2, updated cover image to match the changed website.
 added info date on title
 version 1.4 Updated tags, delay and added autoclean 22-09-2011
 version 1.5 Changes due to changes in site
 version 1.6 Added css, removed auto cleanup, added buitenland section, added use_embedded_content, added remove_attributes
    Added some processing on pictures
    Removed links in html
    Removed extre white characters
    changed handling of self closing span
 Version 1.7 11-11-2011 Changed oldest_article back to 1.5
    changed è into &egrave;
    updated remove tags
    removed keep_only tags
 Version 1.8 26-11-2022
   added remove tag: article-slideshow
 Version 1.9 31-1-2012
   removed some left debug settings
      extended timeout from 2 to 10
      changed oldest article from 10 to 1.2
      changed max articles from 15 to 25
 Version 1.9.1 18-04-2012
    removed some debug settings
    updated code to match new metro-layout
 Version 1.9.2 24-04-2012
    updated code to match new metro-layout
 Version 1.9.3 25-04-2012
    Changed a lot of custom code into calibre code as the default code of calibre has become much faster since the first version fo this recipe
    Added new feeds
    Updated css
    Changed order of regex to speedup process
 Version 1.9.3 23-05-2012
    Updated Cover image
 Version 1.9.4 19-04-2013
    Added regex filter for mailto
    Updated for new layout of metro-site
 Version 1.9.5 28-05-2013
    Added some extra id's and classes to remove
'''


class AdvancedUserRecipe1306097511(BasicNewsRecipe):
    title = u'Metro Nieuws NL'
    oldest_article = 1.2
    max_articles_per_feed = 25
    __author__ = u'DrMerry'
    description = u'Metro Nederland v1.9.5 2013-05-28, Download nieuws van de Nederlandse editie van de krant Metro'
    language = u'nl'
    simultaneous_downloads = 5
    masthead_url = 'http://blog.metronieuws.nl/wp-content/themes/metro/images/header.gif'
    timeout = 10
    center_navbar = True
    timefmt = ' [%A, %d %b %Y]'
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    cover_url = 'http://www.readmetro.com/en/holland/metro-holland/image/large/last/'
    publication_type = 'newspaper'
    encoding = 'utf-8'
    remove_attributes = ['style', 'font', 'width', 'height',
                         'itemtype', 'itemprop', 'itemscope']  # , 'href']
    use_embedded_content = False
    extra_css = 'body{font-size:1em;padding:5px 0}body,a,h2{background-color:#fff;text-decoration:none;color:#000}#date,div.byline,p.article-image-caption .credits,.calibrenavbar,.calibre5{font-size:.5em}.article-box-fact.module-title,#date,div.byline{clear:both}.article-box-fact{font-size:0.7em}.article-box-fact.module-title{margin:8px 0; font-size:0.8em}h2{font-size:1em}h1.title{font-size:1.4em}h1.title,.article-body p,div.article-image-caption-2column,div.article-image-caption-3column,#date,div.byline{margin-bottom:.6em}div.article-box-fact div.subtitle,.article-box-fact.module-title,h1.title,p.article-image-caption{font-weight:700}div.column-1-3{margin-left:19px}div.column-1-2{display:inline}div.column-1-2,div.column-1-3{margin-right:7px}p.article-image-caption{font-size:.6em;margin-top:5px}p.article-image-caption,#date,div.byline{color:#616262}p.article-image-caption .credits{font-style:italic}div.article-image-caption{width:246px}div.article-image-caption-2column{width:373px}div.column-3{background-color:#eee;float:right;width:50%}div.column-3 module-title{border:1px solid #aaa}div.article-box-fact div.subtitle,.article-box-fact.module-title{color:#24763b}div.byline{border-top:2px solid #24763b}div.column-3,img,div.column-3,p.small,div.article-image-caption{margin:.5em}img,p.small,.column1,h2,.calibre5,.calibrenavbar{border:0;padding:0}.column1,h1,h2,.calibrenavbar{margin:0}'  # noqa

    preprocess_regexps = [
        (re.compile(r'(&nbsp;|\s|<img[^>]+metronieuws\.nl/([^>]+/templates/[^>]+\.jpe?g|internal\-roxen\-unit\.gif)[^>]+>)',
                    re.DOTALL | re.IGNORECASE), lambda match: ' '),
    ]

    remove_tags_before = dict(id='subwrapper')
    remove_tags_after = dict(
        name='div', attrs={'class': ['body-area', 'article-main-area']})
# name='div', attrs={'class':['subwrapper']})]
# 'column-1-3','gallery-text']})]#id='share-and-byline')]

    filter_regexps = [r'mailto:.*']

    remove_tags = [
        dict(name=['iframe', 'script', 'noscript', 'style']),
        dict(name='div', attrs={'class': ['fact-related-box', 'aside clearfix', 'aside clearfix middle-col-line', 'comments', 'share-tools', 'article-right-column', 'column-4-5', 'column-1-5', 'ad-msg', 'col-179 ', 'col-373 ', 'clear', 'ad', 'navigation', re.compile('share-tools(-top)?'), 'tools', 'metroCommentFormWrap', 'article-tools-below-title', 'related-links', 'padding-top-15', re.compile('^promo.*?$'), 'teaser-component', re.compile('fb(-comments|_iframe_widget)'), 'promos', 'header-links', 'promo-2']}),  # noqa
        dict(id=['super-carousel', 'article-2', 'googleads', 'column-1-5-bottom', 'column-4-5', re.compile('^ad(\\d+|adcomp.*?)?$'), 'adadcomp-4', 'margin-5', 'sidebar', re.compile('^article-\\d'), 'comments', 'gallery-1', 'sharez_container', 'ts-container', 'topshares', 'ts-title']),  # noqa
        dict(name='a', attrs={'name': 'comments'}),
        dict(name='img', attrs={'class': 'top-line',
                                'title': 'volledig scherm'}),
        dict(attrs={'style': re.compile('^(.*(display\\s?:\\s?none|img-mask|white)\\s?;?.*)$'), 'title': 'volledig scherm'})]

    '''removed by before/after:
        id:
        column-1-5-top,'hidden_div','footer',
        class:
        'header',re.compile('^footer-[a-zA-Z0-9]+$),'header-links',
        '''

    def preprocess_html(self, soup):
        myProcess = MerryProcess()
        myProcess.moveTitleAndAuthor(soup)
        myProcess.removeUnwantedTags(soup)
        return soup

    def postprocess_html(self, soup, first):
        myProcess = MerryProcess()
        myProcess.optimizeLayout(soup)
        return soup

    feeds = [
        (u'Binnenland', u'http://www.metronieuws.nl/rss.xml?c=1277377288-3'),
        (u'Economie', u'http://www.metronieuws.nl/rss.xml?c=1278070988-0'),
        (u'Den Haag', u'http://www.metronieuws.nl/rss.xml?c=1289013337-3'),
        (u'Rotterdam', u'http://www.metronieuws.nl/rss.xml?c=1289013337-2'),
        (u'Amsterdam', u'http://www.metronieuws.nl/rss.xml?c=1289013337-1'),
        (u'Buitenland', u'http://www.metronieuws.nl/rss.xml?c=1277377288-4'),
        (u'Columns', u'http://www.metronieuws.nl/rss.xml?c=1277377288-17'),
        (u'Entertainment', u'http://www.metronieuws.nl/rss.xml?c=1277377288-2'),
        (u'Strips', u'http://www.metronieuws.nl/rss.xml?c=1325037714-0'),
        (u'Tech', u'http://www.metronieuws.nl/rss.xml?c=1283166782-12'),
        (u'Familie', u'http://www.metronieuws.nl/rss.xml?c=1283166782-9'),
        (u'Blogs', u'http://www.metronieuws.nl/rss.xml?c=1295586825-6'),
        (u'Reizen', u'http://www.metronieuws.nl/rss.xml?c=1277377288-13'),
        (u'Carrière', u'http://www.metronieuws.nl/rss.xml?c=1278070988-1'),
        (u'Wetenschap', u'http://www.metronieuws.nl/rss.xml?c=1303088437-0'),
        (u'Planeet', u'http://www.metronieuws.nl/rss.xml?c=1277377288-14'),
        (u'Gezondheid', u'http://www.metronieuws.nl/rss.xml?c=1277377288-15'),
        (u'Sport', u'http://www.metronieuws.nl/rss.xml?c=1277377288-12')
    ]


class MerryPreProcess():

    def optimizePicture(self, soup):
        for tag in soup.findAll('img', src=True):
            try:
                iurl = tag['src']
                img = Image()
                img.open(iurl)
                img.trim(0)
                img.save(iurl)
            except:
                print('\n!!image optimize failed!!\n')
                continue
        return soup


class MerryExtract():

    def safeRemovePart(self, killingSoup, soupIsArray):
        if killingSoup and killingSoup is not None:
            try:
                if soupIsArray is True:
                    for killer in killingSoup:
                        killer.extract()
                else:
                    killingSoup.extract()
            except:
                return False
        else:
            return False
        return killingSoup


class MerryProcess(object):
    myKiller = MerryExtract()
    myPrepare = MerryPreProcess()

    def optimizeLayout(self, soup):
        self.myPrepare.optimizePicture(soup)
        return soup

    def insertFacts(self, soup):
        thefactpart = re.compile('^article-box-fact.*$')
        allfacts = soup.findAll('div', {'class': thefactpart})
        if allfacts and allfacts is not None:
            allfactsparent = soup.find('div', {'class': thefactpart}).parent
            for part in allfactsparent:
                if part not in allfacts:
                    self.myKiller.safeRemovePart(part, True)
        articlefacts = soup.find('div', {'class': 'article-box-fact column'})
        if (articlefacts and articlefacts is not None):
            try:
                contenttag = soup.find('div', {'class': 'article-body'})
                foundrighttag = False
                if contenttag and contenttag is not None:
                    foundrighttag = True
                if foundrighttag is True:
                    contenttag.insert(0, allfactsparent)
            except:
                pass
        return soup

    def moveTitleAndAuthor(self, soup):
        moveitem = soup.h1
        pubdate = soup.find(id="date")
        if moveitem and moveitem is not None and pubdate and pubdate is not None:
            try:
                pubdate.parent.insert(0, moveitem)
            except:
                print('\n!!error in moving title!!\n')
                pass
        moveitem = None
        moveitem = soup.find('div', {'class': 'byline'})
        if moveitem and moveitem is not None:
            try:
                moveitem.parent.parent.insert(-1, moveitem)
            except:
                print('\n!!error in moving byline!!\n')
                pass
        return soup

    def removeUnwantedTags(self, soup):
        self.insertFacts(soup)
        self.removeEmptyTags(soup)
        # at end to keep author
        self.removeArrayOfTags(soup.findAll(
            attrs={'class': 'share-tools-bottom'}))
        return soup

    def removeArrayOfTags(self, souparray):
        return self.myKiller.safeRemovePart(souparray, True)

    def removeEmptyTags(self, soup, run=0):
        emptymatches = re.compile('^[&nbsp;\\s\n\r\t ]*$')
        emptytags = soup.findAll(lambda tag: tag.find(True) is None and (
            tag.string is None or tag.string.strip() == "" or tag.string.strip() == emptymatches) and not tag.isSelfClosing)
        if emptytags and not (emptytags is None or emptytags == []):
            self.removeArrayOfTags(emptytags)
            # recursive in case removing empty tag creates new empty tag
            self.removeEmptyTags(soup, run=run)
        return soup
PK�X�C_D��metro_uk.png�PNG


IHDR  D���DPLTE���������������������������������� ��!��!��#��(��)��+��+��,��/��2��3��4��=��?��B��E��M��N��V��W��`��c��f��h��i��l��p��q��y��z��}���Ā�ā�Ń�ƅ�dž�Ȋ�ɋ�ʍ�̒�͓�͔�ѝ�Ҡ�ӡ�Ӣ�Ԥ�զ�֧�ת�ت�ت�٭�ٮ�ٯ�ڱ�ݶ���������������������������������������������������������������������IDATx���Sz@�����f�ڶ�����p��
rvp�HF�D�E�	��"�!�N(�`:��n��R,�tJe"B���wЛ�r���E���E�0t�Y���L����˖|"���e��,��n�u�;b�}�nY��E�ey�[h�s)�\R|ZQ3Ne-ȢuE�
5�Tf����*c�٥2�0���̡&F�iF�|s���6jn(�-@���)������0�}wx��FUk�"ۂ8�x���;�B3M�����(�h���C�IEND�B`�PK�XIF�]�	�	metro_uk.recipefrom __future__ import print_function
import re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1390146870(BasicNewsRecipe):
    title = u'Metro UK'
    language = 'en_GB'
    __author__ = 'D Asbury'
    # 20.6.2015 rss using feed 43  - D Asbury
    # item repeatable string = <h3 class="title"><a href="{%}" {*}<span
    # class="colour">{%}</span></a></h3>
    oldest_article = 1
    max_articles_per_feed = 10
    scale_news_images_to_device = True
    compress_news_images = True
    compress_news_images_max_size = 16
    ignore_duplicate_articles = {'title', 'url'}
    masthead_url = 'http://cdn.images.dailyexpress.co.uk/img/page/express_logo.png'
    auto_cleanup = True
    no_stylesheets = True
    cover_url = 'https://lh4.ggpht.com/aaKY88SbQyB-vK-pgjo22-QVi6dUnOt7aVsRueTU8Fg-zPwOdsDdOVElGM8O0BBDSIsuB9rciyc=w300'
    masthead_url = 'http://s1.wp.com/wp-content/themes/vip/metrouk/img/branding/metro_logo_300x95.png?m=1363331170g'

    preprocess_regexps = [
        (re.compile(r'\| Metro News', re.IGNORECASE | re.DOTALL), lambda match: ''),

    ]

    feeds = [
        # 'http://metro.co.uk/news/uk/rss'),
        (u'UK', 'http://feed43.com/5636207287684703.xml'),
        (u'World News', 'http://feed43.com/4555301018714738.xml'),
        (u'Weird', 'http://feed43.com/0483673464615441.xml'),
        (u'Sport', 'http://feed43.com/4655536887165433.xml'),
        (u'Entertainment', 'http://feed43.com/6342124113153248.xml'),
        (u'Lifestyle', 'http://feed43.com/7603240345000555.xml'),
    ]

# starsons code
    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        for feed in feeds:
            for article in feed.articles[:]:
                print('article.title is: ', article.title)
                if 'VIDEO:' in article.title.upper():
                    feed.articles.remove(article)

        return feeds

    extra_css = '''
                    h1{font-weight:bold;font-size:175%;}
                    h2{display: block;margin-left: auto;margin-right: auto;width:125%;font-weight:bold;font-size:150%;}
                    #p{font-size:14px;}
                    #body{font-size:14px;}
                    .figcaption {display: block;margin-left: auto;margin-right: auto;width:100%;font-size:40%;}
                    .alignnone{display: block;margin-left: auto;margin-right: auto;width:100%;font-size:40%;}
                    .publish-info {font-size:50%;}
                    .aligncenter{display: block;margin-left: auto;margin-right: auto;width:100%;}
      '''
PK�X�|vPmetropol_tv.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class metropolRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Metropol TV'
    publisher = u''
    description = 'metropol.cz'
    oldest_article = 1
    max_articles_per_feed = 20
    use_embedded_content = False

    feeds = [
        (u'Metropolcv.cz', u'http://www.metropol.cz/rss/')
    ]

    language = 'cs'
    cover_url = 'http://www.metropol.cz/public/css/../images/logo/metropoltv.png'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                            """

    remove_attributes = []

    keep_only_tags = [dict(name='div', attrs={'id': ['art-full']})]
PK�X�h��00miami_herald.png�PNG


IHDR�a�IDATx�e��eg�;f!N
�mcm۶����ضm۶m���8�{�3���>4M�&I���a��E���$O~��Gy\������CD���0�S�y]I����<zy�^�RuYS?��;!��¿�y�C��KQ�:���7��(Z�� ��_��l�Io�]|�JԸ�[�?
r���T`hd���p̹��K��ZhR�vֽ���A73pɧ�J�}���"��ǰˮwkq'�.�!�xU�V������2�5͊!$p����ʼn���;0��N�B��\fV�'�/�S�����X�ѱID�+�ݶ[���Ѫ��}P����cل��>!)����/6"����M�eL3U�jr�j8$���sP��-�=�z�
�yUC7���*��=���6l5I�L�X|�������s�
�K
>�TgG$M:��C�x��$���kNQŘq�tܑ�Ddn;�G'��2:�WӃ��w��+���i�3�xJ�
ϸ�#���V�c6�̪E��6��V@�P�e�OЅ�D:��?��E�#r �
cB��93�'�CE��}�XkY$:���I�i�EtDsR�#
�
�
���˰���*�P�B�MD�B�����g��s�$70���{gnbÙ�Xu�*6���)-1��lA�}5xL��X�oƊ���7��[���o����~�y��<;�ܡ���4��h�.X|���KV��\��n֪
s6�И����=�֥Y�_�EIEND�B`�PK�X�R��;;miami_herald.recipe
__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
miamiherald.com
'''

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 TheMiamiHerald(BasicNewsRecipe):
    title = 'The Miami Herald'
    __author__ = 'Kovid Goyal'
    description = "Miami-Dade and Broward's source for the latest breaking local news on sports, weather, business, jobs, real estate, shopping, health, travel, entertainment, & more."  # noqa
    oldest_article = 1
    max_articles_per_feed = 100
    publisher = u'The Miami Herald'
    language = 'en'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True
    conversion_options = {
        'comment': description, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        classes('story-body')
    ]
    remove_tags = [
        classes('social-network-macro social-media')
    ]

    feeds = [

    (u'News', u'https://www.miamiherald.com/news/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Miami-Dade', u'https://www.miamiherald.com/news/local/community/miami-dade/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Broward', u'https://www.miamiherald.com/news/local/community/broward/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Florida Keys', u'https://www.miamiherald.com/news/local/community/florida-keys/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Florida', u'https://www.miamiherald.com/news/state/florida/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'National', u'https://www.miamiherald.com/news/nation-world/national/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'World', u'https://www.miamiherald.com/news/nation-world/world/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Americas', u'https://www.miamiherald.com/news/nation-world/world/americas/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Cuba', u'https://www.miamiherald.com/news/nation-world/world/americas/cuba/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Haiti', u'https://www.miamiherald.com/news/nation-world/world/americas/haiti/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Politics', u'https://www.miamiherald.com/news/politics-government/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Education', u'https://www.miamiherald.com/news/local/education/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Environment', u'https://www.miamiherald.com/news/local/environment/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    (u'Sports', u'https://www.miamiherald.com/sports/?widgetName=rssfeed&widgetContentId=712015&getXmlFeed=true'),
    ]

    def get_browser(self, *a, **kw):
        # MyClatchy servers dont like the user-agent header, they hang forever
        # when it is present
        br = BasicNewsRecipe.get_browser(self, *a, **kw)
        br.addheaders = [x for x in br.addheaders if x[0].lower() != 'user-agent']
        return br

    def preprocess_html(self, soup):
        for picture in soup.findAll('picture'):
            img = picture.find('img')
            for i, source in enumerate(picture.findAll('source')):
                if i == 0:
                    img['src'] = source['srcset'].split()[0]
                source.extract()
        return soup
PK�X,.���michalkiewicz.png�PNG


IHDR(-S�PLTE����ڸ�”��z��u��r��e�|V�~U�{Y�gC�;"M7,I

����|�٧�z��r�ַ��s�g�c�_چ^́O��Y�{W�˕����ǧ����qN�fE�R3�X+�I0�C���LKR}Y7n<%h,���H(���9	���誈��������V�\�W�Qݗn�˩ۆUʊZ����p��}��c���ҩ��wS�{g����aPĞ��qC�����ś}�l`����œ�eC�d:��DZX(�Z:�X+�Ō��՜M$�I0�M+�o����/pno[^f�f���{K9M#cF��|��t�r��o��l39==3-3*50) +4:-()�l !����������s���\����zM��ݵtRNS@��f�IDATx^%�Ӛ#A@���۶3�m۶w_}��\BȬWלӧ\�1*�n����;ݥ{�N&|!w���x�0��2��E�ByDN`h�0�O�q�Dn�Z��S���,�_M2�c��V�TH�I����S���qtU��Ԝ�)��p&TH����fp��.�*+J36�V a {&c\�����mZm��Ƹ^�ҋ�@����
�/�̷�a�ALh��8w��Əa�A<�ꛪ�G�����(��#m�IEND�B`�PK�X��?���michalkiewicz.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2010, Tomasz Dlugosz <tomek3d@gmail.com>'
'''
michalkiewicz.pl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class michalkiewicz(BasicNewsRecipe):
    title = u'Stanis\u0142aw Michalkiewicz'
    description = u'Strona autorska * felietony * artyku\u0142y * komentarze'
    __author__ = u'Tomasz D\u0142ugosz'
    language = 'pl'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True

    keep_only_tags = [dict(name='div', attrs={'class': 'modul_srodek'})]
    remove_tags = [dict(name='ul', attrs={'class': 'menu'})]

    feeds = [(u'Teksty', u'http://www.michalkiewicz.pl/rss.xml')]
PK�XK�7�!!michellemalkin.png�PNG


IHDR��h6�IDATx�c�O4���ӳg�@�V�<�x�"�рJb�s`d�����_�t.�����Ǐm;�_�v��^��b��+`Մ5�|�l�g/\�	k�y���ل5�ް��%`��5���#�a�ʵN�M}?�r	hX�|��c@uۄ߿�4�\���%�u��?�"K��e!#��O��V��Z��n4
h$÷/��ݾQAXCCY�4����I�ʚKp޳IEND�B`�PK�X������michellemalkin.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Walt Anthony <workshop.northpole at gmail.com>'
'''
www.michellemalkin.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class MichelleMalkin(BasicNewsRecipe):
    title = u'Michelle Malkin'
    description = "Michelle Malkin's take on events, a mother, wife, blogger, conservative syndicated columnist, author, and Fox News Channel contributor."
    __author__ = 'Walt Anthony'
    publisher = 'Michelle Malkin LLC'
    category = 'news, politics, USA'
    oldest_article = 7  # days
    max_articles_per_feed = 50
    summary_length = 150
    language = 'en'

    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True
    use_embedded_content = False

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    feeds = [(u'http://feeds.feedburner.com/michellemalkin/posts')]

    def print_version(self, url):
        return url + '?print=1'
PK�X�.R�FFmiesbacher_merkur.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�XN�3miesbacher_merkur.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Miesbacher Merkur'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Region Miesbach', u'http://www.merkur-online.de/lokales/region-miesbach/rssfeed.rdf'),
    (u'Miesbach', u'http://www.merkur-online.de/lokales/region-miesbach/miesbach/rssfeed.rdf'),
    (u'Schliersee', u'http://www.merkur-online.de/lokales/region-miesbach/schliersee/rssfeed.rdf'),
    (u'Bayrischzell', u'http://www.merkur-online.de/lokales/region-miesbach/bayrischzell/rssfeed.rdf'),
    (u'Irschenberg', u'http://www.merkur-online.de/lokales/region-miesbach/irschenberg/rssfeed.rdf'),
    (u'Hausham', u'http://www.merkur-online.de/lokales/region-miesbach/hausham/rssfeed.rdf'),
    (u'Fischbachau', u'http://www.merkur-online.de/lokales/region-miesbach/fischbachau/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X*��WWmilitary_times.png�PNG


IHDR  ��IDATx�b0�1����Z`Ju����� ��dݽ���7-�$zu����g^{�\[���9!�0莡���?��8�XDRx��$��V�.�i�[�?����jpH��ޚ=�z��ȅ�;S|��u-f�Z��U+�Oժ
Bb��í�G�
?A��b��'(�X՞�A�xg�`�Ĕ�Ӝ
Z���U�'d6��t�^H>$NT6N�"�eF�YRl���1M��䀁C���؀7; ��\-�@��w�X�j-��No���l>�҆��V.W�K5wV1{����-�lҴ��.��}�Vw�"uz�£���	XW|6Ml͝cL��[Z�V쮑+�8)i��7{V����h$��}���W����Q�����Ծ�r���72��f�b��Vo��yRR��W�7�5g����=����+��������~z[!8Wb4��2��r:�q_��\�Z�s6��fT�iHB"��j��� �{@�/^�������mݺy��s��9z�pee�����*�T$��"@��g�Ɍ��瑦B,��

%���J�OHA��R*���D���=����78n_wι��3>�RE�;>�,��4I(�j���R1�bȗ�߰�������3w�V�P("��r���n��)���#�N�4���xބ
L&3�}A&�r��6������j��n}}S�H��������q�D"q�ݗ�%A���j���������Z���x���h4��v���x8z�^� XV��|��Ei~��z�&	�ÁV��60���v�^�W����N�S�T�H@�f¿X�=�����x�f�!�k��B�(��P(���b�L&����l>�o�Z��(�J1�	�|>�(�AԍF�F!P�T��2ZI&���f6�az�Tj2��z
10�U��}b8z�kw:�V���8�X,f���ra����hD�<��A�����0�$�E)�J�x~O��P/P&�!矺p��}?� �b
\���]'�Z0j.�<�"IEND�B`�PK�X�~��military_times.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class MilitaryTimes(BasicNewsRecipe):
    title = 'Military Times'
    __author__ = 'jde'
    __date__ = '16 May 2012'
    __version__ = '1.0'
    description = 'News of the U.S. Military'
    language = 'en'
    publisher = 'MilitaryTimes.com'
    category = 'news, U.S. Military'
    tags = 'news, U.S. Military'
    cover_url = 'http://www.militarytimes.com/images/logo_militarytimes_landing-s.gif'
    masthead_url = 'http://www.militarytimes.com/images/logo_militarytimes_landing-s.gif'
    oldest_article = 7  # days
    max_articles_per_feed = 25
    publication_type = 'newspaper'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = True

    feeds = [

        ('News',   'http://www.militarytimes.com/rss_news.php'),
        ('Benefits',   'http://www.militarytimes.com/rss_benefits.php'),
        ('Money',   'http://www.militarytimes.com/rss_money.php'),
        ('Careers & Education',  'http://www.militarytimes.com/rss_careers.php'),
        ('Community',  'http://www.militarytimes.com/rss_community.php'),
        ('Off Duty',   'http://www.militarytimes.com/rss_off_duty.php'),
        ('Entertainment',  'http://www.militarytimes.com/rss_entertainment.php'),
        ('Guard & Reserve',  'http://www.militarytimes.com/rss_guard.php'),

    ]
PK�Xs��ǫ�mit_technology_review.png�PNG


IHDR(-SPLTE���GpL����������������Հ�����k�XtRNS�PMɮ�u�=6IDAT��ȱ
 A��/�M��a*�	�X��`(XWh��{|���>,�IEND�B`�PK�X�t���mit_technology_review.recipe#!/usr/bin/env python
from __future__ import unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2015 Michael Marotta <mikefm at gmail.net>'
# Written April 2015
# Last edited 08/2022
'''
technologyreview.com
'''
from calibre.web.feeds.news import BasicNewsRecipe, prefixed_classes
from collections import OrderedDict
import re

def absurl(x):
    if x.startswith('//'):
        x = 'http:' + x
    elif not x.startswith('http'):
        x = "http://www.technologyreview.com" + x
    return x


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(
        attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)}
    )


class MitTechnologyReview(BasicNewsRecipe):

    title = 'MIT Technology Review Magazine'
    __author__ = 'Michael Marotta, revised by unkn0wn'
    description = (
        'Bi-monthly magazine version of MIT Technology Review.'
        ' This is different than the recipe named simply "Technology Review"'
        ' which downloads the rss feed with daily articles from the website.'
    )
    INDEX = 'http://www.technologyreview.com/magazine/'
    language = 'en'
    encoding = 'utf-8'
    tags = 'news, technology, science'
    no_stylesheets = True
    remove_empty_feeds = True
    remove_attributes = ['height', 'width', 'style', 'padding', 'padding-top']
    delay = 1
    masthead_url = 'https://wp-preprod.technologyreview.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-20-at-11.11.12-AM-e1629473232355.png'
    extra_css = '''
        #pub-d{font-size:small;}
        #cre-d{font-size:xx-small; text-align:center; color:gray;}
        #cap-d{font-size:small; text-align:center;}
        blockquote{text-align:center; color:#404040;}
        em { color:#202020;}
    '''
    keep_only_tags = [
        prefixed_classes('contentHeader contentArticleHeader contentBody')
    ]
    remove_tags = [
        dict(name="aside"),
        dict(name="svg"),
        prefixed_classes(
            'image__placeholder sliderAd__wrapper eyebrow__wrap-- screen-reader-text'
        ),
    ]

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.technologyreview.com/')
        if script := soup.find('script', id='preload'):
            link = re.search('(https\S+?front_cover\S+?(jpg|png))', self.tag_to_string(script))
            return link.group(1) + '?fit=572,786'

    def parse_index(self):
        soup = self.index_to_soup(self.INDEX)
        issue = soup.find(attrs={'class':lambda x: x and x.startswith('magazineHero__title')})
        time = soup.find(attrs={'class': lambda x: x and x.startswith('magazineHero__date')})
        self.title = 'MIT Tech Review ' + self.tag_to_string(issue)
        self.timefmt = ' [' + self.tag_to_string(time) + ']'
        self.log('Downloading issue: ', self.timefmt)

        # parse articles
        feeds = OrderedDict()

        classNamePrefixes = [
            "magazineHero__letter--", "teaserItem__title", "teaserItem--aside__title"
        ]
        for div in soup.findAll(
            attrs={
                'class':
                lambda x: any(x.startswith(prefix) for prefix in classNamePrefixes)
                if x else False
            }
        ):
            articles = []
            a = div.find('a', href=True)
            title = self.tag_to_string(a).strip()
            href = absurl(a['href'])
            desc = ''
            section_title = 'Letter from the editor'
            d = div.findParent(
                attrs={
                    'class':
                    lambda z: z and z.
                    startswith(('teaserItem__wrapper', 'teaserItem--aside__wrapper'))
                }
            )
            if d:

                excerpt = d.find(
                        attrs={
                            'class':
                            lambda x: x and x.startswith(
                                ('teaserItem__excerpt', 'teaserItem--aside__excerpt')
                            )
                        }
                    )
                if excerpt:
                    desc = self.tag_to_string(excerpt).strip()

                sec = d.find(
                    attrs={
                        'class': lambda x: x and x.startswith('teaserItem__eyebrowText')
                    }
                )
                if sec:
                    section_title = self.tag_to_string(sec).replace('Categorized in ',
                                                            '').strip()

            if not href or not title:
                continue

            self.log(section_title)
            self.log('\t', title)
            self.log('\t', desc)
            self.log('\t\t', href)

            articles.append({'title': title, 'url': href, 'description': desc})
            if articles:
                if section_title not in feeds:
                    feeds[section_title] = []
                feeds[section_title] += articles
        ans = [(key, val) for key, val in feeds.items()]
        return ans

    def preprocess_html(self, soup):
        for bq in soup.findAll('blockquote'):
            for strong in bq.findAll('strong'):
                strong.name = 'div'
        for date in soup.findAll(
            attrs={
                'class':
                lambda x: x and x.
                startswith(('contentArticleHeader__publishDate', 'byline__wrapper'))
            }
        ):
            date['id'] = 'pub-d'
            for li in date.findAll(('li', 'ul')):
                li.name = 'span'
        for cap in soup.findAll('figcaption'):
            cap['id'] = 'cap-d'
        for credit in soup.findAll(
            attrs={
                'class':
                lambda x: x and x.startswith(('image__credit', 'image-credit'))
            }
        ):
            credit['id'] = 'cre-d'
        for img in soup.findAll(srcset=True):
            img['src'] = absurl(img['srcset'].split()[0])
            del img['srcset']
        for img in soup.findAll('img', attrs={'src': True}):
            img['src'] = img['src'].split('?')[0] + '?w=800'
        return soup
PK�X�!Y_��mlody_technik_pl.png�PNG


IHDR��h6�IDATx���NSa����yOi�"]D\I�Q/@/Gc��Ѱ�```Q��p0j�Na�A�2 I���p���	L,&|�R�t��*�$�f�Gvx�b��8O��I�MM����l�����oTb�A�s��x~�^��02z��?Q)�{l4��Yo���E��Yw��LL�wa��^�ţ�'����\�{G�F��m����d��J��4tp�E����
(nܴ�˵v�=�p�  ��/�}~�"��O��N&�V<>N?~�ـ��c�+�6y%����\;;����Ȳ�e���ݫ�����I&�Z�
I�\���8#�)�v20@�L$��$Af���.H�O�����X���׾��=mnRUU�
�9�
TB1<�!��DQf��U��Ԇ�W�����mw7q��N�G3$y�s!~A���3�VCdIEND�B`�PK�X��p���mlody_technik_pl.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
import re
from calibre.web.feeds.news import BasicNewsRecipe


class Mlody_technik(BasicNewsRecipe):
    title = u'Młody technik'
    __author__ = 'fenuks'
    description = u'Młody technik'
    category = 'science'
    language = 'pl'
    no_stylesheets = True
    extra_css = 'img.alignleft {float: left; margin-right: 5px;}'
    preprocess_regexps = [
        (re.compile(r"<h4>Podobne</h4>", re.IGNORECASE), lambda m: '')]
    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    use_embedded_content = False
    keep_only_tags = [dict(id='content')]
    remove_tags = [dict(attrs={'class': 'st-related-posts'})]
    remove_tags_after = dict(attrs={'class': 'entry-content clearfix'})
    feeds = [(u'Wszystko', u'http://www.mt.com.pl/feed'),
             # (u'MT NEWS 24/7', u'http://www.mt.com.pl/kategoria/mt-newsy-24-7/feed'),
             (u'Info zoom', u'http://www.mt.com.pl/kategoria/info-zoom/feed'),
             (u'm.technik', u'http://www.mt.com.pl/kategoria/m-technik/feed'),
             (u'Szkoła', u'http://www.mt.com.pl/kategoria/szkola-2/feed'),
             (u'Na Warsztacie', u'http://www.mt.com.pl/kategoria/na-warsztacie/feed'),
             (u'Z pasji do...', u'http://www.mt.com.pl/kategoria/z-pasji-do/feed'),
             (u'MT testuje', u'http://www.mt.com.pl/kategoria/mt-testuje/feed')]

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.mt.com.pl/')
        tag = soup.find(attrs={'class': 'xoxo'})
        if tag:
            self.cover_url = tag.find('img')['src']
        return getattr(self, 'cover_url', self.cover_url)
PK�X��D6

mmc_rtv.png�PNG


IHDR  D���1PLTE�����nj�Ȏ������ȃ����ʗ��������������89B&%/yxv����������������]h�__a`^]`l�bo�er����($&���('1���)&+��ȑ�ˡ�Ӣ����ӣ�������NVj���������������������������������ONO���QYl���][Z==B�����V`u�����������������摙����WUTW\g>DR���JP`MLN���������������MUg %.0947C��������������ߞ����������É�Ó����̓�˖��:>L<@N������OML��������������������{{{|~~=::��ٮ�ٯ�ְ��+)-�����������QZmTW`���|��hhl���kjhkq}
��������؇�����ű�Ƶ�ܶ�ܶ�������T^r���U`t��Š�����
���������������lki��ת�׬��nlk�����������o~�p~����������u��v{����v��������w��"ڒ�IDATxڅ���@��y��X�6۵m�6��m��֯;��"�z��
�S�_s�~<n[�?\��hD��)d][�b
7�L�b!�Cb����;�w|�M���sv��/w�.�o��z�p�ܙӖ��ט�5@���}��+N���E�c~�m�"G��
��&�}��L��{p(���+Ǭ�.��X =��,+�
��| 	�׷��n��z���� � 1f�$�:�F����ٌW��2��@ޞOO��LA9�t��
~u(v7(߼5����טtCޙ>rH��{_��kMA����h:�E�߉'Ł�^9^�>��x#�������/� 8���ps ]Ivq���iH��7H�c�&�����)�?��>Ȁ��$�`%t��(�l`�<1IEND�B`�PK�XvY��mmc_rtv.recipe#!/usr/bin/env python
# News source: https://www.rtvslo.si
# License: GPLv3
# Copyright: 2022, TadejS


from calibre.web.feeds.news import BasicNewsRecipe


class MMCRTV(BasicNewsRecipe):
    title = u'MMC RTV Slovenija'
    __author__ = u'TadejS'
    description = u"Prvi interaktivni multimedijski portal, MMC RTV Slovenija"
    oldest_article = 3
    max_articles_per_feed = 100
    language = 'sl'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    publication_type = 'newspaper'

    cover_url = 'https://img.rtvslo.si/_static/novi/logo/tvmmc-light-bg.png'

    keep_only_tags = [
        dict(name='header', attrs={'class': 'article-header'}),
        dict(name='div', attrs={'class': 'article-body'}),
    ]
    remove_tags=[
        dict(name='div', attrs={'class':'gallery-grid'}),
        dict(name='div', attrs={'class':'gallery'}),
        dict(name='div', attrs={'class':'exposed-article'}),
        dict(name='div', attrs={'class':'d-lg-none'}),
        dict(name='div', attrs={'class':'section-heading'}),
    ]

    feeds = [
        (u'Slovenija', u'https://www.rtvslo.si/feeds/01.xml'),
        (u'Evropska unija', u'https://www.rtvslo.si/feeds/16.xml'),
        (u'Svet', u'https://www.rtvslo.si/feeds/02.xml'),
        (u'Gospodarstvo', u'https://www.rtvslo.si/feeds/04.xml'),
        (u'Okolje', u'https://www.rtvslo.si/feeds/12.xml'),
        (u'Znanost in tehnologija', u'https://www.rtvslo.si/feeds/09.xml'),
        (u'Kultura', u'https://www.rtvslo.si/feeds/05.xml'),
        (u'Šport', u'https://www.rtvslo.si/feeds/03.xml'),
        (u'Zabava', u'https://www.rtvslo.si/feeds/06.xml'),
        (u'Ture avanture', u'https://www.rtvslo.si/feeds/28.xml'),
        (u'Črna kronika', u'https://www.rtvslo.si/feeds/08.xml'),
    ]
PK�X�U�RRmobilenations.png�PNG


IHDR  szz�IDATx��1N�0��hv��9��4�O]*f��B���^���K*}$���[^[��7ץ�q1���o[m}�,�-Z�=1�Qsx��!�c��
:�f@5n@�^4z38�A��O&0�=�ѝ��Ku�����{�7C(�g���1@��r�K���m�0�b䨡vTWh
Q�޶��(�#�.]��A��\��b��#�b�/�r�6X��Q���=1r�D4i(!�V�~ž��^���[��O��3�%?��_Fٯ����M8
L���mquP�UIEND�B`�PK�X�׽��mobilenations.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HindustanTimes(BasicNewsRecipe):
    title = u'Mobile Nations'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('News',
         'http://www.mobilenations.com/about?format=RSS'),
    ]
PK�X�!��]]modoros.png�PNG


IHDR�a$IDATxڜ�Da��@(#j5H	`A!ΔQ�%b24@$�
j���h�Z�j�������A���x��r.�j����p�)�BIKz�Z,7�;�W�<�o+�c%�{y�g�
�O��o+�i���Ek)Cca���F��Ʒv�X��K��iw�.���"9���Y���Ž�F���4���=V�V)��l���)�����J��]�q1C�y�o+lh����|.��|[aM�kk���*�حV����(Ws��D�v�
َ"��dgT��)��1�`8B6IEND�B`�PK�XٹK��modoros.recipeimport re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.constants import config_dir, CONFIG_DIR_MODE
import os
import os.path
try:
    from urllib.parse import quote
except ImportError:
    from urllib import quote
from hashlib import md5


class ModorosBlogHu(BasicNewsRecipe):
    __author__ = 'Zsolt Botykai'
    title = u'Modoros Blog'
    description = u"Modoros.blog.hu"
    oldest_article = 10000
    max_articles_per_feed = 10000
    reverse_article_order = True
    language = 'hu'
    remove_javascript = True
    remove_empty_feeds = True
    no_stylesheets = True
    feeds = [(u'Modoros Blog', u'http://modoros.blog.hu/rss')]
    remove_javascript = True
    use_embedded_content = False
    preprocess_regexps = [
        (re.compile(r'<!--megosztas -->.*?</body>', re.DOTALL | re.IGNORECASE),
         lambda match: '</body>'),
        (re.compile(r'<p align="left"'), lambda m: '<p'),
        (re.compile(r'<noscript.+?noscript>', re.DOTALL | re.IGNORECASE), lambda m: ''),
        (re.compile(r'<img style="position: absolute;top:-10px.+?>',
                    re.DOTALL | re.IGNORECASE), lambda m: ''),
        (re.compile(r'<p>( |&nbsp;)*?</p>', re.DOTALL | re.IGNORECASE), lambda match: ''),
    ]
    extra_css = '''
                    body { background-color: white; color: black }
                '''

    remove_tags = [
        dict(name='div', attrs={'id': ['csucs']}),
        dict(name='img', attrs={
             'style': ['position: absolute;top:-10px;left:-10px;']}),
        dict(name='div', attrs={'class': ['tovabb-is-van',
                                          'page-break',
                                          'clear']}),
        dict(name='span', attrs={'class': ['hozzaszolas-szamlalo']})
    ]

    masthead_url = 'http://modoros.blog.hu/media/skins/modoros-neon/img/modorosblog-felirat.png'

    def get_cover_url(self):
        return 'http://modoros.blog.hu/media/skins/modoros-neon/img/modorosblog-felirat.png'

    # As seen here:
    # http://www.mobileread.com/forums/showpost.php?p=1295505&postcount=10
    def parse_feeds(self):
        recipe_dir = os.path.join(config_dir, 'recipes')
        hash_dir = os.path.join(recipe_dir, 'recipe_storage')
        feed_dir = os.path.join(
            hash_dir, self.title.encode('utf-8').replace('/', ':'))
        if not os.path.isdir(feed_dir):
            os.makedirs(feed_dir, mode=CONFIG_DIR_MODE)

        feeds = BasicNewsRecipe.parse_feeds(self)

        for feed in feeds:
            feed_hash = quote(feed.title.encode('utf-8'), safe='')
            feed_fn = os.path.join(feed_dir, feed_hash)

            past_items = set()
            if os.path.exists(feed_fn):
                with open(feed_fn) as f:
                    for h in f:
                        past_items.add(h.strip())

            cur_items = set()
            for article in feed.articles[:]:
                item_hash = md5()
                if article.content:
                    item_hash.update(article.content.encode('utf-8'))
                if article.summary:
                    item_hash.update(article.summary.encode('utf-8'))
                item_hash = item_hash.hexdigest()
                if article.url:
                    item_hash = article.url + ':' + item_hash
                cur_items.add(item_hash)
                if item_hash in past_items:
                    feed.articles.remove(article)
            with open(feed_fn, 'w') as f:
                for h in cur_items:
                    f.write(h + '\n')

        remove = [fl for fl in feeds if len(fl) == 0 and
                  self.remove_empty_feeds]
        for f in remove:
            feeds.remove(f)

        return feeds
PK�X�d}L��moldovaazi.png�PNG


IHDR(-S<PLTE2�B�$N�4^�Dj�Tv�d��t�̌�̜�Ԭ�ܼ�������������4�v<�bR1�tRNS@��fcIDATx�<�[�0D���Kb��W
������lsߑA�!6{�����`��h����#e��.A�8�RRAw((f�����3tk���tL�ax&
`o���IEND�B`�PK�X�<����moldovaazi.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
azi.md
'''

from calibre.web.feeds.news import BasicNewsRecipe


class MoldovaAzi(BasicNewsRecipe):
    title = u'Moldova Azi'
    language = 'ro'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Moldova pe internet'
    publisher = 'Moldova Azi'
    category = 'Ziare,Stiri,Moldova'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True
    cover_url = 'http://www.azi.md/images/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [dict(name='div', attrs={'id': 'in'})
                      ]

    remove_tags = [
        dict(name='div', attrs={'class': 'in-more-stories'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': 'comment_wrapper'}), dict(
            name='div', attrs={'class': 'box-title4'})
    ]

    feeds = [(u'\u0218tiri', u'http://www.azi.md/ro/feeds/0/rss201')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X����monbiot.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿tIME�/
}��7�IDATHǵ�?kQ��a�|��D���B0Ȋ�&�FqE�$�؉��baie4���M,%`%�`i#I�BXATD���b��1;zns�{�>3sf8o�eY�����o�aNE)k�.S:�)]ͻwv��(e*�D%3WP��Ѻ?�3S0�-���.\6�j�����I�W^	��	o�~�	ea���c�B5�
�)�^��mPN�&uK���/�M�&��|��
��-��'��7�K��6m�������!�N�+x ��:F�q�R�
�����B�:.8	���	��^�w�=���|�q�RvW�uՀe0#���J��B�L�Ya{>`ЁV~C��s��=kj��Ч����ڸ�B��I{��gi-&e�R�^�j�q�t(<TkE�zac)jm��5��u�{���h�1f�%tEXtdate:create2023-06-19T20:44:07+00:00o,�%tEXtdate:modify2023-06-19T20:44:07+00:00C�[IEND�B`�PK�X���(SSmonbiot.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.monbiot.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class GeorgeMonbiot(BasicNewsRecipe):
    title = 'George Monbiot - blog'
    __author__ = 'Darko Miletic'
    description = 'Tell people something they know already and they will thank you for it. Tell people something new and they will hate you for it.'
    publisher = 'George Monbiot'
    category = 'news, politics, UK, World'
    oldest_article = 15
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en_GB'
    remove_empty_feeds = True
    publication_type = 'blog'
    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
    }

    remove_tags = [
        dict(name=['meta', 'link']),
        dict(attrs={'class': 'shareinpost'}),
        dict(attrs={'id': 'paging'})
    ]
    remove_attributes = ['lang']
    keep_only_tags = [dict(attrs={'id': 'content'})]

    feeds = [(u'Articles', u'http://www.monbiot.com/feed/atom/')]
PK�X`Q��uumondedurable.png�PNG


IHDR  D����PLTE� "���� ��!��de��������������&(ퟠ�[\읞��#%����[]�:<�/1�����WY鋌�)+�46�DF�>@�hj�!#�����bc���뚛�68臈�}~�SU�*,�+-�����떗鎏�rs�MO�%'�����-/�9;����{|�z{���炃� ��_a�')�.0����no�xy�Z\��57�焅�stꐑ����`b윝�IK뗘烄����wx�KL�lm�ef잟�EF�vw�KM�\^�FH������舉�������RT�;=ﮯ����+,���煆����������PR�����jk�gi������EG�MN��mn�UW���瀁�ce�����RS���﫬鍎�?@����YZ��������\]�op�JL�vx�����똙�tu�錍�|~�CE�uv�����02�����ꑑ焆�:;�����kl�@A艊�^`�����烅����GH�"$꒓�������ac�HJ艋﫫��vw�OP�np�^_ꔕꑒ�HI�������qr����IJ�01�OQ�?A������yz�mo��ST����VW�������$&���@B�����BD����{|�{}�|}瀂�jl���()�GI�qs�y{�pq鐑�fg�>?�_`����]_�NP�Y[�35�AB�Җ�ZIDATx�̑���L���&׶m۶m��m۶m۶m�nߠ�\>B����9�S�8)��x j�'R�Ho�a�NF̕4��ĦT���J|�Z�6ƣ`bʙ�>��q�����WK��1n
�U�јh+6�Dd���ChY;2���������Mb��u�����{zy�:_��#��:�2�ANX�XR.d�.K��F�ބ��B?v
�r������Lv��'$��W�U����Nb<R�B���N��ƔX�Y�u�Lꁞ�J��P��M�#&H��H�%�$��I��iÁ�#yz`dƘ����-6��I:��)S�eyYMO����r60[n�+s���)�s�Ffn�]�"X�k�(u	P�,hy^v|�.V�\��	�-څ@�=+X�~C����bMx��ڦO Xnn�RR�=y�N���n5!a��2R����9�>r���q"]�<��xI�yE���3)>�g��9�g*�//]�/r��+WS]��so_��/I7n��n��.��s��\V�xxPEL%6��cF]ړ���nϞk�(����H�2~�.�}T�Oͧ\��T��i��€k�d���ƈH��c4��yDa�fIEND�B`�PK�X�����mondedurable.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
mondedurable.science-et-vie.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class AdventureGamers(BasicNewsRecipe):
    title = 'Monde durable'
    language = 'fr'

    __author__ = 'Darko Miletic'
    description = 'science news'
    publisher = 'Monde durable'
    category = 'environnement, developpement durable, science & vie, science et vie'
    oldest_article = 30
    delay = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    auto_cleanup = True
    encoding = 'utf-8'
    remove_javascript = True
    use_embedded_content = False

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    feeds = [(u'Articles', u'http://mondedurable.science-et-vie.com/comments/feed/')]

    def preprocess_html(self, soup):
        mtag = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'
        soup.head.insert(0, mtag)
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X��ss
monden.png�PNG


IHDR��h6:IDATxڕ��k�@��o��#�""bj�jL�0*Jddd�:��F��<&F�S���ab����&ƣb��n/��B��r��^^r'̯ك^��ʾ�$�&~zD@�)sDc�'� ��ʓ␀��� �y�F����@�GӬ�W���s����n7��S �H:!K�˦0_ڬ4F<�*�[{q�@�ƒ%�ӑ�dYiT���2l`����2Q��*�4o�;M��ݼ�,�yK3���x$�-��d��Z�bNP�Zz]�)TTI�K�F��2�*yt���>�h��U��@�:�
bX�����5���>8�F�cIEND�B`�PK�X�xKTf	f	
monden.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
monden.info
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Monden(BasicNewsRecipe):
    title = u'Monden'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Arti\u015fti, interviuri, concerte.. MUZIC\u0102'
    publisher = u'Monden'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Muzica'
    encoding = 'utf-8'
    cover_url = 'http://www.monden.info/wp-content/uploads/2009/04/mondeninfo-logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'id': 'content'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['postAuthor']}), dict(
            name='div', attrs={'class': ['postLike']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['postLike']})
    ]

    feeds = [
        (u'Feeds', u'http://www.monden.info/feed/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XR'�|rrmoney_pl.png�PNG


IHDR�a9IDATx�̐�fQ��fڴ�6�v��J��M��m�N�8�o۶y~�������;߽7n�Y�k��aO��*�1-#�N��h���x<U*6ͷ����?�d��7B&b�^�.8Q3{Ç�4�ɤ~���^U��]������/�=�v��Ǡ��Ӧ�����+Y32�%����GĤ�u-XFt�̰��� �
��D�C˃��JR���FP:���Pv����`��R6�/+h��R��L�JN�ol�f\��rU>'�R�%�?~�:~'��r�o��{
f^�y���T��IEND�B`�PK�X؜�2�
�
money_pl.recipeimport re

from calibre.web.feeds.news import BasicNewsRecipe


class FocusRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = u'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'
    version = 1

    title = u'Money.pl'
    category = u'News'
    description = u'Informacje finansowe z kraju i ze świata. Aktualne i archiwalne: notowania giełdowe, kursy walut, wskaźniki gospodarcze.'
    remove_empty_feeds = True
    no_stylesheets = True
    oldest_article = 1
    max_articles_per_feed = 100000
    recursions = 0

    no_stylesheets = True
    remove_javascript = True

    simultaneous_downloads = 2

    r = re.compile(
        r'.*(?P<url>http:\/\/(www.money.pl)|(rss.feedsportal.com\/c)\/.*\.html?).*')
    keep_only_tags = []
    keep_only_tags.append(dict(name='div', attrs={'class': 'artykul'}))
    remove_tags = [dict(name='ul', attrs={'class': 'socialStuff'})]

    extra_css = '''
                    body {font-family: Arial,Helvetica,sans-serif ;}
                    h1{text-align: left;}
                    h2{font-size: medium; font-weight: bold;}
                    p.lead {font-weight: bold; text-align: left;}
                    .authordate {font-size: small; color: #696969;}
                    .fot{font-size: x-small; color: #666666;}
                    '''

    feeds = [
        ('Wiadomosci z kraju', 'http://money.pl.feedsportal.com/c/33900/f/612847/index.rss'),
        ('Wiadomosci ze swiata',
         'http://money.pl.feedsportal.com/c/33900/f/612848/index.rss'),
        ('Gospodarka', 'http://money.pl.feedsportal.com/c/33900/f/612849/index.rss'),
        ('Waluty', 'http://money.pl.feedsportal.com/c/33900/f/612850/index.rss'),
        ('Gielda', 'http://money.pl.feedsportal.com/c/33900/f/612851/index.rss'),
        ('Banki', 'http://money.pl.feedsportal.com/c/33900/f/612852/index.rss'),
        ('Fundusze', 'http://money.pl.feedsportal.com/c/33900/f/612853/index.rss'),
        ('Emerytury', 'http://money.pl.feedsportal.com/c/33900/f/612854/index.rss'),
        ('Podatki', 'http://money.pl.feedsportal.com/c/33900/f/612855/index.rss'),
        ('Ubezpieczenia',
         'http://money.pl.feedsportal.com/c/33900/f/612856/index.rss'),
        ('Poradniki', 'http://money.pl.feedsportal.com/c/33900/f/612857/index.rss'),
        ('Raporty', 'http://money.pl.feedsportal.com/c/33900/f/612858/index.rss'),
        ('Motoryzacja', 'http://money.pl.feedsportal.com/c/33900/f/612859/index.rss'),
        ('Manager', 'http://money.pl.feedsportal.com/c/33900/f/612860/index.rss'),
        ('Dla firm', 'http://money.pl.feedsportal.com/c/33900/f/612861/index.rss'),
        ('Prawo', 'http://money.pl.feedsportal.com/c/33900/f/612862/index.rss'),
        ('Nieruchomosci',
         'http://money.pl.feedsportal.com/c/33900/f/612863/index.rss'),
        ('Praca', 'http://money.pl.feedsportal.com/c/33900/f/612864/index.rss'),


    ]

    def print_version(self, url):
        if url.count('money.pl.feedsportal.com'):
            u = url.find('0Cartykul0C')
            u = 'http://www.m.money.pl/wiadomosci/artykul/' + url[u + 21:]
            u = u.replace('0C', '/')
            u = u.replace('A', '')
            u = u.replace('0E', '-')
            u = u.replace('0P', ';')
            u = u.replace('0H', ',')
            u = u.replace('0B', '.')
            u = u.replace(',0,', ',-1,')
            u = u.replace(
                '0Tutm0Isource0Frss0Gutm0Imedium0Frss0Gutm0Icampaign0Frss/story01.htm', '')
        else:
            u = url.replace('/nc/1', '/do-druku/1')
        return u
PK�Xt�����moneycontrol.png�PNG


IHDR  ��tRNSn��]IDATx^��[�\G��o�S�g��_fl9���#���J@8"�A��Vx⁛@��`xD�%H\_x@��� "P�(�pG<�E�3���g��O���Ӛ�L+��J�V���:[�:�J������n&���Gj�QP��`�5����U%�?���ez�8op��A��=H�Q�������,̒�L�N>Ʈ�����P@�d\�"�;���C<�8ӻ�@����m?�ED�
Z���u�'�{�o���<�]���:�$X���j��pZ[E��A�q�F�q�Ҿ����5��`H�>X�g����"6�$�P%,P.�R�*��sZ6�Ќx�
�@�F������ޮ��S�f'��-�B
�:�V���r���{e�k[{M<T��Ҟ��z���K�R�*b�XaH�g��w<�s�t_�Zxt���I�;��[��V�Vu+�'�ek�95�׿|��J�����!��T2inI4@�jUP��f�Z6V[�L����XQI��ID\��@v\Sa�w�_cu^vQqm5���.���F���EvSG�lc�i��� D�n�����'n�������;v��G��y�_����;��޷�B% .��J��>�*a����=�g�}��Sp������M{�����h׺JQ�#( 0��+���K3_z摟�|��o�����8�ܧ/,��1�{��;W�� eM�3��J8q�7/->{���*�]��sO�8����=w<2�V���[*��
��Ś��M�^� ��uY�!�X�Æ2e7s���nf��R��r6w��Y�	qFq��*B���$�2���*QE�$L@��`�#�[�㳯����S�-�5�M�����W�7r�i�s�o:�ʕՅ"�F�����|��mq�O�����?�K�K[/�^���O~����C�[�9��/��#g��4c��M��b%5b ��*�U���>k�fˑ89��]��A#���6s�ܓk�W� ���/�^�ݭ���e��F�ey����P�w+�"��Kc�[o^�:��q���B!���ݗ�wr���^S�ʲ3>��j���ue�u�Q^�*��\\�����-�	u�2C��\@�M��z€
I.�;�x@�T����-g�t&}b��=5�A@<!�&���$T�\p�	�z��#y���@�~�y+�'	�9�s�8�q����D���)�~��i��87�e%�r�%%~�� �Bs��:lj
�gy��z����r�J�f:����B�l�;b�a��7e�?��K�˿`�V�_�2�6��ǎIEND�B`�PK�Xߑ6���moneycontrol.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from urllib.parse import quote


class MoneyControlRecipe(BasicNewsRecipe):
    title = u'Money Control'
    __author__ = 'unkn0wn'
    description = 'Read the latest business news on the Indian economy, global market, upcoming IPOs and more.'
    language = 'en_IN'
    masthead_url = 'https://images.moneycontrol.com/images/ftpopup/moneyloginlogo.png'
    encoding = 'utf-8'
    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['width', 'height', 'float', 'style']

    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    resolve_internal_links = True
    oldest_article = 1 # days

    extra_css = '''
        img {display:block; margin:0 auto;}
        .article_image_wrapper { font-size:small; text-align:center; }
        .articlename_join_follow, .author_wrapper, .FT_block_article { font-size:small; color:#404040; }
        .article_desc { font-style:italic; color:#202020; }
    '''

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        soup = self.index_to_soup(url)
        link = soup.a['href']
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/multimedia/',
        ]
        if any(x in link for x in skip_sections):
            self.abort_article('skipping video links ', link)
        self.log('Found ', link)
        html = br.open(link).read()
        return ({ 'data': html, 'url': link })

    keep_only_tags = [
        dict(name='div', attrs={'id':lambda x: x and x.startswith('article-')})
    ]

    remove_tags = [
        dict(name=['svg', 'style', 'button', 'script']),
        dict(attrs={'id':['social_icon_impression', 'taboola-mid-article-thumbnails']}),
        classes(
            'social_icons_wrapper mid-arti-ad lastPara related_stories_left_block social_icons_mobile_wrapper '
            'advSlotsWithoutGrayBox tags_wrapper maintextdiv page_right_wrapper stockwidget tech_newsletter'
        )
    ]

    def preprocess_html(self, soup):
        desc = soup.find(**classes('article_desc'))
        if desc:
            desc.name = 'p'
        for wrap in soup.findAll(**classes('article_image_wrapper')):
            for h2 in wrap.findAll('h2'):
                h2.name = 'span'
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        return soup

    feeds = []

    when = oldest_article*24
    index = 'https://www.moneycontrol.com/'

    business_sections = [
        'markets', 'stocks', 'ipo', 'budget', 'banks', 'moneycontrol-research', 'economy', 'earnings', 'real-estate', 
        'personal-finance', 'commodities', 'trade', 'companies'
    ]

    a = 'https://news.google.com/rss/search?q=when:{}h+allinurl:{}&hl=en-IN&gl=IN&ceid=IN:en'

    for sec in business_sections:
        allinurl_a = index + 'news/business'
        feeds.append((sec.capitalize(), a.format(when, quote(allinurl_a + sec, safe=''))))
    feeds.append(('Business' , a.format(when, quote(allinurl_a + sec, safe=''))))

    news_sections = [
        'india', 'world', 'opinion', 'politics', 'technology', 'trends', 'lifestyle'
    ]

    for sec in news_sections:
        allinurl_b = index + 'news'
        feeds.append((sec.capitalize(), a.format(when, quote(allinurl_b + sec, safe=''))))
    feeds.append(('News', a.format(when, quote(allinurl_b + sec, safe=''), '')))
    feeds.append(
        ('Others', 'https://news.google.com/rss/search?q=when:{}h+allinurl:{}&hl=en-IN&gl=IN&ceid=IN:en'.format(when, quote(index, safe='')))
    )

    def populate_article_metadata(self, article, soup, first):
        div = soup.find('div', attrs={'data-io-article-url':True})
        if div:
            article.url = div['data-io-article-url']
        desc = soup.find(**classes('article_desc'))
        if desc:
            article.summary = self.tag_to_string(desc)
            article.text_summary = article.summary
        article.title = article.title.replace(' - Moneycontrol', '')
PK�X��Ƅ�moneyro.png�PNG


IHDR(-SPLTE����A�[���5��3IDATxڌǩ��\�f^uU���0���ՃzP��G=�`
&i�����IEND�B`�PK�X)b:��moneyro.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
money.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class MoneyRo(BasicNewsRecipe):
    title = 'Money Ro'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'\u0218tiri din Rom\u00e2nia'
    publisher = 'MoneyRo'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania'
    encoding = 'utf-8'
    remove_javascript = True
    cover_url = 'http://assets.moneyweb.ro/images/logo_money.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [dict(name='div', attrs={'id': 'titluArticol'}), dict(name='img', attrs={'id': 'objImage'}), dict(name='div', attrs={'class': 'leftColumnArticle'})  # noqa
                      ]

    remove_tags_after = [dict(name='div', attrs={'id': 'articleTags'})]

    remove_tags = [dict(name='div', attrs={'id': 'ads'}), dict(name='div', attrs={'id': 'aus'}), dict(name='div', attrs={'id': 'bb-comment-create-form'}), dict(name='div', attrs={'id': 'articleTags'}), dict(name='div', attrs={'class': 'breadcrumb'})  # noqa
                   ]

    feeds = [
        (u'\u0218tiri', u'http://moneyro.feedsportal.com/c/32533/fe.ed/rss.money.ro/stiri.xml')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�5���montevideo_com.png�PNG


IHDR�a�IDATx�b�tM��$Q�ٳm;�m���m۶m۶m;,��Wٍ߽�5���^�u��s{�\�Q�&��Q�l�[P�&^�1���l��+���<�P?�2z����߲y����>�1M๼!s�S�z	���P?���b��q��Mo���������l%0�3y퇢\r�j���b>�F5�ޓg��}�o����$��P&,���M{=w�[ʣ1�LRۏaˁ�����a4�E}0i)��X��iΕ��$���'��\c�Ul��c�o�˸E�"��X^TU򦿑��W'��)��91� ����>v	c8�=Ơ���;�fޑ���4�CnP�
唍@mn����~�e��랅t1�~����U��ƶ#g��4�sZ=���A���#g�n��ʡl�pɣ��y��z�}:�w�è��p�9Q��)�������Q�̱��ĵ⨨���h�!&,܈�.��T@r�a�:��s��m|K�Q����О3���G>ӗ��ʝ�hΙ(�~͓�N��S9r�*a��_�쀯����Y9߄7aŖx��Հ_��;u%v�?O�1j�sߖ�Y��/C-�Z��?�����-��R�[V76�9��;8~�A%=�@��^#.��G!�X�:�)���.�㔏���Q6��U�����{�0�J��h�����z�{�G�IEND�B`�PK�X��0��montevideo_com.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = '2010, Gustavo Azambuja <hola at gazambuja.com>'
'''
http://www.montevideo.com.uy
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Noticias(BasicNewsRecipe):
    title = 'Montevideo COMM'
    __author__ = 'Gustavo Azambuja'
    description = 'Noticias de Uruguay'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 5
    encoding = 'utf-8'
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 2
    max_articles_per_feed = 100
    keep_only_tags = [dict(id=['txt'])]
    remove_tags = [
        dict(name=['object', 'link'])
    ]

    remove_attributes = ['width', 'height', 'style', 'font', 'color']

    extra_css = '''
                h1{font-family:Geneva, Arial, Helvetica, sans-serif;color:#154B7A;}
                h3{font-size: 14px;color:#999999; font-family:Geneva, Arial, Helvetica, sans-serif;font-weight: bold;}
                h2{color:#666666; font-family:Geneva, Arial, Helvetica, sans-serif;font-size:small;}
                p {font-family:Arial,Helvetica,sans-serif;}
                '''
    feeds = [
        (u'Destacados', u'http://www.montevideo.com.uy/anxml.aspx?58'),
        (u'Noticias', u'http://www.montevideo.com.uy/anxml.aspx?59'),
        (u'Tecnologia', u'http://www.montevideo.com.uy/anxml.aspx?133'),
        (u'Tiempo Libre', u'http://www.montevideo.com.uy/anxml.aspx?60'),
        # (u'Deportes', u'http://www.montevideo.com.uy/anxml.aspx?968'),
        # (u'Pantallazo', u'http://www.montevideo.com.uy/anxml.aspx?1022'),
        (u'Gastronomia', u'http://www.montevideo.com.uy/anxml.aspx?1023')
    ]

    def get_cover_url(self):
        return 'http://sphotos.ak.fbcdn.net/hphotos-ak-snc1/hs276.snc1/10319_147339559330_147337559330_2625816_6636564_n.jpg'

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X�AU�montreal_gazette.png�PNG


IHDR  D���@PLTEr�v�9��r�U��s�w�"{�$|�+��1��3��4��7��t�>��Q��Q��S��^��a��c��h��s��|�ͨ�޴����b��k��l��K��B��Y��4��^��x�̜�ٟ��f��%|�:��;��%}�>�р��F��'}�M��N��O��(~�(�Q��R��(��S��S��x�.��v���χ�Ҙ��x��x���Ҋ�ҍ�ԍ��4��d�ġ�ۥ�ݦ��#{���߫��6�������v������������������k��9��n��o��p��q��0��1��R��y�<��<��=��z�� y�}��T��U��)����Є�Ѕ�х��)��X��*�B��3��3��*����Ԑ�Ր��Փ��*��]��]��E��[��[��\��j��t�-��_��t��.��C��e��1��x����f�ƞ��2��i��(��W��3��)~�Y��C��w����T��T��x��y��y��3��D��?��?��4����҉��[��E��E��`��s�G��b��G�ӫ�߯����������I��J��e�Ĺ��e��t�$|�s�/��P��9��������O7��IDATx���Sc+P�m�ɵm۶om۶m��O�s�Ӿv^�] �-�A�m�۰=���0�G�#�����n�n��q�ǂ�=�p@����7�Z� ��O��Z�3':�m�@��^pg�31̰j�.hͧ��f��1�ϻ�r�t�-R.YώW�l��x½q�EtRa��W%���;P(�n	�$���n��zݿ���*Q.-���喤��<��Jh��@9�'��8���c�׻@��E��nENVl�
C�,9�����WO5�L�t�$��ԩN>��!��9���H�Y�"�����e��Q���0���DU�����&�
����?t�6�ؗ�p�$��n��rX ���IEND�B`�PK�XeIPR�3�3montreal_gazette.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
__license__ = 'GPL v3'

'''
www.canada.com
'''
import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class CanWestPaper(BasicNewsRecipe):

    postmedia_index_pages = [
        (u'Headlines', u'/index.html'),
        (u'Ottawa & Area', u'/news/ottawa/index.html'),
        (u'Vancouver', u'/news/vancouver/index.html'),
        (u'Calgary', u'/news/calgary/index.html'),
        (u'Edmonton', u'/news/edmonton/index.html'),
        (u'Montreal', u'/news/montreal/index.html'),
        (u'Fraser Valley', u'/news/fraser-valley/index.html'),
        (u'British Columbia', u'/news/bc/index.html'),
        (u'Alberta', u'/news/alberta/index.html'),
        (u'Canada', u'/news/canada/index.html'),
        (u'National', u'/news/national/index.html'),
        (u'Politics', u'/news/politics/index.html'),
        (u'Insight', u'/news/insight/index.html'),
        (u'Special Reports', u'/news/specialreports/index.html'),
        (u'Gangs', u'/news/gangs/index.html'),
        (u'Education', u'/news/education/index.html'),
        (u'Health', u'/news/health/index.html'),
        (u'Environment', u'/news/environment/index.html'),
        (u'World', u'/news/world/index.html'),
        (u'Police Blotter', u'/news/crime-and-justice/index.html'),
        (u'Crime', u'/news/blotter/index.html'),
        (u'Around Town', u'/news/topic.html?t=keyword&q=Around+Town'),
        (u'Diplomatica', u'/news/diplomatica/index.html'),
        (u'Opinion', u'/opinion/index.html'),
        (u'Columnists', u'/columnists/index.html'),
        (u'Editorials', u'/opinion/editorials/index.html'),
        (u'Letters', u'/opinion/letters/index.html'),
        (u'Business', u'/business/index.html'),
        (u'Sports', u'/sports/index.html'),
        (u'Arts', u'/entertainment/index.html'),
        (u'Life', u'/life/index.html'),
        (u'Technology', u'/technology/index.html'),
        (u'Travel', u'/travel/index.html'),
        (u'Health', u'/health/index.html')
    ]

    # un-comment the following six lines for the Vancouver Province
    # title = u'Vancouver Province'
    # url_prefix = 'http://www.theprovince.com'
    # description = u'News from Vancouver, BC'
    # std_logo_url = 'http://www.theprovince.com/images/logo_theprovince.jpg'
    # logo_url = 'vplogo.jpg'
    # fp_tag = 'CAN_TP'

    # un-comment the following six lines for the Vancouver Sun
    # title = u'Vancouver Sun'
    # url_prefix = 'http://www.vancouversun.com'
    # description = u'News from Vancouver, BC'
    # std_logo_url = 'http://www.vancouversun.com/images/logo_vancouversun.jpg'
    # logo_url = 'vslogo.jpg'
    # fp_tag = 'CAN_VS'

    # un-comment the following six lines for the Calgary Herald
    # title = u'Calgary Herald'
    # url_prefix = 'http://www.calgaryherald.com'
    # description = u'News from Calgary, AB'
    # std_logo_url = 'http://www.calgaryherald.com/images/logo_calgaryherald.jpg'
    # logo_url = 'chlogo.jpg'
    # fp_tag = 'CAN_CH'

    # un-comment the following six lines for the Edmonton Journal
    # title = u'Edmonton Journal'
    # url_prefix = 'http://www.edmontonjournal.com'
    # description = u'News from Edmonton, AB'
    # std_logo_url = 'http://www.edmontonjournal.com/images/logo_edmontonjournal.jpg'
    # logo_url = 'ejlogo.jpg'
    # fp_tag = 'CAN_EJ'

    # un-comment the following six lines for the Ottawa Citizen
    # title = u'Ottawa Citizen'
    # url_prefix = 'http://www.ottawacitizen.com'
    # description = u'News from Ottawa, ON'
    # std_logo_url = 'http://www.ottawacitizen.com/images/logo_ottawacitizen.jpg'
    # logo_url = 'oclogo.jpg'
    # fp_tag = 'CAN_OC'

    # un-comment the following six lines for the Montreal Gazette
    title = u'Montreal Gazette'
    url_prefix = 'http://www.montrealgazette.com'
    description = u'News from Montreal, QC'
    std_logo_url = 'http://www.montrealgazette.com/images/logo_montrealgazette.jpg'
    logo_url = 'mglogo.jpg'
    fp_tag = 'CAN_MG'

    Kindle_Fire = False
    masthead_url = std_logo_url

    url_list = []
    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    encoding = 'utf-8'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: small;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                .photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                #photocredit { font-size: xx-small; font-weight: normal; }'''

    keep_only_tags = [dict(name='div', attrs={'id': re.compile('story')})]

    remove_tags = [{'class': 'comments'}, {'class': 'comment-intro'}, {'class': 'storytab'},
                   dict(name='div', attrs={'class': 'section_title'}), dict(name='div', attrs={'class': 'sharebar'}), dict(
                       name='div', attrs={'class': 'navbar'}), dict(name='div', attrs={'class': 'morelinks'}),
                   dict(name='h2', attrs={'id': 'photocredit'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='div', attrs={'id': 'soundoff'}),
                   dict(name='div', attrs={'id': re.compile('flyer')}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def get_cover_url(self):
        from datetime import timedelta, date
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        # delete empty id attributes--they screw up the TOC for unknown reasons
        divtags = soup.findAll('div', attrs={'id': ''})
        if divtags:
            for div in divtags:
                del(div['id'])

        pgall = soup.find('div', attrs={'id': 'storyphoto'})
        if pgall is not None:  # photo gallery perhaps
            if (soup.find('div', attrs={'id': 'storycontent'}) is None):
                allpics = new_tag(soup, 'div')
                first_img = pgall.find('div', 'storyimage')
                if first_img is not None:
                    first_img.extract()
                    tlist = pgall.find('div', attrs={'id': 'relatedthumbs'})
                    if tlist is not None:
                        for atag in tlist.findAll('a'):
                            img = new_tag(soup, 'img')
                            srcpre, sep, srcpost = atag.img[
                                'src'].partition('?')
                            img['src'] = srcpre
                            pdesc = new_tag(soup, 'p')
                            pdesc.insert(0, atag.img['alt'])
                            pdesc['class'] = 'photocaption'
                            div = new_tag(soup, 'div')
                            div.insert(0, pdesc)
                            div.insert(0, img)
                            allpics.append(div)
                pgall.replaceWith(allpics)

        for pg in soup.findAll('div', attrs={'id': 'storyphoto'}):
            pg.extract()
        return self.strip_anchors(soup)

    def parse_index(self):

        articles = {}
        ans = []

        def handle_article(adiv, key):
            if adiv.name == 'h1' or adiv.name == 'h3':
                h1tag = adiv
            else:
                h1tag = adiv.h1
                if h1tag is None:
                    h1tag = adiv.h3
            if h1tag is not None:
                atag = h1tag.a
                if atag is not None:
                    url = atag['href']
                    if url.startswith('/'):
                        url = self.url_prefix + url
                    if not url.startswith(self.url_prefix):
                        print("Rejected " + url)
                        return
                    if url in self.url_list:
                        print("Rejected dup " + url)
                        return
                    self.url_list.append(url)
                    title = self.tag_to_string(atag, False)
                    if 'VIDEO' in title.upper():
                        return
                    if 'GALLERY' in title.upper():
                        return
                    if 'PHOTOS' in title.upper():
                        return
                    dtag = adiv.find('div', 'content')
                    description = ''
                    print("URL " + url)
                    print("TITLE " + title)
                    if dtag is not None:
                        stag = dtag.span
                        if stag is not None:
                            if ''.join(stag['class']) != 'timestamp':
                                description = self.tag_to_string(stag, False)
                        else:
                            description = self.tag_to_string(dtag, False)
                        print("DESCRIPTION: " + description)
                    if key not in articles:
                        articles[key] = []
                    articles[key].append(dict(
                        title=title, url=url, date='', description=description, author='', content=''))

        def parse_web_index(key, keyurl):
            print("Section: " + key + ': ' + self.url_prefix + keyurl)
            try:
                soup = self.index_to_soup(self.url_prefix + keyurl)
            except:
                print("Section: " + key + ' NOT FOUND')
                return
            ans.append(key)
            mainsoup = soup.find('div', 'bodywrapper')
            footer = mainsoup.find(attrs={'id': 'footerfeature'})
            if footer is not None:
                footer.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['genericfeature']}):
                wdiv.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['headline', 'featurecontent']}):
                handle_article(wdiv, key)

        for (k, url) in self.postmedia_index_pages:
            parse_web_index(k, url)
        ans = [(key, articles[key]) for key in ans if key in articles]
        return ans
PK�Xfy���more_intelligent_life.png�PNG


IHDR  ���IDATxڵ��J#A�33=IL�FH� (�F�%W>�J�^�
˂w�>�x#���
�2=?��qFc\�:�3��TUWO��qr�h4����q�9I�%��q'��뺞�-�}߯T*��ё	��j���N�aOSc�g�AFd���AǓwq�Z�6�M��֙N� (2��	�I�MS���`:M��u�"��������(J%Se��������Q�Z7��lv:������	��j�� ��*�QV�;?�h�Z-�����I�R�����^�GX���
��탃�1��lf�^*�ɻ��0�6��������0���WWW�qG�ucL���o=/NS|��pH����!C�Hjd\$Þ9�d8���܌�4�a���u����H��	�Ȉ�H#(V�-T���#�H}t�Η�E�q)&�0Lg}}}{{�HA�Iѐ
�]�p5k������C開�:R4�k6Z+�O(�tK���666���!�	�6`Kd@����p8>0�+QQD�Xb��^���|~��G� @HB��,�+�&��h)�HU�P<��1=b�"%�0*.��.V\"��%Ҕ�6����9�/��W��bf�ͻoY�"��\�oP�e��q=�J.5�Y�r�u%̢@�q2��Z��㍻TrE�M���j��̻��gaZS�C!^�t}DY��.aɽT.�����?�Z�J��~0FG=hB-�><r2ClQ�(2ԇs���u��<p:R���\����ڼ��}��r�#������,[�/�$2����?T_�����nW"�i��w�l��[s����r��#�N�_]]�kjp����.qE�J��4��6؃����k��#'�f��N*/m��Z]][C@��T�T�9�^�%��O�I��W#Fp�4{�6���m�?N�d�`�y�%�%?�A%@4��1�4p���i�����aH�)IEND�B`�PK�X�R�more_intelligent_life.recipe__license__ = 'GPL v3'
__copyright__ = '2013 - 2015, Darko Miletic <darko.miletic at gmail.com>'
'''
moreintelligentlife.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class MoreIntelligentLife(BasicNewsRecipe):
    title = 'More Intelligent Life'
    __author__ = 'Darko Miletic'
    description = "More Intelligent Life (moreintelligentlife.com) is the online version of Intelligent Life, a lifestyle and culture magazine from The Economist. The website offers not only content from the print edition, trickled out over the course of its shelf-life, but also the Editors' Blog, which carries daily posts from the editorial team-quickfire observations and opinions that allow readers to eavesdrop on the conversation in the office."  # noqa
    publisher = 'The Economist Newspaper ltd'
    category = 'arts,lifestyle,intelligent life,the economist,ideas,style,culture'
    oldest_article = 60
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'website'
    auto_cleanup = True
    extra_css             = """
                               body{font-family: "DTL Fleischmann-Regular", serif}
                               img{margin-bottom: 0.4em; display:block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Articles', u'http://www.intelligentlifemagazine.com/rss/content')]
PK�Xl)�Gllmoscow_times.png�PNG


IHDR�a3IDATx�b@5n<z����_��}/d��*���J�,�wm۶m۶wl{ڶm�,۶�m۝��?�+�8Aȹ8E���$^�āj�g/䯇�`]��Nw#D�1~BN�u�̞���J�4F&�U�.��������ce?�58���/���߽(������“��-]
b�0Xz&�f�:]_��g�6�T�ru���褏{p�Q4�+S?$* �����d
��y��6�w?��0���jW�y��|�8Z
�GJ�Io.\��~NU���28��f�?�I��C�q�ZF�t��kX��/}ă�De�n���l0=�H9�����=z>B(�o���d^{�7S��bE�`p��sM�~�6<x�
/�H�%�n�:A��f,���;u���`{�i$��Z������e7ܶ�7l���{�[o�+����YgW$���هb����т�-Ŧ�u��ȿ����2$K��h��z�д��įT�޳��2J��m)�M�O�VP��=Xc��)E�p��f�i;
�>|��;K3�q����o�6��UAw���k��2�S������~�#{֗��m��Y��p�k67�����8n�͘�Zbj���-���c�~M(Uk�n��o�I�^��.\Wd�ۚ�*tp�.|��|#���r����?�
��Pj�_���쮰�y҇7� _���_S�|نF�i
.��@5s��1B�qX���4<����2E�%X��c�%);_	N�3x؃�(Q����c�!<�k�Q�1e�{��xNk��m����Ģ��xn��9�!�aW�g��]IEND�B`�PK�X#R���moscow_times.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.themoscowtimes.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Moscowtimes(BasicNewsRecipe):
    title = 'The Moscow Times (light version)'
    __author__ = 'Darko Miletic and Sujata Raman'
    description = 'The Moscow Times is a daily English-language newspaper featuring objective, reliable news on business, politics, sports and culture in Moscow, in Russia and the former Soviet Union (CIS).'  # noqa
    category = 'Russia, Moscow, Russian news, Moscow news, Russian newspaper, daily news, independent news, reliable news, USSR, Soviet Union, CIS, Russian politics, Russian business, Russian culture, Russian opinion, St Petersburg, Saint Petersburg'  # noqa
    publisher = 'The Moscow Times'
    language = 'en_RU'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    publication_type = 'newspaper'
    auto_cleanup = True

    feeds = [
        (u'Top Stories', u'https://themoscowtimes.com/feeds/main.xml'),
        (u'Moscow', u'https://themoscowtimes.com/feeds/moscow.xml'),
        (u'Russia', u'https://themoscowtimes.com/feeds/russia.xml'),
        (u'World', u'https://themoscowtimes.com/feeds/world.xml'),
        (u'Business', u'https://themoscowtimes.com/feeds/business.xml'),
        (u'Opinion', u'https://themoscowtimes.com/feeds/opinion.xml')
    ]
PK�X�%����moscowtimes_en.png�PNG


IHDR  D���PLTE-{,Q�e����ɷ���������Bvy�IDATx��E��@�����a<�)0�v�5� �3�EH�	c�Y"M4rȁШƑ��S&����ʈ�ؓU�>��?T�S�A��F&�'B�aҳC�����O͚�'8'�)h3��V�C�־�l��r�F��7c����?�n	��7IEND�B`�PK�XR!l�??moscowtimes_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class MoscowTimes(BasicNewsRecipe):
    title           	  = 'The Moscow Times'
    __author__            = 'bugmen00t'
    description           = 'The Moscow Times is Russia’s leading, independent English-language media outlet. Our team of Russian and English journalists provide readers across the world with breaking news, engaging stories and balanced reporting about the largest country on Earth.'  # noqa
    publisher             = 'Tiamti LLC'
    category              = 'newspaper'
    cover_url = u'https://static.themoscowtimes.com/img/share_default.jpg'
    language              = 'en_RU'
    no_stylesheets        = False
    remove_javascript = True
    auto_cleanup   = False
    oldest_article = 14
    max_articles_per_feed = 50

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='div', attrs={'class': 'article__tags'})

    remove_tags =   [
        dict(name='aside'),
        dict(name='footer'),
        dict(name='section', attrs={'class': 'cluster'}),
        dict(name='div', attrs={'class': 'article__tags'}),
        dict(name='div', attrs={'class': 'social'}),
        dict(name='div', attrs={'class': 'related-article__content'})
        ]

    feeds = [
        ('News', 'https://www.themoscowtimes.com/rss/news'),
        ('Opinion', 'https://www.themoscowtimes.com/rss/opinion'),
        ('Arts and Life', 'https://www.themoscowtimes.com/rss/city'),
        ('Meanwhile', 'https://www.themoscowtimes.com/rss/meanwhile')
        ]
PK�X�%����moscowtimes_ru.png�PNG


IHDR  D���PLTE-{,Q�e����ɷ���������Bvy�IDATx��E��@�����a<�)0�v�5� �3�EH�	c�Y"M4rȁШƑ��S&����ʈ�ؓU�>��?T�S�A��F&�'B�aҳC�����O͚�'8'�)h3��V�C�־�l��r�F��7c����?�n	��7IEND�B`�PK�X7�|�	�	moscowtimes_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class MoscowTimes(BasicNewsRecipe):
    title = 'The Moscow Times'
    __author__ = 'bugmen00t'
    description = '\u0410\u043D\u0433\u043B\u043E\u044F\u0437\u044B\u0447\u043D\u043E\u0435 \u0438\u0437\u0434\u0430\u043D\u0438\u0435 \u043E \u0420\u043E\u0441\u0441\u0438\u0438. \u041D\u0430\u0448\u0430 \u0440\u0435\u0434\u0430\u043A\u0446\u0438\u044F \u0434\u0435\u043B\u0438\u0442\u0441\u044F \u0441 \u0447\u0438\u0442\u0430\u0442\u0435\u043B\u044F\u043C\u0438 \u043F\u043E \u0432\u0441\u0435\u043C\u0443 \u043C\u0438\u0440\u0443 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u043C\u0438 \u043D\u043E\u0432\u043E\u0441\u0442\u044F\u043C\u0438 \u0438 \u0441\u0430\u043C\u044B\u043C\u0438 \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B\u043C\u0438 \u0441\u043E\u0431\u044B\u0442\u0438\u044F\u043C\u0438 \u0441\u0430\u043C\u043E\u0439 \u0431\u043E\u043B\u044C\u0448\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u044B \u043D\u0430 \u0417\u0435\u043C\u043B\u0435.'  # noqa
    publisher = '\u041E\u041E\u041E \u0422\u0438\u044D\u043C\u0442\u0438'
    category = 'newspaper'
    cover_url = u'https://static.themoscowtimes.com/img/share_default.jpg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 50

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='div', attrs={'class': 'article__bottom'})

    remove_tags = [
        dict(name='aside'),
        dict(name='footer'),
        dict(name='section', attrs={'class': 'cluster'}),
        dict(name='div', attrs={'class': 'article__tags'}),
        dict(name='div', attrs={'class': 'social'}),
        dict(name='div', attrs={'class': 'related-article__content'})
    ]

    feeds = [(
        '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
        'https://www.moscowtimes.ru/rss/news'
    ),
             (
                 '\u041C\u043D\u0435\u043D\u0438\u044F',
                 'https://www.moscowtimes.ru/rss/opinion'
             ),
             (
                 '\u041F\u0435\u0440\u0435\u0432\u043E\u0434\u044B Financial Times',
                 'https://www.moscowtimes.ru/rss/ft'
             )]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X�M��motherjones.png�PNG


IHDRb��PLTE�����tRNS@��f5IDATx�ca``e�$�0��	�P8$BB����"&���@b-[Ǘ=�IEND�B`�PK�X����motherjones.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1541791799(BasicNewsRecipe):
    title          = 'Mother Jones'
    language = 'en'
    __author__ = 'Daniel Bonnery'
    oldest_article = 14
    max_articles_per_feed = 200
    auto_cleanup   = True
    feeds          = [
        ('Mother Jones', 'http://feeds.feedburner.com/motherjones/feed'),
    ]
PK�X�6�

msdnmag_en.png�PNG


IHDR�a�IDATx��jA���lv�N5F���O�h/VJ��`!Qc'�B �`m��a'��Fń����ٝ���[���}�Qpr�V���^#9dɑ�G,er��29�ͽ�Y����Z��?��?��ܓO HQI�{!� �K’~�����ZM6+���t4>ӇL�2���x���%��x�]���-O�\]ը�)���`�S�P�Za�,^\�¯�6���v�!�(�QADp�!�/o�N�����skq��
" ` e��%R�HY�P��\]����1T�o�8ǐӵ��2�a9���YU�)2�!�dȉ(1b)B���8G����պ���b�!�?��a}� �"Y��{�/�3�s�;9�򠚎Δg����
��H�z��Y�v��ڃ�4�;>��6����t-�{�Y�����0���Z=6Z�>���j�2�LIEND�B`�PK�X�����msdnmag_en.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
msdn.microsoft.com/en-us/magazine
'''
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup, BeautifulStoneSoup


class MSDNMagazine_en(BasicNewsRecipe):
    title = 'MSDN Magazine'
    __author__ = 'Darko Miletic'
    description = 'The Microsoft Journal for Developers'
    masthead_url = 'http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnMagazine/smalllogo.png'
    publisher = 'Microsoft Press'
    category = 'news, IT, Microsoft, programming, windows'
    oldest_article = 31
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'

    base_url = 'http://msdn.microsoft.com/en-us/magazine/default.aspx'
    rss_url = 'http://msdn.microsoft.com/en-us/magazine/rss/default.aspx?z=z&iss=1'

    keep_only_tags = [dict(name='div', attrs={'id': 'MainContent'})]

    remove_tags = [
        dict(name='div', attrs={'class': 'DivRatingsOnly'}), dict(
            name='div', attrs={'class': 'ShareThisButton4'})
    ]

    def find_articles(self):
        idx_contents = self.browser.open(self.rss_url).read()
        idx = BeautifulStoneSoup(
            idx_contents, convertEntities=BeautifulStoneSoup.XML_ENTITIES)

        for article in idx.findAll('item'):
            desc_html = self.tag_to_string(article.find('description'))
            description = self.tag_to_string(BeautifulSoup(desc_html))

            a = {
                'title':  self.tag_to_string(article.find('title')),
                'url': self.tag_to_string(article.find('link')),
                'description': description,
                'date': self.tag_to_string(article.find('pubdate')),
            }
            yield a

    def parse_index(self):
        soup = self.index_to_soup(self.base_url)

        # find issue name, eg "August 2011"
        issue_name = self.tag_to_string(soup.find('h1'))

        # find cover pic
        img = soup.find('img', attrs={'alt': issue_name})
        if img is not None:
            self.cover_url = img['src']

        return [(issue_name, list(self.find_articles()))]
PK�X�hl�
�
	msnbc.png�PNG


IHDR00W��
nIDATx��T��Yw�j]��}���Rt�Bu]���~�R�-x�
.�	�6��d�����S��q��'�L��y��Vo�Vo�Vo����ׂ�}�a�\dkn>��h_˱�X���pSp=�����nnke��4�V�X�e������%�F��m^c`X�~�<��c&�|�;[�'�����}`����f�RUha�ʥjX0'׮Lec"���N�|�Y�B���X���g[�oa���~�d���z�9��D�:�ݭD�����V,Qۼ=B�sJ0z~$�_y�⪥j��q��w�o��j�*��Ԙv�X�<�O��dd��s8:;<�FۗkV��_��{0@H� ���رY�i��³�n:��ۛ���q�(��B�	�s�)/?���-��[xN	R���Ϛv*J
;�(�+��~4ACёV�g+BQ2�g�⫙�?
@��E"�b���>�0%�:B>7��"ex$�1��	�n
	O�|�M9>�xMC����FT���I@1:�.|����hz�Dc�N�I��qⲿ��`�N�廊��\�Z�d���Б����� 	��nq�G<�`�ID���I���Q��{+"4}�()j�GϞ�W}*hWZS���Z���ƪ�
c����:��s��ڪ[��3�4��$2�<����[[H����k�=��*W]0 �g�������hBA���rd�%���+kW&3f�#A��Z2b}޾T��,���]�����8�?�����u
̼W��w��4m0��1�݋��S��k������@�G�;>h��E�Bq��c�!W��ҮM	��![�{2��˲�6�g��,�Z�1\� E�ln��D�3��:�&Q���H&�e����	S(.���x�V��
�L{s3�4��_c�w��ϳ#�������5(
_L$#�Sغ\Ȫ:F���p��$�Y8V^y�3͛���3fV��)�����A����W,U��!jŗ��"<�ӆ7��M�e4=�˲0P�\���(
�a�b������>!3����CK�s�{H��#JU֣�jA�ʼn;�i�Ă$^h�1�4;jj�0vK^�H#dž���K�[�<�����i���*32�ߞ?{|��`1b��}X�p#d��=n�ѓ�ao �Y����B��9�

؟%F���ߦ����r��2-�f������M`6촬}�U��X}�Y�nu��(�z������w�-*��'�	U��w���T��ӄs����2��]J��.n��ި��z��^�z�-�ә�? ����! ����ãh��
����;����h�dJ�#��ߪd�^�:�eF�!�+DK�N{�?Rg�	�.����~�=vK%���`�V��ւ�fCˑC�~�x�A �w4�K��%��(kǙӎ��|���Z\�n�[+.#�rs>��l�S�ǟ�cO)�Y�[�ڴ��u���ژ��y7��N�8Q̘9Ϣ�2���n�q�N|�vC+����-�����?���f|cg�t�7W.�į�B~����r;I�2—x�<���M���96n�Q}�7�����#|���f��H�Y����|����'�;Q��|�].9B��ÍkRE���s\��0������M�m�0~d�w�6aͩX_�>��×#��qSq�n61���^B����=\�D�3�/�x2���}���Jz�f�Y�hY�1���ר!������)�Ŝ��d�
�^�V8�r�h��we#}�
oe��5⇻��:����Կ��
*GMe��kpl��A5/����&��^B|�����Xu��?�����p9�0l�A��d��ԏI�1
����Nq��n|GgA�+�Ŵ!ci7�����vo�bn��VZ#"����߳<E�b�����#=�*}��x-q��0��W���i�V����Ʒ���bG�/�<��݉�1�Y��,{[21���y;������==�՗*�n�o�
�,M=���«i�[�b�=j+ڰ�=���%*A�,Z�hlı1ǐ�u��@�_J&Ė8����1�xpU�`���Y����E;]���s�\U�3BT
�&\�"Y\�6��jZ���rpAD
V�4��@|4ړbB%��
�̀0O&��"ܠ1��F��V4}�R_G8���h��I4�R�Ď�Dt�����F��;Ӛ�輼%��c���I�
o=�^!��R�ܟ�����G��xSI�+�YE��N(��!�.8���->h��Ep��!�2Bbն���}z�IU���P��{">�*��f@aF�">��'��K(]°Q�ʙ��s]��y��:�ր#v ����7cD��Z*�O�y_v����Ѝ������6:��˫?ok9?�lD��d#��GH���7�8�H|�vc%r-����ي��0�6_���W�&������PœJw��|�$�L=��:Yu��|����7�VB�b#�N7�

8	e�|���r��X���VZ���\x�����o�gZ?TϺ3��G)���9���*;k[@ϼ�l��y���G��g�������7&�)_����8�N�9�����D��������ꭿ�S��ͫ�IEND�B`�PK�X�<�;kkmsnbc.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2011, Darko Miletic <darko.miletic at gmail.com>'
'''
msnbc.msn.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class MsNBC(BasicNewsRecipe):
    title = 'MSNBC'
    __author__ = 'Darko Miletic'
    description = 'A Fuller Spectrum of News from msnbc.com and nbcnews.com'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'msnbc.com'
    language = 'en'
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    keep_only_tags = [
        classes('article-hero__container article-body')
    ]
    remove_tags = [
        dict(name=['iframe', 'button', 'meta', 'link']),
        classes('widget_video ad-container related'),
        dict(attrs={'data-test': ['social-share-inline']}),
        dict(name='source'),
    ]

    feeds = [
        ('Latest', 'https://feeds.nbcnews.com/msnbc/public/news'),
        ('Top stories', 'https://feeds.nbcnews.com/nbcnews/public/news'),
        ('Politics', 'https://feeds.nbcnews.com/nbcnews/public/politics'),
        ('U.S. News', 'https://feeds.nbcnews.com/nbcnews/public/us-news'),
        ('World', 'https://feeds.nbcnews.com/nbcnews/public/world'),
        ('Business', 'https://feeds.nbcnews.com/nbcnews/public/business'),
        ('Opinion', 'https://feeds.nbcnews.com/nbcnews/public/think'),
    ]

    def get_article_url(self, article):
        ans = article.get('guid')
        if '/video/' not in ans:
            return ans

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-original': True}):
            img['src'] = img['data-original']
        return soup
PK�X9�
msnsankei.png�PNG


IHDR(-SNPLTE������???������������￿�OOOooo///___����__�������������#D�IDATx�,��1�P')��Ї�_tU�?�����#�
���P���O�V�`��փ�k���մ�5%��~�����-�������w�&t�p�A[\���@�0�.a�����IU2�C�DJ�XF�IEND�B`�PK�XqҌ�msnsankei.recipe
__license__ = 'GPL v3'
__copyright__ = '2010,2014, Hiroshi Miura <miurahr@linux.com>'
'''
sankei.jp.msn.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class MSNSankeiNewsProduct(BasicNewsRecipe):
    title = u'MSN\u7523\u7d4c\u30cb\u30e5\u30fc\u30b9(\u65b0\u5546\u54c1)'
    __author__ = 'Hiroshi Miura'
    description = 'Products release from Japan'
    oldest_article = 7
    max_articles_per_feed = 100
    encoding = 'utf-8'
    language = 'ja'
    cover_url = 'http://sankei.jp.msn.com/images/common/sankeShinbunLogo.jpg'
    masthead_url = 'http://sankei.jp.msn.com/images/common/sankeiNewsLogo.gif'

    feeds = [(u'\u65b0\u5546\u54c1',
              u'http://sankei.jp.msn.com/rss/news/release.xml')]

    keep_only_tags = [dict(id=['MainContent'])]
PK�X�,8S��mult_kor.png�PNG


IHDR�aaIDATx�c���?V�����Ǐ�i�j��~-�S���?�$�¥���;j_Z�'b׼~m�;���vc���w�{���Wah��}k�;C���t5�c3���'���o��1��w��;c�o Il�y�B���?�q~gj�&�0`��σ�1�u��;�	L��'�12�HÀ_�/���x
�4���c\����v9��^�~��D����gϤ>�z]�n"�B��W �~�X}�0�L@ڿ�
�L@���L���~�
�L��]!�aȷ�
��i����o\�}�`�fvC�O��GfG�������_�?v�@��t<�>)��IEND�B`�PK�X�����mult_kor.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1458513045(AutomaticNewsRecipe):
    title = 'Múlt-Kor'
    __author__ = 'pofa'
    language = 'hu'
    oldest_article = 1
    max_articles_per_feed = 50
    auto_cleanup = True

    feeds = [
        ('XX. század', 'http://mult-kor.hu/.scripts/rss.php?label=10'),
        ('Újkor', 'http://mult-kor.hu/.scripts/rss.php?label=14'),
        ('Középkor', 'http://mult-kor.hu/.scripts/rss.php?label=13'),
        ('Ókor', 'http://mult-kor.hu/.scripts/rss.php?label=12'),
        ('Őskor', 'http://mult-kor.hu/.scripts/rss.php?label=11'),
        ('Szakmai műhely', 'http://mult-kor.hu/.scripts/rss.php?section=3'),
        ('E-folyóirat', 'http://mult-kor.hu/.scripts/rss.php?section=8'),
        ('Évfordulók', 'http://mult-kor.hu/.scripts/rss_events.php'),
    ]
PK�X�.R�FFmunchner_merkur_nord.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�r�CCmunchner_merkur_nord.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'M\xfcnchner Merkur Nord'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'M\xfcnchen Lankreis Nord', u'http://www.merkur-online.de/lokales/muenchen-lk-nord/rssfeed.rdf'),
    (u'M\xfcnchen Nord', u'http://www.merkur-online.de/lokales/muenchen-lk-nord/landkreis/rssfeed.rdf'),
    (u'Unter-Oberschlei\xdfheim', u'http://www.merkur-online.de/lokales/muenchen-lk-nord/ober-unterschleissheim/rssfeed.rdf'),
    (u'Ismaning Unterf\xf6hring', u'http://www.merkur-online.de/lokales/muenchen-lk-nord/ismaning-unterfoehring/rssfeed.rdf'),
    (u'Aschheim Feldkirchen', u'http://www.merkur-online.de/lokales/muenchen-lk-nord/aschheim-feldkirchen/rssfeed.rdf'),
    (u'Garching', u'http://www.merkur-online.de/lokales/muenchen-lk-nord/garching/rssfeed.rdf'),
    (u'Putz-/ Grasbrunn', u'http://www.merkur-online.de/lokales/muenchen-lk-nord/putz-grasbrunn/rssfeed.rdf'),
    (u'Haar', u'http://www.merkur-online.de/lokales/muenchen-lk-nord/haar/rssfeed.rdf'),
    (u'Kirchheim', u'http://www.merkur-online.de/lokales/muenchen-lk-nord/kirchheim/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X�.R�FFmunchner_merkur_stadt.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X\�munchner_merkur_stadt.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'M\xfcnchner Merkur Stadt'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'M\xfcnchen Stadt', u'http://www.merkur-online.de/lokales/muenchen/rssfeed.rdf'),
    (u'Stadt M\xfcnchen', u'http://www.merkur-online.de/lokales/muenchen/stadt-muenchen/rssfeed.rdf'),
    (u'M\xfcnchen S\xfcd', u'http://www.merkur-online.de/lokales/muenchen/sued/rssfeed.rdf'),
    (u'M\xfcnchen Nord', u'http://www.merkur-online.de/lokales/muenchen/nord/rssfeed.rdf'),
    (u'M\xfcnchen Zentrum', u'http://www.merkur-online.de/lokales/muenchen/zentrum/rssfeed.rdf'),
    (u'M\xfcnchen West', u'http://www.merkur-online.de/lokales/muenchen/west/rssfeed.rdf'),
    (u'M\xfcnchen Ost', u'http://www.merkur-online.de/lokales/muenchen/ost/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X�.R�FFmunchner_merkur_sud.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�p���munchner_merkur_sud.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'M\xfcnchner Merkur S\xfcd'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'M\xfcnchen S\xfcd', u'http://www.merkur-online.de/lokales/muenchen-lk-sued/rssfeed.rdf'),
    (u'Sauerlach', u'http://www.merkur-online.de/lokales/muenchen-lk-sued/sauerlach/rssfeed.rdf'),
    (u'M\xfcnchen S\xfcd', u'http://www.merkur-online.de/lokales/muenchen-lk-sued/landkreis/rssfeed.rdf'),
    (u'Unterhaching', u'http://www.merkur-online.de/lokales/muenchen-lk-sued/unterhaching/rssfeed.rdf'),
    (u'Sch\xe4ftlarn', u'http://www.merkur-online.de/lokales/muenchen-lk-sued/schaeftlarn/rssfeed.rdf'),
    (u'Aying', u'http://www.merkur-online.de/lokales/muenchen-lk-sued/aying/rssfeed.rdf'),
    (u'Ottobrunn', u'http://www.merkur-online.de/lokales/muenchen-lk-sued/ottobrunn/rssfeed.rdf'),
    (u'Gr\xfcnwald', u'http://www.merkur-online.de/lokales/muenchen-lk-sued/gruenwald/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X�.R�FFmunchner_merkur_wurmtal.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X���??munchner_merkur_wurmtal.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'M\xfcnchner Merkur W\xfcrmtal'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard', u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Region W\xfcrmtal', u'http://www.merkur-online.de/lokales/wuermtal/rssfeed.rdf'),
    (u'W\xfcrmtal', u'http://www.merkur-online.de/lokales/wuermtal/wuermtal/rssfeed.rdf'),
    (u'Krailing', u'http://www.merkur-online.de/lokales/wuermtal/krailling/rssfeed.rdf'),
    (u'Neuried', u'http://www.merkur-online.de/lokales/wuermtal/neuried/rssfeed.rdf'),
    (u'Gr\xe4felfing', u'http://www.merkur-online.de/lokales/wuermtal/graefelfing/rssfeed.rdf'),
    (u'Planegg', u'http://www.merkur-online.de/lokales/wuermtal/planegg/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X�.R�FFmurnauer_tagblatt.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X;!w�murnauer_tagblatt.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Murnauer Tagblatt'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Kreis Garmisch-Partenkirchen', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/rssfeed.rdf'),
    (u'Lkr. Garmisch-Partenkirchen', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/landkreis/rssfeed.rdf'),
    (u'Oberammergau', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/oberammergau/rssfeed.rdf'),
    (u'Murnau', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/murnau/rssfeed.rdf'),
    (u'Garmisch-Partenkirchen', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/garmisch-partenkirchen/rssfeed.rdf'),
    (u'Mittenwald', u'http://www.merkur-online.de/lokales/garmisch-partenkirchen/mittenwald/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X9ֹ


mwjournal.png�PNG


IHDR  ��tRNSn��	pHYs���S�	�IDATHKeVYo��;sg�Ý7��(���]��K�P��A~G�KI�6hS��mȱ�ȶvQ��/���˽=RR�h�A\��s���w��LFނ83.vd��+�$`sa��x	1�OŘ�XAey1�>�ď���'�[��(����\���ɢ,˼*�"K���g�R!#��E��K"��P���IB�9�up�a���(�"{�{������r��R����$bH��k�;��4w6���i����7��f~�Ф��Hij,"���q��E\��7yg�`FI����A���r�u���j"$I�zcUR�|a�\)>��A��rHO$��l��^�X���e�`ʰ�m�n��Y�Z�ԕtna;���:I�U�,F�?7�N�&(�b&���;�����`�d‚���1�B�X�$�֗��{���
/j�����0��p��������J��L>�I���<W��{w�e�U2�>�x;�X�gğJ�>�N�p\�Q�\���d���b�����:M2�
N�δ�*1��O.���j6�߿�j��j}6^��l�㈉��)���B0��4&�����,��v;
�r�VZ.������ ɒ����i�w-�js���� ��Gf�#aL�P��4����'r�Gn��}�FM&c/��$�`rmm��!�W�V}�/���h2���N�`65]��X�B�J`&�0��Yu}��R��q<�^�|�g�f����a���qqz�ir2�%�V��a(���?[m4dEZ,���q��ۭK6�񘙹s��3���=�}$�%�z��?�}{չ���_n� 椢v�Ә�ȋ<Ad2�t}��-)J�/�^�����[͝mH����6�bh�'bN��HG�5�olnnN�YBI�4�v�{R�Pb.�Tjsk�CO��'OT��>3�i=�()��l�a�������kM�����[;�����7��T�u˲N�O�8*������t:��ih��J~��WJB}����g�뫥bɱ�oaE��p�h_����"�}��l�?;9;:>�TUAq V�/
\:�vl��1�C��ǻ`�X���o�M���vm��@�x�$U-����4���VL�0��*W*ATEnn5Y�1���gt׶���ㄢ9Nо��T��|4��=�Ʉ��I�\�#Ac��Z�񽯿��>�JW+uA�l�xqx^H���Hg�wv c�u��c>���ɧO�*�*H�����
(^]^V%��Fcce�~zv�j��o��zcEV�a���?��\�	U�D���Vj;�c)}}p�<�7�7[��J%�uz�1�9(8������ 8�A)�xP(��˕�����`p~y~~z�&TY�`|�b�V�f��rٞχ��lnR�Ir]�0�q���g�F�lrqq~q޾���t:��@�Vk�R�����^|����Og����|nH�DHS����j�^�������zo�`�`l,"B�O�Y��5_,��G��d4�$�����,�9}���W0j��a��oo�E9;95��j�PP���\c>����<F<�"6=�Qq.
B_
(�z
�t>�L${��?N&#MM�ZY ��X�l�X^*�$"��7o��@���#Bh�˅�D6`bc;��N$�lZ8�v�R"IBS����"��MMӀ��:��$c�s����]�{���ݝ�f�^gXna�ih�v��"���Ӡ��|�Q���8�	L���J.�[YY�|߳��`�8�A�V�U��\6۾lC�m9����y�71,泐Ŭ�z�9�.<wA8�aa �݁�7�6�zR��d:��['�<��U��J%[.#J�o�Q�\70fg6�b�Ut<�>x�ПǾ뱌3������6�@��.,�����X�t�?F��M�Z�x	Ih�(J���!hj1�-�����	fYΏ��$Q�0��pl�^*!� ��~�����&�)�#۱'�����s,�͍Y����z���%i�|&(+FR6B���u=X\�'����n�o�32��2�d�2M-��j�[Y� �����_��J���y��@rB�W(���`1RR��ad�x%��/;��Yҵ4�g� �"����FQ0��T*�"!Ѡ�}:�8?>~k9^c��z뱍=�F$��V�ʰ�Kq�R�)<٣���v/��b��e�Tֶ�_�9H%�Je���⻃W/��ʚ�ϕ��_f*�0ܭ��8@F���fIP5�H��(��w{���r��ɯ�FcuCj>��c`h6[�����?��o`�駿���/ʛ�r5v�8Pvڋ`�¬�X֕�S=* �TSk��T�\L%%�E�KY-��O>�a��e'���v?ϯ,�
Iӫ_f��>�^�?�mρ��D�̅*�Qd���K%5MUY��n��	Z�d��n�������������IEND�B`�PK�X��rrmwjournal.recipe#!/usr/bin/env python
##
# Title:        Microwave Journal
# Contact:      Kiavash (use Mobile Read)
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    Kiavash
##
# Written:      Jan 2012
# Last Edited:  Feb 2012
##

# Feb 2012: New Recipe compatible with the MWJournal 2.0 website

__license__ = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'
__copyright__ = 'Kiavash'
__author__ = 'Kaivash'

'''
microwavejournal.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class MWJournal(BasicNewsRecipe):

    title = u'Microwave Journal'
    description = u'Microwave Journal Monthly Magazine'
    publisher = 'Horizon House'
    publication_type = 'magazine'
    INDEX = 'http://www.microwavejournal.com/publications/'

    language = 'en'
    timeout = 30

    Convert_Grayscale = False  # Convert images to gray scale or not

    keep_only_tags = [dict(name='div', attrs={'class': 'record'})]
    no_stylesheets = True
    remove_javascript = True
    remove_tags = [
        dict(name='font', attrs={'class': 'footer'}),    # remove fonts
    ]

    remove_attributes = ['border', 'cellspacing', 'align', 'cellpadding', 'colspan',
                         'valign', 'vspace', 'hspace', 'alt', 'width', 'height']

    # Specify extra CSS - overrides ALL other CSS (IE. Added last).
    extra_css = 'body { font-family: verdana, helvetica, sans-serif; } \
                 .introduction, .first { font-weight: bold; } \
                 .cross-head { font-weight: bold; font-size: 125%; } \
                 .cap, .caption { display: block; font-size: 80%; font-style: italic; } \
                 .cap, .caption, .caption img, .caption span { display: block; margin: 5px auto; } \
                 .byl, .byd, .byline img, .byline-name, .byline-title, .author-name, .author-position, \
                    .correspondent-portrait img, .byline-lead-in, .name, .bbc-role { display: block; \
                    font-size: 80%; font-style: italic; margin: 1px auto; } \
                 .story-date, .published { font-size: 80%; } \
                 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 { font-size: 175%; font-weight: bold; } \
                 h2 { font-size: 150%; font-weight: bold; } \
                 h3 { font-size: 125%; font-weight: bold; } \
                 h4, h5, h6 { font-size: 100%; font-weight: bold; }'

    # Remove the line breaks, href links and float left/right and picture
    # width/height.
    preprocess_regexps = [(re.compile(r'<br[ ]*/>', re.IGNORECASE), lambda m: ''),
                          (re.compile(r'<br[ ]*clear.*/>',
                                      re.IGNORECASE), lambda m: ''),
                          (re.compile(r'<a.*?>'), lambda h1: ''),
                          (re.compile(r'</a>'), lambda h2: ''),
                          (re.compile(r'float:.*?'), lambda h3: ''),
                          (re.compile(r'width:.*?px'), lambda h4: ''),
                          (re.compile(r'height:.*?px'), lambda h5: '')
                          ]

    def print_version(self, url):
        return url.replace('/articles/', '/articles/print/')

    def parse_index(self):
        articles = []

        soup = self.index_to_soup(self.INDEX)
        ts = soup.find(
            'div', attrs={'class': 'box1 article publications-show'})
        ds = self.tag_to_string(ts.find('h2'))
        self.log('Found Current Issue:', ds)
        self.timefmt = ' [%s]' % ds

        cover = ts.find('img', src=True)
        if cover is not None:
            self.cover_url = 'http://www.microwavejournal.com' + cover['src']
            self.log('Found Cover image:', self.cover_url)

        feeds = []
        seen_titles = set()  # This is used to remove duplicant articles
        sections = soup.find('div', attrs={'class': 'box2 publication'})
        for section in sections.findAll('div', attrs={'class': 'records'}):
            section_title = self.tag_to_string(section.find('h3'))
            self.log('Found section:', section_title)
            articles = []
            for post in section.findAll('div', attrs={'class': 'record'}):
                h = post.find('h2')
                title = self.tag_to_string(h)
                # Let's get rid of the useless Puzzler!
                if title.find('The MWJ Puzzler') >= 0:
                    continue
                if title in seen_titles:
                    continue
                seen_titles.add(title)
                a = post.find('a', href=True)
                url = a['href']
                if url.startswith('/'):
                    url = 'http://www.microwavejournal.com' + url
                abstract = post.find('div', attrs={'class': 'abstract'})
                p = abstract.find('p')
                desc = None
                self.log('\tFound article:', title, 'at', url)
                if p is not None:
                    desc = self.tag_to_string(p)
                    self.log('\t\t', desc)
                articles.append({'title': title, 'url': url, 'description': desc,
                                 'date': self.timefmt})
            if articles:
                feeds.append((section_title, articles))
        return feeds
PK�Xd��`iimy_dealz_de.png�PNG


IHDR  ��tRNSn��IDATx��V����&M�4i!�҆@��%K�@C!-��vO?�swww���=��NX���\����.+���e���
���{Ӈޑ`��1�BpIpLA`2���	S\M���W��Mlh�s���Sl�	s�����*�S,��X�<��-�8`�h���TU���Ys�*���AJ�$5����5~W$��v�H����d��Kui�7Wq�S*�o�!�N�1���9+�8L�N֬�����[��3�/R��G^V�ڣ���⥋�I]}��3�E�V7o޼�m�I�U�9 ��m�ٹ����fC�˭�[0f`�?\ߺ�Ǘ�^jll<x��ֽ�������	�~>#�IT���t�����fC��{���������DL-�Ȇ~�{SSӤo'�G'����PQ����d>q�DHs��]�~�Q�6S����	���k����8���0$���U-UE1���q��,3��R#�a�G�06��=LCc#�綿�VL�zx;cȌD�:cbL��;jM�
t�kH��ǚ��*��)�Rk�ȅ���v��)`TD+g-�
�ԙZ���E�Y9ΩfC7e�K���^��5\n�RO��„��_;�7o�]��J2е����I��ǫ[���oJ7��l�P�m�K��`���z����S�`1�1S�sm�#2i�ew��̎��>��j_I�&���Q�_�ȃ�8By��A���&O,,r�7	��N�'�����^�v��ի[vn�6�'�A�{�R>�Xk����P]ΰӭi��8���K"��K\0�C�*Є}�Lp�a�f ���u��YM;�q����
�=��k9y�FZR�Y/f��_�*[)�_��V��)A��Y�|�ɦ	��%1η��_�B�R�4v��5�����e3����9k3��t�wʀ!�dވ���X�4·6�qyLK�=��G-`��d����A��1���}�L���U�P!-�5����K�5VԞ����h`�
��S<pND�;�.qϴ'�"0�,S�6�U�6��w��%?�W[�����8�0�	��	$�CZ<D�l�xe��#�KpE�.\��#˩�3����n��Zᩳ�w���wn��ǡ�ϳ2�_��s������^n���YGY�d�*�*R���0���&�!��+�Bf4m��+��T�\�l��3WN�<�m�ߕ�ݱ����̮V�[Cw!��8��먁��^�JV��n)`H9�"�tSs+����.�٪����S�+�-������F`���B]���Q��98A2�B������V�*��!1������&a\4�<;]NWbN
y���
(#i��G�&x:@�K���"���ϐ��-�����rF�~��Y��:"���6Z�e�e�NE^��b��cB�2�̱AW	��yb�#_�D�a��L�A�o�-rAy�KX���+5ia��n��)BOQf1�R�!��>(��ϒ���y�>DIEND�B`�PK�X\o�KKmy_dealz_de.recipe#!/usr/bin/env python
from __future__ import unicode_literals, division, absolute_import, print_function

from calibre.web.feeds.news import BasicNewsRecipe


class MyDealzDE(BasicNewsRecipe):
    # Title of the Recipe
    title = 'MyDealz'
    # Author
    __author__ = 'Volker Heggemann, VoHe'
    # oldest article to download (in days) 									---- can be edit by user
    oldest_article = 5
    # describes itself, 						 							---- can be edit by user
    max_articles_per_feed = 100
    # Cover Picture
    cover_url = 'https://pbs.twimg.com/profile_images/817053687545741313/0wFqvfqC_400x400.jpg'
    # speed up the download on fast computers be careful (I test max.20)
    # ---- can be edit by user
    simultaneous_downloads = 10
    # description, some Reader show this in titlepage
    description = u'MyDealz - Shopping Deals for Germany'
    # Who published the content?
    publisher = u'https://www.mydealz.de'
    # What is the content of?
    category = u'Shopping'
    # describes itself, 						 							---- can be edit by user
    use_embedded_content = False
    # describes itself, 						 							---- can be edit by user
    language = 'de'
    # encoding of content. e.g. utf-8, None, ...
    # ---- can be edit by user
    encoding = 'utf-8'
    # Removes javascript- why keep this, we only want static content
    remove_javascript = True
    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True

    # remove the rubbish (in ebook)
    auto_cleanup = True
    # now the content description and URL follows
    # feel free to add, wipe out what you need	 							---- can be edit by user
    #
    # some of this are double
    #
    #
    # Make some tests, may you first comment all of them out, and step by step you add what you'll need?
    #

    feeds = [
        ('MyDealz', 'https://www.mydealz.de/rss/alle'),
    ]
PK�XW���myapple_pl.png�PNG


IHDR�ayIDATxڕ�tM����趶m��68Ʃm۶��zy9vc;�m���XLg�v������(F:�6\�2t�̉��.G���w�F8�����aǟiyy����)���#�m���߲���A$A)*2��H���@�?��Z��`����jYT�؛ [Ӽ`{�7jZ;�=[�=�>~A�4��rմ�U�������'D�}�&k�q��g
�q�����9��jh9��T�a����Kjn͞n�Y�
�W��|Ӓx��S�	�i��ϝ5p��Hf%������+�F @�ّ}%�y5'�٫b���0�$
0�7����5�7��� @�93�(@M�+5�N���f����9,��f<�R�8S\���I��?M���?*�W3h��U���9$(%�5���>����ς��Rr��n}��^�l���cԌ읚�B]׺:V�B���^^��d��Y�8)$yZ���dmX1�H�
��Գ�&*|OlU��5z+�O�eq���h�W�rZ�Ύ6��3bK��������`�Wbk95Rk柑~ElS�$��{��k��LX�8C�����GU9��Q�Z���{�YxA��QIEND�B`�PK�X!�W�88myapple_pl.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class MyAppleRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = u'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'

    title = u'MyApple.pl'
    category = u'News'
    description = u' Największy w Polsce serwis zajmujący się tematyką związaną z Apple i wszelkimi produktami tej firmy.'
    cover_url = ''
    remove_empty_feeds = True
    no_stylesheets = True
    oldest_article = 7
    max_articles_per_feed = 100000
    recursions = 0

    no_stylesheets = True
    remove_javascript = True
    simultaneous_downloads = 3

    keep_only_tags = [dict(name='article')]

    remove_tags = [dict(name='a', attrs={'class': 'twitter-follow-button'}),
                   dict(name='ul', attrs={'class': 'list-inline text-muted small mb-0 mt-1'})]

    extra_css = '''
                    body {font-family: verdana, arial, helvetica, geneva, sans-serif ;}
                    td.contentheading{font-size: large; font-weight: bold;}
                    '''

    feeds = [
        ('Wpisy', 'https://myapple.pl/posts.atom'),
    ]

    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
PK�X�w*b$$n_kaliningrad.png�PNG


IHDR  ���IDATHK}VMoY=��W�c;���$Ab3B(B�Ė�X"l`ɿ@,X $��!V��f���!1��!3C�G�$�nuU�{X���� ����U}�=��{�8�h�H@9Ԇ��:k�j��Em�7�hc�ĸU�F�Ug�Ym(�� @�$�%�d�
PBȦ��F7&C2�F7��B0@�BY&��entfp���圦��y�8a��_j��7H"a$	�!����FJA�:�d��������ӫ�6o}��K� �0�D#1�$Ji�ħȹ�I3���[N���Y�(�.�ʱp3Ҭ�a��
!��L���o|�x��� K�B�[}*L��2Ya �b��y���0"���D	��'�PǦ�!v-)U��!�qЌ��o�׏�o3@�CAZ�rjm K�$`�	v-���.l�V��~����n�
I0CQ���21�J��R�y�9��8|��UF�H�b�!��N;Q��I�.L�ANoO�6A-�?]}t��nP(P�b9J�1S�W���觌tcr��ճ^9�fU>�����L~��I���z�N=���V>�s�����A} ���B��n��7��E���gЍ���0N��C	�g۫�M�ə��i����Z���$w�3��%�t��8��
K��/7���dL$g��I%�D��
�'d3)�V��\Շ(vL�����x���Ȁi�Y��k��>]�#"�8l����̰��2Ο�|�J��q��.d�&���h��ur[�o��1hSN����a>I����bJb¬�����E<n�v���koFS�=��Y{��ܓM�O�ԫ~�`�ЭGw��v�_~�8��N&L��O~u��Mni�?�������'C�b�͋+_���8[ ��Ń�~٫�ʙ`�	(z�� M�D��h ��}.�n"�&�>�,yu�~��Un�<A�4����L2d{A�@�D�΋ �����P<��F-��	hJT2HL���Q*@Es���o�&g��Qz��X�B{�[�A(L�X���@���3c_��ٴ�S���3�dg;p ���!Bɳ��|�7�����_3�s�҈�H@A�&V�`Bbu�"�S޵n A�:}�S��o��f4��n��_"�����}~��W�Sa��3�ڕ��S��'䣤��]�����n�N�
��x~M������K׊�A�2�n�r�Jf�b��3G&-:ټx����#�Q-H�i6��4��~�9c�?|�}UKERH�*T0kR�$�@$&�z��V&��t�Jk�f{ȹ��u�l��6T��H�����_‰j�l��GW�~�����]3qPŹӀv��C�g U[�7@�Ɩ�Ȅ��f>�t��Tu�[�"H���_z��*�5���x���J��L&��K�XDX���h�u����v���`WZ�Fϵ����0�j�$^�i�F�����s��-e_o`�ˑ�70�BN�8���x���B�gv�BIEND�B`�PK�X,�ttn_kaliningrad.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class NewKaliningrad(BasicNewsRecipe):
    title = '\u041D\u043E\u0432\u044B\u0439 \u041A\u0430\u043B\u0438\u043D\u0438\u043D\u0433\u0440\u0430\u0434'
    __author__ = 'bugmen00t'
    description = '\u0420\u0435\u0433\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u043F\u043E\u0440\u0442\u0430\u043B \u041A\u0430\u043B\u0438\u043D\u0438\u043D\u0433\u0440\u0430\u0434\u0441\u043A\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0438 \u0433\u043E\u0440\u043E\u0434\u0430 \u041A\u0430\u043B\u0438\u043D\u0438\u043D\u0433\u0440\u0430\u0434\u0430.'  # noqa
    publisher = '\u0417\u0410\u041E "\u0422\u0432\u0438\u043A \u041C\u0430\u0440\u043A\u0435\u0442\u0438\u043D\u0433"'
    category = 'news'
    cover_url = u'https://www.newkaliningrad.ru/images/logo.gif'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 3
    max_articles_per_feed = 100

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'content'})

    remove_tags = [dict(name='div', attrs={'class': 'continue-box'})]

    feeds = [(
        '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
        'https://www.newkaliningrad.ru/news/rss.xml'
    )]
PK�X��\��n_plus_one.png�PNG


IHDR(-S�PLTE�`�`�a�Fx-�[�U}/
�Y�_�R`$
p*�Y�b�9�:�O6�U�G�4�a�Xq+'�V�8 A�@8�V�KF$
�:�I,�7Y"	�1
70�V�KE#
�9�W�7Z"	�W6�H�5�Z�1
�?�]�B�2�D�X�QQCg'
�_�^�^p=	inIDAT�cd@�d	0�!�db��?9��gF>��/v���*��������/0�����x�,�d�x����?��Ìn�;�w���4a��I��Qxo]s���IEND�B`�PK�X��6

n_plus_one.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1467724863(BasicNewsRecipe):
    title = 'N+1'
    __author__ = 'bugmen00t'
    description = '\u041D\u0430\u0443\u0447\u043D\u043E-\u043F\u043E\u043F\u0443\u043B\u044F\u0440\u043D\u043E\u0435 \u0440\u0430\u0437\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0438\u0437\u0434\u0430\u043D\u0438\u0435 \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \u043F\u0440\u043E\u0438\u0441\u0445\u043E\u0434\u0438\u0442 \u0432 \u043D\u0430\u0443\u043A\u0435, \u0442\u0435\u0445\u043D\u0438\u043A\u0435 \u0438 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u044F\u0445 \u043F\u0440\u044F\u043C\u043E \u0441\u0435\u0439\u0447\u0430\u0441. \u041D\u043E\u0432\u043E\u0441\u0442\u0438, \u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u0441\u0442\u0430\u0442\u044C\u0438, \u0431\u043B\u043E\u0433\u0438 \u2014 \u044D\u0442\u043E \u0432\u0441\u0435 \u043F\u0440\u043E \u043D\u0430\u0441. \u041C\u044B \u0438\u0449\u0435\u043C \u0441\u0430\u043C\u043E\u0435 \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u043E\u0435 \u0438 \u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C \u044D\u0442\u043E \u0447\u0438\u0442\u0430\u0442\u0435\u043B\u044F\u043C \u0432 \u043F\u043E\u043D\u044F\u0442\u043D\u043E\u0439, \u044F\u0441\u043D\u043E\u0439, \u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0439 (\u0438 \u0441 \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u043E\u0439 \u0442\u043E\u0447\u043A\u0438 \u0437\u0440\u0435\u043D\u0438\u044F) \u0444\u043E\u0440\u043C\u0435. \u041C\u044B \u2014 \u0447\u0443\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435, \u0447\u0435\u043C \u043F\u0440\u043E\u0441\u0442\u043E \u043D\u0430\u0443\u043A\u0430!'  # noqa
    publisher = 'N+1'
    category = 'news'
    cover_url = u'https://nplus1.ru/i/logo.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = False
    oldest_article = 14
    max_articles_per_feed = 100

    #    remove_tags_before = dict(name='article', attrs={'class':'content'})
    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'body'})

    remove_tags = [
        dict(name='div', attrs={'class': 'share-incut'}),
        dict(name='div', attrs={'class': 'share-mobile'})
    ]

    feeds = [
        (
            '\u041d\u043e\u0432\u043e\u0441\u0442\u0438 \u043d\u0430\u0443\u043a\u0438',
            'https://nplus1.ru/rss'
        ),
    ]
PK�XՍ����nachdenkseiten.png�PNG


IHDR  �Tg�PLTE��/�.>�ES�s}݀�갶��������*jIDAT(Sc`��<��u
�t0@�L���PIEND�B`�PK�X	����nachdenkseiten.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe


class Nachdenkseiten(BasicNewsRecipe):
    title = u'Nachdenkseiten'
    __author__ = 'jrda'
    publisher = 'www.nachdenkseiten.de Albrecht Mueller und Dr. Wolfgang Lieb'
    description = 'NachDenkSeiten - Die kritische Website'
    category = 'news'
    oldest_article = 1
    use_embedded_content = False
    language = 'de'
    timefmt = '[%a, %d %b, %Y]'
    max_articles_per_feed = 20
    no_stylesheets = True
    encoding = 'utf-8'
    remove_javascript = True
    keep_only_tags = [
        {'id': 'content'}]

    feeds = [
        ('News', 'http://www.nachdenkseiten.de/?feed=rss2'),
    ]
PK�XZ�n]��nacional_cro.png�PNG


IHDRb��	PLTE����&�4�tRNS@��f'IDATx�c@�U� qYX��@FL
�$pj��\`zIEND�B`�PK�X65?F//nacional_cro.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
nacional.hr
'''

import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class NacionalCro(BasicNewsRecipe):
    title = 'Nacional - Hr'
    __author__ = 'Darko Miletic'
    description = "news from Croatia"
    publisher = 'Nacional.hr'
    category = 'news, politics, Croatia'
    oldest_article = 2
    max_articles_per_feed = 100
    delay = 4
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'hr'

    lang = 'hr-HR'
    direction = 'ltr'

    extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif}'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    remove_tags = [dict(name=['object', 'link', 'embed'])]

    feeds = [(u'Najnovije Vijesti', u'http://www.nacional.hr/rss')]

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def print_version(self, url):
        rest, sep, disc = url.rpartition('/')
        return rest.replace('/clanak/', '/clanak/print/')
PK�XQ��RRnacionred.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1291022049(BasicNewsRecipe):
    title = u'NacionRed.com'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'es'
    __author__ = 'Arturo Martinez Nieves'

    feeds = [(u'NacionRed.com', u'http://feeds.weblogssl.com/nacionred?format=xml')]
PK�X�����nadacni_fond_proti_korupci.png�PNG


IHDR�a�IDATxڅ��`��i�E$ � �}� P��!L�o@A��/.���Q{z�ڽ�����"M��|�"�9�j�J��,��R5zJY�Q�`�6�����%k1T��"�_�_Xk���^�\����s�s����h�k�mg��U!��i�Y�E)�g�2D��8��B�lj�R���N�UiECIEND�B`�PK�X�g�/  !nadacni_fond_proti_korupci.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class nfpkRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Nadační fond proti korupci'
    publisher = u''
    description = 'nfpk.cz'
    oldest_article = 7
    max_articles_per_feed = 20
    use_embedded_content = False
    remove_empty_feeds = True

    feeds = [
        (u'Aktuality', u'http://feeds.feedburner.com/nfpk')
    ]

    language = 'cs'
    cover_url = 'http://www.nfpk.cz/_templates/nfpk/_images/logo.gif'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                            """

    remove_attributes = []
    keep_only_tags = [dict(name='div', attrs={'id': 'content'})]
PK�XFx��CCnajwyzszy_czas.png�PNG


IHDR�a
IDATxڕS=oA}{>@�P>\Є:`p$�"
$RP� �h��� �����j,w��)Dr1�o/�����2��^)tY�73;�v}+��y��^r�!����<�1���
*�_<��Zl�ן<��eaE��ih�a$�h�L46�t:1����"�E������͖cCn��r]8AN�V��L0�5�o\XB�k����P4"�V�D���!˱�l���5l޻�2W�2Ext�
�����`gk@�!�����`����P�Қ
yU�}>U.E�)�n���eĵ3�i��A��Te�$�$$�}��v�76ڋ�>3���.j�52���ϸ�na!��i�+���m�����["�������,b4����[�-cB��M��!��~ù�S(2	��d�
��%eɰ����L2�����䡮Ic?�޻��s�f�}�X8���|��]r[��cCW%X4O6@#��en�l��Sn@0��l��3\���3}���cg�^9��b�#b��IEND�B`�PK�X�R��najwyzszy_czas.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com>'

'''
nczas.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class nczas(BasicNewsRecipe):
    title = u'Najwy\u017cszy Czas'
    __author__ = 'teepel <teepel44@gmail.com>'
    language = 'pl'
    description = 'Wiadomości z nczas.com'
    INDEX = 'http://nczas.com'
    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = True
    remove_empty_feeds = True
    simultaneous_downloads = 5
    remove_javascript = True
    remove_attributes = ['style']
    no_stylesheets = True

    feeds = [(u'Najwyższy Czas', u'http://nczas.com/feed/')]
PK�X҄xqaanakedcapitalism.png�PNG


IHDR�a(IDATx�LS5�Aܓ"G�<@s<�Ӻ��R��	����1�A���5=��S5���_�� ��4�H�E�Y��,!��tN�~��l?%����� /���~W-8ne#�O*0�g�d�@`xߞ��%���3�VV�
��Y]d8@��(�JȦW�{z�sS螝C:��+1|~���пy��Jc��� C�o`��:�|�c-C�^�>���L�@Z+�i����蝝R�(����JX@����]<�;�o�Y�!���3sp�� )�*���D%ċ��t�%��m�K]j�(�{7)���dP�^u�4�6�E����=�Hp%�/���ߍ|a��D��B�yvR_��U��#v�:�[\
�6�ȝ"�"9QU��F�[��oP/QmlGVk������ۘM��(���L~�����EL�-A�{�Y�&�
�&d� ��Z��l�;�J#��6�y���#��n�y�l�z�0��+<?Q�O����WX	o^����M!�5�-	�ڲ�Y\L,�������/<�y�6��IEND�B`�PK�X̣��		nakedcapitalism.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.nakedcapitalism.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class nakedcapitalism(BasicNewsRecipe):
    title = 'Naked Capitalism'
    __author__ = 'Darko Miletic'
    description = 'Commentary on current economic and financial news.'
    publisher = 'Aurora Advisors, Inc.'
    category = 'news, business, finances, money, banking'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'
    extra_css = (' #BlogTitle{font-size: x-large; font-weight: bold}'
                 ' #BlogDate{font-size: small} ')
    auto_claenup = False

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    feeds = [
        (u'Articles', u'http://www.nakedcapitalism.com/feed'),
        (u'Comments', u'http://www.nakedcapitalism.com/comments/feed'),
    ]

    keep_only_tags = [
        dict(name='header', attrs={'class': 'entry-header'}),
        dict(name='div', attrs={'class': 'pf-content'})
    ]

    remove_tags = [dict(name=['object', 'link', 'base'])]
PK�Xv+��nasa.png�PNG


IHDR00W���IDATx��YT�%,�;��Gp׸�www7C���6�www���oާ9��&	�S��z�7}�꾒�z?��AJ��~
���>���)��e
#���|>���Im]�WQ�h���u��<�v��a�ږ�z{�6y�n�C�(PAP*H	險6�=�'����UP�^�
���Ջ�>��l
A_!�4*���;
%�0���Ә�4f�V�d�2�7��*�7թRu�P��;�"���҂�rP��3
|d�R�JTk�X�y/����ZJzU�Z�NAj�r�u�����I����
�&��`��� � 
ҩR���h+�r��hR6(6�N����fk�VN9�\�O����~�>)��A�'A¦N,H��*FB#�8
e���#��$Xe���j5���M�/Ѐ�:�W:��/<-6i&�j�%���B��]�T�w�!?���IX4���uS���`��'��:�#�^j��4`u��K�I���„��&�N�a�]h5b+"F%�Ә�Ѱ�:��D��0b?H��A�!{Y�G��
k�h�6��&�������)[�e�c���dZ?.���\�6#�"���&e"�IU��G'£�r�F��u"B���t���즱��������	�������! G�0���7Z?,��m|,kNJ�Z��ӆ�% ��|���a�
h=lJ����L����b���5G�`�K�/��>"���.˒:G��Nj�>=&&�X�R�$��s?�KYHD�F�e�/	�
D�tn@up��q�ᚥ+Z҇�*�B�<�x�OV�0��kR2��
^%pm����*6_$�s��T�����5�t[Io|�4gל�P����d�0cj�	I�e��!-
�VL�}iD%-#�y	:?�Ԛ�I��Uu�em���	)�����"+������G�C��T�!���y%�J�r2���'�&��'�{�R{�C`��vn���U�FO��5ޚ:�w7\���=v~p�9�>�-�C�u2��$���%T$@Wk�]��
�<*���U�t���sѵr$�ṹA��Lp��r��8��r
`�>MD��Aa?eE�,B��C�}��L�%�uv�"���=�
���y{`�O)�E	��)P��O�"T�Y�2kC{�N�!�d���Ll�ʬ����ko��Ux}H�N(�qoHNHu!')–���g�u�8��v���Ǯ�7��i��#�[�;�����!��|x�_���W���-�9r�nD	���1S˷Ʊ�Ax=l,�58yX��g��b���0����g<o�	W�o�r����5��1K��@���k�/@�u�/�0+�x����<l�c1h�N��C�����Hr*��9��Y���N��xr��u�U�^l?tv��^}4V؇㏈�H�����a�6QW4���c�翯�әZ,��H<�:
����V÷b��=X��,ܣ�`�F�k���Ƈ�����ܻ�tO�2q�){<�~ܼ�}�'�Z���1bƺ���P4��1+O����HI�Ú��(�#�(��}�b
�E���3X���켈�?��ÿ��Eǰq���62�v���W1���>�����4$N\�@�a0w��i�!���=�f;N��u����d�	�����ѓ�����W���J���>^�GQ�X�x��h;�����q��3�^������÷\<���ql�e3�#%#bɇo�p�Jd 3�mβ�xx�&�P}�C�g�\����j�s|�-Ǧ!|����3we҈��R�9oV����a�ֳ7j-�5���� ��;1�3�u(ZD,��'�q��c�9~/^�h����R`�B���rm,��C��а�z��܇;�_2\Ǚ��NK;f@dR(:G
��{����r��c;���)��n탤��P�C���WP�O)���#�w�&���{��X�t��Z|�����;�y�nP��Aߩ�q��x���Lہv��O�ň�{�Ƌ�������%��}��=���,�b�5��g��w�1����=s�'c��-0��'��\�цS���(lxmG�ô:`�N��2OR�x�~Ĭ=��k�o����9��N��G���M;}�v]B�a[D;�|�f��� Rr���h�)l�=w_B��I�}ak?3����t+G����#�W�pů�(��Z.r�Ԭ�ڈj̿�2:���J�2f��nzL�ך��K�£��	�!XQE�]��E=�GO@-o�gn�P���S���,d��6Y`�\��}X;X��E�
���!��5(��U���7���W�+�{����\���i�
24�gIb��ޙ��"����D��t���~F3.5s�(��P��$�/
�ҹ�F'���]b����("ӆ4rn�@D�ݫ��"�e�02��BU�5ssq�<��=���P�V�:4��/~�ĐJ�P�}jvX�g�!r�	p���_G�^}�^��9�k�P/N��:���5�=�PMc#=!�R:X%<*Q��k6T�m��!��G�0�z"z�1�Et�Q0��C���K$�~(�'�3OР2_eG�2RWZ"P!6�)GG�S�)�D��$�q�l��t�!Ҟ�_PF��d��`eh�d�ʣ�٘2��S�'��}���������0ĩa�8i^}���оjo���8���j�MZ�(�
T�r8֋st�@��Bw[�&�^�^S��j�o� �N'n)���0	Q�<��Ч�B�*ݰܩ.�9)aZd�YC�.Uɰk^@F�8ԍE�����~�8�s}�9��~����x���ܣg9�����J�Y�����B
s���K���8n�*�

	�UV;QА�N+�\�8;S�9{GV�^�~�I�4C�8�0ʢ>��Bb�Ʃܫ�>���<��
��Uѫv5�tt�{��N3�8��l!)�D��_�4Zd6���)��0
aϓ�j�d�3�N����o�~$����fQ�s�c!����}~�a��ϳ����{g���,r|��ٴ=vF��ߩ�M
���rz�)��.��ΖY�찦!c3�Ԩ��>/�~���o��ےR�V��x���!�4���u��5q �udR��'}�T���ŷ6����礆4Ɗ�hPWn�q��ϕL���`z�)iR�U��m��\|�C~��;UVϨ �E�IEND�B`�PK�X�hm��nasa.recipe# Copyright (C) 2008 B.Scott Wxby [bswxby] &
# Copyright (C) 2007 David Chen SonyReader<at>DaveChen<dot>org
##
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
##
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
##
# Version 0.3-2008_2_28
# Based on WIRED.py by David Chen, 2007, and newsweek.py, bbc.py, nytimes.py by Kovid Goyal
##
# Usage:
# >web2lrf --user-profile nasa.py
# Comment out the RSS feeds you don't want in the last section below
##
# Output:
# NASA [YearMonthDate Time].lrf
##
'''
Custom User Profile to download RSS News Feeds and Articles from Wired.com
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe


class NASA(BasicNewsRecipe):

    title = 'NASA'
    timefmt = ' [%Y%b%d  %H%M]'
    language = 'en'

    description = 'News from NASA'
    __author__ = 'Scott Wxby & David Chen'
    no_stylesheets = True

    # Don't grab articles more than 30 days old
    oldest_article = 30

    preprocess_regexps = [(re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
                          [
        # Fix the encoding to UTF-8
        (r'<meta http-equiv="Content-Type" content="text/html; charset=(\S+)"',
         lambda match: match.group().replace(match.group(1), 'UTF-8')),

        # Remove any banners/links/ads/cruft before the body of the article.
        (r'<body.*?((<div id="article_body">)|(<div id="st-page-maincontent">)|(<div id="containermain">)|(<p class="ap-story-p">)|(<!-- img_nav -->))', lambda match: '<body><div>'),  # noqa

        # Remove any links/ads/comments/cruft from the end of the body
        # of the article.
        (r'((<!-- end article content -->)|(<div id="st-custom-afterpagecontent">)|(<p class="ap-story-p">&copy;)|(<div class="entry-footer">)|(<div id="see_also">)|(<p>Via <a href=)|(<div id="ss_nav">)).*?</html>', lambda match: '</div></body></html>'),  # noqa

        # Correctly embed in-line images by removing the surrounding
        # javascript that will be ignored in the conversion
        (r'<a.*?onclick.*?>.*?(<img .*?>)', lambda match: match.group(1),),

        # This removes header and footer information from each print
        # version.
        (r'<!-- Top Header starts -->.*?<!-- Body starts -->',
         lambda match: '<New Stuff>'),
        (r'<hr align="center" width="200"><p align="center">.*?<!-- Press Release standard text ends -->',
         lambda match: '<New Stuff>'),
        (r'<!-- Top Header starts -->.*?<!---->', lambda match: '<New Stuff>'),

        # This removes the "download image" of various sizes from the Image of
        # the day.
        (r'<div id="download_image_box_print">.*?<div id="caption_region_print">',
         lambda match: '<New Stuff>'),

    ]
    ]

# NASA's print pages differ only by the ending "_prt.htm", so I've
# replaced them below.

    def print_version(self, url):
        return url.replace('.html', '_prt.htm')

# Comment out the feeds you don't want retrieved.
# Or add any new new RSS feed URL's here, sorted alphabetically when converted to LRF
# If you want one of these at the top, append a space in front of the name.
# Mars feed may not work, as it is now considered "legacy" by NASA.

    feeds = [
        (' Breaking News', 'https://www.nasa.gov/rss/dyn/breaking_news.rss'),
        ('Image of the Day', 'https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss'),
        ('Mars Exploration', 'https://marsmobile.jpl.nasa.gov/rss/?feed=news&category=all'),
        ('Shuttle and Station News', 'https://www.nasa.gov/rss/dyn/shuttle_station.rss'),
        ('Solar System and Beyond News', 'https://www.nasa.gov/rss/dyn/solar_system.rss'),
        ('Education News', 'https://www.nasa.gov/rss/dyn/educationnews.rss'),
        ('Earth News', 'https://www.nasa.gov/rss/dyn/earth.rss'),
        ('Aeronautics News', 'https://www.nasa.gov/rss/dyn/aeronautics.rss'),
    ]
PK�X�<�""naszdziennik.png�PNG


IHDR��h6�IDATxڔP�j�P�*U�[���]�R!T�M~�m��J�Lw�D�R�#r{-����	����3Ü3��RJ�[쎹�xxM�䄌�$I��(���,B]ױ,[U��몪�.�2�~0���5M�l��0��v��EQd�f�� �m��x����5m����t:�3˲��^�,����CQa�q<�p/���Ð8���'d��Gʃa��2$�g�o�Cח�2I����q��"�4A�m[Ax��	���q�4�#YEq��㸫>��j%ca0ׂB*�� �p�svuqPm,J34� �vH֞�+t$���GI��+�~ﺎ��E������mG?J�xs.>b�F˲Pe�<�T�D�[V�����!7M����m[�a!{�a�6f��'�55u��)d��^A)e�5C�$y��qkxTE�e�<GQ�,KY�h&�1��q]7Chy���s���#�躎��(�!�i�����\�
�~H�+IEND�B`�PK�X?�	

naszdziennik.recipe#!/usr/bin/env python

__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe


class naszdziennik(BasicNewsRecipe):
    title = u'Nasz Dziennik'
    __author__ = 'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'
    description = u'Nasz Dziennik - Ogólnopolska gazeta codzienna. Podejmuje tematykę dotyczącą życia społecznego, kulturalnego, politycznego i religijnego. Propaguje wartości chrześcijańskie oraz tradycję i kulturę polską.'  # noqa
    masthead_url = 'http://www.naszdziennik.pl/images/logo-male.png'
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True

    keep_only_tags = [dict(attrs={'id': 'article'})]

    # definiujemy nową funkcje; musi zwracać listę feedów wraz z artykułami
    def parse_index(self):
        # adres do parsowania artykułów
        soup = self.index_to_soup('http://www.naszdziennik.pl/news')
        # deklaracja pustej listy feedów
        feeds = []
        # deklaracja pustego słownika artykułów
        articles = {}
        # deklaracja pustej listy sekcji
        sections = []
        # deklaracja pierwszej sekcji jako pusty string
        section = ''

        # pętla for, która analizuje po kolei każdy tag "news-article"
        for item in soup.findAll(attrs={'class': 'news-article'}):
            # w tagu "news-article szukamy pierwszego taga h4"
            section = item.find('h4')
            # zmiennej sekcja przypisujemy zawartość tekstową taga
            section = self.tag_to_string(section)
            # sprawdzamy czy w słowniku artykułów istnieje klucz dotyczący sekcji
            # jeśli nie istnieje to :
            if section not in articles:
                # do listy sekcji dodajemy nową sekcje
                sections.append(section)
                # deklarujemy nową sekcje w słowniku artykułów przypisując jej
                # klucz odpowiadający nowej sekcji, którego wartością jest
                # pusta lista
                articles[section] = []
            # przeszukujemy kolejny tag "title-datetime"
            article_title_datetime = item.find(
                attrs={'class': 'title-datetime'})
            # w tagu title-datetime znajdujemy pierwszy link
            article_a = article_title_datetime.find('a')
            # i tworzymy z niego link absolutny do właściwego artykułu
            article_url = 'http://naszdziennik.pl' + article_a['href']
            # jako tytuł użyty będzie tekst pomiędzy tagami <a>
            article_title = self.tag_to_string(article_a)
            # a data będzie tekstem z pierwszego taga h4 znalezionego w tagu
            # title-datetime
            article_date = self.tag_to_string(
                article_title_datetime.find('h4'))
            # zebrane elementy dodajemy do listy zadeklarowanej w linijce 44
            articles[section].append(
                {'title': article_title,  'url': article_url, 'date': article_date})
        # po dodaniu wszystkich artykułów dodajemy sekcje do listy feedów,
        # korzystając z list sekcji znajdujących się w słowniku
        for section in sections:
            feeds.append((section, articles[section]))
        # zwracamy listę feedów, której parsowaniem zajmie się calibre
        return feeds
PK�XV�M΄�natemat_pl.png�PNG


IHDRb��PLTE�U��l�OtRNS@��f&IDATx�c@"P��1ԁ�� �h���Ȃ��:Y@��:�E�0IEND�B`�PK�Xa��11natemat_pl.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class NaTemat(BasicNewsRecipe):
    title = u'NaTemat.pl'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = 'fenuks'
    description = u'informacje, komentarze, opinie'
    category = 'news'
    language = 'pl'
    preprocess_regexps = [(re.compile(u'Czytaj też\\:.*?</a>', re.IGNORECASE), lambda m: ''), (re.compile(u'Zobacz też\\:.*?</a>', re.IGNORECASE), lambda m: ''),  # noqa
                          (re.compile(u'Czytaj więcej\\:.*?</a>', re.IGNORECASE), lambda m: ''), (re.compile(u'Czytaj również\\:.*?</a>', re.IGNORECASE), lambda m: '')]  # noqa
    cover_url = 'http://blog.plona.pl/wp-content/uploads/2012/05/natemat.png'
    no_stylesheets = True
    keep_only_tags = [dict(id='main')]
    remove_tags = [dict(attrs={'class': ['button', 'block-inside style_default', 'article-related',
                                         'user-header', 'links']}), dict(name='img', attrs={'class': 'indent'})]
    feeds = [(u'Artyku\u0142y', u'http://natemat.pl/rss/wszystkie')]
PK�X%ƃnoo
natgeo.png�PNG


IHDR(-SPLTE���n�DtRNS@��fIDATx�c��������	+�QG	�IEND�B`�PK�X���}ff
natgeo.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

import json
from pprint import pformat

from calibre.web.feeds.news import BasicNewsRecipe
from calibre import prepare_string_for_xml as escape
from calibre.utils.iso8601 import parse_iso8601


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def extract_json(raw):
    s = raw.find("window['__natgeo__']")
    script = raw[s:raw.find('</script>', s)]
    return json.loads(
        script[script.find('{'):].rstrip(';'))['page']['content']['article']


def parse_contributors(grp):
    for item in grp:
        line = '<div class="auth">' + escape(item['title']) + ' '
        for c in item['contributors']:
            line += escape(c['displayName'])
        yield line + '</div>'


def parse_lead_image(media):
    if 'dsc' in media['image']:
        yield '<p><div><img src="{}" alt="{}"></div>'.format(
            escape(media['image']['src'], True), escape(media['image']['dsc'], True))
    else:
        yield '<p><div><img src="{}"></div>'.format(escape(media['image']['src'], True))
    if 'caption' in media:
        yield '<div class="cap">' + media['caption'] + '</div>'
    if 'credit' in media:
        yield '<div class="cred">' + media['credit'] + '</div>'
    yield '</p>'


def parse_body(item):
    c = item['cntnt']
    if item.get('type') == 'inline':
        if c.get('cmsType') == 'listicle':
            if 'title' in c:
                yield '<h3>' + escape(c['title']) + '</h3>'
            yield c['text']
        elif c.get('cmsType') == 'image':
            for line in parse_lead_image(c):
                yield line
        elif c.get('cmsType') == 'imagegroup':
            for imgs in c['images']:
                for line in parse_lead_image(imgs):
                    yield line
        elif c.get('cmsType') == 'pullquote':
            if 'quote' in c:
                yield '<blockquote>' + c['quote'] + '</blockquote>'
        elif c.get('cmsType') == 'editorsNote':
            if 'note' in c:
                yield '<blockquote>' + c['note'] + '</blockquote>'
    else:
        if c['mrkup'].strip().startswith('<'):
            yield c['mrkup']
        else:
            yield '<{tag}>{markup}</{tag}>'.format(
                tag=item['type'], markup=c['mrkup'])


def parse_article(edg):
    sc = edg['schma']
    yield '<h3 class="sub">' + escape(edg['sctn']) + '</h3>'
    yield '<h1>' + escape(sc['sclTtl']) + '</h1>'
    yield '<div class="byline">' + escape(sc['sclDsc']) + '</div><br>'
    for line in parse_contributors(edg['cntrbGrp']):
        yield line
    ts = parse_iso8601(edg['mdDt'], as_utc=False).strftime('%B %d, %Y')
    yield '<div class="time">Published: ' + escape(ts) + '</div>'
    if 'readTime' in edg:
        yield '<div class="time">' + escape(edg['readTime']) + '</div><br>'
    if edg.get('ldMda', {}).get('cmsType') == 'image':
        for line in parse_lead_image(edg['ldMda']):
            yield line
    for item in edg['bdy']:
        for line in parse_body(item):
            yield line


def article_parse(data):
    yield "<html><body>"
    for frm in data['frms']:
        if not frm:
            continue
        for mod in frm.get('mods', ()):
            for edg in mod.get('edgs', ()):
                if edg.get('cmsType') == 'ImmersiveLeadTile':
                    if 'image' in edg.get('cmsImage', {}):
                        for line in parse_lead_image(edg['cmsImage']):
                            yield line
                if edg.get('cmsType') == 'ArticleBodyTile':
                    for line in parse_article(edg):
                        yield line
    yield "</body></html>"


class NatGeo(BasicNewsRecipe):
    title = u'National Geographic'
    description = 'News articles from The National Geographic, Download Monthly.'
    language = 'en'
    encoding = 'utf8'
    publisher = 'nationalgeographic.com'
    category = 'science, nat geo'
    __author__ = 'Kovid Goyal, unkn0wn'
    description = 'Inspiring people to care about the planet since 1888'
    timefmt = ' [%a, %d %b, %Y]'
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = ['style']
    remove_javascript = False
    masthead_url = 'https://i.natgeofe.com/n/e76f5368-6797-4794-b7f6-8d757c79ea5c/ng-logo-2fl.png?w=600&h=600'
    remove_empty_feeds = True
    resolve_internal_links = True
    ignore_duplicate_articles = {'url'}

    extra_css = '''
        .sub, blockquote { color:#404040; }
        .byline, i { font-style:italic; color:#202020; }
        .cap {text-align:center; font-size:small; }
        .cred {text-align:center; font-size:small; color:#404040; }
        .auth, .time { font-size:small; color:#5c5c5c; }
    '''

    def get_cover_url(self):
        # soup = self.index_to_soup('https://www.nationalgeographic.com/magazine/')
        # png = re.findall('https://i\.natgeofe\.com\S+?national-geographic-\S+?\.jpg', soup.decode('utf-8'))
        from datetime import date
        url = 'https://www.nationalgeographic.com/magazine/issue/' + (date.today().strftime('%B-%Y')).lower()
        soup = self.index_to_soup(url)
        png = soup.find('meta', attrs={'property':'og:image'})['content'].split('?')
        return png[0] + '?w=1000&h=1000'

    def parse_index(self):
        pages = [
            'https://www.nationalgeographic.com/animals',
            'https://www.nationalgeographic.com/environment',
            'https://www.nationalgeographic.com/history',
            'https://www.nationalgeographic.com/science',
            'https://www.nationalgeographic.com/travel'
        ]

        feeds = []

        for sec in pages:
            soup = self.index_to_soup(sec)
            parsed = self.articles_from_soup(soup)
            if parsed:
                feeds += parsed
        return feeds

    def articles_from_soup(self, soup):
        ans = {}
        for article in soup.findAll('article'):
            a = article.find('a')
            url = a['href']
            if url.startswith('/'):
                url = 'https://www.nationalgeographic.com' + url
            section = self.tag_to_string(article.find(**classes('SectionLabel')))
            if section.startswith('Paid Content'):
                continue
            title = self.tag_to_string(article.find(**classes('PromoTile__Title--truncated')))
            articles = ans.setdefault(section, [])
            articles.append({'title': title, 'url': url})
        self.log(pformat(ans))
        return list(ans.items())

    def preprocess_raw_html(self, raw_html, url):
        data = extract_json(raw_html)
        return '\n'.join(article_parse(data))

    def preprocess_html(self, soup):
        for img in soup.findAll('img', src=True):
            # for high res images use '?w=2000&h=2000'
            img['src'] = img['src'] + '?w=1000&h=1000'
        return soup

    def populate_article_metadata(self, article, soup, first):
        summ = soup.find(attrs={'class':'byline'})
        if summ:
            article.summary = self.tag_to_string(summ)
            article.text_summary = self.tag_to_string(summ)
PK�X%ƃnoo
natgeohis.png�PNG


IHDR(-SPLTE���n�DtRNS@��fIDATx�c��������	+�QG	�IEND�B`�PK�X9�+1��natgeohis.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

import json

from calibre.web.feeds.news import BasicNewsRecipe
from calibre import prepare_string_for_xml as escape
from calibre.utils.iso8601 import parse_iso8601


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def extract_json(raw):
    s = raw.find("window['__natgeo__']")
    script = raw[s:raw.find('</script>', s)]
    return json.loads(
        script[script.find('{'):].rstrip(';'))['page']['content']['article']


def parse_contributors(grp):
    for item in grp:
        line = '<div class="auth">' + escape(item['title']) + ' '
        for c in item['contributors']:
            line += escape(c['displayName'])
        yield line + '</div>'


def parse_lead_image(media):
    if 'dsc' in media['image']:
        yield '<p><div><img src="{}" alt="{}"></div>'.format(
            escape(media['image']['src'], True), escape(media['image']['dsc'], True))
    else:
        yield '<p><div><img src="{}"></div>'.format(escape(media['image']['src'], True))
    if 'caption' in media:
        yield '<div class="cap">' + media['caption'] + '</div>'
    if 'credit' in media:
        yield '<div class="cred">' + media['credit'] + '</div>'
    yield '</p>'


def parse_body(item):
    c = item['cntnt']
    if item.get('type') == 'inline':
        if c.get('cmsType') == 'listicle':
            if 'title' in c:
                yield '<h3>' + escape(c['title']) + '</h3>'
            yield c['text']
        elif c.get('cmsType') == 'image':
            for line in parse_lead_image(c):
                yield line
        elif c.get('cmsType') == 'imagegroup':
            for imgs in c['images']:
                for line in parse_lead_image(imgs): 
                    yield line
        elif c.get('cmsType') == 'pullquote':
            if 'quote' in c:
                yield '<blockquote>' + c['quote'] + '</blockquote>'
        elif c.get('cmsType') == 'editorsNote':
            if 'note' in c:
                yield '<blockquote>' + c['note'] + '</blockquote>'
    else:
        if c['mrkup'].strip().startswith('<'):
            yield c['mrkup']
        else:
            yield '<{tag}>{markup}</{tag}>'.format(
                tag=item['type'], markup=c['mrkup'])


def parse_article(edg):
    sc = edg['schma']
    yield '<h3 class="sub">' + escape(edg['sctn']) + '</h3>'
    yield '<h1>' + escape(sc['sclTtl']) + '</h1>'
    yield '<div class="byline">' + escape(sc['sclDsc']) + '</div><br>'
    for line in parse_contributors(edg['cntrbGrp']):
        yield line
    ts = parse_iso8601(edg['mdDt'], as_utc=False).strftime('%B %d, %Y')
    yield '<div class="time">Published: ' + escape(ts) + '</div>'
    if 'readTime' in edg:
        yield '<div class="time">' + escape(edg['readTime']) + '</div><br>'
    if edg.get('ldMda', {}).get('cmsType') == 'image':
        for line in parse_lead_image(edg['ldMda']):
            yield line
    for item in edg['bdy']:
        for line in parse_body(item):
            yield line


def article_parse(data):
    yield "<html><body>"
    for frm in data['frms']:
        if not frm:
            continue
        for mod in frm.get('mods', ()):
            for edg in mod.get('edgs', ()):
                if edg.get('cmsType') == 'ImmersiveLeadTile':
                    if 'image' in edg.get('cmsImage', {}):
                        for line in parse_lead_image(edg['cmsImage']):
                            yield line
                if edg.get('cmsType') == 'ArticleBodyTile':
                    for line in parse_article(edg):
                        yield line
    yield "</body></html>"


class NatGeo(BasicNewsRecipe):
    title = u'National Geographic History'
    description = (
        'From Caesar to Napoleon, the Pyramids to the Parthenon, the Trojan War to the Civil War—National Geographic '
        'HISTORY draws readers in with more than 5,000 years of people, places, and things to explore.'
    )
    language = 'en'
    encoding = 'utf8'
    publisher = 'nationalgeographic.com'
    category = 'science, nat geo'
    __author__ = 'Kovid Goyal'
    description = 'Inspiring people to care about the planet since 1888'
    timefmt = ' [%a, %d %b, %Y]'
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = ['style']
    remove_javascript = False
    masthead_url = 'https://i.natgeofe.com/n/e76f5368-6797-4794-b7f6-8d757c79ea5c/ng-logo-2fl.png?w=600&h=600'
    resolve_internal_links = True

    extra_css = '''
        .sub, blockquote { color:#404040; }
        .byline, i { font-style:italic; color:#202020; }
        .cap {text-align:center; font-size:small; }
        .cred {text-align:center; font-size:small; color:#404040; }
        .auth, .time { font-size:small; color:#5c5c5c; }
    '''

    def get_cover_url(self):
        soup = self.index_to_soup('https://ngsingleissues.nationalgeographic.com/history')
        wrap = soup.find(attrs={'class':'product-image-wrapper'})
        return wrap.img['src']

    def parse_index(self):
        soup = self.index_to_soup('https://www.nationalgeographic.com/history/history-magazine')
        ans = []
        for article in soup.findAll('article'):
            a = article.find('a')
            url = a['href']
            if url.startswith('/'):
                url = 'https://www.nationalgeographic.com' + url
            title = self.tag_to_string(article.find(**classes('PromoTile__Title--truncated')))
            ans.append({'title': title, 'url': url})
            self.log(title, '  ', url)
        return [('Articles', ans)]

    def preprocess_raw_html(self, raw_html, url):
        data = extract_json(raw_html)
        return '\n'.join(article_parse(data))

    def preprocess_html(self, soup):
        for img in soup.findAll('img', src=True):
            # for high res images use '?w=2000&h=2000'
            img['src'] = img['src'] + '?w=1000&h=1000'
        return soup

    def populate_article_metadata(self, article, soup, first):
        summ = soup.find(attrs={'class':'byline'})
        if summ:
            article.summary = self.tag_to_string(summ)
            article.text_summary = self.tag_to_string(summ)
PK�X%ƃnoo
natgeomag.png�PNG


IHDR(-SPLTE���n�DtRNS@��fIDATx�c��������	+�QG	�IEND�B`�PK�X���natgeomag.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

import json
from datetime import date
from pprint import pformat

from calibre.web.feeds.news import BasicNewsRecipe
from calibre import prepare_string_for_xml as escape
from calibre.utils.iso8601 import parse_iso8601

edition = date.today().strftime('%B-%Y')

# edition = 'March-2023'

def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def extract_json(raw):
    s = raw.find("window['__natgeo__']")
    script = raw[s:raw.find('</script>', s)]
    return json.loads(
        script[script.find('{'):].rstrip(';'))['page']['content']['article']


def parse_contributors(grp):
    for item in grp:
        line = '<div class="auth">' + escape(item['title']) + ' '
        for c in item['contributors']:
            line += escape(c['displayName'])
        yield line + '</div>'


def parse_lead_image(media):
    if 'dsc' in media['image']:
        yield '<p><div><img src="{}" alt="{}"></div>'.format(
            escape(media['image']['src'], True), escape(media['image']['dsc'], True))
    else:
        yield '<p><div><img src="{}"></div>'.format(escape(media['image']['src'], True))
    if 'caption' in media:
        yield '<div class="cap">' + media['caption'] + '</div>'
    if 'credit' in media:
        yield '<div class="cred">' + media['credit'] + '</div>'
    yield '</p>'


def parse_body(item):
    c = item['cntnt']
    if item.get('type') == 'inline':
        if c.get('cmsType') == 'listicle':
            if 'title' in c:
                yield '<h3>' + escape(c['title']) + '</h3>'
            yield c['text']
        elif c.get('cmsType') == 'image':
            for line in parse_lead_image(c):
                yield line
        elif c.get('cmsType') == 'imagegroup':
            for imgs in c['images']:
                for line in parse_lead_image(imgs):
                    yield line
        elif c.get('cmsType') == 'pullquote':
            if 'quote' in c:
                yield '<blockquote>' + c['quote'] + '</blockquote>'
        elif c.get('cmsType') == 'editorsNote':
            if 'note' in c:
                yield '<blockquote>' + c['note'] + '</blockquote>'
    else:
        if c['mrkup'].strip().startswith('<'):
            yield c['mrkup']
        else:
            yield '<{tag}>{markup}</{tag}>'.format(
                tag=item['type'], markup=c['mrkup'])


def parse_article(edg):
    sc = edg['schma']
    yield '<h3 class="sub">' + escape(edg['sctn']) + '</h3>'
    yield '<h1>' + escape(sc['sclTtl']) + '</h1>'
    yield '<div class="byline">' + escape(sc['sclDsc']) + '</div><br>'
    for line in parse_contributors(edg['cntrbGrp']):
        yield line
    ts = parse_iso8601(edg['mdDt'], as_utc=False).strftime('%B %d, %Y')
    yield '<div class="time">Published: ' + escape(ts) + '</div>'
    if 'readTime' in edg:
        yield '<div class="time">' + escape(edg['readTime']) + '</div><br>'
    if edg.get('ldMda', {}).get('cmsType') == 'image':
        for line in parse_lead_image(edg['ldMda']):
            yield line
    for item in edg['bdy']:
        for line in parse_body(item):
            yield line


def article_parse(data):
    yield "<html><body>"
    for frm in data['frms']:
        if not frm:
            continue
        for mod in frm.get('mods', ()):
            for edg in mod.get('edgs', ()):
                if edg.get('cmsType') == 'ImmersiveLeadTile':
                    if 'image' in edg.get('cmsImage', {}):
                        for line in parse_lead_image(edg['cmsImage']):
                            yield line
                if edg.get('cmsType') == 'ArticleBodyTile':
                    for line in parse_article(edg):
                        yield line
    yield "</body></html>"


class NatGeo(BasicNewsRecipe):
    title = u'National Geographic Magazine'
    description = 'The National Geographic, an American monthly magazine'
    language = 'en'
    encoding = 'utf8'
    publisher = 'nationalgeographic.com'
    category = 'science, nat geo'
    __author__ = 'Kovid Goyal, unkn0wn'
    description = 'Inspiring people to care about the planet since 1888'
    timefmt = ' [%a, %d %b, %Y]'
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = ['style']
    remove_javascript = False
    masthead_url = 'https://i.natgeofe.com/n/e76f5368-6797-4794-b7f6-8d757c79ea5c/ng-logo-2fl.png?w=600&h=600'
    remove_empty_feeds = True
    resolve_internal_links = True

    extra_css = '''
        .sub, blockquote { color:#404040; }
        .byline, i { font-style:italic; color:#202020; }
        .cap {text-align:center; font-size:small; }
        .cred {text-align:center; font-size:small; color:#404040; }
        .auth, .time { font-size:small; color:#5c5c5c; }
    '''

    def parse_index(self):
        url = 'https://www.nationalgeographic.com/magazine/issue/' + edition.lower()
        self.log('Downloading ', url)
        self.timefmt = ' [' + edition + ']'
        soup = self.index_to_soup(url)
        # png = re.findall('https://i\.natgeofe\.com\S+?national-geographic-\S+?\.jpg', soup.decode('utf-8'))
        # self.cover_url = png[0] + '?w=1000&h=1000'
        self.cover_url = soup.find('meta', attrs={'property':'og:image'})['content'].split('?')[0] + '?w=1000'

        name = soup.find(attrs={'class':lambda x: x and 'Header__Description' in x.split()})
        self.title = 'National Geographic ' + self.tag_to_string(name)
        ans = {}
        ans2 = None
        if photoart := soup.find(attrs={'class':lambda x: x and 'BgImagePromo__Container__Text__Link' in x.split()}):
            ans2 = []
            title = self.tag_to_string(photoart)
            url = photoart['href']
            if url.startswith('/'):
                url = 'https://www.nationalgeographic.com' + url
            ans2.append(('Photo Essay', [{'title': title, 'url': url}]))
        for gird in soup.findAll(attrs={'class':'GridPromoTile'}):
            for article in soup.findAll('article'):
                a = article.find('a')
                url = a['href']
                if url.startswith('/'):
                    url = 'https://www.nationalgeographic.com' + url
                if '/graphics/' in url:
                    continue
                section = self.tag_to_string(article.find(**classes('SectionLabel')))
                title = self.tag_to_string(article.find(**classes('PromoTile__Title--truncated')))
                articles = ans.setdefault(section, [])
                articles.append({'title': title, 'url': url})
            self.log(pformat(ans))
            if ans2:
                return list(ans.items()) + ans2
            return list(ans.items())

    def preprocess_raw_html(self, raw_html, url):
        data = extract_json(raw_html)
        return '\n'.join(article_parse(data))

    def preprocess_html(self, soup):
        for img in soup.findAll('img', src=True):
            # for high res images use '?w=2000&h=2000'
            img['src'] = img['src'] + '?w=1200&h=1200'
        return soup

    def populate_article_metadata(self, article, soup, first):
        summ = soup.find(attrs={'class':'byline'})
        if summ:
            article.summary = self.tag_to_string(summ)
            article.text_summary = self.tag_to_string(summ)
PK�X&D���
nation_ke.png�PNG


IHDR  szz��IDATx����A�ڶm۶��j۶m3�m۶m����ܟ��M�|�>�A�-�͚�>�Bp	�cIq�7Q�.
�@~����J�q)����A��aD�Q��ZCp
����(>aB��5���`�F3�"಻��L���26�^+���V�>�|R"6 �����hXQLFh�a�Ǖ�w���J��mDC�R"."������J�vķ`�!�9g+�,*��Al��
%�j�0���J�5�}�A�؏hd#�,<@��V�YB�V��2�l���e��^�YU<q2 0��Sfa1���8��d�Y�s2��z0�#�_m��݀,8�k4F@��P��N@<l���,�@���A�a7"��e�u\�3�3�s��$�IEND�B`�PK�X��	d��nation_ke.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Hans Donner <hans.donner at pobox.com>'
'''
www.standardmedia.co.ke
'''

from calibre.web.feeds.news import BasicNewsRecipe


class NationKeRecipe(BasicNewsRecipe):

    __author__ = 'Hans Donner'

    title = u'Sunday Nation'
    description = 'News from Kenia'
    language = 'en'
    country = 'KE'
    publication_type = 'newspaper'
    publisher = 'nation.co.ke'
    category = 'news, politics, Kenia'

    masthead_url = 'http://www.nation.co.ke/image/view/-/465228/medRes/33884/-/maxh/85/-/12e8pptz/-/Sunday_Logo.gif'

    max_articles_per_feed = 200
    oldest_article = 2

    use_embedded_content = False
    remove_empty_feeds = True

    no_stylesheets = True
    extra_css = ' body{font-family: Verdana,Arial,Helvetica,sans-serif; font-size:0.7em } ' + \
                ' .image{margin-bottom: 1em} '

    keep_only_tags = dict(id='articlebody')

    feeds = [(u'News', u'http://www.nation.co.ke/News/-/1056/1056/-/view/asFeed/-/14nfs48z/-/index.xml'),
             (u'Business', u'http://www.nation.co.ke/business/-/996/996/-/view/asFeed/-/14lpkvc/-/index.xml'),
             (u'InDepth', u'http://www.nation.co.ke/InDepth/-/452898/452898/-/view/asFeed/-/14ndbk6/-/index.xml'),
             (u'Sports', u'http://www.nation.co.ke/sports/-/1090/1090/-/view/asFeed/-/hlukmj/-/index.xml'),
             (u'Magazines', u'http://www.nation.co.ke/magazines/-/1190/1190/-/view/asFeed/-/fcxm6jz/-/index.xml'),
             (u'Op/Ed', u'http://www.nation.co.ke/oped/-/1192/1192/-/view/asFeed/-/unsp8mz/-/index.xml'),
             (u'Blogs', u'http://www.nation.co.ke/blogs/-/620/620/-/view/asFeed/-/28ia05z/-/index.xml')]

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    def print_version(self, url):
        from calibre.ebooks.BeautifulSoup import BeautifulSoup
        soup = BeautifulSoup(self.browser.open(url).read())
        printversion = soup.find('a', text='Print')
        if printversion is None:
            return url
        else:
            return 'http://www.nation.co.ke' + printversion.parent['href']

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XH��Dffnational_geographic_es.png�PNG


IHDR�a-IDATx�c���g��g���C3���m\���0j噉��� "��+,IEND�B`�PK�X�p9"��national_geographic_es.recipe__license__ = 'GPL v3'
__author__ = 'Vakya'
__version__ = 'v1.0'
__date__ = '14, May 2012'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1336226255(BasicNewsRecipe):

    title = u'National Geographic (es)'
    publisher = u'National Geographic'
    __author__ = 'Vakya'
    description = 'Revista National Geographic - Últimas noticias'
    language = 'es'

    oldest_article = 15
    max_articles_per_feed = 100
    auto_cleanup = True
    remove_tags_before = dict(name='p', attrs={'class': ['image']})
    remove_tags_after = dict(name='hr')
    feeds = [
        (u'Vida salvage', u'http://www.nationalgeographic.com.es/feeds/rss.html')]
PK�Xj</�kknational_geographic_it.png�PNG


IHDR%=m"PLTE��|�`tRNS@��fIDATc���D_#�J�3�Eݜ�IEND�B`�PK�X���?national_geographic_it.recipe__version__ = 'v1.0'
__date__ = '5, May 2012'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1336226255(BasicNewsRecipe):
    title = u'National Geographic'
    __author__ = 'faber1971'
    description = 'Science magazine'
    language = 'it'

    oldest_article = 15
    max_articles_per_feed = 100
    auto_cleanup = True
    remove_tags = [dict(name='div', attrs={'class': 'banner-abbonamenti'})]
    feeds = [(u'National Geographic',
              u'http://www.nationalgeographic.it/rss/all/rss2.0.xml')]
PK�X�h��CCnational_post.png�PNG


IHDR  D����PLTE# ��������������p����K?Šߴ	]M��������������;2�����������q�y�|���gTkXo[q]s^s_t_{d}fh�h�i�k�l+%�q,&�t�t�y-'�z�{/)�|0)0*����������������������2+������5.������������������
��
��
��
Ğ6.ƠǡȡȢɣˤˤ̥ΧШ׮
ٯ
ܲ	:1�	�	�������'"��������<3>4����A7��D9����G<H<����������(#L@����MAOBRDSEUGZK)#^N_NbQ8�;�9IDATx���Ӛ31�~�6~۶��m۶��]�z����
^s%f8�2}�Á����߃?K�Ss�mVC竝a���]��bí�
hjkZ��G���qH��e@�]�J��L"�:|F��w`f���)@��XwXMV�e��w���چ%8��wm�C��a@�~}Q�:OFk��
DK���q����o�fz�I�tR�sF���w~͝�c����x`�	��hO�`�i���ABni�C	ķ)��^��m���K�S$���*J�N{��&d7��0L�D��A��Cs=�G��IEND�B`�PK�X�4�national_post.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>


from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class NationalPost(BasicNewsRecipe):

    title = 'National Post'
    __author__ = 'Kovid Goyal'
    description = 'Canadian national newspaper'
    timefmt = ' [%d %b, %Y]'
    language = 'en_CA'
    no_stylesheets = True
    oldest_article = 1.5
    use_embedded_content = False

    keep_only_tags = [
        dict(itemprop='headline'),
        classes('featured-image'),
        dict(itemprop='articleBody'),
    ]

    feeds = ['http://nationalpost.com/rss']
PK�X�3�zznationalgeoro.png�PNG


IHDRb��PLTE�������3�̙�q"htRNS@��fIDATx�c`

-``[�������Lb�(�ng��o�IEND�B`�PK�X���a��nationalgeoro.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
natgeo.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class NationalGeoRo(BasicNewsRecipe):
    title = u'National Geographic RO'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'S\u0103 avem grij\u0103 de planet\u0103'
    publisher = 'National Geographic'
    oldest_article = 35
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Reviste'
    encoding = 'utf-8'
    cover_url = 'http://wiki.benecke.com/images/c/c4/NatGeographic_Logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h2', attrs={'class': 'contentheading clearfix'}), dict(
            name='div', attrs={'class': 'article-content'})

    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['phocagallery']})
    ]

    feeds = [
        (u'Feeds', u'http://www.natgeo.ro/index.php?format=feed&type=rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X���ynationalreviewonline.png�PNG


IHDR�a�IDATx�m���LQ�?���]P��%��T�T�"�*��B��-��� �!��k�ݻ���I�9͝3��<��fT�s�[6�8�!M����:�������(�5e����>^�����9�.���سW[��� ��vD^�@��ƈv�=:s�6i�޸��z)�?��%�D�?1��F��ŭ��~[�E���;��o޷��ℤ^�iMҀD���<HLR�)EksLR�\�C-IP<|�hZZ�0v�HfϚ̈!e�-fY`ؐn,Z0�9S��&�g��[�v�R:�t���;V���ʠ�|��L�4�A�2e�0fN/��	sgtgצ
Vt=�S*Z�.YH�U�j�J��JrƓ��x��3�:u�{�N�:s�s�����]ʽJ��](x��{���OX�b)��$ȭ	��ٳ��)���G��bd��&�	��(�1��+�x��~���o��}����vd�LJG�O���M�F!2ܺc��Y�BĕKW��h ӈV��o�A�q�s��M�M��	=i��?��Gu�/8㉿�1�H��I�Qr�m�$?Ry:ڴ+��5�IEC�����ŵ�V�Q���і|D7+��Geo�o,�6�&x*�=�-;~2Fßc����5���[�0��֥�}x��#��J�X��C��7�c�:_�u޺��/_����E�|�~�s�5����U�{���|~���p�'���&�fi�IEND�B`�PK�X�yOaanationalreviewonline.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Walt Anthony <workshop.northpole at gmail.com>'
'''
www.nationalreview.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class NRO(BasicNewsRecipe):
    title = u'National Review Online'
    __author__ = 'Walt Anthony'
    description = "National Review is America's most widely read and influential magazine and web site for Republican/conservative news, commentary, and opinion."  # noqa
    publisher = 'National Review, Inc.'
    category = 'news, politics, USA'
    oldest_article = 3
    max_articles_per_feed = 100
    summary_length = 150
    language = 'en'
    encoding = 'utf-8'
    use_embedded_content = True
    remove_javascript = True

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['embed', 'object', 'iframe']),

    ]

    feeds = [

        (u'National Review', u'http://www.nationalreview.com/articles/feed'),
        (u'The Corner', u'http://www.nationalreview.com/corner/feed'),
        (u'The Agenda', u'http://www.nationalreview.com/agenda/feed'),
        (u'Bench Memos', u'http://www.nationalreview.com/bench-memos/feed'),
        (u'Campaign Spot', u'http://www.nationalreview.com/campaign-spot/feed'),
        (u'Battle 10', u'http://www.nationalreview.com/battle10/feed'),
        (u'Critical Care', u'http://www.nationalreview.com/critical-condition/feed'),
        (u"Kudlow's Money Politic$",
         u'http://www.nationalreview.com/kudlows-money-politics/feed'),
        (u'Media Blog', u'http://www.nationalreview.com/media-blog/feed'),
        (u'Exchequer', u'http://www.nationalreview.com/exchequer/feed'),
        (u'Phi Beta Cons', u'http://www.nationalreview.com/phi-beta-cons/feed'),
        (u'Planet Gore', u'http://www.nationalreview.com/planet-gore/feed')

    ]
PK�X�V����
nature.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿tIME�-9nyU�IDATHǭ��kaǿ�.��K7mGQhA�IQ�R�A��%�:8(��p��B;Y���Zq+(.^�v�`#��ҡ\>yr�{�$B�y��=����S�6_�iY�j(V��6���&�k�y�jA�����m-�*�}L��]��SW��^����KG��uU��ӊ��'�t���ޒ��o_��~(];�EA��q��\�
���E0I��Uh	Li�
zT��v���<�m��UW`WS����O��i_8�J�˓���/���?�<g�߆�1�
l�,�ܪe��?S���k7ir=]�5i�
`�Ux�oع$7ӹXR:�>+]e�"�1�@C���s�	C1��"��E���ð�iL���y��ag�i�lF!�J���G��a�3J�i&q�o��a��3�YF39�,�'���a��~|��vN
���!  `�q�.1G@�7�gu��#MFZC5����b�a��\�%�=�����g�s�%tEXtdate:create2023-06-19T20:44:07+00:00o,�%tEXtdate:modify2023-06-19T20:44:07+00:00C�[IEND�B`�PK�X�@;��
nature.recipe#!/usr/bin/env python
import re
from collections import defaultdict
from calibre.web.feeds.news import BasicNewsRecipe, classes

BASE = 'https://www.nature.com'


def absurl(url):
    if url.startswith('/'):
        url = BASE + url
    elif url.startswith('http://'):
        url = 'https' + url[4:]
    return url


def check_words(words):
    return lambda x: x and frozenset(words.split()).intersection(x.split())


def has_all_of(words):
    return lambda x: x and frozenset(words.split()).issubset(x.split())


class Nature(BasicNewsRecipe):
    title = 'Nature'
    __author__ = 'Jose Ortiz'
    description = (
        'Nature is a weekly international multidisciplinary scientific journal'
        ' publishing peer-reviewed research in all fields of science and'
        ' technology on the basis of its originality, importance,'
        ' interdisciplinary interest, timeliness, accessibility, elegance and'
        ' surprising conclusions. Nature also provides rapid, authoritative,'
        ' insightful and arresting news and interpretation of topical and coming'
        ' trends affecting science, scientists and the wider public.'
    )
    language = 'en'
    encoding = 'UTF-8'
    no_javascript = True
    no_stylesheets = True

    keep_only_tags = [dict(name="article")]

    remove_tags = [
        classes(
            "u-hide-print hide-print c-latest-content__item c-context-bar "
            "c-pdf-button__container u-js-hide"
        ),
        dict(name="img", attrs={"class": ["visually-hidden"]}),
    ]

    def parse_index(self):
        soup = self.index_to_soup(BASE + '/nature/current-issue')
        self.cover_url = soup.find(
            'img', attrs={'data-test': check_words('issue-cover-image')}
        )['src']
        try:
            self.cover_url = re.sub(r"\bw\d+\b", "w1000", self.cover_url)  # enlarge cover size resolution
        except:
            """
            failed, img src might have changed, use default width 200
            """
            pass

        section_tags = soup.find_all(
            "section", attrs={"data-container-type": "issue-section-list"}
        )

        sections = defaultdict(list)
        ordered_sec_titles = []
        index = []

        for sec in section_tags:
            sec_title = self.tag_to_string(sec.find('h2'))
            ordered_sec_titles.append(sec_title)
            for article in sec.findAll('article'):
                try:
                    url = absurl(
                        article.find('a', {'itemprop': check_words('url')})['href']
                    )
                except TypeError:
                    continue
                title = self.tag_to_string(
                    article.find('h3', {'itemprop': has_all_of('name headline')})
                )
                date = ' [' + self.tag_to_string(
                    article.find('time', {'itemprop': check_words('datePublished')})
                ) + ']'
                author = self.tag_to_string(
                    article.find('li', {'itemprop': check_words('creator')})
                )
                description = self.tag_to_string(
                    article.find(attrs={'data-test': check_words('article.type')})
                ) + u' • '
                description += self.tag_to_string(
                    article.find(
                        'div', attrs={'itemprop': check_words('description')}
                    )
                )
                sections[sec_title].append({
                    'title': title,
                    'url': url,
                    'description': description,
                    'date': date,
                    'author': author
                })

        for k in ordered_sec_titles:
            index.append((k, sections[k]))
        return index

    def preprocess_html(self, soup):
        for img in soup.findAll('img', {'data-src': True}):
            if img['data-src'].startswith('//'):
                img['src'] = 'https:' + img['data-src']
            else:
                img['src'] = img['data-src']
        for div in soup.findAll(
            'div', {'data-component': check_words('article-container')}
        )[1:]:
            div.extract()
        return soup
PK�Xj���nauka_w_polsce.png�PNG


IHDR��h6�IDATxڕ�/hq�/.\�`��]ہa‚�Ea�`a������0ʂȊ�Ʊ0�alapk.�28ۭ� ���/^0�`x{?�ȁ��o����}O��
X �e�_�%�k���+�4��FT��.��q����Ly�y��
�I��0�qD�>%�DPoI��N
��aY[�}m��qɁR�.�$Uo친
����pa�V�1c�"�Z������q��h�t12-��I�i�B*	�4A��a
�[�!<C�+��+�ނ���}z��.�0��si��aqo�#�q�,��*]Ms3f����֚��|޻s R���/;^�T����+n�����@͙���ւk�|����C�֗�Q_ahd(��>IEND�B`�PK�X�IH��
�
nauka_w_polsce.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class NaukawPolsce(BasicNewsRecipe):
    title = u'PAP Nauka w Polsce'
    __author__ = 'fenuks'
    description = u'Serwis Nauka w Polsce ma za zadanie popularyzację polskiej nauki. Można na nim znaleźć wiadomości takie jak: osiągnięcia polskich naukowców, wydarzenia na polskich uczelniach, osiągnięcia studentów, konkursy dla badaczy, staże i stypendia naukowe, wydarzenia w polskiej nauce, kalendarium wydarzeń w nauce, materiały wideo o nauce.'  # noqa
    category = 'science'
    language = 'pl'
    cover_url = 'http://www.naukawpolsce.pap.pl/Themes/Pap/images/logo-pl.gif'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    extra_css = '.miniaturka {float: left; margin-right: 5px; max-width: 350px;} .miniaturka-dol-strony {display: inline-block; margin: 0 15px; width: 120px;}'
    ignore_duplicate_articles = {'title', 'url'}
    index = 'http://www.naukawpolsce.pl'
    keep_only_tags = [dict(name='div', attrs={'class': 'margines wiadomosc'})]
    remove_tags = [dict(name='div', attrs={'class': 'tagi'})]

    def find_articles(self, url):
        articles = []
        soup = self.index_to_soup(url)
        for i in soup.findAll(name='div', attrs={'class': 'aktualnosci-margines lista-depesz information-content'}):
            title = i.h1.a.string
            url = self.index + i.h1.a['href']
            date = ''  # i.span.string
            articles.append({'title': title,
                             'url': url,
                             'date': date,
                             'description': ''
                             })
        return articles

    def parse_index(self):
        feeds = []
        feeds.append((u"Historia i kultura", self.find_articles(
            'http://www.naukawpolsce.pl/historia-i-kultura/')))
        feeds.append((u"Kosmos", self.find_articles(
            'http://www.naukawpolsce.pl/kosmos/')))
        feeds.append((u"Przyroda", self.find_articles(
            'http://www.naukawpolsce.pl/przyroda/')))
        feeds.append((u"Społeczeństwo", self.find_articles(
            'http://www.naukawpolsce.pl/spoleczenstwo/')))
        feeds.append((u"Technologie", self.find_articles(
            'http://www.naukawpolsce.pl/technologie/')))
        feeds.append((u"Uczelnie", self.find_articles(
            'http://www.naukawpolsce.pl/uczelnie/')))
        feeds.append((u"Nauki medyczne", self.find_articles(
            'http://www.naukawpolsce.pl/zdrowie/')))

        return feeds

    def preprocess_html(self, soup):
        for p in soup.findAll(name='p', text=re.compile('&nbsp;')):
            p.extract()
        return soup
PK�X���$$nautilus.png�PNG


IHDR(-S3PLTE��������������GpL������������������nCDtRNS�J�z� �.O��`���u�IDAT�UOY�0�Y\�.��E�~�3��b,�����l�@G�y!�8�W^�3�!�����2���e�$�MV��#	�o]ϽGJPă�hf�Y�W�єL�m�mq��낦+�Vn�0S3�S8�唱XM���/ܖ��ڝ�IEND�B`�PK�X�Y����nautilus.recipe'''
nautil.us
'''
from calibre.web.feeds.news import BasicNewsRecipe, classes


class Nautilus(BasicNewsRecipe):
    title = u'Nautilus'
    language = 'en'
    __author__ = 'unkn0wn'
    oldest_article = 45  # days
    max_articles_per_feed = 50
    description = (
        'Nautilus is a different kind of science magazine. Our stories take you into the depths'
        ' of science and spotlight its ripples in our lives and cultures. We believe any subject in science,'
        ' no matter how complex, can be explained with clarity and vitality.')
    no_stylesheets = True
    use_embedded_content = False
    masthead_url = 'https://nautil.us/wp-content/themes/nautilus/images/logo/light.svg'
    remove_attributes = ['height', 'width']
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    extra_css = '''
        .article-list_item-byline{font-size:small;}
        blockquote{color:#404040; text-align:center;}
        #fig-c{font-size:small;}
        em{color:#202020;}
        .breadcrumb{color:gray; font-size:small;}
        .article-author{font-size:small;}
    '''
    keep_only_tags = [classes('article-left-col feature-image article-content')]

    remove_tags = [
        classes(
            'article-action-list article-bottom-newsletter_box main-post-comments-toggle-wrap main-post-comments-wrapper'
            ' social-share supported-one article-collection_box browsi-ad'
        )
    ]

    feeds = [
        ('ANTHROPOLOGY', 'https://nautil.us/topics/anthropology/feed'),
        ('ENVIRONMENT', 'https://nautil.us/topics/environment/feed'),
        ('HEALTH', 'https://nautil.us/topics/health/feed'),
        ('PALEONTOLOGY', 'https://nautil.us/topics/paleontology/feed'),
        ('TECHNOLOGY', 'https://nautil.us/topics/technology/feed'),
        ('ARTS', 'https://nautil.us/topics/arts/feed'),
        ('EVOLUTION', 'https://nautil.us/topics/evolution/feed'),
        ('HISTORY', 'https://nautil.us/topics/history/feed'),
        ('PHILOSOPHY', 'https://nautil.us/topics/philosophy/feed'),
        ('ZOOLOGY', 'https://nautil.us/topics/zoology/feed'),
        ('ASTRONOMY', 'https://nautil.us/topics/astronomy/feed'),
        ('GENERAL', 'https://nautil.us/topics/general/feed'),
        ('MATH', 'https://nautil.us/topics/math/feed'),
        ('PHYSICS', 'https://nautil.us/topics/physics/feed'),
        ('COMMUNICATION', 'https://nautil.us/topics/communication/feed'),
        ('GENETICS', 'https://nautil.us/topics/genetics/feed'),
        ('MICROBIOLOGY', 'https://nautil.us/topics/microbiology/feed'),
        ('PHILOSOPHY', 'https://nautil.us/topics/psychology/feed'),
        ('ECONOMICS', 'https://nautil.us/topics/economics/feed'),
        ('GEOSCIENCE', 'https://nautil.us/topics/geoscience/feed'),
        ('NEUROSCIENCE', 'https://nautil.us/topics/neuroscience/feed'),
        ('SOCIOLOGY', 'https://nautil.us/topics/sociology/feed'),
    ]

    def get_cover_url(self):
        soup = self.index_to_soup('https://nautil.us/shop/category/issues/')
        a = soup.find('a', attrs={'href':lambda x: x and x.startswith('https://nautil.us/shop/issues/issue-')})
        if a:
            self.cover_url = a.img['src'].split('?')[0]
        return getattr(self, 'cover_url', self.cover_url)
    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src'].split('?')[0]
        for figcaption in soup.findAll('figcaption'):
            figcaption['id']='fig-c'
        for ul in soup.findAll('ul', attrs={'class':
            ['breadcrumb', 'article-list_item-byline', 'channel-article-author', 'article-author']}):
            ul.name = 'span'
            for li in ul.findAll('li'):
                li.name = 'p'
        return soup
PK�Xca�T&&navalny.png�PNG


IHDR��h6�IDAT�Kle�ٙ}��-]��.��`��$Zy$MU��^��#���1��&>�@��>jD��]���vײ-�6�wfg�{���j��}fr��鉓�K��;�0����)�&%&7������u����L&ㆼ���-�pn(�������Z�}5ڗ��{��U�X�tQ�YJ��TS
A�TZCSh���
ڹ�����܂��4�!443�VLI������h4T
Z���k��;��ra� �J�$ ��4y�z����dOz��HXm���KW\��@h}�LϞ^+d�*eh����ON�xz��w�~wl�o�9��a�O�<��z�=����]mD�5��.�_�ݘ����c��z�
��r.��r�������{}��"�O]PJ�'��R4�!Pk
��c+Ϭ_��wg'����j��߿�0��N�f�t��)�u�l�@z�-�Zqڪ
�7�n��-g�vV5��Ñf�Ԏ�,m[\��՟� ���[UP�]�Z�[J����f$=���
����_����h�rA��Y����c��g���WY̊�jV����s�467l�^j�w޶w��13˻Ѯ�����`v!JZ���7o������f���x����O_}�nv����K���������d/�CR�����m�H�c������%I@#a��d��7�J�V.6��j�P'��v|/�h��5�1wE�ʍm�73w&�aIEND�B`�PK�Xi�Cp��navalny.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1467716191(BasicNewsRecipe):
    title = '\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0432\u0430\u043b\u044c\u043d\u044b\u0439'
    __author__ = 'bugmen00t'
    description = '\u0411\u043B\u043E\u0433 \u0410\u043B\u0435\u043A\u0441\u0435\u044F \u041D\u0430\u0432\u0430\u043B\u044C\u043D\u043E\u0433\u043E. \u0424\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0431\u0438\u0442\u0432\u0430 \u043C\u0435\u0436\u0434\u0443 \u0434\u043E\u0431\u0440\u043E\u043C \u0438 \u043D\u0435\u0439\u0442\u0440\u0430\u043B\u0438\u0442\u0435\u0442\u043E\u043C'  # noqa
    publisher = 'navalny.com'
    category = 'news'
    cover_url = u'https://st.navalny.com/static/images/present.dd46b90f0221.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = True
    auto_cleanup = False

    oldest_article = 200
    max_articles_per_feed = 100

    feeds = [
        ('\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0432\u0430\u043b\u044c\u043d\u044b\u0439',
         'https://navalny.com/blog/post.rss'),
    ]

    remove_tags_before = dict(name='div', attrs={'class': 'b-content'})
    remove_tags_after = dict(name='div', attrs={'class': 'b-post__content'})
    remove_tags = [dict(name='div', attrs={
                        'class': 'b-post__bottom'}), dict(name='div', attrs={'id': 'c'})]
PK�X;ye�44navy_times.png�PNG


IHDR  ���IDATxڼ���4I��9�wk4���=͵m�x���9�g��_jA�A��u��|"���O��Z_b���4��8I�8�=u�U,zR(�B0�1�ɑpB�~Ei� �0'v������;H�+�b1M�D�}n���(�T��������L�g��G<[�0UG��j+�J)V	��*�TŞ1��7N",�hxB����ћ=}?��f׸Ru���,#�ƌ�ҊUVS�0�Ve��)M1{���)j�-�=��c2�;��~S�Gջ�.��E�8ﱂ�uyx�Gw�{���ntJ3ɪ�9����l057�^��=lf�@u�Z�?~*�n�sa��œ��G��_g'�7%x*����*�5\�h�4Z?���֞��OBD�qd���{҃tpD�4�>�[Í]޽V۷R�Nf^����apZgziv�Wyx�7�Q�+���?�Q(�u	�ף0��|=�ʶHj��{�w���Y�ʳB��q�"W���U/�xM��W&�D����1������b`���u�y��v4�(*�	�L�Pa���hf]8a��ơ���% @dºs��+ǫ��bQ��wN��ŵ	�:�*���jE�L��8-����)�ƶ8���T�Q۶m�v��6�k�FT�Hf�7c/�Nt�����X�=+�o��ZP��/6&x*�b�&�]V�
ŹK7䊆��>`ki��4:�F�QId<Tht���@��[`�/4���Y4�&��$�C?PW�I!���~��2����211�y���v��,���[�9\?W>�Cajk0Ti�.�A
�G�EKKKwww��``��*�����LII���I2-�djb�ӓ��!L6V��\^V~�tn���Y��z���X,633#�J�d2B�����8����IEbl������&7�^MMc�����4���$M������u�Vii����2��`���p����ݼ����s�w ����jh���ʕK�C$�p}cu}cyqe>#;ca	F(Gll�@8B����n �yc]�L"���ՍNhXp}C5tSӒv����m�>{x�����gNfdd����E����������cI��1`btAhn�G��c�N�:����/����'�&����
,wvv�@�Y�����\]]1������r���9������Ƿ��A�t��P{l.'$,�P�Y|>?�xp8UUU��ૃ����
��o�'�6x.��IEND�B`�PK�X
Q���navy_times.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class NavyTimes(BasicNewsRecipe):
    title = 'Army and Navy Times'
    __author__ = 'jde'
    __date__ = '16 May 2012'
    __version__ = '1.0'
    description = 'News of the U.S. Navy'
    language = 'en'
    publisher = 'NavyTimes.com'
    category = 'news, U.S. Navy'
    tags = 'news, U.S. Navy'
    oldest_article = 7  # days
    max_articles_per_feed = 25
    publication_type = 'newspaper'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = True

    feeds = [
        ('Home page', 'https://www.navytimes.com/arc/outboundfeeds/rss/?outputType=xml'),
        ('News', 'https://www.navytimes.com/arc/outboundfeeds/rss/category/news/?outputType=xml'),
        ('Your Navy', 'https://www.navytimes.com/arc/outboundfeeds/rss/category/news/your-navy/?outputType=xml'),
        ('Your Army',   'https://www.armytimes.com/arc/outboundfeeds/rss/category/news/your-army/?outputType=xml'),
        ('Your Air Force', 'https://www.airforcetimes.com/arc/outboundfeeds/rss/category/news/your-air-force?outputType=xml'),
        ('Your Marine Core',   'https://www.marinecorpstimes.com/arc/outboundfeeds/rss/category/news/your-marine-corps/?outputType=xml'),
        ('Pentagon and Congress',   'https://www.navytimes.com/arc/outboundfeeds/rss/category/news/pentagon-congress/?outputType=xml'),
        ('Pay and Benefits',   'https://www.navytimes.com/arc/outboundfeeds/rss/category/pay-benefits/?outputType=xml'),
        ('Veterans',   'https://www.navytimes.com/arc/outboundfeeds/rss/category/veterans/?outputType=xml'),
        ('Education and Transition',   'https://www.navytimes.com/arc/outboundfeeds/rss/category/education-transition/?outputType=xml'),
        ('Flashpoints',   'https://www.navytimes.com/arc/outboundfeeds/rss/category/flashpoints/?outputType=xml'),
    ]
PK�X��RU��nbonline.png�PNG


IHDR  D���PLTE���������������������������������������%=����*A�����������������������"�������3I����K]�'���������'?�L^�
(����9N����q~�������jy����z���������������hx� �����7M������cu�r�������/�>R�@S����BV�<Q�������eu����^m�\m�/����*�kz����K_����+����K^�x��%>���������7J�n}�gw�Pb�+������(�l|� 7����[j�������ar�[l����br����dt��������#<�y��&>�u��y��r��k{����;P�&>�5L�������2����2����&?�����������	$�Vh����DW����et�^p����z��bt�+��������iz�8M�Pc���1������aIDATx^�������m{~۶m۶m�m�o���$���o��W�}�K(�R�T�Cv
����(R��R`�m1�a�1��������@ {��)�����I�!./z�FᏊ���=� o��?����PR�DM��p���r �W��h�f�nS���++۟�˂3=J�w��`*4?x�1���^\�.+� �檣c���aQ���Ջ�������������A����v;�Eg��}z�d/���}��n���a������4a`�r��i�̬�2�_���O���4]J'�}�QZ�R��V����.�Q
�
7�?��R1I��(IEND�B`�PK�Xd��Xnbonline.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class NBOnline(BasicNewsRecipe):
    title = u'Nikkei Business Online'
    language = 'ja'
    description = u'Nikkei Business Online.\u6CE8\uFF1A\u30E6\u30FC\u30B6\u30FC\u540D\u306Bemail\u30A2\u30C9\u30EC\u30B9\u3068\u30E6\u30FC\u30B6\u30FC\u540D\u3092\u30BB\u30DF\u30B3\u30ED\u30F3\u3067\u533A\u5207\u3063\u3066\u5165\u308C\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B\uFF1Aemail@address.jp;username . PLEASE NOTE: You need to put your email address and username into username field separated by ; (semi-colon).'  # noqa
    __author__ = 'Ado Nishimura'
    needs_subscription = True
    oldest_article = 7
    max_articles_per_feed = 100
    remove_tags_before = dict(id='kanban')
    remove_tags = [dict(name='div', id='footer')]

    feeds = [('Nikkei Buisiness Online',
              'http://business.nikkeibp.co.jp/rss/all_nbo.rdf')]

    def get_cover_url(self):
        return 'http://business.nikkeibp.co.jp/images/nbo/200804/parts/logo.gif'

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://signon.nikkeibp.co.jp/front/login/?ct=p&ts=nbo')
            br.select_form(name='loginActionForm')
            br['email'] = self.username.split(';')[0]
            br['userId'] = self.username.split(';')[1]
            br['password'] = self.password
            br.submit()
        return br

    def print_version(self, url):
        return url + '?ST=print'
PK�X�~�a��ncrnext.png�PNG


IHDR  D���PLTE�������������������������������������������������������������������������������������������	�������39���������
��%� &�'-�
�=C�?E�@E�GL�JO�JP�LQ�QV�TY�[`�]b�_c�hm�lq�sw�z~�{~�{ꉍ��������������������������������������� Pn��tRNS22<deeuuy��������������q&8#<IDATxڕ���AF���&[_۶����jT����3�h�)�B4�+�V1���B�}�r<�
1%��$h)���-��nVcB�_o�����;���*��b��k�}q�u�$����F�+�ȸh_�w����X|eы��A��26�,gH(��g,�I(J��7	7�A,�`��	K�d�@l6��,qۢ�BC\"��6�[�,�c�Z$�Q.�_��*
7BB�̅k��=�\ʏ���|�����p�=7�0{����Ї!R.��M�i���
vj��!B���>R9ռ�N�\&"5���Zb�l�.IEND�B`�PK�X�6�hSSncrnext.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class NrcNextRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'nl'
    country = 'NL'
    version = 2

    title = u'nrcnext'
    publisher = u'NRC Media'
    category = u'News, Opinion, the Netherlands'
    description = u'Dutch newsblog from the Dutch daily newspaper nrcnext.'

    conversion_options = {'comments': description,
                          'language': language, 'publisher': publisher}

    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = [dict(name='div', attrs={'id': 'main'})]

    remove_tags = []
    remove_tags.append(dict(name='div', attrs={'class': 'meta'}))
    remove_tags.append(dict(name='p', attrs={'class': 'meta'}))
    remove_tags.append(dict(name='div', attrs={'class': 'datumlabel'}))
    remove_tags.append(dict(name='div', attrs={'class': 'sharing-is-caring'}))
    remove_tags.append(dict(name='div', attrs={'class': 'navigation'}))
    remove_tags.append(dict(name='div', attrs={'class': 'reageer'}))
    remove_tags.append(dict(name='div', attrs={
                       'class': 'comment odd alt thread-odd thread-alt depth-1 reactie '}))
    remove_tags.append(
        dict(name='div', attrs={'class': 'comment even thread-even depth-1 reactie '}))
    remove_tags.append(dict(name='ul', attrs={'class': 'cats single'}))
    remove_tags.append(dict(name='ul', attrs={'class': 'cats onderwerpen'}))
    remove_tags.append(dict(name='ul', attrs={'class': 'cats rubrieken'}))
    remove_tags.append(dict(name='h3', attrs={'class': 'reacties'}))

    extra_css = '''
                body {font-family: verdana, arial, helvetica, geneva, sans-serif; text-align: left;}
                p.wp-caption-text {font-size: x-small; color: #666666;}
                h2.sub_title {font-size: medium; color: #696969;}
                h2.vlag {font-size: small; font-weight: bold;}
                '''

    def parse_index(self):
        # Use the wesbite as an index. Their RSS feeds can be out of date.
        feeds = {}
        feeds[u'columnisten'] = u'http://www.nrcnext.nl/columnisten/'
        feeds[u'koken'] = u'http://www.nrcnext.nl/koken/'
        feeds[u'geld & werk'] = u'http://www.nrcnext.nl/geld-en-werk/'
        feeds[u'vandaag'] = u'http://www.nrcnext.nl'
        # feeds[u'city life in afrika']  = u'http://www.nrcnext.nl/city-life-in-afrika/'
        answer = []
        articles = {}
        indices = []

        for index, feed in feeds.items():
            soup = self.index_to_soup(feed)
            for post in soup.findAll(True, attrs={'class': 'post '}):
                # Find the links to the actual articles and rember the location
                # they're pointing to and the title
                a = post.find('a', attrs={'rel': 'bookmark'})
                href = a['href']
                title = self.tag_to_string(a)
                if index == 'columnisten':
                    # In this feed/page articles can be written by more than one author.
                    # It is nice to see their names in the titles.
                    flag = post.find('h2', attrs={'class': 'vlag'})
                    author = flag.contents[0].renderContents().decode('utf-8')
                    completeTitle = u''.join([author, u': ', title])
                else:
                    completeTitle = title

                # Add the article to a temporary list
                article = {'title': completeTitle, 'date': u'',
                           'url': href, 'description': '<p>&nbsp;</p>'}
                if index not in articles:
                    articles[index] = []
                articles[index].append(article)

            # Add the index title to a temporary list
            indices.append(index)

        # Now, sort the temporary list of feeds in the order they appear on the website
        # indices = self.sort_index_by(indices, {u'columnisten' : 1, u'koken' : 3, u'geld & werk' : 2, u'vandaag' : 0, u'city life in afrika' : 4})
        indices = self.sort_index_by(
            indices, {u'columnisten': 1, u'koken': 3, u'geld & werk': 2, u'vandaag': 0})
        # Apply this sort order to the actual list of feeds and articles
        answer = [(key, articles[key])
                  for key in indices if key in articles]

        return answer

    def preprocess_html(self, soup):
        if soup.find('div', attrs={'id': 'main', 'class': 'single'}):
            tag = soup.find('div', attrs={'class': 'post'})
            if tag:
                h2 = tag.find('h2', 'vlag')
                if h2:
                    new_h2 = new_tag(soup, 'h2', attrs=[('class', 'vlag')])
                    new_h2.append(self.tag_to_string(h2))
                    h2.replaceWith(new_h2)
                else:
                    h2 = tag.find('h2')
                    if h2:
                        new_h2 = new_tag(soup, 'h2', attrs=[
                                     ('class', 'sub_title')])
                        new_h2.append(self.tag_to_string(h2))
                        h2.replaceWith(new_h2)

                h1 = tag.find('h1')
                if h1:
                    new_h1 = new_tag(soup, 'h1')
                    new_h1.append(self.tag_to_string(h1))
                    h1.replaceWith(new_h1)

                # Slows down my reader.
                for movie in tag.findAll('span', attrs={'class': 'vvqbox vvqvimeo'}):
                    movie.extract()
                for movie in tag.findAll('span', attrs={'class': 'vvqbox vvqyoutube'}):
                    movie.extract()
                for iframe in tag.findAll('iframe'):
                    iframe.extract()

                fresh_soup = self.getFreshSoup(soup)
                fresh_soup.body.append(tag)

                return fresh_soup
            else:
                # This should never happen and other famous last words...
                return soup

    def getFreshSoup(self, oldSoup):
        freshSoup = BeautifulSoup(
            '<html><head><title></title></head><body></body></html>')
        if oldSoup.head.title:
            freshSoup.head.title.append(self.tag_to_string(oldSoup.head.title))
        return freshSoup
PK�XT%,��nejm.png�PNG


IHDR  ��oIDATx�uVUX\����t���_Yw�����B�ݐݠ�����wܝ0�93�p����s�������vYZ+}ϧ�S^�==흞���ew��t�%���D�g�8rT�HJ����\���Խ
�J);(WTU��p��w��_ѭ�xZ��r�_ȡ�{銕d�B2c6��S&fTw�Wp{�GR�)�Z57���E����jԇ������5$q��ɺ����R�T��8���؎�7in��cEh !�����P55���є�n`��xZWUk�����>��܅j�����Es3�9�ɚs�Aeۢ�Ì�T��(�$rtTNN�7}�u��a9:��K�!��̰%9 ?|o�_,'�E[f{bB��&d�zɮ��}�M	�+%��t�
?T���^�n�'� �nPg�������Q��!j�a�z�,������Ӻu�
dO7��G�����9������B�B8�\�L?�vyA>Td��HG숶VUR� 
軔rx���ɛ7���KaΜ�y�	+#
�/�<�5=�~���x�y���7ٮH۶,ΟCŹ�xS�����а��N�����c�Ep*��L~�(��JcbɆ��4�]��RS�Ν��N����$*Z�<��ff��I��xQY���5�r�!�hkl�.�P�q���JJ}�}�]E\t���`����ya�ܓȯ�@֓�ąlr!�H��\�ݪ��gg�1����|�~�C\�!���N�̄x�w/*���0X���9z��鵫J
�_ ��$:J��;�����M��̚����&�[���(փ�`�
Xj:OJ��df�G�]�ZI�_����O?�T��hM����)�B�P}+WA���F��
�UY�✟?g��o*;3�h���EV��-�Z[!�ZEk���Y��geʑ��s�IB�gg�5�1,rɘ�tk<@��ЃCxw�^\�"�|���D^��d�J�nT�����n����-�<07gΊ�(�5����K��jb��ع�Ѥ$q�(���`��
�QW�(���/���[��F7�(���Ѻ�
��ڑ��� }X
��#�x{����_���u�>���ܜ1��Y���Us���$˖��T��+SRd{f~�<�_~-�
�c�F
����G��DU
����y~��1�|6ۻ�E>�=�m�7�9s�Ȱ�oP�=�:(�9�|F].韠���
�Lskjb%%��-z�Dg��u��?(RR��+���'���d��g94��.��a����O�w�A���'�[��кv����	_���.��$=����-s<2Z\��bq���igK9�mm���g�ǿ-��9��2sOMfp]7��+ z��"a�v��_A�\���l����+d�Z�=BM��;�$#��!:;Q�C��R�v��AC������bbT{�b�,��.�Ӆ��qQQ�O��q	S��I�ъ������A����"�Mv� �z
Os/���ː^+h?~��^���R֮7R�� �%�7"/77�'�(�3g��h/Ʊ�d�2z�2�v�w�����D_~���xh�E�E���Kߛ��`�U,"B��a-��Ni��:�3��u
��_iL����oܤY 7'�Y^�1!f��ʼn�N�X��0|�1�ٱ�
���ϫ*��x����i^��˳lv�m�uq��e+����@uz�K�$���s��眀��!sw��͕�%|�|������rUS�~��4�򢢜쎕5��X��ؼ54�CC�s�;4l<���
���,݌�ѯ�f	���}}�3������w?OO#iꮮe�Ǜ߇5M)�OJ�Y�-�O�r�""�w`�7o1gυ_���� �Rxl���Ή�X�Չ3���M������{_vJ!��<����������1�l),���_����E�XY�.iut�Ͽ2I�!OG�m���\Iɶ����!�i�,ƠB�
2�n#/��N���~��U�3z���et�,�z=�ɖ==�J�O����������'��d������!�w`RB8�TD^>����F�O>�����U,9I����G?��??�6��3�IEND�B`�PK�X����	�	nejm.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class NEJM(BasicNewsRecipe):

    title = 'New England Journal of Medicine'
    __author__ = 'Kovid Goyal'
    description = 'Medical news'
    timefmt = ' [%d %b, %Y]'
    needs_subscription = True
    language = 'en'

    no_stylesheets = True
    keep_only_tags = [
            dict(id='content')
    ]
    remove_tags_after = dict(id='article_references')
    remove_attributes = ['width', 'height']

    # TO LOGIN
    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('https://www.nejm.org/action/showLogin?uri=http%3A%2F%2Fwww.nejm.org%2F')
        br.select_form(name='frmLogin')
        br['login'] = self.username
        br['password'] = self.password
        response = br.submit()
        raw = response.read()
        if '>Sign Out<' not in raw:
            raise Exception('Login failed. Check your username and password')
        return br

    # TO GET ARTICLE TOC
    def nejm_get_index(self):
        return self.index_to_soup('https://www.nejm.org/toc/nejm/medical-journal')

    # To parse article toc
    def parse_index(self):
        soup = self.nejm_get_index()
        feeds = []
        current_section = None
        articles = []
        div = soup.find(**classes('pagefulltext'))
        for x in div.findAll(name=['h2', 'li']):
            if x.name == 'h2':
                if current_section and articles:
                    feeds.append((current_section, articles))
                current_section = self.tag_to_string(x).strip()
                articles = []
                if current_section:
                    self.log(current_section)
            else:
                a = x.find('a')
                if a is None:
                    continue
                title = self.tag_to_string(a.find('strong')).strip()
                blurb = a.find(**classes('f-blurb'))
                desc = ''
                if blurb is not None:
                    desc = self.tag_to_string(blurb)
                self.log('\t', title)
                articles.append({'title': title, 'url': 'https://www.nejm.org' + a['href'], 'description': desc})

        if current_section and articles:
            feeds.append((current_section, articles))

        return feeds
PK�X|L�2VV
neowin.png�PNG


IHDR�aIDATx�e��i���l��m�6��m�^ێ�5g�������U]��Iz�+�ӵ���t5�f�6��JWRS{��vo�J��EQ^�k������`~|�����OCN0pA��<�w;��/	��K
��a/��>�ocC�}B�]ķO�a罌�{��9x��.�w��� �_��bn*�g��rF2-�%�br4�
❶;9r�>_`�P��/�#o{�< ^�1�L5��m�
�/ȤլZL���8t�&q)��gI�oܺpe8�w(�)�/u27HˠMt��m�g������Y�)
����wk��8~(~Ш@RC��Y
�;RA��9t^v�H��Ց���Hkw%oKA\��pQ����{��9�Y�dL���W�,ZÆ=�&i����(��-iF�Ƙ8(��q��G4z��ގ�fE	��o]+�ƙ�Cg���YM�������1�	"�
"�d��U�^z^M
u��f�&�,�Ɍ")%#{��e8�T�wS���g��dȖB��9\ΊQ�������*���$9-��T.���9�[�7�/����'�fn:��J���'3��ZT^��RF�˸u;��[C�(�[Hw(-�w.��]�Ǥp18��O���_d1xU%�2juy�%d�Jw1t���˱='���.��q�Y~���� >�z��ψ��t�V�PzH}��5�ְ{݁t�1����!>�y�_�<�oC�1m��R돘LƷ������56쏻R�s(4O $��Q�W��;,�Z
���z���x��IEND�B`�PK�Xx����
neowin.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class Neowin(BasicNewsRecipe):
    title = u'Neowin.net'
    oldest_article = 5
    language = 'en'
    description = 'News from IT'
    publisher = 'Neowin'
    category = 'news, IT, Microsoft, Apple, hardware, software, games'
    __author__ = 'Darko Miletic'
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf8'

    conversion_options = {
        'tags': category, 'language': language, 'comments': description, 'publisher': publisher
    }

    keep_only_tags = [dict(name='div', attrs={'id': 'article'})]
    remove_tags_after = dict(name='div', attrs={'id': 'tag-bar'})

    remove_tags = [
        dict(name=['base', 'object', 'link', 'iframe']), dict(
            name='div', attrs={'id': 'tag-bar'})
    ]

    feeds = [

    (u'Software', u'http://www.neowin.net/news/rss/software'),
    (u'Gaming', u'http://www.neowin.net/news/rss/gaming'),
    (u'Microsoft', u'http://www.neowin.net/news/rss/microsoft'),
    (u'Apple', u'http://www.neowin.net/news/rss/apple'),
    (u'Editorial', u'http://www.neowin.net/news/rss/editorial')
    ]

    def image_url_processor(cls, baseurl, url):
        return url
PK�X�`p�--nepszabadsag.png�PNG


IHDR  D���uPLTEL6���������m2[q7_s;bu=d�Yz���������������M7XCd%Q�z�������������̸���������WBM8P	:VA�]}�^~�������������d��i���VrsIDATx����@��m��7\+�礒�W^�i�u��UxK����S	�g>�wxD�P�2	������s=�����"�hB�w�>�U����hw���"�IEND�B`�PK�Xa�����nepszabadsag.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
'''
Fetch Népszabadság
'''
from calibre.web.feeds.news import BasicNewsRecipe


class nepszabadsag(BasicNewsRecipe):
    title = u'N\u00e9pszabads\u00e1g'
    description = ''
    __author__ = 'bubak'
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    oldest_article = 2
    max_articles_per_feed = 20
    no_stylesheets = True
    language = 'hu'
    simultaneous_downloads = 5

    remove_javascript = True
    cover_url = 'http://nol.hu/_design/image/logo_nol_live.jpg'

    feeds = [
        (u'Belföld', u'http://nol.hu/feed/belfold.rss')
    ]

    remove_attributes = []
    remove_tags_before = dict(name='div', attrs={'class': ['d-source']})
    remove_tags_after = dict(name='div', attrs={'class': ['tags']})
    remove_tags = [dict(name='div',   attrs={'class': ['h']}),
                   dict(name='tfoot')]

    keep_only_tags = [dict(name='table', attrs={'class': 'article-box'})]

    # NS sends an ad page sometimes but not frequently enough, TBD
    def AAskip_ad_pages(self, soup):
        if ('advertisement' in soup.find('title').string.lower()):
            href = soup.find('a').get('href')
            self.log.debug('Skipping to: ' + href)
            new = self.browser.open(href).read().decode('utf-8', 'ignore')
            # ipython(locals())
            self.log.debug('Finished: ' + href)
            return new
        else:
            return None
PK�X�ϼZ;;netzpolitik.png�PNG


IHDR(-S2PLTEo�������V������������qŒ��ᢽ����������������ߋ�ߏ�ᐺᑱᓼ┳╽㗿㘹㙸㚺䛸䛾������������W�ф�݈�����������������X��Y��[�ҥ�������������������������]��a��b��f��g��o����������������v��z��~���������������������������������t������3��8�������<��M��p����s�W�U�IDATx�%��A���i<k۶m�������4%��(+��d� 
"uLd�ÌL��+�`aP��,T�,�K�D�.�Gs�����5s���'l�WW+�U[p�z?�`�%�-��9Xe�����	��E�w9�ػz)f$������3�N���"؈?��R�s,�j�0��8�6�c�@��ם����-M����Ϛ�]IEND�B`�PK�X��0���netzpolitik.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Netzpolitik(BasicNewsRecipe):
    title = u'Netzpolitik'
    publication_type = 'newspaper'
    oldest_article = 14
    language = 'de'
    no_stylesheets = True
    __author__ = 'Kovid Goyal'
    max_articles_per_feed = 100
    use_embedded_content  = True

    feeds = [(u'Netzpolitik.org', u'https://netzpolitik.org/feed/')]

    def preprocess_html(self, soup):
        # Remove the duplicate title image.
        soup.body.img.decompose()
        return soup

    def get_cover_url(self):
        return 'https://netzpolitik.org/wp-upload/2018/11/cropped-np_favicon_004-1-484x484.png'
PK�X=6�ګ�neviditelny_pes.png�PNG


IHDR(-S�PLTE��������������������ď�Ì�����������������g��c��Tw�Os�In�Gm�7_�1[�*U�J�K�H�I�H�D�F�G�J�L�'S�(T�9a�?f�Ci�Fl�Kp�Ru�\}�r����ij�׷����������������������������������LwtRNSux|~�����������������N�IDAT�YR�00=;;4��A�-CHc�H�_:�8�p�A�ޛ��'��޲�j�ߗ�V���G8b9?+�[MbJ0��	 U����ϴ7d)tS�r=g�
�Kz�����qk��9&p~�4y�;e;
��>6p:�_)IEND�B`�PK�X�H~uneviditelny_pes.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class pesRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Neviditelný pes'
    publisher = u''
    description = u'Neviditelný pes'
    oldest_article = 1
    max_articles_per_feed = 20
    use_embedded_content = False
    remove_empty_feeds = True

    feeds = [
        (u'Neviditelný pes',
         u'http://neviditelnypes.lidovky.cz/export/rss.asp?c=pes_neviditelny')
    ]

    language = 'cs'
    cover_url = 'http://g.zpravy.cz/o/pes/logo_pes.jpg'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                            """

    remove_tags = []
    remove_tags_before = dict(name='div', attrs={'id': 'art-full'})
    remove_tags_after = dict(name='div', attrs={'id': 'authors'})
PK�X�!cSnew_london_day.png�PNG


IHDR  szz��IDATx��V�4G>��Nٍۘm�N�۶m۶m۶�Bl�__��m���	��3��ߴ�K]T�������轍F���+���C.M�=$���(���DV�$ۤ��A�~�<��{%S�<�?���=�Z�f��������Y.4#��F��ڻ�������z���yG�-T-��jF{+�f�y�K<�K�L���߂��`�{�KE�(
�h�^�&~gJ����R3(���p$�&I23O��洎h'r8ν��O�[����Z���R@��&��^�l���2q�zҍ��z}2|��#��3��Kt���-���3����<�>^wS(�(��ř��6EX���\x7)%#"KSf��4�J��Y9_�j�QQ<����<�9_Gp"��p��^�@��՜�7EV�52��3я
�X�`��<G��g�+@H:9�:XGpC5������D43�ʦȫ�
�1/�/�^�{�<��xx|��z���"�(��N��p/��1c�L�F�Yi?`������
/:���µ<z@N�{��@Ş�� {�o��X�^�*�|�5�yל��'M�4�
�uKk���"������A��nx�1)�ӎd�n���د�m�$k�zH��:�/���1M��$%\}��m鄩�=r޻�ʼ�u���)�f�M����+؊�J�1��En4A3�Y%#]��g��xc��"�n�HT��yK�y�܏��~���0+W��&d��B��:����=�wB�#;�O:�L��{����$�?~�6��Y�!�o@��M�^�j�į�������K6��ޟN��ބ�V��s�%��p�O���m�n�Z�C�O˜��n��#�)��GQ�m��=ɑ�}�L
��O���N
�)��^��$yٵZӤ$�����wB2�͊ؽ�j�\� s�&:_��F�Z'���5LIEND�B`�PK�X��RRnew_london_day.recipe__license__ = 'GPL 3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1294342201(BasicNewsRecipe):
    title = u'New London Day'
    __author__ = 'Being'
    description = 'State, local and business news from New London, CT'
    language = 'en'
    oldest_article = 1
    max_articles_per_feed = 200

    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    remove_tags_before = dict(id='article')
    remove_tags_after = dict(id='article')
    remove_tags = [dict(attrs={'class': ['articleTools', 'post-tools', 'side_tool', 'nextArticleLink clearfix']}),
                   dict(id=['footer', 'toolsRight', 'articleInline', 'navigation',
                            'archive', 'side_search', 'blog_sidebar', 'side_tool', 'side_index']),
                   dict(name=['script', 'noscript', 'style'])]
    remove_tags_after = [{'class': ['photo_article', ]}]
    remove_tags = [{'id': ["moduleArticleTools", "content-bottom", "rail", "articleRelates module", "toolSet", "relatedrailcontent", "div-wrapper", "beta", "atp-comments", "footer"]}, {'class': ["clearfix", "relatedTitle", "articleRelates module", "asset-footer", "tools", "comments", "featurePromo", "featurePromo fp-topjobs brownBackground", "clearfix fullSpan brownBackground", "curvedContent"]},  # noqa
                   dict(name='font', attrs={'id': ["cr-other-headlines"]})]
    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''

    feeds = [
        (u'All News', u'http://www.theday.com/section/rss'),
        (u'Breaking News', u'http://www.theday.com/section/rss01'),
        (u'Police and Courts', u'http://www.theday.com/section/rss02'),
        (u'State News', u'http://www.theday.com/section/rss03'),
        (u'Local Business', u'http://www.theday.com/section/rss04'),
        (u'Entertainment', u'http://www.theday.com/section/rss05'),
        (u'Opinion', u'http://www.theday.com/section/rss06'),
        (u'Casinos', u'http://www.theday.com/section/rss12'),
        (u'Defense and Military', u'http://www.theday.com/section/rss14'),
        (u'Ann Baldelli Ruminations', u'http://www.theday.com/section/rss20'),
        (u'Paul Choiniere Ruminations', u'http://www.theday.com/section/rss21'),
        (u'Michael Costanza Omnivore', u'http://www.theday.com/section/rss23'),
        (u'Rebecca Dangelo Reel Life', u'http://www.theday.com/section/rss25'), ]

    def print_version(self, url):
        return url.replace('/index.html', '/print.html')

    def get_article_url(self, article):
        return article.get('feedburner_origlink', article.get('guid', article.get('link')))

    def postprocess_html(self, soup, first_fetch):
        for t in soup.findAll(['table', 'tr', 'td']):
            t.name = 'div'

        for tag in soup.findAll('form', dict(attrs={'name': ["comments_form"]})):
            tag.extract()
        for tag in soup.findAll('font', dict(attrs={'id': ["cr-other-headlines"]})):
            tag.extract()

        return soup
PK�X4�Zqnew_scientist.png�PNG


IHDR(-SPLTE���XX[WWZ���XY[WXZ���\\_`abdegijlpqsstv���������UUV��������������YY[���������������]]_uvxvwy}~������			�����������noqaab���������������������VWY������������]]`���]^`���������^_a__`"""WW\aacabc���cdg===fgihikWX[HHI���������������������������RSSTTUYY\���[[]~����0D�IDATx^5�U��0DQ�d3�0333�2JR����������v�8�8��YOƷ����}��C�D�KfjB����sx_v6�^w�]L��.�PP8�躗��$������B�uQ�L���5�a��dj�$�bg
̇���0=S�)�����L�����R�/ח��J��?��y�a�U]0�hIEND�B`�PK�X�HB;;new_scientist.recipe##
# Title:        New Scientist RSS recipe
# Contact:      AprilHare, Darko Miletic <darko.miletic at gmail.com>
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    2008-2016, AprilHare, Darko Miletic <darko.miletic at gmail.com>
##
# Written:      2008
# Last Edited:  Jan 2016
##

'''
01-19-2012: Added GrayScale Image conversion and Duplicant article removals
12-31-2015: Major rewrite due to massive changes in site structure
01-27-2016: Added support for series index and minor cleanup
'''

__license__ = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'
__copyright__ = '2008-2016, AprilHare, Darko Miletic <darko.miletic at gmail.com>'
__version__ = 'v0.6.1'
__date__ = '2016-01-27'
__author__ = 'Darko Miletic'

'''
newscientist.com
'''

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 NewScientist(BasicNewsRecipe):
    title = 'New Scientist - Online News w. subscription'
    description = 'Science news and science articles from New Scientist, based on feeds.'
    language = 'en'
    publisher = 'Reed Business Information Ltd.'
    category = 'science news, science articles, science jobs, drugs, cancer, depression, computer software'
    oldest_article = 15
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    needs_subscription = 'optional'
    remove_empty_feeds = True
    ignore_duplicate_articles = {'url'}
    resolve_internal_links = True
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://cdn.shopify.com/s/files/1/0266/6843/3505/files/logo.svg?v=1629189295'

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    extra_css = '''
        img {display:block; margin:0 auto;}
        .ArticleHeader__Category { font-size:small; color:#404040; }
        .ArticleHeader__Author, .ArticleHeader__DateTimeWrapper { font-size:small; }
        .ArticleHeader__Copy { font-style:italic; color:#202020; }
        .ArticleImage { font-size:small; text-align:center; }
        .ArticleImageCaption__Credit { font-size:smaller; }
    '''

    keep_only_tags = [
        classes('ArticleHeader ArticleContent')
    ]

    remove_tags = [
        dict(name=['svg', 'button']),
        classes('ArticleHeader__SocialWrapper AdvertWrapper ReadMoreWithImage ArticleTopics')
    ]

    def preprocess_html(self, soup):
        time = soup.find(**classes('ArticleHeader__DateTimeWrapper'))
        if time:
            time.name = 'div'
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src'].split('?')[0] + '?width=700'
        for figc in soup.findAll('figcaption'):
            for p in figc.findAll('p'):
                p.name = 'div'
        return soup

    def get_article_url(self, article):
        ans = BasicNewsRecipe.get_article_url(self, article)
        return ans.partition('?')[0]

    def print_version(self, url):
        if '/video/' in url:
            return None
        return url

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            def is_login_form(form):
                return "action" in form.attrs and form.attrs['action'] == "/login/"

            br.open('https://www.newscientist.com/login/')
            br.select_form(predicate=is_login_form)
            br['email'] = self.username
            br['password'] = self.password
            res = br.submit().read()
            if b'>Your account<' not in res:
                raise ValueError('Failed to log in to New Scientist, check your username and password')
        return br

    feeds = [
        ('News', 'https://www.newscientist.com/section/news/feed/'),
        ('Features', 'https://www.newscientist.com/section/features/feed/'),
        ('Physics', 'https://www.newscientist.com/subject/physics/feed/'),
        ('Technology', 'https://www.newscientist.com/subject/technology/feed/'),
        ('Space', 'https://www.newscientist.com/subject/space/feed/'),
        ('Life', 'https://www.newscientist.com/subject/life/feed/'),
        ('Earth', 'https://www.newscientist.com/subject/earth/feed/'),
        ('Health', 'https://www.newscientist.com/subject/health/feed/'),
        ('Humans', 'https://www.newscientist.com/subject/humans/feed/'),
    ]

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.newscientist.com/issues/current/')
        div = soup.find('div', attrs={'class':'ThisWeeksMagazineHero__CoverInfo'})
        return div.find(**classes('ThisWeeksMagazineHero__ImageLink')).img['src']
PK�Xt�new_scientist_mag.png�PNG


IHDR(-SQPLTE���A���+C`���������";ZBXr"D������������Ѩ��3R���as�+LI^vdv����s��l}�'H���G:d�IDAT�m���0`����F�[��P�k��@�nt��b^,�+T�j�M@$�	�R�CEʏ�O��
X����
�g'g�'�h~���{�,?���.	�IB��
G�.�/�?��Uކ뜱IEND�B`�PK�X)3��  new_scientist_mag.recipe'''
newscientist.com
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes

class NewScientist(BasicNewsRecipe):
    title = 'New Scientist Magazine'
    __author__ = 'unkn0wn'
    description = (
        'New Scientist is the world’s most popular weekly science and technology publication. '
        'We cover international news from a scientific standpoint, and ask the big-picture questions '
        'about life, the universe and what it means to be human. If someone in the world has a good idea, '
        'you will read about it in New Scientist.'
    )
    language = 'en'
    publisher = 'Reed Business Information Ltd.'
    category = 'science news, science articles, science jobs, drugs, cancer, depression, computer software'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    needs_subscription = 'optional'
    remove_empty_feeds = True
    ignore_duplicate_articles = {'url'}
    resolve_internal_links = True
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://cdn.shopify.com/s/files/1/0266/6843/3505/files/logo.svg?v=1629189295'

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            def is_login_form(form):
                return "action" in form.attrs and form.attrs['action'] == "/login/"

            br.open('https://www.newscientist.com/login/')
            br.select_form(predicate=is_login_form)
            br['email'] = self.username
            br['password'] = self.password
            res = br.submit().read()
            if b'>Your account<' not in res:
                raise ValueError('Failed to log in to New Scientist, check your username and password')
        return br

    # def print_version(self, url):
    #     return 'https://webcache.googleusercontent.com/search?q=cache:' + url.split('?')[0]

    extra_css = '''
        img {display:block; margin:0 auto;}
        .ArticleHeader__Category { font-size:small; color:#404040; }
        .ArticleHeader__Author, .ArticleHeader__DateTimeWrapper { font-size:small; }
        .ArticleHeader__Copy { font-style:italic; color:#202020; }
        .ArticleImage { font-size:small; text-align:center; }
        .ArticleImageCaption__Credit { font-size:smaller; }
    '''

    keep_only_tags = [
        classes('ArticleHeader ArticleContent')
    ]

    remove_tags = [
        dict(name=['svg', 'button']),
        classes('ArticleHeader__SocialWrapper AdvertWrapper ReadMoreWithImage ArticleTopics')
    ]

    def parse_index(self):
        soup = self.index_to_soup('https://www.newscientist.com/issues/current/')
        div = soup.find('div', attrs={'class':'ThisWeeksMagazineHero__CoverInfo'})
        tme = div.find(**classes('ThisWeeksMagazineHero__MagInfoHeading'))
        self.log('Downloading issue:', self.tag_to_string(tme))
        self.timefmt = ' [' + self.tag_to_string(tme) + ']'
        self.cover_url = div.find(**classes('ThisWeeksMagazineHero__ImageLink')).img['src']

        feeds = []
        for cont in soup.findAll(attrs={'class':'TableOfContents__Section'}):
            sec = self.tag_to_string(cont.find('h3'))
            self.log(sec)
            articles = []
            for a in cont.findAll('a', attrs={'class':'CardLink'}):
                url = a['href']
                if url.startswith('http') is False:
                    url = 'https://www.newscientist.com' + a['href']
                title = self.tag_to_string(a.find(**classes('Card__Title')))
                desc = ''
                desc += self.tag_to_string(a.find(**classes('Card__Category')))
                teaser = a.find(**classes('Card__TeaserCopy'))
                if teaser:
                    desc += ' | ' + self.tag_to_string(teaser)
                self.log('\t', title, '\n\t', desc, '\n\t\t', url)
                articles.append({'title': title, 'description': desc, 'url': url})
            if articles:
                feeds.append((sec, articles))
        return feeds

    def preprocess_html(self, soup):
        time = soup.find(**classes('ArticleHeader__DateTimeWrapper'))
        if time:
            time.name = 'div'
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src'].split('?')[0] + '?width=700'
        for figc in soup.findAll('figcaption'):
            for p in figc.findAll('p'):
                p.name = 'div'
        return soup
PK�X'C�ynew_statesman.png�PNG


IHDR(-SwPLTE������������������������皨䎞멵����|���UY����6;��:?졫�!@�=�%C�%蛩����16���������
����cx�%쯻����7S꧳����7;���RU�
����]s�!�aw�������49�EJ�.2�
�ru����衮�)��0�Qj����37�]a���#'�
������飰�D^�
.��n�����6:������������㇘�Ib����*/�NR����
�	�]t�$C���ဒ����~������MQ�����z��0�;�3�6R����������������������쭷�`IDAT�c` 020��_������P�B>��1�00�i�>��! n����!��,H��4fdH?j�8'�����ǃa�o��2ޖ�>��IEND�B`�PK�X9F4���new_statesman.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2018, Darko Miletic <darko.miletic at gmail.com>'
'''
www.newstatesman.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class NewStatesman(BasicNewsRecipe):
    title = 'New Statesman'
    __author__ = 'Darko Miletic'
    description = "Current affairs, world politics, the arts and more from Britain's award-winning magazine"
    publisher = 'New Statesman Media'
    category = 'New Statesman magazine, International Politics, British Politics, Britain, UK, Tony Blair, Gordon Brown, Geoffrey Robinson, David Cameron, Sir Menzies Campbell, Labour, Conservative, Liberal Democrat, UK Politics, House of Commons, House of Lords, Legislation, politics magazine'  # noqa
    oldest_article = 30
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = True
    language = 'en_GB'
    remove_empty_feeds = True
    publication_type = 'magazine'
    auto_cleanup = True
    resolve_internal_links = True
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://www.newstatesman.com/sites/all/themes/creative-responsive-theme/images/newstatesman_logo@2x.png'

    extra_css = """
        body{font-family: serif}
        img{margin-top:1em; margin-bottom: 1em; display:block}
    """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    feeds = [(u'Articles', u'https://www.newstatesman.com/feed')]
PK�X��MMnew_york_review_of_books.png�PNG


IHDR  D���PLTE����������̀��{{��QQ�aa�>>�BB�����Х�''�--э��GG�����22�44���CCЊ�̂�ݫ��DD��HH�JJ�LL�NN��YY�ZZ�^^�__��dd�ee�kk�ll�nn�tt�uu�zz��}}�  �##�

�++ю�Ґ�֚�ל��,,ݬ�ެ�ޯ�ⷷ㺺佽�����������͟������������������������������������77�::�==�?�tRNS��Y<��IDATx��уz�@�Μ蚵m۶ݾ�{4Nj{ֻ���1E��e��"W�Q}@U{LUU���W��W9@]#v��U��$s$@�{�0��O��sX�M��ӽ@�+�:�H�DN�QM$L�cs-�='- �%�[�Ԏ�Z��3�
^8���L�KHM��@��Q��"�������2�at����m�������/����@B��{	�5���H,�<� �&��[��IEND�B`�PK�X�/N�
�
new_york_review_of_books.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

'''
nybooks.com
'''

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)})


def absurl(url):
    if url.startswith('//'):
        url = 'https:' + url
    elif url.startswith('/'):
        url = 'https://www.nybooks.com' + url
    return url


class NewYorkReviewOfBooks(BasicNewsRecipe):

    title = u'New York Review of Books'
    description = u'Book reviews'
    language = 'en'

    __author__ = 'Kovid Goyal'

    no_stylesheets = True
    no_javascript = True
    needs_subscription = True

    keep_only_tags = [
        dict(name='h1'),
        classes('author article-col article-main-content review-items'),
    ]
    remove_tags = [
        classes('inline-ad'),
    ]
    remove_tags_after = classes('article-main-content')

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('https://www.nybooks.com/account/signin/')
        br.select_form(id='loginform')
        br['log'] = self.username
        br['pwd'] = self.password
        br.submit()
        return br

    def parse_index(self):
        soup = self.index_to_soup('https://www.nybooks.com/current-issue')
        # from calibre.utils.ipython import ipython
        # ipython({'soup': soup})

        # Find cover
        cover = soup.find('img', attrs={'class':'border-light-gray'})
        if cover is not None:
            self.cover_url = absurl(cover['src'])
            self.log('Found cover at:', self.cover_url)

        # Find date
        div = soup.find('p', **classes('h2'))
        if div is not None:
            text = self.tag_to_string(div)
            self.timefmt = text
            self.log('Issue date:', text)

        # Find TOC
        articles = []
        for h4 in soup.findAll('h4'):
            title = self.tag_to_string(h4).strip()
            url = absurl(h4.find('a')['href'])
            author = self.tag_to_string(h4.parent.parent.find('a'))
            title = title + ' (%s)' % author
            desc = ''
            div = h4
            while div.next_sibling:
                div = div.next_sibling
                desc += self.tag_to_string(div).strip()
            self.log('Found article:', title)
            self.log('\t', url)
            self.log('\t', desc)
            articles.append({'title': title, 'url': url, 'date': '',
                                'description': desc})

        return [('Current Issue', articles)]
PK�X��MM#new_york_review_of_books_no_sub.png�PNG


IHDR  D���PLTE����������̀��{{��QQ�aa�>>�BB�����Х�''�--э��GG�����22�44���CCЊ�̂�ݫ��DD��HH�JJ�LL�NN��YY�ZZ�^^�__��dd�ee�kk�ll�nn�tt�uu�zz��}}�  �##�

�++ю�Ґ�֚�ל��,,ݬ�ެ�ޯ�ⷷ㺺佽�����������͟������������������������������������77�::�==�?�tRNS��Y<��IDATx��уz�@�Μ蚵m۶ݾ�{4Nj{ֻ���1E��e��"W�Q}@U{LUU���W��W9@]#v��U��$s$@�{�0��O��sX�M��ӽ@�+�:�H�DN�QM$L�cs-�='- �%�[�Ԏ�Z��3�
^8���L�KHM��@��Q��"�������2�at����m�������/����@B��{	�5���H,�<� �&��[��IEND�B`�PK�X�W��]	]	&new_york_review_of_books_no_sub.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

'''
nybooks.com
'''

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)})


def absurl(url):
    if url.startswith('//'):
        url = 'https:' + url
    elif url.startswith('/'):
        url = 'https://www.nybooks.com' + url
    return url


class NewYorkReviewOfBooks(BasicNewsRecipe):

    title = u'New York Review of Books (no subscription)'
    description = u'Book reviews'
    language = 'en'

    __author__ = 'Kovid Goyal'

    no_stylesheets = True
    no_javascript = True

    keep_only_tags = [
        dict(name='h1'),
        classes('author article-col article-main-content review-items'),
    ]
    remove_tags = [
        classes('inline-ad'),
    ]
    remove_tags_after = classes('article-main-content')

    def parse_index(self):
        soup = self.index_to_soup('https://www.nybooks.com/current-issue')
        # from calibre.utils.ipython import ipython
        # ipython({'soup': soup})

        # Find cover
        cover = soup.find('img', attrs={'class':'border-light-gray'})
        if cover is not None:
            self.cover_url = absurl(cover['src'])
            self.log('Found cover at:', self.cover_url)

        # Find date
        div = soup.find('p', **classes('h2'))
        if div is not None:
            text = self.tag_to_string(div)
            self.timefmt = text
            self.log('Issue date:', text)

        # Find TOC
        articles = []
        for h4 in soup.findAll('h4'):
            title = self.tag_to_string(h4).strip()
            url = absurl(h4.find('a')['href'])
            author = self.tag_to_string(h4.parent.parent.find('a'))
            title = title + ' (%s)' % author
            desc = ''
            div = h4
            while div.next_sibling:
                div = div.next_sibling
                desc += self.tag_to_string(div).strip()
            self.log('Found article:', title)
            self.log('\t', url)
            self.log('\t', desc)
            articles.append({'title': title, 'url': url, 'date': '',
                                'description': desc})

        return [('Current Issue', articles)]
PK�XO(��new_yorker.png�PNG


IHDR:����IDATx�E�11i��|�@<D
&���x�@
.!��SP��d&��������E����v�\O��2�8��qEo0���l#c��L�M1g�Ub�
���h	�΂j��ls"�0qMi2���#���wR���C�8b�>_���$9(IEND�B`�PK�X�wuunew_yorker.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
from __future__ import absolute_import, division, print_function, unicode_literals
from collections import OrderedDict

from calibre import browser
from calibre.ebooks.BeautifulSoup import Tag
from calibre.web.feeds.news import BasicNewsRecipe, classes, prefixed_classes


def absurl(x):
    if x.startswith('/') and not x.startswith('//'):
        x = 'https://www.newyorker.com' + x
    return x


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class NewYorker(BasicNewsRecipe):

    title = "The New Yorker Magazine"
    description = "Articles of the week's New Yorker magazine"

    url_list = []
    language = 'en'
    __author__ = 'Kovid Goyal'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    encoding = 'utf-8'
    extra_css = '''
        img { display:block; margin:0 auto; }
        .byline { font-size:smaller; font-weight: bold;}
        h3 { margin-bottom: 6px; }
        .caption { font-size: smaller; font-style: italic; font-weight: normal; }
    '''

    keep_only_tags = [
        prefixed_classes(
            'SplitScreenContentHeaderHed- SplitScreenContentHeaderDek- SplitScreenContentHeaderByline-'
            ' SplitScreenContentHeaderLeadWrapper-'
        ),
        classes(
            'split-screen-content-header__dek split-screen-content-header__hed'
            ' content-header__dek content-header__hed content-header__publish-date content-header__lede-block'
            ' content-header__rubric--issue-date content-header__lead-asset'
            ' split-screen-content-header__publish-date split-screen-content-header__lede-block'
            ' article__body bylines featured-image byline-and-date inset-mobile-crop-image hero-image-caption'
        ),
    ]
    remove_tags = [
        classes(
            'social-icons'
        ),
        prefixed_classes('ConsentBannerWrapper- ResponsiveCartoonCTA-'),
        dict(childtypes='iframe'),
        dict(name='svg'),
    ]
    remove_attributes = ['style']

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            # Reduce image sizes to get file size below amazon's email
            # sending threshold
            self.web2disk_options.compress_news_images = True
            self.web2disk_options.compress_news_images_auto_size = 5
            self.log.warn('Kindle Output profile being used, reducing image quality to keep file size below amazon email threshold')

    def preprocess_html(self, soup):
        w = '/w_320' # use '/w_640' for highres
        for img in soup.findAll('img'):
            if img.has_attr('srcset'):
                for x in img['srcset'].split():
                    if w in x:
                        img['src'] = x
            elif img.find_previous_sibling('source', attrs={'srcset':True}):
                srcset = img.find_previous_sibling('source', attrs={'srcset':True})
                for x in srcset['srcset'].split():
                    if w in x:
                        img['src'] = x
                    elif '/w_560' in x:
                        img['src'] = x
        for src in soup.findAll('source'):
            src.decompose()
        for noscript in soup.findAll('noscript'):
            noscript.name = 'div'
        return soup

    # def preprocess_image(self, img_data, image_url):
        # from PIL import Image
        # from calibre import fit_image
        # from io import BytesIO
        # img = Image.open(BytesIO(img_data)).convert('RGB')
        # scaled, nwidth, nheight = fit_image(img.width, img.height, 1024, 1024)
        # if scaled:
            # img = img.resize((nwidth, nheight))
        # buf = BytesIO()
        # img.save(buf, format='JPEG')
        # return buf.getvalue()

    def parse_index(self):
        # Get cover
        cover_soup = self.index_to_soup('https://www.newyorker.com/archive')
        cover_img = cover_soup.find(
            attrs={'class': lambda x: x and 'MagazineSection__cover___' in x})
        if cover_img is not None:
            cover_img = cover_img.find('img')
            if cover_img is not None:
                self.cover_url = cover_img.get('src')
                try:
                    # the src original resolution w_280 was too low, replace w_280 with w_560
                    cover_url_width_index = self.cover_url.find("w_")
                    old_width = self.cover_url[cover_url_width_index:cover_url_width_index+5]
                    self.cover_url = self.cover_url.replace(old_width, "w_560")
                except Exception:
                    self.log('Failed enlarging cover img, using the original one')
                self.log('Found cover:', self.cover_url)

        # Get content

        soup = self.index_to_soup(
            'https://www.newyorker.com/magazine?intcid=magazine')
        stories = OrderedDict()  # So we can list sections in order

        # Iterate sections of content

        for section_soup in soup.findAll(
            attrs={'class': lambda x: x and 'MagazinePageSection__section___21cc7' in x}):
            section = section_soup.find('h2').text
            self.log("Found section:", section)

            # Iterate stories in section

            is_mail_section = (section == "Mail")

            if is_mail_section:
                cname = "Link__link___"
            else:
                cname = "River__riverItemContent___"

            for story in section_soup.findAll(
                attrs={'class': lambda x: x and cname in x}):

                title = ""
                url = ""
                desc = ""

                if is_mail_section:
                    title = story.text
                    url = absurl(story['href'])
                else:
                    h4 = story.find('h4')
                    title = self.tag_to_string(h4)
                    a = story.find('h4').parent
                    url = absurl(a['href'])
                    # Get description
                    body = story.find(attrs={'class': 'River__dek___CayIg'})
                    if body is not None:
                        desc = str(body.contents[0])

                self.log('Found article:', title)
                self.log('\t' + url)
                self.log('\t' + desc)
                self.log('')

                if section not in stories:
                    stories[section] = []
                stories[section].append({
                    'title': title,
                    'url': url,
                    'description': desc})

        return [(k, stories[k]) for k, v in stories.items()]

    # The New Yorker changes the content it delivers based on cookies, so the
    # following ensures that we send no cookies
    def get_browser(self, *args, **kwargs):
        return self

    def clone_browser(self, *args, **kwargs):
        return self.get_browser()

    def open_novisit(self, *args, **kwargs):
        br = browser()
        return br.open_novisit(*args, **kwargs)

    open = open_novisit
PK�X�>��rrnewrepublicmag.png�PNG


IHDR  V%(9IDATx�+�q����$t������dpH�(O���j0�(;�(Y�I�h�HdPJ!,R��(ũ�I|��`�z����-�ڶ�)�m/Vq���مE�|�I���xh�.~�F���͈7�z�\LJ��Lf�I��u���h�.}�k����G�$���>K���:S *E0�nI���Ҽ�O�"�F%-Ҝ��85�a��"���4Qo��̮u�˴&�R7%M�v(ݖ�cZ
�v5�IKPy/m�-Hs�^�2�<�5`@� �<
g��I�P�i�֢���z"k7����)X�(�'����WZ1}ߖ=m!IEND�B`�PK�X՛?�?%?%newrepublicmag.recipe"""
newrepublic.com
"""
import json
from functools import cmp_to_key
from urllib.parse import urljoin, urlencode, urlsplit, urlparse

from calibre import iswindows
from calibre.ebooks.BeautifulSoup import BeautifulSoup
from calibre.utils.date import parse_date
from calibre.web.feeds.news import BasicNewsRecipe


_issue_url = ""  # example: https://newrepublic.com/magazine/may-2023


def sort_section(a, b, sections_sort):
    try:
        a_index = sections_sort.index(a["section"])
    except ValueError:
        a_index = 999
    try:
        b_index = sections_sort.index(b["section"])
    except ValueError:
        b_index = 999

    if a_index < b_index:
        return -1
    if a_index > b_index:
        return 1
    if a["section"] == b["section"]:
        return -1 if a["date"] < b["date"] else 1
    return -1 if a["section"] < b["section"] else 1


class NewRepublicMagazine(BasicNewsRecipe):
    title = "The New Republic Magazine"
    language = "en"
    __author__ = "ping"
    description = (
        "Founded in 1914, The New Republic is a media organization dedicated to addressing "
        "today’s most critical issues. https://newrepublic.com/magazine"
    )
    publication_type = "magazine"
    use_embedded_content = False
    masthead_url = "https://images.newrepublic.com/f5acdc0030e3212e601040dd24d5c2c0c684b15f.png?w=512&q=65&dpi=1&fit=crop&crop=faces&h=256"
    remove_attributes = ["height", "width"]
    ignore_duplicate_articles = {"title", "url"}
    remove_empty_feeds = True
    compress_news_images_auto_size = 6
    requires_version = (5, 0, 0)

    BASE_URL = "https://newrepublic.com"

    extra_css = """
    h1.headline { margin-bottom: 0.4rem; }
    h2.subheadline { font-style: italic; margin-bottom: 1rem; font-weight: normal; }
    .article-meta {  margin-bottom: 1rem; }
    .article-meta span { display: inline-block; font-weight: bold; margin-right: 0.5rem; }
    .article-meta span:last-child { font-weight: normal; }
    div.pullquote { font-size: 1.25rem; margin-left: 0; text-align: center; }
    .lede-media img, .article-embed img, img {
        display: block; margin-bottom: 0.3rem; max-width: 100%; height: auto;
        box-sizing: border-box;
    }
    .lede-media .caption, .article-embed .caption { font-size: 0.8rem; }
    div.author-bios { margin-top: 2rem; font-style: italic; border-top: solid 1px dimgray; }
    """

    def _article_endpoint(self, nid):
        """
        Graphql endpoint to fetch full article
        :param nid:
        :return:
        """
        query = """
query ($id: ID, $nid: ID) {
  Article(id: $id, nid: $nid) {
    ...ArticlePageFields
  }
}
fragment ArticlePageFields on Article {
  id
  nid
  slug
  title
  cleanTitle
  badge
  frontPage {
    id
    slug
    title
  }
  LinkedSeriesId
  authors {
    id
    name
    slug
    blurb
    meta {
      twitter
    }
  }
  body
  publishedAt
  displayAt
  publicPublishedDate
  status
  ledeImage {
    id
    src
    format
    width
    height
    alt
  }
  ledeAltImage {
    id
    src
    format
    width
    height
    alt
  }
  url
  urlFull
  meta {
    wordCount
    template
    navigationTheme
    bigLede
    hideLede
    cropModeFronts
    ledeOverrideSource
    disableAds
  }
  ledeImageCredit
  ledeImageCreditBottom
  ledeImageRealCaption
  bylines
  deck
  type
  galleries {
    id
    galleryData {
      captionText
      creditText
      image {
        id
        src
        width
        height
      }
    }
  }
  tags {
    id
    slug
    label
  }
}"""
        params = {"query": query, "variables": json.dumps({"nid": str(nid)})}
        return f"https://newrepublic.com/graphql?{urlencode(params)}"

    def _resize_image(self, image_url, width, height):
        """
        Rewrite the image url to fetch a device appropriate sized one instead
        of the full-res one

        :param image_url:
        :param width:
        :param height:
        :return:
        """
        crop_params = {
            "auto": "compress",
            "ar": f"{width}:{height}",
            "fm": "jpg",
            "fit": "crop",
            "crop": "faces",
            "ixlib": "react-9.0.2",
            "dpr": 1,
            "q": 65,
            "w": self.scale_news_images[0] if self.scale_news_images else 800,
        }
        url_tuple = urlsplit(image_url)
        return f"{url_tuple.scheme}://{url_tuple.netloc}{url_tuple.path}?{urlencode(crop_params)}"

    def populate_article_metadata(self, article, soup, first):
        # pick up the og link from preprocess_raw_html() and set it as url instead of the api endpoint
        og_link = soup.select("[data-og-link]")
        if og_link:
            article.url = og_link[0]["data-og-link"]

    def preprocess_raw_html(self, raw_html, url):
        # formulate the api response into html
        article = json.loads(raw_html)["data"]["Article"]
        # Example: 2022-08-12T10:00:00.000Z
        date_published_loc = parse_date(article["publishedAt"])
        # authors
        author_bios_html = ""
        post_authors = []
        try:
            post_authors = [a["name"] for a in article.get("authors", [])]
            if post_authors:
                author_bios_html = "".join(
                    [a.get("blurb", "") for a in article.get("authors", [])]
                )
                author_bios_html = f'<div class="author-bios">{author_bios_html}</div>'
        except (KeyError, TypeError):
            pass

        # lede image
        lede_image_html = ""
        if article.get("ledeImage"):
            img = article["ledeImage"]
            lede_img_url = self._resize_image(
                urljoin(self.BASE_URL, img["src"]), img["width"], img["height"]
            )
            lede_image_caption = ""
            if article.get("ledeImageRealCaption"):
                lede_image_caption = (
                    f'<span class="caption">{article["ledeImageRealCaption"]}>/span>'
                )
            lede_image_html = f"""<p class="lede-media">
                <img src="{lede_img_url}">{lede_image_caption}
                </p>"""

        body_soup = BeautifulSoup(article["body"], features="html.parser")
        for img in body_soup.find_all("img", attrs={"data-serialized": True}):
            try:
                img_info = json.loads(img["data-serialized"])
                img_src = self._resize_image(
                    urljoin(self.BASE_URL, img_info["src"]),
                    img_info["width"],
                    img_info["height"],
                )
                img["src"] = img_src
                del img["data-serialized"]
            except:  # noqa
                pass

        return f"""<html>
        <head><title>{article["cleanTitle"]}</title></head>
        <body>
            <article data-og-link="{article["urlFull"]}">
            <h1 class="headline">{article["cleanTitle"]}</h1>
            {('<h2 class="subheadline">' + article["deck"] + "</h2>") if article.get("deck") else ""}
            <div class="article-meta">
                {f'<span class="author">{", ".join(post_authors)}</span>' if post_authors else ""}
                <span class="published-dt">
                    {date_published_loc:{"%b %d, %Y" if iswindows else "%b %-d, %Y"}}
                </span>
            </div>
            {lede_image_html}
            {str(body_soup)}
            {author_bios_html}
            </article>
        </body></html>"""

    def parse_index(self):
        br = self.get_browser()
        params = ""
        if _issue_url:
            month = urlparse(_issue_url).path.split("/")[-1]
            params = f'?{urlencode({"magazineTag": month})}'
        res = br.open_novisit(f"https://newrepublic.com/api/content/magazine{params}")
        magazine = json.loads(res.read().decode("utf-8"))["data"]
        self.log.debug(f'Found issue: {magazine["metaData"]["issueTag"]["text"]}')
        self.timefmt = f': {magazine["metaData"]["issueTag"]["text"]}'
        self.cover_url = urljoin(self.BASE_URL, magazine["metaData"]["image"]["src"])

        feed_articles = []
        for k, articles in magazine.items():
            if not (k.startswith("magazine") and articles):
                continue
            try:
                for article in articles:
                    self.log.debug(f'Found article: {article["title"]}')
                    feed_articles.append(
                        {
                            "url": self._article_endpoint(article["nid"]),
                            "title": article["title"].replace("\n", " "),
                            "description": article.get("deck", ""),
                            "date": article["publishedAt"],
                            "section": k[len("magazine") :],
                        }
                    )
            except TypeError:
                # not iterable
                pass

        sort_sections = [
            "Cover",
            "Editorsnote",
            "Features",
            "StateOfTheNation",
            "ResPublica",
            "Columns",
            "Upfront",
            "Backstory",
            "SignsAndWonders",
            "Usandtheworld",
            "Booksandthearts",
            "Poetry",
            "Exposure",
        ]
        sort_category_key = cmp_to_key(lambda a, b: sort_section(a, b, sort_sections))
        return [
            (
                magazine["metaData"]["issueTag"]["text"],
                sorted(feed_articles, key=sort_category_key),
            )
        ]
PK�X$�e���
news24.png�PNG


IHDR  szz�NIDATx^��mp�����
��,�������	):-�C+�X5"vb��`AE�"""mf��7��X�������ߠ�R��
"$�		I�ɾd�y���3��i3���f��={���sgW�(�f�\�W�6�j(� 0?�]9dH����N�T�…6	[TU�7�7��c��	��F]L'_�
u�%/�/rBɳ���C�>��p�~]D"16l�BI
0�mҤ�&I4צ���&X�l���q�G83�k�������ii	{'J�3���8Fm�1M�!�&2��#Zl2�\�q:�Ȕ)knn�^)?�fo��_��9eL�}��>Ź�f�Z�G~X���w���C�w���ضa�CL�����V�����Y[yv׿�Y�Í�,ߟ]Ƒ�AR�&�=	�`���W� M��:J�TV6���̞>�g�?D �Wr�w�Ӝ9��ъj�3�9[u��g(]2�E�&1��/���@\0qb�<�h*#���;�XwYN5�ihhg�ï�nG����w�Ǽ{�w����ցS�\�,�џ��6o�u��O�!sg�'���3Y��$j�ښ��K�5�q�v4;ݯ���e�m�P6Wwl�C�n�l����]�宠���i7��1�s��g���9�����#�
��-��L$�1��+����&�ɱ�ܷpK���҇v�
���ᑳ��.�
Gi	k�2e��m{�;�,�wNb�cd��I-A
����7�'���g1�h"p�-c4�*��Q"L�6���%�S����曯c�[�ի~��8�~̙3���ٷ���Y�H%9��u㎡^9��$at�G�������v���#ş�=a��v�#Tͣ��y�.~���;�󿈞<E�ÏR�d9���VOɛv����b"��`�)�'���_h��W4nڂ:�ح�4�ZCx�.�/�&^u� I�F��#i^�V���#�{^��/n��[oۖ�-�$r�#�r3�ȥ�e����	>w�x���\9�Z�ph�����o�@�{W���@��oʅ3g�>v������P���ھCd�լL8�9��1F�D\4e�Kn�!�ȡ���TM���ldH>��c���xXu

kK1��>�����t�<�A1��J˲�"@��D<1$���/������f��ttP����|v��9�ș�cZ^��(��ɘ��%U%���*X�)�W�"z>(��3���z���,-���v�h�/�MK%8��K<q�" 1��
��Jv�C\x���g��oh�Z�+���Ԯ۠ڻ7�+���߫y\��*��g��@,K�Sx*��4�fK��=�	�ɚ8��ƙ�Fk�L�oJ�44����I��'RsD��e�	D�������W� �GS{��*@�pf�c��
%���.���w߅?+�8�*+i=~��}�z��I��떂sO>M�{q]�u��j��@J
"T�~=���%-w����Z�\?�T�dd�1q8���	:y
����!y�
&�IH���&ѩ	��+��ރd��5k�h��ܨ��􂡌޸�k[��ϧ�.$t�mF��MO��_�(�C�p��G�����K�����{�U�=�?W������hB�t���^T�
�45�al��p��tC
�
�y#�"@D�;6Q��6^ou��ل��t��W8��,F,��A���<oO�G�*��Scǒ5���J��
r�^�l��{@z�����Oz��U���ɓ������R��SZ�&�M��f��e�T�q�
��w�7cY�}~`��5uݺwG��jyy�|��ֶs�\�ReY�R,kA��>��M@����>��W�G��Z��ش-���IEND�B`�PK�X�<�yxx
news24.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1375900744(BasicNewsRecipe):
    title = u'News24'
    description = "News24."
    __author__ = 'Nicki de Wet'
    publisher = 'Media24'
    category = 'news, politics, South Africa'
    oldest_article = 3
    max_articles_per_feed = 20
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    auto_cleanup = False
    language = 'en_ZA'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    masthead_url = 'http://www.24.com/images/widgethead_news.png'
    extra_css             = """
                                body{font-family: Arial,Helvetica,sans-serif }
                                img{display: block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['object', 'embed', 'iframe', 'table', 'meta', 'link']),
        dict(attrs={
            'class': ['TwitterfacebookLink', 'superSportArticleBlock',
                      'videoHighlights', 'facebookComments', 'share',
                      'item_block', 'kalahari_product left', 'block red',
                      'credit']}),
        dict(attrs={'id': ['comments_wrap', 'article_toolbox_bot',
                           'inside_news', 'sponsored-links', 'lnkGalleries',
                           'relatedlinks_box', 'lnkUserGalleries',
                           'lnkNewsGalleries', 'relatedlinks',
                           'divRelatedLinks']})]

    keep_only_tags = [
        dict(attrs={'class': ['left col633', 'article col626',
                              'columnWrapperLeft', 'articlecolumn',
                              'article_img', 'picture_caption', 'DiveTable']})]

    feeds = [
        (u'Top Stories', u'http://feeds.news24.com/articles/news24/TopStories/rss'),
        (u'South Africa', u'http://feeds.news24.com/articles/news24/SouthAfrica/rss'),
        (u'World', u'http://feeds.news24.com/articles/news24/World/rss'),
        (u'Sport', u'http://feeds.24.com/articles/sport/featured/topstories/rss')]
PK�X���E��news324.png�PNG


IHDR  szz�xIDATx^��o�\e���3�v�G����]���/l�JA�m����"`*ՈiVA-*V,�DMCLk�&j���X��R�	��\��ѵ��J�K��t��s����$�If7�T�FO��}s����9��s��/��F�)��W��&�Ѥ������Le%�I��m�m �Z9�fU�壼c��k�ߗw��%�3�M�wဘ��F��a}�����j7z������)	���8(H��8q)�7�C��^g�y�i�/�y��<F��H|&�u4'D�ʹ>ȵ����Qf
�;�C��P��PU�q>��*�Hα�4�#���{�v���ۇs���*�t�Og�b�{�>���Y�X6��&wD"��W�C�]�f>���`�t���$>��M�Vop�� ���>9���!ov��@�.wc���V�$Ӟ(�y�|ο�@� ��@|�^9?�^�)QΡ������	�!Ҁ��ց�v�`G؜��f�V������L;�<9�
������/PP�J�r�I�+�{�b2f	[	�ېcoy����̙31@�iR��p�ark�s����F�BTH�r�lE\)�Z��B5 ���
:���%�ϱ���i��I�iv�\�4�Z�!@�*ʸn����yn�$I2��q�`����`/	hc�L�ߪ�ޝ�٣8�ȹqj�z	pz$n��[�� 5� 6����qA_�ax�8 ��ΠzI�E�|���V[�=I��8K܊sQH�B8l��#`?�`Kn��D��Ѱc1�%lhw6��R�����r.P������ߧ/j�x\�
��,Z[k􌯯�D���0���3h,��Z�2:�\��-�I��d�o+�jG-�v��E�2�t���2�˱[*�+G�S�"P�s2��6�l�|��*?I[^ý�}8���y�dpl7p���b9��k�����ل�>?�2Y�ц����b�e����\?.�z�=��b i��qլ�W�,
�q@�R��u��df{h�ٱv�8��Ua8|M��#G9�*�P�me3���h-�f�8a��eܓbw�%��6���!�[���
�
ƒJ�� D�gZ���/�&���g	��c+
�]iL:��"L��_ՉH�P�c>�ՈK�g�*�&��%`�:O�\�Lՙ���ש����5�
��E�KG��̰��o���c�J��^���S�8�s��մ�S⣂}�P�,�6ip�\K�V������|���Uf�e��I���p���ZLO��������2X��<ՠd���Z��/�_.�3�ZZ}F~LT����)��	6�m|�ek��@�D����t�`��d��3\��?l#j^����IEND�B`�PK�X�'o%��news324.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class news324cat(BasicNewsRecipe):
    title = '324.cat'
    description = (
        '324.cat is the Catalan-language news portal by the public Catalan Corporation of Audiovisual Media (CCMA).'
        ' Its contents are based on reporting material by journalists of TV3 and Catalunya Radio,'
        ' the leading news sources in Catalan language.')
    oldest_article = 2  # days
    max_articles_per_feed = 30  # articles
    auto_cleanup = True
    language = 'ca'
    __author__ = 'santboia'
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}

    feeds = [
        ('Portada',
         'https://api.ccma.cat/noticies?_format=rss&origen=frontal&frontal=n324-portada-noticia&version=2.0'
         ),
    ]
PK�Xk���QQnews_busters.png�PNG


IHDR  D���cPLTE�v$�v$�v$�v$�v$�v$�v$�v$�v$�v$�v$�v$�v$�v$�v$�v$�2�?�M�[�h�v�������ß�̭�Ի��������82��tRNS 0@P`p��������#���IDATxڕЅ�+!PF�v�J�����7���wO�7Hb~m\�׻}�]����_���ݪ{�|a�J�#��L�1������{����O����J��PޅkO"R���d�����L��犨�x+6�ͽ�>�W�(��L�����2�6�W��=�?�P��yQ�}�}�a�r� Q��90�
�	���mf
��x!�����(�`#�uԭ�	S
M)������̎@�9�T��M�{�t4j�m��9�_jX՝�9h�E4e'�z�L�[ƹ����UQ~mn�#�.P*��-��j
�ODi*-��HTEMl��[���Q�~x����v����x�;���#�|����i����N�I���|��R������7�L�=�)|�IEND�B`�PK�X�G8lkknews_busters.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class NewsBusters(BasicNewsRecipe):
    title = u'News Busters'
    description = 'Exposing and Combating Liberal Media Bias'
    __author__ = 'jde'
    oldest_article = 1  # day
    max_articles_per_feed = 100
    cover_url = "http://newsbusters.org/sites/all/themes/genesis_nb/images/nb-mrc.png"
    language = 'en'
    encoding = 'utf8'
    needs_subscription = False
    remove_javascript = True
    recursions = 0
    use_embedded_content = False
    no_stylesheets = True
    auto_cleanup = True

    feeds = [(u'Blog', u'http://www.newsbusters.org/rss.xml')]
PK�X�5�OOnews_times.png�PNG


IHDR�aIDATx�b�+pJ�fEA.a] "}����H�=^�":X�.)�l�}8��{p�sm���Z�aX-wG��~X-�Y-u���aX+ux-�C���bй����k'�ޓ�e�,w���,R
-��j��Z�����d>z(~��*����d__��46v"���a7%�c���F2*h%� ��qq����ÊTP�������&g3C\�O.��i+:iA]W�O�v�e�_ՂZ�1 �+��f���ZhA�q��3�6�o|�[�y|����{�f!�7?�G�IEND�B`�PK�XO7\�news_times.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class NewsTimes(BasicNewsRecipe):
    title = 'Newstimes'
    __author__ = 'Darko Miletic'
    description = 'news from USA'
    language = 'en'

    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True

    keep_only_tags = [
        dict(name='h1', attrs={'id': 'articleTitle'}), dict(
            name='div', attrs={'id': ['articleByline', 'articleDate', 'articleBody']})
    ]
    remove_tags = [
        dict(name=['object', 'link']), dict(
            name='div', attrs={'class': 'articleEmbeddedAdBox'})
    ]

    feeds = [
        (u'Latest news', u'http://feeds.newstimes.com/mngi/rss/CustomRssServlet/3/201071.xml')
    ]
PK�X�jl''
newsbeast.png�PNG


IHDR  szz��IDATX���k��e�����g�s�wfguw�]����l^�cZ�y_/I�Ћ ��¬�4
4!DM#�
�^T`���2[WWm�qvw.�3���sz1AH*^����yq�p�����!��\z�_�ƾ�xc�?�~�a���?x��g~�ķe�k�>q�ÿ龰�w�k�~/��?�c���`�[�OV��~�w�X��_
�
�GM�o%+>o��K��c�����_��]8��xl�e�Q��|����C�7PNx˭��6���(�}�rkB�}Nl+LAny�S9�eP�A����ثJ��?u���]}7�E��|խ��Ak�8�(
��2���h0���<�IY�&��o��{H��nRa�1�y(�E�h� �1���d���6<n��7���ɡW����솥�W��x.��\+�"��P�2$�3��˟�v���w�;�?u;�1b�gM����_#,{hm�b�{&N%��B�U�Ytc��[���8z�='�#c7kϣ�Y��
��8��1*P�(��C508��wg��I�_�3@����~��]i�Ȇp|=�d��&Eaȓ��(
J
0��,E��⌮GU��7n����'�W\~�WM(e��[K�5}$Z!iF����S�A)�R0H�!���8��)��N5QgGG����� ��!��^�L��I�  �3r+(Gp=�x��Vs���A���N�b[ͩ�w���J�����lZw}����U)$�b�,G!^��*"L�(�]T!�&(����s�<�Ha��.���h�=�[�x5g��X�'XQ���t���?G���=��~K���_@�. Q��$����!����ݙ�{���}W=��{�R�,#EY�h)R�}&�w��/� J�*����^ӏ�~zr��%H^`�+ag�覕�/r�_�}k����s�r��#��+��,�K�ȟy�:���{�.vi�Z�#3�W������1PJ!�6�r�ܵ��RJ{���<��*����m.��.��"2?����q�}�[�"`h�r��aj�]���YAUG!M�� �v{g��$��7��4�̫�_����@;~_
��_�.��M��t�'qGN�q�^s�K���~��6Tm
ҙG�]�^���N{�tZ��,�?x������Y�6;t��v]�CG0���-���B��3il� �4q���6Cu�ƳP�EgA+(H�C����O}�Zt�N��r�'K��V�5^�z=ҙ��Ei���M�A�5�*����,����e�������Bu%��ysek��T.����s�(�j-���D�Ә�3�4�q�n���A�Ybeq���3tg�����7��鶑���
��ǐ�9�k/!�@����|�n��x�E�t�RXf`��{�q�,"=xYY�q�.���L�a����aV#VV�1��ŀř؁
���/@�C
5����:�N�P�[���j�%�mn��@��L�0C�l�u��(�q�G��`���A�AL�z���TXB�0	6G�^�){�I �l���F%���c����ԃ�]_��@��D}l=��*��<�H�$��SL���	6�0i�MHS��bRtc-Ά����O#qs���-�����W�рu_�iX�vX�����f�7�Ʃ1�b���kln�d�ep=��c��Z1�q
��4F��bT�q�v�FU�F��rJv��:�*��'�^��IEND�B`�PK�X:�	N
N
newsbeast.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class newsbeast(BasicNewsRecipe):
    title = 'Newsbeast'
    __author__ = 'Stelios'
    description = 'News from Greece'
    oldest_article = 2
    max_articles_per_feed = 100
    publisher = 'newsbeast'
    category = 'news, GR'
    language = 'el'
    encoding = 'utf8'
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    encoding = 'utf8'
    keep_only_tags = [
        dict(name='div', attrs={'class': ['article-title']}),
        # dict(name='img', attrs={'class' : ['article_photo']}),
        # If enabled feeds exceede 15MB
        dict(name='div', attrs={'class': ['txt']})
    ]
    remove_tags = [
        dict(name='table', attrs={'id': ['artFoot']}),
        dict(name='img'),
        # If removed feeds exceede 15MB
        dict(name='p', attrs={'class': ['article-details']})
    ]

    feeds = [
        (u'\u0395\u03BB\u03BB\u03AC\u03B4\u03B1',
         'http://www.newsbeast.gr/feeds/greece'),
        (u'\u039A\u03CC\u03C3\u03BC\u03BF\u03C2',
         'http://www.newsbeast.gr/feeds/world'),
        (u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03BA\u03AE',
         'http://www.newsbeast.gr/feeds/politiki'),
        (u'\u039F\u03B9\u03BA\u03BF\u03BD\u03BF\u03BC\u03AF\u03B1',
         'http://www.newsbeast.gr/feeds/financial'),
        (u'\u0391\u03B8\u03BB\u03B7\u03C4\u03B9\u03BA\u03AC',
         'http://www.newsbeast.gr/feeds/sports'),
        (u'\u039A\u03BF\u03B9\u03BD\u03C9\u03BD\u03AF\u03B1',
         'http://www.newsbeast.gr/feeds/society'),
        (u'\u03A0\u03B5\u03C1\u03B9\u03B2\u03AC\u03BB\u03BB\u03BF\u03BD',
         'http://www.newsbeast.gr/feeds/environment'),
        (u'Media', 'http://www.newsbeast.gr/feeds/media'),
        (u'\u0394\u03B9\u03B1\u03C3\u03BA\u03AD\u03B4\u03B1\u03C3\u03B7',
         'http://www.newsbeast.gr/feeds/entertainment'),
        (u'Lifestyle', 'http://www.newsbeast.gr/feeds/lifestyle'),
        (u'\u03A4\u03B5\u03C7\u03BD\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1',
         'http://www.newsbeast.gr/feeds/technology'),
        (u'\u0391\u03C5\u03C4\u03BF\u03BA\u03AF\u03BD\u03B7\u03C4\u03BF',
         'http://www.newsbeast.gr/feeds/car'),
        (u'\u0393\u03C5\u03BD\u03B1\u03AF\u03BA\u03B1',
         'http://www.newsbeast.gr/feeds/woman'),
        (u'\u03A5\u03B3\u03B5\u03AF\u03B1', 'http://www.newsbeast.gr/feeds/health'),
        (u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2',
         'http://www.newsbeast.gr/feeds/culture'),
        (u'\u038C,\u03C4\u03B9 \u03BD\u03B1 \u03BD\u03B1\u03B9',
         'http://www.newsbeast.gr/feeds/weird')
    ]
PK�X��newslaundry.png�PNG


IHDR(-ScPLTE�&,����� ��"(�����������$��(.��il�eh���������	����\_�������������JN���4�vIDAT�U�K� DQ��(�Q�G���Ҕ^z�uFW�{�7��4��eI��v��4��u`0l�{�W���]F��/���2s�;�]&�����7����m@>z�v��=
�b������#�
IEND�B`�PK�X;� �hhnewslaundry.recipefrom calibre.web.feeds.news import BasicNewsRecipe

class newslaundry(BasicNewsRecipe):
    title = 'Newslaundry'
    __author__ = 'unkn0wn'
    description = (
        'Newslaundry is a reader-supported, independent news media company. In an industry driven by corporate'
        ' and government interests, we strongly believe in the need for an independent news model, and a free'
        ' and accountable press.'
    )
    language = 'en_IN'
    masthead_url = 'https://images.assettype.com/newslaundry/2020-01/d91cad07-9650-47e9-8bdc-9a6247354d95/Header_logo_NL__2_New.png'
    encoding = 'utf-8'
    no_stylesheets = True
    remove_javascript = True
    oldest_article = 7 # days
    resolve_internal_links = True

    ignore_duplicate_articles = {'url'}

    # keep_only_tags = [classes('headline subheadline authorWithTimeStamp story-card')]

    feeds = [
        ('Articles', 'https://www.newslaundry.com/stories.rss?time-period=last-7-days')
    ]

    # def preprocess_html(self, soup):
    #     if h1 := soup.find(**classes('headline')):
    #        h1.name = 'h1'
    #     if h3 := soup.find(**classes('subheadline')):
    #        h3.name = 'h3'
    #    return soup

    def print_version(self, url):
        if 'hindi.newslaundry' in url:
            self.abort_article('Skipping hindi article') # remove this line if you want hindi articles.
        return url
PK�X�5�fyynewsminute.png�PNG


IHDR�a@IDAT8����KTQ���}o�q^35�"�Ψ�X��l�T��A.ZHaԢv!HQ��"�Jڵ�ȢZT�@��,ޔ9#LP�7��y�-4��`��.���9�9WPQ���4E��4�
kA�w���J����ѹ���J�x·K�C=�/�(�+8�����~ģ�|
�����G��bĠ�vc�;U�u�q��[
���T�kR'��N����F�j�>)i϶�ut2;��
][��Ԍn�8�')�f��0F,�&u�uqf޼^E��(���:;��[7iJ�#�>��a�{�R�X���f�h[����		M�ŕ2M����5�:����G�w�����7��6pn�R�%`Kq&Ǘ'�$F�B��V��?%�S��R���~g7�e���:��Y+�HsB��K.����6f"�g�R��PpA�#Nz%@F"��-�	�r9����ɺ�6J�+���׽�3��5bvT��������)f���0�l���O��+'|-��c��_�
�O���r��{}5B���p5Y��1(/��F�lf�;+E�EUF�Kw��|Z��
<bʹ��_IEND�B`�PK�Xl��eN
N
newsminute.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from calibre.ptempfile import PersistentTemporaryFile


class newsminute(BasicNewsRecipe):
    title = 'The News Minute'
    __author__ = 'unkn0wn'
    description = (
        'The News Minute is a digital news platform reporting and writing on issues in India, with a '
        'specific focus on the 5 southern states. Our content includes news, ground reportage, news '
        'analysis, opinion and blogs. Our core strengths include our deep access in the southern states, '
        'incisive editorial acumen and insightful news analysis and opinions.'
    )
    language = 'en_IN'

    no_stylesheets = True
    remove_javascript = True
    masthead_url = 'https://pkcindia.com/wp-content/uploads/2021/09/TMN-Logo-1.png'
    ignore_duplicate_articles = {'title', 'url'}
    resolve_internal_links  = True
    remove_empty_feeds = True
    remove_attributes = ['style', 'height', 'width']
    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/', 'podcast-'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    keep_only_tags = [
        classes(
            'arr--section-name arr--story--headline-h1 arr--sub-headline arr--hero-image author-card-wrapper arr--story-page-card-wrapper'
        ),
    ]

    feeds = []

    sections = [
        'tamil-nadu', 'telangana', 'andhra-pradesh', 'karnataka', 'kerala'
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:https%3A%2F%2Fwww.thenewsminute.com{}&hl=en-IN&gl=IN&ceid=IN:en'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    feeds.append(('Others', a.format('')))

    def populate_article_metadata(self, article, soup, first):
        article.title = article.title.replace(' - The News Minute', '')

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        return soup
PK�X}N��newsmoldova.png�PNG


IHDR��h6�IDATxڅ��Oq�����~n���������jY�Q���ն�J�V괜�i�DT�ﳄ��@PD�KPT�㸃�
���%��[�O}��ޟ�y^�}��ν7�s���+2�����m�M�{M�����xbŠ=�Z�
�\����Z�٪&�N�j�7�/T�~�Z~�6sj���S�����	�LeXA9�j��p]���U��0���OB��q�gt��m�\��N�ڷ
_�|u�0���r�k���\��g������ŧ����Y��?�Н�l�FE��TE�.��5:�MΛ�:�fd+”<8�W}xL�o�/䋊?L��h)�J6t��nvl�`vS�>#�x���X,F�� �h���L&�0TDQdY�p
���dY�u0�qJA�(
h��w,B�n�V \� �����)|������G1)HIɢ�=�)�oEIV����B-E����+u�3>��Lm�>��nr����/�O[� �O���(#u�d��D�����]N�A/?���p0iY�v�^^��;Vk8���ҰS@��l�=~�����p�un4nN�
��e[��z|��x�w�}�B�b��NxHU5�_ ����".��=k,�ӚY��,��d�L��ֆK��)u0�	?dJ *�r\IEND�B`�PK�X!��newsmoldova.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
newsmoldova.md
'''

from calibre.web.feeds.news import BasicNewsRecipe


class NewsMoldova(BasicNewsRecipe):
    title = u'Agen\u0163ia de \u015ftiri Moldova'
    language = 'ro'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Agen\u0163ia de \u015ftiri Moldova'
    publisher = 'Moldova'
    category = 'Ziare,Stiri,Moldova'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True
    cover_url = 'http://www.newsmoldova.md/i/logo_top_md.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [dict(name='div', attrs={'class': 'main-article-index article'})
                      ]

    remove_tags = [
        dict(name='div', attrs={'id': 'actions'}), dict(
            name='li', attrs={'class': 'invisible'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': 'actions'})
    ]

    feeds = [(u'\u0218tiri', u'http://newsmoldova.md/export/rss2/archive/index.xml')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�	�rrnewsobs.png�PNG


IHDR!!`:2]BPLTE��������  �00�@@�PP�``�pp̀�Ӑ�٠�߰�����������5NtRNS 0@��#�/�IDATxڵ�E�!�1������t�Y�ۋ�����f�9@x
z%l/�������"�ɮ���A+d�W�H7�>2`N[���)��&��<-�ɭ�;���FJ�O�:@:�������WIB~ԩ�v�JɍDD�UU3�t��55��$M�(�-	
E��%y�~W�kD)�߄$�:���2��f-s���?��9i���F���o3}�>DZm��IEND�B`�PK�X��$/MMnewsobs.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class NewsAndObserver(BasicNewsRecipe):
    title = u'News And Observer'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25

    no_stylesheets = True
    remove_tags_before = dict(name='div', attrs={'id': 'story_header'})
    remove_tags_after = dict(name='div', attrs={'id': 'shirttail'})
    remove_tags = [
        dict(name='iframe'),
        dict(name='div', attrs={'class': ['contained_round', 'contained']}),
        dict(name='div', attrs={'id': ['story_tools', 'toolbox', 'shirttail', 'comment_widget',
                                       'stories_widget', 'classifieds_widget', 'most_popular_widget', 'footer']}),
        dict(name='ul', attrs={'id': 'story_tabs'}),
    ]

    feeds = [
        ('Cover', 'http://www.newsobserver.com/100/index.rss'),
        ('News', 'http://www.newsobserver.com/102/index.rss'),
        ('Politics', 'http://www.newsobserver.com/105/index.rss'),
        ('Business', 'http://www.newsobserver.com/104/index.rss'),
        ('Sports', 'http://www.newsobserver.com/103/index.rss'),
        ('College Sports', 'http://www.newsobserver.com/119/index.rss'),
        ('Lifestyles', 'http://www.newsobserver.com/106/index.rss'),
        ('Editorials', 'http://www.newsobserver.com/158/index.rss')]
PK�X��_KKnewsstraitstimes.png�PNG


IHDR��h6IDATxڵR_HSQ?��,����խ��0� ��	��%�-$�������t�� mBЋ�eR���win5��wk�[����]���8~��}?~�q��8�6�L�Cu�k"�=�?��u�<���
��IN�ӳ֗<�Z�tMb��Nc� S3tk_�Hwe2;��n��[�u���'��]@nd�a�!���<�LR�uٶ���}�<�
k�Zk�rǺ����8FfY`�L�!�,�����x��0nd��*U�I�5��<��!��p�,��/�zja�0v��h���u���L����(���^]YY����������\.�L��]�G���f776b��L�PX���j��j~�T*A1���'�
.�_�~�.
��:����-�jD����$�,uWw��HZj���a�Ax��u)<~*B�=��J���E�4�~v`[�E)��yT�a>X8��j�ZQ*���l6Z�V8
��֨׋����=��vs6�A^tIEND�B`�PK�X��^��newsstraitstimes.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.nst.com.my
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Newstraitstimes(BasicNewsRecipe):
    title = 'New Straits Times from Malaysia'
    __author__ = 'Darko Miletic'
    description = ('Learning Curve, Sunday People, '
                   'New Straits Times from Malaysia')
    publisher = 'nst.com.my'
    category = 'news, politics, Malaysia'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'en'
    auto_cleanup = True

    feeds = [(u'Articles', u'http://www.nst.com.my/latest.xml')]
PK�Xۓx̠�newsweek_polska.png�PNG


IHDR���R$PLTE��"�DN�T]�dl�������������7IDATx�c��w/dݽ��c�V�1Ja��0�ntF�Qcd�R`{�s�,v�~%���IEND�B`�PK�X�`�P�"�"newsweek_polska.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
__license__   = 'GPL v3'
__copyright__ = '2010, matek09, matek09@gmail.com; 2012-2013, admroz, a.rozewicki@gmail.com'

import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile
from string import capwords
import datetime
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class Newsweek(BasicNewsRecipe):

    # how many issues to go back, 0 means get the most current one
    BACK_ISSUES = 1

    EDITION = '0'
    DATE = None
    YEAR = datetime.datetime.now().year

    title = u'Newsweek Polska'
    __author__ = 'matek09, admroz'
    description = 'Weekly magazine'
    encoding = 'utf-8'
    language = 'pl'
    remove_javascript = True

    temp_files = []
    articles_are_obfuscated = True

    #
    # Parses article contents from one page
    #
    def get_article_divs(self, css, main_section):
        strs = []

        # get all divs with given css class
        article_divs = main_section.findAll('div', attrs={'class': css})
        for article_div in article_divs:

            # remove sections like 'read more...' etc.
            for p in article_div.findAll('p'):

                if p.find('span', attrs={'style': 'color: #800000; font-size: medium;'}):
                    p.extract()
                    continue

                if p.find('span', attrs={'style': 'font-size: medium; color: #800000;'}):
                    p.extract()
                    continue

                if p.find('span', attrs={'style': 'font-size: medium;'}):
                    p.extract()
                    continue

                if p.find('span', attrs={'style': 'color: #800000;'}):
                    p.extract()
                    continue

                obj = p.find('object')
                if obj:
                    obj.extract()
                    continue

                strong = p.find('strong')
                if strong:
                    newest = re.compile(
                        "Tekst pochodzi z najnowszego numeru Tygodnika Newsweek")
                    if newest.search(str(strong)):
                        strong.extract()
                        continue

                itunes = p.find('a')
                if itunes:
                    reurl = re.compile("itunes.apple.com")
                    if reurl.search(str(itunes['href'])):
                        p.extract()
                        continue

                imagedesc = p.find('div', attrs={'class': 'image-desc'})
                if imagedesc:
                    redesc = re.compile("Okładka numeru")
                    if (redesc.search(str(imagedesc))):
                        p.extract()
                        continue

            # get actual contents
            for content in article_div.contents:
                strs.append("".join(str(content)))

        # return contents as a string
        return u"".join(strs)

    #
    # Articles can be divided into several pages, this method parses them recursevely
    #
    def get_article_page(self, br, url, page):
        br.open(url)
        source = br.response().read()

        html = ''

        matches = re.search(r'<article>(.*)</article>', source, re.DOTALL)
        if matches is None:
            print("no article tag found, returning...")
            return

        main_section = BeautifulSoup(matches.group(0))

        if page == 0:
            title = main_section.find('h1')
            html = html + type(u'')(title)

            authors = ''
            authorBox = main_section.find('div', attrs={'class': 'AuthorBox'})
            if authorBox is not None:
                authorH4 = authorBox.find('h4')
                if authorH4 is not None:
                    authors = self.tag_to_string(authorH4)
            html = html + type(u'')(authors)

            info = main_section.find('p', attrs={'class': 'lead'})
            html = html + type(u'')(info)

        html = html + self.get_article_divs(
            '3917dc34e07c9c7180df2ea9ef103361845c8af42b71f51b960059226090a1ac articleStart', main_section)
        html = html + self.get_article_divs(
            '3917dc34e07c9c7180df2ea9ef103361845c8af42b71f51b960059226090a1ac', main_section)

        nextPage = main_section.find('a', attrs={'class': 'next'})
        if nextPage:
            html = html + self.get_article_page(br, nextPage['href'], page + 1)

        return html

    #
    # Parses each article
    #
    def get_obfuscated_article(self, url):
        br = self.get_browser()
        html = self.get_article_page(br, url, 0)
        self.temp_files.append(PersistentTemporaryFile('_temparse.html'))
        self.temp_files[-1].write(html)
        self.temp_files[-1].close()
        return self.temp_files[-1].name

    #
    # Goes back given number of issues. It also knows how to go back
    # to the previous year if there are not enough issues in the current one
    #
    def find_last_issue(self, archive_url):
        archive_soup = self.index_to_soup(archive_url, True)

        # workaround because html is so messed up that find() method on soup returns None
        # and therefore we need to extract subhtml that we need
        matches = re.search(
            r'<ul class="rightIssueList">(.*?)</ul>', archive_soup, re.DOTALL)
        if matches is None:
            return

        subSoup = BeautifulSoup(matches.group(0))
        issueLinks = subSoup.findAll('a')

        # check if need to go back to previous year
        if len(issueLinks) > self.BACK_ISSUES:
            link = issueLinks[self.BACK_ISSUES]
            self.EDITION = link['href'].replace(
                'http://www.newsweek.pl/wydania/', '')
            self.index_to_soup(
                'http://www.newsweek.pl/wydania/' + self.EDITION)
        else:
            self.BACK_ISSUES = self.BACK_ISSUES - len(issueLinks)
            self.YEAR = self.YEAR - 1
            self.find_last_issue(archive_url + '/' + str(self.YEAR))

    #
    # Looks for the last issue which we want to download. Then goes on each
    # section and article and stores them (assigning to sections)
    #
    def parse_index(self):
        archive_url = 'http://www.newsweek.pl/wydania/archiwum'
        self.find_last_issue(archive_url)
        soup = self.index_to_soup(
            'http://www.newsweek.pl/wydania/' + self.EDITION)

        matches = re.search(
            r'<div class="Issue-Entry">(.*)ARTICLE_BOTTOM', soup.prettify(), re.DOTALL)
        if matches is None:
            return

        main_section = BeautifulSoup(matches.group(0))

        # date
        matches = re.search(r'(\d{2}-\d{2}-\d{4})',
                            self.tag_to_string(main_section.find('h2')))
        if matches:
            self.DATE = matches.group(0)

        # cover
        img = main_section.find('img', src=True, alt=True, title=True)
        self.cover_url = img['src']
        feeds = []
        articles = {}
        sections = []

        # sections
        for sectionUl in main_section.findAll('ul', attrs={'class': 'whatsin'}):

            # section header
            header = sectionUl.find('li', attrs={'class': 'header'})
            if header is None:
                continue

            section = capwords(self.tag_to_string(header))

            # articles in section
            articleUl = sectionUl.find('ul')
            if articleUl is None:
                continue

            for articleLi in articleUl.findAll('li'):
                # check if article is closed which should be skipped
                closed = articleLi.find('span', attrs={'class': 'closeart'})
                if closed is not None:
                    continue

                article = self.create_article(articleLi)
                if article is None:
                    continue

                if section in articles:
                    articles[section].append(article)
                else:
                    articles[section] = [article]
                    sections.append(section)

        for section in sections:
            #             print("%s -> %d" % (section, len(articles[section])))
            #
            #             for article in articles[section]:
            #                 print(" - %s" % article)

            feeds.append((section, articles[section]))

        return feeds

    #
    # Creates each article metadata (skips locked ones). The content will
    # be extracted later by other method (get_obfuscated_article).
    #
    def create_article(self, articleLi):
        article = {}

        a = articleLi.find('a')
        if a is None:
            return None

        article['title'] = self.tag_to_string(a)
        article['url'] = a['href']
        article['date'] = self.DATE
        article['description'] = ''

        return article
PK�X~9�\;;
newtab.png�PNG


IHDR  D���PLTE���������������<<<���������������@@@������������������;;;RRR


������hhhrrr!!!ppp��ᩩ�qqqggg������������666���iii{{{���ttt���'''���QQQJJJMMM������333CCC���ooo��߽�����000]]]������:::}}}444������///����������EEE---***HHH��������ǒ��...�|tRNS���븫��IDATx^ݓŮ�0E3�23333<f����Ҍ�M�}��.�b;��q�"��Ń_@.��,���W�a�^f�#䨐�ÿ���=#�O��d�k�m� I��b'�V�^�’
�B6$uvMFh
n,b�8����x2�&g�T�O��qH�b���gKh�;\B'I�5~�O�s���QB�f���<�G��Y�|^�ϯ)�]a��]%8����%ekY��IEND�B`�PK�X �kk
newtab.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class NewTab(BasicNewsRecipe):
    title = '\u041D\u043E\u0432\u0430\u044F \u0432\u043A\u043B\u0430\u0434\u043A\u0430'
    __author__ = 'bugmen00t'
    description = '\u041F\u043B\u043E\u0449\u0430\u0434\u043A\u0430 \u0434\u043B\u044F \u043F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u0438 \u0440\u0435\u043F\u043E\u0440\u0442\u0430\u0436\u0435\u0439 \u0438 \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u043E \u0442\u043E\u043C, \u043A\u0430\u043A \u043C\u0435\u043D\u044F\u044E\u0442\u0441\u044F \u0440\u0435\u0433\u0438\u043E\u043D\u044B \u0420\u043E\u0441\u0441\u0438\u0438 \u043F\u043E\u0441\u043B\u0435 24 \u0444\u0435\u0432\u0440\u0430\u043B\u044F 2022 \u0433\u043E\u0434\u0430.'  # noqa
    publisher = '\u041C\u0438\u0445\u0430\u0438\u043B \u0414\u0430\u043D\u0438\u043B\u043E\u0432\u0438\u0447'
    category = 'blog'
    cover_url = u'https://static.tildacdn.com/tild3765-3961-4337-b366-323437626331/thenewtab-sn.jpg'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 30
    max_articles_per_feed = 10

    remove_tags_before = dict(name='h1')

    remove_tags = [
        dict(name='div', attrs={'class': 't-popup'}),
        dict(name='div', attrs={'class': 't185'}),
        dict(name='div', attrs={'class': 't403'}),
        dict(name='div', attrs={'class': 't404'}),
        dict(name='div', attrs={'class': 't134'}),
        dict(name='div', attrs={'class': 'sp-form-fields-wrapper'})
    ]

    feeds = [
        ('\u041D\u043E\u0432\u0430\u044F \u0432\u043A\u043B\u0430\u0434\u043A\u0430','https://thenewtab.io/feed/')
        ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-original': True}):
            img['src'] = img['data-original']
        return soup
PK�Xtw�qqnewtimes.png�PNG


IHDR  ��8IDATxڥ���cK���b��0�w}S��5��m۶m۶m۶^�r�׸ϙ,�U*9g2��t��3*?�'�͛��}��Y���Y�b�̖��:,�sg�˗�yy	f��z��7z�[kK���~���y�Z~n�r��99]B�o�Pl�ۀ��/�z�0�g�EK`+�YX����Oa��3gb�_���ƚ�reO�ƞ�5��e-x5�K�J�D������#yii�f�b��l�;dHڡC�c�����v�̙�i�,����+�F�"1�v��U�,�5�U��V�+�NNv��Q��/,Y��i{��/��ĕq�,@U@p�F��6aV\�>�vmp�D3��
��	
��`�r:�l�$�R�wZ�dۥwD]fy/r���#f�3$:�V�["�Y.�Dl"���q�r��]I�ک�q��J-gn��z��D��(uWĥ�B�k�-dN��9b���U��:���#��a7E�(Ջh91�^B�����Rj�"��Q����,s6�C��D�`�K��"��4W4�,���D�mQ_"l7*^�*�zu�b���R�Ej+��K+uFi�L��v"��P��ysM�:݉p��
�>$�\����
��
_i
��ayR�h�Rt�HR�zhE�����J2��$��Uٲn4.lO���$��,g��v�B
����Ю]���z{�����<�7v,�n��L?w)�:׬Aeh۶ЎP��n�ЪX1��i�fM�Z��s�B�7[��ۀi�0����Z�.Q��A��Ӥ	��ڀ`a��l����W��6�?q�y��/<<Kƕ+@���.,
�M?r�ۧD�0��˖#׬��l�ΰ����#�i��)Ecv�ȑi��a��3�8�>i�S�^`�"�&�j��pS��W�m�j+|�j�
����2.^�ԟƇ�׈O=��E �k̈��l�ﳜ!N2�n1�5�v����w�k}�
H�����:�huN��R�fձ�K�e�jgt��bFԝ�+�;*�e={f';�ܹ�(
:����Qf�)��"zC��ޮ]�d>��Q��,�L�Vf7c��)�໓�ձ�(��,���A�D*UY��&�d���e����n��G�~>p�A�4h�9Y뗢���M�X��T�� :<�k��,�ۓ�\~�٩���~���Hh��/bƉ}mɼ{���-iǎ'�x=~lU����(�q��w\�^��)?zu�훝��_�/��4��t�t�q�B~NN��olLvRR�o�P�Mn�Lj�No���E0�	Ǹ��tx
kD1IEND�B`�PK�X�B�Anewtimes.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class NewTimes(BasicNewsRecipe):
    title = 'The New Times'
    __author__ = 'bugmen00t'
    description = ' \u0415\u0436\u0435\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E-\u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0436\u0443\u0440\u043D\u0430\u043B'  # noqa
    publisher = 'The New Times'
    category = 'newspaper'
    cover_url = u'https://newtimes.ru/img/ogimage.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 14
    max_articles_per_feed = 150

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'id': 'full'})

    remove_tags = [

        #        dict(name='div', attrs={'class': 'image-box image-box_center'}),
    ]

    feeds = [('\u0421\u0442\u0430\u0442\u044C\u0438', 'https://newtimes.ru/rss/')]
PK�X�DS�newz_dk.png�PNG


IHDR  D����PLTE��þ�½�������������������������������������������4����|yv�|XVSĿ�pnj�������~t�����������igc����������������������ò������������������wtnljd������������ÿ�������4�ѣ�� �݄�vge`�����������wto���nlh�³������)($-,(��z�����~if^������c`][YQ�������}yywsb`Y������������P������x3���ݝ��^[S����ô]ZWþ�¼�������Ŀ�\ZRurn�ȷ�Ķvtqÿ������~URJ~zo���sqm���b_]���P���ų�±fd[���_]ZM8�PIDATx^]�c��@���C�6^ڶ���=I��v�����9���5�tޡ��\�� �o�v���74�m��~$I9��S$��(P�s.G!�$���ٰ	���z�V�U��0M�\�F�l-���=�/Y��}�qܕ�O�|�h4���g�>j��/g_�ሕ�UC<�?B�!�Yw���+-2*�w��y�0P��v�I�"8��`HH&���"�(���:L��N'3U�Y����v��]<]�l6=]՜��ɝx���l�p�Ɓ�f��^{>[�'G����s���E%�����В|GV�Ҭ ��}�a	��Vfe�n��	�˅��N[��T*���
��r����ު̀tS�����bp-Heż����z2�)Ȳ�b��Q�c�#�@QD���(J������iv�e��d�]�u��A^G��c��W��Y���z
�`���^�����1�T�jݏ���Mus��[��������� ��t���}���9��}��z�B����%�R*�w����V����C�����;^h��O����3�g�FӰf�znnno�[�����/�|ƀw�?IEND�B`�PK�X_��newz_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
newz.dk
'''


class Newz_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'newz.dk'
    description = 'Nyheder for rigtige nørder'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    # Feed are found here: https://newz.dk/feeds
    feeds = [
        ('Newz', 'https://newz.dk/rss'),
        ('Forums', 'https://newz.dk/forum/rss'),
        ('Artikler', 'https://newz.dk/forum/artikler/rss'),
        ('Afstemninger', 'https://newz.dk/forum/afstemninger/rss'),
        ('Tagwall', 'https://newz.dk/forum/tagwall/rss'),
        ('Hardware', 'https://newz.dk/forum/hardware/rss'),
        ('Software', 'https://newz.dk/forum/software/rss'),
        ('Programmering', 'https://newz.dk/forum/programmering/rss'),
        ('Support', 'https://newz.dk/forum/support/rss'),
        ('Køb / Salg', 'https://newz.dk/forum/koeb-salg/rss'),
        ('Jobs', 'https://newz.dk/forum/jobs/rss'),
        ('Demo /LAN-parties', 'https://newz.dk/forum/demo-lan-parties/rss'),
        ('Folding@Home', 'https://newz.dk/forum/folding-home/rss'),
        ('Gallerier', 'https://newz.dk/forum/gallerier/rss'),
        ('news.dk', 'https://newz.dk/forum/newz-dk/rss'),
    ]
PK�X �˞�nezavisne_novine.png�PNG


IHDR��h6eIDATx�c�O" K���
D���������Ԑ>�C� �u�D�f�I�ȝ��401H�? 
��4Y��m�����;�a�1�
�2��A��������?T�bä��@$�$�3�V�����6O�ofpi��nC,nMl�
�v%7/��z?~���LC�z�* ���GV�F;�(Ṕ���}��d<�5���3��~�"F��ƿ@�ˇ���"���ﲒ ��_�,`ږ1�dїo?��5{�q��U?"�z9(��߿G��Qi0'5.`�K"�`즺����{~�~�~u�T�O`O��B 6y��D
L-�B_�IEND�B`�PK�X7,&�*	*	nezavisne_novine.recipe__license__ = 'GPL v3'
__copyright__ = '2013, Darko Miletic <darko.miletic at gmail.com>'
'''
www.nezavisne.com
'''
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class NezavisneNovine(BasicNewsRecipe):
    title = 'Nezavisne novine'
    __author__ = 'Darko Miletic'
    description = 'Nezavisne novine - Najnovije vijesti iz BiH, Srbije, Hrvatske, Crne Gore i svijeta'
    publisher = 'NIGP "DNN"'
    category = 'news, politics, Bosnia, Balcans'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'sr'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    cover_url = strftime(
        'http://pdf.nezavisne.com/slika/novina/nezavisne_novine.jpg?v=%Y%m%d')
    masthead_url = 'http://www.nezavisne.com/slika/osnova/nezavisne-novine-logo.gif'
    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
    }
    keep_only_tags = [dict(name='div', attrs={'class': 'vijest'})]
    remove_tags_after = dict(name='div', attrs={'id': 'wrap'})
    remove_tags = [
        dict(name=['meta', 'link', 'iframe', 'object']), dict(
            name='div', attrs={'id': 'wrap'})
    ]
    remove_attributes = ['lang', 'xmlns:fb', 'xmlns:og']

    feeds = [

    (u'Novosti', u'http://feeds.feedburner.com/Novosti-NezavisneNovine'),
    (u'Posao', u'http://feeds.feedburner.com/Posao-NezavisneNovine'),
    (u'Sport', u'http://feeds.feedburner.com/Sport-NezavisneNovine'),
    (u'Komentar', u'http://feeds.feedburner.com/Komentari-NezavisneNovine'),
    (u'Umjetnost i zabava', u'http://feeds.feedburner.com/UmjetnostIZabava-NezavisneNovine'),
    (u'Život i stil', u'http://feeds.feedburner.com/ZivotIStil-NezavisneNovine'),
    (u'Auto', u'http://feeds.feedburner.com/Auto-NezavisneNovine'),
    (u'Nauka i tehnologija', u'http://feeds.feedburner.com/NaukaITehnologija-NezavisneNovine')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�Xd�$��ngz.png�PNG


IHDR  ��lIDATx�c�Oc�0,,hmmAC��m��׬Y}��տ��U�:uSqgW猙3v������̜9���

���'D�Ç{{{��y���[�p� *.)�(������ӧO���	TSW={�,\�J��ڵk!�׮[kbj����b��)�!�yy�p�_�~��C������i��M�6��|�"!)���r�
Q�ɓ'!�@�@��XQ�Qq_?b-Q1�ԭ[7�[P[W���!�I)	���+��[LQ����Q����%\���@ą���\���$AXxD<''�(nݺ���ݻ�[L�@�C�0����m��ŋ-lh������oڌ�R��}�'N߾}[Ss���PDZFjժU��2�0�]�������߿c��p""�O�:����2����o\TTV�[�����}��	_i����k��U�,@�d,���_cc�@C�ׯ_S�pqu�2x9AM�������S-�̚=�~����Y�q�����<w������������U&�зOL��ۧY�Âw�����a�Y�B���������Զ��d:�-m��+�Ź�uIEND�B`�PK�X��i11
ngz.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1303841067(BasicNewsRecipe):

    title = u'NGZ-online'
    __author__ = 'schuster'
    remove_tags_before = dict(id='bu')
    remove_tags_after = dict(id='noblock')
    remove_tags = [dict(attrs={'class': ['articleTools', 'post-tools', 'side_tool', 'nextArticleLink clearfix', 'liketext']}),
                   dict(id=['footer', 'toolsRight', 'articleInline', 'navigation', 'archive', 'side_search', 'blog_sidebar', 'side_tool', 'side_index', 'Verlinken', 'vorheriger', 'LESERKOMMENTARE', 'bei facebook', 'bei twitter', 'Schreiben Sie jetzt Ihre Meinung:', 'Thema', 'Ihr Beitrag', 'Ihr Name', 'Ich möchte über weitere Lesermeinungen zu diesem Artikel per E-Mail informiert werden.', 'banneroben', 'bannerrechts', 'inserieren', 'stellen', 'auto', 'immobilien', 'kleinanzeige', 'tiere', 'ferienwohnung', 'NGZ Card', 'Mediengruppe RP', 'Werben', 'Newsletter', 'Wetter', 'RSS', 'Abo', 'Anzeigen', 'Redaktion', 'Schulprojekte', 'Gast', 'Mein NGZ', 'Nachrichten', 'Sport', 'Wirtschaft', 'Stadt-Infos', 'Bilderserien', 'Bookmarken', 'del.icio.us', 'Mister Wong', 'YiGG', 'Webnews', 'Shortnews', 'Twitter', 'Newsider', 'Facebook', 'StudiVZ/MeinVZ', 'Versenden', 'Drucken']),  # noqa
                   dict(name=['script', 'noscript', 'style'])]
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'de'
    remove_javascript = True
    cover_url = 'http://www.rhein-kreis-neuss-macht-sport.de/sport/includes/bilder/ngz_logo.jpg'

    def print_version(self, url):
        return url + '?ot=de.circit.rpo.PopupPageLayout.ot'
    feeds = [
        (u'Grevenbroich', u'http://www.ngz-online.de/app/feed/rss/grevenbroich'),
        (u'Kreis Neuss', u'http://www.ngz-online.de/app/feed/rss/rheinkreisneuss'),
        (u'Dormagen', u'http://www.ngz-online.de/app/feed/rss/dormagen'),
        (u'J\xfcchen', u'http://www.ngz-online.de/app/feed/rss/juechen'),
        (u'Rommerskirchen', u'http://www.ngz-online.de/app/feed/rss/rommerskirchen')

    ]
PK�Xpm�u��nhk_news.recipefrom calibre.web.feeds.news import BasicNewsRecipe

# feed source: https://www.nhk.or.jp/toppage/rss/index.html


class ReutersJa(BasicNewsRecipe):

    title = 'NHK News'
    description = 'NHK News in Japanese'
    __author__ = 'Richard A. Steps'
    use_embedded_content = False
    language = 'ja'
    max_articles_per_feed = 30
    remove_javascript = True
    auto_cleanup = True

    # This line added to deal with bots on site
    def get_browser(self, *a, **kw):
        kw['user_agent'] = 'common_words/based'
        return super().get_browser(*a, **kw)

    feeds = [
        ('主要ニュース', 'https://www.nhk.or.jp/rss/news/cat0.xml?format=xml'),
        ('社会', 'https://www.nhk.or.jp/rss/news/cat1.xml?format=xml'),
        ('科学・医療', 'https://www.nhk.or.jp/rss/news/cat3.xml?format=xml'),
        ('政治', 'https://www.nhk.or.jp/rss/news/cat4.xml?format=xml'),
        ('経済', 'https://www.nhk.or.jp/rss/news/cat5.xml?format=xml'),
        ('国際', 'https://www.nhk.or.jp/rss/news/cat6.xml?format=xml'),
        ('スポーツ', 'https://www.nhk.or.jp/rss/news/cat7.xml?format=xml'),
        ('文化・エンタメ', 'https://www.nhk.or.jp/rss/news/cat2.xml?format=xml')
    ]
PK�X�lKNNniebezpiecznik.png�PNG


IHDR��h6IDATxڕ�;hQ����f2��$��}�+3s�Q��J�Dt�XPŸ�)��F���B-�R��R�,"��� ��!E��?�3���y��x��{~�a6��(��7B<�c3Dzc�$�b�a��b��8���f��� Ӳ-�i�`�@r!��0�Cz����vvB��F��+��N��Z
<8��rK�d��D��F��N�
UQu�Ia�>�W�qBw'�B��
T�V�Sm/�������<�6%C�7�~~6�3k�*ru��Y΁�{�~�h��]=*�\"&�OY��ڌ�P,S�,_�E����1}#�q�:�����P)`�����yz=��ŭ+�q�_���.m���q>��)��
�ө[�4c��4g��e���Cy�����lL��� t���X|sao���T*����`�)quXɽ��c�8OH�m�P�]��k�P  |�O�f;��7�;@{W��@~-�8��cY���0���v��O.1�؇�W�K����IEND�B`�PK�X���b��niebezpiecznik.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Niebezpiecznik_pl(BasicNewsRecipe):
    title = u'Niebezpiecznik.pl'
    __author__ = 'fenuks'
    description = u'Niebezpiecznik.pl – o bezpieczeństwie i nie...'
    category = 'hacking, IT'
    language = 'pl'
    oldest_article = 8
    extra_css = '.entry {margin-top: 25px;}'
    remove_attrs = ['style']
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    cover_url = u'http://userlogos.org/files/logos/Karmody/niebezpiecznik_01.png'
    remove_tags = [dict(name='div', attrs={'class': ['sociable']}), dict(
        name='h4'), dict(attrs={'class': 'similar-posts'})]
    keep_only_tags = [dict(name='div', attrs={'class': ['title', 'entry']})]
    feeds = [(u'Wiadomości', u'http://feeds.feedburner.com/niebezpiecznik/'),
             ('Blog', 'http://feeds.feedburner.com/niebezpiecznik/linkblog/')]
PK�X�����	�	nieuws_be.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe


class NieuwsBE(BasicNewsRecipe):
    title = u'Nieuws.be'
    __author__ = u'erkfuizfeuadjfjzefzfuzeff'
    description = u'News from Belgium in Dutch'
    oldest_article = 7
    language = 'nl_BE'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='title'), dict(name='h2'),
        dict(name='div', attrs={'class': 'ArticleDiv'})
    ]

    remove_tags = []

    feeds = [
        (u'Binnenland', u'http://www.nieuws.be/rss/nieuws/binnenland.rss'),
        (u'Regio Algemeen', u'http://www.nieuws.be/rss/nieuws/regio.rss'),
        (u'Buitenland', u'http://www.nieuws.be/rss/nieuws/buitenland.rss'),
        (u'Sport', u'http://www.nieuws.be/rss/nieuws/sport.rss'),
        (u'Fun and Famous', u'http://www.nieuws.be/rss/nieuws/fun_en_famous.rss'),
        (u'Politiek', u'http://www.nieuws.be/rss/nieuws/politiek.rss'),
        (u'Economie', u'http://www.nieuws.be/rss/nieuws/economie.rss'), (
            u'Verkeer en Vervoer',
            u'http://www.nieuws.be/rss/nieuws/verkeer_en_vervoer.rss'
        ), (u'Wetenschap', u'http://www.nieuws.be/rss/nieuws/wetenschap.rss'), (
            u'Kunst en Cultuur',
            u'http://www.nieuws.be/rss/nieuws/kunst_en_cultuur.rss'
        ), (u'I-Catchers', u'http://www.nieuws.be/rss/nieuws/i-catchers.rss'), (
            u'Gezondheid & Lifestyle',
            u'http://www.nieuws.be/rss/nieuws/gezondheid_en_lifestyle.rss'
        ), (u'Blogs', u'http://www.nieuws.be/rss/nieuws/blogs.rss'), (
            u'Regio Antwerpen',
            u'http://www.nieuws.be/rss/nieuws/antwerpen_(provincie).rss'
        ),
        (u'Regio Limburg', u'http://www.nieuws.be/rss/nieuws/limburg_(Belgie).rss'),
        (
            u'Regio Oost-Vlaanderen',
            u'http://www.nieuws.be/rss/nieuws/oost-vlaanderen.rss'
        ), (
            u'Regio West-Vlaanderen',
            u'http://www.nieuws.be/rss/nieuws/west-vlaanderen.rss'
        ), (
            u'Regio Vlaams-Brabant',
            u'http://www.nieuws.be/rss/nieuws/vlaams-brabant.rss'
        ), (
            u'Regio Brussel',
            u'http://www.nieuws.be/rss/nieuws/Brussel_(Groot-Brussel).rss'
        ), (u'Wallonië', u'http://www.nieuws.be/rss/nieuws/Wallonie.rss'),
        (u'Snelnieuws', u'http://www.nieuws.be/rss/nieuws/snelnieuws.rss')
    ]
PK�X������nightflier.png�PNG


IHDR  D���*PLTE�������Z�ھ���z"�ƞ�r�������r����f�%h�tRNS@��f~IDATxڽ�1Eј?�_��1�A��ܺ���X�5�5`'��̠�bx#� rQ�SUP�5��x`����B�^�x�'A<��}�`~j��?�07�i`��5�$��O&�{8���Z0F!3�IEND�B`�PK�X��/���nightflier.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
nightfliersbookspace.blogspot.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class NightfliersBookspace(BasicNewsRecipe):
    title = "Nightflier's Bookspace"
    __author__ = 'Darko Miletic'
    description = 'SF, Fantasy, Books, Knjige'
    oldest_article = 35
    max_articles_per_feed = 100
    language = 'sr'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = True
    publication_type = 'blog'
    cover_url = ''
    extra_css             = """
                                @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                                body{font-family: "Trebuchet MS",Trebuchet,Verdana,sans1,sans-serif}
                                .article_description{font-family: sans1, sans-serif}
                                img{margin-bottom: 0.8em; border: 1px solid #333333; padding: 4px }
                            """

    conversion_options = {
        'comment': description, 'tags': 'SF, fantasy, prevod, blog, Srbija', 'publisher': 'Ivan Jovanovic', 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    feeds = [
        (u'Posts', u'http://nightfliersbookspace.blogspot.com/feeds/posts/default')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X�/���nikkei_free.png�PNG


IHDR�a�IDATx�t���0@{�m۶m۶m۶m�ڶm�ˬ����hih�w����w֡T}J��#od-~OK�'W���n�)����l�1�g��/#W[S��"#��
�`P�6�h�ڬ4��c��Rc�!�G��y0��Rm�?�����$7��|Z.7��#F��FXyĉ�k�I�b?}��[�����%l�,�U�ǃ���#�Y}̉�.���-���P
uz��jY���݊����6��@�]q#�!˭����!�����G�S��Qe@�R����Z���<ؐ
��Ȓ��}$w
w����v\p��DS�@Ju�A������G�}�7�9uσ�=��›/���X�,X�J�%:m Oۛh���"G�=�Zp�	<��Gٞ�(�y�,%[��h���w�c�ig���:����R���Z�cd�7�,M�ej��ݗ\H��[�Ҙن"�k���5�C�:���`J\�(���?��zF �"�Rk��Lu����T�59��&\�w�:�RB~�D�xS��%F}^�a�r�:���x���&���7��=#g�dn����oq��+!�!���1x�or4ZB�&�ԏi��?�l��<-*�-dk�WO܃�����WD&^V�?�眥�k~v��?�_ƾ����e��m�k���{my>'h#IEND�B`�PK�X��F�,,nikkei_free.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>'
'''
www.nikkei.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class NikkeiNet(BasicNewsRecipe):
    title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248(Free, MAX)'
    __author__ = 'Hiroshi Miura'
    description = 'News and current market affairs from Japan, no subscription and getting max feed.'
    cover_url = 'http://parts.nikkei.com/parts/ds/images/common/logo_r1.svg'
    masthead_url = 'http://parts.nikkei.com/parts/ds/images/common/logo_r1.svg'
    no_stylesheets = True
    remove_attributes = ['style']
    oldest_article = 2
    max_articles_per_feed = 20
    language = 'ja'

    feeds = [
        (u'\u65e5\u7d4c\u4f01\u696d',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sangyo'),
        (u'\u65e5\u7d4c\u88fd\u54c1',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=newpro'),
        (u'internet',  u'http://www.zou3.net/php/rss/nikkei2rss.php?head=internet'),
        (u'\u653f\u6cbb',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=seiji'),
        (u'\u8ca1\u52d9',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=zaimu'),
        (u'\u7d4c\u6e08',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=keizai'),
        (u'\u56fd\u969b',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kaigai'),
        (u'\u79d1\u5b66',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kagaku'),
        (u'\u30de\u30fc\u30b1\u30c3\u30c8',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=market'),
        (u'\u304f\u3089\u3057',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kurashi'),
        (u'\u30b9\u30dd\u30fc\u30c4',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sports'),
        (u'\u793e\u4f1a',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shakai'),
        (u'\u30a8\u30b3',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=eco'),
        (u'\u5065\u5eb7',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kenkou'),
        (u'\u96c7\u7528',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=koyou'),
        (u'\u6559\u80b2',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kyouiku'),
        (u'\u304a\u304f\u3084\u307f',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=okuyami'),
        (u'\u4eba\u4e8b',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=zinzi'),
        (u'\u7279\u96c6',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=special'),
        (u'\u5730\u57df\u30cb\u30e5\u30fc\u30b9',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=local'),
        (u'\u7d71\u8a08\u30fb\u767d\u66f8',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=report'),
        (u'\u30e9\u30f3\u30ad\u30f3\u30b0',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=ranking'),
        (u'\u4f1a\u898b',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=interview'),
        (u'\u793e\u8aac\u30fb\u6625\u79cb',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shasetsu'),
        (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30d7\u30ed\u91ce\u7403',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=baseball'),
        (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u5927\u30ea\u30fc\u30b0',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=mlb'),
        (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b5\u30c3\u30ab\u30fc',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=soccer'),
        (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b4\u30eb\u30d5',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=golf'),
        (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u76f8\u64b2',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sumou'),
        (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u7af6\u99ac',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=keiba'),
        (u'\u8abf\u67fb\u30fb\u30a2\u30f3\u30b1\u30fc\u30c8',
         u'http://www.zou3.net/php/rss/nikkei2rss.php?head=research')
    ]

    keep_only_tags = [dict(id="CONTENTS_MAIN")]
    remove_tags = [
        dict(name="form"),
        {'class': "cmn-hide"},
    ]
    remove_tags_after = {'class': "cmn-pr_list"}
PK�X���w��nikkei_news.png�PNG


IHDR  D���DPLTE@q@q?q>p?p>q>p���>pV�����������Lzt��JyR|�������8h���ę�Ś�ƭ�����U~����������������7g����c��Z�� V�e��g��n��9i�������v�����r��"W�#X�x��y�����$Y�'[�(\���������”�•��-`�0b�1c�2c���ͩ�Ϋ�Ϭ��5f�6f���׽�پ��
Gw���Hw���������������������������������@q;j����Er����������������Ht���Ny�Q{�FvT}����O|T�W�E�itRNSD|����)�8�IDATx�|���0��P@.�/�X���jte�9���q1A�J�U�j\��5#J@�v^l;��m������H?��4h$E��������x�����O�Y�֜��Zl�/�Ψ�.�� 
&������"=�Tf�
{�Y�2����Yas���f���,�5)�C����C����6��E������M�D�6���������7��`�%��	f�Y�`�d�.eg�
7�(O�IEND�B`�PK�X�����nikkei_news.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import print_function
from calibre.web.feeds.recipes import BasicNewsRecipe
import re

import unicodedata

# import pprint, sys
# pp = pprint.PrettyPrinter(indent=4)


class NikkeiNet_paper_subscription(BasicNewsRecipe):
    title = u'\u65E5\u672C\u7D4C\u6E08\u65B0\u805E\uFF08\u671D\u520A\u30FB\u5915\u520A\uFF09'
    __author__ = 'Ado Nishimura'
    description = u'\u65E5\u7D4C\u96FB\u5B50\u7248\u306B\u3088\u308B\u65E5\u672C\u7D4C\u6E08\u65B0\u805E\u3002\u671D\u520A\u30FB\u5915\u520A\u306F\u53D6\u5F97\u6642\u9593\u306B\u3088\u308A\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\u3002\u8981\u8CFC\u8AAD'  # noqa
    needs_subscription = True
    oldest_article = 1
    max_articles_per_feed = 30
    language = 'ja'
    no_stylesheets = True
    # cover_url       = 'http://parts.nikkei.com/parts/ds/images/common/logo_r1.svg'
    cover_url = 'http://cdn.nikkei.co.jp/parts/ds/images/common/st_nikkei_r1_20101003_1.gif'
    # masthead_url    = 'http://parts.nikkei.com/parts/ds/images/common/logo_r1.svg'
    masthead_url = 'http://cdn.nikkei.co.jp/parts/ds/images/common/st_nikkei_r1_20101003_1.gif'
    cover_margins = (10, 188, '#ffffff')

    remove_tags_before = {'class': "cmn-indent"}
    remove_tags = [
        #                       {'class':"cmn-article_move"},
        #                       {'class':"cmn-pr_list"},
        #                       {'class':"cmnc-zoom"},
        {'class': "cmn-hide"},
        {'name': 'form'},
        {'class': 'cmn-print_headline cmn-clearfix'},
        {'id': 'ABOUT_NIKKEI'},
    ]
    remove_tags_after = {'class': "cmn-indent"}

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)

        if self.username is not None and self.password is not None:
            print("-------------------------open top page-------------------------------------")
            br.open('http://www.nikkei.com/')
            print("-------------------------open first login form-----------------------------")
            try:
                url = list(br.links(
                    url_regex="www.nikkei.com/etc/accounts/login"))[0].url
            except IndexError:
                print("Found IndexError")
                url = 'http://www.nikkei.com/etc/accounts/login?dps=3&pageflag=top&url=http%3A%2F%2Fwww.nikkei.com%2F'
            except StopIteration:
                url = 'http://www.nikkei.com/etc/accounts/login?dps=3&pageflag=top&url=http%3A%2F%2Fwww.nikkei.com%2F'
            br.open(url)
            print("-------------------------JS redirect(send autoPostForm)--------------------")
            br.select_form(name='autoPostForm')
            br.submit()
            # response = br.response()
            print("-------------------------got login form------------------------------------")
            br.select_form(name='LA7010Form01')
            br['LA7010Form01:LA7010Email'] = self.username
            br['LA7010Form01:LA7010Password'] = self.password
            br.submit(id='LA7010Form01:submitBtn')
            print("-------------------------JS redirect---------------------------------------")
            br.select_form(nr=0)
            br.submit()

        return br

    def cleanup(self):
        print("-------------------------logout--------------------------------------------")
        self.browser.open('https://regist.nikkei.com/ds/etc/accounts/logout')

    def parse_index(self):
        print("-------------------------get index of paper--------------------------------")
        result = []
        soup = self.index_to_soup('http://www.nikkei.com/paper/')
        sections = soup.findAll(attrs={'class': re.compile(".*cmn-article_title.*")})

        for sect in sections:
            sect_title = sect.find(attrs={'class' : re.compile(".*cmnc-((large)|(middle)|(small)).*")})
            if sect_title is None:
                continue
            sect_title = sect_title.contents[0]
            sect_result = []
            url = sect.a['href']
            url = re.sub("/article/", "/print-article/", url)
            url = 'http://www.nikkei.com' + url
            sect_result.append(dict(title=sect_title, url=url, date='',description='', content=''))
            result.append([sect_title, sect_result])
        return result

    def populate_article_metadata(self, article, soup, first):
        try:
            elms = soup.findAll(
                'div', {"class": "cmn-article_text JSID_key_fonttxt"})
            elm_text = u'◆'.join(
                [self.tag_to_string(elm).strip() for elm in elms])
            elm_text = unicodedata.normalize('NFKC', elm_text)
            article.summary = article.text_summary = elm_text
        except:
            self.log("Error: Failed to get article summary.")
            return
PK�X�/���nikkei_sub.png�PNG


IHDR�a�IDATx�t���0@{�m۶m۶m۶m�ڶm�ˬ����hih�w����w֡T}J��#od-~OK�'W���n�)����l�1�g��/#W[S��"#��
�`P�6�h�ڬ4��c��Rc�!�G��y0��Rm�?�����$7��|Z.7��#F��FXyĉ�k�I�b?}��[�����%l�,�U�ǃ���#�Y}̉�.���-���P
uz��jY���݊����6��@�]q#�!˭����!�����G�S��Qe@�R����Z���<ؐ
��Ȓ��}$w
w����v\p��DS�@Ju�A������G�}�7�9uσ�=��›/���X�,X�J�%:m Oۛh���"G�=�Zp�	<��Gٞ�(�y�,%[��h���w�c�ig���:����R���Z�cd�7�,M�ej��ݗ\H��[�Ҙن"�k���5�C�:���`J\�(���?��zF �"�Rk��Lu����T�59��&\�w�:�RB~�D�xS��%F}^�a�r�:���x���&���7��=#g�dn����oq��+!�!���1x�or4ZB�&�ԏi��?�l��<-*�-dk�WO܃�����WD&^V�?�眥�k~v��?�_ƾ����e��m�k���{my>'h#IEND�B`�PK�X���~~nikkei_sub.recipeimport re
from calibre.web.feeds.recipes import BasicNewsRecipe
import mechanize
from calibre.ptempfile import PersistentTemporaryFile


class NikkeiNet_subscription(BasicNewsRecipe):
    title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248(MAX)'
    __author__ = 'Hiroshi Miura'
    description = 'News and current market affairs from Japan, gather MAX articles'
    needs_subscription = True
    oldest_article = 2
    max_articles_per_feed = 10
    language = 'ja'
    remove_javascript = False
    temp_files = []

    remove_tags_before = {'class': "cmn-section cmn-indent"}
    remove_tags = [
        {'class': "JSID_basePageMove JSID_baseAsyncSubmit cmn-form_area JSID_optForm_utoken"},
        {'class': "cmn-article_keyword cmn-clearfix"},
        {'class': "cmn-print_headline cmn-clearfix"},
    ]
    remove_tags_after = {'class': "cmn-pr_list"}

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)

        cj = mechanize.LWPCookieJar()
        br.set_cookiejar(cj)

        # br.set_debug_http(True)
        # br.set_debug_redirects(True)
        # br.set_debug_responses(True)

        if self.username is not None and self.password is not None:
            # print "----------------------------get login form--------------------------------------------"
            # open login form
            br.open('https://id.nikkei.com/lounge/nl/base/LA0010.seam')
            response = br.response()
            # print "----------------------------get login form---------------------------------------------"
            # print "----------------------------set login form---------------------------------------------"
            # remove disabled input which brings error on mechanize
            response.set_data(response.get_data().replace(
                "<input id=\"j_id48\"", "<!-- "))
            response.set_data(response.get_data().replace(
                "gm_home_on.gif\" />", " -->"))
            br.set_response(response)
            br.select_form(name='LA0010Form01')
            br['LA0010Form01:LA0010Email'] = self.username
            br['LA0010Form01:LA0010Password'] = self.password
            br.form.find_control(id='LA0010Form01:LA0010AutoLoginOn', type="checkbox").get(
                nr=0).selected = True
            br.submit()
            br.response()
            # print "----------------------------send login form---------------------------------------------"
            # print "----------------------------open news main page-----------------------------------------"
            # open news site
            br.open('http://www.nikkei.com/')
            br.response()
            # print "----------------------------www.nikkei.com BODY   --------------------------------------"
            # print response2.get_data()
            # print "-------------------------^^-got auto redirect form----^^--------------------------------"
            # forced redirect in default
            br.select_form(nr=0)
            br.submit()
            response3 = br.response()
            # return some cookie which should be set by Javascript
            # print response3.geturl()
            raw = response3.get_data()
            # print "---------------------------response to form --------------------------------------------"
            # grab cookie from JS and set it
            redirectflag = re.search(
                r"var checkValue = '(\d+)';", raw, re.M).group(1)
            br.select_form(nr=0)

            self.temp_files.append(PersistentTemporaryFile('_fa.html'))
            self.temp_files[-1].write("#LWP-Cookies-2.0\n")

            self.temp_files[-1].write(
                "Set-Cookie3: Cookie-dummy=Cookie-value; domain=\".nikkei.com\"; path=\"/\"; path_spec; secure; expires=\"2029-12-21 05:07:59Z\"; version=0\n")
            self.temp_files[-1].write("Set-Cookie3: redirectFlag=" + redirectflag +
                                      "; domain=\".nikkei.com\"; path=\"/\"; path_spec; secure; expires=\"2029-12-21 05:07:59Z\"; version=0\n")
            self.temp_files[-1].close()
            cj.load(self.temp_files[-1].name)

            br.submit()

            # br.set_debug_http(False)
            # br.set_debug_redirects(False)
            # br.set_debug_responses(False)
        return br

    feeds = [(u'\u65e5\u7d4c\u4f01\u696d',  u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sangyo'),
             (u'\u65e5\u7d4c\u88fd\u54c1',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=newpro'),
             (u'internet',  u'http://www.zou3.net/php/rss/nikkei2rss.php?head=internet'),
             (u'\u653f\u6cbb',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=seiji'),
             (u'\u8ca1\u52d9',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=zaimu'),
             (u'\u7d4c\u6e08',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=keizai'),
             (u'\u56fd\u969b',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kaigai'),
             (u'\u79d1\u5b66',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kagaku'),
             (u'\u30de\u30fc\u30b1\u30c3\u30c8',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=market'),
             (u'\u304f\u3089\u3057',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kurashi'),
             (u'\u30b9\u30dd\u30fc\u30c4',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sports'),
             (u'\u793e\u4f1a',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shakai'),
             (u'\u30a8\u30b3',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=eco'),
             (u'\u5065\u5eb7',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kenkou'),
             (u'\u96c7\u7528',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=koyou'),
             (u'\u6559\u80b2',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kyouiku'),
             (u'\u304a\u304f\u3084\u307f',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=okuyami'),
             (u'\u4eba\u4e8b',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=zinzi'),
             (u'\u7279\u96c6',   u'http://www.zou3.net/php/rss/nikkei2rss.php?head=special'),
             (u'\u5730\u57df\u30cb\u30e5\u30fc\u30b9',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=local'),
             (u'\u7d71\u8a08\u30fb\u767d\u66f8',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=report'),
             (u'\u30e9\u30f3\u30ad\u30f3\u30b0',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=ranking'),
             (u'\u4f1a\u898b',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=interview'),
             (u'\u793e\u8aac\u30fb\u6625\u79cb',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shasetsu'),
             (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30d7\u30ed\u91ce\u7403',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=baseball'),
             (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u5927\u30ea\u30fc\u30b0',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=mlb'),
             (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b5\u30c3\u30ab\u30fc',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=soccer'),
             (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b4\u30eb\u30d5',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=golf'),
             (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u76f8\u64b2',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sumou'),
             (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u7af6\u99ac',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=keiba'),
             (u'\u8abf\u67fb\u30fb\u30a2\u30f3\u30b1\u30fc\u30c8',
              u'http://www.zou3.net/php/rss/nikkei2rss.php?head=research')
             ]
PK�Xkt���nikkeiasia.png�PNG


IHDR(-S0PLTEv�����@��`��� ��0�ˠ�瀻������������p��38��cIDAT�U�Y� 
�ե��E�[��И?�͝{u�d����X�p�A^� ]�e��o��
OTР��:���G"�խ���ު��u�8}�f�"=�HIEND�B`�PK�X���ݜ
�
nikkeiasia.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

def absurl(url):
    if url.startswith('/'):
        url = 'https://asia.nikkei.com' + url
    return url

class nikkei(BasicNewsRecipe):
    title = 'Nikkei Asia'
    __author__ = 'unkn0wn'
    language = 'en'
    no_stylesheets = True
    description = (
        'Japan, China, India and Southeast Asia news and expert analysis published by Nikkei'
        ', an award-winning independent provider of quality journalism.'
    )
    masthead_url = 'https://www.global-nikkei.com/22ia/images/logo/Nikkei-Asia-Logo.svg'
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}
    resolve_internal_links = True
    remove_empty_feeds = True
    encoding = 'utf-8'
    use_embedded_content = False

    extra_css = '''
        .article-header__sub-title { font-style:italic; color:#202020; }
        .article-header__details, .article__details { font-size:small; font-weight:bold; }
        .timestamp { color:#5c5c5c; }
        .article-header__topic { font-size:small; font-weight:bold; color:#5c5c5c; }
        .article__image, .article__caption { font-size:small; text-align:center; color:#202020; }    
    '''

    keep_only_tags = [
        classes('article-header__container article')
    ]

    remove_tags = [
        dict(name='svg'),
        classes('article__advert share__container no-print')
    ]

    def parse_index(self):
        archives = self.index_to_soup('https://asia.nikkei.com/Print-Edition/Archives')
        card = archives.find(attrs={'class':'card-article__body'})
        self.title = 'Nikkei Asia: ' + self.tag_to_string(card.h4).strip()
        self.description = self.tag_to_string(card.p)
        self.timefmt = ' [' + self.tag_to_string(card.span.time).strip() + ']'
        self.log('Downloading ', self.title, self.timefmt, self.description)
 
        soup = self.index_to_soup(absurl(card.h4.a['href']))
        self.cover_url = soup.find(**classes('print-edition__cover-image')).img['src']

        ans = []

        for art in soup.findAll(**classes('card-article__body')):
            head = art.find(**classes('card-article__headline'))
            title = self.tag_to_string(head).strip()
            url = absurl(head.a['href'])
            desc = ''
            if exc := art.find(**classes('card-article__excerpt')):
                desc = self.tag_to_string(exc).strip()
            self.log( title, '\n   ', desc,  '\n        ', url )
            ans.append({'title': title, 'url': url, 'description': desc})
        return [('Articles', ans)]

    def print_version(self, url):
        return 'https://webcache.googleusercontent.com/search?q=cache:' + url.split('?')[0]
PK�X`bʰ�
nin.recipe
__license__ = 'GPL v3'
__copyright__ = '2008-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.nin.co.rs
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Nin(BasicNewsRecipe):
    title = 'NIN online'
    __author__ = 'Darko Miletic'
    description = 'Nedeljne Informativne Novine'
    publisher = 'NIN d.o.o. - Ringier d.o.o.'
    category = 'news, politics, Serbia'
    no_stylesheets = True
    oldest_article = 180
    encoding = 'utf-8'
    needs_subscription = True
    remove_empty_feeds = True
    auto_cleanup = False
    PREFIX = 'http://www.nin.co.rs'
    INDEX = PREFIX + '/?change_lang=ls'
    use_embedded_content = False
    language = 'sr'
    publication_type = 'magazine'
    masthead_url = 'http://www.nin.co.rs/img/logo_print.jpg'
    extra_css              = """
                                 @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                                 body{font-family: Verdana, Lucida, sans1, sans-serif}
                                 .article_description{font-family: Verdana, Lucida, sans1, sans-serif}
                                 .artTitle{font-size: x-large; font-weight: bold; color: #900}
                                 .izjava{font-size: x-large; font-weight: bold}
                                 .columnhead{font-size: small; font-weight: bold;}
                                 img{margin-top:0.5em; margin-bottom: 0.7em; display: block}
                                 b{margin-top: 1em}
                             """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    preprocess_regexps = [
        (re.compile(r'<div class="standardFont">.*', re.DOTALL | re.IGNORECASE),
         lambda match: ''), (re.compile(u'\u0110'), lambda match: u'\u00D0')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open(self.INDEX)
            br.select_form(name='form1')
            br['login_name'] = self.username
            br['login_password'] = self.password
            br.submit()
        return br

    remove_tags_before = dict(name='div', attrs={'class': 'titleFont'})
    remove_tags_after = dict(name='div', attrs={'class': 'standardFont'})
    remove_tags = [dict(name=['object', 'link', 'iframe', 'meta', 'base'])]
    remove_attributes = ['border', 'background',
                         'height', 'width', 'align', 'valign']

    def get_cover_url(self):
        cover_url = None
        soup = self.index_to_soup(self.INDEX)
        cover = soup.find('img', attrs={'class': 'issueImg'})
        if cover:
            return self.PREFIX + cover['src']
        return cover_url

    feeds = [(u'NIN Online', u'http://www.nin.co.rs/misc/rss.php?feed=RSS2.0')]

    def print_version(self, url):
        return url + '&pf=1'
PK�X�F��njp.png�PNG


IHDR�a�IDATx�܏3��a��S6��l�\�m۶�l���3r���Ϻ��m����r�����'�=��>�y���xR�h�#]L<�5���c�{΢8�t�o�w2 �[�-����+�ө?�ن�Fm�e�t��%{��e5c�Z�z�j�#�4��oE2WD^�����(V�g�(��/(M�`�P	�Eg��h¨��!�p=�I�.ۅP�n�c6��k�N��d1#�XN4�r���f3���q���j�ۥR����"��#��|3S�e+��_�f2!�\`���}<V���b�.��<}����e� K6�
�e��<��w��Vo�e�̋��y��+����,���K��$�+K���yи-�
���>�{�Nxk�G�5��ݏ+�'�	Sp4lCTM"�VB,�'��2D0=��)EĒK�D9��""I%�2�L�����IyDR�Ē����~�3^(��Ύ�(�/�^�I�IEND�B`�PK�X�)/���
njp.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

##
# Title:        New Journal of Physics
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    Chema Cort\xe9s
##
# Written:      Jan 2011
# Last Edited:  Jan 2012 - by Kiavash
##

__license__ = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'
__copyright__ = u'Chema Cort\xe9s - 2011-01-05'
__version__ = 'v0.5.0'
__date__ = '2012-01-13'

'''
njp.org
'''

import re  # Import the regular expressions module.
from calibre.web.feeds.news import BasicNewsRecipe


class NewJournalOfPhysics(BasicNewsRecipe):
    title = u'New Journal of Physics'
    __author__ = u'Chema Cort\xe9s'
    description = u'The open-access journal for physics'
    publisher = u'IOP (Institute of Physics)'
    category = 'physics, journal, science'
    language = 'en'

    feeds = [(u'Latest Papers', u'http://iopscience.iop.org/1367-2630/?rss=1')]

    cover_url = 'http://images.iop.org/journals_icons/Info/1367-2630/cover.gif'

    oldest_article = 7
    max_articles_per_feed = 30
    timeout = 30

    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    remove_empty_feeds = True
    asciiize = True  # Converts all none ascii characters to their ascii equivalents

    keep_only_tags = [
        dict(id=['articleEvoContainer']),
    ]

    remove_tags = [
        # Removes Shoow Affiliations
        dict(name='div', attrs={'class': 'affiliations'}),
        # Removes Tags and PDF export
        dict(name='div', attrs={'class': 'abst-icon-links'}),
        dict(name='p', attrs={'class': 'studyimage'}),  # remove Studay image
        # remove Export to PowerPoint Slide
        dict(name='a', attrs={'class': 'icon powerpoint'}),
        dict(name='a', attrs={'title': 'CrossRef'}),  # remove CrossRef icon
        dict(name='a', attrs={'title': 'PubMed'}),  # remove PubMed icon
        dict(name='a', attrs={'e4f5426941': 'true'}),  # remove cross ref image
        dict(name='img', attrs={'src': ''}),  # remove empty image
        dict(name='a', attrs={'class': 'closeChap'}),  # remove 'Close'
        # remove Top breadcrumbs
        dict(name='ul', attrs={'class': 'breadcrumbs'}),
    ]

    extra_css = 'body { font-family: verdana, helvetica, sans-serif; } \
                 .introduction, .first { font-weight: bold; } \
                 .cross-head { font-weight: bold; font-size: 125%; } \
                 .cap, .caption { display: block; font-size: 80%; font-style: italic; } \
                 .cap, .caption, .caption img, .caption span { display: block; margin: 5px auto; } \
                 .byl, .byd, .byline img, .byline-name, .byline-title, .author-name, .author-position, \
                    .correspondent-portrait img, .byline-lead-in, .name, .bbc-role { display: block; \
                    font-size: 80%; font-style: italic; margin: 1px auto; } \
                 .story-date, .published { font-size: 80%; } \
                 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 { font-size: 175%; font-weight: bold; } \
                 h2 { font-size: 150%; font-weight: bold; } \
                 h3 { font-size: 125%; font-weight: bold; } \
                 h4, h5, h6 { font-size: 100%; font-weight: bold; }'

    # Remove the line breaks.
    preprocess_regexps = [(re.compile(r'<br[ ]*/>', re.IGNORECASE), lambda m: ''),
                          (re.compile(r'<br[ ]*clear.*/>',
                                      re.IGNORECASE), lambda m: ''),
                          ]

    def print_version(self, url):
        return url + "/article"
PK�X�6���njuz_net.png�PNG


IHDR�awIDATx��?HUQ���s�Z%Y�/H
���jPuHD"5ɬ,i�D,���������)
�))q
�h�E��ϰL}>}��sϟ���(��������y>�/�T�p�;77����H�Ul�^��D�1�y��0�yf��_�,�0�>�Di��8"Z]Y^`F>�?���-��Ҋ���m�b��iM�X��
�\I����,m�)�Zh�!��
}����Zm���"�%YJc�^>?t��@gbu++	�^/�$�t�ʭ bMa���H$�d�� ��2�1������X����P)$=������q�`�tD�{d�%���P�A`"�i�c{���������
�A�h�(�u8��S����x�Y��q�9�_�10�9dH�Z���ucs�/�j�K�v���q��.8c�A�
D��!�� �uHp@�4����h�?y���O����u������l�a5�TT|�����xk3j�Iiyٽɯ��gf/^jn��������H$�a���j�N�.�~Pe��3:D�ެ�S57	[t�Zǣ�S3wY�����
�[d�` 8�9Quyzjj)�-jm�8��;���0�
7�.��I�uIEND�B`�PK�X�7��njuz_net.recipe
__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
njuz.net
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe


class NjuzNet(BasicNewsRecipe):
    title = 'Njuz.net'
    __author__ = 'Darko Miletic'
    description = 'Iscasene vesti iz Srbije, regiona i sveta'
    publisher = 'njuz.net'
    category = 'news, politics, humor, Serbia'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    language = 'sr'
    publication_type = 'newsportal'
    masthead_url = 'http://www.njuz.net/njuznet.jpg'
    extra_css             = """
                               @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                                body{font-family: serif1, serif}
                               .articledescription{font-family: serif1, serif}
                               .wp-caption-text{font-size: x-small}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [
        dict(attrs={'id': 'entryMeta'}), dict(attrs={'class': 'post'})
    ]

    remove_tags = [
        dict(name=['embed', 'link', 'base', 'iframe', 'object', 'meta', 'fb:like']), dict(
            name='div', attrs={'id': 'tagsandcats'})
    ]
    remove_tags_after = dict(name='div', attrs={'id': 'tagsandcats'})
    remove_attributes = ['lang']
    feeds = [(u'Clanci', u'http://www.njuz.net/feed/')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for alink in soup.findAll('a'):
            if alink.string is not None:
                tstr = alink.string
                alink.replaceWith(tstr)
        return soup
PK�X�8S@��nme.png�PNG


IHDR���RPLTE�%�_e���������(C�0IDAT[c` �882:�80�8:��88EL���"L` 	!�|��͝3IEND�B`�PK�X$W¬��
nme.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1306061239(BasicNewsRecipe):
    title = u'New Musical Express Magazine'
    description = 'UK Rock & Pop Mag.'
    __author__ = 'Dave Asbury, Inge Aning'
    category = 'Music, Film, Tv'
    publisher = 'Time Inc. (UK) Ltd.'
    '''
    ' updated 11/3/2015
    ' feeds url
    ' cover and masterhead url
    ' fix for a bug that prevents some pages render
    ' changes to website
    '''

    remove_empty_feeds = True
    encoding = 'utf-8'
    remove_javascript = True
    no_stylesheets = True
    oldest_article = 7
    max_articles_per_feed = 20
    auto_cleanup = False
    language = 'en'
    compress_news_images = True
    simultaneous_downloads = 20
    use_embedded_content = False
    recursions = 0
    auto_cleanup = True

    feeds = [
        (u'NME News', u'http://www.nme.com/news/feed'),
        (u'Reviews', u'http://www.nme.com/reviews/feed/'),
        (u'Blogs', u'http://www.nme.com/blogs/feed'),
    ]
PK�Xy����noaa.png�PNG


IHDR��h6�IDATx�]��Kq����e	���A��MӬ(���LTE���ӻ�mJsc��Cg�"D�.��)��s�,��+�mn�[[�b���8����}�{�
�\&��V������9u�y��ʞ��&۷X&"���$��%�d�E-I"�p�O�}~6*���{�N����w���w��<�|G�<�@.��K���oD�o�&�J���nhպ���ڶ��X�:��m<[�ۜ��ĝ_�~D-MP��%
(��jZ�|��6jLO�g�
ї�_�wy�~��1�~zq_i[��⫚37{�\z�WޙS־�t���gF�j�_ѡ���qg8�Wd�ئI��L<Fn/�%�r���C��ݦ��u�P��AM���⺄B��ׂ,>%�l~90��Hk��&�PeEB�3��\7����������l�p���W��͓2|@cC8���G�>
�ݫ,���+
S���]�`�/e���ʰ��
p8]���r�a(
z%C3��,��N7�y�ipf��zM�X6`OP2HB�f"��4<��tza�Cv�@�\��HbF���L����<l0��<zH!��ƀ@��y�@t�^6 \�cf0�0�x@���*���9:*�� �-�R��@5+P1���ѥq�'��fS����IEND�B`�PK�X�16�zznoaa.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
noaa.com
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class NOAA(BasicNewsRecipe):
    title = 'NOAA Online'
    __author__ = 'Darko Miletic'
    description = 'NOAA'
    publisher = 'NOAA'
    category = 'news, science, US, ocean'
    oldest_article = 15
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    simultaneous_downloads = 1
    encoding = 'utf-8'
    lang = 'en'
    language = 'en'

    remove_tags = [dict(name=['embed', 'object']), dict(name='div', attrs={'id': 'leftNav'}), dict(name='div', attrs={'id': 'topNav'}), dict(name='div', attrs={'class': 'feedback_box'}), dict(name='div', attrs={'id': 'midBlock'}), dict(name='div', attrs={'id': 'footer'}) ]  # noqa

    feeds = [(u'NOAA articles', u'http://www.noaa.gov/rss/noaarss.xml')]

    def preprocess_html(self, soup):
        soup.html['xml:lang'] = self.lang
        soup.html['lang'] = self.lang
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return self.adeify_images(soup)
PK�X&�C�noerrebronordvestbladet_dk.png�PNG


IHDR  D���3PLTEMv���P��@z������ß�̯��������X�����p��0n�`�� c�����IDATx���E1D���?m]ï��]��~h�-@�:H�cՁ�'�lg�46f	��>�E���X�����:�e`Q�z��rˠ�ܾ�p�H�3�^n� k~�_A+ށ@K��y��ʙWu�$�؞y0P�9����IEND�B`�PK�X��
		!noerrebronordvestbladet_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Nørrebro Nordvest bladet
'''


class Minby_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Nørrebro Nordvest bladet'

    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Nørrebro Nordvest bladet', 'http://minby.dk/noerrebronordvest-bladet/feed/'),
        ('Kommentarer til Nørrebro Nordvest bladet', 'http://minby.dk/noerrebronordvest-bladet/comments/feed/'),

    ]

PK�X�`p�--nol.png�PNG


IHDR  D���uPLTEL6���������m2[q7_s;bu=d�Yz���������������M7XCd%Q�z�������������̸���������WBM8P	:VA�]}�^~�������������d��i���VrsIDATx����@��m��7\+�礒�W^�i�u��UxK����S	�g>�wxD�P�2	������s=�����"�hB�w�>�U����hw���"�IEND�B`�PK�X��CI��
nol.recipe##########################################################################
# Description:	  http://nol.hu/ RSS channel
# Author: 	  Bigpapa (bigpapabig@hotmail.com)
# Date:	  2011.12.18. - V1.1
##########################################################################

from calibre.web.feeds.recipes import BasicNewsRecipe


class NOL(BasicNewsRecipe):
    title = u'NOL'
    __author__ = 'Bigpapa'
    oldest_article = 5
    # Az adott e-bookban tarolt cikkek feedenkenti maximalis szamat adja meg.
    max_articles_per_feed = 5
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    language = 'hu'
    publication_type = 'newsportal'

    conversion_options = {
        'linearize_tables': True,
    }

    keep_only_tags = [
        dict(name='table', attrs={'class': ['article-box']})
    ]

    remove_tags = [

        dict(name='div', attrs={'class': ['h', 'ad-container-outer', 'tags noborder',
                                          'ad-container-inner', 'image-container-lead', 'tags', 'related-container']}),
        dict(name='h4'),
        dict(name='tfoot'),
        dict(name='td', attrs={'class': ['foot']}),
        dict(name='span', attrs={'class': ['image-container-caption']}),
    ]

    feeds = [
        (u'Belf\xf6ld', 'http://nol.hu/feed/belfold.rss'),
        (u'K\xfclf\xf6ld', 'http://nol.hu/feed/kulfold.rss'),
        (u'Gazdas\xe1g', 'http://nol.hu/feed/gazdasag.rss'),
        (u'V\xe9lem\xe9ny', 'http://nol.hu/feed/velemeny.rss'),
        (u'Kult\xfara', 'http://nol.hu/feed/kult.rss'),
        (u'Tud/Tech', 'http://nol.hu/feed/tud-tech.rss'),
        (u'Sport', 'http://nol.hu/feed/sport.rss'),
        (u'Noller', 'http://nol.hu/feed/noller.rss'),
        (u'Mozaik', 'http://nol.hu/feed/mozaik.rss'),
        (u'Utaz\xe1s', 'http://nol.hu/feed/utazas.rss'),
        (u'Aut\xf3', 'http://nol.hu/feed/auto.rss'),
        (u'Voks', 'http://nol.hu/feed/voks.rss'),

    ]
PK�X#]M�''non_leggerlo.png�PNG


IHDR  V%(	pHYs��~��IDAT�A�Te��{�;sF�N׫7�)!�
ڶ�~�H�H�@�v��hS�*���6n[�-"+�B�w�;s�ޞ�$�(	�-
�	�<�ow�tu�'ˣ�OW����P���|{�k���w���t�W_ڽs�7̋�M�K��\�)3�/��?3�S��1ۑ_��Cݮ�IЊ
��F�S��ߺ`u�}]���y�*h;v�8�����;8d��~}]�4P���~p�
���Z����g�nP%ڈ�rT�4@D&�P)̒�	*���Jo�*�B�v
�0���q9:������_�$PA�3���J�)7�����	6O|��9�]����A�jo�L@G�9���ɳ��5���_��9�}�)l������,3g��b=~x}ɹ�����0�ݼqQJj��w��,8>��a��h�$�Z����q���IEND�B`�PK�XJ�^�non_leggerlo.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1335362999(BasicNewsRecipe):
    title = u'Non leggerlo'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = False
    keep_only_tags = [
        dict(name='div', attrs={'class': 'post hentry'})
    ]
    feeds = [
        (u'Non leggerlo', u'http://nonleggerlo.blogspot.com/feeds/posts/default')]
    description = 'An Italian satirical blog'
    language = 'it'
    __author__ = 'faber1971'


__version__ = 'v1.0'
__date__ = '24, April 2012'
PK�X
��a!!norddjurslokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X�顈��norddjurslokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Norddjurs
'''


class NorddjursLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Norddjurs'
    description = 'Lokale og regionale nyheder, sport, kultur fra det nordlige Djursland på norddjurs.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Norddjurs', 'http://norddjurs.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Norddjurs', 'http://norddjurs.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Norddjurs', 'http://norddjurs.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Norddjurs', 'http://norddjurs.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Norddjurs', 'http://norddjurs.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Norddjurs', 'http://norddjurs.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X�խ�nordjyske_dk.png�PNG


IHDR00�`n��IDATx�얃�+�����۾���m�ޱg�m�5��N+�L��N���t>��gc>թS�-&���������S��RUKS�<�]�L3(���Z�9��-�kY��~;�b)��/�h��#ْe�i���>>$�#���}ӷk[�ߤ�B��=���-�����<���wO?����զ��pJc�P�.����_V���u��I��H�{G�{K�}S�}[,�U�����iI�y@�(��R�!tV�2��Y�f���,�AdJ����tf$�F��Щ�tF;7�����ִ���@��gD� ��-�?|�cvY&��&+���\3O,��D*��J����p:;��#@��t �nY m���BC'+�[���D���#���Y H`F�9	�C�����4wog!��(;�\O	a�A(D��(\D���=Oއp	��:-�u�:���O�������'G][���M+}{v�����+OZ���F��KǞg0����9����_TZ�~ћj����
7�?���.I׆z�� �15�(�x��3��]*�zX�fh���o�"|�eP_y�J��J�a��;|}63/IkoX���J�����j��3.��c2½o�`t��K��߶Nkkp�z�����h����(i>����|Q�~�V�"�מ6O3vo�oY�[�A�ͱAvY�
��5,���r��O1�qSD��q�R�.��t�Z��Kna
�u.�j��`pF�OgE�0f����n��#�Y��߱��~�O8�@�{�#‹�g�yI"�2�H��@h�5�0>hC��H# �[ר_�kp|.�jd%��Otv�ЗK>t�3�hHp7dg��E�.�Ĕ��/b(��
�<�r$\�|Z�}��E%F��OpF2���܂�w�]���l�n�R�9��'%(�=t�ߺ�Ɏ&@��̃{����a91�!(:��@��ǝ�f�80th��R�\[���+��f���NdYD�j���o�ij}��[�c'I*���,F�N��α�������z��0�6��)�7/%��t�����1Q�y�&=�ؘq?z�
�El�=�&\�?�fl���@�K|�i�!, �ƾ]�i^D�I��@��~�<��!A�L⇯k͵R��LH�9��Z�O�>|�)��-N�zZ�}���8�է��^���X�ɱ��H�,�)���¦f(�����H�B�
�o,'vI�����{��0��+�G2�"��'�ؓ�����1�o!�,��ؿ_� ��#��Ql ��LJ�C�D�@�LV��]6�B[@�F��)6�`� � *�4�����4�z�J���y�Q�
�<Wf���k��#6�����~6�۰	�&p x}�'��6���75��P�:�7V���ֆ��d��}�Z��u\���m�ܿG�n5zۍ�^�@c�W�j�;����h����4Q�^��j��i��/F]ׇ��++��_W[���G�WTU�W�:brrʖ|����_~���O���'�7ު���ȑ#���ؾ���������������UVT�&�qpTV��U3��e͍�.�+$I���1�0��-�������N���o<sg�ضm۶m'm�/9�3�q���®��Z���۾m��j6Z�#c
\�t9����G�̈́�W����k��JHH�7o~Lt��d�i�N�5�m���ȋ/���_��鴆�����Lz��B���꣣c���۴n�U��K|�K�ƧN��
��wZ�lM �R�}����8�\�T��7kq�֭�[�V�TU�а�c��II)
�J��=L+\�htTLNNN��=�IeRE��#G���Rj����3�]��y�PT�Z���%�dŊJ@���ojC�`
� Ѐ�!��K�,�i�!���
�שU��\��ѭ��,Yھm���W�t�n=$2��C�F�Z�y%4O$,"z��jT�5l����'�;n��%��݀BC���3���G,�0-�ux/%9�6�u�֝�m�Z�U�TK�.{��@�BxH1j�(�f���FE@̉�k$��t���vm�Cn(S�lqW	h7�M'N���0D���∀�\�r��u�,����� Bǐ��={�b^���5S�n�5@tnܸ�b��#��;1!�ѣG��鯼��6v�J$'��X�� " �FoЛ�Z�@Ϥ����谹�$%�E5�����oҤ��~B/\��~0�޽'22Z��jw�3z,�	/F�;g�
H���r�R)Ww��Ν�?$��O�,���������/��T�P�T!�m;���'2�$ �&'�PϾ
�U0�?ΐP~�U�N�۷?Ӿ�Ç�x<>*�	�y����լQ��F&`u9K̙3վ�!F9w�ʃD�q@��$
87v���C`��ȑ���5ļl��� �2�ٜ�s��IK{��(�J���}�~PP� �?f�Xpʔ����<8eʴ�*C}�YG
�X�.���ޘ�j�/Y��� �֫[����V�Z�|嶭����F�ԩS1Q��谻*��T�UR�@�uݺ�xH� E�d`�Q��h�����}�'�ڨ7;�n���9cc�=*�ߍ[^���/+u������F� �Ŗ�[�W�Ay�<e���g�^�ֵkw�K$���d�g�d�4o�IP��e�[�n[���?_��*�Z*�3��C�!*�nժ�0,DOLH�q��{��Zr#nڴI�%<���
HK}%2"*:*���=��λy�a��>����U����K֯�"x��	&N�:�G�6m��{��}�r�s@ܣ��!�*T&E�������_��/�S|8���\\���i= ��x��[�b%�-@!F��M�]�|��m����5�(�N;�9}�O�I�qbAAzc�~���~��L[�
��IEND�B`�PK�X>��}77nordjyske_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Nordjyske.dk
'''


class Nordjyske_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Nordjyske.dk'
    description = ('Nordjyske.dk er hele tiden klar med de nyheder, der handler om dig og dit liv.'
                   ' Og du får dem lige der, hvor du er - på din computer, tablet eller mobiltelefon.')
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 25
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Nyheder', 'http://nordjyske.dk/rss/nyheder'),
        ('Danmark', 'http://nordjyske.dk/rss/danmark'),
        ('Sport', 'http://nordjyske.dk/rss/sport'),
        ('Erhverv', 'http://nordjyske.dk/rss/erhverv'),
        ('Verden', 'http://nordjyske.dk/rss/verden'),
        ('Brønderslev', 'http://nordjyske.dk/rss/broenderslev'),
        ('Frederikshavn', 'http://nordjyske.dk/rss/frederikshavn'),
        ('Hjørring', 'http://nordjyske.dk/rss/hjoerring'),
        ('Jammerbugt', 'http://nordjyske.dk/rss/jammerbugt'),
        ('Mariagerfjord', 'http://nordjyske.dk/rss/mariagerfjord'),
        ('Rebild', 'http://nordjyske.dk/rss/rebild'),
        ('Vesthimmerland', 'http://nordjyske.dk/rss/vesthimmerland'),
        ('Thisted', 'http://nordjyske.dk/rss/thisted'),
        ('Aalborg', 'http://nordjyske.dk/rss/aalborg'),

    ]

PK�X������nortecastilla.png�PNG


IHDR  D����PLTE��������"�!/���������"����"������4A�-;�4A� �.<�2?�4A�5B� �-<� �/<�!�"�/<�!�#�/<�0=�!�Q\�!�0>�Q\�"�&5�(6�Q]�R]�.:�.<�1>�Q]�HR�$�!0�/=�=J�Zb�#�#�'�!0�Vb�dn�"�#�Xc�\g�dn�eo�#��/=�Xc�do�#�)7�0>�LW�Xc�Yd�Yd�eo�Xc�kt�Q\�^i�ku�GT�ku�LW�py����^g�en�gq�}��qz�t|�x�ꚡ뜢練����
�
���������������������������������������
�
=,f�IDATx^��coDa���Yom۶m۶m㯷�9�6�49_z}���!�6�Æ�ې�Fװ�	�d+`s���Y9�u���bw�KZ|�j�G|Ġv�%\�Y��!$w������Q�ٳ��y�:�,vݹ�]VPp�����:T`3pT�XvF1�%Ѭ�&��X�W��d�n�����H�Q�d�A�
c���)Ca��t�*tb2�%`����듒Z1�(N�
S!���J1E���0t�R�B!&���a�i�>�R����
B�~�����5�\IEND�B`�PK�X��#X--nortecastilla.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__description__ = 'Daily newspaper from Spain'
__version__ = 'v1.01'
__date__ = '14, January 2010'

'''
http://www.nortecastilla.es/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class norteCastilla(BasicNewsRecipe):
    author = 'Lorenzo Vigentini'
    description = 'Daily newspaper from Spain'

    cover_url = 'http://www.nortecastilla.es/img/rd.logo_nortecastilla.png'
    title = u'NorteCastilla '
    publisher = 'Vocento'
    category = 'News, politics, culture, economy, general interest'

    language = 'es'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 1
    max_articles_per_feed = 25

    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True

    keep_only_tags = [
        dict(name='div', attrs={'class': ['articulo', 'photo']})
    ]

    remove_tags = [
        dict(name='div', attrs={
             'class': ['contenido_form_articulo', 'colC_articulo', 'publiEspecial']}),
        dict(name='div', attrs={
             'class': ['tags_relacionados', 'form_art form_opina', 'adds', 'comentarios']}),
        dict(name='span', attrs={'class': 'contenido_form_articulo'}),
        dict(name='div', attrs={'id': 'publi1_noxtrum'}),
        dict(name='a', attrs={'class': ['nav_fgH_ant', 'nav_fgH_sig']})
    ]

    feeds = [
        (u'Ultima hora', u'http://www.nortecastilla.es/rss/feeds/ultima.xml'),
        (u'Portada', u'http://www.nortecastilla.es/portada.xml'),
        (u'Espana', u'http://www.nortecastilla.es/img/rss_descarga.gif'),
        (u'Mundo', u'http://www.nortecastilla.es/rss/feeds/mundo.xml'),
        (u'Economia', u'http://www.nortecastilla.es/rss/feeds/economia.xml'),
        (u'Deportes', u'http://www.nortecastilla.es/rss/feeds/deportes.xml'),
        (u'Vida y ocio', u'http://www.nortecastilla.es/rss/feeds/ocio.xml'),
        (u'Cultura', u'http://www.nortecastilla.es/rss/feeds/cultura.xml'),
        (u'Television',
         u'http://www.nortecastilla.es/rss/feeds/television.xml'),
        (u'Contraportada',
         u'http://www.nortecastilla.es/rss/feeds/contraportada.xml')
    ]

    extra_css = '''
                    .articulo{clear:both; padding:0 2px 0 6px}
                    .art_head{clear:both;}
                    .articulo .overhead{ color:#C00; font-size:10px; text-transform:uppercase;}
                    .articulo .headline{ color:#036; font-size:36px; font-weight:normal;}
                    .articulo .headline a,.articulo .headline a:hover{ color:#036; cursor:default; text-decoration:none;}
                    .articulo .subhead{ color:#686868; font-size:16px; font-weight:normal; margin:0 0 5px 0}
                    .articulo .byline a{ color:#8E8E8E;}
                    .articulo .barhead{ font-size:14px;font-weight:normal; padding:0 0 15px 0}
                    .articulo .text{ font-size:14px;font-weight:normal;}
                    .articulo .text .p{ line-height:18px; padding:0 0 15px 0}
                    .articulo .text .p a{ text-decoration:underline; color:#036}
                    .articulo .text .p a:hover{ text-decoration:none; color:#cc0000}
                    .articulo .pbox{text-align:left; margin:0 auto 0 10px; text-align:left;}
                    .articulo .photo-alt1,.colC_articulo .photo{text-align:center; margin:0 auto; background-color:#F2F2F2;}
                    .articulo .photo-alt1 img,.colC_articulo .photo img{text-align:center; margin:0 auto;}
                    .articulo .photo-caption a{ color:#666;}
                    .fotogaleriasH .photo {background-color:#DCDCDC;margin:0 auto;padding:5px 0 0;text-align:center;}
                    .fotogaleriasH .photo img {display: block; margin:0 auto;text-align:center;}
                '''
PK�X'���tt
nos_nl.png�PNG


IHDR  D���NPLTE�$$�  �� ������������������������tRNS	-IJL�����������������IDATxڅ��1�
���>�=��F��i��s��J�Y1c���/�\�F�.�d��]^�K8����n�E�X����[=q�k�EӮ�,�Q�{0�c�[�P�o�ԾǡP�3 1�Sa��$��DŽ��Zd:W=cs���Uo8]�@�p�'�@����ǤE��=}n�a�c��~{8<�x����:��q��IEND�B`�PK�XE���
nos_nl.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe


class nosnl(BasicNewsRecipe):
    title = u'nos.nl'
    __author__ = u'erkfuizfeuadjfjzefzfuzeff'
    description = u'News from the Netherlands in Dutch'
    oldest_article = 7
    language = 'nl'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='div', attrs={'class': 'art_box2'}),
        dict(name='h1'),
        dict(name='img'),
        dict(name='div', attrs={'class': 'article_textwrap'}),
    ]

    remove_tags = [
        dict(name='img', attrs={'class': 'weather-icon__image js-weather-icon'}),
    ]

    feeds = [(u'Algemeen', u'http://feeds.nos.nl/nosnieuwsalgemeen'),
             (u'Binnenland', u'http://feeds.nos.nl/nosnieuwsbinnenland'),
             (u'Buitenland', u'http://feeds.nos.nl/nosnieuwsbuitenland'),
             (u'Politiek', u'http://feeds.nos.nl/nosnieuwspolitiek'),
             (u'Economie', u'http://feeds.nos.nl/nosnieuwseconomie'),
             (u'Opmerkelijk', u'feeds.nos.nl/nosnieuwsopmerkelijk'),
             (u'Koningshuis', u'http://feeds.nos.nl/nosnieuwskoningshuis'),
             (u'Tech', u'http://feeds.nos.nl/nosnieuwstech'),
             (u'Sport', u'http://feeds.nos.nl/nossportalgemeen'),
             (u'Sport voetbal', u'http://feeds.nos.nl/nosvoetbal'),
             (u'Sport wielrennen', u'http://feeds.nos.nl/nossportwielrennen'),
             (u'Sport schaatsen', u'http://feeds.nos.nl/nossportschaatsen'),
             (u'Sport tennis', u'http://feeds.nos.nl/nossporttennis'),
             (u'Nieuwsuur', u'http://feeds.nos.nl/nieuwsuuralgemeen'),
             (u'NOS op 3', u'http://feeds.feedburner.com/nosop3'),
             (u'Jeugdjournaal', u'http://feeds.feedburner.com/jeugdjournaal')]
PK�XL��p��novaya_gazeta.png�PNG


IHDR(-S�PLTE�$���������������������Ϟ#�������ό������#\Uz�.@� /����%�$�����}��k��k��]��\��J��~��=��<���������������������������������Cl�Oa�WY�U[�T[�Q^�5w�iJjnDa]U{�/E[Vw�|�2tRNS@��f�IDATx�b �����0��z�vչ��������X�D��x�x� ��[S��=;��>�1�Ĝܔ�H������)���]��L���h�X}j=w��J�K�n'���.e���!��	�z����!	����'IEND�B`�PK�XvX���novaya_gazeta.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1286819935(BasicNewsRecipe):
    title = u'Novaya Gazeta'
    __author__ = 'muwa'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    conversion_options = {'linearize_tables': True}
    remove_attributes = ['style']
    language = 'ru'

    feeds = [(u'Articles', u'http://www.novayagazeta.ru/rss/all.xml')]

    def print_version(self, url):
        return '%s%s' % (url, '?print=1')
PK�X�b
	
	novaya_gazeta_europe.png�PNG


IHDR@&��
��IDATx^�k�Uy�33{_�w���[��x[�p�i �b@VR�(��CA
	�M�?��	1E1� �R�E-6���T>[�c��|��9_朙�;ٽ���3�y}��9P������*�G0
�}�?\b&)[�i�ɗ����
<?�$�+���q�I���!��L�����e�m*�w~ɟ�C�
�$��R� �Pʭ	y@	�sEC�;�Ǐ,� ����KqI
��i+���H��V���A�$j&���)ޖ�7��B�\�Pfk�r;(��R�*�!�y�zC�!*`1��@
)�YfY2�`q�|_9���W
��2�f��w4�*��UB8���	��d
x�t�\#���Ƅ�PƄ��1i�$�F��ȫ;d|/,//w�=QB/]��j�r�"�b�Nb����I��zB��F- 692
Q��`f�܆8�����/z�oo�l����=}��l)AJT1'k�U�x�(m��Z!�2|�Qy�I)8Wo<����_�c�'&�O����;>���c�I�.=��v���hv��V"��ӛ����\epg&�(�̾JiC��R�z��o�(=�'B|�߻��R ҿ��h��,+�{']��1S� G@B��T��7J8������&/Z�V�.#Q�R�O��z��9��#��X�@�˜�D�e�^�J� ������x�O!@��j�;��a��o�tzD�jS���+��d���q	�#Z�O�:�Fo"�[�/O""D��6��p��n�Ğ��ӬU��:ܧ<�Yw��8�ĵ�xwv��w�߻a�~�`5��QD�$�@6���"Mq��9��y���杖�ݙ����{�J%���Ԧ7����b��_?���V�~�Ƌ�_Џ��H�	�B[6j�"604;3@�z}��Va�>]�η��o�knZ8��1�9��zϾ�[o����M�VEDY
��"�H��G�ɷE�= H��$v��B�/&lE����^�5�J��K�l������*-B"�@~�A�|I,�8�窪 ��M�����ܱ�۔�MDǺ�#�Wl�6;���p�A��ݍbH��h�L.�r �Q���'a*{�O^{ճO�`�6��(JLib|���}a���7�ԃU�."I-��%sSS1�Z_��&�D1)�1
�y��/����a�:]~���ܱ���zi�U<�ġ�=�����`R�udJp���_��W���g�qPI�ai�Y��6y4���_>�jڇ��v{ݻ�ƮO-<�x�c��,2HA�s��s_���*&�p4:����@�.������u�c$��&-�8J��Y>Skjc���C��x����~������RmیJ�j�Ky�h����_�x���x�wN-5[�4�QB��"�q�h�s�.�g� ���YE:���T��޶u��8�e��K�f�Zy�у��^s���&t�˜��"�|�6<m-�Ơ9�S�c9���<\ċ�<u��?z��|�J	|V�@N�X���a)DB����<u��J}��A�cQ1
r$��?^�Q���c.����>}��s�${K�WT����'���#��O���N�Y
Y�l�A�����[R�d��gˈ(O�S� "X�~aL��q�Q�nJ��n��nW*e���f��e��R��U�+�j�@���'{�ի��mA"�c&�ܹ�}��q�)�8֖=�n�X)ԙ__���/�d#'���U�f0v7@�ds6Lb �K��2����!�����W䀂�.5�|�&B�g�o��=�n�3�9�!?Z1�gB[�a��@�/(�8].��_��}S��֕����`�:��;���ί�d�Z�#̦7����\$Fi$E#�a2(�]v��M�$�K�k���_�ӟO�q2U�{��7a�8$�o^bhf1��Fz��
T�of�P@�^�&O�52z�b�h�{�rE)w�p[	#.��WhF�H���y�?>�N@C�׹�4ʖW�j�0�''&N�8�m�.;�H�2_��d�F:��@���l����؜�z�FI��� �-����nW�PR+, �z9�yXD��U^-:4�U'R���d�ɯ@=�p��i W�����{� ��D�:I�\��ʂ�9�~ە�b��r�]��FU��7��?�K����IEND�B`�PK�X��m�MMnovaya_gazeta_europe.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class NovayaGazetaEurope(BasicNewsRecipe):
    title = u'\u041D\u043E\u0432\u0430\u044F \u0413\u0430\u0437\u0435\u0442\u0430. \u0415\u0432\u0440\u043E\u043F\u0430'
    __author__ = 'bugmen00t'
    description = u'\u0413\u043E\u0432\u043E\u0440\u0438\u043C \u043A\u0430\u043A \u0435\u0441\u0442\u044C. \u041F\u0438\u0448\u0435\u043C \u043E \u043F\u0440\u043E\u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0435\u043C \u0432 \u0420\u043E\u0441\u0441\u0438\u0438, \u0423\u043A\u0440\u0430\u0438\u043D\u0435 \u0438 \u0415\u0432\u0440\u043E\u043F\u0435. \u041D\u043E\u0432\u043E\u0441\u0442\u0438, \u0430\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430, \u043C\u043D\u0435\u043D\u0438\u044F \u044D\u043A\u0441\u043F\u0435\u0440\u0442\u043E\u0432, \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u0440\u0435\u043F\u043E\u0440\u0442\u0430\u0436\u0438 \u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u0441\u043A\u0438\u0435 \u0440\u0430\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u044F.'  # noqa
    publisher = '\u041A\u0438\u0440\u0438\u043B\u043B \u041C\u0430\u0440\u0442\u044B\u043D\u043E\u0432'
    publication_type = 'newspaper'
    category = 'news'
    language = 'ru'
    cover_url = 'https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/5dc71e2d-9763-4f05-8f4e-92049fa32af7_513x513.png'
    oldest_article = 15
    max_articles_per_feed = 50
    auto_cleanup = False

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(
        name='div', attrs={'class': 'ArticleBlocks_wrapperNoAside__11_bu'}
    )

    remove_tags = [dict(name='div', attrs={'class': 'EmbedNative_root__2lgsH'})]

    feeds = [(
        u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
        'https://novayagazeta.eu/feed/rss/ru'
    )]

    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
PK�X�b
	
	novaya_gazeta_europe_en.png�PNG


IHDR@&��
��IDATx^�k�Uy�33{_�w���[��x[�p�i �b@VR�(��CA
	�M�?��	1E1� �R�E-6���T>[�c��|��9_朙�;ٽ���3�y}��9P������*�G0
�}�?\b&)[�i�ɗ����
<?�$�+���q�I���!��L�����e�m*�w~ɟ�C�
�$��R� �Pʭ	y@	�sEC�;�Ǐ,� ����KqI
��i+���H��V���A�$j&���)ޖ�7��B�\�Pfk�r;(��R�*�!�y�zC�!*`1��@
)�YfY2�`q�|_9���W
��2�f��w4�*��UB8���	��d
x�t�\#���Ƅ�PƄ��1i�$�F��ȫ;d|/,//w�=QB/]��j�r�"�b�Nb����I��zB��F- 692
Q��`f�܆8�����/z�oo�l����=}��l)AJT1'k�U�x�(m��Z!�2|�Qy�I)8Wo<����_�c�'&�O����;>���c�I�.=��v���hv��V"��ӛ����\epg&�(�̾JiC��R�z��o�(=�'B|�߻��R ҿ��h��,+�{']��1S� G@B��T��7J8������&/Z�V�.#Q�R�O��z��9��#��X�@�˜�D�e�^�J� ������x�O!@��j�;��a��o�tzD�jS���+��d���q	�#Z�O�:�Fo"�[�/O""D��6��p��n�Ğ��ӬU��:ܧ<�Yw��8�ĵ�xwv��w�߻a�~�`5��QD�$�@6���"Mq��9��y���杖�ݙ����{�J%���Ԧ7����b��_?���V�~�Ƌ�_Џ��H�	�B[6j�"604;3@�z}��Va�>]�η��o�knZ8��1�9��zϾ�[o����M�VEDY
��"�H��G�ɷE�= H��$v��B�/&lE����^�5�J��K�l������*-B"�@~�A�|I,�8�窪 ��M�����ܱ�۔�MDǺ�#�Wl�6;���p�A��ݍbH��h�L.�r �Q���'a*{�O^{ճO�`�6��(JLib|���}a���7�ԃU�."I-��%sSS1�Z_��&�D1)�1
�y��/����a�:]~���ܱ���zi�U<�ġ�=�����`R�udJp���_��W���g�qPI�ai�Y��6y4���_>�jڇ��v{ݻ�ƮO-<�x�c��,2HA�s��s_���*&�p4:����@�.������u�c$��&-�8J��Y>Skjc���C��x����~������RmیJ�j�Ky�h����_�x���x�wN-5[�4�QB��"�q�h�s�.�g� ���YE:���T��޶u��8�e��K�f�Zy�у��^s���&t�˜��"�|�6<m-�Ơ9�S�c9���<\ċ�<u��?z��|�J	|V�@N�X���a)DB����<u��J}��A�cQ1
r$��?^�Q���c.����>}��s�${K�WT����'���#��O���N�Y
Y�l�A�����[R�d��gˈ(O�S� "X�~aL��q�Q�nJ��n��nW*e���f��e��R��U�+�j�@���'{�ի��mA"�c&�ܹ�}��q�)�8֖=�n�X)ԙ__���/�d#'���U�f0v7@�ds6Lb �K��2����!�����W䀂�.5�|�&B�g�o��=�n�3�9�!?Z1�gB[�a��@�/(�8].��_��}S��֕����`�:��;���ί�d�Z�#̦7����\$Fi$E#�a2(�]v��M�$�K�k���_�ӟO�q2U�{��7a�8$�o^bhf1��Fz��
T�of�P@�^�&O�52z�b�h�{�rE)w�p[	#.��WhF�H���y�?>�N@C�׹�4ʖW�j�0�''&N�8�m�.;�H�2_��d�F:��@���l����؜�z�FI��� �-����nW�PR+, �z9�yXD��U^-:4�U'R���d�ɯ@=�p��i W�����{� ��D�:I�\��ʂ�9�~ە�b��r�]��FU��7��?�K����IEND�B`�PK�X�9��novaya_gazeta_europe_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class NovayaGazetaEurope(BasicNewsRecipe):
    title = u'Novaya Gazeta Europe'
    __author__ = 'bugmen00t'
    description = u'English edition of Novaya Gazeta Europe: news, analytics, expert opinions, special reports and investigative journalism.'
    publisher = 'Kirill Martynov'
    category = 'news'
    language = 'en_RU'
    cover_url = 'https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/5dc71e2d-9763-4f05-8f4e-92049fa32af7_513x513.png'
    oldest_article = 15
    max_articles_per_feed = 50
    auto_cleanup = False

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(
        name='div', attrs={'class': 'ArticleBlocks_wrapperNoAside__11_bu'}
    )

    remove_tags = [dict(name='div', attrs={'class': 'EmbedNative_root__2lgsH'})]

    feeds = [(u'News', 'https://novayagazeta.eu/feed/rss/en')]

    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
PK�Xr�	VVnovaya_media.png�PNG


IHDR  D���zPLTE�������������m���f�q���d���p�������^���d�`���d}a�`|^|��������������XsYq����������������
��u���Od��Nc��������K^K]J]H[����������;I<J;H:G����9G������/808090:-4-5(.!"&����]xQh=L (.������	��~�
u�
v�l�m�h�k�e�_za|��ZsRiTkPdPe��M`NcFWHZH[CT��5@3=0:*1+2,3,4 %* &+����!&+���OtRNS	
"%&...013?RTVWXY����������������������������������������������k��<IDATx�m��cA�[k�6bg}*\۶�>WA���o�0�y�\��-�;�#����̴��
�鉢{<���{P߀��e�Y��������b�l'`�#F�I��%���$�pL�>�r����'-�v�b�����pD�i����`L�e��E�SUGE=��:��5KZ����xB�mmɻ�4pXi�3�A�%�Ň���=��t�E�)F�~�2NG��-W�b���fXv�ѐ�؂���3Y�‘�*�xm<��̛[0�<)���v5E�9�*�!�y(��gK�N��ma̬�:�&���2IEND�B`�PK�X�e��
�
novaya_media.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class NovayaGazeta(BasicNewsRecipe):
    title = '\u0421\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E'
    __author__ = 'bugmen00t'
    description = '\u041E\u0442\u043A\u0440\u044B\u0442\u044B\u0439 \u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430, \u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u043E\u0439 \u0440\u0435\u0434\u0430\u043A\u0446\u0438\u0435\u0439 \u00AB\u041D\u043E\u0432\u043E\u0439 \u0433\u0430\u0437\u0435\u0442\u044B\u00BB, \u0434\u0435\u0442\u0430\u043B\u0438 \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u043A\u0430\u0436\u0434\u044B\u0439 \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043B\u0435\u0439 \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u043B\u044F \u0441\u0435\u0431\u044F \u0441\u0430\u043C. \u041A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440 \u2014 \u044D\u0442\u043E \u043D\u043E\u0432\u044B\u0439 \u0441\u043F\u043E\u0441\u043E\u0431 \u0447\u0438\u0442\u0430\u0442\u044C \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u043E\u0432 \u00AB\u041D\u043E\u0432\u043E\u0439 \u0433\u0430\u0437\u0435\u0442\u044B\u00BB \u0438 \u0432\u0441\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u044B\u0435 \u043F\u043E\u0442\u043E\u043A\u0438 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430: \u043B\u044E\u0431\u044B\u0435 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u044B, Telegram-\u043A\u0430\u043D\u0430\u043B\u044B, Youtube-\u043A\u0430\u043D\u0430\u043B\u044B.'  # noqa
    publisher = '\u0420\u0435\u0434\u0430\u043A\u0446\u0438\u043E\u043D\u043D\u044B\u0439 \u043A\u043E\u043B\u043B\u0435\u043A\u0442\u0438\u0432 \u00AB\u041D\u043E\u0432\u043E\u0439 \u0433\u0430\u0437\u0435\u0442\u044B\u00BB'  # noqa
    category = 'newspaper'
    cover_url = u'https://novaya.media/ic_puzzle_footer.svg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='h1', attrs={'class': 'Header_title__2zxwH'})

    remove_tags_after = dict(
        name='div', attrs={'class': 'Post_contentInnerWrapper__3GWHl'}
    )

    feeds = [(
        '\u0421\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E',
        'https://novaya.media/feed/rss'
    )]

    def print_version(self, url):
        return url + '?print=true'
PK�Xƽ:%��novilist_novine_hr.png�PNG


IHDR(-S0PLTE������������������p��X��P��P��@�������؛I��uIDATx�
�@��qC��I#���;@'’�X=��;�kʛN�9S25�v��1�ʁ�BPT�w6'���\Ū�W��,bXj-�
 �?����q�W�g6��L���?Z�#��PVIEND�B`�PK�X��a�novilist_novine_hr.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
novine.novilist.hr
'''

import re
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class NoviList_hr(BasicNewsRecipe):
    title = 'Novi List'
    __author__ = 'Darko Miletic'
    description = 'Vijesti iz Hrvatske'
    publisher = 'NOVI LIST d.d.'
    category = 'Novi list, politika, hrvatski dnevnik, Novine, Hrvatska, Croatia, News, newspaper, Hrvatski,Primorje, dnevni list, Rijeka'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1250'
    use_embedded_content = False
    language = 'hr'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    needs_subscription = True
    masthead_url = 'http://novine.novilist.hr/images/system/novilist-logo.jpg'
    index = 'http://novine.novilist.hr/'
    extra_css             = """
                               @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                               body{font-family: Geneva,Arial,Helvetica,Swiss,sans1,sans-serif }
                               img{display:block; margin-bottom: 0.4em; margin-top: 0.4em}
                               .nadnaslov,.podnaslov{font-size: small; display: block; margin-bottom: 1em}
                               .naslov{font-size: x-large; color: maroon; font-weight: bold; display: block; margin-bottom: 1em;}
                               p{display: block}
                            """

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    keep_only_tags = [
        dict(name='td', attrs={'class': ['nadnaslov', 'naslov', 'podnaslov']}),
        dict(name='font', attrs={'face': 'Geneva,Arial,Helvetica,Swiss'})
    ]

    remove_tags = [dict(name=['meta', 'link', 'iframe', 'embed', 'object'])]
    remove_attributes = ['border', 'lang', 'size', 'face', 'bgcolor']

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open(self.index + 'loginnow.asp')
            br.select_form(nr=0)
            br['username'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def parse_index(self):
        articles = []
        count = 0
        soup = self.index_to_soup(self.index)
        # cover url
        for alink in soup.findAll('a'):
            if alink['href'].startswith('images/clanci/DOC_'):
                self.cover_url = self.index + alink['href']
        # feeds
        for item in soup.findAll('td', attrs={'class': 'tocrubrika'}):
            count = count + 1
            if self.test and count > 2:
                return articles
            aitem = item.a
            section = self.tag_to_string(aitem)
            feedlink = self.index + aitem['href']
            feedpage = self.index_to_soup(feedlink)
            self.report_progress(0, _('Fetching feed') + ' %s...' % (section))
            inarts = []
            for alink in feedpage.findAll('a', attrs={'class': 'naslovlinkdesno'}):
                url = self.index + alink['href']
                inarts.append({
                    'title': self.tag_to_string(alink), 'date': strftime(self.timefmt), 'url': url, 'description': ''
                })
            if self.remove_empty_feeds:
                if inarts:
                    articles.append((section, inarts))
            else:
                articles.append((section, inarts))
        return articles

    def print_version(self, url):
        return url.replace('?WCI=Rubrike&', '?WCI=Pretrazivac&')
PK�Xu�D��novilist_portal_hr.png�PNG


IHDR���RPLTE������������h�_IDATx�A
1EL��H��}�����J����uO9��0s&c�#?77ʹ��a�EF��O x�ƙZA�t=��L=�(l��˕&��q��+����0-IEND�B`�PK�X(p!	!	novilist_portal_hr.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.novilist.hr
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class NoviList_Portal_hr(BasicNewsRecipe):
    title = 'Novi List - online portal'
    __author__ = 'Darko Miletic'
    description = 'Portal Novog Lista'
    publisher = 'NOVI LIST d.d.'
    category = 'Novi list, politika, hrvatski dnevnik, Novine, Hrvatska, Croatia, News, newspaper, Hrvatski,Primorje, dnevni list, Rijeka'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'hr'
    publication_type = 'newsportal'
    masthead_url = 'http://www.novilist.hr/extension/novilist/design/novilist/images/logo-print.gif'
    extra_css             = """
                               @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                               @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                               body{font-family: Geneva,Arial,Helvetica,Swiss,sans1,sans-serif }
                               h1{font-family: Georgia,serif1,serif}
                               img{display:block; margin-bottom: 0.4em; margin-top: 0.4em}
                            """

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    keep_only_tags = [dict(name='div', attrs={'id': 'content'})]

    remove_tags = [
        dict(name=['meta', 'link', 'iframe', 'embed', 'object']),
        dict(name='div', attrs={
             'class': lambda x: x and 'embed-object' in x.split()})
    ]
    remove_attributes = ['border', 'lang']

    feeds = [(u'Vijesti', u'http://www.novilist.hr/rss/feed/sve.xml')]

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        filter = ['/Foto/', '/Informator/']
        for item in filter:
            if item in url:
                return None
        return url

    def print_version(self, url):
        return url.replace('http://www.novilist.hr/', 'http://www.novilist.hr/layout/set/print/')
PK�X�5��VVnovinite.png�PNG


IHDR(-S~PLTE7w������������9u7u8u���8w9v@j�������8x:v8x���6w���8s���D}���D~;w������6x9y������9s9x������!P�7yo��8t������k��S�IDATW]�5bD1D�~=#�󢙽�_БWR���!�� A���Ƴ�i��Վ���<��xW��e���'��I�}�����ũ?��vL�G�d7��Ez�!�<���]�2�4ᾠ�V��d�u#��RJ��@���p���/����?5=��L<IEND�B`�PK�X��R�	�	novinite.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1308572538(BasicNewsRecipe):
    title = u'Novinite.com'
    __author__ = 'Martin Tsanchev'
    description = 'Real time provider of the latest Bulgarian news in English'
    category = 'Business, Politics, Society, Sports, Crime, Lifestyle, World, People'
    language = 'en_BG'
    encoding = 'utf-8'
    oldest_article = 7
    max_articles_per_feed = 10
    keep_only_tags = [dict(name='div', attrs={'id': 'content'})]
    remove_tags = [dict(name='a', attrs={'class': 'twitter-share-button'})]
    remove_tags_after = dict(id='textsize')
    no_stylesheets = True
    feeds = [(u'Business', u'http://www.novinite.com/services/news_rdf.php?category_id=1'),
             (u'Finance', u'http://www.novinite.com/services/news_rdf.php?category_id=15'),
             (u'Energy', u'http://www.novinite.com/services/news_rdf.php?category_id=16'),
             (u'Industry', u'http://www.novinite.com/services/news_rdf.php?category_id=17'),
             (u'Properties', u'http://www.novinite.com/services/news_rdf.php?category_id=18'),
             (u'Politics', u'http://www.novinite.com/services/news_rdf.php?category_id=2'),
             (u'Diplomacy', u'http://www.novinite.com/services/news_rdf.php?category_id=20'),
             (u'Defense', u'http://www.novinite.com/services/news_rdf.php?category_id=21'),
             (u'Bulgaria in EU',
              u'http://www.novinite.com/services/news_rdf.php?category_id=22'),
             (u'Domestic', u'http://www.novinite.com/services/news_rdf.php?category_id=23'),
             (u'Society', u'http://www.novinite.com/services/news_rdf.php?category_id=3'),
             (u'Environment', u'http://www.novinite.com/services/news_rdf.php?category_id=24'),
             (u'Education', u'http://www.novinite.com/services/news_rdf.php?category_id=25'),
             (u'Culture', u'http://www.novinite.com/services/news_rdf.php?category_id=26'),
             (u'Archaeology', u'http://www.novinite.com/services/news_rdf.php?category_id=34'),
             (u'Health', u'http://www.novinite.com/services/news_rdf.php?category_id=62'),
             (u'Sports', u'http://www.novinite.com/services/news_rdf.php?category_id=4'),
             (u'Crime', u'http://www.novinite.com/services/news_rdf.php?category_id=5'),
             (u'Lifestyle', u'http://www.novinite.com/services/news_rdf.php?category_id=6'),
             (u'World', u'http://www.novinite.com/services/news_rdf.php?category_id=30')]
PK�XL�A��novinite_bg.png�PNG


IHDR  D���PLTE��
������"�!%�CF�FJՕ������*-�,/�.1�15�57�69�:=�>A�
��NR�RU�TW�WY�X[�fi�hj�moχ�� #⵶����������������������������&)�����ڷJMҍ��^a���_a�bd�dg�8;��˩(+�<?�oq�qs����tv�xz�|~�~�́��ъ��@C�BE֗����؝�ڡ�ۥ�ܧ�ޫ�ޮ��ⷸ㸺亻仼�DG�����ǫ-0�HK�����Ѩ#'�����ظKN��ܭ03�PS���$'�������VY�',�7:�Z]����������\_���߯��NQ�LOݩ��xz�������jl������Ჴ᳴����qt�tv���ܦ��{}伽���������QT�}�bc���������_a͂�������΅���ѯ8;���ϙ����Ј���������Ҏ�ґ�ү����Ԓ��HK��̫KO���ך������ٞ��jl��ϩ>@ל��bd�IL����wy��Ā��IDATxڄӃ��H��qj�v{m۶mkm۶����O}���\!��h(��M5/|s”�֟&�n
��/Ȣ\�z$Z��Δ���yj��%X�{���q\����潗 ��m(J9���-�F�^�`wxp)m�����n'/ܼ͎>��bL���^�@n��/
n3M�ɇ4�Er�Ȅ�*�`����,+5Zko���d���p��U��U�,��w���h�s�GM�N�t�q�*������(\�+˘�r�M��������
�JB�`\-��(i*�R��i��T"�n����Y1�<���n/zfu��ZK@m���ceu�����D��8i-��d{��A�N�Ó������ђ-(���x�j�.l0:	� �)ɪ��b��ZX�r��"e# �P
�2�
��	I��VJh,��~1=dШ�5E�ҪĚ�]gz��\���O��rŐ)��O4�0�"|��'}KI��W:Q'����x��QĹ�Z�X�mwg \�G�P\�ٌ^	^�Y�z$����/^}/�2APn�����>��QOB���0\i�������|�L&�B����֮��������׸�pAaO�⩕�1�\@-��������[X���Q�
��~ިa	IEND�B`�PK�XN�eenovinite_bg.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1329123365(BasicNewsRecipe):
    title = u'Novinite.bg'
    __author__ = 'M3 Web'
    description = 'Real time provider of the latest news from Bulgaria and the world'
    category = 'Business, Politics, Society, Sports, Crime, Lifestyle, World, Health'
    oldest_article = 7
    max_articles_per_feed = 6
    language = 'bg'
    encoding = 'windows-1251'
    no_stylesheets = True
    remove_javascript = True
    keep_only_tags = [dict(name='div', attrs={'id': 'content'})]
    remove_tags = [dict(name='div', attrs={'id': 'text_options'})]
    remove_tags = [dict(name='div', attrs={'id': 'social_shares_top'})]
    remove_tags_after = dict(id='textsize')
    feeds = [(u'Business', u'http://novinite.bg/rss.php?category_id=1'),
             (u'Politics', u'http://novinite.bg/rss.php?category_id=2'),
             (u'Society', u'http://novinite.bg/rss.php?category_id=3'),
             (u'Sport', u'http://novinite.bg/rss.php?category_id=4'),
             (u'Crime', u'http://novinite.bg/rss.php?category_id=5'),
             (u'Lifestyle', u'http://novinite.bg/rss.php?category_id=6'),
             (u'Health', u'http://novinite.bg/rss.php?category_id=7'),
             (u'Other', u'http://novinite.bg/rss.php?category_id=10'),
             (u'World', u'http://novinite.bg/rss.php?category_id=9')]
PK�X�b��novinky.cz.png�PNG


IHDR  szz��IDATxڽ�t�Kŧn\�*�F�UP�ٶm۶׶m;����[��7�3�~�����{ί���a�1�3DP"1Q?i�+�S2�+�5��SvAU��՝r�	�wrV�){t~Rֽ��&�;�.�a��L��z9#����-N�_��}	�K�IY�f�!�+�-�`�E�e�R�*?)�����K���U�QO��ɇӶ�Q:K���̪��,�I��o�v!�4�/�.���9��'J3!��3M�Y�������	��O���3}�Ѝ}�D���J�6���2�#q�2���Y$ӓM�C���9ߘ�vʅӋ���8�4r��Ygp|�+��<�[�ւo��N�M���?�]�v�ce��$�$봮��ti���@���@t~{9
�4��$=#�۬u�oѦB ����Z:�y�1�Y�+�>�Y�!��W l�w����~�-��8�h=��V
�����M��_�]A(?�V���7�] ��������@H�����W	��R9Ƣ5JG�z���t s��_��c��BY4�;��};N�w�Ҟ��*'�) [�̵L�ݟ��bw�;?�/VR#苳��5	�&�鬻�3׼����+v��ҡ���Z�^ gB4�Uq�&�(���/~�v~2�g��) jomA�x{#Z;��X;� s�|����~�#@%�,�~-�Z�<f��.@����|<�g��/ �X14͓�T1�l/�����>���+<��Y^,
Bp:����9�@�Gý����ce@y"�a�tȥE�!��˞�8���L���$�d#�������K��T���~�>�@ �i���A��E]l�$��1�u�<���g^bʽ|�,���5�������Y/G�$و�H�$��2W4�&��H2�rL|/g�m-�m��dZ�5�H&�F2LFuo����(롙Q6�fDY�<�ԗd�L���m�z+�k��H���V&�"-���J��i��ĴI,F�Qߊ4=&F�:-��{�ߍ��7͈��b��
q\��Hd�#�﷓�-���[�߀�6�#�b��h��+ �S"�>��4�oܤ���&�
����w&>��l4XE=���	�$�9}�x��)��	���оƆ�/�:���r����7�+�Cv�`�ÄK��%z�2�.IEND�B`�PK�X(ey�RRnovinky.cz.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class novinkyRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'novinky.cz'
    publisher = u'seznam.cz'
    description = 'novinky.cz'
    oldest_article = 1
    max_articles_per_feed = 20

    feeds = [
        (u'Domácí', u'http://www.novinky.cz/rss2/domaci/'),
        (u'Praha', u'http://www.novinky.cz/rss2/vase-zpravy/praha/'),
        (u'Ekonomika', u'http://www.novinky.cz/rss2/ekonomika/'),
        (u'Finance', u'http://www.novinky.cz/rss2/finance/'),
    ]

    language = 'cs'
    cover_url = 'http://www.novinky.cz/static/images/logo.gif'
    remove_javascript = True
    no_stylesheets = True

    remove_tags = [dict(name='div',   attrs={'id': ['pictureInnerBox']}),
                   dict(name='div',   attrs={'id': ['discussionEntry']}),
                   dict(name='span',   attrs={
                        'id': ['mynews-hits', 'mynews-author']}),
                   dict(name='div',   attrs={'class': ['related']}),
                   dict(name='div',   attrs={'id': ['multimediaInfo']})]
    remove_tags_before = dict(name='div', attrs={'class': ['articleHeader']})
    remove_tags_after = dict(name='div', attrs={'class': 'related'})

    keep_only_tags = []

    # This source has identical articles under different links
    # which are redirected to the common url. I've found
    # just this API method that has the real URL
    visited_urls = {}

    def encoding(self, source):
        url = source.newurl
        if url in self.visited_urls:
            self.log.debug('Ignoring duplicate: ' + url)
            return None
        else:
            self.visited_urls[url] = True
            self.log.debug('Accepting: ' + url)
            return source.decode('utf-8', 'replace')
PK�X�b��novinky.png�PNG


IHDR  szz��IDATxڽ�t�Kŧn\�*�F�UP�ٶm۶׶m;����[��7�3�~�����{ί���a�1�3DP"1Q?i�+�S2�+�5��SvAU��՝r�	�wrV�){t~Rֽ��&�;�.�a��L��z9#����-N�_��}	�K�IY�f�!�+�-�`�E�e�R�*?)�����K���U�QO��ɇӶ�Q:K���̪��,�I��o�v!�4�/�.���9��'J3!��3M�Y�������	��O���3}�Ѝ}�D���J�6���2�#q�2���Y$ӓM�C���9ߘ�vʅӋ���8�4r��Ygp|�+��<�[�ւo��N�M���?�]�v�ce��$�$봮��ti���@���@t~{9
�4��$=#�۬u�oѦB ����Z:�y�1�Y�+�>�Y�!��W l�w����~�-��8�h=��V
�����M��_�]A(?�V���7�] ��������@H�����W	��R9Ƣ5JG�z���t s��_��c��BY4�;��};N�w�Ҟ��*'�) [�̵L�ݟ��bw�;?�/VR#苳��5	�&�鬻�3׼����+v��ҡ���Z�^ gB4�Uq�&�(���/~�v~2�g��) jomA�x{#Z;��X;� s�|����~�#@%�,�~-�Z�<f��.@����|<�g��/ �X14͓�T1�l/�����>���+<��Y^,
Bp:����9�@�Gý����ce@y"�a�tȥE�!��˞�8���L���$�d#�������K��T���~�>�@ �i���A��E]l�$��1�u�<���g^bʽ|�,���5�������Y/G�$و�H�$��2W4�&��H2�rL|/g�m-�m��dZ�5�H&�F2LFuo����(롙Q6�fDY�<�ԗd�L���m�z+�k��H���V&�"-���J��i��ĴI,F�Qߊ4=&F�:-��{�ߍ��7͈��b��
q\��Hd�#�﷓�-���[�߀�6�#�b��h��+ �S"�>��4�oܤ���&�
����w&>��l4XE=���	�$�9}�x��)��	���оƆ�/�:���r����7�+�Cv�`�ÄK��%z�2�.IEND�B`�PK�X����ddnovinky.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Tomas Latal<latal.tomas at gmail.com>'

from calibre.web.feeds.news import BasicNewsRecipe


class NovinkyCZ(BasicNewsRecipe):
    title = 'Novinky'
    __author__ = 'Tomas Latal'
    __version__ = '1.1'
    __date__ = '30 April 2011'
    description = 'News from server Novinky.cz'
    oldest_article = 1
    max_articles_per_feed = 10
    encoding = 'utf8'
    publisher = 'Novinky'
    category = 'news, CZ'
    language = 'cs'
    publication_type = 'newsportal'
    no_stylesheets = True
    remove_javascript = True
    cover_url = 'http://img193.imageshack.us/img193/3039/novinkycover.jpg'
    extra_css = 'p.acmDescription{font-style:italic;} p.acmAuthor{font-size:0.8em; color:#707070}'

    feeds = [
        (u'Dom\xe1c\xed', u'http://www.novinky.cz/rss/domaci/'),
        (u'Zahrani\u010d\xed',
         u'http://www.novinky.cz/rss/zahranicni/'),
        (u'Krimi', u'http://www.novinky.cz/rss/krimi/'),
        (u'Ekonomika', u'http://www.novinky.cz/rss/ekonomika/'),
        (u'Finance', u'http://www.novinky.cz/rss/finance/'),
        (u'Kultura', u'http://www.novinky.cz/rss/kultura/'),
        (u'Koktejl', u'http://www.novinky.cz/rss/koktejl/'),
        (u'Internet a PC', u'http://www.novinky.cz/rss/internet-a-pc/'),
        (u'Auto-moto', u'http://www.novinky.cz/rss/auto/'),
    ]

    remove_tags_before = dict(id='articleContent')

    remove_tags_after = [dict(id='movedArticleAuthors')]

    remove_tags = [
        dict(name='div', attrs={
             'id': ['articleColumnInfo', 'pictureInnerBox']}),
        dict(name='p', attrs={'id': ['articleDate']})
    ]
PK�XZ��ssnovosti.png�PNG


IHDR%=m"PLTE���"tRNS@��fIDATx�c� $S�@��Y���W-2
�IEND�B`�PK�Xd�xnovosti.recipe
__license__ = 'GPL v3'
__copyright__ = '2008-2011, Darko Miletic <darko.miletic at gmail.com>'
'''
novosti.rs
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Novosti(BasicNewsRecipe):
    title = 'Vecernje Novosti'
    __author__ = 'Darko Miletic'
    description = 'U početku su bile istinske večernje novine - pokrenute u vreme Tršćanske krize, Italijansko-jugoslovenskog konflikta oko grada Trsta - ali su brzo izrasle u dnevni informativno-politički list, koji već godinama ima najveći tiraž u Srbiji.'  # noqa
    publisher = 'Kompanija Novosti'
    category = 'news, politics, Serbia'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'sr'
    publication_type = 'newspaper'
    masthead_url = 'http://www.novosti.rs/images/basic/logo-print.png'
    extra_css             = """ @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                                .article_description,body{font-family: Arial,Helvetica,sans1,sans-serif}
                                .author{font-size: small}
                                .articleLead{font-size: large; font-weight: bold}
                                img{display: block; margin-bottom: 1em; margin-top: 1em}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [dict(attrs={'class': [
                           'articleTitle', 'articleInfo', 'articleLead', 'singlePhoto fl', 'articleBody']})]
    remove_tags = [
        dict(name=['embed', 'object', 'iframe', 'base', 'link', 'meta']), dict(
            name='a', attrs={'class': 'loadComments topCommentsLink'})
    ]
    remove_attributes = ['lang', 'xmlns:fb']

    feeds = [

    (u'Politika', u'http://www.novosti.rs/rss/2-Sve%20vesti'),
    (u'Drustvo', u'http://www.novosti.rs/rss/1-Sve%20vesti'),
    (u'Ekonomija', u'http://www.novosti.rs/rss/3-Sve%20vesti'),
    (u'Hronika', u'http://www.novosti.rs/rss/4-Sve%20vesti'),
    (u'Dosije', u'http://www.novosti.rs/rss/5-Sve%20vesti'),
    (u'Reportaze', u'http://www.novosti.rs/rss/6-Sve%20vesti'),
    (u'Tehnologije', u'http://www.novosti.rs/rss/35-Sve%20vesti'),
    (u'Zanimljivosti', u'http://www.novosti.rs/rss/26-Sve%20vesti'),
    (u'Auto', u'http://www.novosti.rs/rss/50-Sve%20vesti'),
    (u'Sport', u'http://www.novosti.rs/rss/11|47|12|14|13-Sve%20vesti'),
    (u'Svet', u'http://www.novosti.rs/rss/7-Sve%20vesti'),
    (u'Region', u'http://www.novosti.rs/rss/8-Sve%20vesti'),
    (u'Dijaspora', u'http://www.novosti.rs/rss/9-Sve%20vesti'),
    (u'Spektakl', u'http://www.novosti.rs/rss/10-Sve%20vesti'),
    (u'Kultura', u'http://www.novosti.rs/rss/31-Sve%20vesti'),
    (u'Srbija', u'http://www.novosti.rs/rss/15-Sve%20vesti'),
    (u'Beograd', u'http://www.novosti.rs/rss/16-Sve%20vesti'),
    (u'Zivot+', u'http://www.novosti.rs/rss/24|33|34|25|20|18|32|19-Sve%20vesti'),
    (u'Turizam', u'http://www.novosti.rs/rss/36-Sve%20vesti')
    ]

    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 = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�X3�*��nowiny_rybnik.png�PNG


IHDR(-S�PLTE�=�5����3�9�4�e4�e5�i:��������;�A�/����2����A�B�B�C�E
�K�S$�X&�b/�<�<�f6�g7�f5�=�j;�h=�[�b�t�ȶ�˺����:������7�/������������.�-�������������������@B�tRNS@��f�IDATx�e�A�`��m۾���A=L�Oy�\�x~\T�j�b�/���fJ0�"�B�wQ ���X"^�
Z��W�Q k
��Հ?!�r!��Ё�/�������5��L��ͩW�ƶ�.�h�ʻNNs�?���\�v$SIEND�B`�PK�X�}�00nowiny_rybnik.recipe#!/usr/bin/env python

__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe


class NowinyRybnik(BasicNewsRecipe):
    title = u'Nowiny - Rybnik'
    __author__ = 'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'
    description = u'Tygodnik Regionalny NOWINY. Ogłoszenia drobne, wiadomości i wydarzenia z regionu Rybnika i okolic'
    oldest_article = 7
    masthead_url = 'http://www.nowiny.rybnik.pl/logo/logo.jpg'
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    remove_javascript = True
    no_stylesheets = True

    keep_only_tags = [(dict(name='div', attrs={'id': 'drukuj'}))]

    remove_tags = []
    remove_tags.append(dict(name='div', attrs={'id': 'footer'}))

    feeds = [(u'Wszystkie artykuły',
              u'http://www.nowiny.rybnik.pl/rss,artykuly,dzial,0,miasto,0,ile,25.xml')]

    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
PK�XbZ�bbnowy_obywatel.png�PNG


IHDR�a)IDATx�m�3�^q@��a�f?�v;�b�v�8uRgm�k۸{��v������<C���'�������R���"�tl��vEu��:� h?�����`4Fa%��}�B�v���S�D+
�ĻP�2]{5/��E�@�Q�� f*�HBQd�!�h�d���V vE2�A0�̀�(k�bWVTc�\C�� tw�P
Ef�C�]H��s�"�|�T4Zh�N�g6��V̋�H�!o���\<s/�����@�b��tG�aZ6�3�81��?v�=��>b?A��p	߈�巑IEND�B`�PK�X?(
�EEnowy_obywatel.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'Łukasz Grąbczewski 2013'
__version__ = '1.0'

'''
nowyobywatel.pl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class nowyobywatel(BasicNewsRecipe):
    __author__ = u'Łukasz Grączewski'
    title = u'Nowy Obywatel'
    description = u'Pismo na rzecz sprawiedliwości społecznej'
    language = 'pl'
    publisher = 'Stowarzyszenie „Obywatele Obywatelom”'
    publication_type = 'magazine'
    masthead_url = 'http://lewicowo.pl/wp-content/uploads/2011/11/nowy-obywatel1.png'
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = True
    remove_empty_feeds = True

    oldest_article = 32  # monthly +1
    max_articles_per_feed = 100
    simultaneous_downloads = 20

    feeds = [
        (u'Aktualności', u'http://nowyobywatel.pl/category/aktualnosci/feed/'),
        (u'Opinie', u'http://nowyobywatel.pl/category/opinie/feed/'),
        (u'Nasze rozmowy',
         u'http://nowyobywatel.pl/category/nasze-rozmowy/feed/'),
        (u'Inspiracje', u'http://nowyobywatel.pl/category/inspiracje/feed/')
    ]

    remove_tags = []
    remove_tags.append(dict(attrs={'class': 'post-date'}))
    remove_tags.append(dict(attrs={'class': 'printfriendly'}))
    remove_tags.append(dict(attrs={'class': 'social4i'}))
PK�X�C�ttnpr.png�PNG


IHDR�a;IDATx�c,`�"t̀�ǂ�2P�b ��b� �1�ka 0a�7��@C2�:�s�IEND�B`�PK�X�!K���
npr.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1257302745(BasicNewsRecipe):
    title = u'National Public Radio'
    oldest_article = 7
    language = 'en'
    __author__ = 'onyxrev'
    max_articles_per_feed = 100
    no_stylesheets = True

    remove_tags_before = {'class': 'storytitle'}
    remove_tags_after = dict(name='div', attrs={'id': 'storytext'})
    remove_tags = [
        dict(name='body', attrs={'id': 'blog'}),
        dict(name='div', attrs={'class': 'enlarge_measure'}),
        dict(name='div', attrs={'class': 'enlarge_html'}),
        dict(name='div', attrs={'class': 'bucketwrap primary'})
    ]

    feeds = [(u'National Public Radio', u'http://www.npr.org/rss/rss.php?id=1001')]
PK�X�C�ttnpr_music_blogs.png�PNG


IHDR�a;IDATx�c,`�"t̀�ǂ�2P�b ��b� �1�ka 0a�7��@C2�:�s�IEND�B`�PK�Xѯ��npr_music_blogs.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class nprmusic(BasicNewsRecipe):
    title = 'NPR Music Blogs'
    __author__ = 'cix3'
    timefmt = ' [%b %d, %Y]'
    language = 'en'

    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True

    remove_tags = [dict(name='div', attrs={'id': ['logo', 'comments', 'related_objects', 'inset module',
                                                  'footer', 'strip_control', 'header', 'navigation']}), dict(name='hr'), dict(name='img')]

    feeds = [
        ('A Blog Supreme', 'http://www.npr.org/blogs/ablogsupreme/index.xml'),
        ('All Songs Considered', 'http://www.npr.org/blogs/allsongs/index.xml'),
        ('Monitor Mix', 'http://www.npr.org/blogs/monitormix/index.xml')]
PK�X�~�a��nrc-nl-epub.png�PNG


IHDR  D���PLTE�������������������������������������������������������������������������������������������	�������39���������
��%� &�'-�
�=C�?E�@E�GL�JO�JP�LQ�QV�TY�[`�]b�_c�hm�lq�sw�z~�{~�{ꉍ��������������������������������������� Pn��tRNS22<deeuuy��������������q&8#<IDATxڕ���AF���&[_۶����jT����3�h�)�B4�+�V1���B�}�r<�
1%��$h)���-��nVcB�_o�����;���*��b��k�}q�u�$����F�+�ȸh_�w����X|eы��A��26�,gH(��g,�I(J��7	7�A,�`��	K�d�@l6��,qۢ�BC\"��6�[�,�c�Z$�Q.�_��*
7BB�̅k��=�\ʏ���|�����p�=7�0{����Ї!R.��M�i���
vj��!B���>R9ռ�N�\&"5���Zb�l�.IEND�B`�PK�Xk�Ƿ��nrc-nl-epub.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Based on veezh's original recipe and Kovid Goyal's New York Times recipe

__license__ = 'GPL v3'
__copyright__ = '2011, Snaab'

'''
www.nrc.nl
'''
import os
import zipfile
from io import BytesIO

from calibre.web.feeds.news import BasicNewsRecipe
from datetime import date, timedelta


class NRCHandelsblad(BasicNewsRecipe):

    title = u'NRC Handelsblad'
    description = u'De ePaper-versie van NRC'
    language = 'nl'
    needs_subscription = True
    requires_version = (1, 24, 0)

    __author__ = 'Kovid Goyal'

    conversion_options = {
        'no_default_epub_cover': True
    }

    def build_index(self):
        from calibre.web.jsbrowser.browser import Browser, ElementNotFound
        br = Browser()
        br.visit('http://login.nrc.nl/login', timeout=60)
        f = br.select_form('#fm1')
        f['username'] = self.username
        f['password'] = self.password
        br.submit('button[type="submit"]')
        raw = br.html
        if '>Uitloggen<' not in raw:
            raise ValueError('Failed to login, check username and password')
        epubraw = None
        for today in (date.today(), date.today() - timedelta(days=1),):
            url = 'http://digitaleeditie.nrc.nl/digitaleeditie/NH/%s/%d/%s___/downloads.html' % (
                today.strftime('%Y'), today.month - 1, today.strftime('%Y%m%d'))
            self.log('Trying to download epub from:', url)
            br.start_load(url, timeout=60)
            try:
                epubraw = br.download_file(
                    '#CompleteDownloads .download-list .download-button')
                break
            except ElementNotFound:
                self.log('%r not available yet' % url)
                continue

        if epubraw is None:
            raise ValueError('Krant van vandaag nog niet beschikbaar')

        zfile = zipfile.ZipFile(BytesIO(epubraw), 'r')
        zfile.extractall(self.output_dir)
        index = os.path.join(self.output_dir, 'metadata.opf')
        return index
PK�X�j0��
nrc.nl.png�PNG


IHDR00`�	�nPLTE�KQ�LQ�MS�NS�OU�PU�RW�SY�SY�VZ�_d�af�af�ei�ns�os�pu�qu�|��|��|��~�瀄銍ꌏꎑꏓ뗚웞흠흠읠ퟢퟢ�﫭אָ�������������������������������������������������������������������������HM�HM�FK�EK�@F�<B�;@�:@�4;�29�29�.5�+1�)/�)/�'-�#*�"(�!(�&�$�$�"�"���������������
�	�
�	�	���	�	���j�wtRNS�����������������������wurqidcbbba^YUTMJFA<:885310.+)$
	�������������������������������������������ۭ4gIDATx�b�4�|�$�7TSO��DA��m۶۶��չ�`'�s�g՚�w��(V�^%}���^�r4�ƞ�����_�ӯ!��d�7J���s������hƙ;py������8,4�h�p�E�k��Z3��L�.{�E3��ܙR=PQIV�A�tm]��c��M<F�(fm�*p@I��+��^q���Uy]��|賺̜ų�M�E�ˬь�����?��9��˟*E������D��ɵ��*m���k���sFKz�!왊&=W+�{�B�ǟ¡�*j���<�K��?<��
)�܅rx�12u>�%��>��H!���M��ZUx:s{��� Vɡ+�G�IEND�B`�PK�X��Y�BB
nrc.nl.recipe#!/usr/bin/env  python
from calibre.web.feeds.recipes import BasicNewsRecipe
import datetime
import json
from mechanize import Request
from contextlib import closing
import re


class NRC(BasicNewsRecipe):
    title = 'NRC'
    __author__ = 'Cristi Ghera'
    max_articles_per_feed = 100
    description = 'NRC - Nieuws, achtergronden en onderzoeksjournalistiek'
    needs_subscription = False
    language = 'nl'
    country = 'NL'
    category = 'news, politics, Netherlands'
    resolve_internal_links = True
    remove_tags_before = {'class': 'article__header-and-content'}
    remove_tags_after = {'class': 'article__header-and-content'}
    remove_tags = [
        dict(
            attrs={
                'class': [
                    'article__footer',
                    'lees-ook',
                    'luister-naar',
                    'print-layout-warning',
                    'newslettersignup',
                    'article__byline',
                    'article__published-in',
                    'article__featured-image__caption__producer',
                    'metabox',
                ]
            }
        ),
        dict(name=['script', 'noscript', 'style']),
    ]
    remove_attributes = ["class", "id", "name", "style"]
    encoding = 'utf-8'
    no_stylesheets = True
    ignore_duplicate_articles = {'url'}
    delay = 0.3

    touchscreen = True

    frontpage = None

    title_regexp = None

    @staticmethod
    def _monthly_list_url(date, fmt="%Y/%m/"):
        return "https://www.nrc.nl/de/data/NH/" + date.strftime(fmt)

    def _clean_article_title(self, title):
        if not title:
            return title
        if self.title_regexp is None:
            self.title_regexp = re.compile(
                r'<span class="keyword">([^<]+)</span>\s*'
            )
        return self.title_regexp.sub(r"\1 ", title)

    def parse_index(self):
        sections = []
        today = datetime.date.today()
        headers = {
            'X-Requested-With': 'XMLHttpRequest',
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'DNT': '1',
        }
        monthly_list_urls = [
            self._monthly_list_url(today),
            self._monthly_list_url(
                datetime.date(today.year, today.month, 1) -
                datetime.timedelta(days=1)
            )
        ]
        issue_url = None
        issue_date = None
        for monthly_list_url in monthly_list_urls:
            with closing(
                self.browser.open(Request(monthly_list_url, None, headers))
            ) as r:
                issues = json.loads(r.read())
                if len(issues) > 0:
                    issue_date = datetime.datetime.strptime(
                        issues[0]["published_at"], "%Y-%m-%dT%H:%M:%SZ"
                    )
                    issue_url = self._monthly_list_url(issue_date, "%Y/%m/%d/")
                    self.frontpage = issues[0]["frontpage"]
                    break
        if issue_url is None:
            return []
        with closing(self.browser.open(Request(issue_url, None, headers))) as r:
            edition = json.loads(r.read())
        documents = {}
        for headline in edition["paperheadlines"]:
            item = headline["item"]
            documents[headline["document_id"]] = dict(
                url=item["full_url"],
                headline=self._clean_article_title(item["headline"])
            )
        for section in edition["sections"]:
            articles = []
            for doc in section["document_ids"]:
                if doc not in documents:
                    self.log.warn('Document not found:', doc)
                    continue
                articles.append(
                    dict(
                        title=documents[doc]["headline"], url=documents[doc]["url"]
                    )
                )
            sections.append((section["name"], articles))
        return sections

    def preprocess_html(self, soup):
        for tag in soup():
            if tag.name == 'img':
                if tag.has_attr('data-src-medium'):
                    tag['src'] = tag['data-src-medium'].split("|")[0]
                elif tag.has_attr('data-src'):
                    tag['src'] = tag['data-src'].split("|")[0]
                if tag['src'].startswith('//'):
                    tag['src'] = 'https:' + tag['src']
                elif tag['src'].startswith('/'):
                    tag['src'] = 'https://www.nrc.nl' + tag['src']
        if self.browser.cookiejar:
            self.browser.cookiejar.clear()
        return soup

    def get_cover_url(self):
        return self.frontpage
PK�X�~�a��nrc_handelsblad.png�PNG


IHDR  D���PLTE�������������������������������������������������������������������������������������������	�������39���������
��%� &�'-�
�=C�?E�@E�GL�JO�JP�LQ�QV�TY�[`�]b�_c�hm�lq�sw�z~�{~�{ꉍ��������������������������������������� Pn��tRNS22<deeuuy��������������q&8#<IDATxڕ���AF���&[_۶����jT����3�h�)�B4�+�V1���B�}�r<�
1%��$h)���-��nVcB�_o�����;���*��b��k�}q�u�$����F�+�ȸh_�w����X|eы��A��26�,gH(��g,�I(J��7	7�A,�`��	K�d�@l6��,qۢ�BC\"��6�[�,�c�Z$�Q.�_��*
7BB�̅k��=�\ʏ���|�����p�=7�0{����Ї!R.��M�i���
vj��!B���>R9ռ�N�\&"5���Zb�l�.IEND�B`�PK�X⃿�8
8
nrc_handelsblad.recipe__license__ = 'GPL v3'
__copyright__ = '2012'
'''
nrc.nl
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class NRC(BasicNewsRecipe):
    title = 'NRC Handelsblad'
    __author__ = 'veezh'
    description = 'Nieuws (no subscription needed)'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    publisher = 'nrc.nl'
    category = 'news, Netherlands, world'
    language = 'nl'
    timefmt = ''
    extra_css = '''
                    h1{font-size:130%;}
                    #h2{font-size:100%;font-weight:normal;}
                    #.href{font-size:xx-small;}
                    .bijschrift{color:#666666; font-size:x-small;}
                    #.main-article-info{font-family:Arial,Helvetica,sans-serif;}
                    #full-contents{font-size:small; font-family:Arial,Helvetica,sans-serif;font-weight:normal;}
                    #match-stats-summary{font-size:small; font-family:Arial,Helvetica,sans-serif;font-weight:normal;}
                '''
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }

    remove_empty_feeds = True

    filterDuplicates = True

    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

    keep_only_tags = [dict(name='div', attrs={'class': 'article'})]
    remove_tags_after = [dict(id='broodtekst')]

#    keep_only_tags    = [
#                       dict(name='div', attrs={'class':['label']})
#                        ]

#    remove_tags_after = [dict(name='dl', attrs={'class':['tags']})]

#    def get_article_url(self, article):
#        link = article.get('link')
#        if 'blog' not in link and ('chat' not in link):
#             return link

    feeds = [
        #                      ('Nieuws', 'http://www.nrc.nl/rss.php'),
        ('Binnenland', 'http://www.nrc.nl/nieuws/categorie/binnenland/rss.php'),
        ('Buitenland', 'http://www.nrc.nl/nieuws/categorie/buitenland/rss.php'),
        ('Economie', 'http://www.nrc.nl/nieuws/categorie/economie/rss.php'),
        ('Wetenschap', 'http://www.nrc.nl/nieuws/categorie/wetenschap/rss.php'),
        ('Cultuur', 'http://www.nrc.nl/nieuws/categorie/cultuur/rss.php'),
        ('Boeken', 'http://www.nrc.nl/boeken/rss.php'),
        ('Tech', 'http://www.nrc.nl/tech/rss.php/'),
        ('Klimaat', 'http://www.nrc.nl/klimaat/rss.php/'),
    ]
PK�X1����nrc_next.png�PNG


IHDR00`�	�hPLTE�������	�
�����$*�+1�17�BH�DJ�LQ�VZ�[`�im�mq�x|�z~鍑둕땙אָ������������������06�=B�	����'-�EJ����:@�>D�*0�CH�����=B���vz�;@��窱��������tx飯�����&,�
�9?� &��rv�06��SX�KQ�Z_�V[�+1��os� &�#�"� �5;�������)/�(.�BG�AG�AF�?D�����������������������������������;A�>C�]a뒕됓ꎑꋏꊎ�y|g��%tRNS���������¿�������qor^TOLI><+%�Ŗ*�IDATxڽ�Sc$A���6�A�mY�����I2�S5}���vA�hU�-ᚧ��H�QȦ��B�+�:qH�uH�k�~/���|�˝�����YZ�I UwE���B���C�b�?�E7u�D[��\��/@!X�*�A�3��/g	�y���1��p�I�x�yy���7y��:0\�T��n�`�Ͽ����
�,&޼�w
A���)��/&H30��?��,ك���50Rd�W����]z�5��j��j2h�������}6 ��")����0�RR�ݯc�S�W�����w,�i
����-Eu��K·N���7N3�5�
���}8Q��#��_Ct\����38xU�{��=xq��r��%����f���)o>�O$�=��O�fH;�n"3�}�JC��dlȸ��
9�vAa���%��N�EF%�_v�T@��3��|26���?�9B^5�
IEND�B`�PK�XU �F�	�	nrc_next.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Based on veezh's original recipe, Kovid Goyal's New York Times
# recipe and Snaabs nrc Handelsblad recipe

__license__ = 'GPL v3'
__copyright__ = '2014 Niels Giesen'

'''
www.nrc.nl
'''
import os
import zipfile
import re
from io import BytesIO

from calibre.web.feeds.news import BasicNewsRecipe
from datetime import date, timedelta


class NRCNext(BasicNewsRecipe):

    title = u'nrc•next'
    description = u'De ePaper-versie van nrc•next'
    language = 'nl'
    needs_subscription = True
    requires_version = (1, 24, 0)

    __author__ = 'Niels Giesen'

    conversion_options = {
        'no_default_epub_cover': True
    }

    def build_index(self):
        import mechanize
        br = mechanize.Browser()
        br.open('https://login.nrc.nl/login', timeout=60)
        br.select_form(nr=0)
        br['username'] = self.username
        br['password'] = self.password
        response2 = br.submit()
        raw = response2.get_data()
        if b'niet ingelogd' in raw:  # in body class
            raise ValueError('Failed to login, check username and password')
        epubraw = None
        for today in (date.today(), date.today() - timedelta(days=1),):
            url = 'http://digitaleeditie.nrc.nl/digitaleeditie/helekrant/epub/nn_%s.epub' \
                  % today.strftime('%Y%m%d')
            self.log('Trying to download epub from:', url)
            try:
                response3 = br.open(url, timeout=60)
                epubraw = response3.get_data()
                break
            except mechanize.HTTPError:
                self.log('%r not available yet' % url)
                continue

        if epubraw is None:
            raise ValueError('Krant van vandaag nog niet beschikbaar')

        zfile = zipfile.ZipFile(BytesIO(epubraw), 'r')
        zfile.extractall(self.output_dir)
        namelist = zfile.namelist()
        emre = re.compile("&lt;em(?:.*)&gt;(.*)&lt;/em&gt;")
        subst = '\\1'
        for name in namelist:
            _, ext = os.path.splitext(name)
            if (ext == '.html') or (ext == '.ncx'):
                fname = os.path.join(self.output_dir, name)
                with open(fname) as f:
                    s = f.read()
                    s = emre.sub(subst, s)
                with open(fname, 'w') as f:
                    f.write(s)
        index = os.path.join(self.output_dir, 'metadata.opf')
        return index
PK�X#�v5
nsfw_corp.png�PNG


IHDR��h6�IDATxڭRA
�0<��P�a�2�A!J �w��-S��6�:�JϾs�!����1D�@ NSӬ�h!h���f��PC @�	��^0Bv��x���Q+�\�����<7��PO�K�^�c�ހ�%�����a�WD�r�6J_
��bK��YL�+Kw5�8��R����k=�VJ"���a��5����c�9�����݌'��8jν�IEND�B`�PK�X�/U��nsfw_corp.recipe__license__ = 'GPL v3'
__copyright__ = '2012-2013, Darko Miletic <darko.miletic at gmail.com>'
'''
www.nsfwcorp.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class NotSafeForWork(BasicNewsRecipe):
    title = 'Not Safe For Work Corporation'
    __author__ = 'Darko Miletic'
    description = 'Not Safe For Work Corporation'
    publisher = 'Not Safe For Work Corporation'
    category = 'news, politics, USA, World'
    no_stylesheets = True
    oldest_article = 15
    encoding = 'utf-8'
    needs_subscription = True
    auto_cleanup = False
    INDEX = 'https://www.nsfwcorp.com'
    LOGIN = INDEX + '/account/login/?next=%2F'
    SETTINGS = INDEX + '/account/settings/'
    use_embedded_content = True
    language = 'en'
    publication_type = 'magazine'
    masthead_url = 'http://assets.nsfwcorp.com/media/headers/nsfw_banner.jpg'
    extra_css              = """
        img{margin-top:0.5em; margin-bottom: 0.7em; display: block}
        .fontFace{font-family: 'LeagueGothicRegular',Arial,sans-serif;}
        .dispatchTitle{text-transform: uppercase; font-size: x-large; font-weight: bold}
        .dispatchSubtitle{font-size: x-large; font-weight: bold}
        #fromLine{color: gray; text-align:right}
        #toLine{color: gray}
        #toLine a{color: red}
        #fromLine a{color: red}
        .row a{color: red}
                             """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.INDEX)
        if self.username is not None and self.password is not None:
            br.open(self.LOGIN)
            br.select_form(nr=0)
            br['email'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def get_feeds(self):
        self.feeds = []
        soup = self.index_to_soup(self.SETTINGS)
        for item in soup.findAll('input', value=True, attrs={'type': 'text'}):
            if item['value'].startswith('https://www.nsfwcorp.com/feed/'):
                self.feeds.append(item['value'])
                return self.feeds
        return self.feeds
PK�X�v�p66nspm.png�PNG


IHDR�a�IDATx�m�_Q��Ν���D�Q�Qx��7�G�ɫ�J^")��
˂]�3���<)��v�t�w���'���f+����ڝY��п�]�s�%��/�aP�X��ĩ�ޅ�KM+"<��$�5����ݞ>cWi��@������;��(i��[
�X"�eZ�+�H��&�‚���|�Ғ����Ŷ�Լo���B��L]�8
���}�	+�
��i�5A8,;�/�
��`|����&���$��xC��^��%�[w�x����~ش�ѡC^[=j�r��,��mԈ���@ڣ�?�IH�%=��u�i^�����=��Vu��H��֠!�o>!�v�/��'PcGd��	��7�X� 
��=H�B��=/-��1ۗ��$-�"�Z�-B�,��5j��F��U��o��mvK��h�E�Ц-*ߖ����*m����J���K���ɰ|/hƹ��`‹׈Z��r2�C� 6
�M�� y���iv�~]�L�%!��sx��:b�$�F��s
�hQ6��t��D����=z�v�̛�1�����e��w@����e�/��:��"��C��ҭ6�?N�[�8pp{��w��r �H�ihh��_�K:�?a�ū�anŲ��y�;'/,�oۺ�
��E$�ʰPADK�h~L��CUw�����&���׷�GօoM�A�trD�G$U�}7�M�U�5��0��V���t��,��Ja��y�*��_/�KFHFIEND�B`�PK�X�����nspm.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2011, Darko Miletic <darko.miletic at gmail.com>'
'''
nspm.rs
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import NavigableString, Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Nspm(BasicNewsRecipe):
    title = 'Nova srpska politicka misao'
    __author__ = 'Darko Miletic'
    description = 'Casopis za politicku teoriju i drustvena istrazivanja'
    publisher = 'NSPM'
    category = 'news, politics, Serbia'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    INDEX = 'http://www.nspm.rs/?alphabet=l'
    encoding = 'utf-8'
    language = 'sr'
    remove_empty_feeds = True
    publication_type = 'magazine'
    masthead_url = 'http://www.nspm.rs/templates/jsn_epic_pro/images/logol.jpg'
    extra_css             = """ @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                                @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                                body{font-family: "Times New Roman", serif1, serif}
                                .article_description{font-family: Arial, sans1, sans-serif}
                                img{margin-top:0.5em; margin-bottom: 0.7em; display: block}
                                .author{color: #990000; font-weight: bold}
                                .author,.createdate{font-size: 0.9em} """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]
    remove_tags = [dict(name=['link', 'script', 'meta', 'base', 'img'])]
    remove_attributes = ['width', 'height', 'lang', 'xmlns:fb',
                         'xmlns:og', 'vspace', 'hspace', 'type', 'start', 'size']

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.INDEX)
        return br

    feeds = [

    (u'Rubrike', u'http://www.nspm.rs/rubrike/feed/rss.html'),
    (u'Debate', u'http://www.nspm.rs/debate/feed/rss.html'),
    (u'Reci i misli', u'http://www.nspm.rs/reci-i-misli/feed/rss.html'),
    (u'Samo smeh srbina spasava', u'http://www.nspm.rs/samo-smeh-srbina-spasava/feed/rss.html'),
    (u'Polemike', u'http://www.nspm.rs/polemike/feed/rss.html'),
    (u'Prikazi', u'http://www.nspm.rs/prikazi/feed/rss.html'),
    (u'Prenosimo', u'http://www.nspm.rs/prenosimo/feed/rss.html'),
    (u'Hronika', u'http://www.nspm.rs/tabela/hronika/feed/rss.html')
    ]

    def preprocess_html(self, soup):
        atitle = soup.body.find('a', attrs={'class': 'contentpagetitle'})
        if atitle:
            cleanTitle = new_tag(soup, 'h1', [('class', 'contentpagetitle')])
            cnt = NavigableString(self.tag_to_string(atitle))
            cleanTitle.append(cnt)

        author = soup.body.find('span', attrs={'class': 'author'})
        if author:
            author.extract()
            author.name = 'div'

        crdate = soup.body.find('td', attrs={'class': 'createdate'})
        if crdate:
            cleanCrdate = new_tag(soup, 'div', [('class', 'createdate')])
            cnt = NavigableString(self.tag_to_string(crdate))
            cleanCrdate.append(cnt)

            # get the dependant element
            artText = new_tag(soup, 'div', [('class', 'text')])
            textHolderp = crdate.parent
            textHolder = textHolderp.nextSibling
            while textHolder and (not isinstance(textHolder, Tag) or (textHolder.name != textHolderp.name)):
                textHolder = textHolder.nextSibling
            if textHolder.td:
                artText = textHolder.td
                artText.name = 'div'
                artText.attrs = []
                artText['class'] = 'text'
                artText.extract()

            soup.body.contents = []

            soup.body.append(cleanTitle)
            soup.body.append(author)
            soup.body.append(cleanCrdate)
            soup.body.append(artText)

        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 = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�X�v�p66nspm_int.png�PNG


IHDR�a�IDATx�m�_Q��Ν���D�Q�Qx��7�G�ɫ�J^")��
˂]�3���<)��v�t�w���'���f+����ڝY��п�]�s�%��/�aP�X��ĩ�ޅ�KM+"<��$�5����ݞ>cWi��@������;��(i��[
�X"�eZ�+�H��&�‚���|�Ғ����Ŷ�Լo���B��L]�8
���}�	+�
��i�5A8,;�/�
��`|����&���$��xC��^��%�[w�x����~ش�ѡC^[=j�r��,��mԈ���@ڣ�?�IH�%=��u�i^�����=��Vu��H��֠!�o>!�v�/��'PcGd��	��7�X� 
��=H�B��=/-��1ۗ��$-�"�Z�-B�,��5j��F��U��o��mvK��h�E�Ц-*ߖ����*m����J���K���ɰ|/hƹ��`‹׈Z��r2�C� 6
�M�� y���iv�~]�L�%!��sx��:b�$�F��s
�hQ6��t��D����=z�v�̛�1�����e��w@����e�/��:��"��C��ҭ6�?N�[�8pp{��w��r �H�ihh��_�K:�?a�ū�anŲ��y�;'/,�oۺ�
��E$�ʰPADK�h~L��CUw�����&���׷�GօoM�A�trD�G$U�}7�M�U�5��0��V���t��,��Ja��y�*��_/�KFHFIEND�B`�PK�X	�'FFnspm_int.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
nspm.rs/nspm-in-english
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Nspm_int(BasicNewsRecipe):
    title = 'NSPM in English'
    __author__ = 'Darko Miletic'
    description = 'Magazine dedicated to political theory and sociological research'
    publisher = 'NSPM'
    category = 'news, politics, Serbia'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'
    delay = 2
    publication_type = 'magazine'
    masthead_url = 'http://www.nspm.rs/templates/jsn_epic_pro/images/logol.jpg'
    extra_css             = """
                                body{font-family: "Times New Roman", serif}
                                .article_description{font-family: Arial, sans-serif}
                                img{margin-top:0.5em; margin-bottom: 0.7em}
                                .author{color: #990000; font-weight: bold}
                                .author,.createdate{font-size: 0.9em} """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    keep_only_tags = [dict(attrs={'id': 'jsn-mainbody'})]
    remove_tags = [
        dict(name=['link', 'object', 'embed', 'script', 'meta',
                   'base', 'iframe']), dict(attrs={'class': 'buttonheading'})
    ]
    remove_tags_after = dict(attrs={'class': 'article_separator'})
    remove_attributes = ['width', 'height']

    feeds = [(u'Articles', u'http://www.nspm.rs/nspm-in-english/feed/rss.html')]

    def preprocess_html(self, soup):
        for item in soup.body.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�XEꖶ��ntv_spor.png�PNG


IHDR  D����PLTEw>v=u<u;v<w=u;"zC*J+�K&}Gw?t:x@B�_z���ɲ��Ľ�DZн���[�t)Jw>5�S�����������������������ιU�oyAv=t:-�L��������������ݕ���Ư������T�n9�Wn��v��d�{'~Gv<(~HO�iV�pU�nU�oL�hj����ѥɳh�?�\x?b�z������7�Us9#{EA�__�wr��z��{��|��|��r��������ȰP�kf�}p��.�Mt9f�|������;�Ws9*�J��������������������λ��׫͸���`�xs8e�{���<�YO�j��������d�|c�{8�VF�b����Ʈ�Ŭ�ī����������D�a���x?)I5�T>�[@�]A�^A�^;�Xd�z����������үϻ��v<k���ɲ��������������ӽ�ǝĬ��ܧ˵��������ѿ��٬θ��ɟŭ������������Ȳ��ܮϻ���]�v������N�iN�hJ�eJ�cJ�eC�^g�}���[�sF�c"zD#{D���s8C�_b�wr����w��y�����v��E�au=G�c���D�a������������ưм��ǩ̶���v>t;1�P,�M%|F�������w��2�Qw=M�hr��������~��a�y7�Vu<
U�u�IDAT8�cd ��F��K#�V���*`�b�����^"+`I1@��Ϡ�B���p*L@��S�]`P����)0q_0H���`|�Ȗ�#�N���Y�N9d�ȸ��%���?�	���Cլ�rj������,��
r׏���
�
�^``���x�tҳ�Sr���F(`hZ���������ڌ�=��2�L�T�S���.7�z���:���>�?�gd��#���Y��2����O#c���\$7���l�����l�_쌌�\u��
�w��fd�-*�����cO�1��#@�)�� �R��p���_��W�|�y/02����JE����r
�N�$�$��z�_Vǣ?�L������9Y!�^��IEND�B`�PK�X�ve���ntv_spor.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1313512459(BasicNewsRecipe):
    title = u'NTVSpor'
    __author__ = 'A Erdogan'
    description = 'News from Turkey'
    publisher = 'NTVSpor.net'
    category = 'sports, Turkey'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    masthead_url = 'http://www.ntvspor.net/HTML/r/i/l.png'
    language = 'tr'

    extra_css             = '''
        body{font-family:Arial,Helvetica,sans-serif; font-size:small; align:left;  color:#000000}
        h1{font-size:large; color:#000000}
        h2{font-size:small; color:#000000}
        p{font-size:small; color:#000000}
    '''

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['embed', 'il', 'ul', 'iframe', 'object', 'link', 'base']),
        dict(name='div', attrs={'id': 'contentPhotoGallery'}),
        dict(name='div', attrs={'class': 'SocialMediaWrapper'}),
        dict(name='div', attrs={'class': 'grid2'}),
        dict(name='div', attrs={'class': 'grid8'}),
        dict(name='div', attrs={'id': 'anonsBar'}),
        dict(name='div', attrs={'id': 'header'})]
    remove_tags_before = dict(name='h1', attrs={'style': ['margin-top: 6px;']})
    remove_tags_after = dict(name='div', attrs={'id': 'newsBody'})
    feeds = [(u'NTVSpor', u'http://www.ntvspor.net/Rss/anasayfa')]
PK�XӈEy,,
ntv_tr.png�PNG


IHDR  szz��IDATx^�kpU��{�s�
!\�%B���MrCb�B���*�3�����ȴ*��'
%%Td���t�j+FIFHU�E BI���n�=g�2��Ĕ�8|�L3��{f�5�5k�u����.�&j�30��$3|f����dH�0
@\LX�@��ҝ8�?ͼ<FR��ߩMt2�X�+��x�.^�_Ī�u����˙W:�k�D?H?��4ɚ����x�t1�4�t���Ca�E푂U�˰
G����l���O�Ћ�z��t���i��
{�(f>kND��z
�>��v�y%���(��“;��e<[�z��~��V؈0���H�����(�y�� V�ϟ?��[�E�;�d�d,��x�s��s�ߗ����#�~Ҕ�l��V�ͼ��bt:L���1擷{<9�3��yL�`B
p�O��Ep<0���%�pv+,˦��is��f��҅�r�nݝ4��̩�ӛn�hi�<r�$�+nbv^	��5)j?�_:�Q���X��(l��o� �.�?��0��D��B)s����8�?>�͏z���i}=W.J>ʑ��G�	5G���?=H�h���x���/љ�i
�\k��TV�HM�Y2�޾7���?i��<�ן�ݑ5�V���*m�!0��`�2��yp�T�ȇ�����ݛ�#6D8m2b5ͯ�ҷ~O�=*[m#9�h,��i�^5b��2_/�EEF5��(=b�@&w>��9p��NZN$

X��n1b��es�U���-�m��J;�υ6d'�vAMaR®9��r�+��?s_��5& |�	��u%4�I�pP���u�]�E��t��
��^��L�������_;���<|��A��d�#*���	��.��5"z�f@!(@���C�8�rx7�W����tѲ�����]<&�}�
K��L�
(!T��k���%T�GpՀ*h���q��,1�n��箱����}�x�1z���ĩi��f`���tp���•�hwںV���tQn��쏚V	�Gٮ�Ph��
G��`�65����i`�,ȟML�ux���D��P�3`��r��*���F�C���>������I�^�d-��q�cv���ҍ���3��*B�����8�j�h�s�J[!��T6���sM����(����>�����ἢ��ݎ�ԧ���(B��V��)����#~G; ]��}�rڴ6E �!$�j�T��{�j�ʧ�N|��<d���Q�����QpD��D���l���:�vX��Ju�ik���k�Ǚk��\_�����
7�����ꗂA\�A0`r�V�
��c5MA@i�m�a*L'8M�m�Sٴ:�D{>��($�_����}u��!}��_VQ����zM�A�ȃ���7�7����	�%B|N��T�����0��Fʲ�nɖ��F����:�b�a��t�o/̕s=��(�=zC��a�kD(<�l 	��H`�ȟԇ�[ٺsEE�9wݗ�O��m����_,	l�Ad�Mmr0Y�>U�M+<9O<;�!�
A�N��FK�h�`�R����(�����^��x��*֟,���x��W΄XW-9���6��S"ǘ"|�;r�]�m8:���ż�z�(�Y(��_n�D��^��_��b @��l�1,*P�CXPj��g޷�[bg�Z<V!��y��e�����Ӗ�-�s���<sj��}�@l�W�C`�]��ӵ�q� s�b��X�̋'^g�^��\4"�/�(��v�u@�{LXXg�Z�uugI��^����EOHL�t�w���›�rx�~�O}Vj��5����`�KU'rި|;g�;�@J�?�չ0‡�'>H��,�8��_��L�-O�͹L�5����:?ZG+H2�t��ɥH�I�iE?:ȟ�(p+����"pT�_���'�.vfIEND�B`�PK�X@}ܑbb
ntv_tr.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class NTVMSNBC(BasicNewsRecipe):
    title = u'NTV'
    __author__ = 'A Erdogan'
    description = 'News from Turkey'
    publisher = 'NTV'
    category = 'news, politics, Turkey'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    masthead_url = 'http://www.ntvmsnbc.com/images/MSNBC/msnbc_ban.gif'
    language = 'tr'

    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(attrs={'id': 'haberDetayYazi'})
    extra_css             = '''
                        body{font-family:Arial,Helvetica,sans-serif; font-size:small; align:left;  color:#000000}
                        h1{font-size:large; color:#000000}
        h2{font-size:small; color:#000000}
        p{font-size:small; color:#000000}
                     '''

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [dict(name=['embed', 'il', 'ul', 'iframe', 'object', 'link', 'base']), dict(name='div', attrs={'style': ['padding: 0pt 10px 10px;']}), dict(name='div', attrs={'style': ['padding: 0pt 10px 10px;']}),  dict(name='div', attrs={  # noqa
        'class': ['textSmallGrey w320']}), dict(name='div', attrs={'style': ['font-family:Arial; font-size:16px;font-weight:bold; font-color:#003366; margin-bottom:20px; margin-top:20px; border-bottom:solid 1px;border-color: #CCC; padding-bottom:2px;']})]  # noqa
    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(name='div', attrs={'style': [
                             'font-family:Arial; font-size:16px;font-weight:bold; font-color:#003366; margin-bottom:20px; margin-top:20px; border-bottom:solid 1px;border-color: #CCC; padding-bottom:2px;']})  # noqa

    feeds = [(u'NTV', u'http://www.ntvmsnbc.com/id/3032091/device/rss/rss.xml')]

    def print_version(self, url):
        articleid = url.rpartition('/id/')[2]
        return 'http://www.ntvmsnbc.com/id/' + articleid + '/print/1/displaymode/1098/'

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XgT����nu.png�PNG


IHDR�a�IDATx�b�*�Κ͔�;;J_/��p�3.ΰ����W��ī95y���J�>@��$WEѻ��Vimcfb۶m۶m۶͵�7��8U��~@�Ha�-sa8
���›�m��?��yq5k�F_�`9��,��"���<h�+�Ӽ�,;��7
b(r�Z��X5��I��¼-��r3��\dw�b� )_�ko ����Ǐ	��M��OI|��#Ǐ۪�m�r�[6��DFFL H/��ސ�8���s�m�ܻ����i,((��G(9w����Q��44
�m�ۧk���06�)+�����kN���w����)9y⮢$B7#�{ݒ�6�>�����6�����s��Gn+J�u�s��j�0�C��W����h�⑼¤��)پ�_�����.Q��]���a�i��սҧw�mΨR�� ��}z��7��=kO��>���Gm��ױ|�>^Q����Qn5�����:�5��MK�]&F:���0kD#�l�M=D�t�N��I�!y�	/[�¼AJ��'��I�/�<m�bN���@�y���V-�Ϯ[�p�+@�,��w�J=�볲x�X�cб+���������6m�tF���wsm��ΦI��C�guj��"6�q�t(�x�>�k�PO8(}�ū0
@�D���T��++릭ŘIEND�B`�PK�Xe<���	�		nu.recipe__license__ = 'GPL v3'
__copyright__ = '2009, Rob Hankel <from outerspace.com>'
'''
nu.nl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Nu(BasicNewsRecipe):
    title = u'Nu.nl'
    __author__ = u'Rob Hankel'

    publisher = 'nu.nl'
    description = u'Dutch News'
    category = 'news'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True
    language = 'nl'

    keep_only_tags = [dict(name='div', attrs={'id': ['leadarticle']})]

    feeds = [(u'binnenland', u'http://www.nu.nl/feeds/rss/binnenland.rss'),
             (u'Algemeen nieuws', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Algemeen'),
             (u'Economie', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Economie'),
             (u'Internet', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Internet'),
             (u'Sport', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Sport'),
             (u'Achterklap', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Achterklap'),
             (u'Opmerkelijk', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Opmerkelijk'),
             (u'Muziek', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Muziek'),
             (u'DVD', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=DVD'),
             (u'Film', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Film'),
             (u'Boek', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Boek'),
             (u'Games', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Games'),
             (u'Columns', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Columns'),
             (u'Cartoon', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Cartoon'),
             (u'Lifehacking', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Lifehacking'),
             (u'Jurryt', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Jurryt'),
             (u'Formule 1', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Formule1'),
             (u'Plugged', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Plugged'),
             (u'Auto', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Auto'),
             (u'Wetenschap', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Wetenschap'),
             (u'Gezondheid', u'http://www.nu.nl/deeplink_rss2/index.jsp?r=Gezondheid'),
             (u'Dagelijkse tv-tips', u'http://www.nu.nl/tvgids/rss/tips'),
             (u'Podcast Algemeen nieuws', u'http://www.nu.nl/podcast.php')]

    def get_article_url(self, article):
        return article.get('guid',  None)
PK�X;)�<��nursingtimes.png�PNG


IHDR��h6�IDATx�c`�EA`�� "��!@�<�Y޳A�kD$�?,8B���,���w^|:���ۯ��]bp�2�cfD߁�/?�����׷��I[��0�+|aΌc����O18O/���d�)�`֬�@e@�0'YL�Xr�?u�cp����t���+��38L�8	�i���N�5���Ϭt�� �}���/��J����g���6y�u��7��&�`�����ӃW�c�P����3w]z�s��Gf���O=���/�3���]p��g��U'l?�d��g\�W-=���o�c�Z� �
�b�P�����\��]
'15XL���] $��Na�8�%dA�ڋ����к� ���{(��$
s���>�`�����u�i������c��@����&F��@3 d|��4�~Pr��c������o�IEND�B`�PK�X��!nursingtimes.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.nursingtimes.net
'''

try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode

from calibre.web.feeds.recipes import BasicNewsRecipe


class NursingTimes(BasicNewsRecipe):
    title = 'Nursing Times'
    __author__ = 'Darko Miletic'
    description = 'Nursing practice, NHS and health care news'
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    publisher = 'emap'
    category = 'news, health, nursing, UK'
    language = 'en_GB'
    needs_subscription = True
    LOGIN = 'http://www.nursingtimes.net/sign-in'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.LOGIN)
        if self.username is not None and self.password is not None:
            data = urlencode({'campaigncode': '0', 'referrer': '', 'security_text': '', 'SIemail': self.username, 'passWord': self.password, 'LoginButton.x': '27', 'LoginButton.y': '13'  # noqa
                                     })
            br.open(self.LOGIN, data)
        return br

    keep_only_tags = [dict(name='div', attrs={'class': 'storytext'})]
    remove_tags = [
        dict(name=['object', 'link', 'script', 'iframe']), dict(
            name='div', attrs={'id': 'comments_form'})
    ]
    remove_tags_after = dict(name='div', attrs={'id': 'comments_form'})

    feeds = [

    (u'Breaking News', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=1'),
    (u'Practice', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=512'),
    (u'Behind the headlines', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=468'),
    (u'Analysis', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=62'),
    (u'Acute care news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=5'),
    (u'Primary vare news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=231'),
    (u'Mental Health news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=27'),
    (u'Management news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=32'),
    (u"Older people's nursing news", u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=181'),
    (u'Respiratory news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=177'),
    (u'Wound care news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=182')
    ]
PK�X�����	nv_en.png�PNG


IHDR  ���IDATxڥ�o��Ɵ/1��`%Y��H�?333����t�e�cf.�����۔�{Xz'㳕cZ=ڮ���7;뉍[6��+������X%�4����	8)K?�2��">A|JuZ�uR�UF�!�7��ww�
�.��jw��������s_U:y���#z��ޙA�K,9D^�g�4B\G��L,�^�dDa��f���觷K��s`��g-F�lZش��`�)�A;�VN�+J�F1g�����f����y�z�nS�n6�l���tЫ�	����
�[�G���6�@�Į�a��m��bݣ��l�ٌh��!c���16���i�*�!i���R�Y�g�<��
J�z�z��(�1�(�(h4�
u;n���8�8��-��鬤2j��в�в�вQc�ڗ[��B�
Hm֑#9��#���E$�։��Us�����󓓭�>7
�9n�\��&'&&�W�8y9?8t��n���b�:2���#���^r�S\hjZ�۱W_��wL�Kwl�EE�@ܺa}��x��*�m�u��Ŗ��?�ʫ�@�:�6	���ɥ��d}����r�r���o#�c[�AK�CNCF��z� �?����%n��q���zz�ʏ?9��'�{.�i����y��l�jلf	%
��ɓ\R��N<�L>PH�{����"��--����v��i�a6����D���d-������D�D"1�H,\����?G~�͆��pX.5���GYh�f��D�����CtV���	\�o��Ï�'��f��2y]gΊ{	�6YDk�J�pu|ȟZ��|�����q��do"��(��)�ǻ��d�HWfgSS����<���VF�;�}G��8�V�B�ny��y4(���yNtu���}?�q�����Oe�-��:;3�c6(�-6�1=�%��\�r�*�v��7HQ$-��{�U|�I�5C��L�t��Nσ�RJ�5J�E��~��~��b`�u��)&��5�[�B�%S�{�F`��&��/�	�K�����,�BK�,ݱ
D�y�ei��?#��uh���[�89>00��750p�ɧJ`�ʀ�HD*c��_z$�"�����5k�%���5����8�\��:S϶TN��W9p�J��]��,�oP��A����Sæ�m��bQ�5�T��J�[踹�I#��OA��|s�c�<M�a�YL�^
��S�|��L�ސG,�빯w��A��/}9�re���Z2��,��@��&*����&� �Į���揢Rex�I��f�lU.q�l�ڳ�JZ�y�̼}K�T�J}�W�9����i�k��7�V��/�V��N۳�6�I��{_�����U)��D��yJ:p���i��'����~z�2� ��8e�S!�x=zN��O�oz��1�/��Y�KbaIEND�B`�PK�X:�����nv_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class NV(BasicNewsRecipe):
    title = 'NV (The New Voice of Ukraine)'
    __author__ = 'bugmen00t'
    description = 'Independent Ukrainian socio-political magazine and news resource.'
    publisher = 'Vydavnychyy Dim Media-DK LLC'
    category = 'magazine'
    cover_url = u'https://static.nv.ua/shared/system/Article/posters/002/439/752/600x300/65730a3918ebad6c86167b53f2b3e98a.jpg'
    language = 'en_UK'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 30
    max_articles_per_feed = 40

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='div', attrs={'class': 'article__content__footer'}),
        dict(name='div', attrs={'class': 'article__head__additional_views'}),
        dict(name='div', attrs={'class': 'show_two_positions '}),
        dict(name='div', attrs={'class': 'media__also__news'}),
        dict(name='div', attrs={'class': 'media__also__news_link'}),
        dict(name='blockquote', attrs={'class': 'code'}),
        dict(name='section', attrs={'class': 'article-share'}),
        dict(name='div', attrs={'class': 'nts-video-wrapper'}),
        dict(name='footer'),
        dict(name='div', attrs={'class': 'longread_tags'}),
        dict(name='div', attrs={'class': 'top_donate'}),
        dict(name='div', attrs={'class': 'col-md-6 col-lg-3'}),
        dict(name='div', attrs={'class': 'copyright'}),
        dict(name='div', attrs={'class': 'media__video'}),
        dict(name='div', attrs={'class': 'media__embed'})
    ]

    feeds = [('All News', 'https://english.nv.ua/rss/all_english.xml'),
             ('Life', 'https://english.nv.ua/rss/239.xml'),
             ('Business', 'https://english.nv.ua/rss/238.xml'),
             ('Nation', 'https://english.nv.ua/rss/237.xml'),
             ('Opinion', 'https://english.nv.ua/rss/240.xml')]
PK�X�����	nv_ru.png�PNG


IHDR  ���IDATxڥ�o��Ɵ/1��`%Y��H�?333����t�e�cf.�����۔�{Xz'㳕cZ=ڮ���7;뉍[6��+������X%�4����	8)K?�2��">A|JuZ�uR�UF�!�7��ww�
�.��jw��������s_U:y���#z��ޙA�K,9D^�g�4B\G��L,�^�dDa��f���觷K��s`��g-F�lZش��`�)�A;�VN�+J�F1g�����f����y�z�nS�n6�l���tЫ�	����
�[�G���6�@�Į�a��m��bݣ��l�ٌh��!c���16���i�*�!i���R�Y�g�<��
J�z�z��(�1�(�(h4�
u;n���8�8��-��鬤2j��в�в�вQc�ڗ[��B�
Hm֑#9��#���E$�։��Us�����󓓭�>7
�9n�\��&'&&�W�8y9?8t��n���b�:2���#���^r�S\hjZ�۱W_��wL�Kwl�EE�@ܺa}��x��*�m�u��Ŗ��?�ʫ�@�:�6	���ɥ��d}����r�r���o#�c[�AK�CNCF��z� �?����%n��q���zz�ʏ?9��'�{.�i����y��l�jلf	%
��ɓ\R��N<�L>PH�{����"��--����v��i�a6����D���d-������D�D"1�H,\����?G~�͆��pX.5���GYh�f��D�����CtV���	\�o��Ï�'��f��2y]gΊ{	�6YDk�J�pu|ȟZ��|�����q��do"��(��)�ǻ��d�HWfgSS����<���VF�;�}G��8�V�B�ny��y4(���yNtu���}?�q�����Oe�-��:;3�c6(�-6�1=�%��\�r�*�v��7HQ$-��{�U|�I�5C��L�t��Nσ�RJ�5J�E��~��~��b`�u��)&��5�[�B�%S�{�F`��&��/�	�K�����,�BK�,ݱ
D�y�ei��?#��uh���[�89>00��750p�ɧJ`�ʀ�HD*c��_z$�"�����5k�%���5����8�\��:S϶TN��W9p�J��]��,�oP��A����Sæ�m��bQ�5�T��J�[踹�I#��OA��|s�c�<M�a�YL�^
��S�|��L�ސG,�빯w��A��/}9�re���Z2��,��@��&*����&� �Į���揢Rex�I��f�lU.q�l�ڳ�JZ�y�̼}K�T�J}�W�9����i�k��7�V��/�V��N۳�6�I��{_�����U)��D��yJ:p���i��'����~z�2� ��8e�S!�x=zN��O�oz��1�/��Y�KbaIEND�B`�PK�Xq��Dnv_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class NV(BasicNewsRecipe):
    title = '\u041D\u0412 (\u00AB\u041D\u043E\u0432\u043E\u0435 \u0432\u0440\u0435\u043C\u044F\u00BB)'
    __author__ = 'bugmen00t'
    description = '\u0415\u0436\u0435\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E-\u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E-\u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0440\u0435\u0441\u0443\u0440\u0441.'  # noqa
    publisher = '\u041E\u041E\u041E \u00AB\u0418\u0437\u0434\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0434\u043E\u043C \u00AB\u041C\u0435\u0434\u0438\u0430-\u0414\u041A\u00BB'  # noqa
    category = 'magazine'
    cover_url = u'https://yes-ukraine.org/imglib/_newimage/Yalta-annual-meeting/11th-yalta-annual-meeting/partners/media-partneri/nv_logo.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 40

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='div', attrs={'class': 'article__content__footer'}),
        dict(name='div', attrs={'class': 'article__head__additional_views'}),
        dict(name='div', attrs={'class': 'show_two_positions '}),
        dict(name='div', attrs={'class': 'media__also__news'}),
        dict(name='div', attrs={'class': 'media__also__news_link'}),
        dict(name='blockquote', attrs={'class': 'code'}),
        dict(name='section', attrs={'class': 'article-share'}),
        dict(name='div', attrs={'class': 'nts-video-wrapper'}),
        dict(name='footer'),
        dict(name='div', attrs={'class': 'longread_tags'}),
        dict(name='div', attrs={'class': 'col-md-6 col-lg-3'}),
        dict(name='div', attrs={'class': 'copyright'}),
        dict(name='div', attrs={'class': 'media__video'}),
        dict(name='div', attrs={'class': 'media__embed'})
    ]

    feeds = [
        (
            '\u0412\u0441\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://nv.ua/rss/all.xml'
        ),
        ('\u0423\u043A\u0440\u0430\u0438\u043D\u0430', 'https://nv.ua/rss/2283.xml'),
        ('\u041C\u0438\u0440', 'https://nv.ua/rss/2318.xml'),
        ('\u041C\u043D\u0435\u043D\u0438\u044F', 'https://nv.ua/rss/2671.xml'),
        ('\u041A\u0438\u0435\u0432', 'https://nv.ua/rss/108.xml'),
        ('\u0410\u0440\u0442', 'https://nv.ua/rss/52.xml'),
        ('\u0414\u043E\u0441\u044C\u0435', 'https://nv.ua/rss/230.xml'),
        ('\u0411\u0438\u0437\u043D\u0435\u0441', 'https://nv.ua/rss/2292.xml'),
        (
            '\u041B\u043E\u043D\u0433\u0440\u0438\u0434\u044B',
            'https://nv.ua/rss/2790.xml'
        ),
        (
            '\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0438',
            'https://nv.ua/rss/48.xml'
        ), ('\u0422\u0435\u0445\u043D\u043E', 'https://nv.ua/rss/2346.xml'),
        ('\u0420\u0435\u0433\u0438\u043E\u043D\u044B', 'https://nv.ua/rss/231.xml'),
        ('\u0410\u0432\u0442\u043E', 'https://nv.ua/rss/154.xml'),
        ('Life', 'https://nv.ua/rss/2325.xml'),
        (
            '\u0417\u0434\u043E\u0440\u043E\u0432\u044C\u0435',
            'https://nv.ua/rss/90.xml'
        ), ('\u0421\u043F\u043E\u0440\u0442', 'https://nv.ua/rss/2371.xml'),
        ('\u0410\u0437\u0430\u0440\u0442', 'https://nv.ua/rss/178.xml'),
        ('\u0428\u043E\u043F\u043F\u0438\u043D\u0433', 'https://nv.ua/rss/131.xml'),
        ('LOL', 'https://nv.ua/rss/2365.xml'),
        (
            '\u0421\u043A\u0440\u044B\u0442\u044B\u0439 \u0440\u0430\u0437\u0434\u0435\u043B',
            'https://nv.ua/rss/118.xml'
        ), ('\u0424\u041E\u0422\u041E', 'https://nv.ua/rss/2384.xml'),
        (
            '\u0420\u0430\u0434\u0438\u043E \u041D\u0412',
            'https://nv.ua/rss/3050.xml'
        ), ('BBC', 'https://nv.ua/rss/2836.xml'),
        (
            '\u0426\u0438\u0442\u0430\u0442\u0430 \u0434\u043D\u044F',
            'https://nv.ua/rss/2672.xml'
        ), ('\u0414\u043D\u0435\u043F\u0440', 'https://nv.ua/rss/232.xml'),
        (
            '\u041A\u0440\u0443\u043F\u043D\u044B\u043C \u043F\u043B\u0430\u043D\u043E\u043C',
            'https://nv.ua/rss/2383.xml'
        ), ('\u0411\u043B\u043E\u0433 \u041D\u0412', 'https://nv.ua/rss/225.xml'),
        ('\u041B\u044C\u0432\u043E\u0432', 'https://nv.ua/rss/233.xml'),
        ('\u041E\u0434\u0435\u0441\u0441\u0430', 'https://nv.ua/rss/234.xml'),
        ('\u0425\u0430\u0440\u044C\u043A\u043E\u0432', 'https://nv.ua/rss/235.xml'),
        (
            '\u0410\u043D\u0435\u043A\u0434\u043E\u0442\u044B',
            'https://nv.ua/rss/2765.xml'
        ),
        (
            '\u042D\u043A\u0441\u043A\u043B\u044E\u0437\u0438\u0432\u044B \u041D\u0412',
            'https://nv.ua/rss/119.xml'
        )
    ]
PK�X�����	nv_ua.png�PNG


IHDR  ���IDATxڥ�o��Ɵ/1��`%Y��H�?333����t�e�cf.�����۔�{Xz'㳕cZ=ڮ���7;뉍[6��+������X%�4����	8)K?�2��">A|JuZ�uR�UF�!�7��ww�
�.��jw��������s_U:y���#z��ޙA�K,9D^�g�4B\G��L,�^�dDa��f���觷K��s`��g-F�lZش��`�)�A;�VN�+J�F1g�����f����y�z�nS�n6�l���tЫ�	����
�[�G���6�@�Į�a��m��bݣ��l�ٌh��!c���16���i�*�!i���R�Y�g�<��
J�z�z��(�1�(�(h4�
u;n���8�8��-��鬤2j��в�в�вQc�ڗ[��B�
Hm֑#9��#���E$�։��Us�����󓓭�>7
�9n�\��&'&&�W�8y9?8t��n���b�:2���#���^r�S\hjZ�۱W_��wL�Kwl�EE�@ܺa}��x��*�m�u��Ŗ��?�ʫ�@�:�6	���ɥ��d}����r�r���o#�c[�AK�CNCF��z� �?����%n��q���zz�ʏ?9��'�{.�i����y��l�jلf	%
��ɓ\R��N<�L>PH�{����"��--����v��i�a6����D���d-������D�D"1�H,\����?G~�͆��pX.5���GYh�f��D�����CtV���	\�o��Ï�'��f��2y]gΊ{	�6YDk�J�pu|ȟZ��|�����q��do"��(��)�ǻ��d�HWfgSS����<���VF�;�}G��8�V�B�ny��y4(���yNtu���}?�q�����Oe�-��:;3�c6(�-6�1=�%��\�r�*�v��7HQ$-��{�U|�I�5C��L�t��Nσ�RJ�5J�E��~��~��b`�u��)&��5�[�B�%S�{�F`��&��/�	�K�����,�BK�,ݱ
D�y�ei��?#��uh���[�89>00��750p�ɧJ`�ʀ�HD*c��_z$�"�����5k�%���5����8�\��:S϶TN��W9p�J��]��,�oP��A����Sæ�m��bQ�5�T��J�[踹�I#��OA��|s�c�<M�a�YL�^
��S�|��L�ސG,�빯w��A��/}9�re���Z2��,��@��&*����&� �Į���揢Rex�I��f�lU.q�l�ڳ�JZ�y�̼}K�T�J}�W�9����i�k��7�V��/�V��N۳�6�I��{_�����U)��D��yJ:p���i��'����~z�2� ��8e�S!�x=zN��O�oz��1�/��Y�KbaIEND�B`�PK�Xr�!�nv_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class NV(BasicNewsRecipe):
    title = '\u041D\u0412 (\u00AB\u041D\u043E\u0432\u0438\u0439 \u0427\u0430\u0441\u00BB)'
    __author__ = 'bugmen00t'
    description = '\u0429\u043E\u0442\u0438\u0436\u043D\u0435\u0432\u0438\u0439 \u0441\u0443\u0441\u043F\u0456\u043B\u044C\u043D\u043E-\u043F\u043E\u043B\u0456\u0442\u0438\u0447\u043D\u0438\u0439 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u043E-\u043D\u043E\u0432\u0438\u043D\u043D\u0438\u0439 \u0441\u0430\u0439\u0442.'  # noqa
    publisher = '\u0422\u041E\u0412 \u00AB\u0412\u0438\u0434\u0430\u0432\u043D\u0438\u0447\u0438\u0439 \u0434\u0456\u043C \u00AB\u041C\u0435\u0434\u0456\u0430-\u0414\u041A\u00BB'  # noqa
    category = 'magazine'
    cover_url = u'https://static.nv.ua/shared/system/Article/posters/002/467/576/600x300/272ab80cd01e4022dcb4c691c9073e97.jpg'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 40

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='div', attrs={'class': 'article__content__footer'}),
        dict(name='div', attrs={'class': 'article__head__additional_views'}),
        dict(name='div', attrs={'class': 'show_two_positions '}),
        dict(name='div', attrs={'class': 'media__also__news'}),
        dict(name='div', attrs={'class': 'media__also__news_link'}),
        dict(name='blockquote', attrs={'class': 'code'}),
        dict(name='section', attrs={'class': 'article-share'}),
        dict(name='div', attrs={'class': 'nts-video-wrapper'}),
        dict(name='footer'),
        dict(name='div', attrs={'class': 'longread_tags'}),
        dict(name='div', attrs={'class': 'col-md-6 col-lg-3'}),
        dict(name='div', attrs={'class': 'copyright'}),
        dict(name='div', attrs={'class': 'media__video'}),
        dict(name='div', attrs={'class': 'media__embed'})
    ]

    feeds = [
        (
            '\u0412\u0441\u0456 \u043D\u043E\u0432\u0438\u043D\u0438',
            'https://nv.ua/ukr/rss/all.xml'
        ),
        (
            '\u0423\u043A\u0440\u0430\u0457\u043D\u0430',
            'https://nv.ua/ukr/rss/2283.xml'
        ), ('\u0421\u0432\u0456\u0442', 'https://nv.ua/ukr/rss/2318.xml'),
        (
            '\u041F\u043E\u0433\u043B\u044F\u0434\u0438',
            'https://nv.ua/ukr/rss/2671.xml'
        ), ('\u041A\u0438\u0457\u0432', 'https://nv.ua/ukr/rss/108.xml'),
        ('\u0410\u0440\u0442', 'https://nv.ua/ukr/rss/52.xml'),
        ('\u0414\u043E\u0441\u044C\u0454', 'https://nv.ua/ukr/rss/230.xml'),
        ('\u0411\u0456\u0437\u043D\u0435\u0441', 'https://nv.ua/ukr/rss/2292.xml'),
        (
            '\u041B\u043E\u043D\u0433\u0440\u0456\u0434\u0438',
            'https://nv.ua/ukr/rss/2790.xml'
        ), ('\u041A\u0430\u0440\u0442\u043A\u0438', 'https://nv.ua/ukr/rss/48.xml'),
        ('\u0422\u0435\u0445\u043D\u043E', 'https://nv.ua/ukr/rss/2346.xml'),
        (
            '\u0420\u0435\u0433\u0456\u043E\u043D\u0438',
            'https://nv.ua/ukr/rss/231.xml'
        ), ('\u0410\u0432\u0442\u043E', 'https://nv.ua/ukr/rss/154.xml'),
        ('Life', 'https://nv.ua/ukr/rss/2325.xml'),
        (
            '\u0417\u0434\u043E\u0440\u043E\u0432\u0027\u044F',
            'https://nv.ua/ukr/rss/90.xml'
        ), ('\u0421\u043F\u043E\u0440\u0442', 'https://nv.ua/ukr/rss/2371.xml'),
        ('\u0410\u0437\u0430\u0440\u0442', 'https://nv.ua/ukr/rss/178.xml'),
        ('\u0428\u043E\u043F\u0456\u043D\u0433', 'https://nv.ua/ukr/rss/131.xml'),
        ('LOL', 'https://nv.ua/ukr/rss/2365.xml'),
        (
            '\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u043D\u0438\u0439 \u0440\u043E\u0437\u0434\u0456\u043B',
            'https://nv.ua/ukr/rss/118.xml'
        ), ('\u0424\u041E\u0422\u041E', 'https://nv.ua/ukr/rss/2384.xml'),
        (
            '\u0420\u0430\u0434\u0456\u043E \u041D\u0412',
            'https://nv.ua/ukr/rss/3050.xml'
        ), ('BBC', 'https://nv.ua/ukr/rss/2836.xml'),
        (
            '\u0426\u0438\u0442\u0430\u0442\u0430 \u0434\u043D\u044F',
            'https://nv.ua/ukr/rss/2672.xml'
        ), ('\u0414\u043D\u0456\u043F\u0440\u043E', 'https://nv.ua/ukr/rss/232.xml'),
        (
            '\u041A\u0440\u0443\u043F\u043D\u0438\u043C \u043F\u043B\u0430\u043D\u043E\u043C',
            'https://nv.ua/ukr/rss/2383.xml'
        ),
        ('\u0411\u043B\u043E\u0433 \u041D\u0412', 'https://nv.ua/ukr/rss/225.xml'),
        ('\u041B\u044C\u0432\u0456\u0432', 'https://nv.ua/ukr/rss/233.xml'),
        ('\u041E\u0434\u0435\u0441\u0430', 'https://nv.ua/ukr/rss/234.xml'),
        ('\u0425\u0430\u0440\u043A\u0456\u0432', 'https://nv.ua/ukr/rss/235.xml'),
        (
            '\u0410\u043D\u0435\u043A\u0434\u043E\u0442\u0438',
            'https://nv.ua/ukr/rss/2765.xml'
        ),
        (
            '\u0415\u043A\u0441\u043A\u043B\u044E\u0437\u0438\u0432\u0438 \u041D\u0412',
            'https://nv.ua/ukr/rss/119.xml'
        )
    ]
PK�Xkw�	nymag.png�PNG


IHDR  V%(�IDAT�[HS���5m��:�N�Z�\$D��3���^���t�P�.."�˺��IZ	�.lD7�H�P��f2�Ї�@�Q�0��c��g��)�N��(σA�h{0��&t29Hb)駀��^)'&����&�q}h�,���Z�9{��d.v0����^)�-R�K�8�WB��Gh�0�@bZ,�+PI�scH�[��/R�LV��/��W�f�T�rPh��|
zP0\�fD�K?z��#���`(�N?V wxQS�3I���0�
�hf�Š�f�����H{��8�~J�����Y{�-1/cr���C�g���c�i�ﺫ0aPI��Q��i�x�W
�&���Z�*��Ⱦ>D;�9����=�@���K���'o�� (�o�6��:v��ֳНZ�k�Q8�	�
;l��ٲ�l��w�۠9:�y8�C(���@�v44��0f>iV2�5
�Ҙ�~����3�IEND�B`�PK�X�j�
�
nymag.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
theatlantic.com
'''
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 NewYorkMagazine(BasicNewsRecipe):

    title = 'New York Magazine'
    __author__ = 'Kovid Goyal'
    description = 'Food, culture, arts and entertainment in New York'
    language = 'en'
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'
    keep_only_tags = [
        dict(name='article', attrs={'class':lambda x: x and 'article' in x.split()})
    ]
    remove_tags = [
        classes('related-stories start-discussion newsletter-flex-text comments-link tags related secondary-area'),
        dict(id=['minibrowserbox', 'article-related', 'article-tools'])
    ]
    remove_attributes = ['srcset']

    def nymag_get_index(self):
        return self.index_to_soup('https://nymag.com/maglinks/nym-home-05')

    def parse_index(self):
        soup = self.nymag_get_index()
        cdiv = soup.find(**classes('magazine-toc-cover-image-wrap'))
        if cdiv is not None:
            for source in cdiv.findAll('source', srcset=True):
                self.cover_url = source['srcset'].split()[0]
                self.log('Cover:', self.cover_url)
                break
        feeds = []
        for div in soup.findAll(attrs={'data-editable': 'settingTitle'}):
            section = self.tag_to_string(div).strip().capitalize()
            articles = []
            self.log(section)
            ul = div.findNextSibling('ul')
            for li in ul.findAll('li'):
                a = li.find(href=True, **classes('article-link'))
                if a is None:
                    continue
                url = a['href']
                h3 = li.find('h3')
                title = self.tag_to_string(h3)
                desc = ''
                teaser = h3.findNextSibling(**classes('teaser'))
                if teaser is not None:
                    desc = self.tag_to_string(teaser)
                self.log('\t', title, url)
                articles.append({'title': title, 'url': url, 'description': desc})
            if articles:
                feeds.append((section, articles))

        return feeds

    def preprocess_html(self, soup):
        if lede := soup.findAll('div', attrs={'class':lambda x: x and 'lede-image-wrapper' in x.split()}):
            if len(lede) > 1:
                lede[1].extract()
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X��;ۡ�
nypost.png�PNG


IHDR(-SPLTE�����������5T�MIDATxڝ�P����g6�n͔?��0��Ql���);q"KO�wWI�5w�����k{R�0����p��W|s�3gy�*�IEND�B`�PK�X�kk
nypost.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
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 NewYorkPost(BasicNewsRecipe):
    title = 'New York Post'
    __author__ = 'Darko Miletic'
    description = 'Daily newspaper'
    publisher = 'NYP Holdings, Inc.'
    category = 'news, politics, USA'
    oldest_article = 2
    max_articles_per_feed = 20
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }
    ignore_duplicate_articles = {'title', 'url'}

    keep_only_tags = [
        dict(itemprop=['headline', 'articleBody']),
        dict(name='h1'),
        classes(
            'byline byline-date source article-info entry-content entry-content-read-more featured-image'
            ' headline--single date meta meta--byline Date published'
        ),
    ]

    remove_tags	=	[
        dict(itemprop=['sharebar-trigger-desktop', ]),
        classes(
            'floating-share floating-share-wrap sharedaddy sd-sharing-enabled tag-list module-wrapper'
            ' inline-module--author inline-module--columnist inline-module--primary-tag'
            ' author-flyout modal__email-author button gowatchit-inline updated select-share__title'
        ),
        dict(name=['link', 'meta']),
    ]

    feeds = [
        ('All Stories','https://nypost.com/feed'),
        ('News','https://nypost.com/news/feed'),
        ('Metro', 'http://nypost.com/metro/feed/'),
        ('Business', 'http://nypost.com/business/feed/'),
        ('Opinion', 'http://nypost.com/opinion/feed/'),
        ('Technology', 'http://nypost.com/tech/feed/'),
        ('Media', 'http://nypost.com/media/feed/'),
        ('Entertainment', 'http://nypost.com/entertainment/feed/'),
        ('Living', 'http://nypost.com/living/feed/'),
        ('Page 6', 'http://pagesix.com/feed/'),
    ]

    def print_version(self, url):
        return url.replace('nypost.com/p/', 'nypost.com/f/print/')

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-srcset': True}):
            img['src'] = img['data-srcset'].split()[0]
        for pic in soup.findAll('picture'):
            source = pic.find('source', srcset=True)
            if source is not None:
                img = pic.find('img')
                if img is not None:
                    img['src'] = source['srcset'].split()[0]
            for source in pic.findAll('source'):
                source.extract()
        return soup
PK�X(BX�--nytimes.png�PNG


IHDR:����IDATx��?(Dqǿ�{R��I�\)�
&72PN�,l�7��ŬHbP,F�l�뮓�޽��}$	m��b����K��������+�*E(
�˒J��ca��76*w-���qt����:*�����ܼNs���������M�	z�=EY�C�-rĀ;��-�'_i�&"����b��]#G�fzd��Imi�Lj��Z�[�&CP��֖�]��������h�1��� K�p�a�D+�IEND�B`�PK�X��-|,|,nytimes.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals
import datetime
import json
import re
from pprint import pprint  # noqa

from calibre import strftime
from calibre.ebooks.BeautifulSoup import Tag
from calibre.utils.date import strptime
from calibre.web.feeds.news import BasicNewsRecipe

is_web_edition = True
oldest_web_edition_article = 7  # days
use_wayback_machine = True


# The sections to download when downloading the web edition, comment out
# the section you are not interested in
web_sections = [
    ('World', 'world'),
    ('U.S.', 'us'),
    ('Politics', 'politics'),
    ('New York', 'nyregion'),
    ('Business', 'business'),
    ('Technology', 'technology'),
    ('Sports', 'sports'),
    ('Science', 'science'),
    ('Health', 'health'),
    ('Opinion', 'opinion'),
    ('Arts', 'arts'),
    ('Books', 'books'),
    ('Movies', 'movies'),
    ('Music', 'arts/music'),
    ('Television', 'arts/television'),
    ('Style', 'style'),
    ('Dining & Wine', 'dining'),
    ('Fashion & Style', 'fashion'),
    ('Home & Garden', 'garden'),
    ('Travel', 'travel'),
    ('Education', 'education'),
    ('Multimedia', 'multimedia'),
    ('Obituaries', 'obituaries'),
    ('Sunday Magazine', 'magazine')
]
url_date_pat = re.compile(r'/(2\d\d\d)/(\d\d)/(\d\d)/')


def date_from_url(url):
    m = url_date_pat.search(url)
    if m is not None:
        return datetime.date(*map(int, m.groups()))


def format_date(d):
    try:
        return strftime(' [%a, %d %b %Y]', d)
    except Exception:
        return strftime(' [%Y/%m/%d]', d)


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class NewYorkTimes(BasicNewsRecipe):

    if is_web_edition:
        title = 'The New York Times (Web)'
        description = 'New York Times (Web). You can edit the recipe to remove sections you are not interested in.'
    else:
        title = 'The New York Times'
        description = 'Today\'s New York Times'
    encoding = 'utf-8'
    __author__ = 'Kovid Goyal'
    language = 'en'
    ignore_duplicate_articles = {'title', 'url'}
    no_stylesheets = True
    compress_news_images = True
    compress_news_images_auto_size = 5
    conversion_options = {'flow_size': 0}
    delay = 0 if use_wayback_machine else 1

    @property
    def nyt_parser(self):
        ans = getattr(self, '_nyt_parser', None)
        if ans is None:
            from calibre.live import load_module
            self._nyt_parser = ans = load_module('calibre.web.site_parsers.nytimes')
        return ans

    def get_nyt_page(self, url, skip_wayback=False):
        if use_wayback_machine and not skip_wayback:
            from calibre import browser
            return self.nyt_parser.download_url(url, browser())
        return self.browser.open_novisit(url).read()

    def preprocess_raw_html(self, raw_html, url):
        html = self.nyt_parser.extract_html(self.index_to_soup(raw_html))
        return html

    articles_are_obfuscated = use_wayback_machine

    if use_wayback_machine:
        def get_obfuscated_article(self, url):
            from calibre.ptempfile import PersistentTemporaryFile
            with PersistentTemporaryFile() as tf:
                tf.write(self.get_nyt_page(url))
            return tf.name

    def read_todays_paper(self):
        INDEX = 'https://www.nytimes.com/section/todayspaper'
        # INDEX = 'file:///t/raw.html'
        return self.index_to_soup(self.get_nyt_page(INDEX, skip_wayback=True))

    def read_nyt_metadata(self):
        soup = self.read_todays_paper()
        pdate = soup.find('meta', attrs={'name':'pdate', 'content': True})['content']
        date = strptime(pdate, '%Y%m%d', assume_utc=False, as_utc=False)
        self.cover_url = 'https://static01.nyt.com/images/{}/nytfrontpage/scan.jpg'.format(date.strftime('%Y/%m/%d'))
        self.timefmt = strftime(' [%d %b, %Y]', date)
        return soup

    def parse_todays_page(self):
        soup = self.read_nyt_metadata()
        script = soup.findAll('script', text=lambda x: x and 'window.__preloadedData' in x)[0]
        script = type(u'')(script)
        json_data = script[script.find('{'):script.rfind(';')].strip().rstrip(';')
        data = json.loads(json_data.replace(':undefined', ':null'))['initialState']
        containers, sections = {}, {}
        article_map = {}
        gc_pat = re.compile(r'groupings.(\d+).containers.(\d+)')
        pat = re.compile(r'groupings.(\d+).containers.(\d+).relations.(\d+)')
        for key in data:
            if 'Article' in key:
                adata = data[key]
                if adata.get('__typename') == 'Article':
                    url = adata.get('url')
                    summary = adata.get('summary')
                    headline = adata.get('headline')
                    if url and headline:
                        title = data[headline['id']]['default']
                        article_map[adata['id']] = {
                            'title': title, 'url': url, 'description': summary or ''}
            elif 'Legacy' in key:
                sdata = data[key]
                tname = sdata.get('__typename')
                if tname == 'LegacyCollectionContainer':
                    m = gc_pat.search(key)
                    containers[int(m.group(2))] = sdata['label'] or sdata['name']
                elif tname == 'LegacyCollectionRelation':
                    m = pat.search(key)
                    grouping, container, relation = map(int, m.groups())
                    asset = sdata['asset']
                    if asset and asset['typename'] == 'Article' and grouping == 0:
                        if container not in sections:
                            sections[container] = []
                        sections[container].append(asset['id'].split(':', 1)[1])

        feeds = []
        for container_num in sorted(containers):
            section_title = containers[container_num]
            if container_num in sections:
                articles = sections[container_num]
                if articles:
                    feeds.append((section_title, []))
                    for artid in articles:
                        if artid in article_map:
                            art = article_map[artid]
                            feeds[-1][1].append(art)

        def skey(x):
            name = x[0].strip()
            if name == 'The Front Page':
                return 0, ''
            return 1, name.lower()
        feeds.sort(key=skey)
        for section, articles in feeds:
            self.log('\n' + section)
            for article in articles:
                self.log(article['title'] + ' - ' + article['url'])
        # raise SystemExit(1)
        return feeds

    def parse_article_group(self, container):
        for li in container.findAll('li'):
            article = li.find('article')
            if article is None:
                a = li.find('a', href=True)
                if a is not None:
                    title = self.tag_to_string(li.find(['h3', 'h2'])).strip()
                    paras = li.findAll('p')
                    if not title:
                        title = self.tag_to_string(paras[0]).strip()
                    if not title:
                        raise ValueError('No title found in article')
                    url = a['href']
                    if url.startswith('/'):
                        url = 'https://www.nytimes.com' + url
                    desc = ''
                    if len(paras) > 0:
                        desc = self.tag_to_string(paras[-1])
                    date = ''
                    d = date_from_url(url)
                    if d is not None:
                        date = format_date(d)
                        today = datetime.date.today()
                        delta = today - d
                        if delta.days > oldest_web_edition_article:
                            self.log.debug('\tSkipping article', title, 'as it is too old')
                            continue
                    yield {'title': title, 'url': url, 'description': desc, 'date': date}
                continue
            h2 = article.find(['h2', 'h3'])
            if h2 is not None:
                title = self.tag_to_string(h2)
                a = h2.find('a', href=True)
                if a is not None:
                    url = a['href']
                    if url.startswith('/'):
                        url = 'https://www.nytimes.com' + url
                    desc = ''
                    p = h2.findNextSibling('p')
                    if p is not None:
                        desc = self.tag_to_string(p)
                    date = ''
                    d = date_from_url(url)
                    if d is not None:
                        date = format_date(d)
                        today = datetime.date.today()
                        delta = today - d
                        if delta.days > oldest_web_edition_article:
                            self.log.debug('\tSkipping article', title, 'as it is too old')
                            continue
                    yield {'title': title, 'url': url, 'description': desc, 'date': date}

    def parse_web_section(self, soup, slug):

        def log(article):
            self.log('\t', article['title'] + article['date'], ':', article['url'])
            if article.get('description'):
                self.log('\t\t', article['description'])

        cid = slug.split('/')[-1]
        if cid == 'dining':
            cid = 'food'
        try:
            container = soup.find(id='collection-{}'.format(cid)).find('section')
        except AttributeError:
            container = None
        if container is None:
            raise ValueError('Failed to find articles container for slug: {}'.format(slug))
        for ol in container.findAll('ol'):
            for article in self.parse_article_group(ol):
                log(article)
                yield article

    def parse_web_sections(self):
        self.read_nyt_metadata()
        feeds = []
        for section_title, slug in web_sections:
            url = 'https://www.nytimes.com/section/' + slug
            try:
                soup = self.index_to_soup(self.get_nyt_page(url))
            except Exception:
                self.log.error('Failed to download section:', url)
                continue
            self.log('Found section:', section_title)
            articles = list(self.parse_web_section(soup, slug))
            if articles:
                feeds.append((section_title, articles))
            if self.test and len(feeds) >= self.test[0]:
                break
        return feeds

    def parse_index(self):
        # return [('All articles', [
        #     {'title': 'XXXXX', 'url': 'https://www.nytimes.com/2020/11/27/world/americas/coronavirus-migrants-venezuela.html'},
        # ])]
        if is_web_edition:
            return self.parse_web_sections()
        return self.parse_todays_page()
PK�X�ؤ��nytimes_cooking.png�PNG


IHDR  D����PLTE�=&����������������?(����>'����@)�[H�~��?)�@*�B,�C-�WC�>(�B+�����wg����u�^K����m\����n]�o^�q`�ue�qa�rb�G2����A+���{k����������`M����T@����������������dR�cQ�fS�hV�F1�L6�L7���O:�zj��������iX�YE�P;�]J�]K������������Q=�S?����������x�I4��UA�������»�ü�ý���ſ������dQ���������XD��yi�yj�xh�F0��������VB��J4펀�D.����������H3�{l��|m�~n�s�t�I3�u����������='�sc�z�{�|�td�vf�J5���������]<{d~IDATx^͑c�$A@3�5���m۶��m��/���ح��������Up<��dBt<(�]���֗��K#'�,��(����Պ
$��9�=v�:���UHs����F���� ����L���=/�mO���	�2���5D�h��:��N�u'�|]-��,���m�oCv��A"Y�d�R�E���2"�9s����\������c����N<�W!�/�)��ău���\&�$ ������A��G�`H�ń�h��#JJ��i��
�ò�k� 3���o�����H7�8�@4��ŵV�h+U<؃[���y�*�2���h�z���)h�"=���9� �!�Q���yH�5d�����_�>��_IEND�B`�PK�X��]��nytimes_cooking.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe, prefixed_classes


class NYTCooking(BasicNewsRecipe):
    title          = 'NY Times Cooking'
    description = 'NY Times Cooking Magazine'
    __author__ = 'gourav'
    language = 'en'
    encoding = 'utf-8'
    oldest_article = 2
    max_articles_per_feed = 30
    remove_attributes = ['style']
    no_stylesheets = True
    keep_only_tags = [
        prefixed_classes('pagecontent_recipe-wrap__'),
    ]
    remove_tags = [
        prefixed_classes(
            'adunit_ad-unit__ recipeintro_tools-block__ notessection_notesPrintLayout__ notessection_notesSection__'
            ' ratingssection_ratingsSection__ ingredients_buttons__'),
        dict(name='source'),
    ]

    def parse_index(self):
        url = 'https://cooking.nytimes.com/topics/what-to-cook-this-week'
        soup = self.index_to_soup(url)

        articles = soup.find_all('div', class_='card-info-wrapper')
        feed = []

        for i in articles:
            article = {}
            article['url'] = i.find('a')['href']
            if article['url'].startswith('/'):
                article['url'] = 'https://cooking.nytimes.com' + article['url']
            article['title'] = i.find('h3').text.strip()
            author = i.find('p', class_='card-byline')
            article['author'] = author.text if author is not None else 'Unknown'
            feed.append(article)

        return [('Recipes', feed)]
PK�X1<�4$$nytimes_sports.png�PNG


IHDR00�`n��IDATx���$���۶m�6om�m۶m۾[ֳ���^~on}�}쨘���u旕��=��B,t��H�[-g��]�
ӄ�+;*�Q���<TV�ڑ����;��r\Ρ0WTY�V�Ƹ1����MH�0�^*�a�a�t����{#�>�fh�Mо)�nF�g0�O읅H�� �8:=
�{��@�	��R6Y��طn����ex��q����@AG�vn@�W��98�lD!���(=�FL���B�����0��J2�o�
���u��²����k�<PZdf��,�H?���)��8�����F���?����)��ENj�DYz,2s�;��Z���A�pt9J
QZ�����(@"8�}^Ê�$;�Q㋁6�{d3��4���r�NoB�I�Q4�"��,L����툂d�b�Who�x�0��H@g60ԭ��
�MǨ/a����o6z������l~���u��[ �`u��?��o��.2;�5��x��z�]�������No@y���rS��)Y5���Q�c�3�:�*EԼ}�獉b�D����_���ꦴ��P�H����T������>�� �a�o���f5��8!�п�q�6��?dI�a�3sH���� P�e,f�3��5�;�w�][��[���"|�u���3̾1U-�4���0���@N
J�����[��+̸��:R�1�kV�b����)�z]�>G\�ĉU����V�mkSuƭ������(�7�>T��xpF��SL�q�;�
�*�,�
\P��0�OL��۴?1�/���
P�70�w�_����045���M�t�]I�t.��Ԯ=���dQ��+��2�W;�I�v��XԿ;�b��M��/���X�i�����e�+�Z�m�����c�8��BO��&�%`�ä�5�r�!��R1���5�%��M�1Q��K�N	؆�31�k^����p���^�.O���80W"���~��I2��@�J��0W�J�1�J�T��
!�$G��9����o#� �Yr��"%�#nw �_�J$舄��"I6`�GX;X��0G*�%)\��`�GحK��v����1��*@��ĝG|��s�1���Ծ٢Yiax܋]3w`�>�X;��]?�����~"�$#}�P�ʅ#�a�Ҷdz8�Or3�!�=�>ƅ��A�W0�]~���2���UI����X	X��@�8���$��H%vN���`�'�C�o8�t{)�5��)��()��&��g+!�~�!ݧ��e%!D���,;�ۢ��������RZ��Uص!���I��u�ԙ��O��_��a���KJ����L�Q�se�ọ@�>A{��&:�+e�\��W�B�i����M�|	<DŔb෰}�h�S0�'
�N����	�Y�\}��G���^u�G�MR^�7ijY7��{�����A9XEC��7��j;��>�Ӿ-��!�4[��������_�1��n�ޮ���z�����η���Kn��e����ƗVN��Hy)6���.�����Ğ��>ʙ���륒���_�Q��{j�0��)y��4��	?��O��#�D�	��ȿ��QK9���w�T�`�XN�˔��-YQ��-�H�6Qo��Q켓m�j;����x�Us���.�p�;�h�hՔL.��.j��v���w�Ywu�ck8?4xq�똦��g������El�V|3IEND�B`�PK�X���((nytimes_sports.recipe#!/usr/bin/env python
# encoding: utf-8

from __future__ import with_statement
__license__ = 'GPL 3'
__copyright__ = 'zotzo'
__docformat__ = 'restructuredtext en'
"""
http://fifthdown.blogs.nytimes.com/
http://offthedribble.blogs.nytimes.com/
http://thequad.blogs.nytimes.com/
http://slapshot.blogs.nytimes.com/
http://goal.blogs.nytimes.com/
http://bats.blogs.nytimes.com/
http://straightsets.blogs.nytimes.com/
http://formulaone.blogs.nytimes.com/
http://onpar.blogs.nytimes.com/
"""

from calibre.web.feeds.news import BasicNewsRecipe


class NYTimesSports(BasicNewsRecipe):
    title = 'New York Times Sports Beat'
    language = 'en'
    __author__ = 'rylsfan'
    description = 'Indepth sports from the New York Times'
    publisher = 'The New York Times'
    category = 'Sports'
    oldest_article = 3
    max_articles_per_feed = 25
    use_embedded_content = False
    no_stylesheets = True
    language = 'en'
    delay = 1

    feeds = [
        (u'The Fifth Down', u'https://fifthdown.blogs.nytimes.com/feed/'),
        (u'The Quad', u'https://thequad.blogs.nytimes.com/feed/'),
        (u'Slap Shot', u'https://slapshot.blogs.nytimes.com/feed/'),
        (u'Goal', u'https://goal.blogs.nytimes.com/feed/'),
        (u'Bats', u'https://bats.blogs.nytimes.com/feed/'),
        (u'Straight Sets', u'https://straightsets.blogs.nytimes.com/feed/'),
        (u'Formula One', u'https://formulaone.blogs.nytimes.com/feed/'),
        (u'On Par', u'https://onpar.blogs.nytimes.com/feed/'),
    ]

    def preprocess_raw_html(self, raw_html, url):
        if not hasattr(self, 'nyt_parser'):
            from calibre.live import load_module
            m = load_module('calibre.web.site_parsers.nytimes')
            self.nyt_parser = m
        html = self.nyt_parser.extract_html(self.index_to_soup(raw_html))
        return html
PK�X(BX�--nytimes_sub.png�PNG


IHDR:����IDATx��?(Dqǿ�{R��I�\)�
&72PN�,l�7��ŬHbP,F�l�뮓�޽��}$	m��b����K��������+�*E(
�˒J��ca��76*w-���qt����:*�����ܼNs���������M�	z�=EY�C�-rĀ;��-�'_i�&"����b��]#G�fzd��Imi�Lj��Z�[�&CP��֖�]��������h�1��� K�p�a�D+�IEND�B`�PK�X���},},nytimes_sub.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals
import datetime
import json
import re
from pprint import pprint  # noqa

from calibre import strftime
from calibre.ebooks.BeautifulSoup import Tag
from calibre.utils.date import strptime
from calibre.web.feeds.news import BasicNewsRecipe

is_web_edition = False
oldest_web_edition_article = 7  # days
use_wayback_machine = True


# The sections to download when downloading the web edition, comment out
# the section you are not interested in
web_sections = [
    ('World', 'world'),
    ('U.S.', 'us'),
    ('Politics', 'politics'),
    ('New York', 'nyregion'),
    ('Business', 'business'),
    ('Technology', 'technology'),
    ('Sports', 'sports'),
    ('Science', 'science'),
    ('Health', 'health'),
    ('Opinion', 'opinion'),
    ('Arts', 'arts'),
    ('Books', 'books'),
    ('Movies', 'movies'),
    ('Music', 'arts/music'),
    ('Television', 'arts/television'),
    ('Style', 'style'),
    ('Dining & Wine', 'dining'),
    ('Fashion & Style', 'fashion'),
    ('Home & Garden', 'garden'),
    ('Travel', 'travel'),
    ('Education', 'education'),
    ('Multimedia', 'multimedia'),
    ('Obituaries', 'obituaries'),
    ('Sunday Magazine', 'magazine')
]
url_date_pat = re.compile(r'/(2\d\d\d)/(\d\d)/(\d\d)/')


def date_from_url(url):
    m = url_date_pat.search(url)
    if m is not None:
        return datetime.date(*map(int, m.groups()))


def format_date(d):
    try:
        return strftime(' [%a, %d %b %Y]', d)
    except Exception:
        return strftime(' [%Y/%m/%d]', d)


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class NewYorkTimes(BasicNewsRecipe):

    if is_web_edition:
        title = 'The New York Times (Web)'
        description = 'New York Times (Web). You can edit the recipe to remove sections you are not interested in.'
    else:
        title = 'The New York Times'
        description = 'Today\'s New York Times'
    encoding = 'utf-8'
    __author__ = 'Kovid Goyal'
    language = 'en'
    ignore_duplicate_articles = {'title', 'url'}
    no_stylesheets = True
    compress_news_images = True
    compress_news_images_auto_size = 5
    conversion_options = {'flow_size': 0}
    delay = 0 if use_wayback_machine else 1

    @property
    def nyt_parser(self):
        ans = getattr(self, '_nyt_parser', None)
        if ans is None:
            from calibre.live import load_module
            self._nyt_parser = ans = load_module('calibre.web.site_parsers.nytimes')
        return ans

    def get_nyt_page(self, url, skip_wayback=False):
        if use_wayback_machine and not skip_wayback:
            from calibre import browser
            return self.nyt_parser.download_url(url, browser())
        return self.browser.open_novisit(url).read()

    def preprocess_raw_html(self, raw_html, url):
        html = self.nyt_parser.extract_html(self.index_to_soup(raw_html))
        return html

    articles_are_obfuscated = use_wayback_machine

    if use_wayback_machine:
        def get_obfuscated_article(self, url):
            from calibre.ptempfile import PersistentTemporaryFile
            with PersistentTemporaryFile() as tf:
                tf.write(self.get_nyt_page(url))
            return tf.name

    def read_todays_paper(self):
        INDEX = 'https://www.nytimes.com/section/todayspaper'
        # INDEX = 'file:///t/raw.html'
        return self.index_to_soup(self.get_nyt_page(INDEX, skip_wayback=True))

    def read_nyt_metadata(self):
        soup = self.read_todays_paper()
        pdate = soup.find('meta', attrs={'name':'pdate', 'content': True})['content']
        date = strptime(pdate, '%Y%m%d', assume_utc=False, as_utc=False)
        self.cover_url = 'https://static01.nyt.com/images/{}/nytfrontpage/scan.jpg'.format(date.strftime('%Y/%m/%d'))
        self.timefmt = strftime(' [%d %b, %Y]', date)
        return soup

    def parse_todays_page(self):
        soup = self.read_nyt_metadata()
        script = soup.findAll('script', text=lambda x: x and 'window.__preloadedData' in x)[0]
        script = type(u'')(script)
        json_data = script[script.find('{'):script.rfind(';')].strip().rstrip(';')
        data = json.loads(json_data.replace(':undefined', ':null'))['initialState']
        containers, sections = {}, {}
        article_map = {}
        gc_pat = re.compile(r'groupings.(\d+).containers.(\d+)')
        pat = re.compile(r'groupings.(\d+).containers.(\d+).relations.(\d+)')
        for key in data:
            if 'Article' in key:
                adata = data[key]
                if adata.get('__typename') == 'Article':
                    url = adata.get('url')
                    summary = adata.get('summary')
                    headline = adata.get('headline')
                    if url and headline:
                        title = data[headline['id']]['default']
                        article_map[adata['id']] = {
                            'title': title, 'url': url, 'description': summary or ''}
            elif 'Legacy' in key:
                sdata = data[key]
                tname = sdata.get('__typename')
                if tname == 'LegacyCollectionContainer':
                    m = gc_pat.search(key)
                    containers[int(m.group(2))] = sdata['label'] or sdata['name']
                elif tname == 'LegacyCollectionRelation':
                    m = pat.search(key)
                    grouping, container, relation = map(int, m.groups())
                    asset = sdata['asset']
                    if asset and asset['typename'] == 'Article' and grouping == 0:
                        if container not in sections:
                            sections[container] = []
                        sections[container].append(asset['id'].split(':', 1)[1])

        feeds = []
        for container_num in sorted(containers):
            section_title = containers[container_num]
            if container_num in sections:
                articles = sections[container_num]
                if articles:
                    feeds.append((section_title, []))
                    for artid in articles:
                        if artid in article_map:
                            art = article_map[artid]
                            feeds[-1][1].append(art)

        def skey(x):
            name = x[0].strip()
            if name == 'The Front Page':
                return 0, ''
            return 1, name.lower()
        feeds.sort(key=skey)
        for section, articles in feeds:
            self.log('\n' + section)
            for article in articles:
                self.log(article['title'] + ' - ' + article['url'])
        # raise SystemExit(1)
        return feeds

    def parse_article_group(self, container):
        for li in container.findAll('li'):
            article = li.find('article')
            if article is None:
                a = li.find('a', href=True)
                if a is not None:
                    title = self.tag_to_string(li.find(['h3', 'h2'])).strip()
                    paras = li.findAll('p')
                    if not title:
                        title = self.tag_to_string(paras[0]).strip()
                    if not title:
                        raise ValueError('No title found in article')
                    url = a['href']
                    if url.startswith('/'):
                        url = 'https://www.nytimes.com' + url
                    desc = ''
                    if len(paras) > 0:
                        desc = self.tag_to_string(paras[-1])
                    date = ''
                    d = date_from_url(url)
                    if d is not None:
                        date = format_date(d)
                        today = datetime.date.today()
                        delta = today - d
                        if delta.days > oldest_web_edition_article:
                            self.log.debug('\tSkipping article', title, 'as it is too old')
                            continue
                    yield {'title': title, 'url': url, 'description': desc, 'date': date}
                continue
            h2 = article.find(['h2', 'h3'])
            if h2 is not None:
                title = self.tag_to_string(h2)
                a = h2.find('a', href=True)
                if a is not None:
                    url = a['href']
                    if url.startswith('/'):
                        url = 'https://www.nytimes.com' + url
                    desc = ''
                    p = h2.findNextSibling('p')
                    if p is not None:
                        desc = self.tag_to_string(p)
                    date = ''
                    d = date_from_url(url)
                    if d is not None:
                        date = format_date(d)
                        today = datetime.date.today()
                        delta = today - d
                        if delta.days > oldest_web_edition_article:
                            self.log.debug('\tSkipping article', title, 'as it is too old')
                            continue
                    yield {'title': title, 'url': url, 'description': desc, 'date': date}

    def parse_web_section(self, soup, slug):

        def log(article):
            self.log('\t', article['title'] + article['date'], ':', article['url'])
            if article.get('description'):
                self.log('\t\t', article['description'])

        cid = slug.split('/')[-1]
        if cid == 'dining':
            cid = 'food'
        try:
            container = soup.find(id='collection-{}'.format(cid)).find('section')
        except AttributeError:
            container = None
        if container is None:
            raise ValueError('Failed to find articles container for slug: {}'.format(slug))
        for ol in container.findAll('ol'):
            for article in self.parse_article_group(ol):
                log(article)
                yield article

    def parse_web_sections(self):
        self.read_nyt_metadata()
        feeds = []
        for section_title, slug in web_sections:
            url = 'https://www.nytimes.com/section/' + slug
            try:
                soup = self.index_to_soup(self.get_nyt_page(url))
            except Exception:
                self.log.error('Failed to download section:', url)
                continue
            self.log('Found section:', section_title)
            articles = list(self.parse_web_section(soup, slug))
            if articles:
                feeds.append((section_title, articles))
            if self.test and len(feeds) >= self.test[0]:
                break
        return feeds

    def parse_index(self):
        # return [('All articles', [
        #     {'title': 'XXXXX', 'url': 'https://www.nytimes.com/2020/11/27/world/americas/coronavirus-migrants-venezuela.html'},
        # ])]
        if is_web_edition:
            return self.parse_web_sections()
        return self.parse_todays_page()
PK�X�Fd&&nytimes_tech.png�PNG


IHDRKK�,�%�IDATx�tN�a�@���Hyw1���3�-f�
���{�D���"����D�͚��B�s`;u��κ'��s���4���c�j��\��ȵ|�~>Z��.�a���|A�?��-�C�k=7~��P�W�����%M��!t���
�ٶm��m���m��"f�|3k�r�VUV�w���:~���h=�יUY�9'"���C
�%U�ޏ���۷o׮]���իw��r���6�Ѐ2�`��������u]۵>,��u��V���ɱ�#f	B�	�{���FiB�
-���gΜٸq���{T}<^�X<��/Vx
�1 �BPL��w]���_��l
�a�:�C�?p�3�0x�c�����(ˉ�"JVC|'w�,�5k���W�jf���,��JF��'� �cW~�bH>����Հ�g>v��=�A�O�B�D�r�TU�ui�ަ�Um�%��޾{�����;�9��T�;e�@тF�M���t�P���^q���y�C��䓀)���ԭ�7�|xc<�g9P�a=5��X�����rȲ�;a%(���{
H��s��� �q�sG��Ƃ�Wu���eFr#��t��O�(d0E��
�9�
�{_][
�PE$�k��d9o����Gb�%��4G�pz��x>����:|�[́O���
����;����9d��'��pzf�F?�i�`���o:t(I�坫�z�s�ޝ�w�ر}��8�V_��JB
g��m[K�4�j�ko,���}����Y���͔�KAZ����O����O�2�T��m��սfA��N�5e4	�\%��)F�j���-;G�I �s"M e�"���|���jW��$�!7��i�]L�=�����)�s�hO�s��v��g�@�0̃@�� n�cf�N�ںuk�r*AP�����G��b�+01$P5���Ǻ{f
9te֢}�9�۔��p4m�}k+��SC`jj��a�c�B���x���{N>nY��P�S��x����9 ��c+�w�x���L�M}0#(��Ԕ:�PΨ�7o63max�g�g�y��x�@P�haJp���?�t<��f��{ߴ��ƹ% �<��-����
6��s��#��^��|�SLDP���+�?�9��<G��X�_��������bF!1�F4T1�y��|˖-�j�H�P�!hx���/no���y���m�J�nx��1SDf`88rǐ?�h�g�.��x�mI0b�
�z�Vj�B"�G����|
`��j#x��:z�H`K�}3�;:�RJ����AṢ��O����l���~POH��T�Um=�ok:4��Ԣ��r���a�����Pqi���o~��;��S��Q�S�h�U�$�
CFΉ}W�w�&(�R�S$BB�
x͞�7m�5y�[��ccce�n���/�Dk
sUC.7�
 cGz�y}�'��c`ſ`�ҟ1���7W~���ZJ�#�/�0��I���w�>Px7:�N?��m�g?��?~��;}�x��v�(����^ew�3g���>����'���?��{�xs��L�(@����̈
����WO�Ӂ�,��_ɡ�H���G�t��??"P0fQ���1�+�fDEW�o�{\U���}i�G�QG�A�n�n����TL��K�X4*a㈅0tDž{���>��o��Ż�s��>�Yk?k�gm�
JS�c]�C<��:�m���x��Y�]�ho���xBbܽ{!4{��[����&���]�|�%����ocdJ���-哴�g�P����ǟf��
�]|�ed��?1:���{���	����Ie'��y–Q��G�a��8Q�}��!�3ee�e%/��)��9�=ݽddd��DH�N��qۿ��˗������T*"��3���������ϿV6�)��Qٸ��vQi���ˊ��_��nX�vc���p��Gހkӡ>�����/?X�����a�O�I���MGy���Eiy|��_eg�P���V���%�T�or҃�����,--����
i�p�� Q1����ͽI�m�翶7v7����E4�E�ٖ08T�y!�Z�C8���*l�{��A>Yn

�����}��Cs9O�)Os[wUM����n�W�r;��vAoۻ���}��:�˻�5�{v<*J�uMII��pr�r2�4�Z�iźm���������$6Ғ�f�l�4B"0�=���
�B$ͼ����z&F��Â��7odF�5��w��y�
�=BX�#A�@�+WA�gט����Ez���N��-7k��ݻL�.�d���r�K�?7�w�Y��ܶ�r6PX�t���K^>�A��v�6m=z���������
�����&&&�W����t��������������mJB~�W^_�m.����nߊ��_�f���i��`�[�����1�; �{�؂2��C-�����ӧ�1�F֧UWk�Tֲ�w(.}���1659�����rP������R/gۘ�8����~��e���:�X��y���$�Ϟ=����`W�\������v�RЖM{���3h�ٳ��ݑ���ʾ+a���c�����j�Μ�p��֞u�!y��;��a��jH�`"�aK�!����O|�f�������������"T�q��Sz�^��nN�v���>A��~?�3YF�B�C�ڪ'Ν	���ƍ�([�l�4	(1��3gnݿ-.+��͓�55%'Ν�&--��
EEŰ��ϟ?'$$�zp��yxRMM�{y����ba�I�4YĜґ�7�6}ؚ�)��x�G�NQʫ_�g�o�c�C�aW�ڂ��`�B�%L�������f:��t�y�f��x�r�bQ	ĐQVPps�~^W+����t�Λ1m
�h�$))y��i𗌌 O��<�n�v<w��p��I��K��y�O#9�`Fx�̙3˖-#�����:;;'%%�����`QQ��^��S�D�3��>�Þ?w�n��}��։ڪT\S!,����������?���}�����|^m�K}ı��� +K�Ka����y�o��:��?d.?׊yg}�MX�������������…B˗/
ΊN�,���t?�fQ�ۭ��F�46�_�x�s�c���:�`��@K>>>������
A�_@��Ŕ\�T�/���e�@Ğ�T{~�1n���K�O��q�$L>�4\�q�z�[�㘙���E���N��Pw�6g��J��dĄ;�p��Ǽ��W,�\=�Q���!�B��q�vm`���>}:BHZZN �â
013���x�x�@NJ滗Θ1c߾}P�A~'rrraw���%`Ph1D|H|��e�ǭѸ�~��p�W����?}�=}����2.jxC��˜=��: :�2L�%��n�Щ6¤Ֆu�^��>��[���^v��v<��IU��;�b�O���I�!"�ڵkA݀�.죪����J�S�/�'Oڷg�U����t�Uww��/Ο?n���#	�Bqrr��Ѓ�/Y���c��xt��G����/��{���;��g����ka����Bޗfކ��IU)!ҹ8ڜ9u�r`\�8
~F�.;l�Iz�gN����EQ*b2ĘL����se���;q����6���p�F����<\%�ŋ��i<�{���hh��)-.��
�<�\�pG�L&��6����J�덍�Q��Ξ�dW���[�<�	b& !j6��g���%!$
�FG�nWŔO��I����&N�KP���7m�BC0Ğ%������țۘ��b���om���B�ͼ��Q��l�ƍ��'�@��İ57�*/o�R��qI~ZffbZrlb�����$ߒGXx�?�f����bbb�����%\;��@���䍑� )��U�B���Sd��A�h�s^����qo�? EgcOgI<t�����)���@8�5��S���=�BE����Q�>Ae��R��M�6��!�3 ���ۃI���~Y��ʦ��(#������ɍJJ,(�6��_\��G[[[8Ι3����F_?���ԼW���)���\�U�|&��1�԰���Q�NV7
�Eɕ6Wq�a��N���]�w�*�޽��S�+�� ��A�����`u�X��H��L/��"����lbl}��1�H��[��’ٹ9	q���G�I�&��HT��M*J�E"w%��늧��G9zq�6��9&���/��A��j�ƅC|0#!����C�I��((��K�:�`:KY[s`\��4o��m
�n�F�`�Q1'�[Z ��8���70�q�ʕ������t����T֔p2S�9ɏ�r
T9r<���۶msp�q��|�s���􄄸�O���p8󛇊�*�����X��#C`X�L���|(�^�z����(t��������׆G��4}B���t�Awn����>(vLM�18:�-)�h����B�Ŗ\�ASMC��'�RX��O�2�29yi��y+V�`C\\�aII	89�&�AgTV�()x����}��s�+W���pι���~��5>-�}x*�
0�₯l��6���(����K���Ζn�h��	��C�*���i[&��������~�E��hT�F3;�7t&C����BEU�J#Y�
nH�!�{'%��$g������Ā
O�:��4�C�����hE��霔����Ԝ���������}/[yu�ߡ�'��~�;B�+�ELCP��=���'��-�~��Eţ"D�����%�Έ�u�ڵ��{v٘Yz�k((O���k�*�LKD]m���6P�Xq0*+z�������2/� --za$��|�W��PWV�~�,)5.;���V��u�N�f�����.����q󄰯Q8΅2�!�0��/�P2�
 ����D� {��f�,��`
���,�0�5�{��ٓ%%���{������l6 05�7�R�f��I�2�t�O���=-+���40:5s�,:]�ɞ={��a��L�C"��wY��Ԅ�\NN|r���va�䇳Vw��U!�*v�2���4K�p3��!����*�cb���)3�;f�e�޴��
i�r�޴׻�^�����`���ld�7u�t0���:5U--E��\d���ǹV[]�j�&?�̩3�v�	)�5�v3CZC�
]UK�a!4���J��^���C�D\؏&�iԼl@��C��&p���ˍ�p�e���<֨s�)������R/]	�����1��N)��%�v�m�1���W����EC]Xns��C������'\�d?p�k�U�9�����:Z8w��Y�e�''_��K�YfFFF��2ӭ�-��w�<&"*5���d���[�8��uzo���
�W>��뭣�N��/�'!c�#�$��;�	��у�,
�Ơ�i�oڲ*)��{wg��?���;�:i���yrB��u���5bP�H�Ť�ť�]���~Z��_��*���n�٠��ɮ��>1�UTT UPVV�����@<��VWC�Whl@4qD�I"�Q�T�8}�u�0�o�Ǟ��Nj9�5�l���?�P�ۏ‘A ɱ���}�������@с9�3���IsW3��421���p�aۖ�a!�Ϟ쏷�|M�H��C��e딙l���!��f}�
s��6�t*��s�4�Akh\�����7X������$s’ۻwohhhjj���6d�RL�{�C|2x��m���p�O\��!�	پ�$���տ�kD/�W��$�?��������cͅ�7�
� ������5B��ƒ��	UEC}��u�>���Orѹco��v`#�7{k
f*���U��s��Fz�@�iF�;�WmD� �� $�'�A��`F�o�Ү6�"�a�I.[��77|����Ks���*^�w<B��$JhTm/��:����+��7�.iK0�T���`I�y666s)Sa�Jeu��׍�<�[�
25���gvP��J��"1�6�U{��~��Kv7P��Pg�:mE
��!IC�Ԓ$`H���T�,��{nF�1��k8iR_����j��?ޒ�#���@�V�����pĦ��pl�	�?	�rFK��<��5<���)���o˗�ܻg��9AY7���<�|���7W{6��S-���X���M����ш��]��y���r�^	�${K��8�Y�nݚ5k�l*YL!�譸X�����mزBH����%�_\
8�G��j*�_1b^$�x��G�;H�|�dN7�ͅ��)���rr=>x� e�Z�S e��ճߖ]J��v��ɲ�Eζ��b���M�^K��wiw�m�f}�����fm��a��\�Da���`q��q��I����`¢��ݝ]p(���EYp����4�7�	L	� ��gE��%)��e�8aE��V�����ļ�HB2k#c+�͛7�����N¤mMU���s�����V��3����/Ν������f���Y�M���9߹y��h����G����I��psS�'/��B��-�H�������x��"b �P6��~j@�q�&�2
`|�.F
��p�
,�m{��@>D|��";Jü��ZlX$T������	���Tzɩ)��̆�u��pL�3�d1E�<t��_d�,L�#S:�R,���8IbI���TP��y����1uQT���
8��
�ԓG��/���
�d0ٺ�&T���)��^�"$BF<���I��*�7}��Gn�t:�6j*!:,,��I��v�p����c\�urvu�3q�����J#��>���%����7lٺ~�o�}�ʚe�"Hr@�d��ۙ�%���
\ۢE��xH�ffv�:�2�R		I�p%��0A^��k��ށ�	�SY���f22p%T{���,�(�(���H���
ugw���0 ��;5
U%5Mx955T�4U�߫'RU�PQT�����N���@4,*%%���L�6c�9�ˏ<5�~�^u�j�KG�/(�!X���nG]۫s
�Ϛ�B=8�u���vv&"�@�h��M�mJ�	CQY
XNEc�*e%�T��������ɠ���ۡ��m��B0��-R;a\��0
���@/'ݕ8���:ڜ�MA9�}]4��ߍ���7�}˟���=��e�"�>����Ɔֻ��N�2�Sp�`e�/׋!2���q���;�殽�j�@TQD�I�j�u��Z��߆[�e���ʵ3]e|Ө���ȼ�����=(,�K�Z�N���S}��O>ȏ�.�N���WK�mgfd�7����ރK�緬?p�k�-��W)m�_��š=��Nb��)"��,XIT�zhd��qX�X�����X��������4{��_��7/|@
+���V\>�k@����@��_�>4$��-��}ru��z���2ᅫp�,*�>��ֻ,�M7�w�^=tx�oU��99$��A��[��rS�|�X��v�[� �MY��7�ΟG�ܺB��T55մ��Se����m`o��Y��
+�݀�<JN�G�
9��9
w�ޭ�Z�Kӎ���&�G���Y\?�_G82�
 �������FnQQQb3Ő��@mݮ�7(❘�g�'�W5���I.V�1�>�d�/��.��G�����n��9s�%77�%�D)����b+еV��Ft�	�Vgs���2
����W�oD}i�����ur[�~�����!���\���vK��mv����Ё�L�ŘHz��Qn�kB�
���q	�
�F8ݠC�pp�O��'tF��S?��~s7��d��쩢��j��RZ%
o���~�x~!UȤZZZ��"�V����{�h��-h��Զ��Ż�I�KL��!cKvw��hv���O1�`�MGt�P�=�E�/P�ˊ.�i�$#�DU֘Y]�t$[b�L��^��Vw��j�%T�����fCkE}��;z�럽3J^�vi
)采�C���I;��}�ThiIl%7�4�<��
Bpr2��|�{�>���t��q�:���Ĕ�	W'�!{��"����P=����]NA*�q�
�5;��{uB�:��^��vZo��F�@9,
�c�P(���F�֭�S���eP���+�Ӈ1m�4�!;%�X鵶�pS�P���\�yF�o ��� �=M�J8w��yz�oj���B*W�)�-��Y��?}V����)9+!�~A���6�
zlg�zN�X�IQ1āK%E� П�u�{#�|���${�{+���$H�$��H�
�L�#���P���h�%�-���z�(I�v�A�H�qq%����?��Ey���{�DE�	��#55���‚G-���P�q�ɻ�{��HL�y3��2C��4[�v��m�j��\0$�@i�P����u]2��Kv��7�a@	G0a�*���&]v�	ZƄ���Y�\k�l�Ę��yɹw��e&�p�쌜�j�s|?\��ֹ��+��_��i+�@WDe�۽+*�V��X�T��]qP�AVDĘ2eJiٳ!�lj2�� ����`(W�M�����o�8`�q��na�`HSc-B@�43�����l8�
��E?��0����Ǖ`k3#IIi�,|���2o�g^��'��-'���@z��
~h�B��,�&��>D�-��ſ�c�_T��%�?|�����p.�<�{{�U�]�U���W�p2���L,���r��L��,rXL(�wƸM��iq<�Ʌ�����']�]�A�/_���8�� ��$L��
���r�ߤ�?C��C�*�-,���D�jj�C�[���͌��K74�d��\1Ĕ�~[��Ơ"�S
�AA�?�/Bw_�˶xC�<��.�:�d���������m�_G��P��ٕ���a�^.�S	z�N�1ȇ0�������7ٞdv膹Orx�����&Y2���Ev��pD��*b���7+�;�n��2s����xlb�.B�����]�߫R�L늤DP>A�.i�_K�6v�O
H�-��������>�#������f�^�b����3lmz[��~Yi���=���{3�` ���֒�%�d7m���h��B��˯S��ݼO3�\���O2�f_�^)�̠e���z��
#��� B�'��|G���s����cx���d�?>u?�`�,�����.ay�F��!K_��+���	��h�Q����Y���>A�eΙ_��]��Rr�����oG�~?y�@x@}�Y1%�|��IEND�B`�PK�X���V�	�	nytimes_tech.recipe#!/usr/bin/env python
# encoding: utf-8

from __future__ import with_statement
__license__ = 'GPL 3'
__copyright__ = 'zotzo'
__docformat__ = 'restructuredtext en'

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 NYTimesTechnology(BasicNewsRecipe):
    title = 'New York Times Technology Beat'
    language = 'en'
    description = 'The latest in technology - Gadgetwise'
    publisher = 'The New York Times'
    category = 'Technology'
    oldest_article = 14
    max_articles_per_feed = 25
    remove_empty_feeds = True
    no_stylesheets = True
    language = 'en'
    feeds = [
             (u'Gadgetwise', u'http://gadgetwise.blogs.nytimes.com/feed/'),
    ]
    keep_only_tags = [
        dict(id='story'),
    ]
    remove_tags = [
        dict(attrs={'aria-label':'tools'.split()}),
        dict(attrs={'aria-label': lambda x: x and 'New York Times Logo' in x}),
        dict(href='#site-content #site-index'.split()),
        dict(attrs={'aria-hidden':'true'}),
        dict(attrs={'data-videoid':True}),
        dict(name='button meta link'.split()),
        dict(id=lambda x: x and x.startswith('story-ad-')),
        dict(name='head'),
        dict(role='toolbar'),
        dict(name='a', href=lambda x: x and '#story-continues-' in x),
        dict(name='a', href=lambda x: x and '#whats-next' in x),
        dict(id=lambda x: x and 'sharetools-' in x),
        dict(id='newsletter-promo supported-by-ad bottom-wrapper'.split()),
        classes('story-print-citation supported-by accessibility-ad-header visually-hidden bottom-of-article ad'),
        dict(attrs={'class': lambda x: x and (
            'SectionBar' in x or 'recirculation' in x or 'ResponsiveAd' in x or 'accessibility-visuallyHidden' in x or 'RelatedCoverage' in x)}),
    ]

    def preprocess_html(self, soup):
        # Add a space to the dateline
        t = soup.find(**classes('dateline'))
        if t is not None:
            t.insert(0, ' ')

        # Remove empty li tags
        for li in soup.findAll('li', attrs={'class': lambda x: x and x.startswith('css-')}):
            if not li.contents and not li.string:
                li.extract()

        # Ensure the headline is first
        h1 = soup.find('h1', itemprop='headline')
        if h1 is not None:
            h1.extract()
            soup.find('body').contents.insert(0, h1)
        return soup
PK�X�����nytimesbook.png�PNG


IHDR  �s��IDATx^��]lTE����ݖJo���v�B���I[� ���T�1Rhb�OR} ���&�&
 �U�/bB}R|�K	�b41�R� X
�D��{��CII�[J��3�$�oNf��an�;5�_47Ec��4+��*V�q���)jJ��Y�n�7�/[	(
�!]�w����#�y�����:)��J�Ly����Z�g��2�_޺#�i��=��Q;��0��Ȅʽ�J&Ph�*�B��c'/�>{�J���?�ؙ=��g��~�БK�X���
�<4q������|�j�E�DN��"$�)~,3!����J��BR��do�7&�I\qœ�����|��O�'S��h;尩�R7Z���C�i��5ln��Y[��N�'��6�4�$4Fi�Phf��Q���r���
�ފሰ�g��"̂JQW����Ew
���z��Mj�g��̩�������'E�
�!"IN�Q:��.��m���m��❭0"�UPB���̫�P��&|�7����D���q��O�+'��laGa�
��t�`p��%���[1l��Q>(\�`HX���1`�2���ߴ��()t��BjҭheP�3� �p�9F��Y�2?� d��2�z�edªJCpJ�s����g0\	�Ť'Љ��������^0��b�P¿���,'�ѓd�,�ۄ7ػ�gE���%ErY���Vx*�sR@�鏋���j�<\ބB�
�.��"5�y�}j�aR8YW�b�_S,�Ġ��hՑ��	I�2��7�?٫��E�AA1B5a�DGX�
����pϹ�ڸ]�L.��'��`��2�fVL�D&�7>�� e�X_[���֛T)����Y�%��2ϐ�n7sRl���Ś[@a��
��֩���:A�,v�IEND�B`�PK�XL���:
:
nytimesbook.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>

from calibre.web.feeds.news import BasicNewsRecipe

use_wayback_machine = False


def absolutize(url):
    if url.startswith('/'):
        url = 'https://www.nytimes.com' + url
    return url


class NewYorkTimesBookReview(BasicNewsRecipe):
    title = u'New York Times Book Review'
    language = 'en'
    description = 'The New York Times Sunday Book Review'
    __author__ = 'Kovid Goyal'

    no_stylesheets = True
    no_javascript = True
    ignore_duplicate_articles = {'title', 'url'}
    encoding = 'utf-8'
    delay = 0 if use_wayback_machine else 1

    articles_are_obfuscated = use_wayback_machine

    if use_wayback_machine:
        def get_obfuscated_article(self, url):
            from calibre.ptempfile import PersistentTemporaryFile
            with PersistentTemporaryFile() as tf:
                tf.write(self.get_nyt_page(url))
            return tf.name

    @property
    def nyt_parser(self):
        ans = getattr(self, '_nyt_parser', None)
        if ans is None:
            from calibre.live import load_module
            self._nyt_parser = ans = load_module('calibre.web.site_parsers.nytimes')
        return ans

    def get_nyt_page(self, url, skip_wayback=False):
        if use_wayback_machine and not skip_wayback:
            from calibre import browser
            return self.nyt_parser.download_url(url, browser())
        return self.browser.open_novisit(url).read()

    def preprocess_raw_html(self, raw_html, url):
        html = self.nyt_parser.extract_html(self.index_to_soup(raw_html))
        return html

    def parse_index(self):
        # return [('Articles', [{'url': 'https://www.nytimes.com/2022/09/08/books/review/karen-armstrong-by-the-book-interview.html', 'title':'test'}])]
        soup = self.index_to_soup(
            self.get_nyt_page('https://www.nytimes.com/pages/books/review/index.html', skip_wayback=True))

        # Find TOC
        toc = soup.find('section', id='collection-book-review').find('section').find('ol')
        main_articles, articles = [], []
        feeds = [('Features', main_articles), ('Latest', articles)]
        for li in toc.findAll('li'):
            h2 = li.find(['h2', 'h3'])
            a = h2.find('a', href=True)
            if a is not None:
                title = self.tag_to_string(a)
                url = absolutize(a['href'])
                desc = ''
                p = h2.findNextSibling('p')
                if p:
                    desc = self.tag_to_string(p)
                main_articles.append(
                    {'title': title, 'url': url, 'description': desc})
                self.log('Found:', title, 'at', url)
                if desc:
                    self.log('\t', desc)
        for li in soup.find(id='stream-panel').find('ol').findAll('li'):
            h2 = li.find(['h2', 'h3'])
            a = h2.findParent('a')
            url = absolutize(a['href'])
            p = h2.findNextSibling('p')
            title = self.tag_to_string(h2)
            desc = ''
            if p:
                desc = self.tag_to_string(p)
            articles.append({'title': title, 'url': url, 'description': desc})
            self.log('Found:', title, 'at', url)
            if desc:
                self.log('\t', desc)

        return feeds
PK�X�g0�((nzherald.png�PNG


IHDR(-SEPLTE333333333333333333333333333333333333333333333333333333333333333333�8tRNS 0=@P_`op����������$�	|IDATx�U���@CQ�3���]O���N60���0x��
����e,�����Z(\՜��aΧ�֡T���b��X Mk�,{h�ºks�4Q�6�@��)�`Nde�`m57�ÞϨIt�g��E�)�	Ah��IEND�B`�PK�XZz7UUnzherald.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class NewZealandHerald(BasicNewsRecipe):

    title = 'New Zealand Herald'
    __author__ = 'Kovid Goyal'
    description = 'Daily news'
    timefmt = ' [%d %b, %Y]'
    language = 'en_NZ'
    oldest_article = 2.5

    keep_only_tags = [
        classes('article-header'),
        dict(id='article-content'),
    ]

    remove_tags = [
        classes('ad-container pb-f-video-video-player pb-f-article-related-articles social-shares')
    ]

    feeds = [
        ('Business',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000003.xml'),
        ('World',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000002.xml'),
        ('National',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000001.xml'),
        ('Entertainment',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_001501119.xml'),
        ('Travel',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000007.xml'),
        ('Opinion',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000466.xml'),
        ('Life & Style',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000006.xml'),
        ('Technology',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000005.xml'),
        ('Sport',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000004.xml'),
        ('Motoring',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000009.xml'),
        ('Property',
         'http://rss.nzherald.co.nz/rss/xml/nzhrsscid_000000008.xml'),
    ]

    def preprocess_html(self, soup, *a):
        for img in soup.findAll('img', attrs={'data-srcset': True}):
            img['src'] = img['data-srcset'].split()[0]
        return soup
PK�X��GG
nzz_folio.png�PNG


IHDR  V%(	pHYs���+�IDAT8�c`tR>6@R���@��x�3�4T�D�����L�e&$ܻ��s)-!��1�߾Y00�u08�10$�0`�d`�����d����� ���B����H$W��8y�צ�b;��$�ww�3�2H=�fR�B,����C�ߎx��``�gH�i� #��$"�50H���z\�?���zPy����}�����ʹ��<�{���'>3C0���)FN~�c�Ӽ�i��t�H��ÉWIEND�B`�PK�X�R�		nzz_folio.recipe
__license__ = 'GPL v3'
__copyright__ = '2012 Bernd Leinfelder <skoll1975@gmail.com>'

'''
www.nzzfolio.ch
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class Nzzfolio(BasicNewsRecipe):
    title = 'NZZ Folio'
    __author__ = 'Bernd Leinfelder'
    description = 'Aktuelle Artikel des NZZ Folio'
    publisher = 'NZZ AG'
    category = 'news, politics, nachrichten, Switzerland'
    oldest_article = 35
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'de'
    extra_css             = """
                               body{font-family: Georgia,"Times New Roman",Times,serif }
                               .artikel h3,.artikel h4,.bildLegende,.question,.autor{font-family: Arial,Verdana,Helvetica,sans-serif}
                               .bildLegende{font-size: small}
                               .autor{font-size: 0.9375em; color: #666666}
                               .quote{font-size: large !important;
                                      font-style: italic;
                                      font-weight: normal !important;
                                      border-bottom: 1px dotted #BFBFBF;
                                      border-top: 1px dotted #BFBFBF;
                                      line-height: 1.25em}
                                .quelle{color: #666666; font-style: italic; white-space: nowrap}
                            """

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }

    remove_attributes = ['width', 'height', 'lang']
    remove_tags_before = dict(id='content')
    remove_tags_after = dict(id='content')
    remove_tags = [
        dict(name=['h2', 'object', 'link', 'base', 'meta', 'iframe']), dict(id='artikelBar'), dict(
            id='foot'), dict(id='bildLegende'), dict(name='div', attrs={'class': ['box']})

    ]

    feeds = [
        (u'NZZ Folio', u'http://rss.nzzfolio.ch/')
    ]
PK�X�DLp��nzz_ger.png�PNG


IHDR��h6�IDATx�uR�n�0�g��	+[��ZVUEUPjEA�Qd���́s��<hhX�=�i�*[T�N��w��]�=ȂBu�4bՙ���銙�#׈1o:��d��-�n�_���<֧�p�T�䝯��]���[2@�^��N�y�)�	a:rTT�lD^*�rSL�����k��T�b��ADљ�T�{tXn�Y|w���mo�u�ۏL������!r��֝�gWw��ټ��5��K�[}�TzT��xo�G)z��L���V0㜗�[�Z�"{���=�������aT�0�Z�D����LKYq4�̠d>}�ۈH3������Q.@:4'�v?:=y���Ra����-��hZ�$�a�9��X�o��y$�$�筃n����=D�.�/H�bz��IEND�B`�PK�X�A�0��nzz_ger.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>, 2012 Bernd Leinfelder <skoll1975@gmail.com>'

'''
www.nzz.ch
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class Nzz(BasicNewsRecipe):
    title = 'NZZ Online'
    __author__ = 'Darko Miletic, Bernd Leinfelder'
    description = 'Laufend aktualisierte Nachrichten, Analysen und Hintergruende zu Politik, Wirtschaft, Kultur und Sport'
    publisher = 'NZZ AG'
    category = 'news, politics, nachrichten, Switzerland'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'de'
    extra_css             = """
                               body{font-family: Georgia,"Times New Roman",Times,serif }
                               .artikel h3,.artikel h4,.bildLegende,.question,.autor{font-family: Arial,Verdana,Helvetica,sans-serif}
                               .bildLegende{font-size: small}
                               .autor{font-size: 0.9375em; color: #666666}
                               .quote{font-size: large !important;
                                      font-style: italic;
                                      font-weight: normal !important;
                                      border-bottom: 1px dotted #BFBFBF;
                                      border-top: 1px dotted #BFBFBF;
                                      line-height: 1.25em}
                                .quelle{color: #666666; font-style: italic; white-space: nowrap}
                            """

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    remove_attributes = ['width', 'height', 'lang']
    remove_tags_before = dict(id='main')
    remove_tags_after = dict(id='articleBodyText')
    remove_tags = [
        dict(name=['object', 'link', 'base', 'meta', 'iframe']), dict(
            id='social-media-floater'), dict(name='div', attrs={'class': ['box']})

    ]

    feeds = [

    (u'International', u'http://www.nzz.ch/aktuell/international.rss'),
    (u'Schweiz', u'http://www.nzz.ch/aktuell/schweiz.rss'),
    (u'Wirtschaft', u'http://www.nzz.ch/aktuell/wirtschaft/uebersicht.rss'),
    (u'Finanzmaerkte', u'http://www.nzz.ch/finanzen/uebersicht/finanznachrichten.rss'),
    (u'Zuerich', u'http://www.nzz.ch/aktuell/zuerich/uebersicht.rss'),
    (u'Sport', u'http://www.nzz.ch/aktuell/sport/uebersicht.rss'),
    (u'Panorama', u'http://www.nzz.ch/aktuell/panorama.rss'),
    (u'Kultur', u'http://www.nzz.ch/aktuell/feuilleton/uebersicht.rss'),
    (u'Wissenschaft', u'http://www.nzz.ch/wissen/uebersicht.rss'),
    (u'Reisen', u'http://www.nzz.ch/lebensart/reisen-freizeit.rss'),
    (u'Auto Mobil', u'http://www.nzz.ch/lebensart/auto-mobil.rss'),
    (u'Digital', u'http://www.nzz.ch/lebensart/digital.rss'),
    (u'Stil', u'http://www.nzz.ch/lebensart/stil.rss'),
    (u'Wein-Keller', u'http://www.nzz.ch/lebensart/wein-keller.rss')
    ]
PK�XA

o_globo.png�PNG


IHDR���R0PLTE)u�*u�(u�(t�.x�7w�k�X��r�Ď�ץ�ѱ�����������.C��tRNS����������������jfs|IDATx�c`fF(�ɕA���,͐��!DѬzg��(�#s�7��~�Z� �̶i�b �|[��i �y�{�5����n�͌8sfy�(�aV�&`4���̐	(KB\��6O g�J]IEND�B`�PK�X5��{�
�
o_globo.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
oglobo.globo.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class OGlobo(BasicNewsRecipe):
    title = 'O Globo'
    __author__ = 'Darko Miletic and Carlos Laviola'
    description = 'News from Brasil'
    publisher = 'O Globo'
    category = 'news, politics, Brasil'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    cover_url = 'http://oglobo.globo.com/_img/o-globo.png'
    remove_javascript = True

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    extra_css = '''
                    cite{color:#007BB5; font-size:xx-small; font-style:italic;}
                    body{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                    h3{font-size:large; color:#082963; font-weight:bold;}
                    #ident{color:#0179B4; font-size:xx-small;}
                    p{color:#000000;font-weight:normal;}
                    .commentario p{color:#007BB5; font-style:italic;}
                '''

    remove_tags = [
        dict(name='script'), dict(name='form'), dict(name='div', attrs={
            'id': 'header'}), dict(name='p', attrs={'id': 'info-date-press'})
    ]

    feeds = [

    (u'Todos os canais', u'http://oglobo.globo.com/rss.xml?completo=true'),
    (u'Ciencia', u'http://oglobo.globo.com/rss.xml?secao=ciencia&completo=true'),
    (u'Educacao', u'http://oglobo.globo.com/rss.xml?secao=educacao&completo=true'),
    (u'Opiniao', u'http://oglobo.globo.com/rss.xml?secao=opiniao&completo=true'),
    (u'Cultura', u'http://oglobo.globo.com/rss.xml?secao=cultura&completo=true'),
    (u'Esportes', u'http://oglobo.globo.com/rss.xml?secao=esportes&completo=true'),
    (u'Mundo', u'http://oglobo.globo.com/rss.xml?secao=mundo&completo=true'),
    (u'Pais', u'http://oglobo.globo.com/rss.xml?secao=pais&completo=true'),
    (u'Rio', u'http://oglobo.globo.com/rss.xml?secao=rio&completo=true'),
    (u'Saude', u'http://oglobo.globo.com/rss.xml?secao=saude&completo=true'),
    (u'Economia', u'http://oglobo.globo.com/rss.xml?secao=economia&completo=true'),
    (u'Tecnologia', u'http://oglobo.globo.com/rss.xml?secao=tecnologia&completo=true')
    ]

    def print_version(self, url):
        return url + '?service=print'

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    language = 'pt_BR'
PK�X������oakland_north.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class AdvancedUserRecipe1299640653(BasicNewsRecipe):
    title = u'Oakland North'
    oldest_article = 30
    max_articles_per_feed = 100

    language = 'en'
    __author__ = 'noah'
    description = 'Oakland North'
    category = 'news'
    no_stylesheets = True

    masthead_url = 'http://oaklandnorth.net/wp-content/themes/oaklandnorth/images/masthead.png'

    keep_only_tags = [
        dict(name='div', attrs={'class': re.compile(r'\bpost\b(?!-)', re.IGNORECASE)})]

    remove_tags_after = [dict(name='p', attrs={'class': 'post-postscript'})]

    remove_tags = [dict(name='p', attrs={'class': 'post-postscript'})]

    feeds = [(u'All Headlines', u'http://oaklandnorth.net/feed/')]
PK�X���o��oba.png�PNG


IHDR  D���hPLTE�������	���������������������/**!(##))),'' 0,,1222006666::844866:66=8<>==?<<?>>@??CFFE??FBBMKGMKKOLLSQQSSSWVVWWW[YY[ZZ]\\c``hfgljjvttvuuzyy�����������������������������������������
����&�'�
�
�(�,���������������������������������������������

���������
������

�������������d.)IDATx�Փ�,1��i�罵m۶m���M�Sc��kw��^0�%h6���0�A�-Z�m5խZ����4�B-�|�����j�^�t�V! ]����r ��d.�QR�\��)�H��ю
P���q>����>��K#i�6�HQb��J K�����7���%h��ĝ�
�"���BS� (�u!���0gT�d�&
��Z�A���p�rP���|�����w()B�Z��À�΂]=���-�����N(��f]:�{����0�n�ѷ�[�4�	M�r)�Y(�.��-IEND�B`�PK�XD�R���
oba.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1510778177(BasicNewsRecipe):
    title = '\u041e\u0412\u0414-\u0418\u043d\u0444\u043e'
    __author__ = 'bugmen00t'
    description = 'Независимый правозащитный медиа-проект, посвященный политическим преследованиям в России.'
    publisher = 'Ovdinfo.Org'
    category = 'news'
    cover_url = u'https://ovdinfo.org/sites/all/themes/ovdinfo/img/logo-ovdinfo.png'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = True
    auto_cleanup = True

    feeds = [
        (
            '\u041d\u043e\u0432\u043e\u0441\u0442\u0438',
            'https://ovdinfo.org/rss.xml'
        ),
    ]

    remove_tags = [dict(name='a', attrs={'class': 'overtitle'})]
PK�Xv��:]]observa_digital.png�PNG


IHDR  D���RPLTE�w���~uvu�������w��Շÿ�����1�������y������ݱ�����U��[��|�����{����ޥ��>��,������������wo�����&�����������܌��x����G��y��P��4��3���vi�������� �������!����Ϲ�����J�������z�����{��	�{/���������#�������ˌ��
�{g���yP�� �����)�������1�����r�����>����Z�����}b������;����z"��L��
�|:���¾e��X�������^��h��c��b��W�����V���y�����T��3��Z�������7�������2��������D�����u��.��.��v
�~������*������p����������2������������������#�����5��N�����&��(���������,���zI����������~c����Ȕ�Ş�˄½�'���z��\���������������ڂ��
�}�x(��!���}���x�IDATx�b 031*�6Ic �W�[k��m۶m۶m�]c�;=N�'̿5���^x1����h�]]q��s`R���O���hu�u�~z�PN�>r��lLe�Y�i�7�	�e+`�ط_����bg��엯(R����"�͹@N�^��R�>}-�?�A��ECl�(��JX6���&�ƣ`I�h�,�j��r�d(I5���jL�A2ȜY9�?�1@;����7T���B�I�,Q-
�e�r%P
����L����X��_l֍2��Ͱ���lG����>`w`��Ӯ�loSZs�A�����ɦ|�9
���s>~��)��O�1g9R�:w�-*���t\��V�^�_e`�\����q#nVq���;w�1kR�?x<*{,��䩳����%n�ݹ�����w�?|����תo������3���r1L���{hS��tIEND�B`�PK�X����observa_digital.recipe#!/usr/bin/env python

from __future__ import print_function
__license__   = 'GPL v3'
__author__ = '2010, Gustavo Azambuja <hola at gazambuja.com>'
'''
observa.com.uy
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Noticias(BasicNewsRecipe):
    title = 'Observa Digital'
    __author__ = '2010, Gustavo Azambuja <hola at gazambuja.com>'
    description = 'Noticias desde Uruguay'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 5
    encoding = 'utf8'
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 2
    max_articles_per_feed = 100
    keep_only_tags = [dict(id=['contenido'])]
    remove_tags = [
        dict(name='div', attrs={'id': 'contenedorVinculadas'}),
        dict(name='p', attrs={'id': 'nota_firma'}),
        dict(name=['object', 'link'])
    ]

    remove_attributes = ['width', 'height', 'style', 'font', 'color']

    extra_css = '''
                h1{font-family:Geneva, Arial, Helvetica, sans-serif;color:#154B7A;}
                h3{font-size: 14px;color:#999999; font-family:Geneva, Arial, Helvetica, sans-serif;font-weight: bold;}
                h2{color:#666666; font-family:Geneva, Arial, Helvetica, sans-serif;font-size:small;}
                p {font-family:Arial,Helvetica,sans-serif;}
                '''
    feeds = [
        (u'Actualidad', u'http://www.observa.com.uy/RSS/actualidad.xml'),
        (u'Deportes', u'http://www.observa.com.uy/RSS/deportes.xml'),
        (u'Vida', u'http://www.observa.com.uy/RSS/vida.xml'),
        (u'Ciencia y Tecnologia', u'http://www.observa.com.uy/RSS/ciencia.xml')
    ]

    def get_cover_url(self):
        cover_url = None
        index = 'http://www.elobservador.com.uy/elobservador/nav_portada.asp?suplemento=dia'
        soup = self.index_to_soup(index)
        link_item = soup.find('img', attrs={'usemap': '#mapeo_imagenes'})
        if link_item:
            cover_url = 'http://www.elobservador.com.uy' + \
                link_item['src'].strip()

        print(cover_url)

        return cover_url

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X
����observatorul_cultural.png�PNG


IHDR�Z�IDATxM��oTe�sη�;����Lۡ�E�`K�DcR!ʋD4!��W� �|���� B\JE�M3��P��z�o9&~x����e��q�ԅ����]n4�p5��'�$+R�/��^�Q�t��H��]-�i�S�4	
SB��1�[�ݖ���ETe$$B����,3I;�
�0҅
��7�Q���v(�Lzv�� �"X|x�&=,�ڎJF�����AJ@�� 3	%�B!������ʍD�\�V����SJ""��=�HH�ֹ�����΋�P(��K*WrA�%���ϱgB1�5��Z>w��.
+E:�\�(���M�'	�a'	��ݝ_~�����*��L.,4�.��Ȥ#p&�wݎ�V	_��������W�޸w�n��D�6�v�eb�$�=~�A$s��H�x��<������c��ć�7ިu��Օ��XW*�캽���Z9�Z��KX�m%��ƃ��7�g_~��ų�#��
cW֞�2���4�ԇ����3.>I�,u���o.��y�ؑC'O�{��J��P*AR��ճw[?�~�hyU):v��S�jY��;��xo�9�@��	�k)�_\���;[�k�.�}�ٕ���,�팩�q����{�$�
lڑA��lҩ͜��O�>9��g�i4Ɩ�j�9F�ﬓ�**��ZR)�uZ��t����&G����::5=9ŹAg�{�󥬳�� t�By�}����5�@��N}t�dcHI��V�7I���Y�EB�T�����t�Iwc)봐Q"	M�0p���v�Vk�a\;R��}�!�8����O��qer	� ���12 I��FT$BL**#i�b��$�=H$��l�WA�$8k%�D�@�%;��2.�,%!�K3���l�3IEND�B`�PK�X���Tobservatorul_cultural.recipefrom __future__ import print_function
import re
from calibre.web.feeds.news import BasicNewsRecipe
coverpage = None


class ObservatorulCultural(BasicNewsRecipe):
    title = u'Observatorul cultural'
    __author__ = 'song2'  # prelucrat dupa un script de http://www.thenowhereman.com
    encoding = 'utf-8'
    language = 'ro'
    publication_type = 'magazine'
    description = 'Spiritul critic in acţiune\n'
    no_stylesheets = True
    remove_javascript = True
    masthead_url = 'http://www.observatorcultural.ro/userfiles/article/sigla%20Observator%20cultural_02231058.JPG'
    keep_only_tags = [
        dict(name='div', attrs={'class': 'detaliuArticol'})]
    remove_tags = [dict(name='div', attrs={'class': 'comentariiArticol'}),
                   dict(name='div', attrs={'class': 'postComment'}),
                   dict(name='div', attrs={'class': 'utileArticol'}),
                   dict(name='p', attrs={'class': 'butonComenteaza'}),
                   dict(name='h5'),
                   dict(name='div', attrs={
                        'style': 'margin-top: 0px; padding-top: 0px;'})
                   ]

    def parse_index(self):
        soup = self.index_to_soup(
            'http://www.observatorcultural.ro/Arhiva*-archive.html')
        issueTag = soup.find('a', href=re.compile(
            "observatorcultural.ro\\/Numarul"))
        issueURL = issueTag['href']
        print(issueURL)
        issueSoup = self.index_to_soup(issueURL)
        feeds = []
        stories = []
        for categorie in issueSoup.findAll('dl', attrs={'class': 'continutArhive'}):
            categ = self.tag_to_string(categorie.find('dt'))
            for story in categorie.findAll('dd'):
                title = []
                for bucatele in story.findAll('a'):
                    title.append(bucatele)
                if len(title) == 1:  # daca articolul nu are autor
                    stories.append({
                        'title': self.tag_to_string(title[0]),
                        'url': title[0]['href'],
                        'date': '',
                        'author': ''})
                else:  # daca articolul are autor len(title)=2
                    stories.append({
                        'title': self.tag_to_string(title[1]),
                        'url': title[1]['href'],
                        'date': '',
                        'author': self.tag_to_string(title[0])})
                    print(self.tag_to_string(title[0]))
                if 'Editorial' in categ:
                    global coverpage
                    # am luat link-ul spre editorial
                    coverpage = title[1]['href']
            feeds.append((categ, stories))
            stories = []
        print(feeds)
        return feeds
# procedura de luat coperta

    def get_cover_url(self):
        soup = self.index_to_soup(coverpage)
        # caut imaginea textului
        link_item = soup.find('a', attrs={'rel': 'lightbox'})
        a = ''
        cover_url = a.join(link_item.img['src'].split('_details_'))
        return cover_url
PK�X�����observer.png�PNG


IHDR��h6�IDATxU�h�q��{��yn��s7��q؆)�?UH��$���JR*J�Ĉ�Z���5�lg��fs��nc;Ϗ��/r]�s��w�j~&�c#��������'.Z��S�CG՞�Y-���'<V��`�H0c�a}��)e[�����f2˗WՂ�?:��c�2Hx��T�D~ik
!@�Z0k�~o^HYi�{{��7=�@
��5�lݐ���oS֗e��ݷ�ۯ^���<T\j�{k�y$+���RׄahR��f�%��<�?W�r��D�H@hB�=9�@Wg�Ӻ�;��ܱ{UUMΤHOͭd�n4�	�MB�z��~��A��E��`����Nu���h��ׅ�����} ��	�h_yhA���X���hn��V{C���ʱ�2�Ű,_ 0r�r�S��j���l.9y^�|ʶ�ϝ�6���
@�6�?�'LJ�l�h�R�|���Zq���Ø% ���׮(ܼme�͒#'�a��V �|��H�RCF���q"6g���)���^hnT�Țu�g�k:]ܳ�Ӆ3c��77�I���!����\v֖����ݗOD*I��p�`�!Ò.���[ɲ��d���}c}�ז&�v�R���G���pRd�/�$�B7�1IEND�B`�PK�X�����observer.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class NewsandObserver(BasicNewsRecipe):
    title = u'Raleigh News & Observer'
    description = 'News from Raleigh, North Carolina'
    language = 'en'
    __author__ = 'Krittika Goyal updated by Walt Anthony'
    oldest_article = 3  # days
    max_articles_per_feed = 25
    summary_length = 150

    no_stylesheets = True
    remove_javascript = True

    remove_tags_before = dict(name='h1', attrs={'id': 'story_headline'})
    remove_tags_after = dict(name='div', attrs={'id': 'story_text_remaining'})

    remove_tags = [
        dict(name='iframe'),
        dict(name='div', attrs={'id': ['right-rail', 'story_tools', 'toolbox', 'toolbar',
                                       'tool', 'shirttail', 'comment_widget', 'story_keywords', 'txtResizeTool']}),
        dict(name='div', attrs={'class': ['Buy-It-Now', 'story_link_share']}),
        dict(name='ul', attrs={'class': 'bold_tabs_nav'}),

    ]

    feeds = [
        ('Cover', 'http://www.newsobserver.com/100/index.rss'),
        ('News', 'http://www.newsobserver.com/102/index.rss'),
        ('Politics', 'http://www.newsobserver.com/105/index.rss'),
        ('Business', 'http://www.newsobserver.com/104/index.rss'),
        ('Sports', 'http://www.newsobserver.com/103/index.rss'),
        ('College Sports', 'http://www.newsobserver.com/119/index.rss'),
        ('Lifestyles', 'http://www.newsobserver.com/106/index.rss'),
        ('Editorials', 'http://www.newsobserver.com/158/index.rss')
    ]
PK�X��Errobserver_gb.png�PNG


IHDR  ��9IDATx�}Vt$M��n�l�6��ͳm+�"�ٶ����l+6��_=}��z�W��������5��(Գ�9h
nrN�(z�B��UX�U �9�B���(D�w8�ӓ6<<F5�r���i�[>���������yV��ۺύ�5�y�}|jHP��X��
��-&�^�l��T�*�!)*t�D��?�M���r.���oyEe5"�L*�9��,�՗�S����n5%���h�ջ憞:�0��g�T���L�}�@��a�~�������dԩܡ�U�"�T�ܑ��N���ׁ�P�0��r&��U W(dr"��o�bSff�E"D���'0.,��9�n�h�a����+x_GJR��}�@W��kx����t\��,�kR�?� Q�X�,�R�@�������i�0b�5�q��3R��\.'X�7�>�6���GN��&4b���a��TB_&Wu������/�)c��:èu����V�U]����.�A�1�&��w1�"�v�_P�RՔݗ��x�
8����eU8k�BI����k?�p����={>�s��r։ʴ��9��p͈ɀh���Œ0�����F�l?��D+Q����擴��|��@�0U��zu�0|5�I'����>
�<�5ߨf��p�Q����U�M��Vks�
hq�������9l*����1�Xq���jZ@�8��������"����x`��"/�޸>��jᠶZ��@�	;mB��rAP]�\����10b#�ʇ��2_�Z ��H��y#����r5*}7h���'�;�^z��]��܂��p�v����]TS=�m5^3���N:��q�����N+V$�����W�>�DQ���R�9X�+���m��
�5e�Z�B.C�-��B%a�JN_���f]�K{=t�2��+�������Yُ�rT���TUVWV�y�����]G�:,�ޓS/t�j_��"Ɓ�[�	������������:���̞6�Z�i<r��+����D�Zw�.ƞ��۸�^}���kD����B�k$i�f����d):��)�I��r��N���i�q��$z���x�uȢh����}��}�O�4�
`�g��K�x��V"���"B�
�TTT)K���Z$~���?�| B�����>�����}�5�,����j�J��f̒p�'k2tg����ݷac�ԗ�C���3�/;<�j-����mz[��v�,��g�ŌZ�q?���Rd�M�~pH�K,��S0�Tk�(4�&��1��W]?��x@1`n8������V
t^v�V򇏟���F�z�+��D��qe��j���$�z��-g{>v���(�,�3…��0j�oƁ|+v�r��ܢr��/_]�M�KN�MJS�8�S3����*5P��]�`�:�P�@3kSߑK6�V�4����K�X̅�ӡ�4
a�O���c&�,.)a	�Y�T��'!��rx���C]��
�N��:�q]47��GC���cӔĕ��nE�x���.M2V��ɝIEND�B`�PK�X����observer_gb.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

'''
http://www.guardian.co.uk/theobserver
'''
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class Guardian(BasicNewsRecipe):

    title = u'The Observer'
    __author__ = 'jbambridge'
    language = 'en_GB'
    simultaneous_downloads = 5

    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True

    timefmt = ' [%a, %d %b %Y]'

    filter_regexps = [r'r\.kelkoo\.com']

    keep_only_tags = [
        dict(name='div', attrs={
             'id': ["content", "article_header", "main-article-info", ]}),
    ]
    remove_tags = [
        dict(name='div', attrs={
             'class': ["video-content", "videos-third-column"]}),
        dict(name='div', attrs={
             'id': ["article-toolbox", "subscribe-feeds", ]}),
        dict(name='div', attrs={
             'class': ["promo-component bookshop-books-promo bookshop-books"]}),
        dict(name='ul', attrs={'class': ["pagination"]}),
        dict(name='ul', attrs={'id': ["content-actions"]}),
        dict(name='li', attrs={'id': ["product-image"]}),
    ]
    use_embedded_content = False

    no_stylesheets = True
    extra_css = '''
                    .article-attributes{font-size: x-small; font-family:Arial,Helvetica,sans-serif;}
                    .h1{font-size: large ;font-family:georgia,serif; font-weight:bold;}
                    .stand-first-alone{color:#666666; font-size:small; font-family:Arial,Helvetica,sans-serif;}
                    .caption{color:#666666; font-size:x-small; font-family:Arial,Helvetica,sans-serif;}
                    #article-wrapper{font-size:small; font-family:Arial,Helvetica,sans-serif;font-weight:normal;}
                    .main-article-info{font-family:Arial,Helvetica,sans-serif;}
                    #full-contents{font-size:small; font-family:Arial,Helvetica,sans-serif;font-weight:normal;}
                    #match-stats-summary{font-size:small; font-family:Arial,Helvetica,sans-serif;font-weight:normal;}
                '''

    feeds = [
        (u'Main Section', u'feed://www.guardian.co.uk/theobserver/news/uknews/rss'),
        (u'News', u'feed://www.guardian.co.uk/theobserver/news/rss'),
        (u'World News', u'feed://www.guardian.co.uk/theobserver/news/worldnews/rss'),
        (u'In Focus', u'feed://www.guardian.co.uk/theobserver/news/focus/rss'),
        (u'7 Days', u'feed://www.guardian.co.uk/theobserver/news/7days/rss'),
        (u'Seven Days', u'feed://www.guardian.co.uk/theobserver/news/seven-days/rss'),
        (u'Media', u'feed://www.guardian.co.uk/theobserver/news/media/rss'),
        (u'Business', u'feed://www.guardian.co.uk/theobserver/businessandmedia/rss'),
        (u'Cash', u'feed://www.guardian.co.uk/theobserver/news/cash/rss'),
        (u'Money', u'feed://feeds.guardian.co.uk/theguardian/money/rss'),
        (u'Comment', u'feed://www.guardian.co.uk/theobserver/news/comment/rss'),
        (u'Travel', u'feed://www.guardian.co.uk/theobserver/escape/rss'),
        (u'Culture', u'feed://www.guardian.co.uk/theobserver/review/rss'),
        (u'Money', u'feed://feeds.guardian.co.uk/theguardian/money/rss'),
        (u'TV & Radio', u'feed://www.guardian.co.uk/tv-and-radio/rss'),
        (u'New Review', u'feed://www.guardian.co.uk/theobserver/new-review/rss'),
        (u'Agenda', u'feed://www.guardian.co.uk/theobserver/new-review/agenda/rss'),
        (u'Critics', u'feed://www.guardian.co.uk/theobserver/new-review/critics/rss'),
        (u'Features', u'feed://www.guardian.co.uk/theobserver/new-review/features/rss'),
        (u'Discover', u'feed://www.guardian.co.uk/theobserver/new-review/discover/rss'),
        (u'Books', u'feed://www.guardian.co.uk/theobserver/new-review/books/rss'),
        (u'Magazine', u'feed://www.guardian.co.uk/theobserver/magazine/rss'),
        (u'Regulars', u'feed://www.guardian.co.uk/theobserver/magazine/regulars/rss'),
        (u'Life & Style', u'feed://www.guardian.co.uk/theobserver/magazine/life-and-style/rss'),
        (u'Mag Features', u'feed://www.guardian.co.uk/theobserver/magazine/features2/rss'),
        (u'Sport', u'feed://www.guardian.co.uk/theobserver/sport/rss')
    ]

    def get_article_url(self, article):
        url = article.get('guid', None)
        if '/video/' in url or '/flyer/' in url or '/quiz/' in url or \
            '/gallery/' in url or 'ivebeenthere' in url or \
                'pickthescore' in url or 'audioslideshow' in url:
            url = None
        return url

    def preprocess_html(self, soup):

        for item in soup.findAll(style=True):
            del item['style']

        for item in soup.findAll(face=True):
            del item['face']
        for tag in soup.findAll(name=['ul', 'li']):
            tag.name = 'div'

        return soup

    def find_sections(self):
        soup = self.index_to_soup('http://www.guardian.co.uk/theobserver')
        # find cover pic
        img = soup.find('img', attrs={'alt': 'Guardian digital edition'})
        if img is not None:
            self.cover_url = img['src']
        # end find cover pic

        idx = soup.find('div', id='book-index')
        for s in idx.findAll('strong', attrs={'class': 'book'}):
            a = s.find('a', href=True)
            yield (self.tag_to_string(a), a['href'])

    def find_articles(self, url):
        soup = self.index_to_soup(url)
        div = soup.find('div', attrs={'class': 'book-index'})
        for ul in div.findAll('ul', attrs={'class': 'trailblock'}):
            for li in ul.findAll('li'):
                a = li.find(href=True)
                if not a:
                    continue
                title = self.tag_to_string(a)
                url = a['href']
                if not title or not url:
                    continue
                tt = li.find('div', attrs={'class': 'trailtext'})
                if tt is not None:
                    for da in tt.findAll('a'):
                        da.extract()
                    desc = self.tag_to_string(tt).strip()
                yield {
                    'title': title, 'url': url, 'description': desc,
                    'date': strftime('%a, %d %b'),
                }

    def parse_index(self):
        try:
            feeds = []
            for title, href in self.find_sections():
                feeds.append((title, list(self.find_articles(href))))
            return feeds
        except:
            raise NotImplementedError

    def postprocess_html(self, soup, first):
        return soup.findAll('html')[0]
PK�X���observer_reach_foundation.png�PNG


IHDR00`�	�VPLTE\����_�����\��Z��[�Q�����Y��I�����=x�(j������ f�H������%i�������h��������c�A}�`�0r������e�����x��d����V�����Ђ�����?{�L��!g���嘹�����섫‰�����N�����_��~����Ȗ��d��������۬��$i����z�����a�����:x�s��/o�T��`���䠿������������|�����C~�n��2s�-o���菲�i����֤��R�����k����϶�����]����͆��)l�@{����������,n����5t�8v������[�>)��qtRNS�+�T����(��J��F��~�D8�
q���pB�V��P�b�yͿ�2k�|&�x��tn�3HW��L�?Дݵ�:d\�Ǜ��.u�R`�Z�eM5�"g��ʇ*���>?�޸�IDATx�bb`�u%E7���I�a�۶m�3�8�k���'�]�ue��ϟrM���s71�`ؕL�L^����jM�%�Uܫ	��3y��dDd�B�e{��GDv ��
���\n���B���nJ��j����h� g��D'#��>�2h<b� ��Pht,X��Q\��F���d�2H�X��8A����qc7Z�@Y˃2����K��s�G�zW�c|�M��<H���-€����Nw��h(g/��jJ�Y�o�D>�	��Dy}p�=<��bP�2c��X
D�u0�GN���O)}6 �[Y���K��U�`+����S�$��Y�upZ0�<l�3G{`�bn�\MۂZ<v�Q9mcB�8-o�u ǃ�;����HQ�np{q�"���FDm�B�?�������.����Ee��?w����y@=��	�@ M���	`����z?1��Z�w��{�߆��l�:��9_IEND�B`�PK�Xl��S(( observer_reach_foundation.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

class ORF(BasicNewsRecipe):
    title = u'Observer Research Foundation'
    description = (
        'Set up in 1990, ORF seeks to lead and aid policy thinking towards building a strong and prosperous India'
        ' in a fair and equitable world. It helps discover and inform India’s choices, and carries Indian voices '
        'and ideas to forums shaping global debates. '
    )
    language = 'en_IN'
    __author__ = 'unkn0wn'
    oldest_article = 7.5  # days
    max_articles_per_feed = 25
    encoding = 'utf-8'
    masthead_url = 'https://www.orfonline.org/wp-content/uploads/2015/09/Logo_ORF_JPEG.jpg'
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}

    extra_css = '''
        .report-slider {font-size:small; color:#404040;}
        .report {font-size:small; font-weight:bold;}
        .excert-italic, .recent-block-people {font-style:italic; color:#202020;}
        blockquote, em {color:#202020;}
    '''

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based')

    resolve_internal_links = True
    remove_empty_feeds = True

    keep_only_tags = [classes('recent-updates-block recent-block-people')]
    remove_tags = [
        classes(
            'social socialshare comment-area-section telegramhtml post-tag '
            'research-prev research-next'
        )
    ]

    feeds = [
            ('Commentaries', 'https://www.orfonline.org/content-type/commentary/feed/'),
            ('Expert Speak', 'https://www.orfonline.org/expert-speak/feed/'),
            ('Books and Monographs', 'https://www.orfonline.org/content-type/books/feed/'),
            ('Event Reports', 'https://www.orfonline.org/content-type/event-reports/feed/'),
            ('Events', 'https://www.orfonline.org/content-type/events/feed/'),
            ('Forums', 'https://www.orfonline.org/content-type/forums/feed/'),
            ('GP-ORF Series', 'https://www.orfonline.org/content-type/gp-orf-series/feed/'),
            ('Issue Briefs & Special Reports', 'https://www.orfonline.org/content-type/issue-brief/feed/'),
            ('Monitors', 'https://www.orfonline.org/content-type/monitors/feed/'),
            ('Occasional Papers', 'https://www.orfonline.org/content-type/occasional-paper/feed/'),
            ('Primer', 'https://www.orfonline.org/content-type/primer/feed/'),
            ('Series', 'https://www.orfonline.org/content-type/series/feed/'),
            ('Surveys & Polls', 'https://www.orfonline.org/content-type/surveys-polls/feed/'),
            ('Young Voices', 'https://www.orfonline.org/content-type/young-voices/feed/'),
        ]

    def print_version(self, url):
        if 'marathi' in url or 'hindi' in url or 'bangla' in url:
            return ''
        return url
PK�X%aα		oc_register.png�PNG


IHDR  szz��IDATx��Vsxd�}Z�'϶m�k۶����6�dmێmL߾�{~��o�o4��j�����S5���P�#�v-�ĻA����.Mh�@��
o=����i�b���eqFA���q$z�;?w�И�SD~���_aT�ii,����G�#~�����Č��1�PwP��珄����n?����~;?Pz�۱��p1�c�G��Oa;1x���^XX�d\�7�D~ˑ�8��q�cX��s����}j�E��3aΡ��D~�)���AN���m�^_����#�}����s��/�����;[;]����i����+�)@���d��.,�oo^��[�����'�|�7ز7a��[��$���Q��r�5��Jhk(a��a^Pm>PC=�5���}vڸ�c�D��ZT��,������|��P�Б�G�E�DI`sS=:cz�����ֿ"��uiao	(���Q:P�������a��Xk�	h{�ٙ�.x0� "�w9�{��Uq-�[�Z�F`#8/��Yap�ޮ�K[�Q(Fi�A�������XD��]Y�g-�P����!ͩV��d
*�qJ}7�2�Ih;�C?4�1�6|K��̎�"���3zg4���m�	<���z��$K�	�]}�a�c
E�n�f�m�L����
u�sB
)����
a�"��C�q'����9��3��9���	h�0�Bh�=�������œ��[=��<`��0��
|ŻP�]��|8��_�xps ���"�w[�̮��m�lvm�}��s��F>���JBg��3z����GY�M����E@��%�%i0soJ`���8��*�0��4���@_�������*k�YB?nW>Dv��l^��#�XY�{��O���d�O��8m`��|��Q�v�)O�D p|�j`�0+ɍ��ӑe��RRv���-��$���q2��X�a1�"eK�'EW�t)g�_8��xƑ��b�-�|5�%��,���t�2ԕ��g�eR�`��xo��"��S���g�)�sn<Sjm�D�3�J٥��q"ƅ�0�|�4���(�)4����LR�"R�pd��7~���@~��7��G�����P�̀�w���p��C��Q�m�����p&�ɋ`�%0�Nҽ�Ph���D�{?/��4���D��נ,zQ�bњ]�HP��,�_��h<t�S��/|6,ū��`��`j�r�X����th>� �0]�ӌ ���KR1W�w��8��w��ƈ���V	&�"��+#�&��%��9��H2�i1���)���̀</�;��>A�4�����Pu�qem'u���Ęe��C[P�b��Bׁ
EaB��q#q�wU�	׶���Wi��o�/���)����	{�P��k�F�x�P�IEND�B`�PK�X	����oc_register.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
import time
import json
from pprint import pprint

from calibre.web.feeds.news import BasicNewsRecipe


class OrangeCountyRegister(BasicNewsRecipe):
    title = u'Orange County Register'
    __author__ = 'TechnoCat'
    description = 'The O.C. Register\nRecipe: Nov 2016'
    cover_url = 'http://www.realclearpolitics.com/dev/mt-static/images/logo.gif'
    custom_title = 'OC Register - ' + time.strftime('%d %b %Y')
    auto_cleanup = True
    extra_css = 'div.metaAuthor { display:none;}\n'
    encoding = 'utf8'
    language = 'en'
    needs_subscription = False
    no_stylesheets = True
    oldest_article = 7
    remove_javascript = True
    remove_tags = [dict(name='img', attrs={})]
    # Don't go down
    recursions = 0
    max_articles_per_feed = 400
    debugMessages = False

    feeds = [('News', 'https://www.ocregister.com/news/'),
             ('Opinion', 'https://www.ocregister.com/opinion/'),
             ('Politics', 'https://www.ocregister.com/news/politics/'),
             ('Business', 'https://www.ocregister.com/business/')]

    def parsePage(self, index):
        if self.debugMessages is True:
            print("\n\nStarting " + self.feeds[index][0])
        articleList = []
        soup = self.index_to_soup(self.feeds[index][1])
        # Have this index page now.
        # look for a.article-title
        # If any, the description is <div class="excerpt">
        for newsentry in soup.findAll("a", {"class": "article-title"}):
            print('Next up:')
            print(newsentry)
            title = newsentry["title"]
            url = newsentry['href']
            print("Title: ")
            print(title)
            print('URL')
            print(url)
            pubdate = time.strftime('%a, %d %b')
            articleList.append(
                dict(
                    title=title,
                    url=url,
                    date=pubdate,
                    description=title,
                    content=''
                )
            )
        return articleList

    def extract_readable_article(self, html, url):
        cleanedHTML = super(OrangeCountyRegister,
                            self).extract_readable_article(html, url)
        print("Processing html for author")
        # Find the attribs...
        attribDict = self.htmlToAttribsDict(html)
        print("dict is type...")
        print(type(attribDict))
        author = attribDict.get('Byline')
        if author is not None:
            # add author code after <body>
            print("Adding author in meta")
            print(author)
            cleanedHTML = cleanedHTML.replace(
                "<body>",
                "<body>\n<div class=\"metaAuthor\" value=\"" + author + "\"></div>\n"
            )
        else:
            print('no author found')
            print(html)
        # pubDate = attribDict.get('Publish Hour of Day')
        return cleanedHTML

    def loadURL(self, url):
        return self.index_to_soup(url, raw=True)

    def htmlToAttribsDict(self, rawHTML):
        tokenStart = 'dataLayer.push({'
        tokenEnd = '});'
        print("1")
        startJSON = rawHTML.find(tokenStart)
        if (startJSON < 0):
            return
        JSONBeginning = rawHTML[startJSON + len(tokenStart) - 1:]
        endJSON = JSONBeginning.find(tokenEnd)
        if (endJSON < 0):
            return
        JSON = JSONBeginning[:endJSON + 1]
        JSONQuoted = JSON.replace("'", "\"")
        try:
            metadata = json.loads(JSONQuoted)
            pprint(metadata)
            return metadata
        except ValueError:
            print("Could not decode JSON:")
            print(JSONQuoted)
        return None

    # calibre.web.feeds.news.BasicNewsRecipe.parse_index() fetches the list of articles.
    # returns a list of tuple ('feed title', list of articles)
    # {
    # 'title'       : article title,
    # 'url'         : URL of print version,
    # 'date'        : The publication date of the article as a string,
    # 'description' : A summary of the article
    # 'content'     : The full article (can be an empty string). This is used by FullContentProfile
    # }
    # this is used instead of BasicNewsRecipe.parse_feeds().
    def parse_index(self):
        # Parse the page into Python Soup
        # articleList = []
        ans = []
        feedsCount = len(self.feeds)
        for x in range(0, feedsCount - 1):  # should be ,4
            feedarticles = self.parsePage(x)
            if feedarticles is not None:
                ans.append((self.feeds[x][0], feedarticles))
        if self.debugMessages is True:
            print(ans)
        return ans
PK�X
��a!!odenselokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�XK?9oDDodenselokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Odense
'''


class OdenseLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Odense'
    description = 'Lokale og regionale nyheder, sport og kultur fra Odense på odense.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Odense', 'http://odense.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Odense', 'http://odense.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Odense', 'http://odense.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Odense', 'http://odense.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Odense', 'http://odense.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Odense', 'http://odense.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X&�C�oesterbroavis_dk.png�PNG


IHDR  D���3PLTEMv���P��@z������ß�̯��������X�����p��0n�`�� c�����IDATx���E1D���?m]ï��]��~h�-@�:H�cՁ�'�lg�46f	��>�E���X�����:�e`Q�z��rˠ�ܾ�p�H�3�^n� k~�_A+ށ@K��y��ʙWu�$�؞y0P�9����IEND�B`�PK�X�T&f��oesterbroavis_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Østerbro Avis
'''


class OesterbroAvis_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Østerbro Avis'

    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Østerbro Avis', 'http://minby.dk/oesterbro-avis/feed/'),
        ('Kommentarer til Østerbro Avis', 'http://minby.dk/oesterbro-avis/comments/feed/'),

    ]

PK�X�!��]]office_space.png�PNG


IHDR�a$IDATxڜ�Da��@(#j5H	`A!ΔQ�%b24@$�
j���h�Z�j�������A���x��r.�j����p�)�BIKz�Z,7�;�W�<�o+�c%�{y�g�
�O��o+�i���Ek)Cca���F��Ʒv�X��K��iw�.���"9���Y���Ž�F���4���=V�V)��l���)�����J��]�q1C�y�o+lh����|.��|[aM�kk���*�حV����(Ws��D�v�
َ"��dgT��)��1�`8B6IEND�B`�PK�X�tq���office_space.recipeimport re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.constants import config_dir, CONFIG_DIR_MODE
import os
import os.path
try:
    from urllib.parse import quote
except ImportError:
    from urllib import quote
from hashlib import md5


class OfficeSpaceBlogHu(BasicNewsRecipe):
    __author__ = 'Zsolt Botykai'
    title = u'Office Space Blog'
    description = u"officespace.blog.hu"
    oldest_article = 10000
    max_articles_per_feed = 10000
    reverse_article_order = True
    language = 'hu'
    remove_javascript = True
    remove_empty_feeds = True
    no_stylesheets = True
    feeds = [(u'Office Space Blog', u'http://officespace.blog.hu/rss')]
    remove_javascript = True
    use_embedded_content = False
    title = u'Irodai patkényok'
    feeds = [(u'Office Space', u'http://officespace.blog.hu/rss')]

    masthead_url = 'http://m.blog.hu/of/officespace/ipfejlec7.jpg'

    keep_only_tags = [
        dict(name='div', attrs={'id': ['mainWrapper']})
    ]

    #   1.: I like justified lines more
    #   2.: remove empty paragraphs
    #   3.: drop header and sidebar
    #   4.: drop comments counter
    #   5.: drop everything after article-tags
    # 6-8.: drop audit images

    preprocess_regexps = [
        (re.compile(r'<p align="left"'), lambda m: '<p'),
        (re.compile(r'<p>( |&nbsp;)*?</p>', re.DOTALL | re.IGNORECASE), lambda match: ''),
        (re.compile(r'<body[^>]+>.*?<div id="mainIn"', re.DOTALL |
                    re.IGNORECASE), lambda match: '<body><div id="mainIn"'),
        (re.compile(r'<h3 class="comments">.*?</h3>',
                    re.DOTALL | re.IGNORECASE), lambda match: ''),
        (re.compile(r'<div class="related">.*?</body>',
                    re.DOTALL | re.IGNORECASE), lambda match: '<body>'),
        (re.compile(
            r'<img style="position: absolute;" src="[^"]+pixel\?uc.*?>', re.DOTALL | re.IGNORECASE), lambda match: ''),
        (re.compile(r'<noscript.+?noscript>', re.DOTALL | re.IGNORECASE), lambda m: ''),
        (re.compile(r'<img style="position: absolute;top:-10px.+?>',
                    re.DOTALL | re.IGNORECASE), lambda m: ''),
    ]
    extra_css = '''
                    body { background-color: white; color: black }
                '''

    def get_cover_url(self):
        return 'http://m.blog.hu/of/officespace/ipfejlec7.jpg'

    def preprocess_html(self, soup):
        for tagz in soup.findAll('h3', attrs={'class': 'tags'}):
            for taglink in tagz.findAll('a'):
                if taglink.string is not None:
                    tstr = taglink.string + ','
                    taglink.replaceWith(tstr)

        for alink in soup.findAll('a'):
            if alink.string is not None:
                tstr = alink.string
                alink.replaceWith(tstr)

        return soup

    # As seen here:
    # http://www.mobileread.com/forums/showpost.php?p=1295505&postcount=10
    def parse_feeds(self):
        recipe_dir = os.path.join(config_dir, 'recipes')
        hash_dir = os.path.join(recipe_dir, 'recipe_storage')
        feed_dir = os.path.join(
            hash_dir, self.title.encode('utf-8').replace('/', ':'))
        if not os.path.isdir(feed_dir):
            os.makedirs(feed_dir, mode=CONFIG_DIR_MODE)

        feeds = BasicNewsRecipe.parse_feeds(self)

        for feed in feeds:
            feed_hash = quote(feed.title.encode('utf-8'), safe='')
            feed_fn = os.path.join(feed_dir, feed_hash)

            past_items = set()
            if os.path.exists(feed_fn):
                with open(feed_fn) as f:
                    for h in f:
                        past_items.add(h.strip())

            cur_items = set()
            for article in feed.articles[:]:
                item_hash = md5()
                if article.content:
                    item_hash.update(article.content.encode('utf-8'))
                if article.summary:
                    item_hash.update(article.summary.encode('utf-8'))
                item_hash = item_hash.hexdigest()
                if article.url:
                    item_hash = article.url + ':' + item_hash
                cur_items.add(item_hash)
                if item_hash in past_items:
                    feed.articles.remove(article)
            with open(feed_fn, 'w') as f:
                for h in cur_items:
                    f.write(h + '\n')

        remove = [fl for fl in feeds if len(fl) == 0 and
                  self.remove_empty_feeds]
        for f in remove:
            feeds.remove(f)

        return feeds
PK�X�!�Poilprice.png�PNG


IHDR��h6�IDAT(SS[HTQ��;�6>f4K�+M����>�=@�>zEP��$fX}}XD�YTd��=,-g�{����yt�
��l��k?�A�J�d�%�z�D�\XE�h2�#P�3�N�n��IeuhQ�;�H[�\�}/�W�\@����]q����"�{�x��3���>:�x;���#��}�}~I`�;T���Z�6/V���L���� D�|��U��m���>��qjx�?��9�4�i�ûfoWn<n[�ס���	��
�:]P	T�|���r�"�В�i[}����9L2��V;��<�uf]��H��F�i[mس�HB������s�|�e3f:\��pa���.��5D�
z	�yj��<��o�9H������%��w�s"8��kwMV�J�M�v*i'-sֲ,۴�*ccc??�Sy{v��#-�`���S��mj�	��QV�l����t��i�4-MZQ��[ٜ����xz�2B�:�a����AmE]����@d���Dv�#4:󦿄�T��Dmij"�g<!8�*���u2���W��V��GZOL_���JkFGG#y����Sg��8?�igg^��9f���iIȿg��>�z�V���Q�<���؊:���ز)�u
us�9-'o�X�{��_6l��|.`��Ս��'���-l�!M���;}����IEND�B`�PK�Xݨ��oilprice.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
oilprice.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class OilPrice(BasicNewsRecipe):
    title = 'Oil Price'
    __author__ = 'Darko Miletic'
    description = 'The nr. 1 source for Oil Price Information'
    publisher = 'oilprice.com'
    category = 'news, oil, politics, world, usa'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'en'
    country = 'US'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }
    remove_tags = [dict(name='div', attrs={'class': 'banner'})]
    keep_only_tags = [dict(name='div', attrs={'id': 'storyContent'})]
    remove_tags_after = dict(attrs={'id': 'KonaBody'})

    feeds = [(u'Articles', u'http://www.oilprice.com/rss.xml')]
PK�X�B�U��
old_games.png�PNG


IHDR(-S0PLTE7Ek�����~}6Eg���}}}ꅀ������LIDATx�U��0�.�����I��Rp)��|�?&B�7qur}�&�6�ۓ;��k�GMObqbf��,0&��NM��0HIEND�B`�PK�XC��	��old_games.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class OGRU(BasicNewsRecipe):
    title = u'Old-Games.RU'
    __author__ = 'bugmen00t'
    description = u'Old-Games.RU \u2014 \u043A\u0440\u0443\u043F\u043D\u0435\u0439\u0448\u0438\u0439 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0439 \u0430\u0440\u0445\u0438\u0432 \u0441\u0442\u0430\u0440\u044B\u0445 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u043D\u044B\u0445 \u0438\u0433\u0440. \u041C\u044B \u043D\u0435 \u0441\u0442\u0430\u0432\u0438\u043C \u043F\u0435\u0440\u0435\u0434 \u0441\u043E\u0431\u043E\u0439 \u0446\u0435\u043B\u0438 \u0441\u043E\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435 \u0438\u0433\u0440\u044B, \u0447\u0442\u043E \u0435\u0441\u0442\u044C \u0432 \u043C\u0438\u0440\u0435, \u043D\u043E \u043C\u044B \u0441\u0442\u0430\u0440\u0430\u0435\u043C\u0441\u044F, \u0447\u0442\u043E\u0431\u044B \u043D\u0430 \u0441\u0430\u0439\u0442\u0435 \u0431\u044B\u043B\u043E \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043E \u0431\u043E\u043B\u044C\u0448\u0438\u043D\u0441\u0442\u0432\u043E \u0448\u0435\u0434\u0435\u0432\u0440\u043E\u0432, \u0440\u0435\u0434\u043A\u043E\u0441\u0442\u0435\u0439 \u0438 \u043F\u0440\u043E\u0441\u0442\u043E \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B\u0445 \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432 \u043F\u0440\u043E\u0448\u043B\u044B\u0445 \u043B\u0435\u0442. \u0421 \u0442\u0435\u0447\u0435\u043D\u0438\u0435\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0438 \u0437\u0432\u0443\u043A\u043E\u0432\u043E\u0435 \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0438\u0433\u0440 \u043D\u0430\u0448\u0435\u0433\u043E \u0430\u0440\u0445\u0438\u0432\u0430 \u0437\u0430\u043C\u0435\u0442\u043D\u043E \u0443\u0441\u0442\u0430\u0440\u0435\u043B\u043E, \u043D\u043E \u0438\u0433\u0440\u043E\u0432\u043E\u0439 \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u043E\u0441\u0442\u0430\u043B\u0441\u044F \u043F\u0440\u0435\u0436\u043D\u0438\u043C, \u0438 \u043F\u043E\u0440\u043E\u0439 \u043E\u043D \u0433\u043E\u0440\u0430\u0437\u0434\u043E \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u0435\u0435, \u0447\u0435\u043C \u0432\u043E \u043C\u043D\u043E\u0433\u0438\u0445 \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445 \u00AB\u0445\u0438\u0442\u0430\u0445\u00BB.'  # noqa
    publisher = 'Old-Games.RU'
    publication_type = 'blog'
    category = 'news, games, retro'
    language = 'ru'
    cover_url = 'https://www.old-games.ru/forum/styles/default/old-games/logo.og.png'
    oldest_article = 50
    max_articles_per_feed = 50
    no_stylesheets = True
    auto_cleanup = False

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_attributes = ['style']

    remove_tags =   [
        dict(name='p', attrs={'id': 'pageDescription'}),
        dict(name='div', attrs={'class': 'pageNavLinkGroup'}),
        dict(name='div', attrs={'class': 'tagBlock TagContainer'}),
        dict(name='div', attrs={'class': 'NoAutoHeader PollContainer'}),
        dict(name='div', attrs={'class': 'likesSummary secondaryContent'}),
        dict(name='div', attrs={'class': 'editDate'}),
        dict(name='div', attrs={'class': 'attachedFiles'}),
        dict(name='div', attrs={'class': 'item muted postNumber hashPermalink OverlayTrigger'}),
        dict(name='div', attrs={'class': 'messageUserInfo'})
        ]

    feeds = [
        (u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://feeds.feedburner.com/Old-games-ru-news'),
        (u'\u0421\u0442\u0430\u0442\u044C\u0438', 'https://feeds.feedburner.com/Old-games-ru-articles')
        ]
PK�X�q�KKoldnewthing.png�PNG


IHDR�aIDATxڌ�v-QEk��m<�۶m۶m۶�v2��IՍ�Zk�ת�u�mj�~�B��/�f�C�����1w8�6��ބ��
<������rt�_��Ì'h7�QI<���uς&K�紙� �<�#	|�>T3C�֘�:��$mF݅_�SҨ1j X�7�m����n�&��
�ר�`���E���uȍ�U��
uk�hS&B��#{�
c�5��6��O�`���M���{�C��6G��~��o0m����U!�Z�=���a�����aU�a�V��[�+�~�b�0����G�����<���E�*��8XL���o�
��?�˄���_�����C}��g.���n�G�Z�=W�S��e���'�|‹.����~<�a�g�yiJ��%+�!�yE A˜6��j�u�
0�_�+���$HN �Nm�.q�U�����5�Eb���O��2��:�#����p�����jI:��'Y���b�r}��IEND�B`�PK�XS�)zzoldnewthing.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
blogs.msdn.com/oldnewthing
'''

from calibre.web.feeds.news import BasicNewsRecipe


class OldNewThing(BasicNewsRecipe):
    title = 'The Old New Thing'
    __author__ = 'Darko Miletic'
    description = 'Famous blog by Windows guru Raymond Chen'
    oldest_article = 15
    max_articles_per_feed = 100
    language = 'en'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = False
    publication_type = 'blog'
    auto_cleanup = True

    feeds = [(u'Posts', u'https://blogs.msdn.microsoft.com/oldnewthing/feed')]
PK�Xi�[�00
omgubuntu.png�PNG


IHDR  D���3PLTE�O�O�Z�W�Y�Z�X�[�Z �[�[�Z�[�[ �[�]"Z�.�tRNS 0@P`p��������#���IDATxڽ�Eb!�&�
2���FWpn�#:����ѧ\��;��.�Ȏ�N�D��6�f�첸ha�h�I�W���M	�d����8#��^0�q@sJ�ӄ�_�zѬ�j�ïȁ�9~�bW`e�Ew�8�ل�t�d��x���i��
M+�K�/_.�b�IEND�B`�PK�X5��omgubuntu.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class OMGUbuntu(BasicNewsRecipe):
    title = u"Omg! Ubuntu!"
    description = u"Online news site covering Ubuntu activities. Recipe pulls articles from past 7 days."
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Omg Ubuntu', u'https://www.omgubuntu.co.uk/feed')]
PK�X9mcw��
onda_rock.png�PNG


IHDR  D���}PLTE'''\\\���������������&&&///��컻�������iT���������===FFFHHHR*$VVVX,&ZZZ___a/(ccchhhq5-}}}~~~�������������������E9���������������(((�������SC������������*����\J������???����������dP@$�������������hS����iTAAADDDsssttt��Ӝ��xxx���zzz���EEE��槧����...������������[[[�fR������GGGKKKddd---RRR>>>���W!tRNS
+..8:cd��������Ǔ�O�IDATxڅӃz$A���|�؊m��kۼ�EW�w���rX?�VT�BmUEi�����:\u���L�7`\�iy4��Y9
�q<��^��Bu��*��u�D�n�@M����c���t�3��{[����8���Ht)y	�e��0��2�$�u�L��Vb�Rzvtx&$��	l+�Ҳ�밭�J�s��c��tK��[�i[������f�
J�
l�]��� ;�hb@��Oi?V�6i���m_HI2���Zl#ڂ
��l�-1v�j-�)-���ΰ��]pLj�����ʨ"����\��^�E30Ȭ����:��&up��^��\Z���>Q�|�U$���El��u���C+�@uJ�д	I��!�����H;a)��#�j7Y�;��V�$���	T榛Ψl��u><�~Ф;�`��<�S#m>�t�TrF +ݨ�s���+Kܲ���?6����ϭg�����o�v�g	�a�IEND�B`�PK�X�����onda_rock.recipe__license__ = 'GPL v3'
__author__ = 'faber1971'
description = 'Italian rock webzine - v1.01 (6, July 2012)'
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1328535130(BasicNewsRecipe):
    title = u'Onda Rock'
    __author__ = 'faber1971'
    description = 'Italian rock webzine'
    language = 'it'
    oldest_article = 15
    max_articles_per_feed = 100
    auto_cleanup = False
    remove_tags = [
        dict(name='div', attrs={'id': ['boxHeader', 'boxlinks_med', 'footer', 'boxinterviste',
                                       'box_special_med', 'boxdiscografia_head', 'path', 'widget', 'menuarea', 'headerarea']}),
        dict(name='div', attrs={'align': 'left'}),
        dict(name='div', attrs={'class': ['media', 'boxarticoli']}),
        dict(name='div', attrs={'style': 'text-align: center'}),
        dict(name='table', attrs={'cellpadding': '0'}),
        dict(name='span', attrs={'class': 'liketext'}),
    ]
    no_stylesheets = True
    feeds = [(u'Onda Rock', u'http://www.ondarock.it/feed.php')]
    masthead_url = 'http://api.ning.com/files/4ot8ampp*-rYQuwL2NoaHvVqcyu7VMyWyan12a9QMsJUWxk-q5V1-34wnD-Wj9B5qWjc1yPMLGiwQg8hZJxaySeaG2lx8hpV/2009_banner_ondarock.gif'  # noqa

    extra_css = '''  # noqa
        .boxtabscontain_page {
             border: 1px solid #E0E0E0;clear: both;
             font-family: "Verdana", "Arial", "Helvetica", sans-serif;
             font-size: 10px;
             line-height: 17px;
             margin: 0px 0px 20px;
             padding: 10px 10px 10px 40px;
             position: relative;
             top: -1px;
             width: 258px;
             z-index: 1;
        }
    '''
PK�X�=F���onemagazine.png�PNG


IHDR�a�IDATx�b�:P�4O&�@�o����:BGp���2�#8JF��<�x��Gi�~Tc-��逝�,��:�`��_���M���#����Fa ��U>�&N��9��"�n��x�
įϠq�x�j�N݉#����N�H���\댘�h����cŽ��IEND�B`�PK�X�f��
�
onemagazine.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
onemagazine.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Onemagazine(BasicNewsRecipe):
    title = u'The ONE'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Be the ONE, not anyone ..'
    publisher = u'The ONE'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Femei'
    encoding = 'utf-8'
    cover_url = 'http://www.onemagazine.ro/images/logo_rss.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'class': 'article'}), dict(name='div', attrs={
            'class': 'gallery clearfix'}), dict(name='div', attrs={'align': 'justify'})
    ]

    remove_tags = [
        dict(name='p', attrs={'class': ['info']}), dict(name='table', attrs={'class': ['connect_widget_interactive_area']}), dict(name='span', attrs={'class': ['photo']}), dict(name='div', attrs={'class': ['counter']}), dict(name='div', attrs={'class': ['carousel']}), dict(name='div', attrs={'class': ['jcarousel-container jcarousel-container-horizontal']})  # noqa
    ]

    remove_tags_after = [
        dict(name='table', attrs={
             'class': ['connect_widget_interactive_area']})
    ]

    feeds = [
        (u'Feeds', u'http://www.onemagazine.ro/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�Xe
���onionavclub.png�PNG


IHDR  szz�NIDATx����\a@�q�6*��fX�1;Am�vm�
jčUkmۻ㙻'N����?{�/�N�Z���B��f�� x�����1��8p���8P�I�l&����w�b8<�qd<�_>·�B��&�
b�;��ua���	yx���m)���f`�a�Fc$Rj�"�>i;�`�c���T�G�M�n<A�("�h�,�Yk�	Qh�:�5�"��Y��(\�i�!
ÂY�Q	Qx�A�6A��c��Q:��B�1f�@�p���(�1f�A9D�3L�Q����D�?F��U�AN´]�BRԂ)0m-^��>�p���޶��Q&IEND�B`�PK�X&��k��onionavclub.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
bbc.co.uk
'''

from calibre.web.feeds.news import BasicNewsRecipe


class BBC(BasicNewsRecipe):
    title = u'The Onion AV Club'
    __author__ = 'Stephen Williams'
    description = 'Film, Television and Music Reviews'
    language = 'en'
    no_stylesheets = True
    oldest_article = 2
    max_articles_per_feed = 100
    auto_cleanup = True

    remove_tags = [dict(name='div', attrs={'class': ['footer', 'tools_horizontal']}),
                   dict(name='div', attrs={
                       'id': ['tool_holder', 'elsewhere_on_avclub']})
                   ]
    extra_css = '.headline {font-size: x-large;} \n .fact { padding-top: 10pt  }'

    feeds = [
        ('TV', 'http://www.avclub.com/feed/tv/'),
        ('AV Club Daily', 'http://www.avclub.com/feed/daily'),
        ('Film', 'http://www.avclub.com/feed/film/'),
        ('Music', 'http://www.avclub.com/feed/music/'),
        ('DVD', 'http://www.avclub.com/feed/dvd/'),
        ('Books', 'http://www.avclub.com/feed/books/'),
        ('Games', 'http://www.avclub.com/feed/games/'),
        ('Interviews', 'http://www.avclub.com/feed/interview/'),
    ]
PK�XZ��oopen_magazine.png�PNG


IHDR  ���IDATxڕV|cy}��H���4���;�ڶm۶m�����&�/�L��v��4����{ƹ>�\WOjSw���Wc\�ܸx	�P��e�;AJJ��f�����~��K5��*	bo��6^�PX���h9�����6��vv�ݽl�<���o��rFV˶wp�u�
�9t􄓆O;��	'r�y�n�"V�f����o�:�\O/;��`���:�VX���js�Hy�i�W^�x�U�W_y�%��A�)h6�x�?0��[�o��x�q�v��y�ȣJ+9U7@m?�6��g��4�ޡ"%2R$庺�O<��k��陿]a����#g��k���R�ZĴ*
@6�v��P�3˴+
��dy�e�vۓO�'�R��_��c�ً��j���GAV��yL[;�x8%���@�����-�>�d�f�C���Fb^O��ڝq�/
����La���w�+W��I���ua\�r(�L��N�}_���CS��~���+��ۋ/���*��E�~۳�Xv�K�$$׮FBؙ�=�K+�w��5��O,����ɧF�:Dz�����;�>�tۃ�~�yܙvD<�s�r==�9��l\������z}q�e�AN�BmO>3���YA�dt��A.�֓5bJ"����7N�s���+29���c�j%��;�	�����Y�z��b��x���δetA�����2F^�
%F���2�U�?�e$B<�Tn�BRVkI���"��i�]}��=�|2|�	����5Tx"�JT;.�^-)��c
eU��=���+�`0mx���ǟ�46뉜��g�KCF�L����>zɥ��c0����q��n�˗�u�6�
�…lK2�I�O:9:>�
u0��'o��Vv�J�W��L�@<�I� E��������|w��He���hy�Z�(ƕk<?���^��/��uОa�:B�������%�۪0-[��h�%��+�����,�$r!��;���x�m�G_PD���+�o��YY�7�4}�O74	K��I���]ģ�WX��nj��lG����#.��Aܟ~jY��PZ� +W;�~w.ϼ~�i
���Ea�bX�%[�}�
���=�������-[U5&��K��g �������?u��ͷ��)-Y��?uQs�E���ɧ#�lm،�A�sx��s�g�ŗ�����vӊU���״r
��\��i��@�� /[��/L�)t�����4eh��}���de��siڝN�>
Y% rMk�~�9;M���t�]|IH�g��T�8�W]�J��C��m�\�m�$��
-��BJR7r����Կ�d��z+�J� JT��.PJ$�&����χO;���b�;j
�˶)��;n�����݇��QE$�����T�4 �u�R5q�ձP(��~�ż�A���9���K
E%dN���
�O?�ev�px��8��	�z5�k��Բ�~~�Ϣ�x���˻;�F�n��CbKA�T�¼m�����>_]�O�>�4�]'N�>7�nm����e,�*h2�^zy��wz�y���:���/�>�l��b^?��C�;��9U'�c��K��[�TFՈM+WN�qg�����퀁t�����'lO<�|�m߯���g�дmO?eٱ���p�3��D�/(��Y{44=����s,�z�.���CN�U&���x�u�Չvt�:ʳW�1�(Ն�R��Ҳi����@,i�#9�@Lzl�������(�ٱ���*H
^I놏?���ˡ񱙿]��i�[o��v:���	-/9��l���($�I�L0q�e��^t����(,��W̓�W_���ZㆍtC#�U�({�
�����|�����mk�-k��w��1��|��ɧ{�Ё[�oD�Х�%��)����f{���=�w0�q�R�Đe�񽰄�k`T*^��1�.L�Xj|/)������e��]
�Sk+�遞�IEND�B`�PK�Xc�,topen_magazine.recipe#!/usr/bin/env  python

from calibre.web.feeds.news import BasicNewsRecipe, classes


class OpenMagazine(BasicNewsRecipe):
    title = u'Open Magazine'
    description = 'The weekly current affairs and features magazine.'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    oldest_article = 7  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://openthemagazine.com/wp-content/themes/open/images/logo.png'
    ignore_duplicate_articles = {'url'}
    extra_css = '[id^="caption-attachment"] {font-size: small;font-style: italic;}'
    'blockquote{color:#404040;}'
    '.about-author{font-size:small;}'

    def get_cover_url(self):
        soup = self.index_to_soup('https://openthemagazine.com/')
        tag = soup.find(attrs={'class': 'magazine-item mr-1'})
        if tag:
            self.cover_url = tag.find('img')['src']
        return getattr(self, 'cover_url', None)

    keep_only_tags = [
        classes('post-data post-thumb post-meta post-excerp'),
    ]

    remove_tags = [
        classes('top-social menu-social post-author blurb-social button-links'),
    ]

    remove_tags_after = [
        classes('post-meta post-excerp'),
    ]

    feeds = [
        ('Cover Story', 'https://openthemagazine.com/cover-story/feed/'),
        ('Columns', 'https://openthemagazine.com/columns/feed'),
        ('Essays', 'https://openthemagazine.com/essays/feed'),
        ('Features', 'https://openthemagazine.com/features/feed'),
        ('Books', 'https://openthemagazine.com/lounge/books/feed'),
        ('Art & Culture', 'https://openthemagazine.com/art-culture/feed'),
        ('Cinema', 'https://openthemagazine.com/cinema/feed'),
    ]
PK�X������opennet.png�PNG


IHDR  ��uIDATx^��n#E���{N��(�ew�$� �ڻ]$xn���xny�H�q>ό��UԴpX�Z�p����x��)��3�����A�#� �:E� ���XADȁ�$�
ZL-�HJ��$�_�����ژ��X�NC��={����ū(L��G���!z��[�{�'灍��r�+�Њ8��$0�����6`N�~����-��x�)b���0��g��J�����(�D&#D��o���]iB$2~��
����'��=ہ(�$I�٤�9�$��t���C�XC���������A?9�U�!���7_VM�gi��כ�b���
��w,��a�tstt��ۯ���wW:��w2��t���?n�ԁ<�3�WWS���3D��Ǔ��$�]& k���|���"��6!:v��(3�5bA��b�IWWӉ2|{v.�jW]^��[�cUU"��ι��6��f�Z/L7@��z|���|��\�e��؇
a��:˲�rvu}�0f�(��4�V��&K��Pu�΅�x�\�UQ�y�Q���Xh��m��6M#^� �,�~�*�†qw=䯁m2Ɗ��=���΅Ƹ�����Z ����
�Gh�6��Fx��R�D䵌�P��Y�eoA;���	�#,t&I� ��G�z�Tc�E�pxxppb�16p��`�U].������כ�?f���l4[L�3��V� ��طZ-geѶǶh�����n!��(��E�N��
�e�o��h\�X̂ s���h'�썬���0̉�i���"�3�mIт��Z4��;{Q4�%N�N���+�Z`p^��B(:L7������O��
�ϴxIEND�B`�PK�X��G�opennet.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class PaperPaper(BasicNewsRecipe):
    title = 'OpenNet.ru'
    __author__ = 'bugmen00t'
    description = '\u0420\u0443\u0441\u0441\u043A\u043E\u044F\u0437\u044B\u0447\u043D\u044B\u0439 \u043F\u043E\u0440\u0442\u0430\u043B, \u043F\u043E\u0441\u0432\u044F\u0449\u0451\u043D\u043D\u044B\u0439 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0438 \u0441\u0432\u043E\u0431\u043E\u0434\u043D\u044B\u043C \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u044F\u043C (FOSS): \u0435\u0436\u0435\u0434\u043D\u0435\u0432\u043D\u044B\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438 \u0432 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0441\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u043E\u0433\u043E \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0435\u043D\u0438\u044F, Linux, BSD \u0438 UNIX-\u043F\u043E\u0434\u043E\u0431\u043D\u044B\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0441\u0438\u0441\u0442\u0435\u043C.'  # noqa
    publisher = 'Maxim Chirkov'
    category = 'blog'
    cover_url = u'https://www.opennet.ru/opennet.gif'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 14
    max_articles_per_feed = 50

    remove_tags_before = dict(name='div', attrs={'id': 'as2'})

    remove_tags_after = dict(name='tr', attrs={'bgcolor': '#D9DAC6'})

    remove_tags = [dict(name='tr', attrs={'bgcolor': '#D9DAC6'})]

    feeds = [
        (
            '\u0413\u043B\u0430\u0432\u043D\u044B\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.opennet.ru/opennews/opennews_6_noadv.rss'
        ),
        (
            '\u041C\u0438\u043D\u0438-\u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.opennet.ru/opennews/opennews_mini_noadv.rss'
        ),
        (
            '\u0421\u043E\u0431\u044B\u0442\u0438\u044F',
            'https://www.opennet.ru/opennews/opennews_review.rss'
        ),
        (
            '\u041E\u0431\u0437\u043E\u0440\u044B \u0441\u0442\u0430\u0442\u0435\u0439',
            'https://www.opennet.ru/opennews/opennews_arts.rss'
        ),
        (
            '\u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C',
            'https://www.opennet.ru/opennews/opennews_sec.rss'
        ),
        (
            '\u041D\u043E\u0432\u044B\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C',
            'https://www.opennet.ru/opennews/opennews_prog.rss'
        ), ('Linux', 'https://www.opennet.ru/opennews/opennews_linux.rss'),
        ('BSD', 'https://www.opennet.ru/opennews/opennews_bsd.rss'),
        ('Ubuntu', 'https://www.opennet.ru/opennews/opennews_ubuntu_full.rss'),
        ('Fedora', 'https://www.opennet.ru/opennews/opennews_fedora_full.rss'),
        (
            'Mozilla/Firefox',
            'https://www.opennet.ru/opennews/opennews_mozilla_full.rss'
        )
    ]
PK�X�x��  opindia.png�PNG


IHDR  D���^PLTE����Q���rrr���������			�p.������C��X��v�[��u��������999///�+�T��`��`�������k�s1�����Ѽ���y:��G����y;�������j�Q��l����t3�S<$��g����Y�U����u5��V�������]��M��T�}A���H��O�l(+++�K��W��K��R��E��Y[[[7����L���YWV�F�D����@@@@JJJYYY&����V������]����A���000����A��Ը��GGG���RRR�9�R���hec�����˺<�:(" vvv���d���D���www꧇�n*NNNttt��������Z!!!�|@�<)))���kkk�����������G%�6��P���ⳝ���{{{���~~~��䇇����}@���"""���333������������P�m4�\��U���65�|?�?��ü<i!�9�8�Q�O���QMF��x�Y�\���/��pm}IDATx���S��$���m۶m۶m۶m�Tc�/����ڍ;�<(�}��-��&7���W�n��
�n�P����(=ƭ���8r�I�p^w]�fr�Ν_�x�R�m�IBڋ'�άT��c�)o�dP������c���I��}��i������
���_�O�I��.�$uk�RQ�=���_t裮�M��h���{���$;�A=�^j��Uq�Ƞ���1r}{Kjݬ��* �yZ������~P	%�*�R		K�E�S���˦�S6Gm������g��+S#dKNvܽg�ټq�E�A�(.\�8�vn�XR=d0���F�c=d��P�V���R:/�����V�fn����Z�e.�d��
�R�Yg�3IEND�B`�PK�X-�300opindia.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
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 Opindia(BasicNewsRecipe):
    title          = 'opindia'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('Opindia', 'https://feeds.feedburner.com/opindia'),
    ]
PK�X
.ۗ��opinion_bo.png�PNG


IHDR  D���JPLTEBv"BwD{Dz�'�"�"Bz'Bv'Bw+BvBw�BxBw�����k8i�+R�'J�'F�"B�2�5�"BxBwBx�'Bx�".Bu���.Bv�2Bv�R=oW=p���+ND{�'L�'J�'J2@t�'J�"F�'F�"D�"D�"D�"B�"D�=�;�"DF}�8�8�5�5�5�=H=p�5Bv�'�"�'U=pW=o+@uY;mY=nY=p_;mg;k"Bvm;jn8ev8f{8e|5c}8c�5b�2]Dx�+N��.W�5�8�.U�"B+Bwj8gj;j�5_�2\�2Z�.W��'H]��HIDATx���Â3Q��U۱�۶m��.��zj�_�:��c�����(���ޖg�%p��7��mp'
��h�}]���7��ʭ��"�������_�7q�����N�b�a��n�r�.@	Y)B2B��O;�љA�"�RR�@�
��O�_u�H%�i�}�ɵ���ϯ�_���uJY�Z�1J�Ѳ=�r��6��J ���j�7������6 pÕn�ʈ1�EGX��f;ͥ�N�ƹ#MHFLB��������^����s9�l��&��-��7��x���]{!$j�C<�������Zem�)�IEND�B`�PK�X_O�0opinion_bo.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2011, Piet van Oostrum <piet@vanoostrum.org>'
'''
www.opinion.com.bo
'''

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class Opinion_Bol(BasicNewsRecipe):
    title = u'Opinión - Bolivia'
    __author__ = 'Piet van Oostrum'
    description = u'Opinión diario de circulación nacional, Cochabamba, Bolivia'
    publisher = 'Coboce Ltda - Editora Opinión'
    category = 'news, politics, Bolivia'
    version = 1
    oldest_article = 1
    max_articles_per_feed = 20
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'es_BO'
    publication_type = 'newspaper'
    delay = 1
    remove_empty_feeds = True

    cover_url = strftime(
        'http://www.opinion.com.bo/opinion/articulos/%Y/%m%d/fotos/portada_650.jpg')
    masthead_url = 'http://opinion.com.bo/opinion/articulos/imagenes/logo_opinion.gif'
    extra_css = """body{font-family: Helvetica,Arial,sans-serif}
              .seccion_encabezado_nota_inte{font-size: 1.1em;
                font-weight: bold;}
              .autor_nota_inte{color: #999999; font-size: 0.8em;
                margin-bottom: 0.5em; text-align: right;}
              .pie{font-size: 0.8em;}"""

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'columna_izq_nota_intererior'})]

    remove_tags = [dict(name=['meta', 'link', 'form', 'iframe', 'embed', 'object', 'style']),
                   dict(name='div', attrs={'class': 'ocultar'})]
    remove_attributes = ['width', 'height']

    feeds = [

    (u'El País', u'http://www.opinion.com.bo/opinion/rss/el_pais_rss.xml'),
    (u'Cochabamba', u'http://www.opinion.com.bo/opinion/rss/cochabamba_rss.xml'),
    (u'Economía', u'http://www.opinion.com.bo/opinion/rss/economia_rss.xml'),
    (u'Cultura', u'http://www.opinion.com.bo/opinion/rss/cultura_rss.xml'),
    (u'Mundo', u'http://www.opinion.com.bo/opinion/rss/mundo_rss.xml'),
    (u'Ciencia y Tecnología', u'http://www.opinion.com.bo/opinion/rss/ciencia_tecnologia_rss.xml'),
    (u'Policial', u'http://www.opinion.com.bo/opinion/rss/policial_rss.xml'),
    (u'Editorial', u'http://www.opinion.com.bo/opinion/rss/editorial_rss.xml'),
    (u'Subeditorial', u'http://www.opinion.com.bo/opinion/rss/subeditorial_rss.xml'),
    (u'Opinión', u'http://www.opinion.com.bo/opinion/rss/opinion_rss.xml'),
    (u'Deportes', u'http://www.opinion.com.bo/opinion/rss/deportes_rss.xml'),
    (u' Vida de hoy', u'http://www.opinion.com.bo/opinion/rss/vidadehoy_rss.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    # Filter out today's articles
    # maybe should take timezone into account

    today = strftime('/%Y/%m%d/')

    def get_article_url(self, article):
        link = article.link
        if self.today in link:
            return link
PK�X<�oL��optyczne_pl.png�PNG


IHDR�aIIDATxڕ��+�Q���ゲ@�+��(6����$J&2�$@��2�`���L��,(�����r���:���N}�8�Aw�t0%��r��
�X3{������S9t:�2B,�R2�‚/�*���.'��m���Vy�A��uw�-��O
��t
��Cވt����Q�8�"Ҡ8�
K�,�Ӳk'��F��T�T"���� Ę��G_ݱ_�B
v-�-��Nh��p�V��!�&퇽f����1�E
zGe��,�l�\&�f�ߤ�HG�����! ��$nB�@&����hyRv�d��|��V��'Q?��^&���IEND�B`�PK�X�ՙ((optyczne_pl.recipe#!/usr/bin/env python
__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe


class OptyczneRecipe(BasicNewsRecipe):
    __author__ = u'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'

    title = u'optyczne.pl'
    category = u'News'
    description = u'Najlepsze testy obiektywów, testy aparatów cyfrowych i testy lornetek w sieci!'
    cover_url = ''
    remove_empty_feeds = True
    no_stylesheets = True
    oldest_article = 7
    max_articles_per_feed = 100
    recursions = 0

    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = dict(name='div', attrs={'class':'main-article-content'})

    remove_tags = [dict(name='div', attrs={'class':['banner','colored','content-panel']}),
                dict(name='a', attrs={'class':'icon-link comments-link'})]

    extra_css = '''
                    body {font-family: Arial,Helvetica,sans-serif;}
                    h1{text-align: left;}
                    h2{font-size: medium; font-weight: bold;}
                    p.lead {font-weight: bold; text-align: left;}
                    .authordate {font-size: small; color: #696969;}
                    .fot{font-size: x-small; color: #666666;}
                    '''
    feeds = [
        (u'Aktualności', 'http://www.optyczne.pl/rss.xml'),
    ]
PK�X�C==
oregonian.png�PNG


IHDR  szz�IDATxڽ��SaǗk&If&!�L2!aH2!0	&	!�@B�0&�̕��d�L�̕\�L23���{�|�{w�����l��1Gv��ڙ&�	��c��Ž�C�A3w
���06����@�S+<���$�Z�0 ]�™�`UA���'U�,XxD�:H�Z��>�H�V	��<X2��� \�����
=��#`2|��5�X�8��
P�(���^��M��Xh�� �r�
W�Fh����GIண����/I` 4&Tߵ�V�
�_s���:L��n
,%#0U
�fZ�D)Px%	�����HA(Б&��s��T�
l�II�c�6xo՞��_�v�$pͷ>iU�[�#Bn�"�C�
JDp��B���<�)�,�k��"��1�fá}�U��� ���� R	�C
�zp�_�ڳ�x'<�k�0p����I|w@��;�P}b�ߙ�����7��~�$��iF�a�͎N�IEND�B`�PK�X��.CCoregonian.recipefrom __future__ import with_statement
__license__ = 'GPL 3'
__copyright__ = 'zotzot'
__docformat__ = 'restructuredtext en'

from calibre.web.feeds.news import BasicNewsRecipe
from datetime import date


class Oregonian(BasicNewsRecipe):
    title = u'The Oregonian'
    oldest_article = 2
    max_articles_per_feed = 100
    language = 'en'
    __author__ = 'Zotzot'
    description = 'Portland, Oregon local newspaper'
    publisher = 'Advance Publications'
    category = 'news, Portland'
    cover_url = 'http://img.kiosko.net/{}/us/oregonian.750.jpg'.format(date.today().strftime('%Y/%m/%d'))
    no_stylesheets = True
    masthead_url = 'http://bit.ly/eocL70'
    remove_tags = [dict(name='div', attrs={'class': ['footer', 'content']})]
    use_embedded_content = False
    remove_tags_before = dict(id='article')
    remove_tags_after = dict(id='article')
    feeds = [
        # (u'Timbers', u'feed://blog.oregonlive.com/timbers_impact/atom.xml'),
        (u'News', u'http://blog.oregonlive.com/news_impact/atom.xml'),
        (u'Opinion', u'http://blog.oregonlive.com/opinion_impact/atom.xml'),
        (u'Living', u'http://blog.oregonlive.com/living_impact/atom.xml'),
        (u'Sports', u'http://blog.oregonlive.com/sports_impact/atom.xml'),
        (u'Business', u'http://blog.oregonlive.com/business_impact/atom.xml')]

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
'''


def get_article_url(self, article):
    url = BasicNewsRecipe.get_article_url(self, article)
    if '/video/' not in url:
        return url
PK�Xd�ec(
(
oreilly_premium.png�PNG


IHDR  ��	pHYs��~�	�IDAT�ɓ$�]��{���VY{Wu�>=ӳH3�,,˒6A�p�O�J�� X"l#G(p���̠eZ�hzQwWuwUem�/o���������>L���� �lΈ�
#�	b Ɗ��DB��`2K�Q0�U87������Mj�4�r���a�TJ��؆�L���Z+�� ae���LDL�G	_�(�EZI%�"b(J#�4"K�L�)�
��� 1��W�!�L.0H �ذBV8s��Lm;��6��B}-V�$�1��	Bk�����-H� 仮��rIx�q/5�`R�7-mXB�4�X�")D&�d^�⊩B@WJ��%��Z�R琤 "n:ԡ�6yZ��e^
D�6��l�Jh��0�F�0NN��"aif#�l��EQl0	�"0��ZQ	A%Vh�'F���F�YÄ�8�R%�%,�񈡳8�߼:��9n�`��I5m\HCa`c��AL��&p�@T����|8*�7��ۃ��.�Q��d9�Ix;����}�����f���w�2|%�e��+��v=@$��" �.�H(M|\���W����ѣ��o�����B�������7/'�'�Q�T�����WiQ�V&�
�m�����ǹd��2`�Oڛ�����]�~�-��Y@���'/���m�zx�=N���/��ǿ8���������O~u�ӟ�(Cc�i��v�3(��@�E!��
��Q6�	�%-�w�^�?�?�:?�L�e�f�-�.��*������~�w�{�����S-�;m�Ʀ���uy�Gȴ; �c�Tu�AQ�\��{m���̃hcZ
��O��N��0�l�]���wdY-�u�
��|�d�p�uö�ejѼsT�G64ߢl��~p����6��z���&�VXt��������[�f���w>�pM=a�����<���i��n��J3qP�uF��\Nj�,U�UG�:쯙
jŦ��e<�rs�JV!g`��n�.�Ze����oN���U��~�����<�s*A^%�hQ�E�@��cyn8�&�
Q$˲A��Ww�B�+h�R�(��l\>?��8Z�9wj��b����* to��p���".�v��e9��\���.3��%5Ǫ[�8
Ǔ�a
�5̐8�N^_?>����j���۶c��i�H�	���6�@[a��x	q
��z�E,�`Y�BY���w?���z���|yu��UH�Yzq8z��b�sgs�F�+Er/S�!<�R:��1$+p�4�Ʉa��^�u������O�����~��v��
!�Y�-�ʴ�F��֦�'IT��e":��c���r	�+=��t���4�D4�e���<9gb4
�㩿n��`Hq��R�IP^i!�PZk���P((m��r(HA� RIӕ�2��:��^��?��O.� 7�&�јI�gvY���]��9�XVq�*��&AiEH@jC��¦́LBa�ۭ���"B�G�����b:/
�F��~�ѯ'���VU�ww�Y��,e:*QT`E�a�&n��S^��q��B>`�F�=ǣ�y���۾��Nd�Mj^��J���k4x_]�ˉ*��
�M�$���ֽ�-�+͞�q[N������kL�"\*�j��l?���p��U�bY���8���������}����lYr�$�Laib�p}Qm衴�6�'�֟;A3[��)z������m+_��*�Q�'g�.}غ{����/c6���ќz��-�PX&�I��)J�[/��F�ޓ�ٝn5=�D/�d�ʤTa�������rv6�����:d6���B����E��!�`���a�4�.,�IJ*�Cث?�p��o�%]���䐔1=]�A7-����{w�B���8�*�8�qVV\��$Y�O�����>H������bݏ��~��|��Iΰ�f�)����^g�7������mB��|>;������f.q&S'ykO���:���p�,��Oޜ\F?���o7��0�њ5�<��Z���4����7�,^�O�_�\?�rDX���&r�ܺ�2^Z�|�}���yZ8�F��-���/Ń_u�����u*A�IJ��e�(�Y��dE����/��Tl�f3bc,y"92�m����/�*���ߛ�����?�ɧ\O����r���[w��wq�),��$l�r��O�����<����<�\�o��8���a�(��3�G���~�^4>�q�����!��q�j���_�lz"����3(��^?;������.\8�z~��%�a�RXS[�0B�;��<�%[��B��I}g��uΊz���<����̗'�`i"zy]<���0J�1X�o�ѭ~��jG���W�(��]ox6��
�P��\�ݶ�
�,���X欈��WϾZ��jӟ��N�3���D<������G;���m�g�S��J�.����c��[f�}q�IEND�B`�PK�X��\0\0oreilly_premium.recipefrom __future__ import print_function
import time
import traceback
# above for debugging via stack
from calibre.web.feeds.recipes import BasicNewsRecipe
# Allows the Python soup converter, which makes parsing easier.
from calibre.ebooks.BeautifulSoup import BeautifulSoup

import os


from calibre.web.feeds import feeds_from_index
from calibre.utils.threadpool import WorkRequest, ThreadPool, NoResultsPending


# To Do: strip ads and graphics, Current Column lacks a title.
# The News letter archive https://www.billoreilly.com/newsletterarchive is covered by other entries.
# Newsletters: Talking Points Memos covered by cat12
# ./ebook-convert  --username xxx --password xxx

# this is derived from BasicNewsRecipe, so it can only overload those.
# Soome of what we need is otherwise in article, so we have more copy to
# do than otherwise.
class OReillyPremium(BasicNewsRecipe):
    title = u'OReilly Premium'
    __author__ = 'TMcN'
    description = 'Retrieves Premium and News Letter content from BillOReilly.com.  Requires a Bill OReilly Premium Membership.'
    cover_url = 'http://images.billoreilly.com/images/headers/billgray_header.png'
    custom_title = 'Bill O\'Reilly Premium - ' + time.strftime('%d %b %Y')
    title = 'Bill O\'Reilly Premium'
    auto_cleanup = True
    conversion_options = {'linearize_tables': True}
    encoding = 'utf8'
    language = 'en'
    no_stylesheets = True
    needs_subscription = True
    oldest_article = 31
    remove_javascript = True
    remove_tags = [dict(name='img', attrs={})]
    # Don't go down
    recursions = 0
    max_articles_per_feed = 20

    debugMessages = True

    # Name, URL, Soup FindAll Attr if relevant (last two are special case),
    # articleList
    catList = [["TV Archives",         'https://www.billoreilly.com/show?action=tvShowArchive', 'a',
                {'class': ['showLinks', 'homeLinks']},                   []],
               ["Current Column",      'https://www.billoreilly.com/currentcolumn',
                'span', {'class': ['defaultHeader']},                           []]
               ]

    feeds = [
        (u'No Spin',        u'http://www.billoreilly.com/blog?action=blogArchive&rss=true&categoryID=7'),
        (u'Daily Briefing', u'http://www.billoreilly.com/blog?action=blogArchive&rss=true&categoryID=11'),
        (u'Talking Points', u'https://www.billoreilly.com/blog?action=blogArchive&rss=true&categoryID=12'),
        (u'Blog',           u'http://www.billoreilly.com/blog?action=blogArchive&rss=true&categoryID=0'),
        (u'StratFor',       u'http://www.billoreilly.com/blog?action=blogArchive&rss=true&categoryID=5')
    ]
    # http://www.billoreilly.com/blog?action=blogArchive&rss=true&categoryID=8
    # is word for the day.

    # Note: Talking Points is broken in the above model; the site changed to more Ajax-y.
    # Now using RSS

    def get_browser(self):
        print("In get_browser")
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://www.billoreilly.com/pg/jsp/member/membersignin.jsp')
            br.select_form(name='login')
            br['formEmailField'] = self.username
            br['formPasswordField'] = self.password
            br.submit()
        return br

    # Returns the best-guess print url.
    # The second parameter (pageURL) is returned if nothing is found.
    def extractPrintURL(self, baseURL, pageURL, printString):
        tagURL = pageURL
        soup = self.index_to_soup(pageURL)
        if soup:
            printText = soup.find('a', text=printString)
        else:
            print("Failed to find Print string " +
                  printString + " in " + pageURL)
        if printText:
            tag = printText.parent
            tagURL = baseURL + tag['href']
        return tagURL

    def stripBadChars(self, inString):
        return inString.replace("\'", "")

    def parseGeneric(self, baseURL):
        # Does a generic parsing of the articles.  There are six categories (0-5)
        # Name, URL, Soup FindAll Attr if relevant (last two are special case), articleList
        # NoSpin and TV are generic
        fullReturn = []
        for i in range(len(self.catList)):
            articleList = []
            print("In " + self.catList[i][0] + ", index: " + str(i))
            soup = self.index_to_soup(self.catList[i][1])
            # Set defaults
            description = 'None'
            pubdate = time.strftime('%a, %d %b')
            # Problem: 0-2 create many in an array
            # 3-5 create one.
            # So no for-div for 3-5

            if i == 0:
                print("Starting TV Archives")
                for div in soup.findAll(self.catList[i][2], self.catList[i][3]):
                    print("Next DIV:")
                    print(div)
                    a = div
                    summary = div.find(True, attrs={'class': 'summary'})
                    if summary:
                        description = self.tag_to_string(
                            summary, use_alt=False)
                    if not a:
                        continue
                    # url = baseURL+re.sub(r'\?.*', '', a['href'])
                    url = baseURL + a['href']
                    url = self.extractPrintURL(
                        baseURL, url, "Print this entry")
                    title = self.tag_to_string(a, use_alt=True).strip()
                    articleList.append(
                        dict(title=title, url=url, date=pubdate, description=description, content=''))

            else:       # Current Column
                titleSpan = soup.find(self.catList[i][2], self.catList[i][3])
                if titleSpan is None:
                    print("No Current Column Title Span")
                    print(soup)
                    continue
                title = titleSpan.contents[0]
                url = self.extractPrintURL(baseURL, self.catList[i][
                                           1], "Print This Article")
            if i == 1:
                if self.debugMessages:
                    print(self.catList[i][0] + " Title:" +
                          title + " at url: " + url)
                summary = div.find(True, attrs={'class': 'summary'})
                print("At Summary")
                print(summary)
                if summary is not None:
                    description = self.tag_to_string(summary, use_alt=False)
                print("At append")
                articleList.append(
                    dict(title=title, url=url, date=pubdate, description=description, content=''))
            self.catList[i][3] = articleList
            fullReturn.append((self.catList[i][0], articleList))
            print("Returning")
            # print fullReturn
        return fullReturn

    def parse_index(self):
        # Parse the page into Python Soup
        print("Entering recipe print_index from:")
        traceback.print_stack()
        print("web")
        baseURL = "https://www.billoreilly.com"
        masterList = self.parseGeneric(baseURL)
        # print(masterList)
        return masterList

    def preprocess_html(self, soup):
        print("In preprocess_html")
        refresh = soup.find('meta', {'http-equiv': 'refresh'})
        if refresh is None:
            return soup
        content = refresh.get('content').partition('=')[2]
        raw = self.browser.open('https://www.billoreilly.com' + content).read()
        return BeautifulSoup(raw.decode('cp1252', 'replace'))

    def build_index(self):
        print("In OReilly build_index()\n\n")
        feedsRSS = []
        self.report_progress(0, ('Fetching feeds...'))
        # try:
        feeds = feeds_from_index(self.parse_index(), oldest_article=self.oldest_article,
                                 max_articles_per_feed=self.max_articles_per_feed,
                                 log=self.log)
        self.report_progress(0, ('Got feeds from index page'))
        # except NotImplementedError:
        #    feeds = self.parse_feeds()
        # Now add regular feeds.
        feedsRSS = self.parse_feeds()
        print("feedsRSS is type " + feedsRSS.__class__.__name__)

        for articles in feedsRSS:
            print("articles is type " + articles.__class__.__name__)
            print("Title:" + articles.title)
            feeds.append(articles)
        if not feeds:
            raise ValueError('No articles found, aborting')

        self.report_progress(0, ('Trying to download cover...'))
        self.download_cover()
        self.report_progress(0, ('Generating masthead...'))
        self.masthead_path = None

        try:
            murl = self.get_masthead_url()
        except:
            self.log.exception('Failed to get masthead url')
            murl = None

        if murl is not None:
            # Try downloading the user-supplied masthead_url
            # Failure sets self.masthead_path to None
            self.download_masthead(murl)
        if self.masthead_path is None:
            self.log.info("Synthesizing mastheadImage")
            self.masthead_path = os.path.join(
                self.output_dir, 'mastheadImage.jpg')
            try:
                self.default_masthead_image(self.masthead_path)
            except:
                self.log.exception('Failed to generate default masthead image')
                self.masthead_path = None

        if self.test:
            feeds = feeds[:2]
        self.has_single_feed = len(feeds) == 1

        index = os.path.join(self.output_dir, 'index.html')

        html = self.feeds2index(feeds)
        with open(index, 'wb') as fi:
            fi.write(html)

        self.jobs = []

        if self.reverse_article_order:
            for feed in feeds:
                if hasattr(feed, 'reverse'):
                    feed.reverse()

        self.feed_objects = feeds
        for f, feed in enumerate(feeds):
            feed_dir = os.path.join(self.output_dir, 'feed_%d' % f)
            if not os.path.isdir(feed_dir):
                os.makedirs(feed_dir)

            for a, article in enumerate(feed):
                if a >= self.max_articles_per_feed:
                    break
                art_dir = os.path.join(feed_dir, 'article_%d' % a)
                if not os.path.isdir(art_dir):
                    os.makedirs(art_dir)
                try:
                    url = self.print_version(article.url)
                except NotImplementedError:
                    url = article.url
                except:
                    self.log.exception(
                        'Failed to find print version for: ' + article.url)
                    url = None
                if not url:
                    continue
                func, arg = (self.fetch_embedded_article, article) \
                    if self.use_embedded_content or (self.use_embedded_content is None and feed.has_embedded_content()) \
                    else \
                            ((self.fetch_obfuscated_article if self.articles_are_obfuscated
                              else self.fetch_article), url)
                req = WorkRequest(func, (arg, art_dir, f, a, len(feed)),
                                  {}, (f, a), self.article_downloaded,
                                  self.error_in_article_download)
                req.feed = feed
                req.article = article
                req.feed_dir = feed_dir
                self.jobs.append(req)

        self.jobs_done = 0
        tp = ThreadPool(self.simultaneous_downloads)
        for req in self.jobs:
            tp.putRequest(req, block=True, timeout=0)

        self.report_progress(
            0, ('Starting download [%d thread(s)]...') % self.simultaneous_downloads)
        while True:
            try:
                tp.poll()
                time.sleep(0.1)
            except NoResultsPending:
                break
        for f, feed in enumerate(feeds):
            print("Writing feeds for " + feed.title)
            html = self.feed2index(f, feeds)
            feed_dir = os.path.join(self.output_dir, 'feed_%d' % f)
            with open(os.path.join(feed_dir, 'index.html'), 'wb') as fi:
                fi.write(html)
        self.create_opf(feeds)
        self.report_progress(1, ('Feeds downloaded to %s') % index)

        return index
PK�X,[�fforiental_daily.png�PNG


IHDR�a-IDATx�b�O!������ɀ��@C� �� 	$!	I	!!�@��"@ �=@ �Z���m�mǏ��R�̝��s��ϧ��I�As'X�<	�LL2�R0�x���@�l�K%��m�h�T�,���
J�n� ���s9d��!������n��SH$$���vx��5d��9�~�#4�P�A�bj��D:8����^�HD�&�.h�
�D��@�x_z��h���*��xHўX�`�%P�~�{^~jC��lI�z2	�!�n�ˤ���˒`Z�m���nI0dIEND�B`�PK�X!�KKoriental_daily.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Larry Chan <larry1chan at gmail.com>'
'''
oriental daily
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class OrientalDaily(BasicNewsRecipe):
    title = 'Oriental Dailly'
    __author__ = 'Larry Chan'
    description = 'News from HK'
    oldest_article = 2
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'Oriental Daily'
    category = 'news, HK, world'
    language = 'zh'
    publication_type = 'newsportal'
    extra_css = ' body{ font-family: Verdana,Helvetica,Arial,sans-serif } .introduction{font-weight: bold} .story-feature{display: block; padding: 0; border: 1px solid; width: 40%; font-size: small} .story-feature h2{text-align: center; text-transform: uppercase} ' # noqa
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }
    masthead_url = 'https://upload.wikimedia.org/wikipedia/commons/4/4f/Orisun.JPG'
    remove_tags_after = dict(id='bottomNavCTN')

    keep_only_tags = [
        dict(name='div', attrs={'id': ['leadin', 'contentCTN-right']})

    ]

    remove_tags = [
        dict(name='div', attrs={
             'class': ['largeAdsCTN', 'contentCTN-left', 'textAdsCTN', 'footerAds clear']}),
        dict(name='div', attrs={'id': ['articleNav']})

    ]

    remove_attributes = ['width', 'height', 'href']

    summary_length = 0

    feeds = [(u'Oriental Daily', u'http://orientaldaily.on.cc/rss/news.xml')]
PK�X�]r��origo_hu.png�PNG


IHDR(-SNPLTEB��������B��G�����������������ɪ�ʻ�Լ����������僯���������섯����H��q��r��	ٻtRNS�8v{VIDATx�t���0C����p�4̠�X)���g��+I�*<@x��~1~ ���M�L��a�����*ٍ~!��m��0�~��>jN��a��IEND�B`�PK�X l��origo_hu.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1348136299(BasicNewsRecipe):
    title = u'[origo]'
    oldest_article = 2
    language = 'hu'
    auto_cleanup = True

    __author__ = 'laca'
    simultaneous_downloads = 1
    max_articles_per_feed = 50

    feeds = [(u'Itthon', u'http://origo.hu/contentpartner/rss/itthon/origo.xml'),
             (u'Nagyvilág', u'http://origo.hu/contentpartner/rss/nagyvilag/origo.xml'),
             (u'Gazdaság', u'http://origo.hu/contentpartner/rss/uzletinegyed/origo.xml'),
             (u'Egészség', u'http://static2.origos.hu/contentpartner/rss/egeszseg/origo.xml'),
             (u'Tudomány', u'http://origo.hu/contentpartner/rss/tudomany/origo.xml'),
             (u'Techbázis', u'http://origo.hu/contentpartner/rss/techbazis/origo.xml'),
             (u'Szoftverbázis', u'http://www.szoftverbazis.hu/rss/index.xml'),
             (u'Sport', u'http://origo.hu/contentpartner/rss/sport/origo.xml'),
             (u'Szórakozás', u'http://origo.hu/contentpartner/rss/szorakozas/origo.xml'),
             (u'Időjárás', u'http://static1.origos.hu/contentpartner/rss/idojaras/origo.xml'),
             (u'Filmklub', u'http://origo.hu/contentpartner/rss/filmklub/origo.xml'),
             (u'Utazás', u'http://origo.hu/contentpartner/rss/utazas/origo.xml'),
             (u'Autó', u'http://origo.hu/contentpartner/rss/auto/origo.xml'),
             (u'Komment.hu', u'http://static5.origos.hu/contentpartner/rss/velemeny/origo.xml'),
             (u'365.hu', u'http://origo.hu/contentpartner/rss/365/origo.xml'),
             (u'Quart', u'http://www.quart.hu/contentpartner/rss/quart/origo.xml'),
             (u'Forma-1', u'http://www.f1hirek.hu/contentpartner/rss/f1hirek/f1hirek.xml')]
PK�X8��ZZorlando_sentinel.png�PNG


IHDR  V%(!IDAT�O(Cq��$���%$�l���� 9��� �'K�q�rY�D��j7�J�@S�r�Hy[�����������l
�6��Q��X7��P5������J̚\��x��&��FbLB�/p�;�C�����3�<"�|�vCQHܟ��e�ܹ"�V�P��L��O��H~�퐨�),~2�ָA2fCQ�S��]�{$U)w�:!����)�3�,����M�u2@b?��5����L�B���y��T/�ߙ�O�����Z4*]��vT����|˭wH�IEND�B`�PK�X
᝛�orlando_sentinel.recipeimport re
try:
    from urllib.parse import unquote
except ImportError:
    from urllib import unquote
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1279258912(BasicNewsRecipe):
    title = u'Orlando Sentinel'
    oldest_article = 3
    max_articles_per_feed = 100

    feeds = [
        (u'News', u'http://feeds.feedburner.com/orlandosentinel/news'),
        (u'Opinion', u'http://feeds.feedburner.com/orlandosentinel/news/opinion'),
        (u'Business', u'http://feeds.feedburner.com/orlandosentinel/business'),
        (u'Technology', u'http://feeds.feedburner.com/orlandosentinel/technology'),
        (u'Space and Science', u'http://feeds.feedburner.com/orlandosentinel/news/space'),
        (u'Entertainment', u'http://feeds.feedburner.com/orlandosentinel/entertainment'),
        (u'Life and Family',
         u'http://feeds.feedburner.com/orlandosentinel/features/lifestyle'),
    ]
    __author__ = 'rty'
    publisher = 'OrlandoSentinel.com'
    description = 'Orlando, Florida, Newspaper'
    category = 'News, Orlando, Florida'

    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en'
    encoding = 'utf-8'
    conversion_options = {'linearize_tables': True}
    remove_empty_feeds = True

    auto_cleanup = True

    def get_article_url(self, article):
        ans = None
        try:
            s = article.summary
            ans = unquote(
                re.search(r'href=".+?bookmark.cfm.+?link=(.+?)"', s).group(1))
        except:
            pass
        if ans is None:
            link = article.get('feedburner_origlink', None)
            if link and link.split('/')[-1] == "story01.htm":
                link = link.split('/')[-2]
                encoding = {'0B': '.', '0C': '/', '0A': '0', '0F': '=', '0G': '&',
                            '0D': '?', '0E': '-', '0N': '.com', '0L': 'http:',
                            '0S': '//', '0H': ','}
                for k, v in encoding.items():
                    link = link.replace(k, v)
                ans = link
            elif link:
                ans = link
        if ans is not None:
            return ans.replace('?track=rss', '')
PK�X�U�:66	orsai.png�PNG


IHDR��h6�IDATx�Ah�qǿ���lٌ8�KDR.ʅ�̍�rs�"��TjK��!*�I]�������4K&Y��H�@l �� *�
� &l��m� (��W:1��M殁�ó�%�m� 0����{�������������m�BBIRDQvG�V��������ywf`e�Q�B)\�jiIn��R���i�b�.��O�mL�r!�,e��;6�U%R�hmojn�y�?3_�}M�&�F.$�$Y���t��Fc>
7��e.�X��yin�$�Jʒ����;ϯ]��p|�W���o咖z�u��bM�\�܆���2������>�~����K��]���:��͞�'�qLL�H�f�_���cӅw뮽=2���-}v\a��r�S�]5�D瓉m�F�������?  0q\C�D`J�0`L���J2)5P�IJBJ*$��I�$%
A�ǻ�ӝ`�`@��m�@��LIT�2|'$hX,IEND�B`�PK�X*����orsai.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
orsai.bitacoras.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Orsai(BasicNewsRecipe):
    title = 'Orsai'
    __author__ = 'Darko Miletic'
    language = 'es'
    oldest_article = 35
    max_articles_per_feed = 100
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = False
    publication_type = 'blog'
    masthead_url = 'http://orsai.bitacoras.com/wp-content/themes/orsai/images/logo_orsai.png'

    conversion_options = {
        'comment': 'Blog literario de Hernán Casciari', 'tags': 'blog, Argentina, España, literatura, Casciari',
        'publisher': 'Editorial Orsai S.L.', 'language': 'es'
    }

    keep_only_tags = [dict(
        attrs={'class': ['entry-title', 'entry-meta', 'entry-content', 'commentlist']})]
    remove_tags = [dict(name='img', attrs={'class': 'avatar avatar-40 photo'})]
    feeds = [(u'Articulos', u'http://orsai.bitacoras.com/feed')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X��?++osel_cz.png�PNG


IHDR��h6�IDATx�c��������"������/�4|���͛�V-U5���M�
��/^�c]��n��	���=���W|^�~����鐞����.� �����8u��~ؾk�������wL�����������0Hrv
@`��^�ilb�����kal�`y��~�hp
�ww�Q�r���H.�+̭.�*H�q��R�U�UmlkDh��讓�������kfq���9�,o����/m��LO�wu�wvB��i��Rb�r�2KR��45��K*����32RC��S�^�x��n�h��c��"������\�X�p��Ջw�8x8+����Kf�dL_8���-(!�3�����+�3(>��懼�܋�ϗu���Z�{"8s�<��Ĭ$� oW���ؚ��������+��ESkw���������SXR|^U)��o^���<"�)����]P^����m�wE&Ć�G%�d�쾠�MIEND�B`�PK�X3Ϋf]]osel_cz.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class OselCZ(BasicNewsRecipe):
    title = 'OSEL.cz'
    __author__ = 'spacekpe'
    oldest_article = 100
    max_articles_per_feed = 100
    auto_cleanup = True
    recursions = 1
    language = 'cs'

    feeds = [
        ('OSEL.cz', 'http://www.osel.cz/rss/rss.php'),
    ]

    def print_version(self, url):
        return url.replace('http://www.osel.cz/index.php?clanek=', 'http://www.osel.cz/tisk.php?clanek=')

    def get_cover_url(self):
        return 'http://www.osel.cz/themes/default/logo_osel.gif'

    def is_link_wanted(self, url, tag):
        if url.startswith('http://www.osel.cz/popisek.php'):
            return True
        else:
            return False
PK�X���p::osvitaua.png�PNG


IHDR  D���pPLTE�����������������������"#鳳�	�XY�>?�������뾾����''�������콽�����䣣�����#'�%'䠠�����02����||��==�FG�00�	��]]�����mm�~�������������ކ���������������������ii���뻻������ᕕ�JJ���麺����"%��������hi椤�|}���쾾��lm�#%�%'꾾�##塠糳第݃�����KK�''��������݄�塡�꺺�de������ޅ�컻姧�kk����gh���������������跷�mm簰竫�ߓ����ہ����壣���篯豱�����������//�""����HJ�KK���ߏ�籱�������݁�鶶���鲳����������79뾿媪楥���橪�ac�-/����ff����		��>?�NN����%%���㣣�tt�:<�=>�����'(���݇��**������BB�����姨�55���� 鷷�gg����<=��gh�rs�LL�^_��	��������IDATx�\�c�$KDO���m�ضm[w�m۶m۶��?kU���k���b�|E�6d�B�<���������T����<>KT� %;R��+�wG�qE��UP�PI��»�f/�8?��'�ȶW�Eb�'�D�G����>��	O�hJ�)�j���.�����:�`�hU���(m�Mq�9h��<��.�I�6��Blв��ۜ���[o�V�s�B#>���Q$5�u�/�d�/��V}*e30Y���P��YE��篿��L]��5�D����X�b�9�Tj�+��ŋ"�Y�	v�J}sy��s[m��YW��ꛮ�i�^��=��r�g�7KH�^*͚����/�8#w�y��߃M\,��͇{4�H�>����_�̇#֐(lP<�06��G{�6#N,ً���'me���3�JgIs�|�^,B����h��ʉ3
�)�Z���1�U���i��M9�2�k�m+2��ƻ�:��Yz�Տӟ|�%��L8f���2��׳�|���˕sX&�4v���Y��v�����v��\2��w�����?�}���v����ۉ��D���O���bcc;�-�I���,7�	�6��3�����{�y	f��|����IIEND�B`�PK�X]^g���osvitaua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Osvita(BasicNewsRecipe):
    title = '\u041E\u0441\u0432\u0456\u0442\u0430.ua'
    __author__ = 'bugmen00t'
    description = '\u0423\u0441\u0435 \u043F\u0440\u043E \u043E\u0441\u0432\u0456\u0442\u0443 \u0432 \u0423\u043A\u0440\u0430\u0457\u043D\u0456 \u0442\u0430 \u0437\u0430 \u043A\u043E\u0440\u0434\u043E\u043D\u043E\u043C: \u0442\u0435\u043C\u0430\u0442\u0438\u0447\u043D\u0438\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u043F\u0440\u0438\u0441\u0432\u044F\u0447\u0435\u043D\u0438\u0439 \u043E\u0441\u0432\u0456\u0442\u0456 \u0432 \u0423\u043A\u0440\u0430\u0457\u043D\u0456 \u0442\u0430 \u0437\u0430 \u0457\u0457 \u043C\u0435\u0436\u0430\u043C\u0438, \u0454 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u0438\u043C \u0434\u0436\u0435\u0440\u0435\u043B\u043E\u043C \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0457 \u0443 \u0446\u0456\u0439 \u0441\u0444\u0435\u0440\u0456.'  # noqa
    publisher = '\u041E\u0441\u0432\u0456\u0442\u0430.ua'
    category = 'blog'
    cover_url = u'http://osvita.ua/doc/i/Contacts-logo.jpg'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='div', attrs={'id': 'body'})

    remove_tags_after = dict(name='div', attrs={'id': 'body'})

    remove_tags = [
        # Unable to fetch images, removing them completely
        dict(name='img'),
        dict(name='p', attrs={'class': 'info'})
    ]

    feeds = [('\u041D\u043E\u0432\u0438\u043D\u0438', 'https://osvita.ua/rss/')]

    def print_version(self, url):
        return url + 'print'
PK�X���p::osvitaua_ru.png�PNG


IHDR  D���pPLTE�����������������������"#鳳�	�XY�>?�������뾾����''�������콽�����䣣�����#'�%'䠠�����02����||��==�FG�00�	��]]�����mm�~�������������ކ���������������������ii���뻻������ᕕ�JJ���麺����"%��������hi椤�|}���쾾��lm�#%�%'꾾�##塠糳第݃�����KK�''��������݄�塡�꺺�de������ޅ�컻姧�kk����gh���������������跷�mm簰竫�ߓ����ہ����壣���篯豱�����������//�""����HJ�KK���ߏ�籱�������݁�鶶���鲳����������79뾿媪楥���橪�ac�-/����ff����		��>?�NN����%%���㣣�tt�:<�=>�����'(���݇��**������BB�����姨�55���� 鷷�gg����<=��gh�rs�LL�^_��	��������IDATx�\�c�$KDO���m�ضm[w�m۶m۶��?kU���k���b�|E�6d�B�<���������T����<>KT� %;R��+�wG�qE��UP�PI��»�f/�8?��'�ȶW�Eb�'�D�G����>��	O�hJ�)�j���.�����:�`�hU���(m�Mq�9h��<��.�I�6��Blв��ۜ���[o�V�s�B#>���Q$5�u�/�d�/��V}*e30Y���P��YE��篿��L]��5�D����X�b�9�Tj�+��ŋ"�Y�	v�J}sy��s[m��YW��ꛮ�i�^��=��r�g�7KH�^*͚����/�8#w�y��߃M\,��͇{4�H�>����_�̇#֐(lP<�06��G{�6#N,ً���'me���3�JgIs�|�^,B����h��ʉ3
�)�Z���1�U���i��M9�2�k�m+2��ƻ�:��Yz�Տӟ|�%��L8f���2��׳�|���˕sX&�4v���Y��v�����v��\2��w�����?�}���v����ۉ��D���O���bcc;�-�I���,7�	�6��3�����{�y	f��|����IIEND�B`�PK�X�Fn�88osvitaua_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Osvita(BasicNewsRecipe):
    title = '\u041E\u0441\u0432\u0456\u0442\u0430.ua'
    __author__ = 'bugmen00t'
    description = '\u0422\u0435\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u043F\u043E\u0441\u0432\u044F\u0449\u0451\u043D\u043D\u044B\u0439 \u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044E \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435 \u0438 \u0437\u0430 \u0440\u0443\u0431\u0435\u0436\u043E\u043C.'  # noqa
    publisher = '\u041E\u0441\u0432\u0456\u0442\u0430.ua'
    category = 'blog'
    cover_url = u'http://osvita.ua/doc/i/Contacts-logo.jpg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='div', attrs={'id': 'body'})

    remove_tags_after = dict(name='div', attrs={'id': 'body'})

    remove_tags = [
        # Unable to fetch images, removing them completely
        dict(name='img'),
        dict(name='p', attrs={'class': 'info'})
    ]

    feeds = [('\u041D\u043E\u0432\u0438\u043D\u0438', 'https://ru.osvita.ua/rss/')]

    def print_version(self, url):
        return url + 'print'
PK�X�e�&��osw.png�PNG


IHDR�a{IDATx�b�i��m���a�d 9I����W&�̜���9��9IΙ�I���dIH�����NrH�$�I�9$!��w9�������)��5"�Y���qN���D�9�s�� ��*�)R��F�f�*�?�H�3�Q�B�����8���>�\$�8�}�1b”����L�B����˔=�3��IA,Q�D�����K~�_|�3�ؤH�D�f�6;L�e�;�y�8���h������O�r�wB6�)�$R�D�
wy„C
��Xb�D�Z�ŀm�0d@�� ��i)���Y��xE��U�t�.yʬС����S"�^b�]�,S�F�
"����f��G��L�~f����_�w9��iQ �Q#Ɉ$IEND�B`�PK�X9���
osw.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com>'

'''
http://www.osw.waw.pl - Osrodek studiow wschodnich
'''

from calibre.web.feeds.news import BasicNewsRecipe


class OSW_Recipe(BasicNewsRecipe):

    language = 'pl'
    title = u'Ośrodek Studiów Wschodnich'
    __author__ = 'teepel <teepel44@gmail.com>'
    INDEX = 'http://www.osw.waw.pl'
    description = u'Ośrodek Studiów Wschodnich im. Marka Karpia. Centre for Eastern Studies.'
    category = u'News'
    oldest_article = 7
    max_articles_per_feed = 100
    cover_url = ''
    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True
    simultaneous_downloads = 5

    keep_only_tags = []
    keep_only_tags.append(dict(name='h2', attrs={'class': 'node-title'}))
    keep_only_tags.append(dict(name='div', attrs={'class': 'content clearfix'}))

    remove_tags = []
    remove_tags.append(dict(name='table', attrs={'id': 'attachments'}))
    remove_tags.append(dict(name='div', attrs={'class': 'print-submitted'}))

    feeds = [(u'OSW', u'https://www.osw.waw.pl/pl/rss.xml')]

    def print_version(self, url):
        return url.replace('https://www.osw.waw.pl/pl/', 'https://www.osw.waw.pl/pl/print/')
PK�Xk^�8||ottawa_citizen.png�PNG


IHDR  D���IPLTEv���н�Ѿx���н��ì�Ǵ�͵�͜ϼ��Րð����¥�™̹��Ū�ƛλ��Ȯ�Ȳ��y���м��θ�Ϲ�л�ѽ��|�������������������ð��̞ѽ��Ķ�ͨ�ŷ�η�Ψ�Ŋ���ҿ��ҫ�ƾ���բ������������������ٚͺ���z����ʝѾ���������������������̡�������ķ��������…�������Ç������������ȼy����Nj����ǎ����Ȭ�ǭ�ȭ�Ǐ������ǐ����ɯ�ʰ���ɰ�ʰ�ʱ�����ː¯���z��{���°�ı�Ų��͓���Ų��Ƿ�͔���Ƴ��ϕǴ��Еȵ��ʺ�к�ѻ�ʖɶ��Ҽ�їʷ�����Ӿ�;��|����Կ���Ԛ̹w���ϻ���|���ϼ~��������~������������ٝϼ�����������������ہ����םо��݂��������������������н������������о��烵�������Ѿ������������ѿ�ҿ�ѿ�󄵢�EHh��IDATx�l΃b�P��̜�m��ݭ{m۶m۶m/V���Pb�%Q��9y V�h�AS���9$�� �|O�����?�!Z��B�7|BI�ԀX�``�-)�V�� 0Z	�:9XO�Ō��k䀌9�qD6)�69��Q�9.�A	`���j��x՝����A}J	.�8/a��.0Ð�w�C+*
�o$,�<���ǥޮQ�R��gg�//t��>.Yࢯ3��px)db����a5��_��?��D�W�)9�}âe�t?]��1ۖ�v�5��7[�;À���oo��D������n�?Zn���dy�� ā
��;@<L�0��Gj�eCUm�@QU�
���Ɲ��^<v��0/��i�g*�"i��77t3��t�4�W-�_�|�0�_O��˽#�]JW�e��&w�2� ����[
�f������'�M�ޔ��l��7��7Y�X*!��4P�!y��#D
�Gp\v��IEND�B`�PK�X��B��3�3ottawa_citizen.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
__license__ = 'GPL v3'

'''
www.canada.com
'''
import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class CanWestPaper(BasicNewsRecipe):

    postmedia_index_pages = [
        (u'Headlines', u'/index.html'),
        (u'Ottawa & Area', u'/news/ottawa/index.html'),
        (u'Vancouver', u'/news/vancouver/index.html'),
        (u'Calgary', u'/news/calgary/index.html'),
        (u'Edmonton', u'/news/edmonton/index.html'),
        (u'Montreal', u'/news/montreal/index.html'),
        (u'Fraser Valley', u'/news/fraser-valley/index.html'),
        (u'British Columbia', u'/news/bc/index.html'),
        (u'Alberta', u'/news/alberta/index.html'),
        (u'Canada', u'/news/canada/index.html'),
        (u'National', u'/news/national/index.html'),
        (u'Politics', u'/news/politics/index.html'),
        (u'Insight', u'/news/insight/index.html'),
        (u'Special Reports', u'/news/specialreports/index.html'),
        (u'Gangs', u'/news/gangs/index.html'),
        (u'Education', u'/news/education/index.html'),
        (u'Health', u'/news/health/index.html'),
        (u'Environment', u'/news/environment/index.html'),
        (u'World', u'/news/world/index.html'),
        (u'Police Blotter', u'/news/crime-and-justice/index.html'),
        (u'Crime', u'/news/blotter/index.html'),
        (u'Around Town', u'/news/topic.html?t=keyword&q=Around+Town'),
        (u'Diplomatica', u'/news/diplomatica/index.html'),
        (u'Opinion', u'/opinion/index.html'),
        (u'Columnists', u'/columnists/index.html'),
        (u'Editorials', u'/opinion/editorials/index.html'),
        (u'Letters', u'/opinion/letters/index.html'),
        (u'Business', u'/business/index.html'),
        (u'Sports', u'/sports/index.html'),
        (u'Arts', u'/entertainment/index.html'),
        (u'Life', u'/life/index.html'),
        (u'Technology', u'/technology/index.html'),
        (u'Travel', u'/travel/index.html'),
        (u'Health', u'/health/index.html')
    ]

    # un-comment the following six lines for the Vancouver Province
    # title = u'Vancouver Province'
    # url_prefix = 'http://www.theprovince.com'
    # description = u'News from Vancouver, BC'
    # std_logo_url = 'http://www.theprovince.com/images/logo_theprovince.jpg'
    # logo_url = 'vplogo.jpg'
    # fp_tag = 'CAN_TP'

    # un-comment the following six lines for the Vancouver Sun
    # title = u'Vancouver Sun'
    # url_prefix = 'http://www.vancouversun.com'
    # description = u'News from Vancouver, BC'
    # std_logo_url = 'http://www.vancouversun.com/images/logo_vancouversun.jpg'
    # logo_url = 'vslogo.jpg'
    # fp_tag = 'CAN_VS'

    # un-comment the following six lines for the Calgary Herald
    # title = u'Calgary Herald'
    # url_prefix = 'http://www.calgaryherald.com'
    # description = u'News from Calgary, AB'
    # std_logo_url = 'http://www.calgaryherald.com/images/logo_calgaryherald.jpg'
    # logo_url = 'chlogo.jpg'
    # fp_tag = 'CAN_CH'

    # un-comment the following six lines for the Edmonton Journal
    # title = u'Edmonton Journal'
    # url_prefix = 'http://www.edmontonjournal.com'
    # description = u'News from Edmonton, AB'
    # std_logo_url = 'http://www.edmontonjournal.com/images/logo_edmontonjournal.jpg'
    # logo_url = 'ejlogo.jpg'
    # fp_tag = 'CAN_EJ'

    # un-comment the following six lines for the Ottawa Citizen
    title = u'Ottawa Citizen'
    url_prefix = 'http://www.ottawacitizen.com'
    description = u'News from Ottawa, ON'
    std_logo_url = 'http://www.ottawacitizen.com/images/logo_ottawacitizen.jpg'
    logo_url = 'oclogo.jpg'
    fp_tag = 'CAN_OC'

    # un-comment the following six lines for the Montreal Gazette
#    title = u'Montreal Gazette'
#    url_prefix = 'http://www.montrealgazette.com'
#    description = u'News from Montreal, QC'
#    std_logo_url = 'http://www.montrealgazette.com/images/logo_montrealgazette.jpg'
#    logo_url = 'mglogo.jpg'
#    fp_tag = 'CAN_MG'

    Kindle_Fire = False
    masthead_url = std_logo_url

    url_list = []
    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    encoding = 'utf-8'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: small;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                .photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                #photocredit { font-size: xx-small; font-weight: normal; }'''

    keep_only_tags = [dict(name='div', attrs={'id': re.compile('story')})]

    remove_tags = [{'class': 'comments'}, {'class': 'comment-intro'}, {'class': 'storytab'},
                   dict(name='div', attrs={'class': 'section_title'}), dict(name='div', attrs={'class': 'sharebar'}), dict(
                       name='div', attrs={'class': 'navbar'}), dict(name='div', attrs={'class': 'morelinks'}),
                   dict(name='h2', attrs={'id': 'photocredit'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='div', attrs={'id': 'soundoff'}),
                   dict(name='div', attrs={'id': re.compile('flyer')}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def get_cover_url(self):
        from datetime import timedelta, date
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        # delete empty id attributes--they screw up the TOC for unknown reasons
        divtags = soup.findAll('div', attrs={'id': ''})
        if divtags:
            for div in divtags:
                del(div['id'])

        pgall = soup.find('div', attrs={'id': 'storyphoto'})
        if pgall is not None:  # photo gallery perhaps
            if (soup.find('div', attrs={'id': 'storycontent'}) is None):
                allpics = new_tag(soup, 'div')
                first_img = pgall.find('div', 'storyimage')
                if first_img is not None:
                    first_img.extract()
                    tlist = pgall.find('div', attrs={'id': 'relatedthumbs'})
                    if tlist is not None:
                        for atag in tlist.findAll('a'):
                            img = new_tag(soup, 'img')
                            srcpre, sep, srcpost = atag.img[
                                'src'].partition('?')
                            img['src'] = srcpre
                            pdesc = new_tag(soup, 'p')
                            pdesc.insert(0, atag.img['alt'])
                            pdesc['class'] = 'photocaption'
                            div = new_tag(soup, 'div')
                            div.insert(0, pdesc)
                            div.insert(0, img)
                            allpics.append(div)
                pgall.replaceWith(allpics)

        for pg in soup.findAll('div', attrs={'id': 'storyphoto'}):
            pg.extract()
        return self.strip_anchors(soup)

    def parse_index(self):

        articles = {}
        ans = []

        def handle_article(adiv, key):
            if adiv.name == 'h1' or adiv.name == 'h3':
                h1tag = adiv
            else:
                h1tag = adiv.h1
                if h1tag is None:
                    h1tag = adiv.h3
            if h1tag is not None:
                atag = h1tag.a
                if atag is not None:
                    url = atag['href']
                    if url.startswith('/'):
                        url = self.url_prefix + url
                    if not url.startswith(self.url_prefix):
                        print("Rejected " + url)
                        return
                    if url in self.url_list:
                        print("Rejected dup " + url)
                        return
                    self.url_list.append(url)
                    title = self.tag_to_string(atag, False)
                    if 'VIDEO' in title.upper():
                        return
                    if 'GALLERY' in title.upper():
                        return
                    if 'PHOTOS' in title.upper():
                        return
                    dtag = adiv.find('div', 'content')
                    description = ''
                    print("URL " + url)
                    print("TITLE " + title)
                    if dtag is not None:
                        stag = dtag.span
                        if stag is not None:
                            if ''.join(stag['class']) != 'timestamp':
                                description = self.tag_to_string(stag, False)
                        else:
                            description = self.tag_to_string(dtag, False)
                        print("DESCRIPTION: " + description)
                    if key not in articles:
                        articles[key] = []
                    articles[key].append(dict(
                        title=title, url=url, date='', description=description, author='', content=''))

        def parse_web_index(key, keyurl):
            print("Section: " + key + ': ' + self.url_prefix + keyurl)
            try:
                soup = self.index_to_soup(self.url_prefix + keyurl)
            except:
                print("Section: " + key + ' NOT FOUND')
                return
            ans.append(key)
            mainsoup = soup.find('div', 'bodywrapper')
            footer = mainsoup.find(attrs={'id': 'footerfeature'})
            if footer is not None:
                footer.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['genericfeature']}):
                wdiv.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['headline', 'featurecontent']}):
                handle_article(wdiv, key)

        for (k, url) in self.postmedia_index_pages:
            parse_web_index(k, url)
        ans = [(key, articles[key]) for key in ans if key in articles]
        return ans
PK�X[�A�ourdailybread.png�PNG


IHDR��h6�IDATxU��n�a���?iC[�rXJC��T
e�VX�� �Э�BS]��EDB�LK3�|�󘙝+�\yL��(�le�R9P��7g�n�]�}�Ե�����PJSZQ����KQ"@�@�R"(QZ�hE@D@09"�D�>YN#<����@#�DEK�}زۀ1`c�Q�C��-[J)%�l��5��6VZ��dY�n�5�c[���H	`K��df "��v:%�Hi�r�5'�FfO�Y{��3�g�铇%���������(�����o����p�X*/�ϼ|���� U`�����~�ꜥ&���3���&�G��NN�nv����/[;�:05.��Z�����
(�d@)�T e��;��S{G�}�YS_���&w[t��R�|���7���ݕ�d��V��N��/���OV�g���>Z�5�<|v��q��{O-��p��Y�d�/5d�֖��Z���IEND�B`�PK�Xr���
�
ourdailybread.recipe
__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
odb.org
'''

from calibre.web.feeds.news import BasicNewsRecipe
import uuid
from lxml import html


class OurDailyBread(BasicNewsRecipe):
    title = 'Our Daily Bread'
    __author__ = 'Kovid Goyal'
    description = "Our Daily Bread is a daily devotional from RBC Ministries which helps readers spend time each day in God's Word."
    oldest_article = 15
    language = 'en'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'

    conversion_options = {
        'comments': description, 'language': language, 'linearize_tables': True
    }

    keep_only_tags = [dict(attrs={'class': 'calibre-inserted-psalm'}),
                      {'id': 'content'}]
    remove_tags = [
        dict(attrs={'class': ['listen-box', 'entry-zoom',
                              'entry-footer']}),
        {'id': 'nav-single'},
        dict(attrs={'class': lambda x: x and ' sharing ' in x}),
    ]

    extra_css = '''
                .text{font-family:Arial,Helvetica,sans-serif;font-size:x-small;}
                .devotionalTitle{font-family:Arial,Helvetica,sans-serif; font-size:large; font-weight: bold;}
                .devotionalDate{font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                .devotionalVerse{font-family:Arial,Helvetica,sans-serif; font-size:xx-small; }
                a{color:#000000;font-family:Arial,Helvetica,sans-serif; font-size:x-small;}
                '''

    feeds = [(u'Our Daily Bread', u'http://odb.org/feed/')]

    def preprocess_raw_html(self, raw, url):
        # Convert links to referenced Psalms to the actual psalms
        root = html.fromstring(raw)
        for a in root.xpath(
                '//a[starts-with(@href, "http://www.biblegateway.com")]'):
            uid = type(u'')(uuid.uuid4())
            raw = self.index_to_soup(a.get('href'), raw=True)
            iroot = html.fromstring(raw)
            matches = iroot.xpath(
                '//div[contains(@class, "result-text-style-normal")]')
            if matches:
                div = matches[0]
                div.getparent().remove(div)
                root.xpath('//body')[0].append(div)
                a.set('href', '#' + uid)
                del a.attrib['target']
                div.set('id', uid)
                div.set('class', 'calibre-inserted-psalm')
                hr = div.makeelement('hr')
                div.insert(0, hr)
                # print html.tostring(div)
                raw = html.tostring(root, encoding='unicode')
        return raw

    def preprocess_html(self, soup):
        d = soup.find(id='content')
        d.extract()
        soup.find('body').insert(0, d)
        return soup
PK�X��=���outlook_business_magazine.png�PNG


IHDR  szz�KIDATx����dA����{m۶�׶m۶�m۶m���Ry�k�M�a����4W�q�*Wm�KΊ@�F ���S'6 zc	���`z 5J��4L��d�B5��M�������".C|��X����c����P�g�x(��|��h�3�{\���G�
��4*���aVcAH� [��p^i~
-�H�x��;��?m�U�Bi�a�;��4�	
k4�4}��� /���^��/M���	Pr��si�Q�n�B��ۨA�#���f��x�E������Ax��.�tS��[��,�o�%��M��{xc��u�L�IJ�e	L��� ��G�Bc8�n��,�#��ج,�8��x�	h��h�)�Ix��M'CH����	���+e6��Mh�d�অpBr5��W�[q���1t��!$�4��0B�
���Z�j����c&`"&a�r���$X,��B0>��^�z�@=y�cc�B8q=���1r�:�]��6�(�=<�m���T�1�6
�0�f(%]�DZdE*����`��	����U�r�'�QK�)Oc6IEND�B`�PK�X冐	�� outlook_business_magazine.recipeimport json
import re

from calibre.web.feeds.news import BasicNewsRecipe, classes


class outlook(BasicNewsRecipe):
    title = 'Outlook Business Magazine'
    __author__ = 'unkn0wn'
    description = (
        'Outlook Business (Monthly) Magazine produces Business, Market, Startup and Leadership'
        ' content that is differentiated to offer a deeper understanding of trends shaping India. Read to hone your leadership skills.'
    )
    language = 'en_IN'
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['height', 'width', 'style']
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://imgnew.outlookindia.com/uploadimage/library/free_files/jpg/logo_2022_04_30_092331.jpg'
    extra_css = '.author{font-size:small;}'

    def parse_index(self):
        soup = self.index_to_soup('https://www.outlookbusiness.com/magazine/')
        div = soup.find('div', attrs={'class': 'SplWapper'})
        url = div.find('a', href=True)['href']
        self.cover_url = div.find('img', srcset=True)['srcset']
        self.timefmt = '[' + self.tag_to_string(div.find('h6')) + ']'
        soup = self.index_to_soup('https://www.outlookbusiness.com' + url)
        ans = []

        for section in soup.findAll(**classes('category-banner-content')):
            p = section.find(
                'p',
                attrs={'class': lambda x: x and x.startswith('styled__Content')}
            )
            desc = self.tag_to_string(p)
            head = section.find(
                'p',
                attrs={'class': lambda x: x and x.startswith('styled__Heading')}
            )
            title = self.tag_to_string(head)
            a = p.findParent('a', href=True)['href']
            if a.startswith('/'):
                url = 'https://www.outlookbusiness.com' + a
            self.log('\t', title, '\n\t', desc, '\n\t\t', url)
            ans.append({'title': title, 'description': desc, 'url': url})
        return [('Articles', ans)]

    def preprocess_raw_html(self, raw, *a):
        m = re.search('id="__NEXT_DATA__" type="application/json">', raw)
        raw = raw[m.start():]
        raw = raw.split('>', 1)[1]
        data = json.JSONDecoder().raw_decode(raw)[0]
        data = data['props']['initialState']['dashboard']['ARTICLE_POST_DETAIL_API'][
            'data']['article_data']
        title = data['title']
        body = data['description']
        cat = desc = image = author = ''
        if 'category_name' in data:
            try:
                cat = data['category_name']
            except Exception:
                cat = ''
        if 'excerpt' in data:
            desc = '<h4>' + data['excerpt'] + '</h4>'
        if 'author' in data:
            try:
                author = data['author'][0]['name']
            except Exception:
                author = ''
        if 'images' in data:
            try:
                image = '<p><img src="{}">'.format(data['images'][0]['image'])
            except Exception:
                image = ''
        html = '<html><body>' + cat + '<h1>' + title + '</h1>' + desc + '<div class="author">' + author + '</div>' + image + body
        return html
PK�X�!��??outlook_india.png�PNG


IHDR  szz�IDATxڅWc���}k�n�j۶m۶m۶ulնm۳o2�7k��~d=��N��q�U~����_��˗�=����1��p!�ڵ��L����I�M�Wo�N4j�mۮ��A��ti���۷�d��oQH��=����~Q�X�A�z�W�:�߿�Z���1bڴY��5��t�+����P�T*U�@�[ѳ�̚���Uq�R�~������\~�{u횓ڲ����\9?��}Y�\B��*�$M���@�$/�}���:�}��\E֬\(:w^�v��Mkz���D��M|�8�O͞�[U��	��xY�D��H��<[���o�(�KU��n�tiGܸ�d�J�Z���EbbF�9�"n�w��q�{��O��?�5z�O(Q"�u���H��X,��)�Z�)]�;�mH�|�-�WD�����`���b}����Aժ�ظ��=K�1H�l	q�`5t��2�4]n+�wv(lȿ��=��Ъ��<��uj��s�r�W��pr�!Jy�1>�2S![��|�2 ��AO!^�7�b�ĉ�^�,x۶�'��k"H�W�n����ʏ�FFlĞ��wg�k1b����;�3�\����ϒ�"ƌ����i�u���v�V"y�'�#Y..�HEֿG���\L<^��.�\/�a̘�Z�\C F腚��F�E��Y��n�L�תbE/5~wܺ�Q>\%K�l���'K��B�M\X�r�s)5���]��T��
W�O�
_��c>�,2J] F����!6�쩍�E�m�dR�Nb�<yN`��v��[��a;t/$����8u*,��%�Fnƞ�,߫V=�c��Ye<vﮍ\���gJ�l��[!l��C�L����(�,ұ0�'ճ�<\���aݻ�v�},C,�FΜg��90m�@�o���i���%Y�"�]��H����.�>�+
�Ł#��P�MU
lG�4��~c��)��Z����iR��Ir���1�mC,r��YD-ݡ�u[�j�؇�)�`�?m�{8p*BB�s�w�S3g�U�JR�{��4�}T�&������q)�TqgT�[�q4*�u5}zu�+g��K��4<�M�۞d���?kִr��E�V��q�	 k֋jժ6�ŋD<^��q�t��A�!�q���O�r���'��
��[~�SI���y;vԓ�M}D�}Wm��L��b�x"f�O�̡�~ұ�0�.��Spw�"�?{�D��WV<���4���mW��[
����Pv���zQm .^���'y��;�6��%��%��h��q
�7nd���+�����~�f�˫�)�ٳ{!o�6p3��<g�ѣG�������2#(�$(/��ر?�e�N}#�����e^d����"���Z��p��qs�fF*Ǔx�fZ������3�r3�$xM�O��S�%<��8���u�I&f�=��+��/���Y"��e�a����d�9���h?A�ƾ}5�M��[���n)f1ߙ�r�>9�rew̙��ş?�`��Tl��yվ�2��VZ�b���!*tL��gEr{
VhZ.gß7rՅ%8��@�Q̗��N.T:<I�裘>��t����*��(R$M�n`��BrxM҉>�lh~�S0�gF�����E�uj�l�>T�(�…�W�5��y�
��w6��Q��G�G�Rj�JE�u��-,��Q�76�/5�e4	o%��T͚�U�F����B�re;����xTbz�ג�c]9pŀ�IEND�B`�PK�Xa�w�7
7
outlook_india.recipeimport json
import re

from calibre.web.feeds.news import BasicNewsRecipe, classes


class outlook(BasicNewsRecipe):
    title = 'Outlook Magazine'
    __author__ = 'unkn0wn'
    description = (
        'Outlook covers the latest India news, analysis, business news and long-form stories on culture,'
        ' money market and personal finance. Read India\'s best online magazine.'
    )
    language = 'en_IN'
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['height', 'width', 'style']
    ignore_duplicate_articles = {'url'}
    resolve_internal_links = True
    extra_css = '''
        .story-summary{font-style:italic; color:#202020;}
        .author_wrapper, .relatedCategory{font-size:small; color:#404040;}
        #figcap{font-size:small; text-align:center;}
    '''

    keep_only_tags = [classes('__story_detail')]
    remove_tags = [
        classes(
            'social_sharing_article left_trending left-sticky __tag_links next_prev_stories '
            'downarrow uparrow more_from_author_links next prev __related_stories_thumbs home_ad_title'
        )
    ]

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based', verify_ssl_certificates=False)

    def parse_index(self):
        soup = self.index_to_soup('https://www.outlookindia.com/magazine')
        div = soup.find('div', attrs={'class':'wrapper'})
        a = div.find('a', href=lambda x: x and x.startswith('/magazine/issue/'))
        url = a['href']
        self.timefmt = ' [' + self.tag_to_string(a.find('p')).strip() + ']'
        self.log('Downloading issue:', url, self.timefmt)
        soup = self.index_to_soup('https://www.outlookindia.com' + url)
        cover = soup.find(**classes('listingPage_lead_story'))
        self.cover_url = cover.find('img', attrs={'src': True})['src']
        ans = []

        for h3 in soup.findAll(['h3', 'h4'],
                               attrs={'class': 'tk-kepler-std-condensed-subhead'}):
            a = h3.find('a', href=True)
            url = a['href']
            title = self.tag_to_string(a)
            desc = ''
            p = h3.find_next_sibling('p')
            if p:
                desc = self.tag_to_string(p)
            self.log('\t', title)
            self.log('\t', desc)
            self.log('\t\t', url)
            ans.append({'title': title, 'url': url, 'description': desc})
        return [('Articles', ans)]

    def preprocess_html(self,soup):
        for fig in soup.findAll('figure'):
            fig['id'] = 'figcap'
        return soup

    def preprocess_raw_html(self, raw, *a):
        return raw
        m = re.search('<!-- NewsArticle Schema -->.*?script.*?>', raw, flags=re.DOTALL)
        raw = raw[m.end():].lstrip()
        data = json.JSONDecoder().raw_decode(raw)[0]
        title = data['headline']
        body = data['articleBody']
        body = body.replace('\r\n', '<p>')
        author = ' and '.join(x['name'] for x in data['author'])
        image = desc = ''
        if data.get('image'):
            image = '<p><img src="{}">'.format(data['image']['url'])
        if data.get('description'):
            desc = '<h2>' + data['description'] + '</h2>'
        html = '<html><body><h1>' + title + '</h1>' + desc + '<h3>' + author + '</h3>' + image + '<p>' + body
        return html
PK�XVi�o11oxford_mail.png�PNG


IHDR��h6�IDAT�]h[U�9���sso�MӦYRӺ�ZM�uŎ*e��{N���x�m���8؋��L��� ~<*�d�ù�Z�h�fYL�dk��6ɹ���!O9��$̄f�@�ۧ���/�c��>:=���׾3�L�G�`$RY���� ��r/�շ�\]��ڷ���'?��-�g�`��� ���9 R���{c�ȋYg�j���n�g��y�����R�9Ȟ�ѝ�֥�lq���-��`7Vl
�h�v�H%,��*�1Y(0���o��-�Z�������"�>l	{0L]�A��p5�.�ڤ MKc<�+�B�:`����ʽ;U���*�'&i;�?1~���˖�r�����>��G��<c�A�O�XLy�����yy��O��a�����������"Sy#��<T,-l�_�����9�dh�v���w#$.6����@p)[��Bx7w�^s���f��`Ȗ~J�I�u�
���̿���h{o&�i�qI9��|Ϸq�X�\&�6�G�X�����c������J !t�/aɌs��F�s-���ݙB���"���͓�.g�����h�0�m5�c��Dzl�P�Z�v��'���,`K@7c�sy�K��qY۱���xF2&YZS�������X>y��Gf�e�Zw����r)�P�I���4"N�]X��“G��}�%��m'������j}�Z�q3���CS���ڕ�^��{l�D!��0�hL���kIEND�B`�PK�X����oxford_mail.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HindustanTimes(BasicNewsRecipe):
    title = u'Oxford Mail'
    language = 'en_GB'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('News',
         'http://www.oxfordmail.co.uk/news/rss/'),
        ('Sports',
         'http://www.oxfordmail.co.uk/sport/rss/'),
    ]
PK�X)����padreydecano.png�PNG


IHDR  szz�eIDATx��ցGCQ��f�	I�L�	d��$̐���7L�$d&�I�0ILA�$aHB��` y��vO�����Q?�*�!D́:B��><^DNA�8O�
�&G=>�G�!�03��q<�����0-���G=���(pB˘Be\�	���Y��CM_�R����% T_(��vOb�f	���
�]�߳4�e�~U웖�#�@ɰ/��2�+b�?j�-�M�^�7�B��/�0kЎ1��(�N�C�`�p<{��
���9q�k���9�=�m]��	Ϩ"c�jXG%��B{��AQ���'��Ɵ�8������H��� DX�u��>$�IEND�B`�PK�X�npadreydecano.recipe#!/usr/bin/env python
##
# Title:        Padreydecano.com News, Sports, and Blog
# Contact:      Carlos Alves - <carlosalves90@gmail.com>
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    Carlos Alves - <carlosalves90@gmail.com>
##
# Written:      September 2013
# Last Edited:  2018-02-13
##
__license__ = 'GPL v3'
__author__ = '2016, Carlos Alves <carlosalves90@gmail.com>'

'''
padreydecano.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class General(BasicNewsRecipe):
    title = 'Padre y Decano'
    __author__ = 'Carlos Alves'
    description = 'El sitio del pueblo'
    tags = 'soccer, futbol, Peñarol'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 5
    encoding = None
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 10
    max_articles_per_feed = 100
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'entry-title'}),
        dict(name='div', attrs={'class': 'entry-content clearfix'})
    ]

    remove_tags = [
        dict(name='div', attrs={
             'class': ['br', 'hr', 'titlebar', 'navigation']}),
        dict(name='dl', attrs={'class': 'gallery-item'}),
        dict(name=['object', 'link'])
    ]

    extra_css = '''
                h1{font-family: Georgia,"Times New Roman",Times,serif}
                h3{font-family: Georgia,"Times New Roman",Times,serif}
                h2{font-family: Georgia,"Times New Roman",Times,serif}
                p{font-family: Verdana,Arial,Helvetica,sans-serif}
                body{font-family: Verdana,Arial,Helvetica,sans-serif}
                img{margin-bottom: 0.4em; display:block;}
                '''

    feeds = [
        (u'Padre y Decano | Club Atlético Peñarol',
         u'http://www.padreydecano.com/cms/feed/')
    ]

    def get_cover_url(self):
        return None

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X4&G��pagina12.png�PNG


IHDR(-SPLTE������������nj��tRNS@��fPIDATxڕN��@C�_���U�;�I
�s%�q��Ԃ�$�*!�v��ն�̥�َ(aH�T	&�ȫ�8�C�q�e<�թIEND�B`�PK�Xwv�lOOpagina12.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2008-2018, Darko Miletic <darko.miletic at gmail.com>'
'''
pagina12.com.ar
'''
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile


class Pagina12(BasicNewsRecipe):
    title                = 'Pagina - 12'
    __author__           = 'Darko Miletic'
    description          = 'Noticias de Argentina y el resto del mundo'
    publisher            = 'La Pagina S.A.'
    category             = 'news, politics, Argentina'
    oldest_article       = 2
    no_stylesheets       = True
    encoding             = 'utf8'
    use_embedded_content = False
    language             = 'es_AR'
    remove_empty_feeds   = True
    publication_type     = 'newspaper'
    auto_cleanup         = False
    delay                  = 1
    simultaneous_downloads = 1
    timeout                = 8
    ignore_duplicate_articles = {'url'}
    articles_are_obfuscated = True
    temp_files              = []
    fetch_retries           = 10
    extra_css            = """
        body{font-family: "Open Sans", sans-serif}
        .article-date{font-size: small; margin-bottom: 1em;}
        .article-title{font-size: x-large; font-weight: bold; display: block; margin-bottom: 1em; margin-top: 1em;}
        .article-main-media{display: block; margin-bottom: 1em;}
        .article-summary{margin-top:1em; margin-bottom: 1em; display:block}
        .article-author{font-family: "Archivo Narrow",Helvetica,sans-serif; color: gray; font-size: small; margin-top:1em; margin-bottom: 1em}
        img{margin-top:1em; margin-bottom: 1em; display:block}
        .article-text p:first-letter{display: inline; font-size: xx-large; font-weight: bold}
        .article-prefix{font-family: "Archivo Narrow",Helvetica,sans-serif; font-size: small; text-transform: uppercase;}
    """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link']),
        dict(attrs={'class':'article-main-media-social show-for-medium'})
    ]

    keep_only_tags=[
       dict(name='div', attrs={'class':[
                                        'article-header',
                                        'article-titles',
                                        'article-main-media-header',
                                        'article-main-media',
                                        'article-text'
                                       ]})
    ]

    feeds = [
      (u'Diario de hoy'     , u'https://www.pagina12.com.ar/rss/edicion-impresa'),
      (u'El Pais'           , u'https://www.pagina12.com.ar/rss/secciones/el-pais/notas'),
      (u'Economia'          , u'https://www.pagina12.com.ar/rss/secciones/economia/notas'),
      (u'Sociedad'          , u'https://www.pagina12.com.ar/rss/secciones/sociedad/notas'),
      (u'El Mundo'          , u'https://www.pagina12.com.ar/rss/secciones/el-mundo/notas'),
      (u'Deportes'          , u'https://www.pagina12.com.ar/rss/secciones/deportes/notas'),
      (u'Cultura'           , u'https://www.pagina12.com.ar/rss/secciones/cultura/notas'),
      (u'Universidad'       , u'https://www.pagina12.com.ar/rss/secciones/universidad/notas'),
      (u'Ciencia'           , u'https://www.pagina12.com.ar/rss/secciones/ciencia/notas'),
      (u'Psicologia'        , u'https://www.pagina12.com.ar/rss/secciones/psicologia/notas'),
      (u'Ajedrez'           , u'https://www.pagina12.com.ar/rss/secciones/ajedrez/notas'),
      (u'La Ventana'        , u'https://www.pagina12.com.ar/rss/secciones/la-ventana/notas'),
      (u'Dialogos'          , u'https://www.pagina12.com.ar/rss/secciones/dialogos/notas'),
      (u'Hoy'               , u'https://www.pagina12.com.ar/rss/secciones/hoy/notas'),
      (u'Plastica'          , u'https://www.pagina12.com.ar/rss/secciones/plastica/notas'),
      (u'Cartas de Lectores', u'https://www.pagina12.com.ar/rss/secciones/cartas-de-lectores/notas'),
      (u'Espectaculos'      , u'https://www.pagina12.com.ar/rss/suplementos/cultura-y-espectaculos/notas'),
      (u'Radar'             , u'https://www.pagina12.com.ar/rss/suplementos/radar/notas'),
      (u'Radar libros'      , u'https://www.pagina12.com.ar/rss/suplementos/radar-libros/notas'),
      (u'Cash'              , u'https://www.pagina12.com.ar/rss/suplementos/cash/notas'),
      (u'Turismo'           , u'https://www.pagina12.com.ar/rss/suplementos/turismo/notas'),
      (u'Libero'            , u'https://www.pagina12.com.ar/rss/suplementos/libero/notas'),
      (u'NO'                , u'https://www.pagina12.com.ar/rss/suplementos/no/notas'),
      (u'Las 12'            , u'https://www.pagina12.com.ar/rss/suplementos/las12/notas'),
      (u'Soy'               , u'https://www.pagina12.com.ar/rss/suplementos/soy/notas'),
      (u'M2'                , u'https://www.pagina12.com.ar/rss/suplementos/m2/notas'),
      (u'Rosario 12'        , u'https://www.pagina12.com.ar/rss/suplementos/rosario12/notas')
    ]

    def get_cover_url(self):
        lurl = strftime('https://www.pagina12.com.ar/edicion-impresa/%d-%m-%Y')
        soup = self.index_to_soup(lurl)
        mydiv = soup.find('div', {'class' : lambda x: x and 'printed-edition-cover' in x.split()})
        if mydiv:
            for image in mydiv.findAll('img'):
                if image['data-src'].startswith('https://images.pagina12.com.ar/styles/width700/public/'):
                    return image['data-src']
        return None

    def get_obfuscated_article(self, url):
        result = None
        count = 0
        while (count < self.fetch_retries):
            try:
                response = self.browser.open(url, timeout=self.timeout)
                html = response.read()
                count = self.fetch_retries
                tfile = PersistentTemporaryFile('_fa.html')
                tfile.write(html)
                tfile.close()
                self.temp_files.append(tfile)
                result = tfile.name
            except:
                self.info("Retrying download...")
            count += 1
        return result
PK�X����  pagina_12_print_ed.png�PNG


IHDR  szz��IDATx����PG�ζ�`��وf�f{�l۶�h�mo�v滾��'��i��!"�ԯ��AW�D7�D���GX�-����X�ƈ���Cl���(��n�.��
�F�0'��3>w����ȅ���7������
0A��d�T���vW���q!ep8 
$�6P��x��һx�!U��
�q����A�EFG!�Pˆ�����h��ŽЗc�bc�����Al�F���!6��,��3 
�C,D�DT�^,F�o��@4Π�Cm��q�:���%�$j!��@L�:���4��X\�(�#7�X�m�Dc�BL^@4ޠ3Rb��h�g���� ��96�(ĥ�8��߁���y�Cc`� .�����b�9�Xq�52c��6)7�A4|���%���tF#TGm�E?�>�@�`,Ï�
����� �D�?��S�-��5�?IEND�B`�PK�X��I!AApagina_12_print_ed.recipe#!/usr/bin/env python

from __future__ import print_function
__license__   = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
pagina12.com.ar
'''
import re

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag, NavigableString


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Pagina12(BasicNewsRecipe):

    title = 'Pagina/12 - Edicion Impresa'
    __author__ = 'Pablo Marfil'
    description = 'Diario argentino'
    INDEX = 'http://www.pagina12.com.ar/diario/secciones/index.html'
    language = 'es'
    encoding = 'cp1252'
    remove_tags_before = dict(id='fecha')
    remove_tags_after = dict(id='fin')
    remove_tags = [dict(id=['fecha', 'fin', 'pageControls',
                            'logo', 'logo_suple', 'fecha_suple', 'volver'])]
    masthead_url = 'http://www.pagina12.com.ar/commons/imgs/logo-home.gif'
    no_stylesheets = True

    preprocess_regexps = [(re.compile(r'<!DOCTYPE[^>]+>', re.I), lambda m:'')]

    def get_cover_url(self):
        soup = self.index_to_soup(
            'http://www.pagina12.com.ar/diario/principal/diario/index.html')
        for image in soup.findAll('img', alt=True):
            if image['alt'].startswith('Tapa de la fecha'):
                return image['src']
                print(image)
        return None

    def parse_index(self):
        articles = []
        numero = 1
        raw = self.index_to_soup(
            'http://www.pagina12.com.ar/diario/secciones/index.html', raw=True)
        raw = re.sub(r'(?i)<!DOCTYPE[^>]+>', '', raw)
        soup = self.index_to_soup(raw)

        feeds = []

        seen_titles = set()
        for section in soup.findAll('div', 'seccionx'):
            numero += 1
            print(numero)
            section_title = self.tag_to_string(section.find(
                'div', 'desplegable_titulo on_principal right'))
            self.log('Found section:', section_title)
            articles = []
            for post in section.findAll('h2'):
                h = post.find('a', href=True)
                title = self.tag_to_string(h)
                if title in seen_titles:
                    continue
                seen_titles.add(title)
                a = post.find('a', href=True)
                url = a['href']
                if url.startswith('/'):
                    url = 'http://pagina12.com.ar/imprimir' + url
                p = post.find('div', attrs={'h2'})
                desc = None
                self.log('\tFound article:', title, 'at', url)
                if p is not None:
                    desc = self.tag_to_string(p)
                    self.log('\t\t', desc)
                articles.append({'title': title, 'url': url, 'description': desc,
                                 'date': ''})
            if articles:
                feeds.append((section_title, articles))
        return feeds

    def postprocess_html(self, soup, first):
        for table in soup.findAll('table', align='right'):
            img = table.find('img')
            if img is not None:
                img.extract()
                caption = self.tag_to_string(table).strip()
                div = new_tag(soup, 'div')
                div['style'] = 'text-align:center'
                div.insert(0, img)
                div.insert(1, new_tag(soup, 'br'))
                if caption:
                    div.insert(2, NavigableString(caption))
                table.replaceWith(div)

        return soup
PK�Xt�MY))
pajama.png�PNG


IHDR  D����PLTE�������!�����������"������bŽ���������� ��������D��E��cƽ�������������$��*��-��3��:��M��O��T��`żgǿ��͋�ζ��������������������������������"��#��$��'��(��.��1��2��4��5��5��6��?��@��A��G��H��H��I��J��U��X¹[ú^Ļ_ĻbƽeǾi�q��|��~���ɀ�Ɂ�ʄ�ˉ�͍�ώ�Ϗ�Е�Җ�Ә�ԝ�֟�פ�٧�ڪ�۬�ܳ�߷���������������������������������������������������������������������F�f�XIDATx�͒�3AEgzRӱm[�m�m۶��[�z�;'�}�d̵
T,B�TU�47�͊<���O�C��
��P��Z)/�NZ�܀�t[)W��� �Bf�/� �(��KHXc�����8a	R��Q��x��`��*�a�j�0p��x�mYc�w��]h@�jŘ�G����=��Q)0�k��v�⑛mz���L���¾�zr������]��j�U���?08�vG��Xm��9M;�V�Y>5���^Tb5�ú�y<z|���Z/��C�–�4l���y���#���/����=N/����_�/���=x�

��u���Ǿ��(jD�~��gX,��C�IEND�B`�PK�X��B&&
pajama.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class PajamasMedia(BasicNewsRecipe):
    title = u'Pajamas Media'
    description = u'Provides exclusive news and opinion for forty countries.'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 2  # days
    max_articles_per_feed = 25
    recursions = 1
    match_regexps = [r'http://pajamasmedia.com/blog/.*/2/$']

    remove_stylesheets = True
    auto_cleanup = True
    feeds = [
        ('pajamas Media',
         'http://feeds.feedburner.com/PajamasMedia'),

    ]

PK�Xa�h}��
pambianco.png�PNG


IHDR��h6YIDATx�c8�@b�uv~{��۫W���}�z�%}}^̘��߿g�~�t��߿���?��?�p��	�8��}��Eß�?/������)"���9?޾�YYq��Ŏ�_?>##����/��G��@�.ih<_����:;Nqp<�7h�y##� ���o��2�>|�����?%.t�7����ؐ������ﷶ�IK;+ pZM
h��ݻ��'�Ł���C��vTԳ��ωÃ�zj*P���j �JH�����ΰ���_N������d�b�����aa@�O�N9��v��$}ES��9..�j��/��^17;�����8)+3h��6<�1l�|IEND�B`�PK�X������pambianco.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1326135591(BasicNewsRecipe):
    title = u'Pambianco'
    description = 'fashion magazine for professional people'
    language = 'it'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Pambianco', u'http://feeds.feedburner.com/pambianconews/YGXu')]
    __author__ = 'faber1971'


__version__ = 'v1.0'
__date__ = '9, January 2011'
PK�X,;����pandodaily.png�PNG


IHDR��h6�IDATx�c�N%	1xD�vO�3a� Ꟶ�7.���o�#���;6�M�gt��?}���߿����_���?���w��9�tR<�R
���ͻ�B�򁦶M�i�8h(B�ʪj��.�
Q���+����iH.���xD���p	(x��c��[<05$V�j�����JSBK���2�5�L�9��˗@��g�C*���;>]��k7��3��5�M��o߬�iE�I�Qu}����{��٧/_��x�ׯ_@�Wn�Nh�
tLxE{ꤥ��EdM����嫗o�Z�nSXNiDeđ�mӱ8)<��3
wfW��{����ܚfH4EeyF���?�8����M�@��SO�����S����<�/!�1i��}s�RӦ��ذh��E�7"�
�$�Z��܈���&��<c�HN���U�S��IEND�B`�PK�X�F�y��pandodaily.recipe__license__ = 'GPL v3'
__copyright__ = '2015, Darko Miletic <darko.miletic at gmail.com>'
'''
pando.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class PandoDaily(BasicNewsRecipe):
    title = 'PandoDaily'
    __author__ = 'Darko Miletic'
    description = 'speaking truth to the new power'
    publisher = 'PandoDaily'
    category = 'news, politics, technology, USA, World'
    oldest_article = 15
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    extra_css             = """
                               body{font-family: Georgia,serif }
                               img{margin-bottom: 0.4em; display:block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link', 'object']),
        dict(attrs={'class': 'share_widgets'})
    ]

    keep_only_tags = [dict(name='h1', attrs={'class': 'block'}), dict(
        name='div', attrs={'class': 'post-content'})]

    feeds = [(u'Articles', u'http://pando.com/feed')]
PK�X��K$��panorama.png�PNG


IHDR  szz��IDATx����A��yWAm7��FP[a�vWa�*(�ڶm�6.�Or��L2;ۭ&�]Lrf�9ww�3����>(-�=�A�W��-�����0��Q�=rYVޏ��"�.*2H�>���i|��O-������bd<�mR�C��1���&�K���X�X�':��7��m؄�8�Ϫ;A��Qۨ�'�pR/�X�jJML�W���C�`�H��,�͵���!5y����'q,�������ڱ]|	�ΨMU�uu�+@�[�\C���PY��� w<�"f����� �
�
�
b����_\���qyo�Iz�V�{ �8�H����H�~�5�$p3B~~�k΁��qܰX�{�����Iح�i�6QxIMֳ�0Q~݉�"m}�yjr�
�&�B��a����"@ڦ;���,}�F9	��V���yP���`��z�c�|(�*_�B�<��Q\�yF\�0����(c��Z1_��*ȗ����!��{&��L��S�
�gBϯR��G[G?��a��]]؋��A����^0��Cu��!�#�>J�Ҫ�̽Fi |��k�E�ʕ+�լY�8��/Q�v�e�2e�Ə�^���ԩS�f8z�(ꜚ�I��_IEND�B`�PK�X�K/��panorama.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.01'
__date__ = '10, January 2010'
__description__ = 'Italian weekly magazine'

'''
http://www.panorama.it/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class panorama(BasicNewsRecipe):
    __author__ = 'Lorenzo Vigentini, based on Darko Miletic'
    description = 'Italian weekly magazine'

    cover_url = 'http://www.panorama.it/panorama/images/panorama_large.gif'
    title = u'Panorama '
    publisher = 'Mondadori'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False
    recursion = 10

    remove_javascript = True

    keep_only_tags = [dict(name='div', attrs={'class': ['post', 'article']})]

    remove_tags = [
        dict(name=['object', 'link']),
        dict(name='div', attrs={
             'class': ['post-meta', 'sharing-tools', 'related', 'comments', 'prev-next']}),
        dict(name='div', attrs={'id': ['related-posts', 'footer']})
    ]

    feeds = [
        (u'Panorama Italia', u'http://blog.panorama.it/italia/feed'),
        (u'Panorama Mondo', u'http://blog.panorama.it/mondo/feed'),
        (u'Panorama Cultura e societa',
         u'http://blog.panorama.it/culturaesocieta/feed'),
        (u'Panorama Hitech e scienza',
         u'http://blog.panorama.it/hitechescienza/feed'),
        (u'Panorama Motori', u'http://blog.panorama.it/autoemoto/feed'),
        (u'Panorama libri', u'http://blog.panorama.it/libri/feed'),
        (u'Panorama Opinioni', u'http://blog.panorama.it/opinioni/feed'),

    ]
PK�X��p	��paperli_topic.png�PNG


IHDR  V%(	pHYs��~�KIDAT8���;KA��'���4[,X{�!��6�����	�-,,�`�VAT$���/4!��Ś�9���魿9w�{jL�O�h�W�k�k�J�����YV��ܝ��h�4���#-�����Z������r�p/����6��6�#�L���=0�!�I��U�<�?������1�E<a�ƁK7h�BDW��}��&�
h��L0,i$�hX���C�C~U?��4�۱��Z��iIc���]L����i*A�C�%Ȉ}�I09Lj�<��6m��?�<��[-�
���J���J""�ȵGT#�D��4���]a�IEND�B`�PK�X(,D���paperli_topic.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>'
'''
paperli
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre import strftime


class paperli_topics(BasicNewsRecipe):
    # Customize this recipe and change paperli_tag and title below to
    # download news on your favorite tag
    paperli_tag = 'climate'
    title = u'The #climate Daily - paperli'
    __author__ = 'Hiroshi Miura'
    oldest_article = 7
    max_articles_per_feed = 100
    description = 'paper.li page about ' + paperli_tag
    publisher = 'paper.li'
    category = 'paper.li'
    language = 'en'
    encoding = 'utf-8'
    remove_javascript = True
    masthead_title = u'The ' + paperli_tag + ' Daily'
    timefmt = '[%y/%m/%d]'
    base_url = 'http://paper.li'
    index = base_url + '/tag/' + paperli_tag

    def parse_index(self):
        # get topics
        topics = []
        soup = self.index_to_soup(self.index)
        topics_lists = soup.find('div', attrs={'class': 'paper-nav-bottom'})
        for item in topics_lists.findAll('li', attrs={'class': ""}):
            itema = item.find('a', href=True)
            topics.append({'title': itema.string, 'url': itema['href']})

        # get feeds
        feeds = []
        for topic in topics:
            newsarticles = []
            soup = self.index_to_soup(''.join([self.base_url, topic['url']]))
            topstories = soup.findAll('div', attrs={'class': 'yui-u'})
            for itt in topstories:
                itema = itt.find('a', href=True, attrs={'class': 'ts'})
                if itema is not None:
                    itemd = itt.find('div', text=True, attrs={'class': 'text'})
                    newsarticles.append({
                        'title': itema.string, 'date': strftime(self.timefmt), 'url': itema['href'], 'description': itemd.string
                    })
            feeds.append((topic['title'], newsarticles))
        return feeds
PK�XI��paperpaper.png�PNG


IHDR  D����PLTE���'"'2.2������+'+.+.���""���+''"""525'''������+++~~ZZZ������fff���.++������fwY�؎ctP�Ё;=;���@@@��Я׏fwT522�с2.5�َ�����𮭭�Ή�ΈcwT�ό�����@==����|"DH;=D2=D5@D8.'+��������ѫԊ���������epT~}"'���"�֋���Ջ~���������fzW'2������������888���ZYYecepoo�͇����ӆ�����TTT������++..'.LLL������2+2++'�����������Ҥ��������'"+b``��Ъ҂���JFHPNN������@=@UUT������utt"��������Œ�����"...��և�����sss���|||ecc������WWWigi���eeennn��������������ew��IDATx^��c�5A��i����m�~m۶m��;wz6t6��cדө�5��s���n��Űy�֊݂*,����P�vl���KK0EQs��'k�1nT�\�yki}c-�Q�:���a{gkہ�Y�B
{z�I_�����ȹ�]Y��gtp1���b�`p��S�p<�����iT�B�XP��2�d�����GLE.��;\*E9�ғ�:
\&��ig�������]�1l/�
���K����N\��`.��%_�9��v��� 1m�{�/ij�Bx�H��c`�Dլ���k�<{��f�|�W�5�Kx�o%���T��(�[mj%�����H�TJ4��ѕ�'����_r�9|��=�����?�؝�࿠�.`8s��^�F�n�CIEND�B`�PK�XB:qHHpaperpaper.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class PaperPaper(BasicNewsRecipe):
    title = '\u0411\u0443\u043C\u0430\u0433\u0430'
    __author__ = 'bugmen00t'
    description = '\u0418\u0437\u0434\u0430\u043D\u0438\u0435 \u043E \u043F\u0440\u0435\u043A\u0440\u0430\u0441\u043D\u043E\u043C \u0433\u043E\u0440\u043E\u0434\u0435 \u0421\u0430\u043D\u043A\u0442-\u041F\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435, \u0432 \u043A\u043E\u0442\u043E\u0440\u043E\u043C, \u043A\u043E\u043D\u0435\u0447\u043D\u043E, \u0434\u0430\u043B\u0435\u043A\u043E \u043D\u0435 \u0432\u0441\u0451 \u0438\u0434\u0435\u0430\u043B\u044C\u043D\u043E, \u2014 \u0438 \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043C\u044B \u0437\u0430\u043D\u0438\u043C\u0430\u0435\u043C\u0441\u044F \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u0438\u043A\u043E\u0439, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u0438\u0432\u043B\u0435\u043A\u0430\u0442\u044C \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435 \u043A \u0432\u0430\u0436\u043D\u044B\u043C \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C \u0438 \u0432\u043B\u0438\u044F\u0442\u044C \u043D\u0430 \u0438\u0445 \u0440\u0435\u0448\u0435\u043D\u0438\u0435.'  # noqa
    publisher = '\u041A\u0438\u0440\u0438\u043B\u043B \u0410\u0440\u0442\u0451\u043C\u0435\u043D\u043A\u043E, \u0422\u0430\u0442\u044C\u044F\u043D\u0430 \u0418\u0432\u0430\u043D\u043E\u0432\u0430'  # noqa
    category = 'newspaper'
    cover_url = u'https://upload.wikimedia.org/wikipedia/commons/1/1f/Paperpaper_logo.jpg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 14
    max_articles_per_feed = 50

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='div', attrs={'class': 'bottom-block '}),
        dict(name='div', attrs={'class': 'bottom-block news'})
    ]

    feeds = [
        #        ('\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B', 'https://paperpaper.ru/feed/?service'),
        (
            '\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://wemissedyou.rknrkn.ru/feed/?service'
        ),
        #        ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://paperpaper.ru/category/what/news/feed/'),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://wemissedyou.rknrkn.ru/category/what/news/feed/'
        ),
        #        ('\u0418\u0441\u0442\u043E\u0440\u0438\u0438', 'https://paperpaper.ru/category/features/feed/'),
        (
            '\u0418\u0441\u0442\u043E\u0440\u0438\u0438',
            'https://wemissedyou.rknrkn.ru/category/features/feed/'
        ),
        #        ('\u0413\u0438\u0434\u044B', 'https://paperpaper.ru/category/guides/feed/'),
        (
            '\u0413\u0438\u0434\u044B',
            'https://wemissedyou.rknrkn.ru/category/guides/feed/'
        ),
        #        ('\u0421\u043F\u0438\u0441\u043E\u043A', 'https://paperpaper.ru/tag/%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA/feed/'),
        (
            '\u0421\u043F\u0438\u0441\u043E\u043A',
            'https://wemissedyou.rknrkn.ru/tag/%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA/feed/'
        ),
        #        ('\u042D\u043A\u0441\u043F\u0430\u0442\u044B', 'https://paperpaper.ru/tag/expat/feed/'),
        (
            '\u042D\u043A\u0441\u043F\u0430\u0442\u044B',
            'https://wemissedyou.rknrkn.ru/tag/expat/feed/'
        ),
        #        ('\u0418\u0441\u0442\u043E\u0440\u0438\u0438', 'https://paperpaper.ru/tag/stories/feed/'),
        (
            '\u0418\u0441\u0442\u043E\u0440\u0438\u0438',
            'https://wemissedyou.rknrkn.ru/tag/stories/feed/'
        ),
        #        ('\u041E\u0442\u0432\u0435\u0442\u044B', 'https://paperpaper.ru/tag/otvety/feed/'),
        (
            '\u041E\u0442\u0432\u0435\u0442\u044B',
            'https://wemissedyou.rknrkn.ru/tag/otvety/feed/'
        ),
        #        ('\u041F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044F', 'https://paperpaper.ru/tag/traveltravel/feed/'),
        (
            '\u041F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044F',
            'https://wemissedyou.rknrkn.ru/tag/traveltravel/feed/'
        ),
        #        ('\u041D\u0430\u0443\u0447\u043F\u043E\u043F', 'https://paperpaper.ru/category/main-cats/nauchpop/feed/'),
        (
            '\u041D\u0430\u0443\u0447\u043F\u043E\u043F',
            'https://wemissedyou.rknrkn.ru/category/main-cats/nauchpop/feed/'
        ),
        (
            '\u0412\u043E\u0435\u043D\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435',
            'https://wemissedyou.rknrkn.ru/tag/obostrenie-vokrug-ukrainy-2022/feed/'
        ),
        #        ('\u0423\u043A\u0440\u0430\u0438\u043D\u0430', 'https://paperpaper.ru/tag/ukraine/feed/'),
        (
            '\u0423\u043A\u0440\u0430\u0438\u043D\u0430',
            'https://wemissedyou.rknrkn.ru/tag/ukraine/feed/'
        ),
        #        ('\u041D\u0430\u0443\u043A\u0430', 'https://paperpaper.ru/tag/science/feed/'),
        (
            '\u041D\u0430\u0443\u043A\u0430',
            'https://wemissedyou.rknrkn.ru/tag/science/feed/'
        )
    ]
PK�X���~~parisreview.png�PNG


IHDR  V%(EIDAT8�c�O0���e��*8!�P���޽�n�g���[E�v2��/�<��'���~���옠�xŎw����l����y�,��4��*J�������/5X{����7W?�{�p�w�9%"��(xf���g��Aܓ�r�э��!+�Z�fm�Q�j��TrY�b�������;���ʜ�}H
��E�F$��fdF䥵d֖%N�:�B�O���]��E��^	5�����"�x����t�{�6M�Y^]��{��C�w@h��spFm~lB~mO�Ċ�hW��0�}�|�ƒ�=.
N�����({ߦ_P�l#]�|���,."����w��]�W��p7'��feW.N�y	Yia�f���ד5o�����3�r@,��_).�i�^L�?�}����/�u9����	E?Q��{�V\��������5S��%�'�1n�ɭNM8�����1���'�ud�����z�n�O��ǽ�k�|ݢzm۟�J�����>�f���pe��?^ܽ����g��8��?`b�����_�˼h2�*B7�z�IEND�B`�PK�X�����parisreview.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class ParisReview(BasicNewsRecipe):
    title          = 'The Paris Review Blog'
    __author__        = 'fenuks'
    description   = u'The Paris Review is a literary magazine featuring original writing, art, and in-depth interviews with famous writers.'
    # cover_url      = ''
    category       = 'culture'
    language       = 'en'
    encoding = 'utf-8'
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_javascript = True
    use_embedded_content = True
    # extra_css      = ''
    # preprocess_regexps = []
    # remove_attributes = ['style',]
    # keep_only_tags = []
    remove_tags = []
    # remove_tags_before = dict()
    remove_tags_after = dict()
    feeds          = [('Posts', 'http://feeds.feedburner.com/TheParisReviewBlog')]
PK�X���iiparlamentni_listy.png�PNG


IHDR(-S�PLTE8�����9��j��������?��L��U��X��\��`��e��8��p��r��x��}���ǁ�Ȇ�ʎ�͎�Ε�ѝ�ԟ�՟�ՠ�ՠ�֡�֢�֤�ׯ�ܱ�ݲ�޻���������<�����9�����������������������������F��H����e�|IDATx�e��0���mۼ��f��W$�(g��/
:ycKV��ȡ�5=��������7����(�s��(�
&wXE�����F0�B=�.�u(E����5����,�k��D��Ⱦ�7���IEND�B`�PK�Xb�I�,,parlamentni_listy.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe
import re


class plRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Parlamentn\u00ed Listy'
    publisher = u''
    description = ''
    oldest_article = 1
    max_articles_per_feed = 20

    feeds = [
        (u'Parlamentní listy.cz', u'http://www.parlamentnilisty.cz/export/rss.aspx')
    ]

    language = 'cs'
    cover_url = 'http://www.parlamentnilisty.cz/design/listy-logo2.png'
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = []
    remove_tags = [dict(name='div', attrs={'class': ['articledetailboxin', 'crumbs', 'relatedarticles articledetailbox']}),
                   dict(name='div', attrs={
                        'class': ['socialshare-1 noprint', 'socialshare-2 noprint']}),
                   dict(name='div', attrs={'id': 'widget'}),
                   dict(name='div', attrs={'class': 'article-discussion-box noprint'})]
    preprocess_regexps = [(re.compile(r'<(span|strong)[^>]*>\s*Ptejte se politik.*',
                                      re.DOTALL | re.IGNORECASE), lambda match: '</body>')]

    keep_only_tags = [dict(name='div',   attrs={'class': ['article-detail']})]
PK�X�Epatente_de_corso.png�PNG


IHDR�a�IDATxڍ����jG����Z۶m���m۶m{�0���$���T��_Չs��u�G��3J�U���8��Z�!��G >�A��kh�u�&���~�B��BT�"P��H�aSf�z�^|+CLn�QE	�ˁ��B����9v���YX)j��3Pu���0k�
w���'ϊ-
U��S�	�:Ó�oiخ3�6nC�HP�E�qB$c�����1a�"z��DrzZT�h5`�K���8z��O^�i����Q���r�D��ջ��ض��S�0l��m�N��X�~��}�����^����Q�پ�w_���a֢e�>��h�@��I���˒u�(H$,mQ�sWoP�u�P�uՔ^C��@8}{��$7?߆�<�~C��#X�y;YYY�PY�����}�JF4j=/H������ǯ���W+0�P+džG��Qu��@5m�HF�yؾ������ƦIEND�B`�PK�XK�#��patente_de_corso.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Oscar Megia Lopez'
'''
perezreverte.com
'''
import re
from calibre.web.feeds.recipes import BasicNewsRecipe


class PerezReverte(BasicNewsRecipe):
    title = u'Patente de Corso'
    __author__ = 'Oscar Megia Lopez'
    description = 'Arturo Perez Reverte'
    oldest_article = 90
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'Arturo Perez Reverte'
    category = 'Articulo'
    language = 'es'
    publication_type = 'Magazine'
    extra_css = ' body{ font-family: Verdana,Helvetica,Arial,sans-serif } .contentheading{font-weight: bold} .txt_articulo{display: block; padding: 0; border: 1px solid; width: 40%; font-size: small} .story-feature h2{text-align: center; text-transform: uppercase} '  # noqa
    preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')]
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }

    keep_only_tags = [
        dict(name='h2', attrs={'class': ['titular']}),
        dict(name='p', attrs={'class': ['fecha']}),
        dict(name='div', attrs={'class': ['bloqueTexto']})
    ]

    remove_attributes = ['width', 'height']

    feeds = [
        ('Patente de corso - Web oficial de Arturo Perez Reverte',
         'http://www.perezreverte.com/rss/patentes-corso/')
    ]
PK�X�q��mmpc_advisor.png�PNG


IHDR��h64IDATxڕ�M�P��[�X�+�+���BWx1���Ө�-҂�JK��}�Pk�&�H~�p�5Ч���X�X)�3�v�W���t9�V��3~�d!z>Џ�i�|��C��oJ�������JY͇'��cH���1�֚�U��1��ތ�M�q�(e��Y�S����"ץ����[��t��`1�d�7�F�,in ����h���L�u�yԬgڶ�w]����"��2+���� ��M��߷�b�p����KxJ�/��t7pJ��sɗ��M���9��1.IEND�B`�PK�X�yRRpc_advisor.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.01'
__date__ = '14, January 2010'

'''
http://www.pcadvisor.co.uk/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class pcAdvisor(BasicNewsRecipe):
    __author__ = 'Lorenzo Vigentini'
    description = 'PC Advisor delivers expert advice you can trust to business and home PC users who want to buy the best-value equipment and make the most out of the equipment they already own.'  # noqa

    cover_url = 'http://media.pcadvisor.co.uk/images/spacer.gif'
    title = 'Pc Advisor '
    publisher = 'IDG Communication'
    category = 'PC, computing, product reviews, UK'

    language = 'en'
    encoding = 'cp1252'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 15
    max_articles_per_feed = 25
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        (u'Latest', u'http://www.pcadvisor.co.uk/latest/rss'),
        (u'News', u'http://www.pcadvisor.co.uk/news/rss'),
        (u'How-tos', u'http://www.pcadvisor.co.uk/how-to/rss'),
        (u'Reviews', u'http://www.pcadvisor.co.uk/review/rss'),
        (u'Video Content', u'http://www.pcadvisor.co.uk/video/rss'),
        (u'iPhone', u'http://www.pcadvisor.co.uk/latest/iphone/rss'),
        (u'iPad', u'http://www.pcadvisor.co.uk/latest/ipad/rss'),
        (u'Mac', u'http://www.pcadvisor.co.uk/latest/mac/rss'),
        (u'Apple', u'http://www.pcadvisor.co.uk/latest/apple/rss'),
    ]
PK�X\�T��
pc_foster.png�PNG


IHDR��h6�IDATx���jQ�;�db3��`�(b�6��
^�.�w�\�����ŝ+�icZ��I2gf��'
���!���:;B��@*T��⒎zc�L�/��o=�kd^�p!W�ߗ��GW~Y���k�)��q�M_�E�s��{�����Ke,JO�3��ڭv��z��Oɧ~��u\:�$���D��KS�^�t�����k�΢�B0�"lHt~}2��-��o��f�D�̌
:��:�����x�^�����u���`0�΁�F��ќΞq���i�l����*\n|���4��bE�g���+��t�&�o���l��b4l�A$i��6XƟ2
FK b[
�st��.�P\	ԡ�	������4
ϷIEND�B`�PK�XN���zzpc_foster.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment

# currently recipe is not working


class PC_Foster(BasicNewsRecipe):
    title = u'PC Foster'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = 'fenuks'
    description = u'Vortal technologiczny: testy, recenzje sprzętu komputerowego i telefonów, nowinki hardware, programy i gry dla Windows. Podkręcanie, modding i Overclocking.'  # noqa
    category = 'IT'
    language = 'pl'
    masthead_url = 'http://pcfoster.pl/public/images/logo.png'
    cover_url = 'http://pcfoster.pl/public/images/logo.png'
    no_stylesheets = True
    remove_empty_feeds = True
    keep_only_tags = [dict(id=['news_details', 'review_details']), dict(
        attrs={'class': 'pager more_top'})]
    remove_tags = [dict(name='p', attrs={'class': 'right'})]
    feeds = [(u'G\u0142\xf3wny', u'http://pcfoster.pl/public/rss/main.xml')]

    def append_page(self, soup, appendtag):
        nexturl = appendtag.find(attrs={'alt': u'Następna strona'})
        if nexturl:
            appendtag.find(attrs={'class': 'pager more_top'}).extract()
            while nexturl:
                nexturl = 'http://pcfoster.pl' + nexturl.parent['href']
                soup2 = self.index_to_soup(nexturl)
                nexturl = soup2.find(attrs={'alt': u'Następna strona'})
                pagetext = soup2.find(attrs={'class': 'content'})
                pos = len(appendtag.contents)
                appendtag.insert(pos, pagetext)
            for r in appendtag.findAll(attrs={'class': 'review_content double'}):
                r.extract()
            comments = appendtag.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()

    def preprocess_html(self, soup):
        self.append_page(soup, soup.body)
        return soup
PK�X��	��
pc_lab.png�PNG


IHDR��h6}IDATx�c�O"�����~���凯^~�t���O.�}���'�ܿ��?|�y���.'�o/���aŎ�=����mN	�:��n�rQ}�\����=�{¬%'�/�j�难��߿�޼����3��s��3���WL����߿ ���t@����Y{W�>
��{�Ѽt�7w`��M���xST��Rѓ������#͌9�I�z3��n;y�aWȃ��&ӽ$D�;7\���2�J�䬒<OmQ>��{o���?�~���.�',�������\�����p7�;U3�.�W��i��}�6����3�.8յ��˷h�ϟ'�^\�v���_?x����g�޾z��4oka����>��CWB��r:pԏIEND�B`�PK�XH���88
pc_lab.recipe#!/usr/bin/env python
import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Comment


class PCLab(BasicNewsRecipe):
    cover_url = 'http://pclab.pl/img/logo.png'
    title = u"PC Lab"
    __author__ = 'ravcio - rlelusz[at]gmail.com'
    description = u"Articles from PC Lab website"
    language = 'pl'
    oldest_article = 30
    max_articles_per_feed = 100
    recursions = 0
    encoding = 'iso-8859-2'
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='div', attrs={'class': ['substance']})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': [
             'toc first', 'toc', 'tags', 'recommendedarticles', 'name', 'zumi', 'chapters']})
    ]

    # links to RSS feeds
    feeds = [
        (u'Aktualności', 'http://pclab.pl/xml/aktualnosci.xml'),
        (u'Artykuły', u'http://pclab.pl/xml/artykuly.xml'),
        (u'Poradniki', 'http://pclab.pl/xml/poradniki.xml')
    ]

    # load second and subsequent page content
    # in: soup - full page with 'next' button
    # out: appendtag - tag to which new page is to be added
    def append_page(self, soup, appendtag):
        # find the 'Next' button
        pager = soup.find('div', attrs={'class': 'navigation'})
        if pager:
            a = pager.find('a')
            if 'news' in a['href']:
                pager = None
            else:
                pager = pager.find('div', attrs={'class': 'next'})

        while pager:
            # search for 'a' element with link to next page (exit if not found)
            a = pager.find('a')
            nexturl = a['href']
            soup2 = self.index_to_soup('http://pclab.pl' + nexturl)
            pager = soup2.find('div', attrs={'class': 'next'})
            pagetext = soup2.find('div', attrs={'class': 'substance'})
            pagetext = pagetext.find('div', attrs={'class': 'data'})
            comments = pagetext.findAll(
                text=lambda text: isinstance(text, Comment))
            for comment in comments:
                comment.extract()

            pos = len(appendtag.contents)
            appendtag.insert(pos, pagetext)
            pos = len(appendtag.contents)

        pager = soup.find('div', attrs={'class': 'navigation'})
        if pager:
            pager.extract()

    def preprocess_html(self, soup):
        # soup.body contains no title and no navigator, they are in soup
        self.append_page(soup, soup.body)
        for link in soup.findAll('a'):
            href = link.get('href', None)
            if href and href.startswith('/'):
                link['href'] = 'http://pclab.pl' + href
        for r in soup.findAll(name='a', href=re.compile(r'^https://www.skapiec.pl/')):
            r.extract()

        return soup
PK�Xc޺E��
pc_mag.png�PNG


IHDR  D����PLTE�����������	�
��
���"�GJ�QT�RU�[^�����������������������������!�"��&*�(,�),�)-�+/�48�59�6:�7;�8<�EH�FI�
�GJ�HK�IL�JM�KN�NQ�	
�	�TV�TW�UW�WZ�XZ�Y\��_a�`c�ce�gj�ln�mo�ru�su�tv�vx�wy�wz�xz�z|�~��������������������������������������������������������������������������������������������������SV�FJ�
�� �
�������;>��������Z\�Z]�������BE�CF������PS������������OR�
����?����IDATx^��c�+1�
fjk۶m۶ym��;I�Mwg���Ŝ����y29|S���Z�?H�_#�u���=��ft�	1�K�}c�f�� ���@~ړ Lx�f��N*��p�~�w�SāW$e'%�C��g��B��_��?r���uV�#�����5��������^��.p�f���t\�0��M��[C�����]RPVZZ��8��pI�W&�F��A��"���`xVϿ�A)�:د����1��7B��`�5}_+0����t��|]�i	O1���"D�?���$��مyLA�m��|�eWN	
��p��1)W@���`�ΐ`�<q€ϑIX�l6��Bo��]Yi�e��5�$|ʑ�J�t�����% �[��܎IEND�B`�PK�Xֺ����pc_world.png�PNG


IHDR(-S�PLTE�!�"�"�"�"�#�#�$�$�%�%�%�&�&�&�&�'�'�(�(�*�(�)�*�)�*�+�+�+�,�!-�%0�%1�*5�8C�DM�DN�JT�Yb�^g�fn�ks�rz�sz�|��~��}��~�̂�ь�١�١�٢�٩�ಶḻ������������������������������݉=�IDAT��N�@��o.,	R�m}�g�҆(ư.���JD �l�����W���q�Lnbx��N)���[dU5��+�|{vSU[�. _m]�Tu�"�k�Q�a��'p2	qbP�Ej����k�֖�jO{\~���i��:�����Y��{�b2Q��@M��6�YN0A�IEND�B`�PK�X��(Jwwpc_world.recipe#!/usr/bin/env python

'''
http://www.pcworld.com/
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes


class pcWorld(BasicNewsRecipe):
    __author__ = 'unkn0wn'
    description = 'PCWorld helps you navigate the PC ecosystem to find the products you want and the advice you need to get the job done.'
    title = 'PCWorld'
    publisher = 'IDG Communication'
    language = 'en'
    encoding = 'utf-8'
    ignore_duplicate_articles = {'url'}
    remove_javascript = True
    resolve_internal_links = True
    remove_empty_feeds = True
    remove_attributes = ['height', 'width']

    extra_css = '''
        .entry-meta, .imageCredit {font-size:small;}
        .entry-eyebrow, .article_author_box_bio {font-size:small; color:#404040;}
        .subheadline {font-style:italic; color:#202020;}
    '''

    keep_only_tags = [
        classes('entry-header post-thumbnail'),
        dict(name='div', attrs={'id':'link_wrapped_content'}),
        classes('article_author_box_bio')
    ]

    def parse_index(self):

        section_list = [
            ('PC & Components', 'pc-components'),
            ('Laptops', 'laptops'),
            ('Mobile', 'mobile'),
            ('How-To', 'howto'),
            ('Gaming', 'gaming'),
            ('Windows', 'windows'),
            ('Best-Picks','best-picks'),
            ('Reviews', 'reviews'),
            ('Security', 'security'),
            ('Smart Tech', 'smart-tech'),
            ('Software', 'software'),
            ('WiFi & Networks', 'wifi-networks'),
            ('Deals', 'deals'),
            ('Business', 'business'),
            ('Entertainment', 'entertainment'),
        ]

        feeds = []

        # For each section title, fetch the article urls
        for section in section_list:
            section_title = section[0]
            section_url = 'https://www.pcworld.com/' + section[1]
            self.log(section_title, section_url)
            soup = self.index_to_soup(section_url)
            articles = self.articles_from_soup(soup)
            if articles:
                feeds.append((section_title, articles))
        return feeds

    def articles_from_soup(self, soup):
        ans = []
        feed = soup.find('div', attrs={'class':lambda x: x and 'articleFeed-inner' in x.split()})
        for item in feed.findAll('div', attrs={'class':'item-text-inner'}):
            a = item.find('h3').find('a', href=True)
            title = self.tag_to_string(a)
            url = a['href']
            desc = ''
            if span := item.find(attrs={'class':'item-excerpt'}):
                desc = self.tag_to_string(span)
            if byline := item.find(attrs={'class':'item-byline'}):
                desc = self.tag_to_string(byline) + ' | ' + desc
            if eye := item.find(attrs={'class':lambda x: x and 'item-eyebrow' in x.split()}):
                desc = self.tag_to_string(eye) + ' | ' + desc
            if itdate := item.find(attrs={'class':'item-date'}):
                date = self.tag_to_string(itdate)
                check = 'hours', 'day', 'days'  # skipping articles older than a week
                if not any(x in date for x in check):
                    continue
            if not url or not title:
                continue
            self.log('\t', title, '\n\t', desc, '\n\t\t', url)
            ans.append({'title': title, 'url': url, 'description': desc})
        return ans

    def get_cover_url(self):
        soup = self.index_to_soup(
            'https://www.magzter.com/US/IDG-Consumer-and-SMB,-Inc./PCWorld/Computer-&-Mobile/'
        )
        for citem in soup.findAll('meta', content=lambda s: s and s.endswith('view/3.jpg')):
            return citem['content']
PK�X�|55pcworld_hu.png�PNG


IHDR�a�IDATx���GCQ�&	��L�>B @L��Bf�����a��d�IfM2ϓ$@ ���r�� ���=��?Ya�/����q_�I��Ā�3#�f��ʔ39W�k.�ЍF�Ylxa�2��e
;_k{��`?S�xd���ɀ=J�)�7�eF�j��.C���2���7���N�b@`�F��X��0'�
yFz�ͤa��&�T��
�'��m����mZ�1�G<��=�|,����94p��AfRm���̝eIEND�B`�PK�X��pcworld_hu.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement

__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'

from calibre.web.feeds.news import BasicNewsRecipe


class Index(BasicNewsRecipe):

    title = u'PCWORLD.HU'
    oldest_article = 3
    max_articles_per_feed = 50
    language = 'hu'

    __author__ = 'Ezmegaz'

    feeds = [
    (u'H\xedrek', u'http://pcworld.hu/rss/rss.xml'),
    (u'Hardver h\xedrek', u'http://www.pcworld.hu/rss/rss_hardverhirek.xml'),
    (u'Szoftver h\xedrek', u'http://www.pcworld.hu/rss/rss_szoftverhirek.xml'),
    (u'Hardver cikkek', u'http://www.pcworld.hu/rss/rss_hardvercikkek.xml'),
    (u'Szoftver cikkek', u'http://www.pcworld.hu/rss/rss_szoftvercikkek.xml'),

    (u'Mobil h\xedrek', u'http://www.pcworld.hu/rss/rss_mobil.xml'),
    (u'\xdczleti h\xedrek', u'http://www.pcworld.hu/rss/rss_uzlet.xml'),
    (u'Let\xf6lt\xe9sek', u'http://www.pcworld.hu/rss/rss_letoltes.xml'),
    (u'PC World TV', u'http://tv.pcworld.hu/rss/rss_hun_pcw.xml'),
    (u'Tudta-e...?', u'http://pcworld.hu/rss/rss_tudtae.xml')]
PK�X���@ZZ
pcworldro.png�PNG


IHDR(-S�PLTE�����������������������ܺ�체̺�ܪ�잤Ԧ�얜Ԛ�Ԗ�̖�܎�䆌Ԇ��~��rt�fl�jt�^d�V\�R\�NT�R\�JL�FL�>D�6D�:<�2D�.<�*4�&,�*4�,�",�&4�*<�$�",�$��kR�IDATxڭN��E˳m���3�Q��ej���E6����ڪPHU�pbD�\�&AD���W.Q�gE��\3�q��
� [���%-${�Գv��u%l�&�M�J���i��v�4�=��
lx�W�'�Seu��IEND�B`�PK�X�X5��	�	pcworldro.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
pcworld.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Pcworld(BasicNewsRecipe):
    title = u'PC World'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'IT'
    publisher = u'PC World'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,IT'
    encoding = 'utf-8'
    cover_url = 'http://www.pcworld.ro/img/ui/header-logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'id': 'content_page'}), dict(
            name='div', attrs={'class': 'box_center content_body'})
    ]

    remove_tags = [
        dict(name='h3', attrs={'class': ['breadcrumb']}), dict(
            name='div', attrs={'class': ['box_center voteaza']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['box_center voteaza']})
    ]

    feeds = [
        (u'Feeds', u'http://www.pcworld.ro/contents/pcworld.rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X=�Z	RR	pecat.png�PNG


IHDR��h6IDATx�cxk`A"M�{Qyt�����7"����Qt|��B�7�=�餟7oA�MH�aڱ��??U|�����ϹPִ���3�ޛ�K�U��9�.L���}O?�;��������{�A���u���~���2�~>}Q4?0�uV>�}��ѭ�a�5�C}��.���f�>�W�Oå;�WI�}���%i`F�
ɩC#�cL
+�ΙDKC_j]�3����@���7Ʈa��f�=�<�xD.KfၠoR�HB	߾	���PIEND�B`�PK�XɅrW
W
pecat.recipe# vim:fileencoding=utf-8
__license__ = 'GPL v3'
__copyright__ = '2011-2013, Darko Miletic <darko.miletic at gmail.com>'
'''
www.pecat.co.rs
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Pecat_rs(BasicNewsRecipe):
    title = u'Печат'
    __author__ = 'Darko Miletic'
    description = u'Интернет портал слободне Србије'
    publisher = u'NAŠ PEČAT A.D. BEOGRAD'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'sr'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = True
    masthead_url = 'http://www.pecat.co.rs/wp-content/themes/zenko-v1/images/logo.jpg'
    LOGIN = 'http://www.pecat.co.rs/'
    remove_empty_feeds = True
    ignore_duplicate_articles = {'url'}
    needs_subscription = 'optional'
    publication_type = 'magazine'
    extra_css                 = """
                                body{font-family: Arial,Helvetica,sans1,sans-serif}
                                img{display: block; margin-bottom: 1em; margin-top: 1em}
                                p{display: block; margin-bottom: 1em; margin-top: 1em}
                                """

    conversion_options = {
        'comment': description, 'tags': 'politika, Srbija', 'publisher': 'Pecat', 'language': language
    }

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open(self.LOGIN)
            br.select_form(name='loginform')
            br['log'] = self.username
            br['pwd'] = self.password
            br.submit()
        return br

    feeds = [
        (u'Уводник', u'http://www.pecat.co.rs/category/uvodnik/feed/'),
        (u'Интервју', u'http://www.pecat.co.rs/category/intervju/feed/'),
        (u'Друштво', u'http://www.pecat.co.rs/category/drustvo/feed/'),
        (u'Регион', u'http://www.pecat.co.rs/category/region/feed/'),
        (u'Свет', u'http://www.pecat.co.rs/category/svet/feed/'),
        (u'Колумне', u'http://www.pecat.co.rs/category/kolumne/feed/'),
        (u'Култура', u'http://www.pecat.co.rs/category/kultura/feed/'),
        (u'Документи', u'http://www.pecat.co.rs/category/dokumenti/feed/'),
        (u'Репортаже', u'http://www.pecat.co.rs/category/reportaze/feed/'),
        (u'Економија', u'http://www.pecat.co.rs/category/ekonomija/feed/'),
        (u'Изјаве', u'http://www.pecat.co.rs/category/izjave/feed/'),
        (u'Преглед', u'http://www.pecat.co.rs/category/pregled/feed/'),
        (u'Сапутници', u'http://www.pecat.co.rs/category/saputnici/feed/'),
        (u'Сатира', u'http://www.pecat.co.rs/category/satira/feed/'),
        (u'Спорт', u'http://www.pecat.co.rs/category/sport/feed/'),
        (u'Павле Ћосић', u'http://www.pecat.co.rs/category/agencijske-vesti-pavle-cosic/feed/'),
        (u'ТВ Коментар', u'http://www.pecat.co.rs/category/tv-komentar/feed/'),
        (u'Вести', u'http://www.pecat.co.rs/category/vesti/feed/'),
        (u'Календар', u'http://www.pecat.co.rs/category/kalendar/feed/'),
        (u'Други Пишу', u'http://www.pecat.co.rs/category/drugi-pisu/feed/'),
        (u'Одбрана и безбедност',
         u'http://www.pecat.co.rs/category/odbrana-i-bezbednost/feed/')
    ]
PK�XW(�||penguin_news.png�PNG


IHDR  D����PLTE������������������������������������������������������������������������������������������������������������������������������������������������������������vPjX*;53YVW������=4#)%$%!"wjP������FDFk`D��������LIH}g+��M��������헔���I����
��'ý������������V��'��%��$�L�����Ќ���͇������������ķ��������������ֹ�������������������������VSU������DAA���������;88���������~%##�����ۂ����������ґ��pnn������^\]�����Ә��\Z[�������jhh������~���������ywx ���������������DBB��ݵ�������ͭ�����������������������������׿�����~}~���������]\^������cbdrqs���]]`��������򁁂^]_ustwvwzyz}��������ɼ������������8�)tRNSj���Ό-8���e7�r��Ii����f��H��ݒ.W�wIDAT8�}�1Ka��~����V�P�V�P��n��l��YWw��������"�8��� �
"U��z�"�p�5-�fJ�=y���h�
DD~ǐF����珐�ˆa* �J��1?���7E<;^^����S1�c�����Lf���U���@�.b-���c,� `9�	��{�x�K""l����S�P�U�р�N�g���i
ĕ�|��[""���!���[�a�"�'"j��L(��-�Q�� Pw��"�v�9?n~�r+�C5CS��G�}�ٶ}�{^"���.�1��{C]̝;d�z�dFQ�D�E�ez���}�Ձ��p��҆z�ድ��UD�z�B	���?�-���DK���IEND�B`�PK�Xo�6penguin_news.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class MercoPress(BasicNewsRecipe):
    title = u'Penguin News'
    description = u"Penguin News: the Falkland Islands' only newspaper."
    cover_url = 'http://www.penguin-news.com/templates/rt_syndicate_j15/images/logo/light/logo1.png'
    language = 'en'

    __author__ = 'Russell Phillips'

    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    extra_css = 'img{padding-bottom:1ex; display:block; text-align: center;}'

    feeds = [(u'Penguin News - Falkland Islands',
              u'http://www.penguin-news.com/index.php?format=feed&amp;type=rss')]
PK�X�.R�FFpenzberger_merkur.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�6����penzberger_merkur.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Penzberger Merkur'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Weilheim', u'http://www.merkur-online.de/lokales/weilheim/rssfeed.rdf'),
    (u'Region Weilheim', u'http://www.merkur-online.de/lokales/weilheim/seeshaupt/rssfeed.rdf'),
    (u'Seeshaupt', u'http://www.merkur-online.de/lokales/weilheim/seeshaupt/rssfeed.rdf'),
    (u'Raisting', u'http://www.merkur-online.de/lokales/weilheim/raisting/rssfeed.rdf'),
    (u'Wessobrunn', u'http://www.merkur-online.de/lokales/weilheim/wessobrunn/rssfeed.rdf'),
    (u'Penzberg', u'http://www.merkur-online.de/lokales/weilheim/penzberg/rssfeed.rdf'),
    (u'Stadt Weilheim', u'http://www.merkur-online.de/lokales/weilheim/weilheim/rssfeed.rdf'),
    (u'Pei\xdfenberg', u'http://www.merkur-online.de/lokales/weilheim/peissenberg/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/weilheim/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X�����people_daily.png�PNG


IHDR�a�IDATxڅS�m�wg�7b۶m��Bl۶m�vζ�=�-��3g��7����4n���{P�mL(����'�C�*����N��S���ֈ��Y��}�'{��+_��)��*��_r
����QW�s�uʶ��4�����#ϬԔg�\����,��-��:YuC�a�ݷxo��q� �0���z4�ע��f���h���c�?9��>H��{��Zd��Oƃ�OmI���:������d[O|����ex	��2~	<"h��E�Q$
�l�N!�������[Pd��	p�3G��z* ������%.��j�4s��@$AA@�L鬞��m@A�.��p���������c����P,ExE)�H#�†TH7A�"
�&&�f�!Ba�~2�J|�Ӥ�S��v
F���b/�ԥH��)%2�CT�6{��� �$�P��p$
���F󅦰!+76&�(ވ�H�B��)J�;u~3>�<�qWPc�D�!���&5�� �%�a0�*|&S�o��V(�� V��/��5���w�Z�?3�N؝se~~�?�[1
J�RQ�)N����Hȋ�<%:'����.b>2�W��̋3oqZ/���m�ew�d�/K�?� ��	�M���Y͍P
�&�eb�6�AIEND�B`�PK�X�롚people_daily.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe
import os
import time


class AdvancedUserRecipe1277129332(BasicNewsRecipe):
    title = u'人民日报'
    oldest_article = 2
    max_articles_per_feed = 100
    __author__ = 'ceapas'

    publisher = 'people.com.cn'
    description = 'People Daily Newspaper'
    language = 'zh'
    category = 'News, China'
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    encoding = 'GB2312'
    language = 'zh'
    conversion_options = {'linearize_tables': True}
    masthead_url = 'http://www.people.com.cn/img/2010wb/images/logo.gif'

    feeds = [
        (u'时政', u'http://www.people.com.cn/rss/politics.xml'),
        (u'国际', u'http://www.people.com.cn/rss/world.xml'),
        (u'经济', u'http://www.people.com.cn/rss/finance.xml'),
        (u'体育', u'http://www.people.com.cn/rss/sports.xml'),
        (u'教育', u'http://www.people.com.cn/rss/edu.xml'),
        (u'文化', u'http://www.people.com.cn/rss/culture.xml'),
        (u'社会', u'http://www.people.com.cn/rss/society.xml'),
        (u'传媒', u'http://www.people.com.cn/rss/media.xml'),
        (u'娱乐', u'http://www.people.com.cn/rss/ent.xml'),
        # (u'汽车', u'http://www.people.com.cn/rss/auto.xml'),
        (u'海峡两岸', u'http://www.people.com.cn/rss/haixia.xml'),
        # (u'IT频道', u'http://www.people.com.cn/rss/it.xml'),
        # (u'环保', u'http://www.people.com.cn/rss/env.xml'),
        # (u'科技', u'http://www.people.com.cn/rss/scitech.xml'),
        # (u'新农村', u'http://www.people.com.cn/rss/nc.xml'),
        # (u'天气频道', u'http://www.people.com.cn/rss/weather.xml'),
        (u'生活提示', u'http://www.people.com.cn/rss/life.xml'),
        (u'卫生', u'http://www.people.com.cn/rss/medicine.xml'),
        # (u'人口', u'http://www.people.com.cn/rss/npmpc.xml'),
        # (u'读书', u'http://www.people.com.cn/rss/booker.xml'),
        # (u'食品', u'http://www.people.com.cn/rss/shipin.xml'),
        # (u'女性新闻', u'http://www.people.com.cn/rss/women.xml'),
        # (u'游戏', u'http://www.people.com.cn/rss/game.xml'),
        # (u'家电频道', u'http://www.people.com.cn/rss/homea.xml'),
        # (u'房产', u'http://www.people.com.cn/rss/house.xml'),
        # (u'健康', u'http://www.people.com.cn/rss/health.xml'),
        # (u'科学发展观', u'http://www.people.com.cn/rss/kxfz.xml'),
        # (u'知识产权', u'http://www.people.com.cn/rss/ip.xml'),
        # (u'高层动态', u'http://www.people.com.cn/rss/64094.xml'),
        # (u'党的各项工作', u'http://www.people.com.cn/rss/64107.xml'),
        # (u'党建聚焦', u'http://www.people.com.cn/rss/64101.xml'),
        # (u'机关党建', u'http://www.people.com.cn/rss/117094.xml'),
        # (u'事业党建', u'http://www.people.com.cn/rss/117095.xml'),
        # (u'国企党建', u'http://www.people.com.cn/rss/117096.xml'),
        # (u'非公党建', u'http://www.people.com.cn/rss/117097.xml'),
        # (u'社区党建', u'http://www.people.com.cn/rss/117098.xml'),
        # (u'高校党建', u'http://www.people.com.cn/rss/117099.xml'),
        # (u'农村党建', u'http://www.people.com.cn/rss/117100.xml'),
        # (u'军队党建', u'http://www.people.com.cn/rss/117101.xml'),
        # (u'时代先锋', u'http://www.people.com.cn/rss/78693.xml'),
        # (u'网友声音', u'http://www.people.com.cn/rss/64103.xml'),
        # (u'反腐倡廉', u'http://www.people.com.cn/rss/64371.xml'),
        # (u'综合报道', u'http://www.people.com.cn/rss/64387.xml'),
        # (u'中国人大新闻', u'http://www.people.com.cn/rss/14576.xml'),
        # (u'中国政协新闻', u'http://www.people.com.cn/rss/34948.xml'),
    ]
    # keep_only_tags = [
    #     dict(name='p'),
    # ]
    remove_tags = [
        dict(name='div', class_="channel cf")
    ]

    remove_tags_before = [dict(name='div', class_="layout rm_txt cf")]
    remove_tags_after = [dict(name='div', class_="edit cf")]

    def append_page(self, soup, appendtag, position):
        pager = soup.find('img', attrs={'src': '/img/next_b.gif'})
        if pager:
            nexturl = self.INDEX + pager.a['href']
            soup2 = self.index_to_soup(nexturl)
            texttag = soup2.find('div', attrs={'class': 'text_c'})
            # for it in texttag.findAll(style=True):
            #   del it['style']
            newpos = len(texttag.contents)
            self.append_page(soup2, texttag, newpos)
            texttag.extract()
            appendtag.insert(position, texttag)

    def skip_ad_pages(self, soup):
        if ('advertisement' in soup.find('title').string.lower()):
            href = soup.find('a').get('href')
            return self.browser.open(href).read().decode('GB2312', 'ignore')
        else:
            return None

    def preprocess_html(self, soup):

        for item in soup.findAll(style=True):
            del item['form']
        self.append_page(soup, soup.body, 3)
        return soup

    def get_cover_url(self):
        cover = None
        os.environ['TZ'] = 'Asia/Shanghai'
        time.tzset()
        year = time.strftime('%Y')
        month = time.strftime('%m')
        day = time.strftime('%d')
        cover = 'http://paper.people.com.cn/rmrb/images/' + year + '-' + \
            month + '/' + day + '/01/rmrb' + year + month + day + '01_b.jpg'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover)
        except:
            self.log("\nCover unavailable: " + cover)
            cover = None
        return cover
PK�X}��:((people_us_mashup.png�PNG


IHDR��h6�IDATx�cp?�$�@��MO~�z��v<�1�#�i����Tp��o<�����?|w��G��s;^b�w�#DQ���1+�A�>�O*L;C@���/<�d���W�}�p� ��←k/�Um�=B@Cߡ�3�J���"�5��k�?Ր��{�V��c��O����3���	�p��g�	�G������~�f�S��7YvC�~;qTo��;J8-Yn|�6�",�E��G1�����IEND�B`�PK�XH6����people_us_mashup.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
'''
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class PeopleMag(BasicNewsRecipe):

    title = 'People/US Magazine Mashup'
    __author__ = 'BrianG'
    language = 'en'
    description = 'Headlines from People and US Magazine'
    no_stylesheets = True
    use_embedded_content = False
    oldest_article = 2
    max_articles_per_feed = 50
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True
    auto_cleanup_keep = '//div[@id="article-image"]'

    feeds = [
        ('PEOPLE Headlines', 'http://feeds.people.com/people/headlines'),
        ('US Headlines', 'http://www.usmagazine.com/celebrity_news/rss')
    ]
PK�X�0��periodismo_humano_es.png�PNG


IHDR(-S0PLTE�$!�$!�$!�$!�$!�$!�$!�$!�$!�$!�$!�$!�$!�$!�$!�]tRNS 0@P`�����������lIDATx�U��0@�n�{kgHe6�˟Lr�+�^
����RH(�i����4��A{C�z�B7q�q�!��=�F7�%�g2�	�ɣi�|�<H��W��z�^��9�S�IEND�B`�PK�X8��-ppperiodismo_humano_es.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe


class PeriodismoHumanoRecipe (BasicNewsRecipe):
    __author__ = 'Marc Busqué <marc@lamarciana.com>'
    __url__ = 'http://www.lamarciana.com'
    __version__ = '1.0.0'
    __license__ = 'GPL v3'
    __copyright__ = '2014, Marc Busqué <marc@lamarciana.com>'
    title = u'Periodismo Humano'
    description = u'periodismohumano es un nuevo medio de comunicación con enfoque de derechos humanos y sin ánimo de lucro, dirigido por Javier Bauluz y con un equipo de redacción profesional, con corresponsales, colaboradores y analistas en diferentes partes del mundo.'  # noqa
    oldest_articles = 7
    max_articles_per_feed = 100
    language = u'es'
    tags = u'información, contrainformación, información alternativa'
    remove_empty_feeds = True

    def get_extra_css(self):
        if not self.extra_css:
            br = self.get_browser()
            self.extra_css = br.open_novisit(
                'https://raw.githubusercontent.com/laMarciana/gutenweb/master/dist/gutenweb.css').read().replace('@charset "UTF-8";', '')
        return self.extra_css

    feeds = [
        (u'Periodismo Humano', u'http://periodismohumano.com/feed'),
    ]

    def get_cover_url(self):
        return u'http://periodismohumano.com/files/2010/01/logoconslogan-300x211.jpg'
PK�Xij�Ⱥ�pescanik.png�PNG


IHDR���R*PLTE������������Ƨ��|�m�P�A�{3�r$�i�C�KIDATx�c �4�A(#��f>{�̐�{�*�1��ݻ@����޻ �wY��)�4���(H��% 
"1c�)N�*
IEND�B`�PK�X4�F�SSpescanik.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2008-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
pescanik.net
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Pescanik(BasicNewsRecipe):
    title = u'Peščanik'
    __author__ = 'Darko Miletic'
    description = u'Peščanik je udruženje građana osnovano 2006. godine. Glavni proizvod Peščanika je radio emisija koja je emitovana na Radiju B92 od 02.02.2000. do 16.06.2011, a od septembra 2011. se emituje na osam radio stanica u Srbiji, Crnoj Gori i BiH'  # noqa
    publisher = u'Peščanik'
    category = 'news, politics, Serbia'
    oldest_article = 10
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'sr'
    publication_type = 'newsportal'
    masthead_url = 'http://pescanik.net/wp-content/uploads/2011/10/logo1.png'
    extra_css             = """
                               @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                               body{font-family: Verdana,Arial,Tahoma,sans1,sans-serif}
                               #BlogTitle{font-size: xx-large; font-weight: bold}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]
    remove_tags = [
        dict(name=['object', 'link', 'meta', 'script', 'iframe', 'embed'])]
    keep_only_tags = [
        dict(attrs={'id': ['BlogTitle', 'BlogDate', 'BlogContent']})]
    feeds = [
        (u'Autori', u'http://pescanik.net/category/autori/feed/'),
        (u'Prevodi', u'http://pescanik.net/category/prevodi/feed/')
    ]

    def print_version(self, url):
        return url + 'print/'
PK�Xue�`ggpeterschiff.png�PNG


IHDR�a.IDATxڴ�Da��ܔ��h�P5�h�P��!%PI��d�"0B�QQ��$*��'^���{�o�l�M�l+J�a���8E��5�a>��8�AԤ '�u��|b�Ҏ0	'&tA;��EkSx�
2��]�����@ �>B����I��Z���
��p��Z+��[�g������p�
}��V�[bW���C���}��6�#!��i�����3�ádmI��<�Q�v��.؆3���Q�	�p���䠎4*�6�����8Ĩ�^�a)k��P�^|k�nh"��IEND�B`�PK�X�9}���peterschiff.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.europac.net
'''

from calibre.web.feeds.news import BasicNewsRecipe


class PeterSchiff(BasicNewsRecipe):
    title = "Peter Schiff's Economic Commentary"
    __author__ = 'Darko Miletic'
    description = 'Economic commentary'
    publisher = 'Euro Pacific capital'
    category = 'news, politics, economy, USA'
    oldest_article = 25
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    extra_css             = """
                                body{font-family: Verdana,Times,serif }
                                .field-field-commentary-writer-name{font-weight: bold}
                                .field-items{display: inline}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    keep_only_tags = [
        dict(name='h2', attrs={'id': 'page-title'}
             ), dict(name='div', attrs={'class': 'node'})
    ]
    remove_tags = [
        dict(name=['meta', 'link', 'base', 'iframe', 'embed']), dict(
            attrs={'id': 'text-zoom'})
    ]
    remove_attributes = ['track', 'linktype', 'lang']

    feeds = [
        (u'Articles', u'http://feeds.feedburner.com/PeterSchiffsEconomicCommentary')]
PK�X1�	�	phd_comics.png�PNG


IHDR  ��	pHYs��~�	fIDATHǭV�r����`0��H� )��h[��ȱ�8�T*��<�۲�ũ��Y�L�ddQ\� � ��`�\@r��4�����{��>}�����颟�b`�K�u��@?k>(�dY>���"��Y��I��(��םi�t:�4Ͷ�ʟ��S�D"AD��RU�eYx˲H�n�ȹ���Z�96l9����e0�n���r������7	�4a�N��������B����}�T��$Zl���+�G�B��h��Y.a���]ZJ�b��lO
+
ài��8`��?~��	�!z�р��f	���IC��jr�;kY�q�뭳����Y����V�އ�S�L�Q����^29���r�z��l��A�D�|
{Wu0O�x���T2���	��/o�m��ڰWmv��~������A��hN �ܺuk{{0��/^������'����T��d��	�|�_�-Es��z�vw�����I(J��5E>I��B�`��h�wvv�Ţ�+Q4#��:��r{��T, '�!��#d!�ٮNLf5M��|�7��ի�3[3��ǓB�7�Q8*���+,���=�pW� �9���o�g�n���Y:",�28O.Gs��(z-ܭ5�^�˭�`��&F����Y�4uP�8�yy)��K��!�^�����t2��J��'��!Ҕ�
�/�F
Z �/���M5հ0�a�ܱ���X�)���^��x���	�E�;d��C��ci�3FK^-	� ���\�n��g�G��P��
v&����>;���pZ�uI.��ۮ����V�8
Ø���yY�p��l�a�$�i7�ڋ�{��g�IrR��\Z�ɄY[N�ⱍ|��w�ǥ�r��ND$Y��no��;˶&��HW|�L0�qW����ְ�m_�d��ρ�����J�O���g���z&{7�\�u[�j4�L��8R��i�t�bpdj�g��z(�"(
Y�l���E5���O>{4^���w�eM4m�(�nP
D��ȴۯ�;ө����0S��d��L��_x@�����d:��)��α�#�>�(�8�H�VWWlCɯ�ˡ��#��D,7ь�Êcˉ���7߿jvzs�bTn��7�%�$oo����\W�gm,�q��(�������5YK�6�q� ��
�g��l�ct8+��1�h'�#����ҳ���+"�ģ���+zd��D�'� �����Zr-��e����˹�=�.j7;??�ݿ��O�p1�^M�������
'���+����xL|4N!�B���
K|��x��I��\�8,L�x8��E�O_!:l�K
M�c�;w��HJ��_�z���M<�έ��>���d����[�c�6���h�MD��p�@�A�ᘇ���@D��ɇ��ş'�Z�]�\�Zd�ȵ���13m͘K�u)��CI.�N ��|x4���-�2
u`�>��C���j��=�?�P��q�oi��d�qG�a������S4�(Dr�ý਒K 
���MI,!�)��lE���9����ۙ�
�:t ��p��@��3�厦Jc8R:����[YN"��Q���g����ҹ�����L�_��~�l}#��{[�D!�
�A�q!�`$��������ޑ�Y��������$z$ctd���c�"u2W�kh�t0�t:������>n,�8F�R!iه�$?�N�W;�o�>�^U�V��ɥSk+B@���%A�������xvU��K`��赛N�xvu^�'x���( N�y��^�]*^�~��A�R��� ���M ���|����zï����O�]_�ݣ��KQ�w/kuGS@:$C#0s��w����R��"Kos1"ς&0�I�,"�ShkZ׍�M��!9]Я>�x9�^I�dӾxnP��y��hg��t>�;l��#�R�1T����r.
�e��S[C����	�t]/8$���,
�����w3��3#s
Z�:#Umt{��u��U(Zʦ���(GS=�I������[>Bȋ&��n�%���qQ ���O�����;��Yiya��ծ/k�J�f8Tts�����Evmm}c�?=}���=�u?�h;��!B��d\���o��EɄ�3f'�z�݄���e�!��u�pR=�^�T�B�I�Hl9������B��uzr�_M�~���Zi�����7�Fs��*�
,�0�,C�:�q̍�~ه0\��u
x4Q�BS��.B�ݜ�(������ahڵlXB�'���\���sa�7a�IEND�B`�PK�X�	����phd_comics.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement

__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'


from calibre.web.feeds.news import BasicNewsRecipe


class PHDComics(BasicNewsRecipe):
    title = u'PHD Comics'
    oldest_article = 14
    max_articles_per_feed = 100
    language = 'en'

    __author__ = 'Rafardeon'

    feeds = [(u'PHD Comics', u'http://www.phdcomics.com/gradfeed.php')]

    def print_version(self, url):
        return url.replace('http://www.phdcomics.com/comics.php?f=', 'http://www.phdcomics.com/comics/archive_print.php?comicid=')
PK�Xe���((philippino_star_ngayon.png�PNG


IHDR  ���IDATx�Ֆ�s"M����-ےW�z�����ݣh�=�(9#J܀
,G�B��ݍ��~�9��S][���oz�g�����SF���t���|�OI�F������h)7G0���f�c�"@��0��.�(�)��Z(��~K'�'�^���{qi�kh�-�RS����BAe/q*�+���i���rn㉉�l��y��Nک�r�|�YJ��j���^y�{Gf�k:Gɍbъl����	�?�6�U�[BPN%XuK�$7w��d,�;�L�V	�|������@�:P�1Jn:05����(�^@P����"�Ҳ5I�B.vN�V:c��<�Z��Vr6_�u��Wu�2
�1�3�g��lbva�-o}+2��S�e	Ct�}������/d00>�S��`���{& Ʀ-[�L�U���H��Bs������5
�١9
�D�����}��pN��N�}�Cc����	�vL�ay��d�3���W��,`����ܗck�nQ|�S�$
���gx��w����"?^�.[�B1��ַ�M��ԬmZ�>
�Q�s���Mhn�S��sβdoG>Y�J��M�`rւ���<���{d��k���)[[���A�V��~��3�Kpա��Qe�]��w>�|6ьü1�xQi>��5xg͇r-{˃�$�Ȧ�Ar)�5\F����Ns��� ζ���R+��dFl�Z�X��CϳO�| lm�x���]}?��g�&Z�'nl�q�Jj��ɭ2�LK����͜��Ո�)t���8�i$b��ܸ��"�#E�%>q�iRu�G�2�|�:��|�ќ�藋\��&��ΐe�{x�Ǿ%�W�t�*%Us'�Lؽ�Tou��r�}"f�2`?Q7�;�z�7S�&�o!��3E�Wᙩ��jȄ��-��e��M��L��U�CĉS���T3s�4�@��D�w���E2;@$�gc����L��JKG�:���d����,T��a���[�ˆ�N���E����;G�	N�X�%�t��Nn���qG=�p2f�{"z����T�܊N$�ĵ�l.����$,��Q��+����$H"B�1_E���0����2�j��7���Š����!�"��n�@e��/^���c�'��4�Ô�����̡�,L��a^����l�:��J�,�rk`�`gkȑPU#��o$�E��*z����tyv��@Rw�У��)��\S�s3�Nȶuz�T����B6��&�
�w����j?u�2����Ȕ�9�"�8Wx�cm�-�ZG��m�?_�U�u�]��@kY�E"����#C�U��V�@�^S�/ur�{��gI�͍>��P�o���:݁��E�w������U;����~�M��&�~j���韍�W��ą#R-#/�M�ƥ����z�@b�j �Q�	�/��C^"L'E4N ����ʳ�����&��V���	�u����IEND�B`�PK�XQ�1��philippino_star_ngayon.recipe
'''
www.philstar.com
'''

import time
from calibre.web.feeds.recipes import BasicNewsRecipe


class PilipinoStarNgayon(BasicNewsRecipe):
    title = 'Pilipino Star Ngayon'
    custom_title = "Pilipino Star Ngayon - " + \
        time.strftime('%d %b %Y %I:%M %p')
    __author__ = 'jde'
    __date__ = '31 May 2012'
    __version__ = '1.0'
    description = 'A daily Tabloid written in Tagalog, distributed in the Philippines. A tabloid style newspaper published in the national language - philstar.com is a Philippine news and entertainment portal for the Filipino global community.   It is the online presence of the STAR Group of Publications, a leading publisher of newspapers and magazines in the Philippines.'  # noqa
    language = 'tgl'
    publisher = 'The Philippine STAR'
    category = 'news, Philippines'
    tags = 'news, Philippines'
    cover_url = 'http://www.philstar.com/images/logo_PSN.jpg'
    masthead_url = 'http://www.philstar.com/images/logo_PSN.jpg'
    oldest_article = 1.5  # days
    max_articles_per_feed = 25
    simultaneous_downloads = 10
    publication_type = 'newspaper'
    timefmt = ' [%a, %d %b %Y %I:%M %p]'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = False

    remove_tags = [dict(name='img',  attrs={'id': 'Image1'})  # Logo
                   # Section (Headlines, Nation, Metro, ...)
                   # Comments
                   # View Comments
                   # Zoom
                   , dict(name='span', attrs={'id': 'ControlArticle1_LabelHeader'}), dict(name='a',      attrs={'id': 'ControlArticle1_FormView1_hlComments'}), dict(name='img',  attrs={'src': 'images/post-comments.jpg'}), dict(name='a',      attrs={'id': 'ControlArticle1_FormView1_ControlPhotoAndCaption1_hlImageCaption'})  # noqa
                   ]
    conversion_options = {'title': custom_title,
                          'comments': description,
                          'tags': tags,
                          'language': language,
                          'publisher': publisher,
                          'authors': publisher,
                          'smarten_punctuation': True
                          }

    feeds = [

    ('Litra-talk'      		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=535'),
    ('Bansa'       		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=92'),
    ('Probinsiya'     		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=49'),
    ('Metro'          		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=93'),
    ('Opinyon'            	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=94'),
    ('Palaro'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=95'),
    ('Showbiz'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=96'),
    ('True Confessions'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=97'),
    ('Dr. Love'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=98'),
    ('Kutob'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=99'),
    ('Komiks'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=100')
    ]

# process the printer friendly version of article
    def print_version(self, url):
        return url.replace('/Article', '/ArticlePrinterFriendly')

# obtain title from printer friendly version of article; avoiding
# add_toc_thumbnail changing title when article has image
    def populate_article_metadata(self, article, soup, first):
        article.title = soup.find(
            'span', {'id': 'ControlArticle1_FormView1_ArticleHeaderLabel'}).contents[0].strip()
PK�X�Œ�phillosophy_now.png�PNG


IHDR  I��PLTE����0�TVGIDAT�c` ��a� gS�� 'S$��@D��@	�r�'�?8�`�cp�$�D��`�o� A���0$G�8IEND�B`�PK�X(����
�
phillosophy_now.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from calibre import browser
from collections import OrderedDict


class PhilosophyNow(BasicNewsRecipe):

    title = 'Philosophy Now'
    __author__ = 'unkn0wn'
    description = '''Philosophy Now is a lively magazine for everyone
    interested in ideas. It isn't afraid to tackle all the major questions of
    life, the universe and everything. Published every two months, it tries to
    corrupt innocent citizens by convincing them that philosophy can be
    exciting, worthwhile and comprehensible, and also to provide some enjoyable
    reading matter for those already ensnared by the muse, such as philosophy
    students and academics.'''
    language = 'en'
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['height', 'width', 'style']
    encoding = 'utf-8'
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://philosophynow.org/media/images/regulars/logoStructuredData.png'

    keep_only_tags = [classes('article_page')]
    remove_tags = [dict(name='div', attrs={'id':'welcome_box'})]
    extra_css = '''
        img {display:block; margin:0 auto;}
        .articleImage { font-size:small; text-align:center; }
        em, blockquote { color:#202020; }
    '''

    def parse_index(self):
        soup = self.index_to_soup('https://philosophynow.org/')
        div = soup.find('div', attrs={'id': 'aside_issue_cover'})
        url = div.find('a', href=True)['href']
        issue = div.find('div', attrs={'id':'aside_issue_text'})
        if issue:
            self.log('Downloading issue:', self.tag_to_string(issue).strip())
            self.timefmt = ' [' + self.tag_to_string(issue.find(attrs={'id':'aside_issue_date'})) + ']'
            self.title = 'Philosophy Now ' + self.tag_to_string(issue.find(attrs={'id':'aside_issue_number'}))
        cov_url = div.find('img', src=True)['src']
        self.cover_url = 'https://philosophynow.org' + cov_url
        soup = self.index_to_soup('https://philosophynow.org' + url)

        feeds = OrderedDict()

        for h2 in soup.findAll('h2', attrs={'class':'article_list_title'}):
            articles = []
            a = h2.find('a', href=True)
            url = a['href']
            url = 'https://philosophynow.org' + url
            title = self.tag_to_string(a)
            des = h2.find_next_sibling('p')
            if des:
                desc = self.tag_to_string(des)
            h3 = h2.find_previous_sibling('h3')
            section_title = self.tag_to_string(h3).title()
            self.log('\t', title)
            self.log('\t', desc)
            self.log('\t\t', url)
            articles.append({
                'title': title,
                'url': url,
                'description': desc})

            if articles:
                if section_title not in feeds:
                    feeds[section_title] = []
                feeds[section_title] += articles
        ans = [(key, val) for key, val in feeds.items()]
        return ans

    # PN changes the content it delivers based on cookies, so the
    # following ensures that we send no cookies
    def get_browser(self, *args, **kwargs):
        return self

    def clone_browser(self, *args, **kwargs):
        return self.get_browser()

    def open_novisit(self, *args, **kwargs):
        br = browser()
        return br.open_novisit(*args, **kwargs)

    open = open_novisit
PK�XH��@��
philly.png�PNG


IHDR��h6�IDAT��kW��1�����O%�Dc�E�"�?Zh+E�o��<��"�x�y� Z�Si���Hl��Pd�������˼7��<?d3�k�`�@�P���@��55�ܚ�d`���ۯ�?���\U�.�����}���Ш(�0`�4��n!}���͛/.n��N@�(W��a����W�q$&�f���x���d
�]�����/��Q~�q����2���(�߽��N��V�༧b�$Յ]_?L�x}��c�B e�����H	�3�'��{��j�Ve�g�n߁x�Y���7/�Z1��jd�@)K�		j8�&e^i��MFzo��"��L��h�KkJZ����c<���xȘ�����,/��>�K�'���u�Od���/Vp�]�"i�.�r|PP�����J��P$₆�A���^��Bu�"��������
w��ףu�Q�\���w:]ͼ.'hvf��1�����x1��~�g<�Y��Y���)(�p-J;��z�*X�9@�o���K����+B�V��PD�^o
$i�8|�́v��`����?��FQ&��`>�R«U�Z�ݷ��vǍ�Z$�&�>�����V1]{��y�.���S33_���k5���U*�0Ҷ�-׭v�
1m�Y<}/�Eɨ�����57�31iTƘ���a�t�IEND�B`�PK�X�}�v��
philly.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1314970845(BasicNewsRecipe):
    title = u'Philadelphia Inquirer'
    oldest_article = 3
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'en'
    __author__ = 'bing'
    requires_version = (0, 8, 16)

    feeds = [
        (u'Front Page', u'http://www.philly.com/inquirer_front_page.rss'),
        (u'Philly.com News', u'http://www.philly.com/philly_news.rss'),
        (u'National/World (Philly.com)',
         u'http://www.philly.com/philly_news_nation.rss'),
        (u'Politics (Philly.com)', u'http://www.philly.com/philly_politics.rss'),
        (u'Local (Philly.com)', u'http://www.philly.com/philly_news_local.rss'),
        (u'South Jersey News', u'http://www.philly.com/inq_news_south_jersey.rss'),
        (u'Sports', u'http://www.philly.com/inquirer_sports.rss'),
        (u'Tech News', u'http://www.philly.com/philly_tech.rss'),
        (u'Daily Magazine', u'http://www.philly.com/inq_magazine_daily.rss'),
        (u'Weekend', u'http://www.philly.com/inq_entertainment_weekend.rss'),
        (u'Business', u'http://www.philly.com/inq_business.rss'),
        (u'Education', u'http://www.philly.com/inquirer_education.rss'),
        (u'Books', u'http://www.philly.com/inq_books.rss'),
        (u'Entertainment', u'http://www.philly.com/inq_entertainment.rss'),
        (u'Food', u'http://www.philly.com/inq_food.rss'),
        (u'Health and Science', u'http://www.philly.com/inquirer_health_science.rss'),
        (u'Home and Design', u'http://www.philly.com/inq_home_design.rss'),
        (u'News Columnists', u'http://www.philly.com/inq_columnists.rss'),
        (u'Editorial', u'http://www.philly.com/inq_news_editorial.rss'),
        (u'Travel', u'http://www.philly.com/inquirer_travel.rss'),
        (u'Obituaries', u'http://www.philly.com/inquirer_obituaries.rss')
    ]

    def print_version(self, url):
        return url + '?viewAll=y'
PK�X�$wC��phoronix.png�PNG


IHDR  szz�dIDATx^ŖOlW��s�μy/���τ�i�`G�%B[�j�8PT)�)	T,���&�BdS���T� �T
�N�7@a��6 E�`SE��"؉������?3sQ��)zOi�`��fq���޹��z�Gų6/"��zUͫ�:۳Z�xv"R�2�,�iZ>|����ǎ�c�[��7��ʓ�r�j��o��A����
�BoDD=c�L&lG��U�|�jE��lxFDޭV�sG�ѮǏk5��MOO�9�B4W�F�&����+���M�����~���p�md���7��:T��7'N<VZ\�ՙ�����cG
d7�c�1V��:�vB�T�9�H_ɰ�O%۷o+��<X���ɡj�:����|��?ی�{�S�>ڵ, �X�R��
�m{��|z�'��Wejj��s�~�Ǐ���F�,4����).Np���#�'��c��v�v�I�>���m�ߖ��'O������[b��TuJ��<�l�\�ِ��1�ݴ�#u�zҤ�M̦���!D�G�.̱C��o���8��.�U��Ns���1R+0���jq�8���>����Hp�ƀf��\��\��������O���)��)晿TB�>b�H�E�p���Jʷ�sf�懿���T�����d�w,�((�h4diiY�v�S4�<��Y�z�~���̂b��������
A�!�f�r���U�_
�Ϟ=�a�	k�x���[����@���>���x��#X�bzE����`��s��17�m��@D��������.���Ek{0�`���kl���t�pg�(��V���i�|	�@*��J��(����P���T5r�=�j��b�ު[��G�j;C�tU���ri�������
�	5q;����C3��#o�y*�PAP�����d�a��õ�"?����0_d(J�Y�T+3�T��/x�x�����
#�n�(�>��x�h�&.�@��"����:ͅV�Aߢ��Ή��L�/���Ch��
�g���� ���^���cc����+������8%M���+%6�s��K��{~���Bj{��
�K�I�MY�5[IF�s|�~��_�޲�M��|~	�
�4%s���~��(AU{ݶ��L�䲹�PX�,�

]���{���z������ʆ�^��G����W�ah�u`ADZt�	Ѕι%�]��F����r�d�f���# B�� +�l�8�U��ɷO��}��ױ����g��N9U}�5�?<���y�K�?����W,k�[�����Ȋ����+"�f��/+01�&
�?IEND�B`�PK�X���x��phoronix.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2011 Aurélien Chabot <contact@aurelienchabot.fr>'

'''
Fetch phoronix.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class cdnet(BasicNewsRecipe):

    title = 'Phoronix'
    __author__ = 'calibre'
    description = 'Actualités Phoronix'
    encoding = 'utf-8'
    publisher = 'Phoronix.com'
    category = 'news, IT, linux'
    language = 'en'

    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 25
    no_stylesheets = True
    remove_empty_feeds = True
    filterDuplicates = True

    extra_css = '''
                    h1 {font-size:xx-large; font-family:Arial,Helvetica,sans-serif;}
                    h2 {font-size:xx-small; color:#4D4D4D; font-family:Arial,Helvetica,sans-serif;}
                    .KonaBody {font-size:medium; font-family:Arial,Helvetica,sans-serif;}
                '''

    remove_tags = []

    remove_tags_before = dict(id='phxcms_content_phx')
    remove_tags_after = dict(name='div', attrs={'class': 'KonaBody'})

    feeds = [('Phoronix', 'http://feeds.feedburner.com/Phoronix')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X.8�^^phys_org.png�PNG


IHDR�a%IDATx�cf �`����e�s���'ˀ�y;���NkN�]��'���S\��O�/i���!�f�Ӡ��:^pq.�$܆F�K��y���/�p��}t+XL�6�?�a�.�D��LKn?t����G��M��%��Q*X�� �?�V<n�S{�6��O(��c���
�����'�5�lo���grv�@~Vw/�o\�_�w!�4��S�@a�v|���%���Kk�Gh&������5�m&����2R@a�����hā�O��Z�5=�����p����!<IEND�B`�PK�X��ggphys_org.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HindustanTimes(BasicNewsRecipe):
    title = u'PhysOrg'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('Nanotechnology',
         'http://phys.org/rss-feed/nanotech-news/'),
        ('Physics',
         'http://phys.org/rss-feed/physics-news/'),
        ('Space and Earth',
         'http://phys.org/rss-feed/space-news/'),
        ('Chemistry',
         'http://phys.org/rss-feed/chemistry-news/'),
        ('Biology',
         'http://phys.org/rss-feed/biology-news/'),
        ('Technology',
         'http://phys.org/rss-feed/technology-news/'),
        ('Other Sciences',
         'http://phys.org/rss-feed/science-news/'),
    ]
PK�X¯(���physics_today.png�PNG


IHDR(-S3PLTEg�!q�0z�M��\��k��z�lj�ͧ�ڶ�������������b����ptRNS@��fUIDATxڜ��!���.�?n�npz����逬�+Rz��ǯ(��4�G�Ԟ#���m�?�TS��o0L��
�q�Ұ�[IEND�B`�PK�X@�/���physics_today.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre import strftime


class Physicstoday(BasicNewsRecipe):
    title = u'Physicstoday'
    __author__ = 'Hypernova'
    description = u'Physics Today magazine'
    publisher = 'American Institute of Physics'
    category = 'Physics'
    language = 'en'
    cover_url = strftime(
        'http://ptonline.aip.org/journals/doc/PHTOAD-home/jrnls/images/medcover%m_%Y.jpg')
    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    needs_subscription = True
    remove_javascript = True
    remove_tags_before = dict(name='h1')
    remove_tags = [dict(name='div', attrs={'class': 'highslide-footer'})]
    remove_tags = [dict(name='div', attrs={'class': 'highslide-header'})]
    preprocess_regexps = [
        (re.compile(r'<!-- END ARTICLE and footer section -->.*</body>', re.DOTALL | re.IGNORECASE),
         lambda match: '</body>'),
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open(
                'http://ptonline.aip.org/journals/doc/PHTOAD-home/pt_login.jsp?fl=f')
            br.select_form(name='login_form')
            br['username'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    feeds = [(u'All', u'http://www.physicstoday.org/feed.xml')]
PK�X���physics_world.png�PNG


IHDR���R0PLTE������/-+@>;qomNKI��~���eba���ZYV������0���LIDATx�c` dE���v��EJE��Xɂ��E��Re�g��ћՌ����oͮb0��2,``P�/1�) ��8��e�IEND�B`�PK�X�y߰�physics_world.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class PhysicsWorld(BasicNewsRecipe):
    title = u'Physicsworld'
    description = 'News from the world of physics'
    __author__ = 'Hypernova'
    language = 'en'

    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    cover_url = 'http://images.iop.org/cws/icons/themes/phw/header-logo.png'
    use_embedded_content = False
    remove_javascript = True
    needs_subscription = True
    remove_tags_before = dict(name='h1')
    remove_tags_after = [dict(name='div', attrs={'id': 'shareThis'})]
    preprocess_regexps = [
        (re.compile(r'<div id="shareThis">.*</body>', re.DOTALL | re.IGNORECASE),
         lambda match: '</body>'),
    ]
    feeds = [
        (u'Headlines News', u'http://feeds.feedburner.com/PhysicsWorldNews')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('http://physicsworld.com/cws/sign-in')
            br.select_form(nr=2)
            br['username'] = self.username
            br['password'] = self.password
            br.submit()
        return br
PK�X�:pOddpilot.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class PilotOnline(BasicNewsRecipe):
    title = u'Pilot Online'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 120  # days
    max_articles_per_feed = 25

    no_stylesheets = True
    remove_tags_before = dict(name='div', attrs={'id': 'wrapper'})
    # remove_tags_after  = dict(name='td', attrs={'class':'asset-bar'})
    remove_tags = [
        dict(name='iframe'),
        dict(name='div', attrs={'class': ['breadcrumb', 'asset-bar', 'footerLogos', 'footerLinks', 'lefty',
                                          'righty', 'last', 'subFooter', 'footerLinks-last', 'comment clear-block', 'box', 'related', ]}),
        dict(name='div', attrs={'id': ['rightColumn']}),
        dict(name='span', attrs={'class': 'comment_forbidden'}),
        dict(name='ul', attrs={'class': 'links inline'}),
        dict(name='p', attrs={'id': 'commentadvisory'}),
        dict(name='div', attrs={
            'style': ['width: 300px; margin-right: 2em; float: left;']}),
        dict(name='div', style="float:right; width: 300px;"),
        dict(name='p', style="clear:both;"),
        dict(name='span', text=':'),
    ]

    feeds = [
        ('Hampton Roads',
         'http://hamptonroads.com/taxterm/11'),
        'http://hamptonroads.com/taxterm/12',
        'http://hamptonroads.com/taxterm/222',
        'http://hamptonroads.com/taxterm/224',
        'http://hamptonroads.com/taxterm/226',
        'http://hamptonroads.com/taxterm/3',
        'http://hamptonroads.com/taxterm/149',
        'http://hamptonroads.com/taxterm/228',
        'http://hamptonroads.com/taxterm/4',
        'http://hamptonroads.com/taxterm/522',
        'http://hamptonroads.com/taxterm/420',
        'http://hamptonroads.com/taxterm/227',
        'http://hamptonroads.com/taxterm/231',
        'http://hamptonroads.com/taxterm/232',
    ]
PK�XZ̨;;piratska_strana.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿tIME�/�/vfCIDATHǕ��kSa���$�q��U� !.�Iiqt2"�$�t�!�[bW��T($��l�P
:iQ�K�7��!�������{�{��<�9RT�*�����h���j�(SǪ��	�UjԨR�Dh�������T�p����P!�,m(ϩoP‸:`
�����h��Ŕ���[Ŕ-�h����%�x��S&�3
�채��Ȩ��ᰍx�m�9�)N��:y�oE��Zllً=��e��P叽������Yk��]a��!
q�/�%d9Mm�}�;LxI1�;�F��ԍ*>�s#�⹽��F2�����f�E,����:/A/�@|���D
�[��K�IвWWQWVv	�h(Mj	/"�'�i���$��;"��;g�W��j|�'�+h#�'�r>>�c>�v�D�l�5fp�{���(p���� ���7Yg�A�9;�Rh�_#r|�:UF�3�
<��\rE�����$�e�<����B���]W��t�#w���o(K{���Lu��aS���_	wo�غ/X��ʗ�ō�eڡhkS&�,��m���p]��k�x	��6*��Md%tEXtdate:create2023-06-19T20:44:07+00:00o,�%tEXtdate:modify2023-06-19T20:44:07+00:00C�[IEND�B`�PK�X�oaapiratska_strana.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class cpsRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Piratská strana'
    publisher = u''
    description = ''
    oldest_article = 3
    max_articles_per_feed = 20
    use_embedded_content = False
    remove_empty_feeds = True

    feeds = [
        (u'Články', u'http://www.pirati.cz/rss.xml')
    ]

    language = 'cs'
    cover_url = 'http://www.pirati.cz/sites/all/themes/addari-cps/images/headbg.jpg'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                            """

    remove_attributes = []
    keep_only_tags = [dict(name='div', attrs={'id': 'postarea'})]
    remove_tags = [dict(name='div', attrs={'class': ['breadcrumb', 'submitted', 'links-readmore']}),
                   dict(name='div', attrs={'id': ['comments']})]
    remove_tags_before = dict(name='font', attrs={'size': '+3'})
    remove_tags_after = [dict(name='iframe')]

    conversion_options = {'linearize_tables': True}
PK�X� ����piratske_noviny.png�PNG


IHDR  V%(�IDAT8�}��KS��bw���.^� �c��xaH#Q2R,Hs]�F	��D~$�3+H��,�\�!N�9˵�܇���tK��9��y�.t�3����</P��H�&��_��P��N�V��A���^����.i��Z�MP���p�Z>�E	�a�q�Ra��|=�,����Q#y#d���\�)hZ��SX��O0��A<|�	-S�����\jG=@'���c$��4M<|UZ�Z���ٌ�?�B['ts�0F�:�����[�J�AF6>�N�)��g���^k�T�����C�
$���v�R��ܘ�#�K@r���%���P^$�Z�<T��(�
b�Z�P�_Q��1���i[rXmqщ�D�q^Aa]E��}iǛ�4%��k�������JժQv��h�M�3���S�Hj_�����U��Z��(�i�b��k����$UCS,kŖ��9���<�q���
gN !�D��ѹ�4�n����Oۊcj��U��m�:� !��If90�w�6>G�������[��N�%��U��d?��#���9�ö�ݴAH@HL�4dҳ�-}��[���
,k_�WB������ty\�i.L|���ܾ}�t""	�"�8D<qDUc@�溙IEND�B`�PK�Xn�]��piratske_noviny.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class nfpkRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Piratské noviny'
    publisher = u''
    description = 'nfpk.cz'
    oldest_article = 2
    max_articles_per_feed = 20
    use_embedded_content = False
    remove_empty_feeds = True

    feeds = [
        (u'Aktuality', u'http://www.piratskenoviny.cz/run/rss.php')
    ]

    language = 'cs'
    cover_url = 'http://www.piratskenoviny.cz/imgs/piratske-noviny.gif'
    remove_javascript = True
    no_stylesheets = True
    extra_css             = """
                            """

    remove_attributes = []
    remove_tags_before = dict(name='font', attrs={'size': '+3'})
    remove_tags_after = [dict(name='iframe')]
    conversion_options = {'linearize_tables': True}
PK�X =7��planet_kde.png�PNG


IHDR�ayIDATx�$�p�i��t�dg�m۶m�Fl�u�ڌm۶3���f��J�,���En1���c�G���ž�ö���vF�d̶7L���qL�����ݧJ>�a9n���Og��hv�sͷ���<NR�v�����`�u�.`ޅP��	F��5F�Ls���`�M6g<Kx�	��.�u�,���!�8�i�)T��W>�~��Ɍӟ�.tC�`��X��epҳ��OZ1'G?��.Y2��~
��U���JAY=�L��%�Б|1˂�f�E>G=��+�W��P��h4j�ZR�"G�PpѾ�=NU,���O�ݑ|9ےWbXoQ��2Ze�4Κe���K__/i������^-�p�e��L�K<�|5ך�g�YeR�6��CBy2��ϡ�G[�O{�۩��6�Z�YT2�B2zK���1�X8kn��
�R�A�}�~������~l�u��2��s;�)ײ� 
Z����=�~�xT*������u%��-0�T<��mZ8��T�^H`��x-�̳e�O�>��Y<�v>��G�y��L�_͠�KMc�����ȓQ�-�$ε�o|�=Ӯf�$��ŠV\/f��\�]-f��rL<��r#�����8�QDo����5��x̟��q�8���v��u]��o��C#��2J��-��U�����À
_̶�5��ɏ�Ǣ�z^�q�2�>(���MW�m)�]�Hʪg��|�[�"]�-0˒_6��rW��%s2�Uwj�n�$"����2����B��L=�į���H�F�|�I���[��7��}�c��`ƙ4�_�gѕ"\.�O���G|�ЅEjZ�8�)q~��M��Y�8�����q��s��gg��M�A�������G(IEND�B`�PK�X�><zzplanet_kde.recipefrom calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1300864518(AutomaticNewsRecipe):
    title = u'KDE News'
    language = 'en'
    __author__ = 'Riccardo Iaconelli'
    oldest_article = 10
    max_articles_per_feed = 100

    feeds = [(u'Planet KDE', u'http://planetkde.org/rss20.xml'),
             (u'Got the Dot?', u'http://dot.kde.org/rss.xml')]
PK�X�Q�::planet_python.recipefrom calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe(AutomaticNewsRecipe):
    title = u'Planet Python'
    language = 'en'
    __author__ = 'Jelle van der Waa'
    oldest_article = 10
    max_articles_per_feed = 100
    feeds = [(u'Planet Python', u'http://planetpython.org/rss20.xml')]
PK�XBt�٣�
plus_info.png�PNG


IHDR  szz�jIDATx�b��Z@Fv�q�s��NUU.N���D��P@EĊ8k��V<��uֳ��։�"։��9TT�ڷn������*�E��v�a��k�V�3�}3���ͼt��Z�
�����1̏�Ȁ�';5ܵ��(��������]�b��m�mWi��-X?O��؏�Ч����E�G?�����P�@7�
���|
�)BAMc���u�� �]�]���6���E�0�)_Y����/�B3��`�
m[16�[��X�
�a��4%Gէ���1��s�C�l�Ff���Ǟ�c���>�۳�A�{Ԁ?�G*@�*c�t"{b9w5ھ���5{��o�-Z��bc��l��>�6X1X\����Yߙ݂-wAɬ8eç�	|�d�&��&�b6E�A��υ�M��aMͭ*����+��%}\�hx��O��9$�&���S��ϝ1�o�,]_�b�rӧ��������aU*!��"mpv#�:���u%0a
�s��-���s_d�	��`v
S�A���Jن�%`-?�1��#oeO��f��.�m!�I��4��3!O�m"��y��mAK�{y/a��{p�����6�q�{�?#�T*c�\E�ւ�H��u�ܚr�m5���i�PoBQ'q��'ۡ������!�0�����SපIOu�`�v���G�K��^�7q�7o/��x�<S��Yz�"�&�u
#]3����(����oX����X�}�$ ����#_I$I��]�F.�~��tS˹�!�&�`H���c��wvR�0���'`z�	�<D	8�m�^�C�
r����N�Y+ڨ���T�[�r���B��&�)	T3k��R��	�H�Po��׮����U�b	0�k9�`
g�L+��>��-@�e�Gp��|�l�	��.�p
��Ђ�`�����؅sXV����A��O୬���7�I_������D�N�8���|����Jj���;�_�T��\���K�;�����ꮄ|_�އsї����������[f߇�]�1�W���՚���ˢ��VdIEND�B`�PK�X83u��plus_info.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

__author__ = 'Darko Spasovski'
__license__ = 'GPL v3'
__copyright__ = '2011, Darko Spasovski <darko.spasovski at gmail.com>'

'''
www.plusinfo.mk
'''
from calibre.web.feeds.news import BasicNewsRecipe


class PlusInfo(BasicNewsRecipe):

    INDEX = 'www.plusinfo.mk'
    title = u'+info'
    __author__ = 'Darko Spasovski'
    description = 'Macedonian news portal'
    publication_type = 'newsportal'
    category = 'news, Macedonia'
    language = 'mk'
    masthead_url = 'http://www.plusinfo.mk/style/images/logo.jpg'
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    oldest_article = 1
    max_articles_per_feed = 100

    remove_tags = []
    remove_tags.append(
        dict(name='div', attrs={'class': ['komentari_holder', 'objava', 'koment']}))
    remove_tags.append(dict(name='ul', attrs={'class': ['vest_meni']}))
    remove_tags.append(dict(name='a', attrs={'name': ['fb_share']}))
    keep_only_tags = [dict(name='div', attrs={'class': 'vest1'})]

    feeds = [(u'Македонија', u'http://www.plusinfo.mk/rss/makedonija'),
             (u'Бизнис', u'http://www.plusinfo.mk/rss/biznis'),
             (u'Скопје', u'http://www.plusinfo.mk/rss/skopje'),
             (u'Култура', u'http://www.plusinfo.mk/rss/kultura'),
             (u'Свет', u'http://www.plusinfo.mk/rss/svet'),
             (u'Сцена', u'http://www.plusinfo.mk/rss/scena'),
             (u'Здравје', u'http://www.plusinfo.mk/rss/zdravje'),
             (u'Магазин', u'http://www.plusinfo.mk/rss/magazin'),
             (u'Спорт', u'http://www.plusinfo.mk/rss/sport')]

    # uncomment the following block if you want the print version (note: it lacks photos)
#    def print_version(self,url):
#        segments = url.split('/')
#        printURL = '/'.join(segments[0:3]) + '/print/' + '/'.join(segments[5:])
#        return printURL
PK�X�lށ��pnn.png�PNG


IHDR�avIDATx���7@���A�Pc-ۓ
�
�S�,��c�YrG�{߅����A�)˖L��~mC�B�ɨN�溓v';�-�pʒ��e��bC�@�Ɏ��m@Y�
�E';��މ�چ7���f[k-A\IEND�B`�PK�XW��_
_

pnn.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe

'''Calibre recipe to convert the RSS feeds of the PNN to an ebook.'''


class SportsIllustratedRecipe(BasicNewsRecipe):
    __author__ = 'n.kucklaender'
    __copyright__ = 'a.peter'
    __license__ = 'GPL v3'
    language = 'de'
    description = 'PNN RSS'
    version = 1
    title = u'PNN'
    timefmt = ' [%d.%m.%Y]'

    oldest_article = 7.0
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    publication_type = 'newspaper'

    remove_empty_feeds = True
    remove_tags = [dict(attrs={'class': ['um-weather um-header-weather', 'um-has-sub um-mainnav', 'um-box', 'ts-products',
                                         'um-meta-nav', 'um-box um-last', 'um-footer', 'um-footer-links', 'share hidden', 'um-buttons']}), dict(id=['dinsContainer'])]  # noqa

    feeds = [(u'Titelseite', u'http://www.pnn.de/rss.xml'),
             (u'Dritte Seite', u'http://www.pnn.de/dritte-seite/rss.xml'),
             (u'Politik', u'http://www.pnn.de/politik/rss.xml'),
             (u'Meinung', u'http://www.pnn.de/meinung/rss.xml'),
             (u'Potsdam', u'http://www.pnn.de/potsdam/rss.xml'),
             (u'Havel-Spree', u'http://www.pnn.de/havel-spree/rss.xml'),
             (u'Potsdam-Mittelmark', u'http://www.pnn.de/pm/rss.xml'),
             (u'Berlin-Brandenburg', u'http://www.pnn.de/brandenburg-berlin/rss.xml'),
             (u'Wirtschaft', u'http://www.pnn.de/wirtschaft/rss.xml'),
             (u'Sport', u'http://www.pnn.de/sport/rss.xml'),
             (u'Regionalsport', u'http://www.pnn.de/regionalsport/rss.xml'),
             (u'Kultur', u'http://www.pnn.de/kultur/rss.xml'),
             (u'Potsdam-Kultur', u'http://www.pnn.de/potsdam-kultur/rss.xml'),
             (u'Wissen', u'http://www.pnn.de/wissen/rss.xml'),
             (u'Medien', u'http://www.pnn.de/medien/rss.xml'),
             (u'Weltspiegel', u'http://www.pnn.de/weltspiegel/rss.xml'),
             (u'Wissenschaft', u'http://www.pnn.de/campus/rss.xml'),
             (u'Mobil', u'http://www.pnn.de/mobil/rss.xml'),
             (u'Reise', u'http://www.pnn.de/reise/rss.xml'),
             (u'Ratgeber', u'http://www.pnn.de/ratgeber/rss.xml'),
             (u'Fragen des Tages', u'http://www.pnn.de/fragen-des-tages/rss.xml'),
             # (u'Potsdam bin ich', u'http://www.pnn.de/potsdam-bin-ich/rss.xml'),
             (u'Leserbriefe', u'http://www.pnn.de/leserbriefe/rss.xml')]

    def get_masthead_url(self):
        return 'http://www.pnn.de/app/base/img/pnn_logo.png'

    def print_version(self, url):
        return url.replace('.html', ',view,printVersion.html')
PK�X�w��aapobjeda.png�PNG


IHDR��h6(IDATx�c8 �J�j�O��B�����Q
�q�)HO
$!u ��J7[�IEND�B`�PK�Xa%hZZpobjeda.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
pobjeda.co.me
'''

import re
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Pobjeda(BasicNewsRecipe):
    title = 'Pobjeda Online'
    __author__ = 'Darko Miletic'
    description = 'News from Montenegro'
    publisher = 'Pobjeda a.d.'
    category = 'news, politics, Montenegro'
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'sr'

    lang = 'sr-Latn-Me'
    INDEX = u'http://www.pobjeda.co.me'
    extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif}'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [dict(name='div', attrs={'class': 'vijest'})]

    remove_tags = [dict(name=['object', 'link'])]

    feeds = [

    (u'Politika', u'http://www.pobjeda.co.me/rubrika.php?rubrika=1'),
    (u'Ekonomija', u'http://www.pobjeda.co.me/rubrika.php?rubrika=2'),
    (u'Drustvo', u'http://www.pobjeda.co.me/rubrika.php?rubrika=3'),
    (u'Crna Hronika', u'http://www.pobjeda.co.me/rubrika.php?rubrika=4'),
    (u'Kultura', u'http://www.pobjeda.co.me/rubrika.php?rubrika=5'),
    (u'Hronika Podgorice', u'http://www.pobjeda.co.me/rubrika.php?rubrika=7'),
    (u'Feljton', u'http://www.pobjeda.co.me/rubrika.php?rubrika=8'),
    (u'Crna Gora', u'http://www.pobjeda.co.me/rubrika.php?rubrika=9'),
    (u'Svijet', u'http://www.pobjeda.co.me/rubrika.php?rubrika=202'),
    (u'Ekonomija i Biznis', u'http://www.pobjeda.co.me/dodatak.php?rubrika=11'),
    (u'Djeciji Svijet', u'http://www.pobjeda.co.me/dodatak.php?rubrika=12'),
    (u'Kultura i Drustvo', u'http://www.pobjeda.co.me/dodatak.php?rubrika=13'),
    (u'Agora', u'http://www.pobjeda.co.me/dodatak.php?rubrika=133'),
    (u'Ekologija', u'http://www.pobjeda.co.me/dodatak.php?rubrika=252')
    ]

    def preprocess_html(self, soup):
        soup.html['xml:lang'] = self.lang
        soup.html['lang'] = self.lang
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return self.adeify_images(soup)

    def get_cover_url(self):
        cover_url = None
        soup = self.index_to_soup(self.INDEX)
        cover_item = soup.find('img', attrs={'alt': 'Naslovna strana'})
        if cover_item:
            cover_url = self.INDEX + cover_item.parent['href']
        return cover_url

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(0, _('Fetching feed') + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            soup = self.index_to_soup(feedurl)
            for item in soup.findAll('div', attrs={'class': 'vijest'}):
                description = self.tag_to_string(item.h2)
                atag = item.h1.find('a', href=True)
                if atag is not None:
                    url = self.INDEX + '/' + atag['href']
                    title = self.tag_to_string(atag)
                    date = strftime(self.timefmt)
                    articles.append({
                        'title': title, 'date': date, 'url': url, 'description': description
                    })
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X��#Z��	poche.png�PNG


IHDR  D����PLTExY�mX�qZ�tV�uZ�rW�pU�qW�rV�rW�rW�rW�rW�rW�rW�rW�rW�tZ�w]�|c��m��v��z���������ù����ĸ�ź�ɾ�������������������������������������87�tRNS"#%/0W������{�D�
IDATx�l��0C�r�Ҙ�7�zc���zQ���K��U�M<�h�Qh L+��D���{֮�YA��@����|�?��aC�wi�Agr<,�#����e���Dr���x��t���
�'�%GW`ĎDԖ�Zc�)pa���#ZR�
��P��}֎��p6N
C�6	#Jz\��f�&���d��!�����ءg/K���3�}{ݒ����x�t��<9��h���O��h!r_>D��H�23��Gd�%��r
;�إ�|IEND�B`�PK�X+��poche.recipefrom calibre import strftime
from calibre.web.feeds.recipes import BasicNewsRecipe


class NYTimes(BasicNewsRecipe):

    appURL = 'https://www.framabag.org'
    title = 'wallabag'
    __author__ = 'Xavier Detant'
    description = 'Get your wallabag from your framabag account. wallabag is a self hosted read it later platform'
    needs_subscription = True
    remove_tags_before = dict(id='article')
    remove_tags_after = dict(id='article')

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open(self.appURL + '/u/' + self.username)
            br.select_form(name='loginform')
            br['login'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def parse_index(self):
        baseURL = self.appURL + '/u/' + self.username + '/'
        soup = self.index_to_soup(baseURL + 'index.php')
        articles = {}
        key = None
        ans = []

        for div in soup.findAll(True, attrs={'class': ['entrie']}):

            a = div.find('a', href=True)
            if not a:
                continue
            key = self.tag_to_string(
                div.find('a', attrs={'class': ['reading-time']}))
            url = baseURL + a['href']
            title = self.tag_to_string(a, use_alt=False)
            description = ''
            pubdate = strftime('%a, %d %b')
            summary = div.find('p')
            if summary:
                description = self.tag_to_string(summary, use_alt=False)

            feed = key if key is not None else 'Uncategorized'
            if feed not in articles:
                articles[feed] = []
            articles[feed].append(
                dict(title=title, url=url, date=pubdate, description=description, content=''))
        ans = [(keyl, articles[keyl]) for keyl in articles.keys()]
        return ans
PK�X��!podnikatel.png�PNG


IHDR�a�IDATx�c������
�"����D�/`@�0�����2��E����8A�}��3��g{Bļ�o:q�8Ģ�/�s���=����c��*�PNiE	o�n�t4�ǯ��|�����/ 1X�g�jZ�۲�<�X7�r�V�
p�����[�_#������w�������x�=
�H����_2��������c�
�@Av��s`��ЪfIEND�B`�PK�X����podnikatel.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Tomas Latal<latal.tomas at gmail.com>'

from calibre.web.feeds.news import BasicNewsRecipe


class PodnikatelCZ(BasicNewsRecipe):
    title = 'Podnikatel'
    __author__ = 'Tomas Latal'
    __version__ = '1.0'
    __date__ = '30 April 2011'
    description = u'Aktuality a \u010dl\xe1nky z Podnikatel.cz'
    oldest_article = 1
    max_articles_per_feed = 10
    encoding = 'utf8'
    publisher = 'Internet Info s.r.o.'
    category = 'podnikani, bussiness, CZ'
    language = 'cs'
    publication_type = 'newsportal'
    no_stylesheets = True
    remove_javascript = True
    extra_css               = 'p.perex{font-size: 1.2em; margin: 0 0 10px 0;line-height: 1.4;padding: 0 0 10px 0;font-weight: bold;} \
                               p.perex img {display:none;} \
                               .urs p {margin: 0 0 0.8em 0;}'

    feeds = [
        (u'Aktuality', u'http://rss.podnikatel.cz/aktuality'),
        (u'\u010cl\xe1nky', u'http://rss.podnikatel.cz/clanky')
    ]

    remove_tags_before = dict(id='art-content')

    remove_tags_after = [dict(id='art-content')]

    remove_tags = [
        dict(attrs={'class': ['socialshare', 'box-blue', 'author clear', 'labels-terms',
                              'box diskuze', 'ad', 'page-nav right', 'infobox', 'box zpravy', 's-clanky']}),
        dict(id=['path', 'article-tools', 'discussionList',
                 'similarItems', 'promo-box'])
    ]
PK�X�0�poetrymagazine.png�PNG


IHDR  szz�	pHYsww��)��IDATX���q�0�2'�A� t`u`��T�J�; �t@: �
�O��B.�B�/0�^�~������q��w~�`5������Ѫ�W_!��=��/���
@�P��)^s�"�D��>�2��B09�lH�6���@o�����&!�q��τ�4Z�I]`�*�V1��L��q��T�E"	��G*s���gT#{�U���"�lz
2"ؤew�� )��rOm�m�MI��pw8*�Mr�tW*�ʼ�����qq���픑��+{5Z�&aAg��V��
�ޯ�ֳ�*5����+�V�m�+.4S�U6�-���qJ)�<5
�I�&��x��u=�)㢦U1.�E8�'b\䴧d\�]vC�C�E��2.�����}���6�
쀗Cv.�
�3.�)���� *�x2�7�Q���V�,�x~�Q����>�IEND�B`�PK�X��drZZpoetrymagazine.recipeimport re
from collections import OrderedDict
from urllib.parse import urlparse

from calibre.web.feeds.news import BasicNewsRecipe

_issue_url = ""

COMMA_SEP_RE = re.compile(r"\s*,\s*")
SPACE_SEP_RE = re.compile(r"\s+")
NON_NUMERIC_RE = re.compile(r"[^\d]+")


class Poetry(BasicNewsRecipe):
    title = "Poetry Magazine"
    __author__ = "ping"
    description = (
        "Founded in Chicago by Harriet Monroe in 1912, Poetry is the oldest monthly "
        "devoted to verse in the English-speaking world. https://www.poetryfoundation.org/poetrymagazine"
    )
    publication_type = "magazine"
    language = "en"
    encoding = "utf-8"
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = False
    ignore_duplicate_articles = {"url"}
    compress_news_images = False

    remove_attributes = ["style", "font"]
    keep_only_tags = [dict(name="article")]

    remove_tags = [
        dict(name="button"),
        dict(
            attrs={
                "class": [
                    "c-socialBlocks",
                    "c-index",
                    "o-stereo",
                    "u-hideAboveSmall",
                    "c-slideTrigger",
                    "js-slideshow",
                ]
            }
        ),
    ]

    extra_css = """
    h1 { font-size: 1.8rem; margin-bottom: 0.5rem; }
    .o-titleBar-summary { font-size: 1.2rem; font-style: italic; margin-bottom: 1rem; }
    div.o-titleBar-meta, div.c-feature-sub { font-weight: bold; color: #444; margin-bottom: 1.5rem; }
    div.pcms_media img, div.o-mediaEnclosure img { max-width: 100%; height: auto; }
    div.o-mediaEnclosure .o-mediaEnclosure-metadata { font-size: 0.8rem; margin-top: 0.2rem; }
    div.c-feature-bd { margin-bottom: 2rem; }
    div.c-auxContent { color: #222; font-size: 0.85rem; margin-top: 2rem; }
    """

    def extract_from_img_srcset(self, srcset: str, max_width=0):
        sources = [s.strip() for s in COMMA_SEP_RE.split(srcset) if s.strip()]
        if len(sources) == 1:
            # just a regular img url probably
            return sources[0]
        parsed_sources = []
        for src in sources:
            src_n_width = [s.strip() for s in SPACE_SEP_RE.split(src) if s.strip()]
            if len(src_n_width) != 2:
                raise ValueError(f"Not a valid srcset: {srcset}")
            parsed_sources.append(
                (
                    src_n_width[0].strip(),
                    int(NON_NUMERIC_RE.sub("", src_n_width[1].strip())),
                )
            )
        parsed_sources = list(set(parsed_sources))
        parsed_sources = sorted(parsed_sources, key=lambda x: x[1], reverse=True)
        if not max_width:
            return parsed_sources[0][0]
        for img, width in parsed_sources:
            if width <= max_width:
                return img
        return parsed_sources[-1][0]

    def preprocess_html(self, soup):
        for img in soup.select("div.o-mediaEnclosure img"):
            if not img.get("srcset"):
                continue
            img["src"] = self.extract_from_img_srcset(img["srcset"], max_width=1000)
        return soup

    def parse_index(self):
        if _issue_url:
            soup = self.index_to_soup(_issue_url)
        else:
            soup = self.index_to_soup("https://www.poetryfoundation.org/poetrymagazine")
            current_issue = soup.select("div.c-cover-media a")
            if not current_issue:
                self.abort_recipe_processing("Unable to find latest issue")
            current_issue = current_issue[0]
            soup = self.index_to_soup(current_issue["href"])

        issue_edition = self.tag_to_string(soup.find("h1"))
        self.timefmt = f" [{issue_edition}]"
        cover_image = soup.select("div.c-issueBillboard-cover-media img")[0]
        parsed_cover_url = urlparse(
            cover_image["srcset"].split(",")[-1].strip().split(" ")[0]
        )
        self.cover_url = f"{parsed_cover_url.scheme}://{parsed_cover_url.netloc}{parsed_cover_url.path}"

        sectioned_feeds = OrderedDict()

        tabs = soup.find_all("div", attrs={"class": "c-tier_tabbed"})
        for tab in tabs:
            tab_title = tab.find("div", attrs={"class": "c-tier-tab"})
            tab_content = tab.find("div", attrs={"class": "c-tier-content"})
            if not (tab_title and tab_content):
                continue
            tab_title = self.tag_to_string(tab_title)
            sectioned_feeds[tab_title] = []
            for li in tab_content.select("ul.o-blocks > li"):
                author = self.tag_to_string(
                    li.find("span", attrs={"class": "c-txt_attribution"})
                )
                for link in li.find_all("a", attrs={"class": "c-txt_abstract"}):
                    self.log("Found article:", self.tag_to_string(link))
                    sectioned_feeds[tab_title].append(
                        {
                            "title": self.tag_to_string(link),
                            "url": link["href"],
                            "author": author,
                            "description": author,
                        }
                    )

        return sectioned_feeds.items()
PK�X�w�pppolitico.png�PNG


IHDR��h67IDATx�cy��9)��e%ʼnT���K����C��2�>l��03���tk#���
��A5���H�I��))��{�ˡ#O��;����P4���V�&�?тܿ?�hh��}��%��+�P5�l�[�������C 2�Ӷ�/]�)@h�Sv?;;D���+��L��.B�_��j��N�};gޯ;w�l��,*�T�φ�'N�8s�0)I��2+������ڒ�ݍI���ȐYT"��I@##��Wh0��,��$����?u8��/��� �����Ԇ��l@$
��n�U�6`z�/���ȶ.Р�{IEND�B`�PK�X'��A��politico.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
politico.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Politico(BasicNewsRecipe):

    title = 'Politico'
    __author__ = 'Darko Miletic and Sujata Raman'
    description = 'Political news from USA'
    publisher = 'Capitol News Company, LLC'
    category = 'news, politics, USA'
    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    encoding = 'UTF-8'
    language = 'en'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher, '--ignore-tables'
    ]

    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + \
        description + '"\ntags="' + category + '"\nlinearize_tables=True'

    keep_only_tags = [
        dict(name=['article']),
    ]

    remove_tags = [
        dict(name=['notags', 'embed', 'aside', 'object', 'link', 'img', 'figure', 'svg', 'button']),
        dict(
            attrs={'class': lambda x: x and 'story-tools' in x.split()}),
        dict(
            attrs={'class': lambda x: x and 'story-continued' in x.split()}),
        dict(
            attrs={'class': lambda x: x and 'story-supplement' in x.split()}),
        dict(
            attrs={'class': lambda x: x and 'story-share' in x.split()}),
        dict(
            attrs={'class': lambda x: x and 'suggested' in x.split()}),
    ]

    extra_css = '''
                body{font-family:Arial,Sans-serif;}
                element.style{color:#FF0000;font-family:Arial,Sans-serif;}
                .author{color:#808080;font-size:x-small;}
                a{ color:#003399;}
                .byline{color:#696969 ; font-size:x-small;}
                .story{color:#000000;}
                td{color:#000000;}
                '''

    feeds = [

    (u'Top Stories', u'http://www.politico.com/rss/politicopicks.xml'),
    (u'Congress', u'http://www.politico.com/rss/congress.xml'),
    (u'Ideas', u'http://www.politico.com/rss/ideas.xml'),
    (u'Life', u'http://www.politico.com/rss/life.xml'),
    (u'Lobbyists', u'http://www.politico.com/rss/lobbyists.xml'),
    (u'Pitboss', u'http://www.politico.com/rss/pitboss.xml'),
    (u'Politics', u'http://www.politico.com/rss/politics.xml'),
    (u'Roger Simon', u'http://www.politico.com/rss/rogersimon.xml'),
    (u'Suite Talk', u'http://www.politico.com/rss/suitetalk.xml'),
    (u'Playbook', u'http://www.politico.com/rss/playbook.xml')
    ]

    def preprocess_html(self, soup):
        mtag = '<meta http-equiv="Content-Language" content="en"/>'
        soup.head.insert(0, mtag)
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def postprocess_html(self, soup, first):

        for tag in soup.findAll(name=['table', 'tr', 'td']):
            tag.name = 'div'
        return soup
PK�XkE����politifact.png�PNG


IHDR  szz��IDATx����V�S�v��<#X��N2��z�um[j�v4�m��gۼ=g�ɺoQ�|�?���s���Ǘ��-�����6P����Ě���Uۥ�7$�o�$&n���c�jIMF���h�ZZ������z��
���#��w�}�up�&IX�^�N�1�h퍃��z\�و<cш
2khY��z�$��WP��n��p�r��$�P&���զ�����՝+�?E��d#Bf��R�W�@�k��r�k�pa�o���^l��� ��w��?���}8�!�s`桻l��H�i��gA��J��ae��9�d#��f���2���5��Q�B��ip�vδ�� ��"��˶�����
s����sQ�LD�,}��+����G囲U����1�KY�ާu�1��M��@��x�Z��W�_�0B�>ܩ*�+��2N�൶oHp��_Hн�Ļ���$e�E�9�Q��:�@��1���	��̅}to�~�u�OQ����3��c������äD�[s�
9��3*�~�c�zn3@ko��y�ԓ��m���u!o��F�^�{�޴a���MW�}�"	�N�e�9��Wvc�k�>@��do#��=�b;O�~(L���畒ѾE�c[(*�ϨҐܡ�nN1��@��a�uL@��P�e$&�R�T�"jb��L�cԴV��+�y�hŮmfxӓwgo>��m�zo���ן��e���n��(�܈r���CKIV���\)�����Z膓�ӌ�Vjg�ؠ����g~����.'�C�߼=+�7�򡭖��@�ſ7x�� PM�J���\�J�?&����b3j0�8"��xoV��ϩ%�TTR��*��\T�u氾[SL-����'p�g�Kh�~���Y�x{XiUx��U����j�p��p����:�9�C�{>|7�[��k���{F�4"�^�WA��_�7#>f����a"0�����?
����h����r��`-wF�o��Is����-F�W��;�0mZ5\uj��@s�֜e��|��W�&)�"O�ZU:;�Hwu.�on���'v`b�v(8�:܆] ��o�Y�0��b��[W�11zG��x�b�XIEND�B`�PK�X�ě}~~politifact.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class PolitiFactCom(BasicNewsRecipe):
    title = u'Politifact'
    __author__ = u'Michael Heinz'
    oldest_article = 21
    max_articles_per_feed = 100
    language = 'en'

    no_stylesheets = True

    publication_type = 'magazine'
    masthead_url = 'http://static.politifact.com.s3.amazonaws.com/images/politifactdotcom-flag-fff_01.png'
    cover_url = 'http://static.politifact.com.s3.amazonaws.com/images/politifactdotcom-flag-fff_01.png'

    remove_tags = [
        dict(name='div', attrs={'class': 'pfstoryarchive'}),
        dict(name='div', attrs={'class': 'pfhead'}),
        dict(name='div', attrs={'class': 'boxmid'}),
    ]

    keep_only_tags = [dict(name='div', attrs={'class': 'pfcontentleft'})]
    feeds = [
        (u'Articles', u'http://www.politifact.com/feeds/articles/truth-o-meter/'),
        (u'Obamameter', u'http://politifact.com/feeds/updates/'),
        (u'Statements', u'http://www.politifact.com/feeds/statements/truth-o-meter/')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.set_handle_gzip(True)
        return br
PK�Xg�r^��politika.png�PNG


IHDR��h6[IDATx�c���?���?���jkՔ���%��HY^H��5�**��:�Z�5���I�ax;��xr����c"�\�4���HN��ԡ�94IEND�B`�PK�XK�qioopolitika.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2013, Darko Miletic <darko.miletic at gmail.com>'
'''
politika.rs
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe


class Politika(BasicNewsRecipe):
    title = 'Politika Online'
    __author__ = 'Darko Miletic'
    description = 'Najstariji dnevni list na Balkanu'
    publisher = 'Politika novine i Magazini d.o.o'
    category = 'news, politics, Serbia'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    delay = 1
    language = 'sr'
    publication_type = 'newspaper'
    masthead_url = 'http://static.politika.co.rs/images_new/politika2.gif'
    extra_css             = """
                               @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                               @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                               body{font-family: Arial,Helvetica,sans1,sans-serif}
                               h1{font-family: "Times New Roman",Times,serif1,serif}
                               .articledescription{font-family: sans1, sans-serif}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [
        dict(name='div', attrs={'class': 'big_article_home item_details'})]
    remove_tags_after = dict(attrs={'class': 'online_date'})
    remove_tags = [dict(name=['link', 'meta', 'iframe', 'embed', 'object'])]

    feeds = [

    (u'Politika', u'http://www.politika.rs/rubrike/Politika/index.1.lt.xml'),
    (u'Svet', u'http://www.politika.rs/rubrike/Svet/index.1.lt.xml'),
    (u'Ostali komentari', u'http://www.politika.rs/rubrike/ostali-komentari/index.1.lt.xml'),
    (u'Pogledi', u'http://www.politika.rs/pogledi/index.lt.xml'),
    (u'Pogledi sa strane', u'http://www.politika.rs/rubrike/Pogledi-sa-strane/index.1.lt.xml'),
    (u'Tema dana', u'http://www.politika.rs/rubrike/tema-dana/index.1.lt.xml'),
    (u'Kultura', u'http://www.politika.rs/rubrike/Kultura/index.1.lt.xml'),
    (u'Spektar', u'http://www.politika.rs/rubrike/zivot-i-stil/index.1.lt.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll('a', attrs={'class': 'category'}):
            item.name = 'span'
            item['href'] = item['title'] = ''
            del item['href']
            del item['title']
        return soup

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.politika.rs/')
        coverlink = soup.find('a', attrs={'class': 'home_print_img'})
        if coverlink:
            return coverlink['href']
        return None
PK�X������politiken_dk.png�PNG


IHDR�a�IDATx�c��b�U��Oꀘ�Q
 �  fa0�z/!a>�B�H�~t����%1~�|ܷ��@���7�v@�: �g� ?��=��+b�b㒂½_���1i�xrL3�0����?Arx"��X0� R"���a7/3մIEND�B`�PK�X��!!politiken_dk.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
politiken.dk
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Politiken_dk(BasicNewsRecipe):
    title = 'Politiken.dk'
    __author__ = 'Darko Miletic'
    description = 'News from Denmark'
    publisher = 'politiken.dk'
    category = 'news, politics, Denmark'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    use_embedded_content = False
    encoding = 'cp1252'
    language = 'da'

    extra_css = (' body{font-family: Arial,Helvetica,sans-serif } '
                 'h1{font-family: Georgia,"Times New Roman",Times,serif } ')

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    feeds = [
        (u'Tophistorier', u'http://politiken.dk/rss/tophistorier.rss'),
        (u'Seneste nyt', u'http://politiken.dk/rss/senestenyt.rss'),
        (u'Mest laeste', u'http://politiken.dk/rss/mestlaeste.rss'),
        (u'Danmark', u'http://politiken.dk/rss/indland.rss'),
        (u'Politik', u'http://politiken.dk/rss/politik.rss'),
        (u'Klima', u'http://politiken.dk/rss/klima.rss'),
        (u'Internationalt', u'http://politiken.dk/rss/udland.rss'),
        (u'Erhverv', u'http://politiken.dk/rss/erhverv.rss'),
        (u'Kultur', u'http://politiken.dk/rss/kultur.rss'),
        (u'Sport', u'http://politiken.dk/rss/sport.rss'),
        (u'Uddannelse', u'http://politiken.dk/rss/uddannelse.rss'),
    ]
    remove_tags_before = dict(name='h1')
    remove_tags = [
        dict(name=['object', 'link']), dict(
            name='div', attrs={'class': 'footer'})
    ]

    def print_version(self, url):
        return url + '?service=print'
PK�X���]��politiko_dk.png�PNG


IHDR(-S9PLTE,55DKJ71`jooB.�K*����P(����������]"����������l�p����AAGIDATӭ�9�@͝]B���@��rd˖����3�C�#`*�{�P��0=+R?��m�ڱ�&�m�/��aYwD��IEND�B`�PK�XZ5__politiko_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Politiko.dk
'''


class PolitikoDK(BasicNewsRecipe):
    title                 = 'Politiko | Berlingskes politiske site'
    __author__            = 'CoderAllan.github.com'
    publisher             = 'Berlingske Media'
    description           = ('Læs de seneste nyheder om dansk politik. På Politiko får du alt om'
                             ' politik samlet et sted - Politiko.dk')
    category              = 'news, politics, money, Denmark'
    oldest_article        = 2
    max_articles_per_feed = 50
    no_stylesheets        = True
    encoding              = 'utf8'
    use_embedded_content  = False
    language              = 'da'
    auto_cleanup          = False

    keep_only_tags = [
        dict(name="h1", attrs={'class': 'article-headline'}),
        dict(name="p", attrs={'class': 'article-summary'}),
        dict(name="div", attrs={'class': 'article-date'}),
        dict(name="div", attrs={'class': 'article-content'}),
    ]

    # Feed are found here: http://www.b.dk/rss
    feeds          = [
        ('Nyheder', 'http://www.politiko.dk/feeds/rss/nyheder'),
        ('Politisk Morgenpost', 'http://www.politiko.dk/taxonomy_rss/329960/rss'),
        ('Den Politiske Puls', 'http://puls.politiko.dk/feed/'),
        ('Analyse og perspektiv', 'http://www.politiko.dk/feeds/rss/analyser'),
        ('Longreads', 'http://www.politiko.dk/feeds/rss/longreads'),
    ]
PK�X��ů�polityka.png�PNG


IHDR���R!PLTE����������������������fw�3���*tRNS@��f<IDATx�c`�Z���³��傆^��D+C�X�d*B�
΂JAM�d�@e��`i&�kU�IEND�B`�PK�Xz�uo�	�	polityka.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2010, matek09, matek09@gmail.com'

from calibre.web.feeds.news import BasicNewsRecipe


class Polityka(BasicNewsRecipe):

    title = u'Polityka'
    __author__ = 'matek09'
    description = 'Weekly magazine. Last archive issue'
    encoding = 'utf-8'
    no_stylesheets = True
    language = 'pl'
    remove_javascript = True

    remove_tags_before = dict(dict(name='h2', attrs={'class': 'box_nag'}))
    remove_tags_after = dict(dict(name='div', attrs={'class': 'box_footer'}))

    remove_tags = []
    remove_tags.append(dict(name='h2', attrs={'class': 'box_nag'}))
    remove_tags.append(dict(name='div', attrs={'class': 'box_footer'}))

    extra_css = '''
                    h1 {font-size: x-large; font-weight: bold}
                    '''

    def parse_index(self):
        soup = self.index_to_soup('http://archiwum.polityka.pl/')
        box_img3 = soup.findAll(attrs={'class': 'box_img3'})
        feeds = []
        last = 0
        self.cover_url = 'http://archiwum.polityka.pl' + \
            box_img3[-1].find('img')['src']
        last_edition = 'http://archiwum.polityka.pl' + \
            box_img3[-1].find('a')['href']

        while True:
            index = self.index_to_soup(last_edition)

            box_list = index.findAll('div', attrs={'class': 'box_list'})
            if len(box_list) == 0:
                break

            articles = {}
            for box in box_list:
                for div in box.findAll('div', attrs={'class': 'list_tresc'}):
                    article_page = self.index_to_soup(
                        'http://archiwum.polityka.pl' + div.a['href'],)
                    section = self.tag_to_string(article_page.find(
                        'h2', attrs={'class': 'box_nag'})).split('/')[0].lstrip().rstrip()
                    if section not in articles:
                        articles[section] = []
                    articles[section].append({
                        'title': self.tag_to_string(div.a),
                        'url': 'http://archiwum.polityka.pl' + div.a['href'],
                        'date': '',
                        'description': ''
                    })

            for section in articles:
                feeds.append((section, articles[section]))

            last_edition = last_edition.replace('http://archiwum.polityka.pl/wydanie/' + str(
                last), 'http://archiwum.polityka.pl/wydanie/' + str(last + 1))
            last = last + 1

        return feeds
PK�X��=�ffpolizeipress_de.png�PNG


IHDR�a-IDATx��P3Cna���U�m���oҖ�l[ߒmc�v�>����Z{�G?4M�W�#�7�������P8=;DZ�g�����$ys�q����! �q����Arj�FN^:��#8�hh,�fE��߯�x����!j�J06>{�?�����O�������aN��)������8�}У����<��3㰴��������n�k�m
`h�� ��tG_��+	w������c��X/�آ���^6#2�$�n�"IE�,�ЯE���1D���{�Ki��d��t]�IEND�B`�PK�X�����polizeipress_de.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe(BasicNewsRecipe):

    title = u'Polizeipresse - Deutschland'
    __author__ = 'schuster'
    description = 'Tagesaktuelle "Polizeiberichte" aus ganz Deutschland (bis auf Ortsebene).' 'Um deinen Ort/Stadt/Kreis usw. einzubinden, gehe auf "http://www.presseportal.de/polizeipresse/" und suche im oberen "Suchfeld" nach dem Namen.'   'Oberhalb der Suchergebnisse (Folgen:) auf den üblichen link zu den RSS-Feeds klicken und den RSS-link im Rezept unter "feeds" eintragen wie üblich.'   'Die Auswahl von Orten kann vereinfacht werden wenn man den Suchbegriff wie folgt eingibt:' '"Stadt-Ort".'  # noqa
    oldest_article = 21
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'de'
    remove_javascript = True
    masthead_url = 'http://www.alt-heliservice.de/images/34_BPOL_Logo_4C_g_schutzbereich.jpg'
    cover_url = 'http://berlinstadtservice.de/buerger/Bundespolizei-Logo.png'

    remove_tags = [
        dict(name='div', attrs={'id': 'logo'}),
        dict(name='div', attrs={'id': 'origin'}),
        dict(name='pre', attrs={'class': 'xml_contact'})]

    def print_version(self, url):
        segments = url.split('/')
        printURL = 'http://www.presseportal.de/print.htx?nr=' + \
            '/'.join(segments[5:6]) + '&type=polizei'
        return printURL

    feeds = [(u'Frimmerdorf', u'http://www.presseportal.de/rss/rss2_vts.htx?q=Grevenbroich-frimmersdorf&w=public_service'),
             (u'Neurath', u'http://www.presseportal.de/rss/rss2_vts.htx?q=Grevenbroich-neurath&w=public_service'),
             (u'Gustorf', u'http://www.presseportal.de/rss/rss2_vts.htx?q=Grevenbroich-gustorf&w=public_service'),
             (u'Neuenhausen', u'http://www.presseportal.de/rss/rss2_vts.htx?q=Grevenbroich-neuenhausen&w=public_service'),
             (u'Wevelinghoven', u'http://www.presseportal.de/rss/rss2_vts.htx?q=Grevenbroich-Wevelinghoven&w=public_service'),
             (u'Grevenbroich ges.',
              u'http://www.presseportal.de/rss/rss2_vts.htx?q=grevenbroich&w=public_service'),
             (u'Kreis Neuss ges.',
              u'http://www.presseportal.de/rss/rss2_vts.htx?q=Rhein-Kreis+Neuss&w=public_service'),
             ]
PK�Xk��::
polter_pl.png�PNG


IHDR(-S PLTE�����������������������������ƽ�������������������{��{���syssussuksuckmckickmkcaZceRciRkqRkmJkmBkqBcmBciBceBZeBZaBZ]BZYBRYBRY9Z]9Za9ce9cm9suJsyJs}J{�J{�J��R��R��R��Z��Z��Z��R��Z��c��c��c��c��c��k��k��k��k��k��s��s��sRU1JQ1JM1JQ)BM)BI)BE)9A)18!14!10!)0),!(!$!$����tRNS@��f�IDATx�1O�@����]���&��,���a��`��D8��iW��	9[:�f}����a�ϭ\?��n�G���.8k7cZ��^%S��{YMQ�Z#e����\LC��R��ρ���٤v�W�����W�oT�M��^B��(1R�G�u��1��;���������/��Cx���`�^Ng����F�kr(�IEND�B`�PK�XU��~VVpolter_pl.recipe__license__ = 'GPL v3'
import re
from calibre.web.feeds.news import BasicNewsRecipe


class Polter(BasicNewsRecipe):
    title = u'Polter.pl'
    __author__ = 'fenuks'
    description = u'Największy polski serwis poświęcony ogólno pojętej fantastyce - grom fabularnym (RPG), książkom, filmowi, komiksowi, grom planszowym, karcianym i bitewnym.'  # noqa
    category = 'fantasy, books, rpg, games'
    language = 'pl'
    extra_css = '.image, .floatright {float: right; margin-left: 10px;} .floatleft {float: left; margin-right: 10px;} .calibre_navbar {clear: both;} .p_title {font-weight: bold;} .p_image {margin-left: auto; margin-right: auto; display: block;} .italic {font-style: italic;}'  # noqa
    cover_url = 'http://static.polter.pl/sub/promo/bpromo2524.jpg'
    use_embedded_content = False
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    remove_javascript = True
    remove_attributes = ['font', 'fieldset', 'onclick']
    ignore_duplicate_articles = {'title', 'url'}

    keep_only_tags = [dict(attrs={'class': 'boxcontent'})]
    remove_tags = [dict(id='komentarze'),
        dict(name='div',attrs={'class':'ostatnieArtykuly'})]
    remove_tags_after = dict(id='komentarze')

    feeds = [
    (u'Wieści', 'http://polter.pl/wiesci,rss.html'),
    (u'RPG', 'http://rpg.polter.pl/wiesci,rss.html'),
    (u'Książki', 'http://ksiazki.polter.pl/wiesci,rss.html'),
    (u'Film', 'http://film.polter.pl/wiesci,rss.html'),
    (u'Komiks', 'http://komiks.polter.pl/wiesci,rss.html'),
    (u'Gry bitewne', 'http://bitewniaki.polter.pl/wiesci,rss.html'),

    (u'Gry karciane', 'http://karcianki.polter.pl/wiesci,rss.html'),
    (u'Gry planszowe', 'http://planszowki.polter.pl/wiesci,rss.html'),
    (u'Gry PC', 'http://gry.polter.pl/wiesci,rss.html'),
    (u'Gry konsolowe', 'http://konsole.polter.pl/wiesci,rss.html'),
    (u'Konwenty', 'http://konwenty.polter.pl/wiesci,rss.html')]

    def preprocess_html(self, soup):
        for s in soup.findAll(attrs={'style': re.compile('float: ?left')}):
            s['class'] = 'floatleft'
        for s in soup.findAll(attrs={'style': re.compile('float: ?right')}):
            s['class'] = 'floatright'
        for s in soup.findAll(style=True):
            if 'bold;' in s['style']:
                if s.get('class', ''):
                    s['class'] = ''.join(s['class']) + ' p_title'
                else:
                    s['class'] = 'p_title'
            if 'italic;' in s['style']:
                if s.get('class', ''):
                    s['class'] = ''.join(s['class']) + ' italic'
                else:
                    s['class'] = 'italic'
            del s['style']

        tag = soup.find(id='twoja_ocena')
        if tag:
            tag.parent.extract()
        for tag in soup.findAll(id='lista_chce_ile'):
            tag.parent.parent.extract()
        for r in soup.findAll(name='a', href=re.compile(r'^http://www.ceneo.pl/')):
            r.extract()
        return soup

    def preprocess_raw_html(self, raw_html, url):
        return raw_html.replace('<br /><br /><h3>Czytaj również</h3>', '')
PK�X�Y��popscience.png�PNG


IHDR���-PLTE������������������������px�`e�SX�6?�'1�"�.�`�IDATx�Mυ Dя%�����Ý�2t���l����|4�@}N��{]ao��!�X�dfp���y��š�
:P��y��
CvlW`!;�o�k\B�)�������L���w��:����^����+��IEND�B`�PK�X��SSpopscience.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2020, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals

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 AdvancedUserRecipe1282101454(BasicNewsRecipe):
    title = 'Popular Science'
    language = 'en'
    __author__ = 'Kovid Goyal'
    description = 'Popular Science'
    publisher = 'Popular Science'
    max_articles_per_feed = 100
    ignore_duplicate_articles = {'url'}
    no_stylesheets = True
    keep_only_tags = [
        classes('Article-header Article-excerpt Article-author Article-thumbnail Article-bodyText'),
    ]

    def parse_section_index(self, slug):
        url = 'https://www.popsci.com/{}/'.format(slug)
        self.log('Section:', url)
        soup = self.index_to_soup(url)
        main = soup.find(**classes('PostsContainer'))
        for div in main.findAll(**classes('PostItem')):
            a = div.find('a', href=True, **classes('PostItem-link'))
            url = a['href']
            title = self.tag_to_string(div.find(**classes('PostItem-title')))
            desc = ''
            dek = div.find(**classes('PostItem-excerpt'))
            if dek is not None:
                desc = self.tag_to_string(dek)
            self.log(' ', title, url)
            yield {'title': title, 'url': url, 'description': desc}

    def parse_index(self):
        sections = []
        for slug, title in {
            'science': 'Science',
            'technology': 'Technology',
            'diy': 'DIY',
            'reviews': 'Reviews',
        }.items():
            articles = list(self.parse_section_index(slug))
            if articles:
                sections.append((title, articles))
        return sections

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-medsrc': True}):
            img['src'] = img['data-medsrc']
        return soup
PK�X�Gyportafolio.png�PNG


IHDR  D���TPLTE���3�����7����Ѓ�������������ܨ�؎��\��H��A���������������ߡ��~��x��i��T��O��;���=
�oIDATx���51P��a��=���]`��E�E���]hQ�����p�d/�d�ZQ���pj�༺�nŃ�g+R��~�'
a`��k�O3yg�|�������2"IEND�B`�PK�X��i�portafolio.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1311799898(BasicNewsRecipe):
    title = u'Periódico Portafolio Colombia'
    __author__ = 'BIGO-CAVA'
    language = 'es_CO'
    cover_url = 'http://www.portafolio.co/sites/portafolio.co/themes/portafolio_2011/logo.png'
    remove_tags_before = dict(id='contenidoArt')
    remove_tags_after = [dict(name='div', attrs={'class': 'articulo-mas'})]
    keep_only_tags = [dict(name='div', id='contenidoArt')]
    oldest_article = 2
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    masthead_url = 'http://www.portafolio.co/sites/portafolio.co/themes/portafolio_2011/logo.png'
    publication_type = 'newspaper'

    extra_css             = """
                               p{text-align: justify; font-size: 100%}
                               body{ text-align: left; font-size:100% }
                               h1{font-family: sans-serif; font-size:150%; font-weight:bold; text-align: justify; }
                               h3{font-family: sans-serif; font-size:100%; font-style: italic; text-align: justify; }
                                 """

    feeds = [(u'Negocios', u'http://www.portafolio.co/negocios/feed'),
             (u'Economia', u'http://www.portafolio.co/economia/feed'),
             (u'Internacional', u'http://www.portafolio.co/internacional/feed'),
             (u'Indicadores', u'http://www.portafolio.co/indicadores/feed'),
             (u'Opinion', u'http://www.portafolio.co/opinion/feed'),
             (u'Finanzas Personales',
              u'http://www.portafolio.co/finanzas-personales/feed'),
             (u'Herramientas', u'http://www.portafolio.co/herramientas/feed')]
PK�XH��G��
portfolio.png�PNG


IHDR:���uIDATx�U�A!C�H@BKh	H@�Hh	H@���	��{�Yz�!�Wx<���Ә����	��H�|:�&Lǵ2���@�7l�2�c%�t��!���*��kRw�b�^����֧AM�[bIEND�B`�PK�X�yGGportfolio.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
portfolio.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Portfolio(BasicNewsRecipe):

    title = 'Portfolio'
    __author__ = 'JTravers'
    description = 'Conde Nast Portfolio: For the businessman.'
    language = 'en'

    use_embedded_content = True
    timefmt = ' [%a, %b %d, %Y]'
    html2lrf_options = ['--ignore-tables']

    feeds = [
        ('Business Travel', 'http://feeds.portfolio.com/portfolio/businesstravel'),
        ('Careers', 'http://feeds.portfolio.com/portfolio/careers'),
        ('Culture and Lifestyle',
         'http://feeds.portfolio.com/portfolio/cultureandlifestyle'),
        ('Executives', 'http://feeds.portfolio.com/portfolio/executives'),
        ('News and Markets', 'http://feeds.portfolio.com/portfolio/news'),
        ('Business Spin', 'http://feeds.portfolio.com/portfolio/businessspin'),
        ('Capital', 'http://feeds.portfolio.com/portfolio/capital'),
        ('Daily Brief', 'http://feeds.portfolio.com/portfolio/dailybrief'),
        ('Market Movers', 'http://feeds.portfolio.com/portfolio/marketmovers'),
        ('Mixed Media', 'http://feeds.portfolio.com/portfolio/mixedmedia'),
        ('Odd Numbers', 'http://feeds.portfolio.com/portfolio/oddnumbers'),
        ('Playbook', 'http://feeds.portfolio.com/portfolio/playbook'),
        ('Tech Observer', 'http://feeds.portfolio.com/portfolio/thetechobserver'),
        ('World According to ...',
         'http://feeds.portfolio.com/portfolio/theworldaccordingto'),
    ]
PK�X&��KKportfolio_hu.png�PNG


IHDR  D����PLTE�T�T�T�T�S�T�T�U�T�U�R�W�Q�W�U�U�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�S�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�U�T�S�R�S�`	��J��J��H�_��I��I��!��'��5�^�l��=��&��<�a
��!��=��7��;�i��%�~����*�x��(�q��,��%��:�b
�w��.��<��7��"��"�y�|��>��#�z�c��;��$��-��8�m�p��?�m��9��I��)��H�x�hZ�\tRNS-|����Ϭy,?��ۘ:���=��6H��@�5û���9�.�j��{k8��;�3D����7l���IDATxڄRs�qMN�q�Q㸵ݿ�^�[۶��◬���^(w�ܵ{����޾��A�"��ݣc�;�%[pbrJ����,�FG���\��}�q=���up�0v�
8w�)��7Rō9NcZ�t����d��_����3��?f���������a����;)�}K'����t�0�H1yN�|�7�HR���%��E�}�!8s��=\%0��(e���;˭��@�3�GxxhV�����V�h)��Z�G!8ɏ�I>�$w����2?�\�n�K��R�ȭ��de�A�[=8L�
�ˇ��C�Z>Yw�cp|7���e\���_G-#+�&XX�K�_���)��x:�^�k�96�2KTUQT�iy�M�9`�-RT��=@W�/� i�`&X��cT	A�zV���(��79�Z�b����(I	q'	Wyw�h�8�n1�vP�]IEND�B`�PK�X!�CK..portfolio_hu.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1348063712(BasicNewsRecipe):
    title = u'Portfolio.hu - English Edition'
    __author__ = 'laca'
    oldest_article = 7
    language = 'en_HU'
    masthead_url = 'http://www.portfolio.hu/img/sit/angolfejlec2010.jpg'
    use_embedded_content = False
    auto_cleanup = True
    encoding = 'cp1252'

    author = 'laca'
    simultaneous_downloads = 1
    max_articles_per_feed = 50

    no_stylesheets = True

    feeds = [(u'Equity news', u'http://www.portfolio.hu/en/rss/cikk/equity.xml'),
             (u'Economy news', u'http://www.portfolio.hu/en/rss/cikkek/economy.xml'),
             (u'FX&Fixed Income news', u'http://www.portfolio.hu/en/rss/cikkek/fx.xml'),
             (u'Tax news', u'http://www.portfolio.hu/en/rss/cikkek/tax.xml'),
             (u'Energy news', u'http://www.portfolio.hu/en/rss/cikkek/energy.xml'),
             (u'Corpfin news', u'http://www.portfolio.hu/en/rss/cikkek/corpfin.xml'),
             (u'MNB news', u'http://www.portfolio.hu/en/rss/cikkek/mnb.xml')]
PK�Xr�Rxportfolio_hu_hu.png�PNG


IHDR  D����PLTE�����������������������������������������������������������������������Ϲ�Ϲ�ʱ�ȯ�ƫ�ǭ�ç�¥�ç�����������������������������������y��u��s��g��c��e��[��Y��U��O��I��G��E��E�C�C�|?�x9�w7�r/�n)�l'�g�c�a�a�`�]�[
�[
�Y�[
�X	�W�W�U�U�S�T�S�R�S�T��6��7��9��9��:��=��A��C��D��E��E��F��F��G��G��H��%��&��'��)��+��,��.��.��1��2��3��5�q�s�x�z�{�|����������!��"��#�S�T�U�W�X�Z�]�_�_	�`	�a
�d�g
�h�S�-��_tRNS	
$*+578:>EEMPSSWYY^`aagkquy������������������������������������������as���IDATxڄ�s4AE�3c۶m۶�6�e��ߛ�7FUN�ͽg��ėO�DBAyUeY�?BV�_7�I�e�$ڙ=�eo��PH��c��_Ș�%E�焄)R����~���e�?����T5^耳��9��g.��u,�(D#5�ȑ�Ck
�l#���/��X�����s�p���W$�{����t�7�A0�D\A����bAq:Ja����iH(��(��#!&�V�+_q��	?�a�N��Vj��+�
��	��A�K]��砙ghn�+i |;lb
%Փ]�v�e�}�Ƶ��N�s)  Z�z���y_���*g�ܷ^R�~3�����[M��[㲰���:zΒ�
CH�aɛ�n cb���DP�&���+(�Ŋ��	T�E��2�;IEND�B`�PK�XB0��portfolio_hu_hu.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1348146838(BasicNewsRecipe):
    title = u'Portfolio.hu'
    __author__ = 'laca'
    oldest_article = 2
    language = 'hu'
    masthead_url = 'http://www.portfolio.hu/img/logo2010.gif'
    auto_cleanup = True

    author = 'laca'
    simultaneous_downloads = 1
    max_articles_per_feed = 50

    feeds = [(u'Makrogazdaság', u'http://www.portfolio.hu/rss/cikkek/makrogazdasag.xml'),
             (u'Vállalatok', u'http://www.portfolio.hu/rss/cikkek/vallalatok.xml'),
             (u'Tőzsdei hírek', u'http://www.portfolio.hu/rss/cikkek/tozsde.xml'),
             (u'Deviza/kötvény', u'http://www.portfolio.hu/rss/cikkek/penzkotveny.xml'),
             (u'Befektetési alapok', u'http://www.portfolio.hu/rss/cikkek/befalap.xml'),
             (u'Ingatlan', u'http://www.portfolio.hu/rss/cikkek/ingatlan.xml'),
             (u'Pénzcentrum', u'http://www.penzcentrum.hu/rss/all.xml')]
PK�X/OԖ�post_today.png�PNG


IHDR�a]IDATx���\A�_VAm�Nm�fP۶m[A��
��=���y��ζ���[ɀj�1C�R�QH�����*ȥ(�X,�F�����c޼�m7b���u�L�!/\)���ϟ�0b���R�?}��Vm�u돦m'�]���؋��]0�Z���5l{��hQL&S�p����~���|�����X�Ͳ(��E=v��q�l~-X�����o��������?�~������2{1��Q�D�<�1�"�]�ˌ��}�F\B�����rQ��cR�6�,F?n���v�&#ä���]̇�ϸ{�^	U�۱\���H�ؚ��-����]��mAf��
E��Y��sb�p�)�IEND�B`�PK�X�a�j	j	post_today.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1299061355(BasicNewsRecipe):
    title = u'Post Today'
    language = 'th'
    __author__ = "Chotechai P."
    oldest_article = 7
    max_articles_per_feed = 100
    cover_url = 'http://upload.wikimedia.org/wikipedia/th/2/2e/Posttoday_Logo.png'
    feeds = [
    (u'Breaking News', u'http://www.posttoday.com/rss/src/breakingnews.xml'),
    (u'\u0e02\u0e48\u0e32\u0e27', u'http://www.posttoday.com/rss/src/news.xml'),
    (u'\u0e27\u0e34\u0e40\u0e04\u0e23\u0e32\u0e30\u0e2b\u0e4c', u'http://www.posttoday.com/rss/src/analyse.xml'),
    (u'\u0e40\u0e21\u0e32\u0e17\u0e4c\u0e01\u0e31\u0e19\u0e43\u0e2b\u0e49 z', u'http://www.posttoday.com/rss/src/mouth.xml'),
    (u'\u0e44\u0e17\u0e22\u0e42\u0e0b\u0e44\u0e0b\u0e15\u0e35\u0e49', u'http://www.posttoday.com/rss/src/thaisociety.xml'),
    (u'\u0e44\u0e25\u0e1f\u0e4c\u0e2a\u0e44\u0e15\u0e25\u0e4c', u'http://www.posttoday.com/rss/src/lifestyle.xml'),
    (u'\u0e0a\u0e35\u0e49\u0e0a\u0e48\u0e2d\u0e07\u0e23\u0e27\u0e22', u'http://www.posttoday.com/rss/src/moneyguide.xml'),

    (u'\u0e1a\u0e49\u0e32\u0e19-\u0e04\u0e2d\u0e19\u0e42\u0e14', u'http://www.posttoday.com/rss/src/homecondo.xml'),
    (u'\u0e22\u0e32\u0e19\u0e22\u0e19\u0e15\u0e4c', u'http://www.posttoday.com/rss/src/motor.xml'),
    (u'\u0e14\u0e34\u0e08\u0e34\u0e15\u0e2d\u0e25\u0e44\u0e25\u0e1f\u0e4c', u'http://www.posttoday.com/rss/src/digitallife.xml'),
    (u'\u0e01\u0e35\u0e2c\u0e32', u'http://www.posttoday.com/rss/src/sport.xml'),
    (u'\u0e23\u0e2d\u0e1a\u0e42\u0e25\u0e01', u'http://www.posttoday.com/rss/src/world.xml'),
    (u'\u0e01\u0e34\u0e19-\u0e40\u0e17\u0e35\u0e48\u0e22\u0e27', u'http://www.posttoday.com/rss/src/eattravel.xml'),
    (u'Mind & Soul', u'http://www.posttoday.com/rss/src/mindsoul.xml'),
    (u'\u0e1a\u0e25\u0e47\u0e2d\u0e01 \u0e1a\u0e01.', u'http://www.posttoday.com/rss/src/blogs.xml')]
    keep_only_tags = []
    keep_only_tags.append(dict(name='div', attrs={'class':
                                                  'articleContents'}))

    remove_tags = []
    remove_tags.append(dict(name='label'))
    remove_tags.append(dict(name='span'))
    remove_tags.append(dict(name='div', attrs={'class':
                                               'socialBookmark'}))
    remove_tags.append(dict(name='div', attrs={'class':
                                               'misc'}))
PK�X�[�!!poughkeepsie_journal.png�PNG


IHDR  ��tRNSn���IDATxڝ�`]�څW���ص1��jj۶�i��'fO�F5�מ�mX�����{S�gm�}�o�O�[�	���*ÿ�`}K@�1�-�'2�"��o�B��Ƞ�|��Y�޺o��k<��x�����z�3Ȭ���W��Z_�ig6 ��E;�3Tp�ݽ�(!r�"[:�c��G�.��S�~���,[j��\�k^m�o�;�Q��:!4S=�xn5W=1U5�������o�"�J����X��џ�Oj��o�U
zeb� |	…��Z.�8ħ���ο7)@�#���m�a��:�m�91��xE�d��!w�s���Lj��M?j�h�E5}™I���x?Jwĉ��&�q��nxC#��U�Hmv��\X?��'��x�E�Q�M�1y�| �ߗ��d3�U������߇�Kz�u�W_���Ꙟy�����;Ԯ���+�y�����&hJw���՚�M�} �rBr�����G����QK]�6��
g�{~��Uw�����������,��#�sC��N�7^�����ۇ2���&o�^�����~uc�Vs,�^l^H�����.��f��{eT�(��\��g�zOU�W��QiqAg�j���3��F/O@����N#�Fj��"i�ѕ���b}CM����#x�o}n�_�Z�`jr�a/^��3��΄}Sn�1�>q�<Oޙ7�
�G����]4�Z�o(�3�y��=��P��Vo
:�G+���w���+�(�:p��O���À��E���ܔ�\Y���^7c#�d��@$��b�%�����)����~Z������{�]��٦HZR�m���p�9<d�+��Ua�Y���>�'m��Yf��JA줮D�/@�v.�'�f���7�iM�g*T>��Li{�9g/�����;y����|j������$Y�z�_����!R��I�_{1��O�`ܞ#x7~��D�X�y./�e3��؜͇Y��‡)|�ʦ<ވgMO�����<�Sϳ���4��`�r$����'�v���L�b���J�t:��~��f����kS��ʖs����j��������z��[��LKC�N/�$@Cv��u�ʕQL�EUo}2{E���rk�˯.({e��^k˭�1�tA�/l�ӛ
q?�}����42~����K�h��B߂����Z�ꋣJ{JBM�DA��⺾�G��p��rVo|��BF$��do��!�����N�	L1j�aX����&�&C5���jv%�20�8�c�T��İ���p�8���Q�����ID���}��ݛW���S�g���/��*��l�Q5��FJ�^��#U���x�A:���=�("��{o�б�+w!G,]�uE�qr��T��!��%}�Y}A�R>��YP7É�~�0�$�7�.P`��x�n���9�Ե�2�t�[���\��X�x-���ǽ�G�D�����aŒ=P�g�=��c�U�|+����L~Yо=�ڧ�ڭ/l�ĞsҰ�U)" ��#T򘽦�4�4#����ؐ$8�ȁD�WW*��+&el��pxa\��ȴ��.�_[}όYW,��*��Wd�I8\�5��=�
?�;!�H/�p'��=��S�~h����(}��~��u�����1��PP'��]u����Kvf#S�#��.1�'E���흙2�ۜ1��@:�,?�q��H�"%����g�M&�zoEa�D�<���)�okڟ{l��!cA������뜲y��^�貹�����5��̛�u�����P>�7�䐬*scԱ���X�݇V�D1M��P��'|yS[���;��S�Ads��a�����f���W����'6!��I^$�����Z��q��ڊ����K��F2Hj9����3���r�YB;XZZ�_J&���x�;szA*���oq^��U?IEND�B`�PK�X�����poughkeepsie_journal.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1291143841(BasicNewsRecipe):
    title = u'Poughkeepsie Journal'
    language = 'en'
    __author__ = 'weebl'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    timefmt = ' [%a, %d %b, %Y]'
    feeds = [(u'Local News', u'http://poughkeepsiejournal.com/apps/pbcs.dll/oversikt?Category=RSS01&mime=xml'),
             (u'Local Business', u'http://poughkeepsiejournal.com/apps/pbcs.dll/oversikt?Category=RSS02&mime=xml'),
             (u'Local Sports', u'http://poughkeepsiejournal.com/apps/pbcs.dll/oversikt?Category=RSS03&mime=xml'),
             (u'Life', u'http://poughkeepsiejournal.com/apps/pbcs.dll/oversikt?Category=RSS04&mime=xml')]
    remove_tags = [dict(name='img', attrs={'src': '/graphics/mastlogo.gif'})]

    def print_version(self, url):
        return url.replace('http://www.poughkeepsiejournal.com', 'http://www.poughkeepsiejournal.com/print')
PK�Xn���
ppe_pl.png�PNG


IHDR��h6WIDATxڕQ�Gq� �� 2f���1#�9�Hd��8�#� ��8#�� �H����ؿA"_���̖��9�����w������VK`���@l��m.��e~�;��|ti,P;���yz��cl"!���i,>#�PP>C����>�9���[�\ӂ��s7���v;�/rJ_�J`UT�T�RV����x��آ��W��Ҵ��쭲������|u�J4�eK�
M�H�k�C�[�p_$7T�c�/� �''��b�I�x�d�%��$��M!� �L����!�Oe�@��+�p��ѷ+8:])ޑ�/ ���]��Z1S�|��#9�˷�n�?A�IEND�B`�PK�X�OCC
ppe_pl.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
from calibre.web.feeds.news import BasicNewsRecipe


class ppeRecipe(BasicNewsRecipe):
    __author__ = u'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'
    title = u'ppe.pl'
    category = u'News'
    description = u'Portal o konsolach i grach wideo.'
    extra_css = '.categories > li {list-style: none; display: inline;} .galmini > li {list-style: none; float: left;} .calibre_navbar {clear: both;}'
    remove_empty_feeds = True
    no_stylesheets = True
    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    remove_empty_feeds = True
    remove_attributes = ['style']

    keep_only_tags = [dict(attrs={'class': 'box'})]
    remove_tags = [dict(attrs={'class': ['voltage-1', 'voltage-2',
                                         'encyklopedia', 'nag', 'related', 'comment_form', 'komentarze-box']})]

    feeds = [
        ('Newsy', 'http://ppe.pl/rss.html'),
        ('Recenzje', 'http://ppe.pl/rss-recenzje.html'),
        ('Publicystyka', 'http://ppe.pl/rss-publicystyka.html'),
    ]
PK�X#.����praguemonitor.png�PNG


IHDR  D���uPLTE�����������������������޵�ޭ�ޥ�ޜ�֜�֔�֌�΄�΄��{��s��k��c��Z�Z�R޽J޵J޵B޵:޵1ޭ1ޭ)ޭ!ޭޥ֥�W2}IDATx�Ւ��0eH����q~tN���G]�+Zf@q꾚+^�Sz��t`@o���t�ΐ���ª}L�����1v@�� ,��_pk�@f#�KT��#`���렩
�n[��2�b?54��Da_�/B.���!�|K��̤Uj�dj���%#`nY�x99q���ː�3a�|H�:�떻D��In�"�-yH"@X�8V�S�QM#��|�+E�d��O>�i|o|����뤀����2{ާ
P󪦥˽���j�j�!?�� ���:SIEND�B`�PK�XĘ���praguemonitor.recipe
__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
praguemonitor.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class PragueDailyMonitor(BasicNewsRecipe):
    title = u'Prague Daily Monitor'
    __author__ = u'Darko Miletic'
    description = u'Czech news in English'
    category = 'news, politics, Czech republic'
    publisher = 'Prague Daily Monitor'
    oldest_article = 2
    max_articles_per_feed = 100
    language = 'en'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': ['content-header', 'content-area']})]

    feeds = [
        (u'All Articles', u'http://feeds.feedburner.com/PragueDailyMonitor?format=xml')]
PK�X�t�  pragyata.png�PNG


IHDR  szz��IDAT��	t��������ـ�@DH�B]��@UhU:�+=�S<:���񴮭�X�-�Xk��EjE�zA���dO�	ɽ7w���}��T�[�#��|�v`��;
�fI�9�3.c_Q�سj��C�n��s��{w?}���hׁ 	a�����G�`&,�{�aѹ�5�+�+g.�ц��c;Tj��!��V��������9����o����⛐�}��v����!Eg�s�Z�$�sI�	
� O�#�Ҹ9�]G�I	=h�1;��c��'fe5�����@_��g�8,=ź~�lt�H���}�(�n���E��S�+����n�p�8���_���P�*��W��z�|�ͬ9cyæ󽕔9!@ |F�$���t?8R;�L��S(KIH۠�W8�ߦǜ�"3ԧ�{^q*�]�d�T]��v��_�ɪ�?+�	j�a�nYt?�F�-�qR�Ay�'��E��C�A0)P�sY���ԉ�G�寕=���w��r�N&d�,���Ѿ*�J��_�������\�&�極6
�.�N�$q:�$�$�$T�x�3�f��eQ��vo��?����؋��6�X�v���s�O^��Yc�ߙy�CV�:��x��Q?��]�����4�v\�J��vQv�m/��9w��J�`e�p�x�����F�(��Nq�Аj��u��l5���`�1ܾW�N���Bi�9aX(]P7
E��)\�/7=x%�BN�-���Z��m�i����^%���AXP�I��,ȉud�(lh��=�c}Ts�<��g�r��y���ڼA�J�q�<TL;��0�@2G�ν|��
n_��n�uT:e��p�<Ҏ�w�&,�k.�>�:2@��A��
e�0؉�D��	�G���D�Z�o-F�c�n��O��j_�R���%��x:�,RF�z&M\0�:�a�|���c/�7_n��\1���4��O�hRvT�K�$�;rV\Zj����.�8�"Uyd������/��������͞�;�Ÿݍ��BĻ�1�!���߁�81d6���LI�j��&T��9S�׸���wgU��U�}��J$��&R5�퐗2#�b��
�~�զ|�M����˟z���І���~��7� aP`�0p����
E�-7Z��3��ˤ�Q���p6�C�߮�%
lj(u���N

�s!�9ɔ<���4Զ��QU�N�؋'�΁=�#�3�AM���k`����ߎ���1u�l��^ RU,O���~c��m]�Ҧk���\�{��2;|T��I��'�)�4W_{�w�����n�L�Ø�2 /�E�(���S��$��u
�ϋ�s��G�z~��|�C\<�y>y$����K�^!�]�3�Oqa�<v���v�E��#tr�6�
���WW��tFC�q����よ����i�p�w�Ct`�sH�#P2N�O�'�^z�c�X2�b�%O{_�CkG�����!NǞ|b���sD�Z��0ۡ0gNuӁ���;VR�w7� ����ƅ��0o.j/Z�ǜ�X�M	r�{0�	�$]3�}�!����{��{��_��s��R���63t$IF;"T�ŁWV��/ߩH�b��B�&a��C};ZE�x"�B`
��g��Y�i�j�r;� �e@XZ���p�ݜ�Gx��߲'2��ꛠs�l"
'����M�y��^�޶Z������ r��9�xO��0��[���8nBOB�S�P���{ی,d��/�B��u	�o|�h��ًL��S�֑��dڔN�Z��f�EK�7RĻV<�c�~��.�i��o���>�Sp+.k�m�_qh훺���*Z.�W�ԉޏ;u�"�Ƙp�����g�y�T��cY�TO8��>�'6?r+k���	��I�F����A쯽݉����8���s=����(��>Z��;6�;X�J�E6~T~���k�r���|�S�A�H
�ʣ�&��(on��^2Wo��>Ļ�D��._�+��>	d
Z�>�!�L§b1��3�IW�X�4NBվ�Q>u�
��I�u�ȑ�kX�,o�	U6;3�c~+C��a
�l�r�۫M�r�ճu�<���P{Q#���M��G�+>�\�;�n���7"��͡
�,P��l]>�����+Ax8PVpXxB�(9����m�H�2��S��ƚ}/��[��~ء�m� =�F�G�y��g�����p1�O����[ݰRN\ +�KHH�G{�e��{^c�q�'����yez�w���KRχ�S��MӍo$�������,��HBĻv�\l�p�uN��6���Ϣ`E�:��#���әx�:��_��0�G�o�6��3��Tt��D�P ��@�x?��Ԥ�1*?�2�1��#���-{��ٜs�R��B�K�us���m�_\O(�����<Q�X!><��w�!�ƅ��Z/���Bz�B���/Ch��hd@����J�Q�u	_8�V0#S���Ek��2u���ֱ�G��jսe��x�T��z�����s7���M�e-�χ`)Y�2��)e����yƱ#���|P��􀎬[":�T�����*�;?7���H�}I�\֭��l�i�
y�^��/�G��X�XWeMg:e�S�����0�{�6!���Zn"
@���`�(�Q��ɝݮ��MD�p;rk/��#��I��C���q�&�k.���e>Ϋ��P��X7�IƤ�ꔱ��+$p:y����H/$\���K��K'6��#�,�l��M��ze�XK44�H��_��ҡ�ɔK�tt�zѱ�)�	
չ�E9ڷ�H��	�ӑY~��� � 608�K/`����w�a�W�ޝ#�=�k.��!!eߎW9Kr�E�%������B��	�I����)|#H��^����]Z����u-[�<.n̒v�u�ե��ϝjIz����-�W�2�&���o���IEND�B`�PK�X)�W�))pragyata.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
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 Pragyata(BasicNewsRecipe):
    title          = 'Pragyata'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('pragyata', 'https://pragyata.com/feed/'),
    ]
PK�XV�PP
pravda.png�PNG


IHDR  szz�IDATx^��Ml\W��������ӔiBC���F���-�I�RD?l(E@!A�(t��,�T†��EbUPim>"�De�mP����8vƞy��&o⫧��"�KGsߜ��?�ϙ�����&�'�2>����Fv{˭@����'��0�o4��⡣���8П����|��9��a[����(� ����C'�G�2T�wβ���p��W�p���{�7�k�-���TJQ�uC�2|�ja5�_��BUMcc���3���qL��Km�C��\�O9=a7�0��(*���4
�,@n�/b��3��l���[Nϰo�X��g��mc�y�(�_�WO�hD�DD�]iJ`|n�A��XBDr����-���l��<��3��x@�u��N9:G���P�I
)����ӟ���)���y"&������aԕ7��e�e���$��s��Y���㱝�ǔ�Լe[
+m�_}�16��w~�ݔ�?��e�y��$<�
��v�`m���$�V+�
���"!_��[��Ԇ�^�� 5p�A
��H5퀇@�{o_�GF�̏a�]��{���ہa�m���T�(�*�@U���1!�P���(û�|^!�j�W��|�x�TR�o�����Z x \�d�&��6�B���b 8���m2���Gk������ðuS���P*r�_e�E���c��@.'1N(�gb�6!���C���ׯ�SB�w9"�ڳ	%G���Д�I{�
�%&�����](J�f����F�E�P$+!:���4\l�}�Xj�:��	( +'A<��/�{H4���r�M�M0�av��tL���s�Hd`z�.������J��2��?�6�k���t����O,l��0a�1��MON��¥���-�㫣��W�
�y����P�ܕ�y��{��Xi	9PѰ�Iy�/S�섦��!k��[,o�|a{�O}d�a���"{;ijz�F�:XWi���|�u8�&M`b�2�����BnA��܄�);��� ���0�n��ؐ��A��yL��(k���F}A@H�	���A�b�cp]q�PA�d�
O/<�/�}d�q�G� %'=ހ�[E���x�B`,��*]RhM_
J��8fHl�YB���+mK�|�	�86Z�Ґ-���ɀ�0�aa	N�W�yH�F�� �D�.�/ʔf��ռ�҇�����I���Ο�S�a8��8ÿ�a�7����x�[Ѫ�h��E��1p��tƑ�l�Ư��S��y+<����&��/��J�(�럄t-ȵ��V�-�3s�����a^n�e�^�n�&Ѡt���Cg������b
f<��q5���w�!m-c�#i�������?6���j��B��`n��b5�:�����cg��WWؖ�ZmD	(���w����P�Amނ
��ۧػ�������Qƿ�����C�z�?�u�|N�h���o�p艸���d���8�IEND�B`�PK�X*_�2�
�

pravda.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class PravdaSlovakiaRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'sk'
    version = 1

    title = u'Pravda'
    publisher = u''
    category = u'News, Newspaper'
    description = u'News from Slovakia'

    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False
    remove_empty_feeds = True

    no_stylesheets = True
    remove_javascript = True

    # Feeds from: http://spravy.pravda.sk/info.asp?y=sk_kskop/rssinfo.htm
    feeds = []
    feeds.append((u'Spravodajstvo', u'http://servis.pravda.sk/rss.asp'))
    feeds.append(
        (u'N\u00E1zory', u'http://servis.pravda.sk/rss.asp?o=sk_nazory'))
    feeds.append(
        (u'\u0160port', u'http://servis.pravda.sk/rss.asp?o=sk_sport'))
    feeds.append((u'Peniaze', u'http://servis.pravda.sk/rss.asp?o=sk_peniaze'))
    feeds.append((u'Koktail', u'http://servis.pravda.sk/rss.asp?o=sk_koktail'))
    feeds.append(
        (u'Kult\u00FAra', u'http://servis.pravda.sk/rss.asp?o=sk_kultura'))
    feeds.append(
        (u'B\u00FDvanie', u'http://servis.pravda.sk/rss.asp?o=sk_byvanie'))
    feeds.append(
        (u'Veda a Technika', u'http://servis.pravda.sk/rss.asp?o=sk_veda'))
    feeds.append(
        (u'Mozgov\u00F1a', u'http://servis.pravda.sk/rss.asp?o=sk_mozgovna'))
    feeds.append((u'Auto', u'http://servis.pravda.sk/rss.asp?o=sk_autoweb'))
    feeds.append(
        (u'Cestovanie', u'http://servis.pravda.sk/rss.asp?o=sk_cestovanie'))
    feeds.append(
        (u'Regi\u00F3ny', u'http://servis.pravda.sk/rss.asp?r=sk_regiony'))
    feeds.append(
        (u'Profesia', u'http://servis.pravda.sk/rss.asp?o=sk_profesia'))
    feeds.append((u'Zdravie', u'http://servis.pravda.sk/rss.asp?o=sk_zdravie'))
    feeds.append((u'\u010C\u00EDtajme de\u0165om',
                  u'http://servis.pravda.sk/rss.asp?o=sk_citajme'))

    remove_tags = []
    remove_tags.append(dict(name='p', attrs={'class': 'spatNaClanok'}))
    remove_tags.append(dict(name='ul'))

    extra_css = '''
                @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/LiberationSans.ttf)}
                body {font-family: sans1, serif1;}
                .art-info {font-size: x-small; color: #696969; margin-bottom: 0.3em;}
                .img-info {font-size: x-small; color: #696969;}
                '''

    def print_version(self, url):
        ignore, sep, main = url.rpartition('/')
        app, sep, id = main.rpartition('?')

        app = app.replace('.asp', '')

        return 'http://sport.pravda.sk/tlac.asp?r=' + app + '&' + id
PK�X�!�ɩ�
pravda_it.png�PNG


IHDR��h6pIDATx�uQ�+Ca~��n�@"�)e0�eɑ�l2KYX�i�h��L��YPM�;���Lk�x�Μͷ���vz~���;�C�$]D��ءP
R`tc���4�J��Bɬ{;�����jF��u����o�>#�4����tZ>������q���K�����
�M�ns�F����&��˯�T�3l����,>x^�Kb?DQ7]Gql^��f�X�p=��=+쿲��W����U
�
�u��`:�zPi�~&�wbp
]�J�_�{�	Z.J�2u��Ln�d�bȔ
0ṭgj3�We���ϑ�c��e4L0�Ո���O�$��H�2ԍS��W��-y7����W
�ܬ��,j�j�yw��IEND�B`�PK�X�p��pravda_it.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
italia.pravda.ru
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Pravda_ita(BasicNewsRecipe):
    title = 'Pravda in Italiano'
    __author__ = 'Darko Miletic'
    description = 'News from Russia and rest of the world'
    publisher = 'PRAVDA.Ru'
    category = 'news, politics, Russia'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'it'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://italia.pravda.ru/pix/logo.gif'
    extra_css             = """
                               body{font-family: Arial,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_attributes = ['lang', 'style']
    keep_only_tags = [dict(name='div', attrs={'id': 'article'})]

    feeds = [

    (u'Dal mondo', u'http://italia.pravda.ru/world/export-articles.xml'),
    (u'Russia', u'http://italia.pravda.ru/russia/export-articles.xml'),
    (u'Societa', u'http://italia.pravda.ru/society/export-articles.xml'),
    (u'Avvenimenti', u'http://italia.pravda.ru/hotspots/export-articles.xml'),
    (u'Opinioni', u'http://italia.pravda.ru/opinion/export-articles.xml'),
    (u'Scienza', u'http://italia.pravda.ru/science/export-articles.xml'),
    (u'Economia', u'http://italia.pravda.ru/russia/economics/export-articles.xml'),
    (u'Politica', u'http://italia.pravda.ru/russia/politics/export-articles.xml')
    ]

    def print_version(self, url):
        return url + '?mode=print'
PK�X�!�ɩ�pravda_por.png�PNG


IHDR��h6pIDATx�uQ�+Ca~��n�@"�)e0�eɑ�l2KYX�i�h��L��YPM�;���Lk�x�Μͷ���vz~���;�C�$]D��ءP
R`tc���4�J��Bɬ{;�����jF��u����o�>#�4����tZ>������q���K�����
�M�ns�F����&��˯�T�3l����,>x^�Kb?DQ7]Gql^��f�X�p=��=+쿲��W����U
�
�u��`:�zPi�~&�wbp
]�J�_�{�	Z.J�2u��Ln�d�bȔ
0ṭgj3�We���ϑ�c��e4L0�Ո���O�$��H�2ԍS��W��-y7����W
�ܬ��,j�j�yw��IEND�B`�PK�Xu�����pravda_por.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
port.pravda.ru
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Pravda_port(BasicNewsRecipe):
    title = u'Pravda em português'
    __author__ = 'Darko Miletic'
    description = 'News from Russia and rest of the world'
    publisher = 'PRAVDA.Ru'
    category = 'news, politics, Russia'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'pt'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://port.pravda.ru/pix/logo.gif'
    extra_css             = """
                               body{font-family: Arial,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_attributes = ['lang', 'style']
    keep_only_tags = [dict(name='div', attrs={'id': 'article'})]

    feeds = [

    (u'Mundo', u'http://port.pravda.ru/mundo/export-articles.xml'),
    (u'Russia', u'http://port.pravda.ru/russa/export-articles.xml'),
    (u'Sociedade', u'http://port.pravda.ru/sociedade/export-articles.xml'),
    (u'Cultura', u'http://port.pravda.ru/sociedade/cultura/export-articles.xml'),
    (u'Ciencia', u'http://port.pravda.ru/science/export-articles.xml'),
    (u'Desporto', u'http://port.pravda.ru/desporto/export-articles.xml'),
    (u'CPLP', u'http://port.pravda.ru/cplp/export-articles.xml')
    ]

    def print_version(self, url):
        return url + '?mode=print'
PK�X�]0]]
pravda_rs.png�PNG


IHDR��h6$IDATx�
�;�1���v?vvg"##E�b���I�'! ��I�@�v�g�m��
��T��/^�6���B��X�ʺ!�"�ÆT��h� ���JG�rj<g���XTi�t',�)�[Z4	�W�)�o�<~�Z1m��=
��T9���y��U��I�˭̪��j:�.�~K(
%Em�6��H@���NL+����!%�{�>GT���C�9�+�Nj������ʯ��
���ɷ/��-v���r"N��b�*�e��ڴ�e�4��2ε􀌠�oJȷ&��7V�{Ai�Q7Q;M��e�"�Q�9Zv$�n;�q�J�8n�6Z��M|��p�������t,��A�)G�
�*�YϮ����?�,��J���*�)�EZ��:�*��x�	���J0ld�t��*a���v�Rʉ+�쭕(G�!;2�.1��G�oQ&`#���V��%VZ�F����^���'��4����,#�]Y������ݔg=C��6��>��B��a�PK����3��&ISZ׼IEND�B`�PK�X��ȟTTpravda_rs.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai

__license__ = 'GPL v3'
__copyright__ = '2013, Darko Miletic <darko.miletic at gmail.com>'

'''
www.pravda.rs
'''

import re
from calibre.web.feeds.recipes import BasicNewsRecipe


class Pravda_rs(BasicNewsRecipe):
    title = 'Dnevne novine Pravda'
    __author__ = 'Darko Miletic'
    description = '24 sata portal vesti iz Srbije'
    publisher = 'Dnevne novine Pravda'
    category = 'news, politics, entertainment, Serbia'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'sr'
    publication_type = 'newspaper'
    remove_empty_feeds = True
    PREFIX = 'http://www.pravda.rs'
    FEEDPR = PREFIX + '/category/'
    LANGLAT = '?lng=lat'
    FEEDSU = '/feed/' + LANGLAT
    INDEX = PREFIX + LANGLAT
    masthead_url = 'http://www.pravda.rs/wp-content/uploads/2012/09/logoof.png'
    extra_css             = """
                               @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                               body{font-family: Georgia,"Times New Roman",Times,serif1,serif;}
                               img{display: block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [dict(name='div', attrs={'class': 'post'})]
    remove_tags = [dict(name='h3')]
    remove_tags_after = dict(name='h3')

    feeds = [
        (u'Politika', FEEDPR + 'politika/' + FEEDSU),
        (u'Tema Dana', FEEDPR + 'tema-dana/' + FEEDSU),
        (u'Hronika', FEEDPR + 'hronika/' + FEEDSU),
        (u'Društvo', FEEDPR + 'drustvo/' + FEEDSU),
        (u'Ekonomija', FEEDPR + 'ekonomija/' + FEEDSU),
        (u'Srbija', FEEDPR + 'srbija/' + FEEDSU),
        (u'Beograd', FEEDPR + 'beograd/' + FEEDSU),
        (u'Kultura', FEEDPR + 'kultura/' + FEEDSU),
        (u'Zabava', FEEDPR + 'zabava/' + FEEDSU),
        (u'Sport', FEEDPR + 'sport/' + FEEDSU),
        (u'Svet', FEEDPR + 'svet/' + FEEDSU),
        (u'Porodica', FEEDPR + 'porodica/' + FEEDSU),
        (u'Vremeplov', FEEDPR + 'vremeplov/' + FEEDSU),
        (u'IT', FEEDPR + 'it/' + FEEDSU),
        (u'Republika Srpska', FEEDPR + 'republika-srpska/' + FEEDSU),
        (u'Crna Gora', FEEDPR + 'crna-gora/' + FEEDSU),
        (u'EX YU', FEEDPR + 'eks-ju/' + FEEDSU),
        (u'Dijaspora', FEEDPR + 'dijaspora/' + FEEDSU),
        (u'Kolumna', FEEDPR + 'kolumna/' + FEEDSU),
        (u'Afere', FEEDPR + 'afere/' + FEEDSU),
        (u'Feljton', FEEDPR + 'feljton/' + FEEDSU),
        (u'Intervju', FEEDPR + 'intervju/' + FEEDSU),
        (u'Reportaža', FEEDPR + 'reportaza/' + FEEDSU),
        (u'Zanimljivosti', FEEDPR + 'zanimljivosti/' + FEEDSU),
        (u'Sa trga', FEEDPR + 'sa-trga/' + FEEDSU)
    ]

    def print_version(self, url):
        return url + self.LANGLAT

    def preprocess_raw_html(self, raw, url):
        return '<html><head><title>title</title>' + raw[raw.find('</head>'):]
PK�X�V <<
pravda_ru.png�PNG


IHDR  ��IDATxڥV�s���"��e䄙�Μ��swwww9ww��%)^9��4Pԕ��jP��MI�9cv�!ɾϳ����/
��\���ȟ`x���U�.6��/�B?A�'LO���z�9G[���9��C�WC��;�'n4�
6�57���W�Sӓ�M9ּ?�0�Z�
�HPhL[����s؂�I����M����q&C�8�@Õl��4�W���R�*����體82��4
Ri:�&�	%���Bk�Jv��.7�1��H)
�����g�B�"γ��Y�@�h�FAuqe�j�E�e�7ôl�鄒]��Ͳ�%�^�
-
Ao�7���ڬ�ݺU�b&jD�$�T �$��Y���沸XL���-R���7�������H�,���8��5���BOAqcQa���~�EE�$�؋�G��R9��1��8�%�Zp����hiF͛M�}fw۱,.��>�X-9��v_�>=	�3��„pn驓��C��tt�� _3cG5Z�
F�p�X���t=<i�p��;�Z�ZU�h��X$�����6i�3I8cQJ�S":����\5Aa�T;\�=��7���7�iM7K���ɱ�Cu^���jB�������SW�{3� �d�g���mpҏ�=c|��w�C��J�:;��Y��%�Jh����\F;}:m�m0e��c���}��Ƨ~.�]ˣ�6}����Cb)L�U�Ȯ|��,jS��t����1�N��F�}�S�J�!��×����B��^YS��`��������Gcc�/`�a�f�6�NUß�w��>�l�?��W9��S
�n���
�sg�"��~X"@�+Y&Hh����Q
��]��ۯ6w�N~I����og��p#����.����,� ����SSKo,!�fHh��h������qx�P�>�v_������j��>�y��u�:*R<��y۷�gTY��4M`h���"��uW�����������vP�
�2ɳ���]Ͳlt��1+TI�NǾ8~�q�����UJ��P�ow�8�%�R���I�Q��.m��[�M���b�g�N*��
6~�ڏ{Ϫ+��mE�Z��B!���=1g�6�P�J$���b������-�R���tr
������XX�2Z����L�EN!e�d� ����.��GMd���x:n�X�JF�P���$"*�*�⩇�yg��^|�P(�!~8�\d9��8����[1��C���v�^0�;�2A2)�#>6�H!�hld�4��o��x�zX���_�(�*���~���G����%�(t�z�Y<&��\[�D��uR?L
vWU�]�Z�Iu%'Ui5�֛}5����t��!<=�D	:��_��'C˲܁�k
�nc��lTG�!� B�(Z(b�Q�w 誮N@qiZzٲ�rS����'�Hg�+%���T�]‘KJ�pI�{PY��K�B�/�-8��qIEND�B`�PK�X'`b���pravda_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe

__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.pravda.ru
'''


class Pravda_ru(BasicNewsRecipe):
    title = u'\u041F\u0440\u0430\u0432\u0434\u0430'
    __author__ = 'Darko Miletic (with fixes by bugmen00t)'
    description = 'Правда.Ру: Аналитика и новости'
    publisher = 'PRAVDA.Ru'
    category = 'news, politics, Russia'
    language = 'ru'
    publication_type = 'newspaper'
    cover_url = 'http://www.pravda.ru/pix/logo.gif'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True

    remove_tags_before = dict(
        name='div', attrs={'class': 'full article full-article'}
    )

    remove_tags_after = dict(name='div', attrs={'class': 'authors-block'})

    remove_tags = [dict(name='div', attrs={'class': 'breadcumbs'})]

    feeds = [(
        u'\u041F\u0440\u0430\u0432\u0434\u0430.RU',
        'https://www.pravda.ru/export.xml'
    ),
             (
                 u'\u0421\u0442\u0430\u0442\u044C\u0438',
                 'https://www.pravda.ru/export-articles.xml'
             ),
             (
                 u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
                 'https://www.pravda.ru/export-news.xml'
             )]
PK�X9E'��
pravda_uk.png�PNG


IHDR���R0PLTE�$�#�m����ѓ��0�/K����۩�����%���7�Pg�,���oLIDAT�c`�!��$�b����r������+�	���9`�"���{��`[���T�xg���T����IEND�B`�PK�X�H;;pravda_uk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class PravdaUAUA(BasicNewsRecipe):
    title = '\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 \u043F\u0440\u0430\u0432\u0434\u0430'
    __author__ = 'bugmen00t'
    description = '\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0435 \u0441\u0443\u0441\u043F\u0456\u043B\u044C\u043D\u043E-\u043F\u043E\u043B\u0456\u0442\u0438\u0447\u043D\u0435 \u0456\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0417\u041C\u0406'  # noqa
    publisher = 'pravda.com.ua'
    category = 'newspaper'
    cover_url = u'https://img.pravda.com/images/up_for_fb.gif'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='article', attrs={'class': 'post'})

    remove_tags = [
        dict(name='footer'),
        dict(name='div', attrs={'class': 'nts-video-wrapper'}),
        dict(name='div', attrs={'class': 'post-report'}),
        dict(name='div', attrs={'class': 'post__report'}),
        dict(name='div', attrs={'class': 'social_item'}),
        dict(name='div', attrs={'class': 'sidebar'}),
        dict(
            name='div',
            attrs={
                'class':
                'article-announcement-photo article-announcement-photo-block-1'
            }
        ),
        dict(
            name='div',
            attrs={'class': 'statistic-bottom-block statistic-top-block'}
        ),
        dict(name='div', attrs={'class': 'modal modal_search modal_white'}),
        dict(name='div', attrs={'class': 'modal_auth modal_white'}),
        dict(name='div', attrs={'class': 'main_logo'}),
        dict(name='div', attrs={'class': 'footer_banner'}),
        dict(name='nav', attrs={'class': 'block block_menu'}),
        dict(name='div', attrs={'class': 'pagewrap page-point'}),
        dict(name='div', attrs={'class': 'modal fade search-popup'}),
        dict(name='div', attrs={'data-vr-zone': 'Mobile main menu'}),
        dict(name='aside'),
        dict(name='div', attrs={'class': 'block_related'}),
        dict(name='div', attrs={'class': 'block_comments'}),
        dict(name='div', attrs={'class': 'post_tags'}),
        dict(name='div', attrs={'class': 'post__tags'})
    ]

    feeds = [
        (
            '\u0412\u0441\u0456 \u043C\u0430\u0442\u0435\u0440\u0456\u0430\u043B\u0438',
            'https://www.pravda.com.ua/rss/'
        ),
        (
            '\u041D\u0430\u0439\u0432\u0430\u0436\u043B\u0438\u0432\u0456\u0448\u0456 \u043D\u043E\u0432\u0438\u043D\u0438',
            'https://www.pravda.com.ua/rss/view_mainnews/'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438',
            'https://www.pravda.com.ua/rss/view_news/'
        ),
        (
            '\u041F\u0443\u0431\u043B\u0456\u043A\u0430\u0446\u0456\u0457',
            'https://www.pravda.com.ua/rss/view_pubs/'
        ),
    ]
PK�X9E'��pravda_ukraine.png�PNG


IHDR���R0PLTE�$�#�m����ѓ��0�/K����۩�����%���7�Pg�,���oLIDAT�c`�!��$�b����r������+�	���9`�"���{��`[���T�xg���T����IEND�B`�PK�XSd�Y�	�	pravda_ukraine.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class PravdaUAEN(BasicNewsRecipe):
    title = 'Ukrainska Pravda'
    __author__ = 'bugmen00t'
    description = ' Ukrainian online newspaper founded by Georgiy Gongadze with an emphasis on the politics of Ukraine. '
    publisher = 'pravda.com.ua'
    category = 'newspaper'
    cover_url = u'https://img.pravda.com/images/up_for_fb.gif'
    language = 'en_UK'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 30
    max_articles_per_feed = 30

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='article', attrs={'class': 'post'})

    remove_tags = [
        dict(name='footer'),
        dict(name='div', attrs={'class': 'nts-video-wrapper'}),
        dict(name='div', attrs={'class': 'post-report'}),
        dict(name='div', attrs={'class': 'post__report'}),
        dict(name='div', attrs={'class': 'social_item'}),
        dict(name='div', attrs={'class': 'sidebar'}),
        dict(
            name='div',
            attrs={
                'class':
                'article-announcement-photo article-announcement-photo-block-1'
            }
        ),
        dict(
            name='div',
            attrs={'class': 'statistic-bottom-block statistic-top-block'}
        ),
        dict(name='div', attrs={'class': 'modal modal_search modal_white'}),
        dict(name='div', attrs={'class': 'modal_auth modal_white'}),
        dict(name='div', attrs={'class': 'main_logo'}),
        dict(name='div', attrs={'class': 'footer_banner'}),
        dict(name='nav', attrs={'class': 'block block_menu'}),
        dict(name='div', attrs={'class': 'pagewrap page-point'}),
        dict(name='div', attrs={'class': 'modal fade search-popup'}),
        dict(name='div', attrs={'data-vr-zone': 'Mobile main menu'}),
        dict(name='aside'),
        dict(name='div', attrs={'class': 'block_related'}),
        dict(name='div', attrs={'class': 'block_comments'}),
        dict(name='div', attrs={'class': 'post_tags'}),
        dict(name='div', attrs={'class': 'post__tags'})
    ]

    feeds = [('All materials', 'https://www.pravda.com.ua/eng/rss/'),
             ('Top news', 'https://www.pravda.com.ua/eng/rss/view_mainnews/'),
             ('News', 'https://www.pravda.com.ua/eng/rss/view_news/'),
             ('Articles', 'https://www.pravda.com.ua/eng/rss/view_pubs/')]
PK�X9E'��pravda_ukraine_ru.png�PNG


IHDR���R0PLTE�$�#�m����ѓ��0�/K����۩�����%���7�Pg�,���oLIDAT�c`�!��$�b����r������+�	���9`�"���{��`[���T�xg���T����IEND�B`�PK�X���pravda_ukraine_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class PravdaUARU(BasicNewsRecipe):
    title = '\u0423\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0430\u044F \u043F\u0440\u0430\u0432\u0434\u0430'
    __author__ = 'bugmen00t'
    description = '\u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0438\u0437\u0434\u0430\u043D\u0438\u0435, \u043E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430 \u2014 \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430, \u0441\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B, \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0430. '  # noqa
    publisher = 'pravda.com.ua'
    category = 'newspaper'
    cover_url = u'https://img.pravda.com/images/up_for_fb.gif'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='article', attrs={'class': 'post'})

    remove_tags = [
        dict(name='footer'),
        dict(name='div', attrs={'class': 'nts-video-wrapper'}),
        dict(name='div', attrs={'class': 'post-report'}),
        dict(name='div', attrs={'class': 'post__report'}),
        dict(name='div', attrs={'class': 'social_item'}),
        dict(name='div', attrs={'class': 'sidebar'}),
        dict(
            name='div',
            attrs={
                'class':
                'article-announcement-photo article-announcement-photo-block-1'
            }
        ),
        dict(
            name='div',
            attrs={'class': 'statistic-bottom-block statistic-top-block'}
        ),
        dict(name='div', attrs={'class': 'modal modal_search modal_white'}),
        dict(name='div', attrs={'class': 'modal_auth modal_white'}),
        dict(name='div', attrs={'class': 'main_logo'}),
        dict(name='div', attrs={'class': 'footer_banner'}),
        dict(name='nav', attrs={'class': 'block block_menu'}),
        dict(name='div', attrs={'class': 'pagewrap page-point'}),
        dict(name='div', attrs={'class': 'modal fade search-popup'}),
        dict(name='div', attrs={'data-vr-zone': 'Mobile main menu'}),
        dict(name='aside'),
        dict(name='div', attrs={'class': 'block_related'}),
        dict(name='div', attrs={'class': 'block_comments'}),
        dict(name='div', attrs={'class': 'post_tags'}),
        dict(name='div', attrs={'class': 'post__tags'})
    ]

    feeds = [
        (
            '\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://www.pravda.com.ua/rus/rss/'
        ),
        (
            '\u0413\u043B\u0430\u0432\u043D\u044B\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.pravda.com.ua/rus/rss/view_mainnews/'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.pravda.com.ua/rus/rss/view_news/'
        ),
        (
            '\u041F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u0438',
            'https://www.pravda.com.ua/rus/rss/view_pubs/'
        ),
    ]
PK�XQ�y`EE	pravo.png�PNG


IHDR  szz�IDATx^��k[ǿ�N-E�^�#�Kcl��X�.�C\�.���?�?��ݺx�M�G
�Ŵ`�����:�x�|�iɤtc��a.g��Ν����pοԩ���>���s�����R$�
0�[�A�]�s`Q))m�����zO�N�L�J�&1��N�õ5��
G�,#XUX	�݂l�$;��{�B�9D�h!$�y��
�Ν4VW�T��է�?ʺ�E��[d:[[����P:��#���~�ؽ��6��r�p���x�l��.Ė���Z�%%� ��������L�&�hcW���z���!��j���T&P�!�Z��#)�zrx�r���`ff���҇M�ֱ�ױ��^�A���H�l,�
�D�!�`c��7���VE���X/�C�@���Ļ��P�o�@]'�D��̸I�0��-�;��r�G/ �$�
O(��횕�5<�>�P@<G\�������+N��:���d/�4EL�C�2m����pDv��D��5�:
>�)����Dd'�׊���"z&*b=.[�}��� b�Q�&��/?&Q����=�@��Pfx��"�͢�O���
��
�"��
�Z	�|kU�N@�@$�f������Ί0�lɷO��"��;8(�
d��6Z������
8LL@� J�|m4;��MR���G��S��Y�0�� "��s�����j�A�����A&��0I�q�(!�Sd����wq�Lq�7AIEND�B`�PK�Xn�(		pravo.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


class pravo(BasicNewsRecipe):
    __author__ = 'bubak'
    title = 'Právo'
    language = 'cs'

    remove_tags_before = dict(name='div', attrs={'class': 'rubrika-ostat'})
    remove_tags_after = dict(name='td', attrs={'class': 'rubrika'})
    remove_tags = [dict(name='td', attrs={'width': '273'}), dict(name='td', attrs={'class': 'rubrika'}), dict(name='div', attrs={'class': 'rubrika-ostat'})
                   ]
    extra_css = '.nadpis {font-weight: bold; font-size: 130%;} .medium {text-align: justify;}'
    cover_url = 'http://pravo.novinky.cz/images/horni_6_logo.gif'
    cover_margins = (0, 100, '#ffffff')
    conversion_options = {'linearize_tables': True}

    no_stylesheets = True

    # our variables
    seen_titles = set()
    # only yesterday's articles are online
    parent_url = 'http://pravo.novinky.cz/minule/'
    feeds = [
        ('Hlavní stránka', 'http://pravo.novinky.cz/minule/index.php'),
        ('Zpravodajství', 'http://pravo.novinky.cz/minule/zpravodajstvi.php'),
        ('Komentáře', 'http://pravo.novinky.cz/minule/komentare.php'),
        ('Praha a střední Čechy', 'http://pravo.novinky.cz/minule/praha_stredni_cechy.php')
    ]

    def parse_index(self):
        articles = []

        for feed in self.feeds:
            articles.append(self.parse_page(feed))
        return articles

    def parse_page(self, title_and_url):
        (feed_title, url) = title_and_url
        articles = []

        soup = self.index_to_soup(url)
        titles = soup.findAll('a', attrs={'class': 'nadpis'})
        if titles is None:
            raise ValueError('Could not find any articles on page ' + url)

        articles = []
        for article in titles:
            title = article.string
            if title in self.seen_titles:
                continue
            self.seen_titles.add(title)
            url = article['href']
            if not url.startswith('http'):
                url = self.parent_url + url
            self.log('\tFound article:', title, 'at', url)
            articles.append({'title': title.string, 'url': url, 'description': '',
                             'date': ''})
            return (feed_title, articles)
PK�X�8��aaprekshaa.png�PNG


IHDR  D����PLTE��8��8��5��2��8��2��.��2��2��2��5��+��5��5��5��2��2��5��5��5��5��.��.��.��.��.��2��5��5��5ߋ2Ё+ǀ+�x+�k�e�+�+�_�Y"�i'م'��5��8��8��5��2Ճ'oF`D;+�|+F.�o'�v"'�b"��.��2��5��2��.��.�u+'J2N5�k��2�p"�o��5��5��+ʃ'L5�+��2��2�'+ޏ.��5��5��5ˁ'2�]"��.��2��2�25"�o'��8��8��5˃+2"�v+�5N5�YȂ+��2��5��5��2Y@oF��;.ч+��2Z@kB��;��.��+��2U=vL��2�|'��.�5D.�e�n'��2��5��5�."Ӆ+wN��.��.׆+�W"��58"͂'��8�e"P8�.�m'L+�p'�`"oD�+��.��2�2ԁ'�g'�m"�~+�'��5�5��8��2��.�8��8��8˂+�8��2��2��5��5ͅ++""�8��5�.�'�'�f"�x'�"�'��2ʂ"tHrJg@mHpDoDiD{P�N�.��2��.��2��5��.�5��8��8���X�IDAT8�cd ��������0���M#P�3#|��@���?#<���@�#*���@"��~���(
8MO�12~�i�e|� z�`;�v&G�S���~I�Lx$��x�5�O�v��V�������Q|�4/����Y�����0�b0_�����%���-�����(p8�x�P�/��.�XMx��
4a;�c6�g}�z�02ndX}�?V�`7\����?V7D02��,e�a,���
y^#�9�����Ʀ��_h��Fƌ�I���A��֫X�1n���ƸcG#vʌ�s���`K��0�4�)�&~��-�n�Wm#c�2w���
8�W�����R��b(��@$�>��
��02��:�{ɪ�I�
Jޮ�Զ���9�I�)��&N�Ć!Sc^IEND�B`�PK�X>��++prekshaa.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
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 Prekshaa(BasicNewsRecipe):
    title          = 'prekshaa'
    __author__     = 'Vishvas Vasuki'
    language       = 'en_IN'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds          = [
        ('prekshaa', 'https://www.prekshaa.in/feed'),
    ]
PK�X��Ez	z	press_information_bureau.png�PNG


IHDR�R9�	AIDAT5�	�S��}�J^^�M��M��XaEE�*�V�mǣ8u,
�"K�Vڕ��bm������8U���-G��]`���#���^��(�L?$�
Lb.������Sی�ElA����z��[�^��#m<���eC�:iM��00T*���2���P"�@B8O�su�3�J��"5-�0�nZ=s.���ʕ7���o]�p�,@���B (����B����f���C�*�u����7åT��r�u��;��:��slbhv[��/��T�zu(}¡��\6gO�ۥ�IdY�u.�5bhW�����<S#a?���ߺ��ت}?ϳ�ֺ�k}���py��뛗�5E0��񨓙�O��t<�iZ(���#�}�����L�ȩ1�Z>=�nD��=�y�^<�N�{g�x��d��xc� a;�"8<�DbL�Rq�_�`��*��p0c�k�kb�Z�4b�jY�`VE��f@eP�\�����鉶w&L��5O�u��k�������9K��%%�͖��������a�{�s����x��љH����*����2�V�3�R]��渊j���LP������e�.
��q���
\d`� �9$�d��{�e@�Ї�ڜ�N6�!�HI����{�W�Y�G=�P/+%�����A����߽�nydb���d �.�,�̚�h�zf��A��
W���C*b��-����_M�:�:yòyC�E�2���ő#�/�;�R��Em��4)F�y\�"~]niKbgJ.��&rU��N˳߹"�rtGo����d1_�c�����r��$�K��e�s끢�@�t����;���%��E��d�'$�0Ƣ�b���=+Qb�H�>�޶ D\�_p���G[�\���F���s����
<�̎�[3Z�6
��b��7�7Gl	[L��c��0�7p�
�"�}՜`���O^s�C�x�OR��� �l[<���;��bv�E�����{��|>vt��vٴ'1��ηҬJ������}��޶ζ�p�VƂ�R	3� �F�@$��C�<?�΂��͍/����?��USoj<;Q���?X��6�v/mJ�	Qe��^5wr�MO�KVqjz��{vJ�j,ҁ��.�1�p�;��+[��"��_�H�npf���킍��0\wqoz��g�8�DŸ�{t�ڧ�^���qk�1ƚ��
"1���)��%�R]���/ZqI�/�2���n��'~������T͌�	��X���i�]�H|�ԑ]Cǎ�\*Lf5UJ&Z��Tt��v�w���ӧv7��Љw$�Zz��I�nv-:u�ȸ;���4ܨ���k��_pj��Ԕ�<
�|z�4M��0$���3�L4��Q;�+u��dvZ1H"�_�t�])�H\8T��c�lNo�,fe���{���9����X,����\��\�}jD�8�*f�.�l��E���W�>���o$?E�Ñ���6:-�"�2q2�ʇb0��^��%������{v��ȕr�:��}[o�ǧ2#ݝ�_�X��o��E����
R}��X�(!��|���jص�٩B����X������nŪo-�ly,�Δ��8U�|b�&�ah��P!N�	P�HT�~��Ύ�C�_��ҳ��?�C<Q�}`ݖ��O4Fo�e�5K_|Q���:�³z�Ȓ���ы�l[��|�2`,J�!&Htw4Rj��죋���/p�ͷ8��v�Ǐ������Δ_�͞�9uuu�6m���/�*]��pX��Y���'�^ԭ2.i�����1$� J�}��U# 56�U�8�3�).X0K��3粽u�<
GU��T*��䌌武���Ym�S��߶��"E[�
��o;*`0=5����Z*�N���5풦�HT<�K*g�3LT�0$y�ܭZRn�C�,�9M!�jMQIM������Ì�t:m��F]A��a(�O�L���y�t��^��G�ځ]J}��e�n�U�Pnڪ��4�g	�@L1���B��i��|��i�br@4\g��_H�5���N��ٮ���s-צfi"T�n�"�a��4v�ʭ�oئ�@$��d2�1 QV��鱚>�;Y��V5IniTK�dZ��ώ�ֵ6u� �� d�I6>�6A��A���QBBPM���3H:3�O��r��ęaSxc)5^&q٧�m�(��C��'�IBA�@:�1F�X2��H���;,$�L������Ą�)�R�}�-�CPr<-��{��.B��^h�UѳIEND�B`�PK�X�Z
g��press_information_bureau.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class PIB(BasicNewsRecipe):
    title = u'Press Information Bureau'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    no_stylesheets = True
    use_embedded_content = False
    remove_attributes = ['style','height','width']
    ignore_duplicate_articles = {'url'}
    description = ('The Press Information Bureau (PIB) is the nodal agency of the Government of India'
                    ' to disseminate information to the print and electronic media on government policies,'
                    ' programmes, initiatives and achievements. Best downloaded at the end of the day!')
    extra_css = '''
        #ltrSubtitle{color:#404040;}
        blockquote{color:#404040;}
        .ReleaseDateSubHeaddateTime{font-style:italic; font-size:small;}
    '''
    masthead_url = 'https://tse3.mm.bing.net/th?id=OIP.4QE8KPl1dZ3_BoR3X92aqgHaIH'

    keep_only_tags = [
        classes('innner-page-main-about-us-content-right-part')
    ]
    remove_tags = [
        classes('ReleaseLang log_oo')
    ]

    def parse_index(self):
        soup = self.index_to_soup('https://pib.gov.in/Allrel.aspx')
        feeds = []
        for h3 in soup.findAll('h3'):
            secname = self.tag_to_string(h3)
            self.log(secname)
            articles = []
            div = h3.findParent('li')
            for a in div.findAll('a', href=True):
                url = a['href']
                if url.startswith('/'):
                    url  = 'https://pib.gov.in' + url
                title = self.tag_to_string(a)
                self.log('\t', title, '\n\t\t', url)
                articles.append({'title': title, 'url': url})
            if articles:
                feeds.append((secname, articles))
        return feeds
PK�X��=�ffpresse_portal.png�PNG


IHDR�a-IDATx��P3Cna���U�m���oҖ�l[ߒmc�v�>����Z{�G?4M�W�#�7�������P8=;DZ�g�����$ys�q����! �q����Arj�FN^:��#8�hh,�fE��߯�x����!j�J06>{�?�����O�������aN��)������8�}У����<��3㰴��������n�k�m
`h�� ��tG_��+	w������c��X/�آ���^6#2�$�n�"IE�,�ЯE���1D���{�Ki��d��t]�IEND�B`�PK�XL!���presse_portal.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime


class PressePortalDE(BasicNewsRecipe):
    # Title of the Recipe
    title = 'Presseportal DE'
    # Author
    __author__ = 'Volker Heggemann, VoHe'
    # oldest article to download (in days) 									---- can be edit by user
    oldest_article = 1
    # describes itself, 						 							---- can be edit by user
    max_articles_per_feed = 100
    # speed up the download on fast computers be careful (I test max.20)
    # ---- can be edit by user
    simultaneous_downloads = 10
    # description, some Reader show this in titlepage
    description = u'Presseportal News Feed DE'
    # add date to description so for dayly downloads you can find them easier
    # ---- can be edit by user
    description = description + ' fetched: ' + \
        datetime.now().strftime("%Y-%m-%d")  # %H:%M:%S")
    # Who published the content?
    publisher = u'Presseportal.de'
    # What is the content of?
    category = u'latest news, national Police, Germany'
    # describes itself, 						 							---- can be edit by user
    use_embedded_content = False
    # describes itself, 						 							---- can be edit by user
    language = 'de'
    # encoding of content. e.g. utf-8, None, ...
    # ---- can be edit by user
    encoding = None  # 'utf-8' doesn't work here
    # Removes javascript- why keep this, we only want static content
    remove_javascript = True
    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True

    # remove the rubbish (in ebook)
    auto_cleanup = True
    # now the content description and URL follows
    # feel free to add, wipe out what you need	 							---- can be edit by user
    #
    # some of this are double
    # so if you load "Alle Ressort" you don't need "Wirtschaft, Finanzen, Politik, Vermischtes..." at all.
    #
    #
    # Make some tests, may you first comment all of them out, and step by step you add what you'll need?
    #

    feeds = [  # Ressorts
        # Add or Remove the '#' symbol in front of line, to get or discard this rss-feed
        #
        # ---- each line can be edit by user
        #
        # (u'Alle Ressort',u'http://www.presseportal.de/rss/presseportal.rss2'),
        (u'Wirtschaft', u'http://www.presseportal.de/rss/wirtschaft.rss2'),
        (u'Finanzen', u'http://www.presseportal.de/rss/finanzen.rss2'),
        (u'Politik', u'http://www.presseportal.de/rss/politik.rss2'),
        (u'Vermischtes',
         u'http://www.presseportal.de/rss/vermischtes.rss2'),
        (u'Sport', u'http://www.presseportal.de/rss/sport.rss2'),
        (u'Kultur', u'http://www.presseportal.de/rss/kultur.rss2'),
        # Branchen
        (u'Arbeit', u'http://www.presseportal.de/rss/arbeit.rss2'),
        (u'Auto', u'http://www.presseportal.de/rss/auto.rss2'),
        (u'Banken', u'http://www.presseportal.de/rss/banken.rss2'),
        (u'Bildung', u'http://www.presseportal.de/rss/bildung.rss2'),
        (u'Bauwesen', u'http://www.presseportal.de/rss/bauwesen.rss2'),
        (u'Celebrities',
         u'http://www.presseportal.de/rss/celebrities.rss2'),
        (u'Chemie', u'http://www.presseportal.de/rss/chemie.rss2'),
        (u'Comuter', u'http://www.presseportal.de/rss/computer.rss2'),
        (u'Energie', u'http://www.presseportal.de/rss/energie.rss2'),
        (u'Fernsehn', u'http://www.presseportal.de/rss/fernsehn.rss2'),
        (u'Fussball', u'http://www.presseportal.de/rss/fussball.rss2'),
        (u'Gesundheit', u'http://www.presseportal.de/rss/gesundheit.rss2'),
        (u'Handel', u'http://www.presseportal.de/rss/handel.rss2'),
        (u'Immobilien', u'http://www.presseportal.de/rss/immobilien.rss2'),
        (u'Kinder', u'http://www.presseportal.de/rss/kinder.rss2'),
        (u'Lebensmittel',
         u'http://www.presseportal.de/rss/lebensmittel.rss2'),
        (u'Livestyle', u'http://www.presseportal.de/rss/livestyle.rss2'),
        (u'Logistik', u'http://www.presseportal.de/rss/logistik.rss2'),
        (u'Maschinenbau',
         u'http://www.presseportal.de/rss/maschinenbau.rss2'),
        (u'Medien', u'http://www.presseportal.de/rss/medien.rss2'),
        (u'Motorsport', u'http://www.presseportal.de/rss/motorsport.rss2'),
        (u'Ratgeber', u'http://www.presseportal.de/rss/ratgeber.rss2'),
        (u'Recht', u'http://www.presseportal.de/rss/recht.rss2'),
        (u'Soziales', u'http://www.presseportal.de/rss/soziales.rss2'),
        (u'Telekommunikation',
         u'http://www.presseportal.de/rss/telekommunikation.rss2'),
        (u'Touristik', u'http://www.presseportal.de/rss/touristik.rss2'),
        (u'Umwelt', u'http://www.presseportal.de/rss/umwelt.rss2'),
        (u'Unterhaltung',
         u'http://www.presseportal.de/rss/unterhaltung.rss2'),
        (u'Versicherung',
         u'http://www.presseportal.de/rss/versicherung.rss2'),
        (u'Wissenschaft',
         u'http://www.presseportal.de/rss/wissenschaft.rss2'),
        # Themen
        (u'Polizei (gesamt)',
         u'http://www.presseportal.de/rss/polizei.rss2'),
        (u'Bilder', u'http://www.presseportal.de/rss/98,306.rss2'),
        (u'Video', u'http://www.presseportal.de/rss/videocast.rss2'),
        (u'Audio', u'http://www.presseportal.de/rss/podcast.rss2'),
        (u'Investor Relations',
         u'http://www.presseportal.de/rss/ir.rss2'),
        (u'Presseschau', u'http://www.presseportal.de/rss/1043.rss2'),
        # Polizeipresse - Kommunal!
        (u'Polizei BW', u'http://www.presseportal.de/rss/polizei/laender/1.rss2'),
        (u'Polizei BY', u'http://www.presseportal.de/rss/polizei/laender/2.rss2'),
        (u'Polizei BE', u'http://www.presseportal.de/rss/polizei/laender/3.rss2'),
        (u'Polizei HB', u'http://www.presseportal.de/rss/polizei/laender/4.rss2'),
        (u'Polizei HH', u'http://www.presseportal.de/rss/polizei/laender/5.rss2'),
        (u'Polizei HE', u'http://www.presseportal.de/rss/polizei/laender/6.rss2'),
        (u'Polizei MV', u'http://www.presseportal.de/rss/polizei/laender/7.rss2'),
        (u'Polizei NI', u'http://www.presseportal.de/rss/polizei/laender/8.rss2'),
        (u'Polizei NW', u'http://www.presseportal.de/rss/polizei/laender/9.rss2'),
        (u'Polizei RP', u'http://www.presseportal.de/rss/polizei/laender/10.rss2'),
        (u'Polizei SH', u'http://www.presseportal.de/rss/polizei/laender/11.rss2'),
        (u'Polizei BUND',
         u'http://www.presseportal.de/rss/polizei/laender/12.rss2'),
        (u'Polizei SL', u'http://www.presseportal.de/rss/polizei/laender/13.rss2'),
        (u'Polizei SA', u'http://www.presseportal.de/rss/polizei/laender/14.rss2'),
        (u'Polizei TH', u'http://www.presseportal.de/rss/polizei/laender/15.rss2'),
        (u'Polizei ST', u'http://www.presseportal.de/rss/polizei/laender/16.rss2'),

    ]

    def print_version(self, url):
        # Separate the last part of the Url : http://www.presseportal.de/pm/70776/3120111
        #  tuple it in partitions (from the right) at the edges of
        #     the '/' symbol : ('http://www.presseportal.de/pm/70776','/','3120111')
        #  take the last of this tuples : '3120111'
        # and split this at the symbol '.' (if there) : ('3120111',)
        # from this take the first tuple. '3120111'
        side = (url.rpartition('/')[-1]).rsplit('.', 1)[0]
        # print 'ConvertPrintURL from :  ' + url + '/n to ' + side
        printurl = 'http://www.presseportal.de/print/' + side + '-print.html'
        return printurl
PK�X����pressonline.png�PNG


IHDR��h6�IDATx�c8&.N"W�T�Ç�۶]	$��HH M�׋	h�x��)55 	��L�:�����׭[�
�EF�ȿ_�~�z��f?��J�!���@�,@.����4g�D�S��@�J@.D��G��iX#��VIEND�B`�PK�X�-�!
!
pressonline.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
pressonline.rs
'''

import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class PressOnline(BasicNewsRecipe):
    title = 'Press Online'
    __author__ = 'Darko Miletic'
    description = 'Press Online portal dnevnih novina Press.Najnovije vesti iz Srbije i sveta,Sport,Dzet Set,Politika,Hronika,Komenteri,Zabava,Slike,Video,Horoskop,Nagradne igre,Kvizovi,Igrice'  # noqa
    publisher = 'Press Publishing group'
    category = 'news, politics, Serbia'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = True
    language = 'sr'

    lang = 'sr-Latn-RS'
    direction = 'ltr'

    extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif}'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    feeds = [

    (u'Vesti Dana', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=37'),
    (u'Politika', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=29'),
    (u'U Fokusu', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=33'),
    (u'Globus', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=40'),
    (u'Komentar Dana', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=62'),
    (u'Hronika', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=39'),
    (u'Regioni', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=56'),
    (u'Republika Srpska', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=51'),
    (u'Beograd', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=43'),
    (u'Dzet-Set Svet', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=41'),
    (u'Lifestyle', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=42'),
    (u'Sport', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=44'),
    (u'Press Magazine', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=63'),
    (u'Lola', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=70'),
    (u'Duplerica', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=72'),
    (u'Presspedia', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=80'),
    (u'Kolumne', u'http://www.pressonline.rs/page/stories/sr.html?view=rss&sectionId=57')
    ]

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        soup.head.insert(0, mlang)
        return self.adeify_images(soup)
PK�X����pressthink.png�PNG


IHDR:����IDATx�c�� W���w�&B�ꥻUJ��^�	\����j�u&p��E]՗?���U���w�P���Pw��
X�v܀�q�e�L�U7�\�;#���]$w�����GS뿃,p���E!{���j8�*pm��o��ʻ��t�aIEND�B`�PK�X�_�		pressthink.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
pressthink.org
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class PressThink(BasicNewsRecipe):
    title = 'PressThink'
    __author__ = 'Darko Miletic'
    description = 'Ghost of democracy in the media machine'
    oldest_article = 60
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'Arthur L. Carter Journalism Institute'
    category = 'news, USA, world, economy, politics, media'
    language = 'en'
    publication_type = 'blog'
    extra_css              = """
                                body{ font-family: Helvetica,Arial,sans-serif }
                                img{display: block; margin-bottom: 0.5em}
                                h6{font-size: 1.1em; font-weight: bold}
                                .post-author{font-family: Georgia,serif}
                                .post-title{color: #AB0000}
                                .says{color: gray}
                                .comment {
                                    border-bottom: 1px dotted #555555;
                                    border-top: 1px dotted #DDDDDD;
                                    margin-left: 10px;
                                    min-height: 100px;
                                    padding: 15px 0 20px;
                                }
                             """

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    remove_tags = [dict(name=['form', 'iframe', 'embed',
                              'object', 'link', 'base', 'table', 'meta'])]
    keep_only_tags = [dict(attrs={'class': [
                           'post-title', 'post-author', 'entry', 'postmetadata alt', 'commentlist']})]

    feeds = [(u'Articles', u'http://pressthink.org/feed/')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        for alink in soup.findAll('a'):
            if alink.string is not None:
                tstr = alink.string
                alink.replaceWith(tstr)
        return soup
PK�X݂!���private_eye.png�PNG


IHDR((�/:�IDATxڵ�yHTQ�g\Fg�Jۭ�4+[0ʈ���B�h���
�"*�J"4Sт"���4�hE� [�2uD+�q��q�Y�1��)�Ѝ�;����|�T�!�,˵5���d���N���doOon����.f��T6�T��j�����С���3f������k�Z���ٳ�����(�4�;�����LJ~�d��i�7o^rr2����O��*UGGGPPМ9sz{{kkks8x������7��������^x���&}JJʆ
>800088x�ȑ����)����lMMM-..noo���_�~=����@�6;';$$�Š*��!Ҝ������p�BKKk����2�7���.,��k�؋��� ��LD�߿/IҥK�"�#���������Op˜4i� �:�{xq��l�h�����޾}{��]I��ܹS[[;z�芊
��,��:-k�g(��8z��xC���;���իDzh‘���L���X�
c,"�"��?~<�;w�Z�vmrj
�{���!�>|(,,�j��F�\��j����p���+W666�HL����?��q��1hGb	�@�<y�S����m޼��ɓd��3��]�h��Ƿ��-[�+%�� ������b�
�M,-GS0A�%�d4!���,#4�c��*Q�9q�4�L�޽{��UDD�g��LJJ��UVV�/f�R�ղ�K`7�8��@��F�*++���1bě7o ��������ʼn������@\��
������ǨT���ΝK���T�
+}�j޽ۀ��L"��=�O�<	��b��¯�[�=<����O���	�N�;u���zIIɣG���?}�nx�>��+�0!iQ)9aGdd�e��$?�4�kt�q��!.�NǤ����-6�2��V���7�����N����e�-���vG{;/X�V�V�<
�aTC���!�2�����+I-�"��]ii)�̙Lf��b��x�>}zgggҚ�*unn.G҆Mf3�{Ϟ=gϞ�E~��5&&q��񛬅�S�>���8184d��U[
5uJkk+��bɥ����A>A)��6mC�#G�nٚu�\c}CUe���>s+�S�������'��-�'s(�FX��m۷�x�6��{�����_�6�333�a%e����&n

K&���w̘14��4%����.Kq�gwwus�����D�vI�W�.�VN�۳޸Z'&&R�����7nܸi�&�����?=
M!@�A_�]y��f�n@b�+��
t�����Y)�q�O���t8�=�גNTJ��M��h�0,Y��(�b%��ƎK�

�s�텪ы�A��� �FHh��ό�ϟ??����:Y�'DF"�L�d
��X���4G�0aB�g�۷���YYY����7Tn��BF�	�rU]�Piww7����+##�ۻwo��ygΜy��M�(��*�tC� �(��>}��)����q��5,#�|]�x1U�t�2O��"�ݻG!��������<��t�R�TUU�H�}��u��i��-�__�Ë����(F��%��f��)�f���|U��oݺ$���'���!J.AE;�?
j�gp�&&"G���
�s$_�J���_�-�C��l��o^��D{̓�N2�PNZ�n��|O����E�!��Z�$-\�Œ�+V��8q"uS��A8Y<7��u�mm\��!L���A��/��zYKs3
Č/DIh���˗���NhyA�|I�F}�˗��%��0tqL?q�1��A-�	^��)&&	�X�~��e#U�jZ���d�Kvr�m�N�>������v��q������w⋋LKOO'Fb^,��� ^��IEND�B`�PK�X�	��&�&private_eye.recipe'''
Fetch Private Eye (Online Edition)
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime, timedelta

class PrivateEyeRecipe(BasicNewsRecipe):
    ##
    # Last Edited:  2023-07-14
    #
    # Remark:   Version 3.1 2023-07-14
    #               Show crossword on right so clues are continuous down left
    #               Link to crossword image removed
    #               Improve many image layouts
    #           Version 3.0 2023-07-01
    #               Rewrite (by Sophist-UK) to fit latest web pages, correctly identify pages to include
    #               and improve formatting.
    #               Edited to add:  inclusion of About page,
    #                               identifying series number and publication date and setting metadata.
    #

    title = u'Private Eye (Online Edition)'
    description = u'Private Eye is a fortnightly British satirical and current affairs magazine, edited by Ian Hislop'
    publication_type = 'magazine'
    language = 'en_GB'
    encoding = 'utf-8'
    oldest_article = 13
    max_articles_per_feed = 100
    remove_javascript = True
    ignore_duplicate_articles = {'url'}

    __author__ = u'Martyn Pritchard & Sophist-UK'
    __copyright__ = '2020, Martyn Pritchard <MPritchard2k9@gmail.com> & Sophist-UK <sophist-uk@sodalis.co.uk>'

    current_issue   = 'https://www.private-eye.co.uk/current-issue'
    about_page      = 'https://www.private-eye.co.uk/about'
    masthead_url    = 'https://www.private-eye.co.uk/grfx/logos/logo-new.png'
    author = 'Private Eye'
    series = title = 'Private Eye Online'
    conversion_options = {
        'authors':      author,
        'author_sort':  author,
        'series':       series,
        'series_index': 0,
        'title':        title,
        'title_sort':   title,
    }

    def get_cover_url(self):
        soup = self.index_to_soup(self.current_issue)

        for img in soup.findAll('img'):
            src = img['src']
            if src.endswith('_big.jpg'):
                file_name = src.rsplit('/',1)[1]
                if file_name is None:
                    file_name = src
                try:
                    self.conversion_options.update({'series_index': int(file_name[:-len('_big.jpg')])})
                    self.log('series-index:', self.conversion_options['series_index'])
                except (TypeError, ValueError):
                    # wrong big image
                    continue
                return src
        return None

    def parse_index(self):
        soup = self.index_to_soup(self.current_issue)

        # Get publication date
        sidebar = soup.find('div', attrs={'id': 'current-issue-sidebar'})
        next_issue_text = sidebar.find('b').nextSibling.strip()
        try:
            day, month, year = next_issue_text.split(' ')
            day = ''.join(c for c in day if c.isdigit())
            pub_date = datetime.strptime(" ".join((day, month, year)), "%d %B %Y") - timedelta(12)
            self.log('pub-date:', pub_date)
            self.conversion_options.update({'pubdate': datetime.strftime(pub_date, "%d %B %Y").lstrip("0")})
            title = self.title + " " + datetime.strftime(pub_date, "%Y-%m-%d")
            self.conversion_options.update({'title': title})
            self.conversion_options.update({'title_sort': title})
        except (TypeError, ValueError):
            # Bad date
            self.log('Cannot parse next issue date from:', next_issue_text)

        # Get pages first from the sub-menu, and then from the contents panel.
        # Duplicates will be eliminated automatically.
        articles = []
        for menu_attrs in (
            {'class': 'sub-nav-bar', 'id':'sub-nav-box'},
            {'class': 'article', 'id': 'block-left'},
        ):
            menu = soup.find('div', attrs=menu_attrs)

            if not menu:
                continue

            for a in menu.findAll('a', href=True):
                title = a.getText().rstrip(' »\n')
                if not title:
                    continue
                articles.append({
                    'title': title,
                    'url': a.get('href'),
                })

        if not articles:
            raise ValueError('Private-Eye Online index of pages not found')

        # Add the About page as a final article
        articles.append({
            'title': 'About Private Eye',
            'url': self.about_page,
        })

        self.log('parse_index:', articles)

        return [('Private Eye', articles)]

    def preprocess_html(self, soup):
        # Remove <a> tag link to crossword image
        for tag in soup.findAll('a', {'href': re.compile(r'/pictures/crossword/')}):
            self.log("Removing link to crossword image...")
            tag.unwrap()

        # Remove align tag in crossword image (so float right works)
        for tag in soup.findAll('img', {'src': re.compile(r'/pictures/crossword/')}):
            if "align" in tag.attrs:
                self.log("Removing crossword image align attribute...")
                del tag.attrs['align']

        return soup

    # We remove vast swathes of HTML which is not part of the articles.
    # Remove sibling content
    remove_tags_before =  [
        {'name': 'div', 'class': "article"},
        {'name': 'div', 'id': "page"},
        {'name': 'div', 'id': "page-wide"},
        {'name': 'div', 'id': "content"},
        {'name': 'a', '  attrs': {'href': 'https://shop.private-eye.co.uk'}},
    ]
    remove_tags_after = remove_tags_before.copy()
    remove_tags_after.append(
        {'name': 'div', 'id': 'about-covers'},
    )
    # Remove non-sibling content
    remove_tags = [
        {'name': 'div', 'attrs': {'id': 'top-bar'}},
        {'name': 'div', 'attrs': {'id': 'header-wide'}},
        {'name': 'div', 'attrs': {'id': 'footer-wide'}},
        {'name': 'div', 'attrs': {'id': 'follow-buttons'}},
        {'name': 'div', 'attrs': {'id': 'sidebar'}},
        {'name': 'div', 'attrs': {'id': 'sections-sidebar'}},
        {'name': 'div', 'attrs': {'id': 'nav-box-sections-mobile'}},
        {'name': 'div', 'attrs': {'id': 'nav-box-pages-mobile'}},
        {'name': 'div', 'attrs': {'id': 'about-covers'}},
        {'name': 'a', '  attrs': {'href': 'https://shop.private-eye.co.uk'}},
        {'name': 'iframe'},
        {'name': 'link', 'attrs': {'href': re.compile('/javastyle/lightbox/')}},
        {'name': 'link', 'attrs': {'href': re.compile('/javastyle/news_ticker/')}},
        {'name': 'link', 'attrs': {'href': re.compile('/javastyle/media-queries-')}},
    ]

    # Convert headers to h1, strapline to h4
    preprocess_regexps = [
        (
            re.compile(
                r'<span class="headline(?:-new)?">(.*?)</span>\s*(?:<br>\s*)*(?:<span class="text">(.*?)</span>)?',
                re.DOTALL | re.IGNORECASE
            ),
            lambda match: '<h1>' + match[1] + '</h1>' +
                         (('<h4>' + match[2] + '</h4>') if match[2] else '')
        ),
    ]

    # The following extra css is to tweak the formatting of various elements of various article pages.
    # Unfortunately, there are a variety of different pages styles, hence the extended tweak list.
    # Some of these mimic the actual layout.css which does not seem to make it across into the calibre
    # ebook without duplicating it as extra css.
    # However some is new css to tweak output when part of an ebook.
    extra_css = ' \n '.join([
        '#content img {float: right; width: 45%; minimum-width:350px;}',
        '#content img.cartoon-left {float: left; margin-right: 15px; margin-bottom: 15px;}',
        '#content img.cartoon-right {float: none; margin-bottom: 15px;}',
        '#content img.strip {float: none; width: 100%;}',
        '#content img:first-child {float: none;}',
        '#content img.gnitty-right {float: none; width: 160px;}',
        '#content #story > div[align=right] > img:first-child {float: none; width: 15px;}',
        '#content #story > img:first-child {float: none; height: 100px; width: none; minimum-width: none;}',
        '#content #block-sections img {float: none; width: none;}',
        '#content #block-sections img.lookalike {float: none; width: 100%;}',
        '#content #block-sections img.photo-right {float: right; width: 25%; min-width:120px; margin-left: 15px;}',
        '#content #block-sections > p:last-child > img:first-child {float: none; width: 120px;}',
        '#content #block-sections > p:last-child > img:nth-child(2) {float: none; width: 120px;}',
        '#content #block-sections img.crossword {float: right; width: 40%; margin-left: 15px; min-width: 350px;}',
        '#content #article-caption-box {float: right; background: #222222; display: block; width: 40%; min-width: 250px; font-size: 90%; margin-left: 15px;}',
        '#content #article-caption-box img {float: none; width: 100%; max-width: none;}',
        '#caption-box {color: #ffffff; text-align: center; padding: 5px 20px 15px 20px;}',
        '#whatsapp {border-left: 5px #8aba60 solid; border-right: 5px #8aba60 solid; border-bottom: 5px #8aba60 solid; padding: 0 20px 20px 20px;}',
        '#whatsapp::after {clear:both;}',
        '#whatsapp .whatsapp-left, .whatsapp-right {margin: 0 0 20px 0; padding: 15px; border-radius: 10px;}',
        '#whatsapp .whatsapp-left, .whatsapp-right {font-family: Helvetica, Arial, "sans-serif"; font-weight: 300; font-size: 18px; line-height: 24px;}',
        '#whatsapp .whatsapp-left {text-align: left; margin-right: 30%; background-color: #eeeeee;}',
        '#whatsapp .whatsapp-right {text-align: right; margin-left: 30%; background-color: #dce5ae;}',
        '#whatsapp .whatsapp-left img, #whatsapp .whatsapp-right img {width: 35px; margin: 0 10px; vertical-align: middle;}',
        '#whatsapp .whatsapp-left img.emoji, #whatsapp .whatsapp-right img.emoji {max-width: 35px; margin: 0 5px; vertical-align: middle;}',
    ])
PK�X����pro_linux_de.png�PNG


IHDR  D���]PLTE���KKKs��{{{���8f�Is�9g�UUU\\\ccc:g�x��z��Co�~�������Ǘ�̠���������������DDDGr�m������+WIDATx��ʳ���o����.�u�ގ{���lz0F$�Y#�,-P�a��h)���K8�q}a�eZ�!�yk�w�3�":u?"�oTIEND�B`�PK�X�iUcpro_linux_de.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1295265555(BasicNewsRecipe):
    title = u'Pro-Linux.de'
    language = 'de'
    __author__ = 'Bobus'
    oldest_article = 3
    max_articles_per_feed = 100

    feeds = [(u'Pro-Linux', u'http://www.pro-linux.de/backend/pro-linux.rdf')]

    def print_version(self, url):
        return url.replace('/news/1/', '/news/1/print/').replace('/artikel/2/', '/artikel/2/print/')

    remove_tags_after = [dict(name='div', attrs={'class': 'print_links'})]
PK�X������pro_physik.png�PNG


IHDR  ���IDAT��is���9ۻH�,ɖo�CB��aS�u��O��'�S�e�e�@g5��=�lk������C���h�""%i0N�x����{��3�ex��a������[7V߾��X+�����xx���>�o�Nah��O2�A	�����`�R�S�`�
�u�V~u}�9���C��)D9�V��W�������N�qn��������
3Dp�pl�h��KKs L��(Y)�+���j�@�F�F��fe�rm}����?���=�U���O�Q��V*�8�R�ʞ��FKY�Mc.�˴�������|-҃�ΝG��K�e��Ъ�t��Ja��
���0@x�:����`c�����F��g�p
��GI�P�#0sa-�C �4���L�N���F��y�*0f���~q��[�nu�}眬��Ԩ\�Lj@��RM�O6������;��zc烛������-O{�!
}=��Y��v�/��ʞ�u��2�p^�ONz�O�_��Ӭ���I�%뫻��_��v�J�3�BN���$i��ex�p"�s����^��n��=:�|ggm�1���݅j�F<-V��FX�	�J	���^��#�^VO�J�4�����U��xy��[	a�7�G"�ʘ+��y�i�rRx����	r�9i��;�s��S�i�t8N�S�GIa�QRzF]\�7/a�"��`���s��SS8�s�B�6�6/�u� S�Л�c0�<��J�y�޽��,xt��"��'r+�αNƩ�r�{��X
��D�3��5_Y��X/V-��s'ZH���X��B���0�9��I��<�MZ
2%-yZ�FJ�1�x����6�:r[�b!I)e�D��)�雯�wM6*C����:��D��}�j�?W6J9���\��v7��a���K>T�jA�17^�v/.�DK�sO�6��zxx<�t�p�8_����(��L���鰿ݖ�v��@팄�����P���q:_:��z�S�MKk�A���Z�7���qg��n�����jm���Agm՟������fL�ӶM/6zp�G5�8��#�м��r^�(��4��;7V~���+�G=�m�~��҃=������`k�.5z�	�h���N��i!1c+�F�ťh���ֵ��T��Z�.Ժ��2�7M�A�>*�v[����83����`�ՕA�������B�f0�H�F�uo�^0��[�:d
���͓~p��l렛fqɠpd��Z�vG���z��!��)��x�g �9>��g[%���[���|�yo{�3$P%4��1��)�������Ad�%�;u.�8Tt"�������[���'�}�ն�j����Q�h0�s+A�B�tN`Fq�}������uTިUߑz��ۣ�Gǟ�;��G�ۇ�a��1��=՛�y!�x�XdE>�=y����x�Σ����j�Z��R%����ѓ�֝�_>n���Ӂ�l�,3��BI[�L��	�FC��}��"�$ ��w��U�f\�B}��}�l�M'I2O�Ya���\�Lx��FJ��������J���I�uSr�*�y�8g"%��������1~D����5c��rcu���dE&��9-�y:Ml�i�d� !� �s������$6�(Q��c$�dTg�,J��X�ki�~��-��u>�`f��;~���D��tZ1f�'�}z�?�'I�Ea�Z&X�`���tD$�v�1����
���0~�w�}����n��$�9v�)3�D�҂�;�~�s���g�:��`�'��L�1~"�3�L�"k�`��Y�����ɒLj���f�O���!��R�HIEND�B`�PK�X)�S�VVpro_physik.recipe##
## Written:      November 2012 (new coding)
## Version:      3.4
## Last update:  2024-02-11
##

from calibre.web.feeds.recipes import BasicNewsRecipe
class AdvancedUserRecipe1303841067(BasicNewsRecipe):

    title          = u'Pro Physik'
    __author__  = 'schuster, Armin Geller' 
    # AGE Upd. 2012-11-28, 2019-02-09,
    #     2019-02-18, 2024-02-11
    # https://www.mobileread.com/forums/showthread.php?t=133184
    
    oldest_article        = 7
    max_articles_per_feed = 100

    no_stylesheets        = True
    remove_javascript     = True
    remove_empty_feeds    = True
    language              = 'de_DE'     
    
    # In case you want to assign a cover picture to this recipe.
    # Copy the file Pro_Physik.png to:
    # c:/Users/YOUR_USERNAME/AppData/Roaming/calibre/resources/images/news_covers/
    # where YOUR_USERNAME needs to be replaced with your username.
    # Then remove # in front of cover_url and replace YOUR_USERNAME with your username as well
    
    # cover_url = file:///c:/Users/YOUR_USERNAME/AppData/Roaming/calibre/resources/images/news_covers/Pro_Physik.png
    
    extra_css      =  '''
                        h1 {font-size: 1.6em; text-align: left}
                        h2, h3 {font-size: 1.3em;text-align: left}
                        h2.subtitle {font-size: 1.2em;text-align: left;font-style: italic}
                        h4, h5, h6 {font-size: 1em;text-align: left}
                        div.caption, div.source {font-size: .75em; font-weight: normal;margin-bottom: .75em}
                      '''

    keep_only_tags    = [
                          dict(name='article', attrs={'id':['story']}),
                          dict(name='div', attrs={'class':['event-item view-mode-default']})
                        ]
                        
    remove_tags = [
                       dict(name='ul', attrs={'class':["wj-share-buttons"]}),  #Block social media
                  ]

    feeds = [
              (u'Nachrichten', u'https://pro-physik.de/rss/news/'),
#              (u'Veranstaltungen', u'https://pro-physik.de/rss/events/'), # AGe 2024-02-11
            ]PK�X�n��JJproject.png�PNG


IHDR  szz�IDATx��֥V�Q�a��2ׂ�(�K���q(H�������N���v�H96���T�˸��,gT_~cQt
�0�&���G����
� C�8��(@(-��<at�Yt�����W$�v�^���,�&�OB@=M����	��3	k�X�	ؒ0B�#!��& YB@���Ň?�/�X>���RD��>
^|T���[rx����'���_F������w؀X���(�v�!h�<�2����͓\���IEND�B`�PK�XX�ْ;;project.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Project(BasicNewsRecipe):
    title = '\u041F\u0440\u043E\u0435\u043A\u0442'
    __author__ = 'bugmen00t'
    description = '\u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0438\u0437\u0434\u0430\u043D\u0438\u0435, \u0441\u043E\u0437\u0434\u0430\u043D\u043D\u043E\u0435 \u0431\u044B\u0432\u0448\u0438\u043C \u0433\u043B\u0430\u0432\u043D\u044B\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u043C \u0442\u0435\u043B\u0435\u043A\u0430\u043D\u0430\u043B\u0430 \u00AB\u0414\u043E\u0436\u0434\u044C\u00BB \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0421\u041C\u0418 \u0420\u043E\u043C\u0430\u043D\u043E\u043C \u0411\u0430\u0434\u0430\u043D\u0438\u043D\u044B\u043C, \u043A\u043E\u0442\u043E\u0440\u0435 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u0443\u044E\u0435\u0442\u0441\u044F \u043D\u0430 \u0440\u0430\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0439 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u0438\u043A\u0435.'  # noqa
    publisher = '\u0420\u043E\u043C\u0430\u043D \u0411\u0430\u0434\u0430\u043D\u0438\u043D'
    category = 'blog'
    cover_url = u'https://proektmedia-stat.ams3.digitaloceanspaces.com/2018/08/proektmedia_facebook_default.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 200
    max_articles_per_feed = 20

    remove_tags_before = dict(name='main')

    remove_tags_after = dict(
        name='div', attrs={'class': 'single-post__article js-post-article'}
    )

    remove_tags = [
        dict(name='span', attrs={'class': 'more'}),
        dict(name='span', attrs={'class': 'close'}),
        dict(name='div', attrs={'class': 'socials js-socials-icons'})
    ]

    feeds = [
        ('\u041F\u0440\u043E\u0435\u043A\u0442.', 'https://www.proekt.media/feed/')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self, user_agent='common_words/based')
        return br
PK�X�n��JJproject_en.png�PNG


IHDR  szz�IDATx��֥V�Q�a��2ׂ�(�K���q(H�������N���v�H96���T�˸��,gT_~cQt
�0�&���G����
� C�8��(@(-��<at�Yt�����W$�v�^���,�&�OB@=M����	��3	k�X�	ؒ0B�#!��& YB@���Ň?�/�X>���RD��>
^|T���[rx����'���_F������w؀X���(�v�!h�<�2����͓\���IEND�B`�PK�X��e��project_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Project(BasicNewsRecipe):
    title = 'The Project'
    __author__ = 'bugmen00t'
    description = 'The Project is an independent Russian media specialising in in-depth journalism.'
    publisher = 'Roman Badanin'
    category = 'blog'
    cover_url = u'https://proektmedia-stat.ams3.digitaloceanspaces.com/2018/08/proektmedia_facebook_default.png'
    language = 'en_RU'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 600
    max_articles_per_feed = 20

    remove_tags_before = dict(name='main')

    remove_tags_after = dict(
        name='div', attrs={'class': 'single-post__article js-post-article'}
    )

    remove_tags = [
        #        dict(name='div', attrs={'class': 'stk-grid stk-theme_45496__mb_3'}),
        dict(name='span', attrs={'class': 'more'}),
        dict(name='span', attrs={'class': 'close'}),
        dict(name='div', attrs={'class': 'socials js-socials-icons'})
    ]

    feeds = [('The Project.', 'https://www.proekt.media/en/feed/')]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self, user_agent='common_words/based')
        return br
PK�X�7xr��project_syndicate.png�PNG


IHDR�aIDAT8���=kTQ�g��,Ae��&D#$�P�R����"?�B+K!�����J�2ZH����R�H��{-��\ò
�̙wfޙ��"{E��SΞ��;@f������ylb��W�+8�<��J�D�E�و�9-rR�jy�"r[�b��R��uF6����X���t	>�۸���|k�n���<�|���>�x��X��{�[��(�V>�8��1���f�8�K�ō�1��e+l������U乲����+"�<#rQ��mD��J0�j�V�T�ZI�G��@v��p�k��7�ߎ�<�Y�-�Dv�L>�^%�Y�b�x#�-ۢz�)Q�$.��;�zm�3
ZU;���<�U�%�����.�%�e�;� �IEND�B`�PK�XU�/�%%project_syndicate.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.scraper.simple import read_url
from calibre.ptempfile import PersistentTemporaryFile

class projectsynd(BasicNewsRecipe):
    title = 'Project Syndicate'
    __author__ = 'unkn0wn'
    description = (
        'Project Syndicate produces and delivers original, high-quality commentaries to a global audience. '
        'Featuring exclusive contributions by prominent political leaders, policymakers, scholars, business '
        'leaders, and civic activists from around the world, we provide news media and their readers with cutting-edge '
        'analysis and insight, regardless of ability to pay. Our membership includes over 500 media outlets – more '
        'than half of which receive our commentaries for free or at subsidized rates – in 156 countries. '
        'Download Weekly.'
    )
    language = 'en'
    no_stylesheets = True
    remove_javascript = True
    masthead_url = 'https://www.project-syndicate.org/images/PS_Logotype.svg'
    ignore_duplicate_articles = {'title', 'url'}
    resolve_internal_links  = True
    remove_empty_feeds = True
    remove_attributes = ['style', 'height', 'width']
    oldest_article = 7 # days
    storage = []

    articles_are_obfuscated = True
    def get_obfuscated_article(self, url):
        raw = read_url(self.storage, 'https://archive.is/latest/' + url)
        pt = PersistentTemporaryFile('.html')
        pt.write(raw.encode('utf-8'))
        pt.close()
        return pt.name

    extra_css = '''
        [itemprop^="associatedMedia"]{ font-size:small; text-align:center; }
        [itemprop="author"], time { font-size:small; }
        .sub, em { font-style:italic; color:#202020; }
        [data-page-area="article-bottom"] { font-size:small; color:#202020; }
    '''

    keep_only_tags = [
        dict(attrs={'itemprop':lambda x: x and 'associatedMedia' in x.split()}),
        dict(attrs={'itemprop':['headline', 'datePublished', 'author', 'abstract', 'articleBody']}),
        dict(name = 'aside', attrs={'data-page-area':'article-bottom'})
    ]

    remove_tags = [
        dict(name=['button', 'svg']),
        dict(attrs={'data-message-area':True}),
        dict(attrs={'id':['editorspicks', 'movie_player']}),
        dict(name='aside', attrs={'id':lambda x: x and x.startswith('comments-')})
    ]

    feeds = [
        ('Economics & Finance', 'https://www.project-syndicate.org/rss/section/economics'),
        ('Politics & World Affairs', 'https://www.project-syndicate.org/rss/section/politics-world-affairs'),
        ('On-Point', 'https://www.project-syndicate.org/rss/onpoint'),
        ('Sustainability Now', 'https://www.project-syndicate.org/rss/section/environment-sustainability'),
        ('Smart Development', 'https://www.project-syndicate.org/rss/section/global-health-development'),
        ('Culture & Society', 'https://www.project-syndicate.org/rss/section/culture-society'),
        ('Innovation & Technology', 'https://www.project-syndicate.org/rss/section/innovation-technology'),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'old-src':True}):
            img['src'] = img['old-src'].replace('medium', 'xlarge')
        if abst := soup.find(attrs={'itemprop':'abstract'}):
            if div := abst.find('div'):
                div.name = 'p'
                div['class'] = 'sub'
        for div in soup.findAll('div', attrs={'data-line-id':True}):
            div.name = 'p'
        for a in soup.findAll('a', href=True):
            a['href'] = 'http' + a['href'].split('http')[-1]
        return soup
PK�X$�-�22	projo.png�PNG


IHDR  D���0PLTE������������sss������===000������KKK���bbb���?���IDATxڭ���0_�r�څ2��N̘q>�H��푔&l!]Q��а����dc��kĆN���`�ZT�}����!!�Q��'��	p���c�=H���q���"���Q
�꽐QN�[�$�G�{ �c�,vn:�|�`�x 4U>��hO,�N���h��H��jo��}˸#&��	��ɱ�IEND�B`�PK�XF "u��projo.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class ProvidenceJournal(BasicNewsRecipe):
    title = u'Providence Journal'
    language = 'en'
    __author__ = 'mikebw'
    oldest_article = 10  # days
    max_articles_per_feed = 100

    no_stylesheets = True
    auto_cleanup = True
    use_embedded_content = False
    ignore_duplicate_articles = {'url'}

    publication_type = 'newspaper'
    masthead_url = 'http://www.providencejournal.com/Global/images/head/nameplate/providence-journal_logo.png'

    # ProJo web site often returns blank articles unless print version is
    # explicitly requested
    def print_version(self, url):
        return url + '&template=printart'

# RSS sources documented at
# http://www.providencejournal.com/section/feed?refresh=false

    feeds = [

        ('News',
         'http://www.providencejournal.com/news?template=rss&mime=xml'),
        ('Politics',
         'http://www.providencejournal.com/politics?template=rss&mime=xml'),
        ('Sports',
         'http://www.providencejournal.com/sports?template=rss&mime=xml'),
        ('Business',
         'http://www.providencejournal.com/business?template=rss&mime=xml'),
        ('Opinion',
         'http://www.providencejournal.com/opinion?template=rss&mime=xml'),
        ('Entertainment',
         'http://www.providencejournal.com/entertainment?template=rss&mime=xml'),
        ('Lifestyle',
         'http://www.providencejournal.com/lifestyle?template=rss&mime=xml'),
        ('Food',
         'http://www.providencejournal.com/food?template=rss&mime=xml'),
        ('Cars',
         'http://www.providencejournal.com/cars?template=rss&mime=xml'),
        ('Weather',
         'http://www.providencejournal.com/weather?template=rss&mime=xml'),

    ]
PK�X{�`��promotor.png�PNG


IHDR��h6SIDATx�5�MoU�s���L<6vbGn"�-�J�@
��
�
$�Tm��8�x<��{�����1h-�P��2ob3�!���ABF�Ug�H�o��O�"��~=���aGj-��t�U�?�<�UZ��o��I!]���\���b�RN�H��~yX��,),���/e�]8ېy��/ˇw��bRx��[>/a֒-�`�SӔ���V惸�?П���$�_6�(��~������^�$�^w�:=�����&�m��el�	��v8V����Z��{}�\��'_
~��/�_��$& �胞�bc�����w��ǣc����I�kXCJ<N�U�eY-F��w狡�F��m���Y�`���/R���jh~��/2{���H,) ���(�&) ^<M����D5Ƌ���<���/Y�8�>=-z�$1h��BlX��¬޾���9�[�-�=N2�,۪�6������I���Y�JQ3wS�,�����F���M$,�ƛ���!*
�w4K!��}�}�~\5��`6�'�~���r�x�NralL�ٯ_��ǩ��D4���t;.�u"@��aam����IEND�B`�PK�XWߊ��
�
promotor.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
promotor.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Promotor(BasicNewsRecipe):
    title = u'Promotor'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Auto-moto'
    publisher = u'Promotor'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,TV,Auto'
    encoding = 'utf-8'
    cover_url = 'http://www.promotor.ro/images/logo_promotor.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }
    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'class': 'casetatitluarticol'}),
        dict(name='div', attrs={'style': 'width: 273px; height: 210px; overflow: hidden; margin: 0pt auto;'}),
        dict(name='div', attrs={'class': 'textb'}), dict(name='div', attrs={'class': 'contentarticol'})
    ]

    remove_tags = [
        dict(name='td', attrs={'class': ['connect_widget_vertical_center connect_widget_button_cell']}), dict(
            name='div', attrs={'class': ['etichetagry']}), dict(name='span', attrs={'class': ['textb']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['etichetagry']}), dict(
            name='span', attrs={'class': ['textb']})
    ]

    feeds = [
        (u'Feeds', u'http://www.promotor.ro/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X"�V���propublica.png�PNG


IHDR  D���PLTE�������������������������������Ἴ�����������������
��ܕ��ldc���ypnutu�������tkj��������������QHGKIJB<<*$$!������phfcZY:21GED������|{|���fde���jhi���������IA@������324SKJ���:99.('���ia_ZYY���]UT����|{���ZQO������zsr&! ��������������4.-��~�YIDATx�͐�b�1s��6֬m�����]^��r&:hՉ���-���?c�n���g��Z��͍oo��h�w��u���y�go�_�6��	z��@������q?	.\���I�4ͻ?��Y�$�Ɠ�Z�_�v{�l$�8{�N߷�?d�s��)9���7�`�OިրK)9��֞?��t�Ӳ�T0�J����zwg�)���9=�#��c��
��0Y�&���:�0�iZ��·��X�X����ʧO���n�����4��)����+�_Wh����
�
ɡ}�ǔb�|2�]4�h�����Ku���;n^��g^t��&77�!x]�q�IEND�B`�PK�X=�>���propublica.recipe
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 ProPublicaRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en'
    version = 1

    title = u'Pro Publica'
    publisher = u'ProPublica.org'
    category = u'Political blog'
    description = u'Independent investigative journalism in the public interest.'

    oldest_article = 14
    max_articles_per_feed = 100
    use_embedded_content = False

    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = [
        classes('title-wrapper content-wrapper article-header lead-art article-body')
    ]
    remove_tags = [
        classes('email-signup story-tools newsletter topics-list')
    ]
    remove_tags_after = classes('article-body')

    feeds = [
        (u'Top Stories', u'http://feeds.propublica.org/propublica/main'),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', **classes('lazyload')):
            source = img.findParent('picture')
            if source is not None:
                source = source.find('source')
                if source is not None:
                    img['src'] = source['data-srcset']
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].split()[0]
        return soup
PK�X���m��prosleduet.png�PNG


IHDR  szz�	pHYs��~�ZIDATX��m�U��yٻ�i��6��5)q-Zu{aSD
�h+��?�R"!��R}[�J�^P����!i��R��k��65�z�ܙs�0���.�]�P��p���<��<�<�y��?��p�yW�!Ff_�)�^���W��/pI欀@癋��So��p�/�qoyb���³���n2X�d�\����D�{0��,Knt���O��ذw+~Z��/��|I����7��x�|ƌ������c��5|�MZH,��f��UV�6�k�������ӒL��56��bB�Z���-�8�Hm=�1���
Hl-�l�	��͓���G(��0�)�+���<��8G�|0��w�{�$�hֽWO�����<v�ELJ�=��vp�?ؿ@[���jx� �hZ_������Tt�ǩv9ݷ����5�����e���v�����	��{�9�	y��df=�������w����zL;P!�+���/�2a�3�yP�K>����xp�;����\��
��O�t>?�g� d=�ۅ�=h����V�;!�D@�se��RA���A�(���G���i%�|���AնB���0�!� �=Bx�5�A]�*�����,-��%��DB��j�f4��u7C\��ɘ�~�`L���3~��}���Pn��@RW�v�F�~@QaF�z��	����U6:.p]�ĕʂsP��WΞن�q��}�9�W�c�b��l���
e�RRVP�ӆ��н���)0�\�?m3M�V�|��NN��M��]��rgA�G����Q&5<Mz�vr��|.f�-�x~+��n�ݫ8u�<�0#`�ù�B�K�����j%U"�M>a�-̚��eY������@i!4`�@�F�u��d;(��?+^}d+��j˜=TU[��!́6^i;"nU�T���|a�#ܔ����4�ㅊ���g�-��:�I���^߄���	�D��d/���BՀ�e��6خű}��]��%[�cK'�͝4-�W7��u���jZ��u��@0���(�O�<%�!��� #������߻6��IEND�B`�PK�X%H0���prosleduet.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe

class ProSleduet(BasicNewsRecipe):
    title          	  = '\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u0435\u0434\u0443\u0435\u0442'
    __author__            = 'bugmen00t'
    description           = ('\u0414\u0438\u0434\u0436\u0438\u0442\u0430\u043B-\u043F\u0440\u043E\u0435\u043A\u0442'
                             ' \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u043E\u0432'
                             ' \u00AB\u041D\u043E\u0432\u043E\u0439 \u0433\u0430\u0437\u0435\u0442\u044B\u00BB')
    publisher             = 'Pavel Kanygin, Natalia Zhdanova'
    category              = 'news'
    cover_url = u'https://prosleduet.media/wp-content/themes/prosle/assets/img/logo.svg'
    language              = 'ru'
    no_stylesheets        = True
    remove_javascript = False
    auto_cleanup   = False
    oldest_article = 7
    max_articles_per_feed = 20

    remove_tags_before = dict(name='div', attrs={'class': 'container'})

    remove_tags_after = dict(name='div', attrs={'class': 'container'})

    remove_tags =   [
        dict(name='div', attrs={'class': 'ya-share2 ya-share2_inited'})
        ]

    feeds = [
#        ('\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u0435\u0434\u0443\u0435\u0442', 'https://prosleduet.media/feed/'),
        ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://prosleduet.media/category/news/feed/'),
        ('\u041B\u044E\u0434\u0438', 'https://prosleduet.media/category/people/feed/'),
        ('\u0421\u044E\u0436\u0435\u0442\u044B', 'https://prosleduet.media/category/syuzhety/feed/'),
        ('\u041F\u043E\u0434\u043A\u0430\u0441\u0442\u044B', 'https://prosleduet.media/category/podcasts/feed/'),
        ('\u0420\u0430\u0437\u0431\u043E\u0440\u044B', 'https://prosleduet.media/category/details/feed/'),
        ('\u0413\u043B\u0443\u0431\u0438\u043D\u043D\u0430\u044F \u0420\u043E\u0441\u0441\u0438\u044F', 'https://prosleduet.media/category/glubinnaya-rossiya/feed/')
    ]
PK�X�i9aaprospectmaguk.png�PNG


IHDR  szz�(IDATxڽ�p$[�׶�7NV�~ŵm۶m۶m��H��9]��8���V��9�qwyIcH
��e4-2�,� =K�W������dRȩ��$��
`<�@�V�Ã'��u��m؊��c��u��b-�,[�9KWc���y�v���=�5[wb��8�b�!W(A@�Ⱝ��7x��=�>|�Y�W�ū
TvE~�J;5������
�����
��ß4z"�ܸ
�R�k���3m�`8O%A�����;�=��L�1���#?�s�j���/_S�p��;��5�X����"����Gt0pEg�s�5�Vk��9v�<�85�Ԡ�<		���~��]T'H��u~�p��e�sihp����i�nݙ��Uu��E�A#�ҵ[���ip����љ(�J�6����vT�8�w�r]���O���@�Vc�)v����H�J�ѱ�����F�hо���z���w�^�z��mi(\�s���^|
�D�p��<<�<���y	£���t��s������ �"��1�u@^���y�>h���i�+Ԇ��]�#B"�Ȁ�����{��BU���_غ���H7�{6��7���!4����d%~��%�<�P�[a��x
���x�S����.�F�e#�v���XD�v��m�K��΃G��BC���8y��:[j�4�c����,V���\ �V���(��ȩs��l�#0,�q��F�Z���Ӑ0��9|%kֵvU��`�l�{ŪױTm�{��8��{����3x$s@�L���& 7�8�cզm<d���kJ*B#��-V�BN��"�i��wl�A���kV�9�k���Voف�4RGN��N�HS�/Ŧ]�q��S���)���`H�,EӐ�KW��Aq��t�}�O�r`HI��C[���<%Q��Pܸ�C��_�[/DWqBtUgI���/_�ỡR�/[w����x;f�$z7e4�QY�!)Ij�k�I�UU*I����\��?;�-�%�KIEND�B`�PK�X�r���prospectmaguk_free.png�PNG


IHDR  D���>PLTE�J1����K2�=#�<!�="�D*��A'�M4�@&�L4�F,����L3�N5�O7�M5�w���쨜�,뤗���﷭�Q9�;�z�H/����>#�E,ﵫ�H.�>$ﶬ����?%쫠�����/�0雍�fQ�O6�D+�﹯�m�9�bM�:�������Q9류������쩝琁�G.�W@����o[�B(��G-�XA����nZ︮�cN�R;�K3�3瑁���ꠓ�wd쫟�V>�z���������C)����q]�@%��]F�8�I0�A&�H.雎�9ϋ^�IDATx�ՒSbE1�39���Q۶m�_@�$m��<f��&�%7h|hM�ӺnYQ9��ͫ��}��3��h�n��]�Z�*��F������z4��Ion2-�h3�H i����Y���a���$��]�yf%on~�X��}{�q�[-Q!�.[���v� B����;�V D�0|T=)��*8O]���^�(E��*K�w_�E�c�3������Q��;��ۨ�̺����Iޗ�����6h���t"YJ'P�IEND�B`�PK�X }Bj66prospectmaguk_free.recipe# Copyright (c) 2023 https://github.com/ping/
#
# This software is released under the GNU General Public License v3.0
# https://opensource.org/licenses/GPL-3.0

from collections import OrderedDict
from urllib.parse import urljoin

from calibre.web.feeds.news import BasicNewsRecipe, prefixed_classes

_issue_url = ""


class ProspectMagazineUKFree(BasicNewsRecipe):
    title = "Prospect Magazine (Free)"
    __author__ = "ping"
    description = (
        "Prospect is Britain’s leading current affairs monthly magazine. "
        "It is an independent and eclectic forum for writing and thinking—in "
        "print and online. Published every month with two double issues in "
        "the summer and winter, it spans politics, science, foreign affairs, "
        "economics, the environment, philosophy and the arts."
    )
    language = "en_GB"
    category = "news, UK"
    publication_type = "magazine"
    masthead_url = "https://media.prospectmagazine.co.uk/prod/images/gm_grid_thumbnail/358ffc17208c-f4c3cddcdeda-prospect-masthead.png"
    encoding = "utf-8"
    remove_javascript = True
    no_stylesheets = True
    ignore_duplicate_articles = {"url"}
    INDEX = "https://www.prospectmagazine.co.uk/issues"

    keep_only_tags = [dict(class_="prop-book-article-panel_main")]
    remove_tags = [
        dict(
            class_=[
                "prop-book-review-header-wrapper_magazine",
                "prop-mobile-social-share_header",
                "prop-magazine-link-block",
                "pros-article-body__img-credit",
                "pros-article-topics__wrapper",
                "pros-article-author__image-wrapper",
                "prop-book-review-promo_details-buy-mobile",
            ]
        ),
        dict(id=["disqus_thread", "newsletter_wrapper"]),
        prefixed_classes("dfp-slot-"),
    ]

    extra_css = """
    h1 { font-size: 1.8rem; margin-bottom: 0.4rem; }
    .prop-book-review-header-wrapper_standfirst { font-size: 1.2rem; font-style: italic; font-weight: normal; margin-bottom: 0.5rem; }
    .prop-book-review-header-wrapper_details {  margin-top: 1rem; margin-bottom: 1rem; }
    .prop-book-review-header-wrapper_details-byline {
        display: inline-block; font-weight: bold; color: #444; margin-right: 0.5rem; }
    .prop-book-review-header-wrapper_details-date { display: inline-block; }
    .gd-picture img { display: block; max-width: 100%; height: auto; }
    .pros-article-body__img-caption {
        font-size: 0.8rem; display: block; margin-top: 0.2rem;
    }
    .pullquote, blockquote { text-align: center; margin-left: 0; margin-bottom: 0.4rem; font-size: 1.25rem; }
    .prop-book-review-article_author { margin: 1.5rem 0; font-style: italic; }
    .prop-book-review-promo { margin-bottom: 1rem; }
    """

    def preprocess_html(self, soup):
        # re-position lede image
        lede_img = soup.find("img", class_="prop-book-review-header-wrapper_image")
        meta = soup.find("div", class_="prop-book-review-header-wrapper_details")
        if lede_img and meta:
            lede_img = lede_img.extract()
            meta.insert_after(lede_img)

        for img in soup.find_all("img", attrs={"data-src": True}):
            img["src"] = img["data-src"]
            del img["data-src"]

        for byline_link in soup.find_all("a", attrs={"data-author-name": True}):
            byline_link.unwrap()
        for author_link in soup.find_all("a", class_="pros-article-author"):
            author_link.unwrap()

        return soup

    def parse_index(self):
        if not _issue_url:
            issues_soup = self.index_to_soup(self.INDEX)
            curr_issue_a_ele = issues_soup.find(
                "a", class_="pros-collection-landing__item"
            )
            curr_issue_url = urljoin(self.INDEX, curr_issue_a_ele["href"])
        else:
            curr_issue_url = _issue_url

        soup = self.index_to_soup(curr_issue_url)
        issue_name = (
            self.tag_to_string(soup.find(class_="magazine-lhc__issue-name"))
            .replace(" issue", "")
            .strip()
        )
        self.timefmt = f" [{issue_name}]"

        self.cover_url = soup.find("img", class_="magazine-lhc__cover-image")[
            "data-src"
        ].replace("portrait_small_fit", "portrait_large_fit")

        articles = OrderedDict()
        sections = soup.find_all("div", class_="pro-magazine-section")
        for section in sections:
            section_name = self.tag_to_string(
                section.find(class_="pro-magazine-section__name")
            )
            for sect_article in section.find_all(
                class_="pro-magazine-section__article"
            ):
                articles.setdefault(section_name, []).append(
                    {
                        "url": urljoin(self.INDEX, sect_article.find("a")["href"]),
                        "title": self.tag_to_string(
                            sect_article.find(
                                class_="pro-magazine-section__article-headline"
                            )
                        ),
                    }
                )

        return articles.items()
PK�X��
<��prosport.png�PNG


IHDR  V%(NIDATxڅ�1�@�xzOx����D�R@�>g��ֿL �	0�&��@`L �	0�&��@Ł	l����IEND�B`�PK�XCL~"��prosport.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
prosport.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Prosport(BasicNewsRecipe):
    title = 'Prosport'
    __author__ = u'Silviu Cotoar\u0103'
    publisher = 'Prosport'
    description = u'\u0218tiri Sportive din Rom\u00e2nia'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania,Sport'
    encoding = 'utf-8'
    cover_url = 'http://storage0.dms.mpinteractiv.ro/media/401/581/7946/3688311/1/logo-pro.jpg?width=610'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'a-title'}
             ), dict(name='div', attrs={'class': 'a-entry'})
    ]

    remove_tags = [dict(name='div', attrs={'class': 'utils'}), dict(name='div', attrs={'class': 'g-slide'})
                   ]

    feeds = [(u'\u0218tiri', u'http://www.prosport.ro/rss.xml')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�I�)MMprostamerika.png�PNG


IHDR��h6IDATxڥ���AQ�?�fJEQ��(C��5�IJ�`lb���`�(#@��ή�97�^��_{����Z�����G)���?��iP,R��l��h��r�h�H�\���N�^�|Z�d�T��)�L8_
��-��r�f��a>��fb|��<��f	����Վ$ө|;�y<d-�X�X,L�7��,���ᰄ���� �,�n:t�L2�'��V�Áx\���T�<�:����^�R�h���*�pH����a��vi���t��!x�*����?��s���WIEND�B`�PK�X�^���prostamerika.recipe#!/usr/bin/env python
# encoding: utf-8

__license__ = 'GPL 3'
__copyright__ = 'zotzo'

"""
http://www.prostamerika.com/
"""

from calibre.web.feeds.news import BasicNewsRecipe


class ProstAmerika(BasicNewsRecipe):
    title = 'Prost Amerika'
    language = 'en'
    __author__ = 'rylsfan'
    # authors =
    description = 'Seattle soccer with a European accent. News, features, and match reports.'
    # 4464 fremont avenue n, # 209, Seattle, 98103, United States
    publisher = 'ProstAmerika'
    category = 'Sports'

    oldest_article = 7
    max_articles_per_feed = 100

    cover_url = 'http://img17.imageshack.us/img17/9498/prostamerika.jpg'
    masthead_url = 'http://www.prostamerika.com/soundersfc/wp-content/uploads/2011/02/PASoccer_taglinewhole.jpg'

    encoding = 'utf-8'

    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True

    feeds = [
        (u'Cascadia',   u'http://www.prostamerika.com/category/localfootball/feed/'),
        (u'MLS',        u'http://www.prostamerika.com/category/mls/feed/'),
        (u'EPL',        u'http://www.prostamerika.com/category/epl/feed/'),
        (u'World',      u'http://www.prostamerika.com/category/international-soccer/feed/'),
        (u'Fan Culture', u'http://www.prostamerika.com/category/fan-culture/feed/')

    ]

    keep_only_tags = [dict(name='div', attrs={'id': 'maincontent'})]
    remove_tags = [
        {'class': 'tweetmeme_button'},
        {'class': 'wp-caption-text'}
    ]

    remove_tags_after = [
        {'class': 'tweetmeme_button'}
    ]

    extra_css = '''
               h1{font-family:Didot,Helvetica,sans-serif; font-weight:bold;font-size:large;}
               h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
               p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
               body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�b�-��protagon.png�PNG


IHDR  D����PLTE���'"'.+.����������������""���������������������525������������858�����+'+���������������������㤣���达����������������2.2�����������"������""���������������������������������������������ɯ����"""������������85;���;88���������;8;���Ѣ����@==B@@D@B������DBB���b]]���������c__���feemkk������������ւ�����������+'.����kk��ۗ��������ݬ������������������䘗��_`ᠠᢢἼ������✜������㚚�����������㝜��������������JJ��������������������袠����.""��������������褤��~~�������������oo�����𸸷�����񻺺����ZZ��󼻼�cc����������cc���������������������������������''����������������""�''������������""���������oJ%IDATx^��S�$1�JcǶ��m۶m۶m�֯�4��33�[�y�Ku%$W ��9�u��bLߴ��"�P��`0H��LH�����1�u�@-?�*�o�����o�g\�ռ����?�AP�����V�����v���H���a�$�`�&��.,��D��T" !yY���@�d�h�g,��]ڑ��&>a�Z!��k	k<Z�%5�3J��T�F�X�طO0_$ax�!43(�"AyV\����
DH�?\{����=�OK�w���B($��2���d[�z`�tz�
�K�P>�?-\*h�g�n�V��SX�u@�VecLGw�V�DO�
-��ٰg���G��8e�W�։� �2�C��s���M~X�Yi����+f�lV:�t����
�3[N۶�W&E���S��ܣ{�6��nKJRuN�?M�t���B��W�V_cL�)���*F�EF�K^/��,ҳ�^IQtX800�/�^���NyQ�+8%�Ǡ6�~^`���0��10�h��IEND�B`�PK�X��4��protagon.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class protagon(BasicNewsRecipe):
    title = 'Protagon'
    __author__ = 'Stelios'
    description = 'Opinion articles in Greek'
    oldest_article = 7
    max_articles_per_feed = 100
    publisher = 'Various'
    category = 'GR'
    language = 'el'
    encoding = 'utf8'
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True

    keep_only_tags = [
        dict(name='h1', attrs={'id': ['title']}),
        dict(name='div', attrs={'class': ['freetext']})
    ]

    feeds = [
        (u'\u0398\u03AD\u03BC\u03B1\u03C4\u03B1',
         'http://www.protagon.gr/rss?i=protagon.el.8emata')
    ]
PK�Xl>���protvmagazin.png�PNG


IHDR(-S*PLTE����D�D�D�<�<�T4n�,j�,j�$^�Z�R�F�~3�jIDATx�]��C1�ې��
"=��k6h��3�o����+!_��9��
 lr����_;pX��W�Zk���S[�@��jaH(ޥ���'I�J�[X4�/w����IEND�B`�PK�X1�M��
�
protvmagazin.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
protvmagazin.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Protvmagazin(BasicNewsRecipe):
    title = u'ProTv Magazin'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Ghid TV'
    publisher = u'ProTv Magazin'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,TV'
    encoding = 'utf-8'
    cover_url = 'http://www.protvmagazin.ro/images/logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'class': 'box gradient'})
    ]

    remove_tags = [
        dict(name='p', attrs={'class': ['title']}), dict(name='div', attrs={'id': ['online_only']}), dict(name='div', attrs={
            'class': ['show_article_rating']}), dict(name='ul', attrs={'class': ['breadcrumbs']}), dict(name='p', attrs={'class': ['tags']})
    ]

    remove_tags_after = [
        dict(name='table', attrs={'class': ['connect_widget_interactive_area']}), dict(name='p', attrs={
            'class': ['tags']}), dict(name='dev', attrs={'class': ['connect_widget_sample_connections clearfix']})
    ]

    feeds = [
        (u'Feeds', u'http://www.protvmagazin.ro/rss/articole-noi')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XQ�
�``	psych.png�PNG


IHDR  szz�'IDATX��=kQ���swu�-҈b�"��`#$E{�T������VK-į@���&nt��*���Lf��nvg���{�F����x9�=w�[�v��Rfq-Rj�i��A�r�N)fp�B���N�'�)��j�r;`���<Ue/�i�5ŧN£�Q1�Ο�4���.V���7�̈́��3��ϡ��Z��bD(�Y��t��gu,�E(��p�'�+���C&�
�g+1�%l�n^=�����K1���g_�����aZ[���>?v�}�,�bGy��
��`5M�2D1�͍�NJ���x1|m��3��@���2�X�ء貈;\_��@6�RP?��0W챊pn6dn6���"3:4�3	���r5ʏ@�Ϟ#0�Ud�;	o�G��
�͈��1>��mPYhi#��]��X?x��>'[N�a�u2(^�bV�]���;�WK3�aC��ke�y���ӥkJ�Qo�>��5|���ĩ
i
�"gO�H�����k�ڝ/�^̵ǭ��(����)�2Y0I�IEND�B`�PK�X�p��jjpsych.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.recipes import BasicNewsRecipe


def absurl(url):
    if url.startswith("//"):
        return "https:" + url
    if url.startswith("/"):
        return "https://www.psychologytoday.com" + url
    return url


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class PsychologyToday(BasicNewsRecipe):

    title = 'Psychology Today'
    __author__ = 'Kovid Goyal'

    description = ('This magazine takes information from the latest research'
                   ' in the field of psychology and makes it useful to people in their everyday'
                   ' lives. Its coverage encompasses self-improvement, relationships, the mind-body'
                   ' connection, health, family, the workplace and culture.')
    language = 'en'
    encoding = 'UTF-8'
    no_stylesheets = True
    publication_type = 'magazine'

    keep_only_tags = [dict(attrs={'id': 'block-pt-content'})]
    remove_tags = [classes('pt-social-media')]

    def parse_index(self):
        soup = self.index_to_soup('https://www.psychologytoday.com/us/magazine/archive')
        a = soup.find(**classes('magazine-thumbnail')).a
        self.timefmt = ' [%s]' % a['title']
        self.cover_url = absurl(a.img['src'])
        soup = self.index_to_soup(absurl(a['href']))
        articles = []
        for article in soup.findAll('div', attrs={'class':'article-text'}):
            title = self.tag_to_string(article.find(attrs={'class':['h2','h3']})).strip()
            url = absurl(article.find(attrs={'class':['h2','h3']}).a['href'])
            self.log('\n', title, 'at', url)
            desc = self.tag_to_string(article.find('p',**classes('description'))).strip()
            author = self.tag_to_string(article.find('p',**classes('byline')).a).strip()
            if desc:
                self.log(desc)
            else:
                desc = ''
            articles.append({'title': title, 'url': url, 'description': desc, 'author': author})
        return [('Current Issue', articles)]
PK�X7�u�##psychologies.png�PNG


IHDR��h6�IDATx�mR;��@ˢB,.̢B*ĢB�Iq�
���"�+��ä����\R^RU��"�tuA\�*,)’J�0&�r���G���h�|�L`��߲�\q�y(xO���N@���!�
�s*# ��˫��b����-��	�4�@C�������^���cN
$S0xO�ױ\��-֦'\ʂ	m2Ռ�P�N��F��*X\�ȷ�d
:ƪbJ_�~%�SM"u�&<Z�K@Ⲛ��s{��
��"g��],|K��|��ɜ����v�OnNT�o8hg����-cQ2:^J{�ѷ��wE�s��h������f�}��M_Տ|�/>�w��}���\!2X�+�� Q��T�\���
���0$�����f��������	!��Q�-��7C��D|�8�Y"m�tL6U�����?��NGx�p*��!��|:C��I�U�s|��@�ɤҦR0O��:28u�&
����:݇gܠ:.oIEND�B`�PK�X�DVo��psychologies.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
psychologies.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Psychologies(BasicNewsRecipe):
    title = u'Psychologies'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Psihologie \u015fi Dezvoltare Personal\u0103..'
    publisher = u'Psychologies'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Psihologie'
    encoding = 'utf-8'
    cover_url = 'http://www.psychologies.ro/images/default/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'class': 'nav'}), dict(
            name='div', attrs={'id': 'textarticol'})

    ]

    feeds = [
        (u'Feeds', u'http://feeds.feedburner.com/Psychologies')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XP��JJpubblico_giornale.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = 'iusvar'
__description__ = 'Pubblico giornale'

'''
[url]http://pubblicogiornale.it/[/url]
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Pubblicogiornale(BasicNewsRecipe):
    description = 'Italian newspaper directed by Luca Telese'
    cover_url = 'http://pubblicogiornale.it/wp-content/uploads/logo_n.png?84cd58'
    title = u'Pubblico giornale'
    publisher = 'PUBBLICO EDIZIONI Srl'
    category = 'News'
    language = 'it'
    __author__ = 'iusvar'

    feeds = [
        (u'Politica',  u'http://pubblicogiornale.it/category/politica/feed/'),
        (u'Mondo', u'http://pubblicogiornale.it/category/mondo/feed/'),
        (u'Economia',  u'http://pubblicogiornale.it/category/economia-2/feed/'),
        (u'Sport', u'http://pubblicogiornale.it/category/sport-2/feed/'),
        (u'Cultura', u'http://pubblicogiornale.it/category/cultura-2/feed/'),
        (u'Rete', u'http://pubblicogiornale.it/category/rete/feed/'),
        (u'Illustrazioni', u'http://pubblicogiornale.it/category/illustrazioni/feed/')
    ]
PK�XY��{��publicdomainreview_org.png�PNG


IHDR  �s�sIDAT�koSu�_۱����nm���z���)�n]��u��`�l㲐9Qb�qوT@1 S*���0�24%n��&&���5���w2NF��	x<�otУJ��t��W�U���
w��O�v������&���1L���{�#�ޥ�NCOHcE%�͞��s��V5�#5����fR<�n�3a�KV��o�wz�w��x��ľ˜Z�*���B�ǝ#����IżN�Q�ny{������U��FF����ך;*�[��lv
�$����[��h`�)��A�&h$DD2-���QDY'�O,���QѬ��G���3FԶ��~���O�㛍9<Ԏ�E�ӎ��}�� eb��7P��a��&2��p�#�T���܍�dRu�~��5�j�d�d�`}�v�l�e�����u��G
���<�ؒm���u�)�2K��!�o=��Ԥ��1Q_��}��R=���K��e]S;��{���(��;�	�ߥ���سb�y�:��nG�PBH��Ϙ�2*��Ƿ6Z�@�]���Ax��{0��*z��ܯ��/<qo={���J(�W[�ƝKy�h4���rn�'�A ���܇��B���
)���r��k�e��"�@�T�����x>m�#%��.k*B��_��z���`)�^rS�r@	�
�	�� ��x\��e��R׸��z;��l7�>}?[�
��Jt�Ȕ��]4�.>�N����yjzce]{/��$��R��
f��M�0�ۚ{�Y��]�2Z֯�֭�v*���<��[.�}�l�N�@xE��\���&伢�CX�F8�b���7�~�y,�!wRw|1����rh��ő2��,��d�:Z֭�&�4�^gG������M�Zh"�3�q��,7�1rU�Ь��*�$��cBx���K:^ݷ�"�.�?^����L^�^u��Є�@q'�)�'���2�Nȟ �yՈ�^� �1s�%�1�=r��`N˒��a�"�5𲷨���b�������egI��m�z�Ĵ+�prgĒc�2S�Fڨ$�^es����$ۥ�&K�J9z�[���.��
�O����ޣ?�נ��ID�1�
\�SO�����O�IEND�B`�PK�X����publicdomainreview_org.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class PublicDomainReview(BasicNewsRecipe):
    title          = 'The Public Domain Review'
    __author__        = 'fenuks'
    description   = u'Online journal dedicated to showcasing the most interesting and unusual out-of-copyright works available on the web'
    cover_url      = 'http://publicdomainreview.org/wp-content/themes/pdr/assets/img/pdr-logo.gif'
    category       = 'culture'
    language       = 'en'
    encoding = 'utf-8'
    oldest_article = 14
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_javascript = True
    use_embedded_content = False
    # extra_css      = ''
    # preprocess_regexps = []
    # remove_attributes = ['style',]
    keep_only_tags = [dict(name='article', attrs={'class': re.compile(r'post-\d+')})]
    remove_tags = [dict(attrs={'class': 'synved-social-container synved-social-container-share'})]
    # remove_tags_before = dict()
    remove_tags_after = dict(name='div', attrs={'class': 'entry-content'})
    feeds          = [('Posts', 'http://publicdomainreview.org/feed/')]
PK�X��L�""publico.png�PNG


IHDR  D���$PLTELiq�
�
�
�
�
�
�
�
�
�
�
��ǑtRNS�a�sT2�ـ���IDATx���n�0`�@�}�%������O�d����u�0�^�r~���%>Ħo� �
���-����S��]FT����3����pH��k��C|����ݩ@6t�����۴�	��H� ��@�_��d��S*��K�6�s*�Yb����&f(��IEND�B`�PK�X�6y�
�
publico.recipe#!/usr/bin/env python
__author__ = u'Jordi Balcells'
__license__ = 'GPL v3'
description = u'Jornal portugu\xeas - v1.03 (16 June 2010)'
__docformat__ = 'restructuredtext en'

'''
publico.pt
'''

from calibre.web.feeds.news import BasicNewsRecipe
from polyglot.urllib import urlencode


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class PublicoPT(BasicNewsRecipe):
    description = u'Jornal portugu\xeas'
    cover_url = 'http://static.publico.pt/files/header/img/publico.gif'
    title = u'Publico.PT'
    category = 'News, politics, culture, economy, general interest'
    oldest_article = 2
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'pt'
    remove_empty_feeds = True
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} '
    needs_subscription = True

    keep_only_tags = [
        dict(id='story-content story-header'.split()),
    ]
    remove_tags = [
        classes('social-tools'),
    ]
    remove_attributes = ['style']

    feeds = [
        (u'Geral', u'http://feeds.feedburner.com/publicoRSS'),
        (u'Mundo', u'http://feeds.feedburner.com/PublicoMundo'),
        (u'Pol\xedtica', u'http://feeds.feedburner.com/PublicoPolitica'),
        (u'Economia', u'http://feeds.feedburner.com/PublicoEconomia'),
        (u'Desporto', u'http://feeds.feedburner.com/PublicoDesporto'),
        (u'Sociedade', u'http://feeds.feedburner.com/PublicoSociedade'),
        (u'Educa\xe7\xe3o', u'http://feeds.feedburner.com/PublicoEducacao'),
        (u'Ci\xeancias', u'http://feeds.feedburner.com/PublicoCiencias'),
        (u'Ecosfera', u'http://feeds.feedburner.com/PublicoEcosfera'),
        (u'Cultura', u'http://feeds.feedburner.com/PublicoCultura'),
        (u'Local', u'http://feeds.feedburner.com/PublicoLocal'),
        (u'Tecnologia', u'http://feeds.feedburner.com/PublicoTecnologia')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            postdata = urlencode({
                'username': self.username,
                'password': self.password
            })
            br.open(
                'https://www.publico.pt/api/user/login',
                data=postdata,
                timeout=self.timeout
            )

            br.set_handle_refresh(True)

        return br

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-media-viewer':True}):
            img['src'] = img['data-media-viewer']
        return soup
PK�XP?x��publika.png�PNG


IHDR�a�IDATx����	�0��tG����� #��2�J飈#�~$H"�,�F����G�*9I*�&�)�s,x�*2���D����@*�;~g�z6y5����!@�E`�>#�T�0�A�y�y�8�{���e���l����"n��.l�{YIEND�B`�PK�X0<�0��publika.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
publika.md
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Publika(BasicNewsRecipe):
    title = u'Publika'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'\u015etiri din Moldova'
    publisher = u'Publika'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Moldova'
    encoding = 'utf-8'
    cover_url = 'http://assets.publika.md/images/logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'colLeft'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['articleInfo']}), dict(name='div', attrs={'class': ['articleRelated']}), dict(
            name='div', attrs={'class': ['roundedBox socialSharing']}), dict(name='div', attrs={'class': ['comment clearfix']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['roundedBox socialSharing']}), dict(
            name='div', attrs={'class': ['comment clearfix']})
    ]

    feeds = [
        (u'Feeds', u'http://rss.publika.md/stiri.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�
Ul))punto_informatico.png�PNG


IHDR  D���NPLTE���$$����2�RRR����������ll�(|���lll��������𫫫��������HH�l�������������IDATx����PC�	�{���*��@]�v�TI��$H�q�L��	��`�K�~Q�`�K��z�����<���x\����sX9 0k��`v��T�R\�z��
��n@�`�T��(+�+�T��D�2*����#�SHtX�IEND�B`�PK�X�]M�CCpunto_informatico.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Gabriele Marini'
__copyright__ = 'Gabriele Marini'
__description__ = 'Punto Informatico'

'''
http://www.punto-informatico.it/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class PuntoInformatico(BasicNewsRecipe):
    __author__ = 'Gabriele Marini'
    description = 'Punto Informatico: Internet dal 1996'

    cover_url = 'http://punto-informatico.it/images/logo_8bit.png'
    title = u'Punto Informatico '
    publisher = 'italiaNews High Tech'
    category = 'News, Information Tecnology'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 15
    max_articles_per_feed = 50
    use_embedded_content = False

    remove_javascript = True
    no_stylesheets = True
    keep_only_tags = [dict(name='div', attrs={'class': 'box'})]
    remove_tags = [dict(name='div', attrs={'class': 'boxadv'})]

    def get_article_url(self, article):
        return article.get('id', article.get('guid', None))

    feeds = [(u'Punto Informatico',
              u'http://punto-informatico.it/fader/pixml2.xml')]
PK�X�ȅ3��pure_pc.png�PNG


IHDR(-S0PLTEHZh[jviw�x������������������������������������g)���IDATx�E�ŁPE�<n�Վ|�2ԣ�^Gq��g��0+�J���J�YmT_�V�03�z�]�Ǒ.`;+ƒ�nNq"�nu0���հvD��C�Swӿ1��7�"6ߨ[7�'���������9��[IEND�B`�PK�X����pure_pc.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class PurePC(BasicNewsRecipe):
    title = u'PurePC'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = 'fenuks'
    description = u'Artykuły, aktualności, sprzęt, forum, chłodzenie, modding, urządzenia mobilne - wszystko w jednym miejscu.'
    category = 'IT'
    language = 'pl'
    cover_url = 'http://www.purepc.pl/themes/new/images/purepc.jpg'
    extra_css = '.wykres_logo {float: left; margin-right: 5px;}'
    no_stylesheets = True

    keep_only_tags = [dict(name='div', attrs={'class':'node page0'})]
    remove_tags = [dict(name='div', attrs={'class':'article-options'})]
    feeds = [(u'Wiadomo\u015bci', u'http://www.purepc.pl/node/feed')]
PK�X�0H���pvp_online.png�PNG


IHDR��h6�IDATx�cx���$�@M
�73l��ܚ��Ʊu"�70Wf;�w��s,nF��b�<�S�&�su�<�py%CMa������D�rc4��3A5UT&�_3��Ǐv6v�;��3?y��a��Ս�
�/]�处�Jb���+P���%ؙ� �Ⱦ�>����[�bEgk��
�g�:����l�?}
�޻w���ӧO���[Q^2����P�͂q����m[�͞={���͛7ӧN2�ˊK�a~��
��=]/�2e��Sz{z._��v��ivVVoO�ب`��`�T������6�td(�
�hpqpt�`�\�0����b�������_a�e����K�>u�?7�l1�klom�� ���G�:��9�"��
}��Nj�w���`�3GZ�fRA��%��mTJ�Hx�
G�IEND�B`�PK�X~��kkpvp_online.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1344926684(BasicNewsRecipe):
    title = u'PVP online'
    __author__ = 'Krittika Goyal'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'en'
    remove_javascript = True

    keep_only_tags = [dict(name='div', attrs={'class': 'body'})]
    remove_tags = [dict(name='div', attrs={'class': 'prevBg'}), dict(name='div', attrs={
        'class': 'nextBg'}), dict(name='div', attrs={'class': 'postMeta'})]

    feeds = [(u'Comics', u'http://pvponline.com/feed'), ]
PK�X�ɹ�quanta_magazine.png�PNG


IHDR  D����PLTE�����������������������������������������������������������������������������������������������������������������������:tRNS��K|A�x8L�$�C�y޳B%�t	R�)��n�#�EH�7����N(M�D!�,T�IDATxڵ���0׶��n��U�;E4q���v3N��GB��u�^���NZ������0#��Ɠq�0���9��l��2Wk����������|�
�� O�c��%�p����E_o�e�d�Gg|�����	����L3M5["�He�c�9������{�v����謤4�]΢��T>��Zl/֫Yv/����M�}2��LfNu����Y���	3H�	�IEND�B`�PK�X�}�33quanta_magazine.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class Quanta(BasicNewsRecipe):
    title = "Quanta Magazine"
    __author__ = 'lui1'
    description = "Articles from the magazine. Please set to download weekly."

    oldest_article = 7
    max_articles_per_feed = 100
    language = 'en'
    encoding = 'UTF-8'
    publication_type = "blog"
    cover_url = "https://d2r55xnwy6nx47.cloudfront.net/uploads/2017/05/logo.png"

    feeds = [
        ('Articles', 'https://api.quantamagazine.org/feed/'),
    ]

    keep_only_tags = [
        dict(name="div", attrs={"id": "postBody"}),
    ]

    remove_tags = [
        dict(name="div", attrs={"class": "post__sidebar__content"}),
    ]
PK�X1H!queleer.png�PNG


IHDR  D���JPLTE///������������		���

���999;;;<LL���





������	1145���������@@@���BBB������������NO<��++VVHHHIII^_CCijJJJLKL>��?��OOO{|{|�����gh%%��
UU�T�etRNS  &(((,.022>@BHLPRTTVXXXZhjjnprttz|~~��������������������������������������������z�BIDATxڬ�Cc�1���m۶m'���6w��y��]|#v��8���\�q��#��s5JD�!�>q�l�"[@u�ϐ=�!���AX<� 
C[P�<�ۍ� �ti"���=(���eZ06Y];��I���%H�iJP
V�A=X����I'`MJ�	E�tAѣm�
`�)o� l�Xj��.�]���̂�C�׍��� q
h���~�P�����S�3|��1�:����	3"22/L�x�6���IEND�B`�PK�X�V�]::queleer.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.que-leer.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class QueLeer(BasicNewsRecipe):
    title = 'Que Leer'
    __author__ = 'Darko Miletic'
    description = 'Libros, Novedades en libros, Criticas, Noticias libro'
    publisher = 'MC Ediciones, S.A.'
    category = 'news, books, criticas, libros'
    oldest_article = 7
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'es'
    remove_empty_feeds = True
    masthead_url = 'http://www.que-leer.com/wp-content/themes/queleer/images/backgrounds/que-leer.jpg'
    extra_css = ' body{font-family: Arial,sans-serif } img{margin-bottom: 0.4em} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    preprocess_regexps = [(re.compile(
        r'<h2 class="izq">.*?</body>', re.DOTALL | re.IGNORECASE), lambda match: '')]

    remove_tags = [
        dict(attrs={'class': ['post-ratings', 'post-ratings-loading', 'sociable', 'toc-anchor']}
             ), dict(name=['object', 'embed', 'iframe', 'link']), dict(attrs={'id': 'left'})
    ]

    remove_tags_after = dict(attrs={'class': 'sociable'})
    remove_attributes = ['width', 'height']
    keep_only_tags = [dict(attrs={'class': 'post'})]

    feeds = [(u'Articulos', u'http://www.que-leer.com/feed')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        url = 'http://www.que-leer.com/comprar-libros-tienda-que-leer/libros-recomendados'
        fitem = soup.find('a', href=url)
        if fitem:
            par = fitem.parent
            par.extract()
        return self.adeify_images(soup)
PK�X��--queueacmorg.png�PNG


IHDR(-S�PLTE6�67�67�78�7U�UV�VX�XY�YZ�Za�ae�ef�fh�hm�mp�pq�qv�uw�vx�w�ˉ�Ώ�ϑ�ϒ�Е�ї�Ԟ�՟�՟�ՠ�פ�٪�ۭ���������������������������������������^IDATW��5�0��pw��"0��-vbi�C�V��Bʇ�"���?q�fF�7�s�����鹐⬥�'ѧ9
�Y4�=Lg���)�G���o�{IEND�B`�PK�X�q
��queueacmorg.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
ACM Queue Magazine
'''


class QueueAcmOrg(BasicNewsRecipe):
    title = "ACM Queue Magazine"
    __author__ = 'yodha8'
    description = "Queue is the ACM magazine for practicing software engineers. Published once every 2 months. Example: Jan-Feb."
    oldest_article = 60
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'en'
    cover_url = "https://queue.acm.org/img/acmqueue_logo.gif"

    feeds = [
        ("All Queue Content", "https://queue.acm.org/rss/feeds/queuecontent.xml"),
    ]
PK�X(q7``quotidiano.png�PNG


IHDR  V%('IDAT8�c�O0�* I���1�)5{��ߔ����R���ߦ���z��_ͅ@��lw>�����[q���wf@!���@2��`��120��+H
����d[�0�:�u��(��rH(�!�)	�s�	�� �L@�J��@ C֎Ar�tq ��vV �H�.�ah� �b
C2X�I�V��@F	0(��U�V�'�Լ���"��3g`0��^�`1$�~��8� "�	H8���Qp��+�,-�
�s������������-j\�,d�	��7�:6��#^�R'���IEND�B`�PK�XZ�quotidiano.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__version__ = 'v1.01'
__date__ = '10, January 2010'
__description__ = 'Italian News Agency'

'''
http://www.quotidianonet.ilsole24ore.com/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class panorama(BasicNewsRecipe):
    __author__ = 'Lorenzo Vigentini, based on Darko Miletic'
    description = 'Italian News Agency'

    cover_url = 'http://quotidianonet.ilsole24ore.com/file_generali/img/logo_quotidianonet-top.gif'
    title = u'Quotidiano Net '
    publisher = 'italiaNews'
    category = 'News, politics, culture, economy, general interest'

    language = 'it'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False
    recursion = 10

    remove_javascript = True

    keep_only_tags = [
        dict(name='div', attrs={'class': 'box_contenuto articolo'})]

    remove_tags = [
        dict(name=['object', 'link']),
        dict(name='div', attrs={'class': [
             'post-meta', 'sharing-tools', 'related', 'comments', 'prev-next', 'box_contenuto adsense']}),
        dict(name='div', attrs={'id': ['strumenti', 'related-posts', 'footer',
                                       'inline_boxes', 'inline_boxes_header', 'inline_boxes_body', 'bottom']}),
        dict(name='span', attrs={'class': 'titolosezione default'})
    ]

    feeds = [
        (u'Prima pagina', u'http://quotidianonet.ilsole24ore.com/rss/home.xml'),
        (u'Cronaca', u'http://quotidianonet.ilsole24ore.com/rss/cronaca.xml'),
        (u'Economia', u'http://quotidianonet.ilsole24ore.com/rss/economia.xml'),
        (u'Esteri', u'http://quotidianonet.ilsole24ore.com/rss/esteri.xml'),
        (u'Politica', u'http://quotidianonet.ilsole24ore.com/rss/politica.xml'),
        (u'Salute', u'http://quotidianonet.ilsole24ore.com/rss/salute.xml'),
        (u'Tecnologia', u'http://quotidianonet.ilsole24ore.com/rss/tecnologia.xml'),

    ]
PK�Xr�抾�
rabble_ca.png�PNG


IHDR  V%(�IDAT8�c�O0;~�����ߏ��`W�{rJ���/��G�Ů�/�����\V�p+8Z��,�DŽIҲu����@�Yk�O��*`�Y��?>�����U���?~"g(=;��?&q�
�l���5�D�o�f,ĸ��	}IEND�B`�PK�X��[7��rabble_ca.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class RabbleCa(BasicNewsRecipe):
    title = u'Rabble.ca'
    __author__ = 'timtoo'
    language = 'en_CA'
    oldest_article = 7
    max_articles_per_feed = 100

    cover_url = 'https://upload.wikimedia.org/wikipedia/en/4/44/Rabble.png'
    masthead_url = 'http://rabble.ca/sites/rabble/files/dreamyrabble_logo.jpg'

    feeds = [(u'Rabble.ca', u'http://feeds.feedburner.com/rabble-news')]

    preprocess_regexps = [
        (re.compile(r'<a href="http://rabble.ca/user">.*?to post comments', re.DOTALL | re.IGNORECASE),
            lambda match: 'Tags:'),
    ]

    extra_css = """
            .print-taxonomy { display: inline }
            .print-taxonomy ul { display: inline; margin: 0px }
            .print-taxonomy ul li { display: inline; list-style: none }
            .field-type-date div { display: inline }
            .field-type-link div { display: inline }
            .field-type-text div { display: inline }
            .field-label { font-style: italic }
            """

    def print_version(self, url):
        return url.replace('http://rabble.ca/', 'http://rabble.ca/print/')

    remove_tags = [
        # print version of the web page
        dict(name='div', attrs={'class': ['print-logo']}),
        dict(name='div', attrs={'class': ['print-site_name']}),
        dict(name='hr', attrs={'class': ['print-hr']}),
        dict(name='div', attrs={'class': ['print-links']}),

        # regular web page in case you need to download them
        dict(name='div', attrs={'id': ['header']}),
        dict(name='div', attrs={'class': ['container-submenu']}),
        dict(name='div', attrs={'id': ['sidebar']}),
        dict(name='div', attrs={'id': ['footer']}),
        dict(name='div', attrs={
            'class': ['rabble-nodelinks rabble-nodelinks-top']}),
        dict(name='div', attrs={
            'class': ['rabble-nodelinks rabble-nodelinks-bottom']}),
        dict(name='div', attrs={'class': ['tags-issues']}),
        dict(name='div', attrs={
            'class': ['field field-type-text field-field-summary']}),
        dict(name='span', attrs={'class': ['print-footnote']}),
    ]
PK�XՄ����radikal_tr.png�PNG


IHDR  ��\IDATxڭ�tdi�׶m۶m۶m�۶�6��L�xl<'{�vz�Ɲ9gsΝ������[��.{����F�K��<��ӵ�~�P7pfGڷVs�D�K�"�NN��K"�	�����5鞝�զ�b���.(2)JYyuQ��:ݎ�6���a��D�)��Q�rkt`��ݥQ�˽J�$WR�������1pu�i-�]Y�#w7�=:;�}t�PG�)��%hI�NQ���Gٷܠ{tvdY�B9ArR�5c;v8�����5WڼEE.�K�۬�qm��?yT���A�?tIĭ�2|5����fF�82�͋]�~H�]�蕅�����[�7�#�@�q�Õٽk4��Ÿ/�]G�{M��e�-�Kӽ���o�hHP������\�:s�u��a�rqPY�4;�sŋ���c���[Rh�怼$_7nc�s���
 +HѢ,(j�٪�z��\Qu!H�e��ա>�i���`�=��lD	m4�J����<}�h��NTsGt�)*�$q� su��^C�(���-79��OW�k��*-�*$w�+��DT��z]|�ZM5tD��o}���J�����]���L%q�2R�.%Z5�ݒ<���G����uo.	�h	b�bEwOq�eϕ~�$��Xd-t+�v䁑L��:+s�`�UБ-���	4��dO�3��)�_cQq4�N��E�"������,:c�iy����N�=Ӈ��1�`��,ӷMt�#���։N�����4_��u/)�M{Q|n����}k�X����j������m�Hr�\��	��`�uqv���_��ó<���\[`���{^]xb���6�!
�}k�/.�yi�XI�A�	{ie�1e������ˌ-X#u�b9��@[����s�Yn��aN�iQ���zU���B��ƺ����Nte��&�-�s:I�6�C��"�8���YÎb��Cæڜ�f/<6/z�(��C�A
�-J�r��4�KҼ��bp0\B�m�gfw2�,K^>���t�\t��x!/+�����E����,×�!��:qQ~wi'v�>5�=�8UǶ���]�zg-�Ί�;K�/
NtS�{e�Tq]J�__�ܮ���}?�٠��O��%q�7�@:8�Eq�-��o4}���|�6Z8i~u��:�d��!�����i)%Z�g�l7�F:�s���f`'Q�a}vi$������Q�~@'�۬�)>�9�i~�u��:w��p/.���c�ZKf9��>����5j�Y?��<��6fʔ���OV�w��x�y{i|�#�$�^9�ٟL��z��9ս �,�0����<�_���u��IEND�B`�PK�X'�J��radikal_tr.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2014, Darko Miletic <darko.miletic at gmail.com>'
'''
radikal.com.tr
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Radikal_tr(BasicNewsRecipe):
    title = 'Radikal - Turkey'
    __author__ = 'Darko Miletic'
    description = 'News from Turkey'
    publisher = 'radikal'
    category = 'news, politics, Turkey'
    oldest_article = 2
    max_articles_per_feed = 150
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    auto_cleanup = False
    masthead_url = 'http://www.radikal.com.tr/D/i/1/V2/radikal_logo.jpg'
    language = 'tr'
    publication_type = 'newspaper'
    extra_css             = """ @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                                body{font-family: 'PT Sans',Arial,Helvetica,sans1,sans-serif}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'iframe', 'embed', 'object', 'link', 'base']),
        dict(name='div', attrs={
             'class': ['options', 'news_related', 'browserWidth_shareBox']}),
        dict(attrs={'class': ['breadcrumb clearfix', 'box_title']})
    ]

    keep_only_tags = [
        dict(attrs={'class': ['news-content-header',
                              'news-content-text clearfix',
                              'author-content-text',
                              'news_detail_top',
                              'news_article']})
    ]

    feeds = [

    (u'Yazarlar', u'http://www.radikal.com.tr/d/rss/RssYazarlar.xml'),
    (u'Türkiye', u'http://www.radikal.com.tr/d/rss/Rss_77.xml'),
    (u'Politika', u'http://www.radikal.com.tr/d/rss/Rss_78.xml'),
    (u'Dünya', u'http://www.radikal.com.tr/d/rss/Rss_81.xml'),
    (u'Ekonomi', u'http://www.radikal.com.tr/d/rss/Rss_80.xml'),
    (u'Radikal 2', u'http://www.radikal.com.tr/d/rss/Rss_42.xml'),
    (u'Radikal Hayat', u'http://www.radikal.com.tr/d/rss/Rss_41.xml'),
    (u'Radikal Kitap', u'http://www.radikal.com.tr/d/rss/Rss_40.xml'),
    (u'Spor', u'http://www.radikal.com.tr/d/rss/Rss_84.xml')
    ]
PK�X���i��radio_canada.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

__license__ = 'GPL v3'
__author__ = 'quatorze'
__copyright__ = '2023, quatorze'
__version__ = 'v1.0'
__date__ = '18 June 2023'
__description__ = 'Radio-Canada '

'''
https://ici.radio-canada.ca/rss/
'''

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 RadioCanada(BasicNewsRecipe):
    title            = 'Radio Canada'
    __author__       = 'quatorze'
    timefmt          = ' %Y-%m-%d'
    language         = 'fr'
    encoding         = 'utf-8'
    publisher        = 'ici.radiocanada.ca'
    publication_type = 'newspaper'
    category         = 'News, finance, economy, politics'
    ignore_duplicate_articles = {'title', 'url'}
    oldest_article   = 1.00

    no_stylesheets   = True
    extra_css        = '''
        .blockquote, q, span.signature-name { font-style: italic }
        .footer, p.fQwTrv, p.xWUSX { font-size: 80%; }
        ol { list-style: none; }
        ol li { display: inline; }
        ol li+li:before { padding: 16px; content: ">" }
        ul { list-style-type: none; }
    '''

    keep_only_tags = [
        classes('document-simple-header-container main-multimedia-item signature-container-top '
                ' lead-container e-p picture-attachment-container blockquote framed signature-name'),
        dict(id='picture')
    ]

    remove_tags    = [
            classes('signature-link comment-text'),
            dict(name='aside')
    ]

    feeds            = [
        ('Politique',     'https://ici.radio-canada.ca/rss/4175'),
        ('International', 'https://ici.radio-canada.ca/rss/96'),
        ('Montréal',      'https://ici.radio-canada.ca/rss/4201'),
        ('Société',       'https://ici.radio-canada.ca/rss/7110'),
        ('Justice',       'https://ici.radio-canada.ca/rss/92411'),
        ('Science',       'https://ici.radio-canada.ca/rss/4165'),
        ('Santé',         'https://ici.radio-canada.ca/rss/4171'),
        ('Économie',      'https://ici.radio-canada.ca/rss/5717'),
        ('Techno',        'https://ici.radio-canada.ca/rss/4169'),
        ('Environnement', 'https://ici.radio-canada.ca/rss/92408'),
        ('Le reste',      'https://ici.radio-canada.ca/rss/4159')
    ]

    # The following was copied and adapted as per the following post:
    # https://www.mobileread.com/forums/showpost.php?p=1165462&postcount=6
    # Credit goes to user Starson17
    def parse_feeds (self):
      feeds = BasicNewsRecipe.parse_feeds(self)
      for feed in feeds:
        for article in feed.articles[:]:
            if ('VIDEO' in article.title.upper() or 'OHDIO' in article.title.upper() or
                    '/emissions/' in article.url or '/segments/' in article.url or '/entrevue/' in article.url or '/ohdio/' in article.url
            ):
                feed.articles.remove(article)
      return feeds
PK�X����radio_prague.png�PNG


IHDR  D���<PLTE+5���+8YZe~`j�.'J+N.P22@_8@������������"HP��;kIDATx^��9�0���5M
g�̎SX�
c�̄�’�K譤c����	��T����<Ҕ	l��>V,P�
���^�_l ��5�X��Z�
byZ��
S#��ĴIEND�B`�PK�X�i4�22radio_prague.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1291540961(BasicNewsRecipe):

    title = u'Radio Praha'
    __author__ = 'Francois Pellicaan'
    description = 'News and information from and about The Czech republic. '
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    encoding = 'utf8'
    publisher = 'Radio Prague'
    category = 'News'
    language = 'en_CZ'
    publication_type = 'newsportal'

    extra_css = 'h1 .section { display: block; text-transform: uppercase; font-size: 10px; margin-top: 4em; } \n .title { font-size: 14px; margin-top: 4em; } \n a.photo { display: block; clear:both; }  \n .caption { font-size: 9px; display: block; clear:both; padding:0px 0px 20px 0px; } \n a { font-type: normal; }'  # noqa

    keep_only_tags = [
        dict(name='div', attrs={'class': ['main']})
    ]
    remove_tags = [
        dict(name='div', attrs={'class': ['cleaner', 'options', 'toolsXXL']}),
        dict(name='ul', attrs={'class': ['tools']})
    ]
    feeds = [
        (u'Current Affairs', 'http://www.radio.cz/feeds/rss/en/themes/curraffrs.xml'),
        (u'Society', 'http://www.radio.cz/feeds/rss/en/themes/society.xml'),
        (u'European Union',
         'http:http://www.radio.cz/feeds/rss/en/themes/eu.xml'),
        (u'Foreign policy',
         'http://www.radio.cz/feeds/rss/en/themes/foreignpolicy.xml'),
        (u'Business', 'http://www.radio.cz/feeds/rss/en/themes/business.xml'),
        (u'Culture', 'http://www.radio.cz/feeds/rss/en/themes/culture.xml'),
        (u'Czechs abroad',
         'http://www.radio.cz/feeds/rss/en/themes/czechabroad.xml'),
        (u'History', 'http://www.radio.cz/feeds/rss/en/themes/history.xml'),
        (u'Nature', 'http://www.radio.cz/feeds/rss/en/themes/nature.xml'),
        (u'Science', 'http://www.radio.cz/feeds/rss/en/themes/science.xml'),
        (u'Sport', 'http://www.radio.cz/feeds/rss/en/themes/sport.xml'),
        (u'Travel', 'http://www.radio.cz/feeds/rss/en/themes/travel.xml'),
    ]
PK�X����radio_praha.png�PNG


IHDR  D���<PLTE+5���+8YZe~`j�.'J+N.P22@_8@������������"HP��;kIDATx^��9�0���5M
g�̎SX�
c�̄�’�K譤c����	��T����<Ҕ	l��>V,P�
���^�_l ��5�X��Z�
byZ��
S#��ĴIEND�B`�PK�X.3��<<radio_praha.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1291540961(BasicNewsRecipe):

    title = u'Radio Praha'
    __author__ = 'Francois Pellicaan'
    description = u'Česká oficiální mezinárodní vysílací stanice.'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    encoding = 'utf8'
    publisher = u'Český rozhlas'
    category = 'News'
    language = 'cs'
    publication_type = 'newsportal'

    extra_css = u'h1 .section { display: block; text-transform: uppercase; font-size: 10px; margin-top: 4em; } \n .title { font-size: 14px; margin-top: 4em; } \n a.photo { display: block; clear:both; }  \n .caption { font-size: 9px; display: block; clear:both; padding:0px 0px 20px 0px; } \n a { font-type: normal; }'  # noqa

    keep_only_tags = [
        dict(name='div', attrs={'class': ['main']})
    ]
    remove_tags = [
        dict(name='div', attrs={'class': ['cleaner', 'options', 'toolsXXL']}),
        dict(name='ul', attrs={'class': ['tools']})
    ]
    feeds = [
        (u'Domácí politika', 'http://www.radio.cz/feeds/rss/cs/oblast/dompol.xml'),
        (u'Společnost', 'http://www.radio.cz/feeds/rss/cs/oblast/spolecnost.xml'),
        (u'Evropská unie', 'http://www.radio.cz/feeds/rss/cs/oblast/eu.xml'),
        (u'Zahraniční politika',
         'http://www.radio.cz/feeds/rss/cs/oblast/zahrpol.xml'),
        (u'Ekonomika', 'http://www.radio.cz/feeds/rss/cs/oblast/ekonomika.xml'),
        (u'Kultura', 'http://www.radio.cz/feeds/rss/cs/oblast/kultura.xml'),
        (u'Krajané', 'http://www.radio.cz/feeds/rss/cs/oblast/krajane.xml'),
        (u'Historie', 'http://www.radio.cz/feeds/rss/cs/oblast/historie.xml'),
        (u'Příroda', 'http://www.radio.cz/feeds/rss/cs/oblast/priroda.xml'),
        (u'Věda', 'http://www.radio.cz/feeds/rss/cs/oblast/veda.xml'),
        (u'Sport', 'http://www.radio.cz/feeds/rss/cs/oblast/sport.xml'),
        (u'Cestování', 'http://www.radio.cz/feeds/rss/cs/oblast/cestovani.xml'),
    ]
PK�XM]���radiosvoboda_ua.png�PNG


IHDR  szz��IDATx�b���
�~=3M�P|9�sDq�c'��ؙ�=یm��1+s�/�m�(F��Nv�3���KOl�_�r��W_+xF}9�+����gc��Rɭ>O'?�7A�曋N��a�ؒ̀���2	 ��{ɩ��?����/���_c��ҒD�%=�2
6��Z��o�ճ�?�$��h��3�̬`fK˲��\�V�x�n�w��~��{��b��$�y�G*zVC��+�\�"/�N���Z����}�b��l�GG�0���y!p9z��n�C���l�MK�� R�R�x
%|�ZL�ٓG��|A~�b�\6���n6��)�o,����x�*�Tr��W��	��\���_jjr���ZzόQ�7��I��?�{��F)����Rv7f�SMZ<��l�p����R�U���˦��

��!���=q�=��U�;yKߨ:̕Kn�����X���V_:qA�>.��a<�9�^��l�t�V�b���paR��f��R�E���B�(�|r��[�5�ѢDžȇq.	���b��r�m���'�<</��[扰�8�r��
%�!�_V�Ҿ�LHS'&���gR\(��"�b-�-���k+��~��Q׆{�8��뮉�͗�:�5�ݲo���uԵ��'���EH��j`�Y�X*�D)�&/'J{��g��0�j�3\t�:Y
P}���%]͉���WZ ��'�Qw:�����y��8�|z�]�0`1X�j�s�{_:����{9�{�8}{��{��}{&ͺ��v&��O���-|�r�b煿X���b�f�
{`�*�eV\�l�<�&w����cqN��
�B�����߬?"/��H��w���<���ы�0ક
"�<�p8>z��y	0/G�%��|����sߘ�5($z��|��:����w��&=�~+4IEND�B`�PK�XY��77radiosvoboda_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class RadioSvoboda(BasicNewsRecipe):
    title = '\u0420\u0430\u0434\u0456\u043E \u0421\u0432\u043E\u0431\u043E\u0434\u0430'
    __author__ = 'bugmen00t'
    description = '\u0420\u0430\u0434\u0456\u043E\u0441\u0442\u0430\u043D\u0446\u0456\u044F \u0442\u0430 \u0456\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0432\u0438\u0434\u0430\u043D\u043D\u044F, \u044F\u043A\u0430 \u043F\u043E\u0437\u0438\u0446\u0456\u043E\u043D\u0443\u0454 \u0441\u0435\u0431\u0435 \u044F\u043A \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u0438\u0439 \u043D\u0435\u043A\u043E\u043C\u0435\u0440\u0446\u0456\u0439\u043D\u0438\u0439 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u043E-\u043D\u043E\u0432\u0438\u043D\u043D\u0438\u0439 \u0437\u0430\u0441\u0456\u0431 \u043C\u0430\u0441\u043E\u0432\u043E\u0457 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0457.'  # noqa
    publisher = '\u0420\u0430\u0434\u0456\u043E \u0412\u0456\u043B\u044C\u043D\u0430 \u0404\u0432\u0440\u043E\u043F\u0430/\u0420\u0430\u0434\u0456\u043E \u0421\u0432\u043E\u0431\u043E\u0434\u0430 (\u0420\u0412\u0404/\u0420\u0421)'  # noqa
    category = 'newspaper'
    cover_url = u'https://www.radiosvoboda.org/Content/responsive/RFE/uk-UA/img/top_logo_news.png'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 20

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'id': 'article-content'})

    remove_tags = [
        dict(name='p', attrs={'class': 'buttons btn--load-more'}),
        dict(name='div', attrs={'class': 'share--box'}),
        dict(name='div', attrs={'class': 'c-author__btns m-t-md'}),
        dict(
            name='div',
            attrs={'class': 'col-xs-12 col-md-4 pull-left live-blog-left'}
        ),
        dict(name='aside'),
        dict(name='div', attrs={'class': 'c-blockquote c-blockquote--has-quote'}),
        dict(name='div', attrs={'class': 'media-block also-read'}),
        dict(name='div', attrs={'class': 'media-block-wrap'}),
        dict(name='div', attrs={'class': 'wsw__embed'}),
        dict(name='div', attrs={'id': 'comments'}),
    ]

    feeds = [
        (
            '\u0413\u043E\u043B\u043E\u0432\u043D\u0456 \u043D\u043E\u0432\u0438\u043D\u0438',
            'https://www.radiosvoboda.org/api/zrqiteuuir'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u041A\u043E\u0440\u043E\u043D\u0430\u0432\u0456\u0440\u0443\u0441',
            'https://www.radiosvoboda.org/api/zqk_myekpymv'
        ),
        (
            '\u041C\u0456\u0436\u043D\u0430\u0440\u043E\u0434\u043D\u0456 \u043D\u043E\u0432\u0438\u043D\u0438',
            'https://www.radiosvoboda.org/api/zipkqejjki'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u041F\u043E\u043B\u0456\u0442\u0438\u043A\u0430',
            'https://www.radiosvoboda.org/api/zppkoe-jkp'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u0415\u043A\u043E\u043D\u043E\u043C\u0456\u043A\u0430',
            'https://www.radiosvoboda.org/api/zvpk_eo-kt'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u0421\u0443\u0441\u043F\u0456\u043B\u044C\u0441\u0442\u0432\u043E',
            'https://www.radiosvoboda.org/api/zjmkreybko'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u041F\u043E\u0434\u0456\u0457',
            'https://www.radiosvoboda.org/api/ztpkyei-kr'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u0421\u0432\u043E\u0431\u043E\u0434\u0430 \u0441\u043B\u043E\u0432\u0430',
            'https://www.radiosvoboda.org/api/zmrjoebtjo'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u041A\u043E\u0440\u0443\u043F\u0446\u0456\u044F',
            'https://www.radiosvoboda.org/api/zbobpoetgbpi'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u0412\u0430\u0436\u043B\u0438\u0432\u0456',
            'https://www.radiosvoboda.org/api/zmyqmvebromr'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438: \u0421\u043F\u043E\u0440\u0442',
            'https://www.radiosvoboda.org/api/ztpmmyei-mmy'
        ),
        (
            '\u041F\u0443\u0431\u043B\u0456\u043A\u0430\u0446\u0456\u0457',
            'https://www.radiosvoboda.org/api/ziibp_ejgbpy'
        ),
        (
            '\u041F\u043E\u043B\u0456\u0442\u0438\u043A\u0430',
            'https://www.radiosvoboda.org/api/ziqioejuip'
        ),
        (
            '\u0421\u0443\u0441\u043F\u0456\u043B\u044C\u0441\u0442\u0432\u043E',
            'https://www.radiosvoboda.org/api/z_qi_erkiy'
        ),
        (
            '\u0415\u043A\u043E\u043D\u043E\u043C\u0456\u043A\u0430',
            'https://www.radiosvoboda.org/api/zpyp_e-rm_'
        ),
        (
            '\u041A\u0443\u043B\u044C\u0442\u0443\u0440\u0430',
            'https://www.radiosvoboda.org/api/zmqipebui_'
        ),
        (
            '\u0423\u043A\u0440\u0430\u0457\u043D\u0430',
            'https://www.radiosvoboda.org/api/zqqirekuiq'
        ),
        ('\u0421\u0432\u0456\u0442', 'https://www.radiosvoboda.org/api/zoqiqeguii'),
        (
            '\u0412\u0430\u0436\u043B\u0438\u0432\u0435 \u043D\u0430 \u0421\u0432\u043E\u0431\u043E\u0434\u0456',
            'https://www.radiosvoboda.org/api/zkk-iqemmbii'
        ),
        (
            '\u0412\u0456\u0439\u043D\u0430',
            'https://www.radiosvoboda.org/api/zijqpqej_opi'
        ),
        (
            '\u0414\u043E\u043D\u0431\u0430\u0441',
            'https://www.radiosvoboda.org/api/z_rppyeruppy'
        ),
        (
            '\u041A\u0440\u0438\u043C',
            'https://www.radiosvoboda.org/api/zbypmietqmmi'
        ),
        (
            '\u0422\u043E\u0447\u043A\u0430 \u0437\u043E\u0440\u0443',
            'https://www.radiosvoboda.org/api/zpqiie-uim'
        ),
        (
            '\u041A\u043E\u0440\u043E\u043D\u0430\u0432\u0456\u0440\u0443\u0441',
            'https://www.radiosvoboda.org/api/zok_mvegpymt'
        ),
        (
            '\u0421\u043F\u043E\u0440\u0442',
            'https://www.radiosvoboda.org/api/z-q_mpevk_m_'
        ),
        (
            '\u041A\u0438\u0442\u0430\u0439: \u0432\u0438\u043A\u043B\u0438\u043A\u0438',
            'https://www.radiosvoboda.org/api/zkyymqemqvmo'
        ),
        (
            '\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u0430 \u0432\u0456\u0439\u043D\u0430',
            'https://www.radiosvoboda.org/api/zuoppyepgppv'
        ),
        (
            '\u0420\u0430\u0434\u0456\u043E \u0421\u0432\u043E\u0431\u043E\u0434\u0430 Weekly',
            'https://www.radiosvoboda.org/api/zb_rmyetrqmv'
        ),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438 \u041F\u0440\u0438\u0430\u0437\u043E\u0432\u2019\u044F',
            'https://www.radiosvoboda.org/api/zkkvmyemmtmy'
        ),
        (
            '\u041F\u043E\u0434\u0456\u0457',
            'https://www.radiosvoboda.org/api/z-ppp_ev-ppv'
        ),
        (
            '\u0421\u0445\u0435\u043C\u0438',
            'https://www.radiosvoboda.org/api/z-miprevbipo'
        ),
        (
            '\u0421\u0445\u0435\u043C\u0438: \u0420\u043E\u0437\u0441\u043B\u0456\u0434\u0443\u0432\u0430\u043D\u043D\u044F',
            'https://www.radiosvoboda.org/api/ztvppoeiompo'
        ),
        (
            '\u0421\u0445\u0435\u043C\u0438: \u041D\u043E\u0432\u0438\u043D\u0438',
            'https://www.radiosvoboda.org/api/zyibpreqjbpo'
        )
    ]
PK�X
��a!!randerslokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X@M�DDranderslokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Din avis Randers
'''


class RandersLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Din avis Randers'
    description = 'Lokale og regionale nyheder, sport, kultur fra Randers og omegn på dinavis.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Din avis Randers', 'http://dinavis.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Din avis Randers', 'http://dinavis.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Din avis Randers', 'http://dinavis.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Din avis Randers', 'http://dinavis.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Din avis Randers', 'http://dinavis.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Din avis Randers', 'http://dinavis.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�Xq=yJ��
rbc_ru.png�PNG


IHDR(-SPLTE�������������a�IIDATx�\�1љ4�?�Vi2xdv�S
Q7�ݠH�Ĕ�`��DX=@C����7��ya}#$7�h`��IEND�B`�PK�X��&3ZZ
rbc_ru.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class RBC_ru(BasicNewsRecipe):
    title = u'RBC.ru'
    __author__ = 'A. Chewi (with fixes by bugmen00t)'
    description = 'Российское информационное агентство «РосБизнесКонсалтинг» (РБК) - ленты новостей политики, экономики и финансов, аналитические материалы, комментарии и прогнозы, тематические статьи'  # noqa
    needs_subscription = False
    cover_url = 'https://pics.rbc.ru/img/fp_v4/skin/img/logo.gif'
    cover_margins = (80, 160, '#ffffff')
    oldest_article = 20
    max_articles_per_feed = 50
    summary_length = 200
    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    conversion_options = {'linearize_tables': True}
    auto_cleanup = True
    language = 'ru'
    timefmt = ' [%a, %d %b, %Y]'

    feeds = [
        (
            u'RSS \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            u'https://rssexport.rbc.ru/rbcnews/news/30/full.rss'
        ),
        (
            u'\u0413\u043B\u0430\u0432\u043D\u044B\u0435\u0020\u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            u'http://static.feed.rbc.ru/rbc/internal/rss.rbc.ru/rbc.ru/news.rss'
        ),
    ]
PK�X�4�d��rbcua_ru.png�PNG


IHDR  ��QIDATH���k]U�{�s��{IlLi0��6��"�#)���v�ԡ(tV��8����DT��� �[�"4�SM���Li�$M�&�{����S��*'�ٹ�p�^k�9����O���=�/����d�ߒ�����Y���x��L
aEpD�k�d�N�zR& i�Da.7j��ʡ�:"����G$��Y�q�D2v��7H7�y�[�2-/�~�����{�aQ��=�m?��TS��N�C�g�ly������� 4Q��f؀ȺH��@B/ҋF������[�J���G��]�����jy.�ջr�#^�9"��-�0P�%j*��Y�sU�x�虷O]�.�MaKkZN3�O۴r<���}_f�����
���5�h)t��H&/3��|l�l{������5&�QQTS�e$����Y�Ne��B��DP ���
("�G���H��Ě��11�>�wh��b�t5��"���^���@6C�h(���u�����0�:������`$���I�]�ͻ�:pl��c�-+���QAS��ISTI�0�(��*�ǤW�3Z)!M(�\��\t�g�(A)LP���u������jہolj�jT�+
Jbh��˙�tR9���TZ7���@F]!�y���MA0����D�^�+�e�3��8�����!��~�y$�5��Ѹ\ܣ`��~,O��?B[S%�F%��$17Y
SL�3溌D^�n�8v�4Ԭы�@�aBF�u�[D
�H��;% �]�{��O�?�vkK1�!��{<X�*��R�Mթ�#���G[���\q�YZ�i1��6!	�~x��`R0+�4��l�i�4w;t�ZO���f��ɯn�hX��ВX�iѬ3X�nܪ|4<N)��4��"A�(
�
�U�R'gf��j����뢄E=�������ϸ���^p朲S��F@��� :+Z��N�Fc pn��}Uiu1yBԂNd�ݚ�M����=� L7EV������LT�j�KW�.�l�����"āD�=�/b�(Tk��H]�Ƴ*,8*��M�s��G�s���IEND�B`�PK�XF1�t��rbcua_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class RBCUA(BasicNewsRecipe):
    title = '\u0420\u0411\u041A-\u0423\u043A\u0440\u0430\u0438\u043D\u0430'
    __author__ = 'bugmen00t'
    description = '\u0423\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u043E\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E, \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u0443\u044E\u0449\u0435\u0435\u0441\u044F \u043D\u0430 \u0444\u0438\u043D\u0430\u043D\u0441\u043E\u0432\u044B\u0445, \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0438 \u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043D\u043E\u0432\u043E\u0441\u0442\u044F\u0445 \u0423\u043A\u0440\u0430\u0438\u043D\u044B.'  # noqa
    publisher = '\u041E\u041E\u041E \u00AB\u042E\u0431\u0438\u0442\u0438 \u041C\u0435\u0434\u0438\u0430\u00BB'
    category = 'news'
    cover_url = u'https://www.rbc.ua/static/common/imgs/logo650.jpg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 3
    max_articles_per_feed = 20

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='span', attrs={'class': 'lang-publication'}),
        dict(name='div', attrs={'class': 'share'}),
        dict(name='ins'),
        dict(name='div', attrs={'class': 'read-in-google'}),
        dict(name='div', attrs={'class': 'intext-tags'})
    ]

    feeds = [('\u0420\u0411\u041A', 'https://www.rbc.ua/static/rss/all.rus.rss.xml')]
PK�X�4�d��rbcua_ua.png�PNG


IHDR  ��QIDATH���k]U�{�s��{IlLi0��6��"�#)���v�ԡ(tV��8����DT��� �[�"4�SM���Li�$M�&�{����S��*'�ٹ�p�^k�9����O���=�/����d�ߒ�����Y���x��L
aEpD�k�d�N�zR& i�Da.7j��ʡ�:"����G$��Y�q�D2v��7H7�y�[�2-/�~�����{�aQ��=�m?��TS��N�C�g�ly������� 4Q��f؀ȺH��@B/ҋF������[�J���G��]�����jy.�ջr�#^�9"��-�0P�%j*��Y�sU�x�虷O]�.�MaKkZN3�O۴r<���}_f�����
���5�h)t��H&/3��|l�l{������5&�QQTS�e$����Y�Ne��B��DP ���
("�G���H��Ě��11�>�wh��b�t5��"���^���@6C�h(���u�����0�:������`$���I�]�ͻ�:pl��c�-+���QAS��ISTI�0�(��*�ǤW�3Z)!M(�\��\t�g�(A)LP���u������jہolj�jT�+
Jbh��˙�tR9���TZ7���@F]!�y���MA0����D�^�+�e�3��8�����!��~�y$�5��Ѹ\ܣ`��~,O��?B[S%�F%��$17Y
SL�3溌D^�n�8v�4Ԭы�@�aBF�u�[D
�H��;% �]�{��O�?�vkK1�!��{<X�*��R�Mթ�#���G[���\q�YZ�i1��6!	�~x��`R0+�4��l�i�4w;t�ZO���f��ɯn�hX��ВX�iѬ3X�nܪ|4<N)��4��"A�(
�
�U�R'gf��j����뢄E=�������ϸ���^p朲S��F@��� :+Z��N�Fc pn��}Uiu1yBԂNd�ݚ�M����=� L7EV������LT�j�KW�.�l�����"āD�=�/b�(Tk��H]�Ƴ*,8*��M�s��G�s���IEND�B`�PK�X��˝++rbcua_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class RBCUA(BasicNewsRecipe):
    title = '\u0420\u0411\u041A-\u0423\u043A\u0440\u0430\u0457\u043D\u0430'
    __author__ = 'bugmen00t'
    description = '\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0435 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E.'  # noqa
    publisher = '\u0422\u041E\u0412 \u00AB\u042E\u0431\u0456\u0442\u0456 \u041C\u0435\u0434\u0456\u0430\u00BB'
    category = 'news'
    cover_url = u'https://www.rbc.ua/static/img/r/b/rbc_pic_best_news_650x410_2_650x410_1_650x410_1_480x270.jpg'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 3
    max_articles_per_feed = 20

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='span', attrs={'class': 'lang-publication'}),
        dict(name='div', attrs={'class': 'share'}),
        dict(name='ins'),
        dict(name='div', attrs={'class': 'read-in-google'}),
        dict(name='div', attrs={'class': 'intext-tags'})
    ]

    feeds = [('\u0420\u0411\u041A', 'https://www.rbc.ua/static/rss/all.ukr.rss.xml')]
PK�X:�V77rds.png�PNG


IHDR  szz��IDATx^�Vml�U>��m��ell��0���%�l��9�a"�`PH��		�N%�4AE4MԠ1�0!7�؆�L���A]�躏�]׾_�۾�R�??�����{r����"UU�Qf�HHH�.�f�)�x.A�
�R�@	̀()�%�0�D���i�##<`q H^�uϔ��k�"Ôg,W��D}�':�s5����G8?iz+Y��l@`6�d��07H���sχ��4�;���9�L:#aQ����$�`��nq�sA���;���WJg€��y � ��;�-�+�pkK�,#�(��ܼs�	�	�������t���`�������{�/]\�ܻ�9��
�c�Ab~Ie�U(��i�	̸\��׮���"}D���r<����A�Ҁ9���l��(n?�%���[��%��ʵ�~�
��3�P}���V���2��*���PA5R��֕%��|�<F@��	ӗ�QTҧ�~���cN��6�`0R&#����5P)�����#����RZַz��F`6=�D۾�?V���Vu��;[3�r�3e����g����=��8�a��;ǿ�5��"2��@qesV
^��x��.\�PbJJ�X���[No�pl������z��v)10�I�HbdfE��_.W.}��dk��|}=��`*��[K�
��fA�⚆M���zʜ�Vث��ZM���:ނf� �m~�'�%�_M< �*R�y��t��c��'/{�a!+w���ͱ����)"	!�����$g����2߈f��M�����[��Jʢ��ږN��G%�2E���io���o�8����$��{Q�$�����d[&��hj$T��������0�,�ȷ�
C���,` ��F���=_O;�����<u�%`���:oa��2Y̳`��o��F�7K�n�
cK6U�����.l��R)Ő]a��uu�H�
2/Koo�hwO�lD�Y�^k��ʏ�^n�e@TD�U� �PŶu{��}��s�!�S�_]�o����ɚr�78���QJ��(B��� o��11tg	�w���%keᭌ��nЌzΟ�W�
3	gVT�ӄ��Y+�u�d��i_�TE�8�{��Aja�P�G�5�V�w�� ����h*^9X���Y'Px������5*&Y3'@3����ǠTLΰN>�7�<^�ţ�����˵�����–�ţZ�uK�-�����V�IEND�B`�PK�X\�<(��
rds.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1290013720(BasicNewsRecipe):
    title = u'RDS'
    __author__ = 'Nexus'
    language = 'en_CA'
    description = 'Hockey News'
    oldest_article = 7
    max_articles_per_feed = 25
    no_stylesheets = True
    remove_tags = [dict(name='div', attrs={'id': 'rdsWrap'}),
                   dict(name='table', attrs={'id': 'aVoir'}),
                   dict(name='div', attrs={'id': 'imageChronique'})]
    keep_only_tags = [dict(name='div', attrs={'id': ['enteteChronique']}),
                      dict(name='div', attrs={'id': ['contenuChronique']})]

    feeds = [(u'RDS', u'http://www.rds.ca/hockey/fildepresse_rds.xml')]
PK�XW#readers_digest.png�PNG


IHDR ��?��PLTEGpL����[^�KO��>C�	�-2�����vy�wz�VZ�QU�IN�OS�NR�NR�<A�W[�Y]�_c�PT�KO�FJ�CH�BF�9>�=B�=A�;@�9>�?D�:?�<@�49�38�8<�5:�49�38�16�15�/4�49�16�38�27�16�37�6;�6:�37�38�38�26�+0�*/�+0�).���wz�lo�IM�7<�27�05�.3�,1�+0�*/�(-� %�$�38�37�27�/3�.3�+0�7<�27�05�/4�,1�+0�*/�).�$)�#)�!&��������������������������������������������������������������������������������������������}��z}�y|�x{�vy�tw�ru�pt�or�hl�fj�ae�^b�[_�Y]�X\�W[�VZ�UY�TX�RV�QU�OS�NR�MR�MQ�LP�JO�IM�FK�EI�?D�=B�<@�:?�05�.4�6;�/4�-2�49�/5�-2�38�-3�/5�-2�,2�,1�16�,1�05�+1�/4�+0�*/�.3�.2�).�+0�-2�-1�*/�,1�,0�+0�)/�*/�%+�*/�).�).�).�(-�'-�',�',�&,�%+�$*�$)�%�#)�$�"(�"'�"'�!'�!&� &� %�$�#�"�!� ��	-Z�]tRNS	
'*5DKipu�����������������������������������������������������������������&�IDATxm��kg�����gfg���h^V0�T�J��x��K!P)���S���K��)�����x�AO��I��/�D#��
y�ͮ;;3�<O٭��(���4;e�P�A����
�U��:{�ҵ��2^6zhf�c�B�qi�Sȵd�񟿯����~����ɡ��~q5v�E���_�z������7�Z��Z�M;/@4�_
�~ڌ�E���f�v$�F�d�r*)�8�0��u�ɣ˶"4
#�'vr���������t���35��48������٣�(���[7�r@�D�4ߜz��Z�αo_r!Z�C9@�8�/�j@6'�R<jA�q`�=���c
M�����=4}�7w���
l	}.��cS��(��z��Ə�ѧ�	 �8�������J�I 
p�B��ʼ��
eMXy�G��9	:ce�fŒ�Z7VN��B@�
;�W��
��桹ٍ��dYhP���liN,$_�۩|0���ѣQ��?�2�u�3�g��M�U=�],�?�4v���k$h�8w��8ʳ.��P��3�~}���0�mDh��hz�&��"m�l͚.J���ֵ�k�[� �f�6��.V���9ʼ�]n��W_���BlX�wZ�S��=_rƂ@��w��#���(z<��E���X},�tzƏIEND�B`�PK�X�T�G}
}
readers_digest.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
'''
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class ReadersDigest(BasicNewsRecipe):

    title = 'Readers Digest'
    __author__ = 'BrianG, Gobelinus'
    language = 'en'
    description = 'Readers Digest Feeds'
    no_stylesheets = True
    use_embedded_content = False
    oldest_article = 60
    max_articles_per_feed = 200

    language = 'en'
    remove_javascript = True
    remove_attributes = ['style']

    extra_css      = ''' h1 {font-family:georgia,serif;color:#000000;}
                        .mainHd{font-family:georgia,serif;color:#000000;}
                         h2 {font-family:Arial,Sans-serif;}
                        .name{font-family:Arial,Sans-serif; font-size:x-small;font-weight:bold; }
                        .date{font-family:Arial,Sans-serif; font-size:x-small ;color:#999999;}
                        .byline{font-family:Arial,Sans-serif; font-size:x-small ;}
                        .photoBkt{ font-size:x-small ;}
                        .vertPhoto{font-size:x-small ;}
                        .credits{font-family:Arial,Sans-serif; font-size:x-small ;color:gray;}
                        .credit{font-family:Arial,Sans-serif; font-size:x-small ;color:gray;}
                        .artTxt{font-family:georgia,serif;}
                        .caption{font-family:georgia,serif; font-size:x-small;color:#333333;}
                        .credit{font-family:georgia,serif; font-size:x-small;color:#999999;}
                        a:link{color:#CC0000;}
                        .breadcrumb{font-family:Arial,Sans-serif;font-size:x-small;}
                        '''

    feeds = [
        ('Food', 'http://www.rd.com/food/feed'),
        ('Health', 'http://www.rd.com/health/feed'),
        ('Home', 'http://www.rd.com/home/feed'),
        # ('Family', 'http://www.rd.com/family/feed'),
        # ('Money', 'http://www.rd.com/money/feed'),
        # ('Travel', 'http://www.rd.com/travel/feed'),
        ('True Stories', 'http://www.rd.com/true-stories/feed'),
        ('Advice', 'http://www.rd.com/advice/feed'),
    ]

    keep_only_tags = [
        classes('post-title post-author post-updated-date post-date featured-image post-body entry-title dek listicle-card')
    ]

    remove_tags = [
        classes('single-card ad brand-info pure-g')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-lazy-src': True}):
            img['src'] = img['data-lazy-src']
        return soup
PK�X*�I�readersdigest_thehealthy.png�PNG


IHDR  D����PLTEGpL�f$�f$�f$�f$�f$�f$�e#�f$�f$�f$�e$�f$�f#�f$�f$�e#�e$�e$�f$�f$�f$�f$�e$�e#�f$�f$�e#�e$�f$�e$�f$�f#�f$�d!�d"�f%�f$�f$�f$�e$�f$�f$�f$�f#�f$�f$�f$�f$�e$�f#�e"�f#�f$�e$�e$�e$�f#�e$�f$�f$�f$�e#�e#�f$�f#�e$�e#�e$�f$�e#�f$�c!�f$�f$�e#�e#�f$�f$�f$�f$�m/�e#�f#�e$�e#�e#�e$�f$�f$�f#�e$�f#�f$�e#�f$�f#�e$�e#�f#�e$�f#�f$�e#�f$�e$�e$�e#�j+�l-�k+�j)�f$�l&����e#�k%�f%�f$�d"�_�g&�g$�m&�c ����h$�g%�d!�h'�^�\�W�`��t�f#����������̶�i)����S����N�i(�T����l�h$����`����_�j*����e"����������e#�p2���������ê����������p3�o1�l,����������a�X�b�h&������h(�Ŭ�͸�T
�Ī�l-�Z������}E������ʴ�§�����R��}�b��c�V�|D�ū�a����P�J�������W�a��V��x��Y�����u�ϻ�Ϻ��p�o2�м�T��y�r6����{A��_�O����]������ī�w=����w�ѽ�G���˴��v��\����N������M�T�LptRNS���������ߧ��e	�]��"�!���5g��3:
���7�����^^��"�^�]]]�"�!���!5�4���5�:
��3�	8�8���
���h�h:��e������y��IDATx�e��#KE+�m�߶m۬A�l��m۶m��Ճ�S��,\Q	gƟuv����p�VP�z�cD�Q��-p@v$*��ϐe7N*�
.�I�7La���^�����y�Ʃe��6קi�i�9>Q�;��^��"���-��x�ѧ�b]�,�	s~{�R�\��3/�O��?�v�չ(���@R�A72�Q�K���j���o����}��h8X���-��_|��׿'���hFd(+��A���Ė��}���_����O�s>d�,ܛqʡd#zz����?�
	�PzR��ሴ��h��_�ѫO�P#Cj�(�/2�ܸ�p!@C}��}w�$���K�@w3��au|��=���pG=!�~1T�ɦ�ϫ?r!��#��wB�uEP��0���M��h��u�+S�H(���k[g�g�y��!�˶b��84�v���?�i�M��k���]u��B8�^&	�L,�/�N<�1�ƚ����#��5�Hu.����̚����>>Is�� �K���2C�����&�W�17�6�f�q`܇�ҍ�W�5���՛n�7.L&����K���[5.�o��9��$}g*.p*i�G^�G��XOS����F�Ş��k�HU�D5~�`��bG�����6.8�x3z�%&��;�����-�{���%��O�����W%D���sH�Op#�IEND�B`�PK�XН38%%readersdigest_thehealthy.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
##
# Title:        The Healthy From Reader's Digest Calibre Recipe
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
##
# Written:      June 2022
# Last Edited:  2022-06-11
##

from calibre.web.feeds.news import BasicNewsRecipe


class TheHealthy(BasicNewsRecipe):
    title          = 'The Healthy from Readers Digest'
    language = 'en'
    __author__ = 'Stephen Genusa'
    # Get everything in a single file
    # oldest_article = 900
    # max_articles_per_feed = 900
    # Get only recent articles
    oldest_article = 14
    max_articles_per_feed = 100
    auto_cleanup   = True

    feeds = [
        ('Allergies', 'https://www.thehealthy.com/allergies/feed'),
        ('Alzheimers', 'https://www.thehealthy.com/alzheimers/feed'),
        ('Arthritis', 'https://www.thehealthy.com/arthritis/feed'),
        ('Back Pain', 'https://www.thehealthy.com/pain/back-pain/feed'),
        ('Cancer', 'https://www.thehealthy.com/cancer/feed'),
        ('Cold and Flu', 'https://www.thehealthy.com/cold-flu/feed'),
        ('Diabetes', 'https://www.thehealthy.com/diabetes/feed'),
        ('Fatigue', 'https://www.thehealthy.com/fatigue/feed'),
        ('Headaches and Migraines', 'https://www.thehealthy.com/headaches/feed'),
        ('Heart Disease', 'https://www.thehealthy.com/heart-disease/feed'),
        ('Irritable Bowel Syndrome', 'https://www.thehealthy.com/digestive-health/ibs/feed'),
        ('Menopause', 'https://www.thehealthy.com/menopause/feed'),
        ('Pain Management', 'https://www.thehealthy.com/pain/feed'),
        ('Respiratory Conditions', 'https://www.thehealthy.com/respiratory/feed'),
        ('Skin Health', 'https://www.thehealthy.com/skin-health/feed'),
        ('Sleep', 'https://www.thehealthy.com/sleep/feed'),
        ('Beauty', 'https://www.thehealthy.com/beauty/feed'),
        ('Exercise', 'https://www.thehealthy.com/exercise/feed'),
        ('Food', 'https://www.thehealthy.com/food/feed'),
        ('Nutrition', 'https://www.thehealthy.com/nutrition/feed'),
        ('Digestive Health', 'https://www.thehealthy.com/digestive-health/feed'),
        ('Vitamins and Supplements', 'https://www.thehealthy.com/nutrition/vitamins/feed'),
        ('Weight Loss', 'https://www.thehealthy.com/weight-loss/feed'),
        ("Children's Health", 'https://www.thehealthy.com/family/childrens-health/feed'),
        ('Family', 'https://www.thehealthy.com/family/feed'),
        ('Relationships', 'https://www.thehealthy.com/family/relationships/feed'),
        ('Sexual Health', 'https://www.thehealthy.com/sex/feed'),
        ('Anxiety', 'https://www.thehealthy.com/mental-health/anxiety/feed'),
        ('Depression', 'https://www.thehealthy.com/mental-health/depression/feed'),
        ('Healthy Aging', 'https://www.thehealthy.com/aging/healthy-aging/feed'),
        ('Aging', 'https://www.thehealthy.com/aging/feed'),
        ('Mental Health', 'https://www.thehealthy.com/mental-health/feed'),
        ('Mind and Memory', 'https://www.thehealthy.com/aging/mind-memory/feed'),
        ('Care Giving', 'https://www.thehealthy.com/healthcare/caregiving/feed'),
        ('Eye Care', 'https://www.thehealthy.com/eye-care/feed'),
        ('First Aid', 'https://www.thehealthy.com/first-aid/feed'),
        ('Health Care', 'https://www.thehealthy.com/healthcare/feed'),
        ('Home Remedies', 'https://www.thehealthy.com/home-remedies/feed'),
        ('Oral and Dental Care', 'https://www.thehealthy.com/dental/feed'),
        ('Self Care', 'https://www.thehealthy.com/mental-health/self-care/feed'),
    ]
PK�XDj(((readitlater.png�PNG


IHDR��h6�IDATx�c���������ЂmT�*Fhȍ5}�'�ձ�W�2��ynn�: Ԇ��_���� ��?�wwY����D��p�;�|�������������#�&=�6
@L��'�����������㽾����@-`=@5
@�E�����z���������M@z�j�6E�
3�-��e��S�[������l�
��@5��lMVwX|������o��[��dau�	N
&&&�_�.��z�-�?.�pgʌ*�<�6��}���y�'M�?,��5<1��
�S�.��bڿ{u�_Lzu�~~���)Tz(y8�n�����߭��b��9�^N�PB�ݮ,�'��Z��a��s����B�DL����]����[�?^�x��Vg=�1
�ej]Z��Ǫ&N��s˼r�40�"�ڙk��9[i��d��U�b�V=���m_IEND�B`�PK�X�go���readitlater.recipe"""
Pocket Calibre Recipe v1.5
"""
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe
import json
import operator
try:
    from urllib.error import HTTPError, URLError
except ImportError:
    from urllib2 import HTTPError, URLError


__license__ = 'GPL v3'
__copyright__ = '''
2010, Darko Miletic <darko.miletic at gmail.com>
2011, Przemyslaw Kryger <pkryger at gmail.com>
2012-2013, tBunnyMan <Wag That Tail At Me dot com>
'''


class Pocket(BasicNewsRecipe):
    title = 'Pocket'
    __author__ = 'Darko Miletic, Przemyslaw Kryger, Keith Callenberg, tBunnyMan'
    description = '''Personalized news feeds. Go to getpocket.com to setup up
                  your news. This version displays pages of articles from
                  oldest to newest, with max & minimum counts, and marks
                  articles read after downloading.'''
    publisher = 'getpocket.com'
    category = 'news, custom'

    # Settings people change
    oldest_article = 7.0
    max_articles_per_feed = 50
    minimum_articles = 1
    mark_as_read_after_dl = True  # Set this to False for testing
    sort_method = 'oldest'  # MUST be either 'oldest' or 'newest'
    # To filter by tag this needs to be a single tag in quotes; IE 'calibre'
    only_pull_tag = None

    # You don't want to change anything under
    no_stylesheets = True
    use_embedded_content = False
    needs_subscription = True
    articles_are_obfuscated = False
    apikey = '19eg0e47pbT32z4793Tf021k99Afl889'
    index_url = u'https://getpocket.com'
    read_api_url = index_url + u'/v3/get'
    modify_api_url = index_url + u'/v3/send'
    legacy_login_url = index_url + u'/l'  # We use this to cheat oAuth
    articles = []

    def get_browser(self, *args, **kwargs):
        """
        We need to pretend to be a recent version of safari for the mac to
        prevent User-Agent checks Pocket api requires username and password so
        fail loudly if it's missing from the config.
        """
        br = BasicNewsRecipe.get_browser(self,
                                         user_agent='Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; \
                        en-us) AppleWebKit/533.19.4 (KHTML, like Gecko) \
                        Version/5.0.3 Safari/533.19.4')
        if self.username is not None and self.password is not None:
            br.open(self.legacy_login_url)
            br.select_form(nr=0)
            br['feed_id'] = self.username
            br['password'] = self.password
            br.submit()
        else:
            self.user_error("This Recipe requires authentication")
        return br

    def get_auth_uri(self):
        """Quick function to return the authentication part of the url"""
        uri = ""
        uri = u'{0}&apikey={1!s}'.format(uri, self.apikey)
        if self.username is None or self.password is None:
            self.user_error("Username or password is blank.")
        else:
            uri = u'{0}&username={1!s}'.format(uri, self.username)
            uri = u'{0}&password={1!s}'.format(uri, self.password)
        return uri

    def get_pull_articles_uri(self):
        uri = ""
        uri = u'{0}&state={1}'.format(uri, u'unread')
        uri = u'{0}&contentType={1}'.format(uri, u'article')
        uri = u'{0}&sort={1}'.format(uri, self.sort_method)
        uri = u'{0}&count={1!s}'.format(uri, self.max_articles_per_feed)
        if self.only_pull_tag is not None:
            uri = u'{0}&tag={1}'.format(uri, self.only_pull_tag)
        return uri

    def parse_index(self):
        pocket_feed = []
        fetch_url = u"{0}?{1}{2}".format(
            self.read_api_url,
            self.get_auth_uri(),
            self.get_pull_articles_uri()
        )
        data = self.index_to_soup(fetch_url, raw=True)
        pocket_feed = json.loads(data)['list']

        if len(pocket_feed) < self.minimum_articles:
            self.mark_as_read_after_dl = False
            self.user_error(
                "Only {0} articles retrieved, minimum_articles not reached".format(len(pocket_feed)))

        for pocket_article in pocket_feed.items():
            self.articles.append({
                'item_id':      pocket_article[0],
                'title':        pocket_article[1]['resolved_title'],
                'date':         pocket_article[1]['time_updated'],
                'url':          pocket_article[1]['resolved_url'],
                'real_url':     pocket_article[1]['resolved_url'],
                'description':  pocket_article[1]['excerpt'],
                'sort':         pocket_article[1]['sort_id']
            })
        self.articles = sorted(self.articles, key=operator.itemgetter('sort'))
        return [("My Pocket Articles for {0}".format(strftime('[%I:%M %p]')), self.articles)]

    def mark_as_read(self, mark_list):
        actions_list = []
        for article_id in mark_list:
            actions_list.append({
                'action': 'archive',
                'item_id': article_id
            })
        mark_read_url = u'{0}?actions={1}{2}'.format(
            self.modify_api_url,
            json.dumps(actions_list, separators=(',', ':')),
            self.get_auth_uri()
        )
        try:
            self.browser.open_novisit(mark_read_url)
        except HTTPError as e:
            self.log.exception(
                'Pocket returned an error while archiving articles: {0}'.format(e))
            return []
        except URLError as e:
            self.log.exception(
                "Unable to connect to getpocket.com's modify api: {0}".format(e))
            return []

    def cleanup(self):
        if self.mark_as_read_after_dl:
            self.mark_as_read([x['item_id'] for x in self.articles])
        else:
            pass

    def default_cover(self, cover_file):
        """
        Create a generic cover for recipes that don't have a cover
        This override adds time to the cover
        """
        try:
            from calibre.ebooks.covers import calibre_cover2
            title = self.title if isinstance(self.title, type(u'')) else \
                self.title.decode('utf-8', 'replace')
            date = strftime(self.timefmt)
            time = strftime('[%I:%M %p]')
            img_data = calibre_cover2(title, date, time)
            cover_file.write(img_data)
            cover_file.flush()
        except:
            self.log.exception('Failed to generate default cover')
            return False
        return True

    def user_error(self, error_message):
        if hasattr(self, 'abort_recipe_processing'):
            self.abort_recipe_processing(error_message)
        else:
            self.log.exception(error_message)
            raise RuntimeError(error_message)

# vim:ft=python tabstop=8 expandtab shiftwidth=4 softtabstop=4
PK�Xf⾐��real_clear.png�PNG


IHDR  D���^PLTE���������������㞟�����߆����ᎏ���+.�}~�+.�}~������"�"'��������"���'+�+.�.2�25�BD�z{�|}豲길���������st�pr��uv�xz��݁��䟠墣榧窫��뺻�����������LN����PR�LN��"�RT�TU�UW�UW�Z\�\]�]_�ee�Z\�]_�bc�jk�km�mn�no�"�""�uv�st�@@�'�''�{|܃���}}�}~�~݀�݀��ހ�ނ�ރ�߂�߇�߈���+2����ᑒᒔᘘ⒔ⓕ◗◘⠠㜜䜝䝟�.5䣣�25奥妧�==槧�@@筮粲紴�@B貲賳贴鱲鴵鶶鹺궷그�++꼽�=@뾾뾿�����@B�����������������������������������������������DD����������������FH������������HJ����==����������NP�������������ZZT�>^tRNS{����������������+a8��IDATx^��C�$aEs�� �c�l�m�m۶m۶m�_MeeϮ�s�w�ؼ��6�{����W;E�+3Ӑ��o�t"�xZ�@G�/r�����-]�`�BF�nnb4��`��x�&a%��ER08��b
�;)̠�s��+�{���9 g���y'�
My8))��/d�(ۊ�z�v��(��,)��6z(AZ~HN��l�p�
�i#~�%叢�t�U�tO
��-2c�z�����#X��^!���[R�cr?�5�T�q�U�\��$�����cWS8"OV>.��[r0Us����p@ŗ���0���E⃛r�b,?.�uE�fc�%<�f�	d9�?6Q���e��X��?~.w~V'�^������t���uT�?+]��Cp����Ǩ��ȝ�SS�
v�@7Y}7|��H2�L��eȭ,<qtp�G�1Nf
m���D
�?�*��\�/0cJ�`]�>�maZ[����pl�g;^��Rt�No��IEND�B`�PK�XhC
�))real_clear.recipefrom __future__ import print_function
# Test with "\Program Files\Calibre2\ebook-convert.exe" RealClear.recipe
# .epub --test -vv --debug-pipeline debug
import re
import time
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import NavigableString
try:
    from urllib.parse import urlparse
except ImportError:
    from urlparse import urlparse


class RealClear(BasicNewsRecipe):
    title = u'Real Clear'
    __author__ = 'TMcN'
    description = 'Real Clear Politics/Science/etc... aggregation of news\n'
    cover_url = 'http://www.realclearpolitics.com/dev/mt-static/images/logo.gif'
    custom_title = 'Real Clear - ' + time.strftime('%d %b %Y')
    auto_cleanup = True
    encoding = 'utf8'
    language = 'en'
    needs_subscription = False
    no_stylesheets = True
    oldest_article = 7
    remove_javascript = True
    remove_tags = [dict(name='img', attrs={})]
    # Don't go down
    recursions = 0
    max_articles_per_feed = 400
    debugMessages = True

    # Numeric parameter is type, controls whether we look for
    feedsets = [
        ["Politics",        "http://www.realclearpolitics.com/index.xml",   0],
        ["Policy",           "http://www.realclearpolicy.com/index.xml", 0],
        ["Science",         "http://www.realclearscience.com/index.xml",    0],
        ["Tech",            "http://www.realcleartechnology.com/index.xml", 0],
        # The feedburner is essentially the same as the top feed, politics.
        # ["Politics Burner", "http://feeds.feedburner.com/realclearpolitics/qlMj", 1],
        # ["Commentary",      "http://feeds.feedburner.com/Realclearpolitics-Articles", 1],
        ["Markets Home",    "http://www.realclearmarkets.com/index.xml", 0],
        ["Markets",         "http://www.realclearmarkets.com/articles/index.xml", 0],
        ["World",           "http://www.realclearworld.com/index.xml", 0],
        ["World Blog",           "http://www.realclearworld.com/blog/index.xml", 2]
    ]
    # Hints to extractPrintURL.
    # First column is the URL snippet.  Then the string to search for as text,
    # and the attributes to look for above it.  Start with attributes and
    # drill down.
    phUrlSnip, phLinkText, phMainSearch, phHrefSearch = range(4)

    printhints = [["realclear",           "",                            '', 'printpage'],
                  ["billoreilly.com",     "Print this entry",            'a', ''],
                  ["billoreilly.com",     "Print This Article",          'a', ''],
                  ["politico.com",        "Print",
                      'a', 'share-print'],
                  ["nationalreview.com",  ">Print<",                     'a', ''],
                  ["reason.com",          "",                       'a', 'printer']
                  # The following are not supported due to JavaScripting, and would require obfuscated_article to handle
                  # forbes,
                  # usatoday - just prints with all current crap anyhow

                  ]
    # The print link isn't obvious, and only the end is needed (the -full append.)  SO maybe try that first?s
    # http://www.realclearpolitics.com/printpage/?url=http://www.realclearpolitics.com/articles/2012/01/24/in_speech_obama_to_call_for_fairness_--_and_four_more_years_112879-full.html
    # Single page articles don't have a _full; e.g. http://www.realclearpolitics.com/articles/2012/01/25/obamas_green_robber_barons_112897.html
    # Use the FULL PRINTPAGE URL; it formats it better too!
    #
    # NYT - try single page...
    # Need special code - is it one page or several?  Which URL?
    # from  http://www.nytimes.com/2012/01/22/business/apple-america-and-a-squeezed-middle-class.html?_r=1
    # to    http://www.nytimes.com/2012/01/22/business/apple-america-and-a-squeezed-middle-class.html?_r=1&pagewanted=all
    # which is at link rel="canonical"   and at        <meta property="og:url"
    # or look for "Single Page"

    # Returns the best-guess print url.
    # The second parameter (pageURL) is returned if nothing is found.
    def extractPrintURL(self, pageURL):
        tagURL = pageURL
        baseParse = urlparse(pageURL)
        baseURL = baseParse[0] + "://" + baseParse[1]
        hintsCount = len(self.printhints)
        for x in range(0, hintsCount):
            if pageURL.find(self.printhints[x][0]) == -1:
                continue
            print("Trying " + self.printhints[x][0])
            # Only retrieve the soup if we have a match to check for the
            # printed article with.
            soup = self.index_to_soup(pageURL)
            if soup is None:
                return pageURL
            if len(self.printhints[x][self.phHrefSearch]) > 0 and len(self.printhints[x][self.phLinkText]) == 0:
                # e.g. RealClear
                if self.debugMessages is True:
                    print("Search by href: " +
                          self.printhints[x][self.phHrefSearch])
                printFind = soup.find(href=re.compile(
                    self.printhints[x][self.phHrefSearch]))
            elif len(self.printhints[x][3]) > 0 and len(self.printhints[x][1]) == 0:
                if self.debugMessages is True:
                    print("Search 1: " +
                          self.printhints[x][2] + " Attributes: ")
                    print(self.printhints[x][3])
                printFind = soup.find(
                    self.printhints[x][2], attrs=self.printhints[x][3])
            elif len(self.printhints[x][3]) > 0:
                if self.debugMessages is True:
                    print("search2")
                printFind = soup.find(self.printhints[x][2], attrs=self.printhints[
                                      x][3], text=self.printhints[x][1])
            else:
                if self.debugMessages is True:
                    print(
                        "Default Search: " + self.printhints[x][2] + " Text: " + self.printhints[x][1])
                printFind = soup.find(
                    self.printhints[x][2], text=self.printhints[x][1])
            if printFind is None:
                if self.debugMessages is True:
                    print("Not Found")
                    # print(soup)
                    print("end soup\n\n")
                continue

            print(printFind)
            if isinstance(printFind, NavigableString) is False:
                if printFind['href'] is not None:
                    print("Check " + printFind['href'] +
                          " for base of " + baseURL)
                    if printFind['href'].find("http") != 0:
                        return baseURL + printFind['href']
                    return printFind['href']
            tag = printFind.parent
            print(tag)
            if tag.get('href', None) is None:
                if self.debugMessages is True:
                    print("Not in parent, trying skip-up")
                if tag.parent['href'] is None:
                    if self.debugMessages is True:
                        print("Not in skip either, aborting")
                    continue
                return tag.parent['href']
            return tag['href']
        return tagURL

    def get_browser(self):
        if self.debugMessages is True:
            print("In get_browser")
        br = BasicNewsRecipe.get_browser(self)
        return br

    def parseRSS(self, index):
        if self.debugMessages is True:
            print("\n\nStarting " + self.feedsets[index][0])
        articleList = []
        soup = self.index_to_soup(self.feedsets[index][1])
        for div in soup.findAll("item"):
            title = div.find("title").contents[0]
            urlEl = div.find("originalLink")
            if urlEl is None or len(urlEl.contents) == 0:
                urlEl = div.find("originallink")
            if urlEl is None or len(urlEl.contents) == 0:
                urlEl = div.find("link")
            if urlEl is None or len(urlEl.contents) == 0:
                urlEl = div.find("guid")
            if urlEl is None or title is None or len(urlEl.contents) == 0:
                print("Error in feed " + self.feedsets[index][0])
                print(div)
                continue
            print(title)
            print(urlEl)
            url = urlEl.contents[0].encode("utf-8")
            description = div.find("description")
            if description is not None and description.contents is not None and len(description.contents) > 0:
                description = description.contents[0]
            else:
                description = "None"
            pubDateEl = div.find("pubDate")
            if pubDateEl is None:
                pubDateEl = div.find("pubdate")
            if pubDateEl is None:
                pubDate = time.strftime('%a, %d %b')
            else:
                pubDate = pubDateEl.contents[0]
            if self.debugMessages is True:
                print("Article")
                print(title)
                print(description)
                print(pubDate)
                print(url)
            try:
                url = self.extractPrintURL(url)
            except Exception:
                self.log.exception('Failed to extract print URL for %s' % url)
            print(url)
            # url +=re.sub(r'\?.*', '', div['href'])
            pubdate = time.strftime('%a, %d %b')
            articleList.append(
                dict(title=title, url=url, date=pubdate, description=description, content=''))
        return articleList

    # calibre.web.feeds.news.BasicNewsRecipe.parse_index() fetches the list of articles.
    # returns a list of tuple ('feed title', list of articles)
    # {
    # 'title'       : article title,
    # 'url'         : URL of print version,
    # 'date'        : The publication date of the article as a string,
    # 'description' : A summary of the article
    # 'content'     : The full article (can be an empty string). This is used by FullContentProfile
    # }
    # this is used instead of BasicNewsRecipe.parse_feeds().
    def parse_index(self):
        # Parse the page into Python Soup

        # articleList = []
        ans = []
        feedsCount = len(self.feedsets)
        for x in range(0, feedsCount):  # should be ,4
            feedarticles = self.parseRSS(x)
            if feedarticles is not None:
                ans.append((self.feedsets[x][0], feedarticles))
        if self.debugMessages is True:
            print(ans)
        return ans
PK�XI�Z���real_world_economics_review.png�PNG


IHDR  D���0PLTE��������������1��T��y����������������AtRNSG�����ORIDATx�l�!W������:�|����n����h?yӹ���TD�TJ���du�ZJm�����o��d��H���Y�MI���Er�S�<q��%�s�8�|��#�=���;�[��y�sX��E	�gb�o�“_���Ǹ�������aϒ��L����ø�F]���RD�����@�y�*�V@�S�3/��h�ьq!��#v����%F�d�	y0ZƂQ"�HT,5��B�Dm����
R0��0���~i�ٲ��,��}��
-`�j�F��_̆Y-���E��r�M+���}��s<3����=��z�3/�����߰�(IEND�B`�PK�X`e�88"real_world_economics_review.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Real_world_economics_review(BasicNewsRecipe):
    title = u'Real-world economis review blog'
    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False
    __author__ = 'Julio Map'
    language = 'en'

    no_stylesheets = True

    keep_only_tags = dict(name='div', attrs={'id': 'main'})
    remove_tags = [dict(name='div', attrs={'id': 'postpath'}),
                   dict(name='div', attrs={
                        'class': 'robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing'}),
                   dict(name='div', attrs={
                        'class': 'sharedaddy sd-sharing-enabled'})
                   ]

    feeds = [(u'Real-World Economics Review Blog',
              u'http://rwer.wordpress.com/feed/')]
PK�X�0�>�
�
realitatea.png�PNG


IHDR00�`n�
�IDATx�ř	Tu�3�����˱�ơdQ�v�Tv�]v�g�GfQYYd�G��V�`Y/�R��$55I.}&�DJ,�����L�A�x�}��7�3��]���?������������Y��q�xQ�STܖ�R��*�K���9[Z�k wGG���A��B Ѳ4��kG�vww=Z��gڶʹu+�{::x��{4�EE5�������,��S�ꩪ��أo��!����j7^}
���q��=ߌ���?F�,��m�ܟ�>�������]����%�/�s�ē���/��h„��W�67�L�u8�~�`�9������}v&&��Y��1�	b3A~�o_��͔d+-�.�o�+r���$��ZS������aiz-�کSN����^ye[Eř@�kּ�ݏ�� �DI�h�6�b�R�S�٥������u�u4��Lzx�|�� ��.�ӹ
=W�d��n�X�˃�7yCQ�"��Q�U���vw�~_H���°�C�%ƈ=��l�lMHH]n.��欮>��4#��j-/?�5�n�	��l�ʶ+��WD���a���\��s�~SPPAxXQԘ=��kd��?�<t�ta�����F�A�}9Lc,[�0`�P��29�蛀�o����A��a��U
F��A�V"A�|m4�Te�-��׭U*�(j�x-[�g��,J���eO�~�!䇈���WHr.���wWm��PZ�V�wo�Uk��*
�� ~X)���bT(?��rԪwiɀ3���|���MM�奦~�@�#�4j�&p?�KD8e1M�h>rd��^XX��l
E�=�����?�is�j�rd_p���߯۽���8�I��~�=<�l���o��D,�J�icD��a���Κ�ở�c�y�O���%n@GRԳ"z�C�
�Y�u�p�*�����U��CZ�k
��#�GSu���9
E���aŲ��~����ʔ����˓�����
@��'���|yEN�R��|y�
����~%$����)O����>é}����)I�	I�A*��R����б��_���j��G����A�$��7�]�"E��/Q�Z.S�Mc+,lY�2x�X�$���4-܁g����m%�6�Ze2}?�l}�2LsY0n��k�԰@��DZ��~��.�%�R*b<T^��vΜȸ8	AJ�ˤ��$4I�ddg�VE_p�=��T]mݱٳqI���w�<	ׯX��8'�,((")��qIP��A���7
EyN$��:�ēQ1121�z�h�x�,]jx�!E���˗�w���k��e�@�#��^z)����1~E� �1I+�5���8����A<��j	f���xÂӦ	�tt�����(*���#f�T�ʃ�F��63P#��n���I9 H� �
�=X�n?r�eٸ�[Zi�C�
(X^&p�b�]w��67���FC�|������Vu�1�rפ���Ǎ�����_$@�X���Q�{b}>!u*+OdfN���9�H֯~�eٔ)��M&�h$P�8�q��X��PP����…��#�&<�DZ@��a�hiHw����w���x��A�H��ads�H�O"��qq�0���£�dRR*%$���뜫W�W�(p���˓�Y
A�������;�/[f��� ���=^����;�2�TkhPlm-���|Pz��[n&o��'d2J�������z$ �����i ��C�P�Z��ܲc��q	�(�7TJ
5k���
�3r

��T��7��.��T��X8�0c�nr
����C�N��ꮮ����M>���sV�r����#
����=�پիyjn�����fzzF"h:v��\?P߳1^2	]nn�nmͯ�0�[@J�z<v��|�u��||��g��뙢"����Z��^��b++�S���:�ng.��������Α�P���ȹϰn7/�DX�=Sf29��eT��v�*kko�AA�/�$9��;v�5���N�����x�
s����q�36�� �Q�PQ/�(31p�D�IhIQ}��a$2������K&.[&T� �1:}88\��L���k���L==H����C^X�Q�������
E��8��.�Ke��Ye6K�C��(Ҩ�"����Ȣ8N*$"P�7����$9������Yq�j�VU��Q�FB)'N�d)�rq$Ul2�b����Ǝ��\�k
�2<�diڏ��e%��KDE	a�p*���.��Y�M���ɾ�k5Ш���N~t4��/�6`�F�z�Mݩ�]�]�^�~��>��%>�����v;�v�V[ssOWWG{{kZ�Y*m��M@4�k��rrʎ:1������C�I�#I����9mZ�
7t�t�9e�s׮��wee���,.WG�:;-����ֆ��&���2))/7�n��G���[�c�Dh4���q��j���
y‚LV��������c�FGw��O��fs��ZZ�n��7��#�]9q��5H�Y�{�˯�OH�0A/�^����e9��D�
�<{���z}�̙�����f�Y�V<����D��r�c�f̠W��NJ:����G�-��amma:=�����l����J�R�u���I�z��Ngr^�"1Da����4cq�Bt��p\�`������Y�DEE�p�j�iS�bI�	Bb�����O�����9�N�vw���;�O�S�B��7������p�(�546�0i�T*������ba��1�V���6�պ��Y!�Vr0������b͇���2��<�8#��0��с\--Y11IF�B*�h��.ٲ�����-z�9�`WhH0��"�����̩���2^�z:M��[�'���YAn��r9����AId��׭UϛW���a�S>��K0F��qqfEZ��f�Qt��O�O�-+
Ɖ��𔔫�n&����曣O=-��rV��@gk��QČ��������C��p[�����q�\c��9�5�;n)+k�0��,��k�haj��ޔ��U���ꡎ�ի'$�I��!��g8@�;1�geU/Y�V)
?'o���,N�.&f�;�M�N��4����PT��������ĉO��r=��
���7ܱة����y		�[��p�Q��ܵ+�o�-"ƒS�	G��yyY!���M�S��!W�`���=����,2�<3�RR���{`��Gj��Z$nޔ.Y�Ey�Σ99��ó6���g_ħ��a����_w�73f|}��۷���q�=�zL&�o�q8~۹sӭ��V��1����m� ��Z�Z7iR������\��͝�	�3�Z[�|t����ss�M[�0a�U��>�D�um'N��2TX�%jVIEND�B`�PK�XӲb7��realitatea.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
realitatea.net
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Realitatea(BasicNewsRecipe):
    title = 'Realitatea'
    __author__ = u'Silviu Cotoar\u0103'
    publisher = 'Realitatea'
    description = u'\u0218tiri din Rom\u00e2nia'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania'
    encoding = 'utf-8'
    cover_url = 'http://assets.realitatea.ro/images/logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'articleTitle '}), dict(
            name='div', attrs={'class': 'articleBody'})
    ]

    remove_tags = [dict(name='div', attrs={'id': 'aus'})]
    feeds = [(u'\u0218tiri', u'http://realitatea.feedsportal.com/c/32533/fe.ed/rss.realitatea.net/stiri.xml')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X#V'��reason_magazine.png�PNG


IHDR  D���PLTE�l4�r<�o8�����x��_���DZ������+@OIDATx��ҥ�@�e�ఽ64��!�DB��v�����S�ԭ��F ���-�&�& �~�U�0�c�ǀ�+m�Z�'IEND�B`�PK�X�=�ć�reason_magazine.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
from __future__ import unicode_literals
import json

from calibre import prepare_string_for_xml
from calibre.web.feeds.news import BasicNewsRecipe, classes


# {{{ parse article JSON
def process_image_block(lines, block):
    caption = block.get('captionText')
    caption_lines = []
    if caption:
        if block.get('attributionText', '').strip():
            caption += ' (' + block['attributionText'] + ')'
        caption_lines.append('<p style="font-style: italic">' + caption + '</p>')
    lines.append('<div style="text-align: center"><img src={}/>'.format(prepare_string_for_xml(block['url'], True)))
    lines.extend(caption_lines)
    lines.append('</div>')


def json_to_html(raw):
    data = json.loads(raw)
    # open('/t/p.json', 'w').write(json.dumps(data, indent=2))
    data = sorted((v['data'] for v in data['props']['pageProps']['urqlState'].values()), key=len)[-1]
    article = json.loads(data)['article']
    lines = []
    lines.append('<h1 style="align: center">' + prepare_string_for_xml(article['title']) + '</h1>')
    lines.append('<h2 style="align: center">' + prepare_string_for_xml(article['dek']) + '</h2>')
    auts = ', '.join(x['displayName'] for x in article['authors'])
    if auts:
        lines.append('<p style="align: center">by ' + prepare_string_for_xml(auts) + '</p>')
    if article.get('leadArt') and 'image' in article['leadArt']:
        process_image_block(lines, article['leadArt']['image'])
    for item in article['content']:
        tn = item.get('__typename', '')
        if tn.endswith('Image'):
            process_image_block(lines, item)
            continue
        html = item.get('innerHtml')
        if html is None or '</iframe>' in html:
            continue
        if 'innerHtml' not in item:
            continue
        tagname = item.get('tagName', 'P').lower()
        lines.append('<{0}>{1}</{0}>'.format(tagname, html))
    return '<html><body><div id="from-json-by-calibre">' + '\n'.join(lines) + '</div></body></html>'


class NoJSON(ValueError):
    pass


def extract_html(soup):
    script = soup.findAll('script', id='__NEXT_DATA__')
    if not script:
        raise NoJSON('No script tag with JSON data found')
    raw = script[0].contents[0]
    return json_to_html(raw)

# }}}


class Reason(BasicNewsRecipe):

    title = 'Reason'
    description = 'Free minds and free markets'
    INDEX = 'https://reason.com/magazine/'
    __author__ = 'Howard Cornett'
    language = 'en'
    encoding = 'utf-8'
    needs_subscription = True

    remove_tags = [
        classes(
            'next-post-link the-tags tag rcom-social-tools most-read-container comments-header-show'
            ' logo-header navbar navbar-expanded-lg primary content-info sidebar magicSidebar advertisement logo entry-subtitle'
        ),
    ]

    no_stylesheets = True
    remove_attributes = ['style']
    extra_css = '''
        .credit { text-align: right; font-size: 75%; display: block }
        .figcaption { font-size: 75% }
        .caption { font-size: 75% }
        .lead-img { display: block }
        p.dropcap:first-letter {
        float: left; text-transform: uppercase; font-weight: bold; font-size: 5.55em; line-height: 0.83;
        margin: 0; padding-right: 7px; margin-bottom: -2px; text-align: center;
        }
    '''

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://reason.com/login')
            br.select_form(id='login_form')
            br['text_username'] = self.username
            br['password_password'] = self.password
            br.submit()
        return br

    def preprocess_raw_html(self, raw_html, url):
        try:
            return extract_html(self.index_to_soup(raw_html))
        except NoJSON:
            self.log.warn('No JSON found in: {} falling back to HTML'.format(url))
        except Exception:
            self.log.exception('Failed to extract JSON data from: {} falling back to HTML'.format(url))
        return raw_html

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-lazy-src': True}):
            # img['src'] = img['data-lazy-src'].split()[0]
            data_lazy_src = img['data-lazy-src']
            if ',' in data_lazy_src:
                img['src'] = data_lazy_src.split(',')[0]
            else:
                img['src'] = data_lazy_src.split()[0]
        return soup

    def parse_index(self):
        soup = self.index_to_soup(self.INDEX)
        cover = soup.find('img', title=lambda value: value and value.startswith('Reason Magazine,'))
        if cover is not None:
            self.cover_url = cover['src']
        current_section, current_articles = 'Cover Story', []
        feeds = []
        for div in soup.findAll('div', attrs={'class': lambda x: x and set(x.split()).intersection({'issue-header-right', 'toc-category-list'})}):
            for h3 in div.findAll('h3', attrs={'class': True}):
                cls = h3['class']
                if hasattr(cls, 'split'):
                    cls = cls.split()
                if 'toc-department' in cls:
                    if current_articles:
                        feeds.append((current_section, current_articles))
                    current_articles = []
                    current_section = self.tag_to_string(h3)
                    self.log('\nFound section:', current_section)
                    title = h3.find_next_sibling().a.text
                    url = h3.find_next_sibling().a['href']
                    desc = h3.find_next_sibling().p.text
                    current_articles.append({
                        'title': title,
                        'url': url,
                        'description': desc
                    })
            for h2 in div.findAll('h2', attrs={'class': True}):
                cls = h2['class']
                if hasattr(cls, 'split'):
                    cls = cls.split()
                if 'toc-department' in cls:
                    if current_articles:
                        feeds.append((current_section, current_articles))
                    current_articles = []
                    current_section = self.tag_to_string(h2)
                    self.log('\nFound section:', current_section)
                for article in div.findAll('article', attrs={'class': True}):
                    h4 = article.find('h4')
                    if h4.a is not None:
                        title = h4.a.text
                        url = h4.a['href']
                    else:
                        title = ''
                        url = ''
                    desc = h4.find_next_sibling().text
                    current_articles.append({
                        'title': title,
                        'url': url,
                        'description': desc
                    })

        if current_articles:
            feeds.append((current_section, current_articles))
        return feeds


if __name__ == '__main__':
    import sys

    from calibre.ebooks.BeautifulSoup import BeautifulSoup
    print(extract_html(BeautifulSoup(open(sys.argv[-1]).read())))
PK�X�Z�B��rebelion.png�PNG


IHDR��h6�IDAT
�MoG�wޙ���Y���
��B������~ ת��*q��Z@��H#7�4�!Jp6������y�|���8:Iv��~[5�l� ��VڨZ�w㣳�O�7=,�>W,���{�i$v��Ƿ�O�R��ʼH(�D��׻��\
���*����d��<H,N�>	�L�Z6���Vq/A��eG��`�<��)���@mu7G��,�������`|0:�;��]�j��Z�d�� <�}���RT51XUB�8<�Ll7`���Rچ���H�xY4�F��ݽH�N{���v]w0,�l�(*
8��H��y��܄lkp���FY�� �3^c�w����.c�	`
YLK��V�	��m�m��軸Ѱ\�έ���t��W?�*+��2����-
��U`���s���-��9�n�R*�	aZ����#A�0\E����v�H�o�|�����qӨpe�(��o*���A�j5�1�3���bU��
8P�V�*t�^,����?j��,�e)(Aθc)���L���^Y�y=ڟ&Ij�V��^M
�@3�2X(�����fu�snu�]f6����D���0���@�
����e�?����<�F�E�N������d����e�[(Q��
��j�O�y������т�i�����7c�#��(�1邝T�F�IEND�B`�PK�XRt�qqrebelion.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe
import re


class RebelionRecipe (BasicNewsRecipe):
    # Thanks to atlantique http://www.mobileread.com/forums/member.php?u=67876
    __author__ = u'Marc Busqué <marc@lamarciana.com>'
    __url__ = 'http://www.lamarciana.com'
    __version__ = '1.0'
    __license__ = 'GPL v3'
    __copyright__ = '2012, Marc Busqué <marc@lamarciana.com>'
    title = u'Rebelion.org'
    description = u'Rebelión pretende ser un medio de información alternativa que publique las noticias que no son consideradas importantes por los medios de comunicación tradicionales. También, dar a las noticias un tratamiento diferente en la línea de mostrar los intereses que los poderes económicos y políticos del mundo capitalista ocultan para mantener sus privilegios y el status actual. Queremos servir y ayudarnos de todos los grupos, colectivos y personas que trabajan por cambiar este mundo en una perspectiva radicalmente diferente, más justa, igualitaria y equilibrada social y ecológicamente. Es nuestro objetivo contar con la participación y colaboración de todos vosotros para que Rebelión sea un espacio serio, riguroso y actualizado en la difusión de noticias.'  # noqa
    url = 'http://www.rebelion.org'
    language = 'es'
    tags = 'contrainformación, información alternativa'
    oldest_article = 1
    remove_empty_feeds = True
    encoding = 'latin1'
    keep_only_tags = [
        {'name': 'div', 'attrs': {'id': 'CuerpoNoticia'}}
    ]
    no_stylesheets = True
    extra_css = '.autor {font-style: italic;} .titulo {font-size: 150%;} .titulo, .pretitulo {text-align: center;} #TextoNoticia {text-align:justify;} .autor, .fuente, .entradilla {font-size: 90%; text-align: left;}'  # noqa

    feeds = [
        (u'Titulares del día', u'http://www.rebelion.org/rss_portada.php'),
    ]

    # See http://www.mobileread.com/forums/showthread.php?t=174501
    def print_version(self, url):
        id = re.compile(r'\d*$').search(url).group()
        return u'http://www.rebelion.org/noticia.php?id=%s' % id
PK�X�9nnred_aragon.png�PNG


IHDR(-S�PLTE����w{�+1�)/�#)���'-�*0����,2�!'�!(�
�$*�!�!�$�%�&,��(.�"���"�06�17�6;�<B�9?�<A�?D�CH�IN�EJ�IN�KP�QU�RW�Y]�]a�UZ�rv�wz�!�"�%���� 'V��tRNS@��f�IDATx�T��PC��{l���V�=&�2����U���V'|8�^��
�'��1���~�.	��}�7=F�[��G��'��
��~��''7d�%}"r�������z�A g8wY�F�>���C�.�������hIEND�B`�PK�Xi��red_aragon.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '11 December 2010, desUBIKado'
__author__ = 'desUBIKado'
__description__ = 'Entertainment guide from Aragon'
__version__ = 'v0.01'
__date__ = '11, December 2010'
'''
[url]http://www.redaragon.es/[/url]
'''

from calibre.web.feeds.news import BasicNewsRecipe


class heraldo(BasicNewsRecipe):
    __author__ = 'desUBIKado'
    description = u'Guia de ocio desde Aragon'
    title = u'RedAragon'
    publisher = 'Grupo Z'
    category = 'Concerts, Movies, Entertainment news'
    cover_url = 'http://www.redaragon.com/2008_img/logotipo.gif'
    language = 'es'
    timefmt = '[%a, %d %b, %Y]'
    oldest_article = 15
    max_articles_per_feed = 100
    encoding = 'iso-8859-1'
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True

    feeds = [(u'Conciertos', u'http://redaragon.com/rss/agenda.asp?tid=1'),
             (u'Exposiciones', u'http://redaragon.com/rss/agenda.asp?tid=5'),
             (u'Teatro', u'http://redaragon.com/rss/agenda.asp?tid=10'),
             (u'Conferencias', u'http://redaragon.com/rss/agenda.asp?tid=2'),
             (u'Ferias', u'http://redaragon.com/rss/agenda.asp?tid=6'),
             (u'Filmotecas/Cineclubs',
              u'http://redaragon.com/rss/agenda.asp?tid=7'),
             (u'Presentaciones',
              u'http://redaragon.com/rss/agenda.asp?tid=9'),
             (u'Fiestas', u'http://redaragon.com/rss/agenda.asp?tid=11'),
             (u'Infantil', u'http://redaragon.com/rss/agenda.asp?tid=13'),
             (u'Otros', u'http://redaragon.com/rss/agenda.asp?tid=8')]

    keep_only_tags = [dict(name='div', attrs={'id': 'FichaEventoAgenda'})]

    remove_tags = [dict(name='div', attrs={
                        'class': ['Comparte', 'CajaAgenda', 'Caja', 'Cintillo']})]

    remove_tags_before = dict(name='div', attrs={'id': 'FichaEventoAgenda'})

    remove_tags_after = dict(name='div', attrs={'class': 'Cintillo'})
PK�Xb��-red_voltaire.png�PNG


IHDR  ���IDATx^�VKoU��ܹ3�q�MJ*)��.u�Ă_���lٳAb�c�Jm�.h���f���3���s�ؤ��1v�4���;����#�_~�)��O#�/�-���`>�(�1f�{$T��BS�x䃈��c6U�?M�#���3w��G<V�h*�a�
aʛ�lfWZF��x�hH��|�.L�"bfA0�d�(�D�"�P�Pј&({���e�����Y���j����ƙĺ��CrF��0	+��ɖ�M�|��&��qD.��M��fhm���6>h�_��7Ξh3�o�=�o����AX�s����6�`�;�b�:?I�0��(�Җ��7>�_*cFF���xt/�����)���_��̹��N��t
�W��p�`r�9���d�\J5덍3g�Cj#��=�7֖Wߚr�L�L��s�p�)/&��]�v�k�o#gS����\�q���PgG�}=��ؑ�N�R��_X.
}����fY���Cϱ���V��2U`��~ۋ~"��~�8Y���N�7����<,���꼁����t��ٖ^�B�&���8e�A��"���i�K��d����#tV_�?��?��6ZZ�oz2��q���!N<�*���<�q|#���p���X�r$��r�Zx�����Kn�Jp�}FDB���r���\VJ/l�ov��U���ƙt]K�?c�<�h&07��
PI%�鸷;��YP��v��YxW~g*�y�{���1&FP�/���JP��-��{��s���͍��ﯮ].��Ve��tx��V� IX<m�9D/�zG;qw�g����m��qL;H�Q/�O�c�!��P
�'e��$�;������j�_ZY{U�*0��#f(�OY��Y��2�8O���ѯ3}�Ԋ�[8��/2$+%�c'N���((�IG��j�K�Y\̮׽:���Z�D�j`�k	��*vz���v��@��鸻ۏv�I6<!\y��
@���vL�C�[�F��o�˕
pv7\�^D����4�_o#ʧY�M�{��X���G�н�`1�i(:ϣ�'?ܻ�Y{��<?�V{~�]����;�]@@�F�L�$�$L�2o_�e��q�H�mf�Av���O_���K���e��G��/j�s0�e֑8
�O�K���7�IEND�B`�PK�X�p���red_voltaire.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class RedVoltaireRecipe(BasicNewsRecipe):
    title = u'Red Voltaire'
    __author__ = 'atordo'
    description = u'Red de prensa no alineada, especializada en el an\u00e1lisis de las relaciones internacionales'
    oldest_article = 7
    max_articles_per_feed = 30
    auto_cleanup = False
    no_stylesheets = True
    language = 'es'
    use_embedded_content = False
    remove_javascript = True
    cover_url = u'http://www.voltairenet.org/squelettes/elements/images/logo-voltairenet-org.png'
    masthead_url = u'http://www.voltairenet.org/squelettes/elements/images/logo-voltairenet-org.png'

    preprocess_regexps = [
        (re.compile(r'<title>(?P<titulo>.+)</title>.+<span class="updated" title=".+"><time', re.IGNORECASE | re.DOTALL), lambda match:'</title></head><body><h1>' + match.group('titulo') + '</h1><time'),   # noqa
        (re.compile(
            r'<time datetime=.+pubdate>. (?P<fecha>.+)</time>.+<!------------------- COLONNE TEXTE ------------------->', re.IGNORECASE | re.DOTALL), lambda match:'<small>' + match.group('fecha') + '</small>'), (re.compile(r'<aside>.+', re.IGNORECASE | re.DOTALL), lambda match:'</body></html>')  # noqa
    ]

    extra_css = '''
        img{margin-bottom:0.4em; display:block; margin-left:auto; margin-right:auto}
    '''

    feeds = [
        u'http://www.voltairenet.org/spip.php?page=backend&id_secteur=1110&lang=es']
PK�X*���regina_leader_post.png�PNG


IHDR  ���IDATx^��]oE�眙�ٵ�؎�&M�6��D%i�VBBT\����r�
�O ���[.A��B�����m�FI�8�Z����]�&�Eq�xw5���眙Y�ݸ�\��(b%�^]q�
I���{ʏi"~Eօm�94D��0�^�ݔt@�3���,�ħ���,2~�WD�U_]v��i��v�{b���D��d�I����<�1�ySn�az��"�>55g��qCD/�m��eBD۪m��νFaY$��kS6.`D��=R�2~���:f���uޔ��.9>���"J>كb
�؄H�T�4g[���zP=�����
�}y�Q��Z��
Ja}%^�`��tT�0��yNX�a���"�B�G��8�����kfvQ��2A|��twC�-BM
­Ùh�L�p!l�e[�,�
�KK�
ۮ�C4!bH��pf1�_�&��e�}.�d��:�^�Td�D��5����
�T�$@���@����q�����I����ݼ�)������3D�}L\���v�q&�m����M��.�ld=j{a�i�����dO�>*`r�IZ�J9��1�<&�b��(�*2�2�f":]���GE�Л@ڏ:��G���g�y��.-e�À�Y
甶(u�j�W ��aO�
{�s�5��)���WT�����-�`V�P�"�HGd*��G
�����:w]�v%���;��.|�x�m3;��`0����ɥ�`���rX�b3�US_ۖ�Q�2�N��-�]M{�0��8,� 9@<�صoc�%�q0�
�x����?�6�0q��Fa4�RX'�6��Q~���8+�xo%���%]>>��-�1�$�M�����
G;w��{d�;�I��T��U�T9�ۿdvF�Y�ty,�_��1
d\n,\
��Q�z˞�f�Wti9<�n��6�.깷A7̝���%t�|:X�F�P��7Q2� y~&�#hW�w,=����H{�D�}���<s&0귾���$;p6���E}�.����
�CA��ǭ��v�c�}@������v~�!Lh��߽E����Iy%�1j���\9���$[�\����������_H5x�������<Q
}(㨆�?EB�E�(�X����mL�E��`��o|�؜s��_4h��™R���@�Pޡ">ŚU�/~�R��p���i��.+Y!���zIEND�B`�PK�X倓�v v regina_leader_post.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'

'''
www.canada.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class CanWestPaper(BasicNewsRecipe):

    # un-comment the following four lines for the Victoria Times Colonist
    # #    title = u'Victoria Times Colonist'
    # #    url_prefix = 'http://www.timescolonist.com'
    # #    description = u'News from Victoria, BC'
    # #    fp_tag = 'CAN_TC'
    #
    # un-comment the following four lines for the Vancouver Province
    # #    title = u'Vancouver Province'
    # #    url_prefix = 'http://www.theprovince.com'
    # #    description = u'News from Vancouver, BC'
    # #    fp_tag = 'CAN_VP'
    #
    # un-comment the following four lines for the Vancouver Sun
    # #    title = u'Vancouver Sun'
    # #    url_prefix = 'http://www.vancouversun.com'
    # #    description = u'News from Vancouver, BC'
    # #    fp_tag = 'CAN_VS'
    #
    # un-comment the following four lines for the Edmonton Journal
    # #    title = u'Edmonton Journal'
    # #    url_prefix = 'http://www.edmontonjournal.com'
    # #    description = u'News from Edmonton, AB'
    # #    fp_tag = 'CAN_EJ'
    #
    # un-comment the following four lines for the Calgary Herald
    # #    title = u'Calgary Herald'
    # #    url_prefix = 'http://www.calgaryherald.com'
    # #    description = u'News from Calgary, AB'
    # #    fp_tag = 'CAN_CH'
    #
    # un-comment the following four lines for the Regina Leader-Post
    title = u'Regina Leader-Post'
    url_prefix = 'http://www.leaderpost.com'
    description = u'News from Regina, SK'
    fp_tag = ''

#     un-comment the following four lines for the Saskatoon Star-Phoenix
# #    title = u'Saskatoon Star-Phoenix'
# #    url_prefix = 'http://www.thestarphoenix.com'
# #    description = u'News from Saskatoon, SK'
# #    fp_tag = ''
#
#     un-comment the following four lines for the Windsor Star
# #    title = u'Windsor Star'
# #    url_prefix = 'http://www.windsorstar.com'
# #    description = u'News from Windsor, ON'
# #    fp_tag = 'CAN_'
#
#     un-comment the following four lines for the Ottawa Citizen
# #    title = u'Ottawa Citizen'
# #    url_prefix = 'http://www.ottawacitizen.com'
# #    description = u'News from Ottawa, ON'
# #    fp_tag = 'CAN_OC'
#
#     un-comment the following four lines for the Montreal Gazette
# #    title = u'Montreal Gazette'
# #    url_prefix = 'http://www.montrealgazette.com'
# #    description = u'News from Montreal, QC'
# #    fp_tag = 'CAN_MG'
#
    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: large;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: small; font-style: italic }
                #photocredit { font-size: xx-small; }'''
    keep_only_tags = [dict(name='div', attrs={'id': 'storyheader'}), dict(
        name='div', attrs={'id': 'storycontent'})]
    remove_tags = [{'class': 'comments'},
                   dict(name='div', attrs={'class': 'navbar'}), dict(
                       name='div', attrs={'class': 'morelinks'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def get_cover_url(self):
        from datetime import timedelta, date
        if self.fp_tag == '':
            return None
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        return self.strip_anchors(soup)

    def parse_index(self):
        soup = self.index_to_soup(
            self.url_prefix + '/news/todays-paper/index.html')

        articles = {}
        key = 'News'
        ans = ['News']

        # Find each instance of class="sectiontitle", class="featurecontent"
        for divtag in soup.findAll('div', attrs={'class': ["section_title02", "featurecontent"]}):
            if 'section_title' in ''.join(divtag['class']):
                # div contains section title
                if not divtag.h3:
                    continue
                key = self.tag_to_string(divtag.h3, False)
                ans.append(key)
                self.log("Section name %s" % key)
                continue
            # div contains article data
            h1tag = divtag.find('h1')
            if not h1tag:
                continue
            atag = h1tag.find('a', href=True)
            if not atag:
                continue
            url = self.url_prefix + '/news/todays-paper/' + atag['href']
            title = self.tag_to_string(atag, False)
            pubdate = ''
            description = ''
            ptag = divtag.find('p')
            if ptag:
                description = self.tag_to_string(ptag, False)
            author = ''
            autag = divtag.find('h4')
            if autag:
                author = self.tag_to_string(autag, False)
            if key not in articles:
                articles[key] = []
            articles[key].append(dict(title=title, url=url, date=pubdate,
                                      description=description, author=author, content=''))

        ans = [(keyl, articles[keyl])
               for keyl in ans if keyl in articles]
        return ans
PK�X��Mreplicavedetelor.png�PNG


IHDR��h6�IDATxڕ�!h�`�+"+###+���GE)�T�RB��L�0Q�F�x�|<Q�F��&�GE	��'���QQ�T���]W���~���\�������'�b���R�B�Q�at|;7bjm7ȶ6s��OA�\x7������U�.4��Ѧ}�7G��g�"\�I�NH��H�����:4p�r��jܥ�*oO��sc� I-]�2|&fl�?c�:��<�fޟ	}c��h�ih6K`ɨ�[V����Ny�*���6��8N�2�Q��jУ~��˝L���z�l�t�.K�9]?����Ll���(—�ދړy�R�f8.�R��:�è�Z�Nd�,�� #P���0nP�C�4�K{������F+�^s���-���ګb'ӵ,�)�{��c`�n4=ۉp7xp:�3·��(�V�
�@�%v��e�
ώ��?�J�~o�^��YM�IEND�B`�PK�Xfq--replicavedetelor.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, '
'''
replicavedetelor.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ReplicaVedetelor(BasicNewsRecipe):
    title = u'Replica Vedetelor'
    __author__ = u'Silviu Cotoara'
    description = u'Ofer\u0103 vedetelor dreptul la replic\u0103'
    publisher = 'Replica Vedetelor'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Vedete'
    encoding = 'utf-8'
    cover_url = 'http://www.webart-software.eu/_pics/lucrari_referinta/medium/84/1-Replica-Vedetelor.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'zona-continut'})
    ]

    remove_tags = [
        dict(name='ul', attrs={'id': [
             'lista-imagini']}), dict(name='form', attrs={'id': ['f-trimite-unui-prieten']})

    ]

    remove_tags_after = [
        dict(name='form', attrs={'id': ['f-trimite-unui-prieten']})
    ]

    feeds = [
        (u'Feeds', u'http://www.replicavedetelor.ro/feed')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X?���[[
republica.png�PNG


IHDR  szz�"IDATxڽW�#YͲ���x&Uc۶m�f8�m۶m��N���?{�V��x:��N;�w��~:*~���&},$L`�78Ճ��$p �>ĘR������A!��	J�QNv�W�Mp@��9j2Np�R�U���x2?J���y0g6U@V�����SRKo��O�¿h�V��-��J$���N�֭;�s5�W�����^\�L�,@��$!!>���=�]{��=��/����]JR��zP�`��͝��7n %5
F�T����d��Ex:7���ٷ ߰~LFoݶ7m%w�<��'Y��.���gE
�\� OLL��ONJB��{��98|��[ҵ��3^�p�j��g�A��.Y��Z�qzz,���(��G+=|�2�͛���|,ݺ�P�<�a�v�0t�>O"�Sfpf�U�Ϲ��}z tl/2��r�!?z"f�1{�ۍ�z=F���)���:c6�,[�4�ŋ�����2�]��Ư�E��^bAN}~�N��U�p.�͆�ٲ�G��,*
a���5g>�P1��`��-�i8z���:
x\T�qp����F�l�������r�Y�f\�			H%6mن9�a���8w�l6($.�p�ע�%s�۰*^����_���"H>_l�ܽ�p8�ӧ��ٌƍ�n�X�r5�BtB;9ծGw��^�����lh�ύ��s���C��Ы?'R�Q�晳������WX�o���֭Z�ҥ��I�f�4,\��]Rc��u�\6��.[n�H���!��ip��elݾ��t�Б6t(��YQ�e��S�K�<����yn"��ϳѾn�ڰ���<x�
ܼy�^�B��`ӦM|?>>AM�c
� dIF���"r뙔��5r��OD|V���ŒYs)W���<��E[6Y����|>g�l~&�>?��Ζ�SW�p����		{����FvA
������7~�/]��kּ%��|>}�4A[#J��Μ=֩3���+$ѹ���t�I7фs�.D����ox��Y,ގ�g�q�/Y�~�V������n8f�$ܸy���߯?X�^�b����5k��{�{���{��|��;v�Pa>z�#�L@�͆W/^��rk���O2!���;ؼi�FEu��Q�Z����L�H� �w����`�@�-#�Fo�4~N�8��j�Mq��(�"�Ɂ�	~-+���t�?y��'O��\�"9`�իW��Ek�,����,�l����1.L�/�hp��{ڗfbq:.��r����]� �������{�Wx�IEND�B`�PK�X�{
�republica.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1316862613(BasicNewsRecipe):
    title = u'Republica'
    __author__ = 'Manish Bhattarai'
    description = 'News from the Republica'
    language = 'en_NP'
    masthead_url = 'http://blog.nyayahealth.org/wp-content/uploads/2011/03/myrepublica1.gif'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True
    cover_url = 'http://www.myrepublica.com/repub_front.jpg'
    feeds = [
    (u'Political Affairs', u'http://www.myrepublica.com/portal/news_rss.php?news_category_id=14'),
    (u'Business & Economy', u'http://www.myrepublica.com/portal/news_rss.php?news_category_id=15'),
    (u'International', u'http://www.myrepublica.com/portal/news_rss.php?news_category_id=21'),

    (u'Social Issues', u'http://www.myrepublica.com/portal/news_rss.php?news_category_id=16'),
    (u'Sports', u'http://www.myrepublica.com/portal/news_rss.php?news_category_id=18'),
    (u'Lifestyle', u'http://www.myrepublica.com/portal/news_rss.php?news_category_id=17')]
PK�X��$Ti
i
republika.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
republika.co.yu
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Republika(BasicNewsRecipe):
    title = 'Republika'
    __author__ = 'Darko Miletic'
    description = 'Glasilo gradjanskog samooslobadjanja. Protiv stihije straha, mrznje i nasilja'
    publisher = ' Zadruga Res Publica'
    category = 'news, politics, Serbia'
    language = 'sr'

    lang = 'sr-Latn-RS'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'cp1250'
    use_embedded_content = False
    INDEX = u'http://www.republika.co.yu/'
    extra_css = ' @font-face {font-family: "serif1"; src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif} .naslov{font-size: x-large; font-weight: bold} .autor{font-size: small; font-weight: bold} '  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [dict(attrs={'class': 'naslov'}), dict(attrs={'class': 'text1'})
                      ]

    remove_tags = [dict(name=['object', 'link', 'iframe', 'base', 'img'])]

    feeds = [(u'Svi clanci', INDEX)]

    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 soup

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(0, _('Fetching feed') + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            soup = self.index_to_soup(feedurl)
            for item in soup.findAll('a', attrs={'class': 'naslovLink'}):
                url = item['href']
                title = self.tag_to_string(item)
                articles.append({
                    'title': title, 'date': '', 'url': url, 'description': ''
                })
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X��r{{respekt_magazine.png�PNG


IHDR  D����PLTELLL���%%%'''VVVJJJWWW111AAAGGGIIIKKKNNNPPPTTT$$$ZZZ^^^```lllssswwwxxxzzz~~~���������������������������������tRNSA������IDATx^�ӷ1P�_O������[d���0�Hi�X���q�E�E��Ɓ�'��^���ۢ���
���28���2�3�ML�����Kܞ�������B�w)����wIv��q��pT'i<xz�x���ʬo�IEND�B`�PK�X�yWY��respekt_magazine.recipe#!/usr/bin/python
# -*- coding: utf-8 -*-
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    tomashnyk@gmail.com

__license__     = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'
__copyright__   = 'tomashnyk@gmail.com'

import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup
# This imports the version bundled with Calibre
import lxml
from lxml.builder import E
respekt_url = 'https://www.respekt.cz'


class respektRecipe(BasicNewsRecipe):
    __author__  = 'Tomáš Hnyk'
    publisher = u'Respekt Publishing a. s.'
    description = u'Articles from the print edition'
    title = u'Respekt Magazine — Print'
    encoding = 'utf-8'
    language = 'cs'
    delay = 0.001
    remove_javascript = True
    remove_tags_before = dict(name='h1')
    remove_tags_after = [dict(id='postcontent')]
    remove_tags = [
        dict(name='div',attrs={'id':['postsharepopup','survey-respondents']}),
        dict(name='div',attrs={'class':['ad','ad-content','adinarticle','ad-caption','post-actions','authorship-note','quote','postgallery']}),
        dict(name='a',attrs={'class':['quote','authorship-face']}),
        dict(name='span',attrs={'class':'embed'}),
        dict(name='svg'),
        dict(name='script')
    ]

    extra_css = 'p {text-align:justify;margin-top:0;margin-bottom:0} \
                 ul {color:black} \
                 .frame-caption {font-weight:normal;font-size:50%;font-style:italic;}  \
                 h1 {font-size:150%;margin-bottom:0;} \
                 h2 {font-size:100%;margin-bottom:0;} \
                .post-subtitle {margin-top:0;} \
                 h3 {font-size:100%;margin-bottom:0;margin-top:0;} \
                 .box-title {background-color: lightgray;font-size:150%;font-weight:bold;margin-left:12%;margin-right:12%;margin-top:12%;margin-bottom:0;} \
                 .box-content {background-color:lightgray;margin-left:12%;margin-right:12%;margin-top:0;margin-bottom:12%;} \
                 p.indent_first_line {text-indent:30px;} \
                 a {text-decoration:none;color:black;}'

    needs_subscription = True

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://www.respekt.cz/uzivatel/prihlaseni')
            for form in br.forms():
                if form.attrs.get('id') == 'frm-loginForm':
                    br.form = form
                    break
            for c in form.controls:
                if 'name' in c.attrs:
                    if c.attrs['name'] == 'username':
                        c.value = self.username
                    if c.attrs['name'] == 'password':
                        c.value = self.password
            br.submit()
        return br

    # So that remove_tags_before works for this section
    def preprocess_raw_html(self, raw_html, url):
        root = lxml.html.fromstring(raw_html)
        if root.xpath("//title")[0].text == (u"Respekt • Despekt • RESPEKT"):
            raw_html = re.sub("h2","h1",raw_html)
        return raw_html

    def parse_index(self):
        raw1 = self.index_to_soup('https://www.respekt.cz/tydenik/', raw=True)
        root1 = lxml.html.fromstring(raw1)
        current_edition_url = root1.xpath("//div[@class='heroissue']/a")[0].items()[0][1]
        raw2 = self.index_to_soup('https://www.respekt.cz/' + current_edition_url, raw=True)
        root2 = lxml.html.fromstring(raw2)
        self.cover_url = root2.xpath("//i[contains(@class, 'heroissue-cover')]")[0].get("data-src")
        # Fetch date
        date_text = root2.xpath("//time[@class='heroissue-date']")[0].text.split(',')[1]
        s = date_text.split(" ")
        # Are the dates of the issue in the same month and year?
        if len(s) == 4 or len(s) == 7:
            date = "/".join([s[1].split(".")[0],s[2].split(".")[0],s[-1]])
        elif len(s) == 8:
            date = "/".join([s[1].split(".")[0],s[2].split(".")[0],s[3]])
        self.conversion_options = {'pubdate':date}
        self.title = "Respekt magazine #" + "/".join(current_edition_url.split("/")[-1:-3:-1])
        ans = []
        for section in root2.xpath("//div[@class='col-md-6']/div[@class='issuedetail-categorized-sectionname']"):
            section_name = section.text
            articles = []
            article = section.getnext()
            while hasattr(article, 'text') and not article.text.strip():
                title = article.xpath("span[@class='issuedetail-categorized-title']")[0].text
                url = respekt_url + article.xpath("@href")[0]
                articles.append({'title':title,'url':url})
                article = article.getnext()
            ans.append((section_name,articles))
        return ans

    def cleanup(self):
        self.browser.open('https://www.respekt.cz/?do=logout')

    def preprocess_html(self,soup):
        raw = u''.join(type(u'')(a) for a in soup.contents)
        root = lxml.html.fromstring(raw)
        # Fix Letem světem
        if "Letem sv" in root.xpath("//title")[0].text:
            p = root.xpath("//p")
            for par in p[:]:
                next = par.getnext()
                if par.getchildren():
                    child = par.getchildren()[0]
                if hasattr(next,"tag") and next.tag == "h2" and hasattr(child,"tag") and child.tag == "strong":
                    text = child.text_content()
                    if next.text:
                        next.text = next.text + u" • " + text
                    else:
                        if next.getchildren():
                            next_child = next.getchildren()[0]
                            next_child.text = next_child.text +  u" • " + text
                    par.getparent().remove(par)
        # Insert text length
        text = root.xpath("//div[@id='postcontent']")[0]
        article_length = u" • " + str(len(text.text_content().split(' '))) + ' slov'
        try:
            aut = root.xpath("//div[@class='authorship-names']")[0]
            if aut.getchildren() and aut.getchildren()[0].tag == 'a':
                for i,t in enumerate(aut.getchildren()):
                    if i == 0:
                        t.text = 'Autor: ' + t.text + ' '
                    else:
                        t.text = t.text + ' '
                    # Remove link
                    e = E.span(t.text)
                    t.getparent().replace(t,e)
            else:
                t = root.xpath("//span[@class='post-author-name']")[0]
                t.text = ('Autor: ' + t.text + ' ')
            root.xpath("//div[@class='authorship-names']")[0].append(E.span(article_length))
        except:
            pass
        # Make images visible
        pictures = root.xpath("//picture")
        for picture in pictures:
            image = picture.xpath("//source")[0]
            image_link = [a for a in image.get('srcset').split(' ') if a[:4] == "http"][-1]
            e=E.img({"src":image_link})
            picture.getparent().replace(picture,e)
        # Properly indent
        paragraphs = root.xpath('//p')
        paragraphs.reverse()
        # First paragraph is never indented
        for par in paragraphs[:-1]:
            prev = par.getprevious()
            # Do not indent after headings
            if hasattr(prev,'tag') and prev.tag not in ['h2', 'h3']:
                par.attrib['class']="indent_first_line"
        # Fix subtitle for Téma
        try:
            o = root.xpath("//p[@class='post-perex']")[0]
            e = E.h2({"class":"post-subtitle"})
            e.text = o.text
            o.getparent().replace(o,e)
        except:
            pass
        return(BeautifulSoup(lxml.etree.tostring(root,encoding='unicode')))
PK�Xmi@..reuters.png�PNG


IHDR  D���6PLTE����d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�3��tRNS 0@P`p��������.p��IDATxڅ��� ��� Z����9�ݯ"�|�p�<X�*�"���<;��6����7s��y��hy�k��3��
�1��J��n��"�[�k�to҂c�W�b_P*��+�8�Z)E���x���kÙp��ũ�V\��@�=ym(�-���6��k��y��[r��sބN^4�J[�G���X��
�-��<%�;�t,yL�<n�����FҰ�+q~H
ZI,)G9e<�tC[�S�~/��i�AoX�ZtKmR�u֢5b=��ud��+�}T��{~zS*Z�-�o��I9�S�Sk��Y����j��{����C*J沽y�����!긶��	�㆗����.VeU�gW{������u�m|W��󇵽/"Y�}�O�f5�՗O|���TjIEND�B`�PK�X��|reuters.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2020, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals

import json
from calibre.web.feeds.news import BasicNewsRecipe

country = 'us'
country_defs = {
    'us': ('www.reuters.com', {
        'World': 'world',
        'Business': 'business',
        'Markets': 'markets',
        'Tech': 'technology',
        # 'Sports': 'lifestyle/sports',
        'Wealth': 'markets/wealth',
    })
}


def prefixed_classes(classes):
    q = frozenset(classes.split(' '))

    def matcher(x):
        if x:
            for candidate in frozenset(x.split()):
                for x in q:
                    if candidate.startswith(x):
                        return True
        return False
    return {'attrs': {'class': matcher}}


def extract_article_list(raw):
    if isinstance(raw, bytes):
        raw = raw.decode('utf-8')
    # open('/t/raw.html', 'w').write(raw)
    idx = raw.index(';Fusion.globalContent={')
    d = raw[idx:]
    d = d[d.index('{'):]
    data = json.JSONDecoder().raw_decode(d)[0]
    # from pprint import pformat
    # print(pformat(data), file=open('/t/raw.py', 'w'))
    k = 'arcResult' if 'arcResult' in data else 'result'
    for article in data[k]['articles']:
        yield {'title': article['title'], 'description': article['description'], 'url': article['canonical_url']}


# if __name__ == '__main__':
#     print(list(extract_article_list(open('/t/World News _ Latest Top Stories _ Reuters.html').read())))


class Reuters(BasicNewsRecipe):
    title = 'Reuters'
    description = 'News from all over'
    __author__ = 'Kovid Goyal'
    language = 'en'


    keep_only_tags = [
        prefixed_classes('article-body__container__ article-header__container__'),
    ]
    remove_tags = [
        prefixed_classes(
            'context-widget__tabs___ article-header__toolbar__ read-next-mobile__container__ toolbar__container__ button__link__'
            ' ArticleBody-read-time-and-social Slideshow-expand-button- TwoColumnsLayout-footer- RegistrationPrompt__container___'
            ' SocialEmbed__inner___ trust-badge author-bio__social__ with-spinner__spinner__ author-bio__author-image__'
        ),
        dict(name=['button', 'link', 'svg']),
    ]
    remove_attributes = ['style', 'height', 'width']

    extra_css = '''
        img { max-width: 100%; }
        [class^="article-header__tags__"],
        [class^="author-bio__author-card__"],
        [class^="article-header__author-date__"] {
            font-size:small;
        }
        [data-testid="primary-gallery"], [data-testid="primary-image"] { font-size:small; text-align:center; }
    '''

    def parse_index(self):
        base, sections = country_defs[country]
        ans = []

        for section_title in sections:
            slug = sections[section_title]
            self.log(section_title)
            articles = list(self.parse_reuters_section(base, slug))
            if articles:
                ans.append((section_title, articles))
            if self.test and len(ans) >= self.test[0]:
                break
        return ans

    def parse_reuters_section(self, base, slug):
        url = 'https://' + base + '/' + slug
        raw = self.index_to_soup(url, raw=True)
        for article in extract_article_list(raw):
            article['url'] = 'https://{}{}'.format(base, article['url'])
            yield article
            self.log('\t', article['title'], article['url'])

    def preprocess_html(self, soup):
        for noscript in soup.findAll('noscript'):
            if noscript.findAll('img'):
                noscript.name = 'div'
        for img in soup.findAll('img', attrs={'srcset':True}):
            img['src'] = img['srcset'].split()[0]
        return soup
PK�Xhrt���reuters_ja.png�PNG


IHDR�auIDATx�|�P��ٶm�ٶm۶m��iv��l{y������.�6_g�@*1����	���3� +��E&��*$ �e�2�	�Q���`-ǘ��DHJ擆����afӃ�c"GHR��de���V���ldo�������N1����f,�X�2��!�K�A�aQ�&t���µ�'Lf��KW�'	�H9�q�q�y�V3��t���(J+3�W!Ϙ�dR�&�&H�B�P�\Tc{B.ы�te��G��T %���~|�/�Y�&��U��6�IA�� �0���Еu���I�8�������<.3�%� Sjq�o�����%9�I�l#�1Ř��ӌ�|�� җ�\xv�IEND�B`�PK�X����##reuters_ja.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class ReutersJa(BasicNewsRecipe):

    title = 'Reuters(Japan)'
    description = 'Global news in Japanese'
    __author__ = 'Hiroshi Miura'
    use_embedded_content = False
    language = 'ja'
    max_articles_per_feed = 10
    remove_javascript = True
    auto_cleanup = True

    feeds = [(
        'Top Stories', 'http://feeds.reuters.com/reuters/JPTopNews?format=xml'),
        ('World News', 'http://feeds.reuters.com/reuters/JPWorldNews?format=xml'),
        ('Business News', 'http://feeds.reuters.com/reuters/JPBusinessNews?format=xml'),
        ('Technology News', 'http://feeds.reuters.com/reuters/JPTechnologyNews?format=xml'),
        ('Oddly Enough News',
         'http://feeds.reuters.com/reuters/JPOddlyEnoughNews?format=xml')
    ]
PK�XK�ឆ�revista_bla.png�PNG


IHDR��h6MIDATx�c�J�Kb▖�������4 ������݋�M
@9�hD�a�L"ECI��`�����F�Q���?�w����IEND�B`�PK�X�U��ddrevista_bla.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = '2010, Gustavo Azambuja <hola at gazambuja.com>'
'''
http://www.revistabla.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Noticias(BasicNewsRecipe):
    title = 'Revista Bla'
    __author__ = 'Gustavo Azambuja'
    description = 'Moda | Uruguay'
    language = 'es_UY'
    timefmt = '[%a, %d %b, %Y]'
    use_embedded_content = False
    recursion = 5
    encoding = 'utf8'
    remove_javascript = True
    no_stylesheets = True

    oldest_article = 20
    max_articles_per_feed = 100
    keep_only_tags = [dict(id=['body_container'])]
    remove_tags = [
        dict(name='div', attrs={
             'class': ['date_text', 'comments', 'form_section', 'share_it']}),
        dict(name='div', attrs={
             'id': ['relatedPosts', 'spacer', 'banner_izquierda', 'right_container']}),
        dict(name='p', attrs={'class': 'FacebookLikeButton'}),
        dict(name=['object', 'link'])]

    extra_css = '''
                h1{font-family:Geneva, Arial, Helvetica, sans-serif;color:#154B7A;}
                h3{font-size: 14px;color:#999999; font-family:Geneva, Arial, Helvetica, sans-serif;font-weight: bold;}
                h2{color:#666666; font-family:Geneva, Arial, Helvetica, sans-serif;font-size:small;}
                p {font-family:Arial,Helvetica,sans-serif;}
                '''
    feeds = [
        (u'Articulos', u'http://www.revistabla.com/feed/')
    ]

    def get_cover_url(self):
        cover_url = None
        index = 'http://www.revistabla.com'
        soup = self.index_to_soup(index)
        link_item = soup.find('div', attrs={'class': 'header_right'})
        if link_item:
            cover_url = link_item.img['src']
        return cover_url

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X�-revista_cromos.png�PNG


IHDR  D����PLTE�������������������������������������������������������������������������������������������������������������������������������������������������������Ⱦ�Ŀ�Ƽ�½����Ż�º�������¹�����������������������������������������������������������������������������������������������������~�����{��w~�ptvknonstkprnuwouwhmoimomtv�noioqhnoZ_`�`aTWXQUV�RROST�LLFIJEHIEIJCGGADE@CD�AA8;<7:;�;;134�22!#$




���Y��tRNS	!#$'(()*+-/126889<<?BBFFGGHJKLMNOQQRSSSTVWY\^^_chkkllmssstuvvy}}~~����������������������������������������������������������eIDATx�b�
`f����y�8@3DA�����tPQ��e��2B�� �xP h��c�0�k㠶m۶��m�fx����zI���,�&��4KROffɨ4������5�?���4�ew�tB�u�=?d��"y�Y���H�m@�*�4��<f?�ER8�-P��JBg�@�
������!�f��՗~p����&��&�"0vR����A &

a�D�N!����T*l�P5&�D��=���) [��,PXj^��e�?F� n����q��,H�3u~�T^�4{|����j�{����8n��e�{�ͯ�nIEND�B`�PK�XҒ��revista_cromos.recipe# coding=utf-8
# https://github.com/iemejia/calibrecolombia

'''
http://www.cromos.com.co/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ElMalpensante(BasicNewsRecipe):
    title = u'Revista Cromos'
    language = 'es_CO'
    __author__ = 'Ismael Mejia <iemejia@gmail.com>'
    cover_url = 'http://www.cromos.com.co/sites/cromos.com.co/themes/cromos_theme/images/logo_morado.gif'
    description = 'Revista Cromos'
    oldest_article = 7
    simultaneous_downloads = 20
    use_embedded_content = True
    remove_empty_feeds = True
    max_articles_per_feed = 100
    feeds = [(u'Cromos', u'http://www.cromos.com.co/rss.xml'),
             (u'Moda', u'http://www.cromos.com.co/moda/feed'),
             (u'Estilo de Vida',
              u'http://www.cromos.com.co/estilo-de-vida/feed'),
             (u'Cuidado Personal',
              u'http://www.cromos.com.co/estilo-de-vida/cuidado-personal/feed'),
             (u'Salud y Alimentación',
              u'http://www.cromos.com.co/estilo-de-vida/salud-y-alimentacion/feed'),
             (u'Personajes', u'http://www.cromos.com.co/personajes/feed'),
             (u'Actualidad',
              u'http://www.cromos.com.co/personajes/actualidad/feed'),
             (u'Espectáculo',
              u'http://www.cromos.com.co/personajes/espectaculo/feed'),
             (u'Reportajes', u'http://www.cromos.com.co/reportajes/feed'),
             (u'Eventos', u'http://www.cromos.com.co/eventos/feed'),
             (u'Modelos', u'http://www.cromos.com.co/modelos/feed'),
             ]
PK�X�P��ZZrevista_muy.png�PNG


IHDR  ��!IDATx��U��Z=c϶m�۶m۶�Ƕ��Mr{�g�{Nn���,|�׵�{tyv �b`���%�$����V�"���LG�� c�\挌�TF�Y:��8���d�b'�S�`\�ix��fd�1�4-�F&�H͢���3g��4'ה�Kbb	��<�W�b��dS����h,b`�@���#�G=S��G��3�V0T�]_�qK�ZS�fC����5
UՖ�s���l��?�Y����X�T�dY����~T�շ5�7T-ZF|dN���5�v4����(���)�/��
 <����`��?�\2�?���x��?�T^�R�Yg�p@��
Ф��3�Gn��_q�D�:{$��Pɨ�&<MX<[�?L����/9i�R�ΖV��vR\w�[Or7�n�|�clC��'q}��p�N*]wҮ�#'��YoO)i!3��z�O#�\@��	��^0=���v5��·���C�{��-w��z��+X#jf�$�[ɽ���n���#槞38(Z�Vi��’���t��/#%9���$Y�n@'u�E�3V3kt"F:~��޶��؃�D���/?�;o	JGg�eWYy���/�W�`y�ӣO��K�g��8��R�?�\;ݫ���]d4��N�X>���'�<V�`��_�[�pqI<O0Ї���mj�ii�䪏�Bn٥hZ����_!�8WoG;��l�@���z�=���Gub���[��P�ΰ�iF��m�hdCV^��-�J�����VT��Э���Ç�Ѵj��^4J�z������]d��ݧ>� N��?�=��~��k�o�ӷo}�A�M}l�nj鮮kܡ�ik�{@�T٧_�
q�m��=���-�k7o��1����b�ϝ�u��?ODŽ�`��IM#�
���S���������k�3����<L���il
�'��44�xи�Ӏ 1�&�<\��?�#$*��ĊHN%a14$S�+��;��@������dF��)	�b���#��qx',�oZ����
K�IEND�B`�PK�X����!!revista_muy.recipefrom calibre.web.feeds.news import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class RevistaMuyInteresante(BasicNewsRecipe):

    title = 'Revista Muy Interesante'
    __author__ = 'Jefferson Frantz'
    description = 'Revista de divulgacion'
    timefmt = ' [%d %b, %Y]'
    language = 'es'

    no_stylesheets = True
    remove_javascript = True

    conversion_options = {'linearize_tables': True}

    extra_css = ' .txt_articulo{ font-family: sans-serif; font-size: medium; text-align: justify } .contentheading{font-family: serif; font-size: large; font-weight: bold; color: #000000; text-align: center}'  # noqa

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']

        for img_tag in soup.findAll('img'):
            imagen = img_tag
            nt = new_tag(soup, 'p')
            img_tag.replaceWith(nt)
            div = soup.find(attrs={'class': 'article_category'})
            div.insert(0, imagen)
            break
        return soup

    preprocess_regexps = [
        (re.compile(r'<td class="contentheading" width="100%">.*?</td>', re.DOTALL | re.IGNORECASE), lambda match: '<td class="contentheading">' +
         match.group().replace('<td class="contentheading" width="100%">', '').strip().replace('</td>', '').strip() + '</td>'),

    ]

    keep_only_tags = [dict(name='div', attrs={'class': ['article']}), dict(
        name='td', attrs={'class': ['txt_articulo']})]

    remove_tags = [
        dict(name=['object', 'link', 'script', 'ul', 'iframe', 'ins']), dict(name='div', attrs={'id': ['comment']}), dict(name='td', attrs={'class': ['buttonheading']}), dict(name='div', attrs={'class': ['tags_articles', 'bajo_title']}), dict(name='table', attrs={'class': ['pagenav']}), dict(name='form', attrs={'class': ['voteform']})  # noqa
    ]

    remove_tags_after = dict(name='div', attrs={'class': 'tags_articles'})

    # TO GET ARTICLES IN SECTION
    def nz_parse_section(self, url):
        soup = self.index_to_soup(url)
        div = soup.find(attrs={'class': 'contenido'})
        current_articles = []
        for x in div.findAllNext(attrs={'class': ['headline']}):
            a = x.find('a', href=True)
            if a is None:
                continue
            title = self.tag_to_string(a)
            url = a.get('href', False)
            if not url or not title:
                continue
            if url.startswith('/'):
                url = 'http://www.muyinteresante.es' + url
#                    self.log('\t\tFound article:', title)
#                    self.log('\t\t\t', url)
            current_articles.append({'title': title, 'url': url,
                                     'description': '', 'date': ''})

        return current_articles

    # To GET SECTIONS
    def parse_index(self):
        feeds = []
        for title, url in [
            ('Historia',
             'http://www.muyinteresante.es/historia-articulos'),
            ('Ciencia',
             'http://www.muyinteresante.es/ciencia-articulos'),
            ('Naturaleza',
             'http://www.muyinteresante.es/naturaleza-articulos'),
            ('Tecnología',
             'http://www.muyinteresante.es/tecnologia-articulos'),
            ('Salud',
             'http://www.muyinteresante.es/salud-articulos'),
            ('Más Muy',
             'http://www.muyinteresante.es/muy'),
            ('Innova - Automoción',
             'http://www.muyinteresante.es/articulos-innovacion-autos'),
            ('Innova - Salud',
             'http://www.muyinteresante.es/articulos-innovacion-salud'),
            ('Innova - Medio Ambiente',
             'http://www.muyinteresante.es/articulos-innovacion-medio-ambiente'),
            ('Innova - Alimentación',
             'http://www.muyinteresante.es/articulos-innovacion-alimentacion'),
            ('Innova - Sociedad',
             'http://www.muyinteresante.es/articulos-innovacion-sociedad'),
            ('Innova - Tecnología',
             'http://www.muyinteresante.es/articulos-innovacion-tecnologia'),
            ('Innova - Ocio',
             'http://www.muyinteresante.es/articulos-innovacion-ocio'),
        ]:
            articles = self.nz_parse_section(url)
            if articles:
                feeds.append((title, articles))
        return feeds

    def get_cover_url(self):
        index = 'http://www.muyinteresante.es/revista'
        soup = self.index_to_soup(index)
        link_item = soup.find('img', attrs={'class': 'img_portada'})
        if link_item:
            cover_url = "http://www.muyinteresante.es" + link_item['src']
        return cover_url
PK�XS-�[[revista_piaui.png�PNG


IHDR  szz�"IDATxڭWs�$���ٶ��;��m�uZ�l��\�ٶm�5X�ue�4f�U�]��_g���g�]U9�/^(�I)����31��~A����ๆa�z&�W�쾫�-O��7t�]L7��—ݽ���u���W���zs�G�;�[�����5��@�p�*�`H��R�W��O}œ���G���0n��Ig&���I,�1��[�']����%|�Iyچ����5�G��E3z�^H�����2����7�ݯ��K�d�h��7=
��
�?/<@{�q�e�G̜9K�'�^������1���4�@�6�C^T�-G!�Q�W��&/*�qZ����۪�O~�;{w�t��8�VgL���F׊'t�[�#6�)X�nq�Qĥ�!m%d�9E�=b��--�I�os�qH�C�Bv�SZ�M�3�|-��ɱS]s���h����WU��;����j�4v�V�jS�pڳ��H;�!�{G>�Tƣ
�ri9��?7�'9�f5h��G���<������}�#T�~��˙0^�%D���D���󖅮�C�l��ř�%���Y��c�)���:��F���
>���|����XƍUbա�\�*��vHߒ֯)�[�a3���f��I�{ِGv�FcR!�>���}1��#ϻ_�]�\"��"�X�Z��9�H�B�F}��0ąu��ӟz�)��5�8j�(�f&�z�`�K_��~;�?aFspԺ��qH���d��z�2@��6:���Z��<-���Ad=d�1y�^�B"��/M�+�J��ذ"t��{�@�^T+�
j�8�=z�!���t4�SG�f"	�E.��k_vWQv���J8�$~L>oR'֞O�F;]s����[5������״��i�f�J e���x*ᡎ�K�w��
#p/�g{��/{T*���D��%k%��[Z�ӓYgD��ɮyPLF7@����(�	�C�`�=��6ݏ�a>�.f�%]pJ�+��Ӷa[h��w�x�;�y�:h��V����b����I٬�`����3�1�tFtk�d��׋���yS��ߒ0D����/���=<Y�X(���
�� ���
D7T���K
�-�\/)����:1�<	���\*�k*���v�(`+�W����#��ԫ��1"�Tǔ��
%��m_���U��BүZ4b��C<������w)���N�JsJ�.�T�%~M��Q�`,��rFЄr����,(i*Mګݤ�=��Y�FDaE�$S�㝞�QJ��^���+_uUB���)ν�e�0����+1�th>���-S��6yh4��`4��P�W^U!�__'6 ���M
��� ڠ(xF�G�R#��0p�L�`�Dw�SC�c�M��/}T[}~�"����6�:c"�l[WU��Mt}��q�i��?{Xk�C�6�@O@'���E���U4�Qr�h"4n����;�mک�"�6l�`-@I=z��3x�,)���4g��C����9�q����[D�ث��Z�v_B��q7�?b���d/e�&%I&$�<�3g҇Nt-��я�i���ُ�J�#û�!P�+��$<UW��Y���ڋ_�n��ԉ�Dq&<�|�x��6�4����Ʊ��?}�`�dI����4���8�ٰ2t�Sy'!{}�}�MaǸW��,δ[�m<�[i#jŷlX]H�H�H����)��06��K�<�5���-�Xȥ/����ZC��,��r��cD����*A�AA�qb�@��e�����J�&8T���y@{����@:����,$�R�.�9��߯�7��L�^�G����Pޑ�R�vv{��f7�n�V��%�|�����~�~$*B�?��C9wi���C>���ye45WҒ���i��";�a5b
�%뷼�W����]�~��]%��s���@��H:�������/�q�����^��W�'+7EΙ��5�ީ�:AL����-�?�U����;IEND�B`�PK�X*��L@@revista_piaui.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.news import BasicNewsRecipe


class RevistaPiaui(BasicNewsRecipe):
    title = u'Revista piau\xed'
    language = 'pt_BR'
    __author__ = u'Eduardo Gustini Simões'
    oldest_article = 31
    max_articles_per_feed = 50
    auto_cleanup = True

    feeds = [(u'Edi\xe7\xe3o Atual',
              u'http://revistapiaui.estadao.com.br/feed/rss/edicao-atual.xml')]

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        for feed in feeds:
            for article in feed.articles[:]:
                soup = self.index_to_soup(
                    'http://revistapiaui.estadao.com.br/feed/rss/edicao-atual.xml')
                itemTitle = article.title.partition('|')[0].rstrip()
                item = soup.find(text=itemTitle)
                articleDescription = item.parent.parent.description.string.partition(
                    '<br  />')[2]
                article.summary = articleDescription

        return feeds

    def populate_article_metadata(self, article, soup, first):
        h2 = soup.find('h2')
        h2.string.replaceWith(h2.string.partition('|')[0].rstrip())
        h2.replaceWith(h2.prettify() + '<p><em>' + article.summary + '</em></p><p><em>' +
                       ' posted at ' + article.localtime.strftime('%d-%m-%Y') + '</em></p>')
PK�X:a**revista_semana.png�PNG


IHDR  D���PLTE��������&)�SV����*-�IK�RU��.1�-0�"%��������#&�}��!$������`b��68� ����������y{�������xz������58����������@B�EG������km����pr�ce� #������14�RT�tv�{|�')����oq�CF�������HJ�����DG�gi�VX�st�^`�"�������9;�������hj����fh�36�/1����<?�����w��IDATx^�ӵ��@Q׈ef�efff��C��7��'e�)��r��1�Q��^��`��8�"�����B��k�
J@1Z;*��2�Tpt�Y�,l��mW�Q���/ =��]���x$~B�t�����ҩ$������Ն�n�b����E0/o�cF�|N�ߗ���
�N"-�L�-c�����?����	��cIEND�B`�PK�XqxHPFFrevista_semana.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1317341570(BasicNewsRecipe):
    title = u'Revista Semana'
    __author__ = 'BIGO-CAVA'
    language = 'es_CO'
    oldest_article = 7
    max_articles_per_feed = 100

    feeds = [(u'Revista Semana', u'http://www.semana.com/rss/Semana_OnLine.xml')]
PK�Xޭ!�revista_summa.png�PNG


IHDR  D���dPLTE�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�($�)%�84�/+�*&�A>�EB�[X����������������������LH�41�xu璐�,(�;7������������������>:������?<����-)�B?�+'����IF蕔�HD�HD�3/�KH�40�NJ�NK�OL�SO�SP�TQ�VR�VS�YV�,(�_\�b_�gd�he�li�ol�qn�sp�vs�vt�wt�52�yv�zw�|z�~|むダ䄂䇄䇅分劈挊捋揍搎瑏�62�73虗虘雙霚ꡠ릤맥쨧�����ﷵﷶ︷ﹸﺹ��������.*�������������85����������������96��������:7����,)������<8������������=9�=:�/,������?;�0,��������������@<������@=�A=�1-����B>����2.�C?�DA�2/�FC��N�'tRNS"-./012579^abdz|����������������%kJ�@IDATx�\��3Q�gm�mG�v���ٶm۶m�6���|�2� :.�X#)��)Ɍ�"�I(���Ⱥ���|l��T��l�6�@ʍ�Dŗ�0Y�>������?�P���T
�t�C��㾹�h��x
0�O3�w�$~~����
ù�PKB����Z�y��S�y�-	"p���{�̳1�1# &�����v�j�.uZ�(��t��4��E���qtqB�`R4�1@�0�#9K(�~�[f�F����^�}i�4��� �0p�+�F׫�r�$(��?����= (~چ4xC%�K��@G�g�G��Io��
���N�|����;M�%d��5����b�m�ͥ
�2P{�a5c������
Wi��H0vQ��'��х��4�1�=������XB�,a{����gS����ܡ��B&W���7�����/��B͏�-������$k9ִ=�߇����%D�iqg��G0�v#��H*Wa��������G�Y�jy�3b�D�da�1����c#�7�(tx'ɍȼ��/(�2BH�����BEIEND�B`�PK�Xo2�/ddrevista_summa.recipe__license__ = 'GPL v3'
__author__ = 'Vakya'
__version__ = 'v1.0'
__date__ = '14, May 2012'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1336226255(BasicNewsRecipe):

    title = u'Revista Summa'
    publisher = u'Summa'
    __author__ = 'Vakya'
    description = 'Informacion regional sobre economia y negocios'
    language = 'es'

    oldest_article = 15
    max_articles_per_feed = 100
    auto_cleanup = True
    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(name='label')
    feeds = [(u'Revista Summa', u'http://www.revistasumma.com/rss/rss-v2.0.rss')]
PK�Xo��Q^^revista_veintitres.png�PNG


IHDRb��	PLTE��	���΃IDATc\�{�F��Q0�7�pIEND�B`�PK�X��@���revista_veintitres.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2018, Darko Miletic <darko.miletic at gmail.com>'
'''
www.veintitres.com.ar
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Veintitres(BasicNewsRecipe):
    title = 'Revista Veintitres'
    __author__ = 'Darko Miletic'
    description = 'Últimas noticias de Política | Revista Veintitrés, información precisa sin perder la mirada crítica'
    publisher = 'Grupo Crónica'
    category = 'politica, Argentina'
    oldest_article = 15
    max_articles_per_feed = 100
    no_stylesheets = False
    use_embedded_content = False
    encoding = 'utf-8'
    masthead_url = 'https://www.veintitres.com.ar/export/sites/cronica/arte/veintitres/logos/LogoVeintitres.svg_1890729140.svg'
    language = 'es_AR'
    remove_javascript = True
    publication_type = 'magazine'
    remove_empty_feeds = True
    auto_cleanup = True
    auto_cleanup_keep = '//h1'
    resolve_internal_links = True
    INDEX = "https://www.veintitres.com.ar"
    extra_css = """
                                img{margin-bottom: 0.8em}
                            """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language
    }

    feeds = [
        (u'Politica', u'https://www.veintitres.com.ar/seccion/politica/'),
        (
            u'Economia y consumo',
            u'https://www.veintitres.com.ar/seccion/economia-y-consumo/'
        ),
        (u'Cultura', u'https://www.veintitres.com.ar/seccion/cultura/'),
        (
            u'Internacional',
            u'https://www.veintitres.com.ar/seccion/internacionales/'
        ),
        (u'Deportes', u'https://www.veintitres.com.ar/seccion/deportes/'),
        (u'Personajes', u'https://www.veintitres.com.ar/seccion/personajes/'),
        (u'Salud', u'https://www.veintitres.com.ar/seccion/salud/'),
        (u'Negocios', u'https://www.veintitres.com.ar/seccion/negocios/'),
        (u'Especial', u'https://www.veintitres.com.ar/seccion/especial/'),
        (u'Opinion', u'https://www.veintitres.com.ar/seccion/opinion/'),
        (u'Tecnologia', u'https://www.veintitres.com.ar/seccion/tecnologia/'),
    ]

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(
                0,
                _('Fetching feed') + ' %s...' %
                (feedtitle if feedtitle else feedurl)
            )
            articles = []
            soup = self.index_to_soup(feedurl)
            for item in soup.findAll('a', attrs={'class': 'cover-link'}):
                url = self.INDEX + item['href']
                title = item['title']
                articles.append({
                    'title': title,
                    'date': '',
                    'url': url,
                    'description': ''
                })
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X�;���rga.png�PNG


IHDR  D����PLTE������''��++�..��""������22��''�55�==�DD�ZZ䅅頠쯯�畕�ee�mm�pp�ss����몪�]]�``摑��������{{�ww䄄䆆�cc疖瘘�++묬쭭�FF�����������WW����颢�����\\刈剉劊�88�bb�oo�cc�FF��������������蟟���雛��88�rr�gg����bb�@@쳳飣餤蘘������������FF��������JJჃ蜜���蝝�jj�kk�}}�ꦦꧧꨨꩩ�""�pp�BB�;;円촴��HH\�``�ww�zz�;;₂�gg�bb��������;;もꪪ륥릦맧먨멩䃃�LL�������������PP�TT�22�|֧�IDATx^��ӏeA���5�m�X۶m����^<���M��_���D�c�6���-��TH�d1E�1]�y������Ƶ���{çۯ`0����Ծ���96v��u}�{_~��3S�(�&�p��s�0��M32p�<�����c`�w8^�ֈɝaJ�E�b�#w�UC���ӓ�.�-I�G|��:R[�� ճ`�� X�OQ-�B��ǧ�p�)�`Ьh�[Rl�NHٲ��Ѫn;��rqp��Љw�$��oVgF�N�%��C�	zٙ�D�ռ��5��G���X�,��lm���G/��ޒ�T�լA� "/ۍM���u���Jq�/胖��S�x{x�����	�zT@B���Q��Z��I.K��E�%IEND�B`�PK�X������
rga.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, W. Gerard <wii at gerard-nrw.de>'
'''
rga-online.de
'''

from calibre.web.feeds.news import BasicNewsRecipe


class rga_onliner(BasicNewsRecipe):
    title = 'RGA Online - German'
    __author__ = 'Werner Gerard'
    description = "E-Zeitung aus RSS-Artikeln zusammengestellt."
    publisher = 'RGA-Online'
    category = 'Nachrichten, RGA'
    oldest_article = 3
    max_articles_per_feed = 100
    language = 'de'

    lang = 'de-DE'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'cp1252'

    remove_tags_before = dict(name='span', attrs={'class': 'headgross'})
    remove_tags_after = dict(name='br', attrs={'clear': 'all'})

#    remove_tags_after    = dict(name='br', attrs={'clear':'clear'})

    feeds = [
        ('RGA-Online Remscheid', 'http://www.rga-online.de/rss/rs_news.php'),
        ('RGA-Online Wermelskirchen',
         'http://www.rga-online.de/rss/wk_news.php'),
        ('RGA-Online Hueckeswagen',
         'http://www.rga-online.de/rss/hk_news.php'),
        ('RGA-Online Radevormwald',
         'http://www.rga-online.de/rss/rz_news.php'),
        ('RGA-Online Tagesthemen',
         'http://www.rga-online.de/rss/tt_news.php'),
        ('RGA-Online Brennpunkte',
         'http://www.rga-online.de/rss/br_news.php'),
        ('RGA-Online Sport',
         'http://www.rga-online.de/rss/spo_news.php'),
        ('RGA-Online Lokalsport',
         'http://www.rga-online.de/rss/sp_news.php'),
        ('RGA-Online Bergisches Land',
         'http://www.rga-online.de/rss/bg_news.php'),
        ('RGA-Online Bergische Wirtschaft',
         'http://www.rga-online.de/rss/bw_news.php')
    ]

    def get_cover_url(self):
        return 'http://rga.werner-gerard.de/rga.jpg'

    def postprocess_html(self, soup, first):
        for tag in soup.findAll(name=['table', 'tr', 'td']):
            tag.name = 'span'
        return soup
PK�Xd�$��rheinische_post.png�PNG


IHDR  ��lIDATx�c�Oc�0,,hmmAC��m��׬Y}��տ��U�:uSqgW猙3v������̜9���

���'D�Ç{{{��y���[�p� *.)�(������ӧO���	TSW={�,\�J��ڵk!�׮[kbj����b��)�!�yy�p�_�~��C������i��M�6��|�"!)���r�
Q�ɓ'!�@�@��XQ�Qq_?b-Q1�ԭ[7�[P[W���!�I)	���+��[LQ����Q����%\���@ą���\���$AXxD<''�(nݺ���ݻ�[L�@�C�0����m��ŋ-lh������oڌ�R��}�'N߾}[Ss���PDZFjժU��2�0�]�������߿c��p""�O�:����2����o\TTV�[�����}��	_i����k��U�,@�d,���_cc�@C�ׯ_S�pqu�2x9AM�������S-�̚=�~����Y�q�����<w������������U&�зOL��ۧY�Âw�����a�Y�B���������Զ��d:�-m��+�Ź�uIEND�B`�PK�XZ��pIIrheinische_post.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe(BasicNewsRecipe):

    title = u'RP-online'
    __author__ = 'schuster'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'de'
    remove_javascript = True
    masthead_url = 'http://www.die-zeitungen.de/uploads/pics/LOGO_RP_ONLINE_01.jpg'
    cover_url = 'http://www.manroland.com/com/pressinfo_images/com/RheinischePost_Logo_300dpi.jpg'
    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h4{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    img {min-width:300px; max-width:600px; min-height:300px; max-height:800px}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''
    remove_tags_before = dict(id='article_content')
    remove_tags_after = dict(id='article_content')
    remove_tags = [dict(attrs={'class': ['goodies', 'left', 'right', 'clear-all', 'teaser anzeigenwerbung', 'lesermeinung', 'goodiebox', 'goodiebox 1', 'goodiebox 2', 'goodiebox 3', 'boxframe', 'link']}),  # noqa
                   dict(id=['click_Fotos_link']),
                   dict(name=['script', 'noscript', 'style', '_top', 'click_Fotos_link'])]

    feeds = [	(u'Top-News', u'http://www.ngz-online.de/app/feed/rss/topnews'),
              (u'Politik', u'http://www.ngz-online.de/app/feed/rss/politik'),
              (u'Wirtschaft', u'http://www.ngz-online.de/app/feed/rss/wirtschaft'),
              (u'Panorama', u'http://www.ngz-online.de/app/feed/rss/panorama'),
              (u'Sport', u'http://www.ngz-online.de/app/feed/rss/sport'),
              (u'Tour de France', u'http://www.ngz-online.de/app/feed/rss/tourdefrance'),
              (u'Fußball', u'http://www.ngz-online.de/app/feed/rss/fussball'),
              (u'Fußball BuLi', u'http://www.ngz-online.de/app/feed/rss/bundesliga'),
              (u'Formel 1', u'http://www.ngz-online.de/app/feed/rss/formel1'),
              (u'US-Sport', u'http://www.ngz-online.de/app/feed/rss/us-sports'),
              (u'Boxen', u'http://www.ngz-online.de/app/feed/rss/boxen'),
              (u'Eishockey', u'http://www.ngz-online.de/app/feed/rss/eishockey'),
              (u'Basketball', u'http://www.ngz-online.de/app/feed/rss/basketball'),
              (u'Handball', u'http://www.ngz-online.de/app/feed/rss/handball'),
              (u'Motorsport', u'http://www.ngz-online.de/app/feed/rss/motorsport'),
              (u'Tennis', u'http://www.ngz-online.de/app/feed/rss/tennis'),
              (u'Radsport', u'http://www.ngz-online.de/app/feed/rss/radsport'),
              (u'Kultur', u'http://www.ngz-online.de/app/feed/rss/kultur'),
              (u'Gesellschaft', u'http://www.ngz-online.de/app/feed/rss/gesellschaft'),
              (u'Wissenschaft', u'http://www.ngz-online.de/app/feed/rss/wissen'),
              (u'Gesundheit', u'http://www.ngz-online.de/app/feed/rss/gesundheit'),
              (u'Digitale Welt', u'http://www.ngz-online.de/app/feed/rss/digitale'),
              (u'Auto & Mobil', u'http://www.ngz-online.de/app/feed/rss/auto'),
              (u'Reise & Welt', u'http://www.ngz-online.de/app/feed/rss/reise'),
              (u'Beruf & Karriere', u'http://www.ngz-online.de/app/feed/rss/beruf'),
              (u'Herzrasen', u'http://www.ngz-online.de/app/feed/rss/herzrasen'),
              (u'About a Boy', u'http://www.ngz-online.de/app/feed/rss/about_a_boy'),

              ]
PK�X�_�u��
ria_ru.png�PNG


IHDR(-S3PLTE������@`�@���� `�������`������� @�@��`������_tRNS@��fvIDATx^��G�@Cі:Np��i���X��/_�$U��󼀪�d�%��8},�m>�s`m����&3{���RM��>.���
O'o0e�C�-Z�G���E��]d~��3l��
�HQ�	H�K��IEND�B`�PK�X���6��
ria_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.ria.ru
'''

from calibre.web.feeds.news import BasicNewsRecipe


class RIANovosti(BasicNewsRecipe):
    title = 'RIA Novosti - Russian'
    __author__ = 'Darko Miletic (with fixes by bugmen00t)'
    description = 'News from Russia'
    publisher = '\u041C\u0418\u0410 \u00AB\u0420\u043E\u0441\u0441\u0438\u044F \u0441\u0435\u0433\u043E\u0434\u043D\u044F\u00BB\u2028 (MIA Russia Today)'
    category = 'news, politics, Russia'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    language = 'ru'
    publication_type = 'newsportal'
    cover_url = 'https://oldimg.ria.ru/i/ria_social.png'

    remove_tags_before = dict(name='div', attrs={'class': 'article__header'})

    remove_tags_after = dict(name='div', attrs={'class': 'article__userbar'})

    remove_tags = [
        dict(name='div', attrs={'class': 'article__userbar'}),
        dict(name='div', attrs={'class': 'article__title'}),
        dict(name='div', attrs={'class': 'article__aggr'}),
        dict(name='div', attrs={'class': 'article__article-info'})
    ]

    feeds = [(
        u'\u041B\u0435\u043D\u0442\u0430 \u043D\u043E\u0432\u043E\u0441\u0442\u0435\u0439',
        u'https://ria.ru/export/rss2/archive/index.xml'
    )]
PK�X2q�D�	�	rian_eng.png�PNG


IHDR  szz�	pHYs��~�	:IDAT��ٯ��Y������i��v�1�]%�;�jS
�h+�@U
�;�G q�	RO���T@�҄N�x�vl���q�����r��RQ�K�
$�Q,��h��B�k�����L�/�#��/�� >���h�e$B�
N���ɯ@R�R��"�k����/�Ă�<�vCV�O2-5�M�ȈP)j#$�:vG]����n�}�x""X��y����R�>j������	>��������Mp�z�6tu8lc2���iۢ�3O��w�����޷�����k���mۆ�D�j���sҦ�‰���<Y=}헲��<q����K��g��4��O�&c�G�\]4�a7����{Oors<�����������aD�^������^���bA
��M��
�dmK?��S�[�\�/���N��Љ���~ؕi[T'�A7v���`<욥q���������Oo߽u��Ѡ����v�;��_�ꟼ�ʏ��B�u�|>�Р����怢�-��tv��g?y��_4|1�{Os��ΰ�n]�﷧�]�ް�3v���`��.Oƃ�N��y���&�<�r���>u���l:����ңt���������:�V���͓���O\z�n�������Z瑙,�FS~���(���]�73��i�J���2D�^jM[������r����R�������ͽ�_�����Y�D3����-���;�ƹ/Mg�g�wb�u�u�N���ۦ�2YO�(1KS���4;]��w���lo�;Y[.o�X^�|�ʯ��-�>t���K)������hm2��µх��wK�?��9�P)���P��#�i���[k�Lk�3}S.bwm);Ƶfs������y7r���!�wz�o;�fLs����O�A�q�~vx�?z,��8 ,�,�#n�ƌ�\4D��Z�6�n�cIK%J?����޼�Y�G��u��ƍ����<,���OY���V�(��r��0C
Dc M��nKz�f��g�;��v�~�f��Zߩ��M1�L���Rt�^����h4>~�#W�[_�����ir~���'s�l[ܴUv�V�H�����{�8��5^�p��~=�ir%�3�&�jO��CA��c:��ujm�׮]����Rν������NB`ㄒ���6�{�}õ�<_�4?)��K�5\Ls��Zk_��k�c����ĝ��?>Ε���~��_����B	Imn��ش}�"xd�O�ް9��6�'�4�tH��|{� �쮔8��gA[��HZ�	��`��M��=J��
Io�.�~>��ךK5s7�/�y���=Ğ�̽�95�$͝R����R�H"(łѳ j�R§���nx��ߪ#������;��!�(�7ҽ��fS�a۔l2��p8cR�&k
۽��b��aF�������ݐ�C��)�sAȌҞ�9�ӑ�g7��TB*���DYž�s��,020�#�gmo�yq+"�H�6�l�Ll�PmW���ә���Ԧ�������%���c�<
�!!�'0Oȶ����,�q'���3iT��j���;s�̉�bu>W��(���t�W4/7<|�G���t�=�128md��"2�#�H:\�=5�&��&v1%�خ5�b{%J�Σ�w���O����0�O����W=k�:�����@ ����+��0	�6��=�3�A&,0��Z�nHK��W�񃯿|��k/7��x�>��]:G�_#��B�gb	�D���/�^I`5��&DE�Bvf�0��j����i����ۏw���&��FMo���'HP���@i���VbjX�q�LۙY��k0����_V⯌~�B4]��t�(�f8T3���;�C�H @���f�E�t4ݤo��;��`������ww���G��a�#s�.���O�`r�.j
u���e�0iR`��c��66vV�+�D��n���v0����w�v���ۯ|�?��A
5��$�[޻3er�&�t���H��7^`����$�8�XAKA��DԔk�NՔ�Y��x�zݽ�G��o��~�ѽ7�4@U�^ �,�ҙ�*��WY9s���9���
��s�����1�B�6B
i?č2\z�����oM�ƍܹy�4�&��d?`$�,(de��*[���K�z�:}�2�U)���JA�Cɷ��M{�>�{z�ߧy�P��$��?#��y_4�-A�<�9M�a �X>P���r�tD?�9݇:`$~��	�?"��@�L�H���T�RPXPq�t���/n|�U�FIEND�B`�PK�X���HHrian_eng.recipe
__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
en.rian.ru
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Ria_eng(BasicNewsRecipe):
    title = 'Ria Novosti'
    __author__ = 'Darko Miletic'
    description = 'News from Russia in English'
    language = 'en_RU'
    publisher = 'en.rian.ru'
    category = 'news, politics, Russia'
    oldest_article = 3
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [dict(name='div', attrs={'class': 'article'})]

    remove_tags = [
        dict(name=['object', 'link', 'iframe', 'base']), dict(name='div', attrs={'class': [
            'related', 'mmban', 'view-story']}), dict(name='span', attrs={'class': 'copyright'})
    ]
    remove_tags_after = dict(name='div', attrs={'class': 'text'})

    feeds = [(u'Online news', u'http://en.rian.ru/export/rss2/archive/index.xml')]
PK�X2q�D�	�	rian_spa.png�PNG


IHDR  szz�	pHYs��~�	:IDAT��ٯ��Y������i��v�1�]%�;�jS
�h+�@U
�;�G q�	RO���T@�҄N�x�vl���q�����r��RQ�K�
$�Q,��h��B�k�����L�/�#��/�� >���h�e$B�
N���ɯ@R�R��"�k����/�Ă�<�vCV�O2-5�M�ȈP)j#$�:vG]����n�}�x""X��y����R�>j������	>��������Mp�z�6tu8lc2���iۢ�3O��w�����޷�����k���mۆ�D�j���sҦ�‰���<Y=}헲��<q����K��g��4��O�&c�G�\]4�a7����{Oors<�����������aD�^������^���bA
��M��
�dmK?��S�[�\�/���N��Љ���~ؕi[T'�A7v���`<욥q���������Oo߽u��Ѡ����v�;��_�ꟼ�ʏ��B�u�|>�Р����怢�-��tv��g?y��_4|1�{Os��ΰ�n]�﷧�]�ް�3v���`��.Oƃ�N��y���&�<�r���>u���l:����ңt���������:�V���͓���O\z�n�������Z瑙,�FS~���(���]�73��i�J���2D�^jM[������r����R�������ͽ�_�����Y�D3����-���;�ƹ/Mg�g�wb�u�u�N���ۦ�2YO�(1KS���4;]��w���lo�;Y[.o�X^�|�ʯ��-�>t���K)������hm2��µх��wK�?��9�P)���P��#�i���[k�Lk�3}S.bwm);Ƶfs������y7r���!�wz�o;�fLs����O�A�q�~vx�?z,��8 ,�,�#n�ƌ�\4D��Z�6�n�cIK%J?����޼�Y�G��u��ƍ����<,���OY���V�(��r��0C
Dc M��nKz�f��g�;��v�~�f��Zߩ��M1�L���Rt�^����h4>~�#W�[_�����ir~���'s�l[ܴUv�V�H�����{�8��5^�p��~=�ir%�3�&�jO��CA��c:��ujm�׮]����Rν������NB`ㄒ���6�{�}õ�<_�4?)��K�5\Ls��Zk_��k�c����ĝ��?>Ε���~��_����B	Imn��ش}�"xd�O�ް9��6�'�4�tH��|{� �쮔8��gA[��HZ�	��`��M��=J��
Io�.�~>��ךK5s7�/�y���=Ğ�̽�95�$͝R����R�H"(łѳ j�R§���nx��ߪ#������;��!�(�7ҽ��fS�a۔l2��p8cR�&k
۽��b��aF�������ݐ�C��)�sAȌҞ�9�ӑ�g7��TB*���DYž�s��,020�#�gmo�yq+"�H�6�l�Ll�PmW���ә���Ԧ�������%���c�<
�!!�'0Oȶ����,�q'���3iT��j���;s�̉�bu>W��(���t�W4/7<|�G���t�=�128md��"2�#�H:\�=5�&��&v1%�خ5�b{%J�Σ�w���O����0�O����W=k�:�����@ ����+��0	�6��=�3�A&,0��Z�nHK��W�񃯿|��k/7��x�>��]:G�_#��B�gb	�D���/�^I`5��&DE�Bvf�0��j����i����ۏw���&��FMo���'HP���@i���VbjX�q�LۙY��k0����_V⯌~�B4]��t�(�f8T3���;�C�H @���f�E�t4ݤo��;��`������ww���G��a�#s�.���O�`r�.j
u���e�0iR`��c��66vV�+�D��n���v0����w�v���ۯ|�?��A
5��$�[޻3er�&�t���H��7^`����$�8�XAKA��DԔk�NՔ�Y��x�zݽ�G��o��~�ѽ7�4@U�^ �,�ҙ�*��WY9s���9���
��s�����1�B�6B
i?č2\z�����oM�ƍܹy�4�&��d?`$�,(de��*[���K�z�:}�2�U)���JA�Cɷ��M{�>�{z�ߧy�P��$��?#��y_4�-A�<�9M�a �X>P���r�tD?�9݇:`$~��	�?"��@�L�H���T�RPXPq�t���/n|�U�FIEND�B`�PK�X�"�5��rian_spa.recipe
__license__ = 'GPL v3'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
sp.rian.ru
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Ria_esp(BasicNewsRecipe):
    title = 'Ria Novosti'
    __author__ = 'Darko Miletic'
    description = 'Noticias desde Russia en Castellano'
    language = 'es'
    publisher = 'sp.rian.ru'
    category = 'news, politics, Russia'
    oldest_article = 3
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [dict(
        name='div', attrs={'class': ['mainnewsrubric', 'titleblock', 'mainnewstxt']})]
    remove_tags = [dict(name=['object', 'link', 'iframe', 'base'])]

    feeds = [
        (u'Noticias', u'http://rss.feedsportal.com/c/860/fe.ed/sp.rian.ru/export/rss2/index.xml')]
PK�XĝHrmf24_ESKN.png�PNG


IHDR�a�IDATx����w������]�GͳˤB�Il*(��kqUTH�ꀱK4��L�6lc��l��M*#3.��{�:M��{w����w���:�v���$�d�L�RG�ty'P�
����(Q�$%2HmGD\:*�V1x��}��>�k�a���\�I��i)ڕ"�n�Õ�?8�}��,R�k��/LO�<��V�W���D;A���	��=�����c�jv^<��?���f��<��׬=n}��!�1_x��1��ê�;���������Ub�/�7�@���vg92�|=���un
ݰ��i�m];�M���ki��z��ER�(�)�^1�O���Зk,U���U���A���&����g7��- 4��ڪ�^uYj �i��l�hV���t��sX5��
2@�l��@����g����1�ay��z�@]0��<_���(�g����t���IEND�B`�PK�X���rmf24_ESKN.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = u'2010, Tomasz Dlugosz <tomek3d@gmail.com>'
'''
rmf24.pl
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class RMF24_ESKN(BasicNewsRecipe):
    title = u'Rmf24.pl - Ekonomia Sport Kultura Nauka'
    description = u'Ekonomia, sport, kultura i nauka ze strony rmf24.pl'
    language = 'pl'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = u'Tomasz D\u0142ugosz'
    no_stylesheets = True
    remove_javascript = True

    feeds = [(u'Ekonomia', u'http://www.rmf24.pl/ekonomia/feed'),
             (u'Sport', u'http://www.rmf24.pl/sport/feed'),
             (u'Kultura', u'http://www.rmf24.pl/kultura/feed'),
             (u'Nauka', u'http://www.rmf24.pl/nauka/feed')]

    keep_only_tags = [
        dict(name='header', attrs={'class': 'article-header'}),
        dict(name='div', attrs={'class': 'article-container'})]

    remove_tags = [dict(name='div', attrs={'id': 'ReklamaMobile'}),
        dict(name='img', attrs={'class': 'img-responsive hidden-lg hidden-md hidden-sm'})]

    extra_css = '''
        h1 { font-size: 1.2em; }
        '''

    preprocess_regexps = [
        (re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
        [
            (r'<h2>Zdj.cie</h2>', lambda match: ''),
            (r'<a href="http://www.facebook.com/pages/RMF24pl/.*?>RMF24.pl</a> on Facebook</div>',
             lambda match: '</div>')
        ]
    ]
PK�XĝHrmf24_fakty.png�PNG


IHDR�a�IDATx����w������]�GͳˤB�Il*(��kqUTH�ꀱK4��L�6lc��l��M*#3.��{�:M��{w����w���:�v���$�d�L�RG�ty'P�
����(Q�$%2HmGD\:*�V1x��}��>�k�a���\�I��i)ڕ"�n�Õ�?8�}��,R�k��/LO�<��V�W���D;A���	��=�����c�jv^<��?���f��<��׬=n}��!�1_x��1��ê�;���������Ub�/�7�@���vg92�|=���un
ݰ��i�m];�M���ki��z��ER�(�)�^1�O���Зk,U���U���A���&����g7��- 4��ڪ�^uYj �i��l�hV���t��sX5��
2@�l��@����g����1�ay��z�@]0��<_���(�g����t���IEND�B`�PK�X��Crmf24_fakty.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = u'2010, Tomasz Dlugosz <tomek3d@gmail.com>'
'''
rmf24.pl
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class RMF24(BasicNewsRecipe):
    title = u'Rmf24.pl - Fakty'
    description = u'Fakty ze strony rmf24.pl'
    language = 'pl'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = u'Tomasz D\u0142ugosz'
    no_stylesheets = True
    remove_javascript = True

    feeds = [(u'Kraj', u'http://www.rmf24.pl/fakty/polska/feed'),
             (u'\u015awiat', u'http://www.rmf24.pl/fakty/swiat/feed')]

    keep_only_tags = [
        dict(name='header', attrs={'class': 'article-header'}),
        dict(name='div', attrs={'class': 'article-container'})]

    remove_tags = [dict(name='div', attrs={'id': 'ReklamaMobile'}),
        dict(name='img', attrs={'class': 'img-responsive hidden-lg hidden-md hidden-sm'})]

    extra_css = '''
        h1 { font-size: 1.2em; }
        '''
    preprocess_regexps = [
        (re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
        [
            (r'<h2>Zdj.cie</h2>', lambda match: ''),
            (r'<a href="http://www.facebook.com/pages/RMF24pl/.*?>RMF24.pl</a> on Facebook</div>',
             lambda match: '</div>')
        ]
    ]
PK�XĝHrmf24_opinie.png�PNG


IHDR�a�IDATx����w������]�GͳˤB�Il*(��kqUTH�ꀱK4��L�6lc��l��M*#3.��{�:M��{w����w���:�v���$�d�L�RG�ty'P�
����(Q�$%2HmGD\:*�V1x��}��>�k�a���\�I��i)ڕ"�n�Õ�?8�}��,R�k��/LO�<��V�W���D;A���	��=�����c�jv^<��?���f��<��׬=n}��!�1_x��1��ê�;���������Ub�/�7�@���vg92�|=���un
ݰ��i�m];�M���ki��z��ER�(�)�^1�O���Зk,U���U���A���&����g7��- 4��ڪ�^uYj �i��l�hV���t��sX5��
2@�l��@����g����1�ay��z�@]0��<_���(�g����t���IEND�B`�PK�X���$$rmf24_opinie.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = u'2010, Tomasz Dlugosz <tomek3d@gmail.com>'
'''
rmf24.pl
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class RMF24_opinie(BasicNewsRecipe):
    title = u'Rmf24.pl - Opinie'
    description = u'Blogi, wywiady i komentarze ze strony rmf24.pl'
    language = 'pl'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = u'Tomasz D\u0142ugosz'
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True

    feeds = [(u'Blogi', u'http://www.rmf24.pl/opinie/blogi/feed'),
             (u'Kontrwywiad',
              u'http://www.rmf24.pl/opinie/wywiady/kontrwywiad/feed'),
             (u'Przes\u0142uchanie',
              u'http://www.rmf24.pl/opinie/wywiady/przesluchanie/feed'),
             (u'Komentarze', u'http://www.rmf24.pl/opinie/komentarze/feed')]

    keep_only_tags = [
        dict(name='header', attrs={'class': 'article-header'}),
        dict(name='div', attrs={'class': 'article-container'})]

    remove_tags = [dict(name='div', attrs={'id': 'ReklamaMobile'})]

    extra_css = '''
        h1 { font-size: 1.2em; }
    '''

    # thanks to Kovid Goyal
    def get_article_url(self, article):
        link = article.get('link')
        if '/audio,aId' not in link:
            return link

    preprocess_regexps = [
        (re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
        [
            (r'<h2>Zdj.cie</h2>', lambda match: ''),
            (r'embed embed(Left|Right|Center) articleEmbed(Audio|Wideo articleEmbedVideo|ArticleFull|ArticleTitle|ArticleListTitle|AlbumHorizontal)">', lambda match: 'REMOVE">'),  # noqa
            (r'<a href="http://www.facebook.com/pages/RMF24pl/.*?>RMF24.pl</a> on Facebook</div>',
             lambda match: '</div>')
        ]
    ]
PK�X/ZUCCroger_ebert.png�PNG


IHDR  D����PLTE������   ,,,������%%%���***HHHNNNTTTXXX[[[dddfffiiimmmppp|||���������������������


����������������������������������������������lz�tRNS
&2Z���������j�IIDATx�t����`���U�׶m��3]��?��Zn������.�$�i��!K�G��-y�i๗4E)��͠����.-t���>YT)	v>��NJ�x�_!�^���$yA<b6$XB�c!7!$$9D�}�H ���"�IM�z���hy����e�W�j���|C��S�:��@�̈�zR���:֍A=ǠoRڀU
��)2�]Öm3��b�*lf��QC���e�u�{4ZX��cc,�
)�%u��L��g�-�dO8��z�3/��j=�8���IEND�B`�PK�X32��roger_ebert.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class Ebert(BasicNewsRecipe):
    title = 'Roger Ebert'
    __author__ = 'Shane Erstad'
    description = 'Roger Ebert Movie Reviews'
    publisher = 'Chicago Sun Times'
    category = 'movies'
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    masthead_url = 'http://rogerebert.suntimes.com/graphics/global/roger.jpg'
    language = 'en'
    remove_empty_feeds = False
    PREFIX = 'http://rogerebert.suntimes.com'
    patternReviews = r'<span class="*?movietitle"*?>(.*?)</span>.*?<div class="*?headline"*?>(.*?)</div>(.*?)</div>'
    patternCommentary = r'<div class="*?headline"*?>.*?(<a href="/apps/pbcs.dll/article\?AID=.*?COMMENTARY.*?" id="ltred">.*?</a>).*?<div class="blurb clear">(.*?)</div>'  # noqa
    patternPeople = r'<div class="*?headline"*?>.*?(<a href="/apps/pbcs.dll/article\?AID=.*?PEOPLE.*?" id="ltred">.*?</a>).*?<div class="blurb clear">(.*?)</div>'  # noqa
    patternGlossary = r'<div class="*?headline"*?>.*?(<a href="/apps/pbcs.dll/article\?AID=.*?GLOSSARY.*?" id="ltred">.*?</a>).*?<div class="blurb clear">(.*?)</div>'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    feeds = [

    (u'Reviews', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=reviews'),
    (u'Commentary', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=COMMENTARY'),
    (u'Great Movies', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=REVIEWS08'),
    (u'People', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=PEOPLE'),
    (u'Glossary', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=GLOSSARY')

    ]

    preprocess_regexps = [
        (re.compile(r'<font.*?>.*?This is a printer friendly.*?</font>.*?<hr>', re.DOTALL | re.IGNORECASE),
            lambda m: '')
    ]

    def print_version(self, url):
        return url + '&template=printart'

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.log('\tFeedurl: ', feedurl)
            self.report_progress(0, _('Fetching feed') + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            page = self.index_to_soup(feedurl, raw=True)

            if feedtitle == 'Reviews' or feedtitle == 'Great Movies':
                pattern = self.patternReviews
            elif feedtitle == 'Commentary':
                pattern = self.patternCommentary
            elif feedtitle == 'People':
                pattern = self.patternPeople
            elif feedtitle == 'Glossary':
                pattern = self.patternGlossary

            regex = re.compile(pattern, re.IGNORECASE | re.DOTALL)

            for match in regex.finditer(page):
                if feedtitle == 'Reviews' or feedtitle == 'Great Movies':
                    movietitle = match.group(1)
                    thislink = match.group(2)
                    description = match.group(3)
                elif feedtitle == 'Commentary' or feedtitle == 'People' or feedtitle == 'Glossary':
                    thislink = match.group(1)
                    description = match.group(2)

                self.log(thislink)
                soup = self.index_to_soup(thislink)
                for link in soup.findAll('a', href=True):
                    thisurl = self.PREFIX + link['href']
                    thislinktext = self.tag_to_string(link)

                    if feedtitle == 'Reviews' or feedtitle == 'Great Movies':
                        thistitle = movietitle
                    elif feedtitle == 'Commentary' or feedtitle == 'People' or feedtitle == 'Glossary':
                        thistitle = thislinktext

                    if thistitle == '':
                        thistitle = 'Ebert Journal Post'

                    r"""
                    pattern2 = r'AID=\/(.*?)\/'
                    reg2 = re.compile(pattern2, re.IGNORECASE|re.DOTALL)
                    match2 = reg2.search(thisurl)
                    date = match2.group(1)
                    c = time.strptime(match2.group(1),"%Y%m%d")
                    date=time.strftime("%a, %b %d, %Y", c)
                    self.log(date)
                    """

                    articles.append({
                        'title': thistitle, 'date': '', 'url': thisurl, 'description': description
                    })
            totalfeeds.append((feedtitle, articles))

        return totalfeeds
PK�X/ZUCCroger_ebert_blog.png�PNG


IHDR  D����PLTE������   ,,,������%%%���***HHHNNNTTTXXX[[[dddfffiiimmmppp|||���������������������


����������������������������������������������lz�tRNS
&2Z���������j�IIDATx�t����`���U�׶m��3]��?��Zn������.�$�i��!K�G��-y�i๗4E)��͠����.-t���>YT)	v>��NJ�x�_!�^���$yA<b6$XB�c!7!$$9D�}�H ���"�IM�z���hy����e�W�j���|C��S�:��@�̈�zR���:֍A=ǠoRڀU
��)2�]Öm3��b�*lf��QC���e�u�{4ZX��cc,�
)�%u��L��g�-�dO8��z�3/��j=�8���IEND�B`�PK�X\�r���roger_ebert_blog.recipeimport re
import time
from calibre.web.feeds.news import BasicNewsRecipe
from calibre import strftime

'''
      Help Needed:
       Still can't figure out why I'm getting strange characters.  Esp. the Great Movies descriptions in the TOC.
       Anyone help me figure that out?

      Change Log:
       2011-02-19:  Version 2:  Added "Oscars" section and fixed date problem
'''


class Ebert(BasicNewsRecipe):
    title = 'Roger Ebert'
    __author__ = 'Shane Erstad'
    version = 2
    description = 'Roger Ebert Movie Reviews'
    publisher = 'Chicago Sun Times'
    category = 'movies'
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'UTF-8'
    masthead_url = 'http://rogerebert.suntimes.com/graphics/global/roger.jpg'
    language = 'en'
    remove_empty_feeds = False
    PREFIX = 'http://rogerebert.suntimes.com'
    patternReviews = r'<span class="*?movietitle"*?>(.*?)</span>.*?<div class="*?headline"*?>(.*?)</div>(.*?)</div>'
    patternCommentary = r'<div class="*?headline"*?>.*?(<a href="/apps/pbcs.dll/article\?AID=.*?COMMENTARY.*?" id="ltred">.*?</a>).*?<div class="blurb clear">(.*?)</div>'  # noqa
    patternPeople = r'<div class="*?headline"*?>.*?(<a href="/apps/pbcs.dll/article\?AID=.*?PEOPLE.*?" id="ltred">.*?</a>).*?<div class="blurb clear">(.*?)</div>'  # noqa
    patternOscars = r'<div class="*?headline"*?>.*?(<a href="/apps/pbcs.dll/article\?AID=.*?OSCARS.*?" id="ltred">.*?</a>).*?<div class="blurb clear">(.*?)</div>'  # noqa
    patternGlossary = r'<div class="*?headline"*?>.*?(<a href="/apps/pbcs.dll/article\?AID=.*?GLOSSARY.*?" id="ltred">.*?</a>).*?<div class="blurb clear">(.*?)</div>'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    feeds = [

    (u'Reviews', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=reviews'),
    (u'Commentary', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=COMMENTARY'),
    (u'Great Movies', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=REVIEWS08'),
    (u'People', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=PEOPLE'),
    (u'Oscars', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=OSCARS'),
    (u'Glossary', u'http://rogerebert.suntimes.com/apps/pbcs.dll/section?category=GLOSSARY')

    ]

    preprocess_regexps = [
        (re.compile(r'<font.*?>.*?This is a printer friendly.*?</font>.*?<hr>', re.DOTALL | re.IGNORECASE),
            lambda m: '')
    ]

    def print_version(self, url):
        return url + '&template=printart'

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.log('\tFeedurl: ', feedurl)
            self.report_progress(0, _('Fetching feed') + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            page = self.index_to_soup(feedurl, raw=True)

            if feedtitle == 'Reviews' or feedtitle == 'Great Movies':
                pattern = self.patternReviews
            elif feedtitle == 'Commentary':
                pattern = self.patternCommentary
            elif feedtitle == 'People':
                pattern = self.patternPeople
            elif feedtitle == 'Glossary':
                pattern = self.patternGlossary
            elif feedtitle == 'Oscars':
                pattern = self.patternOscars

            regex = re.compile(pattern, re.IGNORECASE | re.DOTALL)

            for match in regex.finditer(page):
                if feedtitle == 'Reviews' or feedtitle == 'Great Movies':
                    movietitle = match.group(1)
                    thislink = match.group(2)
                    description = match.group(3)
                elif feedtitle == 'Commentary' or feedtitle == 'People' or feedtitle == 'Glossary' or feedtitle == 'Oscars':
                    thislink = match.group(1)
                    description = match.group(2)

                self.log(thislink)
                soup = self.index_to_soup(thislink)

                for link in soup.findAll('a', href=True):
                    thisurl = self.PREFIX + link['href']
                    thislinktext = self.tag_to_string(link)

                    if feedtitle == 'Reviews' or feedtitle == 'Great Movies':
                        thistitle = movietitle
                    elif feedtitle == 'Commentary' or feedtitle == 'People' or feedtitle == 'Glossary' or feedtitle == 'Oscars':
                        thistitle = thislinktext

                    if thistitle == '':
                        continue

                    pattern2 = r'AID=\/(.*?)\/'
                    reg2 = re.compile(pattern2, re.IGNORECASE | re.DOTALL)
                    match2 = reg2.search(thisurl)
                    if match2:
                        c = time.strptime(match2.group(1), "%Y%m%d")
                        mydate = strftime("%A, %B %d, %Y", c)
                    else:
                        mydate = strftime("%A, %B %d, %Y")
                    self.log(mydate)

                    articles.append({
                        'title': thistitle, 'date': '  [' + mydate + ']', 'url': thisurl, 'description': description
                    })
            totalfeeds.append((feedtitle, articles))

        return totalfeeds
PK�XM1�NNrollingstone.png�PNG


IHDR��h6IDATx�M�Mo�@��;b;���@��@��Pm�D����Q%���J���g�ީ�!�OJ�@%B�!�Z%���j�����;�1"��ۍ�j�f=��]�&V��:QBܸ*�lP1�t�{�B�vR���u����6!;P���D����O�˩���?����g`0%�Y���^7�4s�$qЇ�Ĺ[dP�#�n�����B��7���	s�^7�T��ze�< SW�5^�6�ގ�k�
GJ�y��"�g{J]2��4c�vӷ����Kmc�#����[T8}�B��5�A8�Qvx���ׁ,���ū�b�ض������@%-�ɬ��"s�(�H��7�N7܉��;����j>��G��BX-]�����)�|�ԉ��nr�*�%%���;�v�xA��'14)2T!!З�4�����(-�B0%�҇�u߿�m�6��JC9FN'ݸ��q��Ī�J*F}�ݷz�j0n�b|ք�Z;}�UL��X,�Ǫi���ѣ�ƥ7�B�.X��a�$����IEND�B`�PK�Xʝ��}}rollingstone.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
rollingstone.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class RollingStone(BasicNewsRecipe):
    title = 'Rolling Stone Magazine - free content'
    __author__ = 'Darko Miletic'
    description = 'Rolling Stone Magazine features music, album and artist news, movie reviews, political, economic and pop culture commentary, videos, photos, and more.'  # noqa
    publisher = 'Werner Media inc.'
    category = 'news, music, USA, world'
    oldest_article = 15
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'magazine'
    auto_cleanup = True

    feeds = [
        (u'All News', u'http://www.rollingstone.com/siteServices/rss/allNews'),
    ]
PK�Xg�9S��romanialibera.png�PNG


IHDR(-S3PLTE���������������Ժ�Ģ�����������Jl�Fl�Bl�6\|.\tLlDVd��KIDATxڅ����h����]���Ӥ��h��N� ���@zJ��8����V+^+W��R��*8	���r;�5�Ԏ]IEND�B`�PK�X����romanialibera.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
romanialibera.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class RomaniaLibera(BasicNewsRecipe):
    title = u'Rom\u00e2nia Liber\u0103'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Rom\u00e2nia Liber\u0103'
    publisher = u'Rom\u00e2nia Liber\u0103'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri'
    encoding = 'utf-8'
    cover_url = 'http://www.romanialibera.ro/templates/lilac/images/sigla_1.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'articol'})
    ]

    remove_tags = [
        dict(name='div', attrs={'id': ['art_actions']}), dict(name='div', attrs={'class': ['stats']}), dict(name='div', attrs={'class': ['data']}), dict(name='div', attrs={'class': ['autori']}), dict(name='div', attrs={'class': ['banda_explicatii_text']}), dict(name='td', attrs={'class': ['connect_widget_vertical_center connect_widget_button_cell']}), dict(name='div', attrs={'class': ['aceeasi_tema']}), dict(name='div', attrs={'class': ['art_after_text']}), dict(name='div', attrs={'class': ['navigare']}), dict(name='div', attrs={'id': ['art_text_left']})  # noqa
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': 'art_after_text'})
    ]

    feeds = [
        (u'Feeds', u'http://www.romanialibera.ro/rss.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X
�.:��root.png�PNG


IHDR(-S`PLTEWVR������r/�}#��������trmvdF�u-�������v+�x)tdIXWS����������������	m_I���xwr������nfX���ZIDATxڜ���0s��w	�?��5�W'���oD�I��Ղ��Px.Qτ�P[�p�l�v�&�9Έ��I:����ѹ4����#��F��>IEND�B`�PK�X�E0Й�root.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1289939440(BasicNewsRecipe):
    __author__ = 'FunThomas'
    title = u'Root.cz'
    description = u'Zprávičky a články z Root.cz'
    publisher = u'Internet Info, s.r.o'
    oldest_article = 2  # max stari clanku ve dnech
    max_articles_per_feed = 50  # max pocet clanku na feed

    feeds = [
        (u'Články', u'http://www.root.cz/rss/clanky/'),
        (u'Zprávičky', u'http://www.root.cz/rss/zpravicky/')
    ]

    publication_type = u'magazine'
    language = u'cs'
    no_stylesheets = True
    remove_javascript = True
    cover_url = u'http://i.iinfo.cz/urs/logo-root-bila-oranzova-cerna-111089527143118.gif'

    remove_attributes = ['width', 'height', 'href']  # ,'href'
    keep_only_tags = [
        dict(name='h1'),
        dict(name='a', attrs={'class': 'author'}),
        dict(name='p', attrs={'class': 'intro'}),
        dict(name='div', attrs={'class': 'urs'})
    ]

    preprocess_regexps = [
        (re.compile(u'<p class="perex[^"]*">[^<]*<img[^>]*>',
                    re.DOTALL), lambda match: '<p class="intro">'),
        (re.compile(u'<h3><a name="tucnak">Tričko tučňák.*</body>',
                    re.DOTALL), lambda match: '<!--deleted-->')
    ]

    extra_css = '''
                h1 {font-size:130%; font-weight:bold}
                h3 {font-size:111%; font-weight:bold}
              '''
PK�XEE��rosbalt.png�PNG


IHDR  szz�`IDATx^��}�VՕ����{���o�2�Z��-*M��4��N:3��f�D���Ԥ��t2�iS_��h�u%���4AM��1�6�m���BT��˽�s��{�&'7\���d�u�s~{�-��f�_�7g�п8���P(\A��B�8�
QbѢL	IB"�-5a�ɚI�Q�u����
ph���xӛ�?�o;���v�+=˯���ĭ�ڇQSS#Y�D1�fL�ҵ9��0�Hf\FPS*���$�:|�V$��;,ܰ�oþ����U[�7��#�.��i_�B#B�
f�:�Ѐ�^%�E;�|%����ְ�ͅ�mn Y�H�3�A�^L6P����']�o�k[zy�9����	��kUˆ#��8��BD�˘�c�F���.�ӓ4�1�>�d1D#*F&�E�Q�h�]|��{gJ��D!�``�x�L��|���8���D�PU�e�G��ɩ$��Z"eA��E��ˆT�&�s�)�#����Ye�1G)0M���Ƕ3:2
�@���0qM� �ॢ��4�H>L�)��&���c�`��M(It������)����V�Ql]��7���G�e,����hgPH
X�u1A�d�
L&pё�R�8�A�(���(�#i�!BԌZ����N�g��#�r�.�'���,�唚	�	8���7���b��.k��¤M���X�|��K:�Σ��g��	��A�7v�㙽���(��#�m�����0H)�B���)�RhG4C��p��F�C���/w1z���!I'S��k@*M�,�(DI����6���#ax��@Dh�^�v{y��]��s�	r"(���y��7pYH.
R�I�)&4T�d��Zx��`�n����ac0�S8���*�Q�Y�e�����-�'�H�&)M)iQ�U���Iz��������_�Z���<5E�.�c�
�g�QΥY!e?Iens4��
)�~��{�`�}�]||�P�g��6]�����lH9�nY`��Y�0���������W���s��\a��;�m���a�:\���t�m��F&��4뉆��EO�i�s?�x[�vѣ��g�.y�"���ۺ{�ەw������͋�'1~��(Ʀ��_��s;8q���}���5����؍��dWܹ�>������~�V�`�-x���_����W���Ml�����v���?d;^�n�?b���.��Sw��W��C����=���c�m��>�����G;���??��[�2����M�f��Awccc�$5�	~��v���e|d	�v��
�p����2:9J2a���Q}��_:� ��8��}L�u+`��T��d7�>���Q|�3�\ػ�Q?��N^��pNs6��'��n��B��Hj�fn�qN.�A�%o��7���XԵ�n����!��ѐ&�au� -���P%��@�_�̐n�4�a�~&�Sv�]�~����D/H��s V71��^�U%��{�B!� ��I�OWx���	��Q��ͬ��2.�����솠��:��!T	p��0�49!H�x��a���
|��Ռ�R�IN��к��e@���ed�pZ/��W�wk֮�h8L6E�Q
�Mߙ
��Б�
jd��x�������215NUFD��H_g���ܽ��~��xm�N��IV_��Q��Eq΁Ό��g6
���ϬCcK�$���@`q繠0xc�\p��\zي:\�p�v�� 3��h�=�� �p�@a+;/�0�3
���������ҳ�`�mKYyՅ��B��ŃL�9s�[T�2�t��W�4�����P������"�gC:B7�.�ۘ�k��iP0�A��5�LeAܨ������t~��P���X@@f�R��ӊ-p0�w�Zƫ)���&8Q0�%���*�����N害
�����/���S�槰A��|P���Y�1�9�'F�`I��F�8N!3EF)�(5s����}���O���9���cE?��ɭ1�9�ǘߜ��� "~	�м�}?<�8��֟�p�IܐIIEND�B`�PK�X<<CH�	�	rosbalt.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Rosbalt(BasicNewsRecipe):
    title = '\u0420\u043E\u0441\u0431\u0430\u043B\u0442'
    __author__ = 'bugmen00t'
    description = '\u0424\u0435\u0434\u0435\u0440\u0430\u043B\u044C\u043D\u043E\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E-\u0430\u043D\u0430\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E. \u041A\u0440\u0443\u0433\u043B\u043E\u0441\u0443\u0442\u043E\u0447\u043D\u043E \u0441\u043B\u0435\u0434\u0438\u043C \u0437\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u044F\u043C\u0438 \u0432 \u0441\u0442\u0440\u0430\u043D\u0435 \u0438 \u043C\u0438\u0440\u0435, \u043F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C \u0441\u0430\u043C\u044B\u0435 \u0441\u0432\u0435\u0436\u0438\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438, \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0432\u0435\u0434\u0443\u0449\u0438\u0445 \u044D\u043A\u0441\u043F\u0435\u0440\u0442\u043E\u0432, \u0430\u043D\u0430\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0441\u0442\u0430\u0442\u044C\u0438, \u0438\u043D\u0442\u0435\u0440\u0432\u044C\u044E \u0441 \u0432\u0435\u0434\u0443\u0449\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043B\u044F\u043C\u0438 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u043E\u0433\u043E \u0431\u0438\u0437\u043D\u0435\u0441\u0430 \u0438 \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0438.'  # noqa
    publisher = '\u0410\u041E \u00AB\u0420\u0421-\u0411\u0430\u043B\u0442\u00BB'
    category = 'newspaper'
    cover_url = u'https://i.ytimg.com/vi/eeMqJGbjuY0/maxresdefault.jpg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 100

    remove_tags_before = dict(name='div', attrs={'class': 'main-content'})

    remove_tags_after = dict(name='div', attrs={'class': 'newstext'})

    remove_tags = [
        dict(name='nav'),
        dict(name='aside'),
        dict(name='div', attrs={'class': 'news-left'}),
        dict(name='div', attrs={'class': 'rkngov'}),
        dict(name='div', attrs={'class': 'eye'})
    ]

    feeds = [(
        '\u0420\u043E\u0441\u0431\u0430\u043B\u0442', 'https://www.rosbalt.ru/feed/'
    )]
PK�X
��a!!roskildelokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X.-�
77roskildelokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Roskilde Avis
'''


class RoskildeLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Roskilde Avis'
    description = 'Lokale og regionale nyheder, sport og kultur fra Roskilde og omegn på roskilde.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Roskilde Avis', 'http://roskilde.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Roskilde Avis', 'http://roskilde.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Roskilde Avis', 'http://roskilde.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Roskilde Avis', 'http://roskilde.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Roskilde Avis', 'http://roskilde.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Roskilde Avis', 'http://roskilde.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X\?~���rt.png�PNG


IHDR  ��	pHYs��~��IDATH��?kA���ۻK<����-LT�IP�
$��J�"
~Q��Oboka�� H"���$
W�����������b���
B~��̻�>��v���<Y�i�1�d�&S��Eaր����d�EA*�ɠ�RA�Υ5!@��)��Xvϰ���D:�!ko��&���d+�!�#�xR+ʧ�'�7������~���F�UC�b@$��RY�k�����^T�+��sy��p�0X9�k�o�Ϊ�9�Ҝ�U���� ,"C>�:�T}�+%�j	�3<���7FP��W�̽ᣮ�"r�����
��34R�>��x;�` 5����JMЌ�j�I�zCQGE�A�D
ZA�ېF�(�0�J�l.�v�����Uh��L?�N �B A�ƩR)3[0X�|���~��~��a�>��_(K����Wg+�ݞ�������9z����}�K��u�U������8�%�.P�f��\��(�����Ƥ�
Jआ{"jP�`����*P���o����䶬C-�I�35Xf��)ȁ@7<�7Q>k�?�ZE0 �vi�������L?*ZE�)����D'i.u 0
w���#D���k��ݖN�n���_"y�h	�R/���9i�6=�:���$-�Z&�IEND�B`�PK�X�L*	rt.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class RtRecipe(BasicNewsRecipe):
    title          = 'RT на русском'
    __author__ = 'Vuizur'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = False
    language = 'ru'

    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(name='a', attrs={'class':'tags-trends__link'})
    remove_tags = [
        dict(name='div', attrs={'class':'error-on-page'}),
        dict(name='div', attrs={'class':'short-url'}),
        dict(name='div', attrs={'class':'follows-channel'}),
        dict(name='a', attrs={'class':'tags-trends__link'})
    ]

    feeds          = [
        ('RT на русском', 'https://russian.rt.com/rss'),
    ]
PK�Xp��rte.png�PNG


IHDR�a�IDATx���DCa���H��$
%Y���	PPB-	"&��PE!dH�>���>����_�g��-�A��ማ�� ǜp�9Ufء�n�`�I^أ�)��1�u���o�Dߦ�L+�
�t���W6Y坹��s�N�&-��|SI�<�E�~���F��L_�+�E�Ez��E��^�4�����"?�F�'����IEND�B`�PK�Xu����
rte.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class RTE(BasicNewsRecipe):
    title = u'RTE News'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = u'Robin Phillips'
    language = 'en_IE'
    auto_cleanup = True
    auto_cleanup_keep = '//figure[@class="photography gal642 single"]'

    remove_tags = [dict(attrs={'class': [
                        'topAd', 'botad', 'previousNextItem', 'headline', 'footerLinks', 'footernav']})]

    feeds = [
    (u'News', u'http://www.rte.ie/rss/news.xml'),
    (u'Sport', u'http://www.rte.ie/rss/sport.xml'),
    (u'Soccer', u'http://www.rte.ie/rss/soccer.xml'),
    (u'GAA', u'http://www.rte.ie/rss/gaa.xml'),
    (u'Rugby', u'http://www.rte.ie/rss/rugby.xml'),
    (u'Racing', u'http://www.rte.ie/rss/racing.xml'),
    (u'Business', u'http://www.rte.ie/rss/business.xml'),
    (u'Entertainment', u'http://www.rte.ie/rss/entertainment.xml')]

    # def print_version(self, url):
    # return url.replace('http://www', 'http://m')
PK�X��›
rtnews.png�PNG


IHDR  ���IDATx�c�Oc0d-�`Ԃ���G�D='bH���w�Ag0r���	�l<�C�@w!������1����b�-8P}ȹ���DGa�A�,P1����?�
D5��k�8C؍��j��l
��m9F���
F�
Ƃ��N���@�U��c����������P��\e#�H�@HH�Rf[��t��pm�T��f-�fae�������#�&f��&����B��n`�^�%���\�l@F���V��ɵ���<HQT��X���s�G]���-H�m�~�\�6�%�22�\.���֍g܀p�-eL����H����c�d�\j�z��>Q�e�fQ2&���B2\@.>��yV�I��z�w�;�K+��%m��䯷���_�[�!"@.9���D0����j9��ƵG`�Cd��laDfa,��W\�V���Z��%z���IEND�B`�PK�X����
�

rtnews.recipe'''
rt.com
'''

from calibre.web.feeds.news import BasicNewsRecipe, classes

class RT_eng(BasicNewsRecipe):
    title = 'Russia Today'
    __author__ = 'unkn0wn'
    description = '''
        RT creates news with an edge for viewers who want to Question More. RT covers stories overlooked by the mainstream
        media, provides alternative perspectives on current affairs, and acquaints international audiences with a Russian
        viewpoint on major global events.
    '''
    publisher = 'Autonomous Nonprofit Organization "TV-Novosti"'
    category = 'news, politics, economy, finances, Russia, world'
    oldest_article = 1.2
    no_stylesheets = True
    encoding = 'utf-8'
    ignore_duplicate_articles = {'url', 'title'}
    use_embedded_content = False
    remove_empty_feeds = True
    remove_javascript = True
    language = 'en'
    remove_attributes = ['height', 'width', 'style']
    publication_type = 'newsportal'

    extra_css = '''
        img {display:block; margin:0 auto;}
        em { color:#202020; }
        .date { font-size:small; color:#404040; }
        .article__summary { font-style:italic; color:#202020; }
        .media__footer { font-size:small; text-align:center; }
    '''

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(name='div', attrs={'class':'article'})
    ]

    remove_tags = [
        dict(name=['meta', 'link', 'svg', 'button', 'style', 'iframe', 'noscript']),
        classes(
            'update_date_visible breadcrumbs read-more Read-more-text-only article__share '
            'article__social-wrapper article__share_bottom'
        )
    ]

    feeds = [
        ('Russia', 'https://www.rt.com/rss/russia/'),
        ('India', 'https://www.rt.com/rss/india/'),
        ('Africa', 'https://www.rt.com/rss/africa/'),
        ('World News', 'https://www.rt.com/rss/news/'),
        ('Business', 'https://www.rt.com/rss/business/'),
        ('Opinion', 'https://www.rt.com/rss/op-ed/'),
        ('Culture', 'https://www.rt.com/rss/pop-culture/'),
        ('Others', 'https://www.rt.com/rss/')
    ]

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        return url.split('?')[0]

    def preprocess_html(self, soup):
        for img in soup.findAll('img'):
            srcset = img.find_previous_sibling('source', attrs={'data-srcset':True})
            if srcset:
                for x in srcset['data-srcset'].split(','):
                    if '/l/' in x.split()[0].strip():
                        img['src'] = x.split()[0].strip()
        for src in soup.findAll('source'):
            src.decompose()
        return soup
PK�X����rts.png�PNG


IHDR(-S*PLTE]���������������H��F�|]�������PjtRNS@��fYIDATxڍ΁
� P�fe��nC4��
鼺��X��	���y��P��&��.~���sk�iu���ݏ@��)	G�77�;t�!�IEND�B`�PK�X�> ��	�	
rts.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
www.rts.rs
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class RTS(BasicNewsRecipe):
    title = 'RTS: Vesti'
    __author__ = 'Darko Miletic'
    description = 'News from Serbia'
    publisher = 'RTS'
    category = 'news, politics, Serbia, RTS'
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = True
    language = 'sr'

    lang = 'sr-Latn-RS'
    extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif}'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    feeds = [

    (u'Vesti', u'http://www.rts.rs/page/stories/sr/rss.html'),
    (u'Srbija', u'http://www.rts.rs/page/stories/sr/rss/9/Srbija.html'),
    (u'Region', u'http://www.rts.rs/page/stories/sr/rss/11/Region.html'),
    (u'Svet', u'http://www.rts.rs/page/stories/sr/rss/10/Svet.html'),
    (u'Hronika', u'http://www.rts.rs/page/stories/sr/rss/135/Hronika.html'),
    (u'Drustvo', u'http://www.rts.rs/page/stories/sr/rss/125/Dru%C5%A1tvo.html'),
    (u'Ekonomija', u'http://www.rts.rs/page/stories/sr/rss/13/Ekonomija.html'),
    (u'Nauka', u'http://www.rts.rs/page/stories/sr/rss/14/Nauka.html'),
    (u'Kultura', u'http://www.rts.rs/page/stories/sr/rss/16/Kultura.html'),
    (u'Zanimljivosti', u'http://www.rts.rs/page/stories/sr/rss/15/Zanimljivosti.html'),
    (u'Sport', u'http://www.rts.rs/page/sport/sr/rss.html')
    ]

    def preprocess_html(self, soup):
        soup.html['xml:lang'] = self.lang
        soup.html['lang'] = self.lang
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return self.adeify_images(soup)
PK�Xk255rubikon_de.png�PNG


IHDR  D���BPLTE\����������������aaa���������000III���vvv��៟�


��/q�1q���Ѱ�IDATx^��I� �x`�����Uk�X��*)z�F���>z� �3	����>�b�D�bY��c8�u�7n@$ɵ�A��a���v�X��,�
�"�\���u�^�E�
*��QAa"�!:�QQ�
;��X�9:`�r٥.�P��
��wi���������S��u��IEND�B`�PK�X�/�p��rubikon_de.recipefrom __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1543143461(BasicNewsRecipe):
    title          = 'Rubikon.de'
    description = 'Nachrichten anders/neutral beleuchtet'
    __author__ = 'schuster'
    __license__ = 'GPL v3'
    version = 1
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True
    no_stylesheets = True
    use_embedded_content = False
    language = 'de'
    remove_javascript = True
    timefmt = ' [%d.%m.%Y]'
    masthead_url = 'https://www.rubikon.news/assets/logo-dd0fcd373a0c872bb432f7596d9e700155c5d7fa07ec99a3777d44621e8c61fe.svg'

    remove_tags = [
            dict(id=['download-pdf']),
            dict(id=['read-article']),
            dict(name='div', attrs={
                'id': ['print_options', 'print_head']}),
            dict(name='div', attrs={'class': ['article-meta']}),
            dict(name='div', attrs={'class': ['article-end']}),
            dict(name='span', attrs={'class': ['lens']})]

    feeds          = [
        ('Alle Artikel', 'https://www.rubikon.news/artikel.atom'),
    ]
PK�X
��a!!rudersdallokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�Xy�,3jjrudersdallokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Rudersdal Avis
'''


class RudersdalLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Rudersdal Avis'
    description = 'Lokale, regionale nyheder, sport, kultur fra Rudersdal, Birkerød, Holte, Nærum, Vedbæk, Søllerød på rudersdal.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Rudersdal Avis', 'http://rudersdal.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Rudersdal Avis', 'http://rudersdal.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Rudersdal Avis', 'http://rudersdal.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Rudersdal Avis', 'http://rudersdal.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Rudersdal Avis', 'http://rudersdal.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Rudersdal Avis', 'http://rudersdal.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�XۋVC	rue89.png�PNG


IHDR�aFIDATx�bx�P95�H���϶m۶�s6����l_p����;ֳ��_�d�$���Q��	�"|!���N�f�i���~4]�E�������7�L�}�H��/]�6q"�q�<s&��`���w�<e
����<A��G��ܹ�I��w�`%X|��C���Ǐ���1�����-��n#p��߾�{��i�C�r��8!5����Yf�bz�
��ϙ��H0�n�!*p���á����>�x��K��>c�4��F�
�Q�h�͛3����%K��t�f�8��tI܁��;�jԈQҵ+��Bx�=GYӦN�G�W��+�>(�ً��E��Kȧs�<�*�y?|@ٍpݾ��H܁���&��:u��"IIȫY9�:���|?B�?��.��GEE:�'�V-�4J��Af�*����˖3w�}�읻��;Ƌ�
Ȋ��u���H�?)�F1�ٻE/2O:i4j����n�rL@�v��BWH��$�t� a�r��V!��K���g��+��,P,"$If�5������8q��Nxd���BT!��\�;�țI�IEND�B`�PK�XI�j
9
9
rue89.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2012, Louis Gesbert <meta at antislash dot info>'
'''
Rue89
'''

__author__ = '2010-2012, Louis Gesbert <meta at antislash dot info>'

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Rue89(BasicNewsRecipe):
    title = 'Rue89'
    __author__ = 'Louis Gesbert'
    description = 'Popular free french news website'
    title = u'Rue89'
    language = 'fr'
    oldest_article = 7
    max_articles_per_feed = 50

    use_embedded_content = False

    # From http://www.rue89.com/les-flux-rss-de-rue89
    feeds = [
        (u'La Une',    u'http://www.rue89.com/feed'),
        # Other feeds disabled, 'La Une' seems to include them all
        # (u'Rue69',     u'http://www.rue89.com/rue69/feed'),
        # (u'Eco',       u'http://www.rue89.com/rue89-eco/feed'),
        # (u'Planète',   u'http://www.rue89.com/rue89-planete/feed'),
        # (u'Sport',     u'http://www.rue89.com/rue89-sport/feed'),
        # (u'Culture',   u'http://www.rue89.com/culture/feed'),
        # (u'Hi-tech',   u'http://www.rue89.com/hi-tech/feed'),
        # (u'Media',     u'http://www.rue89.com/medias/feed'),
        # (u'Monde',     u'http://www.rue89.com/monde/feed'),
        # (u'Politique', u'http://www.rue89.com/politique/feed'),
        # (u'Societe',   u'http://www.rue89.com/societe/feed'),
    ]

    # Follow redirection from feedsportal.com
    def get_article_url(self, article):
        return self.browser.open_novisit(article.link).geturl()

    def print_version(self, url):
        return url + '?imprimer=1'

    conversion_options = {'smarten_punctuation': True}

    keep_only_tags = [
        dict(name='div', attrs={'id': 'content'}),
    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': 'plus_loin'}),
        dict(name='div', attrs={'class': 'stats'}),
    ]

    remove_tags = [
        dict(name='div', attrs={'id': 'article_tools'}),
        dict(name='div', attrs={'id': 'plus_loin'}),
        dict(name='div', attrs={'class': 'stats'}),
        dict(name='div', attrs={'class': 'tools'}),
    ]

    extra_css = "#content { padding: 0 0; }"

    # Without this, parsing of video articles returns strange results
    preprocess_regexps = [
        (re.compile(r'<script.*?</script>', re.IGNORECASE | re.DOTALL), ''),
    ]

    def preprocess_html(self, soup):
        # Remove whole article if it's a "zapnet" (video)
        if soup.find('h1', {'class': 'zapnet_title'}):
            return None
        # Reduce h2 titles to h3
        for title in soup.findAll('h2'):
            title.name = 'h3'
        return soup
PK�X����rushisaband.png�PNG


IHDR��h6�IDATx�=��oQ�/��@�/#1U�Җ��EUIWF7�4qo�_Ѕ.Lc�UUڅ;5�F5�4��B(�J�P SP�e`�a
��@:9��s�����R�rB!5�s�q�!a��4~�^H�\�-ͧ�&����J�T1�RM('���Ik�������wwU=�N���weDc�z���(�*_&@�рsh�J�B�����ڤ�:�B��'�P��C(^\:
KH��3�2�y6��]l�S��2��4�'3��|pk���
��$Yy����V��e�}���� �IX�h��R����L�K:JZ@R�~�/��B��h
�����鍻7=��ӱ_���do@����yh4�F!܄�+�¯���h��i�EU��,��"ÎJ�vt�ӯ�Q�t~W/M2+_EAB��Je��C��ãU���@�a�\V���g[����%f��4noV�}\���)�����z� L�S�ը�(D|�z�$KZ�b�	��ޮ��
�8�_D�`�s
�U
��q|�� ��r���ɳ�2���)��K�����+��a�Ws@X;VIų� <�޸��Z�+b8�	,��>|�Й�цSg�+��hOֻ6wNoQ����X��I5^���y>6�>��s�o�iN�@tֿ�1�Ώ9-������IIEND�B`�PK�X0\�Urushisaband.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'MrStefan <mrstefaan@gmail.com>'

'''
www.rushisaband.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class rushisaband(BasicNewsRecipe):
    title = u'Rushisaband'
    __author__ = 'MrStefan <mrstefaan@gmail.com>'
    language = 'en_GB'
    description = u'A blog devoted to the band RUSH and its members, Neil Peart, Geddy Lee and Alex Lifeson'
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True

    keep_only_tags = []
    keep_only_tags.append(dict(name='h4'))
    keep_only_tags.append(dict(name='h5'))
    keep_only_tags.append(dict(name='p'))

    feeds = [(u'Rush is a Band', u'http://feeds2.feedburner.com/rushisaband/blog')]
PK�Xܻ�rusiahoy.png�PNG


IHDR(-S$PLTE���������؇��il�Z^�<A�$�����k�UIDATx��q�����������y���_�:h
H�]�
�-$��}���\-@3�>�[�`-���IVH�������IEND�B`�PK�X�m�rusiahoy.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
rusiahoy.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class RusiaHoy(BasicNewsRecipe):
    title = 'Rusia Hoy'
    __author__ = 'Darko Miletic'
    description = 'Noticias de Russia en castellano'
    publisher = 'rusiahoy.com'
    category = 'news, politics, Russia'
    oldest_article = 7
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'es'
    remove_empty_feeds = True
    extra_css             = """
                                body{font-family: Arial,sans-serif }
                                .article_article_title{font-size: xx-large; font-weight: bold}
                                .article_date{color: black; font-size: small}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['meta', 'link', 'iframe', 'base', 'object', 'embed'])]
    keep_only_tags = [dict(attrs={'class': ['article_rubric_title', 'article_date', 'article_article_title', 'article_article_lead']}), dict(attrs={'class': 'article_article_text'}) ]  # noqa
    remove_attributes = ['align', 'width', 'height']

    feeds = [(u'Articulos', u'http://rusiahoy.com/xml/index.xml')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�XNR��russiafeed.png�PNG


IHDR(-SPLTE��3��33�3�3��3f��3f��t�HIDATxڜ��
�0�1��2q�
��YW	����u�#�	v�0W	DK�y!ȿ�~IJG�U,��Q	�VoB��IEND�B`�PK�X
�russiafeed.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2017, Darko Miletic <darko.miletic at gmail.com>'
'''
russiafeed.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class RussiaFeed(BasicNewsRecipe):
    title                = 'RussiaFeed News'
    __author__           = 'Darko Miletic'
    description          = 'News from Russia'
    publisher            = 'The DRN Media PLC.'
    category             = 'news, politics, Russia, World'
    oldest_article       = 10
    no_stylesheets       = True
    encoding             = 'utf8'
    use_embedded_content = False
    language             = 'en_RU'
    remove_empty_feeds   = True
    publication_type     = 'newsportal'
    auto_cleanup         = True
    ignore_duplicate_articles = {'url'}
    extra_css            = """
        body{font-family: Roboto, Arial, sans-serif}
        img{margin-top:1em; margin-bottom: 1em; display:block}
        entry-title,entry-subtitle{font-family: Rajdhani, Poppins, Roboto, Arial, sans-serif}
    """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [dict(name=['meta', 'link'])]

    feeds = [(u'News', u'http://russiafeed.com/category/news/feed/')]
PK�XL����rynek_infrastruktury.png�PNG


IHDR�a�IDATxڍ�iHTa��yߙ;K�V��"E�m@~j��*$�Z� ��0�oe@AZ���-X�R攩A�J�+�fM�s�{߀� ��|~�8�G��4�� L�P�?.?�/A���q�	�㿁h_B	p
x,J�
G�ҡ�;�i(
���lD���&��@B.g��_����~7'1�Q������m�%�Q,�q����DK�;<�o6�̠�!L�d�t[�:;�;��&<����C�S��۰$$���h�+j��mW���1�[d+�``��H���Z�g�f��⺳1D�j�y�M����]6n��|9�[Y���?!{�cb�eG�\\Ӏ��x=��-)��w?��g�ѵ��5O0���E�*���E��F�cX�"��֦��
X�j�mE�
�;�8w�E�K,�m�.�!4�����?��/m9�c���p��6�
����ӕ�%�oe��b'��ǭŁ�'ý>�6���Z�R���n����FY�3�	��G$p�Q��'��x=��=Ƙ[@X�*���1�h����\J϶�LF�K��Q��huD`�1��L%��W��u�SV�Q�����<1�u�(pO���k�$�s!J���o 9E\�ID:���F���q�Y�H9�
��.XZBC�bIEND�B`�PK�X.ߚB��rynek_infrastruktury.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com>'

'''
http://www.rynekinfrastruktury.pl
'''

from calibre.web.feeds.news import BasicNewsRecipe


class prawica_recipe(BasicNewsRecipe):
    title = u'Rynek Infrastruktury'
    __author__ = 'teepel <teepel44@gmail.com>'
    language = 'pl'
    description = u'Portal "Rynek Infrastruktury" to źródło informacji o kluczowych elementach polskiej gospodarki: drogach, kolei, lotniskach, portach, telekomunikacji, energetyce, prawie i polityce, wzmocnione eksperckimi komentarzami kluczowych analityków.'  # noqa
    remove_empty_feeds = True
    oldest_article = 1
    max_articles_per_feed = 50
    remove_javascript = True
    no_stylesheets = True

    feeds = [
        (u'Drogi', u'http://www.rynekinfrastruktury.pl/rss/drogi.xml'),
        (u'Kolej', u'http://www.rynekinfrastruktury.pl/rss/kolej.xml'),
        (u'Energetyka', u'http://www.rynekinfrastruktury.pl/rss/energetyka.xml')
        # no news in these feeds since 4 years:
        # (u'Porty i lotniska', u'http://www.rynekinfrastruktury.pl/rss/porty-i-lotniska.xml'),
        # (u'Komentarze', u'http://www.rynekinfrastruktury.pl/rss/komentarze-i-felietony.xml'),
    ]

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'wiadTit'}),
        dict(name='div', attrs={'class': ['wiadSzczegol', 'multimediaWiadomosci', 'wiadTresc']})
    ]

    remove_tags = [dict(name='span', attrs={'class': 'kom'})]
PK�XJ`����rynek_zdrowia.png�PNG


IHDR(-SKPLTE���x��ſ��?��o�������???///������oooOOO����O��������ϟ�����rS_�`IDATxڭ�7C1�PJ�����4�5d�9>�\�Z[]��f��Gk�CLDy�PT�w�'�����.7&T~`C2�!���U�,�Dzv��*#?����FKHrUIEND�B`�PK�X�	�z��rynek_zdrowia.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class rynekzdrowia(BasicNewsRecipe):
    title = u'Rynek Zdrowia'
    __author__ = u'spi630'
    language = 'pl'
    masthead_url = 'http://k.rynekzdrowia.pl/images/headerLogo.png'
    cover_url = 'http://k.rynekzdrowia.pl/images/headerLogo.png'
    oldest_article = 3
    max_articles_per_feed = 25
    no_stylesheets = True
    auto_cleanup = True
    remove_empty_feeds = True

    remove_tags_before = dict(name='h3')

    feeds = [
    (u'Finanse i Zarz\u0105dzanie', u'http://www.rynekzdrowia.pl/Kanal/finanse.html'),
    (u'Inwestycje', u'http://www.rynekzdrowia.pl/Kanal/inwestycje.html'),
    (u'Aparatura i wyposa\u017cenie', u'http://www.rynekzdrowia.pl/Kanal/aparatura.html'),
    (u'Informatyka', u'http://www.rynekzdrowia.pl/Kanal/informatyka.html'),
    (u'Prawo', u'http://www.rynekzdrowia.pl/Kanal/prawo.html'),
    (u'Polityka zdrowotna', u'http://www.rynekzdrowia.pl/Kanal/polityka_zdrowotna.html'),

    (u'Ubezpieczenia Zdrowotne', u'http://www.rynekzdrowia.pl/Kanal/ubezpieczenia.html'),
    (u'Farmacja', u'http://www.rynekzdrowia.pl/Kanal/farmacja.html'),
    (u'Badania i rozw\xf3j', u'http://www.rynekzdrowia.pl/Kanal/badania.html'),
    (u'Nauka', u'http://www.rynekzdrowia.pl/Kanal/nauka.html'),
    (u'Po godzinach', u'http://www.rynekzdrowia.pl/Kanal/godziny.html'),
    (u'Us\u0142ugi medyczne', u'http://www.rynekzdrowia.pl/Kanal/uslugi.html')]

    def print_version(self, url):
        url = url.replace('.html', ',drukuj.html')
        return url
PK�X8��5iirzeczpospolita.png�PNG


IHDR��h60IDATxڅNHa}w�+E)�J
���Y��H
   �
L�0����K"`D� Y�6i��O"� 2Q��b��;kι6v�nJ]߹�&�����!18�ZE�{M�ڒ�C��z�#ݏ��e:�E
��7��gt<S�Bժ�ď��B��C0�
S(����RE�
���%<���X�
���ec�\-��S(T:j��4��*�D>��l���� Pv&t�,ˉ����kȻ>��5>���d��1�s5ihX4wŚ�/�9��!����v�=��e�>�4�'�y��X]�kw<�X�Yy��'n@���jlY��I3����Lv��
���Lf�P�S��/"�).�g4ކMF�g}��M3Ё�V�>6�s9q!أ=jEj�ŦL���ud���|3�Ͷ�K�N&������A'��z��[u�í���ہ�MC�<�g`�`�t~�E�Am�8��������ݚC]�ZWk��V��A�;i�E�m����),�cW�;�=N%��;Qq0��d���y�!�.0nl��l��>O����cQd�W�ævA5�IEND�B`�PK�X��S��rzeczpospolita.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class RzeczpospolitaRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = u'kwetal, Tomasz Dlugosz, adrianf0'
    language = 'pl'

    title = u'Rzeczpospolita OnLine'
    publisher = u'Presspublica Sp.'
    category = u'News'
    description = u'Newspaper'
    oldest_article = 1
    max_articles_per_feed = 100

    no_stylesheets = True
    remove_javascript = True
    # Seems to work best, but YMMV
    simultaneous_downloads = 5

    feeds = []
    feeds.append((u"Wiadomości", u'http://www.rp.pl/rss/1056'))  # Wydarzenia
    feeds.append((u"Ekonomia", u'http://www.rp.pl/rss/1004'))  # Ekonomia
    feeds.append((u"Prawo", u'http://www.rp.pl/rss/1037'))  # Prawo

    keep_only_tags = []
    keep_only_tags.append(dict(name='h1', attrs={'id': 'article-title'}))
    keep_only_tags.append(dict(name='img', attrs={'class': 'img-responsive article__image'}))
    keep_only_tags.append(dict(name='div', attrs={'class': ['article-content', 'article__lead js-voice-read',
        'article__content js-voice-read','article__image-desc','article__image-author']}))

    remove_tags = []
    remove_tags.append(dict(name='div', attrs={'class': 'related-articles__wrapper'}))
    remove_tags.append(dict(name='span', attrs={'class': ['article__premium-player','ad-label']}))

    extra_css = '''
            div.article__image-desc {font-style:italic; font-size:70%;text-align:right}
            div.article__image-author {font-size:60%;text-align:right}
    '''
PK�XA^����sa_gazeta.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1501589847(AutomaticNewsRecipe):
    title = 'Sa gazeta'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup = True
    language = 'sc'
    __author__ = 'tzium'

    feeds = [
        ('Sa gazeta', 'http://www.sagazeta.info/feeds/posts/default'),
    ]
PK�X,ѱ�??	sabah.png�PNG


IHDR�aIDAT��o�E���;3�;�_��A�rK[Ĥ"bu�`��hؘ���7Xd���4��$��PL\�D�Z1TKC/6��rn�|3�<���6��H�2��aXC.Z�64��M
�-Ĵ}��M�D�
�."��)B�o��Q��o�gb���<��(D>cf01��(�����y
��YwFR���cg�1�cAT��X�r����1p�E[:ׁΖ���Q�!Ρ�""�!&4�9�sH(fI���p��7��yu���~��Q�
��2��ˆo�woK`
�;x
�ڱ%�B>ubo��WN1���w��3�Z�"���?�N��ϱ�l.��IT����f�\�e#��0y�"�_~e���^�f�y*����l���1�[4OǦ����nՆ�����.�Axu���n����6ޕ����=^A^<M'���7.��X�{v���/.Q߮��x�ձ�tx�����]O�i;9ɽ{���!�o�M�Ry�]^����?�Qf��m�GF9���ag��!�r���8�Q)\B�dA�/}��})����Չ�MJ*92�(\��
�zm6Q��E�F�e[>zv�PT4ė$)RD(""	��BZ9�I醤��-?75o.�o�<� D

��{��I�G�)}K�k�ݱ�����L�4o�L�̴�K>o�"�E@}A�=�h�U��@���=�!�?���?����O�~7F����,S����!��$���:1V�__��>�&1$�IEND�B`�PK�X	���sabah.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1253477125(BasicNewsRecipe):
    title = u'Sabah'
    __author__ = u'Deniz O\u011fuz'
    language = 'tr'
    oldest_article = 1
    max_articles_per_feed = 20
    cover_url = 'http://www.sabah.com.tr/c/sb/i/sabah_logo.gif'
    no_stylesheets = True
    remove_tags = [dict(name='div', attrs={'style': [
                        'width: 200px', 'border-top: #d8d8d8 1px dotted', 'width: 200px; margin-right: 5px', 'padding-top: 1px']})]
    keep_only_tags = [dict(name='div', attrs={
                           'class': ['haber line_height_def', 'haber haber_renk line_height_def']})]
    extra_css      = '''
                        body{font-family:Arial,Helvetica,sans-serif; font-size:small; align:left}
                        h1{font-size:large;}
                        .sh{font-size:large; font-weight:bold}
                        .cap{font-size:xx-small; }
                        .lu{font-size:xx-small; }
                        .ds{font-size:xx-small; }
                        .mvb{font-size:xx-small;}
                        .by1{font-size:x-small;  color:#666666}
                        .byd{font-size:x-small;}
                     '''
    feeds = [(u'Son 24 Saat', u'http://www.sabah.com.tr/rss/Son24Saat.xml'),
             (u'Ekonomi', u'http://www.sabah.com.tr/rss/Ekonomi.xml'),
             (u'G\xfcndem', u'http://www.sabah.com.tr/rss/Gundem.xml'),
             (u'Siyaset', u'http://www.sabah.com.tr/rss/Siyaset.xml'),
             (u'Yazarlar', u'http://www.sabah.com.tr/rss/Yazarlar.xml'),
             (u'D\xfcnya', u'http://www.sabah.com.tr/rss/Dunya.xml'),
             (u'Teknoloji', u'http://www.sabah.com.tr/rss/Teknoloji.xml'),
             (u'Spor', u'http://www.sabah.com.tr/rss/Spor.xml'),
             (u'G\xfcn\xfcn \u0130\xe7inden',
              u'http://www.sabah.com.tr/rss/gununicinden.xml'),
             (u'Emlak', u'http://www.sabah.com.tr/rss/Emlak.xml'), ]
PK�X
1'�))sabit_fikir.png�PNG


IHDR  ���IDATxڴ�tcKǷ'���J�>۶m۶m۸q��m���4U^O���7o���M�F�߇A�h��L^�DT<QqX%�����z�z�,|��$OC�� ��~���@)f/����1D/�xh�L �N:�

���4�\D�z��}�������W~�ǟ�(�5�.zs�]��%Nk����͝S�|©���XGcJ2�;!㯻�%H#�:%
i�]�0y�uv�8���1"�	���xw(���][ˮhCc4P���!D:/�L�Q�_Š���H{["��+��k��s����)�U��Q��^.*��IK�$�:)$��l?�D_��wq�Go����ܻ��Oa��Z���W�
@]]ޓ�vj8g��h����a)���K�
��z��4��6�k�UG�e.rIF��s	FYg�K�_t��=�W��)�y�$-��˨ߟ�ok�7W,�57��1$�T*�����"Ǐ8��H��h��P�F��s����~���ނ�X�0&좄D3EBصS�}�u>^vѥ�C��=��O��\�ià!
�)
)�1 3�쬾0���ܼ8��Kol��9D��X����( �T�I��c�@y�&�4z�#����~���0)�P&��ճ(@	���eCϻ����IA���c�� �Xe`�! �H/�W�SR��r^AtW�8v�B2���z*�C��V���us:�NtZ��3g�lΧ��%H�0x��\�G͍��F�u��QL�E �Ƨ3e�s/:R�j�ս;�ʼn#@	��f߀6]��~����$���[�r��!��&V-��#���kV8�Bk�0���)@V���|`��Tzo�W2�z�S���6
�o呡��a7��ˮqj���_H�>e�p�ɽ�U>��g(�X{{܄g_�m�@w_h�z�eW�Q��z����ͧT4j��iÎR��6�3#�P�ݠ���i�tJ�_�7��
΢�1��IEND�B`�PK�X��^6__sabit_fikir.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1325259641(BasicNewsRecipe):
    language = 'tr'
    __author__ = 'asalet_r'
    title = u'Sabit Fikir'
    oldest_article = 7
    max_articles_per_feed = 20
    auto_cleanup = True

    feeds = [(u'Sabit Fikir', u'http://www.sabitfikir.com/rss.xml')]
PK�Xb�
��saechsische.png�PNG


IHDR  D���9PLTELiqw�#w�#w�#w�#w�#w�#w�#��ێ�K��2w�"��ې��~��`�������tRNS!8l����2饟IDATx�t�� !�x���؂Qw{ݍlI�=�.�+��w�lG����;�����o�~qn/׃� l�)��8W�C�r��ȗ��8QO�%�����*�֒�HfN�v��V�0�����:ٝU��HYs�:��*�-���S�ଃ9������p������)(}&�
X$�E�!K�$
f�U�k+(&�Us�����q,�)�VM��[ͳ��2*�Kr�Ad�A�7�[��mx�$G(�L��3�G8��E#�:�k�IEND�B`�PK�X�csǓ�saechsische.recipe#!/usr/bin/env python
##
## Written:      March 2020
## Version:      1.1
## Last update:  2023-03-31
##
from __future__ import unicode_literals, division, absolute_import, print_function

'''
Fetch RSS-Feeds from saechsische.de
'''

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 Saechsische(BasicNewsRecipe):
    title = 'Saechsische Zeitung'
    __author__ = 'epubli'
    description = 'RSS-Feeds von saechsische.de'
    publisher = 'SZ'
    publication_type = 'newspaper'
    language = 'de'
    encoding = 'UTF-8'
    oldest_article = 1
    max_articles_per_feed = 40
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    compress_news_images = True
    compress_news_images_auto_size = 8
    scale_news_images_to_device = True
    delay = 1
    ignore_duplicate_articles = {'title', 'url'}

    cover_url             = 'https://www.saechsische.de/img/logo.svg'

    feeds = [
        ('Dresden', 'feed://www.saechsische.de/rss/dresden'),
        ('Sachsen', 'feed://saechsische.de/rss/sachsen'),
        ('Deutschland und Welt', 'feed://www.saechsische.de/rss/deutschland-welt'),
        ('Politik', 'feed://www.saechsische.de/rss/politik'),
        ('Wirtschaft', 'feed://www.saechsische.de/rss/wirtschaft'),
        ('Feuilleton', 'feed://www.saechsische.de/rss/feuilleton'),
        ('Sport', 'feed://www.saechsische.de/rss/sport'),
        #('Dynamo', 'feed://www.saechsische.de/rss/dynamo'),
        #('Bautzen', 'feed://www.saechsische.de/rss/bautzen'),
        #('Bischofswerda', 'feed://www.saechsische.de/rss/bischofswerda'),
        #('Dippoldiswalde', 'feed://www.saechsische.de/rss/dippoldiswalde'),
        #('Döbeln', 'feed://www.saechsische.de/rss/doebeln'),
        #('Freital', 'feed://www.saechsische.de/rss/freital'),
        #('Großenhain', 'feed://www.saechsische.de/rss/grossenhain'),
        #('Görlitz', 'feed://www.saechsische.de/rss/goerlitz'),
        #('Kamenz', 'feed://www.saechsische.de/rss/kamenz'),
        #('Löbau', 'feed://www.saechsische.de/rss/loebau'),
        #('Meißen', 'feed://www.saechsische.de/rss/meissen'),
        #('Niesky', 'feed://www.saechsische.de/rss/niesky'),
        #('Pirna', 'feed://www.saechsische.de/rss/pirna'),
        #('Radeberg', 'feed://www.saechsische.de/rss/radeberg'),
        #('Radebeul', 'feed://www.saechsische.de/rss/radebeul'),
        #('Riesa', 'feed://www.saechsische.de/rss/riesa'),
        #('Sebnitz', 'feed://www.saechsische.de/rss/sebnitz'),
        #('Zittau', 'feed://www.saechsische.de/rss/zittau'),
    ]

    template_css = '''
.article_date { color: gray; font-family: monospace;}
.article_description { text-indent: 0pt; }
a.article { font-weight: bold; text-align:left; }
a.feed { font-weight: bold; }
.calibre_navbar { font-size: 200% !important; }
'''

    extra_css = '''
        h2 {margin-top: 0em;}
    '''
    keep_only_tags = [
                        dict(name='article', attrs={'class':'article-detail'}),
                      ]

    remove_tags = [ classes('article-fill'),
                    dict(name='div', attrs={'class':'related-articles'}),
                    dict(name='a', attrs={'class':'article-remember-link'}),
                    dict(name='a', attrs={'href':'https://www.saechsische.de/dresden'}),
                    dict(name='a', attrs={'href':'https://www.saechsische.de/content/newsletter-lp?utm_content=dresden_kompakt'}),
                    dict(name='div', attrs={'class':'article-detail-socials'}),
                    dict(name='div', attrs={'class':'d-desktop-none'}),
                    dict(name='div', attrs={'class':'floating-share-icon'}),
                      ]

    def parse_feeds(self):
        # Call parent's method.
        feeds = BasicNewsRecipe.parse_feeds(self)
        # Loop through all feeds.
        for feed in feeds:
            # Loop through all articles in feed.
            for article in feed.articles[:]:
                # Remove articles with '...' in the url.
                if '/anzeige/' in article.url:
                    print('Removing:',article.title)
                    feed.articles.remove(article)
                elif 'newsletter-dresden' in article.url:
                    print('Removing:',article.title)
                    feed.articles.remove(article)
                # Remove articles with '...' in the title.
                elif 'Newsblog' in article.title:
                    print('Removing:',article.title)
                    feed.articles.remove(article)
                elif 'Podcast' in article.title:
                    print('Removing:',article.title)
                    feed.articles.remove(article)
        return feeds

    def preprocess_raw_html(self, raw, url):
        # remove Newsblogs, articles requiring login and advertisements
        unwanted_article_keywords = ['unser Newsblog', 'Zum Login', '00:00 Uhr',]
        for keyword in unwanted_article_keywords:
            if keyword in raw:
                print('Skipping unwanted article with keyword(s):',keyword)
                self.abort_article('Skipping unwanted article')
        return raw
PK�X'���
sage_news.png�PNG


IHDR�axIDATx�bصcg�1@��+W��-cam۶m϶�Fm۶۠ڻ϶m�n���3�u��r�o�@o���(��F��ص��atZZ�wBB��D��M�]ٚ�yy��7z���#;I��=0~�Xlټ�ptp‚��1��0�ٝ�̛�њ-��`�� /��~=|�m�V(��y԰�82�������AFF�]����,DFF����G��1`��8y�4�\�Rk��;���������´�S���r������ط��B����Ѐ={����8t�0/�'��5k��"���u:v&�F#�����s�F�
���:�z��W�_���?���FHe�OɤRp;J�㇏����������_FEE%��]?4j
�.J�/Y��o��L&��B������� �����Ò��$���SΙ1����}($��HOOm2W�93gaϮ]	�y�)&��
֪
8x���՝�×���7wL?�������#���Sx'�����B��2�L��+-5m�G#���@�_@Iq1WdD;�nпe��Ħ���$�W�{�gO��uvp�9c��&�����'Oֱ5����/�7IEND�B`�PK�XB@??sage_news.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1292550626(BasicNewsRecipe):
    title = 'The Sage News - Satire'
    __author__ = 'Brian Hahn'
    description = 'News without boundaries, Satire'
    oldest_article = 200
    max_articles_per_feed = 150
    no_stylesheets = True
    use_embedded_content = False
    publisher = 'The Sage News Network'
    category = 'News, Alberta, Canada'
    language = 'en_CA'
    encoding = 'iso-8859-1'
    cover_url = 'http://www.sagenews.ca/images/satire-cover.jpg'
    remove_tags_before = dict(id='ContentPanel')
    remove_tags_after = dict(id='ContentPanel')
    remove_tags = [dict(name='div', attrs={'id': 'BottomAds'}), dict(name='div', attrs={
        'id': 'moreStories'}), dict(name='div', attrs={'id': 'StoryNavigation'})]
    extra_css = 'img { margin:5px }'
    feeds = [
        ('Satire World', 'http://www.sagenews.ca/Satire-World.rss'),
        ('Satire Politics', 'http://www.sagenews.ca/Satire-Politics.rss'),
        ('Satire Justice', 'http://www.sagenews.ca/Satire-Justice.rss'),
        ('Satire Health', 'http://www.sagenews.ca/Satire-Health.rss'),
        ('Satire Environment', 'http://www.sagenews.ca/Satire-Environment.rss'),
        ('Satire Living', 'http://www.sagenews.ca/Satire-Living.rss'),
        ('Satire Sports', 'http://www.sagenews.ca/Satire-Sports.rss'),
        ('Satire Business', 'http://www.sagenews.ca/Satire-Business.rss'),
        ('Satire Agriculture', 'http://www.sagenews.ca/Satire-Agriculture.rss'),
        ('Satire Humour', 'http://www.sagenews.ca/Satire-Humour.rss'),
    ]
PK�X3Hrl9
9
sage_news_opinion.png�PNG


IHDR  szz�	pHYs��~�	�IDATX�mWio���.�K<D�I݇����k�	`�.�"���[�F[���/4
�_��Ֆ�ć,ɱ*ŒEK�ě�{�}fH*�х��]��3��<3�|���'�E����7�n���y�v;���m�E9 �
N���n��j��F�7É{���bi��Z��l��}���u&N�i���F�^��(�JWʥR�Q���
c[����E��&g��I��w��q��V뱢��j
�K�r�P($j�Z�팊�V`��p8�~�����v]�4�6=�fs�\.O
�d.�(
F�Z��r���K�w9�n_ �
�`��Mt��Z���^�)��iٳ3{.�w6u;8���M�Hi�hT��p=��n7�)Z�Ѱ�Jew6������iT*z몊��2�������r�H�Zes��\&C���B� {M�n�_[�d�۰~���y<R5�Z�&Ut��9��y*�
�h��#f7���(_�;1���M�:ձ�R�4;�q����v9�V�Oֳ#�VK��k��N���n�z'�&��݅fې�P��V��b�l�O�*�T�U>M�-:��J��G��˛j@��'��p<���&gW�ݢ<�zr!��hT�ń^��8����;J�Rf�VP�E!UH��
�<SL�O%�51L�w�+��t1�e���D(�I��y�>RU�Ґ�px��,��+��W+y:���gW�{  �lr�p:��SSt��iii��0��wґX��'�>���lxgg��?A;�_���11#�f�i;��96�1g�|^�c���$�:,��cÝD��d3Mqg����ONR�m�Z`�����)Ճ���D
w{U�9���7hzvIئ��)e�A�X$Դ��,���	��v�J��rJƗJ%j&��+\�R=X�c���i�(w:ixx�&`8>C*�9ʜ���N�iɁ������`8$`�;�f�K�h�!��I1[��+��o~��Ro�J��	vV�QϨ��������x����cddD�5��a��z���4>>Ns�3R��f�w4M%�9L�oO&(�PWBA�nk(W�	o��@�G2;}�&��` @�hD�ƴkVMJ����aI>^��^l�=D�@��E��2E���jV�ë5�
A.��V�1i4��3��	�L�u��t��O0
�� �]�#�|��H<.,p��<k�b��� ��9����
��!���C���y/�s�$�r�>��2��S�0�P^�"���h�45=-��x�!�Q�a�q'h�k?�l��{ �Б#\PŮ���z=��\�#�tc���2˱�K�����b�������"����K����Uƚ`��g�E-T�Ai�+�P4jA�)�
Ǟ)�~�{a��PdC����j�,T�O��q�w�t�&*�!<��Ѷ5~��h-���<ڝ��D����{b��s���#6�]f������ǖi�ٚH~C��…�!���`�::������拍
e}�!@��ֳ]�ϛ����
�'k"�
�jV3���K�b]/�
����|�C<�j��
������{���`LA�3�����+�}�{��	�E%���j�fV+��>>�x���ʎ1y�����kP8���aӐ�ҕ������&(�1�^p
�r��)�o�j?�W����"�`Ol*[����J����;���G7�A�x�1�9=������b]�c��y��k�ZC�)3`�\E�WC����x�g�����k�>\\\W��嗩R����ظ����w3�\
�*,e�Lg�{o�W�;�_*4����:�ot���o<Z_��%��׷u�受�����٭��~��,���(s��S��h/�U�꽽7b٬p�HK�d�
���arX����O?VW��s��D�W�=���޴Ymy��ݻ����1���#F	L4�P�^l�;��𸅜`}�b`���T.^�H����	,���������_k�6m��Z����|�ٟ��+�W��R�/]z��pB��~�����G�Z��_������%��|�6���H'j��?�\]���9�իW�G���7��+W��r��_/]���ζ�N�V5x�r����ں����_���~~�JM��4cc*ǚ'�QH��‚�B5$�f�D�?��ˍ���gO���m��)*�L��X������_��a+�:�*rH�IX�x=����F�������G��l� >'��q�6V�TT=�F�|�7�&fE���9�������t^����S`q}ee�oc㛜���&R��
��,��6jE�E�����@��n�X(��q9�\񡻹�=�r$�	ס�Exw�9�������ۉDrCn��|ߖ�/㌬;�6��)t�L<��oonV��?�vww�_�$�<9>6u(���b�@��C�3�Db����ӹ������֩
ļ#Tf�f��}�Щ
l�IEND�B`�PK�X��GAVVsage_news_opinion.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1292550626(BasicNewsRecipe):
    title = 'The Sage News - Opinion'
    __author__ = 'Brian Hahn'
    description = 'News without boundaries, Opinion'
    oldest_article = 200
    max_articles_per_feed = 150
    no_stylesheets = True
    use_embedded_content = False
    publisher = 'The Sage News Network'
    category = 'News, Alberta, Canada'
    language = 'en_CA'
    encoding = 'iso-8859-1'
    cover_url = 'http://www.sagenews.ca/images/opinion-cover.jpg'
    remove_tags_before = dict(id='ContentPanel')
    remove_tags_after = dict(id='ContentPanel')
    remove_tags = [dict(name='div', attrs={'id': 'BottomAds'}), dict(name='div', attrs={
        'id': 'moreStories'}), dict(name='div', attrs={'id': 'StoryNavigation'})]
    extra_css = 'img { margin:5px }'
    feeds = [
        ('Editorial Comment', 'http://www.sagenews.ca/Editorial%20Comment.rss'),
        ('Grumpy Old Man', 'http://www.sagenews.ca/Grumpy%20Old%20Man.rss'),
        ('Bad Girl', 'http://www.sagenews.ca/Bad%20Girl.rss'),
        ('Around the Edges with Dixie',
         'http://www.sagenews.ca/Around%20the%20Edges%20with%20Dixie.rss'),
        ('Man Vs. World', 'http://www.sagenews.ca/Man%20Vs.%20World.rss'),
        ('Opinion World', 'http://www.sagenews.ca/Opinion-World.rss'),
        ('Opinion Politics', 'http://www.sagenews.ca/Opinion-Politics.rss'),
        ('Opinion Justice', 'http://www.sagenews.ca/Opinion-Justice.rss'),
        ('Opinion Health', 'http://www.sagenews.ca/Opinion-Health.rss'),
        ('Opinion Environment', 'http://www.sagenews.ca/Opinion-Environment.rss'),
        ('Opinion Living', 'http://www.sagenews.ca/Opinion-Living.rss'),
        ('Opinion Sports', 'http://www.sagenews.ca/Opinion-Sports.rss'),
        ('Opinion Business', 'http://www.sagenews.ca/Opinion-Business.rss'),
    ]
PK�Xn"
�	salon.png�PNG


IHDR  ���IDATxڭ�=hA����9<A,��1��Q$mРV���XY�� X�	Q$U-�`%"�X(*H)X�!��Ow��B�����o�v����8������{�s�
У�`^�G����^�8�%ъ���`������GP�0�a7�A?�)�#�o�t�������M��Ȥ�^�M�J8_erC{��`J�T�EA��ǘq\����Zh�V��sI�ޭ=��aYX���P��2v^���
:yD�H�
`���[�=����i���.�B?�+鱬��C����<f�CWJQ;-`�s
�ˋ�F����8�Z7V����2�6t놰d���W�+�R�a��l����N����3����A
e��Y�bW�Xh�F����f݂�.۔Č�_p�%c�c�5W��]���KU]��C8�t] �lC���Ȥ�X���I�n���:ҩ��3Y_3��������~��$)G!�( �0F�����0��p��h�	�zL�\#�P=��/�`M�ڐ�h��bԒ�nJ�2��iƵ�/��U�jK�i8��pN��C�^C�Z��e��Pp�$��ދ�,7��&DQ;�����8R7��ve�Q݃���S�=��9
��)j�pBH�m�bU�<@�T��[%Ijz�bF+@���*�ބѩn�I�߀��b�I�XR��G�K��+q��1�o@��=IEND�B`�PK�X-�<HUUsalon.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class Salon_com(BasicNewsRecipe):

    title = 'Salon.com'
    __author__ = 'ebrandon'
    description = 'Salon.com - Breaking news, opinion, politics, entertainment, sports and culture.'
    timefmt = ' [%b %d, %Y]'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True

    feeds = [
        ('News', 'http://www.salon.com/category/news/feed/rss/'),
        ('Politics', 'http://www.salon.com/category/politics/feed/rss/'),
        ('Business', 'http://www.salon.com/category/business/feed/rss/'),
        ('Technology', 'http://www.salon.com/category/technology/feed/rss/'),
        ('Innovation', 'http://www.salon.com/category/innovation/feed/rss/'),
        ('Sustainability', 'http://www.salon.com/category/sustainability/feed/rss/'),
        ('Entertainment', 'http://www.salon.com/category/entertainment/feed/rss/'),
        ('Life', 'http://www.salon.com/category/life/feed/rss/'),
    ]

    def get_browser(self, *args, **kwargs):
        br = BasicNewsRecipe.get_browser(self, *args, **kwargs)
        br.set_handle_gzip(True)
        return br
PK�Xl�E	E	salonica_press_news.png�PNG


IHDR  szz�	IDATxڕWp][���a<��uE�)���.�m�F������Vݼ4��2�b���z�۹g���}�>���J:�d����K�� �3_�W���A��;k؟X��:�=2���RGf�>[*�N���_&f}�Oe�,�H>�)�3I�	�G,\L�`��N�s��U�R���{�:b2�Oi�d��gepF����=��N�+B'�4�
���7?�	��P��lKUK1Y�LfKqC��|^��/�:m��Bc�������V���{T�Q|���2�G�6޿'}�����z����W�������o}lK��A��֟�}�e�X����-'(8-��ߘ��r�����"���:)cʯY>�e��v���w�@CG/1�N�<�
��A�s8)�GӴ�Ѥ���^^�g��@!|s*��<�;���Im�U�y���N'a�������;HCcF�sH���h�{���"���{�w�߿}���e��Ql��w��;N�,5& \F�c��ÎS
�4�ζ��@by0=�)NZ(�"I�2��X���@F�����7<F�N�Y��Kv�ѷ�a��6%��Ɇ�^b{B��{ud�ˏ%�x�(�٧�s?���ա|�T�f����˝�i����?2F*Y,V��%�!>�wPQ����l�S�r�ZF ��J�YJ9w�����"2
H|�G[�/Qi}]PK?\/����+�fݯj��EU����
�
N'��j%
Y��Ƙl�xn�l)����eKLBq}��x�~��7D�w�i{|Gx -�K��
�k�&�ʛ�����SpF!	ĉk8��um��v߈�D�F������b� �4�b��i�1Y}H�Ʈ~�נڶX.-�!�Z�f��D22��:^c|��9�֋�5�)��Ԣ�74J'o����6����.��xF�ʠt�I��u�Ī0�>�"卝�Un@M@0
��[��:v�J���7�)@’�_E�U��Bx����=H%��f���3��4�\��1��!.���=+�{�����F*
���w�umf������^ɍ��(�b�Q�:Z�-=��`,�����gip�H*a�kH�L?����6�SG�0��:H|�K�׊���;�v��/<B�%��g�H|�Go�9M���Z߭��$���u���&-Z�
Z��6�������L�A '��>��S��BV�H�y�ugVN���G��eN����>F	{"���WnS`�o2�Z61ж�L��fS`#?���pw|��a��;F�ЪV6�b�5ܹ|�n�#é����x��Q�=8x˖
+���J�A(�K�����{*[�m(��K�U.�`�lq��9V�؉�{��!e������3G�j1L��-���6Ă��fm`$��F3����C�t�4����M�gGI�NȲ��NB���4�EBCh��&h+BwH�Rط؇�>�u��	�Z����8�
��Q�`9x�[Ȳ�@Q��xsӊ��*�$�$��d���o��ʙ��m��rj-=�D�3J�Q��ځ}�6�Qߨ��"�i�F<�5��)�+m����vI����[Vl4��s���W�֐��b.QiS'����G$�ɦ������4�P�����/�A魲�1�.��a��y��+繭�|t8�F�i��XF���(��Xi�0*㮩u�W��Sn�QUK�x�f����?d��3{� )[��W���#]�p���+-�[Ӫ2���|�j9�>9|^Z?��e�i�jB"q
����d�}��ȫh�s [
���*n���5(M
��2����ns�)��\�0zw�`�ddE:G�}V��#4S�r����:���i��t�4,|�n}l~SW?���Kn�(ͯ�>M=�H��X)��:�AXy��qB�V��x�8-�J�3&#�g�d�hG2����|��Nn��A�n�5�.��O%�Ww�D�H��·�:x:wBl����_3���}�mb��t��A��'īN��}�B{G2 ��,��t��x��A��I��\w>���_	UL�Y8�~����|��S�S*!��1f4I���\�MAY]&�L�id�}/9v��f��Fq�*�����h6~ }�>V��6b������˜�Wl	►9�q�=�R��a6ʩ���'&;�:�̚��<�I����R,�Yj�d�sإ���*�]����g<�X�p���)�����)�ONUB�Bch(�����|�^"{%<������>�%�ۣ.Y�R��N?��y�x��h��B�������ذ�lIEND�B`�PK�X(2q�{	{	salonica_press_news.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class spn(BasicNewsRecipe):
    title = u'Salonica Press News'
    language = 'gr'
    __author__ = "SteliosGero"
    oldest_article = 3
    max_articles_per_feed = 100
    auto_cleanup = True
    category = 'news, GR'
    language = 'el'

    feeds = [
    (u'\u03a0\u03bf\u03bb\u03b9\u03c4\u03b9\u03ba\u03ae', u'http://www.spnews.gr/politiki?format=feed&amp;type=rss'),
    (u'\u039f\u03b9\u03ba\u03bf\u03bd\u03bf\u03bc\u03af\u03b1', u'http://www.spnews.gr/oikonomia?format=feed&amp;type=rss'),
    (u'\u0391\u03c5\u03c4\u03bf\u03b4\u03b9\u03bf\u03af\u03ba\u03b7\u03c3\u03b7', u'http://www.spnews.gr/aftodioikisi?format=feed&amp;type=rss'),
    (u'\u039a\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1', u'http://www.spnews.gr/koinonia?format=feed&amp;type=rss'),
    (u'\u0391\u03b8\u03bb\u03b7\u03c4\u03b9\u03c3\u03bc\u03cc\u03c2', u'http://www.spnews.gr/sports?format=feed&amp;type=rss'),
    (u'\u0394\u03b9\u03b5\u03b8\u03bd\u03ae', u'http://www.spnews.gr/diethni?format=feed&amp;type=rss'),
    (u'\u03a0\u03bf\u03bb\u03b9\u03c4\u03b9\u03c3\u03bc\u03cc\u03c2', u'http://www.spnews.gr/politismos?format=feed&amp;type=rss'),
    (u'Media', u'http://www.spnews.gr/media-news?format=feed&amp;type=rss'),
    (u'\u0396\u03c9\u03ae', u'http://www.spnews.gr/zoi?format=feed&amp;type=rss'),

    (u'\u03a4\u03b5\u03c7\u03bd\u03bf\u03bb\u03bf\u03b3\u03af\u03b1', u'http://spnews.gr/texnologia?format=feed&amp;type=rss'),
    (u'\u03a0\u03b5\u03c1\u03b9\u03b2\u03ac\u03bb\u03bb\u03bf\u03bd', u'http://spnews.gr/periballon?format=feed&amp;type=rss'),
    (u'\u03a0\u03b1\u03c1\u03b1\u03c0\u03bf\u03bb\u03b9\u03c4\u03b9\u03ba\u03ac', u'http://spnews.gr/parapolitika?format=feed&amp;type=rss'),
    (u'\u03a0\u03b1\u03c1\u03b1\u03b4\u03b7\u03bc\u03bf\u03c4\u03b9\u03ba\u03ac', u'http://spnews.gr/paradimotika?format=feed&amp;type=rss'),
    (u'\u03a0\u03b1\u03c1\u03b1\u03b1\u03b8\u03bb\u03b7\u03c4\u03b9\u03ba\u03ac', u'http://spnews.gr/parathlitika?format=feed&amp;type=rss'),
    (u'\u0391\u03c0\u03cc\u03c8\u03b5\u03b9\u03c2', u'http://spnews.gr/apopseis?format=feed&amp;type=rss'),
    (u'\u03a3\u03c5\u03bd\u03b5\u03cd\u03be\u03b5\u03b9\u03c2', u'http://spnews.gr/synenteykseis?format=feed&amp;type=rss'),
    (u'Alert!', u'http://spnews.gr/alert?format=feed&amp;type=rss')]

    def print_version(self, url):
        return url + '?tmpl=component&print=1&layout=default&page='
PK�X���Y��samanyolu_haber.png�PNG


IHDR�a�IDATx�m��\A��S۶����m��CP�
j�Am�mT۶���?/3�ͤ�|�3���M�e�A�~: �M��?��#�x�Fc���x�q�^4����:0:T�c�4.Z��r�k��;5�wH�d���	�D��=�CN��6G{����T���8dj�'�ERsf��t`d8���_YK����Ch�÷�؃d��l��Ɣn+��m��
�#C!@�VPB�^��XL�Z����8�2�F��u��A`�)�j}����<�*s���OOl�[(. �7`��,�HHB3���fh@V�@�y4�"�z�t�X���������z�e�K0u V��,H��RC�7A|H��g���
��T�e�@Q��@�@7��x��k�@���3�b$�`���
v�"gp�IEND�B`�PK�X���88samanyolu_haber.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class SHaber (BasicNewsRecipe):

    title = u'Samanyolu Haber'
    __author__ = u'thomass'
    description = ' Samanyolu Haber Sitesinden günlük haberler '
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    auto_cleanup = True
    encoding = 'utf-8'
    publisher = 'thomass'
    category = 'güncel, haber, türkçe'
    language = 'tr'
    publication_type = 'newspaper'

    conversion_options = {
        'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }
    extra_css = '  .Haber-Baslik-Yazisi {font-weight: bold; font-size: 9px} .Haber-Ozet-Yazisi{ font-family:sans-serif;font-weight: normal;font-size: 11px } #Haber{ font-family:sans-serif;font-weight: normal;font-size: 9px }.KirmiziText{ font-weight: normal;font-size: 5px }'  # noqa

    cover_img_url = 'http://www.samanyoluhaber.com/include/logo.png'
    masthead_url = 'http://www.samanyoluhaber.com/include/logo.png'
    remove_empty_feeds = True

    feeds = [
        (u'Son Dakika', u'http://podcast.samanyoluhaber.com/sondakika.rss'),
        (u'Gündem', u'http://podcast.samanyoluhaber.com/gundem.rss'),
        (u'Politika ', u'http://podcast.samanyoluhaber.com/politika.rss'),
        (u'Ekonomi', u'http://podcast.samanyoluhaber.com/ekonomi.rss'),
        (u'Dünya', u'http://podcast.samanyoluhaber.com/dunya.rss'),
        (u'Spor ', u'http://podcast.samanyoluhaber.com/spor.rss'),
        (u'Sağlık', u'http://podcast.samanyoluhaber.com/saglik.rss'),
        (u'Kültür', u'http://podcast.samanyoluhaber.com/kultur.rss'),
        (u'Eğitim', u'http://podcast.samanyoluhaber.com/egitim.rss'),
        (u'Ramazan', u'http://podcast.samanyoluhaber.com/ramazan.rss'),
        (u'Yazarlar ', u'http://podcast.samanyoluhaber.com/yazarlar.rss'),



    ]

    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

PK�X�\1�samanyolu_teknoloji.png�PNG


IHDR  szz��IDAT�Y��gy����}�;ۜ9�9��x�{m��0K�@U�R�^���R[A��mU	U���R�"����

���fiCp�x����g���ٿ�}��~�zd�V��gR�Og�pz��2.m���$b1�a4L�"��f3v�$"K�כI���՗��۟y�/o�*Vȃ�F�"(;����g~�UiՌ,�u�hT�!���B2F��zzW`Ռ�fd�'&��Z/�N�TEA�@PP@� g��75�����o�/��[+o�Rk��]A���f
CP������ch��`ePl>��|�RG���(�΄���s):,�t.q�{���`�}�﫿��<��9�n�^��5�+�4��/�V:�K�;6�4'7o��2Tˠ�J+^޷��=�$���.� U0�k8c��P��G'��gON�z|��I#��5I�swB�ї.w~�w����t+�)6�0���ǣR�مz���s��F�@���Oy�+�K%�@D�T�v`&��g�~�{����~�a�P���v�o���{򹻃�K�\mD�L�F���J����ǀyr��"\��_=\�6���fݙ{��_���� N�<،���?|��{��c��4�����_�|a�'o�l��K��j>}��[�*2(����գ@�	aۉ̕�Y�? ��bխ=q�}#��Vb����/^���N�ܞ���w��g��j�U?��x��5�0T��g����r7_r���tb����<��6���؞z��J>(��"t5�T�c���IJGD�@:�����D\u�H������� ��<s����w=��v=z�B/�_�?_��7�������89ͻ檻�yx4�郭dw=uM�D�0����"�ř�(��P�ՇwhЇ�H��W�������q����	ʱ�;��2*S���~���ٝAhX�w�w,6����ԳY�xD??��$X�X�;Id�7(�3�7F�ևE�>�ث�R{���1
�N��q|�z�Dfݑ����"�ę
b��V62O�
}�,|�=[��k7?+"'#�������j|Pld�8Y�7�~�R�}�6���/����3i��'s����^s�n��ذ/12 �w��r��Ψda"�����<���N�hb
�5�H�a)(����Z����{s}t��[���W�z/������<O->B�?�l��0��D�]���ѵ���ƕ-���H�x�����1Bl���.�"�Il;8���:��:��+�u��-��'���4"aAD9T�"a������q��	D�J���*B��&��
:�����j��Vvf*n��LaWv(S(�A�cD H�A�R���a�S",DF���扉ʹ/<t�O�5�]���-��r�������v��}x:�����N�P�A��0�=�{]Z��'[�C��ۋ�V�
5�^w�z|��T�}6u?�4(.�\�m!���<(8�9*�r?�J�j�U'��T5*���aa�t�zEؼ=,����=0{zr"y�2�(ʰ7�3H�,-r� ^�#���������׮l�׶3��(�T��{�����Bg쳠%��X��D<�*��Q���fQ�FT<<�LV�6��#K��lg4��m3�k'��WK�r�׀]@[aA�:@Ԕ��?92�|d�9��M��;�/"#�Dhs@��Dd�n��yj�?:�n4b;�3/AuC����z������d+�d^G3�h��[�>��x�~>9��뱕UcdB���L�j-�Lh%�&��͕^���[,m��Ռy`O�ƮZ�~1]��ީYs�)�X�mKy�щd���I�����[��5 fL�ϒ��x�d��(�	X�T��L$v��}�7����F��7��(E�a/A��XY"�ˮV�.��'��7;�<v����:,�)�6bo��3.+�z=�9xUrc�T���Y���7��Z�^�9��v�Y
z�a�V��pcu{�����#��U5r���C.�����'���Ʌ�9D.�$�X�F?�k+�\l�j�ڏ+vM�\��6��W_�ſ\�m�i�<ql��.6f'c{��o%2+���3_�����!��k�L�nyq"��J�=g>pl6=r��Nt��)��`T�ry�xy��#T�H%ZL%v�j��g�n=}���.B�r�<���&ڳ��c� L���ȝ���|meP�>��m�S�x���Sͤ}���rT��p�Ǒ�"2�7��|�R翟�7\�X�'c�,����qbdp����z��G|��w���]�>Z�O�3��Qup�Xy��[�Ҟ�7��ݿ8��y���pj�jF�P�u!V����[�;Y�b�[�RU��ɇ��؁�L�]� ��Y8�V��������kwd�p��%_���qu�n��=<���ıv��h.)uXRUV�@uF)=�p3��=>���<9����c��oT����6����[߾��F汆¥V�T�j/7�2`����w��eF�e8���Fdzo��ԺE�V�DS������qjO�8���gj��6���l�����w�w�{��{�g>�HĻ,("A�[��s�l9EkQ�ı��O��5���T�VtwP�{x1��}�7�g�����^]_�ލ�2P��#
`zco^���Ζ��P���f�4����h+	���@aZaF��~��_���_��:�6F���鳖�(k�����``)��~w�a?w|*=:[m�u6/�}Ιycee��P�Ƒ�n��:X���7n<�>\�Y3������ �Z����P�+'�%J'���a��JZz�)�G!�5@��ɂޘJ9Ob/�C�M/g�_8 �:�@�:�s�xU�)_^�<�IEND�B`�PK�XXa�seesamanyolu_teknoloji.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class SHaberTekno (BasicNewsRecipe):

    title = u'Samanyolu Teknoloji'
    __author__ = u'thomass'
    description = 'Samanyolu Teknoloji Haber Sitesinden  haberler '
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    publisher = 'thomass'
    category = 'bilim, teknoloji, haber, türkçe'
    language = 'tr'
    publication_type = 'magazine'

    conversion_options = {
        'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }
    extra_css = ' .IcerikMetin{ font-family:sans-serif;font-weight: normal;font-size: 10px } .h1IcerikBaslik {font-weight: bold; font-size: 18px}'

    keep_only_tags = [
        dict(name='div', attrs={'class': ['IcerikBaslik', 'IcerikMetinDiv']})]

    cover_img_url = 'http://teknoloji.samanyoluhaber.com/resources/images/logo_s_digi.jpg'
    masthead_url = 'http://teknoloji.samanyoluhaber.com/resources/images/logo_s_digi.jpg'
    remove_empty_feeds = True

    feeds = [
        (u'GENEL', u'http://podcast.samanyoluhaber.com/Teknoloji.rss'),
        (u'İNTERNET', u'http://open.dapper.net/services/shaberteknolojiinternet'),
        (u'CEP TELEFONU',
         u'http://open.dapper.net/services/shaberteknolojicep'),
        (u'OYUN', u'http://open.dapper.net/services/shaberteknolojioyun'),
        (u'DONANIM', u'http://open.dapper.net/services/httpopendappernetservicesshaberteknolojidonanim'),
        (u'ÜRÜN İNCELEME',
         u'http://open.dapper.net/services/shaberteknolojiurun'),
        (u'ALIŞVERİŞ', u'http://open.dapper.net/services/shaberteknolojialisveris'),
        (u'BİLİM & TEKNOLOJİ',
         u'http://open.dapper.net/services/shaberteknolojibilim'),
        (u'HABERLER', u'http://open.dapper.net/services/shaberteknolojihaber'),



    ]

PK�X��JJJsan_fran_chronicle.png�PNG


IHDR�aIDATx�c���?#%�:\�����6�������/�x�E-5g�" �(���j�V100_VW?�������C
x�c��.����@&^��X֬�VҌf�G5��mTWw{IC�D�pIC}#F���䤗 o���b3W44�av���ht�1�r�g����1�](|�2��j�cd=r���M�@oT��~��9Z n�D��0@�l �;�
:%$�
�|	�wK�KC�� ȏ�I��g�&3Q�D=avX!IEND�B`�PK�X��Dsan_fran_chronicle.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008, Darko Miletic <darko.miletic at gmail.com>'
'''
sfgate.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class SanFranciscoChronicle(BasicNewsRecipe):
    title = u'San Francisco Chronicle'
    __author__ = u'Darko Miletic and Sujata Raman'
    description = u'San Francisco news'
    language = 'en'

    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    auto_cleanup = True

    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;}
                        h4{font-family :Arial,Helvetica,sans-serif; font-size: x-small;}
                        p{font-family :Arial,Helvetica,sans-serif; font-size:x-small;}
                        .byline{font-family :Arial,Helvetica,sans-serif; font-size: xx-small;}
                        .date{font-family :Arial,Helvetica,sans-serif; font-size: xx-small;}
                        .dtlcomment{font-style:italic;}
                        .georgia h3{font-family :Arial,Helvetica,sans-serif; font-size:x-small; color:#000000;}
                     '''

    feeds = [
        (u'Bay Area News', u'http://www.sfgate.com/bayarea/feed/Bay-Area-News-429.php'),
        (u'City Insider', u'http://www.sfgate.com/default/feed/City-Insider-Blog-573.php'),
        (u'Crime Scene', u'http://www.sfgate.com/rss/feed/Crime-Scene-Blog-599.php'),
        (u'Education News',
         u'http://www.sfgate.com/education/feed/Education-News-from-SFGate-430.php'),
        (u'National News', u'http://www.sfgate.com/rss/feed/National-News-RSS-Feed-435.php'),
        (u'Weird News', u'http://www.sfgate.com/weird/feed/Weird-News-RSS-Feed-433.php'),
        (u'World News', u'http://www.sfgate.com/rss/feed/World-News-From-SFGate-432.php'),
    ]
PK�X���DDsanjosemercurynews.png�PNG


IHDR:���IDATx��A(C���{��͚�"�(rQ�9���Bڔ�JR�R9��eQ�]U�Z�!��,%'�J[�5�c���
~�T
|Px��FD�J�c`�y/��|};���V�(�"���&��)';�.���Cґ��sX��0Z�{����\��mKy�&nv����%��H!�R�Q�7E��J�Mע�Q��Zf�;/�UG�`b,so.H.���8+�ÈgdP��촸�ʧ���gwc����m_�^"s��v�j:���`�4��OIoL���2IEND�B`�PK�Xe��M��sanjosemercurynews.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.mercurynews.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class MercuryNews(BasicNewsRecipe):
    title = 'San Jose Mercury News'
    __author__ = 'Darko Miletic'
    description = 'News from San Jose'
    cover_url = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg12/lg/CA_SJMN.jpg'
    publisher = 'San Jose Mercury News'
    category = 'news, politics, USA, San Jose, California'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(name='h1'),
        dict(attrs={'class':['byline', 'time', 'article-body']}),
        dict(attrs={'class':lambda x: x and 'header-features' in x.split()}),
    ]

    feeds = [
        ('News', 'http://www.mercurynews.com/feed/')
    ]

    def preprocess_html(self, soup, *a):
        for img in soup.findAll(name='img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        return soup
PK�X�BD��sarajevo_x.png�PNG


IHDR(-S*PLTE
=�$U�+Z�1`�8f�S~�`��u��{�ځ�ݍ�Ⓑ���8~s�tRNS@��fgIDATx�e���`�o��~��OԱ�����y��o|y�bo֚����}�?���$�b������)ǧ���1h��1z��F�>��C|��׊��o�;8D^ЦIEND�B`�PK�XQyO�
�
sarajevo_x.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'

'''
sarajevo-x.com
'''

import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag, NavigableString


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class SarajevoX(BasicNewsRecipe):
    title = 'Sarajevo-x.com'
    __author__ = 'Darko Miletic'
    description = 'Sarajevo-x.com - najposjeceniji bosanskohercegovacki internet portal'
    publisher = 'InterSoft d.o.o.'
    category = 'news, politics, Bosnia and Herzegovina,Sarajevo-x.com, internet, portal, vijesti, bosna i hercegovina, sarajevo'
    oldest_article = 2
    delay = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'cp1250'
    use_embedded_content = False
    language = 'bs'
    extra_css = ' @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Arial,Verdana,Helvetica,sans1,sans-serif} .article_description{font-family: sans1, sans-serif} div#fotka{display: block} img{margin-bottom: 0.5em} '  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [dict(name='div', attrs={'class': 'content-bg'})]
    remove_tags_after = dict(name='div', attrs={'class': 'izvor'})
    remove_tags = [dict(name=['object', 'link', 'base', 'table'])]
    remove_attributes = ['height', 'width', 'alt', 'border']

    feeds = [

    (u'BIH', u'http://www.sarajevo-x.com/rss/bih'),
    (u'Svijet', u'http://www.sarajevo-x.com/rss/svijet'),
    (u'Biznis', u'http://www.sarajevo-x.com/rss/biznis'),
    (u'Sport', u'http://www.sarajevo-x.com/rss/sport'),
    (u'Showtime', u'http://www.sarajevo-x.com/rss/showtime'),
    (u'Scitech', u'http://www.sarajevo-x.com/rss/scitech'),
    (u'Lifestyle', u'http://www.sarajevo-x.com/rss/lifestyle'),
    (u'Kultura', u'http://www.sarajevo-x.com/rss/kultura'),
    (u'Zanimljivosti', u'http://www.sarajevo-x.com/rss/zanimljivosti')
    ]

    def preprocess_html(self, soup):
        dtag = soup.find('div', attrs={'id': 'fotka'})
        if dtag:
            sp = soup.find('div', attrs={'id': 'opisslike'})
            img = soup.find('img')
            if sp:
                sp
            else:
                mtag = new_tag(soup, 'div', [
                           ("id", "opisslike"), ("class", "opscitech")])
                mopis = NavigableString("Opis")
                mtag.insert(0, mopis)
                img.append(mtag)
        return soup
PK�Xl�،�sardinia_post.png�PNG


IHDR  D���.PLTE������������������������������������������������������<8��������������_\ؖ������������Ԋ��PK�]Y�:7�a]�;8�A=�A>��C@�EA�GC�IEߧ�Ռ�ԋ�ٖ�ڛ��۝�ܟ�ܡ��IF�NI�NJ�NK��QN�WS�WT��^Z�^[�� �c_�da�eb�hd�mg�qn�ro�tr�xu�{u�{v�|y�}z҃�"�"�$!֏�ؔ��%"�&#�'$�'$�-)�-*�/+ߨ�ᬪ᮫Ⱛ㲰㳮㳱㴱帲帵帶罺罻翼���������������������������������������س/,��ݴ0-����������������1.�����������2-�3.�30����������������������41�52�95�Gd;7tRNS
248@BDFLRTX`bdfhjlprtvxz|������������������޼��IDATx�]�we1��nǵmw�Wcl۶m[۶��Mr�{�[+qr�>���C�"�a��V�@���ZY/�]���_^,?�X#�j`���%@m��ވe���>qh��7���6ߤ���>(ތ�F�v�9GK�y�Ҝ&,Q�P�|���O�3��b�V����:BG��	%��ˤ�JW;��5!����K��P�F��R���	�1��:瓼����qj.���p#�J�|G�Ȅg.=''��盰���Ax�k�|�"�u�>j�0�������+f�K�gb����p$�>
�~е	�*!D\��Y
[�	��%C�iKc�	7��<���&�"��m��UM��`FIl��1|_��6�&gAiN�a�Pv�|F��2p�ӡe����~�ia���T
���E���TU�0q����4SzFlNEۣ��T�#P�#ssG����Y�ޟ�IEND�B`�PK�X��sardinia_post.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1501589429(AutomaticNewsRecipe):
    title = 'Sardinia Post (Lapis)'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup = True
    language = 'sc'
    __author__ = 'tzium'

    feeds = [
        ('Sardinia Post (Lapis)',
         'https://www.sardiniapost.it/category/lapis/feed'),
    ]
PK�X��|���saskatoon_star_phoenix.png�PNG


IHDR  D���4PLTE~	9�Pr�E`�n��s��\t�=c�@e�Af�Ch�*N�.Q~
:�k�;�Gb�Qj�Rk�#Nƒ��i�l��n��/X�3[�w��{��|�у�ٙ�ٚ�ٚ�ڝ���Ř;a����r��~��>�
<�?�.R�)N�B�Fj�,O�Np�>�Oq�D�/R�Rt�Vw�2T�4U�\{�^}�7W�`�E�>\�i��l��m��Eb�A]�k��r��s��Rn҇��Tm�Um�Un�Vn�Wo�Xp�Xq�Yq���� L�`w�by�cz�d{�e{�e|�"M
9�j��B�m��&P�)S�p��=�Eʚ��t��t�˜�˝��+T�x��y��.W�:�>c��π�π�Ё�Ђ�Ѓ��1Yф��2Z҈�҈�ҫ�Ӓ�Ր��&N�
<� Hٛ�ڛ�ڜ��6]۟�ܢ�ݣ�ݤ�ߩ�୹஺᯻ⱼⲽ⳾㴿��6^��Ė8_����Ҹw��x��9X�r��:Y�;Z�g}�v��9`Ɠ�ц��#M�%K�k��`�Nh�Oi�@�J�Sl�F�Fa�H�Hc�Ke�p��q��~�Σ��C_�D`կ�հ�֑�֒�ה�ז�ؗ��D`�2e\IDATxڥ��b�1�m۳���Զm۶m�v/�6���<�9`!4�|���p�C`�+p0��@�o@1���g�&�p�p����@>$��ЇZ�aO�WOM�~t���x�S��X�n��?#�0�cr;Vs���e{�J���o���ebPт+�`��ZR�5r��[f����v�֘	����yّ��d����ϡ�v�1��
�r1;n״R�(I�?
ID?�Pw$q�f��A�V!�U�7��F��r�h�g��A.a��KJ
u��Um>sϙ�{w
x�QXL�,RV5=���"����=�?�7�ϗ�?���h�/���IEND�B`�PK�X/h�w w saskatoon_star_phoenix.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'

'''
www.canada.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class CanWestPaper(BasicNewsRecipe):

    # un-comment the following four lines for the Victoria Times Colonist
    # #    title = u'Victoria Times Colonist'
    # #    url_prefix = 'http://www.timescolonist.com'
    # #    description = u'News from Victoria, BC'
    # #    fp_tag = 'CAN_TC'
    #
    # un-comment the following four lines for the Vancouver Province
    # #    title = u'Vancouver Province'
    # #    url_prefix = 'http://www.theprovince.com'
    # #    description = u'News from Vancouver, BC'
    # #    fp_tag = 'CAN_VP'
    #
    # un-comment the following four lines for the Vancouver Sun
    # #    title = u'Vancouver Sun'
    # #    url_prefix = 'http://www.vancouversun.com'
    # #    description = u'News from Vancouver, BC'
    # #    fp_tag = 'CAN_VS'
    #
    # un-comment the following four lines for the Edmonton Journal
    # #    title = u'Edmonton Journal'
    # #    url_prefix = 'http://www.edmontonjournal.com'
    # #    description = u'News from Edmonton, AB'
    # #    fp_tag = 'CAN_EJ'
    #
    # un-comment the following four lines for the Calgary Herald
    # #    title = u'Calgary Herald'
    # #    url_prefix = 'http://www.calgaryherald.com'
    # #    description = u'News from Calgary, AB'
    # #    fp_tag = 'CAN_CH'
    #
    # un-comment the following four lines for the Regina Leader-Post
    # #    title = u'Regina Leader-Post'
    # #    url_prefix = 'http://www.leaderpost.com'
    # #    description = u'News from Regina, SK'
    # #    fp_tag = ''
    #
    # un-comment the following four lines for the Saskatoon Star-Phoenix
    title = u'Saskatoon Star-Phoenix'
    url_prefix = 'http://www.thestarphoenix.com'
    description = u'News from Saskatoon, SK'
    fp_tag = ''

#     un-comment the following four lines for the Windsor Star
# #    title = u'Windsor Star'
# #    url_prefix = 'http://www.windsorstar.com'
# #    description = u'News from Windsor, ON'
# #    fp_tag = 'CAN_'
#
#     un-comment the following four lines for the Ottawa Citizen
# #    title = u'Ottawa Citizen'
# #    url_prefix = 'http://www.ottawacitizen.com'
# #    description = u'News from Ottawa, ON'
# #    fp_tag = 'CAN_OC'
#
#     un-comment the following four lines for the Montreal Gazette
# #    title = u'Montreal Gazette'
# #    url_prefix = 'http://www.montrealgazette.com'
# #    description = u'News from Montreal, QC'
# #    fp_tag = 'CAN_MG'

    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: large;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: small; font-style: italic }
                #photocredit { font-size: xx-small; }'''
    keep_only_tags = [dict(name='div', attrs={'id': 'storyheader'}), dict(
        name='div', attrs={'id': 'storycontent'})]
    remove_tags = [{'class': 'comments'},
                   dict(name='div', attrs={'class': 'navbar'}), dict(
                       name='div', attrs={'class': 'morelinks'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def get_cover_url(self):
        from datetime import timedelta, date
        if self.fp_tag == '':
            return None
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        return self.strip_anchors(soup)

    def parse_index(self):
        soup = self.index_to_soup(
            self.url_prefix + '/news/todays-paper/index.html')

        articles = {}
        key = 'News'
        ans = ['News']

        # Find each instance of class="sectiontitle", class="featurecontent"
        for divtag in soup.findAll('div', attrs={'class': ["section_title02", "featurecontent"]}):
            if ''.join(divtag['class']).startswith('section_title'):
                # div contains section title
                if not divtag.h3:
                    continue
                key = self.tag_to_string(divtag.h3, False)
                ans.append(key)
                self.log("Section name %s" % key)
                continue
            # div contains article data
            h1tag = divtag.find('h1')
            if not h1tag:
                continue
            atag = h1tag.find('a', href=True)
            if not atag:
                continue
            url = self.url_prefix + '/news/todays-paper/' + atag['href']
            title = self.tag_to_string(atag, False)
            pubdate = ''
            description = ''
            ptag = divtag.find('p')
            if ptag:
                description = self.tag_to_string(ptag, False)
            author = ''
            autag = divtag.find('h4')
            if autag:
                author = self.tag_to_string(autag, False)
            if key not in articles:
                articles[key] = []
            articles[key].append(dict(title=title, url=url, date=pubdate,
                                      description=description, author=author, content=''))

        ans = [(k, articles[k]) for k in ans if k in articles]
        return ans
PK�X�p��
satira.png�PNG


IHDR��h6�IDAT(�m�]L�Q��օ[�㦻�M���
PYڪu�̼ꢹ��lZs�配�ʛB�J
LQs�@�+�Il5Ɋ�}%PA�
?���C��n��/�;�;�y�C�Ft ˅���H8����&�7y��ܤ�S̋�8%GB��ϛy��}VY�q��qOuv,�7��<_�TK�<��UoN
'<_a�,-$���po/іCt�.^!��E���뼸�&,ώ����3Q�0�DM
��O��<��P��h��
��Q�~�֋�au��_j��`�� ��U+���k�	�r���²�y�?�̯�F��b�����AXt���OE�N��n4ny�P�T�(* >8��sI�T�ɗW�?H�̙?;T��J��:��߷�tϦ�L�m�
�|V�X�m��3� �
"?�Ѥ�m���`k#��L����ɩ��U�>��R�c�(�Y0�Z䪽m:����U��`�[�D�hjh�a���Yq7�z����X�b(���17G��١�wIa�,X��v�Ym�.��;
fs+#o�eD㮻�����B����<Ikw||��Ix���$���.n���h��+|Kz�w*
�XWK����5n�1�ӽ/���Ck�l�����PI5�6�IEND�B`�PK�X����
satira.recipe__license__ = 'GPL v3'
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1327351409(BasicNewsRecipe):
    title = u'Satira'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    feeds = [
    (u'spinoza', u'http://feeds.feedburner.com/Spinoza'),
    (u'umore maligno', u'http://www.umoremaligno.it/feed/rss/'),
    (u'fed-ex', u'http://exfed.tumblr.com/rss'),
    (u'metilparaben', u'http://feeds.feedburner.com/metil'),
    (u'freddy nietzsche', u'http://feeds.feedburner.com/FreddyNietzsche')]
    __author__ = 'faber1971'
    description = 'Collection of Italian satiric blogs - v1.00 (28, January 2012)'
    language = 'it'
PK�X�*�v
satkurier.png�PNG


IHDR(-S0PLTE��*�:$�<&�J3�J5�ZD�jV�hY�xfӈy��wף�ά���������;�IDATx�$��� C�Ģ4���v._�O~��8H�.�ְ��-���Zؾ}���	�ڜ���AK��r�
o��W}�m�ʗ�a��E	�Ki����\�=TF.�Mt������@7w��=z$��ۡ	6����/�N�MID�PIEND�B`�PK�X��Bk��satkurier.recipe#!/usr/bin/env python

__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe


class SATKurier(BasicNewsRecipe):
    title = u'SATKurier.pl'
    __author__ = 'Artur Stachecki <artur.stachecki@gmail.com>'
    language = 'pl'
    description = u'Serwis poświęcony telewizji cyfrowej'
    oldest_article = 7
    masthead_url = 'http://satkurier.pl/img/header_sk_logo.gif'
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    remove_javascript = True
    no_stylesheets = True

    keep_only_tags = [dict(name='div', attrs={'id': ['leftNewsContainer', 'content']})]

    remove_tags = [dict(name='div', attrs={'class': ['col-xs-20', 'coverNews','btn-group']})]

    remove_tags_after = [dict(name='div',attrs={'class':'btn-group'})]

    feeds = [(u'Najnowsze wiadomości', u'http://feeds.feedburner.com/satkurierpl?format=xml'),
             (u'Sport w telewizji',
              u'http://feeds.feedburner.com/satkurier/sport?format=xml'),
             (u'Blog', u'http://feeds.feedburner.com/satkurier/blog?format=xml')]

    def preprocess_html(self, soup):
        image = soup.find(attrs={'id': 'news_mini_photo'})
        if image:
            image.extract()
            header = soup.find('h1')
            header.replaceWith(header.prettify() + image.prettify())
        for alink in soup.findAll('a'):
            if alink.string is not None:
                tstr = alink.string
                alink.replaceWith(tstr)
        return soup
PK�X�!o���satmagazine.png�PNG


IHDR  ���IDATx^��Mh[�3wn��d
E�V,ъV-j��(-u#�UTܨ�~Yk
~-\7�X袺RPą��ж���
ZP�ڼ�ic����wғ�Kk^��'\.���sq�V�@��I���ض���S��_�Ȉ�N[�
A�Z	�
2��Hd��d^��A��}�Ξ%+B�%�$��Lj��Ϙ�3M����
#�ӓ�w/g����S:y���4�0��}}3�n��l��v�O���9c�|6!�����>x��qÚ�ˇ8N8~�}�<�8�1��)�d�tXSO�$�_�����=r�������b�i�F�M�������c�}萫�U�xLE{B���8]=�m��ˈ�0H���tI�j?�<(h����TK�>>�A����p�UUi�A���A����6cV:m�j��S���}�N��c��[���6���.&{{s�Q����QN�Hg'۲��
������61�}�.����=DHE���a��ۨ�a�6ڡc��y���_
	�{�ZI������HD�������|�(�
{�]Q�W���p^o>3%�b1��5s�Z���hl��C��=\�,Q-ll������~���e�52B�Q��]O4�m�;�A@:l��d��7o��}۳{w���n���$�^ܓTJ��'�li�a�tp�eхU���7o�q~?W]
�t%�f `�^��3p���`�b�8h���e�t۲R���I$�!A�N�R��r��&���{��'&�����A�.
���~�|��U���PH>x0-�=�f~f׮T0���X|Q�(DѲC8�u��d!
)���@�e�Mm��^u-�[��*�ˌ������Ʒo䚛��VVQ��	�~\�Ԉ9��.�/^���0H��5�۵5kY4�����I��,-���q�lx�@��w���P�D�i��A8�6e��}�2�֦ �ߺ���V��tU����E	t��J�Q0�?_@�loϾy�QR[K.]b;v���q@#ݑ��$
n��ŋ���l��n�ѡ���:(�ż��J]�`A�r h��Z�a���;���mmz(�͏I��ɆCB.'��L�[M�
���r۷'N�$鋦X�8+���7 ���z�&IP��Et�S�xj�������yCE&IEND�B`�PK�X��
�]]satmagazine.recipe#!/usr/bin/env python
##
# Title:        SatMagazine
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
##
# Written:      Feb 2012
# Last Edited:  Mar 2012
##

# Feb 2012: Initial release

__license__ = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'

'''
satmagazine.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class SatMagazine(BasicNewsRecipe):

    title = u'SatMagazine'
    description = u'North American Satellite Markets...'
    publisher = 'Satnews Publishers'
    publication_type = 'magazine'
    INDEX = 'http://www.satmagazine.com/cgi-bin/display_edition.cgi'
    __author__ = 'kiavash'

    language = 'en'
    asciiize = True
    timeout = 120
    simultaneous_downloads = 2

    # Flattens all the tables to make it compatible with Nook
    conversion_options = {'linearize_tables': True}

    keep_only_tags = [dict(name='span', attrs={'class': 'story'})]

    no_stylesheets = True
    remove_javascript = True

    remove_attributes = ['border', 'cellspacing', 'align', 'cellpadding', 'colspan',
                         'valign', 'vspace', 'hspace', 'alt', 'width', 'height']

    # Specify extra CSS - overrides ALL other CSS (IE. Added last).
    extra_css = 'body { font-family: verdana, helvetica, sans-serif; } \
                 .introduction, .first { font-weight: bold; } \
                 .cross-head { font-weight: bold; font-size: 125%; } \
                 .cap, .caption { display: block; font-size: 80%; font-style: italic; } \
                 .cap, .caption, .caption img, .caption span { display: block; margin: 5px auto; } \
                 .byl, .byd, .byline img, .byline-name, .byline-title, .author-name, .author-position, \
                    .correspondent-portrait img, .byline-lead-in, .name, .bbc-role { display: block; \
                    font-size: 80%; font-style: italic; margin: 1px auto; } \
                 .story-date, .published { font-size: 80%; } \
                 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 { font-size: 175%; font-weight: bold; } \
                 h2 { font-size: 150%; font-weight: bold; } \
                 h3 { font-size: 125%; font-weight: bold; } \
                 h4, h5, h6 { font-size: 100%; font-weight: bold; }'

    # Remove the line breaks, href links and float left/right and picture
    # width/height.
    preprocess_regexps = [(re.compile(r'<br[ ]*/>', re.IGNORECASE), lambda m: ''),
                          (re.compile(r'<br[ ]*clear.*/>',
                                      re.IGNORECASE), lambda m: ''),
                          (re.compile(r'<a.*?>'), lambda h1: ''),
                          (re.compile(r'</a>'), lambda h2: ''),
                          (re.compile(r'float:.*?'), lambda h3: ''),
                          (re.compile(r'width:.*?px'), lambda h4: ''),
                          (re.compile(r'height:.*?px'), lambda h5: '')
                          ]

    def parse_index(self):

        article_info = []
        feeds = []

        soup = self.index_to_soup(self.INDEX)

        # Find Cover image
        cover = soup.find('img', src=True, alt='Cover Image')
        if cover is not None:
            self.cover_url = cover['src']
            self.log('Found Cover image:', self.cover_url)

        # main part of the site that has the articles
        soup = soup.find('div', attrs={'id': 'middlecontent'})

        # Find the Magazine date
        # contains the string with the date
        ts = soup.find('span', attrs={'class': 'master_heading'})
        ds = ' '.join(self.tag_to_string(ts).strip().split()[:2])
        self.log('Found Current Issue:', ds)
        self.timefmt = ' [%s]' % ds

        articles = soup.findAll('span', attrs={'class': 'heading'})

        descriptions = soup.findAll('span', attrs={'class': 'story'})

        title_number = 0

        # Goes thru all the articles one by one and sort them out
        for article in articles:

            title = self.tag_to_string(article)
            url = article.find('a').get('href')

            self.log('\tFound article:', title, 'at', url)
            desc = self.tag_to_string(descriptions[title_number])

            article_info.append({'title': title, 'url': url, 'description': desc,
                                 'date': self.timefmt})

            title_number = title_number + 1

        if article_info:
            feeds.append((self.title, article_info))

        return feeds

    def preprocess_html(self, soup):

        # Finds all the images
        for figure in soup.findAll('img', attrs={'src': True}):

            # if the image is an ad then remove it.
            if (figure['alt'].find('_ad_') >= 0) or (figure['alt'].find('_snipe_') >= 0):
                del figure['src']
                del figure['alt']
                del figure['border']
                del figure['hspace']
                del figure['vspace']
                del figure['align']
                del figure['size']
                figure.name = 'font'
                continue

            # adds /n before and after the image
            figure['style'] = 'display:block'

        # Makes the title standing out
        for title in soup.findAll('b'):
            title.name = 'h3'

        # Removes all unrelated links
        for link in soup.findAll('a', attrs={'href': True}):
            link.name = 'font'
            del link['href']
            del link['target']

        return soup
PK�XOA"���
sb_nation.png�PNG


IHDR00W��HIDATx^�y�WՕ�?�~[�ze�^4H#4�esI��2��8���c*�J��Q'��2
�-jfbp�u2�2�Q�e�����z��޻g�
�Úd��L��Su��ޫs��=��.���OF�ͯ�y<YT����A����BstLI*>��
`p-]"�n[VV�Xp�9�s���Ym�;;�Ż����m�(�kN��yeM�Q�6�#;�ו��-�?���m;�WGml�"��.�DH��_9p�8�c�w���獆a����5k��_��A�V�ᐹ���u�j��?j��{�6�t��bT�+	�6�wN>��G�r��uf_��ŷB�T ���ٺ��hll���^�D�x�W�8���j>�O����
��D�0$�D�+�nI	��2z�z�T0���DUT� �
�^��c^G�֮]kƏ�bh|���T�P@�@�@��0��W����[��Ȭ�:�'n$ƨbD@?��Z�����������M�q�())Y6iҤ�ѨcPU��xlJN$B��U�`�1sT,ED0�PXXH<�300�vϞ=u��#*`(��C	FU�֒�d�M"���0kQU>�0�q�1x����Ӌ_|����l߼1/H�⫃Z��F���u�&7CQU���6��;H�R��N�z�0d�w����I
��d4O�����V�\�s��妛n��Y��f2.��K�	���6g�Z7��\Wv�?���\����_�S�,6�(D�<���BNXx*��""�b�eh�ٽ�������[�e��6Ъ���=�ts��w�ڥ��퓉'RSSs�mHOJ�/�sY<}2�EEq���Tj/����~�n��
.<#��C��u�N� D$Jo�$r��4Nh>ZJ��^p*5ush��2���
q(-�l�x�M�����N���+WR��M�;]dM��A��'3�_�J���������+Z�\}�S��� �z.��KY��_(La����B!����_��YQ�طo�x�|�r�a��0�-��+�$�ƵJ��[r>�_�p�Ɯ+��߸�6nٜL'~���ugv=��1ٴd�/Ęy�WtF��2�*��y��K@-���"򫥗1/�i�[���1�b��۴��5R=}:�,8���T}��erzO���I���
���~�8����*4��u��X4qѹ�N��H�#D�e��E4dx��~BsK3�x��~���_0Q,�(�(���|��!�z�t�6zS�)P�bE�áH��5U̼��V��x��l��]S��̽M[/8a�B\���c �Dޥ#���W_é�-`�w�O�W#�R�%��	���0�<����#q����%���k�:u�{-��RR;{JDuV�ɫ��aۅ�;��Jވ���/dj$y��>�|(�X�y+�AAU���i���;{n�#��M���ڵ��BP��%�GU��#j��0gx���y��g�|I1���� �5J4PB�AT�(B.���^�~�Ɩŋ���[�#z��߸i�{'��"1��֠�OW�!���Emڲ�������x�Sb�b(-%Y�D��x��Q!���M28�"�U�U�����@ߨ��<��1O�TYLeUy�=�>�lేI�j�q��Z_��g�;�8҂�/YQͺH.��[��<��}m�?�Q;Noz�/nj��M�'��0��+]YJϘIa"�@����F��B�
�t�PQZFƒ�[��\3����ϰ�����<����p ���������#�k/<qWei�_9V8��GŘoolf„
�+ƒ2D�o���yu�1��<�i��ΛI�[־ͩg�q�p?���h~g/�WRV����SV:�-��1g�FԁH4�{`�Kb512�;���1q2Y��;d��*�ݺ��M9�Z�m��ݒ�>��q52җ~��YT'Aa���m$�2-�D$He��j���u�K(��f��gO{7�%T	�d^A����GR%{)�P�i�i�E$�IRa�ζ�}�᳧M"=�Ck�nfn�4���Ě1��Ùo�g�|x��7^��O�2m[�����oÉ�@�!�l�q��Ic2*����8�8>���\���3�I����mni�+H��|�u@nԮUZ��~��λW{۶�Q� "֠F��@���W�sR�}4UPE��/\�S�Yz:P��jy�o���+J�)A9����t{�3�b�Wf��[�����ǓUz�'���W6��_��tn޾�(�T��D�iŵKe�����b�$J��;o��3�����)�ac��8���{��S
`GU@yU�EM����
T�(n��G�	3������Ӿ}���ߡ/�so���Wt��xt������
���|m�4�zf��~TKhO�;?�x��Kb�#jԑh}^D_8O�\�l�)*���������V,�c6�#� G�D�f&�(����o�����-c{�~����w&p�xA����ܼ����T�|�7�⏏�>��U}��ӌ�c�,�<�@+�˧�ػ���w��}��_H�u5�V+����;q�=����ߒ���w�n�tk������$�����_5��>�Zvny�����&�+e�_�����)(I^���X���޾����'j}�8'�0���6��{�I��[�Ǫ���Z-:юb-�x�߃��'�r`ճ�v�z�%߻!�>q1�Q/>�tq�pٓL�g�o�3Bt:䍩����a�w��	��P?�%���2?7�(�fy_�&�0|ʧ�7)0S���IEND�B`�PK�X���d--sb_nation.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = 'Zotzo'
'''
http://www.stumptownfooty.com/
http://www.eightysixforever.com
http://www.sounderatheart.com
http://www.dailysoccerfix.com/

'''
from calibre.web.feeds.news import BasicNewsRecipe


class SBNation(BasicNewsRecipe):
    title = u'SBNation'
    __author__ = 'rylsfan'
    description = u"More than 290 individual communities, each offering high quality year-round coverage and conversation led by fans who are passionate."
    oldest_article = 3
    language = 'en'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='h2', attrs={'class': 'title'}), dict(
            name='div', attrs={'class': 'entry-body'})
    ]

    remove_tags_after = dict(
        name='div', attrs={'class': 'footline entry-actions'})
    remove_tags = [
        dict(name='div', attrs={'class': 'footline entry-actions'}),
        {'class': 'extend-divide'}
    ]
    # SBNation has 300 special blogs to choose from. These are just a couple!
    feeds = [
        (u'Daily Fix', u'http://www.dailysoccerfix.com/rss/'),
        (u"Stumptown Footy", u'http://www.stumptownfooty.com/rss/'),
        (u'Sounders', u'http://www.sounderatheart.com/rss/'),
        (u'Whitecaps', u'http://www.eightysixforever.com/rss/'),
    ]

    extra_css  =   """
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    p{font-family:Helvetica,sans-serif; display: block; text-align: left; text-decoration: none; text-indent: 0%;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                         """

    def preprocess_html(self, soup):
        return self.adeify_images(soup)

    def populate_article_metadata(self, article, soup, first):
        h2 = soup.find('h2')
        h2.replaceWith(h2.prettify() + '<p><em> By ' +
                       article.author + '</em></p>')
PK�X�K����schattenblick.png�PNG


IHDR  �gPLTE���.A-�IDATx^e�A
� ��\�5� ���Ϻ�����E��Q���[����g�	�;x�'CSi*'�b\j*�G�����M\T�~
<̉�*lK����nWۋ�Ĝ^��^��Ӏ�Gq��V+�(�t�z���/dr����IEND�B`�PK�Xƒ���schattenblick.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1345802300(BasicNewsRecipe):
    title = u'Online-Zeitung Schattenblick'
    language = 'de'
    __author__ = 'ThB'
    publisher = u'MA-Verlag'
    category = u'Nachrichten'
    oldest_article = 7
    max_articles_per_feed = 100
    cover_url = 'http://www.schattenblick.de/mobi/rss/cover.jpg'
    feeds = [(u'Schattenblick Tagesausgabe',
              u'http://www.schattenblick.de/mobi/rss/rss.xml')]
PK�X�.R�FFschongauer_nachrichten.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�P����schongauer_nachrichten.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Schongauer Nachrichten'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Schongau', u'http://www.merkur-online.de/lokales/schongau/rssfeed.rdf'),
    (u'Region Schongau', u'http://www.merkur-online.de/lokales/schongau/landkreis/rssfeed.rdf'),
    (u'Lechbruck', u'http://www.merkur-online.de/lokales/schongau/lechbruck/rssfeed.rdf'),
    (u'Steingaden', u'http://www.merkur-online.de/lokales/schongau/steingaden/rssfeed.rdf'),
    (u'Bernbeuren', u'http://www.merkur-online.de/lokales/schongau/bernbeuren/rssfeed.rdf'),
    (u'Altenstadt', u'http://www.merkur-online.de/lokales/schongau/altenstadt/rssfeed.rdf'),
    (u'Stadt Schongau', u'http://www.merkur-online.de/lokales/schongau/schongau/rssfeed.rdf'),
    (u'Peiting', u'http://www.merkur-online.de/lokales/schongau/peiting/rssfeed.rdf'),
    (u'Lechrain', u'http://www.merkur-online.de/lokales/schongau/lechrain/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/schongau/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X��]]schwarzerpfeil.png�PNG


IHDR00W���IDATx�՚�kO��m۶m۶�l۶m۶m�w�i2�2�nu��0�i����N��:]y�5���0�)��(^�vv+�r�7���S@#�ܗ\.��܏���P��,ypCfP�37M�9�c��G�����X#�~�|�l�[�;�7�x?�1ܖ�^;)�P\���%�Ʊ����G�*�-#xop��S�%����dx��Gt��o#�{�p>8�k=��Ā���u��k)`�3��Y��$��B�	�[�1"��_�����P��V�Z���|[ǿ����t5B8��*�7���
�Ƨ���F�kB
h@N��J�W�e�N ��������f.x[v�yt��$>��=J�!V��@��A�u�*�1`�ҽ�5y2�˔��J����9I]ex��t7S�S�w��}cK�g�w(�ZG�z/��Rj��#��`�
�]��cAE*�j.&�&�D�)�. �F"�q�	�(m�hXM��ʞ�D��-�l�]�KE7��$�(��}���c�_�+��0~�KL�k��/��.�Q�����o�.q�l��_����1��2e��<���|�?ȿY���L����!�u�$��"�<���v�j���*��NJ�[��Vp�C�Ww��v��i[�����a0�1xI��c�t2�p�3J�0tZ��v�7!��+��8p���^p��$�*�;�3ZC����q��m���׾�|���
����(AvGC|)��a8Z'xG��n%��
�����*�
�~��آt9O��R��@�3"���w��d�H�sk.�/p��6#����r����3�BhP���VQ�J9��V*�nu��܎G���C�%�8b�Q�#�.�m*0�o�)z���n���9?����x81 �b}::v]��΀o�X�~�,�K�|1q�s�d�!��I�~~w�.�7����m1��ze��c�6w��^h�Q�g��=C�h��}�� J�{���x�N�5�v��.�-��8�J���GFү��$
�}`�[�&�p����l��>�:�*��[$"W6o�C�jF��S���3#�f�w�].	��V�H�+�{�"#�P���c`��Y
�6��ˍx���z�w�!��1bs��}��yC����Y��)����Sɘ�Qz�n�ɬx�}�t�3�C�NM�E�Fv����N��{t0?,'�Z�(9���S����s�c���IEND�B`�PK�X��m}}schwarzerpfeil.recipe# -*- mode: python; -*-
__license__ = 'GPL v3'

'''
SchwarzerPfeil Calibre recipe.
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class Schwarzerpfeil(BasicNewsRecipe):
    title                 = 'SchwarzerPfeil'
    __author__            = 'tastytea'
    description           = 'Das partizipative Mag von und für die antiautoritäre Bewegung'
    publication_type      = 'magazine'
    language              = 'de'
    timefmt                = ' [%d. %B %Y]'
    max_articles_per_feed = 100
    oldest_article        = 30
    use_embedded_content  = True
    no_stylesheets        = True
    auto_cleanup          = False

    feeds = [
        ('Artikel', 'https://schwarzerpfeil.de/feed/'),
        ('Kommentare', 'https://schwarzerpfeil.de/comments/feed/')
    ]

    def get_cover_url(self):
        return "https://schwarzerpfeil.de/wp-content/uploads/2020/09/12-1.png"
PK�X��f��science_advances.png�PNG


IHDR  D���ePLTE�������������"�#�.� 3�%7�,>�-?�0B�������������������������햟�+�DT����4E�4F�~����-�
"��0A�#�2C�3D��$�6G�9J�<M�=N�?P�AQ�BR�&�IX�JZ�M\�O_�Uc�We�ao�dr�fs�ft�gt�hu�my�n{�|��(�*逋ꅏꅐꆑ댖덗쓝핞�혡�,���� �/�1��������1����������!����!4�#6�
!����������%8����&9�郎�	������':����);�*<��@IDATxڭ���a���m[�m�Jm��}���Kf��>Z2w�`�(i�3�DR����h�iG�DZ��/Y���ε���dڞஆ��/S.h�^�LM�����d�O4v��2݆�����e:$>i�PY��N��l=��%�l�2�z��r��Z,��;����j���c�ɟ�<����c^V?njjX�Վ�>MԀ}���&\ؔ�g��4��[V�!�1w�2��39��&�Q wVb4ezʷ~�h�ɸ��9E��u=^ K&�K���J����p�O�G�>IEND�B`�PK�X��		science_advances.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


def check_words(words):
    return lambda x: x and frozenset(words.split()).intersection(x.split())


class ScienceAdvances(BasicNewsRecipe):
    title = 'Science Advances'
    __author__ = 'Jose Ortiz'
    description = (
        'Science Advances is a peer-reviewed multidisciplinary open-access'
        ' scientific journal established in early 2015.  The journal\'s scope'
        ' includes all areas of science, including the life sciences, physical'
        ' sciences, social sciences, computer sciences, and environmental'
        ' sciences.'
    )
    language = 'en'
    encoding = 'UTF-8'
    max_articles_per_feed = 100
    publication_type = 'magazine'
    keep_only_tags = [dict(name='article', attrs={'class': check_words('primary')})]
    feeds = [
        (
            'Science Advances: Current Issue',
            'http://advances.sciencemag.org/rss/current.xml'
        ),
    ]

    def get_cover_url(self):
        soup = self.index_to_soup('http://advances.sciencemag.org/')
        img = soup.find(id='content-block').find(
            'img', attrs={'class': check_words('cover-img')}
        )
        return img['src']

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            if img['data-src'].endswith('medium.gif'):
                img['src'] = img['data-src'][:-10] + 'large.jpg'
                a = img.findParent(attrs={'href': True})
                if a is not None and a['href'].startswith(img['src']):
                    del a['href']
            else:
                img['src'] = img['data-src']
        return soup
PK�Xq���science_based_medicine.png�PNG


IHDR  V%(�IDATx�c��
������v�	�Ư�O��/^��z��U�_������/����\�QTx����"+�]��������������b˿�3�b�|<]\�<���|��8��]��o�߰���v�pOTG��<�)�7��+�/�\}� ��勬�����;x��rw�E	�nW_ϸ�0����^������wL~���ZH��u��{�����ԏ�=}:������f\����v�1���D��tw?_? ��	[l~J��q*�k����/6o¼�O�/����kz�`�0����W7_�	��1��^��8R������%y�Hrg�=��i�#�~̳��7�|Tp�k��1XS4X���j`b�%��0��3��~�{���W����S�"��l�	�E^�IEND�B`�PK�Xp;HU##science_based_medicine.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe


class SBM(BasicNewsRecipe):
    title = 'Science Based Medicine'
    __author__ = 'BuzzKill'
    description = 'Exploring issues and controversies in the relationship between science and medicine'
    oldest_article = 5
    max_articles_per_feed = 15
    no_stylesheets = True
    use_embedded_content = False
    auto_cleanup = True
    encoding = 'utf-8'
    publisher = 'SBM'
    category = 'science, sbm, ebm, blog, pseudoscience'
    language = 'en'

    lang = 'en'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    feeds = [(u'Science Based Medicine',
              u'http://www.sciencebasedmedicine.org/?feed=rss2')]
PK�X�^k���science_news.png�PNG


IHDR  D���dPLTE@����m�W�\�]�b�e�Y�n�"o�'p�+p�+r�Z�`�i�"n�T�]�"p�'o�n�_�n����n�"o�"j�g�k�W�f�'o�f�'r�i�m�2t�=t���Ҥ�ӥ�ӧ�Ԩ�խ��������������������\�������k������@r�k�i�L�k�+r�.p�.r�2p�2s�g�5t�5t�5u�5w�8w�;s�;x�i�N�\�_�D}�Lz�P��U�W��Y��\��]��_��_��e��i��j��k��m��o��o��p��u��w��x��}��~�‚�Â�Ƅ�ƅ�Ň�ŋ�Ȏ�ɐ�ˑ�ʑ�˒�ʒ�˒�̕�̕�͖�˗�͗�Μ�Ϝ�Ϡ�С�Ң�ң��e�j�k����c����J���ժ�ժ��m���ٲ�ٲ�ڳ�ڴ�ڴ��=x���ܹ�ܺ�ݻ�ݼ�޾��o�������������m�������������������������������������"m�"n����o��������������������������]���`��b�������������f�������������=z����f�_�C�!��IDATx^��C�d1ීk��lۯm۶m۶m۶�T碫�=�ޣ����IvR�_�YcQ��I&�LM��O*�ˈ���I��6��gַ�Rv�ԡ��,ES�vp�����.�mr@�_�vj���m��_!BTc1j{[2>qd5�+�*���&|E���'=6�@�;�fD�~�A�:�R��8!U5�YO4����FKPU��9��$P�U@9}�����`7��u�!/�^pO����B$H�9�1�xe
�ؠ��u��EB�:FVs6��M����%	�Dp�3Fw1h��f`��$+rn��?���m���U�X���n4C��ռ��D5�7�^� j���I�ێ�a�{!:ݎԺ �ߋ�+f�{�w��E��Q��S��cp�q_@����
�aux�>ɏL�w�be�P^�m�tt�N�"�YG��7y}h@�� a���'����?�R45��U�i�xC�?�7(s)_�hIEND�B`�PK�X�ir�

science_news.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
'''
sciencenews.org
'''

from calibre.web.feeds.news import BasicNewsRecipe, prefixed_classes
import re


class ScienceNewsIssue(BasicNewsRecipe):
    title = u'Science News'
    description = ("Science News is an award-winning bi-weekly newsmagazine covering the most important research"
                   " in all fields of science. This recipe downloads all the articles from the latest issue.")
    category = u'Science, Technology, News'
    publisher = u'Society for Science & the Public'
    language = 'en'
    no_stylesheets = True
    use_embedded_content = False
    auto_cleanup = False
    remove_attributes = ['height', 'width', 'style']
    ignore_duplicate_articles = {'url'}
    resolve_internal_links = True

    keep_only_tags = [
        dict(
            attrs={
                'class':
                lambda x: x and (
                    'single__content___' in x or 'header-default__title___' in x or
                    'header-default__deck___' in x or 'header-default__figure___' in
                    x
                )
            }
        )
    ]
    remove_tags = [
        dict(name=['svg', 'button']),
        dict(
            attrs={'class': lambda x: x and ('newsletter-signup__wrapper___' in x)}
        )
    ]

    def parse_index(self):

        index = self.index_to_soup('https://www.sciencenews.org/sn-magazine')
        a = index.find(**prefixed_classes('magazine-archive__issue-thumbnail___'))
        url = a['href']
        self.timefmt = ' [' + url.split('/')[-1] + ']'
        self.cover_url = a.img['src']

        # Get articles
        soup = self.index_to_soup(url)
        soup = soup.find('main', attrs={'id':'content'})
        re_article = re.compile("https://www.sciencenews.org/article/")
        stories = []
        past_urls = set()
        for sec in soup.find_all(href=re_article):

            article_url = sec["href"]
            article_title = sec.text.strip()

            # Ignore image URLs which do not have text title
            if article_title == "":
                continue

            # Ignore if link is a duplicate
            if article_url in past_urls:
                continue

            past_urls.add(article_url)
            self.log('\t', article_title, ' ', article_url)
            article_info = {
                "url": article_url,
                "title": article_title,
            }
            stories.append(article_info)

        index = [
            ("Articles", stories),
        ]
        return index
PK�X
IhbXXscience_news_recent_issues.png�PNG


IHDRb�xIDATx�eR�KSa~aQ�5��O��j@�=
H)�h&*&VQEA%aEA$3s宓{Y�YNinK�fAZ�*)u�ù����w����p�=�=��s�mv^J��)�|��D��85	�c+�1$�-J�F+�4SR�X
&�q���(�0Aa��j9��k�%N��O<�펼M�+�
�V̰MF~�[���u9�ܾ=7������䑮���/A0ʀ7����yV�D�ޠZ�Ñ6�K�6u��W�y��T݄1��j��<����D���4x�����T�W��_�����B���0:�z{�>�/Le(���C���5���-B'�H�[���Q���=4ÄX��g���ʎL�ٮ�dV����"8k�B���{+Z�y��O����p��kzb��<�G��d������uc��;���{t�s����|J��-���f�d����Α��@�%}߭���9ΨMSN@wGON/ֽ���h�]�O#?��"U�"�7cw;�F�R�qV$XE����0#k�*��	��
]���
�1�_���%IEND�B`�PK�XyZX���science_x.recipe'''
https://sciencex.com/
'''

from calibre.web.feeds.news import BasicNewsRecipe

class scix(BasicNewsRecipe):
    title = 'Science X'
    description = (
        'Science X is a network of high-quality websites that provides the most complete and comprehensive '
        'daily coverage of science, technology, and medical news. Articles from phys.org, medicalxpress.com'
        '& techxplore.com'
    )
    language = 'en'
    __author__ = 'unkn0wn'
    oldest_article = 1 # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    remove_attributes = ['height', 'width']
    ignore_duplicate_articles = {'url', 'title'}

    extra_css = '''
        #figure {text-align:center; font-size:small;}
        em, blockquote {color:#202020;}
        .article__info, .article-byline, .article-main__more, .d-print-block {font-size:small; color:#404040;}
    '''

    resolve_internal_links = True
    remove_empty_feeds = True

    keep_only_tags = [dict(name='article', attrs={'class':'news-article'})]

    feeds = [
            ('Tech Xplore', 'https://techxplore.com/rss-feed/'),
            ('Medical Xpress', 'https://medicalxpress.com/rss-feed/'),
            ('Phys.org', 'https://phys.org/rss-feed/')
            #https://medicalxpress.com/feeds/
            #https://techxplore.com/feeds/
        ]

    def preprocess_html(self, soup):
        for figure in soup.findAll('figure'):
            figure['id'] = 'figure'
        return soup
PK�X>��22sciencedaily.png�PNG


IHDR(-SfPLTEf		kot$$|''}**00�99�;;�HH�QQ�ZZ�cc�ii�oo�rr�~~������������Ģ�Ǩ�˷�Խ�����������������������\��IDATx�	V�0�)��� 4R��_����z$}�<��f��~P���Z�z=�s��]`X��=S}�\���)<R��Ĕ�}G�ɘ�h�e�O�$���S(߽�a��)��Y3X���l�I��Pk���\6��X�IEND�B`�PK�X�x۾��sciencedaily.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008-2017, Darko Miletic <darko.miletic at gmail.com>'
'''
sciencedaily.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ScienceDaily(BasicNewsRecipe):
    title = u'ScienceDaily'
    __author__ = u'Darko Miletic'
    title                 = 'ScienceDaily'
    description           = ('ScienceDaily is one of the Internet\'s most popular '
                             'science news web sites. Since starting in 1995, the '
                             'award-winning site has earned the loyalty of students, '
                             'researchers, healthcare professionals, government '
                             'agencies, educators and the general public around the '
                             'world. Now with more than 6 million monthly visitors '
                             'worldwide, ScienceDaily generates nearly 20 million '
                             'page views a month and is steadily growing in its '
                             'global audience.')
    category              = 'medicin, healthcare'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'en'
    encoding              = 'utf-8'

    # Feed are found here: https://www.sciencedaily.com/newsfeeds.htm
    feeds = [
        ('Latest Science News', 'https://www.sciencedaily.com/rss/top.xml'),
        ('All Top News', 'https://www.sciencedaily.com/rss/top/science.xml'),
        ('Health News', 'https://www.sciencedaily.com/rss/top/health.xml'),
        ('Technology News', 'https://www.sciencedaily.com/rss/top/technology.xml'),
        ('Environment News', 'https://www.sciencedaily.com/rss/top/environment.xml'),
        ('Society News', 'https://www.sciencedaily.com/rss/top/society.xml'),
        ('Strange &amp; Offbeat News', 'https://www.sciencedaily.com/rss/strange_offbeat.xml'),
    ]
PK�X@S-��scientific_american.png�PNG


IHDR  V%(sRGB���wIDAT8�c�O0'��L�����P��(
�uF}�G[����P���`��	0���:��M)�uH
��I��pj�B�I�$_$�AtB���())�I���T�'��!N�-%)9�
gIIIݶ[�`�����!9r�$H�(�>�D �!B��I��q��]iIɉH�w�DE6Ȍ�����KJ:�C�bdA*���~2�?MRR�2L��+`��*Iɾ���Nܴi�t��f����Po�������xIJ���)�z�_�d��3��Y@#��H�Q$y�'`�3�?J`
$�?CL����8PRR�;T���� �U�O�õ*��c5D������2�e���S22��
ߘU����=�� J��)tM��ʞIEND�B`�PK�X�~P"scientific_american.recipe#!/usr/bin/env python
__license__ = "GPL v3"

import json
from datetime import datetime
from os.path import splitext
from urllib.parse import urljoin

from calibre.web.feeds.news import BasicNewsRecipe, prefixed_classes


class ScientificAmerican(BasicNewsRecipe):
    title = "Scientific American"
    description = "Popular Science. Monthly magazine. Should be downloaded around the middle of each month."
    category = "science"
    __author__ = "Kovid Goyal"
    no_stylesheets = True
    language = "en"
    publisher = "Nature Publishing Group"
    remove_empty_feeds = True
    remove_javascript = True
    timefmt = " [%B %Y]"
    remove_attributes = ["height", "width"]
    masthead_url = (
        "https://static.scientificamerican.com/sciam/assets/Image/newsletter/salogo.png"
    )
    extra_css = """
        [class^="article_dek-"] { font-style:italic; color:#202020; }
        [class^="article_authors-"] {font-size:small; color:#202020; }
        [class^="article__image-"] { font-size:small; text-align:center; }
        [class^="lead_image-"] { font-size:small; text-align:center; }
        [class^="bio-"] { font-size:small; color:#404040; }
        em { color:#202020; }
    """

    needs_subscription = "optional"

    keep_only_tags = [
        prefixed_classes(
            'article_hed- article_dek- article_authors- lead_image- article__content- bio-'
        ),
    ]
    remove_tags = [
        dict(name=['button', 'svg', 'iframe', 'source'])
    ]

    def preprocess_html(self, soup):
        for fig in soup.findAll('figcaption'):
            for p in fig.findAll('p'):
                p.name = 'span'
        return soup

    def get_browser(self, *args):
        br = BasicNewsRecipe.get_browser(self)
        if self.username and self.password:
            br.open("https://www.scientificamerican.com/account/login/")
            br.select_form(predicate=lambda f: f.attrs.get("id") == "login")
            br["emailAddress"] = self.username
            br["password"] = self.password
            br.submit()
        return br

    def parse_index(self):
        # Get the cover, date and issue URL
        fp_soup = self.index_to_soup("https://www.scientificamerican.com")
        curr_issue_link = fp_soup.find(**prefixed_classes('latest_issue_links-'))
        if not curr_issue_link:
            self.abort_recipe_processing("Unable to find issue link")
        issue_url = 'https://www.scientificamerican.com' + curr_issue_link.a["href"]
        soup = self.index_to_soup(issue_url)
        script = soup.find("script", id="__NEXT_DATA__")
        if not script:
            self.abort_recipe_processing("Unable to find script")

        issue_info = (
            json.loads(script.contents[0])
            .get("props", {})
            .get("pageProps", {})
            .get("issue", {})
        )
        if not issue_info:
            self.abort_recipe_processing("Unable to find issue info")

        image_id, ext = splitext(issue_info["image"])
        self.cover_url = f"https://static.scientificamerican.com/sciam/cache/file/{image_id}_source{ext}?w=800"

        edition_date = datetime.strptime(issue_info["issue_date"], "%Y-%m-%d")
        self.timefmt = f" [{edition_date:%B %Y}]"

        feeds = {}
        for section in ("featured", "departments"):
            for article in issue_info.get("article_previews", {}).get(section, []):
                self.log('\t', article["title"])
                if section == "featured":
                    feed_name = "Features"
                else:
                    feed_name = article["category"]
                if feed_name not in feeds:
                    feeds[feed_name] = []
                feeds[feed_name].append(
                    {
                        "title": article["title"],
                        "url": urljoin(
                            "https://www.scientificamerican.com/article/",
                            article["slug"],
                        ),
                        "description": article["summary"],
                    }
                )

        return feeds.items()
PK�X",N���scinexx.png�PNG


IHDR(-S<PLTEunf�~w������������¿����������q����9��U��r����Ъ�������1�pIDATx�\MA��V��ٍ��4?X+饺?M���Z(�G�d˝��7b$s� �J��0�,!��E��!�]�8=D�<�n��a�D�0na��2l�C��N�<)IEND�B`�PK�X�Xc��scinexx.recipe##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds scinexx.de
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1415718806(BasicNewsRecipe):
    title = u'Scinexx.de'
    __author__ = 'JSuer'
    description = u'German  online portal of scinexx'
    publisher = 'MMCD NEW MEDIA GmbH'
    category = 'science and next generation, Germany'
    language = 'de'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Neueste Nachrichten', u'http://feeds.feedburner.com/scinexx')]
PK�X�G99scmp.png�PNG


IHDR  szz�IDATx��T�tG�ضm۶m��9ƶm۶sg��;]�����f�{zz�c�_�݋M0���5�P����[e�W���=ܫ���A�ba�o�M0�2��`n��ܔ��1>]~�uk�Ma���~&����ϞA?G�	����n�-P6%�؟ay,�'�qB���r3���(q[�g]jh���ޞ�?a[�If:a�3)ҩ3��0���:��gVfb�A�k�\���c,`C�k��b���{�5�ׇ��s��]9ש�0�O��
:8�N~���Oa�A�yק�8�"�<�T�u��sX�(D��-Ib��X�&���`7���vy2��[0���1,���V��j[����`�y՟x�f8�}���8��­X���>���Mv�\����Es�02�����A%ގ�c�:
;�ػ|��؃e�g��x"������.Y�Lm,�Ա�o3~�o�q�{c���l|u]C��b	v�3	�Ua7�S��C-��j,XQ�=��P��h�Q,{kNc���8���e��_���$�h��l�y+�qۏ��b~��g�c�ŎA�/VzIj��x'ց��=X�dM 6�Tp�|S�J琊�|7}W�睞HCf�˔�ߓ3=�,R$\��vT�h;Z���ȍ�<EGF�W�8��� �
�G9׸�s��g,O"��|P���"p˷�0sW����6��/���8�U@>z1܆��,~�C��Xk12��N��x#��$^pZ��}1�����wD0׵!i�pU��f��'���_ƞt�����M���:�Pb�M*�%C��	椬[q�G���!/f�h�]���{��kq�;E,[s0���I������4c�;v�����+��;���<��;�ј!�hly�b�/�{}x�́��������t��ţ��7H�I6��o�`��,�c2�]3<���4���9��7_̧Y��hv�!Id+0T^8�-\$IEND�B`�PK�XP�t]#]#scmp.recipe"""
scmp.com
"""

import json
import re
from datetime import datetime, timedelta, timezone

from calibre.ebooks.BeautifulSoup import BeautifulSoup
from calibre.web.feeds.news import BasicNewsRecipe, classes


class SCMP(BasicNewsRecipe):
    title = "South China Morning Post"
    __author__ = "llam"
    description = "SCMP.com, Hong Kong's premier online English daily provides exclusive up-to-date news, audio video news, podcasts, RSS Feeds, Blogs, breaking news, top stories, award winning news and analysis on Hong Kong and China."  # noqa
    publisher = "South China Morning Post Publishers Ltd."
    oldest_article = 1
    max_articles_per_feed = 25
    no_stylesheets = True
    remove_javascript = True
    encoding = "utf-8"
    use_embedded_content = False
    language = "en"
    remove_empty_feeds = True
    publication_type = "newspaper"
    auto_cleanup = False
    compress_news_images = True
    ignore_duplicate_articles = {"title", "url"}

    # used when unable to extract article from <script>, particularly in the Sports section
    remove_tags = [
        dict(
            classes(
                "sticky-wrap relative social-media social-media--extended__shares"
                " article-body-comment scmp_button_comment_wrapper social-media--extended__in-site"
                " footer scmp-advert-tile sidebar-col related-article share-widget"
            )
        ),
        dict(attrs={"addthis_title": True}),
        dict(name=["script", "style"]),
    ]
    remove_attributes = ["style", "font"]

    extra_css = """
    .headline { font-size: 1.8rem; margin-bottom: 0.4rem; }
    .sub-headline { font-size: 1rem; margin-bottom: 1.5rem; }
    .sub-headline ul { padding-left: 1rem; }
    .sub-headline ul li { fmargin-bottom: 0.8rem; }
    .article-meta, .article-header__publish { padding-bottom: 0.5rem; }
    .article-meta .author { text-transform: uppercase; font-weight: bold; }
    .article-meta .published-dt { margin-left: 0.5rem; }
    .article-img { margin-bottom: 0.8rem; max-width: 100%; }
    .article-img img, .carousel__slide img {
        display: block; margin-bottom: 0.3rem; max-width: 100%; height: auto;
        box-sizing: border-box; }
    .article-img .caption, .article-caption { font-size: 0.8rem; }
    """

    # https://www.scmp.com/rss
    feeds = [
        ("Hong Kong", "https://www.scmp.com/rss/2/feed"),
        ("China", "https://www.scmp.com/rss/4/feed"),
        ("Asia", "https://www.scmp.com/rss/3/feed"),
        ("World", "https://www.scmp.com/rss/5/feed"),
        ("Business", "https://www.scmp.com/rss/92/feed"),
        ("Tech", "https://www.scmp.com/rss/36/feed"),
        ("Life", "https://www.scmp.com/rss/94/feed"),
        ("Culture", "https://www.scmp.com/rss/322296/feed"),
        ("Sport", "https://www.scmp.com/rss/95/feed"),
        ("Post Mag", "https://www.scmp.com/rss/71/feed"),
        ("Style", "https://www.scmp.com/rss/72/feed"),
    ]

    masthead_url = 'https://upload.wikimedia.org/wikipedia/commons/c/c3/SCMP_logo.svg'

    def get_cover_url(self):
        from datetime import date
        cover = 'https://img.kiosko.net/' + str(
            date.today().year
        ) + '/' + date.today().strftime('%m') + '/' + date.today(
        ).strftime('%d') + '/cn/scmp.750.jpg'
        br = BasicNewsRecipe.get_browser(self, verify_ssl_certificates=False)
        try:
            br.open(cover)
        except:
            index = 'https://es.kiosko.net/cn/np/scmp.html'
            soup = self.index_to_soup(index)
            for image in soup.findAll('img', src=True):
                if image['src'].endswith('750.jpg'):
                    return 'https:' + image['src']
            self.log("\nCover unavailable")
            cover = None
        return cover

    def _extract_child_nodes(self, children, ele, soup, level=1):
        if not children:
            return

        child_html = ""
        for child in children:
            if child.get("type", "") == "text":
                child_html += child["data"]
            else:
                if child["type"] == "iframe":
                    # change iframe to <span> with the src linked
                    new_ele = soup.new_tag("span")
                    new_ele["class"] = f'embed-{child["type"]}'
                    iframe_src = child.get("attribs", {}).get("src")
                    a_tag = soup.new_tag("a")
                    a_tag["href"] = iframe_src
                    a_tag.string = f"[Embed: {iframe_src}]"
                    new_ele.append(a_tag)
                else:
                    new_ele = soup.new_tag(child["type"])
                    for k, v in child.get("attribs", {}).items():
                        if k.startswith("data-"):
                            continue
                        new_ele[k] = v
                    if child.get("children"):
                        self._extract_child_nodes(
                            child["children"], new_ele, soup, level + 1
                        )
                child_html += str(new_ele)
                if child["type"] == "img":
                    # generate a caption <span> tag for <img>
                    caption_text = child.get("attribs", {}).get("alt") or child.get(
                        "attribs", {}
                    ).get("title")
                    if caption_text:
                        new_ele = soup.new_tag("span")
                        new_ele.append(caption_text)
                        new_ele["class"] = "caption"
                        child_html += str(new_ele)
                    ele["class"] = "article-img"
        ele.append(BeautifulSoup(child_html))

    def preprocess_raw_html(self, raw_html, url):
        article = None
        soup = BeautifulSoup(raw_html)

        for script in soup.find_all("script"):
            if not script.contents:
                continue
            if not script.contents[0].startswith("window.__APOLLO_STATE__"):
                continue
            article_js = re.sub(
                r"window.__APOLLO_STATE__\s*=\s*", "", script.contents[0].strip()
            )
            if article_js.endswith(";"):
                article_js = article_js[:-1]
            try:
                article = json.loads(article_js)
                break
            except json.JSONDecodeError:
                self.log.exception("Unable to parse __APOLLO_STATE__")

        if not (article and article.get("contentService")):
            # Sometimes the page does not have article content in the <script>
            # particularly in the Sports section, so we fallback to
            # raw_html and rely on remove_tags to clean it up
            self.log(f"Unable to find article from script in {url}")
            return raw_html

        content_service = article.get("contentService")
        content_node_id = None
        for k, v in content_service["ROOT_QUERY"].items():
            if not k.startswith("content"):
                continue
            content_node_id = v["id"]
            break
        content = content_service.get(content_node_id)

        if content.get("sponsorType"):
            # skip sponsored articles
            self.abort_article(f"Sponsored article: {url}")

        body = None
        for k, v in content.items():
            if (not k.startswith("body(")) or v.get("type", "") != "json":
                continue
            body = v

        authors = [content_service[a["id"]]["name"] for a in content["authors"]]
        date_published = datetime.fromtimestamp(
            content["publishedDate"] / 1000, timezone.utc)
        date_published_loc = date_published.astimezone(
            timezone(offset=timedelta(hours=8))  # HK time
        )
        try:
            df = date_published_loc.strftime('%-I:%M%p, %-d %b, %Y')
        except Exception:
            df = ''

        html_output = f"""<html><head><title>{content["headline"]}</title></head>
        <body>
            <article>
            <h1 class="headline">{content["headline"]}</h1>
            <div class="sub-headline"></div>
            <div class="article-meta">
                <span class="author">{", ".join(authors)}</span>
                <span class="published-dt">{df}</span>
            </div>
            </article>
        </body></html>
        """

        new_soup = BeautifulSoup(html_output, "html.parser")
        # sub headline
        for c in content.get("subHeadline", {}).get("json", []):
            ele = new_soup.new_tag(c["type"])
            self._extract_child_nodes(c.get("children", []), ele, new_soup)
            new_soup.find(class_="sub-headline").append(ele)

        # article content
        for node in body["json"]:
            if node["type"] not in ["p", "div"]:
                continue
            new_ele = new_soup.new_tag(node["type"])
            new_ele.string = ""
            if node.get("children"):
                self._extract_child_nodes(node["children"], new_ele, new_soup)
            new_soup.article.append(new_ele)

        return str(new_soup)
PK�X�	C��scott_hanselman.png�PNG


IHDR��h6�IDATx�-R�OA�ٝ���v��Җ�/Jkl�� ���̓^<{���c�h�H�$	J)վ(���m�5΂�yd�7�}��ȶZ���ϟ��/�� `4vxȭ�����w`-��Ө�z��ED�X@r����/_�*�EE]��0$B(��Q��\1�J&8���:N��9�M��sB�!�>M���J4"G5U��D'�D���6��v�Rٮ���	]����ʢ au AK����j��y�O��!�*�=sp!I��ư�B
l���y��͕5
d	mn|:m�X�6����ñ=<���:qݱeZ�r9��0�*Q�!FB_\\�7��V]xأ�#eH��`yi��nn�/)��U}>��wZ���\�9B�"�i29Aϴ�e����ID<o[�=�Si��8�H7�{�邈@(���D�MȊ֮����4}ʱ�3�b�A�7�/N�.�K(���t�q\=�UU���
"�7빙��-$��{b��u|X���:�l.�2�%�� ��V3�(A\��(n��eYpg��^�3i=�,��y��0��l�~���<~�4��R
��K'��S?QEB���eYս���(;�{�ޮw;-U����RF"J%��1��G�l._(���y�ѴFT���?k,7G*�IEND�B`�PK�X*�S��scott_hanselman.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.hanselman.com/blog/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ScottHanselman(BasicNewsRecipe):
    title = "Scott Hanselman's Computer Zen"
    __author__ = 'Darko Miletic'
    description = "Scott Hanselman's Thoughts on Programming, Technology, Fatherhood, and Life"
    category = "Scott, Computer, Zen, .NET, C#, Hanselman, Scott, Weblog, Diabetes, Portland, Zimbabwe, ComputerZen.com - Scott Hanselman's Musings"
    publisher = 'Scott Hanselman'
    author = 'Scott Hanselman'
    language = 'en'

    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = True
    encoding = 'utf-8'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher, '--author', author
    ]

    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + \
        description + '"\ntags="' + category + '"\nauthors="' + author + '"'

    remove_tags = [
        dict(name=['object', 'link']), dict(
            name='div', attrs={'class': 'feedflare'})
    ]

    feeds = [(u'Articles', u'http://feeds2.feedburner.com/ScottHanselman')]
PK�X*<з�scprint.png�PNG


IHDR  D����PLTEPUD"=vv{JR"\"'"'"'P����x������������"�"���"�"�"�"�"�"�"�"�'�"�"�'�'�'�"�"�'�"�'�'�'�'�'�"�"�'�'�'�'�'�'�'�'�'�'�'�'�'�'��'�'�"+�'.�+2�'�'�.5�'�'��+2�'.�'�'�"+�'�'.�.5�'�'��'�'��'�+2������"+�'.����'�.5�'�+2�'�'�'�'�'�'�'�����'�����{}�PT������im�"+�28��������FH����UY�'������+2�tv�������HL�������"+�WZ�WY�"'�RU����������������������BF�"'����NR�"���=D��be�~��������8=�@D��TW�������"�uw�Z]����������eg�vx��JN��cf�������ps�|}�.2�]b����������������������{|���������DF�DH�����������"��.5�xz����� ��vtRNS	

"%'),:BNQZ[\hhhkkw��������������������������������������������������������q���IDATx�m�x%IF�i�DZbgm�ڱ�[�g;���m۶mkn�:�>�W.2�f�vd�FF�c��
d�
��/Ѳ�Ȧ���8�#H�D6l^T�F=�<(���D��E����֦����!��z�y�ku��y�����e�4ey��W�gr����װDZ��g�E��W�����)��_d�(�b���p��8�NF$�d?c)�^9��K��ƅ\�֓w�Zj���D�x*���aF��`����k��ks���
8�QB_�n�7�|�(����0W1O|<����s��>��Js��Z�X�i����<b~���L�2.��S��z9�Qj�>�q&��_��)m5�"'��Qo%G�sE&n�w?�~�-�$L�k?�V���\���9�߶p#�֓UP�b�Xo�u����f�S�a@~�-Wث��1σn�
؎�o%;�av) ��f�7�Q�e�Y�u�zI6�	�=�zE�)��U�gE�ɨד��<��Q���;F}���֞��o��=�e���Z�i�L����/}�(�o=f�4��`���d�����Q,Bud˅�����7����h�x�ŏ�–#UX���N7Q� .N�B���QI`91�/5�+�8���cQLc q�ּ�5+�Zkv�&s���z-uy��Hn^�����yѨ)iN��9+�Rj͒��L:���s��:��$墍%!7�	Y�صK���AN�"�n�D�]+#����B�}�#�IEND�B`�PK�XHwl��scprint.recipefrom calibre.web.feeds.news import BasicNewsRecipe, LoginFailed


class SCPrintMagazine(BasicNewsRecipe):
    title = u'SC Print Magazine'
    __author__ = u'Tony Maro'
    description = u'Last print version of the data security magazine'
    INDEX = "http://www.scmagazineus.com/issuearchive/"
    no_stylesheets = True
    language = 'en'
    keep_only_tags = [dict(id=['article', 'review'])]
    remove_tags = [dict(id=['articlePrintTools', 'reviewBodyColumn'])]
    LOG_IN = 'http://www.scmagazineus.com/login/'
    tags = 'News,SC Magazine'
    needs_subscription = True

    def parse_index(self):
        articles = []
        issuelink = printsections = None

        soup = self.index_to_soup(self.INDEX)
        sectit = soup.find('div', attrs={'class': 'issueArchiveItem'})
        if sectit is not None:
            linkt = sectit.find('a')
            issuelink = linkt['href']
            imgt = sectit.find('img')
            self.cover_url = imgt['src']

        if issuelink is not None:
            issue = self.index_to_soup(issuelink)
            if issue is not None:
                printsections = issue.findAll(
                    'div', attrs={'class': 'PrintSection'})
        if printsections is not None:
            for printsection in printsections:
                onesection = []
                sectiontitle = printsection.find('h3').contents[0]
                articlesec = printsection.findAll(
                    'div', attrs={'class': 'IssueArchiveFormat'})
                if articlesec is not None:
                    ''' got articles '''
                    for onearticle in articlesec:
                        ''' process one article '''
                        arttitlet = onearticle.find('h3')
                        if arttitlet is not None:
                            mylink = arttitlet.find('a')
                            if mylink is not None:
                                if mylink.get('title'):
                                    arttitle = mylink['title']
                                else:
                                    arttitle = 'unknown'
                                if mylink.get('href'):
                                    artlink = mylink['href']
                                    artlink = artlink.replace(
                                        "/article", "/printarticle")
                                    artlink = artlink.replace(
                                        "/review", "/printreview")
                                    deck = onearticle.find(
                                        'div', attrs={'class': 'deck'})
                                    if deck is not None:
                                        deck = deck.contents[0]
                                        onesection.append(
                                            {'title': arttitle, 'url': artlink, 'description': deck, 'date': ''})
                    articles.append((sectiontitle, onesection))

        return articles

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open(self.LOG_IN)
        br.select_form(name='aspnetForm')
        br['ctl00$ctl00$cphAllPageContent$cphMainContent$SubscriberEasyLoginView1$txtEmail'] = self.username
        br['ctl00$ctl00$cphAllPageContent$cphMainContent$SubscriberEasyLoginView1$txtPassword'] = self.password
        raw = br.submit(
            "ctl00$ctl00$cphAllPageContent$cphMainContent$SubscriberEasyLoginView1$btnLogin").read()
        if 'Logout</a>' not in raw:
            raise LoginFailed(
                _('Failed to log in, check your username and password for'
                  ' the calibre Periodicals service.'))
        return br
PK�X�Cme**
scroll.png�PNG


IHDR(-SfPLTE�b+����a*�a)�]!�^$�R�Y�V	�V�f-�]�U���������~�Ƶ�������k6����a!��t�V�����j����H����˽�xI�a���ӬnwIDAT�}���0�N������d+��C�`i������=����S��*��x�;��\���s)��\ZCI�ϸ��]������d�`M�ȿ0ri�oU�>��}��5a�n�a&SAǯj�'�y�[QIEND�B`�PK�X����;	;	
scroll.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from calibre.ptempfile import PersistentTemporaryFile

class scroll(BasicNewsRecipe):
    title = 'Scroll.in'
    __author__ = 'unkn0wn'
    description = (
        'The leading destination for original reporting on news, politics, and culture in India. '
        'Our award-winning team of journalists brings readers insightful analysis and opinion on the day’s '
        'headlines alongside a fresh mix of features on music, books, and cinema.'
    )
    language = 'en_IN'
    masthead_url = 'https://scroll.in/static/assets/scroll-logo.0f68c78dd023e2598248ea107feba562.003.svg'

    no_stylesheets = True
    remove_javascript = True

    ignore_duplicate_articles = {'title', 'url'}
    remove_attributes = ['style', 'height', 'width']

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/announcements/'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    extra_css = '''
        .orange-tag, .article-meta-container { font-size:small; }
        .featured-image, .cms-block-image { text-align:center; font-size:small; }
    '''

    keep_only_tags = [
        dict(name = 'header'),
        classes('featured-image article-body')
    ]

    remove_tags = [classes('comments-entry-point-meta')]

    feeds = [('Articles', 'https://news.google.com/rss/search?q=when:27h+allinurl:https%3A%2F%2Fscroll.in&hl=en-IN&gl=IN&ceid=IN:en')]

    def populate_article_metadata(self, article, soup, first):
        # article.url = ''
        article.summary = self.tag_to_string(soup.find('h2'))
        article.text_summary = self.tag_to_string(soup.find('h2'))
        article.title = article.title.replace(' - Scroll.in', '')
PK�X2��;;seanhannity.png�PNG


IHDR  D���4PLTE<;n<<n�#5�#4�F^�E^�#4�#5<;n<;n<;n;;oJ8g�&;�#4�#4�#4�#4<;n;:m;:m<;n<;n;:m;;nJ8g�#8� 1� 1� 1�0�+<;n<;n�|�Ѕ�υ�τ�Ӓ����<;n:9m������<;n�[g<;n�<O�<J�<K�<K�<K������������ȟ�ܮ�ۭ�ۭ��&;�#4�$5�$5Ž�֚�ՙ�ՙ�ՙ�������������:9l�HZ�JX�JX�JX__�_^�__�__�k\��M^��������������Я+�0JIxNM{<;n?>qTS�@?qMLzKJy;:nA@rSS>=pMDr΃�vu����98l���ON|87k���|{����GFvQP}���������DCtHGwhg�VU�ji�lk�RQ~=<oL?m�Xh�\h�[h>=o���cb�^]�?>p���YX�;:m;;nK;jzy����ML{uu�qp����EDuPN{���\[�fe�rq�`_�AArOHvۭ�:9l���54icc�������76jJ8g�$5PO}VV�SR]\�MM{UT�]\�NFt:9mts�����������PO|���::mJ;j�JX__����'�XE\tRNS6??????6B���������A*�����'v��s��������������������������������������������'@��\ZIDAT�1kSQ��w�����@����h���PA��NEg�����c6���%����8I�5���cRɅ��}���0���LE�(�h��y��Gހf�y��X�A�D�[�]МA��P�h�e�ZвD��ҷ�_.0�4�35�٧�:��9�yR���牴��T�
���p�[��D]����o����^��`�\��}�2��C�+y�&�¡�u:���iʧ%O�����V;n���~�4��Z�x�6EҎ���$Ub��[�#�ƨj����c�,�6�-�6̹����{�㴸��+�����;9��t���[-l����?�N���{0U�4IEND�B`�PK�X�ŀ<��seanhannity.recipe#!/usr/bin/env python

from calibre.web.feeds.recipes import BasicNewsRecipe


class SeanHannity(BasicNewsRecipe):
    cover_url = 'http://www.hannity.com/images/misc_logo.gif'
    title = u"Sean Hannity Show"
    __author__ = 'Rob Lammert - rob.lammert[at]gmail.com'
    description = u"Articles from Sean Hannity's website, www.hannity.com"
    oldest_article = 7.0
    language = 'en'
    max_articles_per_feed = 100
    recursions = 0
    encoding = 'utf8'
    no_stylesheets = True
    remove_javascript = True

    remove_tags = [
        dict(name='div', attrs={'id': [
             'header', 'navsprite', 'topminibarad', 'headline_bar', 'shadow', 'footer']}),
        dict(name='div', attrs={'class': 'rightcolumn'}),
        dict(name='table', attrs={'id': 'audiobox'}),
        dict(name='a', attrs={'title': ['Home', 'Shows', 'Guests', 'Photos']}),
        dict(name='iframe')
    ]

    feeds = [
        ('Content Feed', u'http://feeds.feedburner.com/TheSeanHannityShow-AllContent?format=xml')
    ]

PK�X�+)33seattle_times.png�PNG


IHDR(-STPLTE������{��Zu�Pl�Ol���Ȝ�����p�������겿�Lg�9Lg4D]e~����Lg�������by�[u����q�����Y��tRNS@��f�IDATx�e�Ub1�/��x�{V.'��yFm[����7=��x'��g��8b��V�1`�'�w>�y��@��0��^8�(�t"�݁�|�~�7D�i�T�s�NN�0v�h���]"��zzqH�/�!'�M��a��	j�}MIEND�B`�PK�X��%��seattle_times.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
seattletimes.nwsource.com
'''

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 SeattleTimes(BasicNewsRecipe):

    title = 'The Seattle Times'
    __author__ = 'Kovid Goyal'
    description = 'News from Seattle and USA'
    publisher = 'The Seattle Times'
    category = 'news, politics, USA'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'

    keep_only_tags = [
        classes('article-header featured-media article-body')
    ]
    remove_tags = [
        classes('most-read-container native-ad-article ad-container user-messaging')
    ]

    feeds = [
        (u'Local News',
         u'https://www.seattletimes.com/seattle-news/feed/'),
        (u'Nation & World',
         u'https://www.seattletimes.com/nation-world/feed/'),
        (u'Business',
         u'https://www.seattletimes.com/business/feed/'),
        (u'Sports',
         u'https://www.seattletimes.com/sports/feed/'),
        (u'Entertainment',
         u'https://www.seattletimes.com/entertainment/feed/'),
        (u'Life',
         u'https://www.seattletimes.com/life/feed/'),
        (u'Opinion',
         u'https://www.seattletimes.com/opinion/feed/'),
        (u'Photo and Video',
         u'https://www.seattletimes.com/photo-video/feed/'),
    ]

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based')
PK�XY���security_watch.png�PNG


IHDR00W���IDATxڭ�T\��	�l�ݳO�����=�.�&H<�
������;�X��I_�C�^��9���[��D�J�AvE�q���3ߜˆ׏%�kG��ݓ���U18�V��i�O��h�T��$����m2�$!���#��R���[-���T�b.W�'!D��Ҷ���q�9a#j�?y�DJ�ѧ�`�I�]�����L�:��U��+g!D��;㫨��R?ԇC�T�!B��/��"�������I�B�=����o��,����ܟ"��S*`"�i��g���T+��|v-רg�!pS��!B�9M��H�e5X!�Q~���I��@[��Ef/�G8G�]�}1�,��$aa`�9����]@�W��p�ߥ !����lB4�f>%��3�$�.;f�_d��"X�;�a厸�	�a4,��,�=���ሸ�x��g�:O���¡0�P-���j��#�a�FT^fe�����3��3y�ЍjC�edžq�Ը�v��\(�)Wzߨ����3�R�Z�@GMsߪџ��V�o���v7���F4�Ӿɻ�±�!�_[3�4pϮ��g��_��68ع��R���n��W��k/�����pt�)�.�=z�@�;��6�P�GH���]�L���\YZIۇ�x�dJ?k�����;�k�[?�@e�1r<)�E#>�y�_����q��$~n��Wc�\��oOn��$�������<x���_
�pAǢ_�����H�Rq[��뜍5;�8�YY�����<{��iK��Ҟ~�R�[�m�����*����ҍF
:f^��d�%V`��Qk���S�.4F�l��ͦ�eL��lsL�����֟8���y6��7DȊ�1��ϗ�=��r[�2/USZ���WHr!���Ѹ$z�0��W��~OB[@Z�U���
�8k½��DH6��>�e�>��)IY��8�`��Ϥ�S����o���;�����}�y��o�4�?6k�V�
�;!��t
|��6$4�^��d6X޼�B,��b�L[�\w�O��x���OS����V|�{�rܸ����Ê��_�r|?!D�'��vh��y<��[a<�g{�6���9��J[υ�gg�����7����#m�7糳�c���S����٬��)��!�p�ô,4����Z�~�/N�moݪ�����	�q�u`z��y�1�Ӱƒ���V�9B:�1������&���Ya��/�b��ҳ��9�{��S�x��x�k�v�i萓�kAB8�iX�F|��7a��_���:�=vJq.�0��A&G�+M|�7 Ƽo�V~/=�#��!�
�ӯX��)[���ʲ����j�V�,"���ǻ���&��a��tҭ:��i��W���,����O���{X�L3uc>��n��[�+B8N�������s�]�B8�K�������`�w"���o"D�r:{v������"lڷ,-߀��5���DN�;�N4��L����<&B��p����^�'���B�	�n4C���?�0~u��}.o��!��:�Ns�ْ]�B�6�XF���m�$����`��T�C����xj%�{A���p����b�?�� �����K��oB9�P��WtU\��Ѓ� �!���?*h�
@=~�>,5���
a�̲�x�R�6��է��nn��=Y�TkU���'C�
5��t�	u���+���y۫7_�.fq�k[�]B��t�|8�C��~��N�?�4	6¨D��FCc�� ����z�,�@�^��G�*x��m���?�F4[�c~�ݖ�ʟ/�6اȜF3�0��_��f!D��7\�~J���ܗ�TB�x�i�����_�Jֈ5��砭�0�t�YAc��P:y����*�C:+.CU�,����6^�r\�ZE����Q�B�Tj0��_��SM=����P�E��{��	/��������cPH+�A�2�O;�Zp�|G�z���>���Z�1�w(�!hK�n�o�+�G��E�O�A�7�`LE��W�z�	(� <E^#������jt��1
��:�UӲ�P(�C�,�JY�׃*
�*h7�m��}?��x�h�'{,BS�d�*7��`xCG�#�ukxH�.���@}�\�Z�Y�
��в;Y�5�ŁBq�<���X���_
�l��m�!��M��7�.z v&ؐ!�W8��(K3X>�혿I�K� �ol�y���aHV꤃�/�-	^֪�[�mx�i�8��6��]�!Ϝ-?�J�CeX��򼦰zT��� �*�\�q4������f��s���"�BP+� Dj*�tvA�vŢ�i<c�Z%���>	$Iߢ�p�R*��c��r�t7&QMy��w�y��h)w�LǑ���#����!�Pk(��I��#�u�w��ʴ�T#�{Ԫ~P�7A_G��t7\�4�G�N����h�J�5�NĐ0�'�
|s}��*d�O"�A�}Mod�͓&�`�d�6�DoSMq�g@;R�iN��*�ȥ
T�=���˨N�l���i[��b7��+u�%�@��T��m��B�6�".�$\"�T��ٺh�t���$���戴üo��B�/����6���hkx��R�I_�1���l���q2O
�S]������ yaTĜ'���ݸÝ:�OS�$�0�/O�
����!�k-Ԋ�B�������5�K�]�M��+m��{a��?�Ӓ�B8HK�hO�q�P0�3"��4��TW����"�8�uaD�1$?����}��w�E�P��h��}"���{�CԀ?��*��L��[í02���B9��RMv�;t�6I�!�Z��ޗ�ut��ק��Q�Ƃ���uZF�5Q :7����t[�o �ѐ�7���ϐ����|'��R�v�j�lf�r��v;g�|�Kq�Q�AI�y�;��\�z�}"�8��߬�/��*ţaPP������@�)
�X����!�Qsu�֧����4/7j30�{v~�u��и��<���kw�H�Y�{n<�9B4�M1�5'���>'	0"m�AO�`i8���iy��;�1��DW3?����C�����&�N�_3=�/
�Ŏ�k>���v$�:D D��7�`9I�y�#��9��&�J�'�e>f��v�-�lC��y�O��)Cȋ?*P)�!�a͏���J�`շ<���Ѡ���#����	�f���o�63T�#����=������b*-<;:�i����#��@�����	1�/B}i(�Y5���1{���x�����g�D�^fF��v��+�J�t9Bt��J2�8{�4����#����vi���9�z�pƲ�K��.��E��,��k`yt�oF�ף��'��m��5�׆��܎���QP#���'���Né2)�i��vb48$<�Ǎ #|+�O
���2w����x
�ZJ�]���LڂqQ���v�]|z;�0�dPS!W�`�M��^h�v�>��{qO�.��k���M�Nς���T�Ɂ?��!}���l2�ج��@d�2�Y/�ãh�=t�)h�J����K�x�@P��A}�����!���֐�k��/5\ݧW��'�C��z�X�����G!��U�<3�xdh}X~�u0�t�<drY��[��|\�g�-6d��/K����
��ƯD8���z'w�Eȃ�����{/+�p��əpy�o��?�+򚴦$|�R�?
!�C�������n�"�?����v����R0M�Ǝ�u�iHpok��
7�x��_��L�V*�}F-�����t2O�8��
D�}�W����_��Mp�������E!�}=
_��F�_��k�[��IEND�B`�PK�Xg�
1��security_watch.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class SecurityWatch(BasicNewsRecipe):
    title = u'securitywatch'
    description = 'security news'
    timefmt = ' [%d %b %Y]'
    __author__ = 'Oliver Niesner'
    no_stylesheets = True
    oldest_article = 14
    max_articles_per_feed = 100
    use_embedded_content = False
    language = 'en'
    auto_cleanup = True

    feeds = [
        (u'securitywatch',
         u'http://feeds.pcmag.com/Rss.aspx/SectionArticles?sectionId=28026')
        ]
PK�X[�ܞ��sekurak_pl.png�PNG


IHDR�aNIDATxڝ�C�\A�;�m۶�k��%�m�X��m��ڮ�Ll����ٟL,3� ��x<E��gИ���FHK#sI��d��p�7�:���R�18J�s�y��;zfG�L��bxaUU�O=&G�319?%"*��`-��⧏��M����`qV8���x������gdQw	%zpVU�׮��qM�u��Z�7���B���
�ٖ1nq@��@HM'O���9�6}`q����
��d/kT�=Z&K�Y4x�2����T4r[����H`a���`)����g=MM'��]%wxkp��~l��8�E(D�qh�9h0$�YZK1hLœQ|B�(�Υ_pz+�|z���Ev��-
2�8���}!62�j�&����/)9w����i�>럠^�������~�h���5��Gl���Ͼ����?ŀG�.�np��ۨ'���LY��	��x�,�F]��G����͜[��u�-�n��=.6�v�,�9�7�������S�e�����g��$���=���{ҹw�1��+w���a���w�䰒p�_��(/���J����.S�}��IEND�B`�PK�XY�#��sekurak_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Sekurak(BasicNewsRecipe):
    title = u'Sekurak'
    __author__ = 'fenuks'
    description = u'Wiadomości z dziedziny bezpieczeństwa'
    category = 'it, security'
    language = 'pl'
    cover_url = 'http://www.securitum.pl/aktualnosci/sekurak.pl/image'
    masthead_url = ''
    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'}

    keep_only_tags = [dict(id='articleContent')]

    feeds = [(u'Wpisy', u'http://feeds.feedburner.com/sekurak')]
PK�X䰶��seminar_magazine.png�PNG


IHDR  D����PLTE)J!��)��)��)��)��)��)�9��){�){�1��!��9�RB9Z91�c!�k!��)))9R�k�k�s�{�{�)���9��9��9B9RJJJ)))))9cB))19)k��s�s!ތ�){�!��)��B��!��JZcs�RZZZ9)!��Z�kB1kZJ�Z)R{�kBk��k�9��!���!��ZJB)��cJB1{�9�{J)BRZ�Z11BB�B�9k{9��9��)��BZJs����r�KIDATx�m��,MESYF���g���n�'���WT��Ou�A� /��?/�� �7��^33��YkB���Ѝ�R`���0
1[K���K����1�Qh��ׁ�Y�E�X��E`ź*��h���*II "|�hVZ��Z���^\\l��������
�E���eQ��e�TV,�R��;H�	��J���ڴ{���j��R����2�Vd'�9���Z�c}6����a����Ʌ�X�8�3�3��Ә4{V{�G�$Ԗp�Ey�,���i3t:U������~���&�B__Y}�ٟN�!x�ק�dY6���,_�ծ'�-$�
tξ4�F]Ƭ�m���W�u��<����z��:?>p�W�W{�=�6\���h�5++�e�L��w��qz�0��0߫��0�@��L��K/���&�+ǬF�����V��juwvvZ���S���ٰ�������0���GDN$�,�{���2��#X��#�=�}�z��0tL,�C������C���h�j����H��TB��>_��{	Cm��Ï�G<rCvA�ki_�Q�J
�揌IEND�B`�PK�X["�;<<seminar_magazine.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime


class Seminar(BasicNewsRecipe):
    title = 'Seminar Magazine'
    __author__ = 'unkn0wn'
    description = (
        'Seminar - attempts a departure from the usual journal. Problems, national and international,'
        ' are posed and discussed. Each issue deals with a single problem. Those who hold different'
        ' and at times opposing viewpoints express their thoughts')
    language = 'en_IN'
    use_embedded_content = False
    remove_javascript = True
    masthead_url = 'https://www.india-seminar.com/semlogo/semlogo_top_1.jpg'
    ignore_duplicate_articles = {'url'}
    remove_attributes = ['style', 'height', 'width']

    def get_cover_url(self):
        cover_url = None
        soup = self.index_to_soup('https://www.india-seminar.com/')
        citem = soup.find('img', src=lambda x: x and 'covers' in x)
        if citem:
            cover_url = "https://www.india-seminar.com/" + citem['src']
        return cover_url

    def parse_index(self):
        soup = self.index_to_soup('https://www.india-seminar.com/semframe.html')
        d = datetime.today()
        a = soup.find(
            'frame', src=lambda x: x and x.startswith('' + d.strftime('%Y') + '')
        )
        url = a['src']
        self.log('Downloading issue:', url)
        soup = self.index_to_soup('https://www.india-seminar.com/' + url)
        ans = []

        for a in soup.findAll('a', href=lambda x: x):
            url = a['href']
            if url.endswith('.htm'):
                url = 'https://www.india-seminar.com/' + d.strftime('%Y') + '/' + url
            title = self.tag_to_string(a).strip()
            if title:
                self.log(title, ' at ', url)
                ans.append({'title': title, 'url': url})
        return [('Articles', ans)]
PK�X�Wy  serverside.png�PNG


IHDR  szz��IDATx�b ��Q0
DEdD��4��j�f���۶m۶m۶϶m>۶m۶�u׷s�]���$�tP)�_�ߍM�*��0 ���W1*
,P�ܧ;�jy-�8�N+�sQ!��	���~�3��V>1��,��'�zy�"����>�N� �*�Bv��,��l~��g&�G�(�NW�ʛH����2`��8����t�f���iq�#-�u��M��	�T����gi󪒡�T%�>c`�paT/��勁�]��[\��ʾF|d<�]��'Z"%v2�Uմ���_���k�~ứ<:t��o_��H�L�U)�+�a�mX<�f�K��v.���*_��4N��^.�i}=��d���P��b�.���;
�0ط���鯖��� <����u9YzX���Y�9�ˀc �w7n�J߃�ga�P�11~�@GV��X�HfN��=�a���L��w��"\��
�o਴��1u{1�v�
R����~e:&`�vY�Ԃ$"𔆋���o��=��'��%�ފ�[( �˒-�<VCҽ�}7�+��cKg�c$��Iѡز�����9�bޭ�©��1|8H�����|XU�=�ˋ�B\x,�
�gM
b6$v���(l��v�Lp��"�b��Ftl�
�Cz�l�i]��%��S3;�(Y�Gɪ�bW�`��ke'3{&�^/�V�ܖ{]���'�d�'��KF����Q��㇆�����;=+Yh0����^s�W}�r�o2�x�P�#b�A�IF��P��iϟ��u�5l�:��x���QN�&m��jN�w�'~�}�Pa�O�҅`�[��zWq��4JA��i��wq8�@j��6�rb�۶��%s�S>Fd�o�r�*�@�/u���~����E���Q��bbq{Ͼ�Q�Ϳ*�wΆ��zV)x�$�c�p�q��=w"�ۛ���pn��=4����CR���,Ms�h��6���`�=�����IEND�B`�PK�X��?�XXserverside.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Rick Kellogg'
'''
TheServerSide.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Engadget(BasicNewsRecipe):
    title = u'TheServerSide.com'
    __author__ = 'Rick Kellogg'
    description = 'news'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    remove_tags = [dict(name='table', attrs={'class': ["head"]})]

    feeds = [(u'News', u'http://feeds.feedburner.com/techtarget/tsscom/home')]

    def get_article_url(self, article):

        url = article.get('guid', None)

        return url

    def print_version(self, url):
        return url.replace('http://www.theserverside.com/news/thread.tss?thread_id=', 'http://www.theserverside.com/common/printthread.tss?thread_id=')
PK�XY����sfbg.png�PNG


IHDR  V%(�IDAT8�c�O0PE��G'��'@"/��7��?�P :(��
V!؞cQP��p��7����O��{`%���\������?�T�8r
�DF�z�� ��3�֙�n�(�����=�͝�"��V �	��z�l����h����X<E8A���[XQXXX\׹�3Pd}�Q*���l(��:�$�9)��s&})��Y'��߁n� 
�@�(��"�bU��P�2�@h�m����P8�3���PQ 5�&��	T�����/_�|���{47$��H]��?"�Q�a�\Y`��@��50��<
������ӧ���+*�\]��@Nj������5hn`P��?���`�j$_���W�#$�T�zp���Ϟ={C��$s�\��IEND�B`�PK�X
���sfbg.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class SanFranciscoBayGuardian(BasicNewsRecipe):
    title = u'San Francisco Bay Guardian'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 31  # days
    max_articles_per_feed = 25

    no_stylesheets = True
    remove_tags = [
        dict(name='iframe'),
    ]

    feeds = [
        ('sfbg', 'http://www.sfbg.com/feed/'),
    ]
PK�X��`j��sfin.png�PNG


IHDR(-SPLTE������BdBdB\>d>\��v;pIDATx���
A�b��?Il	E�8	t�"�v3h��Z1��>�v��䋏��;�o�x����&�zܧ�[�\���m���lYB.x ��k��2��K��oҽ�x����3�mIEND�B`�PK�Xw�d��sfin.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
sfin.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Sfin(BasicNewsRecipe):
    title = u'S\u0103pt\u0103m\u00e2na Financiar\u0103'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'SFIN'
    publisher = 'SFIN'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Economie,Business'
    encoding = 'utf-8'
    cover_url = 'http://img.9am.ro/images/logo_surse/saptamana_financiara.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'col2ContentLeft'}), dict(
            name='div', attrs={'id': 'contentArticol'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['infoArticol']}), dict(name='div', attrs={'class': ['separator']}), dict(name='div', attrs={
            'class': ['tags']}), dict(name='div', attrs={'id': ['comments']}), dict(name='div', attrs={'class': 'boxForm'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': 'tags'})
    ]

    feeds = [
        (u'Feeds', u'http://www.sfin.ro/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�*�-	sg_hu.png�PNG


IHDR�a�IDATx�b����?%x�`���8>|f����m۶�am۶�A5�m~�_��qw�?W���~�(����(	��t�|�en%m�R\\L0D��1M]ב&-�
���'
a��G����h�~�ugP�}�7c
�m�P�m���:�����7�(��M�H���Ƣl��2\���A+����|D"�(8j#u��ҁ����L&���!�f�%4s-Ȧ�����D�h4�5l:��C��2՛?QW�nԂD"�Y�&R�!��w����{ŠpH����N���OZ���'u�0$��1˲��m��`3�Fm+�Xq��P\��#S�$���ms�ľ{�T�sI�i'Ѽ�-������i��G`��������OP�`��#X-;:9�����%zO�4$��%��0�5� �?����Z��'�X��X�G����c�,3SDA엑\hIEND�B`�PK�XX�~h��sg_hu.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class SGhu(BasicNewsRecipe):
    title = u'SG.hu'
    __author__ = 'davotibarna'
    description = u'Informatika \xe9s Tudom\xe1ny'
    language = 'hu'
    oldest_article = 5
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'

    feeds = [(u'SG.hu', u'http://www.sg.hu/plain/rss.xml')]

    def print_version(self, url):
        return url.replace('cikkek/', 'printer.php?cid=')
PK�X��U��
shacknews.png�PNG


IHDR  szz�VIDATxڭ�p$K��q����ٶm۶m۶m�ζb��Uص;�V���v<">���m�p�p	�
��z(�
�ٸ�`H�~�Bc|���C$�1�S�>X�.�w8�$�6�3$>`rC A�K�$�
XMnh5a�V�	�1	� qe ��5��G~���S�b���9�a<�B@�6���B
h6��@��7�+h�}pa�/2j�	�o����
�&��c�Ck
�-)����y�B
=C��H\C!5�8*h�Q�m��:;:U��^�Bj���L�kI��#�G��cLt�\�
͗S�d}�Z��1�(�7�����1��V�V��ت	��
2��`&
A���9�,H,��pvu��.�ʿ~īLfO1�mv4u�G����=;8��	A���GH�Wx��R�	��'֣�M���4���¾^-+�N��vm�оq='g{�,����OBV�Pd�
%6]�%F\nd���hHlltM�&�����mײ� �$�(E�@��X����o�!��?���O�ٵj"H��g��4�`�����'������;�k�T���JхP���=�h`�O�1w��(hۥ� 1=�(E�@�˕�gȦ1�� 4��PH|�����D�R�nF.��+Dk��kH�1@y��[��&�G�Y��'H4�n��VT�ot��`��J��i��"��KH��+H4�:��A�Ayd��ְFP�GZ�E�̰�`�X�� y�R�4,�m&د�.�:=�:B�)�ˡ������Z�ڷ� �:�qB��1@;��!
D~Y��X�M�4 y�R�.ҫ %.*���4O�S�����A���aչ�}���H��Jlw��#>�G����
�!��}�M"���`tDJuX�-cP��k��0B
j��C):uD^^�v_��H�@�6� �A�\ �؛�F���f�9F�/$���A ���f�$�.���h�W��Y�5� ���BiL����P01wG�_H��-b�a`5��d���4H�Fd��X�7���g� ��.�N�؏��SX�a����m�W&P���BZIEND�B`�PK�XU'@��shacknews.recipe
from calibre.web.feeds.news import BasicNewsRecipe


class Shacknews(BasicNewsRecipe):
    __author__ = 'Docbrown00'
    __license__ = 'GPL v3'
    title = u'Shacknews'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'en'
    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        (u'Latest News', u'http://www.shacknews.com/shackfeed.xml'),
    ]
PK�X	Kz���
shortlist.png�PNG


IHDR  szz��IDATx����dQ���l�kim۶�6��q�*�m۶m[w�~թ�;u���կ���|�r����莾h�"�x�/"9J:D��4��g���_x���
�q<Q"YT�0,�?��BӀ<�Tn#MT���|�!l�M��f�U�����LF����Ԩ��ب��&07wq�а*�c5��ftG>��D�(�U}�Cj��1�aZ#������%����
����X��$toСJhE�>�`��+��z�1ײ�b@(��R��3�R��1�NVU��
��/�G$�%�*�r�b��*����'B����a؂ ��9��+��tG[�����8��8�}�w�8	m�����%a�|�b�X(�c�J���'����x�]����<�	d����!��/:�:�K~!)2(\%_�|���L�JZ�IEND�B`�PK�X��@�i	i	shortlist.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1324663493(BasicNewsRecipe):
    title = u'Shortlist'
    description = 'Articles From Shortlist.com'
    # I've set oldest article to 7 days as the website updates weekly
    oldest_article = 8
    max_articles_per_feed = 20
    remove_empty_feeds = True
    remove_javascript = True
    no_stylesheets = True
    ignore_duplicate_articles = {'title'}

    __author__ = 'Dave Asbury'
    # last updated 7/10/12
    language = 'en_GB'

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.shortlist.com')
        cov = soup.find(attrs={'width': '121'})
        # print '******** ',cov,' ***'
        # cover_url = 'http://www.shortlist.com'+cov['src']
        cover_url = cov['src']
        return cover_url

    masthead_url = 'http://www.mediauk.com/logos/100/344096.png'

    preprocess_regexps = [
        (re.compile(r'…or.*?email to your friends</a>.', re.IGNORECASE | re.DOTALL), lambda match: '')]

    keep_only_tags = [
        # dict(name='h1'),
        dict(name='h2', attrs={'class': 'title'}),
        dict(name='h3', atts={'class': 'subheading'}),
        dict(attrs={'class': ['hero-static', 'stand-first']}),
        dict(attrs={'class': 'hero-image'}),
        dict(name='div', attrs={
             'id': ['list', 'article', 'article alternate']}),
        dict(name='div', attrs={'class': 'stand-first'}),
    ]
    remove_tags = [dict(name='h2', attrs={'class': 'graphic-header'}),
                   dict(attrs={
                        'id': ['share', 'twitter', 'facebook', 'digg', 'delicious', 'facebook-like']}),
                   dict(atts={'class': [
                       'related-content', 'related-content-item', 'related-content horizontal', 'more']}),

                   ]

    remove_tags_after = [dict(name='p', attrs={'id': 'tags'})
                         ]

    feeds = [
        # edit http://feed43.com/feed.html?name=3156308700147005
        # repeatable pattern = <h3>{_}<a href="{%}">{%}</a>{*}</h3>

        (u'This Weeks Issue', u'http://feed43.com/5205766657404804.xml'),
        (u'Home Page', u'http://feed43.com/3156308700147005.xml'),
        (u'Cool Stuff', u'http://feed43.com/1557051772026706.xml'),
        (u'Style', u'http://feed43.com/4168836374571502.xml'),
        (u'Entertainment', u'http://feed43.com/4578504030588024.xml'),


    ]
PK�Xr/����sigma_live.png�PNG


IHDR  ���IDATxڵ�hcY���A/��<x���!��-����k#e�ݭB������ORM�����3�?ɷ�dG�˿�{�=�;�>��M�����w�7;2=C��"Pf�O2e�c�4�Ar�V��ċI��uE���9�7�y�;��f�H�	�l��Yo��/
�X�_��c�w~�U���UEG+� w�Q��^���7�v�����7��./�޵������������W�l��94+0�7��3|Lܒ��[V�UV�_�4�jU��o��3x���ܼٿ`ApӦ��%7e�4P��-@�}/����vΛ�[�t�ܹHoo2{��K&�cc.WwuuGIIp���5u��F�a����$|EE���
z>�$64�rL$��H"J��$���8��\��QT�[�$�|9���ʺca�м�ŊV��o��i|r0 X�"�45̄��VPй`�o֜+�&݆B�a�k74�
)}�fy�>HLM�FG��p|tt��e��{2�ܜ�)����FFbcc��aL��}�k��ϝ��3�����r�T	��a��Gzz���8}�����b�GJ���6kV���*	���A�P(P]�YZ���o+,�+�]�����@��JgA������pgg��U���lޗ^���A���MDޢ��z0��s���**����^��L�f��;&y�٥�����χ����)�^����-+Ll�u�a�+*:7ovc��ߵR��v�ʾE2�w�4�t�QQ���%���[O�l��M& !7d2��)��
D
�MVk#Q�ڵh�5Y���f�.�6I�YS�ܱsg���NQ
íi��^������ŜQ�uR6`5�4TӶv��k5(�l�ʔ��`�Y�v��U�E�{뭁�~r�4]v;��,c!�k�	������E�+L��`�j�����]�w�'��4��.E����I�w�F]��;w0h��sDϨ�2�����`t����GwP��ȾG��+g�rw$�ׯ
����
R�t[�9��֟�o�4��eeWaZ\<t������)��Lu��Lʛ�,-�=���k���=E�Z�>Ɏ/�ă~^���Uu��JD��������^�63�n]gF�UU��}}}�.�!:'�y����g��\�4�vF���;�󅚚�^o��`0���u�{��xV��s�x?�`�֭Xww��-��q���'�8�,t�c_�����Hv:��TCC��%E�xb��ƆD�xO������SD?)��
�g��d�D�f>���QKa�p]]"�����

8B��Fh��n��6��
޽���D?H��GBA���d��ZN	�sN�z˾}!��X{{����	�?��\�|�׎���8�1�B-sw>��c�ԏ�⨢D�/�T�駁3gF�α������+W<\�?��a�*�a"d%ڤ�d<���Ū�;t@t,��M�7m#��KG��~?��{��ψ\�'f�n�n۪���戢�8H|��0���(3`3/�z��@"�k�i��ғ~+f2L�e�Ԫ��	3N�&�/��g�U�%�!t;쐙��*Y��.V0�
�C�g�r�H׭�b�,�n�oj5����We�v՜�E{�x���AY����6��k�ۼ?���T�)b4N�$�IEND�B`�PK�X��F���sigma_live.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class sigmalive(BasicNewsRecipe):
    title = u'SigmaLive'
    __author__ = 'Stelios'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    category = 'news, CY'
    description = 'Cypriot News'
    language = 'el'
    encoding = 'utf8'
    feeds = [(u'sigmalive', u'http://sigmalive.com/rss/latest')]
PK�X^�N��sign_of_the_times.png�PNG


IHDR  D���EPLTE........-
6�E�5Y�Qo�f�������ȩ�л�����������������	tRNS.Hq����Y�IDATxڅSU�� �^ܹ�Q�6���2āq�$bōE~�"�-��$f��y?�t��1Z�~„i)s)9Z��OQ��.Ԡ)M��BC�1�w��9_2�ꘟT:γ�ږV��$fLAx�Q�W��9�^Z�a��·�o�ء�x��>����/9���6���x�"$c�0�8`|��Z
�v'%*L��-g.Y#a���S6j�kܛ‚Ò&�VܓCR8,w�qWw�0]�M�f��۾�q�_��yAb��K���)i5�!�IEND�B`�PK�XH �ފ�sign_of_the_times.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class SignOfTheTimes(BasicNewsRecipe):
    title = u'Sign of the Times'
    language = 'en'
    __author__ = 'TerminalVeracity'
    oldest_article = 31  # days
    max_articles_per_feed = 50
    use_embedded_content = False

    extra_css             = """
                               h2{font-size: large; margin: .2em 0; text-decoration: none;}
                               .image-caption{font-size: medium; font-style:italic; margin: 0 0 1em 0;}
                               .article-info{font-size: small; font-style:italic; margin: 0 0 .5em 0;}
                            """

    remove_stylesheets = True
    remove_tags = [
        dict(name='div', attrs={
             'class': ['article-icon', 'article-print', 'article-footer']}),
        dict(name='span', attrs={'class': ['tiny']}),
    ]

    feeds = [('Signs', 'http://www.sott.net/xml_engine/signs_rss'), ]

    def preprocess_html(self, soup):
        story = soup.find(name='div', attrs={'class': 'article'})
        soup = BeautifulSoup(
            '<html><head><title>t</title></head><body></body></html>')
        body = soup.find(name='body')
        body.insert(0, story)
        for div in soup.findAll(attrs={'class': 'image-caption'}):
            for br in div.findAll('br'):
                br.extract()
        return soup
PK�XP��;22sign_on_sd.png�PNG


IHDR  V%(�IDAT8����Ka�ѥh;t(��d2�KG�VDj�CDP)E,E'��-��,i�R��K�i��V�FzIۜfl�1wg�ۼ��Fv�ҡ���·g���	���/�q�O����ܲ�J:GH�	��mb.�h�q{�P�X�Ԟ��{��7�D�(��ڂ��_���K�<up�������"C_��y����^���q�W)�᪈�		����uU�v�e�͵��YY���'�,0��Zf����~���l&����`���]�Wk��q�ӽa��M~�����HT��,�y�5�Qց�H��ڤ�ub桳l6�xƖYܯ�JQ5xCi���l�{m�����<2{U^hQ3���*Q&C��hN6*=Z:a	`��y�k��9]�\m¦���s�y�j��trB|��;�L��>��<�'���|c�\���n��E�-��A�J��+�E$n�|B/L����)�{������=����IEND�B`�PK�X��<��sign_on_sd.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1315899507(BasicNewsRecipe):
    title = u'Sign On San Diego'
    __author__ = 'Jay Kindle'
    description = 'Local news stories from The San Diego Union-Tribune; breaking news, business and technology, local and national sports coverage, entertainment news and reviews.'  # noqa
    publisher = 'Tribune Company'
    category = 'news, politics, USA, San Diego, California, world'
    oldest_article = 2
    max_articles_per_feed = 200
    timefmt = ' [%b %d, %Y]'
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    auto_cleanup = True
    remove_empty_feeds = True
    publication_type = 'newspaper'

    feeds = [
        (u'Latest News',
         u'http://www.sandiegouniontribune.com/latest/rss2.0.xml'),
        (u'Business',
         u'http://www.sandiegouniontribune.com/business/rss2.0.xml'),
        (u'Politics',
         u'http://www.sandiegouniontribune.com/news/politics/rss2.0.xml'),
        (u'Immigration',
         u'http://www.sandiegouniontribune.com/news/immigration/rss2.0.xml'),
        (u'Courts',
         u'http://www.sandiegouniontribune.com/news/public-safety/rss2.0.xml'),
        (u'Education',
         u'http://www.sandiegouniontribune.com/news/education/rss2.0.xml'),
        (u'Sports',
         u'http://www.sandiegouniontribune.com/sports/rss2.0.xml'),
        (u'Chargers',
         u'http://www.sandiegouniontribune.com/sports/chargers/rss2.0.xml'),
        (u'Padres',
         u'http://www.sandiegouniontribune.com/sports/padres/rss2.0.xml'),
        (u'NFL',
         u'http://www.sandiegouniontribune.com/sports/nfl/rss2.0.xml'),
        (u'NBA',
         u'http://www.sandiegouniontribune.com/sports/nba/rss2.0.xml'),
        (u'Photos',
         u'http://www.sandiegouniontribune.com/visuals/rss2.0.xml'),
        (u'Entertainment',
         u'http://www.sandiegouniontribune.com/entertainment/rss2.0.xml'),
        (u'Books',
         u'http://www.sandiegouniontribune.com/entertainment/books/rss2.0.xml'),
        (u'Opinion',
         u'http://www.sandiegouniontribune.com/opinion/rss2.0.xml'),
        (u'Travel',
         u'http://www.sandiegouniontribune.com/lifestyle/travel/rss2.0.xml'),
    ]
PK�X�&	��silicon_republic.png�PNG


IHDR  szz��IDATx�ŗDQ��L��0�wH�L�@�dBH��2�I IH C�&oaf2���ҩwww�ݽ?��{����}߷3df�B��NϤ��d�~ z�KK��C�׀��hduX�e��M�n��Z��\��[���vS7��?�3���Ad`��LX3�<fZ
�ٰ�����F�Q����a�oq>!l''4pa��՜�x�2�M�
�qPE�V�<xHM��Nh���i|�(� gޯ�~�C��j��|����.�%�ᳯ`�8��w��G5qBgq�H1J*6HšJ��0p#+�~\���Kl6p@^�j�נ��I;�6e�|f�����\��s��%,�m�H�ỶL��2x�醹�Z��;�s��<"q)0Q�����LE��^�V�c�g���
�B����!��J>¿{rIEND�B`�PK�X���TTsilicon_republic.recipe__license__ = 'GPL v3'
__copyright__ = '2011 Neil Grogan'
#
# Silicon Republic Recipe
#

from calibre.web.feeds.news import BasicNewsRecipe


class SiliconRepublic(BasicNewsRecipe):
    title = u'Silicon Republic'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = u'Neil Grogan'
    language = 'en_IE'

    remove_tags = [dict(attrs={'class': ['thumb', 'txt', 'compactbox', 'icons', 'catlist', 'catlistinner', 'taglist', 'taglistinner', 'social', 'also-in', 'also-in-inner', 'also-in-footer', 'zonek-dfp', 'paneladvert', 'rcadvert', 'panel', 'h2b']}), dict(id=['header', 'logo', 'header-right', 'sitesearch', 'rsslinks', 'topnav', 'topvideos', 'topvideos-list', 'topnews', 'topnews-list', 'slideshow', 'slides', 'compactheader', 'compactnews', 'compactfeatures', 'article-type', 'contactlinks-header', 'banner-zone-k-dfp', 'footer-related', 'directory-services', 'also-in-section', 'featuredrelated1', 'featuredrelated2', 'featuredrelated3', 'featuredrelated4', 'advert2-dfp']), dict(name=['script', 'style'])]  # noqa

    feeds = [(u'News', u'http://www.siliconrepublic.com/feeds/')]
PK�X�@g�[	[	singtao_daily.png�PNG


IHDR  szz�	"IDATxڭWL����wk��F�p�$M�4�!�,�K!Dž226N��C���H�R�TNEN��8s�����I'ד<�?y��}^�L�/DQ����G$�Z偺G���������`:I��-	%ó�g|d��5��ha|����۝ �	R���}�5$�0�:#�m�buB$�~LS�o2d�R8|����ׂ<yK�}���K���+#��}��_��ò-�@=A�WA�g#-��̣HͩB����Tx#�!a9��/LїDT�EX.���	���fv8		9��[�!(��U�HꗌȔJ$�J�7(��O�CQI�K߁�Z���E<"��a�?�q]!����a,9��_ʢ+�)rD�@!|E��D$U 2&�  ��D'N���1��i7�9�fO��yH�v�x�^�J�p
��A��w."�ڽ��%����*P�H�@tB>'P�`n�4d���a��Y��}Y��p�#&9r_�}��R
�T	�L� ��$Dk*� ۟'P�!��u���=C��D���<J�K0�	�$o�ܨ]"�]���������\"��o�:8�ܰ9��<��ZX��w&��Q�)Ņ�l,NXq����p:���TF.�cSȰP������be�6��'�D`x���	�v���H' �x~�>Vm`mj�S.�X�xq��,��J���@,#�̜��?��$<��[�Է�A��:Gq0� �9�Z�պf�09�Q���
������2��	�U������G�q62�o,��1�a��Z����<ē�5�2�cqp��,��n�b�;�T�+���_�_"��3}/’��O����?)gp�-�9{	N�p��a����2��S<^Yŵ�6�4��fO?n��p������/ߋ@�	x�TNbGN�����F@p,�P�-�����xGC�[�#;��ō�xB�^w���<V,6,
���	,�[ɰ�+�|���t<ڌ#�f~]�M�!��]�����m�p(���,Z�����rm3�߄�w������Ҥ��=l��<A�BHf�O�������8� >z��W��ѹ�x��1�/,������qA�S��h*����/v�}���;����ڻ8�~���}�_�!lҠ�"�넽�֣8�z`�낳}�,`�k��B��Gi�(ʀ2H�g	�B����—�hV'A*��TV�2�Ȱ㚈��|5��	Ԧ�B�DHB�h,	���_F��>O@�G�Ɇ�&�
걯ʈ��A���h�e��.�����v�OiPhP�π)�i�wO�[:���SH��<4"�Z;F14>
?� ��&@�y�ޅ��;8{������5w�H9�~�>
˛(�V\�������[r�EN�[XZCVa�訾zc�d���E"�F��=��M�O/Cv�)?�Ι�Z\äcs�(�lCk�w�=�q��	��*Y\^���H�&n�ZEni#z�p{�����.^Gp�n&�y
�"wO3���}�:y$����c�3�{��~+�)M,5���TI|ut�M����u`w̆cf4��
��c�3;��o��	>�N��*�,E,��gE&%o%2*6*(A�.��]~ܖ�<
�O4���H|"!����
yi8�[,��dR���1
�i�4bW^4�eU��(�8�����O鈢Mv*�h(-�E
Б,�/q�A�f!!u?ҩ�	��_2H�݄V�c�y4wN�<�B��Դ��ov��0���鍋�$oGU��-�ȧ�UTL�b��F�~F�p����'���7����-�)���:���
ؒX��U܈�����!4���<�d��'CR�����(`�4��H�;FyB²��w &��r
�-��@�*�-Jț4R��"eWx�:���o+^�M���au���1zg�@��ݐ���7"~)�ɻ�t��ي7�eXL1g/�cQXi@[����G��n6����'����5Nc��T�U�C_��cG��=��Ȅ�!��Q}�.����)߬8����9���p���Z��t����d-l��IlI�ol8��I"���0i�7A���#0�`��e&���T��/�
D���]���[��SD>k�L���t1��
�=��f��4�OO3�@��b8m�d,_��A�
�@-���K�'��K���$��<?�>�(��l���d�[f�?�Y���J�ht��kdt�~x�������#9�I����&��f���?=�=�Vw�IEND�B`�PK�X%��ҿ�singtao_daily.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1278063072(BasicNewsRecipe):
    title = u'Singtao Daily - Canada'
    oldest_article = 7
    max_articles_per_feed = 100
    __author__ = 'rty'
    description = 'Toronto Canada Chinese Newspaper'
    publisher = 'news.singtao.ca'
    category = 'Chinese, News, Canada'
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'zh'
    conversion_options = {'linearize_tables': True}
    masthead_url = 'http://news.singtao.ca/i/site_2009/logo.jpg'
    extra_css = '''
        @font-face {font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\

    body {text-align: justify; margin-right: 8pt; font-family: 'DroidFont', serif;}\

                    h1 {font-family: 'DroidFont', serif;}\

                    .articledescription {font-family: 'DroidFont', serif;}
            '''
    keep_only_tags = [
        dict(name='div', attrs={'id': ['title', 'storybody']}),
        dict(name='div', attrs={'class': 'content'})
    ]

    def parse_index(self):
        feeds = []
        for title, url in [
            ('Editorial',
             'http://news.singtao.ca/toronto/editorial.html'),
            ('Toronto   \xe5\x9f\x8e\xe5\xb8\x82/\xe7\xa4\xbe\xe5\x8d\x80'.decode('utf-8'),
             'http://news.singtao.ca/toronto/city.html'),
            ('Canada \xe5\x8a\xa0\xe5\x9c\x8b'.decode('utf-8'),
             'http://news.singtao.ca/toronto/canada.html'),
            ('Entertainment',
             'http://news.singtao.ca/toronto/entertainment.html'),
            ('World',
             'http://news.singtao.ca/toronto/world.html'),
            ('Finance \xe5\x9c\x8b\xe9\x9a\x9b\xe8\xb2\xa1\xe7\xb6\x93'.decode('utf-8'),
             'http://news.singtao.ca/toronto/finance.html'),
            ('Sports', 'http://news.singtao.ca/toronto/sports.html'),
        ]:
            articles = self.parse_section(url)
            if articles:
                feeds.append((title, articles))
        return feeds

    def parse_section(self, url):
        soup = self.index_to_soup(url)
        div = soup.find(
            attrs={'class': ['newslist paddingL10T10', 'newslist3 paddingL10T10']})
        current_articles = []
        for li in div.findAll('li'):
            a = li.find('a', href=True)
            if a is None:
                continue
            title = self.tag_to_string(a)
            url = a.get('href', False)
            if not url or not title:
                continue
            if url.startswith('/'):
                url = 'http://news.singtao.ca' + url
            current_articles.append(
                {'title': title, 'url': url, 'description': ''})

        return current_articles

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll(width=True):
            del item['width']
        return soup
PK�X4l��
singtaohk.png�PNG


IHDR  szz��IDATxڼ�tcy�߱Y��KS��ضmG�ڶ�ֶ]�]+���7wt5��sίM�����u��t�
���`J�DSxe�tə�/2��xPn�Չn�@�V���U���-<�z��(���Gx�������T����Q�Q4F�����_yO�ǯ�_�r��t�����-�%<�H���֡���ҙS���1�a�Y(��_O�P�DL�0� V����f�ۍhSGk��1� ש3��nl`�D���@ɵ�;NQ~�8�j�Z0�&Dt��n=���1�Q��Od��++��{��@�Ԁ�TE���3 VCS;�cW�[;��%�,R'p)t��HH^)d��
�����+�z���P]݄�����T�DŽ955M�U�3P]ۂ�}��� �_a��D*z �b��mx�c������݈��y�[���ժcAs1n�&�wH{�¥R���YZ��_N��z��o���Y8�&��W�.����o~×_����S(.m��KzT��CM���ͫ@Aa�+ǥ\=
���;��Ŏ#�x̹���9�=���c���k�c�w�IL��Dn!(d2�/%:dž���ጆŌ���B�[">\ŀ�\��ᠣ��X���I髱��3�����i�w!}�6L�sS��<���|�S����̸I	����xd�~�VAa%�A�SnԄ�A=���=]�8�D��Ϝ-Df�E�A.����y�9���	���W>�����WA�4�if��2�ч���'�¤�[A4��b����
��ss�0v��ъ̈́�F-U�@�4��[��������pqI�F;��|��]�6�W�\%eu�o�D�|2���y��[4��|�[�?k+#㜰7?�%�\�"�x�;���=�{C�3��BK��-��֙���3������؀4�����uHF��^H�r�Ta�]���y	�uÇ%�G�$��[܈6 �С����:r0C�&�;7 �0������= �s.��i��)JP��	��/�H(AS���\κ���N�I_	z�T|#��'�U�7��L�L(�����@7���[���u�+�5��Y�����g��bX�Yh"a�wH��m���h(��atL@�{���]���x��v��=�"IEND�B`�PK�X�Lc
c
singtaohk.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

class STHKRecipe(BasicNewsRecipe):
    title = '星島日報 (香港)'
    __author__ = 'unkn0wn'
    description = 'The Sing Tao Daily is among Hong Kong\'s oldest Chinese language newspapers. (https://std.stheadline.com/)'
    category = 'Chinese, News, Hong Kong'
    language = 'zh'
    encoding = 'utf-8'
    masthead_url = 'https://std.stheadline.com/dist/images/logo-v2@2x.png'
    no_stylesheets = True
    remove_javascript = True
    ignore_duplicate_articles = {'title'}
    remove_empty_feeds = True
    use_embedded_content = False
    remove_attributes = ['style', 'height', 'width']

    extra_css = '''
        img {display:block; margin:0 auto;}
        .date { font-size:small; }
        .caption-text, .media-library-item__attributes { font-size:small; text-align:center; }
    '''

    keep_only_tags = [
        dict(name='article', attrs={'class':'content'})
    ]
    remove_tags = [
        dict(name=['video', 'svg', 'button']),
        dict(attrs={'id':'articleShareIcons'}),
        classes('in-article-banner stick-box-gray article-pagination comments')
    ]

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)['href']
        skip_sections = [ # add sections you want to skip
            '/video/', '/videos/', '/media/', 'podcast'
        ]
        if any(x in link for x in skip_sections):
            self.log('Aborting Article ', link)
            self.abort_article('skipping video links')
        html = br.open(link).read()
        return ({ 'data': html, 'url': link }) 

    feeds = [
        ('日報', 'https://news.google.com/rss/search?q=when:27h+allinurl:https%3A%2F%2Fstd.stheadline.com%2Fdaily%2F&hl=zh-HK&gl=HK&ceid=HK:zh'),
        ('即時', 'https://news.google.com/rss/search?q=when:27h+allinurl:https%3A%2F%2Fstd.stheadline.com%2Frealtime%2F&hl=zh-HK&gl=HK&ceid=HK:zh'),
        ('副刊', 'https://news.google.com/rss/search?q=when:27h+allinurl:https%3A%2F%2Fstd.stheadline.com%2Fsupplement%2F&hl=zh-HK&gl=HK&ceid=HK:zh'),
        ('其他的 新聞', 'https://news.google.com/rss/search?q=when:27h+allinurl:https%3A%2F%2Fstd.stheadline.com&hl=zh-HK&gl=HK&ceid=HK:zh')
    ]

    def populate_article_metadata(self, article, soup, first):
        article.title = article.title.replace(' - 星島頭條', '')

    def preprocess_raw_html(self, raw, *a):
        return raw.replace('<p></p>', '')
PK�X�ԉ��siol.png�PNG


IHDR(-SPLTE333ym0��/��/��-�&65��tRNS@��f>IDATxڍ���0�N���7N����U����5Z5�w�p�C�c$:�"�E����B��6$�� +���c�wIEND�B`�PK�XԜv\��siol.recipe# coding: utf-8
__license__ = 'GPL v3'
__copyright__ = '2010, BlonG'
'''
www.siol.si
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Siol(BasicNewsRecipe):
    title = u'Siol.net'
    __author__ = u'BlonG'
    description = "Multimedijski portal z aktualnimi vsebinami, intervjuji, komentarji iz Slovenije in sveta, sportal, trendi, avtomoto, blogos"
    oldest_article = 3
    language = 'sl'
    max_articles_per_feed = 20
    no_stylesheets = True
    use_embedded_content = False

    cover_url = 'https://sites.google.com/site/javno2010/home/siol_cover.jpg'

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''

    html2lrf_options = ['--base-font-size', '10']

    keep_only_tags = [
        dict(name='div', attrs={'id': 'idContent'}),
    ]

    remove_tags = [
        dict(name='span', attrs={'class': 'com1'}),
        dict(name='div', attrs={'class': 'relation'}),
        dict(name='p', attrs={'class': 'path'}),
        dict(name='div', attrs={'class': 'clear_r'}),
        dict(name='div', attrs={'id': 'appendix'}),
        dict(name='div', attrs={'id': 'rail'}),
        dict(name='div', attrs={'id': 'div_comments'}),
        dict(name='div', attrs={'class': 'thumbs'}),
    ]

    feeds = [

    (u'Slovenija', u'http://www.siol.net/rss.aspx?path=Slovenija'),
    (u'Lokalne novice', u'http://www.siol.net/rss.aspx?path=Slovenija/Lokalne_novice'),
    (u'EU', u'http://www.siol.net/rss.aspx?path=EU'),
    (u'Svet', u'http://www.siol.net/rss.aspx?path=Svet'),
    (u'Gospodarstvo', u'http://www.siol.net/rss.aspx?path=Gospodarstvo'),
    (u'Sportal', u'http://www.siol.net/rss.aspx?path=Sportal'),
    (u'Trendi', u'http://www.siol.net/rss.aspx?path=Trendi'),
    (u'Avtomoto', u'http://www.siol.net/rss.aspx?path=Avtomoto'),
    (u'Tehnologija', u'http://www.siol.net/rss.aspx?path=Tehnologija'),
    (u'TV / Film', u'http://www.siol.net/rss.aspx?path=TV')
    ]
PK�X�W�''sisainlive.png�PNG


IHDR  szz��IDATx�b 
($0j/(g�(�m۶m۶�߶m۶m���f�^u�p�}�:�[�U}o��	�A��M�!�G���#�Fҙd�c�*��E�|��!��!sI�(�d"�EE~5I�/Bΐp�hFN���]�yfu�\��j�	)cw�O���U��y�D��cR�V��X��':^�3W�#e���D�Sr���8�>�9MIQtn���n�(�-��&-�	'㔋%?��<{�1�Ws<�T�<��HSr(җ���N�l�鈗�rV�v���25\\F*��G��5�#K�Q��擄�����s?�6�z���<���_Tm=�;詍LO.6�}�_��qp�_G�z��N��r.�d�i8p�>~�sǛ�w�V�1Dh�n��2��@ɰ�(2Ȑs.P��t���B�
��"�Iz!O�q����֝E<���dS��p�{�ט-���ߤ�eߕ

�&"Mt���Cݎ���3]��>F�AkM�!��J[ۡ4�m�&��zI
0D�m�f��?��6Se�K7_#M�!r��3�����i��Za�5� ��B�n��m�������{.ï?n�)<\�13��TE�a�ut@M\p�0��]��,�>wB��#��s�
t���%�O&��)��3��M}H��G�B�
d.7iK����`�]������m��W^ A���$�y���t)�ٿA�����N��h��1
��O���_��� y������}��@#Dt�[������7dg���o�L�{D��W]-?/���Ci@������/�$��[y{�G�0�ю���O�*[w������2�.�h��ț����7��o4�ܒ�5�@ghˀ�g�v�������Wg�`�g�5VHH��Z(D텁��@OVB�-kA�n4�FL��Yʏ4�F�4�	?���Z4�d�=��NGN�c
����]�i�:h�w���UZ�QN,O����q[f)߄~yݺ2������/�.��0x��@���(>�\f��+h�-j��[o@�j���7RP�N0����ãD�)�\��,Tj9E�NB�����J
CE�9!�7y����Kފµ'��u��*����F���҆��4��M_Js(���M�]�#���"Ob�����7㲱d�!)��/}$N���br�έ�HMԺ�E��1$Ut��&s�k]ŴC yEf��1�-9�@֑������!kI{�5��Pop�a|o\IEND�B`�PK�X�|k���sisainlive.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2015, Hoje Lee <hojelei at gmail.com>'
'''
Profile to download SisaIN Live
'''
from calibre.web.feeds.news import BasicNewsRecipe


class SisaINLive(BasicNewsRecipe):
    language = 'ko'
    title = u'시사인 라이브'
    description = u'시사인 라이브 기사'
    __author__ = 'Hoje Lee'
    oldest_article = 30
    max_articles_per_feed = 10
    auto_cleanup = True
    """
    # manual cleanup
    no_stylesheets    = True
    remove_javascript = True

    keep_only_tags    = [
                        dict(name='div', attrs ={'class':['View_Title']}),
                        dict(name='div', attrs ={'class':['View_Info']}),
                        dict(name='div', attrs ={'class':['View_Time']}),
                        dict(id='articleBody'),
                        ]
    remove_tags   = [
                    dict(name='table', attrs ={'width':['320'], 'height':['265']}),
                    ]
    """

    feeds = [
        # (u'전체기사',  'http://www.sisainlive.com/rss.xml'),
        (u'인기기사',  'http://www.sisainlive.com/rss/clickTop.xml'),
        (u'커버스토리', 'http://www.sisainlive.com/rss/SRN121.xml'),
        (u'특집',      'http://www.sisainlive.com/rss/SRN122.xml'),
        (u'정치',      'http://www.sisainlive.com/rss/S1N15.xml'),
        (u'경제',      'http://www.sisainlive.com/rss/S1N16.xml'),
        (u'사회',      'http://www.sisainlive.com/rss/S1N17.xml'),
        (u'문화',      'http://www.sisainlive.com/rss/S1N18.xml'),
        (u'국제.한반도', 'http://www.sisainlive.com/rss/S1N4.xml'),
        (u'실용.과학', 'http://www.sisainlive.com/rss/S1N6.xml'),
        (u'휴먼&휴',   'http://www.sisainlive.com/rss/S1N19.xml'),
        (u'인터뷰.오피니언', 'http://www.sisainlive.com/rss/S1N5.xml'),
        (u'사진.만화', 'http://www.sisainlive.com/rss/S1N7.xml'),
        (u'별책부록',  'http://www.sisainlive.com/rss/S1N14.xml'),
    ]
PK�XDK�A$$sizinti_derigisi.png�PNG


IHDR  ���IDATxڭV��Z>�6��m۶m������(Gm���Ft��M�n;�}'�~�n��7��l���y��[��>7�a�nS:���,�:�#"��~?岧F�lF~?G|�
4�J���l�|�,]Jz��;��g�DȢ��ޡ\�D���>����<�,Yƴ��^��`4��J�����ު��G��x㽐eH�5�I��\-ڝ[��oS��g��o5]~u���:a�����Z�z�˯�~Y�ܾ�ظֿti�w�+�����ݴ���;��������EʬW|���B��%≨��h�;w(�z�}�� ��i�C&[����[�m��d�G,K�A6����w@� ZYֹ�4ť�0^�PR*xSo��wM�XtmMp�z�jM�c����0
�T�����Bcx>�r��WXN���}ؾϑeϽ��Ef1�p* ���C�(���'�����vl�nJ�G>/ϱ��U���q~dpxջ)|N&%A ��X6�2��d�IL?�8�֩��n{�p�{���#/��X�.��d}�5��N)7���$�N�O���T6NT��n1n���w}s���}Z��<�T�}%V��
������\�p߃T<���$��"
z�-w�~���qI-fK���6,8�6SIP��q�	'�N>O{�=���ʹ�c���}�J��ڌ��g����l,�)쯪V�����[z�����1�B���x"��WJ��E\��כB�rD��:�/��;l����?��6��;�֭x��֣&���g�v��;ea��g�={�؆x��E�L�(s�x�UQ�:qF7��I�7�f��U�<�]Z���Sm��{�ϕ��*�B�p������%�[7�"��4-�#wUm��/�O��$���>���HI����uE?$�XL$��m����3O�����}�
�'�<QT�N��N�q��<��1�ߵLY�%�±�Q���wu��{��ެZ{y�j��{��{[�u㝤�+���� ��ѩ{�}��YMB�[���'�������
���}�C����=�R��4���ҋ�A�3�ve����*�����վ��qsBs����/0gv�[�%[��j�"��T�ٛ"|�I�@�ݶ���?�v���<�TZܱm�j�Fkcs�h
�jտ��x��8���V��1��
�x�pYLI���*��".�����{�n�+/5\sc�]����7`r�x�}�76�_ru碳�u��ݴtI轢$ÈS#z�qBa�ÖL:�b�8�d�-΂G�묬vw������R�0��
-O��t8H:m�Ō�:V�L+�y��W�x��3����I,̒ͩV�j*���T"��>��uo6�wp�)J8P.T��9�`�0'p��^M��ѣ�-]ֶ�\�x���p�'�oy������74
��6� A8`h�|ϽŊ���Z{MU�ڵ�
J�<�in$~����_~�ٲ�PSk���56�+5�6��J�_|��kk� Ȝ��3����]}����t�9�D>C]�������C�Jb��y�ǡڳK����Wܬ>x�^��o�OSј(��8'��h5�ňx<��i�K��G�T��b��Ж��[�o��֯�1������dR��_2�!���BX����x�̾��<��;&y�O$�JQ$�ײ��Pfi�!�r�7��s�_##�/I?p4,I�-ֿ7�.���b/�IEND�B`�PK�XoG����sizinti_derigisi.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class TodaysZaman_en(BasicNewsRecipe):
    title = u'Sızıntı Dergisi'
    __author__ = u'thomass'
    description = 'a Turkey based daily for national and international news in the fields of business, diplomacy, politics, culture, arts, sports and economics, in addition to commentaries, specials and features'  # noqa
    oldest_article = 30
    max_articles_per_feed = 80
    no_stylesheets = True
    encoding = 'utf-8'
    category = 'dergi, ilim, kültür, bilim,Türkçe'
    language = 'tr'
    publication_type = 'magazine'

    cover_img_url = 'http://www.sizinti.com.tr/images/sizintiprint.jpg'
    masthead_url = 'http://www.sizinti.com.tr/images/sizintiprint.jpg'
    remove_tags_before = dict(id='content-right')

    feeds = [
        (u'Sızıntı', u'http://www.sizinti.com.tr/rss'),
    ]

    # def preprocess_html(self, soup):
    #   return self.adeify_images(soup)
    # def print_version(self, url):       #there is a problem caused by table format
    # return
    # url.replace('http://www.todayszaman.com/newsDetail_getNewsById.action?load=detay&',
    # 'http://www.todayszaman.com/newsDetail_openPrintPage.action?')
PK�XzHN�WWskai.png�PNG


IHDR(-S�PLTE,$`/'b:2j=5m>6m>7nF?sLExLFxOHzYS�[V�c]�ga�hc�id�mh�oj�ql�ql�rl�to�up�wq�zu�}x�����������������¶�ȷ�ȹ�ʻ�̽�Ϳ��¿���������������������������������������������������u0�KgIDATx�c�@��"����1�4�
��0H��)p˳�1
(0j���ŘM84��L�,:|�f�<l溲)M%~Ee	IVa=Q�
��X�����'����*IEND�B`�PK�X�*/���skai.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class SKAI(BasicNewsRecipe):
    title = 'SKAI'
    __author__ = 'Stelios'
    description = 'News from Greece'
    oldest_article = 2
    max_articles_per_feed = 100
    publisher = 'skai.gr'
    category = 'news, GR'
    language = 'el'
    encoding = 'utf8'
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    encoding = 'utf8'
    keep_only_tags = [
        dict(name='h1'),
        dict(name='div', attrs={'class': ['articleText']})
    ]

    feeds = [
        (u'\u039A\u03C5\u03C1\u03B9\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u0395\u03B9\u03B4\u03AE\u03C3\u03B5\u03B9\u03C2',
         'http://feeds.feedburner.com/skai/Uulu'),
        (u'\u0395\u03BB\u03BB\u03AC\u03B4\u03B1',
         'http://feeds.feedburner.com/skai/PLwa'),
        (u'\u039A\u03CC\u03C3\u03BC\u03BF\u03C2',
         'http://feeds.feedburner.com/skai/aqOL'),
        (u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03BA\u03AE',
         'http://feeds.feedburner.com/skai/yinm'),
        (u'\u039F\u03B9\u03BA\u03BF\u03BD\u03BF\u03BC\u03AF\u03B1',
         'http://feeds.feedburner.com/skai/oPUt'),
        (u'\u03A4\u03B5\u03C7\u03BD\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1',
         'http://feeds.feedburner.com/skai/fqsg'),
        (u'\u0391\u03B8\u03BB\u03B7\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2',
         'http://feeds.feedburner.com/skai/TfmK'),
        (u'\u03A5\u03B3\u03B5\u03AF\u03B1',
         'http://feeds.feedburner.com/skai/TABn'),
        (u'\u03A0\u03BF\u03BB\u03B9\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2',
         'http://feeds.feedburner.com/skai/ppGl'),
        (u'\u0391\u03C5\u03C4\u03BF\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7',
         'http://feeds.feedburner.com/skai/HCCc'),
        (u'\u03A0\u03B5\u03C1\u03B9\u03B2\u03AC\u03BB\u03BB\u03BF\u03BD',
         'http://feeds.feedburner.com/skai/jVWs'),
        (u'\u03A0\u03B1\u03C1\u03AC\u03BE\u03B5\u03BD\u03B1',
         'http://feeds.feedburner.com/skai/bpAR')
    ]
PK�X
��a!!skanderborglokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X�J��� skanderborglokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Skanderborg
'''


class SkanderborgLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Skanderborg'
    description = 'Lokale og regionale nyheder, sport, kultur fra Skanderborg og omegn på skanderborg.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Skanderborg', 'http://skanderborg.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Skanderborg', 'http://skanderborg.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Skanderborg', 'http://skanderborg.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Skanderborg', 'http://skanderborg.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Skanderborg', 'http://skanderborg.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Skanderborg', 'http://skanderborg.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X/2�)��skeptic.png�PNG


IHDR  D���kPLTE# ��� !"���a^_*&'734������������412������URS���3/0��Ղ�����,)*'#$���dab,()������]Z[)%&���WTU���������/+,������������;78��វ�hef������623���xvv���:78���QNO��ʼn�����`]^+'(�������igg���$ !zxx���ROP���OLMfcd���ZWW������������956���&"#SPP`^^���dbb��ܨ��lij���KHI����~gde��b_`������NKL�����������wtu[XYifg���][[YVV��ؿ��<89SOP523���401~||VSS���VSTU�p�#IDATx��PS��@��Lڵm}��m۶��z��#Ɂ����L��7[�3�Ikd}�U��]���?����r���=�`�T+6��B�Y����ʧ�?�WȺz�A�ى�p�PThq�mb���R����}�$I���AI��il|������}�S���9e3Y����R��,g4�յX��$3��A�=�
 h6B�`����>p�8�/��I���'��� =.�f��N����N��^!���@�0RO9���9��j�
���L�IPy�Vڰ� �"j�FIEND�B`�PK�Xg"����skeptic.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class Skeptic(BasicNewsRecipe):
    title = u'The Skeptic'
    description = 'Discussions with leading experts and investigation of fringe science and paranormal claims.'
    language = 'en'
    __author__ = 'Starson17'
    oldest_article = 31
    cover_url = 'http://www.skeptricks.com/images/Skeptic_Magazine.jpg'
    remove_empty_feeds = True
    remove_javascript = True
    max_articles_per_feed = 50
    no_stylesheets = True

    remove_tags = [dict(name='div', attrs={'class': ['Introduction', 'divider']}),
                   dict(name='div', attrs={'id': ['feature', 'podcast']}),
                   dict(name='div', attrs={'id': re.compile(
                       r'follow.*', re.DOTALL | re.IGNORECASE)}),
                   dict(name='hr'),
                   ]

    feeds = [
        ('The Skeptic', 'http://feeds.feedburner.com/Skepticcom'),
        ('E-Skeptic', 'http://www.skeptic.com/eskeptic')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.addheaders = [('Accept', 'text/html')]
        return br

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                    '''
PK�X��3�UUskeptical_enquirer.png�PNG


IHDR  szz�IDATx^��{l�ƿs�٧��Y��`q `�kJ�	i�4!4�HU	�(y��U�*iQ�K�چD�&@C�*�J[�А��?p�@S �%��/lc�{gg�v=��h�|���cW��|��
����ڎ�.��N�R�����;��fڻ�o������v�~O���+��x�׾���k�}�vњO7��R8v��Z�U�gvaAx:�9��'"�?l$o��FK�JW(�m((�D`2����'đF_��[�7����=]��DCp��
�{��*o�z�����ȪH&�l��
�^��a	6RV���Rd�Z���?8�W�iqM�;g���{��>�;���n����|�|2�<m�^&A���W���D4�¨�~�e"b&ћFG�:���a)ʊG�N�W�~�������zӚ�o�h�G�磍h
5�xd��}��"�"?��'c�4P� Iȵ�r��R6�����~�t��Of�$������z���lQC}��[[l@)����e���~�'_,)�z݇;óq[UB�6l(u��bb��‰hv��g��m	�؜�ڲ�q������g�v
<z�EL�UV���ҙ��

&�x�X^{fg�'��j•K9��`�Ӗ�z��XFl
D"5=P����������7>j�;�5s��?����_B��I���5s�\6��_k����0"N����u���iM�o���{���%�]���@u˻}ǶE2��jaaix�BMT�J���KL����a��gSQ�:&��;V4�r���<�dg*���)�Ţ���Y+2@n�c��R��i�g�s�7t}�X��Bu+�_<��|�?��8x��Zɘ�`!m� r+���h .J��S�Fo%��K��6�w|�d�ny.�;��-AVh�#$�,<YR9@c��+��LrL�`�5���;��=���TU�m�5/l�@��N@i�Z�@��k�\�Ie���L
�H(�Y#p�,�`�	�:Q���8�K�mJ�A�����4(��k���0S𒕅'aX��r*M��Bi%p�i���3L&BX�Ě�	:����t����B�*�Ra��X;������+^ґ�@X���:|,�@�DҊ²	�I�pAʹ�&PT���r๽�H��<DP�� uR��F
<��e%�����*�p��
�c 7��M�5��`��耄Jw{�ӪC�F���;w�(JA��\�+�hT�k�"�f��ze�&;�����IhD�k��p�mp��|�0m�zbvΨ��(�����^�a���D�M�MB/�;��Ȋ]��^��R�d?�g�z�X��Gz]��5D��Ul���� �Ԝ�\!��=W@Q�e��?���6�C;bK�~�ڂw�F���8�"8�`���׀����� (3R����:����w�F]��7��Er�^P�H��)+�7R�!^��*=E
����뭵^���b�s[p��e���5_Y�o�E��j�,7	v�`�$�ʜ��(u*T���IN����j_�c�{����u~���݂�*�;�'����xe�H
@#�5���F��n�Dn� �Ch3�T4V�e�]9�O�׃���=������P�s^��Cr�V��I���G�P<��
)�̀
�!x=s �Jet���?���&�V{@ ���|�/G*}5Gmk�V����f#I.�t�0lT8
,'Cꭰ��NC�'�f��0�K�Ea1ܧV��
�<5���
��"#A�<���C���/�`��J%��,8U�`X`b�r"������ �����~>��m�R�蒦Ǯ�j��נ�S�N�����a�����B^����>Jfe�sA�B6�Fi��6#�L�nfl�Z��#�ϭ������@�㼍8x�h�k�&��Z�]��ZHz����2cv*OV�3��9`)cgU`����'#ߚ��0�c5��b"k�׈C]�+���Y��h�kM���L�((%&����d��R6���Ԫ�OnU �:��[��+�IEND�B`�PK�XÃ�(i
i
skeptical_enquirer.recipe__license__ = 'GPL v3'
__copyright__ = '2022, Howard Cornett howard at myreadinglife.com>'
'''
https://skepticalinquirer.org/
'''

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 FreeInquiry(BasicNewsRecipe):
    title = 'The Skeptical Inquirer'
    __author__ = 'Howard Cornett'
    description = 'The Magazine for Science and Reason'
    publisher = 'Center for Inquiry'
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'en'
    ignore_duplicate_articles = {'url'}
    remove_empty_feeds = True
    needs_subscription = True
    extra_css             = """
                            .entry-header{
                                          text-transform: uppercase;
                                          vertical-align: baseline;
                                          display: inline;
                                         }
                            ul li{display: inline}
                            """

    remove_tags = [
        classes(
            'main-navigation swp-social-panel see-more user-admin d-print-none post-18669 wc-memberships-message'
        ),
        dict(id=['sidebar-TOC', 'loginModal']),
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://skepticalinquirer.org/member-login/')
            br.select_form(name='loginform')
            br['log'] = self.username
            br['pwd'] = self.password
            br.submit()
        return br

    def parse_free_inquiry_index_page(self, currenturl, seen):
        self.log('Parsing index page', currenturl)
        soup = self.index_to_soup(currenturl)
        cover = soup.find('img', class_='attachment-medium')
        cover_img_split = cover['data-srcset'].split(',')[2]
        cover_img = cover_img_split.split()[0]
        if cover is not None:
            self.cover_url = cover_img
        for row in soup.findAll('div', attrs={'class': 'article-row'}):
            for info in row.findAll('div', attrs={'class': 'article-info'}):
                p = info.find('p')
                desc = p.text
                for span in info.findAll('span'):
                    if span.find('h5') is not None:
                        for h5 in span.find('h5'):
                            if h5 is not None:
                                art_title = h5
                            else:
                                art_title = ''
                            if span.a['href'] is not None:
                                url = span.a['href']
                            else:
                                url = ''
                            seen.add(url)
                            self.log('Found article:', art_title)
                            yield{
                                'title': art_title,
                                'url': url,
                                'description': desc
                            }

    def parse_index(self):
        baseurl = 'https://skepticalinquirer.org/latest/'
        articles = []
        seen = set()
        articles.extend(self.parse_free_inquiry_index_page(baseurl,seen))

        return [('Magazine Articles', articles)]
PK�X곿PPskylife.png�PNG


IHDR  szz�IDATxڕVx]�<u1��۶m۶]ێk�Vʨ6�����ۍ�����)s~����V���
6�*zC���\��{�7fkҍY�n̄xS�,=~�~�ϧ���|���&� ��v��z�JSQ�I��#��e�4XV�t2���<s(���˻P^���4j�|�k�,O&��:bY���a�t�MV����74��T%LŃa�	�ހ���P?{ʻ�@y�vr�6���FN�@̌7��:ܪ(>�����<M~��C�����u!,�&��D9Z�n1ü`*�ǯ#�$��q�b��.5��TQ[Z�H��#���Kw\/�rGºa&����?�]W�b�[y)HL�5I�XW}z˖k	¥p����s'ò:��?a��/���
0M�+�AU�}�G'*#� /�OuUiiAh�e5紛rG��*�)�r��~p��� �ā��͆+�n�B��S������^����ZfRU/��h5���G��+�i�o�x
��wB�+
b�Ňl��™�-��>�ҁZ*CIpo�tDz�?Lͩ/;�!�u�պqL�r�M䷧8<dʝWV���2\��2�/��P/�*���ˏ
�C��
à��Oº#��C�?�;3��2�"�au�0L�拹/�<��4�ۮ6YVҐ�,8�~�"�#�W���m���~{�w6�#߷z�hzmmO�q�~��sG��.?s=K�r�c�3nO���\:�%(3�0�c���{^��n�E�X��	n�Lb�'S_��'"��5(��bD�n�����^,�a�~��-�c?�&��'S�~ة����V�\r`tWo����.�7fi��AP?}����n��ƃI�xM��6<��#0�C��2`��䧯�@N�6v�n�Fw��o�b�Q�H������cG� ]���!ޜ������G_]�k��?gH��B�`M@X���x����/�U>�[����ԫ���t>�q��38�i���pa���*�/��;=G��/�b�8�]۝²c;[�Cټgg��›n�Ḝ���Q�
�n�92�ш����� ��#�����W�[p���w�yo�=V������Of7�`�(c�i����G]f"NS�R�Y�Kz������]{�-(xF�R�I2:�_�N�1�W�#�fgNӥ����B[���?�'
�����H|�~�������G�Q�/�����=0����ڋ�EX7o�	�÷ �~�e�.��6�=���z��)z@��뀹o�9��|�?�m�]�P�8��;���t��}�s��rqJ����r)��D�}ϩ/��	T��;�ΝMՕ����.�Z5���h�����!��4lN�G���K�ɗ�L�{J=�^W�};,�����j&Y�Y�yUEed_T'D�m#Ni">�Ô�$��p��cq3�"����)){ͺލ 0.������>��㊰�8�7
��r�6���hT�P�Id�i�p��.�z��o�T�"J��f�P��C�bB��M�N����HQ�a'E�Q�gE3*e�o���m�3��Ut�,��Y�m��֩+�m&?�kW&A�N�O�I)e�|�)\L�rTk�!V4�S�s���E6�G�gY铼�1��7���+#o�K��y�����̛k*��g5�2a2�s�_Op�\���H2����~'���Zj���W:����v�N)��j�HZ*�oLڿ}Gp�<d��[Z��l|@�>�y>���A���wZ���h��b!ұ<^y�����
�ax��IEND�B`�PK�XK���skylife.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class THY (BasicNewsRecipe):

    title = u'Skylife'
    __author__ = u'thomass'
    description = ' Türk Hava Yollarının yayınladığı aylık kültür dergisi (Fotoğrafları da içermesini isterseniz keep_only_tag''da belirttiğim kodu da ekleyin) '  # noqa
    oldest_article = 32
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    publisher = 'thomass'
    category = 'genel kültür, gezi,Türkçe'
    language = 'tr'
    publication_type = 'magazine'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }
    # Fotoğrafları da eklemek için: dict(name='div',
    # attrs={'id':['divResimler']})
    keep_only_tags = [dict(name='h3', attrs={'id': ['hpbaslik']}), dict(
        name='p', attrs={'id': ['pyayin', 'hspot', 'picerik']})]
    masthead_url = 'http://www.turkishairlines.com/static/img/skylife/logo.png'
    remove_empty_feeds = True
    remove_attributes = ['width', 'height']

    feeds = [(u'SKYLIFE', u'http://feed43.com/7783278414103376.xml')]
PK�X�s����slashdot.png�PNG


IHDR(-S0PLTE64BDJLVT^\bd,^\4bd$JLLz|��t�������������\�%�nIDATx�e��1���o�����.K��/�K�?TI��R^��/b�Ύ���ŋB`��f�jj���!j�#�
0T]��>�M�0A���4W���L� �)���IEND�B`�PK�X$	4w==slashdot.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement

__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net> edited by Huan T'

from calibre.web.feeds.news import BasicNewsRecipe


class Slashdot(BasicNewsRecipe):
    title = u'Slashdot.org'
    description    = '''Tech news. WARNING: This recipe downloads a lot
    of content and may result in your IP being banned from slashdot.org'''
    oldest_article = 7
    simultaneous_downloads = 1
    delay = 3
    max_articles_per_feed = 100
    language = 'en'

    __author__ = 'floweros edited by Huan T'
    no_stylesheets = True
    use_embedded_content = False
    keep_only_tags = [
        dict(name='div', attrs={'class': 'story'}),
        dict(name='div', attrs={'class': 'body'}),
        dict(name='ul', attrs={'id': 'commentlisting'}),
    ]

    feeds = [
        (u'Slashdot',
         u'http://rss.slashdot.org/Slashdot/slashdot'),
        (u'/. IT',
         u'http://rss.slashdot.org/Slashdot/slashdotIT'),
        (u'/. Hardware',
         u'http://rss.slashdot.org/Slashdot/slashdotHardware'),
        (u'/. Linux',
         u'http://rss.slashdot.org/Slashdot/slashdotLinux'),
        (u'/. Your Rights Online',
         u'http://rss.slashdot.org/Slashdot/slashdotYourRightsOnline')
    ]
PK�X>�N.��	slate.png�PNG


IHDR  D���DPLTEA8A8A9B9B9C:C:C;D;D<E<F!>J%AK'CL(DM)EN*FO+GP,GR.IR/JS0KU3M];U^>W`@YdD\hIajKbqTkrUksVluXnuYoz_t}cwey�g{�h|�j}�l�n��r��v��y��{����������������������������������������������Ź�Ź�ź�ƺ�ƻ�Ǽ�ɾ�ʿ���������������������������������������������������������������������������������������������������������������������^	IDATx�bl@B�P'=,�Q>��m۶m۶�z��L'�w˰���>;�\�(e�ﴞ��Ҡ��PR�T����
zNR����|�e�nOV�T��A*���������\���A�]��iG6"�Ӓ���|$j�G"�1G�Y-��U���e�_�q]����Oa?��{S�C����I%1�h��S�	���K.<+2Y��D�\
$oG����+y��-i���n�s}�	G�1��*xj��W�P�;���u�����&^���IEND�B`�PK�X[�Cm@@slate.recipe#!/usr/bin/env python
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

__license__ = 'GPL v3'

'''
calibre recipe for slate.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class Slate(BasicNewsRecipe):
    title = 'Slate'
    description = 'A general-interest publication offering analysis and commentary about politics, news and culture.'
    __author__ = 'Kovid Goyal'
    timefmt = ''
    no_stylesheets = True
    language = 'en'
    encoding = 'utf-8'
    remove_attributes = ['style']
    INDEX = 'https://slate.com'
    compress_news_images = True

    keep_only_tags = [
        classes('article__header article__content'),
    ]
    remove_tags = [
        classes('social-share slate-ad newsletter-signup in-article-recirc'),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-srcset': True}):
            img['src'] = img['data-srcset'].split()[0]
        return soup

    def parse_index(self):
        ans = []
        for sectitle, url in (
                ('News & Politics', '/articles/news_and_politics.html'),
                ('Technology', '/articles/technology.html'),
                ('Business', '/articles/business.html'),
                ('Arts', '/articles/arts.html'),
                ('Life', '/articles/life.html'),
                ('Health & Science', '/articles/health_and_science.html'),
                ('Sports', '/articles/sports.html'),
                ('Double X', '/articles/double_x.html'),
        ):
            url = self.INDEX + url
            self.log('\nFound section:', sectitle, url)
            articles = self.slate_section_articles(self.index_to_soup(url))
            if articles:
                ans.append((sectitle, articles))
            if self.test and len(ans) > 1:
                break
        return ans

    def slate_section_articles(self, soup):
        ans = []
        main = soup.find('section', **classes('main'))
        if main is None:
            return ans
        for div in main.findAll(**classes('section-feed__item')):
            a = div.find('a')
            url = a['href']
            if url.endswith('/'):
                continue
            h = a.find(['h2', 'h3', 'h4'])
            title = self.tag_to_string(h)
            desc = ''
            for q in ('byline', 'dek'):
                span = div.find(attrs={'class': lambda x: x and ('-' + q) in x})
                if span is not None:
                    desc += self.tag_to_string(span).strip()
            self.log('\t' + title)
            self.log('\t\t' + url)
            ans.append({'title': title, 'description': desc.strip(),
                        'date': '', 'url': url})
        return ans
PK�X��gslate_star_codex.png�PNG


IHDR  ���IDATx^�VYlT��Ϲ�������q\8�J["hhڪi���*ei��CS��H���FI�,D&�4�@Ұ/J���/0^�;�6�ų����+�>�/U�9��s��3߯���t�ӯ_��&0��'� �!z����ƌ\~P���%��`����B�W�K�"�_��ys9ʶT��z�
rh6�/|d���4ۖ5924;>��
��
C��ޢ�k�-�
�����P�s^ry*�e���BYVt��Qe�x����阙��g߼IL��Ď���<_I��X�&dqM骦��e
�*�v��̓m�S(����2�rY#�0u/vc`l|ƜIY�X��U�L,���l�U�<���̛7��c��᦯~g��]�N�b=�;F{��HL�_��~�_x;5�y���{�����vw�޲�-�9�G�x�9�k�_h���?�����>�Σ����e��9���^��t]�0:9yf����b]��?���ν�¦�l˾Q�0&�Ɔ�6�����,�055522�Ng`���)x::Je����T&s���'�w��l�Y-�I 
�](!X�8N�lK�E��z��Z?i�D"�P�>rtxx!�ٜ�j�l8<5����\�C���ܪ(��8$I��Ls��Az8��1�E�D���8������a˲�'%�Me��u����(ۛ�	�c�Y�P���Ձ ǥal��mk�81V3aӦM��=|�С;�l�bE��mK�4�h�p������n���I��|(�"vܙ�8(���ϱ�j ��6��*K�.9<8�|�4�����|Em}yФ���Xy6�6�t��9�c��l*W�
��P���J9�*++�˰
 J
�����9�2��IB��W-m�1��d}�#@�	`�۴�c`�\.Wcc�Š,�:~���.�\�a���������Zb���@m�xav1kRDA�|A92������&�[Բx�R�^(�����L�3�iC�׍8۱������X�:.�<�X\�b[]�����W��]]�����(ɳ�AUY�P�LF�(���s��;�
��؄�6Z�?&��g�^}��ʕ%�W]�6����?��'u����!J��P�2��:[VT�E��I�;߯�xb���RDC��d��0��&�a�:�T5O���Y�!��c�O>s������p�E����ۘ�h�f4���6��MDeY]�3ͼy[X&�a�1̦�t�Z���m�Zs�Ƥi-k�#�ϓ��==�w�{�=�����b��YK�E�wL��x� 6�X,�&	䡆��ow\Z���ewG((�
`5pa��>��N��f����DZ�:�	�aМe(�hO���ԇ~����Kg�?����G^�v�՝��>�������È8�&�IÎ�Җm�vu���}��Wv����/����;�$�n~ee����b�Cϭ�c�%��%˚x^-�*O�S�Ϝon^^TXt7c�ݙ�0��N�X�XP\��V�0��(��s��n^��~�ַ��mY��������O^��F~0TT]����"@mmi޻{��ζ֠�[TS��yEMiyUq1�}�x,�j��@-�MsY8X�q�2*_.{���/�Bwgd(�����Ͷ�%
@����_z�v��o��ݝ�G����zGEMuii��s�^���:�o�R�Rb a��2R1�^4U-5:=,r�R�K+�;��?�њI�g'w�;V\���&Բ|�����ʕ����y�٘
�y�Y4	�1�xj�إ�T��4�����T
,"+��J�����a�X�|�[���p��-�5�s�
����`�)%����]Ub\D��=��eĂ\�M�23#�G@�c4��qd.��e#B��9��R'uP��4(!N��@�mE9�n���a̋���ɖ9*G8�?3Lj!xr��)F��/��Y�\u��IEND�B`�PK�X��a��slate_star_codex.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe
import re

__license__ = 'GPL v3'
__copyright__ = '2015, Ned Letcher <ned at nedned.net>'


"""
calibre recipe for Slate Star Codex.
"""


class SlateStarCodex(BasicNewsRecipe):
    title = u'Slate Star Codex'
    description = 'IN A MAD WORLD, ALL BLOGGING IS PSYCHIATRY BLOGGING'
    __author__ = 'Ned Letcher'
    max_articles_per_feed = 20
    language = 'en'
    encoding = 'utf-8'
    no_stylesheets = True
    # alternative candidate for keep_only_tags:
    # [{'attrs':{'class':['pjgm-posttitle', 'pjgm-postmeta', 'pjgm-postcontent']}}]
    keep_only_tags = [
        dict(name='div', attrs={'class': re.compile(r'\bpost\b')})]
    remove_tags = [
        dict(name='div', attrs={'class': re.compile(r'\bsharedaddy\b')})]

    def get_archived_posts(self):
        soup = self.index_to_soup('http://slatestarcodex.com/archives/')
        entries = soup.findAll(attrs={'class': 'sya_postcontent'})

        posts = []
        for entry in entries:
            atag = entry.find('a')
            url = atag['href']
            post = {
                'title': atag.contents[0],
                'url': url,
                'date': "-".join(url.strip('/').split('/')[-4:-1]),
            }
            posts.append(post)
        return posts

    def parse_index(self):
        posts = self.get_archived_posts()
        return [[self.title, posts]]
PK�X��d���	slovo.png�PNG


IHDR  szz��IDATx^��[l\W����g�33���7��ƴU��$��!J�%� .}�R���T��@UBQ����T� �xh�"B�D�zIR)PҤEi�*��x<㹞�^(��u�	�OZ�G�}t�^GXA��7�ڀ4����d<O�$�ǩB8�OD��T��<c$k�5"0bD�SpC�BoO&��m(E��"�vT�4%c�+d�~���._�瀺�yH��v�DC~3~�؝[�~� ���4i�?��>��&�Xh�u��?����Wr���}t������� l���j~�-;wZF�6��6�|�,��m�L@�XK'�[_Abڭ`[6Î-�~�؉����k�f��Z�@��%x�i�G�LX���#PeMĀg�j�R�г};���wn{���>>��Y��V��;�}���k��.ؿ�TQ�Z��hp;֕��G�©8a��{_}���=0�<u��o��Ƒo�졯�;�rh!����ƀc��0�8"�uW*W��}�����j���`�}ü��'FJ�n�tߧ^��q���n\�nHc���x^�<�s�̀*�Ʒ|�a�y�o�v�V�2LC
�F��ل4��J��X�7y��LM�����3�nc��P	�.b���XHS@���)i�a�!�e����["�Y��lV|�$&R�1����u*�5�G�IB�$�/X "FPcp,��_�Xb�����;���е�9Ή��,�R���5U�s��ǡ��J#�4�}@p]�!���}""��\E�z���e5�@A����Ad�y30*�S��J���zh�4������Q|k&o�}43���O�U���BG�sH�Ԭ�n�2.�b�\FI��N�t���N�
`�,q�A�>����ߌ�>�v�Q�X����1T��J�p�6�=;Y����_�-+��X����4��|/~�~ؾ�gn^dvrY�����X)�	�l��������OL�f,W��d2��\m�
@2�}>vgf6�mT���.$Qŷx��}�x7���t���l��d��{�ԙ��3�+�դ*�
��w648�����Ľ��8���Ww��m���-$I��ʻd�R���Wk֯.��]�����ę��Q=p�/�bYO�����_L���?�u�п�)`3���F�1&omƈd@�\br�Q��sd�uP}��{�~������2ƻ�1�q���5�ܟ޺~|��?MO]~�SG�+5����z�����c
�J'IR��n9��4i^8��Ʉ���>�
���g?�$�;� ��uM�k((���\{ȱRd���ӣ/�g�_}��g2�#C�"�1��F��7����҃�>��m[�����n�
a}�O�_���O�l(��"e����{Pho��IEND�B`�PK�X�E4���slovo.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class SlovoRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'Abelturd'
    language = 'sk'
    version = 1

    title = u'SLOVO'
    publisher = u''
    category = u'News, Newspaper'
    description = u'Politicko-spolo\u010densk\xfd t\xfd\u017edenn\xedk'
    encoding = 'Windows-1250'

    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False
    remove_empty_feeds = True

    no_stylesheets = True
    remove_javascript = True

    feeds = []
    feeds.append((u'V\u0161etky \u010dl\xe1nky',
                  u'http://www.noveslovo.sk/rss.asp'))

    keep_only_tags = []
    remove_tags = []

    preprocess_regexps = [
        (re.compile(r'<img src="gif/image1.gif">', re.DOTALL | re.IGNORECASE),
         lambda match: ''),
    ]

    def print_version(self, url):
        m = re.search('(?<=id=)[0-9]*', url)

        return u'http://www.noveslovo.sk/clanoktlac.asp?id=' + str(m.group(0))
PK�X�O�Wxxsmashing.png�PNG


IHDR�a?IDATx�}�S��ZG�-�m۶um߱m�6�ƶ���m$e��tv�q:�a{���Y
p�\������n��4���l\
��2X�-�����5ԭ����y�x��F@�;ꎵp޿	q�?�*ۑE6E'���i�0�GA�=���H�
��?���ܟ���ER�	�.A���.dt%�_��W;����A�s�~�����+� ��g��Md4������G�t��)��AZ滑�ɽ������l/�M
�U���ߋ�����9��q�����$�m���1Lv���<(�BS��E���ð�\
&9L&���0W&Ð�_?@=q.��S���#�K@'��2�Ɓ� ���Щ����=�훡��W%�у�S"@�A&듑����Qe�Nw�z��˯߀rC��O2���b�!�Y�3~�dP��$m��
�Dtb���ɤ����S�a��	�^���&�`0i��R<�7�Cq:@����'�Aٹ�s!o��o�P�
&=
i��@"-�Y7r (SK��.5U���c�.����	8�=�	;_����o�v4ᇊ��IEND�B`�PK�X��׏kksmashing.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
from calibre.web.feeds.news import BasicNewsRecipe


class SmashingMagazine (BasicNewsRecipe):
    __author__ = 'Marc Busqué <marc@lamarciana.com>'
    __url__ = 'http://www.lamarciana.com'
    __version__ = '1.0.2'
    __license__ = 'GPL v3'
    __copyright__ = '2012, Marc Busqué <marc@lamarciana.com>'
    title = u'Smashing Magazine'
    description = u'Founded in September 2006, Smashing Magazine delivers useful and innovative information to Web designers and developers. Our aim is to inform our readers about the latest trends and techniques in Web development. We try to persuade you not with the quantity but with the quality of the information we present. Smashing Magazine is and always has been independent.'  # noqa
    language = 'en'
    tags = 'web development, software'
    oldest_article = 7
    remove_empty_feeds = True
    no_stylesheets = True
    encoding = 'utf8'
    cover_url = u'http://media.smashingmagazine.com/themes/smashingv4/images/logo.png'
    remove_attributes = ['border', 'cellspacing', 'align', 'cellpadding',
                         'colspan', 'valign', 'vspace', 'hspace', 'alt', 'width', 'height', 'style']

    def get_extra_css(self):
        if not self.extra_css:
            br = self.get_browser()
            self.extra_css = br.open_novisit(
                'https://raw.githubusercontent.com/laMarciana/gutenweb/master/dist/gutenweb.css').read().decode('utf-8').replace('@charset "UTF-8";', '')
        return self.extra_css

    feeds = [
        (u'Smashing Magazine', u'http://rss1.smashingmagazine.com/feed/'),
    ]
PK�X�V���sme.png�PNG


IHDR  D����PLTE��+.������.2�25������58�"'���������HJ�22�DF�ce����'+���������''�NP䛜�ij�`b�"�����������"'�܇�݃�߉����ጎ⎐␑┕┖◗㜜�25�58�8;�.2�28�8;�;=�'�FJ�""�JL�"'뺻쵶칹�st�{|�RR���HL�HJ�'+堠塢���墤棤稩�NP�gi�jk������no�km����pr����.2�"觨說諭鲲갱�''�'+칺켼콽�����������������������������������������������������������������""��������������+2����Z\�Z]�]]�`b�..���������55�''�"�������������.2��'.��{*��IDATxڕ���@�����Vm۶m۶m�?�I3Y�y��7��[�v�%��|�4�H_�/Y͹�v��u�O?D���c��޳xf9�����US��Y{kw%��OB!TiB��1ـ`��.����T.���L���-�l��q �&�)���*:�g��!Gꁁ\:{d
����m=76 �����:�����⚤dY
Lj�����U@�*J���L��&_�ʉ����S�5Y[qp�b5��FlЫ�?7��Ac"`�"6w���&Fp�6�4Nk���Q���f.-@�x���{S�S_���³�K_�ʉ~��V�0_��&F��g��%��ث�2{�eD¸���
̨��^����Z���u|Ӆ�(��Ь��{O�o;q�������z7I�p��=j#�m��,�����j�?4/�v�7[n�M"��pIEND�B`�PK�X�}���
sme.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class SmeRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'sk'
    version = 1

    title = u'SME'
    publisher = u''
    category = u'News, Newspaper'
    description = u'News from Slovakia'

    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False
    remove_empty_feeds = True

    no_stylesheets = True
    remove_javascript = True

    # Feeds from: http://rss.sme.sk/
    feeds = []
    feeds.append(
        (u'Tituln\u00E1 strana', u'http://rss.sme.sk/rss/rss.asp?id=frontpage'))
    feeds.append((u'Naj\u010D\u00EDtanej\u0161ie za 4 hodiny',
                  u'http://rss.sme.sk/rss/rss.asp?id=smenajcit4'))
    feeds.append((u'Naj\u010D\u00EDtanej\u0161ie za 24 hod\u00EDn',
                  u'http://rss.sme.sk/rss/rss.asp?id=smenajcit24'))
    feeds.append(
        (u'Z domova', u'http://rss.sme.sk/rss/rss.asp?sek=smeonline&rub=online_zdom'))
    feeds.append((u'Zahrani\u010Die',
                  u'http://rss.sme.sk/rss/rss.asp?sek=smeonline&rub=online_zahr'))
    feeds.append((u'Z domova + zahrani\u010Die',
                  u'http://rss.sme.sk/rss/rss.asp?sek=smeonline'))
    feeds.append((u'Ekonomika', u'http://rss.sme.sk/rss/rss.asp?sek=ekon'))
    feeds.append((u'Kult\u00FAra', u'http://rss.sme.sk/rss/rss.asp?sek=kult'))
    feeds.append(
        (u'Koment\u00E1re', u'http://rss.sme.sk/rss/rss.asp?sek=koment'))
    feeds.append((u'Volby', u'http://rss.sme.sk/rss/rss.asp?sek=eVolby'))
    feeds.append((u'\u0160port', u'http://rss.sme.sk/rss/rss.asp?sek=sport'))
    feeds.append((u'Futbal', u'http://rss.sme.sk/rss/rss.asp?sek=futbal'))
    feeds.append((u'Hokej', u'http://rss.sme.sk/rss/rss.asp?sek=hokej'))
    feeds.append((u'Po\u010D\u00EDta\u010De',
                  u'http://rss.sme.sk/rss/rss.asp?sek=pocit'))
    feeds.append((u'Mobil', u'http://rss.sme.sk/rss/rss.asp?sek=mobil'))
    feeds.append((u'Veda', u'http://rss.sme.sk/rss/rss.asp?sek=veda'))
    feeds.append((u'Natankuj', u'http://rss.sme.sk/rss/rss.asp?sek=natankuj'))
    feeds.append((u'Auto', u'http://rss.sme.sk/rss/rss.asp?sek=auto'))
    feeds.append(
        (u'Dom\u00E1cnos\u0165', u'http://rss.sme.sk/rss/rss.asp?sek=domac'))
    feeds.append((u'\u017Dena', u'http://rss.sme.sk/rss/rss.asp?sek=zena'))
    feeds.append((u'Z\u00E1bava', u'http://rss.sme.sk/rss/rss.asp?sek=zabava'))
    feeds.append((u'Hry', u'http://rss.sme.sk/rss/rss.asp?sek=hry'))

    keep_only_tags = []
    keep_only_tags.append(dict(name='div', attrs={'id': 'contenth'}))
    keep_only_tags.append(dict(name='div', attrs={'class': 'articlec col'}))

    remove_tags = []
    remove_tags.append(
        dict(name='div', attrs={'id': re.compile('smeplayer.*')}))

    remove_tags_after = [dict(name='p', attrs={'class': 'autor_line'})]

    extra_css = '''
                @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/LiberationSans.ttf)}
                body {font-family: sans1, serif1;}
                '''

    def print_version(self, url):
        parts = url.split('/')
        id = parts[4]

        return u'http://korzar.sme.sk/clanok_tlac.asp?cl=' + str(id)
PK�X8�tt��smh.png�PNG


IHDR���R!PLTE������������兽�u��d��S��2��|¹��5tRNS@��f/IDATx�c p!3�Vq�\���q�����b``]�@9f-(�k9�A���m�hIEND�B`�PK�X&��
smh.recipe__license__ = "GPL v3"
__copyright__ = "2010-2011, Darko Miletic <darko.miletic at gmail.com>"
"""
smh.com.au
"""
from calibre.web.feeds.news import BasicNewsRecipe


class Smh_au(BasicNewsRecipe):
    title = "The Sydney Morning Herald"
    __author__ = "Darko Miletic"
    description = "Breaking news from Sydney, Australia and the world. Features the latest business, sport, entertainment, travel, lifestyle, and technology news."  # noqa
    publisher = "Fairfax Digital"
    category = "news, politics, Australia, Sydney"
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    ignore_duplicate_articles = {"title", "url"}
    use_embedded_content = False
    encoding = "utf-8"

    language = "en_AU"
    remove_empty_feeds = True
    masthead_url = "http://images.smh.com.au/2010/02/02/1087188/smh-620.jpg"
    publication_type = "newspaper"

    keep_only_tags = [dict(name="article")]
    remove_tags = [
        dict(name=["button"]),
        dict(id=["saveTooltip"]),
        dict(attrs={"class": "noPrint"}),
    ]

    # https://www.smh.com.au/rssheadlines
    feeds = [
        ("Latest News", "https://www.smh.com.au/rss/feed.xml"),
        ("Federal Politics", "https://www.smh.com.au/rss/politics/federal.xml"),
        ("NSW News", "https://www.smh.com.au/rss/national/nsw.xml"),
        ("World", "https://www.smh.com.au/rss/world.xml"),
        ("National", "https://www.smh.com.au/rss/national.xml"),
        ("Business", "https://www.smh.com.au/rss/business.xml"),
        ("Culture", "https://www.smh.com.au/rss/culture.xml"),
        ("Technology", "https://www.smh.com.au/rss/technology.xml"),
        ("Environment", "https://www.smh.com.au/rss/environment.xml"),
        ("Lifestyle", "https://www.smh.com.au/rss/lifestyle.xml"),
        ("Property", "https://www.smh.com.au/rss/property.xml"),
        ("Sport", "https://www.smh.com.au/rss/sport.xml"),
        ("Ruby League", "https://www.smh.com.au/rss/sport/nrl.xml"),
        ("AFL", "https://www.smh.com.au/rss/sport/afl.xml"),
    ]
PK�X���ӹ	�	smilezilla.recipefrom __future__ import absolute_import, division, print_function, unicode_literals

import os
import re

from calibre.ptempfile import PersistentTemporaryDirectory
from calibre.web.feeds.news import BasicNewsRecipe


class SmileZilla(BasicNewsRecipe):

    title = 'SmileZilla'
    language = 'en'
    __author__ = "Will"
    JOKES_INDEX = 'http://www.smilezilla.com/joke.do'
    STORIES_INDEX = 'http://www.smilezilla.com/story.do'
    description = 'Daily Jokes and funny stoires'
    oldest_article = 1
    no_stylesheets = True
    encoding = 'utf-8'

    remove_tags = [dict(name='table')]

    def _get_entry(self, soup):
        return soup.find('form', attrs={'name': 'contentForm'})

    def _get_section_title(self, soup):
        title_div = soup.find('div', attrs={'class': 'title'})
        return self.tag_to_string(title_div).strip()

    def parse_index(self):
        self.tdir = PersistentTemporaryDirectory()

        def as_soup(url):
            soup = self.index_to_soup(url)
            for img in soup.findAll('img', src=True):
                if img['src'].startswith('/'):
                    img['src'] = 'http://www.smilezilla.com' + img['src']
            return soup

        articles = []

        soup = as_soup(self.JOKES_INDEX)
        jokes_entry = self._get_entry(soup)
        section_title = self._get_section_title(soup)
        todays_jokes = []
        for i, text in enumerate(re.findall(r'<hr.*?>(.+?)<table', type(u'')(jokes_entry), flags=re.DOTALL)):
            title = 'Joke {}'.format(i + 1)
            with open(os.path.join(self.tdir, 'j{}.html'.format(i)), 'wb') as f:
                f.write(b'<html><body>')
                f.write(text.encode('utf-8'))
                todays_jokes.append({'title': title, 'url': 'file:///' + f.name})
        articles.append((section_title, todays_jokes))

        soup = as_soup(self.STORIES_INDEX)
        entry = self._get_entry(soup)
        section_title = self._get_section_title(soup)

        todays_stories = []
        for i, text in enumerate(re.findall(r'<hr.*?>(.+?)<table', type(u'')(entry), flags=re.DOTALL)):
            title = 'Story {}'.format(i)
            with open(os.path.join(self.tdir, 's{}.html'.format(i)), 'wb') as f:
                f.write(b'<html><body>')
                f.write(text.encode('utf-8'))
                todays_stories.append({'title': title, 'url': 'file:///' + f.name})
        articles.append((section_title, todays_stories))

        return articles
PK�XC&�	smith.png�PNG


IHDR  D����PLTE�����ô����������߼��222��핕����������HHH���"""��������Խ������+++������TTT���ooojjj�����������������������������ccc�����������̔����響����gggmmm������BBB555��������������...iiiNNN���������www�����񚚚ZZZ������DDD�R�tRNS���Z�IDATxڼу��@м�yvm��/�ۥۻ�83{x�'�=�{�/Rh�_w����/;��߹��/	���|��|��h�fC���.�����������,��+Lj��\Xc@¦��іٸ;@L��
�
�n�Lg70�C�X	�k](K��G�
��2M�yx�^�>8ʗ��_���%�`�����Z�=�Q�\IEND�B`�PK�X��f?
?
smith.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


CATEGORIES = {
    'smart-news': 'Smart News',
    'history': 'History',
    'science-nature': 'Science',
    'innovation': 'Innovation',
    'arts-culture': 'Arts & Culture',
    'travel': 'Travel',
    'smithsonian-institution': 'At the Smithsonian'
}


class Smithsonian(BasicNewsRecipe):

    title = 'Smithsonian Magazine'
    __author__ = 'Kovid Goyal'

    description = 'This magazine chronicles the arts, environment, sciences and popular culture of the times. It is edited for modern, well-rounded individuals with diverse, general interests. With your order, you become a National Associate Member of the Smithsonian. Membership benefits include your subscription to Smithsonian magazine, a personalized membership card, discounts from the Smithsonian catalog, and more.'  # noqa
    language = 'en'
    category = 'news'
    encoding = 'UTF-8'
    keep_only_tags = [
        classes('article-header articleLeft')
    ]
    remove_tags = [
        classes(
            'hidden-phone hidden-tablet hidden-desktop slideshow-nav associated-container'
            ' widget-article-pixel tag-list recommended-videos comments'
        )
    ]
    no_javascript = True
    no_stylesheets = True

    def parse_section(self, url):
        soup = self.index_to_soup(url)
        seen = set()
        for al in soup.findAll(attrs={'class': 'article-list'}):
            for article in al.findAll(attrs={'class': 'article-list-item'}):
                div = article.find(attrs={'class': 'article-list-text'})
                a = div.find('a')
                title = self.tag_to_string(a)
                if title in seen:
                    continue
                seen.add(title)
                url = 'https://www.smithsonianmag.com/' + a['href'].lstrip('/')
                if '/tag/' in url:
                    continue
                desc = ''
                p = div.find(attrs={'class': 'article-list-text'})
                if p is not None:
                    desc = self.tag_to_string(p)
                self.log('\t' + title)
                yield {'title': title, 'url': url, 'description': desc}

    def parse_index(self):
        ans = []
        for slug, title in CATEGORIES.items():
            url = 'https://www.smithsonianmag.com/category/' + slug + '/'
            self.log('Parsing section:', title, 'at:', url)
            articles = list(self.parse_section(url))
            if articles:
                ans.append((title, articles))
            if self.test and len(ans) >= self.test[0]:
                break
        return ans
PK�X�g	sn_dk.png�PNG


IHDR  D���4PLTE��������������������������������������������������ܴ�������������������������������������������ݯ�����������������2D+B.B.F������.@+=�����.B+D+F���+@���������.D���p{�������LZg���������.=��������������ϯ�������������ꧯ�';J���������v��������5DP������������DR_�����꧰����2D���������������������"8H��������몲���������܈��'8H��������������⤭�FT]������������������"5F��������BP]���~�����\is����ɢ��.@������5FYbm����������������P\e|�����������p{�������P\f�����������ᙣ����jt~P_gBR\pz������������ޜ�������������ҝ��������������������������h���IDAT�͋�q���{~��,�
)��%Q�C���An�&'�-W�� �Ȍ��rrR��P�?X��|�N�?��0��z�߄~�42ހp�w3��v�����%�ַi�E��)�(0��j�f%A���Yk�����CQh|�x�9��&ۥ5�Hc�`�ڨ���� ��CS-�J����c��&� 9c�j^8�=L|�ǵ+�p#��}S�)���,������Z��������#�E�!fj�Q̔Y��ܢ���.*��nKwo�z�&� �tP���`�L��ޙ��6�<���}�➤���)[����{����"I�@ιnƧ�����L�q��z��˛�%J�ԐA $?}&���x�l@#_T�EڡNP
��d=���Qd5��y�?�'zwr���?�IEND�B`�PK�X5��\\sn_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
sn.dk
'''


class Sn_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'sn.dk'
    description = 'Sjællandske medier'
    category = 'newspaper, news, localnews, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Nyheder', 'http://sn.dk/rss'),

    ]

PK�X�>�snob.png�PNG


IHDR  szz��IDATx����Q����Am�VT�EP۶m��6�mیj۝��ٻ�=�;�/��ֻQ�V��92�=���@�x��X��H�f)�c3�Cl�����ux/|��x��؉CxQ|�HĹ>��= 6�.u��؃4N�WP�E���k��J��Hn7�N�b\���x��n��3Dq�F#���^���۔��H�y+D1�f��E�p��8��G*��qG	p���b.N�#��[yD�7*ҋ!� �&&����
�Q,6 
D��D�,�*�@�L�	Qt3�DQ�D�5�𧈍��_K�M�}�ϴܑ�
��3#=<�᷐§�6��֣��9t1<���Pԧ���9_�o�q�@	����2�����R{�gA��+X�V���(�����u���~����L9Uڗ�E%1���]�Pds�F(�]C�C
t�$��
,��D=dpx���]T�b�����[IEND�B`�PK�X���??snob.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Snob(BasicNewsRecipe):
    title = '\u0421\u043D\u043E\u0431'
    __author__ = 'bugmen00t'
    description = '\u0414\u0438\u0441\u043A\u0443\u0441\u0441\u0438\u043E\u043D\u043D\u043E\u0435, \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0435 \u0438 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0434\u043B\u044F \u043B\u044E\u0434\u0435\u0439, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0436\u0438\u0432\u0443\u0442 \u0432 \u0440\u0430\u0437\u043D\u044B\u0445 \u0441\u0442\u0440\u0430\u043D\u0430\u0445, \u0433\u043E\u0432\u043E\u0440\u044F\u0442 \u043D\u0430 \u0440\u0430\u0437\u043D\u044B\u0445 \u044F\u0437\u044B\u043A\u0430\u0445, \u043D\u043E \u0434\u0443\u043C\u0430\u044E\u0442 \u043F\u043E-\u0440\u0443\u0441\u0441\u043A\u0438.'  # noqa
    publisher = '\u041E\u041E\u041E \u00AB\u0421\u043D\u043E\u0431 \u041C\u0435\u0434\u0438\u0430\u00BB'
    category = 'magazine'
    cover_url = u'https://snob.ru/indoc/tilda/995317/images/tild3233-6631-4664-b663-353636373235__e3057a5fee932ada1aaf.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 5
    max_articles_per_feed = 50

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='div', attrs={'class': 'entry__tags'}),
        dict(name='div', attrs={'class': 'entry__likes'})
    ]

    feeds = [('\u0421\u043D\u043E\u0431', 'https://snob.ru/rss/')]

    def get_article_url(self, article):
        link = article.get('link', None)
        if 'utm_source' in link:
            return link.split('?utm')[0]
PK�Xd
�<��
snopes.png�PNG


IHDR  szz�IIDATxڥ�t$�ƃ�m��&'|�m�[۶mۚY�������u2��d�7o��]�}���[U��qf�.|^X(��	%�<����g�����C!�b�\�$�cB�_�|	�]����P��vK�f���ܤ�"X}F����Pp.�-3C��<Lh̄Ub�@�P�W�2���$�F�#  ��|Y����D���@?�ʷx,ԤQ*B��*q'���P r��$Y�.��T)
����O&�ǰ>������!��%sf]���دL<l��Ƅ��-P�B�C�)���٣��ޱ}3^^�����31�u
��8z���P�E�p?��	�>��AK7���_�vmA���NS��3��*C�EG�z�G��5�
��4g؈v���HP�0ň~��~������*����&���jә���t��ܴ�?v
��p�D<�z���/�hw����76Le�ּ�V'"B��N�mSLXO��?!
,�u�n���i ���2#�0(�����R|d'�Ηw5��K�I��b��t�I�Ȟ�����{�]�\��,�*w<�H�.-\?��� �Z�^<H!�*��3گ���#���Σ��9Z�T(Z���g�>xY7�)��zrY�k`���A����:v�g���qtnܨxDD8ee�"�-�gh����V0�g8w9jӘ����S{�z���@��������v��\���2�2�7��e@U���>��M	�3Jf�\���q�HKN�q@�&��_�����Wpbi�k�6���NJ��-6U��ĉ�Qj\r�(`�pJ�C��z�x#�]��,h/����]����Q(�>���4)�&򣹲3��}Z�/Pd�AE.x3pٵer�.O�W���!k~��j	��ڳfS�&�صHp���$�*,74"�#�usC�i��6�ݨ<��[�)�-La��`�Iq��
��n�C��"�yl����ء?����Q��_y��dԤyS̊kB{�fd�	e�S�ʞ��$[�F�|����k�"ǝ����r�k3��o�ΚP��6M�.�~��}�/���л�c��@��7I�@�ā��$*#�����>��`�e`Y,����񩺸`�H���P���Nٌ=�O�X`	M�'��).�>���a󔱆L���+`�/�*���p�� ��=�R��e`����/•�o���.&�9�6����ٟVx�
C�⊦_�Թ@21�����_�IJ�;M����	����x�lɅ���9�t/B|�+�z��H�߹��}&��y��/��/"�?����+��*�
L�IEND�B`�PK�X�v5���
snopes.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Starson17'
'''
snopes.com
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class Snopes(BasicNewsRecipe):
    title = 'Snopes'
    __author__ = 'Starson17'
    description = 'Urban Legends'
    oldest_article = 21
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'Snopes'
    category = 'news, '
    language = 'en'
    publication_type = 'newsportal'
    remove_javascript = True
    no_stylesheets = True

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }

    keep_only_tags = [
        dict(name='h1'),
        dict(name='div', attrs={'class': ['article_text']}),
    ]

    feeds = [
        ('Snopes', 'http://www.snopes.com/info/whatsnew.xml'),
    ]

    extra_css = '''
                    h1{font-family:Trebuchet MS,Bookman Old Style,Arial;color:#75b570}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:medium;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
    '''
PK�XR#�&66
sobaka.png�PNG


IHDR  szz��IDATx��U�#[#�X۶mG߶m�6׶m۶��̯~�amo����nuu�IE*RA�2�*0l=�a\ׄ���
��^�+vM��F�����6�&��ʣ�A��$�uM,���~t f�Ro_��Q@�{@� ����,
��9�㙿��E������Q^h	��%����|��{G���m?��'��}�7Pδ@1I��+#�(*�ݞ�K����:r^�;X��ofh�XD��^--)����G*��;PePs��
i��/W��d'�q��h|K�%V�s� �+���Ď0v'�cvA�@�&��	^h�3���߬�>�;��^�ɓ�ـ�=	���Ux��S�f����]i��Pp+�
��ݭpr�?�Е0�M�����߄z@㿭�] ��w���!��i�lO�����Bv__ĦC탲{ӱ؅1�y@�挓��a���-rY@�
�GI��{�[#��cݿ�^��~ģ�o����,[�QX��\vӐ��N�]Wq�&;֕����Ԁ"��K>Q�^x��I+Y�ek�l�v_N��"���d9!�΅gf��H�f��U}����]�9�u�i�{�z���q;�=o��k�1mN%d���P�4�����(���dH�h���co��U�Z�R�Ax�cL{ĭOyح����&/y�mY�D�Nz�K[����������e�cc�u=�	��{(�7üИI�r��m�TzI�kJ+	B��Ͽer|��Z:���+T�t������*���ޒ���Y��F`��'r����ƴ��nR}���v�/�08��o������iz=�(��Lu:���侯k�J"0
#�(�}�9<\ލL��_�Yꊔ2�c!�ϗ@���r�p̮*���t���
���_R�����h(f�ǘ
���kW�srH��7bL��%�췗��gJIʳ�W&@�'����i�q^hW�q��0��J��(?=��I�J*R��s�6?F
U��IEND�B`�PK�X�֗rll
sobaka.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Sobaka(BasicNewsRecipe):
    title          		  = '\u0421\u043E\u0431\u0430\u043A\u0430.ru'
    __author__            = 'bugmen00t'
    description           = '\u0416\u0443\u0440\u043D\u0430\u043B \u043E \u043B\u044E\u0434\u044F\u0445 \u0432 \u041F\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435'  # noqa
    publisher             = '\u041E\u041E\u041E \u00AB\u0416\u0443\u0440\u043D\u0430\u043B\u044B \u0438 \u0441\u0430\u0439\u0442\u044B "\u0424\u0430\u0431\u0440\u0438\u043A\u0430 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 "\u0422\u043E\u0447\u043A\u0430 \u0420\u0443"\u00BB'  # noqa
    category              = 'magazine'
    cover_url = u'https://static.sobaka.ru/images/post/00/04/31/21/_rotator.jpg'
    language              = 'ru'
    no_stylesheets        = False
    remove_javascript = False
    auto_cleanup   = False
    oldest_article = 7
    max_articles_per_feed = 50

    remove_tags_before = dict(name='div', attrs={'class': 'b-post-view__head'})

    remove_tags_after = dict(name='div', attrs={'class': 'b-post-view__foot'})

    remove_tags =   [
        dict(name='div', attrs={'class': 'b-post-view__telegram-promo'}),
        dict(name='div', attrs={'class': 'b-post-view__tgb'}),
        dict(name='div', attrs={'id': 'comments'}),
        dict(name='div', attrs={'class': 'b-post-view__section'}),
        dict(name='div', attrs={'class': 'b-post-view__share'}),
        dict(name='div', attrs={'class': 'b-post-view__details-col b-post-view__details-col--w1'})
        ]

    feeds = [
        ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://www.sobaka.ru/rss/news.xml')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X$�����sobesednik.png�PNG


IHDR  szz��IDATxڵ�T���	Ao�]b�;���]�R��B��݅���#��z�$��8<�Urξ�S��xF�fvf�WS�R�of�-��!{�l�f��ü��;[��=�Е����E�k_��~�_Φ������%Yz?�vu,A[[R�)�B��h����cđ�	q���`y�خ$�g[�R���yAR_5�RJ&G{'�y�޾��\L��� 
ٔ��m�=�*zR��);�)�t˜��x����m�86�R���O��g��I[���j�b;�+z�ֺ�d�)��S�)�5�ed̢YG�2pb�w�P?OR9o�]M�kwȨ�Hg�ZX�����M��]����sY{��|���$�&C[YW�H<���+j�
®��4���!�Իz�	��$
X�\��%[�(;9|��0����c�z�^Nc�%��\�$�ͬ�o������6�nc�?<ym�� �5��5P���EJ�\�M�G.j��4��c�s3�����VeJܐ�I��(�)vģ��{2<fMӋo�n���?�h+�O�'������a[@3��vs*-<u��w^v��p���4��?���{��3�8@�JŔۇ=�	 �zg���$��7�V��u���{�UB�I���Q��JP2��<�B���(�~���g�1a_�\�mЇW�>%b�?��h~l�[F�*W*F�M`-��[�j�dK�^�51��_Uy�U����{m��tW�EIY�_��O))L�>�nH��O�bc��㧍^���'�t�|��q���wV�A�8�\�(hT�^#_n=`.Q�A����z�{�t������4�G#�>F��w�o2 �)iTW�����Yz
��#��:C(� ��W���n�t>&=g$:_T��E�l��Z�=t\h]I��>0v3�it#���ڸ�I��g����K*���cfʺ]�j��#gz�tm��
=^-��u�_�����.��Og�(��}�#��H;ٔ�dg���#�ԔQ�]炙Z}2�u Zp�Y��J�2���Z�JО�gx����v�ngS����,�p[�5_/\�&�}X[;Y˷�`����'W>kU;�iH0~
nȣ�0�O�y��*A^gCA���S �pI}�R�ܹ�y��v��Y�X��o�
�d�q���:�A��+����)��%�>v��ɶ�ɺ:�g9�q;�w�-�pU����
3��d����G�����s0#P��RD�.���uf��<kD��"�q��C�|�� y[�aPԬ��=hJnl�!�,
�O%���v1K�xJ�D6��$��O�߽���ܣ�(�Bҕ�uuz���q�~NP(`D,?n�����h�h�]ϒ��L��w��C40F�w�t��q띐�v_Rhy����?��;r�!���&rB�7���x��oH3�$��R��!���S�M�Cq�8:XD��
K�x�`���<s���\`�1S��v�ehg�
��iQM���6�Kp��
���:hN��F<
ke�!L��V�۵�x(ok�	f{�V��:�����k6��)����w�q�7�3�;�9�����C�юB�8���+a��
�
,���F���!	��g�8�b1�%=����x�eiɽp��w�^������sV��x0��ƽN5岷c�w3�\��"��
��)=َIEND�B`�PK�X�ḏ�sobesednik.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Sobesednik(BasicNewsRecipe):
    title = u'\u0421\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A'
    description = u'\u0421\u0432\u0435\u0436\u0438\u0435 \u044D\u043A\u0441\u043A\u043B\u044E\u0437\u0438\u0432\u043D\u044B\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438 \u043E \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0435 \u0438 \u0448\u043E\u0443 \u0431\u0438\u0437\u043D\u0435\u0441\u0435'  # noqa
    __author__ = 'bugmen00t'
    publisher = '\u041E\u041E\u041E \u00AB\u0421\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A-\u041C\u0435\u0434\u0438\u0430\u00BB'
    publication_type = 'newspaper'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'ru'
    cover_url = 'https://sobesednik.ru/images/logo1.png'
    auto_cleanup = False
    no_stylesheets = False

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'id': 'article-content'})

    feeds = [(
        u'\u0413\u0430\u0437\u0435\u0442\u0430 "\u0421\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A"',
        'https://sobesednik.com/rss.xml'
    )]
PK�XN����socialdiva.png�PNG


IHDR  ��`IDATx���_h�e���s���ܜ���Tq%H�ZZV
eW�D^* �}@tAH�M7E݄�
E^�M�RZ�fZ��jsS7��s��	�춄N�/�����y���Z��3�^ǚ�nDQ�,O�w�!������G�oJj�2��a���4�����]8~�IP	�0�����V�-� �1~iK��d�

G����A[���3C�ե
r�KsmQ��4Ū�v����I�����o?:�}�7b��m-B@A@1��v��E�{'+�wa��ո|ic�=�U��`;F��!�g["������D�@��EtD1���B)�Q*E�2�᩵+��5���:k��Bx��W��+�t�e\����j
�v��b��e� �"�s��1�b�%�����&�
�m6�X�`fI���6`h��$E���0wwB@h�Fp~�._�ǚb�E��41u�*�y�Q���q$�:
�*B�i��Pj+�Q-�Dp�9��i	�!Ə�LD9�}�elz�����j}�P�#.�r�\F�\�������j'z%ԓE��V�k�v�4s]3�!�^G��8�K:�����YSצ����Z"�sR�
1�Km�#K|��>/4�o�0��a� :�(�*�rzߟ����|�kc?����tV+��%���/'�pd�w��`��܏�u 
9~=?��to���C�h&IK�ata�����9���c]��޻*q	��]��zsw�\�``�8��h,&�sA���=x�օ�3��ؘ���v���Kx�ɍ��M1.�O���8�?�nL�#�[҃@)D(�޸��Q�S�Y�_ݏs'��S�ى�����4�1qc
i��F��
���4񌧅}IEND�B`�PK�X��V���socialdiva.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011'
'''
socialdiva.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class SocialDiva(BasicNewsRecipe):
    title = u'Social Diva'
    __author__ = u'Silviu Cotoara'
    description = u'When in doubt, wear red'
    publisher = 'Social Diva'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Femei'
    encoding = 'utf-8'
    cover_url = 'http://www.socialdiva.ro/images/logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'col-alpha mt5 content_articol'}),
        dict(name='div', attrs={'class': 'mt5'})
    ]

    remove_tags = [
        dict(name='a', attrs={'class': ['comments float-left scroll mt5']}),
        dict(name='a', attrs={'class': ['comments float-left scroll']}),
        dict(name='div', attrs={
             'class': ['rating-container relative float-left']}),
        dict(name='div', attrs={'class': ['float-right social_articol']})
    ]

    remove_tags_after = [
        dict(name='a', attrs={'class': ['comments float-left scroll mt5']})
    ]

    feeds = [
        (u'Feeds', u'http://www.socialdiva.ro/rss.html')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X
��a!!soenderborglokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X}�?��� soenderborglokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Sønderborg
'''


class SoenderborgLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Sønderborg'
    description = 'Lokale og regionale nyheder, sport, kultur fra Sønderborg og omegn på soenderborg.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Sønderborg', 'http://soenderborg.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Sønderborg', 'http://soenderborg.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Sønderborg', 'http://soenderborg.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Sønderborg', 'http://soenderborg.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Sønderborg', 'http://soenderborg.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Sønderborg', 'http://soenderborg.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X+��Z~~
sol_haber.png�PNG


IHDR  szz�EIDATxڵ��A����m[Am۶�F�m�f�ڶm�������&O8���X:���)=ȉ�X����'x�;8�-�JH�nYݱ%�w�
��oq}�"���c8�A��GP�P:O�%���G��۹��E�PD'@E���`=��ݾ��W�{qCs��BI�qb�	�!���E<�(�
P!V�iR����]�Y��
Dj���q�p�w��
5v�O�Ec��Ӱ�R!��$V3P� ���-
!!�\��q#��%Nb	�#7|�pb*$B?����B	��!Q�G�>�pE0quC��D<��l��K7��0�� x��ᜐx(�~؁��	ÂH����sp�!�N#���dȍ\2�e��@R��|�(<@fc�Ax�g&^��[�L�!
O��X���{^L�<] 
w��X����M�פs?�C�#��rZ\�(|�|�Cz$A
�l��l!1�`D�G��y\�+�Ҽ���_f���hV��6�AlpYT��Mp%��yuo:�c�C"���2�+7��K���Ѿ�9`r����t���؈�8��l�ttB	$�i�7ԝ�Qd�AIEND�B`�PK�Xm�^��sol_haber.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2012, Onur Gungor onurgu@gmail.com'
__docformat__ = 'restructuredtext en'

'''
www.sol.org.tr
'''

import datetime

import re

from calibre.web.feeds.recipes import BasicNewsRecipe


class SolHaberRecipe(BasicNewsRecipe):
    title = u'soL Haber'
    oldest_article = 7
    max_articles_per_feed = 100

    language = 'tr'
    __author__ = 'Onur Güngör'
    description = 'Hayata soL''dan bakın..'
    publisher = 'soL Haber'
    tags = 'news, haberler, siyaset, türkiye, turkey, politics'

    conversion_options = {
        'comment': description, 'tags': tags, 'publisher': publisher, 'language': language
    }

    category_dict = {'sonuncu-kavga': 'Sonuncu Kavga',
                     'devlet-ve-siyaset': 'Devlet ve Siyaset',
                     'ekonomi': 'Ekonomi',
                     'enternasyonal-gundem': 'Enternasyonel Gündem',
                     'kent-gundemleri': 'Kent Gündemleri',
                     'kultur-sanat': 'Kültür Sanat',
                     'dunyadan': 'Dünyadan',
                     'serbest-kursu': 'Serbest Kürsü',
                     'medya': 'Medya',
                     'liseliler': 'Liseliler',
                     'yazarlar': 'Köşe Yazıları'}

    end_date = datetime.date.today().isoformat()
    start_date = (datetime.date.today() -
                  datetime.timedelta(days=1)).isoformat()

    section_tuples = [['Köşe Yazıları', 'http://haber.sol.org.tr/arsiv?icerik=kose_yazisi&tarih%%5Bmin%%5D%%5Bdate%%5D=%s&tarih%%5Bmax%%5D%%5Bdate%%5D=%s' % (start_date, end_date)],  # noqa
                      ['Haberler', 'http://haber.sol.org.tr/arsiv?icerik=haber&tarih%%5Bmin%%5D%%5Bdate%%5D=%s&tarih%%5Bmax%%5D%%5Bdate%%5D=%s' %
                          (start_date, end_date)],
                      ['soL postal', 'http://haber.sol.org.tr/arsiv?icerik=postal&tarih%%5Bmin%%5D%%5Bdate%%5D=%s&tarih%%5Bmax%%5D%%5Bdate%%5D=%s' %
                          (start_date, end_date)],
                      ['Bizim Amerika', 'http://haber.sol.org.tr/arsiv?icerik=bizim_amerika&tarih%%5Bmin%%5D%%5Bdate%%5D=%s&tarih%%5Bmax%%5D%%5Bdate%%5D=%s' % (start_date, end_date)]]  # noqa

    # Disable stylesheets from site.
    no_stylesheets = True

    cover_margins = (20, 20, '#ffffff')

    storybody_reg_exp = r'^\s*(haber|kose)\s*$'

    comments_reg_exp = r'^\s*makale-elestiri\s*$'

    remove_tags = [
        dict(name='div', attrs={'class': re.compile(comments_reg_exp, re.IGNORECASE)})]

    keep_only_tags = [
        dict(name='div', attrs={'class': re.compile(storybody_reg_exp, re.IGNORECASE)})]

    def get_masthead_title(self):
        return self.title + "(" + self.end_date + ")"

    def parse_index(self):

        result = []
        articles_dict = dict()

        author_regexp = re.compile('^http://.*?/yazarlar/(.*?)/.*$')
        category_regexp = re.compile('^http://.*?/(.+?)/.*$')

        for section_tuple in self.section_tuples:

            section_title = section_tuple[0]
            section_index_url = section_tuple[1]

            self.log('Bölüm:', section_title, 'URL:', section_index_url)

            soup = self.index_to_soup(section_index_url)

            logo = soup.find('div', id='logo').find('img', src=True)
            if logo is not None:
                self.cover_url = logo['src']
                if self.cover_url.startswith('/'):
                    self.cover_url = 'http://haber.sol.org.tr' + self.cover_url

            view_content = soup.find(
                'div', id='ana-icerik').find('div', attrs={'class': 'view-content'})
            if view_content is None:
                break
            rows = view_content.find('tbody').findAll('tr')

            self.log('Row sayısı', len(rows))
            for row in rows:
                cells = row.findAll('td')

                a = cells[1].find('a', href=True)

                url = a['href']
                title = self.tag_to_string(a)

                if url.startswith('/'):
                    url = 'http://haber.sol.org.tr' + url

                category = section_title
                category_match_result = category_regexp.match(url)
                if category_match_result:
                    category = category_match_result.group(1)

                date = self.tag_to_string(cells[2])

                author = 'soL haber'

                author_match_result = author_regexp.match(url)
                if author_match_result:
                    author = author_match_result.group(1)

                self.log('\tFound article:', title, 'at', url,
                         'published at ', date, 'by', author)
                article = {'title': title, 'url': url,
                           'description': None, 'date': date, 'author': author}
                if category in articles_dict:
                    articles_dict[category].append(article)
                else:
                    articles_dict[category] = [article]

        for category in articles_dict.keys():
            if category in self.category_dict:
                result.append(
                    (self.category_dict[category], articles_dict[category]))
            else:
                result.append((category, articles_dict[category]))

        return result
PK�X7��N��soldiers.png�PNG


IHDR  D���PLTE�������Hw
�tRNS������S�IDATxڝ�
�0uj���A��5�T����HK�eR�L���$`0pc�d�q4p2`�l�{	G�dC��M�s5\�"��טv�"Z��0�W�ޗ�v{��і��l8{��|�MtC[ת��~g_�`n^3mx�.����ܯl��IEND�B`�PK�X�X�N��soldiers.recipe
__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.army.mil/soldiers/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Soldiers(BasicNewsRecipe):
    title = 'Soldiers'
    __author__ = 'Darko Miletic'
    description = 'The Official U.S. Army Magazine'
    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    auto_cleanup = True
    auto_cleanup_keep = '//div[@id="mediaWrapper"]'
    simultaneous_downloads = 1
    delay = 4
    max_connections = 1
    encoding = 'utf-8'
    publisher = 'U.S. Army'
    category = 'news, politics, war, weapons'
    language = 'en'
    INDEX = 'http://www.army.mil/soldiers/'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Frontpage', u'http://www.army.mil/rss/2/')]

    def get_cover_url(self):
        cover_url = None
        soup = self.index_to_soup(self.INDEX)
        cover_item = soup.find('img', attrs={'alt': 'Current Magazine Cover'})
        if cover_item:
            cover_url = cover_item['src']
        return cover_url
PK�X�<ޯ��something_awful.png�PNG


IHDR(-SPLTEP�C�tRNS@��f;IDATx�mΉ	!�Ќ�߲�H��y# @��ѮrCx����K�@FX�����(�S����,DIEND�B`�PK�XH�����something_awful.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class SomethingAwfulRecipe(BasicNewsRecipe):
    title = 'Something Awful'
    __author__ = 'atordo'
    description = 'The Internet Makes You Stupid'
    cover_url = 'http://i.somethingawful.com/core/head-logo-bluegren.png'
    oldest_article = 15
    max_articles_per_feed = 50
    auto_cleanup = False
    no_stylesheets = True
    remove_javascript = True
    language = 'en'
    use_embedded_content = False
    remove_empty_feeds = True
    publication_type = 'magazine'
    reverse_article_order = True

    recursions = 1
    match_regexps = [r'^http://www.somethingawful.com/.+/.+/\d{1,2}/$']

    remove_attributes = ['align', 'alt', 'valign']

    keep_only_tags = [
        dict(name='div', attrs={'class': 'article_head'}), dict(name='div', attrs={
            'class': 'organ article'}), dict(name='ul', attrs={'class': 'pager'})
    ]

    extra_css = '''
        .author{font-size:small} .date{font-size:small}
        .byline{font-size:small} .font_big{font-size:large}
        .compat5{font-weight:bold} .accentbox{background-color:#E3E3E3; border:solid black}
        img{margin-bottom:0.4em; display:block; margin-left: auto; margin-right:auto}
    '''

    feeds = [

    ('Photoshop Phriday', 'http://www.somethingawful.com/rss/photoshop-phriday.rss.xml'),
    ('Comedy Goldmine', 'http://www.somethingawful.com/rss/comedy-goldmine.rss.xml'),
    # ('The Flash Tub', 'http://www.somethingawful.com/rss/flash-tub.rss.xml')
    # ('Downloads', 'http://www.somethingawful.com/rss/downloads.rss.xml')
    # ('AwfulVision', 'http://www.somethingawful.com/rss/awfulvision.rss.xml')
    ('Awful Link of the Day', 'http://www.somethingawful.com/rss/awful-links.rss.xml'),
    ('Fake Something Awfuls', 'http://www.somethingawful.com/rss/fake-something-awful.rss.xml'),
    ('The Barbarian\'s Dojo', 'http://www.somethingawful.com/rss/steve-sumner.rss.xml'),
    ('The Great Goon Database', 'http://www.somethingawful.com/rss/great-goon-database.rss.xml'),
    ('Livejournal Theater', 'http://www.somethingawful.com/rss/livejournal-theater.rss.xml'),
    ('Joystick Token Healthpack', 'http://www.somethingawful.com/rss/token-healthpack.rss.xml'),
    ('Webcam Ward', 'http://www.somethingawful.com/rss/webcam-ward.rss.xml'),
    ('Features / Articles', 'http://www.somethingawful.com/rss/feature-articles.rss.xml'),
    ('Guides', 'http://www.somethingawful.com/rss/guides.rss.xml'),
    ('Legal Threats', 'http://www.somethingawful.com/rss/legal-threats.rss.xml'),
    ('Pranks [ICQ]', 'http://www.somethingawful.com/rss/icq-pranks.rss.xml'),
    ('State Og', 'http://www.somethingawful.com/rss/state-og.rss.xml'),
    ('Everquest', 'http://www.somethingawful.com/rss/everquest.rss.xml'),
    ('Pranks [Email]', 'http://www.somethingawful.com/rss/email-pranks.rss.xml'),
    ('The Weekend Web', 'http://www.somethingawful.com/rss/weekend-web.rss.xml'),
    ('Daily Dirt', 'http://www.somethingawful.com/rss/daily-dirt.rss.xml'),
    ('The Art of Warcraft', 'http://www.somethingawful.com/rss/art-of-warcraft.rss.xml'),
    ('Video Game Article', 'http://www.somethingawful.com/rss/video-game-article.rss.xml'),
    ('The Awful Movie Database', 'http://www.somethingawful.com/rss/awful-movie-database.rss.xml'),
    ('Pregame Wrapup', 'http://www.somethingawful.com/rss/pregame-wrapup.rss.xml'),
    ('Second Life Safari', 'http://www.somethingawful.com/rss/second-life-safari.rss.xml'),
    ('The Hogosphere', 'http://www.somethingawful.com/rss/hogosphere.rss.xml'),
    ('Front Page News', 'http://www.somethingawful.com/rss/news.rss.xml'),
    ('Forum Friday\'s Monday', 'http://www.somethingawful.com/rss/forum-fridays.rss.xml'),
    ('Cliff Yablonski Hates You', 'http://www.somethingawful.com/rss/cliff-yablonski.rss.xml'),
    ('Manifestos From the Internet', 'http://www.somethingawful.com/rss/manifestos-from-internet.rss.xml'),
    ('Johnston Checks In', 'http://www.somethingawful.com/rss/levi-johnston.rss.xml'),
    ('Twitter Tuesday', 'http://www.somethingawful.com/rss/twitter-tuesday.rss.xml'),
    ('Music Article', 'http://www.somethingawful.com/rss/music-article.rss.xml'),
    ('The Everdraed Showcase', 'http://www.somethingawful.com/rss/everdraed-showcase.xml'),
    ('Reviews [Games]', 'http://www.somethingawful.com/rss/game-reviews.rss.xml'),
    ('Reviews [Movies]', 'http://www.somethingawful.com/rss/movie-reviews.rss.xml'),
    ('Rom Pit', 'http://www.somethingawful.com/rss/rom-pit.rss.xml'),
    ('Truth Media [Reviews]', 'http://www.somethingawful.com/rss/truth-media-reviews.rss.xml'),
    ('Truth Media [Flames]', 'http://www.somethingawful.com/rss/truth-media-flames.rss.xml'),
    ('Awful Anime', 'http://www.somethingawful.com/rss/hentai-game-reviews.rss.xml'),
    ('The Horrors of Pornography', 'http://www.somethingawful.com/rss/horrors-of-porn.rss.xml'),
    ('Your Band Sucks', 'http://www.somethingawful.com/rss/your-band-sucks.rss.xml'),
    ('Fashion SWAT', 'http://www.somethingawful.com/rss/fashion-swat.rss.xml'),
    ('MMO Roulette', 'http://www.somethingawful.com/rss/mmo-roulette.rss.xml'),
    ('The Most Awful', 'http://www.somethingawful.com/rss/most-awful.rss.xml'),
    ('Garbage Day', 'http://www.somethingawful.com/rss/garbage-day.rss.xml'),
    ('WTF, D&D!?', 'http://www.somethingawful.com/rss/dungeons-and-dragons.rss.xml'),
    ('Current Releases', 'http://www.somethingawful.com/rss/current-movie-reviews.rss.xml'),
    ('Awful Things for Sale', 'http://www.somethingawful.com/rss/awful-things-sale.xml')
    ]
PK�X.b����sondagsavisen_dk.png�PNG


IHDR(-S2PLTE��������������������������ddd���뇈�>@�~������GGG�������������XZ�AC�QS������###KKK������������GHꃄ�����lllmmm�����GI��BD������888���퇈�TU����NO�{|�����ุ�FGGoff�ac�68�NP�57�XY���������|~~����AC�rs��op�9;��։�������ij������lm������ij�������������������������������%��UD�"xIDATWmϽ
� �Q8Q�,��t-��ft�\�R.Ĉ~BP,~�C!XY�*ֆ�5�����t6t=@9K`��u�n�=٧��`�pI0�S-�D��,��!��x��7�q!��IEND�B`�PK�X7#�955sondagsavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Søndagsavisen.dk
'''


class Sondagsavisen_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'Søndagsavisen.dk'
    description           = 'Danmarks mest læste avis'
    category              = 'newspaper, news, localnews, home, health, decoration, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://www.sondagsavisen.dk/
    feeds = [
        ('Søndagsavisen.dk', 'http://www.sondagsavisen.dk/feed'),
    ]
PK�X���=vvsouthernstar.png�PNG


IHDR  szz�=IDATxڭWp$kMyS��ӓ߶Q�m�Ƴ��m۳'c��d_2�1�y�T�{��5�=Uw��s};�^q�}���K��J�6��a�R"3�|��}�^�ks����#����(m�48D�
.�8��ʬ�ܷ����3e�{�29h�8ǃݢ�S��\��xI|�3���:$Y!='D����M����*�ث+���4E�D~�+48��S��r��B����X�.Y"R&g�yU<��J��{]�XW��p���H�3�b��X\�P��������?�;�p}��4��aXz�����)�W�i�_WL�Q�x�-;vbqa#�������||�0�v;���=�#	ёU����[&ʫ��\WҕSqe�5��=fg�07�~��Pe�X����v($�EE��^T$�p����v��rf�נ�V'
z�����2�f��C�A�����+��"I�}+'���ʋ$k��җM�?���#kb����J�Cq^���O�!z����E�����譒�:W�W1�}��U�_|	c�I(�_yU� Cbq4�l���51!!FѳLl��K�/-����a��7��+�,���Í�P�E䷿� /y/�ccp�+��I
�6+vL��nj=��zS���,��r�t�8	#���Y�q�ڄ�����ӽ���n{����N`8�D�彘���P�o~���^`O��
Î�&�r��t��`��&��H�M�R0�ͧq�>D�]���EMa�#��YX��$=�r(�C��—�_W�ljjBTHV�!,I&=�h��b�k��Y��W0
��l�����|:
�����)H��������3].	X+����1��	3f��6y"n �6Hݍ%&]���f��b�I�]���%"UY�H������{���%��q�dw��Ϡ���0?3#��c�`F0	Meh����_{���0�C�z�zT/_��y(4�?*O�cK�tdJ�1ِ��"S�d��>���%����Ɉ6�KW<�e5�z����=���iU����Au<J��?���>(�����ρ!�kke_X2̘�el��חWa����^H|�h��X#-�2��0(#���q���5t�P���O0,#��J$.�a�(�HA�Hb2glH�%'$�����OM�v����ܽ�뫶mǠި9I�3���m\HHb�[�U����b�����B�-�z�~�@���F��b�i!!��&ɟU,I�����5���D��sH�ð���Ǟ@*C6p]��U�=�O���+�r�^�~U���tqM����$��ÿ~=?�	er�Y2�����@Z:��R�܊��|�\xmw[��V�I"�|��	D�lŸ�b�c���5��_��#��^�>�ۼ�"��ﲖ+���l+)�j���&#���\cXB��%�_���t;z�����x�$n�\���솦-�[�9�ӑzB2�+���
`/,�[����(_Ε��NY���[%,i�Ș�cx.dc��m�g<8���sv��HJd�b��">���nϽ?��aPo�l�{IEND�B`�PK�X�\^..southernstar.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2012, watou'
'''
southernstar.ie
'''
import re
import tempfile
import os
import codecs

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag, NavigableString


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class TheSouthernStar(BasicNewsRecipe):

    title = 'The Southern Star'
    __author__ = 'watou'
    description = 'West Cork\'s leading news and information provider since 1889'
    NEWS_INDEX = 'http://www.southernstar.ie/news.php'
    LOCAL_NOTES = 'http://www.southernstar.ie/localnotes.php'
    SPORT_INDEX = 'http://www.southernstar.ie/sport.php'
    CLASSIFIEDS = 'http://www.southernstar.ie/classifieds.php'
    language = 'en_IE'
    encoding = 'cp1252'

    publication_type = 'newspaper'
    masthead_url = 'http://www.southernstar.ie/images/logo.gif'
    remove_tags_before = dict(name='div', attrs={'class': 'article'})
    remove_tags_after = dict(name='div', attrs={'class': 'article'})
    remove_tags = [dict(name='div', attrs={'style': 'width:300px; position:relative'}),
                   dict(name='form'),
                   dict(name='div', attrs={'class': 'endpanel'})]
    no_stylesheets = True
    tempfiles = []
    pubdate = ''

    preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')]

    def parse_index(self):
        feeds = []
        seen_titles = set()

        articles = self.fetch_ss_articles(self.NEWS_INDEX, seen_titles)
        if articles:
            feeds.append(('News', articles))

        articles = self.fetch_ss_notes(self.LOCAL_NOTES)
        if articles:
            feeds.append(('Local Notes', articles))

        articles = self.fetch_ss_articles(self.SPORT_INDEX, seen_titles)
        if articles:
            feeds.append(('Sport', articles))

        articles = self.fetch_ss_notes(self.CLASSIFIEDS)
        if articles:
            feeds.append(('Classifieds', articles))

        return feeds

    def fetch_ss_articles(self, index, seen_titles):
        articles = []
        soup = self.index_to_soup(index)
        ts = soup.find('div', {'class': 'article'})
        ds = self.tag_to_string(ts.find('strong'))
        self.pubdate = ' [' + ds + ']'
        self.timefmt = ' [%s]' % ds

        for post in ts.findAll('h1'):
            a = post.find('a', href=True)
            title = self.tag_to_string(a)
            if title in seen_titles:
                continue
            seen_titles.add(title)
            url = a['href']
            if url.startswith('article'):
                url = 'http://www.southernstar.ie/' + url
            self.log('\tFound article:', title, 'at', url)
            p = post.findNextSibling('p')
            desc = None
            if p is not None:
                desc = str(p)
            articles.append({'title': title, 'url': url, 'description': desc,
                             'date': self.pubdate})

        return articles

    def fetch_ss_notes(self, page):
        articles = []

        soup = self.index_to_soup(page)
        ts = soup.find('div', {'class': 'content'})
        for post in ts.findAll('h1'):
            title = self.tag_to_string(post)
            self.log('\tFound note:', title)
            f = tempfile.NamedTemporaryFile(suffix='.html', delete=False)
            f.close()
            f = codecs.open(f.name, 'w+b', self.encoding, 'replace')
            url = "file://" + f.name
            f.write(u'<html><head><meta http-equiv="Content-Type" content="text/html; charset=' +
                    self.encoding + '"></head><body><h1>' + title + '</h1>')
            f.write(str(post.findNextSibling('p')))
            f.write(u'</body></html>')
            self.log('\tWrote note to', f.name)
            f.close()
            self.tempfiles.append(f)
            articles.append({'title': title, 'url': url, 'date': self.pubdate})

        return articles

    def postprocess_html(self, soup, first):
        for table in soup.findAll('table', align='right'):
            img = table.find('img')
            if img is not None:
                img.extract()
                caption = self.tag_to_string(table).strip()
                div = new_tag(soup, 'div')
                div['style'] = 'text-align:center'
                div.insert(0, img)
                div.insert(1, new_tag(soup, 'br'))
                if caption:
                    div.insert(2, NavigableString(caption))
                table.replaceWith(div)

        return soup

    def image_url_processor(self, baseurl, url):
        return url.replace(' ', '%20')

    def cleanup(self):
        self.log('cleaning up')
        for f in self.tempfiles:
            os.unlink(f.name)
        self.tempfiles = []
PK�X�*�c��sova.png�PNG


IHDR  szz�RIDATx�՗��H�_��m۶m��}'I{m۶mۛI%ͤ2����(��{5��+��UU
��U!�J��N�N�"��"��9��m�U�?lQQ�(��U�X�ek�|pYQ{�0[�(F���Vg[Z��V��X��fW��(krݖ��bGʶc���G`��u�1J�F��(:8��9��{�a���0lU��(�Ϻ.��U>(s�`^��'��B��A-
o�&K�G�:X��<R[�����R�[{�Y�*+��zf&��Q0�"�q1'��N�N@�I��B�~c���_��U���0���L�#uJE�`]��e�@��"��%HbnL�9���J��(�$3.������XjkH_�!�m~,$N�
(|��X����/���_N���k����+�`9T�t�CT�+��Q/[�W.��,�xG�]M���Q���k����>bz��c{��;��ܮM#��T���Abj\@�Øao�i�Op��}!�lb����	\����F�w�1P�\���N�ߏ�Ɋ�e��
�j���lD����w����c��א��U�IgWf(�Q����y�}W0���Ua�52�81o�^�m��
	ZW�\����!�1����%�(<��K�	>[~����MY�J�!�`�N�I���OO��B���/��h0}& �̜�N�D\`rYfv��.�]��P�xR��0���f.�\��]j��>�73s�������u|'J�`��Yq0�m����O�@}W6�⻻S��'�|L��+g��C�8P�g&`"���aj�%ʿ�
w��T���K�4�Y��� �̙�c�a��HM���+~cQ����]��=ge����E���ٸ�:P�k�%P22j��wK&  6$.�")d���D�	M+��?H��q��Y�����֜�Y��M~%o5ِx��[ra���.Ϟ/��_���C��d���7'�3���\+o>y�J��V>NH�Y7"�..��7�@�]p"$ޑ�"�1Un8�F	1�c�M=�3�4���_�4��������pѿŋ�Ԧ�DG��IEND�B`�PK�X3E4D##sova.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Sova(BasicNewsRecipe):
    title = 'SOVA'
    __author__ = 'bugmen00t'
    description = ' \u0420\u0443\u0441\u0441\u043A\u043E\u044F\u0437\u044B\u0447\u043D\u043E\u0435 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0435 \u043E\u043D\u043B\u0430\u0439\u043D-\u0438\u0437\u0434\u0430\u043D\u0438\u0435, \u043E\u0441\u043D\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0432 \u0422\u0431\u0438\u043B\u0438\u0441\u0438 \u0432 2016 \u0433\u043E\u0434\u0443 \u0433\u0440\u0443\u043F\u043F\u043E\u0439 \u043F\u0440\u043E\u0444\u0435\u0441\u0441\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0445 \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442\u043E\u0432, \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0449\u0435\u0435 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E \u043E \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0435, \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0435 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043D\u0435\u043E\u0442\u044A\u0435\u043C\u043B\u0435\u043C\u044B\u0445 \u0430\u0441\u043F\u0435\u043A\u0442\u0430\u0445 \u0436\u0438\u0437\u043D\u0438 \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0433\u043E \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u0432 \u0413\u0440\u0443\u0437\u0438\u0438 \u0438 \u0440\u0435\u0433\u0438\u043E\u043D\u0435 \u0432 \u0446\u0435\u043B\u043E\u043C.'  # noqa
    publisher = '\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u043E\u0440\u0433\u0430\u043D\u0438\u0437\u0430\u0446\u0438\u044F Sova News'  # noqa
    category = 'blog'
    cover_url = u'https://i0.wp.com/sova.news/wp-content/uploads/2021/08/sova@512.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 60
    max_articles_per_feed = 30

    remove_tags_before = dict(name='div', attrs={'class': 'site-wrapper header-7'})

    remove_tags_after = dict(
        name='div', attrs={'class': 'single-body entry-content typography-copy'}
    )

    remove_tags = [
        dict(name='nav', attrs={'aria-label': 'breadcrumbs'}),
        dict(name='header', attrs={'class': 'site-header site-header--skin-5'}),
        dict(name='footer'),
        dict(name='ins'),
        dict(name='div', attrs={'class': 'entry-interaction__left'}),
        dict(name='div', attrs={'class': 'entry-interaction__right'}),
        dict(name='div', attrs={'id': 'mnmd-sticky-header'}),
        dict(name='div', attrs={'id': 'mnmd-offcanvas-primary'}),
        dict(name='div', attrs={'id': 'mnmd-offcanvas-mobile'}),
        dict(name='div', attrs={'class': 'entry-interaction__right'}),
        dict(name='blockquote', attrs={'class': 'wp-embedded-content'})
    ]

    feeds = [
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://sova.news/news/feed/'
        ),
        (
            '\u041F\u043E\u043B\u0438\u0442\u0438\u043A\u0430',
            'https://sova.news/analytics/politics/feed/'
        ),
        (
            '\u042D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0430',
            'https://sova.news/analytics/economy/feed/'
        ),
        (
            '\u041E\u0431\u0449\u0435\u0441\u0442\u0432\u043E',
            'https://sova.news/analytics/society/feed/'
        ),
        (
            '\u0418\u043D\u0442\u0435\u0440\u0432\u044C\u044E',
            'https://sova.news/interview/feed/'
        ), ('Unfake', 'https://sova.news/unfake/feed/'),
        (
            '\u0414\u0440\u0443\u0433\u0430\u044F \u0421\u043E\u0432\u0430',
            'https://sova.news/sova-other/feed/'
        ),
        (
            '\u0418\u0441\u043A\u0443\u0441\u0441\u0442\u0432\u043E',
            'https://sova.news/sova-other/art/feed/'
        ),
        (
            '\u0422\u0443\u0440\u0438\u0437\u043C',
            'https://sova.news/sova-other/tourism/feed/'
        ), ('#weekendnavigator', 'https://sova.news/weekendnavigator/feed/'),
        (
            '\u0421\u043E\u0441\u0435\u0434\u0438',
            'https://sova.news/sova-other/neighbours/feed/'
        ),
        (
            '\u041D\u0435\u0434\u0435\u043B\u044F \u0432 \u0433\u043E\u0440\u043E\u0434\u0435',
            'https://sova.news/week-in-the-city/feed/'
        ),
        (
            '\u0424\u043E\u0442\u043E\u043F\u0440\u043E\u0433\u0443\u043B\u043A\u0438',
            'https://sova.news/photowalks/feed/'
        ), ('\u0424\u043E\u0442\u043E', 'https://sova.news/photo/feed/')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X\���""spectator-au.png�PNG


IHDR  szz��IDATxڜ�|�X�׶�\۶m۶m۶m�6ʝvlۙ�s������;/��;�80�p2�
0��*c�k'�ggP��x=�>�h���g�g'-�n�LI󎮩%_�б���.�h�c4|A���\�ٴ<m޵�S�-�1˛�uʟC򆻈]|��%r�%�?�����0b�_M�ݏ�[-��1�[E�.��
��	�_�P��Zټ!��|i��{e�k~�vaC̮��,��N��X@\��n_�R!��]30K/�M:
���?�tf�X"v�w�B��߰��k�M�hg;�\�[�z@hѸ\:aU��-t�бg1��*	�4əެYKH��]�f��.E�y�YIH'g�n�"���}��K!X��?�B�_��r0�B|�-N��p՟~gx���}�n|�B3�Z<��f+��	�x�ry����-n�w'�O���Lwx�-�h�%^c(�{�e$f�a`�$$���@�;�
��75&�1PB�� y�=/*���A#��E��S(���B��DI�A
qi�O�l��s-)!�W/��<K���@J�6�68G+�#��;;��%�B�!a��"DV���E�c%&�{mą��u�e`�>D�xex�)�����i�j
;4�n���6#GV6=�%�Q��p+˰���;D	]'���b&g}̣.CU#�|��a͡�9 ��x`h�e)��Zq�_p����1� ��F>�O��{u+V
���2ܵ2��_�	�|�4�ѥף�
���jW~��&rʅ8A��W�t�숊q�\HL,�k��i���*&t����)}�r!Q�d�x��G����4���դ$�F�\��K�L���'2�����J���l�:Z*c��S�o�#�ﶨ�R�Z�۵����Ļ�~F>��7���>�W�J���]p�x�f��r�]G6��n��@���
����c2�f��x��mu�IEND�B`�PK�X-n���spectator-au.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Pat Stapleton <pat.stapleton at gmail.com>'
'''
https://www.spectator.com.au/
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class SpectatorAU(BasicNewsRecipe):
    title = 'Spectator Australia'
    __author__ = 'Pat Stapleton, Dean Cording, James Cridland'
    description = 'Spectator Australia is an Australian edition of The Spectator, first published in the UK in July 1828.'
    masthead_url = 'https://www.spectator.com.au/content/themes/spectator-australia/assets/images/spec-aus-logo.png'
    cover_url = 'https://spectator.imgix.net/content/uploads/2015/10/Spectator-Australia-Logo.jpg'
    oldest_article = 7
    handle_gzip = True
    no_stylesheets = True
    use_embedded_content = False
    scale_news_images_to_device = True
    encoding = 'utf8'
    publisher = 'Spectator Australia'
    category = 'Australia,News'
    language = 'en_AU'
    publication_type = 'newspaper'
    extra_css = '.article-header__author{margin-bottom:20px;}'
    conversion_options = {
        'comments': description,
        'tags': category,
        'language': language,
        'publisher': publisher,
        'linearize_tables': False
    }

    keep_only_tags = [dict(attrs={'class': ['article']})]
    remove_tags = [
        dict(
            attrs={
                'class': [
                    'big-author', 'article-header__category', 'margin-menu',
                    'related-stories', 'disqus_thread', 'middle-promo',
                    'show-comments', 'article-tags'
                ]
            }
        ),
        dict(name=['h4', 'hr'])
    ]
    remove_attributes = ['width', 'height']

    feeds = [
        ('Spectator Australia', 'https://www.spectator.com.au/feed/'),
    ]
PK�X`R�T��spectator_magazine.png�PNG


IHDR  D���:PLTE���������������������������������������������������������������������������������������������������%�
"���������'������>O���������.�-?���ꊔ�@P�r~�Yg����?P�Q`��!4���醐������������/����.�N]�����,�?O�O^�����������얟�an��;L�`m�y������HW딝����省����jw�9J鉓����~����ꍖ�,�jv���������ET�#��%�L[��������<M����"4옡����6G�
�+���������gt�-�;K���뒛훣������Q_�Zh�}�������.@����
�{�����-並��%8���힧�n{燐�\j�(�0A����cq�)���	동�0�]k�)�/�훤�:Kꋕ����x��HX�`n肍ꎘ脏�my�z��������������tRNS*m���8����6�B7���+�n��d4��IDATx�T��{$Q�_�;�^���8۶m۶m�����������3�%H�r{�> �y=nМ�P8�J�p(��Dcy���X�/ȱ���˜����|"
}r�z[�{�]݋���+t��b���fKM����'O�G�E���R��_�وR��:	`i��b(��y+:ʴt����`��Z�Z`�=��� ����k��:*=�"��U���?���1�UU�j�ߔ���3�xf�,ʴZx��ݞ6,_!�ʌ�J^�#�*n�$֮[߀��~�7mN�)�w�����;v�J[��{����CM�}�=f������R�Ѷc�M��I�~�SMʜ8gv�'�態HI_�[���5)�+W[�h�6���AQ�7o�Fҝ��z���u��C%?�cѹ���xn���sSa�_�zM/���;.W.�}�A}��6���:�=����2*-�W��?��e��;v�����G�r��={]���C8�μ�?�ٜe�V��IEND�B`�PK�X��Uddspectator_magazine.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes

def absurl(url):
    if url.startswith('/'):
        url =  'https://www.spectator.co.uk' + url
    return url


class spectator(BasicNewsRecipe):
    title = 'Spectator Magazine'
    __author__ = 'unkn0wn'
    description = 'The Spectator was established in 1828, and is the best-written and most influential weekly in the English language.'
    language = 'en'
    no_stylesheets = True
    remove_attributes = ['height', 'width', 'style']
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/The_Spectator_logo.svg/320px-The_Spectator_logo.svg.png'
    encoding = 'utf-8'
    remove_empty_feeds = True
    resolve_internal_links = True

    extra_css = '''
        .writers-link__text, .author-bio__content {font-size:small; color:#404040;}
        #fig-c {text-align:center; font-size:small;}
        blockquote, em, i {color:#202020;}
        img {display:block; margin:0 auto;}
    '''

    keep_only_tags = [
        classes(
            'writers-link entry-header__author entry-header__title entry-header__thumbnail entry-content '
            'author-bio__content '
        )
    ]

    remove_tags = [
        dict(name = ['svg', 'button']),
        classes(
            'entry-meta audio-read-block insert--most-popular ad-slot ad-slot--in-content ad-content '
            'subscription-banner ' 
        )
    ]

    def preprocess_html(self, soup):
        for fc in soup.findAll('figcaption'):
            fc['id'] = 'fig-c'
        return soup
    
    def get_browser(self, *args, **kwargs):
        kwargs['user_agent'] = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
        br = BasicNewsRecipe.get_browser(self, *args, **kwargs)
        br.addheaders += [
            ('Referer', 'https://www.google.com/'),
            ('X-Forwarded-For', '66.249.66.1')
        ]
        return br

    def parse_index(self):
        soup = self.index_to_soup('https://www.spectator.co.uk/magazine')
        self.cover_url = soup.find(**classes(
            'magazine-header__container')).img['src'].split('?')[0]
        issue = self.tag_to_string(soup.find(**classes(
            'magazine-header__title'))).strip()
        time = soup.find('time')
        self.title = 'The Spectator ' + issue
        self.timefmt = ' [' + self.tag_to_string(time) + ']'
        self.log('Downloading Issue: ', self.title, self.timefmt)
        nav_div = soup.find('ul', **classes('archive-entry__nav-list'))
        section_list = []

        for x in nav_div.findAll(['a']):
            section_list.append((
                self.tag_to_string(x).strip(), absurl(x['href'])))
        feeds = []

        # For each section title, fetch the article urls
        for section in section_list:
            section_title = section[0]
            section_url = section[1]
            self.log(section_title, section_url)
            soup = self.index_to_soup(section_url)
            articles = self.articles_from_soup(soup)
            if articles:
                feeds.append((section_title, articles))
        return feeds

    def articles_from_soup(self, soup):
        ans = []
        for div in soup.findAll('div', **classes(
            'mosaic__tile mosaic__tile--lead-up'
        )):
            a = div.find('a', href=True, attrs={'class':'article__title-link'})
            url = absurl(a['href'])
            title = self.tag_to_string(a).strip()
            teaser = div.find('p', **classes('article__excerpt-text'))
            desc = ''
            if teaser:
                desc = self.tag_to_string(teaser).strip()
            obj = div.find('a', **classes('article__author article__author--link'))
            if obj:
                desc = self.tag_to_string(obj).strip() + ' | ' + desc
            sec = div.findParent('div').find('a', attrs={'class': 'magazine-issue__entry-link'})
            if sec:
                desc = self.tag_to_string(sec).strip() + ' | ' + desc

            self.log('\t', title, '\n\t', desc, '\n\t\t', url)
            ans.append({'title': title, 'description':desc, 'url': url})
        return ans
PK�X)�j�``spektrum.png�PNG


IHDR�a'IDATxڥ��.g@�n\�Am�N�g۶m۾�m۶m�:�ݿ���%9���|"�x)�=�4���-r��l�`�\R�6��F�f�$��N\�Hŷ����jn����Swm6�W�:,��E�-�

104@IkܲWs&��y3t��`�[8e-�|z۞�088�"���&��i#t?�_0Jnm#��R�Ï8���,�y�Ƥ9�9�-|���]��e����<��j�켅콇y�x����r�:ʁW���#��0�K]c�=�y��C�=�Ց�w��5�|�-d�u��p%�����NF{:��M�-u�[w
Qv\Gv�@�ۯ���� /�"=�������V�<rP���![.���
��<g��/)�s ����"1��u�q��Y}Vq/�#�/ ��X~�k����E|v>����YPĠr`�C{d�z��kQV�Ag�I�8����*m���������	N���͗����Q�Ģ��v�.��1��O;�9�����cL���4�Bf@�D�(���#�����Lc�N�:��V�
@�+IEND�B`�PK�X�ىxxspektrum.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
##
# Written:      October 2012 (new coding)
# Version:      9.0
# Last update:  2018-02-22
##

from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds spektrum.de
'''


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(
        attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)}
    )


from calibre.web.feeds.recipes import BasicNewsRecipe


class Spektrum(BasicNewsRecipe):
    title = u'Spektrum der Wissenschaft'
    __author__ = 'Armin Geller, Bratzzo, Rainer Zenz, update epubli'
    description = u'German  online portal of Spektrum der Wissenschaft'
    publisher = 'Spektrum der Wissenschaft Verlagsgesellschaft mbH'
    category = 'science news, Germany'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    language = 'de'
    encoding = 'utf8'
    ignore_duplicate_articles = {'title'}

    cover_url = 'https://www.spektrum.de/js_css/sde/assets/img/svg/sdw_dark.svg'
    masthead_url = 'http://www.spektrum.de/fm/861/spektrum.de.png'

    feeds = [
        (
            u'Spektrum.de',
            u'http://www.spektrum.de/alias/rss/spektrum-de-rss-feed/996406'
        ),
        #              (u'Spektrum der Wissenschaft', u'http://www.spektrum.de/alias/rss/spektrum-der-wissenschaft-rss-feed/982623'),
        #              (u'Gehirn & Geist', u'http://www.spektrum.de/alias/rss/gehirn-geist-rss-feed/982626'),
        (
            u'Sterne und Weltraum',
            u'http://www.spektrum.de/alias/rss/sterne-und-weltraum-rss-feed/865248'
        ),
        #              (u'Meistgelesene Artikel',u'http://www.spektrum.de/alias/rss/spektrum-de-meistgelesene-artikel/1224665'), # AGe 2014-08-21 new
    ]

    keep_only_tags = [
        dict(name='article', attrs={'class': 'content'}),
    ]

    remove_tags = [
        classes('hide-for-print'),
        classes('content__meta'),
        classes('content__author'),
        classes('content__video'),
        dict(name='div', attrs={'role': 'navigation'}),
        dict(name='span', attrs={'class': 'sr-only'}),
    ]

    def parse_feeds(self):
        # Call parent's method.
        feeds = BasicNewsRecipe.parse_feeds(self)
        # Loop through all feeds.
        for feed in feeds:
            # Loop through all articles in feed.
            for article in feed.articles[:]:
                if 'VIDEO' in article.title:
                    feed.articles.remove(article)
                # Remove articles with 'video','podcast' or 'rezension' in the url.
                elif 'podcast' in article.url:
                    feed.articles.remove(article)
                elif 'video' in article.url:
                    feed.articles.remove(article)
                elif 'rezension' in article.url:
                    feed.articles.remove(article)
        return feeds

    def preprocess_html(self, soup, *a):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X�_ �CCspiegel_int.png�PNG


IHDR(-S`PLTE�������9����z�]B�T9�C#�����t\��ʸ���lT�pppaaa212,*,��hLHFH���\RL���L,   ���|~|35G'�IDATx�%���0�zw+_���D"?
cM�	IJJ�.V�U����q��{��0빋�����1�JQ ��$|Ec�
=�cU�:�1���_�킈ְt�t(T~�mU���p}�&BX�^��Xw�������Q�џ	D7�&�nD�N����@!��IEND�B`�PK�X)�az

spiegel_int.recipe'''
spiegel.de
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Spiegel_int(BasicNewsRecipe):
    title = 'Spiegel Online International'
    __author__ = 'unkn0wn'
    description = "Daily news, analysis and opinion from Europe's leading newsmagazine and Germany's top news Web site"
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'en_DE'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    publisher = 'SPIEGEL ONLINE GmbH'
    category = 'news, politics, Germany'
    publication_type = 'magazine'
    remove_empty_feeds = True
    remove_attributes = ['style','height','width']
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://upload.wikimedia.org/wikipedia/commons/0/06/Logo-Der-Spiegel-de.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.spiegel.de/spiegel/print/')
        div = soup.find('div', attrs={'data-component':'MagazineImage'})
        citem = div.find('img', attrs={'data-src':True})['data-src'].replace('260', '800')
        return citem

    keep_only_tags = [dict(name='article')]

    remove_tags = [
        dict(name='section', attrs={'data-app-hidden':True}),
        dict(name='div', attrs={'data-issue-context-hidden':True}),
        dict(name='div', attrs={'data-area':'related_articles'}),
        dict(name='div', attrs={'data-component':'HTMLEmbed'}),
        dict(name=['footer', 'button', 'svg'])
    ]

    extra_css = '''
        time{font-size:small;}
        [data-area="quote"]{text-align:center; color:#404040;}
        #fig-c{font-size:small; text-align:center;}
    '''

    feeds = [
        ('World', 'https://www.spiegel.de/international/world/index.rss'),
        ('Europe', 'https://www.spiegel.de/international/europe/index.rss'),
        ('Germany', 'https://www.spiegel.de/international/germany/index.rss'),
        ('Business', 'https://www.spiegel.de/international/business/index.rss'),
        ('Zeitgeist', 'https://www.spiegel.de/international/zeitgeist/index.rss'),
        ('Tomorrow', 'https://www.spiegel.de/international/tomorrow/index.rss'),
        ('Others', 'http://www.spiegel.de/international/index.rss')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src':True}):
            img['src'] = img['data-src']
        for fig in soup.findAll('figcaption'):
            fig['id'] = 'fig-c'
        return soup
PK�X�_ �CC
spiegelde.png�PNG


IHDR(-S`PLTE�������9����z�]B�T9�C#�����t\��ʸ���lT�pppaaa212,*,��hLHFH���\RL���L,   ���|~|35G'�IDATx�%���0�zw+_���D"?
cM�	IJJ�.V�U����q��{��0빋�����1�JQ ��$|Ec�
=�cU�:�1���_�킈ְt�t(T~�mU���p}�&BX�^��Xw�������Q�џ	D7�&�nD�N����@!��IEND�B`�PK�X*�=[([(spiegelde.recipe#!/usr/bin/env python
# License: 'CC-BY-4.0'
# Copyright: '2019, vohe Based on the recipe by Darko Miletic <darko.miletic at gmail.com>'

from calibre.web.feeds.news import BasicNewsRecipe
'''
spiegel germany free newsfeed
its free, read here: http://www.spiegel.de/dienste/besser-surfen-auf-spiegel-online-so-funktioniert-rss-a-1040321.html
this: ... Sie können unsere Nachrichten-Feeds kostenlos abonnieren - ...
'''
'''
feel free to modify this to your own needs
'''


class Spiegel_DE_all(BasicNewsRecipe):
    # Title of the Recipe
    title = u'Spiegel Online RSS - German alle Themen'
    # Author
    __author__ = u'Volker Heggemann, VoHe'
    # oldest article to download (in days) 									---- can be edit by user
    # be careful, if there is a lot of news, the file size exceeds!
    oldest_article = 7
    # describes itself, 						 							---- can be edit by user
    max_articles_per_feed = 100
    # speed up the download on fast computers be careful (I test max.20)
    # ---- can be edit by user
    simultaneous_downloads = 10
    # description, some Reader show this in titlepage
    # add date to description so for dayly downloads you can find them easier
    # ---- can be edit by user
    # description = (
    # "Ständig die neueste Meldung auf dem Schirm, sekundenaktuell und übersichtlich: Mit unserem RSS-Angebot entgeht Ihnen keine wichtige Meldung,"
    # "selbst wenn Sie keinen Internet-Browser geöffnet haben. Sie können unsere Nachrichten-Feeds kostenlos abonnieren - nach Ihren Themenvorlieben.")
    # above a long description, but we use a shorter one
    description = u'Spiegel Online RSS News'
    # Who published the content?
    publisher = u'SPIEGEL ONLINE Gmbh'
    cover_url = 'https://de.m.wikipedia.org/wiki/Datei:Spiegel_Online_logo.svg'
    # What is the content of?
    category = 'SPIEGEL ONLINE RSS'
    # describes itself, 						 							---- can be edit by user
    language = 'de'
    lang = 'de-DE'
    no_stylesheets = True
    # describes itself, 						 							---- can be edit by user
    use_embedded_content = False
    # encoding of content. e.g. utf-8, None, ...
    # ---- can be edit by user
    encoding = 'UTF-8'  # AGe 2016-05-09 old: cp1252
    # Removes javascript- why keep this, we only want static content
    remove_javascript = True
    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True
    resolve_internal_links = True
    # remove the rubbish (in ebook)
    auto_cleanup = True
    # now the content description and URL follows
    # feel free to add, wipe out what you need	 							---- can be edit by user
    #
    # Make some tests, may you first comment all of them out, and step by step you add what you'll need?
    #
    '''
    keep_only_tags = [
        dict(name='h2', attrs={'class': 'article-title'}),
        dict(id=['js-article-top-wide-asset', 'js-article-column']),
    ]
    '''
    remove_tags = [
        dict(attrs={'class': lambda x: x and 'asset-html-box' in x.split()}),
        dict(attrs={
            'class': lambda x: x and 'article-social-bookmark' in x.split()
        }),
        dict(attrs={
            'class': lambda x: x and 'article-newsfeed-box' in x.split()
        }),
        dict(attrs={
            'class': lambda x: x and 'article-comments-box' in x.split()
        }),
        dict(attrs={
            'class': lambda x: x and 'article-functions-bottom' in x.split()
        }),
    ]

    # omit articles already linked in Schlagzeilen feed
    ignore_duplicate_articles = {'title', 'url'}

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': lang
    }

    feeds = [  # Content / Inhalt
        # Add or Remove the '#' symbol in front of line, to get or discard this rss-feed
        # de: lösche oder füge am Anfang jeder Zeile das # Zeichen. Damit wird die Zeile entfernt oder
        #     hinugefügt und damit der Inhalt im Text erscheinen.
        #
        # ---- each line can be edit by user
        # de: jede Zeile kann verändert werden.
        #
        # Sample:
        # Theme of the following news
        # (u'Alle Ressort',u'http://www.spiegel.de/schlagzeilen/index.rss'),
        # Beispiel
        # Theme of the following news
        # (u'Spiegel Online', u'http://www.spiegel.de/schlagzeilen/index.rss'),
        #
        #
        # "Alles" enthält die Themen Politik, Wirtschaft, Panorama , uws....
        # wenn Sie alles und die Unterthemen wählen, dann erscheinen News doppelt.
        #
        # Alles
        # (u'Spiegel Online alle Schlagzeilen', u'http://www.spiegel.de/schlagzeilen/index.rss'),
        # (u'Spiegel Online nur Topnews',u'http://www.spiegel.de/schlagzeilen/tops/index.rss'),
        # (u'Spiegel Online nur Eilmeldungen', u'http://www.spiegel.de/schlagzeilen/eilmeldungen/index.rss'),
        # (u'Spiegel Online alle Videos',u'http://www.spiegel.de/video/index.rss'),
        # Politik / Politics
        # (u'Politics global',u'http://www.spiegel.de/politik/index.rss'),
        (u'Politics foreign countries',
         u'http://www.spiegel.de/politik/ausland/index.rss'),
        (u'Politik DE',
         u'http://www.spiegel.de/politik/deutschland/index.rss'),
        # Wirtschaft / economy
        # (u'Wirtschaft alles', u'http://www.spiegel.de/wirtschaft/index.rss'),
        (u'Wirtschaft Verbraucher und Service',
         u'http://www.spiegel.de/wirtschaft/service/index.rss'),
        (u'Wirtschaft Unternehmen und Märkte',
         u'http://www.spiegel.de/wirtschaft/unternehmen/index.rss'),
        (u'Wirtschaft Staat und Soziales',
         u'http://www.spiegel.de/wirtschaft/soziales/index.rss'),
        (u'Wirtschaft Videos aus Politik und Wirtschaft',
         u'http://www.spiegel.de/video/politik_wirtschaft/index.rss'),
        # Panorama / panorama (overview)
        # (u'Panorama alles', u'http://www.spiegel.de/panorama/index.rss'),
        (u'Panorama Justiz',
         u'http://www.spiegel.de/panorama/justiz/index.rss'),
        (u'Panorama Gesellschaft',
         u'http://www.spiegel.de/panorama/gesellschaft/index.rss'),
        (u'Panorama Leute', u'http://www.spiegel.de/panorama/leute/index.rss'),
        (u'Panorama Videos aus Panorama',
         u'http://www.spiegel.de/video/panorama/index.rss'),
        # Sport / Sports
        (u'Sport alles', u'http://www.spiegel.de/sport/index.rss'),
        # (u'Sport Fußball', u'http://www.spiegel.de/sport/fussball/index.rss'),
        # (u'Sport Formel1', u'http://www.spiegel.de/sport/formel1/index.rss'),
        # (u'Sport Videos', u'http://www.spiegel.de/video/sport/index.rss'),
        # Kultur / culture
        # (u'Kultur alles', u'http://www.spiegel.de/kultur/index.rss'),
        (u'Kultur Kino', u'http://www.spiegel.de/kultur/kino/index.rss'),
        (u'Kultur Musik', u'http://www.spiegel.de/kultur/musik/index.rss'),
        (u'Kultur TV', u'http://www.spiegel.de/kultur/tv/index.rss'),
        (u'Kultur Literatur',
         u'http://www.spiegel.de/kultur/literatur/index.rss'),
        (u'Kultur Videos zu Kino',
         u'http://www.spiegel.de/video/kino/index.rss'),
        (u'Kultur Videos zu Kultur',
         u'http://www.spiegel.de/video/kultur/index.rss'),
        # Netzwelt / TheNet
        # (u'Netzwelt alles', u'http://www.spiegel.de/netzwelt/index.rss'),
        (u'Netzwelt Politk',
         u'http://www.spiegel.de/netzwelt/netzpolitik/index.rss'),
        (u'Netzwelt TheWeb', u'http://www.spiegel.de/netzwelt/web/index.rss'),
        (u'Netzwelt Gadgets',
         u'http://www.spiegel.de/netzwelt/gadgets/index.rss'),
        (u'Netzwelt Games', u'http://www.spiegel.de/netzwelt/games/index.rss'),
        (u'Videos zu Wissenschaft und Technik',
         u'http://www.spiegel.de/video/wissenschaft_technik/index.rss'),
        # Foto
        (u'Fotografie', u'http://www.spiegel.de/thema/fotografie/index.rss'),
        # Wissenschaft / Technologie
        # (u'Wissenschaft alles', u'http://www.spiegel.de/wissenschaft/index.rss'),
        (u'Wissenschaft Mensch',
         u'http://www.spiegel.de/wissenschaft/mensch/index.rss'),
        (u'Wissenschaft Natur',
         u'http://www.spiegel.de/wissenschaft/natur/index.rss'),
        (u'Wissenschaft Technik',
         u'http://www.spiegel.de/wissenschaft/technik/index.rss'),
        (u'Wissenschaft Weltall',
         u'http://www.spiegel.de/wissenschaft/weltall/index.rss'),
        (u'Wissenschaft Medizin',
         u'http://www.spiegel.de/wissenschaft/medizin/index.rss'),
        (u'Videos zu Wissenschaft',
         u'http://www.spiegel.de/video/wissenschaft_technik/index.rss'),
        # Gesundheit / Health
        # (u'Gesundheit alles', u'http://www.spiegel.de/gesundheit/index.rss'),
        (u'Gesundheit Diagnose und Therapie',
         u'http://www.spiegel.de/gesundheit/diagnose/index.rss'),
        (u'Gesundheit Ernährung und Fitness',
         u'http://www.spiegel.de/gesundheit/ernaehrung/index.rss'),
        (u'Gesundheit Psychologie',
         u'http://www.spiegel.de/gesundheit/psychologie/index.rss'),
        (u'Gesundheit Sex und Partnerschaft',
         u'http://www.spiegel.de/gesundheit/sex/index.rss'),
        (u'Gesundheit Schwangerschaft und Kind',
         u'http://www.spiegel.de/gesundheit/schwangerschaft/index.rss'),
        # Karriere / Career
        # (u'Karriere alles', u'http://www.spiegel.de/karriere/index.rss'),
        (u'Karriere Berufsstart',
         u'http://www.spiegel.de/karriere/berufsstart/index.rss'),
        (u'Karriere Beruf',
         u'http://www.spiegel.de/karriere/berufsleben/index.rss'),
        (u'Karriere Ausland',
         u'http://www.spiegel.de/karriere/ausland/index.rss'),
        # Uni und Schule
        (u'Uni und Schule', u'http://www.spiegel.de/unispiegel/index.rss'),
        # Reise / Travel
        # (u'Reise alles', u'http://www.spiegel.de/reise/index.rss'),
        (u'Reise Städte', u'http://www.spiegel.de/reise/staedte/index.rss'),
        (u'Reise Detuschland',
         u'http://www.spiegel.de/reise/deutschland/index.rss'),
        (u'Reise Europa', u'http://www.spiegel.de/reise/europa/index.rss'),
        (u'Reise Fernweh', u'http://www.spiegel.de/reise/fernweh/index.rss'),
        # Auto
        (u'Auto', u'http://www.spiegel.de/auto/index.rss'),
    ]
PK�X��&�==spin_magazine.png�PNG


IHDR  V%(	pHYs���o�d�IDAT8O��Qq�@�������P�u�� u����>,p3e�'���M�I�^o|��0���Z`���:���"I3u���p�&0LS�hI���.��<#�F.�NPq�d&<���������#`V2��V�迥b �%k��T�<6��σ��N�V�#O�&�v��fe���_��)����+h\���
����R� &��H��=�/��r���IEND�B`�PK�X��׍spin_magazine.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1296179411(BasicNewsRecipe):
    title = u'SPIN Magzine'
    __author__ = 'Quistopher'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100

    feeds = [
        (u'Daily Noise Blog | SPIN.com', u'http://www.spin.com/blog/feed'),
        (u'It Happened Last Night | SPIN.com',
         u'http://www.spin.com/it-happened-last-night/feed'),
        (u'Album Reviews | SPIN.com',
         u'http://www.spin.com/album-reviews/feed')

    ]
PK�X#	�u^^sportowefakty.png�PNG


IHDR(-S�PLTE��������Ѿ���v��\�m�^�����ŭ
�
�
	�	E�E���������@�@�;�;�<�<8�8?�?5�5/�/����ݜH�H��!s7���7��tRNS@��f�IDATx�e�ACۨ��6����?� ��s�cH�35�JEY�j�
���b��+nye]㇙f����Gyߐ�Z�OO�Siw’��!n�U0<唿qy�H
��_6�7d"ڕ��1+��v�Qe�S3ڦE
,P�.�oIEND�B`�PK�X��Ottsportowefakty.recipe#!/usr/bin/env python

__license__ = 'GPL v3'

import re
from calibre.web.feeds.news import BasicNewsRecipe


class sportowefakty(BasicNewsRecipe):
    title = u'SportoweFakty'
    __author__ = 'Artur Stachecki <artur.stachecki@gmail.com>, Tomasz Długosz <tomek3d@gmail.com>'
    language = 'pl'
    description = u'Najważniejsze informacje sportowe z kraju i ze świata, relacje, komentarze, wywiady, zdjęcia!'
    oldest_article = 1
    masthead_url = 'http://www.sportowefakty.pl/images/logo.png'
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    use_embedded_content = False
    remove_javascript = True
    no_stylesheets = True
    ignore_duplicate_articles = {'title', 'url'}

    keep_only_tags = [dict(attrs={'class': 'box-article'})]
    remove_tags = []
    remove_tags.append(dict(attrs={'class': re.compile(r'^newsStream')}))
    remove_tags.append(dict(attrs={'target': '_blank'}))

    feeds = [
        (u'Piłka Nożna', u'http://www.sportowefakty.pl/pilka-nozna/index.rss'),
        (u'Koszykówka', u'http://www.sportowefakty.pl/koszykowka/index.rss'),
        (u'Żużel', u'http://www.sportowefakty.pl/zuzel/index.rss'),
        (u'Siatkówka', u'http://www.sportowefakty.pl/siatkowka/index.rss'),
        (u'Zimowe', u'http://www.sportowefakty.pl/zimowe/index.rss'),
        (u'Hokej', u'http://www.sportowefakty.pl/hokej/index.rss'),
        (u'Moto', u'http://www.sportowefakty.pl/moto/index.rss'),
        (u'Tenis', u'http://www.sportowefakty.pl/tenis/index.rss')
    ]

    def get_article_url(self, article):
        link = article.get('link', None)
        if 'utm_source' in link:
            return link.split('?utm')[0]
        else:
            return link

    def print_version(self, url):
        print_url = url + '/drukuj'
        return print_url

    def preprocess_html(self, soup):
        head = soup.find('h1')
        if 'Fotorelacja' in self.tag_to_string(head):
            return None
        else:
            for alink in soup.findAll('a'):
                if alink.string is not None:
                    tstr = alink.string
                    alink.replaceWith(tstr)
            return soup
PK�X�(��sports_illustrated.png�PNG


IHDR  D����PLTE+@BL���������BDN���FHRHJUUW_WY_YZbY\b\_e_`gcekgjrikriksrtxru|{}������������������������������25B5;D�����������������������������������������������������������������������������������������������������������������@BJ���.2=���0����IDATx^�E�,33333��S[M.��*���v�`l���bQH��^3�፸�}��~���r��}�P��8G����n�\�BT%��n��aa�~9w���ES&Np�b�?�RusB��Y��<�҆�E��v��%]m���K�9,�����R1<�IEND�B`�PK�XI�J~��sports_illustrated.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


def absolutize(href):
    if href.startswith('/'):
        href = 'https://www.si.com' + href
    return href


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class SI(BasicNewsRecipe):
    title = 'Sports Illustrated'
    __author__ = 'Kovid Goyal'
    language = 'en'
    encoding = 'utf-8'
    ignore_duplicate_articles = {'title', 'url'}
    no_stylesheets = True
    compress_news_images = True
    compress_news_images_auto_size = 5
    remove_attributes = ['style']

    keep_only_tags = [
        classes('m-detail-header m-detail--body'),
    ]
    remove_tags = [
        classes('media-video OUTBRAIN m-in-content-ad-row'),
        dict(name=['button', 'meta', 'source']),
    ]

    def get_browser(self, *args, **kwargs):
        br = BasicNewsRecipe.get_browser(self, *args, **kwargs)
        br.addheaders += [('Accept-Language', 'en')]
        return br

    def preprocess_html(self, soup, *a):
        for tag in soup.findAll(attrs={'data-src': True}):
            tag.name = 'img'
            del tag.contents[:]
            tag['src'] = tag['data-src']
            tag['height'] = tag['width'] = ''
        return soup

    def parse_index(self):
        soup = self.index_to_soup('https://www.si.com/')
        # from calibre.utils.ipython import ipython
        # ipython({'soup': soup})
        cats = {}
        for ps in soup.findAll('phoenix-super-link'):
            h2 = ps.find('h2')
            title = self.tag_to_string(h2)
            label = ps.find(attrs={'phx-track-id': 'Label'})
            category = self.tag_to_string(label) if label is not None else 'Features'
            url = absolutize(ps['href'])
            arts = cats.setdefault(category, [])
            arts.append({'title': title, 'url': url})
            self.log('Found article', title)
        ans = []
        for key in sorted(cats, key=lambda x: x.lower()):
            ans.append((key, cats[key]))
        return ans
PK�XA��
sportstar.png�PNG


IHDR  D����PLTE���������"""����������ռ+++�������������~~~���;;;�ooo�����������fff��jjj�������===ppp���.2�55�������.5�5;�8;�8=�'+�.5�;=�\_����8=��TY�tw����\_�pv�uw�UZ֣�ڗ�ڞ�ݨ�ݪ�ި�߯�ల����"+�������"�������������������𫄆������rno����+.�WZ�\_�}��������������"'�"+��]b�UY�swπ�ϵ�����`eԈ����������������]b������������嶸溼�����������������������������sWYono���5BD��������LPÜ�Ē��8=�BJ�TW�FL���������������������FN����HL�HN����RU����TY�UY����IDATx�lR�d1��`̵�{�m۶m۶�y��{�Q}x�j"�e<.u�*C�·2hM�ӛM���=�QU(�0�D��T+IO�˦�H[M��d1ߘV��#�H�����|Ԑ�|'�a��Y3/,���(4uT����2��>e4��r��M	�9|v�=���m�"���w#�#�lx��@KN!)��VX>,3qۙe7^æ�bT��+�6���ZCk�p��/zb�%(�+��В�pP�s���+i�����B����m
So巕2t�@�ꋗ��?��[��Ɓg�F�((�t9>����<~�7���	�bŐ��]~L�(�(\�mk7���V�>{��]����:,������m޻���ύ[^m��fҚGs������i��{G΃Sh9,�ZН�-WhZ7�B��> +��g̬Gt�%���B��YVIEND�B`�PK�X{��(��sportstar.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from collections import OrderedDict


class Sportstar(BasicNewsRecipe):
    title = u'Sportstar'
    __author__ = 'unkn0wn'
    description = (
        'Sportstar began as a Print Only multi-sport weekly on July 15, 1978.'
        ' In 2018 the periodicity of Sportstar was made fortnightly with a lot of in-depth articles coming into the mix.'
        ' Our readers have been the fount of inspiration in our attempts at exploring new angles in sports journalism.')
    language = 'en_IN'
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    encoding = 'utf-8'
    ignore_duplicate_articles = {'url'}
    resolve_internal_links = True
    masthead_url = 'https://assetsss.thehindu.com/theme/images/SSRX/sportstar-logo.svg'
    remove_attributes = ['height', 'width']
    extra_css = '''
        .sub-title {font-style:italic; color:#202020;}
        .caption {font-size:small; text-align:center;}
        .author, .publish-time {font-size:small;}
    '''

    keep_only_tags = [
        dict(name='h1', attrs={'class':'title'}),
        dict(name='h2', attrs={'class':'sub-title'}),
        classes('publish-time author top-pic articlebodycontent')
    ]

    remove_tags = [
        classes(
            'show-mobile inlineAds related-topics related-stories comments-shares'
            ' share-page title-patch pic-caption slide-mobile also-read'
        )
    ]

    def parse_index(self):
        soup = self.index_to_soup('https://sportstar.thehindu.com/magazine/')
        url = soup.find('a', href=lambda x: x and x.startswith('https://sportstar.thehindu.com/magazine/issue/'))['href']
        self.log('Downloading Issue: ', url)
        soup = self.index_to_soup(url)

        feeds = OrderedDict()

        info = soup.find('div', attrs={'class':lambda x: x and 'left-sticky' in x.split()})
        self.cover_url = info.find('div', attrs={'class':'sptar-image'}
                                    ).find('img')['data-original'].replace('FREE_320', 'FREE_1200')
        self.description = self.tag_to_string(info.find('div', attrs={'class':'sub-text'})).strip()

        for content in soup.findAll('div', attrs={'class':'content'}):
            articles = []
            h3 = content.find('h3', attrs={'class':'title'})
            url = h3.find('a', href=True)['href']
            title = self.tag_to_string(h3).strip()
            desc = self.tag_to_string(content.find('div', attrs={'class':'sub-text'})).strip()
            section_title = self.tag_to_string(content.find('div', attrs={'class':'label'})).strip()
            self.log(section_title)
            self.log('\t', title)
            self.log('\t', desc)
            self.log('\t\t', url)
            articles.append({
                'title': title,
                'url': url,
                'description': desc})

            if articles:
                if section_title not in feeds:
                    feeds[section_title] = []
                feeds[section_title] += articles
        ans = [(key, val) for key, val in feeds.items()]
        return ans

    def preprocess_html(self, soup):
        if h2 := soup.find('h2'):
            h2.name = 'p'
        for img in soup.findAll('img', attrs={'data-original':True}):
            if img['data-original'].endswith('1x1_spacer.png'):
                source = img.findPrevious('source', srcset=True)
                img.extract()
                if source:
                    source['src'] = source['srcset'].replace('_320','_1200')
                    source.name = 'img'
            else:
                img['src'] = img['data-original']
        return soup

    def postprocess_html(self, soup, first_fetch):
        for src in soup.findAll('source'):
            src.extract()
        return soup
PK�X�.s�""
sporza_be.png�PNG


IHDR  D����PLTE�����������������!!!���ttt�����������m�����ܾ����666(((��!������~~~mmm�������������???�������GGG000888��H��l�遁�jjj�����³��������������������...�������ϰ�����������JJJ���''',,,��������n������fff��Ư�������F���999***�������UUU����y�����+++qqq


222555����������III�����������{{{��ROOO��ĵ��������>>>


���///���������VVV�����<<<��<����vvv��ڠE1<3IDATx^��S�CA�}X�6/m۶m�6��mړtn��6���JDi�a�	�~BA�?�/����r�PS�\�b�œ������EHn.9@\F�����3i�� �=	��
SMk��9�PW�_�X;���3-�3o9��{> }�j�P��8�nDٶ��`qH�h��T����+h�e�Ћ@n��c0d;�1���us��E'�Y[s��)��O�"~<���|�b��G�v� ���;c�����v�,ͫ��aIZ!�����<�@�����Wp^�
%&]8�������&��@P���IEND�B`�PK�X�����sporza_be.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe


class Sporzabe(BasicNewsRecipe):
    title = u'Sporza.be'
    __author__ = u'erkfuizfeuadjfjzefzfuzeff'
    description = u'Sport news from Belgium in Dutch'
    oldest_article = 7
    language = 'nl_BE'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='title'), dict(name='div', attrs={'id': 'intro'}), dict(name='h3'),
        dict(name='h1'), dict(name='span', attrs={'class': 'media_holder'}),
        dict(name='div', attrs={'class': 'divider image'}),
        dict(name='div', attrs={'class': 'paragraph'})
    ]

    remove_tags = []

    feeds = [
        (
        u'Voetbal', u'http://sporza.be/cm/sporza/voetbal?mode=atom&action=submit'
        ),
        (
        u'Wielrennen',
        u'http://sporza.be/cm/sporza/wielrennen?mode=atom&action=submit'
        ),
        (
        u'Tennis', u'http://sporza.be/cm/sporza/tennis?mode=atom&action=submit'
        ),
        (
        u'Auto en Motor',
        u'http://sporza.be/cm/sporza/auto_motor?mode=atom&action=submit'
        ),
        (
        u'Atletiek',
        u'http://sporza.be/cm/sporza/atletiek?mode=atom&action=submit'
        ),
        (
        u'Zaal', u'http://sporza.be/cm/sporza/zaal?mode=atom&action=submit'
        ),
        (
        u'Ander nieuws',
        u'http://sporza.be/cm/sporza/ander_nieuws?mode=atom&action=submit'
        )
    ]
PK�X�|KKst_louis_post_dispatch.png�PNG


IHDR  D����PLTE�����ssψ����

�  �&&�((�..�33�55�66�99�BB�PP�SS�XX�ZZ�``�aa�dd�rr��tt�uu�zz̓�э�Ֆ�ל�؝�ݩ�ݫ�߮�߰�ᵵⶶ�������������������;;㸸�����{{�EE�

��˶HHχ�٠��UU�<<�yy�==��||�}}́��CC΄��##�Њ�ь��KK�㹹㺺忿�bb�cc�����������ů88�hh��������������ܝ		�pp��������qq��,,؞�ٟ����$$ᴴ���WW�??���ۦ�ۤ��11��^^�__ಲᳳ�����kk�mm�nn��::١��ii������Ӓ�ԓ��NNכ��''��Ҏ����ܧ�ܨ��OO�EEޭ����\IDATx����b\Q��ƶm۪ݩ�jŶ�w�>����;��7�*3�8�T�&�g�x�!.�xn ~��yx0#��8�|E�o
y��v2($�1�!�	]�@��X�CM{���$fL�Z]�&6`7���/�8���M������,Hs�s�w��A9�,��n��t
�+��Z�P1D����R����])�?�&A��&���&iMr�]\0��?j��)?I��₴|��㛄@����������]�ϓ�n�T����h�t�oCmG)�M{�6t?
���꽭B�%�<q����56x�6�f�R�ōe�w�ǯ��X��Yv1\Gҿ9,�{��IEND�B`�PK�XK�����st_louis_post_dispatch.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class StLouisPostDispatch(BasicNewsRecipe):
    title = u'St Louis Post-Dispatch'
    __author__ = 'cisaak'
    language = 'en'
    category = 'newspaper'
    masthead_url = 'http://farm5.static.flickr.com/4118/4929686950_0e22e2c88a.jpg'

    oldest_article = 1
    max_articles_per_feed = 25
    remove_empty_feeds = True
    use_embedded_content = False
    no_stylesheets = True

    remove_tags = [
        dict(name='div', attrs={'id': 'inline-article-recommend'})
    ]

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'headline'}),
        dict(attrs={'class': 'visible-print'}),
        dict(name='div', attrs={'class': 'lee-article-text'})
    ]

    feeds = [
        (u'News - Local', u'https://www.stltoday.com/search/?c=news%2Flocal*&d1=&d2=&s=start_time&sd=desc&l=50&f=rss&t=article'),
        (u'News - Metro', u'http://www.stltoday.com/search/?c=news%2Flocal%2fmetro*&d1=&d2=&s=start_time&sd=desc&f=rss&l=25&t=article'),
        (u'News - Metro East', u'http://www.stltoday.com/search/?c=news%2Flocal%2fillinois,news%2Flocal%2fillinois%2f*&d1=&d2=&s=start_time&sd=desc&f=rss&l=25&t=article'),
        (u'News - St. Charles', u'https://www.stltoday.com/search/?c=news%2Flocal%2fstcharles*&d1=&d2=&s=start_time&sd=desc&f=rss&l=25&t=article'),
        (u'News - National', u'https://www.stltoday.com/search/?c=news%2Fnation-world*&d1=&d2=&s=start_time&sd=desc&l=25&f=rss&t=article'),
        (u'News - Crime & Courts', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2Fcrime-courts&l=50&f=rss&t=article'),
        (u'News - Education', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2feducation&f=rss&t=article'),
        (u'News - Government & Politics', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2fgovernment-politics*&f=rss&t=article'),
        (u'News - Obituaries', u'http://www.stltoday.com/search/?c=news%2Flocal%2fobituaries&d1=&d2=&s=start_time&sd=desc&f=rss&l=25&t=article'),
        (u'News - Columns', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2Fcolumn*&l=50&f=rss&t=article'),
        (u'News - Columns - Joe Holleman', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2Fcolumn%2Fjoe-holleman&l=100&f=rss&t=article'),
        (u'News - Columns - Bill McClellan', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2fcolumn%2Fbill-mcclellan&f=rss&t=article'),
        (u'Sports (all local)', u'https://www.stltoday.com/search/?c=sports*&nc=sports%2Fbetting*&nk=%23noshow&nfl=ap,spotlight,agate,sponsored&k=NOT+%23slsa*+*:*&d1=&d2=&s=start_time&sd=desc&f=rss&&l=50&t=article'),
        (u'Sports - Blues', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fprofessional%2Fnhl%2Fblues*&l=100&f=rss&t=article'),
        (u'Sports - Cardinals', u'https://www.stltoday.com/search/?c=sports%2Fprofessional%2Fmlb%2Fcardinals*&nc=sports%2Fbetting*&nk=%23noshow&nfl=ap,spotlight,agate,sponsored&k=NOT+%23slsa*+*:*&d1=&d2=&s=start_time&sd=desc&f=rss&&l=50&t=article'),
        (u'Sports - St. Louis City SC', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fprofessional%2Fmls%2Fcity-sc*&l=100&f=rss&t=article'),
        (u'Sports - College', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcollege*&nc=sports%2Fbetting*&nk=%23noshow&nfl=ap,spotlight,agate,sponsored&l=100&f=rss&t=article'),
        (u'Sports - Mizzou', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcollege%2Fmizzou&l=100&f=rss&t=article'),
        (u'Sports - SLU', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcollege%2Fslu&l=100&f=rss&t=article'),
        (u'Sports - High School/Preps', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fhigh-school*&l=100&f=rss&t=article'),
        (u'Sports - Columns - Dan Caesar', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcolumn%2Fmedia-views&l=50&f=rss&t=article'),
        (u'Sports - Columns - Ben Frederickson', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcolumn%2Fben-frederickson&l=50&f=rss&t=article'),
        (u'Sports - Columns - Jeff Gordon', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcolumn%2Fjeff-gordon&l=100&f=rss&t=article'),
        (u'Sports - Columns - Benjamin Hochman', u'http://www.stltoday.com/search/?c=sports%2Fcolumn%2Fbenjamin-hochman&d1=&d2=&s=start_time&sd=desc&f=rss&l=50t=article'),
        (u'Business (all)', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business*&l=100&f=rss&t=article'),
        (u'Business - National', u'http://www.stltoday.com/search/?c=business%2Fnational-and-international&d1=&d2=&s=start_time&sd=desc&f=rss&l=100&t=article'),
        (u'Business - Columns (all)', u'http://www.stltoday.com/search/?c=business%2Fcolumns,business%2Fcolumns%2f*&d1=&d2=&s=start_time&sd=desc&f=rss&l=50&t=article'),
        (u'Business - Columns - Building Blocks', u'http://www.stltoday.com/search/?c=business%2Fcolumns%2Fbuilding-blocks&d1=&d2=&s=start_time&sd=desc&f=rss&l=25&t=article'),
        (u'Business - Columns - David Nicklaus', u'http://www.stltoday.com/search/?c=business%2Fcolumns%2Fdavid-nicklaus&d1=&d2=&s=start_time&sd=desc&f=rss&l=25&t=article'),
        (u'Life and Entertainment', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=life-entertainment%2Flocal*&l=100&f=rss&t=article'),
        (u'Life and Entertainment - Arts & Theater', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=life-entertainment%2Flocal%2Fart-theater*&l=100&f=rss&t=article'),
        (u'Life and Entertainment - Books & Literature', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=life-entertainment%2Flocal%2Fbooks*&l=100&f=rss&t=article'),
        (u'Life and Entertainment - Food and Dining', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=life-entertainment%2Flocal%2Ffood-drink*&l=100&f=rss&t=article'),
        (u'Life and Entertainment - Home and Garden', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=life-entertainment%2Flocal%2Fhome-gardening*&l=100&f=rss&t=article'),
        (u'Life and Entertainment - Movies and TV', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=life-entertainment%2Flocal%2Fmovies-tv*&c=life-entertainment%2Fnation-world%2Fmovies-tv*&l=100&f=rss&t=article'),
        (u'Life and Entertainment - Music', u'http://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=entertainment%2Fmusic*&l=50&f=rss&t=article'),
        (u'Life and Entertainment - Travel', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=life-entertainment%2Flocal%2Ftravel*&l=100&f=rss&t=article'),
        (u'Life and Entertainment - Columns - Kevin C. Johnson', u'https://www.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2Fcolumn%2Fthe-blender*&l=100&f=rss&t=article'),
        (u'Opinion - Editorial', u'http://www.stltoday.com/search/?c=opinion%2feditorial&d1=&d2=&s=start_time&sd=desc&f=rss&l=25&t=article'),
        (u'Opinion - Letters to the Editor', u'https://www.stltoday.com/search/?c=opinion%2Fletters&d1=&d2=&s=start_time&sd=desc&f=rss&l=25&t=article'),
        (u'Opinion - Local Columns', u'https://www.stltoday.com/search/?c=opinion%2fcolumn*&d1=&d2=&s=start_time&sd=desc&nfl=ap&nk=%23noshow,dcc&f=rss&l=25&t=article')
    ]PK�Xp@�stackoverflow.png�PNG


IHDR(-SWPLTE����V#�a2ϸ��1���fff������xO�l�{�P�װ����������­��w�A�`�Ϡ�–��i�f3���shIDATx^u�Y
AEQ���μ�u�L(H�x�Ja�"�Q
�U��x��(4g'�DX;lWǔ�>���:�cd�y�m:��a�^�1�B\���-z�AS��ނvZ�IEND�B`�PK�X^�ڃ�stackoverflow.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
blog.stackoverflow.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class StackOverflowBlog(BasicNewsRecipe):
    title = 'Stack Overflow - Blog'
    __author__ = 'Darko Miletic'
    description = 'a programming community exploit'
    category = 'blog, programming'
    publisher = 'StackOverflow team'
    oldest_article = 30
    language = 'en'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = True
    encoding = 'utf-8'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    feeds = [(u'Articles', u'http://blog.stackoverflow.com/feed/')]
PK�X)��!!stamgasten.png�PNG


IHDR�a�IDATxڕ���Q��m{�m���x�m۶�(
�m۶�}�[��3����S�꼪#~6Ca㽪$>�I=P88�R��R8*\��y�Ȗ-&L **��'O���7j׮}S�+#^ڬ�:u*&�瀀�>}ʴi�H�2e?%�lKP�ϟ'66�^�z3f�$��:̻3e٧���Po(@�J�8z��gϦc�v���I��W����|	�+�U����&]�I�Ҩ#2d`��4hЀ�+W�~��
�̕���«mg�C�H�|E8�Z���jժt�ޝt��F�n�1&���3g� fN�ɰ�MiTE�ԔAu�BB3�.�E˖-	N��R�J���/l���"m�c�$2a̙3���Ф�4i��z���uǩ��8@�nݒȕ+ϟ?DZG��%K���%
p���_�Nٲeɟ?���;pUxx��G�����/޿χ�,W-Z��n��ʪ[���V�Z-�`��<S��~ (�46IEND�B`�PK�X?+stamgasten.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1347706704(BasicNewsRecipe):
    title = u'Stamgasten'
    __author__ = u'DrMerry'
    description = u'Stamgasten de populaire strip van Toon van Driel (http://www.toonvandriel.nl)'
    language = u'nl'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = False
    cover_url = 'http://shop.toonvandriel.nl/productimg.php?type=canvas&id=15&size=large'
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    remove_tags_before = dict(id='title')
    remove_tags_after = dict(attrs={'class': 'entry-content rich-content'})
    extra_css = 'img{border:0;padding:0;margin:0;width:100%}'

    feeds = [(u'Stamgasten', u'http://toonvandriel.nl/feed/')]
PK�X^s�HHHstandardmedia_ke.png�PNG


IHDR�aIDATxڬ���P�ጭ�栶m۶m۶m۶m[�c��͞j\mf�{�#��<�P11(Ӕ�}�s v�=}6��$K/�7{~�i�\H�"L;�:�.R{�E&�{��
�KV���{���c����ҵ������ۑ����Dž���4Ɠ<�4YQ���F�W���b
�O�)�Z.��sOYw�]V^0�����ѡ��A�~8Ϟ��
�ސ��A*�?D�=7�|�
/>zy��S�]eʁ��{k�E��Ó)� %M��|5�M_M�^���o)�/>��{�F�go>0k�Nf~®��d
8>`���7q~@�GΡ�u���0h}�Yz.���n۩<����	�{p������ē2� �ʵ�=�[�c��d�=�<�FR~�qi��<E��$-�"��v���T����}/�ǟ���ԙq�bOJ�5l���;�7j�s��%+�;��l�Qʹ�T}�*A�����+Vo�x��&W��l���7�3p�]�o�Îk�x�2v�C6���:������L�@l�
��IEND�B`�PK�XI����standardmedia_ke.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Hans Donner <hans.donner at pobox.com>'
'''
www.standardmedia.co.ke
'''

from calibre.web.feeds.news import BasicNewsRecipe


class StandardMediaKeRecipe(BasicNewsRecipe):

    __author__ = 'Hans Donner'

    title = u'The Standard'
    description = 'News from Kenia'
    language = 'en'
    country = 'KE'
    publication_type = 'newspaper'
    publisher = 'standardmedia.co.ke'
    category = 'news, politics, Kenia'

    masthead_url = 'http://www.standardmedia.co.ke/images/easLogoOther.gif'

    max_articles_per_feed = 200
    oldest_article = 3

    use_embedded_content = False
    remove_empty_feeds = True

    no_stylesheets = False

    feeds = [(u'Headlines', u'http://www.standardmedia.co.ke/rss/headlines.php'),
             (u'Business', u'http://www.standardmedia.co.ke/rss/business.php'),
             (u'Politics', u'http://www.standardmedia.co.ke/rss/politics.php'),
             (u'Editorial', u'http://www.standardmedia.co.ke/rss/editorial.php'),
             (u'Columnists', u'http://www.standardmedia.co.ke/rss/columnists.php'),
             (u'Sports', u'http://www.standardmedia.co.ke/rss/sports.php'),
             (u'Entertainment', u'http://www.standardmedia.co.ke/rss/entertain.php')]

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    def print_version(self, url):
        import re
        p = re.compile('http://www.standardmedia.co.ke/.*InsidePage.php')
        return p.sub('http://www.standardmedia.co.ke/print.php', url)

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X��!llstandardmoney.png�PNG


IHDRa~e�PLTEB�������0f� Z�?q�Ct�c����ԏ��W���ؿ�������W�M{�`��/e�o��o����F�5i���ɟ�ѡ�ѡ��M�N���ٺ��Hw���������������������"[�O}����P}��_��T+D�IDATx�]˅��P��7�}���̼�o$��^1�=�EvSL99V�?�����t���lZ��u��Y����D�M}H�^P��ݚh�Sm�i��^��MG��t�H5�X�ոri�kG��A\����ya��h-�JQj�	l��RQ
�IEND�B`�PK�X�C8�SSstandardmoney.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
standard.money.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class StandardMoneyRo(BasicNewsRecipe):
    title = 'Standard Money Ro'
    __author__ = u'Silviu Cotoar\u0103'
    publisher = 'Standard Money'
    description = 'Portal de Business'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania'
    encoding = 'utf-8'
    cover_url = 'http://assets.standard.ro/wp-content/themes/standard/images/standard-logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h1', attrs={'class': 'post-title'}
             ), dict(name='div', attrs={'class': 'content_post'})
    ]

    feeds = [
        (u'Actualitate', u'http://standard.money.ro/feed')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X���--star_gazetesi.png�PNG


IHDR  D����PLTE�������������������������������	�������
������������������������	�����
�!#��
������������������������
�
�������'*��������������#'�$(�()�)&�),�34�!�.1�03�20�(,�/2�/4�45�56�BB�*/�24�9:�=<�AA�EF�MO�;>�HH�UV�BF�IK�MO�NP�PS�]]�IL�MR�SU�]_�_`�]^�_`�on�ie�jl�ln�qq�sq�ss�st�ps�|}�}��������������������������������	�����������������������������������������
�	�������������
�������������������������������
W��tRNS��{�dE>IDATx^U�S�$A�ѹ�Yjqm{i۶m۶m۶m�e�q�{���8���O%�%4�8y�cB�.��݈]L������_+���B"ngzW�d��q �L��'��^�(����� �yh+� =��ou�e��r������sn��W2���4��w��O��J���'�ɮ� ���7W��eY��X�Fs���""�*�(G��GMA5����@Zg���̯����	f�m�e��D뇩d�b�{��9�g�2g��
���/H�	��Ek���MM�_�h9:�bz6��9��� �m	����W�8���@�G�\�H���'��w��0U�@ӌԶYuZx�%�L(/Q���I}�/�g�'�T4wܿi|�Nڔ ��i���JP����`�J<b�%b�	&��8��U8f��`#qTR��`�Hm����]���7]�𵣪� ��i�6؀��KΆ�:��`���	4��G΢tp6K�{eJ��,��ςϪ��`3�V�R��ط��cqx�����pRRRq���)���w&\y4$�~���!�@�W�IEND�B`�PK�XBm��d	d	star_gazetesi.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class Star (BasicNewsRecipe):

    title = u'Star Gazetesi'
    __author__ = u'thomass'
    description = 'yeni Türkiye''nin Gazetesi'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    publisher = 'thomass'
    category = 'güncel, haber, türkçe'
    language = 'tr'
    publication_type = 'newspaper'

    conversion_options = {
        'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }
    extra_css = '  .font8{font-weight: bold; font-size:20px}.font11{font-weight: normal; font-size:small}#hdetay{ font-family:sans-serif;font-size: 9px }'

    keep_only_tags = [dict(name='div', attrs={'class': ['font8']}), dict(
        name='span', attrs={'class': ['font11']}), dict(name='div', attrs={'id': ['hdetay']})]

    cover_img_url = 'http://www.stargazete.com/starnew/img/starlogo.png'
    masthead_url = 'http://www.stargazete.com/starnew/img/starlogo.png'
    remove_empty_feeds = True

    feeds = [


        (u'MANSET', u'http://open.dapper.net/services/starmanset'),
        (u'GÜNCEL', u'http://www.stargazete.com/guncel.xml'),
        (u'POLİTİKA', u'http://www.stargazete.com/politika.xml'),
        (u' EKONOMİ', u'http://www.stargazete.com/ekonomi.xml'),
        (u'DÜNYA', u'http://www.stargazete.com/dunya.xml'),
        (u'YAZARLAR', u'http://www.stargazete.com/gazeteyazarlar.xml'),
        (u'SPOR', u'http://www.stargazete.com/spor.xml'),
        (u'SPOR YAZARLARI',
         u'http://www.stargazete.com/index.php?metot=rss&islem=sporyazarlar'),
        (u'SİNEMA', u'http://www.stargazete.com/sinema.xml'),
        (u'KADIN&SAĞLIK', u'http://www.stargazete.com/kadinsaglik.xml'),
        (u' STARTEK', u'http://www.stargazete.com/startek.xml'),
        (u' AÇIK GÖRÜŞ', u'http://www.stargazete.com/acikgorus.xml'),
        (u'Star PAZAR', u'http://www.stargazete.com/pazar.xml'),
        (u'Star CUMARTESİ', u'http://www.stargazete.com/cumartesi.xml'),



    ]

    def preprocess_html(self, soup):  # remove links
        for alink in soup.findAll('a'):
            if alink.string is not None:
                tstr = alink.string
                alink.replaceWith(tstr)
        return soup
    # def print_version(self, url):
    # return url.replace('/', 'http://www.stargazete.com/')
PK�X{��zzstaradvertiser.png�PNG


IHDR  D���?PLTE������������U��U����������������������Կ�Կ�������3e�IDATxڕQ��0��-9){����}@]YZ�Ѿ̇Y0��0>3���A�,�g�'&b�$"%7��@��+G�;N��,X�3�/=B
QR�U��6�2	�2i�L�(�u��Xy<ԙ�0$�"���*���m���af|��D��JS}�����΍�2EfNv��(�B�M#�H�V���YK��т�ە�i9�	fqq�RZ�,�c����K�m�2޳���q���'��C��}IEND�B`�PK�X_����staradvertiser.recipe__license__ = 'GPL v3'
__copyright__ = '2011, M. Ching modified from work 2009-2011 Darko Miletic <darko.miletic at gmail.com>'
'''
staradvertiser.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Starbulletin(BasicNewsRecipe):
    title = 'Honolulu Star-Advertiser'
    __author__ = 'Darko Miletic'
    description = 'Latest national and local Hawaii sports news'
    publisher = 'Honolulu Star-Advertiser'
    category = 'news, Honolulu, Hawaii'
    oldest_article = 2
    max_articles_per_feed = 100
    language = 'en'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publication_type = 'newspaper'
    auto_cleanup = True

    feeds = [
        (u'Breaking News',
         u'http://www.staradvertiser.com/category/breaking-news/feed/'),
        (u'Business', u'http://www.staradvertiser.com/business/feed/'),
        (u'Sports', u'http://www.staradvertiser.com/sports/feed/'),
        (u'Features',
         u'http://www.staradvertiser.com/features/feed/')
    ]
PK�X�.R�FFstarnberger_merkur.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X􋙷DDstarnberger_merkur.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Starnberger Merkur'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard', u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Kreis Starnberg', u'http://www.merkur-online.de/lokales/starnberg/rssfeed.rdf'),
    (u'Lkr. Starnberg', u'http://www.merkur-online.de/lokales/starnberg/landkreis/rssfeed.rdf'),
    (u'Starnberg', u'http://www.merkur-online.de/lokales/starnberg/starnberg/rssfeed.rdf'),
    (u'Die\xdfen', u'http://www.merkur-online.de/lokales/starnberg/diessen/rssfeed.rdf'),
    (u'Tutzing', u'http://www.merkur-online.de/lokales/starnberg/tutzing/rssfeed.rdf'),
    (u'Berg', u'http://www.merkur-online.de/lokales/starnberg/berg/rssfeed.rdf'),
    (u'Gilching', u'http://www.merkur-online.de/lokales/starnberg/gilching/rssfeed.rdf'),
    (u'Gauting', u'http://www.merkur-online.de/lokales/starnberg/gauting/rssfeed.rdf'),
    (u'Herrsching', u'http://www.merkur-online.de/lokales/starnberg/herrsching/rssfeed.rdf'),
    (u'Seefeld', u'http://www.merkur-online.de/lokales/starnberg/seefeld/rssfeed.rdf'),
    (u'Andechs', u'http://www.merkur-online.de/lokales/starnberg/andechs/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/starnberg/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X��
��stars_and_stripes.png�PNG


IHDR  ��dIDATx���y���g۶m۶oQ�n7�5���n���X��"��~��f0~�8�d��xd�eB5�����v���H���1��;-ků��
���~��ͮxj�g��(�<pD&���	��|7���`�֟8��L=0�[j��4�/fkKp���	�68+����=������dz�|p��p��S���T���)���~#G����\��s�8�Q�=�m�/s��V���z
ʎ���G7(���}�̲�l>�c��
D��?���\�Y��5n�,�E��kFDŽ�:VMյ-�&Ɗ�/�R$Sy.�ą7�;��_m��Rs}"��E����E�������p��|ݟ�E��":ۄz�;�G�/0<5E[l]�!��U����[��\}�ю�ܞ_�M����=�&�i�k>�AH�f�������~�"����ɤlv�Y�z��m��͙P��[�h����q{n�?Gu�Ԧ��w���z�bOep�OKW��AeM������7�j{?�Z۽
뚧�i��m����U>��NX��םHo��L�{s�OC*�k4��D�_�",���?��";�cMw����+�fK��
�P�_Z�.��:�ek���K99��g�2��l���_��Hڜ�AUP���#��ǚ�A/�GtqX�j���Z��7]|N����<Ò��1><�Ů,"���@�`IÔ9('`UC1�&*U���δQf�o8�����1�:i��
5fGT��L,/k����QI�������Ϫ�r�<aBo�)T���$X�;�j&L�1�aso�r(��(���b�
#	��[@��{\N���m,�-�?�.!�}�u�RBs�'`}L�L�)��+����%��o��z��^o��JY�q5�jaT��e�yK��H����&�hk{���Q�,@eE�`\�	�9�eD���&c0|BM��X��dpZݞ�t뾍�ᖶ���]^Y��߶�S���E�'aסG��G���Li{���}�ə̎}ۆ&�T׻���;5�|%����v#P\R,~�	�_�c��;����n|d�:��_UT�2}�؀"�����]&s'��l߸w
��IEND�B`�PK�XLý�qqstars_and_stripes.recipe''' Stars and Stripes
 '''


import re
from calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1308791026(BasicNewsRecipe):
    title = u'Stars and Stripes'
    oldest_article = 3
    max_articles_per_feed = 100
    __author__ = 'adoucette'
    description = 'The U.S. militarys independent news source, featuring exclusive reports from Iraq, Afghanistan, Europe and the Far East.'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'stripes.com'
    category = 'news, US, world'
    language = 'en'
    publication_type = 'newsportal'
    preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')]
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }
    keep_only_tags = [dict(name='div', attrs={'class': ['element article']})]
    remove_tags_after = [dict(name='ul', attrs={'class': 'inline-bookmarks'})]
    feeds = [
        (u'News', u'http://feeds.stripes.com/starsandstripes/news'),
        (u'Sports', u'http://feeds.stripes.com/starsandstripes/sports'),
        (u'Military Life', u'http://feeds.stripes.com/starsandstripes/militarylife'),
        (u'Opinion', u'http://feeds.stripes.com/starsandstripes/opinion'),
        (u'Travel', u'http://feeds.stripes.com/starsandstripes/travel')
    ]
PK�X�8����starwars.png�PNG


IHDR(-StPLTE�����;;���������������??����@@�II�MM�{{���ō�լ�֭������..����22����99�::����‡��KK����%%ƍ��Ə�������ǎ�ȓ�ʕ�˔�˗�̖���##����<<�((Ä�Ň�ŋ�Ō��))��//�00�11��

��

̗�Ι�Ν�ϥ�Х�ѡ�Ң�ҧ�Ӥ�ԩ��֬��$$ׯ�ر�ٲ�ڵ�۷�۸�ܸ�߽�྾���������������������������BB�EE������������%%�����""�??�WW����TT�WW�\\�^^�ee�pp�ss�ww�������������pp������m�IDATx^=�C�@���h�=�m۶m��EEt.Sp�k��,NF"�B�m�E_*��=#���K�ay��:;��-]�B>D�f��ɉ`.b�ھP7
0��}���� u��)_�-�D�T�j��
t�}M7�~_�tf%�l��+J���n�2=P��*���M��~u��v��m� ��v<_�?՚n�_�W������2< �E�IEND�B`�PK�XD�~~starwars.recipe# -*- coding: utf-8 -*-
from calibre.web.feeds.news import BasicNewsRecipe


class TheForce(BasicNewsRecipe):
    title = u'The Force'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    encoding = 'cp1252'

    remove_stylesheets = True
    conversion_options = {'linearize_tables': True}
    remove_tags_after = dict(name='div', attrs={'class': 'KonaBody'})
    keep_only_tags = dict(
        name='td', attrs={'background': '/images/span/tile_story_bgtile.gif'})
    remove_tags = [
        dict(name='iframe'),
    ]

    feeds = [
        ('The Force',
         'http://www.theforce.net/outnews/tfnrdf.xml'),
    ]

    def preprocess_html(self, soup):
        for tag in soup.findAll(name='i'):
            if 'Remember to join the Star Wars Insider Facebook' in self.tag_to_string(tag):
                for x in tag.findAllNext():
                    x.extract()
                tag.extract()
                break
        tag = soup.find(attrs={'class': 'articleoption'})
        if tag is not None:
            tag = tag.findParent('table')
            if tag is not None:
                for x in tag.findAllNext():
                    x.extract()
            tag.extract()

        for img in soup.findAll('img', src=True):
            a = img.findParent('a', href=True)
            if a is None:
                continue
            url = a.get('href').split('?')[-1].partition('=')[-1]
            if url:
                img.extract()
                a.name = 'img'
                a['src'] = url
                del a['href']
                img['src'] = url
        return soup
PK�X�V+mmstiintasitehnica.png�PNG


IHDR�a4IDATxڤS�]A�z�m~۶��m۶m۶ͨF�6lP���CR�o�����P��9��	]0
�L�J�\�X�c��R�ci�ě0iDsl\�K�5Ű�U(� ��!�G��z�RP<G���8��]ږ�M�B�����{�B��O�qg��+����������
��W
�bR�ES[`���a9�:�T��k�1�[�Z5*J3���)QL|�˦�8�J�uI^����B�(�Y�(/I��j���i���@���@��2ҷK>^]�����dFq���3�g>_�e�ˮNJ��xzҋ7����?ƆS���Hh��٤C�J7f6��X<9��-l6 ��HZJ�g�L*F��d\ؒ�M�l��u�7���ƹ%�y]�������9���
��
rzs�S�&Z���	�ctO8��{&��̛�//xpi���&���X,�X���أ]&^\�`�T������V��%Nn����ѫ}F$F�CPR��G4¶%��7C]U�|��.�nLGI�C$�46dg�3�A~.0��dG�F+ >J.��kJL{�IEND�B`�PK�X�+jssstiintasitehnica.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
stiintasitehnica.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Stiintasitehnica(BasicNewsRecipe):
    title = u'\u0218tiin\u021b\u0103 \u015fi Tehnic\u0103'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'\u0218tiin\u021b\u0103 \u015fi Tehnic\u0103'
    publisher = u'\u0218tiin\u021b\u0103 \u015fi Tehnic\u0103'
    oldest_article = 50
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = u'Ziare,Reviste,Stiinta,Tehnica'
    encoding = 'utf-8'
    cover_url = 'http://www.stiintasitehnica.com/images/logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'mainColumn2'})
    ]

    remove_tags = [
        dict(name='span', attrs={'class': ['redEar']}), dict(name='table', attrs={'class': ['connect_widget_interactive_area']}), dict(name='div', attrs={'class': ['panel-overlay']}), dict(name='div', attrs={ 'id': ['pointer']}), dict(name='img', attrs={'class': ['nav-next', 'nav-prev']}), dict(name='table', attrs={'class': ['connect_widget_interactive_area']}), dict(name='hr', attrs={'class': ['dotted']})  # noqa
    ]

    remove_tags_after = [
        dict(name='hr', attrs={'class': ['dotted']})
    ]

    feeds = [
        (u'Feeds', u'http://www.stiintasitehnica.com/rss/stiri.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�XT�!���stnn.png�PNG


IHDR  szz��IDATxڵ�t��ֆ������C�	P�"?�{�
!��.#ȸ�v��]R�
2v�q��C�4U��r��|\��[�Y{�y��g���s�x�E\W�aU�j��Fx�Y���ߘ���2t���?���xb>� -�}�R"�$L���:B�i䟢�6O��&Xz'�{��s��1��nQoWAJ���p�|����Q�"W� Ǻ����� 	NlL��zM�� ˀ	X��Oc�9d���q3o�����|R��|{v7,`���+�a�“���?�_������1OTg�ߨ�������?�e�_�k�I(�=�WvQ��c��:��~���1��"���:*���|���zDB��~5|�@��HX�c�
���V,&Z��/z�~��XH�[�&o��-o���9�O��41C�-/?�����S;��NPmĞe����Fx�WDV׋�Db�Y���M)��:A�R�Wi���).)�]�
��a��?H��x���X��t�3D
ߕX7vi��«5/-oO�t6�1e���@������h"E_+�N/�ۤ�S=8�z(���>���Ы��
N�C�$�����D�7��	��� ���"8���|��� �[�Vc�<��֡�gv��G�N\�p�o�O�C.X��d�6>�ЎHI��J#������/*��Z�)�k�َ��[�OT�1���_*VY�RU���E5nM�ڽ�/��R����ڜ�����6b+q�֗�d��)Z�\L�(���	@h��_�ĵ��X9X�\�  4e	_�C�2�գ�J�A\/z�Ȫ��t�
t�x�DKos"E�6�z����hQ��/</��zdu
UQ�ƒH�5�J�*�����k����j�J[�^~��TT�t�H�����0�)�mp��V�2��
~��|ן��C{/��"���D���Y�����@ Rr�?��`���^���
�m5��ܾ��W����|E� �^J.t�W�N������8������W���d���
�TI7��I�g������Xo�m�4�p{~=tO@�xD,o�a
�[�9�)���k�`��X^��V;���E�9������������@�z.�
{?�i.�:�a���<Z�Q��`��"��T��;�^�yE�ŵ��n��L��^�[����@�H�/�d_����Ь��)�RثڸB
�a�@��`5>��ޚ�23�$6��<������	W��˓ġ$}@�h�5[�DA�L»	Q��`m"#�����+r��&��L|"�}�yzx�X2=0sO����@l黭��"-��=r�qpx��5	8�F�x]4jq=$��ުĤ�!U'�g���w���y6���z=�z%)�S��ٓaϖ�#-�*���	x@�����˰p6d퀢�L��c�2��}U#cr�s>z�]��%^�D`�����^�X#�`h����3�Y�|�`��q�<��Nb�1���p�s�-	�%6G��0���u>�S����챙g�	Z���.��y��|���^�N�A8��R{���b��FxU�w�t|��y—{�x���-��|�yU"	sk�8����v�Q`pB�B�}7��_x"�p���7/�U���z��#�mP��=��x�����<𤵫6X����֬�l�dM�7��<�b��J7<�˦�S/��?���v�ȅ,�W �[�+�D��~�[��,+�s�M�Ϗ�sKr���
��7�,�����6�\t���cn��r���5���ܶ�:Z��v�ڇ�o7'v�.@s�	���&����F��*�|�X���Yv�����?cA遳�$̬E��\\����]k�~bϙ���l;CFNmaL��_D�_C��$^�`�Ƕu�7��x���X��爬L�7s:N4��{�U	�u����x4ζ�-��
�c
Y�	aݛ�h���N&��m�UP����Ye����q~�����ǣ��'Z�	���?F�}���P�m�ДcU�ńc�	�j��j?�N�k�&0�d���qDJ�.zUY�%o�WA��m��S�	N��� z� �i��$Uv5�{QO�u��F�HY�'0���6��x��ƠL���IEND�B`�PK�X��&���stnn.recipe

__license__ = 'GPL v3'
__copyright__ = '2010, Larry Chan <larry1chan at gmail.com>'
'''
Singtao STNN
'''
from calibre.web.feeds.recipes import BasicNewsRecipe


class SingtaoSTNN(BasicNewsRecipe):
    title = 'Singtao STNN'
    __author__ = 'Larry Chan, larry1chan'
    description = 'Chinese News'
    oldest_article = 2
    max_articles_per_feed = 100
    simultaneous_downloads = 5
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'gb2312'
    publisher = 'Singtao STNN'
    category = 'news, China, world'
    language = 'zh'
    publication_type = 'newsportal'
    extra_css = ' body{ font-family: Verdana,Helvetica,Arial,sans-serif } .introduction{font-weight: bold} .story-feature{display: block; padding: 0; border: 1px solid; width: 40%; font-size: small} .story-feature h2{text-align: center; text-transform: uppercase} '  # noqa
    masthead_url = 'http://www.stnn.cc/images/0806/logo_080728.gif'
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }

    remove_tags_before = dict(name='div', attrs={'class': ['page_box']})
    remove_tags_after = dict(name='div', attrs={'class': ['pagelist']})

    keep_only_tags = [
        dict(name='div', attrs={'class': ['font_title clearfix']}),
        dict(name='div', attrs={'id': ['content_zoom']})

    ]

    remove_attributes = ['width', 'height', 'href']

    # for a full list of rss check out [url]http://www.stnn.cc/rss/[/url]

    feeds = [(u'Headline News', u'http://www.stnn.cc/rss/news/index.xml'),
             (u'Breaking News', u'http://www.stnn.cc/rss/tufa/index.xml'),
             (u'Finance', u'http://www.stnn.cc/rss/fin/index.xml'),
             (u'Entertainment', u'http://www.stnn.cc/rss/ent/index.xml'),
             (u'International', u'http://www.stnn.cc/rss/guoji/index.xml'),
             (u'China', u'http://www.stnn.cc/rss/china/index.xml'),
             (u'Opnion', u'http://www.stnn.cc/rss/fin_op/index.xml'),
             (u'Blog', u'http://blog.stnn.cc/uploadfile/rssblogtypehotlog.xml'),
             (u'Hong Kong', u'http://www.stnn.cc/rss/hongkong/index.xml')

             ]
PK�X]1w�&&stopgame.png�PNG


IHDR  D����PLTE����"+�"+������������������"+�����+����+������������"+���ﰱ������'.�2;����+�����������������������+2���������BF����28쒓������������"'��28��������덎ﵶ�vx����\]�����������������������Z\����`e�������wz�����흟�������|~�����������������st����"+꒓���ퟠ쟟裏ﴵ�tu�뀂��������ꅅ������gi�����������`c����������Z]�����������������'.ᄒ��������늋풒�ef�������ԍNCIDATx^��S�sA��(�ƶm۶m��g�2�L�o��}�ߪ��ee��� dh,��T@�� G3��ƪ:Ȗ�#��U3���Y:U�U=�v�^��4�f���Ok�5**�H$�Tt���t�N�8�o>;�����*�۷��F(���n+���(�˕�?
sL#�QN� �.�8��.�)�� u��b~a�0�lf�x<�5뼼��I��n�-a{��`O�OBr�@=���X�Ot��rpv��$�W�`7�w�I��;���GL�)�/�}����;d?H$�O�~�����t֘�:L���4����IEND�B`�PK�X�M
��stopgame.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class StopGame(BasicNewsRecipe):
    title = 'StopGame'
    __author__ = 'bugmen00t'
    description = ' \u0420\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0439 \u0438\u0433\u0440\u043E\u0432\u043E\u0439 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u043F\u043E\u0440\u0442\u0430\u043B, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043A\u043E\u043B\u043B\u0435\u043A\u0442\u0438\u0432 \u0430\u0432\u0442\u043E\u0440\u043E\u0432 \u0440\u0430\u0441\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u0432\u0441\u0435\u043C \u0436\u0435\u043B\u0430\u044E\u0449\u0438\u043C \u043E \u0432\u0438\u0434\u0435\u043E\u0438\u0433\u0440\u0430\u0445. '  # noqa
    publisher = 'StopGame.ru'
    category = 'blog'
    cover_url = u'https://images.stopgame.ru/blogs/2020/01/29/U7R7t5rQ.jpg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 50

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': '_end-info_zp673_1113'})

    remove_tags = [
        dict(name='section', attrs={'id': 'comments'}),
        dict(name='footer'),
        dict(
            name='section',
            attrs={'class': '_page-section_xdzdd_387 _additional-reads_zp673_1348'}
        )
    ]

    feeds = [
        (
            '\u0412\u0441\u0435 \u0440\u0430\u0437\u0434\u0435\u043B\u044B',
            'https://rss.stopgame.ru/rss_all.xml'
        ),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://rss.stopgame.ru/rss_news.xml'
        ),
        (
            '\u0421\u0442\u0430\u0442\u044C\u0438',
            'https://rss.stopgame.ru/articles.xml'
        ), ('\u0412\u0438\u0434\u0435\u043E', 'https://rss.stopgame.ru/videos.xml'),
        ('\u0411\u043B\u043E\u0433\u0438', 'https://rss.stopgame.ru/all_topics.xml')
    ]
PK�X%�m��straitstimes.png�PNG


IHDR��h6�IDATx�P_�La=3ߟ��H(A������THPQ��x�H��T�@�E�@���{�~ߌK�L���9�!�[]OR�&�hycW�EA�M]��c,��S�Τ�z#�3
�4�Wb��CEr��`��L& 6F1w�T��/^��9���'��:s�b����!2�u[	�Ӈ�������O�ѣӝGO�m^�;�,��е����f���l�{܎4t��;p�γ7��m�Ÿ�+6���^/�3i���={�ꞝۚin�j#�.Շ'�߮�f�$Q�c@���5|���#�ȏ�>��Q�6z���U:I4��I gT��T�X)dм%>~��#;��[�&����++� ����c(ډIB�-~����;K�R@�5ID�������~�b�������h@�?S0
��[m�Db�>~�lˉ�s�W�
�Ƶq�$��AYP�M5�N]{�ֽ�o�����}����#H�((�@���!𼱣��X����ݳ[�'/�B&�K��D�rNa�R�w_~����s7/��������yg�I"h���p�U[a(�����s�ڔ�W.���i��.�,b�k�q��6�S8���J�Bph ����dy9�L1V��B԰Z��IEND�B`�PK�X"�a��straitstimes.recipe
__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.straitstimes.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class StraitsTimes(BasicNewsRecipe):
    title = 'The Straits Times'
    __author__ = 'Darko Miletic'
    description = 'Singapore newspaper'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    publisher = 'Singapore Press Holdings Ltd.'
    category = 'news, politics, singapore, asia'
    language = 'en_SG'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }
    keep_only_tags = [
        classes('node-header node-subheadline group-byline-info group-updated-timestamp group-image-frame field-name-body article-content-rawhtml')
    ]
    remove_tags = [
        classes('st_telegram_boilerplate dropdown-menu ads'),
        dict(name='source'),
    ]

    feeds = [
        (u'World'            , u'https://www.straitstimes.com/news/world/rss.xml')
        ,(u'Business'        , u'https://www.straitstimes.com/news/business/rss.xml')
        ,(u'Life'            , u'https://www.straitstimes.com/news/life/rss.xml')
        ,(u'Tech'            , u'https://www.straitstimes.com/news/tech/rss.xml')
        ,(u'Opinion'         , u'https://www.straitstimes.com/news/opinion/rss.xml')
        ,(u'Life'            , u'https://www.straitstimes.com/news/life/rss.xml')
        ,(u'Singapore'       , u'https://www.straitstimes.com/news/singapore/rss.xml')
        ,(u'Asia'     	     , u'https://www.straitstimes.com/news/asia/rss.xml')
        ,(u'Multimedia'      , u'https://www.straitstimes.com/news/multimedia/rss.xml')
        ,(u'Sport'           , u'https://www.straitstimes.com/news/sport/rss.xml')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', srcset=True):
            img['src'] = img['srcset'].partition(' ')[0]
            img['srcset'] = ''
        return soup
PK�X�e�~~strange_horizons.png�PNG


IHDR  D����PLTE�����������������������������������܎��jjjiiilll�����������������������������$$$___������VVVFFF������CDCQKU�w����CCC���zz{'P$n�L�������999###}}}ppp(((���������a5�n4��O�������������uuu��ѱ��j:�l4����


���������i:�!!!RRR���������������DDD���	
af���Ō��������{�}[�k<����)))���2ER�Zd�\^�_Y�aS�dM�fG�iB�l=����===������?OqNe�Zl�[e�]_�`Z�bT�dN�fH�iC�������:::������`�Vp�Yj���Ȼ�غ�ֻ�ռ�Ӿ�ӑu�j;����������***
*Bc������_~�Uo�Xj����xxx{{{���FQaFf�U�ë�����&&&^^^kkjux|q��_��a��X�������󭭭(5Ur�m��h��]�ƍ�������ttt"""
BTlr��w��n��m�Ɲ��������]|�Sm�Vh���߯��g8�j1��M���ڷ������޸����������Ӧ�Χ�������߮�������������������{��s�IDAT8���=ha���q��jJ�M�&(
Z�p"7� �
ZJ�;��R���)"���ADS��"�V�F	kp�Z��N fl���]�����t5ذ^
`۠Z�C�J)�F� �W`�����+.l��?RÈ�H�n�e�b`H�cj1�6��F��N�7�a���luq��a_��J�`���0�����k;��>n�`J��`����O[`�v*����x�[	�w�����v
��z�B�J���N�<��7�Q{y�j���']��.x��U8�Z��e/-Wz�,�T_��#'t��<�Um�Xsdl�SL]n�	�kH���釪��-��~�T��V�(~T��'�_'
KA`uJ�wcV%��=�d���r��
�	�IEND�B`�PK�X���z�
�
strange_horizons.recipefrom collections import defaultdict
from calibre.web.feeds.news import BasicNewsRecipe, classes
import re

class StrangeHorizons(BasicNewsRecipe):
    title = 'Strange Horizons'
    description = 'A magazine of speculative fiction and related nonfiction. Best downloaded on weekends'
    __author__ = 'unkn0wn'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'http://strangehorizons.com/wordpress/wp-content/themes/strangehorizons/images/sh-logo.jpg'

    extra_css = '''
        .author-biographies, .content-warning-container-ltr, .category {font-size:small; font-style:italic; font-color:#404040;}
        .byline {font-size:small; font-color:#202020;}
        .title {font-size:large; text-align:center;}
    '''

    ignore_duplicate_articles = {'url'}

    keep_only_tags = [
        classes('post-container')
    ]

    remove_tags = [
        dict(name = 'button'),
        classes('font-size sharedaddy comments-form-row')
    ]

    def parse_index(self):
        main = self.index_to_soup('http://strangehorizons.com/issue/')
        issue = main.find(attrs={'class':lambda x: x and 'current-issue-widget' in x.split()})
        current = issue.find('a', href=lambda x: x and x.startswith('http://strangehorizons.com/issue/'))
        date = issue.find(**classes('date'))
        self.timefmt = ' [' + self.tag_to_string(date) + ']'
        self.log('Downloading Issue:', self.timefmt, current['href'])
        soup = self.index_to_soup(current['href'])

        feeds_dict = defaultdict(list)

        for art in soup.findAll('div', attrs={'class':'article'}):
            for ti in art.findAll(**classes('title')):
                if a := ti.find('a', href=True):
                    url = a['href']
                    title = self.tag_to_string(ti).strip()

                sec = 'Articles'
                if cat := art.find(**classes('category')):
                    sec = self.tag_to_string(cat).strip()

                desc = ''
                if exp := ti.find_next_sibling(**classes('excerpt')):
                    desc = self.tag_to_string(exp) + desc
                    desc = re.sub(r"\d{5} ", "", desc)
                if auth := ti.find_next_sibling(**classes('author')):
                    desc = self.tag_to_string(auth) + ' | ' + desc

                if not title or not url:
                    continue

            self.log(sec, '\n\t', title, '\n\t', desc, '\n\t\t', url)
            feeds_dict[sec].append({"title": title, "url": url, "description": desc})
        return [(section, articles) for section, articles in feeds_dict.items()]
PK�X�6��rrstrategic_culture.png�PNG


IHDR��h69IDATxڍ�OK�QG�s�}��ӤJ�d��fԌ� �ZGD��D��� 0�M�*�\�� -�,�
+��2SgjFg�{� T	Ag��D�^A��W9�R����g�
���֮��<PYq~��Cy4�4<�P���\l�.���'Sѻ=����?��?�_C�U���ޣ���7&G.w�J����5+���ޡd��v��Z{��I�H�b�Fs2i�u6�H��f����j��ڙ�SKNE���wǍr��Q<�a1�P,]?~���V�Y�P��BK=��Zk&��goM���o���7�u�'�Y��=yaVqɈJ���ФW>e��m?�����ADk�ŢaJ1�8�h���|��(�N�nj�^{8;p�=$��@H��,U,*�67<6�!������z�sFD|dOU�(��]ۨ�<�Ta)8���`E\.��c��"�`����-�[���؋�{#��hC���򲲁*M�|��B�Yqw�dx^+�Pm{���o�1��e�J�gŹM�/ێZ
��,4���renMsD៷�'?z@q�+OIEND�B`�PK�X�CqS��strategic_culture.recipe
__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'

'''
www.strategic-culture.org
'''

import time
from calibre import strftime
from calibre.web.feeds.recipes import BasicNewsRecipe


class StrategicCulture(BasicNewsRecipe):
    title = 'Strategic Culture Foundation'
    __author__ = 'Darko Miletic'
    description = 'Online Journal'
    publisher = 'Strategic Culture Foundation'
    category = 'news, politics'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'en'
    publication_type = 'newsportal'
    masthead_url = 'http://www.strategic-culture.org/img/logo.jpg'
    extra_css             = '''
                             body{font-family: Arial, sans-serif}
                             h1{font-family: "Times New Roman",Times,serif}
                             img{margin-bottom: 0.8em}
                            '''

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        dict(name=['h1', 'p']), dict(name='div', attrs={'id': 'cke_pastebin'})
    ]

    remove_tags = [dict(name=['object', 'link', 'base', 'meta', 'iframe'])]

    feeds = [

    (u'News', u'http://www.strategic-culture.org/blocks/news.html'),
    (u'Politics', u'http://www.strategic-culture.org/rubrics/politics.html'),
    (u'Economics', u'http://www.strategic-culture.org/rubrics/economics.html'),
    (u'History & Culture', u'http://www.strategic-culture.org/rubrics/history-and-culture.html'),
    (u'Columnists', u'http://www.strategic-culture.org/rubrics/columnists.html')
    ]

    def print_version(self, url):
        return url.replace('-culture.org/news/', '-culture.org/pview/')

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(0, _('Fetching feed') + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            soup = self.index_to_soup(feedurl)
            if feedurl.endswith('news.html'):
                clname = 'sini14'
            else:
                clname = 'h22'
            checker = []
            for item in soup.findAll('a', attrs={'class': clname}):
                atag = item
                url = atag['href']
                title = self.tag_to_string(atag)
                description = ''
                daypart = url.rpartition('/')[0]
                mpart, sep, day = daypart.rpartition('/')
                ypart, sep, month = mpart.rpartition('/')
                year = ypart.rpartition('/')[2]
                date = strftime("%a, %d %b %Y %H:%M:%S +0000",
                                time.strptime(day + "/" + month + "/" + year, "%d/%m/%Y"))
                if url not in checker:
                    checker.append(url)
                    articles.append({
                        'title': title, 'date': date, 'url': url, 'description': description
                    })
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�Xn�5oxxstrategy-business.png�PNG


IHDR  �Tg�PLTE�Sj�0���������$IDAT(Scta��@,f1a0ɠ4���b�.f �WUIEND�B`�PK�Xg{���strategy-business.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class StrategyBusinessRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en'
    version = 1

    title = u'Strategy+Business'
    publisher = u' Booz & Company'
    category = u'Business'
    description = (u'Business magazine for senior business executives and the people who influence them.'
                   'Go to http://www.strategy-business.com/registration to sign up for a free account')

    oldest_article = 13 * 7  # 3 months
    max_articles_per_feed = 100
    use_embedded_content = False
    remove_empty_feeds = True
    needs_subscription = True

    no_stylesheets = True
    remove_javascript = True

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('http://www.strategy-business.com/registration')
        for i, f in enumerate(br.forms()):
            if 'gatekeeper_edit' in f.name:
                br.select_form(name=f.name)
                for c in f.controls:
                    if c.name.endswith('_email'):
                        br[c.name] = self.username
                    elif c.name.endswith('_password'):
                        br[c.name] = self.password
                br.submit().read()
                break
        return br

    extra_css = '''
                body{font-family:verdana,arial,helvetica,geneva,sans-serif ;}
                a {text-decoration: none; color: blue;}
                h1 {margin: 0em; padding: 0em;}
                h2 {font-size: medium; font-weight: bold;}
                #sb-date {font-size: xx-small; color: #696969}
                #category {font-style: italic; font-size: small; color: black; margin: 0em; padding: 0em;}
                #byline {font-size: small; color: #666666}
                div.profiles {font-size: small; font-style: italic; color: #696969}
                div.profiles h2 {font-size: medium; font-style: normal; font-weight: bold; color: black}
                '''

    feeds = []
    feeds.append(
        (u'Finance', u'http://feeds.feedburner.com/StrategyBusiness-Finance?format=xml'))
    feeds.append((u'Global Perspective',
                  u'http://feeds.feedburner.com/StrategyBusiness-GlobalPerspective?format=xml'))
    feeds.append(
        (u'Innovation', u'http://feeds.feedburner.com/StrategyBusiness-Innovation?format=xml'))
    feeds.append((u'Marketing And Sales',
                  u'http://feeds.feedburner.com/StrategyBusiness-MarketingAndSales?format=xml'))
    feeds.append((u'Operations And Manufacturing',
                  u'http://feeds.feedburner.com/StrategyBusiness-OperationsAndManufacturing?format=xml'))
    feeds.append((u'Organizations And People',
                  u'http://feeds.feedburner.com/StrategyBusiness-OrganizationsAndPeople?format=xml'))
    feeds.append((u'Strategy And Leadership',
                  u'http://feeds.feedburner.com/StrategyBusiness-StrategyAndLeadership?format=xml'))
    feeds.append((u'Sustainability',
                  u'http://feeds.feedburner.com/StrategyBusiness-Sustainability?format=xml'))
    feeds.append((u'Auto, Airlines And Transport',
                  u'http://feeds.feedburner.com/StrategyBusiness-AutoAirlinesAndTransport?format=xml'))
    feeds.append((u'Consumer Products',
                  u'http://feeds.feedburner.com/StrategyBusiness-ConsumerProducts?format=xml'))
    feeds.append(
        (u'Energy', u'http://feeds.feedburner.com/StrategyBusiness-Energy?format=xml'))
    feeds.append(
        (u'Health Care', u'http://feeds.feedburner.com/StrategyBusiness-HealthCare?format=xml'))
    feeds.append(
        (u'Technology', u'http://feeds.feedburner.com/StrategyBusiness-Technology?format=xml'))
    feeds.append((u'Thought Leaders',
                  u'http://feeds.feedburner.com/StrategyBusiness-ThoughtLeaders?format=xml'))
    feeds.append((u'Business Literature',
                  u'http://feeds.feedburner.com/StrategyBusiness-BusinessLiterature?format=xml'))
    feeds.append((u'Recent Research',
                  u'http://feeds.feedburner.com/StrategyBusiness-RecentResearch?format=xml'))

    keep_only_tags = [
        dict(name='h1'),
        dict(attrs={'class': ['introAndByline', 'content', 'resources']}),
    ]

    remove_tags = []
    remove_tags.append(dict(name='img', attrs={'class': 'content1'}))
    remove_tags.append(
        dict(name='img', attrs={'src': '/media/image/end_of_story.gif'}))
    remove_tags.append(dict(name='div', attrs={'class': [
                       'sb-adarea468', 'GigyaShare', 'moreBlogLinks', 'clearboth', 'GigyaCommentsContainer']}))
    remove_tags.append(dict(name='div', attrs={'id': 'sb-paging'}))
    remove_tags.append(dict(name='div', attrs={'id': 'textsize'}))
    remove_tags.append(
        dict(name='div', id=lambda x: x and x.startswith('div-gpt-ad-')))

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        return url.partition('?')[0] + '?pg=all'
PK�X�<� LLsubstack.png�PNG


IHDR  D���fPLTE
		
1Lf*
g*i+�5
�6
�6�?�A�A�B�M�P�S�W�]�^�^�c�c�e�f�ggÿ�!tRNS
1Lfgi�����������������{gtIDATx���CQ�<��u�C��Xͷ���SB��~*�1
~.�{�)_%$F��%X˚�u���<V��G��{���w��"d����	�Kb�$H!�{8��0�`��; �A��L׉��IEND�B`�PK�XK��EEsubstack.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
#
# Title:        Substack
# License:      GNU General Public License v3 – https://www.gnu.org/licenses/gpl-3.0.html
# Copyright:    Nathan Cook (nathan.cook@gmail.com)
##
# Written:      2020-12-18
##

__license__ = 'GNU General Public License v3 – https://www.gnu.org/licenses/gpl-3.0.html'
__copyright__ = 'Nathan Cook – 2020-12-19'
__version__ = 'v0.1.1'
__date__ = '2020-12-19'
__author__ = 'topynate'

import json
from mechanize import Request

from calibre.web.feeds.news import BasicNewsRecipe


class Substack(BasicNewsRecipe):
    title          = 'Substack'
    __author__     = 'topynate'
    oldest_article = 7
    language = 'en'
    max_articles_per_feed = 100
    auto_cleanup   = True
    needs_subscription = 'optional'
    use_embedded_content = False

# 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)
        if self.username is not None and self.password is not None:
            br.open('https://substack.com/account/login?redirect=%2F&email=&with_password=')
            data = json.dumps({'email': self.username, 'password': self.password, 'captcha_response':None})
            req = Request(
                url='https://substack.com/api/v1/login',
                headers={
                    'Accept': '*/*',
                    'Content-Type': 'application/json',
                    'Origin': 'https://substack.com',
                    'Referer': 'https://substack.com/account/login?redirect=%2F&email=&with_password=',
                },
                data=data,
                method='POST')
            res = br.open(req)
            if res.getcode() != 200:
                raise ValueError('Login failed, check username and password')
        return br
PK�X�)��wwsueddeutsche.png�PNG


IHDR  V%(>IDATx��R!ӄ ݟ@4�F��H$�F��H$�F��h4�D߂�������6�]�o��
�K����E�ϐ�q���r��֤�K ��}��6M�
"(Ȣ5ֻ]	��c���_@�#A�9U���wҡ@<4�fM�v$8l�>����)"��ۻ���D���h^k������.���䳨����W��`f�&�̋�B�F�r�Sq�-PT��X{�E� ?\s&PE��82A��p+y�VVoID:C*��”b�P��d}P���l�Kc������8��L��E3N+���R)u}�'��Di.`�BIEND�B`�PK�X�2�xxsueddeutsche.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
# 2012-01-26 AGe change to actual Year
__copyright__ = '2012, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch sueddeutsche.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Sueddeutsche(BasicNewsRecipe):

    title = u'Süddeutsche.de'
    description = 'News from Germany, Access to online content'
    __author__ = 'Oliver Niesner and Armin Geller'  # Update AGe 2012-12-05
    publisher = u'Süddeutsche Zeitung'
    category = 'news, politics, Germany'
    timefmt = ' [%a, %d %b %Y]'
    oldest_article = 2
    max_articles_per_feed = 100
    language = 'de'
    encoding = 'utf-8'
    publication_type = 'newspaper'
    # 2012-01-26 AGe add from Darko Miletic paid content source
    cover_source = 'http://www.sueddeutsche.de/verlag'
    # 2012-12-05 AGe add
    masthead_url = 'http://www.sueddeutsche.de/static_assets/img/sdesiteheader/logo_standard.a152b0df.png'

    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    auto_cleanup = True

    # 2012-01-26 AGe add from Darko Miletic paid content source
    def get_cover_url(self):
        cover_source_soup = self.index_to_soup(self.cover_source)
        preview_image_div = cover_source_soup.find(
            attrs={'class': 'preview-image'})
        return preview_image_div.div.img['src']

    feeds = [									# 2015-10-22 Spanjaart: redefined most feeds. Previous version did not work anymore.
        (u'Politik', u'http://rss.sueddeutsche.de/rss/Politik'),
        (u'Wirtschaft', u'http://rss.sueddeutsche.de/rss/Wirtschaft'),
        (u'Geld', u'http://rss.sueddeutsche.de/rss/Geld'),
        (u'Kultur', u'http://rss.sueddeutsche.de/rss/Kultur'),
        (u'Sport', u'http://rss.sueddeutsche.de/rss/Sport'),
        (u'Leben', u'http://rss.sueddeutsche.de/rss/Leben'),
        (u'Karriere', u'http://rss.sueddeutsche.de/rss/Karriere'),
        (u'Bildung', u'http://rss.sueddeutsche.de/rss/Bildung'),
        (u'Gesundheit', u'http://rss.sueddeutsche.de/rss/gesundheit'),
        (u'Stil', u'http://rss.sueddeutsche.de/rss/stil'),
        (u'München & Region', u'http://rss.sueddeutsche.de/rss/muenchen'),
        (u'Bayern', u'http://rss.sueddeutsche.de/rss/Bayern'),
        (u'Medien', u'http://rss.sueddeutsche.de/rss/Medien'),
        (u'Digital', u'http://rss.sueddeutsche.de/rss/Digital'),
        (u'Auto', u'http://rss.sueddeutsche.de/rss/Auto'),
        (u'Wissen', u'http://rss.sueddeutsche.de/rss/Wissen'),
        (u'Panorama', u'http://rss.sueddeutsche.de/rss/Panorama'),
        (u'Reise', u'http://rss.sueddeutsche.de/rss/Reise'),
        (u'Technik', u'http://rss.sueddeutsche.de/rss/Technik'),
        (u'Macht', u'http://rss.sueddeutsche.de/rss/Macht'),
        (u'Job', u'http://rss.sueddeutsche.de/rss/Job'),
        (u'Service', u'http://rss.sueddeutsche.de/rss/Service'),
        (u'Verlag', u'http://rss.sueddeutsche.de/rss/Verlag'),

    ]
# AGe 2011-12-16 Problem of Handling redirections solved by a solution of Recipes-Re-usable code from kiklop74.
# Feed is:                    http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5ESport%24?output=rss
# Article download source is: http://sz.de/1.1237295 (Ski Alpin: Der Erfolg kommt, der Trainer geht)
# Article source is:          http://www.sueddeutsche.de/sport/ski-alpin-der-erfolg-kommt-der-trainer-geht-1.1237295
# Article printversion is:
# http://www.sueddeutsche.de/sport/2.220/ski-alpin-der-erfolg-kommt-der-trainer-geht-1.1237295

    def print_version(self, url):
        n_url = self.browser.open_novisit(url).geturl()
        main, sep, id = n_url.rpartition('/')
        return main + '/2.220/' + id
PK�X���ffsueddeutsche_mobil.png�PNG


IHDR  D����PLTELiq����������������������������������.����00��������AM:G����)9MVKT����"4GR2��tv����R[������BN����ch.����imfj����?K��COwy^d@L!3OW`f����di1IS��2A����OX<I=J��������9F(8������������kn��8Frt0?��_e��-=����6D������vx4CQZ>Kxy%6{|7EsvT]mq$6DO2@������EQ 3��JT#5?L��EP��fk9G~~+:��FQ��>J����!4--nrLU.>+<��%7����hlgl(93A����V^��2A"5����bguw\b����GtRNS����6d�ع��3�IDATx�|ɵ�0�7�^�/l����	��hxc��%��'���Z�pB��/�p<�*?8�L���@��ߪ�&׶Ƕ��m۶m��;��|q�DK�z��W���D���������=͞x ���-�^���H�be�/�.��GyC���fÎx>?t�᳧E7@?�ʙ�A"���8�=�&��}s���
��#����k8�c]wdp@�t6�
"���|�u�K�%�ۑ/�S
��ݽI�,2E=����DK@J2喳*�b�MQU�&��΅2!fi���BLU؛�i��Y�$#�*��Dc�U�4�E���k'�����2�O�o�W�k���0�#�_�B�)V��5z��d�
-��D�g\6m��Zv������w�Ǘ�LD 	�66���ʝ�y�o.d��J���G��m_�6��M�-�&�c�g���ß��ym����V*����.O�5�K�c/��u�/��3p5�f��L��=��C(�μ��ώ��B�v[
fGIEND�B`�PK�X4�]�sueddeutsche_mobil.recipe__license__ = 'GPL v3'
__copyright__ = '2012, 2013 Andreas Zeiser <andreas.zeiser@web.de>'
'''
szmobil.sueddeutsche.de/
'''
# History
# 2015.01.02 Daily Cover from https://zeitung.sueddeutsche.de/webapp  by lala-rob (web@lala-rob.de)
# 2014.12.18 Fixing URL set Cover by lala-rob (web@lala-rob.de)
# 2014.10.06 Fixing Login URL and Article URL by lala-rob (web@lala-rob.de)
#
# 2013.01.09 Fixed bugs in article titles containing "strong" and
#            other small changes
# 2012.08.04 Initial release

from calibre import strftime
import datetime
from calibre.utils.date import utcnow
from calibre.web.feeds.recipes import BasicNewsRecipe
import re


class SZmobil(BasicNewsRecipe):
    title = u'Süddeutsche Zeitung mobil'
    __author__ = u'Andreas Zeiser'
    description = u'Nachrichten aus Deutschland. Zugriff auf kostenpflichtiges Abo SZ mobil.'
    publisher = u'Sueddeutsche Zeitung'
    masthead_url = 'http://pix.sueddeutsche.de/img/layout/header/SZ_solo288x31.gif'
    language = u'de'
    publication_type = u'newspaper'
    category = u'news, politics, Germany'
    cover_url = 'https://zeitung.sueddeutsche.de/szdigital/public/issue/previewimage?size=l&issueId=' + \
        (utcnow() + datetime.timedelta(hours=1)
         ).strftime("%Y-%m-%d") + '&targetVersion=3&productId=sz'
    no_stylesheets = True
    oldest_article = 2
    encoding = 'iso-8859-1'
    needs_subscription = True
    remove_empty_feeds = True
    delay = 1

    # if you want to get rid of the date on the title page use
    # timefmt = ''
    timefmt = ' [%a, %d %b, %Y]'

    root_url = 'http://epaper.sueddeutsche.de/app/service/epaper-mobil/'
    keep_only_tags = [dict(name='div', attrs={'class': 'article'})]

    def get_browser(self):
        browser = BasicNewsRecipe.get_browser(self)

        # Login via fetching of Streiflicht -> Fill out login request
        url = 'https://id.sueddeutsche.de/login'
        browser.open(url)

        browser.select_form(nr=0)  # to select the first form
        browser['login'] = self.username
        browser['password'] = self.password
        browser.submit()
        return browser

    def parse_index(self):
        # find all sections
        src = self.index_to_soup(
            'http://epaper.sueddeutsche.de/app/service/epaper-mobil/')
        feeds = []
        for itt in src.findAll('a', href=True):
            if itt['href'].startswith('section.php?section'):
                feeds.append((itt.string[0:-2], itt['href']))

        all_articles = []
        for feed in feeds:
            feed_url = self.root_url + feed[1]
            feed_title = feed[0]

            self.report_progress(0, ('Fetching feed') + ' %s...' %
                                 (feed_title if feed_title else feed_url))

            src = self.index_to_soup(feed_url)
            articles = []
            shorttitles = dict()
            for itt in src.findAll('a', href=True):
                if itt['href'].startswith('article.php?id='):
                    article_url = itt['href']
                    article_id = int(
                        re.search(r"id=(\d*)&etag=", itt['href']).group(1))

                    # first check if link is a special article in section
                    # "Meinungsseite"
                    if itt.find('strong') is not None:
                        article_name = itt.strong.string
                        if len(itt.contents) > 1:
                            shorttitles[article_id] = itt.contents[1]

                        articles.append(
                            (article_name, article_url, article_id))
                        continue

                    # candidate for a general article
                    if itt.string is None:
                        article_name = ''
                    else:
                        article_name = itt.string

                    if (article_name.find("&nbsp;mehr") == 0):
                        # just another link ("mehr") to an article
                        continue

                    if itt.get('id') is not None:
                        shorttitles[article_id] = article_name
                    else:
                        articles.append(
                            (article_name, article_url, article_id))

            feed_articles = []
            for article_name, article_url, article_id in articles:
                url = self.root_url + article_url
                title = article_name
                # if you want to get rid of date for each article use
                # pubdate = strftime('')
                pubdate = strftime('[%a, %d %b]')
                description = ''
                if shorttitles.get(article_id) is not None:
                    description = shorttitles[article_id]
                # we do not want the flag ("Impressum")
                if "HERAUSGEGEBEN VOM" in description:
                    continue
                d = dict(title=title, url=url, date=pubdate,
                         description=description, content='')
                feed_articles.append(d)
            all_articles.append((feed_title, feed_articles))

        return all_articles
PK�X�2�ssueddeutschezeitung.png�PNG


IHDR:����IDATx�c���1�D"@*�}���߿�~����/���	���;EW���g���̓�Λ�^��I���G �MHfh�ϰ�A(�،�/���g����h��;P���-����m�s$G%����t
�
�%��ۦ�����nt;���,Z�� �Ԃ���@-��^v�����n߲�#���(~���.XU�Bɤ!��IEND�B`�PK�Xr�����sueddeutschezeitung.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.sueddeutsche.de/sz/
'''
# History
# 2015.01.02 Daily Cover from https://zeitung.sueddeutsche.de/webapp  by lala-rob (web@lala-rob.de)
# 2014.12.15 Set Cover by lala-rob(web@lala-rob.de)
# 2014.10.02 Fixed url Problem by lala-rob(web@lala-rob.de)

from calibre.web.feeds.news import BasicNewsRecipe
from calibre import strftime
import datetime
from calibre.utils.date import utcnow


class SueddeutcheZeitung(BasicNewsRecipe):
    title = u'Süddeutsche Zeitung'
    __author__ = 'Darko Miletic'
    description = 'News from Germany. Access to paid content.'
    publisher = u'Süddeutsche Zeitung'
    category = 'news, politics, Germany'
    no_stylesheets = True
    oldest_article = 2
    encoding = 'iso-8859-1'
    needs_subscription = True
    remove_empty_feeds = True
    delay = 1
    cover_url = 'https://zeitung.sueddeutsche.de/szdigital/public/issue/previewimage?size=l&issueId=' + \
        (utcnow() + datetime.timedelta(hours=1)
         ).strftime("%Y-%m-%d") + '&targetVersion=3&productId=sz'
    PREFIX = 'http://epaper.sueddeutsche.de'
    INDEX = PREFIX + '/app/epaper/textversion/'
    use_embedded_content = False
    masthead_url = 'http://pix.sueddeutsche.de/img/layout/header/SZ_solo288x31.gif'
    language = 'de'
    publication_type = 'newspaper'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif} '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    remove_attributes = ['height', 'width', 'style']

    def get_browser(self):
        browser = BasicNewsRecipe.get_browser(self)

        # Login via fetching of Streiflicht -> Fill out login request
        url = 'https://id.sueddeutsche.de/login'
        browser.open(url)

        browser.select_form(nr=0)  # to select the first form
        browser['login'] = self.username
        browser['password'] = self.password
        browser.submit()

        return browser

    remove_tags = [
        dict(attrs={'class': 'hidePrint'}), dict(
            name=['link', 'object', 'embed', 'base', 'iframe', 'br'])
    ]
    keep_only_tags = [dict(attrs={'class': 'artikelBox'})]
    remove_tags_before = dict(attrs={'class': 'artikelTitel'})
    remove_tags_after = dict(attrs={'class': 'author'})

    feeds = [

    (u'Politik', INDEX + 'Politik/'),
    (u'Seite drei', INDEX + 'Seite+drei/'),
    (u'Thema des Tages', INDEX + 'Thema+des+Tages/'),
    (u'Meinungsseite', INDEX + 'Meinungsseite/'),
    (u'Wissen', INDEX + 'Wissen/'),
    (u'Panorama', INDEX + 'Panorama/'),
    (u'Feuilleton', INDEX + 'Feuilleton/'),
    (u'Medien', INDEX + 'Medien/'),
    (u'Wirtschaft', INDEX + 'Wirtschaft/'),
    (u'Sport', INDEX + 'Sport/'),
    (u'Bayern', INDEX + 'Bayern/'),
    (u'Muenchen', INDEX + 'M%FCnchen/'),
    (u'Muenchen City', INDEX + 'M%FCnchen+City/'),
    (u'Jetzt.de', INDEX + 'Jetzt.de/'),
    (u'Reise', INDEX + 'Reise/'),
    (u'SZ Extra', INDEX + 'SZ+Extra/'),
    (u'Wochenende', INDEX + 'SZ+am+Wochenende/'),
    (u'Stellen-Markt', INDEX + 'Stellen-Markt/'),
    (u'Motormarkt', INDEX + 'Motormarkt/'),
    (u'Immobilien-Markt', INDEX + 'Immobilien-Markt/'),
    (u'Thema', INDEX + 'Thema/'),
    (u'Forum', INDEX + 'Forum/'),
    (u'Leute', INDEX + 'Leute/'),
    (u'Jugend', INDEX + 'Jugend/'),
    (u'Beilage', INDEX + 'Beilage/')
    ]

    def parse_index(self):
        src = self.index_to_soup(self.INDEX)
        id = ''
        for itt in src.findAll('a', href=True):
            if itt['href'].startswith('/app/epaper/textversion/inhalt/'):
                id = itt['href'].rpartition('/inhalt/')[2]
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(0, ('Fetching feed') + ' %s...' %
                                 (feedtitle if feedtitle else feedurl))
            articles = []
            soup = self.index_to_soup(feedurl + id)
            tbl = soup.find(attrs={'class': 'szprintd'})
            for item in tbl.findAll(name='td', attrs={'class': 'topthema'}):
                atag = item.find(attrs={'class': 'Titel'}).a
                ptag = item.find('p')
                stag = ptag.find('script')
                if stag:
                    stag.extract()
                url = self.PREFIX + atag['href']
                title = self.tag_to_string(atag)
                description = self.tag_to_string(ptag)
                articles.append({
                    'title': title, 'date': strftime(self.timefmt), 'url': url, 'description': description
                })
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X$H��DDsunday_times_magazine.png�PNG


IHDR  V%(	pHYs��~��IDAT8��ӽ�P�&l&K7C�Q\��H܀K`��$�����Ą��aP�|�J��i�ؼ�74O��|mAo�_���3m&cZ�%c�A�
�H�r �ɡaJ�o�y�0��@T�8I#�	ڥ����-�h��*pb�8�q'���V�
=9o
��&YT��u��.�:�1�[Q�k�6���&��3p_��^���5�G����,� h\���f��%�Y�K�)�6|�@�{�yGgIEND�B`�PK�Xcba�VVsunday_times_magazine.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2019'
'''
www.thetimes.co.uk/magazine/the-sunday-times-magazine/
'''

from mechanize import Request

from calibre import random_user_agent
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 TimesOnline(BasicNewsRecipe):
    title = 'The Sunday Times Magazine UK'
    __author__ = 'Bobby Steel & Darko Miletic'
    description = 'Newsmagazine from United Kingdom and World'
    language = 'en_GB'
    publisher = 'Times Newspapers Ltd'
    category = 'news, politics, UK'
    oldest_article = 3
    max_articles_per_feed = 500
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    delay = 1
    needs_subscription = True
    publication_type = 'newspaper'
    INDEX = 'https://www.thetimes.co.uk'
    LOGIN = 'https://login.thetimes.co.uk/'
    PREFIX = u'https://www.thetimes.co.uk'
    extra_css = """
        .author-name,.authorName{font-style: italic}
        .published-date,.multi-position-photo-text{
            font-family: Arial,Helvetica,sans-serif;
            font-size: small; color: gray;
            display:block; margin-bottom: 0.5em}
        body{font-family: Georgia,"Times New Roman",Times,serif}
    """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language}

    def get_browser(self, *a, **kw):
        start_url = self.INDEX
        kw['user_agent'] = random_user_agent(allow_ie=False)
        br = BasicNewsRecipe.get_browser(self, *a, **kw)
        self.log('Starting login process...')
        res = br.open(start_url)
        sso_url = res.geturl()
        self.log(sso_url)
        request_query = {
            'username': self.username,
            'password': self.password,
            's': 1,
            'gotoUrl': self.INDEX,
        }
        rq = Request(self.LOGIN, headers={
            'Accept': 'text/html',
            'Accept-Language': 'en-US,en;q=0.8',
            'X-HTTP-Method-Override': 'POST',
            'X-Requested-With': 'XMLHttpRequest',
        }, data=request_query)
        self.log('Sending login request...')
        res = br.open(rq)
        return br
    # }}}

    def get_cover_url(self):
        from datetime import date
        from datetime import timedelta
        today = date.today()
        today_index = today.weekday()
        if (today_index == 5):  # new edition drops on Saturday AM
            today += timedelta(1)
        elif (today_index < 5):  # Mon-Thurs
            today_index = (
                today_index + 1
            ) % 7  # Recalibrate to days back MON = 0, SUN = 6 -> SUN = 0 .. SAT = 6
            today = today - timedelta(today_index)  # Rewind to most recent Sunday
        cover = 'https://cdn2-img.pressreader.com/pressdisplay/docserver/getimage.aspx?file=1174' + today.strftime(
            '%Y') + today.strftime('%m') + today.strftime(
                '%d') + '00000000001001&page=1&scale=100'
        self.log(cover)
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover)
        except:
            self.log("\nCover unavailable")
            cover = None
        return cover

    remove_tags = [
        classes('Topics is-hidden Tooltip Toolbar Comments RelatedLinks'),
        {'name': ['object', 'link', 'iframe', 'base', 'meta', 'script']}, {
            'attrs': {
                'class': [
                    'tools comments-parent', 'u-hide', 'Tooltip',
                    'Toolbar Toolbar--bottom', 'Comments Article-container',
                    'ArticlePager', 'Media-caption', 'RelatedLinks']}}, {
                        'attrs': {
                            'class': lambda x: x and 'Toolbar' in x}}]
    remove_attributes = ['lang']
    keep_only_tags = [
        dict(attrs={'id': 'article-main'}),
        dict(attrs={'class': 'f-author'}),
        dict(attrs={'id': 'bodycopy'})]

    feeds = [(
        u'The Sunday Times Magazine',
        u'http://www.thetimes.co.uk/magazine/the-sunday-times-magazine/'),
             (u'Sunday Times Style', u'http://www.thetimes.co.uk/magazine/style/')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)

    def parse_index(self):
        totalfeeds = []
        lfeeds = self.get_feeds()
        for feedobj in lfeeds:
            feedtitle, feedurl = feedobj
            self.report_progress(
                0,
                _('Fetching feed') + ' %s...' %
                (feedtitle if feedtitle else feedurl))
            articles = []
            soup = self.index_to_soup(feedurl)
            for atag in soup.findAll('a', href=True):
                parentName = atag.parent.name
                title = self.tag_to_string(atag).strip()
                if (
                    parentName == 'h2' or
                    parentName == 'h3') and title is not None and title != '':
                    url = self.INDEX + atag['href']
                    articles.append({
                        'title': title,
                        'date': '',
                        'url': url,
                        'description': ''})
            totalfeeds.append((feedtitle, articles))
        return totalfeeds
PK�X��(,,
superbebe.png�PNG


IHDR(-SKPLTE�����*��*��"������
��������|�:��F��R��n�Ԋ��������������Լ�Ą�KtRNS@��f�IDATxm�Q� ��Fi��I��t�Ӈ��af��&Y�����Ӂ3`L�<�<�j}R٬ǵ��)e))��M�T)��
[���[�c�㹳Hic8n�XH��Z����R�aB�渴��U5x�:��_��;./�m�R���IEND�B`�PK�X��D��superbebe.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
superbebe.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Superbebe(BasicNewsRecipe):
    title = u'Superbebe'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'Superbebe'
    publisher = 'Superbebe'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Bebe,Mamici'
    encoding = 'utf-8'
    cover_url = 'http://www.superbebe.ro/images/superbebe.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']}), dict(
            name='div', attrs={'class': ['tags']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['tags']})
    ]

    feeds = [
        (u'Feeds', u'http://www.superbebe.ro/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X
���superesportes.png�PNG


IHDR  ��UIDATxڵ��k#_ۆ��A;�!B(%�BBhiiiח��������Kݻ��mݭ���6�ڻ��߇��}?��o��/�~
���A��峥��ؼt��%�ɱj�y�g<j|�����f�԰������S���ڞ���?m��Fg�pFt�0º7�;��TK.̐�ºR�Y��]�ǁ��ʪK��h?f@�B�l�4~q�*�XVx֢�IQ�;�t�Lݏa�
A���B���V�-���M���$�z?�QrCblL�_<���z��u�
՞T�����/�'��	1>(�T"@��v3I��)܊`g�
���l��9��;�4<�C�
�z�XɂO6���^��a!`�QZ�;����W'KI��KBB��IcS�-ؾwi��w���4L�f$I�+eQJ����D���vG�r9,{�܎0) $),>~��]k6�@�`��8�|�pKq��*cx��D%Г�%���G���e�pz��qYOo���3�Κ0�hd���!+I�-�TŸ%�wZ2�K*R��$���b�ֵ�dW�{��U�(v;��p������	&x��a���cVX�~tt�I�1jҹ�
��֦��&`?��Ͼ��S�is���x
��o�*O'+��(A��%�jLJ�)U��P�%�ElpʋWϟ4=޴mcyeٳ�O{zz^�z�ܳmt��W�!gc�Q����O%��,9�*�Yg�� ���2~Z��W�[Z8)�V>{񬤬�����)��#8�h��lʲ%��<@��)2�|w��tQ��PJ[�n�����s`wYU	`8u��vH�`�P=���$1��X���T�`k
85í�n��;�[wn����)C�O����5*
�1IR;��C��
n��K�n�?��ԌAw�84K���v[����"���\"���͒(8�x����7��g\J�(r8�
�(���ͫ>�����ݒ;'�o�h{��V��9��"ĥ���ʁ���NJ����iX��I��gp��e)���Yc�G3‘�Ј��9������Hs�}��/bY�SCx�(��|,��W,,��`W&O&qi$&�9�
4��$�suuE���@9������7}�|�>�^��.]����N���dJ
X�&�`�2erDN��'S�F7�:b`80ɼ�y<�^���^��
:ʲ]�M�e�:�c�))ꇕOő<���g8Ofq5���$�K�Q����~��Bb�3�TL�q.���x6�x<��94��vE4P���T@~Q�מ/ܶ|��)�('��
�)����p��T/[�и�MC@@��(��]�薲��xv�__�|>r��S*é+S3�S�4����y@���m_�tյU�}��{���ƭ�E�pu�l��@�&#��d�6�`�������?+�t�ء�FM�	`��]ѱ�R �=�ʉ�ݲ��~�=�&tO��K���6��mݱA�(K�ML�6������O��,1 !&>����f0�G�ۿ~��wٿH@z��EƐ�������� q��7��|����%�����LIEND�B`�PK�XE[֮&
&
superesportes.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Luciano Furtado <lrfurtado at yahoo.com.br>'
'''
www.superesportes.com.br
'''

from calibre.web.feeds.news import BasicNewsRecipe


class SuperEsportesRecipe(BasicNewsRecipe):

    title = u'www.superesportes.com.br'
    description = u'Superesportes - Notícias do esporte no Brasil e no mundo'
    __author__ = 'Luciano Furtado'
    language = 'pt'
    category = 'esportes, Brasil'
    no_stylesheets = True
    oldest_article = 7

    use_embedded_content = 0
    max_articles_per_feed = 10
    cover_url = 'http://imgs.mg.superesportes.com.br/superesportes_logo.png'

    extra_css = 'div.info_noticias h1 { font-size: 100% }'

    remove_tags = [
        dict(name='div', attrs={'class': 'topo'}),
        dict(name='div', attrs={'class': 'rodape'}),
        dict(name='div', attrs={'class': 'navegacao'}),
        dict(name='div', attrs={'class': 'lateral2'}),
        dict(name='div', attrs={'class': 'leia_mais'}),
        dict(name='div', attrs={'id': 'comentar'}),
        dict(name='div', attrs={'id': 'vrumelc_noticia'}),
        dict(name='div', attrs={'class': 'compartilhe'}),
        dict(name='div', attrs={'class': 'linha_noticias'}),
        dict(name='div', attrs={'class': 'botoes_noticias'}),
        dict(name='div', attrs={'class': 'barra_time bg_time'}),
    ]

    def parse_index(self):
        feeds = []
        sections = [
            (u'Atletico', 'http://www.df.superesportes.com.br/futebol/atletico-mg/capa_atletico_mg/index.shtml'),
            (u'Botafogo', 'http://www.df.superesportes.com.br/futebol/botafogo/capa_botafogo/index.shtml'),
            (u'Corinthinas', 'http://www.df.superesportes.com.br/futebol/corinthians/capa_corinthians/index.shtml'),
            (u'Cruzeiro', 'http://www.df.superesportes.com.br/futebol/cruzeiro/capa_cruzeiro/index.shtml'),
            (u'Flamengo', 'http://www.df.superesportes.com.br/futebol/flamengo/capa_flamengo/index.shtml'),
            (u'Fluminense', 'http://www.df.superesportes.com.br/futebol/fluminense/capa_fluminense/index.shtml'),
            (u'Palmeiras', 'http://www.df.superesportes.com.br/futebol/palmeiras/capa_palmeiras/index.shtml'),
            (u'Santos', 'http://www.df.superesportes.com.br/futebol/santos/capa_santos/index.shtml'),
            (u'S√£o Paulo', 'http://www.df.superesportes.com.br/futebol/sao-paulo/capa_sao_paulo/index.shtml'),
            (u'Vasco', 'http://www.df.superesportes.com.br/futebol/vasco/capa_vasco/index.shtml'),
        ]

        for section, url in sections:
            current_articles = []

            soup = self.index_to_soup(url)
            latestNews = soup.find(
                name='ul', attrs={'class': 'lista_ultimas_noticias'})

            for li_tag in latestNews.findAll(name='li'):
                a_tag = li_tag.find('a', href=True)
                if a_tag is None:
                    continue
                title = self.tag_to_string(a_tag)
                url = a_tag.get('href', False)
                self.log("\n\nFound title: " + title +
                         "\nUrl: " + url + "\nSection: " + section)
                current_articles.append(
                    {'title': title, 'url': url, 'description': title, 'date': ''})

            if current_articles:
                feeds.append((section, current_articles))

        return feeds
PK�X
_Tޓ�
svd_se.png�PNG


IHDR:���tRNSv��8LIDATx�cd@���h�¼����w~�Ƨ^
-�Tq����s&.�d��İ7S�{��gK
���o���8.�.��Wj!��IEND�B`�PK�X�D{���svt_nyheter.png�PNG


IHDR  D����PLTE��������������򿿿��������������������������������������������猌���������������������̧�����   �����ջ����������Ɗ����昘���������᭭�}}}���������������!!!�����������������틋�777������������(((ggg{{{---JJJ��������ӹ�����xxx�����������������߬����嵵���⠠����������������������%%%hhh~~~


)))WWW���iiiTTTFFF���vvv>>>111===...���333VVVmmm���"""���MMMUUU���GGG:::���ddd


555���������\\\IIIA0=d�IDATx�����P�9��8km�Vm۶m��v��'o�}|E3���߀�f����� XC�k��IGUg#�M-Y�ʞ�Af�)��=
ꮿ��@�g�>}�^O{D��f���yz<����<�_���D�XC5$:q����!����a=��\���
~����=���؋���+d�QW�QH 713���>�,`$KV�k�d��=�P"�cb����03>o{o��@�jp[�=�U�^S��7�ٻ�%�g�\P݁��r#�z��HG���J�?�`A"!������ٳDs+�$G����ۚ����l�LX�t~�w���{�]�dJ�9%���Fd쏅�rg�`�X���8̈́�"�I�[�)'����#��-QS��fc�l����'�(�IFdh���5:�,���Gx;�IEND�B`�PK�XS6�`��svt_nyheter.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1599382724(BasicNewsRecipe):
    title          = 'SVT Nyheter'
    __author__     = 'Jonatan Nyberg'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True
    language = 'sv'
    description = u'SVT:s nyhetstjänst med nyheter från hela Sverige och världen inom kultur, sport, opinion och väder.'
    publisher = 'SVT Nyheter'
    category = 'news'
    cover_url = 'https://www.svtstatic.se/resources/svtservice-n-render/svt-nyheter-logo_3.svg'

    feeds          = [
        ('SVT Nyheter', 'https://www.svt.se/nyheter/rss.xml'),
    ]
PK�X�i�ssswarajya.png�PNG


IHDR  szz�:IDATxڭW�cY>����-c�y�m��ٶVc�f�gsl;�ݧR���I2�v�I.�����ɟ������lWJ��c���uu����ll����M�Q|�tWj꼆�FI{q1�b�,,d


���N��ݷ_���}���-[|-]�����7ϸ�m�c_��,��>Y�w�b�==j��)OώK���i�/Ymm��nە���	__��Q�kia���""�ќAc�q��I~02�t����8��0�vvS���e�ph�3'��:�h�>��7�k~�(��$���_��d�{�2A��LO�ͮ6��K�����Aje%���9��,Ì�el,��VZ�Jw�`����1t$?�?��]�;��К5 ����匘8��S�{��w��0��3F�C�����/#�v�ZWDtG�rm�O���W�����3+)ї��֔�d�N3��mƴ�K����<�;�s���9п2E0so|<�y�H�:����D�������Y7p���h�t�Q��"c��2��N���5hfK�Y��K�BObߔL��$�o�M` \�?�RR��=�iipu�bq@�&lF�c�X�
�본�rG�F.tǠ��VH��֭��Jww"��r���������E+d3��c�)�sW@_fTz��x}!tE�9�l��H޿~���E�{���Š��Qc1ܛ��`�6���BN2�?ƛ�a8%L��
7���i y����!�-���:�>�RK��L�'���0��7Z�8��U0�6]b��0���w��T�q�I،ک����*_Oo(�&�k�cU��pr���f2���}����B��`�$�(zY�	����9�tf��%�5����HP*���
� lC.*Xor4����˝@1&ҹ+d6� g�����{�
$�>��km�4��c��5����u0��)�&�_�R�s@����̤l�0��'�G�P�@oj,��ď)����	�)1��t��1�`�AI��c ����K��.v,0�TO!4X���2xE�;9p�tG��_9ح�;a������iw7�L55�	�Bt��+��I3^ԛ�C���7=�k��vǀ�"DEH J>�A��p�_]��nn�bt�jj>,�7	�8 A_l��P[-��q�̌@`!SFy
о}7��z������<߿|	YYD@܌Z�\���N�hz�)v��ՙg@w4795 ~��u���]���Z�n��g�z0"�x@c�ee,�@�+�E�vT���5���d�0��O�jx95Ň�q>���xl�}�ӧ�k+/g\����H�3N�2��(���ϡ;���(����?���2��G�� �*S͞�ht��є�
�<��0���"�ǜ!e۷�G%W$1a	�ࣸ�
a�o���J��͌	s�^�ׇ	��
i:���P��lwJ��8��_4�ӌ����V(�쓥����55��5�h��}�j?����wj����UB{}�l^��Uwv��i�õ'�)��9���X۱�gS��oj������ɿg��L��XkIEND�B`�PK�X.��M((swarajya.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class SwarajyaMag(BasicNewsRecipe):
    title = u'Swarajya Magazine'
    __author__ = 'unkn0wn'
    description = 'Swarajya - a big tent for liberal right of centre discourse that reaches out, engages and caters to the new India.'
    language = 'en_IN'
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    remove_attributes = ['height', 'width', 'style']
    encoding = 'utf-8'

    keep_only_tags = [
        dict(name='article')
    ]

    remove_tags = [
        dict(name=['svg', 'button', 'source']),
        classes('swarajya_patron_block hs-tooltip-content hidden'),
    ]

    def preprocess_html(self, soup):
        for span in soup.findAll('span'):
            if self.tag_to_string(span).strip() == 'Tags':
                div = span.findParent('div')
                if div:
                    div.extract()
        return soup

    def parse_index(self):
        soup = self.index_to_soup('https://swarajyamag.com/all-issues')
        a = soup.find('a', href=lambda x: x and x.startswith('https://swarajyamag.com/issue/'))
        url = a['href']
        self.log('Downloading issue:', url)
        self.cover_url = a.img['src']
        soup = self.index_to_soup(url)
        ans = []

        for div in soup.findAll('div', attrs={'class':'rounded'}):
            url = div.findParent('a')['href']
            if url.startswith('/'):
                url = 'https://swarajyamag.com' + url
            h4 = div.find('h4')
            title = self.tag_to_string(h4)
            d = h4.next_sibling
            desc = 'By ' + self.tag_to_string(d).strip()
            self.log(title, ' at ', url, '\n', desc)
            ans.append({'title': title, 'url': url, 'description': desc})
        return [('Articles', ans)]
PK�X��7�iiswiat_obrazu.png�PNG


IHDR�a0IDATxڄ��$f��Ic��m�6�6fc׶T�ڳ���m۶ƞ�����pës�u�\��	Rq �a~�һ3���d�d���h)"�i:��P8,�˹JN�=/�N�IS}�#��yJw0= ��8~�}���Q^U
�ɨ�P�p8,��$�4'����n�ãDW諿� �N��보����ž�gm�y�.���UM�IF���'�ɩ)��ۼչ�J-���F4��ٳ�������(��Z��	�ffl	���?LtR���
ri���m��Z::�'���4#�=�{��L�w�x��446ٹg�d*}S��DW��E��V�W��U��ԥn����	‘�L6K,�g/�t�7��w��w/��?���h-�����p��Pȡ#G�56I�3�x��蘕P�015%�k��O+�kUW�xIº�6e�5=���ggoKp)��s�/.),)q`G���/�c�;e��x���Kf���w����'���L�>�X��H��������
w�A���x"A<L�{ڋ��~V�t���iͭm�]�S5��W_IEND�B`�PK�X�j�#swiat_obrazu.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Swiat_Obrazu(BasicNewsRecipe):
    title = u'Świat Obrazu'
    __author__ = 'fenuks'
    description = u'Internetowy Dziennik o Fotografii i Wideo www.SwiatObrazu.pl to źródło informacji o technice fotografii i wideo, o sprzęcie najbardziej znanych i uznanych firm: Canon, Nikon, Sony, Hasselblad i wielu innych. Znajdziecie tu programy do obróbki zdjęć, forum foto i forum wideo i galerie zdjęć. Codziennie najświeższe informacje: aktualności, testy, poradniki, wywiady, felietony. Swiatobrazu.pl stale organizuje konkursy oraz warsztaty fotograficzne i wideo.'  # noqa
    category = 'photography'
    masthead_url = 'http://www.swiatobrazu.pl/img/logo.jpg'
    cover_url = 'http://www.swiatobrazu.pl/img/logo.jpg'
    language = 'pl'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    feeds = [(u'Wszystko', u'http://www.swiatobrazu.pl/rss')]

    def print_version(self, url):
        return url + ',drukuj'

    def image_url_processor(self, baseurl, url):
        if 'http://' not in url and 'https://' not in url:
            return 'http://www.swiatobrazu.pl' + url[5:]
        else:
            return url
PK�X�t����swiatkindle.png�PNG


IHDR:����IDATx�[JQD�4m^b�����DA�/�33�Jx�D-�H	��~���"����u9	��{�(��|��<���EQ�ׇ����0��8��#IH���$Q�\w{Rq�����R�<?,��F��z��sJ
�ڬڔ)��yS-*%�rԹl��c8���D�a�I��IEND�B`�PK�X��K&&swiatkindle.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = u'2011, Tomasz Dlugosz <tomek3d@gmail.com>'
'''
swiatczytnikow.pl
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class swiatczytnikow(BasicNewsRecipe):
    title = u'Świat Czytników'
    description = u'Czytniki e-książek w Polsce. Jak wybrać, kupić i korzystać z Amazon Kindle i innych'
    language = 'pl'
    __author__ = u'Tomasz D\u0142ugosz'
    oldest_article = 7
    max_articles_per_feed = 100

    feeds = [(u'Świat Czytników - wpisy', u'http://swiatczytnikow.pl/feed')]

    remove_tags = [dict(name='ul', attrs={'class': 'similar-posts'}),
                   dict(name='div', attrs={'class': 'feedflare'})]

    preprocess_regexps = [
        (re.compile(u'<h3>Czytaj dalej:</h3>'), lambda match: '')]
PK�X
��a!!syddjurslokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�Xa�b��syddjurslokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Adresseavisen Syddjurs
'''


class SyddjursLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Adresseavisen Syddjurs'
    description = 'Lokale og regionale nyheder, sport og kultur fra det sydlige Djursland på syddjurs.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Adresseavisen Syddjurs', 'http://syddjurs.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Adresseavisen Syddjurs', 'http://syddjurs.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Adresseavisen Syddjurs', 'http://syddjurs.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Adresseavisen Syddjurs', 'http://syddjurs.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Adresseavisen Syddjurs', 'http://syddjurs.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Adresseavisen Syddjurs', 'http://syddjurs.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�Xz��
t3n_de.png�PNG


IHDR  D����PLTE�B:���������ME�������jc�D<�������JC�F>�uo�MF�D=�������vp�xs�OG�KD�VO���������������ib����C;�������������}�������NG����������������\U���������tn�������QJ����H@������RJ����������wq����d^�[T���������������������PH�JB�e_3�l�IDATx��SbDQ��ƌm۶��/&[�SǠ�?��(�
@G��d��39ImP9�qƤ5=0�!���&�B���΀E���n���(��DQ��X��4�enJJ��3u`Vd2@��W	�駄��0ܰz����>0�1�uI�<�|NH[=�C�M(|N���]i��=Vw���^z?'�
[��8��M�%O,8��4����q~�r���� ��R�IEND�B`�PK�X��Luu
t3n_de.recipe#!/usr/bin/env python2
from __future__ import absolute_import, division, print_function, unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


class germant3n(BasicNewsRecipe):
    title = 't3n.de News'
    cover_url = 'https://upload.wikimedia.org/wikipedia/commons/6/66/Logo_t3n_mit_Schriftzug.png'
    __author__ = 'Volker Heggemann, VoHe'
    # description, some Reader show this in titlepage
    description = u'News from t3n.de - there is a pro version too: https://t3n.de/pro/'
    # Who published the content?
    publisher = u't3n.de/social-media newsfeed'
    # What is the content of?
    category = u'Wir sind digitale Pioniere.'
    use_embedded_content = False
    language = 'de'
    # Removes empty feeds - why keep them!?
    remove_empty_feeds = True

    # remove the rubbish (in ebook)
    auto_cleanup = True
    # now the content description and URL follows
    # feel free to add, wipe out what you need	 							---- can be edit by user
    #
    # some of this are double
    #
    #
    # Make some tests, may you first comment all of them out, and step by step you add what you'll need?
    #

    feeds = [
        ('digitale Wirtschaft',
         'https://t3n.de/tag/digitale-wirtschaft/rss.xml'),
        ('Software und Infrastruktur',
         'https://t3n.de/tag/software-infrastruktur/rss.xml'),
        ('Entwicklung und Design',
         'https://t3n.de/tag/entwicklung-design/rss.xml'),
        ('Marketing', 'https://t3n.de/tag/marketing/rss.xml'),
        ('Gadgets und Livestyle',
         'https://t3n.de/tag/gadgets-lifestyle/rss.xml'),
        ('Startups', 'https://t3n.de/tag/startups/rss.xml'),
        ('Karriere', 'https://t3n.de/tag/karriere/rss.xml'),
        ('E-Commerce', 'https://t3n.de/tag/e-commerce/rss.xml'),
        ('Mobilität', 'https://t3n.de/tag/mobilitaet/rss.xml'),
        ('Digitale Gesellschaft',
         'https://t3n.de/tag/digitale-gesellschaft/rss.xml'),
        ('Podcast',
         'http://feeds.soundcloud.com/users/soundcloud:users:213461595/sounds.rss'
         ),
        # use comment block if you don't need something
        # ('Software und Infrastruktur', ''),
    ]
PK�X�hTaat_online.png�PNG


IHDR  D���&PLTE����r�v����***��������thhh�4����999)))����������R�����pDDD���'''����t�����1�������MMM�R������[[[eee&&&���ooo���������,,,������WWWHHH������%%%��ը��ddd{{{???qqq���bbb���EEE������������:::|||��������...������111���"""444JJJ���������   ����������KKK���<<<�����ݽPr5�IDATx���ӂ�@��c�v��m۶�!���ɬ��K��F��~!�4�""p��QY�c�$cS��j2��x�&v�V�NfzlltuĶ�ߨ\�U!Ю!$��%L�}�(l�*��ޫ;��^�e��x�r�T\Q�x*iŲ�
->��X�A�t��M'���a����1�4���� w��B0���Y�1��6	�!(1\�F�:9�8%Ji��<ܮ���|�p.��B�IEND�B`�PK�X81��t_online.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class T_Online_Recipe(BasicNewsRecipe):
    title = 'T-Online'
    oldest_article = 3
    max_articles_per_feed = 100
    auto_cleanup = True
    __author__ = 'vo_he'
    description = 'RSS-Feeds von T-Online.de - Informations set to Germany'
    publisher = 'http:/feeds.t-online.de/rss'
    publication_type = 'all'
    language = 'de'
    cover_url = 'http://vignette2.wikia.nocookie.net/logopedia/images/2/2c/Hjh.png'

    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True

    scale_news_images = (600, 800)

    masthead_url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/T-online.de.svg/1280px-T-online.de.svg.png'
    # all possible feeds look at:
    # https://www.t-online.de/themen/rss-feed/
    # there are tons of feeds, just type the words of interest after the http://feeds.t-online.de/rss/ link.
    feeds = [
        ('Germany', 'http://feeds.t-online.de/rss/deutschland'),
        ('NEWS', 'http://feeds.t-online.de/rss/nachrichten'),
        ('News Ticker', 'http://feeds.t-online.de/rss/news-ticker'),
        ('Polizei', 'http://feeds.t-online.de/rss/polizei'),
        ('Sport', 'http://feeds.t-online.de/rss/sport'),
        ('Fußball DE', 'http://feeds.t-online.de/rss/fussball'),
        ('Fußball int.',
         'http://feeds.t-online.de/rss/fussball-international'),
        ('Formel 1', 'http://feeds.t-online.de/rss/formel1'),
        ('Freizeit', 'http://feeds.t-online.de/rss/freizeit'),
        ('Ratgeber', 'http://feeds.t-online.de/rss/ratgeber'),
        ('Tourismus', 'http://feeds.t-online.de/rss/tourismus'),
        ('TV', 'http://feeds.t-online.de/rss/tv'),
        ('Wetter', 'http://feeds.t-online.de/rss/wetter'),
        ('Hamburg', 'http://feeds.t-online.de/rss/hamburg'),
        ('Berlin', 'http://feeds.t-online.de/rss/berlin'),
        ('Frankfurt', 'http://feeds.t-online.de/rss/frankfurt'),
        ('München', 'http://feeds.t-online.de/rss/muenchen'),
    ]
PK�X�-''tablety_pl.png�PNG


IHDR�a�IDATxڭұOa���m�F�֚��N5�!��DD�����$,�	�n��1F#;	�S#lŤ	.��z�k������6���'��.��]�ҫd2I�Ӓ�d.�U<�h4*�\Nes�ONݙ������YV�����P(8;�ƃ�{�@DŢ�$�ljD�à�&o��8/�J��d_vv�	7���=E�_J6;�Fa�h�|~A�T*�.�*§�5����Ш�\Y
�^YY����+h�b�q ������[��CYHfn#S1�e}�J�0�����P���y���(�K�8u\�����
"���<R�#��f�mooOYX\R����n�3�X.�V6P[[[{�y�Z�
�񻹭�k 
i��VWW�fff�������U|*��f�ʲ�>�<��(���/Q6��ի`F�zo^��w���X,�T��P�O��W"r˲�,��yv�g��7�*�uWݿ�0��ߎLG�R�CIEND�B`�PK�X�LVpptablety_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class Tablety_pl(BasicNewsRecipe):
    title = u'Tablety.pl'
    __author__ = 'fenuks'
    description = u'Tablety, gry i aplikacje na tablety.'
    masthead_url = 'http://www.tablety.pl/wp-content/themes/kolektyw/img/logo.png'
    cover_url = 'http://www.tablety.pl/wp-content/themes/kolektyw/img/logo.png'
    category = 'IT'
    language = 'pl'
    use_embedded_content = False
    no_stylesheets = True
    oldest_article = 8
    max_articles_per_feed = 100
    preprocess_regexps = [(re.compile(u'<p><strong>Przeczytaj także.*?</a></strong></p>', re.DOTALL), lambda match: ''),
                          (re.compile(u'<p><strong>Przeczytaj koniecznie.*?</a></strong></p>', re.DOTALL), lambda match: '')]
    keep_only_tags = [dict(attrs={'class': ['featured-image', 'article-content clearfix']})]
    remove_tags = [dict(attrs={'class': ['comments_icon', 'wp-polls', 'entry-comments',
                                         'wp-polls-loading', 'ts-fab-wrapper', 'entry-footer', 'social-custom']})]
    feeds = [(u'Najnowsze posty', u'http://www.tablety.pl/feed/')]
PK�XDP���tabu.png�PNG


IHDR��h6KIDATxڥ��Ja�{��,wWӵJ�>"B,�^��*� ��T�eW�JW�Bd��%ED��7�I�l.�®�8?�f���K=�7Q���.*uk�5���{�b05ڨ9��Սn�}�ڀO���;��C�=��[���L��t��Bɹ!�8[��̠�)Pu��un(V�X�T�M�ؑ�-�`��w�����!{�1N�)Mk[��ѐ����]�I�_��;���|*�o���=�@�S3����.#�I���K�V�Bs���D-l0�3%�d��T�jC^]cb"V��8N'0s�O/��g�
�%룞����[�DJ��IEND�B`�PK�X�H���tabu.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
tabu.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class TabuRo(BasicNewsRecipe):
    title = u'Tabu'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'Cel mai curajos site de femei'
    publisher = 'Tabu'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Femei'
    encoding = 'utf-8'
    cover_url = 'http://www.tabu.ro/img/tabu-logo2.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='h2', attrs={'class': 'articol_titlu'}),
        dict(name='div', attrs={'class': 'poza_articol_featured'}),
        dict(name='div', attrs={'class': 'articol_text'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'asemanatoare'}),
        dict(name='div', attrs={'class': 'social'})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': 'social'}),
        dict(name='div', attrs={'id': 'comments'}),
        dict(name='div', attrs={'class': 'asemanatoare'})
    ]

    feeds = [
        (u'Feeds', u'http://www.tabu.ro/feed/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�Xk����tagesan.png�PNG


IHDR  D���3PLTE�F�tRNS 0@P`p��������#��MIDATx�u��� �j���מO��+���V1>�=I>	BC�崚62_zv@�̆X2��OD(��Մ�_T�I��H.�Λ�m",
��8j+s�����;��2i���ɸ��I�8H���o��XN
�#h_C.�qh�ɸ��',,��](�bT��]����:(vaD�uʰ�삣C��q���P���#t^�+�]���{=�W�|�]��B�xb�O&���iT�ͽ1�-k��^��5I��ϑ�j�\tb׌��*ވ:|��˜5^$d{�o#QcR�m�6�#x���T�n�*r���UW6\<AV��+�A����-�z��CIEND�B`�PK�X�tagesan.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1450864843(BasicNewsRecipe):
    title = u'Tagesanzeiger'
    __author__ = 'noxxx'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 8
    no_stylesheets = True
    auto_cleanup = True
    scale_news_images_to_device = True
    compress_news_images = True
    remove_javascript = True
    encoding = 'utf-8'
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}

    feeds = [
        (u'Front', u'http://www.tagesanzeiger.ch/rss.html'),
        (u'Zurich', u'http://www.tagesanzeiger.ch/zuerich/rss.html'),
        (u'Schweiz', u'http://www.tagesanzeiger.ch/schweiz/rss.html'),
        (u'International', u'http://www.tagesanzeiger.ch/ausland/rss.html'),
        (u'Wirtschaft', u'http://www.tagesanzeiger.ch/wirtschaft/rss.html'),
        (u'Sport', u'http://www.tagesanzeiger.ch/sport/rss.html'),
        (u'Kultur', u'http://www.tagesanzeiger.ch/kultur/rss.html'),
        (u'Leben', u'http://www.tagesanzeiger.ch/leben/rss.html'),
        (u'Panorama', u'http://www.tagesanzeiger.ch/panorama/rss.html'),
        (u'Digital', u'http://www.tagesanzeiger.ch/digital/rss.html')
    ]

    keep_only_tags = [dict(name='h1'),
                      dict(name='h3'),
                      dict(name='div', attrs={'id': 'topElement'}),
                      dict(name='div', attrs={'id': 'mainContent'})
                      ]

    auto_cleanup_keep = {'//div[@id="article-image"]',
                         '//*[@class="standard"]'
                         }

    conversion_options = {'base_font_size': 12}

    extra_css = 'h1 { font-size: 150%; font-weight: bold; } \
                 h2 { font-size: 120%; font-weight: bold; } \
                 h3 { font-size: 100%; font-style: italic; } \
                 h4, h5, h6 { font-size: 100%; font-style: italic; }'

    def get_cover_url(self):
        self.cover_url = 'http://newsmail.cleartext.ch/referenz_tagesanzeiger.jpg'
        return getattr(self, 'cover_url', None)
PK�X|��*�
�

tagespost.png�PNG


IHDR# �M��
�IDATx�]�Ut[Iօ��'�����L�nef+ff[��vff���)�xC�a�f����gU���W�.�ٵ�SB����k*lʀ��N��D��|���hܥq���\RO�q��ΩSܢ��Wk���N�5R�B���7D�Q��TA(Y�z�N�������?7����T2fz33r:Ȭ�E�0:��x��Dm�P"v�����:,[b�"
�Q~�Qٵ<܁~��.��5��V���������(u���2F�v�¸*k9��wɵ�U �o�ơ�A
b���!j�F�P�[�v�$��8q���Ƃ]Y��f��L*�0޽�AW�)^��H�g,aRd�s�k�~٤l6B�0�+Ll�Q#](AB������?�xIͩ��c#qW����ߐ�#Ym��ؾ��E>��̩f����y�|���V�J��S�al�0L�Y��| ʈ�0�dT	�$�=��YA-��Rk����h2.Q�Oʗ�O�?�,�m����Ff�Ա�'�[>��ߍd��U�.�>��0���i�,�d�E�c�dl�Md�ձ	�p���Ms�ˑd6��
��i�,?���R��
6^,�cCJ=,1���ߦ���)k��;Gb�rB �Z�%^Qh2뇁B�-Hf��Ŀf�3���'�(@v�qW�r�ϙ���~A߮z�Wߡ��O��"�����LJ\o��Xti���Jڇ��[�DY��71sa�]ȸmV
�*QI�zi&�
k(��@�e(5���x9r>
��6J�[h��}2��j�.](u;�=����R_��Q�/`�X����K��Id�>V�P�@a�Z�{v_}�ΰ��D*�R�]Bq_/I�����f���z�ed�Rk�ހOd4;�0����Z9��Fб|��n�o��Oư��d���t���Rci�R�G˝O0��u��nsen����M�=eԶ�ml��1\i�kʎ#0$�!�%.A]�N^w��J�]@Fǿ�-�#����4��~���k��_���}�K숻����(���v�<�T�{5~�W#1��<L��l��	7��Xq�
��
�����Iڅ��ۗ��Y�v�h���Ϳ�D��lw1�����E�@ҝ�"&.FP揤w�LF�4�g�ѽ��w3)quk%hs��e�ʺ��g�xR�6�ֲC���w�!
;j8�����8z}+�=cUt
B�$q���F'�%&i%q�U�{�;H�*����H�p�C���*~NB���V��2�毠a�*��K�ܽR {��bJ�6�
7�Z���ƵƝ#�W�!d\�d2m�dM�w�H�c]�m�/>Ğգ)�&�Z�l�.�/P������_�ы��Z�/���3�"��]���9J�K�ћ���x�~<�I+�ؐ:#���3H.�#���G�h^��h�o[���h$�����ݹ�Ī��Y�Z����M���^�/R��P��W�}a�Vg��:��#d�졬?@��md4Ԉ��5��|���ő^>��v?��L�aQ�����3h�pĽ��,ߚtʗuӺ�Ol�ɒ�R�^�R^��F�p�y�����YW�=�N���[�u�<���|�z}�.���G���N-�ď�8ry�~����v+X�n'�>�%/���hVR����:S��Fi2~�떲�|�%��i��p7JEH�D'����킈��$�
P�l���p����I�����}5���u$Vo��u��C>n'�IzJf��O����yz|Z�;$�7%��u?I��ik��y��q2�(2��)_*��F�"�Gо����I��Ef�Ψɸ*%�g
TQ�܇o}�.����d�9MlՏ9�^2��Jq�f�����\z����I�L��1���B(��Ûy���>D���ꟻ)�������.�A���ڭ�U�a��i-�!�k+=G��}LF�ϘV�_��ͦp�Oo��vq�4dT?�4#]���0U~��.����\�>;Ͻ�sUҽ{��{L�~��ey,ڙN�/SrOP4����u#�h�I�;e��Dz�
V�P��~�lx�~⼖a��$)r��_Sh��qi'�m�t_��M�!�o�7�fo�'.;����T��j�R�B�X
J�(�����~�*�ZG�z.�.k��>���3r
��
�f]���̥aC���(�k$���\_
}�����J�bR�9�~?�ܾ}��R�eW�;�1_�z�iUm��j�M�'�=��e��0��D���fZ�l�k�?ц��h:�� "aQ�L�]G��Z��t�>�N_/��_9�iңE��C[��4P����R(x]��?�	�]�B�i��.欛DT�:s�6Q#��U��0����H=�!���(�i5xM+'0'�qUSu���T4�-�k�GL�*S_nR�/Ѻ�wm�I�0sh�U�2��\w%$d��9���d�Ӣඌ{�/���ɬiez�1㪇��O�x���7�.��BVԻo�	�6�ڡ7�:�;ԅF0�2�&B�T�v`�I�uJ��ט��3����J�~���?2n�5�/<�[FM�MT���,�<b�
n&#�7d���r��X��mijk$3K�5�؄?�z���?[q��E�(�[D\S�Q#��hw��W�t�؇�c�$r)>��n�S��ܼ(R�G�o��cf��L�}��q���85nhR��2~	� ��:㑶�RIEND�B`�PK�X͏���tagespost.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
__license__ = 'GPL v3'
__copyright__ = '2020, Pat Stapleton <pat.stapleton at gmail.com>'
'''
Recipe for Die Tagespost
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1589629735(BasicNewsRecipe):
    title          = 'Tagespost'
    language       = 'de'
    __author__     = 'Pat Stapleton'
    description = ('Die Tagespost trägt den Untertitel Katholische Wochenzeitung für Politik, Gesellschaft'
        ' und Kultur und ist eine überregionale, wöchentlich im Johann Wilhelm Naumann Verlag in Würzburg erscheinende Zeitung.')
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True
    use_embedded_content = False

    feeds          = [
        ('Tagespost', 'https://www.die-tagespost.de/storage/rss/rss/die-tagespost-komplett.xml'),
    ]

    extra_css = 'td.textb {font-size: medium;}'
PK�X(5-Skktagesspiegel.png�PNG


IHDR��h62IDATx�c�O"`�T��1"��
�d����!�O$P#�	k8�@����Kk�,��IEND�B`�PK�Xi�&FFtagesspiegel.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)})


class TagesspiegelRss(BasicNewsRecipe):
    title = 'Der Tagesspiegel'
    __author__ = 'Kovid Goyal'
    oldest_article = 1
    max_articles_per_feed = 100
    language = 'de'
    publication_type = 'newspaper'
    no_stylesheets = True
    remove_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, verify_ssl_certificates=False)

    def get_cover_url(self):
        from datetime import date
        cover = 'https://img.kiosko.net/' + date.today().strftime('%Y/%m/%d') + '/de/tagesspiegel.750.jpg'
        return cover
    
    keep_only_tags = [
        dict(name = 'header', attrs={'class':'Bo'}),
        dict(name = 'div', attrs={'id':'story-elements'})
    ]

    remove_tags = [
        dict(name = 'aside'),
        classes('iqd_mainAd Bs')
    ]

    feeds = [
        (u'Politik', u'http://www.tagesspiegel.de/contentexport/feed/politik'),
        (u'Meinung', u'http://www.tagesspiegel.de/contentexport/feed/meinung'),
        (u'Berlin', u'http://www.tagesspiegel.de/contentexport/feed/berlin'),
        (u'Wirtschaft', u'http://www.tagesspiegel.de/contentexport/feed/wirtschaft'),
        (u'Sport', u'http://www.tagesspiegel.de/contentexport/feed/sport'),
        (u'Kultur', u'http://www.tagesspiegel.de/contentexport/feed/kultur'),
        (u'Weltspiegel', u'http://www.tagesspiegel.de/contentexport/feed/weltspiegel'),
        (u'Medien', u'http://www.tagesspiegel.de/contentexport/feed/medien'),
        (u'Wissen', u'http://www.tagesspiegel.de/contentexport/feed/wissen')
    ]

PK�X�t?s��taggeschau_de.png�PNG


IHDR  ���IDATx^��[�UW�k�}�>s��Bg3��2�2"-M�m�$P���F��jJ�C��M�|�@l��UK}��
J�1.���e:03L�z�̹���k�N���@5�/�����/{��-ؾ�/�σ1q���ݐܙH*��Ѿ����aw��Zj�m�)��@k"m-jp������	-m���ddɴc�չfz�㣣��R`��ɚt����?*[��Չ�6'�ax̌M�SE�_۴tˏ���_}n�R�����Jd[��t88�i��[⤍���De��!gtdjprn���Yl\߶�ǚVeqC�]J���Z�+����(Wj}����D��x~���O��ʉ�򙏽s��Jh�b�U��S;W�=�C��(�"5�z�������yq�G�~�w3r�ѫ���O5
�����o�==ˤ�P�8���=��p'����R˻IZj*���kם}��ܾ����=��ֵ�z~���_�e���K�Z�N�sj��3f�`�\#��Hf�Q�g����g����F&�/���^]۰}�Zn�А~s<��&r��*�c�Ѿm�?�7��c��F���IP��S�S䋱i���,��Y`�+�)Ku�,�70W��1u�'뀝G�����2H� �2��ue��uS��|?d����U_͵�{����TKV|e��3��mϾ�n�`��#N�W�:0��O�d_c�@`@��0x�k��?�8H���=p[�ɝ��Lc������/�Ֆ�2F�*��@ډ���UREDa<��Í��+���.�\�R�x�O_]�Mh[��=�y��_�:1?V��BȔ4��ǪMES�&(X	D�H!-� �V�W��ٶ��;��w�J"��v>�nu�_�F�2a9��J[�[l�2�SE|�B�X����4�2
�ĵ�������`��@{a%P P�\�tꢰ
a���8*�hTx=F#@���^�ޟ6�V��q�{�yaX��>Qs��x8<�r���+$S����L)��j�P�N�, UE�2J%`d��DFW5eL�z>
�	]�@]��H��4�\R�Q�p^���,@l|����9:D��2	��G&�"���*s$l�M�c4��Mzo�;��_~����*I� ��><�y�|C3�v5<=w)�&?�꠬��3E����~�L=3c�_G���.���/��'�{0��f0|�<���U������&���M�Ak��Gț. b�]��$p�
i�s��w�?W�������)H�Ay=i�/�m^�������2���C�X���Hѿ7`�*�O�E�͆�{R�U��)n�G�݇&�?���V��e�j��"7� X�����<��Kg(��]����7�ˌ�g�Ë�*�G��+�)��x{���g*yC������-�HK�}\�/ёAE�>B���(�w�xn,�|�*���8����oq3*�mٕ��x���7a[�=��Xv<ljx�����e��&�;������W���O\��0���K����}?�R�0J%�\�GA�6��($�aiܾ0ī�B���Fjj���0?{�!,��c���DMm+�=Դb9�ѱ��J��v����/� �w@+�!�$U���v�q�r< ��Ap�f���|���n+�"�E��"V��|IEND�B`�PK�X�sZ'��taggeschau_de.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re
# History:
# 1: Base Version
# 2: Added rules for wdr.de, ndr.de, br-online.de
# 3: Added rules for rbb-online.de, boerse.ard.de, sportschau.de
# 4: New design of tagesschau.de implemented. Simplified.
# 5: Taken out the pictures.


class Tagesschau(BasicNewsRecipe):
    title = 'Tagesschau'
    description = 'Nachrichten der ARD'
    publisher = 'ARD'
    language = 'de'
    version = 5

    __author__ = 'Florian Andreas Pfaff, a.peter'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True

    feeds = [('Tagesschau', 'http://www.tagesschau.de/xml/rss2')]

    remove_tags = [
        dict(attrs={'class': ['socialMedia', 'mediaLink', 'mediaInfo',
                              'linklist teaserImTeaser', 'modCon modConComments']}),
    ]

    keep_only_tags = [
        dict(name='div', attrs={
             'class': ['section sectionZ', 'section sectionZ sectionArticle']}),
        dict(name='div', attrs={'class': re.compile(r'.*containerArticle.*')})
    ]

    def get_article_url(self, article):
        ans = BasicNewsRecipe.get_article_url(self, article)
        if '/multimedia/' in ans:
            ans = None
        return ans
PK�X���
taipei.png�PNG


IHDR  szz��IDATx^�W�kUG>3�Gދ)H#��!�&
��`���t�Bܘ].č؅ nYJ��E]� t�F�Jh�)
Yc���1&��s��q��u�{!��Ǚ7s�;?f��<5�5)�)M��-P��O Z[�A]�}`<���$�j�9s��_�������@
 @��m&/&l{{e)��|m>~<�tv�ռ�?9�_�q�4@���2�DIV��̋{�+�+{
D���aAB���2�+���Q4L���^G��w�}^
>`=�(|%��5��P���!�{
q	Ua�E�}�]�1E�c_OF���m�Ы��:@�T����n�U����k=� (eA��4��x>��/ ��LCQ�֟�"�[S7��M��1�r��V B�
2>~�&�]��ɓ��}K��EiJZJ��İ!c(>q�v=����� �t�>9��F�f�0���KT�W��R��F+ׯ���i7Nw��{�:�%�_�Ƹ���"e�q?A�V����7��;w�X)[-�ۍ?���D|?M�|k���l6������6�WW���i�H��١�˗��zE�5/߽��-���Î�[����C�L�Qg}���Χ̕ly��hk�.\�����XB����Ç���-�>MK��6;�=b�W��ҩS2&6֖\`��w�=����s�([^�X6�;Aq�Z�
�mnR^��A��CK�lR�d�d� ����&���l!vn��آ*�n��ϵ���T���Ж>rU��F�ǎQ� ��΋��%KܷĊR�a�j�D���W`?*f���-i��ll���,�l�N8�%k����8X4�7h���;���ʀϸ&'\�َ^��ǝ��V�������;�a�<�
:p�o��Y��+)�a���j���l�_B�EU_~	L/����λ�$	*�g&�"sݑ�Z��ٯ�1��yC"�ΎT�a��Bd�pt���<b��(�P-�
��fd�B���(�oB�I�DV�^���7����%t��������NA�᫘��zrf+Z�	���i-���ٮ[�� A�������6���;���\~�W�<��A���t�}x�\ƾ
��̀��4yP*���@W��>��֥�O��Q�s�o��S��e��?*!J�+�J�fӘ��x��y$�XDt�"e��!���C�W��dλ�,�NN�u��
	��XaT�E�>�ph��Q�ڃ��Ξ}v�֭�1Vk]���IEND�B`�PK�X�SQ��
taipei.recipeimport 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'
    #         }]
    #     )]
PK�X�d�S��
takiedela.png�PNG


IHDR  D���8PLTE�Z9�������Y8�_?�������`A�Ƚ�^=�eF�jL�[:����`@����^>������������������������������]=�[;����ǻ�kN��������𝊜�����������ba_����fH�Z:�aA������������874����\;������<;8�������������������nQ�����㔓���Ԟ��������������������������985����fG���iig�����ZYWlki������ȼ�_>��������������׭�����| b	IDATx^}�en1��i{h��������x�D�&-9e���ާ�l>9^����&���m'<|���=���n�/N��v,olF/c��;��oH�N�%O�}�!�@s�!��1`wڒ�)Wb=�a�L�@67<�Vdt���'&��gf�@Jvr�<-,.q�/�LN�b���z�āɩ���䴽�r`r��#LN�ZN�GZ~|r�8g����o����P8UsO�Z��������?��R��ߩRͨ�wTP����&�4^�H�IEND�B`�PK�X��3)-)-takiedela.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class TakieDela(BasicNewsRecipe):
    title = '\u0422\u0430\u043A\u0438\u0435 \u0434\u0435\u043B\u0430'
    __author__ = 'bugmen00t'
    description = '\u0418\u0437\u0434\u0430\u043D\u0438\u0435 \u00AB\u0422\u0430\u043A\u0438\u0435 \u0434\u0435\u043B\u0430\u00BB \u043E\u0441\u0432\u0435\u0449\u0430\u0435\u0442 \u0441\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B, \u043F\u0438\u0448\u0435\u0442 \u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u0445 \u043B\u044E\u0434\u0435\u0439 \u0441 \u0440\u0435\u0434\u043A\u0438\u043C\u0438 \u0437\u0430\u0431\u043E\u043B\u0435\u0432\u0430\u043D\u0438\u044F\u043C\u0438 \u0438 \u0438\u043D\u0432\u0430\u043B\u0438\u0434\u043D\u043E\u0441\u0442\u044C\u044E, \u043E \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u043E\u0439 \u043C\u0435\u0434\u0438\u0446\u0438\u043D\u044B, \u0430 \u0442\u0430\u043A\u0436\u0435 \u043E \u0431\u043B\u0430\u0433\u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438 \u0438 \u0441\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0439 \u043E\u0431\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0435 \u0432 \u0420\u043E\u0441\u0441\u0438\u0438. \u0422\u0430\u043A\u0436\u0435 \u0438\u0437\u0434\u0430\u043D\u0438\u0435 \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u043D\u0435\u043A\u043E\u043C\u043C\u0435\u0440\u0447\u0435\u0441\u043A\u0438\u043C\u0438 \u043E\u0440\u0433\u0430\u043D\u0438\u0437\u0430\u0446\u0438\u044F\u043C\u0438, \u0441\u043E\u0431\u0438\u0440\u0430\u044F \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u043E \u0431\u043B\u0430\u0433\u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0440\u043E\u0435\u043A\u0442\u0430\u0445, \u0438 \u0437\u0430\u043D\u0438\u043C\u0430\u0435\u0442\u0441\u044F \u0441\u0431\u043E\u0440\u043E\u043C \u0441\u0440\u0435\u0434\u0441\u0442\u0432 (\u043A\u0440\u0430\u0443\u0434\u0444\u0430\u043D\u0434\u0438\u043D\u0433\u043E\u043C) \u0434\u043B\u044F \u0444\u043E\u043D\u0434\u0430 \u00AB\u041D\u0443\u0436\u043D\u0430 \u043F\u043E\u043C\u043E\u0449\u044C\u00BB.'  # noqa
    publisher = '\u0411\u043B\u0430\u0433\u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0444\u043E\u043D\u0434 \u00AB\u041D\u0443\u0436\u043D\u0430 \u041F\u043E\u043C\u043E\u0449\u044C\u00BB'  # noqa
    category = 'blog'
    cover_url = u'https://takiedela.ru/wp-content/themes/takiedela/assets/image/share/td.jpg'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 30
    max_articles_per_feed = 10

    remove_tags_before = dict(name='header')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(
            name='section',
            attrs={
                'class':
                'b-post__materials b-line b-line_p-60 b-line_grey b-line_nomb'
            }
        ),
        dict(
            name='section',
            attrs={
                'class':
                'b-post-material__other b-line b-line_p-60 b-line_bg b-line_nomb'
            }
        ),
        dict(name='div', attrs={'class': 'b-single__case-closed'}),
        dict(name='div', attrs={'class': 'b-line b-total-sum'}),
        dict(
            name='section',
            attrs={
                'class':
                'b-post-material__help b-line b-line_p-60 b-line_grey b-line_nomb'
            }
        ),
        dict(
            name='section',
            attrs={'class': 'b-line b-line_p-60 b-line_bg b-line_nopb b-line_nomb '}
        ),
        dict(name='header', attrs={'class': 'np-header js-np-header'}),
        dict(
            name='div',
            attrs={
                'class':
                'b-post__head-info__block b-post__head-info__block_views in-tablet'
            }
        ),
        dict(
            name='div',
            attrs={'class': 'np-donate-form__bg np-donate-form__bg_border'}
        ),
        dict(name='div', attrs={'class': 'b-photostory-help i-photostory-help'}),
        dict(name='div', attrs={'class': 'mistape_caption'}),
        dict(name='div', attrs={'class': 'b-photostory__inner'}),
        dict(name='div', attrs={'class': 'b-single__extra i-single__extra'}),
        dict(name='div', attrs={'class': 'b-post__help'}),
        dict(name='div', attrs={'class': 'b-post__other b-post__other_right'}),
        dict(name='div', attrs={'class': 'b-soc i-soc b-soc_blog b-soc_noscroll'}),
        dict(
            name='div', attrs={'class': 'np-socials np-socials_grid js-np-socials'}
        ),
        dict(name='ul', attrs={'class': 'b-post__head-tags in-tablet-sm'}),
        dict(name='ul', attrs={'class': 'b-single__text__categories'}),
        dict(name='div', attrs={'class': 'b-donate-info js-donate-info'}),
        dict(name='div', attrs={'class': 'b-404__materials b-line b-line_grey'}),
        dict(name='div', attrs={'class': 'b-404__funds b-line'}),
        dict(name='div', attrs={'class': 'overlay'}),
        dict(name='div', attrs={'class': 'b-help-info-sticky'}),
        dict(name='div', attrs={'id': 'mistape_dialog'}),
        dict(name='footer'),
        dict(name='form', attrs={'id': 'help'}),
        dict(name='form', attrs={'id': 'form-3dsecure'})
    ]

    feeds = [
        (
            '\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://takiedela.ru/feed/'
        ),
        (
            '\u041F\u043E\u043C\u043E\u0433\u0430\u0435\u043C',
            'https://takiedela.ru/topics/feed/'
        ),
        (
            '\u041A\u043E\u043B\u043E\u043D\u043A\u0438',
            'https://takiedela.ru/rubrics/columns/feed/'
        ),
        (
            '\u041E\u0431\u044A\u044F\u0441\u043D\u0435\u043D\u0438\u044F',
            'https://takiedela.ru/rubrics/explanations/feed/'
        ),
        (
            '\u0424\u043E\u0442\u043E\u0438\u0441\u0442\u043E\u0440\u0438\u0438',
            'https://takiedela.ru/rubrics/photo/feed/'
        ),
        (
            '\u041F\u043E\u0440\u0442\u0440\u0435\u0442\u044B',
            'https://takiedela.ru/rubrics/portret/feed/'
        ),
        (
            '\u0420\u0430\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u044F',
            'https://takiedela.ru/rubrics/rassledovaniya/feed/'
        ),
        (
            '\u0421\u043B\u0443\u0447\u0430\u0438',
            'https://takiedela.ru/genre/cases/feed/'
        ),
        (
            '\u041A\u043E\u043D\u0442\u0435\u043A\u0441\u0442',
            'https://takiedela.ru/genre/context/feed/'
        ),
        ('\u0414\u0440\u0430\u043C\u044B', 'https://takiedela.ru/genre/drama/feed/'),
        (
            '\u0413\u0435\u0440\u043E\u0438',
            'https://takiedela.ru/genre/heroes/feed/'
        ),
        (
            '\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u043D\u0430\u0441\u043B\u0435\u0434\u0438\u044F \u0438 \u0438\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u043F\u0430\u043C\u044F\u0442\u0438',  # noqa
            'https://takiedela.ru/category/cultural/feed/'
        ),
        (
            '\u0414\u0435\u0442\u0441\u0442\u0432\u043E',
            'https://takiedela.ru/category/deti/feed/'
        ),
        (
            '\u0414\u0435\u0442\u0438 \u0441 \u043E\u0441\u043E\u0431\u0435\u043D\u043D\u043E\u0441\u0442\u044F\u043C\u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044F',  # noqa
            'https://takiedela.ru/category/deti-s-osobennostyami-razvitiya/feed/'
        ),
        (
            '\u0414\u0435\u0442\u0441\u043A\u0438\u0439 \u0434\u043E\u043C',
            'https://takiedela.ru/category/detskiy-dom/feed/'
        ),
        (
            '\u041A\u0430\u0442\u0430\u0441\u0442\u0440\u043E\u0444\u044B \u0438 \u0441\u0442\u0438\u0445\u0438\u0439\u043D\u044B\u0435 \u0431\u0435\u0434\u0441\u0442\u0432\u0438\u044F',  # noqa
            'https://takiedela.ru/category/disaster/feed/'
        ),
        (
            '\u0425\u0440\u043E\u043D\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0438 \u043D\u0435\u0438\u0437\u043B\u0435\u0447\u0438\u043C\u044B\u0435 \u0437\u0430\u0431\u043E\u043B\u0435\u0432\u0430\u043D\u0438\u044F',  # noqa
            'https://takiedela.ru/category/illness/feed/'
        ),
        (
            '\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u044B \u0438 \u0438\u0441\u043A\u0443\u0441\u0441\u0442\u0432\u0430',  # noqa
            'https://takiedela.ru/category/kultura/feed/'
        ),
        (
            '\u041C\u0430\u0442\u0435\u0440\u0438 \u0438 \u0434\u0435\u0442\u0438',
            'https://takiedela.ru/category/materi-i-deti/feed/'
        ),
        (
            '\u041C\u0435\u0434\u0438\u0446\u0438\u043D\u0441\u043A\u0430\u044F \u043F\u043E\u043C\u043E\u0449\u044C',
            'https://takiedela.ru/category/medical/feed/'
        ),
        (
            '\u041C\u0435\u0434\u0438\u0446\u0438\u043D\u0430',
            'https://takiedela.ru/category/medicina/feed/'
        ),
        (
            '\u041B\u0413\u0411\u0422+',
            'https://takiedela.ru/category/minorities/feed/'
        ),
        (
            '\u041E\u0431\u0449\u0435\u0441\u0442\u0432\u043E',
            'https://takiedela.ru/category/obshhestvo/feed/'
        ),
        (
            '\u041E\u043D\u043A\u043E\u043B\u043E\u0433\u0438\u044F',
            'https://takiedela.ru/category/onkologiya/feed/'
        ),
        (
            '\u0421\u0438\u0440\u043E\u0442\u0441\u0442\u0432\u043E',
            'https://takiedela.ru/category/orphan/feed/'
        ),
        (
            '\u0414\u0440\u0443\u0433\u043E\u0435',
            'https://takiedela.ru/category/other/feed/'
        ),
        (
            '\u041F\u043E\u043B\u0438\u0446\u0438\u044F',
            'https://takiedela.ru/category/policiya/feed/'
        ),
        (
            '\u041F\u0440\u0430\u0432\u043E\u0437\u0430\u0449\u0438\u0442\u0430',
            'https://takiedela.ru/category/pravozashhita/feed/'
        ),
        (
            '\u041F\u0441\u0438\u0445\u043E\u043B\u043E\u0433\u0438\u044F',
            'https://takiedela.ru/category/psikhologiya/feed/'
        ),
        (
            '\u0416\u0435\u0440\u0442\u0432\u044B \u043D\u0430\u0441\u0438\u043B\u0438\u044F',
            'https://takiedela.ru/category/rape/feed/'
        ),
        (
            '\u0416\u0435\u0440\u0442\u0432\u044B \u0432\u043E\u0435\u043D\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439',
            'https://takiedela.ru/category/victims-of-war/feed/'
        ),
        (
            '\u042D\u043A\u043E\u043B\u043E\u0433\u0438\u044F',
            'https://takiedela.ru/category/yekologiya/feed/'
        ),
        (
            '\u042E\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u043E\u043C\u043E\u0449\u044C',
            'https://takiedela.ru/category/yuridicheskaya-pomoshh/feed/'
        ),
        (
            '\u0416\u0435\u043D\u0449\u0438\u043D\u044B',
            'https://takiedela.ru/category/zhenshhiny/feed/'
        ),
        (
            '\u0416\u0438\u0432\u043E\u0442\u043D\u044B\u0435',
            'https://takiedela.ru/category/zhivotnye/feed/'
        )
    ]
PK�XKZ��AA	tanea.png�PNG


IHDR  D����PLTEm���"D�B�v'F�+H�������t���D�""z"B�p'F�+H�w.H�.J�.J�����������������5}5~s���@�ur"5";"@�"B�"x"D�'x"D�"F�'='@�'D�'|+|'H�+=�+}.~+J�nw5�.L�=�2N�=L�DR�L`�R_�T_�Tf�Ug�Wi�Ze�_p�bm�s}�x��{��������x.{������������5~�����§�è�ê�Ī�ū�ŭ�Dz��������������������������������������82L�wx".~�������������������������������������2|+J�=�������x8=�������������������������q\^IDATx^}�Œ�0�\�f�affffff���zb;�*�{�ũ�͕>")*����
�N�;��u��o+O d����� �@�p��er���s���u݁n�v���'�ʌƅb�:���y�r�4�3��d\�Qfx��Aw6�X�������G����i���R}�Qd0�uƊ�F�r��GŜ`�S��o|��2��9���B,�#|�{����j*�sX��	x�Y*P��*�	��ȩ�ԎÙ	�S����^'��75�7��ƳO���oǖU�50�s�y��9����g�a���lLnԀ�#���98�����;=�P�7���IEND�B`�PK�XU��{��tanea.recipefrom 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')
PK�XM�v��
tanuki.png�PNG


IHDR��h6�IDATx�eR�ORa��j�d�P�1�p��f��h����@\
 %���/�$�b�Ush�a� �8LI���]��vvw�s���<�K����*Ȅ/�z��1�),"��?1��n�d@B��:�O3�)�O5��Բ�ǃUE�J��>]�46�,M%9�pR�GP��L�u{�E���/-�5�(�H���mZj�@*_2H
Q@�RG#��3�4��!�$�.	u}��MWװ�8LaA�s�Q`�EJ�R�0�t��2�T�)
�V$}�
C����R��I���	�a†��,�~>Y7�,�� ��n�����ڶԃ�X�-�:>s�c�5�\�wAw�"Z�+YмȾ��"�UH�^A�(�ָ{�|[T�}�Ie�co����~
��R�l'oEڿ;3	��WGߵO��x�r���h̹�3���oMM�b.K�j�L��V˸RU_�u�*���'�Bz�". UYSA*.i����⑘�e�����V�<�}6 �6DRè',V߽9�_G�1��A�-ػ<�;�c���mDž���C�2~�T;M'/6禠��RX4u���
@t�n��Ԃ+�,��$ǩ�U=����1��Ug��B�բ�’ ա�����m��N��v �%��������d,��L�$�T<z	]�^�t���p���Ӊ��J���yIIEND�B`�PK�X��s�?	?	
tanuki.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


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'<h3><a class="screen".*?</h3>', re.DOTALL), lambda match: ''), (re.compile(
        type(u'')(r'<div><a href="/strony/((manga)|(anime))/[0-9]+?/oceny(\-redakcji){0,1}">Zobacz jak ocenili</a></div>'), 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()
PK�Xқ�LL	tayga.png�PNG


IHDR  D����PLTE5���v�N���Nb5w�Pz�U������L`2J_.b~Bs�Fs�Hu�L@x�Rx�TNb8{�U{�U����������Pc8Re8Re;j�5D+L.L=U"Rc8=W'z�Tz�TH].brRF���c"���e�"���������jw]������J_2o�Jo�="H���L`5BYcsUc|.c|2c~cBY'esUe"BZf�"f�+g�+g�.BZ+j�@DZ2j�8k�5mx_m�;m�8m�=n{`n�Fo�HF\+F\.p�Lp�Hr�Nr�Dr�D+JH]5t�Ju�ju�JH]Du�Lv�LH_+v�Pv�Pw�PBw�Rw�Nw�Pw�Rx�o85P'8Tz�RN`28T"z�T;U'{�W{�T"H|�_|�W}�Z��`��b��b��b��c��b��f��g��j�������������������}��x�����{��|����������������������������������������������������������������������������í�ï�Ų�ɶ�ǿ�̺�ξ�ξ������������������������������������������������=U'������������������������������������'J�����������������@W'RfD���������Te;ZjH]z������_nP_oN���_|������������`oP`oR���`pP@Y+���brYb}��������F7IDATx^��S�%AF;���6Ƕgi۶m۶m۶m��_غSwz&b^7_:2�d��/������'�	�pq�����l�*��z(@�pz|�>M�U�	g5\��"�)߭~��	�:�����5U��7�H�;W-~���ss��Ubp�pY��Q�\�(R�Ԯe�Pd�_3�v��g��zB"�$Q }�;�qV_��n̍����ӳGz�0�#���ʂ��]_��4JnY������ԛ���CD��!yݙP[,�1�v�%��X���=�9?Qmط,��Nd�ĐI��G��3ӆ*�n۞@���*Tm�}}���Ƶi��]"|�պ��L���\ڨ�@7KA�]3�e�C��+�CD��|ul�aP=��Y��j��d�����r&S;��ѸWX �c�c�}ii������[G^�ݬ��
��}��Q�6u�3���$;5�5�tҨ�#E!e�0)8���,��M0�z�V]�G�tX��U!��I�9(0qʼ��'
|��2Z�
8���Y��#Bچ�Qū��.׃���<��&j�v@�j	
Y�
�	݆��S4IEND�B`�PK�X���*��tayga.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Tayga(BasicNewsRecipe):
    title = '\u0422\u0430\u0439\u0433\u0430.\u0438\u043D\u0444\u043E'
    __author__ = 'bugmen00t'
    description = '\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E-\u0430\u043D\u0430\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0438\u0437\u0434\u0430\u043D\u0438\u0435 \u043E \u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0438 \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0441\u043E\u0431\u044B\u0442\u0438\u044F\u0445 \u0421\u0438\u0431\u0438\u0440\u0441\u043A\u043E\u0433\u043E \u0444\u0435\u0434\u0435\u0440\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u043A\u0440\u0443\u0433\u0430.'  # noqa
    publisher = '\u0422\u0430\u0439\u0433\u0430.\u0438\u043D\u0444\u043E'
    category = 'blog'
    cover_url = u'https://tayga.info/design/logo.svg'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 60

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'news_content'})

    remove_tags = [dict(name='p', attrs={'class': 't_left'})]

    feeds = [(
        '\u0422\u0430\u0439\u0433\u0430.\u0438\u043D\u0444\u043E',
        'https://tayga.info/rss'
    )]
PK�X$1 ��taz.png�PNG


IHDR  D����PLTE�*����%�'����(�$�(�����)�y������#D����'�������'�m��>�������3P�<����,K�4R��픣�s������ @������3솙�����+낓����	,�>[�^u�6S����������Xo�+�<V�%�)����9����D��IDATxڜ�S�k��8��Ѷ9�a��c�]`;_Y�
ˤ	�|jj��rB�
�{������tv�b�zɸw߳�
���92X��&�rF>>�g��ڤ��B��w ��~~1-�����T�*���
;��mG>�s`B_�$���59N�7�:�Td`��w�2��.1\1@�$T�L�v7*SsKrǴґ{�j=��"�<�H��Ş��1�Ϙ�@4	���kGIEND�B`�PK�X�W!��
taz.recipe#!/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.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile
try:
    from urllib.request import HTTPBasicAuthHandler, build_opener, install_opener, urlopen
    from urllib.error import HTTPError
except ImportError:
    from urllib2 import HTTPBasicAuthHandler, build_opener, install_opener, urlopen, HTTPError


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
PK�X+�b���taz_rss.png�PNG


IHDR(-S0PLTE�*�&3�3>�BL�OW�`g�mt�z������ǣ�ϱ�����������z�1eIDATx�}��
C!ź���j��aw��Xx&p���)V��U�Ô������o�����Z�P3u�11ۮlB�s$O�3�q�6��|�Z=���(��o^�p)v=bIEND�B`�PK�X���	�	taz_rss.recipe__license__ = 'GPL v3'
__copyright__ = '2013, Alexander Schremmer <alex@alexanderweb.de>, Robert Riemann <robert@riemann.cc>'

import re
from calibre.web.feeds.news import BasicNewsRecipe


class TazRSSRecipe(BasicNewsRecipe):
    title = u'Taz - die Tageszeitung'
    description = u'Taz.de - die tageszeitung (Anpassung von Robert)'
    __author__ = 'Alexander Schremmer, Robert Riemann'
    language = 'de'
    lang = 'de-DE'
    category = 'news, Germany'
    timefmt = ' [%a, %d %b %Y]'
    publication_type = 'newspaper'
    remove_empty_feeds = True
    use_embedded_content = False
    oldest_article = 7
    max_articles_per_feed = 100
    publisher = 'taz Entwicklungs GmbH & Co. Medien KG'
    # masthead_url = u'http://galeria-autonomica.de/wp-content/uploads/a_taz-logo.gif'
    masthead_url = u'http://upload.wikimedia.org/wikipedia/de/thumb/1/15/Die-Tageszeitung-Logo.svg/500px-Die-Tageszeitung-Logo.svg.png'

    conversion_options = {'publisher': publisher,
                          'language': lang,
                          }
    feeds = [
        (u'Schlagzeilen', u'http://www.taz.de/!p3270;rss/'),
        (u'Politik', u'http://www.taz.de/Politik/!p2;rss/'),
        (u'Zukunft', u'http://www.taz.de/Zukunft/!p4;rss/'),
        (u'Netz', u'http://www.taz.de/Netz/!p5;rss/'),
        (u'Debatte', u'http://www.taz.de/Debatte/!p9;rss/'),
        (u'Leben', u'http://www.taz.de/Leben/!p10;rss/'),
        (u'Sport', u'http://www.taz.de/Sport/!p12;rss/'),
        (u'Wahrheit', u'http://www.taz.de/Wahrheit/!p13;rss/'),
        (u'Berlin', u'http://www.taz.de/Berlin/!p14;rss/'),
        (u'Nord', u'http://www.taz.de/Nord/!p11;rss/')
    ]
    # omit articles already linked in Schlagzeilen feed
    ignore_duplicate_articles = {'title', 'url'}

    # use the cover presented on the homepage
    cover_url = 'http://www.taz.de/digitaz/.s1jpeg320'

    no_stylesheets = True  # default value is False, but True makes process much faster
    keep_only_tags = [
        dict(name=['div'], attrs={
             'class': re.compile(r".*\bsect_article\b.*")})
    ]
    remove_tags = [
        dict(name=['div'], attrs={'class': 'sectfoot'}),
        # remove: taz paywall
        dict(name=['div'], attrs={'id': 'tzi_paywall'})
    ]

# with article pictures on Kindle super-slow
#    def populate_article_metadata(self, article, soup, first):
#        if first and hasattr(self, 'add_toc_thumbnail'):
#            picdiv = soup.find('img')
#            if picdiv is not None:
#                self.add_toc_thumbnail(article,picdiv['src'])
PK�XZ}�v//tech_economy.png�PNG


IHDR  szz��IDATx�b�Q`���l9I��Q8׶m{�om۶m۶m�h���|�YqS��}S�͈/��?߼�u��}{�ќ�k0+��3��;ݏ:S��5م�6Ί*cL�4R�
�5(7D�2�d(�J�b��H��(�
t��|/"O�s���4r�:��-�#[�����;^z������Fs��=�;/
�:@������A�����D�v��"���YL�Ǧ��Q��Y�kVŸ�{��qÅ�����NTR>��L_�G�Qƭ��`:<_խ$�$:e;���
e�T?$7d��t
�c�凨~ 
g���7��nN��(����Kü����(U`�_K԰��9J	Ґ|��s R�:�� 
f��X�Z#e 5��_����欖�I���6��������s��R5)�, �G���-����}�\�&q�	��p-<x�f/���hv6��C҂�p��8���P�0���z��CUp�\6��Un��5 _r����p|]ќ�R5��5 e��t:q_�—+��|E��x��ۯyٞH҂��_��?�X/z�D���v���H�B��&�$xs���c�����f9�Љ���0Y�gi��R5
F?)��6,KDLf��Մ�DsVK��q�H�0��O�ڊVk0��=�\����� �\��h�ZgB�D�	Coz�x��P��j����%��(��[��{�W�E��vR5�^��<t:n>6��VZ����]�p����D^�/��������h�Z�U:�<��4��=�/	��I�T�s$g��h4"��Z����t�=�`�Y�7�/��b�� 9Z���L�Z-�@�k)��R5��������@�T>7��:�9��h.�|:�A�6=ԡ���x,S���\�=�����e)#Nc�ې� 
ų��g�q5�
:� %I_���)�2�O
��}/#��^՟��\��A��X�k^^�������y[�?�s��}��IEND�B`�PK�X�.TTtech_economy.recipe__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'
PK�X�@���tech_world.png�PNG


IHDR  szz��IDATxڽWpmI�ͺ�.�m�ƚ��m۶m�(}\�߶��y�m���_��wU�s��Dp��;�T�)r=g�ޛ�m�3�շ�꜓�}G\8׳�0��Jᄍ��!����rs�%;N�.��h�A��3�V*��SsK�]lTm���)��=r}_��װ�	��x�j�!ڒ�gN.��3!��
o��1��[jA��O�(%.aB�
�y�䇘`����/����i������|�$SmՖ��)Z^���\�o�<~�	��!�{f8�Ԥ�q��y�3��t[/-���`p�s��?…�zqu�i��fF~����*��9�u����ya-�o졁�ab|W�6�����7b�����g��f(�=@cl��㨧�իw������^ҳ�	�i �ҳϙ�w�2��&��gW��w~���).i���ܥ�M�D��r/}���j�7�5�Q�$��p���+���j<X&�hK�{i���"�|/C
��y�zQ�8剖�}_�D�$Zl?�1�Lw�	�D��7`�/�&�3���f#P���<�f���HYμtN�~��t�Z:z0���-��(�d‰sg}3���-�1cKSq�.���,^��ڮ�,g|e�^z�3{	�p�A5���7o ��wC6��:N��1�]כ-Ƃ�ԭd �V�>SIۍ3��k���O��Ɠ���"�x.`D�O��9���ʨq���i��
�x`����}4�꜎�M�
�����3!~M��Iąg(eISϙ8�xH������w��l�"Q��~�ˠ��$`����#D2 �<�(�7��D�6����?�@�6��W6,�߾��M�e-�f�2���-�B�i�]�=�<�7棷_�ؿ'%�_���~�o+'B:IEND�B`�PK�X�k;c��tech_world.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__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'),
    ]
PK�X���Oaatechcrunch.png�PNG


IHDR%=m"PLTE����c�
�IDATx�c@�6 �s���*f��t�IEND�B`�PK�X���K��techcrunch.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
techcrunch.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class TechCrunch(BasicNewsRecipe):
    title = 'TechCrunch'
    __author__ = 'Darko Miletic'
    description = 'IT News'
    publisher = 'AOL Inc.'
    category = 'news, IT'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    publication_type = 'newsportal'
    masthead_url = 'http://s2.wp.com/wp-content/themes/vip/tctechcrunch2/images/site-logo.png'
    extra_css             = """
                               body{font-family: Helvetica,Arial,sans-serif }
                               img{margin-bottom: 0.4em; display:block}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [dict(name=['meta', 'link'])]
    remove_attributes = ['lang']
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'headline'}), dict(
            attrs={'class': ['author', 'post-time', 'body-copy']})
    ]

    feeds = [(u'News', u'http://feeds.feedburner.com/TechCrunch/')]

    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 = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�X�Q�n��techdirt.png�PNG


IHDR�a�IDATx�|��A��m�mP۶�2�m#V�V�UP�m��%�ɔ��Of'ٹ3�G�f�P�Di#��˜�Qȩ�Z��^6��@�E't�a�/��rx��a����~�K����p>T#�2<e+�%Q��FI�B8$�S41�4,�6��֛��Y�5Nc�D��:���ߒ&�o�ﺥ��w���8�l^~hrK6��WahreU�	,Cs��uB/:w?����H���S|;,$��85���@�2\�l�9��S�j�J�QmD�#�`�4h`k�bå.�>�Yl��r��� 35�d�YT2��!r�e�9�Ug���mt�aN�K���[����^6h��x�����g��s9BVjV#����KL
�C,"C|���[4��b��J}�[|�<�/�ۥAu�>���bX�44WG���dl乬�AD�sm�4���wIEND�B`�PK�X��@��techdirt.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class TechDirt(BasicNewsRecipe):
    title = u'Tech Dirt'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 7  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True
    encoding = 'latin1'

    feeds = [
        ('News',
         'http://feeds.feedburner.com/techdirt/feed'),
    ]
PK�X�45

technology_review.png�PNG


IHDR  V%(�IDAT8�c` 
0���1�S �`�V|
����:�h���/_0����C����|;��ZC����?�������`�s-���9e
KK���� ��(��t�?o��_���
Tm���J����{�o�q���|����nݾ}w�"6y�}��?IV�!Fl
4_��_�/,���O���GPA�޺����)`becś}�?Ǜt�bS?IEND�B`�PK�XKV�?::technology_review.recipefrom 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')
    ]
PK�X�`��technology_review_de.png�PNG


IHDR  D����PLTE������������������������������������������������������������������������111000���...222333CCCGGGOOO���������������///kkk���===���������---���������������������������>>>888���������DDD������<<<���IIIKKK444PPP������999������555MMMjjj������ccc������ffflkk���gffpppSSSZZZ```������777���nmm������]]]������~~~���aaa�����֦��ooo������BBB���:::�����掎����gggpooNNNrrrsrrssstttutt���uuu���vvvxxxONNeeecbb���������������AAA���???���TTT0/0UTT������������;;;JII^^^����������LLL���nnn���877���WWW655�����̱����������ڳ��^]]�����������Ō����������������΁�����RRR���YXX���211YYYHHH���������������������hhh������,--���������������������������������EEEyyyzyy|{{|||�������U�:tRNS-.:;<Fq�������������IDATx�\���V@��u�sm۶mۨ}j�>�m��$�q>C9��+ 8<�Ã�<����E�p@Ld���i�g`�-~� ��" *���'({"-n��\���W: ��X��ύ'Ħ襈MIy�<v-��ٻ�n'Ċ�ο�m�����XyK����!�y�A�үI�ݟ��G�hy�B�BX^��n�����X�3��R�B�[�0ա��?����;S��s5 ���3S�r���-�r �]�@����R�'
�|�&'!�[	���Y�����*Tl��\�$&@	��&��ϣ�����;�xT�^�J8�H�)�/L�װ>�<+�J \��q�75��-乿\���P2d�+��@Ů���_.�&�[�m��T�n)[l��P;B���
�����Hg
���%:,b4�?���$ߔr��5��g�wB�#O��d0,��`]��F
��1z{�
�6*�:C�=�Q�(^�W��Up|��r���<)��a�qP��sD��6��az��_~q��M+� wm�.![�i�pjwRsmh����8i�,��?�%,��r=�����I��)W4%9D��	q�QؼL炲�汽���H�-"٫xTh�x����tstݵ���Gi���(���g¥�3�x�Y��A����`��a�؋��IEND�B`�PK�X#�X̘�technology_review_de.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function

__license__ = 'GPL v3'
__copyright__ = '2010, Anton Gillert <atx at binaryninja.de>'

'''
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
PK�X$ ����techtarget.png�PNG


IHDR  szz��IDATx���d�a�sf>3�!C���dH�0����@�@2�a�L4@�$�Lf !s��$s��Lf��/^����ߟ�{^�s��<�"E��9/e�̰�
��
�LS�ܯ�L��ѣ��2�E��D����6Db��z}�y���1�UpDpB�o��1�5��aR��ܭ�
�>p���^#8�)��v�eN��ݤ�1C�`��4ɓ�f<-%
9a��R�u���ۼ���?>����f�����D��S�k�jg�7I�g�:�9wc��f�nl�`5��#X;�̌z�_�.��۔�8���4K}�f#r�>U�pB+�;N�`�`:�7��Q^[�ڞ>%}�_�(�M���*� ���9�$xC�˧����e�Q��Y��,+l1|Yq��D�c����<�<�,1�h�)R�H�?>h�E�&�IEND�B`�PK�X���lltechtarget.recipefrom 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'),
    ]
PK�X�Y�,��
tedneward.png�PNG


IHDR  ���IDATx^e�[�I�ODd]�2���x���װ�	V��?��Ђdx�k�փǞ{��2#�Um��>��R�q�K�G���[�>��ox�E	D84���* �"$�DE
T3Z�^ы@������%��ڙ�?��/���ٻ���j��G��d�N��*
��� �̒�j1�:;	`��������T�v~��]$�>��_��y����	J=�MM��=zQMgdx�"
2U3FUwo�y��'�>��k���?+�g�������*�M��3��a��>d!ᄠ����?��ghGX������l�i���/�nc������z9:�Lǩ�Y�.�RM�G���+e ZO��G�tJ���φ	`������4����f4�����˚ޥ�����|��tux��^RQQB�)���e!����B��X^W����<���޿[]���*E^���M^�����j*���)����
��ȝM�D7�������ۓ��ޭ�����ڴ�V�P���w�v�˧u�
��)6��zQ��Z��{��Q�����Z_�xg0H2�P2�~�ԌU�v���/�M������\��W�I��f*"�`8U�j�C�1H��M���m3N����������._�-J6���_i��<�ЋldI��`�p���~���}�{K�h��$�]�on��o�u��_̻�i�	���5@KXI��,Q��(Qֽwf;ʳ����	��'�@����^����X���*��iS�{u�Qq�Ώ9�Pq���e�"�����*�Iij�Q�f{�5����XѝA�'�/��9��̧XVF��e��ҵ�&#$@E�;4`�Qb��@��"���v�X͋rU*�
��;d��(�ao �2`��J���B
�C"���B�����4�!	��ݝdO`'
�`)[At��Pz�A�>LЋ�p0 �N�g0�" A�%|�"(��o����w��P��3q��@H@b��W�d8�!��PaR��YƆ~��eC=����4%�*f&� ��D���DM� 1����tzwT#��L��gOJ5	��.��c��w�<H��^Ò������WNz;�_��~=}�j'$7��͵�
���`��ň^���G�& C�
x�6/�W��T�YjF�z9?=�9;�T�J 2�l���^$H&��!)Kf�rˑTBU���?�D��ڽ�bq��{\���r��"���y
�1�q��#��p��,���AI�Ib�/߽�||�\�bq�a/_|1.Gǣ
��"<�tdftC n	j�3�_��AU%����5���o�*o���q�76�\�G�@�laxb)�Ue�7yiu���j�M<
�B�8t�A�t�69��"V�@Y�}\���P���	���mc6;���M�Z-U�
��@MSa���C.�H�Z���A5Q�0��nR�Z��d&���O��a�?�qN�|
�5�K2��Q��o�ݻ7f3	GYQ���
8�������Դf�����츻z�����r}5�ſT�z7l�n�Ov;����1��W�ۗ~�6��|��ӛ�L���)��ء� �3l��A_x0`8�H�6-��;]\���³[N�IEND�B`�PK�X�H=��tedneward.recipe
__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
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')]
PK�X�.R�FFtegernseer_zeitung.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�XMe5d��tegernseer_zeitung.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Tegernseer Zeitung'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard',
                                                                                   u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Bad Wiessee', u'http://www.merkur-online.de/lokales/region-tegernsee/bad-wiessee/rssfeed.rdf'),
    (u'Gmund', u'http://www.merkur-online.de/lokales/region-tegernsee/gmund/rssfeed.rdf'),
    (u'Kreuth', u'http://www.merkur-online.de/lokales/region-tegernsee/kreuth/rssfeed.rdf'),
    (u'Rottach', u'http://www.merkur-online.de/lokales/region-tegernsee/rottach/rssfeed.rdf'),
    (u'Tegernsee', u'http://www.merkur-online.de/lokales/region-tegernsee/tegernsee/rssfeed.rdf'),
    (u'Waakirchen', u'http://www.merkur-online.de/lokales/region-tegernsee/waakirchen/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X��|���tehelka.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2023, Aareet Mahadevan'
'''
http://tehelka.com
'''

from calibre.web.feeds.news import BasicNewsRecipe

class Tehelka(BasicNewsRecipe):
    title          = 'Tehelka'
    oldest_article = 7
    max_articles_per_feed = 10
    auto_cleanup   = True
    __author__ = 'Aareet Mahadevan'
    description = u'Free. Fair. Fearless.'
    category = 'news, india'
    encoding = 'utf-8'
    language = 'en_IN'
    no_stylesheets = True
    remove_empty_feeds = True
    remove_javascript = True
    use_embedded_content = False
    ignore_duplicate_articles = {'title', 'url'}


    feeds          = [
        ('Tehelka', 'http://tehelka.com/rss'),
    ]
PK�XH�Փ�	telam.png�PNG


IHDR(-S�PLTE;;;AAA[[[```???GGGIIILLLPPPRRRVVVXXXZZZ^^^```hhh&&&)))---000333666:::===>>>@@@CCCFFFJJJMMMPPP___```bbbeeeggghhhsss�����������������������������������������������������������������LCtRNS����������������V��zIDATW�˱
�@Eѳ8�h0��������`�P��%h�mf����Ga�[�����XD�����Llz���
JQ����mڽ�4����Rۿ`�_�2�72Ƅ�eU����^�j��07�[�L��{��IEND�B`�PK�X㽽ƌ�telam.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2012-2016, Darko Miletic <darko.miletic at gmail.com>'
'''
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
PK�X�D�ڕ�telegraph_in.png�PNG


IHDR  D����PLTE���������������jjjrrr{{{���������������������������������OOO������;;;AAA������BBBCCCGGGQQQVVVWWWXXXZYY]]]^^^_``baabbbeeeggghiikkkooosrrxxxyyy~~~~~����������������������������������������������!!!���������"""������,,,///������������������dj�������000������111������666������?>>��������������������777HHH������NMMNNN999���766iiizzz���*))������$$$���������������������'''���)))������???������@@@�����������ظ������ۺ��L�3ctRNS@��fcIDATx���s4A���^�m�m���N.�m��_�ltV1oa1OaD��CvFQ�AW8��8�ʺz�VYW6����b��l$�W�K������?��������~�eY��eL�o�"c��������+���QӾC.˵����΃<H�d�pm`�D��@���A�I��F��H?����n@���A�D'���Ӗ��cK��m�|r�<��=U7ɹ��xZ��;�B5��n�!���V	��>���\u�n@�3�;�P�@KbP��iF����A���k����C����5����-`�mp��r외����|�&(�4�i��/N��:�B5{;GaU<�[(IEND�B`�PK�X�'��NNtelegraph_uk.png�PNG


IHDR��h6IDATx�c��V_�YƠ5�Ag���|�쭭3�8����a����>i������PϠ<�A��A��x�d�xl�Ŭu�ڢd7�A�gۑG�/00TVN8~�ŗ�k����_Π1��j.�\?CCC)Рe��Mg.۵��C �޹%�n�g�`P�`��|≲�^����aP?�y,d������`�M�.�方�#����@?l;�"4w�
�����cX4�<�P�m5�'�!�n?C�Y�b5X'od`�6�]�_����
֐������rP�A��Έ��p
���NZ~�!�tw+��]w!r���:�A�{��;���3�M:}�H��-7�Z��*n9�/X:�f����k�?BT��[L{��L�~��+��"�m�׶�;�x�-�ܿ��o�)i1��!݁�x8z�H�D7�d�qu�J'�,�%비����� ��DLo9�_w{3�� $�V`�1p�D��B�ix�W}�1���3���[��ؼa�]�xa���`�IEND�B`�PK�XmJ�aa
telepolis.png�PNG


IHDR��h6(IDATxڍ��r�@D
�<hhhjh�_(44<j�_�*N�N�m2���yw����uy��U7���@*_��8��(�L�	���l�hδ��8����UR��A��zOZ�&ϙ�a�&b��ڶ4��s0�J@�E�YS&�>,X�m�\�>f���L��G�~��UNj�O�~�.���GB�@u;���c�	V��¥P����S�%V��� i�B��O�li0�|��i榡��H���
�C���>&u��7��L�eX(�^o+��B��/��4�N`IEND�B`�PK�X��g��telepolis.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class Telepolis(BasicNewsRecipe):
    title = 'Telepolis'
    __author__ = 'Lutz Epperlein'
    oldest_article = 10
    max_articles_per_feed = 200
    auto_cleanup   = False
    language = 'de'
    scale_news_images = (758, 1024)
    scale_news_images_to_device = True

    feeds          = [
        ('Telepolis', 'https://www.heise.de/tp/news-atom.xml'),
    ]

    remove_tags = [dict(name='p', attrs={'class':'printversion__back-to-article printversion--hide'})]

    def get_article_url(self, article):
        return article.link + "&view=print"
PK�XmJ�aatelepolis_artikel.png�PNG


IHDR��h6(IDATxڍ��r�@D
�<hhhjh�_(44<j�_�*N�N�m2���yw����uy��U7���@*_��8��(�L�	���l�hδ��8����UR��A��zOZ�&ϙ�a�&b��ڶ4��s0�J@�E�YS&�>,X�m�\�>f���L��G�~��UNj�O�~�.���GB�@u;���c�	V��¥P����S�%V��� i�B��O�li0�|��i榡��H���
�C���>&u��7��L�eX(�^o+��B��/��4�N`IEND�B`�PK�X��YC��telepolis_artikel.recipe# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2009, Gerhard Aigner <gerhard.aigner at gmail.com>'

''' 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'<a[^>]*>', re.DOTALL | re.IGNORECASE), lambda match: ''),
                          (re.compile(r'</a>', 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"
PK�X͆�&hhteleread.png�PNG


IHDR��h6/IDATx�cx��2���9~444L]��QI!t�Q
T����� rmO��RIEND�B`�PK�X=����teleread.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

'''
teleread.org
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Teleread(BasicNewsRecipe):

    title = 'Teleread Blog'
    description = 'News & views on e-books, libraries, publishing and related topics'
    __author__ = 'Kovid Goyal'
    language = 'en'

    feeds = [('Entries', 'http://www.teleread.org/feed/')]

    remove_tags = [dict(attrs={'class': ['sociable', 'comments',
                                         'wlWriterSmartContent', 'feedflare']})]

    def get_article_url(self, article):
        return article.get('feedburner_origlink', article.get('link', article.get('guid')))
PK�X�/4Ҩ�thai_post_daily.png�PNG


IHDR  ��	pHYs���o�dZIDATH��TMlTU>���~�
C��i��D)6���6Qj���mHj�	֝���X��BcLc���
h���b�����@)-Ea��L�����{s�=.��c4&�0�/gq�r�{�w�K�	Z���
����
���4)��
�r��l���o/<��l���B@b]D�M�V�@d��n
Ϝ�}�;���2J�H�h�����̂CB�3�
��a[�m����R��+�$=�$��/�k�d�VDd����M�����ȩ�l����~]��h$Y�_f���t:�t6nY4�:��V	EAd�޺��Ν�{�YY�S�lY�jm�t�@TE�]Ye4I�u�ǩ]{^��q��ַ�K��`dp*k�::��h����ޏ[�5�����"�6O���wS����پ��鮮��H�'�N�K�(���÷�fGF3W�>�%I�:1�N:��[g��YN�8y��Y�tv���}>�>pr\�0s~�f2��K���TU�,��wo�>k���ؽN8pnp���K��Q�_�0���\��z�}~��~VW�=��������|�*��A��E��[_�%
���d`����xr9n�s�i"Q���ik|�m&�*�Qϖm�֎>�5{�ߝ�[!�$}�EL��;���zq(#H0`聀'>�C�S����a�o�����x��q���F��f��U_K_߅'O�z:����ٟ��i�֑" ύ����Mf5�,QWPA�Ud�
�9'�j���,�u�h�l�c�s�Z�1�[@��h�.�"��Z��'/�\0���b,]Y"Y��9��5{��BP!�?���@ϪY�IEND�B`�PK�X�#5k��thai_post_daily.recipefrom 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'}))
PK�Xc0p���thairath.png�PNG


IHDR  D����PLTE�������
�
��0�0@�@A�AY�Y���1�1��I�I����<�<���4�4"�"?�?��쿀ڀX�X��(�(C�C����������:�:�L�L����������������F�F���%�%c�c�ߑ�݌������E�E5�5�l�lj�j�����W�W�.�.��$�$����������#�#	�	~�~b�bb���IDATx���U��F�?uw����A(�s���ȏͭV���q��|A��� �f�dB†�Nl�D���i���E?1h���Yt��..!չ���פ��QX�_��Hc%��<T��q��P
x��_���w�>x��*��!��54ç��V�w��z�r�c*�O#��	��IEND�B`�PK�X��fwwthairath.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1271637235(BasicNewsRecipe):

    title = u'Thairath'
    __author__ = 'Anat R.'
    language = 'th'

    oldest_article = 7

    max_articles_per_feed = 100
    no_stylesheets = True

    remove_javascript = True

    use_embedded_content = False
    feeds = [
    (u'News', u'http://www.thairath.co.th/rss/news.xml'),
    (u'Politics', u'http://www.thairath.co.th/rss/pol.xml'),
    (u'Economy', u'http://www.thairath.co.th/rss/eco.xml'),
    (u'International', u'http://www.thairath.co.th/rss/oversea.xml'),
    (u'Sports', u'http://www.thairath.co.th/rss/sport.xml'),
    (u'Life', u'http://www.thairath.co.th/rss/life.xml'),
    (u'Education', u'http://www.thairath.co.th/rss/edu.xml'),
    (u'Tech', u'http://www.thairath.co..th/rss/tech.xml'),
    (u'Entertainment', u'http://www.thairath.co.th/rss/ent.xml')]
    keep_only_tags = []

    keep_only_tags.append(dict(name='h1', attrs={'id': 'title'}))

    keep_only_tags.append(dict(name='ul', attrs={'class':
                                                 'detail-info'}))

    keep_only_tags.append(dict(name='img', attrs={'class':
                                                  'detail-image'}))

    keep_only_tags.append(dict(name='div', attrs={'class':
                                                  'entry'}))
    remove_tags = []
    remove_tags.append(dict(name='div', attrs={'id':
                                               'menu-holder'}))

    remove_tags.append(dict(name='div', attrs={'class':
                                               'addthis_toolbox addthis_default_style'}))

    remove_tags.append(dict(name='div', attrs={'class': 'box top-item'}))

    remove_tags.append(
        dict(name='div', attrs={'class': 'column-200 column-margin-430'}))

    remove_tags.append(dict(name='div', attrs={'id':
                                               'detail-related'}))

    remove_tags.append(dict(name='div', attrs={'id': 'related'}))

    remove_tags.append(dict(name='id', attrs={'class': 'footer'}))

    remove_tags.append(
        dict(name="ul", attrs={'id': 'banner-highlights-images'}))
PK�X�r�uthe_age.png�PNG


IHDR  ���IDATxb�3�)0F-�`�NQ# �4�1dR
���a�Um�6�m�׶m۶m۶m�J����1��8̥��T��H�(�_$����c��%��Nf�J� ��{��[�W(�7���������ƃP[+�����Κ���5�4�P�dѲ�]z�����=p��K�e��?tr�ܕaS�-P6�8m1���F�O���m�G��'�(�޺��-\Mb�̅�6$�t.�����]�����(���Z�k�@�nb����ç���^���k�!l��p���5�q��9� tP���:��PS����y�ޣW����[��\���
f@�ǂ�s�mܺ����?tJf�n���d�!V7�h����g����q뾾����Z���D�*��r��>�\$X�z+\�[�N����&T��Ci�nO�Odj��޹�h���a��;^�|��"�ƭ�|��9�eo�B��A �ٟc��T��i�L��1z�8�7�˗�rCK�����/:t����M�|��T��ї�-^WD~}�(�(�M*��H��;d��K?y�bͶ(���N=G2DY,qN��;t���H�Μ��~��Sx�$N�Ӛ��*w4�(��xiQG_j4QCRCh�BEP:W���0`�.A;�aG����MR�R�s_��J��C>�߿�R���L��aU��Z0j��X��F����IEND�B`�PK�X����
�
the_age.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2009, Matthew Briggs <hal.sulphur@gmail.com>'
__docformat__ = 'restructuredtext en'

'''
theage.com.au
'''
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup
import re


class TheAge(BasicNewsRecipe):

    title = 'The Age'
    description = 'Business News, World News and Breaking News in Melbourne, Australia'
    publication_type = 'newspaper'
    __author__ = 'Matthew Briggs'
    language = 'en_AU'

    max_articles_per_feed = 1000
    recursions = 0
    remove_tags = [dict(name=['table', 'script', 'noscript', 'style']), dict(
        name='a', attrs={'href': '/'}), dict(name='a', attrs={'href': '/text/'})]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.set_handle_refresh(False)
        return br

    def parse_index(self):

        soup = BeautifulSoup(self.browser.open(
            'http://www.theage.com.au/text/').read())

        section = None
        sections = {}

        for tag in soup.findAll(['h3', 'a']):
            if tag.name == 'h3':
                section = self.tag_to_string(tag)
                sections[section] = []

            # Make sure to skip: <a href="/">TheAge</a>

            elif section and tag.get('href'):
                url = tag['href'].strip()
                if url.startswith('/'):
                    url = 'http://www.theage.com.au' + url
                title = self.tag_to_string(tag)
                if url != 'http://www.theage.com.au':
                    sections[section].append({
                        'title': title,
                        'url': url,
                        'date': strftime('%a, %d %b'),
                        'description': '',
                        'content': '',
                    })

        feeds = []

        # Insert feeds in specified order, if available

        feedSort = ['National', 'World', 'Opinion',
                    'Columns', 'Business', 'Sport', 'Entertainment']
        for i in feedSort:
            if i in sections:
                feeds.append((i, sections[i]))

        # Done with the sorted feeds

        for i in feedSort:
            del sections[i]

        # Append what is left over...

        for i in sections:
            feeds.append((i, sections[i]))

        return feeds

    def get_cover_url(self):

        soup = BeautifulSoup(self.browser.open(
            'http://www.theage.com.au/todays-paper').read())

        for i in soup.findAll('a'):
            href = i['href']
            if href and re.match('http://www.theage.com.au/frontpage/[0-9]+/[0-9]+/[0-9]+/frontpage.pdf', href):
                return href

        return None

    def preprocess_html(self, soup):

        for p in soup.findAll('p'):

            # Collapse the paragraph by joining the non-tag contents

            contents = [i for i in p.contents if isinstance(i, type(u''))]
            if len(contents):
                contents = ''.join(contents)

                # Filter out what's left of the text-mode navigation stuff

                if re.match(r'((\s)|(\&nbsp\;))*\[[\|\s*]*\]((\s)|(\&nbsp\;))*$', contents):
                    p.extract()
                    continue

                # Shrink the fine print font

                if contents == 'This material is subject to copyright and any unauthorised use, copying or mirroring is prohibited.':
                    p['style'] = 'font-size:small'
                    continue

        return soup
PK�X�.��yythe_athletic.png�PNG


IHDR  V%(gAMA���asRGB��� cHRMz&�����u0�`:�p��Q<�IDAT8�c$��=`����`KH�D\
4��+x,�ӑ�#�q*�������ǥ@�sf���N��P��.@"�����?�t-vҟ������,V�@í̀T:V���6�����������@)G���T�����10(���������)C�
?��o�Pp����0����)����mW�� �n������~��T�pr���+e��Z����v$HIEND�B`�PK�X\��?��the_athletic.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Athletic(BasicNewsRecipe):
    title = u'The Athletic'
    __author__ = 'unkn0wn'
    description = 'The Athletic delivers powerful stories and smart analysis that bring sports fans closer to the heart of the game. From breaking news and live commentary, to deeply-reported long reads and exclusive interviews, subscribers rely on The Athletic for every sports story that matters.'  # noqa
    masthead_url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/The_Athletic_wordmark_black_2020.svg/640px-The_Athletic_wordmark_black_2020.svg.png'  # noqa
    language = 'en'
    oldest_article = 1.15  # days
    max_articles_per_feed = 50
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    ignore_duplicate_articles = {'url'}
    remove_empty_feeds = True
    extra_css = '''
        #articleByLineString{font-size:small;}
        .inline-credits{font-size:small; text-align:center;}
    '''
    keep_only_tags = [
        dict(name='amp-img', attrs={'class': 'i-amphtml-layout-fill'}),
        dict(name='div', attrs={'class': ['the-lead-article', 'article-container']})
    ]
    remove_tags = [
        dict(name='i-amphtml-sizer')
    ]

    feeds = [
        ('The Athletic Ink', 'https://theathletic.com/ink/?rss'),
        ('Football', 'https://theathletic.com/football/?rss'),
        ('Boxing', 'https://theathletic.com/boxing/?rss'),
        ('MMA', 'https://theathletic.com/mma/?rss'),
        ('Motorsports', 'https://theathletic.com/motorsports/?rss'),
        ('NBA', 'https://theathletic.com/nba/?rss'),
        ('NHL', 'https://theathletic.com/nhl/?rss'),
        ('Olympics', 'https://theathletic.com/olympics/?rss'),
        ('Culture', 'https://theathletic.com/culture/?rss'),
        ('Others', 'https://theathletic.com/rss-feed/'),  # All Articles
        # just add '/?rss' to the sections you'd like to get.. there's too many
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('amp-img'):
            if not img.find('img'):
                img.name = 'img'
        return soup

    def print_version(self, url):
        reset = url.split('?')[0] + '?amp=1'
        return reset
PK�X�.Zx��the_baffler.png�PNG


IHDR  szz��IDATx���D;a��m�TP+�$ ���K��	A�b�!PPT����)�T��n۪��ݮ/ ����ͻ���Ϲ��+�$�����U�
��
7leF�a�v���"�! [ ���A�a�M2�1�>��1�֠	stL���;��Id�Y�p��/.�YQT�*�0�U�q)�ZQ����9��)�Bmh��]a)�)��-��x� �������RlB
���������q�l��b�y�#�}�%t��W�>�Y�P�p%̺Ec)7a=�
T#j�SzU�fr���-�D�h��Ӹ�!8��n�G�
Y���	���S�U|�A8a)��Z�9���xa+��+@
\p����of+l�9��IEND�B`�PK�XDy���the_baffler.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class TheBaffler(BasicNewsRecipe):
    title = 'The Baffler'
    __author__ = 'flobotnik and unkn0wn'
    description = ('This magazine contains left-wing criticism, cultural analysis, shorts'
                   ' stories, poems and art.  They publish six print issues annually.')
    language = 'en'
    encoding = 'UTF-8'
    no_javascript = True
    no_stylesheets = True
    remove_attributes = ['style','height','width']

    extra_css = '''
        .entry-subtitle{color:#202020; font-style:italic; text:align:left;}
        blockquote{color:gray;}
        em{color:#404040;}
        .wp-caption-text{font-size:small; text-align:center;}
        .lg:text-xs{color:gray; font-size:small; text-align:center;}
        .author-meta{font-size:small; color:gray;}
    '''

    keep_only_tags = [
        dict(name='main', attrs={'id':'main'})
    ]

    remove_tags = [
        classes('entry-date issue-number-segment single-article-vertical donation-footer story-footer ml-4 mt-14'),
        dict(name='footer'),
        dict(name='a', class_='ml-4 pr-px font-sans text-sm lg:text-xs whitespace-nowrap')
    ]

    def get_cover_url(self):
        soup = self.index_to_soup('https://shop.exacteditions.com/us/the-baffler')
        tag = soup.find('div', attrs={'class': 'row'})
        if tag:
            self.cover_url = tag.find('img')['src']
        return getattr(self, 'cover_url', self.cover_url)

    def parse_index(self):
        soup = self.index_to_soup('https://thebaffler.com/issues')
        issue = soup.find('article')
        edition = self.tag_to_string(issue.find('h2')).strip().split('—')[1]
        if edition:
            self.log('Downloading Issue: ', edition)
            self.title = 'The Baffler : ' + edition
        self.timefmt = ' [' + self.tag_to_string(issue.find('div', **classes('font-lion'))).strip() + ']'
        a = issue.find('a')

        self.description = (
            u'\n\n' + self.tag_to_string(a).strip() +
            u'\n\n' + self.description
        )

        soup = self.index_to_soup(a['href'])
        ans = []
        main = soup.find('main', attrs={'id':'main'})
        for section in main.findAll('section'):
            current_section = self.tag_to_string(section.h3).strip()
            self.log(current_section)
            articles = []
            for h4 in section.findAll('h4'):
                title = self.tag_to_string(h4)
                url = h4.a['href']
                desc = ''
                span = h4.findNext('span')
                if span:
                    desc = self.tag_to_string(span).strip()
                span2 = span.findNext('span')
                if span2:
                    desc = self.tag_to_string(span2).strip() + ' | ' + desc
                self.log('\t', title, '\n\t', desc, '\n\t\t', url)
                articles.append(
                    {'title': title, 'url': url, 'description': desc})
            if articles:
                ans.append((current_section,articles))
        return ans

    def preprocess_html(self, soup):
        div = soup.find('div', **classes('entry-title'))
        if div:
            div.name = 'h1'
        for p in soup.findAll('p', attrs={'class':'parasectionhed'}):
            p.name = 'h4'
        return soup
PK�Xx��the_budget_fashionista.png�PNG


IHDR  D���PLTEbbbLLL555222222��A	tRNS&fΗ��G����IDATx���MJ1E�s^��XC�Y"=�C��wy�Ow��%d~O����@�	`p:d?���{��������O�����-%>�C2�0]�x:nHd�k����^u&��SO�צ��k�]��m�xz�O���{j�IEND�B`�PK�X]����the_budget_fashionista.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.thebudgetfashionista.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class TheBudgetFashionista(BasicNewsRecipe):
    title = 'The Budget Fashionista'
    __author__ = 'Darko Miletic'
    description = 'Saving your money since 2003'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    publisher = 'TBF GROUP, LLC.'
    category = 'news, fashion, cosmetics, women'
    lang = 'en'
    language = 'en'
    auto_cleanup = True

    feeds = [(u'Articles',
              u'http://feeds.feedburner.com/TheBudgetFashionista')
    ]
PK�XO��#GGthe_clinic_online.png�PNG


IHDR  D���PLTE������|||������...��������˶�����{{{���kkk�������������xxx�����������������������gggzzz���fff@@@���vvv�����������������۬����¾�����������===������������'''�����������YYY���"""���ppp�����⸸����������sss������jjj���222www�
��
tRNS��y�}|�����IDATxڭҵVAE��Q8�6�����	���V�I��{��/�!�\�3Y��&��1�"�|I-���ܤ���l{5J~�կ:`+��0%�����c^f`�(�O@�������2��H��n7����M#%��m�gt�3��@5���}[�AlOupxt�$�Κ���tyu�M��w���|
#<W*� ��|��j�P2Ԋ��e�8���7r�brIEND�B`�PK�X��KKthe_clinic_online.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1313555075(BasicNewsRecipe):
    news = True
    title = u'The Clinic'
    __author__ = 'Alex Mitrani'
    description = u'Online version of Chilean satirical weekly'
    publisher = u'The Clinic'
    category = 'news, politics, Chile, rss'
    oldest_article = 7
    max_articles_per_feed = 100
    summary_length = 1000
    language = 'es_CL'

    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    masthead_url = 'http://www.theclinic.cl/wp-content/themes/tc12m/css/ui/mainLogoTC-top.png'
    remove_tags_before = dict(name='article', attrs={
                              'class': 'scope bordered'})
    remove_tags_after = dict(name='div', attrs={'id': 'commentsSection'})
    remove_tags = [dict(name='span', attrs={'class': 'relTags'}), dict(name='div', attrs={'class': 'articleActivity hdcol'}), dict(name='div', attrs={'id': 'commentsSection'})  # noqa
                   ]

    feeds = [(u'The Clinic Online', u'http://www.theclinic.cl/feed/')]
PK�XG`r�the_conversation.png�PNG


IHDR  D���/PLTE���U�33�$$�@ �33�++�;'�7$�00�5+�3)�9&�7.�5,�8(�3,�2+�8,�7+�3(�6+�5+�6(�3+�6+�4)�4*�5,�6)�5+�5*�4*�6*�5)�5)�4+�4+�5*�5)�6+�6)�5+�4*�5)�6*�5*�5*�5*�4*�6)�5+�5*�4*�5)�6+�4)�5*�6*�5*�5)�5+�4*�6*�5*�5)�4+�5*�5*�5+�5*�5*�5)�5*�5)�5+�5*�5*�5+�5*�4*�5*�5*�5*�5+�5*�5*�5*�5*�5*�5*�5*�5+�5*�6*�5*�5*�5*�5*H��dtRNS

 #$)*-/09<BEOR^`aghijklnow{~����������������������������������������������������!�"IDAT�g;�a��(+J2�g6�E���I]��7x^^t�s����?��M��\鍹N�JU��P�߫o�S,N�ru�cuס�Y���	��vG6 �s���W����C��^���ʴe1z$]�U��s�c@1��b��_�0�e`KV[��ցyY�	%�eY-)-���5��dQ�
���d1C�)�oU��p$��]eB�Q�����>c$���xۋO��9���y�*ҧ�6�:�F�HG�œ��L���km<��p�/v�}�M�B���ԕ�2�-IEND�B`�PK�X������the_conversation.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class TheConversation(BasicNewsRecipe):
    title = u'The Conversation'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 4  # days
    max_articles_per_feed = 20
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('All Articles', 'https://theconversation.com/au/articles.atom'),
        ('Arts + Culture', 'https://theconversation.com/au/arts/articles.atom'),
        (
            'Business + Economy',
            'https://theconversation.com/au/business/articles.atom'
        ),
        ('Cities', 'https://theconversation.com/au/cities/articles.atom'),
        ('Education', 'https://theconversation.com/au/education/articles.atom'),
        (
            'Enviroment + Energy',
            'https://theconversation.com/au/environment/articles.atom'
        ),
        ('Health + Medicine', 'https://theconversation.com/au/health/articles.atom'),
        (
            'Politics + Society',
            'https://theconversation.com/au/politics/articles.atom'
        ),
        (
            'Science + Technology',
            'https://theconversation.com/au/technology/articles.atom'
        ),
    ]
PK�X�9Y`the_daily_news_egypt.png�PNG


IHDR  ���IDATx�햅����Xt�EXX 8�j!!\=W?w���ܢ��^5���-9��<�~�fo��Y���}aX����-Y�?U�3Hy'�ԾC�L
)��#�L�+�U��z5��NbU�A��GPP��G��'��RK�i�(Pq3�м`�5-@A#zQ!$�D�9j���Ͼ���G_���;?^~r��3�\�i���3�g7�}���bY��;M��4|R��IN���B��kZ��a���G��?m}�;�H����S�K_hiiiqq���Ͽ�������wp"�L�=���Uy]�n��(Z��yݩ��f�(���[��4Ob�/~�/�c�u�܈hi;@��1��%S�\@
I&с5[�#�3���'_����[.eq~a�p�'�����-y9�{����%ɗ��k��e@*=�[g�um�,��
:`�wt�I�#q��;�^�����hYXX�\8����Vs�a�ŝ�x�B�ѧ���U���G��k��)��\�������-�O���uddl��sht�&�A�7�'< �R�����/�c�|��3v�KQz���H,��qm@œC��;�o�� �Lm)=��mS��x��y��s�9��Y��ϸx�9R1������Sdc�Z�KA��
�OF�\�O#xX�;=��<D�>���x���r��+���wa�_����HI�APG1��at��y�xy�xl�֫)���F��r���.>���!�֯�~��8YQ�N��䞪s�3?NL:����Tq�czփ��NZ�.PhHqS��}`h���;p��8
�h�ٮNxB/�	whh����p
M{&���n��� lɭ����ѱ9����uygA�!�z�`$d:�]|0�ZZ���S �i�n���63Ij4�J��򤬮KZ{J\n`
 � lm��F�P/,;!,��}L�Q�gK�IkL��-ґy:*�@�ŕ�T�9��yձ��,i#�:���1J# D!����heY��&�J�IGr�B�*�W*��쌔�DK�"�-1uu��4V]f�0E`�� ��R�\�d%~�rҬ��Z]���W��=�w�W]��������M�ϟG~�9��a��t�������]�fX�H�~M���.@�n��0�K8x0���UG>�,v�������-�)�������O���
�|%%�G��,�P4
�	���6`���H�I�.F�D@Ss���ٴ5�	[qE����_~5�`oN���498��nnI8��X��bP0�o;xI��;�!�b9�S�sI�&�̌����I�6�)+B�i˅������͌��xUY���.��0���I�ּ��iU��"��Ć���*̵�&+��&*��;-��m��ĥ�]��b�M6Q��[l"|wE0�G�B��d��~%�zPAa@��(9]hG��U0*�B��_~��p!�_�x���6���.)IEND�B`�PK�X�}�the_daily_news_egypt.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Pat Stapleton <pat.stapleton at gmail.com>'
'''
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'<a class="inline-caption" href="http://maps\.google\.com.*?/a>', re.DOTALL), lambda m: '')]
    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': False
    }

    keep_only_tags = [dict(attrs={'class': ['article section']})]

    remove_tags = [dict(attrs={'class': ['related', 'tags', 'tools', 'attached-content ready',
                                         'inline-content story left', 'inline-content map left contracted', 'published',
                                         'story-map', 'statepromo', 'topics', ]})]

    remove_attributes = ['width', 'height']

    feeds = [(u'The Daily News Egypt',
              u'http://www.thedailynewsegypt.com/rss.php?sectionid=all')]
PK�X��d���the_diplomat.png�PNG


IHDR  D����PLTE�������(((***444;;;===������������������


yyy������������%%%&&&222���������ccc������lllooo���OOO���������������BBB���������������[[[������555666���888���<<<>>>)))CCCDDDEEEFFF���������������������HHHNNN*UUU�������\\\___���������+++,,,fff��������������Ƞ�������������������������ddd'''���jjj---�������111uuu���xxxzzz���|||}}}~~~���333�����ꆆ����!!!777�������������������m+D�IDATxڍ���$A���ظ�9���m۶m�I��'���80g� ��y�]�Z�F<YV9a���%�M��e��E�]���@�u7.�l�z���T�)�@T�t���p�MU��<
�n�1��y�~��b�E�v�����xjZ����r��|����;����w�7�+���5������g��X�_�6|Ȣx�[��`�+��y<D��v�}^�p�{�ğ�a�	��I$�u�����@�A�_O�	'�~k&I����F/@4�x��(�w*0�%<�W��{�@\Zk6��:��*tw���S��M�Tê��3�11��‡E��`�޶Ǟ�^����ca<-���}�!�z�oPy��؏J�����燎���\��pB����6k�����B�DIEND�B`�PK�X�{��HHthe_diplomat.recipe#!/usr/bin/env  python

from calibre.web.feeds.news import BasicNewsRecipe, classes


class Diplomat(BasicNewsRecipe):
    title = u'The Diplomat'
    description = 'The Diplomat is the premier international current-affairs magazine for the Asia-Pacific region. READ THE DIPLOMAT, KNOW THE ASIA-PACIFIC'
    language = 'en'
    __author__ = 'unkn0wn'
    oldest_article = 14  # days
    max_articles_per_feed = 100
    encoding = 'utf-8'
    use_embedded_content = False
    no_stylesheets = True
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://thediplomat.com/wp-content/themes/td_theme_v3/assets/logo/diplomat_logo_black.svg'
    ignore_duplicate_articles = {'url'}
    extra_css = '''
        #td-meta { font-size: x-small }
        #td-story-authors { font-size: small}
        #td-story-image{font-size: small; font-style: italic;}
        [id^="caption-attachment"] {font-size: small; font-style: italic;}
    '''

    def get_cover_url(self):
        soup = self.index_to_soup('https://thediplomat.com')
        tag = soup.find(attrs={'class': 'td-nav-mag'})
        if tag:
            url = tag.find('img')['src'].split("/")[-1]
            self.cover_url = ('https://magazine.thediplomat.com/media/1080/' +
                              url)
            # /ads/magazine/cover/td-mag-s-1/issue_89_cover.jpg
            # https://magazine.thediplomat.com/media/1080/issue_89_cover.jpg
        return super().get_cover_url()

    keep_only_tags = [
        dict(name='header', attrs={'id': 'td-story-head'}),
        classes('td-media--story td-prose td-story-magazine__link td-authors'),
    ]

    remove_tags = [
        dict(name='aside', attrs={'id': 'td-box-newsletter'}),
        classes('td-share td-ad td-ad-inline-txt'),
    ]

    feeds = [
        ('Features', 'https://thediplomat.com/category/features/feed'),
        ('Interviews', 'https://thediplomat.com/category/interviews/feed'),
        ('Magazine Preview', 'https://thediplomat.com/category/magazine/feed'),
        # REGIONS
        ('Central Asia', 'https://thediplomat.com/regions/central-asia/feed'),
        ('East Asia', 'https://thediplomat.com/regions/east-asia/feed'),
        ('Oceania', 'https://thediplomat.com/regions/oceania-region/feed'),
        ('South Asia', 'https://thediplomat.com/regions/south-asia/feed'),
        ('South East Asia',
         'https://thediplomat.com/regions/southeast-asia/feed'),
        # TOPICS
        ('Diplomacy', 'https://thediplomat.com/topics/diplomacy/feed'),
        ('Economy', 'https://thediplomat.com/topics/economy/feed'),
        ('Environment', 'https://thediplomat.com/topics/environment/feed'),
        ('Opinion', 'https://thediplomat.com/topics/opinion/feed'),
        ('Politics', 'https://thediplomat.com/topics/politics/feed'),
        ('Security', 'https://thediplomat.com/topics/security/feed'),
        ('Society', 'https://thediplomat.com/topics/society/feed'),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'src': True}):
            img['src'] = img['src'].replace("td-story-s-1", "td-story-s-2")
        return soup
PK�X�Ƽ��the_escapist.png�PNG


IHDR��h6wIDAT�[HSa��m�L7�Vjt(�Q�Q"*��"�dD���B>�=uy(�Q�S�|���� 1�L�������uz�s�w��
�-�B C �c1pRa�E
3R�F��S"w�=��0ڠ
F��j�i(.�h��qz�R���\���ho%)���*�Ro��bS������!E����SI�h�|�q�������%��q�]�-�ӳ:n��u�֓�8񶃻����Cc=��s�ƖtJp���T:�2�����4�f�j����O���&Q�CD�N>�q�t_=��O��ѩ��?g�f)M�A	���S�U�����������}�uU�����x����S�	��~��U�]uݖ;/��RT��'qJ�) @�����:��n1�vpR'�����X^`m� ���HY��B��i�Hm(���R+[�|m�m0k%V�L�I)F���������ʆʲg��k�Vh�6a��k&��R!/�8v8����%�o�~ ��? P(V��/o��Q���G���_v6��-Z(|E�����eu")�V�;o�����W)�
�Ak�A)�Ʃ�
�-`�GZ"N)2�֢
ڢ
���.<��CIEND�B`�PK�Xэ����the_escapist.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini and Tom Surace'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>, 2013 Tom Surace <tekhedd@byteheaven.net>'
description = 'The Escapist Magazine - v1.3 (2013, April 2013)'

#
# Based on 'the Escapist Magazine - v1.02 (09, January 2010)'

'''
http://www.escapistmagazine.com/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class al(BasicNewsRecipe):
    author = 'Lorenzo Vigentini and Tom Surace'
    description = 'The Escapist Magazine'
    cover_url = 'http://cdn.themis-media.com/themes/escapistmagazine/default/images/logo.png'
    title = u'The Escapist Magazine'
    publisher = 'Themis Media'
    category = 'Video games news, lifestyle, gaming culture'

    language = 'en'
    timefmt = '[%a, %d %b, %Y]'

    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False
    recursion = 10

    remove_javascript = True
    no_stylesheets = True

    feeds = [
        (u'Daily News', u'http://www.escapistmagazine.com/rss/news/0.xml'),
        (u'Articles', u'http://www.escapistmagazine.com/rss/articles/0.xml')
    ]

    def print_version(self, url):
        # Expect article url in the format:
        # http://www.escapistmagazine.com/news/view/123198-article-name?utm_source=rss&utm_medium=rss&utm_campaign=news
        #
        baseURL = 'http://www.escapistmagazine.com'
        segments = url.split('/')
        subPath = '/' + segments[3] + '/'

        # The article number is the "number" that starts the name
        articleNumber = segments[len(segments) - 1]   # the "article name"
        articleNumber = articleNumber.split('-')[0]  # keep part before hyphen

        fullUrl = baseURL + subPath + 'print/' + articleNumber
        return fullUrl

    keep_only_tags = [
        dict(name='div', attrs={'id': 'article'})
    ]

    remove_tags = [
        dict(name='div', attrs={
             'id': ['ad_leaderboard', 'print_notice', 'bottom_panel_container']})
    ]
PK�X�\�q��the_feature.png�PNG


IHDR  V%(	pHYs��~�RIDAT8���KkQ�ϗ��]��.̢�Х��NC�T�(�.*.Z�B(��R!�uQ릠;�$ӤM�ǽ�Gg���/⹓I�ZA�3��p�o�}�?���9���
@�йa0M�5f�qИj3�E�����"3z����Qڪ�A�$��ѫ��Q�x���ŷ�4��(J�(=�.��?v�ȁ�~IL$e�������i�㓻�#@+��pA��y�9q�8G�& Rǐsv\��ށF/s��2��ζI�,�e �C�����A:t��Y�?Π�KNGC�K]�/D�� �ym <�m�x'RHzD�����h����S�L~�����Ϸh�%\o�-�P�]ᓄ?�)Zq��Jq[Rm��z$7h����N~P��޾F���
o�"�v�϶ٳ5��,=��C�'k�Sյ��Xu���Wq�5݅)��B�a]��8�@�*�T���Z!��s����۴��"��v�Z�mMT�U�m��oa=��8%��̺0�c/X�Z�*����y��Xve�.����T��j��i=��WP>3�徠Ad�7ps�s"ǔ�F�CT��G��2�yc���@mN{�yiKIEND�B`�PK�X�Fzqffthe_feature.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1365777047(BasicNewsRecipe):
    title = u'The Feature'
    __author__ = 'Jose Pinto'
    language = 'en'
    oldest_article = 30
    max_articles_per_feed = 100
    auto_cleanup = True
    use_embedded_content = False
    feeds = [(u'Latest', u'http://thefeature.net/rss/links')]
PK�X��l�the_federalist.png�PNG


IHDR  D����PLTE���"""'''������+++�����������������������888���������������HHHmmm���������������rrr���"������;;;eeeg"gggjjj'""nnn+v"{"{{{|"}}}~~~�"���+����"����������"���������""�'.���2++����'����������'����������+555���"���===@@@������������������BBB�������������.H������������""����������2������LLL����5����������������������8N���NNN���RRR�;������T���TTT���������t.'���W+'WWWZZZ\\\_ѿ�tRNS�����K��IDATx�t��%1��$ӎ����m۶m�����Z��/�\�8NC3�q�h��i�V��jt���K5�S�j{LM0O�dI٣v��c��d	C;B��Ҁ�p����p�&޼}A�j��P�1>	�@#C�G�7�yȟ^^�����	P����1?��hFxy�X6H�XNA<��G7�Cq��´vϣ�
*�Q���6(�|�:����E���@�(�D+�B�@$��p�bz�H��H^�%��D���ɓ��ہ�Lʖh�T`����F|Ú.d,�\�y @�N�j�"��pVۢ{㏯�л[���(��7���d�/��-�1C�>�X��yTw�B�
3O?�g�����%�v��@2���V�{�+E	2�g|� Gd�;G���>�#9�R���A�|:��W�֘��<�K��6�x�$>���p���7bP���;;Y�����)%4�湵��S�в���Ȋ;��02�?R�墚IEND�B`�PK�X�����
�
the_federalist.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(
        attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)}
    )


class Federalist(BasicNewsRecipe):
    title = 'The Federalist'
    __author__ = 'Kovid Goyal'
    language = 'en'
    oldest_article = 10
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    remove_attributes = ['xmlns', 'lang', 'style', 'width', 'height']

    extra_css = """
        .shortbio,.article-excerpt{font-style: italic}
        .article-author-details,.article-author-description,.article-meta-author,.article-meta-date,.article-thumbnail-caption{font-size: small}
    """

    keep_only_tags = [
        classes(
            'title-lg article-thumbnail post-categories article-excerpt article-author-details'
            ' article-meta-author article-meta-date article-content article-body shortbio entry-header'
            ' byline-month byline-standard alpha-byline article-author-description article-author-details'),
    ]
    remove_tags = [
        dict(name=['meta', 'link']),
        classes('auth-ad article-share article-tags attachment-post-thumbnail attachment-author-bio'),
    ]

    feeds = [
        ('All', 'https://thefederalist.com/feed/'),
    ]

    # def parse_index(self):
    #     return [('Articles', [
    #         {
    #         'title': 'test',
    #         'url': 'https://thefederalist.com/2022/03/09/propaganda-press-wield-bidens-russia-blame-game-to-gaslight-americans-about-expensive-gas/'},
    #         {
    #         'title': 'test2',
    #         'url': 'https://thefederalist.com/2022/03/10/white-house-will-blame-anyone-but-biden-for-februarys-7-9-inflation-jump/',
    #         }
    #     ])]

    def preprocess_raw_html_(self, raw_html, url):
        soup = self.index_to_soup(raw_html)
        # this website puts article-thumbnail images inside article-body in
        # some articles and outside it in others, so we have to special case it
        for ab in soup.findAll(**classes('article-body')):
            for img in ab.findAll(**classes('article-thumbnail')):
                del img['class']
        return str(soup)

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-lazy-src': True}):
            img['src'] = img['data-lazy-src']
        seen = set()
        for img in soup.findAll('img', src=True):
            src = img['src']
            if src in seen:
                img.extract()
            seen.add(src)
        return soup
PK�X��O�!!the_freeman.png�PNG


IHDR  ���IDATxڵV�s�j�B���33<fff��[��P�6�녝8g;|���ʖ��&�p���I
_�P���v���o-bu�[����E����A*Y�r�����w�fmr1��k�Zmtї{a���mq�J�Ļ�v�K��>�?@j7�_�����8'[<3=q�=[,a���c�)�2ڵ�4A`���5��챜�N�A�?-�����*�s�4T'���V������G����Ph�j7��2EA�i��5`���U��͒���40q�����%�6�9	`.�zh�*N���E]���/ͣ
´��������S�U�i}{�^�
+�P"�j��3@��bg��fsg.ϧ2Y�c��%ڲo9�����%�Ex��<p���Ddp+�V��^r�'#�=c��G�u��}��BR�u��(�´�̜Wľ�c�6�(��+�y�Pp�"z"'Y��o��纋��"FO}�<��C�g��YŠ;��X��3���[�<K:������H���qz���+���ɕ&������f�S���s�epy6��9z��"vY�Є����}�[�t�s���M#ʵ_����}�Y�y-�U��ԅY���9>��*�n�|}��\=u&�L��1��i�GҙT��i���[#I���+sI�-�.���;0uv6���9��r�0���I��=�Ais�}?xG��=;��P�G��3��8��J�����x����O��M���St��ppj���?�em��4[
�)��v�zyE��V+@/�nN�u��y���
���=
�ȭv��5��������&�b���ox!���� ޏՋ4��xI��!�>Y����6պU��_Umnp������^N�M����T�@u��<�҉�=�xi��e[M뫕��Fdy��T�N���*�7�'K{�=���z��@�}�}��W��P2�$�tu�p~�uO�_%´�����N������d��
є���6��j�O��Z��x��0��d�`��RNr���(E"�^�����l��\��93�.�1�}Q��2��M.N'��>���l���)grc4!�t_I�R(ȕU:�p�����m��
%�]��îwh�eQ]��,����+��IF$�K�m�HDh�dU��ٻ��¯�N�>(�2�
�^<�	�A���7*;)�@��"#PC�_!ޡ^��P�P�ZU�X3.>�t�}���RX֚����?���������ގ�rcR)r�Ln\�~����,+��1T/�u���d9��)�
�ҿk����k�&��|�[�ӿC'al4���"g?!>7b��d6�6���1E��]�R�GYg��F,��T#��
� 4�M��i�:>õ�i��֮C)a]�V^m6�A�žM(�E���ɫi&�k���pe�4��GQ�t>w�w����1W,^F���0����G0Hc������}�WvFݯ`�e��?;�]�Մ��{��WG~4x�wb0�/��P�>���m�me��U���7��"?��R٩��Y[[�g��4/n,f�Ӊ��8�����Պ�h���?V�����7��P�����_�7U[7V[(q�g��#I׍��)<‘J�� ��ݢ�s�fX8�ƋsŞY���o�)m_�-GZm����
6�
���Xq3\vbIEND�B`�PK�Xyk�22the_freeman.recipe
'''
www.philstar.com
'''

import time
from calibre.web.feeds.recipes import BasicNewsRecipe


class Freeman(BasicNewsRecipe):
    title = 'The Freeman'
    custom_title = "The Freeman - " + time.strftime('%d %b %Y %I:%M %p')
    __author__ = 'jde'
    __date__ = '31 May 2012'
    __version__ = '1.0'
    description = 'The Freeman is a daily English-language newspaper published in Cebu, Philippines, by the Philippine Star. It was the first newspaper in Cebu, first published in May 1919.  The motto of the newspaper is "The fair and fearless" - philstar.com is a Philippine news and entertainment portal for the Filipino global community.   It is the online presence of the STAR Group of Publications, a leading publisher of newspapers and magazines in the Philippines.'  # noqa
    language = 'en_PH'
    publisher = 'The Philippine STAR'
    category = 'news, Philippines'
    tags = 'news, Philippines'
    cover_url = 'http://www.philstar.com/images/logo_Freeman.jpg'
    masthead_url = 'http://www.philstar.com/images/logo_Freeman.jpg'
    oldest_article = 1.5  # days
    max_articles_per_feed = 25
    simultaneous_downloads = 10
    publication_type = 'newspaper'
    timefmt = ' [%a, %d %b %Y %I:%M %p]'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = False

    remove_tags = [dict(name='img',  attrs={'id': 'Image1'})  # Logo
                   # Section (Headlines, Nation, Metro, ...)
                   # Comments
                   # View Comments
                   # Zoom
                   , dict(name='span', attrs={'id': 'ControlArticle1_LabelHeader'}), dict(name='a',      attrs={'id': 'ControlArticle1_FormView1_hlComments'}), dict(name='img',  attrs={'src': 'images/post-comments.jpg'}), dict(name='a',      attrs={'id': 'ControlArticle1_FormView1_ControlPhotoAndCaption1_hlImageCaption'})  # noqa
                   ]
    conversion_options = {'title': custom_title,
                          'comments': description,
                          'tags': tags,
                          'language': language,
                          'publisher': publisher,
                          'authors': publisher,
                          'smarten_punctuation': True
                          }

    feeds = [

    ('Cebu News'      		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=107'),
    ('Freeman Opinion'       	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=109'),
    ('Metro Cebu'     		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=531'),
    ('Region'          		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=530'),
    ('Cebu Business'            	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=108'),
    ('Cebu Sports'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=110'),
    ('Cebu Lifestyle'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=111'),
    ('Cebu Entertainment'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=51')
    ]

# process the printer friendly version of article
    def print_version(self, url):
        return url.replace('/Article', '/ArticlePrinterFriendly')

# obtain title from printer friendly version of article; avoiding
# add_toc_thumbnail changing title when article has image
    def populate_article_metadata(self, article, soup, first):
        article.title = soup.find(
            'span', {'id': 'ControlArticle1_FormView1_ArticleHeaderLabel'}).contents[0].strip()
PK�X�2��the_friday_times.png�PNG


IHDR  �Tg�-PLTE����:��tRNSw���3f�"U0l#�eIDAT(Sc`N`��S3�+O��fI�3y�dx�`��a3����P����L`M�؀(�x�U�!�����0
(�D�q
���@��	Y�76CIEND�B`�PK�X����the_friday_times.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class TheFridayTimes(BasicNewsRecipe):
    __author__ = 'Krittika Goyal, ireadtheinternet'
    language = 'en_PK'
    encoding = 'utf8'
    version = 1.1

    title = u'The Friday Times'
    category = u'news, Pakistan'
    description = u"Pakistan's First Independent Weekly Paper"

    no_stylesheets = True
    no_javascript = True
    ignore_duplicate_articles = {'url'}

    keep_only_tags = [
        dict(name='div', attrs={'class': 'sidebar_content'}),
    ]

    remove_tags = [
        dict(name='p', attrs={'class': 'no-break'}),
        dict(name='div', attrs={'class': 'related_posts'}),
        dict(name='div', attrs={'id': 'respond'})
    ]

    def parse_index(self):
        toc_page = self.index_to_soup('http://www.thefridaytimes.com/tft/')
        toc = toc_page.find(
            'div', attrs={'class': 'sidebar_left_home_wrapper'})

        articles = []
        for story in toc.findAll('a'):
            # skip the links with an image, they are repeated further down
            if story.find('img') is not None:
                continue
            url = story['href']
            # If no title, use url as title
            title = story.get('title', url)
            self.log('Found article:', story)
            self.log('\t', url)
            articles.append({'title': title, 'url': url,
                             'date': '', 'description': ''})

        return [('Current Issue', articles)]
PK�X�bƹ�the_insider.png�PNG


IHDR���R-PLTE   000@@@PPP```ppp��������������������߯��GIDAT[c`�� �:����.�h�� [�XdC��x���X�MJ�%0�)�HGjS>[?�1;u7IEND�B`�PK�X6$�the_insider.recipe#!/usr/bin/env python2
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class TheInsider(BasicNewsRecipe):
    title = 'The Insider'
    cover_url = 'https://s3-us-west-2.amazonaws.com/anchor-generated-image-bank/production/podcast_uploaded_nologo400/10331708/10331708-1604408816914-d03520fb339d5.jpg'  # noqa
    __author__ = 'bugmen00t'
    description = 'Расследования Репортажи Аналитика'
    publisher = 'theins.ru'
    category = 'news'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = True
    oldest_article = 300
    max_articles_per_feed = 100

    remove_tags_before = dict(name='div', attrs={'id': 'wrapper'})
    remove_tags_after = dict(name='p', attrs={'style': ' color: #999999;'})
    remove_tags = [
        dict(name='div', attrs={'class': 'post-share'}),
        dict(name='div', attrs={'class': 'post-share fixed-likes'}),
        dict(name='div', attrs={'class': 'topads'}),
        dict(name='div', attrs={'class': 'pre-content-line'}),
        dict(name='div', attrs={'class': 'author-opinions'}),
        dict(name='div', attrs={'class': 'content-banner'}),
        dict(name='div', attrs={'id': 'sidebar'})
    ]

    feeds = [
        (u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438', u'https://theins.ru/feed')
    ]
PK�X1Z��qqthe_journal.png�PNG


IHDR  D����PLTE����������Q]��������
����|�����~����4B�KW���z��(����Va���������鐘�u~����+����y��8E�����do�5C���φ�����$����NZ�fq����/=�)���Ҵ��/�������������U`�mw���پ)��IDATx���S�aF���l۵��e�6>3��n�mE†.0��`Ⱦ,����=��:��V`xo:�§����Wb�&u(łg�2�eY�)PБb	�-�T
�ա�T����r����[3�E�,�IEND�B`�PK�X,�,��the_journal.recipe__license__ = 'GPL v3'
__copyright__ = '2011 Phil Burns'
'''
TheJournal.ie
'''

from calibre.web.feeds.news import BasicNewsRecipe


class TheJournal(BasicNewsRecipe):

    __author_ = 'Phil Burns'
    title = u'TheJournal.ie'
    oldest_article = 1
    max_articles_per_feed = 100
    encoding = 'utf8'
    language = 'en_IE'
    timefmt = ' (%A, %B %d, %Y)'

    no_stylesheets = True
    remove_tags = [dict(name='div', attrs={'class': 'footer'}),
                   dict(name=['script', 'noscript'])]

    extra_css = 'p, div { margin: 0pt; border: 0pt; text-indent: 0.5em }'

    feeds = [
        (u'Latest News', u'http://www.thejournal.ie/feed/')]
PK�XW�L��the_manila_bulletin.png�PNG


IHDR  D���)PLTE&9{&9{&9{&9{&9{&9{�������������������������������������������������������������������������������۾�׸�Զ�ҵ�ҳ�в�б�б�ϱ�ϰ�ϰ�Ϋ�̧�ʠ�ŝ�Ú��������������������������������������������}��v��t��s�r~�q~�nz�my�kx�an�Yg�Ve�O^�N]�L[�K[�HX�EV�CS�BR�?P�>O�<M�:K�7I�6H�6G�1C�.@�+=~*=})<}(:|&9{�"�tRNS>����XIDATxڬ�cb�@��	ϵQ۶m��E�̤���"QJY���;|ױٞ|ȳ�y�RXʑO9ʕO�ʗO�J���yG�Ld1X��Pk�ܑ	�)�Q�{��f`���P3T�@Fa���`T�9.�pȘ`���z�ḹǡ�E��󠿉��c��x
(�}���A�@�L?���)X�ᐾzr!��ς�}ЮƸH�TɋFP��q\28I������((ԉŧW�{��ګW]�Y�� C��-�X�v7m=�*��`�%��	f�Y�`�%��v���|�<IEND�B`�PK�X��9D%%the_manila_bulletin.recipeimport time
from calibre.web.feeds.recipes import BasicNewsRecipe


class TheManilaBulletin(BasicNewsRecipe):
    title = u'The Manila Bulletin'
    custom_title = "The Manila Bulletin - " + \
        time.strftime('%d %b %Y %I:%M %p')
    __author__ = 'jde'
    __date__ = '06 June 2012'
    __version__ = '1.0'
    description = "The Manila Bulletin, (also known as the Bulletin and previously known as the Manila Daily Bulletin and the Bulletin Today) is the Philippines' largest broadsheet newspaper by circulation."  # noqa
    language = 'en_PH'
    publisher = 'The Manila Bulletin'
    category = 'news, Philippines'
    tags = 'news, Philippines'
    cover_url = 'http://www.mb.com.ph/sites/default/files/mb_logo.jpg'
    masthead_url = 'http://www.mb.com.ph/sites/default/files/mb_logo.jpg'
    oldest_article = 1.5  # days
    max_articles_per_feed = 25
    simultaneous_downloads = 20
    publication_type = 'newspaper'
    timefmt = ' [%a, %d %b %Y %I:%M %p]'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True

    keep_only_tags = [
        dict(name='div', attrs={'class': 'article node'}), dict(name='div', attrs={
            'class': 'label'}), dict(name='div', attrs={'class': 'content clear-block'})
    ]

    remove_tags = [
        dict(name='li', attrs={'class': 'print_html'}),
        dict(name='li', attrs={'class': 'print_html first'}),
        dict(name='li', attrs={'class': 'print_mail'}),
        dict(name='li', attrs={'class': 'print_mail last'}),
        dict(name='div', attrs={'class': 'article-sidebar'}), dict(name='table', attrs={'id': 'attachments'})
    ]

    auto_cleanup = False

    conversion_options = {'title': custom_title,
                          'comments': description,
                          'tags': tags,
                          'language': language,
                          'publisher': publisher,
                          'authors': publisher,
                          'smarten_punctuation': True
                          }

    feeds = [
        # ,
    (u'Regional', u'http://www.mb.com.ph/feed/news/regional'),

    (u'Main News', u'http://www.mb.com.ph/feed/news/main'),
    (u'Business', u'http://www.mb.com.ph/feed/business'),
    (u'Sports', u'http://www.mb.com.ph/feed/sports'),
    (u'Entertainment', u'http://www.mb.com.ph/feed/entertainment'),
    (u'Opinion', u'http://www.mb.com.ph/feed/news/opinion'),
    (u'Agriculture', u'http://www.mb.com.ph/feed/news/agriculture'),
    (u'Technology', u'http://www.mb.com.ph/feed/lifestyle/technology'),
    (u'Lifestyle', u'http://www.mb.com.ph/feed/lifestyle'),
    (u'Drive', u'http://www.mb.com.ph/feed/lifestyle/drive'),
    ]


#  if use print version - convert url
#  http://www.mb.com.ph/articles/361252/higher-power-rate-looms
#  http://www.mb.com.ph/print/361252
#
#    def print_version(self,url):
#        segments = url.split('/')
#        printURL = '/'.join(segments[0:3]) + '/print/' + '/'.join(segments[5])
#        return printURL
PK�X����		the_manila_times.png�PNG


IHDR  ���IDATx^}V{l�������5641D*y�h�PڤQQ�?��*�����*�'�_�@�(�MڪRi�H�B�(�<BԒҼj�d!
������k^���*�=��{�ν�|g<�r�� 
�n�v�T�R���L\׭�jD����kk\�ݐn%��� 2'	��F����X��rΑ�h�I�1�����k�H�~M��1�A�H�N=��7�Ѩ��D"���V�u��4�sP�d�tl”P��1�P
�8c"8���P=HlI��B<
�߁G��:Q�U��|6�`UJ7�[�,�i�KE�4K���6���`���,K�oH���t�Z.�5ܨ�v�̤	�����|�N�8�駟NOO#����"����",037�����g�Z%�X���T(�u:t�{�A3�;�c˖-����N�}�ّ#G�m۶w�^D��ϟ߳{ώ;�=z��̤'&'�J��T*H���tww#zbbˮ�.4y���p׵k׎?�%�?�0:�����FFF�����͛7�R)���84Y6��#����y��H���Bc��\�f����ߵk���Ν;���R��-_�b>��I��yf�֭[�L(Вr��-t�U,pE������?���8�L�����5k)���5�9®�_��P���?Y���OMM�p�z�m�y):�N�Q&����Dr��56��7ĺ�;
�%�m[qۊ�M�t�a�G#

�4$�I^{!
��;��A��W�\���	���ܒ�K-��ok�:��=�=�X����!#=�)ehw�"P
ZGІ3o��y�a�
��<>>�����)<V(p�h,Zg*�J�Zś��DG'��6��h�>y���#x%��ۗ,i��?�C'F?�a��˗/�<}��_��0����#V��0�h��8<�B�6�1�5mv6��Ww��<Քl�o�FR��ۧ~��׎�invN�bnq���S'O���������&]�ʓ����f01(2bz8\q����c/]‹$���$*.��o]���MF���hL,]�t`�@k[+l"�p}��L��xH�M�i��
�
1�˞9����v�o��Ʒ7=�ƛ'U�яF��c�W.[�~�Ϟ����:��dT���+�*j^ժ�ܷ-��$�"r+�~k����v�x����@�@�4kf���k���]qz�Sk�Z�r�:��̠��G[S+��0W�&o|���1?�.�g2����0� ��.}0���m��s�:%L�`m�p?$���s�~�d�߶��-��.��l����239�Vg*�t�4'�EU����Pu%_��'�o����rW��s���|��V�|���''P*��'a�D��|E݄k�b�����*՗p��k/�r�c��̃����������G�fGΨcg���B�h��'G�*i)�2K��ZP
\Y)G��#'f޿8���/?���w?���7�m��_?��������o�}K��0w��h��o?��l�_t-��i�58J5E�A^�0�F>�|el~b�j�Uk�ۍ�j[g�`���6/)D�GF�uv���t
]Ht�놨�z�o�;^o9�KQ�F�R�m��;1N�dX誺��|��^����TG��\�V��5�O�N_�z�|�ٲU��l��MϜ�܍����֞��֖��/_�lӲ�H�R�'�Z�7�S�$�0O-k���
�h�h+#���M�=׳�b�\�]�s#���z�Z÷����apM��'+J�R:�uI	�햶���T�1�T��U[T�^�ʋ�ƨ��E�ўhmt���L9�NW*vcKS�Ҏ�R,�-NV
eQ��6s�"�a0i�*EHI#c���T)�iZ�WS��J�m;	Sc#1%̲mZ��h$��L�0y����d�Rᆘ
1X����"D�`΂�+�k�q�4�ȧ���S$Ba�8'M�II� )�9�$��9�9�kH
�!�DU"�"d��^$|�."������%���}�]v�"��AS*�I�UҕP
��p���9�����&9RI���!H	��TE��Alv�!�J�w�I�kA�D�
:HD�$�q_r%���G4MS��D4nC]SJ9���c��Q��bJ��L�8��z�ؒ1[���*�F�Iw$9B�`��q"�$��4_x�f�OD�-�7�9a�o�IEND�B`�PK�X-H{the_manila_times.recipeimport time
from calibre.web.feeds.recipes import BasicNewsRecipe


class TheManilaTimes(BasicNewsRecipe):
    title = u'The Manila Times'
    custom_title = "The Manila Times - " + time.strftime('%d %b %Y %I:%M %p')
    __author__ = 'jde'
    __date__ = '06 June 2012'
    __version__ = '1.0'
    description = 'The Manila Times is the oldest existing English language newspaper in the Philippines.'
    language = 'en_PH'
    publisher = 'The Manila Times'
    category = 'news, Philippines'
    tags = 'news, Philippines'
    cover_url = 'http://www.manilatimes.net/images/banners/logo-mt.png'
    masthead_url = 'http://www.manilatimes.net/images/banners/logo-mt.png'
    oldest_article = 1.5  # days
    max_articles_per_feed = 25
    simultaneous_downloads = 20
    publication_type = 'newspaper'
    timefmt = ' [%a, %d %b %Y %I:%M %p]'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True

    remove_tags = [
        dict(name='img', attrs={'alt': 'Print'}), dict(name='img', attrs={
            'alt': 'Email:'}), dict(name='dd', attrs={'class': 'hits'})
    ]

    auto_cleanup = True

    conversion_options = {'title': custom_title,
                          'comments': description,
                          'tags': tags,
                          'language': language,
                          'publisher': publisher,
                          'authors': publisher,
                          'smarten_punctuation': True
                          }

    feeds = [
    (u'Breaking News', u'http://www.manilatimes.net/index.php/news/breaking-news?format=feed&amp;type=rss'),
    (u'Top Stories', u'http://www.manilatimes.net/index.php/news/top-stories?format=feed&amp;type=rss'),
    (u'Headlines', u'http://www.manilatimes.net/index.php/news/headlines-mt?format=feed&amp;type=rss'),
    (u'Nation', u'http://www.manilatimes.net/index.php/news/nation?format=feed&amp;type=rss'),
    (u'Regions', u'http://www.manilatimes.net/index.php/news/regions?format=feed&amp;type=rss'),
    (u'World', u'http://www.manilatimes.net/index.php/news/world?format=feed&amp;type=rss'),
    (u'Top Business News', u'http://www.manilatimes.net/index.php/business/top-business-news?format=feed&amp;type=rss'),
    (u'Business Columnist', u'http://www.manilatimes.net/index.php/business/business-columnist?format=feed&amp;type=rss'),
    (u'Opinion - Editorials', u'http://www.manilatimes.net/index.php/opinion/editorials?format=feed&amp;type=rss'),
    (u'Opinion - Columnist', u'http://www.manilatimes.net/index.php/opinion/columnist1?format=feed&amp;type=rss'),
    (u'Opinion - Editorial Cartoon', u'http://www.manilatimes.net/index.php/opinion/editorial-cartoon?format=feed&amp;type=rss'),
    (u'Top Sports News', u'http://www.manilatimes.net/index.php/sports/top-sports-news?format=feed&amp;type=rss'),
    (u'Sports Columnist', u'http://www.manilatimes.net/index.php/sports/sports-columnist?format=feed&amp;type=rss'),
    (u'Life & Times', u'http://www.manilatimes.net/index.php/life-and-times?format=feed&amp;type=rss'),
    (u'Showtime', u'http://www.manilatimes.net/index.php/life-and-times/showtime?format=feed&amp;type=rss'),
    (u'Sunday Times', u'http://www.manilatimes.net/index.php/sunday-times?format=feed&amp;type=rss'),
    (u'Sunday Times Magazine', u'http://www.manilatimes.net/index.php/sunday-times/the-sunday-times-magazines?format=feed&amp;type=rss'),
    (u'Motoring News', u'http://www.manilatimes.net/index.php/fast-times/motoring-news?format=feed&amp;type=rss'),
    (u'Motoring Columnist', u'http://www.manilatimes.net/index.php/fast-times/motoring-columnist?format=feed&amp;type=rss'),
    (u'Technology', u'http://www.manilatimes.net/index.php/technology?format=feed&amp;type=rss')]
PK�XX�E}��the_marker.png�PNG


IHDR  D����PLTE�����������������������������������������������������������������������������������������������������������������������������������ܾ�Ȼ�ź�Ļ�ź�ķ��о�Ͻ�ϼ�λ�ϻ�ʱ�ʰ�ʰ�ɯ�ɮ�ƪ�Ʃ�Ƨ�Ʀ�Ŧ�ť�Ġ�ß�Ü�›���w��q�p�~o�}o�~o�}m�|m�{l�zi�wi�wh�vg�vh�uf�ug�ud�rc�qa�o`�nZ�gY�gX�fW�eT�cT�bT�bS�aS�aP�]P�]N�\N�]N�\N�\M�[M�ZL�ZJ�XF�TF�TC�QC�QB�PA�OA�P@�N?�M?�M=�K=�K<�J����ޮ�؟���ẑ>�L������[�fg�qU�`@�M[�g]�g^�h^�i=�K��������⸴�_�jc�mf�qA�Om�vn�wo�xq�zt�~x́ŷB�O·�Њ�Ќ�Ќ�Ќ�Ӕ�Ԗ�ԕ�Ԗ�՗�՘�՘�ל�֜�֝�מ�םC�P�٣�٤�ڧ�ۧ�ۨ�ܩ�ܪ�ܫ�ݬ�ޭ�ݮD�QD�RE�RE�S�㼻忻��������������������������������������������������������������������������������������������G�TK�W���������M�YN�Z���N�ZS�_P3�|tRNS

!#&&')**-./011256899;;Y]^^_chijllz{|}~������������������������������������������������������������
IDATx�b 0�K�*(�J�3b���2��H/(H�0���P¤�S^��:L����5H�2ԜY^�)�
d;�#乜�k0@�#'�~��, Ì	�~-��(WDq<�m�	�ض�6�Ϭw�<۶m۶m�ջ��i���.�P$�G���
��p{���	�7U@0�K����`�c�@E���ux����<�M}�T��u���Xv"h(�aW�],�U���r`�M	Tf�(�-5�곛$pc56��@Id3U��tP~"/�s`�{	{���؉T�~��ăw�g�DSW��y��9F1Z*,�g<[ǁUW�{4���
����J,>'�
"��'��|��0П3F��>��)��0`�CTg+� �w-��&����,M�����G��J���(�\_��L�W���R�1�KU�<i��dWa�g[�!%�u2��$+N�d�f�]�,]�φ���,a҅������CI��3&11��YO�k�e������c&%��U����sIEND�B`�PK�X�=�0*	*	the_marker.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1283848012(BasicNewsRecipe):
    description = 'TheMarker Financial News in Hebrew'
    __author__ = 'Marbs'
    cover_url = 'http://static.ispot.co.il/wp-content/upload/2009/09/themarker.jpg'
    title = u'TheMarker'
    language = 'he'
    simultaneous_downloads = 5
    remove_javascript = True
    timefmt = '[%a, %d %b, %Y]'
    oldest_article = 1
    keep_only_tags = dict(name='div', attrs={'id': 'content'})
    remove_attributes = ['width', 'float', 'margin-left']
    no_stylesheets = True
    remove_tags = [dict(name='div', attrs={'class': ['social-nav article-social-nav', 'prsnlArticleEnvelope', 'cb']}),
                   dict(name='a', attrs={'href': ['/misc/mobile']}),
                   dict(name='span', attrs={'class': ['post-summ']})]
    max_articles_per_feed = 100
    extra_css = 'body{direction: rtl;} .article_description{direction: rtl; } a.article{direction: rtl; } .calibre_feed_description{direction: rtl; }'
    feeds = [(u'Head Lines', u'http://www.themarker.com/cmlink/1.144'),
             (u'TA Market', u'http://www.themarker.com/cmlink/1.243'),
             (u'Real Estate', u'http://www.themarker.com/cmlink/1.605656'),
             (u'Global', u'http://www.themarker.com/cmlink/1.605658'),
             (u'Wall Street', u'http://www.themarker.com/cmlink/1.613713'),
             (u'SmartPhone', u'http://www.themarker.com/cmlink/1.605661'),
             (u'Law', u'http://www.themarker.com/cmlink/1.605664'),
             (u'Media', u'http://www.themarker.com/cmlink/1.605660'),
             (u'Consumer', u'http://www.themarker.com/cmlink/1.605662'),
             (u'Career', u'http://www.themarker.com/cmlink/1.605665'),
             (u'Car', u'http://www.themarker.com/cmlink/1.605663'),
             (u'High Tech', u'http://www.themarker.com/cmlink/1.605659'),
             (u'Small Business', u'http://www.themarker.com/cmlink/1.605666')]

    def print_version(self, url):
        # print_url='http://www.themarker.com/misc/article-print-page/'+split1[-1]
        txt = url

        re1 = '.*?'  # Non-greedy match on filler
        re2 = '(tv)'  # Word 1

        rg = re.compile(re1 + re2, re.IGNORECASE | re.DOTALL)
        m = rg.search(txt)
        if m:
            # print 'bad link'
            return 1
PK�X2R�4

the_monthly.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes


class monthly(BasicNewsRecipe):
    title = 'The Monthly'
    __author__ = 'unkn0wn'
    description = (
        'The Monthly is one of Australia’s boldest voices, providing enlightening commentary and vigorous,'
        ' at times controversial, debate on the issues that affect the nation.'
    )
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en_AU'
    remove_attributes = ['height', 'width']
    ignore_duplicate_articles = {'url'}

    timefmt = ' [%B %Y]'

    extra_css = '''
        .article-page__title {font-weight:bold; font-size:large;}
        .article-page__author, .category, .caption {font-size:small; color:#404040;}
        .article__summary, .author-details-bottom-wrapper, em {font-style:italic; color:#202020;}
    '''
    keep_only_tags = [
        classes('article-page')
    ]
    remove_tags = [
        classes(
            'node-teaser-hidden article-page__social__icons sidebar-toc article-footer-container'
            ' article-page__sidebar toc-list-container tm-promo-banner-article-p4-wrapper edition'
        )
    ]

    def parse_index(self):
        soup = self.index_to_soup('https://www.themonthly.com.au/latest-edition')
        if cov := soup.find(**classes('article__edition-image')):
            self.cover_url = cov.find('img')['src']
            self.log(self.cover_url)

        feeds = []
        main = soup.find(**classes('main'))
        for art in main.findAll(**classes('article')):
            if hr := art.find('a', attrs={'href':lambda x: x and x.startswith('/issue/')}):
                url = 'https://www.themonthly.com.au' + hr['href']
            else:
                if hr := art.findParent('a', attrs={'href':lambda x: x and x.startswith('/issue/')}):
                    url = 'https://www.themonthly.com.au' + hr['href']
            title = self.tag_to_string(art.find(**classes('article__title')))
            desc = ''
            if text := art.find(**classes('article__text')):
                desc = self.tag_to_string(text)
            if auth := art.find(**classes('article__author')):
                desc = self.tag_to_string(auth) + ' | ' + desc
            if cat := art.find(**classes('category')):
                desc = self.tag_to_string(cat) + ' | ' + desc
            if not title or not url:
                continue
            self.log(' ', title, '\n\t', url, '\n\t', desc)
            feeds.append({'title': title, 'url': url, 'description':desc})
        return [('The Monthly', feeds)]
PK�X�$ʺ�the_nation.png�PNG


IHDR���R-PLTE������������ߣ�ؒ�т��su�eh�X[�LO�58�*-� #���=HIDATx�c������d0���-�}��+�7�(�{e���0�݂2�߁h�	��4S�[�VH��[zHIEND�B`�PK�XTˎ��the_nation.recipe__license__ = 'GPL v3'
__copyright__ = '2008 - 2011, Darko Miletic <darko.miletic at gmail.com>'
'''
thenation.com
'''
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 Thenation(BasicNewsRecipe):
    title = 'The Nation'
    __author__ = 'Darko Miletic'
    description = 'Unconventional Wisdom Since 1865'
    publisher = 'The Nation'
    category = 'news, politics, USA'
    oldest_article = 120
    encoding = 'utf-8'
    max_articles_per_feed = 100
    no_stylesheets = True
    language = 'en'
    use_embedded_content = False
    delay = 1
    login_url = 'http://www.thenation.com/user?destination=%3Cfront%3E'
    publication_type = 'magazine'
    needs_subscription = 'optional'
    exra_css              = """
                              body{font-family: Arial,Helvetica,sans-serif;}
                              .print-created{font-size: small;}
                              .caption{display: block; font-size: x-small;}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [
        classes('title subtitle byline article-body-inner'),
    ]
    remove_tags = [
        dict(name=['link', 'iframe', 'base', 'meta', 'object', 'embed', 'script']),
        classes('email-signup-module current-issue related-newarticle related-multi series-modules'),
    ]
    remove_attributes = ['lang']

    feeds = [(u"Articles", u'http://www.thenation.com/rss/articles')]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('http://www.thenation.com/')
        if self.username is not None and self.password is not None:
            br.open(self.login_url)
            br.select_form(nr=1)
            br['name'] = self.username
            br['pass'] = self.password
            br.submit()
        return br

    def get_cover_url(self):
        soup = self.index_to_soup('http://www.thenation.com/issue/')
        item = soup.find('div', attrs={'id': 'cover-wrapper'})
        if item:
            return item.img['src']
        return None
PK�X�����the_new_age_za.png�PNG


IHDR��h6�IDATx�c�O"�nܸy��zz|��K�������DǏ]�x��U��V�\=k��S�Ϝ3�XS�[�wFV��ʽ�u���]\P�,�����������N�ٻ��@�@
@�99(�),�kCKFj���"PϮ�;A~��u��q� ���A����?��������������i�%��L������`�
�$��g���
����0 ��_
��~̙�G�xnRPiYq	�TVP���#����1,�{y�SuK3�XKS3���k� 4�?p���_ߧ�z�c�XZ�QF8;3k���i�)@
Օ�P
@O�۰	�ᝬ���O�}�������$p֬^
�`om����?�o�A��?PP�`.X
�TF����Q����IEND�B`�PK�XH��K��the_new_age_za.recipe__license__ = 'GPL v3'
__copyright__ = '2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.thenewage.co.za
'''

from calibre.web.feeds.news import BasicNewsRecipe


class TheNewAge_za(BasicNewsRecipe):
    title = 'The New Age'
    __author__ = 'Darko Miletic'
    description = "The New Age newspaper is a national daily newspaper, owned and operated by TNA Media (Pty) Ltd. TNA Media was established in June 2010 and the first publication of The New Age was on 6 December 2010. The New Age covers news from all nine provinces, along with national events, Op-Ed columns, politics, Africa and International news, sports, business, entertainment, lifestyle, science and technology."  # noqa
    publisher = 'TNA Media (Pty.) Ltd.'
    category = 'news, politics, South Africa'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    auto_cleanup = False
    language = 'en_ZA'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://www.thenewage.co.za/image/tnalogo.png'
    extra_css             = """
                                body{font-family: Arial,Verdana,sans-serif }
                                img{display: block}
                                .storyheadline{font-size: x-large; font-weight: bold}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['object', 'embed', 'iframe', 'table', 'meta', 'link'])]
    keep_only_tags = [
        dict(name='div', attrs={'id': ['dv_headline', 'dv_story_dtls']})]

    feeds = [

    (u'National', u'http://www.thenewage.co.za/rss.aspx?cat_id=1007'),
    (u'Provinces', u'http://www.thenewage.co.za/rss.aspx?cat_id=1008'),
    (u'Business', u'http://www.thenewage.co.za/rss.aspx?cat_id=9'),
    (u'Sport', u'http://www.thenewage.co.za/rss.aspx?cat_id=10'),
    (u'World', u'http://www.thenewage.co.za/rss.aspx?cat_id=1020'),
    (u'Africa', u'http://www.thenewage.co.za/rss.aspx?cat_id=1019'),
    (u'Science&Tech', u'http://www.thenewage.co.za/rss.aspx?cat_id=1021')
    ]
PK�X�>��rrthe_new_republic.png�PNG


IHDR  V%(9IDATx�+�q����$t������dpH�(O���j0�(;�(Y�I�h�HdPJ!,R��(ũ�I|��`�z����-�ڶ�)�m/Vq���مE�|�I���xh�.~�F���͈7�z�\LJ��Lf�I��u���h�.}�k����G�$���>K���:S *E0�nI���Ҽ�O�"�F%-Ҝ��85�a��"���4Qo��̮u�˴&�R7%M�v(ݖ�cZ
�v5�IKPy/m�-Hs�^�2�<�5`@� �<
g��I�P�i�֢���z"k7����)X�(�'����WZ1}ߖ=m!IEND�B`�PK�X/m���
the_oz.png�PNG


IHDR��h6�IDATx�c��
�8z����}�]>��������̛��@굥����_��~]8�]�ǜ�76/�D^)2���y�
P�m�߻`W,>�ԽTa|��J��6�Te��Y��D�:ӿ�?P4�8{��&�+]�W�@�A����_΅j�q��ǔ�W�,PEZ`)���z��*�+
���M�7H�kEF_�R]	��k5Ʒ�Io�^�	wT�ru���4��wo_���AE՘^�뼶�~��=)3|*L��熼Wꌯ49>f���y{?��{	t�I�u^I���߂4|[1�}Q��W/�#������}
��Ke�����/x��R�N�񉰈#~=����c8�����N}�M$E�ݛ7;��\��f��YIEND�B`�PK�X�ܐU


the_oz.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2009, Matthew Briggs'
__docformat__ = 'restructuredtext en'

'''
http://www.theaustralian.news.com.au/
'''

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 DailyTelegraph(BasicNewsRecipe):
    title = u'The Australian'
    __author__ = u'Kovid Goyal'
    description = (u'National broadsheet newspaper from down under - colloquially known as The Oz'
                   '. You will need to have a subscription to '
                   'http://www.theaustralian.com.au to get full articles.')
    language = 'en_AU'

    oldest_article = 2
    needs_subscription = 'optional'
    max_articles_per_feed = 30
    remove_javascript = True
    no_stylesheets = True
    encoding = 'utf8'
    remove_empty_feeds = True
    ignore_duplicate_articles = {'url'}

    keep_only_tags = [
        classes('story-headline'),
        dict(id='story'),
    ]
    remove_tags = [
        dict(id='comments'),
        classes('story-info story-header-tools module-controls story-sidebar'
        ' story-footer story-footer-tools story-extras story-related vms-nav'
        ' vms-endcard vms-discover share-tools story-comments-link'
        ' vms-controls ooyala-player vms-countdown vms-header comments')
    ]

    feeds = [
        (u'National News', u'https://www.news.com.au/content-feeds/latest-news-national/'),
        (u'World News', u'https://www.news.com.au/content-feeds/latest-news-world/'),
        (u'Entertainment', u'https://www.news.com.au/content-feeds/latest-news-entertainment/'),
        (u'Technology', u'https://www.news.com.au/content-feeds/latest-news-technology/'),
        (u'Lifestyle', u'https://www.news.com.au/content-feeds/latest-news-lifestyle/'),
        (u'Sport', u'https://www.news.com.au/content-feeds/latest-news-sport/'),
        (u'Finance', u'https://www.news.com.au/content-feeds/latest-news-finance/'),
        (u'Travel', u'https://www.news.com.au/content-feeds/latest-news-travel/'),
    ]

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based')

    def get_article_url(self, article):
        ans = article.link
        if '/video/' in ans:
            return
        return ans

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X���h��!the_philippine_daily_inquirer.png�PNG


IHDR  szz��IDATx�ŗS�4W�'�m۶m�Ķ�߶m�X۶m�n�N2�;܌��5nϽUs�P8��p
y�,$�$��
g���8�,=sl�kܟf�*�/S��L��,'WXl��O c��ZeQ��o?s��d�d�N���X͘�D��h��_G�2����F3 �Q<W�d�4@�ԕ;IN�70&�7��:���e��p���A���<�I�`CH�3����Zr��7�'��\�p| �Y�g�U��q��9�]s#�yxA�\��3B����K����q0/��ǹ���K��Dk���T4v���xb����ދ��i��jW:��q�9�4W،��n��‘�*Ե� ��ϯ�5db�8�{aWT9�J[��z�"�c4��?�8�5r��g������I#����mDKg�����{����4�Y��^�����
�=l`Q4
���xsX�D	���5���8wl��l1�o���$ㇽ�_�����w�-��h�e�I�tǫ�2 �[����7�V�ih���Ѥj�vGWH4RRP)]o��'"��I��KPH�0
�*>*�I��g�؂�1 �2��ҍ��N�w{�144��e鉿�*C�|G��5OI�D�	R,�m��&��6������5�3�#��e�1$��5��7&ἑ(�i.|>{:�|J�0=G�k0�-�F�ؙ�D�^s��m)���lꆤ)�aoc�iB{$[���	��h.O28~���X3rC;��G4~SNN~�'p$|M��<
���'h�Q^tވ�p��_�ވ�qq]9;@�W�����K*��(�I.�����	� �ε�0��D��Q�{���4�<q�gVvG-��g���Y4����
���'��ϱ��X�6$"�1��D�t5����rw5uݿ�m�h���IEND�B`�PK�X�B�!�!$the_philippine_daily_inquirer.recipeimport time
from calibre.web.feeds.recipes import BasicNewsRecipe


class PhilippineDailyInquirer(BasicNewsRecipe):
    title = 'The Philippine Daily Inquirer'
    custom_title = "The Philippine Daily Inquirer - " + \
        time.strftime('%d %b %Y %I:%M %p')
    __author__ = 'jde'
    __date__ = '03 June 2012'
    __version__ = '1.0'
    description = 'The Philippine Daily Inquirer is a widely read and circulated newspaper.'
    language = 'en_PH'
    publisher = 'The Philippine Daily Inquirer'
    category = 'news, Philippines'
    tags = 'news, Philippines'
    cover_url = 'http://www.inquirer.com.ph/assets/bg/logo.jpg'
    masthead_url = 'http://www.inquirer.com.ph/assets/bg/logo.jpg'
    oldest_article = 1.5  # days
    max_articles_per_feed = 25
    simultaneous_downloads = 20
    publication_type = 'newspaper'
    timefmt = ' [%a, %d %b %Y %I:%M %p]'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = False

    remove_tags_after = [
        dict(name='div', attrs={'id': 'entryMeta'}), dict(name='div', attrs={
            'id': 'taboola-div'}), dict(name='br', attrs={'class': 'clear'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'recent'}), dict(name='div', attrs={'id': 'sharefeature'}), dict(name='div', attrs={'id': 'masthead_bg'}), dict(name='div', attrs={'id': 'navmenu_main'}), dict(name='div', attrs={'id': 'navmenu_channel'}), dict(name='div', attrs={'class': 'breadcrumbs'}), dict(name='div', attrs={'id': 'search_container'}), dict(name='a', attrs={'href': 'http://ruby.inquirer.net/redirect/redirect.php?item_id=1143'}), dict(name='a', attrs={'href': 'http://ruby.inquirer.net/redirect/redirect.php?item_id=1147'})  # noqa
    ]

    conversion_options = {'title': custom_title,
                          'comments': description,
                          'tags': tags,
                          'language': language,
                          'publisher': publisher,
                          'authors': publisher,
                          'smarten_punctuation': True
                          }

    feeds = [

    ('Headlines'      		, 'http://newsinfo.inquirer.net/category/inquirer-headlines/feed'),
    ('Latest Stories'      	, 'http://newsinfo.inquirer.net/category/latest-stories/feed'),
    ('Nation'       		, 'http://newsinfo.inquirer.net/category/nation/feed'),
    ('Nation - Latest Stories'       	, 'http://newsinfo.inquirer.net/category/latest-stories/nation-latest-stories/feed'),
    ('Metro'      		, 'http://newsinfo.inquirer.net/category/metro/feed'),
    ('Metro - Latest Stories'      	, 'http://newsinfo.inquirer.net/category/latest-stories/metro-latest-stories/feed'),
    ('Regions'       		, 'http://newsinfo.inquirer.net/category/regions/feed'),
    ('Regions - Latest Stories'       	, 'http://newsinfo.inquirer.net/category/latest-stories/regions-latest-stories/feed'),
    ('News'      		, 'http://www.inquirer.net/fullfeed'),
    ('More News'      	, 'http://newsinfo.inquirer.net/feed')
        ,
    ('Global Nation'       	, 'http://globalnation.inquirer.net/feed'),
    ('Global Nation - Latest Stories', 'http://globalnation.inquirer.net/category/latest-stories/feed'),
    ('Global Nation - Philippines', 'http://globalnation.inquirer.net/category/news/philippines/feed'),
    ('Global Nation - Asia & Pacific', 'http://globalnation.inquirer.net/category/news/asiaaustralia/feed'),
    ('Global Nation - Americas', 'http://globalnation.inquirer.net/category/news/uscanada/feed'),
    ('Global Nation - Middle East & Africa', 'http://globalnation.inquirer.net/category/news/middle-eastafrica/feed'),
    ('Global Nation - Europe'       	, 'http://globalnation.inquirer.net/category/news/europe/feed'),
    ('Global Nation - Global Pinoy', 'http://globalnation.inquirer.net/category/global-pinoy/feed'),
    ('Global Nation - Events'       	, 'http://globalnation.inquirer.net/category/events/feed'),
    ('Business'     		, 'http://business.inquirer.net/feed'),
    ('Business - Latest Stories'     	, 'http://business.inquirer.net/category/latest-stories/feed'),
    ('Business - Money'     	, 'http://business.inquirer.net/category/money/feed'),
    ('Business - Science & Health', 'http://business.inquirer.net/category/science-and-health/feed'),
    ('Business - Motoring'     	, 'http://business.inquirer.net/category/motoring/feed'),
    ('Business - Property Guide'     	, 'http://business.inquirer.net/category/property-guide/feed'),
    ('Business - Columnists'     	, 'http://business.inquirer.net/category/columnists/feed'),
    ('Sports'          		, 'http://sports.inquirer.net/feed'),
    ('Sports - Latest Stories'          	, 'http://sports.inquirer.net/category/latest-stories/feed'),
    ('Sports - Basketball'          	, 'http://sports.inquirer.net/category/section/basketball/feed'),
    ('Sports - Boxing & MMA', 'http://sports.inquirer.net/category/section/boxing-mma/feed'),
    ('Sports - Golf'          	, 'http://sports.inquirer.net/category/section/golf/feed'),
    ('Sports - Football'          	, 'http://sports.inquirer.net/category/section/other-sports/football/feed'),
    ('Sports - Other Sports'          	, 'http://sports.inquirer.net/category/section/other-sports/feed'),
    ('Technology'           	, 'http://technology.inquirer.net/feed'),
    ('Technology Latest Stories', 'http://technology.inquirer.net/category/latest-stories/feed'),
    ('Entertainment'        	, 'http://entertainment.inquirer.net/feed'),
    ('Entertainment - Headlines', 'http://entertainment.inquirer.net/category/headlines/feed'),
    ('Entertainment - Latest Stories', 'http://entertainment.inquirer.net/category/latest-stories/feed'),
    ('Entertainment - Movies'        	, 'http://movies.inquirer.net/feed'),
    ('Lifestyle'        		, 'http://lifestyle.inquirer.net/feed'),
    ('Lifestyle - Latest Stories', 'http://lifestyle.inquirer.net/category/latest-stories/feed'),
    ('Lifestyle - Arts & Books'        	, 'http://lifestyle.inquirer.net/category/arts-and-books/feed'),
    ('Lifestyle - Wellness'        	, 'http://lifestyle.inquirer.net/category/wellness/feed'),
    ('Lifestyle - Home & Entertaining', 'http://lifestyle.inquirer.net/category/home-and-entertaining/feed'),
    ('Lifestyle - Parenting'        	, 'http://lifestyle.inquirer.net/category/parenting/feed'),
    ('Lifestyle - Food'        	, 'http://lifestyle.inquirer.net/category/food/feed'),
    ('Lifestyle - Fashion & Beauty', 'http://lifestyle.inquirer.net/category/fashion-and-beauty/feed'),
    ('Lifestyle - Super'        	, 'http://lifestyle.inquirer.net/category/super/feed'),
    ('Lifestyle - 2BU'        	, 'http://lifestyle.inquirer.net/category/2bu/feed'),
    ('Lifestyle - Sunday Lifestyle', 'http://lifestyle.inquirer.net/category/sunday-lifestyle/feed'),
    ('Lifestyle - Wedding'        	, 'http://lifestyle.inquirer.net/category/sunday-lifestyle/wedding/feed'),
    ('Lifestyle - Travel'        	, 'http://lifestyle.inquirer.net/category/sunday-lifestyle/travel/feed'),
    ('Lifestyle - Relationship'        	, 'http://lifestyle.inquirer.net/category/sunday-lifestyle/relationship/feed'),
    ('Opinion'        		, 'http://opinion.inquirer.net/feed'),
    ('Opinion - Viewpoints'        	, 'http://opinion.inquirer.net/category/viewpoints/feed'),
    ('Opinion - Talk of the Town', 'http://opinion.inquirer.net/category/inquirer-opinion/talk-of-the-town/feed'),
    ('Editorial'        		, 'http://opinion.inquirer.net/category/editorial/feed'),
    ('Letters to the Editor'      	, 'http://opinion.inquirer.net/category/letters-to-the-editor/feed'),
    ('Columns'        		, 'http://opinion.inquirer.net/category/columns/feed'),
    ('Citizens Journalism'       	, 'http://newsinfo.inquirer.net/category/citizens-journalism/feed'),
    ('Cebu - Daily News'       	, 'http://newsinfo.inquirer.net/category/cdn/feed'),
    ('Cebu - More News'       	, 'http://newsinfo.inquirer.net/category/cdn/cdn-news/feed'),
    ('Cebu - Community'       	, 'http://newsinfo.inquirer.net/category/cdn/cdn-community/feed'),
    ('Cebu - Metro'       	, 'http://newsinfo.inquirer.net/category/cdn/cdn-metro/feed'),
    ('Cebu - Business'       	, 'http://newsinfo.inquirer.net/category/cdn/cdn-enterprise/feed'),
    ('Cebu - Sports'       	, 'http://newsinfo.inquirer.net/category/cdn/cdn-sports/feed'),
    ('Cebu - Visayas'       	, 'http://newsinfo.inquirer.net/category/cdn/cdn-visayas/feed'),
    ('Cebu - Opinion'       	, 'http://newsinfo.inquirer.net/category/cdn/cdn-opinion/feed')
    ]
PK�X��O�!!the_philippine_star.png�PNG


IHDR  ���IDATxڵV�s�j�B���33<fff��[��P�6�녝8g;|���ʖ��&�p���I
_�P���v���o-bu�[����E����A*Y�r�����w�fmr1��k�Zmtї{a���mq�J�Ļ�v�K��>�?@j7�_�����8'[<3=q�=[,a���c�)�2ڵ�4A`���5��챜�N�A�?-�����*�s�4T'���V������G����Ph�j7��2EA�i��5`���U��͒���40q�����%�6�9	`.�zh�*N���E]���/ͣ
´��������S�U�i}{�^�
+�P"�j��3@��bg��fsg.ϧ2Y�c��%ڲo9�����%�Ex��<p���Ddp+�V��^r�'#�=c��G�u��}��BR�u��(�´�̜Wľ�c�6�(��+�y�Pp�"z"'Y��o��纋��"FO}�<��C�g��YŠ;��X��3���[�<K:������H���qz���+���ɕ&������f�S���s�epy6��9z��"vY�Є����}�[�t�s���M#ʵ_����}�Y�y-�U��ԅY���9>��*�n�|}��\=u&�L��1��i�GҙT��i���[#I���+sI�-�.���;0uv6���9��r�0���I��=�Ais�}?xG��=;��P�G��3��8��J�����x����O��M���St��ppj���?�em��4[
�)��v�zyE��V+@/�nN�u��y���
���=
�ȭv��5��������&�b���ox!���� ޏՋ4��xI��!�>Y����6պU��_Umnp������^N�M����T�@u��<�҉�=�xi��e[M뫕��Fdy��T�N���*�7�'K{�=���z��@�}�}��W��P2�$�tu�p~�uO�_%´�����N������d��
є���6��j�O��Z��x��0��d�`��RNr���(E"�^�����l��\��93�.�1�}Q��2��M.N'��>���l���)grc4!�t_I�R(ȕU:�p�����m��
%�]��îwh�eQ]��,����+��IF$�K�m�HDh�dU��ٻ��¯�N�>(�2�
�^<�	�A���7*;)�@��"#PC�_!ޡ^��P�P�ZU�X3.>�t�}���RX֚����?���������ގ�rcR)r�Ln\�~����,+��1T/�u���d9��)�
�ҿk����k�&��|�[�ӿC'al4���"g?!>7b��d6�6���1E��]�R�GYg��F,��T#��
� 4�M��i�:>õ�i��֮C)a]�V^m6�A�žM(�E���ɫi&�k���pe�4��GQ�t>w�w����1W,^F���0����G0Hc������}�WvFݯ`�e��?;�]�Մ��{��WG~4x�wb0�/��P�>���m�me��U���7��"?��R٩��Y[[�g��4/n,f�Ӊ��8�����Պ�h���?V�����7��P�����_�7U[7V[(q�g��#I׍��)<‘J�� ��ݢ�s�fX8�ƋsŞY���o�)m_�-GZm����
6�
���Xq3\vbIEND�B`�PK�X=l�the_philippine_star.recipe
'''
www.philstar.com
'''

import time
from calibre.web.feeds.recipes import BasicNewsRecipe


class PhilippineStar(BasicNewsRecipe):
    title = 'The Philippine Star'
    custom_title = "The Philippine Star - " + \
        time.strftime('%d %b %Y %I:%M %p')
    __author__ = 'jde'
    __date__ = '31 May 2012'
    __version__ = '1.0'
    description = 'The Philippine Star is a daily English-language broadsheet newspaper based in Manila. It has the most subscribers of any newspaper in the Philippines - philstar.com is a Philippine news and entertainment portal for the Filipino global community.   It is the online presence of the STAR Group of Publications, a leading publisher of newspapers and magazines in the Philippines.'  # noqa
    language = 'en_PH'
    publisher = 'The Philippine STAR'
    category = 'news, Philippines'
    tags = 'news, Philippines'
    cover_url = 'http://www.philstar.com/images/philstar-logo-white.jpg'
    masthead_url = 'http://www.philstar.com/images/philstar-logo-white.jpg'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    simultaneous_downloads = 20
    publication_type = 'newspaper'
    timefmt = ' [%a, %d %b %Y %I:%M %p]'
    no_stylesheets = True
    use_embedded_content = False
    encoding = None
    recursions = 0
    needs_subscription = False
    remove_javascript = True
    remove_empty_feeds = True
    auto_cleanup = False

    remove_tags = [dict(name='img',  attrs={'id': 'Image1'})  # Logo
                   # Section (Headlines, Nation, Metro, ...)
                   # Comments
                   # View Comments
                   # Zoom
                   , dict(name='span', attrs={'id': 'ControlArticle1_LabelHeader'}), dict(name='a',      attrs={'id': 'ControlArticle1_FormView1_hlComments'}), dict(name='img',  attrs={'src': 'images/post-comments.jpg'}), dict(name='a',      attrs={'id': 'ControlArticle1_FormView1_ControlPhotoAndCaption1_hlImageCaption'})  # noqa
                   ]
    conversion_options = {'title': custom_title,
                          'comments': description,
                          'tags': tags,
                          'language': language,
                          'publisher': publisher,
                          'authors': publisher,
                          'smarten_punctuation': True
                          }

    feeds = [

    ('Headlines'      		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=63'),
    ('Breaking News'       	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=200'),
    ('News Feature'     	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=68'),
    ('Nation'          		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=67'),
    ('Metro'            		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=65'),
    ('Business'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=66'),
    ('Sports'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=69'),
    ('Entertainment'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=70'),
    ('Science & Technology'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=75'),
    ('Networks'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=71'),
    ('Business as Usual'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=78'),
    ('Banking'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=74'),
    ('Motoring'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=72'),
    ('Real Estate'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=76'),
    ('Telecoms'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=73'),
    ('Agriculture'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=77'),
    ('Arts & Culture'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=79'),
    ('Food & Leisure'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=81'),
    ('Health & Family'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=80'),
    ('Education & Home'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=442'),
    ('Travel & Tourism'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=87'),
    ('Newsmakers'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=88'),
    ('Business Life'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=82'),
    ('Fashion & Beauty'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=83'),
    ('For Men'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=446'),
    ('Gadgets'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=449'),
    ('Sunday Life'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=86'),
    ('Supreme'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=448'),
    ('Opinion'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=64'),
    ('Letters to the Editor'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=135'),
    ('Starweek Magazine'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=90'),
    ('Modern Living'        	, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=85'),
    ('YStyle'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=451'),
    ('Allure'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=89'),
    ('Weather'        		, 'http://rss.philstar.com/Rss.aspx?publicationSubCategoryId=116')
    ]

# process the printer friendly version of article
    def print_version(self, url):
        return url.replace('/Article', '/ArticlePrinterFriendly')

# obtain title from printer friendly version of article; avoiding
# add_toc_thumbnail changing title when article has image
    def populate_article_metadata(self, article, soup, first):
        article.title = soup.find(
            'span', {'id': 'ControlArticle1_FormView1_ArticleHeaderLabel'}).contents[0].strip()
PK�XL�ЊCCthe_press_project.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2023, Sotiris Papatheodorou

from calibre.web.feeds.news import BasicNewsRecipe

class ThePressProject(BasicNewsRecipe):
    title = 'ThePressProject'
    __author__ = 'Sotiris Papatheodorou'
    description = (
        'Το ThePressProject είναι ένα ανεξάρτητο μέσο μαζικής ενημέρωσης που '
        'ιδρύθηκε το 2010. Είναι ανεξάρτητο γιατί καταστατικά δεν δέχεται '
        'καμία συναλλαγή με το κράτος, τις τράπεζες και τις πολυεθνικές.'
    )
    language = 'el'
    publication_type = 'newspaper'
    feeds = ['https://thepressproject.gr/feed/atom/']
    encoding = 'utf-8'
    remove_attributes = ['align']
PK�X��%T��the_register.png�PNG


IHDR  �s��IDATH�͕�+DQ�/E)��Y�Ǡ�i��6ba��)�GXHvR�I�)k�H6�A�υIb�H�A�›�{3��7�mλ�߯{�=�\��}���t���J���2�!Qc�UjR�ǽb�����ٮ��,W�i�q�K�Q��&�0�K���M��[�(;n�+�<�9�n�'�3<t��`�Q��+�x*xT�Q<<l�ZW����PH�B8��L&�hIµxPOشP��/��*���")��1��^�LN�@�w˿τW�L���
��5|��x6�S���7v�R�1�4��u`�4i����rdQ�f��i�ztK[J��ʌ����rE�4)�҄9�!��֦q�P	%�JdaȦ�63~.��/A#1��m{��m�2�<P`��G8W��e��i[AK�>,����?|�&�vIwfIEND�B`�PK�XhZ�AAthe_register.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class TheRegister(BasicNewsRecipe):
    title = u'The Register'
    __author__ = 'vgrama'
    language = 'en'

    oldest_article = 1
    max_articles_per_feed = 100
    use_embedded_content = False

    feeds = [(u'Register', u'http://www.theregister.co.uk/headlines.atom')]

    remove_tags = [
        dict(name='div', attrs={'id': 'leader'}),
        dict(name='div', attrs={'id': 'footer'}),
        dict(name='div', attrs={'id': 'masthead'})]

    def print_version(self, url):
        return '%s/print.html' % url
PK�X�P<���the_saturday_paper.png�PNG


IHDR  szz�{IDATx���%p#@��cff&{L�U�U��+ʢ�.ה�m\@&���wa�ݙ��O˻o_�6��+pGp�T�m�@>*ъvԢV<�a��…MH��p$���$I�p�~��ЀmH��"��~�".�Nf��!�M�Y���U8�x!���o�їB4�©H�
D���ԁ؀���Cp8t�+ ���\`�b��;p�C<����B����MX1�GC;`�Ā�H��)����%R���.E{>b��6�^��p@4�ǥx���(�ÛDE/��3�%�/|�IE#�%U���j������ө
N�/����9��TVH��9h���`
�(�gU���9\�
\��}����{g�e�IEND�B`�PK�X��sthe_saturday_paper.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2021, Alistair Francis <alistair@alistair23.me>

from __future__ import absolute_import, division, print_function, unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class SaturdayPaper(BasicNewsRecipe):
    title = 'The Saturday Paper'
    __author__ = 'Alistair Francis'
    description = (
        'The Saturday Paper is a weekly newspaper, dedicated to narrative journalism.'
        ' It offers the biggest names and best writing in news, culture, and analysis, with a particular focus on Australia. ')
    language = 'en_AU'
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'

    keep_only_tags = [
        classes('article-page__content article__text article__image article-page__title article-page__image')
    ]
    remove_tags = [
        classes('social-icons-article-top-container social-icons-article-bottom-container'
                ' article-page__sidebar article-page__social__icons share-wrapper article-footer-container')
    ]

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.thesaturdaypaper.com.au/editions/')
        div = soup.find('div', attrs={'class':'article__image'})
        return div.img['src']

    def parse_index(self):
        feeds = [
            ('News', 'https://www.thesaturdaypaper.com.au/news'),
            ('Opinion', 'https://www.thesaturdaypaper.com.au/opinion'),
            ('Culture', 'https://www.thesaturdaypaper.com.au/culture'),
            ('Life', 'https://www.thesaturdaypaper.com.au/life'),
            ('Food', 'https://www.thesaturdaypaper.com.au/food/latest'),
            ('Puzzles', 'https://www.thesaturdaypaper.com.au/puzzles'),
            ('Sport', 'https://www.thesaturdaypaper.com.au/sport'),
        ]

        articles = []

        for (feed, link) in feeds:
            soup = self.index_to_soup(link)
            news = []

            for a in soup.findAll(**classes('article')):
                title = a.find(class_='article__title')
                title = self.tag_to_string(title)

                url = a.find(class_="article__title_link")
                if url is None:
                    continue
                url = url['href']
                if url.startswith('/'):
                    url = 'https://www.thesaturdaypaper.com.au' + url

                desc = a.find(class_='article__text')
                desc = self.tag_to_string(desc)

                self.log(title, ' at ', url)

                news.append({'title': title, 'url': url, 'description': desc})

            articles.append((feed, news))

        return articles
PK�XL��the_scotsman.png�PNG


IHDR  szz�dIDATx�b*`��Q �`][�0�W׶m۶m[���k۶m۶m�<�{�L�Y��W�3{�B|dAC��������!�rH�X��눋��9�?�
�qQi�[�@��|�+I���ҥ�bŊ��&,oqÐ�F���e˖M�<P�
�N%�v���}�k�1&��T��'��-[�v��E�x�̙զM�������U�`A����"Lؑ��_<�D��y��[����0�'H���Եk�t��Em߱C�O��͛�T�|�ʍ�D<l��U�X1�;wN2d�z�14s�=x�P=z�R�ԩ?~|%K�L�&M҄	���Q�Rxr�ɓ'վc'��T"]�t4h��ݻ��eˆ�l���5d�
6L���.غ{�8�f�,Xh� �-[����g��͚5S�"ET�hQ�^^}��хT�d�п��� O͜5S�ׯ�h��)ڿ�F��cǎ�s�r�nܸ�۷�bŊ��l-!O8�NݹsG3g�4��ƍk�ޥK�\.3��2eR�<y���A��l��0�6ċO	&��Ͽ��Ǐ�u���jժ���ʚ5�'�X�[���˓;��/X�ʕ��x�ޚ~:tXɒ'3�������F�l�!�D|��w�2�ڵKm۶�'��DG�1�/]�t�{��Bš�n.�m�@`$����ٳg���xl�Ly���u��U�}�2eB� ����Ǖ"E��ʍ���p�#N�i��+W�}���Ey��'){���.2u�T,T(�
<��q��0%�l^�T��M�4�R�fMs�Q��N=�M�6���` J"<��Ȁ^X�Ӹ�W�����W��3\�aLF$�>�	�PeQ�Q��
1��`�W;h�&��IEND�B`�PK�X���the_scotsman.recipe__license__ = 'GPL v3'
__copyright__ = '2008 - 2011, Darko Miletic <darko.miletic at gmail.com>'
'''
www.scotsman.com/the-scotsman
'''

from calibre.web.feeds.news import BasicNewsRecipe


class TheScotsman(BasicNewsRecipe):
    title = 'The Scotsman'
    __author__ = 'Darko Miletic'
    description = 'News from Scotland'
    publisher = 'Johnston Publishing Ltd.'
    category = 'news, politics, Scotland, UK'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    language = 'en_GB'
    encoding = 'utf-8'
    publication_type = 'newspaper'
    remove_empty_feeds = True
    masthead_url = 'http://www.scotsman.com/webimage/swts_thescotsman_image_e_7_25526!image/3142543874.png_gen/derivatives/default/3142543874.png'
    extra_css = 'body{font-family: Arial,Helvetica,sans-serif}'

    keep_only_tags = [dict(name='div', attrs={'class': 'article'})]
    remove_attributes = ['lang']

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [
        ('Latest News', 'http://www.scotsman.com/cmlink/1.957140'),
        ('UK', 'http://www.scotsman.com/cmlink/1.957142'),
        ('Scotland', 'http://www.scotsman.com/cmlink/1.957141'),
        ('International', 'http://www.scotsman.com/cmlink/1.957143'),
        ('Politics', 'http://www.scotsman.com/cmlink/1.957044'),
        ('Arts', 'http://www.scotsman.com/cmlink/1.1804825'),
        ('Entertainment', 'http://www.scotsman.com/cmlink/1.957053'),
        ('Sports', 'http://www.scotsman.com/cmlink/1.957151'),
        ('Business', 'http://www.scotsman.com/cmlink/1.957156'),
        ('Features', 'http://www.scotsman.com/cmlink/1.957149'),
        ('Opinion', 'http://www.scotsman.com/cmlink/1.957054')
    ]
PK�X�~�U��the_sun.png�PNG


IHDR  D����PLTE����'+�+.�.2����"�"'�����8;�;=�{|���������������������""�����..������������pr�25�58�������������������=@����@B���������UW�gi�op�++�FF�''��BB���BD���������DD�;=����������������jj����JL����������NP�PR����������RT�""����YZ�Z\������������������\]����__����ce��������fg��������������''������@@������ij�jk�mn����no����'��������rs�������{{�����}~񂃜��IDATxڅ���%1Es�g�m�c۶m۶�xR�:�Ƴ�uwt�
3��'�
�)��P��P�>��hǒ��t:��~R��t��XD����FTzA��T($z;�|M��W��ΉDB��B0�o��/iM-�r'<��1~�Vn���8A�]��P�j�h���)�a`���G�t*�w��߹��.�	��#����0dž�e�O=��D��T\��i
�6��s�f� f����=�!�Y���J$�Kw�d~���!H0bC}k��G~���), ��c�ξ�?K}�ke|0�0s��\��SJ�6<�UǾ��9�)�M�q�_WwW!b1Ն(NP$l�9sf�ɤvd���l����%�v��a���d����[tG$%>
u9���i�>0zl�,3�����8����e\�2s!!��[�f��|Hƺ�����I"&O6Ƹ����輑\Ӓړj^�8�Rք!��8X%���s��;�`����Ij��s]IEND�B`�PK�X͙�0O
O
the_sun.recipeimport random

from calibre import browser
from calibre.web.feeds.recipes import BasicNewsRecipe


class AdvancedUserRecipe1325006965(BasicNewsRecipe):

    title = u'The Sun UK'
    description = 'Articles from The Sun tabloid UK'
    __author__ = 'Dave Asbury'
    # last updated 5/5/13 better cover fetch
    language = 'en_GB'
    oldest_article = 1
    max_articles_per_feed = 15
    remove_empty_feeds = True

    masthead_url = 'http://www.thesun.co.uk/sol/img/global/Sun-logo.gif'
    encoding = 'UTF-8'
    remove_javascript = True
    no_stylesheets = True

    ignore_duplicate_articles = {'title', 'url'}
    compress_news_images = True

    keep_only_tags = [
        dict(name='div', attrs={'class': 'intro'}),
        dict(name='h3'),
        dict(name='div', attrs={'id': 'articlebody'}),

    ]
    remove_tags_after = [dict(id='bodyText')]
    remove_tags = [
        dict(name='li'),
        dict(attrs={'class': 'grid-4 right-hand-column'}),
    ]

    feeds = [
        (u'News', u'http://www.thesun.co.uk/sol/homepage/news/rss'),
        (u'Sport', u'http://www.thesun.co.uk/sol/homepage/sport/rss'),
        (u'Showbiz', u'http://www.thesun.co.uk/sol/homepage/showbiz/rss'),
        (u'Woman', u'http://www.thesun.co.uk/sol/homepage/woman/rss'),
    ]
    # starsons code

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        for feed in feeds:
            for article in feed.articles[:]:
                if 'Try out The Sun' in article.title.upper() or 'Try-out-The-Suns' in article.url:
                    feed.articles.remove(article)
                if 'Web porn harms kids' in article.title.upper() or 'Sun-says-Web-porn' in article.url:
                    feed.articles.remove(article)
        return feeds

    def get_cover_url(self):
        br = browser()
        br.set_handle_redirect(False)
        cover_url = 'http://www.thepaperboy.com/frontpages/current/The_Sun_newspaper_front_page.jpg'

        try:
            br.open_novisit(
                'http://www.thepaperboy.com/frontpages/current/The_Sun_newspaper_front_page.jpg')
        except:
            cover_url = random.choice([
                'http://img.thesun.co.uk/multimedia/archive/00905/errorpage6_677961a_905507a.jpg', 'http://img.thesun.co.uk/multimedia/archive/00905/errorpage7_677962a_905505a.jpg', 'http://img.thesun.co.uk/multimedia/archive/00905/errorpage5_677960a_905512a.jpg', 'http://img.thesun.co.uk/multimedia/archive/00905/errorpage2_677957a_905502a.jpg', 'http://img.thesun.co.uk/multimedia/archive/00905/errorpage3_677958a_905503a.jpg'  # noqa
            ])

        return cover_url
PK�X�_�K``
the_verge.png�PNG


IHDR  szz�'IDATx�bp����k=��E�Զm۶���m�vԎk۶mk�_��A�oy8����UqPEM�~tW�J��"�
:B�q5ȅ�r��}��"��������R�/��pD�;���h���!�
s=NO��0��_?��@Es�	5�#�cp4��Gh��U@9�E�E4���H���]��"8
,\޽����U	�[�x-b�h�5ΙDRb{�)�^����⛢Nzj%��ua��۰H�qY�
LҸn� +�5�٠(�(����@~7�+�?���bb�����ȍ��B�6�5z5��PH��E���f��8!l2Z#o��si��H�	7��H��τ;�㭼�d�C�dl���(�C^���lX(l�1b�a���!���YQ�-�:ĕ�'ᥣ���.���C�sp]�f	۟DRO_Z#��tH�pS`�?ު�
'�c��u�8�*l��|=@i|T4�������
��E|_7O�k�Kl'l���n!�����&��>��V=|�
J�8:��C	|��[�2#6IEND�B`�PK�XX��2��the_verge.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HindustanTimes(BasicNewsRecipe):
    title = u'The Verge'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True
    auto_cleanup_keep = '//div[@class="story-image shadowbox entry-content-asset"]'

    feeds = [
        ('News',
         'http://www.theverge.com/rss/index.xml'),
    ]
PK�X��|
	
	the_week.png�PNG


IHDR  ��	pHYs��~��IDAT�ˏ\W^����soݪ�~��J�n�y�	N2@$�i@�,fP�b4,�`lزb1b�P$F 4"�f�$�IF��۱��U���U�q��H4�jT"X�HLd���,�&�j����Z�X�D��6&I$�:ĺ��K��6�,Fʊ2�Q�j���0 %	D0�T���� jR���	F%����h�"P�d��P  `"T!1j�8�Y�����zu`ɩ%l´�ڊ!�1�!x b4i�d�Ij\�TR��yC@5�F΀�J(���X��:���k�2�1����w�G���4�����z�v����ʊ'�|~_���A��F
(�F-�����C���s��tYj�DZ���2�Q�v�i_��߾V���̳}SD� b,��(\Ap�Y��Ԙ@5�g�vl;��URi�H[K&�ph�N��K�k/��Hoo�?�L�P����)SWHbqTX��x�zb�N+�դM����5�gL��vǴ�F[�������X�D�b4Z� �[H��h$�Z%B�$����$/dQX\��)�C:m��T'�6��U�5�x4"F���L�xԛ ��%B�e2E)��4+-YP�2AP�d�1-m[��}4"(���G�8cA	h���|b�&m�D�[��,4}�1Yv�t���mq�Φ���sI*V�����<���*��NSۤ&�:�G��]�OȜt�v���]�(*�/��Q�u�ƭ���$��P��1^I;�4F��Q��';���dc-y�K���a��wf�|R����؆q����:'�q^�����L�
?'��\�5@k9��>�';�̓��9?�cL}(=�!��& x)�:ض��~�j��V��s#E���U]��V�2��.�QkV����T�7�z�c���C�`h��E����@��bG��`�B�$���pK��׮�;��U恲�͗d������?���=�ohd7*���V�w)uz�U����͆�����ɟ���?}ОV��Jqu�wx;�6׾�Ҟ<�[=�����_�݆/}�q���ƍ����|������">z���X��_�gΆ�B�|��D��@���+7�[7�
�	�WM���Mmx�27/�޴�߻|���4�7�b^�e�K9{��U����M�݅󓣮��+��Sb���K	�l�����,)N'�jV<��������?��Y�·�������_˾�n��M�#��5}���~�C}���;���¥���	���Z���sL�C]��`�f����Y�\53���Ϟ�y�|��K����c�����s�L����k�p��F�qMP;8����t2����_j/4��ݛ�_��z7�r���*R�������_[�~ŲT�b���>��k-A\(��3�e��j��?>�Z�+�6�<|X�{=�,.�go�+��B�t'��U_�Z߾hYHFƀ����v�H��Z1=�0�ܯNf����t�o������i��?~�4�mvL�͝�γ*�u�]�٣'���P����,׻
5R���f�=�M2�{O�/v���צG���fk![=��I���ɝ��x��nӵ���;��^U+�
���|����P�:p�u�h��?
���m؍?�Kw�{0�z֍�H��h����{��OCj��hȣa���N��G?���'�����sg���MoPq�t�ef��&y0��l����/��~Þ��p�Z��x����������QXK����/ǥ����u �Oes����h;%�|-촚����GG�7_���w[��{x�w4���.�{k����_�$�e�����W�͸�g&��w��؈z����������x�mwg��x���'ǵMSX�O��I�`o���r��c�"?y����l��;��x��
;�����;��?f-�J�W���z����L��vC2Wl�|�$�l�����VU�[夙_<����ƴ�7�*�n�0޸$i��:��ͺ.���0`	�C
FhZI�V�C
hCJ���B�6�@��)8-���@��Z�HS��H�œ"&hrp`-8��y$EB4��&�`�S�*	Y�b3���s�
,V�Q��̴�������R�	�r��4�����F�7��|fՔ��$���<
:��5IEND�B`�PK�X܎�the_week.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime


class TheWeek(BasicNewsRecipe):
    title = u'The Week'
    description = (
        'The Week is the best selling general interest English news magazine. The magazine covers politics, entertainment,'
        ' social issues, trends, technology, lifestyle and everything else you should be knowing. Best downloaded on Mondays.')
    language = 'en_IN'
    __author__ = 'unkn0wn'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = False
    ignore_duplicate_articles = {'url', 'title'}
    remove_attributes = ['style', 'height', 'width']
    masthead_url = 'https://www.theweek.in/content/dam/week/logo/The-Week-Logo-Big.png'

    keep_only_tags = [
        dict(
            name='div',
            attrs={
                'class': [
                    'article-title', 'article-image', 'articlecontentbody section',
                    'element11-page-content'
                ]
            }
        ),
    ]

    def get_cover_url(self):
        soup = self.index_to_soup(
            'https://www.magzter.com/IN/Malayala_Manorama/THE_WEEK/Business/'
        )
        for citem in soup.findAll(
            'meta', content=lambda s: s and s.endswith('view/3.jpg')
        ):
            return citem['content']

    def parse_index(self):
        soup = self.index_to_soup('https://www.theweek.in/theweek.html')
        ans = []
        d = datetime.today()

        for a in soup.findAll(
            'a', href=lambda x: x and '/' + d.strftime('%Y') + '/' in x
        ):
            url = a['href']
            title = self.tag_to_string(a).strip()
            if not url or not title:
                continue
            self.log('\t', title)
            self.log('\t\t', url)
            ans.append({'title': title, 'url': url})
        return [('Articles', ans)]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src-web': True}):
            img['src'] = img['data-src-web']
        return soup
PK�X4k�the_week_magazine_free.png�PNG


IHDR(-SiPLTE�������
��������������������㕕������󡥁�������銊����&&&���LLL```QQQuuu������===[[[mmm����+4�%n^pIDAT���I�0����6;���?�1G�֥�x�u�v�)�������
d/P�Ѡ�:N���$�e5:,
}6 L��_w�w�۔�,R��_��D�G�'�w_=��ֆIEND�B`�PK�XbPq��
�
the_week_magazine_free.recipe'''
www.theweek.com
'''
from calibre.web.feeds.news import BasicNewsRecipe, classes
from urllib.parse import quote


class TheWeek(BasicNewsRecipe):
    title = 'The Week'
    __author__ = 'unkn0wn'
    description = (
        'The Week is for readers who want to know what\'s going on in the world, without having to read '
        'several daily newspapers or get wrapped up in the endless news cycle. For every important story, '
        'our editors carefully select commentary from all sides of the debate and artfully stitch them together '
        'into one concise read. By showing you every perspective, we enable you to form your own opinion.'
    )
    language = 'en_US'
    encoding = 'utf-8'
    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['width', 'height', 'style']

    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    resolve_internal_links = True
    simultaneous_downloads = 1
    oldest_article = 7 # days
    web_url = ''

    extra_css = '''
        img {display:block; margin:0 auto;}
        .caption__text--hero, .credit { font-size:small; text-align:center; }
        .header__strapline, em, i { color:#202020; }
        .article-type__breadcrumb { color:grey; }
        .author-byline__author-text {font-size:small; }
    '''

    def get_cover_url(self):
        import json
        url = 'https://usmagazine.theweek.com/timelines.json'
        data = json.loads(self.index_to_soup(url, raw=True))
        for x in data['timelines'][:5]:
            if '-cover-' in x['image']:
                return 'https://usmagazine.theweek.com' + x['image'][1:]

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        soup = self.index_to_soup(url)
        link = soup.a['href']
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/multimedia/',
        ]
        if any(x in link for x in skip_sections):
            self.abort_article('skipping video links ', link)
        self.web_url = link
        html = br.open(link).read()
        return ({ 'data': html, 'url': link })

    keep_only_tags = [
        classes('article-type__breadcrumb header__title header__strapline image image--hero author-byline__author-text article__body')
    ]

    remove_tags = [
        dict(name='aside'),
        classes(
            'blueconic-article__wrapper ad-unit van_vid_carousel tag-links'
        )
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-pin-media':True}):
            img['src'] = img['data-pin-media'].replace('.jpg', '-768-80.jpg')
        return soup

    feeds = []
    when = oldest_article*24
    index = 'https://theweek.com/'   
    sections = [
        'politics', 'news', 'cartoons', 'tech', 'science', 'health', 
        'culture-life', 'business', 'travel', 'arts-life', 'history'
    ]
    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:{}h+allinurl:{}&hl=en-IN&gl=US&ceid=US:en'
        feeds.append((sec.capitalize(), a.format(when, quote(index + sec, safe=''))))
    feeds.append(('Others', a.format(when, quote(index, safe=''), '')))

    def populate_article_metadata(self, article, soup, first):
        article.title = article.title.replace(' - The Week', '')
        desc = soup.find(**classes('header__strapline'))
        if desc:
            article.summary = self.tag_to_string(desc)
            article.text_summary = article.summary
        article.url = self.web_url
PK�X4k�the_week_uk.png�PNG


IHDR(-SiPLTE�������
��������������������㕕������󡥁�������銊����&&&���LLL```QQQuuu������===[[[mmm����+4�%n^pIDAT���I�0����6;���?�1G�֥�x�u�v�)�������
d/P�Ѡ�:N���$�e5:,
}6 L��_w�w�۔�,R��_��D�G�'�w_=��ֆIEND�B`�PK�X�!|�
�
the_week_uk.recipe'''
www.theweek.com
'''
from calibre.web.feeds.news import BasicNewsRecipe, classes
from urllib.parse import quote


class TheWeek(BasicNewsRecipe):
    title = 'The Week'
    __author__ = 'unkn0wn'
    description = (
        'The Week is for readers who want to know what\'s going on in the world, without having to read '
        'several daily newspapers or get wrapped up in the endless news cycle. For every important story, '
        'our editors carefully select commentary from all sides of the debate and artfully stitch them together '
        'into one concise read. By showing you every perspective, we enable you to form your own opinion.'
    )
    language = 'en_UK'
    encoding = 'utf-8'
    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['width', 'height', 'style']

    ignore_duplicate_articles = {'title', 'url'}
    remove_empty_feeds = True
    resolve_internal_links = True
    simultaneous_downloads = 1
    oldest_article = 7 # days
    web_url = ''

    extra_css = '''
        img {display:block; margin:0 auto;}
        .caption__text--hero, .credit { font-size:small; text-align:center; }
        .header__strapline, em, i { color:#202020; }
        .article-type__breadcrumb { color:grey; }
        .author-byline__author-text {font-size:small; }
    '''

    def get_cover_url(self):
        import json
        url = 'https://ukmagazine.theweek.com/timelines.json'
        data = json.loads(self.index_to_soup(url, raw=True))
        for x in data['timelines'][:5]:
            if '-cover-' in x['image']:
                return 'https://ukmagazine.theweek.com' + x['image'][1:]

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        soup = self.index_to_soup(url)
        link = soup.a['href']
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/multimedia/',
        ]
        if any(x in link for x in skip_sections):
            self.abort_article('skipping video links ', link)
        self.web_url = link
        html = br.open(link).read()
        return ({ 'data': html, 'url': link })

    keep_only_tags = [
        classes('article-type__breadcrumb header__title header__strapline image image--hero author-byline__author-text article__body')
    ]

    remove_tags = [
        dict(name='aside'),
        classes(
            'blueconic-article__wrapper ad-unit van_vid_carousel tag-links'
        )
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-pin-media':True}):
            img['src'] = img['data-pin-media'].replace('.jpg', '-768-80.jpg')
        return soup

    feeds = []
    when = oldest_article*24
    index = 'https://theweek.com/'   
    sections = [
        'politics', 'news', 'cartoons', 'tech', 'science', 'health', 
        'culture-life', 'business', 'travel', 'arts-life', 'history'
    ]
    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:{}h+allinurl:{}&hl=en-IN&gl=US&ceid=US:en'
        feeds.append((sec.capitalize(), a.format(when, quote(index + sec, safe=''))))
    feeds.append(('Others', a.format(when, quote(index, safe=''), '')))

    def populate_article_metadata(self, article, soup, first):
        article.title = article.title.replace(' - The Week', '')
        desc = soup.find(**classes('header__strapline'))
        if desc:
            article.summary = self.tag_to_string(desc)
            article.text_summary = article.summary
        article.url = self.web_url
PK�X
#ddthe_wire.png�PNG


IHDR(-S�PLTE�����KK�ن��##�;;�%%�ii�??�""�ᡡܑ�䫫㧧�))���ڌ��cc������宮䩩���ׁ����ׂ��**�((�**�22ޖ������WW䪪��::�hh꽽寯�11�{{�CC�uuߙ�ߚ��}}뿿ݕ��ZZ�PP�rr�BB�00�2�3nIDATxڭMCC1�������+ص�<s�2#����Ml;�㬔�z��a��$]o����t�,�z��.V�n?��"	e������\����m��[�ߌ�1�|��ܶˈH�����aEIEND�B`�PK�X��92��the_wire.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from calibre.ptempfile import PersistentTemporaryFile

class TheWire(BasicNewsRecipe):
    title = 'The Wire'
    __author__ = 'unkn0wn'
    description = 'The Wire is an Indian nonprofit news and opinion website'
    language = 'en_IN'
    masthead_url = 'https://cdn.thewire.in/wp-content/uploads/thewire-app-images/wire-logo.svg'

    no_stylesheets = True
    remove_javascript = True

    keep_only_tags = [
        classes(
            'title shortDesc author__name featured-image postComplete__description'
            ' post-content-container thb-article-featured-image post-title '
            'sharing-counts-off post-bottom-meta'
        )
    ]

    ignore_duplicate_articles = {'title'}
    resolve_internal_links  = True
    remove_empty_feeds = True

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/', 'podcast-'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = []

    sections = [
        'government', 'politics', 'law', 'business', 'economy', 'education', 'the-sciences',
        'security', 'tech', 'culture', 'environment', 'health', 'travel', 'rights',
        'labour', 'world', 'diplomacy', 'books', 'south-asia', 'caste', 'communalism',
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:thewire.in{}&hl=en-IN&gl=IN&ceid=IN:en'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    feeds.append(('Others', a.format('')))
PK�X`�vN��the_workingham_times.png�PNG


IHDR��h6�IDATx��IkTQ������=�N��H����(��(�n4�������DEpB@p�@�(�����cL��|��{�ϳ������{��iP��F�Ӂ��RH$����
�b�:���+n��z�"����<�������"�L�c*���7�gжb�����nN�˼U�j�3+��:�EqiM����l���ܙh_��9W�-c��fD�O�z��]�]�K3D�V����Y��m6dQd����@����@��6j����_�����ɏy<�K�ί.��=ֽ�3!�|ke�hk"]q��?!	&
��}^8�����N��Lt|��>�ϥ�_	���7��־.�Վ��w�c�[��W'�d��i�Tńݕ��)���G�wx� ���X}�8R5��MG�����9�MG�4]���!���	n�;��X ��L"b��L-$�@�\ ��B8�ERDD-"	�,�C�;?L��Mr4�dp�+�=6����l��`aKOv.�zrC�.��)���j��W	Ƹ'`h�+�U�m�B�y��Y��3�m�)CӋ�j�g~�0R3������oSI�����F��%!P��pI^�,g-�E��Z�y��ڲ����nU]�xֻ���%?L�sA�4�� L�h~��+��:�5��R�)�	���2]���	��?9UA�{	m�IEND�B`�PK�X�|�||the_workingham_times.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.getwokingham.co.uk
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class TheWokinghamTimes(BasicNewsRecipe):
    title = 'The Wokingham Times'
    __author__ = 'Darko Miletic'
    description = 'News from UK'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'The Wokingham Times - S&B media'
    category = 'news, UK, world'
    language = 'en_GB'
    publication_type = 'newsportal'
    extra_css              = """
                                body{ font-family: Arial,sans-serif }
                                img{display: block; margin-bottom: 0.4em}
                             """

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [dict(name='div', attrs={'id': 'article-body'})]
    remove_tags = [
        dict(name='div', attrs={'class': ['ad']}), dict(name=[
            'meta', 'base', 'iframe', 'embed', 'object']), dict(name='span', attrs={'class': 'caption small'})
    ]
    remove_attributes = ['width', 'height', 'lang']

    feeds = [

    ('Home', 'http://www.getwokingham.co.uk/rss.xml'),
    ('News', 'http://www.getwokingham.co.uk/news/rss.xml'),
    ('Entertainment', 'http://www.getwokingham.co.uk/entertainment/rss.xml'),
    ('Lifestyle', 'http://www.getwokingham.co.uk/lifestyle/rss.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll('a'):
            if item.string is not None:
                str = item.string
                item.replaceWith(str)
            else:
                item.name = 'span'
                del item['href']
        return soup
PK�X\֦Xkkthebell.png�PNG


IHDR  D����PLTE@��������������������������������""�''�++���������FF���������==�DD�..����������������;;�������������88����HH�NN�����������RR�����������WW�����\\���]]������������������������Μ^ytRNS.01�������������#IDATxڅ�v�0@]�V2�S�133�<��V��~8�f��l����T��1��R-]ɲ�n(��.���"�,*56�)~�`�9H	�\$��g�n�\R��p}�r]HL	�Hp!�
��m|`���Ksp�C��a�n�hcH	[aB�оq����`*��%5n��#��49@o�x������[��}r�;��n�S!�Ax�K0�{�=0<�;�)�`@o�#u�b��7�T�%���:h���r�
{�j.��M�2�ʊ��H:�r�%/���Pj�,��V02�IEND�B`�PK�XAN�

thebell.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class TheBell(BasicNewsRecipe):
    title = 'The Bell'
    __author__ = 'bugmen00t'
    description = '\u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0438\u0437\u0434\u0430\u043D\u0438\u0435 \u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0439 \u0431\u044E\u043B\u043B\u0435\u0442\u0435\u043D\u044C, \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u0443\u044E\u0449\u0435\u0435\u0441\u044F \u043D\u0430 \u0431\u0438\u0437\u043D\u0435\u0441-\u043D\u043E\u0432\u043E\u0441\u0442\u044F\u0445.'  # noqa
    publisher = '\u0415\u043B\u0438\u0437\u0430\u0432\u0435\u0442\u0430 \u041E\u0441\u0435\u0442\u0438\u043D\u0441\u043A\u0430\u044F, \u0418\u0440\u0438\u043D\u0430 \u041C\u0430\u043B\u043A\u043E\u0432\u0430'  # noqa
    category = 'newspaper'
    cover_url = u'https://thebell.io/wp-content/uploads/2018/03/thebell-cover.png'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 20

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'post'})

    remove_tags = [
        dict(
            name='div', attrs={'class': 'post_bottom ng-tns-c84-1 ng-star-inserted'}
        ),
        dict(name='div', attrs={'class': 'post_tags ng-tns-c84-1 ng-star-inserted'}),
        dict(
            name='div',
            attrs={'class': 'post_subscribe ng-tns-c84-1 ng-star-inserted'}
        ),
        dict(
            name='div',
            attrs={
                'class':
                'author__content_image author__content_image_small ng-star-inserted'
            }
        ),
        dict(name='div', attrs={'class': 'email email_small ng-star-inserted'}),
        dict(name='div', attrs={'class': 'post_share ng-tns-c84-1'}),
        dict(name='div', attrs={'class': 'social_media'})
    ]

    feeds = [('The Bell', 'https://thebell.io/feed')]
PK�X�]�zzthecodelesscode.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿	pHYs��~�tIME�.w�j mIDATHǥ��n[E�����vS#�-.DI
Hi��,��U�	����p�B�"R�J�
������&�Wm��9��MT�qb����w�w&LdQ�I�R�(�RA$��ؼ%7��UU55M�v�u�@��DO*��Bbޗf͸�5u���\�஻}�7"�T"���y��<�H͎TY٢�����>�k}�9��z�W��@�5��XQW�ncB��#�dC��g��%7��uuOl� ��`ߞ Ȥ�Ӓ%˖���O~<����ޠ;� �ȴ�nHe���B����n��ɑ�Y�\u�}����|����\�UuM/�̇�S��SSSW��vp�x��Ҳ��c8��Rɱ�o}d�,p�����iÖ�={#ל��U��P�c{��QY�Rr΢I%��0g�n�R�����G�f�9y\�+;��('*���}my.�,6鼢����2��c�u�E�]][Zj��kw���T�8�H��K?{�8��C:<���>S���x�ā ���ʲ�˃�E�(oJ]�R1�HP0���]��X�p85�k�tŷ�:k�
5���T��sA���P;,�S���$y�5^���E��45�y��g�zg�?6���zf�N%tEXtdate:create2023-06-19T20:44:07+00:00o,�%tEXtdate:modify2023-06-19T20:44:07+00:00C�[IEND�B`�PK�X2�o��thecodelesscode.recipe#!/usr/bin/env python

from datetime import date
from lxml import etree

__copyright__ = '2015, April King <april@twoevils.org>'
__license__ = 'GPL v3'
__version__ = '1.2'

'''
http://www.thecodelesscode.com/
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup as bs


class CodelessCode(BasicNewsRecipe):
    __author__ = 'April King'
    title = u'The Codeless Code'
    category = 'fiction, programming, technology'
    chapters = {}    # ie, Mousetrap -> 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'<h2 class="chapter_title">{0}</h2>'.format(title),
               u'<p>By <em>Qi</em></p>',
               u'<p>An illustrated collection of (sometimes violent) fables concerning the Art and Philosophy of software development, written in the spirit of Zen kōans</p>',  # noqa
               u'<p>eBook conversion courtesy of <em>{0}</em></p>'.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 = '<div class="chapter_title">{0}</div>'.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  <a><b><c></c></b></a>
        # -> <b><c></c></b>
        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 class="image_wrapper"></div>')
                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
PK�X������thecultofghoul.png�PNG


IHDR  D���*PLTE�������Z�ھ���z"�ƞ�r�������r����f�%h�tRNS@��f~IDATxڽ�1Eј?�_��1�A��ܺ���X�5�5`'��̠�bx#� rQ�SUP�5��x`����B�^�x�'A<��}�`~j��?�07�i`��5�$��O&�{8���Z0F!3�IEND�B`�PK�X7nd]]thecultofghoul.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
cultofghoul.blogspot.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class TheCultOfGhoul(BasicNewsRecipe):
    title = 'The Cult of Ghoul'
    __author__ = 'Darko Miletic'
    description = 'Filmski blog'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'sr'
    encoding = 'utf-8'
    no_stylesheets = True
    use_embedded_content = True
    publication_type = 'blog'
    extra_css = ' @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: "Trebuchet MS",Trebuchet,Verdana,sans1,sans-serif} .article_description{font-family: sans1, sans-serif} img{margin-bottom: 0.8em; border: 1px solid #333333; padding: 4px } '  # noqa

    conversion_options = {
        'comment': description, 'tags': 'film, blog, srbija, strava, uzas', 'publisher': 'Dejan Ognjanovic', 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    feeds = [(u'Posts', u'http://cultofghoul.blogspot.com/feeds/posts/default')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X�����thedailywtf.png�PNG


IHDR�a^IDATx�b�
TJ0vQ���ڶݰ6��6�*�mǵm�]۶m���2�0��Fc��5\�b���
�10�C�
[�p�A �V4���ġq�t({�%���<��)���%����}@g<�=1���t�Vޠn��Rqb����P6���Rq.�/�8W�DӲbo��ʟw(�W���AK\��зj��V�l���xTû2�HC:Wo���|e���0c#_�e?�U��.F�vaFא�������&:����T��]54X�l���_XʂL�ğ$���^�R	lUW�^�V�J����z���ssU���YxC��0��Z��ޘYqSG��} IEND�B`�PK�X�r����thedailywtf.recipe__license__ = 'GPL v3'
__copyright__ = 'Jelle van der Waa <jelle@vdwaa.nl>'

from calibre.web.feeds.news import BasicNewsRecipe


class TheDailyWTF(BasicNewsRecipe):

    title = u'The Daily WTF'
    publisher = u'Mark Bowytz'
    __author__ = 'Jelle van der Waa'
    description = 'The Daily WTF is your how-not-to guide for developing software. We recount tales of disastrous development, from project management gone spectacularly bad to inexplicable coding choices.'  # noqa
    category = 'software, programming'
    cover_url = 'http://thedailywtf.com/content/images/wtf-logo.png'
    oldest_article = 7
    max_articles_per_feed = 100
    remove_javascript = True
    no_stylesheets = True
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    keep_only_tags = [dict(name='h1'),
                      dict(name='div', attrs={'class': ['article-body']})]
    feeds = [(u'The Daily WTF', u'http://syndication.thedailywtf.com/TheDailyWtf')]
PK�X�5nnthedgesingapore.png�PNG


IHDR  szz�5IDATxڬ�dQ�okl����%D����4"ZQ2K�Lө&	�
�Mj�b`�0���*غ�(P�
�i��M�$�}.w�|�k���'w�{��{ァ�w�Av��'f���,�#��1��{��~��H��
��%�DBo��9zo�="+�6��:C~��q��4��n��'k5Y�Ì��6�s<a�o���LE��Ԥ��4L�#���?�y"���Q�!�~�r�2�4"
�B��5]cH�6�d�>G�a���
�SE��N��
��g�e�sY���z�$A���_��5a�@q-l��j�R$d��>ۋ9�m�P�hΏ9��eX��@	���LŠx&u�Kⲁ_r?�I����W�#I��̃������{�#t���B�a?
q+Qb%�X��v��;,���''P��Q��ĥ���d���Q�VQ*�[y�04J��2.��U@3�2�Ær��n���
�PH�C�����3�^��e���lˆ��c������P����B{{{�z�Fd��dnc�|��L&��k�Z�YAd�i@����-���`{{�|���X[[���@�?XHϊŢ��]�e������d|�ix{����|�F���t���	9'��|!���\.�����i�R)�d2�������-Dl)65������@�F���,Ȅ1C�R,mF�D̀��FSp�T�J���⢖��ͨ��X�p�JC�M�n�`}}�����ظz�X	kB�w8��+&~$�w<�	�����
!D�#ٿ
t����rR:&���1�k���f�P�ҿ{-��3=)�IEND�B`�PK�XA�R��thedgesingapore.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
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)
PK�X�]�CDDtheecocolapse.png�PNG


IHDR�aIDATx�}��Q�Ễ^�,#γm۶m��g:z�m�V96�ur�1��o��W�P�����-�{�9f00}ִ\�?p�	Cg�^�{��>z�6a����v��y�7�~���5�v�3Q�S�`PH˾��۠����[���^�o�
&�M�F �`~�;逖Cj�J�'��V*?�wE ��C�d�"
����<ߓ��[���N7
�Vgʭձد˓v~aG!��Qp�C�̓��N�� �.�f�V'�G
}tʞL���d�B�m6C�J5$����˭\Q��g��2=״R���\
��o�a��$f.�(��	�R�6��d���s���շӃv|a����dR�X
"<���ψ(�n~�ȝJ��o1�N=��w�Zb�b%6s	��c�7@�Z=8�8�!��G�"��x�G�oq�n^�R07�������1��	"
:�!	��wu+U ��7�b�|����� ��`^]��F`�辽^���c���GqIc1�p6ߞ�7"��ob}zMü�IEND�B`�PK�X��_��theecocolapse.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
theeconomiccollapseblog.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class TheEconomicCollapse(BasicNewsRecipe):
    title = 'The Economic Collapse'
    __author__ = 'Darko Miletic'
    description = 'Are You Prepared For The Coming Economic Collapse And The Next Great Depression?'
    publisher = 'The Economic Collapse'
    category = 'news, politics, USA, economy'
    oldest_article = 7
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    extra_css             = """
                                body{font-family: Tahoma,Arial,sans-serif }
                                img{margin-bottom: 0.4em; display: block;}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(attrs={'class': 'sociable'}), dict(
            name=['iframe', 'object', 'embed', 'meta', 'link', 'base'])
    ]
    remove_attributes = ['lang', 'onclick', 'width', 'height']
    keep_only_tags = [
        dict(name='div', attrs={'class': 'post-headline'}),
        dict(name='div', attrs={
             'class': lambda x: x and 'post-bodycopy' in x.split()})
    ]

    feeds = [(u'Posts', u'http://theeconomiccollapseblog.com/feed')]
PK�X�D����theeconomictimes_india.png�PNG


IHDR���R0PLTE���Ժ�ʳ��ö����������������kqz^gtQ]nESg8Ia,@[�N6\OIDATx�c ��|��n�o���M�^���`�����"r,P�4�����C�֎�ƎfbIm
�ҕIEND�B`�PK�XO���
�
theeconomictimes_india.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2014, Karthik <hashkendistro@gmail.com>, Darko Miletic <darko.miletic at gmail.com>'
'''
economictimes.indiatimes.com
'''


from calibre.web.feeds.news import BasicNewsRecipe, classes


class TheEconomicTimes(BasicNewsRecipe):
    title = 'The Economic Times India'
    __author__ = 'Karthik, Darko Miletic'
    description = 'Financial news from India'
    publisher = 'economictimes.indiatimes.com'
    category = 'news, finances, politics, India'
    oldest_article = 1
    max_articles_per_feed = 50
    no_stylesheets = True
    use_embedded_content = False
    simultaneous_downloads = 1
    encoding = 'utf-8'
    language = 'en_IN'
    remove_attributes = ['style', 'height', 'width']
    publication_type = 'newspaper'
    masthead_url = 'http://economictimes.indiatimes.com/photo/2676871.cms'
    ignore_duplicate_articles = {'title', 'url'}
    extra_css = '.summary {font-weight:normal; font-size:normal; }'

    keep_only_tags = [
        dict(name='h1'),
        classes('artByline artSyn artImg artText publisher publish_on slideshowPackage'),
    ]
    remove_tags = [
        classes(
            'story_title storyCollection shareBar sr_widget_free jsSrWidgetFree srwidgetfree_3'
            ' sr_paid jsSrWidgetPaid ar_wrp arwd_ld_chk adBox custom_ad mgid orn_free_r bold'
        ),
    ]

    feeds = [(u'Top Stories', u'http://economictimes.indiatimes.com/rssfeedstopstories.cms'),
             (u'News', u'http://economictimes.indiatimes.com/News/rssfeeds/1715249553.cms'),
             (u'Market', u'http://economictimes.indiatimes.com/Markets/markets/rssfeeds/1977021501.cms'),
             (u'Personal Finance',
              u'http://economictimes.indiatimes.com/rssfeeds/837555174.cms'),
             (u'Infotech', u'http://economictimes.indiatimes.com/Infotech/rssfeeds/13357270.cms'),
             (u'Job', u'http://economictimes.indiatimes.com/Infotech/rssfeeds/107115.cms'),
             (u'Opinion', u'http://economictimes.indiatimes.com/opinion/opinionshome/rssfeeds/897228639.cms'),
             (u'Features', u'http://economictimes.indiatimes.com/Features/etfeatures/rssfeeds/1466318837.cms'),
             (u'Environment',
              u'http://economictimes.indiatimes.com/rssfeeds/2647163.cms'),
             (u'NRI', u'http://economictimes.indiatimes.com/rssfeeds/7771250.cms')
             ]

    def preprocess_html(self, soup):
        for image in soup.findAll('img', attrs={'src': True}):
            image['src'] = image['src'].replace("width-300", "width-640")
        for img in soup.findAll('img', attrs={'data-original': True}):
            img['src'] = img['data-original'].replace('photo', 'thumb').replace('quality-100', 'quality-100,width-600,resizemode-4')
        return soup
PK�XR'�<XX(theeconomictimes_india_print_edition.png�PNG


IHDR  D���CPLTE�����.�";�'=�+@����5�5�8�'�+��.B�2D�2�';�2�+@�'=�"��'�=L�BP�P\捒���������"=�LY�FT�"�R]�\f�]g�cm�go�ip抐�揔頤�8�BR����������"8�HU����������JU�2@�NZ�"8�+8�TZ�ir�mp攘�JW�U`�YZ�T_�U`�Ub�Wb�Wc�Yc�Ze�.�.D�]i�_i�bk�jk�`k�2B�eo�fn��gp�5F�5H�8H�js�kt�mt�nu�nv�ov�ow�pw�px�rz�t{�t|�u}�v~�w{�z~�{��z��|��}�ぇ䅌䎑剏吒吔啗�8J�;J掓��@L旛猒瑗疛癞皟薜藜蜠蜡蠤靡鞣韣�.ꠤꥪꦪ뤪뭰벳쫯쳶����︼ﺼ�����������������������������������������������������;L�=L������@N�""����DN�DT�5�������+;�+=����������"2�WYh�z��IDATx�����0�_�c��Z۶m۶m۶qi{��ߝ�n����H����~K��v1�Q.���Ҁ:
SJ�NK�֊0<x�`3	��/^ث(�Γw�޼q�r��;^~�hv%w-n�l�Ha�	Ѱ��6�A����#w���m:˻o��c�ǢAF�l�Jk� Wx꞉N�O�f!q�KZt��ڮ�	O�SML#.�Хhd���%���/�A
<QE7�Gv�.�!��4X����C��X�rˀu�ť�5�E�J�NqY��2�d��=

2 ]Ȋ��j_�7��KM�q�k��Y����m������n/���/��;��=�t?����_�ZxxC�u���FB�Π�U#��=�d��%���떇[VVo=tO�
[�~V�=,lC&MЧl����,��s��8k^Ԓ����#�$N�1��>�tb+dR�d.��ya�G����5l�.w�{IEND�B`�PK�X6���HH+theeconomictimes_india_print_edition.recipe
'''
economictimes.indiatimes.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe, classes


class TheEconomicTimes(BasicNewsRecipe):
    title = 'The Economic Times | Print Edition'
    __author__ = 'unkn0wn'
    description = 'Financial news from India.'
    publisher = 'economictimes.indiatimes.com'
    category = 'news, finances, politics, India'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en_IN'
    remove_attributes = ['style', 'height', 'width']
    publication_type = 'newspaper'
    masthead_url = 'https://upload.wikimedia.org/wikipedia/commons/9/98/The_Economic_Times_logo.svg'
    ignore_duplicate_articles = {'title', 'url'}
    extra_css = '''
        .artByline {font-size:small;}
        .artImg, .imgBox {font-size:small; color:#202020; text-align:center;}
        img {display:block; margin:0 auto;}
    '''

    def get_cover_url(self):
        from datetime import date
        yr = str(date.today().year)
        mn = date.today().strftime('%m')
        dy = date.today().strftime('%d')
        cover = 'https://asset.harnscloud.com/PublicationData/ET/etbg/'\
         + yr + '/' + mn + '/' + dy + '/Page/' + dy + '_' + mn + '_' + yr + '_001_etbg.jpg'
        self.log('cover_url ', cover)
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover)
        except:
            self.log("\nCover unavailable")
            cover = None
        return cover

    keep_only_tags = [
        dict(name='h1'),
        classes(
            'artByline pageContent'
        ),
    ]
    remove_tags = [
        dict(name='button'),
        classes(
            'story_title storyCollection shareBar sr_widget_free jsSrWidgetFree srwidgetfree_3 showWhatsMsg artSyn'
            ' sr_paid jsSrWidgetPaid ar_wrp arwd_ld_chk adBox custom_ad mgid orn_free_r bold primeSWrapper external_widget'
        ),
    ]

    def parse_index(self):
        self.log(
            '\n***\nif this recipe fails, report it on: '
            'https://www.mobileread.com/forums/forumdisplay.php?f=228\n***\n'
        )
        soup = self.index_to_soup(
            'https://economictimes.indiatimes.com/print_edition.cms'
        )
        date = soup.find(**classes('labelDate'))
        if date:
            self.timefmt = ' [' + self.tag_to_string(date).strip() + ']'
            self.log(self.timefmt)
        ans = self.et_parse_index(soup)
        return ans

    def et_parse_index(self, soup):
        feeds = []
        for section in soup.findAll('div', attrs={'class': 'printBox'}):
            h2 = section.find('h2')
            sec = self.tag_to_string(h2)
            secname = re.sub(r'[0-9]', '', sec)
            self.log(secname)
            articles = []
            for h3 in section.findAll(("h1", "h3", "h4", "h5")):
                span = h3.find(
                    'span',
                    href=lambda x: x and x.startswith('https://economictimes.indiatimes.com/epaper/'),
                    attrs={'class': 'banner'}
                )
                url = span['href']
                title = self.tag_to_string(span)
                div = h3.find_next_sibling('div', attrs={'class': 'dsc'})
                if div is not None:
                    desc = self.tag_to_string(div)
                articles.append({'title': title, 'url': url, 'description': desc})
                self.log('\t', title)
                self.log('\t', desc)
                self.log('\t\t', url)
            if articles:
                feeds.append((secname, articles))
        return feeds

    def preprocess_html(self, soup):
        for image in soup.findAll('img', attrs={'src': True}):
            image['src'] = image['src'].replace("width-300", "width-640")
        for img in soup.findAll('img', attrs={'data-original': True}):
            img['src'] = img['data-original']
        return soup
PK�X#�ᚅ�theindiaforum.png�PNG


IHDR0&�S�3+PLTE��إ�ש�٨�ؤ�֧������٣�����������ܦ�ס����棿֨�ٮ�ۮ�۞�ө�١�բ�ի�ڪ�ڡ�������������Y�����������������Q���碽լ����飾֥�֮��U�T���ݫ�����S���������^��K���ٰ�ܵ��B~�V�<~��٨�׭�ۦ��l��G�'h���B�B���ݤ�׫����堼ԟ�Թ�ឺ�x�ð�����v�����u��]��A����/m����G����������������I}���ޱ�ݰ�ݬ�۱�ܳ�ݢ�ԛ��B�]���հ��c��������b�U����<{�O�r���������٬�گ�۱�ݲ�ݶ�����������������n����͂��|�Ī�ڭ��Y�R�I�]�i��I�P����T����[�n��A���԰�ܹ��	\�N�e����ۉ��C�D����L����J��W�����M����U����ל��[�L���ب�ج�ڥ��K~����2n� �tRNS@��fIDATx^��ӯ�P@��c]۶9�m۶m۶�?o�O3�7��>݇�d~O_����v7�MK����YX�&=��-ė�N�S %lM�Y~̘x4UU="	���ZtЭG������4sP>`�T#�%�b:x=r�pԯ֭��`#M�@S�f�۶Î���`?G�|C7�����ү������2������aeu4�l5EWe�>�qY�4&(R�DL��S�M��<��+�
L��/0K�G�&[��\�"���V�~p5a	URU-�0�
���
W{K���Zk@�~(W�Z�s��R��D��-�9򓜟ϢDpe��%�kR5x�a�p�И��y�t7{Ԍ��H���r��!�J r8R|h
k5��8	�:��6]�D��˒��s�/�s��:���qW��õ�ܼ�_v�����r��}�{���x �x���S\t� &�S<2��K��k\�Y�t��>������p�bx>�}��@�7�3��t��v��O�i��c-T%���IEND�B`�PK�X���ctheindiaforum.recipefrom calibre.web.feeds.news import BasicNewsRecipe, classes
from datetime import datetime, timezone, timedelta
from calibre.utils.date import parse_date

class mains(BasicNewsRecipe):
    title = 'The India Forum'
    __author__ = 'unkn0wn'
    description = (
        'The India Forum is an independent online journal-magazine that seeks to widen and '
        'deepen our conversations on the issues that concern us.'
    )
    language = 'en_IN'
    encoding = 'utf-8'
    ignore_duplicate_articles = {'url'}
    remove_attributes = ['height', 'width', 'style']
    no_stylesheets = True
    resolve_internal_links = True
    remove_empty_feeds = True
    use_embedded_content = False
    oldest_article = 30  # days
    masthead_url = 'https://www.theindiaforum.in/themes/the_india_forum/images/tif_logo.png'

    keep_only_tags = [
        classes('article-lead-container block-views-blockarticle-block-1'),
        dict(name='section', attrs={'id':'article-author-top-container'}),
        classes('block-field-blocknodearticlebody block-field-blocknodearticlefield-references')
    ]

    def parse_index(self):
        soup = self.index_to_soup('https://www.theindiaforum.in/')
        ul = soup.find('ul', attrs={'class':'float-left'})

        section_list = []

        for x in ul.findAll('a', href=True):
            if '/podcast' in x['href']:
                continue
            section_list.append(
                (self.tag_to_string(x).strip().replace('■','■ '), 'https://www.theindiaforum.in' + x['href'])
            )

        feeds = []

        for section in section_list:
            section_title = section[0]
            section_url = section[1]
            self.log(section_title, section_url)
            soup = self.index_to_soup(section_url)
            articles = self.articles_from_soup(soup)
            if articles:
                feeds.append((section_title, articles))
        return feeds

    def articles_from_soup(self, soup):
        ans = []
        for art in soup.findAll('div', attrs={'class':lambda x: x and 'views-col' in x.split()}):
            h2 = art.find(['h2', 'h3'])
            url = 'https://www.theindiaforum.in' + h2.a['href']
            title = self.tag_to_string(h2).strip()
            desc = ''
            if summ := art.find(**classes('summary')):
                desc = self.tag_to_string(summ)
                if inline := summ.find(**classes('inline-date')):
                    date = parse_date(self.tag_to_string(inline))
                    today = (datetime.now(timezone.utc)).replace(microsecond=0)
                    if (today - date) > timedelta(self.oldest_article):
                        continue
            self.log('\t', title, '\n\t', desc, '\n\t\t', url)
            ans.append({'title': title, 'url': url, 'description': desc})
        return ans
PK�XWI�e��theluminouslandscape.png�PNG


IHDR(-S�PLTE����������������%��'��'��$��*��"��A��D��P��d��j��t��������������	�������������ܐ�ރ{�5%}V%|P!rQrGjC
e?c;_8W'b8�_E�gM�nO�qP�oR�ua��h��w���������������������ĭ�ͼ�о�������������������⹲�����������������������������ﹹ������������������𐶃y�ZT�M�����������������������������������������������������������������������������������������C*	tRNS@��f�IDATx^e�Ss�P�|Iֶm�[۶m�������x������](
��L,٠��I�^AgWw�=�'�}�'�T�"�҉,.�$�G��BU�zD}̛��E���f��\<^�ѳ��G:�mn`����r�����a����r�V�Z�m=;5��oFq{�=/�%1r3%���Q�������1c�9(���`#d��u�IEND�B`�PK�X�<�]mmtheluminouslandscape.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
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)
PK�X!�bHHthemarketticker.png�PNG


IHDR(-SuPLTE����������""�,,�44�<;�FE�JJ�VU�ZZ�]]�ba�on�wv�����������������������������������������eeՑ�tRNS@��f�IDATxu���@��=�J�Mk��u�%c���)�.�c�9��E:��]	�75�݈;��Q�mD˜�F|V�x>F[�$y��S��th?C���P�X�d�b���7��A4&㘼�I�V��<��K���n�IEND�B`�PK�X����themarketticker.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008, Darko Miletic <darko.miletic at gmail.com>'
'''
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')]
PK�Xv�(SSthemorningpaper.png�PNG


IHDR  ��IDATx��x#y��t�m[�y��E��L��IÆ�m���6��z�ng��z�ŧ�7������37���@�<@���(1�7�"��JK�^��Dȑ#�H��]�>FU9�C���S*��� ����]�@��q���(�-?$��ز���-�91�	>�'j��000�7`	1`�E�g�YU`;[F������{r6щ�988�(�V����ԛV�p[r*䛳�Y�ϡ���Q�ٙ��f!����I��r��'�ew5��T�-*��G�@��n0W��Y�Az�t�e��$���0�랛6mZ�!�g���>hQv�J~[�D�XF[�Gr��K�?�.�7�c����5�}=7���y���oY<'h���MNJ�v8�]^Ao~��@x���kki���a�.Ԏ��[��HT�U/]�=��oǢ��>]5卥����GP	���e�C�:��;:Y5+�"Kj[b�ֳ�6�-~��$�A|����b�x�RVĀQ֥�R�\�R3� cI��3p#~�g�$�>My�A��VV�f�Zr8�a���
nȢ�m��vC]�]�:<��#�.]b�~��ׇ�bZ�Q.�|�\t��9`V�̹�&G{qʅy,���o@�Բ4A�����6�uu�׹�V�5��g���"K��Z^��-�/�D_׈�<VL_߈�N%d�J8���X�U�&L�hv*�� 4ʻԒZ��.d�2s6T��=b�F����T&:$��-�^���p����$�=]�� ���}����j(��c��f!��p��>P�?���dfQ�2�o.
�M
�r3�M���h.^hM�\�&�㣽P��
T�&�M�O��Q#]{r����ߜ:u���g�#9�̢-�ѵN�
��dZVQ=-"{�����ߵg�]�Q���3�7�O��={HpOD9ӱ
3�-3�����/��2LJ��+��k����&�4������$�ea������s	M�}XG�{d���i�����3�-h
We>Y��h>���fc�QP���4B2]3��9<���ʱ�֜=i���i��/]�g���;�v@�l\�n��Q$��(b�,X3��9S��B�v��
�W����{�k�}�q�zÔ��ـu~��u~��0���9�:'/��zyc\��;c��Fh^���	b��_O�H����ߖ�����9�'Nn����m��ДS�N��hln��`�Y�0
���D[���U_YU��F��FIEND�B`�PK�X��:���themorningpaper.recipe#!/usr/bin/env python
# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2017, Darko Miletic <darko.miletic at gmail.com>'
'''
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/')]
PK�Xƪ�iithenewcriterion.png�PNG


IHDR���RPLTE��������Ҋ�ύ��g�߂IDAT[ca�<A"P�R,��
	7HIEND�B`�PK�X�.��xxthenewcriterion.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-
# vi: set fenc=utf-8 ft=python :
# kate: encoding utf-8; syntax python;

__license__ = 'GPL v3'
__copyright__ = '2019, Darko Miletic <darko.miletic at gmail.com>'
'''
www.newcriterion.com
'''

try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode
import re
from mechanize import Request
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile


class TheNewCriterion(BasicNewsRecipe):
    title                = 'The New Criterion'
    __author__           = 'Darko Miletic'
    description          = 'On the front lines of the battle for culture'
    publisher            = 'The Foundation for Cultural Review'
    category             = 'art, politics, USA, world'
    oldest_article       = 40
    no_stylesheets       = True
    encoding             = 'utf8'
    use_embedded_content = False
    language             = 'en'
    remove_empty_feeds   = True
    publication_type     = 'magazine'
    needs_subscription   = 'optional'
    delay                = 1
    simultaneous_downloads = 1
    timeout                = 8
    ignore_duplicate_articles = {'url'}
    articles_are_obfuscated = True
    temp_files              = []
    fetch_retries           = 10
    auto_cleanup         = True
    masthead_url         = 'https://www.newcriterion.com/themes/thenewcriterion/assets/img/horizontal-logo.svg'
    extra_css            = """
        body{font-family: Galliard, serif}
    """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('https://www.newcriterion.com/')
        if self.username is not None and self.password is not None:
            data = urlencode({'login': self.username, 'password': self.password})
            header = {
                'X-OCTOBER-REQUEST-HANDLER': 'onSignin',
                'X-Requested-With': 'XMLHttpRequest',
                'DNT':'1',
                'X-OCTOBER-REQUEST-PARTIALS':'',
                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
            }
            request = Request('https://www.newcriterion.com/', data, header)
            br.open(request)
        return br

    def parse_index(self):
        part = strftime('/issues/%Y/') + str(int(strftime('%m')))
        partf = part + '/'
        currentIssue_url = 'https://www.newcriterion.com' + part
        soup1 = self.index_to_soup(currentIssue_url)
        self.log(currentIssue_url)
        rsr = re.compile('^' + partf + '.+$')
        date = strftime(' %B %Y')
        articles = []
        subset = soup1.find('div', id='main')
        for item in subset.findAll('a', href=True):
            relurl = str(item['href'])
            if rsr.search(relurl):
                title = ''
                description = ''
                if item.find('div'):
                    title = self.tag_to_string(item.div.h1).strip()
                    description = self.tag_to_string(item.div.p)
                else:
                    title = self.tag_to_string(item.h1).strip()
                    description = self.tag_to_string(item.p)
                articles.append({
                    'title': title,
                    'date': date,
                    'url': 'https://www.newcriterion.com' + relurl,
                    'description': description
                })
        return [(self.title, articles)]

    def get_obfuscated_article(self, url):
        result = None
        count = 0
        while (count < self.fetch_retries):
            try:
                response = self.browser.open(url, timeout=self.timeout)
                html = response.read()
                count = self.fetch_retries
                tfile = PersistentTemporaryFile('_fa.html')
                tfile.write(html)
                tfile.close()
                self.temp_files.append(tfile)
                result = tfile.name
            except:
                print("Retrying download...")
            count += 1
        return result
PK�X��/G^^thenews.png�PNG


IHDR  D���PLTE�����ӵ�����iiiEEE&&&"b�IDATxڬ���@BQ������ƭ�xꔋ�s�H�GP*�4]cت���\ ��232�O$g���
�-�����0�?�:�n�/���`��o-���W�oA? �d�MZ�dK���~%�߲�����t��L��۸�3�}l�2�2
�m���s���h2;9@�*7��*�����X�
��՞��rZs��p�(�<2�~@�F��\�u;۹��!@����~a�#�������fy�T
:L��HIEND�B`�PK�X���	
	
thenews.recipefrom 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
PK�XE�w��theoldfoodie.png�PNG


IHDR  D���*PLTE�f�r�z"��Z��r�������ƞ�ھ��������%��tRNS@��fIDATxڽ���0@Q�Q��[Q1�/����	�q-܇v�v<5[�&(�hd$͠@FVU�"�K��\<uY<GVM@�0s@7>��[��{�A�W�֧�U�gѬ�M+X�c����^���&'|��GsM8�UIEND�B`�PK�X`�,��theoldfoodie.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
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')]
PK�X`�.�$�$theoldie.recipe'''
Fetch The Oldie (Online Edition)
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime

class PrivateEyeRecipe(BasicNewsRecipe):
    ##
    # Last Edited:  2023-08-07
    #
    # Remark:   Version 1.0 2023-08-07
    #               Initial version

    title = u'The Oldie (Online Edition)'
    description = ('The Oldie has been dubbed ‘Private Eye for grown-ups’ and is read by intelligent people who are fed'
                   ' up with the formulaic nature of the celebrity-obsessed national press. The Oldie was cooked up in'
                   ' 1992 by Richard Ingrams (who previously co-founded Private Eye in 1961) as a free-thinking,'
                   ' funny magazine, a light-hearted alternative to a press obsessed with youth and celebrity.'
                   ' The editors claim that the Oldie is ageless and timeless, free of retirement advice, crammed'
                   ' with rejuvenating wit, intelligence and delight.')
    publication_type = 'magazine'
    language = 'en_GB'
    encoding = 'utf-8'
    oldest_article = 31
    max_articles_per_feed = 100
    remove_javascript = True
    ignore_duplicate_articles = {'url'}

    __author__ = u'Sophist-UK'
    __copyright__ = '2023, Sophist-UK <sophist-uk@sodalis.co.uk>'

    web_root        = 'https://www.theoldie.co.uk'
    current_issue   = web_root + '/magazine'
    about_pages     = {
        'About Us':         web_root + '/about-us',
        'Our History':      web_root + '/about-us/history',
    }
    masthead_url    = web_root + '/assets/images/theoldie_logo_22.png'
    name = 'Oldie Online'
    series = 'The ' + name
    now = datetime.now().strftime(' %Y-%m')
    title = series + now
    title_sort = name + now + ', The'
    conversion_options = {
        'authors':      'The Oldie',
        'author_sort':  'Oldie, The',
        'series':       series,
        'series_index': 0,
        'title':        title,
        'title_sort':   title_sort,
    }
    cover_suburl = '-front-cover-'

    # Convert relative URLS to absolute ones i.e. /cover to https://theoldie.co.uk/cover
    def abs_url(self, url):
        return self.web_root + url if url.startswith('/') else url

    # Create a correctly formated DICT entry for Calibre parse_index return
    def article_entry(self, title, url, author=None):
        article = {
            'title': title,
            'url': url,
        }
        if author:
            article['author'] = author
        return article

    edition_re = re.compile('(?:-front-cover-)(\d+)-')

    # Identify the cover image and extract the edition# from the url
    def get_cover_url(self):
        soup = self.index_to_soup(self.current_issue)

        for img in soup.findAll('img'):
            src = self.abs_url(img['src'])
            editions = self.edition_re.findall(src)
            if editions:
                try:
                    self.conversion_options.update({'series_index': int(editions[0])})
                    self.log('series-index:', self.conversion_options['series_index'])
                except (TypeError, ValueError):
                    continue
                self.log('cover_url:', src)
                return src
        return None

    # oldie links/headings often contain the author (in one of various formats
    # 1. Title. By author
    #.2. Title by author: subtitle
    # 3. Title: author: subtitle
    title_author_re = re.compile('^(.*?)(?:(?: by )|(?:: ))(.*?): (.*?)$')

    # Separate author from title (where it is specified)
    def title_author(self, head):
        if '. By ' in head:
            return head.rsplit('. By ', 1)
        matches = self.title_author_re.findall(head)
        if matches and len(matches[0]) == 3:
            (title_1, author, title_2) = matches[0]
            title = ': '.join((title_1, title_2))
            return (title, author)
        return (head, None)

    # Return the list of articles from blocks in the content of an index/listing page
    def parse_content(self, soup):
        content_articles = []

        content = soup.find('div', class_='content-wrapper')

        if not content:
            return content_articles

        for article in content.findAll('div', class_='listing-block'):
            for a in article.findAll('a', href=True):
                for h in a.findAll('h3'):
                    (title, author) = self.title_author(h.getText())
                    content_articles.append(self.article_entry(
                        title = title,
                        url = self.abs_url(a.get('href')),
                        author = author,
                    ))
                    break
                else:
                    continue
                break

        return content_articles

    def parse_index(self):
        # The set of pages to be used in the online edition are:
        # 1. The list of articles in the body of the magazine index page
        # 2. The contents / pages linked to by each of the links in the #categories menu
        # 3. The div.only-in-the-magazine contents in the magazine index page
        # 4. The about pages
        # Obviously repeated content is de-duplicated by Calibre

        self.log('masthead_url:', self.masthead_url)
        soup = self.index_to_soup(self.current_issue)

        # 1. The list of articles in the body of the magazine index page
        articles = self.parse_content(soup)

        # 2. The contents / pages linked to by each of the links in the #categories menu
        categories = soup.find('nav', class_='categories')
        for li in categories.findAll('li'):
            a = li.find('a', href=True)
            href = self.abs_url(a.get('href'))
            self.log('Checking page for sub-index:', href)
            content = self.parse_content(self.index_to_soup(href))
            if content:
                self.log('Subpages found:', href, len(content))
                articles.extend(content)
            else:
                (title, author) = self.title_author(a.getText())
                articles.append(self.article_entry(
                    title = title,
                    url = self.abs_url(a.get('href')),
                    author = author,
                ))

        if not articles:
            raise ValueError('The Oldie Online index of pages not found')

        # 3. The div.only-in-the-magazine contents in the magazine index page
        articles.append({
            'title': 'In the full issue…',
            'url': self.current_issue,
        })

        pages = [('In this issue…', articles)]
        self.log('n this issue…', articles)

        # 4. The about pages
        abouts = []
        for (title, url) in self.about_pages.items():
            abouts.append({
                'title': title,
                'url': url,
            })

        if abouts:
            pages.append(('About The Oldie', abouts))
            self.log('About The Oldie', abouts)

        return pages

    def preprocess_html(self, soup):
        for h in soup.findAll('h1'):
            (title, author) = self.title_author(h.getText())
            self.log('Replacing h3 "', h.getText(), '" with "', title, '"')
            h.string = title

        return soup


    # Remove features not wanted and tweak HTML
    preprocess_regexps = [
        # Remove big blank spaces
        (
            re.compile(
                r'<p>\s*<br\/?>\s*</p>',
                re.DOTALL | re.IGNORECASE
            ),
            lambda match: ''
        ),
        # Local fix for paragraph HTML issues join paragraphs that do not end in a full-stop.
        (
            re.compile(
                r'(?<=[^\.\s])\s*</p>\s*<p>',
                re.DOTALL | re.IGNORECASE
            ),
            lambda match: ' ' # space
        ),
    ]

    # We remove vast swathes of HTML which is not part of the articles.
    remove_tags_before =  [
        {'name': 'div', 'class': "container"},
        {'name': 'div', 'class': "content-wrapper"},
        {'name': 'div', 'class': "only-in-the-magazine"},
    ]
    remove_tags_after = [
        {'name': 'div', 'class': "container"},
        {'name': 'div', 'class': "content-wrapper"},
        {'name': 'h2', 'string': "Find out more about The Oldie"},
    ]
    # Remove non-sibling content
    remove_tags = [
        {'name': 'nav', 'class': "categories"},
        {'name': 'div', 'class': "internal-placeholders"},
        {'name': 'div', 'class': "leaderboard"},
        {'name': 'div', 'class': "share"},
        {'name': 'div', 'class': "most-popular"},
        {'name': 'div', 'class': "article-convert"},
        # {'name': 'p', 'class': "article-convert"},
        # {'name': 'p', 'class': "meta"},
        {'name': 'hr'},
        {'name': 'a', 'class': "view-full-screen"},
        {'name': 'div', 'class': "image-counter"},
        {'name': 'h2', 'string': "Find out more about The Oldie"},
        {'name': 'a', 'href': re.compile("^https?:\/\/issuu.com\/")},
        {'name': 'img', 'src': re.compile("\/assets\/images\/icons\/icon-")},
    ]

    # The following extra css is to tweak the formatting of various elements of various article pages.
    extra_css = ' \n '.join([
        'div.image-captions div.caption {text-align: center; font-weight: bold; width:750px;}',
        'p.article-convert {text-align: center;}',
    ])
PK�X�+�?theonion.png�PNG


IHDR(-S3PLTE�A�I�Q$�Y0�a<�iH�qT�ye��x��������������������6�7tRNS@��f}IDATx���0��+��?m��2�~O�m־���y|�o[=������ٵݚ0F���/�52F��r����DZ��n]��EYq�[f<��i񭕵^`֜%��8k�,�hN,IEND�B`�PK�X-�-X��theonion.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2013, Darko Miletic <darko.miletic at gmail.com>'

'''
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
PK�X�ܪ==theonlinephotographer.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
theonlinephotographer.typepad.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class theonlinephotographer(BasicNewsRecipe):
    title = 'The Online Photographer'
    __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 Online Photographer'
    category = 'news, blog, photograph, international'
    oldest_article = 15
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    use_embedded_content = False
    encoding = 'utf8'
    language = 'en'

    extra_css = ' body{font-family: Georgia,"Times New Roman",serif } '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    feeds = [(u'Articles', u'http://feeds.feedburner.com/typepad/ZSjz')]
    remove_tags_before = dict(name='h3', attrs={'class': 'entry-header'})
    remove_tags_after = dict(name='div', attrs={'class': 'entry-footer'})
    remove_tags = [dict(name=['object', 'link', 'iframe'])]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�:L�,,theprint.png�PNG


IHDR  D����PLTEGpL�D�B�B�D�=�A�?�D�D�7�A�B�B�D�@�D�B�B�D�6�B�D�B�<����D�D�F�D�B�D�6�@�:�6�<��<�<�:�B�D�B�@�=�I%ﻫ�8�<�@ ����>�8�B�jL�B$�|�@�>�5	�ſ�J&�0�~hի��f�x��ѭB"�$﹩���3ッ� 驗���թ��4
�÷�<秕ӧ�ѫ������4�2�B�<�^<�lV�zd�xf�B$�hTכ�ٿ��dB���D(�j�<�B￱Ϳ����t^׃j�z^�õ�pV�ɽ����������`>ϩ��0�V>�l�ɿ�Ϳ�bH�~j嗁�4飑�vd�`@���>ձ��2ӭ��T8͵��dF�z`�~d���ٟ�ӱ�͡��$ѿ���Łl�>�rZ�0͛��T0��� ѭ�������闁�(�8����:����@Ëx�p�~b�z\�hVÅrߋpˡ����կ��$�\B����!�zj߱�㗃�J"�<̓lݝ�����~����ý�.ۃh�nZ����|h�^B�H,������٩��@�@�ב|�<�nT�F$�ǻ�x^�*寡י��H&ם��xb�F&�	DtRNS���H��"�������HH"�IN�.IDATx�u���#A�+vƸ��a��m�m۶m۶m�ޗ�x����s��*�B+'%�%q
$�:�H�����p]뒃1Ơ`d	d8X�Dc$�O
��.�?�+�0b_��1��t*�<W�%33��2����n�����y���й���tp�]g�u���^����'B)�W�=�8��۸5��o�H��P %��fffql��9���r_�k�h�qH�,�-.����3��j��n��qɜc/GJ��ٹ�UX�
ؽ�ٗ��.���fg�-+�h1���u��F�)�9����[����Gܶ��[�$$%;�����8��e�u`�W���eл
�2��w�=Ұʯ�@`�|�Ɠb$r���g,t��۠�5v�hhw��5�i����a[`�v��M�te�
o�%Z���CW���L=�:�yg�\8iQ d��g.���w�E����OwW�G��}�̹�`�~`�~�!p|`��1��et�y�G���X*JY`�S����䗡`�aI(-
C���d�	���R�H�����ץh�'�IEND�B`�PK�X�eH��theprint.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals

from collections import defaultdict
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 ThePrint(BasicNewsRecipe):

    title = 'The Print'
    __author__ = 'Kovid Goyal'
    description = 'News and current affairs in India'
    language = 'en_IN'

    no_stylesheets = True
    ignore_duplicate_articles = {'url'}
    remove_attributes = ['style']

    keep_only_tags = [
        classes('td-post-title td-post-content')
    ]

    remove_tags = [
        dict(name='button'),
        classes('fontsize_Btn postBtm'),
    ]

    def parse_index(self):
        soup = self.index_to_soup('https://theprint.in/')
        current_section = 'Unknown'
        ans = defaultdict(list)
        secs = []
        for x in soup.findAll(['h3', 'h4'], attrs={'class': True}):
            cls = x['class']
            if 'td-block-title' in cls:
                current_section = self.tag_to_string(x)
                secs.append(current_section)
                self.log(current_section)
            elif 'entry-title' in cls:
                h3 = x
                title = self.tag_to_string(h3)
                url = h3.find('a')['href']
                desc = ''
                dnode = h3.parent.find(**classes('td-excerpt'))
                if dnode:
                    desc = self.tag_to_string(dnode)
                self.log('\t', title)
                ans[current_section].append({'title': title, 'url': url, 'description': desc})
        ret = []
        for sec in secs:
            if sec in ('On Camera',):
                continue
            arts = ans[sec]
            if arts:
                ret.append((sec, arts))
        return ret
PK�Xَ����thestar.png�PNG


IHDR(-S�PLTET�T�W�Z�\�^�a�b�c�d�e�f�b�g�l�p�q�r�s�t�x�y�"z�(~�.��9��^��r��v��w��x��w��y��y��{�Ж�ڙ�ۛ�ۜ�ܞ�ܞ�ݟ�ݠ�ݠ�ަ�ߨ�����������������������������������������������������;�{�tRNS@��f}IDATx�c ���ed�@Ύ�ACPO����u�jL���98y��]��\�H��I��F�@��I��V�X��I��R�E�
I�^JS��!`+a��ˉ0�B��31Udw�	�)1"��I���/�l/�1���IEND�B`�PK�X���Y		thestar.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2013, Darko Miletic <darko.miletic at gmail.com>'
'''
www.thestar.com
'''

from collections import defaultdict

from calibre.web.feeds.news import BasicNewsRecipe, classes


def absolutize(url):
    if url.startswith('/'):
        url = 'https://www.thestar.com' + url
    return url


class TheTorontoStar(BasicNewsRecipe):
    title = 'The Toronto Star'
    __author__ = 'Darko Miletic'
    description = "Thestar.com is Canada's largest online news site. Stay current with our sports, business entertainment news and more from the Toronto Star and thestar.com"  # noqa
    oldest_article = 2
    language = 'en_CA'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    delay = 2
    publisher = 'The Toronto Star'
    encoding = 'utf-8'

    keep_only_tags = [
        classes('headline asset-summary metaPrimary tsArticleContainer')
    ]
    remove_tags = [
        classes('share-container shareIcons articleFeedbackCTA asset-comments'),
        dict(name='button')
    ]

    def parse_section(self, section):
        for article in section.findAll('article'):
            a = article.find('a', attrs={'class': 'tnt-asset-link', 'href':True, 'aria-label': True})
            if a is not None:
                title = a['aria-label']
                url = absolutize(a['href'])
                desc = ''
                summ = article.find(attrs={'class':'tnt-summary'})
                if summ is not None:
                    desc = self.tag_to_string(summ)
                section = ''
                sec = article.find(attrs={'class':'label-flag-section'})
                if sec is not None:
                    section = self.tag_to_string(sec).strip().lower().capitalize()
                    if section == 'Gta':
                        section = 'GTA'
                    self.log(section + ':', title)
                    yield section, {'title': title, 'url': url, 'description': desc}

    def parse_index(self):
        soup = self.index_to_soup('https://www.thestar.com/')
        ans = defaultdict(list)
        for section in soup.findAll('section', attrs={'class': 'block'}):
            for sec, article in self.parse_section(section):
                ans[sec].append(article)
        return list(ans.items())
PK�XI�e�JJthewest_au.png�PNG


IHDR(-SJPLTE���]�Z�W�`�b�T~Qz���f����5��Y�_�a�d�d�<��B��G��I��O��]��]��b��d��f��h����߶�ߴ�߲�޺��������Nu��������Kq���Im���������Fi���w��x��w��r��l��&s�,t�1w�/x��������������̈��j�n�j��i��d��`��j��k��y�Ā��������������������ӟ�Ρ�Π�ѣ�����ۯ�ٯ�ׯ�մ�ٵ�ڷ�ٸ�ܸ��/{�0~�r�$t�I��C��>��H��#y�(l�
h�
j�;���tRNS@��f�IDATx^e�âCA�}��m�Ƴm��i��YP��9(r��@��K�:��c��}f��P��D{�#���ަ@\����/~�_
*O�A��i��)��gA[;�i-�"��a�����DJЫ�$���٘^ko���!�p����y��N~��:`��K��v!w��6����gD$%dt-IEND�B`�PK�X���m		thewest_au.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
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'</title>.*?</head>', re.DOTALL |
                    re.IGNORECASE), lambda match: '</title></head>')
    ]

    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)
PK�X�u�f��think_progress.png�PNG


IHDR  szz�LIDATx�b��Q0
��cۚs�
@k=�v�a?k����m���6������m۶U�n�~�vg��&O<���s]_Hz��(m��=�3�j��:0	���ǂ�5'�͐����R\�O���EQG�,��+0�
(���?l{�j£�J;�\�:���V�k2�z6�<K��+�� �oٛ�u�t����[�XW����]!�x����t-�l���kq呷z���n�=S��t5 V% "��ȃ��޻��˨t�N9Wh"�>�К�>wky�����Ԑ\���S��Φ��?pBy|s���N9�o@�P�[�ޥO�"�6�y��ԋ����/}i;�����9:�:
�0?���D��k�a鉧�'@|�볜/���	@�"�6C|��|��"����>K�2'0���$�m�|3���ۀ�_��K_��_0\�O���Iϼu�˶[��P��$�L�6(�m�0�3�[�K"��.v<x��u[6�>-FnH���
�0�x�
!&
��P�S�)
�o�pK��!�0-��I(e�\��W$��i��d����sZ�2G�te^#m�w2IEND�B`�PK�Xӧ�9��think_progress.recipefrom 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/')]
PK�X*|��((thn.png�PNG


IHDR  D���?PLTE���������������ꝣ琗珖䁉�t|�s{�Xb�Wa�IT�<H�;G�.;�-:� .N��tRNS 0@P`p�������������IDATx�ݒ� ��
���v���G������||`��U��N���4� �	�8�፡�t�E�2n�����	������OR-��Q=jt��u��#�n<fv�.1\H��i���
ww�IEND�B`�PK�X[w�BB
thn.recipefrom 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')]
PK�X?��00tidbits.png�PNG


IHDR��h6�IDATxڕR�kAݙ���l��I�V���(�H)���
-���K���W�� �ٓA�ԓW���������F��l�;���gk�0�[�|ߛ7�1��; �/7�ui{�i5(�c'%�[�t��z�ݬ�3Ų)��
o�#�n����q�����J��e��ܝ�E�/Mu�_��,�w�wl���Q��$�8I�`0��V*��z��qk�}>o,�"�qE+�
B/�"UU'OWr�\��q6!�,�|^����<��<�y��t�,-����[�~�ټ���F��G��>�f����k5|]w�5\48�p����6#T�ʡg��@U�>9��`�0����P�ޠ�tc`&EJ���M���XU#�:�W?~}G�{z/�X�^��ֿ��N�?vd鍵�W��S�~&8{�X������1JiqT��Rn�-��eijrnQЪT��A�n�׃���B!C�q@��"�0�	`���$Is���Ŕ@\i>��Д&d�AIEND�B`�PK�X���T]]tidbits.recipe
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
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')
    ]
PK�X���A��tijd.png�PNG


IHDR���R!PLTE%O9^'Diky�e{�z��o�Ǚ�ɜ�ظ���౿z�2IDATx�c��V�" �ˀk� ���kC:�ab0���3$W����n��W;ߝ�IEND�B`�PK�Xt1�(
(
tijd.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.tijd.be
'''
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class DeTijd(BasicNewsRecipe):
    title = 'De Tijd'
    __author__ = 'Darko Miletic'
    description = 'News from Belgium in Dutch'
    publisher = 'De Tijd'
    category = 'news, politics, Belgium'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'nl_BE'

    lang = 'nl-BE'
    direction = 'ltr'

    keep_only_tags = [
        dict(name='div', attrs={'id': 'lcol'}), dict(
            name='div', attrs={'class': 'l-main-container-article__asset-container'}
        ), dict(
            name='div',
            attrs={
                'class': 'l-main-container-article__body clearfix highlightable '
            }
        ), dict(
            name='div',
            attrs={'class': 'l-main-container-article__intro highlightable '}
        ), dict(
            name='div', attrs={'class': 'l-main-container-article__sidebar-inline'}
        ), dict(name='div', attrs={'class': 'l-main-container-article__title '})
    ]
    remove_tags = [
        dict(name=['embed', 'object']),
        dict(name='div', attrs={'id': 'art_reactwrap'})
    ]
    remove_tags_after = dict(name='div', attrs={'id': 'art_author'})

    feeds = [(u'Volledig nieuwsaanbod', u'http://www.tijd.be/rss/nieuws.xml'),
             (u'Markten', u'http://www.tijd.be/rss/markten.xml'),
             (u'Ondernemingen', u'http://www.tijd.be/rss/ondernemingen.xml'),
             (u'Chemie-Farma', u'http://www.tijd.be/rss/chemie_farma.xml'),
             (u'Consumptie', u'http://www.tijd.be/rss/consumptie.xml'),
             (u'Diensten', u'http://www.tijd.be/rss/diensten.xml'),
             (u'Energie', u'http://www.tijd.be/rss/energie.xml'),
             (u'Financen', u'http://www.tijd.be/rss/financien.xml'),
             (u'Industrie', u'http://www.tijd.be/rss/industrie.xml'),
             (u'Media', u'http://www.tijd.be/rss/media_telecom.xml'),
             (u'Technologie', u'http://www.tijd.be/rss/technologie.xml'),
             (u'Economie & Financien', u'http://www.tijd.be/rss/economie.xml'),
             (u'Binnenland', u'http://www.tijd.be/rss/binnenland.xml'),
             (u'Buitenland', u'http://www.tijd.be/rss/buitenland.xml'),
             (u'De wijde wereld', u'http://www.tijd.be/rss/cultuur.xml')]

    def preprocess_html(self, soup):
        del soup.body['onload']
        for item in soup.findAll(style=True):
            del item['style']
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction
        mlang = new_tag(
            soup, 'meta', [("http-equiv", "Content-Language"),
                           ("content", self.lang)]
        )
        mcharset = new_tag(
            soup, 'meta', [("http-equiv", "Content-Type"),
                           ("content", "text/html; charset=utf-8")]
        )
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return soup
PK�X�A�%@@tijolaco.png�PNG


IHDR  ��IDATx��wc[����3��m+��x&S���� v�c'E4�U#۩��杷�gc��~g�7.���m[�/m[`[��_
~e�/�_�3���$�'�-��c0D�W��5'��f
�^��5f�XOkPViLƾ�e�R"�Nc��w����71C��JM]�P��˖w���Vj�T������
�Dc�C�hW(�x���<���l6���T����B��ro`,������T�ׅ���YB�(��7T������AE����,�Jt�}�gl
Ơ�B.#��
/�2>.��,,�:�^�a��B���}Z�?��M%����`���La��s� 
;��g�il����!psd��6�k��iͯ�1��g����:�R�q1��B���s��0��J)'�ߒO~\`��E ���\��R+�����'�m��w��(��t�Z|�Vy
c>D$�UB�h	2{�QF�:�R�8�R�l�4��;��'��mV��u�VVR!F;J!!S�Y�B��G�fA�c��I����n�N\�3��Vc�V+��!���&�;�P}��C�1b�ި>\%��7"�~��8�\�/�A���G��-?I��|�����#f�4llf���J�u����~�n{���Z�}{ut4�v{=ss��o{�����.55�jo�k+��ޅ{G��q�n��|��.Z���m6����ݻ��I��j!]ss�D"��={��^��))
iw옺pA���^0���?>��E���[RS�~Z��Ҍ�����b������ҽ�,
zH��pз��.�d6���؊a�rr:0l��I�ʊ9+����(*�`���7gd�Xӗ.i	���Rˁ4Z{jꩬ��{�L�vS��4�!-Ͳwo��v�D�H�������h<ID�P>x��z�r��n�cll��ի
j�c�`��8�
���a��&"�M�b�?2_�����8����P�L]C�F�`�K�����IEND�B`�PK�XO���tijolaco.recipefrom 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'})]
PK�X>1�.00tillsonburg.png�PNG


IHDR  D���SPLTE�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������}~��~|}|{{{zz|z{qoprqqmkkihhkjjigg\YZYWXXUVTRRPMNHEFFCDDABCAAB?@@=>A>><898562/01./2./1./0-.-*+,()+((+'(,')+'),()*&')%&(%%(%&)%&($%'#$&"#&"#%!"$ !%!"$ !# sT;�ptRNS	 "')*+,07=?@ACCDFLNOWWXXYYZ[\^_clnnpppuy{|�����������������������������������������������������IDATxڬ�Cc�`�ቓ�ܭm۶����/���|�y��f6wf��̞�B�dǡ��Idm��5Y���13�i��A� l���"·����	��l�i�4�-�4bⴞ�#���܍h�)[��jϒ^���������U7�w�Q�U��R'c��+71��n��x�1Dlk�e٩�h�׋>Q�S�
���F5s�|�E����K�Ze+8�rh3cp��mn�b�e7a�B�^��.�o��Z�+��t�ߧ%��$����a�UZ�qIEND�B`�PK�X�z
�==tillsonburg.recipefrom calibre.web.feeds.news import BasicNewsRecipe

'''
Tillsonburg/Norfolk County newspapers Calibre Recipe
'''


class TillsonburgNorfolkCounty(BasicNewsRecipe):
    title = u'Tillsonburg/Norfolk County'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True
    __author__ = u'Eric Coolman'
    publisher = u'canoe.ca'
    description = u'Norfolk County and Tillsonburg, Ontario Canada Newspapers'
    category = u'News, Ontario, Canada'
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en_CA'
    encoding = 'utf-8'

    feeds = [
        (u'Simcoe Reformer', u'http://www.simcoereformer.ca/rss/'),
        (u'Delhi News-Record', u'http://www.delhinewsrecord.com/rss/'),
        (u'Tilsonburg News', u'http://www.tillsonburgnews.com/rss/')
    ]
PK�X���v\\time_magazine.png�PNG


IHDR��h6#IDATx�c �'��Se0V7/
�0����-Ӎ�JIEND�B`�PK�X�`��
�
time_magazine.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals
import json
from calibre.constants import iswindows
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile


class TimeMagazine(BasicNewsRecipe):

    title = 'TIME Magazine'
    __author__ = 'Kovid Goyal'
    description = 'Weekly US magazine.'
    language = 'en'
    no_stylesheets = True
    remove_javascript = True

    def parse_index(self):
        root = self.index_to_soup('https://time.com/magazine', as_tree=True)
        for script in root.iterdescendants('script'):
            if script.text and script.text.startswith('Time.bootstrap ='):
                data = json.loads(script.text.partition('=')[2].lstrip())
                break
        else:
            raise ValueError(
                'The TIME website has changed, this recipe needs to be rewritten')
        data = data['magazine']['us'][0]
        self.timefmt = ' [%s]' % data['title'].split('|')[0].strip()
        self.cover_url = data['hero']['src']['large']
        articles = []
        self.turl_map = {}
        for article in data['articles']:
            title = article.get('friendly_title') or article.get('short_title')
            if title == 'In the Latest Issue' or 'content' not in article:
                continue
            url = article['shortlink']
            desc = article.get('excerpt') or ''
            self.log(title, ' at ', url)
            self.log('\t', desc)
            try:
                cover_url = article['hero']['src']['large']
            except Exception:
                cover_url = ''
            authors = ''
            for aut in article.get('authors') or ():
                authors += '<p>' + aut.get('bio') + '</p>'
            articles.append({'title': title, 'url': url, 'desc': desc})
            text = '<html><head><meta charset="utf-8"></head><body><h1>{}</h1>{}<div><img src="{}"></div><div>{}</div></body></html>'.format(
                title, authors, cover_url, article['content'])
            with PersistentTemporaryFile('-time-recipe.html') as f:
                f.write(text.encode('utf-8'))
            name = ('/' if iswindows else '') + f.name
            self.turl_map[url] = 'file://' + name
        return [('Articles', articles)]

    def print_version(self, url):
        return self.turl_map[url]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-lazy-src': True}):
            img['src'] = img['data-lazy-src']
        for img in soup.findAll('img', src=lambda x: not x):
            img.extract()
        return soup
PK�X�.F9��
time_turk.png�PNG


IHDR��h6IIDAT�=�UU�w}�}�=sg�L��D"beb�
�o��'tF���XPPC�@��d�
3��쏵��C����CQ���
�yp�M(�X���.��l������a�\&�ȋ{f��®V!�Q׬��xu�΍��<���Ȓx0/��'K{��_~�t����s��ï��=}s
�?ߺ���'o�����x����~��ߔ�ՃWg���ߧ�_/���Z��^n��_���s�:֓��W�S/-�U��Dmq�Wo��+�ޫ�L!��ͫE��4M�JŅl�v�&�Us2p��7YV[}Z�e���UhM,�d�EEع	���،���m��P�^�-J��h2���L�|��%̃@�@l[`ru2�(���@L�SXcd�3CL�zC�ƉK
���LD-e��XXxfB+.�Պ��vɂ�Y�$%R�$�W瘇Jn �_�t��������w�G�_����uAr�2I�v�yҒ�Zgw~�t��sʾ���������)�%�p�D{?����P��fJC\yÀ��ިP�ʬ�<,U���8�*�hs������&�0�R�YP2HJ�B�~3X�)�,gIEND�B`�PK�X�l;�^^time_turk.recipe# -*- 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/')]
PK�X[ky�vvtimes_of_malta.png�PNG


IHDR  D����PLTEg� "&"#0,-IFG���# ���;78>:<B>?,-|OLMROPWTUxvv������������,)*jhiK�/_\]ebbgde523qoob�z",9�����������*&'�n������������/=%,.��iH{.|yz���~~*)d\YZ�!�����"���))_1K(������G0GbljjJguIly{����qc`aش�PIDATx�����0���Ims�gk��6y�\`���j��
 }-�
�"C!�5X�b��g�Lv9�˹���H�M? Ɯu��C��i��#~�t��~cj�dj�� � 7_�P�������]�H�c����S�O�h���z.����ཕ[<~m۶���u_��&?>���'?��_=۶? �k��&����C�g��^+�>� Gr��j���-�Ux�kzu��Y^M-���
��6a<�FeB��xh�q�$�E=2
%@$��@D�(�&�
�ߑ���	8N�d�SB��H����T�ӗ��z^��"��8���cIEND�B`�PK�X."�HHtimes_of_malta.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class BasicUserRecipe1317069944(BasicNewsRecipe):
    title = u'Times of Malta'
    __author__ = 'To Do'
    language = 'en'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Times of Malta', u'http://www.timesofmalta.com/rss')]
PK�X Vl8��times_online.png�PNG


IHDR���RPLTE������[s.:"+�{g�1IDATx�c����@�`/I/q/1̋AV�b�"��|sx�6�5
��{��IEND�B`�PK�X�n��times_online.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2019, Bobby Steel <bob at xdca.com>, Darko Miletic'
'''
www.thetimes.co.uk
'''
from mechanize import Request
from calibre import random_user_agent
from calibre.web.feeds.news import BasicNewsRecipe

import html5lib
from lxml import html


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(
        attrs={'class': lambda x: x and frozenset(x.split()).intersection(q)})


class TimesOnline(BasicNewsRecipe):
    title = 'The Times & Sunday Times (UK)'
    __author__ = 'Bobby Steel'
    description = 'news from United Kingdom and World'
    language = 'en_GB'
    publisher = 'Times Newspapers Ltd'
    category = 'news, politics, UK'
    excludeSections = ['Puzzles']
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    delay = 1
    needs_subscription = True
    publication_type = 'newspaper'
    INDEX = 'http://www.thetimes.co.uk/'
    LOGIN = 'https://login.thetimes.co.uk/'
    PREFIX = u'http://www.thetimes.co.uk'
    extra_css = """
        .author-name,.authorName{font-style: italic}
        .published-date,.multi-position-photo-text{font-family: Arial,Helvetica,sans-serif;
                                                    font-size: small; color: gray;
                                                    display:block; margin-bottom: 0.5em}
        body{font-family: Georgia,"Times New Roman",Times,serif}
    """

    conversion_options = {
        'comment': description,
        'tags': category,
        'publisher': publisher,
        'language': language}

    def get_cover_url(self):
        from datetime import date
        today = date.today()
        today_index = today.weekday()
        if (today_index == 6):  # Special cover on Sundays
            cover = 'https://cdn2-img.pressreader.com/pressdisplay/docserver/getimage.aspx?file=1163' + today.strftime(
                '%Y') + today.strftime('%m') + today.strftime(
                    '%d') + '00000000001001&page=1&scale=99'
            altcover = 'https://cdn2-img.pressreader.com/pressdisplay/docserver/getimage.aspx?file=1163' + today.strftime(
                '%Y') + today.strftime('%m') + today.strftime(
                    '%d') + '00000051001001&page=1&scale=99'
            # on some days cover is iterated using format here for altcover
        else:  # Mon-Thurs
            cover = 'https://cdn2-img.pressreader.com/pressdisplay/docserver/getimage.aspx?file=1148' + today.strftime(
                '%Y') + today.strftime('%m') + today.strftime(
                    '%d') + '00000000001001&page=1&scale=99'
            altcover = 'https://cdn2-img.pressreader.com/pressdisplay/docserver/getimage.aspx?file=1148' + today.strftime(
                '%Y') + today.strftime('%m') + today.strftime(
                    '%d') + '00000051001001&page=1&scale=99'
        self.log(cover)
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(cover)
        except:
            cover = altcover
            br.open(cover)
        return cover

    def get_browser(self, *a, **kw):
        start_url = self.INDEX
        kw['user_agent'] = random_user_agent(allow_ie=False)
        br = BasicNewsRecipe.get_browser(self, *a, **kw)
        self.log('Starting login process...')
        res = br.open(start_url)
        sso_url = res.geturl()
        self.log(sso_url)
        request_query = {
            'username': self.username,
            'password': self.password,
            's': 1,
            'gotoUrl': self.INDEX,
        }
        rq = Request(self.LOGIN, headers={
            'Accept': 'text/html',
            'Accept-Language': 'en-US,en;q=0.8',
            'X-HTTP-Method-Override': 'POST',
            'X-Requested-With': 'XMLHttpRequest',
        }, data=request_query)
        self.log('Sending login request...')
        res = br.open(rq)
        return br

    remove_tags = [
        classes('is-hidden Toolbar Tooltip Topics Comments u-hide RelatedLinks ArticlePager Media-caption'),
        {'name': ['object', 'link', 'iframe', 'base', 'meta', 'script']},
    ]

    remove_attributes = ['lang']
    keep_only_tags = [{
        'attrs': {
            'id': ['article-main', 'bodycopy']}}, {
                'attrs': {
                    'class': ['Article Article--default', 'f-author']}}]
    remove_tags_after = dict(attrs={'class': 'Article-content'})

    feeds = [(u'All News', u'http://www.thetimes.co.uk/')]

    def preprocess_raw_html(self, raw, url):
        return html.tostring(
            html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False),
            method='html',
            encoding='unicode')

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)

    def parse_index(self):
        soup = self.index_to_soup(self.INDEX)
        totalfeeds = []
        current_section = []
        div = []
        for div in soup.findAll('section', attrs={'data-text': True}):
            current_articles = []
            self.log('in section: ', div['data-text'])
            current_section = div['data-text']
            if current_section not in self.excludeSections:
                for article in div.findAll('div', attrs={'class': 'Item-content'}):
                    h3 = article.find('h3')
                    if h3 is not None:
                        title = self.tag_to_string(h3)
                        aurl = h3.find('a')
                        if aurl is not None:
                            url = aurl['href']
                            if url.startswith('/'):
                                url = 'http://www.thetimes.co.uk' + url
                            desc = title
                            self.log(
                                'section: ', current_section, 'title: ', title,
                                'url: ', url, 'desc: ', desc, '\n')
                            current_articles.append({
                                'title': title,
                                'url': url,
                                'description': desc})
                if current_articles:
                    totalfeeds.append((current_section, current_articles))
        return totalfeeds
PK�XFU	���timesnewroman.png�PNG


IHDR��h6iIDATx�b��
|��m�u�.^Ĕ®aٲe�����Di��뗓���#Gf̘��W��?...���t��}����'$$�����ڶu�V�232�����g͚�j�*>~��}����$SS���Г'O�}����+W�ٳ����?*ݿ����qjF�<��1�M������4jҢ]�Y4��	8rl�a�M

G��l��}�=B��jm&RaUU� ��E13���5�:���q#p]��M'S��w�GW�"��~��i��m��E����r�h��ԃ�,;�� BAh��o�O���df˲u�V�e�qY����<Ϸ�
!U��EQ�䝈�9?�`����&�dIEND�B`�PK�XuaW؟�timesnewroman.recipe#!/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)
PK�X󵤟titanic_de.png�PNG


IHDR(-STPLTE�  �((�00�88�@@�HH�PP�XX�``�hh�pp�xx����������������������������������������Rk�kIDAT�110�ٔ�����.H��+{�8T�N���$���Y����f��L/x���33�x��yQ,H��B���Rhp�hp:�.40 hPs`9�#a�IEND�B`�PK�XԤ�a��titanic_de.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Titanic(BasicNewsRecipe):
    title = u'Titanic'
    language = 'de'
    __author__ = 'Krittika Goyal'
    oldest_article = 14  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('News',
         'http://www.titanic-magazin.de/ich.war.bei.der.waffen.rss'),
    ]
PK�X�E�\��tjournal.png�PNG


IHDR���R-PLTE���[�
tRNS�����*��R�a�5IDAT[c`�޻` �����t����H�݋P��3�޽�{�H�2nL�0^�a@ԧ).��m�IEND�B`�PK�X�>�;
;
tjournal.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class TJournal(BasicNewsRecipe):
    title = u'TJournal'
    __author__ = 'bug_me_not (with fixes by bugmen00t)'
    description = 'TJournal: издание о медиа, технологиях и трендах'
    publisher = 'tjournal.ru'
    category = 'news'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = True
    oldest_article = 30
    max_articles_per_feed = 100
    cover_url = 'https://tjournal.ru/static/build/tjournal.ru/images/search_logo.png'

    remove_tags_before = dict(name='div', attrs={'class': 'content-title"'})

    remove_tags_after = dict(
        name='div',
        attrs={'class': 'content-footer content-footer--full l-island-a'}
    )

    remove_tags = [
        dict(
            name='div',
            attrs={'class': 'content-footer content-footer--full l-island-a'}
        ),
        dict(name='div', attrs={'air-module': 'module.distributionFloating'}),
        dict(name='span', attrs={'class': 'content-editorial-tick'}),
        dict(name='vue'),
        dict(name='div', attrs={'class': 'comments'}),
        dict(name='div', attrs={'class': 'propaganda'}),
        dict(name='div', attrs={'class': 'propaganda propaganda--with-footer'}),
        dict(name='div', attrs={'air-module': 'module.gallery'}),
        dict(name='div', attrs={'class': 'content-container'}),
        dict(
            name='div',
            attrs={'class': 'content-header__item content-header-number'}
        ),
        dict(name='span', attrs={'class': 'views__value'}),
        dict(name='span', attrs={'class': 'views__label'})
    ]

    feeds = [(
        '\u041F\u043E\u043F\u0443\u043B\u044F\u0440\u043D\u043E\u0435',
        'https://tjournal.ru/rss'
    ), (
        '\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://tjournal.ru/rss/news'
    ), ('\u0421\u0432\u0435\u0436\u0435\u0435', 'https://tjournal.ru/rss/new'),
             (
                 '\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438',
                 'https://tjournal.ru/rss/tech'
             ),
             (
                 '\u0420\u0430\u0437\u0431\u043E\u0440\u044B',
                 'https://tjournal.ru/rss/analysis'
             ),
             (
                 '\u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442',
                 'https://tjournal.ru/rss/internet'
             )]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-image-src': True}):
            img['src'] = img['data-image-src']
        return soup
PK�X�/���tmz.png�PNG


IHDR  szz�_IDATx���C�][��j{�l۶�۶m۶m�Ƶ'�Q��U��N�Q~uQߡ��yD�O>`�3&��"%�,��ޢiJ�����,@Y��^�sl7W18a�WV04aS����H�
�H���`�	|�[!�B��_����U��Y���Q
�a��[�GN���b,�Z�� X,Gv�ي}��$��up��/�F/�,����� ����ב�4��/��v����VA-P���D`Ck�Q3p�05 *��>!Mm
�����…(~��t��z<Q�̅ڠ�!�P�C&!��CTz"�5@S *	pՑ�G!�%��Vf�(�x������"�`"�����T�\�w����� �r�db ��\/��JA/�kc�t�1��9��0
A˵��F�Z� ��CW\����v�7\���C�c��ǰ�wL�#xOa8.�da:
P�;�E�<��}.r�(��3:��p�`0�b��x��&��GK
�C�1'��1�1C0�����8��m�­l����_g������Õa��/ 0B?!6� !��u��wN�{!,�e5�IEND�B`�PK�X�e�s	s	
tmz.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1282101454(BasicNewsRecipe):
    title = 'The TMZ'
    __author__ = 'Tony Stegall'
    description = 'Celeb Gossip and News'
    language = 'en'
    publisher = 'The TMZ'
    category = 'news, celebrity, USA'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    masthead_url = 'http://t0.gstatic.com/images?q=tbn:t43QkABe_BmaWM:http://www.thetreymoore.com/logos/TMZ%20logo%20(crop).JPG'

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''

    remove_tags = [
        dict(name='div', attrs={'id': ['sidebar', 'print-actions']})

    ]

    feeds = [
        ('TOP 20', 'http://www.tmz.com/rss.xml'),
        ('Exclusives', 'http://www.tmz.com/category/exclusives/rss.xml'),
        ('Celeb Justice', 'http://www.tmz.com/category/celebrity-justice/rss.xml'),
        ('Celeb Feuds',  'http://www.tmz.com/category/celebrity-feuds/rss.xml'),
        ('Politix',  'http://www.tmz.com/category/politix/rss.xml'),
        ('Music',  'http://www.tmz.com/category/music/rss.xml'),
        ('Movies',  'http://www.tmz.com/category/movies/rss.xml'),
        ('TV',  'http://www.tmz.com/category/tv/rss.xml'),
        ('Sports',  'http://www.tmz.com/category/TMZsports/rss.xml'),
        ('Hook-Ups',  'http://www.tmz.com/category/hook-ups/rss.xml'),
        ('Beauty',  'http://www.tmz.com/category/beauty/rss.xml'),
        ('Fashion',  'http://www.tmz.com/category/fashion/rss.xml'),
        ('Gossip & Rumor',  'http://www.tmz.com/category/gossip-rumors/rss.xml'),
        ('Hot Mama',   'http://www.tmz.com/category/hot-mamas/rss.xml'),
        ('Party All The Time',   'http://www.tmz.com/category/party-all-the-time/rss.xml'),
        ('Ride Me!',   'http://www.tmz.com/category/ride-me/rss.xml'),
        ('Stars in Heat',  'http://www.tmz.com/category/stars-in-heat/rss.xml'),
        ('Vegas',   'http://www.tmz.com/category/hot-vegas/rss.xml')
    ]

    def print_version(self, url):
        print_url = url + 'print'
        return print_url
PK�X=��e��tnxm.png�PNG


IHDR�auIDATx�c���?EL̹���B�?)�n��#���E����@�
�\m@��˵�4��`��/�
`|�
�`�-J$��`#�
H�2�d`���u���@z`P�V�����+IEND�B`�PK�XL�tnxm.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Wasabi <wasabi at tnxm.net>'
'''
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&')
PK�Xd/:@@today_online.png�PNG


IHDR  D����PLTE�3�0 �0"�.!�)$�-"�-!�-!�- �,"�-"�-"�-"�,"�,!�-"�-"�-"�-"����<2�.#�}v������/$�>4�C9�H>����LC�NE�RI�SJ�YP�`X�f^�qi�um�{t�7,��ጇ⍇㓎團栛桜鬨꯫�������;1����2'�;1��������������������<22�WtRNS
%'2[����������o�=3IDATxڅ���1@363|�m�i��g{�['0`�a��e��	2v�#�G6�A�E`�V�����޵�2R���xsW=�`,�0��o�e��9|긪x����(��F�u�7��	��/0��V�:��	.�9����+�_�R!�W�+�C6���~5��'4$dPR}{&t�Q�l��A�Z�!�^���Np��ƍj��Y۾-=5DMc�>���{N���	���!w���!���c�5a���ž��^�8���'�.��sA���K�IEND�B`�PK�X����
�
today_online.recipefrom 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
PK�X	�y۠�todays_zaman.recipe#!/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
PK�X'Y]�11toi.png�PNG


IHDR(-SfPLTE������������昗���唔��GG���쯯蟟�ml�>>��))�����gf�qq����$$�袢㋋�{{����UU=�/�IDAT�����0C�:I�(l���]��'W�l�"GGJl����o��:�@�>��ӥ����\om����`����co�)N��TC�2��#�hW�
(�#�󵝰�Ŭ���&i�)GCr������9r_��;����IEND�B`�PK�X�.


toi.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2014, Karthik <hashkendistro@gmail.com>'
'''
timesofindia.indiatimes.com
'''


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 TheEconomicTimes(BasicNewsRecipe):
    title = 'The Times of India'
    __author__ = 'Karthik'
    description = 'News from the Indian daily Times of India'
    publisher = 'timesofindia.indiatimes.com'
    category = 'news, finances, politics, sports, business, entertainment, India'
    oldest_article = 1
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    simultaneous_downloads = 1
    encoding = 'utf-8'
    language = 'en_IN'
    publication_type = 'newspaper'
    masthead_url = 'http://timesofindia.indiatimes.com/photo.cms?msid=2419189'
    extra_css              = """
                                 body{font-family: Arial,Helvetica,sans-serif}
                                 .foto_mg{font-size: 60%;
                                          font-weight: 700;}
                                 h1{font-size: 150%;}
                                 artdate{font-size: 60%}
                                 artag{font-size: 60%}
                                 div.storycontent{padding-top: 10px}
                             """
    conversion_options = {'comment': description,
                          'tags': category,
                          'publisher': publisher,
                          'language': language
                          }
    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(name='div', attrs={'class': 'storycontent'})
    remove_attributes = ['xmlns', 'style']
    remove_tags = [
        classes('readalso success_screen poll_withoutLogin hide')
    ]

    feeds = [('Recent Stories', 'http://timesofindia.indiatimes.com/rssfeeds/1221656.cms'),
             ('India', 'http://timesofindia.indiatimes.com/rssfeeds/-2128936835.cms'),
             ('World', 'http://timesofindia.indiatimes.com/rssfeeds/296589292.cms'),
             ('Business', 'http://timesofindia.indiatimes.com/rssfeeds/1898055.cms'),
             ('Cricket', 'http://timesofindia.indiatimes.com/rssfeeds/4719161.cms'),
             ('Sports', 'http://timesofindia.indiatimes.com/rssfeeds/4719148.cms'),
             ('Tech', 'http://timesofindia.indiatimes.com/rssfeeds/5880659.cms'),
             ('Education', 'http://timesofindia.indiatimes.com/rssfeeds/913168846.cms'),
             ('Science', 'http://timesofindia.indiatimes.com/rssfeeds/-2128672765.cms'),
             ('Opinion', 'http://timesofindia.indiatimes.com/rssfeeds/784865811.cms'),
             ('Entertainment', 'http://timesofindia.indiatimes.com/rssfeeds/1081479906.cms')]

    def print_version(self, url):
        return url.replace('/articleshow/', '/articleshowprint/')
        # For mobile version
        # return 'http://m.timesofindia.com/PDAET/articleshow/' + article_id

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.magzter.com/IN/Bennett-Coleman-and-Company-Limited/The-Times-of-India-Delhi/Newspaper/')
        for citem in soup.findAll('meta', content=lambda s: s and s.endswith('view/3.jpg')):
            return citem['content']

    def get_article_url(self, article):
        rurl = article.get('guid',  None)
        if '/articleshow/' in rurl:
            return rurl

    def postprocess_html(self, soup, first_fetch):
        return self.adeify_images(soup)
PK�X'Y]�11toiprint.png�PNG


IHDR(-SfPLTE������������昗���唔��GG���쯯蟟�ml�>>��))�����gf�qq����$$�袢㋋�{{����UU=�/�IDAT�����0C�:I�(l���]��'W�l�"GGJl����o��:�@�>��ӥ����\om����`����co�)N��TC�2��#�hW�
(�#�󵝰�Ŭ���&i�)GCr������9r_��;����IEND�B`�PK�Xq��R��toiprint.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import json
from datetime import date
from collections import defaultdict


# default edition is Delhi i.e., 'cap'
# Hyderabad - 'toih'; Delhi - 'cap'; Mumbai - 'toim'; Banglore - 'toibgc';
# Chennai - 'toich'; Chandigarh - 'toicgct'; Jaipur - 'toijc'; Kolkata - 'toikc';
# There are others too, try to figure it out, visit toi epaper link.

le = 'cap' # local edition;

date0 = date.today().strftime('%Y/%m/%d')

# for older edition change date0 below.
# date0 = '2023/09/15'

year, month, day = (int(x) for x in date0.split('/'))
dt = date(year, month, day)
date_ = dt.strftime('%d_%m_%Y')

index = 'https://asset.harnscloud.com/PublicationData/TOI/' + le + '/' + date0
img_index = 'https://cmsimages.timesgroup.com/image-resizer?epaper_s3_path=PublicationData/TOI/' + le + '/' + date0

def handle_images(x, soup):
    img = soup.find('img')
    if img:
        img_div = img.findParent('div')
        cap = img_div.next_sibling
        if cap and cap.has_attr('class') and 'cap' in cap['class']:
            x.insert_after(img_div)
            img_div.insert_after(cap)
        else:
            x.insert_after(img_div)
    for lead in reversed(soup.findAll('div', attrs={'class':'lead'})):
        x.insert_after(lead)

class toiprint(BasicNewsRecipe):
    title = 'TOI Print Edition'
    language = 'en_IN'
    __author__ = 'unkn0wn'
    masthead_url = 'https://static.toiimg.com/photo/98333929.cms'
    timefmt = ' [' + dt.strftime('%b %d, %Y') + ']'
    description = 'Articles from the Times of India epaper, digital edition'
    encoding = 'utf-8'
    remove_empty_feeds = True

    def __init__(self, *args, **kwargs):
        BasicNewsRecipe.__init__(self, *args, **kwargs)
        if self.output_profile.short_name.startswith('kindle'):
            self.title = 'TOI Print Edition ' + dt.strftime('%b %d, %Y')

    extra_css = '''
        .sub { color:#202020; }
        .auth { font-size:small; font-weight:bold; color:#202020; }
        .cap { text-align:center; font-size:small; }
        img { display:block; margin:0 auto; }
        .info { font-size:small; color:#404040; }
        .lead { color:#404040; }
    '''

    def get_cover_url(self):
        cover = 'https://asset.harnscloud.com/PublicationData/TOI/' + le + '/' \
            + date0 + '/Page/' + date_ + '_001_' + le + '.jpg'
        self.log('cover_url ', cover)
        return cover

    def parse_index(self):
        self.log(
            '\n***\nif this recipe fails, report it on: '
            'https://www.mobileread.com/forums/forumdisplay.php?f=228\n***\n'
        )
        url = index + '/DayIndex/' + date_ + '_' + le + '.json'
        raw = self.index_to_soup(url, raw=True)
        data = json.loads(raw)
        if 'DayIndex' not in data:
            raise ValueError(
                    'The Times of India Newspaper is not published today.'
                )
        data = data['DayIndex']
        feeds_dict = defaultdict(list)
        for link in data:
            sec_name = link['PageTitle']
            if sec_name == 'Advertisement':
                continue
            self.log(sec_name)
            if 'Articles' in link:
                for art in link['Articles']:
                    section = sec_name
                    if 'ArticleName' not in art:
                        continue
                    url = art['ArticleName']
                    title = art.get('ArticleTitle', 'unknown').replace('<br>', '').replace('<br/>', '')
                    if art.get('ColumnTitle', '') == '':
                        desc = 'Page No.' + url.split('_')[-3] + ' | ' + art.get('ArticleBody', '')
                    else:
                        desc = 'Page No.' + url.split('_')[-3] + ' | ' + art.get('ColumnTitle', '')
                    self.log('\t', title, '\n\t', desc.replace('\n', ''))
                    feeds_dict[section].append({"title": title, "url": url, "description": desc})
        def sort_key(x):
            section = x[0]
            try:
                return (
                    'Front Page', 'Times Nation', 'Times Region', 'Times City'
                ).index(section)
            except Exception:
                return 99999999
        return (sorted(feeds_dict.items(), key=sort_key))

    def preprocess_raw_html(self, raw, *a):
        data = json.loads(raw)

        tags = []
        for x in data:
            tags.append(x['TagName'])
        if not any(x in {'ArticleBody', 'Photographs'} for x in tags):
            self.abort_article('not an article')

        body = ''
        for x in data:
            if x['TagName'] == 'ArticleTitle':
                body += '<h1>' + x['ZoneText'] + '</h1>'
            elif x['TagName'] == 'ColumnTitle':
                body += '<p class="sub"><b>' + x['ZoneText'] + '</b></p>'
            elif x['TagName'] == 'Author':
                body += '<p class="auth">' + x['ZoneText'].replace('<br>', '') + '</p>'
            elif x['TagName'] in 'ArticleBody':
                body += '<span>' + x['ZoneText'] + '</span>'
            elif x['TagName'] in 'Information':
                body += '<p class="info">' + x['ZoneText'] + '</p>'
            elif x['TagName'] in {'LinkTo', 'LinkFrom'}:
                body += '<p class="auth"><i>' + x['ZoneText'] + '</i></p>'
            elif x['TagName'] == 'Photographs':
                pag = x['ZoneID'].split('_')[-4]
                body += '<div><img src="{}"></div>'.format(img_index + '/Photographs/' + pag + '/' \
                     + x['ZoneID'] + '.jpg&bucket=andre-toi-out&q=50')
            elif x['TagName'] == 'ImageCaption':
                body += '<div class="cap">' + x['ZoneText'] + '</div><p>'
            elif x['TagName'] == 'Lead':
                body += '<div class="lead"><p><i>' + x['ZoneText'] + '</i></p></div><p>'
            elif 'ZoneText' in x:
                body += '<p><i>' + x['ZoneText'] + '</i></p>'
        return '<html><body><div>' \
                    + body.replace('<br>', '<p>').replace('<br/>', '<p>').replace('&lt;br&gt;', '<p>').replace('\n', '<br>') \
                        + '</div></body></html>'

    def preprocess_html(self, soup):
        h1 = soup.find('h1')
        if h1:
            h2 = h1.next_sibling
            if h2 and h2.has_attr('class') and 'sub' in h2['class']:
                h3 = h2.next_sibling
                if h3 and h3.has_attr('class') and 'sub' in h3['class']:
                    handle_images(h3, soup)
                else:
                    handle_images(h2, soup)
            else:
                handle_images(h1, soup)
        return soup

    def print_version(self, url):
        return index + '/ArticleZoneJson/' + url.split('_')[-3] + '/' + url + '.json'

    def populate_article_metadata(self, article, soup, first):
        article.url = '***'
PK�X�.R�FFtolzer_kurier.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X�=�pSStolzer_kurier.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414927012(BasicNewsRecipe):
    title = u'T\xf6lzer Kurier'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [
    (u'Schlagzeilen', u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Bayern',
              u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),

    (u'Welt',
              u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),

    (u'Politik',
              u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),

    (u'Wirtschaft',
              u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Multimedia',
              u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur',
              u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),

    (u'Boulevard',
              u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Regionen',
              u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),

    (u'Bad T\xf6lz',
              u'http://www.merkur-online.de/lokales/bad-toelz/rssfeed.rdf'),

    (u'Stadt Bad T\xf6lz',
              u'http://www.merkur-online.de/lokales/bad-toelz/bad-toelz/rssfeed.rdf'),

    (u'Region Bad T\xf6lz',
              u'http://www.merkur-online.de/lokales/bad-toelz/landkreis/rssfeed.rdf'),

    (u'Kochel am See',
              u'http://www.merkur-online.de/lokales/bad-toelz/kochel-am-see/rssfeed.rdf'),

    (u'Lenggries',
              u'http://www.merkur-online.de/lokales/bad-toelz/lenggries/rssfeed.rdf'),

    (u'Benediktbeuren',
              u'http://www.merkur-online.de/lokales/bad-toelz/benediktbeuern/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),
    (u'FC-Bayern', u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),
    (u'TSV 1860', u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),
    (u'Fussball', u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),
    (u'FCB Basketball', u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),
    (u'Mehr Sport', u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),
    (u'Wintersport', u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),
    (u'Eishockey', u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),
    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),
    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),
    (u'Karriere', u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),
    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),
    (u'Gesundheit', u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),
    (u'Specials', u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),
    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),
    (u'Bayrischer Wald', u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),
    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),
    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X�v�ȭ�tomshardware.png�PNG


IHDR��h6tIDATx�c����������D߽x~s׎sK�]4����n�@3��ן?�/9���`�گ7��yp���c���<;m�/ ����Ĥ��+�BD<y�eǎ��68t�ƶ-�{;�}
���ҪwW�T��299���y�ԩ55�.����V�U<�:�����������Ĥ�'~��
h�ǏEEE�
�xx������@�?zx��~uuu���������^̜9������9==}�̙����/^��2iR]]mFFFSSP���w�^�~�¥%K�ik똚������XX�޽�YRRr��MM�?��x���ڵk���555��y�f߻wg��YYYY.����:�0̞5h�����_�������*''�Y�攖V022N�>Ao/N�y�ѣG`���r��5�h]]�+!!i``�����a��
렡t��1333=-�u7A���Ͼ��VVV����V������/?"b��ǧN�v�<F���7�"g�EK�/��zs�$A!���7��uw\�9��勿?�������t������5"��(N���=���	g�L��h~YN���������14 %�_�����¥��2�k׮onn=|�0P��$�7KaIEND�B`�PK�XR�r	r	tomshardware.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2013, Darko Miletic <darko.miletic at gmail.com>'
'''
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)
PK�X�v�ȭ�tomshardware_de.png�PNG


IHDR��h6tIDATx�c����������D߽x~s׎sK�]4����n�@3��ן?�/9���`�گ7��yp���c���<;m�/ ����Ĥ��+�BD<y�eǎ��68t�ƶ-�{;�}
���ҪwW�T��299���y�ԩ55�.����V�U<�:�����������Ĥ�'~��
h�ǏEEE�
�xx������@�?zx��~uuu���������^̜9������9==}�̙����/^��2iR]]mFFFSSP���w�^�~�¥%K�ik똚������XX�޽�YRRr��MM�?��x���ڵk���555��y�f߻wg��YYYY.����:�0̞5h�����_�������*''�Y�攖V022N�>Ao/N�y�ѣG`���r��5�h]]�+!!i``�����a��
렡t��1333=-�u7A���Ͼ��VVV����V������/?"b��ǧN�v�<F���7�"g�EK�/��zs�$A!���7��uw\�9��勿?�������t������5"��(N���=���	g�L��h~YN���������14 %�_�����¥��2�k׮onn=|�0P��$�7KaIEND�B`�PK�Xr����tomshardware_de.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
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')]
PK�X���tomshardware_it.png�PNG


IHDR  D���IPLTE�85�@9�)+�-.�00�0/����..�*+�*,�+-�--��./�;7�%(�96�#�#�32�(*�10�73�95�(*�41�+,�20�&)�//�'*�%)�),�$(�(+�#'�"&��!&�i[�$�[R�!�RK�UN�$'봃�/.�,-�(*�%(�'*�(*�(+�+,�//�-.�21�(*�&)�%)�%(�$(�$(�$(�%(�%)�)+�<7�&)�%)�&)�11�,-�&)�%(�$(�$(�%)�%)�$(�%(�*,�..�$(�%)�&)�$(�%(�%)�%)�$(�%)�$(�%)�-/�'*�%(�%(�&)�(+�64�&)�$(�%(�'*�*,�%)�$(�%)�./�&)�%)�(+�(+�%)�$(�%)�10�)+�(*�)+�*+�*,�+-�),�'*�)+�41�+-�(*�'*�(*�)+�31�(*�%)�..�'*�$(�%)�-.�'*�./�(*�$(�%)�-.�(+�%(�+,�(*�$(�%(�*,�'*�%)�*,�'*�$(�%(�),�'*�%(�&*�%(�(+�'*�$(�(*�(*�&)�%(�(+�&)�$(�(+�&*�$(�'*�&*�$(�&*�&)�&)�'*�%(�%(�'*�..�*+�(+�(*�$(���*�tRNS '&#	"{������m�pW��ǩ����]��Ĺ��5��j&S��6��l�(��.	,2&
;;5")�.�	49��?�E��K�Q��X�^�'e�,1s�7z�=��C��I�MD�"#��NLIDAT8˭��+�a�_����q��+&�U
����I61����LL���9��H~�s�sN�=�0���z}>��E��$)�n��W���y������X�4�!GH���ev��)
4�R�mIS�R[>9��EfHjT��=�{*�$i�X�4!��yB/��NqJڪ����Q�֟�P���������ecR���LUQ�grfw�;_U�p/'*
�c8u�A�sЧ��`�J�^�A��C0#�l�O��?��\{!��̓)6�"hP?0:d��WJ��a��˅r�e���d.`8;�~�16�Ŀ��A��گ�IEND�B`�PK�X��d���tomshardware_it.recipe__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'
PK�X�M�	��toronto_sun.png�PNG


IHDR��h6fIDATx�c�O"���{��P@���YK_��=Q�J<Q�y��qʂ�JZ'Ep��8u���'�$˙?�	��3�o�
�~,c��'��9��d_�%��g��q�,�
j?�u����ߏ��;�=V�i�7��8q�.էz�o2*@6�8����ϗIc�}���5]��#)�g�>�4A�r��xj�y�Y�}}�K���JV��k>Q�}$ntP�������_�������%`0���m�. �?�[�e���?�_y,o�������&�[��<�Ry�Z7`���D��!��I�<~�nT�T�ם?�����tҏS>�X|�A��>�����!-t�Y�D�ZIEND�B`�PK�X��PEqq
tovima.png�PNG


IHDR(-S�PLTE���333fff���!������
    !!!""""# &"#'#$)%&A=>XSTwstxtu|wx
���������������������������������������L�#��IDATx�U��0�X�ڶ}��m��)��@�M�C
�PA����K��G�D��:xp�S�����ay��Jm`�ͪd���>�d�u���X���f�O<�TT��k��'S��	��&��� �kw�
�m�ͱ��P&IEND�B`�PK�XV_uN]]
tovima.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class Tovima(BasicNewsRecipe):
    title = 'To Vima'
    __author__ = 'Stelios'
    description = ' News from Greece'
    oldest_article = 3
    publisher = 'To Vima'
    category = 'news, GR'
    language = 'el'
    encoding = 'utf8'
    cover_url = 'http://www.tovima.gr/Themes/1/Default/Media/Home//small-n-short-logo.jpg'
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    extra_css       = '''
                        .article_title{font-family :Arial,Helvetica,sans-serif; font-weight: bold; font-size:large;}
                        .article_text{font-family :Arial,Helvetica,sans-serif; font-size:x-small;}
                     '''
    keep_only_tags = [

        dict(name='div', attrs={'class': ['article_title']}),
        dict(name='div', attrs={'class': ['article_text']})
    ]
    remove_tags = [
        dict(name='div', attrs={'class': ['article_cat']})
    ]
    feeds = [
        (u'\u03C0\u03BF\u03BB\u03B9\u03C4\u03B9\u03BA\u03AE',
         'http://www.tovima.gr/feed/politics/'),
        (u'\u03BF\u03B9\u03BA\u03BF\u03BD\u03BF\u03BC\u03AF\u03B1',
         'http://www.tovima.gr/feed/finance/'),
        (u'\u03B3\u03BD\u03CE\u03BC\u03B5\u03C2',
         'http://www.tovima.gr/feed/opinions/'),
        (u'blogs', 'http://www.tovima.gr/feed/blogs/'),
        (u'\u03BA\u03CC\u03C3\u03BC\u03BF\u03C2',
         'http://www.tovima.gr/feed/world/'),
        (u'science', 'http://www.tovima.gr/feed/science/'),
        (u'\u03BA\u03BF\u03B9\u03BD\u03C9\u03BD\u03AF\u03B1',
         'http://www.tovima.gr/feed/society/'),
        (u'\u03C0\u03BF\u03BB\u03B9\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2',
         'http://www.tovima.gr/feed/culture/'),
        (u'\u03B1\u03B8\u03BB\u03B7\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2',
         'http://www.tovima.gr/feed/sports/')
    ]
PK�X�
����toyokeizai.png�PNG


IHDR  ���IDATxڭ�w�H��'򰏎�����u�5��[_4)��3l��-C�|
\����0�e�7��t.�$o����~kI���$C������^O��L��ʿ	v�� /�s���qV��0y�G7�כ��I��B��	ciI�0@.�c���bo�%�����_~�F�T���ܼ~�_|񅟟L�r�
��S�L9r$x~�#�%l��"L�ܣGa>f��R)h(��1�Ah~{��Q�@��H��9�h�h�=}&hF��͛���P�h���,,,,))����3��|���-030�8�$1(p�����($���2_,�-����"��0���jM�Δ&"��`�<�W0�H�ȏ������3�q�7n�@���>s��zd�/gPTT���K�y\��?�DD(��ٷ8v��=�#.�m��KW._�.O?N�)d�F@��7�]dIg�\���rd�I>e��k��K�I_�O�o h>i���N0��$lz}2�l�)�&�k��<f��:��|,�[�B���*.,B���j4��d�;8w�h|>�bWUU!��ˀ���.##�
=�i�OH$��g	zO@���ٳgh�#��)�>���F�@ݾs��zP\G��L`���$s�'�(��ѣF��I���B�(+G֙^�����#�,��d�D��;�t"��n_�t�CQW/fmm�8T,��2�ŵ55���+($4޲�{��	x�JTx���a��r��3p�w�:KZ�E�`��-�M��
�x<�.�sS»���eP�������a�KX��/\�i���@lÓ���n��K�R�7K��݃�յM[�pM�U�a�Pdˣ_J;�R��.ҟ�\|D�x��G����OrI<rV�(��*K��P�H��aM|I�����@]D0pw�i��e�N�$2�\T�kwND��;���HDf�f�P�bgSU}kms{=T�d�8.6��4��h��%������H�z���hG��[�"]��~й�P۲n�D�J>��ه�Ͼ'J-.����E#�/Nͳ&�*����2���w�u�L��.��%�e�UU��ڥ����D�9%5H��Zg뺽b\��WG���U$����W�BC����'����;�ٿ�,���z��
|�!9O��]	��*W�H��b�Jl������UU7m9=H᫴7�g
�+�K��Ѓ�1'��
T��9��t�4�Yl����E�V��*��&A�~�O��zZv�kj��Ğ��C.D�WJ���u�A��R�	����;&8+"��jΚ��0�I����=�N�����K@]i��rW$e�'fA�mO\�d������D�#)>-�p���Z���%�)�O�������y�T{a�4�?�f�x�n0��W�n�/T������IEND�B`�PK�X^>?F	F	toyokeizai.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>'
'''
www.toyokeizai.net
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re


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
PK�X���ff
tpm_uk.png�PNG


IHDR��h6-IDATx�%RM�A����f�x����1{��1���D�����H\.��"r@�A/\���3��of*�L���{���<|DY����Z�ah��̑��r�	�gd��45.� (i��Rr΅��|`A�W���v�f��h�Z���u�P�j���j8,�����H�$J���^���CI�Ų��8Ϟ6�\\|C
f?}����k�CUb��@{�NO_��uȞ���6��$	�JI~8
��@}3���woߘ$m�Z���ٌ�:A{
hh�����dLD�vd�nh4
q�x��S��8�<6��|>�_c''�G�:F6IX8�w<�)&MĴ5�������Q?��AZV*EN[h@?E���T*�����_�5��3��v�%��59�3]�x��'�Q�Z�X�l�A�#�S2@�q[�U����_]~��"���u"8�
�gl�e��
��%L�p�1c�Q5��=
� ���(P*{D!1�(���Y`
K"������BirĀ=�:�qkuY Zf:���*rR�F�bU�Yq|�
�V��!�TIEND�B`�PK�XF�W
tpm_uk.recipe__license__ = 'GPL v3'
__copyright__ = '2010-2015, Darko Miletic <darko.miletic at gmail.com>'
'''
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')
    ]
PK�X��*JJtri_city_herald.png�PNG


IHDR  D���6PLTE&V�������\���������4a�Ak�x�����j��������Ov���˼�⍦�(f��IDATx^���n�0EQ�%�l��[i�cX��za�$}B�+�O���4w��ј��aʬy�M���^TD��\�)�7k� ��׮��T��;ۋw@�0{���0�o ���<�O�>�gPo�>�t4��2��+_�w"���
a	&
i��*�5X��;{Ȝ`h�j�@"k'|�U����)�!���7j�ov�IEND�B`�PK�XWp���tri_city_herald.recipefrom 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')
    ]
PK�X�tE5))trojmiasto_pl.png�PNG


IHDR��h6�IDATx�͒�
�`��%j0�
��(����n�Ջ������n�A�\IE�$5��O�~ri�%z��9�{(Ґ�	d��Żi������h�	G#�����)6B�B�0|��h�˲�e)�:�5s8$E�S�8N��g
lYp���[]�2�$�A\7���(�b�j��`��C����9�J�6%,I�xz�������R�LR���X���!�;�]$I���nw��
z���x�4+���������ӒF�IEND�B`�PK�XT��[trojmiasto_pl.recipeimport 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'<strong>Czytaj więcej.*?</a>', re.DOTALL | re.IGNORECASE), lambda match: ''), (re.compile(u'<strong>Zobacz też.*?</a>', re.DOTALL | re.IGNORECASE), lambda match: ''),  # noqa
                          (re.compile(u'<b>[A-ZĄĆĘŁŃÓŚŹŻ ,.:-]*?</b>', 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'
PK�X��*PPtrombon.png�PNG


IHDR(-S�PLTE�����������Լ�����|~|TRTTNL4.,LFD<64|vt��������ܔ���������~|��쬮����ljllfd��䬦����|zt42,���,&$ljd���dbdd^\��伶����<:4���424���tvt�����@t�IDATxڌ�Q��,��6j��ǫ=j2�?���������
>�
�x�}v�m��(z���c< lX��EK��S����A����E��8�
���>f����x^!r�+6L�g]��
��{��.���%c��ܣ�0IEND�B`�PK�X?c@:��trombon.recipe#!/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)
PK�X�����	trouw.png�PNG


IHDR(-S]PLTEQnRoSpTq[wc}e,n�<y�J��L��a��l��s����������ȣ�˧�ͩ�ι�׺���������������������������G͔QIDAT��YCPE���j�#{���a�~��#���
~f�S��BN	�[���n���t�JN|�԰$rz�Dc�� ����IEND�B`�PK�X��trouw.recipefrom calibre.web.feeds.news import BasicNewsRecipe
try:
    from http.cookiejar import Cookie
except ImportError:
    from cookielib import Cookie


class BasicUserRecipe1333905513(BasicNewsRecipe):
    title = u'Trouw'
    __author__ = 'asalet_r'
    language = 'nl'
    description = u'Trouw de Verdieping'
    oldest_article = 1
    max_articles_per_feed = 25
    no_stylesheets = True

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        # Add a cookie indicating we have accepted the cookie
        # policy
        ck = Cookie(
            version=0, name='nl_cookiewall_version', value='1', port=None,
            port_specified=False, domain='.trouw.nl',
            domain_specified=False, domain_initial_dot=True, path='/',
            path_specified=False, secure=False, expires=None, discard=False,
            comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)
        br.cookiejar.set_cookie(ck)
        return br

    keep_only_tags = [
        dict(id=['articleDetailTitle', 'art_box2']),
    ]
    remove_tags = [
        dict(attrs={'class': 'twitter-tweet'}),
    ]

    feeds = [
        (u'Nederland', u'http://www.trouw.nl/nieuws/nederland/rss.xml'),
        (u'Buitenland', u'http://www.trouw.nl/nieuws/buitenland/rss.xml'),
        (u'Politiek', u'http://www.trouw.nl/nieuws/politiek/rss.xml'),
        (u'Economie', u'http://www.trouw.nl/nieuws/economie/rss.xml'),
        (u'Sport', u'http://www.trouw.nl/nieuws/sport/rss.xml'),
        (u'Cultuur', u'http://www.trouw.nl/nieuws/cultuur/rss.xml'),
        (u'Gezondheid', u'http://www.trouw.nl/nieuws/gezondheid/rss.xml'),
        (u'Onderwijs', u'http://www.trouw.nl/nieuws/onderwijs/rss.xml'),
        (u'Opinie', u'http://www.trouw.nl/opinie/rss.xml'),
        (u'Groen', u'http://www.trouw.nl/groen/rss.xml'),
        (u'Religie-Filosofie', u'http://www.trouw.nl/religie-filosofie/rss.xml'),
        (u'Schrijf', u'http://www.trouw.nl/schrijf/rss.xml'),
        (u'Moderne Manieren', u'http://www.trouw.nl/moderne-manieren/rss.xml')
    ]
PK�X�����trv.png�PNG


IHDR��h6�IDATxڍ�1DP�_)�R��VZ�h4/��t$G"��(8c���o'ӽ�˼�3l�j�"p���Hz��AQ�q0��J��V8��α�	���9��Eq���|�0|��-�`Y�8f���6��V��_��a]�y1I���t�R� ��r|�����i��U������3����!b��m�4}��H�K}$��<1�^IEND�B`�PK�X��WW
trv.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class TrvScience(BasicNewsRecipe):

    title = u'\u0422\u0440\u043e\u0438\u0446\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442'
    language = 'ru'
    __author__ = 'Vadim Dyadkin (with fixes by bugmen00t)'
    oldest_article = 30
    max_articles_per_feed = 100
    recursion = 4
    no_stylesheets = True
    simultaneous_downloads = 1
    #    cover_url = 'https://i0.wp.com/trv-science.ru/uploads/logo_trv2-e1573805568596-1.png'
    cover_url = 'https://i0.wp.com/trv-science.ru/uploads/cropped-trv_neur-1024.png'

    remove_tags_before = dict(name='main', attrs={'id': 'main'})

    remove_tags_after = dict(
        name='div', attrs={'class': 'wpdiscuz-comment-pagination'}
    )

    remove_tags = [
        dict(name='span', attrs={'class': 'fa fa-user'}),
        dict(name='h4'),
        dict(name='svg'),
        dict(name='ul', attrs={'class': 'st-related-posts'}),
        dict(name='footer', attrs={'class': 'entry-meta'}),
        #        dict(name='div', attrs={'id': 'comments'}),
        dict(name='div', attrs={'class': 'wpd-vote'}),
        dict(name='div', attrs={'class': 'mistape_caption'}),
        dict(
            name='div',
            attrs={'class': 'wpd-comment-share wpd-hidden wpd-tooltip wpd-top'}
        ),
        dict(name='div', attrs={'class': 'wpd-comment-left '}),
        dict(name='div', attrs={'class': 'wpd-space'}),
        dict(name='div', attrs={'class': 'wpd-reply-button'}),
        dict(name='div', attrs={'class': 'wpd-comment-link wpd-hidden'}),
        dict(name='div', attrs={'class': 'wpd-comment-last-edited'}),
        dict(name='div', attrs={'class': 'wpd-comment-date'}),
        dict(name='div', attrs={'class': 'wpd-comment-info-bar'}),
        dict(name='div', attrs={'class': 'wpd-form-wrap'})
    ]

    feeds = [(
        u'\u0422\u0440\u043e\u0438\u0446\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442',
        u'https://trv-science.ru/feed/'
    )]
PK�Xr�l���trystero.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = u'2013, Tomasz Dlugosz <tomek3d@gmail.com>'

'''
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']})]
PK�Xa�#tsn.png�PNG


IHDR  szz��IDATx^�WMlW���}3~NZ� �v�	T��Et� **,��UD)�A�@V�H҄.*5�$B�]�*D� ��M[�jU�*�!%X	�Q�@k;Q��:�~~�f�ᜫs玼0G����=s�w~��|2>��T�J`K�\"j���$H�D8��q�&I�2�K����^�e�㱱����p�9���8P����7:V�)Ĩ��U�h��[�cc�����+wܱ}��?�@��a\E]
4�[}��53	�b��>F�]��x��,��}KDb�&��2�xN����A�RA��HΩ�uݢ8`�����A_�{�8�:�ԋsU�xK��)�D�v���|��s�mH�1��F��H*:j���O@	E�QhR����d v*��l�C	��B�!� =)��(��5ޑfх��.��%����H8�M��-D_�DV�����G�>�Y�$U����@$�� K�HF�D��˕@o��f-8�Ծ�q$�mZMh0t�E�6�)�4�Q��������/PG��;Nm�gEA@�
�M���BHʡ�
�6��N
%��sP{�+ɚ���}���u��Y��u���u.g�tj<�͕t6���ȳ<G��6v���?�o��q\ϑ��!|��X\\��$6NL��)��x�;��z��%l��'l��w��G33��I�@�G��'�����۶�.]ZSo�w�w�M�5tJƫSSt�a���]����܉�ٕݮ�d�Z��9�2cp����na��'qfi)�*v}U!�ﮞ=�^Q�ԎHy�z��󍧞�݇��ލ�������O��
��=�(�߳U���?�0�~���1<���~�:F�l�i!��#Gpmn�|�
���_\���<Yob��{q'�O�R��Y��c-�hjd��.,�ș'$E�t����4��,��{�mZ����������,�î]��ݻ��K��CG:���t����@"�ھ��I	��ϸ	����FGQ,/c��Q��~#F{�f�����β��{�����[�t�2>|�-|�L��'N��YXkE��΁��}�Ν:�ˌ�y�ٓ$��]_\$���A�~��Пx�1�Q��џڷ��ܺ���,���br2ff�N�@O�
;��(��i���&�{=�>�,ƌ��삼�6.��r}`Y�%�/xY�OO���^�W�y�X��s��;��soۦ)>�]8��+X�v
9�!it�s���TD�47T���ȳ,�R�zS¹���|��m�$}�<.�y�ȟ�+�19��jض3F��O��z�0�"eX�"S�H)`cb�pH��ԙ���� 2"�����H�ܓ���S�v�*C�㩧 �3�΍���V�@�qq���D�z�i�4�oIM �P"�l��i���z�j��x�.��SF�ⶮ4mk�d�����b8�Ys�sN��)�5׌�] TP���a�Z'
�]
�9^ׂunR"���C/ZkA���M��b=�?4!�X�:N�T��؄�5�y��P�K�بm��虎���(e_;!I�1�Dc�l��(1�*�W��FF�2l[lL&
��Z��:)B�F�H	�sM�*C��Mӿ�uYv|}Yn+�
e�9C�n�x�n�%��
ي˳[! 
h�q�5?:zt��P���r 	�(jX�<�c��ñ��o$��ǯ^}�&�������rK�$Y �$
�t&k�(��xDE��d̋����X�XG�dS)*IEND�B`�PK�X};���
tsn.recipefrom 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'),
    ]
PK�XPV.n}}tst.png�PNG


IHDR  ��DIDATxڕ�t���ﺻk��qwww�a\���Щ���nuW(����l��Pו�Y���.�s���� ��?I �N���Ѩ"r�c�

�Y�$�S1��z�|�C[�]������t8���'([)D$�
Uh�x%sc�pƅ`PBk˽e`w
�!7��A�ֆ( ��#��>�N��Q������I8R���(сD��CП��	�W/�Hw(���ō�|�/�8�~��r��P���1v7
�xV��r��7;~aȭx�S����E�����/v$ݿW�W��;�s�f��q$�!���}����r��I�� �>�;��;����]��[[A�fY���|�<fփ_:*MK|�P�K�Ǹ�����Gi�c�×���VVS�8�W���N*9�d^Uh�ءzq�-P֒u�B�zy(�d��첚�Bk㮛�G���앧5�3�";��@7�BÓ�_J�&�R1����O����f�R������\�C�پ��Z{��*X��&خ|iwXJBj����N�h�ՑW����T�U�2pu �A8�Kw���l1*�y�������ES|�0��Sas��Uj���+��lũh�7ץ%`a (�����9���/�Ё�����/yjǤ7G�wZ�'�v�����;��CNh�u?���NCKփ�U>���i������Ɠ�r�ݱ���8@�
 �h���H�_��;��]�ړ�^矃�p�他�j/��w3w�g��ug�6�	�7w+�����1���e�1��")D�;7�݌��G��Qe-Yͷn�2kC;�䖵%z'�M�]t��K[Z���!�0L�\��ה�A!�(�i����bZU�o���3��3�h�}�)Y�ull4��ű�f��W�ᓌ�\cc}��|"�C9=4��jh`$ʡ��{�W
�Ϳ=��
�>̽��74ugCs]tiC4pg'`��\���i�I�
���E��iu~�V�{:Ϥ�l
K(�[�M5v���l�6̮�H
ȓo���1�8c��i��F8
8bM8kX�[�Sj4i=�������;���u=�J�0�r�
���d�Z��ץ9r�"R��n�^���Y�S�<�[�'�x�Z�}%c��azP���^r�I�V�>�,��	��@օ�����.ez�u��Q�jёh�k){��y�%���E�����Gf��<��9�2�K�h���q"��T��|]S�^ݒ�ݽ���ی%T�7�����o+��=G�'o���A����3�G�}�rƘ���_9���*�{7ͣ�<��Qt�-<�"��#��r���ʁ�w��廳ܱ<X̾�U	&�wfYc������8��F����OA�"��j��}!b��0ꥭ@Dq�%A@��Vmʟp
��܃���PpX��+�,�?"� ��A�ia�G�3����4uD|�<�x�����O�?�9N]-�d��'��…�9�{���/+�w������-wU�8ͬ��%t�"
)\>�偙Bo�@=Շ]B2#�گ( (�:�b�sF�P�6�}s���V��d�=s�p���r�=eL�3e��t|K�)K�2*c�e��aF��!/S�+�7���3����/g��Î1C佃[d�?��g�ٯv����n�m+��E^��st�ɶ��=J �2�QN�9ݤ�7���9&e�p�A��Vx',��"�0Ƽ,��h��C�X�ҡ���>�:��_o�^�S�'.�
n��
"�M����)>`�4��\x������9D����OA�����?P��3�eA���_?���?���f�IEND�B`�PK�Xo�^��7�7
tst.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Teplitsa(BasicNewsRecipe):
    title = '\u0422\u0435\u043F\u043B\u0438\u0446\u0430 \u0441\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0439'  # noqa
    __author__ = 'bugmen00t'
    description = '\u0422\u0435\u043F\u043B\u0438\u0446\u0430 \u0441\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0439 \u2014 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0439 \u043F\u0440\u043E\u0441\u0432\u0435\u0442\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044E\u0449\u0438\u0439 \u043F\u0440\u043E\u0435\u043A\u0442, \u043C\u0438\u0441\u0441\u0438\u044F \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u2014 \u0443\u0441\u0438\u043B\u0438\u0442\u044C \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u043E\u0435 \u0433\u0440\u0430\u0436\u0434\u0430\u043D\u0441\u043A\u043E\u0435 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0439.'  # noqa
    publisher = '\u0410\u041D\u041E \u00AB\u0410\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E \u0441\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438\u00BB'  # noqa
    category = 'blog'
    cover_url = u'https://te-st.ru/wp-content/uploads/2014/05/logo_test.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 30
    max_articles_per_feed = 15

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='div', attrs={'class': 'post-reading-time'}),
        dict(name='div', attrs={'class': 'read-more'}),
        dict(name='p', attrs={'class': 'author-name'}),
        dict(name='p', attrs={'class': 'author-about'}),
        dict(name='footer')
    ]

    feeds = [
        (
            '\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
            'https://te-st.ru/feed'
        ),
        (
            '\u0416\u0443\u0440\u043D\u0430\u043B',
            'https://te-st.ru/section/journal/feed/'
        ),
        (
            '\u041F\u0440\u0430\u043A\u0442\u0438\u043A\u0430',
            'https://te-st.ru/section/practice/feed/'
        ),
        (
            '\u0412\u0441\u0442\u0440\u0435\u0447\u0438',
            'https://te-st.ru/section/events/feed/'
        ),
        ('\u0410\u0440\u0445\u0438\u0432', 'https://te-st.ru/section/archive/feed/'),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u044C',
            'https://te-st.ru/format/news-2/feed/'
        ),
        (
            '\u0421\u0442\u0430\u0442\u044C\u0438',
            'https://te-st.ru/format/article/feed/'
        ),
        (
            '\u0418\u043D\u0442\u0435\u0440\u0432\u044C\u044E',
            'https://te-st.ru/format/interview/feed/'
        ), ('\u041A\u0435\u0439\u0441\u044B', 'https://te-st.ru/format/case/feed/'),
        (
            '\u0421\u043F\u0438\u0441\u043A\u0438',
            'https://te-st.ru/format/list/feed/'
        ),
        (
            '\u0418\u0441\u0442\u043E\u0440\u0438\u0438',
            'https://te-st.ru/format/story/feed/'
        ),
        (
            '\u0418\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u0438',
            'https://te-st.ru/format/guide/feed/'
        ),
        (
            '\u041E\u0431\u0437\u043E\u0440\u044B',
            'https://te-st.ru/format/overview/feed/'
        ),
        (
            '\u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430',
            'https://te-st.ru/tag/analytics/feed'
        ),
        (
            '\u0410\u043D\u0442\u0438\u0432\u043E\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u043C\u043F\u0430\u043D\u0438\u0438',
            'https://te-st.ru/tag/antivoennye-kampanii/feed'
        ),
        (
            '\u0411\u043B\u043E\u043A\u0447\u0435\u0439\u043D',
            'https://te-st.ru/tag/blockchain/feed'
        ),
        (
            '\u0411\u043E\u0440\u044C\u0431\u0430 \u0441 \u0431\u0435\u0434\u043D\u043E\u0441\u0442\u044C\u044E',
            'https://te-st.ru/tag/poverty/feed'
        ),
        (
            '\u0412\u0430\u043A\u0430\u043D\u0441\u0438\u0438 \u0432 \u041D\u041A\u041E',
            'https://te-st.ru/tag/vacancies/feed'
        ),
        (
            '\u0412\u0438\u0437\u0443\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F',
            'https://te-st.ru/tag/visualization/feed'
        ),
        (
            '\u0413\u0435\u043D\u0434\u0435\u0440\u043D\u043E\u0435 \u043D\u0430\u0441\u0438\u043B\u0438\u0435',
            'https://te-st.ru/tag/gender-violence/feed'
        ),
        (
            '\u0413\u0440\u0430\u0436\u0434\u0430\u043D\u0441\u043A\u0438\u0435 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438',
            'https://te-st.ru/tag/civictech/feed'
        ),
        (
            '\u0418\u043C\u043F\u0430\u043A\u0442-\u0438\u043D\u0432\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435',
            'https://te-st.ru/tag/impact-investing/feed'
        ),
        (
            '\u0418\u043D\u043A\u043B\u044E\u0437\u0438\u0432\u043D\u044B\u0439 \u0434\u0438\u0437\u0430\u0439\u043D',
            'https://te-st.ru/tag/inclusive-design/feed'
        ),
        (
            '\u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B \u0438 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F',
            'https://te-st.ru/tag/tools/feed'
        ),
        (
            '\u0418\u043D\u0444\u043E\u0431\u0438\u0437\u043D\u0435\u0441',
            'https://te-st.ru/tag/infobusiness/feed'
        ),
        (
            '\u0418\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u041D\u041A\u041E',
            'https://te-st.ru/tag/research/feed'
        ),
        (
            '\u0418\u0442\u043E\u0433\u0438 \u0433\u043E\u0434\u0430',
            'https://te-st.ru/tag/results-of-the-year/feed'
        ),
        (
            '\u041A\u0430\u043D\u0434\u0438\u043D\u0441\u043A\u0438\u0439',
            'https://te-st.ru/tag/kandinsky/feed'
        ),
        (
            '\u041A\u0430\u0440\u0442\u044B \u0438 \u043A\u0430\u0440\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044F',
            'https://te-st.ru/tag/maps/feed'
        ),
        (
            '\u041A\u043E\u043C\u043C\u0443\u043D\u0438\u043A\u0430\u0446\u0438\u044F',
            'https://te-st.ru/tag/discussion/feed'
        ),
        (
            '\u041A\u043E\u0440\u043E\u043D\u0430\u0432\u0438\u0440\u0443\u0441',
            'https://te-st.ru/tag/coronavirus/feed'
        ),
        (
            '\u041A\u0440\u0430\u0443\u0434\u0441\u043E\u0440\u0441\u0438\u043D\u0433',
            'https://te-st.ru/tag/crowdsourcing/feed'
        ),
        (
            '\u041A\u0440\u0430\u0443\u0434\u0444\u0430\u043D\u0434\u0438\u043D\u0433',
            'https://te-st.ru/tag/crowdfunding/feed'
        ),
        (
            '\u041A\u0443\u043B\u044C\u0442\u0443\u0440\u0430 \u0438 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438',
            'https://te-st.ru/tag/tech-culture/feed'
        ),
        (
            '\u041B\u0430\u0431\u043E\u0440\u0430\u0442\u043E\u0440\u0438\u044F',
            'https://te-st.ru/tag/laboratory/feed'
        ),
        (
            '\u041B\u0438\u0434\u0435\u0440\u0441\u0442\u0432\u043E',
            'https://te-st.ru/tag/leadership/feed'
        ),
        (
            '\u041C\u0430\u0440\u043A\u0435\u0442\u0438\u043D\u0433',
            'https://te-st.ru/tag/marketing/feed'
        ),
        (
            '\u041C\u0430\u0448\u0438\u043D\u043D\u043E\u0435 \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435',
            'https://te-st.ru/tag/machine-learning/feed'
        ),
        (
            '\u041C\u0435\u0434\u0438\u0446\u0438\u043D\u0441\u043A\u0438\u0435 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438',
            'https://te-st.ru/tag/medtech/feed'
        ),
        (
            '\u041C\u0435\u043D\u0435\u0434\u0436\u043C\u0435\u043D\u0442',
            'https://te-st.ru/tag/management/feed'
        ),
        (
            '\u041C\u0435\u0441\u0441\u0435\u043D\u0434\u0436\u0435\u0440\u044B',
            'https://te-st.ru/tag/messengers/feed'
        ),
        (
            '\u041C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u0435 \u0440\u0435\u0448\u0435\u043D\u0438\u044F',
            'https://te-st.ru/tag/mobile/feed'
        ),
        (
            '\u041E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u043C\u043F\u0430\u043D\u0438\u0438',
            'https://te-st.ru/tag/campaigning/feed'
        ),
        (
            '\u041E\u043D\u043B\u0430\u0439\u043D-\u041B\u0435\u0439\u043A\u0430',
            'https://te-st.ru/tag/online-leyka/feed'
        ),
        (
            '\u041E\u043D\u043B\u0430\u0439\u043D-\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u0435',
            'https://te-st.ru/tag/education-online/feed'
        ),
        (
            '\u041E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435',
            'https://te-st.ru/tag/open-data/feed'
        ),
        (
            '\u041E\u0442\u043A\u0440\u044B\u0442\u044B\u0439 \u043A\u043E\u0434',
            'https://te-st.ru/tag/opensource/feed'
        ),
        ('\u041F\u0430\u0441\u0435\u043A\u0430', 'https://te-st.ru/tag/paseka/feed'),
        (
            '\u041F\u0440\u0430\u0432\u043E\u0432\u0430\u044F \u0431\u0430\u0437\u0430',
            'https://te-st.ru/tag/regulations/feed'
        ),
        (
            '\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435',
            'https://te-st.ru/tag/programming/feed'
        ),
        (
            '\u0420\u0435\u043B\u0438\u0437\u044B \u00AB\u041B\u0435\u0439\u043A\u0438\u00BB',
            'https://te-st.ru/tag/leyka-release/feed'
        ),
        (
            '\u0421\u0435\u043D\u0441\u043E\u0440\u044B',
            'https://te-st.ru/tag/sensors/feed'
        ),
        (
            '\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u0432\u0438\u0434\u0435\u043E',
            'https://te-st.ru/tag/video/feed'
        ),
        (
            '\u0421\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u043E-\u043E\u0440\u0438\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0434\u0438\u0437\u0430\u0439\u043D',  # noqa
            'https://te-st.ru/tag/responsible-design/feed'
        ),
        (
            '\u0421\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E',  # noqa
            'https://te-st.ru/tag/social-entrepreneurship/feed'
        ),
        (
            '\u0421\u0442\u0430\u0440\u0442\u0430\u043F\u044B',
            'https://te-st.ru/tag/startups/feed'
        ),
        (
            '\u0422\u0435\u043F\u043B\u0438\u0446\u0430.\u041A\u0443\u0440\u0441\u044B',
            'https://te-st.ru/tag/teplitsa-kursy/feed'
        ),
        (
            '\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438 \u0432 \u0431\u043E\u0440\u044C\u0431\u0435 \u0441 \u0440\u0430\u043A\u043E\u043C',
            'https://te-st.ru/tag/cancer/feed'
        ),
        (
            '\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438 \u0434\u043B\u044F \u043F\u043E\u0436\u0438\u043B\u044B\u0445',
            'https://te-st.ru/tag/itforelderly/feed'
        ), ('\u0422\u043E\u043A\u0438\u043E', 'https://te-st.ru/tag/tokio/feed'),
        (
            '\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u0430\u044F \u0440\u0430\u0431\u043E\u0442\u0430',
            'https://te-st.ru/tag/remote-work/feed'
        ),
        (
            '\u0424\u0430\u043D\u0434\u0440\u0430\u0439\u0437\u0438\u043D\u0433',
            'https://te-st.ru/tag/fundraising/feed'
        ),
        (
            '\u0424\u043E\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0438',
            'https://te-st.ru/tag/photo/feed'
        ),
        (
            '\u0426\u0438\u0444\u0440\u043E\u0432\u0430\u044F \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C',
            'https://te-st.ru/tag/digital-security/feed'
        ),
        (
            '\u0426\u0438\u0444\u0440\u043E\u0432\u0430\u044F \u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F',
            'https://te-st.ru/tag/digital-transformation/feed'
        ),
        (
            '\u0426\u0438\u0444\u0440\u043E\u0432\u044B\u0435 \u043F\u0440\u0430\u0432\u0430',
            'https://te-st.ru/tag/digital-rights/feed'
        ),
        (
            '\u0427\u0430\u0442-\u0431\u043E\u0442\u044B',
            'https://te-st.ru/tag/chatbots/feed'
        ),
        (
            '\u042D\u043A\u043E\u043B\u043E\u0433\u0438\u044F',
            'https://te-st.ru/tag/ecology/feed'
        ),
        (
            '\u042D\u0442\u0438\u043A\u0430 \u0432 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u044F\u0445',
            'https://te-st.ru/tag/ethics/feed'
        ),
        (
            'IT-\u0432\u043E\u043B\u043E\u043D\u0442\u0435\u0440',
            'https://te-st.ru/tag/itv/feed'
        ), ('Meet and code', 'https://te-st.ru/tag/meet-and-code/feed'),
        ('PhilTech', 'https://te-st.ru/tag/philtech/feed'),
        ('Scrum', 'https://te-st.ru/tag/scrum/feed'),
        ('TeploDigital', 'https://te-st.ru/tag/teplodigital/feed'),
        (
            'UX/UI \u0434\u0438\u0437\u0430\u0439\u043D',
            'https://te-st.ru/tag/uxui/feed'
        ),
        (
            'VR/AR \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438',
            'https://te-st.ru/tag/arvr/feed'
        ), ('WordPress', 'https://te-st.ru/tag/wordpress/feed')
    ]
PK�X���tulsaworld.png�PNG


IHDR�a�IDATxڵ�C`X	᷶��m۶m۶m۶m�Nֶ�oN�1���[�q�A�����[T�?_0��b�W�>q/}�o�of
�
}Z0��fs��C��'�%�	�&��w��v�t>�|��ѕDduŠb�U���ɭ�ZPb�~��qѿ�\<����z炑�!��
�}���P�VBڿ<�	���	���us��ϔs����.��<,da��~l�~�3DTLC̩O��CY/�̨����ЛW�ء/bV�@\W;��
A�7�B0����N�9 $��J^v�\�PU�v�p��lP�>�I��+��T� �]JAf]F�:���(�x�R��b�}W��e���<��oK?��6A��v�D���;��jŃB�tbx�M��+�@����ǰ)?�M�8B��T����.��V �%	�AA э�9 �b��I�>��Dώ���|>M�iكg��'��?���nd�C�M	��(�
q<�g� w��m�n��"{�m�cx�3�����9	y�)P���Y��@�)���T�^�̙9oXG��>r�6���)Z�`�y>jPj�$��ś3�ۓĵ}��Ϝ����2:��$�m�sh�A]iBU�fH
66H�j|����S�j�ӯ��*��<��Z��j8y���V,�x�Fd������[�cS�yY�v��Z�md��)������2�ʠyW��IEND�B`�PK�XHMP��tulsaworld.recipe# -*- mode: python -*-
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = '2010-2017, Darko Miletic <darko.miletic at gmail.com>'
'''
tulsaworld.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class TulsaWorld(BasicNewsRecipe):
    title = 'Tulsa World'
    __author__ = 'Darko Miletic'
    description = 'Find breaking news, local news, Oklahoma weather, sports, business, entertainment, lifestyle, opinion, government, movies, books, jobs, education, blogs, video & multimedia.'  # noqa
    publisher = 'World Publishing Co.'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    country = 'US'
    auto_cleanup=True
    remove_empty_feeds = True
    masthead_url = 'https://bloximages.newyork1.vip.townnews.com/tulsaworld.com/content/tncms/custom/image/cfd1ce2e-7ec7-11e7-b919-8754a2b60fa6.png?_dc=1502478231'  # noqa
    extra_css = ' body{font-family: Arial,Verdana,sans-serif } img{margin-bottom: 0.4em} .articleHeadline{font-size: xx-large; font-weight: bold} .articleKicker{font-size: x-large; font-weight: bold} .articleByline,.articleDate{font-size: small} .leadp{font-size: 1.1em} '  # noqa

    conversion_options = {
        'comment': description, 'publisher': publisher, 'language': language
    }

    feeds = [
    (u'News', u'http://www.tulsaworld.com/search/?f=rss&t=article&c=news&l=150&s=start_time&sd=desc'),
    (u'Business', u'http://www.tulsaworld.com/search/?f=rss&t=article&c=business&l=150&s=start_time&sd=desc'),
    (u'Opinion', u'http://www.tulsaworld.com/search/?f=rss&t=article&c=opinion&l=150&s=start_time&sd=desc')
    ]
PK�X����JJ
tuttojove.png�PNG


IHDR�aIDATx�c��Q0
F�(~IEND�B`�PK�Xhxpő�tuttojove.recipe__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()
PK�XMڶ���tuttosport.png�PNG


IHDR(-S0PLTE�9
�E�^;�kJ�wYÄhɐwϜ�ը�۴��������������foXIDATx�M���P�P����ɜ��]@RY�#9Il�>�blH��9�y�&�@ɨ&`$0G�-�?�\��p�B?g����	ޏ4��IEND�B`�PK�X�D�

tuttosport.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__author__ = 'Lorenzo Vigentini'
__copyright__ = '2009, Lorenzo Vigentini <l.vigentini at gmail.com>'
__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;}
                '''
PK�X�n��WWtv2lorry_dk.png�PNG


IHDR�aIDATx�c����<
3������)tYIIEND�B`�PK�X7%��tv2lorry_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
TV 2 Lorry
'''


class Tv2lorry_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'TV 2 Lorry'
    description           = ('Ved at abonnere på vores RSS-feed kan du få de '
                             'seneste regionale nyheder til at 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.tv2lorry.dk/tv2lorry/rss
    feeds = [
        ('www.tv2lorry.dk - RSS Feed', 'http://tv2lorry.dk/rss'),
    ]
PK�X�C�0tv2nord_dk.png�PNG


IHDR00`�	�>PLTEU����������!����$�"���!���%�%�$�(� �&� ��$�#�&�"�!�#�&�$�&�%�'�&�#�#�(�&�&�$�&�'�%�$�'�%�%�&�&�(�%�%�&�&�&�&�&�'�%�&�&�&�&�&�&�%�(�$�&�'�'�&�'�&�&�&�&�'�&�&�&�%�'�&�&�&�'�'�'�&�&�&�'�'�'�)/��-itRNS
 !&()/0137<?@FGHKMNPS]`bcdefkpqxz{������������������������������������������������E�"IDATx���Ӣk��۶m۶m�y�8SwW�v}3Ip�\���V��/���s$��<L�.:��T���)��-Uk��]٬�Cޱ��-$�$����������I�jh�RT7)�/�J�f��%�C��"�I�)�¬l0�?5�-{�x+!U@:��/j���@>���5B�BI��X/cf��jJ^��C����LÏ.�����r�$
�`�.B�}1(j�
IߒV0󒶠�
J��
N͏��i����%���13q���"�t���y��l\.�?
��M�яIEND�B`�PK�X6ā���tv2nord_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
TV2 Nord
'''


class Tv2nord_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'TV2 Nord'
    description           = ('Siden 1989 har nordjyderne inviteret TV2 Nord ind i stuen, men med '
                             'premieren på Nordjylland LIVE i 2014 blev det forhold vendt om. Nu '
                             'inviterer TV2 Nord nordjyderne i fjernsynet.')
    category              = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://www.tv2nord.dk/tv2nord/rss-feed-fra-tv2-nord
    feeds = [
        ('TV2 Nord', 'http://www.tv2nord.dk/rss'),
    ]
PK�XF�4���tv2oj_dk.png�PNG


IHDR��h6�IDAT(S5Q[HQ>s�D��`d/[���l�҈$z��� ��$�؊B�פ�@(7ɠ�^*��\w}�H,L0��P�ix���˙9���h?�������_:Vs�y�c�s�)c�c�����BO<
F@��yť%[����8|(����՜s���ڢ�hiyY����qA$۶$��Շ�����ZP�����J�J�+v}�p����U�d�f_��D"Q�{ϫD���`_*W��D��􎍎�<Q�6:����a���%�ǃQ��g2������P(��
�X����Ig��eY`D���P��ԣ�vuu755%�ə�MӚo�����-̃ZB�D�p�~:���=�z��E8�?�$�2��...���~����K8������(�P�8�"˲ �Tj �LA8�(�nW���C���ȿ@�	�	`��X��!����"
�BX�S��-�����^�������ᗔ�u��a��δ;�F'�Hg���h�~{���O-#�M�F�c_	V��΃��D�J�>�l�����"�?�/
6��ENll��Йm����:F�G vW���	5�h)k����D�]�s�q& ɥ��i�
�j������P���tl�C\�$aH�b 	.�:�	1�Uw�w��4�Q��ڍ����IEND�B`�PK�X��#4pptv2oj_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
TV 2 | ØSTJYLLAND
'''


class Tv2oj_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'TV 2 | ØSTJYLLAND'
    description           = 'Alle nyheder fra tv2oj.dk kan læses som RSS RSS-feedet kan findes via adressen www.tv2oj.dk/rss'
    category              = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://www.tv2oj.dk/tv2oj/rss-feeds
    feeds = [
        ('www.tv2oj.dk - RSS Feed', 'http://www.tv2oj.dk/rss'),
    ]
PK�X�mx���
tveast_dk.png�PNG


IHDR(-SPLTEF�,�,�,~3l�tRNS{�-)?�;IDATxڍ�!A�&�ߌ[q����<
�D���nPS��,;+M���z���<�e��2�IIEND�B`�PK�X�W!B{{tveast_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
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'),
    ]
PK�X�=��tvmania.png�PNG


IHDR�a�IDATx��΁FCa��WBd��J� �]ABH�I�$E��$		�=��Oj@/�������	O<pN�	��O�(�yc>{<��A�%x�%���3�_sJҧ�*Q���:pM�BCV�M�!���ghI:���tH����<�,����d�*P��_J,�l����\�2Y��4�芤;M`��j�È�&�PT�)r��96<v��b]o�IEND�B`�PK�X�U
U
tvmania.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
tvmania.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Tvmania(BasicNewsRecipe):
    title = u'TVmania'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Programe TV'
    publisher = u'TVmania'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,TV'
    encoding = 'utf-8'
    cover_url = 'http://www.tvmania.ro/wp-content/themes/tvmania/images/logo.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'class': 'articol'}), dict(name='font', attrs={'class': 'mic'}), dict(name='div', attrs={
            'id': 'header_recomandari'}), dict(name='div', attrs={'class': 'main-image'}), dict(name='div', attrs={'id': 'articol_recomandare'})

    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['iLikeThis']}), dict(
            name='span', attrs={'class': ['tag-links']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['iLikeThis']}), dict(
            name='span', attrs={'class': ['tag-links']})
    ]

    feeds = [
        (u'Feeds', u'http://www.tvmania.ro/feed')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�t�
??tvmidtvest_dk.png�PNG


IHDR00W��IDATx��W��H�m۶}�ٶ��If���y�vp�m_'g۶�/�ok�3��{Q�7褪��ꮿ�Y��,�^�]�d������������d�4�_AKI?E[�[�;�ʏ��9��w�'W�?�gL��V����>�q^��h�_�}��ߠKj�!���pf���
�O��"9����.-b�%�*��Z�C<�v�?�K�-�~㖃�/�[J�x�q���K�U�Oڜ�L߿2-������6z�?��L�+f?��d��	΃�j�Fy5�v�1� �\\���d�SB;qS5����1�|�+0����V��� ����O�N�Xq�����/Ӳ��K[��{��p�<���.q_l�oJ΃s6�~��%�>�u7
�ـ���8!������Z��umI��*�i�7��������C�w��mdm
�Op:��CNu�^����\�+���0!�T��7JN��U���Sʴ%uf�%�g7G>��0���"�_\/�*���`����3.<����	�d�)e�C���oa�_Jva�ʕ,����0�%
�)Z���|�DI�����-���$���7M^!ez�C�f|v��n�6�`�\�2��)�_�6\�s�Q{�g��n�i�O�;Ҧw�U��FT��9bM��{k��M����������G����B��ʱ����8:��
����1�\���L�^`xG�x!�]�i~�&����-п�9g��s`2H�M�ෑy�������+�����V���k 3_+z��-H���x�� ����˙%�ˈթ���3+�DE�w�9�Y��_��ȹ��"�w�[���/�
��6X�,2��$xE�������xYGB�x��׿�����z&�|���e�"�L4)�R_�1�H��_@�����^��#�E�;1��l�P]d>2L-ʍ���
ߋ��X)f�At�A�����3$��J=@#��0R����cd��W3�/������2�#�YH��~#:�Ty)���%m��
���݆�H�sq�{�s>����׎�1�	�kQ�L�9|����}��TL[��PWG������Yf7o+m���8��G�j�$�+?9��:D{�s͉�_
����X�\`۠#�`
hI�߈b.���m�R���Ӈ�p�f����&h�Nj��]���e;E8@�跻����:�'j'�&l���S7�:K ����|���8��.h��s�IEND�B`�PK�X9�!_44tvmidtvest_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
TV MIDTVEST
'''


class Tvmidtvest_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'TV MIDTVEST'
    description           = ('Du skal bruge en browser som understøtter RSS (f.eks. '
                             'Firefox ), eller en nyhedslæser (f.eks. SharpReader eller '
                             'RSSReader). Se rss-feed på tvmidtvest.dk/rss. Du kan også '
                             'bruge vores RSS feeds på online feed-readers som f.eks. '
                             'Google eller Live.com. Du kan frit indsætte vores RSS '
                             'feeds på din hjemmeside, via f.eks. www.feedburner.com '
                             'eller www.rss2html.com.')
    category              = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://www.tvmidtvest.dk/tvmidtvest/rss-feed
    feeds = [
        ('TV MIDTVEST', 'http://tvmidtvest.dk/rss'),
    ]
PK�XVbNԇ�	tvn24.png�PNG


IHDR�aNIDATx�U�Y�Qƿ{��i;����Ǝ��!D "���WDBx��Λ� �!BBb��E�Umg��35�5%Nrr����|'��B����'�}ܐN��vm��@`{Txo��Xfތ�y�{��?�*��ݞ��baC�N��v�Цs븒T<��kj�=6��3�&�� ��7���l萎��0-+]��ѿKc4�<�|����yc���E�z��V�]�n�Z��aRB!K@���z7ô�ma�U�s��u�,�:���2i���#��) ��(\(׀�jx�VCD�c�ϥ��k����s�Ϛ:�ݺt(^~(�S�@H��2q���BhUϿX�
���Z���ztl�B�1<�^m�X7�'Opq��k�
�g�DD"ȫ&�7��]���3o��,���G{�]�Z�ӽ�29L�|b
�4C�6	����ha򠎸r?�[/�hѠ)�b�\�8>MuW��˧��O����0npᄄx����[!��ˌ�oKҼff*��
�L�����n>)�P��Vd�Цe�uX��6ؐǫU��?k�*.��A������K�� ���l� g�T��	�6IY�nu?�6_�X�N��_ ���SS
"@8�đP8����R=�9a.aڳ߻��=�XGH�#H��!!�wM%	񘌶-$5�m�Zq�LJ9��V��E�[>}����  �>�o/Q	I9�}.A26l^>��ǴfۑF�,�&Z����~��
'y�}p��䖟tm���$��?@=�\�$�]�X���D��h&�m�UfV��G���o�/RQ��5K[IEND�B`�PK�X6�20��tvn24.recipefrom 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
PK�X�4��tvsyd_dk.png�PNG


IHDR00`�	��PLTE?????�UU�����mm�������qq����������qz����{t�qq�rr�ss����ss����������ss����������ss�������ss�������mp�������oo�������mm����������gi�hf�������eg����ff�dd����ee�������ba�������a_����bc�������]]�������������Z\����VV||||||�RR{{{�PR�PO�MMyyyxxx�LL�LJvvvtttsss�HHsss�BB�DDppp�AA�??�@@lll�=?�<<lll�==kkkjjj�9:�:;iiiggg�66gggddd�32ccc�22ddd�00```aaa___�--�..___�+*^^^[[[�((ZZZ[[[�##YYYWWW�!!WWWQQQ��QQQ�JJJKKKNNN�GGGKKK�FFFHHH��@@@�GGG�AAA���HHH��
BBB�	FFFDDD��.Y�tRNS

#$(*,,.1335<>>CIKTZ]_degjps|��������������������������������������������������������������������������������������������������������IDATx�풃cA�oݮm۶m׶m�X�3�ܓ���iկMr�d���f�\�vm_F�b��F2\m�y��涶
��'�V_(ojW4���{���!���wA�W�.x���{%�lCzV0�]1�����y)*���m��)��0N:cH��<�-†vl�^��^D�U�!~~��0߅[Y�͝��MB����zě<-�&�yT,����=�N��c�!Z�����r�UX1�����R��}87V�۪�-�|�+�ʿH��@��NUQ��XryPo�~�@\E�[<����s������Wq�=�һ_!L�Ϩ���78��6G(�|�R�EF
�6���X�$�-����ev��N�QBQd��%>��f�AiNM�̡Ѣc�(�*BC�����`��S���D�&��?8Ox��@ξ��!��PO!i\�-WeSga���}-e��P|r���g�_�\%3(��IEND�B`�PK�X��gKKtvsyd_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
TV SYD
'''


class Tvsyd_dk(BasicNewsRecipe):
    __author__            = 'CoderAllan.github.com'
    title                 = 'TV SYD'
    description           = 'Ved at abonnere på vores RSS-feed kan du få de seneste regionale nyheder til at dukke op på din skærm.'
    category              = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article        = 7
    max_articles_per_feed = 50
    auto_cleanup          = True
    language              = 'da'

    # Feed are found here: http://www.tvsyd.dk/tvsyd/rss
    feeds = [
        ('TV Syd', 'http://www.tvsyd.dk/rss'),
    ]
PK�X4T]a66tvxs.png�PNG


IHDR�a�IDATxڅ���:���m��k۶m۶m�ڶm�l����Ir��T̿H�fWGϸ���Z���7�6�1�'Ju�u��}������N��{ד�˗v?r*���x;��j֎��y�~�:���K(������,{����X�vt�����7t��,���toղ�8yb7�?8�<`�?!����."��0Y��
�"b��z@�w@gg����W�<~v�M����Y%_Hn�/$�A@��~��sjm
�����E�]]����������}B^�g�W}Ef�kD�� ��ɖ=�8Yy2z���!��W�y��)���6�6x��0�W�%ϑW���g���3gjl@�� )"Y)Q��Kc℉%,)�}άٍzZ���b#�^~	���u����$��͔����=�ᗍ�u+˲�L?�AFRKVg�3w"4}'���{�j<�\�%�s�Ch��[�0��W�\�'( �9�\ٻ���8tq2������1f�=��Q�?�N�R���%���w4���D�,s�f.v�ة�>�C�Xa�[X��p��ݯ������6�]4!%!�
kM~k6�.kcM�
�(z���MMMs��!I^u-lt������l0��5z��]�!*"?_�;d��5��������ꧮ� #3u��0�	�m�aae8���G�g���A���rձ�G�����XS��q�G4=r8���d-�G�J���0���v~_�P��ڟ��Ԃ�WQIEND�B`�PK�X1�&��tvxs.recipe# 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'<br[ ]*/>', re.IGNORECASE), lambda m: ''),
                          (re.compile(r'<br[ ]*clear.*/>', 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('<a href="/print/')
        if pos_1 == -1:
            return url
        pos_2 = data.find('">', pos_1)
        if pos_2 == -1:
            return url

        pos_1 += len('<a href="')
        new_url = data[pos_1:pos_2]

        print_url = "http://tvxs.gr" + new_url
        return print_url
PK�X�Q8<OOtweakers.png�PNG


IHDR  szz�IDATx�bؠ�k!�Z�Z�ؑ%�³�m��
�ƙ�g�+[�.cmDk۶�ֶ�t^��MWMosSٮ:�>�i&�>O�i�4zX%�Ց�#�M��V�a�@/��b��X�aEɞ�Q�bGV}��ɉ�87`o�/��;�ǔ�6��ǒX���Z����Ͻ8�6���N�+���i
M�LRˢ���h�~:2)�ɍ��{p�he7"(�b�� �O�=������%@��[���
�\4��,�c��X�ɥ�-k�V�wN
p�O^0X˃�t�eԬY�Z!�D_7̊u-�ï���
3����.��Tn�=�X�)B����8r>�S��VKp�!(@7��w��i�D�Ը�W������H�R��+��(] 5�.<WP�,q��Ҽ�N��O��
����>|-[�y*�ˇXO�p���zj��ǯ�:g�#M�F����z��b�����o=(58~��o��S	�"�z����Ė�|(�n(=p��˘�`\�l���L��N�������\SHիW#���9r⊁S��$��)�w�~%�șD�$��� J�ER 6��-��C@:��'�U�%��@�)@��k�Q'�\���gQ����W5��$ƚ�=�$�6���9��T���h9��<`~K�1#��$6 �jc7oD������@z���]!fI�6�����Ɏ����Vl^
�o��F�kV9D�ɋ�W��3����R3�ؔ#)����B�Ζt�tP� ϒ31R<��Rs:�1��Dō�s�*�t�Z�<�.f����4��
�~��C����:.�d=���^����a�4��*��w��ʑ�ڑNTa�^�:ueXա����Wz�!�f��E�.=.��[_�Vs�Eϸ�#C��ņl���i�d�':��
�E�����zF�bŧ:�ẹ�9��lg�ta��/tl�̓m|$��g�������
@jVG
# ��Q��蚞�i��*� )��D��<�G��ՀOT�ΒIEND�B`�PK�X�5??tweakers.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement

__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Tweakers(BasicNewsRecipe):
    title = u'Tweakers.net'
    __author__ = 'Kovid Goyal'
    language = 'nl'
    oldest_article = 4
    max_articles_per_feed = 40

    keep_only_tags = [dict(name='div', attrs={'class': 'columnwrapper news'})]

    remove_tags = [dict(name='div', attrs={'class': 'reacties'}),
                   {'id': ['utracker']},
                   {'class': ['sidebar']},
                   {'class': re.compile('nextPrevious')},
                   ]
    no_stylesheets = True

    feeds = [(u'Tweakers.net', u'http://tweakers.net/feeds/nieuws.xml')]

    def preprocess_html(self, soup):
        for a in soup.findAll('a', href=True, rel=True):
            if a['rel'].startswith('imageview'):
                a['src'] = a['href']
                del a['href']
                a.name = 'img'
                for x in a.findAll(True):
                    x.extract()
        return soup

    def postprocess_html(self, soup, first):
        for base in soup.findAll('base'):
            base.extract()
        return soup
PK�X��!�
�
tweakers_net.png�PNG


IHDR22?��
SIDATx�ݙT����o&	�uo?���!��PX�����[t�X��J�
�z
��Z�
]�}��g��I�X�o�9?tro��J�k���٤e�
G�.ѩ�s�e��'O>���_q�:�����,�����KNn�-Bt��TXTȸ��%�@���G��Й���F�k��;���m�~{��7�t�wv�����@
(3s�̄�?x�CHk�j���ԩS�֯_�c���g9��U���#G�	|g�ҥ�]\]�!�5�G����y��Ltrr:jai�ls�׿��I�'�3o�[m]����bm޲����l�.]~n�]�v������}{�#�%4[�Y�=�,Y-��~�'њ�1�/_~����;B�C��a�F++�r:�.���-�`�B�Eky{{;�[X�ӡw7l�`�m�J�,oll,
f]cfn��? �!�Ш=���fjjzGu��2xm�:'�0`5�#������SO�AHS4��7ov���.
>��ӕ<,�[��3�.�N��i_��9jd��k��#Dj���l۶-XeP�H�%<���Z��b?}�	<$ꁱ�xe�Ϙp��
!R�UZZ�Mǎ���U�>���w,��p0G�H��=`�����B��o7	�̶�ۡW�^JF����K�q�~6�;1#]�ty���k��lݶM���G��1m/]�d����#$d��Q�Ϋ^�
;9��#�sP^���ie?��h�����F*�Ǿ�k�ī=f̘3����SRR쿹񍑫�[[���1�Ȭٳ�
1<���6m��3#��#X(|�C��pP�b��_����VO�=�7�|Sd��]�s�?�z�t2��ض]��޽�>�<f�#d�ȑ�۵o���	0x����<n)�b���Г��������+"i����o9ؕȃ�A��աC��'O���PM�6mF�=��}�z���J=��H�:{�탃Bdd$$&&�O?�
�������p��!ؽ{7����md5���H���Uyc��߽{���+W� �oa:��J�&����{�F��ۯ<{�z^����6k-�+���4�s�L�`|OFE����M��H��H*��9�@{#
�gϟ�B/���H���5R^���x0l#V|3��~�~nQ ��T����2?ԥ�֢<���Lz�,]�,!ʈ4k��X�F�pP�ǁ�U+"�c��1B#3f�HF�2�'&�����A�K9:�W�+���S8�ĉ���@�]F�]�|mC*Z`d��PS[
��7����V+r�o#��k���󮮮�W�sQ л��a������\��Չ��I}��72`�x���������`dl���܍P%Z���>[؜����^�|Y��=����8�|��e�#%��b2x�;D&yrmڴ;;;ptt�3v�8��ח�l��X� WcQ85B�s�[�9�yx�!D�/Y���ʾ�B�C^�����p��7<,��B��L���]X���g�0���c
��?�ss�w��Ȳ�ˢ��H�a��u�A�e+-\�;-�Ʌ<����Rh6�o���,���n��+96]��<5��l.\�!ʈ�f�l٠9��WLzBz%�jh�a�	lƱt�KƂ�����{��Z�
�䘗��
��@&{9�Z��lŊIQF���N����G��K�=�(51-`tuh��=�#�[�=)�U���
���-����C�kav�굫]���&M���|p��w�4��K�m.i���W�<��\�b,5��@�xjM����C��•uss�E�*�:z��$����xB,^I^Ъ�a��n!�ƒ8��A���c���MJNvB�*�����zQ�<b�v�C�4uB��v���"R�H����ʽ���3*�l��\��
BTQ������2�J���iˑH�/p���”�o�~;�)Ԫ���}�{��Ҿ5��t�I�}��GfJ�1�p:Lo)�����I%&%���c�A'�f1�[�s��V��C3i-��ٳ�c��#D:����z�y���ap
R���B���^�1Ҫx�/nw��Y�fy!�)�Ҧ͛��*�I�Ø�mVUO��8�e%�Y��������R��O?�hBk���E��[�e!"�� m�=�]m�i妱D�?�4L�^9~�u%,��7Fɀ0Jc
�;r�
Z���7I�cOz[치�(L�9�]*yȽ�C�5^���<�Eb}X��J/�����:�m�J����:v�آ�t��m��u��2� �?�kQs�7n\AFFF{�hB+�c�!�gdT���̷���@j��}��}{ǎ�фVB����_J�G��:u����1�NN�|��|��1:$4d>���N���l{�hB+EFE-���<���۷o��a��cb�Μ5븙��ML�j_���
�Ɯ9s<tp��!
�33�t��9~�>�\�Mh��4&0(h;>�?6q�$c��O�qpp�T^Q�7-=}|hX�իWoZ�f�f4;?==���ի}�ִSTt�u\��3Ç	X�6���1i
�����aS6�Ï>슐��`Ϧ�[F/.!�AHs8t�p�/���ߗ_}�"�)�g�rX�
�^IEND�B`�PK�X�N�e��tweakers_net.recipe#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement

__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
''' Changelog
2012-04-27 DrMerry:
Added cover picture
removed some extra tags
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Tweakers(BasicNewsRecipe):
    title = u'Tweakers.net'
    __author__ = 'Kovid Goyal'
    language = 'nl'
    oldest_article = 4
    max_articles_per_feed = 40
    cover_url = 'http://tweakers.net/ext/launch/g/logo.gif'

    keep_only_tags = [
        dict(name='div', attrs={'class': 'columnwrapper news'}),
        dict(name='div', attrs={'class': 'article'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'reacties'}),
        {
            'id': ['utracker', 'socialButtons', 'b_ac']
        },
        {
            'class': ['sidebar', 'advertorial']
        },
        {
            'class': re.compile('nextPrevious')
        },
    ]
    no_stylesheets = True
    filter_regexps = [r'ads\.doubleclick\.net', r'ad\.doubleclick\.net']

    feeds = [(u'Tweakers.net', u'http://tweakers.net/feeds/nieuws.xml')]

    def preprocess_html(self, soup):
        for a in soup.findAll('a', href=True, rel=True):
            if a['rel'].startswith('imageview'):
                a['src'] = a['href']
                del a['href']
                a.name = 'img'
                for x in a.findAll(True):
                    x.extract()
        return soup

    def postprocess_html(self, soup, first):
        for base in soup.findAll('base'):
            base.extract()
        return soup
PK�X�̹���twitchfilms.png�PNG


IHDR:���`IDATx�c 	���������� �~��ܘ���H�&�
( 	U�W@Sq�I��?� �Z֯�_�,��p8a~7�(�M�IEND�B`�PK�Xa�p44twitchfilms.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
twitchfilm.net/news/
'''
from calibre.web.feeds.news import BasicNewsRecipe


class Twitchfilm(BasicNewsRecipe):
    title = 'Twitch Films'
    __author__ = 'Darko Miletic'
    description = 'Twitch specializes in spreading the news on strange little films from around the world.'
    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    publisher = 'Twitch'
    category = 'twitch, twitchfilm, movie news, movie reviews, cult cinema, independent cinema, anime, foreign cinema, geek talk'
    language = 'en'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    keep_only_tags = [dict(attrs={'class': 'entry'})]
    remove_tags_after = dict(attrs={'class': 'text'})
    remove_tags = [dict(name='div', attrs={'class': ['social', 'categories']}), dict(attrs={'id': 'main-asset'}), dict(name=['meta', 'link', 'iframe', 'embed', 'object'])  # noqa
                   ]

    feeds = [(u'News', u'http://feeds.twitchfilm.net/TwitchEverything')]

    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 = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�X��״	twtfb.png�PNG


IHDR��h6�IDAT�Io�V�y����x�8�4$�2	P�Q�R�K����_�Kտ��?���*��R"��R�Y�ْ��7^���������{�)�zGn��[ �a	���	,	�9ѩ�/^O�c��t<�6�w6{���8�I�J�������
�@�q*�E�f�KX�v����Q�Ȝ�H -
?�i�'�ZˡZ�'>xz�ΥH	FDC@�oW���C��s��W�da|���&x��f�QC���"Bj�Z$Wm���n2+��/`t��?"Ԍ4�	��
�p8\���H�J����xF�[�������{�8a�y�g�mZ��I��F?��r3a������B��f�n�=�^�7S	�4S�/6�-�dz���U4>=�_�lym�p�Jj�d�[o}����O�*�k��j|���ۓ�O王;m\a5]q��n
�����K�������	Cr�^��]>��k��Eg�Uf�H#qˬ�<*MFƯ������#\^�1Y�O93��#�^б�
a�h�������}���A����(™�U
�v&���Ί�c�:�֚�3'R�/<���{i9�}ǙDQ�U����`�i��<!�åJ��~F%��'0CH�A��9h��H���B���pY�C��;~S��oO�ȅ���֣�o~�٨U�љ��>Ng��ť��q��+D���qN�;
 IEND�B`�PK�XFN����twtfb.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.thewaythefutureblogs.com
Frederik Pohl's Blog
'''

from calibre.web.feeds.news import BasicNewsRecipe


class TheWayTheFutureBlogs(BasicNewsRecipe):
    title = 'The Way the Future Blogs'
    __author__ = 'Darko Miletic'
    description = "Frederik Pohl's blog"
    publisher = 'Frederik Pohl'
    category = 'news, SF, books'
    oldest_article = 30
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    extra_css = ' body{font-family: Georgia,serif } '

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }
    remove_tags = [
        dict(name=['meta', 'object', 'embed', 'iframe', 'base', 'link'])]
    keep_only_tags = [dict(attrs={'class': ['post', 'commentlist']})]
    remove_attributes = ['width', 'height', 'lang', 'border']

    feeds = [(u'Posts', u'http://www.thewaythefutureblogs.com/feed/')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X��tyden.cz.png�PNG


IHDR(-S6PLTE��������������������~�1IDATWc`@,��`�����)��f��ԃ��*��O���0���J>x�]�IEND�B`�PK�X%8����tyden.cz.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import unicode_literals
from calibre.web.feeds.recipes import BasicNewsRecipe


class tydenRecipe(BasicNewsRecipe):
    __author__ = 'bubak'
    title = u'Tyden.cz'
    publisher = u''
    description = ''
    oldest_article = 1
    max_articles_per_feed = 20

    feeds = [
        (u'Domácí', u'http://www.tyden.cz/rss/rss.php?rubrika_id=6'),
        (u'Politika', u'http://www.tyden.cz/rss/rss.php?rubrika_id=173'),
        (u'Kauzy', u'http://www.tyden.cz/rss/rss.php?rubrika_id=340')
    ]

    language = 'cs'
    cover_url = 'http://www.tyden.cz/img/tyden-logo.png'
    remove_javascript = True
    no_stylesheets = True
    remove_attributes = []
    remove_tags_before = dict(name='p', attrs={'id': ['breadcrumbs']})
    remove_tags_after = dict(name='p', attrs={'class': ['author']})

    visited_urls = {}

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        if url in self.visited_urls:
            self.log.debug('Ignoring duplicate: ' + url)
            return None
        else:
            self.visited_urls[url] = True
            self.log.debug('Accepting: ' + url)
            return url
PK�Xid�&""
tyzden.png�PNG


IHDR  D���BPLTE�������������������������:c�tRNS(>BDF������������6A��zIDATx���!�ŝ���#���C�0
�78�@��j
�€��G�D�9�W��G҄��_��d@A��D*�,/-�!�ll�E�W-?|��*vb>̦b+Nm�ڏ_�)����V)IEND�B`�PK�X�
�`��
tyzden.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
#
# Copyright 2014 - 2017 Martin Račák <rakyi@riseup.net>
# Copyright 2011 Miroslav Vasko <zemiak@gmail.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import re

from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe

__copyright__ = (
    '2014 - 2017 Martin Račák <martin.racak@riseup.net>,'
    '2011 Miroslav Vasko <zemiak@gmail.com>')
__license__ = 'GPL-3.0+'


class Tyzden(BasicNewsRecipe):
    title = u'.týždeň'
    __author__ = u'Martin Račák, zemiak'
    description = u'Politicko-spoločenský týždenník.'
    publisher = 'www.tyzden.sk'
    publication_type = 'magazine'
    language = 'sk'
    needs_subscription = 'optional'
    use_embedded_content = False
    no_stylesheets = True
    issue_url = 'http://www.tyzden.sk/casopis/'

    keep_only_tags = [
        {
            'name': 'div',
            'attrs': {
                'class': 'section__content section__content--archive'}},
        {
            'name': 'article',
            'attrs': {
                'class': re.compile(r'\barticle\b')}}, ]

    extra_css = """.theme-highlight {
        color: #999;
        text-decoration: none;
    }

    .author-highlight {
        color: #bf1f10;
        text-decoration: none;
    }

    .article__content h2::before {
        content: '.';
        display: inline;
    }

    .article__image-credit,
    .content-photo__image-credit {
        display: block;
        font: 12px "TheSerifSemiLight", arial;
        text-transform: uppercase;
    }

    .article__image-title,
    .image-title {
        padding-top: 2px;
        padding-bottom: 2px;
        margin: 0;
        font: 15px "TheSerifBold", arial;
        border-bottom: 2px solid #bf1f10;
        display: block;
    }

    .teaser__title {
        font: 18px "TheSerifBold", arial;
        color: #bf1f10;
    }

    .teaser__title .highlight {
        color: #000;
    }
    """

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open('https://crm.tyzden.sk/sign/in/')
            br.select_form(nr=0)
            br['username'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def parse_index(self):
        soup = self.index_to_soup(self.issue_url)
        cover_img = soup.findAll('img', 'teaser__image')[-1]
        if cover_img is not None:
            self.cover_url = cover_img['src']

        feeds = []
        teasers = soup.findAll('div', {'class': re.compile(r'\bteaser--list\b')})
        for teaser in teasers:
            section = self.tag_to_string(teaser.find('a', 'theme-heading__wrapper'))
            article_title = self.tag_to_string(
                teaser.find('h1', {'class': re.compile(r'\bteaser__title\b')}))
            article_link = teaser.find('a', 'teaser__link--main')
            article = {
                'title': article_title,
                'url': article_link['href'],
                'date': strftime(' %a, %d %b')}

            if not feeds:
                # First iteration.
                feeds.append((section, [article]))
                continue

            last_section, last_articles = feeds[-1]
            if section == last_section:
                last_articles.append(article)
            else:
                feeds.append((section, [article]))

        return feeds
PK�X;Z
���ua_fooball.png�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<5IDATx�T�MHTQ��M3�2`L16�
e�¢/2]D"1F�,�ժE� 
j%�*�EH�h�'H�����"�0Pj̘g�������<~�w������=���2LN���O^���TI�^	���!�Eސ�V���1��A��'a�.�8�'4�ˆĀEl y���o��D��3p벅�^�Uz�]}'�>$G���v��Ɲ@�	�:p��[�m�Q$N��Ŏ��G���=�_���0�
Hv���'�?��@�[q�-F\
����Zȡ�4�LH4�V���q&��� ��"Z%Z=��g��|v�v��W"����9�h�AU�2�d���f�����\�4WDs(.�A�8x�ޥ�_�^�x�ǁ���1�i&0��q�͠?=�5�aL��i�Ң�d��.��/"�e�	�=;�ԣ�C�6N�VVxs�/�?���[M����דL�!��+mg{��x�k��A���wz�n:�ih?ɪ�k�Eh�3�N�V���=�ץ�A�f{l�F"5�N�>�X� rr��1��s4�$�� ���q����\�IEND�B`�PK�X�5����ua_fooball.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe

class UAFootball(BasicNewsRecipe):

#Russian version
#    title = 'UA-\u0424\u0443\u0442\u0431\u043E\u043B'
#    language = 'ru_UK'
#    feeds = [
#        ('\u041D\u043E\u0432\u043E\u0441\u0442\u0438 \u0444\u0443\u0442\u0431\u043E\u043B\u0430', 'https://www.ua-football.com/rss/all.xml')
#        ]

#Ukrainian version
    title = 'UA-\u0424\u0443\u0442\u0431\u043E\u043B'
    description = ('\u0410\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u0456 \u0442\u0435\u043C\u0438'
                   ' \u0444\u0443\u0442\u0431\u043E\u043B\u044C\u043D\u043E\u0433\u043E'
                   ' \u0436\u0438\u0442\u0442\u044F \u0423\u043A\u0440\u0430\u0457\u043D\u0438 \u0442\u0430'
                   ' \u0432\u0441\u044C\u043E\u0433\u043E \u0441\u0432\u0456\u0442\u0443.')
    language = 'uk'
    feeds = [
        ('\u041D\u043E\u0432\u0438\u043D\u0438', 'https://www.ua-football.com/ua/rss/all.xml')
        ]

    __author__ = 'bugmen00t'
    publisher = '1766 TEAM EOOD'
    category = 'news'
    cover_url = u'https://yt3.googleusercontent.com/11FSvKeWcjFhzKrO7nXZdc-I__UeZ0mhZwbwyOHtnx_1-q6d0zQ2LbOt2duNCY06JVg2cGXS-g=s900-c-k-c0x00ffffff-no-rj'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 200

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'show-post'})

    remove_tags =   [
         dict(name='form'),
         dict(name='iframe'),
         dict(name='div', attrs={'class': 'language'}),
         dict(name='div', attrs={'class': 'article__read-also'}),
         dict(name='div', attrs={'class': 'card-player'}),
         dict(name='div', attrs={'class': 'show-post-socials'})
         ]

# Replacing articles in Ukraininan for RU-feed
#    def print_version(self, url):
#        return url.replace('ua-football.com/ua/', 'ua-football.com/')
PK�X��
ubuntu_pl.png�PNG


IHDR�a�IDATx�b�:8(�42�8�Q�Q$H!ӀP"@]E���к��n  ,@$��vz0ywh�;�as�v�-a
3�I�8C�������:��v�Fq{��׸A�#,��P��	G{P5r���W��]�s=C����!�"l�?�7��Z�PG�>�`��P�
 ��.���!C����;B�O ����cvL F���&����/�pp�m��
IEND�B`�PK�XW��S��ubuntu_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Ubuntu_pl(BasicNewsRecipe):
    title = u'UBUNTU.pl'
    __author__ = 'fenuks'
    description = 'Polskie forum użytkowników Ubuntu Linux. Projekty, porady i dyskusje, gotowe rozwiązania problemów.'
    masthead_url = 'http://ubuntu.pl/img/logo.jpg'
    cover_url = 'http://ubuntu.pl/img/logo.jpg'
    category = 'linux, IT'
    language = 'pl'
    no_stylesheets = True
    remove_empty_feeds = True
    oldest_article = 8
    max_articles_per_feed = 100
    extra_css = '#main {text-align:left;}'
    keep_only_tags = [dict(name='td', attrs={'class': 'teaser-node-mc'}), dict(name='h3', attrs={
        'class': 'entry-title'}), dict(name='div', attrs={'class': 'entry-content'})]
    remove_tags_after = [dict(name='div', attrs={'class': 'content'})]
    feeds = [('Czytelnia Ubuntu', 'http://feeds.feedburner.com/ubuntu-czytelnia'),
             (u'WikiGames', u'http://feeds.feedburner.com/WikiGames')]
PK�X(�ܝugeskriftet.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe

class Ugeskriftet(BasicNewsRecipe):
    title          = 'Ugeskriftet'
    description = 'Ugeskriftet for læger'
    language               = 'dan'
    __author__ = 'https://github.com/morusn'
    oldest_article = 7
    publication_type = 'magazine'
    max_articles_per_feed = 100
    remove_empty_feeds = True
    ignore_duplicate_articles = {'title', 'url'}
    recursion = 5
    encoding = 'utf-8'
    keep_only_tags = [
        dict(attrs={'class': [
            'ArticleIntro',
            'textComponent'
        ]})
        ]
    remove_tags = [dict(name='img')]
    extra_css = """
        h1{font-weight: bold; font-size: large;}
        b{font-weight: bold; font-size: medium;}
        h2{font-weight: bold; font-size: large;}
        h3{font-weight: bold; font-size: large;}
        h4{font-weight: bold; font-size: large;}
	"""

    feeds          = [
        ('Ugeskriftet for læger', 'https://ugeskriftet.dk/rss/forside'),
    ]
    PK�Xll$==ukraiyns_tizhdien.png�PNG


IHDR(-S�PLTE�-����.�Ua�CP��v�'7�y��������&6������������2A���������1@����!1�9G����BO�Zf�[g�FT�������u����w��bm�&5����Xd�6D�4B����.=�%4�P�8eIDATxڭ�CA@�7�_�ضy��E�)G]n��)-ȋZ=�(�z��
�;f�b�a#Lڷ�h$`ڝ���+^�Rt0_,u�K:�lw�����l.ɕ��4|��ԧ�IEND�B`�PK�X�1�7��ukraiyns_tizhdien.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class UATizhden(BasicNewsRecipe):
    title = u'\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0438\u0439 \u0422\u0438\u0436\u0434\u0435\u043d\u044c'
    __author__ = 'rpalyvoda (with fixes by bugmen00t)'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'uk'
    cover_url = 'https://tyzhden.ua/sharing_image.jpg'
    auto_cleanup = True

    feeds = [
        (u'\u041D\u043E\u0432\u0438\u043D\u0438', u'https://tyzhden.ua/RSS/All/')
    ]
PK�Xe%�_��ukrinform_de.png�PNG


IHDR  ���IDATx�b0M�OS�b�5��r�r%��x}�>��z��3F�l۶�̬m�U:۶mOkoU���$=Y�:��n�n]u6����ɟ��Mؿ	��{�&�1;P�E���D8�_㚽��_uϯaQ����3Fa���'o�*��`s=�
zt�~��{i#J?r;͸7ԩ1��8�P��W3�Ge��&:�q��C7�'���|G�3���a�DI�F�	Bg�7�JdrB4�8
�QfI�V�"o`UԵ!3�I��s����!�Ax(Ry+|�{
p�E5
�Y>�#?�H�����@C��`OJ-|;�q��M�F%�<��ں V�i����\꙲�L*��,��^(���Kↆ�v^J6��0
�.�v��g�·�@��헒��|B`}��B�/� A�G![y��t��u)� ���w�WW����AB�7N ��v��_ϴ�U��]IU 6�ʝRe��,*m��
@.&�;gn�Q0m�o&̆��@F2��o�؟0���M��o��Ș����t� ��UѢ�nYKvz&��ҌI�o:p#���us��-7c�0�d1&�|8�1m�W'�>�0�o�@�.|�v�iK�)K&��Ӗ�Q�{&��cFE��hj�@�>���t�yM(�}��S�
�0[���.(_��p ��g�W-\q��}%���p�vp]/@�xׄ�x�NOs{��!ȯW��Fa��n�v��K}���
����N��㲚_���(�i��m,��·ͮ��N��;�2��	���F�+4�N�ع$8�j'lv���z��I|F"��|�ct�>�w�K�g�rd4���})�M��=���l��$��=��J�c��}RTZ�f�0�����ȱ�xT���'>���<�>@>��LT�0?���,Z*T��"�v��=���*,��PK�h��ZL�
C܇!�]tȓ��a
R��@$��2��b=�z���6����	`�m ���o|���?�^��E��a\��nl�z
�л��?@+hL4�Ѹ_��mݚ��l�\uC�g��,�Äi"� v�f�3+1�}�V�	Kڻ_�}k-����7�,�w+��5�mMl�eFA�MX�"�'��Ć�$�F/-��m��)�u���v�R���IEND�B`�PK�X	��--ukrinform_de.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UkrInform(BasicNewsRecipe):
    title = 'UkrInform (Deutsch)'
    __author__ = 'bugmen00t'
    description = 'Nationale Nachrichtenagentur der Ukraine, eine Informationsquelle \u00FCber das politische, wirtschaftliche, soziale, wissenschaftliche, kulturelle und \u00F6ffentliche Leben in der Ukraine und der Welt.'  # noqa
    publisher = 'Ministerium f\u00FCr Kultur und Informationspolitik der Ukraine'
    category = 'newspaper'
    cover_url = u'https://static.ukrinform.com/photos/2022_05/thumb_files/630_360_1651819943-560.jpg'
    language = 'de'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='aside'),
        dict(name='img', attrs={'class': 'pixel'}),
        dict(name='section', attrs={'class': 'read'}),
        dict(name='div', attrs={'data-name': 'int_hidden'})
    ]

    feeds = [
        ('Aktuelle Nachrichten', 'https://www.ukrinform.de/rss/block-lastnews'),
        ('Krieg', 'https://www.ukrinform.de/rss/rubric-ato'),
        ('Politik', 'https://www.ukrinform.de/rss/rubric-polytics'),
        ('Wirtschaft', 'https://www.ukrinform.de/rss/rubric-economy'),
        ('Milit\u00E4r', 'https://www.ukrinform.de/rss/rubric-defense'),
        ('Gesellschaft und Kultur', 'https://www.ukrinform.de/rss/rubric-society'),
        ('Sport', 'https://www.ukrinform.de/rss/rubric-sports'),
        ('Kriminalit\u00E4t', 'https://www.ukrinform.de/rss/rubric-crime'),
        (
            'Notstand und Notf\u00E4lle',
            'https://www.ukrinform.de/rss/rubric-emergencies'
        )
    ]
PK�Xe%�_��ukrinform_en.png�PNG


IHDR  ���IDATx�b0M�OS�b�5��r�r%��x}�>��z��3F�l۶�̬m�U:۶mOkoU���$=Y�:��n�n]u6����ɟ��Mؿ	��{�&�1;P�E���D8�_㚽��_uϯaQ����3Fa���'o�*��`s=�
zt�~��{i#J?r;͸7ԩ1��8�P��W3�Ge��&:�q��C7�'���|G�3���a�DI�F�	Bg�7�JdrB4�8
�QfI�V�"o`UԵ!3�I��s����!�Ax(Ry+|�{
p�E5
�Y>�#?�H�����@C��`OJ-|;�q��M�F%�<��ں V�i����\꙲�L*��,��^(���Kↆ�v^J6��0
�.�v��g�·�@��헒��|B`}��B�/� A�G![y��t��u)� ���w�WW����AB�7N ��v��_ϴ�U��]IU 6�ʝRe��,*m��
@.&�;gn�Q0m�o&̆��@F2��o�؟0���M��o��Ș����t� ��UѢ�nYKvz&��ҌI�o:p#���us��-7c�0�d1&�|8�1m�W'�>�0�o�@�.|�v�iK�)K&��Ӗ�Q�{&��cFE��hj�@�>���t�yM(�}��S�
�0[���.(_��p ��g�W-\q��}%���p�vp]/@�xׄ�x�NOs{��!ȯW��Fa��n�v��K}���
����N��㲚_���(�i��m,��·ͮ��N��;�2��	���F�+4�N�ع$8�j'lv���z��I|F"��|�ct�>�w�K�g�rd4���})�M��=���l��$��=��J�c��}RTZ�f�0�����ȱ�xT���'>���<�>@>��LT�0?���,Z*T��"�v��=���*,��PK�h��ZL�
C܇!�]tȓ��a
R��@$��2��b=�z���6����	`�m ���o|���?�^��E��a\��nl�z
�л��?@+hL4�Ѹ_��mݚ��l�\uC�g��,�Äi"� v�f�3+1�}�V�	Kڻ_�}k-����7�,�w+��5�mMl�eFA�MX�"�'��Ć�$�F/-��m��)�u���v�R���IEND�B`�PK�X9s#{��ukrinform_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UkrInform(BasicNewsRecipe):
    title = 'UkrInform (English)'
    __author__ = 'bugmen00t'
    description = 'State information and news agency of Ukraine.'
    publisher = 'Ministry of Culture and Information Policy of Ukraine'
    category = 'newspaper'
    cover_url = u'https://static.ukrinform.com/photos/2022_05/thumb_files/630_360_1651819943-560.jpg'
    language = 'en_UK'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='aside'),
        dict(name='img', attrs={'class': 'pixel'}),
        dict(name='section', attrs={'class': 'read'}),
        dict(name='div', attrs={'data-name': 'int_hidden'})
    ]

    feeds = [('Latest news', 'https://www.ukrinform.net/rss/block-lastnews'),
             ('War', 'https://www.ukrinform.net/rss/rubric-ato'),
             ('Politics', 'https://www.ukrinform.net/rss/rubric-polytics'),
             ('Economy', 'https://www.ukrinform.net/rss/rubric-economy'),
             ('Defense', 'https://www.ukrinform.net/rss/rubric-defense'),
             ('Society and Culture', 'https://www.ukrinform.net/rss/rubric-society'),
             ('Sports', 'https://www.ukrinform.net/rss/rubric-sports'),
             ('Crime', 'https://www.ukrinform.net/rss/rubric-crime'),
             (
                 'Accidents and Emergencies',
                 'https://www.ukrinform.net/rss/rubric-emergencies'
             )]
PK�Xe%�_��ukrinform_es.png�PNG


IHDR  ���IDATx�b0M�OS�b�5��r�r%��x}�>��z��3F�l۶�̬m�U:۶mOkoU���$=Y�:��n�n]u6����ɟ��Mؿ	��{�&�1;P�E���D8�_㚽��_uϯaQ����3Fa���'o�*��`s=�
zt�~��{i#J?r;͸7ԩ1��8�P��W3�Ge��&:�q��C7�'���|G�3���a�DI�F�	Bg�7�JdrB4�8
�QfI�V�"o`UԵ!3�I��s����!�Ax(Ry+|�{
p�E5
�Y>�#?�H�����@C��`OJ-|;�q��M�F%�<��ں V�i����\꙲�L*��,��^(���Kↆ�v^J6��0
�.�v��g�·�@��헒��|B`}��B�/� A�G![y��t��u)� ���w�WW����AB�7N ��v��_ϴ�U��]IU 6�ʝRe��,*m��
@.&�;gn�Q0m�o&̆��@F2��o�؟0���M��o��Ș����t� ��UѢ�nYKvz&��ҌI�o:p#���us��-7c�0�d1&�|8�1m�W'�>�0�o�@�.|�v�iK�)K&��Ӗ�Q�{&��cFE��hj�@�>���t�yM(�}��S�
�0[���.(_��p ��g�W-\q��}%���p�vp]/@�xׄ�x�NOs{��!ȯW��Fa��n�v��K}���
����N��㲚_���(�i��m,��·ͮ��N��;�2��	���F�+4�N�ع$8�j'lv���z��I|F"��|�ct�>�w�K�g�rd4���})�M��=���l��$��=��J�c��}RTZ�f�0�����ȱ�xT���'>���<�>@>��LT�0?���,Z*T��"�v��=���*,��PK�h��ZL�
C܇!�]tȓ��a
R��@$��2��b=�z���6����	`�m ���o|���?�^��E��a\��nl�z
�л��?@+hL4�Ѹ_��mݚ��l�\uC�g��,�Äi"� v�f�3+1�}�V�	Kڻ_�}k-����7�,�w+��5�mMl�eFA�MX�"�'��Ć�$�F/-��m��)�u���v�R���IEND�B`�PK�X�H�WWukrinform_es.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UkrInform(BasicNewsRecipe):
    title          		  = 'UkrInform (Espa\u00F1ol)'
    __author__            = 'bugmen00t'
    description           = 'Agencia de noticias nacional de Ucrania, fuente de informaci\u00F3n sobre la vida pol\u00EDtica, econ\u00F3mica, social, cient\u00EDfica, cultural y p\u00FAblica en Ucrania y en el extranjero.'  # noqa
    publisher             = 'Ministerio de Cultura y Pol\u00EDtica de Informaci\u00F3n de Ucrania'
    category              = 'newspaper'
    cover_url = u'https://static.ukrinform.com/photos/2022_05/thumb_files/630_360_1651819943-560.jpg'
    language              = 'es'
    no_stylesheets        = True
    remove_javascript = False
    auto_cleanup   = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags =   [
        dict(name='aside'),
        dict(name='img', attrs={'class': 'pixel'}),
        dict(name='section', attrs={'class': 'read'}),
        dict(name='div', attrs={'data-name': 'int_hidden'})
        ]

    feeds = [
        ('\u00DAltimas noticias', 'https://www.ukrinform.es/rss/block-lastnews'),
        ('Guerra', 'https://www.ukrinform.es/rss/rubric-ato'),
        ('Pol\u00EDtica', 'https://www.ukrinform.es/rss/rubric-polytics'),
        ('Econom\u00EDa', 'https://www.ukrinform.es/rss/rubric-economy'),
        ('Defensa', 'https://www.ukrinform.es/rss/rubric-defense'),
        ('Sociedad y Cultura', 'https://www.ukrinform.es/rss/rubric-society'),
        ('Deportes', 'https://www.ukrinform.es/rss/rubric-sports'),
        ('Crimen', 'https://www.ukrinform.es/rss/rubric-crime'),
        ('Desastres y emergencias', 'https://www.ukrinform.es/rss/rubric-emergencies')
    ]
PK�Xe%�_��ukrinform_fr.png�PNG


IHDR  ���IDATx�b0M�OS�b�5��r�r%��x}�>��z��3F�l۶�̬m�U:۶mOkoU���$=Y�:��n�n]u6����ɟ��Mؿ	��{�&�1;P�E���D8�_㚽��_uϯaQ����3Fa���'o�*��`s=�
zt�~��{i#J?r;͸7ԩ1��8�P��W3�Ge��&:�q��C7�'���|G�3���a�DI�F�	Bg�7�JdrB4�8
�QfI�V�"o`UԵ!3�I��s����!�Ax(Ry+|�{
p�E5
�Y>�#?�H�����@C��`OJ-|;�q��M�F%�<��ں V�i����\꙲�L*��,��^(���Kↆ�v^J6��0
�.�v��g�·�@��헒��|B`}��B�/� A�G![y��t��u)� ���w�WW����AB�7N ��v��_ϴ�U��]IU 6�ʝRe��,*m��
@.&�;gn�Q0m�o&̆��@F2��o�؟0���M��o��Ș����t� ��UѢ�nYKvz&��ҌI�o:p#���us��-7c�0�d1&�|8�1m�W'�>�0�o�@�.|�v�iK�)K&��Ӗ�Q�{&��cFE��hj�@�>���t�yM(�}��S�
�0[���.(_��p ��g�W-\q��}%���p�vp]/@�xׄ�x�NOs{��!ȯW��Fa��n�v��K}���
����N��㲚_���(�i��m,��·ͮ��N��;�2��	���F�+4�N�ع$8�j'lv���z��I|F"��|�ct�>�w�K�g�rd4���})�M��=���l��$��=��J�c��}RTZ�f�0�����ȱ�xT���'>���<�>@>��LT�0?���,Z*T��"�v��=���*,��PK�h��ZL�
C܇!�]tȓ��a
R��@$��2��b=�z���6����	`�m ���o|���?�^��E��a\��nl�z
�л��?@+hL4�Ѹ_��mݚ��l�\uC�g��,�Äi"� v�f�3+1�}�V�	Kڻ_�}k-����7�,�w+��5�mMl�eFA�MX�"�'��Ć�$�F/-��m��)�u���v�R���IEND�B`�PK�Xb��__ukrinform_fr.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UkrInform(BasicNewsRecipe):
    title = 'UkrInform (Fran\u00E7ais)'
    __author__ = 'bugmen00t'
    description = 'Agence de presse nationale de l\u0027Ukraine. C\u2019est une source d\u0027informations sur la vie politique, \u00E9conomique, scientifique, culturelle et sociale en Ukraine et \u00E0 l\u0027\u00E9tranger.'  # noqa
    publisher = 'Minist\u00E8re de la culture et de la politique d\u0027information de l\u0027Ukraine'
    category = 'newspaper'
    cover_url = u'https://static.ukrinform.com/photos/2022_05/thumb_files/630_360_1651819943-560.jpg'
    language = 'fr'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='aside'),
        dict(name='img', attrs={'class': 'pixel'}),
        dict(name='section', attrs={'class': 'read'}),
        dict(name='div', attrs={'data-name': 'int_hidden'})
    ]

    feeds = [('Derni\u00E8res infos', 'https://www.ukrinform.fr/rss/block-lastnews'),
             ('Guerre', 'https://www.ukrinform.fr/rss/rubric-ato'),
             ('Politique', 'https://www.ukrinform.fr/rss/rubric-polytics'),
             ('\u00C9conomie', 'https://www.ukrinform.fr/rss/rubric-economy'),
             ('D\u00E9fense', 'https://www.ukrinform.fr/rss/rubric-defense'),
             (
                 'Soci\u00E9t\u00E9 et culture',
                 'https://www.ukrinform.fr/rss/rubric-society'
             ), ('Sport', 'https://www.ukrinform.fr/rss/rubric-sports'),
             ('Criminalit\u00E9', 'https://www.ukrinform.fr/rss/rubric-crime'),
             ('Accidents', 'https://www.ukrinform.fr/rss/rubric-emergencies')]
PK�Xe%�_��ukrinform_ja.png�PNG


IHDR  ���IDATx�b0M�OS�b�5��r�r%��x}�>��z��3F�l۶�̬m�U:۶mOkoU���$=Y�:��n�n]u6����ɟ��Mؿ	��{�&�1;P�E���D8�_㚽��_uϯaQ����3Fa���'o�*��`s=�
zt�~��{i#J?r;͸7ԩ1��8�P��W3�Ge��&:�q��C7�'���|G�3���a�DI�F�	Bg�7�JdrB4�8
�QfI�V�"o`UԵ!3�I��s����!�Ax(Ry+|�{
p�E5
�Y>�#?�H�����@C��`OJ-|;�q��M�F%�<��ں V�i����\꙲�L*��,��^(���Kↆ�v^J6��0
�.�v��g�·�@��헒��|B`}��B�/� A�G![y��t��u)� ���w�WW����AB�7N ��v��_ϴ�U��]IU 6�ʝRe��,*m��
@.&�;gn�Q0m�o&̆��@F2��o�؟0���M��o��Ș����t� ��UѢ�nYKvz&��ҌI�o:p#���us��-7c�0�d1&�|8�1m�W'�>�0�o�@�.|�v�iK�)K&��Ӗ�Q�{&��cFE��hj�@�>���t�yM(�}��S�
�0[���.(_��p ��g�W-\q��}%���p�vp]/@�xׄ�x�NOs{��!ȯW��Fa��n�v��K}���
����N��㲚_���(�i��m,��·ͮ��N��;�2��	���F�+4�N�ع$8�j'lv���z��I|F"��|�ct�>�w�K�g�rd4���})�M��=���l��$��=��J�c��}RTZ�f�0�����ȱ�xT���'>���<�>@>��LT�0?���,Z*T��"�v��=���*,��PK�h��ZL�
C܇!�]tȓ��a
R��@$��2��b=�z���6����	`�m ���o|���?�^��E��a\��nl�z
�л��?@+hL4�Ѹ_��mݚ��l�\uC�g��,�Äi"� v�f�3+1�}�V�	Kڻ_�}k-����7�,�w+��5�mMl�eFA�MX�"�'��Ć�$�F/-��m��)�u���v�R���IEND�B`�PK�XQ/L�HHukrinform_ja.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UkrInform(BasicNewsRecipe):
    title = '\u30A6\u30AF\u30EB\u30A4\u30F3\u30D5\u30A9\u30EB\u30E0\uFF08UkrInform\uFF09'
    __author__ = 'bugmen00t'
    description = '\u30A6\u30AF\u30E9\u30A4\u30CA\u3067\u552F\u4E00\u306E\u56FD\u55B6\u901A\u4FE1\u793E\u3067\u3059\u3001\u56FD\u5185\u6700\u5927\u306E\u5730\u65B9\u652F\u90E8\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3068\u8907\u6570\u306E\u5916\u56FD\u652F\u5C40\u3092\u6709\u3057\u3066\u3044\u307E\u3059\u3002'  # noqa
    publisher = '\u30A6\u30AF\u30E9\u30A4\u30CA\u6587\u5316\u30FB\u60C5\u5831\u653F\u7B56\u7701'
    category = 'newspaper'
    cover_url = u'https://static.ukrinform.com/photos/2022_05/thumb_files/630_360_1651819943-560.jpg'
    language = 'ja'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='aside'),
        dict(name='img', attrs={'class': 'pixel'}),
        dict(name='section', attrs={'class': 'read'}),
        dict(name='div', attrs={'data-name': 'int_hidden'})
    ]

    feeds = [
        (
            '\u65B0\u7740\u30CB\u30E5\u30FC\u30B9',
            'https://www.ukrinform.jp/rss/block-lastnews'
        ), ('\u6226\u4E89', 'https://www.ukrinform.jp/rss/rubric-ato'),
        ('\u653F\u6CBB', 'https://www.ukrinform.jp/rss/rubric-polytics'),
        ('\u7D4C\u6E08', 'https://www.ukrinform.jp/rss/rubric-economy'),
        ('\u9632\u885B', 'https://www.ukrinform.jp/rss/rubric-defense'),
        (
            '\u793E\u4F1A\u30FB\u6587\u5316',
            'https://www.ukrinform.jp/rss/rubric-society'
        ),
        ('\u30B9\u30DD\u30FC\u30C4', 'https://www.ukrinform.jp/rss/rubric-sports'),
        ('\u72AF\u7F6A', 'https://www.ukrinform.jp/rss/rubric-crime'),
        (
            '\u4E8B\u6545\u30FB\u7DCA\u6025\u4E8B\u614B',
            'https://www.ukrinform.jp/rss/rubric-emergencies'
        )
    ]
PK�Xe%�_��ukrinform_pl.png�PNG


IHDR  ���IDATx�b0M�OS�b�5��r�r%��x}�>��z��3F�l۶�̬m�U:۶mOkoU���$=Y�:��n�n]u6����ɟ��Mؿ	��{�&�1;P�E���D8�_㚽��_uϯaQ����3Fa���'o�*��`s=�
zt�~��{i#J?r;͸7ԩ1��8�P��W3�Ge��&:�q��C7�'���|G�3���a�DI�F�	Bg�7�JdrB4�8
�QfI�V�"o`UԵ!3�I��s����!�Ax(Ry+|�{
p�E5
�Y>�#?�H�����@C��`OJ-|;�q��M�F%�<��ں V�i����\꙲�L*��,��^(���Kↆ�v^J6��0
�.�v��g�·�@��헒��|B`}��B�/� A�G![y��t��u)� ���w�WW����AB�7N ��v��_ϴ�U��]IU 6�ʝRe��,*m��
@.&�;gn�Q0m�o&̆��@F2��o�؟0���M��o��Ș����t� ��UѢ�nYKvz&��ҌI�o:p#���us��-7c�0�d1&�|8�1m�W'�>�0�o�@�.|�v�iK�)K&��Ӗ�Q�{&��cFE��hj�@�>���t�yM(�}��S�
�0[���.(_��p ��g�W-\q��}%���p�vp]/@�xׄ�x�NOs{��!ȯW��Fa��n�v��K}���
����N��㲚_���(�i��m,��·ͮ��N��;�2��	���F�+4�N�ع$8�j'lv���z��I|F"��|�ct�>�w�K�g�rd4���})�M��=���l��$��=��J�c��}RTZ�f�0�����ȱ�xT���'>���<�>@>��LT�0?���,Z*T��"�v��=���*,��PK�h��ZL�
C܇!�]tȓ��a
R��@$��2��b=�z���6����	`�m ���o|���?�^��E��a\��nl�z
�л��?@+hL4�Ѹ_��mݚ��l�\uC�g��,�Äi"� v�f�3+1�}�V�	Kڻ_�}k-����7�,�w+��5�mMl�eFA�MX�"�'��Ć�$�F/-��m��)�u���v�R���IEND�B`�PK�X@�\JJukrinform_pl.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UkrInform(BasicNewsRecipe):
    title = 'UkrInform (polska)'
    __author__ = 'bugmen00t'
    description = 'Krajowa agencja informacyjna Ukrainy, \u017Ar\u00F3d\u0142o informacji o \u017Cyciu politycznym, gospodarczym, spo\u0142ecznym, naukowym, kulturalnym i spo\u0142ecznym na Ukrainie i za granic\u0105.'  # noqa
    publisher = 'Ministerstwo Kultury i Polityki Informacyjnej Ukrainy'
    category = 'newspaper'
    cover_url = u'https://static.ukrinform.com/photos/2022_05/thumb_files/630_360_1651819943-560.jpg'
    language = 'pl'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 30

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='aside'),
        dict(name='img', attrs={'class': 'pixel'}),
        dict(name='section', attrs={'class': 'read'}),
        dict(name='div', attrs={'data-name': 'int_hidden'})
    ]

    feeds = [
        ('Najnowsze wiadomo\u015Bci', 'https://www.ukrinform.pl/rss/block-lastnews'),
        ('Wojna', 'https://www.ukrinform.pl/rss/rubric-ato'),
        ('Polityka', 'https://www.ukrinform.pl/rss/rubric-polytics'),
        ('Gospodarka', 'https://www.ukrinform.pl/rss/rubric-economy'),
        ('Obrona', 'https://www.ukrinform.pl/rss/rubric-defense'),
        (
            'Spo\u0142ecze\u0144stwo i kultura',
            'https://www.ukrinform.pl/rss/rubric-society'
        ), ('Sport', 'https://www.ukrinform.pl/rss/rubric-sports'),
        ('Wydarzenia kryminalne', 'https://www.ukrinform.pl/rss/rubric-crime'),
        (
            'Zdarzenia i bezpiecze\u0144stwo',
            'https://www.ukrinform.pl/rss/rubric-emergencies'
        )
    ]
PK�Xe%�_��ukrinform_ru.png�PNG


IHDR  ���IDATx�b0M�OS�b�5��r�r%��x}�>��z��3F�l۶�̬m�U:۶mOkoU���$=Y�:��n�n]u6����ɟ��Mؿ	��{�&�1;P�E���D8�_㚽��_uϯaQ����3Fa���'o�*��`s=�
zt�~��{i#J?r;͸7ԩ1��8�P��W3�Ge��&:�q��C7�'���|G�3���a�DI�F�	Bg�7�JdrB4�8
�QfI�V�"o`UԵ!3�I��s����!�Ax(Ry+|�{
p�E5
�Y>�#?�H�����@C��`OJ-|;�q��M�F%�<��ں V�i����\꙲�L*��,��^(���Kↆ�v^J6��0
�.�v��g�·�@��헒��|B`}��B�/� A�G![y��t��u)� ���w�WW����AB�7N ��v��_ϴ�U��]IU 6�ʝRe��,*m��
@.&�;gn�Q0m�o&̆��@F2��o�؟0���M��o��Ș����t� ��UѢ�nYKvz&��ҌI�o:p#���us��-7c�0�d1&�|8�1m�W'�>�0�o�@�.|�v�iK�)K&��Ӗ�Q�{&��cFE��hj�@�>���t�yM(�}��S�
�0[���.(_��p ��g�W-\q��}%���p�vp]/@�xׄ�x�NOs{��!ȯW��Fa��n�v��K}���
����N��㲚_���(�i��m,��·ͮ��N��;�2��	���F�+4�N�ع$8�j'lv���z��I|F"��|�ct�>�w�K�g�rd4���})�M��=���l��$��=��J�c��}RTZ�f�0�����ȱ�xT���'>���<�>@>��LT�0?���,Z*T��"�v��=���*,��PK�h��ZL�
C܇!�]tȓ��a
R��@$��2��b=�z���6����	`�m ���o|���?�^��E��a\��nl�z
�л��?@+hL4�Ѹ_��mݚ��l�\uC�g��,�Äi"� v�f�3+1�}�V�	Kڻ_�}k-����7�,�w+��5�mMl�eFA�MX�"�'��Ć�$�F/-��m��)�u���v�R���IEND�B`�PK�X�6����ukrinform_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UkrInform(BasicNewsRecipe):
    title = '\u0423\u043A\u0440\u0438\u043D\u0444\u043E\u0440\u043C'
    __author__ = 'bugmen00t'
    description = '\u0423\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u043E\u0435 \u0433\u043E\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0435 \u043D\u0430\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E, \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u043E \u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439, \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0447\u0435\u0441\u043A\u043E\u0439, \u0441\u043E\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0439, \u043D\u0430\u0443\u0447\u043D\u043E\u0439, \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u043D\u043E\u0439, \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0439 \u0436\u0438\u0437\u043D\u0438 \u0432 \u0423\u043A\u0440\u0430\u0438\u043D\u0435 \u0438 \u0437\u0430 \u0440\u0443\u0431\u0435\u0436\u043E\u043C.'  # noqa
    publisher = '\u041C\u0438\u043D\u0438\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0438 \u0423\u043A\u0440\u0430\u0438\u043D\u044B'  # noqa
    category = 'newspaper'
    cover_url = u'https://www.ukrinform.ru/img/logo_rus.svg'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 3
    max_articles_per_feed = 30

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='aside'),
        dict(name='img', attrs={'class': 'pixel'}),
        dict(name='section', attrs={'class': 'read'}),
        dict(name='div', attrs={'data-name': 'int_hidden'})
    ]

    feeds = [
        (
            '\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.ukrinform.ru/rss/block-lastnews'
        ),
        (
            '\u0412\u043E\u0439\u043D\u0430',
            'https://www.ukrinform.ru/rss/rubric-ato'
        ),
        (
            '#UA\u0440\u0430\u0437\u043E\u043C',
            'https://www.ukrinform.ru/rss/rubric-uarazom'
        ),
        (
            '\u041F\u043E\u043B\u0438\u0442\u0438\u043A\u0430',
            'https://www.ukrinform.ru/rss/rubric-polytics'
        ),
        (
            '\u042D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0430',
            'https://www.ukrinform.ru/rss/rubric-economy'
        ),
        ('\u041C\u0438\u0440', 'https://www.ukrinform.ru/rss/rubric-world'),
        (
            '\u041E\u0431\u0449\u0435c\u0442\u0432\u043E',
            'https://www.ukrinform.ru/rss/rubric-society'
        ),
        (
            '\u041A\u0443\u043B\u044C\u0442\u0443\u0440\u0430',
            'https://www.ukrinform.ru/rss/rubric-culture'
        ),
        (
            '\u0420\u0435\u0433\u0438\u043E\u043D\u044B',
            'https://www.ukrinform.ru/rss/rubric-regions'
        ),
        ('\u041A\u0438\u0435\u0432', 'https://www.ukrinform.ru/rss/rubric-kyiv'),
        ('\u041A\u0440\u044B\u043C', 'https://www.ukrinform.ru/rss/rubric-crimea'),
        (
            '\u0421\u043F\u043E\u0440\u0442',
            'https://www.ukrinform.ru/rss/rubric-sports'
        ),
        (
            '\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438',
            'https://www.ukrinform.ru/rss/rubric-technology'
        ),
    ]
PK�Xe%�_��ukrinform_uk.png�PNG


IHDR  ���IDATx�b0M�OS�b�5��r�r%��x}�>��z��3F�l۶�̬m�U:۶mOkoU���$=Y�:��n�n]u6����ɟ��Mؿ	��{�&�1;P�E���D8�_㚽��_uϯaQ����3Fa���'o�*��`s=�
zt�~��{i#J?r;͸7ԩ1��8�P��W3�Ge��&:�q��C7�'���|G�3���a�DI�F�	Bg�7�JdrB4�8
�QfI�V�"o`UԵ!3�I��s����!�Ax(Ry+|�{
p�E5
�Y>�#?�H�����@C��`OJ-|;�q��M�F%�<��ں V�i����\꙲�L*��,��^(���Kↆ�v^J6��0
�.�v��g�·�@��헒��|B`}��B�/� A�G![y��t��u)� ���w�WW����AB�7N ��v��_ϴ�U��]IU 6�ʝRe��,*m��
@.&�;gn�Q0m�o&̆��@F2��o�؟0���M��o��Ș����t� ��UѢ�nYKvz&��ҌI�o:p#���us��-7c�0�d1&�|8�1m�W'�>�0�o�@�.|�v�iK�)K&��Ӗ�Q�{&��cFE��hj�@�>���t�yM(�}��S�
�0[���.(_��p ��g�W-\q��}%���p�vp]/@�xׄ�x�NOs{��!ȯW��Fa��n�v��K}���
����N��㲚_���(�i��m,��·ͮ��N��;�2��	���F�+4�N�ع$8�j'lv���z��I|F"��|�ct�>�w�K�g�rd4���})�M��=���l��$��=��J�c��}RTZ�f�0�����ȱ�xT���'>���<�>@>��LT�0?���,Z*T��"�v��=���*,��PK�h��ZL�
C܇!�]tȓ��a
R��@$��2��b=�z���6����	`�m ���o|���?�^��E��a\��nl�z
�л��?@+hL4�Ѹ_��mݚ��l�\uC�g��,�Äi"� v�f�3+1�}�V�	Kڻ_�}k-����7�,�w+��5�mMl�eFA�MX�"�'��Ć�$�F/-��m��)�u���v�R���IEND�B`�PK�X�+^�BBukrinform_uk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UkrInform(BasicNewsRecipe):
    title = '\u0423\u043A\u0440\u0456\u043D\u0444\u043E\u0440\u043C'
    __author__ = 'bugmen00t'
    description = '\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0435 \u0434\u0435\u0440\u0436\u0430\u0432\u043D\u0435 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E, \u0434\u0436\u0435\u0440\u0435\u043B\u043E \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0457 \u043F\u0440\u043E \u043F\u043E\u043B\u0456\u0442\u0438\u0447\u043D\u0435, \u0435\u043A\u043E\u043D\u043E\u043C\u0456\u0447\u043D\u0435, \u0441\u043E\u0446\u0456\u0430\u043B\u044C\u043D\u0435, \u043D\u0430\u0443\u043A\u043E\u0432\u0435, \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u043D\u0435, \u0441\u0443\u0441\u043F\u0456\u043B\u044C\u043D\u0435 \u0436\u0438\u0442\u0442\u044F \u0432 \u0423\u043A\u0440\u0430\u0457\u043D\u0456 \u0442\u0430 \u0437\u0430 \u043A\u043E\u0440\u0434\u043E\u043D\u043E\u043C.'  # noqa
    publisher = '\u041C\u0456\u043D\u0456\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043E \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u0438 \u0442\u0430 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u043E\u0457 \u043F\u043E\u043B\u0456\u0442\u0438\u043A\u0438 \u0423\u043A\u0440\u0430\u0457\u043D\u0438'  # noqa
    category = 'newspaper'
    cover_url = u'https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Logo_ukr_%281%29.svg/2560px-Logo_ukr_%281%29.svg.png'
    language = 'uk'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 2
    max_articles_per_feed = 30

    remove_tags_before = dict(name='article')

    remove_tags_after = dict(name='article')

    remove_tags = [
        dict(name='aside'),
        dict(name='img', attrs={'class': 'pixel'}),
        dict(name='section', attrs={'class': 'read'}),
        dict(name='div', attrs={'data-name': 'int_hidden'})
    ]

    feeds = [
        (
            '\u041E\u0441\u0442\u0430\u043D\u043D\u0456 \u043D\u043E\u0432\u0438\u043D\u0438',
            'https://www.ukrinform.ua/rss/block-lastnews'
        ),
        (
            '\u0412\u0456\u0439\u043D\u0430',
            'https://www.ukrinform.ua/rss/rubric-ato'
        ),
        (
            '#UA\u0440\u0430\u0437\u043E\u043C',
            'https://www.ukrinform.ua/rss/rubric-uarazom'
        ),
        (
            '\u041F\u043E\u043B\u0456\u0442\u0438\u043A\u0430',
            'https://www.ukrinform.ua/rss/rubric-polytics'
        ),
        (
            '\u0415\u043A\u043E\u043D\u043E\u043C\u0456\u043A\u0430',
            'https://www.ukrinform.ua/rss/rubric-economy'
        ),
        ('\u0421\u0432\u0456\u0442', 'https://www.ukrinform.ua/rss/rubric-world'),
        (
            '\u0421\u0443c\u043F\u0456\u043B\u044Cc\u0442\u0432\u043E',
            'https://www.ukrinform.ua/rss/rubric-society'
        ),
        (
            '\u041A\u0443\u043B\u044C\u0442\u0443\u0440\u0430',
            'https://www.ukrinform.ua/rss/rubric-culture'
        ),
        (
            '\u0420\u0435\u0433\u0456\u043E\u043D\u0438',
            'https://www.ukrinform.ua/rss/rubric-regions'
        ),
        ('\u041A\u0438\u0457\u0432', 'https://www.ukrinform.ua/rss/rubric-kyiv'),
        ('\u041A\u0440\u0438\u043C', 'https://www.ukrinform.ua/rss/rubric-crimea'),
        (
            '\u0421\u043F\u043E\u0440\u0442',
            'https://www.ukrinform.ua/rss/rubric-sports'
        ),
        (
            '\u0414\u0456\u0430c\u043F\u043E\u0440\u0430',
            'https://www.ukrinform.ua/rss/rubric-diaspora'
        ),
        (
            '\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0456\u0457',
            'https://www.ukrinform.ua/rss/rubric-technology'
        ),
    ]
PK�X�R���ultimahora.png�PNG


IHDR�a�IDATx�c�
HOK�VWS[XTT�0PUט��Z{�á�����@�p��8儡ƒ�e>@1���{��1��n����FM��i�wG���_�	�b�k�	k�r�����L ����1311@1P/#H�����#�Ę��1X�gc&
}O���h-�������B���3|�ve���WO:y܅���$���?��I�z�B����@��d#(Թ�4ܸ�u�-�����.ɂ��?V'���&*�l#�o ��FP������~��
8(�0���⿌� ""��/P��ϟ�����ɓ�@U�P������^�ݵ|ٲܣG��HHH<�� ��c�~��?@���mf�������ޞ�8c#�}��mll��57'�Z�Lࢋ��3vf;of+1Ýʒ�F�'n��1�9	�6���IEND�B`�PK�X%
n:ooultimahora.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
ultimahora.com
'''

from calibre.web.feeds.news import BasicNewsRecipe


class UltimaHora_py(BasicNewsRecipe):
    title = 'Ultima Hora'
    __author__ = 'Darko Miletic'
    description = 'Noticias de Paraguay y el resto del mundo'
    publisher = 'EDITORIAL EL PAIS S.A.'
    category = 'news, politics, Paraguay'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'cp1252'
    use_embedded_content = False
    language = 'es_PY'
    remove_empty_feeds = True
    publication_type = 'newspaper'
    masthead_url = 'http://www.ultimahora.com/imgs/uh-com.gif'
    extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} .sub_titulo_mediano,.TituloNota{font-family: Georgia,"Times New Roman",Times,serif} .sub_titulo_mediano{font-weight: bold} '  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        dict(name=['form', 'iframe', 'embed', 'object', 'link', 'base', 'table'])]
    keep_only_tags = [
        dict(attrs={'id': ['nota_titulo', 'nota_copete', 'texto']})]

    feeds = [

    (u'Arte y Espectaculos', u'http://www.ultimahora.com/adjuntos/rss/UHEspectaculos.xml'),
    (u'Ciudad del Este', u'http://www.ultimahora.com/adjuntos/rss/UHCDE.xml'),
    (u'Deportes', u'http://www.ultimahora.com/adjuntos/rss/UHDeportes.xml'),
    (u'Ultimo momento', u'http://www.ultimahora.com/adjuntos/rss/UltimoMomento.xml'),
    (u'Nacionales', u'http://www.ultimahora.com/adjuntos/rss/uh-rss-nacionales.xml'),
    (u'Politica', u'http://www.ultimahora.com/adjuntos/rss/uh-rss-politica.xml'),
    (u'Sucesos', u'http://www.ultimahora.com/adjuntos/rss/uh-rss-sucesos.xml'),
    (u'Economia', u'http://www.ultimahora.com/adjuntos/rss/uh-rss-economia.xml'),
    (u'Ciencia y Tecnologia', u'http://www.ultimahora.com/adjuntos/rss/uh-rss-ciencia.xml')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�X�h��SSuncrate.png�PNG


IHDR7���IDATx�c�
j~����U0�c��b�����IEND�B`�PK�X���	�	uncrate.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.uncrate.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Uncrate(BasicNewsRecipe):
    title = 'Uncrate'
    __author__ = 'Darko Miletic'
    description = 'Uncrate is a web magazine for guys who love stuff. Our team digs up the best gadgets, clothes, cars, DVDs and more. New items are posted daily. Enjoy responsively.'  # noqa
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    publisher = 'Zombie corp.'
    category = 'news, gadgets, clothes, cars, DVDs'
    lang = 'en'
    language = 'en'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    keep_only_tags = [dict(name='div', attrs={'class': 'lefttext'})]
    remove_tags_after = dict(name='div', attrs={'class': 'serif'})
    remove_tags = [dict(name=['object', 'link', 'script', 'iframe', 'form'])]

    extra_css = '''
        .serif{font-family:Georgia,Rockwell,'Times New Roman',Times,serif; font-weight:normal; font-size: x-small; }
        h1{ font-family:Verdana,Arial,Helvetica,sans-serif;font-size:x-large; font-weight:bold;}
        .byline{ font-family:Verdana,Arial,Helvetica,sans-serif;font-size: x-small; color:#FF4000;}
        .posted{ font-family:Verdana,Arial,Helvetica,sans-serif;font-size: x-small;}
        .answer{ font-family:Verdana,Arial,Helvetica,sans-serif;font-size: x-small;}
        a{color:#FF4000;}
    '''

    feeds = [(u'Articles', u'http://feeds.feedburner.com/uncrate')]

    def preprocess_html(self, soup):
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        for item in soup.findAll(style=True):
            del item['style']
        return self.adeify_images(soup)
PK�X�2��
unian_net.png�PNG


IHDR(-S6PLTE--0,,0--1,,1++2���,,0���KKO���IIL����������������졡�5z�ItRNSJ�I�H�FBIDATx�c``dC�L>03	NV0`�r@ܬP�`���R/�?DH@���cbF���W���IEND�B`�PK�X��s�AAunian_net.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Unian(BasicNewsRecipe):
    title = '\u0423\u041D\u0418\u0410\u041D '
    description = 'Украинское Независимое Информационное Агентство Новостей – первое в Украине и самое большое независимое информационное агентство, основанное в 1993 году, лидер среди новостных медиа страны, самый цитируемый источник новостей о событиях в стране.'  # noqa
    __author__ = 'bugmen00t'
    publication_type = 'newspaper'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'ru_UK'
    cover_url = 'https://www.unian.net/images/unian-512x512.png'
    auto_cleanup = False
    no_stylesheets = True

    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(name='div', attrs={'class': 'article-text'})
    remove_tags = [
        dict(name='span', attrs={'class': 'article__info-item comments'}),
        dict(name='span', attrs={'class': 'article__info-item views'}),
        dict(name='div', attrs={'class': 'read-also-slider'}),
        dict(name='div', attrs={'class': 'nts-video-wrapper'})
    ]

    feeds = [
    (u'\u0423\u041D\u0418\u0410\u041D', u'https://rss.unian.net/site/news_rus.rss')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X�2��unian_net_en.png�PNG


IHDR(-S6PLTE--0,,0--1,,1++2���,,0���KKO���IIL����������������졡�5z�ItRNSJ�I�H�FBIDATx�c``dC�L>03	NV0`�r@ܬP�`���R/�?DH@���cbF���W���IEND�B`�PK�X�Wrhhunian_net_en.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe

class Unian(BasicNewsRecipe):
    title = 'UNIAN'
    description = ('UNIAN (Ukrainian Independent News Agency of News) is the largest independent news agency,'
                   ' first in Ukraine, founded in 1993, remaining the leader among the country\'s news media,'
                   ' being the most cited source of news from across Ukraine.')
    __author__ = 'bugmen00t'
    publication_type = 'newspaper'
    oldest_article = 30
    max_articles_per_feed = 100
    language = 'en_UK'
    cover_url = 'https://www.unian.info/images/unian-512x512.png'
    auto_cleanup = False
    no_stylesheets = True

    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(name='div', attrs={'class': 'article-text'})
    remove_tags = [
        dict(name='span', attrs={'class': 'article__info-item comments'}),
        dict(name='span', attrs={'class': 'article__info-item views'}),
        dict(name='div', attrs={'class': 'read-also-slider'}),
        dict(name='div', attrs={'class': 'nts-video-wrapper'})
    ]

    feeds = [
    (u'News Agency UNIAN', u'https://rss.unian.net/site/news_eng.rss')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X�2��unian_net_ua.png�PNG


IHDR(-S6PLTE--0,,0--1,,1++2���,,0���KKO���IIL����������������졡�5z�ItRNSJ�I�H�FBIDATx�c``dC�L>03	NV0`�r@ܬP�`���R/�?DH@���cbF���W���IEND�B`�PK�X邪(�	�	unian_net_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Unian(BasicNewsRecipe):
    title = '\u0423\u041D\u0406\u0410\u041D'
    description = (
        '\u0423\u041D\u0406\u0410\u041D (\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0435'
        ' \u041D\u0435\u0437\u0430\u043B\u0435\u0436\u043D\u0435 \u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u0435'
        ' \u0410\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E \u041D\u043E\u0432\u0438\u043D) -'
        ' \u043F\u0435\u0440\u0448\u0435 \u0432 \u0423\u043A\u0440\u0430\u0457\u043D\u0456 \u0442\u0430'
        ' \u043D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0435 \u043D\u0435\u0437\u0430\u043B\u0435\u0436\u043D\u0435'
        ' \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E,'
        ' \u0437\u0430\u0441\u043D\u043E\u0432\u0430\u043D\u0435 1993 \u0440\u043E\u043A\u0443, \u043B\u0456\u0434\u0435\u0440'
        ' \u0441\u0435\u0440\u0435\u0434 \u043D\u043E\u0432\u0438\u043D\u043D\u0438\u0445 \u043C\u0435\u0434\u0456\u0430'
        ' \u043A\u0440\u0430\u0457\u043D\u0438, \u043D\u0430\u0439\u0431\u0456\u043B\u044C\u0448'
        ' \u0446\u0438\u0442\u043E\u0432\u0430\u043D\u0435 \u0434\u0436\u0435\u0440\u0435\u043B\u043E'
        ' \u043D\u043E\u0432\u0438\u043D \u043F\u0440\u043E \u043F\u043E\u0434\u0456\u0457 \u0432 \u043A\u0440\u0430\u0457\u043D\u0456.')
    __author__ = 'bugmen00t'
    publication_type = 'newspaper'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'uk'
    cover_url = 'https://www.unian.ua/images/unian-512x512.png'
    auto_cleanup = False
    no_stylesheets = True

    remove_tags_before = dict(name='h1')
    remove_tags_after = dict(name='div', attrs={'class': 'article-text'})
    remove_tags = [
        dict(name='span', attrs={'class': 'article__info-item comments'}),
        dict(name='span', attrs={'class': 'article__info-item views'}),
        dict(name='div', attrs={'class': 'read-also-slider'}),
        dict(name='div', attrs={'class': 'nts-video-wrapper'})
    ]

    feeds = [
    (u'\u0423\u041D\u0406\u0410\u041D', u'https://rss.unian.net/site/news_ukr.rss')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X��k!!	unica.png�PNG


IHDR(-SiPLTE������������������������������������슬�~��f��R��>|�6t�2t�.t�*l�"l�d�d�\�d�\�\�
\�
T�T�!u�sIDATx�An�@���@�4\��6kb��:8���R��k#)�X��M"���MӦ&��D�@�SUlՂ��Y���C���=��D-c�]�sZP_�*���^IEND�B`�PK�X�5ffunica.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
unica.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Unica(BasicNewsRecipe):
    title = u'Unica'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'Asa cum esti tu'
    publisher = 'Unica'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Femei'
    encoding = 'utf-8'
    cover_url = 'http://www.unica.ro/fileadmin/images/logo.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'sticky'}), dict(
            name='p', attrs={'class': 'bodytext'})

    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['top-links']}), dict(name='div', attrs={'id': ['autor_name']}), dict(name='div', attrs={
            'class': ['box-r']}), dict(name='div', attrs={'class': ['category']}), dict(name='div', attrs={'class': ['data']})
    ]

    remove_tags_after = [
        dict(name='ul', attrs={'class': 'pager'})
    ]

    feeds = [
        (u'Feeds', u'http://www.unica.ro/rss.html')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X.�&��uninohimitu.png�PNG


IHDR  D���bPLTE-�<-�<-�;-�<-�<-�<-�<-�<-�<-�<-�<-�;-�<-�<-�<-�<-�<-�<-�<-�;-�<-�;-�;-�<-�<-�;-�<-�<-�;-�<-�<-�<-�<-�<-�<-�<-�<-�<-�<-�<?�M@�M-�<-�<-�;-�;-�;-�<-�<-�<-�;-�<-�<-�<-�;-�;-�<-�<-�<-�<-�<-�<-�<-�;2�@2�A-�;-�<-�<������h�s/�>���1�@���x�����������k�vm�xn�y2�@]�h`�kb�m0�?.�=.�<3�A9�H:�H?�MC�P�ʦ�έ�׻�ؾ������������������������M�Z�����������P�\���R�^[�f��EtRNS $*,268@NPPVZ^`bbdhjntv|�������������������������������\9��IDATx�tЃ��@F�m۶]�xm���L�j��W�?E���S�P��yqCM���N��ɧys�pc ��Kij�i��� >S�iE3����C�"P�n݁`�P �B1���C��trL(_�3z������P��Y���ZY[[���܁�B%�Zg��s�q�?owX�T�6`��з`K7�ׁ6%�}�0����3�އ%�#�[��{p�`0p��qu5�8��y��m[��~m�J�D@��!Y��R�4#nخko"4+�0��jx^M�����t�*������?�.�w�7�[���	қ�@�Lׄ�q�p.ep	�0�x���݋#��q%���Y���/�s3F�j������j�F2s��.L Ģ�O�X��!2��*�ZZ�*|Aia���Ĭ�{����Z�XOIEND�B`�PK�X'��]��uninohimitu.recipe__license__ = 'GPL v3'
__copyright__ = '2010,2014, Hiroshi Miura <miurahr@linux.com>'
'''
http://ameblo.jp/sauta19/
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class UniNoHimituKichiBlog(BasicNewsRecipe):
    title = u'Uni secret base'
    __author__ = 'Hiroshi Miura'
    oldest_article = 2
    publication_type = 'blog'
    max_articles_per_feed = 20
    description = 'Japanese famous Cat blog'
    publisher = ''
    category = 'cat, pet, japan'
    language = 'ja'
    encoding = 'utf-8'
    keep_only_tags = [{'class': 'entry_head'}, {'class': 'subContentsInner'}]
    feeds = [(u'blog', u'http://feedblog.ameba.jp/rss/ameblo/sauta19/rss20.xml')]

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if re.search(r'rssad.jp', curarticle.url):
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []
        return feeds
PK�XkT��united_daily.png�PNG


IHDR(-S'PLTE����������Iܒ����%��H��k�Ԏ��������1LIDATxڕε�0CQ�n�uc�*_ݫ���Q� dOLII�����?ާβs�fMy6��b,��)�)��ά^��W�IEND�B`�PK�X�Ĵ�united_daily.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'

from calibre.web.feeds.news import BasicNewsRecipe


class UnitedDaily(BasicNewsRecipe):
    title = u'聯合新聞網'
    oldest_article = 1
    max_articles_per_feed = 100

    feeds = [(u'焦點', u'http://udn.com/udnrss/focus.xml'),
             (u'政治', u'http://udn.com/udnrss/politics.xml'),
             (u'社會', u'http://udn.com/udnrss/social.xml'),
             (u'生活', u'http://udn.com/udnrss/life.xml'),
             (u'綜合', u'http://udn.com/udnrss/education.xml'),
             (u'意見評論', u'http://udn.com/udnrss/opinion.xml'),
             (u'校園博覽會', u'http://mag.udn.com/udnrss/campus_rss.xml'),
             (u'大台北', u'http://udn.com/udnrss/local_taipei.xml'),
             (u'桃竹苗', u'http://udn.com/udnrss/local_tyhcml.xml'),
             (u'中彰投', u'http://udn.com/udnrss/local_tcchnt.xml'),
             (u'雲嘉南', u'http://udn.com/udnrss/local_ylcytn.xml'),
             (u'高屏離島', u'http://udn.com/udnrss/local_ksptisland.xml'),
             (u'基宜花東', u'http://udn.com/udnrss/local_klilhltt.xml'),
             (u'台灣百寶鄉', u'http://udn.com/udnrss/local_oddlyenough.xml'),
             (u'台灣人物', u'http://mag.udn.com/udnrss/people_rss.xml'),
             (u'兩岸要聞', u'http://udn.com/udnrss/mainland.xml'),
             (u'國際焦點', u'http://udn.com/udnrss/international.xml'),
             (u'台商經貿', u'http://udn.com/udnrss/financechina.xml'),
             (u'國際財經', u'http://udn.com/udnrss/financeworld.xml'),
             (u'全球觀察', u'http://mag.udn.com/udnrss/world_rss.xml'),
             (u'財經焦點', u'http://udn.com/udnrss/financesfocus.xml'),
             (u'股市要聞', u'http://udn.com/udnrss/stock.xml'),
             (u'股市快訊', u'http://udn.com/udnrss/stklatest.xml'),
             (u'稅務法務', u'http://udn.com/udnrss/tax.xml'),
             (u'房市情報', u'http://udn.com/udnrss/houses.xml'),
             (u'個人理財', u'http://mag.udn.com/udnrss/wealth_rss.xml'),
             (u'研究報告', u'http://mag.udn.com/udnrss/report_rss.xml'),
             (u'基金', u'http://mag.udn.com/udnrss/fund_rss.xml'),
             (u'理財會客室', u'http://mag.udn.com/udnrss/m_forum_rss.xml'),
             (u'棒球', u'http://udn.com/udnrss/baseball.xml'),
             (u'籃球', u'http://udn.com/udnrss/basketball.xml'),
             (u'體壇動態', u'http://udn.com/udnrss/sportsfocus.xml'),
             (u'熱門星聞', u'http://udn.com/udnrss/starsfocus.xml'),
             (u'廣電港陸', u'http://udn.com/udnrss/tv.xml'),
             (u'海外星球', u'http://udn.com/udnrss/starswestern.xml'),
             (u'日韓星情', u'http://udn.com/udnrss/starsjk.xml'),
             (u'電影世界', u'http://udn.com/udnrss/movie.xml'),
             (u'流行音樂', u'http://udn.com/udnrss/music.xml'),
             (u'觀點專題', u'http://udn.com/udnrss/starssubject.xml'),
             (u'消費流行', u'http://mag.udn.com/udnrss/happylife_rss.xml'),
             (u'食樂指南', u'http://udn.com/udnrss/food.xml'),
             (u'數位資訊', u'http://mag.udn.com/udnrss/digital_rss.xml'),
             (u'折扣好康', u'http://udn.com/udnrss/shopping.xml'),
             (u'發燒車訊', u'http://mag.udn.com/udnrss/car_rss.xml'),
             (u'醫藥新聞', u'http://udn.com/udnrss/health.xml'),
             (u'家婦繽紛', u'http://udn.com/udnrss/benfen.xml'),
             (u'談星論命', u'http://udn.com/udnrss/astrology.xml'),
             (u'文化副刊', u'http://udn.com/udnrss/reading.xml'),
             (u'旅遊休閒', u'http://travel.udn.com/udnrss/travel_rss.xml'),
             (u'健康醫藥', u'http://mag.udn.com/udnrss/life_rss.xml'),
             ]

    extra_css = '''div[id='story_title'] {font-size:200%; font-weight:bold;} td[class='story_title'] {font-size:200%; font-weight:bold;} td[class='story_title'] td[class='story_title']>div {font-size:200%; font-weight:bold;}'''  # noqa

    __author__ = 'Eddie Lau'
    __version__ = '1.2'
    language = 'zh_TW'
    publisher = 'United Daily News Group'
    description = 'United Daily (Taiwan)'
    category = 'News, Chinese, Taiwan'
    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    encoding = 'utf-8'
    conversion_options = {'linearize_tables': True}
    masthead_url = 'http://udn.com/NEWS/2004/images/logo_udn.gif'
    cover_url = 'http://udn.com/NEWS/2004/images/logo_udn.gif'
    auto_cleanup = True
    # keep_only_tags = [dict(name='td', attrs={'class':['story_title']}),
    #                  dict(name='div', attrs={'id':['story_title']}),
    #                  dict(name='td', attrs={'class':['story_author']}),
    #                  dict(name='div', attrs={'id':['story_author']}),
    #                  dict(name='td', attrs={'class':['story']}),
    #                  dict(name='div', attrs={'id':['story']}),
    #                  ]
PK�X��	�EEuniverse_today.png�PNG


IHDR  ��IDATx^u�돖�Ư��yN�/�ڕ���a���Vd�$R�J��
�����?�~h���6Q��zhPӂ�ڢ��x�"� ,B)��� ���}�癙���,1=�r=�<��ue������W5��Ey�VU(�PU��!<����$�m�Ddͼ��@��Z"�(@�+�Ua b@��r�j�!��V�N��ζ�w̘^���y	�޶�����Ҟq%�K%@Y��"
ePL�ǚ*�����v�KR�;�p��='-Ԓ��	����(V�E^�-i�︡�mۦ�6#2#̟���=a)}�Rj�aapuV���@"�:�ϭ]��ޞ��8wЀ��1HVڑ��Rb��Fu�X ���L�"����S3f��{n���i�0���Z-�֢����Ȗ�e���L���t�0l
Ww�XS7<�;V�q�|fX*�H�l��sı�/S,��*$Р�I�Q%0J�sMiB��V��[�ۉ.��ST��i�����A�,�	(�I`RL�˓��b��/5U�5�;׬m�4�	�[�i\/0�%��sh!�09	� mL+�=B
%!x@$h�ʢE���Y�%���2��1����ؘZk�
����	�J�\~9��Ī!W�IMl�vm�eKw�	�a�'@�6���nߡC}&j��Ԭ��2�7���+������s-Ku��6.�_|`�ƅ��	P�	A��O�<�|q��y�LT1Q4X!	�EQ�N�JYR���M���֪�%mmF~��c�]wӊ�)&X�A���"��̟{����d@�ro���<�̀1�n�O�X�vن��~z��R����o�}i�q6Y�'�p48���:2��X��`�a�٢(�ዱ��$�@���L�ܳa����9}�駖-[ֵr�}��w�]ӦC,S�#\�.^¯���`F�N�������GMSV��uu����f�G
�	]�0v�-����[���4�w5C��z�>�!�߯�y��K��wE�%�šXD��|h73�iR[�~�=?X�
0A���wO<���7�^=W����	���s��&p惚8�A�$^-[V�F�Ҕ��Խ����y��{�<��_~��O>���ߜqm��es��"�rQL��7{�}���C���&0��3)C�Um{�B�jM疭s��s��ÇN��E�Ȍ�lY{ۆ朕
����a��c��'W�\��ߎ��I�5��bX"w�����N}���B��jmP6Ήx��Kb	���3;v�Q��>x}G��G��ReCb���$���ё���}HD�H��()T$��^u7��9'O��?�u��g����s�u���̬��{��K�@يHlc��]����$Q"L��)-3�~�������遳��d�<�ŵ�>�mF��S}@�����*+�y�h=W2iP^��4�/^1��%s��ig�I4��_Cy
�gwt�j�d�G���W�q�����_P����$�4����NY��3͈�z�	q�is<00P8l��������L`�,-�H�N<�ذ�+B��Q�D:�eM��B�����YE}��ȣ��4Ӧ6��yT%UM*�	
�Q6��PC��m��Ij��.\`�a������g�$�^!�pü6�Q8�V��
�{�Z�
����z�$q.�}���)֤ENÃ��OON���q&]�}#�`®���,��Hp�U��,G6SUf&�LKǜY޻�q������\E@��<TW�^8�#���'F���c��^J��,�.��̚5S��93�{����G�������;7�c�~���b���9x� ϗ%�I���(2
mm�1A�:z���갏l��dz,˝@��7�hn�/���|y� ��c�*T@
�<

HTaو!�����������*�b�pE(7�x�[��E��Z�=z�	A�	l�Et*�JW2����v�eY�l�<��z/dTԓ-_���q�@H��”���V�����j8OĢ�IEND�B`�PK�X_y�Q&&universe_today.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class UniverseToday(BasicNewsRecipe):
    title = u'Universe Today'
    language = 'en'
    description = u'Space and astronomy news.'
    __author__ = 'seird'
    publisher = u'universetoday.com'
    category = 'science, astronomy, news, rss'
    oldest_article = 7
    max_articles_per_feed = 40
    auto_cleanup = True
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True

    feeds = [(u'Universe Today', u'http://feeds.feedburner.com/universetoday/pYdq')]
PK�X�"�3��
unn_ru.png�PNG


IHDR  ��PIDATx�b�Oc@5F-����X����ᒥ�d�oO��KXx�R�$Y�d����h���*sfff��9�l�!�̜?�K\���x�wo����ڷ:�{�/��������գ�6��fUjSOOMm#�?j�K�~l|���m �Bt��0с�됅��hazF~9�"�@��G�adD+T��W�Dk�Ҝ���Q���]=f@]}�N�sXG�egm����cΜc���.S(�D��0�-$n�s6��Α��DG�v���60sN��Ϡ��h?+����3�~��w��R}�c��uՖ+��ɳ��²J�;��(s�$�����>_m�p����q��9��
���b�;�=��:��w{G����'�B�X�C'� U*cZzna	�[���V�(�:a���D@&&�W���[��Bnf�Up�;ޯ��:̀O_j<@��[)L"��H�כ�$~�*�U�#����(C�jjf�~	DK�U�o�y� AN>Fp�'$6�,����l�)x�"�ƭgb�r�a�MM�#�c��cc���/����' ;�RXj��c?�}p�˯��pp(*&2.!W�ĵ�v�z�(�>~+.S
��e�>��燠���h�	��mH�B�����VA��ݾ�����B�
mph���7@�#�����^��?_k�w�499508t���.T�:���%$�������g�!�/:.���������^V�/��������	�kh&ږ�U:[9{�45�a��bEAQ�8��9z1�>
S��W�iB��1?�Ѝ��8t��oY/�_5uM"�d>��K˫���ج
[.m��)/�Ԏ�Sӊ7�J�+�N{�_I�(�;�(U�����/bB#2�3����4)��б[��?d!�E�����\�XHڟ�Y����WY�9ư���]0�ؕƠ��~����`��Z���l!v���h$�pNH�؅��%Tfdq

�����+Dž@��ݡս��!�-Y�&�p��m$B?ⅎ�?c��
M

-\���3�rG��ٺ�����h�����5���5�?�r��VŨ�������IEND�B`�PK�X�;9֟�
unn_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UNN(BasicNewsRecipe):
    title = '\u0423\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0438\u0435 \u041D\u0430\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u041D\u043E\u0432\u043E\u0441\u0442\u0438'  # noqa
    __author__ = 'bugmen00t'
    description = '\u0423\u041D\u041D: \u0423\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0438\u0435 \u041D\u0430\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u041D\u043E\u0432\u043E\u0441\u0442\u0438'  # noqa
    publisher = '\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E \u00AB\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0456 \u041D\u0430\u0446\u0456\u043E\u043D\u0430\u043B\u044C\u043D\u0456 \u041D\u043E\u0432\u0438\u043D\u0438\u00BB'  # noqa
    category = 'newspaper'
    cover_url = u'https://argentum.ua/uploads/portfolio/2012/c043e0e18fd9f89df5fb421ab28cf609197011c2.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 50

    remove_tags_before = dict(name='span', attrs={'itemprop': 'datePublished'})

    remove_tags_after = dict(name='div', attrs={'class': 'b-news-full'})

    remove_tags = [
        dict(name='span', attrs={'class': 'view'}),
        dict(name='div', attrs={'class': 'b-news-tags'}),
        dict(name='div', attrs={'class': 'b-news-source'}),
        dict(name='div', attrs={'class': 'b-news-footer'}),
        dict(name='div', attrs={'class': 'b-notice-msg'})
    ]

    feeds = [
        (
            '\u041E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u044B\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.unn.com.ua/rss/news_ru.xml'
        ),
        (
            '\u041F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u0438',
            'https://www.unn.com.ua/rss/publication_ru.xml'
        ),
        (
            '\u042D\u043A\u0441\u043A\u043B\u044E\u0437\u0438\u0432\u043D\u044B\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.unn.com.ua/rss/exclusive_ru.xml'
        ),
        (
            '\u041F\u043E\u043B\u0438\u0442\u0438\u043A\u0430',
            'https://www.unn.com.ua/rss/news_politics_ru.xml'
        ),
        (
            '\u042D\u043A\u043E\u043D\u043E\u043C\u0438\u043A\u0430',
            'https://www.unn.com.ua/rss/news_economics_ru.xml'
        ),
        (
            '\u0410\u0433\u0440\u043E\u043D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://www.unn.com.ua/rss/news_agronews_ru.xml'
        ),
        (
            '\u041E\u0434\u0435\u0441\u0441\u0430',
            'https://www.unn.com.ua/rss/news_odesa_ru.xml'
        ),
        ('\u041A\u0438\u0435\u0432', 'https://www.unn.com.ua/rss/news_kiev_ru.xml'),
        ('COVID-19', 'https://www.unn.com.ua/rss/news_covid19_ru.xml'),
        (
            '\u041E\u0431\u0449\u0435\u0441\u0442\u0432\u043E',
            'https://www.unn.com.ua/rss/news_society_ru.xml'
        ),
        (
            '\u0417\u0434\u043E\u0440\u043E\u0432\u044C\u0435',
            'https://www.unn.com.ua/rss/news_health_ru.xml'
        ),
        (
            '\u0412\u043E\u0439\u043D\u0430',
            'https://www.unn.com.ua/rss/news_war_ru.xml'
        ),
        (
            '\u041A\u0440\u0438\u043C\u0438\u043D\u0430\u043B \u0438 \u0427\u041F',
            'https://www.unn.com.ua/rss/news_criminal_ru.xml'
        ),
        ('\u0423\u041D\u041D Lite', 'https://www.unn.com.ua/rss/news_lite_ru.xml'),
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438 \u041C\u0438\u0440\u0430',
            'https://www.unn.com.ua/rss/news_world_ru.xml'
        ),
        (
            '\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438',
            'https://www.unn.com.ua/rss/news_tech_ru.xml'
        ),
        (
            '\u0421\u043F\u043E\u0440\u0442',
            'https://www.unn.com.ua/rss/news_sport_ru.xml'
        ),
        (
            '\u041A\u0443\u043B\u044C\u0442\u0443\u0440\u0430',
            'https://www.unn.com.ua/rss/news_culture_ru.xml'
        ),
        (
            '\u041C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0430',
            'https://www.unn.com.ua/rss/news_media_ru.xml'
        )
    ]

    def print_version(self, url):
        return url + '?_part=main&_print=1'
PK�X�"�3��
unn_ua.png�PNG


IHDR  ��PIDATx�b�Oc@5F-����X����ᒥ�d�oO��KXx�R�$Y�d����h���*sfff��9�l�!�̜?�K\���x�wo����ڷ:�{�/��������գ�6��fUjSOOMm#�?j�K�~l|���m �Bt��0с�됅��hazF~9�"�@��G�adD+T��W�Dk�Ҝ���Q���]=f@]}�N�sXG�egm����cΜc���.S(�D��0�-$n�s6��Α��DG�v���60sN��Ϡ��h?+����3�~��w��R}�c��uՖ+��ɳ��²J�;��(s�$�����>_m�p����q��9��
���b�;�=��:��w{G����'�B�X�C'� U*cZzna	�[���V�(�:a���D@&&�W���[��Bnf�Up�;ޯ��:̀O_j<@��[)L"��H�כ�$~�*�U�#����(C�jjf�~	DK�U�o�y� AN>Fp�'$6�,����l�)x�"�ƭgb�r�a�MM�#�c��cc���/����' ;�RXj��c?�}p�˯��pp(*&2.!W�ĵ�v�z�(�>~+.S
��e�>��燠���h�	��mH�B�����VA��ݾ�����B�
mph���7@�#�����^��?_k�w�499508t���.T�:���%$�������g�!�/:.���������^V�/��������	�kh&ږ�U:[9{�45�a��bEAQ�8��9z1�>
S��W�iB��1?�Ѝ��8t��oY/�_5uM"�d>��K˫���ج
[.m��)/�Ԏ�Sӊ7�J�+�N{�_I�(�;�(U�����/bB#2�3����4)��б[��?d!�E�����\�XHڟ�Y����WY�9ư���]0�ؕƠ��~����`��Z���l!v���h$�pNH�؅��%Tfdq

�����+Dž@��ݡս��!�-Y�&�p��m$B?ⅎ�?c��
M

-\���3�rG��ٺ�����h�����5���5�?�r��VŨ�������IEND�B`�PK�X���YY
unn_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class UNN(BasicNewsRecipe):
    title = '\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0456 \u041D\u0430\u0446\u0456\u043E\u043D\u0430\u043B\u044C\u043D\u0456 \u041D\u043E\u0432\u0438\u043D\u0438'  # noqa
    __author__ = 'bugmen00t'
    description = '\u0423\u041D\u041D: \u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0456 \u041D\u0430\u0446\u0456\u043E\u043D\u0430\u043B\u044C\u043D\u0456 \u041D\u043E\u0432\u0438\u043D\u0438'  # noqa
    publisher = '\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E \u00AB\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0456 \u041D\u0430\u0446\u0456\u043E\u043D\u0430\u043B\u044C\u043D\u0456 \u041D\u043E\u0432\u0438\u043D\u0438\u00BB'  # noqa
    category = 'newspaper'
    cover_url = u'https://pechersk.kyivcity.gov.ua/done_img/b/11289.jpg'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 50

    remove_tags_before = dict(name='span', attrs={'itemprop': 'datePublished'})

    remove_tags_after = dict(name='div', attrs={'class': 'b-news-full'})

    remove_tags = [
        dict(name='span', attrs={'class': 'view'}),
        dict(name='div', attrs={'class': 'b-news-tags'}),
        dict(name='div', attrs={'class': 'b-news-source'}),
        dict(name='div', attrs={'class': 'b-news-footer'}),
        dict(name='div', attrs={'class': 'b-notice-msg'})
    ]

    feeds = [
        (
            '\u041E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u0456 \u043D\u043E\u0432\u0438\u043D\u0438',
            'https://www.unn.com.ua/rss/news_uk.xml'
        ),
        (
            '\u041F\u0443\u0431\u043B\u0456\u043A\u0430\u0446\u0456\u0457',
            'https://www.unn.com.ua/rss/publication_uk.xml'
        ),
        (
            '\u0415\u043A\u0441\u043A\u043B\u044E\u0437\u0438\u0432\u043D\u0456 \u043D\u043E\u0432\u0438\u043D\u0438',
            'https://www.unn.com.ua/rss/exclusive_uk.xml'
        ),
        (
            '\u041F\u043E\u043B\u0456\u0442\u0438\u043A\u0430',
            'https://www.unn.com.ua/rss/news_politics_uk.xml'
        ),
        (
            '\u0415\u043A\u043E\u043D\u043E\u043C\u0456\u043A\u0430',
            'https://www.unn.com.ua/rss/news_economics_uk.xml'
        ),
        (
            '\u0410\u0433\u0440\u043E\u043D\u043E\u0432\u0438\u043D\u0438',
            'https://www.unn.com.ua/rss/news_agronews_uk.xml'
        ),
        (
            '\u041E\u0434\u0435\u0441\u0430',
            'https://www.unn.com.ua/rss/news_odesa_uk.xml'
        ),
        ('\u041A\u0438\u0457\u0432', 'https://www.unn.com.ua/rss/news_kiev_uk.xml'),
        ('COVID-19', 'https://www.unn.com.ua/rss/news_covid19_uk.xml'),
        (
            '\u0421\u0443\u0441\u043F\u0456\u043B\u044C\u0441\u0442\u0432\u043E',
            'https://www.unn.com.ua/rss/news_society_uk.xml'
        ),
        (
            '\u0417\u0434\u043E\u0440\u043E\u0432\u0027\u044F',
            'https://www.unn.com.ua/rss/news_health_uk.xml'
        ),
        (
            '\u0412\u0456\u0439\u043D\u0430',
            'https://www.unn.com.ua/rss/news_war_uk.xml'
        ),
        (
            '\u041A\u0440\u0438\u043C\u0456\u043D\u0430\u043B \u0442\u0430 \u041D\u041F',
            'https://www.unn.com.ua/rss/news_criminal_uk.xml'
        ),
        ('\u0423\u041D\u041D Lite', 'https://www.unn.com.ua/rss/news_lite_uk.xml'),
        (
            '\u041D\u043E\u0432\u0438\u043D\u0438 \u0421\u0432\u0456\u0442\u0443',
            'https://www.unn.com.ua/rss/news_world_uk.xml'
        ),
        (
            '\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0456\u0457',
            'https://www.unn.com.ua/rss/news_tech_uk.xml'
        ),
        (
            '\u0421\u043F\u043E\u0440\u0442',
            'https://www.unn.com.ua/rss/news_sport_uk.xml'
        ),
        (
            '\u041A\u0443\u043B\u044C\u0442\u0443\u0440\u0430',
            'https://www.unn.com.ua/rss/news_culture_uk.xml'
        ),
        (
            '\u041C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0456\u0430',
            'https://www.unn.com.ua/rss/news_media_uk.xml'
        )
    ]

    def print_version(self, url):
        return url + '?_part=main&_print=1'
PK�X����unperiodico.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿	pHYs��~�tIME�-%}�G�IDATH�m�Ys����+	p�bk��f�\�:���#U��L�N*�m�c. �@#�l��]�]�~q�����0��>{����w#��:��%�^��5�b����Q� ���vk�`�g�fJ�\�?�{���`'s�Zg�Oޚ����bK�:��T�?��UFJ,}�E
���N�}-����jGA*؈-D�*��%z��Q�
����0����F�Y��G���U�����	���K�A�Jc��E.���B�t�>j�^�T["R*EjG���Vo�W9X(��OgO��q�R�Z��H���9:�y0��8j�נ���Ԡ��?���Z3?��b#Ac/xc�s�^{D6���*̴>�p����[�"� 8ZY�E��|��\��oLe�F:Z����A"�ʥz�A� ��nͬt~�9��{�� H���ӃzPKe:�A��y�B�T(�>��{�#{���B�Cd��T��jm���K���[�PJ����I�����R#�6���o��^e+�{���Kc+��5�J3�9��\)��tޑ�d"��������&�{�=:��¥�� �����&^�}�/���Nj�v�^k歹Fg*�����D�v�'@j�����d^���?�)���72��z���V�\�sc��T-q��,�>:�:����Hn�����H�ʍ�F㋽���V�Z��\y��{��>z�"3�F狥#2;��Ad�7�*��I��pp�J#�A�B��Qb�{�'��w~�Is��n\d
�Nf!��ݘ��f�f�M��w�Al�֕���D�S��IDnEbG7&[���l.�׷v���9�%�+�A�wvA�̈�
e8�T!�ډ�2� �K�:�D�}c2���Ve�0�*;����X�}s�L*9�Pn0��RI
���`c�9�AoKD���J�Gkei{��o)�r\���v3�%tEXtdate:create2023-06-19T20:44:07+00:00o,�%tEXtdate:modify2023-06-19T20:44:07+00:00C�[IEND�B`�PK�X���{{unperiodico.recipe# -*- coding: utf-8 -*-
# https://github.com/iemejia/calibrecolombia

'''
http://www.unperiodico.unal.edu.co/
'''

from calibre.web.feeds.news import BasicNewsRecipe


class UNPeriodico(BasicNewsRecipe):
    title = u'UN Periodico'
    language = 'es_CO'
    __author__ = 'Ismael Mejia <iemejia@gmail.com>'
    cover_url = 'http://www.unperiodico.unal.edu.co/fileadmin/templates/periodico/img/logoperiodico.png'
    description = 'UN Periodico'
    oldest_article = 30
    max_articles_per_feed = 100
    publication_type = 'newspaper'
    feeds = [
        (u'UNPeriodico', u'http://www.unperiodico.unal.edu.co/rss/type/rss2/')
    ]
PK�Xo�krrupi.png�PNG


IHDR  D����PLTE���f�c�g�]�e�Y�v����d�X�h����[�`�f�W�g�^�U�Z����\�P�h��N�a�h�b�d�^�X����V�c��_������m�f��R��l�c�|��b��x��s��a��y�����s�����j�h��n�^��P��������	h���[��5|�l��#z�j�`�S��W��B��=��U�b��?�����a��_�F����5y�e�k��b��i�`��Y��${�5��d�����n��i�����i�:����ҕ�Ը���?��y�����/��c����b����5�����C��n�s�i�I����q����<��h��H�g�g��b�Q�[�K��i��	j����1{����s����;��J��7��_����Z����4~�W�J�����q�e�L������������ݤ��<����Ԟ�؝������"%JIDATx�b��)��(h�>Ƶ�۶m۶m�!s���^�zI<I�MHR%>!�$B�讈M�D)e�$X�*�qr:#.Ơ�˒�����38~�NOi��E���`�H�4W*�~�?�0ˬ�f?��\�yH�/(��A�H�Ү�_��rI�q�5���������bq6�h~-LGk��6��7c�{@���H`}�7?08�H0�&��`�´���b��uϹ}�6��+~numAF���z�������1S��\)&�5�76����~�=�}�l�P&��M�0'KL�:m����f���*��:�=
W�KY��JIEND�B`�PK�X�ܗJJ
upi.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

import re
from calibre.web.feeds.news import BasicNewsRecipe


class UnitedPressInternational(BasicNewsRecipe):

    title = 'United Press International'
    max_articles_per_feed = 15
    html2lrf_options = [
        '--override-css= "H1 {font-family: Arial; font-weight: bold; color: #000000; size: 10pt;}"']
    language = 'en'

    preprocess_regexps = [(re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
                          [
        (r'<HEAD>.*?</HEAD>', lambda match: '<HEAD></HEAD>'),
        (r'<div id="apple-rss-sidebar-background">.*?<!-- start Entries -->',
         lambda match: ''),
        (r'<!-- end apple-rss-content-area -->.*?</body>', lambda match: '</body>'),
        (r'<script.*?>.*?</script>', lambda match: ''),
        (r'<body onload=.*?>.*?<a href="http://www.upi.com">',
         lambda match: '<body style="font: 8pt arial;">'),
        (r'<script src="http://www.g.*?>.*?</body>', lambda match: ''),
        (r'<span style="font: 16pt arial',
         lambda match: '<span style="font: 12pt arial'),
    ]
    ]

    def get_feeds(self):
        return [('Top Stories', 'http://www.upi.com/rss/NewsTrack/Top_News/'),
                ('Science', 'http://www.upi.com/rss/NewsTrack/Science/'),
                ('Heatlth', 'http://www.upi.com/rss/NewsTrack/Health/'),
                ('Quirks', 'http://www.upi.com/rss/NewsTrack/Quirks/'),
                ]

    def print_version(self, url):
        return url + 'print/'
PK�X�n1���usatoday.png�PNG


IHDR  D���0PLTE����������������B��������#��f������1�tRNS
W���'�����IDATxڅ�� �d������/��'��ց�j�雭v<�u���w|���
_���{����"7��]���}�	�H�	����/�g{�3��.U�+%ջ�4�(<>l�!��H�C��"M�:��	�����8LDO>��4aB��j!���8~�D� *�/-H�<���X�RS��f�(4�BCh���f�rFa�v���U���^7̺��M�n���G�sx���_��&�q�IEND�B`�PK�X�F)P
P
usatoday.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
usatoday.com
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile


def classes(classes):
    q = frozenset(classes.split(' '))
    return dict(attrs={
        'class': lambda x: x and frozenset(x.split()).intersection(q)})


class USAToday(BasicNewsRecipe):

    title = 'USA Today'
    __author__ = 'Kovid Goyal, unkn0wn'
    description = 'newspaper'
    encoding = 'utf-8'
    language = 'en'

    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 25
    no_stylesheets = True
    remove_empty_feeds = True

    keep_only_tags = [
        classes('gnt_ar_hl gnt_ar_by gnt_ar_b topper__inner in-depth-content'),
    ]

    remove_tags = [
        classes('component--pullquote__icon gnt_ss gnt_em_vp__tp'),
        dict(attrs={'aria-label': ['advertisement']}),
        dict(name=['link', 'media-gallery', 'button']),
    ]

    extra_css = '''
                    h1, h2 {
                        font-size:xx-large;
                        font-family:Arial,Helvetica,sans-serif;}
                    #post-attributes, .info,
                    .clear {
                        font-size:xx-small; color:#4D4D4D;
                        font-family:Arial,Helvetica,sans-serif;
                    }
                    #post-body,
                    #content {
                        font-size:medium;
                        font-family:Arial,Helvetica,sans-serif;
                    }
                    .gnt_em_img_ccw__cap {
                        font-size:small;
                        text-align:center;
                    }
                '''

    ignore_duplicate_articles = {'title'}
    resolve_internal_links  = True
    remove_empty_feeds = True

    articles_are_obfuscated = True

    def get_obfuscated_article(self, url):
        br = self.get_browser()
        try:
            br.open(url)
        except Exception as e:
            url = e.hdrs.get('location')
        soup = self.index_to_soup(url)
        link = soup.find('a', href=True)
        skip_sections =[ # add sections you want to skip
            '/video/', '/videos/', '/media/', 'podcast-'
        ]
        if any(x in link['href'] for x in skip_sections):
            self.log('Aborting Article ', link['href'])
            self.abort_article('skipping video links')

        self.log('Downloading ', link['href'])
        html = br.open(link['href']).read()
        pt = PersistentTemporaryFile('.html')
        pt.write(html)
        pt.close()
        return pt.name

    feeds = []

    sections = [
        'news', 'nation', 'politics', 'opinion', 'tech', 'entertainment', 'money', 'sports', 'travel', 'life', 'investigations', 
    ]

    for sec in sections:
        a = 'https://news.google.com/rss/search?q=when:27h+allinurl:https%3A%2F%2Fwww.usatoday.com%2Fstory{}&hl=en-US&gl=US&ceid=US:en'
        feeds.append((sec.capitalize(), a.format('%2F' + sec + '%2F')))
    # feeds.append(('Others', a.format('')))

    def preprocess_html(self, soup):
        for img in soup.findAll('img', src=True):
            img['src'] = 'https://www.usatoday.com' + img['src']
        for div in soup.findAll(attrs={'data-c-caption':True}):
            div.string = div['data-c-caption']
        return soup
PK�X��j��
usnews.png�PNG


IHDR���R'PLTE^�h�?��O���ҏ�؟�ݯ�����������!&%�aGIDATx�c p�l���]���1�{+��ӄ{��=�{7����p��
d�ܰ��;z���m���@i<4�ԝ��IEND�B`�PK�X ��*##
usnews.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
www.usnews.com
'''
from calibre.web.feeds.news import BasicNewsRecipe


class LaPrensa(BasicNewsRecipe):
    title = 'US & World Report news'
    __author__ = 'Darko Miletic'
    description = 'News from USA and world'
    publisher = 'U.S.News & World Report, L.P.'
    category = 'news, politics, USA'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'
    auto_cleanup = True

    feeds = [
        (u'Homepage', u'http://www.usnews.com/rss/usnews.rss'),
        (u'Health', u'http://www.usnews.com/rss/health'),
        (u'Nation & World', u'http://www.usnews.com/rss/news'),
        (u'Money & Business', u'http://www.usnews.com/rss/money'),
        (u'Education', u'http://www.usnews.com/rss/education'),
        (u'Opinion', u'http://www.usnews.com/rss/opinion'),
        (u'Science', u'http://www.usnews.com/rss/science')
    ]
PK�X$u��utrinski.recipe#!/usr/bin/env python

__author__ = 'Darko Spasovski'
__license__ = 'GPL v3'
__copyright__ = '2011, Darko Spasovski <darko.spasovski at gmail.com>'
'''
utrinski.com.mk
'''

import re
import datetime
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup
from calibre import browser


class UtrinskiVesnik(BasicNewsRecipe):

    INDEX = 'http://www.utrinski.com.mk/'
    title = 'Utrinski Vesnik'
    description = 'Daily Macedonian newspaper'
    masthead_url = 'http://www.utrinski.com.mk/images/LogoTop.jpg'
    language = 'mk'
    remove_javascript = True
    publication_type = 'newspaper'
    category = 'news, Macedonia'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    preprocess_regexps = [(re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
                          [
        # Remove anything before the start of the article.
        (r'<body.*?Article start-->', lambda match: '<body>'),

        # Remove anything after the end of the article.
        (r'<!--Article end.*?</body>', lambda match: '</body>'),
    ]
    ]
    extra_css             = """
                                body{font-family: Arial,Helvetica,sans-serif}
                                .WB_UTRINSKIVESNIK_Naslov{FONT-WEIGHT: bold; FONT-SIZE: 18px; FONT-FAMILY: Arial, Verdana, Tahoma; TEXT-DECORATION: none}
                            """

    conversion_options = {
        'comment': description,
        'tags': category,
        'language': language,
        'linearize_tables': True
    }

    def parse_index(self):
        feeds = []
        # open main page
        soup = self.index_to_soup(self.INDEX)
        # find all anchors with class attribute equal to
        # 'WB_UTRINSKIVESNIK_MainMenu'
        for section in soup.findAll('a', attrs={'class': 'WB_UTRINSKIVESNIK_MainMenu'}):
            sectionTitle = section.contents[0].string
            sectionUrl = self.INDEX + section['href'].strip()
            # open the anchor link
            raw = browser().open_novisit(sectionUrl).read()
            sectionSoup = BeautifulSoup(raw)
            # find all anchors with class attribute equal to
            # 'WB_UTRINSKIVESNIK_ONLINEArticleTitle'
            sectionArticles = sectionSoup.findAll(
                'a', attrs={'class': 'WB_UTRINSKIVESNIK_ONLINEArticleTitle'})
            articles = []
            for sectionArticle in sectionArticles:
                # article title = anchor's contents, article url = anchor's
                # href
                articleTitle = sectionArticle.contents[0].string.strip()
                articleUrl = self.INDEX + sectionArticle['href'].strip()
                articleDate = datetime.datetime.today().strftime('%d.%m.%Y')
                articles.append(
                    {'title': articleTitle, 'url': articleUrl, 'description': '', 'date': articleDate})
            if articles:
                feeds.append((sectionTitle, articles))
        return feeds

    def get_cover_url(self):
        datum = datetime.datetime.today().strftime('%d_%m_%Y')
        return 'http://www.utrinski.com.mk/WBStorage/Files/' + datum + '.jpg'
PK�X&�C�valbybladet_dk.png�PNG


IHDR  D���3PLTEMv���P��@z������ß�̯��������X�����p��0n�`�� c�����IDATx���E1D���?m]ï��]��~h�-@�:H�cՁ�'�lg�46f	��>�E���X�����:�e`Q�z��rˠ�ܾ�p�H�3�^n� k~�_A+ށ@K��y��ʙWu�$�؞y0P�9����IEND�B`�PK�X��E��valbybladet_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Valby Bladet
'''


class ValbyBladet_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Valby Bladet'

    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Valby Bladet', 'http://minby.dk/valby-bladet/feed/'),
        ('Kommentarer til Valby Bladet', 'http://minby.dk/valby-bladet/comments/feed/'),

    ]

PK�X5TH.vancouver_province.png�PNG


IHDR  D����PLTEL�������r�s�t�"v�'v�_����o�s�u����m�r�t�e�g�b�u�i�j�;|�R��R����������������������������`�p�b����p�������+t�+u�+v�+w�.u�2t�t�;|�=|�@}�B�H��L��N��P��P��t�_�`�T��]��_��f��i��o��v��z�������Ǘ�ʘ�ʙ�˜�ͩ�Ӫ�Ӯ�կ��r���ۺ�ۺ�ۻ�ھ�ܿ�ݿ����������������]����n����n����R��'w���������������������m��\����c����_����������������v�"f�"r�"s�f�'t�]�Wg�BIDATx^���r!�����������ꅴ;���\����~[$?�ӣP��wd�.�`nj�q�=��7��+��v��EnQ"�C�lϕ�%p�� LA=��[�ߐ�>��\�<�S�A�.��PI��8w#��k��XE�YUM��m6ӬB�W��u��A	C��r�#�&bC��lʝa�ɑnq<<8��b9Γ��I��$��_ɘ� �P���ҷ�^��Y"��_�hl3�u�$�bkܲū,d*�2�G�����p�( 
pr�9~���L�Ĕ�;3:I���Mŵ��W��i��O��G:F�IEND�B`�PK�X�6X��5�5vancouver_province.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
__license__ = 'GPL v3'

'''
www.canada.com
'''
import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class CanWestPaper(BasicNewsRecipe):

    postmedia_index_pages = [
        (u'Headlines', u'/index.html'),
        (u'Ottawa & Area', u'/news/ottawa/index.html'),
        (u'Vancouver', u'/news/vancouver/index.html'),
        (u'Calgary', u'/news/calgary/index.html'),
        (u'Edmonton', u'/news/edmonton/index.html'),
        (u'Montreal', u'/news/montreal/index.html'),
        (u'Fraser Valley', u'/news/fraser-valley/index.html'),
        (u'British Columbia', u'/news/bc/index.html'),
        (u'Alberta', u'/news/alberta/index.html'),
        (u'Canada', u'/news/canada/index.html'),
        (u'National', u'/news/national/index.html'),
        (u'Politics', u'/news/politics/index.html'),
        (u'Insight', u'/news/insight/index.html'),
        (u'Special Reports', u'/news/specialreports/index.html'),
        (u'Gangs', u'/news/gangs/index.html'),
        (u'Education', u'/news/education/index.html'),
        (u'Health', u'/news/health/index.html'),
        (u'Environment', u'/news/environment/index.html'),
        (u'World', u'/news/world/index.html'),
        (u'Police Blotter', u'/news/crime-and-justice/index.html'),
        (u'Crime', u'/news/blotter/index.html'),
        (u'Around Town', u'/news/topic.html?t=keyword&q=Around+Town'),
        (u'Diplomatica', u'/news/diplomatica/index.html'),
        (u'Opinion', u'/opinion/index.html'),
        (u'Columnists', u'/columnists/index.html'),
        (u'Editorials', u'/opinion/editorials/index.html'),
        (u'Letters', u'/opinion/letters/index.html'),
        (u'Business', u'/business/index.html'),
        (u'Sports', u'/sports/index.html'),
        (u'Arts', u'/entertainment/index.html'),
        (u'Life', u'/life/index.html'),
        (u'Technology', u'/technology/index.html'),
        (u'Travel', u'/travel/index.html'),
        (u'Health', u'/health/index.html')
    ]

    # un-comment the following six lines for the Vancouver Province
    title = u'Vancouver Province'
    url_prefix = 'http://www.theprovince.com'
    description = u'News from Vancouver, BC'
    std_logo_url = 'http://www.theprovince.com/images/logo_theprovince.jpg'
    logo_url = 'vplogo.jpg'
    fp_tag = 'CAN_TP'

    # un-comment the following six lines for the Vancouver Sun
    # title = u'Vancouver Sun'
    # url_prefix = 'http://www.vancouversun.com'
    # description = u'News from Vancouver, BC'
    # std_logo_url = 'http://www.vancouversun.com/images/logo_vancouversun.jpg'
    # logo_url = 'vslogo.jpg'
    # fp_tag = 'CAN_VS'

    # un-comment the following six lines for the Calgary Herald
# #    title = u'Calgary Herald'
# #    url_prefix = 'http://www.calgaryherald.com'
# #    description = u'News from Calgary, AB'
# #    std_logo_url = 'http://www.calgaryherald.com/images/logo_calgaryherald.jpg'
# #    logo_url = 'chlogo.jpg'
# #    fp_tag = 'CAN_CH'
#
#     un-comment the following six lines for the Edmonton Journal
# #    title = u'Edmonton Journal'
# #    url_prefix = 'http://www.edmontonjournal.com'
# #    description = u'News from Edmonton, AB'
# #    std_logo_url = 'http://www.edmontonjournal.com/images/logo_edmontonjournal.jpg'
# #    logo_url = 'ejlogo.jpg'
# #    fp_tag = 'CAN_EJ'
#
#     un-comment the following six lines for the Ottawa Citizen
# #    title = u'Ottawa Citizen'
# #    url_prefix = 'http://www.ottawacitizen.com'
# #    description = u'News from Ottawa, ON'
# #    std_logo_url = 'http://www.ottawacitizen.com/images/logo_ottawacitizen.jpg'
# #    logo_url = 'oclogo.jpg'
# #    fp_tag = 'CAN_OC'
#
#     un-comment the following six lines for the Montreal Gazette
# #    title = u'Montreal Gazette'
# #    url_prefix = 'http://www.montrealgazette.com'
# #    description = u'News from Montreal, QC'
# #    std_logo_url = 'http://www.montrealgazette.com/images/logo_montrealgazette.jpg'
# #    logo_url = 'mglogo.jpg'
# #    fp_tag = 'CAN_MG'

    Kindle_Fire = False
    masthead_url = std_logo_url

    url_list = []
    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    encoding = 'utf-8'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: small;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                .photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                #photocredit { font-size: xx-small; font-weight: normal; }'''

    keep_only_tags = [dict(name='div', attrs={'id': re.compile('story')})]

    remove_tags = [{'class': 'comments'}, {'class': 'comment-intro'}, {'class': 'storytab'},
                   dict(name='div', attrs={'class': 'section_title'}), dict(name='div', attrs={'class': 'sharebar'}), dict(
                       name='div', attrs={'class': 'navbar'}), dict(name='div', attrs={'class': 'morelinks'}),
                   dict(name='h2', attrs={'id': 'photocredit'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='div', attrs={'id': 'soundoff'}),
                   dict(name='div', attrs={'id': re.compile('flyer')}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def get_cover_url(self):
        from datetime import timedelta, date
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def prepare_masthead_image(self, path_to_image, out_path):
        if self.Kindle_Fire:
            from calibre.utils.magick import Image, create_canvas
            img = Image()
            img.open(path_to_image)
            width, height = img.size
            img2 = create_canvas(width, height)
            img2.compose(img)
            img2.save(out_path)
        else:
            BasicNewsRecipe.prepare_masthead_image(
                self, path_to_image, out_path)

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        # delete empty id attributes--they screw up the TOC for unknown reasons
        divtags = soup.findAll('div', attrs={'id': ''})
        if divtags:
            for div in divtags:
                del(div['id'])

        pgall = soup.find('div', attrs={'id': 'storyphoto'})
        if pgall is not None:  # photo gallery perhaps
            if (soup.find('div', attrs={'id': 'storycontent'}) is None):
                allpics = new_tag(soup, 'div')
                first_img = pgall.find('div', 'storyimage')
                if first_img is not None:
                    first_img.extract()
                    tlist = pgall.find('div', attrs={'id': 'relatedthumbs'})
                    if tlist is not None:
                        for atag in tlist.findAll('a'):
                            img = new_tag(soup, 'img')
                            srcpre, sep, srcpost = atag.img[
                                'src'].partition('?')
                            img['src'] = srcpre
                            pdesc = new_tag(soup, 'p')
                            pdesc.insert(0, atag.img['alt'])
                            pdesc['class'] = 'photocaption'
                            div = new_tag(soup, 'div')
                            div.insert(0, pdesc)
                            div.insert(0, img)
                            allpics.append(div)
                pgall.replaceWith(allpics)

        for pg in soup.findAll('div', attrs={'id': 'storyphoto'}):
            pg.extract()
        return self.strip_anchors(soup)

    def parse_index(self):

        articles = {}
        ans = []

        def handle_article(adiv, key):
            if adiv.name == 'h1' or adiv.name == 'h3':
                h1tag = adiv
            else:
                h1tag = adiv.h1
                if h1tag is None:
                    h1tag = adiv.h3
            if h1tag is not None:
                atag = h1tag.a
                if atag is not None:
                    url = atag['href']
                    if url.startswith('/'):
                        url = self.url_prefix + url
                    if not url.startswith(self.url_prefix):
                        print("Rejected " + url)
                        return
                    if url in self.url_list:
                        print("Rejected dup " + url)
                        return
                    self.url_list.append(url)
                    title = self.tag_to_string(atag, False)
                    if 'VIDEO' in title.upper():
                        return
                    if 'GALLERY' in title.upper():
                        return
                    if 'PHOTOS' in title.upper():
                        return
                    dtag = adiv.find('div', 'content')
                    description = ''
                    print("URL " + url)
                    print("TITLE " + title)
                    if dtag is not None:
                        stag = dtag.span
                        if stag is not None:
                            if stag['class'] != 'timestamp':
                                description = self.tag_to_string(stag, False)
                        else:
                            description = self.tag_to_string(dtag, False)
                        print("DESCRIPTION: " + description)
                    if key not in articles:
                        articles[key] = []
                    articles[key].append(dict(
                        title=title, url=url, date='', description=description, author='', content=''))

        def parse_web_index(key, keyurl):
            print("Section: " + key + ': ' + self.url_prefix + keyurl)
            try:
                soup = self.index_to_soup(self.url_prefix + keyurl)
            except:
                print("Section: " + key + ' NOT FOUND')
                return
            ans.append(key)
            mainsoup = soup.find('div', 'bodywrapper')
            footer = mainsoup.find(attrs={'id': 'footerfeature'})
            if footer is not None:
                footer.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['genericfeature']}):
                wdiv.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['headline', 'featurecontent']}):
                handle_article(wdiv, key)

        for (k, url) in self.postmedia_index_pages:
            parse_web_index(k, url)
        ans = [(key, articles[key]) for key in ans if key in articles]
        return ans
PK�XcM��vancouver_sun.png�PNG


IHDR  ���IDATxڴ����`G�K,l0۶�4M���]۶m�ٓ�W�޺���9�Ʊ��U�nZ�-�L���J��@-���V���8I���U� �r1� V]�j/xU�
Bh?�7�yu��C��+��I�����N�M|pr���G)�(I~��M�ϐu��g)w+bv��d�%�
��<�Y�
ҝu,j8��Q7�n�ꐾO�v�#��4n+N_�l��p���qp�~V:����8��_�u�����$Ma����@Sh��Fw���^��x7o�'��2t�$KqL�g� ��̧�s�~Q�Zr�n��)m���:|�У,>Hp7a3�+�YE;-�fe��s�y�e���uQ�G9a��V,�ÌaVz_jY-7�a�/���x��;�<��0���0�bˉef�æ03'�/0Nn=Ub�����]4NUf�j��뫐%�Z�Π�k�	����L�!�(l�q�rT<I��ʌU��>'M/Շ[�n}�F�	zU~��k7�,��U&�(���9�Ťn|61?�TIn�䮁ع�G�qO���vcm�r�"6=*��c�����p��v�bS#d����3U��P<2�HL�ݕT�(�!��{>KG"��z��,]X[�����&�	V���"E�rtƗ���鍜Rc���t�A���Z]$a{�beL �����J8��ª�[Y��rs#��o3��6�����T�Q~CX6�������,X�����F�K�5�,�ܑVٺ|�?m��+����
E��N�7�CŌkT��Ԩ̢A���h���C�L��7�c�;<������j�ۡ�}���J3s���U+( K;��=:���ʠ�N�>@Et���Zm.YɄ �/Ҋaޘ��_���6U�QC�1&��t�[_km`�p�.7�ѣP��;S]�	W>z��-��} �(Q�N4PxG\	�#ۼ“�}	��B�N`zg;~�c�^u[w�L���bY���х��������Se�/v��{�uxۯ����S9���w����862x%�����,�j,��I�U ,�p�:9�����U�h�SAE�Uٞ�Z](T����Ug?��{�xLiRGG��.
�z�
���6q���
HY�q�"�HX�{�b�
:D0��A�1T[0E�M�s]ࡩ�,_�{�NY6���mҥ���OjD�39�R�-~��dC׻/��A�oM�x)���;L�k���'���/��^NmL��IEND�B`�PK�X���N44vancouver_sun.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
__license__ = 'GPL v3'

'''
www.canada.com
'''
import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class CanWestPaper(BasicNewsRecipe):

    compress_news_images = True
    postmedia_index_pages = [
        (u'Headlines', u'/index.html'),
        (u'Ottawa & Area', u'/news/ottawa/index.html'),
        (u'Vancouver', u'/news/vancouver/index.html'),
        (u'Calgary', u'/news/calgary/index.html'),
        (u'Edmonton', u'/news/edmonton/index.html'),
        (u'Montreal', u'/news/montreal/index.html'),
        (u'Fraser Valley', u'/news/fraser-valley/index.html'),
        (u'British Columbia', u'/news/bc/index.html'),
        (u'Alberta', u'/news/alberta/index.html'),
        (u'Canada', u'/news/canada/index.html'),
        (u'National', u'/news/national/index.html'),
        (u'Politics', u'/news/politics/index.html'),
        (u'Insight', u'/news/insight/index.html'),
        (u'Special Reports', u'/news/specialreports/index.html'),
        (u'Gangs', u'/news/gangs/index.html'),
        (u'Education', u'/news/education/index.html'),
        (u'Health', u'/news/health/index.html'),
        (u'Environment', u'/news/environment/index.html'),
        (u'World', u'/news/world/index.html'),
        (u'Police Blotter', u'/news/crime-and-justice/index.html'),
        (u'Crime', u'/news/blotter/index.html'),
        (u'Around Town', u'/news/topic.html?t=keyword&q=Around+Town'),
        (u'Diplomatica', u'/news/diplomatica/index.html'),
        (u'Opinion', u'/opinion/index.html'),
        (u'Columnists', u'/columnists/index.html'),
        (u'Editorials', u'/opinion/editorials/index.html'),
        (u'Letters', u'/opinion/letters/index.html'),
        (u'Business', u'/business/index.html'),
        (u'Sports', u'/sports/index.html'),
        (u'Arts', u'/entertainment/index.html'),
        (u'Life', u'/life/index.html'),
        (u'Technology', u'/technology/index.html'),
        (u'Travel', u'/travel/index.html'),
        (u'Health', u'/health/index.html')
    ]

    # un-comment the following six lines for the Vancouver Province
#     title = u'Vancouver Province'
#     url_prefix = 'http://www.theprovince.com'
#     description = u'News from Vancouver, BC'
#     std_logo_url = 'http://www.theprovince.com/images/logo_theprovince.jpg'
#     logo_url = 'vplogo.jpg'
#     fp_tag = 'CAN_TP'

    # un-comment the following six lines for the Vancouver Sun
    title = u'Vancouver Sun'
    url_prefix = 'http://www.vancouversun.com'
    description = u'News from Vancouver, BC'
    std_logo_url = 'http://www.vancouversun.com/images/logo_vancouversun.jpg'
    logo_url = 'vslogo.jpg'
    fp_tag = 'CAN_VS'

    # un-comment the following six lines for the Calgary Herald
#     title = u'Calgary Herald'
#     url_prefix = 'http://www.calgaryherald.com'
#     description = u'News from Calgary, AB'
#     std_logo_url = 'http://www.calgaryherald.com/images/logo_calgaryherald.jpg'
#     logo_url = 'chlogo.jpg'
#     fp_tag = 'CAN_CH'

    # un-comment the following six lines for the Edmonton Journal
#     title = u'Edmonton Journal'
#     url_prefix = 'http://www.edmontonjournal.com'
#     description = u'News from Edmonton, AB'
#     std_logo_url = 'http://www.edmontonjournal.com/images/logo_edmontonjournal.jpg'
#     logo_url = 'ejlogo.jpg'
#     fp_tag = 'CAN_EJ'

    # un-comment the following six lines for the Ottawa Citizen
#     title = u'Ottawa Citizen'
#     url_prefix = 'http://www.ottawacitizen.com'
#     description = u'News from Ottawa, ON'
#     std_logo_url = 'http://www.ottawacitizen.com/images/logo_ottawacitizen.jpg'
#     logo_url = 'oclogo.jpg'
#     fp_tag = 'CAN_OC'

    # un-comment the following six lines for the Montreal Gazette
#     title = u'Montreal Gazette'
#     url_prefix = 'http://www.montrealgazette.com'
#     description = u'News from Montreal, QC'
#     std_logo_url = 'http://www.montrealgazette.com/images/logo_montrealgazette.jpg'
#     logo_url = 'mglogo.jpg'
#     fp_tag = 'CAN_MG'

    Kindle_Fire = False
    masthead_url = std_logo_url

    url_list = []
    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    encoding = 'utf-8'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: small;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                .photocaption { font-size: xx-small; font-style: italic; font-weight: normal; }
                #photocredit { font-size: xx-small; font-weight: normal; }'''

    keep_only_tags = [dict(name='div', attrs={'id': re.compile('story')})]

    remove_tags = [{'class': 'comments'}, {'class': 'comment-intro'}, {'class': 'storytab'},
                   dict(name='div', attrs={'class': 'section_title'}), dict(name='div', attrs={'class': 'sharebar'}), dict(
                       name='div', attrs={'class': 'navbar'}), dict(name='div', attrs={'class': 'morelinks'}),
                   dict(name='h2', attrs={'id': 'photocredit'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='div', attrs={'id': 'soundoff'}),
                   dict(name='div', attrs={'id': re.compile('flyer')}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def get_cover_url(self):
        from datetime import timedelta, date
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        # delete empty id attributes--they screw up the TOC for unknown reasons
        divtags = soup.findAll('div', attrs={'id': ''})
        if divtags:
            for div in divtags:
                del(div['id'])

        pgall = soup.find('div', attrs={'id': 'storyphoto'})
        if pgall is not None:  # photo gallery perhaps
            if (soup.find('div', attrs={'id': 'storycontent'}) is None):
                allpics = new_tag(soup, 'div')
                first_img = pgall.find('div', 'storyimage')
                if first_img is not None:
                    first_img.extract()
                    tlist = pgall.find('div', attrs={'id': 'relatedthumbs'})
                    if tlist is not None:
                        for atag in tlist.findAll('a'):
                            img = new_tag(soup, 'img')
                            srcpre, sep, srcpost = atag.img[
                                'src'].partition('?')
                            img['src'] = srcpre
                            pdesc = new_tag(soup, 'p')
                            pdesc.insert(0, atag.img['alt'])
                            pdesc['class'] = 'photocaption'
                            div = new_tag(soup, 'div')
                            div.insert(0, pdesc)
                            div.insert(0, img)
                            allpics.append(div)
                pgall.replaceWith(allpics)

        for pg in soup.findAll('div', attrs={'id': 'storyphoto'}):
            pg.extract()
        return self.strip_anchors(soup)

    def parse_index(self):

        articles = {}
        ans = []

        def handle_article(adiv, key):
            if adiv.name == 'h1' or adiv.name == 'h3':
                h1tag = adiv
            else:
                h1tag = adiv.h1
                if h1tag is None:
                    h1tag = adiv.h3
            if h1tag is not None:
                atag = h1tag.a
                if atag is not None:
                    url = atag['href']
                    if url.startswith('/'):
                        url = self.url_prefix + url
                    if not url.startswith(self.url_prefix):
                        print("Rejected " + url)
                        return
                    if url in self.url_list:
                        print("Rejected dup " + url)
                        return
                    self.url_list.append(url)
                    title = self.tag_to_string(atag, False)
                    if 'VIDEO' in title.upper():
                        return
                    if 'GALLERY' in title.upper():
                        return
                    if 'PHOTOS' in title.upper():
                        return
                    dtag = adiv.find('div', 'content')
                    description = ''
                    print("URL " + url)
                    print("TITLE " + title)
                    if dtag is not None:
                        stag = dtag.span
                        if stag is not None:
                            if ''.join(stag['class']) != 'timestamp':
                                description = self.tag_to_string(stag, False)
                        else:
                            description = self.tag_to_string(dtag, False)
                        print("DESCRIPTION: " + description)
                    if key not in articles:
                        articles[key] = []
                    articles[key].append(dict(
                        title=title, url=url, date='', description=description, author='', content=''))

        def parse_web_index(key, keyurl):
            print("Section: " + key + ': ' + self.url_prefix + keyurl)
            try:
                soup = self.index_to_soup(self.url_prefix + keyurl)
            except:
                print("Section: " + key + ' NOT FOUND')
                return
            ans.append(key)
            mainsoup = soup.find('div', 'bodywrapper')
            footer = mainsoup.find(attrs={'id': 'footerfeature'})
            if footer is not None:
                footer.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['genericfeature']}):
                wdiv.extract()
            for wdiv in mainsoup.findAll(attrs={'class': ['headline', 'featurecontent']}):
                handle_article(wdiv, key)

        for (k, url) in self.postmedia_index_pages:
            parse_web_index(k, url)
        ans = [(key, articles[key]) for key in ans if key in articles]  # noqa
        return ans
PK�X&�C�vanloesebladet_dk.png�PNG


IHDR  D���3PLTEMv���P��@z������ß�̯��������X�����p��0n�`�� c�����IDATx���E1D���?m]ï��]��~h�-@�:H�cՁ�'�lg�46f	��>�E���X�����:�e`Q�z��rˠ�ܾ�p�H�3�^n� k~�_A+ށ@K��y��ʙWu�$�؞y0P�9����IEND�B`�PK�X�tN���vanloesebladet_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Vanløse Bladet
'''


class VanloeseBladet_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Vanløse Bladet'

    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Vanløse Bladet', 'http://minby.dk/vanloese-bladet/feed/'),
        ('Kommentarer til Vanløse Bladet', 'http://minby.dk/vanloese-bladet/comments/feed/'),

    ]

PK�X
��a!!vardelokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X��y::vardelokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Varde
'''


class VardeLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Varde'
    description = 'Lokale og regionale nyheder, sport, kultur fra Varde og omegn på varde.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Varde', 'http://varde.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Varde', 'http://varde.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Varde', 'http://varde.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Varde', 'http://varde.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Varde', 'http://varde.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Varde', 'http://varde.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X��j��variety.png�PNG


IHDR(-S	PLTE���q�tRNS@��f<IDATxڍ��@Ò��<�=�}�6/���اK=�Ě#�1p'.�ixa~8��$ژF�xMD�Ȯ��IEND�B`�PK�XS`Vvariety.recipe__license__ = 'GPL v3'
__copyright__ = '2009-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
www.variety.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class Variety(BasicNewsRecipe):
    title = 'Variety'
    __author__ = 'Darko Miletic'
    description = 'Breaking entertainment movie news, movie reviews, entertainment industry events, news and reviews from Cannes, Oscars, and Hollywood awards.  Featuring box office charts, archives and more.'  # noqa
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'Red Business Information'
    category = 'Entertainment Industry News, Daily Variety, Movie Reviews, TV, Awards, Oscars, Cannes, Box Office, Hollywood'
    language = 'en'
    masthead_url = 'http://images1.variety.com/graphics/variety/Variety_logo_green_tm.gif'
    extra_css              = """
        body{font-family: Arial,Helvetica,sans-serif; font-size: 1.275em}
        .date{font-size: small; border: 1px dotted rgb(204, 204, 204); font-style: italic; color: rgb(102, 102, 102); margin: 5px 0px; padding: 0.5em;}
                                .author{margin: 5px 0px 5px 20px; padding: 0.5em; background: none repeat scroll 0% 0% rgb(247, 247, 247);}
                                .art h2{color: rgb(153, 0, 0); font-size: 1.275em; font-weight: bold;}
                                img{margin-bottom: 1em}
                             """

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    remove_tags = [dict(name=['object', 'link', 'map'])]
    remove_attributes = ['lang', 'vspace', 'hspace', 'xmlns:ms', 'xmlns:dt']
    keep_only_tags = [dict(name='div', attrs={'class': 'art control'})]

    feeds = [(u'News & Articles', u'http://feeds.feedburner.com/variety/headlines')]

    def print_version(self, url):
        rpt = url.rpartition('.html')[0]
        return rpt + '?printerfriendly=true'

    def preprocess_raw_html(self, raw, url):
        return '<html><head>' + raw[raw.find('</head>'):]

    def get_article_url(self, article):
        url = BasicNewsRecipe.get_article_url(self, article)
        return url.rpartition('?')[0]

    def preprocess_html(self, soup):
        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 = []
                else:
                    str = self.tag_to_string(item)
                    item.replaceWith(str)
        for item in soup.findAll('img', alt=False):
            item['alt'] = 'image'
        return soup
PK�XTE��vecernji_list.png�PNG


IHDR���R0PLTE�	�
��1+�ID�gc�}y牄�������������������5.�_�LIDATx�c �{�Pw�9�����^����]���.�����o�0#��c�߻	<��=b`�~a�0��8�
q�1��SIEND�B`�PK�X�2��	�	vecernji_list.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'

'''
www.vecernji.hr
'''

import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class VecernjiList(BasicNewsRecipe):
    title = 'Vecernji List'
    __author__ = 'Darko Miletic'
    description = "Vecernji.hr je vodeci hrvatski news portal. Cilj je biti prvi u objavljivanju svih vijesti iz Hrvatske, svijeta, sporta, gospodarstva, showbiza i jos mnogo vise. Uz cjelodnevni rad, novinari objavljuju preko 300 raznih vijesti svakoga dana. Vecernji.hr prati sve vaznije dogadaje specijalnim izvjestajima, video specijalima i foto galerijama."  # noqa
    publisher = 'Vecernji.hr'
    category = 'news, politics, Croatia'
    oldest_article = 2
    max_articles_per_feed = 100
    delay = 1
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'hr'

    lang = 'hr-HR'
    direction = 'ltr'

    extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif}'  # noqa

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': lang, 'pretty_print': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    remove_tags = [
        dict(name=['object', 'link', 'embed']), dict(
            name='table', attrs={'class': 'enumbox'})
    ]

    feeds = [(u'Vijesti', u'http://www.vecernji.hr/rss/')]

    def preprocess_html(self, soup):
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction

        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=UTF-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return self.adeify_images(soup)

    def print_version(self, url):
        artid = url.rpartition('-')[2]
        return 'http://www.vecernji.hr/index.php?cmd=show_clanak&action=print_popup&clanak_id=' + artid
PK�X�w@���
vedomosti.png�PNG


IHDR  D����PLTE����������������������������������������������������������������������\XWŽ��|y��������$#"%$#RNM_[Yfb`��΁|z�}z�}{�~{������\YW���������������!$""���󾷳^ZX�����mig������qmjwrpxspytr{vs{vtzw������������¾�����ROM'&%(&%+))������������10/�����������������������������jfd�������|z���gca����{y421854976A?>B?>CA?HEDJGF���������NKIPMKQMLTQO����������������i�~tRNS)*457?l��������������Fu���IDATx�l���30S�FT��m۶m�8�z��Lwm��&6�/��r�X���'��"E6�X;��� 巷���yd��Z��Bk �Jī��|���Ή��?��Tn��5��{V
�������	��E��Y�8���m���:�-L�$E�?ʅ�3�Yq	��Y�g����x�C#`�x7a�cy����݄��
Y"CX�`�i��h��q�r��{5�$Q����sj�RG�4�u
�&N��Q�B���=��|�?��-6��V^�z㐛V�K��4n�_���'P^�|��r-d}�SoP+�}���Ϫ���س��?Kw�aC�bqx
+�S��:0t�֓\�~y����ԁё��m+3��-�|cHG�Z4:�@���m+���_��C8�μ�?�B�dG��IEND�B`�PK�XJ�;r��vedomosti.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Vedomosti(BasicNewsRecipe):
    title = '\u0412\u0435\u0434\u043E\u043C\u043E\u0441\u0442\u0438'
    __author__ = 'bugmen00t'
    description = '\u0415\u0436\u0435\u0434\u043D\u0435\u0432\u043D\u0430\u044F \u0434\u0435\u043B\u043E\u0432\u0430\u044F \u0433\u0430\u0437\u0435\u0442\u0430.'  # noqa
    publisher = '\u0410\u041E \u00AB\u0411\u0438\u0437\u043D\u0435\u0441 \u041D\u044C\u044E\u0441 \u041C\u0435\u0434\u0438\u0430\u00BB'
    category = 'newspaper'
    cover_url = u'https://id.vedomosti.ru/assets/chopick-13077eee55066e639f3a037834ecf11279d3f402e9f5cac7162d13183dfd9d20.jpg'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 7
    max_articles_per_feed = 200

    remove_tags_before = dict(name='header', attrs={'class': 'article__header'})

    remove_tags_after = dict(name='div', attrs={'class': 'article__main'})

    remove_tags = [
        dict(name='div', attrs={'class': 'article__tools'}),
        dict(name='div', attrs={'class': 'box-inset-link box-inset-link--card'}),
        dict(
            name='div',
            attrs={
                'class': 'box-inset-link box-inset-link--card box-inset-link--link'
            }
        )
    ]

    feeds = [(
        '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
        'https://www.vedomosti.ru/rss/news'
    )]
PK�X�|I�bbveintitres.png�PNG


IHDR  �g	PLTE��	���΃IDATWc\��G�J�@!�%�IEND�B`�PK�X��«��veintitres.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
elargentino.com
'''

from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class Veintitres(BasicNewsRecipe):
    title = 'Veintitres'
    __author__ = 'Darko Miletic'
    description = 'Revista Argentino dedicada a politica'
    publisher = 'Veintitres'
    category = 'news, politics, Argentina'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'es_AR'

    lang = 'es-AR'
    direction = 'ltr'
    INDEX = 'http://www.elargentino.com/medios/120/veintitres.html'
    extra_css = ' .titulo{font-size: x-large; font-weight: bold} .volantaImp{font-size: small; font-weight: bold} '

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + \
        category + \
        '"\noverride_css=" p {text-indent: 0cm; margin-top: 0em; margin-bottom: 0.5em} "'

    keep_only_tags = [dict(name='div', attrs={'class': 'ContainerPop'})]

    remove_tags = [dict(name='link')]

    feeds = [(u'Articulos', u'http://www.elargentino.com/Highlights.aspx?ParentType=Section&ParentId=120&Content-Type=text/xml&ChannelDesc=Veintitres')]

    def print_version(self, url):
        main, sep, article_part = url.partition('/nota-')
        article_id, rsep, rrest = article_part.partition('-')
        return u'http://www.elargentino.com/Impresion.aspx?Id=' + article_id

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        soup.html['lang'] = self.lang
        soup.html['dir'] = self.direction
        mlang = new_tag(soup, 'meta', [
                    ("http-equiv", "Content-Language"), ("content", self.lang)])
        mcharset = new_tag(soup, 'meta', [
                       ("http-equiv", "Content-Type"), ("content", "text/html; charset=utf-8")])
        soup.head.insert(0, mlang)
        soup.head.insert(1, mcharset)
        return soup

    def get_cover_url(self):
        cover_url = None
        soup = self.index_to_soup(self.INDEX)
        cover_item = soup.find('div', attrs={'class': 'colder'})
        if cover_item:
            clean_url = self.image_url_processor(
                None, cover_item.div.img['src'])
            cover_url = 'http://www.elargentino.com' + clean_url + '&height=600'
        return cover_url

    def image_url_processor(self, baseurl, url):
        base, sep, rest = url.rpartition('?Id=')
        img, sep2, rrest = rest.partition('&')
        return base + sep + img
PK�X
��a!!vejlelokalavisen_dk.png�PNG


IHDR�a�IDATx�|�t&;�<۶�ڶm�6k۶m۶��9�k�wsR��_�m<o]b�������Զ��u��+���י�lw~9�/2�o���8e����
��J��ke�J���{ө���	=�3��ۋ���*+����łГ��
�s��\(9�	���uܞN��WU艸�?�rs�M� {#���������Y �@'��k����<0
��
�;�H*�+���	���Q�X�;E�G��s%�\) �L�@vQ�p
��ű���۸f����l����2
Hx�A%�]r ���}�0I"�ի�k�H�m~�]L_��~�m]�
r�����q 's�s�M2 ]��<�
!‹��}��ߙ"�+����v��Q��l��6������)�K��>�)�|.�%`�ܾ��,3��t
h�	/��~@>��Z�ږ���r5��b��:;;Y���z
�����X{�x�>�e;��o�@I�N����j"�ʅUu��U�<Љe��]|���I�l���-T-�Q[W��xp_���ս�]T֫�a�j"V��b�t8���ay7X�G�U��s�7���|�n��c���VXyFa�uK8xE ������SD�N�'uBM�@m}#�"!��C_���3 �g�k��Sd������������f����ߋ6��h���ӗl��T�}�µ��-�?Fg5}�h��3,>�%N���gIEND�B`�PK�X��::vejlelokalavisen_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Lokalavisen Vejle
'''


class VejleLokalavisen_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Lokalavisen Vejle'
    description = 'Lokale og regionale nyheder, sport, kultur fra Vejle og omegn på vejle.lokalavisen.dk'
    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Seneste nyt fra Lokalavisen Vejle', 'http://vejle.lokalavisen.dk/section/senestenytrss'),
        ('Seneste lokale nyheder fra Lokalavisen Vejle', 'http://vejle.lokalavisen.dk/section/senestelokalenyhederrss'),
        ('Seneste sport fra Lokalavisen Vejle', 'http://vejle.lokalavisen.dk/section/senestesportrss'),
        ('Seneste 112 nyheder fra Lokalavisen Vejle', 'http://vejle.lokalavisen.dk/section/seneste112rss'),
        ('Seneste kultur nyheder fra Lokalavisen Vejle', 'http://vejle.lokalavisen.dk/section/senestekulturrss'),
        ('Seneste læserbreve fra Lokalavisen Vejle', 'http://vejle.lokalavisen.dk/section/senestelaeserbreverss'),

    ]

PK�X�0gH{{version2.png�PNG


IHDR�aBIDATxڭ�DCQ�3U�	Az/  P�A�B� %S B/D [IA�6-^_��������9�z���I=�)��B��lĻ�^҈��eob�R�Ƹ@��2�1,�)�'~���Q� <�ԣ'4���n6(B�������Ph�h�qr��R1���
t�Z�oP�$|DK蹫I�`���ip6X�y	_9O�A��YD�۠j7�s�������N��~s���߉=Œ-*T�}@e�%h�?B�ݹd�`�6�?
�9s.�0�Ýr�
̄Mum�k���Y~�n69�:%Z����������
/<�ώˌ�IEND�B`�PK�XŋJversion2.recipeimport re

__license__ = 'GPL v3'
__copyright__ = '2011, Rasmus Lauritsen <rasmus at lauritsen.info>'
'''
version2.dk
'''

from calibre.web.feeds.news import BasicNewsRecipe


class version2(BasicNewsRecipe):
    title = 'Version2.dk'
    __author__ = 'Rasmus Lauritsen'
    description = 'IT News'
    publisher = 'version2.dk'
    category = 'news, IT, hardware, software, Denmark'
    oldest_article = 14
    max_articles_per_feed = 25
    no_stylesheets = False
    remove_empty_feeds = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'da'

    extra_css = '.article { font-weight: normal; }'

    preprocess_regexps = [(re.compile(r'</?a[^>]*>'), lambda match: ''),
                          (re.compile(r'<span[^>]*article-link-id.*?<br\s*\/?><br\s*\/?>'), lambda match: '')]

    keep_only_tags = [dict(name='div', attrs={'id': 'article-page'}),
                                          dict(name='section', attrs={'class': 'byline'}),
                                          dict(name='section', attrs={'class': 'body'})]

    remove_tags = [
        dict(name='p', attrs={'class': 'meta links'}),
        dict(name='div', attrs={'class': 'float-right'}),
        dict(name='span', attrs={'class': 'article-link-id'}),
        dict(name='section', attrs={'class': 'social-tools-pane'}),
        dict(name='section', attrs={'class': 'article-timeline'}),
        dict(name='div', attrs={'id' : 'mini-panel-comments_and_form'}),
        dict(name='div', attrs={'class': 'related-articles top-three'}),
        dict(name='div', attrs={'id': 'mini-panel-jobfinder_1'}),
        dict(name='section', attrs={'id': 'mini-panel-frontpage_debat_zone'}),
        dict(name='div', attrs={'class': 'panel-panel panel-col-center grid w4'}),
        dict(name='section', attrs={'class': 'short-list sidebar most-rate-up'}),
        dict(name='section', attrs={'class': 'short-list sidebar debat-pane most-comment-lists'}),
        dict(name='section', attrs={'class': 'short-list sidebar most-controversial'}),
        dict(name='div', attrs={'id': 'mini-panel-related_branch_news'}),
        dict(name='div', attrs={'class': 'items-pane pr-pane'}),
        dict(name='section', attrs={'id': 'mini-panel-jobfinder_front'}),
        dict(name='section', attrs={'class': 'item-news'}),
        dict(name='section', attrs={'class': 'jobs-list'}),
        dict(name='footer', attrs={'id': 'footer'}),
        dict(name='section', attrs={'class': 'banner'}),
        dict(name='div', attrs={'class' : 'fast-track-frontpage'}),
        dict(name='a', attrs={'class': 'byline-comments'})
    ]

    feeds = [
        (u'Seneste nyheder', u'https://www.version2.dk/it-nyheder/rss'),
        (u'Seneste blogs', u'https://www.version2.dk/blogs/rss'),
        (u'Seneste kommentarer', u'https://www.version2.dk/debat/rss')
    ]
PK�XE�|A��verstka.png�PNG


IHDR  szz��IDATx^��k��U����Z��{vg�i���T[J�"��
	��B���̋/�SQ1��&j�
i?@	���AH�m ")`@+&{�E:�z�C�{�y�Z����Ih��\��o�}g��;+��5�D����z��m�0+pf�cna?v�o�K�G4�2v1���Z�R!q��0��NM
8��Q<��qVaIW+�?���Q\���$���v�� �QH@�#�o�g(�����n��Dpdq>6�q╊�^}��*#�����zvP�Fu��:\�>�>F�(L~Ju��ث<h�&��r���:�?Gq�D�E����Q�P�Ѻ��NžE�7����L]֝|��bb 9J"�ba"�6���A�h�o:u�|���t��EW1�"�w���	��g���H�GDB$���Q�L�$���P�C�I�!AB�G�}$Y��e�Tk@.��PԴKB�blSd��oH��l�=��W��� �n�S�S��s8Z�Z�f*%۷��g?y�(�ؑ<E�T������X~�+�:�ⓎU�k�#�
\�;
b
�!���_������N�`�r��x���?`��Ӿs��.Y�A*�MG��p_�8Й>�b�N>y���o�ps>�����U�T��կ��聇����假����Ï\�__n�.~z�f���r�8���hK*ER�ѐ#�J�@�8a�M�gLO�A�6Bl9Z<����Ԧ��_gǎ���7Ȃ0�s#>��]I�A�n��*!f�zM�����&��$cΜْ*!@����� �9���S����^�|B�D.��Ž��_\�:Z0Wʣ�@$	�>ɉ{�~�mz^�	ȼ�&2k׮t��10�
SyT�DQFa zO������K�29�����IM^~y�_|١ɖhJ�d�pB&fӨV�*�|i��_u�2LZH��l����YO>�[�m�g�eg�V3JA@Fq��?�‘	Qj#��{،���b-�f���g�VY��YO?���K>�ZmiE�?wĮ����7��-Ćv���ޒ�wԘzCc���	�:co��Y@�r�Z����M�s)Vt�s[�m==�=r�F�#�j��3�ҖWU+<��fa�t������.�J�nS��"˚Z-�+��v�8E����ݞ���w�J�˯8K�^*�ME%"�+B�R`��'P19gE�j�����D�ڰ�/~��4cc�3��p�
':�3K�%�BT��6�������iD�z�)]zـÓM��ν`�Y�-բOs*#�b$�f�p�N���4 ǃ��X�HJD��A� rI"��El�k3� )Hu@��9ʁ$���$Nhi�R%R�����t3���9�L�De�b_�8y�\\M��$G���h:$@DL�K���	��Hc���﹉w��B������ߓ�L8��֐"���{)��ט\O:1ux��	W�I9g��2��Z(�9����o��9*��5�zpd�{n�Z��[L
�2qn'\9�\W��S(�h%���*#72���Z,C����B� ��R9g\si'\s�"�DH@9W�é��?3*�wa��R��~G&�w<A��״��Ι7�u&"(RH�~Z��-����6܋��<,�"��x
�������ݒL
�Zة��
����~��IEND�B`�PK�X�=}	��verstka.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Verstka(BasicNewsRecipe):
    title = u'\u0412\u0451\u0440\u0441\u0442\u043A\u0430'
    description = u'\u041E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E-\u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0438\u0437\u0434\u0430\u043D\u0438\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0438\u0441\u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u0438 \u043E\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442, \u043A\u0430\u043A \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0438\u0440\u0443\u0435\u0442 \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E \u0432 \u0420\u043E\u0441\u0441\u0438\u0438.'  # noqa
    __author__ = 'bugmen00t'
    publication_type = 'newspaper'
    oldest_article = 21
    max_articles_per_feed = 20
    language = 'ru'
    cover_url = 'https://secureservercdn.net/160.153.137.128/yji.7dd.myftpupload.com/wp-content/uploads/2022/04/Screenshot-2022-04-26-at-22.19.30-300x68.png'
    auto_cleanup = False
    no_stylesheets = False

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'wp-block-spacer'})

    feeds = [
        (u'\u041D\u043E\u0432\u043E\u0441\u0442\u0438', 'https://verstka.media/category/news/feed/'),
        (u'\u0421\u0442\u0430\u0442\u044C\u0438', 'https://verstka.media/category/article/feed/'),
        (u'\u041A\u043E\u043B\u043E\u043D\u043A\u0438', 'https://verstka.media/category/column/feed/'),
        (u'\u0418\u043D\u0442\u0435\u0440\u0432\u044C\u044E', 'https://verstka.media/category/interview/feed/')
    ]
PK�X&�C�vesterbrobladet_dk.png�PNG


IHDR  D���3PLTEMv���P��@z������ß�̯��������X�����p��0n�`�� c�����IDATx���E1D���?m]ï��]��~h�-@�:H�cՁ�'�lg�46f	��>�E���X�����:�e`Q�z��rˠ�ܾ�p�H�3�^n� k~�_A+ށ@K��y��ʙWu�$�؞y0P�9����IEND�B`�PK�X��]��vesterbrobladet_dk.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# https://manual.calibre-ebook.com/news_recipe.html
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
'''
Vesterbro Bladet
'''


class VesterbroBladet_dk(BasicNewsRecipe):
    __author__ = 'CoderAllan.github.com'
    title = 'Vesterbro Bladet'

    category = 'newspaper, news, localnews, sport, culture, Denmark'
    oldest_article = 7
    max_articles_per_feed = 50
    auto_cleanup = True
    language = 'da'

    feeds = [
        ('Vesterbro Bladet', 'http://minby.dk/vesterbro-bladet/feed/'),
        ('Kommentarer til Vesterbro Bladet', 'http://minby.dk/vesterbro-bladet/comments/feed/'),

    ]

PK�Xea�:��vfr_magazine.png�PNG


IHDR�a�IDATxڕ���@�{)s4#Ƽ`���Ƕm۶m���}wm���$���,r�Mjѭ5�ұ��=��	�g?#wVP%oN@����G΄��9�*Yt@��R�hB򨄄A�Y�KH�"�������~8��Q�PNX:ne�H��KH���a	���'t����I�MJH�?c�ט
Nc�µ����J��8�[���wp��<& ��>m��/FD�G��5�ތ�x5��&4�|&9�n��j36�q�`�
zX��#��Z��r��l8�C�n]ĎZ-65�v��ZQ�Yb,��^�S=�{�kꒃ�ȟy��
�ܱ���\o��F�;��@�j���60W�M8�f��A3�ߐ�z�x�g�#��~�=�6�գ��4�c�[���q�a3�進��
��BU�)y�^���<�V8U�Wyt�y|�/[�?�VIEND�B`�PK�XO�)��vfr_magazine.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class VFR(BasicNewsRecipe):
    title = u'VFR Magazine'
    language = 'it'
    __author__ = 'Krittika Goyal'
    oldest_article = 31  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('VFR Magazine',
            'http://feeds.feedburner.com/vfrmagazine'),
    ]
PK�Xz�11
vic_times.png�PNG


IHDR  D����PLTE   #!((#" !##" ## "  # !!" ## $  $# ���a^_,)*���NKK($%������������zwx���������623���ZWX0,-��������¦�����hee������<89�y�tRNS$�����XV-�҇�1R�H<IDATxڅ��@ES�?]۾���Zo�gb�c��g���9�A�莅���3Z��	7О�S���t�0�?����w������'q�J�:p�!ȟ�E][�5�QwЭ��!Й�&�Yo���h��M��,����>��v�#
Ѱ_�`5ƀ���D���0�1�Q��CVP�ޔ�C��dBP�y��
&�/�ϟ��W��EO��^S>�e��t^=�E{yM3|`�m��#)�*��n��Vۑ*��G9�m����x�v�#�w�?���%�B�F������^���#h��'�L�g�_�+�u�#�nT�?A|�E51IEND�B`�PK�X�@�'�'vic_times.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
__license__ = 'GPL v3'

'''
www.canada.com
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe

from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class TimesColonist(BasicNewsRecipe):

    # Customization -- remove sections you don't want.
    # If your e-reader is an e-ink Kindle and your output profile is
    # set properly this recipe will not include images because the
    # resulting file is too large. If you have one of these and want
    # images you can set kindle_omit_images = False
    # and remove sections (typically the e-ink Kindles will
    # work with about a dozen of these, but your mileage may vary).

    kindle_omit_images = True

    section_list = [
        ('', 'Web Front Page'),
        ('news/', 'News Headlines'),
        ('news/b-c/', 'BC News'),
        ('news/national/', 'National News'),
        ('news/world/', 'World News'),
        ('opinion/', 'Opinion'),
        ('opinion/letters/', 'Letters'),
        ('business/', 'Business'),
        ('business/money/', 'Money'),
        ('business/technology/', 'Technology'),
        ('business/working/', 'Working'),
        ('sports/', 'Sports'),
        ('sports/hockey/', 'Hockey'),
        ('sports/football/', 'Football'),
        ('sports/basketball/', 'Basketball'),
        ('sports/golf/', 'Golf'),
        ('entertainment/', 'entertainment'),
        ('entertainment/go/', 'Go!'),
        ('entertainment/music/', 'Music'),
        ('entertainment/books/', 'Books'),
        ('entertainment/Movies/', 'Movies'),
        ('entertainment/television/', 'Television'),
        ('life/', 'Life'),
        ('life/health/', 'Health'),
        ('life/travel/', 'Travel'),
        ('life/driving/', 'Driving'),
        ('life/homes/', 'Homes'),
        ('life/food-drink/', 'Food & Drink')
    ]

    title = u'Victoria Times Colonist'
    url_prefix = 'http://www.timescolonist.com'
    description = u'News from Victoria, BC'
    fp_tag = 'CAN_TC'

    masthead_url = 'http://www.timescolonist.com/gmg/img/global/logoTimesColonist.png'

    url_list = []
    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    encoding = 'utf-8'
    extra_css = '''
                .byline { font-size:xx-small; font-weight: bold;}
                h3 { margin-bottom: 6px; }
                .caption { font-size: xx-small; font-style: italic; font-weight: normal; }
                '''
    keep_only_tags = [
        dict(name='div', attrs={'class': re.compile('main.content')})]

    def __init__(self, options, log, progress_reporter):
        self.remove_tags = [{'class': 'comments'},
                            {'id': 'photocredit'},
                            dict(name='div', attrs={
                                 'class': re.compile('top.controls')}),
                            dict(name='div', attrs={
                                 'class': re.compile('^comments')}),
                            dict(name='div', attrs={
                                 'class': re.compile('social')}),
                            dict(name='div', attrs={
                                 'class': re.compile('tools')}),
                            dict(name='div', attrs={
                                 'class': re.compile('bottom.tools')}),
                            dict(name='div', attrs={
                                 'class': re.compile('window')}),
                            dict(name='div', attrs={'class': re.compile('related.news.element')})]
        print("PROFILE NAME = " + options.output_profile.short_name)
        if self.kindle_omit_images and options.output_profile.short_name in ['kindle', 'kindle_dx', 'kindle_pw']:
            self.remove_tags.append(
                dict(name='div', attrs={'class': re.compile('image-container')}))
        BasicNewsRecipe.__init__(self, options, log, progress_reporter)

    def get_cover_url(self):
        from datetime import timedelta, date
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        byline = soup.find('p', attrs={'class': re.compile('ancillary')})
        if byline is not None:
            authstr = self.tag_to_string(byline, False)
            authstr = re.sub('/ *Times Colonist', '/',
                             authstr, flags=re.IGNORECASE)
            authstr = re.sub('BY */', '', authstr, flags=re.IGNORECASE)
            newdiv = new_tag(soup, 'div')
            newdiv.insert(0, authstr)
            newdiv['class'] = 'byline'
            byline.replaceWith(newdiv)
        for caption in soup.findAll('p', attrs={'class': re.compile('caption')}):
            capstr = self.tag_to_string(caption, False)
            capstr = re.sub('Photograph by.*$', '',
                            capstr, flags=re.IGNORECASE)
            newdiv = new_tag(soup, 'div')
            newdiv.insert(0, capstr)
            newdiv['class'] = 'caption'
            caption.replaceWith(newdiv)
        for ptag in soup.findAll('p'):
            ptext = self.tag_to_string(
                ptag, use_alt=False, normalize_whitespace=True)
            ptext = re.sub(r'\s+', '', ptext)
            if (ptext == '') or (ptext == '&nbsp;'):
                ptag.extract()
        return self.strip_anchors(soup)

    raeside = False

    def handle_articles(self, htag, article_list, sectitle):
        atag = htag.a
        if atag is not None:
            url = atag['href']
            url = url.strip()
            # print("Checking >>"+url+'<<\n\r')
            if url.startswith('/'):
                url = self.url_prefix + url
            if url in self.url_list:
                return
            self.url_list.append(url)
            title = self.tag_to_string(atag, False)
            if 'VIDEO' in title.upper():
                return
            if 'GALLERY' in title.upper():
                return
            if 'PHOTOS' in title.upper():
                return
            if 'RAESIDE' in title.upper():
                if self.raeside:
                    return
                self.raeside = True
            dtag = htag.findNext('p')
            description = ''
            if dtag is not None:
                description = self.tag_to_string(dtag, False)
            article_list.append(dict(
                title=title, url=url, date='', description=description, author='', content=''))
            print(sectitle + title + ": description = " +
                  description + " URL=" + url + '\n\r')

    def add_section_index(self, ans, securl, sectitle):
        print("Add section url=" + self.url_prefix + '/' + securl + '\n\r')
        try:
            soup = self.index_to_soup(self.url_prefix + '/' + securl)
        except:
            return ans
        mainsoup = soup.find(
            'div', attrs={'class': re.compile('main.content')})
        article_list = []
        for wdiv in mainsoup.findAll('div', attrs={'id': re.compile('featured.story')}):
            for htag in wdiv.findAll('h3'):
                self.handle_articles(htag, article_list, sectitle)
        for ladiv in mainsoup.findAll(attrs={'class': re.compile('leading.articles')}):
            for wdiv in mainsoup.findAll('div', attrs={'class': re.compile('article.row')}):
                for htag in wdiv.findAll('h2'):
                    self.handle_articles(htag, article_list, sectitle)
        ans.append((sectitle, article_list))
        return ans

    def parse_index(self):
        ans = []
        for (url, title) in self.section_list:
            ans = self.add_section_index(ans, url, title)
        return ans
PK�Xg�Z:��vice.png�PNG


IHDR  D���;PLTE	

###)))***222333877:::;;;>>>GFFGGGKKKMLLSSSTTTXXXYXXZYY[[[]\\__^```aaabaadddjjjlllonntttuuuvvvwwwxww|||������������������������������������������������������������������������������������������������������������������������������������������������������������}o8IDATx��ʃ�,@D�zX۶m���w̓cu�0��~�M*.�閤]c�4c̊�c��V����_�4g��Z!֜�:`�$
ç2��m��6�""M6��n���E�f�/�Ɂl����j2�C���^xR�GٱA}���%�˂�{~&,��G0�spj�c~��h��<���]�
:�n��.�
�@m�z�/��`����F�wA�Z�pX��?S33홭om�KR��ڐ�&I-]gY����IEND�B`�PK�X����vice.recipe##
# Title:        Vice News recipe for calibre
# Author:       Adrian Tennessee
# Contact:      adrian.tennessee at domainthatnobodytakes.com
##
# License:      GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
# Copyright:    Copyright 2014 Adrian Tennessee
##
# Written:      2014-09-13
# Last Edited:  2014-09-13
##

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 VICENews(BasicNewsRecipe):
    __author__ = 'Adrian Tennessee (adrian.tennessee at domainthatnobodytakes.com)'
    __license__ = 'GPLv3'
    __copyright__ = '2014, Adrian Tennessee <adrian.tennessee at domainthatnobodytakes.com)'

    title = u'VICE News'
    language = 'en'
    description = u'VICE News web site ebook'
    publisher = 'VICE Media'
    category = 'news, world'
    cover_url = 'https://upload.wikimedia.org/wikipedia/commons/d/dc/Vice_News_logo.jpg'

    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'

    # article-title modifies h1-tag of article title
    extra_css = '.article-title { font-size:125%; font-weight:bold }'

    keep_only_tags = [
        classes('article__header__title contributors article__header__datebar__date--original short-form__body__article-body')
    ]

    remove_tags = [
        classes('lazy-vice-ad abc__article_embed article__tagged user-newsletter-signup article__embed-component'),
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll(**classes('responsive-image__img')):
            for source in img.findPreviousSiblings('source'):
                img['src'] = source['srcset'].split('?')[0]
                source.extract()
        return soup

    feeds = [(u'VICE News', u'https://news.vice.com/rss')]
PK�Xx���

vice_magazine.png�PNG


IHDR  V%(�IDAT8����	�0�t�:�CXWPGp���@��o�o�~�����-�Jy�����z��
vu,2'8�:���Ƥ鲔�4) �<s@d��� Q)!��a��,��t"�iJĹ؇~@J"���PJƌ�,�QD�4ZWU�^m;�k�I�l)��k)-GƦ	Qk?�=��Y:����q�u�E����{xo*7­��.IEND�B`�PK�X�АO``vice_magazine.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
import re
from calibre.web.feeds.news import BasicNewsRecipe


class ViceESRecipe(BasicNewsRecipe):
    title = u'Vice Magazine España'
    __author__ = 'atordo'
    description = u'La página web oficial de la revista Vice España'
    category = u'noticias, fotografía, blogs, moda, arte, cine, música, literatura, tecnología'
    cover_url = 'http://www.seeklogo.com/images/V/Vice-logo-668578AC94-seeklogo.com.gif'
    oldest_article = 14
    max_articles_per_feed = 100
    auto_cleanup = False
    no_stylesheets = True
    language = 'es'
    use_embedded_content = False
    remove_javascript = True
    publication_type = 'magazine'

    recursions = 10
    match_regexps = [r'/read/.*\?Contentpage=[2-9]$']

    keep_only_tags = [
        dict(attrs={'class': ['article_title', 'article_content', 'next']})
    ]
    remove_tags = [
        dict(attrs={'class': ['social_buttons', 'search', 'tweet',
                              'like', 'inline_socials', 'stumblebadge', 'plusone']})
    ]

    extra_css = '''
        .author{font-size:small}
        img{margin-bottom: 0.4em; display:block; margin-left:auto; margin-right: auto}
    '''

    preprocess_regexps = [
        (re.compile(r'<img src="http://.*\.scorecardresearch\.com/'), lambda m: '')
    ]

    feeds = [('Vice', 'http://www.vice.com/es/rss')]
PK�Xx���

vice_magazine_de.png�PNG


IHDR  V%(�IDAT8����	�0�t�:�CXWPGp���@��o�o�~�����-�Jy�����z��
vu,2'8�:���Ƥ鲔�4) �<s@d��� Q)!��a��,��t"�iJĹ؇~@J"���PJƌ�,�QD�4ZWU�^m;�k�I�l)��k)-GƦ	Qk?�=��Y:����q�u�E����{xo*7­��.IEND�B`�PK�XI)Y�ggvice_magazine_de.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
import re
from calibre.web.feeds.news import BasicNewsRecipe


class ViceDERecipe(BasicNewsRecipe):
    title = u'Vice Magazin Deutschland'
    __author__ = 'atordo;alex'
    description = u'Die offizielle Website des Vice Magazins Deutschland'
    category = u'Nachrichten, Fotografie, Blogs, Mode, Kunst, Film, Musik, Literatur, Technik'
    cover_url = 'http://www.seeklogo.com/images/V/Vice-logo-668578AC94-seeklogo.com.gif'
    oldest_article = 14
    max_articles_per_feed = 100
    auto_cleanup = False
    no_stylesheets = True
    language = 'de'
    use_embedded_content = False
    remove_javascript = True
    publication_type = 'magazine'

    recursions = 10
    match_regexps = [r'/read/.*\?Contentpage=[2-9]$']

    keep_only_tags = [
        dict(attrs={'class': ['article_title', 'article_content', 'next']})
    ]
    remove_tags = [
        dict(attrs={'class': ['social_buttons', 'search', 'tweet',
                              'like', 'inline_socials', 'stumblebadge', 'plusone']})
    ]

    extra_css = '''
        .author{font-size:small}
        img{margin-bottom: 0.4em; display:block; margin-left:auto; margin-right: auto}
    '''

    preprocess_regexps = [
        (re.compile(r'<img src="http://.*\.scorecardresearch\.com/'), lambda m: '')
    ]

    feeds = [('Vice', 'http://www.vice.com/de/rss')]
PK�X�Iʉ�vignette.png�PNG


IHDR���RPLTE��DT��������5IDAT[c`��,...XL,@&���a00��0)�D *�A��0��@*2P�v.�IEND�B`�PK�X�kkvignette.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1334935485(BasicNewsRecipe):
    title = u'Vignette'
    oldest_article = 15
    max_articles_per_feed = 100
    auto_cleanup = False
    keep_only_tags = [
        dict(name='div', attrs={'class': ['HomeFirstNewsfoto', 'photo']}),
        dict(name='img', attrs={'class': 'altan-big'})
    ]
    masthead_url = 'http://vauro.globalist.it/vauroglobalistit/Img/vauro-logo-beta.gif'
    feeds = [(u'Altan', u'http://feed43.com/3556647724071522.xml'), (u'Ellekappa',
                                                                     u'http://ellekappa.tumblr.com/rss'), (u'Vauro', u'http://feeds.feedburner.com/vauro')]
    description = 'Ellekappa, Altan, Vauro - Italian best satirical cartoons'
    language = 'it'
    __author__ = 'faber1971'


__version__ = 'v1.0'
__date__ = '24, April 2012'
PK�X�@��vijesti.png�PNG


IHDR  D���3PLTE������������⤼ܔ�օ��w��g��X��Iz�:o�*c�X�M��x�tRNS@��f�IDATx���n�P�1�=�?m�e��$�<��-�.߀a��p�9�=AI�6;���$���$]�K\$iW=�u'�7��@��R0Ԃ�,�ލ�ưۓsh k0���Z�#��^t�D���f�zWʶ�g�(+	͜�`VIEND�B`�PK�X�e�99vijesti.recipe
__license__ = 'GPL v3'
__copyright__ = '2009-2011, Darko Miletic <darko.miletic at gmail.com>'

'''
vijesti.me
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class Vijesti(BasicNewsRecipe):
    title = 'Vijesti'
    __author__ = 'Darko Miletic'
    description = 'News from Montenegro'
    publisher = 'Daily Press Vijesti'
    category = 'news, politics, Montenegro'
    oldest_article = 2
    max_articles_per_feed = 150
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'sr'
    publication_type = 'newspaper'
    extra_css             = """
                                @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                                @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                                body{font-family: Georgia,"Times New Roman",Times,serif1,serif}
                                .articledescription,.article,.chapter{font-family: sans1, sans-serif}
                            """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]

    keep_only_tags = [
        dict(name='div', attrs={'id': ['article_intro_text', 'article_text']})]

    remove_tags = [dict(name=['object', 'link', 'embed', 'form'])]

    feeds = [(u'Sve vijesti', u'http://www.vijesti.me/rss/')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X'�qkppvikna_ru.png�PNG


IHDR  D���PLTE"oojijoo�.�.�.�.�.�.�.�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5����5�8��5�";�+@�5�����������'�.�'=�5��������8����'�2D��+=�������HTߔ�ߕ�沸���"=����5�+@�.B�+�2B���8�;L��ߗ�����+��8��៧�@L��"8�"=�+B�.D�'5��"�"�'�BP�FR�.�LU�@N�@U�PZ�J`�it�nz�x��z���ف�݋�ގ�ޒ�����;�"5�"ᢩ�賺趼鸾�';�'=�"�2�5D���������������������������������������������������������������.����������������������������������������5�"5�������";�8�+=�".�"2S�0 tRNS	"#tuvyyzz�����������������@��IDATx�}���@�gm�gb{mom۶m۶���$U������QTQ�TW��N>���I��	+ ��,�R���<��+��j��4�#֒���+�QK����H�X�J�&��e�z�W�.�Y�|��2T�1�
w�!]_�̏�
a��H�A���=Υ�o jA����0 C�ޞ��}/��V>�p�k��(��m��|�PgB��L0��h�mj��80tB��KR�F3uqZ9Ʋ�v��>E<�lo쿢�!�c���M������ς{mM܅��o�[կ��B9pi�j����۞��X�4ϱ�5�]S}'ٶ���m��G�ٜ\j����fg���s��Y�	�&�5���0^%=�����y&��Jjjá_U�<�����L֣҄�9m�f��KǾ�',Ί��,��P+栴b�&�z�BW��,NE(�T�-/�kyK�����:��ʊ�L���H��[GNIEND�B`�PK�X�%�YYvikna_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class ViknaSTB(BasicNewsRecipe):
    title = '\u0412\u0438\u043A\u043D\u0430-\u043D\u043E\u0432\u043E\u0441\u0442\u0438'
    __author__ = 'bugmen00t'
    description = '\u0423\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u0442\u0435\u043B\u0435\u043A\u0430\u043D\u0430\u043B\u0430 \u00AB\u0421\u0422\u0411\u00BB.'  # noqa
    publisher = '\u041E\u041E\u041E \u201C\u0421\u041B\u041C \u041D\u043E\u0432\u043E\u0441\u0442\u0438\u201D'
    category = 'newspaper'
    cover_url = u'https://yt3.ggpht.com/QZxhLPDcqhjMitCDPWbzk-Zs-ILbGo3ww1iuV9SIE1k0iqjoOIctT2d4BdyEsSAR6yWsbKbGWg=s900-c-k-c0x00ffffff-no-rj'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 20

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'content-wrapper'})

    remove_tags =   [
         dict(name='div', attrs={'class': 'share-content-wrapper flex-wrapper'}),
         dict(name='div', attrs={'class': 'sticky-wrapper'}),
         dict(name='div', attrs={'class': 'promo-wrapper'}),
         dict(name='div', attrs={'class': 'mn-wrapper'}),
         dict(name='div', attrs={'class': 'news-tags border-btm-grey'})
        ]

    feeds = [
        ('\u0412\u0456\u043A\u043D\u0430', 'https://vikna.tv/ru/feed/')
        ]
PK�X'�qkppvikna_ua.png�PNG


IHDR  D���PLTE"oojijoo�.�.�.�.�.�.�.�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5����5�8��5�";�+@�5�����������'�.�'=�5��������8����'�2D��+=�������HTߔ�ߕ�沸���"=����5�+@�.B�+�2B���8�;L��ߗ�����+��8��៧�@L��"8�"=�+B�.D�'5��"�"�'�BP�FR�.�LU�@N�@U�PZ�J`�it�nz�x��z���ف�݋�ގ�ޒ�����;�"5�"ᢩ�賺趼鸾�';�'=�"�2�5D���������������������������������������������������������������.����������������������������������������5�"5�������";�8�+=�".�"2S�0 tRNS	"#tuvyyzz�����������������@��IDATx�}���@�gm�gb{mom۶m۶���$U������QTQ�TW��N>���I��	+ ��,�R���<��+��j��4�#֒���+�QK����H�X�J�&��e�z�W�.�Y�|��2T�1�
w�!]_�̏�
a��H�A���=Υ�o jA����0 C�ޞ��}/��V>�p�k��(��m��|�PgB��L0��h�mj��80tB��KR�F3uqZ9Ʋ�v��>E<�lo쿢�!�c���M������ς{mM܅��o�[կ��B9pi�j����۞��X�4ϱ�5�]S}'ٶ���m��G�ٜ\j����fg���s��Y�	�&�5���0^%=�����y&��Jjjá_U�<�����L֣҄�9m�f��KǾ�',Ί��,��P+栴b�&�z�BW��,NE(�T�-/�kyK�����:��ʊ�L���H��[GNIEND�B`�PK�X��+vikna_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class ViknaSTB(BasicNewsRecipe):
    title = '\u0412\u0456\u043A\u043D\u0430-\u043D\u043E\u0432\u0438\u043D\u0438'
    __author__ = 'bugmen00t'
    description = '\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0439\u043D\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430 \u0442\u0435\u043B\u0435\u043A\u0430\u043D\u0430\u043B\u0443 \u00AB\u0421\u0422\u0411\u00BB.'  # noqa
    publisher = '\u0422\u041E\u0412 \u201C\u0421\u041B\u041C \u041D\u043E\u0432\u0438\u043D\u0438\u201D'
    category = 'newspaper'
    cover_url = u'https://yt3.ggpht.com/QZxhLPDcqhjMitCDPWbzk-Zs-ILbGo3ww1iuV9SIE1k0iqjoOIctT2d4BdyEsSAR6yWsbKbGWg=s900-c-k-c0x00ffffff-no-rj'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 3
    max_articles_per_feed = 20

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'content-wrapper'})

    remove_tags = [
        dict(name='div', attrs={'class': 'share-content-wrapper flex-wrapper'}),
        dict(name='div', attrs={'class': 'sticky-wrapper'}),
        dict(name='div', attrs={'class': 'promo-wrapper'}),
        dict(name='div', attrs={'class': 'mn-wrapper'}),
        dict(name='div', attrs={'class': 'news-tags border-btm-grey'})
    ]

    feeds = [('\u0412\u0456\u043A\u043D\u0430', 'https://vikna.tv/feed/')]
PK�X�2]::villagevoice.png�PNG


IHDR  D����PLTE^����^�&v�A��������`���i�n����g����-z���g��`����*x�a����=��_�_�e�C��H��l�m�c����b�a��9��7��j��������������'v�-{���o��<���z�ى����/|����g�
e�f������	d����1}Ŋ����7����Y��l��f��%u�e������=�ȧ��x�ٵ��w��o�p����2}�M������$u�
d���낰܍�ߡ����s����
f�����X������3~�4����q����f��p�֘��n�֬�����������O�ͣ������菸�I����������k����a�����"s�����~���������y�� r��
�QIDATxڭЃ�3��ֶ�߶m۶qm[/}Ϥ�a�U�Y�+�1uU&�ɠ�l�A�s(K����(�>!�k�:q%��B���캕��*��B�q(���c*�B�(W^hg��=��MA�����9tX��Q�c�Q��nz���3BgϡΒM/�`a����+Z����Y�¨w��m;�+-��}F�!��� =����g���@����^���E4y��s�G�'?A3�W߾�p����~����w�gG����=��
�U8�h��]hU���8�X��=�vL�R69�v�Q)�N���YQs)�7� jʼn�"�;hm�@1�EWm?�.
��җIEND�B`�PK�X�b���villagevoice.recipe#!/usr/bin/env python

import re
from calibre.web.feeds.news import BasicNewsRecipe


class VillageVoice(BasicNewsRecipe):

    title = 'Village Voice'
    feeds = [
        ("Complete Issue", "http://villagevoice.com/syndication/issue"),
        ("News", "http://villagevoice.com/syndication/section/news"),
        ("Music", "http://villagevoice.com/syndication/section/music"),
        ("Movies", "http://villagevoice.com/syndication/section/film"),
        # ("Restaurants", "http://villagevoice.com/syndication/section/dining"),
        # ("Music Events", "http://villagevoice.com/syndication/events?type=music"),
        # ("Calendar Events", "http://villagevoice.com/syndication/events"),
        # ("Promotional Events", "http://villagevoice.com/syndication/promoEvents"),
        # ("Restaurant Guide", "http://villagevoice.com/syndication/restaurants/search")
    ]

    auto_cleanup = True
    max_articles_per_feed = 50
    masthead_url = "http://assets.villagevoice.com/img/citylogo.png"
    language = 'en'
    __author__ = 'Barty'

    seen_urls = []

    # village voice breaks the article up into multiple pages, so
    # parse page and grab the print url

    url_regex = re.compile(r'\/content\/printVersion\/\d+', re.I)

    def print_version(self, url):
        if url in self.seen_urls:
            return None
        self.seen_urls.append(url)
        soup = self.index_to_soup(url)
        atag = soup.find('a', attrs={'href': self.url_regex})
        if atag is None:
            self.log('Warning: no print url found for ' + url)
        else:
            m = self.url_regex.search(atag['href'])
            if m:
                url = 'http://www.villagevoice.com' + m.group(0)
        return url
PK�X��a
vio_mundo.png�PNG


IHDR�aFIDATx�e�t$M��m�ֶu�m۶m۶m۶��T0y/��>����E����<y��~�^�0��Wvb��ԬZ�Á�h��Ĕ,_���g�~���?�rLL�W�F�X~x�D�9�WG�rwS_�n����Y�4:���өG�y�H���0�2p�̦
����$�/����8v��A��519�X}~���D��bu™s��Z��ݿ��W.ң�	�xsg+;v����:����M8+V�\�?�-e��
��������t�Y�yMV��K���i��R
K�5�e�r|���Z��n�]�
�j,t��a��7o�0r搋V��Ҷ�4��\)+/��c��(,Nl>/�>�V���\5�t�6
}�HLL�p����L�A��l^��H�:���;��:�8�,S��5�P�i[���!|���w��.z?���L?��ʪ~lY���K#�T_f0cs�(Q�,�3��Mޜ�`TԷ�V�8�����k8��3Q�g�on'*�,�U����I麍=k��p8�y@0�ŵ#-C&�4�G�rh~[�h@%����bVV�Ŋ<z�\N�Bpʛ��.��ʞ���Շsk��*�zM��.�R�زsG�Ba�NJ���ݽs�'�7����0�v�F�ڥP�(LZܥ|�۲�y!�������֎wu��vl\��ˀD�?j��ی�\1��^�M0�@����O�/��߄��kQ��	�F��c�U҃�Lq��V��p>/ �17yr�=W��c���T,c�lS�(�Ȅx)W�fx嶝�o?z�/��P�ѷ6�
_ƽ����)��iW��(Vڇ�t1�F�K�g�u{C��GCIEND�B`�PK�XS)j�11vio_mundo.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class VioMundo(BasicNewsRecipe):
    title = 'Blog VioMundo'
    __author__ = 'Diniz Bortolotto'
    description = 'Posts do Blog VioMundo'
    publisher = 'Luiz Carlos Azenha'
    oldest_article = 5
    max_articles_per_feed = 20
    category = 'news, politics, Brazil'
    language = 'pt_BR'
    publication_type = 'news and politics portal'
    use_embedded_content = False
    no_stylesheets = True
    remove_javascript = True

    feeds = [(u'Blog VioMundo', u'http://www.viomundo.com.br/feed')]

    reverse_article_order = True

    def print_version(self, url):
        return url + '/print/'

    remove_tags_after = dict(id='BlogContent')

    preprocess_regexps = [
        (re.compile(r'\|\ <u>.*</p>'),
         lambda match: '</p>')
    ]
PK�X��Ë		virtualshackles.png�PNG


IHDR  szz��IDATx�b��z1^�rQ�Ź"^�ȕ-�������ٶm۶m۶mkl۶m��O���U���Y�ia�fBl�9;�	K�&�m%z�"�1[��h!�>5l�/����L>�����y��ȥV��,e-���gE�"56?�4��K$"q��0�E �n�ӡ���P�+�8�JtE��<��g���9�y8�B&�	������HL�]`osa��>d���6<߰�W��ͅEb���p�/#�8�*�6�
�����S�
��Β�0n$j�'����"��G������F���s[~(�/�!>$y� <��`�"q������KDx�s���a)����k���ܚ;�L���/�� 75��ʏ��>��om������>�߹ɏ���QWt�>�g�ȝ�s`����(-)���4Ό��*�=#�ᜩ�6�GnF��fo_����`�����u��N~Ҷ>�禸 �YY�ϪSG#@��/���6"�I`'+��]��:5�҄��:��w"71DVT$���"&;7�s�浒x�V�m�	�e��V�硶${�CaT�*������z֤�N�������i�A~Z*�X[+������1w4L����(��{�K}�ӭk0ڲ���Ι���X����2W`��v��ۜ=
�('~R���p������~���J� ��r�{����<����WKe�c��!��.���0
vN�Kז�">��ҰT;�4oB4Uş�Eu��S"�Y���
�(B{��
7�_����ԱI��*��:�_����T���Z��Y�F9�����ҟ�6k|�J
@|�ݮ�ɶ�
r��p
qv(--EUx�Ke
�EV,�mh�m����)��a�,P�@��:���"��,�T6�@Qn.~'���;7���H�/CIJ讘���(/�V�MH��D�c$!dy˂?��,����d�W,,�<�ߠim[�,�a'�'�n�{IEND�B`�PK�X�ʏ��virtualshackles.recipe__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.virtualshackles.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class Virtualshackles(BasicNewsRecipe):
    title = 'Virtual Shackles'
    __author__ = 'Darko Miletic'
    description = "The adventures of Orion and Jack, making games they'd never play for people they don't like."
    category = 'virtual shackles, virtualshackles, games, webcomic, comic, video game, orion, jack'
    oldest_article = 10
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = True
    encoding = 'cp1252'
    publisher = 'Virtual Shackles'
    language = 'en'
    publication_type = 'comic'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    feeds = [(u'Virtual Shackles', u'http://feeds2.feedburner.com/virtualshackles')]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�wy��vitalia.png�PNG


IHDR(-S�PLTE�*&��������������ྱ�51������������ӡ���ϼlc�me�f^�vl�pg�yow�|s�vȎ�Ȗ�ɗ�ʉʑ�˘�ά�ϝ��50��ճ�ؽ�ڸ��Ⱥ�50���61��ïA;�B=�ŷ�MGᾱ�Ƹ�NG�VO�ɻ��������������������������ڸaY�ZS�c\���e^��1�IDATx�5�CQ�;�m۹���1y���(hk�Hq�܈P٣�Bm�T	�f
�āW|��qc)a{��
�H�K�L�sR
}x�&R2�`�#��*�Y�8�4�.��e�8��a,Z��,˪�}�
؆�&o�D���īM`�IEND�B`�PK�X}^����vitalia.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Tomas Latal<latal.tomas at gmail.com>'

from calibre.web.feeds.news import BasicNewsRecipe


class VitaliaCZ(BasicNewsRecipe):
    title = 'Vitalia'
    __author__ = 'Tomas Latal'
    __version__ = '1.0'
    __date__ = '30 April 2011'
    description = u'Aktuality a \u010dl\xe1nky z Vitalia.cz'
    oldest_article = 1
    max_articles_per_feed = 10
    encoding = 'utf8'
    publisher = 'Internet Info s.r.o.'
    category = 'zdravi, vztahy, wellness, CZ'
    language = 'cs'
    publication_type = 'newsportal'
    no_stylesheets = True
    remove_javascript = True
    extra_css               = 'p.perex{font-size: 1.2em; margin: 0 0 10px 0; line-height: 1.4; padding: 0 0 10px 0; font-weight: bold;} \
                               p.perex img {display:none;} \
                               span.author {font-size:0.8em; font-style:italic} \
                               .urs div.rs-tip-major {padding:0.5em; background: #e0e0e0 none repeat scroll 0 0;border: 1px solid #909090;} \
                               .urs p {margin: 0 0 0.8em 0;}'

    feeds = [
        (u'Aktuality', 'http://www.vitalia.cz/rss/aktuality/'),
        (u'\u010cl\xe1nky', u'http://www.vitalia.cz/rss/clanky/'),
    ]

    remove_tags_before = dict(id='main')

    remove_tags_after = [dict(id='main')]

    remove_tags = [
        dict(attrs={'class': ['author clear', 'tags-rubrics', 'box border style1 links clear', 'enquiry clear', 'serial', 'box border style1 TitleList',
                              'breadcrumb clear', 'article-discussion box border style1 monitoringComponentArticle', 'link-more border prev-next clear']}),
        dict(id=['discussionList', 'similarItems',
                 'sidebar', 'footer', 'opl', 'promo-box'])
    ]
PK�X,	�ԛ�viva.png�PNG


IHDR��h6bIDATx�=R]hRa~?�9��ksjӵ��n,��dZ�E�`�M7�������X`�vYuUD���6����o�ڏ5Mgz����=��y��y��#��GU��/Ib�	ް����L��g�$Sd�l>*?}�tX�VN�)���+��&ُd�Gv,�Z�Wz�8�����-����L�c*Ln�o�6/η�5�|h����:���WF�O�uG���:�b�N��w�����f�����7nʼn�'&/�
<�u�8b������,-,AR�MXG���Cc
�5P��G	�v�#���]�����N1{�u�|ír��#��(�:�0`�����"X�k��%9��0��$t�
N���]�{y�߽}�x�G��/'�=�8�F6Ӻ
$�+am�����8,�����*/_�d#�}�;�F�vC�岃��+u�������Y�G92��
d-���AжzZ@Ȇ��K��(����'$�]��_���(Ŗ�3�
'����m����9I��3��ߟ[(�Ǖ��IQ����ǹ�j��dF�$y�R_B�V���0�>�K�<��ąRl%���Bҡ��	�6��0P��4�w�%O����Q�@������?��lIEND�B`�PK�X��4\FFviva.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
viva.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class Viva(BasicNewsRecipe):
    title = u'Viva'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'Vedete si evenimente'
    publisher = u'Viva'
    oldest_article = 25
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Reviste,Femei'
    encoding = 'utf-8'
    cover_url = 'http://www.viva.ro/images/default/viva.gif'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    .byline {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    .date {font-family:Arial,Helvetica,sans-serif; font-size:xx-small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .copyright {font-family:Arial,Helvetica,sans-serif;font-size:xx-small;text-align:center}
                    .story{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .entry-asset asset hentry{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .pagebody{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .maincontentcontainer{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    .story-body{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
                '''

    keep_only_tags = [
        dict(name='div', attrs={'class': 'articol'}), dict(name='div', attrs={
            'class': 'gallery clearfix'}), dict(name='div', attrs={'align': 'justify'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': ['breadcrumbs']}), dict(name='div', attrs={'class': ['links clearfix']}), dict(name='a', attrs={'id': ['img_arrow_right']}), dict(name='img', attrs={'id': ['zoom']}), dict(name='div', attrs={'class': ['foto_counter']}), dict(name='div', attrs={'class': ['gal_select clearfix']})  # noqa
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': ['links clearfix']})
    ]

    feeds = [

    (u'Vedete', u'http://feeds.feedburner.com/viva-Vedete'),
    (u'Evenimente', u'http://feeds.feedburner.com/viva-Evenimente'),
    (u'Frumusete', u'http://feeds.feedburner.com/viva-Beauty-Fashion'),
    (u'Noutati', u'http://feeds.feedburner.com/viva-Noutati')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X���K��
vnexpress.png�PNG


IHDR  D����PLTE��������������������������o=J�����ۆ@R������������������z~�B\�H�B_�J�F`�F`�Jc�Jc�2U�2W�2W�'�B�"P�.T�`s�`t�bt�cu�ev�B�2�.R�.T�{�׿����������+�.�5�L�"N�.R�.T��2���"�+R�'��2U�Ri�Ym�`v��������F�H�'H�J��'J�N�'+�'N�'P�'R�L�'P��"�'2�2T�+�5U�2U�5W�=Z�Pf�Pi�;�';�=���Û�ś�ƞ�Ǡ�ʡ�ʦ�ˤ�˧�˧������������������������������������������ܜB���������������������������D����������������F����������������������Jג��3tRNS-2FOOOOPPt{�������������������������2��:CIDATx^��cs�P@�*��giԶm۶�w���6�4�7���E���T��Q���I
Ɛ����|W��`�P
�$��o��_��&BWrN��@/���WNף���E^��X�|�΁Q��:h)��YP,��#�FnZ�8��r��<��J��qes���S��@<�z���#v�'���!V&h/�f�x��7ݴ�L?_�����@S��1��jku8	��@7<����q��7š�B���Hx��A�G���y~Y�u�~r𣅟}��lj"d��ޚƐ��iM�jϛ�"X`t:�����e��Qy�IEND�B`�PK�X����GGvnexpress.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Huan Komrade T <huantnh at gmail.com>'
'''
vnexpress.net
'''

from calibre.web.feeds.news import BasicNewsRecipe


class BBCVietnamese(BasicNewsRecipe):
    title = u'VnExpress'
    __author__ = 'Huan Komrade T'
    description = 'Vietnam news and current affairs from the Food Production Technology Corporation'
    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://vnexpress.net/rss/gl/trang-chu.rss'),
        ('Vietnam', 'http://vnexpress.net/rss/gl/xa-hoi.rss'),
        ('World News', 'http://vnexpress.net/rss/gl/the-gioi.rss'),
        ('Business', 'http://vnexpress.net/rss/gl/kinh-doanh.rss'),
        ('Culture', 'http://vnexpress.net/rss/gl/van-hoa.rss'),
        ('Sports', 'http://vnexpress.net/rss/gl/the-thao.rss'),
        ('Lifestyle', 'http://vnexpress.net/rss/gl/doi-song.rss'),
        ('From The Readers',
         'http://vnexpress.net/rss/gl/ban-doc-viet.rss'),
        ('From The Readers - Sharing',
         'http://vnexpress.net/rss/gl/ban-doc-viet-tam-su.rss'),
    ]

    def print_version(self, url):
        return url + '?q=1'
PK�XU�V��voetbal_belgie.png�PNG


IHDR  szz�\IDATx^��K�^�]�����{�&צnZ'�d��I<-����B����"U Q	!qQ�X��IJbQ
*`!uQ5j`�����p2�%�q[סI�ql�x�}��@��+�꒏��?���$�0#�Ҙ��=��'0�0c�P��/�ߧ�
Ej�ڿ���=׷x��E�fE��Y�z���w��~�<2Hhm�I<�Eo����]<�h
�����C �%��#[ۡ6�&cج��{W���_��V����'M���O���z?�(��e��H��U�=��u�.���=*́~�}����^o�SB'��P1��_Jy�N�W0�Q
�ف
���<�X��s��4)�̭c�Sk���q�_h5��\�6	!Q-�s��x	S�-�<�l�W$
�7�ֽ�&��p��s2���B�$�v]�E�͇�l]s�����P݇��
�FD0�ٽK;(��g��nj�>�n���؜`��d
" )��4���E�
'$il`߮].��8��%ݺ�џ��o� C��E_Q����ȣk�Oyt]�۔�DYG���G���5�h�(R��� �қ��#��E_j&�B��r媏|�|�gW�a�V\�����|�d�g䟷c���M���:`� �$B‘#ʡ�3'< ���;���ʊn�<�Y�m�|��ai>�g�F�����9E�D���3�P�ح�)�S�ZG��(M����}�Z��n��$��j���C��"�����{ο�$q�V���ԜC�D�:_�%SW�P��>��i��� �&z��
��g(K�~�2��b�*�Z�Ei���*z�z�����H��ּ���C?���P���R�Y�5��z���/b����b�H��uA�T�,ڡ�Rq��#@H�U��<�Ýe���Y��5FQFk�o#�P�Qnt�ŻϮ\i!���1k�����6��'�#��;�"��VL��ウ��H者�nfT"��rY�_�z���o�o��;.$ �M��2	�G�F ���x����eT̆���ק�?��x�F�]zI
'4&�@k�g�k�<���Ի)�:Bf(b�R��BV�V�7��=���/Ӵ�HXջ��@�1�}W��@���.ZZjʚ�'����(����M�Z�D'Gj�8��>�� ���z�+R
���j�޽��N8k��Q�?E��i��[�}��Oo��&⹐	�%,��֬�6tN(~L
��Z���f��Ί�н�g�G%�O)�j[�>��g��ply�<���R��:�Q�j4��X1�+z��S	B1�Z��!�u�S0���M!�����2}P��|�Xo��� �˅T)�@1바NJ�tF�G���+ U�7\q�'�R��OÂॻF7փr}#&¥$��*�S̈���_�kH��yTB`�n7.�[
"���F��'���II"�\^nwn�k2���b\ִ̂N(Tź���^�c_�ׇwN3����V}	�ر�\�C]�b%���f�^S'�(~Y��M �D�ĥU�X��E�O��tY�_Z�����]f�\���f�V�w��V\n�B������3�PU�T�:�\Q���1���6,�4����9r[ dLճ�ۙx�ea�0��Y�u��`>�=���;�
 �Ar�t��_k��N׬yY�G �HS�\�m�L6�9:�D ��O�4��<��S�v�3���	UJ@H����3���ܞ��Ef"n'�-Jĵ�g��˯�n��EǍML��Tl�����Z3X�a/2�`)���Կ����ӫ�n{��N��/�1�Թh�9oJ����Rʘ�!23o��K5�W�Û�w����p:�x�~mk��BIEND�B`�PK�X.�����voetbal_belgie.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe


class VoetbalBE(BasicNewsRecipe):
    title = u'Voetbal België'
    __author__ = u'erkfuizfeuadjfjzefzfuzeff'
    description = u'Voetbalnieuws uit België'
    oldest_article = 7
    language = 'nl_BE'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='title'), dict(name='h1'),
        dict(name='a', attrs={'class': 'fancy'}),
        dict(name='img', attrs={'class': 'border kalooga_10605'}),
        dict(name='div', attrs={'class': 'text'})
    ]

    remove_tags = []

    feeds = [(u'Voetbalnieuws', u'http://www.voetbalbelgie.be/nl/rss')]
PK�X��|NNvoice_of_america.png�PNG


IHDR�aIDATx�c�O!6�0j��]x�.y3�IEND�B`�PK�X��6��voice_of_america.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class HindustanTimes(BasicNewsRecipe):
    title = u'Voice of America'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 15  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('All Zones',
         'http://learningenglish.voanews.com/rss/?count=20'),
        ('World',
         'http://learningenglish.voanews.com/rss/?count=20&zoneid=957'),
        ('USA',
         'http://learningenglish.voanews.com/rss/?count=20&zoneid=958'),
        ('Health',
         'http://learningenglish.voanews.com/rss/?count=20&zoneid=955'),

    ]
PK�X�g��
volksrant.png�PNG


IHDR:����IDAT�c��0N��F�����p�_���>���������H�ie�� ��@��,/Yd�H~
5t���ы�����lyc�(9�����pk�%�\*B�㾶������V,�h_��¥�U������D�`0��<�A�ܯ�7�|�]��{xIEND�B`�PK�X�,*�volksrant.recipe#!/usr/bin/env  python
from calibre.web.feeds.recipes import BasicNewsRecipe
import uuid


class Volkskrant(BasicNewsRecipe):
    title = 'Volkskrant'
    __author__ = 'Cristi Ghera'
    max_articles_per_feed = 100
    language = 'nl'
    description = 'Volkskrant - Nieuws, achtergronden en columns'
    needs_subscription = False
    resolve_internal_links = True
    remove_tags_before = dict(id='main-content')
    remove_tags_after = dict(id='main-content')
    remove_tags = [
        dict(
            attrs={
                'class': [
                    'article-footer__sharing',
                    'artstyle__editorial-tips',
                    'artstyle__advertisement',
                    'artstyle__container__icon',
                    'artstyle__disabled-embed',
                    'container__title__icon',
                ]
            }
        ),
        dict(attrs={'data-element-id': ['article-element-authors']}),
        dict(name=['script', 'noscript', 'style']),
    ]
    remove_attributes = ["class", "id", "name", "style"]
    encoding = 'utf-8'
    no_stylesheets = True
    ignore_duplicate_articles = {'url'}

    def parse_index(self):
        soup = self.index_to_soup(
            'https://www.volkskrant.nl/privacy-wall/accept?redirectUri=%2Feditie%2Fvandaag%2F&authId=' + str(uuid.uuid4())
        )
        containers = soup.findAll('section', attrs={'class': 'section--horizontal'})
        sections = []
        for container in containers:
            section_title = self.tag_to_string(container.find('h2')).strip()
            articles = []

            for art in container.findAll('article'):
                a = art.find('a')
                url = a['href']
                if url[0] == '/':
                    url = 'https://www.volkskrant.nl' + url
                if '/editie/' not in url:
                    continue
                header = a.find('header')
                teaser_label = self.tag_to_string(
                    header.find('h4').find('span', attrs={'class': 'teaser__label'})
                ).strip()
                teaser_sublabel = self.tag_to_string(
                    header.find('h4'
                                ).find('span', attrs={'class': 'teaser__sublabel'})
                ).strip()
                teaser_title = self.tag_to_string(
                    header.find('h3').find(
                        'span', attrs={'class': 'teaser__title__value--short'}
                    )
                ).strip()
                if teaser_label.lower() == "podcast":
                    continue
                parts = []
                if teaser_label:
                    parts.append(teaser_label.upper())
                if teaser_sublabel:
                    parts.append(teaser_sublabel)
                if teaser_title:
                    parts.append(teaser_title)
                article_title = ' \u2022 '.join(parts)
                pubdate = ''
                description = ''
                articles.append(
                    dict(
                        title=article_title,
                        url=url,
                        date=pubdate,
                        description=description,
                        content=''
                    )
                )

            sections.append((section_title, articles))
        return sections

    def preprocess_html(self, soup):
        for tag in soup():
            if tag.name == 'img':
                if tag['src'][0] == '/':
                    tag['src'] = 'https://www.volkskrant.nl' + tag['src']
        return soup
PK�X@v^��	vreme.png�PNG


IHDR(-S�PLTE������������ƀ��⤩��KS��JR��՟ه��<E���ڈ���������Է'��Y`�ho������'JJJ���賷����و���������ڇ�و�㥪VVV���>>>�贸��w}�jp���;D� )��͓�IDATx�=�z!@�̬��Sw��hE����u�cJ��ǥ3�UUo^c����'<ԏp�/�-�C�-F/G��m�.M�P����W��aېL���~`���6eZ����7�����/�����)朋�T���m�U�����헿^�_�A��-_.[IEND�B`�PK�X2�ؘ
�
vreme.recipe__license__ = 'GPL v3'
__copyright__ = '2008-2012, Darko Miletic <darko.miletic at gmail.com>'
'''
vreme.com
'''

import re
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe


class Vreme(BasicNewsRecipe):
    title = 'Vreme'
    __author__ = 'Darko Miletic'
    description = 'Politicki Nedeljnik Srbije'
    publisher = 'NP Vreme d.o.o.'
    category = 'news, politics, Serbia'
    delay = 1
    no_stylesheets = True
    needs_subscription = True
    INDEX = 'http://www.vreme.com'
    LOGIN = 'http://www.vreme.com/account/login.php?url=%2F'
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'sr'
    publication_type = 'magazine'
    masthead_url = 'http://www.vreme.com/g/vreme-logo.gif'
    extra_css            = """
                              @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}
                              @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)}
                              body{font-family: serif1, serif}
                              .article_description{font-family: serif1, serif}
                              .column-heading2{font-family: sans1, sans-serif; font-size: large}
                              .column-heading1{font-family: sans1, sans-serif; font-size: x-large}
                              .column-normal{font-family: sans1, sans-serif; font-size: medium}
                              .large{font-family: sans1, sans-serif; font-size: large}
                           """

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language, 'linearize_tables': True
    }

    preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]
    remove_tags_before = dict(attrs={'class': 'toc-heading'})
    remove_tags_after = dict(attrs={'class': 'footer'})

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        if self.username is not None and self.password is not None:
            br.open(self.LOGIN)
            br.select_form(name='f')
            br['username'] = self.username
            br['password'] = self.password
            br.submit()
        return br

    def parse_index(self):
        articles = []
        soup = self.index_to_soup(self.INDEX)
        cover_item = soup.find('div', attrs={'id': 'najava'})
        if cover_item:
            self.cover_url = self.INDEX + cover_item.img['src']
        for item in soup.findAll(['h3', 'h4']):
            description = u''
            title_prefix = u''
            feed_link = item.find('a', href=True)
            if feed_link and (feed_link['href'].startswith('cms/view.php') or feed_link['href'].startswith('/cms/view.php')):
                if feed_link['href'].startswith('cms/view.php'):
                    url = self.INDEX + '/' + feed_link['href']
                else:
                    url = self.INDEX + feed_link['href']
                title = title_prefix + self.tag_to_string(feed_link)
                date = strftime(self.timefmt)
                articles.append({
                    'title': title, 'date': date, 'url': url, 'description': description
                })
        return [('Nedeljnik Vreme', articles)]

    remove_tags = [
        dict(name=['object', 'link']), dict(
            name='table', attrs={'xclass': 'image'})
    ]

    def print_version(self, url):
        return url + '&print=yes'
PK�X�U��
�
vrijnederland.png�PNG


IHDR00W��
�IDATx^�Z}�e�U���Ϲ����y���'��0S
`�� �`�P
�~��Hh4M�1-�m��&&�j�+FMj���6�Z��;�8�#EL,�P:_o����8g��9ke�ܛ���鰓�}�9��>~��>��A�xm7 �a�����[2�A��,��$��Ej"*��Ο�F��k�._�\�1��a�� �XQ����*R����gw--)����/w�w����&"�h:�uU`��fs�
��~��{ޓ�Z��
wʠ�r��ʜ3�����n�
!B%JZ�ۭ��[f0�ɵ3��s� �8�����?�Y��6"@	�(�(f�g�Qnl��EY	)T��I�~h�x�y����N���Ǯ'���Yc�a���LdQQ"�������x֓����P {F���1YD� �QI��T	����Ʃ3�p���R��
mF��G��(Kh�C76\��)���g�W^����8�(3AT�&�g�bn��[�pwۨ�QK��S�4Bp'��!��(���i��޻�߇��;�;v�CΜ��s_���-���'&���(�I�av����L>(s�S�e�CR[����t@��{a�.R��"���F�֟��>��wϘ7��K1}�G��w���@�C��P�4�j	�g�,k�'Fè	���v���1;=m���
�[ނ��[�۷�/�
������,x�fl|�A��I��!\��A���
�1D���Q|���8�v��ha��Y+c�`�&��1�+�]n����.�a?xw�{�>�z��{?Zo�ӿxd�vk�y��~Y�94ۅ%���Z�Vfk�~�(�xK3crs�Bؾ|�~d;wAwnUV�K��Q���0󉏣����/R�K��	]]�-�W)y���f�(xnR�v�=l���u���WƊ�^g�{�=�Σ_!t7�[Y$l����Ç�7z��=�ٗ��
H���������Z<vz�4t���H�8�l�aX��_A�~ŷ�r�}�'��ߴ	t��C�4�b� ��@y�j��,��9j~�5W;.�r�WG�>�1���/y���C8��o��>��N���A�B��'>��_�
��F���z�� ;p�#1[/Y@v�(D���x������"f1�5���5��	]<�u�|�C�?�%0Wf>���>�	u0��	y��tQ��ҼRV����y3xa��O����{��{^-J�:�MT�F�9��b6I�w���A�K���/>��_~��0,,/��Ԝ=5�BNMC����E`-F/�������R�&�{�f*ÿ�oL����N�8ޭF���:�ݠ����`�hI	16Y�ȼϜ\�&؉j�My%c�H9~HH�	�m�n���p��.i�p����<^.\�ۛ�}l��N���D�dj�Ғ+�<V�RET��_l�9�~�؅�`F;wz�x,MV���W͊��v�Vn	,�t#x�>�ښ����uof��[ο�pP�&%�P��\�`�4j�n��j1��5�Q�Cz���\I��
�?v?��P�6�[1FpEe�
�C9�T��(�Z�2,kM��6�b�b����ːWιr�.���k���
���*�S�]�-������Q'y�;���m-�i`�f�wYu�Ei��m[U;ǫ+гg�d�@"���,-C��
��pa�,ha>�ݨ��[��l�2�Xع�bLP%�&(�m�<�Et�Ҡ�e���ف�/�	�3�����W�R�]�^!Z[M��J'x,,8D|,����Zv�ǡ+�-�<�hw��G0���P�Y*q7�:��ݨQ���KlԱ��y�+�<jޓ���ic�4�U��.!X�%�X�C}|*9�o��8��Y�B��17
?�pCWM_W��jb6�R���5�FϮ�Ϣ	d9r���ׇ��Bک�9��ٟٵ4��Aх
Ȱo�W���g�
N�HvՕ��&K<XXH�ú���l�m$�
�iQ�����s�9�=N�����ĕ�5�¦.t0�8������X<�Ab���9do����#�U�bbۭ�[h�Ç�m�5�"+��Д�;m�ɓ�ʣIHb6&
�hn(��O�q�H5ާ0��c�u��Y�"ƚ7�$h�P��uD U��P��7�\�!T���.D�a�f1�-�ȉ��F�NŪ��%��ͮXSVLP F�l��A��|�,�>����ܳ"�g�jQ�YJ�H�16"�}�ʊè����^��n�S��!5!�=9�U1��z�=�g�D�pH\���ê�T)�B
�����w�gT
b��������3���ؼ�k7���X(J�i�;N�D��!L=�h��.SjIst���Zu<���翛J��MѺ�6���ˏ�0\Fģǜߓ����
�_�B�@:��뮅�/��n�u����*E~�6:�q\�T�A��ÿ~�R��@pA�2A��<|���\n�;?ߔ�D���n�i�=�5�o�qӟ��~sa�X��a�"%B{�A[���̎�Q#��<tq��%������LQ8�y^�&��~�g����c @�ٖ�W.����^��/��:W�X#o�޽����x����v�U��I��<���!��';4�\O�u�����3E��Pm�+�h�[�Τ�k�aa�m\w
�_�ۚ�����ٞ9;=s��\ӵ)�����S���H	H
����ch��ݠv��H_���Mz�1p����=��z��mX84�Nmƣ�(��S�����ރTBW��2���7*�C����/T���j��߂��'Q�����t�n�g�I�!��.(3�,!D��e���>��	*��R�[Z[�^��-�̇�r�A��m�%o�7���%��
�8;Q@��ҵn���ǯ!��43�1+�]*��F���wgQ~���l	R[�m\ҦD~�!y,�[�B�tHr"�<3��
���oh����^=q���K��f9��Y�[ͩ`n�A���.@ �G! E��[���|���1��`-�0t��hh���0���Ư|��Kư>5eV��0��dS@H����N��5���ˣ~Q4�@լ)F>�*(��98s��@"
����_�t}��nrK�{�`��
���o��F�P4�xYZ�)VF�ב�Q:IHM�~���)ܯJ �(�(��Z!QN~R�!	��ȃ������?'77Ƹ���;�(��,�y�Z}�����DJB@R�+q�[�/-2b�Y�.���I�J׿n�sӊ�?/� ��!��Kwb#�TZ�2T��La�����^��s1��.�ܿm:�g��.��^33�.詬��WW�U���de��whY�"m�3�G�#-�M���s�)����ϻ_&��C��n1����)]��IEND�B`�PK�X�Tc�F
F
vrijnederland.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag


def new_tag(soup, name, attrs=()):
    impl = getattr(soup, 'new_tag', None)
    if impl is not None:
        return impl(name, attrs=dict(attrs))
    return Tag(soup, name, attrs=attrs or None)


class VrijNederlandRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'nl'
    locale = 'nl'
    version = 1

    title = u'Vrij Nederland'
    publisher = u'Weekbladpers Tijdschriften'
    category = u'News, Opinion'
    description = u'Weekly opinion magazine from the Netherlands'

    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False

    no_stylesheets = True
    remove_javascript = True

    conversion_options = {'publisher': publisher,
                          'tags': category, 'comments': description}

    feeds = []
    feeds.append((u'Politiek', u'http://www.vn.nl/politiek.rss'))
    feeds.append((u'Buitenland', u'http://www.vn.nl/buitenland.rss'))
    feeds.append((u'Economie', u'http://www.vn.nl/economie.rss'))
    feeds.append((u'Justitie', u'http://www.vn.nl/justitie.rss'))
    feeds.append((u'Samenleving', u'http://www.vn.nl/samenleving.rss'))
    feeds.append((u'Crime', u'http://www.vn.nl/crime.rss'))
    feeds.append((u'Media', u'http://www.vn.nl/media.rss'))
    feeds.append((u'De Republiek der Letteren',
                  u'http://www.vn.nl/republiek.rss'))
    feeds.append((u'Max van Weezel', u'http://www.vn.nl/vanweezel.rss'))
    feeds.append((u'Ko Colijn', u'http://www.vn.nl/colijn.rss'))
    feeds.append((u'Kees Kraaijeveld', u'http://www.vn.nl/kraaijeveld.rss'))
    feeds.append((u'Frank Kalshoven', u'http://www.vn.nl/kalshoven.rss'))
    feeds.append((u'Stephan Sanders', u'http://www.vn.nl/sanders.rss'))
    feeds.append((u'Micha Wertheim', u'http://www.vn.nl/wertheim.rss'))
    feeds.append((u'Arnon Grunberg', u'http://www.vn.nl/grunberg.rss'))
    feeds.append((u'Carel Peeters', u'http://www.vn.nl/carelpeeters.rss'))

    keep_only_tags = [
        dict(name='div', attrs={'class': 'cl-column column-one'})]

    remove_tags = []
    remove_tags.append(
        dict(name='div', attrs={'class': 'wpg-element guest-book-overview'}))
    remove_tags.append(
        dict(name='div', attrs={'class': 'wpg-element forum-message-form'}))
    remove_tags.append(dict(name='div', attrs={'class': 'mediaterms'}))
    remove_tags.append(dict(name='div', attrs={'class': 'label-term'}))
    remove_tags.append(dict(name='div', attrs={
                       'class': 'wpg-element Media-Collection-Element-Artikel-Lijst'}))
    remove_tags.append(dict(name='object'))
    remove_tags.append(dict(name='link'))
    remove_tags.append(dict(name='meta'))

    def preprocess_html(self, soup):
        # Just clean up the result a little
        meta = soup.find('div', attrs={'class': 'meta'})
        if meta:
            link = meta.find('span', attrs={'class': 'link'})
            if link:
                link.extract()
            for seperator in meta.findAll('span', attrs={'class': 'seperator'}):
                seperator.extract()

        # Their header is full of 'if IE6/7/8' tags. Just get rid of it
        # altogether
        theirHead = soup.head
        theirHead.extract()
        myHead = new_tag(soup, 'head')
        soup.insert(0, myHead)

        return soup
PK�X�t�<iiwaco_tribune.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1278773519(BasicNewsRecipe):
    title = u'Waco Tribune Herald'
    __author__ = 'rty'
    publisher = 'A Robinson Media Company'
    description = 'Waco, Texas, Newspaper'
    category = 'News, Texas, Waco'
    oldest_article = 7
    max_articles_per_feed = 100

    feeds = [
        (u'News', u'http://www.wacotrib.com/search/?q=&t=article&l=100&d=&d1=&d2=&s=start_time&sd=desc&nsa=eedition&c[]=news/ap_nation,news/ap_nation/*&f=rss'),
        (u'Sports', u'http://www.wacotrib.com/search/?q=&t=article&l=25&d=&d1=&d2=&s=start_time&sd=desc&c[]=sports*&f=rss'),
        (u'AccessWaco', u'http://www.wacotrib.com/search/?q=&t=article&l=25&d=&d1=&d2=&s=start_time&sd=desc&c[]=entertainment/accesswaco*&f=rss'),
        (u'Opinions', u'http://www.wacotrib.com/search/?q=&t=article&l=25&d=&d1=&d2=&s=start_time&sd=desc&c[]=opinion*&f=rss')
    ]

    remove_javascript = True
    use_embedded_content = False
    no_stylesheets = True
    language = 'en'
    encoding = 'utf-8'
    conversion_options = {'linearize_tables': True}
    auto_cleanup = True
PK�X��LL	walla.png�PNG


IHDR  D����PLTE��������������������������������������������������?������!��"����������	����������������"��%��2��3��7��?��A��G��P��X��_��d�i�s�w����������������������������������������������G�(�tRNS
stux��������������������g9�IDATxڝ�eZ1��^�ݝZ��ww����<�A޿��$��u�!���9/Rӆ�YiF�z�B`xЌ�tJo��n՜��	KJP"�Q�u�K�W�SU�N����G��K�x���`Q���J3Np��x0]e��J+Np����fN�Op���	&��;��Ҫp��kg��J[��f���\�HLy�!�#
H�"�V�h��7u ���1'/�
�hȊr2IEND�B`�PK�X��}}walla.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1283848012(BasicNewsRecipe):
    description = 'The WallaNews.'
    cover_url = 'https://images.wcdn.co.il//2/5/4/2/2542044-46.jpg'
    title = u'Walla'
    language = 'he'
    __author__ = 'marbs & barakplasma'
    extra_css = 'body{direction: rtl;},title{direction: rtl; } ,article_description{direction: rtl; }, a.article{direction: rtl; } ,calibre_feed_description{direction: rtl; }'  # noqa
    simultaneous_downloads = 5
    timefmt = '[%d/%m/%y %H:%M]'
    oldest_article = 1
    max_articles_per_feed = 100
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'title'}),
        dict(name='p', attrs={'class': 'subtitle'}),
        dict(name='p', attrs={'class': 'article_speakable'}),
    ]
    max_articles_per_feed = 100

    feeds = [
        (u'חדשות', u'https://rss.walla.co.il/feed/1?type=main'),
        (u'ספורט', u'https://rss.walla.co.il/feed/3?type=main'),
        (u'כסף', u'https://rss.walla.co.il/feed/2?type=main'),
        (u'רכב', u'https://rss.walla.co.il/feed/31?type=main'),
        (u'תרבות', u'https://rss.walla.co.il/feed/4?type=main'),
        (u'סלבס', u'https://rss.walla.co.il/feed/22?type=main'),
        (u'אופנה', u'https://rss.walla.co.il/feed/24?type=main'),
        (u'אוכל', u'https://rss.walla.co.il/feed/9?type=main'),
        (u'בריאות', u'https://rss.walla.co.il/feed/139?type=main'),
        (u'תיירות', u'https://rss.walla.co.il/feed/14?type=main'),
        (u'TECH', u'https://rss.walla.co.il/feed/6?type=main'),
        (u'כיף', u'https://rss.walla.co.il/feed/13?type=main'),
        (u'בית ועיצוב', u'https://rss.walla.co.il/feed/35?type=main'),
        (u'יהדות', u'https://rss.walla.co.il/feed/138?type=main'),
        (u'מקומי', u'https://rss.walla.co.il/feed/430?type=main')
    ]
PK�XUT'���wallstreetro.png�PNG


IHDR��h6oIDATx@kKS~�wgc6snNg;�
=.�i���=#��з�W� ���
+Q������Lku�m�o�{�N�!b4	�b�!U@��H���(Ԡ*P��Z�����j
�:ӳs����������Q�6��{����h>~>�v���ޟ�ge�d��‹���Kåb� ��s�'�}��y�ܐ{$Ӓ>|~�ObQg��[�����h�������Fgk{��H�DDrٌ�;��"��~W��07�}29kb�k��j��@G���)�Yt?|^W����><xbl�wr�c��dS"�l&L#^DZ���j�j09�a��=}b��Սm#���e�BD��w+�+�^����l_��hL���*Ļ���E�B�b��L�v��7.�)�loMu{���E
j˫?��ZE	�IX�5u(Ѱ��3��e�`ık��\^�V�����F��1�@2��L&=5�fd:�h0�N���/z�B\D� B�s"�]�ө�#����z:܉��rg{�@`)�X��p��t"�p��!+�����PIb^��ꈗmI�01;;�U��%��@a�=Tk� ��T!��ϯ5%bj��>ⲏJIEND�B`�PK�X�3�Z��wallstreetro.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
wall-street.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class WallStreetRo(BasicNewsRecipe):
    title = u'Wall Street'
    __author__ = u'Silviu Cotoar\u0103'
    description = ''
    publisher = 'Wall Street'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare'
    encoding = 'utf-8'
    cover_url = 'http://img.wall-street.ro/images/WS_new_logo.jpg'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'article_header'}), dict(
            name='div', attrs={'class': 'article_text'})
    ]

    remove_tags = [
        dict(name='p', attrs={'class': ['page_breadcrumbs']}), dict(name='div', attrs={'id': ['article_user_toolbox']}), dict(
            name='p', attrs={'class': ['comments_count_container']}), dict(name='div', attrs={'class': ['article_left_column']})
    ]

    remove_tags_after = [
        dict(name='div', attrs={'class': 'clearfloat'})
    ]

    feeds = [
        (u'Feeds', u'http://img.wall-street.ro/rssfeeds/wall-street.xml')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X�
0oo
walrusmag.png�PNG


IHDR��7�6IDATx�c@]EoY~�<�9�1e�3:(�d��@�r�;��G����Y���=��V�K��3•�����+ș������}0�_W�z%��)e�x f�arr^��W�]V��|0;�N�L	����>����M���u��$��@i8t������Q��/D�q}�� aä����N<d��lԁ"/��30�n}�
u )|"���`��T��-��\�~1/�Q�������w����&/�_0=���O�ƒY��ԮCyw���]1bd��1�*os���Ƿ��e��IEND�B`�PK�XoC�uuwalrusmag.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1371743239(BasicNewsRecipe):
    title = u'The Walrus Mag'
    description = 'National general interest magazine about Canada and its place in the world'
    language = 'en'
    __author__ = 'Bert'
    oldest_article = 34
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'The Walrus Mag', u'https://thewalrus.ca/feed/')]

    def get_article_url(self, article):
        ans = BasicNewsRecipe.get_article_url(self, article)
        if ans and ans.startswith('/'):
            ans = 'https://thewalrus.ca' + ans
        return ans
PK�X9t��wapo_cartoons.png�PNG


IHDR:���ZIDATx]��aA�������u䱳a���T+���R��	�й,�1����Ғ�Xi����\�%�x�Z�T��g��󉹌�_x3IEND�B`�PK�XUX9��wapo_cartoons.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup
from datetime import date, timedelta


class WaPoCartoonsRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en'
    version = 2

    title = u'Washington Post Cartoons'
    publisher = u'Washington Post'
    category = u'News, Cartoons'
    description = u'Cartoons from the Washington Post'

    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False
    no_stylesheets = True

    feeds = []
    feeds.append((u'Anderson', u'http://www.uclick.com/client/wpc/wpnan/'))
    feeds.append((u'Auth', u'http://www.uclick.com/client/wpc/ta/'))
    feeds.append(
        (u'Bok', u'http://www.creators.com/featurepages/11_editorialcartoons_chip-bok.html?name=cb'))
    feeds.append((u'Carlson', u'http://www.uclick.com/client/wpc/sc/'))
    feeds.append(
        (u'Luckovich', u'http://www.creators.com/featurepages/11_editorialcartoons_mike-luckovich.html?name=lk'))
    feeds.append((u'McCoy', u'http://www.uclick.com/client/wpc/gm/'))
    feeds.append((u'Pat Oliphant', u'http://www.uclick.com/client/wpc/po/'))
    feeds.append(
        (u'Sargent', u'http://wpcomics.washingtonpost.com/client/wpc/bs/'))
    feeds.append((u'Wilkinson', u'http://www.uclick.com/client/wpc/wpswi/'))

    extra_css = '''
                body {font-family: verdana, arial, helvetica, geneva, sans-serif;}
                h1 {font-size: medium; font-weight: bold; margin-bottom: -0.1em; padding: 0em; text-align: left;}
                #name {margin-bottom: 0.2em}
                #copyright {font-size: xx-small; color: #696969; text-align: right; margin-top: 0.2em;}
                '''

    def parse_index(self):
        index = []
        oldestDate = date.today() - timedelta(days=self.oldest_article)
        oldest = oldestDate.strftime('%Y%m%d')
        for feed in self.feeds:
            cartoons = []
            soup = self.index_to_soup(feed[1])

            cartoon = {'title': 'Current', 'date': None,
                       'url': feed[1], 'description': ''}
            cartoons.append(cartoon)

            select = soup.find('select', attrs={'name': ['url', 'dest']})
            if select:
                cartoonCandidates = []
                if select['name'] == 'url':
                    cartoonCandidates = self.cartoonCandidatesWaPo(
                        select, oldest)
                else:
                    cartoonCandidates = self.cartoonCandidatesCreatorsCom(
                        select, oldest)

                for cartoon in cartoonCandidates:
                    cartoons.append(cartoon)

            index.append([feed[0], cartoons])

        return index

    def preprocess_html(self, soup):
        freshSoup = self.getFreshSoup(soup)

        div = soup.find('div', attrs={'id': 'name'})
        if div:
            freshSoup.body.append(div)
            comic = soup.find('div', attrs={'id': 'comic_full'})

            img = comic.find('img')
            if '&' in img['src']:
                img['src'], sep, bad = img['src'].rpartition('&')

            freshSoup.body.append(comic)
            freshSoup.body.append(soup.find('div', attrs={'id': 'copyright'}))
        else:
            span = soup.find('span', attrs={'class': 'title'})
            if span:
                del span['class']
                span['id'] = 'name'
                span.name = 'div'
                freshSoup.body.append(span)

            img = soup.find('img', attrs={'class': 'pic_big'})
            if img:
                td = img.parent
                td['style'] = ''
                del td['style']
                td.name = 'div'
                td['id'] = 'comic_full'
                freshSoup.body.append(td)

            td = soup.find('td', attrs={'class': 'copy'})
            if td:
                for a in td.find('a'):
                    a.extract()
                del td['class']
                td['id'] = 'copyright'
                td.name = 'div'
                freshSoup.body.append(td)

        return freshSoup

    def getFreshSoup(self, oldSoup):
        freshSoup = BeautifulSoup(
            '<html><head><title></title></head><body></body></html>')
        if oldSoup.head.title:
            freshSoup.head.title.append(self.tag_to_string(oldSoup.head.title))
        return freshSoup

    def cartoonCandidatesWaPo(self, select, oldest):
        opts = select.findAll('option')
        for i in range(1, len(opts)):
            url = opts[i]['value'].rstrip('/')
            dateparts = url.split('/')[-3:]
            datenum = str(dateparts[0]) + str(dateparts[1]) + str(dateparts[2])
            if datenum >= oldest:
                yield {'title': self.tag_to_string(opts[i]), 'date': None, 'url': url, 'description': ''}
            else:
                return

    def cartoonCandidatesCreatorsCom(self, select, oldest):
        monthNames = {'January': '01', 'February': '02', 'March': '03', 'April': '04', 'May': '05',
                      'June': '06', 'July': '07', 'August': '08', 'September': '09', 'October': '10',
                      'November': '11', 'December': '12'}

        opts = select.findAll('option', selected=False)
        for i in range(1, len(opts)):
            dateString = self.tag_to_string(opts[i])
            rest, sep, year = dateString.rpartition(', ')
            parts = rest.split(' ')
            day = parts[2].rjust(2, '0')
            month = monthNames[parts[1]]
            datenum = str(year) + month + str(day)
            if datenum >= oldest:
                yield {'title': dateString, 'date': None, 'url': opts[i]['value'], 'description': ''}
            else:
                return
PK�X�"w���
warentest.png�PNG


IHDR  szz��IDATx����Ua��/׬�ff۶��s�k�6�0/C�=��vOo�q���~���]�̔��w1IHJ��耴�n2PR��a+3�Ä
02#��Z.�����@,#��WF��7/��&�Q�4����������%�e`Ix�지�`�@i*W�dP�%)�,���f;��HJ*<�1K�H�!�eP8��^��^�gx΀���Vz應�a�jx��]�#+ôj0=<�8�p�K��c>�9�#x���sy�q���l�CF�׀���msɠy��Jâ�0�)�k,2_�4����c�uP�ks?_?4��E����4�^E��=;�
j9o��c�����2�|�c�6Cן�#�d"�����O�N�(����yyyy5�8��0IEND�B`�PK�X�%144warentest.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Warentest(BasicNewsRecipe):
    title = u'Warentest'
    language = 'de'
    description = 'Stiftung Warentest is a German consumer organisation and foundation involved in investigating and comparing goods and services in an unbiased way'  # noqa
    __author__ = 'asdfdsfksd'
    needs_subscription = False
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'Test', u'http://www.test.de/rss/alles/')]

    def get_cover_url(self):
        return 'http://www.test.de/img/pp/logo.png'
PK�X���66
wash_post.png�PNG


IHDR@@�.�IDATx���aq� �'a% 	H��H�$D�J�$ !�@�Jv�N����N����,�%W8���4��L#�J�!$�s�,�48X�
{����G[n>�V�YL$Y[II�]j��[cl�z@��2Q�[G�?߄��$B�������6�}@�@��DHP�H�V�bd"$t���ӈB�0G�k:�����wL^<��g�K�C�9o�#Q�=�^��:��]J�&ѧr�]����X�Ix�gM��A ����`��7��3 ��^.�׀��o\��9�Ro�@��2���2�8�.�����*�Y��Z�Ƈ�x؆����Y��"�d$���3���z.��*��K�Wmxh稁�j,���N�_���|֣���(B�D�=Ѷ�l��VV���@��J���G��V��ܕ��(�}�:s��e{`
ܸ��-`��d��uWL���@!S��ߍ������%IEND�B`�PK�X8�	55wash_post.recipe__license__ = 'GPL v3'
__copyright__ = '2011, Darko Miletic <darko.miletic at gmail.com>'
'''
www.washingtonpost.com
'''

from calibre.web.feeds.news import BasicNewsRecipe
from html5_parser import parse
import json


class TheWashingtonPost(BasicNewsRecipe):
    title = 'The Washington Post'
    __author__ = 'Darko Miletic, unkn0wn'
    description = 'Leading source for news, video and opinion on politics, business, world and national news, science, travel, entertainment and more. Our local coverage includes reporting on education, crime, weather, traffic, real estate, jobs and cars for DC, Maryland and Virginia. Offering award-winning opinion writing, entertainment information and restaurant reviews.'  # noqa
    publisher = 'The Washington Post Company'
    category = 'news, politics, USA'
    oldest_article = 1.2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf8'
    use_embedded_content = False
    language = 'en'
    remove_empty_feeds = True
    ignore_duplicate_articles = {'url'}
    masthead_url = 'https://www.washingtonpost.com/pb/resources/img/twp-masthead-415x57.svg'
    publication_type = 'newspaper'
    remove_attributes = ['style', 'width', 'height']

    extra_css = '''
        .img { text-align:center; font-size:small; }
        .auth { font-weight:bold; font-size:small; }
        .time { font-size:small; color: #202020; }
    '''

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, verify_ssl_certificates=False, user_agent='common_words/based')

    # Official feeds: https://www.washingtonpost.com/discussions/2018/10/12/washington-post-rss-feeds/
    feeds = [
        (u'Politics', u'http://feeds.washingtonpost.com/rss/politics'),
        (u'Opinions', u'http://feeds.washingtonpost.com/rss/opinions'),
        (u'Local', u'http://feeds.washingtonpost.com/rss/local'),
        (u'Sports', u'http://feeds.washingtonpost.com/rss/sports'),
        (u'Technology', u'http://feeds.washingtonpost.com/rss/business/technology'),
        (u'National', u'http://feeds.washingtonpost.com/rss/national'),
        (u'World', u'http://feeds.washingtonpost.com/rss/world'),
        (u'Business', u'http://feeds.washingtonpost.com/rss/business'),
        (u'Lifestyle', u'http://feeds.washingtonpost.com/rss/lifestyle'),
        (u'Entertainment',
         u'http://feeds.washingtonpost.com/rss/entertainment'),

        # Undocumented feeds.
        (u'White House',
         u'http://feeds.washingtonpost.com/rss/politics/whitehouse'),
        (u'Commanders', u'http://feeds.washingtonpost.com/rss/sports/redskins'),
    ]

    def preprocess_raw_html(self, raw, *a):
        root = parse(raw)
        m = root.xpath('//script[@id="__NEXT_DATA__"]')

        data = json.loads(m[0].text)
        data = data['props']['pageProps']['globalContent']

        title = '<h1>' + data['headlines']['basic'] + '</h1>'
        subhead = '<h3>' + data['description'].get('basic', '') + '</h3>'

        author = ''
        if 'credits' in data:
            author = '<div><span class="auth">' + 'By ' + ', '.join(x['name'] for x in data['credits']['by']) \
                 + '</span> | <span class="time">' + data['publish_date'][:-14] + '</span></div>'

        body = ''
        for x in data['content_elements']:
            if x['type'] == 'text':
                body += '<p>' + x['content'] + '</p>'
            elif x['type'] == 'video':
                if 'promo_image' in x:
                    body += '<p><div class="img"><img src="{}"><div>{}</div></div></p>'.format(
                        x['promo_image']['url'], x['description'].get('basic', '')
                    )
            elif x['type'] == 'image':
                body += '<p><div class="img"><img src="{}"><div>{}</div></div></p>'.format(x['url'], x['credits_caption_display'])

        return '<html><body><div>' + title + subhead + author + body + '</div></body></html>'

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'src':True}):
            img['src'] = 'https://www.washingtonpost.com/wp-apps/imrs.php?src=' + img['src'] + '&w=916'
        return soup
PK�X���66wash_post_print.png�PNG


IHDR@@�.�IDATx���aq� �'a% 	H��H�$D�J�$ !�@�Jv�N����N����,�%W8���4��L#�J�!$�s�,�48X�
{����G[n>�V�YL$Y[II�]j��[cl�z@��2Q�[G�?߄��$B�������6�}@�@��DHP�H�V�bd"$t���ӈB�0G�k:�����wL^<��g�K�C�9o�#Q�=�^��:��]J�&ѧr�]����X�Ix�gM��A ����`��7��3 ��^.�׀��o\��9�Ro�@��2���2�8�.�����*�Y��Z�Ƈ�x؆����Y��"�d$���3���z.��*��K�Wmxh稁�j,���N�_���|֣���(B�D�=Ѷ�l��VV���@��J���G��V��ܕ��(�}�:s��e{`
ܸ��-`��d��uWL���@!S��ߍ������%IEND�B`�PK�Xy�M�IIwash_post_print.recipe'''
washingtonpost.com
'''

from calibre.web.feeds.news import BasicNewsRecipe
from html5_parser import parse
import json

class wapoprint(BasicNewsRecipe):
    title = 'The Washington Post | Print Edition'
    __author__ = 'unkn0wn'
    description = (
        'Leading source for news, video and opinion on politics, business, world and national news, science,'
        ' travel, entertainment and more. Our local coverage includes reporting on education, crime, weather,'
        ' traffic, real estate, jobs and cars for DC, Maryland and Virginia. Offering award-winning opinion writing,'
        ' entertainment information and restaurant reviews.'
    )
    publisher = 'The Washington Post Company'
    category = 'news, politics, USA'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    language = 'en'
    remove_attributes = ['style', 'height', 'width']
    publication_type = 'newspaper'
    ignore_duplicate_articles = {'title', 'url'}
    masthead_url = 'https://www.washingtonpost.com/pb/resources/img/twp-masthead-415x57.svg'
    extra_css = '''
        .img { text-align:center; font-size:small; }
        .auth { font-weight:bold; font-size:small; }
        .time { font-size:small; color: #202020; }
    '''

    def get_browser(self):
        return BasicNewsRecipe.get_browser(self, user_agent='common_words/based')

    def parse_index(self):
        soup = self.index_to_soup('https://www.washingtonpost.com/todays_paper/updates/')
        if img := soup.find('img', attrs={'src':lambda x: x and x.endswith('_FrontPage.png')}):
            self.cover_url  = img['src']
        if h2 := soup.find('h2', attrs={'class':lambda x: x and 'font--subhead' in x.split()}):
            self.title = 'WaPo Print | ' + self.tag_to_string(h2)

        feeds = []

        for div in soup.findAll('section', attrs={'id': True}):
            secname = self.tag_to_string(div.find('label')).strip()
            self.log(secname)
            articles = []
            for a in div.findAll('a', href=True):
                url = a['href']
                title = self.tag_to_string(a).strip()
                if not title or not url:
                    continue
                self.log('\t', title)
                self.log('\t\t', url)
                articles.append({'title': title, 'url': url})
            if articles:
                feeds.append((secname, articles))
        return feeds

    def preprocess_raw_html(self, raw, *a):
        root = parse(raw)
        m = root.xpath('//script[@id="__NEXT_DATA__"]')

        data = json.loads(m[0].text)
        data = data['props']['pageProps']['globalContent']

        title = '<h1>' + data['headlines']['basic'] + '</h1>'
        subhead = '<h3>' + data['description'].get('basic', '') + '</h3>'

        author = ''
        if 'credits' in data:
            author = '<div><span class="auth">' + 'By ' + ', '.join(x['name'] for x in data['credits']['by']) \
                 + '</span> | <span class="time">' + data['publish_date'][:-14] + '</span></div>'

        body = ''
        for x in data['content_elements']:
            if x['type'] == 'text':
                body += '<p>' + x['content'] + '</p>'
            elif x['type'] == 'video':
                if 'promo_image' in x:
                    body += '<p><div class="img"><img src="{}"><div>{}</div></div></p>'.format(
                        x['promo_image']['url'], x['description'].get('basic', '')
                    )
            elif x['type'] == 'image':
                body += '<p><div class="img"><img src="{}"><div>{}</div></div></p>'.format(x['url'], x['credits_caption_display'])

        return '<html><body><div>' + title + subhead + author + body + '</div></body></html>'

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'src':True}):
            img['src'] = 'https://www.washingtonpost.com/wp-apps/imrs.php?src=' + img['src'] + '&w=916'
        return soup

    def populate_article_metadata(self, article, soup, first):
        article.summary = self.tag_to_string(soup.find('h3'))
        article.text_summary = self.tag_to_string(soup.find('h3'))
PK�XP%4=	=	wash_times.recipe#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

import re
from calibre.web.feeds.news import BasicNewsRecipe


class WashingtonTimes(BasicNewsRecipe):

    title = 'Washington Times'
    max_articles_per_feed = 15
    language = 'en'
    __author__ = 'Kos Semonski'

    preprocess_regexps = [(re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in
                          [
        (r'<HEAD>.*?</HEAD>', lambda match: '<HEAD></HEAD>'),
        (r'<div id="apple-rss-sidebar-background">.*?<!-- start Entries -->',
         lambda match: ''),
        (r'<!-- end apple-rss-content-area -->.*?</body>', lambda match: '</body>'),
        (r'<script.*?>.*?</script>', lambda match: ''),
        (r'<body onload=.*?>.*?<a href="http://www.upi.com">',
         lambda match: '<body style="font: 8pt arial;">'),
        (r'<script src="http://www.g.*?>.*?</body>', lambda match: ''),
        (r'<span style="font: 16pt arial',
         lambda match: '<span style="font: 12pt arial'),
    ]
    ]

    def get_feeds(self):
        return [(u'Headlines', u'http://www.washingtontimes.com/rss/headlines/news/headlines/'),
                (u'Newsmakers', u'http://www.washingtontimes.com/rss/headlines/news/newsmakers/'),
                (u'National', u'http://www.washingtontimes.com/rss/headlines/news/national/'),
                (u'World', u'http://www.washingtontimes.com/rss/headlines/news/world/'),
                (u'Editor Favs', u'http://www.washingtontimes.com/rss/headlines/news/editor-favorites/'),
                (u'Editorials', u'http://www.washingtontimes.com/rss/headlines/opinion/editorials/'),
                (u'Cartoons', u'http://www.washingtontimes.com/rss/headlines/opinion/cartoons/'),
                (u'Business', u'http://www.washingtontimes.com/rss/headlines/news/business/'),
                (u'Technology', u'http://www.washingtontimes.com/rss/headlines/news/technology/'),
                (u'Security', u'http://www.washingtontimes.com/rss/headlines/news/security/'),
                (u'Politics', u'http://www.washingtontimes.com/rss/headlines/news/politics/'),
                (u'Congress', u'http://www.washingtontimes.com/rss/headlines/news/congress/'),
                ]

    def print_version(self, url):
        return url + '/print/'
PK�XEᜭ[[watchingamerica.recipefrom calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup


class WatchingAmericaRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en'
    version = 1

    title = u'Watching America'
    publisher = u'watchingamerica.com'
    category = u'News'
    description = u'Global opinion about the United States'

    oldest_article = 7
    max_articles_per_feed = 100
    use_embedded_content = False

    no_stylesheets = True
    remove_javascript = True
    remove_attributes = ['style']

    extra_css = '''
                    body{font-family:verdana,arial,helvetica,geneva,sans-serif ;}
                    .main_content em {font-size: x-small; font-style: italic; color: #696969;}
                    .main_content span strong {font-size: x-large; font-weight: bold;}
                    .insideitro {font-size: xx-small; font-style: italic; color: #666666;}
                    span {padding: 0em; margin 0em;}
                '''

    INDEX = u'http://watchingamerica.com/News/'

    def parse_index(self):
        answer = []

        soup = self.index_to_soup(self.INDEX)

        articles = []
        feature = soup.find('div', attrs={'id': 'headzone'})
        if feature:
            link = feature.find('a', attrs={'class': 'feature'})
            url = link.get('href', None)
            title = self.tag_to_string(link)
            description = self.tag_to_string(
                feature.find('h1', attrs={'class': 'pull'}))
            article = {'title': title, 'date': u'',
                       'url': url, 'description': description}
            articles.append(article)
            answer.append(('Feature', articles))

        feed_titles = ['Translations from the West',
                       'Translations from the East']
        for i in range(1, 3):
            articles = []
            div = soup.find('div', attrs={'class': 'newscol' + str(i)})
            if div:
                for link in div.findAll('a', attrs={'class': 'headline'}):
                    url = link.get('href', None)
                    title = self.tag_to_string(link)

                    description = None
                    h3 = link.findNextSibling('h3')
                    if h3:
                        description = self.tag_to_string(h3)

                    article = {'title': title, 'date': u'',
                               'url': url, 'description': description}
                    articles.append(article)
            answer.append((feed_titles[i - 1], articles))

        return answer

    def preprocess_html(self, soup):
        freshSoup = self.get_fresh_soup(soup)
        article = soup.find('p', attrs={'class': 'MsoNormal'}).parent
        if article:
            article.name = 'div'
            del article['width']
            article['class'] = 'main_content'
            org = article.find('a', attrs={'href': '?SHOW_ORIGINAL_TEXT'})
            if org:
                org.parent.extract()

            intro = article.find('span', attrs={'class': 'insideitro'})
            if intro:
                for el in intro.findAll(['strong', 'em', 'br']):
                    if el.name == 'br':
                        el.extract()
                    else:
                        el.name = 'div'

            freshSoup.body.append(article)

        return freshSoup

    def get_fresh_soup(self, oldSoup):
        freshSoup = BeautifulSoup(
            '<html><head><title></title></head><body></body></html>')
        if oldSoup.head.title:
            freshSoup.head.title.append(self.tag_to_string(oldSoup.head.title))
        return freshSoup
PK�X����WWweblogs_sl.recipe#!/usr/bin/env  python
__license__     = 'GPL v3'
__copyright__   = '4 February 2011, desUBIKado'
__author__      = 'desUBIKado'
__version__     = 'v0.12'
__date__        = '28, Jul 2016'
'''
http://www.weblogssl.com/
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class weblogssl(BasicNewsRecipe):
    __author__     = 'desUBIKado'
    description    = u'Weblogs colectivos dedicados a seguir la actualidad sobre tecnologia, entretenimiento, estilos de vida, motor, deportes y economia.'
    title          = u'Weblogs SL (Xataka, Genbeta, VidaExtra, Blog de Cine y otros)'
    publisher      = 'Weblogs SL'
    language       = 'es'
    timefmt        = '[%a, %d %b, %Y]'
    oldest_article = 1
    max_articles_per_feed = 100
    encoding       = 'utf-8'
    use_embedded_content  = False
    remove_empty_feeds    = True
    remove_javascript = True
    no_stylesheets = True

    # Si no se quiere recuperar todos los blogs se puede suprimir la descarga del que se desee poniendo
    # un caracter # por delante, es decir,  # ,(u'Applesfera', u'http://feeds.weblogssl.com/applesfera')
    # haría que no se descargase Applesfera.

    feeds              = [
        (u'Xataka', u'http://feeds.weblogssl.com/xataka2')
        ,(u'Xataka M\xf3vil', u'http://feeds.weblogssl.com/xatakamovil')
        ,(u'Xataka Foto', u'http://feeds.weblogssl.com/xatakafoto')
        ,(u'Xataka Android', u'http://feeds.weblogssl.com/xatakandroid')
        ,(u'Xataka Smart Home', u'http://feeds.weblogssl.com/Xatakahome')
        ,(u'Xataka Windows', u'http://feeds.weblogssl.com/xatakawindows')
        ,(u'Xataka Ciencia', u'http://feeds.weblogssl.com/xatakaciencia')
        ,(u'Applesfera', u'http://feeds.weblogssl.com/applesfera')
        ,(u'Vida Extra', u'http://feeds.weblogssl.com/vidaextra')
        ,(u'Genbeta', u'http://feeds.weblogssl.com/genbeta')
        ,(u'Genbeta Dev', u'http://feeds.weblogssl.com/genbetadev')
        ,(u'Magnet', u'http://feeds.weblogssl.com/xatakamagnet2')


        ,(u'Tendencias', u'http://feeds.weblogssl.com/trendencias')
        ,(u'Tendencias Belleza', u'http://feeds.weblogssl.com/trendenciasbelleza')
        ,(u'Tendencias Hombre', u'http://feeds.weblogssl.com/trendenciashombre')
        ,(u'Tendencias Lifestyle', u'http://feeds.weblogssl.com/trendenciaslifestyle')
        ,(u'Directo al paladar', u'http://feeds.weblogssl.com/directoalpaladar')
        ,(u'Beb\xe9s y m\xe1s', u'http://feeds.weblogssl.com/bebesymas')
        ,(u'Vit\xf3nica', u'http://feeds.weblogssl.com/vitonica')
        ,(u'Decoesfera', u'http://feeds.weblogssl.com/decoesfera')
        ,(u'Embelezzia', u'http://feeds.weblogssl.com/embelezzia')
        ,(u'Pop rosa', u'http://feeds.weblogssl.com/poprosa')

        ,(u'Motorpasi\xf3n', u'http://feeds.weblogssl.com/motorpasion')
        ,(u'Motorpasi\xf3n Moto', u'http://feeds.weblogssl.com/motorpasionmoto')
        ,(u'Motorpasi\xf3n Futuro', u'http://feeds.weblogssl.com/motorpasionfuturo')

        ,(u'Blog de Cine', u'http://feeds.weblogssl.com/blogdecine')
        ,(u'Vaya tele', u'http://feeds.weblogssl.com/vayatele2')
        ,(u'Diario del viajero', u'http://feeds.weblogssl.com/diariodelviajero')
        ,(u'Papel en blanco', u'http://feeds.weblogssl.com/papelenblanco')

        ,(u'El blog salm\xf3n', u'http://feeds.weblogssl.com/elblogsalmon2')
        ,(u'Pymes y aut\xf3nomos', u'http://feeds.weblogssl.com/pymesyautonomos')
        ,(u'Ahorro diario', u'http://feeds.weblogssl.com/ahorrodiario')

        ,(u'Xataka México', u'http://feeds.weblogssl.com/xatakamx')
        ,(u'Xataka Android México', u'http://feeds.weblogssl.com/xatakandroidmx')
        ,(u'Vida Extra México', u'http://feeds.weblogssl.com/vidaextramx')
        ,(u'Xataka Colombia', u'http://feeds.weblogssl.com/xatakaco')

        ,(u'Directo al paladar México', u'http://feeds.weblogssl.com/directoalpaladarmx')
        ,(u'Vit\xf3nica México', u'http://feeds.weblogssl.com/vitonicamx')
        ,(u'Tendencias Hombre México', u'http://feeds.weblogssl.com/trendenciashombremx')

        ,(u'Motorpasi\xf3n México', u'http://feeds.weblogssl.com/motorpasionmx')
    ]

    keep_only_tags     = [
                          dict(name='div', attrs={'class':'content-container'})
                         ]

    remove_tags        = [
                          dict(name='div', attrs={'class':'article-social-share m-v1 js-article-share js-article-social-share'}),
                          dict(name='div', attrs={'class':'article-social-share m-v1 js-article-social-share'}),
                          dict(name='div', attrs={'class':'social-widgets'}),
                          dict(name='div', attrs={'class':'article-social-share m-in-normal'}),
                          dict(name='div', attrs={'class':'article-comments'}),
                          dict(name='div', attrs={'class':'article-links'}),
                          dict(name='div', attrs={'class':'article-topics-list'}),
                          dict(name='div', attrs={'class':'ad-box'}),
                          dict(name='blockquote', attrs={'class':'instagram-media'}),
                          dict(name='img', attrs={'alt':'Código QR'}),
                          dict(name='div', attrs={'id':'comments'})
                         ]

    remove_tags_after  = dict(name='div' , attrs={'id':'comments'})

    def print_version(self, url):
        if url.startswith('http://www'):
            return url.replace('http://www.', 'http://m.')
        else:
            return url.replace('http://', 'http://m.')

    preprocess_regexps = [
        # Para poner una linea en blanco entre un comentario y el siguiente
        (re.compile(r'<li id="c', re.DOTALL|re.IGNORECASE), lambda match: '<br><br><li id="c'),
        # Para ver las imágenes en las noticias de m.xataka.com
        (re.compile(r'<noscript>', re.DOTALL|re.IGNORECASE), lambda m: ''),
        (re.compile(r'</noscript>', re.DOTALL|re.IGNORECASE), lambda m: ''),

        # Para cambiar de sitio el more
        (re.compile(r'<div class="article-content">', re.DOTALL|re.IGNORECASE), lambda m: '<div class="article-content"><!--more-->'),
        (re.compile(r'<div class="\/n<!--more-->">', re.DOTALL|re.IGNORECASE), lambda m: ''),

        # Para presentar la primera imagen del artículo
        (re.compile(r' srcset="http://i.blogs.es/', re.DOTALL|re.IGNORECASE), lambda match: ' src="http://i.blogs.es/'),
        (re.compile(r' 450w, http://i.blogs.es', re.DOTALL|re.IGNORECASE), lambda match: '"><!--'),
        (re.compile(r'1366w"><span></span>', re.DOTALL|re.IGNORECASE), lambda match: '-->'),
        (re.compile(r'1366w" sf-src="http://i.blogs.es', re.DOTALL|re.IGNORECASE), lambda match: '--> sf-src="http://i.blogs.es')
    ]

    # Para sustituir el video incrustado de YouTube por una imagen

    def preprocess_html(self, soup):
        for video_yt in soup.findAll('iframe',{'title':'YouTube video player'}):
            if video_yt:
                video_yt.name = 'img'
                fuente = video_yt['src']
                fuente2pre = fuente.replace('http://www.youtube.com/embed/','http://img.youtube.com/vi/')
                fuente2 = fuente2pre.replace('https://www.youtube.com/embed/','https://img.youtube.com/vi/')
                fuente3 = fuente2.replace('?rel=0','')
                video_yt['src'] = fuente3 + '/0.jpg'

        for video_yt2 in soup.findAll('iframe',{'allowfullscreen'}):
            if video_yt2:
                esyt = video_yt2.find('youtube')
                if esyt:
                    video_yt2.name = 'img'
                    fuente = video_yt2['src']
                    fuente2pre = fuente.replace('http://www.youtube.com/embed/','http://img.youtube.com/vi/')
                    fuente2 = fuente2pre.replace('https://www.youtube.com/embed/','https://img.youtube.com/vi/')
                    video_yt2['src'] = fuente2 + '/0.jpg'

        return soup

    def get_article_url(self, article):
        return article.get('guid', None)
PK�X�.R�FFweilheimer_tagblatt.png�PNG


IHDR�a
IDATxڕ�p&A���+��ٶm_�l۶m۶��؍m�~鎝��j=��
��9��'���N�Д�ÊJ��G�h~R���Uh{Z�y�U�U��:!z^��49���o����#�oʰ=�l��1%����D��;�Y��FZ�`}�ȆO�+(�OZ�R������Yy`#���6�o�Bؗ>�r�
��g8z�+�Qi U�f@~	$<%Ӟx�>
$z��u�I����,���#+7����
`}�M�|�9&-�z�������g��Hq�W�(o��.a�S/d֔A�6�X_��hsZ���h,{����ϼk�<�vp8�Y����9�C�\��x� ��dS`�{�F}.�v8�e��y]%�Ն�0�J�HQ%>(,y�+�����c-��Avеⱕ�y����Ehr��/�Â6<bwN���g�0@)��‚z��ሂ�{S��7$A�4~Sz�c&�v;����q_��^�1�G���]�oˢp�L�J���IEND�B`�PK�X��FFweilheimer_tagblatt.recipe# vim:fileencoding=utf-8
from __future__ import unicode_literals
##
# Written:      November 2014 (new coding)
# Version:      1.0
# Last update:  2014-011-11
##

__license__ = 'GPL v3'
__copyright__ = ''
'''
Fetch RSS-Feeds Münchner Merkur.de
'''
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1414926536(BasicNewsRecipe):
    title = u'Weilheimer Tagblatt'
    __author__ = 'Bernd Boehm'
    description = u'German  online portal of Münchner Merkur'
    publisher = 'Münchener Zeitungs-Verlag GmbH & Co.KG '
    category = 'daily local paper, Germany'
    language = 'de'
    oldest_article = 1
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [

    (u'Schlagzeilen',
         u'http://www.merkur-online.de/aktuelles/schlagzeilen-des-tages/rssfeed.rdf'),

    (u'Politik', u'http://www.merkur-online.de/aktuelles/politik/rssfeed.rdf'),
    (u'Wirtschaft',
                                                                                     u'http://www.merkur-online.de/aktuelles/wirtschaft/rssfeed.rdf'),

    (u'Welt', u'http://www.merkur-online.de/aktuelles/welt/rssfeed.rdf'),
    (u'Bayern', u'http://www.merkur-online.de/aktuelles/bayern/rssfeed.rdf'),
    (u'Regionen', u'http://www.merkur-online.de/lokales/regionen/rssfeed.rdf'),
    (u'Multimedia', u'http://www.merkur-online.de/aktuelles/computer-wissen/rssfeed.rdf'),

    (u'Kultur', u'http://www.merkur-online.de/aktuelles/kultur/rssfeed.rdf'),
    (u'Boulevard', u'http://www.merkur-online.de/aktuelles/boulevard/rssfeed.rdf'),

    (u'Weilheim', u'http://www.merkur-online.de/lokales/weilheim/rssfeed.rdf'),
    (u'Region Weilheim', u'http://www.merkur-online.de/lokales/weilheim/seeshaupt/rssfeed.rdf'),
    (u'Seeshaupt', u'http://www.merkur-online.de/lokales/weilheim/seeshaupt/rssfeed.rdf'),
    (u'Raisting', u'http://www.merkur-online.de/lokales/weilheim/raisting/rssfeed.rdf'),
    (u'Wessobrunn', u'http://www.merkur-online.de/lokales/weilheim/wessobrunn/rssfeed.rdf'),
    (u'Penzberg', u'http://www.merkur-online.de/lokales/weilheim/penzberg/rssfeed.rdf'),
    (u'Stadt Weilheim', u'http://www.merkur-online.de/lokales/weilheim/weilheim/rssfeed.rdf'),
    (u'Pei\xdfenberg', u'http://www.merkur-online.de/lokales/weilheim/peissenberg/rssfeed.rdf'),
    (u'Babys', u'http://www.merkur-online.de/lokales/weilheim/babys/rssfeed.rdf'),

    (u'Sport', u'http://www.merkur-online.de/sport/rssfeed.rdf'),

    (u'FC-Bayern',
         u'http://www.merkur-online.de/sport/fc-bayern/rssfeed.rdf'),

    (u'TSV 1860',
         u'http://www.merkur-online.de/sport/tsv-1860/rssfeed.rdf'),

    (u'Fussball',
         u'http://www.merkur-online.de/sport/fussball/rssfeed.rdf'),

    (u'FCB Basketball',
         u'http://www.merkur-online.de/sport/fcb-basketball/rssfeed.rdf'),

    (u'Mehr Sport',
         u'http://www.merkur-online.de/sport/mehr-sport/rssfeed.rdf'),

    (u'Wintersport',
         u'http://www.merkur-online.de/sport/wintersport/rssfeed.rdf'),

    (u'Eishockey',
         u'http://www.merkur-online.de/sport/eishockey/rssfeed.rdf'),

    (u'Service', u'http://www.merkur-online.de/service/rssfeed.rdf'),

    (u'Auto', u'http://www.merkur-online.de/service/auto/rssfeed.rdf'),

    (u'Karriere',
         u'http://www.merkur-online.de/service/karriere/rssfeed.rdf'),

    (u'Wohnen', u'http://www.merkur-online.de/service/wohnen/rssfeed.rdf'),

    (u'Gesundheit',
         u'http://www.merkur-online.de/service/gesundheit/rssfeed.rdf'),

    (u'Specials',
         u'http://www.merkur-online.de/service/specials/rssfeed.rdf'),

    (u'Reise', u'http://www.merkur-online.de/freizeit/reise/rssfeed.rdf'),

    (u'Bayrischer Wald',
         u'http://www.merkur-online.de/freizeit/reise/bayerischer-wald/rssfeed.rdf'),

    (u'Freizeit', u'http://www.merkur-online.de/freizeit/rssfeed.rdf'),

    (u'Outdoor', u'http://www.merkur-online.de/freizeit/outdoor/rssfeed.rdf')]
PK�X&�q��welt.png�PNG


IHDR(-S�PLTE����������������¿���]f��������儌�������7I����qz����������������������x�����o�Ѱ��(F����Ha�������x����ᰯ����3u���v�¦��I�^n�\o����[e��߲\��tRNS@��f�IDATx^M�Վ�@C�d��t��m��V�yʱ��!"M���=�?��߄R��h�{��li>��T>D�<��S���c��'dQ[�]
w=yH��MBp�R���żLB��bFkR�}ռƮی��ޗl�Y��y��)�B�D�9���%��W��~�a�2�#<�դՂh
]@��IEND�B`�PK�XU+-���welt.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch Weltonline.
'''

from calibre.web.feeds.news import BasicNewsRecipe


class weltDe(BasicNewsRecipe):

    title = 'Weltonline'
    description = 'german newspaper'
    language = 'de'
    __author__ = 'Oliver Niesner'
    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 15
    linearize_tables = True
    no_stylesheets = True
    remove_stylesheets = True
    remove_javascript = True
    encoding = 'utf-8'
    html2epub_options = 'base_font_size=10'
    BasicNewsRecipe.summary_length = 100

    remove_tags = [dict(id='jumplinks'),
                   dict(id='ad1'),
                   dict(id='top'),
                   dict(id='header'),
                   dict(id='additionalNavWrapper'),
                   dict(id='fullimage_index'),
                   dict(id='additionalNav'),
                   dict(id='printMenu'),
                   dict(id='topteaser1'),
                   dict(id='topteaser2'),
                   dict(id='servicesBox'),
                   dict(id='servicesNav'),
                   dict(id='ad2'),
                   dict(id='banner_1'),
                   dict(id='ssoInfoTop'),
                   dict(id='brandingWrapper'),
                   dict(id='links-intern'),
                   dict(id='navigation'),
                   dict(id='subNav'),
                   dict(id='branding'),
                   dict(id='servicesNav'),
                   dict(id='searchArea'),
                   dict(id='servicesBox'),
                   dict(id='toggleAdvancedSearch'),
                   dict(id='mainNav'),
                   dict(id='articleInlineMediaBox0'),
                   dict(id='sectionSponsor'),
                   dict(id='sprucharea'),
                   dict(id='xmsg_recommendEmail'),
                   dict(id='xmsg_recommendSms'),
                   dict(id='xmsg_comment'),
                   dict(id='additionalNavWrapper'),
                   dict(id='imagebox'),
                   dict(id='footerContainer'),
                   # dict(id=''),
                   dict(name='span'),
                   dict(name='div', attrs={'class': 'printURL'}),
                   dict(name='ul', attrs={
                        'class': 'clear mainNavigation inline'}),
                   dict(name='ul', attrs={'class': 'inline'}),
                   dict(name='ul', attrs={'class': 'ubar'}),
                   dict(name='hr', attrs={'class': 'ubar'}),
                   dict(name='li', attrs={'class': 'counter'}),
                   dict(name='li', attrs={'class': 'browseBack'}),
                   dict(name='li', attrs={'class': 'browseNext'}),
                   dict(name='li', attrs={'class': 'selected'}),
                   dict(name='div', attrs={'class': 'floatLeft'}),
                   dict(name='div', attrs={'class': 'ad'}),
                   dict(name='div', attrs={'class': 'ftBarLeft'}),
                   dict(name='div', attrs={'class': 'clear additionalNav'}),
                   dict(name='div', attrs={
                        'class': 'inlineBox inlineFurtherLinks'}),
                   dict(name='div', attrs={
                        'class': 'inlineBox videoInlineBox'}),
                   dict(name='div', attrs={'class': 'inlineGallery'}),
                   dict(name='div', attrs={'class': 'ratingBox'}),
                   dict(name='div', attrs={'class': 'socialBookmarks clear'}),
                   dict(name='div', attrs={'class': 'articleOptions clear'}),
                   dict(name='div', attrs={'class': 'noPrint galleryIndex'}),
                   dict(name='div', attrs={
                        'class': 'inlineBox inlineTagCloud'}),
                   dict(name='div', attrs={
                        'class': 'clear module imageGalleryBig bgColor1'}),
                   dict(name='div', attrs={
                        'class': 'clear module writeComment bgColor1'}),
                   dict(name='div', attrs={
                        'class': 'clear module textGallery bgColor1'}),
                   dict(name='div', attrs={'class': 'moreArtH3'}),
                   dict(name='div', attrs={'class': 'jqmWindow'}),
                   dict(name='div', attrs={'class': 'clear gap4'}),
                   dict(name='div', attrs={'class': 'hidden'}),
                   dict(name='div', attrs={'class': 'advertising'}),
                   dict(name='div', attrs={'class': 'ad adMarginBottom'}),
                   dict(name='div', attrs={'class': 'ad'}),
                   dict(name='div', attrs={'class': 'topLine'}),
                   dict(name='div', attrs={'class': 'toplineH2'}),
                   dict(name='div', attrs={'class': 'headLineH3'}),
                   dict(name='div', attrs={'class': 'print'}),
                   dict(name='div', attrs={'class': 'clear menu'}),
                   dict(name='div', attrs={'class': 'themenalarm'}),
                   dict(name='p', attrs={'class': 'jump'}),
                   dict(name='a', attrs={'class': 'commentLink'}),
                   dict(name='h2', attrs={'class': 'jumpHeading'}),
                   dict(name='ul', attrs={'class': 'optionsSubNav clear'}),
                   dict(name='li', attrs={'class': 'next'}),
                   dict(name='li', attrs={'class': 'prev'}),
                   dict(name='li', attrs={'class': 'last'}),
                   dict(name='table', attrs={'class': 'textGallery'}),
                   dict(name='li', attrs={'class': 'active'})]

    remove_tags_after = [dict(name='div', attrs={'class': 'themenalarm'})]

    extra_css = '''
                    h2{font-family:Arial,Helvetica,sans-serif; font-size: x-small; color: #003399;}
                    a{font-family:Arial,Helvetica,sans-serif; font-size: x-small; font-style:italic;}
                    .dachzeile p{font-family:Arial,Helvetica,sans-serif; font-size: x-small; }
                    h1{ font-family:Arial,Helvetica,sans-serif;  font-size:x-large; font-weight:bold;}
                    .artikelTeaser{font-family:Arial,Helvetica,sans-serif; font-size: x-small; font-weight:bold; }
                    body{font-family:Arial,Helvetica,sans-serif; }
                    .photo {font-family:Arial,Helvetica,sans-serif; font-size: x-small; color: #666666;}                 '''

    feeds = [('Politik', 'http://welt.de/politik/?service=Rss'),
             ('Deutsche Dinge', 'http://www.welt.de/deutsche-dinge/?service=Rss'),
             ('Wirtschaft', 'http://welt.de/wirtschaft/?service=Rss'),
             ('Finanzen', 'http://welt.de/finanzen/?service=Rss'),
             ('Sport', 'http://welt.de/sport/?service=Rss'),
             ('Webwelt', 'http://welt.de/webwelt/?service=Rss'),
             ('Kultur', 'http://welt.de/kultur/?service=Rss'),
             ('Literarische Welt', 'http://welt.de/kultur/literarischewelt/?service=Rss'),
             ('Wissenschaft', 'http://welt.de/wissenschaft/?service=Rss'),
             ('Satire', 'http://welt.de/satire/?service=Rss'),
             ('Motor', 'http://welt.de/motor/?service=Rss'),
             ('Vermischtes', 'http://welt.de/vermischtes/?service=Rss')]

    def print_version(self, url):
        return url.replace('.html', '.html?print=true')
PK�X'�9e��welt_der_physik.png�PNG


IHDR  V%(aIDAT8�]��SW�o�˾��e���
"6�X��Xh��!���J,�hLb��ifT��1;:�.f|��ӝ{>w��~���tz�+�xxs�\�LrLe��xZ����;�I\��z��ٹ�?rs?($�����e�|%��d�0HJ��7@�&g���$v��ppw�^M{�
8l�C���G����[���F�p��,�
�}m[;�����J���IF:v����K �5�K,��s�B�������*P��R��H�mkv
-�7���m��ݒ����!�f��ݝf ��O3�[����y9uB�q����~�5�K���Nr{c��w��
��'�:��{*�b����˚���7nX��H�%B^��f_������s�+?*}�]@"�	�y0��9�.�|�N�$S�ģ<J�ƑY��p)NG���}�ة�+��k�X?�U�q<�������*^"�A��o�$Շ��a��c�-��@�K
w�L�X?J�������'A+��W���邻i��LC�0��i���G�y�p��^��p��!�ŏ�DVi��{{���L�ù��O��l6�4�"hc��J�P� �#���@�O�����ʈ�!��%�
BM��ܢv����;F,&~֟

��F#3#��cQ�M����5��B�A0�'�aP����Ͻ�^�K�@3�#���1ຎ���Tƒ�"Z��SQ:�K_=��$�o/���t��6ZGє�:$ؕ+W?C�&MQ]������0{m�J�
@]�!���
Neڈ��V��#��l�i0�բH�_�W(Nx��q�3�w�}qQ�j:��~�9�I���g����u�IEND�B`�PK�Xހ%���welt_der_physik.recipe#!/usr/bin/env python
__license__   = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch weltderphysik.de.
'''

from calibre.web.feeds.news import BasicNewsRecipe


class WeltDerPhysikDe(BasicNewsRecipe):

    title = 'Welt der Physik'
    description = 'Welt der Physik - heute schon geforscht?'
    __author__ = 'Bernd Kunze'
    use_embedded_content   = False
    language = 'de'
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 100
    no_stylesheets = True
    oldest_article = 7

    keep_only_tags = [
        dict(name='div', attrs={'class':'row content'}),
    ]

    feeds          = [
        ('Welt der Physik', 'http://www.weltderphysik.de/RSS-alles/'),
    ]
PK�XSBzzwenxuecity-znjy.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2010, Derek Liang <Derek.liang.ca @@@at@@@ gmail.com>'
'''
wenxuecity.com
'''
import re

from calibre.web.feeds.news import BasicNewsRecipe


class TheCND(BasicNewsRecipe):

    title = 'wenxuecity - znjy'
    __author__ = 'Derek Liang'
    description = ''
    INDEX = 'http://bbs.wenxuecity.com/znjy/?elite=1'
    language = 'zh'
    conversion_options = {'linearize_tables': True}

    remove_tags_before = dict(name='div', id='message')
    remove_tags_after = dict(name='div', id='message')
    remove_tags = [dict(name='div', id='postmeta'),
                   dict(name='div', id='footer')]
    no_stylesheets = True

    preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')]

    def print_version(self, url):
        return url + '?print'

    def parse_index(self):
        soup = self.index_to_soup(self.INDEX)

        feeds = []
        articles = {}

        for a in soup.findAll('a', attrs={'class': 'post'}):
            url = a['href']
            if url.startswith('/'):
                url = 'http://bbs.wenxuecity.com' + url
            title = self.tag_to_string(a)
            self.log('\tFound article: ', title, ' at:', url)
            dateReg = re.search(r'(\d\d?)/(\d\d?)/(\d\d)',
                                self.tag_to_string(a.parent))
            date = '%(y)s/%(m)02d/%(d)02d' % {'y': dateReg.group(3),
                                              'm': int(dateReg.group(1)), 'd': int(dateReg.group(2))}
            if date not in articles:  # noqa
                articles[date] = []
            articles[date].append(
                {'title': title, 'url': url, 'description': '', 'date': ''})
            self.log('\t\tAppend to : ', date)

        self.log('log articles', articles)
        mostCurrent = sorted(articles).pop()
        self.title = '文学城 - 子女教育 - ' + mostCurrent

        feeds.append((self.title, articles[mostCurrent]))

        return feeds

    def populate_article_metadata(self, article, soup, first):
        header = soup.find('h3')
        self.log('header: ' + self.tag_to_string(header))
        pass
PK�X�what_if.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class XkcdCom(BasicNewsRecipe):
    cover_url = 'http://what-if.xkcd.com/imgs/whatif-logo.png'
    masthead_url = 'http://what-if.xkcd.com/imgs/whatif-logo.png'
    __author__ = 'kisnik'
    title = 'What If...'
    description = 'The "What If" feed from xkcd'
    language = 'en'
    keep_only_tags = [dict(name='article')]

    use_embedded_content = False
    oldest_article = 60
    # add image and text
    # add an horizontal line after the question
    preprocess_regexps = [
        (re.compile(r'(<img.*title=")([^"]+)(".*>)'),
         lambda m: '<div>%s%s<p id="photo_text">(%s)</p></div>' % (m.group(1), m.group(3), m.group(2))),
        (re.compile(r'(<p.*id="attribute">[^>]+</p>)'),
         lambda n: '%s<hr>' % (n.group(1))),
    ]

    extra_css = "#photo_text{font-size:small;}"

    feeds = [(u'What If...', u'http://what-if.xkcd.com/feed.atom')]
PK�Xx-�wichita_eagle.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1294938721(BasicNewsRecipe):
    title = u'Wichita Eagle'
    language = 'en'
    __author__ = 'Jason Cameron'
    description = 'Daily news from the Wichita Eagle'
    oldest_article = 1
    max_articles_per_feed = 30
    keep_only_tags = [dict(name='div', attrs={'id': 'wide'})]
    feeds = [
        (u'Local News',
         u'http://www.kansas.com/news/local/index.rss'),
        (u'National News',
         u'http://www.kansas.com/news/nation-world/index.rss'),
        (u'Sports',
         u'http://www.kansas.com/sports/index.rss'),
        (u'Opinion',
         u'http://www.kansas.com/opinion/index.rss'),
        (u'Life',
         u'http://www.kansas.com/living/index.rss'),
        (u'Entertainment',
         u'http://www.kansas.com/entertainment/index.rss')
    ]

    def print_version(self, url):
        urlparts = url.split('/')
        newadd = urlparts[5] + '/v-print'
        return url.replace(url, newadd.join(url.split(urlparts[5])))
PK�X-r��**wikinews_en.png�PNG


IHDR(-S�PLTE&��&��+��(��-��*��5��>��A��G��J��M��D��B��C��7��6��4��7��T��T��Z��\��`��_��a��f��n��n��q��m��m��t��{��z��펼퐿���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������쁳�\��X��Y��M���
�tRNS@��f�IDATx�c����>�K�J�V���'�W���(�L�	�'�L����Q�R[�V����^Zd�4/�b�t}��ƶ�Z{1�>mu5�yʳ&7��rk3hqqMQ��h�lX�%;ו�Y�I���r�� ����7����*ͭ�����%1�:�(,�g��X�tnLv��83/���S~N�=с����š��{�N��ʕa�Q�͊�z.&�D�49%$�~��k�v�GMmZ_cIEND�B`�PK�X�* �		wikinews_en.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
en.wikinews.org
'''

from calibre.web.feeds.news import BasicNewsRecipe


class WikiNews(BasicNewsRecipe):
    title = 'Wikinews'
    __author__ = 'Darko Miletic'
    description = 'News from wikipedia'
    category = 'news, world'
    oldest_article = 7
    max_articles_per_feed = 100
    publisher = 'Wiki'
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    remove_javascript = True
    language = 'en'

    html2lrf_options = [
        '--comment', description, '--category', category, '--publisher', publisher
    ]

    html2epub_options = 'publisher="' + publisher + \
        '"\ncomments="' + description + '"\ntags="' + category + '"'

    keep_only_tags = [
        dict(name='h1', attrs={'id': 'firstHeading'}), dict(
            name='div', attrs={'id': 'bodyContent'})
    ]

    remove_tags = [
        dict(name='link'), dict(name='div', attrs={'id': ['printfooter', 'catlinks', 'footer']}), dict(
            name='div', attrs={'class': ['thumb left', 'thumb right']})
    ]

    remove_tags_after = dict(name='h2')

    feeds = [(u'News', u'http://feeds.feedburner.com/WikinewsLatestNews')]

    def get_article_url(self, article):
        artl = article.get('link',  None)
        rest, sep, article_id = artl.rpartition('/')
        return 'http://en.wikinews.org/wiki/' + article_id

    def print_version(self, url):
        rest, sep, article_id = url.rpartition('/')
        return 'http://en.wikinews.org/w/index.php?title=' + article_id + '&printable=yes'

    def get_cover_url(self):
        return 'http://upload.wikimedia.org/wikipedia/commons/b/bd/Wikinews-logo-en.png'

    def preprocess_html(self, soup):
        mtag = '<meta http-equiv="Content-Language" content="en"/><meta http-equiv="Content-Type" content="text/html; charset=utf-8">'
        soup.head.insert(0, mtag)
        btag = soup.find('div', attrs={'id': 'bodyContent'})
        for item in btag.findAll('div'):
            item.extract()
        for item in btag.findAll('h2'):
            item.extract()
        for item in soup.findAll(style=True):
            del item['style']
        for item in soup.findAll(font=True):
            del item['font']
        return soup
PK�X��=�vvwindows_star.recipe#!/usr/bin/env python

__license__ = 'GPL v3'

'''
www.canada.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class CanWestPaper(BasicNewsRecipe):

    # un-comment the following three lines for the Windsor Star
    title = u'Windsor Star'
    url_prefix = 'http://www.windsorstar.com'
    description = u'News from Windsor, ON'

    # un-comment the following three lines for the Ottawa Citizen
    # title = u'Ottawa Citizen'
    # url_prefix = 'http://www.ottawacitizen.com'
    # description = u'News from Ottawa, ON'
    #
    # un-comment the following three lines for the Montreal Gazette
    # title = u'Montreal Gazette'
    # url_prefix = 'http://www.montrealgazette.com'
    # description = u'News from Montreal, QC'

    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: large;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: small; font-style: italic }
                #photocredit { font-size: xx-small; }'''
    keep_only_tags = [dict(name='div', attrs={'id': 'storyheader'}), dict(
        name='div', attrs={'id': 'storycontent'})]
    remove_tags = [{'class': 'comments'},
                   dict(name='div', attrs={'class': 'navbar'}), dict(
                       name='div', attrs={'class': 'morelinks'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def preprocess_html(self, soup):
        # delete iempty id attributes--they screw up the TOC for unknown reasons
        divtags = soup.findAll('div', attrs={'id': ''})
        if divtags:
            for div in divtags:
                del(div['id'])
        return soup

    def parse_index(self):
        soup = self.index_to_soup(
            self.url_prefix + '/news/todays-paper/index.html')

        articles = {}
        key = 'News'
        ans = ['News']

        # Find each instance of class="sectiontitle", class="featurecontent"
        for divtag in soup.findAll('div', attrs={'class': ["section_title02", "featurecontent"]}):
            if 'section_title' in ''.join(divtag['class']):
                # div contains section title
                if not divtag.h3:
                    continue
                key = self.tag_to_string(divtag.h3, False)
                ans.append(key)
                self.log("Section name %s" % key)
                continue
            # div contains article data
            h1tag = divtag.find('h1')
            if not h1tag:
                continue
            atag = h1tag.find('a', href=True)
            if not atag:
                continue
            url = self.url_prefix + '/news/todays-paper/' + atag['href']
            title = self.tag_to_string(atag, False)
            pubdate = ''
            description = ''
            ptag = divtag.find('p')
            if ptag:
                description = self.tag_to_string(ptag, False)
            author = ''
            autag = divtag.find('h4')
            if autag:
                author = self.tag_to_string(autag, False)
            if key not in articles:
                articles[key] = []
            articles[key].append(dict(title=title, url=url, date=pubdate,
                                      description=description, author=author, content=''))

        ans = [(keyl, articles[key]) for keyl in ans if keyl in articles]
        return ans
PK�X�=�2�!�!windsor_star.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'

'''
www.canada.com
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class CanWestPaper(BasicNewsRecipe):

    # un-comment the following four lines for the Victoria Times Colonist
    #     title = u'Victoria Times Colonist'
    #     url_prefix = 'http://www.timescolonist.com'
    #     description = u'News from Victoria, BC'
    #     fp_tag = 'CAN_TC'

    # un-comment the following four lines for the Vancouver Province
    #     title = u'Vancouver Province'
    #     url_prefix = 'http://www.theprovince.com'
    #     description = u'News from Vancouver, BC'
    #     fp_tag = 'CAN_VP'

    # un-comment the following four lines for the Vancouver Sun
    #     title = u'Vancouver Sun'
    #     url_prefix = 'http://www.vancouversun.com'
    #     description = u'News from Vancouver, BC'
    #     fp_tag = 'CAN_VS'

    # un-comment the following four lines for the Edmonton Journal
    #     title = u'Edmonton Journal'
    #     url_prefix = 'http://www.edmontonjournal.com'
    #     description = u'News from Edmonton, AB'
    #     fp_tag = 'CAN_EJ'

    # un-comment the following four lines for the Calgary Herald
    #     title = u'Calgary Herald'
    #     url_prefix = 'http://www.calgaryherald.com'
    #     description = u'News from Calgary, AB'
    #     fp_tag = 'CAN_CH'

    # un-comment the following four lines for the Regina Leader-Post
    #     title = u'Regina Leader-Post'
    #     url_prefix = 'http://www.leaderpost.com'
    #     description = u'News from Regina, SK'
    #     fp_tag = ''

    # un-comment the following four lines for the Saskatoon Star-Phoenix
    #     title = u'Saskatoon Star-Phoenix'
    #     url_prefix = 'http://www.thestarphoenix.com'
    #     description = u'News from Saskatoon, SK'
    #     fp_tag = ''

    # un-comment the following four lines for the Windsor Star
    title = u'Windsor Star'
    url_prefix = 'http://www.windsorstar.com'
    description = u'News from Windsor, ON'
    fp_tag = 'CAN_'

    # un-comment the following four lines for the Ottawa Citizen
    #     title = u'Ottawa Citizen'
    #     url_prefix = 'http://www.ottawacitizen.com'
    #     description = u'News from Ottawa, ON'
    #     fp_tag = 'CAN_OC'

    # un-comment the following four lines for the Montreal Gazette
    #     title = u'Montreal Gazette'
    #     url_prefix = 'http://www.montrealgazette.com'
    #     description = u'News from Montreal, QC'
    #     fp_tag = 'CAN_MG'

    language = 'en_CA'
    __author__ = 'Nick Redding'
    no_stylesheets = True
    timefmt = ' [%b %d]'
    extra_css = '''
                .timestamp {  font-size:xx-small; display: block; }
                #storyheader { font-size: medium; }
                #storyheader h1 { font-size: x-large; }
                #storyheader h2 { font-size: large;  font-style: italic; }
                .byline { font-size:xx-small; }
                #photocaption { font-size: small; font-style: italic }
                #photocredit { font-size: xx-small; }'''
    keep_only_tags = [dict(name='div', attrs={'id': 'storyheader'}), dict(
        name='div', attrs={'id': 'storycontent'})]
    remove_tags = [{'class': 'comments'},
                   dict(name='div', attrs={'class': 'navbar'}), dict(
                       name='div', attrs={'class': 'morelinks'}),
                   dict(name='div', attrs={'class': 'viewmore'}), dict(
                       name='li', attrs={'class': 'email'}),
                   dict(name='div', attrs={'class': 'story_tool_hr'}), dict(
                       name='div', attrs={'class': 'clear'}),
                   dict(name='div', attrs={'class': 'story_tool'}), dict(
                       name='div', attrs={'class': 'copyright'}),
                   dict(name='div', attrs={'class': 'rule_grey_solid'}),
                   dict(name='li', attrs={'class': 'print'}), dict(name='li', attrs={'class': 'share'}), dict(name='ul', attrs={'class': 'bullet'})]

    def get_cover_url(self):
        from datetime import timedelta, date
        if self.fp_tag == '':
            return None
        cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
            str(date.today().day) + '/lg/' + self.fp_tag + '.jpg'
        br = BasicNewsRecipe.get_browser(self)
        daysback = 1
        try:
            br.open(cover)
        except:
            while daysback < 7:
                cover = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg' + \
                    str((date.today() - timedelta(days=daysback)).day) + \
                    '/lg/' + self.fp_tag + '.jpg'
                br = BasicNewsRecipe.get_browser(self)
                try:
                    br.open(cover)
                except:
                    daysback = daysback + 1
                    continue
                break
        if daysback == 7:
            self.log("\nCover unavailable")
            cover = None
        return cover

    def fixChars(self, string):
        # Replace lsquo (\x91)
        fixed = re.sub("\x91", "‘", string)
        # Replace rsquo (\x92)
        fixed = re.sub("\x92", "’", fixed)
        # Replace ldquo (\x93)
        fixed = re.sub("\x93", "“", fixed)
        # Replace rdquo (\x94)
        fixed = re.sub("\x94", "”", fixed)
        # Replace ndash (\x96)
        fixed = re.sub("\x96", "–", fixed)
        # Replace mdash (\x97)
        fixed = re.sub("\x97", "—", fixed)
        fixed = re.sub("&#x2019;", "’", fixed)
        return fixed

    def massageNCXText(self, description):
        return description

    def populate_article_metadata(self, article, soup, first):
        if first:
            picdiv = soup.find('body').find('img')
            if picdiv is not None:
                self.add_toc_thumbnail(article, re.sub(
                    r'links\\link\d+\\', '', picdiv['src']))
        xtitle = article.text_summary.strip()
        if len(xtitle) == 0:
            desc = soup.find('meta', attrs={'property': 'og:description'})
            if desc is not None:
                article.summary = article.text_summary = desc['content']

    def strip_anchors(self, soup):
        paras = soup.findAll(True)
        for para in paras:
            aTags = para.findAll('a')
            for a in aTags:
                if a.img is None:
                    a.replaceWith(a.renderContents().decode(
                        'cp1252', 'replace'))
        return soup

    def preprocess_html(self, soup):
        return self.strip_anchors(soup)

    def parse_index(self):
        soup = self.index_to_soup(
            self.url_prefix + '/news/todays-paper/index.html')

        articles = {}
        key = 'News'
        ans = ['News']

        # Find each instance of class="sectiontitle", class="featurecontent"
        for divtag in soup.findAll('div', attrs={'class': ["section_title02", "featurecontent"]}):
            # self.log(" div class = %s" % divtag['class'])
            if ''.join(divtag['class']).startswith('section_title'):
                # div contains section title
                if not divtag.h3:
                    continue
                key = self.tag_to_string(divtag.h3, False)
                ans.append(key)
                self.log("Section name %s" % key)
                continue
            # div contains article data
            h1tag = divtag.find('h1')
            if not h1tag:
                continue
            atag = h1tag.find('a', href=True)
            if not atag:
                continue
            url = self.url_prefix + '/news/todays-paper/' + atag['href']
            # self.log("Section %s" % key)
            # self.log("url %s" % url)
            title = self.tag_to_string(atag, False)
            # self.log("title %s" % title)
            pubdate = ''
            description = ''
            ptag = divtag.find('p')
            if ptag:
                description = self.tag_to_string(ptag, False)
                # self.log("description %s" % description)
            author = ''
            autag = divtag.find('h4')
            if autag:
                author = self.tag_to_string(autag, False)
                # self.log("author %s" % author)
            if key not in articles:
                articles[key] = []
            articles[key].append(dict(title=title, url=url, date=pubdate,
                                      description=description, author=author, content=''))

        ans = [(keyl, articles[keyl])
               for keyl in ans if keyl in articles]
        return ans
PK�X�--winnipeg_free_press.recipefrom 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 WinnipegFreePress(BasicNewsRecipe):
    title = u'Winnipeg Free Press'
    __author__ = 'buyo'
    description = 'News from Winnipeg, Manitoba, Canada'
    oldest_article = 1
    max_articles_per_feed = 15
    category = 'News, Winnipeg, Canada'
    no_stylesheets = True
    encoding = 'UTF-8'
    remove_javascript = True
    use_embedded_content = False
    language = 'en_CA'
    extra_css = '''
    .factbox { border: solid 2px; padding: 1rem }
    '''

    feeds = [(u'Breaking News', u'http://www.winnipegfreepress.com/rss?path=/breakingnews'),
             (u'Local News', u'http://www.winnipegfreepress.com/rss?path=/local'),
             (u'Breaking Business News',
              u'http://www.winnipegfreepress.com/rss?path=/business/finance'),
             (u'Business', u'http://www.winnipegfreepress.com/rss?path=/business'),
             (u'Editorials', u'http://www.winnipegfreepress.com/rss?path=/opinion/editorials'),
             (u'Views from the West',
              u'http://www.winnipegfreepress.com/rss?path=/opinion/westview'),
             (u'Life & Style', u'http://www.winnipegfreepress.com/rss?path=/life'),
             (u'Food & Drink', u'http://www.winnipegfreepress.com/rss?path=/life/food')
             ]

    keep_only_tags = [
        classes('article-title topphoto storycontent')
    ]
    remove_tags = [dict(name='button')]
PK�X�+�44winnipeg_sun.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1277647803(BasicNewsRecipe):
    title = u'Winnipeg Sun'
    __author__ = 'rty'
    __version__ = '1.0'
    oldest_article = 2
    publisher = 'www.winnipegsun.com'
    description = 'Winnipeg Newspaper'
    category = 'News, Winnipeg, Canada'
    max_articles_per_feed = 100
    no_stylesheets = True
    encoding = 'UTF-8'
    remove_javascript = True
    use_embedded_content = False
    language = 'en_CA'
    feeds = [
        (u'News', u'http://www.winnipegsun.com/news/rss.xml'),
        (u'Columnists', u'http://www.winnipegsun.com/columnists/rss.xml'),
        (u'Editorial', u'http://www.winnipegsun.com/comment/editorial/rss.xml'),
        (u'Entertainments', u'http://www.winnipegsun.com/entertainment/rss.xml'),
        (u'Life', u'http://www.winnipegsun.com/life/rss.xml'),
        (u'Money', u'http://www.winnipegsun.com/money/rss.xml')
    ]
    keep_only_tags = [
        dict(name='div', attrs={'id': 'article'}),
    ]
    remove_tags = [
        dict(name='div', attrs={'class': ['leftBox', 'bottomBox clear']}),
        dict(name='ul', attrs={'class': 'tabs dl contentSwap'}),
        dict(name='div', attrs={'id': 'commentsBottom'}),
    ]
    remove_tags_after = [
        dict(name='div', attrs={'class': 'bottomBox clear'})
    ]
PK�X1�L���winsupersite.png�PNG


IHDR(-S�PLTE;|���������\��p����������A�����D��<}����R��T��V��W��Y��>~�\��^��_��`��`��b��c��d��k��n��o��<|�r��t�р�Շ�׋�ً�ٍ�ڏ�ڒ�۔��B��=}���ݠ�������������������������������������E��������������������F���������G��H�������K��M����O�����#m}IDATӭ���{�Y۶m���.���.Ȅ�5겑k���6�mܗjh�{������J5�
����>v��Ė�f=��`%�p�J$���<�t?]1h�ߓ��5FD��?�� ��:IEND�B`�PK�X�_���winsupersite.recipeimport re

from calibre.web.feeds.news import BasicNewsRecipe


class Winsupersite(BasicNewsRecipe):
    title = u'Supersite for Windows'
    description = u'Paul Thurrott SuperSite for Windows'
    publisher = 'Paul Thurrott'
    __author__ = 'Hypernova'
    language = 'en'

    oldest_article = 30
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    conversion_options = {'linearize_tables': True}
    remove_tags_before = dict(name='h1')
    preprocess_regexps = [
        (re.compile(r'<p>--Paul Thurrott.*</body>', re.DOTALL | re.IGNORECASE),
         lambda match: '</body>'),
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.open('http://www.winsupersite.com')
        return br

    feeds = [(u'Supersite for Windows',
              u'http://www.winsupersite.com/supersite.xml')]
PK�XKPۇ	wired.png�PNG


IHDR��h6�IDATx�eQ�0����zTꌻ�,T�`�|�r
2����
�W�ȳx���~��y�D1�8
_�c(:����G�lDJy��E(�t���2���N��k���n�>mF�F��ц��K���+��x/�ˑ��i(�;��Т����S���H���8���*@*�B֑N"�Q��Xy��^�#l�S��+�
�V�Er�خ�&�{��IEND�B`�PK�X��]f&&wired.recipe__license__ = 'GPL v3'
__copyright__ = '2014, Darko Miletic <darko.miletic at gmail.com>'
'''
www.wired.com
'''

from calibre import browser
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 WiredDailyNews(BasicNewsRecipe):
    title = 'Wired Magazine, Monthly Edition'
    __author__ = 'Darko Miletic, update by Howard Cornett, Zach Lapidus, Michael Marotta'
    description = ('Wired is a full-color monthly American magazine, '
                   'published in both print and online editions, that '
                   'reports on how emerging technologies affect culture, '
                   'the economy and politics. '
                   'Monthly edition, best run at the start of every month.')
    publisher = 'Conde Nast'
    category = 'news, IT, computers, technology'
    oldest_article = 45
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'en'
    ignore_duplicate_articles = {'url'}
    remove_empty_feeds = True
    extra_css             = """
                            .entry-header{
                                          text-transform: uppercase;
                                          vertical-align: baseline;
                                          display: inline;
                                         }
                            ul li{display: inline}
                            """

    keep_only_tags = [
        classes('content-header lead-asset article__body'),
    ]
    remove_tags = [
        classes(
            'related-cne-video-component tags-component callout--related-list iframe-embed podcast_storyboard'
            ' inset-left-component ad consumer-marketing-component social-icons'
        ),
        dict(name=['meta', 'link']),
        dict(id=['sharing', 'social', 'article-tags', 'sidebar']),
    ]

    def parse_wired_index_page(self, currenturl, seen):
        self.log('Parsing index page', currenturl)
        soup = self.index_to_soup(currenturl)
        baseurl = 'https://www.wired.com'
        for a in soup.find("div", {"class" : 'multi-packages'}).findAll('a', href=True):
            url = a['href']
            if url.startswith('/story') and url.endswith('/'):
                title = self.tag_to_string(a.parent.find('h3'))
                dateloc = a.parent.find('time')
                date = self.tag_to_string(dateloc)
                if title.lower() != 'read more' and title and url not in seen:
                    seen.add(url)
                    self.log('Found article:', title)
                    yield {
                        'title': title,
                        'date': date,
                        'url': baseurl+url,
                    }

    def parse_index(self):
        baseurl = 'https://www.wired.com/magazine/?page={}/'
        pagenum = 1
        articles = []
        seen = set()
        for pagenum in range(1, 4):
            articles.extend(self.parse_wired_index_page(baseurl.format(pagenum), seen))

        return [('Magazine Articles', articles)]

    # Wired changes the content it delivers based on cookies, so the
    # following ensures that we send no cookies
    def get_browser(self, *args, **kwargs):
        return self

    def clone_browser(self, *args, **kwargs):
        return self.get_browser()

    def open_novisit(self, *args, **kwargs):
        br = browser()
        return br.open_novisit(*args, **kwargs)

    open = open_novisit
PK�X#�P4wired_daily.png�PNG


IHDR:����IDATx�c�&F8`ddDab�>X���s33pn�����gf���gv�w��"�̐t�XW�e��n	��*;����5�a-���@��X��봵��ӫ��
���,m2P7��L�a����Ή̬l��W44��```Q�KɌ���ʕ�S70�$j�'�����|T�#�3̲qz I���DB��*3j�oMIEND�B`�PK�XJ���

wired_daily.recipe__license__ = 'GPL v3'
__copyright__ = '2014, Darko Miletic <darko.miletic at gmail.com>'
'''
www.wired.com
'''

from calibre import browser
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 WiredDailyNews(BasicNewsRecipe):
    title = 'Wired Daily Edition'
    __author__ = 'Darko Miletic, PatStapleton(update 2020-05-24)'
    description = (
        'Wired is a full-color monthly American magazine, published in both print'
        ' and online editions, that reports on how emerging technologies affect culture,'
        ' the economy and politics.'
    )
    masthead_url = 'https://www.wired.com/images/logos/apple-touch-icon.png'
    cover_url = 'https://www.wired.com/images/logos/wired.png'
    publisher = 'Conde Nast'
    category = 'news, IT, computers, technology'
    oldest_article = 2
    max_articles_per_feed = 200
    no_stylesheets = True
    encoding = 'utf-8'
    use_embedded_content = False
    language = 'en'
    ignore_duplicate_articles = {'url'}
    remove_empty_feeds = True
    publication_type = 'newsportal'
    extra_css = """
        .entry-header{
                        text-transform: uppercase;
                        vertical-align: baseline;
                        display: inline;
                        }
        ul li{display: inline}
    """

    remove_tags = [
        classes('related-cne-video-component tags-component podcast_42 storyboard inset-left-component social-icons'),
        dict(name=['meta', 'link', 'aside']),
        dict(id=['sharing', 'social', 'article-tags', 'sidebar']),
    ]
    keep_only_tags = [
        dict(name='article', attrs={'class': 'article main-content'}),
    ]
    remove_attributes = ['srcset']
    handle_gzip = True

    feeds = [
        (u'Top Stories', u'https://www.wired.com/feed/rss'),
        (u'Business', u'https://www.wired.com/feed/category/business/latest/rss'),
        (u'Culture', u'https://www.wired.com/feed/category/culture/latest/rss'),
        (u'Gear', u'https://www.wired.com/feed/category/gear/latest/rss'),
        (u'Ideas', u'https://www.wired.com/feed/category/ideas/latest/rss'),
        (u'Science', u'https://www.wired.com/feed/category/science/latest/rss'),
        (u'Security', u'https://www.wired.com/feed/category/security/latest/rss'),
        (
            u'Transportation',
            u'https://www.wired.com/feed/category/transportation/latest/rss'
        ),
        (
            u'Backchannel',
            u'https://www.wired.com/feed/category/backchannel/latest/rss'
        ),
        (u'WIRED Guides', u'https://www.wired.com/feed/tag/wired-guide/latest/rss'),
        #    (u'Photo', u'https://www.wired.com/feed/category/photo/latest/rss'),
    ]

    def get_article_url(self, article):
        return article.get('link', None)

    # Wired changes the content it delivers based on cookies, so the
    # following ensures that we send no cookies
    def get_browser(self, *args, **kwargs):
        return self

    def clone_browser(self, *args, **kwargs):
        return self.get_browser()

    def open_novisit(self, *args, **kwargs):
        br = browser()
        return br.open_novisit(*args, **kwargs)

    open = open_novisit
PK�X#�޲�wired_it.recipeimport re
from calibre.web.feeds.news import BasicNewsRecipe


class WiredITA(BasicNewsRecipe):
    title = u'Wired.it'
    oldest_article = 1
    max_articles_per_feed = 50
    no_stylesheets = True
    use_embedded_content = False
    auto_cleanup = False
    encoding = 'utf8'
    masthead_url = 'http://www.wired.com/images/home/wired_logo.gif'
    description = 'Wired - Make in Italy. Inventa, sbaglia, innova'
    publisher = 'http://www.wired.it/'
    language = 'it'
    __author__ = 'isspro'
    publication_type = 'magazine'

    conversion_options = {'title': title,
                          'comments': description,
                          'language': language,
                          'publisher': publisher,
                          'authors': title,
                          'smarten_punctuation': True
                          }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'main-article'})
    ]

    remove_tags = [
        dict(name='img', attrs={'class': 'avatar img-circle'}),
        dict(name='div', attrs={'class': 'topics'}),
        dict(name='div', attrs={'class': 'social-share hidden-lg'}),
        dict(name='span', attrs={'class': 'label'})
    ]

    extra_css = '''
        h1 {font-size:x-large;}
        p.lead {font-size:medium;}
        .who {line-height: 0pt; margin: 0pt;}
    '''

    preprocess_regexps = [
        (re.compile(r'Pubblicato'), lambda match: '')

    ]

    feeds = [(u'Attualit\xe0', u'http://www.wired.it/attualita/feed/'),
             (u'Internet', 'http://www.wired.it/internet/feed/'),
             (u'Gadget', 'http://www.wired.it/gadget/feed/'),
             (u'Mobile', 'http://www.wired.it/mobile/feed/'),
             (u'Scienza', 'http://www.wired.it/scienza/feed/'),
             (u'Economia', 'http://www.wired.it/economia/feed/'),
             (u'LifeStyle', 'http://www.wired.it/lifestyle/feed/'),
             (u'Play', 'http://www.wired.it/play/feed/'),

             ]
PK�X}��ɋ�wirtscafts_woche.png�PNG


IHDR�aRIDATxڌ���9@�[۶m۶m�ֱ݃ڶm�Ƙ��6�ϳc~�� �)$�)� a����~�χO���U�GE���O�jl6*�&I��� b�T�B��]}�����{(��ޣz��\�y��zq���-_R�0a��}�r��E#��s0��:j�h˚��(S�>��ob��=	��R��'�s_�>��w�M�>�%
�u���䞐-��f��Z
�+`(T^�a����}мsw�Z���`�X��^�njC-����ʋF�
-Z0z��M�)�?O���RI��'��q=y���~������/bb�x��Y���Wo�uW�v9��G�j�ܾ���X�rxD$O_�JaAB�G�V\���#]��_9v��ǵ{��Z�>�Ξ�A˶�?|�E�W���K����7��R+
�g*��z�۳`�JլǼe+�}�p�MO��k�@�v�

�v�Z�<�:F)`���[���_F��ܱ7��T��-��J�>c�O��J�ZJ��bl���s0k�r�9Wm�"�������|���r��*�i,V+��p���HѢ�8w2:BA 3=w��IEND�B`�PK�X����wirtscafts_woche.recipe__license__ = 'GPL v3'
__copyright__ = '2013, Armin Geller'

##
# Written:      May 2013 (new coding)
# Version:      5.1
# Last update:  2022-08-07
##
##
'''
Fetch WirtschaftsWoche Online
'''

from calibre.web.feeds.news import BasicNewsRecipe


class WirtschaftsWocheOnline(BasicNewsRecipe):
    title = u'WirtschaftsWoche Online'
    __author__ = 'Armin Geller'  # Update AGE 2013-01-05, 2018-03-01, 2022-08-05
    description = u'German Online Portal of WirtschaftsWoche'
    publisher = 'Verlagsgruppe Handelsblatt GmbH Redaktion WirtschaftsWoche Online'
    category = 'business, economy, news, Germany'
    publication_type = 'weekly magazine'
    oldest_article = 7
    max_articles_per_feed = 100

    auto_cleanup = False
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    timefmt = ' [%a, %d %b %Y]'
    language = 'de'
    encoding = 'UTF-8'
    cover_source = 'https://www.ikiosk.de/shop/epaper/wirtschaftswoche.html'
    masthead_url = 'http://www.wiwo.de/images/wiwo_logo/5748610/1-formatOriginal.png'

    def get_cover_url(self):
        cover_source_soup = self.index_to_soup(self.cover_source)
        preview_image_div = cover_source_soup.find(attrs={'class': 'gallery'})
        return preview_image_div.a.img['src']

    extra_css = '''
                      h1, h2 {font-size: 1.6em; text-align: left}
                      .c-leadtext {font-size: 1em; font-style: italic; font-weight: normal}
                      h4 {font-size: 1.3em;text-align: left}
                      h5, h6, a {font-size: 1em;text-align: left}
                      .c-metadata {font-size: .75em;text-align: left; font-style: italic}
                      '''

    keep_only_tags = [
        dict(name='div', attrs={'data-macro': [
            'lead-media',
        ]}),
        dict(
            name='div',
            attrs={
                'class': [
                    'o-article__element',
                    'o-article__content c-richText',
                ]
            }
        ),
        dict(name='div', attrs={'id': [
            'biga_wrapper',
        ]})
    ]

    remove_tags = [
        dict(name='source'),
        dict(
            name='div',
            attrs={
                'class': [
                    'c-list',
                    'o-article__element u-margin-xxl u-font-s-md',
                    'c-advertisment__fullWidth c-advertisment--P4_desktop',
                    'c-advertisment__fullWidth c-advertisment--P3_mobile',
                    'c-advertisment__fullWidth c-advertisment--P2_mobile',
                    'c-advertisment__fullWidth c-advertisment--CT_contentteaser_mobile_1',
                    'c-teaser c-teaser-inline',
                    'c-teaser c-teaser-inline isPremiumTeaser',
                    'c-teaser c-teaser-inline c-teaser-inline--column',
                    'c-teaser c-teaser-inline c-teaser-inline--xl isPremiumTeaser',
                    'o-teaser-list js-tt o-artbox o-artbox--articleboxplus',
                    'o-article__content-element u-margin-xxl',
                    'o-article__content-element u-margin-xxl ajaxify',
                    'o-article__element o-article__element-block',
                ]
            }
        )
    ]

    feeds = [
        (u'Schlagzeilen', u'http://www.wiwo.de/contentexport/feed/rss/schlagzeilen'),
        (u'Exklusiv', u'http://www.wiwo.de/contentexport/feed/rss/exklusiv'),
        #              (u'Themen', u'http://www.wiwo.de/contentexport/feed/rss/themen'), # AGE no print version
        (u'Unternehmen', u'http://www.wiwo.de/contentexport/feed/rss/unternehmen'),
        (u'Finanzen', u'http://www.wiwo.de/contentexport/feed/rss/finanzen'),
        (u'Politik', u'http://www.wiwo.de/contentexport/feed/rss/politik'),
        (u'Erfolg', u'http://www.wiwo.de/contentexport/feed/rss/erfolg'),
        (u'Technologie', u'http://www.wiwo.de/contentexport/feed/rss/technologie')
    ]

    def image_url_processor(self, baseurl, url):
        if url.startswith('/images/'):
            return 'https://www.wiwo.de' + url
        return url

    def preprocess_raw_html(self, raw, url):
        # Slideshow image source need some help to find all images
        soup = self.index_to_soup(raw)
        for img in soup.findAll('img', attrs={'data-lazy': True}):
            img['src'] = 'https://www.wiwo.de' + img['data-lazy']
        return str(soup)

    def print_version(self, url):
        main, sep, rest = url.rpartition('.')
        return main + '-all' + sep + rest
PK�X|��ghhwirtualnemedia_pl.png�PNG


IHDR
	1h/PPLTE��������tRNS��0JIDATx�c�{02FA.~"�AJIEND�B`�PK�Xx����wirtualnemedia_pl.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class WirtualneMedia(BasicNewsRecipe):
    title = u'Wirtualnemedia.pl'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    remove_empty_feeds = True
    __author__ = 'fenuks'
    extra_css = '.thumbnail {float:left; max-width:150px; margin-right:5px;}'
    description = u'Portal o mediach, reklamie, internecie, PR, telekomunikacji - nr 1 w Polsce - WirtualneMedia.pl - wiadomości z pierwszej ręki.'
    category = 'internet'
    language = 'pl'
    ignore_duplicate_articles = {'title', 'url'}
    masthead_url = 'http://i.wp.pl/a/f/jpeg/8654/wirtualnemedia.jpeg'
    cover_url = 'http://static.wirtualnemedia.pl/img/logo_wirtualnemedia_newsletter.gif'
    remove_tags = [dict(id=['header', 'footer'])]
    feeds = [(u'Gospodarka', u'http://www.wirtualnemedia.pl/rss/wm_gospodarka.xml'),
             (u'Internet', u'http://www.wirtualnemedia.pl/rss/wm_internet.xml'),
             (u'Kultura', u'http://www.wirtualnemedia.pl/rss/wm_kulturarozrywka.xml'),
             (u'Badania', u'http://www.wirtualnemedia.pl/rss/wm_marketing.xml'),
             (u'Prasa', u'http://www.wirtualnemedia.pl/rss/wm_prasa.xml'),
             (u'Radio', u'http://www.wirtualnemedia.pl/rss/wm_radio.xml'),
             (u'Reklama', u'http://www.wirtualnemedia.pl/rss/wm_reklama.xml'),
             (u'PR', u'http://www.wirtualnemedia.pl/rss/wm_relations.xml'),
             (u'Technologie', u'http://www.wirtualnemedia.pl/rss/wm_telekomunikacja.xml'),
             (u'Telewizja', u'http://www.wirtualnemedia.pl/rss/wm_telewizja_rss.xml')]

    def print_version(self, url):
        return url.replace('artykul', 'print')
PK�X��ȧ�wnp.png�PNG


IHDR(-S�PLTE

		)**866DCC^]]ussxvv���������������������������������������������������jt�al�\e�AM�%3�-�&�&�
!��&�"� ���� �������`hg-73,�tRNS@��f�IDATx�AN�P�7�҂A]p���w�x7�I4�@�oDŽ3���޵8��]�2e�o���F�j�Ţ*<�����z�v�t��u�����ʭ_�����.gy;@�G=�|�|,MV�R
D�$�H�q�T
�&�C����.ƨq̧�޺1����]�G��!rIEND�B`�PK�X;���++
wnp.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class WNP(BasicNewsRecipe):
    title = u'WNP'
    cover_url = 'http://k.wnp.pl/images/wnpLogo.gif'
    __author__ = 'fenuks'
    description = u'Wirtualny Nowy Przemysł'
    category = 'economy'
    language = 'pl'
    preprocess_regexps = [(re.compile(u'Czytaj też:.*?</a>', re.DOTALL), lambda match: ''),
                          (re.compile(u'Czytaj więcej:.*?</a>', re.DOTALL), lambda match: '')]
    oldest_article = 8
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_tags = [
        dict(attrs={'class': ['printF', 'border3B2 clearfix', 'articleMenu clearfix']})]
    feeds = [(u'Wiadomości gospodarcze', u'http://www.wnp.pl/rss/serwis_rss.xml'),
             (u'Serwis Energetyka - Gaz', u'http://www.wnp.pl/rss/serwis_rss_1.xml'),
             (u'Serwis Nafta - Chemia', u'http://www.wnp.pl/rss/serwis_rss_2.xml'),
             (u'Serwis Hutnictwo', u'http://www.wnp.pl/rss/serwis_rss_3.xml'),
             (u'Serwis Górnictwo', u'http://www.wnp.pl/rss/serwis_rss_4.xml'),
             (u'Serwis Logistyka', u'http://www.wnp.pl/rss/serwis_rss_5.xml'),
             (u'Serwis IT', u'http://www.wnp.pl/rss/serwis_rss_6.xml')]

    def print_version(self, url):
        return 'http://wnp.pl/drukuj/' + url[url.find(',') + 1:]
PK�XT^"c::wolne_media.png�PNG


IHDR�aIDATxڥSMAA��DX��ة��VQ~��b�/Y�A��}�1g��kL��:�3�{OӽwT0_�
�G�U�X�����7��OF��ދ�c�U�� x>�5K��g\�`,��$g�ۘL:8䷞�z���:F�&Amc�i�Uq,��WL����\���@!��vA͘�a�5��Z��=6�٬�]ڀ8���O���5�=����Yl��\2�Z;F��3.��/��gm�Hޅ�2�x�M�*�XY�7-���� �
�_mIEND�B`�PK�X��x��wolne_media.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__author__ = 'teepel <teepel44@gmail.com>'

'''
wolnemedia.net
'''

from calibre.web.feeds.news import BasicNewsRecipe


class wolne_media(BasicNewsRecipe):
    title = u'Wolne Media'
    __author__ = 'teepel <teepel44@gmail.com>'
    language = 'pl'
    description = 'Wiadomości z wolnemedia.net'
    INDEX = 'http://wolnemedia.net'
    oldest_article = 1
    max_articles_per_feed = 100
    remove_empty_feeds = True
    simultaneous_downloads = 5
    remove_javascript = True
    no_stylesheets = True
    auto_cleanup = True
    ignore_duplicate_articles = {'url'}

    remove_tags = [dict(name='p', attrs={'class': 'tags'})]

    feeds = [
    (u'Wiadomości z kraju', u'http://wolnemedia.net/category/wiadomosci-z-kraju/feed/'),
    (u'Wiadomości ze świata', u'http://wolnemedia.net/category/wiadomosci-ze-swiata/feed/'),
    (u'Edukacja', u'http://wolnemedia.net/category/edukacja/feed/'),
    (u'Ekologia', u'http://wolnemedia.net/category/ekologia/feed/'),
    (u'Gospodarka', u'http://wolnemedia.net/category/gospodarka/feed/'),
    (u'Historia', u'http://wolnemedia.net/category/historia/feed/'),
    (u'Kultura', u'http://wolnemedia.net/category/kultura/feed/'),
    (u'Kulturoznawstwo', u'http://wolnemedia.net/category/kulturoznawstwo/feed/'),
    (u'Media', u'http://wolnemedia.net/category/media/feed/'),
    (u'Nauka', u'http://wolnemedia.net/category/nauka/feed/'),
    (u'Opowiadania', u'http://wolnemedia.net/category/opowiadania/feed/'),
    (u'Paranauka i ezoteryka', u'http://wolnemedia.net/category/ezoteryka/feed/'),
    (u'Polityka', u'http://wolnemedia.net/category/polityka/feed/'),
    (u'Prawo', u'http://wolnemedia.net/category/prawo/feed/'),
    (u'Publicystyka', u'http://wolnemedia.net/category/publicystyka/feed/'),
    (u'Reportaż', u'http://wolnemedia.net/category/reportaz/feed/'),
    (u'Seks', u'http://wolnemedia.net/category/seks/feed/'),
    (u'Społeczeństwo', u'http://wolnemedia.net/category/spoleczenstwo/feed/'),
    (u'Świat komputerów', u'http://wolnemedia.net/category/swiat-komputerow/feed/'),
    (u'Wierzenia', u'http://wolnemedia.net/category/wierzenia/feed/'),
    (u'Zdrowie', u'http://wolnemedia.net/category/zdrowie/feed/')]
PK�X���uuwonderzine.png�PNG


IHDR  D����PLTEp���{25�;=�z.2����58�8;�+.��x58�|����'+�}������8;�v"������󟠺���.5�25����JL�������.2�NP�"'�.2�++���Š�����@B�'+����"�+.�@B�����=@�+.��mn�op�pr������rs�tu�tu�uu����������������������������������������WY������������"'����YZ�\]�������w���DF�RT����"'����BB�PR����UW�UW�FH�~���_`�ff����fg�fg�mn�������WY����������������������������������vv�z{�~~������������������������������������25�"'����������A��}IDATx���Âl1���Ѷ�l۶m�6�����$Zq�&�D+Jk��dz��{2�T-��1N�4\t���t�!|l4h�É��)=�/�t?N��_�뚸�N�`��n৭���w��*�|96����]��|�#���1��E{��VK�m�f2��H��.,�1��x7���
���G�Trx}ͼ
)q.�w�T�H��p$��Mϼ�d|ؾ�0s�0�YP�
G_'�����FvC 8�$S����b+��p��T�-��WͿ�0�Dz�f�xŨ�>���"@���§�=��;��P�
�j>�D�uケ2Kk12�nI�a.z��Λ��g;u�r�m�U#�GA��+0�IEND�B`�PK�Xa��9
9
wonderzine.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Wonderzine(BasicNewsRecipe):
    title = 'Wonderzine'
    __author__ = 'bugmen00t'
    description = '\u041E\u043D\u043B\u0430\u0439\u043D-\u0438\u0437\u0434\u0430\u043D\u0438\u0435 \u0434\u043B\u044F \u0441\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445 \u0436\u0435\u043D\u0449\u0438\u043D \u0438 \u0438\u0445 \u0434\u0440\u0443\u0437\u0435\u0439. \u041C\u044B \u043F\u0438\u0448\u0435\u043C \u043E \u043C\u043E\u0434\u0435 \u0438 \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0435, \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0445 \u0442\u0435\u043D\u0434\u0435\u043D\u0446\u0438\u044F\u0445 \u0438 \u0440\u0430\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u044F\u0445, \u0437\u0434\u043E\u0440\u043E\u0432\u044C\u0435 \u0438 \u0441\u0435\u043A\u0441\u0435, \u044D\u0442\u0438\u043A\u0435 \u0438 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u0445, \u043E\u0441\u043E\u0437\u043D\u0430\u043D\u043D\u044B\u0445 \u0442\u0440\u0430\u0442\u0430\u0445 \u0438 \u0440\u0430\u0437\u043D\u043E\u043E\u0431\u0440\u0430\u0437\u0438\u0438 \u043A\u0440\u0430\u0441\u043E\u0442\u044B.'  # noqa
    publisher = 'Redefine Media holding'
    category = 'blog'
    cover_url = u'https://lamcdn.net/wonderzine.com/post-og_image/WQRiRGqLlcKyEHsnOS-sUw.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    oldest_article = 14
    max_articles_per_feed = 20

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'is_article_end'})

    remove_tags = [
        dict(name='ul', attrs={'class': 'post-meta'}),
        dict(name='a', attrs={'class': 'flow'}),
        dict(name='a', attrs={'class': 'banner-ad-link'}),
        dict(name='div', attrs={'class': 'share-buttons-bar'}),
        dict(name='div', attrs={'class': 'pseudosidebar'})
    ]

    feeds = [(
        '\u0412\u0441\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B',
        'https://www.wonderzine.com/feeds/posts.atom'
    ),
             (
                 '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
                 'https://www.wonderzine.com/feeds/posts.atom?news=only'
             ),
             (
                 '\u0416\u0438\u0437\u043D\u044C',
                 'https://www.wonderzine.com/feeds/posts.atom?topic=life'
             ),
             (
                 '\u0417\u0434\u043E\u0440\u043E\u0432\u044C\u0435',
                 'https://www.wonderzine.com/feeds/posts.atom?topic=health'
             ),
             (
                 '\u041A\u0440\u0430\u0441\u043E\u0442\u0430',
                 'https://www.wonderzine.com/feeds/posts.atom?topic=beauty'
             ),
             (
                 '\u0420\u0430\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u044F',
                 'https://www.wonderzine.com/feeds/posts.atom?topic=entertainment'
             ),
             (
                 '\u0421\u0442\u0438\u043B\u044C',
                 'https://www.wonderzine.com/feeds/posts.atom?topic=style'
             ),
             (
                 '\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438',
                 'https://www.wonderzine.com/feeds/posts.atom?topic=opportunities'
             )]
PK�X3˴��words_without_borders.recipe# recipe created by sexymax15.....sexymax15@gmail.com
# Words without Borders recipe

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1308302002(BasicNewsRecipe):
    title = u'Words Without Borders'
    language = 'en'
    __author__ = 'sexymax15'
    oldest_article = 90
    max_articles_per_feed = 30
    use_embedded_content = False

    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True
    keep_only_tags = {'class': 'span-14 article'}
    remove_tags_after = [
        {'class': 'addthis_toolbox addthis_default_style no_print'}]
    remove_tags = [{'class': ['posterous_quote_citation', 'button']}]
    extra_css             = """
                               h1{font-family: Georgia,serif; font-size: large}h2{font-family: Georgia,serif; font-size: large} """

    feeds = [(u'wwb', u'http://feeds.feedburner.com/wwborders?format=xml')]
PK�XN9�,ccworkers_world.png�PNG


IHDR  D���nPLTE������������������������������������������������������𤋮囹�����폓ꏓ너���~�낆�}��~��ov�ty�sx�sx�kq�ns�gm�fk�gl�eh�OT�W\�RX�]c�U[�SY�UZ�PU�IO�NT�EK�EK�;B�AH�BH�GL�AG�AF�9@�:A�<B�<A�5;�5;�;A�08�,2�17�/5�-3�-4�-4�)1�28�07�'.�.4�-4�-3�#)�+2�(/� &� '�'.�%+�$+�"(�%+� &�!(�#)�")� &� '�!(� &� &� &� &�բ�ytRNS

"##()-./49AGHJNPTUZ_abefgklmnppqvz{~������������������������������������������������������������������r5+IDATx�}��b�A���g�6k۶m��k���ߙ$��]J^O7����"�Ȍ,��m���'r*g"�C�\r��5Crxo�J��ۺ$�sQO@{XҒ}�E�Vo�=�i�N��|x�}�X�r{X�#+�ǥ�ۍo�r��a�b�9D>#���ll�k#Sb@�=9��>ȥ�ʬ�`�<����ew�U��מY����X~*i��N�������U���GE�Y�)�}�M��r��܅���I�Z7X�1�S]}�U���P��}r
�*��4���U�z4]&��_tb�Z�|IEND�B`�PK�X�8��workers_world.recipefrom calibre.web.feeds.recipes import BasicNewsRecipe


class WorkersWorld(BasicNewsRecipe):

    title = u'Workers World'
    description = u'Socialist news and analysis'
    __author__ = u'urslnx'
    no_stylesheets = True
    use_embedded_content = False
    remove_javascript = True
    oldest_article = 7
    max_articles_per_feed = 100
    encoding = 'utf8'
    publisher = 'workers.org'
    category = 'news, politics, USA, world'
    language = 'en'
    publication_type = 'newsportal'
    extra_css = ' body{ font-family: Verdana,Arial,Helvetica,sans-serif; } h1{ font-size: x-large; text-align: left; margin-top:0.5em; margin-bottom:0.25em; } h2{ font-size: large; }  p{ text-align: left; } .published{ font-size: small; } .byline{ font-size: small; } .copyright{ font-size: small; } '  # noqa
    remove_tags_before = dict(name='div', attrs={'id': 'evernote'})
    remove_tags_after = dict(name='div', attrs={'id': 'footer'})

    masthead_url = 'http://www.workers.org/graphics/wwlogo300.gif'
    cover_url = 'http://www.workers.org/pdf/current.jpg'
    feeds = [(u'Headlines', u'http://www.workers.org/rss/nonstandard_rss.xml'),
             ]
PK�X��w���works_in_progress.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from calibre.web.feeds.news import BasicNewsRecipe


class WorksInProgress(BasicNewsRecipe):
    title          = 'Works in progress'
    description    = 'Works in Progress is an online magazine dedicated to sharing new and underrated ideas to improve the world, and features original writing from some of the most interesting thinkers in the world'  # noqa
    cover_url = "https://www.worksinprogress.co/wp-content/uploads/2020/03/logo-1.svg"
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True
    publication_type = 'magazine'
    language = 'en'
    index = "https://www.worksinprogress.co/"
    __author__ = "barakplasma"

    def parse_index(self):
        soup = self.index_to_soup(self.index)
        feeds = []

        for section in soup.find_all('div', 'issue-loop'):
            section_title = section['data-section-id']
            section_items = []

            for article in section.find_all('div', 'issue-intro'):
                title = article.find('h2', 'issue-title').text
                url = article.find_all('a')[1]['href']
                author = article.find('a', 'author').text
                section_items.append({
                    "title": title,
                    "url": url,
                    "author": author
                })

            feeds.append((section_title, section_items))

        return feeds
PK�X�����worldcrunch.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class Worldcrunch(BasicNewsRecipe):
    title = u'Worldcrunch'
    __author__ = 'Krittika Goyal'
    oldest_article = 2  # days
    max_articles_per_feed = 25
    use_embedded_content = False
    language = 'en'

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('News',
         'http://www.worldcrunch.com/rss/rss.php'),
    ]
PK�X|!���
wow.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class WoW(BasicNewsRecipe):
    title = u'WoW Insider'
    language = 'en'
    __author__ = 'Krittika Goyal'
    oldest_article = 1  # days
    max_articles_per_feed = 25
    use_embedded_content = False

    no_stylesheets = True
    auto_cleanup = True

    feeds = [
        ('WoW',
         'http://wow.joystiq.com/rss.xml')
    ]
PK�X���	�	woz_die.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class WozDie(BasicNewsRecipe):
    title = u'WOZ Die Wochenzeitung'
    oldest_article = 7
    max_articles_per_feed = 100
    language = 'de'

    no_stylesheets = True
    remove_tags = [dict(name='p', attrs={'class': 'arrow_top'})]
    remove_tags = [dict(name='p', attrs={'class': 'bottom_right'})]
    remove_tags = [dict(name='script')]
    extra_css      = '''#print_titel{vertical-align: bottom; text-align:
 left; color: #666666; background-color: white; padding-top: 30px; padding-
 bottom: 10px; border-bottom: 1px solid #999999;} #title{text-align:
 left; font-size: large; font-weight: 600; padding-top: 0px; padding-
 bottom: 6px;}  h3 {text-align: left; font-size: large; font-weight: 600;
 padding-top: 0px; padding-bottom: 6px;}  #lead{font-weight: 600;
 padding-bottom: 6px;}  h2{font-weight: 600; padding-bottom: 6px;}
 #author{color: #666666; padding-top: 0px; padding-bottom: 0px;}
 h4{color: #666666; padding-top: 0px; padding-bottom: 0px;}  #author2
 {color: #666666; padding-top: 0px; padding-bottom: 0px;}  .dotted_line
 {padding-top: 0px; margin-bottom: 18px; border-bottom: 1px dotted
 #666666;}  .intro{margin: 0 auto; font-weight: 600; padding-bottom:
 18px;}  h5{margin: 0 auto; font-weight: 600; padding-bottom: 18px;}
 .intro2{margin: 0 auto;  font-weight: 600;}  .text{padding-bottom:
 18px;}  .subtitle{margin: 0 auto; font-weight: 600; padding-bottom:
 10px;}  .articletitle{margin: 0 auto; font-weight: 600; padding-bottom:
 10px;}  #content_infobox{margin-top: 20px; margin-left: 0px; margin-
 right: 0px; margin-bottom: 10px; text-align: left; border-bottom: 1px
 solid #999999;}  .content_infobox_titel{padding-top: 6px; padding-
 bottom: 8px; padding-left: 8px; padding-right: 8px; font-weight: 600;
 border-top: 1px solid #999999; border-bottom: 1px dotted #999999;}
 .content_infobox_text{padding-top: 6px; padding-bottom: 12px; padding-
 left: 8px; padding-right: 8px;}  .box_gray{padding-top: 4px; padding-
 left:  7px; padding-right:  7px; padding-bottom:  4px;}  .box_white {
 padding-top: 4px; padding-left:  7px; padding-right:  7px; padding-bottom:
 4px;}  .content_infobox_mehr{margin-top: 20px; margin-left: 0px; margin-
 right: 0px; margin-bottom: 10px; text-align: left; width: 600px; border-
 bottom: 1px solid #999999;}'''

    feeds = [('WOZ Die Wochenzeitung - Headlines',
              'http://www.woz.ch/inhalt/headlinesRSS.php'), ]

    def print_version(self, url):
        return url.replace('rss/', 'print_')
PK�Xs�?_��wsj.png�PNG


IHDR��h6MIDATxڝ�
 {�?� a����ND���+�%�6���r��q@1���������R��9�c._{�'6��}��DIEND�B`�PK�XB��7I2I2
wsj.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals
import json
import random
import time
from base64 import standard_b64encode
from datetime import date, timedelta
from mechanize import Request

from calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe
from css_selectors import Select

try:
    import urllib.parse as urlparse
except ImportError:
    import urlparse
try:
    from urllib.parse import quote
except ImportError:
    from urllib import quote


needs_subscription = 'optional'

class WSJ(BasicNewsRecipe):

    if needs_subscription:
        title = 'The Wall Street Journal'
    else:
        title = 'The Wall Street Journal (free)'
    __author__ = 'Kovid Goyal'
    description = 'News and current affairs'
    language = 'en'
    masthead_url = 'https://s.wsj.net/media/wsj_amp_masthead_lg.png'

    compress_news_images = True
    compress_news_images_auto_size = 7

    timefmt = ' [%a, %b %d, %Y]'
    no_stylesheets = True
    ignore_duplicate_articles = {'url'}
    remove_attributes = ['style','height','width']
    needs_subscription = needs_subscription
    WSJ_ITP = 'https://www.wsj.com/print-edition/today'
    delay = 1

    storage = []

    extra_css = '''
        #big-top-caption { font-size:small; text-align:center; }
        [data-type:"tagline"] { font-style:italic; color:#202020; }
        .auth, time { font-size:small; }
        .sub, em, i { color: #202020; }
    '''

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.frontpages.com/the-wall-street-journal/')
        return 'https://www.frontpages.com' + soup.find('img', attrs={'id':'giornale-img'})['src']

    keep_only_tags = [
        dict(name=['h1', 'h2']),
        dict(attrs={'aria-describedby':'big-top-caption'}),
        dict(attrs={'id':'big-top-caption'}),
        dict(name='article', attrs={'style':lambda x: x and 'article-body' in x})
    ]

    remove_tags = [
        dict(attrs={'data-type':['inset', 'video']}),
        dict(attrs={'data-testid':'ad-container'}),
        dict(attrs={'data-spotim-app':'conversation'}),
        dict(name=['button', 'svg', 'old-script', 'video']),
        dict(attrs={'aria-label':[
            'Sponsored Offers', 'Listen To Article', 'What to Read Next', 'Utility Bar', 
            'Conversation', 'List of Comments', 'Comment', 'JR More Articles'
        ]}),
        dict(attrs={'data-spot-im-class':['message-text', 'messages-list', 'message-view', 'conversation-root']}),
        dict(attrs={'id':lambda x: x and x.startswith(
            ('comments_sector', 'wrapper-INLINE', 'audio-tag-inner-audio-', 'article-comments-tool')
        )}),
        dict(name='div', attrs={'data-message-depth':True})
    ]

    articles_are_obfuscated = True
    def get_obfuscated_article(self, url):
        from calibre.scraper.simple import read_url
        br = self.get_browser()
        br.set_handle_redirect(False)
        try:
            br.open(url)
        except Exception as e:
            hdrs_location = e.hdrs.get('location')
            if hdrs_location:
                url = e.hdrs.get('location')
        raw = read_url(self.storage, 'https://archive.is/latest/' + url)
        pt = PersistentTemporaryFile('.html')
        pt.write(raw.encode('utf-8'))
        pt.close()
        return pt.name

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'old-src':True}):
            img['src'] = img['old-src']
        for p in soup.findAll('div', attrs={'data-type':['paragraph', 'image']}):
            p.name = 'p'
        for a in soup.findAll('a', href=True):
            a['href'] = 'http' + a['href'].split('http')[-1]
        for figc in soup.findAll('figcaption'):
            figc['id'] = 'big-top-caption'
        if name:= soup.find('h2', attrs={'itemprop':'name'}):
                name.extract()
        for h2 in soup.findAll('h2'):
            if self.tag_to_string(h2).startswith(('What to Read Next', 'Conversation')):
                h2.extract()
            h2.name = 'h3'
            h2['class'] = 'sub'
        for ph in soup.findAll('a', attrs={'data-type':['phrase', 'link']}):
            if div := ph.findParent('div'):
                div.name = 'span'
        for auth in soup.findAll('a', attrs={'aria-label': lambda x: x and x.startswith('Author page')}):
            if div := auth.find_previous_sibling('div'):
                div.name = 'span'
            if parent := auth.findParent('div'):
                parent['class'] = 'auth'
        for x in soup.findAll('ufc-follow-author-widget'):
            if y := x.findParent('div'):
                y.extract()
        return soup

    # login {{{

    def get_browser_for_wsj(self, *a, **kw):
        br = BasicNewsRecipe.get_browser(self, *a, **kw)
        br.set_cookie('wsjregion', 'na,us', '.wsj.com')
        br.set_cookie('gdprApplies', 'false', '.wsj.com')
        br.set_cookie('ccpaApplies', 'false', '.wsj.com')
        return br

    if False and needs_subscription:  # disabled as we currently use archive.is
        def get_browser(self, *a, **kw):
            from pprint import pprint
            pprint
            # To understand the login logic read app-min.js from
            # https://sso.accounts.dowjones.com/login
            itp = quote(self.WSJ_ITP, safe='')
            start_url = 'https://accounts.wsj.com/login?target=' + itp
            self.log('Starting login process at', start_url)
            br = self.get_browser_for_wsj(*a, **kw)
            # br.set_debug_http(True)
            res = br.open(start_url)
            sso_url = res.geturl()
            query =  urlparse.parse_qs(urlparse.urlparse(sso_url).query)
            query = {k:v[0] for k, v in query.items()}
            # pprint(query)
            request_query = {
                'username': self.username,
                'password': self.password,
                'client_id': query['client'],
                'tenant': 'sso',
                '_intstate': 'deprecated',
                'connection': 'DJldap',
                'headers': {
                    'X-REMOTE-USER': self.username,
                    'x-_dj-_client__id': query['client'],
                },
            }
            for cookie in br.cookiejar:
                if cookie.name in ('_csrf', 'csrf'):
                    request_query['_csrf'] = cookie.value
            for k in 'scope connection nonce state ui_locales ns mars protocol redirect_uri'.split():
                if k in query:
                    request_query[k] = query[k]
            # pprint(request_query)
            login_url = 'https://sso.accounts.dowjones.com/usernamepassword/login'
            # you can get the version below from lib-min.js
            # search for: "\d+\.\d+\.\d+"
            # This might need to be updated in the future
            auth0_client = json.dumps({"name": "auth0.js-ulp", "version": "9.11.3"})
            if not isinstance(auth0_client, bytes):
                auth0_client = auth0_client.encode('utf-8')
            auth0_client = standard_b64encode(auth0_client)
            if isinstance(auth0_client, bytes):
                auth0_client = auth0_client.decode('ascii')
            rq = Request(login_url, headers={
                'Accept': 'text/html',
                'Accept-Language': 'en-US,en;q=0.8',
                'Origin': 'https://sso.accounts.dowjones.com',
                'Auth0-Client': auth0_client.rstrip('='),
                'X-HTTP-Method-Override': 'POST',
                'X-Requested-With': 'XMLHttpRequest',
                'X-Remote-User': self.username,
                'x-dj-client_id': request_query['client_id'],
            }, data=request_query)
            self.log('Sending login request...')
            try:
                res = br.open(rq)
            except Exception as err:
                if hasattr(err, 'read'):
                    raise Exception('Login request failed with error: {} and body: {}'.format(err, err.read().decode('utf-8', 'replace')))
                raise
            if res.code != 200:
                raise ValueError('Failed to login, check your username and password')
            br.select_form(nr=0)
            self.log('Performing login callback...')
            res = br.submit()
            self.log('Print edition resolved url:', res.geturl())
            self.wsj_itp_page = raw = res.read()
            if b'/logout' not in raw:
                raise ValueError(
                    'Failed to login (callback URL failed), check username and password')
            return br
    else:
        def get_browser(self, *a, **kw):
            br = self.get_browser_for_wsj(*a, **kw)
            res = br.open(self.WSJ_ITP)
            url = res.geturl()
            if '/20210913/' in url:
                today = date.today()
                q = today.isoformat().replace('-', '')
                try:
                    res = br.open(url.replace('/20210913/', '/' + q + '/'))
                except Exception:
                    today -= timedelta(days=1)
                    q = today.isoformat().replace('-', '')
                    res = br.open(url.replace('/20210913/', '/' + q + '/'))
            self.log('Print edition resolved url:', res.geturl())
            self.wsj_itp_page = res.read()
            return br
    # }}}

    def abs_wsj_url(self, href, modify_query=True):
        if not href.startswith('http'):
            href = 'https://www.wsj.com' + href
        if modify_query:
            href = href
        return href.split('?')[0]

    def wsj_find_articles(self, url, ahed=False):
        root = self.index_to_soup(url, as_tree=True)
        CSSSelect = Select(root)
        articles = []
        for container in root.xpath('descendant::div[contains(@class, "WSJTheme--list-item--")]'):
            heading = next(CSSSelect('h2, h3', container))
            a = next(CSSSelect('a', heading))
            title = self.tag_to_string(a)
            url = self.abs_wsj_url(a.get('href'))
            desc = ''
            for p in container.xpath('descendant::p[contains(@class, "WSJTheme--description--")]'):
                q = self.tag_to_string(p)
                if 'Subscriber Content' in q:
                    continue
                desc += q
                break

            articles.append({'title': title, 'url': url,
                             'description': desc, 'date': ''})
            self.log('\tFound article:', title)
            self.log('\t\t', desc + " " + url)
            if self.test and len(articles) >= self.test[1]:
                break

        return articles

    def wsj_add_feed(self, feeds, title, url):
        try:
            for i in range(5):
                articles = self.wsj_find_articles(url)
                if articles:
                    break
                else:
                    pause = random.choice((1, 1.5, 2, 2.5))
                    self.log.warn('No articles found in', url, 'retrying after', pause, 'seconds')
                    time.sleep(pause)
        except Exception:
            self.log.exception('Failed to parse section:', title)
            articles = []
        if articles:
            feeds.append((title, articles))
        else:
            self.log.warn('No articles found in', url)

    def parse_index(self):
        # return self.test_wsj_index()
        root = self.index_to_soup(self.wsj_itp_page, as_tree=True)
        CSSSelect = Select(root)
        # from calibre.utils.ipython import ipython
        # ipython({'root': root, 'CSSSelect': CSSSelect, 'raw': self.wsj_itp_page})
        for inp in CSSSelect('.DayPickerInput > input'):
            if inp.get('placeholder'):
                self.timefmt = inp.get('placeholder')
                break

        feeds = []
        for container in root.xpath('descendant::*[contains(@class, "WSJTheme--top-menu-item--")]'):
            for a in container.xpath('descendant::a[contains(@class, "WSJTheme--section-link--")]'):
                title = self.tag_to_string(a).capitalize().strip().replace('U.s.', 'U.S.')
                if not title:
                    continue
                url = self.abs_wsj_url(a.get('href'), modify_query=False)
                self.log('Found section:', title, 'at', url)
                self.wsj_add_feed(feeds, title, url)
                if self.test and len(feeds) >= self.test[0]:
                    break
        return feeds

    def test_wsj_index(self):
        return [
            ('Testing', [
                {'title': 'Subscriber Article',
                 'url': self.abs_wsj_url('https://www.wsj.com/articles/remington-gun-call-of-duty-video-game-93059a66')},
            ]),
        ]
PK�Xs�?_��wsj_free.png�PNG


IHDR��h6MIDATxڝ�
 {�?� a����ND���+�%�6���r��q@1���������R��9�c._{�'6��}��DIEND�B`�PK�Xl�C2C2wsj_free.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals
import json
import random
import time
from base64 import standard_b64encode
from datetime import date, timedelta
from mechanize import Request

from calibre.ptempfile import PersistentTemporaryFile
from calibre.web.feeds.news import BasicNewsRecipe
from css_selectors import Select

try:
    import urllib.parse as urlparse
except ImportError:
    import urlparse
try:
    from urllib.parse import quote
except ImportError:
    from urllib import quote


needs_subscription = False

class WSJ(BasicNewsRecipe):

    if needs_subscription:
        title = 'The Wall Street Journal'
    else:
        title = 'The Wall Street Journal (free)'
    __author__ = 'Kovid Goyal'
    description = 'News and current affairs'
    language = 'en'
    masthead_url = 'https://s.wsj.net/media/wsj_amp_masthead_lg.png'

    compress_news_images = True
    compress_news_images_auto_size = 7

    timefmt = ' [%a, %b %d, %Y]'
    no_stylesheets = True
    ignore_duplicate_articles = {'url'}
    remove_attributes = ['style','height','width']
    needs_subscription = needs_subscription
    WSJ_ITP = 'https://www.wsj.com/print-edition/today'
    delay = 1

    storage = []

    extra_css = '''
        #big-top-caption { font-size:small; text-align:center; }
        [data-type:"tagline"] { font-style:italic; color:#202020; }
        .auth, time { font-size:small; }
        .sub, em, i { color: #202020; }
    '''

    def get_cover_url(self):
        soup = self.index_to_soup('https://www.frontpages.com/the-wall-street-journal/')
        return 'https://www.frontpages.com' + soup.find('img', attrs={'id':'giornale-img'})['src']

    keep_only_tags = [
        dict(name=['h1', 'h2']),
        dict(attrs={'aria-describedby':'big-top-caption'}),
        dict(attrs={'id':'big-top-caption'}),
        dict(name='article', attrs={'style':lambda x: x and 'article-body' in x})
    ]

    remove_tags = [
        dict(attrs={'data-type':['inset', 'video']}),
        dict(attrs={'data-testid':'ad-container'}),
        dict(attrs={'data-spotim-app':'conversation'}),
        dict(name=['button', 'svg', 'old-script', 'video']),
        dict(attrs={'aria-label':[
            'Sponsored Offers', 'Listen To Article', 'What to Read Next', 'Utility Bar',
            'Conversation', 'List of Comments', 'Comment', 'JR More Articles'
        ]}),
        dict(attrs={'data-spot-im-class':['message-text', 'messages-list', 'message-view', 'conversation-root']}),
        dict(attrs={'id':lambda x: x and x.startswith(
            ('comments_sector', 'wrapper-INLINE', 'audio-tag-inner-audio-', 'article-comments-tool')
        )}),
        dict(name='div', attrs={'data-message-depth':True})
    ]

    articles_are_obfuscated = True
    def get_obfuscated_article(self, url):
        from calibre.scraper.simple import read_url
        br = self.get_browser()
        br.set_handle_redirect(False)
        try:
            br.open(url)
        except Exception as e:
            hdrs_location = e.hdrs.get('location')
            if hdrs_location:
                url = e.hdrs.get('location')
        raw = read_url(self.storage, 'https://archive.is/latest/' + url)
        pt = PersistentTemporaryFile('.html')
        pt.write(raw.encode('utf-8'))
        pt.close()
        return pt.name

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'old-src':True}):
            img['src'] = img['old-src']
        for p in soup.findAll('div', attrs={'data-type':['paragraph', 'image']}):
            p.name = 'p'
        for a in soup.findAll('a', href=True):
            a['href'] = 'http' + a['href'].split('http')[-1]
        for figc in soup.findAll('figcaption'):
            figc['id'] = 'big-top-caption'
        if name:= soup.find('h2', attrs={'itemprop':'name'}):
                name.extract()
        for h2 in soup.findAll('h2'):
            if self.tag_to_string(h2).startswith(('What to Read Next', 'Conversation')):
                h2.extract()
            h2.name = 'h3'
            h2['class'] = 'sub'
        for ph in soup.findAll('a', attrs={'data-type':['phrase', 'link']}):
            if div := ph.findParent('div'):
                div.name = 'span'
        for auth in soup.findAll('a', attrs={'aria-label': lambda x: x and x.startswith('Author page')}):
            if div := auth.find_previous_sibling('div'):
                div.name = 'span'
            if parent := auth.findParent('div'):
                parent['class'] = 'auth'
        for x in soup.findAll('ufc-follow-author-widget'):
            if y := x.findParent('div'):
                y.extract()
        return soup

    # login {{{

    def get_browser_for_wsj(self, *a, **kw):
        br = BasicNewsRecipe.get_browser(self, *a, **kw)
        br.set_cookie('wsjregion', 'na,us', '.wsj.com')
        br.set_cookie('gdprApplies', 'false', '.wsj.com')
        br.set_cookie('ccpaApplies', 'false', '.wsj.com')
        return br

    if False and needs_subscription:  # disabled as we currently use archive.is
        def get_browser(self, *a, **kw):
            from pprint import pprint
            pprint
            # To understand the login logic read app-min.js from
            # https://sso.accounts.dowjones.com/login
            itp = quote(self.WSJ_ITP, safe='')
            start_url = 'https://accounts.wsj.com/login?target=' + itp
            self.log('Starting login process at', start_url)
            br = self.get_browser_for_wsj(*a, **kw)
            # br.set_debug_http(True)
            res = br.open(start_url)
            sso_url = res.geturl()
            query =  urlparse.parse_qs(urlparse.urlparse(sso_url).query)
            query = {k:v[0] for k, v in query.items()}
            # pprint(query)
            request_query = {
                'username': self.username,
                'password': self.password,
                'client_id': query['client'],
                'tenant': 'sso',
                '_intstate': 'deprecated',
                'connection': 'DJldap',
                'headers': {
                    'X-REMOTE-USER': self.username,
                    'x-_dj-_client__id': query['client'],
                },
            }
            for cookie in br.cookiejar:
                if cookie.name in ('_csrf', 'csrf'):
                    request_query['_csrf'] = cookie.value
            for k in 'scope connection nonce state ui_locales ns mars protocol redirect_uri'.split():
                if k in query:
                    request_query[k] = query[k]
            # pprint(request_query)
            login_url = 'https://sso.accounts.dowjones.com/usernamepassword/login'
            # you can get the version below from lib-min.js
            # search for: "\d+\.\d+\.\d+"
            # This might need to be updated in the future
            auth0_client = json.dumps({"name": "auth0.js-ulp", "version": "9.11.3"})
            if not isinstance(auth0_client, bytes):
                auth0_client = auth0_client.encode('utf-8')
            auth0_client = standard_b64encode(auth0_client)
            if isinstance(auth0_client, bytes):
                auth0_client = auth0_client.decode('ascii')
            rq = Request(login_url, headers={
                'Accept': 'text/html',
                'Accept-Language': 'en-US,en;q=0.8',
                'Origin': 'https://sso.accounts.dowjones.com',
                'Auth0-Client': auth0_client.rstrip('='),
                'X-HTTP-Method-Override': 'POST',
                'X-Requested-With': 'XMLHttpRequest',
                'X-Remote-User': self.username,
                'x-dj-client_id': request_query['client_id'],
            }, data=request_query)
            self.log('Sending login request...')
            try:
                res = br.open(rq)
            except Exception as err:
                if hasattr(err, 'read'):
                    raise Exception('Login request failed with error: {} and body: {}'.format(err, err.read().decode('utf-8', 'replace')))
                raise
            if res.code != 200:
                raise ValueError('Failed to login, check your username and password')
            br.select_form(nr=0)
            self.log('Performing login callback...')
            res = br.submit()
            self.log('Print edition resolved url:', res.geturl())
            self.wsj_itp_page = raw = res.read()
            if b'/logout' not in raw:
                raise ValueError(
                    'Failed to login (callback URL failed), check username and password')
            return br
    else:
        def get_browser(self, *a, **kw):
            br = self.get_browser_for_wsj(*a, **kw)
            res = br.open(self.WSJ_ITP)
            url = res.geturl()
            if '/20210913/' in url:
                today = date.today()
                q = today.isoformat().replace('-', '')
                try:
                    res = br.open(url.replace('/20210913/', '/' + q + '/'))
                except Exception:
                    today -= timedelta(days=1)
                    q = today.isoformat().replace('-', '')
                    res = br.open(url.replace('/20210913/', '/' + q + '/'))
            self.log('Print edition resolved url:', res.geturl())
            self.wsj_itp_page = res.read()
            return br
    # }}}

    def abs_wsj_url(self, href, modify_query=True):
        if not href.startswith('http'):
            href = 'https://www.wsj.com' + href
        if modify_query:
            href = href
        return href.split('?')[0]

    def wsj_find_articles(self, url, ahed=False):
        root = self.index_to_soup(url, as_tree=True)
        CSSSelect = Select(root)
        articles = []
        for container in root.xpath('descendant::div[contains(@class, "WSJTheme--list-item--")]'):
            heading = next(CSSSelect('h2, h3', container))
            a = next(CSSSelect('a', heading))
            title = self.tag_to_string(a)
            url = self.abs_wsj_url(a.get('href'))
            desc = ''
            for p in container.xpath('descendant::p[contains(@class, "WSJTheme--description--")]'):
                q = self.tag_to_string(p)
                if 'Subscriber Content' in q:
                    continue
                desc += q
                break

            articles.append({'title': title, 'url': url,
                             'description': desc, 'date': ''})
            self.log('\tFound article:', title)
            self.log('\t\t', desc + " " + url)
            if self.test and len(articles) >= self.test[1]:
                break

        return articles

    def wsj_add_feed(self, feeds, title, url):
        try:
            for i in range(5):
                articles = self.wsj_find_articles(url)
                if articles:
                    break
                else:
                    pause = random.choice((1, 1.5, 2, 2.5))
                    self.log.warn('No articles found in', url, 'retrying after', pause, 'seconds')
                    time.sleep(pause)
        except Exception:
            self.log.exception('Failed to parse section:', title)
            articles = []
        if articles:
            feeds.append((title, articles))
        else:
            self.log.warn('No articles found in', url)

    def parse_index(self):
        # return self.test_wsj_index()
        root = self.index_to_soup(self.wsj_itp_page, as_tree=True)
        CSSSelect = Select(root)
        # from calibre.utils.ipython import ipython
        # ipython({'root': root, 'CSSSelect': CSSSelect, 'raw': self.wsj_itp_page})
        for inp in CSSSelect('.DayPickerInput > input'):
            if inp.get('placeholder'):
                self.timefmt = inp.get('placeholder')
                break

        feeds = []
        for container in root.xpath('descendant::*[contains(@class, "WSJTheme--top-menu-item--")]'):
            for a in container.xpath('descendant::a[contains(@class, "WSJTheme--section-link--")]'):
                title = self.tag_to_string(a).capitalize().strip().replace('U.s.', 'U.S.')
                if not title:
                    continue
                url = self.abs_wsj_url(a.get('href'), modify_query=False)
                self.log('Found section:', title, 'at', url)
                self.wsj_add_feed(feeds, title, url)
                if self.test and len(feeds) >= self.test[0]:
                    break
        return feeds

    def test_wsj_index(self):
        return [
            ('Testing', [
                {'title': 'Subscriber Article',
                 'url': self.abs_wsj_url('https://www.wsj.com/articles/remington-gun-call-of-duty-video-game-93059a66')},
            ]),
        ]
PK�X�����wvhooligan.png�PNG


IHDR��h6�IDATx�
���A�ﭭ����g����@qAAC��\|��4
L��Wp��埞魪nY'�pOp�>lէ�7O ! GK�(�ضȸ��sΑ����k֊�O�^�t�v��)�7�MZ�$(��Z8��
t��U�q�o۳�H�c��Z������_UF�L�ժ���^�k/ʼ8s�ض�[�WG��.5[,ýG�߾A�5H�2%��F"s$���R�z��ӷ9���]FɳgNp�ݸu�r?L"$ʡ64�0M�?����G�|锇u����Lw��� 3mO�B6_.���b���Y�wV�F����([�Z��f$�Z�um-�8��>�j4X��sd��&ϟ}�Cֶ�T
�H�X"��-c�![��an�eZҮ���-k����@��H�F�[��tRdi�a��2���L�f��/����bY��w*�<�mwp��#6;��Z�>���
C��Q�N޳nEZ�׍�Y��D$�.(�ěW�#�T�%�e=۷{�n22��E�$ւ������ՖM�/�>~S��?�$&�I�^�)������Jc������;UiV���s�"���O�k�<�[�#t�	�B
,�"�>����1�yH�@}LfF�� �'DƂ�!ƢC`t��=�x�99IEND�B`�PK�X�&O���wvhooligan.recipe#!/usr/bin/env python
__license__ = 'GPL 3'
__copyright__ = 'zotzo'
__docformat__ = 'restructuredtext en'
'''
http://wvhooligan.com/
'''
from calibre.web.feeds.news import BasicNewsRecipe


class wvHooligan(BasicNewsRecipe):
    authors = u'Drew Epperley'
    __author__ = 'rylsfan'
    language = 'en'
    version = 2

    title = u'WV Hooligan'
    publisher = u'Drew Epperley'
    publication_type = 'Blog'
    category = u'Soccer'
    description = u'A look at Major League Soccer (MLS) through the eyes of a MLS writer and fan.'

    cover_url = 'http://wvhooligan.com/wp-content/themes/urbanelements/images/logo3.png'

    oldest_article = 15
    max_articles_per_feed = 150
    use_embedded_content = True
    no_stylesheets = True
    remove_javascript = True
    encoding = 'utf8'

    conversion_options = {
        'comment': description, 'tags': category, 'publisher': publisher, 'language': language
    }

    remove_tags = [
        {'class': 'feedflare'},
        {'class': 'tweetmeme_button'},
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)

    feeds = [
        (u'Stories', u'http://feeds2.feedburner.com/wvhooligan'),
        (u'MLS', u'http://wvhooligan.com/category/mls/feed/'),
        (u'MLS Power Rankings',
         u'http://wvhooligan.com/category/power-rankings/feed/'),
        (u'MLS Expansion',
         u'http://wvhooligan.com/category/mls/expansion-talk/feed/'),
        (u'US National Team',
         u'http://wvhooligan.com/category/us-national-team/feed/'),
        (u'College', u'http://wvhooligan.com/category/college-soccer/feed/'),
    ]

    extra_css = '''
               h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
               h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
               p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
               body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
               '''
PK�X!O+--xkcd.png�PNG


IHDR  D���'PLTE������   ���ppp������������(((���f�*��IDATxڅ���PD_�I������!6CQ��+yV~����b�N��@���ya<��@2�~����0A��@�L��LF�eic�z�@Ʌ4L�
�����y	�ܑP�X�P�h[����w�Ģ��p�!B�>���^Uڇ_-�������I���8*k��r:xg����:�8���9=�	�g�\�IEND�B`�PK�X�_e��xkcd.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
Changelog:
2015-07-29
Fixed issue with 'a' tags outside of list of articles (cjp)
2012-04-06
Fixed empty articles, added masthead img (NiLuJe)
2011-09-24
Changed cover (drMerry)
'''
'''
Fetch xkcd.
'''

import time
import re
from calibre.web.feeds.news import BasicNewsRecipe


class XkcdCom(BasicNewsRecipe):
    cover_url = 'http://imgs.xkcd.com/static/terrible_small_logo.png'
    masthead_url = 'http://imgs.xkcd.com/static/terrible_small_logo.png'
    title = 'xkcd'
    description = 'A webcomic of romance and math humor.'
    __author__ = 'Martin Pitt updated by DrMerry.'
    language = 'en'

    use_embedded_content = False
    oldest_article = 60
    keep_only_tags = [dict(id='comic')]
    no_stylesheets = True
    # turn image bubblehelp into a paragraph, and put alt in a heading
    preprocess_regexps = [
        (re.compile(r'(<img.*title=")([^"]+)(".alt=")([^"]+)(".*>)'),
         lambda m: '<h1>%s</h1>%s%s%s<p>%s</p>' % (m.group(4), m.group(1), m.group(3), m.group(5), m.group(2)))
    ]

    def parse_index(self):
        INDEX = 'http://xkcd.com/archive/'

        soup = self.index_to_soup(INDEX)
        articles = []
        for item in soup.find('div', attrs={'id': 'middleContainer'}).findAll('a', title=True):
            articles.append({
                'date': item['title'],
                'timestamp': time.mktime(time.strptime(item['title'], '%Y-%m-%d')) + 1,
                'url': 'http://xkcd.com' + item['href'],
                'title': self.tag_to_string(item),
                'description': '',
                'content': '',
            })

        return [('xkcd', articles)]
PK�X-Kލ�xpatloop.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1347997197(BasicNewsRecipe):
    title = u'XpatLoop.com'
    __author__ = 'laca'
    oldest_article = 7
    language = 'en_HU'
    auto_cleanup = True
    masthead_url = 'http://www.xpatloop.com/images/cms/xs_logo.gif'
    use_embedded_content = False

    author = 'laca'
    simultaneous_downloads = 1
    max_articles_per_feed = 50

    no_stylesheets = True

    feeds = [(u'Current Affairs', u'http://www.xpatloop.com/current_affairs.rss'),
             (u'Community & Culture', u'http://www.xpatloop.com/community.rss'),
             (u'Business & Finance', u'http://www.xpatloop.com/business.rss'),
             (u'Entertainment', u'http://www.xpatloop.com/entertainment.rss'),
             (u'Dining Guide', u'http://www.xpatloop.com/dining_guide.rss'),
             (u'Getting Around', u'http://www.xpatloop.com/getting_around.rss'),
             (u'Movies', u'http://www.xpatloop.com/movies.rss'),
             (u'Shopping', u'http://www.xpatloop.com/shopping_channel.rss'),
             (u'Travel', u'http://www.xpatloop.com/travel.rss'),
             (u'Sport and Fitness', u'http://www.xpatloop.com/sport_and_fitness.rss'),
             (u'Health and Wellness', u'http://www.xpatloop.com/health_and_wellness.rss'),
             (u'Infotech & Telco', u'http://www.xpatloop.com/infotech_telco.rss'),
             (u'Real Estate', u'http://www.xpatloop.com/property_real_estate.rss'),
             (u'Specials', u'http://www.xpatloop.com/specials.rss'),
             (u'Video Channel', u'http://www.xpatloop.com/video.rss'),
             (u'Events', u'http://www.xpatloop.com/events.rss')]
PK�X+|=**yagmur_dergisi.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class Yagmur(BasicNewsRecipe):
    title = u'Yagmur Dergisi'
    __author__ = u'thomass'
    description = 'Üç Aylık Dil, Kültür ve Edebiyat Dergisi'
    oldest_article = 90
    max_articles_per_feed = 100
    no_stylesheets = True

    category = 'dergi, ilim, kültür, edebiyat,Türkçe'
    language = 'tr'
    publication_type = 'magazine'
    encoding = 'ISO 8859-9'
    publisher = 'thomass'

    conversion_options = {
        'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }

    cover_img_url = 'http://www.sizinti.com.tr/images/dergiler/d2.gif'
    masthead_url = 'http://www.sizinti.com.tr/images/dergiler/d2.gif'

    feeds = [
        (u'Yagmur', u'http://open.dapper.net/services/yagmur'),
    ]

    def print_version(self, url):  # there is a problem caused by table format
        return url.replace('http://www.yagmurdergisi.com.tr/konu_goster.php?konu_id=', 'http://www.yagmurdergisi.com.tr/yazformati.php?konu_id=')
PK�Xs����yahoo_news.png�PNG


IHDR  szz��IDATx^��ߋ]W�?k�s�͝�$͠5E1�&L,��I��X�@�7�*}H3�*�&HQ���(��h}(X��}�V��B^�d�	Z۴&f:3���ג���3 �kس�>g����Zw��>����?�4��WF��é	o��c�;z�c��O�1��
���؈=��B��w�ɫ���D��)����b��z�W�q����ܝH�U�f�Ƕ�i���iSh1:d΢ВѰ���x�E�iX@���`(뀭)o�;FA��J�kl��0S&,c(B����lxl'FÒ�X�V�B�u܄��@�P����Q�
�E��cd��Ė��U�c��$3�<�E�x�DzH�F��DN����k=��lXu����e�h�A�nz�B7�ôf%5���™���o�tw滧���w.��!z�C��w�y�c㵞�#�'��B'�#&l�g_Kd�^�SYs�Ó���G������0�K�$�7��h��{�oz��, 6"��*��ނҡlTB��I��Z�?���\Yb��9�����z�%#�	|�k�b����?mp�����̮@";P�gF�VR�!��!I���G/�����~�,OI2&� qg�	��m���\'I�����B+7i��@�g�]�t�xht���g��G�T�Y8�C��&��?ˍ�^���mT�����h<aĂ@X�,6l�_O���f=��kB�w�9��{h���
��V �J�d`(1L<�BK/-�ʴ~V-<��˄q�LJn�xj���_�L�u� N��0��mz��'�c
��DS
`A:W�:s�J�?8�ޏ-���2��p�Z�/��$��.����B��A
D-{Lv�QIa��^㑧���c��i?8�F��`��`*3�:���M��F�mV	@�S�(C�
�.��>�/]|7��X`aoC����?��g��OH�Gc|c�c��N\2�@"E�@Pq�ޔ��:�W~�v���I�LA-5R���V����ЄX���8��=O���묟�N�]���W#�ES[%DOt�?��&
�(3WØ9�b���|�|��3W	��\�;m����ۦ�x�D��mP��Bv�!KegE��`���)Ea�R<0F�]�\z�/�"d'��$��(~����I�^�ϾxS)aHc�̗�zۮe��6 J�$K$F��
�1)�$SĢ��}xO	��B"2��0��!�D�x�z�B&��MQ邕�Wx��
�@�IL�2a4�LQb�i��h]WA!���I�R(@O���ࠈT�ܛ���璌0dd��N�
QB��!�lBjͭ�pq����1ȯ����RCK#L#b�\�@�
%H0P�!cp�A1q�J$H`�<yDHV�j��.!�p�IU~�����b�דg	�=8$�e�n�����4�[�ķȆL-�*�1�*�0W!v��D���\~��ބG?�3TԁÃ{��g�7f�H�;	İ�Dp��	� ��%�@�(	ԽE�AHP�ջa_]���G��1�,p8�!#1'�DW3�F�m�(Mv�2\�\	!B(DY{�NH����c3&�4�	R�'gh�����E�?��\V)��)�S}�뺫��M�����<�)�æzP�ރq�)���ۡ��P
����󯮌V?|�G�I6�=ǘcݓW��c��L,�O�y0IEND�B`�PK�X}�twwyahoo_news.recipefrom 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 YahooNews(BasicNewsRecipe):
    title = 'Yahoo News'
    __author__ = 'Starson17'
    description = 'Yahoo-Science'
    language = 'en'
    use_embedded_content = False
    no_stylesheets = True
    linearize_tables = True
    oldest_article = 24
    remove_javascript = True
    remove_empty_feeds = True
    max_articles_per_feed = 10

    feeds = [  # There are dozens of other feeds at http://news.yahoo.com/rss
        (u'Top Stories', u'http://rss.news.yahoo.com/rss/topstories'),
        (u'Science', u'http://rss.news.yahoo.com/rss/science')
    ]

    keep_only_tags = [
            dict(name='h1'),
            dict(attrs={'itemprop': 'articleBody'})
    ]

    remove_tags = [
            classes('canvas-yahoovideo canvas-sharebuttons'),
            dict(name='button'),
    ]

    extra_css = '''
                    h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
                    h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
                    p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
                    body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
    '''
PK�X̘	�	�	yakima_herald.png�PNG


IHDR  ��	pHYs��~�	_IDAT=�Y��gy�����}�,�8�q/	d��` m��""%%�#�M����U{nh+���Z�
�	D/%��*A)Ť��i<�س�9s�s��}ߧ�U�����F��t2	�E$"�w	D@DD@L@�Y��  *�Q�=�h4��t����m��!�R BQ���%�X�y�Ak�"w�P^�� �YFI"�	Y	^�B�����G�Q�׷޻���!�}��s��ο�o��p���|���5k��Ti:˾�5=��k}����o�+��3�
�����KQ�a�E�#Cl�,F�<��Mw��
�jѹ��Xj�����?>��7�ӿ֘o�����M���O���0�J>6?�L驏gO?�^�j�%�lm4�Y&�$:}�"����bmf�%�~�Yo���8q���V�9�	('Uͬ��zK�؄`N��O<5�޿�1�M��2���V�����7FJ�'��g�Y����m�a�`��1Z
B��6F�|���q��o3�6�&����ޯ��Y$4뵹��͔�^)�br��Zc{R�Bi�8���JŘ�($��Q�M���{��bG녓���d�6��:���r ��І�Q��(D���w��E|�K�j%�3���
w���Ѩ���<���_�����1J
�0��l]Z�z�M4+��'b�U���h�W����.Xo
@�1wH����v����8��4#bVZi���KgV�8rC@�MD`㰿�Η������|�˵���rc,�`�ZD����
�+��`�dn�ںijH��_3����<p��>�ta��.�1�X�?f��< �.߁�ҲC@�t��+�D�P�܄���0�T{���/>���d�����D\�#�úm#Q+��ُ`f��w{��,��$͊jP�J�w��p��K�p��`�K�"�:P����y62��lw �WP�����ԧ�:Xs;סO�rSEZT{��̅ɫ�eR<�`>�<�ֲ��P� .R�+v�ֈ�W
����d�l��y��O�x^;����U�l��o����&��P�?�<�Eb!�w������~,��0I��p�3wo|�9�9ߟo��{r�u���1��������L���|�}�۽�~�"�����&2�
��&�z1�O�?Ӳ�u��=�P�?��	��+�Φ����_����t��?��?��yܜK���?��C��7j�
�<�,���L$���CD��x3L^�f�:�K����$\�+��y�G���Վ�,͝���֖t�DE
�G�W����f����[o��2���G�s�4��Z߄�n����	 ~
�+�f��|�ȵS�����/�=Oʬ�7T\e��$��F�.5e��~�:r6������z�m��Oa̤ڂV�
��5��DȊ�od�k��^�8V\
&�b2���{u��RGs�-���et�,=���
SJ�����P���)ϺF��p�b0�<]�i_�ʋ�y�����K_.-���{UW�z�WU���\���Tn�ꢩ���;b��*�8�ڬ��[�����d�j2"���-/�^��BXy�.�O׏h�J�ww�[���\Y&�q~(8F�8�bI("����!d!����x�tc�h�V���I��J}��v�J�(-u��>���V5�&�,�Z�p0֖�X)Dh}�k���#��n�&��v�\mB��4+���Z۬����['Nk6�g����txs��(*��!�0�e���g?|ٚ�4��Rk�h-)��tV0�$��A� �˶��Ji1�s���~�mw���$8b"�M�u�*J�St�[��;�ڸn��lEY�'��L�c�2��i�{T��j���(���2E%�]�@!Q�ZE�x��W�Q�(�\����A6�6so�3>��"�p�䰓Á��01S)��+D)��fYO�σN�yD�����ҭ�_Z��>�@ H�ŋ�Re�$uj<) y#	L�H���צE�?���A�[Cw����e����.�L�m���S0d�'�'�"F��IB�	����Lְ� `�7r_�BR��ӓN��TT���z��Q^�K۹S��˶Ҩ��㨓񥽽�3�ғ	�6Z�x%���븤�U1��eF%;�z�����P\��x�����_�ƞ����Ż�Տ̮�HZs���|r�ؙa6���￳smW�^X�5�ڗTH����J/md��d+\���_J�ɰ?��TO�8����s�>��
�u惣j+�~#��bKhT
���~?)�E�4�ԇ(HE���{����s���ڼ��u��ˍ�HO�����S�A�!���`�TSIEND�B`�PK�Xh��wyakima_herald.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class YakimaHeraldRepublicRecipe(BasicNewsRecipe):
    title = u'Yakima Herald-Republic'
    description = 'The Yakima Herald-Republic.'
    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': ['searchleft', 'headline_credit']}),
        dict(name='div', attrs={'class': ['photo', 'cauthor', 'photocredit']}),
        dict(name='div', attrs={'id': ['content_body', 'footerleft']})
    ]
    extra_css = '.cauthor {font: monospace 60%;} .photocredit {font: monospace 60%}'

    feeds = [
        (u'Yakima Herald Online', u'http://feeds.feedburner.com/yhronlinenews'),
    ]
PK�X��!..yalansavar.png�PNG


IHDR  D��� PLTE


 !!!+++0#444555777<<<>>>@@@BBBDDDHHHOOOPNMRRRUUUWWWZ:[1[[[\\\eeejjjmmmoooqqqrrrsssyyy}}}�������]����c����V�������O�������������������������������g"����������������������������|$���ϵ�Ѻ�Ӎ����������������,�u�'�Z�0�I�+��)Qʋ�IDATxڕ�UV�E����3���CpM�W��o�sR(�*#A'	�[q�=,��}����\���v�g��=��i����h��X���E-ĺPI�%^s��X&�>\��&�1UC������2�j�S�5�B����:��P�0�Q,�ꆂf0T<if���]*Šn1J�P��0�K@�-iω��'����IY<=��5��H�>�%Y�Y��IEND�B`�PK�XWί#��yalansavar.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import AutomaticNewsRecipe


class BasicUserRecipe1420470565(AutomaticNewsRecipe):
    title = 'Yalansavar'
    language = 'tr'
    __author__ = 'asalet_r'
    oldest_article = 60
    max_articles_per_feed = 20
    auto_cleanup = True

    feeds = [
        ('Yalansavar', 'http://yalansavar.org/feed/'),
    ]
PK�X�Z��yazihane.png�PNG


IHDR  �s�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���̿tIME�4_M���IDATH�ݕL�u�?[�	����pD�_�+.=`h�7��s?Ęc�JA��I���Ǖg^�k;,&?�e���D4�kq��p�M��R��qڍƫ�,���}�מ��~?�G��sx�c
��O��S�����6g��`��wH=�pj�G�~��&�۵�	��g�bJ���Ca�;�>5�E�p��AF�]�1�_������i���ַX��-r���&����3���!.Ty�w^#�XbH@��b�&�0�YI.kH��@�0�"�O�(���*���t����'�GHD�˔aq�岁N�glO�
���jt��Z�N��z^��o�=U��1��a���G�C:N���Ky�&[[�d�0�RQa�vH7���=��y�����.��V�
w������uH�I���&��g�*�u�D����B���d=�/�ڷ�L���j�Ųs�'��y���WJ�<�..�	�dKa9�r�^L[Ⱦ�T�`�hdҠƫQM����I�.�F$�Q��h����/w�F�mw@�R&e~Ő��`"�֒�6����8�0T�: �]x��{���d��&6���N"	1����AWU�;-�l�NbeADBr�R��U7�����=���y�|�XM8Y����gQ�J�����y#�[�WJZ�'=�y�E���e���H��[���	��| ���sͻ��IʙE
=��*_99��(f��B
i���0ϤA�+�x#���"�`��`	�$�!�R���_�R�{�%�`氘�,fٴW�0)�P�C�$��<^e+E�(�	'��	��1����j�8����Kz��~P3�n�]�}��kj����F��^������%!%��ƷX��|���!MIYs��(��	�Rb&�yD�(��s���;�OyS����Q�����G������<�XG/�"kH�i��a3Lw��i0��$�"�Pb#�L�r�qt�V�*5��O۫}fc��k�w������^�|T�O�{��%�/��%tEXtdate:create2022-07-22T07:12:09+00:00���%tEXtdate:modify2022-07-22T07:12:09+00:00g�eWIEND�B`�PK�X�m��yazihane.recipefrom calibre.web.feeds.news import BasicNewsRecipe
import re


class AdvancedUserRecipe1350731826(BasicNewsRecipe):
    title = u'Yazihane'
    oldest_article = 30
    max_articles_per_feed = 100
    __author__ = 'A Erdogan'
    description = 'Sports Blog'
    publisher = 'yazihaneden.com'
    category = 'sports, basketball, nba, cycling, euroleague'
    no_stylesheets = True
    use_embedded_content = False
    masthead_url = 'http://www.yazihaneden.com/wp-content/uploads/Untitled-1.png'
    language = 'tr'

    keep_only_tags = [
        dict(name='div', attrs={'id': re.compile('(^|| )post-($|| )', re.DOTALL)})]
    remove_tags_after = dict(name='div', attrs={'class': 'post-footer clear'})
    feeds = [(u'Yazihane', u'http://www.yazihaneden.com/feed/')]
PK�X�)���yementimes.png�PNG


IHDR  D���PLTE��������������������������������������������������������������������������������������ʽ�ɻ�ȸ����ų������������м�������ͺ�������������������ͷ������õ���µ�����}�ux�vx�uw�tv�jm�fi�dg�ei�cg�_b�X[�QU�MQ�KP�KP�EJ�CH�BG�AG�@D�<B�<B�<A�9?�7<�6<�7=�4:�28�28�17�06�/5�.4P0�\tRNS	

#$(-169>?BFHKKQXZ\]aegilmmqw{|��������������������������������������3�H��IDATx����Bq�ɶmss�m��_#��g���QS�k�P���Q=u[��X%�um�0�����ս�?/wN@��f0�"�^.��k@��3`P��?�(#����2wt?7����U���|�O�պ�2c@�N�_ogD���-DEg�*��jC4ЮV�9�YR�R��n?��,>��}m:��������	nL>�z�X�IEND�B`�PK�XH���

yementimes.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class YemenTimesRecipe(BasicNewsRecipe):
    __license__ = 'GPL v3'
    __author__ = 'kwetal'
    language = 'en_YE'
    country = 'YE'
    version = 1

    title = u'Yemen Times'
    publisher = u'yementimes.com'
    category = u'News, Opinion, Yemen'
    description = u'Award winning weekly from Yemen, promoting press freedom, professional journalism and the defense of human rights.'

    oldest_article = 10
    max_articles_per_feed = 100
    use_embedded_content = False
    encoding = 'utf-8'

    remove_empty_feeds = True
    no_stylesheets = True
    remove_javascript = True
    auto_cleanup = True

    feeds = [
        ('News',
         'http://www.yementimes.com/?tpl=1341'),
    ]

    extra_css = '''
                body {font-family:verdana, arial, helvetica, geneva, sans-serif;}
                div.yemen_byline {font-size: medium; font-weight: bold;}
                div.yemen_date {font-size: small; color: #666666; margin-bottom: 0.6em;}
                .yemen_caption {font-size: x-small; font-style: italic; color: #696969;}
                '''

    conversion_options = {'comments': description, 'tags': category, 'language': 'en',
                          'publisher': publisher, 'linearize_tables': True}
PK�X1��yeni_umit_dergisi.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class YeniUmit(BasicNewsRecipe):
    title = u'Yeni Umit Dergisi'
    __author__ = u'thomass'
    description = 'Aylık Dini İlimler ve Kültür Dergisi'
    oldest_article = 45
    max_articles_per_feed = 100
    no_stylesheets = True
    category = 'dergi, ilim, kültür, edebiyat,Türkçe'
    language = 'tr'
    publication_type = 'magazine'
    encoding = 'ISO 8859-9'
    publisher = 'thomass'

    conversion_options = {
        'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }

    cover_img_url = 'http://www.sizinti.com.tr/images/dergiler/d1.gif'
    masthead_url = 'http://www.sizinti.com.tr/images/dergiler/d1.gif'

    feeds = [
        (u'Yeni Umit', u'http://open.dapper.net/services/yeniumit'),
    ]

    def print_version(self, url):  # there is a problem caused by table format
        return url.replace('http://www.yeniumit.com.tr/konular', 'http://www.yeniumit.com.tr/yazdir')
PK�X�����yenisafak_gazetesi.png�PNG


IHDR  szz��IDATxڭ��$IEsl���ڶm۶m۶m�6>�3���o�|�2��LM��s��**�"K�+�1��E�#&RL�4����@�!��p�&�:|�4�wȈOy�*�1Y���Iz�Kl$��rV�F��u�Y�&�5k�
v�n1P�������`��x���AW7�{z���Ko/z���?��L!��|		t���fG���3I�NjT*��6� D��]�*��A�㎇)ʀ|<�d�R{~�:��-�/&Ӓ�Q��i�gEg(�T*�}�x��D�/D�N=M��z�yR����Tr[��T�[_?	@3�3RGm%��U\�d���3��%md��U���7!�"看�0rᅱ	���b���ͷP��(�yg���%��mB�{���]��Ɂm�Tv������O�m�(u�&b��gυs�8e"�X��dhH�+v�,����]�p@�;�����{�!�z�e���@����~?Z��Q���s5�G��E3��lb7�������zS�p��9z���܃��J����<�O8�P��K�����@$����g�Qڲ�1X��~�^����?��b!
�}�D*���-�����\���4�  ��6-]
���%�4SV�0�mi�s�t�4�E��:������_~U���W���C���?�H�.�M?�*YE���:�(m�G���F�=�PW8�D�p~ז�Y��ϒ5�_��$f��?F��|�
�S[�D�}�}dO����k�4N:9��O�8?�}i�hY�2��L���Y�R� ���*�qx���9s������D,�fi`[3�%-t�9*@��#]u�����oQr�(�q'Ӳ�x�Q�pz�
�H���lc�b㚵�Z�V�/�\�+0�x�L�@�G�yپ�6Em���v�5FcHm*R~6�������
�T#��?%�@g0�x*���\N^�*\����||a4���w������
}<��w߅c�l9���qJ��&z�k�D�%��G6lA���4ܴd)�S�æu�E#���π����3(��Ou6���J$ð��!tC0��oPd���ӽ�D�&
ze����[S�@%w��f0�m�OG�g�.C��#����h�AV`�.1�(r0yP;=n�p�o�C�P2Z���s�V_Pp�IEND�B`�PK�Xu'-��
�
yenisafak_gazetesi.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class Bugun (BasicNewsRecipe):

    title = u'Yenişafak Gazetesi'
    __author__ = u'thomass'
    oldest_article = 2
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'ISO 8859-9'  # 'UTF-8'
    publisher = 'thomass'
    category = 'news, haberler,TR,gazete'
    language = 'tr'
    publication_type = 'newspaper '
    conversion_options = {
        'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }
    cover_img_url = 'http://yenisafak.com.tr/resim/logo.gif'
    masthead_url = 'http://yenisafak.com.tr/resim/logo.gif'

    keep_only_tags = [dict(name='div', attrs={'id': ['ctghaberdetay2010']})]
    # h1{ font-size:10%;font-weight: bold} '#ctl00_ortayer_haberBaslik{
    # 'font-size:10%;font-weight: bold'}
    extra_css = ' h1{font-size:20px;font-weight: bold}h2{font-size: small;font-weight: bold}div{font-size: small}   '

    remove_tags = [dict(name='div', attrs={'id': ['yasaluyari2010', 'divhaberdetayilisik2010']}), dict(
        name='font', attrs={'class': ['haberdetaytarih']})]

    remove_empty_feeds = True

    feeds = [
        (u'SonDakika', u'http://yenisafak.com.tr/rss/?xml=anasayfa'),
        (u'Gündem', u'http://yenisafak.com.tr/rss/?xml=gundem'),
        (u'Politika', u'http://yenisafak.com.tr/rss/?xml=politika'),
        (u'Ekonomi', u'http://yenisafak.com.tr/rss/?xml=ekonomi'),
        (u'Dünya', u'http://yenisafak.com.tr/rss/?xml=dunya'),
        (u'Aktüel', u'http://yenisafak.com.tr/rss/?xml=aktuel'),
        (u'Eğitim', u'http://yenisafak.com.tr/rss/?xml=egitim'),
        (u'Spor', u'http://yenisafak.com.tr/rss/?xml=spor'),
        (u'Yazarlar', u'http://yenisafak.com.tr/rss/?xml=yazarlar'),
        (u'Televizyon', u'http://yenisafak.com.tr/rss/?xml=televizyon'),
        (u'Sağlık', u'http://yenisafak.com.tr/rss/?xml=saglik'),
        (u'Yurt Haberler', u'http://yenisafak.com.tr/rss/?xml=yurthaberler'),
        (u'Bilişim', u'http://yenisafak.com.tr/rss/?xml=bilisim'),
        (u'Diziler', u'http://yenisafak.com.tr/rss/?xml=diziler'),
        (u'Kültür-Sanat', u'http://yenisafak.com.tr/rss/?xml=kultursanat'),
        (u'Röportaj', u'http://yenisafak.com.tr/rss/?xml=roportaj'),
        (u'Sinema', u'http://yenisafak.com.tr/rss/?xml=sinema'),
        (u'Yorum', u'http://yenisafak.com.tr/rss/?xml=yorum'),
        (u' Yeni Şafak Pazar', u'http://yenisafak.com.tr/rss/?xml=pazar'),
        (u'Yeni Şafak Kitap', u'http://yenisafak.com.tr/rss/?xml=kitap'),
        (u'Yeni Şafak English',
         u'http://yenisafak.com.tr/rss/?xml=english'),



    ]
PK�X�6A�^^ynet.png�PNG


IHDR  szz�%IDATxڴ���jFϳm�v�ٶm۶m۶�L3h�׶�{�S�*�;���T�ݙi�/�ހ�%��a�,f��W�r��`X��A�.�y�ʁ!6HQYV��eJiC=o���[a^�E����_��%&��9ʊ��,��p�J��Ï
�L�XT~�<�+,��`�6Y�_
+є��u��,u�6W-��_֣4|c!
m�g�^�
�w]6ʥ�/�+�_w������v�B��G�p��U��sb����k~',��[�߬w�G?�?D3����q6�H��k����
�ߣ�
im���E3�ٔ��K<�z��E3����4a�rE:I�O��Ɣ�j�I{�D��v�Iz��h�~{�C�Q�.��Y|3ڝG�9�1�/���^+F`�MS4�]w��f0�LC9����ZX�Q6.�@4cU��;��S��˴��%��z<3�Tf� ;;��u�u֑ީSť5z���[N��}�hF}�>�P��.\��<	H��#��矢)p��2��DӼ�B1�x
�~�H
jN�����W�f��? C\z�m�l��>B-)x��dB3J�ef�M�����V��ر�2�X���K<B>å����SNH$�_��%��f�K/um�k�[�w�$!���P��VqiO�$UM���#�(��ޮDУt�Atk�5���,�yh,��1���V�?�0D�1R�W�7
[;�n�*#��[Y�w_���H��{!l����Og��_��_Mqサ^������t%q��W����2}�I-�T��/�}�<,A_��񆛴K����˸�~�0�bD�}Ui�1�Q���W�!�ˇ.S
Ѵƌk���.`�[���F	V�A��GC�\xZ��Iq��ňP܁�~���B�΁�Iv,Qb��}���G�l�ih��T6�ٿ�vM�K�T�3�2�:�Wx��f�<��x�_"}�$�~A�?�k�8����	�)�~yx���	�,��_����[�+�[�5m�.
�%a���J���>:�
b�WIEND�B`�PK�X��`AAynet.recipeimport re

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1283848012(BasicNewsRecipe):
    description = 'This is a recipe of Ynet.co.il.'
    cover_url = 'http://www.ynet.co.il/images/CENTRAL_logo.gif'
    title = u'Ynet'
    __author__ = 'marbs & barakplasma'
    language = 'he'
    extra_css = 'img {max-width:100%;direction: rtl;} #article{direction: rtl;} div{direction: rtl;} title{direction: rtl; } article_description{direction: rtl; } a.article{direction: rtl; } calibre_feed_description{direction: rtl; } body{direction: ltr;}'  # noqa
    remove_attributes = ['width']
    simultaneous_downloads = 5
    keep_only_tags = [
        dict(name='h1', attrs={'class': 'mainTitle'}),
        dict(name='h2', attrs={'class': 'subTitle'}),
        dict(name='div', attrs={'class': 'text_editor_paragraph rtl'}),
        dict(name='div', attrs={'class': 'ArticleBodyComponent'}),
    ]
    remove_javascript = True
    timefmt = '[%a, %d %b, %Y]'
    oldest_article = 1
    remove_tags = [dict(name='p', attrs={'text': ['&nbsp;']})]
    max_articles_per_feed = 100
    preprocess_regexps = [
        (re.compile(r'<p>&nbsp;</p>', re.DOTALL | re.IGNORECASE), lambda match: '')
    ]

    def preprocess_html(self, soup):
        soup.html['dir'] = 'rtl'
        soup.body['dir'] = 'rtl'
        return soup

    feeds = [
        (u'כל ערוץ החדשות', u'http://www.ynet.co.il/Integration/StoryRss2.xml'),
        (u'מבזקי החדשות', u'http://www.ynet.co.il/Integration/StoryRss1854.xml'),
        (u'בלוגוס', u'http://www.ynet.co.il/Integration/StoryRss3764.xml'),
        (u'כל ערוץ הדעות', u'http://www.ynet.co.il/Integration/StoryRss194.xml'),
        (u'יומני סבר', u'http://www.ynet.co.il/Integration/StoryRss3487.xml'),
        (u'כל ערוץ הצרכנות', u'http://www.ynet.co.il/Integration/StoryRss5363.xml'),
        (u'כל ערוץ הספורט', u'http://www.ynet.co.il/Integration/StoryRss3.xml'),
        (u'כדורגל ישראלי', u'http://www.ynet.co.il/Integration/StoryRss57.xml'),
        (u'כל ערוץ התרבות', u'http://www.ynet.co.il/Integration/StoryRss538.xml'),
        (u'בלוג הפרעות', u'http://www.ynet.co.il/Integration/StoryRss4450.xml'),
        (u'חיים בסרט', u'http://www.ynet.co.il/Integration/StoryRss3908.xml'),
        (u'כל ערוץ מעורבות', u'http://www.ynet.co.il/Integration/StoryRss3262.xml'),
        (u'בית', u'http://www.ynet.co.il/Integration/StoryRss4113.xml'),
        (u'זוגיות', u'http://www.ynet.co.il/Integration/StoryRss4107.xml'),
        (u'מלחשים', u'http://www.ynet.co.il/Integration/StoryRss4105.xml'),
        (u'סטייל', u'http://www.ynet.co.il/Integration/StoryRss4104.xml'),
        (u'קריירה', u'http://www.ynet.co.il/Integration/StoryRss4111.xml'),
        (u'שף', u'http://www.ynet.co.il/Integration/StoryRss4335.xml'),
        (u'כל ערוץ הבריאות', u'http://www.ynet.co.il/Integration/StoryRss1208.xml'),
        (u'כל הערוץ הירוק', u'http://www.ynet.co.il/Integration/StoryRss4872.xml'),
        (u'סביבה', u'http://www.ynet.co.il/Integration/StoryRss4879.xml'),
        (u'בעלי חיים', u'http://www.ynet.co.il/Integration/StoryRss4880.xml'),
        (u'שאלות חיות', u'http://www.ynet.co.il/Integration/StoryRss4926.xml'),
        (u'כל ערוץ המחשבים', u'http://www.ynet.co.il/Integration/StoryRss544.xml'),
        (u'סקירות', u'http://www.ynet.co.il/Integration/StoryRss2424.xml'),
        (u'אינטרנט', u'http://www.ynet.co.il/Integration/StoryRss546.xml'),
        (u'משחקים', u'http://www.ynet.co.il/Integration/StoryRss571.xml'),
        (u'PC מגזין', u'http://www.ynet.co.il/Integration/StoryRss1694.xml'),
        (u'טכנולוגיה', u'http://www.ynet.co.il/Integration/StoryRss545.xml'),
        (u'קטעי קישור', u'http://www.ynet.co.il/Integration/StoryRss4540.xml'),
        (u'מרושתים', u'http://www.ynet.co.il/Integration/StoryRss4541.xml'),
        (u'מדריכים ותוכנה', u'http://www.ynet.co.il/Integration/StoryRss786.xml'),
        (u'כל ערוץ הרכב', u'http://www.ynet.co.il/Integration/StoryRss550.xml'),
        (u'כל ערוץ התיירות', u'http://www.ynet.co.il/Integration/StoryRss598.xml'),
        (u'כל ערוץ ההורים', u'http://www.ynet.co.il/Integration/StoryRss3052.xml'),
        (u'כל ערוץ האוכל', u'http://www.ynet.co.il/Integration/StoryRss975.xml'),
        (u'כל ערוץ היהדות', u'http://www.ynet.co.il/Integration/StoryRss4403.xml'),
        (u'במנהרת הזמן', u'http://www.ynet.co.il/Integration/StoryRss4542.xml'),
        (u'כל ערוץ הכלכלה', u'http://www.ynet.co.il/Integration/StoryRss6.xml'),
        (u'כל ערוץ מדע וטבע', u'http://www.ynet.co.il/Integration/StoryRss2142.xml'),
        (u'כל ערוץ יחסים', u'http://www.ynet.co.il/Integration/StoryRss3925.xml'),
        (u'News', u'https://www.ynet.co.il/3rdparty/mobile/rss/ynetnews/3082/'),
        (u'News updates', u'https://www.ynet.co.il/3rdparty/mobile/rss/ynetnews/3089/'),
        (u'Opinion', u'https://www.ynet.co.il/3rdparty/mobile/rss/ynetnews/3084/'),
        (u'Culture', u'https://www.ynet.co.il/3rdparty/mobile/rss/ynetnews/3086/'),
        (u'Jewish', u'https://www.ynet.co.il/3rdparty/mobile/rss/ynetnews/3443/')
    ]
PK�Xn�����yomiuri.png�PNG


IHDR  �Tg�PLTE��������������ޝ��IDATx^��!n�@D�ߣ��2�.i��|�y7��_%��8������0��j�
��_���br�v�0��N�Wb;��	ݣ'am��10���3o��i�����c�������:�pp����$^6��BHbA$m��W;�"���dQIEND�B`�PK�X����yomiuri.recipe__license__ = 'GPL v3'
__copyright__ = '2010,2014, Hiroshi Miura <miurahr@linux.com>'
'''
www.yomiuri.co.jp
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re


class YOLNews(BasicNewsRecipe):
    title = u'Yomiuri Online (Latest)'
    __author__ = 'Hiroshi Miura'
    oldest_article = 1
    max_articles_per_feed = 50
    description = 'Japanese traditional newspaper Yomiuri Online News'
    publisher = 'Yomiuri Online News'
    category = 'news, japan'
    language = 'ja'
    encoding = 'UTF-8'
    index = 'http://www.yomiuri.co.jp/latestnews/'
    remove_javascript = True
    masthead_title = u'YOMIURI ONLINE'

    keep_only_tags = [{'class': "article text-resizeable"}]

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if re.search(r'rssad.jp', curarticle.url):
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []
        return feeds

    def parse_index(self):
        feeds = []
        newsarticles = []
        soup = self.index_to_soup(self.index)
        listlatest = soup.find(
            'ul', attrs={'class': 'list-common list-common-latest'})
        if listlatest:
            for itt in listlatest.findAll('li'):
                itema = itt.find('a', href=True)
                if itema:
                    item_headline = itema.find(
                        'span', attrs={'class': 'headline'})
                    item_date = item_headline.find(
                        'span', attrs={'class': 'update'})
                    newsarticles.append({
                        'title': item_headline.contents[0], 'date': item_date, 'url': itema['href'], 'description': ''
                    })
        feeds.append(('latest', newsarticles))
        return feeds
PK�Xue� 

yomiuri_world.png�PNG


IHDR  ���IDATx��VW[[͟��o�g��]��‚�� TRwW<�(N�6MIqMp��D�qO��vH����Ι�G��Kڻ���>����}��?�B��0��a�˷y��OD�L��}�q�_��LO�^�7�O�ܿ�y(�E^L\��g]-����5���;�Z�i�mu��ꏮ��9=�q��%�{1>jZ�B2699�IP泶}��g)�{i�l*��` 8�`ƭ�'9�S0 �%
�GDj�t���i�0�l�VI� ��fX�/����`0��\=�u�<?-�J)�{�|����;7���-%�HOG/q�rN�R�U�tv�o��_L���a⑈�NŰP�˭�
k�����
��xI���^�s�@$;ffyn|�x��ۉ{2�s�
��po��ܶ��j^g�gT��–�q��0n�x�A���@���i19��R�u�%�3	걻�U�Z����N����7kzAa������g�ۆ�����������6��J�3l᪄ׄ���	�?�� �'V ԏ�����F�r1�4�����,��Xz�Y�$���z������%BA����W2���FY��Z�A�3;r��Q�J-��E����򞂬��q���_�G��#>�(���as�Ec�f�K��n�����������e���
>,2���q
���&�|�X����V'��vH���x �UGϤ�Sn����#	�Q�g"�]cJ�Ja��,L���yP�Uh!&`�;eS�	x�>�L��X��#RؠǢ�_��Y�m���:Q_���A\�]wi��s;�bfR�������i�O�˹�\���q���K���hT楘�;����AQ�Z#3u+�Z��E�k�rڷm}�b�-�@:�֏[�vO�ꟁn�W �%�\'��Z�Nc1�}�<�0(%�T�u�e�[�����qX�cjC�` /��pDƶ�ST��s1yn��Bu��TƑ�ўi��(�B�ߔ"�躌�=��gJ)\��{���Uw;F�z�
�Q���S�i|�O���N�.���J���'y�5��������a
�L��2!�Wr۠�YD\$_�	B��mu������!�,e�2�4@x�2�"R�b:Vrگ�Ut˭&��M��:����A�N���A��t�~Q'/���z3��~���\��RDY�WC�z輒�ͨv_�4�?W��#3֐.��0*�De�b��!�5��W���Ox�Z�����Hܖ���
:`�"K6���Cv|c����Ӯ����AO�pB�d�I��Ra��ù��ۈɏ�?�L��Ҧ�3�rO�ȁ���Tx��K=ɭ+v7�+���P#.}���$RS؅t�q��Czh�7(���dB�(O���������u���YJ|��P�̕C��Oo�ݻ��m�>���'ء�Q���N�D���5L0�w_��(8�@c<��u�|f��IEND�B`�PK�X�s9yomiuri_world.recipe__license__ = 'GPL v3'
__copyright__ = '2010,2014, Hiroshi Miura <miurahr@linux.com>'
'''
www.yomiuri.co.jp
'''

from calibre.web.feeds.news import BasicNewsRecipe
import re


class YOLNews(BasicNewsRecipe):
    title = u'Yomiuri Online (World)'
    __author__ = 'Hiroshi Miura'
    oldest_article = 2
    max_articles_per_feed = 50
    description = 'Japanese traditional newspaper Yomiuri Online News/world news'
    publisher = 'Yomiuri Online News'
    category = 'news, japan'
    language = 'ja'
    encoding = 'UTF-8'
    index = 'http://www.yomiuri.co.jp/world/'
    remove_javascript = True
    masthead_title = u"YOMIURI ONLINE"

    keep_only_tags = [{'class': "article text-resizeable"}]

    def parse_feeds(self):
        feeds = BasicNewsRecipe.parse_feeds(self)
        for curfeed in feeds:
            delList = []
            for a, curarticle in enumerate(curfeed.articles):
                if re.search(r'rssad.jp', curarticle.url):
                    delList.append(curarticle)
            if len(delList) > 0:
                for d in delList:
                    index = curfeed.articles.index(d)
                    curfeed.articles[index:index + 1] = []
        return feeds

    def parse_index(self):
        feeds = []
        newsarticles = []
        soup = self.index_to_soup(self.index)
        mainspan = soup.find('div', attrs={'class': 'pbNested span-main-inr'})
        if mainspan:
            topstories = mainspan.find('ul', attrs={'class': 'list-top'})
            if topstories:
                for itt in topstories.findAll('li'):
                    itema = itt.find('a', href=True)
                    if itema:
                        item_headline = itema.find(
                            'span', attrs={'class': 'headline'})
                        item_date = item_headline.find(
                            'span', attrs={'class': 'update'})
                        newsarticles.append({
                            'title': item_headline.contents[0], 'date': item_date, 'url': itema['href'], 'description': ''
                        })
            secondstories = mainspan.find('ul', attrs={'class': 'list-common'})
            if secondstories:
                for itt in secondstories.findAll('li'):
                    itema = itt.find('a', href=True)
                    if itema:
                        item_headline = itema.find(
                            'span', attrs={'class': 'headline'})
                        item_date = item_headline.find(
                            'span', attrs={'class': 'update'})
                        newsarticles.append({
                            'title': item_headline.contents[0], 'date': item_date, 'url': itema['href'], 'description': ''
                        })
        feeds.append(('World', newsarticles))
        return feeds
PK�X�5��eezackzack.png�PNG


IHDR  szz�,IDATxڥWp�K�1�}7s>x��̌镙��ef�&)���u��)�ʦ�ާy�{<?�f4k/�[��կ�!��'���f���nW@X�y����9]�k B����bŊ�7n��=z�x��-��cǎ�
����b?fc�p8����3�<y�(h�>��W^yE�'''��^�*�M_��:�L	b�0���…�<{��[�n�}��1�E������@�6�þ�I�f֢�R�
-S�����B�N�S���om��v���n��f�R~���:2��Ѐ�?1��/^�Ȁ��rq͚5]cǎ�̙3Gȴ}���7�ܮ]�G��p˒BT�Ҙ �KMM��3F6[��?�ɐH�o���Z�7of@3�r�J�u0�D^���A�r�kY����� � I����h����!��g�2Ns
�Ma��h+b#����,Y�.]�D˗/24p�@}��M��2$�g�G5�N5j��ܹst��mnڴi�Xź�0�<�����WHdgg��JHH QڬY�ۘ7
�lp��uƘf &&F?��@�իW��5}���r�L�_���2t�H�2�W�^�O�2�#"-�ٜ�t��K�.�lp��aZ�*���h��xb��{�������K�������Ī��$��ߩS�����B���0���3|C�%��˂i�gРnJ��Q�Z�nOO�<%�O�H��|*))a��E�$%�,�p�ݑ��$�@�v���4v�,�t���\��eŅ'�+�
������S�O߾TPP(��4���C��I�&
�&�_@>����8�o���Oh��)4/J��v��6N;���)�i���>E|�mv&)�:c1���;$�rq��HT�@�ܽX>0��hѢ�]q�.��z	�A�O���+�t݆�)�������j\WQ�ʊZ7V�rE��/؈��9縢���t�_�8���۷$!���5���M��D�a�@�g��Q���=���zM�VTeON*Z2I��xEw�(��H);'%&h�F6_:�<GEE�x���Ao�N�l�S�N�m߾��mۦ�h,���b�Ԛ8~�X�\�;�"|A1�U�B[����3����z���~G1������ϗ���s�F�UX���H��ȑzʔɺY�N�<]ѭ�6������_��NQ�y�"�?��25�y�8I䍐�
�Z�!�)oF����(`���X��iҤI:��:x�4��{�*rAi�l1�℉ �t�4\���ʹn���bcc�̈́��P�zNc���k1�i�߿��V�߹}�+�lF�b��e�fuwk�(�?��E�g(]tF�1!B+V����9uꔘ{�ׅ`�yR'����x�k׮��;�h�ޠ��6~r���P�i;�MOV4j��|�"
g���Ѿy��i��lUR���Y%L�Dd%_VV��Ӈ���
�L�Aep�g��l�ή�k����kĀ�MKK�{���9P�����1�_�V��(//ϟ�oܸ!ًnݺElǡ��:t�8կ��_��t�y�7���NUk6�#G {!��UA�Dc�=����e�~����’����5�9��х�%���|�/Y���h�ĉ4x�`���z�^.�`$�\��Ky��Z�d,l�[�v-�$��_8l�g͚Il�Moܸ��&��"""21���k_3�6�\�r��ݡC��\�r��*o&�mo�3d1 'di���H�|��Qs[���uq<��1��� ���N?ރ�C�HXǙR�R@)FP$z�h��3%�(BR�ݻ�/j�OҿI8X�?��-b���('1�Z*4��s�N�bN��	�#>B2������ף﯐�W����cQ��?``,�K1���dI�bZ�����0f\%�4��d���h�,����Φ�G��s-�(�x���$&�%��
(�K�n��r�'�jۤ���ɑ��k����T�y<�Д����A�y�ہ߿/��<
XIFB`�����E8�((d�A��C�P�/j8`H�k��	X��6d>�4���>b9m���X�XL}�?�n_ IEND�B`�PK�X\�ފ��zackzack.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>

from __future__ import absolute_import, division, print_function, unicode_literals

from calibre.web.feeds.news import BasicNewsRecipe


class Zackzack_at_review(BasicNewsRecipe):
    title = 'ZackZack.at'
    oldest_article = 7
    max_articles_per_feed = 20
    use_embedded_content = False
    __author__ = 'Dirk Gomez'
    language = 'de_AT'

    no_stylesheets = True

    keep_only_tags = [
        dict(name='div', attrs={'class': 'tdb_title'}),
        dict(name='div', attrs={'class': 'tdb_single_author'}),
        dict(name='div', attrs={'class': 'tdb_single_date'}),
        dict(name='div', attrs={'class': 'tdb_single_content'}),
    ]

    remove_tags = [
        dict(name='figure', attrs={'class': 'wp-block-image'}),
    ]

    feeds = [(u'Zack Zack',
              u'https://zackzack.at/feed/')]
PK�X��<��zadolba_li.png�PNG


IHDR%=m"PLTE���GC�n9IDATc��\������{��@����Y0�y�<s��cf��S�1g�b��<��g
��a�kIEND�B`�PK�X�9d��zadolba_li.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1467722946(BasicNewsRecipe):
    title = '\u0417\u0430\u0434\u043e\u043b\u0431\u0430!\u043b\u0438'
    __author__ = 'bugmen00t'
    description = '\u0412\u0441\u0451 \u043D\u0430\u0447\u0430\u043B\u043E\u0441\u044C \u0432 2009 \u0433\u043E\u0434\u0443 \u0441 \u0438\u0441\u0442\u043E\u0440\u0438\u0439 \u043E \u043A\u043B\u0438\u0435\u043D\u0442\u0430\u0445 \u0438 \u043F\u043E\u043A\u0443\u043F\u0430\u0442\u0435\u043B\u044F\u0445. \u041E\u043A\u0430\u0437\u0430\u043B\u043E\u0441\u044C, \u043D\u0435 \u0432\u0441\u0451 \u043B\u0430\u0434\u043D\u043E \u0438 \u0432 \u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430\u0445, \u0438 \u0432 \u0433\u043E\u0441\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430\u0445, \u0434\u0430 \u0438 \u0441\u043E\u0441\u0435\u0434\u0438 \u043D\u0435 \u0441\u0430\u0445\u0430\u0440. \u00AB\u0417\u0430\u0434\u043E\u043B\u0431\u0430!\u043B\u0438\u00BB \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0433\u043B\u0430\u0437\u0430 \u043D\u0430 \u043D\u0435\u0433\u043B\u0430\u0441\u043D\u044B\u0435 \u043D\u043E\u0440\u043C\u044B \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u044F, \u043F\u0440\u0438\u0432\u0438\u0432\u0430\u0435\u0442 \u0432\u0437\u0430\u0438\u043C\u043D\u0443\u044E \u0442\u0435\u0440\u043F\u0438\u043C\u043E\u0441\u0442\u044C \u0438 \u0434\u0430\u0440\u0438\u0442 \u0445\u043E\u0440\u043E\u0448\u0435\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u0438\u0435 \u043B\u044E\u0434\u044F\u043C \u0441 \u043E\u0431\u0435\u0438\u0445 \u0441\u0442\u043E\u0440\u043E\u043D \u043F\u0440\u0438\u043B\u0430\u0432\u043A\u0430. \u041C\u044B \u043D\u0435 \u043F\u0440\u0435\u0442\u0435\u043D\u0434\u0443\u0435\u043C \u043D\u0430 \u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u043B\u0430\u0432\u043D\u043E\u0439 \u0436\u0430\u043B\u043E\u0431\u043D\u043E\u0439 \u043A\u043D\u0438\u0433\u0438 \u0420\u0443\u043D\u0435\u0442\u0430, \u043D\u043E \u043F\u043E\u0443\u0447\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0438\u0441\u0442\u043E\u0440\u0438\u0439 \u0443 \u043D\u0430\u0441 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E.'  # noqa
    publisher = 'Chattyfish Ltd.'
    category = 'news, humor'
    cover_url = u'http://zadolba.li/assets/slowpoke/logo.png'
    language = 'ru'
    no_stylesheets = True
    remove_javascript = True
    auto_cleanup = False

    oldest_article = 200
    max_articles_per_feed = 100

    feeds = [
        ('\u0417\u0430\u0434\u043e\u043b\u0431\u0430!\u043b\u0438',
         'http://zadolba.li/rss'),
    ]

    remove_tags_before = dict(name='div', attrs={'class': 'story'})
    remove_tags_after = dict(name='div', attrs={'class': 'text'})
    remove_tags = [dict(name='div', attrs={'class': 'tags'})]
PK�XT
7���	zaman.png�PNG


IHDR���6�PLTE���+L�,M�,K�-N�*K�(K� C�A�*J�>�*L�&H�,C����;�\l�AU�>S������H\��5L�mz�s~�Xg���������$G�|��co�0M����<����)G����'J�8N�,L�������1Q�IW����-J� >���������7�ft����/P�1N���1I�Tb�.�l�1��IDATx�-�r!�a��s]������U���$�S �["@���p~|�u��G��R�X�Sr�H6}�\`�WS4��7�"��-e��@�����G�L04�a]ośl>���І����S�j��TϾ�b�����f(�ժ�?%-wW��c��/S����T�?h�i�@a�IEND�B`�PK�X*0gI�
�
zaman.recipe# -*- coding: utf-8 -*-

from calibre.web.feeds.news import BasicNewsRecipe


class Zaman (BasicNewsRecipe):

    title = u'ZAMAN Gazetesi'
    description = ' Zaman Gazetesi''nin internet sitesinden günlük haberler'
    __author__ = u'thomass'
    oldest_article = 2
    max_articles_per_feed = 50
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf-8'
    publisher = 'Feza Gazetecilik'
    category = 'news, haberler,TR,gazete'
    language = 'tr'
    publication_type = 'newspaper '
    extra_css = 'h1{text-transform: capitalize; font-weight: bold; font-size: 22px;color:#0000FF} p{text-align:justify} '
    conversion_options = {
        'tags': category, 'language': language, 'publisher': publisher, 'linearize_tables': True
    }
    cover_img_url = 'https://fbcdn-profile-a.akamaihd.net/hprofile-ak-snc4/188140_81722291869_2111820_n.jpg'
    masthead_url = 'http://medya.zaman.com.tr/extentions/zaman.com.tr/img/section/logo-section.png'
    ignore_duplicate_articles = {'title', 'url'}
    auto_cleanup = False
    remove_empty_feeds = True

    # keep_only_tags      = [dict(name='div', attrs={'id':[
    # 'contentposition19']})]#,dict(name='div', attrs={'id':[
    # 'xxx']}),dict(name='div', attrs={'id':[ 'xxx']}),dict(name='div',
    # attrs={'id':[ 'xxx']}),dict(name='div', attrs={'id':[
    # 'xxx']}),dict(name='div', attrs={'id':[ 'xxx']}),dict(name='div',
    # attrs={'id':[ 'xxx']}),dict(name='div', attrs={'id':[
    # 'news-detail-content']}), dict(name='td',
    # attrs={'class':['columnist-detail','columnist_head']}),  ]
    remove_tags = [dict(name='img', attrs={'src': ['http://cmsmedya.zaman.com.tr/images/logo/logo.bmp']}), dict(name='hr', attrs={'class': ['interactive-hr']})]

    remove_empty_feeds = True

    feeds = [
        (u'Manşet', u'http://www.zaman.com.tr/manset.rss'),
        (u'Yazarlar', u'http://www.zaman.com.tr/yazarlar.rss'),
        (u'Politika', u'http://www.zaman.com.tr/politika.rss'),
        (u'Ekonomi', u'http://www.zaman.com.tr/ekonomi.rss'),
        (u'Dış Haberler', u'http://www.zaman.com.tr/dishaberler.rss'),
        (u'Son Dakika', u'http://www.zaman.com.tr/sondakika.rss'),
        (u'Gündem', u'http://www.zaman.com.tr/gundem.rss'),
        (u'Yorumlar', u'http://www.zaman.com.tr/yorumlar.rss'),
        (u'Röportaj', u'http://www.zaman.com.tr/roportaj.rss'),
        (u'Dizi Yazı', u'http://www.zaman.com.tr/dizi.rss'),
        (u'Bilişim', u'http://www.zaman.com.tr/bilisim.rss'),
        (u'Otomotiv', u'http://www.zaman.com.tr/otomobil.rss'),
        (u'Spor', u'http://www.zaman.com.tr/spor.rss'),
        (u'Kürsü', u'http://www.zaman.com.tr/kursu.rss'),
        (u'Eğitim', u'http://www.zaman.com.tr/egitim.rss'),
        (u'Kültür Sanat', u'http://www.zaman.com.tr/kultursanat.rss'),
        (u'Televizyon', u'http://www.zaman.com.tr/televizyon.rss'),
        (u'Aile', u'http://www.zaman.com.tr/aile.rss'),
        (u'Cuma Eki', u'http://www.zaman.com.tr/cuma.rss'),
        (u'Cumaertesi Eki', u'http://www.zaman.com.tr/cumaertesi.rss'),
        (u'Pazar Eki', u'http://www.zaman.com.tr/pazar.rss'),
        (u'En çok Okunanlar', u'http://www.zaman.com.tr/max_all.rss'),
        (u'Anasayfa', u'http://www.zaman.com.tr/anasayfa.rss'),

    ]

    def print_version(self, url):
        return url.replace('http://www.zaman.com.tr/newsDetail_getNewsById.action?newsId=', 'http://www.zaman.com.tr/newsDetail_openPrintPage.action?newsId=')
PK�X�-�!::
zaobao.png�PNG


IHDR  D����PLTE��4��4�-T�8��4��4��4�;�4����4�;�4����4�ߥ3�;��4��4�;�4����Nk��4�5��4��4�;����4����;���Km��'F����j��>�:V�i~�x����������������G�5�
<�%E�J����|��&R�)Hڗ��.L郕ꆗ���덝���쐠쓣�j��������b�����=���� @��P����(T�:W�q����t��c���ۙ��6S�L���E`�F`�Ke�Sk�Tlᬽ�Un�Vn�Wo⯿2��q���q����u���߷5^��Cj�)R�Ek�Ru�Vx�Xz�\}앤���효靈��������������������������g��������������������������F��8Պ������9�
<��I�"A���*tRNS

$$&&22ZZZ��������������������������'�IDATx�e��31�m��\���g۶m۶m��*i�n��,@�w�©r9�9����!����S$*E��1�#f�� �����Lv��"d��~iB`7�<>�..$�t��'/�(,;�7��lr�bk���=O�>��UD<���)��嵴�
fv�o"�w&`�י��6��>�N^�y#8(7�"~�Lw=C�I���{�����("��^���l�C�������bǣ�G���
���Z�q����(W����#'G���B��ޖ�c�a�%98|��;\tth�H���[��^[*�����V��k�^�i��C��r�D���_k�� �Z��P�`)�.��W�`���|�[|)��Ц�*.G\%Q
t����W����&�l���s&E5���]P�P�2�q&`�^:�?�.��!�KBp����j,|IEND�B`�PK�Xk�a@pp
zaobao.recipe#!/usr/bin/env python

__license__ = 'GPL v3'
__copyright__ = '2009, Pu Bo <pubo at pubolab.com>'
'''
zaobao.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.web.feeds import feeds_from_index


class ZAOBAO(BasicNewsRecipe):
    title = u'\u8054\u5408\u65e9\u62a5\u7f51 zaobao.com'
    __author__ = 'Pu Bo'
    description = 'News from zaobao.com'
    no_stylesheets = True
    recursions = 1
    language = 'zh'
    encoding = 'gbk'
    masthead_url = 'http://www.zaobao.com/ssi/images1/zblogo_original.gif'
#    multithreaded_fetch = True

    keep_only_tags = [
        dict(name='td', attrs={'class': 'text'}),
        dict(name='span', attrs={'class': 'page'}),
        dict(name='div', attrs={'id': 'content'})
    ]

    remove_tags = [
        dict(name='table', attrs={'cellspacing': '9'}),
        dict(name='fieldset'),
        dict(name='div', attrs={'width': '30%'}),
    ]

    extra_css      = '\n\
            @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)}\n\
            body{font-family: serif1, serif}\n\
            .article_description{font-family: serif1, serif}\n\
            p{font-family: serif1, serif}\n\
            h1 {font-weight: bold; font-size: large;}\n\
            h2 {font-size: large;}\n\
            .title {font-size: large;}\n\
            .article {font-size:medium}\n\
            .navbar {font-size: small}\n\
            .feed{font-size: medium}\n\
            .small{font-size: small;padding-right: 8pt}\n\
            .text{padding-right: 8pt}\n\
            p{text-indent: 0cm}\n\
            div#content{padding-right: 10pt}'

    INDEXES = [
        (u'\u65b0\u95fb\u56fe\u7247',
         u'http://www.zaobao.com/photoweb/photoweb_idx.shtml')
    ]
    MAX_ITEMS_IN_INDEX = 10

    DESC_SENSE = u'\u8054\u5408\u65e9\u62a5\u7f51'

    feeds = [
        (u'\u5373\u65f6\u62a5\u9053', u'http://realtime.zaobao.com/news.xml'),
        (u'\u4e2d\u56fd\u65b0\u95fb',
         u'http://www.zaobao.com/zg/zg.xml'),
        (u'\u56fd\u9645\u65b0\u95fb',
         u'http://www.zaobao.com/gj/gj.xml'),
        (u'\u4e16\u754c\u62a5\u520a\u6587\u8403',
         u'http://www.zaobao.com/wencui/wencui.xml'),
        (u'\u4e1c\u5357\u4e9a\u65b0\u95fb',
         u'http://www.zaobao.com/yx/yx.xml'),
        (u'\u65b0\u52a0\u5761\u65b0\u95fb',
         u'http://www.zaobao.com/sp/sp.xml'),
        (u'\u4eca\u65e5\u89c2\u70b9',
         u'http://www.zaobao.com/yl/yl.xml'),
        (u'\u4e2d\u56fd\u8d22\u7ecf',
         u'http://www.zaobao.com/cz/cz.xml'),
        (u'\u72ee\u57ce\u8d22\u7ecf',
         u'http://www.zaobao.com/cs/cs.xml'),
        (u'\u5168\u7403\u8d22\u7ecf',
         u'http://www.zaobao.com/cg/cg.xml'),
        (u'\u65e9\u62a5\u4f53\u80b2',
         u'http://www.zaobao.com/ty/ty.xml'),
        (u'\u65e9\u62a5\u526f\u520a',
         u'http://www.zaobao.com/fk/fk.xml'),
    ]

    def preprocess_html(self, soup):
        for tag in soup.findAll(name='a', href=True):
            tag_url = tag['href']
            if tag_url.find('http://') != -1 and tag_url.find('zaobao.com') == -1:
                del tag['href']
        return soup

    def postprocess_html(self, soup, first):
        for tag in soup.findAll(name=['table', 'tr', 'td']):
            tag.name = 'div'
        return soup

    def parse_feeds(self):
        self.log(_('ZAOBAO overrode parse_feeds()'))
        parsed_feeds = BasicNewsRecipe.parse_feeds(self)

        for id, obj in enumerate(self.INDEXES):
            title, url = obj
            articles = []
            soup = self.index_to_soup(url)

            for i, item in enumerate(soup.findAll('li')):
                if i >= self.MAX_ITEMS_IN_INDEX:
                    break
                a = item.find('a', href=True)
                if a is not None:
                    a_url = a['href']
                    a_title = self.tag_to_string(a)
                    date = ''
                    description = ''
                    self.log(_('adding %s at %s') % (a_title, a_url))
                    articles.append({
                                    'title': a_title,
                                    'date': date,
                                    'url': a_url,
                                    'description': description
                                    })

            pfeeds = feeds_from_index([(title, articles)], oldest_article=self.oldest_article,
                                      max_articles_per_feed=self.max_articles_per_feed)

            self.log(_('adding %s to feed') % (title))
            for feed in pfeeds:
                self.log(_('adding feed: %s') % (feed.title))
                feed.description = self.DESC_SENSE
                parsed_feeds.append(feed)
                for a, article in enumerate(feed):
                    self.log(_('added article %s from %s') %
                             (article.title, article.url))
                self.log(_('added feed %s') % (feed.title))

        for i, feed in enumerate(parsed_feeds):
            # workaround a strange problem: Sometimes the xml encoding is not
            # applied correctly by parse()
            weird_encoding_detected = False
            if not isinstance(feed.description, type(u'')) and self.encoding and feed.description:
                self.log(
                    _('Feed %s is not encoded correctly, manually replace it') % (feed.title))
                feed.description = feed.description.decode(
                    self.encoding, 'replace')
            elif feed.description.find(self.DESC_SENSE) == -1 and self.encoding and feed.description:
                self.log(
                    _('Feed %s is weirdly encoded, manually redo all') % (feed.title))
                feed.description = feed.description.encode(
                    'cp1252', 'replace').decode(self.encoding, 'replace')
                weird_encoding_detected = True

            for a, article in enumerate(feed):
                if not isinstance(article.title, type(u'')) and self.encoding:
                    article.title = article.title.decode(
                        self.encoding, 'replace')
                if not isinstance(article.summary, type(u'')) and self.encoding and article.summary:
                    article.summary = article.summary.decode(
                        self.encoding, 'replace')
                    article.text_summary = article.summary
                if not isinstance(article.text_summary, type(u'')) and self.encoding and article.text_summary:
                    article.text_summary = article.text_summary.decode(
                        self.encoding, 'replace')
                    article.summary = article.text_summary
                if weird_encoding_detected:
                    if article.title:
                        article.title = article.title.encode(
                            'cp1252', 'replace').decode(self.encoding, 'replace')
                    if article.summary:
                        article.summary = article.summary.encode(
                            'cp1252', 'replace').decode(self.encoding, 'replace')
                    if article.text_summary:
                        article.text_summary = article.text_summary.encode(
                            'cp1252', 'replace').decode(self.encoding, 'replace')

                if article.title == "Untitled article":
                    self.log(_('Removing empty article %s from %s') %
                             (article.title, article.url))
                    # remove the article
                    feed.articles[a:a + 1] = []
        return parsed_feeds

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)
        br.addheaders.append(('Pragma', 'no-cache'))
        return br
PK�X�Z���zaufana_trzecia_strona.png�PNG


IHDR�a�IDATx��A��u��ԥ��RXt�P �BDЀ����z;�Y�Y����O�۩�4�8��~74P��p-iǙ��f��e��� �$��yD�]1y�L.@D�p���C��pH�4Ac8%Qn����H��r�]��`oc��|]�+�Y�;o��IEND�B`�PK�X������zaufana_trzecia_strona.recipe# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai
from calibre.web.feeds.news import BasicNewsRecipe


class ZTS(BasicNewsRecipe):
    title = u'Zaufana Trzecia Strona'
    __author__ = 'fenuks'
    description = u'Niezależne źródło wiadomości o świecie bezpieczeństwa IT'
    category = 'IT, security'
    language = 'pl'
    cover_url = 'http://www.zaufanatrzeciastrona.pl/wp-content/uploads/2012/08/z3s_h100.png'
    extra_css = '.thumbnail {float: left; margin-right:5px;}'
    oldest_article = 7
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    use_embedded_content = False
    keep_only_tags = [dict(name='div', attrs={'class': 'post postcontent'})]
    remove_tags = [dict(name='div', attrs={'class': 'dolna-ramka'})]
    feeds = [(u'Strona g\u0142\xf3wna', u'http://feeds.feedburner.com/ZaufanaTrzeciaStronaGlowna'),
             (u'Drobiazgi', u'http://feeds.feedburner.com/ZaufanaTrzeciaStronaDrobiazgi')]
PK�X�&Xkoo
zaxid_net.png�PNG


IHDR(-SPLTE�#A��$tRNS@��fIDATx�c 0"��*��R4�3	LB��⪚IEND�B`�PK�X�o�X��zaxid_net.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe


class Zaxid(BasicNewsRecipe):
    title = 'Zaxid.net'
    __author__ = 'rpalyvoda (with fixes by bugmen00t)'
    oldest_article = 14
    max_articles_per_feed = 100
    language = 'uk'
    cover_url = 'https://zaxid.net/images/logo.png'
    masthead_url = 'https://zaxid.net/images/logo.png'
    auto_cleanup = True

    feeds = [
        ('\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 RSS', 'http://zaxid.net/rss/all.xml'),
        ('\u041D\u043E\u0432\u0438\u043D\u0438', 'https://zaxid.net/rss/1.xml'),
        ('\u0421\u0442\u0430\u0442\u0442\u0456', 'https://zaxid.net/rss/2.xml'),
        ('\u0411\u043B\u043E\u0433\u0438', 'https://zaxid.net/rss/3.xml'),
        ('\u0421\u0443\u0441\u043F\u0456\u043B\u044C\u0441\u0442\u0432\u043E', 'https://zaxid.net/rss/4.xml'),
        ('\u0415\u043A\u043E\u043D\u043E\u043C\u0456\u043A\u0430', 'https://zaxid.net/rss/5.xml'),
        ('\u041A\u0443\u043B\u044C\u0442\u0443\u0440\u0430', 'https://zaxid.net/rss/6.xml'),
        ('\u0421\u043F\u043E\u0440\u0442', 'https://zaxid.net/rss/7.xml'),
        ('\u0421\u0432\u0456\u0442', 'https://zaxid.net/rss/8.xml'),
        ('IQ', 'https://zaxid.net/rss/9.xml'),
        ('\u0410\u043D\u043E\u043D\u0441\u0438', 'https://zaxid.net/rss/13.xml'),
        ('ZAXID.NET TV', 'https://zaxid.net/rss/zaxid_tv.xml'),
        ('\u041D\u043E\u0432\u0438\u043D\u0438 \u041B\u044C\u0432\u043E\u0432\u0430', 'https://zaxid.net/rss/lviv_news.xml'),
        ('\u0424\u043E\u0442\u043E', 'https://zaxid.net/rss/19.xml'),
        ('\u0414\u0456\u043C', 'https://zaxid.net/rss/26.xml'),
        ('\u0417\u0434\u043E\u0440\u043E\u0432\u0027\u044F', 'https://zaxid.net/rss/28.xml'),
        ('\u0410\u0432\u0442\u043E', 'https://zaxid.net/rss/29.xml'),
        ('\u041B\u044C\u0432\u0456\u0432', 'https://zaxid.net/rss/16.xml'),
        ('\u041F\u0440\u0438\u043A\u0430\u0440\u043F\u0430\u0442\u0442\u044F', 'https://zaxid.net/rss/59.xml'),
        ('\u0422\u0435\u0440\u043D\u043E\u043F\u0456\u043B\u044C', 'https://zaxid.net/rss/60.xml'),
        ('\u0412\u043E\u043B\u0438\u043D\u044C', 'https://zaxid.net/rss/61.xml'),
        ('\u0417\u0430\u043A\u0430\u0440\u043F\u0430\u0442\u0442\u044F', 'https://zaxid.net/rss/62.xml'),
        ('\u0427\u0435\u0440\u043D\u0456\u0432\u0446\u0456', 'https://zaxid.net/rss/63.xml'),
        ('\u0420\u0456\u0432\u043D\u0435', 'https://zaxid.net/rss/65.xml'),
        ('\u0425\u043C\u0435\u043B\u044C\u043D\u0438\u0446\u044C\u043A\u0438\u0439', 'https://zaxid.net/rss/68.xml'),
        ('\u041D\u0435\u0440\u0443\u0445\u043E\u043C\u0456\u0441\u0442\u044C', 'https://zaxid.net/rss/37.xml'),
        ('\u0427\u0435\u0440\u0432\u043E\u043D\u043E\u0433\u0440\u0430\u0434', 'https://zaxid.net/rss/40.xml'),
        ('\u0421\u0442\u0440\u0438\u0439', 'https://zaxid.net/rss/41.xml'),
        ('\u0414\u0440\u043E\u0433\u043E\u0431\u0438\u0447', 'https://zaxid.net/rss/42.xml'),
        ('\u0412\u0456\u043D\u043D\u0438\u0446\u044F', 'https://zaxid.net/rss/44.xml'),
        ('\u041F\u043E\u0434\u043E\u0440\u043E\u0436\u0456', 'https://zaxid.net/rss/46.xml'),
        ('\u0414\u0456\u0442\u0438', 'https://zaxid.net/rss/53.xml'),
        ('Громадський транспорт', 'https://zaxid.net/rss/54.xml'),
        ('\u0420\u0435\u0446\u0435\u043F\u0442\u0438', 'https://zaxid.net/rss/55.xml'),
        ('\u0421\u043F\u043E\u0440\u0442', 'https://zaxid.net/rss/56.xml'),
        ('\u041A\u0443\u0440\u0439\u043E\u0437\u0438', 'https://zaxid.net/rss/57.xml'),
        ('\u0414\u043E\u0437\u0432\u0456\u043B\u043B\u044F', 'https://zaxid.net/rss/58.xml')
    ]
PK�X�.zdnet.fr.png�PNG


IHDR�a�IDATxڕ���AF�ڵm۶�6Nm#N7����ն�m�m�y7/k|�I�z�8N�3�
������{W�9��@i!.Z�x>�`̷֜��LE���or�6�B�<����y1�ډ�����ܼ�@���w�X���Æ Q��O�»�pۃ�?;U	̎�����J:�K^z���ko��uD����C��pr����RV���e�xo�}��w�ؙ���!�[؈?fkwd��-���o�~�;��}y��.6@Ϗ>ȷ�HМI&!3�O~��d|�R��7��;����.��=��V%Ɏ��A��+���`�W$��{�o�$����u���#G�(e��ɟɓl�߿�?�&�[�
�+8P����)/Ձ��`�=��p�������U�2p�/����X{�8���C�D�����.���� y�O|a<PA��u���G��V���gV�-���d������۱YIEND�B`�PK�X�%Q��zdnet.fr.recipe# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2011 Aurélien Chabot <contact@aurelienchabot.fr>'

'''
Fetch zdnet.fr
'''

from calibre.web.feeds.news import BasicNewsRecipe


class zdnet(BasicNewsRecipe):

    title = 'ZDNet.fr'
    __author__ = 'calibre'
    description = 'Actualités'
    encoding = 'utf-8'
    publisher = 'ZDNet.fr'
    category = 'Actualité, Informatique, IT'
    language = 'fr'

    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 15
    no_stylesheets = True
    remove_empty_feeds = True
    filterDuplicates = True

    extra_css = '''
                    h1 {font-size:xx-large; font-family:Arial,Helvetica,sans-serif;}
                    .contentmetadata p {font-size:xx-small; color:#4D4D4D; font-family:Arial,Helvetica,sans-serif;}
                    #content {font-size:medium; font-family:Arial,Helvetica,sans-serif;}
                '''

    remove_tags = [
        dict(name='iframe'),
        dict(name='div', attrs={'class': ['toolbox']}),
        dict(name='div', attrs={'class': ['clear clearfix']}),
        dict(id='emailtoafriend'),
        dict(id='storyaudio'),
        dict(id='fbtwContainer'),
        dict(name='h5')
    ]

    remove_tags_before = dict(id='leftcol')
    remove_tags_after = dict(id='content')

    feeds = [
        ('Informatique', 'http://www.zdnet.fr/feeds/rss/actualites/informatique/'),
        ('Internet', 'http://www.zdnet.fr/feeds/rss/actualites/internet/'),
        ('Telecom', 'http://www.zdnet.fr/feeds/rss/actualites/telecoms/')
    ]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup

    def get_masthead_url(self):
        masthead = 'http://www.zdnet.fr/images/base/logo.png'
        br = BasicNewsRecipe.get_browser(self)
        try:
            br.open(masthead)
        except:
            self.log("\nCover unavailable")
            masthead = None
        return masthead
PK�X;�c���	zdnet.png�PNG


IHDR(-S6PLTE��������������������DZ������������k��Hs�%W�I��DtIDATx�E�� D�P�
�Yi>9���Y5i�h��x0+��k�b���W�UIA���kF|�U0+�Z*�dHx_��CVF�"��}�R��+F�.�t��%�`����G��f}i_XIEND�B`�PK�X�O�+��zdnet.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch zdnet.
'''

from calibre.web.feeds.news import BasicNewsRecipe


class cdnet(BasicNewsRecipe):

    title = 'zdnet'
    description = 'zdnet security'
    __author__ = 'Oliver Niesner, Krittika Goyal'
    language = 'en'

    use_embedded_content = False
    timefmt = ' [%d %b %Y]'
    max_articles_per_feed = 40
    no_stylesheets = True
    encoding = 'latin1'
    auto_cleanup = True

    # remove_tags = [dict(id='eyebrows'),
    # dict(id='header'),
    # dict(id='search'),
    # dict(id='nav'),
    # dict(id='blog-author-info'),
    # dict(id='post-tags'),
    # dict(id='bio-naraine'),
    # dict(id='bio-kennedy'),
    # dict(id='author-short-disclosure-kennedy'),
    # dict(id=''),
    feeds = [('zdnet', 'http://feeds.feedburner.com/zdnet/security')]

    def preprocess_html(self, soup):
        for item in soup.findAll(style=True):
            del item['style']
        return soup
PK�XT�>G00
zeitde.png�PNG


IHDR:����IDATx���+Cƿ�ڞ�
��nJH.�4va*�������B�Tz֞�DQI''!�֤�����`����p�T�M��G{��p�7�P���A���a��}�Q�^jFa5���s>-��߻�l�:U��T���[��T��:X��/���>��B�ڕ,��է�:<�j�P�bS	�I�*���2�W!��W{.�<�H^3�^�_�X�Q���ٴ9U��HЌL��ܩ�3�@�IEND�B`�PK�X�—�
zeitde.recipe__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'

'''
Fetch Zeit-Online.de
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe
from datetime import datetime
try:
    from http.cookiejar import Cookie
except ImportError:
    from cookielib import Cookie

try:
    from urllib.request import Request, urlopen
    from urllib.error import HTTPError
except ImportError:
    from urllib2 import Request, urlopen, HTTPError

from calibre.ebooks.BeautifulSoup import BeautifulSoup


class ZeitDe(BasicNewsRecipe):

    __author__ = 'Armin Geller, Thomas Hollstegge'    # AGe 2014-02-26
    title = u'Zeit Online'
    description = u'German online portal of newspaper Die Zeit'
    publisher = 'ZEIT ONLINE GmbH'
    category = 'news, Germany'
    timefmt = ' [%a, %d %b %Y]'
    publication_type = 'newspaper'
    language = 'de'
    encoding = 'UTF-8'

    oldest_article = 7
    max_articles_per_feed = 100
    remove_empty_feeds = True
    auto_cleanup = True
    auto_cleanup_keep = '//header[@class="article-header"]|//div[@class="gallery__media-container"]|//div[@class="article__media-container"]'

    masthead_url = 'https://static.zeit.de/p/zeit.web/3.714/images/structured-data-publisher-logo-zon.png'

    extra_css = '.figure__text { font-size: 0.9em; font-style: italic; } \
                 .figure__copyright { font-size: 0.9em; font-style: italic; color: #888; } \
                 .article-heading__kicker { font-size: 0.5em; display: block; margin-bottom: 1em; } \
                 p.summary { font-size: 1.3em; font-style: italic; } '

    remove_tags = [
        dict(name='aside', class_='topicbox'),
        dict(name='aside', class_='article-toc'),
        dict(class_='visually-hidden'),
        dict(name='a', class_='faq-link'),
    ]

    feeds = [
        (u'Startseite – Die wichtigsten Themen auf einen Blick',
         u'https://newsfeed.zeit.de/index'),
        (u'Politik – Ausland und Deutschland',
         u'https://newsfeed.zeit.de/politik/index'),
        (u'Gesellschaft – Gesellschaft und soziales Leben',
         u'https://newsfeed.zeit.de/gesellschaft/index'),
        (u'Wirtschaft – Wirtschaft und Unternehmen',
         u'https://newsfeed.zeit.de/wirtschaft/index'),
        (u'Kultur – Literatur, Kunst, Film und Musik',
         u'https://newsfeed.zeit.de/kultur/index'),
        (u'Wissen – Wissenschaft, Gesundheit, Umwelt und Geschichte',
         u'https://newsfeed.zeit.de/wissen/index'),
        (u'Digital – Hardware, Software, Internet, Datenschutz',
         u'https://newsfeed.zeit.de/digital/index'),
        (u'ZEIT Campus Online - Studieren, arbeiten, leben',
         u'https://newsfeed.zeit.de/campus/index'),
        (u'Arbeit - Umbruch, Neuanfang, Erfolg, Zweifel',
         u'https://newsfeed.zeit.de/arbeit/index'),
        (u'Entdecken - Die Poesie des Alltäglichen',
         u'https://newsfeed.zeit.de/entdecken/index'),
        (u'Mobilität – Wie wir uns fortbewegen',
         u'https://newsfeed.zeit.de/mobilitaet/index'),  # AGe 2014-01-09
        (u'Sport – Sieg und Niederlage',
         u'https://newsfeed.zeit.de/sport/index')
    ]

    def get_browser(self):
        br = BasicNewsRecipe.get_browser(self)

        # Add a cookie indicating we have accepted the cookie
        # policy
        ck = Cookie(
            version=0, name='zonconsent', value=datetime.now().isoformat(), port=None,
            port_specified=False, domain='.zeit.de',
            domain_specified=False, domain_initial_dot=True, path='/',
            path_specified=False, secure=True, expires=None, discard=False,
            comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)
        br.cookiejar.set_cookie(ck)
        return br

    def print_version(self, url):
        # If there is a complete page, use that one
        req = Request(url=url+'/komplettansicht')
        req.get_method = lambda : 'HEAD'
        try:
            urlopen(req)
            return url + '/komplettansicht'
        except HTTPError:
            return url

    def preprocess_raw_html(self, raw_html, url):
        soup = BeautifulSoup(raw_html)

        # Skip articles behind paywall
        if soup.find('meta', property='lp:paywall'):
            self.abort_article()

        # Readability may strip the header for multipage articles, so simply
        # include it in the main tag
        if soup.find('body')['data-page-type'] == 'article':
            body = soup.find('div', {'class': 'article-body'})
            header = soup.find('header', {'class': 'article-header'})
            if header is not None:
                header.extract()
                body.insert(0, header)

        # Add real img tags for images
        for container in soup.findAll(class_=re.compile('__media-container$')):
            img = container.find('noscript')
            if img is not None:
                img.name = 'div'
                img['data-src'] = ''

        return soup.prettify()
PK�Xݼ�@@zeitde_sub.png�PNG


IHDR  V%(IDATx^��MkSA�&�2��U~��BW"t!E\
RR,�$(���E��b+\Ģ�j����J��.tW�PQ���4�67��s��ܘ�E	>�9g�Ù�A!H������@���b{��R�M_�z��T�z�L�8��胚��Y�<f�I��ճ(sI�p�)G���:x�����2?�*��sgy�����2yr4��{N�
�V������]��60��������õǸN
��#]/��/�j�!�aF��7�|��m��}Oψ6����N`�X3xu.����@��	�:�n�� �d;�`�,��.zu���d��	���<m��e��T��{C��=Q���E����h�f�l/L�vE�uA�2Ȥ�u4�h��;���D}S�u�?ZY�
�8�\�j"B�+k�&X`5�Z����j����V��>n(C��z�$(k��%�.+��lہ��n[���1O!�G  �������Q�j+-�s��UWIEND�B`�PK�X����0808zeitde_sub.recipe#!/usr/bin/env python
# -*- coding: utf-8 mode: python -*-
from __future__ import absolute_import, division, print_function, unicode_literals

__license__ = 'GPL v3'
__copyright__ = '2010, Steffen Siebert <calibre at steffensiebert.de>'
__docformat__ = 'restructuredtext de'
__version__ = '1.5'

"""
Die Zeit EPUB
"""

import os
import zipfile
import re
import io
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ptempfile import PersistentTemporaryFile
from calibre import walk
try:
    from urllib.parse import urlparse
except ImportError:
    from urlparse import urlparse
from contextlib import closing
from calibre.utils.magick.draw import save_cover_data_to


class ZeitEPUBAbo(BasicNewsRecipe):

    title = u'Die Zeit'
    description = u'Das EPUB Abo der Zeit (needs subscription)'
    language = 'de'
    lang = 'de-DE'

    __author__ = 'Steffen Siebert, revised by Tobias Isenberg (with some code by Kovid Goyal), updated by Henning Losert'
    needs_subscription = True

    conversion_options = {
        'no_default_epub_cover': True,
        # fixing the wrong left margin
        'mobi_ignore_margins': True,
        'keep_ligatures': True,
    }

    preprocess_regexps = [
        # filtering for correct dashes ("Gedankenstrich" and "bis")
        (re.compile(u' (-|\u2212)(?=[ ,])'), lambda match: u' \u2013'),
        (re.compile(r'(?<=\d)-(?=\d)'), lambda match: u'\u2013'),  # number-number
        (re.compile(r'(?<=\d,)-(?= ?\u20AC)'), lambda match: u'\u2013'),  # ,- Euro
        # fix the number dash number dash for the title image that was broken
        # by the previous line
        (re.compile(r'(?<=\d\d\d\d)\u2013(?=\d?\d\.png)'), lambda match: '-'),
        # filtering for certain dash cases
        (re.compile(r'Bild - Zeitung'), lambda match: 'Bild-Zeitung'),  # the obvious
        (re.compile(r'EMail'), lambda match: 'E-Mail'),  # the obvious
        (re.compile(r'SBahn'), lambda match: 'S-Bahn'),  # the obvious
        (re.compile(r'UBoot'), lambda match: 'U-Boot'),  # the obvious
        (re.compile(r'T Shirt'), lambda match: 'T-Shirt'),  # the obvious
        (re.compile(r'TShirt'), lambda match: 'T-Shirt'),  # the obvious
        # the next two lines not only fix errors but also create new ones. this is due to additional errors in
        # the typesetting such as missing commas or wrongly placed dashes. but
        # more is fixed than broken.
        # space too much before a connecting dash
        (re.compile(r'(?<!und|der|\w\w,) -(?=\w)'), lambda match: '-'),
        (re.compile(r'(?<=\w)- (?!und\b|oder\b|wie\b|aber\b|auch\b|sondern\b|bis\b|&amp;|&\s|bzw\.|auf\b|eher\b)'),
         lambda match: '-'),  # space too much after a connecting dash
        # filtering for missing spaces before the month in long dates
        (re.compile(r'(?<=\d)\.(?=(Januar|Februar|M\u00E4rz|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember))'), lambda match: '. '),
        # filtering for other missing spaces
        (re.compile(r'Stuttgart21'), lambda match: 'Stuttgart 21'),  # the obvious
        (re.compile(r'(?<=\d)(?=\u20AC)'),
         lambda match: u'\u2013'),  # Zahl[no space]Euro
        # missing space after colon
        (re.compile(r':(?=[^\d\s</])'), lambda match: ': '),
        # missing space after closing quotation
        (re.compile(r'\u00AB(?=[^\-\.:;,\?!<\)\s])'),
         lambda match: u'\u00AB '),
        # missing space before opening quotation
        (re.compile(r'(?<=[^\s\(>])\u00BB'), lambda match: u' \u00BB'),
        # missing space before Roman numeral
        (re.compile(
            r'(?<=[a-z])(?=(I|II|III|IV|V|VI|VII|VIII|IX|X|XI|XII|XIII|XIV|XV|XVI|XVII|XVIII|XIX|XX)\.)'), lambda match: ' '),
        # missing space after Roman numeral
        (re.compile(r'(?<=(I|V|X)\.)(?=[\w])'), lambda match: ' '),
        # missing space after Roman numeral
        (re.compile(
            r'(?<=(II|IV|VI|IX|XI|XV|XX)\.)(?=[\w])'), lambda match: ' '),
        # missing space after Roman numeral
        (re.compile(
            r'(?<=(III|VII|XII|XIV|XVI|XIX)\.)(?=[\w])'), lambda match: ' '),
        # missing space after Roman numeral
        (re.compile(r'(?<=(VIII|XIII|XVII)\.)(?=[\w])'), lambda match: ' '),
        # missing space after Roman numeral
        (re.compile(r'(?<=(XVIII)\.)(?=[\w])'), lambda match: ' '),
        (re.compile(r'(?<=[A-Za-zÄÖÜäöü]),(?=[A-Za-zÄÖÜäöü])'),
         lambda match: ', '),  # missing space after comma
        # missing space after full-stop
        (re.compile(
            r'(?<=[a-zäöü])\.(?=[A-ZÄÖÜ][A-Za-zÄÖÜäöü])'), lambda match: '. '),
        # fix abbreviation that was potentially broken previously
        (re.compile(r'(?<=[uU]\.) (?=a\.)'), lambda match: u'\u2008'),
        # fix abbreviation that was potentially broken previously
        (re.compile(r'(?<=[iI]\.) (?=A\.)'), lambda match: u'\u2008'),
        # fix abbreviation that was potentially broken previously
        (re.compile(r'(?<=[zZ]\.) (?=B\.)'), lambda match: u'\u2008'),
        # fix e-mail address that was potentially broken previously
        (re.compile(r'(?<=\w\.) (?=[A-Z][a-z]*@)'), lambda match: ''),
        (re.compile(r'(?<=\d)[Pp]rozent'), lambda match: ' Prozent'),
        (re.compile(r'\.\.\.\.+'), lambda match: '...'),  # too many dots (....)
        # spaces before ...
        (re.compile(r'(?<=[^\s])\.\.\.'), lambda match: ' ...'),
        # spaces after ...
        (re.compile(r'\.\.\.(?=[^\s])'), lambda match: '... '),
        # fix special cases of ... in brackets
        (re.compile(r'(?<=[\[\(]) \.\.\. (?=[\]\)])'), lambda match: '...'),
        # fix special cases of ... after a quotation mark
        (re.compile(r'(?<=[\u00BB\u203A]) \.\.\.'), lambda match: '...'),
        # fix special cases of ... before a quotation mark or comma
        (re.compile(r'\.\.\. (?=[\u00AB\u2039,])'), lambda match: '...'),
        # fix missing spaces between numbers and any sort of units, possibly
        # with dot
        (re.compile(r'(?<=\d)(?=(Femto|Piko|Nano|Mikro|Milli|Zenti|Dezi|Hekto|Kilo|Mega|Giga|Tera|Peta|Tausend|Trilli|Kubik|Quadrat|Meter|Uhr|Jahr|Schuljahr|Seite))'), lambda match: ' '),  # noqa
        (re.compile(r'(?<=\d\.)(?=(Femto|Piko|Nano|Mikro|Milli|Zenti|Dezi|Hekto|Kilo|Mega|Giga|Tera|Peta|Tausend|Trilli|Kubik|Quadrat|Meter|Uhr|Jahr|Schuljahr|Seite))'), lambda match: ' '),  # noqa
        # fix wrong spaces
        # at beginning of paragraphs
        (re.compile(
            r'(?<=<p class="absatz">[A-ZÄÖÜ]) (?=[a-zäöü\-])'), lambda match: ''),
        # before closing quotation
        (re.compile(u' \u00AB'), lambda match: u'\u00AB '),
        # after opening quotation
        (re.compile(u'\u00BB '), lambda match: u' \u00BB'),
        # filtering for spaces in large numbers for better readability
        # end of the number with some character following
        (re.compile(r'(?<=\d\d)(?=\d\d\d[ ,;\)<\?!-])'),
         lambda match: u'\u2008'),
        # end of the number with full-stop following, then space is necessary
        # (avoid file names)
        (re.compile(r'(?<=\d\d)(?=\d\d\d. )'), lambda match: u'\u2008'),
        (re.compile(r'(?<=\d)(?=\d\d\d\u2008)'),
         lambda match: u'\u2008'),  # next level
        (re.compile(r'(?<=\d)(?=\d\d\d\u2008)'),
         lambda match: u'\u2008'),  # next level
        (re.compile(r'(?<=\d)(?=\d\d\d\u2008)'),
         lambda match: u'\u2008'),  # next level
        (re.compile(r'(?<=\d)(?=\d\d\d\u2008)'),
         lambda match: u'\u2008'),  # next level
        # filtering for unicode characters that are missing on the Kindle,
        # try to replace them with meaningful work-arounds
        # subscript-0
        (re.compile(u'\u2080'), lambda match: '<span style="font-size: 40%;">0</span>'),
        # subscript-1
        (re.compile(u'\u2081'), lambda match: '<span style="font-size: 40%;">1</span>'),
        # subscript-2
        (re.compile(u'\u2082'), lambda match: '<span style="font-size: 40%;">2</span>'),
        # subscript-3
        (re.compile(u'\u2083'), lambda match: '<span style="font-size: 40%;">3</span>'),
        # subscript-4
        (re.compile(u'\u2084'), lambda match: '<span style="font-size: 40%;">4</span>'),
        # subscript-5
        (re.compile(u'\u2085'), lambda match: '<span style="font-size: 40%;">5</span>'),
        # subscript-6
        (re.compile(u'\u2086'), lambda match: '<span style="font-size: 40%;">6</span>'),
        # subscript-7
        (re.compile(u'\u2087'), lambda match: '<span style="font-size: 40%;">7</span>'),
        # subscript-8
        (re.compile(u'\u2088'), lambda match: '<span style="font-size: 40%;">8</span>'),
        # subscript-9
        (re.compile(u'\u2089'), lambda match: '<span style="font-size: 40%;">9</span>'),
        # always chance CO2
        (re.compile(r'CO2'), lambda match: 'CO<span style="font-size: 40%;">2</span>'),  # CO2
        # remove *** paragraphs
        (re.compile(r'<p class="absatz">\*\*\*</p>'), lambda match: ''),
        # better layout for the top line of each article
        (re.compile(r'(?<=DIE ZEIT N\u00B0 \d /) (?=\d\d)'),
         lambda match: ' 20'),  # proper year in edition number
        (re.compile(r'(?<=DIE ZEIT N\u00B0 \d\d /) (?=\d\d)'),
         lambda match: ' 20'),  # proper year in edition number
        (re.compile(r'(?<=>)(?=DIE ZEIT N\u00B0 \d\d / 20\d\d)'),
         lambda match: u' \u2014 '),  # m-dash between category and DIE ZEIT
    ]

    def build_index(self):
        url = "https://meine.zeit.de/anmelden?url=https%3A//epaper.zeit.de/abo/diezeit"
        browser = self.get_browser()

        # new login process
        browser.open(url)
        browser.select_form(nr=0)
        browser.form['email'] = self.username
        browser.form['pass'] = self.password
        browser.submit()
        # change into abo section - not needed between late 2016 and May 2017, and again starting from March 2020
        # browser.open(url)
        # abolink = browser.find_link(text_regex=re.compile(
        #    '.*E-Paper.*'))  # used to be '.*Abo-Bereich.*'
        # browser.follow_link(abolink)
        # find page for latest issue
        latestlink = browser.find_link(text_regex=re.compile(
            '.*ZUR AKTUELLEN AUSGABE.*'))
        browser.follow_link(latestlink)
        # now find the correct file, we will still use the ePub file
        epublink = browser.find_link(text_regex=re.compile(
            '.*EPUB F.*R E-READER LADEN.*'))  # change from '.*EPUB FÜR E-READER LADEN.*' in May 2017
        response = browser.follow_link(epublink)
        self.report_progress(1, _('next step'))

        tmp = PersistentTemporaryFile(suffix='.epub')
        self.report_progress(0, _('downloading epub'))
        tmp.write(response.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'))

        # doing regular expression filtering
        for path in walk('.'):
            (shortname, extension) = os.path.splitext(path)
            if extension.lower() in ('.html', '.htm', '.xhtml'):
                with open(path, 'r+b') as f:
                    raw = f.read()
                    raw = raw.decode('utf-8')
                    for pat, func in self.preprocess_regexps:
                        raw = pat.sub(func, raw)
                    f.seek(0)
                    f.truncate()
                    f.write(raw.encode('utf-8'))

        # adding real cover
        self.report_progress(
            0, _('trying to download cover image (titlepage)'))
        self.download_cover()
        self.conversion_options["cover"] = self.cover_path

        return index

    # getting url of the cover
    def get_cover_url(self):
        self.log.warning('Downloading cover')
        try:
            self.log.warning('Trying PDF-based cover')
            url = "https://meine.zeit.de/anmelden?url=https%3A//epaper.zeit.de/abo/diezeit"
            browser = self.get_browser()

            # new login process
            browser.open(url)
            browser.select_form(nr=0)
            browser.form['email'] = self.username
            browser.form['pass'] = self.password
            browser.submit()
            # change into abo section - not needed at the moment
            # browser.open(url)
            # abolink = browser.find_link(text_regex=re.compile(
            #    '.*Abo-Bereich.*'))
            # browser.follow_link(abolink)
            # find page for latest issue
            latestlink = browser.find_link(text_regex=re.compile(
                '.*ZUR AKTUELLEN AUSGABE.*'))
            browser.follow_link(latestlink)
            # actual cover search
            pdflink = browser.find_link(text_regex=re.compile(
                '.*GESAMT-PDF LADEN.*'))
            cover_url = urlparse(pdflink.base_url)[0] + '://' + urlparse(pdflink.base_url)[1] + '' + (
                urlparse(pdflink.url)[2]).replace('ePaper_', '').replace('.pdf', '_001.pdf')
            self.log.warning('PDF link found:')
            self.log.warning(cover_url)
            # download the cover (has to be here due to new login process)
            with closing(browser.open(cover_url)) as r:
                cdata = r.read()
            from calibre.ebooks.metadata.pdf import get_metadata
            stream = io.BytesIO(cdata)
            cdata = None
            mi = get_metadata(stream)
            if mi.cover_data and mi.cover_data[1]:
                cdata = mi.cover_data[1]

            cpath = os.path.join(self.output_dir, 'cover.jpg')
            save_cover_data_to(cdata, cpath)
            cover_url = cpath

        except:
            self.log.warning('Trying low-res cover')
            try:
                inhalt = self.index_to_soup('http://www.zeit.de/inhalt')
                cover_url = inhalt.find('div', attrs={'class': 'singlearchive clearfix'}).img[
                    'src'].replace('icon_', '')
            except:
                self.log.warning('Using static old low-res cover')
                cover_url = 'http://images.zeit.de/bilder/titelseiten_zeit/1946/001_001.jpg'
        return cover_url
PK�X��NNzerocalcare.png�PNG


IHDR  V%(	pHYs��~�IDAT8�}��n[E��.>�=��l��*A\R5�@�BЊO���<$�@Q�."QU�@Z*���$�c�I|�xΙVb���~�O]4�;���z#�cC� ��ox.3����{�K��3/�_D`<��6���z8�_��,{	ZLx��o~��p���ɲģUz���t�����tT�Vn�\��E��ѣШ���?�$\���1�k�-��q�^�2��X�o�H��XKLF'h�M3��Q��J #T&6�qt+��{���z-�P���Y[��!-SZ@��1յ�x7{|�[4�����Y�aHW���o�l$
�������Ha)�Z�4'��@t/���A��#7�=WWq���v�Tn���g���������)�E$n� ���Ib
���L-V�;KJ;��ah'O�-��x��d�Ω'�W�Se�AZ����.������9�%'w��]��� H3$φ<�&�}TK�G+����g��A�!K�O�j\O�@Z/Ie����¢���'Lz���UL�L�w���@�ﴉ�A��<Č��̣�RM)k��4�	1Ч�5��R]_E��\t:?��r4鐢RJ�X���`v�A��(
�)u﷿q� ��G0���4��W����ѣ����۽��a%y���E��������d��z��ח�I{�������YXX'�����h>W!�9���{\����c����4���.r	0hj�IEND�B`�PK�X�:~�mmzerocalcare.recipe__version__ = 'v1.0'
__date__ = '7, April 2012'

from calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1333705905(BasicNewsRecipe):
    title = u'Zerocalcare'
    __author__ = 'faber1971'
    description = 'Free Italian Comics'

    oldest_article = 7
    language = 'it'
    max_articles_per_feed = 100
    auto_cleanup = False
    keep_only_tags = [
        dict(name='div', attrs={'class': 'main entry-content group'})
    ]
    masthead_url = 'http://zerocalcare.it/wp-content/uploads/2011/11/zerocalcare-banner.jpg'
    feeds = [(u'Zerocalcare', u'http://feeds.feedburner.com/Zerocalcareit')]
PK�X�Co�QQ
zerohedge.png�PNG


IHDR�aIDATx�|�GCa��7�łh)"�SA	�DhD����n��$T"���
��������{R�
��P�^ ��	�{f�Љ2�a�ƛ��<����#r�@7d�Q��"5M��5EB�b0B��,A��9JA`5�T|`�;N�E�a��1~ �@�'v!��x���a�*�9���S��B�ʐɱfq��aw�:��@/.۽�2����(P�/��`<	a��-L@&C��p|�]8��k<�Qؼ�2����IEND�B`�PK�X6L�__zerohedge.recipe# -*- mode: python; coding: utf-8; -*-
# vim: set syntax=python fileencoding=utf-8

__license__ = 'GPL v3'
__copyright__ = '2011-2020, Darko Miletic <darko.miletic at gmail.com>'
'''
www.zerohedge.com
'''

from calibre.web.feeds.recipes import BasicNewsRecipe


class ZeroHedge(BasicNewsRecipe):
    title = 'Zero Hedge'
    __author__ = 'Darko Miletic'
    description = 'On a long enough timeline the survival rate for everyone drops to zero'
    oldest_article = 10
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    encoding = 'utf8'
    publisher = 'zero hedge'
    category = 'news, USA, world, economy, politics'
    language = 'en'
    masthead_url = 'https://www.zerohedge.com/images/logo/full.svg'
    auto_cleanup     = True
    auto_cleanup_keep = '//*[@class="main-content"]'
    publication_type = 'blog'
    extra_css = 'body{ font-family: sans-serif }'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    feeds = [(u'Articles', u'http://feeds.feedburner.com/zerohedge/feed')]
PK�X��iHHziarulfinanciar.png�PNG


IHDR  ��IDATxڵVy�A~3;���WTQ�-n�		$BB����$$!H!�7���!��nwgwf�!?��/�t;}�}���d��-���?A�!�C�B�
�0	���4����C�Ca�|�	�NV�(�G�!�,���l��q��v�	�;~V{�ȉاdـd�'B59c�z����&����G�t�{�L^��%s]���@���b@��i�����_��вՇ��޽`љu�!+^��v��z}ϡ�Ϩ�bq�6�O�v'�/�4�H�E.8��ްe۠� b:38	��}{y@o?���mo-(��Ğ��.�_R�k��@H�|z{��.RX�[rJљU��RL���+��j�|�{f/"�n�)U8��P��DHb!)�	��pK׷�yx�n)
��Hy�ӗ;{
�|�v��(�4|�0d��PRz�ڊ���Ps 0�m0G-@�J���}UPJ!�8U�~�S2�eCEP�B�递(?�o>ľ�+ȇ�E��ia9���͜g�b(O&���$N6"��þ�\X��!>��'X&�%?�0gi
�30O�/	��ኍ��G�`�E5�+?����뷈7wbRaS�lD�߾�d4�-+_�e�u�[��U+p!0B�I��]^	B� �Mr�|�9�8Ս����v�Ab��1�e�}�4i0˲Ǔ��/��qC�|<�=�)�x�`錪�W?C���J~8��L�>��մ8'�� �-ZUTG��m���df�reG�=�IR�a��W�%�U���S�	��
ttQ�:�y{�‰rR��F�QΤ,�
7�3�,���_T`�w�����i�g�?�����B�l��t	@��;�o.kڸ,(i�ѓg#Mj3���@�-G ��ϓ�O>��|�!I�e7#ʼxe1�{&�DkC�dn��r�XD��������c
Z�;��-K"�ql��RvQ����q�"$@�L%I���߼�w�`i�P�!�Ӵ�2#��%���t�*��`�s`�����]��}Ų�:��ъu�=:f,S�en��peq��0�B3Ju�F�0�tD3��
������dJ��g�n|N���N�ص���r\��`��m����~�����s�5�g�J敮��U�hX�&��yK�g�ifh�U�c�����))q�@S���F�a!nQF���E��o��ݾzU�x�N�VT�mF��G[5r���[�UK�@D�nXf�d�"��/�J�Ͽ ��-��"�1@�
ƞ?��Ar�q�*�dc��`�m��u�`/��c�r��=�pu��S�q�!� $�{{���B�{�\V9�>������
��ݓ��Y��Շ��ӗc�8+\���X���A�U�
���j��ͤ��� �o�ζ+(#�iJ��d3�@8!�$e�$��"~,�BA�[ؒ31��,~�$R�L?Ht*0�)�?aW�6�+���/	�����.�C_p��^��2�IEND�B`�PK�Xv�sziarulfinanciar.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
zf.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ZiarulFinanciar(BasicNewsRecipe):
    title = 'Ziarul Financiar'
    __author__ = u'Silviu Cotoar\u0103'
    description = u'\u0218tiri din Business'
    publisher = 'Ziarul Financiar'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Stiri,Romania'
    encoding = 'utf-8'
    cover_url = 'http://storage0.dms.mpinteractiv.ro/media/1/1/1706/7462721/1/ziarul-financiar-big.jpg?width=400'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'class': 'article'})
    ]

    feeds = [
        (u'\u0218tiri', u'http://www.zf.ro/rss/zf-24/')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X����zita_be.png�PNG


IHDR  szz��IDATx����eW����c�at�T۶��mնm۶=���/��;9��J��}����>����<���1��l��s�gL���	>`&+�+�i�l���)�Ε���r#��%�N��,v��1 
l�����󗣀ֶo&���;�
��՝��ς8P�^`!k��a
�@^�w����):̅�ce����]iO[ڤhK�ы�{D^�ܦ�g���(��+�&�-qzD�c�pe�k�HN�{ձ���L�]��R�qn�f����D0�_���M$���M��9I{�����q.�
�5U��yW�<�2�_��L�;�y�����'
�	M���d�g<9��3|��ְ�mT�
�d$_OD3��|P)�,'ҏQ\Ǖ	��$߱�P?�
C��^�>`F���Y)�2�҉v��5�؝�فc��/�3/3���h&o�� �Q�����)汔P�r�RH��L^����R��J~g���q=�+]~
�8�����r����J��(r��Rzю�9�'I�8���B���@/Ne��:߳����}�f$�rD�'ϻ�RzӒ>��B��r��7�����6Л������"B��e
��/P�^�(dO3��wr�S��Q�H�tb�3*��I��N$�^i�̬@;�������b:���2a]О.�4�;aⳠ5W��e�������\��j&2�3�dz �i؎��_[��z6%��"0��y<
���ã��Rf3���̯	f�%?0��y�WD�ZO�氙�l"�6����蒲"J]�Ŗ8 "��<&3���2��Lag�#eM��*�MT>��ә|W���LJ�Y������Q|���e�ӑ��Q��
��OT������O{7L�4����S���$H�õ6�i�Et!�"���h�hf�[4D���#��IEND�B`�PK�X�o)��zita_be.recipe#!/usr/bin/env python

from calibre.web.feeds.news import BasicNewsRecipe


class Zitabe(BasicNewsRecipe):
    title = u'Zita.be'
    __author__ = u'erkfuizfeuadjfjzefzfuzeff'
    description = u'Lifestyle News from Belgium in Dutch'
    oldest_article = 7
    language = 'nl_BE'

    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False

    keep_only_tags = [
        dict(name='title'), dict(name='article', attrs={'class': 'article-main'})
    ]

    remove_tags = [
        dict(name='div', attrs={'class': 'box-50 box-omega sidebar-webtips'}),
        dict(name='blockquote', attrs={'class': 'instagram-media'}),
    ]

    feeds = [(u'Auto', u'http://www.zita.be/xml/auto.xml'),
             (u'Business', u'http://www.zita.be/xml/business.xml'),
             (u'Entertainment', u'http://www.zita.be/xml/entertainment.xml'),
             (u'Fun', u'http://www.zita.be/xml/fun.xml'),
             (u'Lifestyle', u'http://www.zita.be/xml/lifestyle.xml'),
             (u'Nieuws', u'http://www.zita.be/xml/nieuws.xml'),
             (u'Nieuws binneland', u'http://www.zita.be/xml/nieuws-binnenland.xml'),
             (u'Bizar', u'http://www.zita.be/xml/nieuws-bizar.xml'),
             (u'Nieuws Buitenland', u'http://www.zita.be/xml/nieuws-buitenland.xml'),
             (u'Nieuws Economie', u'http://www.zita.be/xml/nieuws-economie.xml'),
             (u'Sport', u'http://www.zita.be/xml/nieuws-sport.xml')]
PK�Xk�x���
ziuaveche.png�PNG


IHDR��h6�IDATxڝP�JQ�	�6B	�R$��VF n
P)��$�V#��?�0C)���
j}@mJ@2pU������7ޙ1�M
��y�3���v8�<m��K�vm�y��X��R��!��݅E���A���`��`�6���<+٬�w�@	5T��<��
��x�+���Ǯ��1UUT3@�.�1�I��\U�@��n(Dj5C�j���ٵ��ɸ���e`b�#�\�n7ƶ�ec�Q�8�ZR4�R��0��K��>Ps��kŧ~:MU���@�E����{oy�-���e-�o�8N���h�7E./(���V�G�8y}�~��R�ꀿ�Ũ9+1�ͦ�H��vr
�O��ڿ#i�)��b�$���*)H�_Խ�e��a��ӊ��IEND�B`�PK�X�?���ziuaveche.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'2011, Silviu Cotoar\u0103'
'''
ziuaveche.ro
'''

from calibre.web.feeds.news import BasicNewsRecipe


class ZiuaVeche(BasicNewsRecipe):
    title = u'Ziua Veche'
    __author__ = u'Silviu Cotoar\u0103'
    description = 'Cotidian online'
    publisher = 'Ziua Veche'
    oldest_article = 5
    language = 'ro'
    max_articles_per_feed = 100
    no_stylesheets = True
    use_embedded_content = False
    category = 'Ziare,Cotidiane,Stiri'
    encoding = 'utf-8'
    cover_url = 'http://www.ziuaveche.ro/wp-content/themes/tema/images/zv-logo-alb-old.png'

    conversion_options = {
        'comments': description, 'tags': category, 'language': language, 'publisher': publisher
    }

    keep_only_tags = [
        dict(name='div', attrs={'id': 'singlePost'})

    ]

    remove_tags = [
        dict(name='div', attrs={'id': 'LikePluginPagelet'})

    ]

    remove_tags_after = [
        dict(name='div', attrs={'id': 'LikePluginPagelet'})
    ]

    feeds = [
        (u'Feeds', u'http://www.ziuaveche.ro/feed/rss')
    ]

    def preprocess_html(self, soup):
        return self.adeify_images(soup)
PK�X-�eh��	zn_ru.png�PNG


IHDR  D����PLTE�������.���<����R��&����� ����/���O������<��#��;�����*���1��a����)���!����J��z�?��'����&��P��������0��(���1�����4����%�������%���(���N��"��Q��L����o��d��[��L�j�IDATx���3��D��m�\��Q\e�2����-W�x�� �V���p�Bw"��\�-��
ve�����i ���e�b�x��z:��x��ʁ6
�4�|�^�����r
������ӀAG������4kR�N��l���pX��[@0�l�"|�a^��IEND�B`�PK�Xr7�}				zn_ru.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Zerkalo(BasicNewsRecipe):
    title = '\u0417\u0435\u0440\u043A\u0430\u043B\u043E \u043D\u0435\u0434\u0435\u043B\u0438. \u0423\u043A\u0440\u0430\u0438\u043D\u0430'
    __author__ = 'bugmen00t'
    description = '\u041E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E-\u043F\u043E\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E-\u0430\u043D\u0430\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0435\u0436\u0435\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A.'  # noqa
    publisher = '\u00AB\u0417\u0435\u0440\u043A\u0430\u043B\u043E \u043D\u0435\u0434\u0435\u043B\u0438. \u0423\u043A\u0440\u0430\u0438\u043D\u0430\u00BB'
    category = 'newspaper'
    cover_url = u'https://zn.ua/user/img/zn_no_photo_amp.png'
    language = 'ru'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 200

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'article_body'}),

    remove_tags = [
        dict(name='span', attrs={'class': 'print print-art-js'}),
        dict(name='div', attrs={'class': 'questionnaire '}),
        dict(name='div', attrs={'class': 'nts-video-wrapper'}),
        dict(name='div', attrs={'class': 'telegram'}),
        dict(name='div', attrs={'class': 'mist_block'}),
        dict(name='div', attrs={'class': 'auth_articles_block'}),
        dict(name='div', attrs={'class': 'special_theme_news_block'}),
        dict(name='div', attrs={'class': 'article_attached acenter'}),
        dict(name='div', attrs={'class': 'article_left'}),
        dict(name='div', attrs={'class': 'top_social_holder'})
    ]

    feeds = [
        (
            '\u041D\u043E\u0432\u043E\u0441\u0442\u0438',
            'https://zn.ua/rus/rss/full.rss'
        ),
        #       ('\u0421\u0442\u0430\u0442\u044C\u0438', 'https://zn.ua/rus/rss/articles.rss')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�X-�eh��	zn_ua.png�PNG


IHDR  D����PLTE�������.���<����R��&����� ����/���O������<��#��;�����*���1��a����)���!����J��z�?��'����&��P��������0��(���1�����4����%�������%���(���N��"��Q��L����o��d��[��L�j�IDATx���3��D��m�\��Q\e�2����-W�x�� �V���p�Bw"��\�-��
ve�����i ���e�b�x��z:��x��ʁ6
�4�|�^�����r
������ӀAG������4kR�N��l���pX��[@0�l�"|�a^��IEND�B`�PK�X\�����zn_ua.recipe#!/usr/bin/env python
# vim:fileencoding=utf-8

from calibre.web.feeds.news import BasicNewsRecipe


class Zerkalo(BasicNewsRecipe):
    title = '\u0414\u0437\u0435\u0440\u043A\u0430\u043B\u043E \u0442\u0438\u0436\u043D\u044F. \u0423\u043A\u0440\u0430\u0457\u043D\u0430'
    __author__ = 'bugmen00t'
    description = '\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0435 \u0456\u043D\u0442\u0435\u0440\u043D\u0435\u0442-\u0432\u0438\u0434\u0430\u043D\u043D\u044F, \u0441\u0443\u0441\u043F\u0456\u043B\u044C\u043D\u043E-\u043F\u043E\u043B\u0456\u0442\u0438\u0447\u043D\u0438\u0439 \u0442\u0438\u0436\u043D\u0435\u0432\u0438\u043A.'  # noqa
    publisher = '\u0414\u0437\u0435\u0440\u043A\u0430\u043B\u043E \u0442\u0438\u0436\u043D\u044F. \u0423\u043A\u0440\u0430\u0457\u043D\u0430'
    category = 'newspaper'
    cover_url = u'https://zn.ua/user/img/zn_no_photo_amp.png'
    language = 'uk'
    no_stylesheets = False
    remove_javascript = False
    auto_cleanup = False
    remove_empty_feeds = True
    oldest_article = 7
    max_articles_per_feed = 200

    remove_tags_before = dict(name='h1')

    remove_tags_after = dict(name='div', attrs={'class': 'article_body'}),

    remove_tags = [
        dict(name='span', attrs={'class': 'print print-art-js'}),
        dict(name='div', attrs={'class': 'questionnaire '}),
        dict(name='div', attrs={'class': 'nts-video-wrapper'}),
        dict(name='div', attrs={'class': 'telegram'}),
        dict(name='div', attrs={'class': 'mist_block'}),
        dict(name='div', attrs={'class': 'auth_articles_block'}),
        dict(name='div', attrs={'class': 'special_theme_news_block'}),
        dict(name='div', attrs={'class': 'article_attached acenter'}),
        dict(name='div', attrs={'class': 'article_left'}),
        dict(name='div', attrs={'class': 'top_social_holder'})
    ]

    feeds = [
        ('\u041D\u043E\u0432\u0438\u043D\u0438', 'https://zn.ua/ukr/rss/full.rss'),
        #       ('\u0421\u0442\u0430\u0442\u0442\u0456', 'https://zn.ua/ukr/rss/articles.rss')
    ]

    def preprocess_html(self, soup):
        for img in soup.findAll('img', attrs={'data-src': True}):
            img['src'] = img['data-src']
        return soup
PK�XԺ�Ijjznadplanszy_pl.png�PNG


IHDR  szz�1IDATxڕ�p����ӓ��Է��˰�h����P���*�Jpwww�ڐ'�غ��D��^8$���nR�;U���sNn���B�2�233�-zUYYY���Ζp8,��ܖ�a�{oi,���D�^�z�:u���V�7�?��3b�E�����̙3�I���oH\2�kt��ѽ�Xf�V&vGIHHHE��xmK���-�ޮ]�z���;v�=z�ٳg��kt��)�ibyM��H�jba�6m��o���:g3����t��Zݣ{5��%[s`����:Q+�2��yTۈ��湡�6����pLݫ1L�yx����ue�ԩҷo�6/���gLgS��16��9���@�u'`��kb|lb4��Ҝ�[F���ի��h��,�Z�kժ�\��;G�4�&��\�dڶAnZ=���5AȁMk�G����-�$&v��mZ��]c�X�L셚KsjnM,,�{�o�>���nO�GY,�˱�=�^8s��P@l���Li<-�C�P�N��!��R�%���y��� Kcjl͡�4��s���+-��j�q��2�� ���8!3M��Q����K��=—�7�'?zR�~	GVM�"Nc��=4�;��Q�X��Ǥ<�1>�x湧����=v��-C��|xc'{h�>G�
���
K��O�'���X��15��]�W��y7�������5�=zݽ�������7I� �b��V���A��t���>���X^���4�;G	�ׯ�,HJJ�/nK
�HJI�W�ى��Z9���vW�z��Ǒ8
'�=�A(oЃ���ξ�`j/ݫ14�;��~wG��DbΜ������.�Y;�-sb'����3k�D�O��ܙ��ѽ�������c����rF����@-�|GO$3U6�\��f�� &��9nS�I,��D�?�;���Y(bX��$`
x�읋�t�ǵ�^@tZ�^/�W.{Ѓ?hbc�`qZp�X���F
.=)���w�D…1�3�$wl��ك*�����a��4�ٹ E�2Rx�f���lQ8|�n�/��o�u&or����	FA�&�����I�
R�B,�);oJG�\�C�g������������=P"H@�DɺA0���f�^����S���;�i�F�{�x(��{y����y��x�|��A*��vw�OaS��'����9�y�^��}›�=����4@Dk��Wx��8�鸄��VHf����F-��{�(���{����8�`�OC}d��EN`8��W����S���/ξWW��1��%� ����䑺֍]~(c�?�O{c��PkPi�›X�f��C3�ڿzd��o�OvŶS��<y�ή]�����wػw�#{����n�ݰ��:&�w�>,��y�ƫ���J��G�S+V�DΡ,UP���f�2l��,�3��裸�;v�}7�y��W���s��-��v����|Tħ��c8�n�ٴu|�"{1�`��q�x�a���>s��I����M�6-���<O+!{��Q���8o�\D*.c=��,r�fb;���"ӧO�m
�X-"G)�i�a6��
8�)�"0'0�q��2��	R������oA����ǥ8�8��;�A/��S��3X����(@>>Ee��8܂���.�2o§E�O�W}UB7�n�HATG'T��HD9�b������F�)�F�%�S�~)���/�j�*��Ȑ��t7ː(�(s6n��e�ڵ��{J
���a���X��\7�׻b����(���nIEND�B`�PK�X,Wl~��znadplanszy_pl.recipe__license__ = 'GPL v3'
from calibre.web.feeds.news import BasicNewsRecipe


class ZnadPlanszy(BasicNewsRecipe):
    title = u'ZnadPlanszy.pl'
    __author__ = 'fenuks'
    description = u''
    language = 'pl'
    cover_url = 'http://znadplanszy.pl/wp-content/uploads/2013/05/logo-znadplanszy.png'
    use_embedded_content = False
    oldest_article = 14
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_empty_feeds = True
    remove_javascript = True
    remove_attributes = ['style', 'font']
    ignore_duplicate_articles = {'title', 'url'}

    keep_only_tags = dict(name='article')
    feeds = [(u'Wszystkie', 'http://znadplanszy.pl/full-feed/posts/')]
PK�XU�����
zougla.png�PNG


IHDR  D���bPLTE�W�W�W�V��W��X��;�VްO�V�V�V��;��<ҧK�XܯO��X�W��W[H �~9]J!J;J;K;P?Q@TCZH [H![I!bN#kU&oX(qZ(qZ)r[)s[)u]*w_+x_+�m1�q3�x6�{7�}8�~9��:��;��;��;��<
��>��AƝGǞGˡIˢIͤIϤJϤKϥK	ԪLժL֫M׬MجMحN٭NڭNۮOݰP߱O߱P߲P�Q�Q�Q�U�U�U�V
�V�U
�W #%
'�W�V( ( ) 1'=0A4C5��X�Of�tRNS������c6IDATxڅ���0��N�]Aݎ���m۶u����S&��.M��%�k�H���4��w�_C�i���G�6��eDR��:&B`m�n��s�v�]H6�!��a��<>2<4��ˀ�@c\�)*jy��;��N�`,Y�-d�xÕ�HR
W��Ʉ{�e@�����~�mF��k�?��(�J���'�ҖTL��J�ʒk�Jt
�5�-<B%W��yA�S��z�%�?���?�!��*�%� 8���)c1���Ȑ�{�QH]>g��?=�Fg��){Ҷ�tz���P�G��(r�/E�2KfT�AIEND�B`�PK�X"��AA
zougla.recipefrom calibre.web.feeds.news import BasicNewsRecipe


class AdvancedUserRecipe1320264153(BasicNewsRecipe):
    title = u'zougla'
    __author__ = 'Stelios'
    language = 'el'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup = True

    feeds = [(u'zougla', u'http://www.zougla.gr/ArticleRss.xml')]
PK�X�
��zycie_warszawy.png�PNG


IHDR��h6�IDATx�c�O" W�߿��Z['����ݻ�۶�ܱs�%�W�ڿo߅s����SPujRҪ+�nٲ~�Z����7n|��?~������@�Ǐ?�d8z�ȑ�G~��@�KˀښO?q�ڵ���m[�n\�a��M߾}۴iP߿��v=y���q��]�=�ps�hCVFzDhheEőC��jz���T\X����0'3���ΞSSR�,+����Ç�{{����m�op��	��ӧA�ϝ:��۷��(�c��S��4��ξ��Ȇ������S��\��=<���;{��;������������R�.�?����^�xIKcSB\|wg׼�s���p��Y[K���U����g�Z4���\�ׯ^ϛ;ORTl��5�~�fHNHp���:e򔉓����,;�ojF|YQ	РK/�:9#q@�w��	D;�������ܱ����Q%��#q�K:IEND�B`�PK�X(�UB��zycie_warszawy.recipe#!/usr/bin/env python
# -*- coding: utf-8 -*-

__license__ = 'GPL v3'
__copyright__ = u'Łukasz Grąbczewski 2012-2013'
__version__ = '1.2'

'''
zw.com.pl
'''

import re
from calibre.web.feeds.news import BasicNewsRecipe


class zyciewarszawy(BasicNewsRecipe):
    __author__ = u'Łukasz Grączewski'
    title = u'Życie Warszawy'
    description = u'Wiadomości z Warszawy'
    language = 'pl'
    publisher = 'Presspublica'
    publication_type = 'newspaper'
    masthead_url = 'http://www.zw.com.pl/static/img/logo_zw.gif'
    no_stylesheets = True
    remove_javascript = True
    use_embedded_content = False
    remove_empty_feeds = True

    oldest_article = 1.5  # last 36h
    max_articles_per_feed = 100

    feeds = [(u'Najnowsze', u'http://www.zw.com.pl/rss/1.html')]

    keep_only_tags = []
    keep_only_tags.append(dict(name='div', attrs={'id': 'storyp'}))

    remove_tags = []
    remove_tags.append(dict(attrs={'class': 'author'}))
    remove_tags.append(dict(attrs={'class': 'more'}))
    remove_tags.append(dict(attrs={'class': 'clr'}))
    remove_tags.append(dict(attrs={'id': 'adk_0'}))
    remove_tags.append(dict(attrs={'id': 'adsense_0'}))
    remove_tags.append(dict(attrs={'id': 'share_bottom'}))
    remove_tags.append(dict(attrs={'id': 'copyright_law'}))

    preprocess_regexps = [(re.compile(r',3.jpg'), lambda m: ',2.jpg')]

    def print_version(self, url):
        url += "?print=tak"
        return url
PK�X5O-��
��10minutos.pngPK�X#aoI����	10minutos.recipePK�XY�l������180.pngPK�XӦ×�
��180.recipePK�X%9V���1843.pngPK�Xȩ�O����1843.recipePK�X�ͦ||���#20_minutos.pngPK�X�::��
�
���(20_minutos.recipePK�X�3����
��~620minutes.pngPK�XD,��II��r?20minutes.recipePK�X�d�
���F24sata.pngPK�XI�""
���H24sata.recipePK�X��8�
���P3dnews.pngPK�X��+ ��
��!S3dnews.recipePK�XK����	���f7seri.pngPK�X[�Bw;;���g7seri.recipePK�X�_)����^m7x7.pngPK�X�/p�  
��,r7x7.recipePK�X�s�WW��tvDrawAndCook.pngPK�X��wl�	�	���wDrawAndCook.recipePK�X�Jm�BB���TheMITPressReader.pngPK�X�<\*XX��y�TheMITPressReader.recipePK�X
��a!!���aabenraalokalavisen_dk.pngPK�X��dUmm��`�aabenraalokalavisen_dk.recipePK�X
��a!!���aarhuslokalavisen_dk.pngPK�Xćf[\\��_�aarhuslokalavisen_dk.recipePK�X
��a!!���aarhusmidtlokalavisen_dk.pngPK�X��=�����O�aarhusmidtlokalavisen_dk.recipePK�X
��a!!���aarhusnordlokalavisen_dk.pngPK�X���N����x�aarhusnordlokalavisen_dk.recipePK�X
��a!!��F�aarhussydlokalavisen_dk.pngPK�X��T�������aarhussydlokalavisen_dk.recipePK�X
��a!!��\�aarhusvestlokalavisen_dk.pngPK�Xu�wY������aarhusvestlokalavisen_dk.recipePK�X���%%����abc.pngPK�X����**
��Ϳabc.recipePK�XafI���
���abc_au.pngPK�X�x�~~
���abc_au.recipePK�X��Y���
����abc_es.pngPK�X����	�	
����abc_es.recipePK�X�����
��Z�abc_py.pngPK�Xg��	��
���abc_py.recipePK�X<~����x�acrimed.pngPK�X)l0{����acrimed.recipePK�X]Y�a44���ad.pngPK�X�,##	��)�ad.recipePK�X�)���sadevarul.pngPK�X3�9�����adevarul.recipePK�X���k
���adnkronos.pngPK�X�jj�II���adnkronos.recipePK�X?6��++��P#adventuregamers.pngPK�X��/%%���$adventuregamers.recipePK�X*=$����3afr.pngPK�X����XX
��4afr.recipePK�X��D>>���@aftonbladet.pngPK�X}�V{{���Caftonbladet.recipePK�X�
���
���Faif_ru.pngPK�X��B��
���Iaif_ru.recipePK�XI��L{{
���Mainonline.pngPK�X
��5k
k
��*Oainonline.recipePK�XɭNN���\ajc.pngPK�X]=??
��6`ajc.recipePK�X5b�������uajiajin.pngPK�Xkߘ"FF��Nvajiajin.recipePK�X4�������xaksiyon_derigisi.pngPK�XV��R	R	���yaksiyon_derigisi.recipePK�X=zk����<�aktualne.cz.pngPK�X���EE���aktualne.cz.recipePK�XA@:�����u�al_jazeera.pngPK�X�P��bb��x�al_jazeera.recipePK�X[���44��	�al_masry_alyoum_arabic.pngPK�X�p�����u�al_masry_alyoum_arabic.recipePK�X��n{�	�	����al_monitor.pngPK�Xu��������al_monitor.recipePK�XK?�����n�albert_mohler.pngPK�X&������O�albert_mohler.recipePK�X�	4R�
�
���ald.pngPK�X���
�

����ald.recipePK�X0���''����alejakomiksu_com.pngPK�X�f�*���alejakomiksu_com.recipePK�X
��a!!��halleroedlokalavisen_dk.pngPK�XP�?#__���alleroedlokalavisen_dk.recipePK�X�7K'ww��[
alt_om_herning.pngPK�X'�U����alt_om_herning.recipePK�X�_�y���alternet.pngPK�XϮ#V�����alternet.recipePK�X�>YCLL���altomdata_dk.pngPK�X�/�k����X"altomdata_dk.recipePK�X@�FNN	��#&am730.pngPK�X�T�����,am730.recipePK�Xw%�������;amagerbladet_dk.recipePK�XQ�����
���>ambito.pngPK�X��OB�	�	
���?ambito.recipePK�XQ��������Iambito_financiero.pngPK�X'�9����Jambito_financiero.recipePK�X���mm���Vamerican_thinker.pngPK�X2��77��OYamerican_thinker.recipePK�X�e~b��
���_amspec.pngPK�X� ��
���aamspec.recipePK�XG�h�xx���han_druma_mor.recipePK�X��hh
��wjanandtech.pngPK�X
z66��
manandtech.recipePK�X&y!1����nranchorage_daily.pngPK�X������gwanchorage_daily.recipePK�X��Yyy��5{andhrajyothy_ap.pngPK�X)��4�����~andhrajyothy_ap.recipePK�X��Yyy���andhrajyothy_tel.pngPK�XQg��������andhrajyothy_tel.recipePK�X%�Dpaa���android_com_pl.pngPK�X��`�����r�android_com_pl.recipePK�Xx��}����I�animal_politico.pngPK�X�ʎ��	�	��e�animal_politico.recipePK�XU�-��	�	��H�anthony_muroni.pngPK�XUP�(���anthony_muroni.recipePK�Xh�������T�antyweb.pngPK�X!������antyweb.recipePK�X~sj�����"�ap.pngPK�XN�>��
�
	����ap.recipePK�X�]FH������apcom.recipePK�X��2����o�apod.pngPK�Xޙ�II���apod.recipePK�XN⼥��
����app_funds.pngPK�Xk�ި�����app_funds.recipePK�X�6!�{{��t�appledaily_tw.pngPK�X��E�����appledaily_tw.recipePK�X�����
��	aprospect.pngPK�XA�,�����aprospect.recipePK�X?+��  ���ara.pngPK�X���BB
��ara.recipePK�X�c[88���ara_info.pngPK�XHW�����!ara_info.recipePK�X�������%arabian_business.pngPK�X_ȭ�44��j.arabian_business.recipePK�Xd����
���?arbetaren.pngPK�X�0�����Larbetaren.recipePK�X<e�����Oarcadia.pngPK�X_�M����Rarcadia.recipePK�X݉������Varcamax.pngPK�X;��33���]arcamax.recipePK�Xl.a{{��<varizona_republic.pngPK�XU�XG�����}arizona_republic.recipePK�X�������arret_sur_images.pngPK�XW}����ʕarret_sur_images.recipePK�X�,������ars_technica.pngPK�X(�Z�>>����ars_technica.recipePK�X�0�2����-�asahi_shimbun_en.pngPK�X&�����<�asahi_shimbun_en.recipePK�X�TT���asco_de_vida.pngPK�X��p������asco_de_vida.recipePK�X���RR����asia_one.pngPK�X�,/,ll����asia_one.recipePK�X[mj�		����asianreviewofbooks.pngPK�X\=d۝�����asianreviewofbooks.recipePK�X�"r������astro_news_pl.pngPK�X�V�
������astro_news_pl.recipePK�XϽ�������athens_news.pngPK�XT��$
$
����athens_news.recipePK�X�+�������atlantic.pngPK�X�N	�M$M$����atlantic.recipePK�Xf��YY��hatlantic_com.pngPK�XLz��L$L$���atlantic_com.recipePK�Xix������lAattac_es.pngPK�X{T}}��DGattac_es.recipePK�X}���FF���Lauto.pngPK�XHm[��ZTauto.recipePK�X��/��
���[auto_blog.pngPK�X�1+
����:cauto_blog.recipePK�X}���FF���dauto_prove.pngPK�X$a*�
�
��[lauto_prove.recipePK�X�mu����Mzautobild.pngPK�Xc��&::��S|autobild.recipePK�X�-�p�
�
����automatiseringgids.pngPK�X�]�L�����automatiseringgids.recipePK�XW0�hh
����autosport.pngPK�X�b�}BB����autosport.recipePK�X���������avantaje.pngPK�X���O�����avantaje.recipePK�X�[�44����aventurilapescuit.pngPK�X9�)+����^�aventurilapescuit.recipePK�X�j���
����avisen_dk.pngPK�X�����^�avisen_dk.recipePK�XTA�������avto-magazin.pngPK�X��l������avto-magazin.recipePK�X��
Ǯ�
����azstarnet.pngPK�X��^�a	a	��t�azstarnet.recipePK�XX�\�����b365realitatea.pngPK�Xf#��ee����b365realitatea.recipePK�X�"������b92.pngPK�X��W�^
^

����b92.recipePK�XQIJJ
��9�ba_herald.pngPK�X���//����ba_herald.recipePK�X:�f������babyonline.pngPK�X��l�����babyonline.recipePK�XC��pp����badania_net.pngPK�Xa2D����|�badania_net.recipePK�X�Rï����L�baikaljournal.pngPK�X<԰����
�baikaljournal.recipePK�X1~�22���balkaninsight.pngPK�X��9J
J
��Xbalkaninsight.recipePK�XD�_--
���balkanist.pngPK�X6�g����,balkanist.recipePK�X	;~�����baltimore_sun.pngPK�Xx�zK�����baltimore_sun.recipePK�XЈ��))���4bangkok_biz.pngPK�X�Q�i����C6bangkok_biz.recipePK�X�'6X����M;bangkokpost.pngPK�XՕ��QQ��yAbangkokpost.recipePK�X�q\ɣ����Hbankier_pl.pngPK�Xa�����Ibankier_pl.recipePK�Xl������Qbar_and_bench.pngPK�Xk��q�	�	��
Ubar_and_bench.recipePK�X�������^barrons.pngPK�X��������_barrons.recipePK�X�s����rbay_citizen.pngPK�X�:S���vbay_citizen.recipePK�Xq$�XX��~bbc.pngPK�Xv�5= 6 6
���~bbc.recipePK�X��íee��Ӵbbc_brasil.pngPK�X��}�~~��d�bbc_brasil.recipePK�X��íee
��5bbc_es.pngPK�X1h�1��
���5bbc_es.recipePK�X�fk������=bbc_fast.pngPK�X�r,ff���>bbc_fast.recipePK�Xq$�XX
��Xbbc_ru.pngPK�X�C&Ɠ�
���Xbbc_ru.recipePK�X�fk���
��Q\bbc_sport.pngPK�XU1��
�
��,]bbc_sport.recipePK�Xq$�XX
��Ykbbc_uk.pngPK�X7�rr
���kbbc_uk.recipePK�X��íee��vobbcvietnamese.pngPK�XK�M���
pbbcvietnamese.recipePK�X�8Va����<ubellingcat_en.pngPK�X��Y���`vbellingcat_en.recipePK�X�8Va����)|bellingcat_es.pngPK�X1�]l����M}bellingcat_es.recipePK�X�8Va�����bellingcat_fr.pngPK�X5u�����4�bellingcat_fr.recipePK�X�8Va����C�bellingcat_ru.pngPK�XfV�iY
Y
��g�bellingcat_ru.recipePK�X�8Va�����bellingcat_uk.pngPK�Xē�	�
�
���bellingcat_uk.recipePK�X~�#������benchmark_pl.pngPK�Xۢ��%
%
���benchmark_pl.recipePK�X�;���
�
��;�beppe_grillo.pngPK�Xc҅�����7�beppe_grillo.recipePK�XQ$M0~~��@�berliner_zeitung.pngPK�X���`rr����berliner_zeitung.recipePK�X�"н�����berlingske_dk.pngPK�X�>�L������berlingske_dk.recipePK�X΅A��
����berria.pngPK�X��~�
����biamag.pngPK�X�H���
����biamag.recipePK�X��~�
����biamag_en.pngPK�X^#(�����biamag_en.recipePK�X��~�
��$�bianet.pngPK�X5��
��b�bianet.recipePK�XFP�-����F�big_oven.pngPK�X�I500��d�big_oven.recipePK�X�E�rr���big_picture.pngPK�X��:2����`big_picture.recipePK�X,055��6biggovernment.pngPK�X��w|--���
biggovernment.recipePK�X,055���
bighollywood.pngPK�X(�����\bighollywood.recipePK�Xk����~bild_de.pngPK�X=�SPZZ���bild_de.recipePK�XP�v���<,billorielly.pngPK�X��v00��|-billorielly.recipePK�X�0�����8birgun_gazetesi.pngPK�X��5�����;birgun_gazetesi.recipePK�X%W�pp���Bbirmingham_evening_mail.pngPK�X&�@|�
�
���Dbirmingham_evening_mail.recipePK�X����&&���Obirmingham_post.pngPK�X	k�����Rbirmingham_post.recipePK�X�~7g�����Ybitacora.recipePK�X���abiz_portal.pngPK�X,q������Kebiz_portal.recipePK�X
B>	��<mblesk.pngPK�X��x�__��unblesk.recipePK�X��������ublic.pngPK�X�X�����wblic.recipePK�X��ߜ���Ԇbloomberg-business-week.pngPK�X�4��&�&����bloomberg-business-week.recipePK�X��ߜ�
����bloomberg.pngPK�X���X'X'����bloomberg.recipePK�X%7�	11��	�bookforummagazine.pngPK�X}
�jj��m�bookforummagazine.recipePK�X�=���
��
�boortz.pngPK�X�^�ww
����boortz.recipePK�X�jK������borse_online.pngPK�X&LMM����borse_online.recipePK�X�.��VV
���borsen_dk.pngPK�X��Ifrr����borsen_dk.recipePK�X6��		��8�boston.com.pngPK�XϺ�yy��m�boston.com.recipePK�X�~��**!��boston_globe_print_edition.recipePK�XtJ(����~&boxis.recipePK�X������s(bq_prime.pngPK�X9�����B.bq_prime.recipePK�X�������H4brand_eins.pngPK�X4�
����J6brand_eins.recipePK�XV�������YHbrasil_de_fato.pngPK�X��X4����\Lbrasil_de_fato.recipePK�X0}L5ll��qQbreaking_mad.recipePK�X�LUx<<��Xbreakingmad.pngPK�XI�Ms��
��wYbrecha.pngPK�XGZM
��#\brecha.recipePK�X��6 ����Yjbrewiarz.pngPK�X,X�eOO��Hmbrewiarz.recipePK�X��Kz��ąbrhat.recipePK�X�[�|^^��m�brigitte_de.pngPK�X���������brigitte_de.recipePK�X��@����ܑbsi_news.pngPK�X3��
�
��ܖbsi_news.recipePK�X�('‘�	��ۡbt_dk.pngPK�Xǃ�9ee����bt_dk.recipePK�X0Ĭ���
��"�bucataras.pngPK�X�oМ������bucataras.recipePK�X�N�@������buchreport.pngPK�X�ٝMM����buchreport.recipePK�X�	��[[��/�buckmasters.pngPK�X���������buckmasters.recipePK�Xj]�M�����buenosaireseconomico.pngPK�X�똈����:�buenosaireseconomico.recipePK�X��_
_
��L�buffalo_news.recipePK�XK�������buffalonews.pngPK�X��+������bugun_gazetesi.recipePK�X���;MM����business_insider.pngPK�X��4�\	\	��%�business_insider.recipePK�XC�b������business_standard.pngPK�XH0B������business_standard.recipePK�XC�b����q
	business_standard_print.pngPK�Xgy�_����o
	business_standard_print.recipePK�X�AL�����!	business_today.pngPK�Xj���rr���$	business_today.recipePK�X�d1�����e3	businessworldin.pngPK�X�؞Z>>���4	businessworldin.recipePK�XIC�O�����8	cachys_blog.recipePK�X��_|����"=	cacm.pngPK�X��Pn�����=	cacm.recipePK�X�Fe&���A	cafcaf_dergisi.pngPK�X�#r�bb��J	cafcaf_dergisi.recipePK�X�lg#��
���K	calcalist.pngPK�Xx��
�
���L	calcalist.recipePK�X�6��;;���Z	calgary_herald.pngPK�X�Q�>4>4���^	calgary_herald.recipePK�X/�OO��m�	camera_di_commercio_di_bari.pngPK�XƝ�)"����	camera_di_commercio_di_bari.recipePK�X�{�''����	canardpc.pngPK�X�L����	�	canardpc.recipePK�Xd���||��ӥ	capes_n_babes.recipePK�X�T2�������	capital.pngPK�X�k�>������	capital.recipePK�X� bgg��e�	capital_de.pngPK�XoCTE�
�
����	capital_de.recipePK�X�������	capital_gr.pngPK�Xy"h����	capital_gr.recipePK�X`I�`�����	caravan_magazine.pngPK�X�05�``����	caravan_magazine.recipePK�X`I�`����|�	caravan_magazine_hindi.pngPK�X�|˜���[�	caravan_magazine_hindi.recipePK�X������	��2�	carta.pngPK�Xf�U�JJ���	carta.recipePK�X�d������
catavencii.pngPK�XS�����
catavencii.recipePK�X�
/[[
���

catavencu.pngPK�X����JJ��o
catavencu.recipePK�X��ѷ�����
catholic_daily_readings.pngPK�X�%������
catholic_daily_readings.recipePK�X
�������
catholic_news_agency.pngPK�X�V�����
catholic_news_agency.recipePK�X��A33���
cato.pngPK�X���=�����
cato.recipePK�X�Lc�����,
cbc_canada.pngPK�X�L!55���/
cbc_canada.recipePK�X{�255��I3
cbn.pngPK�X���ll
���5
cbn.recipePK�X��g�33
��7A
cd_action.pngPK�X�+�������C
cd_action.recipePK�X4������H
cdrinfo_pl.pngPK�X���3����JK
cdrinfo_pl.recipePK�X���CC	��HX
cedar.pngPK�X�=-O__���c
cedar.recipePK�X�m둹
�
��;j
ceska_pozice.recipePK�X�B�ii��%u
ceskapozice.pngPK�X��66���}
ceske_noviny.pngPK�X���.�����
ceske_noviny.recipePK�X�j������
cesky_rozhlas_6.pngPK�X��>�88���
cesky_rozhlas_6.recipePK�XgRG���]�
cetnixploitation.recipePK�XGG����
����
cgm_pl.pngPK�Xf�||
��q�
cgm_pl.recipePK�X�ǻ������
champion.pngPK�Xu�����2�
champion.recipePK�X��n���
��W�
cherta.pngPK�X���SS
���
cherta.recipePK�X����������
chetnixploitation.pngPK�X�X�]]��Į
chicago_breaking_news.pngPK�X���OO��X�
chicago_breaking_news.recipePK�X
�''���
chicago_tribune.pngPK�X,t���
�
��9�
chicago_tribune.recipePK�X���n::��:�
china_economic_net.pngPK�X��!�==����
china_economic_net.recipePK�X�z������
china_post.pngPK�X4�= �����
china_times.pngPK�X�GB�����
china_times.recipePK�X��AU�����
chinadaily.pngPK�X�e���
��1�
chipro.pngPK�X0��q��
����
chipro.recipePK�X"��k[[
����
chosun.pngPK�X�\""
��<�
chosun.recipePK�X�7����	����
chowk.pngPK�X�*�__����
chr_mon.pngPK�X�������+�
chr_mon.recipePK�Xku�|���
christian_post.pngPK�Xr�3ss��S�
christian_post.recipePK�X�VT�||���chronicle_higher_ed.pngPK�X��l�
�
���chronicle_higher_ed.recipePK�X�v��
���cicero.pngPK�X�{��
�

���cicero.recipePK�XP�5�JJ���%cincinnati_enquirer.pngPK�X��/`e	e	��/.cincinnati_enquirer.recipePK�XCZlT�����7cinco_dias.pngPK�X\�Z-
-
���;cinco_dias.recipePK�X#�J}����6Icinebel_be.pngPK�XC��7yy��
Lcinebel_be.recipePK�XBq�KK���Qcio.pngPK�X0-����
��"Vcio.recipePK�X
�7ll��ncio_magazine.pngPK�X��������rcio_magazine.recipePK�X.&s�QQ����ciperchile.pngPK�X!�Em����#�ciperchile.recipePK�X&�C����cityavisen_dk.pngPK�X�޼���#�cityavisen_dk.recipePK�XV�-''���cjr.pngPK�X�EUJ��
��]�cjr.recipePK�Xܓ#�HH
��(�clarin.pngPK�X�?�Voo
����clarin.recipePK�X���ό���2�clarion_ledger.pngPK�X�1�����clarion_ledger.recipePK�X�Y�ww��8�clic_rbs.pngPK�X]1r5
5
����clic_rbs.recipePK�X��		��;�climate_progress.recipePK�XT)<N������cm_journal.pngPK�X��[ˡ�����cm_journal.recipePK�XO��;��
����cnetjapan.pngPK�X?A
��Y�cnetjapan.recipePK�XO��;������cnetjapan_digital.pngPK�X�������d�cnetjapan_digital.recipePK�XO��;����qcnetjapan_release.pngPK�X������Ncnetjapan_release.recipePK�XO��;����;cnetnews.pngPK�Xm��7����cnetnews.recipePK�XU������ cnn.pngPK�X�?��0	0	
��	#cnn.recipePK�X"��L����a,coda.pngPK�X�"[__���.coda.recipePK�X"��L����3coda_ru.pngPK�X\�U��05coda_ru.recipePK�X	glGG��p=coding_horror.pngPK�X�(-�����>coding_horror.recipePK�X�S�V��	���Bcolta.pngPK�X4��fpp���Ccolta.recipePK�X��s����=Hcolumbusdispatch.pngPK�X��''���Jcolumbusdispatch.recipePK�XL���..��OScommon_dreams.pngPK�X������Wcommon_dreams.recipePK�XI]Zww���ecomputerworld_dk.pngPK�XD�JJ���hcomputerworld_dk.recipePK�XlZ������tcomputerworld_pl.pngPK�XE!�����ucomputerworld_pl.recipePK�X4>�Ը����yconsortium_news.pngPK�XֹE�

���|consortium_news.recipePK�XI�Z���"���contemporary_argentine_writers.pngPK�X���؀�%�� �contemporary_argentine_writers.recipePK�X���D���contropiano.pngPK�XO2
�ss���contropiano.recipePK�Xp��7����corriere_della_sera_en.pngPK�Xp���jj��
�corriere_della_sera_en.recipePK�Xp��7����corriere_della_sera_it.pngPK�X*�0����corriere_della_sera_it.recipePK�X��k����K�corriere_dello_sport.pngPK�X~dfdd��|�corriere_dello_sport.recipePK�XJ�H������cosmopolitan.pngPK�XG�
o

��A�cosmopolitan.recipePK�X3�m�������cosmopolitan_de.pngPK�X�'
�pp��~�cosmopolitan_de.recipePK�X��������"�cosmopolitan_uk.pngPK�X�P��

��)�cosmopolitan_uk.recipePK�X�։�
��g�cosmos.pngPK�X�/�/;;
����cosmos.recipePK�X�Ⅵ||���cotidianul.pngPK�X�F�	�	����cotidianul.recipePK�X�S3�������counterpunch.pngPK�Xc��11����counterpunch.recipePK�X�e������countryfile.pngPK�XR�X�������countryfile.recipePK�X��T;CC����courier_mail.pngPK�X�32cc���
courier_mail.recipePK�X�D�
	
	���
courrier.pngPK�Xc����
courrier.recipePK�XKO�>>���
courrierinternational.pngPK�X�M�::��q
courrierinternational.recipePK�X�8Mڶ����%
cracked_com.pngPK�X�y|K�����*
cracked_com.recipePK�X�l{����{7
credit_slips.pngPK�X�������PD
credit_slips.recipePK�Xݡ��
��KJ
crikey.pngPK�X�ȭ!AA
��WN
crikey.recipePK�X�o����T
cronica.pngPK�X@�ƈ�
�
���V
cronica.recipePK�X���������a
csid.pngPK�Xj�E]		���b
csid.recipePK�X"2H�WW��h
ct24.pngPK�Xk�j@�����j
ct24.recipePK�X!�Ng����<n
cubadebate.pngPK�X-,�
�����p
cubadebate.recipePK�X�Y��__���w
cumhuriyet.pngPK�X�� �����[{
cumhuriyet.recipePK�X�o������n�
curierulnational.pngPK�X�ڤ�]]��y�
curierulnational.recipePK�X�Ǩ�����
currenttime.pngPK�Xs��Xrr��ь
currenttime.recipePK�XI�Z�����s�
cvecezla.pngPK�X�������w�
cvecezla.recipePK�Xy�77��e�
cyberpresse.pngPK�X�c��	�	��ɯ
cyberpresse.recipePK�X	l��������
cynewslive.recipePK�X. 2JJ��{�
cyprus_weekly.pngPK�X��  ����
cyprus_weekly.recipePK�Xp!�����,�
czas_gentlemanow.pngPK�XS�OO��@�
czas_gentlemanow.recipePK�X�.R�FF����
dachauer_nachrichten.pngPK�X9_�H����@�
dachauer_nachrichten.recipePK�Xՙ��%%��r�
dagens_industri.pngPK�X��wff���dagens_industri.recipePK�X7�8�oo��bdagensmedicin_dk.pngPK�X ��

��	dagensmedicin_dk.recipePK�X��MT--��Bdagenspharma_dk.pngPK�XB��$$���dagenspharma_dk.recipePK�X�W%q�����daily_express.pngPK�X� 3���daily_express.recipePK�X�ۑ]((��:*daily_mail.pngPK�X ������,daily_mail.recipePK�X�ɻ�����4daily_mirror.pngPK�Xx�}o�����5daily_mirror.recipePK�X������Ddaily_telegraph.pngPK�X�g�))���Fdaily_telegraph.recipePK�XP�`55���Wdaily_writing_tips.pngPK�X�|�����dZdaily_writing_tips.recipePK�X�t������^\dailyreckoning.pngPK�X�u��vv��w_dailyreckoning.recipePK�XqF#C�� edailytportal.pngPK�X�ڏ/��]fdailytportal.recipePK�X�������ndainik_bhaskar.pngPK�X>Ο�����ztdainik_bhaskar.recipePK�XL����
���|dallas.pngPK�X���HH
����dallas.recipePK�X�9v�	��	�danas.pngPK�Xe^;;��3�danas.recipePK�X��������dark_horizons.pngPK�XFʂB,,����dark_horizons.recipePK�XK��������dark_reading.pngPK�XfF�#����dark_reading.recipePK�Xٚ�TT��0�darknet.pngPK�X��__����darknet.recipePK�X�Km��
��8�data_news.pngPK�Xr%������data_news.recipePK�Xbj4,��
���datasport.pngPK�X'�������datasport.recipePK�X^��FF����daum_net.pngPK�X�,iWW��2�daum_net.recipePK�X�!�������dawn.pngPK�X?�jX����dawn.recipePK�X��_,--���daytona_beach.pngPK�Xw��0;;��l�daytona_beach.recipePK�X������dbb.pngPK�X��<+��
���dbb.recipePK�X&�Ӡ�����
de_redactie_be.pngPK�XrE<����de_redactie_be.recipePK�XWk�9  ��de_standaard.pngPK�X������ade_standaard.recipePK�X��~|==��M,deadspin.pngPK�X�l�����1deadspin.recipePK�X?*�DD��z5debunkingdenialism.pngPK�Xk�OO���=debunkingdenialism.recipePK�XmOA�::��xDdeccan_herald.pngPK�X~X-yy���Fdeccan_herald.recipePK�X��!�����Rdefensenews.pngPK�X��/����pXdefensenews.recipePK�X�s�v����9`degentenaar.pngPK�X+������bdegentenaar.recipePK�Xk(�--��ndelco_times.pngPK�X��=����utdelco_times.recipePK�X��Y�88��Fwdemagog.cz.pngPK�XRB������zdemagog.cz.recipePK�X�����{democracy_journal.pngPK�XQ�Cc����c�democracy_journal.recipePK�X*)����;�democracy_now.pngPK�X�F��xx����democracy_now.recipePK�X�k�����-�demorgen_be.pngPK�XF	Q����/�demorgen_be.recipePK�X�z]�		���den_of_geek.pngPK�X��e�����L�den_of_geek.recipePK�X��,]]��o�denik.cz.pngPK�X��=������denik.cz.recipePK�X"�Kff���denik_referendum.pngPK�Xw��Hrr����denik_referendum.recipePK�Xj��&��
��R�denikn.cz.pngPK�X�е�r
r
��w�denikn.cz.recipePK�X#�T�����denver_post.pngPK�Xx�C44���denver_post.recipePK�X���������der_standard.pngPK�XOL������der_standard.recipePK�X�
�����k�deredactie.pngPK�XwSC�O
O
��:�deredactie.recipePK�XK�ឆ�����derin_dusunce.pngPK�XS7sUU��m�derin_dusunce.recipePK�Xc�6��
����descopera.pngPK�X�9������descopera.recipePK�X�Pt����v�descopera_org.pngPK�XZb7�����descopera_org.recipePK�X*i�������desiring_god.pngPK�X
Ś�������desiring_god.recipePK�X4-�	���detroit_news.pngPK�X�վ�EE��9detroit_news.recipePK�X��%�����deutsche_welle_bs.pngPK�X��5������deutsche_welle_bs.recipePK�X��%�����deutsche_welle_de.pngPK�X��ͧ����� deutsche_welle_de.recipePK�X��%����b'deutsche_welle_en.pngPK�X�������A*deutsche_welle_en.recipePK�X��%����H0deutsche_welle_es.pngPK�X�2G�]]��'3deutsche_welle_es.recipePK�X��%�����9deutsche_welle_hr.pngPK�X�G1Ktt���<deutsche_welle_hr.recipePK�X��%����CBdeutsche_welle_pt.pngPK�X/n������"Edeutsche_welle_pt.recipePK�X��%����Jdeutsche_welle_ru.pngPK�X�gT������Ldeutsche_welle_ru.recipePK�X��%�����]deutsche_welle_sr.pngPK�X�Rl�����`deutsche_welle_sr.recipePK�X�3\\���gdeutschland_funk.recipePK�X���B����{zdeveloppez.pngPK�X�T�j����7|developpez.recipePK�X�[Z����!dhnet_be.pngPK�Xa�[T������dhnet_be.recipePK�X"�h����ˆdi.pngPK�XW�KK	��Ljdi.recipePK�X!������9�diagonal.pngPK�XU�1€���,�diagonal.recipePK�X`�	�kk��ٝdiario_cordoba.pngPK�X��j����t�diario_cordoba.recipePK�X
|Y����g�diario_de_noticias.pngPK�X��ɦ����5�diario_de_noticias.recipePK�XD�@����/�diario_el_pueblo.pngPK�X2��EJJ��W�diario_el_pueblo.recipePK�X�������diario_extra.pngPK�X����		����diario_extra.recipePK�X_��k��!�diario_ibiza.pngPK�X��+"����b�diario_ibiza.recipePK�X0�ll����diario_la_republica.pngPK�X��}}��.�diario_la_republica.recipePK�X�2]�����diario_sport.pngPK�X@9s?\\���diario_sport.recipePK�X9;;����diariovasco.pngPK�X{	�@@���diariovasco.recipePK�X��٬��
����diepresse.pngPK�X�k��		��Z�diepresse.recipePK�X���L������digit_magazine.pngPK�X5��L
L
����digit_magazine.recipePK�X��
H�
�
��digital_arts.pngPK�X�0������=digital_arts.recipePK�X"RL]ii���digitaljournal.pngPK�X���H���digitaljournal.recipePK�X-�58�����&digitalspy_uk.pngPK�X�K����(digitalspy_uk.recipePK�Xk9������.digizone.pngPK�X�:������0digizone.recipePK�X��������
6dilbert.pngPK�X,�UCC��7dilbert.recipePK�Xo��Q�����Bdilemaveche.pngPK�X�pJJ��cDdilemaveche.recipePK�XƟ������_dingoo_a320.recipePK�X�^�����cdiscover_magazine.pngPK�X�p�݋����fdiscover_magazine_monthly.pngPK�X���,�� ���idiscover_magazine_monthly.recipePK�XE�w�����~disinformatico.pngPK�X��R:CC���disinformatico.recipePK�X��VR��I�distrowatch_weekly.pngPK�XE�{{����distrowatch_weekly.recipePK�X&>��VV��6�divahair.pngPK�X�v��^^����divahair.recipePK�XE���ii��A�djurslandsposten_dk.pngPK�Xy��G����ߜdjurslandsposten_dk.recipePK�X��	����dn_se.pngPK�X��5$$���dn_se.recipePK�X�7�����1�dna.pngPK�X�u#		
��I�dna.recipePK�X�xuNN��z�dnevni_avaz.pngPK�X��sNN����dnevnik.pngPK�X�a`��l�dnevnik.recipePK�X��g�uu����dnevnik_cro.pngPK�X{x̴

��W�dnevnik_cro.recipePK�X��u+������dnevnik_mk.recipePK�XE�w������dobanevinosti.pngPK�XXV�d������dobanevinosti.recipePK�X�OfV������dobreprogamy.pngPK�X��,PP��v�dobreprogamy.recipePK�X��)�����doghousediaries.pngPK�Xa�y����D�doghousediaries.recipePK�X������l�dominion.pngPK�X0�������0dominion.recipePK�X\�\WHH	��H	donga.pngPK�X���##���donga.recipePK�X�.R�FF��dorfener_anzeiger.pngPK�X�J�11��}dorfener_anzeiger.recipePK�XE�w�����'dosisdiarias.pngPK�X���VV��
)dosisdiarias.recipePK�X�ť�����,dot_net.pngPK�X�L�LL��b.dot_net.recipePK�X����
���6dotpod.pngPK�X�����
���>dotpod.recipePK�XV�2���	���Adovod.pngPK�X�|�����Ddovod.recipePK�X{A�x��Mdown_to_earth.recipePK�X>0�$$��_Pdowntoearth.pngPK�XPXs���	���Sdr_dk.pngPK�Xt��[[��hTdr_dk.recipePK�Xpx&�))���kdrivelry.recipePK�X��s�ll��Cpdrytooling_pl.pngPK�X�®Wff���rdrytooling_pl.recipePK�X
��UU��vvdunya_bizim.pngPK�X�LJ���zdunya_bizim.recipePK�X����&
&
��>�dunya_bulteni.pngPK�X��tt����dunya_bulteni.recipePK�X���I�	�	��9�dunyahalleri.pngPK�X�G�����dunyahalleri.recipePK�X���I�	�	���dunyahalleri_haftaninozeti.pngPK�XFd�)�(�(!����dunyahalleri_haftaninozeti.recipePK�X�7Ŵ�����dvhn.pngPK�Xҧ�����dvhn.recipePK�X�(�cc��X�dwutygodnik.pngPK�X'�9������dwutygodnik.recipePK�X�8�t..
���dzieje_pl.pngPK�Xۤ`���
dzieje_pl.recipePK�XwR�����Ldziennik_baltycki.pngPK�X0��ee��^dziennik_baltycki.recipePK�X�1����$dziennik_lodzki.pngPK�X?U]��	�	��6&dziennik_lodzki.recipePK�X.�"?����0dziennik_pl.pngPK�XG�

���2dziennik_pl.recipePK�X�V�S����Bdziennik_polski.pngPK�X3�f������Ddziennik_polski.recipePK�Xt#�����]dziennik_wschodni.pngPK�X�^Q����*^dziennik_wschodni.recipePK�XL	�@�����odziennik_zachodni.pngPK�X�"-�	�	��qdziennik_zachodni.recipePK�X2'�����${dziennikzwiazkowy.pngPK�X�?������"~dziennikzwiazkowy.recipePK�X
��a!!����ebeltoftlokalavisen_dk.pngPK�X��}}��V�ebeltoftlokalavisen_dk.recipePK�X�.R�FF���ebetrsberger_zeitung.pngPK�X�QL0]]����ebetrsberger_zeitung.recipePK�Xtc���
�� �echo_dnia.pngPK�X6��?���echo_dnia.recipePK�Xkf�%��J�echo_moskvy.pngPK�X�U�����~�echo_moskvy.recipePK�X\\�-������echo_online.pngPK�X,�߫<<����eclipseonline.pngPK�X��m���eclipseonline.recipePK�X(�__��2�ecogeek.recipePK�X��>�GG����economia.pngPK�Xt?���.�economia.recipePK�X���
��g�economico.pngPK�X�bt����economico.recipePK�X�C��
����economist.pngPK�X|�nl$3$3���economist.recipePK�X�FE'��Ueconomist_espresso.pngPK�X�hG��	�	���economist_espresso.recipePK�X|�nl$3$3���#economist_free.recipePK�X�C�����Veconomist_world_ahead.pngPK�X���/�0�0��Zeconomist_world_ahead.recipePK�X���GG���ecotrend.pngPK�X9K�8NN��s�ecotrend.recipePK�X�1�xx���ecuisine.pngPK�X��U�ZZ����ecuisine.recipePK�XY�ٻ�
���edebistan.pngPK�X��3bb����edebistan.recipePK�XK�ឆ�����edebiyat_haber.pngPK�X��������C�edebiyat_haber.recipePK�X�"4����l�edge_conversations.pngPK�X�|yJ������edge_conversations.recipePK�Xa�nƤ�����editor_and_publisher.pngPK�X������q�editor_and_publisher.recipePK�X��|NN��P�editoriali.pngPK�X1�!5QQ��ʴeditoriali.recipePK�X�Y�<<��J�edmonton_journal.pngPK�X����3�3����edmonton_journal.recipePK�X���yy
����eenadu.pngPK�X����
��h�eenadu.recipePK�X���yy
��p
eenadu_ap.pngPK�X>����eenadu_ap.recipePK�X
��a!!��[(egedallokalavisen_dk.pngPK�X'���~~���+egedallokalavisen_dk.recipePK�X��m��	��i1egirl.pngPK�X������3egirl.recipePK�X�w&���	��X7eioba.pngPK�X��??��F:eioba.recipePK�XlX��[[
���?ekantipur.pngPK�Xh4�����5Gekantipur.recipePK�Xo�������`Mekathemerini.pngPK�X#N�[����%Pekathemerini.recipePK�XGpp���Xekologia_pl.pngPK�X�+�Е����Zekologia_pl.recipePK�X�.�����Q`ekot.pngPK�X�`H�����bekot.recipePK�X��ǘ����gel_colombiano.pngPK�X�x��HH���jel_colombiano.recipePK�X��77��wel_confidencial.recipePK�XV�Ć
����el_correo.pngPK�X��>����ďel_correo.recipePK�X��<��
�
����el_cultural.recipePK�X�VJJ
����el_diario.pngPK�X,������el_diario.recipePK�XH��jXX��Z�el_diplo.pngPK�Xa
/������el_diplo.recipePK�X�C��YY����el_economista.recipePK�XHry77��<�el_espectador.pngPK�X)�������el_espectador.recipePK�X`J�������el_faro.pngPK�Xq��;������el_faro.recipePK�X�co����X�el_malpensante.pngPK�X<�-J����/el_malpensante.recipePK�X�A�33��Ael_mercurio_chile.pngPK�X�h&]
]
���el_mercurio_chile.recipePK�X��ws����:el_mostrador.pngPK�Xr{W����el_mostrador.recipePK�X��v�GG���el_mundo_co.pngPK�X��QNN��`el_mundo_co.recipePK�X�Ma11���'el_mundo_today.pngPK�X�]�����?+el_mundo_today.recipePK�X�;�44��[1el_nacional.pngPK�X$JZGG���4el_nacional.recipePK�X1ډ%jj��38el_observador.pngPK�X]iڷ����:el_observador.recipePK�X��������Bel_pais.pngPK�X�LW�]]���Cel_pais.recipePK�X�������.Uel_pais_babelia.pngPK�X$vC�>>��
[el_pais_babelia.recipePK�X�-�����cel_pais_uy.pngPK�X\&wu

���jel_pais_uy.recipePK�X��F*���tel_periodico.pngPK�X��NN��zel_periodico.recipePK�Xi��##����el_publico.pngPK�XuxW<�����el_publico.recipePK�X��H�RR
��™el_tiempo.pngPK�X�' 

��?�el_tiempo.recipePK�X{���bb��z�el_universal.pngPK�X~�L�	�	��
�el_universal.recipePK�XH�r�\\��7�elclubdelebook.pngPK�X�vFess����elclubdelebook.recipePK�X����t
t
��i�elcohetealaluna.pngPK�X�s���elcohetealaluna.recipePK�X���L77��P�elcomercio.pngPK�X�|z�RR����elcomercio.recipePK�X�5YY��4�elcronista-arg.pngPK�X���������elcronista-arg.recipePK�X�P�Y{{����ele.pngPK�X�/H��
��q�ele.recipePK�X��7�����.�elektroda_pl.pngPK�X�ݯK����#�elektroda_pl.recipePK�X]������.elet_es_irodalom.pngPK�XY��	�	���elet_es_irodalom.recipePK�X�������
elmundo.pngPK�X��
�����elmundo.recipePK�X*�L������"elpais_impreso.pngPK�Xl�O^��
%elpais_impreso.recipePK�X
37e����\6elpais_semanal.pngPK�X��9�pp���8elpais_semanal.recipePK�X�ژ�..��$@elperiodico_catalan.pngPK�X�ژ�..���Aelperiodico_spanish.pngPK�XB�
�����Belperiodico_spanish.recipePK�X��7������Nelsevier.pngPK�X5�u��	�	���Pelsevier.recipePK�X&�]77���Zeltiempo_hn.pngPK�X�W����H]eltiempo_hn.recipePK�X)�)S����deluniversal_ve.pngPK�XX�I
�
�
���deluniversal_ve.recipePK�X��$`�����oeluniverso_ec.pngPK�XnF���	�	���peluniverso_ec.recipePK�X󡬵��
���zemg_en.pngPK�X�;Mgll
��w|emg_en.recipePK�X龽���empire_magazine.pngPK�X(�ė���X�empire_magazine.recipePK�X������#�en_globes_co_il.recipePK�X�dN��
���endgadget.pngPK�X�;PR�����endgadget.recipePK�X�dN������endgadget_ja.pngPK�X������Ūendgadget_ja.recipePK�Xw�B���}�entrepeneur.pngPK�X�l�	������entrepeneur.recipePK�Xd�K޿���o�eos_wetenschap.pngPK�X�$**����^�eos_wetenschap.recipePK�X��\�����epl_talk.pngPK�Xs����	�epl_talk.recipePK�X��Ł���G�epoch_times.pngPK�X��P99����epoch_times.recipePK�Xϴ|�rr��^�epw.pngPK�X-�U��
����epw.recipePK�Xϴ|�rr����epw_magazine.pngPK�X�����w�epw_magazine.recipePK�X���l������equestria_daily.pngPK�Xy'!�����equestria_daily.recipePK�X�.R�FF���erdinger_anzeiger.pngPK�X�A�����(	erdinger_anzeiger.recipePK�X��������erhvervs_avisen_dk.pngPK�X��}�<<���erhvervs_avisen_dk.recipePK�X
��a!!��-!esbjerglokalavisen_dk.pngPK�X�4h=�����$esbjerglokalavisen_dk.recipePK�Xv�))
��K*esenja.pngPK�Xd<ti��
���+esenja.recipePK�XQ4I�88��wEesensja_(rss).pngPK�XX4������Fesensja_(rss).recipePK�X��!�hh
���Xeso_pl.pngPK�X���%%
��=[eso_pl.recipePK�X3}��55���`espn.pngPK�X_V�<�
�
���xespn.recipePK�X�������esquire.pngPK�X���������esquire.recipePK�X=`�00����estadao.pngPK�X�%…�����estadao.recipePK�X�[鋴����eu_commission.pngPK�X,�˯B
B
��ʣeu_commission.recipePK�Xp��GG��>�europa_press.pngPK�X�c'�������europa_press.recipePK�X 	��DD
����europasur.pngPK�XZ���

��"�europasur.recipePK�X8�jff��_�evangelizo.pngPK�X;a�%������evangelizo.recipePK�X��Y  ���everett_herald.pngPK�X߶Ԃ``��i�everett_herald.recipePK�X�cT&&
����evz.ro.pngPK�X0>rr
��J�evz.ro.recipePK�X�#b��
����exiled.pngPK�X���55
����exiled.recipePK�X�J��ZZ���expansion_spanish.pngPK�Xe%�%%����expansion_spanish.recipePK�X������explosm.pngPK�XQ
�����explosm.recipePK�X���%%��express_de.pngPK�X��/�����Uexpress_de.recipePK�X��;����{)f1_ultra.pngPK�X��k[�����*f1_ultra.recipePK�X�s�����1f_secure.pngPK�X^�I���4f_secure.recipePK�XY'�mhh
��8factcheck.pngPK�XC��jSS���:factcheck.recipePK�X���4����,=fairbanks_daily.pngPK�X��VV��X@fairbanks_daily.recipePK�X<��qq���Efan_graphs.pngPK�XJޔ���Gfan_graphs.recipePK�Xq�y�����Lfastcompany.pngPK�X�������`fastcompany.recipePK�Xh�ѣ����ifavrskovavisen_dk.pngPK�X�@�����jfavrskovavisen_dk.recipePK�X
��a!!���lfavrskovlokalavisen_dk.pngPK�X�va(??��5pfavrskovlokalavisen_dk.recipePK�X�>���
���ufaznet.pngPK�X]x;ˣ�
���{faznet.recipePK�X�����
��k�fc_knudde.pngPK�XB��GG���fc_knudde.recipePK�X��N`��
����fdb_pl.pngPK�X�F��
����fdb_pl.recipePK�Xʜ^[������fe_india.pngPK�X�->�o
o
��z�fe_india.recipePK�X��t������felicia.pngPK�X%�G��0�felicia.recipePK�X"���
��q�fhm_uk.pngPK�X-k��
����fhm_uk.recipePK�X�����	����fhmro.pngPK�X�_,?;;���fhmro.recipePK�X�1�?��
����fifty_two.pngPK�X�njpPP����fifty_two.recipePK�X<8Q!����6�film_org_pl.pngPK�X��>�����G�film_org_pl.recipePK�X'�����H�film_web.pngPK�X6�
����o�film_web.recipePK�X�R�&}}��4�financial_times.pngPK�Xऐ������financial_times.recipePK�X��K�����financialsense.pngPK�XB�J�����!financialsense.recipePK�Xx8�����p*financiarul.pngPK�X@�:������+financiarul.recipePK�X�#/�����1financieele_dagblad.pngPK�XZ�Z�qq���5financieele_dagblad.recipePK�Xb�d����K9first_things.pngPK�XK�S�_	_	��&:first_things.recipePK�X�a�
���Cfirstpost.pngPK�X�������Gfirstpost.recipePK�XA2�����Ufisco_oggi.pngPK�X��;QQ��,Xfisco_oggi.recipePK�X�1�������\fleshbot.pngPK�X(U�?�����_fleshbot.recipePK�X����tt
��[dflickr.pngPK�X�����
���eflickr.recipePK�X����tt
���kflickr_es.pngPK�Xl�Y�����mflickr_es.recipePK�Xd����
��vsfluter_de.pngPK�X�Mz����wvfluter_de.recipePK�XMT�x�
�
��.{focus_de.pngPK�X��##���focus_de.recipePK�X-�T����2�focus_pl.pngPK�X@s��FF���focus_pl.recipePK�X]쭭����T�fokkeensukke.pngPK�Xs���7�fokkeensukke.recipePK�X�
#�������fokus.recipePK�X���)��	��~�folha.pngPK�XWQ�G''��J�folha.recipePK�X:�J	������folhadesaopaulo.pngPK�X�)�

����folhadesaopaulo.recipePK�X�η�����folhadesaopaulo_sub.pngPK�X�\&BB����folhadesaopaulo_sub.recipePK�X�ެ�tt��`folkebladet_dk.pngPK�XFԓ����folkebladet_dk.recipePK�Xh�ѣ����	folkebladetdjursland_dk.pngPK�XM3z����(folkebladetdjursland_dk.recipePK�X4G�Z//��	folketidende_dk.pngPK�X~D�����ifolketidende_dk.recipePK�X߇��00��� fontanka.pngPK�XW�������'fontanka.recipePK�XbW�dd
��1fooballua.pngPK�X,��l�����5footballua.recipePK�XLު���
���:forbes.pngPK�X�(���
���;forbes.recipePK�X������aDforbes_india.pngPK�XKv�*����Gforbes_india.recipePK�X�!�00
��Oforbes_pl.pngPK�X���<	<	��sPforbes_pl.recipePK�Xq��o�����Yforeign_policy.pngPK�X{%m00���[foreign_policy.recipePK�X�n�b����#hforeignaffairs.pngPK�X4���Hiforeignaffairs.recipePK�Xs�//
����formulaas.pngPK�X�E`!�����formulaas.recipePK�Xo�6�CC
����forsal.pngPK�X]#�T�	�	
��c�forsal.recipePK�X�V�oo��:�fortune_magazine.pngPK�X�V\T
T
��ۙfortune_magazine.recipePK�X^O�����d�fotoblogia_pl.pngPK�X?/W����>�fotoblogia_pl.recipePK�X�����,�foxnews.pngPK�X^�K����<�foxnews.recipePK�X;��
���fr_online.pngPK�X��`@����1�fr_online.recipePK�XK7���
��>�frandroid.pngPK�X��!'DD����frandroid.recipePK�X;����h�frankfurter_rundschau.pngPK�X>�������frankfurter_rundschau.recipePK�XĊ�dd��p�freakonomics.pngPK�X�B�||���freakonomics.recipePK�X
��a!!����fredensborglokalavisen_dk.pngPK�X=�>99 ���fredensborglokalavisen_dk.recipePK�X
��a!!����fredericialokalavisen_dk.pngPK�XC�f�������fredericialokalavisen_dk.recipePK�X&�C�����frederiksbergbladet_dk.pngPK�XL.�������frederiksbergbladet_dk.recipePK�X
��a!!���frederikssundlokalavisen_dk.pngPK�X�=���"��{frederikssundlokalavisen_dk.recipePK�X�����free_inquiry.pngPK�X.lW�`
`
���
free_inquiry.recipePK�X���P����Kfreenature.pngPK�X�""��efreenature.recipePK�X�3�
�
��� freeway.recipePK�X�.R�FF���.freisinger_tagblatt.pngPK�X3��rr��1freisinger_tagblatt.recipePK�X��""
���Afrontline.pngPK�X�fm
m
��Ifrontline.recipePK�X�:����Vfstream.pngPK�X.��,,���Wfstream.recipePK�X���K����>dfudzilla.pngPK�X�W?���[efudzilla.recipePK�X
��a!!���jfuresoelokalavisen_dk.pngPK�XDL11���mfuresoelokalavisen_dk.recipePK�X�.R�FF��Wsfurstenfeldbrucker_tagblatt.pngPK�X�U5��"���ufurstenfeldbrucker_tagblatt.recipePK�Xއ�����futurismic.pngPK�X�c&&��7�futurismic.recipePK�X-$J�	�	����galaxys_edge.recipePK�XL� ������galicia_confidential.pngPK�X��?�..����galicia_confidential.recipePK�X�����gamasutra_fa.pngPK�X�t������gamasutra_fa.recipePK�X����Χgamasutra_news.pngPK�X6/u�������gamasutra_news.recipePK�X��N5����p�gamekult.pngPK�X�U����U�gamekult.recipePK�X⩹�����x�gameplay_pl.pngPK�X��E�����n�gameplay_pl.recipePK�X������-�gamespot.pngPK�X�������gamespot.recipePK�X��
�
����gandul.pngPK�Xd��}��
���gandul.recipePK�X�.R�FF����garmischer_tagblatt.pngPK�X�#�����1�garmischer_tagblatt.recipePK�XID�/����<�gazeta-prawna-calibre-v1.pngPK�XLl(����R�gazeta-prawna-calibre-v1.recipePK�X�v������T�gazeta_krakowska.pngPK�X4ȏf����X�gazeta_krakowska.recipePK�XW�vD�����gazeta_lubuska.pngPK�Xe������?gazeta_lubuska.recipePK�X��Nee��Rgazeta_pl_bydgoszcz.pngPK�XR��l�����gazeta_pl_bydgoszcz.recipePK�X��Nee���gazeta_pl_krakow.pngPK�X�-��#
#
��} gazeta_pl_krakow.recipePK�X��Nee���-gazeta_pl_szczecin.pngPK�X�.�{{��n.gazeta_pl_szczecin.recipePK�X��Nee�� ;gazeta_pl_warszawa.pngPK�X��

���;gazeta_pl_warszawa.recipePK�X���rr���Hgazeta_pomorska.pngPK�X����
�
���Igazeta_pomorska.recipePK�X�����Wgazeta_wroclawska.pngPK�X�T(�����Xgazeta_wroclawska.recipePK�X.��22���agazeta_wspolczesna.pngPK�Xm(����Ldgazeta_wspolczesna.recipePK�X��Nee���pgazeta_wyborcza.pngPK�Xa�K����3qgazeta_wyborcza.recipePK�X4�u�EE��e�gazetaua_ru.pngPK�X����	�	��׍gazetaua_ru.recipePK�X4�u�EE���gazetaua_ua.pngPK�X��Y�	�	��U�gazetaua_ua.recipePK�XZ;(ll��P�gcn.pngPK�X�܆||
���gcn.recipePK�X���=��
����geek_poke.pngPK�X�Tm
m
��k�geek_poke.recipePK�X
��a!!���gentoftelokalavisen_dk.pngPK�X�/j�::��_�gentoftelokalavisen_dk.recipePK�X�%�1������geopolityka.pngPK�XWb5rii����geopolityka.recipePK�X�.R�FF��v�geretsrieder_merkur.pngPK�XO��OO����geretsrieder_merkur.recipePK�XmD��88��x�german_gov.pngPK�X	v�33����german_gov.recipePK�X���HH��>�gezgin_dergi.pngPK�X�VHaaa����gezgin_dergi.recipePK�X�y��
��F�gildia_pl.pngPK�XCEe??����gildia_pl.recipePK�X�±''
���github.recipePK�X>�BKK��Dgizmodo.pngPK�X�`�������gizmodo.recipePK�X��������gkt.pngPK�X �@
���gkt.recipePK�X���آ����"glamour.pngPK�X��]����&glamour.recipePK�Xtv�]]��,glasgow_herald.pngPK�Xb�47DD���/glasgow_herald.recipePK�X��Err��4glenn_greenwald.pngPK�X���tt���:glenn_greenwald.recipePK�X�,���
��O<glennbeck.pngPK�X�ZQ�
�
��Cglennbeck.recipePK�XW�����0Qglobaltimes.pngPK�XK񰵍
�
��WRglobaltimes.recipePK�Xy�#�nn��]globe_and_mail.pngPK�Xd�ŧzz���^globe_and_mail.recipePK�X,�;�����_fglobes_co_il.pngPK�X�
aR�
�
���kglobes_co_il.recipePK�X�G����vglos_wielkopolski.pngPK�X��A		���wglos_wielkopolski.recipePK�X�ݖP��	��&�go4it.pngPK�XkQ�A����*�go4it.recipePK�X�d9pp
����go_comics.pngPK�X#ڡT5�5�����go_comics.recipePK�X:݂е����+goal.pngPK�X%8�������-goal.recipePK�X�RR���/gofin_pl.pngPK�Xn>������2gofin_pl.recipePK�X�B<�{{��06golem_de.pngPK�X�;�����9golem_de.recipePK�X�������Hgood_house_keeping.pngPK�X��>�����$Mgood_house_keeping.recipePK�X�"���Sgood_to_know.pngPK�X��j�����IVgood_to_know.recipePK�X���������[google_news.pngPK�X�����
�
���agoogle_news.recipePK�X^�K�WW��pgooglemobileblog.pngPK�X�<m2ZZ���tgooglemobileblog.recipePK�X�{==	��vgorky.pngPK�X�Z�-	-	���zgorky.recipePK�X������
��؃gosc_full.pngPK�X6O�������gosc_full.recipePK�X��������Λgosc_niedzielny.pngPK�X��ۻ{{����gosc_niedzielny.recipePK�X+��Y������gram_pl.pngPK�XM1�� 	 	����gram_pl.recipePK�X	X�G�� ��Ѿgrandes_corresponsales_es.recipePK�X�\4���	��	�grani.pngPK�X���)������grani.recipePK�Xf�BB
����granma.pngPK�Xf�D�
���granma.recipePK�X��/
��C�granta.pngPK�Xpg�Z��
��~�granta.recipePK�X�@����
��8�grantland.pngPK�Xgq�� 
 
��B�grantland.recipePK�Xu�������� greensboro_news_and_record.pngPK�X����!��� greensboro_news_and_record.recipePK�X
��a!!��t grenaalokalavisen_dk.pngPK�X�~�ZKK��� grenaalokalavisen_dk.recipePK�X
��a!!��O gribskovlokalavisen_dk.pngPK�X>\�(__��� gribskovlokalavisen_dk.recipePK�XX<)88��B  grid_to.recipePK�X>r�&�����+ grrm.pngPK�X��r���. grrm.recipePK�X|t�@ff��92 gry_online_pl.pngPK�X��#������2 gry_online_pl.recipePK�X(������E gs24_pl.pngPK�X�]������G gs24_pl.recipePK�X�*�����M gsp.pngPK�X1U�ee
���N gsp.recipePK�X��o�����cS guardian.pngPK�X���	����bU guardian.recipePK�X�bN����Bf gulfnews.pngPK�X�R����dk gulfnews.recipePK�X��6XX��t gulli.recipePK�XE����
���w gva_be.pngPK�X�!%�[	[	
���y gva_be.recipePK�X�Fe&��� gwup.pngPK�X�a�|''��?� gwup.recipePK�X�����	���� h3.recipePK�X������I� haaretz_en.pngPK�XmV�T�
�
��� haaretz_en.recipePK�X8�������� habr.pngPK�Xu#������� habr.recipePK�X8�������� habr_ru.pngPK�X5}yg++���� habr_ru.recipePK�X����GG��� hackernews.pngPK�X�*‚����b� hackernews.recipePK�X
��a!!��v� haderslevlokalavisen_dk.pngPK�X3+�X~~���� haderslevlokalavisen_dk.recipePK�X�zNf!	!	
���� haksoz.pngPK�X��5�@@
���� haksoz.recipePK�X
��a!!��>� halsnaeslokalavisen_dk.pngPK�X`�;������ hamilton_spectator.pngPK�X9�p������ hamilton_spectator.recipePK�XNz�����Q� handelsblatt.pngPK�X����) ) ��_� handelsblatt.recipePK�X�g��
���!hankyoreh.pngPK�X2������!hankyoreh.recipePK�X�nJ����!hankyoreh21.pngPK�X#R壎���4"!hankyoreh21.recipePK�XDf;"�����'!hannoversche_zeitung.pngPK�X�T�*����)!hannoversche_zeitung.recipePK�X$�@==���/!harpers.pngPK�X_v�d�	�	��65!harpers.recipePK�X$�@==��]?!harpers_full.pngPK�X��S������D!harpers_full.recipePK�X�^O�����\!hatalska.pngPK�X��C�����]!hatalska.recipePK�X�R!���`!hbr.pngPK�X�x'"ee
���d!hbr.recipePK�X�Fe&��!heavy_metal_it.pngPK�X˟�٢���I�!heavy_metal_it.recipePK�X��5��	���!heise.pngPK�X��77���!heise.recipePK�X-0�����q�!heise_ct.pngPK�X�c��QQ��W�!heise_ct.recipePK�X-0�����թ!heise_ix.pngPK�X�������!heise_ix.recipePK�X-0������!heise_open.pngPK�XLt��������!heise_open.recipePK�XC�b������!helsingin_sanomat.pngPK�X�nݚ������!helsingin_sanomat.recipePK�X�Q|@@����!high_country_news.pngPK�X��k�..��&�!high_country_news.recipePK�X��(������!himal_southasian.pngPK�X>�^����N�!himal_southasian.recipePK�XYy{[��	��l�!hindu.pngPK�X�M������2�!hindu.recipePK�X뾐�))��?"hindu_business_line.pngPK�X)[QQ���"hindu_business_line.recipePK�X뾐�))%��&$"hindu_business_line_print_edition.pngPK�Xig=hh(���*"hindu_business_line_print_edition.recipePK�XMLlX��@9"hindu_human_rights.pngPK�XB�-YY��="hindu_human_rights.recipePK�XTa^Y__��@"hindu_post.pngPK�X��b((���E"hindu_post.recipePK�XYy{[�����G"hindufeeds.pngPK�XC��;;���I"hindufeeds.recipePK�Xv�hh��&X"hinduism_today.pngPK�XSĥś����^"hinduism_today.recipePK�X?8R-��
���`"hindustan.pngPK�X����I	I	��Wc"hindustan.recipePK�XQj�88���l"hindustan_times.pngPK�Xϩ������7s"hindustan_times.recipePK�XQj�88��*"hindustan_times_print.pngPK�X�z��������"hindustan_times_print.recipePK�X'Xd''����"hindutamil.pngPK�X$^{p
p
���"hindutamil.recipePK�XD�*&&����"historia_pl.pngPK�Xr������ۧ"historia_pl.recipePK�X�n��OO���"history_today.pngPK�X�c+T�
�
��n�"history_today.recipePK�Xj����
����"hln_be.pngPK�X��y���
��B�"hln_be.recipePK�X�`��%%��F�"hna.pngPK�X� C���
����"hna.recipePK�X���xx����"hnonline.pngPK�XԪR��
�
��<�"hnonline.recipePK�X
��a!!��4�"hoersholmlokalavisen_dk.pngPK�X�l�77����"hoersholmlokalavisen_dk.recipePK�XW�Vee���"hola.pngPK�X�`�JJ����"hola.recipePK�X�;�����#hollywood_reporter.pngPK�X�A[

��&#hollywood_reporter.recipePK�X�.R�FF��d
#holzkirchener_merkur.pngPK�X!
m����#holzkirchener_merkur.recipePK�X�g�+\\��%#horizons.pngPK�X�q������#horizons.recipePK�X�������Y+#hornsherredavis_dk.recipePK�X
��a!!��5/#hornsherredlokalavisen_dk.pngPK�X�&�(�� ���2#hornsherredlokalavisen_dk.recipePK�X���


��q8#hotair.pngPK�X�k�
���9#hotair.recipePK�X�Jl�����>#hotcity.pngPK�X���		���@#hotcity.recipePK�X0�����D#hotnews.pngPK�X�LWMM��jF#hotnews.recipePK�X�����J#house_news.pngPK�X�f%66��(M#house_news.recipePK�X��`ت����S#houston_chronicle.pngPK�XҾ�_ ( (��jT#houston_chronicle.recipePK�X�'G��
���|#howtogeek.pngPK�X��s�����~#howtogeek.recipePK�X�>�OO��x�#hoy.pngPK�X3���
���#hoy.recipePK�X��	������#hrt.pngPK�X~�i��
��ޑ#hrt.recipePK�X}#q�==����#huffingtonpost.pngPK�X@r?�������#huffingtonpost.recipePK�X\�8h������#huffingtonpost_uk.pngPK�X#�]�zz��Ư#hurriyet.pngPK�X��h�(	(	��j�#hurriyet.recipePK�X��g�������#hvg.pngPK�X‘U�


����#hvg.recipePK�X���������#hvidovreavis_dk.pngPK�X!�A((����#hvidovreavis_dk.recipePK�X
��a!!����#hvidovrelokalavisen_dk.pngPK�Xߍ��..��X�#hvidovrelokalavisen_dk.recipePK�X~<y..����#ibm_smarter_planet.recipePK�X���&�#id_pixel.pngPK�X�y�?�
�
����#id_pixel.recipePK�X�r�i������#ideal_almeria.pngPK�X����N
N
����#ideal_almeria.recipePK�X�r�i����,�#ideal_granada.pngPK�XuPs<�
�
��L�#ideal_granada.recipePK�X�r�i�����#ideal_jaen.pngPK�X�[9�	�	��(�#ideal_jaen.recipePK�X��
��
��$idg_se.pngPK�X��l��
���$idg_se.recipePK�X�Z�	���$idnes.pngPK�XX�������>$idnes.recipePK�X�:�<����G$ieee_spectrum_mag.pngPK�X��X�cc��!$ieee_spectrum_mag.recipePK�X�*v�����!$ieeespectrum.pngPK�Xw��>dd���"$ieeespectrum.recipePK�X�	���
��11$iekspries.pngPK�X��Z�tt���1$iekspries.recipePK�Xy�������5$ifzm.pngPK�X+27?�	�	���8$ifzm.recipePK�X{���''��<B$ihned.cz.pngPK�X�{������F$ihned.cz.recipePK�X{���''	���K$ihned.pngPK�X��֣����O$ihned.recipePK�X�4�����j$iht.pngPK�X{�⃭�
���m$iht.recipePK�X k�VWW���q$iktibas.pngPK�XE�93����-x$iktibas.recipePK�X r�����Az$il_cambiamento.pngPK�Xk�IVV��G$il_cambiamento.recipePK�XF��	++��Ѐ$il_fatto.pngPK�Xv�W�ii��%�$il_fatto.recipePK�Xa�\""
����$il_foglio.pngPK�XږV�����$il_foglio.recipePK�X��`��Ē$il_giornale.pngPK�X�ШGii���$il_giornale.recipePK�X��Uu������$il_messaggero.pngPK�X�ۦ�
�
��Ţ$il_messaggero.recipePK�X���55����$il_post.pngPK�Xu$���
�
���$il_post.recipePK�X�y�G���$iliteratura_cz.pngPK�X��X��6�$iliteratura_cz.recipePK�X�
u���m�$ilmanifesto.pngPK�Xw�R������$ilmanifesto.recipePK�XP��gPP����$ilsole24ore.pngPK�XX��j����:�$ilsole24ore.recipePK�X�&�����!�$imperatortravel.pngPK�X�=�

��B�$imperatortravel.recipePK�X��k&&����$impulse_de.pngPK�X6��#�����$impulse_de.recipePK�X(��gjj
���%in4_pl.pngPK�X��Jii
��4%in4_pl.recipePK�XO�����	���%in_gr.pngPK�X��3�����%in_gr.recipePK�XT�������%inc.pngPK�X�a��
�

��x%inc.recipePK�X�1@��	��� %inc42.pngPK�X�� y�����$%inc42.recipePK�X�÷�����y-%independent.pngPK�X3Y�����c.%independent.recipePK�X}'�����K%independent_australia.pngPK�X@��?�����O%independent_australia.recipePK�X��-qq��j%index_hu.pngPK�X���22���j%index_hu.recipePK�X�#`W����o%india_facts.pngPK�X���QCC��q%india_facts.recipePK�X�x������s%india_legal_magazine.pngPK�X��<�����W{%india_legal_magazine.recipePK�Xg����:�%india_speaks_reddit.pngPK�XM�__����%india_speaks_reddit.recipePK�X	��_����#�%india_today.pngPK�XKQu�����N�%india_today.recipePK�X4��m����q�%indian_express.pngPK�X'k�&������%indian_express.recipePK�XA�����^�%indic_today.pngPK�X�!�??��>�%indic_today.recipePK�X�L![[
����%indy_star.pngPK�X�Z} ����3�%indy_star.recipePK�X�ծ�����%infobae.pngPK�X/z�;�����%infobae.recipePK�X��a������%infomotori.pngPK�X�Us������%infomotori.recipePK�XNق�������%information_dk.pngPK�X��Zغ
�
����%information_dk.recipePK�X�ӻ


����%infoworld.pngPK�X�(>ee���%infoworld.recipePK�X%������z�%infra_pl.pngPK�X30�h������%infra_pl.recipePK�X�"�GG
����%ing_dk.pngPK�X�͝p
��&ing_dk.recipePK�Xe�[���
��<&inopressa.pngPK�X��9����7&inopressa.recipePK�XM*J�tt���&inquirer_net.pngPK�X�脓gg���&inquirer_net.recipePK�X��P�����$&insan_okur.pngPK�X�o@�hh��A!&insan_okur.recipePK�X�@R+�����"&insider.pngPK�X�ׇ%  ���%&insider.recipePK�X4�
�
��.&instapaper.pngPK�X<C�a&&���;&instapaper.recipePK�X6������DG&intelligencer.pngPK�X�|>����I&intelligencer.recipePK�X�q������M&interfax.pngPK�X�s�6UU���V&interfax.recipePK�X���ll��v[&interfax_ua.pngPK�X�V"����_&interfax_ua.recipePK�X�q�����g&interfax_uk.pngPK�X�F�##��/p&interfax_uk.recipePK�X
~�Kff
���x&intrefete.pngPK�X�[^>>��z&intrefete.recipePK�X!$�HH��&io9.pngPK�X��O�%%
���&io9.recipePK�X�Y���
��9�&iol_za.pngPK�XR'�N88
��9�&iol_za.recipePK�XU1T������&ionline_pt.pngPK�X��L������&ionline_pt.recipePK�X&��__��t�&iprofesional.pngPK�X�����&iprofesional.recipePK�X��}�����=�&irish_independent.pngPK�X�1������+�&irish_independent.recipePK�X{R�tt����&irish_times.pngPK�XJ�.�<<����&irish_times.recipePK�X&o�
�
���&irish_times_free.recipePK�X�.R�FF����&isar-loisachbote.pngPK�XU�]7LL��J�&isar-loisachbote.recipePK�X���8dd����&istorias.pngPK�X��i����Y�&istorias.recipePK�X@e��'"'"��u�&istories.pngPK�Xͯ������'istories.recipePK�X��������'ivanamilakovic.pngPK�X�(�3�����!'ivanamilakovic.recipePK�X!8�����z''ixbt.pngPK�X䢈f����6+'ixbt.recipePK�X�����P>'izvestia.pngPK�X{
����w?'izvestia.recipePK�X&X������F'jacobinmag.pngPK�X�������G'jacobinmag.recipePK�X��&q��sV'jagran_josh.pngPK�X��7�����Z'jagran_josh.recipePK�X�99���\'jakarta_globe.recipePK�X�n�ee���`'jakarta_post.pngPK�XT%�a�����c'jakarta_post.recipePK�X��x//��Cl'jalopnik.pngPK�X�b�Jzz���p'jalopnik.recipePK�Xx�t���	��Cv'japaa.pngPK�X�A���|'japaa.recipePK�XC��ҩ���L�'japan_news.pngPK�Xv��9����!�'japan_news.recipePK�X����xx���'japan_times.pngPK�X&��V�	�	����'japan_times.recipePK�X_�܄��
����'javalobby.pngPK�X6S9R[[����'javalobby.recipePK�X2��o��
��/�'jb_online.pngPK�X�ZGG���'jb_online.recipePK�XW�+������'jbpress.pngPK�X��1==��^�'jbpress.recipePK�X_����
��ǻ'jeuxvideo.pngPK�X��l����ۼ'jeuxvideo.recipePK�X~sy�FF����'jezebel.pngPK�Xg������Q�'jezebel.recipePK�X���>�'jijinews.pngPK�X��m�II��w�'jijinews.recipePK�Xzx������'joelonsoftware.pngPK�X���U))����'joelonsoftware.recipePK�X6�C�cc���'johm.pngPK�X0bb�8
8
����'johm.recipePK�X%�*@88����'joongang.pngPK�X��{-MM��Q�'joongang.recipePK�X�`�

����'joop.pngPK�X�O�
�
����'joop.recipePK�Xԝ-J����(jot_down.pngPK�XT�~������(jot_down.recipePK�XEs-�����(journalgazette.pngPK�Xow������(journalgazette.recipePK�Xy6kx�����(journalofaccountancy.pngPK�X8E����)(journalofaccountancy.recipePK�X#^[WJJ	���<(jp_dk.pngPK�X��܇����4>(jp_dk.recipePK�X61̄�	��OA(jpost.pngPK�X���������A(jpost.recipePK�XC8

�����G(jpost_fr.pngPK�X��R������H(jpost_fr.recipePK�X���66���U(jsonline.pngPK�X�/����X(jsonline.recipePK�X�������`(jurnalulnational.pngPK�XR�P�����c(jurnalulnational.recipePK�X���2!!���j(jutarnji.pngPK�X%��OO���m(jutarnji.recipePK�Xiђ\����Zz(juve_la_stampa.pngPK�X��!����C}(juve_la_stampa.recipePK�X`gIjss��"�(juventudrebelde.pngPK�X�I�����Ƅ(juventudrebelde.recipePK�X����~~	���(jv_dk.pngPK�X��ܦ����$�(jv_dk.recipePK�X�6�-���� �(kahokushinpo.pngPK�X6^
�����(kahokushinpo.recipePK�X
��a!!��
�(kaloeviglokalavisen_dk.pngPK�X��ww��f�(kaloeviglokalavisen_dk.recipePK�Xq䝇�����(kamikaze.pngPK�X�Ǣ���<�(kamikaze.recipePK�X��7fMM
���(karlsruhe.pngPK�XyYq�=
=
����(karlsruhe.recipePK�X�������(karsi_gazete.pngPK�X��ɲ����(karsi_gazete.recipePK�X2�9h������(kath_net.pngPK�X�;;;����(kath_net.recipePK�X�����(kathemerini.pngPK�X?�U���?�(kathemerini.recipePK�X�g�6����t�(kellog_insight.pngPK�X��j�����h�(kellog_insight.recipePK�X�V�����a�(kerrang.pngPK�X�6�bb��J�(kerrang.recipePK�X&�C����(kgsenghavebladet_dk.pngPK�X.|��,,���(kgsenghavebladet_dk.recipePK�X�:Dɑ � 
��w)kholod.pngPK�X9N�[[
��0!)kholod.recipePK�XAN
���
���))kholod_en.pngPK�Xb�T�����,)kholod_en.recipePK�X���\\
��k1)kidney.pngPK�XW6ȋ
���2)kidney.recipePK�X0��\����C)kirkusreviews.pngPK�X�ı���H)kirkusreviews.recipePK�X��v�GG
��3\)kitekinto.pngPK�X4T0u�����\)kitekinto.recipePK�X=*�dXX���`)kitsapun.pngPK�X�������+i)kitsapun.recipePK�X�C�����9m)kleinezeitung.pngPK�X=>��JJ��r)kleinezeitung.recipePK�Xi��@@���~)klubknjige.recipePK�X(k�Z==����)km_blog.pngPK�Xh��Ń���\�)km_blog.recipePK�X��אSS���)knack_be.pngPK�XZ��OO����)knack_be.recipePK�XB��q~~���)knife_media.pngPK�X�V�-������)knife_media.recipePK�X
��a!!����)koegelokalavisen_dk.pngPK�XC!��66��ޢ)koegelokalavisen_dk.recipePK�X
��a!!��L�)koldinglokalavisen_dk.pngPK�X9X8�\\����)koldinglokalavisen_dk.recipePK�Xծ&�����:�)komchadluek.pngPK�X+H�5
5
��*�)komchadluek.recipePK�X�g�������)kommersant.pngPK�XL��6����h�)kommersant.recipePK�Xa��||��R�)kommunalsundhed_dk.recipePK�XLx�//
���)kompas.pngPK�Xy�6�**
��\�)kompas.recipePK�Xӟ��������)kompiutierra.pngPK�X;0����)kompiutierra.recipePK�Xe��������*konflikty_zbrojne.pngPK�XRI�h�����*konflikty_zbrojne.recipePK�X�փ�77���*kopalniawiedzy.pngPK�Xl�IS��*kopalniawiedzy.recipePK�X�����
��O*korben.pngPK�X�r�:{{
���*korben.recipePK�X�t["uu���*korea_herald.pngPK�X=�����H*korea_herald.recipePK�X�bll��!#*kosmonauta_pl.pngPK�Xe�,�����%*kosmonauta_pl.recipePK�X\�E���
���(*kotaku.pngPK�XU�2}}
��O)*kotaku.recipePK�X&v�������-*kp.pngPK�X�����	��/*kp.recipePK�X���Ɏ���-3*krebs_on_security.pngPK�X��{���3*krebs_on_security.recipePK�X��%����+8*kresy_pl.pngPK�X���44��<*kresy_pl.recipePK�X!,,����c>*kristeligt_dagblad_dk.pngPK�Xu5$����Z@*kristeligt_dagblad_dk.recipePK�X������bE*krstarica_en.pngPK�X�;j
<<��tG*krstarica_en.recipePK�X�%������O*ksiazka_pl.pngPK�XeC�11��	S*ksiazka_pl.recipePK�X]�LL	��iY*kstar.pngPK�X��t{{���\*kstar.recipePK�X0o|��
���_*kudika.pngPK�X�f���
��6a*kudika.recipePK�X̞�00��Af*kudy_z_nudy.pngPK�X���zz���h*kudy_z_nudy.recipePK�X�������Hm*kukuburi.pngPK�X�_**��p*kukuburi.recipePK�X1j,��
��gs*kurier.pngPK�X��
��*u*kurier.recipePK�Xbs�!!��Y}*kurier_lubelski.pngPK�X�T�q�����~*kurier_lubelski.recipePK�X�få����·*kurier_poranny.pngPK�X����	�	����*kurier_poranny.recipePK�X������ϒ*kurier_szczecinski.pngPK�X�N<vb
b
����*kurier_szczecinski.recipePK�X��|||����*kyivpost_ar.pngPK�X����
�
��9�*kyivpost_ar.recipePK�X��|||��C�*kyivpost_en.pngPK�X��#�����*kyivpost_en.recipePK�X��|||��ּ*kyivpost_ua.pngPK�X'��c�����*kyivpost_ua.recipePK�Xm��TT��r�*kyungyhang.recipePK�X��	N����*l_espresso.pngPK�X8��@@��&�*l_espresso.recipePK�XRy�ˇ�����*l_vivs_ghazieta.recipePK�X�OO
��P�*la_cuarta.pngPK�Xj�ڸcc����*la_cuarta.recipePK�X�&<s����[�*la_gazetta_del_mezzogiorno.pngPK�X{qjSee!��&�*la_gazetta_del_mezzogiorno.recipePK�X>��I__���*la_gazzeta_dello_sport.pngPK�X���L����a+la_gazzeta_dello_sport.recipePK�Xv�6����'+la_jornada.pngPK�X\�O����+la_jornada.recipePK�X�첺����#+la_nacion_cr.pngPK�X�S�2���&+la_nacion_cr.recipePK�Xf�	�SS���.+la_nueva.pngPK�X&������j1+la_nueva.recipePK�XP�B�99��k>+la_pausa_caffe.pngPK�XY[������A+la_pausa_caffe.recipePK�X��fss���C+la_razon_bo.pngPK�XE��!W
W
���D+la_razon_bo.recipePK�X���o����	O+la_republica.pngPK�Xy�x�LL���P+la_republica.recipePK�XR@������<e+la_rioja.pngPK�X��uA����4g+la_rioja.recipePK�XQ�빛���+o+la_segunda.pngPK�X���i���r+la_segunda.recipePK�X=@�JJ
��7{+la_stampa.pngPK�X*�,1�����|+la_stampa.recipePK�X3!�.����r�+la_tercera.pngPK�X��/R6	6	��|�+la_tercera.recipePK�X��Z�����+la_tribuna.pngPK�X�&l�1
1
����+la_tribuna.recipePK�X]��F,,���+la_voce.pngPK�X��}����`�+la_voce.recipePK�XN��������+lalibre_be.pngPK�X.�r�����x�+lalibre_be.recipePK�XV�
�����+�+lamebook.pngPK�X�������+lamebook.recipePK�X��+�����+lameuse_be.pngPK�X%��q	q	���+lameuse_be.recipePK�XƝ��������+lanacion.pngPK�X�"�K������+lanacion.recipePK�X���t������+lanacion_chile.pngPK�XB�l������+lanacion_chile.recipePK�X����||��k�+lapoliticaonline_ar.pngPK�X����	�	���+lapoliticaonline_ar.recipePK�X��Hcc��"�+laprensa.pngPK�XE�%�vv����+laprensa.recipePK�XB�=
����R,laprensa_hn.pngPK�Xݡ)���,laprensa_hn.recipePK�X������O
,laprensa_ni.pngPK�X��s߂	�	��T,laprensa_ni.recipePK�X,ZDD��,las_vegas_review.pngPK�X�������|,las_vegas_review.recipePK�X��\ޞ����,latimes.pngPK�X���7����d,latimes.recipePK�X=�0�cc
��.,latribuna.pngPK�X#���u	u	���/,latribuna.recipePK�X�f��&&��H9,lavanguardia.pngPK�X L�)
)
���<,lavanguardia.recipePK�X�f��&&"���F,lavanguardia_corresponsales_es.pngPK�X�ALy�
�
%��\J,lavanguardia_corresponsales_es.recipePK�X������2U,lavenir_be.pngPK�X'(�����\,lavenir_be.recipePK�XE���OO
��b,le_gorafi.pngPK�X��_f�����h,le_gorafi.recipePK�X1��3UU��Rm,le_journal.pngPK�X80�&&���s,le_journal.recipePK�XsW8����(z,le_monde.pngPK�X&}B�i(i(���{,le_monde.recipePK�XT�9���x�,le_monde_diplomatique_fr.pngPK�XNV_�''����,le_monde_diplomatique_fr.recipePK�X*��ۖ����,le_monde_en.pngPK�X������ٺ,le_monde_en.recipePK�X�w5������,le_monde_sub.pngPK�X��.j22����,le_monde_sub.recipePK�X(ٌ�����,le_monde_sub_paper.pngPK�XM���""����,le_monde_sub_paper.recipePK�X٘:.����9-le_nouvel_observateur.pngPK�X�>�����-le_nouvel_observateur.recipePK�X�n�
�
���-le_peuple_breton.pngPK�Xū`..��-le_peuple_breton.recipePK�X��]�tt��u$-le_temps.pngPK�X�Ԇ4##��&-le_temps.recipePK�X/g�<<��c8-ledevoir.pngPK�X{v�..���9-ledevoir.recipePK�X���x44	��$E-leduc.pngPK�X"6yQ

��I-leduc.recipePK�X���͇�
���T-lega_nerd.pngPK�X�g������eV-lega_nerd.recipePK�X�.]���
��UX-legeartis.pngPK�X������Z-legeartis.recipePK�X,��ll���\-leggo_it.pngPK�X\�
		���_-leggo_it.recipePK�X鈹�����h-legitymizm.pngPK�X�MNw
w
���j-legitymizm.recipePK�XQE)����u-leipzer_volkszeitung.pngPK�Xz9�����>{-leipzer_volkszeitung.recipePK�XC�z����h�-lemonde_dip.pngPK�X�a@B������-lemonde_dip.recipePK�X��z����B�-lenta_ru.pngPK�X3�����2�-lenta_ru.recipePK�X�q�����X�-lepoint.pngPK�X^'�i

���-lepoint.recipePK�X�3��::��S�-lequipe.pngPK�X% eG������-lequipe.recipePK�X�����
����-les_echos.pngPK�X9������˴-les_echos.recipePK�X?D}��
����-lescienze.pngPK�Xm��ff��Z�-lescienze.recipePK�Xh����
����-lesoir_be.pngPK�Xzi�S����-lesoir_be.recipePK�X�B��
�
��H�-letsgetcritical.recipePK�X�
Ĥ����H�-levante.pngPK�X�Q�CC��U�-levante.recipePK�X0XFc������-lexpress.pngPK�XH���w
w
����-lexpress.recipePK�X���@@��j�-liberation.pngPK�XS�"�?
?
���.liberation.recipePK�X.��3cc��D.liberatorio_politico.pngPK�X=o�MM���.liberatorio_politico.recipePK�XH�2ס�
��c.libero.recipePK�Xh�U�kk��/.libertad_digital.pngPK�X���	�	���.libertad_digital.recipePK�X��a WW���$.liberty_times.pngPK�X���6����
&.liberty_times.recipePK�X9KӁQQ���,.lidovky.pngPK�X������W2.lidovky.recipePK�X�t֣���7.lifehacker.pngPK�X�D�11���;.lifehacker.recipePK�XR�� @@��?B.lifehacker_pl.pngPK�Xn�[������E.lifehacker_pl.recipePK�X�H�&&���I.liganet_ru.pngPK�X؊ё�!�!���K.liganet_ru.recipePK�X�H�&&���m.liganet_ua.pngPK�X��|�rr��p.liganet_ua.recipePK�X�b����{.lightspeed_magazine.pngPK�X�N�р����.lightspeed_magazine.recipePK�X6�;QQ����.limba_sarda.pngPK�X�i5�����.limba_sarda.recipePK�XjVb���	��-�.limes.pngPK�X}����P�.limes.recipePK�X�@�ww����.linux_magazine.pngPK�X�5����@�.linux_magazine.recipePK�XYPG4

��W�.linux_news_de.pngPK�X�վ�����.linux_news_de.recipePK�X�
 �MM����.linuxportal_pl.pngPK�X��w%%����.linuxportal_pl.recipePK�XɺPP��U�.list_apart.pngPK�X��������ѳ.list_apart.recipePK�X0?��##����.live_law.pngPK�X�8U�
�
���.live_law.recipePK�X:S�UU���.livemint.pngPK�X&�
w������.livemint.recipePK�XtC�W��a�.livescience.pngPK�X:��o  ����.livescience.recipePK�X��bb����.living_stones.pngPK�X��Y
������.living_stones.recipePK�X��P��	��;�.lomza.pngPK�XSݵV���.lomza.recipePK�X�N�P����,�.london_free_press.pngPK�X��/�  ��/london_free_press.recipePK�XG��2DD��b/los_danieles.pngPK�XT)�����/los_danieles.recipePK�X��������
/los_tiempos_bo.pngPK�X�]���	�	���/los_tiempos_bo.recipePK�X�F^�&&���/losservatoreromano_it.pngPK�X� ����Z/losservatoreromano_it.recipePK�X
lW@{{���!/lrb.pngPK�X'�2ى�
��:"/lrb.recipePK�X
lW@{{
���-/lrb_payed.pngPK�X*ݭ�����./ludwig_mises.pngPK�X�!>�����7/ludwig_mises.recipePK�X�P����9/luns_a_venres.pngPK�Xj�2�����=/luns_a_venres.recipePK�X�ǘ++���F/lupa.pngPK�Xr1B����*H/lupa.recipePK�XFZ������JN/lvivs_ks_ghazieta.recipePK�Xj��R����lU/lwn.pngPK�X���)��
��LV/lwn.recipePK�X��Q�����f\/lwn_free.pngPK�XYj�
����jc/lwn_free.recipePK�Xj��R����&i/lwn_weekly.pngPK�X�4CSTT��
j/lwn_weekly.recipePK�X
��a!!!���}/lyngby-taarbaeklokalavisen_dk.pngPK�X=�K%��$���/lyngby-taarbaeklokalavisen_dk.recipePK�X ���
����/mac_world.pngPK�X,e�F
F
��:�/mac_world.recipePK�Xͺ;�11����/mac_world_uk.pngPK�Xb$���
�/mac_world_uk.recipePK�X����
��]�/macity.pngPK�X��|suu
��P�/macity.recipePK�X���������/macleans.pngPK�X��yWW���/macleans.recipePK�X>4�������/macrobusiness.pngPK�X9�Vb����\�/macrobusiness.recipePK�Xe�CVV��:�/maekyung.pngPK�X0T������/maekyung.recipePK�X9�ʇ))���/magyar_nemzet.pngPK�X�R������F�/magyar_nemzet.recipePK�Xiq�R����R�/maharashtra_times.pngPK�X��մ�����/maharashtra_times.recipePK�X·C����k�/mail_and_guardian.pngPK�X@�d����W�/mail_and_guardian.recipePK�XM�D����|�/mainichi.pngPK�X���(dd��d�/mainichi.recipePK�XGs<WW����/mainichi_en.pngPK�XYn������y�/mainichi_en.recipePK�XM�D������/mainichi_science_news.pngPK�Xw�������/mainichi_science_news.recipePK�X!%��������/malaya_business_insight.pngPK�X<9�GG���/malaya_business_insight.recipePK�X�5�~22��n
0malaysian_mirror.recipePK�X�bm�rr���0mallorca_zeitung.pngPK�X�]�cc��y0mallorca_zeitung.recipePK�X�g��RR
��)0mandidner.pngPK�X�Ht �����+0mandidner.recipePK�Xˌ��W	W	���-0manila_standard_today.recipePK�X;�x���	��70marca.pngPK�X�L�ǝ���80marca.recipePK�X�:;̧�
���>0marctv.pngPK�X-,��aa
���C0marctv.recipePK�XK��F����0G0marine_corps_times.pngPK�X�˶�����J0marine_corps_times.recipePK�X�Meo�	�	��	Q0marketing_magazine.pngPK�XZg�������Z0marketing_magazine.recipePK�X�<�S����"a0marketing_sensoriale.pngPK�XG:�,MM���c0marketing_sensoriale.recipePK�X-�==��pj0martinfowler.recipePK�X��������m0maskinbladet_dk.pngPK�X�2.���o0maskinbladet_dk.recipePK�XL!��VV���s0mateusz_czytania.pngPK�X���U����#u0mateusz_czytania.recipePK�X'7��xx��Ay0matichon.pngPK�X����ZZ���|0matichon.recipePK�X@��7����j�0max_planck.pngPK�X|��������0max_planck.recipePK�X�<c	���0mayra.pngPK�X}�&��%�0mayra.recipePK�X�;�%%��[�0mdj.pngPK�X
�P%%
����0mdj.recipePK�Xvϒ�LL
���0media2.pngPK�XMW溘�
��f�0media2.recipePK�X:9�(����)�0media_zone.pngPK�X���?�����0media_zone.recipePK�X��O����8�0mediafax.pngPK�X�@>]��a�0mediafax.recipePK�X
�
������0mediaindonesia.pngPK�X�&�������0mediaindonesia.recipePK�XN����
����0mediapart.pngPK�XrS++����0mediapart.recipePK�X�SMM���0mediterraneo.pngPK�X��F�++����0mediterraneo.recipePK�X{�3�����0medscape.pngPK�X�B�������0medscape.recipePK�X1,��
���1meduza.pngPK�X|y�##
���1meduza.recipePK�X1,��
��71meduza_ru.pngPK�X�79�))��Z
1meduza_ru.recipePK�XM��M�����1mel.pngPK�Xۢr�
�

��f1mel.recipePK�XSn�{{��!1melbourne_herald_sun.pngPK�X�?{�88���%1melbourne_herald_sun.recipePK�Xy�2�	�	��551men24_gr.recipePK�X�=x�����:?1mens_day_out.pngPK�X���11��IG1mens_day_out.recipePK�X�j������I1mens_health.pngPK�X�9&BB���J1mens_health.recipePK�X�!㊙���?L1merco_press.pngPK�X���((��N1merco_press.recipePK�XA"��	��]S1mesec.pngPK�X��$		��?T1mesec.recipePK�X�r� ����rZ1metro_montreal.pngPK�X_�����2`1metro_montreal.recipePK�X$������Jd1metro_news_nl.pngPK�X�ܚ��+�+��g1metro_news_nl.recipePK�X�C_D�����1metro_uk.pngPK�XIF�]�	�	����1metro_uk.recipePK�X�|vP���1metropol_tv.recipePK�X�h��00��"�1miami_herald.pngPK�X�R��;;����1miami_herald.recipePK�X,.������1michalkiewicz.pngPK�X��?������1michalkiewicz.recipePK�XK�7�!!��Ǻ1michellemalkin.pngPK�X���������1michellemalkin.recipePK�X�.R�FF��I�1miesbacher_merkur.pngPK�XN�3����1miesbacher_merkur.recipePK�X*��WW���1military_times.pngPK�X�~������1military_times.recipePK�Xs��ǫ�����1mit_technology_review.pngPK�X�t�����n�1mit_technology_review.recipePK�X�!Y_����x�1mlody_technik_pl.pngPK�X��p�������1mlody_technik_pl.recipePK�X��D6

��U�1mmc_rtv.pngPK�XvY�����2mmc_rtv.recipePK�X�U�RR���	2mobilenations.pngPK�X�׽����52mobilenations.recipePK�X�!��]]��

2modoros.pngPK�XٹK�����2modoros.recipePK�X�d}L����@2moldovaazi.pngPK�X�<������]2moldovaazi.recipePK�X������`#2monbiot.pngPK�X���(SS��"&2monbiot.recipePK�X`Q��uu���+2mondedurable.pngPK�X�������D12mondedurable.recipePK�X��ss
��e62monden.pngPK�X�xKTf	f	
��82monden.recipePK�XR'�|rr���A2money_pl.pngPK�X؜�2�
�
��-C2money_pl.recipePK�Xt�������OQ2moneycontrol.pngPK�Xߑ6�����%W2moneycontrol.recipePK�X��Ƅ���Ng2moneyro.pngPK�X)b:�����g2moneyro.recipePK�X�5�����n2montevideo_com.pngPK�X��0����Fq2montevideo_com.recipePK�X�AU���5y2montreal_gazette.pngPK�XeIPR�3�3��r}2montreal_gazette.recipePK�Xfy�������2more_intelligent_life.pngPK�X�R�����2more_intelligent_life.recipePK�Xl)�Gll����2moscow_times.pngPK�X#R�������2moscow_times.recipePK�X�%��������2moscowtimes_en.pngPK�XR!l�??����2moscowtimes_en.recipePK�X�%������,�2moscowtimes_ru.pngPK�X7�|�	�	��L�2moscowtimes_ru.recipePK�X�M�����2motherjones.pngPK�X��������2motherjones.recipePK�X�6�

���2msdnmag_en.pngPK�X�������E�2msdnmag_en.recipePK�X�hl�
�
	��>�2msnbc.pngPK�X�<�;kk���2msnbc.recipePK�X9�
����2msnsankei.pngPK�XqҌ����2msnsankei.recipePK�X�,8S�����2mult_kor.pngPK�X��������2mult_kor.recipePK�X�.R�FF���3munchner_merkur_nord.pngPK�X�r�CC��Y3munchner_merkur_nord.recipePK�X�.R�FF���3munchner_merkur_stadt.pngPK�X\���R3munchner_merkur_stadt.recipePK�X�.R�FF���'3munchner_merkur_sud.pngPK�X�p�����*3munchner_merkur_sud.recipePK�X�.R�FF���93munchner_merkur_wurmtal.pngPK�X���??��T<3munchner_merkur_wurmtal.recipePK�X�.R�FF���J3murnauer_tagblatt.pngPK�X;!w���HM3murnauer_tagblatt.recipePK�X9ֹ


���\3mwjournal.pngPK�X��rr���f3mwjournal.recipePK�Xd��`ii��{|3my_dealz_de.pngPK�X\o�KK���3my_dealz_de.recipePK�XW�������3myapple_pl.pngPK�X!�W�88��j�3myapple_pl.recipePK�X�w*b$$��ђ3n_kaliningrad.pngPK�X,�tt��$�3n_kaliningrad.recipePK�X��\����ʞ3n_plus_one.pngPK�X��6

����3n_plus_one.recipePK�XՍ������ƪ3nachdenkseiten.pngPK�X	������v�3nachdenkseiten.recipePK�XZ�n]����y�3nacional_cro.pngPK�X65?F//��)�3nacional_cro.recipePK�XQ��RR����3nacionred.recipePK�X�������	�3nadacni_fond_proti_korupci.pngPK�X�g�/  !��>�3nadacni_fond_proti_korupci.recipePK�XFx��CC����3najwyzszy_czas.pngPK�X�R�����3najwyzszy_czas.recipePK�X҄xqaa����3nakedcapitalism.pngPK�X̣��		��r�3nakedcapitalism.recipePK�Xv+������3nasa.pngPK�X�hm������3nasa.recipePK�X�<�""��k�3naszdziennik.pngPK�X?�	

����3naszdziennik.recipePK�XV�M΄����3natemat_pl.pngPK�Xa��11����3natemat_pl.recipePK�X%ƃnoo
���3natgeo.pngPK�X���}ff
����3natgeo.recipePK�X%ƃnoo
��+4natgeohis.pngPK�X9�+1�����4natgeohis.recipePK�X%ƃnoo
���34natgeomag.pngPK�X�����S44natgeomag.recipePK�X&D���
���Q4nation_ke.pngPK�X��	d�����S4nation_ke.recipePK�XH��Dff���\4national_geographic_es.pngPK�X�p9"����&]4national_geographic_es.recipePK�Xj</�kk��`4national_geographic_it.pngPK�X���?���`4national_geographic_it.recipePK�X�h��CC��c4national_post.pngPK�X�4���rf4national_post.recipePK�X�3�zz���i4nationalgeoro.pngPK�X���a����lj4nationalgeoro.recipePK�X���y��ao4nationalreviewonline.pngPK�X�yOaa���r4nationalreviewonline.recipePK�X�V����
��1z4nature.pngPK�X�@;��
��8}4nature.recipePK�Xj������4nauka_w_polsce.pngPK�X�IH��
�
��ޏ4nauka_w_polsce.recipePK�X���$$��˚4nautilus.pngPK�X�Y�������4nautilus.recipePK�Xca�T&&���4navalny.pngPK�Xi�Cp����]�4navalny.recipePK�X;ye�44����4navy_times.pngPK�X
Q������4navy_times.recipePK�X��RU�����4nbonline.pngPK�Xd��X����4nbonline.recipePK�X�~�a������4ncrnext.pngPK�X�6�hSS����4ncrnext.recipePK�XT%,����=�4nejm.pngPK�X����	�	���4nejm.recipePK�X|L�2VV
���4neowin.pngPK�Xx����
��W�4neowin.recipePK�X�`p�--��-5nepszabadsag.pngPK�Xa��������5nepszabadsag.recipePK�X�ϼZ;;���
5netzpolitik.pngPK�X��0������5netzpolitik.recipePK�X=6�ګ����5neviditelny_pes.pngPK�X�H~u���5neviditelny_pes.recipePK�X�!cS��:5new_london_day.pngPK�X��RR��x5new_london_day.recipePK�X4�Zq���)5new_scientist.pngPK�X�HB;;��@,5new_scientist.recipePK�Xt����?5new_scientist_mag.pngPK�X)3��  ���@5new_scientist_mag.recipePK�X'C�y��LS5new_statesman.pngPK�X9F4������U5new_statesman.recipePK�X��MM���[5new_york_review_of_books.pngPK�X�/N�
�
��I^5new_york_review_of_books.recipePK�X��MM#��i5new_york_review_of_books_no_sub.pngPK�X�W��]	]	&���k5new_york_review_of_books_no_sub.recipePK�XO(Ý����5u5new_yorker.pngPK�X�wuu��(v5new_yorker.recipePK�X�>��rr��̒5newrepublicmag.pngPK�X՛?�?%?%��n�5newrepublicmag.recipePK�X$�e���
���5news24.pngPK�X�<�yxx
����5news24.recipePK�X���E����2�5news324.pngPK�X�'o%�����5news324.recipePK�Xk���QQ����5news_busters.pngPK�X�G8lkk��]�5news_busters.recipePK�X�5�OO����5news_times.pngPK�XO7\���t�5news_times.recipePK�X�jl''
����5newsbeast.pngPK�X:�	N
N
���5newsbeast.recipePK�X������5newslaundry.pngPK�X;� �hh����5newslaundry.recipePK�X�5�fyy��o�5newsminute.pngPK�Xl��eN
N
���5newsminute.recipePK�X}N�����6newsmoldova.pngPK�X!�����6newsmoldova.recipePK�X�	�rr���6newsobs.pngPK�X��$/MM��v
6newsobs.recipePK�X��_KK���6newsstraitstimes.pngPK�X��^����l6newsstraitstimes.recipePK�Xۓx̠���i6newsweek_polska.pngPK�X�`�P�"�"��:6newsweek_polska.recipePK�X~9�\;;
��3<6newtab.pngPK�X �kk
���>6newtab.recipePK�Xtw�qq��,F6newtimes.pngPK�X�B�A���K6newtimes.recipePK�X�DS���P6newz_dk.pngPK�X_����DT6newz_dk.recipePK�X �˞���pZ6nezavisne_novine.pngPK�X7,&�*	*	��@\6nezavisne_novine.recipePK�Xd�$�����e6ngz.pngPK�X��i11
��ih6ngz.recipePK�Xpm�u�����p6nhk_news.recipePK�X�lKNN���u6niebezpiecznik.pngPK�X���b����0x6niebezpiecznik.recipePK�X�����	�	���{6nieuws_be.recipePK�X����������6nightflier.pngPK�X��/�����dž6nightflier.recipePK�X�/������6nikkei_free.pngPK�X��F�,,���6nikkei_free.recipePK�X���w����G�6nikkei_news.pngPK�X��������6nikkei_news.recipePK�X�/�������6nikkei_sub.pngPK�X���~~����6nikkei_sub.recipePK�Xkt�������6nikkeiasia.pngPK�X���ݜ
�
����6nikkeiasia.recipePK�X`bʰ�
��y�6nin.recipePK�X�F����Q�6njp.pngPK�X�)/���
����6njp.recipePK�X�6������7njuz_net.pngPK�X�7�����7njuz_net.recipePK�X�8S@����[7nme.pngPK�X$W¬��
��7nme.recipePK�Xy������7noaa.pngPK�X�16�zz��7noaa.recipePK�X&�C����7noerrebronordvestbladet_dk.pngPK�X��
		!���7noerrebronordvestbladet_dk.recipePK�X�`p�--��@7nol.pngPK�X��CI��
���7nol.recipePK�X#]M�''��O'7non_leggerlo.pngPK�XJ�^����)7non_leggerlo.recipePK�X
��a!!���+7norddjurslokalavisen_dk.pngPK�X�顈����N/7norddjurslokalavisen_dk.recipePK�X�խ���57nordjyske_dk.pngPK�X>��}77��SA7nordjyske_dk.recipePK�X���������G7nortecastilla.pngPK�X��#X--���J7nortecastilla.recipePK�X'���tt
��&Z7nos_nl.pngPK�XE���
���[7nos_nl.recipePK�XL��p����c7novaya_gazeta.pngPK�XvX������d7novaya_gazeta.recipePK�X�b
	
	���f7novaya_gazeta_europe.pngPK�X��m�MM��6p7novaya_gazeta_europe.recipePK�X�b
	
	���x7novaya_gazeta_europe_en.pngPK�X�9�����7novaya_gazeta_europe_en.recipePK�Xr�	VV��؆7novaya_media.pngPK�X�e��
�
��\�7novaya_media.recipePK�Xƽ:%����[�7novilist_novine_hr.pngPK�X��a���y�7novilist_novine_hr.recipePK�Xu�D������7novilist_portal_hr.pngPK�X(p!	!	����7novilist_portal_hr.recipePK�X�5��VV���7novinite.pngPK�X��R�	�	��r�7novinite.recipePK�XL�A����q�7novinite_bg.pngPK�XN�ee����7novinite_bg.recipePK�X�b���� �7novinky.cz.pngPK�X(ey�RR��J�7novinky.cz.recipePK�X�b������7novinky.pngPK�X����dd����7novinky.recipePK�XZ��ss����7novosti.pngPK�Xd�x���7novosti.recipePK�X3�*����`�7nowiny_rybnik.pngPK�X�}�00��%�7nowiny_rybnik.recipePK�XbZ�bb����7nowy_obywatel.pngPK�X?(
�EE���7nowy_obywatel.recipePK�X�C�tt����7npr.pngPK�X�!K���
��(�7npr.recipePK�X�C�tt��.�7npr_music_blogs.pngPK�Xѯ�����7npr_music_blogs.recipePK�X�~�a����8nrc-nl-epub.pngPK�Xk�Ƿ�����8nrc-nl-epub.recipePK�X�j0��
��
8nrc.nl.pngPK�X��Y�BB
���8nrc.nl.recipePK�X�~�a����?$8nrc_handelsblad.pngPK�X⃿�8
8
�� '8nrc_handelsblad.recipePK�X1�������18nrc_next.pngPK�XU �F�	�	��c58nrc_next.recipePK�X#�v5
��*?8nsfw_corp.pngPK�X�/U����i@8nsfw_corp.recipePK�X�v�p66��PI8nspm.pngPK�X��������L8nspm.recipePK�X�v�p66���_8nspm_int.pngPK�X	�'FF��c8nspm_int.recipePK�XEꖶ�����j8ntv_spor.pngPK�X�ve�����?o8ntv_spor.recipePK�XӈEy,,
��Au8ntv_tr.pngPK�X@}ܑbb
���}8ntv_tr.recipePK�XgT������"�8nu.pngPK�Xe<���	�		���8nu.recipePK�X;)�<����"�8nursingtimes.pngPK�X��!��O�8nursingtimes.recipePK�X�����	����8nv_en.pngPK�X:���������8nv_en.recipePK�X�����	����8nv_ru.pngPK�Xq��D����8nv_ru.recipePK�X�����	����8nv_ua.pngPK�Xr�!�����8nv_ua.recipePK�Xkw�	��"�8nymag.pngPK�X�j�
�
��f�8nymag.recipePK�X��;ۡ�
��8�8nypost.pngPK�X�kk
���8nypost.recipePK�X(BX�--����8nytimes.pngPK�X��-|,|,���8nytimes.recipePK�X�ؤ�����*9nytimes_cooking.pngPK�X��]����r.9nytimes_cooking.recipePK�X1<�4$$��|49nytimes_sports.pngPK�X���((���;9nytimes_sports.recipePK�X(BX�--��+C9nytimes_sub.pngPK�X���},},���D9nytimes_sub.recipePK�X�Fd&&��2q9nytimes_tech.pngPK�X���V�	�	��}�9nytimes_tech.recipePK�X���������9nytimesbook.pngPK�XL���:
:
����9nytimesbook.recipePK�X�g0�((���9nzherald.pngPK�XZz7UU��X�9nzherald.recipePK�X��GG
��ڻ9nzz_folio.pngPK�X�R�		��L�9nzz_folio.recipePK�X�DLp������9nzz_ger.pngPK�X�A�0����v�9nzz_ger.recipePK�XA

����9o_globo.pngPK�X5��{�
�
����9o_globo.recipePK�X��������y�9oakland_north.recipePK�X���o������9oba.pngPK�XD�R���
����9oba.recipePK�Xv��:]]��}�9observa_digital.pngPK�X�������9observa_digital.recipePK�X
�������9observatorul_cultural.pngPK�X���T����9observatorul_cultural.recipePK�X�������8:observer.pngPK�X�������3
:observer.recipePK�X��Err��N:observer_gb.pngPK�X�������:observer_gb.recipePK�X�����1:observer_reach_foundation.pngPK�Xl��S(( ��c5:observer_reach_foundation.recipePK�X%aα		���@:oc_register.pngPK�X	�������F:oc_register.recipePK�X
��a!!���Y:odenselokalavisen_dk.pngPK�XK?9oDD��6]:odenselokalavisen_dk.recipePK�X&�C����b:oesterbroavis_dk.pngPK�X�T&f�����c:oesterbroavis_dk.recipePK�X�!��]]���f:office_space.pngPK�X�tq�����|h:office_space.recipePK�X�!�P��|z:oilprice.pngPK�Xݨ�����}:oilprice.recipePK�X�B�U��
����:old_games.pngPK�XC��	�����:old_games.recipePK�X�q�KK��ّ:oldnewthing.pngPK�XS�)zz��Q�:oldnewthing.recipePK�Xi�[�00
����:omgubuntu.pngPK�X5����V�:omgubuntu.recipePK�X9mcw��
��8�:onda_rock.pngPK�X�������*�:onda_rock.recipePK�X�=F������:onemagazine.pngPK�X�f��
�
���:onemagazine.recipePK�Xe
������:onionavclub.pngPK�X&��k������:onionavclub.recipePK�XZ��o����:open_magazine.pngPK�Xc�,t���:open_magazine.recipePK�X��������,�:opennet.pngPK�X��G����:opennet.recipePK�X�x��  ��N�:opindia.pngPK�X-�300����:opindia.recipePK�X
.ۗ������:opinion_bo.pngPK�X_O�0����:opinion_bo.recipePK�X<�oL����'�:optyczne_pl.pngPK�X�ՙ((����:optyczne_pl.recipePK�X�C==
��.�:oregonian.pngPK�X��.CC����:oregonian.recipePK�Xd�ec(
(
���:oreilly_premium.pngPK�X��\0\0��`;oreilly_premium.recipePK�X,[�ff���8;oriental_daily.pngPK�X!�KK���:;oriental_daily.recipePK�X�]r����A;origo_hu.pngPK�X l����$B;origo_hu.recipePK�X8��ZZ��mI;orlando_sentinel.pngPK�X
᝛����J;orlando_sentinel.recipePK�X�U�:66	���S;orsai.pngPK�X*������&V;orsai.recipePK�X��?++���Z;osel_cz.pngPK�X3Ϋf]]��2];osel_cz.recipePK�X���p::���`;osvitaua.pngPK�X]^g�����f;osvitaua.recipePK�X���p::��m;osvitaua_ru.pngPK�X�Fn�88���r;osvitaua_ru.recipePK�X�e�&�����w;osw.pngPK�X9���
���y;osw.recipePK�Xk^�8||���~;ottawa_citizen.pngPK�X��B��3�3��i�;ottawa_citizen.recipePK�X[�A���p�;ourdailybread.pngPK�Xr���
�
����;ourdailybread.recipePK�X��=�������;outlook_business_magazine.pngPK�X冐	�� ����;outlook_business_magazine.recipePK�X�!��??��U�;outlook_india.pngPK�Xa�w�7
7
����;outlook_india.recipePK�XVi�o11��,�;oxford_mail.pngPK�X��������;oxford_mail.recipePK�X)��������;padreydecano.pngPK�X�n��h�;padreydecano.recipePK�X4&G������;pagina12.pngPK�Xwv�lOO��{�;pagina12.recipePK�X����  ���<pagina_12_print_ed.pngPK�X��I!AA��K<pagina_12_print_ed.recipePK�Xt�MY))
���"<pajama.pngPK�X��B&&
��&<pajama.recipePK�Xa�h}��
��e(<pambianco.pngPK�X��������"*<pambianco.recipePK�X,;������,<pandodaily.pngPK�X�F�y����/.<pandodaily.recipePK�X��K$����=3<panorama.pngPK�X�K/����'6<panorama.recipePK�X��p	����:=<paperli_topic.pngPK�X(,D�����?<paperli_topic.recipePK�XI�����F<paperpaper.pngPK�XB:qHH���J<paperpaper.recipePK�X���~~��4`<parisreview.pngPK�X��������b<parisreview.recipePK�X���ii���f<parlamentni_listy.pngPK�Xb�I�,,��Fh<parlamentni_listy.recipePK�X�E���m<patente_de_corso.pngPK�XK�#�����o<patente_de_corso.recipePK�X�q��mm���u<pc_advisor.pngPK�X�yRR��^w<pc_advisor.recipePK�X\�T��
���}<pc_foster.pngPK�XN���zz���<pc_foster.recipePK�X��	��
��m�<pc_lab.pngPK�XH���88
��K�<pc_lab.recipePK�Xc޺E��
����<pc_mag.pngPK�Xֺ��������<pc_world.pngPK�X��(Jww��w�<pc_world.recipePK�X�|55���<pcworld_hu.pngPK�X����|�<pcworld_hu.recipePK�X���@ZZ
��A�<pcworldro.pngPK�X�X5��	�	��ư<pcworldro.recipePK�X=�Z	RR	����<pecat.pngPK�XɅrW
W
����<pecat.recipePK�XW(�||��~�<penguin_news.pngPK�Xo�6��(�<penguin_news.recipePK�X�.R�FF����<penzberger_merkur.pngPK�X�6������Q�<penzberger_merkur.recipePK�X��������<people_daily.pngPK�X�롚���<people_daily.recipePK�X}��:((��h�<people_us_mashup.pngPK�XH6�������<people_us_mashup.recipePK�X�0�����=periodismo_humano_es.pngPK�X8��-pp���=periodismo_humano_es.recipePK�Xij�Ⱥ����=pescanik.pngPK�X4�F�SS��x=pescanik.recipePK�Xue�`gg���=peterschiff.pngPK�X�9}������=peterschiff.recipePK�X1�	�	��w=phd_comics.pngPK�X�	������W!=phd_comics.recipePK�Xe���((��:$=philippino_star_ngayon.pngPK�XQ�1�����*=philippino_star_ngayon.recipePK�X�Œ����9=phillosophy_now.pngPK�X(����
�
��u:=phillosophy_now.recipePK�XH��@��
��4H=philly.pngPK�X�}�v��
��SK=philly.recipePK�X�$wC���� S=phoronix.pngPK�X���x�����X=phoronix.recipePK�X.8�^^��	^=phys_org.pngPK�X��gg���_=phys_org.recipePK�X¯(�����%c=physics_today.pngPK�X@�/�����.d=physics_today.recipePK�X�����j=physics_world.pngPK�X�y߰���k=physics_world.recipePK�X�:pOdd���o=pilot.recipePK�XZ̨;;��uw=piratska_strana.pngPK�X�oaa���z=piratska_strana.recipePK�X� ������v=piratske_noviny.pngPK�Xn�]����k�=piratske_noviny.recipePK�X =7�����=planet_kde.pngPK�X�><zz����=planet_kde.recipePK�X�Q�::����=planet_python.recipePK�XBt�٣�
���=plus_info.pngPK�X83u�����=plus_info.recipePK�X�lށ�����=pnn.pngPK�XW��_
_

����=pnn.recipePK�X�w��aa��E�=pobjeda.pngPK�Xa%hZZ��ϥ=pobjeda.recipePK�X��#Z��	��U�=poche.pngPK�X+����o�=poche.recipePK�X��!��(�=podnikatel.pngPK�X������q�=podnikatel.recipePK�X�0���P�=poetrymagazine.pngPK�X��drZZ����=poetrymagazine.recipePK�X�w�pp��%�=politico.pngPK�X'��A������=politico.recipePK�XkE��������=politifact.pngPK�X�ě}~~����=politifact.recipePK�Xg�r^����S�=politika.pngPK�XK�qioo���=politika.recipePK�X���������>politiken_dk.pngPK�X��!!���>politiken_dk.recipePK�X���]����	
>politiko_dk.pngPK�XZ5__���
>politiko_dk.recipePK�X��ů����>polityka.pngPK�Xz�uo�	�	��c>polityka.recipePK�X��=�ff��{>polizeipress_de.pngPK�X�������>polizeipress_de.recipePK�Xk��::
��9'>polter_pl.pngPK�XU��~VV���)>polter_pl.recipePK�X�Y����"6>popscience.pngPK�X��SS��F7>popscience.recipePK�X�Gy���?>portafolio.pngPK�X��i����@>portafolio.recipePK�XH��G��
��DH>portfolio.pngPK�X�yGG��I>portfolio.recipePK�X&��KK���O>portfolio_hu.pngPK�X!�CK..��T>portfolio_hu.recipePK�Xr�Rx��jX>portfolio_hu_hu.pngPK�XB0�����\>portfolio_hu_hu.recipePK�X/OԖ����`>post_today.pngPK�X�a�j	j	���b>post_today.recipePK�X�[�!!��-l>poughkeepsie_journal.pngPK�X��������t>poughkeepsie_journal.recipePK�Xn���
���x>ppe_pl.pngPK�X�OCC
��@z>ppe_pl.recipePK�X#.�������~>praguemonitor.pngPK�X�������>praguemonitor.recipePK�X�t�  ��o�>pragyata.pngPK�X)�W�))����>pragyata.recipePK�XV�PP
���>pravda.pngPK�X*_�2�
�

����>pravda.recipePK�X�!�ɩ�
��a�>pravda_it.pngPK�X�p����5�>pravda_it.recipePK�X�!�ɩ�����>pravda_por.pngPK�Xu�������W�>pravda_por.recipePK�X�]0]]
��9�>pravda_rs.pngPK�X��ȟTT����>pravda_rs.recipePK�X�V <<
��C�>pravda_ru.pngPK�X'`b�������>pravda_ru.recipePK�X9E'��
��w�>pravda_uk.pngPK�X�H;;��c�>pravda_uk.recipePK�X9E'������>pravda_ukraine.pngPK�XSd�Y�	�	����>pravda_ukraine.recipePK�X9E'������>pravda_ukraine_ru.pngPK�X�������>pravda_ukraine_ru.recipePK�XQ�y`EE	��N�>pravo.pngPK�Xn�(		����>pravo.recipePK�X�8��aa��?prekshaa.pngPK�X>��++���?prekshaa.recipePK�X��Ez	z	���
?press_information_bureau.pngPK�X�Z
g�����?press_information_bureau.recipePK�X��=�ff���?presse_portal.pngPK�XL!�����e?presse_portal.recipePK�X������S;?pressonline.pngPK�X�-�!
!
��A<?pressonline.recipePK�X�������I?pressthink.pngPK�X�_�		���J?pressthink.recipePK�X݂!������S?private_eye.pngPK�X�	��&�&���[?private_eye.recipePK�X�������?pro_linux_de.pngPK�X�iUc���?pro_linux_de.recipePK�X��������T�?pro_physik.pngPK�X)�S�VV��A�?pro_physik.recipePK�X�n��JJ��Ɩ?project.pngPK�XX�ْ;;��9�?project.recipePK�X�n��JJ����?project_en.pngPK�X��e�����?project_en.recipePK�X�7xr����.�?project_syndicate.pngPK�XU�/�%%���?project_syndicate.recipePK�X$�-�22	��t�?projo.pngPK�XF "u����͸?projo.recipePK�X{�`����ٿ?promotor.pngPK�XWߊ��
�
����?promotor.recipePK�X"�V�����p�?propublica.pngPK�X=�>�����?�?propublica.recipePK�X���m����D�?prosleduet.pngPK�X%H0������?prosleduet.recipePK�X�i9aa����?prospectmaguk.pngPK�X�r�����n�?prospectmaguk_free.pngPK�X }Bj66��(�?prospectmaguk_free.recipePK�X��
<������?prosport.pngPK�XCL~"����F@prosport.recipePK�X�I�)MM��9@prostamerika.pngPK�X�^������@prostamerika.recipePK�X�b�-�����@protagon.pngPK�X��4�����@protagon.recipePK�Xl>������@protvmagazin.pngPK�X1�M��
�
���@protvmagazin.recipePK�XQ�
�``	���"@psych.pngPK�X�p��jj��%@psych.recipePK�X7�u�##���-@psychologies.pngPK�X�DVo�����/@psychologies.recipePK�XP��JJ���8@pubblico_giornale.recipePK�XY��{����g=@publicdomainreview_org.pngPK�X������KB@publicdomainreview_org.recipePK�X��L�""��)G@publico.pngPK�X�6y�
�
��tH@publico.recipePK�XP?x���� S@publika.pngPK�X0<�0����"T@publika.recipePK�X�
Ul))���Y@punto_informatico.pngPK�X�]M�CC��9[@punto_informatico.recipePK�X�ȅ3�����_@pure_pc.pngPK�X�������`@pure_pc.recipePK�X�0H������c@pvp_online.pngPK�X~��kk���e@pvp_online.recipePK�X�ɹ����h@quanta_magazine.pngPK�X�}�33���j@quanta_magazine.recipePK�X1H!��Dn@queleer.pngPK�X�V�]::��oq@queleer.recipePK�X��--���x@queueacmorg.pngPK�X�q
����/z@queueacmorg.recipePK�X(q7``��}@quotidiano.pngPK�XZ����~@quotidiano.recipePK�Xr�抾�
��؆@rabble_ca.pngPK�X��[7������@rabble_ca.recipePK�XՄ������y�@radikal_tr.pngPK�X'�J����:�@radikal_tr.recipePK�X���i����'�@radio_canada.recipePK�X�������@radio_prague.pngPK�X�i4�22��(�@radio_prague.recipePK�X��������@radio_praha.pngPK�X.3��<<����@radio_praha.recipePK�XM]������@radiosvoboda_ua.pngPK�XY��77��%�@radiosvoboda_ua.recipePK�X
��a!!����@randerslokalavisen_dk.pngPK�X@M�DD����@randerslokalavisen_dk.recipePK�Xq=yJ��
��f�@rbc_ru.pngPK�X��&3ZZ
��+�@rbc_ru.recipePK�X�4�d������@rbcua_ru.pngPK�XF1�t����d�@rbcua_ru.recipePK�X�4�d����P�@rbcua_ua.pngPK�X��˝++��Arbcua_ua.recipePK�X:�V77��\Ards.pngPK�X\�<(��
���
Ards.recipePK�XW#���
Areaders_digest.pngPK�X�T�G}
}
���Areaders_digest.recipePK�X*�IÌ����Areadersdigest_thehealthy.pngPK�XН38%%��U%Areadersdigest_thehealthy.recipePK�XDj(((���3Areaditlater.pngPK�X�go�����6Areaditlater.recipePK�Xf⾐�����PAreal_clear.pngPK�XhC
�))���UAreal_clear.recipePK�XI�Z������~Areal_world_economics_review.pngPK�X`e�88"����Areal_world_economics_review.recipePK�X�0�>�
�
��n�Arealitatea.pngPK�XӲb7����}�Arealitatea.recipePK�X#V'����0�Areason_magazine.pngPK�X�=�ć����Areason_magazine.recipePK�X�Z�B����δArebelion.pngPK�XRt�qq��طArebelion.recipePK�X�9nn��v�Ared_aragon.pngPK�Xi�����Ared_aragon.recipePK�Xb��-����Ared_voltaire.pngPK�X�p����� �Ared_voltaire.recipePK�X*�������Aregina_leader_post.pngPK�X倓�v v ��"�Aregina_leader_post.recipePK�X��M���Areplicavedetelor.pngPK�Xfq--���Areplicavedetelor.recipePK�X?���[[
��nBrepublica.pngPK�X�{
����Brepublica.recipePK�X��$Ti
i
��<Brepublika.recipePK�X��r{{���Brespekt_magazine.pngPK�X�yWY�����Brespekt_magazine.recipePK�Xmi@..��z7Breuters.pngPK�X��|���9Breuters.recipePK�Xhrt������HBreuters_ja.pngPK�X����##���JBreuters_ja.recipePK�XK�ឆ���+NBrevista_bla.pngPK�X�U��dd���NBrevista_bla.recipePK�X�-��rVBrevista_cromos.pngPK�XҒ�����ZBrevista_cromos.recipePK�X�P��ZZ���`Brevista_muy.pngPK�X����!!��teBrevista_muy.recipePK�XS-�[[���xBrevista_piaui.pngPK�X*��L@@��O�Brevista_piaui.recipePK�X:a**����Brevista_semana.pngPK�XqxHPFF���Brevista_semana.recipePK�Xޭ!�����Brevista_summa.pngPK�Xo2�/dd��ߏBrevista_summa.recipePK�Xo��Q^^��u�Brevista_veintitres.pngPK�X��@������Brevista_veintitres.recipePK�X�;�����=�Brga.pngPK�X������
����Brga.recipePK�Xd�$������Brheinische_post.pngPK�XZ��pII����Brheinische_post.recipePK�X�_�u��
���Bria_ru.pngPK�X���6��
��/�Bria_ru.recipePK�X2q�D�	�	����Brian_eng.pngPK�X���HH����Brian_eng.recipePK�X2q�D�	�	���Brian_spa.pngPK�X�"�5������Brian_spa.recipePK�XĝH����Brmf24_ESKN.pngPK�X�������Brmf24_ESKN.recipePK�XĝH����Brmf24_fakty.pngPK�X��C�� �Brmf24_fakty.recipePK�XĝH��\�Brmf24_opinie.pngPK�X���$$����Brmf24_opinie.recipePK�X/ZUCC���Broger_ebert.pngPK�X32����b�Broger_ebert.recipePK�X/ZUCC��
Croger_ebert_blog.pngPK�X\�r������Croger_ebert_blog.recipePK�XM1�NN��L%Crollingstone.pngPK�Xʝ��}}���'Crollingstone.recipePK�Xg�9S����v+Cromanialibera.pngPK�X������h,Cromanialibera.recipePK�X
�.:����X3Croot.pngPK�X�E0���}4Croot.recipePK�XEE����?:Crosbalt.pngPK�X<<CH�	�	��CCrosbalt.recipePK�X
��a!!���LCroskildelokalavisen_dk.pngPK�X.-�
77��PCroskildelokalavisen_dk.recipePK�X\?~�����yUCrt.pngPK�X�L*	���XCrt.recipePK�Xp�����[Crte.pngPK�Xu����
���\Crte.recipePK�X��›
���`Crtnews.pngPK�X����
�

��(cCrtnews.recipePK�X������nCrts.pngPK�X�> ��	�	
��oCrts.recipePK�Xk255���xCrubikon_de.pngPK�X�/�p����\zCrubikon_de.recipePK�X
��a!!�� Crudersdallokalavisen_dk.pngPK�Xy�,3jj��z�Crudersdallokalavisen_dk.recipePK�XۋVC	�� �Crue89.pngPK�XI�j
9
9
��ƊCrue89.recipePK�X������)�Crushisaband.pngPK�X0\�U���Crushisaband.recipePK�Xܻ���k�Crusiahoy.pngPK�X�m���S�Crusiahoy.recipePK�XNR������Crussiafeed.pngPK�X
���W�Crussiafeed.recipePK�XL��������Crynek_infrastruktury.pngPK�X.ߚB������Crynek_infrastruktury.recipePK�XJ`��������Crynek_zdrowia.pngPK�X�	�z������Crynek_zdrowia.recipePK�X8��5ii���Crzeczpospolita.pngPK�X��S�����Crzeczpospolita.recipePK�XA^��������Csa_gazeta.recipePK�X,ѱ�??	����Csabah.pngPK�X	�����"�Csabah.recipePK�X
1'�))���Csabit_fikir.pngPK�X��^6__��b�Csabit_fikir.recipePK�Xb�
������Csaechsische.pngPK�X�csǓ�����Csaechsische.recipePK�X'���
����Csage_news.pngPK�XB@??��h�Csage_news.recipePK�X3Hrl9
9
����Csage_news_opinion.pngPK�X��GAVV��A�Csage_news_opinion.recipePK�Xn"
�	���Dsalon.pngPK�X-�<HUU���	Dsalon.recipePK�Xl�E	E	��{Dsalonica_press_news.pngPK�X(2q�{	{	���Dsalonica_press_news.recipePK�X���Y�����"Dsamanyolu_haber.pngPK�X���88���$Dsamanyolu_haber.recipePK�X�\1���
-Dsamanyolu_teknoloji.pngPK�XXa�see��H9Dsamanyolu_teknoloji.recipePK�X��JJJ���@Dsan_fran_chronicle.pngPK�X��D��cBDsan_fran_chronicle.recipePK�X���DD���JDsanjosemercurynews.pngPK�Xe��M����*LDsanjosemercurynews.recipePK�X�BD����MQDsarajevo_x.pngPK�XQyO�
�
��\RDsarajevo_x.recipePK�Xl�،���t]Dsardinia_post.pngPK�X����/bDsardinia_post.recipePK�X��|�����gdDsaskatoon_star_phoenix.pngPK�X/h�w w ��thDsaskatoon_star_phoenix.recipePK�X�p��
��&�Dsatira.pngPK�X����
��
�Dsatira.recipePK�X�*�v
���Dsatkurier.pngPK�X��Bk�����Dsatkurier.recipePK�X�!o������Dsatmagazine.pngPK�X��
�]]���Dsatmagazine.recipePK�XOA"���
����Dsb_nation.pngPK�X���d--��J�Dsb_nation.recipePK�X�K��������Dschattenblick.pngPK�Xƒ�������Dschattenblick.recipePK�X�.R�FF����Dschongauer_nachrichten.pngPK�X�P������D�Dschongauer_nachrichten.recipePK�X��]]��r�Dschwarzerpfeil.pngPK�X��m}}����Dschwarzerpfeil.recipePK�X��f����o�Dscience_advances.pngPK�X��		��h�Dscience_advances.recipePK�Xq�������Dscience_based_medicine.pngPK�Xp;HU##����Dscience_based_medicine.recipePK�X�^k������Dscience_news.pngPK�X�ir�

���Dscience_news.recipePK�X
IhbXX���Escience_news_recent_issues.pngPK�XyZX������Escience_x.recipePK�X>��22��mEsciencedaily.pngPK�X�x۾�����Esciencedaily.recipePK�X@S-�����Escientific_american.pngPK�X�~P"���Escientific_american.recipePK�X",N������&Escinexx.pngPK�X�Xc�����'Escinexx.recipePK�X�G99���*Escmp.pngPK�XP�t]#]#��/Escmp.recipePK�X�	C�����REscott_hanselman.pngPK�X*�S�����UEscott_hanselman.recipePK�X*<з����ZEscprint.pngPK�XHwl�����aEscprint.recipePK�X�Cme**
��QpEscroll.pngPK�X����;	;	
���qEscroll.recipePK�X2��;;��	{Eseanhannity.pngPK�X�ŀ<����qEseanhannity.recipePK�X�+)33����Eseattle_times.pngPK�X��%������Eseattle_times.recipePK�XY������Esecurity_watch.pngPK�Xg�
1�����Esecurity_watch.recipePK�X[�ܞ����7�Esekurak_pl.pngPK�XY�#�����Esekurak_pl.recipePK�X䰶�����Eseminar_magazine.pngPK�X["�;<<����Eseminar_magazine.recipePK�X�Wy  ���Eserverside.pngPK�X��?�XX��b�Eserverside.recipePK�XY�������Esfbg.pngPK�X
�������Esfbg.recipePK�X��`j����ºEsfin.pngPK�Xw�d������Esfin.recipePK�X�*�-	��z�Esg_hu.pngPK�XX�~h������Esg_hu.recipePK�X��U��
����Eshacknews.pngPK�XU'@����V�Eshacknews.recipePK�X	Kz���
���Eshortlist.pngPK�X��@�i	i	��"�Eshortlist.recipePK�Xr/��������Esigma_live.pngPK�X��F�������Esigma_live.recipePK�X^�N����O�Esign_of_the_times.pngPK�XH �ފ���'�Esign_of_the_times.recipePK�XP��;22����Esign_on_sd.pngPK�X��<����E�Esign_on_sd.recipePK�X�&	����Y�Esilicon_republic.pngPK�X���TT����Esilicon_republic.recipePK�X�@g�[	[	���Esingtao_daily.pngPK�X%��ҿ����Fsingtao_daily.recipePK�X4l��
���Fsingtaohk.pngPK�X�Lc
c
���Fsingtaohk.recipePK�X�ԉ����"Fsiol.pngPK�XԜv\�����Fsiol.recipePK�X�W�''���(Fsisainlive.pngPK�X�|k�����!.Fsisainlive.recipePK�XDK�A$$��#6Fsizinti_derigisi.pngPK�XoG������y=Fsizinti_derigisi.recipePK�XzHN�WW��vBFskai.pngPK�X�*/������CFskai.recipePK�X
��a!!���KFskanderborglokalavisen_dk.pngPK�X�J��� ��JOFskanderborglokalavisen_dk.recipePK�X/2�)����(UFskeptic.pngPK�Xg"������$XFskeptic.recipePK�X��3�UU��J^Fskeptical_enquirer.pngPK�X�(i
i
���fFskeptical_enquirer.recipePK�X곿PP��stFskylife.pngPK�XK������{Fskylife.recipePK�X�s��������Fslashdot.pngPK�X$	4w==����Fslashdot.recipePK�X>�N.��	���Fslate.pngPK�X[�Cm@@��ωFslate.recipePK�X��g��9�Fslate_star_codex.pngPK�X��a����}�Fslate_star_codex.recipePK�X��d���	��F�Fslovo.pngPK�X�E4�����I�Fslovo.recipePK�X�O�Wxx��e�Fsmashing.pngPK�X��׏kk���Fsmashing.recipePK�X�V�������Fsme.pngPK�X�}���
����Fsme.recipePK�X8�tt������Fsmh.pngPK�X&��
����Fsmh.recipePK�X���ӹ	�	����Fsmilezilla.recipePK�XC&�	����Fsmith.pngPK�X��f?
?
����Fsmith.recipePK�X�g	��A�Fsn_dk.pngPK�X5��\\����Fsn_dk.recipePK�X�>����Fsnob.pngPK�X���??��A�Fsnob.recipePK�Xd
�<��
����Fsnopes.pngPK�X�v5���
��S�Fsnopes.recipePK�XR#�&66
��|Gsobaka.pngPK�X�֗rll
���Gsobaka.recipePK�X$�������qGsobesednik.pngPK�X�ḏ����Gsobesednik.recipePK�XN������eGsocialdiva.pngPK�X��V�����*Gsocialdiva.recipePK�X
��a!!��0$Gsoenderborglokalavisen_dk.pngPK�X}�?��� ���'Gsoenderborglokalavisen_dk.recipePK�X+��Z~~
��j-Gsol_haber.pngPK�Xm�^����0Gsol_haber.recipePK�X7��N����@EGsoldiers.pngPK�X�X�N����_FGsoldiers.recipePK�X�<ޯ����:KGsomething_awful.pngPK�XH�������
LGsomething_awful.recipePK�X.b�������aGsondagsavisen_dk.pngPK�X7#�955��dGsondagsavisen_dk.recipePK�X���=vv��ngGsouthernstar.pngPK�X�\^..��nGsouthernstar.recipePK�X�*�c����q�Gsova.pngPK�X3E4D##��"�Gsova.recipePK�X\���""��n�Gspectator-au.pngPK�X-n�������Gspectator-au.recipePK�X`R�T����ΤGspectator_magazine.pngPK�X��Udd����Gspectator_magazine.recipePK�X)�j�``��>�Gspektrum.pngPK�X�ىxx��ȼGspektrum.recipePK�X�_ �CC��m�Gspiegel_int.pngPK�X)�az

����Gspiegel_int.recipePK�X�_ �CC
���Gspiegelde.pngPK�X*�=[([(����Gspiegelde.recipePK�X��&�==���Gspin_magazine.pngPK�X��׍��|Hspin_magazine.recipePK�X#	�u^^���Hsportowefakty.pngPK�X��Ott��SHsportowefakty.recipePK�X�(�����Hsports_illustrated.pngPK�XI�J~�����Hsports_illustrated.recipePK�XA��
��(Hsportstar.pngPK�X{��(����cHsportstar.recipePK�X�.s�""
���+Hsporza_be.pngPK�X��������.Hsporza_be.recipePK�X�|KK���4Hst_louis_post_dispatch.pngPK�XK�������b8Hst_louis_post_dispatch.recipePK�Xp@����VHstackoverflow.pngPK�X^�ڃ����WHstackoverflow.recipePK�X)��!!��o[Hstamgasten.pngPK�X?+���]Hstamgasten.recipePK�X^s�HHH���`Hstandardmedia_ke.pngPK�XI������pcHstandardmedia_ke.recipePK�X��!ll��'jHstandardmoney.pngPK�X�C8�SS���kHstandardmoney.recipePK�X���--��GpHstar_gazetesi.pngPK�XBm��d	d	���uHstar_gazetesi.recipePK�X{��zz��9Hstaradvertiser.pngPK�X_�������Hstaradvertiser.recipePK�X�.R�FF���Hstarnberger_merkur.pngPK�X􋙷DD����Hstarnberger_merkur.recipePK�X��
����	�Hstars_and_stripes.pngPK�XLý�qq��ٜHstars_and_stripes.recipePK�X�8��������Hstarwars.pngPK�XD�~~��6�Hstarwars.recipePK�X�V+mm���Hstiintasitehnica.pngPK�X�+jss����Hstiintasitehnica.recipePK�XT�!�����(�Hstnn.pngPK�X��&������Hstnn.recipePK�X]1w�&&����Hstopgame.pngPK�X�M
����%�Hstopgame.recipePK�X%�m����2�Hstraitstimes.pngPK�X"�a����"�Hstraitstimes.recipePK�X�e�~~����Hstrange_horizons.pngPK�X���z�
�
����Hstrange_horizons.recipePK�X�6��rr��r�Hstrategic_culture.pngPK�X�CqS�����Hstrategic_culture.recipePK�Xn�5oxx����Hstrategy-business.pngPK�Xg{�������Hstrategy-business.recipePK�X�<� LL��kIsubstack.pngPK�XK��EE���Isubstack.recipePK�X�)��ww��SIsueddeutsche.pngPK�X�2�xx���Isueddeutsche.recipePK�X���ff���+Isueddeutsche_mobil.pngPK�X4�]���;0Isueddeutsche_mobil.recipePK�X�2�s���DIsueddeutschezeitung.pngPK�Xr��������EIsueddeutschezeitung.recipePK�X$H��DD���XIsunday_times_magazine.pngPK�Xcba�VV��DZIsunday_times_magazine.recipePK�X��(,,
���oIsuperbebe.pngPK�X��D����+qIsuperbebe.recipePK�X
�����vIsuperesportes.pngPK�XE[֮&
&
���|Isuperesportes.recipePK�X
_Tޓ�
���Isvd_se.pngPK�X�D{�����ԊIsvt_nyheter.pngPK�XS6�`����ȎIsvt_nyheter.recipePK�X�i�ss����Iswarajya.pngPK�X.��M((��J�Iswarajya.recipePK�X��7�ii����Iswiat_obrazu.pngPK�X�j�#��6�Iswiat_obrazu.recipePK�X�t������j�Iswiatkindle.pngPK�X��K&&��~�Iswiatkindle.recipePK�X
��a!!��ԫIsyddjurslokalavisen_dk.pngPK�Xa�b����-�Isyddjurslokalavisen_dk.recipePK�Xz��
���It3n_de.pngPK�X��Luu
��)�It3n_de.recipePK�X�hTaa��ɿIt_online.pngPK�X81����T�It_online.recipePK�X�-''����Itablety_pl.pngPK�X�LVpp����Itablety_pl.recipePK�XDP�����~�Itabu.pngPK�X�H�����(�Itabu.recipePK�Xk��������Itagesan.pngPK�X�����Itagesan.recipePK�X|��*�
�

���Itagespost.pngPK�X͏������Itagespost.recipePK�X(5-Skk��"�Itagesspiegel.pngPK�Xi�&FF����Itagesspiegel.recipePK�X�t?s����2�Itaggeschau_de.pngPK�X�sZ'����@Jtaggeschau_de.recipePK�X���
��bJtaipei.pngPK�X�SQ��
���Jtaipei.recipePK�X�d�S��
��JJtakiedela.pngPK�X��3)-)-���Jtakiedela.recipePK�XKZ��AA	��REJtanea.pngPK�XU��{�����HJtanea.recipePK�XM�v��
��jNJtanuki.pngPK�X��s�?	?	
���QJtanuki.recipePK�Xқ�LL	���ZJtayga.pngPK�X���*����h`Jtayga.recipePK�X$1 ����qfJtaz.pngPK�X�W!��
��hJtaz.recipePK�X+�b������pJtaz_rss.pngPK�X���	�	���qJtaz_rss.recipePK�XZ}�v//���{Jtech_economy.pngPK�X�.TT���Jtech_economy.recipePK�X�@�������Jtech_world.pngPK�X�k;c������Jtech_world.recipePK�X���Oaa����Jtechcrunch.pngPK�X���K�����Jtechcrunch.recipePK�X�Q�n�����Jtechdirt.pngPK�X��@������Jtechdirt.recipePK�X�45

��֘Jtechnology_review.pngPK�XKV�?::���Jtechnology_review.recipePK�X�`������Jtechnology_review_de.pngPK�X#�X̘���i�Jtechnology_review_de.recipePK�X$ ������:�Jtechtarget.pngPK�X���ll��J�Jtechtarget.recipePK�X�Y�,��
���Jtedneward.pngPK�X�H=�����Jtedneward.recipePK�X�.R�FF����Jtegernseer_zeitung.pngPK�XMe5d����;�Jtegernseer_zeitung.recipePK�X��|�����"�Jtehelka.recipePK�XH�Փ�	��B�Jtelam.pngPK�X㽽ƌ�����Jtelam.recipePK�X�D�ڕ�����Jtelegraph_in.pngPK�X�'��NN��u�Jtelegraph_uk.pngPK�XmJ�aa
����Jtelepolis.pngPK�X��g����}�Jtelepolis.recipePK�XmJ�aa����Jtelepolis_artikel.pngPK�X��YC�����Jtelepolis_artikel.recipePK�X͆�&hh���Jteleread.pngPK�X=��������Jteleread.recipePK�X�/4Ҩ�����Jthai_post_daily.pngPK�X�#5k������Jthai_post_daily.recipePK�Xc0p������
Kthairath.pngPK�X��fww���Kthairath.recipePK�X�r�u��YKthe_age.pngPK�X����
�
���Kthe_age.recipePK�X�.��yy���&Kthe_athletic.pngPK�X\��?����`(Kthe_athletic.recipePK�X�.Zx����z1Kthe_baffler.pngPK�XDy�����b3Kthe_baffler.recipePK�Xx�����@Kthe_budget_fashionista.pngPK�X]�������AKthe_budget_fashionista.recipePK�XO��#GG���DKthe_clinic_online.pngPK�X��KK��kGKthe_clinic_online.recipePK�XG`r����KKthe_conversation.pngPK�X��������$OKthe_conversation.recipePK�X�9Y`��4TKthe_daily_news_egypt.pngPK�X�}����ZKthe_daily_news_egypt.recipePK�X��d������aKthe_diplomat.pngPK�X�{��HH���eKthe_diplomat.recipePK�X�Ƽ����MrKthe_escapist.pngPK�Xэ������+uKthe_escapist.recipePK�X�\�q����G}Kthe_feature.pngPK�X�Fzqff���Kthe_feature.recipePK�X��l�����Kthe_federalist.pngPK�X�����
�
���Kthe_federalist.recipePK�X��O�!!���Kthe_freeman.pngPK�Xyk�22��6�Kthe_freeman.recipePK�X�2������Kthe_friday_times.pngPK�X��������Kthe_friday_times.recipePK�X�bƹ�����Kthe_insider.pngPK�X6$�����Kthe_insider.recipePK�X1Z��qq��K�Kthe_journal.pngPK�X,�,�����Kthe_journal.recipePK�XW�L������Kthe_manila_bulletin.pngPK�X��9D%%��}�Kthe_manila_bulletin.recipePK�X����		����Kthe_manila_times.pngPK�X-H{���Kthe_manila_times.recipePK�XX�E}����R�Kthe_marker.pngPK�X�=�0*	*	��+�Kthe_marker.recipePK�X2R�4

����Kthe_monthly.recipePK�X�$ʺ����Kthe_nation.pngPK�XTˎ������Kthe_nation.recipePK�X��������Lthe_new_age_za.pngPK�XH��K�����Lthe_new_age_za.recipePK�X�>��rr���Lthe_new_republic.pngPK�X/m���
��<Lthe_oz.pngPK�X�ܐU


��Lthe_oz.recipePK�X���h��!��ILthe_philippine_daily_inquirer.pngPK�X�B�!�!$��c Lthe_philippine_daily_inquirer.recipePK�X��O�!!��uBLthe_philippine_star.pngPK�X=l����ILthe_philippine_star.recipePK�XL�ЊCC��bLthe_press_project.recipePK�X��%T����eLthe_register.pngPK�XhZ�AA���gLthe_register.recipePK�X�P<�����jLthe_saturday_paper.pngPK�X��s���kLthe_saturday_paper.recipePK�XL�Ý���1wLthe_scotsman.pngPK�X������zLthe_scotsman.recipePK�X�~�U����E�Lthe_sun.pngPK�X͙�0O
O
��h�Lthe_sun.recipePK�X�_�K``
���Lthe_verge.pngPK�XX��2����n�Lthe_verge.recipePK�X��|
	
	����Lthe_week.pngPK�X܎�����Lthe_week.recipePK�X4k����Lthe_week_magazine_free.pngPK�XbPq��
�
��G�Lthe_week_magazine_free.recipePK�X4k���n�Lthe_week_uk.pngPK�X�!|�
�
����Lthe_week_uk.recipePK�X
#dd����Lthe_wire.pngPK�X��92����c�Lthe_wire.recipePK�X`�vN�����Lthe_workingham_times.pngPK�X�|�||��7�Lthe_workingham_times.recipePK�X\֦Xkk����Lthebell.pngPK�XAN�

����Lthebell.recipePK�X�]�zz����Lthecodelesscode.pngPK�X2�o����a�Lthecodelesscode.recipePK�X��������jMthecultofghoul.pngPK�X7nd]]���Mthecultofghoul.recipePK�X�������$
Mthedailywtf.pngPK�X�r�������Mthedailywtf.recipePK�X�5nn���Mthedgesingapore.pngPK�XA�R�����Mthedgesingapore.recipePK�X�]�CDD��GMtheecocolapse.pngPK�X��_����� Mtheecocolapse.recipePK�X�D�������&Mtheeconomictimes_india.pngPK�XO���
�
���'Mtheeconomictimes_india.recipePK�XR'�<XX(���2Mtheeconomictimes_india_print_edition.pngPK�X6���HH+��j7Mtheeconomictimes_india_print_edition.recipePK�X#�ᚅ����FMtheindiaforum.pngPK�X���c���KMtheindiaforum.recipePK�XWI�e�����VMtheluminouslandscape.pngPK�X�<�]mm���YMtheluminouslandscape.recipePK�X!�bHH���^Mthemarketticker.pngPK�X�������_Mthemarketticker.recipePK�Xv�(SS���bMthemorningpaper.pngPK�X��:�����{hMthemorningpaper.recipePK�Xƪ�ii��umMthenewcriterion.pngPK�X�.��xx��nMthenewcriterion.recipePK�X��/G^^���~Mthenews.pngPK�X���	
	
��B�Mthenews.recipePK�XE�w����w�Mtheoldfoodie.pngPK�X`�,������Mtheoldfoodie.recipePK�X`�.�$�$����Mtheoldie.recipePK�X�+�?��|�Mtheonion.pngPK�X-�-X������Mtheonion.recipePK�X�ܪ==��f�Mtheonlinephotographer.recipePK�X�:L�,,����Mtheprint.pngPK�X�eH����3�Mtheprint.recipePK�Xَ������=�Mthestar.pngPK�X���Y		���Mthestar.recipePK�XI�e�JJ��A�Mthewest_au.pngPK�X���m		����Mthewest_au.recipePK�X�u�f������Mthink_progress.pngPK�Xӧ�9������Mthink_progress.recipePK�X*|��((����Mthn.pngPK�X[w�BB
���Mthn.recipePK�X?��00��l�Mtidbits.pngPK�X���T]]���Mtidbits.recipePK�X���A����NNtijd.pngPK�Xt1�(
(
��Ntijd.recipePK�X�A�%@@��]Ntijolaco.pngPK�XO������Ntijolaco.recipePK�X>1�.00���Ntillsonburg.pngPK�X�z
�==��=Ntillsonburg.recipePK�X���v\\��� Ntime_magazine.pngPK�X�`��
�
��5!Ntime_magazine.recipePK�X�.F9��
��7,Ntime_turk.pngPK�X�l;�^^���.Ntime_turk.recipePK�X[ky�vv��p0Ntimes_of_malta.pngPK�X."�HH��3Ntimes_of_malta.recipePK�X Vl8�����4Ntimes_online.pngPK�X�n����M5Ntimes_online.recipePK�XFU	�����JNNtimesnewroman.pngPK�XuaW؟���PNtimesnewroman.recipePK�X󵤟���UNtitanic_de.pngPK�XԤ�a����WNtitanic_de.recipePK�X�E�\�����XNtjournal.pngPK�X�>�;
;
���YNtjournal.recipePK�X�/�����>dNtmz.pngPK�X�e�s	s	
���fNtmz.recipePK�X=��e�����pNtnxm.pngPK�XL���jqNtnxm.recipePK�Xd/:@@���tNtoday_online.pngPK�X����
�
��wNtoday_online.recipePK�X	�y۠���ځNtodays_zaman.recipePK�X'Y]�11����Ntoi.pngPK�X�.


���Ntoi.recipePK�X'Y]�11��6�Ntoiprint.pngPK�Xq��R������Ntoiprint.recipePK�X�.R�FF��s�Ntolzer_kurier.pngPK�X�=�pSS����Ntolzer_kurier.recipePK�X�v�ȭ���m�Ntomshardware.pngPK�XR�r	r	��H�Ntomshardware.recipePK�X�v�ȭ�����Ntomshardware_de.pngPK�Xr��������Ntomshardware_de.recipePK�X��Ψ�����Ntomshardware_it.pngPK�X��d�������Ntomshardware_it.recipePK�X�M�	�����Ntoronto_sun.pngPK�X��PEqq
����Ntovima.pngPK�XV_uN]]
��J�Ntovima.recipePK�X�
�������Otoyokeizai.pngPK�X^>?F	F	���Otoyokeizai.recipePK�X���ff
��^Otpm_uk.pngPK�XF�W
���Otpm_uk.recipePK�X��*JJ��2Otri_city_herald.pngPK�XWp������Otri_city_herald.recipePK�X�tE5))���Otrojmiasto_pl.pngPK�XT��[��� Otrojmiasto_pl.recipePK�X��*PP��-Otrombon.pngPK�X?c@:�����.Otrombon.recipePK�X�����	���3Otrouw.pngPK�X�����4Otrouw.recipePK�X��������<Otrv.pngPK�X��WW
��>Otrv.recipePK�Xr�l������FOtrystero.recipePK�Xa�#���IOtsn.pngPK�X};���
���POtsn.recipePK�XPV.n}}���SOtst.pngPK�Xo�^��7�7
��_[Otst.recipePK�X�����]�Otulsaworld.pngPK�XHMP������Otulsaworld.recipePK�X����JJ
��V�Otuttojove.pngPK�Xhxpő���˝Otuttojove.recipePK�XMڶ�������Otuttosport.pngPK�X�D�

����Otuttosport.recipePK�X�n��WW����Otv2lorry_dk.pngPK�X7%����E�Otv2lorry_dk.recipePK�X�C�0����Otv2nord_dk.pngPK�X6����A�Otv2nord_dk.recipePK�XF�4�����f�Otv2oj_dk.pngPK�X��#4pp��b�Otv2oj_dk.recipePK�X�mx���
����Otveast_dk.pngPK�X�W!B{{��ɿOtveast_dk.recipePK�X�=����r�Otvmania.pngPK�X�U
U
����Otvmania.recipePK�X�t�
??��1�Otvmidtvest_dk.pngPK�X9�!_44����Otvmidtvest_dk.recipePK�XVbNԇ�	���Otvn24.pngPK�X6�20������Otvn24.recipePK�X�4������Otvsyd_dk.pngPK�X��gKK��f�Otvsyd_dk.recipePK�X4T]a66����Otvxs.pngPK�X1�&����:�Otvxs.recipePK�X�Q8<OO��6�Otweakers.pngPK�X�5??���Ptweakers.recipePK�X��!�
�
��	Ptweakers_net.pngPK�X�N�e�����Ptweakers_net.recipePK�X�̹������Ptwitchfilms.pngPK�Xa�p44��iPtwitchfilms.recipePK�X��״	���"Ptwtfb.pngPK�XFN�������%Ptwtfb.recipePK�X�����*Ptyden.cz.pngPK�X%8�������+Ptyden.cz.recipePK�Xid�&""
���0Ptyzden.pngPK�X�
�`��
��2Ptyzden.recipePK�X;Z
�����BPua_fooball.pngPK�X�5�������DPua_fooball.recipePK�X��
���LPubuntu_pl.pngPK�XW��S����"NPubuntu_pl.recipePK�X(�ܝ��RPugeskriftet.recipePK�Xll$==��eVPukraiyns_tizhdien.pngPK�X�1�7�����WPukraiyns_tizhdien.recipePK�Xe%�_�����ZPukrinform_de.pngPK�X	��--���_Pukrinform_de.recipePK�Xe%�_����gPukrinform_en.pngPK�X9s#{����lPukrinform_en.recipePK�Xe%�_�����rPukrinform_es.pngPK�X�H�WW���wPukrinform_es.recipePK�Xe%�_����zPukrinform_fr.pngPK�Xb��__����Pukrinform_fr.recipePK�Xe%�_�����Pukrinform_ja.pngPK�XQ/L�HH��0�Pukrinform_ja.recipePK�Xe%�_������Pukrinform_pl.pngPK�X@�\JJ����Pukrinform_pl.recipePK�Xe%�_����7�Pukrinform_ru.pngPK�X�6������J�Pukrinform_ru.recipePK�Xe%�_����c�Pukrinform_uk.pngPK�X�+^�BB��v�Pukrinform_uk.recipePK�X�R�������Pultimahora.pngPK�X%
n:oo��
�Pultimahora.recipePK�X�h��SS����Puncrate.pngPK�X���	�	��'�Puncrate.recipePK�X�2��
��,�Punian_net.pngPK�X��s�AA��%�Punian_net.recipePK�X�2������Punian_net_en.pngPK�X�Wrhh����Punian_net_en.recipePK�X�2����)�Punian_net_ua.pngPK�X邪(�	�	��%�Punian_net_ua.recipePK�X��k!!	���Punica.pngPK�X�5ff��!�Punica.recipePK�X.�&�����Quninohimitu.pngPK�X'��]����}Quninohimitu.recipePK�XkT����HQunited_daily.pngPK�X�Ĵ���.
Qunited_daily.recipePK�X��	�EE��!Quniverse_today.pngPK�X_y�Q&&���)Quniverse_today.recipePK�X�"�3��
���+Qunn_ru.pngPK�X�;9֟�
���0Qunn_ru.recipePK�X�"�3��
��\BQunn_ua.pngPK�X���YY
��
GQunn_ua.recipePK�X�������XQunperiodico.pngPK�X���{{��u]Qunperiodico.recipePK�Xo�krr�� `Qupi.pngPK�X�ܗJJ
���cQupi.recipePK�X�n1�����)jQusatoday.pngPK�X�F)P
P
���kQusatoday.recipePK�X��j��
��TyQusnews.pngPK�X ��*##
��/zQusnews.recipePK�X$u����}~Qutrinski.recipePK�X&�C���+�Qvalbybladet_dk.pngPK�X��E����a�Qvalbybladet_dk.recipePK�X5TH.��W�Qvancouver_province.pngPK�X�6X��5�5����Qvancouver_province.recipePK�XcM������Qvancouver_sun.pngPK�X���N44����Qvancouver_sun.recipePK�X&�C���Rvanloesebladet_dk.pngPK�X�tN�����QRvanloesebladet_dk.recipePK�X
��a!!��_Rvardelokalavisen_dk.pngPK�X��y::���	Rvardelokalavisen_dk.recipePK�X��j����'Rvariety.pngPK�XS`V���Rvariety.recipePK�XTE����*Rvecernji_list.pngPK�X�2��	�	��Rvecernji_list.recipePK�X�w@���
���%Rvedomosti.pngPK�XJ�;r����*Rvedomosti.recipePK�X�|I�bb���/Rveintitres.pngPK�X��«�����0Rveintitres.recipePK�X
��a!!��_<Rvejlelokalavisen_dk.pngPK�X��::���?Rvejlelokalavisen_dk.recipePK�X�0gH{{��'ERversion2.pngPK�XŋJ���FRversion2.recipePK�XE�|A����RRverstka.pngPK�X�=}	����YRverstka.recipePK�X&�C����_Rvesterbrobladet_dk.pngPK�X��]�����`Rvesterbrobladet_dk.recipePK�Xea�:����dRvfr_magazine.pngPK�XO�)����;fRvfr_magazine.recipePK�Xz�11
��hRvic_times.pngPK�X�@�'�'��djRvic_times.recipePK�Xg�Z:����N�Rvice.pngPK�X��������Rvice.recipePK�Xx���

��˜Rvice_magazine.pngPK�X�АO``���Rvice_magazine.recipePK�Xx���

����Rvice_magazine_de.pngPK�XI)Y�gg��ҤRvice_magazine_de.recipePK�X�Iʉ���n�Rvignette.pngPK�X�kk��!�Rvignette.recipePK�X�@������Rvijesti.pngPK�X�e�99���Rvijesti.recipePK�X'�qkpp��R�Rvikna_ru.pngPK�X�%�YY���Rvikna_ru.recipePK�X'�qkpp��r�Rvikna_ua.pngPK�X��+���Rvikna_ua.recipePK�X�2]::��T�Rvillagevoice.pngPK�X�b�������Rvillagevoice.recipePK�X��a
����Rvio_mundo.pngPK�XS)j�11��T�Rvio_mundo.recipePK�X��Ë		����Rvirtualshackles.pngPK�X�ʏ������Rvirtualshackles.recipePK�X�wy�����Rvitalia.pngPK�X}^��������Rvitalia.recipePK�X,	�ԛ�����Rviva.pngPK�X��4\FF����Rviva.recipePK�X���K��
��$�Rvnexpress.pngPK�X����GG���Svnexpress.recipePK�XU�V����SSvoetbal_belgie.pngPK�X.�������Svoetbal_belgie.recipePK�X��|NN��Svoice_of_america.pngPK�X��6�����Svoice_of_america.recipePK�X�g��
���Svolksrant.pngPK�X�,*����Svolksrant.recipePK�X@v^��	���#Svreme.pngPK�X2�ؘ
�
��y%Svreme.recipePK�X�U��
�
��;3Svrijnederland.pngPK�X�Tc�F
F
��]ASvrijnederland.recipePK�X�t�<ii���NSwaco_tribune.recipePK�X��LL	��oSSwalla.pngPK�X��}}���USwalla.recipePK�XUT'������]Swallstreetro.pngPK�X�3�Z����_`Swallstreetro.recipePK�X�
0oo
��fSwalrusmag.pngPK�XoC�uu���gSwalrusmag.recipePK�X9t����\jSwapo_cartoons.pngPK�XUX9����kSwapo_cartoons.recipePK�X�"w���
��܁Swarentest.pngPK�X�%144��ɃSwarentest.recipePK�X���66
��+�Swash_post.pngPK�X8�	55����Swash_post.recipePK�X���66���Swash_post_print.pngPK�Xy�M�II��V�Swash_post_print.recipePK�XP%4=	=	��ӫSwash_times.recipePK�XEᜭ[[��?�Swatchingamerica.recipePK�X����WW����Sweblogs_sl.recipePK�X�.R�FF��T�Sweilheimer_tagblatt.pngPK�X��FF����Sweilheimer_tagblatt.recipePK�X&�q����M�Swelt.pngPK�XU+-������Swelt.recipePK�X'�9e�����Twelt_der_physik.pngPK�Xހ%������Twelt_der_physik.recipePK�XSBzz���Twenxuecity-znjy.recipePK�XТ���C#Twhat_if.recipePK�Xx-���'Twichita_eagle.recipePK�X-r��**��N+Twikinews_en.pngPK�X�* �		���.Twikinews_en.recipePK�X��=�vv���7Twindows_star.recipePK�X�=�2�!�!���HTwindsor_star.recipePK�X�--��fjTwinnipeg_free_press.recipePK�X�+�44���pTwinnipeg_sun.recipePK�X1�L�����0vTwinsupersite.pngPK�X�_�����xTwinsupersite.recipePK�XKPۇ	���{Twired.pngPK�X��]f&&��}Twired.recipePK�X#�P4��R�Twired_daily.pngPK�XJ���

����Twired_daily.recipePK�X#�޲�����Twired_it.recipePK�X}��ɋ�����Twirtscafts_woche.pngPK�X������[�Twirtscafts_woche.recipePK�X|��ghh��M�Twirtualnemedia_pl.pngPK�Xx�������Twirtualnemedia_pl.recipePK�X��ȧ���ܽTwnp.pngPK�X;���++
����Twnp.recipePK�XT^"c::����Twolne_media.pngPK�X��x����b�Twolne_media.recipePK�X���uu��P�Twonderzine.pngPK�Xa��9
9
����Twonderzine.recipePK�X3˴����Y�Twords_without_borders.recipePK�XN9�,cc���Tworkers_world.pngPK�X�8������Tworkers_world.recipePK�X��w�����h�Tworks_in_progress.recipePK�X�������5�Tworldcrunch.recipePK�X|!���
����Twow.recipePK�X���	�	����Twoz_die.recipePK�Xs�?_������Twsj.pngPK�XB��7I2I2
��[Uwsj.recipePK�Xs�?_�����2Uwsj_free.pngPK�Xl�C2C2��|3Uwsj_free.recipePK�X��������eUwvhooligan.pngPK�X�&O������hUwvhooligan.recipePK�X!O+--���pUxkcd.pngPK�X�_e����3rUxkcd.recipePK�X-Kލ���yUxpatloop.recipePK�X+|=**���Uyagmur_dergisi.recipePK�Xs������%�Uyahoo_news.pngPK�X}�tww��6�Uyahoo_news.recipePK�X̘	�	�	��ܐUyakima_herald.pngPK�Xh��w����Uyakima_herald.recipePK�X��!..���Uyalansavar.pngPK�XWί#����a�Uyalansavar.recipePK�X�Z����e�Uyazihane.pngPK�X�m������Uyazihane.recipePK�X�)�������Uyementimes.pngPK�XH���

��f�Uyementimes.recipePK�X1������Uyeni_umit_dergisi.recipePK�X�������׶Uyenisafak_gazetesi.pngPK�Xu'-��
�
��ԻUyenisafak_gazetesi.recipePK�X�6A�^^����Uynet.pngPK�X��`AA���Uynet.recipePK�Xn���������Uyomiuri.pngPK�X��������Uyomiuri.recipePK�Xue� 

����Uyomiuri_world.pngPK�X�s9����Uyomiuri_world.recipePK�X�5��ee��:�Uzackzack.pngPK�X\�ފ�����Vzackzack.recipePK�X��<�����Vzadolba_li.pngPK�X�9d����MVzadolba_li.recipePK�XT
7���	��Vzaman.pngPK�X*0gI�
�
���Vzaman.recipePK�X�-�!::
���#Vzaobao.pngPK�Xk�a@pp
���'Vzaobao.recipePK�X�Z������FVzaufana_trzecia_strona.pngPK�X���������GVzaufana_trzecia_strona.recipePK�X�&Xkoo
���KVzaxid_net.pngPK�X�o�X����XLVzaxid_net.recipePK�X�.��>[Vzdnet.fr.pngPK�X�%Q�����]Vzdnet.fr.recipePK�X;�c���	���eVzdnet.pngPK�X�O�+�����fVzdnet.recipePK�XT�>G00
���jVzeitde.pngPK�X�—�
���kVzeitde.recipePK�Xݼ�@@���Vzeitde_sub.pngPK�X����0808��+�Vzeitde_sub.recipePK�X��NN����Vzerocalcare.pngPK�X�:~�mm���Vzerocalcare.recipePK�X�Co�QQ
����Vzerohedge.pngPK�X6L�__���Vzerohedge.recipePK�X��iHH����Vziarulfinanciar.pngPK�Xv�s��$�Vziarulfinanciar.recipePK�X������r�Vzita_be.pngPK�X�o)����}�Vzita_be.recipePK�Xk�x���
��R�Vziuaveche.pngPK�X�?�����B�Vziuaveche.recipePK�X-�eh��	���Vzn_ru.pngPK�Xr7�}				���Vzn_ru.recipePK�X-�eh��	��3�Vzn_ua.pngPK�X\��������Vzn_ua.recipePK�XԺ�Ijj���Vznadplanszy_pl.pngPK�X,Wl~�����Vznadplanszy_pl.recipePK�XU�����
��WWzougla.pngPK�X"��AA
��lWzougla.recipePK�X�
�����Wzycie_warszawy.pngPK�X(�UB����'	Wzycie_warszawy.recipePK=
=
x?�W

Youez - 2016 - github.com/yon3zu
LinuXploit