aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2017-04-20 23:49:50 -0400
committerGitHub <noreply@github.com>2017-04-20 23:49:50 -0400
commitf525f5a89e68248a81ab7cfdfa044fbe45e51863 (patch)
treef029e380a0867d6e8db7895e63d9a69e0cfd426f /Emby.Server.Implementations
parent5dca8cb077fb544628f62939bbda292d8c91b637 (diff)
parentb9fe720e736abacc57ffb846e4ce6644bc110f61 (diff)
Merge pull request #2591 from MediaBrowser/beta
Beta
Diffstat (limited to 'Emby.Server.Implementations')
-rw-r--r--Emby.Server.Implementations/Data/SqliteItemRepository.cs18
-rw-r--r--Emby.Server.Implementations/Dto/DtoService.cs5
-rw-r--r--Emby.Server.Implementations/Emby.Server.Implementations.csproj4
-rw-r--r--Emby.Server.Implementations/Library/LibraryManager.cs24
-rw-r--r--Emby.Server.Implementations/Library/MediaSourceManager.cs98
-rw-r--r--Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs49
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs19
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveTvManager.cs34
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveTvMediaSourceProvider.cs15
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs1
-rw-r--r--Emby.Server.Implementations/ServerManager/WebSocketConnection.cs31
-rw-r--r--Emby.Server.Implementations/Session/SessionManager.cs66
-rw-r--r--Emby.Server.Implementations/Session/SessionWebSocketListener.cs6
-rw-r--r--Emby.Server.Implementations/Updates/InstallationManager.cs11
-rw-r--r--Emby.Server.Implementations/packages.config1
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