2
0
Эх сурвалжийг харах

Add ability to exclude active sessions from resumable items

Cody Robibero 3 жил өмнө
parent
commit
8295a3be0d

+ 20 - 3
Jellyfin.Api/Controllers/ItemsController.cs

@@ -10,6 +10,7 @@ using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Session;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Globalization;
@@ -33,6 +34,7 @@ namespace Jellyfin.Api.Controllers
         private readonly ILocalizationManager _localization;
         private readonly IDtoService _dtoService;
         private readonly ILogger<ItemsController> _logger;
+        private readonly ISessionManager _sessionManager;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="ItemsController"/> class.
@@ -42,18 +44,21 @@ namespace Jellyfin.Api.Controllers
         /// <param name="localization">Instance of the <see cref="ILocalizationManager"/> interface.</param>
         /// <param name="dtoService">Instance of the <see cref="IDtoService"/> interface.</param>
         /// <param name="logger">Instance of the <see cref="ILogger"/> interface.</param>
+        /// <param name="sessionManager">Instance of the <see cref="ISessionManager"/> interface.</param>
         public ItemsController(
             IUserManager userManager,
             ILibraryManager libraryManager,
             ILocalizationManager localization,
             IDtoService dtoService,
-            ILogger<ItemsController> logger)
+            ILogger<ItemsController> logger,
+            ISessionManager sessionManager)
         {
             _userManager = userManager;
             _libraryManager = libraryManager;
             _localization = localization;
             _dtoService = dtoService;
             _logger = logger;
+            _sessionManager = sessionManager;
         }
 
         /// <summary>
@@ -763,6 +768,7 @@ namespace Jellyfin.Api.Controllers
         /// <param name="includeItemTypes">Optional. If specified, results will be filtered based on the item type. This allows multiple, comma delimited.</param>
         /// <param name="enableTotalRecordCount">Optional. Enable the total record count.</param>
         /// <param name="enableImages">Optional. Include image information in output.</param>
+        /// <param name="excludeActiveSessions">Optional. Whether to exclude the currently active sessions.</param>
         /// <response code="200">Items returned.</response>
         /// <returns>A <see cref="QueryResult{BaseItemDto}"/> with the items that are resumable.</returns>
         [HttpGet("Users/{userId}/Items/Resume")]
@@ -781,7 +787,8 @@ namespace Jellyfin.Api.Controllers
             [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] excludeItemTypes,
             [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes,
             [FromQuery] bool enableTotalRecordCount = true,
-            [FromQuery] bool? enableImages = true)
+            [FromQuery] bool? enableImages = true,
+            [FromQuery] bool excludeActiveSessions = false)
         {
             var user = _userManager.GetUserById(userId);
             var parentIdGuid = parentId ?? Guid.Empty;
@@ -801,6 +808,15 @@ namespace Jellyfin.Api.Controllers
                     .ToArray();
             }
 
+            var excludeItemIds = Array.Empty<Guid>();
+            if (excludeActiveSessions)
+            {
+                excludeItemIds = _sessionManager.Sessions
+                    .Where(s => s.UserId == userId && s.NowPlayingItem != null)
+                    .Select(s => s.NowPlayingItem.Id)
+                    .ToArray();
+            }
+
             var itemsResult = _libraryManager.GetItemsResult(new InternalItemsQuery(user)
             {
                 OrderBy = new[] { (ItemSortBy.DatePlayed, SortOrder.Descending) },
@@ -817,7 +833,8 @@ namespace Jellyfin.Api.Controllers
                 AncestorIds = ancestorIds,
                 IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes),
                 ExcludeItemTypes = RequestHelpers.GetItemTypeStrings(excludeItemTypes),
-                SearchTerm = searchTerm
+                SearchTerm = searchTerm,
+                ExcludeItemIds = excludeItemIds
             });
 
             var returnItems = _dtoService.GetBaseItemDtos(itemsResult.Items, dtoOptions, user);