From 5bc708999061efc66761a41f6fc9212be91110b5 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 27 Feb 2016 00:52:00 +0100 Subject: [PATCH 1/5] Create new series backend implementation --- .../Library/FileOrganizationService.cs | 24 +++++++++++- .../EpisodeFileOrganizationRequest.cs | 37 +++++++++++++++++- .../FileOrganization/EpisodeFileOrganizer.cs | 38 ++++++++++++++++++- 3 files changed, 95 insertions(+), 4 deletions(-) diff --git a/MediaBrowser.Api/Library/FileOrganizationService.cs b/MediaBrowser.Api/Library/FileOrganizationService.cs index 1224fa9570..3e40bc5da2 100644 --- a/MediaBrowser.Api/Library/FileOrganizationService.cs +++ b/MediaBrowser.Api/Library/FileOrganizationService.cs @@ -54,7 +54,7 @@ namespace MediaBrowser.Api.Library public string Id { get; set; } } - [Route("/Library/FileOrganizations/{Id}/Episode/Organize", "POST", Summary = "Performs an organization")] + [Route("/Library/FileOrganizations/{Id}/Episode/Organize", "POST", Summary = "Performs organization of a tv episode")] public class OrganizeEpisode { [ApiMember(Name = "Id", Description = "Result Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] @@ -74,6 +74,18 @@ namespace MediaBrowser.Api.Library [ApiMember(Name = "RememberCorrection", Description = "Whether or not to apply the same correction to future episodes of the same series.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")] public bool RememberCorrection { get; set; } + + [ApiMember(Name = "NewSeriesProviderIds", Description = "A list of provider IDs identifying a new series.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] + public string NewSeriesProviderIds { get; set; } + + [ApiMember(Name = "NewSeriesName", Description = "Name of a series to add.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] + public string NewSeriesName { get; set; } + + [ApiMember(Name = "NewSeriesYear", Description = "Year of a series to add.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] + public string NewSeriesYear { get; set; } + + [ApiMember(Name = "TargetFolder", Description = "Target Folder", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] + public string TargetFolder { get; set; } } [Route("/Library/FileOrganizations/SmartMatches", "GET", Summary = "Gets smart match entries")] @@ -152,9 +164,17 @@ namespace MediaBrowser.Api.Library RememberCorrection = request.RememberCorrection, ResultId = request.Id, SeasonNumber = request.SeasonNumber, - SeriesId = request.SeriesId + SeriesId = request.SeriesId, + NewSeriesName = request.NewSeriesName, + NewSeriesYear = request.NewSeriesYear, + NewSeriesProviderIds = request.NewSeriesProviderIds, + TargetFolder = request.TargetFolder }); + // For async processing (close dialog early instead of waiting until the file has been copied) + //var tasks = new Task[] { task }; + //Task.WaitAll(tasks, 8000); + Task.WaitAll(task); } diff --git a/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs b/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs index 0b12ebc51d..6a3e6c30d8 100644 --- a/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs +++ b/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs @@ -1,4 +1,6 @@ -namespace MediaBrowser.Model.FileOrganization +using System.Collections.Generic; + +namespace MediaBrowser.Model.FileOrganization { public class EpisodeFileOrganizationRequest { @@ -13,5 +15,38 @@ public int? EndingEpisodeNumber { get; set; } public bool RememberCorrection { get; set; } + public string NewSeriesName { get; set; } + + public string NewSeriesYear { get; set; } + + public string NewSeriesProviderIds { get; set; } + + public string TargetFolder { get; set; } + + public Dictionary NewSeriesProviderIdsDictionary + { + get + { + var dic = new Dictionary(); + + if (!string.IsNullOrEmpty(NewSeriesProviderIds)) + { + var str = NewSeriesProviderIds.Replace("{", "").Replace("}", "").Replace("\"", ""); + + foreach (var item in str.Split(',')) + { + var itemArr = item.Split(':'); + if (itemArr.Length > 1) + { + var key = itemArr[0].Trim(); + var val = itemArr[1].Trim(); + dic.Add(key, val); + } + } + } + + return dic; + } + } } } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs index 42f88a5c0d..43eea47730 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs @@ -157,7 +157,43 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { var result = _organizationService.GetResult(request.ResultId); - var series = (Series)_libraryManager.GetItemById(new Guid(request.SeriesId)); + Series series = null; + + if (request.NewSeriesProviderIdsDictionary.Count > 0) + { + // We're having a new series here + SeriesInfo seriesRequest = new SeriesInfo(); + seriesRequest.ProviderIds = request.NewSeriesProviderIdsDictionary; + + var refreshOptions = new MetadataRefreshOptions(_fileSystem); + series = new Series(); + series.Id = Guid.NewGuid(); + series.Name = request.NewSeriesName; + + int year; + if (int.TryParse(request.NewSeriesYear, out year)) + { + series.ProductionYear = year; + } + + var seriesFolderName = series.Name; + if (series.ProductionYear.HasValue) + { + seriesFolderName = string.Format("{0} ({1})", seriesFolderName, series.ProductionYear); + } + + series.Path = Path.Combine(request.TargetFolder, seriesFolderName); + + series.ProviderIds = request.NewSeriesProviderIdsDictionary; + + await series.RefreshMetadata(refreshOptions, cancellationToken); + } + + if (series == null) + { + // Existing Series + series = (Series)_libraryManager.GetItemById(new Guid(request.SeriesId)); + } await OrganizeEpisode(result.OriginalPath, series, From 35fb164c1d594a59ed1360055885e471f44e995f Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 27 Feb 2016 04:18:47 +0100 Subject: [PATCH 2/5] Clean Up Model (EpisodeFileOrganizationRequest) --- .../Library/FileOrganizationService.cs | 20 ++++++++++++- .../EpisodeFileOrganizationRequest.cs | 28 +------------------ 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/MediaBrowser.Api/Library/FileOrganizationService.cs b/MediaBrowser.Api/Library/FileOrganizationService.cs index 3e40bc5da2..f636b723ed 100644 --- a/MediaBrowser.Api/Library/FileOrganizationService.cs +++ b/MediaBrowser.Api/Library/FileOrganizationService.cs @@ -157,6 +157,24 @@ namespace MediaBrowser.Api.Library public void Post(OrganizeEpisode request) { + var dicNewProviderIds = new Dictionary(); + + if (!string.IsNullOrEmpty(request.NewSeriesProviderIds)) + { + var str = request.NewSeriesProviderIds.Replace("{", "").Replace("}", "").Replace("\"", ""); + + foreach (var item in str.Split(',')) + { + var itemArr = item.Split(':'); + if (itemArr.Length > 1) + { + var key = itemArr[0].Trim(); + var val = itemArr[1].Trim(); + dicNewProviderIds.Add(key, val); + } + } + } + var task = _iFileOrganizationService.PerformEpisodeOrganization(new EpisodeFileOrganizationRequest { EndingEpisodeNumber = request.EndingEpisodeNumber, @@ -167,7 +185,7 @@ namespace MediaBrowser.Api.Library SeriesId = request.SeriesId, NewSeriesName = request.NewSeriesName, NewSeriesYear = request.NewSeriesYear, - NewSeriesProviderIds = request.NewSeriesProviderIds, + NewSeriesProviderIdsDictionary = dicNewProviderIds, TargetFolder = request.TargetFolder }); diff --git a/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs b/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs index 6a3e6c30d8..307088b632 100644 --- a/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs +++ b/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs @@ -19,34 +19,8 @@ namespace MediaBrowser.Model.FileOrganization public string NewSeriesYear { get; set; } - public string NewSeriesProviderIds { get; set; } - public string TargetFolder { get; set; } - public Dictionary NewSeriesProviderIdsDictionary - { - get - { - var dic = new Dictionary(); - - if (!string.IsNullOrEmpty(NewSeriesProviderIds)) - { - var str = NewSeriesProviderIds.Replace("{", "").Replace("}", "").Replace("\"", ""); - - foreach (var item in str.Split(',')) - { - var itemArr = item.Split(':'); - if (itemArr.Length > 1) - { - var key = itemArr[0].Trim(); - var val = itemArr[1].Trim(); - dic.Add(key, val); - } - } - } - - return dic; - } - } + public Dictionary NewSeriesProviderIdsDictionary { get; set; } } } \ No newline at end of file From 719f675fe5729aecbf651e19d87e5c16f5b8b49f Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 27 Feb 2016 23:09:14 +0100 Subject: [PATCH 3/5] Rename NewSeriesProviderIdsDictionary to NewSeriesProviderIds --- MediaBrowser.Api/Library/FileOrganizationService.cs | 2 +- .../FileOrganization/EpisodeFileOrganizationRequest.cs | 2 +- .../FileOrganization/EpisodeFileOrganizer.cs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MediaBrowser.Api/Library/FileOrganizationService.cs b/MediaBrowser.Api/Library/FileOrganizationService.cs index f636b723ed..dba705ba3c 100644 --- a/MediaBrowser.Api/Library/FileOrganizationService.cs +++ b/MediaBrowser.Api/Library/FileOrganizationService.cs @@ -185,7 +185,7 @@ namespace MediaBrowser.Api.Library SeriesId = request.SeriesId, NewSeriesName = request.NewSeriesName, NewSeriesYear = request.NewSeriesYear, - NewSeriesProviderIdsDictionary = dicNewProviderIds, + NewSeriesProviderIds = dicNewProviderIds, TargetFolder = request.TargetFolder }); diff --git a/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs b/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs index 307088b632..b20e43e544 100644 --- a/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs +++ b/MediaBrowser.Model/FileOrganization/EpisodeFileOrganizationRequest.cs @@ -21,6 +21,6 @@ namespace MediaBrowser.Model.FileOrganization public string TargetFolder { get; set; } - public Dictionary NewSeriesProviderIdsDictionary { get; set; } + public Dictionary NewSeriesProviderIds { get; set; } } } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs index 43eea47730..24e8c71374 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs @@ -159,11 +159,11 @@ namespace MediaBrowser.Server.Implementations.FileOrganization Series series = null; - if (request.NewSeriesProviderIdsDictionary.Count > 0) + if (request.NewSeriesProviderIds.Count > 0) { // We're having a new series here SeriesInfo seriesRequest = new SeriesInfo(); - seriesRequest.ProviderIds = request.NewSeriesProviderIdsDictionary; + seriesRequest.ProviderIds = request.NewSeriesProviderIds; var refreshOptions = new MetadataRefreshOptions(_fileSystem); series = new Series(); @@ -184,7 +184,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization series.Path = Path.Combine(request.TargetFolder, seriesFolderName); - series.ProviderIds = request.NewSeriesProviderIdsDictionary; + series.ProviderIds = request.NewSeriesProviderIds; await series.RefreshMetadata(refreshOptions, cancellationToken); } From b5c41d104cf631e84f0c46696d4452c7082692f3 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 28 Feb 2016 03:34:53 +0100 Subject: [PATCH 4/5] Use JSON deserialization for NewSeriesProviderIds parameter --- .../Library/FileOrganizationService.cs | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/MediaBrowser.Api/Library/FileOrganizationService.cs b/MediaBrowser.Api/Library/FileOrganizationService.cs index dba705ba3c..b04da49f69 100644 --- a/MediaBrowser.Api/Library/FileOrganizationService.cs +++ b/MediaBrowser.Api/Library/FileOrganizationService.cs @@ -6,6 +6,7 @@ using MediaBrowser.Model.Querying; using ServiceStack; using System.Threading.Tasks; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Api.Library { @@ -118,9 +119,14 @@ namespace MediaBrowser.Api.Library { private readonly IFileOrganizationService _iFileOrganizationService; - public FileOrganizationService(IFileOrganizationService iFileOrganizationService) + /// The _json serializer + /// + private readonly IJsonSerializer _jsonSerializer; + + public FileOrganizationService(IFileOrganizationService iFileOrganizationService, IJsonSerializer jsonSerializer) { _iFileOrganizationService = iFileOrganizationService; + _jsonSerializer = jsonSerializer; } public object Get(GetFileOrganizationActivity request) @@ -161,18 +167,7 @@ namespace MediaBrowser.Api.Library if (!string.IsNullOrEmpty(request.NewSeriesProviderIds)) { - var str = request.NewSeriesProviderIds.Replace("{", "").Replace("}", "").Replace("\"", ""); - - foreach (var item in str.Split(',')) - { - var itemArr = item.Split(':'); - if (itemArr.Length > 1) - { - var key = itemArr[0].Trim(); - var val = itemArr[1].Trim(); - dicNewProviderIds.Add(key, val); - } - } + dicNewProviderIds = _jsonSerializer.DeserializeFromString>(request.NewSeriesProviderIds); } var task = _iFileOrganizationService.PerformEpisodeOrganization(new EpisodeFileOrganizationRequest From f5aa1250cad988c18d62c384879e0c5f87ce607d Mon Sep 17 00:00:00 2001 From: softworkz Date: Sun, 28 Feb 2016 03:56:16 +0100 Subject: [PATCH 5/5] Change NewSeriesProviderIds parameter type to Dictionary --- MediaBrowser.Api/Library/FileOrganizationService.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MediaBrowser.Api/Library/FileOrganizationService.cs b/MediaBrowser.Api/Library/FileOrganizationService.cs index b04da49f69..849e9cf0db 100644 --- a/MediaBrowser.Api/Library/FileOrganizationService.cs +++ b/MediaBrowser.Api/Library/FileOrganizationService.cs @@ -76,8 +76,8 @@ namespace MediaBrowser.Api.Library [ApiMember(Name = "RememberCorrection", Description = "Whether or not to apply the same correction to future episodes of the same series.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")] public bool RememberCorrection { get; set; } - [ApiMember(Name = "NewSeriesProviderIds", Description = "A list of provider IDs identifying a new series.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string NewSeriesProviderIds { get; set; } + [ApiMember(Name = "NewSeriesProviderIds", Description = "A list of provider IDs identifying a new series.", IsRequired = false, DataType = "Dictionary", ParameterType = "query", Verb = "POST")] + public Dictionary NewSeriesProviderIds { get; set; } [ApiMember(Name = "NewSeriesName", Description = "Name of a series to add.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] public string NewSeriesName { get; set; } @@ -165,9 +165,9 @@ namespace MediaBrowser.Api.Library { var dicNewProviderIds = new Dictionary(); - if (!string.IsNullOrEmpty(request.NewSeriesProviderIds)) + if (request.NewSeriesProviderIds != null) { - dicNewProviderIds = _jsonSerializer.DeserializeFromString>(request.NewSeriesProviderIds); + dicNewProviderIds = request.NewSeriesProviderIds; } var task = _iFileOrganizationService.PerformEpisodeOrganization(new EpisodeFileOrganizationRequest