diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations')
7 files changed, 159 insertions, 86 deletions
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index ee49a7005..e957b9889 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -424,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); @@ -431,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) { @@ -452,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) { @@ -505,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() @@ -523,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); @@ -1261,7 +1266,14 @@ namespace MediaBrowser.Server.Implementations.Channels } else if (info.MediaType == ChannelMediaType.Audio) { - item = GetItemById<Audio>(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 { @@ -1302,6 +1314,16 @@ namespace MediaBrowser.Server.Implementations.Channels item.Tags = info.Tags; } + var trailer = item as Trailer; + if (trailer != null) + { + if (!info.TrailerTypes.SequenceEqual(trailer.TrailerTypes)) + { + forceUpdate = true; + } + trailer.TrailerTypes = info.TrailerTypes; + } + item.ChannelId = internalChannelId.ToString("N"); if (item.ParentId != internalChannelId) @@ -1384,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) { @@ -1519,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 581b03f08..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); 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 184737ece..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 { @@ -454,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) @@ -556,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) { @@ -615,7 +618,7 @@ namespace MediaBrowser.Server.Implementations.Library return null; } - return ResolveItem(args); + return ResolveItem(args, resolvers); } public bool IgnoreFile(FileSystemMetadata file, BaseItem parent) @@ -658,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); @@ -675,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) { @@ -2306,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 e776e58f9..10263f7d7 100644 --- a/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs +++ b/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs @@ -31,7 +31,10 @@ namespace MediaBrowser.Server.Implementations.Library var trailerResult = _libraryManager.GetItems(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(Trailer).Name }, - //IsLocalTrailer = false + ExcludeTrailerTypes = new[] + { + TrailerType.LocalTrailer + } }); var trailers = trailerResult.Items; 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/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index c224c45d5..3f50278f6 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -224,6 +224,7 @@ namespace MediaBrowser.Server.Implementations.Persistence _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(); @@ -355,7 +356,8 @@ namespace MediaBrowser.Server.Implementations.Persistence "LockedFields", "Studios", "Tags", - "SourceType" + "SourceType", + "TrailerTypes" }; private readonly string[] _mediaStreamSaveColumns = @@ -456,7 +458,8 @@ namespace MediaBrowser.Server.Implementations.Persistence "UnratedType", "TopParentId", "IsItemByName", - "SourceType" + "SourceType", + "TrailerTypes" }; _saveItemCommand = _connection.CreateCommand(); _saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values ("; @@ -751,7 +754,17 @@ 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(); @@ -1119,6 +1132,15 @@ namespace MediaBrowser.Server.Implementations.Persistence 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; } @@ -1902,6 +1924,34 @@ namespace MediaBrowser.Server.Implementations.Persistence 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) { |
