import "pkg:/source/api/baserequest.bs"
' V2 user endpoint shims — covers Jellyfin 10.9+
' All /Users/{userId}/ paths were removed in 10.9. Endpoints moved to top-level
' with userId passed as a query parameter. Verified against jellyfin-openapi-10.9.0.json.
' Do NOT call these functions directly. Use the ApiClient class via GetApi() (e.g., GetApi().GetItem()).
namespace sdkV2
namespace users
' Get user profile image URL.
' V2: GET /UserImage?userId=&type=&index=
function GetImageURL(id as string, imagetype = "primary" as string, imageindex = 0 as integer, params = {} as object) as dynamic
queryParams = { userId: id, type: imagetype, index: imageindex }
queryParams.append(params)
return buildURL("/UserImage", queryParams)
end function
' HEAD user profile image.
' V2: HEAD /UserImage?userId=&type=&index=
function HeadImageURL(id as string, imagetype = "primary" as string, imageindex = 0 as integer, params = {} as object)
queryParams = { userId: id, type: imagetype, index: imageindex }
queryParams.append(params)
req = APIRequest("/UserImage", queryParams)
return headVoid(req)
end function
' Gets items based on a query.
' V2: GET /Items/?userId=
function GetItemsByQuery(id as string, params = {} as object)
queryParams = { userId: id }
queryParams.append(params)
req = APIRequest("/items/", queryParams)
return getJson(req)
end function
' Gets resumable items.
' V2: GET /UserItems/Resume?userId=
function GetResumeItemsByQuery(id as string, params = {} as object)
queryParams = { userId: id }
queryParams.append(params)
req = APIRequest("/UserItems/Resume", queryParams)
return getJson(req)
end function
' Gets suggestions.
' V2: GET /Items/Suggestions?userId=
function GetSuggestions(id as string, params = {} as object)
queryParams = { userId: id }
queryParams.append(params)
req = APIRequest("/Items/Suggestions", queryParams)
return getJson(req)
end function
' Get user view grouping options.
' V2: GET /UserViews/GroupingOptions
function GetGroupingOptions(id as string)
req = APIRequest("/UserViews/GroupingOptions", { userId: id })
return getJson(req)
end function
' Get user views.
' V2: GET /UserViews?userId=
function GetViews(id as string, params = {} as object)
queryParams = { userId: id }
queryParams.append(params)
req = APIRequest("/UserViews", queryParams)
return getJson(req)
end function
' Gets an item from a user's library.
' V2: GET /Items/{itemId}?userId=
function GetItem(userid as string, itemid as string, params = {} as object)
queryParams = { userId: userid }
queryParams.append(params)
req = APIRequest(Substitute("/Items/{0}", itemid), queryParams)
return getJson(req)
end function
' Gets intros to play before the main media item plays.
' V2: GET /Items/{itemId}/Intros (userId not required — auth token identifies the user)
function GetIntros(_userid as string, itemid as string)
req = APIRequest(Substitute("/Items/{0}/Intros", itemid))
return getJson(req)
end function
' Gets local trailers for an item.
' V2: GET /Items/{itemId}/LocalTrailers (userId not required)
function GetLocalTrailers(_userid as string, itemid as string)
req = APIRequest(Substitute("/Items/{0}/LocalTrailers", itemid))
return getJson(req)
end function
' Gets special features for an item.
' V2: GET /Items/{itemId}/SpecialFeatures (userId not required)
function GetSpecialFeatures(_userid as string, itemid as string)
req = APIRequest(Substitute("/Items/{0}/SpecialFeatures", itemid))
return getJson(req)
end function
' Gets latest media.
' V2: GET /Items/Latest?userId=
function GetLatestMedia(userid as string, params = {} as object)
queryParams = { userId: userid }
queryParams.append(params)
req = APIRequest("/Items/Latest", queryParams)
return getJson(req)
end function
' Gets the root folder from a user's library.
' V2: GET /Items/Root
function GetRoot(userid as string)
req = APIRequest("/Items/Root", { userId: userid })
return getJson(req)
end function
' Marks an item as a favorite.
' V2: POST /UserFavoriteItems/{itemId}?userId=
function MarkFavorite(userid as string, itemid as string)
req = APIRequest(Substitute("/UserFavoriteItems/{0}", itemid), { userId: userid })
return postJson(req)
end function
' Unmarks item as a favorite.
' V2: DELETE /UserFavoriteItems/{itemId}?userId=
function UnmarkFavorite(userid as string, itemid as string)
req = APIRequest(Substitute("/UserFavoriteItems/{0}", itemid), { userId: userid })
return deleteVoid(req)
end function
' Deletes a user's saved personal rating for an item.
' V2: DELETE /UserItems/{itemId}/Rating?userId=
function DeleteRating(userid as string, itemid as string)
req = APIRequest(Substitute("/UserItems/{0}/Rating", itemid), { userId: userid })
return deleteVoid(req)
end function
' Updates a user's rating for an item.
' V2: POST /UserItems/{itemId}/Rating?userId=
function UpdateRating(userid as string, itemid as string, params = {} as object)
queryParams = { userId: userid }
queryParams.append(params)
req = APIRequest(Substitute("/UserItems/{0}/Rating", itemid), queryParams)
return postJson(req)
end function
' Marks an item as played for user.
' V2: POST /UserPlayedItems/{itemId}?userId=
function MarkPlayed(userid as string, itemid as string, params = {} as object)
if params.count() = 0
params = {
"DatePlayed": CreateObject("roDateTime").ToISOString(),
"PlaybackPositionTicks": 0
}
end if
queryParams = { userId: userid }
queryParams.append(params)
req = APIRequest(Substitute("/UserPlayedItems/{0}", itemid), queryParams)
return postJson(req)
end function
' Marks an item as unplayed for user.
' V2: DELETE /UserPlayedItems/{itemId}?userId=
function UnmarkPlayed(userid as string, itemid as string)
req = APIRequest(Substitute("/UserPlayedItems/{0}", itemid), { userId: userid })
return deleteVoid(req)
end function
' Reports that a user has begun playing an item.
' V2: POST /PlayingItems/{itemId}
function MarkPlaying(userid as string, itemid as string, params = {} as object)
queryParams = { userId: userid }
queryParams.append(params)
req = APIRequest(Substitute("/PlayingItems/{0}", itemid), queryParams)
return postJson(req)
end function
' Reports that a user has stopped playing an item.
' V2: DELETE /PlayingItems/{itemId}
function MarkStoppedPlaying(userid as string, itemid as string, params = {} as object)
queryParams = { userId: userid }
queryParams.append(params)
req = APIRequest(Substitute("/PlayingItems/{0}", itemid), queryParams)
return deleteVoid(req)
end function
' Reports a user's playback progress.
' V2: POST /PlayingItems/{itemId}/Progress
function ReportPlayProgress(userid as string, itemid as string, params = {} as object)
queryParams = { userId: userid }
queryParams.append(params)
req = APIRequest(Substitute("/PlayingItems/{0}/Progress", itemid), queryParams)
return postJson(req)
end function
' Updates a user configuration.
' V2: POST /Users/Configuration (userId not required — auth token identifies the user)
function UpdateConfiguration(_id as string, body = {} as object)
req = APIRequest("/Users/Configuration")
return postVoid(req, FormatJson(body))
end function
' Updates a user's password.
' V2: POST /Users/Password (userId not required — auth token identifies the user)
function UpdatePassword(_id as string, body = {} as object)
req = APIRequest("/Users/Password")
return postVoid(req, FormatJson(body))
end function
end namespace
end namespace