diff --git a/modules/virginradio/__init__.py b/modules/virginradio/__init__.py new file mode 100644 index 00000000..94534fb3 --- /dev/null +++ b/modules/virginradio/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2014 Johann Broudin +# +# 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 .module import VirginRadioModule + +__all__ = ['VirginRadioModule'] diff --git a/modules/virginradio/module.py b/modules/virginradio/module.py new file mode 100644 index 00000000..0e685de4 --- /dev/null +++ b/modules/virginradio/module.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2014 Johann Broudin +# +# 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 CapRadio, Radio +from weboob.capabilities.audiostream import BaseAudioStream +from weboob.tools.capabilities.streaminfo import StreamInfo +from weboob.capabilities.collection import CapCollection +from weboob.tools.backend import Module +from weboob.browser import Browser +from weboob.tools.misc import to_unicode + + +__all__ = ['VirginRadioModule'] + + +class VirginRadioModule(Module, CapRadio, CapCollection): + NAME = 'virginradio' + MAINTAINER = u'Johann Broudin' + EMAIL = 'Johann.Broudin@6-8.fr' + VERSION = '1.1' + DESCRIPTION = u'VirginRadio french radio' + LICENSE = 'AGPLv3+' + BROWSER = Browser + + _RADIOS = { + 'officiel': ( + u'Virgin Radio', + u'Virgin Radio', + u'http://mp3lg3.scdn.arkena.com/10490/virginradio.mp3', + 64), + 'new': ( + u'Virgin Radio New', + u'Virgin Radio New', + u'http://mp3lg3.tdf-cdn.com/9145/lag_103228.mp3', + 64), + 'classics': ( + u'Virgin Radio Classics', + u'Virgin Radio Classics', + u'http://mp3lg3.tdf-cdn.com/9146/lag_103325.mp3', + 64), + 'electroshock': ( + u'Virgin Radio Electroshock', + u'Virgin Radio Electroshock', + u'http://mp3lg3.tdf-cdn.com/9148/lag_103401.mp3', + 64), + 'hits': ( + u'Virgin Radio Hits', + u'Virgin Radio Hits', + u'http://mp3lg3.tdf-cdn.com/9150/lag_103440.mp3', + 64), + 'rock': ( + u'Virgin Radio Rock', + u'Virgin Radio Rock', + u'http://mp3lg3.scdn.arkena.com/9151/lag_103523.mp3', + 64) + } + + def get_stream_info(self, radio, url): + stream = BaseAudioStream(0) + current = StreamInfo(0) + + r = self.browser.open(url, stream=True, headers={'Icy-Metadata':1}) + + stream.bitrate = int(r.headers['icy-br'].split(',')[0]) + + r.raw.read(int(r.headers['icy-metaint'])) + size = ord(r.raw.read(1)) + content = r.raw.read(size*16) + r.close() + + for s in content.split("\x00")[0].split(";"): + a = s.split("=") + if a[0] == "StreamTitle": + stream.title = to_unicode(a[1].split("'")[1]) + res = a[1].split("'")[1].split(" - ") + current.who = to_unicode(res[0]) + current.what = to_unicode(res[1]) + stream.format=u'mp3' + stream.url = url + return [stream], current + + def get_radio(self, radio): + if not isinstance(radio, Radio): + radio = Radio(radio) + + if radio.id not in self._RADIOS: + return None + + title, description, url, bitrate = self._RADIOS[radio.id] + + radio.title = title + radio.description = description + + radio.streams, radio.current = self.get_stream_info(radio.id, url) + return radio + + def iter_resources(self, objs, split_path): + if Radio in objs: + self._restrict_level(split_path) + + for id in self._RADIOS.iterkeys(): + yield self.get_radio(id) + + def iter_radios_search(self, pattern): + for radio in self.iter_resources((Radio, ), []): + if pattern.lower() in radio.title.lower() or pattern.lower() in radio.description.lower(): + yield radio + + def fill_radio(self, radio, fields): + if 'current' in fields: + if not radio.current: + radio = self.get_radio(radio.id) + return radio + + OBJECTS = {Radio: fill_radio} diff --git a/modules/virginradio/test.py b/modules/virginradio/test.py new file mode 100644 index 00000000..1eea9e06 --- /dev/null +++ b/modules/virginradio/test.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2014 Johann Broudin +# +# 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 VirginRadioTest(BackendTest): + MODULE = 'virginradio' + + def test_virginradio(self): + l = list(self.backend.iter_resources((Radio, ), [])) + self.assertTrue(len(l) > 0)