Răsfoiți Sursa

channel improvements

Luke Pulverenti 10 ani în urmă
părinte
comite
3be25f8bfb
38 a modificat fișierele cu 264 adăugiri și 133 ștergeri
  1. 3 3
      MediaBrowser.Api/Images/ImageService.cs
  2. 11 1
      MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs
  3. 5 0
      MediaBrowser.Controller/Channels/Channel.cs
  4. 11 0
      MediaBrowser.Controller/Channels/ChannelAudioItem.cs
  5. 11 0
      MediaBrowser.Controller/Channels/ChannelFolderItem.cs
  6. 2 0
      MediaBrowser.Controller/Channels/ChannelItemInfo.cs
  7. 14 2
      MediaBrowser.Controller/Channels/ChannelVideoItem.cs
  8. 2 0
      MediaBrowser.Controller/Channels/IChannelItem.cs
  9. 5 2
      MediaBrowser.Controller/Channels/IChannelMediaItem.cs
  10. 5 0
      MediaBrowser.Controller/Channels/InternalChannelFeatures.cs
  11. 12 0
      MediaBrowser.Controller/Entities/BaseItem.cs
  12. 6 0
      MediaBrowser.Controller/Entities/IHasImages.cs
  13. 1 9
      MediaBrowser.Controller/IServerApplicationPaths.cs
  14. 1 0
      MediaBrowser.Controller/Providers/ItemLookupInfo.cs
  15. 7 1
      MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs
  16. 6 0
      MediaBrowser.Model/Channels/ChannelFeatures.cs
  17. 7 1
      MediaBrowser.Model/Channels/ChannelMediaContentType.cs
  18. 9 1
      MediaBrowser.Model/Channels/ChannelQuery.cs
  19. 8 0
      MediaBrowser.Model/Entities/ExtraType.cs
  20. 1 1
      MediaBrowser.Providers/Manager/ImageSaver.cs
  21. 1 2
      MediaBrowser.Providers/Manager/MetadataService.cs
  22. 0 5
      MediaBrowser.Providers/Manager/ProviderManager.cs
  23. 43 24
      MediaBrowser.Providers/Movies/MovieDbImageProvider.cs
  24. 1 2
      MediaBrowser.Providers/Movies/MovieDbProvider.cs
  25. 6 5
      MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs
  26. 2 2
      MediaBrowser.Providers/Movies/MovieExternalIds.cs
  27. 1 1
      MediaBrowser.Providers/Omdb/OmdbItemProvider.cs
  28. 55 37
      MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
  29. 11 4
      MediaBrowser.Server.Implementations/Channels/ChannelPostScanTask.cs
  30. 2 1
      MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
  31. 2 2
      MediaBrowser.Server.Implementations/Library/LibraryManager.cs
  32. 6 12
      MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs
  33. 0 8
      MediaBrowser.Server.Implementations/ServerApplicationPaths.cs
  34. 1 1
      MediaBrowser.ServerApplication/ApplicationHost.cs
  35. 2 2
      Nuget/MediaBrowser.Common.Internal.nuspec
  36. 1 1
      Nuget/MediaBrowser.Common.nuspec
  37. 1 1
      Nuget/MediaBrowser.Model.Signed.nuspec
  38. 2 2
      Nuget/MediaBrowser.Server.Core.nuspec

+ 3 - 3
MediaBrowser.Api/Images/ImageService.cs

@@ -405,7 +405,7 @@ namespace MediaBrowser.Api.Images
         /// <returns>System.Object.</returns>
         public object Get(GetUserImage request)
         {
-            var item = _userManager.Users.First(i => i.Id == request.Id);
+            var item = _userManager.GetUserById(request.Id);
 
             return GetImage(request, item, false);
         }
@@ -441,7 +441,7 @@ namespace MediaBrowser.Api.Images
 
             request.Type = (ImageType)Enum.Parse(typeof(ImageType), pathInfo.GetArgumentValue<string>(3), true);
 
-            var item = _userManager.Users.First(i => i.Id == id);
+            var item = _userManager.GetUserById(id);
 
             var task = PostImage(item, request.RequestStream, request.Type, Request.ContentType);
 
