1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 |
# api: streamtuner2
# title: RadioTray hook
# description: Allows to bookmark stations to RadioTray/NG
# version: 0.7
# type: feature
# category: bookmarks
# depends: deb:python-dbus, deb:streamtuner2, deb:python-xdg
# config:
# { name: radiotray_map, type: select, value: "group", select: 'root|group|asis|play', description: 'Map genres to default RadioTray groups, or just "root".' }
# url: http://radiotray.sourceforge.net/
# priority: extra
# id: streamtuner2-radiotray
# extraction-method: xml
# pack: radiotray.py
# fpm-prefix: /usr/share/streamtuner2/channels/
#
# Adds a context menu "Add in RadioTray.." for bookmarking.
# Should work with old Radiotray and Radiotray-NG. It will
# now probe for RTNG first and prefers to edit its bookmark
# list.
#
# With the old Radiotry this plugin will fall back to just
# playUrl() until the addRadio remote call is added.
# The patch for radiotray/DbusFacade.py would be:
# +
# + @dbus.service.method('net.sourceforge.radiotray')
# + def addRadio(self, title, url, group="root"):
# + self.dataProvider.addRadio(title, url, group) | >
|
|
>
>
>
>
>
>
>
>
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | # encoding: utf-8
# api: streamtuner2
# title: RadioTray hook
# description: Allows to bookmark stations to RadioTray/NG
# version: 0.8
# type: feature
# category: bookmarks
# depends: deb:python-dbus, deb:streamtuner2, deb:python-xdg
# config:
# { name: radiotray_map, type: select, value: "group", select: 'root|group|category|asis|channel|play', description: 'Map genres to default RadioTray groups, or just "root".' }
# url: http://radiotray.sourceforge.net/
# priority: extra
# id: streamtuner2-radiotray
# extraction-method: xml
# pack: radiotray.py
# fpm-prefix: /usr/share/streamtuner2/channels/
#
# Adds a context menu "Add in RadioTray.." for bookmarking.
# Should work with old Radiotray and Radiotray-NG. It will
# now probe for RTNG first and prefers to edit its bookmark
# list.
#
# The mapping options:
# · "root" is just meant for the old Radiotray format.
# · "group" tries to fit genres onto existing submenus.
# · "category" maps just the channel category.
# · "channel" instead creates `Shoutcast - Rock` entries.
# · "asis" will transfer the literal station genre.
# · "play" is unused.
#
# With the old Radiotry this plugin will fall back to just
# playUrl() until the addRadio remote call is added.
# The patch for radiotray/DbusFacade.py would be:
# +
# + @dbus.service.method('net.sourceforge.radiotray')
# + def addRadio(self, title, url, group="root"):
# + self.dataProvider.addRadio(title, url, group) |
123
124
125
126
127
128
129
130
131
132
133
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197 | return r
# send to
def share(self, *w):
row = self.parent.row()
if row:
group = self.map_group(row.get("genre"))
log.PROC("mapping genre '%s' to RT group '%s'" % (row["genre"], group))
# Radiotray-NG
try:
self.radiotray_ng().add_radio(row["title"], row["url"], group)
except:
try:
cfg = self.radiotray_ng().get_config()
self.save_rtng_json(cfg, row, group)
#time.sleep(0.350)
self.radiotray_ng().reload_bookmarks()
self.parent.status("Exported to Radiotray. You may need to use Preferences > Reload Bookmarks.")
except Exception as e:
log.ERR("radiotray-ng not active", e)
# RadioTray doesn't have an addRadio method yet, so just fall back to play the stream URL
try:
self.radiotray().addRadio(row["title"], row["url"], group)
except:
try:
self.radiotray().playUrl(row["url"])
except:
log.ERR("radiotry-old not active")
pass
# manually add to RTNG bookmarks.json
def save_rtng_json(self, cfg, row, group):
fn = json.loads(cfg)["bookmarks"]
j = json.load(open(fn, "r"))
found = None
# find existing group
for g in j:
if g["group"] == group or g["group"] == row["genre"]:
found = g
break
# else add new group
if not found:
found = {
"group": row["genre"],
"image": None,
"stations": []
}
j.append(found)
# overwrite bookmarks.json
if found:
found["stations"].append({
"image": None,
"name": row["title"],
"url": row["url"]
})
json.dump(j, open(fn, "w"), indent=4)
# match genre to RT groups
def map_group(self, genre):
if not genre or not len(genre) or conf.radiotray_map == "root":
return "root"
if conf.radiotray_map == "asis":
return genre # if RadioTray itself can map arbitrary genres to its folders
if conf.radiotray_map == "play":
raise NotImplementedError("just call .playUrl()")
map = {
"Jazz": "jazz|fusion|swing",
"Latin": "latin|flamenco|tango|salsa|samba",
"Classic Rock": "classic rock",
"Classical": "classic|baroque|opera|symphony|piano|violin",
"Pop / Rock": "top|pop|rock|metal",
"Oldies": "20s|50s|60s|70s|oldie", |
|
<
>
|
|
>
>
>
>
>
| 132
133
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211 | return r
# send to
def share(self, *w):
row = self.parent.row()
if row:
group = self.map_group(row.get("genre", self.parent.channel().current))
log.PROC("mapping genre '%s' to RT group '%s'" % (row["genre"], group))
# Radiotray-NG
try:
self.radiotray_ng().add_radio(row["title"], row["url"], group)
except:
try:
cfg = self.radiotray_ng().get_config()
self.save_rtng_json(cfg, row, group)
self.radiotray_ng().reload_bookmarks()
self.parent.status("Exported to Radiotray. You may need to use Preferences > Reload Bookmarks.")
except Exception as e:
log.ERR("radiotray-ng not active", e)
# RadioTray doesn't have an addRadio method yet, so just fall back to play the stream URL
try:
self.radiotray().addRadio(row["title"], row["url"], group)
except:
try:
self.radiotray().playUrl(row["url"])
except:
log.ERR("radiotry-old not active")
pass
# manually add to RTNG bookmarks.json
def save_rtng_json(self, cfg, row, group):
fn = json.loads(cfg)["bookmarks"]
j = json.load(open(fn, "r"))
found = None
group = {"root": "streamtuner2", "": "streamtuner2"}.get(group, group)
# find existing group
for g in j:
if g["group"] == group:
found = g
break
# else add new group
if not found:
found = {
"group": group,
"image": None,
"stations": []
}
j.append(found)
# overwrite bookmarks.json
if found:
found["stations"].append({
"image": None,
"name": row["title"],
"url": row["url"]
})
json.dump(j, open(fn, "w"), indent=4)
# match genre to RT groups
def map_group(self, genre):
if not genre or not len(genre) or conf.radiotray_map == "root":
return "root"
if conf.radiotray_map == "channel":
return "%s - %s" % (self.parent.current_channel, self.parent.channel().current)
if conf.radiotray_map == "asis":
return genre # if RadioTray itself can map arbitrary genres to its folders
if conf.radiotray_map == "play":
raise NotImplementedError("just call .playUrl()")
if conf.radiotray_map == "category":
genre = self.parent.channel().current
# else "group" - find first fit for station genre
map = {
"Jazz": "jazz|fusion|swing",
"Latin": "latin|flamenco|tango|salsa|samba",
"Classic Rock": "classic rock",
"Classical": "classic|baroque|opera|symphony|piano|violin",
"Pop / Rock": "top|pop|rock|metal",
"Oldies": "20s|50s|60s|70s|oldie", |