aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaveTBlake <oak99sky@yahoo.co.uk>2018-05-18 15:09:03 +0100
committerDaveTBlake <oak99sky@yahoo.co.uk>2018-06-13 06:34:10 +0100
commit084e6ab9dcaaba5011e2164968b0ab9a640e5c9f (patch)
tree2e3d1c5a818508343ce42909156f7fa465c5aa93
parentea3835aa15b9e73fa3237aae6ec7457326befa9b (diff)
[JSON]Add sources to JSON API, bump schema to v9.4.0
-rw-r--r--xbmc/interfaces/json-rpc/AudioLibrary.cpp57
-rw-r--r--xbmc/interfaces/json-rpc/AudioLibrary.h1
-rw-r--r--xbmc/interfaces/json-rpc/JSONServiceDescription.cpp1
-rw-r--r--xbmc/interfaces/json-rpc/schema/methods.json20
-rw-r--r--xbmc/interfaces/json-rpc/schema/types.json38
-rw-r--r--xbmc/interfaces/json-rpc/schema/version.txt2
6 files changed, 100 insertions, 19 deletions
diff --git a/xbmc/interfaces/json-rpc/AudioLibrary.cpp b/xbmc/interfaces/json-rpc/AudioLibrary.cpp
index 4eb9d2f232..807894915c 100644
--- a/xbmc/interfaces/json-rpc/AudioLibrary.cpp
+++ b/xbmc/interfaces/json-rpc/AudioLibrary.cpp
@@ -135,7 +135,7 @@ JSONRPC_STATUS CAudioLibrary::GetArtists(const std::string &method, ITransportLa
param["properties"] = CVariant(CVariant::VariantTypeArray);
param["properties"].append("artist");
- //Get roleids, songgenreids etc, if needed
+ //Get roleids, songgenreids, sources etc, if needed
JSONRPC_STATUS ret = GetAdditionalArtistDetails(parameterObject, items, musicdatabase);
if (ret != OK)
return ret;
@@ -247,7 +247,7 @@ JSONRPC_STATUS CAudioLibrary::GetAlbums(const std::string &method, ITransportLay
items.Add(pItem);
}
- //Get song genres (genreIDs and/or genre strings)
+ //Get song genres (genreIDs and/or genre strings) and sources
JSONRPC_STATUS ret = GetAdditionalAlbumDetails(parameterObject, items, musicdatabase);
if (ret != OK)
return ret;
@@ -501,14 +501,18 @@ JSONRPC_STATUS CAudioLibrary::GetGenres(const std::string &method, ITransportLay
if (!musicdatabase.Open())
return InternalError;
+ // Check if sources for genre wanted
+ bool sourcesneeded(false);
+ std::set<std::string> checkProperties;
+ checkProperties.insert("sourceid");
+ std::set<std::string> additionalProperties;
+ if (CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties))
+ sourcesneeded = (additionalProperties.find("sourcid") != additionalProperties.end());
+
CFileItemList items;
- if (!musicdatabase.GetGenresNav("musicdb://genres/", items))
+ if (!musicdatabase.GetGenresJSON(items, sourcesneeded))
return InternalError;
- /* need to set strTitle in each item*/
- for (unsigned int i = 0; i < (unsigned int)items.Size(); i++)
- items[i]->GetMusicInfoTag()->SetTitle(items[i]->GetLabel());
-
HandleFileItemList("genreid", false, "genres", items, parameterObject, result);
return OK;
}
@@ -531,6 +535,20 @@ JSONRPC_STATUS CAudioLibrary::GetRoles(const std::string &method, ITransportLaye
return OK;
}
+JSONRPC_STATUS JSONRPC::CAudioLibrary::GetSources(const std::string& method, ITransportLayer* transport, IClient* client, const CVariant& parameterObject, CVariant& result)
+{
+ CMusicDatabase musicdatabase;
+ if (!musicdatabase.Open())
+ return InternalError;
+
+ CFileItemList items;
+ if (!musicdatabase.GetSources(items))
+ return InternalError;
+
+ HandleFileItemList("sourceid", true, "sourceid", items, parameterObject, result);
+ return OK;
+}
+
JSONRPC_STATUS CAudioLibrary::SetArtistDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
{
int id = (int)parameterObject["artistid"].asInteger();
@@ -983,6 +1001,7 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalArtistDetails(const CVariant &paramet
checkProperties.insert("roles");
checkProperties.insert("songgenres");
checkProperties.insert("isalbumartist");
+ checkProperties.insert("sourceid");
std::set<std::string> additionalProperties;
if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties))
return OK;
@@ -1011,6 +1030,15 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalArtistDetails(const CVariant &paramet
musicdatabase.GetIsAlbumArtist(item->GetMusicInfoTag()->GetDatabaseId(), item.get());
}
}
+ if (additionalProperties.find("sourceid") != additionalProperties.end())
+ {
+ for (int i = 0; i < items.Size(); i++)
+ {
+ CFileItemPtr item = items[i];
+ musicdatabase.GetSourcesByArtist(item->GetMusicInfoTag()->GetDatabaseId(), item.get());
+ }
+ }
+
return OK;
}
@@ -1021,6 +1049,7 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalAlbumDetails(const CVariant &paramete
std::set<std::string> checkProperties;
checkProperties.insert("songgenres");
+ checkProperties.insert("sourceid");
std::set<std::string> additionalProperties;
if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties))
return OK;
@@ -1033,6 +1062,15 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalAlbumDetails(const CVariant &paramete
musicdatabase.GetGenresByAlbum(item->GetMusicInfoTag()->GetDatabaseId(), item.get());
}
}
+ if (additionalProperties.find("sourceid") != additionalProperties.end())
+ {
+ for (int i = 0; i < items.Size(); i++)
+ {
+ CFileItemPtr item = items[i];
+ musicdatabase.GetSourcesByAlbum(item->GetMusicInfoTag()->GetDatabaseId(), item.get());
+ }
+ }
+
return OK;
}
@@ -1043,6 +1081,7 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalSongDetails(const CVariant &parameter
std::set<std::string> checkProperties;
checkProperties.insert("genreid");
+ checkProperties.insert("sourceid");
// Query (songview join songartistview) returns song.strAlbumArtists = CMusicInfoTag.m_strAlbumArtistDesc only
// Actual album artist data, if required, comes from album_artist and artist tables.
// It may differ from just splitting album artist description string
@@ -1068,6 +1107,10 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalSongDetails(const CVariant &parameter
item->SetProperty("genreid", genreidObj);
}
}
+ if (additionalProperties.find("sourceid") != additionalProperties.end())
+ {
+ musicdatabase.GetSourcesBySong(item->GetMusicInfoTag()->GetDatabaseId(), item->GetPath(), item.get());
+ }
if (item->GetMusicInfoTag()->GetAlbumId() > 0)
{
if (additionalProperties.find("albumartist") != additionalProperties.end() ||
diff --git a/xbmc/interfaces/json-rpc/AudioLibrary.h b/xbmc/interfaces/json-rpc/AudioLibrary.h
index c174dc326f..2082a3acb6 100644
--- a/xbmc/interfaces/json-rpc/AudioLibrary.h
+++ b/xbmc/interfaces/json-rpc/AudioLibrary.h
@@ -44,6 +44,7 @@ namespace JSONRPC
static JSONRPC_STATUS GetSongDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
static JSONRPC_STATUS GetGenres(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
static JSONRPC_STATUS GetRoles(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
+ static JSONRPC_STATUS GetSources(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
static JSONRPC_STATUS GetRecentlyAddedAlbums(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
static JSONRPC_STATUS GetRecentlyAddedSongs(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
diff --git a/xbmc/interfaces/json-rpc/JSONServiceDescription.cpp b/xbmc/interfaces/json-rpc/JSONServiceDescription.cpp
index c04d150594..9cf7524f97 100644
--- a/xbmc/interfaces/json-rpc/JSONServiceDescription.cpp
+++ b/xbmc/interfaces/json-rpc/JSONServiceDescription.cpp
@@ -114,6 +114,7 @@ JsonRpcMethodMap CJSONServiceDescription::m_methodMaps[] = {
{ "AudioLibrary.GetRecentlyPlayedSongs", CAudioLibrary::GetRecentlyPlayedSongs },
{ "AudioLibrary.GetGenres", CAudioLibrary::GetGenres },
{ "AudioLibrary.GetRoles", CAudioLibrary::GetRoles },
+ { "AudioLibrary.GetSources", CAudioLibrary::GetSources },
{ "AudioLibrary.SetArtistDetails", CAudioLibrary::SetArtistDetails },
{ "AudioLibrary.SetAlbumDetails", CAudioLibrary::SetAlbumDetails },
{ "AudioLibrary.SetSongDetails", CAudioLibrary::SetSongDetails },
diff --git a/xbmc/interfaces/json-rpc/schema/methods.json b/xbmc/interfaces/json-rpc/schema/methods.json
index 40a70d1760..8ddc8efc1a 100644
--- a/xbmc/interfaces/json-rpc/schema/methods.json
+++ b/xbmc/interfaces/json-rpc/schema/methods.json
@@ -938,6 +938,26 @@
}
}
},
+ "AudioLibrary.GetSources": {
+ "type": "method",
+ "description": "Get all music sources, including unique ID",
+ "transport": "Response",
+ "permission": "ReadData",
+ "params": [
+ { "name": "properties", "$ref": "Library.Fields.Source" },
+ { "name": "limits", "$ref": "List.Limits" },
+ { "name": "sort", "$ref": "List.Sort" }
+ ],
+ "returns": {
+ "type": "object",
+ "properties": {
+ "limits": { "$ref": "List.LimitsReturned", "required": true },
+ "sources": { "type": "array", "required": true,
+ "items": { "$ref": "Library.Details.Source" }
+ }
+ }
+ }
+ },
"AudioLibrary.GetRoles": {
"type": "method",
"description": "Retrieve all contributor roles",
diff --git a/xbmc/interfaces/json-rpc/schema/types.json b/xbmc/interfaces/json-rpc/schema/types.json
index c8c445a9a4..f11a2e4b43 100644
--- a/xbmc/interfaces/json-rpc/schema/types.json
+++ b/xbmc/interfaces/json-rpc/schema/types.json
@@ -416,16 +416,29 @@
"type": "object",
"additionalProperties": { "type": [ "null", { "$ref": "Global.String.NotEmpty", "required": true } ] }
},
+ "Library.Fields.Source": {
+ "extends": "Item.Fields.Base",
+ "items": { "type": "string", "enum": [ "file", "paths" ] }
+ },
+ "Library.Details.Source": {
+ "extends": "Item.Details.Base",
+ "properties": {
+ "sourceid": { "$ref": "Library.Id", "required": true },
+ "file": { "type": "string", "description": "The url encoded multipath string combining all paths of the source ", "required": true },
+ "paths": { "$ref": "Array.String", "description": "The individual paths of the media source" }
+ }
+ },
"Library.Fields.Genre": {
"extends": "Item.Fields.Base",
- "items": { "type": "string", "enum": [ "title", "thumbnail" ] }
+ "items": { "type": "string", "enum": [ "title", "thumbnail", "sourceid" ] }
},
"Library.Details.Genre": {
"extends": "Item.Details.Base",
"properties": {
"genreid": { "$ref": "Library.Id", "required": true },
"title": { "type": "string" },
- "thumbnail": { "type": "string" }
+ "thumbnail": { "type": "string" },
+ "sourceid": { "$ref": "Array.Integer", "description": "The ids of sources with songs of the genre" }
}
},
"Library.Fields.Tag": {
@@ -453,19 +466,19 @@
"Audio.Fields.Artist": {
"extends": "Item.Fields.Base",
"items": { "type": "string",
- "description": "Requesting the (song)genreid/genre, or roleid/role fields will result in increased response times",
+ "description": "Requesting the (song)genreid/genre, roleid/role or sourceid fields will result in increased response times",
"enum": [ "instrument", "style", "mood", "born", "formed",
"description", "genre", "died", "disbanded",
"yearsactive", "musicbrainzartistid", "fanart",
"thumbnail", "compilationartist", "dateadded",
"roles", "songgenres", "isalbumartist",
- "sortname", "type", "gender", "disambiguation", "art"]
+ "sortname", "type", "gender", "disambiguation", "art", "sourceid"]
}
},
"Audio.Fields.Album": {
"extends": "Item.Fields.Base",
"items": { "type": "string",
- "description": "Requesting the songgenres and/or artistid field will result in increased response times",
+ "description": "Requesting the songgenres, artistid and/or sourceid fields will result in increased response times",
"enum": [ "title", "description", "artist", "genre",
"theme", "mood", "style", "type", "albumlabel",
"rating", "votes", "userrating","year", "musicbrainzalbumid",
@@ -473,13 +486,13 @@
"playcount", "artistid", "displayartist",
"compilation", "releasetype", "dateadded",
"sortartist", "musicbrainzreleasegroupid", "songgenres", "art",
- "lastplayed"]
+ "lastplayed", "sourceid"]
}
},
"Audio.Fields.Song": {
"extends": "Item.Fields.Base",
"items": { "type": "string",
- "description": "Requesting the genreid, artistid and/or albumartistid field will result in increased response times",
+ "description": "Requesting the genreid, artistid, albumartistid and/or sourceid fields will result in increased response times",
"enum": [ "title", "artist", "albumartist", "genre", "year",
"rating", "album", "track", "duration", "comment",
"lyrics", "musicbrainztrackid", "musicbrainzartistid",
@@ -489,7 +502,7 @@
"albumartistid", "albumreleasetype", "dateadded",
"votes", "userrating", "mood", "contributors",
"displaycomposer", "displayconductor", "displayorchestra", "displaylyricist",
- "sortartist", "art"]
+ "sortartist", "art", "sourceid"]
}
},
"Audio.Album.ReleaseType": {
@@ -575,7 +588,8 @@
"sortname": { "type": "string" },
"type": { "type": "string" },
"gender": { "type": "string" },
- "disambiguation": { "type": "string" }
+ "disambiguation": { "type": "string" },
+ "sourceid": { "$ref": "Array.Integer" }
}
},
"Audio.Details.Album": {
@@ -594,7 +608,8 @@
"musicbrainzreleasegroupid": { "type": "string" },
"musicbrainzalbumid": { "type": "string" },
"songgenres": {"$ref": "Audio.Details.Genres"},
- "lastplayed": { "type": "string" }
+ "lastplayed": { "type": "string" },
+ "sourceid": { "$ref": "Array.Integer" }
}
},
"Audio.Details.Song": {
@@ -622,7 +637,8 @@
"displayconductor": { "type": "string"},
"displayorchestra": { "type": "string"},
"displaylyricist": { "type": "string"},
- "genreid": { "$ref": "Array.Integer"}
+ "genreid": { "$ref": "Array.Integer"},
+ "sourceid": { "$ref": "Array.Integer" }
}
},
"Audio.Property.Name": {
diff --git a/xbmc/interfaces/json-rpc/schema/version.txt b/xbmc/interfaces/json-rpc/schema/version.txt
index a6410905de..ba808d3ff3 100644
--- a/xbmc/interfaces/json-rpc/schema/version.txt
+++ b/xbmc/interfaces/json-rpc/schema/version.txt
@@ -1 +1 @@
-JSONRPC_VERSION 9.3.0
+JSONRPC_VERSION 9.4.0