Index: channels/jamendo.py ================================================================== --- channels/jamendo.py +++ channels/jamendo.py @@ -51,11 +51,11 @@ version = 0.3 has_search = True base = "http://www.jamendo.com/en/" listformat = "url/http" - api = "http://api.jamendo.com/v3.0/" + api_base = "http://api.jamendo.com/v3.0/" cid = "49daa4f5" categories = ["radios"] titles = dict( title="Title", playing="Album/Artist/User", bitrate=False, listeners=False ) @@ -99,14 +99,12 @@ def update_streams(self, cat, search="", force=0): entries = [] fmt = self.stream_mime(conf.jamendo_stream_format) - # return a static list for now + # Static list of Radios if cat == "radios": - - entries = [] for radio in ["BestOf", "Pop", "Rock", "Lounge", "Electro", "HipHop", "World", "Jazz", "Metal", "Soundtrack", "Relaxation", "Classical"]: entries.append({ "genre": radio, "title": radio, "url": "http://streaming.radionomy.com/Jam" + radio, @@ -114,102 +112,99 @@ "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios", "img": "http://imgjam1.jamendo.com/new_jamendo_radios/%s30.jpg" % radio.lower(), }) - # playlist - elif cat == "playlists": - for offset in self.retrieval_offsets(): - data = http.get(self.api + cat, params = { - "client_id": self.cid, - "format": "json", - "audioformat": conf.jamendo_stream_format, - "limit": "200", - "offset": offset, - "order": "creationdate_desc", - }) - for e in json.loads(data)["results"]: - entries.append({ - "title": e["name"], - "playing": e["user_name"], - "homepage": e["shareurl"], - #"url": "http://api.jamendo.com/v3.0/playlists/file?client_id=%s&id=%s" % (self.cid, e["id"]), - "url": "http://api.jamendo.com/get2/stream/track/xspf/?playlist_id=%s&n=all&order=random&from=app-%s" % (e["id"], self.cid), - "format": "application/xspf+xml", - }) - self.parent.status(float(offset)/float(1000)) - - # albums - elif cat in ["albums", "newest"]: - for offset in self.retrieval_offsets(): - data = http.get(self.api + "albums/musicinfo", params = { - "client_id": self.cid, - "format": "json", - "audioformat": conf.jamendo_stream_format, - "limit": "200", - "offset": offset, - "imagesize": "50", - "order": ("popularity_week" if cat == "albums" else "releasedate_desc"), - }) - for e in json.loads(data)["results"]: - entries.append({ - "genre": " ".join(e["musicinfo"]["tags"]), - "title": e["name"], - "playing": e["artist_name"], - "img": e["image"], - "homepage": e["shareurl"], - #"url": "http://api.jamendo.com/v3.0/playlists/file?client_id=%s&id=%s" % (self.cid, e["id"]), - "url": "http://api.jamendo.com/get2/stream/track/xspf/?album_id=%s&streamencoding=ogg2&n=all&from=app-%s" % (e["id"], self.cid), - "format": "application/xspf+xml", - }) - self.parent.status(float(offset)/float(1000)) - - # genre list - else: - for offset in self.retrieval_offsets(): - data = http.get(self.api + "tracks", params={ - "client_id": self.cid, - ("fuzzytags" if cat else "search"): (search if search else cat), - "format": "json", - "audioformat": conf.jamendo_stream_format, - "limit": "200", - "offset": offset, - "imagesize": conf.jamendo_image_size, - "order": "popularity_week", - "include": "musicinfo", - }) - for e in json.loads(data)["results"]: - entries.append({ - "lang": e["musicinfo"]["lang"], - "genre": " ".join(e["musicinfo"]["tags"]["genres"]), - "extra": ", ".join(e["musicinfo"]["tags"]["vartags"]), - "title": e["name"], - "playing": e["album_name"] + " / " + e["artist_name"], - "img": e["album_image"], - "homepage": e["shareurl"], - #"url": e["audio"], - "url": "http://storage-new.newjamendo.com/?trackid=%s&format=ogg2&u=0&from=app-%s" % (e["id"], self.cid), - "format": fmt, - }) - self.parent.status(float(offset)/float(1000)) + # Playlist + elif cat == "playlists": + for e in self.api(method = cat, order = "creationdate_desc"): + entries.append({ + "title": e["name"], + "playing": e["user_name"], + "homepage": e["shareurl"], + #"url": "http://api.jamendo.com/v3.0/playlists/file?client_id=%s&id=%s" % (self.cid, e["id"]), + "url": "http://api.jamendo.com/get2/stream/track/xspf/?playlist_id=%s&n=all&order=random&from=app-%s" % (e["id"], self.cid), + "format": "application/xspf+xml", + }) + + # Albums + elif cat in ["albums", "newest"]: + if cat == "albums": + order = "popularity_week" + else: + order = "releasedate_desc" + for e in self.api(method = "albums/musicinfo", order = order, include = "musicinfo"): + entries.append({ + "genre": " ".join(e["musicinfo"]["tags"]), + "title": e["name"], + "playing": e["artist_name"], + "img": e["image"], + "homepage": e["shareurl"], + #"url": "http://api.jamendo.com/v3.0/playlists/file?client_id=%s&id=%s" % (self.cid, e["id"]), + "url": "http://api.jamendo.com/get2/stream/track/xspf/?album_id=%s&streamencoding=ogg2&n=all&from=app-%s" % (e["id"], self.cid), + "format": "application/xspf+xml", + }) + + # Genre list, or Search + else: + if cat: + data = self.api(method = "tracks", order = "popularity_week", include = "musicinfo", fuzzytags = cat, audioformat = conf.jamendo_stream_format) + elif search: + data = self.api(method = "tracks", order = "popularity_week", include = "musicinfo", search = search, audioformat = conf.jamendo_stream_format) + else: + data = [] + for e in data: + entries.append({ + "lang": e["musicinfo"]["lang"], + "genre": " ".join(e["musicinfo"]["tags"]["genres"]), + "extra": ", ".join(e["musicinfo"]["tags"]["vartags"]), + "title": e["name"], + "playing": e["album_name"] + " / " + e["artist_name"], + "img": e["album_image"], + "homepage": e["shareurl"], + #"url": e["audio"], + "url": "http://storage-new.newjamendo.com/?trackid=%s&format=ogg2&u=0&from=app-%s" % (e["id"], self.cid), + "format": fmt, + }) # done return entries - # offset list [0, 200, 400, 600, ...] according to max retrieval count - def retrieval_offsets(self): - return [200*1 for i in range(0, int(conf.jamendo_count))] + # Collect data from Jamenda API + def api(self, method, **params): + r = [] + max = 200 * int(conf.jamendo_count) + params = dict( + list({ + "client_id": self.cid, + "format": "json", + "audioformat": "mp32", + "imagesize": conf.jamendo_image_size, + "offset": 0, + "limit": 200, + }.items()) + list(params.items()) + ) + while (params["offset"] < max) and (len(r) % 200 == 0): + data = json.loads(http.get(self.api_base + method, params)) + if data and "results" in data: + r += data["results"] + else: + return r + params["offset"] += 200; + self.parent.status(float(params["offset"])/float(max+17)) + __print__(dbg.PROC, params["offset"], max, len(r)) + return r # audio/* def stream_mime(self, name): map = { "ogg": "audio/ogg", "ogg2": "audio/ogg", - "mp3": "audio/mpeg", "mp31": "audio/mpeg", "mp33": "audio/mpeg", + "mp3": "audio/mpeg", "mp31": "audio/mpeg", "mp32": "audio/mpeg", "flac": "audio/flac" } if name in map: return map[name] else: return map["mp3"]