aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/VideosService.cs124
-rw-r--r--MediaBrowser.Controller/Channels/ChannelAudioItem.cs2
-rw-r--r--MediaBrowser.Controller/Channels/ChannelCategoryItem.cs7
-rw-r--r--MediaBrowser.Controller/Channels/ChannelVideoItem.cs2
-rw-r--r--MediaBrowser.Controller/Channels/IChannelItem.cs7
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs10
-rw-r--r--MediaBrowser.Model/Dto/BaseItemDto.cs1
-rw-r--r--MediaBrowser.Server.Implementations/Channels/ChannelManager.cs12
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs5
9 files changed, 95 insertions, 75 deletions
diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs
index ba3b0912b..9dfeb216e 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; }
-
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [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; }
-
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [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<Video>()
+ .ToList();
- var list = new List<LinkedChild>();
- var currentAlternateVersions = video.GetAlternateVersions().ToList();
+ if (items.Count < 2)
+ {
+ throw new ArgumentException("Please supply at least two videos to merge.");
+ }
- foreach (var itemId in request.AlternateVersionIds.Split(',').Select(i => new Guid(i)))
+ var videosWithVersions = items.Where(i => i.AlternateVersionCount > 0)
+ .ToList();
+
+ if (videosWithVersions.Count > 1)
{
- var item = _libraryManager.GetItemById(itemId) as Video;
+ throw new ArgumentException("Videos with sub-versions cannot be merged.");
+ }
- if (item == null)
- {
- throw new ArgumentException("No item exists with the supplied Id");
- }
+ var primaryVersion = videosWithVersions.FirstOrDefault();
- if (currentAlternateVersions.Any(i => i.Id == itemId))
+ if (primaryVersion == null)
+ {
+ primaryVersion = items.OrderByDescending(i =>
{
- throw new ArgumentException("Item already exists.");
- }
+ var stream = i.GetDefaultVideoStream();
- list.Add(new LinkedChild
- {
- Path = item.Path,
- Type = LinkedChildType.Manual
- });
+ return stream == null || stream.Width == null ? 0 : stream.Width.Value;
- item.PrimaryVersionId = video.Id;
+ }).ThenBy(i => i.Name.Length)
+ .First();
}
- video.LinkedAlternateVersions.AddRange(list);
+ foreach (var item in items.Where(i => i.Id != primaryVersion.Id))
+ {
+ item.PrimaryVersionId = primaryVersion.Id;
- await video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+ await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
- await video.RefreshMetadata(CancellationToken.None).ConfigureAwait(false);
- }
+ primaryVersion.LinkedAlternateVersions.Add(new LinkedChild
+ {
+ Path = item.Path,
+ ItemId = item.Id
+ });
+ }
- private async Task RemoveAlternateVersions(DeleteAlternateVersions request)
- {
- var video = (Video)_dtoService.GetItemByDtoId(request.Id);
+ await primaryVersion.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
}
}
}
diff --git a/MediaBrowser.Controller/Channels/ChannelAudioItem.cs b/MediaBrowser.Controller/Channels/ChannelAudioItem.cs
index 269a95456..6f3398f52 100644
--- a/MediaBrowser.Controller/Channels/ChannelAudioItem.cs
+++ b/MediaBrowser.Controller/Channels/ChannelAudioItem.cs
@@ -2,7 +2,7 @@
namespace MediaBrowser.Controller.Channels
{
- public class ChannelAudioItem : Audio, IChannelItem
+ public class ChannelAudioItem : Audio, IChannelMediaItem
{
public string ExternalId { get; set; }
diff --git a/MediaBrowser.Controller/Channels/ChannelCategoryItem.cs b/MediaBrowser.Controller/Channels/ChannelCategoryItem.cs
index 11e56ee07..61b38c2b1 100644
--- a/MediaBrowser.Controller/Channels/ChannelCategoryItem.cs
+++ b/MediaBrowser.Controller/Channels/ChannelCategoryItem.cs
@@ -2,7 +2,12 @@
namespace MediaBrowser.Controller.Channels
{
- public class ChannelCategoryItem : Folder
+ public class ChannelCategoryItem : Folder, IChannelItem
{
+ public string ExternalId { get; set; }
+
+ public ChannelItemType ChannelItemType { get; set; }
+
+ public string OriginalImageUrl { get; set; }
}
}
diff --git a/MediaBrowser.Controller/Channels/ChannelVideoItem.cs b/MediaBrowser.Controller/Channels/ChannelVideoItem.cs
index baa4c2a17..83b85794d 100644
--- a/MediaBrowser.Controller/Channels/ChannelVideoItem.cs
+++ b/MediaBrowser.Controller/Channels/ChannelVideoItem.cs
@@ -2,7 +2,7 @@
namespace MediaBrowser.Controller.Channels
{
- public class ChannelVideoItem : Video, IChannelItem
+ public class ChannelVideoItem : Video, IChannelMediaItem
{
public string ExternalId { get; set; }
diff --git a/MediaBrowser.Controller/Channels/IChannelItem.cs b/MediaBrowser.Controller/Channels/IChannelItem.cs
index ffef532a9..a05ef8e29 100644
--- a/MediaBrowser.Controller/Channels/IChannelItem.cs
+++ b/MediaBrowser.Controller/Channels/IChannelItem.cs
@@ -8,10 +8,13 @@ namespace MediaBrowser.Controller.Channels
ChannelItemType ChannelItemType { get; set; }
+ string OriginalImageUrl { get; set; }
+ }
+
+ public interface IChannelMediaItem : IChannelItem
+ {
bool IsInfiniteStream { get; set; }
ChannelMediaContentType ContentType { get; set; }
-
- string OriginalImageUrl { get; set; }
}
}
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index 18db21f38..25f47aead 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -51,19 +51,25 @@ namespace MediaBrowser.Controller.Entities
/// Gets the linked children.
/// </summary>
/// <returns>IEnumerable{BaseItem}.</returns>
- public IEnumerable<BaseItem> GetAlternateVersions()
+ public IEnumerable<Video> GetAlternateVersions()
{
var filesWithinSameDirectory = LocalAlternateVersionIds
.Select(i => LibraryManager.GetItemById(i))
.Where(i => i != null)
.OfType<Video>();
+ return filesWithinSameDirectory.Concat(GetLinkedAlternateVersions())
+ .OrderBy(i => i.SortName);
+ }
+
+ public IEnumerable<Video> GetLinkedAlternateVersions()
+ {
var linkedVersions = LinkedAlternateVersions
.Select(GetLinkedChild)
.Where(i => i != null)
.OfType<Video>();
- return filesWithinSameDirectory.Concat(linkedVersions)
+ return linkedVersions
.OrderBy(i => i.SortName);
}
diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs
index 857332b06..451afee6b 100644
--- a/MediaBrowser.Model/Dto/BaseItemDto.cs
+++ b/MediaBrowser.Model/Dto/BaseItemDto.cs
@@ -495,7 +495,6 @@ namespace MediaBrowser.Model.Dto
/// <value>The part count.</value>
public int? PartCount { get; set; }
public int? AlternateVersionCount { get; set; }
- public string PrimaryVersionId { get; set; }
/// <summary>
/// Determines whether the specified type is type.
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
index 22b7e7054..ae5bf7716 100644
--- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
+++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
@@ -208,8 +208,8 @@ namespace MediaBrowser.Server.Implementations.Channels
var query = new InternalChannelItemQuery
{
- User = user,
- CategoryId = categoryId
+ User = user,
+ CategoryId = categoryId
};
var result = await channel.GetChannelItems(query, cancellationToken).ConfigureAwait(false);
@@ -236,7 +236,7 @@ namespace MediaBrowser.Server.Implementations.Channels
var tasks = items.Select(GetChannelItemEntity);
var returnItems = await Task.WhenAll(tasks).ConfigureAwait(false);
-
+ returnItems = new BaseItem[] {};
var returnItemArray = returnItems.Select(i => _dtoService.GetBaseItemDto(i, fields, user))
.ToArray();
@@ -251,19 +251,25 @@ namespace MediaBrowser.Server.Implementations.Channels
{
BaseItem item;
+ Guid id;
+
if (info.Type == ChannelItemType.Category)
{
+ id = info.Id.GetMBId(typeof(ChannelCategoryItem));
item = new ChannelCategoryItem();
}
else if (info.MediaType == ChannelMediaType.Audio)
{
+ id = info.Id.GetMBId(typeof(ChannelCategoryItem));
item = new ChannelAudioItem();
}
else
{
+ id = info.Id.GetMBId(typeof(ChannelVideoItem));
item = new ChannelVideoItem();
}
+ item.Id = id;
item.Name = info.Name;
item.Genres = info.Genres;
item.CommunityRating = info.CommunityRating;
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index 19d834c20..3aaf6eb80 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -1084,11 +1084,6 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.PartCount = video.AdditionalPartIds.Count + 1;
dto.AlternateVersionCount = video.AlternateVersionCount;
- if (video.PrimaryVersionId.HasValue)
- {
- dto.PrimaryVersionId = video.PrimaryVersionId.Value.ToString("N");
- }
-
if (fields.Contains(ItemFields.Chapters))
{
dto.Chapters = _itemRepo.GetChapters(video.Id).Select(c => GetChapterInfoDto(c, item)).ToList();