From 246693a7cc163f313947d9098f2371f7354232d6 Mon Sep 17 00:00:00 2001 From: Synced Synapse Date: Wed, 21 Feb 2018 20:11:21 +0000 Subject: [PATCH] Change the source of AlbumGenres table to support Kodi v18 As detailed in https://github.com/xbmc/xbmc/pull/13051, Kodi v18 changes the way album genres are handled, as the genre (by which i mean `genreId`) ceases to be available at the album level, being only available at the songs level. This impacts Kore because `GetAlbums` and `GetAlbumDetails` won't return the `genreId` tag, from which the local AlbumGenres table was populated. This PR changes the source of the local AlbumGenres table to be the `genreId` returned at the song level (by `GetSongs`), to make it somewhat more consistent with the way Kodi will handle things from now on. --- .../java/org/xbmc/kore/host/HostInfo.java | 20 +- .../org/xbmc/kore/jsonrpc/HostConnection.java | 10 +- .../service/library/LibrarySyncService.java | 2 +- .../xbmc/kore/service/library/SyncMusic.java | 73 +- .../sections/remote/NowPlayingFragment.java | 7 +- .../ui/sections/remote/RemoteFragment.java | 6 +- .../org/xbmc/kore/testutils/Database.java | 26 +- ...ospectHelix.json => Introspect-Helix.json} | 0 ...enguard.json => Introspect-Isenguard.json} | 0 doc/json_responses/Introspect-Leia.json | 12594 ++++++++++++++++ 10 files changed, 12680 insertions(+), 58 deletions(-) rename doc/json_responses/{IntrospectHelix.json => Introspect-Helix.json} (100%) rename doc/json_responses/{IntrospectIsenguard.json => Introspect-Isenguard.json} (100%) create mode 100644 doc/json_responses/Introspect-Leia.json diff --git a/app/src/main/java/org/xbmc/kore/host/HostInfo.java b/app/src/main/java/org/xbmc/kore/host/HostInfo.java index 3675d43..1e6026c 100644 --- a/app/src/main/java/org/xbmc/kore/host/HostInfo.java +++ b/app/src/main/java/org/xbmc/kore/host/HostInfo.java @@ -16,7 +16,6 @@ package org.xbmc.kore.host; import org.xbmc.kore.jsonrpc.HostConnection; -import org.xbmc.kore.jsonrpc.method.System; import org.xbmc.kore.utils.LogUtils; import java.io.UnsupportedEncodingException; @@ -55,11 +54,20 @@ public class HostInfo { */ public static final int DEFAULT_EVENT_SERVER_PORT = 9777; - public static final int DEFAULT_KODI_VERSION_MAJOR = 16; + public static final int KODI_V12_FRODO = 12; + public static final int KODI_V13_GOTHAM = 13; + public static final int KODI_V14_HELIX = 14; + public static final int KODI_V15_ISENGARD = 15; + public static final int KODI_V16_JARVIS = 16; + public static final int KODI_V17_KRYPTON = 17; + public static final int KODI_V18_LEIA = 18; + + public static final int DEFAULT_KODI_VERSION_MAJOR = KODI_V16_JARVIS; public static final int DEFAULT_KODI_VERSION_MINOR = 1; public static final String DEFAULT_KODI_VERSION_REVISION = "Unknown"; public static final String DEFAULT_KODI_VERSION_TAG = "stable"; + /** * Internal id of the host */ @@ -291,6 +299,14 @@ public class HostInfo { this.kodiVersionTag = kodiVersionTag; } + public boolean isGothamOrLater() { + return kodiVersionMajor > KODI_V13_GOTHAM; + } + + public boolean isKryptonOrLater() { + return kodiVersionMajor > KODI_V17_KRYPTON; + } + /** * Returns the URL of the host * @return HTTP URL eg. http://192.168.1.1:8080 diff --git a/app/src/main/java/org/xbmc/kore/jsonrpc/HostConnection.java b/app/src/main/java/org/xbmc/kore/jsonrpc/HostConnection.java index f61d6fd..d9aea63 100644 --- a/app/src/main/java/org/xbmc/kore/jsonrpc/HostConnection.java +++ b/app/src/main/java/org/xbmc/kore/jsonrpc/HostConnection.java @@ -15,7 +15,6 @@ */ package org.xbmc.kore.jsonrpc; -import android.annotation.SuppressLint; import android.os.Handler; import android.os.Process; import android.text.TextUtils; @@ -213,6 +212,14 @@ public class HostConnection { return ((protocol == PROTOCOL_TCP) || (protocol == PROTOCOL_HTTP)); } + /** + * Returns this connection {@link HostInfo} + * @return This connection {@link HostInfo} + */ + public HostInfo getHostInfo() { + return hostInfo; + } + /** * Registers an observer for player notifications * @param observer The {@link PlayerNotificationsObserver} @@ -421,6 +428,7 @@ public class HostConnection { final Handler handler) { OkHttpClient client = getOkHttpClient(); String jsonRequest = method.toJsonString(); + LogUtils.LOGD(TAG, "Sending request via HTTP: " + jsonRequest); try { Request request = new Request.Builder() diff --git a/app/src/main/java/org/xbmc/kore/service/library/LibrarySyncService.java b/app/src/main/java/org/xbmc/kore/service/library/LibrarySyncService.java index 8034285..521c01c 100644 --- a/app/src/main/java/org/xbmc/kore/service/library/LibrarySyncService.java +++ b/app/src/main/java/org/xbmc/kore/service/library/LibrarySyncService.java @@ -140,7 +140,7 @@ public class LibrarySyncService extends Service { // Sync all music boolean syncAllMusic = intent.getBooleanExtra(SYNC_ALL_MUSIC, false); if (syncAllMusic) { - syncOrchestrator.addSyncItem(new SyncMusic(hostInfo.getId(), syncExtras)); + syncOrchestrator.addSyncItem(new SyncMusic(syncExtras)); } // Sync all music videos diff --git a/app/src/main/java/org/xbmc/kore/service/library/SyncMusic.java b/app/src/main/java/org/xbmc/kore/service/library/SyncMusic.java index df94d01..6c27a80 100644 --- a/app/src/main/java/org/xbmc/kore/service/library/SyncMusic.java +++ b/app/src/main/java/org/xbmc/kore/service/library/SyncMusic.java @@ -41,21 +41,18 @@ public class SyncMusic extends SyncItem { private static final int LIMIT_SYNC_ALBUMS = 300; private static final int LIMIT_SYNC_SONGS = 600; - private final int hostId; private final Bundle syncExtras; /** - * Syncs all the music on selected XBMC to the local database - * @param hostId XBMC host id + * Syncs all the music to the local database */ - public SyncMusic(final int hostId, Bundle syncExtras) { - this.hostId = hostId; + public SyncMusic(Bundle syncExtras) { this.syncExtras = syncExtras; } /** {@inheritDoc} */ public String getDescription() { - return "Sync music for host: " + hostId; + return "Sync music"; } /** {@inheritDoc} */ @@ -91,11 +88,13 @@ public class SyncMusic extends SyncItem { * Gets all artists recursively and forwards the call to Genres * Genres->Albums->Songs */ - public void chainCallSyncArtists(final SyncOrchestrator orchestrator, + private void chainCallSyncArtists(final SyncOrchestrator orchestrator, final HostConnection hostConnection, final Handler callbackHandler, final ContentResolver contentResolver, final int startIdx) { + final int hostId = hostConnection.getHostInfo().getId(); + // Artists->Genres->Albums->Songs // Only gets album artists (first parameter) ListType.Limits limits = new ListType.Limits(startIdx, startIdx + LIMIT_SYNC_ARTISTS); @@ -116,7 +115,7 @@ public class SyncMusic extends SyncItem { // First delete all music info if (startIdx == 0) deleteMusicInfo(contentResolver, hostId); - insertArtists(items, contentResolver); + insertArtists(hostId, items, contentResolver); if (SyncUtils.moreItemsAvailable(limitsReturned)) { LogUtils.LOGD(TAG, "chainCallSyncArtists: More results on media center, recursing."); @@ -170,13 +169,15 @@ public class SyncMusic extends SyncItem { final HostConnection hostConnection, final Handler callbackHandler, final ContentResolver contentResolver) { + final int hostId = hostConnection.getHostInfo().getId(); + // Genres->Albums->Songs AudioLibrary.GetGenres action = new AudioLibrary.GetGenres(getGenresProperties); action.execute(hostConnection, new ApiCallback>() { @Override public void onSuccess(List result) { if (result != null) - insertGenresItems(result, contentResolver); + insertGenresItems(hostId, result, contentResolver); chainCallSyncAlbums(orchestrator, hostConnection, callbackHandler, contentResolver, 0); } @@ -199,7 +200,7 @@ public class SyncMusic extends SyncItem { //AudioType.FieldsAlbum.MUSICBRAINZALBUMID, //AudioType.FieldsAlbum.MUSICBRAINZALBUMARTISTID, AudioType.FieldsAlbum.FANART, AudioType.FieldsAlbum.THUMBNAIL, - AudioType.FieldsAlbum.PLAYCOUNT, AudioType.FieldsAlbum.GENREID, + AudioType.FieldsAlbum.PLAYCOUNT, // AudioType.FieldsAlbum.GENREID, AudioType.FieldsAlbum.ARTISTID, AudioType.FieldsAlbum.DISPLAYARTIST }; @@ -212,10 +213,13 @@ public class SyncMusic extends SyncItem { final Handler callbackHandler, final ContentResolver contentResolver, final int startIdx) { + final int hostId = hostConnection.getHostInfo().getId(); final long albumSyncStartTime = System.currentTimeMillis(); // Albums->Songs ListType.Limits limits = new ListType.Limits(startIdx, startIdx + LIMIT_SYNC_ALBUMS); + AudioLibrary.GetAlbums action = new AudioLibrary.GetAlbums(limits, getAlbumsProperties); + action.execute(hostConnection, new ApiCallback>() { @Override public void onSuccess(ApiList result) { @@ -230,7 +234,7 @@ public class SyncMusic extends SyncItem { } // Insert the partial results - insertAlbumsItems(items, contentResolver); + insertAlbumsItems(hostId, items, contentResolver); LogUtils.LOGD(TAG, "Finished inserting artists and genres in: " + (System.currentTimeMillis() - albumSyncStartTime)); @@ -271,7 +275,7 @@ public class SyncMusic extends SyncItem { AudioType.FieldsSong.ALBUMID, //AudioType.FieldsSong.LASTPLAYED, AudioType.FieldsSong.DISC, - //AudioType.FieldsSong.GENREID, + AudioType.FieldsSong.GENREID, AudioType.FieldsSong.ARTISTID, // AudioType.FieldsSong.ALBUMARTISTID, AudioType.FieldsSong.DISPLAYARTIST, @@ -285,6 +289,7 @@ public class SyncMusic extends SyncItem { final Handler callbackHandler, final ContentResolver contentResolver, final int startIdx) { + final int hostId = hostConnection.getHostInfo().getId(); // Songs ListType.Limits limits = new ListType.Limits(startIdx, startIdx + LIMIT_SYNC_SONGS); AudioLibrary.GetSongs action = new AudioLibrary.GetSongs(limits, getSongsProperties); @@ -302,7 +307,7 @@ public class SyncMusic extends SyncItem { } // Save partial results to DB - insertSongsItems(items, contentResolver); + insertSongsItems(hostId, items, contentResolver); if (SyncUtils.moreItemsAvailable(limitsReturned)) { LogUtils.LOGD(TAG, "chainCallSyncSongs: More results on media center, recursing."); @@ -324,7 +329,7 @@ public class SyncMusic extends SyncItem { }, callbackHandler); } - public void insertArtists(List items, ContentResolver contentResolver) { + public void insertArtists(int hostId, List items, ContentResolver contentResolver) { ContentValues artistValuesBatch[] = new ContentValues[items.size()]; for (int i = 0; i < items.size(); i++) { AudioType.DetailsArtist artist = items.get(i); @@ -333,7 +338,7 @@ public class SyncMusic extends SyncItem { contentResolver.bulkInsert(MediaContract.Artists.CONTENT_URI, artistValuesBatch); } - public void insertGenresItems(List items, ContentResolver contentResolver) { + public void insertGenresItems(int hostId, List items, ContentResolver contentResolver) { ContentValues genresValuesBatch[] = new ContentValues[items.size()]; for (int i = 0; i < items.size(); i++) { @@ -345,22 +350,20 @@ public class SyncMusic extends SyncItem { contentResolver.bulkInsert(MediaContract.AudioGenres.CONTENT_URI, genresValuesBatch); } - public void insertAlbumsItems(List items, ContentResolver contentResolver) { + public void insertAlbumsItems(int hostId, List items, ContentResolver contentResolver) { ContentValues albumValuesBatch[] = new ContentValues[items.size()]; - int artistsCount = 0, genresCount = 0; + int artistsCount = 0; for (int i = 0; i < items.size(); i++) { AudioType.DetailsAlbum album = items.get(i); albumValuesBatch[i] = SyncUtils.contentValuesFromAlbum(hostId, album); artistsCount += album.artistid.size(); - genresCount += album.genreid.size(); } contentResolver.bulkInsert(MediaContract.Albums.CONTENT_URI, albumValuesBatch); - // Iterate on each album, collect the artists and the genres and insert them + // Iterate on each album, collect the artists and insert them ContentValues albumArtistsValuesBatch[] = new ContentValues[artistsCount]; - ContentValues albumGenresValuesBatch[] = new ContentValues[genresCount]; - int artistCount = 0, genreCount = 0; + int artistCount = 0; for (AudioType.DetailsAlbum album : items) { for (int artistId : album.artistid) { albumArtistsValuesBatch[artistCount] = new ContentValues(); @@ -369,34 +372,27 @@ public class SyncMusic extends SyncItem { albumArtistsValuesBatch[artistCount].put(MediaContract.AlbumArtists.ARTISTID, artistId); artistCount++; } - - for (int genreId : album.genreid) { - albumGenresValuesBatch[genreCount] = new ContentValues(); - albumGenresValuesBatch[genreCount].put(MediaContract.AlbumGenres.HOST_ID, hostId); - albumGenresValuesBatch[genreCount].put(MediaContract.AlbumGenres.ALBUMID, album.albumid); - albumGenresValuesBatch[genreCount].put(MediaContract.AlbumGenres.GENREID, genreId); - genreCount++; - } } contentResolver.bulkInsert(MediaContract.AlbumArtists.CONTENT_URI, albumArtistsValuesBatch); - contentResolver.bulkInsert(MediaContract.AlbumGenres.CONTENT_URI, albumGenresValuesBatch); } - public void insertSongsItems(List items, ContentResolver contentResolver) { + public void insertSongsItems(int hostId, List items, ContentResolver contentResolver) { ContentValues songValuesBatch[] = new ContentValues[items.size()]; - int totalArtistsCount = 0; + int totalArtistsCount = 0, totalGenresCount = 0; for (int i = 0; i < items.size(); i++) { AudioType.DetailsSong song = items.get(i); songValuesBatch[i] = SyncUtils.contentValuesFromSong(hostId, song); totalArtistsCount += song.artistid.size(); + totalGenresCount += song.genreid.size(); } contentResolver.bulkInsert(MediaContract.Songs.CONTENT_URI, songValuesBatch); - // Iterate on each song, collect the artists and insert them + // Iterate on each song, collect the artists and the genres and insert them ContentValues songArtistsValuesBatch[] = new ContentValues[totalArtistsCount]; - int artistCount = 0; + ContentValues songGenresValuesBatch[] = new ContentValues[totalGenresCount]; + int artistCount = 0, genreCount = 0; for (AudioType.DetailsSong song : items) { for (int artistId : song.artistid) { songArtistsValuesBatch[artistCount] = new ContentValues(); @@ -405,8 +401,17 @@ public class SyncMusic extends SyncItem { songArtistsValuesBatch[artistCount].put(MediaContract.SongArtists.ARTISTID, artistId); artistCount++; } + + for (int genreId : song.genreid) { + songGenresValuesBatch[genreCount] = new ContentValues(); + songGenresValuesBatch[genreCount].put(MediaContract.AlbumGenres.HOST_ID, hostId); + songGenresValuesBatch[genreCount].put(MediaContract.AlbumGenres.ALBUMID, song.albumid); + songGenresValuesBatch[genreCount].put(MediaContract.AlbumGenres.GENREID, genreId); + genreCount++; + } } contentResolver.bulkInsert(MediaContract.SongArtists.CONTENT_URI, songArtistsValuesBatch); + contentResolver.bulkInsert(MediaContract.AlbumGenres.CONTENT_URI, songGenresValuesBatch); } } diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/remote/NowPlayingFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/remote/NowPlayingFragment.java index 4beca18..53d20de 100644 --- a/app/src/main/java/org/xbmc/kore/ui/sections/remote/NowPlayingFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/sections/remote/NowPlayingFragment.java @@ -21,7 +21,6 @@ import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.text.TextUtils; -import android.text.util.Linkify; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.MenuItem; @@ -451,10 +450,10 @@ public class NowPlayingFragment extends Fragment case 0: // Download subtitles. First check host version to see which method to call HostInfo hostInfo = hostManager.getHostInfo(); - if (hostInfo.getKodiVersionMajor() < 13) { - showDownloadSubtitlesPreGotham(); - } else { + if (hostInfo.isGothamOrLater()) { showDownloadSubtitlesPostGotham(); + } else { + showDownloadSubtitlesPreGotham(); } break; case 1: diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteFragment.java b/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteFragment.java index 7e56db5..bd068c4 100644 --- a/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteFragment.java @@ -629,10 +629,10 @@ public class RemoteFragment extends Fragment HostInfo hostInfo = hostManager.getHostInfo(); // Info button, v17 uses a different window to display codec info so check version number - if (hostInfo.getKodiVersionMajor() < 17) { - action = new Input.ExecuteAction(Input.ExecuteAction.CODECINFO); - } else { + if (hostInfo.isKryptonOrLater()) { action = new Input.ExecuteAction(Input.ExecuteAction.PLAYERPROCESSINFO); + } else { + action = new Input.ExecuteAction(Input.ExecuteAction.CODECINFO); } action.execute(hostManager.getConnection(), defaultActionCallback, callbackHandler); diff --git a/app/src/testUtils/java/org/xbmc/kore/testutils/Database.java b/app/src/testUtils/java/org/xbmc/kore/testutils/Database.java index 5053b63..95dbc35 100644 --- a/app/src/testUtils/java/org/xbmc/kore/testutils/Database.java +++ b/app/src/testUtils/java/org/xbmc/kore/testutils/Database.java @@ -44,12 +44,12 @@ public class Database { public static final String TAG = LogUtils.makeLogTag(Database.class); public static HostInfo fill(HostInfo hostInfo, Context context, ContentResolver contentResolver) throws ApiException, IOException { - SyncMusic syncMusic = new SyncMusic(hostInfo.getId(), null); + SyncMusic syncMusic = new SyncMusic(null); insertMovies(context, contentResolver, hostInfo.getId()); - insertArtists(context, contentResolver, syncMusic); - insertGenres(context, contentResolver, syncMusic); - insertAlbums(context, contentResolver, syncMusic); - insertSongs(context, contentResolver, syncMusic); + insertArtists(context, contentResolver, syncMusic, hostInfo.getId()); + insertGenres(context, contentResolver, syncMusic, hostInfo.getId()); + insertAlbums(context, contentResolver, syncMusic, hostInfo.getId()); + insertSongs(context, contentResolver, syncMusic, hostInfo.getId()); SyncTVShows syncTVShows = new SyncTVShows(hostInfo.getId(), null); insertTVShows(context, contentResolver, syncTVShows); @@ -115,37 +115,37 @@ public class Database { contentResolver.bulkInsert(MediaContract.MovieCast.CONTENT_URI, movieCastValuesBatch); } - private static void insertArtists(Context context, ContentResolver contentResolver, SyncMusic syncMusic) throws ApiException, IOException { + private static void insertArtists(Context context, ContentResolver contentResolver, SyncMusic syncMusic, int hostId) throws ApiException, IOException { AudioLibrary.GetArtists getArtists = new AudioLibrary.GetArtists(false); String result = FileUtils.readFile(context, "AudioLibrary.GetArtists.json"); ArrayList artistList = (ArrayList) getArtists.resultFromJson(result).items; - syncMusic.insertArtists(artistList, contentResolver); + syncMusic.insertArtists(hostId, artistList, contentResolver); } - private static void insertGenres(Context context, ContentResolver contentResolver, SyncMusic syncMusic) throws ApiException, IOException { + private static void insertGenres(Context context, ContentResolver contentResolver, SyncMusic syncMusic, int hostId) throws ApiException, IOException { AudioLibrary.GetGenres getGenres = new AudioLibrary.GetGenres(); ArrayList genreList = (ArrayList) getGenres.resultFromJson(FileUtils.readFile(context, "AudioLibrary.GetGenres.json")); - syncMusic.insertGenresItems(genreList, contentResolver); + syncMusic.insertGenresItems(hostId, genreList, contentResolver); } - private static void insertAlbums(Context context, ContentResolver contentResolver, SyncMusic syncMusic) throws ApiException, IOException { + private static void insertAlbums(Context context, ContentResolver contentResolver, SyncMusic syncMusic, int hostId) throws ApiException, IOException { AudioLibrary.GetAlbums getAlbums = new AudioLibrary.GetAlbums(); String result = FileUtils.readFile(context, "AudioLibrary.GetAlbums.json"); ArrayList albumList = (ArrayList) getAlbums.resultFromJson(result).items; - syncMusic.insertAlbumsItems(albumList, contentResolver); + syncMusic.insertAlbumsItems(hostId, albumList, contentResolver); } - private static void insertSongs(Context context, ContentResolver contentResolver, SyncMusic syncMusic) throws ApiException, IOException { + private static void insertSongs(Context context, ContentResolver contentResolver, SyncMusic syncMusic, int hostId) throws ApiException, IOException { AudioLibrary.GetSongs getSongs = new AudioLibrary.GetSongs(); ArrayList songList = (ArrayList) getSongs.resultFromJson(FileUtils.readFile(context, "AudioLibrary.GetSongs.json")).items; - syncMusic.insertSongsItems(songList, contentResolver); + syncMusic.insertSongsItems(hostId, songList, contentResolver); } private static void insertTVShows(Context context, ContentResolver contentResolver, SyncTVShows syncTVShows) diff --git a/doc/json_responses/IntrospectHelix.json b/doc/json_responses/Introspect-Helix.json similarity index 100% rename from doc/json_responses/IntrospectHelix.json rename to doc/json_responses/Introspect-Helix.json diff --git a/doc/json_responses/IntrospectIsenguard.json b/doc/json_responses/Introspect-Isenguard.json similarity index 100% rename from doc/json_responses/IntrospectIsenguard.json rename to doc/json_responses/Introspect-Isenguard.json diff --git a/doc/json_responses/Introspect-Leia.json b/doc/json_responses/Introspect-Leia.json new file mode 100644 index 0000000..3989c4b --- /dev/null +++ b/doc/json_responses/Introspect-Leia.json @@ -0,0 +1,12594 @@ +{ + "id": 19, + "jsonrpc": "2.0", + "result": { + "description": "JSON-RPC API of XBMC", + "id": "http://xbmc.org/jsonrpc/ServiceDescription.json", + "methods": { + "Addons.ExecuteAddon": { + "description": "Executes the given addon with the given parameters (if possible)", + "params": [ + { + "name": "addonid", + "required": true, + "type": "string" + }, + { + "default": "", + "name": "params", + "type": [ + { + "additionalProperties": { + "default": "", + "type": "string" + }, + "type": "object" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "description": "URL path (must start with / or ?", + "type": "string" + } + ] + }, + { + "default": false, + "name": "wait", + "type": "boolean" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Addons.GetAddonDetails": { + "description": "Gets the details of a specific addon", + "params": [ + { + "name": "addonid", + "required": true, + "type": "string" + }, + { + "$ref": "Addon.Fields", + "name": "properties" + } + ], + "returns": { + "properties": { + "addon": { + "$ref": "Addon.Details", + "required": true + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "Addons.GetAddons": { + "description": "Gets all available addons", + "params": [ + { + "$ref": "Addon.Types", + "default": "unknown", + "name": "type" + }, + { + "$ref": "Addon.Content", + "default": "unknown", + "description": "Content provided by the addon. Only considered for plugins and scripts.", + "name": "content" + }, + { + "default": "all", + "name": "enabled", + "type": [ + { + "type": "boolean" + }, + { + "enums": [ + "all" + ], + "type": "string" + } + ] + }, + { + "$ref": "Addon.Fields", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "default": true, + "name": "installed", + "type": [ + { + "type": "boolean" + }, + { + "enums": [ + "all" + ], + "type": "string" + } + ] + } + ], + "returns": { + "properties": { + "addons": { + "items": { + "$ref": "Addon.Details" + }, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "Addons.SetAddonEnabled": { + "description": "Enables/Disables a specific addon", + "params": [ + { + "name": "addonid", + "required": true, + "type": "string" + }, + { + "$ref": "Global.Toggle", + "name": "enabled", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Application.GetProperties": { + "description": "Retrieves the values of the given properties", + "params": [ + { + "items": { + "$ref": "Application.Property.Name" + }, + "name": "properties", + "required": true, + "type": "array", + "uniqueItems": true + } + ], + "returns": { + "$ref": "Application.Property.Value" + }, + "type": "method" + }, + "Application.Quit": { + "description": "Quit application", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Application.SetMute": { + "description": "Toggle mute/unmute", + "params": [ + { + "$ref": "Global.Toggle", + "name": "mute", + "required": true + } + ], + "returns": { + "description": "Mute state", + "type": "boolean" + }, + "type": "method" + }, + "Application.SetVolume": { + "description": "Set the current volume", + "params": [ + { + "name": "volume", + "required": true, + "type": [ + { + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + { + "$ref": "Global.IncrementDecrement" + } + ] + } + ], + "returns": { + "type": "integer" + }, + "type": "method" + }, + "AudioLibrary.Clean": { + "description": "Cleans the audio library from non-existent items", + "params": [ + { + "default": true, + "description": "Whether or not to show the progress bar or any other GUI dialog", + "name": "showdialogs", + "type": "boolean" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "AudioLibrary.Export": { + "description": "Exports all items from the audio library", + "params": [ + { + "name": "options", + "type": [ + { + "additionalProperties": false, + "properties": { + "path": { + "description": "Path to the directory to where the data should be exported", + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "images": { + "default": false, + "description": "Whether to export thumbnails and fanart images", + "type": "boolean" + }, + "overwrite": { + "default": false, + "description": "Whether to overwrite existing exported files", + "type": "boolean" + } + }, + "type": "object" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "AudioLibrary.GetAlbumDetails": { + "description": "Retrieve details about a specific album", + "params": [ + { + "$ref": "Library.Id", + "name": "albumid", + "required": true + }, + { + "$ref": "Audio.Fields.Album", + "name": "properties" + } + ], + "returns": { + "properties": { + "albumdetails": { + "$ref": "Audio.Details.Album" + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetAlbums": { + "description": "Retrieve all albums from specified artist (and role) or that has songs of the specified genre", + "params": [ + { + "$ref": "Audio.Fields.Album", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + }, + { + "name": "filter", + "type": [ + { + "additionalProperties": false, + "properties": { + "genreid": { + "$ref": "Library.Id", + "description": "Song genre. Filter for existence of songs with this genre", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "genre": { + "description": "Song genre. Filter for existence of songs with this genre", + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artistid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artistid": { + "$ref": "Library.Id", + "required": true + }, + "roleid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artistid": { + "$ref": "Library.Id", + "required": true + }, + "role": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artist": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artist": { + "minLength": 1, + "required": true, + "type": "string" + }, + "roleid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artist": { + "minLength": 1, + "required": true, + "type": "string" + }, + "role": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Albums" + } + ] + }, + { + "default": false, + "name": "includesingles", + "type": "boolean" + }, + { + "default": false, + "description": "Whether or not to include all roles when filtering by artist, rather than the default of excluding other contributions. When true it overrides any role filter value.", + "name": "allroles", + "type": "boolean" + } + ], + "returns": { + "properties": { + "albums": { + "items": { + "$ref": "Audio.Details.Album" + }, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetArtistDetails": { + "description": "Retrieve details about a specific artist", + "params": [ + { + "$ref": "Library.Id", + "name": "artistid", + "required": true + }, + { + "$ref": "Audio.Fields.Artist", + "name": "properties" + } + ], + "returns": { + "properties": { + "artistdetails": { + "$ref": "Audio.Details.Artist" + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetArtists": { + "description": "Retrieve all artists. For backward compatibility by default this implicity does not include those that only contribute other roles, however absolutely all artists can be returned using allroles=true", + "params": [ + { + "$ref": "Optional.Boolean", + "default": null, + "description": "Whether or not to only include album artists rather than the artists of only individual songs as well. If the parameter is not passed or is passed as null the GUI setting will be used", + "name": "albumartistsonly" + }, + { + "$ref": "Audio.Fields.Artist", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + }, + { + "name": "filter", + "type": [ + { + "additionalProperties": false, + "properties": { + "genreid": { + "$ref": "Library.Id", + "description": "Deprecated, use songgenreid. Filter for existence of songs with this genre", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "songgenreid": { + "$ref": "Library.Id", + "description": "Song genreid. Filter for existence of songs with this genre", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "roleid": { + "$ref": "Library.Id", + "required": true + }, + "songgenreid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "role": { + "minLength": 1, + "required": true, + "type": "string" + }, + "songgenreid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "genre": { + "description": "Deprecated, use songgenre. Filter for existence of songs with this genre", + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "songgenre": { + "description": "Song genre. Filter for existence of songs with this genre", + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "roleid": { + "$ref": "Library.Id", + "required": true + }, + "songgenre": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "role": { + "minLength": 1, + "required": true, + "type": "string" + }, + "songgenre": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "albumid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "album": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "songid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "roleid": { + "$ref": "Library.Id", + "required": true + }, + "songid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "role": { + "minLength": 1, + "required": true, + "type": "string" + }, + "songid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "roleid": { + "$ref": "Library.Id", + "description": "Role contributed by artist. Overridden by allroles parameter", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "role": { + "description": "Role contributed by artist. Overridden by allroles parameter", + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Artists" + } + ] + }, + { + "default": false, + "description": "Whether or not to include all artists irrespective of the role they contributed. When true it overrides any role filter value.", + "name": "allroles", + "type": "boolean" + } + ], + "returns": { + "properties": { + "artists": { + "items": { + "$ref": "Audio.Details.Artist" + }, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetGenres": { + "description": "Retrieve all genres", + "params": [ + { + "$ref": "Library.Fields.Genre", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "genres": { + "items": { + "$ref": "Library.Details.Genre" + }, + "required": true, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetProperties": { + "description": "Retrieves the values of the music library properties", + "params": [ + { + "items": { + "$ref": "Audio.Property.Name" + }, + "name": "properties", + "required": true, + "type": "array", + "uniqueItems": true + } + ], + "returns": { + "$ref": "Audio.Property.Value" + }, + "type": "method" + }, + "AudioLibrary.GetRecentlyAddedAlbums": { + "description": "Retrieve recently added albums", + "params": [ + { + "$ref": "Audio.Fields.Album", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "albums": { + "items": { + "$ref": "Audio.Details.Album" + }, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetRecentlyAddedSongs": { + "description": "Retrieve recently added songs", + "params": [ + { + "$ref": "List.Amount", + "default": -1, + "description": "The amount of recently added albums from which to return the songs", + "name": "albumlimit" + }, + { + "$ref": "Audio.Fields.Song", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "songs": { + "items": { + "$ref": "Audio.Details.Song" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetRecentlyPlayedAlbums": { + "description": "Retrieve recently played albums", + "params": [ + { + "$ref": "Audio.Fields.Album", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "albums": { + "items": { + "$ref": "Audio.Details.Album" + }, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetRecentlyPlayedSongs": { + "description": "Retrieve recently played songs", + "params": [ + { + "$ref": "Audio.Fields.Song", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "songs": { + "items": { + "$ref": "Audio.Details.Song" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetRoles": { + "description": "Retrieve all contributor roles", + "params": [ + { + "$ref": "Audio.Fields.Role", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "roles": { + "items": { + "$ref": "Audio.Details.Role" + }, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetSongDetails": { + "description": "Retrieve details about a specific song", + "params": [ + { + "$ref": "Library.Id", + "name": "songid", + "required": true + }, + { + "$ref": "Audio.Fields.Song", + "name": "properties" + } + ], + "returns": { + "properties": { + "songdetails": { + "$ref": "Audio.Details.Song" + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.GetSongs": { + "description": "Retrieve all songs from specified album, artist or genre", + "params": [ + { + "$ref": "Audio.Fields.Song", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + }, + { + "name": "filter", + "type": [ + { + "additionalProperties": false, + "properties": { + "genreid": { + "$ref": "Library.Id", + "description": "Song genre. Filter for existence of songs with this genre", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "genre": { + "description": "Song genre. Filter for existence of songs with this genre", + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artistid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artistid": { + "$ref": "Library.Id", + "required": true + }, + "roleid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artistid": { + "$ref": "Library.Id", + "required": true + }, + "role": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artist": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artist": { + "minLength": 1, + "required": true, + "type": "string" + }, + "roleid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artist": { + "minLength": 1, + "required": true, + "type": "string" + }, + "role": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "albumid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "album": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Songs" + } + ] + }, + { + "default": true, + "name": "includesingles", + "type": "boolean" + }, + { + "default": false, + "description": "Whether or not to include all roles when filtering by artist, rather than default of excluding other contributors. When true it overrides any role filter value.", + "name": "allroles", + "type": "boolean" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "songs": { + "items": { + "$ref": "Audio.Details.Song" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "AudioLibrary.Scan": { + "description": "Scans the audio sources for new library items", + "params": [ + { + "default": "", + "name": "directory", + "type": "string" + }, + { + "default": true, + "description": "Whether or not to show the progress bar or any other GUI dialog", + "name": "showdialogs", + "type": "boolean" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "AudioLibrary.SetAlbumDetails": { + "description": "Update the given album with the given details", + "params": [ + { + "$ref": "Library.Id", + "name": "albumid", + "required": true + }, + { + "$ref": "Optional.String", + "default": null, + "name": "title" + }, + { + "default": null, + "name": "artist", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.String", + "default": null, + "name": "description" + }, + { + "default": null, + "name": "genre", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "theme", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "mood", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "style", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.String", + "default": null, + "name": "type" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "albumlabel" + }, + { + "$ref": "Optional.Number", + "default": null, + "name": "rating" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "year" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "userrating" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "votes" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "musicbrainzalbumid" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "musicbrainzreleasegroupid" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "sortartist" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "displayartist" + }, + { + "default": null, + "name": "musicbrainzalbumartistid", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "art", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.Artwork.Set" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "AudioLibrary.SetArtistDetails": { + "description": "Update the given artist with the given details", + "params": [ + { + "$ref": "Library.Id", + "name": "artistid", + "required": true + }, + { + "$ref": "Optional.String", + "default": null, + "name": "artist" + }, + { + "default": null, + "name": "instrument", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "style", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "mood", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.String", + "default": null, + "name": "born" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "formed" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "description" + }, + { + "default": null, + "name": "genre", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.String", + "default": null, + "name": "died" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "disbanded" + }, + { + "default": null, + "name": "yearsactive", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.String", + "default": null, + "name": "musicbrainzartistid" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "sortname" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "type" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "gender" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "disambiguation" + }, + { + "default": null, + "name": "art", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.Artwork.Set" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "AudioLibrary.SetSongDetails": { + "description": "Update the given song with the given details", + "params": [ + { + "$ref": "Library.Id", + "name": "songid", + "required": true + }, + { + "$ref": "Optional.String", + "default": null, + "name": "title" + }, + { + "default": null, + "name": "artist", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "genre", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "year" + }, + { + "$ref": "Optional.Number", + "default": null, + "name": "rating" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "track" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "disc" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "duration" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "comment" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "musicbrainztrackid" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "musicbrainzartistid" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "playcount" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "lastplayed" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "userrating" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "votes" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "displayartist" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "sortartist" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "mood" + }, + { + "default": null, + "name": "art", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.Artwork.Set" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Favourites.AddFavourite": { + "description": "Add a favourite with the given details", + "params": [ + { + "name": "title", + "required": true, + "type": "string" + }, + { + "$ref": "Favourite.Type", + "name": "type", + "required": true + }, + { + "$ref": "Optional.String", + "default": null, + "description": "Required for media and script favourites types", + "name": "path" + }, + { + "$ref": "Optional.String", + "default": null, + "description": "Required for window favourite type", + "name": "window" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "windowparameter" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "thumbnail" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Favourites.GetFavourites": { + "description": "Retrieve all favourites", + "params": [ + { + "default": null, + "name": "type", + "type": [ + { + "type": "null" + }, + { + "$ref": "Favourite.Type" + } + ] + }, + { + "$ref": "Favourite.Fields.Favourite", + "name": "properties" + } + ], + "returns": { + "properties": { + "favourites": { + "items": { + "$ref": "Favourite.Details.Favourite" + }, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "Files.GetDirectory": { + "description": "Get the directories and files in the given directory", + "params": [ + { + "name": "directory", + "required": true, + "type": "string" + }, + { + "$ref": "Files.Media", + "default": "files", + "name": "media" + }, + { + "$ref": "List.Fields.Files", + "name": "properties" + }, + { + "$ref": "List.Sort", + "name": "sort" + }, + { + "$ref": "List.Limits", + "description": "Limits are applied after getting the directory content thus retrieval is not faster when they are applied.", + "name": "limits" + } + ], + "returns": { + "properties": { + "files": { + "items": { + "$ref": "List.Item.File" + }, + "required": true, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "Files.GetFileDetails": { + "description": "Get details for a specific file", + "params": [ + { + "description": "Full path to the file", + "name": "file", + "required": true, + "type": "string" + }, + { + "$ref": "Files.Media", + "default": "files", + "name": "media" + }, + { + "$ref": "List.Fields.Files", + "name": "properties" + } + ], + "returns": { + "properties": { + "filedetails": { + "$ref": "List.Item.File", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "Files.GetSources": { + "description": "Get the sources of the media windows", + "params": [ + { + "$ref": "Files.Media", + "name": "media", + "required": true + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "sources": { + "$ref": "List.Items.Sources", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "Files.PrepareDownload": { + "description": "Provides a way to download a given file (e.g. providing an URL to the real file location)", + "params": [ + { + "name": "path", + "required": true, + "type": "string" + } + ], + "returns": { + "properties": { + "details": { + "description": "Transport specific details on how/from where to download the given file", + "required": true, + "type": "any" + }, + "mode": { + "description": "Direct mode allows using Files.Download whereas redirect mode requires the usage of a different protocol", + "enums": [ + "redirect", + "direct" + ], + "required": true, + "type": "string" + }, + "protocol": { + "enums": [ + "http" + ], + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "type": "method" + }, + "Files.SetFileDetails": { + "description": "Update the given specific file with the given details", + "params": [ + { + "description": "Full path to the file", + "name": "file", + "required": true, + "type": "string" + }, + { + "$ref": "Files.Media", + "description": "File type to update correct database. Currently only \"video\" is supported.", + "name": "media", + "required": true + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "playcount" + }, + { + "$ref": "Optional.String", + "default": null, + "description": "Setting a valid lastplayed without a playcount will force playcount to 1.", + "name": "lastplayed" + }, + { + "default": null, + "name": "resume", + "type": [ + { + "type": "null" + }, + { + "$ref": "Video.Resume" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "GUI.ActivateWindow": { + "description": "Activates the given window", + "params": [ + { + "$ref": "GUI.Window", + "name": "window", + "required": true + }, + { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "name": "parameters", + "type": "array" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "GUI.GetProperties": { + "description": "Retrieves the values of the given properties", + "params": [ + { + "items": { + "$ref": "GUI.Property.Name" + }, + "name": "properties", + "required": true, + "type": "array", + "uniqueItems": true + } + ], + "returns": { + "$ref": "GUI.Property.Value" + }, + "type": "method" + }, + "GUI.GetStereoscopicModes": { + "description": "Returns the supported stereoscopic modes of the GUI", + "params": [], + "returns": { + "properties": { + "stereoscopicmodes": { + "items": { + "$ref": "GUI.Stereoscopy.Mode" + }, + "type": "array", + "uniqueItems": true + } + }, + "type": "object" + }, + "type": "method" + }, + "GUI.SetFullscreen": { + "description": "Toggle fullscreen/GUI", + "params": [ + { + "$ref": "Global.Toggle", + "name": "fullscreen", + "required": true + } + ], + "returns": { + "description": "Fullscreen state", + "type": "boolean" + }, + "type": "method" + }, + "GUI.SetStereoscopicMode": { + "description": "Sets the stereoscopic mode of the GUI to the given mode", + "params": [ + { + "enums": [ + "toggle", + "tomono", + "next", + "previous", + "select", + "off", + "split_vertical", + "split_horizontal", + "row_interleaved", + "hardware_based", + "anaglyph_cyan_red", + "anaglyph_green_magenta", + "monoscopic" + ], + "name": "mode", + "required": true, + "type": "string" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "GUI.ShowNotification": { + "description": "Shows a GUI notification", + "params": [ + { + "name": "title", + "required": true, + "type": "string" + }, + { + "name": "message", + "required": true, + "type": "string" + }, + { + "default": "", + "name": "image", + "type": [ + { + "enums": [ + "info", + "warning", + "error" + ], + "type": "string" + }, + { + "type": "string" + } + ] + }, + { + "default": 5000, + "description": "The time in milliseconds the notification will be visible", + "minimum": 1500, + "name": "displaytime", + "type": "integer" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.Back": { + "description": "Goes back in GUI", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.ContextMenu": { + "description": "Shows the context menu", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.Down": { + "description": "Navigate down in GUI", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.ExecuteAction": { + "description": "Execute a specific action", + "params": [ + { + "$ref": "Input.Action", + "name": "action", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.Home": { + "description": "Goes to home window in GUI", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.Info": { + "description": "Shows the information dialog", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.Left": { + "description": "Navigate left in GUI", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.Right": { + "description": "Navigate right in GUI", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.Select": { + "description": "Select current item in GUI", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.SendText": { + "description": "Send a generic (unicode) text", + "params": [ + { + "description": "Unicode text", + "name": "text", + "required": true, + "type": "string" + }, + { + "default": true, + "description": "Whether this is the whole input or not (closes an open input dialog if true).", + "name": "done", + "type": "boolean" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.ShowCodec": { + "description": "Show codec information of the playing item", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.ShowOSD": { + "description": "Show the on-screen display for the current player", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.ShowPlayerProcessInfo": { + "description": "Show player process information of the playing item, like video decoder, pixel format, pvr signal strength, ...", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Input.Up": { + "description": "Navigate up in GUI", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "JSONRPC.Introspect": { + "description": "Enumerates all actions and descriptions", + "params": [ + { + "default": true, + "name": "getdescriptions", + "type": "boolean" + }, + { + "default": false, + "name": "getmetadata", + "type": "boolean" + }, + { + "default": true, + "name": "filterbytransport", + "type": "boolean" + }, + { + "name": "filter", + "properties": { + "getreferences": { + "default": true, + "description": "Whether or not to print the schema for referenced types", + "type": "boolean" + }, + "id": { + "description": "Name of a namespace, method or type", + "required": true, + "type": "string" + }, + "type": { + "description": "Type of the given name", + "enums": [ + "method", + "namespace", + "type", + "notification" + ], + "required": true, + "type": "string" + } + }, + "type": "object" + } + ], + "returns": { + "additionalProperties": false, + "type": "object" + }, + "type": "method" + }, + "JSONRPC.NotifyAll": { + "description": "Notify all other connected clients", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "message", + "required": true, + "type": "string" + }, + { + "default": null, + "name": "data", + "type": "any" + } + ], + "returns": { + "type": "any" + }, + "type": "method" + }, + "JSONRPC.Permission": { + "description": "Retrieve the clients permissions", + "params": [], + "returns": { + "properties": { + "controlgui": { + "required": true, + "type": "boolean" + }, + "controlnotify": { + "required": true, + "type": "boolean" + }, + "controlplayback": { + "required": true, + "type": "boolean" + }, + "controlpower": { + "required": true, + "type": "boolean" + }, + "controlpvr": { + "required": true, + "type": "boolean" + }, + "controlsystem": { + "required": true, + "type": "boolean" + }, + "executeaddon": { + "required": true, + "type": "boolean" + }, + "manageaddon": { + "required": true, + "type": "boolean" + }, + "navigate": { + "required": true, + "type": "boolean" + }, + "readdata": { + "required": true, + "type": "boolean" + }, + "removedata": { + "required": true, + "type": "boolean" + }, + "updatedata": { + "required": true, + "type": "boolean" + }, + "writefile": { + "required": true, + "type": "boolean" + } + }, + "type": "object" + }, + "type": "method" + }, + "JSONRPC.Ping": { + "description": "Ping responder", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "JSONRPC.Version": { + "description": "Retrieve the JSON-RPC protocol version.", + "params": [], + "returns": { + "properties": { + "version": { + "properties": { + "major": { + "description": "Bumped on backwards incompatible changes to the API definition", + "minimum": 0, + "required": true, + "type": "integer" + }, + "minor": { + "description": "Bumped on backwards compatible additions/changes to the API definition", + "minimum": 0, + "required": true, + "type": "integer" + }, + "patch": { + "description": "Bumped on any changes to the internal implementation but not to the API definition", + "minimum": 0, + "required": true, + "type": "integer" + } + }, + "required": true, + "type": "object" + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.AddTimer": { + "description": "Adds a timer to record the given show one times or a timer rule to record all showings of the given show", + "params": [ + { + "$ref": "Library.Id", + "description": "the broadcast id of the item to record", + "name": "broadcastid", + "required": true + }, + { + "default": false, + "description": "controls whether to create a timer rule or a onetime timer", + "name": "timerrule", + "type": "boolean" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "PVR.DeleteTimer": { + "description": "Deletes a onetime timer or a timer rule", + "params": [ + { + "$ref": "Library.Id", + "description": "the id of the onetime timer or timer rule to delete", + "name": "timerid", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "PVR.GetBroadcastDetails": { + "description": "Retrieves the details of a specific broadcast", + "params": [ + { + "$ref": "Library.Id", + "name": "broadcastid", + "required": true + }, + { + "$ref": "PVR.Fields.Broadcast", + "name": "properties" + } + ], + "returns": { + "properties": { + "broadcastdetails": { + "$ref": "PVR.Details.Broadcast" + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.GetBroadcasts": { + "description": "Retrieves the program of a specific channel", + "params": [ + { + "$ref": "Library.Id", + "name": "channelid", + "required": true + }, + { + "$ref": "PVR.Fields.Broadcast", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + } + ], + "returns": { + "properties": { + "broadcasts": { + "items": { + "$ref": "PVR.Details.Broadcast" + }, + "required": true, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.GetChannelDetails": { + "description": "Retrieves the details of a specific channel", + "params": [ + { + "$ref": "Library.Id", + "name": "channelid", + "required": true + }, + { + "$ref": "PVR.Fields.Channel", + "name": "properties" + } + ], + "returns": { + "properties": { + "channeldetails": { + "$ref": "PVR.Details.Channel" + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.GetChannelGroupDetails": { + "description": "Retrieves the details of a specific channel group", + "params": [ + { + "$ref": "PVR.ChannelGroup.Id", + "name": "channelgroupid", + "required": true + }, + { + "name": "channels", + "properties": { + "limits": { + "$ref": "List.Limits" + }, + "properties": { + "$ref": "PVR.Fields.Channel" + } + }, + "type": "object" + } + ], + "returns": { + "properties": { + "channelgroupdetails": { + "$ref": "PVR.Details.ChannelGroup.Extended" + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.GetChannelGroups": { + "description": "Retrieves the channel groups for the specified type", + "params": [ + { + "$ref": "PVR.Channel.Type", + "name": "channeltype", + "required": true + }, + { + "$ref": "List.Limits", + "name": "limits" + } + ], + "returns": { + "properties": { + "channelgroups": { + "items": { + "$ref": "PVR.Details.ChannelGroup" + }, + "required": true, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.GetChannels": { + "description": "Retrieves the channel list", + "params": [ + { + "$ref": "PVR.ChannelGroup.Id", + "name": "channelgroupid", + "required": true + }, + { + "$ref": "PVR.Fields.Channel", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + } + ], + "returns": { + "properties": { + "channels": { + "items": { + "$ref": "PVR.Details.Channel" + }, + "required": true, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.GetProperties": { + "description": "Retrieves the values of the given properties", + "params": [ + { + "items": { + "$ref": "PVR.Property.Name" + }, + "name": "properties", + "required": true, + "type": "array", + "uniqueItems": true + } + ], + "returns": { + "$ref": "PVR.Property.Value" + }, + "type": "method" + }, + "PVR.GetRecordingDetails": { + "description": "Retrieves the details of a specific recording", + "params": [ + { + "$ref": "Library.Id", + "name": "recordingid", + "required": true + }, + { + "$ref": "PVR.Fields.Recording", + "name": "properties" + } + ], + "returns": { + "properties": { + "recordingdetails": { + "$ref": "PVR.Details.Recording" + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.GetRecordings": { + "description": "Retrieves the recordings", + "params": [ + { + "$ref": "PVR.Fields.Recording", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "recordings": { + "items": { + "$ref": "PVR.Details.Recording" + }, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.GetTimerDetails": { + "description": "Retrieves the details of a specific timer", + "params": [ + { + "$ref": "Library.Id", + "name": "timerid", + "required": true + }, + { + "$ref": "PVR.Fields.Timer", + "name": "properties" + } + ], + "returns": { + "properties": { + "timerdetails": { + "$ref": "PVR.Details.Timer" + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.GetTimers": { + "description": "Retrieves the timers", + "params": [ + { + "$ref": "PVR.Fields.Timer", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "timers": { + "items": { + "$ref": "PVR.Details.Timer" + }, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "PVR.Record": { + "description": "Toggle recording of a channel", + "params": [ + { + "$ref": "Global.Toggle", + "default": "toggle", + "name": "record" + }, + { + "default": "current", + "name": "channel", + "type": [ + { + "enums": [ + "current" + ], + "type": "string" + }, + { + "$ref": "Library.Id" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "PVR.Scan": { + "description": "Starts a channel scan", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "PVR.ToggleTimer": { + "description": "Creates or deletes a onetime timer or timer rule for a given show. If it exists, it will be deleted. If it does not exist, it will be created", + "params": [ + { + "$ref": "Library.Id", + "description": "the broadcast id of the item to toggle a onetime timer or time rule for", + "name": "broadcastid", + "required": true + }, + { + "default": false, + "description": "controls whether to create / delete a timer rule or a onetime timer", + "name": "timerrule", + "type": "boolean" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.GetActivePlayers": { + "description": "Returns all active players", + "params": [], + "returns": { + "items": { + "properties": { + "playerid": { + "$ref": "Player.Id", + "required": true + }, + "type": { + "$ref": "Player.Type", + "required": true + } + }, + "type": "object" + }, + "type": "array", + "uniqueItems": true + }, + "type": "method" + }, + "Player.GetItem": { + "description": "Retrieves the currently played item", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "$ref": "List.Fields.All", + "name": "properties" + } + ], + "returns": { + "properties": { + "item": { + "$ref": "List.Item.All", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "Player.GetPlayers": { + "description": "Get a list of available players", + "params": [ + { + "default": "all", + "enums": [ + "all", + "video", + "audio" + ], + "name": "media", + "type": "string" + } + ], + "returns": { + "items": { + "properties": { + "name": { + "$ref": "Global.String.NotEmpty", + "required": true + }, + "playsaudio": { + "required": true, + "type": "boolean" + }, + "playsvideo": { + "required": true, + "type": "boolean" + }, + "type": { + "enums": [ + "internal", + "external", + "remote" + ], + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "type": "array", + "uniqueItems": true + }, + "type": "method" + }, + "Player.GetProperties": { + "description": "Retrieves the values of the given properties", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "items": { + "$ref": "Player.Property.Name" + }, + "name": "properties", + "required": true, + "type": "array", + "uniqueItems": true + } + ], + "returns": { + "$ref": "Player.Property.Value" + }, + "type": "method" + }, + "Player.GoTo": { + "description": "Go to previous/next/specific item in the playlist", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "name": "to", + "required": true, + "type": [ + { + "enums": [ + "previous", + "next" + ], + "type": "string" + }, + { + "$ref": "Playlist.Position", + "description": "position in playlist" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.Move": { + "description": "If picture is zoomed move viewport left/right/up/down otherwise skip previous/next", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "enums": [ + "left", + "right", + "up", + "down" + ], + "name": "direction", + "required": true, + "type": "string" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.Open": { + "description": "Start playback of either the playlist with the given ID, a slideshow with the pictures from the given directory or a single file or an item from the database.", + "params": [ + { + "name": "item", + "type": [ + { + "additionalProperties": false, + "properties": { + "playlistid": { + "$ref": "Playlist.Id", + "required": true + }, + "position": { + "$ref": "Playlist.Position", + "default": 0 + } + }, + "type": "object" + }, + { + "$ref": "Playlist.Item" + }, + { + "additionalProperties": false, + "properties": { + "path": { + "required": true, + "type": "string" + }, + "random": { + "default": true, + "description": "Deprecated, use the shuffled property of the options parameter instead", + "type": "boolean" + }, + "recursive": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "partymode": { + "default": "", + "type": [ + { + "enums": [ + "music", + "video" + ], + "type": "string" + }, + { + "description": "Path to a smartplaylist (*.xsp) file", + "minLength": 5, + "type": "string" + } + ] + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "channelid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "recordingid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + } + ] + }, + { + "additionalProperties": false, + "name": "options", + "properties": { + "playername": { + "default": null, + "type": [ + { + "type": "null" + }, + { + "enums": [ + "default" + ], + "type": "string" + }, + { + "description": "name of player", + "minLength": 1, + "type": "string" + } + ] + }, + "repeat": { + "default": null, + "type": [ + { + "type": "null" + }, + { + "$ref": "Player.Repeat" + } + ] + }, + "resume": { + "default": false, + "type": [ + { + "description": "Whether to resume from the resume point or not", + "type": "boolean" + }, + { + "$ref": "Player.Position.Percentage", + "description": "Percentage value to start from" + }, + { + "$ref": "Player.Position.Time", + "description": "Time to start from" + } + ] + }, + "shuffled": { + "$ref": "Optional.Boolean", + "default": null + } + }, + "type": "object" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.PlayPause": { + "description": "Pauses or unpause playback and returns the new state", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "$ref": "Global.Toggle", + "default": "toggle", + "name": "play" + } + ], + "returns": { + "$ref": "Player.Speed" + }, + "type": "method" + }, + "Player.Rotate": { + "description": "Rotates current picture", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "default": "clockwise", + "enums": [ + "clockwise", + "counterclockwise" + ], + "name": "value", + "type": "string" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.Seek": { + "description": "Seek through the playing item", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "name": "value", + "required": true, + "type": [ + { + "$ref": "Player.Position.Percentage", + "description": "Percentage value to seek to" + }, + { + "$ref": "Player.Position.Time", + "description": "Time to seek to" + }, + { + "description": "Seek by predefined jumps", + "enums": [ + "smallforward", + "smallbackward", + "bigforward", + "bigbackward" + ], + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "percentage": { + "$ref": "Player.Position.Percentage", + "description": "Percentage value to seek to", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "time": { + "$ref": "Player.Position.Time", + "description": "Time to seek to", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "step": { + "description": "Seek by predefined jumps", + "enums": [ + "smallforward", + "smallbackward", + "bigforward", + "bigbackward" + ], + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "seconds": { + "description": "Seek by the given number of seconds", + "required": true, + "type": "integer" + } + }, + "type": "object" + } + ] + } + ], + "returns": { + "properties": { + "percentage": { + "$ref": "Player.Position.Percentage", + "default": 0 + }, + "time": { + "$ref": "Global.Time" + }, + "totaltime": { + "$ref": "Global.Time" + } + }, + "type": "object" + }, + "type": "method" + }, + "Player.SetAudioStream": { + "description": "Set the audio stream played by the player", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "name": "stream", + "required": true, + "type": [ + { + "enums": [ + "previous", + "next" + ], + "type": "string" + }, + { + "description": "Index of the audio stream to play", + "minimum": 0, + "type": "integer" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.SetPartymode": { + "description": "Turn partymode on or off", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "$ref": "Global.Toggle", + "name": "partymode", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.SetRepeat": { + "description": "Set the repeat mode of the player", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "name": "repeat", + "required": true, + "type": [ + { + "$ref": "Player.Repeat" + }, + { + "enums": [ + "cycle" + ], + "type": "string" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.SetShuffle": { + "description": "Shuffle/Unshuffle items in the player", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "$ref": "Global.Toggle", + "name": "shuffle", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.SetSpeed": { + "description": "Set the speed of the current playback", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "name": "speed", + "required": true, + "type": [ + { + "enums": [ + -32, + -16, + -8, + -4, + -2, + -1, + 0, + 1, + 2, + 4, + 8, + 16, + 32 + ], + "type": "integer" + }, + { + "$ref": "Global.IncrementDecrement" + } + ] + } + ], + "returns": { + "$ref": "Player.Speed" + }, + "type": "method" + }, + "Player.SetSubtitle": { + "description": "Set the subtitle displayed by the player", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "name": "subtitle", + "required": true, + "type": [ + { + "enums": [ + "previous", + "next", + "off", + "on" + ], + "type": "string" + }, + { + "description": "Index of the subtitle to display", + "minimum": 0, + "type": "integer" + } + ] + }, + { + "default": false, + "description": "Whether to enable subtitles to be displayed after setting the new subtitle", + "name": "enable", + "type": "boolean" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.SetVideoStream": { + "description": "Set the video stream played by the player", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "name": "stream", + "required": true, + "type": [ + { + "enums": [ + "previous", + "next" + ], + "type": "string" + }, + { + "description": "Index of the video stream to play", + "minimum": 0, + "type": "integer" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.Stop": { + "description": "Stops playback", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Player.Zoom": { + "description": "Zoom current picture", + "params": [ + { + "$ref": "Player.Id", + "name": "playerid", + "required": true + }, + { + "name": "zoom", + "required": true, + "type": [ + { + "enums": [ + "in", + "out" + ], + "type": "string" + }, + { + "description": "zoom level", + "maximum": 10, + "minimum": 1, + "type": "integer" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Playlist.Add": { + "description": "Add item(s) to playlist", + "params": [ + { + "$ref": "Playlist.Id", + "name": "playlistid", + "required": true + }, + { + "name": "item", + "required": true, + "type": [ + { + "$ref": "Playlist.Item" + }, + { + "items": { + "$ref": "Playlist.Item" + }, + "type": "array" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Playlist.Clear": { + "description": "Clear playlist", + "params": [ + { + "$ref": "Playlist.Id", + "name": "playlistid", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Playlist.GetItems": { + "description": "Get all items from playlist", + "params": [ + { + "$ref": "Playlist.Id", + "name": "playlistid", + "required": true + }, + { + "$ref": "List.Fields.All", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "items": { + "items": { + "$ref": "List.Item.All" + }, + "required": true, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "Playlist.GetPlaylists": { + "description": "Returns all existing playlists", + "params": [], + "returns": { + "items": { + "properties": { + "playlistid": { + "$ref": "Playlist.Id", + "required": true + }, + "type": { + "$ref": "Playlist.Type", + "required": true + } + }, + "type": "object" + }, + "type": "array", + "uniqueItems": true + }, + "type": "method" + }, + "Playlist.GetProperties": { + "description": "Retrieves the values of the given properties", + "params": [ + { + "$ref": "Playlist.Id", + "name": "playlistid", + "required": true + }, + { + "items": { + "$ref": "Playlist.Property.Name" + }, + "name": "properties", + "required": true, + "type": "array", + "uniqueItems": true + } + ], + "returns": { + "$ref": "Playlist.Property.Value" + }, + "type": "method" + }, + "Playlist.Insert": { + "description": "Insert item(s) into playlist. Does not work for picture playlists (aka slideshows).", + "params": [ + { + "$ref": "Playlist.Id", + "name": "playlistid", + "required": true + }, + { + "$ref": "Playlist.Position", + "name": "position", + "required": true + }, + { + "name": "item", + "required": true, + "type": [ + { + "$ref": "Playlist.Item" + }, + { + "items": { + "$ref": "Playlist.Item" + }, + "type": "array" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Playlist.Remove": { + "description": "Remove item from playlist. Does not work for picture playlists (aka slideshows).", + "params": [ + { + "$ref": "Playlist.Id", + "name": "playlistid", + "required": true + }, + { + "$ref": "Playlist.Position", + "name": "position", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Playlist.Swap": { + "description": "Swap items in the playlist. Does not work for picture playlists (aka slideshows).", + "params": [ + { + "$ref": "Playlist.Id", + "name": "playlistid", + "required": true + }, + { + "$ref": "Playlist.Position", + "name": "position1", + "required": true + }, + { + "$ref": "Playlist.Position", + "name": "position2", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Profiles.GetCurrentProfile": { + "description": "Retrieve the current profile", + "params": [ + { + "$ref": "Profiles.Fields.Profile", + "name": "properties" + } + ], + "returns": { + "$ref": "Profiles.Details.Profile" + }, + "type": "method" + }, + "Profiles.GetProfiles": { + "description": "Retrieve all profiles", + "params": [ + { + "$ref": "Profiles.Fields.Profile", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "profiles": { + "items": { + "$ref": "Profiles.Details.Profile" + }, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "Profiles.LoadProfile": { + "description": "Load the specified profile", + "params": [ + { + "description": "Profile name", + "name": "profile", + "required": true, + "type": "string" + }, + { + "default": false, + "description": "Prompt for password", + "name": "prompt", + "type": "boolean" + }, + { + "$ref": "Profiles.Password", + "name": "password" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Settings.GetCategories": { + "description": "Retrieves all setting categories", + "params": [ + { + "$ref": "Setting.Level", + "default": "standard", + "name": "level" + }, + { + "default": "", + "name": "section", + "type": "string" + }, + { + "extends": "Item.Fields.Base", + "items": { + "enums": [ + "settings" + ], + "type": "string" + }, + "name": "properties" + } + ], + "returns": { + "properties": { + "categories": { + "items": { + "$ref": "Setting.Details.Category" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "Settings.GetSections": { + "description": "Retrieves all setting sections", + "params": [ + { + "$ref": "Setting.Level", + "default": "standard", + "name": "level" + }, + { + "extends": "Item.Fields.Base", + "items": { + "enums": [ + "categories" + ], + "type": "string" + }, + "name": "properties" + } + ], + "returns": { + "properties": { + "sections": { + "items": { + "$ref": "Setting.Details.Section" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "Settings.GetSettingValue": { + "description": "Retrieves the value of a setting", + "params": [ + { + "minLength": 1, + "name": "setting", + "required": true, + "type": "string" + } + ], + "returns": { + "properties": { + "value": { + "$ref": "Setting.Value.Extended", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "Settings.GetSettings": { + "description": "Retrieves all settings", + "params": [ + { + "$ref": "Setting.Level", + "default": "standard", + "name": "level" + }, + { + "name": "filter", + "type": [ + { + "additionalProperties": false, + "properties": { + "category": { + "minLength": 1, + "required": true, + "type": "string" + }, + "section": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + } + ] + } + ], + "returns": { + "properties": { + "settings": { + "items": { + "$ref": "Setting.Details.Setting" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "Settings.ResetSettingValue": { + "description": "Resets the value of a setting", + "params": [ + { + "minLength": 1, + "name": "setting", + "required": true, + "type": "string" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Settings.SetSettingValue": { + "description": "Changes the value of a setting", + "params": [ + { + "minLength": 1, + "name": "setting", + "required": true, + "type": "string" + }, + { + "$ref": "Setting.Value.Extended", + "name": "value", + "required": true + } + ], + "returns": { + "type": "boolean" + }, + "type": "method" + }, + "System.EjectOpticalDrive": { + "description": "Ejects or closes the optical disc drive (if available)", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "System.GetProperties": { + "description": "Retrieves the values of the given properties", + "params": [ + { + "items": { + "$ref": "System.Property.Name" + }, + "name": "properties", + "required": true, + "type": "array", + "uniqueItems": true + } + ], + "returns": { + "$ref": "System.Property.Value" + }, + "type": "method" + }, + "System.Hibernate": { + "description": "Puts the system running Kodi into hibernate mode", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "System.Reboot": { + "description": "Reboots the system running Kodi", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "System.Shutdown": { + "description": "Shuts the system running Kodi down", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "System.Suspend": { + "description": "Suspends the system running Kodi", + "params": [], + "returns": { + "type": "string" + }, + "type": "method" + }, + "Textures.GetTextures": { + "description": "Retrieve all textures", + "params": [ + { + "$ref": "Textures.Fields.Texture", + "name": "properties" + }, + { + "$ref": "List.Filter.Textures", + "name": "filter" + } + ], + "returns": { + "properties": { + "textures": { + "items": { + "$ref": "Textures.Details.Texture" + }, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "Textures.RemoveTexture": { + "description": "Remove the specified texture", + "params": [ + { + "$ref": "Library.Id", + "description": "Texture database identifier", + "name": "textureid", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.Clean": { + "description": "Cleans the video library for non-existent items", + "params": [ + { + "default": true, + "description": "Whether or not to show the progress bar or any other GUI dialog", + "name": "showdialogs", + "type": "boolean" + }, + { + "default": "video", + "description": "Content type to clean for", + "enums": [ + "video", + "movies", + "tvshows", + "musicvideos" + ], + "name": "content", + "type": "string" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.Export": { + "description": "Exports all items from the video library", + "params": [ + { + "name": "options", + "type": [ + { + "additionalProperties": false, + "properties": { + "path": { + "description": "Path to the directory to where the data should be exported", + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "actorthumbs": { + "default": false, + "description": "Whether to export actor thumbnails", + "type": "boolean" + }, + "images": { + "default": false, + "description": "Whether to export thumbnails and fanart images", + "type": "boolean" + }, + "overwrite": { + "default": false, + "description": "Whether to overwrite existing exported files", + "type": "boolean" + } + }, + "type": "object" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.GetEpisodeDetails": { + "description": "Retrieve details about a specific tv show episode", + "params": [ + { + "$ref": "Library.Id", + "name": "episodeid", + "required": true + }, + { + "$ref": "Video.Fields.Episode", + "name": "properties" + } + ], + "returns": { + "properties": { + "episodedetails": { + "$ref": "Video.Details.Episode" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetEpisodes": { + "description": "Retrieve all tv show episodes", + "params": [ + { + "$ref": "Library.Id", + "default": -1, + "name": "tvshowid" + }, + { + "default": -1, + "minimum": 0, + "name": "season", + "type": "integer" + }, + { + "$ref": "Video.Fields.Episode", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + }, + { + "name": "filter", + "type": [ + { + "additionalProperties": false, + "properties": { + "genreid": { + "$ref": "Library.Id", + "description": "Requires tvshowid to be set", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "genre": { + "description": "Requires tvshowid to be set", + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "year": { + "minimum": 0, + "required": true, + "type": "integer" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "actor": { + "description": "Requires tvshowid to be set", + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "director": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Episodes" + } + ] + } + ], + "returns": { + "properties": { + "episodes": { + "items": { + "$ref": "Video.Details.Episode" + }, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetGenres": { + "description": "Retrieve all genres", + "params": [ + { + "enums": [ + "movie", + "tvshow", + "musicvideo" + ], + "name": "type", + "required": true, + "type": "string" + }, + { + "$ref": "Library.Fields.Genre", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "genres": { + "items": { + "$ref": "Library.Details.Genre" + }, + "required": true, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetInProgressTVShows": { + "description": "Retrieve all in progress tvshows", + "params": [ + { + "$ref": "Video.Fields.TVShow", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "tvshows": { + "items": { + "$ref": "Video.Details.TVShow" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetMovieDetails": { + "description": "Retrieve details about a specific movie", + "params": [ + { + "$ref": "Library.Id", + "name": "movieid", + "required": true + }, + { + "$ref": "Video.Fields.Movie", + "name": "properties" + } + ], + "returns": { + "properties": { + "moviedetails": { + "$ref": "Video.Details.Movie" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetMovieSetDetails": { + "description": "Retrieve details about a specific movie set", + "params": [ + { + "$ref": "Library.Id", + "name": "setid", + "required": true + }, + { + "$ref": "Video.Fields.MovieSet", + "name": "properties" + }, + { + "name": "movies", + "properties": { + "limits": { + "$ref": "List.Limits" + }, + "properties": { + "$ref": "Video.Fields.Movie" + }, + "sort": { + "$ref": "List.Sort" + } + }, + "type": "object" + } + ], + "returns": { + "properties": { + "setdetails": { + "$ref": "Video.Details.MovieSet.Extended" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetMovieSets": { + "description": "Retrieve all movie sets", + "params": [ + { + "$ref": "Video.Fields.MovieSet", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "sets": { + "items": { + "$ref": "Video.Details.MovieSet" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetMovies": { + "description": "Retrieve all movies", + "params": [ + { + "$ref": "Video.Fields.Movie", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + }, + { + "name": "filter", + "type": [ + { + "additionalProperties": false, + "properties": { + "genreid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "genre": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "year": { + "minimum": 0, + "required": true, + "type": "integer" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "actor": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "director": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "studio": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "country": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "setid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "set": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "tag": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Movies" + } + ] + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "movies": { + "items": { + "$ref": "Video.Details.Movie" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetMusicVideoDetails": { + "description": "Retrieve details about a specific music video", + "params": [ + { + "$ref": "Library.Id", + "name": "musicvideoid", + "required": true + }, + { + "$ref": "Video.Fields.MusicVideo", + "name": "properties" + } + ], + "returns": { + "properties": { + "musicvideodetails": { + "$ref": "Video.Details.MusicVideo" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetMusicVideos": { + "description": "Retrieve all music videos", + "params": [ + { + "$ref": "Video.Fields.MusicVideo", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + }, + { + "name": "filter", + "type": [ + { + "additionalProperties": false, + "properties": { + "artist": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "genreid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "genre": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "year": { + "minimum": 0, + "required": true, + "type": "integer" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "director": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "studio": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "tag": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.MusicVideos" + } + ] + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "musicvideos": { + "items": { + "$ref": "Video.Details.MusicVideo" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetRecentlyAddedEpisodes": { + "description": "Retrieve all recently added tv episodes", + "params": [ + { + "$ref": "Video.Fields.Episode", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "episodes": { + "items": { + "$ref": "Video.Details.Episode" + }, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetRecentlyAddedMovies": { + "description": "Retrieve all recently added movies", + "params": [ + { + "$ref": "Video.Fields.Movie", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "movies": { + "items": { + "$ref": "Video.Details.Movie" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetRecentlyAddedMusicVideos": { + "description": "Retrieve all recently added music videos", + "params": [ + { + "$ref": "Video.Fields.MusicVideo", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "musicvideos": { + "items": { + "$ref": "Video.Details.MusicVideo" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetSeasonDetails": { + "description": "Retrieve details about a specific tv show season", + "params": [ + { + "$ref": "Library.Id", + "name": "seasonid", + "required": true + }, + { + "$ref": "Video.Fields.Season", + "name": "properties" + } + ], + "returns": { + "properties": { + "seasondetails": { + "$ref": "Video.Details.Season" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetSeasons": { + "description": "Retrieve all tv seasons", + "params": [ + { + "$ref": "Library.Id", + "default": -1, + "name": "tvshowid" + }, + { + "$ref": "Video.Fields.Season", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "seasons": { + "items": { + "$ref": "Video.Details.Season" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetTVShowDetails": { + "description": "Retrieve details about a specific tv show", + "params": [ + { + "$ref": "Library.Id", + "name": "tvshowid", + "required": true + }, + { + "$ref": "Video.Fields.TVShow", + "name": "properties" + } + ], + "returns": { + "properties": { + "tvshowdetails": { + "$ref": "Video.Details.TVShow" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetTVShows": { + "description": "Retrieve all tv shows", + "params": [ + { + "$ref": "Video.Fields.TVShow", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + }, + { + "name": "filter", + "type": [ + { + "additionalProperties": false, + "properties": { + "genreid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "genre": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "year": { + "minimum": 0, + "required": true, + "type": "integer" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "actor": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "studio": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "tag": { + "minLength": 1, + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.TVShows" + } + ] + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "tvshows": { + "items": { + "$ref": "Video.Details.TVShow" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.GetTags": { + "description": "Retrieve all tags", + "params": [ + { + "enums": [ + "movie", + "tvshow", + "musicvideo" + ], + "name": "type", + "required": true, + "type": "string" + }, + { + "$ref": "Library.Fields.Tag", + "name": "properties" + }, + { + "$ref": "List.Limits", + "name": "limits" + }, + { + "$ref": "List.Sort", + "name": "sort" + } + ], + "returns": { + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "tags": { + "items": { + "$ref": "Library.Details.Tag" + }, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + "type": "method" + }, + "VideoLibrary.RefreshEpisode": { + "description": "Refresh the given episode in the library", + "params": [ + { + "$ref": "Library.Id", + "name": "episodeid", + "required": true + }, + { + "default": false, + "description": "Whether or not to ignore a local NFO if present.", + "name": "ignorenfo", + "type": "boolean" + }, + { + "default": "", + "description": "Title to use for searching (instead of determining it from the item's filename/path).", + "name": "title", + "type": "string" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.RefreshMovie": { + "description": "Refresh the given movie in the library", + "params": [ + { + "$ref": "Library.Id", + "name": "movieid", + "required": true + }, + { + "default": false, + "description": "Whether or not to ignore a local NFO if present.", + "name": "ignorenfo", + "type": "boolean" + }, + { + "default": "", + "description": "Title to use for searching (instead of determining it from the item's filename/path).", + "name": "title", + "type": "string" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.RefreshMusicVideo": { + "description": "Refresh the given music video in the library", + "params": [ + { + "$ref": "Library.Id", + "name": "musicvideoid", + "required": true + }, + { + "default": false, + "description": "Whether or not to ignore a local NFO if present.", + "name": "ignorenfo", + "type": "boolean" + }, + { + "default": "", + "description": "Title to use for searching (instead of determining it from the item's filename/path).", + "name": "title", + "type": "string" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.RefreshTVShow": { + "description": "Refresh the given tv show in the library", + "params": [ + { + "$ref": "Library.Id", + "name": "tvshowid", + "required": true + }, + { + "default": false, + "description": "Whether or not to ignore a local NFO if present.", + "name": "ignorenfo", + "type": "boolean" + }, + { + "default": false, + "description": "Whether or not to refresh all episodes belonging to the TV show.", + "name": "refreshepisodes", + "type": "boolean" + }, + { + "default": "", + "description": "Title to use for searching (instead of determining it from the item's filename/path).", + "name": "title", + "type": "string" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.RemoveEpisode": { + "description": "Removes the given episode from the library", + "params": [ + { + "$ref": "Library.Id", + "name": "episodeid", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.RemoveMovie": { + "description": "Removes the given movie from the library", + "params": [ + { + "$ref": "Library.Id", + "name": "movieid", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.RemoveMusicVideo": { + "description": "Removes the given music video from the library", + "params": [ + { + "$ref": "Library.Id", + "name": "musicvideoid", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.RemoveTVShow": { + "description": "Removes the given tv show from the library", + "params": [ + { + "$ref": "Library.Id", + "name": "tvshowid", + "required": true + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.Scan": { + "description": "Scans the video sources for new library items", + "params": [ + { + "default": "", + "name": "directory", + "type": "string" + }, + { + "default": true, + "description": "Whether or not to show the progress bar or any other GUI dialog", + "name": "showdialogs", + "type": "boolean" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.SetEpisodeDetails": { + "description": "Update the given episode with the given details", + "params": [ + { + "$ref": "Library.Id", + "name": "episodeid", + "required": true + }, + { + "$ref": "Optional.String", + "default": null, + "name": "title" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "playcount" + }, + { + "$ref": "Optional.Integer", + "default": null, + "description": "Runtime in seconds", + "name": "runtime" + }, + { + "default": null, + "name": "director", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.String", + "default": null, + "name": "plot" + }, + { + "$ref": "Optional.Number", + "default": null, + "name": "rating" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "votes" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "lastplayed" + }, + { + "default": null, + "name": "writer", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.String", + "default": null, + "name": "firstaired" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "productioncode" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "season" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "episode" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "originaltitle" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "thumbnail" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "fanart" + }, + { + "default": null, + "name": "art", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.Artwork.Set" + } + ] + }, + { + "default": null, + "name": "resume", + "type": [ + { + "type": "null" + }, + { + "$ref": "Video.Resume" + } + ] + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "userrating" + }, + { + "$ref": "Video.Ratings.Set", + "name": "ratings" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "dateadded" + }, + { + "default": null, + "name": "uniqueid", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.UniqueID.Set" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.SetMovieDetails": { + "description": "Update the given movie with the given details", + "params": [ + { + "$ref": "Library.Id", + "name": "movieid", + "required": true + }, + { + "$ref": "Optional.String", + "default": null, + "name": "title" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "playcount" + }, + { + "$ref": "Optional.Integer", + "default": null, + "description": "Runtime in seconds", + "name": "runtime" + }, + { + "default": null, + "name": "director", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "studio", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.Integer", + "default": null, + "description": "linked with premiered. Overridden by premiered parameter", + "name": "year" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "plot" + }, + { + "default": null, + "name": "genre", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.Number", + "default": null, + "name": "rating" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "mpaa" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "imdbnumber" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "votes" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "lastplayed" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "originaltitle" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "trailer" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "tagline" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "plotoutline" + }, + { + "default": null, + "name": "writer", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "country", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "top250" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "sorttitle" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "set" + }, + { + "default": null, + "name": "showlink", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.String", + "default": null, + "name": "thumbnail" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "fanart" + }, + { + "default": null, + "name": "tag", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "art", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.Artwork.Set" + } + ] + }, + { + "default": null, + "name": "resume", + "type": [ + { + "type": "null" + }, + { + "$ref": "Video.Resume" + } + ] + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "userrating" + }, + { + "$ref": "Video.Ratings.Set", + "name": "ratings" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "dateadded" + }, + { + "$ref": "Optional.String", + "default": null, + "description": "linked with year. Overrides year", + "name": "premiered" + }, + { + "default": null, + "name": "uniqueid", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.UniqueID.Set" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.SetMovieSetDetails": { + "description": "Update the given movie set with the given details", + "params": [ + { + "$ref": "Library.Id", + "name": "setid", + "required": true + }, + { + "$ref": "Optional.String", + "default": null, + "name": "title" + }, + { + "default": null, + "name": "art", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.Artwork.Set" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.SetMusicVideoDetails": { + "description": "Update the given music video with the given details", + "params": [ + { + "$ref": "Library.Id", + "name": "musicvideoid", + "required": true + }, + { + "$ref": "Optional.String", + "default": null, + "name": "title" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "playcount" + }, + { + "$ref": "Optional.Integer", + "default": null, + "description": "Runtime in seconds", + "name": "runtime" + }, + { + "default": null, + "name": "director", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "studio", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.Integer", + "default": null, + "description": "linked with premiered. Overridden by premiered parameter", + "name": "year" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "plot" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "album" + }, + { + "default": null, + "name": "artist", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "genre", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "track" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "lastplayed" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "thumbnail" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "fanart" + }, + { + "default": null, + "name": "tag", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "art", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.Artwork.Set" + } + ] + }, + { + "default": null, + "name": "resume", + "type": [ + { + "type": "null" + }, + { + "$ref": "Video.Resume" + } + ] + }, + { + "$ref": "Optional.Number", + "default": null, + "name": "rating" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "userrating" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "dateadded" + }, + { + "$ref": "Optional.String", + "default": null, + "description": "linked with year. Overrides year", + "name": "premiered" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.SetSeasonDetails": { + "description": "Update the given season with the given details", + "params": [ + { + "$ref": "Library.Id", + "name": "seasonid", + "required": true + }, + { + "default": null, + "name": "art", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.Artwork.Set" + } + ] + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "userrating" + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "VideoLibrary.SetTVShowDetails": { + "description": "Update the given tvshow with the given details", + "params": [ + { + "$ref": "Library.Id", + "name": "tvshowid", + "required": true + }, + { + "$ref": "Optional.String", + "default": null, + "name": "title" + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "playcount" + }, + { + "default": null, + "name": "studio", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.String", + "default": null, + "name": "plot" + }, + { + "default": null, + "name": "genre", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "$ref": "Optional.Number", + "default": null, + "name": "rating" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "mpaa" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "imdbnumber" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "premiered" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "votes" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "lastplayed" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "originaltitle" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "sorttitle" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "episodeguide" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "thumbnail" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "fanart" + }, + { + "default": null, + "name": "tag", + "type": [ + { + "type": "null" + }, + { + "$ref": "Array.String" + } + ] + }, + { + "default": null, + "name": "art", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.Artwork.Set" + } + ] + }, + { + "$ref": "Optional.Integer", + "default": null, + "name": "userrating" + }, + { + "$ref": "Video.Ratings.Set", + "name": "ratings" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "dateadded" + }, + { + "$ref": "Optional.Integer", + "default": null, + "description": "Runtime in seconds", + "name": "runtime" + }, + { + "$ref": "Optional.String", + "default": null, + "name": "status" + }, + { + "default": null, + "name": "uniqueid", + "type": [ + { + "type": "null" + }, + { + "$ref": "Media.UniqueID.Set" + } + ] + } + ], + "returns": { + "type": "string" + }, + "type": "method" + }, + "XBMC.GetInfoBooleans": { + "description": "Retrieve info booleans about Kodi and the system", + "params": [ + { + "items": { + "type": "string" + }, + "minItems": 1, + "name": "booleans", + "required": true, + "type": "array" + } + ], + "returns": { + "additionalProperties": { + "default": "", + "type": "string" + }, + "description": "Object containing key-value pairs of the retrieved info booleans", + "type": "object" + }, + "type": "method" + }, + "XBMC.GetInfoLabels": { + "description": "Retrieve info labels about Kodi and the system", + "params": [ + { + "description": "See http://kodi.wiki/view/InfoLabels for a list of possible info labels", + "items": { + "type": "string" + }, + "minItems": 1, + "name": "labels", + "required": true, + "type": "array" + } + ], + "returns": { + "additionalProperties": { + "default": "", + "type": "string" + }, + "description": "Object containing key-value pairs of the retrieved info labels", + "type": "object" + }, + "type": "method" + } + }, + "notifications": { + "Application.OnVolumeChanged": { + "description": "The volume of the application has changed.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "muted": { + "required": true, + "type": "boolean" + }, + "volume": { + "maximum": 100, + "minimum": 0, + "required": true, + "type": "integer" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "AudioLibrary.OnCleanFinished": { + "description": "The audio library has been cleaned.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "AudioLibrary.OnCleanStarted": { + "description": "An audio library clean operation has started.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "AudioLibrary.OnExport": { + "description": "An audio library export has finished.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "failcount": { + "default": 0, + "minimum": 0, + "required": false, + "type": "integer" + }, + "file": { + "default": "", + "required": false, + "type": "string" + } + }, + "required": false, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "AudioLibrary.OnRemove": { + "description": "An audio item has been removed.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "id": { + "$ref": "Library.Id", + "required": true + }, + "transaction": { + "$ref": "Optional.Boolean", + "description": "True if the removal is being performed within a transaction." + }, + "type": { + "$ref": "Notifications.Library.Audio.Type", + "required": true + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "AudioLibrary.OnScanFinished": { + "description": "Scanning the audio library has been finished.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "AudioLibrary.OnScanStarted": { + "description": "An audio library scan has started.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "AudioLibrary.OnUpdate": { + "description": "An audio item has been updated.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "added": { + "$ref": "Optional.Boolean", + "description": "True if the update is for a newly added item." + }, + "id": { + "$ref": "Library.Id", + "required": true + }, + "transaction": { + "$ref": "Optional.Boolean", + "description": "True if the update is being performed within a transaction." + }, + "type": { + "enum": [ + "song" + ], + "id": "Notifications.Library.Audio.Type", + "required": true, + "type": "string" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "GUI.OnDPMSActivated": { + "description": "Energy saving/DPMS has been activated.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "GUI.OnDPMSDeactivated": { + "description": "Energy saving/DPMS has been deactivated.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "GUI.OnScreensaverActivated": { + "description": "The screensaver has been activated.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "GUI.OnScreensaverDeactivated": { + "description": "The screensaver has been deactivated.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "shuttingdown": { + "required": true, + "type": "boolean" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "Input.OnInputFinished": { + "description": "The user has provided the requested input.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "Input.OnInputRequested": { + "description": "The user is requested to provide some information.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "title": { + "type": "string" + }, + "type": { + "enum": [ + "keyboard", + "time", + "date", + "ip", + "password", + "numericpassword", + "number", + "seconds" + ], + "required": true, + "type": "string" + }, + "value": { + "required": true, + "type": "string" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "Player.OnPause": { + "description": "Playback of a media item has been paused. If there is no ID available extra information will be provided.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "$ref": "Player.Notifications.Data", + "name": "data", + "required": true + } + ], + "returns": null, + "type": "notification" + }, + "Player.OnPlay": { + "description": "Playback of a media item has been started or the playback speed has changed. If there is no ID available extra information will be provided.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "$ref": "Player.Notifications.Data", + "name": "data", + "required": true + } + ], + "returns": null, + "type": "notification" + }, + "Player.OnPropertyChanged": { + "description": "A property of the playing items has changed.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "player": { + "$ref": "Player.Notifications.Player", + "required": true + }, + "property": { + "$ref": "Player.Property.Value" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "Player.OnSeek": { + "description": "The playback position has been changed. If there is no ID available extra information will be provided.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "item": { + "$ref": "Notifications.Item" + }, + "player": { + "$ref": "Player.Notifications.Player.Seek", + "required": true + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "Player.OnSpeedChanged": { + "description": "Speed of the playback of a media item has been changed. If there is no ID available extra information will be provided.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "$ref": "Player.Notifications.Data", + "name": "data", + "required": true + } + ], + "returns": null, + "type": "notification" + }, + "Player.OnStop": { + "description": "Playback of a media item has been stopped. If there is no ID available extra information will be provided.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "end": { + "description": "Whether the player has reached the end of the playable item(s) or not", + "required": true, + "type": "boolean" + }, + "item": { + "$ref": "Notifications.Item" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "Playlist.OnAdd": { + "description": "A playlist item has been added.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "item": { + "$ref": "Notifications.Item" + }, + "playlistid": { + "$ref": "Playlist.Id", + "required": true + }, + "position": { + "$ref": "Playlist.Position" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "Playlist.OnClear": { + "description": "A playlist item has been cleared.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "playlistid": { + "$ref": "Playlist.Id", + "required": true + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "Playlist.OnRemove": { + "description": "A playlist item has been removed.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "playlistid": { + "$ref": "Playlist.Id", + "required": true + }, + "position": { + "$ref": "Playlist.Position" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "System.OnLowBattery": { + "description": "The system is on low battery.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "System.OnQuit": { + "description": "Kodi will be closed.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "exitcode": { + "minimum": 0, + "required": true, + "type": "integer" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "System.OnRestart": { + "description": "The system will be restarted.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "System.OnSleep": { + "description": "The system will be suspended.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "System.OnWake": { + "description": "The system woke up from suspension.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "VideoLibrary.OnCleanFinished": { + "description": "The video library has been cleaned.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "VideoLibrary.OnCleanStarted": { + "description": "A video library clean operation has started.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "VideoLibrary.OnExport": { + "description": "A video library export has finished.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "failcount": { + "default": 0, + "minimum": 0, + "required": false, + "type": "integer" + }, + "file": { + "default": "", + "required": false, + "type": "string" + }, + "root": { + "default": "", + "required": false, + "type": "string" + } + }, + "required": false, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "VideoLibrary.OnRemove": { + "description": "A video item has been removed.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "id": { + "$ref": "Library.Id", + "required": true + }, + "transaction": { + "$ref": "Optional.Boolean", + "description": "True if the removal is being performed within a transaction." + }, + "type": { + "$ref": "Notifications.Library.Video.Type", + "required": true + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + }, + "VideoLibrary.OnScanFinished": { + "description": "Scanning the video library has been finished.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "VideoLibrary.OnScanStarted": { + "description": "A video library scan has started.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "required": true, + "type": "null" + } + ], + "returns": null, + "type": "notification" + }, + "VideoLibrary.OnUpdate": { + "description": "A video item has been updated.", + "params": [ + { + "name": "sender", + "required": true, + "type": "string" + }, + { + "name": "data", + "properties": { + "added": { + "$ref": "Optional.Boolean", + "description": "True if the update is for a newly added item." + }, + "id": { + "$ref": "Library.Id", + "required": true + }, + "playcount": { + "default": -1, + "minimum": 0, + "type": "integer" + }, + "transaction": { + "$ref": "Optional.Boolean", + "description": "True if the update is being performed within a transaction." + }, + "type": { + "enum": [ + "movie", + "tvshow", + "episode", + "musicvideo" + ], + "id": "Notifications.Library.Video.Type", + "required": true, + "type": "string" + } + }, + "required": true, + "type": "object" + } + ], + "returns": null, + "type": "notification" + } + }, + "types": { + "Addon.Content": { + "default": "unknown", + "enums": [ + "unknown", + "video", + "audio", + "image", + "executable" + ], + "id": "Addon.Content", + "type": "string" + }, + "Addon.Details": { + "extends": "Item.Details.Base", + "id": "Addon.Details", + "properties": { + "addonid": { + "required": true, + "type": "string" + }, + "author": { + "default": "", + "type": "string" + }, + "broken": { + "default": null, + "type": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] + }, + "dependencies": { + "items": { + "properties": { + "addonid": { + "required": true, + "type": "string" + }, + "optional": { + "required": true, + "type": "boolean" + }, + "version": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "description": { + "default": "", + "type": "string" + }, + "disclaimer": { + "default": "", + "type": "string" + }, + "enabled": { + "default": false, + "type": "boolean" + }, + "extrainfo": { + "items": { + "properties": { + "key": { + "required": true, + "type": "string" + }, + "value": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "fanart": { + "default": "", + "type": "string" + }, + "installed": { + "default": false, + "type": "boolean" + }, + "name": { + "default": "", + "type": "string" + }, + "path": { + "default": "", + "type": "string" + }, + "rating": { + "default": 0, + "type": "integer" + }, + "summary": { + "default": "", + "type": "string" + }, + "thumbnail": { + "default": "", + "type": "string" + }, + "type": { + "$ref": "Addon.Types", + "required": true + }, + "version": { + "default": "", + "type": "string" + } + } + }, + "Addon.Fields": { + "extends": "Item.Fields.Base", + "id": "Addon.Fields", + "items": { + "enums": [ + "name", + "version", + "summary", + "description", + "path", + "author", + "thumbnail", + "disclaimer", + "fanart", + "dependencies", + "broken", + "extrainfo", + "rating", + "enabled", + "installed" + ], + "type": "string" + } + }, + "Addon.Types": { + "default": "unknown", + "enums": [ + "unknown", + "xbmc.player.musicviz", + "xbmc.gui.skin", + "xbmc.pvrclient", + "kodi.adsp", + "kodi.inputstream", + "kodi.gameclient", + "kodi.peripheral", + "xbmc.python.script", + "xbmc.python.weather", + "xbmc.subtitle.module", + "xbmc.python.lyrics", + "xbmc.metadata.scraper.albums", + "xbmc.metadata.scraper.artists", + "xbmc.metadata.scraper.movies", + "xbmc.metadata.scraper.musicvideos", + "xbmc.metadata.scraper.tvshows", + "xbmc.ui.screensaver", + "xbmc.python.pluginsource", + "xbmc.addon.repository", + "xbmc.webinterface", + "xbmc.service", + "kodi.audioencoder", + "kodi.context.item", + "kodi.audiodecoder", + "kodi.resource.images", + "kodi.resource.language", + "kodi.resource.uisounds", + "kodi.resource.games", + "kodi.resource.font", + "kodi.vfs", + "kodi.imagedecoder", + "xbmc.metadata.scraper.library", + "xbmc.python.library", + "xbmc.python.module", + "kodi.game.controller", + "", + "xbmc.addon.video", + "xbmc.addon.audio", + "xbmc.addon.image", + "xbmc.addon.executable", + "kodi.addon.game" + ], + "id": "Addon.Types", + "type": "string" + }, + "Application.Property.Name": { + "default": "volume", + "enums": [ + "volume", + "muted", + "name", + "version" + ], + "id": "Application.Property.Name", + "type": "string" + }, + "Application.Property.Value": { + "id": "Application.Property.Value", + "properties": { + "muted": { + "default": false, + "type": "boolean" + }, + "name": { + "default": "", + "minLength": 1, + "type": "string" + }, + "version": { + "properties": { + "major": { + "minimum": 0, + "required": true, + "type": "integer" + }, + "minor": { + "minimum": 0, + "required": true, + "type": "integer" + }, + "revision": { + "default": null, + "type": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "tag": { + "enums": [ + "prealpha", + "alpha", + "beta", + "releasecandidate", + "stable" + ], + "required": true, + "type": "string" + }, + "tagversion": { + "default": "", + "type": "string" + } + }, + "type": "object" + }, + "volume": { + "default": 0, + "maximum": 100, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "Array.Integer": { + "id": "Array.Integer", + "items": { + "type": "integer" + }, + "type": "array" + }, + "Array.String": { + "id": "Array.String", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "Audio.Album.ReleaseType": { + "default": "album", + "enums": [ + "album", + "single" + ], + "id": "Audio.Album.ReleaseType", + "type": "string" + }, + "Audio.Artist.Roles": { + "id": "Audio.Artist.Roles", + "items": { + "additionalProperties": false, + "description": "The various roles contributed by an artist to one or more songs", + "properties": { + "role": { + "required": true, + "type": "string" + }, + "roleid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + "type": "array" + }, + "Audio.Contributors": { + "id": "Audio.Contributors", + "items": { + "additionalProperties": false, + "description": "The artist and the role they contribute to a song", + "properties": { + "artistid": { + "$ref": "Library.Id", + "required": true + }, + "name": { + "required": true, + "type": "string" + }, + "role": { + "required": true, + "type": "string" + }, + "roleid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + "type": "array" + }, + "Audio.Details.Album": { + "extends": "Audio.Details.Media", + "id": "Audio.Details.Album", + "properties": { + "albumid": { + "$ref": "Library.Id", + "required": true + }, + "albumlabel": { + "default": "", + "type": "string" + }, + "compilation": { + "default": false, + "type": "boolean" + }, + "description": { + "default": "", + "type": "string" + }, + "mood": { + "$ref": "Array.String" + }, + "musicbrainzalbumid": { + "default": "", + "type": "string" + }, + "musicbrainzreleasegroupid": { + "default": "", + "type": "string" + }, + "playcount": { + "default": 0, + "type": "integer" + }, + "releasetype": { + "$ref": "Audio.Album.ReleaseType", + "default": "album" + }, + "songgenres": { + "$ref": "Audio.Details.Genres" + }, + "style": { + "$ref": "Array.String" + }, + "theme": { + "$ref": "Array.String" + }, + "type": { + "default": "", + "type": "string" + } + } + }, + "Audio.Details.Artist": { + "extends": "Audio.Details.Base", + "id": "Audio.Details.Artist", + "properties": { + "artist": { + "required": true, + "type": "string" + }, + "artistid": { + "$ref": "Library.Id", + "required": true + }, + "born": { + "default": "", + "type": "string" + }, + "compilationartist": { + "default": false, + "type": "boolean" + }, + "description": { + "default": "", + "type": "string" + }, + "died": { + "default": "", + "type": "string" + }, + "disambiguation": { + "default": "", + "type": "string" + }, + "disbanded": { + "default": "", + "type": "string" + }, + "formed": { + "default": "", + "type": "string" + }, + "gender": { + "default": "", + "type": "string" + }, + "instrument": { + "$ref": "Array.String" + }, + "isalbumartist": { + "default": false, + "type": "boolean" + }, + "mood": { + "$ref": "Array.String" + }, + "musicbrainzartistid": { + "$ref": "Array.String" + }, + "roles": { + "$ref": "Audio.Artist.Roles" + }, + "songgenres": { + "$ref": "Audio.Details.Genres" + }, + "sortname": { + "default": "", + "type": "string" + }, + "style": { + "$ref": "Array.String" + }, + "type": { + "default": "", + "type": "string" + }, + "yearsactive": { + "$ref": "Array.String" + } + } + }, + "Audio.Details.Base": { + "extends": "Media.Details.Base", + "id": "Audio.Details.Base", + "properties": { + "art": { + "$ref": "Media.Artwork" + }, + "dateadded": { + "default": "", + "type": "string" + }, + "genre": { + "$ref": "Array.String" + } + } + }, + "Audio.Details.Genres": { + "id": "Audio.Details.Genres", + "items": { + "properties": { + "genreid": { + "$ref": "Library.Id", + "required": true + }, + "title": { + "default": "", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "Audio.Details.Media": { + "extends": "Audio.Details.Base", + "id": "Audio.Details.Media", + "properties": { + "artist": { + "$ref": "Array.String" + }, + "artistid": { + "$ref": "Array.Integer" + }, + "displayartist": { + "default": "", + "type": "string" + }, + "musicbrainzalbumartistid": { + "$ref": "Array.String" + }, + "rating": { + "default": 0, + "type": "number" + }, + "sortartist": { + "default": "", + "type": "string" + }, + "title": { + "default": "", + "type": "string" + }, + "userrating": { + "default": 0, + "type": "integer" + }, + "votes": { + "default": 0, + "type": "integer" + }, + "year": { + "default": 0, + "type": "integer" + } + } + }, + "Audio.Details.Role": { + "extends": "Item.Details.Base", + "id": "Audio.Details.Role", + "properties": { + "roleid": { + "$ref": "Library.Id", + "required": true + }, + "title": { + "default": "", + "type": "string" + } + } + }, + "Audio.Details.Song": { + "extends": "Audio.Details.Media", + "id": "Audio.Details.Song", + "properties": { + "album": { + "default": "", + "type": "string" + }, + "albumartist": { + "$ref": "Array.String" + }, + "albumartistid": { + "$ref": "Array.Integer" + }, + "albumid": { + "$ref": "Library.Id", + "default": -1 + }, + "albumreleasetype": { + "$ref": "Audio.Album.ReleaseType", + "default": "album" + }, + "comment": { + "default": "", + "type": "string" + }, + "contributors": { + "$ref": "Audio.Contributors" + }, + "disc": { + "default": 0, + "type": "integer" + }, + "displaycomposer": { + "default": "", + "type": "string" + }, + "displayconductor": { + "default": "", + "type": "string" + }, + "displaylyricist": { + "default": "", + "type": "string" + }, + "displayorchestra": { + "default": "", + "type": "string" + }, + "duration": { + "default": 0, + "type": "integer" + }, + "file": { + "default": "", + "type": "string" + }, + "genreid": { + "$ref": "Array.Integer" + }, + "lastplayed": { + "default": "", + "type": "string" + }, + "lyrics": { + "default": "", + "type": "string" + }, + "mood": { + "default": "", + "type": "string" + }, + "musicbrainzartistid": { + "$ref": "Array.String" + }, + "musicbrainztrackid": { + "default": "", + "type": "string" + }, + "playcount": { + "default": 0, + "type": "integer" + }, + "songid": { + "$ref": "Library.Id", + "required": true + }, + "track": { + "default": 0, + "type": "integer" + } + } + }, + "Audio.Fields.Album": { + "extends": "Item.Fields.Base", + "id": "Audio.Fields.Album", + "items": { + "description": "Requesting the songgenres and/or artistid field will result in increased response times", + "enums": [ + "title", + "description", + "artist", + "genre", + "theme", + "mood", + "style", + "type", + "albumlabel", + "rating", + "votes", + "userrating", + "year", + "musicbrainzalbumid", + "musicbrainzalbumartistid", + "fanart", + "thumbnail", + "playcount", + "artistid", + "displayartist", + "compilation", + "releasetype", + "dateadded", + "sortartist", + "musicbrainzreleasegroupid", + "songgenres", + "art" + ], + "type": "string" + } + }, + "Audio.Fields.Artist": { + "extends": "Item.Fields.Base", + "id": "Audio.Fields.Artist", + "items": { + "description": "Requesting the (song)genreid/genre, or roleid/role fields will result in increased response times", + "enums": [ + "instrument", + "style", + "mood", + "born", + "formed", + "description", + "genre", + "died", + "disbanded", + "yearsactive", + "musicbrainzartistid", + "fanart", + "thumbnail", + "compilationartist", + "dateadded", + "roles", + "songgenres", + "isalbumartist", + "sortname", + "type", + "gender", + "disambiguation", + "art" + ], + "type": "string" + } + }, + "Audio.Fields.Role": { + "extends": "Item.Fields.Base", + "id": "Audio.Fields.Role", + "items": { + "enums": [ + "title" + ], + "type": "string" + } + }, + "Audio.Fields.Song": { + "extends": "Item.Fields.Base", + "id": "Audio.Fields.Song", + "items": { + "description": "Requesting the genreid, artistid and/or albumartistid field will result in increased response times", + "enums": [ + "title", + "artist", + "albumartist", + "genre", + "year", + "rating", + "album", + "track", + "duration", + "comment", + "lyrics", + "musicbrainztrackid", + "musicbrainzartistid", + "musicbrainzalbumid", + "musicbrainzalbumartistid", + "playcount", + "fanart", + "thumbnail", + "file", + "albumid", + "lastplayed", + "disc", + "genreid", + "artistid", + "displayartist", + "albumartistid", + "albumreleasetype", + "dateadded", + "votes", + "userrating", + "mood", + "contributors", + "displaycomposer", + "displayconductor", + "displayorchestra", + "displaylyricist", + "sortartist", + "art" + ], + "type": "string" + } + }, + "Audio.Property.Name": { + "default": "missingartistid", + "enums": [ + "missingartistid" + ], + "id": "Audio.Property.Name", + "type": "string" + }, + "Audio.Property.Value": { + "id": "Audio.Property.Value", + "properties": { + "missingartistid": { + "$ref": "Library.Id", + "default": -1 + } + }, + "type": "object" + }, + "Configuration": { + "id": "Configuration", + "properties": { + "notifications": { + "$ref": "Configuration.Notifications", + "required": true + } + }, + "required": true, + "type": "object" + }, + "Configuration.Notifications": { + "additionalProperties": false, + "id": "Configuration.Notifications", + "properties": { + "application": { + "required": true, + "type": "boolean" + }, + "audiolibrary": { + "required": true, + "type": "boolean" + }, + "gui": { + "required": true, + "type": "boolean" + }, + "input": { + "required": true, + "type": "boolean" + }, + "other": { + "required": true, + "type": "boolean" + }, + "player": { + "required": true, + "type": "boolean" + }, + "playlist": { + "required": true, + "type": "boolean" + }, + "pvr": { + "required": true, + "type": "boolean" + }, + "system": { + "required": true, + "type": "boolean" + }, + "videolibrary": { + "required": true, + "type": "boolean" + } + }, + "type": "object" + }, + "Favourite.Details.Favourite": { + "additionalProperties": false, + "id": "Favourite.Details.Favourite", + "properties": { + "path": { + "default": "", + "type": "string" + }, + "thumbnail": { + "default": "", + "type": "string" + }, + "title": { + "required": true, + "type": "string" + }, + "type": { + "$ref": "Favourite.Type", + "required": true + }, + "window": { + "default": "", + "type": "string" + }, + "windowparameter": { + "default": "", + "type": "string" + } + }, + "type": "object" + }, + "Favourite.Fields.Favourite": { + "extends": "Item.Fields.Base", + "id": "Favourite.Fields.Favourite", + "items": { + "enums": [ + "window", + "windowparameter", + "thumbnail", + "path" + ], + "type": "string" + } + }, + "Favourite.Type": { + "default": "media", + "enums": [ + "media", + "window", + "script", + "unknown" + ], + "id": "Favourite.Type", + "type": "string" + }, + "Files.Media": { + "default": "video", + "enums": [ + "video", + "music", + "pictures", + "files", + "programs" + ], + "id": "Files.Media", + "type": "string" + }, + "GUI.Property.Name": { + "default": "currentwindow", + "enums": [ + "currentwindow", + "currentcontrol", + "skin", + "fullscreen", + "stereoscopicmode" + ], + "id": "GUI.Property.Name", + "type": "string" + }, + "GUI.Property.Value": { + "id": "GUI.Property.Value", + "properties": { + "currentcontrol": { + "properties": { + "label": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "currentwindow": { + "properties": { + "id": { + "required": true, + "type": "integer" + }, + "label": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "fullscreen": { + "default": false, + "type": "boolean" + }, + "skin": { + "properties": { + "id": { + "minLength": 1, + "required": true, + "type": "string" + }, + "name": { + "default": "", + "type": "string" + } + }, + "type": "object" + }, + "stereoscopicmode": { + "$ref": "GUI.Stereoscopy.Mode" + } + }, + "type": "object" + }, + "GUI.Stereoscopy.Mode": { + "id": "GUI.Stereoscopy.Mode", + "properties": { + "label": { + "required": true, + "type": "string" + }, + "mode": { + "enums": [ + "off", + "split_vertical", + "split_horizontal", + "row_interleaved", + "hardware_based", + "anaglyph_cyan_red", + "anaglyph_green_magenta", + "anaglyph_yellow_blue", + "monoscopic" + ], + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "GUI.Window": { + "default": "accesspoints", + "enums": [ + "accesspoints", + "addon", + "addonbrowser", + "addoninformation", + "addonsettings", + "appearancesettings", + "audiodspmanager", + "busydialog", + "contentsettings", + "contextmenu", + "eventlog", + "extendedprogressdialog", + "favourites", + "filebrowser", + "filemanager", + "fullscreengame", + "fullscreeninfo", + "fullscreenlivetv", + "fullscreenradio", + "fullscreenvideo", + "gamecontrollers", + "gameosd", + "gamepadinput", + "games", + "gamesettings", + "gamevideofilter", + "gameviewmode", + "gamevolume", + "home", + "infoprovidersettings", + "interfacesettings", + "libexportsettings", + "locksettings", + "loginscreen", + "mediafilter", + "mediasettings", + "mediasource", + "movieinformation", + "music", + "musicinformation", + "musicosd", + "musicplaylist", + "musicplaylisteditor", + "networksetup", + "notification", + "numericinput", + "okdialog", + "osdaudiodspsettings", + "osdaudiosettings", + "osdcmssettings", + "osdsubtitlesettings", + "osdvideosettings", + "peripheralsettings", + "pictureinfo", + "pictures", + "playercontrols", + "playerprocessinfo", + "playersettings", + "profiles", + "profilesettings", + "programs", + "progressdialog", + "pvrchannelguide", + "pvrchannelmanager", + "pvrchannelscan", + "pvrgroupmanager", + "pvrguideinfo", + "pvrguidesearch", + "pvrosdchannels", + "pvrosdguide", + "pvrosdteletext", + "pvrradiordsinfo", + "pvrrecordinginfo", + "pvrsettings", + "pvrtimersetting", + "pvrupdateprogress", + "radiochannels", + "radioguide", + "radiorecordings", + "radiosearch", + "radiotimerrules", + "radiotimers", + "screencalibration", + "screensaver", + "seekbar", + "selectdialog", + "servicesettings", + "settings", + "shutdownmenu", + "skinsettings", + "sliderdialog", + "slideshow", + "smartplaylisteditor", + "smartplaylistrule", + "songinformation", + "splash", + "startup", + "startwindow", + "submenu", + "subtitlesearch", + "systeminfo", + "systemsettings", + "teletext", + "testpattern", + "textviewer", + "tvchannels", + "tvguide", + "tvrecordings", + "tvsearch", + "tvtimerrules", + "tvtimers", + "videobookmarks", + "videomenu", + "videoosd", + "videoplaylist", + "videos", + "videotimeseek", + "virtualkeyboard", + "visualisation", + "visualisationpresetlist", + "volumebar", + "weather", + "yesnodialog" + ], + "id": "GUI.Window", + "type": "string" + }, + "Global.IncrementDecrement": { + "default": "increment", + "enums": [ + "increment", + "decrement" + ], + "id": "Global.IncrementDecrement", + "type": "string" + }, + "Global.String.NotEmpty": { + "default": "", + "id": "Global.String.NotEmpty", + "minLength": 1, + "type": "string" + }, + "Global.Time": { + "additionalProperties": false, + "id": "Global.Time", + "properties": { + "hours": { + "maximum": 23, + "minimum": 0, + "required": true, + "type": "integer" + }, + "milliseconds": { + "maximum": 999, + "minimum": 0, + "required": true, + "type": "integer" + }, + "minutes": { + "maximum": 59, + "minimum": 0, + "required": true, + "type": "integer" + }, + "seconds": { + "maximum": 59, + "minimum": 0, + "required": true, + "type": "integer" + } + }, + "type": "object" + }, + "Global.Toggle": { + "default": null, + "id": "Global.Toggle", + "type": [ + { + "type": "boolean" + }, + { + "enums": [ + "toggle" + ], + "type": "string" + } + ] + }, + "Global.Weekday": { + "default": "monday", + "enums": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + "sunday" + ], + "id": "Global.Weekday", + "type": "string" + }, + "Input.Action": { + "default": "analogfastforward", + "enums": [ + "analogfastforward", + "analogmove", + "analogmovexleft", + "analogmovexright", + "analogmoveydown", + "analogmoveyup", + "analogrewind", + "analogseekback", + "analogseekforward", + "aspectratio", + "audiodelay", + "audiodelayminus", + "audiodelayplus", + "audionextlanguage", + "audiotoggledigital", + "back", + "backspace", + "bigstepback", + "bigstepforward", + "blue", + "browsesubtitle", + "channeldown", + "channelnumberseparator", + "channelup", + "chapterorbigstepback", + "chapterorbigstepforward", + "close", + "codecinfo", + "contextmenu", + "copy", + "createbookmark", + "createepisodebookmark", + "cursorleft", + "cursorright", + "cyclesubtitle", + "decreasepar", + "decreaserating", + "decreasevisrating", + "delete", + "doubleclick", + "down", + "enter", + "error", + "fastforward", + "filter", + "filterclear", + "filtersms2", + "filtersms3", + "filtersms4", + "filtersms5", + "filtersms6", + "filtersms7", + "filtersms8", + "filtersms9", + "firstpage", + "fullscreen", + "green", + "guiprofile", + "highlight", + "increasepar", + "increaserating", + "increasevisrating", + "info", + "jumpsms2", + "jumpsms3", + "jumpsms4", + "jumpsms5", + "jumpsms6", + "jumpsms7", + "jumpsms8", + "jumpsms9", + "lastpage", + "left", + "leftclick", + "lockpreset", + "longclick", + "longpress", + "menu", + "middleclick", + "mousedrag", + "mousemove", + "move", + "moveitemdown", + "moveitemup", + "mute", + "nextcalibration", + "nextchannelgroup", + "nextletter", + "nextpicture", + "nextpreset", + "nextresolution", + "nextscene", + "nextstereomode", + "nextsubtitle", + "noop", + "number0", + "number1", + "number2", + "number3", + "number4", + "number5", + "number6", + "number7", + "number8", + "number9", + "osd", + "pagedown", + "pageup", + "pangesture", + "parentdir", + "parentfolder", + "pause", + "play", + "playerdebug", + "playerprocessinfo", + "playerprogramselect", + "playlist", + "playpause", + "playpvr", + "playpvrradio", + "playpvrtv", + "previouschannelgroup", + "previousmenu", + "previouspicture", + "previouspreset", + "previousscene", + "previousstereomode", + "prevletter", + "queue", + "randompreset", + "record", + "red", + "reloadkeymaps", + "rename", + "resetcalibration", + "rewind", + "right", + "rightclick", + "rotate", + "rotateccw", + "rotategesture", + "scanitem", + "screenshot", + "scrolldown", + "scrollup", + "select", + "setrating", + "settingslevelchange", + "settingsreset", + "shift", + "showpreset", + "showsubtitles", + "showtime", + "showtimerrule", + "showvideomenu", + "skipnext", + "skipprevious", + "smallstepback", + "stepback", + "stepforward", + "stereomode", + "stereomodetomono", + "stop", + "subtitlealign", + "subtitledelay", + "subtitledelayminus", + "subtitledelayplus", + "subtitleshiftdown", + "subtitleshiftup", + "swipedown", + "swipeleft", + "swiperight", + "swipeup", + "switchplayer", + "symbols", + "tap", + "togglecommskip", + "togglefont", + "togglefullscreen", + "togglestereomode", + "togglewatched", + "up", + "verticalshiftdown", + "verticalshiftup", + "voicerecognizer", + "volampdown", + "volampup", + "volumeamplification", + "volumedown", + "volumeup", + "wheeldown", + "wheelup", + "yellow", + "zoomgesture", + "zoomin", + "zoomlevel1", + "zoomlevel2", + "zoomlevel3", + "zoomlevel4", + "zoomlevel5", + "zoomlevel6", + "zoomlevel7", + "zoomlevel8", + "zoomlevel9", + "zoomnormal", + "zoomout" + ], + "id": "Input.Action", + "type": "string" + }, + "Item.Details.Base": { + "id": "Item.Details.Base", + "properties": { + "label": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "Item.Fields.Base": { + "id": "Item.Fields.Base", + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + }, + "Library.Details.Genre": { + "extends": "Item.Details.Base", + "id": "Library.Details.Genre", + "properties": { + "genreid": { + "$ref": "Library.Id", + "required": true + }, + "thumbnail": { + "default": "", + "type": "string" + }, + "title": { + "default": "", + "type": "string" + } + } + }, + "Library.Details.Tag": { + "extends": "Item.Details.Base", + "id": "Library.Details.Tag", + "properties": { + "tagid": { + "$ref": "Library.Id", + "required": true + }, + "title": { + "default": "", + "type": "string" + } + } + }, + "Library.Fields.Genre": { + "extends": "Item.Fields.Base", + "id": "Library.Fields.Genre", + "items": { + "enums": [ + "title", + "thumbnail" + ], + "type": "string" + } + }, + "Library.Fields.Tag": { + "extends": "Item.Fields.Base", + "id": "Library.Fields.Tag", + "items": { + "enums": [ + "title" + ], + "type": "string" + } + }, + "Library.Id": { + "default": -1, + "id": "Library.Id", + "minimum": 1, + "type": "integer" + }, + "List.Amount": { + "default": -1, + "id": "List.Amount", + "minimum": 0, + "type": "integer" + }, + "List.Fields.All": { + "extends": "Item.Fields.Base", + "id": "List.Fields.All", + "items": { + "enums": [ + "title", + "artist", + "albumartist", + "genre", + "year", + "rating", + "album", + "track", + "duration", + "comment", + "lyrics", + "musicbrainztrackid", + "musicbrainzartistid", + "musicbrainzalbumid", + "musicbrainzalbumartistid", + "playcount", + "fanart", + "director", + "trailer", + "tagline", + "plot", + "plotoutline", + "originaltitle", + "lastplayed", + "writer", + "studio", + "mpaa", + "cast", + "country", + "imdbnumber", + "premiered", + "productioncode", + "runtime", + "set", + "showlink", + "streamdetails", + "top250", + "votes", + "firstaired", + "season", + "episode", + "showtitle", + "thumbnail", + "file", + "resume", + "artistid", + "albumid", + "tvshowid", + "setid", + "watchedepisodes", + "disc", + "tag", + "art", + "genreid", + "displayartist", + "albumartistid", + "description", + "theme", + "mood", + "style", + "albumlabel", + "sorttitle", + "episodeguide", + "uniqueid", + "dateadded", + "channel", + "channeltype", + "hidden", + "locked", + "channelnumber", + "starttime", + "endtime", + "specialsortseason", + "specialsortepisode", + "compilation", + "releasetype", + "albumreleasetype", + "contributors", + "displaycomposer", + "displayconductor", + "displayorchestra", + "displaylyricist", + "userrating", + "sortartist", + "musicbrainzreleasegroupid" + ], + "type": "string" + } + }, + "List.Fields.Files": { + "extends": "Item.Fields.Base", + "id": "List.Fields.Files", + "items": { + "enums": [ + "title", + "artist", + "albumartist", + "genre", + "year", + "rating", + "album", + "track", + "duration", + "comment", + "lyrics", + "musicbrainztrackid", + "musicbrainzartistid", + "musicbrainzalbumid", + "musicbrainzalbumartistid", + "playcount", + "fanart", + "director", + "trailer", + "tagline", + "plot", + "plotoutline", + "originaltitle", + "lastplayed", + "writer", + "studio", + "mpaa", + "cast", + "country", + "imdbnumber", + "premiered", + "productioncode", + "runtime", + "set", + "showlink", + "streamdetails", + "top250", + "votes", + "firstaired", + "season", + "episode", + "showtitle", + "thumbnail", + "file", + "resume", + "artistid", + "albumid", + "tvshowid", + "setid", + "watchedepisodes", + "disc", + "tag", + "art", + "genreid", + "displayartist", + "albumartistid", + "description", + "theme", + "mood", + "style", + "albumlabel", + "sorttitle", + "episodeguide", + "uniqueid", + "dateadded", + "size", + "lastmodified", + "mimetype", + "specialsortseason", + "specialsortepisode", + "sortartist", + "musicbrainzreleasegroupid" + ], + "type": "string" + } + }, + "List.Filter.Albums": { + "id": "List.Filter.Albums", + "type": [ + { + "properties": { + "and": { + "items": { + "$ref": "List.Filter.Albums" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "or": { + "items": { + "$ref": "List.Filter.Albums" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Rule.Albums" + } + ] + }, + "List.Filter.Artists": { + "id": "List.Filter.Artists", + "type": [ + { + "properties": { + "and": { + "items": { + "$ref": "List.Filter.Artists" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "or": { + "items": { + "$ref": "List.Filter.Artists" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Rule.Artists" + } + ] + }, + "List.Filter.Episodes": { + "id": "List.Filter.Episodes", + "type": [ + { + "properties": { + "and": { + "items": { + "$ref": "List.Filter.Episodes" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "or": { + "items": { + "$ref": "List.Filter.Episodes" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Rule.Episodes" + } + ] + }, + "List.Filter.Fields.Albums": { + "default": "genre", + "enums": [ + "genre", + "album", + "artist", + "albumartist", + "year", + "review", + "themes", + "moods", + "styles", + "compilation", + "type", + "label", + "rating", + "userrating", + "playcount", + "lastplayed", + "path", + "playlist", + "virtualfolder" + ], + "id": "List.Filter.Fields.Albums", + "type": "string" + }, + "List.Filter.Fields.Artists": { + "default": "artist", + "enums": [ + "artist", + "genre", + "moods", + "styles", + "instruments", + "biography", + "artisttype", + "gender", + "disambiguation", + "born", + "bandformed", + "disbanded", + "died", + "role", + "path", + "playlist", + "virtualfolder" + ], + "id": "List.Filter.Fields.Artists", + "type": "string" + }, + "List.Filter.Fields.Episodes": { + "default": "title", + "enums": [ + "title", + "tvshow", + "originaltitle", + "plot", + "votes", + "rating", + "userrating", + "time", + "writers", + "airdate", + "playcount", + "lastplayed", + "inprogress", + "genre", + "year", + "director", + "actor", + "episode", + "season", + "filename", + "path", + "studio", + "mpaarating", + "dateadded", + "tag", + "videoresolution", + "audiochannels", + "audiocount", + "subtitlecount", + "videocodec", + "audiocodec", + "audiolanguage", + "subtitlelanguage", + "videoaspect", + "playlist", + "virtualfolder" + ], + "id": "List.Filter.Fields.Episodes", + "type": "string" + }, + "List.Filter.Fields.Movies": { + "default": "title", + "enums": [ + "title", + "originaltitle", + "plot", + "plotoutline", + "tagline", + "votes", + "rating", + "userrating", + "time", + "writers", + "playcount", + "lastplayed", + "inprogress", + "genre", + "country", + "year", + "director", + "actor", + "mpaarating", + "top250", + "studio", + "hastrailer", + "filename", + "path", + "set", + "tag", + "dateadded", + "videoresolution", + "audiochannels", + "audiocount", + "subtitlecount", + "videocodec", + "audiocodec", + "audiolanguage", + "subtitlelanguage", + "videoaspect", + "playlist", + "virtualfolder" + ], + "id": "List.Filter.Fields.Movies", + "type": "string" + }, + "List.Filter.Fields.MusicVideos": { + "default": "title", + "enums": [ + "title", + "genre", + "album", + "year", + "artist", + "filename", + "path", + "playcount", + "lastplayed", + "rating", + "userrating", + "time", + "director", + "studio", + "plot", + "tag", + "dateadded", + "videoresolution", + "audiochannels", + "audiocount", + "subtitlecount", + "videocodec", + "audiocodec", + "audiolanguage", + "subtitlelanguage", + "videoaspect", + "playlist", + "virtualfolder" + ], + "id": "List.Filter.Fields.MusicVideos", + "type": "string" + }, + "List.Filter.Fields.Songs": { + "default": "genre", + "enums": [ + "genre", + "album", + "artist", + "albumartist", + "title", + "year", + "time", + "tracknumber", + "filename", + "path", + "playcount", + "lastplayed", + "rating", + "userrating", + "comment", + "moods", + "playlist", + "virtualfolder" + ], + "id": "List.Filter.Fields.Songs", + "type": "string" + }, + "List.Filter.Fields.TVShows": { + "default": "title", + "enums": [ + "title", + "originaltitle", + "plot", + "status", + "votes", + "rating", + "userrating", + "year", + "genre", + "director", + "actor", + "numepisodes", + "numwatched", + "playcount", + "path", + "studio", + "mpaarating", + "dateadded", + "lastplayed", + "inprogress", + "tag", + "playlist", + "virtualfolder" + ], + "id": "List.Filter.Fields.TVShows", + "type": "string" + }, + "List.Filter.Fields.Textures": { + "default": "textureid", + "enums": [ + "textureid", + "url", + "cachedurl", + "lasthashcheck", + "imagehash", + "width", + "height", + "usecount", + "lastused" + ], + "id": "List.Filter.Fields.Textures", + "type": "string" + }, + "List.Filter.Movies": { + "id": "List.Filter.Movies", + "type": [ + { + "properties": { + "and": { + "items": { + "$ref": "List.Filter.Movies" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "or": { + "items": { + "$ref": "List.Filter.Movies" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Rule.Movies" + } + ] + }, + "List.Filter.MusicVideos": { + "id": "List.Filter.MusicVideos", + "type": [ + { + "properties": { + "and": { + "items": { + "$ref": "List.Filter.MusicVideos" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "or": { + "items": { + "$ref": "List.Filter.MusicVideos" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Rule.MusicVideos" + } + ] + }, + "List.Filter.Operators": { + "default": "contains", + "enums": [ + "contains", + "doesnotcontain", + "is", + "isnot", + "startswith", + "endswith", + "greaterthan", + "lessthan", + "after", + "before", + "inthelast", + "notinthelast", + "true", + "false", + "between" + ], + "id": "List.Filter.Operators", + "type": "string" + }, + "List.Filter.Rule": { + "id": "List.Filter.Rule", + "properties": { + "operator": { + "$ref": "List.Filter.Operators", + "required": true + }, + "value": { + "required": true, + "type": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "type": "object" + }, + "List.Filter.Rule.Albums": { + "extends": "List.Filter.Rule", + "id": "List.Filter.Rule.Albums", + "properties": { + "field": { + "$ref": "List.Filter.Fields.Albums", + "required": true + } + } + }, + "List.Filter.Rule.Artists": { + "extends": "List.Filter.Rule", + "id": "List.Filter.Rule.Artists", + "properties": { + "field": { + "$ref": "List.Filter.Fields.Artists", + "required": true + } + } + }, + "List.Filter.Rule.Episodes": { + "extends": "List.Filter.Rule", + "id": "List.Filter.Rule.Episodes", + "properties": { + "field": { + "$ref": "List.Filter.Fields.Episodes", + "required": true + } + } + }, + "List.Filter.Rule.Movies": { + "extends": "List.Filter.Rule", + "id": "List.Filter.Rule.Movies", + "properties": { + "field": { + "$ref": "List.Filter.Fields.Movies", + "required": true + } + } + }, + "List.Filter.Rule.MusicVideos": { + "extends": "List.Filter.Rule", + "id": "List.Filter.Rule.MusicVideos", + "properties": { + "field": { + "$ref": "List.Filter.Fields.MusicVideos", + "required": true + } + } + }, + "List.Filter.Rule.Songs": { + "extends": "List.Filter.Rule", + "id": "List.Filter.Rule.Songs", + "properties": { + "field": { + "$ref": "List.Filter.Fields.Songs", + "required": true + } + } + }, + "List.Filter.Rule.TVShows": { + "extends": "List.Filter.Rule", + "id": "List.Filter.Rule.TVShows", + "properties": { + "field": { + "$ref": "List.Filter.Fields.TVShows", + "required": true + } + } + }, + "List.Filter.Rule.Textures": { + "extends": "List.Filter.Rule", + "id": "List.Filter.Rule.Textures", + "properties": { + "field": { + "$ref": "List.Filter.Fields.Textures", + "required": true + } + } + }, + "List.Filter.Songs": { + "id": "List.Filter.Songs", + "type": [ + { + "properties": { + "and": { + "items": { + "$ref": "List.Filter.Songs" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "or": { + "items": { + "$ref": "List.Filter.Songs" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Rule.Songs" + } + ] + }, + "List.Filter.TVShows": { + "id": "List.Filter.TVShows", + "type": [ + { + "properties": { + "and": { + "items": { + "$ref": "List.Filter.TVShows" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "or": { + "items": { + "$ref": "List.Filter.TVShows" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Rule.TVShows" + } + ] + }, + "List.Filter.Textures": { + "id": "List.Filter.Textures", + "type": [ + { + "properties": { + "and": { + "items": { + "$ref": "List.Filter.Textures" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "or": { + "items": { + "$ref": "List.Filter.Textures" + }, + "minItems": 1, + "required": true, + "type": "array" + } + }, + "type": "object" + }, + { + "$ref": "List.Filter.Rule.Textures" + } + ] + }, + "List.Item.All": { + "extends": "List.Item.Base", + "id": "List.Item.All", + "properties": { + "channel": { + "default": "", + "type": "string" + }, + "channelnumber": { + "default": 0, + "type": "integer" + }, + "channeltype": { + "$ref": "PVR.Channel.Type", + "default": "tv" + }, + "endtime": { + "default": "", + "type": "string" + }, + "hidden": { + "default": false, + "type": "boolean" + }, + "locked": { + "default": false, + "type": "boolean" + }, + "starttime": { + "default": "", + "type": "string" + } + } + }, + "List.Item.Base": { + "extends": [ + "Video.Details.File", + "Audio.Details.Media" + ], + "id": "List.Item.Base", + "properties": { + "album": { + "default": "", + "type": "string" + }, + "albumartist": { + "$ref": "Array.String" + }, + "albumartistid": { + "$ref": "Array.Integer" + }, + "albumid": { + "$ref": "Library.Id", + "default": -1 + }, + "albumlabel": { + "default": "", + "type": "string" + }, + "albumreleasetype": { + "$ref": "Audio.Album.ReleaseType", + "default": "album" + }, + "cast": { + "$ref": "Video.Cast" + }, + "comment": { + "default": "", + "type": "string" + }, + "compilation": { + "default": false, + "type": "boolean" + }, + "contributors": { + "$ref": "Audio.Contributors" + }, + "country": { + "$ref": "Array.String" + }, + "description": { + "default": "", + "type": "string" + }, + "disc": { + "default": 0, + "type": "integer" + }, + "displaycomposer": { + "default": "", + "type": "string" + }, + "displayconductor": { + "default": "", + "type": "string" + }, + "displaylyricist": { + "default": "", + "type": "string" + }, + "displayorchestra": { + "default": "", + "type": "string" + }, + "duration": { + "default": 0, + "type": "integer" + }, + "episode": { + "default": 0, + "type": "integer" + }, + "episodeguide": { + "default": "", + "type": "string" + }, + "firstaired": { + "default": "", + "type": "string" + }, + "id": { + "$ref": "Library.Id", + "default": -1 + }, + "imdbnumber": { + "default": "", + "type": "string" + }, + "lyrics": { + "default": "", + "type": "string" + }, + "mood": { + "$ref": "Array.String" + }, + "mpaa": { + "default": "", + "type": "string" + }, + "musicbrainzartistid": { + "$ref": "Array.String" + }, + "musicbrainztrackid": { + "default": "", + "type": "string" + }, + "originaltitle": { + "default": "", + "type": "string" + }, + "plotoutline": { + "default": "", + "type": "string" + }, + "premiered": { + "default": "", + "type": "string" + }, + "productioncode": { + "default": "", + "type": "string" + }, + "releasetype": { + "$ref": "Audio.Album.ReleaseType", + "default": "album" + }, + "season": { + "default": 0, + "type": "integer" + }, + "set": { + "default": "", + "type": "string" + }, + "setid": { + "$ref": "Library.Id", + "default": -1 + }, + "showlink": { + "$ref": "Array.String" + }, + "showtitle": { + "default": "", + "type": "string" + }, + "sorttitle": { + "default": "", + "type": "string" + }, + "specialsortepisode": { + "default": 0, + "type": "integer" + }, + "specialsortseason": { + "default": 0, + "type": "integer" + }, + "studio": { + "$ref": "Array.String" + }, + "style": { + "$ref": "Array.String" + }, + "tag": { + "$ref": "Array.String" + }, + "tagline": { + "default": "", + "type": "string" + }, + "theme": { + "$ref": "Array.String" + }, + "top250": { + "default": 0, + "type": "integer" + }, + "track": { + "default": 0, + "type": "integer" + }, + "trailer": { + "default": "", + "type": "string" + }, + "tvshowid": { + "$ref": "Library.Id", + "default": -1 + }, + "type": { + "default": "unknown", + "enums": [ + "unknown", + "movie", + "episode", + "musicvideo", + "song", + "picture", + "channel" + ], + "type": "string" + }, + "uniqueid": { + "$ref": "Media.UniqueID" + }, + "votes": { + "default": "", + "type": "string" + }, + "watchedepisodes": { + "default": 0, + "type": "integer" + }, + "writer": { + "$ref": "Array.String" + } + } + }, + "List.Item.File": { + "extends": "List.Item.Base", + "id": "List.Item.File", + "properties": { + "file": { + "required": true, + "type": "string" + }, + "filetype": { + "enums": [ + "file", + "directory" + ], + "required": true, + "type": "string" + }, + "lastmodified": { + "default": "", + "type": "string" + }, + "mimetype": { + "default": "", + "type": "string" + }, + "size": { + "default": 0, + "description": "Size of the file in bytes", + "type": "integer" + } + } + }, + "List.Items.Sources": { + "id": "List.Items.Sources", + "items": { + "extends": "Item.Details.Base", + "properties": { + "file": { + "required": true, + "type": "string" + } + } + }, + "type": "array" + }, + "List.Limits": { + "additionalProperties": false, + "id": "List.Limits", + "properties": { + "end": { + "$ref": "List.Amount", + "default": -1, + "description": "Index of the last item to return" + }, + "start": { + "default": 0, + "description": "Index of the first item to return", + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "List.LimitsReturned": { + "additionalProperties": false, + "id": "List.LimitsReturned", + "properties": { + "end": { + "$ref": "List.Amount", + "default": -1 + }, + "start": { + "default": 0, + "minimum": 0, + "type": "integer" + }, + "total": { + "minimum": 0, + "required": true, + "type": "integer" + } + }, + "type": "object" + }, + "List.Sort": { + "id": "List.Sort", + "properties": { + "ignorearticle": { + "default": false, + "type": "boolean" + }, + "method": { + "default": "none", + "enums": [ + "none", + "label", + "date", + "size", + "file", + "path", + "drivetype", + "title", + "track", + "time", + "artist", + "album", + "albumtype", + "genre", + "country", + "year", + "rating", + "userrating", + "votes", + "top250", + "programcount", + "playlist", + "episode", + "season", + "totalepisodes", + "watchedepisodes", + "tvshowstatus", + "tvshowtitle", + "sorttitle", + "productioncode", + "mpaa", + "studio", + "dateadded", + "lastplayed", + "playcount", + "listeners", + "bitrate", + "random" + ], + "type": "string" + }, + "order": { + "default": "ascending", + "enums": [ + "ascending", + "descending" + ], + "type": "string" + } + }, + "type": "object" + }, + "Media.Artwork": { + "additionalProperties": { + "$ref": "Global.String.NotEmpty", + "default": "" + }, + "id": "Media.Artwork", + "properties": { + "banner": { + "$ref": "Global.String.NotEmpty", + "default": "" + }, + "fanart": { + "$ref": "Global.String.NotEmpty", + "default": "" + }, + "poster": { + "$ref": "Global.String.NotEmpty", + "default": "" + }, + "thumb": { + "$ref": "Global.String.NotEmpty", + "default": "" + } + }, + "type": "object" + }, + "Media.Artwork.Set": { + "additionalProperties": { + "default": null, + "type": [ + { + "type": "null" + }, + { + "$ref": "Global.String.NotEmpty" + } + ] + }, + "id": "Media.Artwork.Set", + "properties": { + "banner": { + "default": "", + "type": [ + { + "type": "null" + }, + { + "$ref": "Global.String.NotEmpty" + } + ] + }, + "fanart": { + "default": "", + "type": [ + { + "type": "null" + }, + { + "$ref": "Global.String.NotEmpty" + } + ] + }, + "poster": { + "default": "", + "type": [ + { + "type": "null" + }, + { + "$ref": "Global.String.NotEmpty" + } + ] + }, + "thumb": { + "default": "", + "type": [ + { + "type": "null" + }, + { + "$ref": "Global.String.NotEmpty" + } + ] + } + }, + "type": "object" + }, + "Media.Details.Base": { + "extends": "Item.Details.Base", + "id": "Media.Details.Base", + "properties": { + "fanart": { + "default": "", + "type": "string" + }, + "thumbnail": { + "default": "", + "type": "string" + } + } + }, + "Media.UniqueID": { + "additionalProperties": { + "$ref": "Global.String.NotEmpty", + "default": "" + }, + "id": "Media.UniqueID", + "type": "object" + }, + "Media.UniqueID.Set": { + "additionalProperties": { + "default": null, + "type": [ + { + "type": "null" + }, + { + "$ref": "Global.String.NotEmpty" + } + ] + }, + "id": "Media.UniqueID.Set", + "type": "object" + }, + "Notifications.Item": { + "id": "Notifications.Item", + "type": [ + { + "description": "An unknown item does not have any additional information.", + "properties": { + "type": { + "$ref": "Notifications.Item.Type", + "required": true + } + }, + "type": "object" + }, + { + "description": "An item known to the database has an identification.", + "properties": { + "id": { + "$ref": "Library.Id", + "required": true + }, + "type": { + "$ref": "Notifications.Item.Type", + "required": true + } + }, + "type": "object" + }, + { + "description": "A movie item has a title and may have a release year.", + "properties": { + "title": { + "required": true, + "type": "string" + }, + "type": { + "$ref": "Notifications.Item.Type", + "required": true + }, + "year": { + "default": 0, + "type": "integer" + } + }, + "type": "object" + }, + { + "description": "A tv episode has a title and may have an episode number, season number and the title of the show it belongs to.", + "properties": { + "episode": { + "default": 0, + "type": "integer" + }, + "season": { + "default": 0, + "type": "integer" + }, + "showtitle": { + "default": "", + "type": "string" + }, + "title": { + "required": true, + "type": "string" + }, + "type": { + "$ref": "Notifications.Item.Type", + "required": true + } + }, + "type": "object" + }, + { + "description": "A music video has a title and may have an album and an artist.", + "properties": { + "album": { + "default": "", + "type": "string" + }, + "artist": { + "default": "", + "type": "string" + }, + "title": { + "required": true, + "type": "string" + }, + "type": { + "$ref": "Notifications.Item.Type", + "required": true + } + }, + "type": "object" + }, + { + "description": "A song has a title and may have an album, an artist and a track number.", + "properties": { + "album": { + "default": "", + "type": "string" + }, + "artist": { + "default": "", + "type": "string" + }, + "title": { + "required": true, + "type": "string" + }, + "track": { + "default": 0, + "type": "integer" + }, + "type": { + "$ref": "Notifications.Item.Type", + "required": true + } + }, + "type": "object" + }, + { + "description": "A picture has a file path.", + "properties": { + "file": { + "required": true, + "type": "string" + }, + "type": { + "$ref": "Notifications.Item.Type", + "required": true + } + }, + "type": "object" + }, + { + "description": "A PVR channel is either a radio or tv channel and has a title.", + "properties": { + "channeltype": { + "$ref": "PVR.Channel.Type", + "required": true + }, + "id": { + "$ref": "Library.Id", + "required": true + }, + "title": { + "required": true, + "type": "string" + }, + "type": { + "$ref": "Notifications.Item.Type", + "required": true + } + }, + "type": "object" + } + ] + }, + "Notifications.Item.Type": { + "default": "unknown", + "enums": [ + "unknown", + "movie", + "episode", + "musicvideo", + "song", + "picture", + "channel" + ], + "id": "Notifications.Item.Type", + "type": "string" + }, + "Optional.Boolean": { + "default": null, + "id": "Optional.Boolean", + "type": [ + { + "type": "null" + }, + { + "type": "boolean" + } + ] + }, + "Optional.Integer": { + "default": null, + "id": "Optional.Integer", + "type": [ + { + "type": "null" + }, + { + "type": "integer" + } + ] + }, + "Optional.Number": { + "default": null, + "id": "Optional.Number", + "type": [ + { + "type": "null" + }, + { + "type": "number" + } + ] + }, + "Optional.String": { + "default": null, + "id": "Optional.String", + "type": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "PVR.Channel.Type": { + "default": "tv", + "enums": [ + "tv", + "radio" + ], + "id": "PVR.Channel.Type", + "type": "string" + }, + "PVR.ChannelGroup.Id": { + "default": null, + "id": "PVR.ChannelGroup.Id", + "type": [ + { + "$ref": "Library.Id" + }, + { + "enums": [ + "alltv", + "allradio" + ], + "type": "string" + } + ] + }, + "PVR.Details.Broadcast": { + "extends": "Item.Details.Base", + "id": "PVR.Details.Broadcast", + "properties": { + "broadcastid": { + "$ref": "Library.Id", + "required": true + }, + "cast": { + "default": "", + "type": "string" + }, + "director": { + "default": "", + "type": "string" + }, + "endtime": { + "default": "", + "type": "string" + }, + "episodename": { + "default": "", + "type": "string" + }, + "episodenum": { + "default": 0, + "type": "integer" + }, + "episodepart": { + "default": 0, + "type": "integer" + }, + "firstaired": { + "default": "", + "type": "string" + }, + "genre": { + "default": "", + "type": "string" + }, + "hasrecording": { + "default": false, + "type": "boolean" + }, + "hastimer": { + "default": false, + "type": "boolean" + }, + "hastimerrule": { + "default": false, + "type": "boolean" + }, + "imdbnumber": { + "default": 0, + "type": "integer" + }, + "isactive": { + "default": false, + "type": "boolean" + }, + "isseries": { + "default": false, + "type": "boolean" + }, + "originaltitle": { + "default": "", + "type": "string" + }, + "parentalrating": { + "default": 0, + "type": "integer" + }, + "plot": { + "default": "", + "type": "string" + }, + "plotoutline": { + "default": "", + "type": "string" + }, + "progress": { + "default": 0, + "type": "integer" + }, + "progresspercentage": { + "default": 0, + "type": "number" + }, + "rating": { + "default": 0, + "type": "integer" + }, + "recording": { + "default": "", + "type": "string" + }, + "runtime": { + "default": 0, + "type": "integer" + }, + "starttime": { + "default": "", + "type": "string" + }, + "thumbnail": { + "default": "", + "type": "string" + }, + "title": { + "default": "", + "type": "string" + }, + "wasactive": { + "default": false, + "type": "boolean" + }, + "writer": { + "default": "", + "type": "string" + }, + "year": { + "default": 0, + "type": "integer" + } + } + }, + "PVR.Details.Channel": { + "extends": "Item.Details.Base", + "id": "PVR.Details.Channel", + "properties": { + "broadcastnext": { + "$ref": "PVR.Details.Broadcast" + }, + "broadcastnow": { + "$ref": "PVR.Details.Broadcast" + }, + "channel": { + "default": "", + "type": "string" + }, + "channelid": { + "$ref": "Library.Id", + "required": true + }, + "channelnumber": { + "default": 0, + "type": "integer" + }, + "channeltype": { + "$ref": "PVR.Channel.Type", + "default": "tv" + }, + "hidden": { + "default": false, + "type": "boolean" + }, + "icon": { + "default": "", + "type": "string" + }, + "isrecording": { + "default": false, + "type": "boolean" + }, + "lastplayed": { + "default": "", + "type": "string" + }, + "locked": { + "default": false, + "type": "boolean" + }, + "subchannelnumber": { + "default": 0, + "type": "integer" + }, + "thumbnail": { + "default": "", + "type": "string" + }, + "uniqueid": { + "required": true, + "type": "integer" + } + } + }, + "PVR.Details.ChannelGroup": { + "extends": "Item.Details.Base", + "id": "PVR.Details.ChannelGroup", + "properties": { + "channelgroupid": { + "$ref": "Library.Id", + "required": true + }, + "channeltype": { + "$ref": "PVR.Channel.Type", + "required": true + } + } + }, + "PVR.Details.ChannelGroup.Extended": { + "extends": "PVR.Details.ChannelGroup", + "id": "PVR.Details.ChannelGroup.Extended", + "properties": { + "channels": { + "items": { + "$ref": "PVR.Details.Channel" + }, + "type": "array" + }, + "limits": { + "$ref": "List.LimitsReturned", + "required": true + } + } + }, + "PVR.Details.Recording": { + "extends": "Item.Details.Base", + "id": "PVR.Details.Recording", + "properties": { + "art": { + "$ref": "Media.Artwork" + }, + "channel": { + "default": "", + "type": "string" + }, + "channeluid": { + "default": 0, + "type": "integer" + }, + "directory": { + "default": "", + "type": "string" + }, + "endtime": { + "default": "", + "type": "string" + }, + "epgeventid": { + "default": 0, + "type": "integer" + }, + "file": { + "default": "", + "type": "string" + }, + "genre": { + "default": "", + "type": "string" + }, + "icon": { + "default": "", + "type": "string" + }, + "isdeleted": { + "default": false, + "type": "boolean" + }, + "lifetime": { + "default": 0, + "type": "integer" + }, + "playcount": { + "default": 0, + "type": "integer" + }, + "plot": { + "default": "", + "type": "string" + }, + "plotoutline": { + "default": "", + "type": "string" + }, + "radio": { + "default": false, + "type": "boolean" + }, + "recordingid": { + "$ref": "Library.Id", + "required": true + }, + "resume": { + "$ref": "Video.Resume" + }, + "runtime": { + "default": 0, + "type": "integer" + }, + "starttime": { + "default": "", + "type": "string" + }, + "streamurl": { + "default": "", + "type": "string" + }, + "title": { + "default": "", + "type": "string" + } + } + }, + "PVR.Details.Timer": { + "extends": "Item.Details.Base", + "id": "PVR.Details.Timer", + "properties": { + "channelid": { + "$ref": "Library.Id", + "default": -1 + }, + "directory": { + "default": "", + "type": "string" + }, + "endanytime": { + "default": false, + "type": "boolean" + }, + "endmargin": { + "default": 0, + "type": "integer" + }, + "endtime": { + "default": "", + "type": "string" + }, + "epgsearchstring": { + "default": "", + "type": "string" + }, + "epguid": { + "default": 0, + "type": "integer" + }, + "file": { + "default": "", + "type": "string" + }, + "firstday": { + "default": "", + "type": "string" + }, + "fulltextepgsearch": { + "default": false, + "type": "boolean" + }, + "ismanual": { + "default": false, + "type": "boolean" + }, + "isradio": { + "default": false, + "type": "boolean" + }, + "isreadonly": { + "default": false, + "type": "boolean" + }, + "istimerrule": { + "default": false, + "type": "boolean" + }, + "lifetime": { + "default": 0, + "type": "integer" + }, + "maxrecordings": { + "default": 0, + "type": "integer" + }, + "preventduplicateepisodes": { + "default": 0, + "type": "integer" + }, + "priority": { + "default": 0, + "type": "integer" + }, + "recordinggroup": { + "default": 0, + "type": "integer" + }, + "runtime": { + "default": 0, + "type": "integer" + }, + "startanytime": { + "default": false, + "type": "boolean" + }, + "startmargin": { + "default": 0, + "type": "integer" + }, + "starttime": { + "default": "", + "type": "string" + }, + "state": { + "$ref": "PVR.TimerState", + "default": "unknown" + }, + "summary": { + "default": "", + "type": "string" + }, + "timerid": { + "$ref": "Library.Id", + "required": true + }, + "title": { + "default": "", + "type": "string" + }, + "weekdays": { + "items": { + "$ref": "Global.Weekday" + }, + "type": "array", + "uniqueItems": true + } + } + }, + "PVR.Fields.Broadcast": { + "extends": "Item.Fields.Base", + "id": "PVR.Fields.Broadcast", + "items": { + "enums": [ + "title", + "plot", + "plotoutline", + "starttime", + "endtime", + "runtime", + "progress", + "progresspercentage", + "genre", + "episodename", + "episodenum", + "episodepart", + "firstaired", + "hastimer", + "isactive", + "parentalrating", + "wasactive", + "thumbnail", + "rating", + "originaltitle", + "cast", + "director", + "writer", + "year", + "imdbnumber", + "hastimerrule", + "hasrecording", + "recording", + "isseries" + ], + "type": "string" + } + }, + "PVR.Fields.Channel": { + "extends": "Item.Fields.Base", + "id": "PVR.Fields.Channel", + "items": { + "enums": [ + "thumbnail", + "channeltype", + "hidden", + "locked", + "channel", + "lastplayed", + "broadcastnow", + "broadcastnext", + "uniqueid", + "icon", + "channelnumber", + "subchannelnumber", + "isrecording" + ], + "type": "string" + } + }, + "PVR.Fields.Recording": { + "extends": "Item.Fields.Base", + "id": "PVR.Fields.Recording", + "items": { + "enums": [ + "title", + "plot", + "plotoutline", + "genre", + "playcount", + "resume", + "channel", + "starttime", + "endtime", + "runtime", + "lifetime", + "icon", + "art", + "streamurl", + "file", + "directory", + "radio", + "isdeleted", + "epgeventid", + "channeluid" + ], + "type": "string" + } + }, + "PVR.Fields.Timer": { + "extends": "Item.Fields.Base", + "id": "PVR.Fields.Timer", + "items": { + "enums": [ + "title", + "summary", + "channelid", + "isradio", + "istimerrule", + "ismanual", + "starttime", + "endtime", + "runtime", + "lifetime", + "firstday", + "weekdays", + "priority", + "startmargin", + "endmargin", + "state", + "file", + "directory", + "preventduplicateepisodes", + "startanytime", + "endanytime", + "epgsearchstring", + "fulltextepgsearch", + "recordinggroup", + "maxrecordings", + "epguid", + "isreadonly" + ], + "type": "string" + } + }, + "PVR.Property.Name": { + "default": "available", + "enums": [ + "available", + "recording", + "scanning" + ], + "id": "PVR.Property.Name", + "type": "string" + }, + "PVR.Property.Value": { + "id": "PVR.Property.Value", + "properties": { + "available": { + "default": false, + "type": "boolean" + }, + "recording": { + "default": false, + "type": "boolean" + }, + "scanning": { + "default": false, + "type": "boolean" + } + }, + "type": "object" + }, + "PVR.TimerState": { + "default": "unknown", + "enums": [ + "unknown", + "new", + "scheduled", + "recording", + "completed", + "aborted", + "cancelled", + "conflict_ok", + "conflict_notok", + "error", + "disabled" + ], + "id": "PVR.TimerState", + "type": "string" + }, + "Player.Audio.Stream": { + "id": "Player.Audio.Stream", + "properties": { + "bitrate": { + "required": true, + "type": "integer" + }, + "channels": { + "required": true, + "type": "integer" + }, + "codec": { + "required": true, + "type": "string" + }, + "index": { + "minimum": 0, + "required": true, + "type": "integer" + }, + "language": { + "required": true, + "type": "string" + }, + "name": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "Player.Id": { + "default": -1, + "id": "Player.Id", + "maximum": 2, + "minimum": 0, + "type": "integer" + }, + "Player.Notifications.Data": { + "id": "Player.Notifications.Data", + "properties": { + "item": { + "$ref": "Notifications.Item", + "required": true + }, + "player": { + "$ref": "Player.Notifications.Player", + "required": true + } + }, + "type": "object" + }, + "Player.Notifications.Player": { + "id": "Player.Notifications.Player", + "properties": { + "playerid": { + "$ref": "Player.Id", + "required": true + }, + "speed": { + "default": 0, + "type": "integer" + } + }, + "type": "object" + }, + "Player.Notifications.Player.Seek": { + "extends": "Player.Notifications.Player", + "id": "Player.Notifications.Player.Seek", + "properties": { + "seekoffset": { + "$ref": "Global.Time" + }, + "time": { + "$ref": "Global.Time" + } + } + }, + "Player.Position.Percentage": { + "default": 0, + "id": "Player.Position.Percentage", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "Player.Position.Time": { + "additionalProperties": false, + "id": "Player.Position.Time", + "properties": { + "hours": { + "default": 0, + "maximum": 23, + "minimum": 0, + "type": "integer" + }, + "milliseconds": { + "default": 0, + "maximum": 999, + "minimum": 0, + "type": "integer" + }, + "minutes": { + "default": 0, + "maximum": 59, + "minimum": 0, + "type": "integer" + }, + "seconds": { + "default": 0, + "maximum": 59, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "Player.Property.Name": { + "default": "type", + "enums": [ + "type", + "partymode", + "speed", + "time", + "percentage", + "totaltime", + "playlistid", + "position", + "repeat", + "shuffled", + "canseek", + "canchangespeed", + "canmove", + "canzoom", + "canrotate", + "canshuffle", + "canrepeat", + "currentaudiostream", + "audiostreams", + "subtitleenabled", + "currentsubtitle", + "subtitles", + "live", + "currentvideostream", + "videostreams" + ], + "id": "Player.Property.Name", + "type": "string" + }, + "Player.Property.Value": { + "id": "Player.Property.Value", + "properties": { + "audiostreams": { + "items": { + "$ref": "Player.Audio.Stream" + }, + "type": "array" + }, + "canchangespeed": { + "default": false, + "type": "boolean" + }, + "canmove": { + "default": false, + "type": "boolean" + }, + "canrepeat": { + "default": false, + "type": "boolean" + }, + "canrotate": { + "default": false, + "type": "boolean" + }, + "canseek": { + "default": false, + "type": "boolean" + }, + "canshuffle": { + "default": false, + "type": "boolean" + }, + "canzoom": { + "default": false, + "type": "boolean" + }, + "currentaudiostream": { + "$ref": "Player.Audio.Stream" + }, + "currentsubtitle": { + "$ref": "Player.Subtitle" + }, + "currentvideostream": { + "$ref": "Player.Video.Stream" + }, + "live": { + "default": false, + "type": "boolean" + }, + "partymode": { + "default": false, + "type": "boolean" + }, + "percentage": { + "$ref": "Player.Position.Percentage", + "default": 0 + }, + "playlistid": { + "$ref": "Playlist.Id", + "default": -1 + }, + "position": { + "$ref": "Playlist.Position", + "default": -1 + }, + "repeat": { + "$ref": "Player.Repeat", + "default": "off" + }, + "shuffled": { + "default": false, + "type": "boolean" + }, + "speed": { + "default": 0, + "type": "integer" + }, + "subtitleenabled": { + "default": false, + "type": "boolean" + }, + "subtitles": { + "items": { + "$ref": "Player.Subtitle" + }, + "type": "array" + }, + "time": { + "$ref": "Global.Time" + }, + "totaltime": { + "$ref": "Global.Time" + }, + "type": { + "$ref": "Player.Type", + "default": "video" + }, + "videostreams": { + "items": { + "$ref": "Player.Video.Stream" + }, + "type": "array" + } + }, + "type": "object" + }, + "Player.Repeat": { + "default": "off", + "enums": [ + "off", + "one", + "all" + ], + "id": "Player.Repeat", + "type": "string" + }, + "Player.Speed": { + "id": "Player.Speed", + "properties": { + "speed": { + "default": 0, + "type": "integer" + } + }, + "required": true, + "type": "object" + }, + "Player.Subtitle": { + "id": "Player.Subtitle", + "properties": { + "index": { + "minimum": 0, + "required": true, + "type": "integer" + }, + "language": { + "required": true, + "type": "string" + }, + "name": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "Player.Type": { + "default": "video", + "enums": [ + "video", + "audio", + "picture" + ], + "id": "Player.Type", + "type": "string" + }, + "Player.Video.Stream": { + "id": "Player.Video.Stream", + "properties": { + "codec": { + "required": true, + "type": "string" + }, + "height": { + "required": true, + "type": "integer" + }, + "index": { + "minimum": 0, + "required": true, + "type": "integer" + }, + "language": { + "required": true, + "type": "string" + }, + "name": { + "required": true, + "type": "string" + }, + "width": { + "required": true, + "type": "integer" + } + }, + "type": "object" + }, + "Playlist.Id": { + "default": -1, + "id": "Playlist.Id", + "maximum": 2, + "minimum": 0, + "type": "integer" + }, + "Playlist.Item": { + "id": "Playlist.Item", + "type": [ + { + "additionalProperties": false, + "properties": { + "file": { + "description": "Path to a file (not a directory) to be added to the playlist", + "required": true, + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "directory": { + "required": true, + "type": "string" + }, + "media": { + "$ref": "Files.Media", + "default": "files" + }, + "recursive": { + "default": false, + "type": "boolean" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "movieid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "episodeid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "musicvideoid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "artistid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "albumid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "songid": { + "$ref": "Library.Id", + "required": true + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "genreid": { + "$ref": "Library.Id", + "description": "Identification of a genre from the AudioLibrary", + "required": true + } + }, + "type": "object" + } + ] + }, + "Playlist.Position": { + "default": -1, + "id": "Playlist.Position", + "minimum": 0, + "type": "integer" + }, + "Playlist.Property.Name": { + "default": "type", + "enums": [ + "type", + "size" + ], + "id": "Playlist.Property.Name", + "type": "string" + }, + "Playlist.Property.Value": { + "id": "Playlist.Property.Value", + "properties": { + "size": { + "default": 0, + "minimum": 0, + "type": "integer" + }, + "type": { + "$ref": "Playlist.Type", + "default": "unknown" + } + }, + "type": "object" + }, + "Playlist.Type": { + "default": "unknown", + "enums": [ + "unknown", + "video", + "audio", + "picture", + "mixed" + ], + "id": "Playlist.Type", + "type": "string" + }, + "Profiles.Details.Profile": { + "extends": "Item.Details.Base", + "id": "Profiles.Details.Profile", + "properties": { + "lockmode": { + "default": 0, + "type": "integer" + }, + "thumbnail": { + "default": "", + "type": "string" + } + } + }, + "Profiles.Fields.Profile": { + "extends": "Item.Fields.Base", + "id": "Profiles.Fields.Profile", + "items": { + "enums": [ + "thumbnail", + "lockmode" + ], + "type": "string" + } + }, + "Profiles.Password": { + "id": "Profiles.Password", + "properties": { + "encryption": { + "default": "md5", + "description": "Password Encryption", + "enums": [ + "none", + "md5" + ], + "type": "string" + }, + "value": { + "description": "Password", + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "Setting.Details.Base": { + "id": "Setting.Details.Base", + "properties": { + "help": { + "default": "", + "type": "string" + }, + "id": { + "minLength": 1, + "required": true, + "type": "string" + }, + "label": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "Setting.Details.Category": { + "additionalProperties": false, + "extends": "Setting.Details.Base", + "id": "Setting.Details.Category", + "properties": { + "groups": { + "items": { + "$ref": "Setting.Details.Group" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + } + }, + "Setting.Details.Control": { + "id": "Setting.Details.Control", + "type": [ + { + "$ref": "Setting.Details.ControlCheckmark" + }, + { + "$ref": "Setting.Details.ControlSpinner" + }, + { + "$ref": "Setting.Details.ControlEdit" + }, + { + "$ref": "Setting.Details.ControlButton" + }, + { + "$ref": "Setting.Details.ControlList" + }, + { + "$ref": "Setting.Details.ControlSlider" + }, + { + "$ref": "Setting.Details.ControlRange" + }, + { + "$ref": "Setting.Details.ControlLabel" + } + ] + }, + "Setting.Details.ControlBase": { + "id": "Setting.Details.ControlBase", + "properties": { + "delayed": { + "required": true, + "type": "boolean" + }, + "format": { + "required": true, + "type": "string" + }, + "type": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "Setting.Details.ControlButton": { + "extends": "Setting.Details.ControlHeading", + "id": "Setting.Details.ControlButton", + "properties": { + "type": { + "enums": [ + "button" + ], + "required": true, + "type": "string" + } + } + }, + "Setting.Details.ControlCheckmark": { + "extends": "Setting.Details.ControlBase", + "id": "Setting.Details.ControlCheckmark", + "properties": { + "format": { + "enums": [ + "boolean" + ], + "required": true, + "type": "string" + }, + "type": { + "enums": [ + "toggle" + ], + "required": true, + "type": "string" + } + } + }, + "Setting.Details.ControlEdit": { + "extends": "Setting.Details.ControlHeading", + "id": "Setting.Details.ControlEdit", + "properties": { + "hidden": { + "required": true, + "type": "boolean" + }, + "type": { + "enums": [ + "edit" + ], + "required": true, + "type": "string" + }, + "verifynewvalue": { + "required": true, + "type": "boolean" + } + } + }, + "Setting.Details.ControlHeading": { + "extends": "Setting.Details.ControlBase", + "id": "Setting.Details.ControlHeading", + "properties": { + "heading": { + "default": "", + "type": "string" + } + } + }, + "Setting.Details.ControlLabel": { + "extends": "Setting.Details.ControlBase", + "id": "Setting.Details.ControlLabel", + "properties": { + "format": { + "enums": [ + "string" + ], + "required": true, + "type": "string" + }, + "type": { + "enums": [ + "label" + ], + "required": true, + "type": "string" + } + } + }, + "Setting.Details.ControlList": { + "extends": "Setting.Details.ControlHeading", + "id": "Setting.Details.ControlList", + "properties": { + "multiselect": { + "required": true, + "type": "boolean" + }, + "type": { + "enums": [ + "list" + ], + "required": true, + "type": "string" + } + } + }, + "Setting.Details.ControlRange": { + "extends": "Setting.Details.ControlBase", + "id": "Setting.Details.ControlRange", + "properties": { + "formatlabel": { + "required": true, + "type": "string" + }, + "formatvalue": { + "required": true, + "type": "string" + }, + "type": { + "enums": [ + "range" + ], + "required": true, + "type": "string" + } + } + }, + "Setting.Details.ControlSlider": { + "extends": "Setting.Details.ControlHeading", + "id": "Setting.Details.ControlSlider", + "properties": { + "formatlabel": { + "required": true, + "type": "string" + }, + "popup": { + "required": true, + "type": "boolean" + }, + "type": { + "enums": [ + "slider" + ], + "required": true, + "type": "string" + } + } + }, + "Setting.Details.ControlSpinner": { + "extends": "Setting.Details.ControlBase", + "id": "Setting.Details.ControlSpinner", + "properties": { + "formatlabel": { + "default": "", + "type": "string" + }, + "minimumlabel": { + "default": "", + "type": "string" + }, + "type": { + "enums": [ + "spinner" + ], + "required": true, + "type": "string" + } + } + }, + "Setting.Details.Group": { + "additionalProperties": false, + "id": "Setting.Details.Group", + "properties": { + "id": { + "minLength": 1, + "required": true, + "type": "string" + }, + "settings": { + "items": { + "$ref": "Setting.Details.Setting" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "type": "object" + }, + "Setting.Details.Section": { + "additionalProperties": false, + "extends": "Setting.Details.Base", + "id": "Setting.Details.Section", + "properties": { + "categories": { + "items": { + "$ref": "Setting.Details.Category" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + } + }, + "Setting.Details.Setting": { + "id": "Setting.Details.Setting", + "type": [ + { + "$ref": "Setting.Details.SettingBool" + }, + { + "$ref": "Setting.Details.SettingInt" + }, + { + "$ref": "Setting.Details.SettingNumber" + }, + { + "$ref": "Setting.Details.SettingString" + }, + { + "$ref": "Setting.Details.SettingAction" + }, + { + "$ref": "Setting.Details.SettingList" + }, + { + "$ref": "Setting.Details.SettingPath" + }, + { + "$ref": "Setting.Details.SettingAddon" + }, + { + "$ref": "Setting.Details.SettingDate" + }, + { + "$ref": "Setting.Details.SettingTime" + } + ] + }, + "Setting.Details.SettingAction": { + "additionalProperties": false, + "extends": "Setting.Details.SettingBase", + "id": "Setting.Details.SettingAction", + "properties": { + "data": { + "required": true, + "type": "string" + } + } + }, + "Setting.Details.SettingAddon": { + "additionalProperties": false, + "extends": "Setting.Details.SettingString", + "id": "Setting.Details.SettingAddon", + "properties": { + "addontype": { + "$ref": "Addon.Types", + "required": true + } + } + }, + "Setting.Details.SettingBase": { + "additionalProperties": false, + "extends": "Setting.Details.Base", + "id": "Setting.Details.SettingBase", + "properties": { + "control": { + "$ref": "Setting.Details.Control" + }, + "enabled": { + "required": true, + "type": "boolean" + }, + "level": { + "$ref": "Setting.Level", + "required": true + }, + "parent": { + "default": "", + "type": "string" + }, + "type": { + "$ref": "Setting.Type", + "required": true + } + } + }, + "Setting.Details.SettingBool": { + "additionalProperties": false, + "extends": "Setting.Details.SettingBase", + "id": "Setting.Details.SettingBool", + "properties": { + "default": { + "required": true, + "type": "boolean" + }, + "value": { + "required": true, + "type": "boolean" + } + } + }, + "Setting.Details.SettingDate": { + "additionalProperties": false, + "extends": "Setting.Details.SettingString", + "id": "Setting.Details.SettingDate" + }, + "Setting.Details.SettingInt": { + "additionalProperties": false, + "extends": "Setting.Details.SettingBase", + "id": "Setting.Details.SettingInt", + "properties": { + "default": { + "required": true, + "type": "integer" + }, + "maximum": { + "default": 0, + "type": "integer" + }, + "minimum": { + "default": 0, + "type": "integer" + }, + "options": { + "items": { + "properties": { + "label": { + "required": true, + "type": "string" + }, + "value": { + "required": true, + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + "step": { + "default": 0, + "type": "integer" + }, + "value": { + "required": true, + "type": "integer" + } + } + }, + "Setting.Details.SettingList": { + "additionalProperties": false, + "extends": "Setting.Details.SettingBase", + "id": "Setting.Details.SettingList", + "properties": { + "default": { + "$ref": "Setting.Value.List", + "required": true + }, + "definition": { + "$ref": "Setting.Details.Setting", + "required": true + }, + "delimiter": { + "required": true, + "type": "string" + }, + "elementtype": { + "$ref": "Setting.Type", + "required": true + }, + "maximumitems": { + "default": 0, + "type": "integer" + }, + "minimumitems": { + "default": 0, + "type": "integer" + }, + "value": { + "$ref": "Setting.Value.List", + "required": true + } + } + }, + "Setting.Details.SettingNumber": { + "additionalProperties": false, + "extends": "Setting.Details.SettingBase", + "id": "Setting.Details.SettingNumber", + "properties": { + "default": { + "required": true, + "type": "number" + }, + "maximum": { + "required": true, + "type": "number" + }, + "minimum": { + "required": true, + "type": "number" + }, + "step": { + "required": true, + "type": "number" + }, + "value": { + "required": true, + "type": "number" + } + } + }, + "Setting.Details.SettingPath": { + "additionalProperties": false, + "extends": "Setting.Details.SettingString", + "id": "Setting.Details.SettingPath", + "properties": { + "sources": { + "items": { + "type": "string" + }, + "type": "array" + }, + "writable": { + "required": true, + "type": "boolean" + } + } + }, + "Setting.Details.SettingString": { + "extends": "Setting.Details.SettingBase", + "id": "Setting.Details.SettingString", + "properties": { + "allowempty": { + "required": true, + "type": "boolean" + }, + "default": { + "required": true, + "type": "string" + }, + "options": { + "items": { + "properties": { + "label": { + "required": true, + "type": "string" + }, + "value": { + "required": true, + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "value": { + "required": true, + "type": "string" + } + } + }, + "Setting.Details.SettingTime": { + "additionalProperties": false, + "extends": "Setting.Details.SettingString", + "id": "Setting.Details.SettingTime" + }, + "Setting.Level": { + "default": "basic", + "enums": [ + "basic", + "standard", + "advanced", + "expert" + ], + "id": "Setting.Level", + "type": "string" + }, + "Setting.Type": { + "default": "boolean", + "enums": [ + "boolean", + "integer", + "number", + "string", + "action", + "list", + "path", + "addon", + "date", + "time" + ], + "id": "Setting.Type", + "type": "string" + }, + "Setting.Value": { + "default": null, + "id": "Setting.Value", + "type": [ + { + "type": "boolean" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "Setting.Value.Extended": { + "default": null, + "id": "Setting.Value.Extended", + "type": [ + { + "type": "boolean" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + }, + { + "$ref": "Setting.Value.List" + } + ] + }, + "Setting.Value.List": { + "id": "Setting.Value.List", + "items": { + "$ref": "Setting.Value" + }, + "type": "array" + }, + "System.Property.Name": { + "default": "canshutdown", + "enums": [ + "canshutdown", + "cansuspend", + "canhibernate", + "canreboot" + ], + "id": "System.Property.Name", + "type": "string" + }, + "System.Property.Value": { + "id": "System.Property.Value", + "properties": { + "canhibernate": { + "default": false, + "type": "boolean" + }, + "canreboot": { + "default": false, + "type": "boolean" + }, + "canshutdown": { + "default": false, + "type": "boolean" + }, + "cansuspend": { + "default": false, + "type": "boolean" + } + }, + "type": "object" + }, + "Textures.Details.Size": { + "id": "Textures.Details.Size", + "properties": { + "height": { + "default": 0, + "description": "Height of texture", + "type": "integer" + }, + "lastused": { + "default": "", + "description": "Date of last use", + "type": "string" + }, + "size": { + "default": 0, + "description": "Size of the texture (1 == largest)", + "type": "integer" + }, + "usecount": { + "default": 0, + "description": "Number of uses", + "type": "integer" + }, + "width": { + "default": 0, + "description": "Width of texture", + "type": "integer" + } + }, + "type": "object" + }, + "Textures.Details.Texture": { + "id": "Textures.Details.Texture", + "properties": { + "cachedurl": { + "default": "", + "description": "Cached URL on disk", + "type": "string" + }, + "imagehash": { + "default": "", + "description": "Hash of image", + "type": "string" + }, + "lasthashcheck": { + "default": "", + "description": "Last time source was checked for changes", + "type": "string" + }, + "sizes": { + "items": { + "$ref": "Textures.Details.Size" + }, + "type": "array" + }, + "textureid": { + "$ref": "Library.Id", + "default": -1 + }, + "url": { + "default": "", + "description": "Original source URL", + "type": "string" + } + }, + "type": "object" + }, + "Textures.Fields.Texture": { + "extends": "Item.Fields.Base", + "id": "Textures.Fields.Texture", + "items": { + "enums": [ + "url", + "cachedurl", + "lasthashcheck", + "imagehash", + "sizes" + ], + "type": "string" + } + }, + "Video.Cast": { + "id": "Video.Cast", + "items": { + "additionalProperties": false, + "properties": { + "name": { + "required": true, + "type": "string" + }, + "order": { + "required": true, + "type": "integer" + }, + "role": { + "required": true, + "type": "string" + }, + "thumbnail": { + "default": "", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "Video.Details.Base": { + "extends": "Media.Details.Base", + "id": "Video.Details.Base", + "properties": { + "art": { + "$ref": "Media.Artwork" + }, + "playcount": { + "default": 0, + "type": "integer" + } + } + }, + "Video.Details.Episode": { + "extends": "Video.Details.File", + "id": "Video.Details.Episode", + "properties": { + "cast": { + "$ref": "Video.Cast" + }, + "episode": { + "default": 0, + "type": "integer" + }, + "episodeid": { + "$ref": "Library.Id", + "required": true + }, + "firstaired": { + "default": "", + "type": "string" + }, + "originaltitle": { + "default": "", + "type": "string" + }, + "productioncode": { + "default": "", + "type": "string" + }, + "rating": { + "default": 0, + "type": "number" + }, + "ratings": { + "default": null, + "type": "any" + }, + "season": { + "default": 0, + "type": "integer" + }, + "seasonid": { + "$ref": "Library.Id", + "default": -1 + }, + "showtitle": { + "default": "", + "type": "string" + }, + "specialsortepisode": { + "default": 0, + "type": "integer" + }, + "specialsortseason": { + "default": 0, + "type": "integer" + }, + "tvshowid": { + "$ref": "Library.Id", + "default": -1 + }, + "uniqueid": { + "$ref": "Media.UniqueID" + }, + "userrating": { + "default": 0, + "type": "integer" + }, + "votes": { + "default": "", + "type": "string" + }, + "writer": { + "$ref": "Array.String" + } + } + }, + "Video.Details.File": { + "extends": "Video.Details.Item", + "id": "Video.Details.File", + "properties": { + "director": { + "$ref": "Array.String" + }, + "resume": { + "$ref": "Video.Resume" + }, + "runtime": { + "default": 0, + "description": "Runtime in seconds", + "type": "integer" + }, + "streamdetails": { + "$ref": "Video.Streams" + } + } + }, + "Video.Details.Item": { + "extends": "Video.Details.Media", + "id": "Video.Details.Item", + "properties": { + "dateadded": { + "default": "", + "type": "string" + }, + "file": { + "default": "", + "type": "string" + }, + "lastplayed": { + "default": "", + "type": "string" + }, + "plot": { + "default": "", + "type": "string" + } + } + }, + "Video.Details.Media": { + "extends": "Video.Details.Base", + "id": "Video.Details.Media", + "properties": { + "title": { + "default": "", + "type": "string" + } + } + }, + "Video.Details.Movie": { + "extends": "Video.Details.File", + "id": "Video.Details.Movie", + "properties": { + "cast": { + "$ref": "Video.Cast" + }, + "country": { + "$ref": "Array.String" + }, + "genre": { + "$ref": "Array.String" + }, + "imdbnumber": { + "default": "", + "type": "string" + }, + "movieid": { + "$ref": "Library.Id", + "required": true + }, + "mpaa": { + "default": "", + "type": "string" + }, + "originaltitle": { + "default": "", + "type": "string" + }, + "plotoutline": { + "default": "", + "type": "string" + }, + "premiered": { + "default": "", + "type": "string" + }, + "rating": { + "default": 0, + "type": "number" + }, + "ratings": { + "default": null, + "type": "any" + }, + "set": { + "default": "", + "type": "string" + }, + "setid": { + "$ref": "Library.Id", + "default": -1 + }, + "showlink": { + "$ref": "Array.String" + }, + "sorttitle": { + "default": "", + "type": "string" + }, + "studio": { + "$ref": "Array.String" + }, + "tag": { + "$ref": "Array.String" + }, + "tagline": { + "default": "", + "type": "string" + }, + "top250": { + "default": 0, + "type": "integer" + }, + "trailer": { + "default": "", + "type": "string" + }, + "uniqueid": { + "$ref": "Media.UniqueID" + }, + "userrating": { + "default": 0, + "type": "integer" + }, + "votes": { + "default": "", + "type": "string" + }, + "writer": { + "$ref": "Array.String" + }, + "year": { + "default": 0, + "type": "integer" + } + } + }, + "Video.Details.MovieSet": { + "extends": "Video.Details.Media", + "id": "Video.Details.MovieSet", + "properties": { + "plot": { + "default": "", + "type": "string" + }, + "setid": { + "$ref": "Library.Id", + "required": true + } + } + }, + "Video.Details.MovieSet.Extended": { + "extends": "Video.Details.MovieSet", + "id": "Video.Details.MovieSet.Extended", + "properties": { + "limits": { + "$ref": "List.LimitsReturned", + "required": true + }, + "movies": { + "items": { + "$ref": "Video.Details.Movie" + }, + "type": "array" + } + } + }, + "Video.Details.MusicVideo": { + "extends": "Video.Details.File", + "id": "Video.Details.MusicVideo", + "properties": { + "album": { + "default": "", + "type": "string" + }, + "artist": { + "$ref": "Array.String" + }, + "genre": { + "$ref": "Array.String" + }, + "musicvideoid": { + "$ref": "Library.Id", + "required": true + }, + "premiered": { + "default": "", + "type": "string" + }, + "rating": { + "default": 0, + "type": "number" + }, + "studio": { + "$ref": "Array.String" + }, + "tag": { + "$ref": "Array.String" + }, + "track": { + "default": 0, + "type": "integer" + }, + "userrating": { + "default": 0, + "type": "integer" + }, + "year": { + "default": 0, + "type": "integer" + } + } + }, + "Video.Details.Season": { + "extends": "Video.Details.Base", + "id": "Video.Details.Season", + "properties": { + "episode": { + "default": 0, + "type": "integer" + }, + "season": { + "required": true, + "type": "integer" + }, + "seasonid": { + "$ref": "Library.Id", + "required": true + }, + "showtitle": { + "default": "", + "type": "string" + }, + "tvshowid": { + "$ref": "Library.Id", + "default": -1 + }, + "userrating": { + "default": 0, + "type": "integer" + }, + "watchedepisodes": { + "default": 0, + "type": "integer" + } + } + }, + "Video.Details.TVShow": { + "extends": "Video.Details.Item", + "id": "Video.Details.TVShow", + "properties": { + "cast": { + "$ref": "Video.Cast" + }, + "episode": { + "default": 0, + "type": "integer" + }, + "episodeguide": { + "default": "", + "type": "string" + }, + "genre": { + "$ref": "Array.String" + }, + "imdbnumber": { + "default": "", + "type": "string" + }, + "mpaa": { + "default": "", + "type": "string" + }, + "originaltitle": { + "default": "", + "type": "string" + }, + "premiered": { + "default": "", + "type": "string" + }, + "rating": { + "default": 0, + "type": "number" + }, + "ratings": { + "default": null, + "type": "any" + }, + "runtime": { + "default": 0, + "description": "Runtime in seconds", + "type": "integer" + }, + "season": { + "default": 0, + "type": "integer" + }, + "sorttitle": { + "default": "", + "type": "string" + }, + "studio": { + "$ref": "Array.String" + }, + "tag": { + "$ref": "Array.String" + }, + "tvshowid": { + "$ref": "Library.Id", + "required": true + }, + "uniqueid": { + "$ref": "Media.UniqueID" + }, + "userrating": { + "default": 0, + "type": "integer" + }, + "votes": { + "default": "", + "type": "string" + }, + "watchedepisodes": { + "default": 0, + "type": "integer" + }, + "year": { + "default": 0, + "type": "integer" + } + } + }, + "Video.Fields.Episode": { + "extends": "Item.Fields.Base", + "id": "Video.Fields.Episode", + "items": { + "description": "Requesting the cast, ratings, streamdetails, uniqueid and/or tag field will result in increased response times", + "enums": [ + "title", + "plot", + "votes", + "rating", + "writer", + "firstaired", + "playcount", + "runtime", + "director", + "productioncode", + "season", + "episode", + "originaltitle", + "showtitle", + "cast", + "streamdetails", + "lastplayed", + "fanart", + "thumbnail", + "file", + "resume", + "tvshowid", + "dateadded", + "uniqueid", + "art", + "specialsortseason", + "specialsortepisode", + "userrating", + "seasonid", + "ratings" + ], + "type": "string" + } + }, + "Video.Fields.Movie": { + "extends": "Item.Fields.Base", + "id": "Video.Fields.Movie", + "items": { + "description": "Requesting the cast, ratings, showlink, streamdetails, uniqueid and/or tag field will result in increased response times", + "enums": [ + "title", + "genre", + "year", + "rating", + "director", + "trailer", + "tagline", + "plot", + "plotoutline", + "originaltitle", + "lastplayed", + "playcount", + "writer", + "studio", + "mpaa", + "cast", + "country", + "imdbnumber", + "runtime", + "set", + "showlink", + "streamdetails", + "top250", + "votes", + "fanart", + "thumbnail", + "file", + "sorttitle", + "resume", + "setid", + "dateadded", + "tag", + "art", + "userrating", + "ratings", + "premiered", + "uniqueid" + ], + "type": "string" + } + }, + "Video.Fields.MovieSet": { + "extends": "Item.Fields.Base", + "id": "Video.Fields.MovieSet", + "items": { + "enums": [ + "title", + "playcount", + "fanart", + "thumbnail", + "art", + "plot" + ], + "type": "string" + } + }, + "Video.Fields.MusicVideo": { + "extends": "Item.Fields.Base", + "id": "Video.Fields.MusicVideo", + "items": { + "description": "Requesting the streamdetails and/or tag field will result in increased response times", + "enums": [ + "title", + "playcount", + "runtime", + "director", + "studio", + "year", + "plot", + "album", + "artist", + "genre", + "track", + "streamdetails", + "lastplayed", + "fanart", + "thumbnail", + "file", + "resume", + "dateadded", + "tag", + "art", + "rating", + "userrating", + "premiered" + ], + "type": "string" + } + }, + "Video.Fields.Season": { + "extends": "Item.Fields.Base", + "id": "Video.Fields.Season", + "items": { + "enums": [ + "season", + "showtitle", + "playcount", + "episode", + "fanart", + "thumbnail", + "tvshowid", + "watchedepisodes", + "art", + "userrating" + ], + "type": "string" + } + }, + "Video.Fields.TVShow": { + "extends": "Item.Fields.Base", + "id": "Video.Fields.TVShow", + "items": { + "description": "Requesting the cast, ratings, uniqueid and/or tag field will result in increased response times", + "enums": [ + "title", + "genre", + "year", + "rating", + "plot", + "studio", + "mpaa", + "cast", + "playcount", + "episode", + "imdbnumber", + "premiered", + "votes", + "lastplayed", + "fanart", + "thumbnail", + "file", + "originaltitle", + "sorttitle", + "episodeguide", + "season", + "watchedepisodes", + "dateadded", + "tag", + "art", + "userrating", + "ratings", + "runtime", + "uniqueid" + ], + "type": "string" + } + }, + "Video.Rating": { + "id": "Video.Rating", + "properties": { + "default": { + "default": false, + "type": "boolean" + }, + "rating": { + "required": true, + "type": "number" + }, + "votes": { + "default": 0, + "type": "integer" + } + }, + "type": "object" + }, + "Video.Ratings": { + "additionalProperties": { + "$ref": "Video.Rating" + }, + "id": "Video.Ratings", + "type": "object" + }, + "Video.Ratings.Set": { + "additionalProperties": { + "default": null, + "type": [ + { + "type": "null" + }, + { + "$ref": "Video.Rating" + } + ] + }, + "id": "Video.Ratings.Set", + "type": "object" + }, + "Video.Resume": { + "additionalProperties": false, + "id": "Video.Resume", + "properties": { + "position": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "total": { + "default": 0, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "Video.Streams": { + "additionalProperties": false, + "id": "Video.Streams", + "properties": { + "audio": { + "items": { + "additionalProperties": false, + "properties": { + "channels": { + "default": 0, + "type": "integer" + }, + "codec": { + "default": "", + "type": "string" + }, + "language": { + "default": "", + "type": "string" + } + }, + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "subtitle": { + "items": { + "additionalProperties": false, + "properties": { + "language": { + "default": "", + "type": "string" + } + }, + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "video": { + "items": { + "additionalProperties": false, + "properties": { + "aspect": { + "default": 0, + "type": "number" + }, + "codec": { + "default": "", + "type": "string" + }, + "duration": { + "default": 0, + "type": "integer" + }, + "height": { + "default": 0, + "type": "integer" + }, + "width": { + "default": 0, + "type": "integer" + } + }, + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "type": "object" + } + }, + "version": "9.1.1" + } +} \ No newline at end of file