Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
776564bf
Commit
776564bf
authored
Apr 16, 2015
by
Gian Marco Sibilla
Committed by
Jean-Baptiste Kempf
May 19, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Jamendo Lua Service Discovery extension update
Signed-off-by:
Jean-Baptiste Kempf
<
jb@videolan.org
>
parent
d1bc9375
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
103 additions
and
85 deletions
+103
-85
share/lua/sd/jamendo.lua
share/lua/sd/jamendo.lua
+103
-85
No files found.
share/lua/sd/jamendo.lua
View file @
776564bf
...
...
@@ -5,6 +5,7 @@
Authors: Fabio Ritrovato <sephiroth87 at videolan dot org>
Rémi Duraffort <ivoire at videolan dot org>
Gian Marco Sibilla <techos at jamendo dot com>
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
...
...
@@ -21,106 +22,123 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
--]]
require
"simplexml"
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"
}
return
{
title
=
"Jamendo Selections"
,
capabilities
=
{}
}
end
function
activate
()
main
()
end
function
main
()
add_top_tracks
(
"ratingweek_desc"
,
"rock"
,
100
)
add_top_tracks
(
"ratingweek_desc"
,
"pop"
,
100
)
add_top_tracks
(
"ratingweek_desc"
,
"jazz"
,
100
)
add_top_tracks
(
"ratingweek_desc"
,
"dance"
,
100
)
add_top_tracks
(
"ratingweek_desc"
,
"hipop+rap"
,
100
)
add_top_tracks
(
"ratingweek_desc"
,
"world+reggae"
,
100
)
add_top_tracks
(
"ratingweek_desc"
,
"lounge+ambient"
,
100
)
add_top_tracks
(
"ratingweek_desc"
,
nil
,
100
)
add_top_albums
(
"ratingweek_desc"
,
nil
,
20
)
add_radio_from_id
(
"9"
,
20
)
add_radio_from_id
(
"8"
,
20
)
add_radio_from_id
(
"6"
,
20
)
add_radio_from_id
(
"5"
,
20
)
add_radio_from_id
(
"7"
,
20
)
add_radio_from_id
(
"4"
,
20
)
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
)
function
add_top_albums
(
album_order
,
tag
,
max_results
)
local
url
=
"http://api.jamendo.com/get2/id+name+artist_name+album_image/album/xml/?imagesize=500&order="
..
album_order
..
"&n="
..
max_results
if
tag
~=
nil
then
url
=
url
..
"&tag_idstr="
..
tag
-- 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
local
tree
=
simplexml
.
parse_url
(
url
)
local
node_name
=
"Top "
..
max_results
if
album_order
==
"rating_desc"
then
node_name
=
node_name
..
" most popular albums"
elseif
album_order
==
"ratingmonth_desc"
then
node_name
=
node_name
..
" most popular albums this month"
elseif
album_order
==
"ratingweek_desc"
then
node_name
=
node_name
..
" most popular albums this week"
elseif
album_order
==
"releasedate_desc"
then
node_name
=
node_name
..
" latest released albums"
elseif
album_order
==
"downloaded_desc"
then
node_name
=
node_name
..
" most downloaded albums"
elseif
album_order
==
"listened_desc"
then
node_name
=
node_name
..
" most listened to albums"
elseif
album_order
==
"starred_desc"
then
node_name
=
node_name
..
" most starred albums"
elseif
album_order
==
"playlisted_desc"
then
node_name
=
node_name
..
" most playlisted albums"
elseif
album_order
==
"needreviews_desc"
then
node_name
=
node_name
..
" albums requiring review"
if
position
>
playlist_max_tracks
then
log
(
position
/
position_increment
..
" tracks added from playlist "
..
id
)
break
end
if
tag
~=
nil
then
node_name
=
tag
..
" - "
..
node_name
end
local
node
=
vlc
.
sd
.
add_node
(
{
title
=
node_name
}
)
for
_
,
album
in
ipairs
(
tree
.
children
)
do
simplexml
.
add_name_maps
(
album
)
local
album_node
=
node
:
add_subitem
(
{
path
=
'http://api.jamendo.com/get2/id+name+duration+artist_name+album_name+album_genre+album_dates+album_image/track/xml/track_album+album_artist/?album_id='
..
album
.
children_map
[
"id"
][
1
].
children
[
1
],
title
=
album
.
children_map
[
"artist_name"
][
1
].
children
[
1
]
..
' - '
..
album
.
children_map
[
"name"
][
1
].
children
[
1
],
arturl
=
album
.
children_map
[
"album_image"
][
1
].
children
[
1
]
})
else
log
(
"No result for playlist #"
..
id
)
end
end
function
add_top_tracks
(
track_order
,
tag
,
max_results
)
local
url
=
"http://api.jamendo.com/get2/id+name+duration+artist_name+album_name+genre+album_image+album_dates/track/xml/track_album+album_artist/?imagesize=500&order="
..
track_order
..
"&n="
..
max_results
if
tag
~=
nil
then
url
=
url
..
"&tag_minweight=0.35&tag_idstr="
..
tag
end
local
tree
=
simplexml
.
parse_url
(
url
)
local
node_name
=
"Top "
..
max_results
if
track_order
==
"rating_desc"
then
node_name
=
node_name
..
" most popular tracks"
elseif
track_order
==
"ratingmonth_desc"
then
node_name
=
node_name
..
" most popular tracks this month"
elseif
track_order
==
"ratingweek_desc"
then
node_name
=
node_name
..
" most popular tracks this week"
elseif
track_order
==
"releasedate_desc"
then
node_name
=
node_name
..
" latest released tracks"
elseif
track_order
==
"downloaded_desc"
then
node_name
=
node_name
..
" most downloaded tracks"
elseif
track_order
==
"listened_desc"
then
node_name
=
node_name
..
" most listened to tracks"
elseif
track_order
==
"starred_desc"
then
node_name
=
node_name
..
" most starred tracks"
elseif
track_order
==
"playlisted_desc"
then
node_name
=
node_name
..
" most playlisted tracks"
elseif
track_order
==
"needreviews_desc"
then
node_name
=
node_name
..
" tracks requiring review"
end
if
tag
~=
nil
then
node_name
=
string.upper
(
tag
)
..
" - "
..
node_name
end
local
node
=
vlc
.
sd
.
add_node
(
{
title
=
node_name
}
)
for
_
,
track
in
ipairs
(
tree
.
children
)
do
simplexml
.
add_name_maps
(
track
)
node
:
add_subitem
(
{
path
=
"http://api.jamendo.com/get2/stream/track/redirect/?id="
..
track
.
children_map
[
"id"
][
1
].
children
[
1
],
title
=
track
.
children_map
[
"artist_name"
][
1
].
children
[
1
]
..
" - "
..
track
.
children_map
[
"name"
][
1
].
children
[
1
],
artist
=
track
.
children_map
[
"artist_name"
][
1
].
children
[
1
],
album
=
track
.
children_map
[
"album_name"
][
1
].
children
[
1
],
genre
=
track
.
children_map
[
"genre"
][
1
].
children
[
1
],
date
=
track
.
children_map
[
"album_dates"
][
1
].
children_map
[
"year"
][
1
].
children
[
1
],
arturl
=
track
.
children_map
[
"album_image"
][
1
].
children
[
1
],
duration
=
track
.
children_map
[
"duration"
][
1
].
children
[
1
]}
)
-- Add subitems under node for parsed tracks
for
_
,
item
in
ipairs
(
subitems
)
do
node
:
add_subitem
(
item
)
end
end
function
add_radio_from_id
(
id
,
max_results
)
local
radio_name
if
id
==
"9"
then
radio_name
=
"Rock"
elseif
id
==
"8"
then
radio_name
=
"Pop / Songwriting"
elseif
id
==
"6"
then
radio_name
=
"Jazz"
elseif
id
==
"5"
then
radio_name
=
"Hip-Hop"
elseif
id
==
"7"
then
radio_name
=
"Lounge"
elseif
id
==
"4"
then
radio_name
=
"Dance / Electro"
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
vlc
.
sd
.
add_item
(
{
path
=
"http://api.jamendo.com/get2/id+name+artist_name+album_name+duration+album_genre+album_image+album_dates/track/xml/radio_track_inradioplaylist+track_album+album_artist/?imagesize=500&order=random_desc&radio_id="
..
id
..
"&n="
..
max_results
,
title
=
radio_name
}
)
end
function
log
(
msg
)
vlc
.
msg
.
dbg
(
"[JAMENDO] "
..
msg
)
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment