--[[ Copyright © 2010 VideoLAN and AUTHORS Authors: Fabio Ritrovato Rémi Duraffort Gian Marco Sibilla This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. --]] local xml = nil local playlist_tracks_url = "https://api.jamendo.com/v3.0/playlists/tracks/?client_id=3dce8b55&id=%s&track_type=single+albumtrack&order=track_position_desc&format=xml" local track_jamendo_url = "https://www.jamendo.com/track/%s" local album_jamendo_url = "https://www.jamendo.com/album/%s" local playlist_max_tracks = 100 function descriptor() return { title = "Jamendo Selections", capabilities = {} } end function activate() main() end function main() lazy_load_xml() add_playlist( "Jamendo's Finest - Trending tracks", { "222810" } ) add_playlist( "Jamendo's Trending Lounge/Relaxation Tracks", { "211938", "213936" } ) add_playlist( "Jamendo's Trending Classical Tracks", { "214065" } ) add_playlist( "Jamendo's Trending Electronic Tracks", { "211555" } ) add_playlist( "Jamendo's Trending Jazz Tracks", { "211407" } ) add_playlist( "Jamendo's Trending Pop Tracks", { "211032" } ) add_playlist( "Jamendo's Trending Hip-Hop Tracks", { "211404" } ) add_playlist( "Jamendo's Trending Rock Tracks", { "211064" } ) add_playlist( "Jamendo's Trending Songwriter Tracks", { "211066" } ) add_playlist( "Jamendo's Trending World Tracks", { "212188" } ) add_playlist( "Jamendo's Trending Metal Tracks", { "226459" } ) add_playlist( "Jamendo's Trending Soundtracks", { "226468" } ) end function lazy_load_xml() if xml ~= nil then return nil end xml = require("simplexml") end function add_playlist( node_title, ids ) local node = vlc.sd.add_node( { title=node_title } ) local subitems = {} -- Used to detect duplicated local added = {} -- Compute the subitem position increment to interpolate different playlists tracks local position_increment = #ids for start, id in ipairs(ids) do -- Compute starting position according to index in list local position = start - 1 -- Build current playlist URL local url = string.format( playlist_tracks_url, id ) -- Request & parse URL local playlist = parse_xml( url ) if playlist ~= nil then log( "Playlist for '" .. node_title .. "': " .. playlist.children_map["name"][1].children[1] ) -- Iterate through found tracks for index, track in ipairs( playlist.children_map["tracks"][1].children ) do local track_id = track.children_map["id"][1].children[1] log( "Processing track #" .. index .. ": " .. track_id ) -- Create the item to be added to current node local item = { path = track.children_map["audio"][1].children[1], title = track.children_map["artist_name"][1].children[1] .. " - " .. track.children_map["name"][1].children[1], name = track.children_map["name"][1].children[1], artist = track.children_map["artist_name"][1].children[1], duration = track.children_map["duration"][1].children[1], url = string.format( track_jamendo_url, track_id ), arturl = track.children_map["image"][1].children[1], meta = { ["Download URL"] = track.children_map["audiodownload"][1].children[1] } } -- Add album title if not a single local album = track.children_map["album_id"][1].children[1] if album ~= nil then item["meta"]["Album URL"] = string.format( album_jamendo_url, album ) end -- Check if track isn't already present if not added[track_id] then -- Append item to subitem table in the correct position subitems[position] = item added[track_id] = true position = position + position_increment end if position > playlist_max_tracks then log( position / position_increment .. " tracks added from playlist " .. id ) break end end else log( "No result for playlist #" .. id ) end end -- Add subitems under node for parsed tracks for _, item in ipairs( subitems ) do node:add_subitem( item ) end end function parse_xml( url ) local response = xml.parse_url( url ) xml.add_name_maps( response ) if response == nil or #response.children < 2 then return nil end if response.children[1].children_map["status"][1].children[1] == "success" and tonumber( response.children[1].children_map["results_count"][1].children[1] ) > 0 then return response.children[2].children[1].children[1] else log( "No result found" ) return nil end end function log( msg ) vlc.msg.dbg( "[JAMENDO] " .. msg ) end