Internet radio browser GUI for music/video streams from various directory services.

โŒˆโŒ‹ โŽ‡ branch:  streamtuner2


Check-in [2590478319]

Overview
Comment:Fetch all 5 available pages from Xiph directory. Rewrite to use more directed regex extraction mode. Minor help page updates.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 25904783193e3a41c8c7d30d4e96e2c495d56e2d
User & Date: mario on 2015-05-19 22:37:03
Other Links: manifest | tags
Context
2015-05-19
22:37
Minor help page updates. check-in: 9b6aa021cd user: mario tags: trunk
22:37
Fetch all 5 available pages from Xiph directory. Rewrite to use more directed regex extraction mode. Minor help page updates. check-in: 2590478319 user: mario tags: trunk
2015-05-18
22:21
A bit more PEP8, without undoing all readability. check-in: 492cb2aacf user: mario tags: trunk
Changes

Modified Makefile from [75ad58880f] to [14bf4a5119].

82
83
84
85
86
87
88


	$(INST)		help/str*2.1	-t /usr/share/man/man1/

# start locally
st2: run
run:
	MALLOC_CHECK_=2	 PYTHONVERBOSE=2  python -B  ./st2.py -D










>
>
82
83
84
85
86
87
88
89
90
	$(INST)		help/str*2.1	-t /usr/share/man/man1/

# start locally
st2: run
run:
	MALLOC_CHECK_=2	 PYTHONVERBOSE=2  python -B  ./st2.py -D

yelp:
	yelp help/index.page 2>/dev/null &

Modified channels/xiph.py from [6ec5e242b7] to [c7435085e0].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
191
192
193
194
195
196
197
198
199
200
201
202

203
204

205
206
207
208
209
210
211
212

213
214

215
216
217
218
219
220
221


222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237











