Skip to content
module.py 6.41 KiB
Newer Older
Romain Bignon's avatar
Romain Bignon committed
# -*- coding: utf-8 -*-

Romain Bignon's avatar
Romain Bignon committed
# Copyright(C) 2010-2011 Romain Bignon
Romain Bignon's avatar
Romain Bignon committed
#
Romain Bignon's avatar
Romain Bignon committed
# This file is part of weboob.
Romain Bignon's avatar
Romain Bignon committed
#
Romain Bignon's avatar
Romain Bignon committed
# weboob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# weboob is distributed in the hope that it will be useful,
Romain Bignon's avatar
Romain Bignon committed
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Romain Bignon's avatar
Romain Bignon committed
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
Romain Bignon's avatar
Romain Bignon committed
#
Romain Bignon's avatar
Romain Bignon committed
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import re
Bezleputh's avatar
Bezleputh committed
from weboob.tools.ordereddict import OrderedDict
from weboob.capabilities.video import CapVideo, BaseVideo
from weboob.capabilities.collection import CapCollection, CollectionNotFound, Collection
from weboob.tools.backend import Module, BackendConfig
from weboob.tools.value import Value
Romain Bignon's avatar
Romain Bignon committed

from .browser import ArteBrowser
Bezleputh's avatar
Bezleputh committed
from .video import ArteVideo, ArteSiteVideo, VERSION_VIDEO, FORMATS, LANG, QUALITY, SITE
Romain Bignon's avatar
Romain Bignon committed

Florent's avatar
Florent committed
__all__ = ['ArteModule']
Romain Bignon's avatar
Romain Bignon committed

class ArteModule(Module, CapVideo, CapCollection):
Romain Bignon's avatar
Romain Bignon committed
    NAME = 'arte'
Florent's avatar
Florent committed
    MAINTAINER = u'Bezleputh'
    EMAIL = 'carton_ben@yahoo.fr'
Florent's avatar
Florent committed
    VERSION = '1.2'
Laurent Bachelier's avatar
Laurent Bachelier committed
    DESCRIPTION = 'Arte French and German TV'
Romain Bignon's avatar
Romain Bignon committed
    LICENSE = 'AGPLv3+'

    order = {'AIRDATE_DESC': 'Date',
             'VIEWS': 'Views',
             'ALPHA': 'Alphabetic',
             'LAST_CHANCE': 'Last chance'
             }

Bezleputh's avatar
Bezleputh committed
    versions_choice = OrderedDict([(k, u'%s' % (v.get('label'))) for k, v in VERSION_VIDEO.items])
    format_choice = OrderedDict([(k, u'%s' % (v)) for k, v in FORMATS.items])
    lang_choice = OrderedDict([(k, u'%s' % (v.get('label'))) for k, v in LANG.items])
    quality_choice = [u'%s' % (k) for k, v in QUALITY.items]
    CONFIG = BackendConfig(Value('lang', label='Lang of videos', choices=lang_choice, default='FRENCH'),
Bezleputh's avatar
Bezleputh committed
                           Value('order', label='Sort order', choices=order, default='AIRDATE_DESC'),
                           Value('quality', label='Quality of videos', choices=quality_choice, default=QUALITY.HD),
                           Value('format', label='Format of videos', choices=format_choice, default=FORMATS.HTTP_MP4),
                           Value('version', label='Version of videos', choices=versions_choice))
Romain Bignon's avatar
Romain Bignon committed
    BROWSER = ArteBrowser

Romain Bignon's avatar
Romain Bignon committed
    def create_default_browser(self):
Bezleputh's avatar
Bezleputh committed
        return self.create_browser(lang=self.config['lang'].get(),
                                   quality=self.config['quality'].get(),
                                   order=self.config['order'].get(),
                                   format=self.config['format'].get(),
                                   version=self.config['version'].get())
    def parse_id(self, _id):
        sites = '|'.join(k.get('id') for k in SITE.values)
        m = re.match('^(%s)\.(.*)' % sites, _id)
        if m:
            return m.groups()

        m = re.match('https?://www.arte.tv/guide/\w+/(?P<id>.+)/(.*)', _id)
