aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities/Video.cs
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-03-16 00:23:58 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-03-16 00:23:58 -0400
commitb36aea4ff74052ae40c27db057f50f645659aa57 (patch)
treef98c438363d961243fcf743c9a240a05429a2848 /MediaBrowser.Controller/Entities/Video.cs
parent4e6d306d0021cda1e909da2647b803ea7d505d4a (diff)
#712 - Support grouping multiple versions of a movie
Diffstat (limited to 'MediaBrowser.Controller/Entities/Video.cs')
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs86
1 files changed, 68 insertions, 18 deletions
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index e30458dd8..18db21f38 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Model.Entities;
@@ -20,26 +21,27 @@ namespace MediaBrowser.Controller.Entities
{
public bool IsMultiPart { get; set; }
public bool HasLocalAlternateVersions { get; set; }
+ public Guid? PrimaryVersionId { get; set; }
public List<Guid> AdditionalPartIds { get; set; }
- public List<Guid> AlternateVersionIds { get; set; }
+ public List<Guid> LocalAlternateVersionIds { get; set; }
public Video()
{
PlayableStreamFileNames = new List<string>();
AdditionalPartIds = new List<Guid>();
- AlternateVersionIds = new List<Guid>();
+ LocalAlternateVersionIds = new List<Guid>();
Tags = new List<string>();
SubtitleFiles = new List<string>();
LinkedAlternateVersions = new List<LinkedChild>();
}
[IgnoreDataMember]
- public bool HasAlternateVersions
+ public int AlternateVersionCount
{
get
{
- return HasLocalAlternateVersions || LinkedAlternateVersions.Count > 0;
+ return LinkedAlternateVersions.Count + LocalAlternateVersionIds.Count;
}
}
@@ -51,7 +53,7 @@ namespace MediaBrowser.Controller.Entities
/// <returns>IEnumerable{BaseItem}.</returns>
public IEnumerable<BaseItem> GetAlternateVersions()
{
- var filesWithinSameDirectory = AlternateVersionIds
+ var filesWithinSameDirectory = LocalAlternateVersionIds
.Select(i => LibraryManager.GetItemById(i))
.Where(i => i != null)
.OfType<Video>();
@@ -233,14 +235,11 @@ namespace MediaBrowser.Controller.Entities
{
RefreshLinkedAlternateVersions();
- if (HasLocalAlternateVersions)
- {
- var additionalPartsChanged = await RefreshAlternateVersionsWithinSameDirectory(options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
+ var additionalPartsChanged = await RefreshAlternateVersionsWithinSameDirectory(options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
- if (additionalPartsChanged)
- {
- hasChanges = true;
- }
+ if (additionalPartsChanged)
+ {
+ hasChanges = true;
}
}
}
@@ -339,21 +338,72 @@ namespace MediaBrowser.Controller.Entities
private async Task<bool> RefreshAlternateVersionsWithinSameDirectory(MetadataRefreshOptions options, IEnumerable<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken)
{
- var newItems = LoadAlternateVersionsWithinSameDirectory(fileSystemChildren, options.DirectoryService).ToList();
+ var newItems = HasLocalAlternateVersions ?
+ LoadAlternateVersionsWithinSameDirectory(fileSystemChildren, options.DirectoryService).ToList() :
+ new List<Video>();
var newItemIds = newItems.Select(i => i.Id).ToList();
- var itemsChanged = !AlternateVersionIds.SequenceEqual(newItemIds);
+ var itemsChanged = !LocalAlternateVersionIds.SequenceEqual(newItemIds);
- var tasks = newItems.Select(i => i.RefreshMetadata(options, cancellationToken));
+ var tasks = newItems.Select(i => RefreshAlternateVersion(options, i, cancellationToken));
await Task.WhenAll(tasks).ConfigureAwait(false);
- AlternateVersionIds = newItemIds;
+ LocalAlternateVersionIds = newItemIds;
return itemsChanged;
}
+ private Task RefreshAlternateVersion(MetadataRefreshOptions options, Video video, CancellationToken cancellationToken)
+ {
+ var currentImagePath = video.GetImagePath(ImageType.Primary);
+ var ownerImagePath = this.GetImagePath(ImageType.Primary);
+
+ var newOptions = new MetadataRefreshOptions
+ {
+ DirectoryService = options.DirectoryService,
+ ImageRefreshMode = options.ImageRefreshMode,
+ MetadataRefreshMode = options.MetadataRefreshMode,
+ ReplaceAllMetadata = options.ReplaceAllMetadata
+ };
+
+ if (!string.Equals(currentImagePath, ownerImagePath, StringComparison.OrdinalIgnoreCase))
+ {
+ newOptions.ForceSave = true;
+
+ if (string.IsNullOrWhiteSpace(ownerImagePath))
+ {
+ video.ImageInfos.Clear();
+ }
+ else
+ {
+ video.SetImagePath(ImageType.Primary, ownerImagePath);
+ }
+ }
+
+ return video.RefreshMetadata(newOptions, cancellationToken);
+ }
+
+ public override async Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken)
+ {
+ await base.UpdateToRepository(updateReason, cancellationToken).ConfigureAwait(false);
+
+ foreach (var item in LocalAlternateVersionIds.Select(i => LibraryManager.GetItemById(i)))
+ {
+ item.ImageInfos = ImageInfos;
+ item.Overview = Overview;
+ item.ProductionYear = ProductionYear;
+ item.PremiereDate = PremiereDate;
+ item.CommunityRating = CommunityRating;
+ item.OfficialRating = OfficialRating;
+ item.Genres = Genres;
+ item.ProviderIds = ProviderIds;
+
+ await item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false);
+ }
+ }
+
/// <summary>
/// Loads the additional parts.
/// </summary>
@@ -395,7 +445,7 @@ namespace MediaBrowser.Controller.Entities
video = dbItem;
}
- video.ImageInfos = ImageInfos;
+ video.PrimaryVersionId = Id;
return video;