From 508edad222d46a7cee80c2eda68494e4f701cfec Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 13 Apr 2017 14:59:46 -0400 Subject: 3.2.12.5 --- Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs | 1 + 1 file changed, 1 insertion(+) (limited to 'Emby.Server.Implementations/LiveTv') diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs index 4ec70f8026..8cf1106f0f 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs @@ -145,6 +145,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts }, RequiresOpening = true, RequiresClosing = true, + RequiresLooping = true, ReadAtNativeFramerate = false, -- cgit v1.2.3 From eedf62d80dce437a7923af7d0ef896a6187b3a8a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 15 Apr 2017 15:46:07 -0400 Subject: update keep up to deletion --- .../Library/Resolvers/Movies/MovieResolver.cs | 2 +- .../LiveTv/EmbyTV/EmbyTV.cs | 49 ++++++++++++++++++++-- .../LiveTv/LiveStreamHelper.cs | 2 +- .../LiveTv/LiveTvMediaSourceProvider.cs | 2 +- MediaBrowser.Controller/Entities/MusicVideo.cs | 2 +- 5 files changed, 50 insertions(+), 7 deletions(-) (limited to 'Emby.Server.Implementations/LiveTv') diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index b791311f9f..3550a83b9b 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -219,7 +219,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie(args.Path, args.Parent, files, args.DirectoryService, collectionType, false); + return FindMovie(args.Path, args.Parent, files, args.DirectoryService, collectionType, true); } if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase)) diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs index 0ea1b38b14..666c1fdcd4 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs @@ -39,6 +39,7 @@ using MediaBrowser.Model.FileOrganization; using MediaBrowser.Model.System; using MediaBrowser.Model.Threading; using MediaBrowser.Model.Extensions; +using MediaBrowser.Model.Querying; namespace Emby.Server.Implementations.LiveTv.EmbyTV { @@ -1512,7 +1513,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV _timerProvider.AddOrUpdate(timer, false); SaveRecordingMetadata(timer, recordPath, seriesPath); - EnforceKeepUpTo(timer); + EnforceKeepUpTo(timer, seriesPath); }; await recorder.Record(mediaStreamInfo, recordPath, duration, onStarted, cancellationToken) @@ -1583,12 +1584,16 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV }, _logger); } - private async void EnforceKeepUpTo(TimerInfo timer) + private async void EnforceKeepUpTo(TimerInfo timer, string seriesPath) { if (string.IsNullOrWhiteSpace(timer.SeriesTimerId)) { return; } + if (string.IsNullOrWhiteSpace(seriesPath)) + { + return; + } var seriesTimerId = timer.SeriesTimerId; var seriesTimer = _seriesTimerProvider.GetAll().FirstOrDefault(i => string.Equals(i.Id, seriesTimerId, StringComparison.OrdinalIgnoreCase)); @@ -1621,6 +1626,43 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV .ToList(); await DeleteLibraryItemsForTimers(timersToDelete).ConfigureAwait(false); + + var librarySeries = _libraryManager.FindByPath(seriesPath, true) as Folder; + + if (librarySeries == null) + { + return; + } + + var episodesToDelete = (await librarySeries.GetItems(new InternalItemsQuery + { + SortBy = new[] { ItemSortBy.DateCreated }, + SortOrder = SortOrder.Descending, + IsVirtualItem = false, + IsFolder = false, + Recursive = true + + }).ConfigureAwait(false)) + .Items + .Where(i => i.LocationType == LocationType.FileSystem && _fileSystem.FileExists(i.Path)) + .Skip(seriesTimer.KeepUpTo - 1) + .ToList(); + + foreach (var item in episodesToDelete) + { + try + { + await _libraryManager.DeleteItem(item, new DeleteOptions + { + DeleteFileLocation = true + + }).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error deleting item", ex); + } + } } finally { @@ -1658,7 +1700,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV await _libraryManager.DeleteItem(libraryItem, new DeleteOptions { DeleteFileLocation = true - }); + + }).ConfigureAwait(false); } else { diff --git a/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs b/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs index 3906df0005..053af4fc6f 100644 --- a/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs +++ b/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs @@ -84,7 +84,7 @@ namespace Emby.Server.Implementations.LiveTv if (width >= 1900) { - videoStream.BitRate = 8000000; + videoStream.BitRate = 15000000; } else if (width >= 1260) diff --git a/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs b/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs index a9c449f837..93996f5da5 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs @@ -185,7 +185,7 @@ namespace Emby.Server.Implementations.LiveTv if (width >= 1900) { - videoStream.BitRate = 8000000; + videoStream.BitRate = 15000000; } else if (width >= 1260) diff --git a/MediaBrowser.Controller/Entities/MusicVideo.cs b/MediaBrowser.Controller/Entities/MusicVideo.cs index c781ef85be..7344cb8e47 100644 --- a/MediaBrowser.Controller/Entities/MusicVideo.cs +++ b/MediaBrowser.Controller/Entities/MusicVideo.cs @@ -29,7 +29,7 @@ namespace MediaBrowser.Controller.Entities { get { - return true; + return false; } } -- cgit v1.2.3 From eddcc466022c063265dc6fa8e729bbdf6c18a467 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 16 Apr 2017 21:45:44 -0400 Subject: improve performance of getting channel list --- Emby.Server.Implementations/Dto/DtoService.cs | 5 +- .../LiveTv/LiveTvManager.cs | 33 ++++++++++++-- MediaBrowser.Api/SuggestionsService.cs | 53 ++++++++++++++++------ MediaBrowser.Api/TvShowsService.cs | 14 +++++- MediaBrowser.Controller/LiveTv/ILiveTvManager.cs | 2 +- SharedVersion.cs | 2 +- 6 files changed, 84 insertions(+), 25 deletions(-) (limited to 'Emby.Server.Implementations/LiveTv') diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index e65e98f21c..7c0baf9c25 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -146,7 +146,7 @@ namespace Emby.Server.Implementations.Dto if (channelTuples.Count > 0) { - _livetvManager().AddChannelInfo(channelTuples, options, user); + await _livetvManager().AddChannelInfo(channelTuples, options, user).ConfigureAwait(false); } return list; @@ -161,7 +161,8 @@ namespace Emby.Server.Implementations.Dto if (tvChannel != null) { var list = new List> { new Tuple(dto, tvChannel) }; - _livetvManager().AddChannelInfo(list, options, user); + var task = _livetvManager().AddChannelInfo(list, options, user); + Task.WaitAll(task); } else if (item is LiveTvProgram) { diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs index 4ffea3571f..eee4a27250 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs @@ -2284,7 +2284,7 @@ namespace Emby.Server.Implementations.LiveTv }; } - public void AddChannelInfo(List> tuples, DtoOptions options, User user) + public async Task AddChannelInfo(List> tuples, DtoOptions options, User user) { var now = DateTime.UtcNow; @@ -2304,6 +2304,12 @@ namespace Emby.Server.Implementations.LiveTv RemoveFields(options); + var currentProgramsList = new List(); + var currentChannelsDict = new Dictionary(); + + var addCurrentProgram = options.AddCurrentProgram; + var addMediaSources = options.Fields.Contains(ItemFields.MediaSources); + foreach (var tuple in tuples) { var dto = tuple.Item1; @@ -2314,19 +2320,38 @@ namespace Emby.Server.Implementations.LiveTv dto.ChannelType = channel.ChannelType; dto.ServiceName = channel.ServiceName; - if (options.Fields.Contains(ItemFields.MediaSources)) + currentChannelsDict[dto.Id] = dto; + + if (addMediaSources) { dto.MediaSources = channel.GetMediaSources(true).ToList(); } - if (options.AddCurrentProgram) + if (addCurrentProgram) { var channelIdString = channel.Id.ToString("N"); var currentProgram = programs.FirstOrDefault(i => string.Equals(i.ChannelId, channelIdString)); if (currentProgram != null) { - dto.CurrentProgram = _dtoService.GetBaseItemDto(currentProgram, options, user); + currentProgramsList.Add(currentProgram); + } + } + } + + if (addCurrentProgram) + { + var currentProgramDtos = await _dtoService.GetBaseItemDtos(currentProgramsList, options, user).ConfigureAwait(false); + + foreach (var programDto in currentProgramDtos) + { + if (!string.IsNullOrWhiteSpace(programDto.ChannelId)) + { + BaseItemDto channelDto; + if (currentChannelsDict.TryGetValue(programDto.ChannelId, out channelDto)) + { + channelDto.CurrentProgram = programDto; + } } } } diff --git a/MediaBrowser.Api/SuggestionsService.cs b/MediaBrowser.Api/SuggestionsService.cs index 7196c0f392..3e901e303d 100644 --- a/MediaBrowser.Api/SuggestionsService.cs +++ b/MediaBrowser.Api/SuggestionsService.cs @@ -12,6 +12,7 @@ using MediaBrowser.Controller.Library; namespace MediaBrowser.Api { [Route("/Users/{UserId}/Suggestions", "GET", Summary = "Gets items based on a query.")] + [Route("/Users/{UserId}/Suggestions", "POST", Summary = "Gets items based on a query.")] public class GetSuggestedItems : IReturn> { public string MediaType { get; set; } @@ -20,6 +21,7 @@ namespace MediaBrowser.Api public bool EnableTotalRecordCount { get; set; } public int? StartIndex { get; set; } public int? Limit { get; set; } + public string Name { get; set; } public string[] GetMediaTypes() { @@ -54,6 +56,13 @@ namespace MediaBrowser.Api return ToOptimizedResult(result); } + public async Task Post(GetSuggestedItems request) + { + var result = await GetResultItems(request).ConfigureAwait(false); + + return ToOptimizedResult(result); + } + private async Task> GetResultItems(GetSuggestedItems request) { var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; @@ -77,7 +86,30 @@ namespace MediaBrowser.Api private QueryResult GetItems(GetSuggestedItems request, User user, DtoOptions dtoOptions) { - var query = new InternalItemsQuery(user) + BaseItem similarToItem = null; + + if (!string.IsNullOrWhiteSpace(request.Name)) + { + // get item by name, then get similar items from that + similarToItem = _libraryManager.GetItemList(new InternalItemsQuery(user) + { + SortBy = new string[] {ItemSortBy.Random}, + MediaTypes = request.GetMediaTypes(), + IncludeItemTypes = request.GetIncludeItemTypes(), + IsVirtualItem = false, + Name = request.Name, + Recursive = true, + Limit = 1 + + }).FirstOrDefault(); + + if (similarToItem == null) + { + return new QueryResult(); + } + } + + return _libraryManager.GetItemsResult(new InternalItemsQuery(user) { SortBy = new string[] { ItemSortBy.Random }, MediaTypes = request.GetMediaTypes(), @@ -85,20 +117,11 @@ namespace MediaBrowser.Api IsVirtualItem = false, StartIndex = request.StartIndex, Limit = request.Limit, - DtoOptions = dtoOptions - }; - - if (request.EnableTotalRecordCount) - { - return _libraryManager.GetItemsResult(query); - } - - var items = _libraryManager.GetItemList(query).ToArray(); - - return new QueryResult - { - Items = items - }; + DtoOptions = dtoOptions, + EnableTotalRecordCount = request.EnableTotalRecordCount, + Recursive = true, + SimilarTo = similarToItem + }); } } } diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs index d7f017e1dd..13adceed54 100644 --- a/MediaBrowser.Api/TvShowsService.cs +++ b/MediaBrowser.Api/TvShowsService.cs @@ -137,7 +137,7 @@ namespace MediaBrowser.Api } [Route("/Shows/{Id}/Episodes", "GET", Summary = "Gets episodes for a tv season")] - [Route("/Shows/Episodes", "GET", Summary = "Gets episodes for a tv season")] + [Route("/Shows/Episodes", "POST", Summary = "Gets episodes for a tv season")] public class GetEpisodes : IReturn, IHasItemFields, IHasDtoOptions { /// @@ -205,7 +205,7 @@ namespace MediaBrowser.Api } [Route("/Shows/{Id}/Seasons", "GET", Summary = "Gets seasons for a tv series")] - [Route("/Shows/Seasons", "GET", Summary = "Gets seasons for a tv series")] + [Route("/Shows/Seasons", "POST", Summary = "Gets seasons for a tv series")] public class GetSeasons : IReturn, IHasItemFields, IHasDtoOptions { /// @@ -459,6 +459,16 @@ namespace MediaBrowser.Api }; } + public Task Post(GetSeasons request) + { + return Get(request); + } + + public Task Post(GetEpisodes request) + { + return Get(request); + } + private Series GetSeries(string seriesId, string seriesName, User user) { if (!string.IsNullOrWhiteSpace(seriesId)) diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index c8fa6be8ce..7e1dab4624 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -367,7 +367,7 @@ namespace MediaBrowser.Controller.LiveTv /// The items. /// The options. /// The user. - void AddChannelInfo(List> items, DtoOptions options, User user); + Task AddChannelInfo(List> items, DtoOptions options, User user); /// /// Called when [recording file deleted]. diff --git a/SharedVersion.cs b/SharedVersion.cs index 6e2c364202..105fb90776 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,3 +1,3 @@ using System.Reflection; -[assembly: AssemblyVersion("3.2.12.6")] +[assembly: AssemblyVersion("3.2.12.7")] -- cgit v1.2.3 From 561028c90734b911ebb5eec26aa071fb6851a2a6 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 17 Apr 2017 15:01:16 -0400 Subject: update automated checkins --- .../Library/MediaSourceManager.cs | 98 +--------------------- .../LiveTv/LiveTvMediaSourceProvider.cs | 2 +- .../Session/SessionManager.cs | 38 ++++----- MediaBrowser.Api/ApiEntryPoint.cs | 12 --- MediaBrowser.Api/Playback/BaseStreamingService.cs | 2 +- MediaBrowser.Api/Playback/MediaInfoService.cs | 2 +- MediaBrowser.Api/SuggestionsService.cs | 35 +------- MediaBrowser.Api/TvShowsService.cs | 34 +------- .../Library/IMediaSourceManager.cs | 11 +-- MediaBrowser.Controller/Session/ISessionManager.cs | 2 + MediaBrowser.Controller/Session/SessionInfo.cs | 2 +- MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs | 2 +- 12 files changed, 28 insertions(+), 212 deletions(-) (limited to 'Emby.Server.Implementations/LiveTv') diff --git a/Emby.Server.Implementations/Library/MediaSourceManager.cs b/Emby.Server.Implementations/Library/MediaSourceManager.cs index ccd4c3631e..4857008f35 100644 --- a/Emby.Server.Implementations/Library/MediaSourceManager.cs +++ b/Emby.Server.Implementations/Library/MediaSourceManager.cs @@ -9,13 +9,10 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Serialization; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Threading; @@ -365,12 +362,10 @@ namespace Emby.Server.Implementations.Library private readonly Dictionary _openStreams = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly SemaphoreSlim _liveStreamSemaphore = new SemaphoreSlim(1, 1); - public async Task OpenLiveStream(LiveStreamRequest request, bool enableAutoClose, CancellationToken cancellationToken) + public async Task OpenLiveStream(LiveStreamRequest request, CancellationToken cancellationToken) { await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); - enableAutoClose = false; - try { var tuple = GetProvider(request.OpenToken); @@ -389,8 +384,6 @@ namespace Emby.Server.Implementations.Library var info = new LiveStreamInfo { - Date = DateTime.UtcNow, - EnableCloseTimer = enableAutoClose, Id = mediaSource.LiveStreamId, MediaSource = mediaSource, DirectStreamProvider = mediaSourceTuple.Item2 @@ -398,11 +391,6 @@ namespace Emby.Server.Implementations.Library _openStreams[mediaSource.LiveStreamId] = info; - if (enableAutoClose) - { - StartCloseTimer(); - } - var json = _jsonSerializer.SerializeToString(mediaSource); _logger.Debug("Live stream opened: " + json); var clone = _jsonSerializer.DeserializeFromString(json); @@ -462,28 +450,6 @@ namespace Emby.Server.Implementations.Library return result.Item1; } - public async Task PingLiveStream(string id, CancellationToken cancellationToken) - { - await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); - - try - { - LiveStreamInfo info; - if (_openStreams.TryGetValue(id, out info)) - { - info.Date = DateTime.UtcNow; - } - else - { - _logger.Error("Failed to ping live stream {0}", id); - } - } - finally - { - _liveStreamSemaphore.Release(); - } - } - private async Task CloseLiveStreamWithProvider(IMediaSourceProvider provider, string streamId) { _logger.Info("Closing live stream {0} with provider {1}", streamId, provider.GetType().Name); @@ -525,11 +491,6 @@ namespace Emby.Server.Implementations.Library await CloseLiveStreamWithProvider(tuple.Item1, tuple.Item2).ConfigureAwait(false); } - - if (_openStreams.Count == 0) - { - StopCloseTimer(); - } } } finally @@ -558,66 +519,11 @@ namespace Emby.Server.Implementations.Library return new Tuple(provider, keyId); } - private ITimer _closeTimer; - private readonly TimeSpan _openStreamMaxAge = TimeSpan.FromSeconds(180); - - private void StartCloseTimer() - { - StopCloseTimer(); - - _closeTimer = _timerFactory.Create(CloseTimerCallback, null, _openStreamMaxAge, _openStreamMaxAge); - } - - private void StopCloseTimer() - { - var timer = _closeTimer; - - if (timer != null) - { - _closeTimer = null; - timer.Dispose(); - } - } - - private async void CloseTimerCallback(object state) - { - List infos; - await _liveStreamSemaphore.WaitAsync().ConfigureAwait(false); - - try - { - infos = _openStreams - .Values - .Where(i => i.EnableCloseTimer && DateTime.UtcNow - i.Date > _openStreamMaxAge) - .ToList(); - } - finally - { - _liveStreamSemaphore.Release(); - } - - foreach (var info in infos) - { - if (!info.Closed) - { - try - { - await CloseLiveStream(info.Id).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.ErrorException("Error closing media source", ex); - } - } - } - } - /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// public void Dispose() { - StopCloseTimer(); Dispose(true); } @@ -644,8 +550,6 @@ namespace Emby.Server.Implementations.Library private class LiveStreamInfo { - public DateTime Date; - public bool EnableCloseTimer; public string Id; public bool Closed; public MediaSourceInfo MediaSource; diff --git a/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs b/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs index 93996f5da5..329f5b8a4b 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs @@ -190,7 +190,7 @@ namespace Emby.Server.Implementations.LiveTv else if (width >= 1260) { - videoStream.BitRate = 3000000; + videoStream.BitRate = 4000000; } else if (width >= 700) diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs index ed0a47121e..63556c1ce1 100644 --- a/Emby.Server.Implementations/Session/SessionManager.cs +++ b/Emby.Server.Implementations/Session/SessionManager.cs @@ -310,10 +310,7 @@ namespace Emby.Server.Implementations.Session /// /// Updates the now playing item id. /// - /// The session. - /// The information. - /// The library item. - private async Task UpdateNowPlayingItem(SessionInfo session, PlaybackProgressInfo info, BaseItem libraryItem) + private async Task UpdateNowPlayingItem(SessionInfo session, PlaybackProgressInfo info, BaseItem libraryItem, bool updateLastCheckInTime) { if (string.IsNullOrWhiteSpace(info.MediaSourceId)) { @@ -352,7 +349,11 @@ namespace Emby.Server.Implementations.Session session.NowPlayingItem = info.Item; session.LastActivityDate = DateTime.UtcNow; - session.LastPlaybackCheckIn = DateTime.UtcNow; + + if (updateLastCheckInTime) + { + session.LastPlaybackCheckIn = DateTime.UtcNow; + } session.PlayState.IsPaused = info.IsPaused; session.PlayState.PositionTicks = info.PositionTicks; @@ -604,7 +605,7 @@ namespace Emby.Server.Implementations.Session ? null : GetNowPlayingItem(session, info.ItemId); - await UpdateNowPlayingItem(session, info, libraryItem).ConfigureAwait(false); + await UpdateNowPlayingItem(session, info, libraryItem, true).ConfigureAwait(false); if (!string.IsNullOrEmpty(session.DeviceId) && info.PlayMethod != PlayMethod.Transcode) { @@ -671,14 +672,15 @@ namespace Emby.Server.Implementations.Session await _userDataManager.SaveUserData(userId, item, data, UserDataSaveReason.PlaybackStart, CancellationToken.None).ConfigureAwait(false); } + public Task OnPlaybackProgress(PlaybackProgressInfo info) + { + return OnPlaybackProgress(info, false); + } + /// /// Used to report playback progress for an item /// - /// The info. - /// Task. - /// - /// positionTicks - public async Task OnPlaybackProgress(PlaybackProgressInfo info) + public async Task OnPlaybackProgress(PlaybackProgressInfo info, bool isAutomated) { if (info == null) { @@ -691,7 +693,7 @@ namespace Emby.Server.Implementations.Session ? null : GetNowPlayingItem(session, info.ItemId); - await UpdateNowPlayingItem(session, info, libraryItem).ConfigureAwait(false); + await UpdateNowPlayingItem(session, info, libraryItem, !isAutomated).ConfigureAwait(false); var users = GetUsers(session); @@ -703,18 +705,6 @@ namespace Emby.Server.Implementations.Session } } - if (!string.IsNullOrWhiteSpace(info.LiveStreamId)) - { - try - { - await _mediaSourceManager.PingLiveStream(info.LiveStreamId, CancellationToken.None).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.ErrorException("Error closing live stream", ex); - } - } - EventHelper.FireEventIfNotNull(PlaybackProgress, this, new PlaybackProgressEventArgs { Item = libraryItem, diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs index b62af554e7..a59ab33a97 100644 --- a/MediaBrowser.Api/ApiEntryPoint.cs +++ b/MediaBrowser.Api/ApiEntryPoint.cs @@ -426,18 +426,6 @@ namespace MediaBrowser.Api { job.ChangeKillTimerIfStarted(); } - - if (!string.IsNullOrWhiteSpace(job.LiveStreamId)) - { - try - { - await _mediaSourceManager.PingLiveStream(job.LiveStreamId, CancellationToken.None).ConfigureAwait(false); - } - catch (Exception ex) - { - Logger.ErrorException("Error closing live stream", ex); - } - } } /// diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 480508e6ff..699c4bbb2f 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -169,7 +169,7 @@ namespace MediaBrowser.Api.Playback { OpenToken = state.MediaSource.OpenToken - }, false, cancellationTokenSource.Token).ConfigureAwait(false); + }, cancellationTokenSource.Token).ConfigureAwait(false); EncodingHelper.AttachMediaSourceInfo(state, liveStreamResponse.MediaSource, state.RequestedUrl); diff --git a/MediaBrowser.Api/Playback/MediaInfoService.cs b/MediaBrowser.Api/Playback/MediaInfoService.cs index 0ee0dab300..fcd18bfe47 100644 --- a/MediaBrowser.Api/Playback/MediaInfoService.cs +++ b/MediaBrowser.Api/Playback/MediaInfoService.cs @@ -109,7 +109,7 @@ namespace MediaBrowser.Api.Playback { var authInfo = _authContext.GetAuthorizationInfo(Request); - var result = await _mediaSourceManager.OpenLiveStream(request, true, CancellationToken.None).ConfigureAwait(false); + var result = await _mediaSourceManager.OpenLiveStream(request, CancellationToken.None).ConfigureAwait(false); var profile = request.DeviceProfile; if (profile == null) diff --git a/MediaBrowser.Api/SuggestionsService.cs b/MediaBrowser.Api/SuggestionsService.cs index 3e901e303d..99411ffdcb 100644 --- a/MediaBrowser.Api/SuggestionsService.cs +++ b/MediaBrowser.Api/SuggestionsService.cs @@ -12,7 +12,6 @@ using MediaBrowser.Controller.Library; namespace MediaBrowser.Api { [Route("/Users/{UserId}/Suggestions", "GET", Summary = "Gets items based on a query.")] - [Route("/Users/{UserId}/Suggestions", "POST", Summary = "Gets items based on a query.")] public class GetSuggestedItems : IReturn> { public string MediaType { get; set; } @@ -21,7 +20,6 @@ namespace MediaBrowser.Api public bool EnableTotalRecordCount { get; set; } public int? StartIndex { get; set; } public int? Limit { get; set; } - public string Name { get; set; } public string[] GetMediaTypes() { @@ -56,13 +54,6 @@ namespace MediaBrowser.Api return ToOptimizedResult(result); } - public async Task Post(GetSuggestedItems request) - { - var result = await GetResultItems(request).ConfigureAwait(false); - - return ToOptimizedResult(result); - } - private async Task> GetResultItems(GetSuggestedItems request) { var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; @@ -86,29 +77,6 @@ namespace MediaBrowser.Api private QueryResult GetItems(GetSuggestedItems request, User user, DtoOptions dtoOptions) { - BaseItem similarToItem = null; - - if (!string.IsNullOrWhiteSpace(request.Name)) - { - // get item by name, then get similar items from that - similarToItem = _libraryManager.GetItemList(new InternalItemsQuery(user) - { - SortBy = new string[] {ItemSortBy.Random}, - MediaTypes = request.GetMediaTypes(), - IncludeItemTypes = request.GetIncludeItemTypes(), - IsVirtualItem = false, - Name = request.Name, - Recursive = true, - Limit = 1 - - }).FirstOrDefault(); - - if (similarToItem == null) - { - return new QueryResult(); - } - } - return _libraryManager.GetItemsResult(new InternalItemsQuery(user) { SortBy = new string[] { ItemSortBy.Random }, @@ -119,8 +87,7 @@ namespace MediaBrowser.Api Limit = request.Limit, DtoOptions = dtoOptions, EnableTotalRecordCount = request.EnableTotalRecordCount, - Recursive = true, - SimilarTo = similarToItem + Recursive = true }); } } diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs index 13adceed54..126f1c7539 100644 --- a/MediaBrowser.Api/TvShowsService.cs +++ b/MediaBrowser.Api/TvShowsService.cs @@ -137,7 +137,6 @@ namespace MediaBrowser.Api } [Route("/Shows/{Id}/Episodes", "GET", Summary = "Gets episodes for a tv season")] - [Route("/Shows/Episodes", "POST", Summary = "Gets episodes for a tv season")] public class GetEpisodes : IReturn, IHasItemFields, IHasDtoOptions { /// @@ -200,12 +199,9 @@ namespace MediaBrowser.Api [ApiMember(Name = "EnableUserData", Description = "Optional, include user data", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")] public bool? EnableUserData { get; set; } - - public string SeriesName { get; set; } } [Route("/Shows/{Id}/Seasons", "GET", Summary = "Gets seasons for a tv series")] - [Route("/Shows/Seasons", "POST", Summary = "Gets seasons for a tv series")] public class GetSeasons : IReturn, IHasItemFields, IHasDtoOptions { /// @@ -248,8 +244,6 @@ namespace MediaBrowser.Api [ApiMember(Name = "EnableUserData", Description = "Optional, include user data", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")] public bool? EnableUserData { get; set; } - - public string SeriesName { get; set; } } /// @@ -431,7 +425,7 @@ namespace MediaBrowser.Api { var user = _userManager.GetUserById(request.UserId); - var series = GetSeries(request.Id, request.SeriesName, user); + var series = GetSeries(request.Id, user); if (series == null) { @@ -459,33 +453,13 @@ namespace MediaBrowser.Api }; } - public Task Post(GetSeasons request) - { - return Get(request); - } - - public Task Post(GetEpisodes request) - { - return Get(request); - } - - private Series GetSeries(string seriesId, string seriesName, User user) + private Series GetSeries(string seriesId, User user) { if (!string.IsNullOrWhiteSpace(seriesId)) { return _libraryManager.GetItemById(seriesId) as Series; } - if (!string.IsNullOrWhiteSpace(seriesName)) - { - return _libraryManager.GetItemList(new InternalItemsQuery(user) - { - Name = seriesName, - IncludeItemTypes = new string[] { typeof(Series).Name } - - }).OfType().FirstOrDefault(); - } - return null; } @@ -508,7 +482,7 @@ namespace MediaBrowser.Api } else if (request.Season.HasValue) { - var series = GetSeries(request.Id, request.SeriesName, user); + var series = GetSeries(request.Id, user); if (series == null) { @@ -528,7 +502,7 @@ namespace MediaBrowser.Api } else { - var series = GetSeries(request.Id, request.SeriesName, user); + var series = GetSeries(request.Id, user); if (series == null) { diff --git a/MediaBrowser.Controller/Library/IMediaSourceManager.cs b/MediaBrowser.Controller/Library/IMediaSourceManager.cs index 1ab0e4cb06..2f8f377896 100644 --- a/MediaBrowser.Controller/Library/IMediaSourceManager.cs +++ b/MediaBrowser.Controller/Library/IMediaSourceManager.cs @@ -68,10 +68,9 @@ namespace MediaBrowser.Controller.Library /// Opens the media source. /// /// The request. - /// if set to true [enable automatic close]. /// The cancellation token. /// Task<MediaSourceInfo>. - Task OpenLiveStream(LiveStreamRequest request, bool enableAutoClose, CancellationToken cancellationToken); + Task OpenLiveStream(LiveStreamRequest request, CancellationToken cancellationToken); /// /// Gets the live stream. @@ -82,14 +81,6 @@ namespace MediaBrowser.Controller.Library Task GetLiveStream(string id, CancellationToken cancellationToken); Task> GetLiveStreamWithDirectStreamProvider(string id, CancellationToken cancellationToken); - - /// - /// Pings the media source. - /// - /// The live stream identifier. - /// The cancellation token. - /// Task. - Task PingLiveStream(string id, CancellationToken cancellationToken); /// /// Closes the media source. diff --git a/MediaBrowser.Controller/Session/ISessionManager.cs b/MediaBrowser.Controller/Session/ISessionManager.cs index 3871952450..956d4cc95f 100644 --- a/MediaBrowser.Controller/Session/ISessionManager.cs +++ b/MediaBrowser.Controller/Session/ISessionManager.cs @@ -99,6 +99,8 @@ namespace MediaBrowser.Controller.Session /// Task OnPlaybackProgress(PlaybackProgressInfo info); + Task OnPlaybackProgress(PlaybackProgressInfo info, bool isAutomated); + /// /// Used to report that playback has ended for an item /// diff --git a/MediaBrowser.Controller/Session/SessionInfo.cs b/MediaBrowser.Controller/Session/SessionInfo.cs index 6cb6f4bb69..4cb08de9fe 100644 --- a/MediaBrowser.Controller/Session/SessionInfo.cs +++ b/MediaBrowser.Controller/Session/SessionInfo.cs @@ -257,7 +257,7 @@ namespace MediaBrowser.Controller.Session try { - await _sessionManager.OnPlaybackProgress(progressInfo).ConfigureAwait(false); + await _sessionManager.OnPlaybackProgress(progressInfo, true).ConfigureAwait(false); } catch (Exception ex) { diff --git a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs index c0440e1321..e402c2bac8 100644 --- a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs @@ -356,7 +356,7 @@ namespace MediaBrowser.MediaEncoding.Encoder { OpenToken = state.MediaSource.OpenToken - }, false, cancellationToken).ConfigureAwait(false); + }, cancellationToken).ConfigureAwait(false); EncodingHelper.AttachMediaSourceInfo(state, liveStreamResponse.MediaSource, null); -- cgit v1.2.3 From 099f8037c520b8ada4c1701a96c464503acd458e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 19 Apr 2017 12:57:06 -0400 Subject: don't read user data from nfo's anymore --- .../LiveTv/LiveStreamHelper.cs | 13 +- .../LiveTv/LiveTvMediaSourceProvider.cs | 11 +- MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs | 157 --------------------- 3 files changed, 17 insertions(+), 164 deletions(-) (limited to 'Emby.Server.Implementations/LiveTv') diff --git a/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs b/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs index 053af4fc6f..4efef44704 100644 --- a/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs +++ b/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs @@ -82,19 +82,24 @@ namespace Emby.Server.Implementations.LiveTv { var width = videoStream.Width ?? 1920; - if (width >= 1900) + if (width >= 3000) + { + videoStream.BitRate = 25000000; + } + + else if (width >= 1900) { videoStream.BitRate = 15000000; } - else if (width >= 1260) + else if (width >= 1200) { - videoStream.BitRate = 3000000; + videoStream.BitRate = 4000000; } else if (width >= 700) { - videoStream.BitRate = 1000000; + videoStream.BitRate = 1500000; } } diff --git a/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs b/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs index 329f5b8a4b..220c503d1f 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs @@ -183,19 +183,24 @@ namespace Emby.Server.Implementations.LiveTv { var width = videoStream.Width ?? 1920; - if (width >= 1900) + if (width >= 3000) + { + videoStream.BitRate = 25000000; + } + + else if (width >= 1900) { videoStream.BitRate = 15000000; } - else if (width >= 1260) + else if (width >= 1200) { videoStream.BitRate = 4000000; } else if (width >= 700) { - videoStream.BitRate = 1000000; + videoStream.BitRate = 1500000; } } } diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs index c44970ff50..a12976f829 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs @@ -256,8 +256,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers { var item = itemResult.Item; - var userDataUserId = _config.GetNfoConfiguration().UserId; - switch (reader.Name) { // DateCreated @@ -792,117 +790,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers break; } - case "watched": - { - var val = reader.ReadElementContentAsString(); - - if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId)) - { - bool parsedValue; - if (bool.TryParse(val, out parsedValue)) - { - var userData = GetOrAdd(itemResult, userDataUserId); - - userData.Played = parsedValue; - } - } - break; - } - - case "playcount": - { - var val = reader.ReadElementContentAsString(); - - if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId)) - { - int parsedValue; - if (int.TryParse(val, NumberStyles.Integer, _usCulture, out parsedValue)) - { - var userData = GetOrAdd(itemResult, userDataUserId); - - userData.PlayCount = parsedValue; - - if (parsedValue > 0) - { - userData.Played = true; - } - } - } - break; - } - - case "lastplayed": - { - var val = reader.ReadElementContentAsString(); - - if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId)) - { - DateTime parsedValue; - if (DateTime.TryParseExact(val, "yyyy-MM-dd HH:mm:ss", _usCulture, DateTimeStyles.AssumeLocal, out parsedValue)) - { - var userData = GetOrAdd(itemResult, userDataUserId); - - userData.LastPlayedDate = parsedValue.ToUniversalTime(); - } - } - break; - } - - case "resume": - { - if (!reader.IsEmptyElement) - { - using (var subtree = reader.ReadSubtree()) - { - if (!string.IsNullOrWhiteSpace(userDataUserId)) - { - var userData = GetOrAdd(itemResult, userDataUserId); - - FetchFromResumeNode(subtree, item, userData); - } - } - } - else - { - reader.Read(); - } - break; - } - - case "isuserfavorite": - { - var val = reader.ReadElementContentAsString(); - - if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId)) - { - bool parsedValue; - if (bool.TryParse(val, out parsedValue)) - { - var userData = GetOrAdd(itemResult, userDataUserId); - - userData.IsFavorite = parsedValue; - } - } - break; - } - - case "userrating": - { - var val = reader.ReadElementContentAsString(); - - if (!string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(userDataUserId)) - { - double parsedValue; - if (double.TryParse(val, NumberStyles.Any, _usCulture, out parsedValue)) - { - var userData = GetOrAdd(itemResult, userDataUserId); - - userData.Rating = parsedValue; - } - } - break; - } - default: string readerName = reader.Name; string providerIdValue; @@ -922,50 +809,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers } } - private UserItemData GetOrAdd(MetadataResult result, string userId) - { - return result.GetOrAddUserData(userId); - } - - private void FetchFromResumeNode(XmlReader reader, T item, UserItemData userData) - { - reader.MoveToContent(); - reader.Read(); - - // Loop through each element - while (!reader.EOF && reader.ReadState == ReadState.Interactive) - { - if (reader.NodeType == XmlNodeType.Element) - { - switch (reader.Name) - { - case "position": - { - var val = reader.ReadElementContentAsString(); - - if (!string.IsNullOrWhiteSpace(val)) - { - double parsedValue; - if (double.TryParse(val, NumberStyles.Any, _usCulture, out parsedValue)) - { - userData.PlaybackPositionTicks = TimeSpan.FromSeconds(parsedValue).Ticks; - } - } - break; - } - - default: - reader.Skip(); - break; - } - } - else - { - reader.Read(); - } - } - } - private void FetchFromFileInfoNode(XmlReader reader, T item) { reader.MoveToContent(); -- cgit v1.2.3 From 7ea3719a2dfbdbe18a6b83ea5532f061c238cbc4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 20 Apr 2017 16:17:52 -0400 Subject: 3.2.12.11 --- Emby.Server.Implementations/Library/LibraryManager.cs | 2 +- Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs | 4 ---- Emby.Server.Implementations/LiveTv/LiveTvManager.cs | 1 - MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs | 10 ---------- MediaBrowser.Model/Entities/MediaStream.cs | 7 ------- SharedVersion.cs | 2 +- 6 files changed, 2 insertions(+), 24 deletions(-) (limited to 'Emby.Server.Implementations/LiveTv') diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index fc2299907a..16a73f3922 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -2577,7 +2577,7 @@ namespace Emby.Server.Implementations.Library }).OrderBy(i => i.Path).ToList(); } - private static readonly string[] ExtrasSubfolderNames = new[] { "extras", "specials", "shorts", "scenes", "featurettes", "behind the scenes", "deleted scenes" }; + private static readonly string[] ExtrasSubfolderNames = new[] { "extras", "specials", "shorts", "scenes", "featurettes", "behind the scenes", "deleted scenes", "interviews" }; public IEnumerable