diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs
index ba3b0912b6..9dfeb216e5 100644
--- a/MediaBrowser.Api/VideosService.cs
+++ b/MediaBrowser.Api/VideosService.cs
@@ -1,13 +1,12 @@
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Controller.Dto;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Querying;
using ServiceStack;
using System;
using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
namespace MediaBrowser.Api
{
@@ -41,37 +40,20 @@ namespace MediaBrowser.Api
public string Id { get; set; }
}
- [Route("/Videos/{Id}/AlternateVersions", "POST")]
- [Api(Description = "Assigns videos as alternates of antoher.")]
- public class PostAlternateVersions : IReturnVoid
- {
- [ApiMember(Name = "AlternateVersionIds", Description = "Item id, comma delimited", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string AlternateVersionIds { get; set; }
-
- ///
- /// Gets or sets the id.
- ///
- /// The id.
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Id { get; set; }
- }
-
[Route("/Videos/{Id}/AlternateVersions", "DELETE")]
[Api(Description = "Assigns videos as alternates of antoher.")]
public class DeleteAlternateVersions : IReturnVoid
{
- [ApiMember(Name = "AlternateVersionIds", Description = "Item id, comma delimited", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")]
- public string AlternateVersionIds { get; set; }
-
- ///
- /// Gets or sets the id.
- ///
- /// The id.
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+ [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
public string Id { get; set; }
+ }
- [ApiMember(Name = "IsAlternateEncoding", Description = "Filter by versions that are considered alternate encodings of the original.", IsRequired = true, DataType = "bool", ParameterType = "path", Verb = "GET")]
- public bool? IsAlternateEncoding { get; set; }
+ [Route("/Videos/MergeVersions", "POST")]
+ [Api(Description = "Merges videos into a single record")]
+ public class MergeVersions : IReturnVoid
+ {
+ [ApiMember(Name = "Ids", Description = "Item id list. This allows multiple, comma delimited.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST", AllowMultiple = true)]
+ public string Ids { get; set; }
}
public class VideosService : BaseApiService
@@ -152,60 +134,84 @@ namespace MediaBrowser.Api
return ToOptimizedSerializedResultUsingCache(result);
}
- public void Post(PostAlternateVersions request)
+ public void Delete(DeleteAlternateVersions request)
{
- var task = AddAlternateVersions(request);
+ var task = RemoveAlternateVersions(request);
Task.WaitAll(task);
}
- public void Delete(DeleteAlternateVersions request)
+ private async Task RemoveAlternateVersions(DeleteAlternateVersions request)
{
- var task = RemoveAlternateVersions(request);
+ var video = (Video)_dtoService.GetItemByDtoId(request.Id);
+
+ foreach (var link in video.GetLinkedAlternateVersions())
+ {
+ link.PrimaryVersionId = null;
+
+ await link.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+ }
+
+ video.LinkedAlternateVersions.Clear();
+ await video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+ }
+
+ public void Post(MergeVersions request)
+ {
+ var task = MergeVersions(request);
Task.WaitAll(task);
}
- private async Task AddAlternateVersions(PostAlternateVersions request)
+ private async Task MergeVersions(MergeVersions request)
{
- var video = (Video)_dtoService.GetItemByDtoId(request.Id);
+ var items = request.Ids.Split(',')
+ .Select(i => new Guid(i))
+ .Select(i => _libraryManager.GetItemById(i))
+ .Cast