diff options
| author | Luke <luke.pulverenti@gmail.com> | 2017-04-20 23:49:50 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-04-20 23:49:50 -0400 |
| commit | f525f5a89e68248a81ab7cfdfa044fbe45e51863 (patch) | |
| tree | f029e380a0867d6e8db7895e63d9a69e0cfd426f /Emby.Server.Implementations | |
| parent | 5dca8cb077fb544628f62939bbda292d8c91b637 (diff) | |
| parent | b9fe720e736abacc57ffb846e4ce6644bc110f61 (diff) | |
Merge pull request #2591 from MediaBrowser/beta
Beta
Diffstat (limited to 'Emby.Server.Implementations')
16 files changed, 159 insertions, 225 deletions
diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index c5ba6c892..51f91acf3 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -1990,24 +1990,6 @@ namespace Emby.Server.Implementations.Data } index++; - if (string.IsNullOrWhiteSpace(item.Tagline)) - { - var movie = item as Movie; - if (movie != null && movie.Taglines.Count > 0) - { - movie.Tagline = movie.Taglines[0]; - } - } - - if (type == typeof(Person) && item.ProductionLocations.Count == 0) - { - var person = (Person)item; - if (!string.IsNullOrWhiteSpace(person.PlaceOfBirth)) - { - item.ProductionLocations = new List<string> { person.PlaceOfBirth }; - } - } - return item; } diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index e65e98f21..7c0baf9c2 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<Tuple<BaseItemDto, LiveTvChannel>> { new Tuple<BaseItemDto, LiveTvChannel>(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/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index 4b1418007..d4766e1ec 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -311,10 +311,6 @@ <HintPath>..\packages\SQLitePCLRaw.core.1.1.2\lib\portable-net45+netcore45+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLitePCLRaw.core.dll</HintPath> <Private>True</Private> </Reference> - <Reference Include="UniversalDetector, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> - <HintPath>..\packages\UniversalDetector.1.0.1\lib\portable-net45+sl4+wp71+win8+wpa81\UniversalDetector.dll</HintPath> - <Private>True</Private> - </Reference> </ItemGroup> <ItemGroup> <EmbeddedResource Include="Localization\Core\ar.json" /> diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index dbb0160a5..16a73f392 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -41,6 +41,7 @@ using SortOrder = MediaBrowser.Model.Entities.SortOrder; using VideoResolver = MediaBrowser.Naming.Video.VideoResolver; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.LiveTv; using MediaBrowser.Model.Tasks; namespace Emby.Server.Implementations.Library @@ -375,11 +376,22 @@ namespace Emby.Server.Implementations.Library throw new ArgumentNullException("item"); } - _logger.Debug("Deleting item, Type: {0}, Name: {1}, Path: {2}, Id: {3}", - item.GetType().Name, - item.Name ?? "Unknown name", - item.Path ?? string.Empty, - item.Id); + if (item is LiveTvProgram) + { + _logger.Debug("Deleting item, Type: {0}, Name: {1}, Path: {2}, Id: {3}", + item.GetType().Name, + item.Name ?? "Unknown name", + item.Path ?? string.Empty, + item.Id); + } + else + { + _logger.Info("Deleting item, Type: {0}, Name: {1}, Path: {2}, Id: {3}", + item.GetType().Name, + item.Name ?? "Unknown name", + item.Path ?? string.Empty, + item.Id); + } var parent = item.Parent; @@ -2565,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<Video> FindExtras(BaseItem owner, List<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService) { diff --git a/Emby.Server.Implementations/Library/MediaSourceManager.cs b/Emby.Server.Implementations/Library/MediaSourceManager.cs index ccd4c3631..4857008f3 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<string, LiveStreamInfo> _openStreams = new Dictionary<string, LiveStreamInfo>(StringComparer.OrdinalIgnoreCase); private readonly SemaphoreSlim _liveStreamSemaphore = new SemaphoreSlim(1, 1); - public async Task<LiveStreamResponse> OpenLiveStream(LiveStreamRequest request, bool enableAutoClose, CancellationToken cancellationToken) + public async Task<LiveStreamResponse> 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<MediaSourceInfo>(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<IMediaSourceProvider, string>(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<LiveStreamInfo> 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); - } - } - } - } - /// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> 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/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index b791311f9..3550a83b9 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<MusicVideo>(args.Path, args.Parent, files, args.DirectoryService, collectionType, false); + return FindMovie<MusicVideo>(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 0ea1b38b1..666c1fdcd 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 3906df000..d56ddc57d 100644 --- a/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs +++ b/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs @@ -30,8 +30,6 @@ namespace Emby.Server.Implementations.LiveTv var now = DateTime.UtcNow; - var allowVideoStreamCopy = mediaSource.MediaStreams.Any(i => i.Type == MediaStreamType.Video && i.AllowStreamCopy); - var info = await _mediaEncoder.GetMediaInfo(new MediaInfoRequest { InputPath = mediaSource.Path, @@ -76,25 +74,28 @@ namespace Emby.Server.Implementations.LiveTv var videoStream = mediaSource.MediaStreams.FirstOrDefault(i => i.Type == MediaBrowser.Model.Entities.MediaStreamType.Video); if (videoStream != null) { - videoStream.AllowStreamCopy = allowVideoStreamCopy; - if (!videoStream.BitRate.HasValue) { var width = videoStream.Width ?? 1920; - if (width >= 1900) + if (width >= 3000) { - videoStream.BitRate = 8000000; + videoStream.BitRate = 30000000; } - else if (width >= 1260) + else if (width >= 1900) { - videoStream.BitRate = 3000000; + videoStream.BitRate = 20000000; + } + + else if (width >= 1200) + { + videoStream.BitRate = 8000000; } else if (width >= 700) { - videoStream.BitRate = 1000000; + videoStream.BitRate = 2000000; } } diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs index 4ffea3571..a898d3084 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs @@ -490,7 +490,6 @@ namespace Emby.Server.Implementations.LiveTv if (stream.Type == MediaStreamType.Video) { stream.IsInterlaced = true; - stream.AllowStreamCopy = false; } } } @@ -2284,7 +2283,7 @@ namespace Emby.Server.Implementations.LiveTv }; } - public void AddChannelInfo(List<Tuple<BaseItemDto, LiveTvChannel>> tuples, DtoOptions options, User user) + public async Task AddChannelInfo(List<Tuple<BaseItemDto, LiveTvChannel>> tuples, DtoOptions options, User user) { var now = DateTime.UtcNow; @@ -2304,6 +2303,12 @@ namespace Emby.Server.Implementations.LiveTv RemoveFields(options); + var currentProgramsList = new List<BaseItem>(); + var currentChannelsDict = new Dictionary<string, BaseItemDto>(); + + var addCurrentProgram = options.AddCurrentProgram; + var addMediaSources = options.Fields.Contains(ItemFields.MediaSources); + foreach (var tuple in tuples) { var dto = tuple.Item1; @@ -2314,19 +2319,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/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs b/Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs index a9c449f83..0329ea606 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 = 8000000; + videoStream.BitRate = 30000000; } - else if (width >= 1260) + else if (width >= 1900) { - videoStream.BitRate = 3000000; + videoStream.BitRate = 20000000; + } + + else if (width >= 1200) + { + videoStream.BitRate = 8000000; } else if (width >= 700) { - videoStream.BitRate = 1000000; + videoStream.BitRate = 2000000; } } } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs index 4ec70f802..8cf1106f0 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, diff --git a/Emby.Server.Implementations/ServerManager/WebSocketConnection.cs b/Emby.Server.Implementations/ServerManager/WebSocketConnection.cs index 4608a13e6..ac20fe7b3 100644 --- a/Emby.Server.Implementations/ServerManager/WebSocketConnection.cs +++ b/Emby.Server.Implementations/ServerManager/WebSocketConnection.cs @@ -13,7 +13,6 @@ using MediaBrowser.Common.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Services; using MediaBrowser.Model.Text; -using UniversalDetector; namespace Emby.Server.Implementations.ServerManager { @@ -137,7 +136,8 @@ namespace Emby.Server.Implementations.ServerManager { return; } - var charset = DetectCharset(bytes); + + var charset = _textEncoding.GetDetectedEncodingName(bytes, null); if (string.Equals(charset, "utf-8", StringComparison.OrdinalIgnoreCase)) { @@ -148,33 +148,6 @@ namespace Emby.Server.Implementations.ServerManager OnReceiveInternal(_textEncoding.GetASCIIEncoding().GetString(bytes, 0, bytes.Length)); } } - private string DetectCharset(byte[] bytes) - { - try - { - using (var ms = _memoryStreamProvider.CreateNew(bytes)) - { - var detector = new CharsetDetector(); - detector.Feed(ms); - detector.DataEnd(); - - var charset = detector.Charset; - - if (!string.IsNullOrWhiteSpace(charset)) - { - //_logger.Debug("UniversalDetector detected charset {0}", charset); - } - - return charset; - } - } - catch (IOException ex) - { - _logger.ErrorException("Error attempting to determine web socket message charset", ex); - } - - return null; - } private void OnReceiveInternal(string message) { diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs index 05a240cea..0a2312735 100644 --- a/Emby.Server.Implementations/Session/SessionManager.cs +++ b/Emby.Server.Implementations/Session/SessionManager.cs @@ -197,6 +197,8 @@ namespace Emby.Server.Implementations.Session _logger.ErrorException("Error disposing session controller", ex); } } + + info.Dispose(); } /// <summary> @@ -308,10 +310,7 @@ namespace Emby.Server.Implementations.Session /// <summary> /// Updates the now playing item id. /// </summary> - /// <param name="session">The session.</param> - /// <param name="info">The information.</param> - /// <param name="libraryItem">The library item.</param> - 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)) { @@ -350,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; @@ -415,7 +418,7 @@ namespace Emby.Server.Implementations.Session if (!_activeConnections.TryGetValue(key, out sessionInfo)) { - sessionInfo = new SessionInfo + sessionInfo = new SessionInfo(this, _logger) { Client = appName, DeviceId = deviceId, @@ -602,14 +605,14 @@ 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) { ClearTranscodingInfo(session.DeviceId); } - session.QueueableMediaTypes = info.QueueableMediaTypes; + session.StartAutomaticProgress(_timerFactory, info); var users = GetUsers(session); @@ -668,14 +671,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); + } + /// <summary> /// Used to report playback progress for an item /// </summary> - /// <param name="info">The info.</param> - /// <returns>Task.</returns> - /// <exception cref="System.ArgumentNullException"></exception> - /// <exception cref="System.ArgumentOutOfRangeException">positionTicks</exception> - public async Task OnPlaybackProgress(PlaybackProgressInfo info) + public async Task OnPlaybackProgress(PlaybackProgressInfo info, bool isAutomated) { if (info == null) { @@ -688,7 +692,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); @@ -700,18 +704,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, @@ -727,6 +719,11 @@ namespace Emby.Server.Implementations.Session }, _logger); + if (!isAutomated) + { + session.StartAutomaticProgress(_timerFactory, info); + } + StartIdleCheckTimer(); } @@ -788,6 +785,8 @@ namespace Emby.Server.Implementations.Session var session = GetSession(info.SessionId); + session.StopAutomaticProgress(); + var libraryItem = string.IsNullOrWhiteSpace(info.ItemId) ? null : GetNowPlayingItem(session, info.ItemId); @@ -1009,19 +1008,9 @@ namespace Emby.Server.Implementations.Session } } - if (command.PlayCommand != PlayCommand.PlayNow) - { - if (items.Any(i => !session.QueueableMediaTypes.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase))) - { - throw new ArgumentException(string.Format("{0} is unable to queue the requested media type.", session.DeviceName ?? session.Id)); - } - } - else + if (items.Any(i => !session.PlayableMediaTypes.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase))) { - if (items.Any(i => !session.PlayableMediaTypes.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase))) - { - throw new ArgumentException(string.Format("{0} is unable to play the requested media type.", session.DeviceName ?? session.Id)); - } + throw new ArgumentException(string.Format("{0} is unable to play the requested media type.", session.DeviceName ?? session.Id)); } if (user != null && command.ItemIds.Length == 1 && user.Configuration.EnableNextEpisodeAutoPlay) @@ -1601,7 +1590,6 @@ namespace Emby.Server.Implementations.Session LastActivityDate = session.LastActivityDate, NowViewingItem = session.NowViewingItem, ApplicationVersion = session.ApplicationVersion, - QueueableMediaTypes = session.QueueableMediaTypes, PlayableMediaTypes = session.PlayableMediaTypes, AdditionalUsers = session.AdditionalUsers, SupportedCommands = session.SupportedCommands, diff --git a/Emby.Server.Implementations/Session/SessionWebSocketListener.cs b/Emby.Server.Implementations/Session/SessionWebSocketListener.cs index 336c2caee..478f9da71 100644 --- a/Emby.Server.Implementations/Session/SessionWebSocketListener.cs +++ b/Emby.Server.Implementations/Session/SessionWebSocketListener.cs @@ -289,7 +289,6 @@ namespace Emby.Server.Implementations.Session var itemId = vals[0]; - var queueableMediaTypes = string.Empty; var canSeek = true; if (vals.Length > 1) @@ -298,15 +297,14 @@ namespace Emby.Server.Implementations.Session } if (vals.Length > 2) { - queueableMediaTypes = vals[2]; + // vals[2] used to be QueueableMediaTypes } var info = new PlaybackStartInfo { CanSeek = canSeek, ItemId = itemId, - SessionId = session.Id, - QueueableMediaTypes = queueableMediaTypes.Split(',').ToList() + SessionId = session.Id }; if (vals.Length > 3) diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs index a13dd0569..840c7ce0d 100644 --- a/Emby.Server.Implementations/Updates/InstallationManager.cs +++ b/Emby.Server.Implementations/Updates/InstallationManager.cs @@ -270,9 +270,14 @@ namespace Emby.Server.Implementations.Updates } } + private PackageVersionClass GetSystemUpdateLevel() + { + return _applicationHost.SystemUpdateLevel; + } + private TimeSpan GetCacheLength() { - switch (_config.CommonConfiguration.SystemUpdateLevel) + switch (GetSystemUpdateLevel()) { case PackageVersionClass.Beta: return TimeSpan.FromMinutes(30); @@ -424,10 +429,12 @@ namespace Emby.Server.Implementations.Updates .ToList(); } + var systemUpdateLevel = GetSystemUpdateLevel(); + // Figure out what needs to be installed var packages = plugins.Select(p => { - var latestPluginInfo = GetLatestCompatibleVersion(catalog, p.Name, p.Id.ToString(), applicationVersion, _config.CommonConfiguration.SystemUpdateLevel); + var latestPluginInfo = GetLatestCompatibleVersion(catalog, p.Name, p.Id.ToString(), applicationVersion, systemUpdateLevel); return latestPluginInfo != null && GetPackageVersion(latestPluginInfo) > p.Version ? latestPluginInfo : null; diff --git a/Emby.Server.Implementations/packages.config b/Emby.Server.Implementations/packages.config index ac4e885c7..e4c75e1e9 100644 --- a/Emby.Server.Implementations/packages.config +++ b/Emby.Server.Implementations/packages.config @@ -4,5 +4,4 @@ <package id="MediaBrowser.Naming" version="1.0.5" targetFramework="portable45-net45+win8" /> <package id="SQLitePCL.pretty" version="1.1.0" targetFramework="portable45-net45+win8" /> <package id="SQLitePCLRaw.core" version="1.1.2" targetFramework="portable45-net45+win8" /> - <package id="UniversalDetector" version="1.0.1" targetFramework="portable45-net45+win8" /> </packages>
\ No newline at end of file |
