diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs index 7983c1f6a4..08dfc87bd9 100644 --- a/MediaBrowser.Api/Playback/StreamState.cs +++ b/MediaBrowser.Api/Playback/StreamState.cs @@ -204,6 +204,11 @@ namespace MediaBrowser.Api.Playback return Convert.ToInt32(newSize.Width); } + if (VideoRequest == null) + { + return null; + } + return VideoRequest.MaxWidth ?? VideoRequest.Width; } } @@ -229,6 +234,11 @@ namespace MediaBrowser.Api.Playback return Convert.ToInt32(newSize.Height); } + if (VideoRequest == null) + { + return null; + } + return VideoRequest.MaxHeight ?? VideoRequest.Height; } } diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj index fcb66d0bd9..f06d1bc672 100644 --- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj +++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj @@ -48,6 +48,10 @@ Always + + False + ..\packages\NLog.3.0.0.0\lib\net45\NLog.dll + False ..\packages\SimpleInjector.2.5.0\lib\net45\SimpleInjector.dll @@ -63,9 +67,6 @@ - - ..\packages\NLog.2.1.0\lib\net45\NLog.dll - ..\packages\sharpcompress.0.10.2\lib\net40\SharpCompress.dll diff --git a/MediaBrowser.Common.Implementations/packages.config b/MediaBrowser.Common.Implementations/packages.config index 38d6be2efe..f00c85d717 100644 --- a/MediaBrowser.Common.Implementations/packages.config +++ b/MediaBrowser.Common.Implementations/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/ChannelItemResult.cs b/MediaBrowser.Controller/Channels/ChannelItemResult.cs index 15f0a34a0c..3ec5b7c24d 100644 --- a/MediaBrowser.Controller/Channels/ChannelItemResult.cs +++ b/MediaBrowser.Controller/Channels/ChannelItemResult.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; namespace MediaBrowser.Controller.Channels { @@ -7,8 +6,6 @@ namespace MediaBrowser.Controller.Channels { public List Items { get; set; } - public TimeSpan CacheLength { get; set; } - public int? TotalRecordCount { get; set; } } } \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/ChannelParentalRating.cs b/MediaBrowser.Controller/Channels/ChannelParentalRating.cs new file mode 100644 index 0000000000..d9cc521b38 --- /dev/null +++ b/MediaBrowser.Controller/Channels/ChannelParentalRating.cs @@ -0,0 +1,15 @@ +namespace MediaBrowser.Controller.Channels +{ + public enum ChannelParentalRating + { + GeneralAudience = 0, + + UsPG = 1, + + UsPG13 = 2, + + UsR = 3, + + Adult = 4 + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/ChannelSearchInfo.cs b/MediaBrowser.Controller/Channels/ChannelSearchInfo.cs index bf7461327c..a291d6e27f 100644 --- a/MediaBrowser.Controller/Channels/ChannelSearchInfo.cs +++ b/MediaBrowser.Controller/Channels/ChannelSearchInfo.cs @@ -3,5 +3,7 @@ public class ChannelSearchInfo { public string SearchTerm { get; set; } + + public string UserId { get; set; } } } \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/IChannel.cs b/MediaBrowser.Controller/Channels/IChannel.cs index 1d7c298fab..cce341e438 100644 --- a/MediaBrowser.Controller/Channels/IChannel.cs +++ b/MediaBrowser.Controller/Channels/IChannel.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System.Collections.Generic; using System.Threading; @@ -27,6 +26,12 @@ namespace MediaBrowser.Controller.Channels /// The home page URL. string HomePageUrl { get; } + /// + /// Gets the parental rating. + /// + /// The parental rating. + ChannelParentalRating ParentalRating { get; } + /// /// Gets the channel information. /// @@ -36,26 +41,9 @@ namespace MediaBrowser.Controller.Channels /// /// Determines whether [is enabled for] [the specified user]. /// - /// The user. + /// The user identifier. /// true if [is enabled for] [the specified user]; otherwise, false. - bool IsEnabledFor(User user); - - /// - /// Searches the specified search term. - /// - /// The search information. - /// The user. - /// The cancellation token. - /// Task{IEnumerable{ChannelItemInfo}}. - Task> Search(ChannelSearchInfo searchInfo, User user, CancellationToken cancellationToken); - - /// - /// Gets all media. - /// - /// The query. - /// The cancellation token. - /// Task{ChannelItemResult}. - Task GetAllMedia(InternalAllChannelMediaQuery query, CancellationToken cancellationToken); + bool IsEnabledFor(string userId); /// /// Gets the channel items. @@ -79,15 +67,4 @@ namespace MediaBrowser.Controller.Channels /// IEnumerable{ImageType}. IEnumerable GetSupportedChannelImages(); } - - public interface IRequiresMediaInfoCallback - { - /// - /// Gets the channel item media information. - /// - /// The identifier. - /// The cancellation token. - /// Task{IEnumerable{ChannelMediaInfo}}. - Task> GetChannelItemMediaInfo(string id, CancellationToken cancellationToken); - } } diff --git a/MediaBrowser.Controller/Channels/IHasCacheKey.cs b/MediaBrowser.Controller/Channels/IHasCacheKey.cs new file mode 100644 index 0000000000..6376d2f914 --- /dev/null +++ b/MediaBrowser.Controller/Channels/IHasCacheKey.cs @@ -0,0 +1,13 @@ + +namespace MediaBrowser.Controller.Channels +{ + public interface IHasCacheKey + { + /// + /// Gets the cache key. + /// + /// The user identifier. + /// System.String. + string GetCacheKey(string userId); + } +} diff --git a/MediaBrowser.Controller/Channels/IIndexableChannel.cs b/MediaBrowser.Controller/Channels/IIndexableChannel.cs new file mode 100644 index 0000000000..0b52585e8f --- /dev/null +++ b/MediaBrowser.Controller/Channels/IIndexableChannel.cs @@ -0,0 +1,16 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Channels +{ + public interface IIndexableChannel + { + /// + /// Gets all media. + /// + /// The query. + /// The cancellation token. + /// Task{ChannelItemResult}. + Task GetAllMedia(InternalAllChannelMediaQuery query, CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/IRequiresMediaInfoCallback.cs b/MediaBrowser.Controller/Channels/IRequiresMediaInfoCallback.cs new file mode 100644 index 0000000000..b4b6be9baf --- /dev/null +++ b/MediaBrowser.Controller/Channels/IRequiresMediaInfoCallback.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Channels +{ + public interface IRequiresMediaInfoCallback + { + /// + /// Gets the channel item media information. + /// + /// The identifier. + /// The cancellation token. + /// Task{IEnumerable{ChannelMediaInfo}}. + Task> GetChannelItemMediaInfo(string id, CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/ISearchableChannel.cs b/MediaBrowser.Controller/Channels/ISearchableChannel.cs new file mode 100644 index 0000000000..c5fb3a4f19 --- /dev/null +++ b/MediaBrowser.Controller/Channels/ISearchableChannel.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Channels +{ + public interface ISearchableChannel + { + /// + /// Searches the specified search term. + /// + /// The search information. + /// The cancellation token. + /// Task{IEnumerable{ChannelItemInfo}}. + Task> Search(ChannelSearchInfo searchInfo, CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/InternalAllChannelMediaQuery.cs b/MediaBrowser.Controller/Channels/InternalAllChannelMediaQuery.cs new file mode 100644 index 0000000000..de99c16c48 --- /dev/null +++ b/MediaBrowser.Controller/Channels/InternalAllChannelMediaQuery.cs @@ -0,0 +1,8 @@ + +namespace MediaBrowser.Controller.Channels +{ + public class InternalAllChannelMediaQuery + { + public string UserId { get; set; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/InternalChannelFeatures.cs b/MediaBrowser.Controller/Channels/InternalChannelFeatures.cs index 44da646d04..814c565779 100644 --- a/MediaBrowser.Controller/Channels/InternalChannelFeatures.cs +++ b/MediaBrowser.Controller/Channels/InternalChannelFeatures.cs @@ -5,18 +5,6 @@ namespace MediaBrowser.Controller.Channels { public class InternalChannelFeatures { - /// - /// Gets or sets a value indicating whether this instance can search. - /// - /// true if this instance can search; otherwise, false. - public bool CanSearch { get; set; } - - /// - /// Gets or sets a value indicating whether this instance can get all media. - /// - /// true if this instance can get all media; otherwise, false. - public bool CanGetAllMedia { get; set; } - /// /// Gets or sets the media types. /// diff --git a/MediaBrowser.Controller/Channels/InternalChannelItemQuery.cs b/MediaBrowser.Controller/Channels/InternalChannelItemQuery.cs index dceced14c4..82ef6b9462 100644 --- a/MediaBrowser.Controller/Channels/InternalChannelItemQuery.cs +++ b/MediaBrowser.Controller/Channels/InternalChannelItemQuery.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Channels; +using MediaBrowser.Model.Channels; namespace MediaBrowser.Controller.Channels { @@ -7,7 +6,7 @@ namespace MediaBrowser.Controller.Channels { public string FolderId { get; set; } - public User User { get; set; } + public string UserId { get; set; } public int? StartIndex { get; set; } @@ -17,9 +16,4 @@ namespace MediaBrowser.Controller.Channels public bool SortDescending { get; set; } } - - public class InternalAllChannelMediaQuery - { - public User User { get; set; } - } } \ No newline at end of file diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 38db9e8816..5d8d62eb9c 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -73,6 +73,7 @@ + @@ -82,8 +83,13 @@ + + + + + diff --git a/MediaBrowser.Model/Channels/ChannelFeatures.cs b/MediaBrowser.Model/Channels/ChannelFeatures.cs index 2acbdf9c30..3333626883 100644 --- a/MediaBrowser.Model/Channels/ChannelFeatures.cs +++ b/MediaBrowser.Model/Channels/ChannelFeatures.cs @@ -22,12 +22,6 @@ namespace MediaBrowser.Model.Channels /// true if this instance can search; otherwise, false. public bool CanSearch { get; set; } - /// - /// Gets or sets a value indicating whether this instance can get all media. - /// - /// true if this instance can get all media; otherwise, false. - public bool CanGetAllMedia { get; set; } - /// /// Gets or sets the media types. /// diff --git a/MediaBrowser.Model/Querying/ItemFilter.cs b/MediaBrowser.Model/Querying/ItemFilter.cs index d30978ebfc..83d61ae514 100644 --- a/MediaBrowser.Model/Querying/ItemFilter.cs +++ b/MediaBrowser.Model/Querying/ItemFilter.cs @@ -45,6 +45,6 @@ namespace MediaBrowser.Model.Querying /// /// The is favorite or likes /// - IsFavoriteOrLikes = 10, + IsFavoriteOrLikes = 10 } } diff --git a/MediaBrowser.Model/Tasks/SystemEvent.cs b/MediaBrowser.Model/Tasks/SystemEvent.cs index dbb1159622..4d49a38ccb 100644 --- a/MediaBrowser.Model/Tasks/SystemEvent.cs +++ b/MediaBrowser.Model/Tasks/SystemEvent.cs @@ -9,6 +9,6 @@ namespace MediaBrowser.Model.Tasks /// /// The wake from sleep /// - WakeFromSleep + WakeFromSleep = 0 } } diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index 9f4db175e5..964a4bbf6c 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -97,7 +97,7 @@ namespace MediaBrowser.Server.Implementations.Channels if (user != null) { - channels = channels.Where(i => GetChannelProvider(i).IsEnabledFor(user) && i.IsVisible(user)) + channels = channels.Where(i => GetChannelProvider(i).IsEnabledFor(user.Id.ToString("N")) && i.IsVisible(user)) .ToList(); } @@ -371,7 +371,8 @@ namespace MediaBrowser.Server.Implementations.Channels Id = id, DateCreated = _fileSystem.GetCreationTimeUtc(fileInfo), DateModified = _fileSystem.GetLastWriteTimeUtc(fileInfo), - Path = path + Path = path, + OfficialRating = GetOfficialRating(channelInfo.ParentalRating) }; isNew = true; @@ -394,6 +395,23 @@ namespace MediaBrowser.Server.Implementations.Channels return item; } + private string GetOfficialRating(ChannelParentalRating rating) + { + switch (rating) + { + case ChannelParentalRating.Adult: + return "XXX"; + case ChannelParentalRating.UsR: + return "R"; + case ChannelParentalRating.UsPG13: + return "PG-13"; + case ChannelParentalRating.UsPG: + return "PG"; + default: + return null; + } + } + public Channel GetChannel(string id) { return (Channel)_libraryManager.GetItemById(new Guid(id)); @@ -412,16 +430,19 @@ namespace MediaBrowser.Server.Implementations.Channels var channelProvider = GetChannelProvider(channel); - return GetChannelFeaturesDto(channel, channelProvider.GetChannelFeatures()); + return GetChannelFeaturesDto(channel, channelProvider, channelProvider.GetChannelFeatures()); } - public ChannelFeatures GetChannelFeaturesDto(Channel channel, InternalChannelFeatures features) + public ChannelFeatures GetChannelFeaturesDto(Channel channel, + IChannel provider, + InternalChannelFeatures features) { + var isIndexable = provider is IIndexableChannel; + return new ChannelFeatures { CanFilter = !features.MaxPageSize.HasValue, - CanGetAllMedia = features.CanGetAllMedia, - CanSearch = features.CanSearch, + CanSearch = provider is ISearchableChannel, ContentTypes = features.ContentTypes, DefaultSortFields = features.DefaultSortFields, MaxPageSize = features.MaxPageSize, @@ -429,7 +450,7 @@ namespace MediaBrowser.Server.Implementations.Channels SupportsSortOrderToggle = features.SupportsSortOrderToggle, Name = channel.Name, Id = channel.Id.ToString("N"), - CanDownloadAllMedia = features.CanGetAllMedia + CanDownloadAllMedia = isIndexable }; } @@ -459,24 +480,28 @@ namespace MediaBrowser.Server.Implementations.Channels } var tasks = channels - .Where(i => i.GetChannelFeatures().CanGetAllMedia) .Select(async i => { - try + var indexable = i as IIndexableChannel; + + if (indexable != null) { - var result = await i.GetAllMedia(new InternalAllChannelMediaQuery + try { - User = user + var result = await indexable.GetAllMedia(new InternalAllChannelMediaQuery + { + UserId = query.UserId - }, cancellationToken).ConfigureAwait(false); + }, cancellationToken).ConfigureAwait(false); - return new Tuple(i, result); - } - catch (Exception ex) - { - _logger.ErrorException("Error getting all media from {0}", ex, i.Name); - return new Tuple(i, new ChannelItemResult { }); + return new Tuple(i, result); + } + catch (Exception ex) + { + _logger.ErrorException("Error getting all media from {0}", ex, i.Name); + } } + return new Tuple(i, new ChannelItemResult { }); }); var results = await Task.WhenAll(tasks).ConfigureAwait(false); @@ -600,7 +625,10 @@ namespace MediaBrowser.Server.Implementations.Channels bool sortDescending, CancellationToken cancellationToken) { - var cachePath = GetChannelDataCachePath(channel, user, folderId, sortField, sortDescending); + var userId = user.Id.ToString("N"); + + var cacheLength = TimeSpan.FromDays(1); + var cachePath = GetChannelDataCachePath(channel, userId, folderId, sortField, sortDescending); try { @@ -608,7 +636,7 @@ namespace MediaBrowser.Server.Implementations.Channels { var channelItemResult = _jsonSerializer.DeserializeFromFile(cachePath); - if (_fileSystem.GetLastWriteTimeUtc(cachePath).Add(channelItemResult.CacheLength) > DateTime.UtcNow) + if (_fileSystem.GetLastWriteTimeUtc(cachePath).Add(cacheLength) > DateTime.UtcNow) { return channelItemResult; } @@ -633,7 +661,7 @@ namespace MediaBrowser.Server.Implementations.Channels { var channelItemResult = _jsonSerializer.DeserializeFromFile(cachePath); - if (_fileSystem.GetLastWriteTimeUtc(cachePath).Add(channelItemResult.CacheLength) > DateTime.UtcNow) + if (_fileSystem.GetLastWriteTimeUtc(cachePath).Add(cacheLength) > DateTime.UtcNow) { return channelItemResult; } @@ -650,7 +678,7 @@ namespace MediaBrowser.Server.Implementations.Channels var query = new InternalChannelItemQuery { - User = user, + UserId = userId, StartIndex = startIndex, Limit = limit, SortBy = sortField, @@ -694,18 +722,27 @@ namespace MediaBrowser.Server.Implementations.Channels } private string GetChannelDataCachePath(IChannel channel, - User user, + string userId, string folderId, ChannelItemSortField? sortField, bool sortDescending) { var channelId = GetInternalChannelId(channel.Name).ToString("N"); - var folderKey = string.IsNullOrWhiteSpace(folderId) ? "root" : folderId.GetMD5().ToString("N"); + var userCacheKey = string.Empty; + + var hasCacheKey = channel as IHasCacheKey; + if (hasCacheKey != null) + { + userCacheKey = hasCacheKey.GetCacheKey(userId) ?? string.Empty; + } + + var folderKey = string.IsNullOrWhiteSpace(folderId) ? "root" : folderId; + folderKey = (folderKey + userCacheKey).GetMD5().ToString("N"); var version = string.IsNullOrWhiteSpace(channel.DataVersion) ? "0" : channel.DataVersion; - var filename = user.Id.ToString("N"); + var filename = userId; var hashfilename = false; if (sortField.HasValue) @@ -724,7 +761,12 @@ namespace MediaBrowser.Server.Implementations.Channels filename = filename.GetMD5().ToString("N"); } - return Path.Combine(_config.ApplicationPaths.CachePath, "channels", channelId, version, folderKey, filename + ".json"); + return Path.Combine(_config.ApplicationPaths.CachePath, + "channels", + channelId, + version, + folderKey, + filename + ".json"); } private async Task> GetReturnItems(IEnumerable items, int? totalCountFromProvider, User user, ChannelItemQuery query, CancellationToken cancellationToken) @@ -770,7 +812,8 @@ namespace MediaBrowser.Server.Implementations.Channels { // 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) + "14"; + return externalId + (channelProvider.DataVersion ?? string.Empty) + + (channelProvider.Name ?? string.Empty) + "15"; } private async Task GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Channel internalChannel, CancellationToken cancellationToken) diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index 7fdea66f65..2ab245c668 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -63,8 +63,9 @@ ..\packages\MediaBrowser.IsoMounting.3.0.65\lib\net45\MediaBrowser.IsoMounter.dll - - ..\packages\NLog.2.1.0\lib\net45\NLog.dll + + False + ..\packages\NLog.3.0.0.0\lib\net45\NLog.dll ..\packages\MediaBrowser.IsoMounting.3.0.65\lib\net45\pfmclrapi.dll diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config index f62249aa3b..8a9f17d967 100644 --- a/MediaBrowser.ServerApplication/packages.config +++ b/MediaBrowser.ServerApplication/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 9306462050..7b4935614f 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.394 + 3.0.397 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 95acf20cf1..57a8aae304 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.394 + 3.0.397 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 9dcdac5155..4720b6b362 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.394 + 3.0.397 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - +