diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities/BaseItem.cs')
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 195 |
1 files changed, 141 insertions, 54 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 513b85d8b..502ba6c60 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; } @@ -187,21 +187,6 @@ namespace MediaBrowser.Controller.Entities } [IgnoreDataMember] - public string SlugName - { - get - { - var name = Name; - if (string.IsNullOrWhiteSpace(name)) - { - return string.Empty; - } - - return SlugReplaceChars.Aggregate(name, (current, c) => current.Replace(c, SlugChar)); - } - } - - [IgnoreDataMember] public bool IsUnaired { get { return PremiereDate.HasValue && PremiereDate.Value.ToLocalTime().Date >= DateTime.Now.Date; } @@ -231,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> @@ -336,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> @@ -664,27 +671,34 @@ namespace MediaBrowser.Controller.Entities } var sortable = Name.Trim().ToLower(); - sortable = ConfigurationManager.Configuration.SortRemoveCharacters.Aggregate(sortable, (current, search) => current.Replace(search.ToLower(), string.Empty)); - sortable = ConfigurationManager.Configuration.SortReplaceCharacters.Aggregate(sortable, (current, search) => current.Replace(search.ToLower(), " ")); + foreach (var removeChar in ConfigurationManager.Configuration.SortRemoveCharacters) + { + sortable = sortable.Replace(removeChar, string.Empty); + } + + foreach (var replaceChar in ConfigurationManager.Configuration.SortReplaceCharacters) + { + sortable = sortable.Replace(replaceChar, " "); + } foreach (var search in ConfigurationManager.Configuration.SortRemoveWords) { - var searchLower = search.ToLower(); // Remove from beginning if a space follows - if (sortable.StartsWith(searchLower + " ")) + if (sortable.StartsWith(search + " ")) { - sortable = sortable.Remove(0, searchLower.Length + 1); + sortable = sortable.Remove(0, search.Length + 1); } // Remove from middle if surrounded by spaces - sortable = sortable.Replace(" " + searchLower + " ", " "); + sortable = sortable.Replace(" " + search + " ", " "); // Remove from end if followed by a space - if (sortable.EndsWith(" " + searchLower)) + if (sortable.EndsWith(" " + search)) { - sortable = sortable.Remove(sortable.Length - (searchLower.Length + 1)); + sortable = sortable.Remove(sortable.Length - (search.Length + 1)); } } + return ModifySortChunks(sortable); } @@ -735,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; @@ -771,7 +780,15 @@ namespace MediaBrowser.Controller.Entities public T FindParent<T>() where T : Folder { - return GetParents().OfType<T>().FirstOrDefault(); + foreach (var parent in GetParents()) + { + var item = parent as T; + if (item != null) + { + return item; + } + } + return null; } [IgnoreDataMember] @@ -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; } } @@ -918,9 +937,10 @@ namespace MediaBrowser.Controller.Entities { get { - if (!string.IsNullOrWhiteSpace(OfficialRating)) + var officialRating = OfficialRating; + if (!string.IsNullOrWhiteSpace(officialRating)) { - return OfficialRating; + return officialRating; } var parent = DisplayParent; @@ -938,9 +958,10 @@ namespace MediaBrowser.Controller.Entities { get { - if (!string.IsNullOrWhiteSpace(CustomRating)) + var customRating = CustomRating; + if (!string.IsNullOrWhiteSpace(customRating)) { - return CustomRating; + return customRating; } var parent = DisplayParent; @@ -1000,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; @@ -1030,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; @@ -1176,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 => + { + 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; + } - var tasks = newItems.Select(i => RefreshMetadataForOwnedItem(i, true, options, cancellationToken)); + return RefreshMetadataForOwnedItem(i, true, subOptions, cancellationToken); + }); await Task.WhenAll(tasks).ConfigureAwait(false); @@ -1194,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; } @@ -1224,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; } @@ -1866,7 +1924,6 @@ namespace MediaBrowser.Controller.Entities { existingImage.Path = image.Path; existingImage.DateModified = image.DateModified; - existingImage.IsPlaceholder = image.IsPlaceholder; } else @@ -1900,7 +1957,6 @@ namespace MediaBrowser.Controller.Entities image.Path = file.FullName; image.DateModified = imageInfo.DateModified; - image.IsPlaceholder = false; } } @@ -2140,8 +2196,8 @@ namespace MediaBrowser.Controller.Entities } var filename = System.IO.Path.GetFileNameWithoutExtension(Path); - var extensions = new[] { ".nfo", ".xml", ".srt" }.ToList(); - extensions.AddRange(SupportedImageExtensionsList); + var extensions = new List<string> { ".nfo", ".xml", ".srt" }; + extensions.AddRange(SupportedImageExtensions); return FileSystem.GetFiles(FileSystem.GetDirectoryName(Path), extensions.ToArray(extensions.Count), false, false) .Where(i => System.IO.Path.GetFileNameWithoutExtension(i.FullName).StartsWith(filename, StringComparison.OrdinalIgnoreCase)) @@ -2357,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); @@ -2392,7 +2456,14 @@ namespace MediaBrowser.Controller.Entities return this; } - return GetParents().FirstOrDefault(i => i.IsTopParent); + foreach (var parent in GetParents()) + { + if (parent.IsTopParent) + { + return parent; + } + } + return null; } [IgnoreDataMember] @@ -2473,5 +2544,21 @@ namespace MediaBrowser.Controller.Entities { return null; } + + public virtual ItemUpdateType OnMetadataChanged() + { + var updateType = ItemUpdateType.None; + + var item = this; + + var inheritedParentalRatingValue = item.GetInheritedParentalRatingValue() ?? 0; + if (inheritedParentalRatingValue != item.InheritedParentalRatingValue) + { + item.InheritedParentalRatingValue = inheritedParentalRatingValue; + updateType |= ItemUpdateType.MetadataImport; + } + + return updateType; + } } }
\ No newline at end of file |
