From 4d3d3b5de1e6da395751460953c4b4e32af7ba0c Mon Sep 17 00:00:00 2001 From: Thomas Lecavelier Date: Mon, 12 Aug 2013 15:10:05 +0200 Subject: [PATCH] Nihon no Oto module for radioob : just works. --- modules/nihonnooto/__init__.py | 3 ++ modules/nihonnooto/backend.py | 50 +++++++++++++++++++++++++++++++ modules/nihonnooto/browser.py | 49 +++++++++++++++++++++++++++++++ modules/nihonnooto/favicon.png | Bin 0 -> 7611 bytes modules/nihonnooto/pages.py | 52 +++++++++++++++++++++++++++++++++ modules/nihonnooto/test.py | 30 +++++++++++++++++++ 6 files changed, 184 insertions(+) create mode 100644 modules/nihonnooto/__init__.py create mode 100644 modules/nihonnooto/backend.py create mode 100644 modules/nihonnooto/browser.py create mode 100644 modules/nihonnooto/favicon.png create mode 100644 modules/nihonnooto/pages.py create mode 100644 modules/nihonnooto/test.py diff --git a/modules/nihonnooto/__init__.py b/modules/nihonnooto/__init__.py new file mode 100644 index 00000000..216f36ba --- /dev/null +++ b/modules/nihonnooto/__init__.py @@ -0,0 +1,3 @@ +from .backend import NihonNoOtoBackend + +__all__ = ['NihonNoOtoBackend'] diff --git a/modules/nihonnooto/backend.py b/modules/nihonnooto/backend.py new file mode 100644 index 00000000..b384ec57 --- /dev/null +++ b/modules/nihonnooto/backend.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Copyright(C) 2013 Thomas Lecavelier +# +# This file is part of weboob. +# +# 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, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from weboob.capabilities.radio import ICapRadio, Radio, Stream +from weboob.tools.backend import BaseBackend +from .browser import NihonNoOtoBrowser + +__all__ = ['NihonNoOtoBackend'] + +class NihonNoOtoBackend(BaseBackend, ICapRadio): + NAME = 'nihonnooto' + MAINTAINER = u'Thomas Lecavelier' + EMAIL = 'thomas-weboob@lecavelier.name' + VERSION = '0.h' + DESCRIPTION = u'« Le son du Japon » french operated web radio, diffusing japanese music' + # License of your module + LICENSE = 'AGPLv3+' + + BROWSER = NihonNoOtoBrowser + _RADIOS = {'nihonnooto': (u'Nihon no OTO', True) } + + def iter_radios_search(self, pattern): + for radio in self.browser.iter_radios_list(): + if pattern.lower() in radio.title.lower() or pattern.lower() in radio.description.lower(): + self.browser.get_current_emission() + radio.current = self.browser.get_current_emission() + + yield radio + + def get_radio(self, radio): + if not isinstance(radio, Radio): + for rad in self.browser.iter_radios_list(): + if rad.id == radio: + return rad + return None diff --git a/modules/nihonnooto/browser.py b/modules/nihonnooto/browser.py new file mode 100644 index 00000000..abe5df43 --- /dev/null +++ b/modules/nihonnooto/browser.py @@ -0,0 +1,49 @@ +# * -*- coding: utf-8 -*- + +# Copyright(C) 2013 Thomas Lecavelier +# +# This file is part of weboob. +# +# 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, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from weboob.tools.browser import BaseBrowser +from .pages import LivePage, ProgramPage + +__all__ = ['NihonNoOtoBrowser'] + +class NihonNoOtoBrowser(BaseBrowser): + DOMAIN = 'www.nihon-no-oto.com' + PROTOCOL = 'http' + ENCODING = 'utf-8' + USER_AGENT = BaseBrowser.USER_AGENTS['desktop_firefox'] + PAGES = { + 'http://www\.nihon-no-oto\.com/': LivePage, + 'http://www\.nihon-no-oto\.com/app/playlist.php': ProgramPage, + } + + def home(self): + self.location('/') + + assert self.is_on_page(LivePage) + + def iter_radios_list(self): + self.location('/') + + assert self.is_on_page(LivePage) + return self.page.iter_radios_list() + + def get_current_emission(self): + self.location('/app/playlist.php') + assert self.is_on_page(ProgramPage) + return self.page.get_current_emission() diff --git a/modules/nihonnooto/favicon.png b/modules/nihonnooto/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..312fff79f60601900d2f0ba6d34ab06d6c7b26de GIT binary patch literal 7611 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 literal 0 HcmV?d00001 diff --git a/modules/nihonnooto/pages.py b/modules/nihonnooto/pages.py new file mode 100644 index 00000000..3a319e60 --- /dev/null +++ b/modules/nihonnooto/pages.py @@ -0,0 +1,52 @@ +# * -*- coding: utf-8 -*- + +# Copyright(C) 2013 Thomas Lecavelier +# +# This file is part of weboob. +# +# 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, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from weboob.tools.browser import BasePage +from weboob.capabilities.radio import Radio, Stream, Emission + +__all__ = ['LivePage', 'ProgramPage'] + +class LivePage(BasePage): + def iter_radios_list(self): + radio = Radio('nihon') + radio.title = 'Nihon no Oto' + radio.description = u'Nihon no Oto: le son du Japon' + radio.streams = [] + + index = -1 + + for el in self.document.xpath('//source'): + index += 1 + mime_type = el.attrib['type'] + stream_url = el.attrib['src'] + stream = Stream(index) + stream.title = radio.title + ' ' + mime_type + stream.url = stream_url + radio.streams.append(stream) + + yield radio + + + +class ProgramPage(BasePage): + def get_current_emission(self): + self.document.xpath('//p')[0].text + current = Emission(0) + current.artist, current.title = self.document.xpath('//p')[0].text.split('/////')[0].split(' - ') + return current diff --git a/modules/nihonnooto/test.py b/modules/nihonnooto/test.py new file mode 100644 index 00000000..6a05201d --- /dev/null +++ b/modules/nihonnooto/test.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2013 Thomas Lecavelier +# +# This file is part of weboob. +# +# 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, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +from weboob.tools.test import BackendTest +from weboob.capabilities.radio import Radio + + +class NihonNoOtoTest(BackendTest): + BACKEND = 'nihonnooto' + + def test_nihonnooto(self): + l = list(self.backend.iter_radios_search('') + self.assertTrue(len(l) > 0)