Register Guidelines E-Books Search Today's Posts Mark Forums Read

Go Back   MobileRead Forums > E-Book Software > Calibre > Recipes

Notices

Reply
 
Thread Tools Search this Thread
Old 01-18-2025, 11:16 AM   #1
alphonk
Member
alphonk began at the beginning.
 
Posts: 10
Karma: 10
Join Date: Dec 2024
Device: kindle scribe
Contretemps (French) - recipe

Contretemps (French) - recipe


Quote:
Code:
#!/usr/bin/env python

'''
contretemps.eu
'''

from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
from calibre.web.feeds.news import BasicNewsRecipe

class ContretempsRecipe(BasicNewsRecipe):
    title = 'Contretemps'
    __author__ = 'Kabonix'
    description = 'Revue de critique communiste'
    publisher = 'Contretemps'
    category = 'politique, théorie, stratégie'
    language = 'fr'
    encoding = 'utf-8'
    oldest_article = 60
    max_articles_per_feed = 30
    publication_type = 'magazine'
    
    no_stylesheets = True
    remove_javascript = True
    auto_cleanup = False
    
    feeds = [
        ('Théorie', 'https://www.contretemps.eu/category/theorie/feed/'),
        ('Stratégie', 'https://www.contretemps.eu/category/strategie/feed/'),
        ('Conjoncture', 'https://www.contretemps.eu/category/conjoncture/feed/')
    ]

    def get_cover_url(self):
        return None

    def default_cover(self, cover_file):
        """
        Crée une couverture personnalisée pour Contretemps
        """
        from qt.core import QFont, QImage, QPainter, QPen, QRect, Qt, QColor
        from calibre.gui2 import ensure_app, load_builtin_fonts, pixmap_to_data
        try:
            # Préparation de l'environnement Qt
            ensure_app()
            load_builtin_fonts()

            # Date en français
            today = datetime.now(ZoneInfo('Europe/Paris'))
            wkd = today.weekday()
            french_weekday = {0:'Lundi',1:'Mardi',2:'Mercredi',3:'Jeudi',4:'Vendredi',5:'Samedi',6:'Dimanche'}
            french_month = {1:'janvier', 2:'février', 3:'mars', 4:'avril', 5:'mai', 6:'juin', 
                          7:'juillet', 8:'août', 9:'septembre', 10:'octobre', 11:'novembre', 12:'décembre'}
            
            weekday = french_weekday[wkd]
            month = french_month[today.month]
            date_str = f"{weekday} {today.day} {month} {today.year}"
            edition = today.strftime('Édition de %Hh%M')

            # Création de l'image de base (ratio ~1.6 pour format livre)
            img = QImage(1200, 1920, QImage.Format_RGB888)
            img.fill(QColor('white'))

            # Téléchargement et ajout du logo
            br = self.get_browser()
            logo_data = br.open_novisit('https://www.contretemps.eu/wp-content/uploads/ct14-1-512x241.jpg').read()
            logo_img = QImage()
            logo_img.loadFromData(logo_data)
            
            # Position du logo (centré)
            x = (img.width() - logo_img.width()) // 2
            y = (img.height() - logo_img.height()) // 2 - 200  # Un peu plus haut que le centre
            
            # Dessiner le logo
            p = QPainter(img)
            p.drawImage(x, y, logo_img)
            p.end()

            # Ajout des textes
            painters = [
                (36, 'Liberation Serif', False, False, date_str, (0, y + logo_img.height() + 100, 1200, 100)),
                (32, 'Liberation Serif', True, True, edition, (0, y + logo_img.height() + 200, 1200, 100))
            ]

            for font_size, font_family, is_bold, is_italic, text, rect in painters:
                p = QPainter(img)
                pen = QPen(QColor('black'))
                p.setPen(pen)
                
                font = QFont()
                font.setFamily(font_family)
                font.setPointSize(font_size)
                font.setBold(is_bold)
                font.setItalic(is_italic)
                p.setFont(font)
                
                r = QRect(*rect)
                p.drawText(r, Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter, text)
                p.end()

            # Sauvegarde de l'image
            img_data = pixmap_to_data(img)
            cover_file.write(img_data)
            cover_file.flush()
            return True

        except Exception as e:
            self.log.error(f'Erreur lors de la création de la couverture: {e}')
            return False

    keep_only_tags = [
        dict(name='article', attrs={'class': 'post'})
    ]
    
    remove_tags = [
        dict(name='div', attrs={'class': ['tags', 'share-buttons', 'related-posts']}),
        dict(name='div', attrs={'class': ['comments-area', 'nav-links']}),
        dict(name='div', attrs={'id': ['sidebar', 'comments']}),
        dict(name='section', attrs={'class': 'comments-area'}),
        dict(name='footer'),
        dict(name='div', attrs={'class': 'yarpp-related'}),
        dict(name='div', attrs={'class': 'related-posts'})
    ]

    def preprocess_html(self, soup):
        # Nettoyage des styles
        for tag in soup.findAll(True):
            if 'style' in tag.attrs:
                del tag['style']
        
        # Nettoyage des images
        for img in soup.findAll('img'):
            for attr in ['srcset', 'sizes', 'loading', 'class', 'width', 'height', 'decoding', 'data-lazy-srcset', 'data-lazy-sizes']:
                if attr in img.attrs:
                    del img[attr]
            
            if 'data-lazy-src' in img.attrs:
                img['src'] = img['data-lazy-src']
                del img['data-lazy-src']
            
            if img.get('src', '').startswith('/'):
                img['src'] = 'https://www.contretemps.eu' + img['src']

        # Suppression de tout ce qui suit "à voir aussi"
        for text in soup.findAll(text=lambda text: text and 'à voir aussi' in text.lower()):
            parent = text.parent
            for sibling in list(parent.find_next_siblings()):
                sibling.decompose()
            parent.decompose()
        
        return soup

    extra_css = '''
        h1 { font-size: 1.8em; font-weight: bold; margin: 0 0 1em 0; }
        h2 { font-size: 1.4em; font-weight: bold; margin: 1em 0; }
        .author { font-style: italic; margin-bottom: 1.5em; color: #666; }
        img { max-width: 100%; height: auto; margin: 1em auto; }
        figcaption { font-size: 0.9em; font-style: italic; color: #666; margin: 0.5em 0 1.5em 0; }
        p { margin-bottom: 1em; line-height: 1.5; }
        blockquote { margin: 1em 2em; font-style: italic; }
        .wp-block-quote { margin: 1em 0; padding: 0 1em; border-left: 3px solid #ccc; }
    '''

Last edited by PeterT; 01-18-2025 at 05:54 PM. Reason: adding in code block
alphonk is offline   Reply With Quote
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Alternatives Economiques (French) - recipe alphonk Recipes 0 01-18-2025 10:58 AM
Recipe for the French news paper Liberation darkl Recipes 0 01-28-2012 02:17 PM
Recipe for French website Developpez.com louhike Recipes 1 04-03-2011 03:53 PM
French JPost recipe please jenden Recipes 9 09-25-2010 02:53 PM


All times are GMT -4. The time now is 05:17 AM.


MobileRead.com is a privately owned, operated and funded community.