@@ -472,7 +472,7 @@ namespace MediaBrowser.Api.Images
         /// <param name="request">The request.</param>
         public void Delete(DeleteUserImage request)
         {
-            var item = _userManager.Users.First(i => i.Id == request.Id);
+            var item = _userManager.GetUserById(request.Id);
 
             var task = item.DeleteImage(request.Type, request.Index ?? 0);
 

+ 11 - 1
MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs

@@ -33,6 +33,14 @@ namespace MediaBrowser.Common.ScheduledTasks
             {
                 key = hasKey.Key;
             }
+
+            var triggers = task.Triggers
+                .Select(GetTriggerInfo)
+                .OrderBy(i => i.Type)
+                .ThenBy(i => i.DayOfWeek ?? DayOfWeek.Sunday)
+                .ThenBy(i => i.TimeOfDayTicks ?? 0)
+                .ToList();
+
             return new TaskInfo
             {
                 Name = task.Name,
@@ -40,7 +48,9 @@ namespace MediaBrowser.Common.ScheduledTasks
                 State = task.State,
                 Id = task.Id,
                 LastExecutionResult = task.LastExecutionResult,
-                Triggers = task.Triggers.Select(GetTriggerInfo).ToList(),
+
+                Triggers = triggers,
+
                 Description = task.Description,
                 Category = task.Category,
                 IsHidden = isHidden,

+ 5 - 0
MediaBrowser.Controller/Channels/Channel.cs

@@ -47,5 +47,10 @@ namespace MediaBrowser.Controller.Channels
                 };
             }
         }
+
+        protected override string GetInternalMetadataPath(string basePath)
+        {
+            return System.IO.Path.Combine(basePath, "channels", Id.ToString("N"), "metadata");
+        }
     }
 }

+ 11 - 0
MediaBrowser.Controller/Channels/ChannelAudioItem.cs

@@ -12,6 +12,7 @@ namespace MediaBrowser.Controller.Channels
         public string ExternalId { get; set; }
 
         public string ChannelId { get; set; }
+        public string DataVersion { get; set; }
 
         public ChannelItemType ChannelItemType { get; set; }
 
@@ -41,6 +42,11 @@ namespace MediaBrowser.Controller.Channels
             }
         }
 
+        public override bool IsSaveLocalMetadataEnabled()
+        {
+            return false;
+        }
+
         public ChannelAudioItem()
         {
             ChannelMediaSources = new List<ChannelMediaInfo>();
@@ -58,5 +64,10 @@ namespace MediaBrowser.Controller.Channels
                 return base.LocationType;
             }
         }
+
+        protected override string GetInternalMetadataPath(string basePath)
+        {
+            return System.IO.Path.Combine(basePath, "channels", ChannelId, Id.ToString("N"));
+        }
     }
 }

+ 11 - 0
MediaBrowser.Controller/Channels/ChannelFolderItem.cs

@@ -12,6 +12,7 @@ namespace MediaBrowser.Controller.Channels
         public string ExternalId { get; set; }
 
         public string ChannelId { get; set; }
+        public string DataVersion { get; set; }
 
         public ChannelItemType ChannelItemType { get; set; }
         public ChannelFolderType ChannelFolderType { get; set; }
@@ -32,6 +33,11 @@ namespace MediaBrowser.Controller.Channels
             }
         }
 
+        public override bool IsSaveLocalMetadataEnabled()
+        {
+            return false;
+        }
+
         public override string GetUserDataKey()
         {
             return ExternalId;
@@ -63,5 +69,10 @@ namespace MediaBrowser.Controller.Channels
                 };
             }
         }
+
+        protected override string GetInternalMetadataPath(string basePath)
+        {
+            return System.IO.Path.Combine(basePath, "channels", ChannelId, Id.ToString("N"));
+        }
     }
 }

+ 2 - 0
MediaBrowser.Controller/Channels/ChannelItemInfo.cs

@@ -36,6 +36,8 @@ namespace MediaBrowser.Controller.Channels
         public ChannelFolderType FolderType { get; set; }
 
         public ChannelMediaContentType ContentType { get; set; }
+        public ExtraType ExtraType { get; set; }
+        public TrailerType TrailerType { get; set; }
 
         public Dictionary<string, string> ProviderIds { get; set; }
 

+ 14 - 2
MediaBrowser.Controller/Channels/ChannelVideoItem.cs

@@ -15,6 +15,7 @@ namespace MediaBrowser.Controller.Channels
         public string ExternalId { get; set; }
 
         public string ChannelId { get; set; }
+        public string DataVersion { get; set; }
 
         public ChannelItemType ChannelItemType { get; set; }
 
