diff options
author | DaveTBlake <oak99sky@yahoo.co.uk> | 2018-05-18 15:09:03 +0100 |
---|---|---|
committer | DaveTBlake <oak99sky@yahoo.co.uk> | 2018-06-13 06:34:10 +0100 |
commit | 084e6ab9dcaaba5011e2164968b0ab9a640e5c9f (patch) | |
tree | 2e3d1c5a818508343ce42909156f7fa465c5aa93 | |
parent | ea3835aa15b9e73fa3237aae6ec7457326befa9b (diff) |
[JSON]Add sources to JSON API, bump schema to v9.4.0
-rw-r--r-- | xbmc/interfaces/json-rpc/AudioLibrary.cpp | 57 | ||||
-rw-r--r-- | xbmc/interfaces/json-rpc/AudioLibrary.h | 1 | ||||
-rw-r--r-- | xbmc/interfaces/json-rpc/JSONServiceDescription.cpp | 1 | ||||
-rw-r--r-- | xbmc/interfaces/json-rpc/schema/methods.json | 20 | ||||
-rw-r--r-- | xbmc/interfaces/json-rpc/schema/types.json | 38 | ||||
-rw-r--r-- | xbmc/interfaces/json-rpc/schema/version.txt | 2 |
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 ¶meterObject, CVariant &result) { int id = (int)parameterObject["artistid"].asInteger(); @@ -983,6 +1001,7 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalArtistDetails(const CVariant ¶met 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 ¶met 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 ¶mete 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 ¶mete 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 ¶meter 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 ¶meter 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 ¶meterObject, CVariant &result); static JSONRPC_STATUS GetGenres(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); static JSONRPC_STATUS GetRoles(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); + static JSONRPC_STATUS GetSources(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); static JSONRPC_STATUS GetRecentlyAddedAlbums(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); static JSONRPC_STATUS GetRecentlyAddedSongs(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, 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 |