aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs
diff options
context:
space:
mode:
authorIonut Andrei Oanca <oancaionutandrei@gmail.com>2020-09-24 23:04:21 +0200
committerIonut Andrei Oanca <oancaionutandrei@gmail.com>2020-10-16 12:06:29 +0200
commit8819a9d478e6fc11dbfdcff80d9a2dc175953373 (patch)
tree8a159745dd08ebfa6d83e881c8eb6a07df0a589d /Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs
parented2eabec16aafdf795f5ea4f8834ffdc74bc149f (diff)
Add playlist-sync and group-wait to SyncPlay
Diffstat (limited to 'Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs')
-rw-r--r--Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs129
1 files changed, 63 insertions, 66 deletions
diff --git a/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs b/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs
index b85f3c149..a8e30a9ec 100644
--- a/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs
+++ b/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs
@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
-using System.Globalization;
using System.Linq;
using System.Threading;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Session;
@@ -41,14 +39,14 @@ namespace Emby.Server.Implementations.SyncPlay
/// <summary>
/// The map between sessions and groups.
/// </summary>
- private readonly Dictionary<string, ISyncPlayController> _sessionToGroupMap =
- new Dictionary<string, ISyncPlayController>(StringComparer.OrdinalIgnoreCase);
+ private readonly Dictionary<string, ISyncPlayGroupController> _sessionToGroupMap =
+ new Dictionary<string, ISyncPlayGroupController>(StringComparer.OrdinalIgnoreCase);
/// <summary>
/// The groups.
/// </summary>
- private readonly Dictionary<Guid, ISyncPlayController> _groups =
- new Dictionary<Guid, ISyncPlayController>();
+ private readonly Dictionary<Guid, ISyncPlayGroupController> _groups =
+ new Dictionary<Guid, ISyncPlayGroupController>();
/// <summary>
/// Lock used for accesing any group.
@@ -75,7 +73,9 @@ namespace Emby.Server.Implementations.SyncPlay
_sessionManager = sessionManager;
_libraryManager = libraryManager;
+ _sessionManager.SessionStarted += OnSessionManagerSessionStarted;
_sessionManager.SessionEnded += OnSessionManagerSessionEnded;
+ _sessionManager.PlaybackStart += OnSessionManagerPlaybackStart;
_sessionManager.PlaybackStopped += OnSessionManagerPlaybackStopped;
}
@@ -83,7 +83,7 @@ namespace Emby.Server.Implementations.SyncPlay
/// Gets all groups.
/// </summary>
/// <value>All groups.</value>
- public IEnumerable<ISyncPlayController> Groups => _groups.Values;
+ public IEnumerable<ISyncPlayGroupController> Groups => _groups.Values;
/// <inheritdoc />
public void Dispose()
@@ -103,13 +103,15 @@ namespace Emby.Server.Implementations.SyncPlay
return;
}
+ _sessionManager.SessionStarted -= OnSessionManagerSessionStarted;
_sessionManager.SessionEnded -= OnSessionManagerSessionEnded;
+ _sessionManager.PlaybackStart -= OnSessionManagerPlaybackStart;
_sessionManager.PlaybackStopped -= OnSessionManagerPlaybackStopped;
_disposed = true;
}
- private void OnSessionManagerSessionEnded(object sender, SessionEventArgs e)
+ private void OnSessionManagerSessionStarted(object sender, SessionEventArgs e)
{
var session = e.SessionInfo;
if (!IsSessionInGroup(session))
@@ -117,52 +119,60 @@ namespace Emby.Server.Implementations.SyncPlay
return;
}
- LeaveGroup(session, CancellationToken.None);
+ var groupId = GetSessionGroup(session) ?? Guid.Empty;
+ var request = new JoinGroupRequest()
+ {
+ GroupId = groupId
+ };
+ JoinGroup(session, groupId, request, CancellationToken.None);
}
- private void OnSessionManagerPlaybackStopped(object sender, PlaybackStopEventArgs e)
+ private void OnSessionManagerSessionEnded(object sender, SessionEventArgs e)
{
- var session = e.Session;
+ var session = e.SessionInfo;
if (!IsSessionInGroup(session))
{
return;
}
- LeaveGroup(session, CancellationToken.None);
+ // TODO: probably remove this event, not used at the moment
}
- private bool IsSessionInGroup(SessionInfo session)
+ private void OnSessionManagerPlaybackStart(object sender, PlaybackProgressEventArgs e)
{
- return _sessionToGroupMap.ContainsKey(session.Id);
+ var session = e.Session;
+ if (!IsSessionInGroup(session))
+ {
+ return;
+ }
+
+ // TODO: probably remove this event, not used at the moment
}
- private bool HasAccessToItem(User user, Guid itemId)
+ private void OnSessionManagerPlaybackStopped(object sender, PlaybackStopEventArgs e)
{
- var item = _libraryManager.GetItemById(itemId);
-
- // Check ParentalRating access
- var hasParentalRatingAccess = !user.MaxParentalAgeRating.HasValue
- || item.InheritedParentalRatingValue <= user.MaxParentalAgeRating;
-
- if (!user.HasPermission(PermissionKind.EnableAllFolders) && hasParentalRatingAccess)
+ var session = e.Session;
+ if (!IsSessionInGroup(session))
{
- var collections = _libraryManager.GetCollectionFolders(item).Select(
- folder => folder.Id.ToString("N", CultureInfo.InvariantCulture));
-
- return collections.Intersect(user.GetPreference(PreferenceKind.EnabledFolders)).Any();
+ return;
}
- return hasParentalRatingAccess;
+ // TODO: probably remove this event, not used at the moment
+ }
+
+ private bool IsSessionInGroup(SessionInfo session)
+ {
+ return _sessionToGroupMap.ContainsKey(session.Id);
}
private Guid? GetSessionGroup(SessionInfo session)
{
_sessionToGroupMap.TryGetValue(session.Id, out var group);
- return group?.GetGroupId();
+ return group?.GroupId;
}
/// <inheritdoc />
- public void NewGroup(SessionInfo session, CancellationToken cancellationToken)
+ public void NewGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken)
{
var user = _userManager.GetUserById(session.UserId);
@@ -174,8 +184,7 @@ namespace Emby.Server.Implementations.SyncPlay
{
Type = GroupUpdateType.CreateGroupDenied
};
-
- _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
+ _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
return;
}
@@ -186,10 +195,10 @@ namespace Emby.Server.Implementations.SyncPlay
LeaveGroup(session, cancellationToken);
}
- var group = new SyncPlayController(_sessionManager, this, _logger);
- _groups[group.GetGroupId()] = group;
+ var group = new SyncPlayGroupController(_logger, _userManager, _sessionManager, _libraryManager, this);
+ _groups[group.GroupId] = group;
- group.CreateGroup(session, cancellationToken);
+ group.CreateGroup(session, request, cancellationToken);
}
}
@@ -206,14 +215,13 @@ namespace Emby.Server.Implementations.SyncPlay
{
Type = GroupUpdateType.JoinGroupDenied
};
-
- _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
+ _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
return;
}
lock (_groupsLock)
{
- ISyncPlayController group;
+ ISyncPlayGroupController group;
_groups.TryGetValue(groupId, out group);
if (group == null)
@@ -224,20 +232,20 @@ namespace Emby.Server.Implementations.SyncPlay
{
Type = GroupUpdateType.GroupDoesNotExist
};
- _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
+ _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
return;
}
- if (!HasAccessToItem(user, group.GetPlayingItemId()))
+ if (!group.HasAccessToPlayQueue(user))
{
- _logger.LogWarning("JoinGroup: {0} does not have access to {1}.", session.Id, group.GetPlayingItemId());
+ _logger.LogWarning("JoinGroup: {0} does not have access to some content from the playing queue of group {1}.", session.Id, group.GroupId.ToString());
var error = new GroupUpdate<string>()
{
- GroupId = group.GetGroupId().ToString(),
+ GroupId = group.GroupId.ToString(),
Type = GroupUpdateType.LibraryAccessDenied
};
- _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
+ _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
return;
}
@@ -245,6 +253,7 @@ namespace Emby.Server.Implementations.SyncPlay
{
if (GetSessionGroup(session).Equals(groupId))
{
+ group.SessionRestore(session, request, cancellationToken);
return;
}
@@ -271,7 +280,7 @@ namespace Emby.Server.Implementations.SyncPlay
{
Type = GroupUpdateType.NotInGroup
};
- _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
+ _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
return;
}
@@ -279,14 +288,14 @@ namespace Emby.Server.Implementations.SyncPlay
if (group.IsGroupEmpty())
{
- _logger.LogInformation("LeaveGroup: removing empty group {0}.", group.GetGroupId());
- _groups.Remove(group.GetGroupId(), out _);
+ _logger.LogInformation("LeaveGroup: removing empty group {0}.", group.GroupId);
+ _groups.Remove(group.GroupId, out _);
}
}
}
/// <inheritdoc />
- public List<GroupInfoDto> ListGroups(SessionInfo session, Guid filterItemId)
+ public List<GroupInfoDto> ListGroups(SessionInfo session)
{
var user = _userManager.GetUserById(session.UserId);
@@ -295,20 +304,9 @@ namespace Emby.Server.Implementations.SyncPlay
return new List<GroupInfoDto>();
}
- // Filter by item if requested
- if (!filterItemId.Equals(Guid.Empty))
- {
- return _groups.Values.Where(
- group => group.GetPlayingItemId().Equals(filterItemId) && HasAccessToItem(user, group.GetPlayingItemId())).Select(
- group => group.GetInfo()).ToList();
- }
- else
- {
- // Otherwise show all available groups
- return _groups.Values.Where(
- group => HasAccessToItem(user, group.GetPlayingItemId())).Select(
- group => group.GetInfo()).ToList();
- }
+ return _groups.Values.Where(
+ group => group.HasAccessToPlayQueue(user)).Select(
+ group => group.GetInfo()).ToList();
}
/// <inheritdoc />
@@ -324,8 +322,7 @@ namespace Emby.Server.Implementations.SyncPlay
{
Type = GroupUpdateType.JoinGroupDenied
};
-
- _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
+ _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
return;
}
@@ -341,7 +338,7 @@ namespace Emby.Server.Implementations.SyncPlay
{
Type = GroupUpdateType.NotInGroup
};
- _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
+ _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
return;
}
@@ -350,7 +347,7 @@ namespace Emby.Server.Implementations.SyncPlay
}
/// <inheritdoc />
- public void AddSessionToGroup(SessionInfo session, ISyncPlayController group)
+ public void AddSessionToGroup(SessionInfo session, ISyncPlayGroupController group)
{
if (IsSessionInGroup(session))
{
@@ -361,7 +358,7 @@ namespace Emby.Server.Implementations.SyncPlay
}
/// <inheritdoc />
- public void RemoveSessionFromGroup(SessionInfo session, ISyncPlayController group)
+ public void RemoveSessionFromGroup(SessionInfo session, ISyncPlayGroupController group)
{
if (!IsSessionInGroup(session))
{
@@ -369,7 +366,7 @@ namespace Emby.Server.Implementations.SyncPlay
}
_sessionToGroupMap.Remove(session.Id, out var tempGroup);
- if (!tempGroup.GetGroupId().Equals(group.GetGroupId()))
+ if (!tempGroup.GroupId.Equals(group.GroupId))
{
throw new InvalidOperationException("Session was in wrong group!");
}