diff --git a/modules/franceinter/backend.py b/modules/franceinter/backend.py
deleted file mode 100644
index dc17fcbd..00000000
--- a/modules/franceinter/backend.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# * -*- coding: utf-8 -*-
-
-# Copyright(C) 2011 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 ICapRadio, Radio, Stream, Emission
-from weboob.capabilities.collection import ICapCollection, CollectionNotFound
-from weboob.tools.backend import BaseBackend
-from weboob.tools.browser import BaseBrowser, BasePage
-
-
-__all__ = ['FranceInterBackend']
-
-
-class XMLinfos(BasePage):
- def get_current(self):
- emissions = self.parser.select(self.document.getroot(), 'item')
- if len(emissions) == 0:
- return 'No emission'
- return emissions[0].find('titreemission').text
-
-class FranceInterBrowser(BaseBrowser):
- DOMAIN = u'metadatas.tv-radio.com'
- ENCODING = 'iso-8859-1'
- PAGES = {r'.*metadatas/franceinterRSS\.xml': XMLinfos}
-
- def get_current(self, radio):
- self.location('/metadatas/franceinterRSS.xml')
- assert self.is_on_page(XMLinfos)
-
- return self.page.get_current()
-
-class FranceInterBackend(BaseBackend, ICapRadio, ICapCollection):
- NAME = 'franceinter'
- MAINTAINER = 'Johann Broudin'
- EMAIL = 'johann.broudin@6-8.fr'
- VERSION = '0.a'
- DESCRIPTION = u'The france inter french radio'
- LICENCE = 'AGPLv3+'
- BROWSER = FranceInterBrowser
-
- _RADIOS = {'franceinter': (u'france inter', u'france inter', u'http://mp3.live.tv-radio.com/franceinter/all/franceinterhautdebit.mp3')}
-
- def iter_resources(self, splited_path):
- if len(splited_path) > 0:
- raise CollectionNotFound()
-
- for id in self._RADIOS.iterkeys():
- yield self.get_radio(id)
-
- def iter_radios_search(self, pattern):
- for radio in self.iter_resources([]):
- if pattern.lower() in radio.title.lower() or pattern.lower() in radio.description.lower():
- 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
-
- emission = self.browser.get_current(radio.id)
- current = Emission(0)
- current.title = unicode(emission)
- current.artist = None
- radio.current = current
-
- stream = Stream(0)
- stream.title = u'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 = self.browser.get_current(radio.id)
- radio.current.title = None
- return radio
-
- OBJECTS = {Radio: fill_radio}
diff --git a/modules/franceinter/favicon.png b/modules/franceinter/favicon.png
deleted file mode 100644
index f4bf54f5..00000000
Binary files a/modules/franceinter/favicon.png and /dev/null differ
diff --git a/modules/franceinter/test.py b/modules/franceinter/test.py
deleted file mode 100644
index ea9995a6..00000000
--- a/modules/franceinter/test.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright(C) 2010-2011 Romain Bignon
-#
-# 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
-
-class FranceInterTest(BackendTest):
- BACKEND = 'franceinter'
-
- def test_franceinter(self):
- l = list(self.backend.iter_resources([]))
- self.assertTrue(len(l) > 0)
diff --git a/modules/lemouv/__init__.py b/modules/lemouv/__init__.py
deleted file mode 100644
index bd413c3c..00000000
--- a/modules/lemouv/__init__.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# * -*- coding: utf-8 -*-
-
-# Copyright(C) 2011 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 .backend import LeMouvBackend
-
-
-__all__ = ['LeMouvBackend']
diff --git a/modules/lemouv/backend.py b/modules/lemouv/backend.py
deleted file mode 100644
index 586680c0..00000000
--- a/modules/lemouv/backend.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# * -*- coding: utf-8 -*-
-
-# Copyright(C) 2011 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 ICapRadio, Radio, Stream, Emission
-from weboob.capabilities.collection import ICapCollection, CollectionNotFound
-from weboob.tools.backend import BaseBackend
-from weboob.tools.browser import BaseBrowser, BasePage
-
-
-__all__ = ['LeMouvBackend']
-
-
-class XMLinfos(BasePage):
- def get_current(self):
- try:
- for channel in self.parser.select(self.document.getroot(), 'channel'):
- title = channel.find('item/song_title').text
- artist = channel.find('item/artist_name').text
- except AttributeError:
- title = "Not defined"
- artist = "Not defined"
-
- return unicode(artist).strip(), unicode(title).strip()
-
-class LeMouvBrowser(BaseBrowser):
- DOMAIN = u'statique.lemouv.fr'
- PAGES = {r'.*/files/rfPlayer/mouvRSS\.xml': XMLinfos}
-
- def get_current(self, radio):
- self.location('/files/rfPlayer/mouvRSS.xml')
- assert self.is_on_page(XMLinfos)
-
- return self.page.get_current()
-
-class LeMouvBackend(BaseBackend, ICapRadio, ICapCollection):
- NAME = 'lemouv'
- MAINTAINER = 'Johann Broudin'
- EMAIL = 'johann.broudin@6-8.fr'
- VERSION = '0.a'
- DESCRIPTION = u'The le mouv\' french radio'
- LICENCE = 'AGPLv3+'
- BROWSER = LeMouvBrowser
-
- _RADIOS = {'lemouv': (u'le mouv\'', u'le mouv', u'http://mp3.live.tv-radio.com/lemouv/all/lemouvhautdebit.mp3')}
-
- def iter_resources(self, splited_path):
- if len(splited_path) > 0:
- raise CollectionNotFound()
-
- for id in self._RADIOS.iterkeys():
- yield self.get_radio(id)
-
- def iter_radios_search(self, pattern):
- for radio in self.iter_resources([]):
- if pattern.lower() in radio.title.lower() or pattern.lower() in radio.description.lower():
- 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 = u'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/modules/lemouv/favicon.png b/modules/lemouv/favicon.png
deleted file mode 100644
index 4650bb82..00000000
Binary files a/modules/lemouv/favicon.png and /dev/null differ
diff --git a/modules/franceinter/__init__.py b/modules/radiofrance/__init__.py
similarity index 84%
rename from modules/franceinter/__init__.py
rename to modules/radiofrance/__init__.py
index d2002ba3..35ed9971 100644
--- a/modules/franceinter/__init__.py
+++ b/modules/radiofrance/__init__.py
@@ -1,6 +1,6 @@
# * -*- coding: utf-8 -*-
-# Copyright(C) 2011 Johann Broudin
+# Copyright(C) 2011-2012 Johann Broudin, Laurent Bachelier
#
# This file is part of weboob.
#
@@ -18,8 +18,8 @@
# along with weboob. If not, see .
-from .backend import FranceInterBackend
+from .backend import RadioFranceBackend
-__all__ = ['FranceInterBackend']
+__all__ = ['RadioFranceBackend']
diff --git a/modules/radiofrance/backend.py b/modules/radiofrance/backend.py
new file mode 100644
index 00000000..07cc4e3d
--- /dev/null
+++ b/modules/radiofrance/backend.py
@@ -0,0 +1,126 @@
+# * -*- coding: utf-8 -*-
+
+# Copyright(C) 2011-2012 Johann Broudin, Laurent Bachelier
+#
+# 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, Emission
+from weboob.capabilities.collection import ICapCollection, CollectionNotFound
+from weboob.tools.backend import BaseBackend
+from weboob.tools.browser import BaseBrowser, BasePage
+
+
+__all__ = ['RadioFranceBackend']
+
+
+class DataPage(BasePage):
+ def get_title(self):
+ for metas in self.parser.select(self.document.getroot(), 'div.metas'):
+ title = unicode(metas.text_content()).strip()
+ if len(title):
+ return title
+
+
+class RadioFranceBrowser(BaseBrowser):
+ DOMAIN = None
+ ENCODING = 'UTF-8'
+ PAGES = {r'/playerjs/direct/donneesassociees/html\?guid=$': DataPage}
+
+ def get_current_playerjs(self, id):
+ self.location('http://www.%s.fr/playerjs/direct/donneesassociees/html?guid=' % id)
+ assert self.is_on_page(DataPage)
+
+ return self.page.get_title()
+
+
+class RadioFranceBackend(BaseBackend, ICapRadio, ICapCollection):
+ NAME = 'radiofrance'
+ MAINTAINER = 'Laurent Bachelier'
+ EMAIL = 'laurent@bachelier.name'
+ VERSION = '0.a'
+ DESCRIPTION = u'The radios of Radio France (Inter, Culture, Le Mouv\', etc.)'
+ LICENSE = 'AGPLv3+'
+ BROWSER = RadioFranceBrowser
+
+ _MP3_URL = u'http://mp3.live.tv-radio.com/%s/all/%s.mp3'
+ _MP3_HD_URL = u'http://mp3.live.tv-radio.com/%s/all/%shautdebit.mp3'
+ _RADIOS = {'franceinter': u'France Inter',
+ 'franceculture': u'France Culture',
+ 'franceinfo': u'France Info',
+ 'fbidf': u'France Bleu Ile-de-France',
+ 'fip': u'FIP',
+ 'francemusique': u'France Musique',
+ 'lemouv': u'Le Mouv\'',
+ }
+
+ _PLAYERJS_RADIOS = ('franceinter',
+ 'franceculture',
+ 'franceinfo',
+ 'lemouv',
+ )
+
+ _SD_RADIOS = ('franceinfo', )
+
+ def iter_resources(self, splited_path):
+ if len(splited_path) > 0:
+ raise CollectionNotFound()
+
+ for id in self._RADIOS.iterkeys():
+ yield self.get_radio(id)
+
+ def iter_radios_search(self, pattern):
+ for radio in self.iter_resources([]):
+ if pattern.lower() in radio.title.lower() or pattern.lower() in radio.description.lower():
+ 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 = self._RADIOS[radio.id]
+ radio.title = title
+ radio.description = title
+
+ if radio.id in self._SD_RADIOS:
+ url = self._MP3_URL % (radio.id, radio.id)
+ else:
+ url = self._MP3_HD_URL % (radio.id, radio.id)
+
+ self.fillobj(radio, ('current', ))
+
+ stream = Stream(0)
+ stream.title = u'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)
+ if radio.id in self._PLAYERJS_RADIOS:
+ radio.current.artist = None
+ radio.current.title = self.browser.get_current_playerjs(radio.id)
+ else:
+ radio.current.artist = None
+ radio.current.title = None
+ return radio
+
+ OBJECTS = {Radio: fill_radio}
diff --git a/modules/radiofrance/favicon.png b/modules/radiofrance/favicon.png
new file mode 100644
index 00000000..b52359d4
Binary files /dev/null and b/modules/radiofrance/favicon.png differ
diff --git a/modules/lemouv/test.py b/modules/radiofrance/test.py
similarity index 84%
rename from modules/lemouv/test.py
rename to modules/radiofrance/test.py
index 422e7eaf..77893cc9 100644
--- a/modules/lemouv/test.py
+++ b/modules/radiofrance/test.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright(C) 2010-2011 Romain Bignon
+# Copyright(C) 2011-2012 Romain Bignon, Laurent Bachelier
#
# This file is part of weboob.
#
@@ -20,9 +20,10 @@
from weboob.tools.test import BackendTest
-class LeMouvTest(BackendTest):
- BACKEND = 'lemouv'
- def test_lemouv(self):
+class RadioFranceTest(BackendTest):
+ BACKEND = 'radiofrance'
+
+ def test_get_radios(self):
l = list(self.backend.iter_resources([]))
self.assertTrue(len(l) > 0)