From 3983f14b372749b023ecf9c685a40066880d1e5a Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Sat, 28 Nov 2015 13:36:48 +0100 Subject: [PATCH] update readme --- README.rst | 106 ++++++++++++++++++++++++++++++++-- docs/screenshots/browsing.png | Bin 0 -> 16156 bytes 2 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 docs/screenshots/browsing.png diff --git a/README.rst b/README.rst index afd652e..d5c6f7c 100644 --- a/README.rst +++ b/README.rst @@ -1,19 +1,92 @@ ******************** Noxon iRadio gateway ******************** -Push your own content onto Noxon iRadio devices: +Push your own content onto `Noxon iRadio`__ devices: RSS feeds, text files and MediaTomb server structures. This tool makes it possible to push own data into the menu -entries +entries "Internet Radio", "Podcasts" and "My Noxon" without relying +on the official Terratec servers. -- Internet Radio -- Podcasts -- My Noxon +__ http://www.noxonradio.de/ + + +.. contents:: + + +======== +Features +======== +- Customize the Noxon iRadio menus "Internet Radio", "Podcasts" and "My Noxon" +- Show Mediatomb UPnP server content in "Internet Radio", so that you + don't have to restart your iRadio because it does not find the UPnP server + after a day of standby +- Display text files and run shell scripts from the menu (home automation) +- Podcast RSS feed support +- Discoverable with your web browser +- Transcoding of non-mp3 file types to ``.mp3`` that iRadios can play + + +RSS feed support +================ +Simpy write a podcast's mp3 RSS feed URL into a ``.url`` file in +the ``var/`` directory structure, and your radio will show you a +folder with all episodes. +Enter an episode to play it. + +The Noxon iRadios do only allow a single HTTP redirect when they access a URL +to play, but many podcast feeds send you for tracking purposes through 3 or +more redirects until you reach the final mp3 URL. + +noxon-gateway resolves the redirections for the iRadio, so that this will +not be a problem. + + +Creating an RSS feed +-------------------- +You have to know the URL to the podcast's mp3 RSS feed, e.g. +``http://cast.example.org/news.rss``. + +Create a file ``Cast News.url`` in ``var/podcasts/`` and write the RSS URL +into it. +That's all. + +When accessing the "Podcasts" menu from your noxon iRadio, you'll see a +directory ``Cast News`` that contains all podcast episodes. + + +Supported radios +================ +This is the list of iRadios known to work with ``noxon-gateway``: + +- `Noxon iRadio`__ (original white version) +- `Noxon iRadio cube`__ + +Others should work. +If you know of unlisted radios that do work with this tool, please tell me. + +__ http://ftp.noxonradio.de/index.php?dir=NOXON%2FNOXON_iRadio%2F +__ http://ftp.noxonradio.de/index.php?dir=NOXON%2FNOXON_iRadio_Cube%2F + + +Web browser support +=================== +You can discover the noxon-gateway contents with your web browser. +Point your browser to the gateway's domain and start browsing: + +.. image:: docs/screenshots/browsing.png + +This works because the XML files delivered by noxon-gateway contain the +link to an XSLT__ file that converts the XML structure to HTML that +browsers understand. + +Works at least with Firefox 42 and Chromium 45. + +__ http://www.w3.org/TR/xslt =================================== -Customizung the directory structure +Customizing the directory structure =================================== The ``var/`` directory contains three directories you can fill with your own content. @@ -100,11 +173,32 @@ by this tool:: gatekeeper.my-noxon.net +Configure this in your router or the DNS server your iRadio devices use. + + MediaTomb ========= To be able to browse a MediaTomb server, copy ``data/config.php.dist`` to ``data/config.php`` and fill it with mediatomb web interface credentials. +You also have to install the `Services_Mediatomb`__ library via `PEAR`__:: + + $ pear channel-discover zustellzentrum.cweiske.de + $ pear install zz/services_mediatomb-alpha + +__ http://zustellzentrum.cweiske.de/index.php?package=Services_MediaTomb +__ http://pear.php.net/ + + +Transcoding +=========== +If you have non-mp3 files in your audio collection, install `ffmpeg`__ +on the noxon-gateway server. +Transcoding will start automatically when the player accesses a file +that is not in ``audio/mpeg`` format. + +__ http://ffmpeg.org/ + ======= License diff --git a/docs/screenshots/browsing.png b/docs/screenshots/browsing.png new file mode 100644 index 0000000000000000000000000000000000000000..e4499e38ddc1b3fdcfa54f3c021961e1fccebe57 GIT binary patch literal 16156 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