SessionWebSocketListener.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. using System.Globalization;
  2. using MediaBrowser.Common.Net;
  3. using MediaBrowser.Controller.Dto;
  4. using MediaBrowser.Controller.Library;
  5. using MediaBrowser.Controller.Session;
  6. using MediaBrowser.Model.Logging;
  7. using System;
  8. using System.Linq;
  9. using System.Threading.Tasks;
  10. namespace MediaBrowser.Server.Implementations.Session
  11. {
  12. /// <summary>
  13. /// Class SessionWebSocketListener
  14. /// </summary>
  15. public class SessionWebSocketListener : IWebSocketListener
  16. {
  17. /// <summary>
  18. /// The _true task result
  19. /// </summary>
  20. private readonly Task _trueTaskResult = Task.FromResult(true);
  21. /// <summary>
  22. /// The _session manager
  23. /// </summary>
  24. private readonly ISessionManager _sessionManager;
  25. /// <summary>
  26. /// The _logger
  27. /// </summary>
  28. private readonly ILogger _logger;
  29. private readonly IUserManager _userManager;
  30. private readonly ILibraryManager _libraryManager;
  31. /// <summary>
  32. /// Initializes a new instance of the <see cref="SessionWebSocketListener" /> class.
  33. /// </summary>
  34. /// <param name="sessionManager">The session manager.</param>
  35. /// <param name="logger">The logger.</param>
  36. /// <param name="libraryManager">The library manager.</param>
  37. /// <param name="userManager">The user manager.</param>
  38. public SessionWebSocketListener(ISessionManager sessionManager, ILogger logger, ILibraryManager libraryManager, IUserManager userManager)
  39. {
  40. _sessionManager = sessionManager;
  41. _logger = logger;
  42. _libraryManager = libraryManager;
  43. _userManager = userManager;
  44. }
  45. /// <summary>
  46. /// Processes the message.
  47. /// </summary>
  48. /// <param name="message">The message.</param>
  49. /// <returns>Task.</returns>
  50. public Task ProcessMessage(WebSocketMessageInfo message)
  51. {
  52. if (string.Equals(message.MessageType, "Identity", StringComparison.OrdinalIgnoreCase))
  53. {
  54. var vals = message.Data.Split('|');
  55. var client = vals[0];
  56. var deviceId = vals[1];
  57. var session = _sessionManager.Sessions.FirstOrDefault(i => string.Equals(i.DeviceId, deviceId) && string.Equals(i.Client, client));
  58. if (session != null)
  59. {
  60. session.WebSocket = message.Connection;
  61. }
  62. }
  63. else if (string.Equals(message.MessageType, "Context", StringComparison.OrdinalIgnoreCase))
  64. {
  65. var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection);
  66. if (session != null)
  67. {
  68. var vals = message.Data.Split('|');
  69. session.NowViewingItemType = vals[0];
  70. session.NowViewingItemIdentifier = vals[1];
  71. session.NowViewingContext = vals.Length > 2 ? vals[2] : null;
  72. }
  73. }
  74. else if (string.Equals(message.MessageType, "PlaybackStart", StringComparison.OrdinalIgnoreCase))
  75. {
  76. var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection);
  77. if (session != null && session.UserId.HasValue)
  78. {
  79. var item = DtoBuilder.GetItemByClientId(message.Data, _userManager, _libraryManager);
  80. _sessionManager.OnPlaybackStart(_userManager.GetUserById(session.UserId.Value), item, session.Client, session.DeviceId, session.DeviceName);
  81. }
  82. }
  83. else if (string.Equals(message.MessageType, "PlaybackProgress", StringComparison.OrdinalIgnoreCase))
  84. {
  85. var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection);
  86. if (session != null && session.UserId.HasValue)
  87. {
  88. var vals = message.Data.Split('|');
  89. var item = DtoBuilder.GetItemByClientId(vals[0], _userManager, _libraryManager);
  90. long? positionTicks = null;
  91. if (vals.Length > 1)
  92. {
  93. long pos;
  94. if (long.TryParse(vals[1], out pos))
  95. {
  96. positionTicks = pos;
  97. }
  98. }
  99. var isPaused = vals.Length > 2 && string.Equals(vals[2], "true", StringComparison.OrdinalIgnoreCase);
  100. _sessionManager.OnPlaybackProgress(_userManager.GetUserById(session.UserId.Value), item, positionTicks, isPaused, session.Client, session.DeviceId, session.DeviceName);
  101. }
  102. }
  103. else if (string.Equals(message.MessageType, "PlaybackStopped", StringComparison.OrdinalIgnoreCase))
  104. {
  105. var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection);
  106. if (session != null && session.UserId.HasValue)
  107. {
  108. var vals = message.Data.Split('|');
  109. var item = DtoBuilder.GetItemByClientId(vals[0], _userManager, _libraryManager);
  110. long? positionTicks = null;
  111. if (vals.Length > 1)
  112. {
  113. long pos;
  114. if (long.TryParse(vals[1], out pos))
  115. {
  116. positionTicks = pos;
  117. }
  118. }
  119. _sessionManager.OnPlaybackStopped(_userManager.GetUserById(session.UserId.Value), item, positionTicks, session.Client, session.DeviceId, session.DeviceName);
  120. }
  121. }
  122. return _trueTaskResult;
  123. }
  124. }
  125. }