@@ -28,13 +29,13 @@ namespace MediaBrowser.Controller.Channels
         
         public override string GetUserDataKey()
         {
-            if (ContentType == ChannelMediaContentType.Trailer)
+            if (ContentType == ChannelMediaContentType.MovieExtra)
             {
                 var key = this.GetProviderId(MetadataProviders.Tmdb) ?? this.GetProviderId(MetadataProviders.Tvdb) ?? this.GetProviderId(MetadataProviders.Imdb) ?? this.GetProviderId(MetadataProviders.Tvcom);
 
                 if (!string.IsNullOrWhiteSpace(key))
                 {
-                    key = key + "-trailer";
+                    key = key + "-" + ExtraType.ToString().ToLower();
 
                     // Make sure different trailers have their own data.
                     if (RunTimeTicks.HasValue)
@@ -62,6 +63,11 @@ namespace MediaBrowser.Controller.Channels
             }
         }
 
+        public override bool IsSaveLocalMetadataEnabled()
+        {
+            return false;
+        }
+
         public ChannelVideoItem()
         {
             ChannelMediaSources = new List<ChannelMediaInfo>();
@@ -94,8 +100,14 @@ namespace MediaBrowser.Controller.Channels
             var info = GetItemLookupInfo<ChannelItemLookupInfo>();
 
             info.ContentType = ContentType;
+            info.ExtraType = ExtraType;
 
             return info;
         }
+
+        protected override string GetInternalMetadataPath(string basePath)
+        {
+            return System.IO.Path.Combine(basePath, "channels", ChannelId, Id.ToString("N"));
+        }
     }
 }

+ 2 - 0
MediaBrowser.Controller/Channels/IChannelItem.cs

@@ -11,5 +11,7 @@ namespace MediaBrowser.Controller.Channels
         ChannelItemType ChannelItemType { get; set; }
 
         string OriginalImageUrl { get; set; }
+
+        string DataVersion { get; set; }
     }
 }

+ 5 - 2
MediaBrowser.Controller/Channels/IChannelMediaItem.cs

@@ -1,5 +1,6 @@
-using System.Collections.Generic;
-using MediaBrowser.Model.Channels;
+using MediaBrowser.Model.Channels;
+using MediaBrowser.Model.Entities;
+using System.Collections.Generic;
 
 namespace MediaBrowser.Controller.Channels
 {
@@ -10,6 +11,8 @@ namespace MediaBrowser.Controller.Channels
 
         ChannelMediaContentType ContentType { get; set; }
 
+        ExtraType ExtraType { get; set; }
+
         List<ChannelMediaInfo> ChannelMediaSources { get; set; }
     }
 }

+ 5 - 0
MediaBrowser.Controller/Channels/InternalChannelFeatures.cs

@@ -32,6 +32,11 @@ namespace MediaBrowser.Controller.Channels
         /// Indicates if a sort ascending/descending toggle is supported or not.
         /// </summary>
         public bool SupportsSortOrderToggle { get; set; }
+        /// <summary>
+        /// Gets or sets the automatic refresh levels.
+        /// </summary>
+        /// <value>The automatic refresh levels.</value>
+        public int? AutoRefreshLevels { get; set; }
 
         public InternalChannelFeatures()
         {

+ 12 - 0
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -351,6 +351,18 @@ namespace MediaBrowser.Controller.Entities
             }
         }
 
+        public string GetInternalMetadataPath()
+        {
+            return GetInternalMetadataPath(ConfigurationManager.ApplicationPaths.InternalMetadataPath);
+        }
+
+        protected virtual string GetInternalMetadataPath(string basePath)
+        {
+            var idString = Id.ToString("N");
+
+            return System.IO.Path.Combine(basePath, idString.Substring(0, 2), idString);
+        }
+
         /// <summary>
         /// Creates the name of the sort.
         /// </summary>

+ 6 - 0
MediaBrowser.Controller/Entities/IHasImages.cs

@@ -160,6 +160,12 @@ namespace MediaBrowser.Controller.Entities
         /// </summary>
         /// <value><c>true</c> if [supports remote image downloading]; otherwise, <c>false</c>.</value>
         bool SupportsRemoteImageDownloading { get; }
+
+        /// <summary>
+        /// Gets the internal metadata path.
+        /// </summary>
+        /// <returns>System.String.</returns>
+        string GetInternalMetadataPath();
     }
 
     public static class HasImagesExtensions

+ 1 - 9
MediaBrowser.Controller/IServerApplicationPaths.cs

@@ -1,5 +1,4 @@
-using System;
-using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Configuration;
 
 namespace MediaBrowser.Controller
 {
@@ -106,12 +105,5 @@ namespace MediaBrowser.Controller
         /// </summary>
         /// <value>The internal metadata path.</value>
         string InternalMetadataPath { get; }
-
-        /// <summary>
-        /// Gets the internal metadata path.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <returns>System.String.</returns>
-        string GetInternalMetadataPath(Guid id);
     }
 }

+ 1 - 0
MediaBrowser.Controller/Providers/ItemLookupInfo.cs

@@ -241,5 +241,6 @@ namespace MediaBrowser.Controller.Providers
     public class ChannelItemLookupInfo : ItemLookupInfo
     {
         public ChannelMediaContentType ContentType { get; set; }
+        public ExtraType ExtraType { get; set; }
     }
 }

