a23caa625e
f20a9c9b2b
@ -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<string> keys)
ArgumentNullException.ThrowIfNull(keys);
@ -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);
/// <inheritdoc />
public UserItemDataDto GetUserDataDto(BaseItem item, BaseItemDto itemDto, User user, DtoOptions options)
@ -887,6 +887,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<BaseItemDto>(
@ -48,6 +48,8 @@ namespace MediaBrowser.Controller.Library
UserItemData GetUserData(Guid userId, BaseItem item);
UserItemData GetUserDataByPresentationUniqueKey(User user, BaseItem item);
/// <summary>
/// Gets the user data dto.
/// </summary>
@ -37,6 +37,14 @@ namespace MediaBrowser.Controller.Persistence
/// <returns>The user data.</returns>
UserItemData GetUserData(long userId, List<string> keys);
/// Gets the user data.
/// <param name="userId">The user id.</param>
/// <param name="key">The key.</param>
UserItemData GetUserDataByPresentationUniqueKey(long userId, string key);
/// Return all user data associated with the given user.