Index: Makefile ================================================================== --- Makefile +++ Makefile @@ -80,6 +80,7 @@ $(INST) help/str*2.1 -t /usr/share/man/man1/ # start locally st2: run run: - ./st2.py + ./st2.py -D + Index: channels/jamendo.py ================================================================== --- channels/jamendo.py +++ channels/jamendo.py @@ -1,16 +1,16 @@ - +# encoding: UTF-8 # api: streamtuner2 # title: Jamendo # description: A license-free music collection and artist hub. # type: channel # version: 2.2 # category: radio # url: http://jamendo.com/ # depends: json # config: -# { name: jamendo_stream_format, value: ogg, type: select, select: "ogg=Ogg Vorbis|mp32=MP3, 192vbr|mp31=MP3, 96kbps|flac=Xiph FLAC", description: "Default streaming audio format. Albums and playlists still return Vorbis mostly for best quality." } +# { name: jamendo_stream_format, value: ogg, type: select, select: "ogg=Ogg Vorbis, 112kbit/s, (HD)|mp32=MP3, 192kbit/s VBR|mp31=MP3, 96kbit/s|flac=Xiph FLAC, ≳600kbit/s", description: "Default streaming audio format for tracks, albums and playlists. Radios are just MP3." } # { name: jamendo_image_size, value: 50, type: select, select: "25=25px|35=35px|50=50px|55=55px|60=60px|65=65px|70=70px|75=75px|85=85px|100=100px|130=130px|150=150px|200=200px|300=300px", description: "Preview images size (height and width) for albums or tracks." } # { name: jamendo_count, value: 1, type:text, description: "How many result sets (200 entries each) to retrieve." } # priority: default # png: # iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwNJREFUOI1lk0toXGUYhp/v/8+ZzDQzmdZMZ8YSkxIQCWTTYsALLsQsUsWFQgJeEJQqIigUvBK0FBQULIJKMEKrFjdOW9xoW1AbRdRCEYtd2GCxxUQbk8bMrTNnzpn//1xMLYLv6l2877N7oBcB0GMY @@ -18,20 +18,24 @@ # 86564UtDkA2Lm/VJYF6mLgXo50X0xNAHy4cK2jk+diVe+1FVVX/57oIuL66qqmriVF23rZ1TjyTLH2YT/WJ4TY+XRgAMKqNgJ41vebbvTgeFneo6Tb567zPmHn+LxdPnCIxHTFrt2CtB/8BWqtVOAewDWgGDmHG0u1VtztjC7SLqRSUkM5Clsd5ibs/7nDzyLd51xfQPq82PKS5SsHfQAEMsIZG3 # khgvJqUqBhFBnSeTS1O/XOPou0eoVxuIsfgkRDsqxBIQgaEVXyIyTVdvGFdbQlD1LibpJDTWG9w8NcHsgRfIb8ni4qbIxhISGU87+Z00BMTuDPhfg47b4X4+oHZ4VxiksxRHi9x3y71M7p5EjAWE6OxBkj/OaSqTgyvJUUIQncuDDx6qRsHHLqpHuR0PW3vbbCj5EYyAAq7dgMVPfHRytt2Kkv7i # 5vAw0n1wZuFvFcDq/kGP5/X1tnm+2aiTLQy59MiE00wZ49okK2fNxsWfgnRfmvJA8D3E98tztTWdBtG9IPuw+tqgI+RRTLin1miNJ3EkRhQFxIRcl8+tgj9EN35VXqrV9G2MPIPvWfgv5I1Bh/pNBOGtYCeALEKM6nlc52uUP+XFDfRpRN7psa/ZeBWSAmJ99qrQGaANeJA3AUjpXhLZ1zsD+g+5 # Cnd9pANrngAAAABJRU5ErkJggg== # -# Now utilizes the Jamendo /v3.0/ API. -# -# Radio station lists are fixed for now. Querying the API twice per station -# doesn't seem overly sensible. -# -# Tracks are queried by genre, where currently there's just a small built-in -# tag list in ST2 -# -# Per default Ogg Vorbis is used as streaming format. Playlists and albums -# return as XSPF playlists. +# Utilizes the Jamendo /v3.0/ API now completely. That means all tracks will +# be available as Ogg Vorbis per default. +# +# Radio stations are a fixed internal list. There's not much point in querying +# the API for them. (They're really just automated playlists, and MP3-only.) +# +# Genre lists for tracks are built-in, but give a good enough overview. There's +# no "related" lookup possibility yet in our station lists. (Might be feasible +# as plugin though, via [load more] button etc...) +# +# Per default Ogg Vorbis is used as streaming format. Track URLs can be played +# back directly. Playlists and albums now require a roundtrip over the action +# module to extract the JAMJson format into pls/m3u/xspf. (The previous v2 API +# retrieval is going to become inaccessible soon.) import re import ahttp as http from config import conf, __print__, dbg @@ -55,11 +59,11 @@ class jamendo (ChannelPlugin): # control flags has_search = True base = "http://www.jamendo.com/en/" - audioformat = "ogg" + audioformat = "audio/ogg" listformat = "srv" api_base = "http://api.jamendo.com/v3.0/" cid = "49daa4f5" categories = [] titles = dict( title="Title", playing="Album/Artist/User", bitrate=False, listeners=False ) @@ -69,10 +73,11 @@ def update_categories(self): self.categories = [ "radios", "playlists", + ["feeds"], # should go below `albums`, but looks nicer here "albums", ["newest"], "tracks", [ "pop", @@ -258,11 +263,12 @@ # retrieve category or search def update_streams(self, cat, search=None): entries = [] - fmt = self.stream_mime(conf.jamendo_stream_format) + fmt = conf.jamendo_stream_format + fmt_mime = self.stream_mime(fmt) # Static list of Radios if cat == "radios": for radio in ["BestOf", "Pop", "Rock", "Lounge", "Electro", "HipHop", "World", "Jazz", "Metal", "Soundtrack", "Relaxation", "Classical"]: entries.append({ @@ -281,19 +287,19 @@ entries.append({ "title": e["name"], "playing": e["user_name"], "homepage": e["shareurl"], "extra": e["creationdate"], - "format": "audio/mpeg", + "format": fmt_mime, #"listformat": "xspf", # deprecated #"url": "http://api.jamendo.com/get2/stream/track/xspf/?playlist_id=%s&n=all&order=random&from=app-%s" % (e["id"], self.cid), #"listformat": "href", # raw ZIP redirect #"url": "http://api.jamendo.com/v3.0/playlists/file?client_id={}&audioformat=mp32&id={}".format(self.cid, e["id"]), #"listformat": "href", # raw ZIP direct #"url": e["zip"], "listformat": "jamj", - "url": "http://api.jamendo.com/v3.0/playlists/tracks?client_id={}&audioformat=mp32&id={}".format(self.cid, e["id"]), + "url": "http://api.jamendo.com/v3.0/playlists/tracks?client_id={}&audioformat={}&id={}".format(self.cid, fmt, e["id"]), }) # Albums elif cat in ["albums", "newest"]: if cat == "albums": @@ -306,23 +312,40 @@ "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": "audio/ogg", - "listformat": "xspf", + #"url": "http://api.jamendo.com/get2/stream/track/xspf/?album_id=%s&streamencoding=ogg2&n=all&from=app-%s" % (e["id"], self.cid), + #"format": "audio/ogg", + #"listformat": "xspf", + "url": "http://api.jamendo.com/v3.0/tracks?client_id={}&audioformat={}&album_id={}".format(self.cid, fmt, e["id"]), + "listformat": "jamj", + "format": fmt_mime, }) + # Feeds (News) + elif cat == "feeds": + for e in self.api(method="feeds", order="date_start_desc", target="notlogged"): + if e.get("joinid") and e.get("subtitle"): + print e + entries.append({ + "genre": e["type"], + "title": e["title"]["en"], + "playing": e["subtitle"]["en"], + "extra": e["text"]["en"], + "homepage": e["link"], + "format": fmt_mime, + "listformat": "jamj", + "url": "http://api.jamendo.com/v3.0/tracks?client_id={}&audioformat={}&album_id={}".format(self.cid, fmt, e["joinid"]), + }) + # Genre list, or Search else: if cat: - data = self.api(method = "tracks", order = "popularity_week", include = "musicinfo", - fuzzytags = cat, audioformat = conf.jamendo_stream_format) + data = self.api(method="tracks", order="popularity_week", include="musicinfo", fuzzytags=cat, audioformat=fmt) elif search: - data = self.api(method = "tracks", order = "popularity_week", include = "musicinfo", - search = search, audioformat = conf.jamendo_stream_format) + data = self.api(method="tracks", order="popularity_week", include="musicinfo", search=search, audioformat=fmt) else: data = [] for e in data: entries.append({ "lang": e["musicinfo"]["lang"], @@ -330,13 +353,13 @@ "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, + "url": e["audio"], + #"url": "http://storage-new.newjamendo.com/?trackid=%s&format=ogg2&u=0&from=app-%s" % (e["id"], self.cid), + "format": fmt_mime, "listformat": "srv", }) # done return entries