#!/usr/bin/env python
# vim:fileencoding=utf-8
##
## Written:      October 2012 (new coding)
## Version:      10.0
## Last update:  2025-01-15
##

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 = 'Spektrum der Wissenschaft'
    __author__ = 'Armin Geller, Bratzzo, Rainer Zenz, update epubli'
    description = 'German  online portal of Spektrum der Wissenschaft'
    publisher = 'Spektrum der Wissenschaft Verlagsgesellschaft mbH'
    category = 'science news, Germany'
    oldest_article = 3
    max_articles_per_feed = 100
    no_stylesheets = True
    remove_javascript = True
    remove_empty_feeds = True
    language = 'de'
    encoding = 'utf8'
    ignore_duplicate_articles = {'title'}
    scale_news_images_to_device = True
    compress_news_images = True

    cover_url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Spektrum_der_Wissenschaft_Logo_seit_2016.svg/640px-Spektrum_der_Wissenschaft_Logo_seit_2016.svg.png'
    masthead_url = 'http://www.spektrum.de/fm/861/spektrum.de.png'

    feeds = [
        ('Spektrum.de', 'http://www.spektrum.de/alias/rss/spektrum-de-rss-feed/996406'),
    ]

    keep_only_tags = [dict(name='article', attrs={'class': 'content'}), classes('callout-box')]

    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):
        unwanted_article_types = [
            'podcast',
            'video',
            'raetsel',
            'leseprobe',
            # 'kolumne',
            # 'rezension',
            # 'news',
        ]
        # 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)
                    continue
                # Remove articles with '..' in the url.
                for keyword in unwanted_article_types:
                    if keyword in article.url:
                        feed.articles.remove(article)
                        continue

        return feeds

    def preprocess_html(self, soup):
        for noscript in soup.findAll('noscript'):
            noscript.name = 'div'
        return soup

    def preprocess_raw_html(self, raw, url):
        # remove articles requiring login and advertisements
        unwantedtag = 'content pw-premium'
        if unwantedtag in raw:
            self.abort_article('Skipping unwanted article with tag:' + unwantedtag)
        return raw