+ 7 - 1
MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Channels;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
@@ -56,7 +57,12 @@ namespace MediaBrowser.LocalMetadata.Images
 
         public List<LocalImageInfo> GetImages(IHasImages item, IDirectoryService directoryService)
         {
-            var path = _config.ApplicationPaths.GetInternalMetadataPath(item.Id);
+            var path = item.GetInternalMetadataPath();
+
+            if (item is IChannelItem)
+            {
+                var b = true;
+            }
 
             try
             {

+ 6 - 0
MediaBrowser.Model/Channels/ChannelFeatures.cs

@@ -39,6 +39,12 @@ namespace MediaBrowser.Model.Channels
         /// </summary>
         public int? MaxPageSize { get; set; }
 
+        /// <summary>
+        /// Gets or sets the automatic refresh levels.
+        /// </summary>
+        /// <value>The automatic refresh levels.</value>
+        public int? AutoRefreshLevels { get; set; }
+
         /// <summary>
         /// Gets or sets the default sort orders.
         /// </summary>

+ 7 - 1
MediaBrowser.Model/Channels/ChannelMediaContentType.cs

@@ -12,6 +12,12 @@
 
         Episode = 4,
 
-        Song = 5
+        Song = 5,
+
+        MovieExtra = 6,
+
+        TvExtra = 7,
+
+        GameExtra = 8
     }
 }

+ 9 - 1
MediaBrowser.Model/Channels/ChannelQuery.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Querying;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Querying;
 using System.Collections.Generic;
 
 namespace MediaBrowser.Model.Channels
@@ -68,11 +69,18 @@ namespace MediaBrowser.Model.Channels
         /// <value>The content types.</value>
         public ChannelMediaContentType[] ContentTypes { get; set; }
 
+        /// <summary>
+        /// Gets or sets the extra types.
+        /// </summary>
+        /// <value>The extra types.</value>
+        public ExtraType[] ExtraTypes { get; set; }
+        
         public AllChannelMediaQuery()
         {
             ChannelIds = new string[] { };
 
             ContentTypes = new ChannelMediaContentType[] { };
+            ExtraTypes = new ExtraType[] { };
 
             Filters = new ItemFilter[] { };
             Fields = new List<ItemFields>();

+ 8 - 0
MediaBrowser.Model/Entities/ExtraType.cs

@@ -13,4 +13,12 @@ namespace MediaBrowser.Model.Entities
         ThemeSong = 8,
         ThemeVideo = 9
     }
+
+    public enum TrailerType
+    {
+        ComingSoonToTheaters = 1,
+        ComingSoonToDvd = 2,
+        ComingSoonToStreaming = 3,
+        Archive = 4
+    }
 }

+ 1 - 1
MediaBrowser.Providers/Manager/ImageSaver.cs

@@ -362,7 +362,7 @@ namespace MediaBrowser.Providers.Manager
                 {
                     filename = "folder";
                 }
-                path = Path.Combine(_config.ApplicationPaths.GetInternalMetadataPath(item.Id), filename + extension);
+                path = Path.Combine(item.GetInternalMetadataPath(), filename + extension);
             }
 
             return path;

+ 1 - 2
MediaBrowser.Providers/Manager/MetadataService.cs

@@ -1,5 +1,4 @@
-using System.IO;
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;

+ 0 - 5
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -357,11 +357,6 @@ namespace MediaBrowser.Providers.Manager
                 }
             }
 
