diff options
Diffstat (limited to 'MediaBrowser.Controller')
76 files changed, 658 insertions, 795 deletions
diff --git a/MediaBrowser.Controller/Channels/Channel.cs b/MediaBrowser.Controller/Channels/Channel.cs index f0328a1d88..839b7d68f5 100644 --- a/MediaBrowser.Controller/Channels/Channel.cs +++ b/MediaBrowser.Controller/Channels/Channel.cs @@ -10,8 +10,6 @@ namespace MediaBrowser.Controller.Channels { public class Channel : Folder { - public string OriginalChannelName { get; set; } - public override bool IsVisible(User user) { if (user.Policy.BlockedChannels != null) diff --git a/MediaBrowser.Controller/Channels/ChannelAudioItem.cs b/MediaBrowser.Controller/Channels/ChannelAudioItem.cs index aa4b6731c7..653cec9016 100644 --- a/MediaBrowser.Controller/Channels/ChannelAudioItem.cs +++ b/MediaBrowser.Controller/Channels/ChannelAudioItem.cs @@ -7,24 +7,15 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Users; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Threading; namespace MediaBrowser.Controller.Channels { public class ChannelAudioItem : Audio, IChannelMediaItem { - public string ExternalId { get; set; } - - public string DataVersion { get; set; } - - public ChannelItemType ChannelItemType { get; set; } - - public bool IsInfiniteStream { get; set; } - public ChannelMediaContentType ContentType { get; set; } - public string OriginalImageUrl { get; set; } - public List<ChannelMediaInfo> ChannelMediaSources { get; set; } protected override bool GetBlockUnratedValue(UserPolicy config) @@ -37,6 +28,7 @@ namespace MediaBrowser.Controller.Channels return ExternalId; } + [IgnoreDataMember] public override bool SupportsLocalMetadata { get @@ -55,6 +47,7 @@ namespace MediaBrowser.Controller.Channels ChannelMediaSources = new List<ChannelMediaInfo>(); } + [IgnoreDataMember] public override LocationType LocationType { get diff --git a/MediaBrowser.Controller/Channels/ChannelFolderItem.cs b/MediaBrowser.Controller/Channels/ChannelFolderItem.cs index 7e9da52a92..9010470f8f 100644 --- a/MediaBrowser.Controller/Channels/ChannelFolderItem.cs +++ b/MediaBrowser.Controller/Channels/ChannelFolderItem.cs @@ -3,28 +3,24 @@ using MediaBrowser.Model.Channels; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Users; using System; +using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Channels { public class ChannelFolderItem : Folder, IChannelItem { - public string ExternalId { get; set; } - - public string DataVersion { get; set; } - - public ChannelItemType ChannelItemType { get; set; } public ChannelFolderType ChannelFolderType { get; set; } - public string OriginalImageUrl { get; set; } - protected override bool GetBlockUnratedValue(UserPolicy config) { // Don't block. return false; } + [IgnoreDataMember] public override bool SupportsLocalMetadata { get diff --git a/MediaBrowser.Controller/Channels/ChannelVideoItem.cs b/MediaBrowser.Controller/Channels/ChannelVideoItem.cs index ca5e343f8c..fb545e57aa 100644 --- a/MediaBrowser.Controller/Channels/ChannelVideoItem.cs +++ b/MediaBrowser.Controller/Channels/ChannelVideoItem.cs @@ -8,24 +8,15 @@ using MediaBrowser.Model.Users; using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Runtime.Serialization; using System.Threading; namespace MediaBrowser.Controller.Channels { public class ChannelVideoItem : Video, IChannelMediaItem, IHasLookupInfo<ChannelItemLookupInfo> { - public string ExternalId { get; set; } - - public string DataVersion { get; set; } - - public ChannelItemType ChannelItemType { get; set; } - - public bool IsInfiniteStream { get; set; } - public ChannelMediaContentType ContentType { get; set; } - public string OriginalImageUrl { get; set; } - public List<ChannelMediaInfo> ChannelMediaSources { get; set; } protected override string CreateUserDataKey() @@ -56,6 +47,7 @@ namespace MediaBrowser.Controller.Channels return config.BlockUnratedItems.Contains(UnratedItem.ChannelContent); } + [IgnoreDataMember] public override bool SupportsLocalMetadata { get @@ -74,6 +66,7 @@ namespace MediaBrowser.Controller.Channels ChannelMediaSources = new List<ChannelMediaInfo>(); } + [IgnoreDataMember] public override LocationType LocationType { get @@ -115,7 +108,11 @@ namespace MediaBrowser.Controller.Channels var info = GetItemLookupInfo<ChannelItemLookupInfo>(); info.ContentType = ContentType; - info.ExtraType = ExtraType; + + if (ExtraType.HasValue) + { + info.ExtraType = ExtraType.Value; + } return info; } diff --git a/MediaBrowser.Controller/Channels/IChannelFactory.cs b/MediaBrowser.Controller/Channels/IChannelFactory.cs deleted file mode 100644 index c7ed925866..0000000000 --- a/MediaBrowser.Controller/Channels/IChannelFactory.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; - -namespace MediaBrowser.Controller.Channels -{ - public interface IChannelFactory - { - IEnumerable<IChannel> GetChannels(); - } - - public interface IFactoryChannel - { - - } -}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/IChannelItem.cs b/MediaBrowser.Controller/Channels/IChannelItem.cs index 7eb865b5bd..9b5f0359bd 100644 --- a/MediaBrowser.Controller/Channels/IChannelItem.cs +++ b/MediaBrowser.Controller/Channels/IChannelItem.cs @@ -7,11 +7,5 @@ namespace MediaBrowser.Controller.Channels string ChannelId { get; set; } string ExternalId { get; set; } - - ChannelItemType ChannelItemType { get; set; } - - string OriginalImageUrl { get; set; } - - string DataVersion { get; set; } } } diff --git a/MediaBrowser.Controller/Channels/IChannelManager.cs b/MediaBrowser.Controller/Channels/IChannelManager.cs index 8d3e0f5962..fec550df8b 100644 --- a/MediaBrowser.Controller/Channels/IChannelManager.cs +++ b/MediaBrowser.Controller/Channels/IChannelManager.cs @@ -16,7 +16,7 @@ namespace MediaBrowser.Controller.Channels /// </summary> /// <param name="channels">The channels.</param> /// <param name="factories">The factories.</param> - void AddParts(IEnumerable<IChannel> channels, IEnumerable<IChannelFactory> factories); + void AddParts(IEnumerable<IChannel> channels); /// <summary> /// Gets the channel download path. diff --git a/MediaBrowser.Controller/Channels/IChannelMediaItem.cs b/MediaBrowser.Controller/Channels/IChannelMediaItem.cs index 50df07e72b..60a29da90b 100644 --- a/MediaBrowser.Controller/Channels/IChannelMediaItem.cs +++ b/MediaBrowser.Controller/Channels/IChannelMediaItem.cs @@ -11,7 +11,7 @@ namespace MediaBrowser.Controller.Channels ChannelMediaContentType ContentType { get; set; } - ExtraType ExtraType { get; set; } + ExtraType? ExtraType { get; set; } List<ChannelMediaInfo> ChannelMediaSources { get; set; } } diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs index aeb8173921..e1e98857ff 100644 --- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs +++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs @@ -28,17 +28,17 @@ namespace MediaBrowser.Controller.Drawing /// <summary> /// Gets the size of the image. /// </summary> - /// <param name="path">The path.</param> + /// <param name="info">The information.</param> /// <returns>ImageSize.</returns> - ImageSize GetImageSize(string path); + ImageSize GetImageSize(ItemImageInfo info); /// <summary> /// Gets the size of the image. /// </summary> - /// <param name="info">The information.</param> + /// <param name="path">The path.</param> /// <returns>ImageSize.</returns> - ImageSize GetImageSize(ItemImageInfo info); - + ImageSize GetImageSize(string path); + /// <summary> /// Adds the parts. /// </summary> @@ -105,5 +105,11 @@ namespace MediaBrowser.Controller.Drawing /// </summary> /// <param name="options">The options.</param> Task CreateImageCollage(ImageCollageOptions options); + + /// <summary> + /// Gets a value indicating whether [supports image collage creation]. + /// </summary> + /// <value><c>true</c> if [supports image collage creation]; otherwise, <c>false</c>.</value> + bool SupportsImageCollageCreation { get; } } } diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs index 66a0d551b2..14f8c1617a 100644 --- a/MediaBrowser.Controller/Entities/AggregateFolder.cs +++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs @@ -6,6 +6,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization; +using CommonIO; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Providers; namespace MediaBrowser.Controller.Entities @@ -62,7 +64,7 @@ namespace MediaBrowser.Controller.Entities public List<string> PhysicalLocationsList { get; set; } - protected override IEnumerable<FileSystemInfo> GetFileSystemChildren(IDirectoryService directoryService) + protected override IEnumerable<FileSystemMetadata> GetFileSystemChildren(IDirectoryService directoryService) { return CreateResolveArgs(directoryService).FileSystemChildren; } @@ -73,7 +75,7 @@ namespace MediaBrowser.Controller.Entities var args = new ItemResolveArgs(ConfigurationManager.ApplicationPaths , directoryService) { - FileInfo = new DirectoryInfo(path), + FileInfo = FileSystem.GetDirectoryInfo(path), Path = path, Parent = Parent }; @@ -94,7 +96,7 @@ namespace MediaBrowser.Controller.Entities { var paths = LibraryManager.NormalizeRootPathList(fileSystemDictionary.Keys); - fileSystemDictionary = paths.Select(i => (FileSystemInfo)new DirectoryInfo(i)).ToDictionary(i => i.FullName); + fileSystemDictionary = paths.Select(FileSystem.GetDirectoryInfo).ToDictionary(i => i.FullName); } args.FileSystemDictionary = fileSystemDictionary; diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 623329ca66..43b980c20d 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -24,14 +24,20 @@ namespace MediaBrowser.Controller.Entities.Audio IThemeMedia, IArchivable { - public string FormatName { get; set; } public long? Size { get; set; } public string Container { get; set; } public int? TotalBitrate { get; set; } public List<string> Tags { get; set; } - public ExtraType ExtraType { get; set; } + public ExtraType? ExtraType { get; set; } - public bool IsThemeMedia { get; set; } + [IgnoreDataMember] + public bool IsThemeMedia + { + get + { + return ExtraType.HasValue && ExtraType.Value == Model.Entities.ExtraType.ThemeSong; + } + } public Audio() { @@ -46,12 +52,6 @@ namespace MediaBrowser.Controller.Entities.Audio get { return LocationType == LocationType.FileSystem && RunTimeTicks.HasValue; } } - /// <summary> - /// Gets or sets a value indicating whether this instance has embedded image. - /// </summary> - /// <value><c>true</c> if this instance has embedded image; otherwise, <c>false</c>.</value> - public bool HasEmbeddedImage { get; set; } - [IgnoreDataMember] protected override bool SupportsOwnedItems { @@ -212,8 +212,7 @@ namespace MediaBrowser.Controller.Entities.Audio Path = enablePathSubstituion ? GetMappedPath(i.Path, locationType) : i.Path, RunTimeTicks = i.RunTimeTicks, Container = i.Container, - Size = i.Size, - Formats = (i.FormatName ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList() + Size = i.Size }; if (string.IsNullOrEmpty(info.Container)) diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 594b5ca93c..ec688bd9f4 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -23,6 +23,7 @@ using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; +using CommonIO; namespace MediaBrowser.Controller.Entities { @@ -38,7 +39,6 @@ namespace MediaBrowser.Controller.Entities ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); LockedFields = new List<MetadataFields>(); ImageInfos = new List<ItemImageInfo>(); - Identities = new List<IItemIdentity>(); } /// <summary> @@ -56,12 +56,16 @@ namespace MediaBrowser.Controller.Entities public static string ThemeSongFilename = "theme"; public static string ThemeVideosFolderName = "backdrops"; + public string PreferredMetadataCountryCode { get; set; } + public string PreferredMetadataLanguage { get; set; } + public List<ItemImageInfo> ImageInfos { get; set; } /// <summary> /// Gets or sets the channel identifier. /// </summary> /// <value>The channel identifier.</value> + [IgnoreDataMember] public string ChannelId { get; set; } [IgnoreDataMember] @@ -121,6 +125,12 @@ namespace MediaBrowser.Controller.Entities public Guid Id { get; set; } /// <summary> + /// Gets or sets a value indicating whether this instance is hd. + /// </summary> + /// <value><c>true</c> if this instance is hd; otherwise, <c>false</c>.</value> + public bool? IsHD { get; set; } + + /// <summary> /// Return the id that should be used to key display prefs for this item. /// Default is based on the type for everything except actual generic folders. /// </summary> @@ -162,6 +172,26 @@ namespace MediaBrowser.Controller.Entities } } + /// <summary> + /// Id of the program. + /// </summary> + [IgnoreDataMember] + public string ExternalId + { + get { return this.GetProviderId("ProviderExternalId"); } + set + { + this.SetProviderId("ProviderExternalId", value); + } + } + + /// <summary> + /// Gets or sets the etag. + /// </summary> + /// <value>The etag.</value> + [IgnoreDataMember] + public string ExternalEtag { get; set; } + [IgnoreDataMember] public virtual bool IsHidden { @@ -183,7 +213,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 && LocationType == LocationType.FileSystem; + return !IsFolder && ParentId == Guid.Empty && LocationType == LocationType.FileSystem; } } @@ -305,6 +335,9 @@ namespace MediaBrowser.Controller.Entities public DateTime DateLastSaved { get; set; } + [IgnoreDataMember] + public DateTime DateLastRefreshed { get; set; } + /// <summary> /// The logger /// </summary> @@ -331,30 +364,8 @@ namespace MediaBrowser.Controller.Entities return Name; } - /// <summary> - /// Returns true if this item should not attempt to fetch metadata - /// </summary> - /// <value><c>true</c> if [dont fetch meta]; otherwise, <c>false</c>.</value> - [Obsolete("Please use IsLocked instead of DontFetchMeta")] - public bool DontFetchMeta { get; set; } - - [IgnoreDataMember] - public bool IsLocked - { - get - { - return DontFetchMeta; - } - set - { - DontFetchMeta = value; - } - } - - public bool IsUnidentified { get; set; } - [IgnoreDataMember] - public List<IItemIdentity> Identities { get; set; } + public bool IsLocked { get; set; } /// <summary> /// Gets or sets the locked fields. @@ -484,7 +495,6 @@ namespace MediaBrowser.Controller.Entities public Guid ParentId { get; set; } - private Folder _parent; /// <summary> /// Gets or sets the parent. /// </summary> @@ -494,11 +504,6 @@ namespace MediaBrowser.Controller.Entities { get { - if (_parent != null) - { - return _parent; - } - if (ParentId != Guid.Empty) { return LibraryManager.GetItemById(ParentId) as Folder; @@ -506,12 +511,14 @@ namespace MediaBrowser.Controller.Entities return null; } - set { _parent = value; } + set + { + + } } public void SetParent(Folder parent) { - Parent = parent; ParentId = parent == null ? Guid.Empty : parent.Id; } @@ -558,6 +565,7 @@ namespace MediaBrowser.Controller.Entities /// Gets or sets the end date. /// </summary> /// <value>The end date.</value> + [IgnoreDataMember] public DateTime? EndDate { get; set; } /// <summary> @@ -582,6 +590,7 @@ namespace MediaBrowser.Controller.Entities /// Gets or sets the custom rating. /// </summary> /// <value>The custom rating.</value> + //[IgnoreDataMember] public string CustomRating { get; set; } /// <summary> @@ -591,12 +600,6 @@ namespace MediaBrowser.Controller.Entities public string Overview { get; set; } /// <summary> - /// Gets or sets the people. - /// </summary> - /// <value>The people.</value> - public List<PersonInfo> People { get; set; } - - /// <summary> /// Gets or sets the studios. /// </summary> /// <value>The studios.</value> @@ -618,6 +621,7 @@ namespace MediaBrowser.Controller.Entities /// Gets or sets the community rating. /// </summary> /// <value>The community rating.</value> + //[IgnoreDataMember] public float? CommunityRating { get; set; } /// <summary> @@ -643,6 +647,7 @@ namespace MediaBrowser.Controller.Entities /// This could be episode number, album track number, etc. /// </summary> /// <value>The index number.</value> + //[IgnoreDataMember] public int? IndexNumber { get; set; } /// <summary> @@ -662,7 +667,7 @@ namespace MediaBrowser.Controller.Entities { get { - if (!string.IsNullOrEmpty(CustomRating)) + if (!string.IsNullOrWhiteSpace(CustomRating)) { return CustomRating; } @@ -701,16 +706,16 @@ namespace MediaBrowser.Controller.Entities /// Loads the theme songs. /// </summary> /// <returns>List{Audio.Audio}.</returns> - private IEnumerable<Audio.Audio> LoadThemeSongs(List<FileSystemInfo> fileSystemChildren, IDirectoryService directoryService) + private IEnumerable<Audio.Audio> LoadThemeSongs(List<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService) { - var files = fileSystemChildren.OfType<DirectoryInfo>() + var files = fileSystemChildren.Where(i => i.IsDirectory) .Where(i => string.Equals(i.Name, ThemeSongsFolderName, StringComparison.OrdinalIgnoreCase)) - .SelectMany(i => i.EnumerateFiles("*", SearchOption.TopDirectoryOnly)) + .SelectMany(i => directoryService.GetFiles(i.FullName)) .ToList(); // Support plex/xbmc convention - files.AddRange(fileSystemChildren.OfType<FileInfo>() - .Where(i => string.Equals(FileSystem.GetFileNameWithoutExtension(i), ThemeSongFilename, StringComparison.OrdinalIgnoreCase)) + files.AddRange(fileSystemChildren + .Where(i => !i.IsDirectory && string.Equals(FileSystem.GetFileNameWithoutExtension(i), ThemeSongFilename, StringComparison.OrdinalIgnoreCase)) ); return LibraryManager.ResolvePaths(files, directoryService, null) @@ -737,11 +742,11 @@ namespace MediaBrowser.Controller.Entities /// Loads the video backdrops. /// </summary> /// <returns>List{Video}.</returns> - private IEnumerable<Video> LoadThemeVideos(IEnumerable<FileSystemInfo> fileSystemChildren, IDirectoryService directoryService) + private IEnumerable<Video> LoadThemeVideos(IEnumerable<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService) { - var files = fileSystemChildren.OfType<DirectoryInfo>() + var files = fileSystemChildren.Where(i => i.IsDirectory) .Where(i => string.Equals(i.Name, ThemeVideosFolderName, StringComparison.OrdinalIgnoreCase)) - .SelectMany(i => i.EnumerateFiles("*", SearchOption.TopDirectoryOnly)); + .SelectMany(i => directoryService.GetFiles(i.FullName)); return LibraryManager.ResolvePaths(files, directoryService, null) .OfType<Video>() @@ -765,7 +770,7 @@ namespace MediaBrowser.Controller.Entities public Task RefreshMetadata(CancellationToken cancellationToken) { - return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService()), cancellationToken); + return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(FileSystem)), cancellationToken); } /// <summary> @@ -786,7 +791,7 @@ namespace MediaBrowser.Controller.Entities { var files = locationType != LocationType.Remote && locationType != LocationType.Virtual ? GetFileSystemChildren(options.DirectoryService).ToList() : - new List<FileSystemInfo>(); + new List<FileSystemMetadata>(); var ownedItemsChanged = await RefreshedOwnedItems(options, files, cancellationToken).ConfigureAwait(false); @@ -833,7 +838,7 @@ namespace MediaBrowser.Controller.Entities /// <param name="fileSystemChildren"></param> /// <param name="cancellationToken"></param> /// <returns></returns> - protected virtual async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) + protected virtual async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken) { var themeSongsChanged = false; @@ -864,14 +869,14 @@ namespace MediaBrowser.Controller.Entities return themeSongsChanged || themeVideosChanged || localTrailersChanged; } - protected virtual IEnumerable<FileSystemInfo> GetFileSystemChildren(IDirectoryService directoryService) + protected virtual IEnumerable<FileSystemMetadata> GetFileSystemChildren(IDirectoryService directoryService) { var path = ContainingFolderPath; return directoryService.GetFileSystemEntries(path); } - private async Task<bool> RefreshLocalTrailers(IHasTrailers item, MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) + private async Task<bool> RefreshLocalTrailers(IHasTrailers item, MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken) { var newItems = LibraryManager.FindTrailers(this, fileSystemChildren, options.DirectoryService).ToList(); @@ -888,7 +893,7 @@ namespace MediaBrowser.Controller.Entities return itemsChanged; } - private async Task<bool> RefreshThemeVideos(IHasThemeMedia item, MetadataRefreshOptions options, IEnumerable<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) + private async Task<bool> RefreshThemeVideos(IHasThemeMedia item, MetadataRefreshOptions options, IEnumerable<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken) { var newThemeVideos = LoadThemeVideos(fileSystemChildren, options.DirectoryService).ToList(); @@ -902,7 +907,7 @@ namespace MediaBrowser.Controller.Entities if (!i.IsThemeMedia) { - i.IsThemeMedia = true; + i.ExtraType = ExtraType.ThemeVideo; subOptions.ForceSave = true; } @@ -919,7 +924,7 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Refreshes the theme songs. /// </summary> - private async Task<bool> RefreshThemeSongs(IHasThemeMedia item, MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) + private async Task<bool> RefreshThemeSongs(IHasThemeMedia item, MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken) { var newThemeSongs = LoadThemeSongs(fileSystemChildren, options.DirectoryService).ToList(); var newThemeSongIds = newThemeSongs.Select(i => i.Id).ToList(); @@ -932,7 +937,7 @@ namespace MediaBrowser.Controller.Entities if (!i.IsThemeMedia) { - i.IsThemeMedia = true; + i.ExtraType = ExtraType.ThemeSong; subOptions.ForceSave = true; } @@ -999,18 +1004,11 @@ namespace MediaBrowser.Controller.Entities /// <returns>System.String.</returns> public string GetPreferredMetadataLanguage() { - string lang = null; - - var hasLang = this as IHasPreferredMetadataLanguage; - - if (hasLang != null) - { - lang = hasLang.PreferredMetadataLanguage; - } + string lang = PreferredMetadataLanguage; if (string.IsNullOrWhiteSpace(lang)) { - lang = Parents.OfType<IHasPreferredMetadataLanguage>() + lang = Parents .Select(i => i.PreferredMetadataLanguage) .FirstOrDefault(i => !string.IsNullOrWhiteSpace(i)); } @@ -1036,18 +1034,11 @@ namespace MediaBrowser.Controller.Entities /// <returns>System.String.</returns> public string GetPreferredMetadataCountryCode() { - string lang = null; - - var hasLang = this as IHasPreferredMetadataLanguage; - - if (hasLang != null) - { - lang = hasLang.PreferredMetadataCountryCode; - } + string lang = PreferredMetadataCountryCode; if (string.IsNullOrWhiteSpace(lang)) { - lang = Parents.OfType<IHasPreferredMetadataLanguage>() + lang = Parents .Select(i => i.PreferredMetadataCountryCode) .FirstOrDefault(i => !string.IsNullOrWhiteSpace(i)); } @@ -1114,7 +1105,14 @@ namespace MediaBrowser.Controller.Entities // Could not determine the integer value if (!value.HasValue) { - return true; + var isAllowed = !GetBlockUnratedValue(user.Policy); + + if (!isAllowed) + { + Logger.Debug("{0} has an unrecognized parental rating of {1}.", Name, rating); + } + + return isAllowed; } return value.Value <= maxAllowedRating.Value; @@ -1165,6 +1163,17 @@ namespace MediaBrowser.Controller.Entities /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> protected virtual bool GetBlockUnratedValue(UserPolicy config) { + // Don't block plain folders that are unrated. Let the media underneath get blocked + // Special folders like series and albums will override this method. + if (IsFolder) + { + return false; + } + if (this is IItemByName) + { + return false; + } + return config.BlockUnratedItems.Contains(UnratedItem.Other); } @@ -1418,7 +1427,7 @@ namespace MediaBrowser.Controller.Entities /// <returns>Task.</returns> public virtual Task ChangedExternally() { - ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions()); + ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions(FileSystem)); return Task.FromResult(true); } @@ -1434,7 +1443,24 @@ namespace MediaBrowser.Controller.Entities return GetImageInfo(type, imageIndex) != null; } - public void SetImagePath(ImageType type, int index, FileSystemInfo file) + public void SetImage(ItemImageInfo image, int index) + { + if (image.Type == ImageType.Chapter) + { + throw new ArgumentException("Cannot set chapter images using SetImagePath"); + } + + var existingImage = GetImageInfo(image.Type, index); + + if (existingImage != null) + { + ImageInfos.Remove(existingImage); + } + + ImageInfos.Add(image); + } + + public void SetImagePath(ImageType type, int index, FileSystemMetadata file) { if (type == ImageType.Chapter) { @@ -1475,18 +1501,21 @@ namespace MediaBrowser.Controller.Entities // Remove it from the item RemoveImage(info); - // Delete the source file - var currentFile = new FileInfo(info.Path); - - // Deletion will fail if the file is hidden so remove the attribute first - if (currentFile.Exists) + if (info.IsLocalFile) { - if ((currentFile.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) + // Delete the source file + var currentFile = new FileInfo(info.Path); + + // Deletion will fail if the file is hidden so remove the attribute first + if (currentFile.Exists) { - currentFile.Attributes &= ~FileAttributes.Hidden; - } + if ((currentFile.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) + { + currentFile.Attributes &= ~FileAttributes.Hidden; + } - FileSystem.DeleteFile(currentFile.FullName); + FileSystem.DeleteFile(currentFile.FullName); + } } return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); @@ -1507,11 +1536,16 @@ namespace MediaBrowser.Controller.Entities /// </summary> public bool ValidateImages(IDirectoryService directoryService) { - var allDirectories = ImageInfos.Select(i => System.IO.Path.GetDirectoryName(i.Path)).Distinct(StringComparer.OrdinalIgnoreCase).ToList(); - var allFiles = allDirectories.SelectMany(directoryService.GetFiles).Select(i => i.FullName).ToList(); + var allFiles = ImageInfos + .Where(i => i.IsLocalFile) + .Select(i => System.IO.Path.GetDirectoryName(i.Path)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .SelectMany(directoryService.GetFiles) + .Select(i => i.FullName) + .ToList(); var deletedImages = ImageInfos - .Where(image => !allFiles.Contains(image.Path, StringComparer.OrdinalIgnoreCase)) + .Where(image => image.IsLocalFile && !allFiles.Contains(image.Path, StringComparer.OrdinalIgnoreCase)) .ToList(); if (deletedImages.Count > 0) @@ -1584,11 +1618,6 @@ namespace MediaBrowser.Controller.Entities return ImageInfos.Where(i => i.Type == imageType); } - public bool AddImages(ImageType imageType, IEnumerable<FileInfo> images) - { - return AddImages(imageType, images.Cast<FileSystemInfo>().ToList()); - } - /// <summary> /// Adds the images. /// </summary> @@ -1596,7 +1625,7 @@ namespace MediaBrowser.Controller.Entities /// <param name="images">The images.</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> /// <exception cref="System.ArgumentException">Cannot call AddImages with chapter images</exception> - public bool AddImages(ImageType imageType, List<FileSystemInfo> images) + public bool AddImages(ImageType imageType, List<FileSystemMetadata> images) { if (imageType == ImageType.Chapter) { @@ -1606,7 +1635,7 @@ namespace MediaBrowser.Controller.Entities var existingImages = GetImages(imageType) .ToList(); - var newImageList = new List<FileSystemInfo>(); + var newImageList = new List<FileSystemMetadata>(); var imageAdded = false; foreach (var newImage in images) @@ -1626,7 +1655,10 @@ namespace MediaBrowser.Controller.Entities } else { - existing.DateModified = FileSystem.GetLastWriteTimeUtc(newImage); + if (existing.IsLocalFile) + { + existing.DateModified = FileSystem.GetLastWriteTimeUtc(newImage); + } } } @@ -1635,7 +1667,7 @@ namespace MediaBrowser.Controller.Entities var newImagePaths = images.Select(i => i.FullName).ToList(); var deleted = existingImages - .Where(i => !newImagePaths.Contains(i.Path, StringComparer.OrdinalIgnoreCase) && !File.Exists(i.Path)) + .Where(i => i.IsLocalFile && !newImagePaths.Contains(i.Path, StringComparer.OrdinalIgnoreCase) && !FileSystem.FileExists(i.Path)) .ToList(); ImageInfos = ImageInfos.Except(deleted).ToList(); @@ -1646,7 +1678,7 @@ namespace MediaBrowser.Controller.Entities return newImageList.Count > 0; } - private ItemImageInfo GetImageInfo(FileSystemInfo file, ImageType type) + private ItemImageInfo GetImageInfo(FileSystemMetadata file, ImageType type) { return new ItemImageInfo { @@ -1686,6 +1718,12 @@ namespace MediaBrowser.Controller.Entities return Task.FromResult(true); } + if (!info1.IsLocalFile || !info2.IsLocalFile) + { + // TODO: Not supported yet + return Task.FromResult(true); + } + var path1 = info1.Path; var path2 = info2.Path; @@ -1769,7 +1807,7 @@ namespace MediaBrowser.Controller.Entities { foreach (var map in ConfigurationManager.Configuration.PathSubstitutions) { - path = FileSystem.SubstitutePath(path, map.From, map.To); + path = LibraryManager.SubstitutePath(path, map.From, map.To); } } @@ -1810,7 +1848,7 @@ namespace MediaBrowser.Controller.Entities if (video == null) { - video = LibraryManager.ResolvePath(new FileInfo(path)) as Video; + video = LibraryManager.ResolvePath(FileSystem.GetFileSystemInfo(path)) as Video; newOptions.ForceSave = true; } diff --git a/MediaBrowser.Controller/Entities/Book.cs b/MediaBrowser.Controller/Entities/Book.cs index e59db67a6a..d31675baf6 100644 --- a/MediaBrowser.Controller/Entities/Book.cs +++ b/MediaBrowser.Controller/Entities/Book.cs @@ -7,7 +7,7 @@ using MediaBrowser.Model.Users; namespace MediaBrowser.Controller.Entities { - public class Book : BaseItem, IHasTags, IHasPreferredMetadataLanguage, IHasLookupInfo<BookInfo>, IHasSeries + public class Book : BaseItem, IHasTags, IHasLookupInfo<BookInfo>, IHasSeries { public override string MediaType { @@ -25,14 +25,6 @@ namespace MediaBrowser.Controller.Entities public string SeriesName { get; set; } - public string PreferredMetadataLanguage { get; set; } - - /// <summary> - /// Gets or sets the preferred metadata country code. - /// </summary> - /// <value>The preferred metadata country code.</value> - public string PreferredMetadataCountryCode { get; set; } - public Book() { Tags = new List<string>(); diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs index 8821f35c8b..946d95a0bb 100644 --- a/MediaBrowser.Controller/Entities/CollectionFolder.cs +++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs @@ -8,6 +8,8 @@ using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Entities { @@ -80,7 +82,7 @@ namespace MediaBrowser.Controller.Entities public List<string> PhysicalLocationsList { get; set; } - protected override IEnumerable<FileSystemInfo> GetFileSystemChildren(IDirectoryService directoryService) + protected override IEnumerable<FileSystemMetadata> GetFileSystemChildren(IDirectoryService directoryService) { return CreateResolveArgs(directoryService).FileSystemChildren; } @@ -107,7 +109,7 @@ namespace MediaBrowser.Controller.Entities var args = new ItemResolveArgs(ConfigurationManager.ApplicationPaths, directoryService) { - FileInfo = new DirectoryInfo(path), + FileInfo = FileSystem.GetDirectoryInfo(path), Path = path, Parent = Parent, CollectionType = CollectionType @@ -129,7 +131,7 @@ namespace MediaBrowser.Controller.Entities { var paths = LibraryManager.NormalizeRootPathList(fileSystemDictionary.Keys); - fileSystemDictionary = paths.Select(i => (FileSystemInfo)new DirectoryInfo(i)).ToDictionary(i => i.FullName); + fileSystemDictionary = paths.Select(FileSystem.GetDirectoryInfo).ToDictionary(i => i.FullName); } args.FileSystemDictionary = fileSystemDictionary; diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index c3ac77328d..05965e1b5a 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -13,13 +13,15 @@ using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Entities { /// <summary> /// Class Folder /// </summary> - public class Folder : BaseItem, IHasThemeMedia, IHasTags, IHasPreferredMetadataLanguage + public class Folder : BaseItem, IHasThemeMedia, IHasTags { public static IUserManager UserManager { get; set; } public static IUserViewManager UserViewManager { get; set; } @@ -28,14 +30,6 @@ namespace MediaBrowser.Controller.Entities public List<Guid> ThemeVideoIds { get; set; } public List<string> Tags { get; set; } - public string PreferredMetadataLanguage { get; set; } - - /// <summary> - /// Gets or sets the preferred metadata country code. - /// </summary> - /// <value>The preferred metadata country code.</value> - public string PreferredMetadataCountryCode { get; set; } - public Folder() { LinkedChildren = new List<LinkedChild>(); @@ -48,7 +42,7 @@ namespace MediaBrowser.Controller.Entities [IgnoreDataMember] public virtual bool IsPreSorted { - get { return ConfigurationManager.Configuration.EnableWindowsShortcuts; } + get { return false; } } /// <summary> @@ -120,7 +114,7 @@ namespace MediaBrowser.Controller.Entities [IgnoreDataMember] protected virtual bool SupportsShortcutChildren { - get { return false; } + get { return ConfigurationManager.Configuration.EnableWindowsShortcuts; } } /// <summary> @@ -213,7 +207,7 @@ namespace MediaBrowser.Controller.Entities return base.OfficialRatingForComparison; } - return !string.IsNullOrEmpty(base.OfficialRatingForComparison) ? base.OfficialRatingForComparison : "None"; + return !string.IsNullOrWhiteSpace(base.OfficialRatingForComparison) ? base.OfficialRatingForComparison : "None"; } } @@ -320,7 +314,7 @@ namespace MediaBrowser.Controller.Entities [IgnoreDataMember] public IEnumerable<BaseItem> Children { - get { return ActualChildren; } + get { return ActualChildren.ToList(); } } /// <summary> @@ -371,7 +365,7 @@ namespace MediaBrowser.Controller.Entities public Task ValidateChildren(IProgress<double> progress, CancellationToken cancellationToken) { - return ValidateChildren(progress, cancellationToken, new MetadataRefreshOptions(new DirectoryService())); + return ValidateChildren(progress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(FileSystem))); } /// <summary> @@ -474,7 +468,7 @@ namespace MediaBrowser.Controller.Entities currentChild.DateModified = child.DateModified; } - currentChild.IsOffline = false; + await UpdateIsOffline(currentChild, false).ConfigureAwait(false); validChildren.Add(currentChild); } else @@ -509,12 +503,12 @@ namespace MediaBrowser.Controller.Entities else if (!string.IsNullOrEmpty(item.Path) && IsPathOffline(item.Path)) { - item.IsOffline = true; + await UpdateIsOffline(item, true).ConfigureAwait(false); validChildren.Add(item); } else { - item.IsOffline = false; + await UpdateIsOffline(item, false).ConfigureAwait(false); actualRemovals.Add(item); } } @@ -569,6 +563,17 @@ namespace MediaBrowser.Controller.Entities progress.Report(100); } + private Task UpdateIsOffline(BaseItem item, bool newValue) + { + if (item.IsOffline != newValue) + { + item.IsOffline = newValue; + return item.UpdateToRepository(ItemUpdateType.None, CancellationToken.None); + } + + return Task.FromResult(true); + } + private async Task RefreshMetadataRecursive(MetadataRefreshOptions refreshOptions, bool recursive, IProgress<double> progress, CancellationToken cancellationToken) { var children = ActualChildren.ToList(); @@ -691,9 +696,9 @@ namespace MediaBrowser.Controller.Entities /// </summary> /// <param name="path">The path.</param> /// <returns><c>true</c> if the specified path is offline; otherwise, <c>false</c>.</returns> - private bool IsPathOffline(string path) + public static bool IsPathOffline(string path) { - if (File.Exists(path)) + if (FileSystem.FileExists(path)) { return false; } @@ -703,7 +708,7 @@ namespace MediaBrowser.Controller.Entities // Depending on whether the path is local or unc, it may return either null or '\' at the top while (!string.IsNullOrEmpty(path) && path.Length > 1) { - if (Directory.Exists(path)) + if (FileSystem.DirectoryExists(path)) { return false; } @@ -725,12 +730,12 @@ namespace MediaBrowser.Controller.Entities /// <param name="folders">The folders.</param> /// <param name="path">The path.</param> /// <returns><c>true</c> if the specified folders contains path; otherwise, <c>false</c>.</returns> - private bool ContainsPath(IEnumerable<VirtualFolderInfo> folders, string path) + private static bool ContainsPath(IEnumerable<VirtualFolderInfo> folders, string path) { return folders.SelectMany(i => i.Locations).Any(i => ContainsPath(i, path)); } - private bool ContainsPath(string parent, string path) + private static bool ContainsPath(string parent, string path) { return string.Equals(parent, path, StringComparison.OrdinalIgnoreCase) || FileSystem.ContainsSubPath(parent, path); } @@ -752,21 +757,24 @@ namespace MediaBrowser.Controller.Entities /// <returns>IEnumerable{BaseItem}.</returns> protected IEnumerable<BaseItem> GetCachedChildren() { - var childrenItems = ItemRepository.GetChildrenItems(Id).Select(RetrieveChild).Where(i => i != null); - - //var children = ItemRepository.GetChildren(Id).Select(RetrieveChild).Where(i => i != null).ToList(); - - //if (children.Count != childrenItems.Count) - //{ - // var b = this; - //} + if (ConfigurationManager.Configuration.DisableStartupScan) + { + return ItemRepository.GetChildrenItems(Id).Select(RetrieveChild).Where(i => i != null); + //return ItemRepository.GetItems(new InternalItemsQuery + //{ + // ParentId = Id - return childrenItems; + //}).Items.Select(RetrieveChild).Where(i => i != null); + } + else + { + return ItemRepository.GetChildrenItems(Id).Select(RetrieveChild).Where(i => i != null); + } } private BaseItem RetrieveChild(BaseItem child) { - if (child.Id == Guid.Empty) + if (child == null || child.Id == Guid.Empty) { Logger.Error("Item found with empty Id: " + (child.Path ?? child.Name)); return null; @@ -1064,7 +1072,7 @@ namespace MediaBrowser.Controller.Entities } } - protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) + protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken) { var changesFound = false; @@ -1085,7 +1093,7 @@ namespace MediaBrowser.Controller.Entities /// Refreshes the linked children. /// </summary> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> - private bool RefreshLinkedChildren(IEnumerable<FileSystemInfo> fileSystemChildren) + private bool RefreshLinkedChildren(IEnumerable<FileSystemMetadata> fileSystemChildren) { var currentManualLinks = LinkedChildren.Where(i => i.Type == LinkedChildType.Manual).ToList(); var currentShortcutLinks = LinkedChildren.Where(i => i.Type == LinkedChildType.Shortcut).ToList(); @@ -1170,9 +1178,16 @@ namespace MediaBrowser.Controller.Entities DateTime? datePlayed, bool resetPosition) { + var itemsResult = await GetItems(new InternalItemsQuery + { + User = user, + Recursive = true, + IsFolder = false + + }).ConfigureAwait(false); + // Sweep through recursively and update status - var tasks = GetRecursiveChildren(user, i => !i.IsFolder && i.LocationType != LocationType.Virtual) - .Select(c => c.MarkPlayed(user, datePlayed, resetPosition)); + var tasks = itemsResult.Items.Select(c => c.MarkPlayed(user, datePlayed, resetPosition)); await Task.WhenAll(tasks).ConfigureAwait(false); } @@ -1184,9 +1199,16 @@ namespace MediaBrowser.Controller.Entities /// <returns>Task.</returns> public override async Task MarkUnplayed(User user) { + var itemsResult = await GetItems(new InternalItemsQuery + { + User = user, + Recursive = true, + IsFolder = false + + }).ConfigureAwait(false); + // Sweep through recursively and update status - var tasks = GetRecursiveChildren(user, i => !i.IsFolder && i.LocationType != LocationType.Virtual) - .Select(c => c.MarkUnplayed(user)); + var tasks = itemsResult.Items.Select(c => c.MarkUnplayed(user)); await Task.WhenAll(tasks).ConfigureAwait(false); } diff --git a/MediaBrowser.Controller/Entities/Game.cs b/MediaBrowser.Controller/Entities/Game.cs index 15d2d755a8..ed3e85d586 100644 --- a/MediaBrowser.Controller/Entities/Game.cs +++ b/MediaBrowser.Controller/Entities/Game.cs @@ -8,19 +8,11 @@ using System.Linq; namespace MediaBrowser.Controller.Entities { - public class Game : BaseItem, IHasTrailers, IHasThemeMedia, IHasTags, IHasScreenshots, ISupportsPlaceHolders, IHasPreferredMetadataLanguage, IHasLookupInfo<GameInfo> + public class Game : BaseItem, IHasTrailers, IHasThemeMedia, IHasTags, IHasScreenshots, ISupportsPlaceHolders, IHasLookupInfo<GameInfo> { public List<Guid> ThemeSongIds { get; set; } public List<Guid> ThemeVideoIds { get; set; } - public string PreferredMetadataLanguage { get; set; } - - /// <summary> - /// Gets or sets the preferred metadata country code. - /// </summary> - /// <value>The preferred metadata country code.</value> - public string PreferredMetadataCountryCode { get; set; } - public Game() { MultiPartGameFiles = new List<string>(); diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index ffb351c943..28835168a6 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -2,7 +2,11 @@ using MediaBrowser.Model.Entities; using System.Collections.Generic; using System.IO; +using System.Threading; using System.Threading.Tasks; +using CommonIO; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Library; namespace MediaBrowser.Controller.Entities { @@ -67,7 +71,7 @@ namespace MediaBrowser.Controller.Entities /// <param name="type">The type.</param> /// <param name="index">The index.</param> /// <param name="file">The file.</param> - void SetImagePath(ImageType type, int index, FileSystemInfo file); + void SetImagePath(ImageType type, int index, FileSystemMetadata file); /// <summary> /// Determines whether the specified type has image. @@ -134,7 +138,7 @@ namespace MediaBrowser.Controller.Entities /// <param name="imageType">Type of the image.</param> /// <param name="images">The images.</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> - bool AddImages(ImageType imageType, List<FileSystemInfo> images); + bool AddImages(ImageType imageType, List<FileSystemMetadata> images); /// <summary> /// Determines whether [is save local metadata enabled]. @@ -189,6 +193,21 @@ namespace MediaBrowser.Controller.Entities /// </summary> /// <param name="image">The image.</param> void RemoveImage(ItemImageInfo image); + + /// <summary> + /// Updates to repository. + /// </summary> + /// <param name="updateReason">The update reason.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); + + /// <summary> + /// Sets the image. + /// </summary> + /// <param name="image">The image.</param> + /// <param name="index">The index.</param> + void SetImage(ItemImageInfo image, int index); } public static class HasImagesExtensions @@ -215,7 +234,7 @@ namespace MediaBrowser.Controller.Entities /// <param name="item">The item.</param> /// <param name="imageType">Type of the image.</param> /// <param name="file">The file.</param> - public static void SetImagePath(this IHasImages item, ImageType imageType, FileSystemInfo file) + public static void SetImagePath(this IHasImages item, ImageType imageType, FileSystemMetadata file) { item.SetImagePath(imageType, 0, file); } @@ -228,7 +247,18 @@ namespace MediaBrowser.Controller.Entities /// <param name="file">The file.</param> public static void SetImagePath(this IHasImages item, ImageType imageType, string file) { - item.SetImagePath(imageType, new FileInfo(file)); + if (file.StartsWith("http", System.StringComparison.OrdinalIgnoreCase)) + { + item.SetImage(new ItemImageInfo + { + Path = file, + Type = imageType + }, 0); + } + else + { + item.SetImagePath(imageType, BaseItem.FileSystem.GetFileInfo(file)); + } } } } diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs index 158bcb6d19..473ee120ea 100644 --- a/MediaBrowser.Controller/Entities/IHasMetadata.cs +++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs @@ -31,13 +31,11 @@ namespace MediaBrowser.Controller.Entities DateTime DateLastSaved { get; set; } /// <summary> - /// Updates to repository. + /// Gets or sets the date last refreshed. /// </summary> - /// <param name="updateReason">The update reason.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); - + /// <value>The date last refreshed.</value> + DateTime DateLastRefreshed { get; set; } + /// <summary> /// This is called before any metadata refresh and returns true or false indicating if changes were made /// </summary> @@ -45,17 +43,6 @@ namespace MediaBrowser.Controller.Entities bool BeforeMetadataRefresh(); /// <summary> - /// Gets or sets a value indicating whether this instance is unidentified. - /// </summary> - /// <value><c>true</c> if this instance is unidentified; otherwise, <c>false</c>.</value> - bool IsUnidentified { get; set; } - - /// <summary> - /// Gets the item identities. - /// </summary> - List<IItemIdentity> Identities { get; set; } - - /// <summary> /// Afters the metadata refresh. /// </summary> void AfterMetadataRefresh(); diff --git a/MediaBrowser.Controller/Entities/IHasPreferredMetadataLanguage.cs b/MediaBrowser.Controller/Entities/IHasPreferredMetadataLanguage.cs deleted file mode 100644 index e3a233e49e..0000000000 --- a/MediaBrowser.Controller/Entities/IHasPreferredMetadataLanguage.cs +++ /dev/null @@ -1,21 +0,0 @@ - -namespace MediaBrowser.Controller.Entities -{ - /// <summary> - /// Interface IHasPreferredMetadataLanguage - /// </summary> - public interface IHasPreferredMetadataLanguage - { - /// <summary> - /// Gets or sets the preferred metadata language. - /// </summary> - /// <value>The preferred metadata language.</value> - string PreferredMetadataLanguage { get; set; } - - /// <summary> - /// Gets or sets the preferred metadata country code. - /// </summary> - /// <value>The preferred metadata country code.</value> - string PreferredMetadataCountryCode { get; set; } - } -} diff --git a/MediaBrowser.Controller/Entities/IHasProgramAttributes.cs b/MediaBrowser.Controller/Entities/IHasProgramAttributes.cs index 9938a44894..1c3270d72c 100644 --- a/MediaBrowser.Controller/Entities/IHasProgramAttributes.cs +++ b/MediaBrowser.Controller/Entities/IHasProgramAttributes.cs @@ -15,6 +15,6 @@ namespace MediaBrowser.Controller.Entities bool IsLive { get; set; } bool IsPremiere { get; set; } ProgramAudio? Audio { get; set; } - DateTime? OriginalAirDate { get; set; } + string EpisodeTitle { get; set; } } } diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs index 0af4972f74..785e2fd2bb 100644 --- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs +++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs @@ -52,7 +52,6 @@ namespace MediaBrowser.Controller.Entities public bool? IsHD { get; set; } public bool? IsInBoxSet { get; set; } public bool? IsLocked { get; set; } - public bool? IsUnidentified { get; set; } public bool? IsPlaceHolder { get; set; } public bool? IsYearMismatched { get; set; } @@ -98,7 +97,11 @@ namespace MediaBrowser.Controller.Entities public bool? IsCurrentSchema { get; set; } public bool? HasDeadParentId { get; set; } - + public bool? IsOffline { get; set; } + public LocationType? LocationType { get; set; } + + public Guid? ParentId { get; set; } + public InternalItemsQuery() { Tags = new string[] { }; diff --git a/MediaBrowser.Controller/Entities/ItemImageInfo.cs b/MediaBrowser.Controller/Entities/ItemImageInfo.cs index b36b818ffe..bb113e596d 100644 --- a/MediaBrowser.Controller/Entities/ItemImageInfo.cs +++ b/MediaBrowser.Controller/Entities/ItemImageInfo.cs @@ -1,5 +1,6 @@ using MediaBrowser.Model.Entities; using System; +using System.Runtime.Serialization; namespace MediaBrowser.Controller.Entities { @@ -22,5 +23,21 @@ namespace MediaBrowser.Controller.Entities /// </summary> /// <value>The date modified.</value> public DateTime DateModified { get; set; } + + [IgnoreDataMember] + public bool IsLocalFile + { + get + { + if (Path != null) + { + if (Path.StartsWith("http", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + } + return true; + } + } } } diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 083ec0cb4c..1a8148edfb 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -8,6 +8,8 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Entities.Movies { @@ -122,7 +124,7 @@ namespace MediaBrowser.Controller.Entities.Movies return key; } - protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) + protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken) { var hasChanges = await base.RefreshedOwnedItems(options, fileSystemChildren, cancellationToken).ConfigureAwait(false); @@ -141,7 +143,7 @@ namespace MediaBrowser.Controller.Entities.Movies return hasChanges; } - private async Task<bool> RefreshSpecialFeatures(MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) + private async Task<bool> RefreshSpecialFeatures(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken) { var newItems = LibraryManager.FindExtras(this, fileSystemChildren, options.DirectoryService).ToList(); var newItemIds = newItems.Select(i => i.Id).ToList(); diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index 5163c3de4a..92ca9e9703 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -296,9 +296,16 @@ namespace MediaBrowser.Controller.Entities.TV { var hasChanges = base.BeforeMetadataRefresh(); - if (LibraryManager.FillMissingEpisodeNumbersFromPath(this)) + try { - hasChanges = true; + if (LibraryManager.FillMissingEpisodeNumbersFromPath(this)) + { + hasChanges = true; + } + } + catch (Exception ex) + { + Logger.ErrorException("Error in FillMissingEpisodeNumbersFromPath. Episode: {0}", ex, Path ?? Name ?? Id.ToString()); } return hasChanges; diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index cfd6b46e0f..21b89d7a99 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -62,17 +62,13 @@ namespace MediaBrowser.Controller.Entities.TV } /// <summary> - /// The _series - /// </summary> - private Series _series; - /// <summary> /// This Episode's Series Instance /// </summary> /// <value>The series.</value> [IgnoreDataMember] public Series Series { - get { return _series ?? (_series = FindParent<Series>()); } + get { return FindParent<Series>(); } } [IgnoreDataMember] diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 2663d19e8f..b23833845e 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -20,7 +20,6 @@ namespace MediaBrowser.Controller.Entities.TV public List<Guid> SpecialFeatureIds { get; set; } public string OriginalTitle { get; set; } - public int SeasonCount { get; set; } public int? AnimeSeriesIndex { get; set; } diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs index f44128e2d6..6ec512783d 100644 --- a/MediaBrowser.Controller/Entities/Trailer.cs +++ b/MediaBrowser.Controller/Entities/Trailer.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Runtime.Serialization; +using MediaBrowser.Controller.Entities.Movies; namespace MediaBrowser.Controller.Entities { @@ -78,7 +79,7 @@ namespace MediaBrowser.Controller.Entities protected override string CreateUserDataKey() { - var key = this.GetProviderId(MetadataProviders.Imdb) ?? this.GetProviderId(MetadataProviders.Tmdb); + var key = Movie.GetMovieUserDataKey(this); if (!string.IsNullOrWhiteSpace(key)) { diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 71e3d1ce03..a9e314ede1 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -20,6 +20,7 @@ namespace MediaBrowser.Controller.Entities { public static IUserManager UserManager { get; set; } public static IXmlSerializer XmlSerializer { get; set; } + public bool EnableUserViews { get; set; } /// <summary> /// From now on all user paths will be Id-based. @@ -177,24 +178,24 @@ namespace MediaBrowser.Controller.Entities var oldConfigurationDirectory = ConfigurationDirectoryPath; // Exceptions will be thrown if these paths already exist - if (Directory.Exists(newConfigDirectory)) + if (FileSystem.DirectoryExists(newConfigDirectory)) { FileSystem.DeleteDirectory(newConfigDirectory, true); } - if (Directory.Exists(oldConfigurationDirectory)) + if (FileSystem.DirectoryExists(oldConfigurationDirectory)) { - Directory.Move(oldConfigurationDirectory, newConfigDirectory); + FileSystem.MoveDirectory(oldConfigurationDirectory, newConfigDirectory); } else { - Directory.CreateDirectory(newConfigDirectory); + FileSystem.CreateDirectory(newConfigDirectory); } } Name = newName; - return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService()) + return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(FileSystem)) { ReplaceAllMetadata = true, ImageRefreshMode = ImageRefreshMode.FullRefresh, diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs index 488e54cc3c..5ee49ae5a3 100644 --- a/MediaBrowser.Controller/Entities/UserView.cs +++ b/MediaBrowser.Controller/Entities/UserView.cs @@ -13,6 +13,7 @@ namespace MediaBrowser.Controller.Entities { public string ViewType { get; set; } public Guid ParentId { get; set; } + public Guid DisplayParentId { get; set; } public Guid? UserId { get; set; } @@ -28,7 +29,11 @@ namespace MediaBrowser.Controller.Entities { var parent = this as Folder; - if (ParentId != Guid.Empty) + if (DisplayParentId != Guid.Empty) + { + parent = LibraryManager.GetItemById(DisplayParentId) as Folder ?? parent; + } + else if (ParentId != Guid.Empty) { parent = LibraryManager.GetItemById(ParentId) as Folder ?? parent; } @@ -82,7 +87,28 @@ namespace MediaBrowser.Controller.Entities { CollectionType.Books, CollectionType.HomeVideos, - CollectionType.Photos + CollectionType.Photos, + CollectionType.Playlists, + CollectionType.BoxSets, + CollectionType.MusicVideos + }; + + var collectionFolder = folder as ICollectionFolder; + + if (collectionFolder == null) + { + return false; + } + + return standaloneTypes.Contains(collectionFolder.CollectionType ?? string.Empty); + } + + public static bool IsUserSpecific(Folder folder) + { + var standaloneTypes = new List<string> + { + CollectionType.Playlists, + CollectionType.BoxSets }; var collectionFolder = folder as ICollectionFolder; diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index cee5dadd25..f5800ce818 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -577,19 +577,9 @@ namespace MediaBrowser.Controller.Entities private async Task<QueryResult<BaseItem>> GetBoxsetView(Folder parent, User user, InternalItemsQuery query) { - return GetResult(GetMediaFolders(user).SelectMany(i => - { - var hasCollectionType = i as ICollectionFolder; - Func<BaseItem, bool> filter = b => b is BoxSet; - - if (hasCollectionType != null && string.Equals(hasCollectionType.CollectionType, CollectionType.BoxSets, StringComparison.OrdinalIgnoreCase)) - { - return i.GetChildren(user, true).Where(filter); - } - - return i.GetRecursiveChildren(user, filter); + var collections = _collectionManager.GetCollections(user); - }), parent, query); + return GetResult(collections, parent, query); } private async Task<QueryResult<BaseItem>> GetPhotosView(Folder queryParent, User user, InternalItemsQuery query) @@ -1041,11 +1031,6 @@ namespace MediaBrowser.Controller.Entities return false; } - if (request.IsUnidentified.HasValue) - { - return false; - } - if (request.IsYearMismatched.HasValue) { return false; @@ -1412,16 +1397,7 @@ namespace MediaBrowser.Controller.Entities var val = query.IsHD.Value; var video = item as Video; - if (video == null || val != video.IsHD) - { - return false; - } - } - - if (query.IsUnidentified.HasValue) - { - var val = query.IsUnidentified.Value; - if (item.IsUnidentified != val) + if (video == null || !video.IsHD.HasValue || val != video.IsHD) { return false; } @@ -1808,6 +1784,13 @@ namespace MediaBrowser.Controller.Entities private IEnumerable<Folder> GetMediaFolders(User user) { + if (user == null) + { + return _libraryManager.RootFolder + .Children + .OfType<Folder>() + .Where(i => !UserView.IsExcludedFromGrouping(i)); + } return user.RootFolder .GetChildren(user, true, true) .OfType<Folder>() @@ -1816,6 +1799,16 @@ namespace MediaBrowser.Controller.Entities private IEnumerable<Folder> GetMediaFolders(User user, IEnumerable<string> viewTypes) { + if (user == null) + { + return GetMediaFolders(null) + .Where(i => + { + var folder = i as ICollectionFolder; + + return folder != null && viewTypes.Contains(folder.CollectionType ?? string.Empty, StringComparer.OrdinalIgnoreCase); + }); + } return GetMediaFolders(user) .Where(i => { @@ -1839,9 +1832,19 @@ namespace MediaBrowser.Controller.Entities { if (parent == null || parent is UserView) { + if (user == null) + { + return GetMediaFolders(null, viewTypes).SelectMany(i => i.GetRecursiveChildren()); + } + return GetMediaFolders(user, viewTypes).SelectMany(i => i.GetRecursiveChildren(user)); } + if (user == null) + { + return parent.GetRecursiveChildren(); + } + return parent.GetRecursiveChildren(user); } @@ -1849,9 +1852,19 @@ namespace MediaBrowser.Controller.Entities { if (parent == null || parent is UserView) { + if (user == null) + { + return GetMediaFolders(null, viewTypes).SelectMany(i => i.GetRecursiveChildren(filter)); + } + return GetMediaFolders(user, viewTypes).SelectMany(i => i.GetRecursiveChildren(user, filter)); } + if (user == null) + { + return parent.GetRecursiveChildren(filter); + } + return parent.GetRecursiveChildren(user, filter); } diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 00dc5dc672..8beee79bf5 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -11,6 +11,8 @@ using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Entities { @@ -23,7 +25,6 @@ namespace MediaBrowser.Controller.Entities ISupportsPlaceHolders, IHasMediaSources, IHasShortOverview, - IHasPreferredMetadataLanguage, IThemeMedia, IArchivable { @@ -33,21 +34,20 @@ namespace MediaBrowser.Controller.Entities public List<string> LocalAlternateVersions { get; set; } public List<LinkedChild> LinkedAlternateVersions { get; set; } - public bool IsThemeMedia { get; set; } + [IgnoreDataMember] + public bool IsThemeMedia + { + get + { + return ExtraType.HasValue && ExtraType.Value == Model.Entities.ExtraType.ThemeVideo; + } + } - public string FormatName { get; set; } public long? Size { get; set; } 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 preferred metadata country code. - /// </summary> - /// <value>The preferred metadata country code.</value> - public string PreferredMetadataCountryCode { get; set; } - public string PreferredMetadataLanguage { get; set; } + public ExtraType? ExtraType { get; set; } /// <summary> /// Gets or sets the timestamp. @@ -313,7 +313,7 @@ namespace MediaBrowser.Controller.Entities /// <returns>List{System.String}.</returns> public List<string> GetPlayableStreamFiles(string rootPath) { - var allFiles = Directory.EnumerateFiles(rootPath, "*", SearchOption.AllDirectories).ToList(); + var allFiles = FileSystem.GetFilePaths(rootPath, true).ToList(); return PlayableStreamFileNames.Select(name => allFiles.FirstOrDefault(f => string.Equals(System.IO.Path.GetFileName(f), name, StringComparison.OrdinalIgnoreCase))) .Where(f => !string.IsNullOrEmpty(f)) @@ -330,8 +330,6 @@ namespace MediaBrowser.Controller.Entities get { return Video3DFormat.HasValue; } } - public bool IsHD { get; set; } - /// <summary> /// Gets the type of the media. /// </summary> @@ -345,7 +343,7 @@ namespace MediaBrowser.Controller.Entities } } - protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken) + protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken) { var hasChanges = await base.RefreshedOwnedItems(options, fileSystemChildren, cancellationToken).ConfigureAwait(false); @@ -498,7 +496,6 @@ namespace MediaBrowser.Controller.Entities VideoType = i.VideoType, Container = i.Container, Size = i.Size, - Formats = (i.FormatName ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(), Timestamp = i.Timestamp, Type = type, PlayableStreamFileNames = i.PlayableStreamFileNames.ToList(), diff --git a/MediaBrowser.Controller/IO/FileData.cs b/MediaBrowser.Controller/IO/FileData.cs index fb0f07331b..20dfc425e3 100644 --- a/MediaBrowser.Controller/IO/FileData.cs +++ b/MediaBrowser.Controller/IO/FileData.cs @@ -5,6 +5,7 @@ using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.IO; +using CommonIO; namespace MediaBrowser.Controller.IO { @@ -25,7 +26,7 @@ namespace MediaBrowser.Controller.IO /// <param name="resolveShortcuts">if set to <c>true</c> [resolve shortcuts].</param> /// <returns>Dictionary{System.StringFileSystemInfo}.</returns> /// <exception cref="System.ArgumentNullException">path</exception> - public static Dictionary<string, FileSystemInfo> GetFilteredFileSystemEntries(IDirectoryService directoryService, + public static Dictionary<string, FileSystemMetadata> GetFilteredFileSystemEntries(IDirectoryService directoryService, string path, IFileSystem fileSystem, ILogger logger, @@ -49,7 +50,7 @@ namespace MediaBrowser.Controller.IO var entries = directoryService.GetFileSystemEntries(path); - var dict = new Dictionary<string, FileSystemInfo>(StringComparer.OrdinalIgnoreCase); + var dict = new Dictionary<string, FileSystemMetadata>(StringComparer.OrdinalIgnoreCase); foreach (var entry in entries) { @@ -69,7 +70,7 @@ namespace MediaBrowser.Controller.IO } // Don't check if it exists here because that could return false for network shares. - var data = new DirectoryInfo(newPath); + var data = fileSystem.GetDirectoryInfo(newPath); // add to our physical locations args.AddAdditionalLocation(newPath); diff --git a/MediaBrowser.Controller/IServerApplicationHost.cs b/MediaBrowser.Controller/IServerApplicationHost.cs index d202e221e0..1b842a5f62 100644 --- a/MediaBrowser.Controller/IServerApplicationHost.cs +++ b/MediaBrowser.Controller/IServerApplicationHost.cs @@ -24,6 +24,12 @@ namespace MediaBrowser.Controller bool SupportsAutoRunAtStartup { get; } /// <summary> + /// Gets a value indicating whether [supports library monitor]. + /// </summary> + /// <value><c>true</c> if [supports library monitor]; otherwise, <c>false</c>.</value> + bool SupportsLibraryMonitor { get; } + + /// <summary> /// Gets the HTTP server port. /// </summary> /// <value>The HTTP server port.</value> diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 9331ca7598..c7ab88524f 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -11,6 +11,8 @@ using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Library { @@ -25,19 +27,18 @@ namespace MediaBrowser.Controller.Library /// <param name="fileInfo">The file information.</param> /// <param name="parent">The parent.</param> /// <returns>BaseItem.</returns> - BaseItem ResolvePath(FileSystemInfo fileInfo, + BaseItem ResolvePath(FileSystemMetadata fileInfo, Folder parent = null); /// <summary> /// Resolves a set of files into a list of BaseItem /// </summary> - /// <typeparam name="T"></typeparam> /// <param name="files">The files.</param> /// <param name="directoryService">The directory service.</param> /// <param name="parent">The parent.</param> /// <param name="collectionType">Type of the collection.</param> /// <returns>List{``0}.</returns> - IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemInfo> files, + IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemMetadata> files, IDirectoryService directoryService, Folder parent, string collectionType = null); @@ -385,6 +386,21 @@ namespace MediaBrowser.Controller.Library CancellationToken cancellationToken); /// <summary> + /// Gets the shadow view. + /// </summary> + /// <param name="parent">The parent.</param> + /// <param name="viewType">Type of the view.</param> + /// <param name="sortName">Name of the sort.</param> + /// <param name="uniqueId">The unique identifier.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task<UserView>.</returns> + Task<UserView> GetShadowView(BaseItem parent, + string viewType, + string sortName, + string uniqueId, + CancellationToken cancellationToken); + + /// <summary> /// Determines whether [is video file] [the specified path]. /// </summary> /// <param name="path">The path.</param> @@ -434,7 +450,7 @@ namespace MediaBrowser.Controller.Library /// <param name="fileSystemChildren">The file system children.</param> /// <param name="directoryService">The directory service.</param> /// <returns>IEnumerable<Trailer>.</returns> - IEnumerable<Video> FindTrailers(BaseItem owner, List<FileSystemInfo> fileSystemChildren, + IEnumerable<Video> FindTrailers(BaseItem owner, List<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService); /// <summary> @@ -444,7 +460,7 @@ namespace MediaBrowser.Controller.Library /// <param name="fileSystemChildren">The file system children.</param> /// <param name="directoryService">The directory service.</param> /// <returns>IEnumerable<Video>.</returns> - IEnumerable<Video> FindExtras(BaseItem owner, List<FileSystemInfo> fileSystemChildren, + IEnumerable<Video> FindExtras(BaseItem owner, List<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService); /// <summary> @@ -509,5 +525,23 @@ namespace MediaBrowser.Controller.Library /// <param name="query">The query.</param> /// <returns>QueryResult<BaseItem>.</returns> QueryResult<BaseItem> QueryItems(InternalItemsQuery query); + + /// <summary> + /// Substitutes the path. + /// </summary> + /// <param name="path">The path.</param> + /// <param name="from">From.</param> + /// <param name="to">To.</param> + /// <returns>System.String.</returns> + string SubstitutePath(string path, string from, string to); + + /// <summary> + /// Converts the image to local. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="image">The image.</param> + /// <param name="imageIndex">Index of the image.</param> + /// <returns>Task.</returns> + Task<ItemImageInfo> ConvertImageToLocal(IHasImages item, ItemImageInfo image, int imageIndex); } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Library/ItemResolveArgs.cs b/MediaBrowser.Controller/Library/ItemResolveArgs.cs index db441d285a..90158942fb 100644 --- a/MediaBrowser.Controller/Library/ItemResolveArgs.cs +++ b/MediaBrowser.Controller/Library/ItemResolveArgs.cs @@ -4,6 +4,8 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Library { @@ -35,7 +37,7 @@ namespace MediaBrowser.Controller.Library /// Gets the file system children. /// </summary> /// <value>The file system children.</value> - public IEnumerable<FileSystemInfo> FileSystemChildren + public IEnumerable<FileSystemMetadata> FileSystemChildren { get { @@ -43,7 +45,7 @@ namespace MediaBrowser.Controller.Library if (dict == null) { - return new List<FileSystemInfo>(); + return new List<FileSystemMetadata>(); } return dict.Values; @@ -54,7 +56,7 @@ namespace MediaBrowser.Controller.Library /// Gets or sets the file system dictionary. /// </summary> /// <value>The file system dictionary.</value> - public Dictionary<string, FileSystemInfo> FileSystemDictionary { get; set; } + public Dictionary<string, FileSystemMetadata> FileSystemDictionary { get; set; } /// <summary> /// Gets or sets the parent. @@ -66,7 +68,7 @@ namespace MediaBrowser.Controller.Library /// Gets or sets the file info. /// </summary> /// <value>The file info.</value> - public FileSystemInfo FileInfo { get; set; } + public FileSystemMetadata FileInfo { get; set; } /// <summary> /// Gets or sets the path. @@ -201,7 +203,7 @@ namespace MediaBrowser.Controller.Library /// <param name="name">The name.</param> /// <returns>FileSystemInfo.</returns> /// <exception cref="System.ArgumentNullException"></exception> - public FileSystemInfo GetFileSystemEntryByName(string name) + public FileSystemMetadata GetFileSystemEntryByName(string name) { if (string.IsNullOrEmpty(name)) { @@ -217,7 +219,7 @@ namespace MediaBrowser.Controller.Library /// <param name="path">The path.</param> /// <returns>FileSystemInfo.</returns> /// <exception cref="System.ArgumentNullException"></exception> - public FileSystemInfo GetFileSystemEntryByPath(string path) + public FileSystemMetadata GetFileSystemEntryByPath(string path) { if (string.IsNullOrEmpty(path)) { @@ -226,7 +228,7 @@ namespace MediaBrowser.Controller.Library if (FileSystemDictionary != null) { - FileSystemInfo entry; + FileSystemMetadata entry; if (FileSystemDictionary.TryGetValue(path, out entry)) { diff --git a/MediaBrowser.Controller/LiveTv/IListingsProvider.cs b/MediaBrowser.Controller/LiveTv/IListingsProvider.cs index e60183bd93..f5048bdda0 100644 --- a/MediaBrowser.Controller/LiveTv/IListingsProvider.cs +++ b/MediaBrowser.Controller/LiveTv/IListingsProvider.cs @@ -11,7 +11,7 @@ namespace MediaBrowser.Controller.LiveTv { string Name { get; } string Type { get; } - Task<IEnumerable<ProgramInfo>> GetProgramsAsync(ListingsProviderInfo info, string channelNumber, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken); + Task<IEnumerable<ProgramInfo>> GetProgramsAsync(ListingsProviderInfo info, string channelNumber, string channelName, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken); Task AddMetadata(ListingsProviderInfo info, List<ChannelInfo> channels, CancellationToken cancellationToken); Task Validate(ListingsProviderInfo info, bool validateLogin, bool validateListings); Task<List<NameIdPair>> GetLineups(ListingsProviderInfo info, string country, string location); diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index 1458c1bc2e..241b01405a 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -338,8 +338,9 @@ namespace MediaBrowser.Controller.LiveTv /// </summary> /// <param name="item">The item.</param> /// <param name="dto">The dto.</param> + /// <param name="addChannelInfo">if set to <c>true</c> [add channel information].</param> /// <param name="user">The user.</param> - void AddInfoToProgramDto(BaseItem item, BaseItemDto dto, User user = null); + void AddInfoToProgramDto(BaseItem item, BaseItemDto dto, bool addChannelInfo, User user = null); /// <summary> /// Saves the tuner host. /// </summary> diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs b/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs index ba0b82a0b6..5dc5f68cd2 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs @@ -12,7 +12,6 @@ namespace MediaBrowser.Controller.LiveTv public interface ILiveTvRecording : IHasImages, IHasMediaSources, IHasUserData, ILiveTvItem, IHasStartDate, IHasProgramAttributes { string ChannelId { get; } - string ProgramId { get; set; } string MediaType { get; } string Container { get; } @@ -31,16 +30,9 @@ namespace MediaBrowser.Controller.LiveTv bool CanDelete(User user); - string ProviderImagePath { get; set; } - - string ProviderImageUrl { get; set; } - - string ExternalId { get; set; } - string EpisodeTitle { get; set; } string SeriesTimerId { get; set; } RecordingStatus Status { get; set; } DateTime? EndDate { get; set; } - ChannelType ChannelType { get; set; } DateTime DateLastSaved { get; set; } DateTime DateCreated { get; set; } DateTime DateModified { get; set; } diff --git a/MediaBrowser.Controller/LiveTv/ITunerHost.cs b/MediaBrowser.Controller/LiveTv/ITunerHost.cs index bedbcffe32..2e3a71f703 100644 --- a/MediaBrowser.Controller/LiveTv/ITunerHost.cs +++ b/MediaBrowser.Controller/LiveTv/ITunerHost.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Model.Dto; +using System; +using MediaBrowser.Model.Dto; using MediaBrowser.Model.LiveTv; using System.Collections.Generic; using System.Threading; @@ -37,7 +38,7 @@ namespace MediaBrowser.Controller.LiveTv /// <param name="streamId">The stream identifier.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task<MediaSourceInfo>.</returns> - Task<MediaSourceInfo> GetChannelStream(string channelId, string streamId, CancellationToken cancellationToken); + Task<Tuple<MediaSourceInfo,SemaphoreSlim>> GetChannelStream(string channelId, string streamId, CancellationToken cancellationToken); /// <summary> /// Gets the channel stream media sources. /// </summary> diff --git a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs index 2179c5ecd7..03c05ec69b 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs @@ -14,26 +14,29 @@ namespace MediaBrowser.Controller.LiveTv { public class LiveTvAudioRecording : Audio, ILiveTvRecording { - public string ExternalId { get; set; } - public string ProviderImagePath { get; set; } - public string ProviderImageUrl { get; set; } + [IgnoreDataMember] public string EpisodeTitle { get; set; } + [IgnoreDataMember] public bool IsSeries { get; set; } public string SeriesTimerId { get; set; } + [IgnoreDataMember] public DateTime StartDate { get; set; } public RecordingStatus Status { get; set; } + [IgnoreDataMember] public bool IsSports { get; set; } + [IgnoreDataMember] public bool IsNews { get; set; } + [IgnoreDataMember] public bool IsKids { get; set; } + [IgnoreDataMember] public bool IsRepeat { get; set; } + [IgnoreDataMember] public bool IsMovie { get; set; } - public bool? IsHD { get; set; } + [IgnoreDataMember] public bool IsLive { get; set; } + [IgnoreDataMember] public bool IsPremiere { get; set; } - public ChannelType ChannelType { get; set; } - public string ProgramId { get; set; } public ProgramAudio? Audio { get; set; } - public DateTime? OriginalAirDate { get; set; } /// <summary> /// Gets the user data key. @@ -43,11 +46,6 @@ namespace MediaBrowser.Controller.LiveTv { var name = GetClientTypeName(); - if (!string.IsNullOrEmpty(ProgramId)) - { - return name + "-" + ProgramId; - } - return name + "-" + Name + (EpisodeTitle ?? string.Empty); } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs index cb10003ed8..89168c578d 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs @@ -47,12 +47,6 @@ namespace MediaBrowser.Controller.LiveTv public string Number { get; set; } /// <summary> - /// Gets or sets the external identifier. - /// </summary> - /// <value>The external identifier.</value> - public string ExternalId { get; set; } - - /// <summary> /// Gets or sets the type of the channel. /// </summary> /// <value>The type of the channel.</value> @@ -64,24 +58,7 @@ namespace MediaBrowser.Controller.LiveTv /// <value>The name of the service.</value> public string ServiceName { get; set; } - /// <summary> - /// Supply the image path if it can be accessed directly from the file system - /// </summary> - /// <value>The image path.</value> - public string ProviderImagePath { get; set; } - - /// <summary> - /// Supply the image url if it can be downloaded - /// </summary> - /// <value>The image URL.</value> - public string ProviderImageUrl { get; set; } - - /// <summary> - /// Gets or sets a value indicating whether this instance has image. - /// </summary> - /// <value><c>null</c> if [has image] contains no value, <c>true</c> if [has image]; otherwise, <c>false</c>.</value> - public bool? HasProviderImage { get; set; } - + [IgnoreDataMember] public override LocationType LocationType { get diff --git a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs index 12052905f2..e4b52fd994 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs @@ -7,6 +7,7 @@ using MediaBrowser.Model.Users; using System; using System.Linq; using System.Runtime.Serialization; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.LiveTv { @@ -31,23 +32,6 @@ namespace MediaBrowser.Controller.LiveTv } /// <summary> - /// Gets or sets the etag. - /// </summary> - /// <value>The etag.</value> - public string Etag { get; set; } - - /// <summary> - /// Id of the program. - /// </summary> - public string ExternalId { get; set; } - - /// <summary> - /// Gets or sets the original air date. - /// </summary> - /// <value>The original air date.</value> - public DateTime? OriginalAirDate { get; set; } - - /// <summary> /// Gets or sets the type of the channel. /// </summary> /// <value>The type of the channel.</value> @@ -56,15 +40,10 @@ namespace MediaBrowser.Controller.LiveTv /// <summary> /// The start date of the program, in UTC. /// </summary> + [IgnoreDataMember] public DateTime StartDate { get; set; } /// <summary> - /// Gets or sets a value indicating whether this instance is hd. - /// </summary> - /// <value><c>true</c> if this instance is hd; otherwise, <c>false</c>.</value> - public bool? IsHD { get; set; } - - /// <summary> /// Gets or sets the audio. /// </summary> /// <value>The audio.</value> @@ -74,12 +53,14 @@ namespace MediaBrowser.Controller.LiveTv /// Gets or sets a value indicating whether this instance is repeat. /// </summary> /// <value><c>true</c> if this instance is repeat; otherwise, <c>false</c>.</value> + [IgnoreDataMember] public bool IsRepeat { get; set; } /// <summary> /// Gets or sets the episode title. /// </summary> /// <value>The episode title.</value> + [IgnoreDataMember] public string EpisodeTitle { get; set; } /// <summary> @@ -89,63 +70,52 @@ namespace MediaBrowser.Controller.LiveTv public string ServiceName { get; set; } /// <summary> - /// Supply the image path if it can be accessed directly from the file system - /// </summary> - /// <value>The image path.</value> - public string ProviderImagePath { get; set; } - - /// <summary> - /// Supply the image url if it can be downloaded - /// </summary> - /// <value>The image URL.</value> - public string ProviderImageUrl { get; set; } - - /// <summary> - /// Gets or sets a value indicating whether this instance has image. - /// </summary> - /// <value><c>null</c> if [has image] contains no value, <c>true</c> if [has image]; otherwise, <c>false</c>.</value> - public bool? HasProviderImage { get; set; } - - /// <summary> /// Gets or sets a value indicating whether this instance is movie. /// </summary> /// <value><c>true</c> if this instance is movie; otherwise, <c>false</c>.</value> + [IgnoreDataMember] public bool IsMovie { get; set; } /// <summary> /// Gets or sets a value indicating whether this instance is sports. /// </summary> /// <value><c>true</c> if this instance is sports; otherwise, <c>false</c>.</value> + [IgnoreDataMember] public bool IsSports { get; set; } /// <summary> /// Gets or sets a value indicating whether this instance is series. /// </summary> /// <value><c>true</c> if this instance is series; otherwise, <c>false</c>.</value> + [IgnoreDataMember] public bool IsSeries { get; set; } /// <summary> /// Gets or sets a value indicating whether this instance is live. /// </summary> /// <value><c>true</c> if this instance is live; otherwise, <c>false</c>.</value> + [IgnoreDataMember] public bool IsLive { get; set; } /// <summary> /// Gets or sets a value indicating whether this instance is news. /// </summary> /// <value><c>true</c> if this instance is news; otherwise, <c>false</c>.</value> + [IgnoreDataMember] public bool IsNews { get; set; } /// <summary> /// Gets or sets a value indicating whether this instance is kids. /// </summary> /// <value><c>true</c> if this instance is kids; otherwise, <c>false</c>.</value> + [IgnoreDataMember] public bool IsKids { get; set; } /// <summary> /// Gets or sets a value indicating whether this instance is premiere. /// </summary> /// <value><c>true</c> if this instance is premiere; otherwise, <c>false</c>.</value> + [IgnoreDataMember] public bool IsPremiere { get; set; } /// <summary> @@ -244,6 +214,7 @@ namespace MediaBrowser.Controller.LiveTv return info; } + [IgnoreDataMember] public override bool SupportsPeople { get diff --git a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs index 960f8054a1..77404cfe8e 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs @@ -14,26 +14,29 @@ namespace MediaBrowser.Controller.LiveTv { public class LiveTvVideoRecording : Video, ILiveTvRecording { - public string ExternalId { get; set; } - public string ProviderImagePath { get; set; } - public string ProviderImageUrl { get; set; } + [IgnoreDataMember] public string EpisodeTitle { get; set; } + [IgnoreDataMember] public bool IsSeries { get; set; } public string SeriesTimerId { get; set; } + [IgnoreDataMember] public DateTime StartDate { get; set; } public RecordingStatus Status { get; set; } + [IgnoreDataMember] public bool IsSports { get; set; } + [IgnoreDataMember] public bool IsNews { get; set; } + [IgnoreDataMember] public bool IsKids { get; set; } + [IgnoreDataMember] public bool IsRepeat { get; set; } + [IgnoreDataMember] public bool IsMovie { get; set; } - public bool? IsHD { get; set; } + [IgnoreDataMember] public bool IsLive { get; set; } + [IgnoreDataMember] public bool IsPremiere { get; set; } - public ChannelType ChannelType { get; set; } - public string ProgramId { get; set; } public ProgramAudio? Audio { get; set; } - public DateTime? OriginalAirDate { get; set; } /// <summary> /// Gets the user data key. @@ -53,11 +56,6 @@ namespace MediaBrowser.Controller.LiveTv var name = GetClientTypeName(); - if (!string.IsNullOrEmpty(ProgramId)) - { - return name + "-" + ProgramId; - } - return name + "-" + Name + (EpisodeTitle ?? string.Empty); } @@ -109,6 +107,7 @@ namespace MediaBrowser.Controller.LiveTv return false; } + [IgnoreDataMember] public override bool SupportsLocalMetadata { get diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 24309734f8..bcf4de2a29 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -11,10 +11,9 @@ <AssemblyName>MediaBrowser.Controller</AssemblyName> <FileAlignment>512</FileAlignment> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> - <ProductVersion>10.0.0</ProductVersion> - <SchemaVersion>2.0</SchemaVersion> <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> - <RestorePackages>true</RestorePackages> + <ReleaseVersion> + </ReleaseVersion> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <DebugSymbols>true</DebugSymbols> @@ -24,7 +23,6 @@ <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> - <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>none</DebugType> @@ -33,7 +31,6 @@ <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> - <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> </PropertyGroup> <PropertyGroup> <RunPostBuildEvent>Always</RunPostBuildEvent> @@ -45,15 +42,17 @@ <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> - <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> </PropertyGroup> <ItemGroup> + <Reference Include="CommonIO, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\packages\CommonIO.1.0.0.5\lib\net45\CommonIO.dll</HintPath> + </Reference> <Reference Include="Interfaces.IO"> <HintPath>..\packages\Interfaces.IO.1.0.0.5\lib\portable-net45+sl4+wp71+win8+wpa81\Interfaces.IO.dll</HintPath> </Reference> - <Reference Include="MoreLinq, Version=1.1.17511.0, Culture=neutral, PublicKeyToken=384d532d7e88985d, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\morelinq.1.1.0\lib\net35\MoreLinq.dll</HintPath> + <Reference Include="Patterns.Logging"> + <HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath> </Reference> <Reference Include="System" /> <Reference Include="System.Core" /> @@ -66,6 +65,9 @@ <Reference Include="ServiceStack.Interfaces"> <HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath> </Reference> + <Reference Include="MoreLinq"> + <HintPath>..\packages\morelinq.1.1.1\lib\net35\MoreLinq.dll</HintPath> + </Reference> </ItemGroup> <ItemGroup> <Compile Include="..\SharedVersion.cs"> @@ -81,7 +83,6 @@ <Compile Include="Channels\ChannelParentalRating.cs" /> <Compile Include="Channels\ChannelSearchInfo.cs" /> <Compile Include="Channels\IChannel.cs" /> - <Compile Include="Channels\IChannelFactory.cs" /> <Compile Include="Channels\IChannelManager.cs" /> <Compile Include="Channels\IChannelItem.cs" /> <Compile Include="Channels\ChannelAudioItem.cs" /> @@ -149,7 +150,6 @@ <Compile Include="Entities\IHasMediaSources.cs" /> <Compile Include="Entities\IHasMetascore.cs" /> <Compile Include="Entities\IHasOriginalTitle.cs" /> - <Compile Include="Entities\IHasPreferredMetadataLanguage.cs" /> <Compile Include="Entities\IHasProductionLocations.cs" /> <Compile Include="Entities\IHasProgramAttributes.cs" /> <Compile Include="Entities\IHasScreenshots.cs" /> @@ -273,7 +273,6 @@ <Compile Include="Providers\DirectoryService.cs" /> <Compile Include="Providers\DynamicImageInfo.cs" /> <Compile Include="Providers\DynamicImageResponse.cs" /> - <Compile Include="Providers\EpisodeIdentity.cs" /> <Compile Include="Providers\EpisodeInfo.cs" /> <Compile Include="Providers\ExtraInfo.cs" /> <Compile Include="Providers\ExtraSource.cs" /> @@ -287,14 +286,12 @@ <Compile Include="Providers\IForcedProvider.cs" /> <Compile Include="Providers\IHasChangeMonitor.cs" /> <Compile Include="Entities\IHasMetadata.cs" /> - <Compile Include="Providers\IHasIdentities.cs" /> <Compile Include="Providers\IHasItemChangeMonitor.cs" /> <Compile Include="Providers\IHasLookupInfo.cs" /> <Compile Include="Providers\IHasOrder.cs" /> <Compile Include="Providers\IImageFileSaver.cs" /> <Compile Include="Providers\IImageProvider.cs" /> <Compile Include="Providers\IImageSaver.cs" /> - <Compile Include="Providers\IItemIdentity.cs" /> <Compile Include="Providers\IItemIdentityConverter.cs" /> <Compile Include="Providers\IItemIdentityProvider.cs" /> <Compile Include="Providers\ILocalImageFileProvider.cs" /> @@ -319,9 +316,7 @@ <Compile Include="Providers\MusicVideoInfo.cs" /> <Compile Include="Providers\PersonLookupInfo.cs" /> <Compile Include="Providers\RemoteSearchQuery.cs" /> - <Compile Include="Providers\SeasonIdentity.cs" /> <Compile Include="Providers\SeasonInfo.cs" /> - <Compile Include="Providers\SeriesIdentity.cs" /> <Compile Include="Providers\SeriesInfo.cs" /> <Compile Include="Providers\SeriesOrderTypes.cs" /> <Compile Include="Providers\SongInfo.cs" /> @@ -418,8 +413,6 @@ <Compile Include="Sync\ISyncRepository.cs" /> <Compile Include="Sync\SyncedFileInfo.cs" /> <Compile Include="Sync\SyncedItemProgress.cs" /> - <Compile Include="Themes\IAppThemeManager.cs" /> - <Compile Include="Themes\InternalThemeImage.cs" /> <Compile Include="TV\ITVSeriesManager.cs" /> </ItemGroup> <ItemGroup> diff --git a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs index 23285b612a..427af6f6d7 100644 --- a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs +++ b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs @@ -25,6 +25,13 @@ namespace MediaBrowser.Controller.MediaEncoding string Version { get; } /// <summary> + /// Supportses the decoder. + /// </summary> + /// <param name="decoder">The decoder.</param> + /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> + bool SupportsDecoder(string decoder); + + /// <summary> /// Extracts the audio image. /// </summary> /// <param name="path">The path.</param> diff --git a/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs b/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs index da9dd4dfd2..7985ec054d 100644 --- a/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs +++ b/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs @@ -4,6 +4,8 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.MediaEncoding { @@ -15,29 +17,30 @@ namespace MediaBrowser.Controller.MediaEncoding /// <summary> /// Gets the input argument. /// </summary> + /// <param name="fileSystem">The file system.</param> /// <param name="videoPath">The video path.</param> /// <param name="protocol">The protocol.</param> /// <param name="isoMount">The iso mount.</param> /// <param name="playableStreamFileNames">The playable stream file names.</param> /// <returns>System.String[][].</returns> - public static string[] GetInputArgument(string videoPath, MediaProtocol protocol, IIsoMount isoMount, List<string> playableStreamFileNames) + public static string[] GetInputArgument(IFileSystem fileSystem, string videoPath, MediaProtocol protocol, IIsoMount isoMount, List<string> playableStreamFileNames) { if (playableStreamFileNames.Count > 0) { if (isoMount == null) { - return GetPlayableStreamFiles(videoPath, playableStreamFileNames).ToArray(); + return GetPlayableStreamFiles(fileSystem, videoPath, playableStreamFileNames).ToArray(); } - return GetPlayableStreamFiles(isoMount.MountedPath, playableStreamFileNames).ToArray(); + return GetPlayableStreamFiles(fileSystem, isoMount.MountedPath, playableStreamFileNames).ToArray(); } return new[] {videoPath}; } - public static List<string> GetPlayableStreamFiles(string rootPath, IEnumerable<string> filenames) + public static List<string> GetPlayableStreamFiles(IFileSystem fileSystem, string rootPath, IEnumerable<string> filenames) { - var allFiles = Directory - .EnumerateFiles(rootPath, "*", SearchOption.AllDirectories) + var allFiles = fileSystem + .GetFilePaths(rootPath, true) .ToList(); return filenames.Select(name => allFiles.FirstOrDefault(f => string.Equals(Path.GetFileName(f), name, StringComparison.OrdinalIgnoreCase))) diff --git a/MediaBrowser.Controller/Net/IHttpServer.cs b/MediaBrowser.Controller/Net/IHttpServer.cs index 37142af194..91da5fab20 100644 --- a/MediaBrowser.Controller/Net/IHttpServer.cs +++ b/MediaBrowser.Controller/Net/IHttpServer.cs @@ -53,5 +53,10 @@ namespace MediaBrowser.Controller.Net /// Inits this instance. /// </summary> void Init(IEnumerable<IRestfulService> services); + + /// <summary> + /// If set, all requests will respond with this message + /// </summary> + string GlobalResponse { get; set; } } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Net/StaticResultOptions.cs b/MediaBrowser.Controller/Net/StaticResultOptions.cs index 6a104554af..b5efc1b8fb 100644 --- a/MediaBrowser.Controller/Net/StaticResultOptions.cs +++ b/MediaBrowser.Controller/Net/StaticResultOptions.cs @@ -19,6 +19,7 @@ namespace MediaBrowser.Controller.Net public IDictionary<string, string> ResponseHeaders { get; set; } public Action OnComplete { get; set; } + public Action OnError { get; set; } public StaticResultOptions() { diff --git a/MediaBrowser.Controller/Persistence/IItemRepository.cs b/MediaBrowser.Controller/Persistence/IItemRepository.cs index a4b9bf1202..8fc0aedd3f 100644 --- a/MediaBrowser.Controller/Persistence/IItemRepository.cs +++ b/MediaBrowser.Controller/Persistence/IItemRepository.cs @@ -169,6 +169,13 @@ namespace MediaBrowser.Controller.Persistence /// <param name="query">The query.</param> /// <returns>List<System.String>.</returns> List<string> GetPeopleNames(InternalPeopleQuery query); + + /// <summary> + /// Gets the item ids with path. + /// </summary> + /// <param name="query">The query.</param> + /// <returns>QueryResult<Tuple<Guid, System.String>>.</returns> + QueryResult<Tuple<Guid, string>> GetItemIdsWithPath(InternalItemsQuery query); } } diff --git a/MediaBrowser.Controller/Playlists/IPlaylistManager.cs b/MediaBrowser.Controller/Playlists/IPlaylistManager.cs index cbe0b97a4e..a9336d8e33 100644 --- a/MediaBrowser.Controller/Playlists/IPlaylistManager.cs +++ b/MediaBrowser.Controller/Playlists/IPlaylistManager.cs @@ -45,5 +45,13 @@ namespace MediaBrowser.Controller.Playlists /// <returns>Folder.</returns> Folder GetPlaylistsFolder(string userId); + /// <summary> + /// Moves the item. + /// </summary> + /// <param name="playlistId">The playlist identifier.</param> + /// <param name="entryId">The entry identifier.</param> + /// <param name="newIndex">The new index.</param> + /// <returns>Task.</returns> + Task MoveItem(string playlistId, string entryId, int newIndex); } } diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index 383d0881e9..3e53538124 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -61,7 +61,16 @@ namespace MediaBrowser.Controller.Providers }; //Fetch(item, metadataFile, settings, Encoding.GetEncoding("ISO-8859-1"), cancellationToken); - Fetch(item, metadataFile, settings, Encoding.UTF8, cancellationToken); + + try + { + Fetch(item, metadataFile, settings, Encoding.UTF8, cancellationToken); + } + catch + { + Logger.Error("Error parsing xml file {0}", metadataFile); + throw; + } } /// <summary> @@ -304,11 +313,7 @@ namespace MediaBrowser.Controller.Providers { var val = reader.ReadElementContentAsString(); - var hasLanguage = item as IHasPreferredMetadataLanguage; - if (hasLanguage != null) - { - hasLanguage.PreferredMetadataLanguage = val; - } + item.PreferredMetadataLanguage = val; break; } @@ -317,11 +322,7 @@ namespace MediaBrowser.Controller.Providers { var val = reader.ReadElementContentAsString(); - var hasLanguage = item as IHasPreferredMetadataLanguage; - if (hasLanguage != null) - { - hasLanguage.PreferredMetadataCountryCode = val; - } + item.PreferredMetadataCountryCode = val; break; } diff --git a/MediaBrowser.Controller/Providers/DirectoryService.cs b/MediaBrowser.Controller/Providers/DirectoryService.cs index 79ffb0d01f..cf1c3d286d 100644 --- a/MediaBrowser.Controller/Providers/DirectoryService.cs +++ b/MediaBrowser.Controller/Providers/DirectoryService.cs @@ -4,48 +4,52 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Providers { public class DirectoryService : IDirectoryService { private readonly ILogger _logger; + private readonly IFileSystem _fileSystem; - private readonly ConcurrentDictionary<string, Dictionary<string,FileSystemInfo>> _cache = - new ConcurrentDictionary<string, Dictionary<string, FileSystemInfo>>(StringComparer.OrdinalIgnoreCase); + private readonly ConcurrentDictionary<string, Dictionary<string, FileSystemMetadata>> _cache = + new ConcurrentDictionary<string, Dictionary<string, FileSystemMetadata>>(StringComparer.OrdinalIgnoreCase); - public DirectoryService(ILogger logger) + public DirectoryService(ILogger logger, IFileSystem fileSystem) { _logger = logger; + _fileSystem = fileSystem; } - public DirectoryService() - : this(new NullLogger()) + public DirectoryService(IFileSystem fileSystem) + : this(new NullLogger(), fileSystem) { } - public IEnumerable<FileSystemInfo> GetFileSystemEntries(string path) + public IEnumerable<FileSystemMetadata> GetFileSystemEntries(string path) { return GetFileSystemEntries(path, false); } - public Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path) + public Dictionary<string, FileSystemMetadata> GetFileSystemDictionary(string path) { return GetFileSystemDictionary(path, false); } - private Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path, bool clearCache) + private Dictionary<string, FileSystemMetadata> GetFileSystemDictionary(string path, bool clearCache) { if (string.IsNullOrWhiteSpace(path)) { throw new ArgumentNullException("path"); } - Dictionary<string, FileSystemInfo> entries; + Dictionary<string, FileSystemMetadata> entries; if (clearCache) { - Dictionary<string, FileSystemInfo> removed; + Dictionary<string, FileSystemMetadata> removed; _cache.TryRemove(path, out removed); } @@ -54,13 +58,12 @@ namespace MediaBrowser.Controller.Providers { //_logger.Debug("Getting files for " + path); - entries = new Dictionary<string, FileSystemInfo>(StringComparer.OrdinalIgnoreCase); + entries = new Dictionary<string, FileSystemMetadata>(StringComparer.OrdinalIgnoreCase); try { // using EnumerateFileSystemInfos doesn't handle reparse points (symlinks) - var list = new DirectoryInfo(path).EnumerateDirectories("*", SearchOption.TopDirectoryOnly) - .Concat<FileSystemInfo>(new DirectoryInfo(path).EnumerateFiles("*", SearchOption.TopDirectoryOnly)); + var list = _fileSystem.GetFileSystemEntries(path); // Seeing dupes on some users file system for some reason foreach (var item in list) @@ -80,34 +83,34 @@ namespace MediaBrowser.Controller.Providers return entries; } - private IEnumerable<FileSystemInfo> GetFileSystemEntries(string path, bool clearCache) + private IEnumerable<FileSystemMetadata> GetFileSystemEntries(string path, bool clearCache) { return GetFileSystemDictionary(path, clearCache).Values; } - public IEnumerable<FileSystemInfo> GetFiles(string path) + public IEnumerable<FileSystemMetadata> GetFiles(string path) { return GetFiles(path, false); } - public IEnumerable<FileSystemInfo> GetFiles(string path, bool clearCache) + public IEnumerable<FileSystemMetadata> GetFiles(string path, bool clearCache) { return GetFileSystemEntries(path, clearCache).Where(i => (i.Attributes & FileAttributes.Directory) != FileAttributes.Directory); } - public FileSystemInfo GetFile(string path) + public FileSystemMetadata GetFile(string path) { var directory = Path.GetDirectoryName(path); var dict = GetFileSystemDictionary(directory, false); - FileSystemInfo entry; + FileSystemMetadata entry; dict.TryGetValue(path, out entry); return entry; } - public IEnumerable<FileSystemInfo> GetDirectories(string path) + public IEnumerable<FileSystemMetadata> GetDirectories(string path) { return GetFileSystemEntries(path, false).Where(i => (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory); } diff --git a/MediaBrowser.Controller/Providers/DynamicImageResponse.cs b/MediaBrowser.Controller/Providers/DynamicImageResponse.cs index 71a937cd9d..fdd1891ed6 100644 --- a/MediaBrowser.Controller/Providers/DynamicImageResponse.cs +++ b/MediaBrowser.Controller/Providers/DynamicImageResponse.cs @@ -1,12 +1,14 @@ using System; using System.IO; using MediaBrowser.Model.Drawing; +using MediaBrowser.Model.MediaInfo; namespace MediaBrowser.Controller.Providers { public class DynamicImageResponse { public string Path { get; set; } + public MediaProtocol Protocol { get; set; } public Stream Stream { get; set; } public ImageFormat Format { get; set; } public bool HasImage { get; set; } diff --git a/MediaBrowser.Controller/Providers/EpisodeIdentity.cs b/MediaBrowser.Controller/Providers/EpisodeIdentity.cs deleted file mode 100644 index 53f469e955..0000000000 --- a/MediaBrowser.Controller/Providers/EpisodeIdentity.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MediaBrowser.Controller.Providers -{ - public class EpisodeIdentity : IItemIdentity - { - public string Type { get; set; } - - public string SeriesId { get; set; } - public int? SeasonIndex { get; set; } - public int IndexNumber { get; set; } - public int? IndexNumberEnd { get; set; } - } -}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/EpisodeInfo.cs b/MediaBrowser.Controller/Providers/EpisodeInfo.cs index 88a7cbab7f..28abd636a2 100644 --- a/MediaBrowser.Controller/Providers/EpisodeInfo.cs +++ b/MediaBrowser.Controller/Providers/EpisodeInfo.cs @@ -1,15 +1,10 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Controller.Providers { - public class EpisodeInfo : ItemLookupInfo, IHasIdentities<EpisodeIdentity> + public class EpisodeInfo : ItemLookupInfo { - private List<EpisodeIdentity> _identities = new List<EpisodeIdentity>(); - public Dictionary<string, string> SeriesProviderIds { get; set; } public int? IndexNumberEnd { get; set; } @@ -19,16 +14,5 @@ namespace MediaBrowser.Controller.Providers { SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); } - - public IEnumerable<EpisodeIdentity> Identities - { - get { return _identities; } - } - - public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) - { - var identifier = new ItemIdentifier<EpisodeInfo, EpisodeIdentity>(); - _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); - } } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IDirectoryService.cs b/MediaBrowser.Controller/Providers/IDirectoryService.cs index 343cf361f0..062a109015 100644 --- a/MediaBrowser.Controller/Providers/IDirectoryService.cs +++ b/MediaBrowser.Controller/Providers/IDirectoryService.cs @@ -1,15 +1,17 @@ using System.Collections.Generic; using System.IO; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Providers { public interface IDirectoryService { - IEnumerable<FileSystemInfo> GetFileSystemEntries(string path); - IEnumerable<FileSystemInfo> GetFiles(string path); - IEnumerable<FileSystemInfo> GetDirectories(string path); - IEnumerable<FileSystemInfo> GetFiles(string path, bool clearCache); - FileSystemInfo GetFile(string path); - Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path); + IEnumerable<FileSystemMetadata> GetFileSystemEntries(string path); + IEnumerable<FileSystemMetadata> GetFiles(string path); + IEnumerable<FileSystemMetadata> GetDirectories(string path); + IEnumerable<FileSystemMetadata> GetFiles(string path, bool clearCache); + FileSystemMetadata GetFile(string path); + Dictionary<string, FileSystemMetadata> GetFileSystemDictionary(string path); } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IHasIdentities.cs b/MediaBrowser.Controller/Providers/IHasIdentities.cs deleted file mode 100644 index 36f940dd31..0000000000 --- a/MediaBrowser.Controller/Providers/IHasIdentities.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Controller.Providers -{ - public interface IHasIdentities<out TIdentity> - where TIdentity : IItemIdentity - { - IEnumerable<TIdentity> Identities { get; } - - Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken); - } -}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IItemIdentity.cs b/MediaBrowser.Controller/Providers/IItemIdentity.cs deleted file mode 100644 index cab189c84f..0000000000 --- a/MediaBrowser.Controller/Providers/IItemIdentity.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MediaBrowser.Controller.Providers -{ - public interface IItemIdentity - { - string Type { get; } - } -}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IItemIdentityConverter.cs b/MediaBrowser.Controller/Providers/IItemIdentityConverter.cs index 30e96b9e51..bfdd1dbf3a 100644 --- a/MediaBrowser.Controller/Providers/IItemIdentityConverter.cs +++ b/MediaBrowser.Controller/Providers/IItemIdentityConverter.cs @@ -1,4 +1,4 @@ namespace MediaBrowser.Controller.Providers { - public interface IItemIdentityConverter : IHasOrder { } + public interface IItemIdentityConverter { } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IItemIdentityProvider.cs b/MediaBrowser.Controller/Providers/IItemIdentityProvider.cs index 9d437c208b..6b403bb55f 100644 --- a/MediaBrowser.Controller/Providers/IItemIdentityProvider.cs +++ b/MediaBrowser.Controller/Providers/IItemIdentityProvider.cs @@ -1,4 +1,4 @@ namespace MediaBrowser.Controller.Providers { - public interface IItemIdentityProvider : IHasOrder { } + public interface IItemIdentityProvider { } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index d6fc39c5f5..57e4ff3200 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -195,18 +195,16 @@ namespace MediaBrowser.Controller.Providers /// Gets the item identity providers. /// </summary> /// <typeparam name="TLookupInfo">The type of the t lookup information.</typeparam> - /// <typeparam name="TIdentity">The type of the t identity.</typeparam> /// <returns>IEnumerable<IItemIdentityProvider<TLookupInfo, TIdentity>>.</returns> - IEnumerable<IItemIdentityProvider<TLookupInfo, TIdentity>> GetItemIdentityProviders<TLookupInfo, TIdentity>() - where TLookupInfo : ItemLookupInfo - where TIdentity : IItemIdentity; + IEnumerable<IItemIdentityProvider<TLookupInfo>> GetItemIdentityProviders<TLookupInfo>() + where TLookupInfo : ItemLookupInfo; /// <summary> /// Gets the item identity converters. /// </summary> - /// <typeparam name="TIdentity">The type of the t identity.</typeparam> + /// <typeparam name="TLookupInfo">The type of the t lookup information.</typeparam> /// <returns>IEnumerable<IItemIdentityConverter<TIdentity>>.</returns> - IEnumerable<IItemIdentityConverter<TIdentity>> GetItemIdentityConverters<TIdentity>() - where TIdentity : IItemIdentity; + IEnumerable<IItemIdentityConverter<TLookupInfo>> GetItemIdentityConverters<TLookupInfo>() + where TLookupInfo : ItemLookupInfo; } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ImageRefreshMode.cs b/MediaBrowser.Controller/Providers/ImageRefreshMode.cs index df10c91f6a..73ef4b8cda 100644 --- a/MediaBrowser.Controller/Providers/ImageRefreshMode.cs +++ b/MediaBrowser.Controller/Providers/ImageRefreshMode.cs @@ -8,14 +8,14 @@ namespace MediaBrowser.Controller.Providers None = 0, /// <summary> - /// The default + /// Existing images will be validated /// </summary> - Default = 1, + ValidationOnly = 1, /// <summary> - /// Existing images will be validated + /// The default /// </summary> - ValidationOnly = 2, + Default = 2, /// <summary> /// All providers will be executed to search for new metadata diff --git a/MediaBrowser.Controller/Providers/ItemIdentifier.cs b/MediaBrowser.Controller/Providers/ItemIdentifier.cs index 13e4f137f9..bbc6dd76cd 100644 --- a/MediaBrowser.Controller/Providers/ItemIdentifier.cs +++ b/MediaBrowser.Controller/Providers/ItemIdentifier.cs @@ -1,73 +1,36 @@ -using System.Collections.Generic; -using System.Linq; +using System.Linq; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Controller.Providers { - public class ItemIdentifier<TLookupInfo, TIdentity> + public static class ItemIdentifier<TLookupInfo> where TLookupInfo : ItemLookupInfo - where TIdentity : IItemIdentity { - public async Task<IEnumerable<TIdentity>> FindIdentities(TLookupInfo item, IProviderManager providerManager, CancellationToken cancellationToken) + public static async Task FindIdentities(TLookupInfo item, IProviderManager providerManager, CancellationToken cancellationToken) { - var providers = providerManager.GetItemIdentityProviders<TLookupInfo, TIdentity>(); - var converters = providerManager.GetItemIdentityConverters<TIdentity>(); - - var identities = new List<IdentityPair>(); - + var providers = providerManager.GetItemIdentityProviders<TLookupInfo>(); + var converters = providerManager.GetItemIdentityConverters<TLookupInfo>().ToList(); + foreach (var provider in providers) { - var result = new IdentityPair - { - Identity = await provider.FindIdentity(item), - Order = provider.Order - }; - - if (!Equals(result.Identity, default(TIdentity))) - { - identities.Add(result); - } + await provider.Identify(item); } - var convertersAvailable = new List<IItemIdentityConverter<TIdentity>>(converters); - bool changesMade; + bool changesMade = true; - do + while (changesMade) { changesMade = false; - for (int i = convertersAvailable.Count - 1; i >= 0; i--) + foreach (var converter in converters) { - var converter = convertersAvailable[i]; - var input = identities.FirstOrDefault(id => id.Identity.Type == converter.SourceType); - var existing = identities.Where(id => id.Identity.Type == converter.ResultType); - - if (input != null && !existing.Any(id => id.Order <= converter.Order)) + if (await converter.Convert(item)) { - var result = new IdentityPair - { - Identity = await converter.Convert(input.Identity).ConfigureAwait(false), - Order = converter.Order - }; - - if (!Equals(result.Identity, default(TIdentity))) - { - identities.Add(result); - convertersAvailable.RemoveAt(i); - changesMade = true; - } + changesMade = true; } } - } while (changesMade); - - return identities.OrderBy(id => id.Order).Select(id => id.Identity); - } - - private class IdentityPair - { - public TIdentity Identity; - public int Order; + } } } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ItemIdentities.cs b/MediaBrowser.Controller/Providers/ItemIdentities.cs index 939fd3b8ff..48316d0f44 100644 --- a/MediaBrowser.Controller/Providers/ItemIdentities.cs +++ b/MediaBrowser.Controller/Providers/ItemIdentities.cs @@ -2,20 +2,15 @@ namespace MediaBrowser.Controller.Providers { - public interface IItemIdentityProvider<in TLookupInfo, TIdentity> : IItemIdentityProvider + public interface IItemIdentityProvider<in TLookupInfo> : IItemIdentityProvider where TLookupInfo : ItemLookupInfo - where TIdentity : IItemIdentity { - Task<TIdentity> FindIdentity(TLookupInfo info); + Task Identify(TLookupInfo info); } - public interface IItemIdentityConverter<TIdentity> : IItemIdentityConverter - where TIdentity : IItemIdentity + public interface IItemIdentityConverter<in TLookupInfo> : IItemIdentityConverter + where TLookupInfo : ItemLookupInfo { - Task<TIdentity> Convert(TIdentity identity); - - string SourceType { get; } - - string ResultType { get; } + Task<bool> Convert(TLookupInfo info); } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ItemInfo.cs b/MediaBrowser.Controller/Providers/ItemInfo.cs index 78f352057b..d16a730286 100644 --- a/MediaBrowser.Controller/Providers/ItemInfo.cs +++ b/MediaBrowser.Controller/Providers/ItemInfo.cs @@ -19,6 +19,7 @@ namespace MediaBrowser.Controller.Providers if (video != null) { VideoType = video.VideoType; + IsPlaceHolder = video.IsPlaceHolder; } } @@ -26,5 +27,6 @@ namespace MediaBrowser.Controller.Providers public string ContainingFolderPath { get; set; } public VideoType VideoType { get; set; } public bool IsInMixedFolder { get; set; } + public bool IsPlaceHolder { get; set; } } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/LocalImageInfo.cs b/MediaBrowser.Controller/Providers/LocalImageInfo.cs index 59d74def26..51916268fe 100644 --- a/MediaBrowser.Controller/Providers/LocalImageInfo.cs +++ b/MediaBrowser.Controller/Providers/LocalImageInfo.cs @@ -1,11 +1,13 @@ using System.IO; +using CommonIO; +using MediaBrowser.Common.IO; using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Providers { public class LocalImageInfo { - public FileSystemInfo FileInfo { get; set; } + public FileSystemMetadata FileInfo { get; set; } public ImageType Type { get; set; } } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs index dbb7fbfcdb..6f217eea2b 100644 --- a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs +++ b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs @@ -1,4 +1,6 @@ using System.Linq; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Providers { @@ -15,8 +17,8 @@ namespace MediaBrowser.Controller.Providers public bool ForceSave { get; set; } - public MetadataRefreshOptions() - : this(new DirectoryService()) + public MetadataRefreshOptions(IFileSystem fileSystem) + : this(new DirectoryService(fileSystem)) { } diff --git a/MediaBrowser.Controller/Providers/MetadataStatus.cs b/MediaBrowser.Controller/Providers/MetadataStatus.cs index 283b9edbc2..9b946aee27 100644 --- a/MediaBrowser.Controller/Providers/MetadataStatus.cs +++ b/MediaBrowser.Controller/Providers/MetadataStatus.cs @@ -41,12 +41,6 @@ namespace MediaBrowser.Controller.Providers public DateTime? DateLastImagesRefresh { get; set; } /// <summary> - /// Gets or sets the last result. - /// </summary> - /// <value>The last result.</value> - public ProviderRefreshStatus LastStatus { get; set; } - - /// <summary> /// Gets or sets the last result error message. /// </summary> /// <value>The last result error message.</value> @@ -54,33 +48,19 @@ namespace MediaBrowser.Controller.Providers public DateTime? ItemDateModified { get; set; } - public void AddStatus(ProviderRefreshStatus status, string errorMessage) + public void AddStatus(string errorMessage) { - if (LastStatus != status) - { - IsDirty = true; - } - if (string.IsNullOrEmpty(LastErrorMessage)) { LastErrorMessage = errorMessage; } - if (LastStatus == ProviderRefreshStatus.Success) - { - LastStatus = status; - } - } - - public MetadataStatus() - { - LastStatus = ProviderRefreshStatus.Success; } public bool IsDirty { get; private set; } - public void SetDateLastMetadataRefresh(DateTime date) + public void SetDateLastMetadataRefresh(DateTime? date) { - if (date != (DateLastMetadataRefresh ?? DateTime.MinValue)) + if (date != DateLastMetadataRefresh) { IsDirty = true; } @@ -88,9 +68,9 @@ namespace MediaBrowser.Controller.Providers DateLastMetadataRefresh = date; } - public void SetDateLastImagesRefresh(DateTime date) + public void SetDateLastImagesRefresh(DateTime? date) { - if (date != (DateLastImagesRefresh ?? DateTime.MinValue)) + if (date != DateLastImagesRefresh) { IsDirty = true; } diff --git a/MediaBrowser.Controller/Providers/SeasonIdentity.cs b/MediaBrowser.Controller/Providers/SeasonIdentity.cs deleted file mode 100644 index 1e6b9b65a3..0000000000 --- a/MediaBrowser.Controller/Providers/SeasonIdentity.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MediaBrowser.Controller.Providers -{ - public class SeasonIdentity : IItemIdentity - { - public string Type { get; set; } - - public string SeriesId { get; set; } - - public int SeasonIndex { get; set; } - } -}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/SeasonInfo.cs b/MediaBrowser.Controller/Providers/SeasonInfo.cs index 17bcd3f772..2c785d7d71 100644 --- a/MediaBrowser.Controller/Providers/SeasonInfo.cs +++ b/MediaBrowser.Controller/Providers/SeasonInfo.cs @@ -1,15 +1,10 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Controller.Providers { - public class SeasonInfo : ItemLookupInfo, IHasIdentities<SeasonIdentity> + public class SeasonInfo : ItemLookupInfo { - private List<SeasonIdentity> _identities = new List<SeasonIdentity>(); - public Dictionary<string, string> SeriesProviderIds { get; set; } public int? AnimeSeriesIndex { get; set; } @@ -17,16 +12,5 @@ namespace MediaBrowser.Controller.Providers { SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); } - - public IEnumerable<SeasonIdentity> Identities - { - get { return _identities; } - } - - public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) - { - var identifier = new ItemIdentifier<SeasonInfo, SeasonIdentity>(); - _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); - } } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/SeriesIdentity.cs b/MediaBrowser.Controller/Providers/SeriesIdentity.cs deleted file mode 100644 index 326d340275..0000000000 --- a/MediaBrowser.Controller/Providers/SeriesIdentity.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MediaBrowser.Controller.Providers -{ - public class SeriesIdentity : IItemIdentity - { - public string Type { get; set; } - - public string Id { get; set; } - } -}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/SeriesInfo.cs b/MediaBrowser.Controller/Providers/SeriesInfo.cs index fc1119cd25..387865de23 100644 --- a/MediaBrowser.Controller/Providers/SeriesInfo.cs +++ b/MediaBrowser.Controller/Providers/SeriesInfo.cs @@ -1,25 +1,7 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - namespace MediaBrowser.Controller.Providers { - public class SeriesInfo : ItemLookupInfo, IHasIdentities<SeriesIdentity> + public class SeriesInfo : ItemLookupInfo { - private List<SeriesIdentity> _identities = new List<SeriesIdentity>(); - public int? AnimeSeriesIndex { get; set; } - - public IEnumerable<SeriesIdentity> Identities - { - get { return _identities; } - } - - public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) - { - var identifier = new ItemIdentifier<SeriesInfo, SeriesIdentity>(); - _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); - } } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Resolvers/IItemResolver.cs b/MediaBrowser.Controller/Resolvers/IItemResolver.cs index fec6be55c9..f747c055e1 100644 --- a/MediaBrowser.Controller/Resolvers/IItemResolver.cs +++ b/MediaBrowser.Controller/Resolvers/IItemResolver.cs @@ -3,6 +3,8 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using System.Collections.Generic; using System.IO; +using CommonIO; +using MediaBrowser.Common.IO; namespace MediaBrowser.Controller.Resolvers { @@ -26,8 +28,8 @@ namespace MediaBrowser.Controller.Resolvers public interface IMultiItemResolver { - MultiItemResolverResult ResolveMultiple(Folder parent, - List<FileSystemInfo> files, + MultiItemResolverResult ResolveMultiple(Folder parent, + List<FileSystemMetadata> files, string collectionType, IDirectoryService directoryService); } @@ -35,12 +37,12 @@ namespace MediaBrowser.Controller.Resolvers public class MultiItemResolverResult { public List<BaseItem> Items { get; set; } - public List<FileSystemInfo> ExtraFiles { get; set; } + public List<FileSystemMetadata> ExtraFiles { get; set; } public MultiItemResolverResult() { Items = new List<BaseItem>(); - ExtraFiles = new List<FileSystemInfo>(); + ExtraFiles = new List<FileSystemMetadata>(); } } } diff --git a/MediaBrowser.Controller/Themes/IAppThemeManager.cs b/MediaBrowser.Controller/Themes/IAppThemeManager.cs deleted file mode 100644 index 1a7c2aaabc..0000000000 --- a/MediaBrowser.Controller/Themes/IAppThemeManager.cs +++ /dev/null @@ -1,38 +0,0 @@ -using MediaBrowser.Model.Themes; -using System.Collections.Generic; - -namespace MediaBrowser.Controller.Themes -{ - public interface IAppThemeManager - { - /// <summary> - /// Gets the themes. - /// </summary> - /// <param name="applicationName">Name of the application.</param> - /// <returns>IEnumerable{AppThemeInfo}.</returns> - IEnumerable<AppThemeInfo> GetThemes(string applicationName); - - /// <summary> - /// Gets the theme. - /// </summary> - /// <param name="applicationName">Name of the application.</param> - /// <param name="name">The name.</param> - /// <returns>AppTheme.</returns> - AppTheme GetTheme(string applicationName, string name); - - /// <summary> - /// Saves the theme. - /// </summary> - /// <param name="theme">The theme.</param> - void SaveTheme(AppTheme theme); - - /// <summary> - /// Gets the image image information. - /// </summary> - /// <param name="applicationName">Name of the application.</param> - /// <param name="themeName">Name of the theme.</param> - /// <param name="imageName">Name of the image.</param> - /// <returns>InternalThemeImage.</returns> - InternalThemeImage GetImageImageInfo(string applicationName, string themeName, string imageName); - } -} diff --git a/MediaBrowser.Controller/Themes/InternalThemeImage.cs b/MediaBrowser.Controller/Themes/InternalThemeImage.cs deleted file mode 100644 index 2b676c25b7..0000000000 --- a/MediaBrowser.Controller/Themes/InternalThemeImage.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; - -namespace MediaBrowser.Controller.Themes -{ - public class InternalThemeImage - { - /// <summary> - /// Gets or sets the name. - /// </summary> - /// <value>The name.</value> - public string Name { get; set; } - - /// <summary> - /// Gets or sets the cache tag. - /// </summary> - /// <value>The cache tag.</value> - public string CacheTag { get; set; } - - /// <summary> - /// Gets or sets the path. - /// </summary> - /// <value>The path.</value> - public string Path { get; set; } - - /// <summary> - /// Gets or sets the date modified. - /// </summary> - /// <value>The date modified.</value> - public DateTime DateModified { get; set; } - } -} diff --git a/MediaBrowser.Controller/packages.config b/MediaBrowser.Controller/packages.config index 8846b5a064..a0aacbc958 100644 --- a/MediaBrowser.Controller/packages.config +++ b/MediaBrowser.Controller/packages.config @@ -1,5 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <packages> + <package id="CommonIO" version="1.0.0.5" targetFramework="net45" /> <package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" /> - <package id="morelinq" version="1.1.0" targetFramework="net45" /> + <package id="morelinq" version="1.1.1" targetFramework="net45" /> + <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" /> </packages>
\ No newline at end of file |
