diff options
Diffstat (limited to 'MediaBrowser.Api')
| -rw-r--r-- | MediaBrowser.Api/Images/ImageService.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Api/MediaBrowser.Api.csproj | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/BaseStreamingService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs | 27 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/StreamState.cs | 1 | ||||
| -rw-r--r-- | MediaBrowser.Api/TvShowsService.cs | 136 |
6 files changed, 48 insertions, 126 deletions
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 2213a5af1..2aa680061 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -39,8 +39,8 @@ namespace MediaBrowser.Api.Images [Route("/Items/{Id}/Images/{Type}", "GET")] [Route("/Items/{Id}/Images/{Type}/{Index}", "GET")] - [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}", "GET")] - [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}", "HEAD")] + [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}/{PercentPlayed}", "GET")] + [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}/{PercentPlayed}", "HEAD")] [Api(Description = "Gets an item image")] public class GetItemImage : ImageRequest { @@ -583,7 +583,7 @@ namespace MediaBrowser.Api.Images Width = request.Width, OutputFormat = request.Format, AddPlayedIndicator = request.AddPlayedIndicator, - PercentPlayed = request.PercentPlayed, + PercentPlayed = request.PercentPlayed ?? 0, UnplayedCount = request.UnplayedCount, BackgroundColor = request.BackgroundColor }; diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 5cb9ebb1b..b0131b5c2 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -169,7 +169,7 @@ <PostBuildEvent> </PostBuildEvent> </PropertyGroup> - <Import Project="$(SolutionDir)\.nuget\NuGet.targets" /> + <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition=" '$(ConfigurationName)' != 'Release Mono' " /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. <Target Name="BeforeBuild"> diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 31a81de73..19f9db636 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1516,6 +1516,7 @@ namespace MediaBrowser.Api.Playback state.RunTimeTicks = item.RunTimeTicks; state.RemoteHttpHeaders = mediaSource.RequiredHttpHeaders; state.InputBitrate = mediaSource.Bitrate; + state.InputFileSize = mediaSource.Size; mediaStreams = mediaSource.MediaStreams; } else @@ -1530,6 +1531,7 @@ namespace MediaBrowser.Api.Playback state.MediaPath = mediaSource.Path; state.InputProtocol = mediaSource.Protocol; state.InputContainer = mediaSource.Container; + state.InputFileSize = mediaSource.Size; state.InputBitrate = mediaSource.Bitrate; if (item is Video) diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index 997cc7ca4..f0ad6ce5c 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.IO; +using System.Linq; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; @@ -153,7 +154,25 @@ namespace MediaBrowser.Api.Playback.Progressive using (state) { - var throttleLimit = state.InputBitrate.HasValue ? (state.InputBitrate.Value / 8) : 0; + var limits = new List<long>(); + if (state.InputBitrate.HasValue) + { + // Bytes per second + limits.Add((state.InputBitrate.Value / 8)); + } + if (state.InputFileSize.HasValue && state.RunTimeTicks.HasValue) + { + var totalSeconds = TimeSpan.FromTicks(state.RunTimeTicks.Value).TotalSeconds; + + if (totalSeconds > 1) + { + var timeBasedLimit = state.InputFileSize.Value / totalSeconds; + limits.Add(Convert.ToInt64(timeBasedLimit)); + } + } + + // Take the greater of the above to methods, just to be safe + var throttleLimit = limits.Count > 0 ? limits.Max() : 0; return ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions { @@ -166,8 +185,8 @@ namespace MediaBrowser.Api.Playback.Progressive // Pad by 20% to play it safe ThrottleLimit = Convert.ToInt64(1.2 * throttleLimit), - // Three minutes - MinThrottlePosition = throttleLimit * 180 + // 3.5 minutes + MinThrottlePosition = throttleLimit * 210 }); } } diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs index 139a78c80..d6933b755 100644 --- a/MediaBrowser.Api/Playback/StreamState.cs +++ b/MediaBrowser.Api/Playback/StreamState.cs @@ -69,6 +69,7 @@ namespace MediaBrowser.Api.Playback public long? RunTimeTicks; public long? InputBitrate { get; set; } + public long? InputFileSize { get; set; } public string OutputAudioSync = "1"; public string OutputVideoSync = "vfr"; diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs index c32e67216..20a3d3837 100644 --- a/MediaBrowser.Api/TvShowsService.cs +++ b/MediaBrowser.Api/TvShowsService.cs @@ -6,6 +6,7 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.TV; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using ServiceStack; @@ -26,7 +27,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Skips over a given number of items within the results. Use for paging. @@ -195,6 +196,7 @@ namespace MediaBrowser.Api private readonly IItemRepository _itemRepo; private readonly IDtoService _dtoService; + private readonly ITVSeriesManager _tvSeriesManager; /// <summary> /// Initializes a new instance of the <see cref="TvShowsService" /> class. @@ -202,13 +204,14 @@ namespace MediaBrowser.Api /// <param name="userManager">The user manager.</param> /// <param name="userDataManager">The user data repository.</param> /// <param name="libraryManager">The library manager.</param> - public TvShowsService(IUserManager userManager, IUserDataManager userDataManager, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService) + public TvShowsService(IUserManager userManager, IUserDataManager userDataManager, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService, ITVSeriesManager tvSeriesManager) { _userManager = userManager; _userDataManager = userDataManager; _libraryManager = libraryManager; _itemRepo = itemRepo; _dtoService = dtoService; + _tvSeriesManager = tvSeriesManager; } /// <summary> @@ -270,129 +273,26 @@ namespace MediaBrowser.Api /// <returns>System.Object.</returns> public object Get(GetNextUpEpisodes request) { - var user = _userManager.GetUserById(request.UserId); - - var itemsList = GetNextUpEpisodes(request) - .ToList(); + var result = _tvSeriesManager.GetNextUp(new NextUpQuery + { + Limit = request.Limit, + ParentId = request.ParentId, + SeriesId = request.SeriesId, + StartIndex = request.StartIndex, + UserId = request.UserId + }); - var pagedItems = ApplyPaging(itemsList, request.StartIndex, request.Limit); + var user = _userManager.GetUserById(new Guid(request.UserId)); var fields = request.GetItemFields().ToList(); - var returnItems = pagedItems.Select(i => _dtoService.GetBaseItemDto(i, fields, user)).ToArray(); + var returnItems = result.Items.Select(i => _dtoService.GetBaseItemDto(i, fields, user)).ToArray(); - var result = new ItemsResult + return ToOptimizedSerializedResultUsingCache(new ItemsResult { - TotalRecordCount = itemsList.Count, + TotalRecordCount = result.TotalRecordCount, Items = returnItems - }; - - return ToOptimizedSerializedResultUsingCache(result); - } - - public IEnumerable<Episode> GetNextUpEpisodes(GetNextUpEpisodes request) - { - var items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId) - .OfType<Series>(); - - // Avoid implicitly captured closure - return GetNextUpEpisodes(request, items); - } - - public IEnumerable<Episode> GetNextUpEpisodes(GetNextUpEpisodes request, IEnumerable<Series> series) - { - var user = _userManager.GetUserById(request.UserId); - - // Avoid implicitly captured closure - var currentUser = user; - - return FilterSeries(request, series) - .AsParallel() - .Select(i => GetNextUp(i, currentUser)) - .Where(i => i.Item1 != null) - .OrderByDescending(i => - { - var episode = i.Item1; - - var seriesUserData = _userDataManager.GetUserData(user.Id, episode.Series.GetUserDataKey()); - - if (seriesUserData.IsFavorite) - { - return 2; - } - - if (seriesUserData.Likes.HasValue) - { - return seriesUserData.Likes.Value ? 1 : -1; - } - - return 0; - }) - .ThenByDescending(i => i.Item2) - .ThenByDescending(i => i.Item1.PremiereDate ?? DateTime.MinValue) - .Select(i => i.Item1); - } - - /// <summary> - /// Gets the next up. - /// </summary> - /// <param name="series">The series.</param> - /// <param name="user">The user.</param> - /// <returns>Task{Episode}.</returns> - private Tuple<Episode, DateTime> GetNextUp(Series series, User user) - { - // Get them in display order, then reverse - var allEpisodes = series.GetSeasons(user, true, true) - .SelectMany(i => i.GetEpisodes(user, true, true)) - .Reverse() - .ToList(); - - Episode lastWatched = null; - var lastWatchedDate = DateTime.MinValue; - Episode nextUp = null; - - // Go back starting with the most recent episodes - foreach (var episode in allEpisodes) - { - var userData = _userDataManager.GetUserData(user.Id, episode.GetUserDataKey()); - - if (userData.Played) - { - if (lastWatched != null || nextUp == null) - { - break; - } - - lastWatched = episode; - lastWatchedDate = userData.LastPlayedDate ?? DateTime.MinValue; - } - else - { - if (episode.LocationType != LocationType.Virtual) - { - nextUp = episode; - } - } - } - - if (lastWatched != null) - { - return new Tuple<Episode, DateTime>(nextUp, lastWatchedDate); - } - - return new Tuple<Episode, DateTime>(null, lastWatchedDate); - } - - private IEnumerable<Series> FilterSeries(GetNextUpEpisodes request, IEnumerable<Series> items) - { - if (!string.IsNullOrWhiteSpace(request.SeriesId)) - { - var id = new Guid(request.SeriesId); - - items = items.Where(i => i.Id == id); - } - - return items; + }); } /// <summary> |