-            if (!item.SupportsLocalMetadata && provider is ILocalImageProvider)
-            {
-                return false;
-            }
-
             try
             {
                 return provider.Supports(item);

+ 43 - 24
MediaBrowser.Providers/Movies/MovieDbImageProvider.cs

@@ -49,17 +49,28 @@ namespace MediaBrowser.Providers.Movies
 
             var channelItem = item as ChannelVideoItem;
 
-            if (channelItem != null && channelItem.ContentType == ChannelMediaContentType.Trailer)
+            if (channelItem != null && channelItem.ContentType == ChannelMediaContentType.MovieExtra && channelItem.ExtraType == ExtraType.Trailer)
             {
                 return true;
             }
-            
+
             // Don't support local trailers
             return item is Movie || item is MusicVideo;
         }
 
         public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
         {
+            var channelItem = item as ChannelVideoItem;
+
+            if (channelItem != null)
+            {
+                // Too many channel items to allow backdrops here
+                return new List<ImageType>
+                {
+                    ImageType.Primary
+                };
+            }
+
             return new List<ImageType>
             {
                 ImageType.Primary, 
@@ -82,30 +93,38 @@ namespace MediaBrowser.Providers.Movies
 
             var tmdbImageUrl = tmdbSettings.images.base_url + "original";
 
-            list.AddRange(GetPosters(results).Select(i => new RemoteImageInfo
+            var supportedImages = GetSupportedImages(item).ToList();
+
+            if (supportedImages.Contains(ImageType.Primary))
             {
-                Url = tmdbImageUrl + i.file_path,
-                CommunityRating = i.vote_average,
-                VoteCount = i.vote_count,
-                Width = i.width,
-                Height = i.height,
-                Language = i.iso_639_1,
-                ProviderName = Name,
-                Type = ImageType.Primary,
-                RatingType = RatingType.Score
-            }));
-
-            list.AddRange(GetBackdrops(results).Select(i => new RemoteImageInfo
+                list.AddRange(GetPosters(results).Select(i => new RemoteImageInfo
+                {
+                    Url = tmdbImageUrl + i.file_path,
+                    CommunityRating = i.vote_average,
+                    VoteCount = i.vote_count,
+                    Width = i.width,
+                    Height = i.height,
+                    Language = i.iso_639_1,
+                    ProviderName = Name,
+                    Type = ImageType.Primary,
+                    RatingType = RatingType.Score
+                }));
+            }
+
+            if (supportedImages.Contains(ImageType.Backdrop))
             {
-                Url = tmdbImageUrl + i.file_path,
-                CommunityRating = i.vote_average,
-                VoteCount = i.vote_count,
-                Width = i.width,
-                Height = i.height,
-                ProviderName = Name,
-                Type = ImageType.Backdrop,
-                RatingType = RatingType.Score
-            }));
+                list.AddRange(GetBackdrops(results).Select(i => new RemoteImageInfo
+                {
+                    Url = tmdbImageUrl + i.file_path,
+                    CommunityRating = i.vote_average,
+                    VoteCount = i.vote_count,
+                    Width = i.width,
+                    Height = i.height,
+                    ProviderName = Name,
+                    Type = ImageType.Backdrop,
+                    RatingType = RatingType.Score
+                }));
+            }
 
             var language = item.GetPreferredMetadataLanguage();
 

+ 1 - 2
MediaBrowser.Providers/Movies/MovieDbProvider.cs

@@ -344,8 +344,7 @@ namespace MediaBrowser.Providers.Movies
 
             try
             {
-                // Limit to three requests per second
-                var diff = 340 - (DateTime.Now - _lastRequestDate).TotalMilliseconds;
+                var diff = 100 - (DateTime.Now - _lastRequestDate).TotalMilliseconds;
 
                 if (diff > 0)
                 {

+ 6 - 5
MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs

@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Channels;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Channels;
+using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Providers;
 using System;
 using System.Collections.Generic;
@@ -32,7 +33,7 @@ namespace MediaBrowser.Providers.Movies
 
         public Task<MetadataResult<ChannelVideoItem>> GetMetadata(ChannelItemLookupInfo info, CancellationToken cancellationToken)
         {
-            if (info.ContentType != Model.Channels.ChannelMediaContentType.Trailer)
+            if (info.ContentType != ChannelMediaContentType.MovieExtra || info.ExtraType != ExtraType.Trailer)
             {
                 return Task.FromResult(new MetadataResult<ChannelVideoItem>());
             }
@@ -40,14 +41,14 @@ namespace MediaBrowser.Providers.Movies
             return MovieDbProvider.Current.GetItemMetadata<ChannelVideoItem>(info, cancellationToken);
         }
 
-        public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ChannelItemLookupInfo searchInfo, CancellationToken cancellationToken)
+        public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ChannelItemLookupInfo info, CancellationToken cancellationToken)
         {
-            if (searchInfo.ContentType != ChannelMediaContentType.Trailer)
+            if (info.ContentType != ChannelMediaContentType.MovieExtra || info.ExtraType != ExtraType.Trailer)
             {
                 return Task.FromResult<IEnumerable<RemoteSearchResult>>(new List<RemoteSearchResult>());
             }
-            
-            return MovieDbProvider.Current.GetMovieSearchResults(searchInfo, cancellationToken);
+
+            return MovieDbProvider.Current.GetMovieSearchResults(info, cancellationToken);
         }
 
         public string Name

+ 2 - 2
MediaBrowser.Providers/Movies/MovieExternalIds.cs