Bezleputh's avatar
Bezleputh committed
            return SITE.PROGRAM.get('id'), m.group(1)
        m = re.match('https?://(%s).arte.tv/(\w+)/(.*)' % (sites), _id)
Bezleputh's avatar
Bezleputh committed
            return m.group(1), '/%s/%s' % (m.group(2), m.group(3))
Romain Bignon's avatar
Romain Bignon committed

        if not _id.startswith('http'):
            return 'videos', _id
Romain Bignon's avatar
Romain Bignon committed

Romain Bignon's avatar
Romain Bignon committed
    def get_video(self, _id):
Bezleputh's avatar
Bezleputh committed
        site, _id = self.parse_id(_id)
Romain Bignon's avatar
Romain Bignon committed

Bezleputh's avatar
Bezleputh committed
        if site in [value.get('id') for value in SITE.values]:
            _site = (value for value in SITE.values if value.get('id') == site).next()
            return getattr(self.browser, _site.get('video'))(_id)
Bezleputh's avatar
Bezleputh committed
        else:
            return self.browser.get_video(_id)
Romain Bignon's avatar
Romain Bignon committed

    def search_videos(self, pattern, sortby=CapVideo.SEARCH_RELEVANCE, nsfw=False):
Bezleputh's avatar
Bezleputh committed
        return self.browser.search_videos(pattern)
Romain Bignon's avatar
Romain Bignon committed

Bezleputh's avatar
Bezleputh committed
    def fill_arte_video(self, video, fields):
Romain Bignon's avatar
Romain Bignon committed
        if fields != ['thumbnail']:
Bezleputh's avatar
Bezleputh committed
            video = self.browser.get_video(video.id, video)

        if 'thumbnail' in fields and video and video.thumbnail:
            video.thumbnail.data = self.browser.open(video.thumbnail.url).content

        return video

    def fill_site_video(self, video, fields):
        if fields != ['thumbnail']:
            for site in SITE.values:
                m = re.match('%s\.(.*)' % site.get('id'), video.id)
                if m:
                    video = getattr(self.browser, site.get('video'))(m.group(1), video)
                    break

        if 'thumbnail' in fields and video and video.thumbnail:
Bezleputh's avatar
Bezleputh committed
            video.thumbnail.data = self.browser.open(video.thumbnail.url).content
Romain Bignon's avatar
Romain Bignon committed

        return video

    def iter_resources(self, objs, split_path):
Bezleputh's avatar
Bezleputh committed
        if BaseVideo in objs:
            collection = self.get_collection(objs, split_path)
            if collection.path_level == 0:
                yield Collection([u'arte-latest'], u'Latest Arte videos')
                for site in SITE.values:
                    yield Collection([site.get('id')], site.get('label'))
            if collection.path_level == 1:
                if collection.split_path == [u'arte-latest']:
                    for video in self.browser.latest_videos():
                        yield video
                else:
                    for site in SITE.values:
                        if collection.split_path[0] == site.get('id') and collection.path_level in site.keys():
                            for item in getattr(self.browser, site.get(collection.path_level))():
                                yield item

            if collection.path_level >= 2:
                for site in SITE.values:
                    if collection.split_path[0] == site.get('id') and collection.path_level in site.keys():
                        for item in getattr(self.browser, site.get(collection.path_level))(collection.split_path):
                            yield item

    def validate_collection(self, objs, collection):
        if collection.path_level == 0:
            return
Bezleputh's avatar
Bezleputh committed
        if BaseVideo in objs and (collection.split_path == [u'arte-latest'] or
Bezleputh's avatar
Bezleputh committed
                                  collection.split_path[0] in [value.get('id') for value in SITE.values]):
Bezleputh's avatar
Bezleputh committed
        if BaseVideo in objs and collection.path_level >= 2 and\
                collection.split_path[0] in [value.get('id') for value in SITE.values]:
            return
        raise CollectionNotFound(collection.split_path)

Bezleputh's avatar
Bezleputh committed
    OBJECTS = {ArteVideo: fill_arte_video, ArteSiteVideo: fill_site_video}