diff options
| author | Luke <luke.pulverenti@gmail.com> | 2016-03-19 16:23:33 -0400 |
|---|---|---|
| committer | Luke <luke.pulverenti@gmail.com> | 2016-03-19 16:23:33 -0400 |
| commit | 3ab212d070384c0a0000e255307aa58d15cbd0ae (patch) | |
| tree | 6ca899cd7be8685771b56b0074c5b3022faa789a /MediaBrowser.Server.Implementations | |
| parent | fd0d50ad978801164728f7f6bd067430aa090c5f (diff) | |
| parent | db1bf5b1b55c8012e9ca3393fd59b9469ee5aeaf (diff) | |
Merge pull request #1563 from MediaBrowser/dev
Dev
Diffstat (limited to 'MediaBrowser.Server.Implementations')
14 files changed, 294 insertions, 140 deletions
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs b/MediaBrowser.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs index dac3a80f2..3239b20b2 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs @@ -20,11 +20,11 @@ namespace MediaBrowser.Server.Implementations.Channels public Task<IEnumerable<MediaSourceInfo>> GetMediaSources(IHasMediaSources item, CancellationToken cancellationToken) { - var channelItem = item as IChannelMediaItem; + var baseItem = (BaseItem) item; - if (channelItem != null) + if (baseItem.SourceType == SourceType.Channel) { - return _channelManager.GetDynamicMediaSources(channelItem, cancellationToken); + return _channelManager.GetDynamicMediaSources(baseItem, cancellationToken); } return Task.FromResult<IEnumerable<MediaSourceInfo>>(new List<MediaSourceInfo>()); diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index c7865b6aa..e957b9889 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -26,6 +26,9 @@ using System.Net; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; namespace MediaBrowser.Server.Implementations.Channels { @@ -248,9 +251,19 @@ namespace MediaBrowser.Server.Implementations.Channels return item; } - public async Task<IEnumerable<MediaSourceInfo>> GetStaticMediaSources(IChannelMediaItem item, bool includeCachedVersions, CancellationToken cancellationToken) + public async Task<IEnumerable<MediaSourceInfo>> GetStaticMediaSources(BaseItem item, bool includeCachedVersions, CancellationToken cancellationToken) { - IEnumerable<ChannelMediaInfo> results = item.ChannelMediaSources; + IEnumerable<ChannelMediaInfo> results = new List<ChannelMediaInfo>(); + var video = item as Video; + if (video != null) + { + results = video.ChannelMediaSources; + } + var audio = item as Audio; + if (audio != null) + { + results = audio.ChannelMediaSources ?? new List<ChannelMediaInfo>(); + } var sources = SortMediaInfoResults(results) .Select(i => GetMediaSource(item, i)) @@ -265,7 +278,7 @@ namespace MediaBrowser.Server.Implementations.Channels return sources; } - public async Task<IEnumerable<MediaSourceInfo>> GetDynamicMediaSources(IChannelMediaItem item, CancellationToken cancellationToken) + public async Task<IEnumerable<MediaSourceInfo>> GetDynamicMediaSources(BaseItem item, CancellationToken cancellationToken) { var channel = GetChannel(item.ChannelId); var channelPlugin = GetChannelProvider(channel); @@ -319,7 +332,7 @@ namespace MediaBrowser.Server.Implementations.Channels return list; } - private IEnumerable<MediaSourceInfo> GetCachedChannelItemMediaSources(IChannelMediaItem item) + private IEnumerable<MediaSourceInfo> GetCachedChannelItemMediaSources(BaseItem item) { var filenamePrefix = item.Id.ToString("N"); var parentPath = Path.Combine(ChannelDownloadPath, item.ChannelId); @@ -368,7 +381,7 @@ namespace MediaBrowser.Server.Implementations.Channels return new List<MediaSourceInfo>(); } - private MediaSourceInfo GetMediaSource(IChannelMediaItem item, ChannelMediaInfo info) + private MediaSourceInfo GetMediaSource(BaseItem item, ChannelMediaInfo info) { var source = info.ToMediaSource(); @@ -411,6 +424,7 @@ namespace MediaBrowser.Server.Implementations.Channels var parentFolderId = parentFolder.Id; var id = GetInternalChannelId(channelInfo.Name); + var idString = id.ToString("N"); var path = Channel.GetInternalMetadataPath(_config.ApplicationPaths.InternalMetadataPath, id); @@ -418,7 +432,6 @@ namespace MediaBrowser.Server.Implementations.Channels var forceUpdate = false; var item = _libraryManager.GetItemById(id) as Channel; - var channelId = channelInfo.Name.GetMD5().ToString("N"); if (item == null) { @@ -439,11 +452,11 @@ namespace MediaBrowser.Server.Implementations.Channels } item.Path = path; - if (!string.Equals(item.ChannelId, channelId, StringComparison.OrdinalIgnoreCase)) + if (!string.Equals(item.ChannelId, idString, StringComparison.OrdinalIgnoreCase)) { forceUpdate = true; } - item.ChannelId = channelId; + item.ChannelId = idString; if (item.ParentId != parentFolderId) { @@ -492,7 +505,7 @@ namespace MediaBrowser.Server.Implementations.Channels public Channel GetChannel(string id) { - return _libraryManager.GetItemById(new Guid(id)) as Channel; + return _libraryManager.GetItemById(id) as Channel; } public IEnumerable<ChannelFeatures> GetAllChannelFeatures() @@ -510,6 +523,11 @@ namespace MediaBrowser.Server.Implementations.Channels public ChannelFeatures GetChannelFeatures(string id) { + if (string.IsNullOrWhiteSpace(id)) + { + throw new ArgumentNullException("id"); + } + var channel = GetChannel(id); var channelProvider = GetChannelProvider(channel); @@ -1079,7 +1097,7 @@ namespace MediaBrowser.Server.Implementations.Channels if (!string.IsNullOrWhiteSpace(folderId)) { - var categoryItem = (IChannelItem)_libraryManager.GetItemById(new Guid(folderId)); + var categoryItem = _libraryManager.GetItemById(new Guid(folderId)); query.FolderId = categoryItem.ExternalId; } @@ -1195,7 +1213,7 @@ namespace MediaBrowser.Server.Implementations.Channels } private T GetItemById<T>(string idString, string channelName, string channnelDataVersion, out bool isNew) - where T : BaseItem, IChannelItem, new() + where T : BaseItem, new() { var id = GetIdToHash(idString, channelName).GetMBId(typeof(T)); @@ -1233,15 +1251,48 @@ namespace MediaBrowser.Server.Implementations.Channels if (info.Type == ChannelItemType.Folder) { - item = GetItemById<ChannelFolderItem>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + if (info.FolderType == ChannelFolderType.MusicAlbum) + { + item = GetItemById<MusicAlbum>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + } + else if (info.FolderType == ChannelFolderType.PhotoAlbum) + { + item = GetItemById<PhotoAlbum>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + } + else + { + item = GetItemById<Folder>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + } } else if (info.MediaType == ChannelMediaType.Audio) { - item = GetItemById<ChannelAudioItem>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + if (info.ContentType == ChannelMediaContentType.Podcast) + { + item = GetItemById<AudioPodcast>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + } + else + { + item = GetItemById<Audio>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + } } else { - item = GetItemById<ChannelVideoItem>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + if (info.ContentType == ChannelMediaContentType.Episode) + { + item = GetItemById<Episode>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + } + else if (info.ContentType == ChannelMediaContentType.Movie) + { + item = GetItemById<Movie>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + } + else if (info.ContentType == ChannelMediaContentType.Trailer || info.ExtraType == ExtraType.Trailer) + { + item = GetItemById<Trailer>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + } + else + { + item = GetItemById<Video>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew); + } } item.RunTimeTicks = info.RunTimeTicks; @@ -1263,9 +1314,17 @@ namespace MediaBrowser.Server.Implementations.Channels item.Tags = info.Tags; } - var channelItem = (IChannelItem)item; + var trailer = item as Trailer; + if (trailer != null) + { + if (!info.TrailerTypes.SequenceEqual(trailer.TrailerTypes)) + { + forceUpdate = true; + } + trailer.TrailerTypes = info.TrailerTypes; + } - channelItem.ChannelId = internalChannelId.ToString("N"); + item.ChannelId = internalChannelId.ToString("N"); if (item.ParentId != internalChannelId) { @@ -1273,22 +1332,29 @@ namespace MediaBrowser.Server.Implementations.Channels } item.ParentId = internalChannelId; - if (!string.Equals(channelItem.ExternalId, info.Id, StringComparison.OrdinalIgnoreCase)) + if (!string.Equals(item.ExternalId, info.Id, StringComparison.OrdinalIgnoreCase)) { forceUpdate = true; } - channelItem.ExternalId = info.Id; + item.ExternalId = info.Id; - var channelMediaItem = item as IChannelMediaItem; - - if (channelMediaItem != null) + var channelAudioItem = item as Audio; + if (channelAudioItem != null) { - channelMediaItem.ContentType = info.ContentType; - channelMediaItem.ExtraType = info.ExtraType; - channelMediaItem.ChannelMediaSources = info.MediaSources; + channelAudioItem.ExtraType = info.ExtraType; + channelAudioItem.ChannelMediaSources = info.MediaSources; var mediaSource = info.MediaSources.FirstOrDefault(); + item.Path = mediaSource == null ? null : mediaSource.Path; + } + + var channelVideoItem = item as Video; + if (channelVideoItem != null) + { + channelVideoItem.ExtraType = info.ExtraType; + channelVideoItem.ChannelMediaSources = info.MediaSources; + var mediaSource = info.MediaSources.FirstOrDefault(); item.Path = mediaSource == null ? null : mediaSource.Path; } @@ -1297,6 +1363,12 @@ namespace MediaBrowser.Server.Implementations.Channels item.SetImagePath(ImageType.Primary, info.ImageUrl); } + if (item.SourceType != SourceType.Channel) + { + item.SourceType = SourceType.Channel; + forceUpdate = true; + } + if (isNew) { await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false); @@ -1334,7 +1406,12 @@ namespace MediaBrowser.Server.Implementations.Channels internal IChannel GetChannelProvider(Channel channel) { - var result = GetAllChannels().FirstOrDefault(i => string.Equals(i.Name.GetMD5().ToString("N"), channel.ChannelId, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, channel.Name, StringComparison.OrdinalIgnoreCase)); + if (channel == null) + { + throw new ArgumentNullException("channel"); + } + + var result = GetAllChannels().FirstOrDefault(i => string.Equals(GetInternalChannelId(i.Name).ToString("N"), channel.ChannelId, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, channel.Name, StringComparison.OrdinalIgnoreCase)); if (result == null) { @@ -1441,7 +1518,7 @@ namespace MediaBrowser.Server.Implementations.Channels return await _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken).ConfigureAwait(false); } - public async Task DownloadChannelItem(IChannelMediaItem item, string destination, + public async Task DownloadChannelItem(BaseItem item, string destination, IProgress<double> progress, CancellationToken cancellationToken) { var sources = await GetDynamicMediaSources(item, cancellationToken) @@ -1457,7 +1534,7 @@ namespace MediaBrowser.Server.Implementations.Channels } private async Task TryDownloadChannelItem(MediaSourceInfo source, - IChannelMediaItem item, + BaseItem item, string destination, IProgress<double> progress, CancellationToken cancellationToken) @@ -1469,7 +1546,6 @@ namespace MediaBrowser.Server.Implementations.Channels Progress = new Progress<double>() }; - var host = new Uri(source.Path).Host.ToLower(); var channel = GetChannel(item.ChannelId); var channelProvider = GetChannelProvider(channel); var features = channelProvider.GetChannelFeatures(); diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index fb202b798..3b63eccfc 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -316,6 +316,11 @@ namespace MediaBrowser.Server.Implementations.Dto ServerId = _appHost.SystemId }; + if (item.SourceType == SourceType.Channel) + { + dto.SourceType = item.SourceType.ToString(); + } + if (fields.Contains(ItemFields.People)) { AttachPeople(dto, item); @@ -480,7 +485,7 @@ namespace MediaBrowser.Server.Implementations.Dto var folder = (Folder)item; - if (!(folder is IChannelItem) && !(folder is Channel)) + if (item.SourceType == SourceType.Library) { dto.ChildCount = GetChildCount(folder, user); @@ -1250,6 +1255,7 @@ namespace MediaBrowser.Server.Implementations.Dto if (audio != null) { dto.Album = audio.Album; + dto.ExtraType = audio.ExtraType; var albumParent = audio.AlbumEntity; @@ -1352,6 +1358,8 @@ namespace MediaBrowser.Server.Implementations.Dto { dto.Chapters = GetChapterInfoDtos(item); } + + dto.ExtraType = video.ExtraType; } if (fields.Contains(ItemFields.MediaStreams)) @@ -1531,16 +1539,13 @@ namespace MediaBrowser.Server.Implementations.Dto dto.ChannelId = item.ChannelId; - var channelItem = item as IChannelItem; - if (channelItem != null) + if (item.SourceType == SourceType.Channel && !string.IsNullOrWhiteSpace(item.ChannelId)) { - dto.ChannelName = _channelManagerFactory().GetChannel(channelItem.ChannelId).Name; - } - - var channelMediaItem = item as IChannelMediaItem; - if (channelMediaItem != null) - { - dto.ExtraType = channelMediaItem.ExtraType; + var channel = _libraryManager.GetItemById(item.ChannelId); + if (channel != null) + { + dto.ChannelName = channel.Name; + } } } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs index 28883e9a2..dfaedbc9d 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs @@ -342,7 +342,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints void _libraryManager_ItemRemoved(object sender, ItemChangeEventArgs e) { - if (e.Item is LiveTvProgram || e.Item is IChannelItem) + if (e.Item.SourceType != SourceType.Library) { return; } @@ -356,7 +356,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints void _libraryManager_ItemAdded(object sender, ItemChangeEventArgs e) { - if (e.Item is LiveTvProgram || e.Item is IChannelItem) + if (e.Item.SourceType != SourceType.Library) { return; } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs index 703096a2b..237c7157b 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs @@ -282,7 +282,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints return false; } - return !(item is IChannelItem) && !(item is ILiveTvItem); + return item.SourceType == SourceType.Library; } /// <summary> diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs index a9e4aaa0b..da1d25f2c 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs @@ -346,7 +346,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications return false; } - return !(item is IChannelItem) && !(item is ILiveTvItem); + return item.SourceType == SourceType.Library; } private async void LibraryUpdateTimerCallback(object state) diff --git a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs index 5b72860b6..5adddd38a 100644 --- a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs +++ b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs @@ -24,17 +24,15 @@ namespace MediaBrowser.Server.Implementations.Intros public class DefaultIntroProvider : IIntroProvider { private readonly ISecurityManager _security; - private readonly IChannelManager _channelManager; private readonly ILocalizationManager _localization; private readonly IConfigurationManager _serverConfig; private readonly ILibraryManager _libraryManager; private readonly IFileSystem _fileSystem; private readonly IMediaSourceManager _mediaSourceManager; - public DefaultIntroProvider(ISecurityManager security, IChannelManager channelManager, ILocalizationManager localization, IConfigurationManager serverConfig, ILibraryManager libraryManager, IFileSystem fileSystem, IMediaSourceManager mediaSourceManager) + public DefaultIntroProvider(ISecurityManager security, ILocalizationManager localization, IConfigurationManager serverConfig, ILibraryManager libraryManager, IFileSystem fileSystem, IMediaSourceManager mediaSourceManager) { _security = security; - _channelManager = channelManager; _localization = localization; _serverConfig = serverConfig; _libraryManager = libraryManager; @@ -79,76 +77,45 @@ namespace MediaBrowser.Server.Implementations.Intros AppearsInItemId = item.Id }); - if (config.EnableIntrosFromMoviesInLibrary) - { - var inputItems = _libraryManager.GetItems(new InternalItemsQuery(user) - { - IncludeItemTypes = new[] { typeof(Movie).Name } - - }, new string[] { }); - - var itemsWithTrailers = inputItems - .Where(i => - { - var hasTrailers = i as IHasTrailers; - - if (hasTrailers != null && hasTrailers.LocalTrailerIds.Count > 0) - { - if (i is Movie) - { - return !IsDuplicate(item, i); - } - } - return false; - }); - - candidates.AddRange(itemsWithTrailers.Select(i => new ItemWithTrailer - { - Item = i, - Type = ItemWithTrailerType.ItemWithTrailer, - User = user, - WatchingItem = item, - WatchingItemPeople = itemPeople, - AllPeople = allPeople, - Random = random, - LibraryManager = _libraryManager - })); - } - var trailerTypes = new List<TrailerType>(); - if (config.EnableIntrosFromUpcomingTrailers) - { - trailerTypes.Add(TrailerType.ComingSoonToTheaters); - } - if (config.EnableIntrosFromUpcomingDvdMovies) - { - trailerTypes.Add(TrailerType.ComingSoonToDvd); - } - if (config.EnableIntrosFromUpcomingStreamingMovies) + if (config.EnableIntrosFromMoviesInLibrary) { - trailerTypes.Add(TrailerType.ComingSoonToStreaming); + trailerTypes.Add(TrailerType.LocalTrailer); } - if (config.EnableIntrosFromSimilarMovies) + + if (IsSupporter) { - trailerTypes.Add(TrailerType.Archive); + if (config.EnableIntrosFromUpcomingTrailers) + { + trailerTypes.Add(TrailerType.ComingSoonToTheaters); + } + if (config.EnableIntrosFromUpcomingDvdMovies) + { + trailerTypes.Add(TrailerType.ComingSoonToDvd); + } + if (config.EnableIntrosFromUpcomingStreamingMovies) + { + trailerTypes.Add(TrailerType.ComingSoonToStreaming); + } + if (config.EnableIntrosFromSimilarMovies) + { + trailerTypes.Add(TrailerType.Archive); + } } - if (trailerTypes.Count > 0 && IsSupporter) + if (trailerTypes.Count > 0) { - var channelTrailers = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery + var trailerResult = _libraryManager.GetItems(new InternalItemsQuery { - ContentTypes = new[] { ChannelMediaContentType.MovieExtra }, - ExtraTypes = new[] { ExtraType.Trailer }, - UserId = user.Id.ToString("N"), + IncludeItemTypes = new[] { typeof(Trailer).Name }, TrailerTypes = trailerTypes.ToArray() + }); - }, CancellationToken.None); - - candidates.AddRange(channelTrailers.Items.Select(i => new ItemWithTrailer + candidates.AddRange(trailerResult.Items.Select(i => new ItemWithTrailer { Item = i, - Type = ItemWithTrailerType.ChannelTrailer, + Type = i.SourceType == SourceType.Channel ? ItemWithTrailerType.ChannelTrailer : ItemWithTrailerType.ItemWithTrailer, User = user, WatchingItem = item, WatchingItemPeople = itemPeople, @@ -156,7 +123,7 @@ namespace MediaBrowser.Server.Implementations.Intros Random = random, LibraryManager = _libraryManager })); - } + } return GetResult(item, candidates, config, ratingLevel); } @@ -556,7 +523,6 @@ namespace MediaBrowser.Server.Implementations.Intros internal enum ItemWithTrailerType { - LibraryTrailer, ChannelTrailer, ItemWithTrailer } diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 3c56af9e6..19b66836b 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -40,8 +40,10 @@ using CommonIO; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Library; using MediaBrowser.Model.Net; +using MediaBrowser.Server.Implementations.Library.Resolvers; using MoreLinq; using SortOrder = MediaBrowser.Model.Entities.SortOrder; +using VideoResolver = MediaBrowser.Naming.Video.VideoResolver; namespace MediaBrowser.Server.Implementations.Library { @@ -347,11 +349,7 @@ namespace MediaBrowser.Server.Implementations.Library private void RegisterItem(Guid id, BaseItem item) { - if (item is LiveTvProgram) - { - return; - } - if (item is IChannelItem) + if (item.SourceType != SourceType.Library) { return; } @@ -458,10 +456,11 @@ namespace MediaBrowser.Server.Implementations.Library /// Resolves the item. /// </summary> /// <param name="args">The args.</param> + /// <param name="resolvers">The resolvers.</param> /// <returns>BaseItem.</returns> - private BaseItem ResolveItem(ItemResolveArgs args) + private BaseItem ResolveItem(ItemResolveArgs args, IItemResolver[] resolvers) { - var item = EntityResolvers.Select(r => Resolve(args, r)) + var item = (resolvers ?? EntityResolvers).Select(r => Resolve(args, r)) .FirstOrDefault(i => i != null); if (item != null) @@ -560,10 +559,10 @@ namespace MediaBrowser.Server.Implementations.Library public BaseItem ResolvePath(FileSystemMetadata fileInfo, Folder parent = null) { - return ResolvePath(fileInfo, new DirectoryService(_logger, _fileSystem), parent); + return ResolvePath(fileInfo, new DirectoryService(_logger, _fileSystem), null, parent); } - private BaseItem ResolvePath(FileSystemMetadata fileInfo, IDirectoryService directoryService, Folder parent = null, string collectionType = null) + private BaseItem ResolvePath(FileSystemMetadata fileInfo, IDirectoryService directoryService, IItemResolver[] resolvers, Folder parent = null, string collectionType = null) { if (fileInfo == null) { @@ -619,7 +618,7 @@ namespace MediaBrowser.Server.Implementations.Library return null; } - return ResolveItem(args); + return ResolveItem(args, resolvers); } public bool IgnoreFile(FileSystemMetadata file, BaseItem parent) @@ -662,11 +661,18 @@ namespace MediaBrowser.Server.Implementations.Library public IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemMetadata> files, IDirectoryService directoryService, Folder parent, string collectionType) { + return ResolvePaths(files, directoryService, parent, collectionType, EntityResolvers); + } + + public IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemMetadata> files, IDirectoryService directoryService, Folder parent, string collectionType, IItemResolver[] resolvers) + { var fileList = files.Where(i => !IgnoreFile(i, parent)).ToList(); if (parent != null) { - foreach (var resolver in MultiItemResolvers) + var multiItemResolvers = resolvers == null ? MultiItemResolvers : resolvers.OfType<IMultiItemResolver>().ToArray(); + + foreach (var resolver in multiItemResolvers) { var result = resolver.ResolveMultiple(parent, fileList, collectionType, directoryService); @@ -679,22 +685,22 @@ namespace MediaBrowser.Server.Implementations.Library { ResolverHelper.SetInitialItemValues(item, parent, _fileSystem, this, directoryService); } - items.AddRange(ResolveFileList(result.ExtraFiles, directoryService, parent, collectionType)); + items.AddRange(ResolveFileList(result.ExtraFiles, directoryService, parent, collectionType, resolvers)); return items; } } } - return ResolveFileList(fileList, directoryService, parent, collectionType); + return ResolveFileList(fileList, directoryService, parent, collectionType, resolvers); } - private IEnumerable<BaseItem> ResolveFileList(IEnumerable<FileSystemMetadata> fileList, IDirectoryService directoryService, Folder parent, string collectionType) + private IEnumerable<BaseItem> ResolveFileList(IEnumerable<FileSystemMetadata> fileList, IDirectoryService directoryService, Folder parent, string collectionType, IItemResolver[] resolvers) { return fileList.Select(f => { try { - return ResolvePath(f, directoryService, parent, collectionType); + return ResolvePath(f, directoryService, resolvers, parent, collectionType); } catch (Exception ex) { @@ -2310,12 +2316,17 @@ namespace MediaBrowser.Server.Implementations.Library files.AddRange(currentVideo.Extras.Where(i => string.Equals(i.ExtraType, "trailer", StringComparison.OrdinalIgnoreCase)).Select(i => _fileSystem.GetFileInfo(i.Path))); } - return ResolvePaths(files, directoryService, null, null) - .OfType<Video>() + var resolvers = new IItemResolver[] + { + new GenericVideoResolver<Trailer>(this) + }; + + return ResolvePaths(files, directoryService, null, null, resolvers) + .OfType<Trailer>() .Select(video => { // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = GetItemById(video.Id) as Video; + var dbItem = GetItemById(video.Id) as Trailer; if (dbItem != null) { diff --git a/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs b/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs index b72406730..10263f7d7 100644 --- a/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs +++ b/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs @@ -28,12 +28,16 @@ namespace MediaBrowser.Server.Implementations.Library .Cast<IHasTrailers>() .ToList(); - var channelTrailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery + var trailerResult = _libraryManager.GetItems(new InternalItemsQuery { - ExtraTypes = new[] { ExtraType.Trailer } + IncludeItemTypes = new[] { typeof(Trailer).Name }, + ExcludeTrailerTypes = new[] + { + TrailerType.LocalTrailer + } - }, CancellationToken.None); - var channelTrailers = channelTrailerResult.Items; + }); + var trailers = trailerResult.Items; var numComplete = 0; @@ -41,7 +45,7 @@ namespace MediaBrowser.Server.Implementations.Library { cancellationToken.ThrowIfCancellationRequested(); - await AssignTrailers(item, channelTrailers).ConfigureAwait(false); + await AssignTrailers(item, trailers).ConfigureAwait(false); numComplete++; double percent = numComplete; diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/VideoResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/VideoResolver.cs index 97682db66..c7f21cef1 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/VideoResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/VideoResolver.cs @@ -34,4 +34,12 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers get { return ResolverPriority.Last; } } } + + public class GenericVideoResolver<T> : BaseVideoResolver<T> + where T : Video, new () + { + public GenericVideoResolver(ILibraryManager libraryManager) : base(libraryManager) + { + } + } } diff --git a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs index a375dde31..9d276ada2 100644 --- a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs @@ -80,7 +80,7 @@ namespace MediaBrowser.Server.Implementations.Library list.Add(folder); continue; } - + if (collectionFolder != null && UserView.IsEligibleForGrouping(folder) && user.IsFolderGrouped(folder.Id)) { groupedFolders.Add(collectionFolder); @@ -272,7 +272,11 @@ namespace MediaBrowser.Server.Implementations.Library .ToArray(); } - var excludeItemTypes = includeItemTypes.Length == 0 ? new[] { "ChannelItem", "LiveTvItem", typeof(Person).Name, typeof(Studio).Name, typeof(Year).Name, typeof(GameGenre).Name, typeof(MusicGenre).Name, typeof(Genre).Name } : new string[] { }; + var excludeItemTypes = includeItemTypes.Length == 0 ? new[] + { + typeof(Person).Name, typeof(Studio).Name, typeof(Year).Name, typeof(GameGenre).Name, typeof(MusicGenre).Name, typeof(Genre).Name + + } : new string[] { }; return _libraryManager.GetItems(new InternalItemsQuery(user) { @@ -282,7 +286,8 @@ namespace MediaBrowser.Server.Implementations.Library IsFolder = includeItemTypes.Length == 0 ? false : (bool?)null, ExcludeItemTypes = excludeItemTypes, ExcludeLocationTypes = new[] { LocationType.Virtual }, - Limit = limit * 20 + Limit = limit * 20, + ExcludeSourceTypes = parentIds.Length == 0 ? new[] { SourceType.Channel, SourceType.LiveTV } : new SourceType[] { } }, parentIds); } diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs index f8f003fa1..ffe95c862 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs @@ -68,7 +68,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts extInf = line.Substring(8).Trim(); _logger.Info("Found m3u channel: {0}", extInf); } - else if (!string.IsNullOrWhiteSpace(extInf)) + else if (!string.IsNullOrWhiteSpace(extInf) && !line.StartsWith("#", StringComparison.OrdinalIgnoreCase)) { var channel = GetChannelnfo(extInf, tunerHostId); channel.Id = channelIdPrefix + urlHash + line.GetMD5().ToString("N"); diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index 56daff78a..3f50278f6 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -223,6 +223,8 @@ namespace MediaBrowser.Server.Implementations.Persistence _connection.AddColumn(Logger, "TypedBaseItems", "UnratedType", "Text"); _connection.AddColumn(Logger, "TypedBaseItems", "TopParentId", "Text"); _connection.AddColumn(Logger, "TypedBaseItems", "IsItemByName", "BIT"); + _connection.AddColumn(Logger, "TypedBaseItems", "SourceType", "Text"); + _connection.AddColumn(Logger, "TypedBaseItems", "TrailerTypes", "Text"); PrepareStatements(); @@ -353,7 +355,9 @@ namespace MediaBrowser.Server.Implementations.Persistence "DateLastSaved", "LockedFields", "Studios", - "Tags" + "Tags", + "SourceType", + "TrailerTypes" }; private readonly string[] _mediaStreamSaveColumns = @@ -453,7 +457,9 @@ namespace MediaBrowser.Server.Implementations.Persistence "IsFolder", "UnratedType", "TopParentId", - "IsItemByName" + "IsItemByName", + "SourceType", + "TrailerTypes" }; _saveItemCommand = _connection.CreateCommand(); _saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values ("; @@ -747,6 +753,18 @@ namespace MediaBrowser.Server.Implementations.Persistence } _saveItemCommand.GetParameter(index++).Value = isByName; + _saveItemCommand.GetParameter(index++).Value = item.SourceType.ToString(); + + var trailer = item as Trailer; + if (trailer != null) + { + _saveItemCommand.GetParameter(index++).Value = string.Join("|", trailer.TrailerTypes.Select(i => i.ToString()).ToArray()); + } + else + { + _saveItemCommand.GetParameter(index++).Value = null; + } + _saveItemCommand.Transaction = transaction; _saveItemCommand.ExecuteNonQuery(); @@ -1109,6 +1127,20 @@ namespace MediaBrowser.Server.Implementations.Persistence item.Tags = reader.GetString(48).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); } + if (!reader.IsDBNull(49)) + { + item.SourceType = (SourceType)Enum.Parse(typeof(SourceType), reader.GetString(49), true); + } + + var trailer = item as Trailer; + if (trailer != null) + { + if (!reader.IsDBNull(50)) + { + trailer.TrailerTypes = reader.GetString(50).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true)).ToList(); + } + } + return item; } @@ -1871,6 +1903,56 @@ namespace MediaBrowser.Server.Implementations.Persistence cmd.Parameters.Add(cmd, "@MaxStartDate", DbType.Date).Value = query.MaxStartDate.Value; } + if (query.SourceTypes.Length == 1) + { + whereClauses.Add("SourceType=@SourceType"); + cmd.Parameters.Add(cmd, "@SourceType", DbType.String).Value = query.SourceTypes[0]; + } + else if (query.SourceTypes.Length > 1) + { + var inClause = string.Join(",", query.SourceTypes.Select(i => "'" + i + "'").ToArray()); + whereClauses.Add(string.Format("SourceType in ({0})", inClause)); + } + + if (query.ExcludeSourceTypes.Length == 1) + { + whereClauses.Add("SourceType<>@SourceType"); + cmd.Parameters.Add(cmd, "@SourceType", DbType.String).Value = query.SourceTypes[0]; + } + else if (query.ExcludeSourceTypes.Length > 1) + { + var inClause = string.Join(",", query.ExcludeSourceTypes.Select(i => "'" + i + "'").ToArray()); + whereClauses.Add(string.Format("SourceType not in ({0})", inClause)); + } + + if (query.TrailerTypes.Length > 0) + { + var clauses = new List<string>(); + var index = 0; + foreach (var type in query.TrailerTypes) + { + clauses.Add("TrailerTypes like @TrailerTypes" + index); + cmd.Parameters.Add(cmd, "@TrailerTypes" + index, DbType.String).Value = "%" + type + "%"; + index++; + } + var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")"; + whereClauses.Add(clause); + } + + if (query.ExcludeTrailerTypes.Length > 0) + { + var clauses = new List<string>(); + var index = 0; + foreach (var type in query.ExcludeTrailerTypes) + { + clauses.Add("TrailerTypes not like @TrailerTypes" + index); + cmd.Parameters.Add(cmd, "@TrailerTypes" + index, DbType.String).Value = "%" + type + "%"; + index++; + } + var clause = "(" + string.Join(" AND ", clauses.ToArray()) + ")"; + whereClauses.Add(clause); + } + if (query.IsAiring.HasValue) { if (query.IsAiring.Value) @@ -2046,7 +2128,6 @@ namespace MediaBrowser.Server.Implementations.Persistence typeof(Trailer), typeof(BoxSet), typeof(Episode), - typeof(ChannelVideoItem), typeof(Season), typeof(Series), typeof(Book), @@ -2152,8 +2233,6 @@ namespace MediaBrowser.Server.Implementations.Persistence dict[t.Name] = new[] { t.FullName }; } - dict["ChannelItem"] = new[] { typeof(ChannelVideoItem).FullName, typeof(ChannelAudioItem).FullName, typeof(ChannelFolderItem).FullName }; - dict["LiveTvItem"] = new[] { typeof(LiveTvAudioRecording).FullName, typeof(LiveTvVideoRecording).FullName, typeof(LiveTvChannel).FullName, typeof(LiveTvProgram).FullName }; dict["Recording"] = new[] { typeof(LiveTvAudioRecording).FullName, typeof(LiveTvVideoRecording).FullName }; dict["Program"] = new[] { typeof(LiveTvProgram).FullName }; dict["TvChannel"] = new[] { typeof(LiveTvChannel).FullName }; diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index 8ebc8d91e..e22f86b11 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -536,7 +536,7 @@ namespace MediaBrowser.Server.Implementations.Sync } } - if (item is LiveTvChannel || item is IChannelItem) + if (item.SourceType != SourceType.Library) { return false; } |