@@ -29,7 +29,7 @@ namespace MediaBrowser.Providers.Movies
         {
             var channelItem = item as ChannelVideoItem;
 
-            if (channelItem != null && channelItem.ContentType == ChannelMediaContentType.Trailer)
+            if (channelItem != null && channelItem.ContentType == ChannelMediaContentType.MovieExtra && channelItem.ExtraType == ExtraType.Trailer)
             {
                 return true;
             }
@@ -151,7 +151,7 @@ namespace MediaBrowser.Providers.Movies
         {
             var channelItem = item as ChannelVideoItem;
 
-            if (channelItem != null && channelItem.ContentType == ChannelMediaContentType.Trailer)
+            if (channelItem != null && channelItem.ContentType == ChannelMediaContentType.MovieExtra && channelItem.ExtraType == ExtraType.Trailer)
             {
                 return true;
             }

+ 1 - 1
MediaBrowser.Providers/Omdb/OmdbItemProvider.cs

@@ -49,7 +49,7 @@ namespace MediaBrowser.Providers.Omdb
 
         public Task<MetadataResult<ChannelVideoItem>> GetMetadata(ChannelItemLookupInfo info, CancellationToken cancellationToken)
         {
-            if (info.ContentType != ChannelMediaContentType.Trailer)
+            if (info.ContentType != ChannelMediaContentType.MovieExtra || info.ExtraType != ExtraType.Trailer)
             {
                 return Task.FromResult(new MetadataResult<ChannelVideoItem>());
             }

+ 55 - 37
MediaBrowser.Server.Implementations/Channels/ChannelManager.cs

@@ -547,7 +547,8 @@ namespace MediaBrowser.Server.Implementations.Channels
                 SupportsLatestMedia = supportsLatest,
                 Name = channel.Name,
                 Id = channel.Id.ToString("N"),
-                SupportsContentDownloading = isIndexable || supportsLatest
+                SupportsContentDownloading = isIndexable || supportsLatest,
+                AutoRefreshLevels = features.AutoRefreshLevels
             };
         }
 
@@ -627,6 +628,13 @@ namespace MediaBrowser.Server.Implementations.Channels
 
                 items = items.Where(i => contentTypes.Contains(i.Item2.ContentType));
             }
+            if (query.ExtraTypes.Length > 0)
+            {
+                // Avoid implicitly captured closure
+                var contentTypes = query.ExtraTypes;
+
+                items = items.Where(i => contentTypes.Contains(i.Item2.ExtraType));
+            }
 
             // Avoid implicitly captured closure
             var token = cancellationToken;
@@ -776,6 +784,13 @@ namespace MediaBrowser.Server.Implementations.Channels
 
                 items = items.Where(i => contentTypes.Contains(i.Item2.ContentType));
             }
+            if (query.ExtraTypes.Length > 0)
+            {
+                // Avoid implicitly captured closure
+                var contentTypes = query.ExtraTypes;
+
+                items = items.Where(i => contentTypes.Contains(i.Item2.ExtraType));
+            }
 
             if (query.StartIndex.HasValue)
             {
@@ -806,7 +821,7 @@ namespace MediaBrowser.Server.Implementations.Channels
                 Items = returnItemArray
             };
         }
-        
+
         public async Task<QueryResult<BaseItemDto>> GetAllMedia(AllChannelMediaQuery query, CancellationToken cancellationToken)
         {
             var user = string.IsNullOrWhiteSpace(query.UserId)
@@ -1161,60 +1176,62 @@ namespace MediaBrowser.Server.Implementations.Channels
             };
         }
 
-        private string GetIdToHash(string externalId, IChannel channelProvider)
+        private string GetIdToHash(string externalId, string channelName)
         {
             // Increment this as needed to force new downloads
             // Incorporate Name because it's being used to convert channel entity to provider
-            return externalId + (channelProvider.DataVersion ?? string.Empty) +
-                (channelProvider.Name ?? string.Empty) + "16";
+            return externalId + (channelName ?? string.Empty) + "16";
         }
 
