aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Session/SessionManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Session/SessionManager.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Session/SessionManager.cs129
1 files changed, 81 insertions, 48 deletions
diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs
index d9ec9b7e4..4bce7db9f 100644
--- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs
+++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
-using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Dto;
@@ -11,7 +10,6 @@ using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Security;
using MediaBrowser.Controller.Session;
@@ -307,21 +305,21 @@ namespace MediaBrowser.Server.Implementations.Session
/// <param name="libraryItem">The library item.</param>
private void UpdateNowPlayingItem(SessionInfo session, PlaybackProgressInfo info, BaseItem libraryItem)
{
- var runtimeTicks = libraryItem == null ? null : libraryItem.RunTimeTicks;
-
if (string.IsNullOrWhiteSpace(info.MediaSourceId))
{
info.MediaSourceId = info.ItemId;
}
- if (!string.Equals(info.ItemId, info.MediaSourceId) &&
- !string.IsNullOrWhiteSpace(info.MediaSourceId))
+ if (!string.IsNullOrWhiteSpace(info.ItemId) && info.Item == null && libraryItem != null)
{
- runtimeTicks = _libraryManager.GetItemById(new Guid(info.MediaSourceId)).RunTimeTicks;
- }
+ var runtimeTicks = libraryItem.RunTimeTicks;
+
+ if (!string.Equals(info.ItemId, info.MediaSourceId) &&
+ !string.IsNullOrWhiteSpace(info.MediaSourceId))
+ {
+ runtimeTicks = _libraryManager.GetItemById(new Guid(info.MediaSourceId)).RunTimeTicks;
+ }
- if (!string.IsNullOrWhiteSpace(info.ItemId) && libraryItem != null)
- {
var current = session.NowPlayingItem;
if (current == null || !string.Equals(current.Id, info.ItemId, StringComparison.OrdinalIgnoreCase))
@@ -711,7 +709,7 @@ namespace MediaBrowser.Server.Implementations.Session
info.MediaSourceId = info.ItemId;
}
- if (!string.IsNullOrWhiteSpace(info.ItemId) && libraryItem != null)
+ if (!string.IsNullOrWhiteSpace(info.ItemId) && info.Item == null && libraryItem != null)
{
var current = session.NowPlayingItem;
@@ -870,14 +868,14 @@ namespace MediaBrowser.Server.Implementations.Session
{
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.ToString()));
+ 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)))
{
- throw new ArgumentException(string.Format("{0} is unable to play the requested media type.", session.DeviceName ?? session.Id.ToString()));
+ throw new ArgumentException(string.Format("{0} is unable to play the requested media type.", session.DeviceName ?? session.Id));
}
}
@@ -895,14 +893,28 @@ namespace MediaBrowser.Server.Implementations.Session
{
var item = _libraryManager.GetItemById(new Guid(id));
+ var byName = item as IItemByName;
+
+ if (byName != null)
+ {
+ var itemFilter = byName.GetItemFilter();
+
+ var items = user == null ?
+ _libraryManager.RootFolder.GetRecursiveChildren(i => !i.IsFolder && itemFilter(i)) :
+ user.RootFolder.GetRecursiveChildren(user, i => !i.IsFolder && itemFilter(i));
+
+ items = items.OrderBy(i => i.SortName);
+
+ return items;
+ }
+
if (item.IsFolder)
{
var folder = (Folder)item;
- var items = user == null ? folder.RecursiveChildren :
- folder.GetRecursiveChildren(user);
-
- items = items.Where(i => !i.IsFolder);
+ var items = user == null ?
+ folder.GetRecursiveChildren(i => !i.IsFolder) :
+ folder.GetRecursiveChildren(user, i => !i.IsFolder);
items = items.OrderBy(i => i.SortName);
@@ -914,37 +926,9 @@ namespace MediaBrowser.Server.Implementations.Session
private IEnumerable<BaseItem> TranslateItemForInstantMix(string id, User user)
{
- var item = _libraryManager.GetItemById(new Guid(id));
-
- var audio = item as Audio;
+ var item = _libraryManager.GetItemById(id);
- if (audio != null)
- {
- return _musicManager.GetInstantMixFromSong(audio, user);
- }
-
- var artist = item as MusicArtist;
-
- if (artist != null)
- {
- return _musicManager.GetInstantMixFromArtist(artist.Name, user);
- }
-
- var album = item as MusicAlbum;
-
- if (album != null)
- {
- return _musicManager.GetInstantMixFromAlbum(album, user);
- }
-
- var genre = item as MusicGenre;
-
- if (genre != null)
- {
- return _musicManager.GetInstantMixFromGenres(new[] { genre.Name }, user);
- }
-
- return new BaseItem[] { };
+ return _musicManager.GetInstantMixFromItem(item, user);
}
public Task SendBrowseCommand(string controllingSessionId, string sessionId, BrowseRequest command, CancellationToken cancellationToken)
@@ -1356,7 +1340,14 @@ namespace MediaBrowser.Server.Implementations.Session
if (saveCapabilities)
{
- await SaveCapabilities(session.DeviceId, capabilities).ConfigureAwait(false);
+ try
+ {
+ await SaveCapabilities(session.DeviceId, capabilities).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error saving device capabilities", ex);
+ }
}
}
@@ -1632,5 +1623,47 @@ namespace MediaBrowser.Server.Implementations.Session
return Sessions.FirstOrDefault(i => string.Equals(i.DeviceId, deviceId) &&
string.Equals(i.Client, client));
}
+
+ public Task SendMessageToUserSessions<T>(string userId, string name, T data,
+ CancellationToken cancellationToken)
+ {
+ var sessions = Sessions.Where(i => i.IsActive && i.SessionController != null && i.ContainsUser(userId)).ToList();
+
+ var tasks = sessions.Select(session => Task.Run(async () =>
+ {
+ try
+ {
+ await session.SessionController.SendMessage(name, data, cancellationToken).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error sending message", ex);
+ }
+
+ }, cancellationToken));
+
+ return Task.WhenAll(tasks);
+ }
+
+ public Task SendMessageToUserDeviceSessions<T>(string deviceId, string name, T data,
+ CancellationToken cancellationToken)
+ {
+ var sessions = Sessions.Where(i => i.IsActive && i.SessionController != null && string.Equals(i.DeviceId, deviceId, StringComparison.OrdinalIgnoreCase)).ToList();
+
+ var tasks = sessions.Select(session => Task.Run(async () =>
+ {
+ try
+ {
+ await session.SessionController.SendMessage(name, data, cancellationToken).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error sending message", ex);
+ }
+
+ }, cancellationToken));
+
+ return Task.WhenAll(tasks);
+ }
}
} \ No newline at end of file