From a23caa625e083d10438a35a7892bdaddd0d9f595 Mon Sep 17 00:00:00 2001 From: Sourish Date: Fri, 19 Apr 2024 12:39:35 +0530 Subject: [PATCH] Update get resumable items toinclude local alt versions --- .../Data/SqliteUserDataRepository.cs | 26 +++++++++++++++++++ .../Library/UserDataManager.cs | 5 ++++ Jellyfin.Api/Controllers/ItemsController.cs | 19 ++++++++++++++ .../Library/IUserDataManager.cs | 2 ++ .../Persistence/IUserDataRepository.cs | 8 ++++++ 5 files changed, 60 insertions(+) diff --git a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs index 20359e4ad7..20c772dbce 100644 --- a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs @@ -284,6 +284,32 @@ namespace Emby.Server.Implementations.Data } } + public UserItemData GetUserDataByPresentationUniqueKey(long userId, string key) + { + if (userId <= 0) + { + throw new ArgumentNullException(nameof(userId)); + } + + ArgumentException.ThrowIfNullOrEmpty(key); + + using (var connection = GetConnection()) + { + using (var statement = connection.PrepareStatement("select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from UserDatas where REPLACE(Key, '-', '')=@Key and userId=@UserId")) + { + statement.TryBind("@UserId", userId); + statement.TryBind("@Key", key); + + foreach (var row in statement.ExecuteQuery()) + { + return ReadRow(row); + } + } + + return null; + } + } + public UserItemData GetUserData(long userId, List keys) { ArgumentNullException.ThrowIfNull(keys); diff --git a/Emby.Server.Implementations/Library/UserDataManager.cs b/Emby.Server.Implementations/Library/UserDataManager.cs index 8beeb8041f..745065a409 100644 --- a/Emby.Server.Implementations/Library/UserDataManager.cs +++ b/Emby.Server.Implementations/Library/UserDataManager.cs @@ -217,6 +217,11 @@ namespace Emby.Server.Implementations.Library return dto; } + public UserItemData GetUserDataByPresentationUniqueKey(User user, BaseItem item) + { + return _repository.GetUserDataByPresentationUniqueKey(user.InternalId, item.PresentationUniqueKey); + } + /// public UserItemDataDto GetUserDataDto(BaseItem item, BaseItemDto itemDto, User user, DtoOptions options) { diff --git a/Jellyfin.Api/Controllers/ItemsController.cs b/Jellyfin.Api/Controllers/ItemsController.cs index 6ffe6e7da1..2476963929 100644 --- a/Jellyfin.Api/Controllers/ItemsController.cs +++ b/Jellyfin.Api/Controllers/ItemsController.cs @@ -880,6 +880,25 @@ public class ItemsController : BaseJellyfinApiController ExcludeItemIds = excludeItemIds }); + var videoItems = itemsResult.Items.Where(item => item.MediaType == MediaType.Video); + + foreach (var videoItem in videoItems) + { + var childItemIds = ((Video)videoItem).GetLocalAlternateVersionIds(); + + foreach (var childItemId in childItemIds) + { + var item = _libraryManager.GetItemById(childItemId); + + var userData = _userDataRepository.GetUserDataByPresentationUniqueKey(user, item); + + if (userData != null && userData.PlaybackPositionTicks > 0) + { + itemsResult.Items = itemsResult.Items.Append(item).ToList(); + } + } + } + var returnItems = _dtoService.GetBaseItemDtos(itemsResult.Items, dtoOptions, user); return new QueryResult( diff --git a/MediaBrowser.Controller/Library/IUserDataManager.cs b/MediaBrowser.Controller/Library/IUserDataManager.cs index 43cccfc65c..0ce222a3d4 100644 --- a/MediaBrowser.Controller/Library/IUserDataManager.cs +++ b/MediaBrowser.Controller/Library/IUserDataManager.cs @@ -48,6 +48,8 @@ namespace MediaBrowser.Controller.Library UserItemData GetUserData(Guid userId, BaseItem item); + UserItemData GetUserDataByPresentationUniqueKey(User user, BaseItem item); + /// /// Gets the user data dto. /// diff --git a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs b/MediaBrowser.Controller/Persistence/IUserDataRepository.cs index f2fb2826a0..ca79f000bb 100644 --- a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs +++ b/MediaBrowser.Controller/Persistence/IUserDataRepository.cs @@ -37,6 +37,14 @@ namespace MediaBrowser.Controller.Persistence /// The user data. UserItemData GetUserData(long userId, List keys); + /// + /// Gets the user data. + /// + /// The user id. + /// The key. + /// The user data. + UserItemData GetUserDataByPresentationUniqueKey(long userId, string key); + /// /// Return all user data associated with the given user. ///