-        private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Guid internalChannelId, CancellationToken cancellationToken)
+        private T GetItemById<T>(string idString, string channelName, string channnelDataVersion, out bool isNew)
+            where T : BaseItem, IChannelItem, new()
         {
-            BaseItem item;
-            Guid id;
-            var isNew = false;
+            var id = GetIdToHash(idString, channelName).GetMBId(typeof(T));
 
-            var idToHash = GetIdToHash(info.Id, channelProvider);
+            T item = null;
 
-            if (info.Type == ChannelItemType.Folder)
+            try
             {
-                id = idToHash.GetMBId(typeof(ChannelFolderItem));
-
-                item = _libraryManager.GetItemById(id) as ChannelFolderItem;
-
-                if (item == null)
-                {
-                    isNew = true;
-                    item = new ChannelFolderItem();
-                }
+                item = _libraryManager.GetItemById(id) as T;
             }
-            else if (info.MediaType == ChannelMediaType.Audio)
+            catch (Exception ex)
             {
-                id = idToHash.GetMBId(typeof(ChannelAudioItem));
-
-                item = _libraryManager.GetItemById(id) as ChannelAudioItem;
+                _logger.ErrorException("Error retrieving channel item from database", ex);
+            }
 
-                if (item == null)
-                {
-                    isNew = true;
-                    item = new ChannelAudioItem();
-                }
+            if (item == null || !string.Equals(item.DataVersion, channnelDataVersion, StringComparison.Ordinal))
+            {
+                item = new T();
+                isNew = true;
             }
             else
             {
-                id = idToHash.GetMBId(typeof(ChannelVideoItem));
+                isNew = false;
+            }
 
-                item = _libraryManager.GetItemById(id) as ChannelVideoItem;
+            item.DataVersion = channnelDataVersion;
+            item.Id = id;
+            return item;
+        }
 
