From 8fa47f9bef2d7979eed83e20f55c899b446f2c1e Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Fri, 23 Feb 2024 14:46:39 +0000 Subject: [PATCH] ci: regenerated with OpenAPI Doc 0.0.3, Speakeasy CLI 1.193.0 --- .speakeasy/gen.lock | 122 +++++-- PlexAPI/Activities.cs | 63 ++-- PlexAPI/Butler.cs | 134 ++++--- PlexAPI/Hubs.cs | 65 ++-- PlexAPI/Library.cs | 333 ++++++++++++------ PlexAPI/Log.cs | 93 +++-- PlexAPI/Media.cs | 82 +++-- PlexAPI/Models/Requests/Account.cs | 42 +++ .../Models/Requests/CreatePlaylistRequest.cs | 2 +- .../Models/Requests/GetLibrariesDirectory.cs | 2 +- .../Models/Requests/GetLibrariesLocation.cs | 24 ++ .../Requests/GetLibraryItemsMediaContainer.cs | 3 + .../Requests/GetLibraryItemsMetadata.cs | 69 ++++ PlexAPI/Models/Requests/GetPinErrors.cs | 27 ++ .../Models/Requests/GetPinPlexResponseBody.cs | 25 ++ PlexAPI/Models/Requests/GetPinRequest.cs | 42 +++ PlexAPI/Models/Requests/GetPinResponse.cs | 44 +++ PlexAPI/Models/Requests/GetPinResponseBody.cs | 70 ++++ .../GetServerPreferencesMediaContainer.cs | 2 +- .../Models/Requests/GetStatisticsDevice.cs | 33 ++ .../Models/Requests/GetStatisticsErrors.cs | 27 ++ .../Requests/GetStatisticsMediaContainer.cs | 31 ++ .../Models/Requests/GetStatisticsRequest.cs | 29 ++ .../Models/Requests/GetStatisticsResponse.cs | 44 +++ .../Requests/GetStatisticsResponseBody.cs | 24 ++ .../GetStatisticsStatisticsResponseBody.cs | 25 ++ PlexAPI/Models/Requests/GetTokenErrors.cs | 27 ++ PlexAPI/Models/Requests/GetTokenRequest.cs | 36 ++ PlexAPI/Models/Requests/GetTokenResponse.cs | 39 ++ .../Models/Requests/GetTokenResponseBody.cs | 25 ++ .../GetTransientTokenQueryParamType.cs | 58 +++ .../Requests/GetTransientTokenRequest.cs | 2 +- PlexAPI/Models/Requests/Location.cs | 32 +- PlexAPI/Models/Requests/QueryParamType.cs | 10 +- .../Requests/SearchLibraryMediaContainer.cs | 58 +++ .../Models/Requests/SearchLibraryMetadata.cs | 78 ++++ .../Models/Requests/SearchLibraryRequest.cs | 30 ++ .../Models/Requests/SearchLibraryResponse.cs | 39 ++ .../Requests/SearchLibraryResponseBody.cs | 24 ++ PlexAPI/Models/Requests/Setting.cs | 48 +++ PlexAPI/Models/Requests/StatisticsMedia.cs | 39 ++ PlexAPI/Models/Requests/Tag.cs | 2 - PlexAPI/Models/Requests/Type.cs | 47 +-- PlexAPI/Playlists.cs | 239 ++++++++----- PlexAPI/Plex.cs | 210 +++++++++++ PlexAPI/PlexAPI.csproj | 2 +- PlexAPI/PlexAPISDK.cs | 110 ++++-- PlexAPI/Search.cs | 85 +++-- PlexAPI/Security.cs | 63 ++-- PlexAPI/Server.cs | 229 +++++++----- PlexAPI/Sessions.cs | 117 +++--- PlexAPI/Statistics.cs | 129 +++++++ PlexAPI/Updater.cs | 86 +++-- PlexAPI/Utils/BigIntSerializer.cs | 11 +- PlexAPI/Utils/DecimalSerializer.cs | 11 +- PlexAPI/Utils/EnumSerializer.cs | 11 +- PlexAPI/Utils/IsoDateTimeSerializer.cs | 12 +- PlexAPI/Utils/RequestBodySerializer.cs | 29 +- PlexAPI/Utils/SecuritySerializer.cs | 8 +- PlexAPI/Utils/Utilities.cs | 48 ++- PlexAPI/Video.cs | 143 ++++---- README.md | 70 +++- RELEASES.md | 10 +- USAGE.md | 3 +- docs/Models/Requests/Account.md | 15 + docs/Models/Requests/CreatePlaylistRequest.md | 14 +- docs/Models/Requests/GetLibrariesDirectory.md | 46 +-- docs/Models/Requests/GetLibrariesLocation.md | 9 + .../Requests/GetLibraryItemsMediaContainer.md | 35 +- .../Requests/GetLibraryItemsMetadata.md | 25 +- docs/Models/Requests/GetPinErrors.md | 10 + .../Models/Requests/GetPinPlexResponseBody.md | 10 + docs/Models/Requests/GetPinRequest.md | 9 + docs/Models/Requests/GetPinResponse.md | 12 + docs/Models/Requests/GetPinResponseBody.md | 21 ++ .../GetServerPreferencesMediaContainer.md | 8 +- docs/Models/Requests/GetStatisticsDevice.md | 12 + docs/Models/Requests/GetStatisticsErrors.md | 10 + .../Requests/GetStatisticsMediaContainer.md | 11 + docs/Models/Requests/GetStatisticsRequest.md | 8 + docs/Models/Requests/GetStatisticsResponse.md | 12 + .../Requests/GetStatisticsResponseBody.md | 10 + .../GetStatisticsStatisticsResponseBody.md | 10 + docs/Models/Requests/GetTokenErrors.md | 10 + docs/Models/Requests/GetTokenRequest.md | 9 + docs/Models/Requests/GetTokenResponse.md | 11 + docs/Models/Requests/GetTokenResponseBody.md | 10 + .../GetTransientTokenQueryParamType.md | 10 + .../Requests/GetTransientTokenRequest.md | 8 +- docs/Models/Requests/Location.md | 16 +- docs/Models/Requests/QueryParamType.md | 10 +- .../Requests/SearchLibraryMediaContainer.md | 20 ++ docs/Models/Requests/SearchLibraryMetadata.md | 27 ++ docs/Models/Requests/SearchLibraryRequest.md | 9 + docs/Models/Requests/SearchLibraryResponse.md | 11 + .../Requests/SearchLibraryResponseBody.md | 10 + docs/Models/Requests/Setting.md | 17 + docs/Models/Requests/StatisticsMedia.md | 14 + docs/Models/Requests/Tag.md | 43 ++- docs/Models/Requests/Type.md | 9 +- docs/sdks/activities/README.md | 8 +- docs/sdks/butler/README.md | 19 +- docs/sdks/hubs/README.md | 15 +- docs/sdks/library/README.md | 105 ++++-- docs/sdks/log/README.md | 14 +- docs/sdks/media/README.md | 18 +- docs/sdks/playlists/README.md | 59 ++-- docs/sdks/plex/README.md | 84 +++++ docs/sdks/search/README.md | 21 +- docs/sdks/security/README.md | 20 +- docs/sdks/server/README.md | 24 +- docs/sdks/sessions/README.md | 14 +- docs/sdks/statistics/README.md | 43 +++ docs/sdks/updater/README.md | 15 +- docs/sdks/video/README.md | 88 +++-- gen.yaml | 5 +- global.json | 6 + 117 files changed, 3662 insertions(+), 1104 deletions(-) create mode 100644 PlexAPI/Models/Requests/Account.cs create mode 100644 PlexAPI/Models/Requests/GetLibrariesLocation.cs create mode 100644 PlexAPI/Models/Requests/GetPinErrors.cs create mode 100644 PlexAPI/Models/Requests/GetPinPlexResponseBody.cs create mode 100644 PlexAPI/Models/Requests/GetPinRequest.cs create mode 100644 PlexAPI/Models/Requests/GetPinResponse.cs create mode 100644 PlexAPI/Models/Requests/GetPinResponseBody.cs create mode 100644 PlexAPI/Models/Requests/GetStatisticsDevice.cs create mode 100644 PlexAPI/Models/Requests/GetStatisticsErrors.cs create mode 100644 PlexAPI/Models/Requests/GetStatisticsMediaContainer.cs create mode 100644 PlexAPI/Models/Requests/GetStatisticsRequest.cs create mode 100644 PlexAPI/Models/Requests/GetStatisticsResponse.cs create mode 100644 PlexAPI/Models/Requests/GetStatisticsResponseBody.cs create mode 100644 PlexAPI/Models/Requests/GetStatisticsStatisticsResponseBody.cs create mode 100644 PlexAPI/Models/Requests/GetTokenErrors.cs create mode 100644 PlexAPI/Models/Requests/GetTokenRequest.cs create mode 100644 PlexAPI/Models/Requests/GetTokenResponse.cs create mode 100644 PlexAPI/Models/Requests/GetTokenResponseBody.cs create mode 100644 PlexAPI/Models/Requests/GetTransientTokenQueryParamType.cs create mode 100644 PlexAPI/Models/Requests/SearchLibraryMediaContainer.cs create mode 100644 PlexAPI/Models/Requests/SearchLibraryMetadata.cs create mode 100644 PlexAPI/Models/Requests/SearchLibraryRequest.cs create mode 100644 PlexAPI/Models/Requests/SearchLibraryResponse.cs create mode 100644 PlexAPI/Models/Requests/SearchLibraryResponseBody.cs create mode 100644 PlexAPI/Models/Requests/Setting.cs create mode 100644 PlexAPI/Models/Requests/StatisticsMedia.cs create mode 100644 PlexAPI/Plex.cs create mode 100644 PlexAPI/Statistics.cs create mode 100644 docs/Models/Requests/Account.md create mode 100644 docs/Models/Requests/GetLibrariesLocation.md create mode 100644 docs/Models/Requests/GetPinErrors.md create mode 100644 docs/Models/Requests/GetPinPlexResponseBody.md create mode 100644 docs/Models/Requests/GetPinRequest.md create mode 100644 docs/Models/Requests/GetPinResponse.md create mode 100644 docs/Models/Requests/GetPinResponseBody.md create mode 100644 docs/Models/Requests/GetStatisticsDevice.md create mode 100644 docs/Models/Requests/GetStatisticsErrors.md create mode 100644 docs/Models/Requests/GetStatisticsMediaContainer.md create mode 100644 docs/Models/Requests/GetStatisticsRequest.md create mode 100644 docs/Models/Requests/GetStatisticsResponse.md create mode 100644 docs/Models/Requests/GetStatisticsResponseBody.md create mode 100644 docs/Models/Requests/GetStatisticsStatisticsResponseBody.md create mode 100644 docs/Models/Requests/GetTokenErrors.md create mode 100644 docs/Models/Requests/GetTokenRequest.md create mode 100644 docs/Models/Requests/GetTokenResponse.md create mode 100644 docs/Models/Requests/GetTokenResponseBody.md create mode 100644 docs/Models/Requests/GetTransientTokenQueryParamType.md create mode 100644 docs/Models/Requests/SearchLibraryMediaContainer.md create mode 100644 docs/Models/Requests/SearchLibraryMetadata.md create mode 100644 docs/Models/Requests/SearchLibraryRequest.md create mode 100644 docs/Models/Requests/SearchLibraryResponse.md create mode 100644 docs/Models/Requests/SearchLibraryResponseBody.md create mode 100644 docs/Models/Requests/Setting.md create mode 100644 docs/Models/Requests/StatisticsMedia.md create mode 100644 docs/sdks/plex/README.md create mode 100644 docs/sdks/statistics/README.md create mode 100644 global.json diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index eabaf30..6a8ee44 100755 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,37 +1,41 @@ lockVersion: 2.0.0 id: 5a8dbcbc-e0ee-41f0-9d84-b8b50567d1e9 management: - docChecksum: 7aba498c024534142941d65a7c2e649c + docChecksum: 278d186496d83d5830ba4870f8cad39d docVersion: 0.0.3 speakeasyVersion: internal - generationVersion: 2.237.3 - releaseVersion: 0.1.5 - configChecksum: 112f7d72fae8408e2dd1ef59ee88fb3a + generationVersion: 2.269.0 + releaseVersion: 0.2.0 + configChecksum: 4ebe302dc8fa1b45e1377207cb76f6ff repoURL: https://github.com/LukeHagar/plexcsharp.git repoSubDirectory: . published: true features: csharp: - core: 3.3.1 + core: 3.4.1 flattening: 2.81.1 - globalSecurity: 2.81.3 + globalSecurity: 2.83.1 globalServerURLs: 2.82.2 + methodServerURLs: 2.82.1 nameOverrides: 2.81.1 generatedFiles: - PlexAPI/Server.cs - PlexAPI/Media.cs + - PlexAPI/Video.cs - PlexAPI/Activities.cs - PlexAPI/Butler.cs - PlexAPI/Hubs.cs - PlexAPI/Search.cs - PlexAPI/Library.cs - PlexAPI/Log.cs + - PlexAPI/Plex.cs - PlexAPI/Playlists.cs - PlexAPI/Security.cs + - PlexAPI/Statistics.cs - PlexAPI/Sessions.cs - PlexAPI/Updater.cs - - PlexAPI/Video.cs - PlexAPI/PlexAPISDK.cs + - global.json - PlexAPI/Utils/BigIntSerializer.cs - PlexAPI/Utils/DecimalSerializer.cs - PlexAPI/Utils/EnumSerializer.cs @@ -54,6 +58,7 @@ generatedFiles: - PlexAPI/Models/Requests/GetServerCapabilitiesResponse.cs - PlexAPI/Models/Requests/GetServerPreferencesErrors.cs - PlexAPI/Models/Requests/GetServerPreferencesServerResponseBody.cs + - PlexAPI/Models/Requests/Setting.cs - PlexAPI/Models/Requests/GetServerPreferencesMediaContainer.cs - PlexAPI/Models/Requests/GetServerPreferencesResponseBody.cs - PlexAPI/Models/Requests/GetServerPreferencesResponse.cs @@ -103,6 +108,15 @@ generatedFiles: - PlexAPI/Models/Requests/UpdatePlayProgressErrors.cs - PlexAPI/Models/Requests/UpdatePlayProgressResponseBody.cs - PlexAPI/Models/Requests/UpdatePlayProgressResponse.cs + - PlexAPI/Models/Requests/State.cs + - PlexAPI/Models/Requests/GetTimelineRequest.cs + - PlexAPI/Models/Requests/GetTimelineErrors.cs + - PlexAPI/Models/Requests/GetTimelineResponseBody.cs + - PlexAPI/Models/Requests/GetTimelineResponse.cs + - PlexAPI/Models/Requests/StartUniversalTranscodeRequest.cs + - PlexAPI/Models/Requests/StartUniversalTranscodeErrors.cs + - PlexAPI/Models/Requests/StartUniversalTranscodeResponseBody.cs + - PlexAPI/Models/Requests/StartUniversalTranscodeResponse.cs - PlexAPI/Models/Requests/GetServerActivitiesErrors.cs - PlexAPI/Models/Requests/GetServerActivitiesActivitiesResponseBody.cs - PlexAPI/Models/Requests/Context.cs @@ -203,7 +217,7 @@ generatedFiles: - PlexAPI/Models/Requests/GetRecentlyAddedResponse.cs - PlexAPI/Models/Requests/GetLibrariesErrors.cs - PlexAPI/Models/Requests/GetLibrariesLibraryResponseBody.cs - - PlexAPI/Models/Requests/Location.cs + - PlexAPI/Models/Requests/GetLibrariesLocation.cs - PlexAPI/Models/Requests/GetLibrariesDirectory.cs - PlexAPI/Models/Requests/GetLibrariesMediaContainer.cs - PlexAPI/Models/Requests/GetLibrariesResponseBody.cs @@ -243,6 +257,12 @@ generatedFiles: - PlexAPI/Models/Requests/RefreshLibraryErrors.cs - PlexAPI/Models/Requests/RefreshLibraryResponseBody.cs - PlexAPI/Models/Requests/RefreshLibraryResponse.cs + - PlexAPI/Models/Requests/Type.cs + - PlexAPI/Models/Requests/SearchLibraryRequest.cs + - PlexAPI/Models/Requests/SearchLibraryMetadata.cs + - PlexAPI/Models/Requests/SearchLibraryMediaContainer.cs + - PlexAPI/Models/Requests/SearchLibraryResponseBody.cs + - PlexAPI/Models/Requests/SearchLibraryResponse.cs - PlexAPI/Models/Requests/GetMetadataRequest.cs - PlexAPI/Models/Requests/GetMetadataErrors.cs - PlexAPI/Models/Requests/GetMetadataLibraryResponseBody.cs @@ -290,7 +310,17 @@ generatedFiles: - PlexAPI/Models/Requests/EnablePaperTrailErrors.cs - PlexAPI/Models/Requests/EnablePaperTrailResponseBody.cs - PlexAPI/Models/Requests/EnablePaperTrailResponse.cs - - PlexAPI/Models/Requests/Type.cs + - PlexAPI/Models/Requests/GetPinRequest.cs + - PlexAPI/Models/Requests/GetPinErrors.cs + - PlexAPI/Models/Requests/GetPinPlexResponseBody.cs + - PlexAPI/Models/Requests/Location.cs + - PlexAPI/Models/Requests/GetPinResponseBody.cs + - PlexAPI/Models/Requests/GetPinResponse.cs + - PlexAPI/Models/Requests/GetTokenRequest.cs + - PlexAPI/Models/Requests/GetTokenErrors.cs + - PlexAPI/Models/Requests/GetTokenResponseBody.cs + - PlexAPI/Models/Requests/GetTokenResponse.cs + - PlexAPI/Models/Requests/QueryParamType.cs - PlexAPI/Models/Requests/Smart.cs - PlexAPI/Models/Requests/CreatePlaylistRequest.cs - PlexAPI/Models/Requests/CreatePlaylistErrors.cs @@ -353,7 +383,7 @@ generatedFiles: - PlexAPI/Models/Requests/UploadPlaylistErrors.cs - PlexAPI/Models/Requests/UploadPlaylistResponseBody.cs - PlexAPI/Models/Requests/UploadPlaylistResponse.cs - - PlexAPI/Models/Requests/QueryParamType.cs + - PlexAPI/Models/Requests/GetTransientTokenQueryParamType.cs - PlexAPI/Models/Requests/Scope.cs - PlexAPI/Models/Requests/GetTransientTokenRequest.cs - PlexAPI/Models/Requests/GetTransientTokenErrors.cs @@ -363,6 +393,15 @@ generatedFiles: - PlexAPI/Models/Requests/GetSourceConnectionInformationErrors.cs - PlexAPI/Models/Requests/GetSourceConnectionInformationResponseBody.cs - PlexAPI/Models/Requests/GetSourceConnectionInformationResponse.cs + - PlexAPI/Models/Requests/GetStatisticsRequest.cs + - PlexAPI/Models/Requests/GetStatisticsErrors.cs + - PlexAPI/Models/Requests/GetStatisticsStatisticsResponseBody.cs + - PlexAPI/Models/Requests/GetStatisticsDevice.cs + - PlexAPI/Models/Requests/Account.cs + - PlexAPI/Models/Requests/StatisticsMedia.cs + - PlexAPI/Models/Requests/GetStatisticsMediaContainer.cs + - PlexAPI/Models/Requests/GetStatisticsResponseBody.cs + - PlexAPI/Models/Requests/GetStatisticsResponse.cs - PlexAPI/Models/Requests/GetSessionsErrors.cs - PlexAPI/Models/Requests/GetSessionsSessionsResponseBody.cs - PlexAPI/Models/Requests/GetSessionsStream.cs @@ -408,15 +447,6 @@ generatedFiles: - PlexAPI/Models/Requests/ApplyUpdatesErrors.cs - PlexAPI/Models/Requests/ApplyUpdatesResponseBody.cs - PlexAPI/Models/Requests/ApplyUpdatesResponse.cs - - PlexAPI/Models/Requests/StartUniversalTranscodeRequest.cs - - PlexAPI/Models/Requests/StartUniversalTranscodeErrors.cs - - PlexAPI/Models/Requests/StartUniversalTranscodeResponseBody.cs - - PlexAPI/Models/Requests/StartUniversalTranscodeResponse.cs - - PlexAPI/Models/Requests/State.cs - - PlexAPI/Models/Requests/GetTimelineRequest.cs - - PlexAPI/Models/Requests/GetTimelineErrors.cs - - PlexAPI/Models/Requests/GetTimelineResponseBody.cs - - PlexAPI/Models/Requests/GetTimelineResponse.cs - PlexAPI/Models/Components/Security.cs - docs/Models/Requests/Errors.md - docs/Models/Requests/GetServerCapabilitiesServerResponseBody.md @@ -426,6 +456,7 @@ generatedFiles: - docs/Models/Requests/GetServerCapabilitiesResponse.md - docs/Models/Requests/GetServerPreferencesErrors.md - docs/Models/Requests/GetServerPreferencesServerResponseBody.md + - docs/Models/Requests/Setting.md - docs/Models/Requests/GetServerPreferencesMediaContainer.md - docs/Models/Requests/GetServerPreferencesResponseBody.md - docs/Models/Requests/GetServerPreferencesResponse.md @@ -475,6 +506,15 @@ generatedFiles: - docs/Models/Requests/UpdatePlayProgressErrors.md - docs/Models/Requests/UpdatePlayProgressResponseBody.md - docs/Models/Requests/UpdatePlayProgressResponse.md + - docs/Models/Requests/State.md + - docs/Models/Requests/GetTimelineRequest.md + - docs/Models/Requests/GetTimelineErrors.md + - docs/Models/Requests/GetTimelineResponseBody.md + - docs/Models/Requests/GetTimelineResponse.md + - docs/Models/Requests/StartUniversalTranscodeRequest.md + - docs/Models/Requests/StartUniversalTranscodeErrors.md + - docs/Models/Requests/StartUniversalTranscodeResponseBody.md + - docs/Models/Requests/StartUniversalTranscodeResponse.md - docs/Models/Requests/GetServerActivitiesErrors.md - docs/Models/Requests/GetServerActivitiesActivitiesResponseBody.md - docs/Models/Requests/Context.md @@ -575,7 +615,7 @@ generatedFiles: - docs/Models/Requests/GetRecentlyAddedResponse.md - docs/Models/Requests/GetLibrariesErrors.md - docs/Models/Requests/GetLibrariesLibraryResponseBody.md - - docs/Models/Requests/Location.md + - docs/Models/Requests/GetLibrariesLocation.md - docs/Models/Requests/GetLibrariesDirectory.md - docs/Models/Requests/GetLibrariesMediaContainer.md - docs/Models/Requests/GetLibrariesResponseBody.md @@ -615,6 +655,12 @@ generatedFiles: - docs/Models/Requests/RefreshLibraryErrors.md - docs/Models/Requests/RefreshLibraryResponseBody.md - docs/Models/Requests/RefreshLibraryResponse.md + - docs/Models/Requests/Type.md + - docs/Models/Requests/SearchLibraryRequest.md + - docs/Models/Requests/SearchLibraryMetadata.md + - docs/Models/Requests/SearchLibraryMediaContainer.md + - docs/Models/Requests/SearchLibraryResponseBody.md + - docs/Models/Requests/SearchLibraryResponse.md - docs/Models/Requests/GetMetadataRequest.md - docs/Models/Requests/GetMetadataErrors.md - docs/Models/Requests/GetMetadataLibraryResponseBody.md @@ -662,7 +708,17 @@ generatedFiles: - docs/Models/Requests/EnablePaperTrailErrors.md - docs/Models/Requests/EnablePaperTrailResponseBody.md - docs/Models/Requests/EnablePaperTrailResponse.md - - docs/Models/Requests/Type.md + - docs/Models/Requests/GetPinRequest.md + - docs/Models/Requests/GetPinErrors.md + - docs/Models/Requests/GetPinPlexResponseBody.md + - docs/Models/Requests/Location.md + - docs/Models/Requests/GetPinResponseBody.md + - docs/Models/Requests/GetPinResponse.md + - docs/Models/Requests/GetTokenRequest.md + - docs/Models/Requests/GetTokenErrors.md + - docs/Models/Requests/GetTokenResponseBody.md + - docs/Models/Requests/GetTokenResponse.md + - docs/Models/Requests/QueryParamType.md - docs/Models/Requests/Smart.md - docs/Models/Requests/CreatePlaylistRequest.md - docs/Models/Requests/CreatePlaylistErrors.md @@ -725,7 +781,7 @@ generatedFiles: - docs/Models/Requests/UploadPlaylistErrors.md - docs/Models/Requests/UploadPlaylistResponseBody.md - docs/Models/Requests/UploadPlaylistResponse.md - - docs/Models/Requests/QueryParamType.md + - docs/Models/Requests/GetTransientTokenQueryParamType.md - docs/Models/Requests/Scope.md - docs/Models/Requests/GetTransientTokenRequest.md - docs/Models/Requests/GetTransientTokenErrors.md @@ -735,6 +791,15 @@ generatedFiles: - docs/Models/Requests/GetSourceConnectionInformationErrors.md - docs/Models/Requests/GetSourceConnectionInformationResponseBody.md - docs/Models/Requests/GetSourceConnectionInformationResponse.md + - docs/Models/Requests/GetStatisticsRequest.md + - docs/Models/Requests/GetStatisticsErrors.md + - docs/Models/Requests/GetStatisticsStatisticsResponseBody.md + - docs/Models/Requests/GetStatisticsDevice.md + - docs/Models/Requests/Account.md + - docs/Models/Requests/StatisticsMedia.md + - docs/Models/Requests/GetStatisticsMediaContainer.md + - docs/Models/Requests/GetStatisticsResponseBody.md + - docs/Models/Requests/GetStatisticsResponse.md - docs/Models/Requests/GetSessionsErrors.md - docs/Models/Requests/GetSessionsSessionsResponseBody.md - docs/Models/Requests/GetSessionsStream.md @@ -780,29 +845,22 @@ generatedFiles: - docs/Models/Requests/ApplyUpdatesErrors.md - docs/Models/Requests/ApplyUpdatesResponseBody.md - docs/Models/Requests/ApplyUpdatesResponse.md - - docs/Models/Requests/StartUniversalTranscodeRequest.md - - docs/Models/Requests/StartUniversalTranscodeErrors.md - - docs/Models/Requests/StartUniversalTranscodeResponseBody.md - - docs/Models/Requests/StartUniversalTranscodeResponse.md - - docs/Models/Requests/State.md - - docs/Models/Requests/GetTimelineRequest.md - - docs/Models/Requests/GetTimelineErrors.md - - docs/Models/Requests/GetTimelineResponseBody.md - - docs/Models/Requests/GetTimelineResponse.md - docs/Models/Components/Security.md - docs/sdks/plexapi/README.md - docs/sdks/server/README.md - docs/sdks/media/README.md + - docs/sdks/video/README.md - docs/sdks/activities/README.md - docs/sdks/butler/README.md - docs/sdks/hubs/README.md - docs/sdks/search/README.md - docs/sdks/library/README.md - docs/sdks/log/README.md + - docs/sdks/plex/README.md - docs/sdks/playlists/README.md - docs/sdks/security/README.md + - docs/sdks/statistics/README.md - docs/sdks/sessions/README.md - docs/sdks/updater/README.md - - docs/sdks/video/README.md - USAGE.md - .gitattributes diff --git a/PlexAPI/Activities.cs b/PlexAPI/Activities.cs index d86f3a2..a12ec14 100644 --- a/PlexAPI/Activities.cs +++ b/PlexAPI/Activities.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -70,18 +71,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Activities(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Activities(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -90,50 +91,57 @@ namespace PlexAPI public async Task GetServerActivitiesAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/activities"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetServerActivitiesResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task CancelServerActivitiesAsync(string activityUUID) @@ -144,40 +152,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/activities/{activityUUID}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Delete, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new CancelServerActivitiesResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Butler.cs b/PlexAPI/Butler.cs index 693dc68..396318f 100644 --- a/PlexAPI/Butler.cs +++ b/PlexAPI/Butler.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -97,18 +98,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Butler(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Butler(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -117,130 +118,149 @@ namespace PlexAPI public async Task GetButlerTasksAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/butler"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetButlerTasksResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task StartAllTasksAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/butler"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Post, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new StartAllTasksResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task StopAllTasksAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/butler"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Delete, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new StopAllTasksResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task StartTaskAsync(TaskName taskName) @@ -251,40 +271,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/butler/{taskName}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Post, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new StartTaskResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 202) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task StopTaskAsync(PathParamTaskName taskName) @@ -295,40 +320,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/butler/{taskName}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Delete, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new StopTaskResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400) || (response.StatusCode == 404)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Hubs.cs b/PlexAPI/Hubs.cs index 446ee78..d40e9df 100644 --- a/PlexAPI/Hubs.cs +++ b/PlexAPI/Hubs.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -59,18 +60,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Hubs(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Hubs(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -85,49 +86,55 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/hubs", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetGlobalHubsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetLibraryHubsAsync(double sectionId, double? count = null, QueryParamOnlyTransient? onlyTransient = null) @@ -140,49 +147,55 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/hubs/sections/{sectionId}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetLibraryHubsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Library.cs b/PlexAPI/Library.cs index bdde534..496c1b1 100644 --- a/PlexAPI/Library.cs +++ b/PlexAPI/Library.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -143,7 +144,6 @@ namespace PlexAPI /// - `resolution`: Items categorized by resolution.
/// - `firstCharacter`: Items categorized by the first letter.
/// - `folder`: Items categorized by folder.
- /// - `search?type=1`: Search functionality within the section.
/// /// /// @@ -159,6 +159,33 @@ namespace PlexAPI /// Task RefreshLibraryAsync(double sectionId); + /// + /// Search Library + /// + /// + /// Search for content within a specific section of the library.
+ ///
+ /// ### Types
+ /// Each type in the library comes with a set of filters and sorts, aiding in building dynamic media controls:
+ ///
+ /// - **Type Object Attributes**:
+ /// - `type`: Metadata type (if standard Plex type).
+ /// - `title`: Title for this content type (e.g., "Movies").
+ ///
+ /// - **Filter Objects**:
+ /// - Subset of the media query language.
+ /// - Attributes include `filter` (name), `filterType` (data type), `key` (endpoint for value range), and `title`.
+ ///
+ /// - **Sort Objects**:
+ /// - Description of sort fields.
+ /// - Attributes include `defaultDirection` (asc/desc), `descKey` and `key` (sort parameters), and `title`.
+ ///
+ /// > **Note**: Filters and sorts are optional; without them, no filtering controls are rendered.
+ /// + ///
+ ///
+ Task SearchLibraryAsync(long sectionId, Type type); + /// /// Get Items Metadata /// @@ -201,18 +228,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Library(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Library(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -227,138 +254,157 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/library/hashes", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetFileHashResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetRecentlyAddedAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/library/recentlyAdded"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetRecentlyAddedResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetLibrariesAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/library/sections"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetLibrariesResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetLibraryAsync(double sectionId, IncludeDetails? includeDetails = null) @@ -370,49 +416,55 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/library/sections/{sectionId}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetLibraryResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task DeleteLibraryAsync(double sectionId) @@ -423,40 +475,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/library/sections/{sectionId}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Delete, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new DeleteLibraryResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetLibraryItemsAsync(long sectionId, Tag tag) @@ -468,35 +525,39 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/library/sections/{sectionId}/{tag}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetLibraryItemsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task RefreshLibraryAsync(double sectionId) @@ -507,40 +568,89 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/library/sections/{sectionId}/refresh", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new RefreshLibraryResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + + + + public async Task SearchLibraryAsync(long sectionId, Type type) + { + var request = new SearchLibraryRequest() + { + SectionId = sectionId, + Type = type, + }; + string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = URLBuilder.Build(baseUrl, "/library/sections/{sectionId}/search", request); + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new SearchLibraryResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + public async Task GetMetadataAsync(double ratingKey) @@ -551,49 +661,55 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/library/metadata/{ratingKey}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetMetadataResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetMetadataChildrenAsync(double ratingKey) @@ -604,98 +720,111 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/library/metadata/{ratingKey}/children", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetMetadataChildrenResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetOnDeckAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/library/onDeck"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetOnDeckResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Log.cs b/PlexAPI/Log.cs index f3a0e84..fb0c87f 100644 --- a/PlexAPI/Log.cs +++ b/PlexAPI/Log.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -90,18 +91,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Log(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Log(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -117,129 +118,143 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/log", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new LogLineResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task LogMultiLineAsync(string request) { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/log"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Post, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - var serializedBody = RequestBodySerializer.Serialize(request, "Request", "string"); - if (serializedBody == null) - { - throw new ArgumentNullException("request body is required"); - } - else + + var serializedBody = RequestBodySerializer.Serialize(request, "Request", "string", false, false); + if (serializedBody != null) { httpRequest.Content = serializedBody; } - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new LogMultiLineResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task EnablePaperTrailAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/log/networked"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new EnablePaperTrailResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400) || (response.StatusCode == 403)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Media.cs b/PlexAPI/Media.cs index d84427c..ddfafda 100644 --- a/PlexAPI/Media.cs +++ b/PlexAPI/Media.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -68,18 +69,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Media(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Media(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -93,40 +94,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/:/scrobble", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new MarkPlayedResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task MarkUnplayedAsync(double key) @@ -137,40 +143,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/:/unscrobble", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new MarkUnplayedResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task UpdatePlayProgressAsync(string key, double time, string state) @@ -183,40 +194,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/:/progress", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Post, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new UpdatePlayProgressResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Models/Requests/Account.cs b/PlexAPI/Models/Requests/Account.cs new file mode 100644 index 0000000..49fbab7 --- /dev/null +++ b/PlexAPI/Models/Requests/Account.cs @@ -0,0 +1,42 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + public class Account + { + + [JsonProperty("id")] + public int? Id { get; set; } + + [JsonProperty("key")] + public string? Key { get; set; } + + [JsonProperty("name")] + public string? Name { get; set; } + + [JsonProperty("defaultAudioLanguage")] + public string? DefaultAudioLanguage { get; set; } + + [JsonProperty("autoSelectAudio")] + public bool? AutoSelectAudio { get; set; } + + [JsonProperty("defaultSubtitleLanguage")] + public string? DefaultSubtitleLanguage { get; set; } + + [JsonProperty("subtitleMode")] + public int? SubtitleMode { get; set; } + + [JsonProperty("thumb")] + public string? Thumb { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/CreatePlaylistRequest.cs b/PlexAPI/Models/Requests/CreatePlaylistRequest.cs index 081be8c..ae8a426 100644 --- a/PlexAPI/Models/Requests/CreatePlaylistRequest.cs +++ b/PlexAPI/Models/Requests/CreatePlaylistRequest.cs @@ -25,7 +25,7 @@ namespace PlexAPI.Models.Requests /// type of playlist to create /// [SpeakeasyMetadata("queryParam:style=form,explode=true,name=type")] - public Type Type { get; set; } = default!; + public QueryParamType Type { get; set; } = default!; /// /// whether the playlist is smart or not diff --git a/PlexAPI/Models/Requests/GetLibrariesDirectory.cs b/PlexAPI/Models/Requests/GetLibrariesDirectory.cs index 0a82139..68f8954 100644 --- a/PlexAPI/Models/Requests/GetLibrariesDirectory.cs +++ b/PlexAPI/Models/Requests/GetLibrariesDirectory.cs @@ -77,6 +77,6 @@ namespace PlexAPI.Models.Requests public int? Hidden { get; set; } [JsonProperty("Location")] - public List? Location { get; set; } + public List? Location { get; set; } } } \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetLibrariesLocation.cs b/PlexAPI/Models/Requests/GetLibrariesLocation.cs new file mode 100644 index 0000000..8ae5a9d --- /dev/null +++ b/PlexAPI/Models/Requests/GetLibrariesLocation.cs @@ -0,0 +1,24 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + public class GetLibrariesLocation + { + + [JsonProperty("id")] + public int? Id { get; set; } + + [JsonProperty("path")] + public string? Path { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetLibraryItemsMediaContainer.cs b/PlexAPI/Models/Requests/GetLibraryItemsMediaContainer.cs index 774d5a0..c86c8fa 100644 --- a/PlexAPI/Models/Requests/GetLibraryItemsMediaContainer.cs +++ b/PlexAPI/Models/Requests/GetLibraryItemsMediaContainer.cs @@ -58,6 +58,9 @@ namespace PlexAPI.Models.Requests [JsonProperty("viewMode")] public int? ViewMode { get; set; } + [JsonProperty("mixedParents")] + public bool? MixedParents { get; set; } + [JsonProperty("Metadata")] public List? Metadata { get; set; } } diff --git a/PlexAPI/Models/Requests/GetLibraryItemsMetadata.cs b/PlexAPI/Models/Requests/GetLibraryItemsMetadata.cs index 9a7ecb5..71c1ce2 100644 --- a/PlexAPI/Models/Requests/GetLibraryItemsMetadata.cs +++ b/PlexAPI/Models/Requests/GetLibraryItemsMetadata.cs @@ -83,6 +83,27 @@ namespace PlexAPI.Models.Requests [JsonProperty("ratingImage")] public string? RatingImage { get; set; } + [JsonProperty("grandparentRatingKey")] + public string? GrandparentRatingKey { get; set; } + + [JsonProperty("grandparentGuid")] + public string? GrandparentGuid { get; set; } + + [JsonProperty("grandparentKey")] + public string? GrandparentKey { get; set; } + + [JsonProperty("grandparentTitle")] + public string? GrandparentTitle { get; set; } + + [JsonProperty("grandparentThumb")] + public string? GrandparentThumb { get; set; } + + [JsonProperty("grandparentArt")] + public string? GrandparentArt { get; set; } + + [JsonProperty("grandparentTheme")] + public string? GrandparentTheme { get; set; } + [JsonProperty("Media")] public List? Media { get; set; } @@ -118,5 +139,53 @@ namespace PlexAPI.Models.Requests [JsonProperty("skipCount")] public int? SkipCount { get; set; } + + [JsonProperty("index")] + public int? Index { get; set; } + + [JsonProperty("theme")] + public string? Theme { get; set; } + + [JsonProperty("leafCount")] + public int? LeafCount { get; set; } + + [JsonProperty("viewedLeafCount")] + public int? ViewedLeafCount { get; set; } + + [JsonProperty("childCount")] + public int? ChildCount { get; set; } + + [JsonProperty("hasPremiumExtras")] + public string? HasPremiumExtras { get; set; } + + [JsonProperty("hasPremiumPrimaryExtra")] + public string? HasPremiumPrimaryExtra { get; set; } + + [JsonProperty("parentRatingKey")] + public string? ParentRatingKey { get; set; } + + [JsonProperty("parentGuid")] + public string? ParentGuid { get; set; } + + [JsonProperty("parentStudio")] + public string? ParentStudio { get; set; } + + [JsonProperty("parentKey")] + public string? ParentKey { get; set; } + + [JsonProperty("parentTitle")] + public string? ParentTitle { get; set; } + + [JsonProperty("parentIndex")] + public int? ParentIndex { get; set; } + + [JsonProperty("parentYear")] + public int? ParentYear { get; set; } + + [JsonProperty("parentThumb")] + public string? ParentThumb { get; set; } + + [JsonProperty("parentTheme")] + public string? ParentTheme { get; set; } } } \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetPinErrors.cs b/PlexAPI/Models/Requests/GetPinErrors.cs new file mode 100644 index 0000000..bb23c48 --- /dev/null +++ b/PlexAPI/Models/Requests/GetPinErrors.cs @@ -0,0 +1,27 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + public class GetPinErrors + { + + [JsonProperty("code")] + public double? Code { get; set; } + + [JsonProperty("message")] + public string? Message { get; set; } + + [JsonProperty("status")] + public double? Status { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetPinPlexResponseBody.cs b/PlexAPI/Models/Requests/GetPinPlexResponseBody.cs new file mode 100644 index 0000000..97640a7 --- /dev/null +++ b/PlexAPI/Models/Requests/GetPinPlexResponseBody.cs @@ -0,0 +1,25 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + using System.Collections.Generic; + + /// + /// X-Plex-Client-Identifier is missing + /// + public class GetPinPlexResponseBody + { + + [JsonProperty("errors")] + public List? Errors { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetPinRequest.cs b/PlexAPI/Models/Requests/GetPinRequest.cs new file mode 100644 index 0000000..4555b3c --- /dev/null +++ b/PlexAPI/Models/Requests/GetPinRequest.cs @@ -0,0 +1,42 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using PlexAPI.Utils; + + public class GetPinRequest + { + + /// + /// The unique identifier for the client application
+ /// + /// + /// This is used to track the client application and its usage
+ /// (UUID, serial number, or other number unique per device)
+ /// + ///
+ ///
+ [SpeakeasyMetadata("header:style=simple,explode=false,name=X-Plex-Client-Identifier")] + public string XPlexClientIdentifier { get; set; } = default!; + + /// + /// Determines the kind of code returned by the API call
+ /// + /// + /// Strong codes are used for Pin authentication flows
+ /// Non-Strong codes are used for `Plex.tv/link`
+ /// + ///
+ ///
+ [SpeakeasyMetadata("queryParam:style=form,explode=true,name=strong")] + public bool? Strong { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetPinResponse.cs b/PlexAPI/Models/Requests/GetPinResponse.cs new file mode 100644 index 0000000..693d3b3 --- /dev/null +++ b/PlexAPI/Models/Requests/GetPinResponse.cs @@ -0,0 +1,44 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using System.Net.Http; + using System; + + public class GetPinResponse + { + + /// + /// HTTP response content type for this operation + /// + public string? ContentType { get; set; } = default!; + + /// + /// HTTP response status code for this operation + /// + public int StatusCode { get; set; } = default!; + + /// + /// Raw HTTP response; suitable for custom response parsing + /// + public HttpResponseMessage RawResponse { get; set; } = default!; + + /// + /// The Pin + /// + public GetPinResponseBody? TwoHundredApplicationJsonObject { get; set; } + + /// + /// X-Plex-Client-Identifier is missing + /// + public GetPinPlexResponseBody? FourHundredApplicationJsonObject { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetPinResponseBody.cs b/PlexAPI/Models/Requests/GetPinResponseBody.cs new file mode 100644 index 0000000..925a6fa --- /dev/null +++ b/PlexAPI/Models/Requests/GetPinResponseBody.cs @@ -0,0 +1,70 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + using System; + + /// + /// The Pin + /// + public class GetPinResponseBody + { + + /// + /// PinID for use with authentication + /// + [JsonProperty("id")] + public double? Id { get; set; } + + [JsonProperty("code")] + public string? Code { get; set; } + + [JsonProperty("product")] + public string? Product { get; set; } + + [JsonProperty("trusted")] + public bool? Trusted { get; set; } + + /// + /// a link to a QR code hosted on plex.tv
+ /// + /// + /// The QR code redirects to the relevant `plex.tv/link` authentication page
+ /// Which then prompts the user for the 4 Digit Link Pin
+ /// + ///
+ ///
+ [JsonProperty("qr")] + public string? Qr { get; set; } + + [JsonProperty("clientIdentifier")] + public string? ClientIdentifier { get; set; } + + [JsonProperty("location")] + public Location? Location { get; set; } + + [JsonProperty("expiresIn")] + public double? ExpiresIn { get; set; } + + [JsonProperty("createdAt")] + public DateTime? CreatedAt { get; set; } + + [JsonProperty("expiresAt")] + public DateTime? ExpiresAt { get; set; } + + [JsonProperty("authToken")] + public string? AuthToken { get; set; } + + [JsonProperty("newRegistration")] + public string? NewRegistration { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetServerPreferencesMediaContainer.cs b/PlexAPI/Models/Requests/GetServerPreferencesMediaContainer.cs index 1f4296d..96077a3 100644 --- a/PlexAPI/Models/Requests/GetServerPreferencesMediaContainer.cs +++ b/PlexAPI/Models/Requests/GetServerPreferencesMediaContainer.cs @@ -20,6 +20,6 @@ namespace PlexAPI.Models.Requests public int? Size { get; set; } [JsonProperty("Setting")] - public List? Setting { get; set; } + public List? Setting { get; set; } } } \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetStatisticsDevice.cs b/PlexAPI/Models/Requests/GetStatisticsDevice.cs new file mode 100644 index 0000000..ed5a64c --- /dev/null +++ b/PlexAPI/Models/Requests/GetStatisticsDevice.cs @@ -0,0 +1,33 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + public class GetStatisticsDevice + { + + [JsonProperty("id")] + public int? Id { get; set; } + + [JsonProperty("name")] + public string? Name { get; set; } + + [JsonProperty("platform")] + public string? Platform { get; set; } + + [JsonProperty("clientIdentifier")] + public string? ClientIdentifier { get; set; } + + [JsonProperty("createdAt")] + public int? CreatedAt { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetStatisticsErrors.cs b/PlexAPI/Models/Requests/GetStatisticsErrors.cs new file mode 100644 index 0000000..63e6926 --- /dev/null +++ b/PlexAPI/Models/Requests/GetStatisticsErrors.cs @@ -0,0 +1,27 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + public class GetStatisticsErrors + { + + [JsonProperty("code")] + public double? Code { get; set; } + + [JsonProperty("message")] + public string? Message { get; set; } + + [JsonProperty("status")] + public double? Status { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetStatisticsMediaContainer.cs b/PlexAPI/Models/Requests/GetStatisticsMediaContainer.cs new file mode 100644 index 0000000..63b30ab --- /dev/null +++ b/PlexAPI/Models/Requests/GetStatisticsMediaContainer.cs @@ -0,0 +1,31 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + using System.Collections.Generic; + + public class GetStatisticsMediaContainer + { + + [JsonProperty("size")] + public int? Size { get; set; } + + [JsonProperty("Device")] + public List? Device { get; set; } + + [JsonProperty("Account")] + public List? Account { get; set; } + + [JsonProperty("StatisticsMedia")] + public List? StatisticsMedia { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetStatisticsRequest.cs b/PlexAPI/Models/Requests/GetStatisticsRequest.cs new file mode 100644 index 0000000..3cc1b57 --- /dev/null +++ b/PlexAPI/Models/Requests/GetStatisticsRequest.cs @@ -0,0 +1,29 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using PlexAPI.Utils; + + public class GetStatisticsRequest + { + + /// + /// The timespan to retrieve statistics for
+ /// + /// + /// the exact meaning of this parameter is not known
+ /// + ///
+ ///
+ [SpeakeasyMetadata("queryParam:style=form,explode=true,name=Timespan")] + public long? Timespan { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetStatisticsResponse.cs b/PlexAPI/Models/Requests/GetStatisticsResponse.cs new file mode 100644 index 0000000..e5d02cf --- /dev/null +++ b/PlexAPI/Models/Requests/GetStatisticsResponse.cs @@ -0,0 +1,44 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using System.Net.Http; + using System; + + public class GetStatisticsResponse + { + + /// + /// HTTP response content type for this operation + /// + public string? ContentType { get; set; } = default!; + + /// + /// HTTP response status code for this operation + /// + public int StatusCode { get; set; } = default!; + + /// + /// Raw HTTP response; suitable for custom response parsing + /// + public HttpResponseMessage RawResponse { get; set; } = default!; + + /// + /// Media Statistics + /// + public GetStatisticsResponseBody? TwoHundredApplicationJsonObject { get; set; } + + /// + /// Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + /// + public GetStatisticsStatisticsResponseBody? FourHundredAndOneApplicationJsonObject { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetStatisticsResponseBody.cs b/PlexAPI/Models/Requests/GetStatisticsResponseBody.cs new file mode 100644 index 0000000..c3e4b7a --- /dev/null +++ b/PlexAPI/Models/Requests/GetStatisticsResponseBody.cs @@ -0,0 +1,24 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + /// + /// Media Statistics + /// + public class GetStatisticsResponseBody + { + + [JsonProperty("MediaContainer")] + public GetStatisticsMediaContainer? MediaContainer { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetStatisticsStatisticsResponseBody.cs b/PlexAPI/Models/Requests/GetStatisticsStatisticsResponseBody.cs new file mode 100644 index 0000000..71b73c8 --- /dev/null +++ b/PlexAPI/Models/Requests/GetStatisticsStatisticsResponseBody.cs @@ -0,0 +1,25 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + using System.Collections.Generic; + + /// + /// Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + /// + public class GetStatisticsStatisticsResponseBody + { + + [JsonProperty("errors")] + public List? Errors { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetTokenErrors.cs b/PlexAPI/Models/Requests/GetTokenErrors.cs new file mode 100644 index 0000000..a6d52b0 --- /dev/null +++ b/PlexAPI/Models/Requests/GetTokenErrors.cs @@ -0,0 +1,27 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + public class GetTokenErrors + { + + [JsonProperty("code")] + public double? Code { get; set; } + + [JsonProperty("message")] + public string? Message { get; set; } + + [JsonProperty("status")] + public double? Status { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetTokenRequest.cs b/PlexAPI/Models/Requests/GetTokenRequest.cs new file mode 100644 index 0000000..120eecf --- /dev/null +++ b/PlexAPI/Models/Requests/GetTokenRequest.cs @@ -0,0 +1,36 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using PlexAPI.Utils; + + public class GetTokenRequest + { + + /// + /// The PinID to retrieve an access token for + /// + [SpeakeasyMetadata("pathParam:style=simple,explode=false,name=pinID")] + public string PinID { get; set; } = default!; + + /// + /// The unique identifier for the client application
+ /// + /// + /// This is used to track the client application and its usage
+ /// (UUID, serial number, or other number unique per device)
+ /// + ///
+ ///
+ [SpeakeasyMetadata("header:style=simple,explode=false,name=X-Plex-Client-Identifier")] + public string XPlexClientIdentifier { get; set; } = default!; + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetTokenResponse.cs b/PlexAPI/Models/Requests/GetTokenResponse.cs new file mode 100644 index 0000000..097e8ba --- /dev/null +++ b/PlexAPI/Models/Requests/GetTokenResponse.cs @@ -0,0 +1,39 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using System.Net.Http; + using System; + + public class GetTokenResponse + { + + /// + /// HTTP response content type for this operation + /// + public string? ContentType { get; set; } = default!; + + /// + /// HTTP response status code for this operation + /// + public int StatusCode { get; set; } = default!; + + /// + /// Raw HTTP response; suitable for custom response parsing + /// + public HttpResponseMessage RawResponse { get; set; } = default!; + + /// + /// X-Plex-Client-Identifier is missing + /// + public GetTokenResponseBody? Object { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetTokenResponseBody.cs b/PlexAPI/Models/Requests/GetTokenResponseBody.cs new file mode 100644 index 0000000..df2738d --- /dev/null +++ b/PlexAPI/Models/Requests/GetTokenResponseBody.cs @@ -0,0 +1,25 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + using System.Collections.Generic; + + /// + /// X-Plex-Client-Identifier is missing + /// + public class GetTokenResponseBody + { + + [JsonProperty("errors")] + public List? Errors { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetTransientTokenQueryParamType.cs b/PlexAPI/Models/Requests/GetTransientTokenQueryParamType.cs new file mode 100644 index 0000000..ee591e3 --- /dev/null +++ b/PlexAPI/Models/Requests/GetTransientTokenQueryParamType.cs @@ -0,0 +1,58 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + using System; + + /// + /// `delegation` - This is the only supported `type` parameter. + /// + public enum GetTransientTokenQueryParamType + { + [JsonProperty("delegation")] + Delegation, + } + + public static class GetTransientTokenQueryParamTypeExtension + { + public static string Value(this GetTransientTokenQueryParamType value) + { + return ((JsonPropertyAttribute)value.GetType().GetMember(value.ToString())[0].GetCustomAttributes(typeof(JsonPropertyAttribute), false)[0]).PropertyName ?? value.ToString(); + } + + public static GetTransientTokenQueryParamType ToEnum(this string value) + { + foreach(var field in typeof(GetTransientTokenQueryParamType).GetFields()) + { + var attributes = field.GetCustomAttributes(typeof(JsonPropertyAttribute), false); + if (attributes.Length == 0) + { + continue; + } + + var attribute = attributes[0] as JsonPropertyAttribute; + if (attribute != null && attribute.PropertyName == value) + { + var enumVal = field.GetValue(null); + + if (enumVal is GetTransientTokenQueryParamType) + { + return (GetTransientTokenQueryParamType)enumVal; + } + } + } + + throw new Exception($"Unknown value {value} for enum GetTransientTokenQueryParamType"); + } + } + +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/GetTransientTokenRequest.cs b/PlexAPI/Models/Requests/GetTransientTokenRequest.cs index fb55da1..1ec55d6 100644 --- a/PlexAPI/Models/Requests/GetTransientTokenRequest.cs +++ b/PlexAPI/Models/Requests/GetTransientTokenRequest.cs @@ -19,7 +19,7 @@ namespace PlexAPI.Models.Requests /// `delegation` - This is the only supported `type` parameter. /// [SpeakeasyMetadata("queryParam:style=form,explode=true,name=type")] - public QueryParamType Type { get; set; } = default!; + public GetTransientTokenQueryParamType Type { get; set; } = default!; /// /// `all` - This is the only supported `scope` parameter. diff --git a/PlexAPI/Models/Requests/Location.cs b/PlexAPI/Models/Requests/Location.cs index 0315091..113c977 100644 --- a/PlexAPI/Models/Requests/Location.cs +++ b/PlexAPI/Models/Requests/Location.cs @@ -15,10 +15,34 @@ namespace PlexAPI.Models.Requests public class Location { - [JsonProperty("id")] - public int? Id { get; set; } + [JsonProperty("code")] + public string? Code { get; set; } - [JsonProperty("path")] - public string? Path { get; set; } + [JsonProperty("european_union_member")] + public bool? EuropeanUnionMember { get; set; } + + [JsonProperty("continent_code")] + public string? ContinentCode { get; set; } + + [JsonProperty("country")] + public string? Country { get; set; } + + [JsonProperty("city")] + public string? City { get; set; } + + [JsonProperty("time_zone")] + public string? TimeZone { get; set; } + + [JsonProperty("postal_code")] + public double? PostalCode { get; set; } + + [JsonProperty("in_privacy_restricted_country")] + public bool? InPrivacyRestrictedCountry { get; set; } + + [JsonProperty("subdivisions")] + public string? Subdivisions { get; set; } + + [JsonProperty("coordinates")] + public string? Coordinates { get; set; } } } \ No newline at end of file diff --git a/PlexAPI/Models/Requests/QueryParamType.cs b/PlexAPI/Models/Requests/QueryParamType.cs index 9fde256..a907686 100644 --- a/PlexAPI/Models/Requests/QueryParamType.cs +++ b/PlexAPI/Models/Requests/QueryParamType.cs @@ -14,12 +14,16 @@ namespace PlexAPI.Models.Requests using System; /// - /// `delegation` - This is the only supported `type` parameter. + /// type of playlist to create /// public enum QueryParamType { - [JsonProperty("delegation")] - Delegation, + [JsonProperty("audio")] + Audio, + [JsonProperty("video")] + Video, + [JsonProperty("photo")] + Photo, } public static class QueryParamTypeExtension diff --git a/PlexAPI/Models/Requests/SearchLibraryMediaContainer.cs b/PlexAPI/Models/Requests/SearchLibraryMediaContainer.cs new file mode 100644 index 0000000..3e68728 --- /dev/null +++ b/PlexAPI/Models/Requests/SearchLibraryMediaContainer.cs @@ -0,0 +1,58 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + using System.Collections.Generic; + + public class SearchLibraryMediaContainer + { + + [JsonProperty("size")] + public int? Size { get; set; } + + [JsonProperty("allowSync")] + public bool? AllowSync { get; set; } + + [JsonProperty("art")] + public string? Art { get; set; } + + [JsonProperty("identifier")] + public string? Identifier { get; set; } + + [JsonProperty("mediaTagPrefix")] + public string? MediaTagPrefix { get; set; } + + [JsonProperty("mediaTagVersion")] + public int? MediaTagVersion { get; set; } + + [JsonProperty("nocache")] + public bool? Nocache { get; set; } + + [JsonProperty("thumb")] + public string? Thumb { get; set; } + + [JsonProperty("title1")] + public string? Title1 { get; set; } + + [JsonProperty("title2")] + public string? Title2 { get; set; } + + [JsonProperty("viewGroup")] + public string? ViewGroup { get; set; } + + [JsonProperty("viewMode")] + public int? ViewMode { get; set; } + + [JsonProperty("Metadata")] + public List? Metadata { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/SearchLibraryMetadata.cs b/PlexAPI/Models/Requests/SearchLibraryMetadata.cs new file mode 100644 index 0000000..86fdaa4 --- /dev/null +++ b/PlexAPI/Models/Requests/SearchLibraryMetadata.cs @@ -0,0 +1,78 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + public class SearchLibraryMetadata + { + + [JsonProperty("ratingKey")] + public string? RatingKey { get; set; } + + [JsonProperty("key")] + public string? Key { get; set; } + + [JsonProperty("parentRatingKey")] + public string? ParentRatingKey { get; set; } + + [JsonProperty("guid")] + public string? Guid { get; set; } + + [JsonProperty("parentGuid")] + public string? ParentGuid { get; set; } + + [JsonProperty("parentStudio")] + public string? ParentStudio { get; set; } + + [JsonProperty("type")] + public string? Type { get; set; } + + [JsonProperty("title")] + public string? Title { get; set; } + + [JsonProperty("parentKey")] + public string? ParentKey { get; set; } + + [JsonProperty("parentTitle")] + public string? ParentTitle { get; set; } + + [JsonProperty("summary")] + public string? Summary { get; set; } + + [JsonProperty("index")] + public int? Index { get; set; } + + [JsonProperty("parentIndex")] + public int? ParentIndex { get; set; } + + [JsonProperty("parentYear")] + public int? ParentYear { get; set; } + + [JsonProperty("thumb")] + public string? Thumb { get; set; } + + [JsonProperty("art")] + public string? Art { get; set; } + + [JsonProperty("parentThumb")] + public string? ParentThumb { get; set; } + + [JsonProperty("parentTheme")] + public string? ParentTheme { get; set; } + + [JsonProperty("addedAt")] + public int? AddedAt { get; set; } + + [JsonProperty("updatedAt")] + public int? UpdatedAt { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/SearchLibraryRequest.cs b/PlexAPI/Models/Requests/SearchLibraryRequest.cs new file mode 100644 index 0000000..23f5d14 --- /dev/null +++ b/PlexAPI/Models/Requests/SearchLibraryRequest.cs @@ -0,0 +1,30 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using PlexAPI.Utils; + + public class SearchLibraryRequest + { + + /// + /// the Id of the library to query + /// + [SpeakeasyMetadata("pathParam:style=simple,explode=false,name=sectionId")] + public long SectionId { get; set; } = default!; + + /// + /// Plex content type to search for + /// + [SpeakeasyMetadata("queryParam:style=form,explode=true,name=type")] + public Type Type { get; set; } = default!; + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/SearchLibraryResponse.cs b/PlexAPI/Models/Requests/SearchLibraryResponse.cs new file mode 100644 index 0000000..2e45679 --- /dev/null +++ b/PlexAPI/Models/Requests/SearchLibraryResponse.cs @@ -0,0 +1,39 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using System.Net.Http; + using System; + + public class SearchLibraryResponse + { + + /// + /// HTTP response content type for this operation + /// + public string? ContentType { get; set; } = default!; + + /// + /// HTTP response status code for this operation + /// + public int StatusCode { get; set; } = default!; + + /// + /// Raw HTTP response; suitable for custom response parsing + /// + public HttpResponseMessage RawResponse { get; set; } = default!; + + /// + /// The contents of the library by section and type + /// + public SearchLibraryResponseBody? Object { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/SearchLibraryResponseBody.cs b/PlexAPI/Models/Requests/SearchLibraryResponseBody.cs new file mode 100644 index 0000000..d283fbb --- /dev/null +++ b/PlexAPI/Models/Requests/SearchLibraryResponseBody.cs @@ -0,0 +1,24 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + /// + /// The contents of the library by section and type + /// + public class SearchLibraryResponseBody + { + + [JsonProperty("MediaContainer")] + public SearchLibraryMediaContainer? MediaContainer { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/Setting.cs b/PlexAPI/Models/Requests/Setting.cs new file mode 100644 index 0000000..01ec23d --- /dev/null +++ b/PlexAPI/Models/Requests/Setting.cs @@ -0,0 +1,48 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + public class Setting + { + + [JsonProperty("id")] + public string? Id { get; set; } + + [JsonProperty("label")] + public string? Label { get; set; } + + [JsonProperty("summary")] + public string? Summary { get; set; } + + [JsonProperty("type")] + public string? Type { get; set; } + + [JsonProperty("default")] + public bool? Default { get; set; } + + [JsonProperty("value")] + public bool? Value { get; set; } + + [JsonProperty("hidden")] + public bool? Hidden { get; set; } + + [JsonProperty("advanced")] + public bool? Advanced { get; set; } + + [JsonProperty("group")] + public string? Group { get; set; } + + [JsonProperty("enumValues")] + public string? EnumValues { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/StatisticsMedia.cs b/PlexAPI/Models/Requests/StatisticsMedia.cs new file mode 100644 index 0000000..e8f7e5b --- /dev/null +++ b/PlexAPI/Models/Requests/StatisticsMedia.cs @@ -0,0 +1,39 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI.Models.Requests +{ + using Newtonsoft.Json; + + public class StatisticsMedia + { + + [JsonProperty("accountID")] + public int? AccountID { get; set; } + + [JsonProperty("deviceID")] + public int? DeviceID { get; set; } + + [JsonProperty("timespan")] + public int? Timespan { get; set; } + + [JsonProperty("at")] + public int? At { get; set; } + + [JsonProperty("metadataType")] + public int? MetadataType { get; set; } + + [JsonProperty("count")] + public int? Count { get; set; } + + [JsonProperty("duration")] + public int? Duration { get; set; } + } +} \ No newline at end of file diff --git a/PlexAPI/Models/Requests/Tag.cs b/PlexAPI/Models/Requests/Tag.cs index e35f011..1ac384a 100644 --- a/PlexAPI/Models/Requests/Tag.cs +++ b/PlexAPI/Models/Requests/Tag.cs @@ -56,8 +56,6 @@ namespace PlexAPI.Models.Requests FirstCharacter, [JsonProperty("folder")] Folder, - [JsonProperty("search?type=1")] - SearchTypeEqual1, } public static class TagExtension diff --git a/PlexAPI/Models/Requests/Type.cs b/PlexAPI/Models/Requests/Type.cs index 168719e..c6584d6 100644 --- a/PlexAPI/Models/Requests/Type.cs +++ b/PlexAPI/Models/Requests/Type.cs @@ -10,53 +10,16 @@ #nullable enable namespace PlexAPI.Models.Requests { - using Newtonsoft.Json; - using System; /// - /// type of playlist to create + /// Plex content type to search for /// public enum Type { - [JsonProperty("audio")] - Audio, - [JsonProperty("video")] - Video, - [JsonProperty("photo")] - Photo, - } - - public static class TypeExtension - { - public static string Value(this Type value) - { - return ((JsonPropertyAttribute)value.GetType().GetMember(value.ToString())[0].GetCustomAttributes(typeof(JsonPropertyAttribute), false)[0]).PropertyName ?? value.ToString(); - } - - public static Type ToEnum(this string value) - { - foreach(var field in typeof(Type).GetFields()) - { - var attributes = field.GetCustomAttributes(typeof(JsonPropertyAttribute), false); - if (attributes.Length == 0) - { - continue; - } - - var attribute = attributes[0] as JsonPropertyAttribute; - if (attribute != null && attribute.PropertyName == value) - { - var enumVal = field.GetValue(null); - - if (enumVal is Type) - { - return (Type)enumVal; - } - } - } - - throw new Exception($"Unknown value {value} for enum Type"); - } + One = 1, + Two = 2, + Three = 3, + Four = 4, } } \ No newline at end of file diff --git a/PlexAPI/Playlists.cs b/PlexAPI/Playlists.cs index 48ed235..d665d3b 100644 --- a/PlexAPI/Playlists.cs +++ b/PlexAPI/Playlists.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -41,7 +42,7 @@ namespace PlexAPI /// /// /// - Task CreatePlaylistAsync(CreatePlaylistRequest? request = null); + Task CreatePlaylistAsync(CreatePlaylistRequest request); /// /// Get All Playlists @@ -142,70 +143,76 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Playlists(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Playlists(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } - public async Task CreatePlaylistAsync(CreatePlaylistRequest? request = null) + public async Task CreatePlaylistAsync(CreatePlaylistRequest request) { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/playlists", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Post, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new CreatePlaylistResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetPlaylistsAsync(PlaylistType? playlistType = null, QueryParamSmart? smart = null) @@ -217,49 +224,55 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/playlists", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetPlaylistsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetPlaylistAsync(double playlistID) @@ -270,49 +283,55 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/playlists/{playlistID}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetPlaylistResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task DeletePlaylistAsync(double playlistID) @@ -323,40 +342,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/playlists/{playlistID}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Delete, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new DeletePlaylistResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task UpdatePlaylistAsync(double playlistID, string? title = null, string? summary = null) @@ -369,40 +393,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/playlists/{playlistID}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Put, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new UpdatePlaylistResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetPlaylistContentsAsync(double playlistID, double type) @@ -414,49 +443,55 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/playlists/{playlistID}/items", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetPlaylistContentsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task ClearPlaylistContentsAsync(double playlistID) @@ -467,40 +502,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/playlists/{playlistID}/items", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Delete, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new ClearPlaylistContentsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task AddPlaylistContentsAsync(double playlistID, string uri, double? playQueueID = null) @@ -513,49 +553,55 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/playlists/{playlistID}/items", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Put, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new AddPlaylistContentsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task UploadPlaylistAsync(string path, Force force) @@ -567,40 +613,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/playlists/upload", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Post, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new UploadPlaylistResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Plex.cs b/PlexAPI/Plex.cs new file mode 100644 index 0000000..b4d095d --- /dev/null +++ b/PlexAPI/Plex.cs @@ -0,0 +1,210 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI +{ + using Newtonsoft.Json; + using PlexAPI.Models.Components; + using PlexAPI.Models.Requests; + using PlexAPI.Utils; + using System.Collections.Generic; + using System.Net.Http.Headers; + using System.Net.Http; + using System.Threading.Tasks; + using System; + + /// + /// API Calls that perform operations directly against https://Plex.tv
+ /// + /// + /// + /// + ///
+ public interface IPlex + { + + /// + /// Get a Pin + /// + /// + /// Retrieve a Pin from Plex.tv for authentication flows + /// + /// + Task GetPinAsync(string xPlexClientIdentifier, bool? strong = null, string? serverUrl = null); + + /// + /// Get Access Token + /// + /// + /// Retrieve an Access Token from Plex.tv after the Pin has already been authenticated + /// + /// + Task GetTokenAsync(string pinID, string xPlexClientIdentifier, string? serverUrl = null); + } + + /// + /// API Calls that perform operations directly against https://Plex.tv
+ /// + /// + /// + /// + ///
+ public class Plex: IPlex + { + /** + * GetPinServerList contains the list of server urls available to the SDK. + */ + public static readonly string[] GetPinServerList = { + "https://plex.tv/api/v2", + }; + + /** + * GetTokenServerList contains the list of server urls available to the SDK. + */ + public static readonly string[] GetTokenServerList = { + "https://plex.tv/api/v2", + }; + + public SDKConfig SDKConfiguration { get; private set; } + private const string _language = "csharp"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; + private const string _openapiDocVersion = "0.0.3"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; + private string _serverUrl = ""; + private ISpeakeasyHttpClient _defaultClient; + private Func? _securitySource; + + public Plex(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) + { + _defaultClient = defaultClient; + _securitySource = securitySource; + _serverUrl = serverUrl; + SDKConfiguration = config; + } + + + public async Task GetPinAsync(string xPlexClientIdentifier, bool? strong = null, string? serverUrl = null) + { + var request = new GetPinRequest() + { + XPlexClientIdentifier = xPlexClientIdentifier, + Strong = strong, + }; + string baseUrl = Utilities.TemplateUrl(GetPinServerList[0], new Dictionary(){ + }); + if (serverUrl != null) + { + baseUrl = serverUrl; + } + var urlString = URLBuilder.Build(baseUrl, "/pins", request); + + var httpRequest = new HttpRequestMessage(HttpMethod.Post, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + HeaderSerializer.PopulateHeaders(ref httpRequest, request); + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new GetPinResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + + if((response.StatusCode == 400)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.FourHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + + + + public async Task GetTokenAsync(string pinID, string xPlexClientIdentifier, string? serverUrl = null) + { + var request = new GetTokenRequest() + { + PinID = pinID, + XPlexClientIdentifier = xPlexClientIdentifier, + }; + string baseUrl = Utilities.TemplateUrl(GetTokenServerList[0], new Dictionary(){ + }); + if (serverUrl != null) + { + baseUrl = serverUrl; + } + var urlString = URLBuilder.Build(baseUrl, "/pins/{pinID}", request); + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + HeaderSerializer.PopulateHeaders(ref httpRequest, request); + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new GetTokenResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200)) + { + + return response; + } + + if((response.StatusCode == 400)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + + + } +} \ No newline at end of file diff --git a/PlexAPI/PlexAPI.csproj b/PlexAPI/PlexAPI.csproj index ca7a0e9..ae6a26f 100644 --- a/PlexAPI/PlexAPI.csproj +++ b/PlexAPI/PlexAPI.csproj @@ -2,7 +2,7 @@ true Plex-API - 0.1.5 + 0.2.0 LukeHagar net5.0 enable diff --git a/PlexAPI/PlexAPISDK.cs b/PlexAPI/PlexAPISDK.cs index 33ebb48..554a940 100644 --- a/PlexAPI/PlexAPISDK.cs +++ b/PlexAPI/PlexAPISDK.cs @@ -92,6 +92,15 @@ namespace PlexAPI ///
public IMedia Media { get; } + /// + /// API Calls that perform operations with Plex Media Server Videos
+ /// + /// + /// + /// + ///
+ public IVideo Video { get; } + /// /// Activities are awesome. They provide a way to monitor and control asynchronous operations on the server. In order to receive real-time updates for activities, a client would normally subscribe via either EventSource or Websocket endpoints.
/// @@ -152,6 +161,15 @@ namespace PlexAPI ///
public ILog Log { get; } + /// + /// API Calls that perform operations directly against https://Plex.tv
+ /// + /// + /// + /// + ///
+ public IPlex Plex { get; } + /// /// Playlists are ordered collections of media. They can be dumb (just a list of media) or smart (based on a media query, such as "all albums from 2017").
/// @@ -173,6 +191,15 @@ namespace PlexAPI ///
public ISecurity Security { get; } + /// + /// API Calls that perform operations with Plex Media Server Statistics
+ /// + /// + /// + /// + ///
+ public IStatistics Statistics { get; } + /// /// API Calls that perform search operations with Plex Media Server Sessions
/// @@ -191,15 +218,6 @@ namespace PlexAPI /// ///
public IUpdater Updater { get; } - - /// - /// API Calls that perform operations with Plex Media Server Videos
- /// - /// - /// - /// - ///
- public IVideo Video { get; } } public class SDKConfig @@ -235,31 +253,41 @@ namespace PlexAPI public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; + private int _serverIndex = 0; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; public IServer Server { get; private set; } public IMedia Media { get; private set; } + public IVideo Video { get; private set; } public IActivities Activities { get; private set; } public IButler Butler { get; private set; } public IHubs Hubs { get; private set; } public ISearch Search { get; private set; } public ILibrary Library { get; private set; } public ILog Log { get; private set; } + public IPlex Plex { get; private set; } public IPlaylists Playlists { get; private set; } public ISecurity Security { get; private set; } + public IStatistics Statistics { get; private set; } public ISessions Sessions { get; private set; } public IUpdater Updater { get; private set; } - public IVideo Video { get; private set; } - public PlexAPISDK(Security? security = null, int? serverIndex = null, ServerProtocol? protocol = null, string? ip = null, string? port = null, string? serverUrl = null, Dictionary? urlParams = null, ISpeakeasyHttpClient? client = null) + public PlexAPISDK(Security? security = null, Func? securitySource = null, int? serverIndex = null, ServerProtocol? protocol = null, string? ip = null, string? port = null, string? serverUrl = null, Dictionary? urlParams = null, ISpeakeasyHttpClient? client = null) { - if (serverUrl != null) { - if (urlParams != null) { + if (serverIndex != null) + { + _serverIndex = serverIndex.Value; + } + + if (serverUrl != null) + { + if (urlParams != null) + { serverUrl = Utilities.TemplateUrl(serverUrl, urlParams); } _serverUrl = serverUrl; @@ -275,32 +303,42 @@ namespace PlexAPI }; _defaultClient = new SpeakeasyHttpClient(client); - _securityClient = _defaultClient; - - if(security != null) + + if(securitySource != null) { - _securityClient = SecuritySerializer.Apply(_defaultClient, security); + _securitySource = securitySource; } - + else if(security != null) + { + _securitySource = () => security; + } + else + { + throw new Exception("security and securitySource cannot both be null"); + } + SDKConfiguration = new SDKConfig() { ServerDefaults = serverDefaults, + serverIndex = _serverIndex, serverUrl = _serverUrl }; - Server = new Server(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Media = new Media(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Activities = new Activities(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Butler = new Butler(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Hubs = new Hubs(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Search = new Search(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Library = new Library(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Log = new Log(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Playlists = new Playlists(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Security = new Security(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Sessions = new Sessions(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Updater = new Updater(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); - Video = new Video(_defaultClient, _securityClient, _serverUrl, SDKConfiguration); + Server = new Server(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Media = new Media(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Video = new Video(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Activities = new Activities(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Butler = new Butler(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Hubs = new Hubs(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Search = new Search(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Library = new Library(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Log = new Log(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Plex = new Plex(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Playlists = new Playlists(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Security = new Security(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Statistics = new Statistics(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Sessions = new Sessions(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); + Updater = new Updater(_defaultClient, _securitySource, _serverUrl, SDKConfiguration); } } -} \ No newline at end of file +} diff --git a/PlexAPI/Search.cs b/PlexAPI/Search.cs index 9bfd7a9..1997cda 100644 --- a/PlexAPI/Search.cs +++ b/PlexAPI/Search.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -83,18 +84,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Search(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Search(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -110,40 +111,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/hubs/search", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new PerformSearchResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task PerformVoiceSearchAsync(string query, double? sectionId = null, double? limit = null) @@ -156,40 +162,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/hubs/search/voice", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new PerformVoiceSearchResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetSearchResultsAsync(string query) @@ -200,49 +211,55 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/search", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetSearchResultsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Security.cs b/PlexAPI/Security.cs index 659da76..8e85e44 100644 --- a/PlexAPI/Security.cs +++ b/PlexAPI/Security.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -36,7 +37,7 @@ namespace PlexAPI /// /// /// - Task GetTransientTokenAsync(QueryParamType type, Scope scope); + Task GetTransientTokenAsync(GetTransientTokenQueryParamType type, Scope scope); /// /// Get Source Connection Information @@ -61,24 +62,24 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Security(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Security(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } - public async Task GetTransientTokenAsync(QueryParamType type, Scope scope) + public async Task GetTransientTokenAsync(GetTransientTokenQueryParamType type, Scope scope) { var request = new GetTransientTokenRequest() { @@ -87,40 +88,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/security/token", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetTransientTokenResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetSourceConnectionInformationAsync(string source) @@ -131,40 +137,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/security/resources", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetSourceConnectionInformationResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Server.cs b/PlexAPI/Server.cs index 052854a..2f9bef5 100644 --- a/PlexAPI/Server.cs +++ b/PlexAPI/Server.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -90,7 +91,7 @@ namespace PlexAPI /// /// /// - Task GetResizedPhotoAsync(GetResizedPhotoRequest? request = null); + Task GetResizedPhotoAsync(GetResizedPhotoRequest request); /// /// Get Server List @@ -113,18 +114,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Server(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Server(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -133,384 +134,438 @@ namespace PlexAPI public async Task GetServerCapabilitiesAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetServerCapabilitiesResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetServerPreferencesAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/:/prefs"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetServerPreferencesResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetAvailableClientsAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/clients"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetAvailableClientsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetDevicesAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/devices"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetDevicesResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetServerIdentityAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/identity"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetServerIdentityResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetMyPlexAccountAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/myplex/account"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetMyPlexAccountResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + - public async Task GetResizedPhotoAsync(GetResizedPhotoRequest? request = null) + public async Task GetResizedPhotoAsync(GetResizedPhotoRequest request) { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/photo/:/transcode", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetResizedPhotoResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetServerListAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/servers"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetServerListResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Sessions.cs b/PlexAPI/Sessions.cs index 8cd0760..4e8fe36 100644 --- a/PlexAPI/Sessions.cs +++ b/PlexAPI/Sessions.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -76,18 +77,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Sessions(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Sessions(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -96,148 +97,169 @@ namespace PlexAPI public async Task GetSessionsAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/status/sessions"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetSessionsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetSessionHistoryAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/status/sessions/history/all"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetSessionHistoryResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task GetTranscodeSessionsAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/transcode/sessions"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetTranscodeSessionsResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task StopTranscodeSessionAsync(string sessionKey) @@ -248,40 +270,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/transcode/sessions/{sessionKey}", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Delete, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new StopTranscodeSessionResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 204) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Statistics.cs b/PlexAPI/Statistics.cs new file mode 100644 index 0000000..40ee484 --- /dev/null +++ b/PlexAPI/Statistics.cs @@ -0,0 +1,129 @@ + +//------------------------------------------------------------------------------ +// +// This code was generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. +// +// Changes to this file may cause incorrect behavior and will be lost when +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable +namespace PlexAPI +{ + using Newtonsoft.Json; + using PlexAPI.Models.Components; + using PlexAPI.Models.Requests; + using PlexAPI.Utils; + using System.Net.Http.Headers; + using System.Net.Http; + using System.Threading.Tasks; + using System; + + /// + /// API Calls that perform operations with Plex Media Server Statistics
+ /// + /// + /// + /// + ///
+ public interface IStatistics + { + + /// + /// Get Media Statistics + /// + /// + /// This will return the media statistics for the server + /// + /// + Task GetStatisticsAsync(long? timespan = null); + } + + /// + /// API Calls that perform operations with Plex Media Server Statistics
+ /// + /// + /// + /// + ///
+ public class Statistics: IStatistics + { + public SDKConfig SDKConfiguration { get; private set; } + private const string _language = "csharp"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; + private const string _openapiDocVersion = "0.0.3"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; + private string _serverUrl = ""; + private ISpeakeasyHttpClient _defaultClient; + private Func? _securitySource; + + public Statistics(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) + { + _defaultClient = defaultClient; + _securitySource = securitySource; + _serverUrl = serverUrl; + SDKConfiguration = config; + } + + + public async Task GetStatisticsAsync(long? timespan = null) + { + var request = new GetStatisticsRequest() + { + Timespan = timespan, + }; + string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = URLBuilder.Build(baseUrl, "/statistics/media", request); + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new GetStatisticsResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + + if((response.StatusCode == 400)) + { + + return response; + } + + if((response.StatusCode == 401)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + + + } +} \ No newline at end of file diff --git a/PlexAPI/Updater.cs b/PlexAPI/Updater.cs index 9265140..a5463e3 100644 --- a/PlexAPI/Updater.cs +++ b/PlexAPI/Updater.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -70,18 +71,18 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Updater(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Updater(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } @@ -90,50 +91,57 @@ namespace PlexAPI public async Task GetUpdateStatusAsync() { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = baseUrl + "/updater/status"; - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetUpdateStatusResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.TwoHundredApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } + if((response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.FourHundredAndOneApplicationJsonObject = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task CheckForUpdatesAsync(Download? download = null) @@ -144,40 +152,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/updater/check", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Put, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new CheckForUpdatesResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + public async Task ApplyUpdatesAsync(Tonight? tonight = null, Skip? skip = null) @@ -189,40 +202,45 @@ namespace PlexAPI }; string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/updater/apply", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Put, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new ApplyUpdatesResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400) || (response.StatusCode == 500)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + } } \ No newline at end of file diff --git a/PlexAPI/Utils/BigIntSerializer.cs b/PlexAPI/Utils/BigIntSerializer.cs index 3bf157e..9be84e0 100644 --- a/PlexAPI/Utils/BigIntSerializer.cs +++ b/PlexAPI/Utils/BigIntSerializer.cs @@ -17,7 +17,16 @@ namespace PlexAPI.Utils internal class BigIntSerializer : JsonConverter { - public override bool CanConvert(Type objectType) => objectType == typeof(BigInteger); + public override bool CanConvert(Type objectType) + { + var nullableType = Nullable.GetUnderlyingType(objectType); + if (nullableType != null) + { + return nullableType == typeof(BigInteger); + } + + return objectType == typeof(BigInteger); + } public override bool CanRead => true; diff --git a/PlexAPI/Utils/DecimalSerializer.cs b/PlexAPI/Utils/DecimalSerializer.cs index b8e69f8..8519229 100644 --- a/PlexAPI/Utils/DecimalSerializer.cs +++ b/PlexAPI/Utils/DecimalSerializer.cs @@ -16,7 +16,16 @@ namespace PlexAPI.Utils internal class DecimalSerializer : JsonConverter { - public override bool CanConvert(Type objectType) => objectType == typeof(Decimal); + public override bool CanConvert(Type objectType) + { + var nullableType = Nullable.GetUnderlyingType(objectType); + if (nullableType != null) + { + return nullableType == typeof(Decimal); + } + + return objectType == typeof(Decimal); + } public override bool CanRead => true; diff --git a/PlexAPI/Utils/EnumSerializer.cs b/PlexAPI/Utils/EnumSerializer.cs index b09a1ee..6e9dd48 100644 --- a/PlexAPI/Utils/EnumSerializer.cs +++ b/PlexAPI/Utils/EnumSerializer.cs @@ -15,7 +15,16 @@ namespace PlexAPI.Utils { internal class EnumSerializer : JsonConverter { - public override bool CanConvert(System.Type objectType) => objectType.IsEnum; + public override bool CanConvert(System.Type objectType) + { + var nullableType = Nullable.GetUnderlyingType(objectType); + if (nullableType != null) + { + return nullableType.IsEnum; + } + + return objectType.IsEnum; + } public override bool CanRead => true; diff --git a/PlexAPI/Utils/IsoDateTimeSerializer.cs b/PlexAPI/Utils/IsoDateTimeSerializer.cs index d9675e9..8a4db17 100644 --- a/PlexAPI/Utils/IsoDateTimeSerializer.cs +++ b/PlexAPI/Utils/IsoDateTimeSerializer.cs @@ -16,8 +16,16 @@ namespace PlexAPI.Utils internal class IsoDateTimeSerializer: JsonConverter { - public override bool CanConvert(Type objectType) => - objectType == typeof(DateTime); + public override bool CanConvert(Type objectType) + { + var nullableType = Nullable.GetUnderlyingType(objectType); + if (nullableType != null) + { + return nullableType == typeof(DateTime); + } + + return objectType == typeof(DateTime); + } public override bool CanRead => false; diff --git a/PlexAPI/Utils/RequestBodySerializer.cs b/PlexAPI/Utils/RequestBodySerializer.cs index c63ee64..501946f 100644 --- a/PlexAPI/Utils/RequestBodySerializer.cs +++ b/PlexAPI/Utils/RequestBodySerializer.cs @@ -22,11 +22,23 @@ namespace PlexAPI.Utils public static HttpContent? Serialize( object? request, string requestFieldName, - string serializationMethod + string serializationMethod, + bool nullable = false, + bool optional = false, + string format = "" ) { if (request == null) { + if (!nullable && !optional) + { + throw new ArgumentNullException("request body is required"); + } + else if (nullable && serializationMethod == "json") + { + return new StringContent("null", Encoding.UTF8, "application/json"); + } + return null; } @@ -56,14 +68,15 @@ namespace PlexAPI.Utils } // Not an object or flattened request - return TrySerialize(request, requestFieldName, serializationMethod); + return TrySerialize(request, requestFieldName, serializationMethod, "", format); } private static HttpContent? TrySerialize( object request, string requestFieldName, string serializationMethod, - string mediaType = "" + string mediaType = "", + string format = "" ) { if (mediaType == "") @@ -81,7 +94,7 @@ namespace PlexAPI.Utils switch (serializationMethod) { case "json": - return SerializeJson(request, mediaType); + return SerializeJson(request, mediaType, format); case "form": return SerializeForm(request, requestFieldName, mediaType); case "multipart": @@ -109,9 +122,9 @@ namespace PlexAPI.Utils } } - private static HttpContent SerializeJson(object request, string mediaType) + private static HttpContent SerializeJson(object request, string mediaType, string format = "") { - return new StringContent(Utilities.SerializeJSON(request), Encoding.UTF8, mediaType); + return new StringContent(Utilities.SerializeJSON(request, format), Encoding.UTF8, mediaType); } private static HttpContent SerializeForm( @@ -482,7 +495,7 @@ namespace PlexAPI.Utils { form[fieldName] = new List(); } - + form[fieldName].Add(Utilities.ValueToString(value)); } } @@ -499,4 +512,4 @@ namespace PlexAPI.Utils } } } -} \ No newline at end of file +} diff --git a/PlexAPI/Utils/SecuritySerializer.cs b/PlexAPI/Utils/SecuritySerializer.cs index 51e3105..984a9bb 100644 --- a/PlexAPI/Utils/SecuritySerializer.cs +++ b/PlexAPI/Utils/SecuritySerializer.cs @@ -16,8 +16,14 @@ namespace PlexAPI.Utils internal static class SecuritySerializer { - public static ISpeakeasyHttpClient Apply(ISpeakeasyHttpClient client, object security) + public static ISpeakeasyHttpClient Apply(ISpeakeasyHttpClient client, Func securitySource) { + if (securitySource == null) + { + return client; + } + + var security = securitySource(); if (security == null) { return client; diff --git a/PlexAPI/Utils/Utilities.cs b/PlexAPI/Utils/Utilities.cs index 1157f98..46c6f32 100644 --- a/PlexAPI/Utils/Utilities.cs +++ b/PlexAPI/Utils/Utilities.cs @@ -15,24 +15,52 @@ namespace PlexAPI.Utils using System.Net.Http.Headers; using System.Collections.Generic; using System.Text.RegularExpressions; + using System.Numerics; using Newtonsoft.Json; using NodaTime; using System.Collections; public class Utilities { - public static string SerializeJSON(object obj) + public static JsonConverter[] GetJsonConverters(Type type, string format = "") { + if (format == "string") + { + if (type == typeof(BigInteger)) + { + return new JsonConverter[] { new BigIntSerializer() }; + } + if (type == typeof(Decimal)) + { + return new JsonConverter[] { new DecimalSerializer() }; + } + } + + return new JsonConverter[] + { + new IsoDateTimeSerializer(), + new EnumSerializer(), + }; + } + + public static string SerializeJSON(object obj, string format = "") + { + var type = obj.GetType(); + if (IsList(obj)) + { + type = type.GetGenericArguments().Single(); + } + else if (IsDictionary(obj)) + { + type = type.GetGenericArguments().Last(); + } + return JsonConvert.SerializeObject( obj, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, - Converters = new JsonConverter[] - { - new IsoDateTimeSerializer(), - new EnumSerializer() - } + Converters = GetJsonConverters(type, format) } ); } @@ -82,11 +110,11 @@ namespace PlexAPI.Utils } } - public static bool IsPrimitive(object obj) => obj != null && obj.GetType().IsPrimitive; + public static bool IsPrimitive(object? obj) => obj != null && obj.GetType().IsPrimitive; - public static bool IsEnum(object obj) => obj != null && obj.GetType().IsEnum; + public static bool IsEnum(object? obj) => obj != null && obj.GetType().IsEnum; - public static bool IsDate(object obj) => + public static bool IsDate(object? obj) => obj != null && (obj.GetType() == typeof(DateTime) || obj.GetType() == typeof(LocalDate)); private static string StripSurroundingQuotes(string input) @@ -238,4 +266,4 @@ namespace PlexAPI.Utils return template; } } -} \ No newline at end of file +} diff --git a/PlexAPI/Video.cs b/PlexAPI/Video.cs index 88e8173..56b7481 100644 --- a/PlexAPI/Video.cs +++ b/PlexAPI/Video.cs @@ -11,6 +11,7 @@ namespace PlexAPI { using Newtonsoft.Json; + using PlexAPI.Models.Components; using PlexAPI.Models.Requests; using PlexAPI.Utils; using System.Net.Http.Headers; @@ -28,6 +29,15 @@ namespace PlexAPI public interface IVideo { + /// + /// Get the timeline for a media item + /// + /// + /// Get the timeline for a media item + /// + /// + Task GetTimelineAsync(GetTimelineRequest request); + /// /// Start Universal Transcode /// @@ -35,16 +45,7 @@ namespace PlexAPI /// Begin a Universal Transcode Session /// /// - Task StartUniversalTranscodeAsync(StartUniversalTranscodeRequest? request = null); - - /// - /// Get the timeline for a media item - /// - /// - /// Get the timeline for a media item - /// - /// - Task GetTimelineAsync(GetTimelineRequest? request = null); + Task StartUniversalTranscodeAsync(StartUniversalTranscodeRequest request); } /// @@ -58,101 +59,111 @@ namespace PlexAPI { public SDKConfig SDKConfiguration { get; private set; } private const string _language = "csharp"; - private const string _sdkVersion = "0.1.5"; - private const string _sdkGenVersion = "2.237.3"; + private const string _sdkVersion = "0.2.0"; + private const string _sdkGenVersion = "2.269.0"; private const string _openapiDocVersion = "0.0.3"; - private const string _userAgent = "speakeasy-sdk/csharp 0.1.5 2.237.3 0.0.3 Plex-API"; + private const string _userAgent = "speakeasy-sdk/csharp 0.2.0 2.269.0 0.0.3 Plex-API"; private string _serverUrl = ""; private ISpeakeasyHttpClient _defaultClient; - private ISpeakeasyHttpClient _securityClient; + private Func? _securitySource; - public Video(ISpeakeasyHttpClient defaultClient, ISpeakeasyHttpClient securityClient, string serverUrl, SDKConfig config) + public Video(ISpeakeasyHttpClient defaultClient, Func? securitySource, string serverUrl, SDKConfig config) { _defaultClient = defaultClient; - _securityClient = securityClient; + _securitySource = securitySource; _serverUrl = serverUrl; SDKConfiguration = config; } - public async Task StartUniversalTranscodeAsync(StartUniversalTranscodeRequest? request = null) - { - string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); - var urlString = URLBuilder.Build(baseUrl, "/video/:/transcode/universal/start.mpd", request); - - var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); - httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - - var httpResponse = await client.SendAsync(httpRequest); - - var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - - var response = new StartUniversalTranscodeResponse - { - StatusCode = (int)httpResponse.StatusCode, - ContentType = contentType, - RawResponse = httpResponse - }; - - if((response.StatusCode == 200) || (response.StatusCode == 400)) - { - - return response; - } - if((response.StatusCode == 401)) - { - if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) - { - response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); - } - - return response; - } - return response; - } - - - public async Task GetTimelineAsync(GetTimelineRequest? request = null) + public async Task GetTimelineAsync(GetTimelineRequest request) { string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); var urlString = URLBuilder.Build(baseUrl, "/:/timeline", request); - + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); httpRequest.Headers.Add("user-agent", _userAgent); - - - var client = _securityClient; - + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + var httpResponse = await client.SendAsync(httpRequest); var contentType = httpResponse.Content.Headers.ContentType?.MediaType; - + var response = new GetTimelineResponse { StatusCode = (int)httpResponse.StatusCode, ContentType = contentType, RawResponse = httpResponse }; - + if((response.StatusCode == 200) || (response.StatusCode == 400)) { - + return response; } + if((response.StatusCode == 401)) { if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) { response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); } - + return response; } return response; } + + + + public async Task StartUniversalTranscodeAsync(StartUniversalTranscodeRequest request) + { + string baseUrl = this.SDKConfiguration.GetTemplatedServerDetails(); + var urlString = URLBuilder.Build(baseUrl, "/video/:/transcode/universal/start.mpd", request); + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlString); + httpRequest.Headers.Add("user-agent", _userAgent); + + var client = _defaultClient; + if (_securitySource != null) + { + client = SecuritySerializer.Apply(_defaultClient, _securitySource); + } + + var httpResponse = await client.SendAsync(httpRequest); + + var contentType = httpResponse.Content.Headers.ContentType?.MediaType; + + var response = new StartUniversalTranscodeResponse + { + StatusCode = (int)httpResponse.StatusCode, + ContentType = contentType, + RawResponse = httpResponse + }; + + if((response.StatusCode == 200) || (response.StatusCode == 400)) + { + + return response; + } + + if((response.StatusCode == 401)) + { + if(Utilities.IsContentTypeMatch("application/json",response.ContentType)) + { + response.Object = JsonConvert.DeserializeObject(await httpResponse.Content.ReadAsStringAsync(), new JsonSerializerSettings(){ NullValueHandling = NullValueHandling.Ignore, Converters = new JsonConverter[] { new FlexibleObjectDeserializer(), new EnumSerializer() }}); + } + + return response; + } + return response; + } + } } \ No newline at end of file diff --git a/README.md b/README.md index 32329e7..f59a9e9 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,7 @@ dotnet add package Plex-API using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -57,6 +56,11 @@ var res = await sdk.Server.GetServerCapabilitiesAsync(); * [MarkUnplayed](docs/sdks/media/README.md#markunplayed) - Mark Media Unplayed * [UpdatePlayProgress](docs/sdks/media/README.md#updateplayprogress) - Update Media Play Progress +### [Video](docs/sdks/video/README.md) + +* [GetTimeline](docs/sdks/video/README.md#gettimeline) - Get the timeline for a media item +* [StartUniversalTranscode](docs/sdks/video/README.md#startuniversaltranscode) - Start Universal Transcode + ### [Activities](docs/sdks/activities/README.md) * [GetServerActivities](docs/sdks/activities/README.md#getserveractivities) - Get Server Activities @@ -90,6 +94,7 @@ var res = await sdk.Server.GetServerCapabilitiesAsync(); * [DeleteLibrary](docs/sdks/library/README.md#deletelibrary) - Delete Library Section * [GetLibraryItems](docs/sdks/library/README.md#getlibraryitems) - Get Library Items * [RefreshLibrary](docs/sdks/library/README.md#refreshlibrary) - Refresh Library +* [SearchLibrary](docs/sdks/library/README.md#searchlibrary) - Search Library * [GetMetadata](docs/sdks/library/README.md#getmetadata) - Get Items Metadata * [GetMetadataChildren](docs/sdks/library/README.md#getmetadatachildren) - Get Items Children * [GetOnDeck](docs/sdks/library/README.md#getondeck) - Get On Deck @@ -100,6 +105,11 @@ var res = await sdk.Server.GetServerCapabilitiesAsync(); * [LogMultiLine](docs/sdks/log/README.md#logmultiline) - Logging a multi-line message * [EnablePaperTrail](docs/sdks/log/README.md#enablepapertrail) - Enabling Papertrail +### [Plex](docs/sdks/plex/README.md) + +* [GetPin](docs/sdks/plex/README.md#getpin) - Get a Pin +* [GetToken](docs/sdks/plex/README.md#gettoken) - Get Access Token + ### [Playlists](docs/sdks/playlists/README.md) * [CreatePlaylist](docs/sdks/playlists/README.md#createplaylist) - Create a Playlist @@ -117,6 +127,10 @@ var res = await sdk.Server.GetServerCapabilitiesAsync(); * [GetTransientToken](docs/sdks/security/README.md#gettransienttoken) - Get a Transient Token. * [GetSourceConnectionInformation](docs/sdks/security/README.md#getsourceconnectioninformation) - Get Source Connection Information +### [Statistics](docs/sdks/statistics/README.md) + +* [GetStatistics](docs/sdks/statistics/README.md#getstatistics) - Get Media Statistics + ### [Sessions](docs/sdks/sessions/README.md) * [GetSessions](docs/sdks/sessions/README.md#getsessions) - Get Active Sessions @@ -129,11 +143,6 @@ var res = await sdk.Server.GetServerCapabilitiesAsync(); * [GetUpdateStatus](docs/sdks/updater/README.md#getupdatestatus) - Querying status of updates * [CheckForUpdates](docs/sdks/updater/README.md#checkforupdates) - Checking for updates * [ApplyUpdates](docs/sdks/updater/README.md#applyupdates) - Apply Updates - -### [Video](docs/sdks/video/README.md) - -* [StartUniversalTranscode](docs/sdks/video/README.md#startuniversaltranscode) - Start Universal Transcode -* [GetTimeline](docs/sdks/video/README.md#gettimeline) - Get the timeline for a media item @@ -161,8 +170,55 @@ Some of the server options above contain variables. If you want to set the value ### Override Server URL Per-Client The default server can also be overridden globally by passing a URL to the `serverUrl: str` optional parameter when initializing the SDK client instance. For example: + + +### Override Server URL Per-Operation + +The server URL can also be overridden on a per-operation basis, provided a server list was specified for the operation. For example: +```csharp +using PlexAPI; +using PlexAPI.Models.Components; +using PlexAPI.Models.Requests; + +var sdk = new PlexAPISDK(security: new Models.Components.Security() { + AccessToken = "", + }); + +var res = await sdk.Plex.GetPinAsync( + serverUrl: "https://plex.tv/api/v2", + xPlexClientIdentifier: "", + strong: false); + +// handle response +``` + +## Authentication + +### Per-Client Security Schemes + +This SDK supports the following security scheme globally: + +| Name | Type | Scheme | +| ------------- | ------------- | ------------- | +| `AccessToken` | apiKey | API key | + +You can set the security parameters through the `security` optional parameter when initializing the SDK client instance. For example: +```csharp +using PlexAPI; +using PlexAPI.Models.Components; + +var sdk = new PlexAPISDK(security: new Models.Components.Security() { + AccessToken = "", + }); + +var res = await sdk.Server.GetServerCapabilitiesAsync(); + +// handle response +``` + + # Development diff --git a/RELEASES.md b/RELEASES.md index 99eaf2c..908f1f7 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -54,4 +54,12 @@ Based on: - OpenAPI Doc 0.0.3 - Speakeasy CLI 1.148.0 (2.237.3) https://github.com/speakeasy-api/speakeasy ### Generated -- [csharp v0.1.5] . \ No newline at end of file +- [csharp v0.1.5] . + +## 2024-02-23 14:46:24 +### Changes +Based on: +- OpenAPI Doc 0.0.3 +- Speakeasy CLI 1.193.0 (2.269.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [csharp v0.2.0] . \ No newline at end of file diff --git a/USAGE.md b/USAGE.md index fa05bbe..475a705 100644 --- a/USAGE.md +++ b/USAGE.md @@ -3,8 +3,7 @@ using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); diff --git a/docs/Models/Requests/Account.md b/docs/Models/Requests/Account.md new file mode 100644 index 0000000..7ccd6bc --- /dev/null +++ b/docs/Models/Requests/Account.md @@ -0,0 +1,15 @@ +# Account + + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | +| `Id` | *int* | :heavy_minus_sign: | N/A | 238960586 | +| `Key` | *string* | :heavy_minus_sign: | N/A | /accounts/238960586 | +| `Name` | *string* | :heavy_minus_sign: | N/A | Diane | +| `DefaultAudioLanguage` | *string* | :heavy_minus_sign: | N/A | en | +| `AutoSelectAudio` | *bool* | :heavy_minus_sign: | N/A | true | +| `DefaultSubtitleLanguage` | *string* | :heavy_minus_sign: | N/A | en | +| `SubtitleMode` | *int* | :heavy_minus_sign: | N/A | 1 | +| `Thumb` | *string* | :heavy_minus_sign: | N/A | https://plex.tv/users/50d83634246da1de/avatar?c=1707110967 | \ No newline at end of file diff --git a/docs/Models/Requests/CreatePlaylistRequest.md b/docs/Models/Requests/CreatePlaylistRequest.md index 549ea1b..105958a 100644 --- a/docs/Models/Requests/CreatePlaylistRequest.md +++ b/docs/Models/Requests/CreatePlaylistRequest.md @@ -3,10 +3,10 @@ ## Fields -| Field | Type | Required | Description | -| --------------------------------------- | --------------------------------------- | --------------------------------------- | --------------------------------------- | -| `Title` | *string* | :heavy_check_mark: | name of the playlist | -| `Type` | [Type](../../Models/Requests/Type.md) | :heavy_check_mark: | type of playlist to create | -| `Smart` | [Smart](../../Models/Requests/Smart.md) | :heavy_check_mark: | whether the playlist is smart or not | -| `Uri` | *string* | :heavy_check_mark: | the content URI for the playlist | -| `PlayQueueID` | *double* | :heavy_minus_sign: | the play queue to copy to a playlist | \ No newline at end of file +| Field | Type | Required | Description | +| --------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | +| `Title` | *string* | :heavy_check_mark: | name of the playlist | +| `Type` | [QueryParamType](../../Models/Requests/QueryParamType.md) | :heavy_check_mark: | type of playlist to create | +| `Smart` | [Smart](../../Models/Requests/Smart.md) | :heavy_check_mark: | whether the playlist is smart or not | +| `Uri` | *string* | :heavy_check_mark: | the content URI for the playlist | +| `PlayQueueID` | *double* | :heavy_minus_sign: | the play queue to copy to a playlist | \ No newline at end of file diff --git a/docs/Models/Requests/GetLibrariesDirectory.md b/docs/Models/Requests/GetLibrariesDirectory.md index f156180..6214b86 100644 --- a/docs/Models/Requests/GetLibrariesDirectory.md +++ b/docs/Models/Requests/GetLibrariesDirectory.md @@ -3,26 +3,26 @@ ## Fields -| Field | Type | Required | Description | Example | -| --------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- | -| `AllowSync` | *bool* | :heavy_minus_sign: | N/A | true | -| `Art` | *string* | :heavy_minus_sign: | N/A | /:/resources/movie-fanart.jpg | -| `Composite` | *string* | :heavy_minus_sign: | N/A | /library/sections/1/composite/1705615584 | -| `Filters` | *bool* | :heavy_minus_sign: | N/A | true | -| `Refreshing` | *bool* | :heavy_minus_sign: | N/A | false | -| `Thumb` | *string* | :heavy_minus_sign: | N/A | /:/resources/movie.png | -| `Key` | *string* | :heavy_minus_sign: | N/A | 1 | -| `Type` | *string* | :heavy_minus_sign: | N/A | movie | -| `Title` | *string* | :heavy_minus_sign: | N/A | Movies | -| `Agent` | *string* | :heavy_minus_sign: | N/A | tv.plex.agents.movie | -| `Scanner` | *string* | :heavy_minus_sign: | N/A | Plex Movie | -| `Language` | *string* | :heavy_minus_sign: | N/A | en-US | -| `Uuid` | *string* | :heavy_minus_sign: | N/A | 322a231a-b7f7-49f5-920f-14c61199cd30 | -| `UpdatedAt` | *int* | :heavy_minus_sign: | N/A | 1705615634 | -| `CreatedAt` | *int* | :heavy_minus_sign: | N/A | 1654131312 | -| `ScannedAt` | *int* | :heavy_minus_sign: | N/A | 1705615584 | -| `Content` | *bool* | :heavy_minus_sign: | N/A | true | -| `Directory` | *bool* | :heavy_minus_sign: | N/A | true | -| `ContentChangedAt` | *int* | :heavy_minus_sign: | N/A | 3192854 | -| `Hidden` | *int* | :heavy_minus_sign: | N/A | 0 | -| `Location` | List<[Location](../../Models/Requests/Location.md)> | :heavy_minus_sign: | N/A | [{"id":1,"path":"/movies"}] | \ No newline at end of file +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| `AllowSync` | *bool* | :heavy_minus_sign: | N/A | true | +| `Art` | *string* | :heavy_minus_sign: | N/A | /:/resources/movie-fanart.jpg | +| `Composite` | *string* | :heavy_minus_sign: | N/A | /library/sections/1/composite/1705615584 | +| `Filters` | *bool* | :heavy_minus_sign: | N/A | true | +| `Refreshing` | *bool* | :heavy_minus_sign: | N/A | false | +| `Thumb` | *string* | :heavy_minus_sign: | N/A | /:/resources/movie.png | +| `Key` | *string* | :heavy_minus_sign: | N/A | 1 | +| `Type` | *string* | :heavy_minus_sign: | N/A | movie | +| `Title` | *string* | :heavy_minus_sign: | N/A | Movies | +| `Agent` | *string* | :heavy_minus_sign: | N/A | tv.plex.agents.movie | +| `Scanner` | *string* | :heavy_minus_sign: | N/A | Plex Movie | +| `Language` | *string* | :heavy_minus_sign: | N/A | en-US | +| `Uuid` | *string* | :heavy_minus_sign: | N/A | 322a231a-b7f7-49f5-920f-14c61199cd30 | +| `UpdatedAt` | *int* | :heavy_minus_sign: | N/A | 1705615634 | +| `CreatedAt` | *int* | :heavy_minus_sign: | N/A | 1654131312 | +| `ScannedAt` | *int* | :heavy_minus_sign: | N/A | 1705615584 | +| `Content` | *bool* | :heavy_minus_sign: | N/A | true | +| `Directory` | *bool* | :heavy_minus_sign: | N/A | true | +| `ContentChangedAt` | *int* | :heavy_minus_sign: | N/A | 3192854 | +| `Hidden` | *int* | :heavy_minus_sign: | N/A | 0 | +| `Location` | List<[GetLibrariesLocation](../../Models/Requests/GetLibrariesLocation.md)> | :heavy_minus_sign: | N/A | [{"id":1,"path":"/movies"}] | \ No newline at end of file diff --git a/docs/Models/Requests/GetLibrariesLocation.md b/docs/Models/Requests/GetLibrariesLocation.md new file mode 100644 index 0000000..d3ed793 --- /dev/null +++ b/docs/Models/Requests/GetLibrariesLocation.md @@ -0,0 +1,9 @@ +# GetLibrariesLocation + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `Id` | *int* | :heavy_minus_sign: | N/A | 1 | +| `Path` | *string* | :heavy_minus_sign: | N/A | /movies | \ No newline at end of file diff --git a/docs/Models/Requests/GetLibraryItemsMediaContainer.md b/docs/Models/Requests/GetLibraryItemsMediaContainer.md index ae8cf8a..cf0ab5f 100644 --- a/docs/Models/Requests/GetLibraryItemsMediaContainer.md +++ b/docs/Models/Requests/GetLibraryItemsMediaContainer.md @@ -3,20 +3,21 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `Size` | *int* | :heavy_minus_sign: | N/A | 70 | -| `AllowSync` | *bool* | :heavy_minus_sign: | N/A | true | -| `Art` | *string* | :heavy_minus_sign: | N/A | /:/resources/movie-fanart.jpg | -| `Identifier` | *string* | :heavy_minus_sign: | N/A | com.plexapp.plugins.library | -| `LibrarySectionID` | *int* | :heavy_minus_sign: | N/A | 1 | -| `LibrarySectionTitle` | *string* | :heavy_minus_sign: | N/A | Movies | -| `LibrarySectionUUID` | *string* | :heavy_minus_sign: | N/A | 322a231a-b7f7-49f5-920f-14c61199cd30 | -| `MediaTagPrefix` | *string* | :heavy_minus_sign: | N/A | /system/bundle/media/flags/ | -| `MediaTagVersion` | *int* | :heavy_minus_sign: | N/A | 1701731894 | -| `Thumb` | *string* | :heavy_minus_sign: | N/A | /:/resources/movie.png | -| `Title1` | *string* | :heavy_minus_sign: | N/A | Movies | -| `Title2` | *string* | :heavy_minus_sign: | N/A | Recently Released | -| `ViewGroup` | *string* | :heavy_minus_sign: | N/A | movie | -| `ViewMode` | *int* | :heavy_minus_sign: | N/A | 65592 | -| `Metadata` | List<[GetLibraryItemsMetadata](../../Models/Requests/GetLibraryItemsMetadata.md)> | :heavy_minus_sign: | N/A | [{"Country":[{"tag":"United States of America"}],"Director":[{"tag":"James Cameron"}],"Genre":[{"tag":"Action"},{"tag":"Adventure"}],"Media":[{"Part":[{"container":"mkv","duration":11558112,"file":"/movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv","id":119542,"key":"/library/parts/119542/1680457526/file.mkv","size":36158371307,"videoProfile":"main 10"}],"aspectRatio":1.85,"audioChannels":6,"audioCodec":"eac3","bitrate":25025,"container":"mkv","duration":11558112,"height":2072,"id":119534,"videoCodec":"hevc","videoFrameRate":"24p","videoProfile":"main 10","videoResolution":"4k","width":3840}],"Role":[{"tag":"Sam Worthington"},{"tag":"Zoe Saldaña"},{"tag":"Sigourney Weaver"}],"Writer":[{"tag":"Josh Friedman"},{"tag":"James Cameron"}],"addedAt":1680457607,"art":"/library/metadata/58683/art/1703239236","audienceRating":9.2,"audienceRatingImage":"rottentomatoes://image.rating.upright","chapterSource":"media","contentRating":"PG-13","duration":11558112,"guid":"plex://movie/5d7768ba96b655001fdc0408","key":"/library/metadata/58683","lastViewedAt":1682752242,"originalTitle":"映画 ブラッククローバー 魔法帝の剣","originallyAvailableAt":"2022-12-14T00:00:00Z","primaryExtraKey":"/library/metadata/58684","rating":7.6,"ratingImage":"rottentomatoes://image.rating.ripe","ratingKey":"58683","skipCount":1,"studio":"20th Century Studios","summary":"Jake Sully lives with his newfound family formed on the extrasolar moon Pandora. Once a familiar threat returns to finish what was previously started, Jake must work with Neytiri and the army of the Na'vi race to protect their home.","tagline":"Return to Pandora.","thumb":"/library/metadata/58683/thumb/1703239236","title":"Avatar: The Way of Water","titleSort":"Whale","type":"movie","updatedAt":1703239236,"viewCount":1,"viewOffset":5222500,"year":2022}] | \ No newline at end of file +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Size` | *int* | :heavy_minus_sign: | N/A | 70 | +| `AllowSync` | *bool* | :heavy_minus_sign: | N/A | true | +| `Art` | *string* | :heavy_minus_sign: | N/A | /:/resources/movie-fanart.jpg | +| `Identifier` | *string* | :heavy_minus_sign: | N/A | com.plexapp.plugins.library | +| `LibrarySectionID` | *int* | :heavy_minus_sign: | N/A | 1 | +| `LibrarySectionTitle` | *string* | :heavy_minus_sign: | N/A | Movies | +| `LibrarySectionUUID` | *string* | :heavy_minus_sign: | N/A | 322a231a-b7f7-49f5-920f-14c61199cd30 | +| `MediaTagPrefix` | *string* | :heavy_minus_sign: | N/A | /system/bundle/media/flags/ | +| `MediaTagVersion` | *int* | :heavy_minus_sign: | N/A | 1701731894 | +| `Thumb` | *string* | :heavy_minus_sign: | N/A | /:/resources/movie.png | +| `Title1` | *string* | :heavy_minus_sign: | N/A | Movies | +| `Title2` | *string* | :heavy_minus_sign: | N/A | Recently Released | +| `ViewGroup` | *string* | :heavy_minus_sign: | N/A | movie | +| `ViewMode` | *int* | :heavy_minus_sign: | N/A | 65592 | +| `MixedParents` | *bool* | :heavy_minus_sign: | N/A | true | +| `Metadata` | List<[GetLibraryItemsMetadata](../../Models/Requests/GetLibraryItemsMetadata.md)> | :heavy_minus_sign: | N/A | [{"Country":[{"tag":"United States of America"}],"Director":[{"tag":"James Cameron"}],"Genre":[{"tag":"Action"},{"tag":"Adventure"}],"Media":[{"Part":[{"container":"mkv","duration":11558112,"file":"/movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv","id":119542,"key":"/library/parts/119542/1680457526/file.mkv","size":36158371307,"videoProfile":"main 10"}],"aspectRatio":1.85,"audioChannels":6,"audioCodec":"eac3","bitrate":25025,"container":"mkv","duration":11558112,"height":2072,"id":119534,"videoCodec":"hevc","videoFrameRate":"24p","videoProfile":"main 10","videoResolution":"4k","width":3840}],"Role":[{"tag":"Sam Worthington"},{"tag":"Zoe Saldaña"},{"tag":"Sigourney Weaver"}],"Writer":[{"tag":"Josh Friedman"},{"tag":"James Cameron"}],"addedAt":1680457607,"art":"/library/metadata/58683/art/1703239236","audienceRating":9.2,"audienceRatingImage":"rottentomatoes://image.rating.upright","chapterSource":"media","childCount":1,"contentRating":"PG-13","duration":11558112,"grandparentArt":"/library/metadata/66/art/1705716261","grandparentGuid":"plex://show/5d9c081b170e24001f2a7be4","grandparentKey":"/library/metadata/66","grandparentRatingKey":"66","grandparentTheme":"/library/metadata/66/theme/1705716261","grandparentThumb":"/library/metadata/66/thumb/1705716261","grandparentTitle":"Caprica","guid":"plex://movie/5d7768ba96b655001fdc0408","hasPremiumExtras":"1","hasPremiumPrimaryExtra":"1","index":1,"key":"/library/metadata/58683","lastViewedAt":1682752242,"leafCount":14,"originalTitle":"映画 ブラッククローバー 魔法帝の剣","originallyAvailableAt":"2022-12-14T00:00:00Z","parentGuid":"plex://show/5d9c081b170e24001f2a7be4","parentIndex":1,"parentKey":"/library/metadata/66","parentRatingKey":"66","parentStudio":"UCP","parentTheme":"/library/metadata/66/theme/1705716261","parentThumb":"/library/metadata/66/thumb/1705716261","parentTitle":"Caprica","parentYear":2010,"primaryExtraKey":"/library/metadata/58684","rating":7.6,"ratingImage":"rottentomatoes://image.rating.ripe","ratingKey":"58683","skipCount":1,"studio":"20th Century Studios","summary":"Jake Sully lives with his newfound family formed on the extrasolar moon Pandora. Once a familiar threat returns to finish what was previously started, Jake must work with Neytiri and the army of the Na'vi race to protect their home.","tagline":"Return to Pandora.","theme":"/library/metadata/1/theme/1705636920","thumb":"/library/metadata/58683/thumb/1703239236","title":"Avatar: The Way of Water","titleSort":"Whale","type":"movie","updatedAt":1703239236,"viewCount":1,"viewOffset":5222500,"viewedLeafCount":0,"year":2022}] | \ No newline at end of file diff --git a/docs/Models/Requests/GetLibraryItemsMetadata.md b/docs/Models/Requests/GetLibraryItemsMetadata.md index 415be2e..4246d4f 100644 --- a/docs/Models/Requests/GetLibraryItemsMetadata.md +++ b/docs/Models/Requests/GetLibraryItemsMetadata.md @@ -27,6 +27,13 @@ | `ChapterSource` | *string* | :heavy_minus_sign: | N/A | media | | `PrimaryExtraKey` | *string* | :heavy_minus_sign: | N/A | /library/metadata/58684 | | `RatingImage` | *string* | :heavy_minus_sign: | N/A | rottentomatoes://image.rating.ripe | +| `GrandparentRatingKey` | *string* | :heavy_minus_sign: | N/A | 66 | +| `GrandparentGuid` | *string* | :heavy_minus_sign: | N/A | plex://show/5d9c081b170e24001f2a7be4 | +| `GrandparentKey` | *string* | :heavy_minus_sign: | N/A | /library/metadata/66 | +| `GrandparentTitle` | *string* | :heavy_minus_sign: | N/A | Caprica | +| `GrandparentThumb` | *string* | :heavy_minus_sign: | N/A | /library/metadata/66/thumb/1705716261 | +| `GrandparentArt` | *string* | :heavy_minus_sign: | N/A | /library/metadata/66/art/1705716261 | +| `GrandparentTheme` | *string* | :heavy_minus_sign: | N/A | /library/metadata/66/theme/1705716261 | | `Media` | List<[GetLibraryItemsMedia](../../Models/Requests/GetLibraryItemsMedia.md)> | :heavy_minus_sign: | N/A | [{"Part":[{"container":"mkv","duration":11558112,"file":"/movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv","id":119542,"key":"/library/parts/119542/1680457526/file.mkv","size":36158371307,"videoProfile":"main 10"}],"aspectRatio":1.85,"audioChannels":6,"audioCodec":"eac3","bitrate":25025,"container":"mkv","duration":11558112,"height":2072,"id":119534,"videoCodec":"hevc","videoFrameRate":"24p","videoProfile":"main 10","videoResolution":"4k","width":3840}] | | `Genre` | List<[GetLibraryItemsGenre](../../Models/Requests/GetLibraryItemsGenre.md)> | :heavy_minus_sign: | N/A | [{"tag":"Adventure"}] | | `Country` | List<[GetLibraryItemsCountry](../../Models/Requests/GetLibraryItemsCountry.md)> | :heavy_minus_sign: | N/A | [{"tag":"United States of America"}] | @@ -38,4 +45,20 @@ | `LastViewedAt` | *int* | :heavy_minus_sign: | N/A | 1682752242 | | `OriginalTitle` | *string* | :heavy_minus_sign: | N/A | 映画 ブラッククローバー 魔法帝の剣 | | `ViewOffset` | *int* | :heavy_minus_sign: | N/A | 5222500 | -| `SkipCount` | *int* | :heavy_minus_sign: | N/A | 1 | \ No newline at end of file +| `SkipCount` | *int* | :heavy_minus_sign: | N/A | 1 | +| `Index` | *int* | :heavy_minus_sign: | N/A | 1 | +| `Theme` | *string* | :heavy_minus_sign: | N/A | /library/metadata/1/theme/1705636920 | +| `LeafCount` | *int* | :heavy_minus_sign: | N/A | 14 | +| `ViewedLeafCount` | *int* | :heavy_minus_sign: | N/A | 0 | +| `ChildCount` | *int* | :heavy_minus_sign: | N/A | 1 | +| `HasPremiumExtras` | *string* | :heavy_minus_sign: | N/A | 1 | +| `HasPremiumPrimaryExtra` | *string* | :heavy_minus_sign: | N/A | 1 | +| `ParentRatingKey` | *string* | :heavy_minus_sign: | N/A | 66 | +| `ParentGuid` | *string* | :heavy_minus_sign: | N/A | plex://show/5d9c081b170e24001f2a7be4 | +| `ParentStudio` | *string* | :heavy_minus_sign: | N/A | UCP | +| `ParentKey` | *string* | :heavy_minus_sign: | N/A | /library/metadata/66 | +| `ParentTitle` | *string* | :heavy_minus_sign: | N/A | Caprica | +| `ParentIndex` | *int* | :heavy_minus_sign: | N/A | 1 | +| `ParentYear` | *int* | :heavy_minus_sign: | N/A | 2010 | +| `ParentThumb` | *string* | :heavy_minus_sign: | N/A | /library/metadata/66/thumb/1705716261 | +| `ParentTheme` | *string* | :heavy_minus_sign: | N/A | /library/metadata/66/theme/1705716261 | \ No newline at end of file diff --git a/docs/Models/Requests/GetPinErrors.md b/docs/Models/Requests/GetPinErrors.md new file mode 100644 index 0000000..29b493d --- /dev/null +++ b/docs/Models/Requests/GetPinErrors.md @@ -0,0 +1,10 @@ +# GetPinErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | +| `Code` | *double* | :heavy_minus_sign: | N/A | 1000 | +| `Message` | *string* | :heavy_minus_sign: | N/A | X-Plex-Client-Identifier is missing | +| `Status` | *double* | :heavy_minus_sign: | N/A | 400 | \ No newline at end of file diff --git a/docs/Models/Requests/GetPinPlexResponseBody.md b/docs/Models/Requests/GetPinPlexResponseBody.md new file mode 100644 index 0000000..d784f08 --- /dev/null +++ b/docs/Models/Requests/GetPinPlexResponseBody.md @@ -0,0 +1,10 @@ +# GetPinPlexResponseBody + +X-Plex-Client-Identifier is missing + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | +| `Errors` | List<[GetPinErrors](../../Models/Requests/GetPinErrors.md)> | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/Models/Requests/GetPinRequest.md b/docs/Models/Requests/GetPinRequest.md new file mode 100644 index 0000000..498d48a --- /dev/null +++ b/docs/Models/Requests/GetPinRequest.md @@ -0,0 +1,9 @@ +# GetPinRequest + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `XPlexClientIdentifier` | *string* | :heavy_check_mark: | The unique identifier for the client application
This is used to track the client application and its usage
(UUID, serial number, or other number unique per device)
| +| `Strong` | *bool* | :heavy_minus_sign: | Determines the kind of code returned by the API call
Strong codes are used for Pin authentication flows
Non-Strong codes are used for `Plex.tv/link`
| \ No newline at end of file diff --git a/docs/Models/Requests/GetPinResponse.md b/docs/Models/Requests/GetPinResponse.md new file mode 100644 index 0000000..d1d2a11 --- /dev/null +++ b/docs/Models/Requests/GetPinResponse.md @@ -0,0 +1,12 @@ +# GetPinResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [HttpResponseMessage](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `TwoHundredApplicationJsonObject` | [GetPinResponseBody](../../Models/Requests/GetPinResponseBody.md) | :heavy_minus_sign: | The Pin | +| `FourHundredApplicationJsonObject` | [GetPinPlexResponseBody](../../Models/Requests/GetPinPlexResponseBody.md) | :heavy_minus_sign: | X-Plex-Client-Identifier is missing | \ No newline at end of file diff --git a/docs/Models/Requests/GetPinResponseBody.md b/docs/Models/Requests/GetPinResponseBody.md new file mode 100644 index 0000000..87eb8a3 --- /dev/null +++ b/docs/Models/Requests/GetPinResponseBody.md @@ -0,0 +1,21 @@ +# GetPinResponseBody + +The Pin + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Id` | *double* | :heavy_minus_sign: | PinID for use with authentication | 1272322473 | +| `Code` | *string* | :heavy_minus_sign: | N/A | 3patfx1a78ukcbr7x0n9bl26t | +| `Product` | *string* | :heavy_minus_sign: | N/A | Plex Web | +| `Trusted` | *bool* | :heavy_minus_sign: | N/A | | +| `Qr` | *string* | :heavy_minus_sign: | a link to a QR code hosted on plex.tv
The QR code redirects to the relevant `plex.tv/link` authentication page
Which then prompts the user for the 4 Digit Link Pin
| https://plex.tv/api/v2/pins/qr/3patfx1a78ukcbr7x0n9bl26t | +| `ClientIdentifier` | *string* | :heavy_minus_sign: | N/A | Postman | +| `Location` | [Location](../../Models/Requests/Location.md) | :heavy_minus_sign: | N/A | | +| `ExpiresIn` | *double* | :heavy_minus_sign: | N/A | 1800 | +| `CreatedAt` | [DateTime](https://learn.microsoft.com/en-us/dotnet/api/system.datetime?view=net-5.0) | :heavy_minus_sign: | N/A | 2023-04-12 17:00:03 +0000 UTC | +| `ExpiresAt` | [DateTime](https://learn.microsoft.com/en-us/dotnet/api/system.datetime?view=net-5.0) | :heavy_minus_sign: | N/A | 2023-04-12 17:30:03 +0000 UTC | +| `AuthToken` | *string* | :heavy_minus_sign: | N/A | | +| `NewRegistration` | *string* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/Models/Requests/GetServerPreferencesMediaContainer.md b/docs/Models/Requests/GetServerPreferencesMediaContainer.md index 17aabfa..fcceaa8 100644 --- a/docs/Models/Requests/GetServerPreferencesMediaContainer.md +++ b/docs/Models/Requests/GetServerPreferencesMediaContainer.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `Size` | *int* | :heavy_minus_sign: | N/A | 161 | -| `Setting` | List<*object*> | :heavy_minus_sign: | N/A | [{"advanced":false,"default":"","group":"general","hidden":false,"id":"FriendlyName","label":"Friendly name","summary":"This name will be used to identify this media server to other computers on your network. If you leave it blank, your computer's name will be used instead.","type":"text","value":"Hera"},{"advanced":false,"default":3600,"enumValues":"900:every 15 minutes\|1800:every 30 minutes\|3600:hourly\|7200:every 2 hours\|21600:every 6 hours\|43200:every 12 hours\|86400:daily","group":"library","hidden":false,"id":"ScheduledLibraryUpdateInterval","label":"Library scan interval","summary":"","type":"int","value":3600}] | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Size` | *int* | :heavy_minus_sign: | N/A | 161 | +| `Setting` | List<[Setting](../../Models/Requests/Setting.md)> | :heavy_minus_sign: | N/A | [{"advanced":false,"default":false,"enumValues":"1:admin only\|2:everyone","group":"","hidden":true,"id":"EnableDatabaseTrace","label":"","summary":"","type":"bool","value":false}] | \ No newline at end of file diff --git a/docs/Models/Requests/GetStatisticsDevice.md b/docs/Models/Requests/GetStatisticsDevice.md new file mode 100644 index 0000000..f63a0c5 --- /dev/null +++ b/docs/Models/Requests/GetStatisticsDevice.md @@ -0,0 +1,12 @@ +# GetStatisticsDevice + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------- | -------------------------------- | -------------------------------- | -------------------------------- | -------------------------------- | +| `Id` | *int* | :heavy_minus_sign: | N/A | 208 | +| `Name` | *string* | :heavy_minus_sign: | N/A | Roku Express | +| `Platform` | *string* | :heavy_minus_sign: | N/A | Roku | +| `ClientIdentifier` | *string* | :heavy_minus_sign: | N/A | 793095d235660625108ef785cc7646e9 | +| `CreatedAt` | *int* | :heavy_minus_sign: | N/A | 1706470556 | \ No newline at end of file diff --git a/docs/Models/Requests/GetStatisticsErrors.md b/docs/Models/Requests/GetStatisticsErrors.md new file mode 100644 index 0000000..63be032 --- /dev/null +++ b/docs/Models/Requests/GetStatisticsErrors.md @@ -0,0 +1,10 @@ +# GetStatisticsErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | +| `Code` | *double* | :heavy_minus_sign: | N/A | 1001 | +| `Message` | *string* | :heavy_minus_sign: | N/A | User could not be authenticated | +| `Status` | *double* | :heavy_minus_sign: | N/A | 401 | \ No newline at end of file diff --git a/docs/Models/Requests/GetStatisticsMediaContainer.md b/docs/Models/Requests/GetStatisticsMediaContainer.md new file mode 100644 index 0000000..15c0499 --- /dev/null +++ b/docs/Models/Requests/GetStatisticsMediaContainer.md @@ -0,0 +1,11 @@ +# GetStatisticsMediaContainer + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Size` | *int* | :heavy_minus_sign: | N/A | 5497 | +| `Device` | List<[GetStatisticsDevice](../../Models/Requests/GetStatisticsDevice.md)> | :heavy_minus_sign: | N/A | [{"clientIdentifier":"793095d235660625108ef785cc7646e9","createdAt":1706470556,"id":208,"name":"Roku Express","platform":"Roku"}] | +| `Account` | List<[Account](../../Models/Requests/Account.md)> | :heavy_minus_sign: | N/A | [{"autoSelectAudio":true,"defaultAudioLanguage":"en","defaultSubtitleLanguage":"en","id":238960586,"key":"/accounts/238960586","name":"Diane","subtitleMode":1,"thumb":"https://plex.tv/users/50d83634246da1de/avatar?c=1707110967"}] | +| `StatisticsMedia` | List<[StatisticsMedia](../../Models/Requests/StatisticsMedia.md)> | :heavy_minus_sign: | N/A | [{"accountID":1,"at":1707141600,"count":1,"deviceID":13,"duration":1555,"metadataType":4,"timespan":4}] | \ No newline at end of file diff --git a/docs/Models/Requests/GetStatisticsRequest.md b/docs/Models/Requests/GetStatisticsRequest.md new file mode 100644 index 0000000..d88aab6 --- /dev/null +++ b/docs/Models/Requests/GetStatisticsRequest.md @@ -0,0 +1,8 @@ +# GetStatisticsRequest + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| `Timespan` | *long* | :heavy_minus_sign: | The timespan to retrieve statistics for
the exact meaning of this parameter is not known
| \ No newline at end of file diff --git a/docs/Models/Requests/GetStatisticsResponse.md b/docs/Models/Requests/GetStatisticsResponse.md new file mode 100644 index 0000000..164d510 --- /dev/null +++ b/docs/Models/Requests/GetStatisticsResponse.md @@ -0,0 +1,12 @@ +# GetStatisticsResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [HttpResponseMessage](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `TwoHundredApplicationJsonObject` | [GetStatisticsResponseBody](../../Models/Requests/GetStatisticsResponseBody.md) | :heavy_minus_sign: | Media Statistics | +| `FourHundredAndOneApplicationJsonObject` | [GetStatisticsStatisticsResponseBody](../../Models/Requests/GetStatisticsStatisticsResponseBody.md) | :heavy_minus_sign: | Unauthorized - Returned if the X-Plex-Token is missing from the header or query. | \ No newline at end of file diff --git a/docs/Models/Requests/GetStatisticsResponseBody.md b/docs/Models/Requests/GetStatisticsResponseBody.md new file mode 100644 index 0000000..b1944a8 --- /dev/null +++ b/docs/Models/Requests/GetStatisticsResponseBody.md @@ -0,0 +1,10 @@ +# GetStatisticsResponseBody + +Media Statistics + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| `MediaContainer` | [GetStatisticsMediaContainer](../../Models/Requests/GetStatisticsMediaContainer.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/Models/Requests/GetStatisticsStatisticsResponseBody.md b/docs/Models/Requests/GetStatisticsStatisticsResponseBody.md new file mode 100644 index 0000000..03d8eba --- /dev/null +++ b/docs/Models/Requests/GetStatisticsStatisticsResponseBody.md @@ -0,0 +1,10 @@ +# GetStatisticsStatisticsResponseBody + +Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| `Errors` | List<[GetStatisticsErrors](../../Models/Requests/GetStatisticsErrors.md)> | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/Models/Requests/GetTokenErrors.md b/docs/Models/Requests/GetTokenErrors.md new file mode 100644 index 0000000..cfb3fba --- /dev/null +++ b/docs/Models/Requests/GetTokenErrors.md @@ -0,0 +1,10 @@ +# GetTokenErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | +| `Code` | *double* | :heavy_minus_sign: | N/A | 1000 | +| `Message` | *string* | :heavy_minus_sign: | N/A | X-Plex-Client-Identifier is missing | +| `Status` | *double* | :heavy_minus_sign: | N/A | 400 | \ No newline at end of file diff --git a/docs/Models/Requests/GetTokenRequest.md b/docs/Models/Requests/GetTokenRequest.md new file mode 100644 index 0000000..d4d7a73 --- /dev/null +++ b/docs/Models/Requests/GetTokenRequest.md @@ -0,0 +1,9 @@ +# GetTokenRequest + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PinID` | *string* | :heavy_check_mark: | The PinID to retrieve an access token for | +| `XPlexClientIdentifier` | *string* | :heavy_check_mark: | The unique identifier for the client application
This is used to track the client application and its usage
(UUID, serial number, or other number unique per device)
| \ No newline at end of file diff --git a/docs/Models/Requests/GetTokenResponse.md b/docs/Models/Requests/GetTokenResponse.md new file mode 100644 index 0000000..40dc125 --- /dev/null +++ b/docs/Models/Requests/GetTokenResponse.md @@ -0,0 +1,11 @@ +# GetTokenResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [HttpResponseMessage](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `Object` | [GetTokenResponseBody](../../Models/Requests/GetTokenResponseBody.md) | :heavy_minus_sign: | X-Plex-Client-Identifier is missing | \ No newline at end of file diff --git a/docs/Models/Requests/GetTokenResponseBody.md b/docs/Models/Requests/GetTokenResponseBody.md new file mode 100644 index 0000000..498f2e3 --- /dev/null +++ b/docs/Models/Requests/GetTokenResponseBody.md @@ -0,0 +1,10 @@ +# GetTokenResponseBody + +X-Plex-Client-Identifier is missing + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | +| `Errors` | List<[GetTokenErrors](../../Models/Requests/GetTokenErrors.md)> | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/Models/Requests/GetTransientTokenQueryParamType.md b/docs/Models/Requests/GetTransientTokenQueryParamType.md new file mode 100644 index 0000000..ed8d4a4 --- /dev/null +++ b/docs/Models/Requests/GetTransientTokenQueryParamType.md @@ -0,0 +1,10 @@ +# GetTransientTokenQueryParamType + +`delegation` - This is the only supported `type` parameter. + + +## Values + +| Name | Value | +| ------------ | ------------ | +| `Delegation` | delegation | \ No newline at end of file diff --git a/docs/Models/Requests/GetTransientTokenRequest.md b/docs/Models/Requests/GetTransientTokenRequest.md index 44f2370..8974dbc 100644 --- a/docs/Models/Requests/GetTransientTokenRequest.md +++ b/docs/Models/Requests/GetTransientTokenRequest.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | -| ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | -| `Type` | [QueryParamType](../../Models/Requests/QueryParamType.md) | :heavy_check_mark: | `delegation` - This is the only supported `type` parameter. | -| `Scope` | [Scope](../../Models/Requests/Scope.md) | :heavy_check_mark: | `all` - This is the only supported `scope` parameter. | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | +| `Type` | [GetTransientTokenQueryParamType](../../Models/Requests/GetTransientTokenQueryParamType.md) | :heavy_check_mark: | `delegation` - This is the only supported `type` parameter. | +| `Scope` | [Scope](../../Models/Requests/Scope.md) | :heavy_check_mark: | `all` - This is the only supported `scope` parameter. | \ No newline at end of file diff --git a/docs/Models/Requests/Location.md b/docs/Models/Requests/Location.md index 905e369..5831148 100644 --- a/docs/Models/Requests/Location.md +++ b/docs/Models/Requests/Location.md @@ -3,7 +3,15 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | -| `Id` | *int* | :heavy_minus_sign: | N/A | 1 | -| `Path` | *string* | :heavy_minus_sign: | N/A | /movies | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ---------------------------- | ---------------------------- | ---------------------------- | ---------------------------- | ---------------------------- | +| `Code` | *string* | :heavy_minus_sign: | N/A | US | +| `EuropeanUnionMember` | *bool* | :heavy_minus_sign: | N/A | | +| `ContinentCode` | *string* | :heavy_minus_sign: | N/A | NA | +| `Country` | *string* | :heavy_minus_sign: | N/A | United States | +| `City` | *string* | :heavy_minus_sign: | N/A | Austin | +| `TimeZone` | *string* | :heavy_minus_sign: | N/A | America/Chicago | +| `PostalCode` | *double* | :heavy_minus_sign: | N/A | 78732 | +| `InPrivacyRestrictedCountry` | *bool* | :heavy_minus_sign: | N/A | | +| `Subdivisions` | *string* | :heavy_minus_sign: | N/A | Texas | +| `Coordinates` | *string* | :heavy_minus_sign: | N/A | 30.3768 -97.8935 | \ No newline at end of file diff --git a/docs/Models/Requests/QueryParamType.md b/docs/Models/Requests/QueryParamType.md index 86cdced..549a0c1 100644 --- a/docs/Models/Requests/QueryParamType.md +++ b/docs/Models/Requests/QueryParamType.md @@ -1,10 +1,12 @@ # QueryParamType -`delegation` - This is the only supported `type` parameter. +type of playlist to create ## Values -| Name | Value | -| ------------ | ------------ | -| `Delegation` | delegation | \ No newline at end of file +| Name | Value | +| ------- | ------- | +| `Audio` | audio | +| `Video` | video | +| `Photo` | photo | \ No newline at end of file diff --git a/docs/Models/Requests/SearchLibraryMediaContainer.md b/docs/Models/Requests/SearchLibraryMediaContainer.md new file mode 100644 index 0000000..13bfd22 --- /dev/null +++ b/docs/Models/Requests/SearchLibraryMediaContainer.md @@ -0,0 +1,20 @@ +# SearchLibraryMediaContainer + + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Size` | *int* | :heavy_minus_sign: | N/A | 2 | +| `AllowSync` | *bool* | :heavy_minus_sign: | N/A | false | +| `Art` | *string* | :heavy_minus_sign: | N/A | /:/resources/show-fanart.jpg | +| `Identifier` | *string* | :heavy_minus_sign: | N/A | com.plexapp.plugins.library | +| `MediaTagPrefix` | *string* | :heavy_minus_sign: | N/A | /system/bundle/media/flags/ | +| `MediaTagVersion` | *int* | :heavy_minus_sign: | N/A | 1698860922 | +| `Nocache` | *bool* | :heavy_minus_sign: | N/A | true | +| `Thumb` | *string* | :heavy_minus_sign: | N/A | /:/resources/show.png | +| `Title1` | *string* | :heavy_minus_sign: | N/A | TV Shows | +| `Title2` | *string* | :heavy_minus_sign: | N/A | Search for '' | +| `ViewGroup` | *string* | :heavy_minus_sign: | N/A | season | +| `ViewMode` | *int* | :heavy_minus_sign: | N/A | 65593 | +| `Metadata` | List<[SearchLibraryMetadata](../../Models/Requests/SearchLibraryMetadata.md)> | :heavy_minus_sign: | N/A | [{"addedAt":1705636916,"art":"/library/metadata/1/art/1705636920","guid":"plex://season/602e67e766dfdb002c0a1b5b","index":1,"key":"/library/metadata/2/children","parentGuid":"plex://show/5d9c086c7d06d9001ffd27aa","parentIndex":1,"parentKey":"/library/metadata/1","parentRatingKey":"1","parentStudio":"Mutant Enemy Productions","parentTheme":"/library/metadata/1/theme/1705636920","parentThumb":"/library/metadata/1/thumb/1705636920","parentTitle":"Firefly","parentYear":2002,"ratingKey":"2","summary":"Captain Malcolm 'Mal' Reynolds is a former galactic war veteran who is the captain of the transport ship \"Serenity\". Mal and his crew, ensign Zoe Alleyne Washburne; Zoe's husband, pilot Hoban 'Wash' Washburne; muscular mercenary Jayne Cobb; young mechanic Kaylee Frye; former Alliance medical officer Simon Tam; his disturbed teenage sister River (both on the run from the interplanetary government \"The Alliance\"); the beautiful courtesan Inara Serra; and preacher Shepherd Book do any jobs, legal or illegal, they can find as the Serenity crew travels across the outskirts of outer space.","thumb":"/library/metadata/2/thumb/1705636920","title":"Season 1","type":"season","updatedAt":1705636920}] | \ No newline at end of file diff --git a/docs/Models/Requests/SearchLibraryMetadata.md b/docs/Models/Requests/SearchLibraryMetadata.md new file mode 100644 index 0000000..1641823 --- /dev/null +++ b/docs/Models/Requests/SearchLibraryMetadata.md @@ -0,0 +1,27 @@ +# SearchLibraryMetadata + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `RatingKey` | *string* | :heavy_minus_sign: | N/A | 2 | +| `Key` | *string* | :heavy_minus_sign: | N/A | /library/metadata/2/children | +| `ParentRatingKey` | *string* | :heavy_minus_sign: | N/A | 1 | +| `Guid` | *string* | :heavy_minus_sign: | N/A | plex://season/602e67e766dfdb002c0a1b5b | +| `ParentGuid` | *string* | :heavy_minus_sign: | N/A | plex://show/5d9c086c7d06d9001ffd27aa | +| `ParentStudio` | *string* | :heavy_minus_sign: | N/A | Mutant Enemy Productions | +| `Type` | *string* | :heavy_minus_sign: | N/A | season | +| `Title` | *string* | :heavy_minus_sign: | N/A | Season 1 | +| `ParentKey` | *string* | :heavy_minus_sign: | N/A | /library/metadata/1 | +| `ParentTitle` | *string* | :heavy_minus_sign: | N/A | Firefly | +| `Summary` | *string* | :heavy_minus_sign: | N/A | Captain Malcolm 'Mal' Reynolds is a former galactic war veteran who is the captain of the transport ship "Serenity". Mal and his crew, ensign Zoe Alleyne Washburne; Zoe's husband, pilot Hoban 'Wash' Washburne; muscular mercenary Jayne Cobb; young mechanic Kaylee Frye; former Alliance medical officer Simon Tam; his disturbed teenage sister River (both on the run from the interplanetary government "The Alliance"); the beautiful courtesan Inara Serra; and preacher Shepherd Book do any jobs, legal or illegal, they can find as the Serenity crew travels across the outskirts of outer space. | +| `Index` | *int* | :heavy_minus_sign: | N/A | 1 | +| `ParentIndex` | *int* | :heavy_minus_sign: | N/A | 1 | +| `ParentYear` | *int* | :heavy_minus_sign: | N/A | 2002 | +| `Thumb` | *string* | :heavy_minus_sign: | N/A | /library/metadata/2/thumb/1705636920 | +| `Art` | *string* | :heavy_minus_sign: | N/A | /library/metadata/1/art/1705636920 | +| `ParentThumb` | *string* | :heavy_minus_sign: | N/A | /library/metadata/1/thumb/1705636920 | +| `ParentTheme` | *string* | :heavy_minus_sign: | N/A | /library/metadata/1/theme/1705636920 | +| `AddedAt` | *int* | :heavy_minus_sign: | N/A | 1705636916 | +| `UpdatedAt` | *int* | :heavy_minus_sign: | N/A | 1705636920 | \ No newline at end of file diff --git a/docs/Models/Requests/SearchLibraryRequest.md b/docs/Models/Requests/SearchLibraryRequest.md new file mode 100644 index 0000000..83a6748 --- /dev/null +++ b/docs/Models/Requests/SearchLibraryRequest.md @@ -0,0 +1,9 @@ +# SearchLibraryRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | +| `SectionId` | *long* | :heavy_check_mark: | the Id of the library to query | +| `Type` | [Type](../../Models/Requests/Type.md) | :heavy_check_mark: | Plex content type to search for | \ No newline at end of file diff --git a/docs/Models/Requests/SearchLibraryResponse.md b/docs/Models/Requests/SearchLibraryResponse.md new file mode 100644 index 0000000..c33b660 --- /dev/null +++ b/docs/Models/Requests/SearchLibraryResponse.md @@ -0,0 +1,11 @@ +# SearchLibraryResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [HttpResponseMessage](https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `Object` | [SearchLibraryResponseBody](../../Models/Requests/SearchLibraryResponseBody.md) | :heavy_minus_sign: | The contents of the library by section and type | \ No newline at end of file diff --git a/docs/Models/Requests/SearchLibraryResponseBody.md b/docs/Models/Requests/SearchLibraryResponseBody.md new file mode 100644 index 0000000..557d503 --- /dev/null +++ b/docs/Models/Requests/SearchLibraryResponseBody.md @@ -0,0 +1,10 @@ +# SearchLibraryResponseBody + +The contents of the library by section and type + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| `MediaContainer` | [SearchLibraryMediaContainer](../../Models/Requests/SearchLibraryMediaContainer.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/Models/Requests/Setting.md b/docs/Models/Requests/Setting.md new file mode 100644 index 0000000..b9cad0d --- /dev/null +++ b/docs/Models/Requests/Setting.md @@ -0,0 +1,17 @@ +# Setting + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------- | ----------------------- | ----------------------- | ----------------------- | ----------------------- | +| `Id` | *string* | :heavy_minus_sign: | N/A | EnableDatabaseTrace | +| `Label` | *string* | :heavy_minus_sign: | N/A | | +| `Summary` | *string* | :heavy_minus_sign: | N/A | | +| `Type` | *string* | :heavy_minus_sign: | N/A | bool | +| `Default` | *bool* | :heavy_minus_sign: | N/A | false | +| `Value` | *bool* | :heavy_minus_sign: | N/A | false | +| `Hidden` | *bool* | :heavy_minus_sign: | N/A | true | +| `Advanced` | *bool* | :heavy_minus_sign: | N/A | false | +| `Group` | *string* | :heavy_minus_sign: | N/A | | +| `EnumValues` | *string* | :heavy_minus_sign: | N/A | 1:admin only\|2:everyone | \ No newline at end of file diff --git a/docs/Models/Requests/StatisticsMedia.md b/docs/Models/Requests/StatisticsMedia.md new file mode 100644 index 0000000..8b41309 --- /dev/null +++ b/docs/Models/Requests/StatisticsMedia.md @@ -0,0 +1,14 @@ +# StatisticsMedia + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `AccountID` | *int* | :heavy_minus_sign: | N/A | 1 | +| `DeviceID` | *int* | :heavy_minus_sign: | N/A | 13 | +| `Timespan` | *int* | :heavy_minus_sign: | N/A | 4 | +| `At` | *int* | :heavy_minus_sign: | N/A | 1707141600 | +| `MetadataType` | *int* | :heavy_minus_sign: | N/A | 4 | +| `Count` | *int* | :heavy_minus_sign: | N/A | 1 | +| `Duration` | *int* | :heavy_minus_sign: | N/A | 1555 | \ No newline at end of file diff --git a/docs/Models/Requests/Tag.md b/docs/Models/Requests/Tag.md index e5f42b9..99c8927 100644 --- a/docs/Models/Requests/Tag.md +++ b/docs/Models/Requests/Tag.md @@ -5,25 +5,24 @@ A key representing a specific tag within the section. ## Values -| Name | Value | -| ------------------ | ------------------ | -| `All` | all | -| `Unwatched` | unwatched | -| `Newest` | newest | -| `RecentlyAdded` | recentlyAdded | -| `RecentlyViewed` | recentlyViewed | -| `OnDeck` | onDeck | -| `Collection` | collection | -| `Edition` | edition | -| `Genre` | genre | -| `Year` | year | -| `Decade` | decade | -| `Director` | director | -| `Actor` | actor | -| `Country` | country | -| `ContentRating` | contentRating | -| `Rating` | rating | -| `Resolution` | resolution | -| `FirstCharacter` | firstCharacter | -| `Folder` | folder | -| `SearchTypeEqual1` | search?type=1 | \ No newline at end of file +| Name | Value | +| ---------------- | ---------------- | +| `All` | all | +| `Unwatched` | unwatched | +| `Newest` | newest | +| `RecentlyAdded` | recentlyAdded | +| `RecentlyViewed` | recentlyViewed | +| `OnDeck` | onDeck | +| `Collection` | collection | +| `Edition` | edition | +| `Genre` | genre | +| `Year` | year | +| `Decade` | decade | +| `Director` | director | +| `Actor` | actor | +| `Country` | country | +| `ContentRating` | contentRating | +| `Rating` | rating | +| `Resolution` | resolution | +| `FirstCharacter` | firstCharacter | +| `Folder` | folder | \ No newline at end of file diff --git a/docs/Models/Requests/Type.md b/docs/Models/Requests/Type.md index 0276e44..19bb07c 100644 --- a/docs/Models/Requests/Type.md +++ b/docs/Models/Requests/Type.md @@ -1,12 +1,13 @@ # Type -type of playlist to create +Plex content type to search for ## Values | Name | Value | | ------- | ------- | -| `Audio` | audio | -| `Video` | video | -| `Photo` | photo | \ No newline at end of file +| `One` | 1 | +| `Two` | 2 | +| `Three` | 3 | +| `Four` | 4 | \ No newline at end of file diff --git a/docs/sdks/activities/README.md b/docs/sdks/activities/README.md index 60c791e..1a767e9 100644 --- a/docs/sdks/activities/README.md +++ b/docs/sdks/activities/README.md @@ -27,8 +27,7 @@ Get Server Activities using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -54,12 +53,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Activities.CancelServerActivitiesAsync(ActivityUUID: "string"); +var res = await sdk.Activities.CancelServerActivitiesAsync(activityUUID: ""); // handle response ``` diff --git a/docs/sdks/butler/README.md b/docs/sdks/butler/README.md index 6002ff7..ff41cb3 100644 --- a/docs/sdks/butler/README.md +++ b/docs/sdks/butler/README.md @@ -24,8 +24,7 @@ Returns a list of butler tasks using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -55,8 +54,7 @@ This endpoint will attempt to start all Butler tasks that are enabled in the set using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -82,8 +80,7 @@ This endpoint will stop all currently running tasks and remove any scheduled tas using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -114,12 +111,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Butler.StartTaskAsync(TaskName: TaskName.CleanOldBundles); +var res = await sdk.Butler.StartTaskAsync(taskName: TaskName.CleanOldBundles); // handle response ``` @@ -148,12 +144,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Butler.StopTaskAsync(TaskName: PathParamTaskName.BackupDatabase); +var res = await sdk.Butler.StopTaskAsync(taskName: PathParamTaskName.BackupDatabase); // handle response ``` diff --git a/docs/sdks/hubs/README.md b/docs/sdks/hubs/README.md index 4d5e572..d9f7500 100644 --- a/docs/sdks/hubs/README.md +++ b/docs/sdks/hubs/README.md @@ -22,12 +22,13 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Hubs.GetGlobalHubsAsync(Count: 1262.49D, OnlyTransient: OnlyTransient.One); +var res = await sdk.Hubs.GetGlobalHubsAsync( + count: 1262.49D, + onlyTransient: OnlyTransient.One); // handle response ``` @@ -57,12 +58,14 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Hubs.GetLibraryHubsAsync(SectionId: 6728.76D, Count: 9010.22D, OnlyTransient: QueryParamOnlyTransient.Zero); +var res = await sdk.Hubs.GetLibraryHubsAsync( + sectionId: 6728.76D, + count: 9010.22D, + onlyTransient: QueryParamOnlyTransient.Zero); // handle response ``` diff --git a/docs/sdks/library/README.md b/docs/sdks/library/README.md index 03a5ced..6145a8b 100644 --- a/docs/sdks/library/README.md +++ b/docs/sdks/library/README.md @@ -15,6 +15,7 @@ API Calls interacting with Plex Media Server Libraries * [DeleteLibrary](#deletelibrary) - Delete Library Section * [GetLibraryItems](#getlibraryitems) - Get Library Items * [RefreshLibrary](#refreshlibrary) - Refresh Library +* [SearchLibrary](#searchlibrary) - Search Library * [GetMetadata](#getmetadata) - Get Items Metadata * [GetMetadataChildren](#getmetadatachildren) - Get Items Children * [GetOnDeck](#getondeck) - Get On Deck @@ -30,12 +31,13 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Library.GetFileHashAsync(Url: "file://C:\Image.png&type=13", Type: 4462.17D); +var res = await sdk.Library.GetFileHashAsync( + url: "file://C:\Image.png&type=13", + type: 4462.17D); // handle response ``` @@ -64,8 +66,7 @@ This endpoint will return the recently added content. using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -96,8 +97,7 @@ This allows a client to provide a rich interface around the media (e.g. allow so using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -162,12 +162,13 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Library.GetLibraryAsync(SectionId: 1000D, IncludeDetails: IncludeDetails.Zero); +var res = await sdk.Library.GetLibraryAsync( + sectionId: 1000D, + includeDetails: IncludeDetails.Zero); // handle response ``` @@ -196,12 +197,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Library.DeleteLibraryAsync(SectionId: 1000D); +var res = await sdk.Library.DeleteLibraryAsync(sectionId: 1000D); // handle response ``` @@ -240,7 +240,6 @@ Fetches details from a specific section of the library identified by a section k - `resolution`: Items categorized by resolution. - `firstCharacter`: Items categorized by the first letter. - `folder`: Items categorized by folder. -- `search?type=1`: Search functionality within the section. ### Example Usage @@ -250,12 +249,13 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Library.GetLibraryItemsAsync(SectionId: 451092, Tag: Tag.Unwatched); +var res = await sdk.Library.GetLibraryItemsAsync( + sectionId: 451092, + tag: Tag.Unwatched); // handle response ``` @@ -285,12 +285,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Library.RefreshLibraryAsync(SectionId: 934.16D); +var res = await sdk.Library.RefreshLibraryAsync(sectionId: 934.16D); // handle response ``` @@ -307,6 +306,59 @@ var res = await sdk.Library.RefreshLibraryAsync(SectionId: 934.16D); **[RefreshLibraryResponse](../../Models/Requests/RefreshLibraryResponse.md)** +## SearchLibrary + +Search for content within a specific section of the library. + +### Types +Each type in the library comes with a set of filters and sorts, aiding in building dynamic media controls: + +- **Type Object Attributes**: + - `type`: Metadata type (if standard Plex type). + - `title`: Title for this content type (e.g., "Movies"). + +- **Filter Objects**: + - Subset of the media query language. + - Attributes include `filter` (name), `filterType` (data type), `key` (endpoint for value range), and `title`. + +- **Sort Objects**: + - Description of sort fields. + - Attributes include `defaultDirection` (asc/desc), `descKey` and `key` (sort parameters), and `title`. + +> **Note**: Filters and sorts are optional; without them, no filtering controls are rendered. + + +### Example Usage + +```csharp +using PlexAPI; +using PlexAPI.Models.Components; +using PlexAPI.Models.Requests; + +var sdk = new PlexAPISDK(security: new Models.Components.Security() { + AccessToken = "", + }); + +var res = await sdk.Library.SearchLibraryAsync( + sectionId: 933505, + type: Type.Four); + +// handle response +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | +| `SectionId` | *long* | :heavy_check_mark: | the Id of the library to query | +| `Type` | [Type](../../Models/Requests/Type.md) | :heavy_check_mark: | Plex content type to search for | + + +### Response + +**[SearchLibraryResponse](../../Models/Requests/SearchLibraryResponse.md)** + + ## GetMetadata This endpoint will return the metadata of a library item specified with the ratingKey. @@ -319,12 +371,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Library.GetMetadataAsync(RatingKey: 8382.31D); +var res = await sdk.Library.GetMetadataAsync(ratingKey: 8382.31D); // handle response ``` @@ -353,12 +404,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Library.GetMetadataChildrenAsync(RatingKey: 1539.14D); +var res = await sdk.Library.GetMetadataChildrenAsync(ratingKey: 1539.14D); // handle response ``` @@ -386,8 +436,7 @@ This endpoint will return the on deck content. using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); diff --git a/docs/sdks/log/README.md b/docs/sdks/log/README.md index 122ac71..e633b5a 100644 --- a/docs/sdks/log/README.md +++ b/docs/sdks/log/README.md @@ -24,12 +24,14 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Log.LogLineAsync(Level: Level.Three, Message: "Test log message", Source: "Postman"); +var res = await sdk.Log.LogLineAsync( + level: Level.Three, + message: "Test log message", + source: "Postman"); // handle response ``` @@ -79,8 +81,7 @@ Ensure each parameter is properly URL-encoded to avoid interpretation issues. using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -116,8 +117,7 @@ This endpoint will enable all Plex Media Serverlogs to be sent to the Papertrail using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); diff --git a/docs/sdks/media/README.md b/docs/sdks/media/README.md index 74602a2..bf8af02 100644 --- a/docs/sdks/media/README.md +++ b/docs/sdks/media/README.md @@ -23,12 +23,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Media.MarkPlayedAsync(Key: 59398D); +var res = await sdk.Media.MarkPlayedAsync(key: 59398D); // handle response ``` @@ -56,12 +55,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Media.MarkUnplayedAsync(Key: 59398D); +var res = await sdk.Media.MarkUnplayedAsync(key: 59398D); // handle response ``` @@ -90,12 +88,14 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Media.UpdatePlayProgressAsync(Key: "string", Time: 6900.91D, State: "string"); +var res = await sdk.Media.UpdatePlayProgressAsync( + key: "", + time: 6900.91D, + state: ""); // handle response ``` diff --git a/docs/sdks/playlists/README.md b/docs/sdks/playlists/README.md index 44745ae..9f4967d 100644 --- a/docs/sdks/playlists/README.md +++ b/docs/sdks/playlists/README.md @@ -35,14 +35,13 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); CreatePlaylistRequest req = new CreatePlaylistRequest() { - Title = "string", - Type = Type.Photo, + Title = "", + Type = QueryParamType.Photo, Smart = Smart.One, Uri = "https://inborn-brochure.biz", }; @@ -75,12 +74,13 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Playlists.GetPlaylistsAsync(PlaylistType: PlaylistType.Audio, Smart: QueryParamSmart.Zero); +var res = await sdk.Playlists.GetPlaylistsAsync( + playlistType: PlaylistType.Audio, + smart: QueryParamSmart.Zero); // handle response ``` @@ -111,12 +111,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Playlists.GetPlaylistAsync(PlaylistID: 4109.48D); +var res = await sdk.Playlists.GetPlaylistAsync(playlistID: 4109.48D); // handle response ``` @@ -145,12 +144,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Playlists.DeletePlaylistAsync(PlaylistID: 216.22D); +var res = await sdk.Playlists.DeletePlaylistAsync(playlistID: 216.22D); // handle response ``` @@ -179,12 +177,14 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Playlists.UpdatePlaylistAsync(PlaylistID: 3915D, Title: "string", Summary: "string"); +var res = await sdk.Playlists.UpdatePlaylistAsync( + playlistID: 3915D, + title: "", + summary: ""); // handle response ``` @@ -218,12 +218,13 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Playlists.GetPlaylistContentsAsync(PlaylistID: 5004.46D, Type: 9403.59D); +var res = await sdk.Playlists.GetPlaylistContentsAsync( + playlistID: 5004.46D, + type: 9403.59D); // handle response ``` @@ -253,12 +254,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Playlists.ClearPlaylistContentsAsync(PlaylistID: 1893.18D); +var res = await sdk.Playlists.ClearPlaylistContentsAsync(playlistID: 1893.18D); // handle response ``` @@ -288,12 +288,14 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Playlists.AddPlaylistContentsAsync(PlaylistID: 8502.01D, Uri: "server://12345/com.plexapp.plugins.library/library/metadata/1", PlayQueueID: 123D); +var res = await sdk.Playlists.AddPlaylistContentsAsync( + playlistID: 8502.01D, + uri: "server://12345/com.plexapp.plugins.library/library/metadata/1", + playQueueID: 123D); // handle response ``` @@ -324,12 +326,13 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Playlists.UploadPlaylistAsync(Path: "/home/barkley/playlist.m3u", Force: Force.Zero); +var res = await sdk.Playlists.UploadPlaylistAsync( + path: "/home/barkley/playlist.m3u", + force: Force.Zero); // handle response ``` diff --git a/docs/sdks/plex/README.md b/docs/sdks/plex/README.md new file mode 100644 index 0000000..2971e4f --- /dev/null +++ b/docs/sdks/plex/README.md @@ -0,0 +1,84 @@ +# Plex +(*Plex*) + +## Overview + +API Calls that perform operations directly against https://Plex.tv + + +### Available Operations + +* [GetPin](#getpin) - Get a Pin +* [GetToken](#gettoken) - Get Access Token + +## GetPin + +Retrieve a Pin from Plex.tv for authentication flows + +### Example Usage + +```csharp +using PlexAPI; +using PlexAPI.Models.Components; +using PlexAPI.Models.Requests; + +var sdk = new PlexAPISDK(security: new Models.Components.Security() { + AccessToken = "", + }); + +var res = await sdk.Plex.GetPinAsync( + xPlexClientIdentifier: "", + strong: false); + +// handle response +``` + +### Parameters + +| Parameter | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `XPlexClientIdentifier` | *string* | :heavy_check_mark: | The unique identifier for the client application
This is used to track the client application and its usage
(UUID, serial number, or other number unique per device)
| +| `Strong` | *bool* | :heavy_minus_sign: | Determines the kind of code returned by the API call
Strong codes are used for Pin authentication flows
Non-Strong codes are used for `Plex.tv/link`
| +| `serverURL` | *string* | :heavy_minus_sign: | An optional server URL to use. | + + +### Response + +**[GetPinResponse](../../Models/Requests/GetPinResponse.md)** + + +## GetToken + +Retrieve an Access Token from Plex.tv after the Pin has already been authenticated + +### Example Usage + +```csharp +using PlexAPI; +using PlexAPI.Models.Components; +using PlexAPI.Models.Requests; + +var sdk = new PlexAPISDK(security: new Models.Components.Security() { + AccessToken = "", + }); + +var res = await sdk.Plex.GetTokenAsync( + pinID: "", + xPlexClientIdentifier: ""); + +// handle response +``` + +### Parameters + +| Parameter | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PinID` | *string* | :heavy_check_mark: | The PinID to retrieve an access token for | +| `XPlexClientIdentifier` | *string* | :heavy_check_mark: | The unique identifier for the client application
This is used to track the client application and its usage
(UUID, serial number, or other number unique per device)
| +| `serverURL` | *string* | :heavy_minus_sign: | An optional server URL to use. | + + +### Response + +**[GetTokenResponse](../../Models/Requests/GetTokenResponse.md)** + diff --git a/docs/sdks/search/README.md b/docs/sdks/search/README.md index 02a1eb6..812983c 100644 --- a/docs/sdks/search/README.md +++ b/docs/sdks/search/README.md @@ -35,12 +35,14 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Search.PerformSearchAsync(Query: "dylan", SectionId: 1516.53D, Limit: 5D); +var res = await sdk.Search.PerformSearchAsync( + query: "dylan", + sectionId: 1516.53D, + limit: 5D); // handle response ``` @@ -74,12 +76,14 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Search.PerformVoiceSearchAsync(Query: "dead+poop", SectionId: 4094.8D, Limit: 5D); +var res = await sdk.Search.PerformVoiceSearchAsync( + query: "dead+poop", + sectionId: 4094.8D, + limit: 5D); // handle response ``` @@ -109,12 +113,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Search.GetSearchResultsAsync(Query: "110"); +var res = await sdk.Search.GetSearchResultsAsync(query: "110"); // handle response ``` diff --git a/docs/sdks/security/README.md b/docs/sdks/security/README.md index 5047c3f..a5d1675 100644 --- a/docs/sdks/security/README.md +++ b/docs/sdks/security/README.md @@ -23,22 +23,23 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Security.GetTransientTokenAsync(Type: QueryParamType.Delegation, Scope: Scope.All); +var res = await sdk.Security.GetTransientTokenAsync( + type: GetTransientTokenQueryParamType.Delegation, + scope: Scope.All); // handle response ``` ### Parameters -| Parameter | Type | Required | Description | -| ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | -| `Type` | [QueryParamType](../../Models/Requests/QueryParamType.md) | :heavy_check_mark: | `delegation` - This is the only supported `type` parameter. | -| `Scope` | [Scope](../../Models/Requests/Scope.md) | :heavy_check_mark: | `all` - This is the only supported `scope` parameter. | +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | +| `Type` | [GetTransientTokenQueryParamType](../../Models/Requests/GetTransientTokenQueryParamType.md) | :heavy_check_mark: | `delegation` - This is the only supported `type` parameter. | +| `Scope` | [Scope](../../Models/Requests/Scope.md) | :heavy_check_mark: | `all` - This is the only supported `scope` parameter. | ### Response @@ -59,12 +60,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Security.GetSourceConnectionInformationAsync(Source: "server://client-identifier"); +var res = await sdk.Security.GetSourceConnectionInformationAsync(source: "server://client-identifier"); // handle response ``` diff --git a/docs/sdks/server/README.md b/docs/sdks/server/README.md index c1908ee..fcdc241 100644 --- a/docs/sdks/server/README.md +++ b/docs/sdks/server/README.md @@ -27,8 +27,7 @@ Server Capabilities using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -53,8 +52,7 @@ Get Server Preferences using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -79,8 +77,7 @@ Get Available Clients using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -105,8 +102,7 @@ Get Devices using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -131,8 +127,7 @@ Get Server Identity using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -157,8 +152,7 @@ Returns MyPlex Account Information using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -185,8 +179,7 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -227,8 +220,7 @@ Get Server List using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); diff --git a/docs/sdks/sessions/README.md b/docs/sdks/sessions/README.md index 7852505..72b9c5c 100644 --- a/docs/sdks/sessions/README.md +++ b/docs/sdks/sessions/README.md @@ -23,8 +23,7 @@ This will retrieve the "Now Playing" Information of the PMS. using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -49,8 +48,7 @@ This will Retrieve a listing of all history views. using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -75,8 +73,7 @@ Get Transcode Sessions using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -102,12 +99,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Sessions.StopTranscodeSessionAsync(SessionKey: "zz7llzqlx8w9vnrsbnwhbmep"); +var res = await sdk.Sessions.StopTranscodeSessionAsync(sessionKey: "zz7llzqlx8w9vnrsbnwhbmep"); // handle response ``` diff --git a/docs/sdks/statistics/README.md b/docs/sdks/statistics/README.md new file mode 100644 index 0000000..812a3e9 --- /dev/null +++ b/docs/sdks/statistics/README.md @@ -0,0 +1,43 @@ +# Statistics +(*Statistics*) + +## Overview + +API Calls that perform operations with Plex Media Server Statistics + + +### Available Operations + +* [GetStatistics](#getstatistics) - Get Media Statistics + +## GetStatistics + +This will return the media statistics for the server + +### Example Usage + +```csharp +using PlexAPI; +using PlexAPI.Models.Components; +using PlexAPI.Models.Requests; + +var sdk = new PlexAPISDK(security: new Models.Components.Security() { + AccessToken = "", + }); + +var res = await sdk.Statistics.GetStatisticsAsync(timespan: 411769); + +// handle response +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| `Timespan` | *long* | :heavy_minus_sign: | The timespan to retrieve statistics for
the exact meaning of this parameter is not known
| + + +### Response + +**[GetStatisticsResponse](../../Models/Requests/GetStatisticsResponse.md)** + diff --git a/docs/sdks/updater/README.md b/docs/sdks/updater/README.md index c07d360..a59247c 100644 --- a/docs/sdks/updater/README.md +++ b/docs/sdks/updater/README.md @@ -23,8 +23,7 @@ Querying status of updates using PlexAPI; using PlexAPI.Models.Components; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -50,12 +49,11 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Updater.CheckForUpdatesAsync(Download: Download.One); +var res = await sdk.Updater.CheckForUpdatesAsync(download: Download.One); // handle response ``` @@ -84,12 +82,13 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); -var res = await sdk.Updater.ApplyUpdatesAsync(Tonight: Tonight.One, Skip: Skip.Zero); +var res = await sdk.Updater.ApplyUpdatesAsync( + tonight: Tonight.One, + skip: Skip.Zero); // handle response ``` diff --git a/docs/sdks/video/README.md b/docs/sdks/video/README.md index ee982be..909b318 100644 --- a/docs/sdks/video/README.md +++ b/docs/sdks/video/README.md @@ -8,49 +8,8 @@ API Calls that perform operations with Plex Media Server Videos ### Available Operations -* [StartUniversalTranscode](#startuniversaltranscode) - Start Universal Transcode * [GetTimeline](#gettimeline) - Get the timeline for a media item - -## StartUniversalTranscode - -Begin a Universal Transcode Session - -### Example Usage - -```csharp -using PlexAPI; -using PlexAPI.Models.Components; -using PlexAPI.Models.Requests; - -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { - AccessToken = "", - }); - -StartUniversalTranscodeRequest req = new StartUniversalTranscodeRequest() { - HasMDE = 8924.99D, - Path = "/etc/mail", - MediaIndex = 9962.95D, - PartIndex = 1232.82D, - Protocol = "string", -}; - -var res = await sdk.Video.StartUniversalTranscodeAsync(req); - -// handle response -``` - -### Parameters - -| Parameter | Type | Required | Description | -| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | -| `request` | [StartUniversalTranscodeRequest](../../Models/Requests/StartUniversalTranscodeRequest.md) | :heavy_check_mark: | The request object to use for the request. | - - -### Response - -**[StartUniversalTranscodeResponse](../../Models/Requests/StartUniversalTranscodeResponse.md)** - +* [StartUniversalTranscode](#startuniversaltranscode) - Start Universal Transcode ## GetTimeline @@ -63,8 +22,7 @@ using PlexAPI; using PlexAPI.Models.Components; using PlexAPI.Models.Requests; -var sdk = new PlexAPISDK( - security: new Models.Components.Security() { +var sdk = new PlexAPISDK(security: new Models.Components.Security() { AccessToken = "", }); @@ -75,7 +33,7 @@ GetTimelineRequest req = new GetTimelineRequest() { HasMDE = 7574.33D, Time = 3327.51D, Duration = 7585.39D, - Context = "string", + Context = "", PlayQueueItemID = 1406.21D, PlayBackTime = 2699.34D, Row = 3536.42D, @@ -97,3 +55,43 @@ var res = await sdk.Video.GetTimelineAsync(req); **[GetTimelineResponse](../../Models/Requests/GetTimelineResponse.md)** + +## StartUniversalTranscode + +Begin a Universal Transcode Session + +### Example Usage + +```csharp +using PlexAPI; +using PlexAPI.Models.Components; +using PlexAPI.Models.Requests; + +var sdk = new PlexAPISDK(security: new Models.Components.Security() { + AccessToken = "", + }); + +StartUniversalTranscodeRequest req = new StartUniversalTranscodeRequest() { + HasMDE = 8924.99D, + Path = "/etc/mail", + MediaIndex = 9962.95D, + PartIndex = 1232.82D, + Protocol = "", +}; + +var res = await sdk.Video.StartUniversalTranscodeAsync(req); + +// handle response +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| `request` | [StartUniversalTranscodeRequest](../../Models/Requests/StartUniversalTranscodeRequest.md) | :heavy_check_mark: | The request object to use for the request. | + + +### Response + +**[StartUniversalTranscodeResponse](../../Models/Requests/StartUniversalTranscodeResponse.md)** + diff --git a/gen.yaml b/gen.yaml index d7a268c..7ce490d 100644 --- a/gen.yaml +++ b/gen.yaml @@ -7,10 +7,13 @@ generation: useClassNamesForArrayFields: true fixes: nameResolutionDec2023: false + parameterOrderingFeb2024: false + requestResponseComponentNamesFeb2024: false csharp: - version: 0.1.5 + version: 0.2.0 author: LukeHagar dotnetVersion: net5.0 + flattenGlobalSecurity: false imports: option: openapi paths: diff --git a/global.json b/global.json new file mode 100644 index 0000000..93a30d0 --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "5.0.0", + "rollForward": "latestMinor" + } +}