From f326b167085bced2d8d1b52284cf1473b1e0bb63 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Fri, 8 Oct 2010 10:53:51 +0200 Subject: [PATCH] new backend ouifm --- weboob/backends/ouifm/__init__.py | 20 ++++++++ weboob/backends/ouifm/backend.py | 85 +++++++++++++++++++++++++++++++ weboob/backends/ouifm/browser.py | 36 +++++++++++++ weboob/backends/ouifm/pages.py | 34 +++++++++++++ weboob/backends/ouifm/test.py | 30 +++++++++++ 5 files changed, 205 insertions(+) create mode 100644 weboob/backends/ouifm/__init__.py create mode 100644 weboob/backends/ouifm/backend.py create mode 100644 weboob/backends/ouifm/browser.py create mode 100644 weboob/backends/ouifm/pages.py create mode 100644 weboob/backends/ouifm/test.py diff --git a/weboob/backends/ouifm/__init__.py b/weboob/backends/ouifm/__init__.py new file mode 100644 index 00000000..96d1df5e --- /dev/null +++ b/weboob/backends/ouifm/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Romain Bignon +# +# 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 .backend import OuiFMBackend + +__all__ = ['OuiFMBackend'] diff --git a/weboob/backends/ouifm/backend.py b/weboob/backends/ouifm/backend.py new file mode 100644 index 00000000..93f28115 --- /dev/null +++ b/weboob/backends/ouifm/backend.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Romain Bignon +# +# 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 __future__ import with_statement + +from weboob.capabilities.radio import ICapRadio, Radio, Stream, Emission +from weboob.tools.backend import BaseBackend + +from .browser import OuiFMBrowser + + +__all__ = ['OuiFMBackend'] + + +class OuiFMBackend(BaseBackend, ICapRadio): + NAME = 'ouifm' + MAINTAINER = 'Romain Bignon' + EMAIL = 'romain@peerfuse.org' + VERSION = '0.2' + DESCRIPTION = u'The Ouï FM french radio' + LICENSE = 'GPLv3' + BROWSER = OuiFMBrowser + + _RADIOS = {'general': (u'OUÏ FM', u'OUI FM', 'http://ouifm.ice.infomaniak.ch/ouifm-high.mp3'), + 'alternatif': (u'OUÏ FM Alternatif', u'OUI FM - L\'Alternative Rock', 'http://ouifm.ice.infomaniak.ch/ouifm2.mp3'), + 'collector': (u'OUÏ FM Collector', u'OUI FM - Classic Rock', 'http://ouifm.ice.infomaniak.ch/ouifm3.mp3'), + 'blues': (u'OUÏ FM Blues', u'OUI FM - Blues', 'http://ouifm.ice.infomaniak.ch/ouifm4.mp3'), + 'inde': (u'OUÏ FM Indé', u'OUI FM - Rock Indé', 'http://ouifm.ice.infomaniak.ch/ouifm5.mp3'), + } + + def iter_radios(self): + for id in self._RADIOS.iterkeys(): + yield self.get_radio(id) + + def iter_radios_search(self, pattern): + for radio in self.iter_radios(): + if pattern in radio.title or pattern in radio.description: + yield radio + + def get_radio(self, radio): + if not isinstance(radio, Radio): + radio = Radio(radio) + + if not radio.id in self._RADIOS: + return None + + title, description, url = self._RADIOS[radio.id] + radio.title = title + radio.description = description + + artist, title = self.browser.get_current(radio.id) + current = Emission(0) + current.artist = artist + current.title = title + radio.current = current + + stream = Stream(0) + stream.title = '128kbits/s' + stream.url = url + radio.streams = [stream] + return radio + + def fill_radio(self, radio, fields): + if 'current' in fields: + if not radio.current: + radio.current = Emission(0) + radio.current.artist, radio.current.title = self.browser.get_current(radio.id) + return radio + + OBJECTS = {Radio: fill_radio} diff --git a/weboob/backends/ouifm/browser.py b/weboob/backends/ouifm/browser.py new file mode 100644 index 00000000..0cb00aa0 --- /dev/null +++ b/weboob/backends/ouifm/browser.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Romain Bignon +# +# 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 .pages import PlayerPage + + +__all__ = ['OuiFMBrowser'] + + +class OuiFMBrowser(BaseBrowser): + DOMAIN = u'www.ouifm.fr' + PAGES = {r'.*ouifm.fr/scripts_player/decode_json.php': PlayerPage, + } + + def get_current(self, radio): + self.location('/scripts_player/decode_json.php') + assert self.is_on_page(PlayerPage) + + return self.page.get_current(radio) diff --git a/weboob/backends/ouifm/pages.py b/weboob/backends/ouifm/pages.py new file mode 100644 index 00000000..8f834e6d --- /dev/null +++ b/weboob/backends/ouifm/pages.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Romain Bignon +# +# 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 weboob.tools.parsers.lxmlparser import select + + +__all__ = ['PlayerPage'] + + +class PlayerPage(BasePage): + def get_current(self, radio): + if radio == 'general': + _radio = '' + else: + _radio = '_%s' % radio + title = select(self.document.getroot(), 'div#titre%s' % _radio, 1).text.strip() + artist = select(self.document.getroot(), 'div#artiste%s' % _radio, 1).text.strip() + return artist, title diff --git a/weboob/backends/ouifm/test.py b/weboob/backends/ouifm/test.py new file mode 100644 index 00000000..ebc49238 --- /dev/null +++ b/weboob/backends/ouifm/test.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Romain Bignon +# +# 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.test import BackendTest + +class YoutubeTest(BackendTest): + BACKEND = 'youtube' + + def test_youtube(self): + l = list(self.backend.iter_search_results('lol')) + self.assertTrue(len(l) > 0) + v = l[0] + self.backend.fillobj(v, ('url',)) + self.assertTrue(v.url and v.url.startswith('http://'), 'URL for video "%s" not found: %s' % (v.id, v.url)) + self.backend.browser.openurl(v.url)