aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2017-09-18 12:52:22 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2017-09-18 12:52:22 -0400
commitcdd79ec7e2fcea806be7a9b50764b1ad473d5970 (patch)
tree07ac58ea57e5750c0749de219220e9635c8fea27 /MediaBrowser.Controller
parentb01489c40fbd0aa6013f1ed448d902094a186f9f (diff)
update owned items
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Entities/AggregateFolder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs108
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs103
-rw-r--r--MediaBrowser.Controller/Entities/IHasTrailers.cs2
-rw-r--r--MediaBrowser.Controller/Entities/ItemImageInfo.cs6
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs15
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs10
-rw-r--r--MediaBrowser.Controller/Entities/User.cs3
-rw-r--r--MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs28
10 files changed, 206 insertions, 73 deletions
diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs
index 2105ef9079..00fac1eabd 100644
--- a/MediaBrowser.Controller/Entities/AggregateFolder.cs
+++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs
@@ -137,7 +137,7 @@ namespace MediaBrowser.Controller.Entities
{
FileInfo = FileSystem.GetDirectoryInfo(path),
Path = path,
- Parent = Parent
+ Parent = GetParent() as Folder
};
// Gather child folder and files
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 4416c5e916..502ba6c60e 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -97,7 +97,7 @@ namespace MediaBrowser.Controller.Entities
public string Tagline { get; set; }
[IgnoreDataMember]
- public ItemImageInfo[] ImageInfos { get; set; }
+ public virtual ItemImageInfo[] ImageInfos { get; set; }
[IgnoreDataMember]
public bool IsVirtualItem { get; set; }
@@ -216,6 +216,9 @@ namespace MediaBrowser.Controller.Entities
[IgnoreDataMember]
public Guid Id { get; set; }
+ [IgnoreDataMember]
+ public Guid OwnerId { get; set; }
+
/// <summary>
/// Gets or sets a value indicating whether this instance is hd.
/// </summary>
@@ -321,12 +324,31 @@ namespace MediaBrowser.Controller.Entities
{
get
{
+ if (OwnerId != Guid.Empty)
+ {
+ return true;
+ }
+
+ // legacy
+
// Local trailer, special feature, theme video, etc.
// An item that belongs to another item but is not part of the Parent-Child tree
- return !IsFolder && ParentId == Guid.Empty && LocationType == LocationType.FileSystem;
+ // This is a hack for now relying on ExtraType. Eventually we may need to persist this
+ if (ParentId == Guid.Empty && !IsFolder && LocationType == LocationType.FileSystem)
+ {
+ return true;
+ }
+
+ return false;
}
}
+ public BaseItem GetOwner()
+ {
+ var ownerId = OwnerId;
+ return ownerId == Guid.Empty ? null : LibraryManager.GetItemById(ownerId);
+ }
+
/// <summary>
/// Gets or sets the type of the location.
/// </summary>
@@ -727,17 +749,12 @@ namespace MediaBrowser.Controller.Entities
ParentId = parent == null ? Guid.Empty : parent.Id;
}
- [IgnoreDataMember]
- public IEnumerable<Folder> Parents
- {
- get { return GetParents().OfType<Folder>(); }
- }
-
public BaseItem GetParent()
{
- if (ParentId != Guid.Empty)
+ var parentId = ParentId;
+ if (parentId != Guid.Empty)
{
- return LibraryManager.GetItemById(ParentId);
+ return LibraryManager.GetItemById(parentId);
}
return null;
@@ -779,11 +796,13 @@ namespace MediaBrowser.Controller.Entities
{
get
{
- if (ParentId == Guid.Empty)
+ var parentId = ParentId;
+
+ if (parentId == Guid.Empty)
{
return null;
}
- return ParentId;
+ return parentId;
}
}
@@ -1002,8 +1021,11 @@ namespace MediaBrowser.Controller.Entities
{
audio = dbItem;
}
-
- audio.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeSong;
+ else
+ {
+ // item is new
+ audio.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeSong;
+ }
return audio;
@@ -1032,8 +1054,11 @@ namespace MediaBrowser.Controller.Entities
{
item = dbItem;
}
-
- item.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeVideo;
+ else
+ {
+ // item is new
+ item.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeVideo;
+ }
return item;
@@ -1178,8 +1203,25 @@ namespace MediaBrowser.Controller.Entities
var newItemIds = newItems.Select(i => i.Id).ToArray();
var itemsChanged = !item.LocalTrailerIds.SequenceEqual(newItemIds);
+ var ownerId = item.Id;
- var tasks = newItems.Select(i => RefreshMetadataForOwnedItem(i, true, options, cancellationToken));
+ var tasks = newItems.Select(i =>
+ {
+ var subOptions = new MetadataRefreshOptions(options);
+
+ if (!i.ExtraType.HasValue ||
+ i.ExtraType.Value != Model.Entities.ExtraType.Trailer ||
+ i.OwnerId != ownerId ||
+ i.ParentId != Guid.Empty)
+ {
+ i.ExtraType = Model.Entities.ExtraType.Trailer;
+ i.OwnerId = ownerId;
+ i.ParentId = Guid.Empty;
+ subOptions.ForceSave = true;
+ }
+
+ return RefreshMetadataForOwnedItem(i, true, subOptions, cancellationToken);
+ });
await Task.WhenAll(tasks).ConfigureAwait(false);
@@ -1196,13 +1238,20 @@ namespace MediaBrowser.Controller.Entities
var themeVideosChanged = !item.ThemeVideoIds.SequenceEqual(newThemeVideoIds);
+ var ownerId = item.Id;
+
var tasks = newThemeVideos.Select(i =>
{
var subOptions = new MetadataRefreshOptions(options);
- if (!i.IsThemeMedia)
+ if (!i.ExtraType.HasValue ||
+ i.ExtraType.Value != Model.Entities.ExtraType.ThemeVideo ||
+ i.OwnerId != ownerId ||
+ i.ParentId != Guid.Empty)
{
- i.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeVideo;
+ i.ExtraType = Model.Entities.ExtraType.ThemeVideo;
+ i.OwnerId = ownerId;
+ i.ParentId = Guid.Empty;
subOptions.ForceSave = true;
}
@@ -1226,13 +1275,20 @@ namespace MediaBrowser.Controller.Entities
var themeSongsChanged = !item.ThemeSongIds.SequenceEqual(newThemeSongIds);
+ var ownerId = item.Id;
+
var tasks = newThemeSongs.Select(i =>
{
var subOptions = new MetadataRefreshOptions(options);
- if (!i.IsThemeMedia)
+ if (!i.ExtraType.HasValue ||
+ i.ExtraType.Value != Model.Entities.ExtraType.ThemeSong ||
+ i.OwnerId != ownerId ||
+ i.ParentId != Guid.Empty)
{
- i.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeSong;
+ i.ExtraType = Model.Entities.ExtraType.ThemeSong;
+ i.OwnerId = ownerId;
+ i.ParentId = Guid.Empty;
subOptions.ForceSave = true;
}
@@ -1868,7 +1924,6 @@ namespace MediaBrowser.Controller.Entities
{
existingImage.Path = image.Path;
existingImage.DateModified = image.DateModified;
- existingImage.IsPlaceholder = image.IsPlaceholder;
}
else
@@ -1902,7 +1957,6 @@ namespace MediaBrowser.Controller.Entities
image.Path = file.FullName;
image.DateModified = imageInfo.DateModified;
- image.IsPlaceholder = false;
}
}
@@ -2359,6 +2413,14 @@ namespace MediaBrowser.Controller.Entities
newOptions.ForceSave = true;
}
+ //var parentId = Id;
+ //if (!video.IsOwnedItem || video.ParentId != parentId)
+ //{
+ // video.IsOwnedItem = true;
+ // video.ParentId = parentId;
+ // newOptions.ForceSave = true;
+ //}
+
if (video == null)
{
return Task.FromResult(true);
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
index 537beb26b6..a83e084db5 100644
--- a/MediaBrowser.Controller/Entities/CollectionFolder.cs
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -280,7 +280,7 @@ namespace MediaBrowser.Controller.Entities
{
FileInfo = FileSystem.GetDirectoryInfo(path),
Path = path,
- Parent = Parent,
+ Parent = GetParent() as Folder,
CollectionType = CollectionType
};
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 2e741a8c44..6d88f70152 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -378,6 +378,7 @@ namespace MediaBrowser.Controller.Entities
cancellationToken.ThrowIfCancellationRequested();
var validChildren = new List<BaseItem>();
+ var validChildrenNeedGeneration = false;
var allLibraryPaths = LibraryManager
.GetVirtualFolders()
@@ -474,11 +475,7 @@ namespace MediaBrowser.Controller.Entities
}
else
{
- if (recursive || refreshChildMetadata)
- {
- // used below
- validChildren = Children.ToList();
- }
+ validChildrenNeedGeneration = true;
}
progress.Report(10);
@@ -502,6 +499,12 @@ namespace MediaBrowser.Controller.Entities
ProviderManager.OnRefreshProgress(folder, newPct);
});
+ if (validChildrenNeedGeneration)
+ {
+ validChildren = Children.ToList();
+ validChildrenNeedGeneration = false;
+ }
+
await ValidateSubFolders(validChildren.OfType<Folder>().ToList(), directoryService, innerProgress, cancellationToken).ConfigureAwait(false);
}
}
@@ -536,6 +539,12 @@ namespace MediaBrowser.Controller.Entities
}
else
{
+ if (validChildrenNeedGeneration)
+ {
+ validChildren = Children.ToList();
+ validChildrenNeedGeneration = false;
+ }
+
await RefreshMetadataRecursive(validChildren, refreshOptions, recursive, innerProgress, cancellationToken);
}
}
@@ -565,7 +574,7 @@ namespace MediaBrowser.Controller.Entities
});
await RefreshChildMetadata(child, refreshOptions, recursive && child.IsFolder, innerProgress, cancellationToken)
- .ConfigureAwait(false);
+ .ConfigureAwait(false);
}
numComplete++;
@@ -588,7 +597,10 @@ namespace MediaBrowser.Controller.Entities
}
else
{
- await child.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+ if (refreshOptions.RefreshItem(child))
+ {
+ await child.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+ }
if (recursive)
{
@@ -1196,11 +1208,21 @@ namespace MediaBrowser.Controller.Entities
/// Gets the linked children.
/// </summary>
/// <returns>IEnumerable{BaseItem}.</returns>
- public IEnumerable<BaseItem> GetLinkedChildren()
+ public List<BaseItem> GetLinkedChildren()
{
- return LinkedChildren
- .Select(GetLinkedChild)
- .Where(i => i != null);
+ var linkedChildren = LinkedChildren;
+ var list = new List<BaseItem>(linkedChildren.Length);
+
+ foreach (var i in linkedChildren)
+ {
+ var child = GetLinkedChild(i);
+
+ if (child != null)
+ {
+ list.Add(child);
+ }
+ }
+ return list;
}
protected virtual bool FilterLinkedChildrenPerUser
@@ -1211,16 +1233,19 @@ namespace MediaBrowser.Controller.Entities
}
}
- public IEnumerable<BaseItem> GetLinkedChildren(User user)
+ public List<BaseItem> GetLinkedChildren(User user)
{
if (!FilterLinkedChildrenPerUser || user == null)
{
return GetLinkedChildren();
}
- if (LinkedChildren.Length == 0)
+ var linkedChildren = LinkedChildren;
+ var list = new List<BaseItem>(linkedChildren.Length);
+
+ if (linkedChildren.Length == 0)
{
- return new List<BaseItem>();
+ return list;
}
var allUserRootChildren = user.RootFolder.Children.OfType<Folder>().ToList();
@@ -1231,37 +1256,43 @@ namespace MediaBrowser.Controller.Entities
.Select(i => i.Id)
.ToList();
- return LinkedChildren
- .Select(i =>
+ foreach (var i in linkedChildren)
+ {
+ var child = GetLinkedChild(i);
+
+ if (child == null)
{
- var child = GetLinkedChild(i);
+ continue;
+ }
+
+ var childOwner = child.IsOwnedItem ? (child.GetOwner() ?? child) : child;
- if (child != null)
+ if (childOwner != null)
+ {
+ var childLocationType = childOwner.LocationType;
+ if (childLocationType == LocationType.Remote || childLocationType == LocationType.Virtual)
{
- var childLocationType = child.LocationType;
- if (childLocationType == LocationType.Remote || childLocationType == LocationType.Virtual)
+ if (!childOwner.IsVisibleStandalone(user))
{
- if (!child.IsVisibleStandalone(user))
- {
- return null;
- }
+ continue;
}
- else if (childLocationType == LocationType.FileSystem)
- {
- var itemCollectionFolderIds =
- LibraryManager.GetCollectionFolders(child, allUserRootChildren)
- .Select(f => f.Id).ToList();
+ }
+ else if (childLocationType == LocationType.FileSystem)
+ {
+ var itemCollectionFolderIds =
+ LibraryManager.GetCollectionFolders(childOwner, allUserRootChildren).Select(f => f.Id);
- if (!itemCollectionFolderIds.Any(collectionFolderIds.Contains))
- {
- return null;
- }
+ if (!itemCollectionFolderIds.Any(collectionFolderIds.Contains))
+ {
+ continue;
}
}
+ }
+
+ list.Add(child);
+ }
- return child;
- })
- .Where(i => i != null);
+ return list;
}
/// <summary>
diff --git a/MediaBrowser.Controller/Entities/IHasTrailers.cs b/MediaBrowser.Controller/Entities/IHasTrailers.cs
index 8686c802ab..07dde37894 100644
--- a/MediaBrowser.Controller/Entities/IHasTrailers.cs
+++ b/MediaBrowser.Controller/Entities/IHasTrailers.cs
@@ -5,7 +5,7 @@ using System.Linq;
namespace MediaBrowser.Controller.Entities
{
- public interface IHasTrailers : IHasProviderIds
+ public interface IHasTrailers : IHasMetadata
{
/// <summary>
/// Gets or sets the remote trailers.
diff --git a/MediaBrowser.Controller/Entities/ItemImageInfo.cs b/MediaBrowser.Controller/Entities/ItemImageInfo.cs
index 672595db84..6b2d2392dc 100644
--- a/MediaBrowser.Controller/Entities/ItemImageInfo.cs
+++ b/MediaBrowser.Controller/Entities/ItemImageInfo.cs
@@ -24,12 +24,6 @@ namespace MediaBrowser.Controller.Entities
/// <value>The date modified.</value>
public DateTime DateModified { get; set; }
- /// <summary>
- /// Gets or sets a value indicating whether this instance is placeholder.
- /// </summary>
- /// <value><c>true</c> if this instance is placeholder; otherwise, <c>false</c>.</value>
- public bool IsPlaceholder { get; set; }
-
[IgnoreDataMember]
public bool IsLocalFile
{
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index 3a41709fed..2e0e019443 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -81,7 +81,20 @@ namespace MediaBrowser.Controller.Entities.Movies
var itemsChanged = !SpecialFeatureIds.SequenceEqual(newItemIds);
- var tasks = newItems.Select(i => RefreshMetadataForOwnedItem(i, false, options, cancellationToken));
+ var ownerId = Id;
+
+ var tasks = newItems.Select(i =>
+ {
+ var subOptions = new MetadataRefreshOptions(options);
+
+ if (i.OwnerId != ownerId)
+ {
+ i.OwnerId = ownerId;
+ subOptions.ForceSave = true;
+ }
+
+ return RefreshMetadataForOwnedItem(i, false, subOptions, cancellationToken);
+ });
await Task.WhenAll(tasks).ConfigureAwait(false);
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index 60d2624fa9..5931c32e1b 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -347,7 +347,10 @@ namespace MediaBrowser.Controller.Entities.TV
cancellationToken.ThrowIfCancellationRequested();
- await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+ if (refreshOptions.RefreshItem(item))
+ {
+ await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+ }
numComplete++;
double percent = numComplete;
@@ -382,7 +385,10 @@ namespace MediaBrowser.Controller.Entities.TV
if (!skipItem)
{
- await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+ if (refreshOptions.RefreshItem(item))
+ {
+ await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+ }
}
numComplete++;
diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs
index cca3091c15..4aa1311e1f 100644
--- a/MediaBrowser.Controller/Entities/User.cs
+++ b/MediaBrowser.Controller/Entities/User.cs
@@ -37,6 +37,9 @@ namespace MediaBrowser.Controller.Entities
public UserLinkType? ConnectLinkType { get; set; }
public string ConnectAccessKey { get; set; }
+ // Strictly to remove IgnoreDataMember
+ public override ItemImageInfo[] ImageInfos { get => base.ImageInfos; set => base.ImageInfos = value; }
+
/// <summary>
/// Gets or sets the path.
/// </summary>
diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
index 86cef628e0..0df2370bd3 100644
--- a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
+++ b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
@@ -1,5 +1,7 @@
-using System.Linq;
-
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
@@ -20,6 +22,8 @@ namespace MediaBrowser.Controller.Providers
public MetadataRefreshMode MetadataRefreshMode { get; set; }
public RemoteSearchResult SearchResult { get; set; }
+ public List<string> RefreshPaths { get; set; }
+
public bool ForceSave { get; set; }
public MetadataRefreshOptions(IFileSystem fileSystem)
@@ -44,6 +48,26 @@ namespace MediaBrowser.Controller.Providers
ReplaceAllImages = copy.ReplaceAllImages;
ReplaceImages = copy.ReplaceImages.ToList();
SearchResult = copy.SearchResult;
+
+ if (copy.RefreshPaths != null && copy.RefreshPaths.Count > 0)
+ {
+ if (RefreshPaths == null)
+ {
+ RefreshPaths = new List<string>();
+ }
+
+ RefreshPaths.AddRange(copy.RefreshPaths);
+ }
+ }
+
+ public bool RefreshItem(BaseItem item)
+ {
+ if (RefreshPaths != null && RefreshPaths.Count > 0)
+ {
+ return RefreshPaths.Contains(item.Path ?? string.Empty, StringComparer.OrdinalIgnoreCase);
+ }
+
+ return true;
}
}
}