diff --git a/weboob/backends/nova/__init__.py b/weboob/backends/nova/__init__.py
new file mode 100644
index 00000000..05ea8c4c
--- /dev/null
+++ b/weboob/backends/nova/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 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 .backend import NovaBackend
+
+__all__ = ['NovaBackend']
diff --git a/weboob/backends/nova/backend.py b/weboob/backends/nova/backend.py
new file mode 100644
index 00000000..05c5e303
--- /dev/null
+++ b/weboob/backends/nova/backend.py
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 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.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__ = ['NovaBackend']
+
+
+class HistoryPage(BasePage):
+ def get_current(self):
+ for div in self.parser.select(self.document.getroot(), 'div#rubrique_contenu div.resultat'):
+ artist = self.parser.select(div, 'span#artiste', 1).find('a').text
+ title = self.parser.select(div, 'span#titre', 1).text
+ return unicode(artist).strip(), unicode(title).strip()
+
+class NovaBrowser(BaseBrowser):
+ DOMAIN = u'www.novaplanet.com'
+ PAGES = {r'http://www.novaplanet.com/cetaitquoicetitre/radionova/\d*': HistoryPage,
+ }
+
+ def get_current(self):
+ self.location('/cetaitquoicetitre/radionova/')
+ assert self.is_on_page(HistoryPage)
+
+ return self.page.get_current()
+
+class NovaBackend(BaseBackend, ICapRadio, ICapCollection):
+ NAME = 'nova'
+ MAINTAINER = 'Romain Bignon'
+ EMAIL = 'romain@weboob.org'
+ VERSION = '0.9'
+ DESCRIPTION = u'Nova french radio'
+ LICENSE = 'AGPLv3+'
+ BROWSER = NovaBrowser
+
+ _RADIOS = {'nova': (u'Radio Nova', u'Radio nova', u'http://broadcast.infomaniak.net:80/radionova-high.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()
+ 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()
+ return radio
+
+ OBJECTS = {Radio: fill_radio}
diff --git a/weboob/backends/nova/test.py b/weboob/backends/nova/test.py
new file mode 100644
index 00000000..1f33fe95
--- /dev/null
+++ b/weboob/backends/nova/test.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 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 NovaTest(BackendTest):
+ BACKEND = 'nova'
+
+ def test_nova(self):
+ l = list(self.backend.iter_resources([]))
+ self.assertTrue(len(l) > 0)