238
239
240
241
242
243
244
# encoding: UTF-8
# api: streamtuner2
# title: Xiph.org
# description: ICEcast radios. Scans per JSON API, slow XML, or raw directory.
# type: channel
# url: http://dir.xiph.org/
# version: 0.5
# category: radio
# config: 
#    { name: xiph_source, value: web, type: select, select: "cache=JSON cache srv|xml=Clunky XML blob|web=Forbidden fruits", description: "Source for station list extraction." }
# priority: standard
# png:
#   iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAg5JREFUOI2lk1tIE2AUx3+7CG1tlmlG1rSEHrKgEUF7yO40taQiRj10I4qKkOaT4hIUItuTkC8hpJAQtJCICrFpzEKw
#   h61eQorGNBOTzbEt16ZrnR5Wq3mZD/3heziX//983znngyyov+eSbHEA5WKBhs4BKVy9gsqajqwiCwo0dA5IQX5u2s4moliMPPV1nCeDzxgNBFDHE2wsKMPzsGVefobjcnO7RMfeMuL341ZBrNEGRmPqqjdvsbbf
................................................................................
      elif by_format.get(cat):
          url = "http://dir.xiph.org/by_format/{}".format(by_format[cat])
      elif cat:
          url = "http://dir.xiph.org/by_genre/{}".format(cat.title())

      # Collect all result pages
      html = ahttp.get(url)
      for i in range(1,4):
          if html.find('page={}">{}</a></li>'.format(i, i+1)) < 0:
              break
          self.status(i/5.1)
          html += ahttp.get(url, {"search": cat.title(), "page": i})

      try: html = html.encode("raw_unicode_escape").decode("utf-8")
      except: pass


      # Find streams
      r = []
      #for row in re.findall("""<tr class="row[01]">(.+?)</tr>""", html, re.X|re.S):
      #    pass
      ls = re.findall("""
          <tr\s+class="row[01]">
          .*? class="name">

               <a\s+href="(.*?)"[^>]*>
                (.*?)</a>

          .*? "listeners">\[(\d+)
          .*? "stream-description">(.*?)<
          .*? Tags: (.*?) </div>
          .*? href="(/listen/\d+/listen.xspf)"
          .*? class="format"\s+title="([^"]+)"
          .*? /by_format/([^"]+)
      """, html, re.X|re.S)


            
      # Assemble
      for homepage, title, listeners, playing, tags, url, bits, fmt in ls:
          r.append(dict(
              genre = unhtml(tags),
              title = unhtml(title),
              homepage = ahttp.fix_url(homepage),
              playing = unhtml(playing),
              url = "http://dir.xiph.org{}".format(url),
              listformat = "xspf",
              listeners = int(listeners),
              bitrate = bitrate(bits),
              format = mime_fmt(guess_format(fmt)),
          ))
      return r














  # Static list of categories
  genres = [
        "pop",
        [
            "top40", "90s", "80s", "britpop", "disco", "urban", "party",






|







 







|




>
|
|
>



<
<
|
|
|
>
|
<
>
|
|
|
|
|
|
<
>
>
|
<
<

|
|
|
|
|

|
|
|



>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209


210
211
212
213
214

215
216
217
218
219
220
221

222
223
224


225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# encoding: UTF-8
# api: streamtuner2
# title: Xiph.org
# description: ICEcast radios. Scans per JSON API, slow XML, or raw directory.
# type: channel
# url: http://dir.xiph.org/
# version: 0.6
# category: radio
# config: 
#    { name: xiph_source, value: web, type: select, select: "cache=JSON cache srv|xml=Clunky XML blob|web=Forbidden fruits", description: "Source for station list extraction." }
# priority: standard
# png:
#   iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAg5JREFUOI2lk1tIE2AUx3+7CG1tlmlG1rSEHrKgEUF7yO40taQiRj10I4qKkOaT4hIUItuTkC8hpJAQtJCICrFpzEKw
#   h61eQorGNBOTzbEt16ZrnR5Wq3mZD/3heziX//983znngyyov+eSbHEA5WKBhs4BKVy9gsqajqwiCwo0dA5IQX5u2s4moliMPPV1nCeDzxgNBFDHE2wsKMPzsGVefobjcnO7RMfeMuL341ZBrNEGRmPqqjdvsbbf
................................................................................
      elif by_format.get(cat):
          url = "http://dir.xiph.org/by_format/{}".format(by_format[cat])
      elif cat:
          url = "http://dir.xiph.org/by_genre/{}".format(cat.title())

      # Collect all result pages
      html = ahttp.get(url)
      for i in range(1,5):
          if html.find('page={}">{}</a></li>'.format(i, i+1)) < 0:
              break
          self.status(i/5.1)
          html += ahttp.get(url, {"search": cat.title(), "page": i})
      try:
          html = html.encode("raw_unicode_escape").decode("utf-8")
      except:
          pass

      # Find streams
      r = []


      rows = re.findall("""<tr\s+class="row\d*">(.+?)</tr>""", html, re.S)
      for html in rows:
          ls = self.rx_all(
               dict(
                  homepage = """ class="name">  <a\s+href="(.*?)" """,

                  title = """ class="name">  <a[^>]*> (.*?)</a> """,
                  listeners = """ "listeners">\[(\d+) """,
                  playing = """ "stream-description">(.*?)< """,
                  tags = """ (?s) Tags: (.*?) </div> """,
                  url = """ href="(/listen/\d+/listen.xspf)" """,
                  bits = """ class="format"\s+title="([^"]+)" """,
                  fmt = """ /by_format/([^"]+) """,

              ),
              html
          )


          r.append(dict(
              genre = unhtml(ls["tags"]),
              title = unhtml(ls["title"]),
              homepage = ahttp.fix_url(ls["homepage"]),
              playing = unhtml(ls["playing"]),
              url = "http://dir.xiph.org{}".format(ls["url"]),
              listformat = "xspf",
              listeners = int(ls["listeners"]),
              bitrate = bitrate(ls["bits"]),
              format = mime_fmt(guess_format(ls["fmt"])),
          ))
      return r

  # Regex dict
  def rx_all(self, fields, src, flags=re.X):
      row = {}
      for k, v in fields.items():
          m = re.search(v, src, flags)
          if m:
              row[k] = m.group(1)
          else:
              row[k] = ""
      return row
     


  # Static list of categories
  genres = [
        "pop",
        [
            "top40", "90s", "80s", "britpop", "disco", "urban", "party",

Modified help/html/channels.html from [8205a3a87a] to [d55074ef89].

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<div class="linkdiv "><a class="linkdiv" href="surfmusik.html" title="SurfMusic"><span class="title">SurfMusic</span><span class="linkdiv-dash"> โ€” </span><span class="desc">International radio listings.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="modarchive.html" title="The MOD Archive"><span class="title">The MOD Archive</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Tracker audio file collection.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="tunein.html" title="TuneIn"><span class="title">TuneIn</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Radio and Podcast directory.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="ubuntuusersm.html" title="UbuntuUsers"><span class="title">UbuntuUsers</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Wiki list of radio stations</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="xiph.html" title="Xiph.org"><span class="title">Xiph.org</span><span class="linkdiv-dash"> โ€” </span><span class="desc">ICEcast radio directory.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="youtube.html" title="Youtube"><span class="title">Youtube</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Youtube music/video listings.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="filtermusic.html" title="filtermusic"><span class="title">filtermusic</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Selection of the best radio stations</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="icast.html" title="iCast.io"><span class="title">iCast.io</span><span class="linkdiv-dash"> โ€” </span><span class="desc">iCast (removed)</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="itunes.html" title="iTunes Radios via RS"><span class="title">iTunes Radios via RS</span><span class="linkdiv-dash"> โ€” </span><span class="desc">iTunes (RoliSoft Playlists)</span></a></div>
</div></div></div></div></div>
</div></div>
<div id="homepage" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Channel service homepage</span></h2></div>
<div class="region"><div class="contents"><p class="p">You can dobule click the channel tab to visit the channel/directory homepage.
	Alternatively there is an entry in the <span class="gui">Channel</span> menu.</p></div></div>







<







46
47
48
49
50
51
52

53
54
55
56
57
58
59
<div class="linkdiv "><a class="linkdiv" href="surfmusik.html" title="SurfMusic"><span class="title">SurfMusic</span><span class="linkdiv-dash"> โ€” </span><span class="desc">International radio listings.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="modarchive.html" title="The MOD Archive"><span class="title">The MOD Archive</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Tracker audio file collection.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="tunein.html" title="TuneIn"><span class="title">TuneIn</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Radio and Podcast directory.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="ubuntuusersm.html" title="UbuntuUsers"><span class="title">UbuntuUsers</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Wiki list of radio stations</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="xiph.html" title="Xiph.org"><span class="title">Xiph.org</span><span class="linkdiv-dash"> โ€” </span><span class="desc">ICEcast radio directory.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="youtube.html" title="Youtube"><span class="title">Youtube</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Youtube music/video listings.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="filtermusic.html" title="filtermusic"><span class="title">filtermusic</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Selection of the best radio stations</span></a></div>

<div class="linkdiv "><a class="linkdiv" href="itunes.html" title="iTunes Radios via RS"><span class="title">iTunes Radios via RS</span><span class="linkdiv-dash"> โ€” </span><span class="desc">iTunes (RoliSoft Playlists)</span></a></div>
</div></div></div></div></div>
</div></div>
<div id="homepage" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Channel service homepage</span></h2></div>
<div class="region"><div class="contents"><p class="p">You can dobule click the channel tab to visit the channel/directory homepage.
	Alternatively there is an entry in the <span class="gui">Channel</span> menu.</p></div></div>

Modified help/html/configuration.html from [1a042d5b7d] to [390f4e28ed].

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
...
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
...
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155




156
157
158
159
160
161
162
<div class="region">
<div class="contents">
<p class="p">
There are various options for streamtuner2, available under <span class="guiseq"><span class="gui">Edit</span>ย โ–ธ <span class="gui">Preferences</span></span> or via <span class="key"><kbd>F12</kbd></span>.
</p>
<p class="p"><span class="media"><span class="media media-image"><img src="img/configtabs.png" class="media media-inline" alt=""></span></span></p>
<div class="terms"><div class="inner">
<div class="title title-terms"><h2><span class="title">It's separated into different sections/tabs.</span></h2></div>
<div class="region"><dl class="terms">
<dt class="terms">๐Ÿ”Š Player</dt>
<dd class="terms"><p class="p">Lists audio formats and the audio player applications, or recording tools below.
    It's a map of file-types to applications. Double click an entry to edit it.</p></dd>
<dt class="terms">โ˜‘ Options</dt>
<dd class="terms"><p class="p">Influences the display of all stream/station lists, and contains some
    behaviour and system settings.</p></dd>
<dt class="terms">๐Ÿ“ป Channel Plugins</dt>
<dd class="terms"><p class="p">Every channel tab can have specific options. These are configured here.
    Also you can disable channels you don't need.</p></dd>
<dt class="terms">๐Ÿ”Œ Feature Plugins</dt>
<dd class="terms"><p class="p">Another class of plugins enables internal functions, or adds extra menu
    entries, or configuration options.</p></dd>
<dt class="terms">๐Ÿ“ฆ Add</dt>
<dd class="terms"><p class="p">The <span class="link"><a href="pluginmanager2.html" title="Plugin Manager 2">Plugin Manager 2</a></span> adds another
    tab for updating or installing new plugins.</p></dd>
</dl></div>
</div></div>
</div>
<div id="apps" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Player application settings</span></h2></div>
<div class="region"><div class="contents">
<p class="p">MIME types are categorzied identifiers for file types. <span class="var">Audio/mpeg</span> for
    example represents MP3 files, and <span class="var">audio/ogg</span> means just OGG.  And the player
    setting dialog simply associates an audio type with a playback application:</p>
<div class="table"><div class="inner"><div class="region"><table class="table">
<thead><tr>
<td><p class="p">Format</p></td>
<td style="border-left-style: solid;"><p class="p">Application</p></td>
</tr></thead>
<tr>
................................................................................
</tr>
<tr class="shade">
<td style="border-top-style: solid;"><p class="p"><span class="var">video/youtube</span></p></td>
<td style="border-top-style: solid;border-left-style: solid;"><p class="p"><span class="cmd">xterm -e "youtube-dl %srv"</span></p></td>
</tr>
</table></div></div></div>
<p class="p">To define a target directory, you can often add commandline arguments to each. Also it's typically
    helpful to leave the xterm prefix on, so you can follow the processing state. (Alternatively to
    xterm there is x-terminal-emulator, or rxvt, gnome-terminal, xfce4-terminal, etc.)</p>
<div class="links topiclinks"><div class="inner"><div class="region"><div class="linkdiv "><a class="linkdiv" href="recording.html" title="Recording"><span class="title">Recording</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Save radio songs as MP3 files via streamripper.</span></a></div></div></div></div>
</div></div>
</div></div>
<div id="gui" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Display/GUI options</span></h2></div>
<div class="region"><div class="contents">
<div class="terms"><div class="inner">
................................................................................
<dt class="terms">Prefer HTML traversing (PyQuery) over regex</dt>
<dd class="terms"><p class="p">Some channels provide proper APIs to fetch station lists. Others are just websites that
      require scraping listings out. Most channel tabs provide two alternative methods for that.
      The DOM/HTML selection method is sometimes slower, but more reliable. As fallback streamtuner2
      plugins often use a regex to match text. Occassionally the regex method is surprisingly more exact,
      because directory services often use frightful unstructured HTML. If available, both methods
      are tried. You can influence the order with this setting, and thus speed it up.</p></dd>
<dt class="terms">[<span class="input">250</span>] Limit stream number</dt>
<dd class="terms"><p class="p"> Constraints the length of station lists per category.
      The number of stations option is not honored by all channel plugins. Often it's not possible to
      load more or fewer station entries. Some plugins have own settings (in the 'Plugins' section) even.
      For the major plugins this however limits how many scrollable entries appear in the stream lists.</p></dd>
<dt class="terms">Retain deleted stations</dt>
<dd class="terms"><p class="p">When enabled, keeps old station entries when
      updating/reloading a category/genre.  Services often forget stations or throws them out when inavailable.
      With this option enabled, these entries are kept in streamtuner2 as strikethrough entries (often
      at the end of the list).</p></dd>
<dt class="terms">Update favouries from freshened URLs</dt>
<dd class="terms"><p class="p">Streaming URLs in bookmarked stations get renewed on category reloads/updates. This isn't
      very reliable, as often station titles change together with the streaming URLs.</p></dd>




</dl></div>
</div></div>
<div class="terms"><div class="inner">
<div class="title title-terms"><h3><span class="title">Playlist</span></h3></div>
<div class="region"><dl class="terms">
<dt class="terms">Reuse .m3u/.pls files</dt>
<dd class="terms"><p class="p">When converting online station playlists,







|


|
<




|
|


|









|
|







 







|
<







 







|












>
>
>
>







14
15
16
17
18
19
20
21
22
23
24

25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
..
99
100
101
102
103
104
105
106

107
108
109
110
111
112
113
...
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
<div class="region">
<div class="contents">
<p class="p">
There are various options for streamtuner2, available under <span class="guiseq"><span class="gui">Edit</span>ย โ–ธ <span class="gui">Preferences</span></span> or via <span class="key"><kbd>F12</kbd></span>.
</p>
<p class="p"><span class="media"><span class="media media-image"><img src="img/configtabs.png" class="media media-inline" alt=""></span></span></p>
<div class="terms"><div class="inner">
<div class="title title-terms"><h2><span class="title">It's grouped into:</span></h2></div>
<div class="region"><dl class="terms">
<dt class="terms">๐Ÿ”Š Player</dt>
<dd class="terms"><p class="p">Associates media formats to audio player applications or recording tools.</p></dd>

<dt class="terms">โ˜‘ Options</dt>
<dd class="terms"><p class="p">Influences the display of all stream/station lists, and contains some
    behaviour and system settings.</p></dd>
<dt class="terms">๐Ÿ“ป Channel Plugins</dt>
<dd class="terms"><p class="p">Allows to enable or disable channel tabs. Each can have specific
    options, which can be configured here.</p></dd>
<dt class="terms">๐Ÿ”Œ Feature Plugins</dt>
<dd class="terms"><p class="p">Another class of plugins enables internal functions, or adds extra menu
    entries, or further configuration options.</p></dd>
<dt class="terms">๐Ÿ“ฆ Add</dt>
<dd class="terms"><p class="p">The <span class="link"><a href="pluginmanager2.html" title="Plugin Manager 2">Plugin Manager 2</a></span> adds another
    tab for updating or installing new plugins.</p></dd>
</dl></div>
</div></div>
</div>
<div id="apps" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Player application settings</span></h2></div>
<div class="region"><div class="contents">
<p class="p">MIME types are categorized identifiers for file types. <span class="var">Audio/mpeg</span> for
    example represents MP3 files, and <span class="var">audio/ogg</span> means OGG Vorbis.  And the player
    setting dialog simply associates an audio type with a playback application:</p>
<div class="table"><div class="inner"><div class="region"><table class="table">
<thead><tr>
<td><p class="p">Format</p></td>
<td style="border-left-style: solid;"><p class="p">Application</p></td>
</tr></thead>
<tr>
................................................................................
</tr>
<tr class="shade">
<td style="border-top-style: solid;"><p class="p"><span class="var">video/youtube</span></p></td>
<td style="border-top-style: solid;border-left-style: solid;"><p class="p"><span class="cmd">xterm -e "youtube-dl %srv"</span></p></td>
</tr>
</table></div></div></div>
<p class="p">To define a target directory, you can often add commandline arguments to each. Also it's typically
    helpful to leave the xterm prefix on, so you can follow the processing state.</p>

<div class="links topiclinks"><div class="inner"><div class="region"><div class="linkdiv "><a class="linkdiv" href="recording.html" title="Recording"><span class="title">Recording</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Save radio songs as MP3 files via streamripper.</span></a></div></div></div></div>
</div></div>
</div></div>
<div id="gui" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Display/GUI options</span></h2></div>
<div class="region"><div class="contents">
<div class="terms"><div class="inner">
................................................................................
<dt class="terms">Prefer HTML traversing (PyQuery) over regex</dt>
<dd class="terms"><p class="p">Some channels provide proper APIs to fetch station lists. Others are just websites that
      require scraping listings out. Most channel tabs provide two alternative methods for that.
      The DOM/HTML selection method is sometimes slower, but more reliable. As fallback streamtuner2
      plugins often use a regex to match text. Occassionally the regex method is surprisingly more exact,
      because directory services often use frightful unstructured HTML. If available, both methods
      are tried. You can influence the order with this setting, and thus speed it up.</p></dd>
<dt class="terms">[<span class="input">500</span>] Limit stream number</dt>
<dd class="terms"><p class="p"> Constraints the length of station lists per category.
      The number of stations option is not honored by all channel plugins. Often it's not possible to
      load more or fewer station entries. Some plugins have own settings (in the 'Plugins' section) even.
      For the major plugins this however limits how many scrollable entries appear in the stream lists.</p></dd>
<dt class="terms">Retain deleted stations</dt>
<dd class="terms"><p class="p">When enabled, keeps old station entries when
      updating/reloading a category/genre.  Services often forget stations or throws them out when inavailable.
      With this option enabled, these entries are kept in streamtuner2 as strikethrough entries (often
      at the end of the list).</p></dd>
<dt class="terms">Update favouries from freshened URLs</dt>
<dd class="terms"><p class="p">Streaming URLs in bookmarked stations get renewed on category reloads/updates. This isn't
      very reliable, as often station titles change together with the streaming URLs.</p></dd>
<dt class="terms">Save station lists after updates</dt>
<dd class="terms"><p class="p">After reloading (<span class="key"><kbd>F5</kbd></span>) the updated station lists are
      autoamtically saved. For favicon updates or drag and drop events this
      only happens automatically when this option is set.</p></dd>
</dl></div>
</div></div>
<div class="terms"><div class="inner">
<div class="title title-terms"><h3><span class="title">Playlist</span></h3></div>
<div class="region"><dl class="terms">
<dt class="terms">Reuse .m3u/.pls files</dt>
<dd class="terms"><p class="p">When converting online station playlists,

Modified help/html/dirble.html from [eb6889438c] to [679737f4dc].

23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<p class="p">Dirble.com is another radio station directory, made up of
	user-contributed content, and automatic streaming server polling.</p>
<p class="p">It provides a JSON API, which as of v2 has a lot of unneeded meta
	information and internal ids. But it's actually nicer to scan, and
	contains even station homepages now.</p>
<div class="note" title="Note"><div class="inner"><div class="region"><div class="contents"><p class="p">The config option for a custom API key is perhaps
        redundant. Should streamtuner2 -D however reveal an error, you
        can configure your own account there.</p></div></div></div></div>
</div>
<div class="sect sect-links" role="navigation">
<div class="hgroup"></div>
<div class="contents"><div class="links guidelinks"><div class="inner">
<div class="title"><h2><span class="title">More Information</span></h2></div>
<div class="region"><ul>
<li class="links "><a href="channels.html#list" title="Available channels">Available channels</a></li>







|







23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<p class="p">Dirble.com is another radio station directory, made up of
	user-contributed content, and automatic streaming server polling.</p>
<p class="p">It provides a JSON API, which as of v2 has a lot of unneeded meta
	information and internal ids. But it's actually nicer to scan, and
	contains even station homepages now.</p>
<div class="note" title="Note"><div class="inner"><div class="region"><div class="contents"><p class="p">The config option for a custom API key is perhaps
        redundant. Should streamtuner2 -D however reveal an error, you
        can however configure your own account there.</p></div></div></div></div>
</div>
<div class="sect sect-links" role="navigation">
<div class="hgroup"></div>
<div class="contents"><div class="links guidelinks"><div class="inner">
<div class="title"><h2><span class="title">More Information</span></h2></div>
<div class="region"><ul>
<li class="links "><a href="channels.html#list" title="Available channels">Available channels</a></li>

Modified help/html/dragndrop.html from [3bc0a5d01f] to [c6fcc988d0].

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
	stream entry, then drag it out to the desktop, file manager or
	directly into VLC or any running music player.  That'll usually
	copy a stream/station address directly.</p>
<p class="p">Now it's not guaranteed to work with all applications or file
	managers, as X11/Gtk DND support is somewhat arcane and wonky.
	You may specifically have to adapt the default export format for
	this. Generally a XSPF or PLS file gets created for file managers.
	While VLC is one of the few applications that understand direct
	playlist URLs or literal M3U/PLS payloads even.</p>
</div>
<div id="import" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Importing</span></h2></div>
<div class="region"><div class="contents">
<p class="p">Playlist importing also works mostly. Here the action module
	takes care to unpack PLS, XPSF or M3U files and a few other
	formats. If you drag in streams/playlists from other applications,
	it'll usually be expanded.</p>
<p class="p">Take note that Streamtuner2 is not intended as playlist manager
	though. It will only accept radio streaming lists and discard
	local MP3/Ogg files.</p>
<p class="p">The import capabilities also allow to move a station entry
	from one of the channel tabs into your bookmarks list. Simply drag
	an entry over the "bookmarks" notebook tab then further along into
	the favourite list. - While this also works the other way round,
	it doesn't make sense to add bookmarks to Shoutcast/Xiph/etc.
	Because when their lists get refreshed (<span class="key"><kbd>F5</kbd></span>) all custom
	entries are usually discarded.</p>
</div></div>
</div></div>
<div id="configuration" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Export format configuration</span></h2></div>
<div class="region"><div class="contents">
<p class="p">Use <span class="key"><kbd>F12</kbd></span> and change the DND export format. Again
	PLS is most universal, XSPF most complete, but other formats







|









|

|






|







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
	stream entry, then drag it out to the desktop, file manager or
	directly into VLC or any running music player.  That'll usually
	copy a stream/station address directly.</p>
<p class="p">Now it's not guaranteed to work with all applications or file
	managers, as X11/Gtk DND support is somewhat arcane and wonky.
	You may specifically have to adapt the default export format for
	this. Generally a XSPF or PLS file gets created for file managers.
	While VLC is one of the few applications that understands direct
	playlist URLs or literal M3U/PLS payloads even.</p>
</div>
<div id="import" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Importing</span></h2></div>
<div class="region"><div class="contents">
<p class="p">Playlist importing also works mostly. Here the action module
	takes care to unpack PLS, XPSF or M3U files and a few other
	formats. If you drag in streams/playlists from other applications,
	it'll usually be expanded.</p>
<div class="note note-warning" title="Warning"><div class="inner"><div class="region"><div class="contents"><p class="p">Take note that Streamtuner2 is not intended as playlist manager
	though. It will only accept radio streaming lists and discard
	local MP3/Ogg files.</p></div></div></div></div>
<p class="p">The import capabilities also allow to move a station entry
	from one of the channel tabs into your bookmarks list. Simply drag
	an entry over the "bookmarks" notebook tab then further along into
	the favourite list. - While this also works the other way round,
	it doesn't make sense to add bookmarks to Shoutcast/Xiph/etc.
	Because when their lists get refreshed (<span class="key"><kbd>F5</kbd></span>) all custom
	entries are usually dropped.</p>
</div></div>
</div></div>
<div id="configuration" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Export format configuration</span></h2></div>
<div class="region"><div class="contents">
<p class="p">Use <span class="key"><kbd>F12</kbd></span> and change the DND export format. Again
	PLS is most universal, XSPF most complete, but other formats

Modified help/html/index.html from [fdcf65fb91] to [00b071231d].

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<div class="linkdiv "><a class="linkdiv" href="surfmusik.html" title="SurfMusic"><span class="title">SurfMusic</span><span class="linkdiv-dash"> โ€” </span><span class="desc">International radio listings.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="modarchive.html" title="The MOD Archive"><span class="title">The MOD Archive</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Tracker audio file collection.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="tunein.html" title="TuneIn"><span class="title">TuneIn</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Radio and Podcast directory.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="ubuntuusersm.html" title="UbuntuUsers"><span class="title">UbuntuUsers</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Wiki list of radio stations</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="xiph.html" title="Xiph.org"><span class="title">Xiph.org</span><span class="linkdiv-dash"> โ€” </span><span class="desc">ICEcast radio directory.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="youtube.html" title="Youtube"><span class="title">Youtube</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Youtube music/video listings.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="filtermusic.html" title="filtermusic"><span class="title">filtermusic</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Selection of the best radio stations</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="icast.html" title="iCast.io"><span class="title">iCast.io</span><span class="linkdiv-dash"> โ€” </span><span class="desc">iCast (removed)</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="itunes.html" title="iTunes Radios via RS"><span class="title">iTunes Radios via RS</span><span class="linkdiv-dash"> โ€” </span><span class="desc">iTunes (RoliSoft Playlists)</span></a></div>
</div>
</div></div></div></div></div>
</div></div>
<div id="functions" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Functions</span></h2></div>
<div class="region">







<







43
44
45
46
47
48
49

50
51
52
53
54
55
56
<div class="linkdiv "><a class="linkdiv" href="surfmusik.html" title="SurfMusic"><span class="title">SurfMusic</span><span class="linkdiv-dash"> โ€” </span><span class="desc">International radio listings.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="modarchive.html" title="The MOD Archive"><span class="title">The MOD Archive</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Tracker audio file collection.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="tunein.html" title="TuneIn"><span class="title">TuneIn</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Radio and Podcast directory.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="ubuntuusersm.html" title="UbuntuUsers"><span class="title">UbuntuUsers</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Wiki list of radio stations</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="xiph.html" title="Xiph.org"><span class="title">Xiph.org</span><span class="linkdiv-dash"> โ€” </span><span class="desc">ICEcast radio directory.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="youtube.html" title="Youtube"><span class="title">Youtube</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Youtube music/video listings.</span></a></div>
<div class="linkdiv "><a class="linkdiv" href="filtermusic.html" title="filtermusic"><span class="title">filtermusic</span><span class="linkdiv-dash"> โ€” </span><span class="desc">Selection of the best radio stations</span></a></div>

<div class="linkdiv "><a class="linkdiv" href="itunes.html" title="iTunes Radios via RS"><span class="title">iTunes Radios via RS</span><span class="linkdiv-dash"> โ€” </span><span class="desc">iTunes (RoliSoft Playlists)</span></a></div>
</div>
</div></div></div></div></div>
</div></div>
<div id="functions" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">Functions</span></h2></div>
<div class="region">

Modified help/html/recording.html from [ff6bd6ba77] to [373c27967f].

54
55
56
57
58
59
60
61


62
63
64
65
66
67
68
<div class="list"><div class="inner"><div class="region"><ul class="list"><li class="list"><p class="p"><span class="cmd">xterm -e "streamripper -A -s 3600 -d ~/Music/ %srv"</span></p></li></ul></div></div></div>
</li>
<li class="steps">
<p class="p">Pretend to be an audio player (in case recording is blocked):</p>
<div class="list"><div class="inner"><div class="region"><ul class="list"><li class="list"><p class="p"><span class="cmd">streamripper -u 'WinampMPEG/5.0' %srv</span></p></li></ul></div></div></div>
</li>
</ol></div></div></div>
<p class="p">Whenever you leave out the <span class="cmd">xterm</span> prefix, it runs silently in the background.</p>


<p class="p">See the streamripper(1) man page or its
<span class="link"><a href="http://streamripper.sourceforge.net/faq.php" title="http://streamripper.sourceforge.net/faq.php">FAQ</a></span> for more tips.</p>
</div></div>
</div></div>
<div id="" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">fIcy/fPls</span></h2></div>
<div class="region"><div class="contents">







|
>
>







54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<div class="list"><div class="inner"><div class="region"><ul class="list"><li class="list"><p class="p"><span class="cmd">xterm -e "streamripper -A -s 3600 -d ~/Music/ %srv"</span></p></li></ul></div></div></div>
</li>
<li class="steps">
<p class="p">Pretend to be an audio player (in case recording is blocked):</p>
<div class="list"><div class="inner"><div class="region"><ul class="list"><li class="list"><p class="p"><span class="cmd">streamripper -u 'WinampMPEG/5.0' %srv</span></p></li></ul></div></div></div>
</li>
</ol></div></div></div>
<p class="p">Whenever you leave out the <span class="cmd">xterm</span> prefix, it runs silently in the background.
Common xterm alternatives are <span class="cmd">x-terminal-emulator</span>, or <span class="cmd">rxvt</span>,
<span class="cmd">gnome-terminal</span>, and <span class="cmd">xfce4-terminal</span> etc.</p>
<p class="p">See the streamripper(1) man page or its
<span class="link"><a href="http://streamripper.sourceforge.net/faq.php" title="http://streamripper.sourceforge.net/faq.php">FAQ</a></span> for more tips.</p>
</div></div>
</div></div>
<div id="" class="sect"><div class="inner">
<div class="hgroup"><h2 class="title"><span class="title">fIcy/fPls</span></h2></div>
<div class="region"><div class="contents">

Modified help/html/xiph.html from [7ba00185db] to [475d58c6ed].

78
79
80
81
82
83
84


85
86
87
88
89
90
91
        something which Xiph doesn't approve of.  But the drawbacks of their
        alternative offerings are too severe and user-unfriendly; which is
        why there's this raw HTML extraction mode now.</p>
<p class="p">The website listings contain full station homepages and a few
        more extras.  In this mode we can even acceess the XSPF playlist
        formats directly.  Both, the server search function, or browsing by
        audio/video format are supported.  </p>


</dd>
</dl></div></div></div>
</dd>
</dl></div></div></div></div></div>
</div></div>
<div class="sect sect-links" role="navigation">
<div class="hgroup"></div>







>
>







78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
        something which Xiph doesn't approve of.  But the drawbacks of their
        alternative offerings are too severe and user-unfriendly; which is
        why there's this raw HTML extraction mode now.</p>
<p class="p">The website listings contain full station homepages and a few
        more extras.  In this mode we can even acceess the XSPF playlist
        formats directly.  Both, the server search function, or browsing by
        audio/video format are supported.  </p>
<div class="note" title="Note"><div class="inner"><div class="region"><div class="contents"><p class="p">A miximum of 100 entries get fetched in this mode however
        (which is 5 pages รก 20 entries).</p></div></div></div></div>
</dd>
</dl></div></div></div>
</dd>
</dl></div></div></div></div></div>
</div></div>
<div class="sect sect-links" role="navigation">
<div class="hgroup"></div>