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 00000000..312fff79
Binary files /dev/null and b/modules/nihonnooto/favicon.png differ
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)