├── .gitignore ├── README.rst ├── api ├── bookmarks.rst ├── examples │ ├── firmware.res.xml │ ├── login.res.xml │ ├── menu.res.xml │ ├── menuitem-dir.xml │ ├── menuitem-display.xml │ ├── menuitem-message.xml │ ├── menuitem-previous.xml │ ├── menuitem-search.xml │ ├── menuitem-showepisode.xml │ ├── menuitem-showondemand.xml │ └── menuitem-station.xml ├── firmware.rst ├── general-info.rst ├── login.rst ├── menu.rst ├── menuitems.rst └── servers.rst ├── build.sh ├── fetcher └── fetch.php └── styles.css /.gitignore: -------------------------------------------------------------------------------- 1 | /fetcher/* 2 | /noxon-api.htm 3 | /samples 4 | /notes.rst 5 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ************************ 2 | Noxon iRadio gateway API 3 | ************************ 4 | 5 | This is an attempt to document the API between Noxon iRadio devices 6 | and the servers at ``vtuner.com`` and ``my-noxon.net``. 7 | 8 | Noxon iRadio devices have a couple of hard-coded menu entries that 9 | connect to certain HTTP urls when accessing them: 10 | 11 | - Internetradio 12 | - Podcasts 13 | - My Noxon 14 | 15 | The server returns XML data representing menus that get shown 16 | on the radio. 17 | Menus consist of folders, audio URLs, unactionable message entries 18 | and popup messages. 19 | 20 | 21 | .. contents:: 22 | :depth: 2 23 | 24 | 25 | ============== 26 | Devices tested 27 | ============== 28 | * Noxon iRadio (original white version) 29 | * Noxon iRadio cube 30 | 31 | 32 | .. include:: api/servers.rst 33 | .. include:: api/general-info.rst 34 | .. include:: api/login.rst 35 | .. include:: api/menu.rst 36 | .. include:: api/menuitems.rst 37 | .. include:: api/bookmarks.rst 38 | .. include:: api/firmware.rst 39 | 40 | 41 | ===== 42 | About 43 | ===== 44 | This documentation has been written by Christian Weiske, 45 | cweiske+noxon@cweiske.de. 46 | 47 | Last update: ##UPDATE## 48 | 49 | 50 | License 51 | ======= 52 | It is licensed under the GNU Free Documentation License. 53 | 54 | 55 | Source code 56 | =========== 57 | The documentation sources are available at 58 | http://git.cweiske.de/noxon-api.git/ 59 | and mirrored at 60 | https://github.com/cweiske/noxon-api 61 | 62 | 63 | Home page 64 | ========= 65 | A rendered version of this documentation is available at 66 | http://cweiske.de/noxon-api.htm 67 | 68 | 69 | 70 | Building 71 | ======== 72 | You need to install ``rst2html5`` before:: 73 | 74 | $ pip install rst2html5-tools 75 | 76 | Rendering the docs is done via a build script:: 77 | 78 | $ ./build.sh 79 | -------------------------------------------------------------------------------- /api/bookmarks.rst: -------------------------------------------------------------------------------- 1 | ========= 2 | Bookmarks 3 | ========= 4 | Also known as "Favorites". 5 | 6 | FIXME. 7 | -------------------------------------------------------------------------------- /api/examples/firmware.res.xml: -------------------------------------------------------------------------------- 1 | 2 | 3.8.36.6921 3 | 13062 4 | 5 | 0 6 | 3 7 | 8 8 | 0 9 | 6921 10 | http://apps.my-noxon.net/updates/dmp370/files/2009-05-08_NOXON_Cube_firmware_FW6921_HWID13062.bcd 11 | 0 12 | 0 13 | 0 14 | 15 | 16 | -------------------------------------------------------------------------------- /api/examples/login.res.xml: -------------------------------------------------------------------------------- 1 | a6703ded78821be5 2 | -------------------------------------------------------------------------------- /api/examples/menu.res.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -1 4 | 5 | Dir 6 | Lokale Sender - Deutschland 7 | http://radio567.vtuner.com/setupapp/radio567/asp/browsexpa/navXML.asp?gofile=LocationLevelFour-Europe-Germany&bkLvl=LocationLevelFour-Europe-GermanyOObkLvlTypeOOl 8 | http://radio5672.vtuner.com/setupapp/radio567/asp/browsexpa/navXML.asp?gofile=LocationLevelFour-Europe-Germany&bkLvl=LocationLevelFour-Europe-GermanyOObkLvlTypeOOl 9 | 10 | 11 | Dir 12 | Best of NOXON 13 | http://radio567.vtuner.com/setupapp/radio567/asp/browsexpa/bestXML.asp 14 | http://radio567.vtuner.com/setupapp/radio567/asp/browsexpa/bestXML.asp 15 | 16 | 17 | -------------------------------------------------------------------------------- /api/examples/menuitem-dir.xml: -------------------------------------------------------------------------------- 1 | 2 | Dir 3 | Best of NOXON 4 | http://radio567.vtuner.com/setupapp/radio567/asp/browsexpa/bestXML.asp 5 | http://radio567.vtuner.com/setupapp/radio567/asp/browsexpa/bestXML.asp 6 | 7 | -------------------------------------------------------------------------------- /api/examples/menuitem-display.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Display 5 | Sicherheitscode 6 | 7 | 8 | Display 9 | 0682 10 | 11 | 12 | -------------------------------------------------------------------------------- /api/examples/menuitem-message.xml: -------------------------------------------------------------------------------- 1 | 2 | Message 3 | Service unavailable 4 | 5 | -------------------------------------------------------------------------------- /api/examples/menuitem-previous.xml: -------------------------------------------------------------------------------- 1 | 2 | Previous 3 | http://radio567.vtuner.com/... 4 | http://radio5672.vtuner.com/.. 5 | 6 | -------------------------------------------------------------------------------- /api/examples/menuitem-search.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Yes 4 | 1 5 | 6 | Search 7 | Suche 8 | http://192.168.0.1/usersearch.php?foo=bar 9 | http://192.168.0.1/usersearch.php?foo=bar 10 | 11 | 12 | -------------------------------------------------------------------------------- /api/examples/menuitem-showepisode.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/noxon-api/876bc3eb96b34029e8a7616d2335de34eb26d6c7/api/examples/menuitem-showepisode.xml -------------------------------------------------------------------------------- /api/examples/menuitem-showondemand.xml: -------------------------------------------------------------------------------- 1 | 2 | ShowOnDemand 3 | P5031 4 | Inside Europe 5 | http://radio567.vtuner.com/setupapp/radio567/asp/browsexpa/GetShowXML.asp?showid=P5031&gofile=LocationLevelFive-Europe-Germany-AllStations-st526 6 | http://radio5672.vtuner.com/setupapp/radio567/asp/browsexpa/GetShowXML.asp?showid=P5031&gofile=LocationLevelFive-Europe-Germany-AllStations-st526 7 | http://radio567.vtuner.com/setupapp/radio567/asp/browsexpa/AddFav.asp?empty=&showid=P5031 8 | 9 | -------------------------------------------------------------------------------- /api/examples/menuitem-station.xml: -------------------------------------------------------------------------------- 1 | 2 | Station 3 | 526 4 | Deutsche Welle English Live 5 | http://radio567.vtuner.com/setupapp/radio567/asp/func/dynamOD.asp?ex45v=000000004C3B4B60322F&id=526 6 | DW's English service, bringing you global news from the heart of Europe. 7 | Public 8 | Germany 9 | 64 10 | MP3 11 | 3 12 | http://radio567.vtuner.com/setupapp/radio567/asp/browsexpa/AddFav.asp?empty=&stationid=526 13 | http://rs2.radiosetup.com/setupapp/setup1/logo/logo-526.jpg 14 | 15 | -------------------------------------------------------------------------------- /api/firmware.rst: -------------------------------------------------------------------------------- 1 | ================ 2 | Firmware updates 3 | ================ 4 | I found the Noxon iRadio Cube request the following URL to check for 5 | the currently available firmware version: 6 | 7 | ``http://apps.my-noxon.net/updates/dmp370/update.php?mac=00307771a0c7&hwid=13062&ver=36.6921&bl=6856&dlang=ger`` 8 | 9 | The MAC address is given in plain text here; it is not hashed/encrypted 10 | as in the "normal" menu requests. 11 | 12 | This seems to be a dedicated server, separate from the ones used 13 | for the menu. 14 | 15 | There is no login necessary to check firmware updates. 16 | 17 | 18 | Response 19 | ======== 20 | The HTTP ``content-type`` header is again given as ``text/html``, but 21 | it's XML: 22 | 23 | .. include:: examples/firmware.res.xml 24 | :code: 25 | -------------------------------------------------------------------------------- /api/general-info.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | General connection information 3 | ============================== 4 | The radios access the URLs via HTTP. 5 | 6 | 7 | XML menu response format 8 | ======================== 9 | Menu responses are in XML format. 10 | The MIME type sent by the server does not matter; the official servers 11 | send ``text/html`` although it's clearly not HTML. 12 | 13 | The XML prolog (````) can be omitted. 14 | 15 | The XML data are interpreted by the radios with a charset of ``iso-8859-1``, 16 | no matter what the ``content-type`` header sent by the server or the XML 17 | prolog say. 18 | 19 | It is possible to add processing instructions to the XML without breaking 20 | the radio. 21 | 22 | XML tag attributes are not used. 23 | -------------------------------------------------------------------------------- /api/login.rst: -------------------------------------------------------------------------------- 1 | ===== 2 | Login 3 | ===== 4 | Before menu data are requested, the radio obtains a token that is used 5 | to hash the MAC address in subsequent requests. 6 | 7 | The following URLs are used for requesting the "encryption token": 8 | 9 | Internetradio 10 | ``http://radio567.vtuner.com:80/setupapp/radio567/asp/BrowseXPA/LoginXML.asp?token=0`` 11 | Podcasts 12 | ``http://radio567.vtuner.com:80/setupapp/radio567/asp/BrowseXPA/loginXML.asp?token=0`` 13 | My Noxon 14 | ``http://gatekeeper.my-noxon.net:80/RadioNativeLogin.php`` 15 | 16 | 17 | Response 18 | ======== 19 | The response is an XML file with only one tag. 20 | 21 | .. include:: examples/login.res.xml 22 | :code: 23 | -------------------------------------------------------------------------------- /api/menu.rst: -------------------------------------------------------------------------------- 1 | ==== 2 | Menu 3 | ==== 4 | After the ``encryptedToken`` has been obtained during the login process, 5 | the menu itself is fetched. 6 | 7 | 8 | Initial URLs 9 | ============ 10 | The following URLs are used after login: 11 | 12 | Internetradio 13 | ``http://radio567.vtuner.com:80/setupapp/radio567/asp/BrowseXPA/LoginXML.asp?mac=6FD0281BB8B2C3D46ABB2A34CA9EF1CF&fver=3.8.36.6921&dlang=ger&hwid=13062&startitems=1&enditems=10`` 14 | Podcasts 15 | ``http://radio567.vtuner.com:80/setupapp/radio567/asp/BrowseXPA/navXML.asp?gofile=S-ByLocation&mac=6FD0281BB8B2C3D46ABB2A34CA9EF1CF&fver=3.8.36.6921&dlang=ger&hwid=13062&startitems=1&enditems=10`` 16 | My Noxon 17 | ``http://gatekeeper.my-noxon.net:80/RadioNative.php?hwid=13062&mac=6FD0281BB8B2C3D46ABB2A34CA9EF1CF&fver=3.8.36.6921&dlang=ger&startitems=1&enditems=10`` 18 | 19 | 20 | GET parameters 21 | ============== 22 | The iRadio devices append a number of GET parameters to each menu URL: 23 | 24 | ``mac`` 25 | MAC address of the device, hashed/encrypted with the ``encryptedToken`` 26 | obtained during the login process. 27 | 28 | Example: ``6FD0281BB8B2C3D46ABB2A34CA9EF1CF`` 29 | ``fver`` 30 | Firmware version 31 | 32 | Example: ``3.8.36.6921`` 33 | ``dlang`` 34 | Language 35 | 36 | Example: ``ger`` 37 | ``hwid`` 38 | Hardware revision 39 | 40 | Example: ``13062`` 41 | ``startitems`` 42 | Paging settings; first menu entry to fetch. 43 | 44 | First entry is ``1``. 45 | ``enditems`` 46 | Paging: Last menu entry to fetch 47 | 48 | Default: ``startitems + 9`` - ``10`` 49 | 50 | 51 | Paging 52 | ====== 53 | By default, the first 10 entries of a menu are requested. 54 | 55 | When the response contains an ```` tag, the last 10 56 | are fetched, and then 10-20. 57 | 58 | Example: 59 | 60 | #. Radio requests items ``1-10`` 61 | #. Response has ```` of ``52`` 62 | #. Radio requests items ``42-52`` 63 | #. Radio requests items ``10-20`` 64 | 65 | When scrolling to position ``11``, the radio requests ``19-29``. 66 | 67 | Scrolling further, ``28-38`` are fetched, then ``37-47``. 68 | 69 | 70 | Response 71 | ======== 72 | XML file with a any number of menu entries. 73 | 74 | The XML root tag is ``ListOfItems``. 75 | 76 | A menu ```` can contain the following tags: 77 | 78 | ```` 79 | Total number of items. Can be ``-1``. 80 | 81 | The ``Previous`` item is not counted. 82 | 83 | Optional. 84 | ```` 85 | Contains any number of ```` tags. 86 | ```` 87 | ??? Forces the radio to re-fetch the list when going back to it 88 | via the back (left arrow) button. 89 | 90 | Only known value: ``Yes`` 91 | 92 | .. include:: examples/menu.res.xml 93 | :code: 94 | -------------------------------------------------------------------------------- /api/menuitems.rst: -------------------------------------------------------------------------------- 1 | ========== 2 | Menu items 3 | ========== 4 | A menu ```` can contain the following tags: 5 | 6 | 7 | Item types 8 | ========== 9 | There are different types of menu entries. Their type is specified 10 | by the ```` tag: 11 | 12 | ``Dir`` 13 | Directory you can navigate into 14 | ``Display`` 15 | A message line you cannot act on, only read. 16 | ``Message`` 17 | A full-screen message. 18 | 19 | It vanishes after some seconds and shows the rest of the list, 20 | or goes back to the previous list if there are no other 21 | list items. 22 | 23 | When entering from the iRadio's main menu and the rest of the 24 | list is empty, "--leer--" is shown (not going back to main menu). 25 | ``Previous`` 26 | Link back to the parent folder. 27 | ``Search`` 28 | Show a search mask with alphanumeric input. 29 | ``ShowEpisode`` 30 | Single episode from a ``ShowOnDemand`` that you can hear, e.g. a single podcast 31 | episode. 32 | ``ShowOnDemand`` 33 | Part of an internet station: A specific show about one topic or by a 34 | specific person. 35 | 36 | Also used for a single podcast. 37 | ``Station`` 38 | An internet radio station (live stream). 39 | 40 | Types that yCast knows of, but none of them works at least on iRadio 300: 41 | 42 | - ``SearchTextbox`` 43 | - ``SearchButtonGo`` 44 | - ``SearchButtonCancel`` 45 | 46 | 47 | Dir 48 | === 49 | A directory in which you can go into. 50 | 51 | Allowed tags: 52 | 53 | ``ItemType`` 54 | ``Dir`` 55 | ``Title`` 56 | Name to show 57 | ``UrlDir`` 58 | URL to use when navigating into the folder 59 | ``UrlDirBackUp`` 60 | URL to use when ``UrlDir`` returned a HTTP error status code. 61 | ``BookmarkShow`` 62 | ??? Does it work? 63 | ``NoAudioContent`` 64 | ??? 65 | 66 | Known value: ``true`` 67 | 68 | 69 | .. include:: examples/menuitem-dir.xml 70 | :code: 71 | 72 | 73 | Display 74 | ======= 75 | A message line you cannot act on, only read. 76 | 77 | Displayed like a normal directory or radio station, but without an icon 78 | at the end. 79 | 80 | Useful to display messages on several lines, while showing other item types 81 | at the same time. 82 | 83 | Related to ``Message``. 84 | 85 | Allowed tags: 86 | 87 | ``ItemType`` 88 | ``Display`` 89 | ``Display`` 90 | The message to show 91 | 92 | .. include:: examples/menuitem-display.xml 93 | :code: 94 | 95 | 96 | Message 97 | ======= 98 | A full-screen message. 99 | It vanishes after some seconds and shows the rest of the list, 100 | or goes back to the previous list if there are no other list items. 101 | 102 | When entering from the iRadio's main menu and the rest of the 103 | list is empty, ``--leer--`` is shown (not going back to main menu). 104 | 105 | Related to ``Display``. 106 | 107 | Allowed tags: 108 | 109 | ``ItemType`` 110 | ``Message`` 111 | ``Message`` 112 | The message to show. Automatically breaks onto multiple lines when too long. 113 | 114 | 115 | .. include:: examples/menuitem-message.xml 116 | :code: 117 | 118 | 119 | Previous 120 | ======== 121 | Link back to the parent folder. 122 | 123 | Does not count to the ``ItemCount`` number. 124 | 125 | Allowed tags: 126 | 127 | ``ItemType`` 128 | ``Previous`` 129 | ``UrlPrevious`` 130 | Full URL that is fetched when clicking the back button (left arrow). 131 | ``UrlPreviousBackUp`` 132 | In case ``UrlPrevious`` brings an HTTP error status code, this one is used. 133 | 134 | 135 | .. include:: examples/menuitem-previous.xml 136 | :code: 137 | 138 | 139 | Search 140 | ====== 141 | Show a search mask with alphanumeric input (at least on iRadio 300). 142 | 143 | Allowed tags: 144 | 145 | ``ItemType`` 146 | ``Search`` 147 | ``SearchCaption`` 148 | Title 149 | ``SearchURL`` 150 | URL to send search request to 151 | ``SearchURLBackUp`` 152 | Alternative URL 153 | 154 | 155 | .. include:: examples/menuitem-search.xml 156 | :code: 157 | 158 | 159 | ShowEpisode 160 | =========== 161 | A single episode/file from a ``ShowOnDemand`` that you can listen to, 162 | e.g. a single podcast episode. 163 | 164 | Allowed tags: 165 | 166 | ``ItemType`` 167 | ``ShowEpisode`` 168 | ``ShowEpisodeID`` 169 | ??? 170 | ``ShowEpisodeName`` 171 | Title 172 | ``ShowEpisodeURL`` 173 | URL to use when playing the podcast. 174 | ``BookmarkShow`` 175 | URL to use when favoriting/bookmarking the episode. 176 | The full show is bookmarked, not the single episode. 177 | ``ShowDesc`` 178 | Description. 179 | ``ShowFormat`` 180 | Category, e.g. "Reggae", "Sports", "Technology". Seems to be free text. 181 | ``Lang`` 182 | Language, e.g. "English" 183 | ``Country`` 184 | Country of origin, e.g. "Germany" 185 | ``ShowMime`` 186 | Stream file type (not a valid MIME type, despite the tag name) 187 | 188 | Known values: 189 | 190 | - ``AAC`` 191 | - ``MP3`` 192 | - ``RealPlayer`` 193 | - ``WMA`` 194 | 195 | 196 | .. include:: examples/menuitem-showepisode.xml 197 | :code: 198 | 199 | 200 | ShowOnDemand 201 | ============ 202 | A podcast, or a regular part (show) of a radio station - about a 203 | specific topic or by an anchorman. 204 | 205 | Single episodes of a show are available via ``ShowOnDemandURL``. 206 | 207 | Allowed tags: 208 | 209 | ``ItemType`` 210 | ``ShowOnDemand`` 211 | ``ShowOnDemandID`` 212 | Alphanumeric Identifier 213 | ``ShowOnDemandName`` 214 | Title 215 | ``Logo`` 216 | URL to an image file 217 | ``ShowOnDemandURL`` 218 | URL with a list of ``ShowEpisode`` items 219 | ``ShowOnDemandURLBackUp`` 220 | Alternative/backup URL to ``ShowOnDemandURL`` 221 | ``BookmarkShow`` 222 | URL to use when favoriting/bookmarking the show. 223 | 224 | 225 | .. include:: examples/menuitem-showondemand.xml 226 | :code: 227 | 228 | 229 | Station 230 | ======= 231 | An internet radio station / live stream. 232 | 233 | Allowed tags: 234 | 235 | ``ItemType`` 236 | ``Station`` 237 | ``StationId`` 238 | Alphanumeric ID 239 | ``StationName`` 240 | Title, e.g. "Deutsche Welle English Live" 241 | ``StationUrl`` 242 | Stream URL 243 | ``StationDesc`` 244 | Description 245 | ``StationFormat`` 246 | Category, see ``ShowFormat`` 247 | ``StationLocation`` 248 | Country of location 249 | ``StationBandWidth`` 250 | Bitrate in kbit/s, e.g. ``64`` 251 | ``StationMime`` 252 | Stream type - see ``ShowMime`` 253 | ``Relia`` 254 | ??? Reliabilit factor, integer 255 | 256 | Known values: 1 - 5 257 | ``Bookmark`` 258 | URL to call when bookmarking the station 259 | ``Logo`` 260 | URL to an image file 261 | 262 | 263 | .. include:: examples/menuitem-station.xml 264 | :code: 265 | -------------------------------------------------------------------------------- /api/servers.rst: -------------------------------------------------------------------------------- 1 | ======= 2 | Servers 3 | ======= 4 | The Noxon iRadio devices speak with several servers. 5 | Here is a brief overview on what they do: 6 | 7 | 8 | radio567.vtuner.com 9 | =================== 10 | External service that provides a directory of internet radio 11 | stations and podcasts. 12 | Menu entries "Internetradio" and "Podcasts". 13 | 14 | ``radio5672.vtuner.com`` is a second instance that is used 15 | as backup in case the normal machine is not reachable. 16 | 17 | 18 | gatekeeper.my-noxon.net 19 | ======================= 20 | - Starting point for integrated services like Napster, Musicload 21 | and mp3tunes (Menu entry "My Noxon") 22 | - Favorite storage 23 | 24 | 25 | apps.my-noxon.net 26 | ================= 27 | - Firmware updates 28 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #rst2html README.rst noxon-api.htm 3 | # --title: workaround for https://github.com/marianoguerra/rst2html5/issues/70 4 | rst2html5\ 5 | --bootstrap-css\ 6 | --stylesheet-path=styles.css --embed-stylesheet\ 7 | --title="Noxon gateway API documentation"\ 8 | README.rst noxon-api.htm 9 | 10 | # add current date to rendered docs 11 | sed -i "s/##UPDATE##/`date -Is`/" noxon-api.htm 12 | -------------------------------------------------------------------------------- /fetcher/fetch.php: -------------------------------------------------------------------------------- 1 | Item as $xItem) { 31 | if ($xItem->ItemType == 'Dir') { 32 | fetch($xItem->UrlDir); 33 | } else if ($xItem->ItemType == 'ShowOnDemand') { 34 | fetch($xItem->ShowOnDemandURL); 35 | } 36 | } 37 | //echo $content . "\n"; 38 | } 39 | ?> 40 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 3ex 15%; 3 | font-family: helvetica; 4 | color: #222; 5 | } 6 | 7 | header code, #contents code { 8 | font-size: inherit; 9 | border: none; 10 | background-color: transparent; 11 | color: inherit; 12 | } 13 | h1 { 14 | text-align: center; 15 | margin-bottom: 2ex; 16 | } 17 | h2 { 18 | margin-top: 3ex; 19 | padding-top: 1ex; 20 | border-top: 1px solid grey; 21 | } 22 | 23 | dd { 24 | margin-left: 3ex; 25 | } --------------------------------------------------------------------------------