diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-09-22 17:56:54 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-09-22 17:56:54 -0400 |
| commit | 1afb28b48797ee53442823cfd395e07d219e8ec3 (patch) | |
| tree | 694d2d8a3449a6d8cb46fddeb73ed1f96be634d7 /MediaBrowser.Controller/Entities | |
| parent | ac201a6cdb22ff158aaca1378361b03b2127686d (diff) | |
add cinema mode feature
Diffstat (limited to 'MediaBrowser.Controller/Entities')
| -rw-r--r-- | MediaBrowser.Controller/Entities/Audio/Audio.cs | 1 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 121 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Extensions.cs | 9 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Movies/Movie.cs | 28 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Video.cs | 1 |
5 files changed, 115 insertions, 45 deletions
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 25d41565ae..447328ea13 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -28,6 +28,7 @@ namespace MediaBrowser.Controller.Entities.Audio public string Container { get; set; } public int? TotalBitrate { get; set; } public List<string> Tags { get; set; } + public ExtraType ExtraType { get; set; } public bool IsThemeMedia { get; set; } diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 3830fa1c15..e75f17f9a0 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -41,16 +41,25 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// The supported image extensions /// </summary> - public static readonly string[] SupportedImageExtensions = new[] { ".png", ".jpg", ".jpeg", ".tbn" }; + public static readonly string[] SupportedImageExtensions = { ".png", ".jpg", ".jpeg", ".tbn" }; /// <summary> /// The trailer folder name /// </summary> - public const string TrailerFolderName = "trailers"; - public const string ThemeSongsFolderName = "theme-music"; - public const string ThemeSongFilename = "theme"; - public const string ThemeVideosFolderName = "backdrops"; - public const string XbmcTrailerFileSuffix = "-trailer"; + public static string TrailerFolderName = "trailers"; + public static string ThemeSongsFolderName = "theme-music"; + public static string ThemeSongFilename = "theme"; + public static string ThemeVideosFolderName = "backdrops"; + + public static List<KeyValuePair<string, ExtraType>> ExtraSuffixes = new List<KeyValuePair<string, ExtraType>> + { + new KeyValuePair<string,ExtraType>("-trailer", ExtraType.Trailer), + new KeyValuePair<string,ExtraType>("-deleted", ExtraType.DeletedScene), + new KeyValuePair<string,ExtraType>("-behindthescenes", ExtraType.BehindTheScenes), + new KeyValuePair<string,ExtraType>("-interview", ExtraType.Interview), + new KeyValuePair<string,ExtraType>("-scene", ExtraType.Scene), + new KeyValuePair<string,ExtraType>("-sample", ExtraType.Sample) + }; public List<ItemImageInfo> ImageInfos { get; set; } @@ -167,7 +176,7 @@ namespace MediaBrowser.Controller.Entities { // 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 && Parent == null; + return !IsFolder && Parent == null && LocationType == LocationType.FileSystem; } } @@ -552,11 +561,24 @@ namespace MediaBrowser.Controller.Entities .Where(i => string.Equals(i.Name, TrailerFolderName, StringComparison.OrdinalIgnoreCase)) .SelectMany(i => i.EnumerateFiles("*", SearchOption.TopDirectoryOnly)) .ToList(); - - // Support plex/xbmc convention + + var extraTypes = new List<ExtraType> { ExtraType.Trailer }; + var suffixes = ExtraSuffixes.Where(i => extraTypes.Contains(i.Value)) + .Select(i => i.Key) + .ToList(); + files.AddRange(fileSystemChildren.OfType<FileInfo>() - .Where(i => FileSystem.GetFileNameWithoutExtension(i).EndsWith(XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) && !string.Equals(Path, i.FullName, StringComparison.OrdinalIgnoreCase)) - ); + .Where(i => + { + var nameEithoutExtension = FileSystem.GetFileNameWithoutExtension(i); + + if (!suffixes.Any(s => nameEithoutExtension.EndsWith(s, StringComparison.OrdinalIgnoreCase))) + { + return false; + } + + return !string.Equals(Path, i.FullName, StringComparison.OrdinalIgnoreCase); + })); return LibraryManager.ResolvePaths<Trailer>(files, directoryService, null).Select(video => { @@ -568,12 +590,79 @@ namespace MediaBrowser.Controller.Entities video = dbItem; } + if (video != null) + { + video.ExtraType = ExtraType.Trailer; + } + + return video; + + // Sort them so that the list can be easily compared for changes + }).OrderBy(i => i.Path).ToList(); + } + + protected IEnumerable<Video> LoadSpecialFeatures(List<FileSystemInfo> fileSystemChildren, IDirectoryService directoryService) + { + var files = fileSystemChildren.OfType<DirectoryInfo>() + .Where(i => string.Equals(i.Name, "extras", StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, "specials", StringComparison.OrdinalIgnoreCase)) + .SelectMany(i => i.EnumerateFiles("*", SearchOption.TopDirectoryOnly)) + .ToList(); + + var extraTypes = new List<ExtraType> { ExtraType.BehindTheScenes, ExtraType.DeletedScene, ExtraType.Interview, ExtraType.Sample, ExtraType.Scene, ExtraType.Clip }; + var suffixes = ExtraSuffixes.Where(i => extraTypes.Contains(i.Value)) + .Select(i => i.Key) + .ToList(); + + files.AddRange(fileSystemChildren.OfType<FileInfo>() + .Where(i => + { + var nameEithoutExtension = FileSystem.GetFileNameWithoutExtension(i); + + if (!suffixes.Any(s => nameEithoutExtension.EndsWith(s, StringComparison.OrdinalIgnoreCase))) + { + return false; + } + + return !string.Equals(Path, i.FullName, StringComparison.OrdinalIgnoreCase); + })); + + return LibraryManager.ResolvePaths<Video>(files, directoryService, null).Select(video => + { + // Try to retrieve it from the db. If we don't find it, use the resolved version + var dbItem = LibraryManager.GetItemById(video.Id) as Video; + + if (dbItem != null) + { + video = dbItem; + } + + if (video != null) + { + SetExtraTypeFromFilename(video); + } + return video; // Sort them so that the list can be easily compared for changes }).OrderBy(i => i.Path).ToList(); } + private void SetExtraTypeFromFilename(Video item) + { + var name = System.IO.Path.GetFileNameWithoutExtension(item.Path) ?? string.Empty; + + foreach (var suffix in ExtraSuffixes) + { + if (name.EndsWith(suffix.Key, StringComparison.OrdinalIgnoreCase)) + { + item.ExtraType = suffix.Value; + return; + } + } + + item.ExtraType = ExtraType.Clip; + } + /// <summary> /// Loads the theme songs. /// </summary> @@ -600,6 +689,11 @@ namespace MediaBrowser.Controller.Entities audio = dbItem; } + if (audio != null) + { + audio.ExtraType = ExtraType.ThemeSong; + } + return audio; // Sort them so that the list can be easily compared for changes @@ -626,6 +720,11 @@ namespace MediaBrowser.Controller.Entities item = dbItem; } + if (item != null) + { + item.ExtraType = ExtraType.ThemeVideo; + } + return item; // Sort them so that the list can be easily compared for changes diff --git a/MediaBrowser.Controller/Entities/Extensions.cs b/MediaBrowser.Controller/Entities/Extensions.cs index 2a64bd3a41..5e792a03a4 100644 --- a/MediaBrowser.Controller/Entities/Extensions.cs +++ b/MediaBrowser.Controller/Entities/Extensions.cs @@ -25,16 +25,11 @@ namespace MediaBrowser.Controller.Entities var current = item.RemoteTrailers.FirstOrDefault(i => string.Equals(i.Url, url, StringComparison.OrdinalIgnoreCase)); - if (current != null) - { - current.IsDirectLink = isDirectLink; - } - else + if (current == null) { item.RemoteTrailers.Add(new MediaUrl { - Url = url, - IsDirectLink = isDirectLink + Url = url }); } } diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 837f3b9cf6..8d2f19d4c1 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -125,7 +125,7 @@ namespace MediaBrowser.Controller.Entities.Movies return hasChanges; } - private async Task<bool> RefreshSpecialFeatures(MetadataRefreshOptions options, IEnumerable<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) + private async Task<bool> RefreshSpecialFeatures(MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) { var newItems = LoadSpecialFeatures(fileSystemChildren, options.DirectoryService).ToList(); var newItemIds = newItems.Select(i => i.Id).ToList(); @@ -141,32 +141,6 @@ namespace MediaBrowser.Controller.Entities.Movies return itemsChanged; } - /// <summary> - /// Loads the special features. - /// </summary> - /// <returns>IEnumerable{Video}.</returns> - private IEnumerable<Video> LoadSpecialFeatures(IEnumerable<FileSystemInfo> fileSystemChildren, IDirectoryService directoryService) - { - var files = fileSystemChildren.OfType<DirectoryInfo>() - .Where(i => string.Equals(i.Name, "extras", StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, "specials", StringComparison.OrdinalIgnoreCase)) - .SelectMany(i => i.EnumerateFiles("*", SearchOption.TopDirectoryOnly)); - - return LibraryManager.ResolvePaths<Video>(files, directoryService, null).Select(video => - { - // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = LibraryManager.GetItemById(video.Id) as Video; - - if (dbItem != null) - { - video = dbItem; - } - - return video; - - // Sort them so that the list can be easily compared for changes - }).OrderBy(i => i.Path).ToList(); - } - protected override bool GetBlockUnratedValue(UserConfiguration config) { return config.BlockUnratedItems.Contains(UnratedItem.Movie); diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 492a4a02f9..59649de7f8 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -41,6 +41,7 @@ namespace MediaBrowser.Controller.Entities public string Container { get; set; } public int? TotalBitrate { get; set; } public string ShortOverview { get; set; } + public ExtraType ExtraType { get; set; } /// <summary> /// Gets or sets the timestamp. |
