diff --git a/weboob/backends/canalplus/backend.py b/weboob/backends/canalplus/backend.py index 6cc7158b..0986c88f 100644 --- a/weboob/backends/canalplus/backend.py +++ b/weboob/backends/canalplus/backend.py @@ -32,7 +32,7 @@ class CanalplusBackend(BaseBackend, ICapVideo): NAME = 'canalplus' MAINTAINER = 'Nicolas Duhamel' EMAIL = 'nicolas@jombi.fr' - VERSION = '0.1' + VERSION = '0.4' DESCRIPTION = 'Canal plus french TV' LICENSE = 'GPLv3' CONFIG = ValuesDict(Value('quality', label='Quality of videos', choices=['hd', 'sd'], default='hd')) @@ -50,7 +50,14 @@ class CanalplusBackend(BaseBackend, ICapVideo): return self.browser.get_video(_id) def fill_video(self, video, fields): - with self.browser: - return self.browser.get_video(CanalplusVideo.id2url(video.id), video) + if fields != ['thumbnail']: + # if we don't want only the thumbnail, we probably want also every fields + with self.browser: + video = self.browser.get_video(CanalplusVideo.id2url(video.id), video) + if 'thumbnail' in fields: + with self.browser: + video.thumbnail.data = self.browser.readurl(video.thumbnail.url) + + return video OBJECTS = {CanalplusVideo: fill_video} diff --git a/weboob/backends/canalplus/browser.py b/weboob/backends/canalplus/browser.py index 1d12dde2..e4a74c1c 100644 --- a/weboob/backends/canalplus/browser.py +++ b/weboob/backends/canalplus/browser.py @@ -20,7 +20,7 @@ import urllib from weboob.tools.browser import BaseBrowser from weboob.tools.browser.decorators import id2url -from .pages import InitPage, SearchResultPage, CanalplusVideo, VideoPage +from .pages import InitPage, CanalplusVideo, VideoPage import lxml.etree @@ -40,7 +40,7 @@ class CanalplusBrowser(BaseBrowser): DOMAIN = u'service.canal-plus.com' ENCODING = 'utf-8' PAGES = {r"http://service.canal-plus.com/video/rest/initPlayer/cplus/": InitPage, - r"http://service.canal-plus.com/video/rest/search/cplus/.*": SearchResultPage, + r"http://service.canal-plus.com/video/rest/search/cplus/.*": VideoPage, r"http://service.canal-plus.com/video/rest/getVideosLiees/cplus/(?P.+)": VideoPage, } @@ -49,24 +49,24 @@ class CanalplusBrowser(BaseBrowser): FORMATS = { 'sd': 'BAS_DEBIT', 'hd': 'HD' } - + def __init__(self, quality, *args, **kwargs): BaseBrowser.__init__(self, parser= self.PARSER, *args, **kwargs) if quality in self.FORMATS: self.quality = self.FORMATS[quality] else: - self.quality = 'HD' + self.quality = 'HD' def home(self): self.location("http://service.canal-plus.com/video/rest/initPlayer/cplus/") - + def iter_search_results(self, pattern): - self.location("http://service.canal-plus.com/video/rest/search/cplus/" + urllib.quote_plus(pattern) ) + self.location("http://service.canal-plus.com/video/rest/search/cplus/" + urllib.quote_plus(pattern)) return self.page.iter_results() - + @id2url(CanalplusVideo.id2url) def get_video(self, url, video=None): self.location(url) return self.page.get_video(video, self.quality) - + diff --git a/weboob/backends/canalplus/pages/__init__.py b/weboob/backends/canalplus/pages/__init__.py index 7c1ad009..f5c04598 100644 --- a/weboob/backends/canalplus/pages/__init__.py +++ b/weboob/backends/canalplus/pages/__init__.py @@ -16,8 +16,7 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. from .initpage import InitPage -from .searchresultpage import SearchResultPage from .video import CanalplusVideo from .videopage import VideoPage -__all__ = ['InitPage', 'SearchResultPage', 'VideoPage', 'CanalplusVideo'] +__all__ = ['InitPage', 'VideoPage', 'CanalplusVideo'] diff --git a/weboob/backends/canalplus/pages/searchresultpage.py b/weboob/backends/canalplus/pages/searchresultpage.py deleted file mode 100644 index 374ff572..00000000 --- a/weboob/backends/canalplus/pages/searchresultpage.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright(C) 2010 Nicolas Duhamel -# -# 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, version 3 of the License. -# -# 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from weboob.tools.browser import BasePage -from .video import CanalplusVideo - - -__all__ = ['SearchResultPage'] - -class SearchResultPage(BasePage): - def iter_results(self): - for vid in self.document.getchildren(): - #id - _id = vid[0].text - #Titre - titre = vid[2][9][0].text - #Sous titre - titre = titre + " " + vid[2][9][1].text - yield CanalplusVideo(_id, title=titre) diff --git a/weboob/backends/canalplus/pages/videopage.py b/weboob/backends/canalplus/pages/videopage.py index 04003ff3..ce3418b1 100644 --- a/weboob/backends/canalplus/pages/videopage.py +++ b/weboob/backends/canalplus/pages/videopage.py @@ -15,26 +15,63 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from datetime import datetime + +from weboob.capabilities.video import VideoThumbnail from weboob.tools.browser import BasePage from .video import CanalplusVideo + + __all__ = ['VideoPage'] + class VideoPage(BasePage): - def on_loaded(self): - pass + def parse_video(self, el, video=None, quality=None): + _id = el.find('ID').text + if _id == '-1': + # means the video is not found + return None + + if not video: + video = CanalplusVideo(_id) + + infos = el.find('INFOS') + video.title = u'' + for part in infos.find('TITRAGE'): + if len(part.text.strip()) == 0: + continue + if len(video.title) > 0: + video.title += u' — ' + video.title += part.text.strip() + video.description = infos.find('DESCRIPTION').text + + media = el.find('MEDIA') + video.thumbnail = VideoThumbnail(media.find('IMAGES').find('PETIT').text) + lastest_format = None + for format in media.find('VIDEOS'): + if format.text is None: + continue + if format.tag == quality: + video.url = format.text + break + lastest_format = format + if not video.url and lastest_format is not None: + video.url = lastest_format.text + + day, month, year = map(int, infos.find('PUBLICATION').find('DATE').text.split('/')) + hour, minute, second = map(int, infos.find('PUBLICATION').find('HEURE').text.split(':')) + video.date = datetime(year, month, day, hour, minute, second) + + return video + + def iter_results(self): + for vid in self.document.getchildren(): + yield self.parse_video(vid) def get_video(self, video, quality): - if not video: - video = CanalplusVideo(self.group_dict['id']) + _id = self.group_dict['id'] for vid in self.document.getchildren(): - url = None - lastest = None - for format in vid[5][1].getchildren(): - if format.tag == quality: - url = format.text - if format.text: - lastest = format - if url == None: - url = lastest.text - video.url = url - return video + if not _id in vid.find('ID').text: + continue + return self.parse_video(vid, video, quality)