Skip to content

Commit cb0755d

Browse files
committed
reorganized solution / projects
1 parent 0037655 commit cb0755d

39 files changed

+385
-317
lines changed

Plex.Api.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{
5454
.github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml
5555
EndProjectSection
5656
EndProject
57+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Plex.Library", "Source\Plex.Library\Plex.Library.csproj", "{44A3EA80-8396-4E7A-9530-1C8AD272E801}"
58+
EndProject
5759
Global
5860
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5961
Debug|Any CPU = Debug|Any CPU
@@ -68,6 +70,10 @@ Global
6870
{528E66EB-2232-4534-A20D-9BC8A240BF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
6971
{528E66EB-2232-4534-A20D-9BC8A240BF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
7072
{528E66EB-2232-4534-A20D-9BC8A240BF2F}.Release|Any CPU.Build.0 = Release|Any CPU
73+
{44A3EA80-8396-4E7A-9530-1C8AD272E801}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
74+
{44A3EA80-8396-4E7A-9530-1C8AD272E801}.Debug|Any CPU.Build.0 = Debug|Any CPU
75+
{44A3EA80-8396-4E7A-9530-1C8AD272E801}.Release|Any CPU.ActiveCfg = Release|Any CPU
76+
{44A3EA80-8396-4E7A-9530-1C8AD272E801}.Release|Any CPU.Build.0 = Release|Any CPU
7177
EndGlobalSection
7278
GlobalSection(SolutionProperties) = preSolution
7379
HideSolutionNode = FALSE
@@ -79,6 +85,7 @@ Global
7985
{528E66EB-2232-4534-A20D-9BC8A240BF2F} = {E1B24F25-B8A4-46EE-B7EB-7803DCFC543F}
8086
{EFE1E5ED-D337-4874-82EC-D9FA0BC7D3AB} = {F20E2797-D1E3-4321-91BB-FAE54954D2A0}
8187
{841C67EF-BBB2-4730-8E29-22FF3FD54306} = {EFE1E5ED-D337-4874-82EC-D9FA0BC7D3AB}
88+
{44A3EA80-8396-4E7A-9530-1C8AD272E801} = {719809C2-A551-4C4A-9EFD-B10FB5E35BC0}
8289
EndGlobalSection
8390
GlobalSection(ExtensibilityGlobals) = postSolution
8491
SolutionGuid = {73F36209-F8D6-4066-8951-D97729F773CF}

Source/Plex.Api/Api/ApiRequestBuilder.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ namespace Plex.Api.Api
44
using System.Collections.Generic;
55
using System.Linq;
66
using System.Net.Http;
7-
using ApiModels.Libraries.Filters;
7+
using PlexModels.Library;
8+
using PlexModels.Library.Search;
89

910
/// <summary>
1011
/// Api Request Builder.
@@ -129,10 +130,10 @@ public ApiRequestBuilder AddFilterFields(List<FilterRequest> filters)
129130
switch (item.Operator)
130131
{
131132
case Operator.Is:
132-
queryParameters.Add(item.Field, string.Join(",", item.Values));
133+
queryParameters.Add(item.Field+"%3d", string.Join(",", item.Values));
133134
break;
134135
case Operator.IsNot:
135-
queryParameters.Add(item.Field+"!", string.Join(",", item.Values));
136+
queryParameters.Add(item.Field+"!%3d", string.Join(",", item.Values));
136137
break;
137138
case Operator.GreaterThan:
138139
queryParameters.Add(item.Field+">>", string.Join(",", item.Values));

Source/Plex.Api/Clients/Interfaces/IPlexLibraryClient.cs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
namespace Plex.Api.Clients.Interfaces
22
{
33
using System.Collections.Generic;
4-
using System.Runtime.CompilerServices;
54
using System.Threading.Tasks;
6-
using ApiModels.Libraries;
7-
using ApiModels.Libraries.Filters;
85
using Enums;
96
using PlexModels.Folders;
107
using PlexModels.Hubs;
@@ -92,7 +89,8 @@ public interface IPlexLibraryClient
9289
/// <param name="start">Starting record (default 0)</param>
9390
/// <param name="count">Only return the specified number of results (default 100).</param>
9491
/// <returns>MediaContainer</returns>
95-
Task<MediaContainer> LibrarySearch(string authToken, string plexServerHost, string title, string libraryKey, string sort, SearchType libraryType, List<FilterRequest> filters = null, int start = 0, int count = 100);
92+
Task<MediaContainer> LibrarySearch(string authToken, string plexServerHost, string title, string libraryKey,
93+
string sort, SearchType libraryType, List<FilterRequest> filters = null, int start = 0, int count = 100);
9694

9795
/// <summary>
9896
/// Get Item from Library
@@ -101,7 +99,7 @@ public interface IPlexLibraryClient
10199
/// <param name="plexServerHost">Full Uri of Plex Media Server Instance.</param>
102100
/// <param name="key">Library Key</param>
103101
/// <returns></returns>
104-
Task<MediaContainer> GetItem(string authToken, string plexServerHost, string key);
102+
Task<MediaContainer> GetItem(string authToken, string plexServerHost, string key);
105103

106104

107105
/// <summary>
@@ -129,7 +127,8 @@ public interface IPlexLibraryClient
129127
/// <param name="plexServerHost">Full Uri of Plex Media Server Instance.</param>
130128
/// <param name="key">Library Key</param>
131129
/// <param name="filterUri">Field Type value (genre, collection, title, etc..)</param>
132-
Task<FilterValueContainer> GetLibraryFilterValues(string authToken, string plexServerHost, string key, string filterUri);
130+
Task<FilterValueContainer> GetLibraryFilterValues(string authToken, string plexServerHost, string key,
131+
string filterUri);
133132

134133
/// <summary>
135134
/// Get Filters for this Library
@@ -147,7 +146,8 @@ public interface IPlexLibraryClient
147146
/// <param name="libraryKey">Library Key.</param>
148147
/// <param name="title">Title of Collection (optional)</param>
149148
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
150-
Task<CollectionContainer> GetCollectionsAsync(string authToken, string plexServerHost, string libraryKey, string title);
149+
Task<CollectionContainer> GetCollectionsAsync(string authToken, string plexServerHost, string libraryKey,
150+
string title);
151151

152152
/// <summary>
153153
/// Get a Single Plex Collection.
@@ -167,7 +167,8 @@ public interface IPlexLibraryClient
167167
/// <param name="ratingKey">Rating Key to add Collection to.</param>
168168
/// <param name="collectionName">Name of Collection.</param>
169169
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
170-
Task AddCollectionToLibraryItemAsync(string authToken, string plexServerHost, string libraryKey, string ratingKey, string collectionName);
170+
Task AddCollectionToLibraryItemAsync(string authToken, string plexServerHost, string libraryKey,
171+
string ratingKey, string collectionName);
171172

172173
/// <summary>
173174
/// Remove a Collection from a Movie.
@@ -178,7 +179,8 @@ public interface IPlexLibraryClient
178179
/// <param name="ratingKey">Rating Key to add Collection to.</param>
179180
/// <param name="collectionName">Name of Collection.</param>
180181
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
181-
Task DeleteCollectionFromLibraryItemAsync(string authToken, string plexServerHost, string libraryKey, string ratingKey, string collectionName);
182+
Task DeleteCollectionFromLibraryItemAsync(string authToken, string plexServerHost, string libraryKey,
183+
string ratingKey, string collectionName);
182184

183185
/// <summary>
184186
/// Update Collection.
@@ -188,7 +190,8 @@ public interface IPlexLibraryClient
188190
/// <param name="libraryKey">Plex Library Key.</param>
189191
/// <param name="collectionModel">Plex Collection Model for Updating.</param>
190192
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
191-
Task UpdateCollectionAsync(string authToken, string plexServerHost, string libraryKey, CollectionModel collectionModel);
193+
Task UpdateCollectionAsync(string authToken, string plexServerHost, string libraryKey,
194+
CollectionModel collectionModel);
192195

193196
/// <summary>
194197
/// Get All Items attached to a Collection by Collection Key
@@ -207,6 +210,17 @@ public interface IPlexLibraryClient
207210
/// <param name="libraryKey">Library Key</param>
208211
/// <param name="collectionName">Name of the Collection.</param>
209212
/// <returns>List of Items in the collection.</returns>
210-
Task<MediaContainer> GetCollectionItemsByCollectionName(string authToken, string plexServerHost, string libraryKey, string collectionName);
213+
Task<MediaContainer> GetCollectionItemsByCollectionName(string authToken, string plexServerHost,
214+
string libraryKey, string collectionName);
215+
216+
/// <summary>
217+
/// Get Collection Item Metadata by Collection Key
218+
/// </summary>
219+
/// <param name="authToken">Authentication Token.</param>
220+
/// <param name="plexServerHost">Full Uri of Plex Media Server Instance.</param>
221+
/// <param name="collectionKey">Collection Key.</param>
222+
/// <returns></returns>
223+
Task<MediaContainer> GetCollectionItemMetadataByKey(string authToken, string plexServerHost, string collectionKey);
224+
211225
}
212226
}

Source/Plex.Api/Clients/Interfaces/IPlexServerClient.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
namespace Plex.Api.Clients.Interfaces
22
{
33
using System;
4-
using System.Collections.Generic;
54
using System.Threading.Tasks;
6-
using ApiModels.Libraries;
75
using Enums;
86
using PlexModels.Hubs;
97
using PlexModels.Library;

Source/Plex.Api/Clients/PlexLibraryClient.cs

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ namespace Plex.Api.Clients
66
using System.Net.Http;
77
using System.Threading.Tasks;
88
using Api;
9-
using ApiModels.Libraries;
10-
using ApiModels.Libraries.Filters;
11-
using Automapper;
129
using Enums;
1310
using Interfaces;
1411
using PlexModels;
@@ -111,10 +108,7 @@ public async Task<MediaContainer> LibrarySearch(string authToken, string plexSer
111108
string libraryKey, string sort, SearchType libraryType, List<FilterRequest> filters = null, int start = 0,
112109
int count = 100)
113110
{
114-
var queryParams = new Dictionary<string, string>
115-
{
116-
{"type", ((int)libraryType).ToString()}
117-
};
111+
var queryParams = new Dictionary<string, string> {{"type", ((int)libraryType).ToString()}};
118112

119113
if (!string.IsNullOrEmpty(title))
120114
{
@@ -179,12 +173,10 @@ await this.FetchWithWrapper<FolderContainer>(plexServerHost, $"library/sections/
179173

180174
/// <inheritdoc/>
181175
public async Task<FilterValueContainer> GetLibraryFilterValues(string authToken, string plexServerHost,
182-
string key, string filterUri)
183-
{
184-
return await this.FetchWithWrapper<FilterValueContainer>(plexServerHost,
176+
string key, string filterUri) =>
177+
await this.FetchWithWrapper<FilterValueContainer>(plexServerHost,
185178
filterUri, authToken,
186179
HttpMethod.Get);
187-
}
188180

189181
/// <inheritdoc/>
190182
public async Task<FilterContainer>
@@ -193,15 +185,20 @@ await this.FetchWithWrapper<FilterContainer>(plexServerHost, $"library/sections/
193185
authToken,
194186
HttpMethod.Get);
195187

196-
/// <inheritdoc/>
197-
public async Task<CollectionContainer> GetCollectionsAsync(string authToken, string plexServerHost, string libraryKey, string title)
188+
/// <inheritdoc/>
189+
public async Task<CollectionContainer> GetCollectionsAsync(string authToken, string plexServerHost,
190+
string libraryKey, string title)
198191
{
199192
var queryParams =
200-
new Dictionary<string, string> {{"includeCollections", "1"}, {"includeExternalMedia", "true"}};
193+
new Dictionary<string, string> {
194+
{"includeCollections", "1"},
195+
{"includeExternalMedia", "true"}
196+
197+
};
201198

202199
if (!string.IsNullOrEmpty(title))
203200
{
204-
queryParams.Add("title", title);
201+
queryParams.Add("title" + "%3d", title);
205202
}
206203

207204
var apiRequest = new ApiRequestBuilder(plexServerHost, $"library/sections/{libraryKey}/collections",
@@ -218,7 +215,8 @@ public async Task<CollectionContainer> GetCollectionsAsync(string authToken, str
218215
}
219216

220217
/// <inheritdoc/>
221-
public async Task UpdateCollectionAsync(string authToken, string plexServerHost, string libraryKey, CollectionModel collectionModel)
218+
public async Task UpdateCollectionAsync(string authToken, string plexServerHost, string libraryKey,
219+
CollectionModel collectionModel)
222220
{
223221
if (authToken == null)
224222
{
@@ -264,26 +262,30 @@ public async Task UpdateCollectionAsync(string authToken, string plexServerHost,
264262
}
265263

266264
/// <inheritdoc/>
267-
public async Task<CollectionContainer> GetCollectionAsync(string authToken, string plexServerHost, string collectionKey)
265+
public async Task<CollectionContainer> GetCollectionAsync(string authToken, string plexServerHost,
266+
string collectionKey)
268267
{
269268
var queryParams =
270269
new Dictionary<string, string> {{"includeCollections", "1"}, {"includeExternalMedia", "true"}};
271270

272-
var apiRequest = new ApiRequestBuilder(plexServerHost, "library/collections/" + collectionKey, HttpMethod.Get)
273-
.AddPlexToken(authToken)
274-
.AddQueryParams(queryParams)
275-
.AddRequestHeaders(ClientUtilities.GetClientIdentifierHeader(this.clientOptions.ClientId))
276-
.AcceptJson()
277-
.Build();
271+
var apiRequest =
272+
new ApiRequestBuilder(plexServerHost, "library/collections/" + collectionKey, HttpMethod.Get)
273+
.AddPlexToken(authToken)
274+
.AddQueryParams(queryParams)
275+
.AddRequestHeaders(ClientUtilities.GetClientIdentifierHeader(this.clientOptions.ClientId))
276+
.AcceptJson()
277+
.Build();
278278

279279
var wrapper = await this.apiService.InvokeApiAsync<GenericWrapper<CollectionContainer>>(apiRequest);
280280

281281
return wrapper.Container;
282282
}
283283

284284
/// <inheritdoc/>
285-
public async Task<MediaContainer> GetCollectionItemsAsync(string authToken, string plexServerHost, string collectionKey) =>
286-
await this.FetchWithWrapper<MediaContainer>(plexServerHost, "library/metadata/" + collectionKey + "/children",
285+
public async Task<MediaContainer> GetCollectionItemsAsync(string authToken, string plexServerHost,
286+
string collectionKey) =>
287+
await this.FetchWithWrapper<MediaContainer>(plexServerHost,
288+
"library/metadata/" + collectionKey + "/children",
287289
authToken, HttpMethod.Get);
288290

289291
/// <inheritdoc/>
@@ -306,11 +308,26 @@ public async Task<MediaContainer> GetCollectionItemsByCollectionName(string auth
306308
return null;
307309
}
308310

309-
return await this.GetCollectionItemsAsync(authToken, plexServerHost, collection.Collections.First().RatingKey);
311+
return await this.GetCollectionItemsAsync(authToken, plexServerHost,
312+
collection.Collections.First().RatingKey);
313+
}
314+
315+
public async Task<MediaContainer> GetCollectionItemMetadataByKey(string authToken, string plexServerHost, string collectionKey)
316+
{
317+
var apiRequest =
318+
new ApiRequestBuilder(plexServerHost, $"library/collections/{collectionKey}/children", HttpMethod.Get)
319+
.AddPlexToken(authToken)
320+
.AddRequestHeaders(ClientUtilities.GetClientIdentifierHeader(this.clientOptions.ClientId))
321+
.AcceptJson()
322+
.Build();
323+
324+
var wrapper = await this.apiService.InvokeApiAsync<GenericWrapper<MediaContainer>>(apiRequest);
325+
return wrapper.Container;
310326
}
311327

312328
/// <inheritdoc/>
313-
public async Task AddCollectionToLibraryItemAsync(string authToken, string plexServerHost, string libraryKey, string ratingKey, string collectionName)
329+
public async Task AddCollectionToLibraryItemAsync(string authToken, string plexServerHost, string libraryKey,
330+
string ratingKey, string collectionName)
314331
{
315332
var apiRequest =
316333
new ApiRequestBuilder(plexServerHost, "library/sections/" + libraryKey + "/all", HttpMethod.Put)
@@ -331,7 +348,8 @@ public async Task AddCollectionToLibraryItemAsync(string authToken, string plexS
331348
}
332349

333350
/// <inheritdoc/>
334-
public async Task DeleteCollectionFromLibraryItemAsync(string authToken, string plexServerHost, string libraryKey, string ratingKey, string collectionName)
351+
public async Task DeleteCollectionFromLibraryItemAsync(string authToken, string plexServerHost,
352+
string libraryKey, string ratingKey, string collectionName)
335353
{
336354
var apiRequest =
337355
new ApiRequestBuilder(plexServerHost, "library/sections/" + libraryKey + "/all", HttpMethod.Put)
@@ -351,7 +369,6 @@ public async Task DeleteCollectionFromLibraryItemAsync(string authToken, string
351369
await this.apiService.InvokeApiAsync(apiRequest);
352370
}
353371

354-
355372
/// <summary>
356373
///
357374
/// </summary>

Source/Plex.Api/Clients/PlexServerClient.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22
{
33
using System;
44
using System.Collections.Generic;
5-
using System.Linq;
65
using System.Net.Http;
76
using System.Threading.Tasks;
87
using Api;
9-
using ApiModels.Libraries;
10-
using Automapper;
118
using Enums;
129
using Interfaces;
1310
using PlexModels;
@@ -25,7 +22,6 @@
2522
using PlexModels.Server.Sessions;
2623
using PlexModels.Server.Statistics;
2724
using PlexModels.Server.Transcoders;
28-
using Metadata = PlexModels.Media.Metadata;
2925

3026
/// <inheritdoc/>
3127
public class PlexServerClient : IPlexServerClient

Source/Plex.Api/Plex.Api.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
</ItemGroup>
2929

3030
<ItemGroup>
31+
<Folder Include="Helpers\Mappings" />
3132
<Folder Include="PlexModels\Resources" />
3233
</ItemGroup>
3334

Source/Plex.Api/PlexModels/Account/PlexAccount.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ namespace Plex.Api.PlexModels.Account
33
using System.Collections.Generic;
44
using System.Text.Json.Serialization;
55

6-
public class PlexAccount {
6+
public class PlexAccount
7+
{
78
[JsonPropertyName("id")]
89
public int Id { get; set; }
910

Source/Plex.Api/ApiModels/Libraries/CollectionModel.cs renamed to Source/Plex.Api/PlexModels/Library/Collections/CollectionModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace Plex.Api.ApiModels.Libraries
1+
namespace Plex.Api.PlexModels.Library.Collections
22
{
33
/// <summary>
44
/// Collection Model

Source/Plex.Api/ApiModels/Libraries/Filters/Operator.cs renamed to Source/Plex.Api/PlexModels/Library/Operator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace Plex.Api.ApiModels.Libraries.Filters
1+
namespace Plex.Api.PlexModels.Library
22
{
33
public enum Operator
44
{

0 commit comments

Comments
 (0)