PlaybackCheckInHandler.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using MediaBrowser.Common.Net.Handlers;
  2. using MediaBrowser.Controller;
  3. using MediaBrowser.Controller.Entities;
  4. using MediaBrowser.Controller.Library;
  5. using MediaBrowser.Model.Connectivity;
  6. using MediaBrowser.Model.Dto;
  7. using System;
  8. using System.Threading.Tasks;
  9. namespace MediaBrowser.Api.HttpHandlers
  10. {
  11. /// <summary>
  12. /// Provides a handler to set played status for an item
  13. /// </summary>
  14. public class PlaybackCheckInHandler : BaseSerializationHandler<Kernel, UserItemDataDto>
  15. {
  16. /// <summary>
  17. /// Gets the object to serialize.
  18. /// </summary>
  19. /// <returns>Task{DtoUserItemData}.</returns>
  20. protected override async Task<UserItemDataDto> GetObjectToSerialize()
  21. {
  22. // Get the user
  23. var user = await this.GetCurrentUser().ConfigureAwait(false);
  24. var clientType = ClientType.Other;
  25. if (!string.IsNullOrEmpty(QueryString["client"]))
  26. {
  27. ClientType type;
  28. if (Enum.TryParse(QueryString["client"], true, out type))
  29. {
  30. clientType = type;
  31. }
  32. }
  33. var device = QueryString["device"];
  34. // Get the item
  35. var item = DtoBuilder.GetItemByClientId(QueryString["id"], user.Id);
  36. // Playback start check-in
  37. if (QueryString["type"].Equals("start", StringComparison.OrdinalIgnoreCase))
  38. {
  39. Kernel.UserDataManager.OnPlaybackStart(user, item, clientType, device);
  40. }
  41. else
  42. {
  43. long? positionTicks = null;
  44. if (!string.IsNullOrEmpty(QueryString["positionTicks"]))
  45. {
  46. positionTicks = long.Parse(QueryString["positionTicks"]);
  47. }
  48. // Progress check-ins require position ticks
  49. if (QueryString["type"].Equals("progress", StringComparison.OrdinalIgnoreCase))
  50. {
  51. await Kernel.UserDataManager.OnPlaybackProgress(user, item, positionTicks, clientType, device).ConfigureAwait(false);
  52. }
  53. else if (QueryString["type"].Equals("stopped", StringComparison.OrdinalIgnoreCase))
  54. {
  55. await Kernel.UserDataManager.OnPlaybackStopped(user, item, positionTicks, clientType, device).ConfigureAwait(false);
  56. }
  57. }
  58. var data = item.GetUserData(user, true);
  59. return new DtoBuilder(null).GetDtoUserItemData(data);
  60. }
  61. /// <summary>
  62. /// Gets the current user.
  63. /// </summary>
  64. /// <returns>User.</returns>
  65. /// <exception cref="System.UnauthorizedAccessException"></exception>
  66. public async Task<User> GetCurrentUser()
  67. {
  68. var handler = this;
  69. var id = handler.QueryString["userid"];
  70. var user = ApiService.GetUserById(id);
  71. if (user == null)
  72. {
  73. throw new UnauthorizedAccessException(string.Format("User with Id {0} does not exist", id));
  74. }
  75. var clientType = ClientType.Other;
  76. if (!string.IsNullOrEmpty(handler.QueryString["client"]))
  77. {
  78. ClientType type;
  79. if (Enum.TryParse(handler.QueryString["client"], true, out type))
  80. {
  81. clientType = type;
  82. }
  83. }
  84. var device = handler.QueryString["device"];
  85. await Controller.Kernel.Instance.UserManager.LogUserActivity(user, clientType, device).ConfigureAwait(false);
  86. return user;
  87. }
  88. }
  89. }