1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | # encoding: UTF-8
# api: streamtuner2
# title: Dirble
# description: New open radio station directory.
# version: 0.1
# type: channel
# category: radio
# priority: optional
# documentation: http://dirble.com/developer/api
#
# Provides a nice JSON API, so is easy to support.
#
# However useful station information (homepage, etc.) only
# with extraneous requests. So just for testing as of now.
#
#
import re
import json
from config import conf, dbg, __print__
from channels import * |
|
>
>
>
| 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 | # encoding: UTF-8
# api: streamtuner2
# title: Dirble
# description: New open radio station directory.
# version: 0.2
# type: channel
# category: radio
# priority: optional
# documentation: http://dirble.com/developer/api
#
# Provides a nice JSON API, so is easy to support.
#
# However useful station information (homepage, etc.) only
# with extraneous requests. So just for testing as of now.
#
# Uh, and API is appearently becoming for-pay (two days
# after writing this plugin;). So ST2 users may have to
# request their own Dirble.com key probably.
#
import re
import json
from config import conf, dbg, __print__
from channels import * |
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 | "description": "Also fetch homepages when updating stations. (This is slow, as it requires one extra request for each.)"
}
]
catmap = {}
base = "http://api.dirble.com/v1/%s/apikey/%s/"
cid = "84be582567ff418c9ba94d90d075d7fee178ad60"
# Retrieve cat list and map
def update_categories(self):
self.categories = []
# Main categories
for row in self.api("primaryCategories"):
self.categories.append(row["name"])
self.catmap[row["name"]] = row["id"]
# Request subcats
sub = []
self.categories.append(sub)
for subrow in self.api("childCategories", ["primaryid", str(row["id"])]):
sub.append(subrow["name"])
self.catmap[subrow["name"]] = subrow["id"]
# Just copy over stream URLs and station titles
def update_streams(self, cat, search=None):
if cat:
id = self.catmap.get(cat, 0);
data = self.api("stations", ["id", str(id)])
elif search:
data = self.api("search", ["search", search])
else:
pass
r = []
for e in data:
r.append(dict(
id = e["id"],
genre = str(cat),
status = e["status"],
title = e["name"],
playing = e["country"],
bitrate = self.to_int(e["bitrate"]),
url = e["streamurl"],
homepage = e.get("homepage") or self.get_homepage(e["id"], e["name"]),
format = "audio/mpeg"
))
return r
# Request homepage for stations, else try to deduce Dirble page
def get_homepage(self, id, name):
if conf.dirble_fetch_homepage:
return self.api("station", ["id", str(id)])["website"]
else:
name = re.sub("[^\w\s]+", "", name)
name = re.sub("\s", "-", name)
return "http://dirble.com/station/" + name.lower();
# Patch together
def api(self, method, params=[]):
j = http.get((self.base % (method, self.cid)) + "/".join([str(e) for e in params]))
r = json.loads(j);
return r
|
>
|
>
|
|
>
>
>
>
>
|
|
>
|
>
|
>
|
>
>
| 45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 | "description": "Also fetch homepages when updating stations. (This is slow, as it requires one extra request for each.)"
}
]
catmap = {}
base = "http://api.dirble.com/v1/%s/apikey/%s/"
cid = "84be582567ff418c9ba94d90d075d7fee178ad60"
# Retrieve cat list and map
def update_categories(self):
self.categories = []
# Main categories
for row in self.api("primaryCategories"):
self.categories.append(row["name"])
self.catmap[row["name"]] = row["id"]
# Request subcats
sub = []
self.categories.append(sub)
for subrow in self.api("childCategories", "primaryid", row["id"]):
sub.append(subrow["name"])
self.catmap[subrow["name"]] = subrow["id"]
# Just copy over stream URLs and station titles
def update_streams(self, cat, search=None):
if cat:
id = self.catmap.get(cat, 0);
data = self.api("stations", "id", id)
elif search:
data = self.api("search", "search", search)
else:
pass
r = []
for e in data:
# skip musicgoal (resolve to just a blocking teaser)
if e["streamurl"].find("musicgoal") > 0:
continue
# append dict after renaming fields
r.append(dict(
id = e["id"],
genre = str(cat),
status = e["status"],
title = e["name"],
playing = e["country"],
bitrate = self.to_int(e["bitrate"]),
url = e["streamurl"],
homepage = e.get("homepage") or self.get_homepage(e["id"], e["name"]),
format = "audio/mpeg"
))
return r
# Request homepage for stations, else try to deduce Dirble page
def get_homepage(self, id, name):
if conf.dirble_fetch_homepage:
return self.api("station", "id", id)["website"]
else:
name = re.sub("[^\w\s]+", "", name)
name = re.sub("\s", "-", name)
return "http://dirble.com/station/" + name.lower();
# Patch API url together, send request, decode JSON and whathaveyou
def api(self, *params):
method = params[0]
j = http.get((self.base % (method, self.cid)) + "/".join([str(e) for e in params[1:]]))
try:
r = json.loads(j);
except:
r = []
return r
|