diff --git a/weboob/backends/ina/__init__.py b/weboob/backends/ina/__init__.py new file mode 100644 index 00000000..893910a0 --- /dev/null +++ b/weboob/backends/ina/__init__.py @@ -0,0 +1 @@ +from .backend import InaBackend diff --git a/weboob/backends/ina/backend.py b/weboob/backends/ina/backend.py new file mode 100644 index 00000000..e57b3e71 --- /dev/null +++ b/weboob/backends/ina/backend.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Christophe Benz +# +# 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.backend import BaseBackend +from weboob.capabilities.video import ICapVideo + +from .browser import InaBrowser + + +__all__ = ['InaBackend'] + + +class InaBackend(BaseBackend, ICapVideo): + NAME = 'ina' + MAINTAINER = 'Christophe Benz' + EMAIL = 'christophe.benz@gmail.com' + VERSION = '0.1' + DESCRIPTION = 'INA french video archives' + LICENSE = 'GPLv3' + + CONFIG = {} + BROWSER = InaBrowser + + def get_video(self, _id): + return self.browser.get_video(_id) diff --git a/weboob/backends/ina/browser.py b/weboob/backends/ina/browser.py new file mode 100644 index 00000000..fced44e1 --- /dev/null +++ b/weboob/backends/ina/browser.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Christophe Benz +# +# 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 BaseBrowser +from weboob.tools.browser.decorators import id2url + +from .pages.video import VideoPage + + +__all__ = ['InaBrowser'] + + +class InaBrowser(BaseBrowser): + DOMAIN = 'ina.fr' + PAGES = {'http://boutique.ina.fr/video/.+.html': VideoPage, + } + + def get_video(self, url): + self.location(url) + return self.page.video diff --git a/weboob/backends/ina/pages/__init__.py b/weboob/backends/ina/pages/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/weboob/backends/ina/pages/video.py b/weboob/backends/ina/pages/video.py new file mode 100644 index 00000000..8c7a5689 --- /dev/null +++ b/weboob/backends/ina/pages/video.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Christophe Benz +# +# 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. + + +import datetime +from logging import warning +import re +try: + from urlparse import parse_qs +except ImportError: + from cgi import parse_qs + +from weboob.tools.browser import BasePage + +from ..video import InaVideo + + +__ALL__ = ['VideoPage'] + + +class VideoPage(BasePage): + URL_REGEXP = re.compile('http://boutique.ina.fr/video/(.+).html') + + def on_loaded(self): + date, duration = self.get_date_and_duration() + self.video = InaVideo(self.get_id(), + title=self.get_title(), + url=self.get_url(), + date=date, + duration=duration, + ) + + def get_id(self): + m = self.URL_REGEXP.match(self.url) + if m: + return unicode(m.group(1)) + warning('Unable to parse ID') + return 0 + + def get_date_and_duration(self): + duration_regexp = re.compile('(.+) - (.+)min(.+)s') + el = self.document.getroot().cssselect('.bloc-video-edito h3')[0] + if el is not None: + m = duration_regexp.match(el.text.strip()) + if m: + day, month, year = [int(s) for s in m.group(1).split('/')] + date = datetime.datetime(year, month, day) + return date, int(m.group(2)) * 60 + int(m.group(3)) + else: + return None + + def get_title(self): + el = self.document.getroot().cssselect('.bloc-video-edito h2')[0] + if el is not None: + return unicode(el.text.strip()) + else: + return None + + def get_url(self): + qs = parse_qs(self.document.getroot().cssselect('param[name="flashvars"]')[0].attrib['value']) + url = 'http://mp4.ina.fr/lecture/lire/id_notice/%s/token_notice/%s' % (qs['id_notice'][0], qs['token_notice'][0]) + return url diff --git a/weboob/backends/ina/video.py b/weboob/backends/ina/video.py new file mode 100644 index 00000000..552952f7 --- /dev/null +++ b/weboob/backends/ina/video.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Christophe Benz +# +# 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.capabilities.video import BaseVideo + + +__all__ = ['InaVideo'] + + +class InaVideo(BaseVideo): + @classmethod + def id2url(cls, _id): + return _id