-                if (item == null)
-                {
-                    isNew = true;
-                    item = new ChannelVideoItem();
-                }
+        private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Guid internalChannelId, CancellationToken cancellationToken)
+        {
+            BaseItem item;
+            bool isNew;
+
+            if (info.Type == ChannelItemType.Folder)
+            {
+                item = GetItemById<ChannelFolderItem>(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);
+            }
+            else
+            {
+                item = GetItemById<ChannelVideoItem>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
             }
 
-            item.Id = id;
             item.RunTimeTicks = info.RunTimeTicks;
 
             if (isNew)
@@ -1254,6 +1271,7 @@ namespace MediaBrowser.Server.Implementations.Channels
             if (channelMediaItem != null)
             {
                 channelMediaItem.ContentType = info.ContentType;
+                channelMediaItem.ExtraType = info.ExtraType;
                 channelMediaItem.ChannelMediaSources = info.MediaSources;
 
                 var mediaSource = info.MediaSources.FirstOrDefault();

+ 11 - 4
MediaBrowser.Server.Implementations/Channels/ChannelPostScanTask.cs

@@ -64,9 +64,16 @@ namespace MediaBrowser.Server.Implementations.Channels
 
             foreach (var channel in channels.Items)
             {
+                var channelId = channel.Id.ToString("N");
+
+                var features = _channelManager.GetChannelFeatures(channelId);
+
+                const int currentRefreshLevel = 1;
+                var maxRefreshLevel = features.AutoRefreshLevels ?? 1;
+
                 try
                 {
-                    await GetAllItems(user, channel.Id.ToString("N"), null, false, cancellationToken).ConfigureAwait(false);
+                    await GetAllItems(user, channelId, null, currentRefreshLevel, maxRefreshLevel, cancellationToken).ConfigureAwait(false);
                 }
                 catch (Exception ex)
                 {
@@ -83,7 +90,7 @@ namespace MediaBrowser.Server.Implementations.Channels
 
         }
 
-        private async Task GetAllItems(string user, string channelId, string folderId, bool recursive, CancellationToken cancellationToken)
+        private async Task GetAllItems(string user, string channelId, string folderId, int currentRefreshLevel, int maxRefreshLevel, CancellationToken cancellationToken)
         {
             var folderItems = new List<string>();
 
@@ -117,13 +124,13 @@ namespace MediaBrowser.Server.Implementations.Channels
                 totalCount = result.TotalRecordCount;
             }
 
-            if (recursive)
+            if (currentRefreshLevel < maxRefreshLevel)
             {
                 foreach (var folder in folderItems)
                 {
                     try
                     {
-                        await GetAllItems(user, channelId, folder, false, cancellationToken).ConfigureAwait(false);
+                        await GetAllItems(user, channelId, folder, currentRefreshLevel + 1, maxRefreshLevel, cancellationToken).ConfigureAwait(false);
                     }
                     catch (Exception ex)
                     {

+ 2 - 1
MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs

@@ -99,7 +99,8 @@ namespace MediaBrowser.Server.Implementations.Intros
             {
                 var channelTrailers = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
                 {
-                    ContentTypes = new[] { ChannelMediaContentType.Trailer },
+                    ContentTypes = new[] { ChannelMediaContentType.MovieExtra },
+                    ExtraTypes = new[] { ExtraType.Trailer },
                     UserId = user.Id.ToString("N")
 
                 }, CancellationToken.None);

+ 2 - 2
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -449,10 +449,10 @@ namespace MediaBrowser.Server.Implementations.Library
         {
             var list = new List<string>
             {
-                ConfigurationManager.ApplicationPaths.GetInternalMetadataPath(item.Id)
+                item.GetInternalMetadataPath()
             };
 
-            list.AddRange(children.Select(i => ConfigurationManager.ApplicationPaths.GetInternalMetadataPath(i.Id)));
+            list.AddRange(children.Select(i => i.GetInternalMetadataPath()));
 
             return list;
         }

+ 6 - 12
MediaBrowser.Server.Implementations/MediaEncoder/EncodingManager.cs

@@ -1,12 +1,9 @@
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.IO;
+using MediaBrowser.Common.IO;
 using MediaBrowser.Controller.Chapters;
-using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.MediaEncoding;
-using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.MediaInfo;
@@ -22,20 +19,17 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder
 {
     public class EncodingManager : IEncodingManager
     {
-        private readonly IServerConfigurationManager _config;
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
         private readonly IFileSystem _fileSystem;
         private readonly ILogger _logger;
         private readonly IMediaEncoder _encoder;
         private readonly IChapterManager _chapterManager;
 
-        public EncodingManager(IServerConfigurationManager config, 
-            IFileSystem fileSystem, 
+        public EncodingManager(IFileSystem fileSystem, 
             ILogger logger, 
             IMediaEncoder encoder, 
             IChapterManager chapterManager)
         {
-            _config = config;
             _fileSystem = fileSystem;
             _logger = logger;
             _encoder = encoder;
@@ -46,9 +40,9 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder
         /// Gets the chapter images data path.
         /// </summary>
         /// <value>The chapter images data path.</value>
-        private string GetChapterImagesPath(Guid itemId)
+        private string GetChapterImagesPath(IHasImages item)
         {
-            return Path.Combine(_config.ApplicationPaths.GetInternalMetadataPath(itemId), "chapters");
+            return Path.Combine(item.GetInternalMetadataPath(), "chapters");
         }
 
         /// <summary>
@@ -190,12 +184,12 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder
         {
             var filename = video.DateModified.Ticks.ToString(_usCulture) + "_" + chapterPositionTicks.ToString(_usCulture) + ".jpg";
 
-            return Path.Combine(GetChapterImagesPath(video.Id), filename);
+            return Path.Combine(GetChapterImagesPath(video), filename);
         }
 
         private List<string> GetSavedChapterImages(Video video)
         {
-            var path = GetChapterImagesPath(video.Id);
+            var path = GetChapterImagesPath(video);
 
             try
             {

+ 0 - 8
MediaBrowser.Server.Implementations/ServerApplicationPaths.cs

@@ -251,13 +251,5 @@ namespace MediaBrowser.Server.Implementations
                 _internalMetadataPath = value;
             }
         }
-
-
-        public string GetInternalMetadataPath(Guid id)
-        {
-            var idString = id.ToString("N");
-
-            return Path.Combine(InternalMetadataPath, idString.Substring(0, 2), idString);
-        }
     }
 }

+ 1 - 1
MediaBrowser.ServerApplication/ApplicationHost.cs

@@ -508,7 +508,7 @@ namespace MediaBrowser.ServerApplication
             ChapterManager = new ChapterManager(LibraryManager, LogManager.GetLogger("ChapterManager"), ServerConfigurationManager, ItemRepository);
             RegisterSingleInstance(ChapterManager);
 
-            EncodingManager = new EncodingManager(ServerConfigurationManager, FileSystemManager, Logger,
+            EncodingManager = new EncodingManager(FileSystemManager, Logger,
                 MediaEncoder, ChapterManager);
             RegisterSingleInstance(EncodingManager);
 

+ 2 - 2
Nuget/MediaBrowser.Common.Internal.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common.Internal</id>
-        <version>3.0.438</version>
+        <version>3.0.443</version>
         <title>MediaBrowser.Common.Internal</title>
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.438" />
+            <dependency id="MediaBrowser.Common" version="3.0.443" />
             <dependency id="NLog" version="3.1.0.0" />
             <dependency id="SimpleInjector" version="2.5.2" />
             <dependency id="sharpcompress" version="0.10.2" />

+ 1 - 1
Nuget/MediaBrowser.Common.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common</id>
-        <version>3.0.438</version>
+        <version>3.0.443</version>
         <title>MediaBrowser.Common</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 1 - 1
Nuget/MediaBrowser.Model.Signed.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Model.Signed</id>
-        <version>3.0.438</version>
+        <version>3.0.443</version>
         <title>MediaBrowser.Model - Signed Edition</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 2 - 2
Nuget/MediaBrowser.Server.Core.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Server.Core</id>
-        <version>3.0.438</version>
+        <version>3.0.443</version>
         <title>Media Browser.Server.Core</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Media Browser Server.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.438" />
+            <dependency id="MediaBrowser.Common" version="3.0.443" />
         </dependencies>
     </metadata>
     <files>