@francofantomius/jellyfin 0.2.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +181 -1
- package/dist/index.cjs +1527 -172
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +686 -9
- package/dist/index.d.ts +686 -9
- package/dist/index.js +1520 -173
- package/dist/index.js.map +1 -1
- package/llms.txt +542 -0
- package/package.json +8 -6
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/auth.ts","../src/system.ts","../src/library.ts","../src/playlists.ts","../src/playback.ts","../src/quality.ts","../src/media.ts","../src/lyrics.ts","../src/favorites.ts","../src/offline.ts","../src/resume.ts","../src/next-up.ts","../src/latest.ts","../src/transcode.ts","../src/search.ts","../src/cache.ts","../src/storage.ts","../src/client.ts"],"names":["params"],"mappings":"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","file":"index.cjs","sourcesContent":["export class JellyfinError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'JellyfinError';\n }\n}\n\nexport class JellyfinApiError extends JellyfinError {\n public readonly status: number;\n public readonly endpoint?: string;\n\n constructor(message: string, status: number, endpoint?: string) {\n super(message);\n this.name = 'JellyfinApiError';\n this.status = status;\n this.endpoint = endpoint;\n }\n}\n\nexport class JellyfinAuthError extends JellyfinApiError {\n constructor(message: string = 'Unauthorized. Please check your Jellyfin credentials.', status: number = 401, endpoint?: string) {\n super(message, status, endpoint);\n this.name = 'JellyfinAuthError';\n }\n}\n\n","import { JellyfinApiError, JellyfinAuthError, JellyfinError } from './errors.js';\nimport type { ClientInfo } from './types.js';\n\nexport interface RequestOptions {\n method?: string;\n params?: Record<string, unknown>;\n body?: unknown;\n contentType?: string;\n headers?: Record<string, string>;\n}\n\nexport function cleanUrl(url: string): string {\n if (!url) return '';\n let cleaned = url.trim().replace(/\\/+$/, '');\n if (!/^https?:\\/\\//i.test(cleaned)) {\n cleaned = 'https://' + cleaned;\n }\n return cleaned;\n}\n\nexport function buildAuthHeader(clientInfo: ClientInfo, token?: string): string {\n const tokenPart = token ? `, Token=\"${token}\"` : '';\n return `MediaBrowser Client=\"${clientInfo.name}\", Device=\"${clientInfo.device}\", DeviceId=\"${clientInfo.deviceId}\", Version=\"${clientInfo.version}\"${tokenPart}`;\n}\n\nexport class HttpTransport {\n private serverUrl: string = '';\n private token: string = '';\n private clientInfo: ClientInfo;\n private fetchFn: typeof fetch;\n private onUnauthorized?: () => void;\n\n constructor(options: {\n serverUrl?: string;\n token?: string;\n clientInfo: ClientInfo;\n fetch?: typeof fetch;\n onUnauthorized?: () => void;\n }) {\n this.serverUrl = options.serverUrl ? cleanUrl(options.serverUrl) : '';\n this.token = options.token || '';\n this.clientInfo = options.clientInfo;\n this.fetchFn = options.fetch || (globalThis.fetch ? globalThis.fetch.bind(globalThis) : fetch);\n this.onUnauthorized = options.onUnauthorized;\n }\n\n setServerUrl(url: string): void {\n this.serverUrl = cleanUrl(url);\n }\n\n getServerUrl(): string {\n return this.serverUrl;\n }\n\n setToken(token: string): void {\n this.token = token;\n }\n\n getToken(): string {\n return this.token;\n }\n\n setClientInfo(info: Partial<ClientInfo>): void {\n this.clientInfo = { ...this.clientInfo, ...info };\n }\n\n getClientInfo(): ClientInfo {\n return this.clientInfo;\n }\n\n setOnUnauthorized(handler?: () => void): void {\n this.onUnauthorized = handler;\n }\n\n getAuthHeader(): string {\n return buildAuthHeader(this.clientInfo, this.token);\n }\n\n async requestRaw(endpoint: string, options: RequestOptions = {}): Promise<Response> {\n if (!this.serverUrl) {\n throw new JellyfinError('Jellyfin server URL is not configured.');\n }\n\n const { method = 'GET', params = {}, body = null, contentType, headers: customHeaders = {} } = options;\n\n const url = new URL(`${this.serverUrl}${endpoint.startsWith('/') ? '' : '/'}${endpoint}`);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value));\n }\n });\n\n const authHeader = this.getAuthHeader();\n const headers: Record<string, string> = {\n 'X-Emby-Authorization': authHeader,\n 'Authorization': authHeader,\n ...customHeaders\n };\n\n let serializedBody: string | undefined;\n if (contentType) {\n headers['Content-Type'] = contentType;\n serializedBody = typeof body === 'string' ? body : JSON.stringify(body);\n } else if (body !== null && body !== undefined) {\n if (typeof body === 'string') {\n headers['Content-Type'] = 'application/json';\n serializedBody = body;\n } else {\n headers['Content-Type'] = 'application/json';\n serializedBody = JSON.stringify(body);\n }\n }\n\n let response: Response;\n try {\n response = await this.fetchFn(url.toString(), {\n method,\n headers,\n body: serializedBody\n });\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n throw new JellyfinError(`Network request failed (${endpoint}): ${errorMsg}`);\n }\n\n if (response.status === 401 || response.status === 403) {\n if (response.status === 401 && this.onUnauthorized) {\n try {\n this.onUnauthorized();\n } catch {\n // ignore callback exceptions\n }\n }\n throw new JellyfinAuthError(`Unauthorized (HTTP ${response.status}) on ${endpoint}`, response.status, endpoint);\n }\n\n if (!response.ok) {\n throw new JellyfinApiError(`Jellyfin API request failed (${endpoint}): ${response.statusText}`, response.status, endpoint);\n }\n\n return response;\n }\n\n async request<T = unknown>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n const response = await this.requestRaw(endpoint, {\n ...options,\n headers: {\n Accept: 'application/json',\n ...(options.headers || {})\n }\n });\n\n const contentTypeHeader = response.headers.get('Content-Type') || '';\n if (contentTypeHeader.includes('application/json')) {\n return (await response.json()) as T;\n }\n\n return null as unknown as T;\n }\n\n async requestText(endpoint: string, options: RequestOptions = {}): Promise<string> {\n const response = await this.requestRaw(endpoint, {\n ...options,\n headers: {\n Accept: 'text/vtt, text/plain, */*',\n ...(options.headers || {})\n }\n });\n return await response.text();\n }\n\n async requestBlob(endpoint: string, options: RequestOptions = {}): Promise<Blob> {\n const response = await this.requestRaw(endpoint, options);\n return await response.blob();\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { AuthenticationResult, ClientCapabilities, UserDto } from './types.js';\nimport { JellyfinAuthError, JellyfinError } from './errors.js';\n\nexport class AuthModule {\n private http: HttpTransport;\n private currentUser: UserDto | null = null;\n private currentUserId: string = '';\n private currentUsername: string = '';\n\n constructor(http: HttpTransport, userId: string = '') {\n this.http = http;\n this.currentUserId = userId;\n }\n\n getUserId(): string {\n return this.currentUserId;\n }\n\n setUserId(id: string): void {\n this.currentUserId = id;\n }\n\n getUsername(): string {\n return this.currentUsername || this.currentUser?.Name || '';\n }\n\n getCurrentUser(): UserDto | null {\n return this.currentUser;\n }\n\n setCurrentUser(user: UserDto | null): void {\n this.currentUser = user;\n if (user?.Id) {\n this.currentUserId = user.Id;\n }\n if (user?.Name) {\n this.currentUsername = user.Name;\n }\n }\n\n /**\n * Authenticate with the Jellyfin server using username and password.\n */\n async authenticateByName(username: string, password: string = ''): Promise<AuthenticationResult> {\n if (!username || !username.trim()) {\n throw new JellyfinError('Username is required for authentication.');\n }\n\n const result = await this.http.request<AuthenticationResult>('/Users/AuthenticateByName', {\n method: 'POST',\n body: {\n Username: username.trim(),\n Pw: password || ''\n }\n });\n\n if (!result || !result.AccessToken || !result.User?.Id) {\n throw new JellyfinAuthError('Invalid response received from Jellyfin authentication endpoint.');\n }\n\n this.http.setToken(result.AccessToken);\n // Jellyfin 12 enforces case-insensitive usernames; store normalized username returned in User.Name\n this.setCurrentUser(result.User);\n this.currentUsername = result.User.Name;\n\n return result;\n }\n\n /**\n * Report client capabilities to the Jellyfin server.\n */\n async reportCapabilities(capabilities?: ClientCapabilities): Promise<void> {\n const payload: ClientCapabilities = {\n PlayableMediaTypes: ['Audio', 'Video'],\n SupportedCommands: [\n 'Play',\n 'PlayState',\n 'PlayNext',\n 'SetRepeatMode',\n 'SetShuffleQueue'\n ],\n SupportsMediaControl: true,\n SupportsSync: false,\n SupportsPersistentIdentifier: true,\n MessageFormat: 'Json',\n ...capabilities\n };\n\n try {\n await this.http.request('/Sessions/Capabilities/Full', {\n method: 'POST',\n body: payload\n });\n } catch {\n // Fallback for older Jellyfin servers\n try {\n await this.http.request('/Sessions/Capabilities', {\n method: 'POST',\n body: payload\n });\n } catch (fallbackErr) {\n console.warn('[Jellyfin SDK] Failed to report client capabilities:', fallbackErr);\n }\n }\n }\n\n /**\n * Build the user profile avatar image URL.\n */\n getUserImageUrl(userId?: string, tag?: string): string {\n const uid = userId || this.currentUserId;\n const serverUrl = this.http.getServerUrl();\n if (!serverUrl || !uid) return '';\n\n const tagToUse = tag || this.currentUser?.PrimaryImageTag || this.currentUser?.ImageTags?.Primary || '';\n const tagParam = tagToUse ? `?tag=${tagToUse}` : '';\n return `${serverUrl}/Users/${uid}/Images/Primary${tagParam}`;\n }\n\n /**\n * Clear active user credentials and token.\n */\n logout(): void {\n this.http.setToken('');\n this.currentUserId = '';\n this.currentUsername = '';\n this.currentUser = null;\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { PublicSystemInfo, SystemInfo } from './types.js';\n\n/**\n * Parses a semantic version string (e.g. \"10.9.11\", \"12.0.0\", \"12.0.0-rc1\") into numeric components.\n */\nexport function parseSemVer(version: string): { major: number; minor: number; patch: number } | null {\n if (!version) return null;\n const match = version.trim().match(/^(\\d+)\\.(\\d+)(?:\\.(\\d+))?/);\n if (!match) return null;\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: match[3] ? parseInt(match[3], 10) : 0\n };\n}\n\n/**\n * Checks if currentVersion is greater than or equal to targetVersion.\n */\nexport function isVersionAtLeast(currentVersion: string, targetVersion: string): boolean {\n const current = parseSemVer(currentVersion);\n const target = parseSemVer(targetVersion);\n if (!current || !target) return false;\n\n if (current.major !== target.major) {\n return current.major > target.major;\n }\n if (current.minor !== target.minor) {\n return current.minor > target.minor;\n }\n return current.patch >= target.patch;\n}\n\n/**\n * Checks if the given version string represents Jellyfin 12.0.0 or higher.\n */\nexport function isV12OrHigher(version?: string): boolean {\n if (!version) return false;\n const parsed = parseSemVer(version);\n if (!parsed) return false;\n return parsed.major >= 12;\n}\n\nexport class SystemModule {\n private http: HttpTransport;\n private serverVersion: string | null = null;\n private targetVersion: 'auto' | '10' | '12' = 'auto';\n\n constructor(\n http: HttpTransport,\n options?: {\n serverVersion?: string;\n targetVersion?: 'auto' | '10' | '12';\n }\n ) {\n this.http = http;\n if (options?.serverVersion) {\n this.serverVersion = options.serverVersion;\n }\n if (options?.targetVersion) {\n this.targetVersion = options.targetVersion;\n }\n }\n\n /**\n * Get public system info without requiring authentication.\n */\n async getPublicInfo(): Promise<PublicSystemInfo> {\n const info = await this.http.request<PublicSystemInfo>('/System/Info/Public');\n if (info?.Version) {\n this.serverVersion = info.Version;\n }\n return info;\n }\n\n /**\n * Get full system info (requires authentication).\n */\n async getInfo(): Promise<SystemInfo> {\n const info = await this.http.request<SystemInfo>('/System/Info');\n if (info?.Version) {\n this.serverVersion = info.Version;\n }\n return info;\n }\n\n /**\n * Get the cached or explicitly configured server version string.\n */\n getVersion(): string | null {\n return this.serverVersion;\n }\n\n /**\n * Manually set or override the server version.\n */\n setVersion(version: string | null): void {\n this.serverVersion = version;\n }\n\n /**\n * Get the configured target compatibility mode.\n */\n getTargetVersion(): 'auto' | '10' | '12' {\n return this.targetVersion;\n }\n\n /**\n * Set target compatibility mode.\n */\n setTargetVersion(target: 'auto' | '10' | '12'): void {\n this.targetVersion = target;\n }\n\n /**\n * Detects and caches the server version by calling /System/Info/Public.\n */\n async detectVersion(): Promise<string | null> {\n try {\n const info = await this.getPublicInfo();\n return info?.Version || null;\n } catch {\n return null;\n }\n }\n\n /**\n * Checks whether the current server is Jellyfin 12 or higher.\n * If targetVersion is explicitly set to '12' or '10', that preference is honored.\n * If 'auto', resolves against known version or attempts detection.\n */\n async isV12(): Promise<boolean> {\n if (this.targetVersion === '12') return true;\n if (this.targetVersion === '10') return false;\n\n if (!this.serverVersion) {\n await this.detectVersion();\n }\n\n if (this.serverVersion) {\n return isV12OrHigher(this.serverVersion);\n }\n\n // Default to true (modern behavior) if undetermined\n return true;\n }\n\n /**\n * Synchronously checks if the server is known to be v12+ based on cached version or target setting.\n * Defaults to true (modern behavior) if unknown.\n */\n isV12Sync(): boolean {\n if (this.targetVersion === '12') return true;\n if (this.targetVersion === '10') return false;\n if (this.serverVersion) {\n return isV12OrHigher(this.serverVersion);\n }\n return true;\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type {\n BaseItemDto,\n GetAlbumsOptions,\n GetArtistsOptions,\n GetEpisodesOptions,\n GetMoviesOptions,\n GetSeasonsOptions,\n GetSeriesOptions,\n GetSongsOptions,\n GetVideosOptions,\n ItemsResponse,\n PlaybackInfoOptions,\n PlaybackInfoResponse,\n SearchOptions\n} from './types.js';\nimport { JellyfinError } from './errors.js';\n\nconst COMMON_ITEM_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,Chapters,HasLyrics,Overview,Genres,Studios,ProductionYear,OfficialRating,CommunityRating,CriticRating,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class LibraryModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private requireUserId(): string {\n const userId = this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for library requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Get list of music library views (folders) for the current user.\n */\n async getMusicLibraries(): Promise<BaseItemDto[]> {\n const userId = this.requireUserId();\n const data = await this.http.request<ItemsResponse>(`/Users/${userId}/Views`);\n return (data.Items || []).filter((item) => item.CollectionType === 'music');\n }\n\n /**\n * Get list of video library views (movies, tv shows, home videos) for the current user.\n */\n async getVideoLibraries(): Promise<BaseItemDto[]> {\n const userId = this.requireUserId();\n const data = await this.http.request<ItemsResponse>(`/Users/${userId}/Views`);\n const videoTypes = new Set(['movies', 'tvshows', 'homevideos', 'videos', 'musicvideos']);\n return (data.Items || []).filter(\n (item) => typeof item.CollectionType === 'string' && videoTypes.has(item.CollectionType)\n );\n }\n\n /**\n * Get music albums.\n */\n async getAlbums(options: GetAlbumsOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n parentId,\n artistId,\n sortBy = 'SortName',\n sortOrder = 'Ascending'\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'MusicAlbum',\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BasicSyncInfo,AlbumArtists,ArtistItems,DateCreated,DateLastMediaAdded,UserData'\n };\n\n if (parentId) params.ParentId = parentId;\n if (artistId) params.ArtistIds = artistId;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Get music artists.\n */\n async getArtists(options: GetArtistsOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n sortBy = 'SortName',\n sortOrder = 'Ascending'\n } = options;\n\n return await this.http.request<ItemsResponse>('/Artists', {\n params: {\n UserId: userId,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: 'PrimaryImageTag,ImageTags,DateCreated,UserData'\n }\n });\n }\n\n /**\n * Get audio songs/tracks.\n */\n async getSongs(options: GetSongsOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 100,\n startIndex = 0,\n albumId,\n artistId,\n isFavorite,\n sortBy = 'ParentIndexNumber,IndexNumber,SortName',\n sortOrder = 'Ascending'\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'Audio',\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n\n if (albumId) params.ParentId = albumId;\n if (artistId) params.ArtistIds = artistId;\n if (isFavorite) params.Filters = 'IsFavorite';\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Get favorite songs/tracks for the current user.\n */\n async getFavoriteSongs(options: Omit<GetSongsOptions, 'isFavorite'> = {}): Promise<ItemsResponse> {\n return await this.getSongs({\n ...options,\n isFavorite: true,\n limit: options.limit || 1000,\n sortBy: options.sortBy || 'SortName'\n });\n }\n\n /**\n * Get movies for the current user.\n */\n async getMovies(options: GetMoviesOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n parentId,\n isFavorite,\n sortBy = 'SortName',\n sortOrder = 'Ascending',\n genres,\n years,\n searchTerm\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'Movie',\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n\n if (parentId) params.ParentId = parentId;\n if (isFavorite) params.Filters = 'IsFavorite';\n if (genres && genres.length > 0) params.Genres = genres.join('|');\n if (years && years.length > 0) params.Years = years.join(',');\n if (searchTerm) params.SearchTerm = searchTerm;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Get TV series for the current user.\n */\n async getSeries(options: GetSeriesOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n parentId,\n isFavorite,\n sortBy = 'SortName',\n sortOrder = 'Ascending',\n genres,\n years,\n searchTerm\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'Series',\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n\n if (parentId) params.ParentId = parentId;\n if (isFavorite) params.Filters = 'IsFavorite';\n if (genres && genres.length > 0) params.Genres = genres.join('|');\n if (years && years.length > 0) params.Years = years.join(',');\n if (searchTerm) params.SearchTerm = searchTerm;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Get seasons for a given TV series.\n */\n async getSeasons(seriesId: string, options: GetSeasonsOptions = {}): Promise<ItemsResponse> {\n const userId = options.userId || this.requireUserId();\n const params: Record<string, unknown> = {\n UserId: userId,\n Fields: options.fields || COMMON_ITEM_FIELDS\n };\n if (options.isSpecialSeason !== undefined) {\n params.IsSpecialSeason = options.isSpecialSeason;\n }\n\n return await this.http.request<ItemsResponse>(`/Shows/${seriesId}/Seasons`, { params });\n }\n\n /**\n * Get episodes for a TV series or specific season.\n */\n async getEpisodes(seriesId?: string, seasonId?: string, options: GetEpisodesOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n seasonNumber,\n startIndex = 0,\n limit = 100,\n isMissing,\n sortBy = 'IndexNumber,SortName',\n sortOrder = 'Ascending'\n } = options;\n\n if (seriesId) {\n const params: Record<string, unknown> = {\n UserId: userId,\n StartIndex: startIndex,\n Limit: limit,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n if (seasonId) params.SeasonId = seasonId;\n if (seasonNumber !== undefined) params.Season = seasonNumber;\n if (isMissing !== undefined) params.IsMissing = isMissing;\n\n return await this.http.request<ItemsResponse>(`/Shows/${seriesId}/Episodes`, { params });\n }\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'Episode',\n Recursive: true,\n StartIndex: startIndex,\n Limit: limit,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n if (seasonId) params.ParentId = seasonId;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * General query for video items (movies, episodes, videos).\n */\n async getVideos(options: GetVideosOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n parentId,\n includeItemTypes = 'Movie,Episode,Video',\n sortBy = 'SortName',\n sortOrder = 'Ascending'\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: includeItemTypes,\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n if (parentId) params.ParentId = parentId;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Request media playback information for an item (sources, streams, play session).\n */\n async getPlaybackInfo(itemId: string, options: PlaybackInfoOptions = {}): Promise<PlaybackInfoResponse> {\n if (!itemId) {\n throw new JellyfinError('itemId is required for getPlaybackInfo');\n }\n const userId = options.userId || this.requireUserId();\n const payload: Record<string, unknown> = {\n UserId: userId\n };\n\n if (options.startTimeTicks !== undefined) payload.StartTimeTicks = options.startTimeTicks;\n if (options.audioStreamIndex !== undefined) payload.AudioStreamIndex = options.audioStreamIndex;\n if (options.subtitleStreamIndex !== undefined) payload.SubtitleStreamIndex = options.subtitleStreamIndex;\n if (options.maxStreamingBitrate !== undefined) payload.MaxStreamingBitrate = options.maxStreamingBitrate;\n if (options.mediaSourceId !== undefined) payload.MediaSourceId = options.mediaSourceId;\n if (options.deviceProfile !== undefined) payload.DeviceProfile = options.deviceProfile;\n if (options.autoOpenLiveStream !== undefined) payload.AutoOpenLiveStream = options.autoOpenLiveStream;\n\n return await this.http.request<PlaybackInfoResponse>(`/Items/${itemId}/PlaybackInfo`, {\n method: 'POST',\n body: payload\n });\n }\n\n /**\n * Get single item details by its Jellyfin ID.\n */\n async getItem(itemId: string): Promise<BaseItemDto | null> {\n if (!itemId) return null;\n const userId = this.requireUserId();\n return await this.http.request<BaseItemDto>(`/Users/${userId}/Items/${itemId}`, {\n params: {\n Fields: COMMON_ITEM_FIELDS\n }\n });\n }\n\n /**\n * Search Jellyfin library for songs, albums, artists, playlists, movies, or series.\n */\n async search(query: string, options: SearchOptions = {}): Promise<ItemsResponse> {\n if (!query || !query.trim()) {\n return { Items: [], TotalRecordCount: 0 };\n }\n\n const userId = options.userId || this.requireUserId();\n const {\n limit = 30,\n startIndex = 0,\n parentId,\n includeItemTypes = 'Audio,MusicAlbum,MusicArtist,Playlist,Movie,Series,Episode',\n mediaTypes,\n genres,\n years,\n isFavorite,\n sortBy,\n sortOrder,\n fields = COMMON_ITEM_FIELDS,\n recursive = true\n } = options;\n\n const params: Record<string, unknown> = {\n SearchTerm: query.trim(),\n Limit: limit,\n StartIndex: startIndex,\n Recursive: recursive,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n\n if (includeItemTypes) {\n params.IncludeItemTypes = Array.isArray(includeItemTypes)\n ? includeItemTypes.join(',')\n : includeItemTypes;\n }\n\n if (mediaTypes) {\n params.MediaTypes = Array.isArray(mediaTypes)\n ? mediaTypes.join(',')\n : mediaTypes;\n }\n\n if (genres && genres.length > 0) params.Genres = genres.join('|');\n if (years && years.length > 0) params.Years = years.join(',');\n if (isFavorite) params.Filters = 'IsFavorite';\n if (sortBy) params.SortBy = sortBy;\n if (sortOrder) params.SortOrder = sortOrder;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n}\n","import type { HttpTransport } from './http.js';\nimport type { BaseItemDto, CreatePlaylistOptions, ItemsResponse, UpdatePlaylistOptions } from './types.js';\nimport { JellyfinApiError, JellyfinError } from './errors.js';\n\nexport class PlaylistsModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private requireUserId(): string {\n const userId = this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for playlist operations.');\n }\n return userId;\n }\n\n /**\n * Get all playlists for the current user.\n */\n async getPlaylists(): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, {\n params: {\n IncludeItemTypes: 'Playlist',\n Recursive: true,\n Fields: 'PrimaryImageTag,ImageTags,DateCreated,DateLastMediaAdded,UserData'\n }\n });\n }\n\n /**\n * Get items belonging to a specific playlist.\n */\n async getPlaylistItems(playlistId: string): Promise<ItemsResponse> {\n if (!playlistId) {\n throw new JellyfinError('Playlist ID is required.');\n }\n const userId = this.requireUserId();\n return await this.http.request<ItemsResponse>(`/Playlists/${playlistId}/Items`, {\n params: {\n UserId: userId,\n Fields: 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,HasLyrics,UserData'\n }\n });\n }\n\n /**\n * Create a new playlist.\n * Jellyfin 12 requires a JSON request body with CreatePlaylistDto.\n * Falls back to legacy query parameters if server returns 400/415.\n */\n async createPlaylist(options: CreatePlaylistOptions): Promise<string> {\n const userId = options.userId || this.requireUserId();\n const { name, isPublic = false, trackIds = [], mediaType = 'Audio' } = options;\n\n if (!name || !name.trim()) {\n throw new JellyfinError('Playlist name is required.');\n }\n\n const idsArray = Array.isArray(trackIds) ? trackIds : [trackIds].filter(Boolean);\n let playlistId: string | undefined;\n\n try {\n // Modern Jellyfin 12+ API: JSON body (CreatePlaylistDto)\n const resData = await this.http.request<{ Id: string }>('/Playlists', {\n method: 'POST',\n body: {\n Name: name.trim(),\n Ids: idsArray,\n UserId: userId,\n MediaType: mediaType\n }\n });\n playlistId = resData?.Id;\n } catch (err) {\n // Graceful fallback for older Jellyfin servers (<10.8) expecting query params\n if (err instanceof JellyfinApiError && (err.status === 400 || err.status === 415)) {\n const idsStr = idsArray.join(',');\n const resData = await this.http.request<{ Id: string }>('/Playlists', {\n method: 'POST',\n params: {\n Name: name.trim(),\n UserId: userId,\n MediaType: mediaType,\n ...(idsStr ? { Ids: idsStr } : {})\n }\n });\n playlistId = resData?.Id;\n } else {\n throw err;\n }\n }\n\n if (playlistId && isPublic) {\n try {\n // Jellyfin 12 uses user permissions endpoint\n await this.http.request(`/Playlists/${playlistId}/Users/${userId}`, {\n method: 'POST',\n body: { UserId: userId, CanEdit: true }\n });\n } catch {\n // Fallback for legacy Jellyfin servers\n try {\n await this.http.request(`/Playlists/${playlistId}`, {\n method: 'POST',\n body: { IsPublic: true }\n });\n } catch (err) {\n console.warn('[Jellyfin SDK] Failed to update public status for playlist:', err);\n }\n }\n }\n\n return playlistId || '';\n }\n\n /**\n * Update playlist metadata (e.g. name).\n * Jellyfin 12 removed POST /Playlists/{id}; item updates use POST /Items/{id},\n * which is also supported across older Jellyfin versions.\n */\n async updatePlaylist(playlistId: string, options: UpdatePlaylistOptions): Promise<void> {\n if (!playlistId) {\n throw new JellyfinError('Playlist ID is required.');\n }\n\n const body: Record<string, unknown> = { Id: playlistId };\n if (options.name) body.Name = options.name;\n\n try {\n await this.http.request(`/Items/${playlistId}`, {\n method: 'POST',\n body\n });\n } catch (err) {\n // Fallback for legacy servers that only support POST /Playlists/{playlistId}\n await this.http.request(`/Playlists/${playlistId}`, {\n method: 'POST',\n body: options.name ? { Name: options.name } : {}\n });\n }\n }\n\n /**\n * Upload custom cover image for a playlist.\n */\n async uploadPlaylistImage(playlistId: string, base64ImageString: string, mimeType: string = 'image/jpeg'): Promise<void> {\n if (!playlistId || !base64ImageString) {\n throw new JellyfinError('Playlist ID and image data are required.');\n }\n\n const base64Data = base64ImageString.includes(',') ? base64ImageString.split(',')[1] : base64ImageString;\n\n await this.http.request(`/Items/${playlistId}/Images/Primary`, {\n method: 'POST',\n contentType: mimeType,\n body: base64Data\n });\n }\n\n /**\n * Delete a playlist.\n */\n async deletePlaylist(playlistId: string): Promise<void> {\n if (!playlistId) {\n throw new JellyfinError('Playlist ID is required.');\n }\n await this.http.request(`/Items/${playlistId}`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Add tracks to an existing playlist.\n */\n async addTracks(playlistId: string, trackIds: string | string[]): Promise<void> {\n if (!playlistId || !trackIds) return;\n const userId = this.requireUserId();\n\n const idsStr = Array.isArray(trackIds) ? trackIds.join(',') : trackIds;\n if (!idsStr) return;\n\n await this.http.request(`/Playlists/${playlistId}/Items`, {\n method: 'POST',\n params: {\n Ids: idsStr,\n UserId: userId\n }\n });\n }\n\n /**\n * Remove a track from a playlist by playlist entry ID or track ID.\n */\n async removeTrack(playlistId: string, entryIdOrTrackId: string): Promise<void> {\n if (!playlistId || !entryIdOrTrackId) return;\n\n try {\n await this.http.request(`/Playlists/${playlistId}/Items`, {\n method: 'DELETE',\n params: { EntryIds: entryIdOrTrackId }\n });\n } catch {\n // Fallback for older Jellyfin servers using ItemIds\n await this.http.request(`/Playlists/${playlistId}/Items`, {\n method: 'DELETE',\n params: { ItemIds: entryIdOrTrackId }\n });\n }\n }\n\n /**\n * Remove a specific playlist item by its unique entry ID (PlaylistItemId).\n * Especially recommended on Jellyfin 12+ when playlists contain duplicate tracks.\n */\n async removePlaylistItem(playlistId: string, playlistItemId: string): Promise<void> {\n return this.removeTrack(playlistId, playlistItemId);\n }\n}\n\n","import type { HttpTransport } from './http.js';\n\nexport class PlaybackModule {\n private http: HttpTransport;\n\n constructor(http: HttpTransport) {\n this.http = http;\n }\n\n /**\n * Report to the Jellyfin server that playback has started for an item.\n */\n async reportStart(itemId: string, positionTicks: number = 0): Promise<void> {\n if (!itemId || !this.http.getToken()) return;\n try {\n await this.http.request('/Sessions/Playing', {\n method: 'POST',\n body: {\n ItemId: itemId,\n PositionTicks: positionTicks,\n CanSeek: true,\n IsPaused: false\n }\n });\n } catch (e) {\n console.warn('[Jellyfin SDK] Start playback report error:', e);\n }\n }\n\n /**\n * Report current playback progress to the Jellyfin server.\n */\n async reportProgress(itemId: string, positionTicks: number = 0, isPaused: boolean = false): Promise<void> {\n if (!itemId || !this.http.getToken()) return;\n try {\n await this.http.request('/Sessions/Playing/Progress', {\n method: 'POST',\n body: {\n ItemId: itemId,\n PositionTicks: positionTicks,\n CanSeek: true,\n IsPaused: isPaused\n }\n });\n } catch (e) {\n console.warn('[Jellyfin SDK] Progress playback report error:', e);\n }\n }\n\n /**\n * Report that playback has stopped for an item.\n * Optionally teardown active transcoding session if playSessionId is provided.\n */\n async reportStopped(\n itemId: string,\n positionTicks: number = 0,\n options?: { playSessionId?: string }\n ): Promise<void> {\n if (!itemId || !this.http.getToken()) return;\n try {\n await this.http.request('/Sessions/Playing/Stopped', {\n method: 'POST',\n body: {\n ItemId: itemId,\n PositionTicks: positionTicks\n }\n });\n\n if (options?.playSessionId) {\n const deviceId = this.http.getClientInfo()?.deviceId;\n if (deviceId) {\n await this.http.request('/Videos/ActiveEncodings', {\n method: 'DELETE',\n params: {\n DeviceId: deviceId,\n PlaySessionId: options.playSessionId\n }\n }).catch((err) => {\n console.warn('[Jellyfin SDK] Teardown active encoding error:', err);\n });\n }\n }\n } catch (e) {\n console.warn('[Jellyfin SDK] Stop playback report error:', e);\n }\n }\n}\n\n","export type VideoQualityPresetKey =\n | 'auto'\n | 'direct'\n | '4k'\n | '1080p-high'\n | '1080p'\n | '720p-high'\n | '720p'\n | '480p'\n | '360p'\n | '240p';\n\nexport interface VideoQualityOption {\n key: VideoQualityPresetKey;\n label: string;\n bitrate?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type AudioQualityPresetKey =\n | 'direct'\n | '320k'\n | '256k'\n | '192k'\n | '128k'\n | '64k';\n\nexport interface AudioQualityOption {\n key: AudioQualityPresetKey;\n label: string;\n bitrate?: number;\n}\n\nexport const VIDEO_QUALITY_PRESETS: Record<VideoQualityPresetKey, VideoQualityOption> = {\n direct: { key: 'direct', label: 'Original (Direct)' },\n auto: { key: 'auto', label: 'Auto' },\n '4k': { key: '4k', label: '4K Ultra HD (60 Mbps)', bitrate: 60_000_000, maxWidth: 3840, maxHeight: 2160 },\n '1080p-high': { key: '1080p-high', label: '1080p High (20 Mbps)', bitrate: 20_000_000, maxWidth: 1920, maxHeight: 1080 },\n '1080p': { key: '1080p', label: '1080p (10 Mbps)', bitrate: 10_000_000, maxWidth: 1920, maxHeight: 1080 },\n '720p-high': { key: '720p-high', label: '720p High (6 Mbps)', bitrate: 6_000_000, maxWidth: 1280, maxHeight: 720 },\n '720p': { key: '720p', label: '720p (4 Mbps)', bitrate: 4_000_000, maxWidth: 1280, maxHeight: 720 },\n '480p': { key: '480p', label: '480p (2 Mbps)', bitrate: 2_000_000, maxWidth: 854, maxHeight: 480 },\n '360p': { key: '360p', label: '360p (1 Mbps)', bitrate: 1_000_000, maxWidth: 640, maxHeight: 360 },\n '240p': { key: '240p', label: '240p (420 kbps)', bitrate: 420_000, maxWidth: 426, maxHeight: 240 }\n};\n\nexport const AUDIO_QUALITY_PRESETS: Record<AudioQualityPresetKey, AudioQualityOption> = {\n direct: { key: 'direct', label: 'Original (Direct)' },\n '320k': { key: '320k', label: '320 kbps', bitrate: 320_000 },\n '256k': { key: '256k', label: '256 kbps', bitrate: 256_000 },\n '192k': { key: '192k', label: '192 kbps', bitrate: 192_000 },\n '128k': { key: '128k', label: '128 kbps', bitrate: 128_000 },\n '64k': { key: '64k', label: '64 kbps', bitrate: 64_000 }\n};\n\n/**\n * Returns a list of all available video quality presets.\n */\nexport function getVideoQualityList(): VideoQualityOption[] {\n return Object.values(VIDEO_QUALITY_PRESETS);\n}\n\n/**\n * Returns a list of all available audio quality presets.\n */\nexport function getAudioQualityList(): AudioQualityOption[] {\n return Object.values(AUDIO_QUALITY_PRESETS);\n}\n\n/**\n * Resolves video quality option into bitrate, maxWidth, and maxHeight constraints.\n */\nexport function resolveVideoQuality(\n quality?: VideoQualityPresetKey | VideoQualityOption | number | string\n): { maxStreamingBitrate?: number; maxWidth?: number; maxHeight?: number } {\n if (!quality) return {};\n\n if (typeof quality === 'number') {\n return { maxStreamingBitrate: quality };\n }\n\n if (typeof quality === 'string') {\n const key = quality.toLowerCase() as VideoQualityPresetKey;\n if (VIDEO_QUALITY_PRESETS[key]) {\n const preset = VIDEO_QUALITY_PRESETS[key];\n return {\n maxStreamingBitrate: preset.bitrate,\n maxWidth: preset.maxWidth,\n maxHeight: preset.maxHeight\n };\n }\n const parsed = parseInt(quality, 10);\n if (!Number.isNaN(parsed)) {\n return { maxStreamingBitrate: parsed };\n }\n return {};\n }\n\n if (typeof quality === 'object') {\n return {\n maxStreamingBitrate: quality.bitrate,\n maxWidth: quality.maxWidth,\n maxHeight: quality.maxHeight\n };\n }\n\n return {};\n}\n\n/**\n * Resolves audio quality option into bitrate constraint.\n */\nexport function resolveAudioQuality(\n quality?: AudioQualityPresetKey | AudioQualityOption | number | string\n): { maxStreamingBitrate?: number } {\n if (!quality) return {};\n\n if (typeof quality === 'number') {\n return { maxStreamingBitrate: quality };\n }\n\n if (typeof quality === 'string') {\n const key = quality.toLowerCase() as AudioQualityPresetKey;\n if (AUDIO_QUALITY_PRESETS[key]) {\n return { maxStreamingBitrate: AUDIO_QUALITY_PRESETS[key].bitrate };\n }\n const parsed = parseInt(quality, 10);\n if (!Number.isNaN(parsed)) {\n return { maxStreamingBitrate: parsed };\n }\n return {};\n }\n\n if (typeof quality === 'object' && quality.bitrate) {\n return { maxStreamingBitrate: quality.bitrate };\n }\n\n return {};\n}\n\n/**\n * Formats a bitrate in bps into a human-readable string (e.g. \"10 Mbps\", \"320 kbps\").\n */\nexport function formatBitrate(bitrate?: number): string {\n if (!bitrate || bitrate <= 0) return 'Direct';\n if (bitrate >= 1_000_000) {\n const mbps = bitrate / 1_000_000;\n return `${Number.isInteger(mbps) ? mbps : mbps.toFixed(1)} Mbps`;\n }\n const kbps = Math.round(bitrate / 1000);\n return `${kbps} kbps`;\n}\n\n","import type { HttpTransport } from './http.js';\nimport type {\n ArtworkUrlOptions,\n AudioHlsStreamOptions,\n AudioStreamOptions,\n BaseItemDto,\n DownloadUrlOptions,\n MediaSourceInfo,\n MediaStreamInfo,\n SubtitleTrackInfo,\n SubtitleUrlOptions,\n VideoHlsStreamOptions,\n VideoStreamOptions\n} from './types.js';\nimport { resolveAudioQuality, resolveVideoQuality } from './quality.js';\n\nexport class MediaModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n /**\n * Constructs the URL for an item's image/artwork.\n * If the item lacks images or server is not set, returns options.fallbackUrl or null.\n */\n getArtworkUrl(itemOrId: BaseItemDto | string | null | undefined, options: ArtworkUrlOptions = {}): string | null {\n const serverUrl = this.http.getServerUrl();\n const {\n imageType = 'Primary',\n maxWidth = 400,\n maxHeight,\n quality = 90,\n fallbackUrl = null\n } = options;\n\n if (!serverUrl || !itemOrId) return fallbackUrl;\n\n if (typeof itemOrId === 'object') {\n const item = itemOrId;\n let targetId: string | null = null;\n let tag: string | null = null;\n\n if (item.ImageTags && item.ImageTags[imageType]) {\n targetId = item.Id;\n tag = item.ImageTags[imageType];\n } else if (imageType === 'Primary' && item.PrimaryImageTag) {\n targetId = item.Id;\n tag = item.PrimaryImageTag;\n } else if (imageType === 'Primary' && item.AlbumPrimaryImageTag && item.AlbumId) {\n targetId = item.AlbumId;\n tag = item.AlbumPrimaryImageTag;\n }\n\n if (!targetId || !tag) {\n return fallbackUrl;\n }\n\n const params = new URLSearchParams({\n maxWidth: String(maxWidth),\n quality: String(quality),\n tag\n });\n if (maxHeight) params.append('maxHeight', String(maxHeight));\n\n return `${serverUrl}/Items/${targetId}/Images/${imageType}?${params.toString()}`;\n }\n\n if (typeof itemOrId === 'string' && itemOrId.trim() !== '') {\n const params = new URLSearchParams({\n maxWidth: String(maxWidth),\n quality: String(quality)\n });\n if (maxHeight) params.append('maxHeight', String(maxHeight));\n\n return `${serverUrl}/Items/${itemOrId}/Images/${imageType}?${params.toString()}`;\n }\n\n return fallbackUrl;\n }\n\n /**\n * Constructs the audio stream URL using Jellyfin's universal audio endpoint.\n * Transparently negotiates codecs (direct play or transcode to MP3/AAC as needed).\n */\n getAudioStreamUrl(itemId: string, options: AudioStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const userId = this.getUserId();\n const clientInfo = this.http.getClientInfo();\n\n if (!serverUrl || !itemId) return '';\n\n const qualityResolved = resolveAudioQuality(options.quality);\n const maxStreamingBitrate = options.maxStreamingBitrate ?? qualityResolved.maxStreamingBitrate;\n\n const {\n startTimeTicks = 0,\n container = 'opus,mp3|mp3,aac,m4a,m4b,flac,wav,ogg',\n transcodingContainer = 'mp3',\n audioCodec = 'mp3',\n useQueryToken = true\n } = options;\n\n const url = new URL(`${serverUrl}/Audio/${itemId}/universal`);\n if (token && useQueryToken) url.searchParams.append('api_key', token);\n if (userId) url.searchParams.append('UserId', userId);\n if (clientInfo.deviceId) url.searchParams.append('DeviceId', clientInfo.deviceId);\n\n url.searchParams.append('Container', container);\n url.searchParams.append('TranscodingContainer', transcodingContainer);\n url.searchParams.append('TranscodingProtocol', 'http');\n url.searchParams.append('AudioCodec', audioCodec);\n\n if (maxStreamingBitrate && maxStreamingBitrate !== 'Direct') {\n url.searchParams.append('MaxStreamingBitrate', String(maxStreamingBitrate));\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n url.searchParams.append('EnableRedirection', 'true');\n url.searchParams.append('EnableRemoteMedia', 'false');\n\n return url.toString();\n }\n\n /**\n * Constructs the HLS master playlist URL for an audio stream.\n */\n getAudioHlsStreamUrl(itemId: string, options: AudioHlsStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const userId = this.getUserId();\n const clientInfo = this.http.getClientInfo();\n\n if (!serverUrl || !itemId) return '';\n\n const qualityResolved = resolveAudioQuality(options.quality);\n const maxStreamingBitrate = options.maxStreamingBitrate ?? qualityResolved.maxStreamingBitrate;\n\n const {\n startTimeTicks = 0,\n audioCodec = 'aac,mp3',\n segmentLength = 3,\n useQueryToken = true\n } = options;\n\n const url = new URL(`${serverUrl}/Audio/${itemId}/master.m3u8`);\n if (token && useQueryToken) url.searchParams.append('api_key', token);\n if (userId) url.searchParams.append('UserId', userId);\n if (clientInfo.deviceId) url.searchParams.append('DeviceId', clientInfo.deviceId);\n\n url.searchParams.append('MediaSourceId', itemId);\n url.searchParams.append('AudioCodec', audioCodec);\n url.searchParams.append('TranscodingContainer', 'ts');\n url.searchParams.append('TranscodingProtocol', 'hls');\n url.searchParams.append('SegmentLength', String(segmentLength));\n url.searchParams.append('MinSegments', '2');\n\n if (maxStreamingBitrate && maxStreamingBitrate !== 'Direct') {\n url.searchParams.append('MaxStreamingBitrate', String(maxStreamingBitrate));\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n return url.toString();\n }\n\n /**\n * Constructs the progressive/universal video stream URL.\n * Supports direct play (static=true) or on-the-fly transcoding with quality, audio, and subtitle options.\n */\n getVideoStreamUrl(itemId: string, options: VideoStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const userId = this.getUserId();\n const clientInfo = this.http.getClientInfo();\n\n if (!serverUrl || !itemId) return '';\n\n const qualityResolved = resolveVideoQuality(options.quality);\n const maxStreamingBitrate = options.maxStreamingBitrate ?? qualityResolved.maxStreamingBitrate;\n const maxWidth = options.maxWidth ?? qualityResolved.maxWidth;\n const maxHeight = options.maxHeight ?? qualityResolved.maxHeight;\n\n const {\n mediaSourceId = itemId,\n static: isStatic = false,\n videoCodec = 'h264,hevc,vp9,av1',\n audioCodec = 'aac,mp3,opus,flac',\n maxFramerate,\n audioStreamIndex,\n subtitleStreamIndex,\n subtitleMethod,\n startTimeTicks = 0,\n container,\n transcodingContainer = 'ts',\n transcodingProtocol = 'http',\n useQueryToken = true\n } = options;\n\n const endpoint = container && !container.includes(',')\n ? `/Videos/${itemId}/stream.${container}`\n : `/Videos/${itemId}/stream`;\n\n const url = new URL(`${serverUrl}${endpoint}`);\n if (token && useQueryToken) url.searchParams.append('api_key', token);\n if (userId) url.searchParams.append('UserId', userId);\n if (clientInfo.deviceId) url.searchParams.append('DeviceId', clientInfo.deviceId);\n if (mediaSourceId) url.searchParams.append('MediaSourceId', mediaSourceId);\n\n if (isStatic) {\n url.searchParams.append('Static', 'true');\n } else {\n url.searchParams.append('VideoCodec', videoCodec);\n url.searchParams.append('AudioCodec', audioCodec);\n url.searchParams.append('TranscodingContainer', transcodingContainer);\n url.searchParams.append('TranscodingProtocol', transcodingProtocol);\n\n if (maxStreamingBitrate && maxStreamingBitrate !== 'Direct') {\n url.searchParams.append('MaxStreamingBitrate', String(maxStreamingBitrate));\n }\n if (maxWidth) url.searchParams.append('MaxWidth', String(maxWidth));\n if (maxHeight) url.searchParams.append('MaxHeight', String(maxHeight));\n if (maxFramerate) url.searchParams.append('MaxFramerate', String(maxFramerate));\n }\n\n if (audioStreamIndex !== undefined && audioStreamIndex !== null) {\n url.searchParams.append('AudioStreamIndex', String(audioStreamIndex));\n }\n if (subtitleStreamIndex !== undefined && subtitleStreamIndex !== null) {\n url.searchParams.append('SubtitleStreamIndex', String(subtitleStreamIndex));\n if (subtitleMethod) url.searchParams.append('SubtitleMethod', subtitleMethod);\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n url.searchParams.append('EnableRedirection', 'true');\n url.searchParams.append('EnableRemoteMedia', 'false');\n\n return url.toString();\n }\n\n /**\n * Constructs the HLS master playlist URL for an adaptive video stream.\n */\n getVideoHlsStreamUrl(itemId: string, options: VideoHlsStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const userId = this.getUserId();\n const clientInfo = this.http.getClientInfo();\n\n if (!serverUrl || !itemId) return '';\n\n const qualityResolved = resolveVideoQuality(options.quality);\n const maxStreamingBitrate = options.maxStreamingBitrate ?? qualityResolved.maxStreamingBitrate;\n const maxWidth = options.maxWidth ?? qualityResolved.maxWidth;\n const maxHeight = options.maxHeight ?? qualityResolved.maxHeight;\n\n const {\n mediaSourceId = itemId,\n videoCodec = 'h264,hevc,vp9,av1',\n audioCodec = 'aac,mp3,opus',\n maxFramerate,\n segmentLength = 3,\n minSegments = 2,\n audioStreamIndex,\n subtitleStreamIndex,\n subtitleMethod,\n transcodingContainer = 'ts',\n transcodingProtocol = 'hls',\n startTimeTicks = 0,\n useQueryToken = true\n } = options;\n\n const url = new URL(`${serverUrl}/Videos/${itemId}/master.m3u8`);\n if (token && useQueryToken) url.searchParams.append('api_key', token);\n if (userId) url.searchParams.append('UserId', userId);\n if (clientInfo.deviceId) url.searchParams.append('DeviceId', clientInfo.deviceId);\n if (mediaSourceId) url.searchParams.append('MediaSourceId', mediaSourceId);\n\n url.searchParams.append('VideoCodec', videoCodec);\n url.searchParams.append('AudioCodec', audioCodec);\n url.searchParams.append('TranscodingContainer', transcodingContainer);\n url.searchParams.append('TranscodingProtocol', transcodingProtocol);\n url.searchParams.append('SegmentLength', String(segmentLength));\n url.searchParams.append('MinSegments', String(minSegments));\n\n if (maxStreamingBitrate && maxStreamingBitrate !== 'Direct') {\n url.searchParams.append('MaxStreamingBitrate', String(maxStreamingBitrate));\n }\n if (maxWidth) url.searchParams.append('MaxWidth', String(maxWidth));\n if (maxHeight) url.searchParams.append('MaxHeight', String(maxHeight));\n if (maxFramerate) url.searchParams.append('MaxFramerate', String(maxFramerate));\n\n if (audioStreamIndex !== undefined && audioStreamIndex !== null) {\n url.searchParams.append('AudioStreamIndex', String(audioStreamIndex));\n }\n if (subtitleStreamIndex !== undefined && subtitleStreamIndex !== null) {\n url.searchParams.append('SubtitleStreamIndex', String(subtitleStreamIndex));\n if (subtitleMethod) url.searchParams.append('SubtitleMethod', subtitleMethod);\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n return url.toString();\n }\n\n /**\n * Constructs the URL for streaming a specific subtitle track.\n */\n getSubtitleUrl(\n itemId: string,\n mediaSourceId: string,\n subtitleStreamIndex: number,\n options: SubtitleUrlOptions = {}\n ): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const { format = 'vtt', useQueryToken = true, startTimeTicks = 0 } = options;\n\n if (!serverUrl || !itemId) return '';\n\n const sourceId = mediaSourceId || itemId;\n const url = new URL(`${serverUrl}/Videos/${itemId}/${sourceId}/Subtitles/${subtitleStreamIndex}/Stream.${format}`);\n if (token && useQueryToken) {\n url.searchParams.append('api_key', token);\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n return url.toString();\n }\n\n /**\n * Fetches subtitle content as raw text (e.g. WebVTT or SRT format).\n */\n async getSubtitles(\n itemId: string,\n mediaSourceId: string,\n subtitleStreamIndex: number,\n options: SubtitleUrlOptions = {}\n ): Promise<string> {\n const { format = 'vtt', startTimeTicks = 0 } = options;\n const sourceId = mediaSourceId || itemId;\n const params: Record<string, unknown> = {};\n if (startTimeTicks > 0) {\n params.StartTimeTicks = startTimeTicks;\n }\n\n return await this.http.requestText(\n `/Videos/${itemId}/${sourceId}/Subtitles/${subtitleStreamIndex}/Stream.${format}`,\n { params }\n );\n }\n\n /**\n * Extracts and normalizes subtitle streams from an item or media source into SubtitleTrackInfo objects with URLs.\n */\n getSubtitleTracks(itemOrMediaSource: BaseItemDto | MediaSourceInfo): SubtitleTrackInfo[] {\n if (!itemOrMediaSource) return [];\n\n let streams: MediaStreamInfo[] = [];\n let itemId = '';\n let mediaSourceId = '';\n\n if ('MediaSources' in itemOrMediaSource && Array.isArray(itemOrMediaSource.MediaSources)) {\n itemId = itemOrMediaSource.Id;\n const primarySource = itemOrMediaSource.MediaSources[0];\n if (primarySource) {\n mediaSourceId = primarySource.Id || itemId;\n streams = primarySource.MediaStreams || [];\n }\n } else if ('MediaStreams' in itemOrMediaSource && Array.isArray(itemOrMediaSource.MediaStreams)) {\n const source = itemOrMediaSource as MediaSourceInfo;\n mediaSourceId = source.Id || '';\n itemId = mediaSourceId;\n streams = source.MediaStreams || [];\n }\n\n return streams\n .filter((s) => s.Type === 'Subtitle')\n .map((s) => {\n const index = s.Index ?? 0;\n const codec = (s.Codec || 'vtt').toLowerCase();\n const preferredFormat = codec === 'subrip' || codec === 'srt' ? 'srt' : 'vtt';\n const url = itemId ? this.getSubtitleUrl(itemId, mediaSourceId, index, { format: preferredFormat }) : '';\n\n return {\n index,\n codec: s.Codec || 'vtt',\n language: s.Language,\n displayTitle: s.DisplayTitle || s.Language || `Subtitle ${index}`,\n displayLanguage: s.DisplayLanguage,\n isDefault: !!s.IsDefault,\n isForced: !!s.IsForced,\n isExternal: !!s.IsExternal,\n deliveryMethod: s.DeliveryMethod,\n deliveryUrl: s.DeliveryUrl,\n url\n };\n });\n }\n\n /**\n * Constructs the direct download URL for an original, unmodified media file on the Jellyfin server.\n */\n getDownloadUrl(itemId: string, options: DownloadUrlOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const { useQueryToken = true, filename } = options;\n\n if (!serverUrl || !itemId) return '';\n\n const url = new URL(`${serverUrl}/Items/${itemId}/Download`);\n if (token && useQueryToken) {\n url.searchParams.append('api_key', token);\n }\n if (filename) {\n url.searchParams.append('filename', filename);\n }\n\n return url.toString();\n }\n\n /**\n * Downloads a media file as a Blob with optional progress monitoring.\n */\n async downloadFile(\n itemId: string,\n options: {\n onProgress?: (progressFraction: number) => void;\n useQueryToken?: boolean;\n } = {}\n ): Promise<Blob> {\n const downloadUrl = this.getDownloadUrl(itemId, { useQueryToken: options.useQueryToken });\n if (!downloadUrl) {\n throw new Error('Cannot construct download URL: missing serverUrl or itemId');\n }\n\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n throw new Error(`Download failed with status ${response.status}: ${response.statusText}`);\n }\n\n const contentLength = parseInt(response.headers.get('Content-Length') || '0', 10) || 0;\n const reader = response.body ? response.body.getReader() : null;\n\n if (reader && contentLength > 0) {\n const chunks: BlobPart[] = [];\n let received = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n received += value.length;\n if (options.onProgress) {\n options.onProgress(received / contentLength);\n }\n }\n }\n return new Blob(chunks, { type: response.headers.get('Content-Type') || 'application/octet-stream' });\n }\n\n const blob = await response.blob();\n if (options.onProgress) {\n options.onProgress(1);\n }\n return blob;\n }\n\n /**\n * Returns authentication headers for media streaming requests (e.g., configuring hls.js xhrSetup).\n * Crucial for Jellyfin 12+ servers where query-based auth (?api_key=) is disabled.\n */\n getStreamHeaders(): Record<string, string> {\n const authHeader = this.http.getAuthHeader();\n return {\n Authorization: authHeader,\n 'X-Emby-Authorization': authHeader\n };\n }\n}\n","import type { HttpTransport } from './http.js';\nimport type { LyricsDto } from './types.js';\n\nexport class LyricsModule {\n private http: HttpTransport;\n\n constructor(http: HttpTransport) {\n this.http = http;\n }\n\n /**\n * Fetch synced or unsynced lyrics for an audio item.\n */\n async getLyrics(itemId: string): Promise<LyricsDto | null> {\n if (!itemId) return null;\n try {\n return await this.http.request<LyricsDto>(`/Audio/${itemId}/Lyrics`);\n } catch (err) {\n console.warn('[Jellyfin SDK] Failed to fetch lyrics:', err);\n return null;\n }\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport { JellyfinError } from './errors.js';\n\nexport class FavoritesModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private requireUserId(): string {\n const userId = this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required to mark favorites.');\n }\n return userId;\n }\n\n /**\n * Mark an item as favorite.\n */\n async markFavorite(itemId: string): Promise<void> {\n if (!itemId) return;\n const userId = this.requireUserId();\n await this.http.request(`/Users/${userId}/FavoriteItems/${itemId}`, {\n method: 'POST'\n });\n }\n\n /**\n * Unmark an item as favorite.\n */\n async unmarkFavorite(itemId: string): Promise<void> {\n if (!itemId) return;\n const userId = this.requireUserId();\n await this.http.request(`/Users/${userId}/FavoriteItems/${itemId}`, {\n method: 'DELETE'\n });\n }\n}\n\n","import type { BaseItemDto, DownloadItemOptions } from './types.js';\nimport type { MediaModule } from './media.js';\n\nexport interface DownloadRecord {\n id: string;\n name: string;\n mediaType?: 'Audio' | 'Video' | string;\n type?: string;\n artists?: string;\n album?: string;\n albumId?: string;\n seriesName?: string;\n seriesId?: string;\n seasonName?: string;\n seasonId?: string;\n artworkUrl: string | null;\n size: number;\n savedAt: number;\n hasLyrics?: boolean;\n parentId?: string;\n parentName?: string;\n parentType?: string;\n parentArtworkUrl?: string;\n parentOwner?: string;\n parentCount?: number;\n index?: number;\n blob?: Blob;\n mimeType?: string;\n}\n\nexport interface DownloadProgress {\n completed: number;\n total: number;\n item: BaseItemDto;\n track?: BaseItemDto; // For backward compatibility\n res: { ok: boolean; size?: number; removed?: boolean; error?: string };\n}\n\nexport class OfflineStorageManager {\n private media: MediaModule;\n private dbName: string;\n private dbVersion: number;\n private storeName: string;\n private dbPromise: Promise<IDBDatabase | null> | null = null;\n private objectUrlCache = new Map<string, string>();\n private downloadStatusCache = new Map<string, boolean>();\n\n constructor(media: MediaModule, dbName = 'JellyfinOfflineAudio', dbVersion = 1, storeName = 'tracks') {\n this.media = media;\n this.dbName = dbName;\n this.dbVersion = dbVersion;\n this.storeName = storeName;\n }\n\n isSupported(): boolean {\n return typeof window !== 'undefined' && 'indexedDB' in window;\n }\n\n async initDB(): Promise<IDBDatabase | null> {\n if (this.dbPromise) return this.dbPromise;\n\n this.dbPromise = new Promise((resolve) => {\n if (!this.isSupported()) {\n resolve(null);\n return;\n }\n\n const request = indexedDB.open(this.dbName, this.dbVersion);\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName, { keyPath: 'id' });\n }\n };\n\n request.onsuccess = (event) => {\n resolve((event.target as IDBOpenDBRequest).result);\n };\n\n request.onerror = (event) => {\n console.warn('[Jellyfin Offline] IndexedDB open error:', (event.target as IDBOpenDBRequest).error);\n resolve(null);\n };\n });\n\n return this.dbPromise;\n }\n\n private getItemKey(item: BaseItemDto | { id?: string; Id?: string }): string {\n return item ? String(item.Id || item.id || '') : '';\n }\n\n private dispatchDownloadChanged(itemId: string, downloaded: boolean): void {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(\n new CustomEvent('jellyfin-download-changed', {\n detail: { itemId, trackId: itemId, downloaded }\n })\n );\n }\n\n private revokeObjectUrl(id: string): void {\n const url = this.objectUrlCache.get(id);\n if (url) {\n try {\n URL.revokeObjectURL(url);\n } catch {\n // ignore\n }\n this.objectUrlCache.delete(id);\n }\n }\n\n async getDownloadedRecord(id: string): Promise<DownloadRecord | null> {\n if (!id) return null;\n try {\n const db = await this.initDB();\n if (!db) return null;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readonly');\n const store = tx.objectStore(this.storeName);\n const request = store.get(String(id));\n\n request.onsuccess = () => resolve((request.result as DownloadRecord) || null);\n request.onerror = () => resolve(null);\n });\n } catch (err) {\n console.warn(`[Jellyfin Offline] getDownloadedRecord error for ${id}:`, err);\n return null;\n }\n }\n\n async isItemDownloaded(id: string): Promise<boolean> {\n if (!id) return false;\n const key = String(id);\n if (this.downloadStatusCache.has(key)) {\n return this.downloadStatusCache.get(key)!;\n }\n\n const record = await this.getDownloadedRecord(key);\n const exists = !!record;\n this.downloadStatusCache.set(key, exists);\n return exists;\n }\n\n isItemDownloadedSync(id: string): boolean {\n if (!id) return false;\n return this.downloadStatusCache.get(String(id)) === true;\n }\n\n // Backward compatibility aliases\n async isTrackDownloaded(id: string): Promise<boolean> {\n return this.isItemDownloaded(id);\n }\n\n isTrackDownloadedSync(id: string): boolean {\n return this.isItemDownloadedSync(id);\n }\n\n async getDownloadedBlobUrl(id: string): Promise<string | null> {\n if (!id) return null;\n const key = String(id);\n if (this.objectUrlCache.has(key)) return this.objectUrlCache.get(key)!;\n\n const record = await this.getDownloadedRecord(key);\n if (!record || !record.blob) return null;\n\n const url = URL.createObjectURL(record.blob);\n this.objectUrlCache.set(key, url);\n return url;\n }\n\n getDownloadedBlobUrlSync(id: string): string | null {\n if (!id) return null;\n return this.objectUrlCache.get(String(id)) || null;\n }\n\n async getAllDownloads(): Promise<DownloadRecord[]> {\n try {\n const db = await this.initDB();\n if (!db) return [];\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readonly');\n const store = tx.objectStore(this.storeName);\n const request = store.getAll();\n\n request.onsuccess = () => {\n const records = (request.result || []) as DownloadRecord[];\n resolve(records.sort((a, b) => (b.savedAt || 0) - (a.savedAt || 0)));\n };\n request.onerror = () => resolve([]);\n });\n } catch (err) {\n console.warn('[Jellyfin Offline] getAllDownloads error:', err);\n return [];\n }\n }\n\n async warmOfflineCache(): Promise<void> {\n try {\n const downloads = await this.getAllDownloads();\n for (const item of downloads) {\n if (item && item.id) {\n const key = String(item.id);\n this.downloadStatusCache.set(key, true);\n if (item.blob && !this.objectUrlCache.has(key)) {\n try {\n this.objectUrlCache.set(key, URL.createObjectURL(item.blob));\n } catch {\n // ignore\n }\n }\n }\n }\n } catch (err) {\n console.warn('[Jellyfin Offline] warmOfflineCache error:', err);\n }\n }\n\n async saveDownloadRecord(record: DownloadRecord, blob: Blob): Promise<boolean> {\n try {\n const db = await this.initDB();\n if (!db) return false;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const entry = { ...record, blob };\n const request = store.put(entry);\n\n request.onsuccess = () => resolve(true);\n request.onerror = () => resolve(false);\n });\n } catch (err) {\n console.warn('[Jellyfin Offline] saveDownloadRecord error:', err);\n return false;\n }\n }\n\n async removeDownload(id: string): Promise<boolean> {\n if (!id) return false;\n const key = String(id);\n try {\n const db = await this.initDB();\n if (!db) return false;\n\n const removed = await new Promise<boolean>((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const request = store.delete(key);\n\n request.onsuccess = () => resolve(true);\n request.onerror = () => resolve(false);\n });\n\n if (removed) {\n this.revokeObjectUrl(key);\n this.downloadStatusCache.set(key, false);\n this.dispatchDownloadChanged(key, false);\n }\n return removed;\n } catch (err) {\n console.warn('[Jellyfin Offline] removeDownload error:', err);\n return false;\n }\n }\n\n /**\n * Downloads an audio or video item to offline storage.\n * If already downloaded, toggles it off (removes it).\n */\n async downloadItem(\n item: BaseItemDto,\n onProgress?: (progressFraction: number) => void,\n group?: { id?: string; name?: string; type?: string; artworkUrl?: string; owner?: string; count?: number } | null,\n index?: number,\n options: DownloadItemOptions = {}\n ): Promise<{ ok: boolean; size?: number; removed?: boolean; error?: string }> {\n if (!item) return { ok: false, error: 'no-item' };\n\n const key = this.getItemKey(item);\n if (!key) return { ok: false, error: 'no-id' };\n\n // If already downloaded, toggle off (remove)\n if (await this.isItemDownloaded(key)) {\n await this.removeDownload(key);\n return { ok: true, removed: true };\n }\n\n const isVideo = item.MediaType === 'Video' || item.Type === 'Movie' || item.Type === 'Episode' || item.Type === 'Video';\n let sourceUrl = '';\n\n if (isVideo) {\n if (options.quality) {\n sourceUrl = this.media.getVideoStreamUrl(key, { quality: options.quality });\n } else {\n sourceUrl = this.media.getDownloadUrl(key);\n }\n } else {\n sourceUrl = this.media.getAudioStreamUrl(key, { maxStreamingBitrate: 'Direct' });\n }\n\n if (!sourceUrl) return { ok: false, error: 'no-url' };\n\n let response: Response;\n try {\n response = await fetch(sourceUrl);\n } catch (err) {\n console.warn('[Jellyfin Offline] Download fetch error:', err);\n return { ok: false, error: 'network' };\n }\n\n if (!response.ok) {\n return { ok: false, error: `http-${response.status}` };\n }\n\n const contentLength = parseInt(response.headers.get('Content-Length') || '0', 10) || 0;\n\n try {\n const reader = response.body ? response.body.getReader() : null;\n let blob: Blob;\n\n const mimeType = response.headers.get('Content-Type') || (isVideo ? 'video/mp4' : 'audio/mpeg');\n\n if (reader) {\n const chunks: BlobPart[] = [];\n let received = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n received += value.length;\n if (onProgress) {\n onProgress(contentLength > 0 ? received / contentLength : 0);\n }\n }\n }\n blob = new Blob(chunks, { type: mimeType });\n } else {\n blob = await response.blob();\n if (onProgress) onProgress(1);\n }\n\n const record: DownloadRecord = {\n id: key,\n name: item.Name || 'Unknown',\n mediaType: isVideo ? 'Video' : 'Audio',\n type: item.Type,\n artists: item.Artists ? item.Artists.join(', ') : (item.AlbumArtist || ''),\n album: item.Album || '',\n albumId: item.AlbumId || '',\n seriesName: (item.SeriesName as string) || undefined,\n seriesId: (item.SeriesId as string) || undefined,\n seasonName: (item.SeasonName as string) || undefined,\n seasonId: (item.SeasonId as string) || undefined,\n artworkUrl: this.media.getArtworkUrl(item, { maxWidth: 300 }),\n size: blob.size,\n savedAt: Date.now(),\n hasLyrics: !!item.HasLyrics,\n mimeType\n };\n\n if (group && group.id) {\n record.parentId = String(group.id);\n record.parentName = group.name || '';\n record.parentType = group.type || '';\n record.parentArtworkUrl = group.artworkUrl || '';\n record.parentOwner = group.owner || '';\n record.parentCount = group.count || 0;\n }\n\n if (typeof index === 'number' && !Number.isNaN(index)) {\n record.index = index;\n } else if (typeof item.IndexNumber === 'number') {\n record.index = item.IndexNumber;\n }\n\n const saved = await this.saveDownloadRecord(record, blob);\n if (!saved) return { ok: false, error: 'storage' };\n\n this.revokeObjectUrl(key);\n this.downloadStatusCache.set(key, true);\n this.dispatchDownloadChanged(key, true);\n return { ok: true, size: blob.size };\n } catch (err) {\n console.warn('[Jellyfin Offline] Download processing failed:', err);\n return { ok: false, error: 'unknown' };\n }\n }\n\n /**\n * Backward-compatible alias for downloadItem.\n */\n async downloadTrack(\n track: BaseItemDto,\n onProgress?: (progressFraction: number) => void,\n group?: { id?: string; name?: string; type?: string; artworkUrl?: string; owner?: string; count?: number } | null,\n index?: number\n ): Promise<{ ok: boolean; size?: number; removed?: boolean; error?: string }> {\n return this.downloadItem(track, onProgress, group, index);\n }\n\n /**\n * Downloads multiple items with aggregated progress callbacks.\n */\n async downloadItems(\n items: BaseItemDto[],\n onProgress?: (progress: DownloadProgress) => void,\n group?: { id?: string; name?: string; type?: string; artworkUrl?: string; owner?: string; count?: number } | null,\n options: DownloadItemOptions = {}\n ): Promise<{ ok: boolean; downloaded: number; failed: number; total: number }> {\n const targets: BaseItemDto[] = [];\n for (const item of items || []) {\n const key = item && (item.Id || (item as unknown as { id?: string }).id);\n if (key && !(await this.isItemDownloaded(key))) {\n targets.push(item);\n }\n }\n\n const total = targets.length;\n let completed = 0;\n let failed = 0;\n\n for (let i = 0; i < targets.length; i++) {\n const res = await this.downloadItem(targets[i], undefined, group, i, options);\n completed++;\n if (!res.ok) failed++;\n if (onProgress) {\n onProgress({ completed, total, item: targets[i], track: targets[i], res });\n }\n }\n\n return { ok: failed === 0 && total > 0, downloaded: total - failed, failed, total };\n }\n\n /**\n * Backward-compatible alias for downloadItems.\n */\n async downloadTracks(\n tracks: BaseItemDto[],\n onProgress?: (progress: DownloadProgress) => void,\n group?: { id?: string; name?: string; type?: string; artworkUrl?: string; owner?: string; count?: number } | null\n ): Promise<{ ok: boolean; downloaded: number; failed: number; total: number }> {\n return this.downloadItems(tracks, onProgress, group);\n }\n\n async removeDownloads(items: BaseItemDto[]): Promise<{ ok: boolean; removed: number }> {\n let removed = 0;\n for (const item of items || []) {\n const key = item && (item.Id || (item as unknown as { id?: string }).id);\n if (key && (await this.removeDownload(key))) removed++;\n }\n return { ok: removed > 0, removed };\n }\n\n formatBytes(bytes: number): string {\n if (!bytes || bytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)));\n return `${(bytes / Math.pow(1024, i)).toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n }\n}\n","import type { HttpTransport } from './http.js';\nimport type { GetResumeItemsOptions, ItemsResponse } from './types.js';\nimport { JellyfinError } from './errors.js';\n\nconst RESUME_ITEM_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,Chapters,HasLyrics,Overview,Genres,Studios,ProductionYear,OfficialRating,CommunityRating,CriticRating,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class ResumeModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n const userId = explicitUserId || this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for resume requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Fetch items currently in-progress for the user via /UserItems/Resume.\n */\n async getResumeItems(options: GetResumeItemsOptions = {}): Promise<ItemsResponse> {\n const userId = this.resolveUserId(options.userId);\n const {\n limit = 20,\n startIndex = 0,\n parentId,\n mediaTypes,\n enableImages,\n enableUserData,\n imageTypeLimit,\n enableImageTypes,\n fields = RESUME_ITEM_FIELDS\n } = options;\n\n const params: Record<string, unknown> = {\n UserId: userId,\n Limit: limit,\n StartIndex: startIndex,\n Recursive: true,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n if (mediaTypes && mediaTypes.length > 0) params.MediaTypes = mediaTypes.join(',');\n if (enableImages !== undefined) params.EnableImages = enableImages;\n if (enableUserData !== undefined) params.EnableUserData = enableUserData;\n if (imageTypeLimit !== undefined) params.ImageTypeLimit = imageTypeLimit;\n if (enableImageTypes && enableImageTypes.length > 0) params.EnableImageTypes = enableImageTypes.join(',');\n\n return await this.http.request<ItemsResponse>('/UserItems/Resume', { params });\n }\n\n /**\n * Convenience alias for getResumeItems.\n */\n async getItems(options: GetResumeItemsOptions = {}): Promise<ItemsResponse> {\n return await this.getResumeItems(options);\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { GetNextUpOptions, ItemsResponse } from './types.js';\nimport { JellyfinError } from './errors.js';\n\nconst NEXT_UP_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AudioInfo,MediaSources,Chapters,Overview,Genres,ProductionYear,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class NextUpModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n const userId = explicitUserId || this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for next up requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Fetch the next unplayed episodes for followed series via /Shows/NextUp.\n */\n async getNextUp(options: GetNextUpOptions = {}): Promise<ItemsResponse> {\n const userId = this.resolveUserId(options.userId);\n const {\n limit = 24,\n startIndex = 0,\n parentId,\n seriesId,\n fields = NEXT_UP_FIELDS,\n enableImages,\n enableUserData,\n enableTotalRecordCount,\n imageTypeLimit,\n enableImageTypes,\n disableFirstEpisode,\n nextUpDateCutoff\n } = options;\n\n const params: Record<string, unknown> = {\n UserId: userId,\n Limit: limit,\n StartIndex: startIndex,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n if (seriesId) params.SeriesId = seriesId;\n if (enableImages !== undefined) params.EnableImages = enableImages;\n if (enableUserData !== undefined) params.EnableUserData = enableUserData;\n if (enableTotalRecordCount !== undefined) params.EnableTotalRecordCount = enableTotalRecordCount;\n if (imageTypeLimit !== undefined) params.ImageTypeLimit = imageTypeLimit;\n if (enableImageTypes && enableImageTypes.length > 0) params.EnableImageTypes = enableImageTypes.join(',');\n if (disableFirstEpisode !== undefined) params.DisableFirstEpisode = disableFirstEpisode;\n if (nextUpDateCutoff) params.NextUpDateCutoff = nextUpDateCutoff;\n\n return await this.http.request<ItemsResponse>('/Shows/NextUp', { params });\n }\n\n /**\n * Convenience alias for getNextUp.\n */\n async getEpisodes(options: GetNextUpOptions = {}): Promise<ItemsResponse> {\n return await this.getNextUp(options);\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { BaseItemDto, GetLatestMediaOptions } from './types.js';\nimport { JellyfinError } from './errors.js';\n\nconst LATEST_ITEM_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,Chapters,Overview,Genres,Studios,ProductionYear,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class LatestModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n const userId = explicitUserId || this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for latest media requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Fetch recently added media items for the user via /Users/{userId}/Items/Latest.\n */\n async getLatest(options: GetLatestMediaOptions = {}): Promise<BaseItemDto[]> {\n const userId = this.resolveUserId(options.userId);\n const {\n parentId,\n limit = 20,\n fields = LATEST_ITEM_FIELDS,\n includeItemTypes,\n isPlayed,\n enableImages,\n imageTypeLimit,\n enableImageTypes,\n groupItems\n } = options;\n\n const params: Record<string, unknown> = {\n Limit: limit,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n if (includeItemTypes && includeItemTypes.length > 0) {\n params.IncludeItemTypes = includeItemTypes.join(',');\n }\n if (isPlayed !== undefined) params.IsPlayed = isPlayed;\n if (enableImages !== undefined) params.EnableImages = enableImages;\n if (imageTypeLimit !== undefined) params.ImageTypeLimit = imageTypeLimit;\n if (enableImageTypes && enableImageTypes.length > 0) {\n params.EnableImageTypes = enableImageTypes.join(',');\n }\n if (groupItems !== undefined) params.GroupItems = groupItems;\n\n const result = await this.http.request<BaseItemDto[]>(`/Users/${userId}/Items/Latest`, { params });\n return Array.isArray(result) ? result : [];\n }\n\n /**\n * Convenience helper to fetch recently added movies.\n */\n async getLatestMovies(options: Omit<GetLatestMediaOptions, 'includeItemTypes'> = {}): Promise<BaseItemDto[]> {\n return await this.getLatest({ ...options, includeItemTypes: ['Movie'] });\n }\n\n /**\n * Convenience helper to fetch recently added TV episodes.\n */\n async getLatestEpisodes(options: Omit<GetLatestMediaOptions, 'includeItemTypes'> = {}): Promise<BaseItemDto[]> {\n return await this.getLatest({ ...options, includeItemTypes: ['Episode'] });\n }\n\n /**\n * Convenience helper to fetch recently added music albums.\n */\n async getLatestAlbums(options: Omit<GetLatestMediaOptions, 'includeItemTypes'> = {}): Promise<BaseItemDto[]> {\n return await this.getLatest({ ...options, includeItemTypes: ['MusicAlbum'] });\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport { JellyfinError } from './errors.js';\n\nexport class TranscodeModule {\n private http: HttpTransport;\n private getDeviceId: () => string;\n\n constructor(http: HttpTransport, getDeviceId: () => string) {\n this.http = http;\n this.getDeviceId = getDeviceId;\n }\n\n /**\n * Explicitly stop an active server transcoding session via DELETE /Videos/ActiveEncodings.\n * This terminates lingering FFmpeg processes on the Jellyfin server.\n *\n * @param playSessionId The unique playback session ID.\n * @param deviceId The client device ID (defaults to configured client device ID).\n */\n async stopActiveEncoding(playSessionId: string, deviceId?: string): Promise<void> {\n if (!playSessionId) {\n throw new JellyfinError('playSessionId is required to stop an active encoding session.');\n }\n\n const resolvedDeviceId = deviceId || this.getDeviceId();\n if (!resolvedDeviceId) {\n throw new JellyfinError('deviceId is required to stop an active encoding session.');\n }\n\n await this.http.request('/Videos/ActiveEncodings', {\n method: 'DELETE',\n params: {\n DeviceId: resolvedDeviceId,\n PlaySessionId: playSessionId\n }\n });\n }\n\n /**\n * Convenience alias for stopActiveEncoding.\n */\n async stop(playSessionId: string, deviceId?: string): Promise<void> {\n return await this.stopActiveEncoding(playSessionId, deviceId);\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { ItemsResponse, SearchOptions } from './types.js';\nimport { JellyfinError } from './errors.js';\n\nexport const COMMON_SEARCH_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,Chapters,HasLyrics,Overview,Genres,Studios,ProductionYear,OfficialRating,CommunityRating,CriticRating,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class SearchModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n const userId = explicitUserId || this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for search requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Universal search across Jellyfin items with comprehensive filters.\n */\n async search(query: string, options: SearchOptions = {}): Promise<ItemsResponse> {\n if (!query || !query.trim()) {\n return { Items: [], TotalRecordCount: 0 };\n }\n\n const userId = this.resolveUserId(options.userId);\n const {\n limit = 30,\n startIndex = 0,\n parentId,\n includeItemTypes = 'Audio,MusicAlbum,MusicArtist,Playlist,Movie,Series,Episode',\n mediaTypes,\n genres,\n years,\n isFavorite,\n sortBy,\n sortOrder,\n fields = COMMON_SEARCH_FIELDS,\n recursive = true\n } = options;\n\n const params: Record<string, unknown> = {\n SearchTerm: query.trim(),\n Limit: limit,\n StartIndex: startIndex,\n Recursive: recursive,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n\n if (includeItemTypes) {\n params.IncludeItemTypes = Array.isArray(includeItemTypes)\n ? includeItemTypes.join(',')\n : includeItemTypes;\n }\n\n if (mediaTypes) {\n params.MediaTypes = Array.isArray(mediaTypes)\n ? mediaTypes.join(',')\n : mediaTypes;\n }\n\n if (genres && genres.length > 0) params.Genres = genres.join('|');\n if (years && years.length > 0) params.Years = years.join(',');\n if (isFavorite) params.Filters = 'IsFavorite';\n if (sortBy) params.SortBy = sortBy;\n if (sortOrder) params.SortOrder = sortOrder;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Search specifically within a specific library or parent folder.\n */\n async searchInLibrary(\n parentId: string,\n query: string,\n options: Omit<SearchOptions, 'parentId'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, parentId });\n }\n\n /**\n * Convenience helper to search audio tracks / songs.\n */\n async searchSongs(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'Audio' });\n }\n\n /**\n * Convenience helper to search music albums.\n */\n async searchAlbums(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'MusicAlbum' });\n }\n\n /**\n * Convenience helper to search music artists.\n */\n async searchArtists(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'MusicArtist' });\n }\n\n /**\n * Convenience helper to search movies.\n */\n async searchMovies(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'Movie' });\n }\n\n /**\n * Convenience helper to search TV series.\n */\n async searchSeries(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'Series' });\n }\n\n /**\n * Convenience helper to search TV episodes.\n */\n async searchEpisodes(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'Episode' });\n }\n}\n\n","export interface CacheRecord<T = unknown> {\n key: string;\n data: T;\n timestamp: number;\n}\n\nexport interface CacheAdapter {\n get<T = unknown>(key: string): Promise<T | null> | T | null;\n set<T = unknown>(key: string, data: T): Promise<void> | void;\n delete(key: string): Promise<void> | void;\n clear(): Promise<void> | void;\n}\n\nexport class MemoryCacheAdapter implements CacheAdapter {\n private cache = new Map<string, { data: unknown; timestamp: number }>();\n\n get<T = unknown>(key: string): T | null {\n const entry = this.cache.get(key);\n return entry ? (entry.data as T) : null;\n }\n\n set<T = unknown>(key: string, data: T): void {\n this.cache.set(key, { data, timestamp: Date.now() });\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\nexport class IndexedDBCacheAdapter implements CacheAdapter {\n private dbName: string;\n private dbVersion: number;\n private storeName: string;\n private dbPromise: Promise<IDBDatabase | null> | null = null;\n\n constructor(dbName = 'JellyfinSdkCache', dbVersion = 1, storeName = 'api_cache') {\n this.dbName = dbName;\n this.dbVersion = dbVersion;\n this.storeName = storeName;\n }\n\n private async getDB(): Promise<IDBDatabase | null> {\n if (this.dbPromise) return this.dbPromise;\n\n this.dbPromise = new Promise((resolve) => {\n if (typeof window === 'undefined' || !('indexedDB' in window)) {\n resolve(null);\n return;\n }\n\n const request = indexedDB.open(this.dbName, this.dbVersion);\n\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName, { keyPath: 'key' });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = (e) => {\n console.warn('[Jellyfin Cache] IndexedDB open error:', e);\n resolve(null);\n };\n });\n\n return this.dbPromise;\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n try {\n const db = await this.getDB();\n if (!db) return null;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readonly');\n const store = tx.objectStore(this.storeName);\n const request = store.get(key);\n request.onsuccess = () => {\n const record = request.result;\n resolve(record ? (record.data as T) : null);\n };\n request.onerror = () => resolve(null);\n });\n } catch {\n return null;\n }\n }\n\n async set<T = unknown>(key: string, data: T): Promise<void> {\n if (!data) return;\n try {\n const db = await this.getDB();\n if (!db) return;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const record = { key, data, timestamp: Date.now() };\n const request = store.put(record);\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n } catch {\n // ignore cache failure\n }\n }\n\n async delete(key: string): Promise<void> {\n try {\n const db = await this.getDB();\n if (!db) return;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const request = store.delete(key);\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n } catch {\n // ignore\n }\n }\n\n async clear(): Promise<void> {\n try {\n const db = await this.getDB();\n if (!db) return;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const request = store.clear();\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n } catch {\n // ignore\n }\n }\n}\n\n/**\n * Executes a Stale-While-Revalidate pattern using a CacheAdapter.\n */\nexport async function fetchWithCache<T>(\n cache: CacheAdapter,\n cacheKey: string,\n fetchFn: () => Promise<T>,\n onFreshData?: (data: T) => void\n): Promise<T> {\n const cached = await cache.get<T>(cacheKey);\n\n const backgroundFetch = fetchFn().then(async (freshData) => {\n if (freshData !== null && freshData !== undefined) {\n await cache.set(cacheKey, freshData);\n if (onFreshData) {\n try {\n onFreshData(freshData);\n } catch (e) {\n console.warn('[Jellyfin Cache] Error in onFreshData callback for %s:', cacheKey, e);\n }\n }\n }\n return freshData;\n }).catch((err) => {\n console.warn('[Jellyfin Cache] Background fetch failed for %s:', cacheKey, err);\n if (!cached) throw err;\n return cached;\n });\n\n if (cached !== null && cached !== undefined) {\n return cached;\n }\n\n return await backgroundFetch;\n}\n\n","import type { StorageAdapter } from './types.js';\n\nexport class MemoryStorage implements StorageAdapter {\n private store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.has(key) ? this.store.get(key)! : null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n\nexport class LocalStorageAdapter implements StorageAdapter {\n getItem(key: string): string | null {\n if (typeof localStorage !== 'undefined') {\n return localStorage.getItem(key);\n }\n return null;\n }\n\n setItem(key: string, value: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(key, value);\n }\n }\n\n removeItem(key: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(key);\n }\n }\n}\n\nexport function getDefaultStorage(): StorageAdapter {\n if (typeof window !== 'undefined' && typeof window.localStorage !== 'undefined') {\n return new LocalStorageAdapter();\n }\n return new MemoryStorage();\n}\n\nexport function generateDeviceId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n const array = new Uint8Array(16);\n crypto.getRandomValues(array);\n return 'sdk-' + Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n return 'sdk-' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n}\n\n","import { HttpTransport } from './http.js';\nimport { AuthModule } from './auth.js';\nimport { SystemModule } from './system.js';\nimport { LibraryModule } from './library.js';\nimport { PlaylistsModule } from './playlists.js';\nimport { PlaybackModule } from './playback.js';\nimport { MediaModule } from './media.js';\nimport { LyricsModule } from './lyrics.js';\nimport { FavoritesModule } from './favorites.js';\nimport { OfflineStorageManager } from './offline.js';\nimport { ResumeModule } from './resume.js';\nimport { NextUpModule } from './next-up.js';\nimport { LatestModule } from './latest.js';\nimport { TranscodeModule } from './transcode.js';\nimport { SearchModule } from './search.js';\nimport { CacheAdapter, MemoryCacheAdapter } from './cache.js';\nimport { generateDeviceId, getDefaultStorage } from './storage.js';\nimport type { ClientInfo, JellyfinClientOptions, StorageAdapter } from './types.js';\n\nexport type ClientEventType = 'unauthorized' | 'authenticated' | 'logout';\nexport type ClientEventListener = (...args: unknown[]) => void;\n\nexport class JellyfinClient {\n public readonly auth: AuthModule;\n public readonly system: SystemModule;\n public readonly library: LibraryModule;\n public readonly search: SearchModule;\n public readonly playlists: PlaylistsModule;\n public readonly playback: PlaybackModule;\n public readonly media: MediaModule;\n public readonly lyrics: LyricsModule;\n public readonly favorites: FavoritesModule;\n public readonly offline: OfflineStorageManager;\n public readonly resume: ResumeModule;\n public readonly nextUp: NextUpModule;\n public readonly latest: LatestModule;\n public readonly transcode: TranscodeModule;\n\n private http: HttpTransport;\n private storage: StorageAdapter;\n private cache: CacheAdapter;\n private clientInfo: ClientInfo;\n private eventListeners = new Map<ClientEventType, Set<ClientEventListener>>();\n\n constructor(options: JellyfinClientOptions = {}) {\n this.storage = options.storage || getDefaultStorage();\n this.cache = new MemoryCacheAdapter();\n\n this.clientInfo = {\n name: options.clientInfo?.name || '@francofantomius/jellyfin',\n version: options.clientInfo?.version || '0.2.0',\n device: options.clientInfo?.device || (typeof window !== 'undefined' ? 'Web Browser' : 'Node.js'),\n deviceId: options.clientInfo?.deviceId || generateDeviceId()\n };\n\n this.http = new HttpTransport({\n serverUrl: options.serverUrl,\n token: options.accessToken,\n clientInfo: this.clientInfo,\n fetch: options.fetch,\n onUnauthorized: () => {\n this.emit('unauthorized');\n if (options.onUnauthorized) {\n options.onUnauthorized();\n }\n }\n });\n\n const getUserId = () => this.auth.getUserId();\n const getDeviceId = () => this.clientInfo.deviceId;\n\n this.system = new SystemModule(this.http, {\n serverVersion: options.serverVersion,\n targetVersion: options.targetVersion\n });\n this.auth = new AuthModule(this.http, options.userId || '');\n this.library = new LibraryModule(this.http, getUserId);\n this.search = new SearchModule(this.http, getUserId);\n this.playlists = new PlaylistsModule(this.http, getUserId);\n this.playback = new PlaybackModule(this.http);\n this.media = new MediaModule(this.http, getUserId);\n this.lyrics = new LyricsModule(this.http);\n this.favorites = new FavoritesModule(this.http, getUserId);\n this.offline = new OfflineStorageManager(this.media);\n this.resume = new ResumeModule(this.http, getUserId);\n this.nextUp = new NextUpModule(this.http, getUserId);\n this.latest = new LatestModule(this.http, getUserId);\n this.transcode = new TranscodeModule(this.http, getDeviceId);\n }\n\n // --- Configuration Getters & Setters ---\n\n get serverUrl(): string {\n return this.http.getServerUrl();\n }\n\n set serverUrl(url: string) {\n this.http.setServerUrl(url);\n }\n\n get accessToken(): string {\n return this.http.getToken();\n }\n\n set accessToken(token: string) {\n this.http.setToken(token);\n }\n\n get userId(): string {\n return this.auth.getUserId();\n }\n\n set userId(id: string) {\n this.auth.setUserId(id);\n }\n\n get serverVersion(): string | null {\n return this.system.getVersion();\n }\n\n set serverVersion(version: string | null) {\n this.system.setVersion(version);\n }\n\n /**\n * Check whether the connected Jellyfin server is version 12.0 or higher.\n */\n async isV12(): Promise<boolean> {\n return await this.system.isV12();\n }\n\n /**\n * Query server and detect the server version via /System/Info/Public.\n */\n async detectServerVersion(): Promise<string | null> {\n return await this.system.detectVersion();\n }\n\n get info(): ClientInfo {\n return this.http.getClientInfo();\n }\n\n setClientInfo(info: Partial<ClientInfo>): void {\n this.http.setClientInfo(info);\n }\n\n getCache(): CacheAdapter {\n return this.cache;\n }\n\n setCache(cache: CacheAdapter): void {\n this.cache = cache;\n }\n\n getStorage(): StorageAdapter {\n return this.storage;\n }\n\n setStorage(storage: StorageAdapter): void {\n this.storage = storage;\n }\n\n // --- Event Handling ---\n\n on(event: ClientEventType, listener: ClientEventListener): () => void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(listener);\n\n return () => {\n this.off(event, listener);\n };\n }\n\n off(event: ClientEventType, listener: ClientEventListener): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n emit(event: ClientEventType, ...args: unknown[]): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((fn) => {\n try {\n fn(...args);\n } catch (e) {\n console.error(`[Jellyfin SDK] Event handler error on '${event}':`, e);\n }\n });\n }\n }\n\n // --- Convenience Shortcuts ---\n\n /**\n * Authenticate with username and password, update client state, and emit 'authenticated'.\n */\n async authenticate(username: string, password: string = '') {\n const res = await this.auth.authenticateByName(username, password);\n if (!this.system.getVersion()) {\n this.system.detectVersion().catch(() => {});\n }\n this.emit('authenticated', res);\n return res;\n }\n\n /**\n * Log out and clear tokens and session.\n */\n logout(): void {\n this.auth.logout();\n this.emit('logout');\n }\n\n /**\n * Manually set authentication credentials.\n */\n setCredentials(credentials: { serverUrl?: string; accessToken: string; userId: string }): void {\n if (credentials.serverUrl) {\n this.http.setServerUrl(credentials.serverUrl);\n }\n this.http.setToken(credentials.accessToken);\n this.auth.setUserId(credentials.userId);\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/auth.ts","../src/system.ts","../src/library.ts","../src/playlists.ts","../src/playback.ts","../src/quality.ts","../src/media.ts","../src/lyrics.ts","../src/favorites.ts","../src/offline.ts","../src/resume.ts","../src/next-up.ts","../src/latest.ts","../src/transcode.ts","../src/search.ts","../src/websocket.ts","../src/sessions.ts","../src/quick-connect.ts","../src/trickplay.ts","../src/chapters.ts","../src/genres.ts","../src/collections.ts","../src/display-preferences.ts","../src/cache.ts","../src/storage.ts","../src/client.ts"],"names":["params"],"mappings":"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","file":"index.cjs","sourcesContent":["export class JellyfinError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'JellyfinError';\n }\n}\n\nexport class JellyfinApiError extends JellyfinError {\n public readonly status: number;\n public readonly endpoint?: string;\n\n constructor(message: string, status: number, endpoint?: string) {\n super(message);\n this.name = 'JellyfinApiError';\n this.status = status;\n this.endpoint = endpoint;\n }\n}\n\nexport class JellyfinAuthError extends JellyfinApiError {\n constructor(message: string = 'Unauthorized. Please check your Jellyfin credentials.', status: number = 401, endpoint?: string) {\n super(message, status, endpoint);\n this.name = 'JellyfinAuthError';\n }\n}\n\n","import { JellyfinApiError, JellyfinAuthError, JellyfinError } from './errors.js';\nimport type { ClientInfo } from './types.js';\n\nexport interface RequestOptions {\n method?: string;\n params?: Record<string, unknown>;\n body?: unknown;\n contentType?: string;\n headers?: Record<string, string>;\n}\n\nexport function cleanUrl(url: string): string {\n if (!url) return '';\n let cleaned = url.trim().replace(/\\/+$/, '');\n if (!/^https?:\\/\\//i.test(cleaned)) {\n cleaned = 'https://' + cleaned;\n }\n return cleaned;\n}\n\nexport function buildAuthHeader(clientInfo: ClientInfo, token?: string): string {\n const tokenPart = token ? `, Token=\"${token}\"` : '';\n return `MediaBrowser Client=\"${clientInfo.name}\", Device=\"${clientInfo.device}\", DeviceId=\"${clientInfo.deviceId}\", Version=\"${clientInfo.version}\"${tokenPart}`;\n}\n\nexport class HttpTransport {\n private serverUrl: string = '';\n private token: string = '';\n private clientInfo: ClientInfo;\n private fetchFn: typeof fetch;\n private onUnauthorized?: () => void;\n\n constructor(options: {\n serverUrl?: string;\n token?: string;\n clientInfo: ClientInfo;\n fetch?: typeof fetch;\n onUnauthorized?: () => void;\n }) {\n this.serverUrl = options.serverUrl ? cleanUrl(options.serverUrl) : '';\n this.token = options.token || '';\n this.clientInfo = options.clientInfo;\n this.fetchFn = options.fetch || (globalThis.fetch ? globalThis.fetch.bind(globalThis) : fetch);\n this.onUnauthorized = options.onUnauthorized;\n }\n\n setServerUrl(url: string): void {\n this.serverUrl = cleanUrl(url);\n }\n\n getServerUrl(): string {\n return this.serverUrl;\n }\n\n setToken(token: string): void {\n this.token = token;\n }\n\n getToken(): string {\n return this.token;\n }\n\n setClientInfo(info: Partial<ClientInfo>): void {\n this.clientInfo = { ...this.clientInfo, ...info };\n }\n\n getClientInfo(): ClientInfo {\n return this.clientInfo;\n }\n\n setOnUnauthorized(handler?: () => void): void {\n this.onUnauthorized = handler;\n }\n\n getAuthHeader(): string {\n return buildAuthHeader(this.clientInfo, this.token);\n }\n\n async requestRaw(endpoint: string, options: RequestOptions = {}): Promise<Response> {\n if (!this.serverUrl) {\n throw new JellyfinError('Jellyfin server URL is not configured.');\n }\n\n const { method = 'GET', params = {}, body = null, contentType, headers: customHeaders = {} } = options;\n\n const url = new URL(`${this.serverUrl}${endpoint.startsWith('/') ? '' : '/'}${endpoint}`);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value));\n }\n });\n\n const authHeader = this.getAuthHeader();\n const headers: Record<string, string> = {\n 'X-Emby-Authorization': authHeader,\n 'Authorization': authHeader,\n ...customHeaders\n };\n\n let serializedBody: string | undefined;\n if (contentType) {\n headers['Content-Type'] = contentType;\n serializedBody = typeof body === 'string' ? body : JSON.stringify(body);\n } else if (body !== null && body !== undefined) {\n if (typeof body === 'string') {\n headers['Content-Type'] = 'application/json';\n serializedBody = body;\n } else {\n headers['Content-Type'] = 'application/json';\n serializedBody = JSON.stringify(body);\n }\n }\n\n let response: Response;\n try {\n response = await this.fetchFn(url.toString(), {\n method,\n headers,\n body: serializedBody\n });\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n throw new JellyfinError(`Network request failed (${endpoint}): ${errorMsg}`);\n }\n\n if (response.status === 401 || response.status === 403) {\n if (response.status === 401 && this.onUnauthorized) {\n try {\n this.onUnauthorized();\n } catch {\n // ignore callback exceptions\n }\n }\n throw new JellyfinAuthError(`Unauthorized (HTTP ${response.status}) on ${endpoint}`, response.status, endpoint);\n }\n\n if (!response.ok) {\n let details = '';\n try {\n const text = await response.text();\n if (text) {\n details = `: ${text.slice(0, 500)}`;\n }\n } catch {\n // ignore\n }\n throw new JellyfinApiError(`Jellyfin API request failed (${endpoint}): ${response.statusText || response.status}${details}`, response.status, endpoint);\n }\n\n return response;\n }\n\n async request<T = unknown>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n const response = await this.requestRaw(endpoint, {\n ...options,\n headers: {\n Accept: 'application/json',\n ...(options.headers || {})\n }\n });\n\n const contentTypeHeader = response.headers.get('Content-Type') || '';\n if (contentTypeHeader.includes('application/json')) {\n return (await response.json()) as T;\n }\n\n return null as unknown as T;\n }\n\n async requestText(endpoint: string, options: RequestOptions = {}): Promise<string> {\n const response = await this.requestRaw(endpoint, {\n ...options,\n headers: {\n Accept: 'text/vtt, text/plain, */*',\n ...(options.headers || {})\n }\n });\n return await response.text();\n }\n\n async requestBlob(endpoint: string, options: RequestOptions = {}): Promise<Blob> {\n const response = await this.requestRaw(endpoint, options);\n return await response.blob();\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { AuthenticationResult, ClientCapabilities, UserDto } from './types.js';\nimport { JellyfinAuthError, JellyfinError } from './errors.js';\n\nexport class AuthModule {\n private http: HttpTransport;\n private currentUser: UserDto | null = null;\n private currentUserId: string = '';\n private currentUsername: string = '';\n\n constructor(http: HttpTransport, userId: string = '') {\n this.http = http;\n this.currentUserId = userId;\n }\n\n getUserId(): string {\n return this.currentUserId;\n }\n\n setUserId(id: string): void {\n this.currentUserId = id;\n }\n\n getUsername(): string {\n return this.currentUsername || this.currentUser?.Name || '';\n }\n\n getCurrentUser(): UserDto | null {\n return this.currentUser;\n }\n\n setCurrentUser(user: UserDto | null): void {\n this.currentUser = user;\n if (user?.Id) {\n this.currentUserId = user.Id;\n }\n if (user?.Name) {\n this.currentUsername = user.Name;\n }\n }\n\n /**\n * Authenticate with the Jellyfin server using username and password.\n */\n async authenticateByName(username: string, password: string = ''): Promise<AuthenticationResult> {\n if (!username || !username.trim()) {\n throw new JellyfinError('Username is required for authentication.');\n }\n\n const result = await this.http.request<AuthenticationResult>('/Users/AuthenticateByName', {\n method: 'POST',\n body: {\n Username: username.trim(),\n Pw: password || ''\n }\n });\n\n if (!result || !result.AccessToken || !result.User?.Id) {\n throw new JellyfinAuthError('Invalid response received from Jellyfin authentication endpoint.');\n }\n\n this.http.setToken(result.AccessToken);\n // Jellyfin 12 enforces case-insensitive usernames; store normalized username returned in User.Name\n this.setCurrentUser(result.User);\n this.currentUsername = result.User.Name;\n\n return result;\n }\n\n /**\n * Report client capabilities to the Jellyfin server.\n */\n async reportCapabilities(capabilities?: ClientCapabilities): Promise<void> {\n const payload: ClientCapabilities = {\n PlayableMediaTypes: ['Audio', 'Video'],\n SupportedCommands: [\n 'MoveUp',\n 'MoveDown',\n 'MoveLeft',\n 'MoveRight',\n 'Select',\n 'Back',\n 'VolumeUp',\n 'VolumeDown',\n 'Mute',\n 'Unmute',\n 'ToggleMute',\n 'SetVolume',\n 'PlayState',\n 'SetRepeatMode',\n 'SetShuffleQueue',\n 'DisplayMessage'\n ],\n SupportsMediaControl: true,\n SupportsSync: false,\n SupportsPersistentIdentifier: true,\n MessageFormat: 'Json',\n ...capabilities\n };\n\n try {\n await this.http.request('/Sessions/Capabilities/Full', {\n method: 'POST',\n body: payload\n });\n } catch {\n // Fallback for older Jellyfin servers\n try {\n await this.http.request('/Sessions/Capabilities', {\n method: 'POST',\n body: payload\n });\n } catch (fallbackErr) {\n console.warn('[Jellyfin SDK] Failed to report client capabilities:', fallbackErr);\n }\n }\n }\n\n /**\n * Build the user profile avatar image URL.\n */\n getUserImageUrl(userId?: string, tag?: string): string {\n const uid = userId || this.currentUserId;\n const serverUrl = this.http.getServerUrl();\n if (!serverUrl || !uid) return '';\n\n const tagToUse = tag || this.currentUser?.PrimaryImageTag || this.currentUser?.ImageTags?.Primary || '';\n const tagParam = tagToUse ? `?tag=${tagToUse}` : '';\n return `${serverUrl}/Users/${uid}/Images/Primary${tagParam}`;\n }\n\n /**\n * Clear active user credentials and token.\n */\n logout(): void {\n this.http.setToken('');\n this.currentUserId = '';\n this.currentUsername = '';\n this.currentUser = null;\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { PublicSystemInfo, SystemInfo } from './types.js';\n\n/**\n * Parses a semantic version string (e.g. \"10.9.11\", \"12.0.0\", \"12.0.0-rc1\") into numeric components.\n */\nexport function parseSemVer(version: string): { major: number; minor: number; patch: number } | null {\n if (!version) return null;\n const match = version.trim().match(/^(\\d+)\\.(\\d+)(?:\\.(\\d+))?/);\n if (!match) return null;\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: match[3] ? parseInt(match[3], 10) : 0\n };\n}\n\n/**\n * Checks if currentVersion is greater than or equal to targetVersion.\n */\nexport function isVersionAtLeast(currentVersion: string, targetVersion: string): boolean {\n const current = parseSemVer(currentVersion);\n const target = parseSemVer(targetVersion);\n if (!current || !target) return false;\n\n if (current.major !== target.major) {\n return current.major > target.major;\n }\n if (current.minor !== target.minor) {\n return current.minor > target.minor;\n }\n return current.patch >= target.patch;\n}\n\n/**\n * Checks if the given version string represents Jellyfin 12.0.0 or higher.\n */\nexport function isV12OrHigher(version?: string): boolean {\n if (!version) return false;\n const parsed = parseSemVer(version);\n if (!parsed) return false;\n return parsed.major >= 12;\n}\n\nexport class SystemModule {\n private http: HttpTransport;\n private serverVersion: string | null = null;\n private targetVersion: 'auto' | '10' | '12' = 'auto';\n\n constructor(\n http: HttpTransport,\n options?: {\n serverVersion?: string;\n targetVersion?: 'auto' | '10' | '12';\n }\n ) {\n this.http = http;\n if (options?.serverVersion) {\n this.serverVersion = options.serverVersion;\n }\n if (options?.targetVersion) {\n this.targetVersion = options.targetVersion;\n }\n }\n\n /**\n * Get public system info without requiring authentication.\n */\n async getPublicInfo(): Promise<PublicSystemInfo> {\n const info = await this.http.request<PublicSystemInfo>('/System/Info/Public');\n if (info?.Version) {\n this.serverVersion = info.Version;\n }\n return info;\n }\n\n /**\n * Get full system info (requires authentication).\n */\n async getInfo(): Promise<SystemInfo> {\n const info = await this.http.request<SystemInfo>('/System/Info');\n if (info?.Version) {\n this.serverVersion = info.Version;\n }\n return info;\n }\n\n /**\n * Get the cached or explicitly configured server version string.\n */\n getVersion(): string | null {\n return this.serverVersion;\n }\n\n /**\n * Manually set or override the server version.\n */\n setVersion(version: string | null): void {\n this.serverVersion = version;\n }\n\n /**\n * Get the configured target compatibility mode.\n */\n getTargetVersion(): 'auto' | '10' | '12' {\n return this.targetVersion;\n }\n\n /**\n * Set target compatibility mode.\n */\n setTargetVersion(target: 'auto' | '10' | '12'): void {\n this.targetVersion = target;\n }\n\n /**\n * Detects and caches the server version by calling /System/Info/Public.\n */\n async detectVersion(): Promise<string | null> {\n try {\n const info = await this.getPublicInfo();\n return info?.Version || null;\n } catch {\n return null;\n }\n }\n\n /**\n * Checks whether the current server is Jellyfin 12 or higher.\n * If targetVersion is explicitly set to '12' or '10', that preference is honored.\n * If 'auto', resolves against known version or attempts detection.\n */\n async isV12(): Promise<boolean> {\n if (this.targetVersion === '12') return true;\n if (this.targetVersion === '10') return false;\n\n if (!this.serverVersion) {\n await this.detectVersion();\n }\n\n if (this.serverVersion) {\n return isV12OrHigher(this.serverVersion);\n }\n\n // Default to true (modern behavior) if undetermined\n return true;\n }\n\n /**\n * Synchronously checks if the server is known to be v12+ based on cached version or target setting.\n * Defaults to true (modern behavior) if unknown.\n */\n isV12Sync(): boolean {\n if (this.targetVersion === '12') return true;\n if (this.targetVersion === '10') return false;\n if (this.serverVersion) {\n return isV12OrHigher(this.serverVersion);\n }\n return true;\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type {\n BaseItemDto,\n GetAlbumsOptions,\n GetArtistsOptions,\n GetEpisodesOptions,\n GetMoviesOptions,\n GetSeasonsOptions,\n GetSeriesOptions,\n GetSongsOptions,\n GetVideosOptions,\n ItemsResponse,\n PlaybackInfoOptions,\n PlaybackInfoResponse,\n SearchOptions\n} from './types.js';\nimport { JellyfinError } from './errors.js';\n\nconst COMMON_ITEM_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,Chapters,HasLyrics,Overview,Genres,Studios,ProductionYear,OfficialRating,CommunityRating,CriticRating,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class LibraryModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private requireUserId(): string {\n const userId = this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for library requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Get list of music library views (folders) for the current user.\n */\n async getMusicLibraries(): Promise<BaseItemDto[]> {\n const userId = this.requireUserId();\n const data = await this.http.request<ItemsResponse>(`/Users/${userId}/Views`);\n return (data.Items || []).filter((item) => item.CollectionType === 'music');\n }\n\n /**\n * Get list of video library views (movies, tv shows, home videos) for the current user.\n */\n async getVideoLibraries(): Promise<BaseItemDto[]> {\n const userId = this.requireUserId();\n const data = await this.http.request<ItemsResponse>(`/Users/${userId}/Views`);\n const videoTypes = new Set(['movies', 'tvshows', 'homevideos', 'videos', 'musicvideos']);\n return (data.Items || []).filter(\n (item) => typeof item.CollectionType === 'string' && videoTypes.has(item.CollectionType)\n );\n }\n\n /**\n * Get music albums.\n */\n async getAlbums(options: GetAlbumsOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n parentId,\n artistId,\n sortBy = 'SortName',\n sortOrder = 'Ascending'\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'MusicAlbum',\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BasicSyncInfo,AlbumArtists,ArtistItems,DateCreated,DateLastMediaAdded,UserData'\n };\n\n if (parentId) params.ParentId = parentId;\n if (artistId) params.ArtistIds = artistId;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Get music artists.\n */\n async getArtists(options: GetArtistsOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n sortBy = 'SortName',\n sortOrder = 'Ascending'\n } = options;\n\n return await this.http.request<ItemsResponse>('/Artists', {\n params: {\n UserId: userId,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: 'PrimaryImageTag,ImageTags,DateCreated,UserData'\n }\n });\n }\n\n /**\n * Get audio songs/tracks.\n */\n async getSongs(options: GetSongsOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 100,\n startIndex = 0,\n albumId,\n artistId,\n isFavorite,\n sortBy = 'ParentIndexNumber,IndexNumber,SortName',\n sortOrder = 'Ascending'\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'Audio',\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n\n if (albumId) params.ParentId = albumId;\n if (artistId) params.ArtistIds = artistId;\n if (isFavorite) params.Filters = 'IsFavorite';\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Get favorite songs/tracks for the current user.\n */\n async getFavoriteSongs(options: Omit<GetSongsOptions, 'isFavorite'> = {}): Promise<ItemsResponse> {\n return await this.getSongs({\n ...options,\n isFavorite: true,\n limit: options.limit || 1000,\n sortBy: options.sortBy || 'SortName'\n });\n }\n\n /**\n * Get movies for the current user.\n */\n async getMovies(options: GetMoviesOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n parentId,\n isFavorite,\n sortBy = 'SortName',\n sortOrder = 'Ascending',\n genres,\n years,\n searchTerm\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'Movie',\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n\n if (parentId) params.ParentId = parentId;\n if (isFavorite) params.Filters = 'IsFavorite';\n if (genres && genres.length > 0) params.Genres = genres.join('|');\n if (years && years.length > 0) params.Years = years.join(',');\n if (searchTerm) params.SearchTerm = searchTerm;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Get TV series for the current user.\n */\n async getSeries(options: GetSeriesOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n parentId,\n isFavorite,\n sortBy = 'SortName',\n sortOrder = 'Ascending',\n genres,\n years,\n searchTerm\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'Series',\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n\n if (parentId) params.ParentId = parentId;\n if (isFavorite) params.Filters = 'IsFavorite';\n if (genres && genres.length > 0) params.Genres = genres.join('|');\n if (years && years.length > 0) params.Years = years.join(',');\n if (searchTerm) params.SearchTerm = searchTerm;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Get seasons for a given TV series.\n */\n async getSeasons(seriesId: string, options: GetSeasonsOptions = {}): Promise<ItemsResponse> {\n const userId = options.userId || this.requireUserId();\n const params: Record<string, unknown> = {\n UserId: userId,\n Fields: options.fields || COMMON_ITEM_FIELDS\n };\n if (options.isSpecialSeason !== undefined) {\n params.IsSpecialSeason = options.isSpecialSeason;\n }\n\n return await this.http.request<ItemsResponse>(`/Shows/${seriesId}/Seasons`, { params });\n }\n\n /**\n * Get episodes for a TV series or specific season.\n */\n async getEpisodes(seriesId?: string, seasonId?: string, options: GetEpisodesOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n seasonNumber,\n startIndex = 0,\n limit = 100,\n isMissing,\n sortBy = 'IndexNumber,SortName',\n sortOrder = 'Ascending'\n } = options;\n\n if (seriesId) {\n const params: Record<string, unknown> = {\n UserId: userId,\n StartIndex: startIndex,\n Limit: limit,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n if (seasonId) params.SeasonId = seasonId;\n if (seasonNumber !== undefined) params.Season = seasonNumber;\n if (isMissing !== undefined) params.IsMissing = isMissing;\n\n return await this.http.request<ItemsResponse>(`/Shows/${seriesId}/Episodes`, { params });\n }\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: 'Episode',\n Recursive: true,\n StartIndex: startIndex,\n Limit: limit,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n if (seasonId) params.ParentId = seasonId;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * General query for video items (movies, episodes, videos).\n */\n async getVideos(options: GetVideosOptions = {}): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n const {\n limit = 50,\n startIndex = 0,\n parentId,\n includeItemTypes = 'Movie,Episode,Video',\n sortBy = 'SortName',\n sortOrder = 'Ascending'\n } = options;\n\n const params: Record<string, unknown> = {\n IncludeItemTypes: includeItemTypes,\n Recursive: true,\n Limit: limit,\n StartIndex: startIndex,\n SortBy: sortBy,\n SortOrder: sortOrder,\n Fields: COMMON_ITEM_FIELDS\n };\n if (parentId) params.ParentId = parentId;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Request media playback information for an item (sources, streams, play session).\n */\n async getPlaybackInfo(itemId: string, options: PlaybackInfoOptions = {}): Promise<PlaybackInfoResponse> {\n if (!itemId) {\n throw new JellyfinError('itemId is required for getPlaybackInfo');\n }\n const userId = options.userId || this.requireUserId();\n const payload: Record<string, unknown> = {\n UserId: userId\n };\n\n if (options.startTimeTicks !== undefined) payload.StartTimeTicks = options.startTimeTicks;\n if (options.audioStreamIndex !== undefined) payload.AudioStreamIndex = options.audioStreamIndex;\n if (options.subtitleStreamIndex !== undefined) payload.SubtitleStreamIndex = options.subtitleStreamIndex;\n if (options.maxStreamingBitrate !== undefined) payload.MaxStreamingBitrate = options.maxStreamingBitrate;\n if (options.mediaSourceId !== undefined) payload.MediaSourceId = options.mediaSourceId;\n if (options.deviceProfile !== undefined) payload.DeviceProfile = options.deviceProfile;\n if (options.autoOpenLiveStream !== undefined) payload.AutoOpenLiveStream = options.autoOpenLiveStream;\n\n return await this.http.request<PlaybackInfoResponse>(`/Items/${itemId}/PlaybackInfo`, {\n method: 'POST',\n body: payload\n });\n }\n\n /**\n * Get single item details by its Jellyfin ID.\n */\n async getItem(itemId: string): Promise<BaseItemDto | null> {\n if (!itemId) return null;\n const userId = this.requireUserId();\n return await this.http.request<BaseItemDto>(`/Users/${userId}/Items/${itemId}`, {\n params: {\n Fields: COMMON_ITEM_FIELDS\n }\n });\n }\n\n /**\n * Search Jellyfin library for songs, albums, artists, playlists, movies, or series.\n */\n async search(query: string, options: SearchOptions = {}): Promise<ItemsResponse> {\n if (!query || !query.trim()) {\n return { Items: [], TotalRecordCount: 0 };\n }\n\n const userId = options.userId || this.requireUserId();\n const {\n limit = 30,\n startIndex = 0,\n parentId,\n includeItemTypes = 'Audio,MusicAlbum,MusicArtist,Playlist,Movie,Series,Episode',\n mediaTypes,\n genres,\n years,\n isFavorite,\n sortBy,\n sortOrder,\n fields = COMMON_ITEM_FIELDS,\n recursive = true\n } = options;\n\n const params: Record<string, unknown> = {\n SearchTerm: query.trim(),\n Limit: limit,\n StartIndex: startIndex,\n Recursive: recursive,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n\n if (includeItemTypes) {\n params.IncludeItemTypes = Array.isArray(includeItemTypes)\n ? includeItemTypes.join(',')\n : includeItemTypes;\n }\n\n if (mediaTypes) {\n params.MediaTypes = Array.isArray(mediaTypes)\n ? mediaTypes.join(',')\n : mediaTypes;\n }\n\n if (genres && genres.length > 0) params.Genres = genres.join('|');\n if (years && years.length > 0) params.Years = years.join(',');\n if (isFavorite) params.Filters = 'IsFavorite';\n if (sortBy) params.SortBy = sortBy;\n if (sortOrder) params.SortOrder = sortOrder;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n}\n","import type { HttpTransport } from './http.js';\nimport type { BaseItemDto, CreatePlaylistOptions, ItemsResponse, UpdatePlaylistOptions } from './types.js';\nimport { JellyfinApiError, JellyfinError } from './errors.js';\n\nexport class PlaylistsModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private requireUserId(): string {\n const userId = this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for playlist operations.');\n }\n return userId;\n }\n\n /**\n * Get all playlists for the current user.\n */\n async getPlaylists(): Promise<ItemsResponse> {\n const userId = this.requireUserId();\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, {\n params: {\n IncludeItemTypes: 'Playlist',\n Recursive: true,\n Fields: 'PrimaryImageTag,ImageTags,DateCreated,DateLastMediaAdded,UserData'\n }\n });\n }\n\n /**\n * Get items belonging to a specific playlist.\n */\n async getPlaylistItems(playlistId: string): Promise<ItemsResponse> {\n if (!playlistId) {\n throw new JellyfinError('Playlist ID is required.');\n }\n const userId = this.requireUserId();\n return await this.http.request<ItemsResponse>(`/Playlists/${playlistId}/Items`, {\n params: {\n UserId: userId,\n Fields: 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,HasLyrics,UserData'\n }\n });\n }\n\n /**\n * Create a new playlist.\n * Jellyfin 12 requires a JSON request body with CreatePlaylistDto.\n * Falls back to legacy query parameters if server returns 400/415.\n */\n async createPlaylist(options: CreatePlaylistOptions): Promise<string> {\n const userId = options.userId || this.requireUserId();\n const { name, isPublic = false, trackIds = [], mediaType = 'Audio' } = options;\n\n if (!name || !name.trim()) {\n throw new JellyfinError('Playlist name is required.');\n }\n\n const idsArray = Array.isArray(trackIds) ? trackIds : [trackIds].filter(Boolean);\n let playlistId: string | undefined;\n\n try {\n // Modern Jellyfin 12+ API: JSON body (CreatePlaylistDto)\n const resData = await this.http.request<{ Id: string }>('/Playlists', {\n method: 'POST',\n body: {\n Name: name.trim(),\n Ids: idsArray,\n UserId: userId,\n MediaType: mediaType\n }\n });\n playlistId = resData?.Id;\n } catch (err) {\n // Graceful fallback for older Jellyfin servers (<10.8) expecting query params\n if (err instanceof JellyfinApiError && (err.status === 400 || err.status === 415)) {\n const idsStr = idsArray.join(',');\n const resData = await this.http.request<{ Id: string }>('/Playlists', {\n method: 'POST',\n params: {\n Name: name.trim(),\n UserId: userId,\n MediaType: mediaType,\n ...(idsStr ? { Ids: idsStr } : {})\n }\n });\n playlistId = resData?.Id;\n } else {\n throw err;\n }\n }\n\n if (playlistId && isPublic) {\n try {\n // Jellyfin 12 uses user permissions endpoint\n await this.http.request(`/Playlists/${playlistId}/Users/${userId}`, {\n method: 'POST',\n body: { UserId: userId, CanEdit: true }\n });\n } catch {\n // Fallback for legacy Jellyfin servers\n try {\n await this.http.request(`/Playlists/${playlistId}`, {\n method: 'POST',\n body: { IsPublic: true }\n });\n } catch (err) {\n console.warn('[Jellyfin SDK] Failed to update public status for playlist:', err);\n }\n }\n }\n\n return playlistId || '';\n }\n\n /**\n * Update playlist metadata (e.g. name).\n * Jellyfin 12 removed POST /Playlists/{id}; item updates use POST /Items/{id},\n * which is also supported across older Jellyfin versions.\n */\n async updatePlaylist(playlistId: string, options: UpdatePlaylistOptions): Promise<void> {\n if (!playlistId) {\n throw new JellyfinError('Playlist ID is required.');\n }\n\n const body: Record<string, unknown> = { Id: playlistId };\n if (options.name) body.Name = options.name;\n\n try {\n await this.http.request(`/Items/${playlistId}`, {\n method: 'POST',\n body\n });\n } catch (err) {\n // Fallback for legacy servers that only support POST /Playlists/{playlistId}\n await this.http.request(`/Playlists/${playlistId}`, {\n method: 'POST',\n body: options.name ? { Name: options.name } : {}\n });\n }\n }\n\n /**\n * Upload custom cover image for a playlist.\n */\n async uploadPlaylistImage(playlistId: string, base64ImageString: string, mimeType: string = 'image/jpeg'): Promise<void> {\n if (!playlistId || !base64ImageString) {\n throw new JellyfinError('Playlist ID and image data are required.');\n }\n\n const base64Data = base64ImageString.includes(',') ? base64ImageString.split(',')[1] : base64ImageString;\n\n await this.http.request(`/Items/${playlistId}/Images/Primary`, {\n method: 'POST',\n contentType: mimeType,\n body: base64Data\n });\n }\n\n /**\n * Delete a playlist.\n */\n async deletePlaylist(playlistId: string): Promise<void> {\n if (!playlistId) {\n throw new JellyfinError('Playlist ID is required.');\n }\n await this.http.request(`/Items/${playlistId}`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Add tracks to an existing playlist.\n */\n async addTracks(playlistId: string, trackIds: string | string[]): Promise<void> {\n if (!playlistId || !trackIds) return;\n const userId = this.requireUserId();\n\n const idsStr = Array.isArray(trackIds) ? trackIds.join(',') : trackIds;\n if (!idsStr) return;\n\n await this.http.request(`/Playlists/${playlistId}/Items`, {\n method: 'POST',\n params: {\n Ids: idsStr,\n UserId: userId\n }\n });\n }\n\n /**\n * Remove a track from a playlist by playlist entry ID or track ID.\n */\n async removeTrack(playlistId: string, entryIdOrTrackId: string): Promise<void> {\n if (!playlistId || !entryIdOrTrackId) return;\n\n try {\n await this.http.request(`/Playlists/${playlistId}/Items`, {\n method: 'DELETE',\n params: { EntryIds: entryIdOrTrackId }\n });\n } catch {\n // Fallback for older Jellyfin servers using ItemIds\n await this.http.request(`/Playlists/${playlistId}/Items`, {\n method: 'DELETE',\n params: { ItemIds: entryIdOrTrackId }\n });\n }\n }\n\n /**\n * Remove a specific playlist item by its unique entry ID (PlaylistItemId).\n * Especially recommended on Jellyfin 12+ when playlists contain duplicate tracks.\n */\n async removePlaylistItem(playlistId: string, playlistItemId: string): Promise<void> {\n return this.removeTrack(playlistId, playlistItemId);\n }\n}\n\n","import type { HttpTransport } from './http.js';\n\nexport class PlaybackModule {\n private http: HttpTransport;\n\n constructor(http: HttpTransport) {\n this.http = http;\n }\n\n /**\n * Report to the Jellyfin server that playback has started for an item.\n */\n async reportStart(itemId: string, positionTicks: number = 0): Promise<void> {\n if (!itemId || !this.http.getToken()) return;\n try {\n await this.http.request('/Sessions/Playing', {\n method: 'POST',\n body: {\n ItemId: itemId,\n PositionTicks: positionTicks,\n CanSeek: true,\n IsPaused: false\n }\n });\n } catch (e) {\n console.warn('[Jellyfin SDK] Start playback report error:', e);\n }\n }\n\n /**\n * Report current playback progress to the Jellyfin server.\n */\n async reportProgress(itemId: string, positionTicks: number = 0, isPaused: boolean = false): Promise<void> {\n if (!itemId || !this.http.getToken()) return;\n try {\n await this.http.request('/Sessions/Playing/Progress', {\n method: 'POST',\n body: {\n ItemId: itemId,\n PositionTicks: positionTicks,\n CanSeek: true,\n IsPaused: isPaused\n }\n });\n } catch (e) {\n console.warn('[Jellyfin SDK] Progress playback report error:', e);\n }\n }\n\n /**\n * Report that playback has stopped for an item.\n * Optionally teardown active transcoding session if playSessionId is provided.\n */\n async reportStopped(\n itemId: string,\n positionTicks: number = 0,\n options?: { playSessionId?: string }\n ): Promise<void> {\n if (!itemId || !this.http.getToken()) return;\n try {\n await this.http.request('/Sessions/Playing/Stopped', {\n method: 'POST',\n body: {\n ItemId: itemId,\n PositionTicks: positionTicks\n }\n });\n\n if (options?.playSessionId) {\n const deviceId = this.http.getClientInfo()?.deviceId;\n if (deviceId) {\n await this.http.request('/Videos/ActiveEncodings', {\n method: 'DELETE',\n params: {\n DeviceId: deviceId,\n PlaySessionId: options.playSessionId\n }\n }).catch((err) => {\n console.warn('[Jellyfin SDK] Teardown active encoding error:', err);\n });\n }\n }\n } catch (e) {\n console.warn('[Jellyfin SDK] Stop playback report error:', e);\n }\n }\n}\n\n","export type VideoQualityPresetKey =\n | 'auto'\n | 'direct'\n | '4k'\n | '1080p-high'\n | '1080p'\n | '720p-high'\n | '720p'\n | '480p'\n | '360p'\n | '240p';\n\nexport interface VideoQualityOption {\n key: VideoQualityPresetKey;\n label: string;\n bitrate?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type AudioQualityPresetKey =\n | 'direct'\n | '320k'\n | '256k'\n | '192k'\n | '128k'\n | '64k';\n\nexport interface AudioQualityOption {\n key: AudioQualityPresetKey;\n label: string;\n bitrate?: number;\n}\n\nexport const VIDEO_QUALITY_PRESETS: Record<VideoQualityPresetKey, VideoQualityOption> = {\n direct: { key: 'direct', label: 'Original (Direct)' },\n auto: { key: 'auto', label: 'Auto' },\n '4k': { key: '4k', label: '4K Ultra HD (60 Mbps)', bitrate: 60_000_000, maxWidth: 3840, maxHeight: 2160 },\n '1080p-high': { key: '1080p-high', label: '1080p High (20 Mbps)', bitrate: 20_000_000, maxWidth: 1920, maxHeight: 1080 },\n '1080p': { key: '1080p', label: '1080p (10 Mbps)', bitrate: 10_000_000, maxWidth: 1920, maxHeight: 1080 },\n '720p-high': { key: '720p-high', label: '720p High (6 Mbps)', bitrate: 6_000_000, maxWidth: 1280, maxHeight: 720 },\n '720p': { key: '720p', label: '720p (4 Mbps)', bitrate: 4_000_000, maxWidth: 1280, maxHeight: 720 },\n '480p': { key: '480p', label: '480p (2 Mbps)', bitrate: 2_000_000, maxWidth: 854, maxHeight: 480 },\n '360p': { key: '360p', label: '360p (1 Mbps)', bitrate: 1_000_000, maxWidth: 640, maxHeight: 360 },\n '240p': { key: '240p', label: '240p (420 kbps)', bitrate: 420_000, maxWidth: 426, maxHeight: 240 }\n};\n\nexport const AUDIO_QUALITY_PRESETS: Record<AudioQualityPresetKey, AudioQualityOption> = {\n direct: { key: 'direct', label: 'Original (Direct)' },\n '320k': { key: '320k', label: '320 kbps', bitrate: 320_000 },\n '256k': { key: '256k', label: '256 kbps', bitrate: 256_000 },\n '192k': { key: '192k', label: '192 kbps', bitrate: 192_000 },\n '128k': { key: '128k', label: '128 kbps', bitrate: 128_000 },\n '64k': { key: '64k', label: '64 kbps', bitrate: 64_000 }\n};\n\n/**\n * Returns a list of all available video quality presets.\n */\nexport function getVideoQualityList(): VideoQualityOption[] {\n return Object.values(VIDEO_QUALITY_PRESETS);\n}\n\n/**\n * Returns a list of all available audio quality presets.\n */\nexport function getAudioQualityList(): AudioQualityOption[] {\n return Object.values(AUDIO_QUALITY_PRESETS);\n}\n\n/**\n * Resolves video quality option into bitrate, maxWidth, and maxHeight constraints.\n */\nexport function resolveVideoQuality(\n quality?: VideoQualityPresetKey | VideoQualityOption | number | string\n): { maxStreamingBitrate?: number; maxWidth?: number; maxHeight?: number } {\n if (!quality) return {};\n\n if (typeof quality === 'number') {\n return { maxStreamingBitrate: quality };\n }\n\n if (typeof quality === 'string') {\n const key = quality.toLowerCase() as VideoQualityPresetKey;\n if (VIDEO_QUALITY_PRESETS[key]) {\n const preset = VIDEO_QUALITY_PRESETS[key];\n return {\n maxStreamingBitrate: preset.bitrate,\n maxWidth: preset.maxWidth,\n maxHeight: preset.maxHeight\n };\n }\n const parsed = parseInt(quality, 10);\n if (!Number.isNaN(parsed)) {\n return { maxStreamingBitrate: parsed };\n }\n return {};\n }\n\n if (typeof quality === 'object') {\n return {\n maxStreamingBitrate: quality.bitrate,\n maxWidth: quality.maxWidth,\n maxHeight: quality.maxHeight\n };\n }\n\n return {};\n}\n\n/**\n * Resolves audio quality option into bitrate constraint.\n */\nexport function resolveAudioQuality(\n quality?: AudioQualityPresetKey | AudioQualityOption | number | string\n): { maxStreamingBitrate?: number } {\n if (!quality) return {};\n\n if (typeof quality === 'number') {\n return { maxStreamingBitrate: quality };\n }\n\n if (typeof quality === 'string') {\n const key = quality.toLowerCase() as AudioQualityPresetKey;\n if (AUDIO_QUALITY_PRESETS[key]) {\n return { maxStreamingBitrate: AUDIO_QUALITY_PRESETS[key].bitrate };\n }\n const parsed = parseInt(quality, 10);\n if (!Number.isNaN(parsed)) {\n return { maxStreamingBitrate: parsed };\n }\n return {};\n }\n\n if (typeof quality === 'object' && quality.bitrate) {\n return { maxStreamingBitrate: quality.bitrate };\n }\n\n return {};\n}\n\n/**\n * Formats a bitrate in bps into a human-readable string (e.g. \"10 Mbps\", \"320 kbps\").\n */\nexport function formatBitrate(bitrate?: number): string {\n if (!bitrate || bitrate <= 0) return 'Direct';\n if (bitrate >= 1_000_000) {\n const mbps = bitrate / 1_000_000;\n return `${Number.isInteger(mbps) ? mbps : mbps.toFixed(1)} Mbps`;\n }\n const kbps = Math.round(bitrate / 1000);\n return `${kbps} kbps`;\n}\n\n","import type { HttpTransport } from './http.js';\nimport type {\n ArtworkUrlOptions,\n AudioHlsStreamOptions,\n AudioStreamOptions,\n BaseItemDto,\n DownloadUrlOptions,\n MediaSourceInfo,\n MediaStreamInfo,\n SubtitleTrackInfo,\n SubtitleUrlOptions,\n VideoHlsStreamOptions,\n VideoStreamOptions\n} from './types.js';\nimport { resolveAudioQuality, resolveVideoQuality } from './quality.js';\n\nexport class MediaModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n /**\n * Constructs the URL for an item's image/artwork.\n * If the item lacks images or server is not set, returns options.fallbackUrl or null.\n */\n getArtworkUrl(itemOrId: BaseItemDto | string | null | undefined, options: ArtworkUrlOptions = {}): string | null {\n const serverUrl = this.http.getServerUrl();\n const {\n imageType = 'Primary',\n maxWidth = 400,\n maxHeight,\n quality = 90,\n fallbackUrl = null\n } = options;\n\n if (!serverUrl || !itemOrId) return fallbackUrl;\n\n if (typeof itemOrId === 'object') {\n const item = itemOrId;\n let targetId: string | null = null;\n let tag: string | null = null;\n\n if (item.ImageTags && item.ImageTags[imageType]) {\n targetId = item.Id;\n tag = item.ImageTags[imageType];\n } else if (imageType === 'Primary' && item.PrimaryImageTag) {\n targetId = item.Id;\n tag = item.PrimaryImageTag;\n } else if (imageType === 'Primary' && item.AlbumPrimaryImageTag && item.AlbumId) {\n targetId = item.AlbumId;\n tag = item.AlbumPrimaryImageTag;\n }\n\n if (!targetId || !tag) {\n return fallbackUrl;\n }\n\n const params = new URLSearchParams({\n maxWidth: String(maxWidth),\n quality: String(quality),\n tag\n });\n if (maxHeight) params.append('maxHeight', String(maxHeight));\n\n return `${serverUrl}/Items/${targetId}/Images/${imageType}?${params.toString()}`;\n }\n\n if (typeof itemOrId === 'string' && itemOrId.trim() !== '') {\n const params = new URLSearchParams({\n maxWidth: String(maxWidth),\n quality: String(quality)\n });\n if (maxHeight) params.append('maxHeight', String(maxHeight));\n\n return `${serverUrl}/Items/${itemOrId}/Images/${imageType}?${params.toString()}`;\n }\n\n return fallbackUrl;\n }\n\n /**\n * Constructs the audio stream URL using Jellyfin's universal audio endpoint.\n * Transparently negotiates codecs (direct play or transcode to MP3/AAC as needed).\n */\n getAudioStreamUrl(itemId: string, options: AudioStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const userId = this.getUserId();\n const clientInfo = this.http.getClientInfo();\n\n if (!serverUrl || !itemId) return '';\n\n const qualityResolved = resolveAudioQuality(options.quality);\n const maxStreamingBitrate = options.maxStreamingBitrate ?? qualityResolved.maxStreamingBitrate;\n\n const {\n mediaSourceId,\n static: isStatic = false,\n startTimeTicks = 0,\n container = 'opus,mp3|mp3,aac,m4a,m4b,flac,wav,ogg',\n transcodingContainer = 'mp3',\n audioCodec = 'mp3',\n useQueryToken = true\n } = options;\n\n const endpoint = isStatic ? `/Audio/${itemId}/stream` : `/Audio/${itemId}/universal`;\n const url = new URL(`${serverUrl}${endpoint}`);\n\n if (token && useQueryToken) {\n url.searchParams.append('ApiKey', token);\n url.searchParams.append('api_key', token);\n url.searchParams.append('X-Emby-Token', token);\n }\n if (userId) url.searchParams.append('UserId', userId);\n\n const targetDeviceId = options.deviceId !== undefined ? options.deviceId : clientInfo.deviceId;\n if (targetDeviceId) url.searchParams.append('DeviceId', targetDeviceId);\n if (mediaSourceId) url.searchParams.append('MediaSourceId', mediaSourceId);\n\n if (isStatic) {\n url.searchParams.append('static', 'true');\n } else {\n url.searchParams.append('Container', container);\n url.searchParams.append('TranscodingContainer', transcodingContainer);\n url.searchParams.append('TranscodingProtocol', 'http');\n url.searchParams.append('AudioCodec', audioCodec);\n url.searchParams.append('EnableRedirection', 'true');\n url.searchParams.append('EnableRemoteMedia', 'false');\n }\n\n if (maxStreamingBitrate && maxStreamingBitrate !== 'Direct') {\n url.searchParams.append('MaxStreamingBitrate', String(maxStreamingBitrate));\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n return url.toString();\n }\n\n /**\n * Constructs the HLS master playlist URL for an audio stream.\n */\n getAudioHlsStreamUrl(itemId: string, options: AudioHlsStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const userId = this.getUserId();\n const clientInfo = this.http.getClientInfo();\n\n if (!serverUrl || !itemId) return '';\n\n const qualityResolved = resolveAudioQuality(options.quality);\n const maxStreamingBitrate = options.maxStreamingBitrate ?? qualityResolved.maxStreamingBitrate;\n\n const {\n mediaSourceId,\n startTimeTicks = 0,\n audioCodec = 'aac,mp3',\n segmentLength = 3,\n useQueryToken = true\n } = options;\n\n const url = new URL(`${serverUrl}/Audio/${itemId}/master.m3u8`);\n if (token && useQueryToken) {\n url.searchParams.append('ApiKey', token);\n url.searchParams.append('api_key', token);\n url.searchParams.append('X-Emby-Token', token);\n }\n if (userId) url.searchParams.append('UserId', userId);\n\n const targetDeviceId = options.deviceId !== undefined ? options.deviceId : clientInfo.deviceId;\n if (targetDeviceId) url.searchParams.append('DeviceId', targetDeviceId);\n\n if (mediaSourceId) {\n url.searchParams.append('MediaSourceId', mediaSourceId);\n }\n url.searchParams.append('AudioCodec', audioCodec);\n url.searchParams.append('TranscodingContainer', 'ts');\n url.searchParams.append('TranscodingProtocol', 'hls');\n url.searchParams.append('SegmentLength', String(segmentLength));\n url.searchParams.append('MinSegments', '2');\n\n if (maxStreamingBitrate && maxStreamingBitrate !== 'Direct') {\n url.searchParams.append('MaxStreamingBitrate', String(maxStreamingBitrate));\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n return url.toString();\n }\n\n /**\n * Constructs the progressive/universal video stream URL.\n * Supports direct play (static=true) or on-the-fly transcoding with quality, audio, and subtitle options.\n */\n getVideoStreamUrl(itemId: string, options: VideoStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const userId = this.getUserId();\n const clientInfo = this.http.getClientInfo();\n\n if (!serverUrl || !itemId) return '';\n\n const qualityResolved = resolveVideoQuality(options.quality);\n const maxStreamingBitrate = options.maxStreamingBitrate ?? qualityResolved.maxStreamingBitrate;\n const maxWidth = options.maxWidth ?? qualityResolved.maxWidth;\n const maxHeight = options.maxHeight ?? qualityResolved.maxHeight;\n\n const {\n mediaSourceId = itemId,\n static: isStatic = false,\n videoCodec = 'h264,hevc,vp9,av1',\n audioCodec = 'aac,mp3,opus,flac',\n maxFramerate,\n audioStreamIndex,\n subtitleStreamIndex,\n subtitleMethod,\n startTimeTicks = 0,\n container,\n transcodingContainer = 'ts',\n transcodingProtocol = 'http',\n useQueryToken = true\n } = options;\n\n const endpoint = container && !container.includes(',')\n ? `/Videos/${itemId}/stream.${container}`\n : `/Videos/${itemId}/stream`;\n\n const url = new URL(`${serverUrl}${endpoint}`);\n if (token && useQueryToken) {\n url.searchParams.append('ApiKey', token);\n url.searchParams.append('api_key', token);\n url.searchParams.append('X-Emby-Token', token);\n }\n if (userId) url.searchParams.append('UserId', userId);\n\n const targetDeviceId = options.deviceId !== undefined ? options.deviceId : clientInfo.deviceId;\n if (targetDeviceId) url.searchParams.append('DeviceId', targetDeviceId);\n if (mediaSourceId) url.searchParams.append('MediaSourceId', mediaSourceId);\n\n if (isStatic) {\n url.searchParams.append('Static', 'true');\n } else {\n url.searchParams.append('VideoCodec', videoCodec);\n url.searchParams.append('AudioCodec', audioCodec);\n url.searchParams.append('TranscodingContainer', transcodingContainer);\n url.searchParams.append('TranscodingProtocol', transcodingProtocol);\n\n if (maxStreamingBitrate && maxStreamingBitrate !== 'Direct') {\n url.searchParams.append('MaxStreamingBitrate', String(maxStreamingBitrate));\n }\n if (maxWidth) url.searchParams.append('MaxWidth', String(maxWidth));\n if (maxHeight) url.searchParams.append('MaxHeight', String(maxHeight));\n if (maxFramerate) url.searchParams.append('MaxFramerate', String(maxFramerate));\n }\n\n if (audioStreamIndex !== undefined && audioStreamIndex !== null) {\n url.searchParams.append('AudioStreamIndex', String(audioStreamIndex));\n }\n if (subtitleStreamIndex !== undefined && subtitleStreamIndex !== null) {\n url.searchParams.append('SubtitleStreamIndex', String(subtitleStreamIndex));\n if (subtitleMethod) url.searchParams.append('SubtitleMethod', subtitleMethod);\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n url.searchParams.append('EnableRedirection', 'true');\n url.searchParams.append('EnableRemoteMedia', 'false');\n\n return url.toString();\n }\n\n /**\n * Constructs the HLS master playlist URL for an adaptive video stream.\n */\n getVideoHlsStreamUrl(itemId: string, options: VideoHlsStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const userId = this.getUserId();\n const clientInfo = this.http.getClientInfo();\n\n if (!serverUrl || !itemId) return '';\n\n const qualityResolved = resolveVideoQuality(options.quality);\n const maxStreamingBitrate = options.maxStreamingBitrate ?? qualityResolved.maxStreamingBitrate;\n const maxWidth = options.maxWidth ?? qualityResolved.maxWidth;\n const maxHeight = options.maxHeight ?? qualityResolved.maxHeight;\n\n const {\n mediaSourceId = itemId,\n videoCodec = 'h264,hevc,vp9,av1',\n audioCodec = 'aac,mp3,opus',\n maxFramerate,\n segmentLength = 3,\n minSegments = 2,\n audioStreamIndex,\n subtitleStreamIndex,\n subtitleMethod,\n transcodingContainer = 'ts',\n transcodingProtocol = 'hls',\n startTimeTicks = 0,\n useQueryToken = true\n } = options;\n\n const url = new URL(`${serverUrl}/Videos/${itemId}/master.m3u8`);\n if (token && useQueryToken) {\n url.searchParams.append('ApiKey', token);\n url.searchParams.append('api_key', token);\n url.searchParams.append('X-Emby-Token', token);\n }\n if (userId) url.searchParams.append('UserId', userId);\n\n const targetDeviceId = options.deviceId !== undefined ? options.deviceId : clientInfo.deviceId;\n if (targetDeviceId) url.searchParams.append('DeviceId', targetDeviceId);\n if (mediaSourceId) url.searchParams.append('MediaSourceId', mediaSourceId);\n\n url.searchParams.append('VideoCodec', videoCodec);\n url.searchParams.append('AudioCodec', audioCodec);\n url.searchParams.append('TranscodingContainer', transcodingContainer);\n url.searchParams.append('TranscodingProtocol', transcodingProtocol);\n url.searchParams.append('SegmentLength', String(segmentLength));\n url.searchParams.append('MinSegments', String(minSegments));\n\n if (maxStreamingBitrate && maxStreamingBitrate !== 'Direct') {\n url.searchParams.append('MaxStreamingBitrate', String(maxStreamingBitrate));\n }\n if (maxWidth) url.searchParams.append('MaxWidth', String(maxWidth));\n if (maxHeight) url.searchParams.append('MaxHeight', String(maxHeight));\n if (maxFramerate) url.searchParams.append('MaxFramerate', String(maxFramerate));\n\n if (audioStreamIndex !== undefined && audioStreamIndex !== null) {\n url.searchParams.append('AudioStreamIndex', String(audioStreamIndex));\n }\n if (subtitleStreamIndex !== undefined && subtitleStreamIndex !== null) {\n url.searchParams.append('SubtitleStreamIndex', String(subtitleStreamIndex));\n if (subtitleMethod) url.searchParams.append('SubtitleMethod', subtitleMethod);\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n return url.toString();\n }\n\n /**\n * Constructs the URL for streaming a specific subtitle track.\n */\n getSubtitleUrl(\n itemId: string,\n mediaSourceId: string,\n subtitleStreamIndex: number,\n options: SubtitleUrlOptions = {}\n ): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const { format = 'vtt', useQueryToken = true, startTimeTicks = 0 } = options;\n\n if (!serverUrl || !itemId) return '';\n\n const sourceId = mediaSourceId || itemId;\n const url = new URL(`${serverUrl}/Videos/${itemId}/${sourceId}/Subtitles/${subtitleStreamIndex}/Stream.${format}`);\n if (token && useQueryToken) {\n url.searchParams.append('ApiKey', token);\n url.searchParams.append('api_key', token);\n }\n if (startTimeTicks > 0) {\n url.searchParams.append('StartTimeTicks', String(startTimeTicks));\n }\n\n return url.toString();\n }\n\n /**\n * Fetches subtitle content as raw text (e.g. WebVTT or SRT format).\n */\n async getSubtitles(\n itemId: string,\n mediaSourceId: string,\n subtitleStreamIndex: number,\n options: SubtitleUrlOptions = {}\n ): Promise<string> {\n const { format = 'vtt', startTimeTicks = 0 } = options;\n const sourceId = mediaSourceId || itemId;\n const params: Record<string, unknown> = {};\n if (startTimeTicks > 0) {\n params.StartTimeTicks = startTimeTicks;\n }\n\n return await this.http.requestText(\n `/Videos/${itemId}/${sourceId}/Subtitles/${subtitleStreamIndex}/Stream.${format}`,\n { params }\n );\n }\n\n /**\n * Extracts and normalizes subtitle streams from an item or media source into SubtitleTrackInfo objects with URLs.\n */\n getSubtitleTracks(itemOrMediaSource: BaseItemDto | MediaSourceInfo): SubtitleTrackInfo[] {\n if (!itemOrMediaSource) return [];\n\n let streams: MediaStreamInfo[] = [];\n let itemId = '';\n let mediaSourceId = '';\n\n if ('MediaSources' in itemOrMediaSource && Array.isArray(itemOrMediaSource.MediaSources)) {\n itemId = itemOrMediaSource.Id;\n const primarySource = itemOrMediaSource.MediaSources[0];\n if (primarySource) {\n mediaSourceId = primarySource.Id || itemId;\n streams = primarySource.MediaStreams || [];\n }\n } else if ('MediaStreams' in itemOrMediaSource && Array.isArray(itemOrMediaSource.MediaStreams)) {\n const source = itemOrMediaSource as MediaSourceInfo;\n mediaSourceId = source.Id || '';\n itemId = mediaSourceId;\n streams = source.MediaStreams || [];\n }\n\n return streams\n .filter((s) => s.Type === 'Subtitle')\n .map((s) => {\n const index = s.Index ?? 0;\n const codec = (s.Codec || 'vtt').toLowerCase();\n const preferredFormat = codec === 'subrip' || codec === 'srt' ? 'srt' : 'vtt';\n const url = itemId ? this.getSubtitleUrl(itemId, mediaSourceId, index, { format: preferredFormat }) : '';\n\n return {\n index,\n codec: s.Codec || 'vtt',\n language: s.Language,\n displayTitle: s.DisplayTitle || s.Language || `Subtitle ${index}`,\n displayLanguage: s.DisplayLanguage,\n isDefault: !!s.IsDefault,\n isForced: !!s.IsForced,\n isExternal: !!s.IsExternal,\n deliveryMethod: s.DeliveryMethod,\n deliveryUrl: s.DeliveryUrl,\n url\n };\n });\n }\n\n /**\n * Constructs the direct download URL for an original, unmodified media file on the Jellyfin server.\n */\n getDownloadUrl(itemId: string, options: DownloadUrlOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const { useQueryToken = true, filename } = options;\n\n if (!serverUrl || !itemId) return '';\n\n const url = new URL(`${serverUrl}/Items/${itemId}/Download`);\n if (token && useQueryToken) {\n url.searchParams.append('ApiKey', token);\n url.searchParams.append('api_key', token);\n }\n if (filename) {\n url.searchParams.append('filename', filename);\n }\n\n return url.toString();\n }\n\n /**\n * Downloads a media file as a Blob with optional progress monitoring.\n */\n async downloadFile(\n itemId: string,\n options: {\n onProgress?: (progressFraction: number) => void;\n useQueryToken?: boolean;\n } = {}\n ): Promise<Blob> {\n const downloadUrl = this.getDownloadUrl(itemId, { useQueryToken: options.useQueryToken });\n if (!downloadUrl) {\n throw new Error('Cannot construct download URL: missing serverUrl or itemId');\n }\n\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n throw new Error(`Download failed with status ${response.status}: ${response.statusText}`);\n }\n\n const contentLength = parseInt(response.headers.get('Content-Length') || '0', 10) || 0;\n const reader = response.body ? response.body.getReader() : null;\n\n if (reader && contentLength > 0) {\n const chunks: BlobPart[] = [];\n let received = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n received += value.length;\n if (options.onProgress) {\n options.onProgress(received / contentLength);\n }\n }\n }\n return new Blob(chunks, { type: response.headers.get('Content-Type') || 'application/octet-stream' });\n }\n\n const blob = await response.blob();\n if (options.onProgress) {\n options.onProgress(1);\n }\n return blob;\n }\n\n /**\n * Returns authentication headers for media streaming requests (e.g., configuring hls.js xhrSetup).\n * Crucial for Jellyfin 12+ servers where query-based auth (?api_key=) is disabled.\n * Pass { legacy: false } to only send Authorization and avoid conflicting headers or reverse-proxy CORS rejections.\n */\n getStreamHeaders(options: { legacy?: boolean } = {}): Record<string, string> {\n const authHeader = this.http.getAuthHeader();\n const headers: Record<string, string> = {\n Authorization: authHeader\n };\n if (options.legacy ?? true) {\n headers['X-Emby-Authorization'] = authHeader;\n }\n return headers;\n }\n}\n","import type { HttpTransport } from './http.js';\nimport type { LyricsDto } from './types.js';\n\nexport class LyricsModule {\n private http: HttpTransport;\n\n constructor(http: HttpTransport) {\n this.http = http;\n }\n\n /**\n * Fetch synced or unsynced lyrics for an audio item.\n */\n async getLyrics(itemId: string): Promise<LyricsDto | null> {\n if (!itemId) return null;\n try {\n return await this.http.request<LyricsDto>(`/Audio/${itemId}/Lyrics`);\n } catch (err) {\n console.warn('[Jellyfin SDK] Failed to fetch lyrics:', err);\n return null;\n }\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport { JellyfinError } from './errors.js';\n\nexport class FavoritesModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private requireUserId(): string {\n const userId = this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required to mark favorites.');\n }\n return userId;\n }\n\n /**\n * Mark an item as favorite.\n */\n async markFavorite(itemId: string): Promise<void> {\n if (!itemId) return;\n const userId = this.requireUserId();\n await this.http.request(`/Users/${userId}/FavoriteItems/${itemId}`, {\n method: 'POST'\n });\n }\n\n /**\n * Unmark an item as favorite.\n */\n async unmarkFavorite(itemId: string): Promise<void> {\n if (!itemId) return;\n const userId = this.requireUserId();\n await this.http.request(`/Users/${userId}/FavoriteItems/${itemId}`, {\n method: 'DELETE'\n });\n }\n}\n\n","import type { BaseItemDto, DownloadItemOptions } from './types.js';\nimport type { MediaModule } from './media.js';\n\nexport interface DownloadRecord {\n id: string;\n name: string;\n mediaType?: 'Audio' | 'Video' | string;\n type?: string;\n artists?: string;\n album?: string;\n albumId?: string;\n seriesName?: string;\n seriesId?: string;\n seasonName?: string;\n seasonId?: string;\n artworkUrl: string | null;\n size: number;\n savedAt: number;\n hasLyrics?: boolean;\n parentId?: string;\n parentName?: string;\n parentType?: string;\n parentArtworkUrl?: string;\n parentOwner?: string;\n parentCount?: number;\n index?: number;\n blob?: Blob;\n mimeType?: string;\n}\n\nexport interface DownloadProgress {\n completed: number;\n total: number;\n item: BaseItemDto;\n track?: BaseItemDto; // For backward compatibility\n res: { ok: boolean; size?: number; removed?: boolean; error?: string };\n}\n\nexport class OfflineStorageManager {\n private media: MediaModule;\n private dbName: string;\n private dbVersion: number;\n private storeName: string;\n private dbPromise: Promise<IDBDatabase | null> | null = null;\n private objectUrlCache = new Map<string, string>();\n private downloadStatusCache = new Map<string, boolean>();\n\n constructor(media: MediaModule, dbName = 'JellyfinOfflineAudio', dbVersion = 1, storeName = 'tracks') {\n this.media = media;\n this.dbName = dbName;\n this.dbVersion = dbVersion;\n this.storeName = storeName;\n }\n\n isSupported(): boolean {\n return typeof window !== 'undefined' && 'indexedDB' in window;\n }\n\n async initDB(): Promise<IDBDatabase | null> {\n if (this.dbPromise) return this.dbPromise;\n\n this.dbPromise = new Promise((resolve) => {\n if (!this.isSupported()) {\n resolve(null);\n return;\n }\n\n const request = indexedDB.open(this.dbName, this.dbVersion);\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName, { keyPath: 'id' });\n }\n };\n\n request.onsuccess = (event) => {\n resolve((event.target as IDBOpenDBRequest).result);\n };\n\n request.onerror = (event) => {\n console.warn('[Jellyfin Offline] IndexedDB open error:', (event.target as IDBOpenDBRequest).error);\n resolve(null);\n };\n });\n\n return this.dbPromise;\n }\n\n private getItemKey(item: BaseItemDto | { id?: string; Id?: string }): string {\n return item ? String(item.Id || item.id || '') : '';\n }\n\n private dispatchDownloadChanged(itemId: string, downloaded: boolean): void {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(\n new CustomEvent('jellyfin-download-changed', {\n detail: { itemId, trackId: itemId, downloaded }\n })\n );\n }\n\n private revokeObjectUrl(id: string): void {\n const url = this.objectUrlCache.get(id);\n if (url) {\n try {\n URL.revokeObjectURL(url);\n } catch {\n // ignore\n }\n this.objectUrlCache.delete(id);\n }\n }\n\n async getDownloadedRecord(id: string): Promise<DownloadRecord | null> {\n if (!id) return null;\n try {\n const db = await this.initDB();\n if (!db) return null;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readonly');\n const store = tx.objectStore(this.storeName);\n const request = store.get(String(id));\n\n request.onsuccess = () => resolve((request.result as DownloadRecord) || null);\n request.onerror = () => resolve(null);\n });\n } catch (err) {\n console.warn(`[Jellyfin Offline] getDownloadedRecord error for ${id}:`, err);\n return null;\n }\n }\n\n async isItemDownloaded(id: string): Promise<boolean> {\n if (!id) return false;\n const key = String(id);\n if (this.downloadStatusCache.has(key)) {\n return this.downloadStatusCache.get(key)!;\n }\n\n const record = await this.getDownloadedRecord(key);\n const exists = !!record;\n this.downloadStatusCache.set(key, exists);\n return exists;\n }\n\n isItemDownloadedSync(id: string): boolean {\n if (!id) return false;\n return this.downloadStatusCache.get(String(id)) === true;\n }\n\n // Backward compatibility aliases\n async isTrackDownloaded(id: string): Promise<boolean> {\n return this.isItemDownloaded(id);\n }\n\n isTrackDownloadedSync(id: string): boolean {\n return this.isItemDownloadedSync(id);\n }\n\n async getDownloadedBlobUrl(id: string): Promise<string | null> {\n if (!id) return null;\n const key = String(id);\n if (this.objectUrlCache.has(key)) return this.objectUrlCache.get(key)!;\n\n const record = await this.getDownloadedRecord(key);\n if (!record || !record.blob) return null;\n\n const url = URL.createObjectURL(record.blob);\n this.objectUrlCache.set(key, url);\n return url;\n }\n\n getDownloadedBlobUrlSync(id: string): string | null {\n if (!id) return null;\n return this.objectUrlCache.get(String(id)) || null;\n }\n\n async getAllDownloads(): Promise<DownloadRecord[]> {\n try {\n const db = await this.initDB();\n if (!db) return [];\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readonly');\n const store = tx.objectStore(this.storeName);\n const request = store.getAll();\n\n request.onsuccess = () => {\n const records = (request.result || []) as DownloadRecord[];\n resolve(records.sort((a, b) => (b.savedAt || 0) - (a.savedAt || 0)));\n };\n request.onerror = () => resolve([]);\n });\n } catch (err) {\n console.warn('[Jellyfin Offline] getAllDownloads error:', err);\n return [];\n }\n }\n\n async warmOfflineCache(): Promise<void> {\n try {\n const downloads = await this.getAllDownloads();\n for (const item of downloads) {\n if (item && item.id) {\n const key = String(item.id);\n this.downloadStatusCache.set(key, true);\n if (item.blob && !this.objectUrlCache.has(key)) {\n try {\n this.objectUrlCache.set(key, URL.createObjectURL(item.blob));\n } catch {\n // ignore\n }\n }\n }\n }\n } catch (err) {\n console.warn('[Jellyfin Offline] warmOfflineCache error:', err);\n }\n }\n\n async saveDownloadRecord(record: DownloadRecord, blob: Blob): Promise<boolean> {\n try {\n const db = await this.initDB();\n if (!db) return false;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const entry = { ...record, blob };\n const request = store.put(entry);\n\n request.onsuccess = () => resolve(true);\n request.onerror = () => resolve(false);\n });\n } catch (err) {\n console.warn('[Jellyfin Offline] saveDownloadRecord error:', err);\n return false;\n }\n }\n\n async removeDownload(id: string): Promise<boolean> {\n if (!id) return false;\n const key = String(id);\n try {\n const db = await this.initDB();\n if (!db) return false;\n\n const removed = await new Promise<boolean>((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const request = store.delete(key);\n\n request.onsuccess = () => resolve(true);\n request.onerror = () => resolve(false);\n });\n\n if (removed) {\n this.revokeObjectUrl(key);\n this.downloadStatusCache.set(key, false);\n this.dispatchDownloadChanged(key, false);\n }\n return removed;\n } catch (err) {\n console.warn('[Jellyfin Offline] removeDownload error:', err);\n return false;\n }\n }\n\n /**\n * Downloads an audio or video item to offline storage.\n * If already downloaded, toggles it off (removes it).\n */\n async downloadItem(\n item: BaseItemDto,\n onProgress?: (progressFraction: number) => void,\n group?: { id?: string; name?: string; type?: string; artworkUrl?: string; owner?: string; count?: number } | null,\n index?: number,\n options: DownloadItemOptions = {}\n ): Promise<{ ok: boolean; size?: number; removed?: boolean; error?: string }> {\n if (!item) return { ok: false, error: 'no-item' };\n\n const key = this.getItemKey(item);\n if (!key) return { ok: false, error: 'no-id' };\n\n // If already downloaded, toggle off (remove)\n if (await this.isItemDownloaded(key)) {\n await this.removeDownload(key);\n return { ok: true, removed: true };\n }\n\n const isVideo = item.MediaType === 'Video' || item.Type === 'Movie' || item.Type === 'Episode' || item.Type === 'Video';\n let sourceUrl = '';\n\n if (isVideo) {\n if (options.quality) {\n sourceUrl = this.media.getVideoStreamUrl(key, { quality: options.quality });\n } else {\n sourceUrl = this.media.getDownloadUrl(key);\n }\n } else {\n sourceUrl = this.media.getAudioStreamUrl(key, { maxStreamingBitrate: 'Direct' });\n }\n\n if (!sourceUrl) return { ok: false, error: 'no-url' };\n\n let response: Response;\n try {\n response = await fetch(sourceUrl);\n } catch (err) {\n console.warn('[Jellyfin Offline] Download fetch error:', err);\n return { ok: false, error: 'network' };\n }\n\n if (!response.ok) {\n return { ok: false, error: `http-${response.status}` };\n }\n\n const contentLength = parseInt(response.headers.get('Content-Length') || '0', 10) || 0;\n\n try {\n const reader = response.body ? response.body.getReader() : null;\n let blob: Blob;\n\n const mimeType = response.headers.get('Content-Type') || (isVideo ? 'video/mp4' : 'audio/mpeg');\n\n if (reader) {\n const chunks: BlobPart[] = [];\n let received = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n received += value.length;\n if (onProgress) {\n onProgress(contentLength > 0 ? received / contentLength : 0);\n }\n }\n }\n blob = new Blob(chunks, { type: mimeType });\n } else {\n blob = await response.blob();\n if (onProgress) onProgress(1);\n }\n\n const record: DownloadRecord = {\n id: key,\n name: item.Name || 'Unknown',\n mediaType: isVideo ? 'Video' : 'Audio',\n type: item.Type,\n artists: item.Artists ? item.Artists.join(', ') : (item.AlbumArtist || ''),\n album: item.Album || '',\n albumId: item.AlbumId || '',\n seriesName: (item.SeriesName as string) || undefined,\n seriesId: (item.SeriesId as string) || undefined,\n seasonName: (item.SeasonName as string) || undefined,\n seasonId: (item.SeasonId as string) || undefined,\n artworkUrl: this.media.getArtworkUrl(item, { maxWidth: 300 }),\n size: blob.size,\n savedAt: Date.now(),\n hasLyrics: !!item.HasLyrics,\n mimeType\n };\n\n if (group && group.id) {\n record.parentId = String(group.id);\n record.parentName = group.name || '';\n record.parentType = group.type || '';\n record.parentArtworkUrl = group.artworkUrl || '';\n record.parentOwner = group.owner || '';\n record.parentCount = group.count || 0;\n }\n\n if (typeof index === 'number' && !Number.isNaN(index)) {\n record.index = index;\n } else if (typeof item.IndexNumber === 'number') {\n record.index = item.IndexNumber;\n }\n\n const saved = await this.saveDownloadRecord(record, blob);\n if (!saved) return { ok: false, error: 'storage' };\n\n this.revokeObjectUrl(key);\n this.downloadStatusCache.set(key, true);\n this.dispatchDownloadChanged(key, true);\n return { ok: true, size: blob.size };\n } catch (err) {\n console.warn('[Jellyfin Offline] Download processing failed:', err);\n return { ok: false, error: 'unknown' };\n }\n }\n\n /**\n * Backward-compatible alias for downloadItem.\n */\n async downloadTrack(\n track: BaseItemDto,\n onProgress?: (progressFraction: number) => void,\n group?: { id?: string; name?: string; type?: string; artworkUrl?: string; owner?: string; count?: number } | null,\n index?: number\n ): Promise<{ ok: boolean; size?: number; removed?: boolean; error?: string }> {\n return this.downloadItem(track, onProgress, group, index);\n }\n\n /**\n * Downloads multiple items with aggregated progress callbacks.\n */\n async downloadItems(\n items: BaseItemDto[],\n onProgress?: (progress: DownloadProgress) => void,\n group?: { id?: string; name?: string; type?: string; artworkUrl?: string; owner?: string; count?: number } | null,\n options: DownloadItemOptions = {}\n ): Promise<{ ok: boolean; downloaded: number; failed: number; total: number }> {\n const targets: BaseItemDto[] = [];\n for (const item of items || []) {\n const key = item && (item.Id || (item as unknown as { id?: string }).id);\n if (key && !(await this.isItemDownloaded(key))) {\n targets.push(item);\n }\n }\n\n const total = targets.length;\n let completed = 0;\n let failed = 0;\n\n for (let i = 0; i < targets.length; i++) {\n const res = await this.downloadItem(targets[i], undefined, group, i, options);\n completed++;\n if (!res.ok) failed++;\n if (onProgress) {\n onProgress({ completed, total, item: targets[i], track: targets[i], res });\n }\n }\n\n return { ok: failed === 0 && total > 0, downloaded: total - failed, failed, total };\n }\n\n /**\n * Backward-compatible alias for downloadItems.\n */\n async downloadTracks(\n tracks: BaseItemDto[],\n onProgress?: (progress: DownloadProgress) => void,\n group?: { id?: string; name?: string; type?: string; artworkUrl?: string; owner?: string; count?: number } | null\n ): Promise<{ ok: boolean; downloaded: number; failed: number; total: number }> {\n return this.downloadItems(tracks, onProgress, group);\n }\n\n async removeDownloads(items: BaseItemDto[]): Promise<{ ok: boolean; removed: number }> {\n let removed = 0;\n for (const item of items || []) {\n const key = item && (item.Id || (item as unknown as { id?: string }).id);\n if (key && (await this.removeDownload(key))) removed++;\n }\n return { ok: removed > 0, removed };\n }\n\n formatBytes(bytes: number): string {\n if (!bytes || bytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)));\n return `${(bytes / Math.pow(1024, i)).toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n }\n}\n","import type { HttpTransport } from './http.js';\nimport type { GetResumeItemsOptions, ItemsResponse } from './types.js';\nimport { JellyfinError } from './errors.js';\n\nconst RESUME_ITEM_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,Chapters,HasLyrics,Overview,Genres,Studios,ProductionYear,OfficialRating,CommunityRating,CriticRating,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class ResumeModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n const userId = explicitUserId || this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for resume requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Fetch items currently in-progress for the user via /UserItems/Resume.\n */\n async getResumeItems(options: GetResumeItemsOptions = {}): Promise<ItemsResponse> {\n const userId = this.resolveUserId(options.userId);\n const {\n limit = 20,\n startIndex = 0,\n parentId,\n mediaTypes,\n enableImages,\n enableUserData,\n imageTypeLimit,\n enableImageTypes,\n fields = RESUME_ITEM_FIELDS\n } = options;\n\n const params: Record<string, unknown> = {\n UserId: userId,\n Limit: limit,\n StartIndex: startIndex,\n Recursive: true,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n if (mediaTypes && mediaTypes.length > 0) params.MediaTypes = mediaTypes.join(',');\n if (enableImages !== undefined) params.EnableImages = enableImages;\n if (enableUserData !== undefined) params.EnableUserData = enableUserData;\n if (imageTypeLimit !== undefined) params.ImageTypeLimit = imageTypeLimit;\n if (enableImageTypes && enableImageTypes.length > 0) params.EnableImageTypes = enableImageTypes.join(',');\n\n return await this.http.request<ItemsResponse>('/UserItems/Resume', { params });\n }\n\n /**\n * Convenience alias for getResumeItems.\n */\n async getItems(options: GetResumeItemsOptions = {}): Promise<ItemsResponse> {\n return await this.getResumeItems(options);\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { GetNextUpOptions, ItemsResponse } from './types.js';\nimport { JellyfinError } from './errors.js';\n\nconst NEXT_UP_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AudioInfo,MediaSources,Chapters,Overview,Genres,ProductionYear,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class NextUpModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n const userId = explicitUserId || this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for next up requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Fetch the next unplayed episodes for followed series via /Shows/NextUp.\n */\n async getNextUp(options: GetNextUpOptions = {}): Promise<ItemsResponse> {\n const userId = this.resolveUserId(options.userId);\n const {\n limit = 24,\n startIndex = 0,\n parentId,\n seriesId,\n fields = NEXT_UP_FIELDS,\n enableImages,\n enableUserData,\n enableTotalRecordCount,\n imageTypeLimit,\n enableImageTypes,\n disableFirstEpisode,\n nextUpDateCutoff\n } = options;\n\n const params: Record<string, unknown> = {\n UserId: userId,\n Limit: limit,\n StartIndex: startIndex,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n if (seriesId) params.SeriesId = seriesId;\n if (enableImages !== undefined) params.EnableImages = enableImages;\n if (enableUserData !== undefined) params.EnableUserData = enableUserData;\n if (enableTotalRecordCount !== undefined) params.EnableTotalRecordCount = enableTotalRecordCount;\n if (imageTypeLimit !== undefined) params.ImageTypeLimit = imageTypeLimit;\n if (enableImageTypes && enableImageTypes.length > 0) params.EnableImageTypes = enableImageTypes.join(',');\n if (disableFirstEpisode !== undefined) params.DisableFirstEpisode = disableFirstEpisode;\n if (nextUpDateCutoff) params.NextUpDateCutoff = nextUpDateCutoff;\n\n return await this.http.request<ItemsResponse>('/Shows/NextUp', { params });\n }\n\n /**\n * Convenience alias for getNextUp.\n */\n async getEpisodes(options: GetNextUpOptions = {}): Promise<ItemsResponse> {\n return await this.getNextUp(options);\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { BaseItemDto, GetLatestMediaOptions } from './types.js';\nimport { JellyfinError } from './errors.js';\n\nconst LATEST_ITEM_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,Chapters,Overview,Genres,Studios,ProductionYear,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class LatestModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n const userId = explicitUserId || this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for latest media requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Fetch recently added media items for the user via /Users/{userId}/Items/Latest.\n */\n async getLatest(options: GetLatestMediaOptions = {}): Promise<BaseItemDto[]> {\n const userId = this.resolveUserId(options.userId);\n const {\n parentId,\n limit = 20,\n fields = LATEST_ITEM_FIELDS,\n includeItemTypes,\n isPlayed,\n enableImages,\n imageTypeLimit,\n enableImageTypes,\n groupItems\n } = options;\n\n const params: Record<string, unknown> = {\n Limit: limit,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n if (includeItemTypes && includeItemTypes.length > 0) {\n params.IncludeItemTypes = includeItemTypes.join(',');\n }\n if (isPlayed !== undefined) params.IsPlayed = isPlayed;\n if (enableImages !== undefined) params.EnableImages = enableImages;\n if (imageTypeLimit !== undefined) params.ImageTypeLimit = imageTypeLimit;\n if (enableImageTypes && enableImageTypes.length > 0) {\n params.EnableImageTypes = enableImageTypes.join(',');\n }\n if (groupItems !== undefined) params.GroupItems = groupItems;\n\n const result = await this.http.request<BaseItemDto[]>(`/Users/${userId}/Items/Latest`, { params });\n return Array.isArray(result) ? result : [];\n }\n\n /**\n * Convenience helper to fetch recently added movies.\n */\n async getLatestMovies(options: Omit<GetLatestMediaOptions, 'includeItemTypes'> = {}): Promise<BaseItemDto[]> {\n return await this.getLatest({ ...options, includeItemTypes: ['Movie'] });\n }\n\n /**\n * Convenience helper to fetch recently added TV episodes.\n */\n async getLatestEpisodes(options: Omit<GetLatestMediaOptions, 'includeItemTypes'> = {}): Promise<BaseItemDto[]> {\n return await this.getLatest({ ...options, includeItemTypes: ['Episode'] });\n }\n\n /**\n * Convenience helper to fetch recently added music albums.\n */\n async getLatestAlbums(options: Omit<GetLatestMediaOptions, 'includeItemTypes'> = {}): Promise<BaseItemDto[]> {\n return await this.getLatest({ ...options, includeItemTypes: ['MusicAlbum'] });\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport { JellyfinError } from './errors.js';\n\nexport class TranscodeModule {\n private http: HttpTransport;\n private getDeviceId: () => string;\n\n constructor(http: HttpTransport, getDeviceId: () => string) {\n this.http = http;\n this.getDeviceId = getDeviceId;\n }\n\n /**\n * Explicitly stop an active server transcoding session via DELETE /Videos/ActiveEncodings.\n * This terminates lingering FFmpeg processes on the Jellyfin server.\n *\n * @param playSessionId The unique playback session ID.\n * @param deviceId The client device ID (defaults to configured client device ID).\n */\n async stopActiveEncoding(playSessionId: string, deviceId?: string): Promise<void> {\n if (!playSessionId) {\n throw new JellyfinError('playSessionId is required to stop an active encoding session.');\n }\n\n const resolvedDeviceId = deviceId || this.getDeviceId();\n if (!resolvedDeviceId) {\n throw new JellyfinError('deviceId is required to stop an active encoding session.');\n }\n\n await this.http.request('/Videos/ActiveEncodings', {\n method: 'DELETE',\n params: {\n DeviceId: resolvedDeviceId,\n PlaySessionId: playSessionId\n }\n });\n }\n\n /**\n * Convenience alias for stopActiveEncoding.\n */\n async stop(playSessionId: string, deviceId?: string): Promise<void> {\n return await this.stopActiveEncoding(playSessionId, deviceId);\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type { ItemsResponse, SearchOptions } from './types.js';\nimport { JellyfinError } from './errors.js';\n\nexport const COMMON_SEARCH_FIELDS =\n 'PrimaryImageAspectRatio,PrimaryImageTag,ImageTags,BackdropImageTags,AlbumPrimaryImageTag,AlbumId,AudioInfo,MediaSources,Chapters,HasLyrics,Overview,Genres,Studios,ProductionYear,OfficialRating,CommunityRating,CriticRating,PremiereDate,RunTimeTicks,IndexNumber,ParentIndexNumber,SeriesName,SeriesId,SeasonId,SeasonName,UserData';\n\nexport class SearchModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n const userId = explicitUserId || this.getUserId();\n if (!userId) {\n throw new JellyfinError('User ID is required for search requests. Please authenticate or provide a userId.');\n }\n return userId;\n }\n\n /**\n * Universal search across Jellyfin items with comprehensive filters.\n */\n async search(query: string, options: SearchOptions = {}): Promise<ItemsResponse> {\n if (!query || !query.trim()) {\n return { Items: [], TotalRecordCount: 0 };\n }\n\n const userId = this.resolveUserId(options.userId);\n const {\n limit = 30,\n startIndex = 0,\n parentId,\n includeItemTypes = 'Audio,MusicAlbum,MusicArtist,Playlist,Movie,Series,Episode',\n mediaTypes,\n genres,\n years,\n isFavorite,\n sortBy,\n sortOrder,\n fields = COMMON_SEARCH_FIELDS,\n recursive = true\n } = options;\n\n const params: Record<string, unknown> = {\n SearchTerm: query.trim(),\n Limit: limit,\n StartIndex: startIndex,\n Recursive: recursive,\n Fields: fields\n };\n\n if (parentId) params.ParentId = parentId;\n\n if (includeItemTypes) {\n params.IncludeItemTypes = Array.isArray(includeItemTypes)\n ? includeItemTypes.join(',')\n : includeItemTypes;\n }\n\n if (mediaTypes) {\n params.MediaTypes = Array.isArray(mediaTypes)\n ? mediaTypes.join(',')\n : mediaTypes;\n }\n\n if (genres && genres.length > 0) params.Genres = genres.join('|');\n if (years && years.length > 0) params.Years = years.join(',');\n if (isFavorite) params.Filters = 'IsFavorite';\n if (sortBy) params.SortBy = sortBy;\n if (sortOrder) params.SortOrder = sortOrder;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, { params });\n }\n\n /**\n * Search specifically within a specific library or parent folder.\n */\n async searchInLibrary(\n parentId: string,\n query: string,\n options: Omit<SearchOptions, 'parentId'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, parentId });\n }\n\n /**\n * Convenience helper to search audio tracks / songs.\n */\n async searchSongs(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'Audio' });\n }\n\n /**\n * Convenience helper to search music albums.\n */\n async searchAlbums(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'MusicAlbum' });\n }\n\n /**\n * Convenience helper to search music artists.\n */\n async searchArtists(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'MusicArtist' });\n }\n\n /**\n * Convenience helper to search movies.\n */\n async searchMovies(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'Movie' });\n }\n\n /**\n * Convenience helper to search TV series.\n */\n async searchSeries(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'Series' });\n }\n\n /**\n * Convenience helper to search TV episodes.\n */\n async searchEpisodes(\n query: string,\n options: Omit<SearchOptions, 'includeItemTypes'> = {}\n ): Promise<ItemsResponse> {\n return await this.search(query, { ...options, includeItemTypes: 'Episode' });\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport { JellyfinError } from './errors.js';\nimport type {\n WebSocketInboundMessage,\n WebSocketMessageType,\n WebSocketModuleOptions,\n LibraryChangedData,\n UserDataChangedData,\n SessionInfoDto\n} from './types.js';\n\nexport type WebSocketEventListener = (...args: any[]) => void;\n\nexport class WebSocketModule {\n private http: HttpTransport;\n private getDeviceId: () => string;\n private ws: any = null;\n private keepAliveTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private listeners = new Map<string, Set<WebSocketEventListener>>();\n private reconnectAttempts = 0;\n private explicitlyClosed = false;\n private options: WebSocketModuleOptions = {};\n\n constructor(http: HttpTransport, getDeviceId: () => string) {\n this.http = http;\n this.getDeviceId = getDeviceId;\n }\n\n /**\n * Check whether the WebSocket is currently open and connected.\n */\n get isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === 1; // 1 = OPEN\n }\n\n /**\n * Build the Jellyfin WebSocket URL from current serverUrl, accessToken, and deviceId.\n */\n getWebSocketUrl(): string {\n const serverUrl = this.http.getServerUrl();\n if (!serverUrl) {\n throw new JellyfinError('Server URL is required to connect to WebSocket.');\n }\n\n const token = this.http.getToken();\n if (!token) {\n throw new JellyfinError('Access token is required to connect to WebSocket. Please authenticate first.');\n }\n\n const deviceId = this.getDeviceId();\n const wsBaseUrl = serverUrl.replace(/^http:\\/\\//i, 'ws://').replace(/^https:\\/\\//i, 'wss://').replace(/\\/+$/, '');\n const url = new URL(`${wsBaseUrl}/socket`);\n url.searchParams.set('api_key', token);\n if (deviceId) {\n url.searchParams.set('deviceId', deviceId);\n }\n\n return url.toString();\n }\n\n /**\n * Connect to the Jellyfin WebSocket endpoint.\n */\n connect(options: WebSocketModuleOptions = {}): void {\n this.options = {\n autoReconnect: true,\n reconnectIntervalMs: 5000,\n maxReconnectAttempts: 10,\n keepAliveIntervalMs: 30000,\n ...options\n };\n\n this.explicitlyClosed = false;\n this.cleanup();\n\n const socketUrl = this.options.url || this.getWebSocketUrl();\n\n let SocketConstructor: any = this.options.webSocketFactory\n ? null\n : (typeof globalThis !== 'undefined' ? (globalThis as any).WebSocket : null);\n\n if (this.options.webSocketFactory) {\n this.ws = this.options.webSocketFactory(socketUrl);\n } else if (SocketConstructor) {\n this.ws = new SocketConstructor(socketUrl);\n } else {\n throw new JellyfinError('WebSocket constructor is not available in the current environment. Please supply webSocketFactory in options.');\n }\n\n this.setupSocketEvents();\n }\n\n /**\n * Disconnect the WebSocket and prevent automatic reconnection.\n */\n disconnect(): void {\n this.explicitlyClosed = true;\n this.cleanup();\n }\n\n /**\n * Send a raw string or JSON message through the open WebSocket.\n */\n send(message: string | Record<string, unknown>): void {\n if (!this.isConnected) {\n throw new JellyfinError('Cannot send message: WebSocket is not open.');\n }\n\n const payload = typeof message === 'string' ? message : JSON.stringify(message);\n this.ws.send(payload);\n }\n\n /**\n * Send a KeepAlive message to the Jellyfin server.\n */\n sendKeepAlive(): void {\n this.send({ MessageType: 'KeepAlive' });\n }\n\n /**\n * Subscribe to real-time session updates from the server.\n */\n startSessionsSubscription(intervalMs: number = 1500): void {\n this.send({\n MessageType: 'SessionsStart',\n Data: `0,${intervalMs}`\n });\n }\n\n /**\n * Stop receiving real-time session updates.\n */\n stopSessionsSubscription(): void {\n this.send({ MessageType: 'SessionsStop' });\n }\n\n /**\n * Subscribe to scheduled tasks updates from the server.\n */\n startScheduledTasksSubscription(intervalMs: number = 1500): void {\n this.send({\n MessageType: 'ScheduledTasksInfoStart',\n Data: `0,${intervalMs}`\n });\n }\n\n /**\n * Stop scheduled tasks updates.\n */\n stopScheduledTasksSubscription(): void {\n this.send({ MessageType: 'ScheduledTasksInfoStop' });\n }\n\n /**\n * Subscribe to server activity log updates.\n */\n startActivityLogSubscription(intervalMs: number = 1500): void {\n this.send({\n MessageType: 'ActivityLogEntryStart',\n Data: `0,${intervalMs}`\n });\n }\n\n /**\n * Stop server activity log updates.\n */\n stopActivityLogSubscription(): void {\n this.send({ MessageType: 'ActivityLogEntryStop' });\n }\n\n // --- Event Handling ---\n\n on(event: 'open', listener: () => void): () => void;\n on(event: 'close', listener: (code?: number, reason?: string) => void): () => void;\n on(event: 'error', listener: (error: unknown) => void): () => void;\n on(event: 'message', listener: (msg: WebSocketInboundMessage) => void): () => void;\n on(event: 'libraryChanged', listener: (data: LibraryChangedData) => void): () => void;\n on(event: 'userDataChanged', listener: (data: UserDataChangedData) => void): () => void;\n on(event: 'sessions', listener: (data: SessionInfoDto[]) => void): () => void;\n on(event: string, listener: WebSocketEventListener): () => void;\n on(event: string, listener: WebSocketEventListener): () => void {\n const key = event.toLowerCase();\n if (!this.listeners.has(key)) {\n this.listeners.set(key, new Set());\n }\n this.listeners.get(key)!.add(listener);\n\n return () => this.off(key, listener);\n }\n\n off(event: string, listener: WebSocketEventListener): void {\n const key = event.toLowerCase();\n const set = this.listeners.get(key);\n if (set) {\n set.delete(listener);\n }\n }\n\n emit(event: string, ...args: unknown[]): void {\n const key = event.toLowerCase();\n const set = this.listeners.get(key);\n if (set) {\n set.forEach((listener) => {\n try {\n listener(...args);\n } catch (e) {\n console.error(`[Jellyfin SDK] WebSocket listener error on '${event}':`, e);\n }\n });\n }\n }\n\n // --- Internal Socket Helpers ---\n\n private setupSocketEvents(): void {\n if (!this.ws) return;\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.startKeepAlive();\n this.emit('open');\n };\n\n this.ws.onclose = (ev?: { code?: number; reason?: string }) => {\n this.stopKeepAlive();\n this.emit('close', ev?.code, ev?.reason);\n if (!this.explicitlyClosed && this.options.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n\n this.ws.onerror = (err: unknown) => {\n this.emit('error', err);\n };\n\n this.ws.onmessage = (event: { data: unknown }) => {\n try {\n const text = typeof event.data === 'string' ? event.data : String(event.data);\n const parsed: WebSocketInboundMessage = JSON.parse(text);\n\n this.emit('message', parsed);\n\n if (parsed.MessageType) {\n // Emit specific event by MessageType (e.g. 'libraryChanged', 'sessions')\n this.emit(parsed.MessageType, parsed.Data);\n\n // Handle KeepAlive / ForceKeepAlive from server by sending KeepAlive back\n if (parsed.MessageType === 'ForceKeepAlive') {\n this.sendKeepAlive();\n }\n }\n } catch (e) {\n // Non-JSON message received\n this.emit('rawMessage', event.data);\n }\n };\n }\n\n private startKeepAlive(): void {\n this.stopKeepAlive();\n const interval = this.options.keepAliveIntervalMs || 30000;\n if (interval > 0) {\n this.keepAliveTimer = setInterval(() => {\n if (this.isConnected) {\n try {\n this.sendKeepAlive();\n } catch {\n // Ignore keep-alive send errors\n }\n }\n }, interval);\n }\n }\n\n private stopKeepAlive(): void {\n if (this.keepAliveTimer) {\n clearInterval(this.keepAliveTimer);\n this.keepAliveTimer = null;\n }\n }\n\n private scheduleReconnect(): void {\n const maxAttempts = this.options.maxReconnectAttempts ?? 10;\n if (this.reconnectAttempts >= maxAttempts) {\n return;\n }\n\n const interval = this.options.reconnectIntervalMs ?? 5000;\n const backoffDelay = Math.min(interval * Math.pow(1.5, this.reconnectAttempts), 60000);\n this.reconnectAttempts++;\n\n this.reconnectTimer = setTimeout(() => {\n if (!this.explicitlyClosed) {\n try {\n this.connect(this.options);\n } catch (e) {\n this.emit('error', e);\n }\n }\n }, backoffDelay);\n }\n\n private cleanup(): void {\n this.stopKeepAlive();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n try {\n this.ws.onopen = null;\n this.ws.onclose = null;\n this.ws.onerror = null;\n this.ws.onmessage = null;\n if (this.ws.readyState === 0 || this.ws.readyState === 1) {\n this.ws.close();\n }\n } catch {\n // Ignore close errors\n }\n this.ws = null;\n }\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport { JellyfinError } from './errors.js';\nimport type {\n SessionInfoDto,\n GetSessionsOptions,\n RemotePlayOptions,\n PlaystateCommand,\n GeneralCommandDto,\n SessionMessageOptions\n} from './types.js';\n\nexport class SessionsModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n /**\n * Query active client sessions across the Jellyfin server via GET /Sessions.\n */\n async getSessions(options: GetSessionsOptions = {}): Promise<SessionInfoDto[]> {\n const params: Record<string, unknown> = {};\n\n if (options.controllableByUserId) {\n params.ControllableByUserId = options.controllableByUserId;\n }\n if (options.deviceId) {\n params.DeviceId = options.deviceId;\n }\n if (options.activeWithinSeconds !== undefined) {\n params.ActiveWithinSeconds = options.activeWithinSeconds;\n }\n\n const result = await this.http.request<SessionInfoDto[]>('/Sessions', { params });\n return Array.isArray(result) ? result : [];\n }\n\n /**\n * Instruct a remote session to start playback of specified items via POST /Sessions/{sessionId}/Playing.\n *\n * @param sessionId The target session ID.\n * @param itemIds Single item ID or array of item IDs to play.\n * @param options Additional playback parameters (command type, start ticks, etc.).\n */\n async play(\n sessionId: string,\n itemIds: string | string[],\n options: RemotePlayOptions = {}\n ): Promise<void> {\n if (!sessionId) {\n throw new JellyfinError('sessionId is required to send a play command.');\n }\n\n const ids = Array.isArray(itemIds) ? itemIds : [itemIds];\n if (ids.length === 0) {\n throw new JellyfinError('At least one itemId is required to send a play command.');\n }\n\n const params: Record<string, unknown> = {\n ItemIds: ids.join(','),\n PlayCommand: options.playCommand || 'PlayNow'\n };\n\n if (options.startPositionTicks !== undefined) {\n params.StartPositionTicks = options.startPositionTicks;\n }\n if (options.mediaSourceId) {\n params.MediaSourceId = options.mediaSourceId;\n }\n if (options.audioStreamIndex !== undefined) {\n params.AudioStreamIndex = options.audioStreamIndex;\n }\n if (options.subtitleStreamIndex !== undefined) {\n params.SubtitleStreamIndex = options.subtitleStreamIndex;\n }\n if (options.startIndex !== undefined) {\n params.StartIndex = options.startIndex;\n }\n\n await this.http.request(`/Sessions/${sessionId}/Playing`, {\n method: 'POST',\n params\n });\n }\n\n /**\n * Send a playback control command to a remote session via POST /Sessions/{sessionId}/Playing/{command}.\n */\n async sendPlaystateCommand(\n sessionId: string,\n command: PlaystateCommand,\n params: Record<string, unknown> = {}\n ): Promise<void> {\n if (!sessionId) {\n throw new JellyfinError('sessionId is required to send a playstate command.');\n }\n\n await this.http.request(`/Sessions/${sessionId}/Playing/${command}`, {\n method: 'POST',\n params\n });\n }\n\n /**\n * Toggle play / pause on a remote session.\n */\n async playPause(sessionId: string): Promise<void> {\n return await this.sendPlaystateCommand(sessionId, 'PlayPause');\n }\n\n /**\n * Pause playback on a remote session.\n */\n async pause(sessionId: string): Promise<void> {\n return await this.sendPlaystateCommand(sessionId, 'Pause');\n }\n\n /**\n * Resume playback on a remote session.\n */\n async unpause(sessionId: string): Promise<void> {\n return await this.sendPlaystateCommand(sessionId, 'Unpause');\n }\n\n /**\n * Stop playback on a remote session.\n */\n async stop(sessionId: string): Promise<void> {\n return await this.sendPlaystateCommand(sessionId, 'Stop');\n }\n\n /**\n * Seek to a specific tick position on a remote session.\n *\n * @param sessionId Target session ID.\n * @param positionTicks Position in ticks (1 tick = 10,000 milliseconds = 100 nanoseconds).\n */\n async seek(sessionId: string, positionTicks: number): Promise<void> {\n return await this.sendPlaystateCommand(sessionId, 'Seek', {\n SeekPositionTicks: positionTicks\n });\n }\n\n /**\n * Skip to the next track on a remote session.\n */\n async nextTrack(sessionId: string): Promise<void> {\n return await this.sendPlaystateCommand(sessionId, 'NextTrack');\n }\n\n /**\n * Skip to the previous track on a remote session.\n */\n async previousTrack(sessionId: string): Promise<void> {\n return await this.sendPlaystateCommand(sessionId, 'PreviousTrack');\n }\n\n /**\n * Send a general command to a remote session via POST /Sessions/{sessionId}/Command.\n */\n async sendGeneralCommand(sessionId: string, command: GeneralCommandDto): Promise<void> {\n if (!sessionId) {\n throw new JellyfinError('sessionId is required to send a general command.');\n }\n\n await this.http.request(`/Sessions/${sessionId}/Command`, {\n method: 'POST',\n body: {\n Name: command.Name,\n Arguments: command.Arguments || {}\n }\n });\n }\n\n /**\n * Set volume level on a remote session (0-100).\n */\n async setVolume(sessionId: string, volume: number): Promise<void> {\n const clamped = Math.max(0, Math.min(100, Math.round(volume)));\n return await this.sendGeneralCommand(sessionId, {\n Name: 'SetVolume',\n Arguments: { Volume: String(clamped) }\n });\n }\n\n /**\n * Mute audio on a remote session.\n */\n async mute(sessionId: string): Promise<void> {\n return await this.sendGeneralCommand(sessionId, { Name: 'Mute' });\n }\n\n /**\n * Unmute audio on a remote session.\n */\n async unmute(sessionId: string): Promise<void> {\n return await this.sendGeneralCommand(sessionId, { Name: 'Unmute' });\n }\n\n /**\n * Toggle mute on a remote session.\n */\n async toggleMute(sessionId: string): Promise<void> {\n return await this.sendGeneralCommand(sessionId, { Name: 'ToggleMute' });\n }\n\n /**\n * Switch the audio stream index on a remote session.\n */\n async setAudioStreamIndex(sessionId: string, index: number): Promise<void> {\n return await this.sendGeneralCommand(sessionId, {\n Name: 'SetAudioStreamIndex',\n Arguments: { Index: String(index) }\n });\n }\n\n /**\n * Switch the subtitle stream index on a remote session.\n */\n async setSubtitleStreamIndex(sessionId: string, index: number): Promise<void> {\n return await this.sendGeneralCommand(sessionId, {\n Name: 'SetSubtitleStreamIndex',\n Arguments: { Index: String(index) }\n });\n }\n\n /**\n * Display an on-screen dialog message modal on a remote session via POST /Sessions/{sessionId}/Message.\n */\n async sendMessage(sessionId: string, options: SessionMessageOptions | string): Promise<void> {\n if (!sessionId) {\n throw new JellyfinError('sessionId is required to send a message.');\n }\n\n const payload: Record<string, unknown> = typeof options === 'string'\n ? { Text: options, Header: 'Message' }\n : {\n Text: options.text,\n Header: options.header || 'Message',\n TimeoutMs: options.timeoutMs\n };\n\n await this.http.request(`/Sessions/${sessionId}/Message`, {\n method: 'POST',\n body: payload\n });\n }\n\n /**\n * Instruct a remote session to navigate and view an item or page via POST /Sessions/{sessionId}/Viewing.\n */\n async viewItem(\n sessionId: string,\n itemType: string,\n itemId: string,\n itemName: string\n ): Promise<void> {\n if (!sessionId) {\n throw new JellyfinError('sessionId is required to instruct session navigation.');\n }\n\n await this.http.request(`/Sessions/${sessionId}/Viewing`, {\n method: 'POST',\n params: {\n ItemType: itemType,\n ItemId: itemId,\n ItemName: itemName\n }\n });\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport { JellyfinError } from './errors.js';\nimport type {\n QuickConnectResult,\n QuickConnectState,\n QuickConnectPollOptions\n} from './types.js';\n\nexport class QuickConnectModule {\n private http: HttpTransport;\n\n constructor(http: HttpTransport) {\n this.http = http;\n }\n\n /**\n * Check whether Quick Connect is enabled on the connected Jellyfin server.\n */\n async isEnabled(): Promise<boolean> {\n try {\n const result = await this.http.request<boolean | string>('/QuickConnect/Enabled');\n if (typeof result === 'boolean') {\n return result;\n }\n return String(result).toLowerCase() === 'true';\n } catch {\n return false;\n }\n }\n\n /**\n * Initiate a Quick Connect authentication session.\n * Typically called by a client device (e.g. Smart TV or CLI) to generate a user-facing pairing code.\n */\n async initiate(): Promise<QuickConnectResult> {\n const result = await this.http.request<QuickConnectResult>('/QuickConnect/Initiate', {\n method: 'POST'\n });\n\n if (!result || !result.Code || !result.Secret) {\n throw new JellyfinError('Quick Connect initiate failed: Invalid server response.');\n }\n\n return result;\n }\n\n /**\n * Check the current authorization status of an initiated Quick Connect secret.\n *\n * @param secret The secret token returned from initiate().\n */\n async check(secret: string): Promise<QuickConnectState> {\n if (!secret) {\n throw new JellyfinError('secret is required to check Quick Connect status.');\n }\n\n return await this.http.request<QuickConnectState>('/QuickConnect/Connect', {\n method: 'GET',\n params: { secret }\n });\n }\n\n /**\n * Authorize a Quick Connect pairing code from an authenticated session.\n * Typically called on a mobile app or browser where the user is already logged in.\n *\n * @param code The pairing code shown on the target device.\n * @param userId Optional specific user ID to authenticate as (defaults to the currently authenticated user).\n */\n async authorize(code: string, userId?: string): Promise<boolean> {\n if (!code) {\n throw new JellyfinError('code is required to authorize Quick Connect.');\n }\n\n const params: Record<string, unknown> = {\n Code: code.replace(/\\s+/g, '') // Normalize code by removing spaces\n };\n if (userId) {\n params.UserId = userId;\n }\n\n await this.http.request('/QuickConnect/Authorize', {\n method: 'POST',\n params\n });\n\n return true;\n }\n\n /**\n * Repeatedly poll until the user authorizes the Quick Connect request or a timeout occurs.\n *\n * @param secret The secret token returned from initiate().\n * @param options Polling configuration (intervalMs, timeoutMs, signal).\n */\n async poll(\n secret: string,\n options: QuickConnectPollOptions = {}\n ): Promise<QuickConnectState> {\n const { intervalMs = 2000, timeoutMs = 180000, signal } = options;\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeoutMs) {\n if (signal?.aborted) {\n throw new JellyfinError('Quick Connect polling was aborted.');\n }\n\n const state = await this.check(secret);\n if (state.Authenticated) {\n return state;\n }\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => resolve(), intervalMs);\n\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n reject(new JellyfinError('Quick Connect polling was aborted.'));\n },\n { once: true }\n );\n }\n });\n }\n\n throw new JellyfinError(`Quick Connect timed out after ${timeoutMs}ms.`);\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type {\n BaseItemDto,\n TrickplayInfoDto,\n TrickplayStreamOptions,\n TrickplayManifestInfo,\n TrickplayManifestTile,\n ThumbnailLookupOptions,\n ThumbnailLookupResult\n} from './types.js';\nimport { JellyfinError } from './errors.js';\n\nexport class TrickplayModule {\n private http: HttpTransport;\n\n constructor(http: HttpTransport) {\n this.http = http;\n }\n\n /**\n * Generates the HLS playlist URL for trickplay scrubbing image tiles.\n * E.g. /Videos/{itemId}/Trickplay/{width}/tiles.m3u8\n */\n getTilesHlsUrl(itemId: string, width: number, options: TrickplayStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const { mediaSourceId, useQueryToken = true } = options;\n\n const url = new URL(`${serverUrl}/Videos/${itemId}/Trickplay/${width}/tiles.m3u8`);\n if (token && useQueryToken) {\n url.searchParams.append('ApiKey', token);\n url.searchParams.append('api_key', token);\n url.searchParams.append('X-Emby-Token', token);\n }\n if (mediaSourceId) {\n url.searchParams.append('MediaSourceId', mediaSourceId);\n }\n\n return url.toString();\n }\n\n /**\n * Generates the URL for a specific trickplay thumbnail tile image sheet.\n * E.g. /Videos/{itemId}/Trickplay/{width}/{index}.jpg\n */\n getTileImageUrl(itemId: string, width: number, index: number, options: TrickplayStreamOptions = {}): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const { mediaSourceId, useQueryToken = true } = options;\n\n const url = new URL(`${serverUrl}/Videos/${itemId}/Trickplay/${width}/${index}.jpg`);\n if (token && useQueryToken) {\n url.searchParams.append('ApiKey', token);\n url.searchParams.append('api_key', token);\n url.searchParams.append('X-Emby-Token', token);\n }\n if (mediaSourceId) {\n url.searchParams.append('MediaSourceId', mediaSourceId);\n }\n\n return url.toString();\n }\n\n /**\n * Fetches and parses the HLS trickplay manifest (tiles.m3u8) for the given item and resolution.\n */\n async getTrickplayManifest(\n itemId: string,\n width: number,\n options: { mediaSourceId?: string; useQueryToken?: boolean } = {}\n ): Promise<TrickplayManifestInfo> {\n const params: Record<string, unknown> = {};\n if (options.mediaSourceId) {\n params.MediaSourceId = options.mediaSourceId;\n }\n\n const endpoint = `/Videos/${itemId}/Trickplay/${width}/tiles.m3u8`;\n const rawM3u8 = await this.http.requestText(endpoint, { params });\n const tiles = this.parseTilesM3u8(itemId, width, rawM3u8, options.mediaSourceId, options.useQueryToken);\n\n return {\n width,\n rawM3u8,\n tiles\n };\n }\n\n /**\n * Helper to parse #EXTINF and tile file names from a tiles.m3u8 playlist.\n */\n private parseTilesM3u8(\n itemId: string,\n width: number,\n rawM3u8: string,\n mediaSourceId?: string,\n useQueryToken = true\n ): TrickplayManifestTile[] {\n const lines = rawM3u8.split(/\\r?\\n/);\n const tiles: TrickplayManifestTile[] = [];\n let currentDurationMs = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (trimmed.startsWith('#EXTINF:')) {\n const secondsStr = trimmed.substring(8).split(',')[0];\n const seconds = parseFloat(secondsStr);\n currentDurationMs = !isNaN(seconds) ? Math.round(seconds * 1000) : 0;\n } else if (!trimmed.startsWith('#')) {\n const indexMatch = trimmed.match(/^(\\d+)\\.(jpg|jpeg|png|webp)/i);\n const index = indexMatch ? parseInt(indexMatch[1], 10) : tiles.length;\n const url = this.getTileImageUrl(itemId, width, index, { mediaSourceId, useQueryToken });\n\n tiles.push({\n index,\n durationMs: currentDurationMs,\n url\n });\n }\n }\n\n return tiles;\n }\n\n /**\n * Extracts the available trickplay thumbnail widths from a BaseItemDto's Trickplay metadata.\n */\n getAvailableResolutions(item: BaseItemDto, mediaSourceId?: string): number[] {\n if (!item.Trickplay) {\n return [];\n }\n\n const targetMediaSourceId =\n mediaSourceId ||\n (item.MediaSources && item.MediaSources[0]?.Id) ||\n Object.keys(item.Trickplay)[0];\n\n if (!targetMediaSourceId || !item.Trickplay[targetMediaSourceId]) {\n return [];\n }\n\n const sourceTrickplay = item.Trickplay[targetMediaSourceId];\n return Object.keys(sourceTrickplay)\n .map((w) => parseInt(w, 10))\n .filter((w) => !isNaN(w))\n .sort((a, b) => a - b);\n }\n\n /**\n * Retrieves the TrickplayInfoDto metadata for a specified item and optional width.\n */\n getTrickplayInfo(\n item: BaseItemDto,\n width?: number,\n mediaSourceId?: string\n ): TrickplayInfoDto | null {\n if (!item.Trickplay) {\n return null;\n }\n\n const targetMediaSourceId =\n mediaSourceId ||\n (item.MediaSources && item.MediaSources[0]?.Id) ||\n Object.keys(item.Trickplay)[0];\n\n if (!targetMediaSourceId || !item.Trickplay[targetMediaSourceId]) {\n return null;\n }\n\n const sourceTrickplay = item.Trickplay[targetMediaSourceId];\n if (width !== undefined && sourceTrickplay[String(width)]) {\n return sourceTrickplay[String(width)];\n }\n\n // Default to the first available resolution\n const availableWidths = Object.keys(sourceTrickplay);\n if (availableWidths.length === 0) {\n return null;\n }\n\n return sourceTrickplay[availableWidths[0]];\n }\n\n /**\n * Calculates the exact tile sheet index, image URL, and sprite coordinates (x, y, width, height)\n * for a given playback timestamp to render scrubbing thumbnails in a player or seekbar UI.\n */\n getThumbnailForTimestamp(options: ThumbnailLookupOptions): ThumbnailLookupResult | null {\n const {\n item,\n timestampMs,\n timestampTicks,\n width,\n mediaSourceId,\n useQueryToken = true\n } = options;\n\n let info = options.trickplayInfo;\n if (!info && item) {\n info = this.getTrickplayInfo(item, width, mediaSourceId) || undefined;\n }\n\n if (!info) {\n return null;\n }\n\n const timeMs =\n timestampMs !== undefined\n ? timestampMs\n : timestampTicks !== undefined\n ? Math.round(timestampTicks / 10000)\n : 0;\n\n const interval = info.Interval > 0 ? info.Interval : 10000;\n let thumbIndex = Math.floor(Math.max(0, timeMs) / interval);\n\n if (info.ThumbnailCount > 0 && thumbIndex >= info.ThumbnailCount) {\n thumbIndex = info.ThumbnailCount - 1;\n }\n\n const tileCols = info.TileWidth > 0 ? info.TileWidth : 1;\n const tileRows = info.TileHeight > 0 ? info.TileHeight : 1;\n const thumbsPerSheet = tileCols * tileRows;\n\n const sheetIndex = Math.floor(thumbIndex / thumbsPerSheet);\n const indexInSheet = thumbIndex % thumbsPerSheet;\n\n const col = indexInSheet % tileCols;\n const row = Math.floor(indexInSheet / tileCols);\n\n const x = col * info.Width;\n const y = row * info.Height;\n\n const itemId = item?.Id || '';\n if (!itemId) {\n throw new JellyfinError('Item or itemId is required to generate the thumbnail URL.');\n }\n\n const imageUrl = this.getTileImageUrl(itemId, info.Width, sheetIndex, {\n mediaSourceId,\n useQueryToken\n });\n\n return {\n tileIndex: sheetIndex,\n imageUrl,\n x,\n y,\n width: info.Width,\n height: info.Height,\n thumbnailIndex: thumbIndex\n };\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type {\n BaseItemDto,\n ChapterInfoDto,\n ChapterImageOptions,\n MediaSegmentDto,\n GetMediaSegmentsOptions,\n IntroCreditsMarkers,\n ItemsResponse\n} from './types.js';\n\nexport class ChaptersModule {\n private http: HttpTransport;\n private getUserId?: () => string;\n\n constructor(http: HttpTransport, getUserId?: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n /**\n * Synchronously extracts chapter markers from an already fetched BaseItemDto.\n */\n extractChapters(item: BaseItemDto): ChapterInfoDto[] {\n return item.Chapters || [];\n }\n\n /**\n * Fetches the chapter markers for an item from the server.\n */\n async getChapters(itemId: string): Promise<ChapterInfoDto[]> {\n const userId = this.getUserId ? this.getUserId() : '';\n const endpoint = userId ? `/Users/${userId}/Items/${itemId}` : `/Items/${itemId}`;\n\n const item = await this.http.request<BaseItemDto>(endpoint, {\n params: {\n Fields: 'Chapters'\n }\n });\n\n return item.Chapters || [];\n }\n\n /**\n * Generates the URL for a chapter preview thumbnail image.\n * E.g. /Items/{itemId}/Images/Chapter/{chapterIndex}\n */\n getChapterImageUrl(\n itemId: string,\n chapterIndex: number,\n options: ChapterImageOptions = {}\n ): string {\n const serverUrl = this.http.getServerUrl();\n const token = this.http.getToken();\n const {\n maxWidth,\n maxHeight,\n width,\n height,\n quality,\n format,\n tag,\n fillWidth,\n fillHeight,\n useQueryToken = true\n } = options;\n\n const url = new URL(`${serverUrl}/Items/${itemId}/Images/Chapter/${chapterIndex}`);\n\n if (token && useQueryToken) {\n url.searchParams.append('ApiKey', token);\n url.searchParams.append('api_key', token);\n url.searchParams.append('X-Emby-Token', token);\n }\n if (tag) url.searchParams.append('tag', tag);\n if (maxWidth) url.searchParams.append('maxWidth', String(maxWidth));\n if (maxHeight) url.searchParams.append('maxHeight', String(maxHeight));\n if (width) url.searchParams.append('width', String(width));\n if (height) url.searchParams.append('height', String(height));\n if (quality) url.searchParams.append('quality', String(quality));\n if (format) url.searchParams.append('format', format);\n if (fillWidth) url.searchParams.append('fillWidth', String(fillWidth));\n if (fillHeight) url.searchParams.append('fillHeight', String(fillHeight));\n\n return url.toString();\n }\n\n /**\n * Retrieves media segments (Intro, Outro, Recap, Commercials) for an item via Jellyfin 10.10+ /MediaSegments.\n */\n async getMediaSegments(\n itemId: string,\n options: GetMediaSegmentsOptions = {}\n ): Promise<MediaSegmentDto[]> {\n const params: Record<string, unknown> = {\n itemId\n };\n\n if (options.includeSegmentTypes && options.includeSegmentTypes.length > 0) {\n params.includeSegmentTypes = options.includeSegmentTypes.join(',');\n }\n\n try {\n const res = await this.http.request<MediaSegmentDto[] | ItemsResponse<MediaSegmentDto>>(\n '/MediaSegments',\n { params }\n );\n\n if (Array.isArray(res)) {\n return res;\n }\n if (res && Array.isArray((res as ItemsResponse<MediaSegmentDto>).Items)) {\n return (res as ItemsResponse<MediaSegmentDto>).Items;\n }\n return [];\n } catch {\n // If server does not support /MediaSegments (pre-10.10), return empty list\n return [];\n }\n }\n\n /**\n * Resolves intro and end credits markers for an item, combining /MediaSegments API\n * and chapter marker heuristics (MarkerType or naming like 'Intro', 'Opening', 'Credits', 'Ending').\n */\n async getIntroCredits(\n itemOrChaptersOrId: BaseItemDto | ChapterInfoDto[] | string,\n mediaSegments?: MediaSegmentDto[]\n ): Promise<IntroCreditsMarkers> {\n let itemId = '';\n let chapters: ChapterInfoDto[] = [];\n let segments: MediaSegmentDto[] = mediaSegments || [];\n\n if (typeof itemOrChaptersOrId === 'string') {\n itemId = itemOrChaptersOrId;\n if (segments.length === 0) {\n segments = await this.getMediaSegments(itemId);\n }\n if (segments.length === 0) {\n chapters = await this.getChapters(itemId);\n }\n } else if (Array.isArray(itemOrChaptersOrId)) {\n chapters = itemOrChaptersOrId;\n } else if (typeof itemOrChaptersOrId === 'object' && itemOrChaptersOrId !== null) {\n itemId = itemOrChaptersOrId.Id;\n chapters = itemOrChaptersOrId.Chapters || [];\n if (segments.length === 0 && itemId) {\n segments = await this.getMediaSegments(itemId);\n }\n }\n\n const markers: IntroCreditsMarkers = {\n segments\n };\n\n // 1. Process from MediaSegments if available\n for (const seg of segments) {\n const type = String(seg.Type).toLowerCase();\n if (type === 'intro' && !markers.intro) {\n markers.intro = {\n startTicks: seg.StartTicks,\n endTicks: seg.EndTicks,\n startMs: Math.round(seg.StartTicks / 10000),\n endMs: Math.round(seg.EndTicks / 10000)\n };\n } else if ((type === 'outro' || type === 'credits') && !markers.credits) {\n markers.credits = {\n startTicks: seg.StartTicks,\n endTicks: seg.EndTicks,\n startMs: Math.round(seg.StartTicks / 10000),\n endMs: Math.round(seg.EndTicks / 10000)\n };\n }\n }\n\n // 2. Fallback to Chapter markers if intro or credits are missing\n if ((!markers.intro || !markers.credits) && chapters.length > 0) {\n for (let i = 0; i < chapters.length; i++) {\n const chapter = chapters[i];\n const nextChapter = chapters[i + 1];\n const name = (chapter.Name || '').trim();\n const markerType = (chapter.MarkerType || '').toLowerCase();\n\n // Check for Intro\n if (!markers.intro) {\n if (\n markerType === 'introstart' ||\n /^(intro|opening|theme\\s*song)/i.test(name)\n ) {\n const startTicks = chapter.StartPositionTicks;\n const endTicks = nextChapter\n ? nextChapter.StartPositionTicks\n : startTicks + 90 * 10000000; // Default ~90s if no next chapter\n\n markers.intro = {\n startTicks,\n endTicks,\n startMs: Math.round(startTicks / 10000),\n endMs: Math.round(endTicks / 10000)\n };\n }\n }\n\n // Check for Credits\n if (!markers.credits) {\n if (\n markerType === 'creditsstart' ||\n /^(credits|outro|ending|end\\s*credits)/i.test(name)\n ) {\n const startTicks = chapter.StartPositionTicks;\n const endTicks = nextChapter\n ? nextChapter.StartPositionTicks\n : startTicks + 180 * 10000000;\n\n markers.credits = {\n startTicks,\n endTicks,\n startMs: Math.round(startTicks / 10000),\n endMs: Math.round(endTicks / 10000)\n };\n }\n }\n }\n }\n\n return markers;\n }\n\n /**\n * Checks whether the current playback position falls within an intro or credits range.\n */\n findCurrentSegment(\n positionTicks: number,\n markersOrSegments: IntroCreditsMarkers | MediaSegmentDto[]\n ): { type: string; startTicks: number; endTicks: number } | null {\n if (Array.isArray(markersOrSegments)) {\n for (const seg of markersOrSegments) {\n if (positionTicks >= seg.StartTicks && positionTicks < seg.EndTicks) {\n return {\n type: seg.Type,\n startTicks: seg.StartTicks,\n endTicks: seg.EndTicks\n };\n }\n }\n return null;\n }\n\n const { intro, credits } = markersOrSegments;\n\n if (intro && positionTicks >= intro.startTicks && positionTicks < intro.endTicks) {\n return {\n type: 'Intro',\n startTicks: intro.startTicks,\n endTicks: intro.endTicks\n };\n }\n\n if (credits && positionTicks >= credits.startTicks && positionTicks < credits.endTicks) {\n return {\n type: 'Credits',\n startTicks: credits.startTicks,\n endTicks: credits.endTicks\n };\n }\n\n return null;\n }\n\n /**\n * Returns the timestamp ticks to skip to if the current position is within a skippable segment,\n * or null if not currently within any skippable range.\n */\n getSkipPosition(\n positionTicks: number,\n markersOrSegments: IntroCreditsMarkers | MediaSegmentDto[]\n ): number | null {\n const current = this.findCurrentSegment(positionTicks, markersOrSegments);\n return current ? current.endTicks : null;\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type {\n BaseItemDto,\n GetGenresOptions,\n GetStudiosOptions,\n ItemsResponse\n} from './types.js';\n\nexport class GenresModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n return explicitUserId || this.getUserId() || '';\n }\n\n /**\n * Retrieves video/movie genres from the server via GET /Genres.\n */\n async getGenres(options: GetGenresOptions = {}): Promise<ItemsResponse> {\n const userId = this.resolveUserId(options.userId);\n const params: Record<string, unknown> = {};\n\n if (userId) params.UserId = userId;\n if (options.parentId) params.ParentId = options.parentId;\n if (options.startIndex !== undefined) params.StartIndex = options.startIndex;\n if (options.limit !== undefined) params.Limit = options.limit;\n if (options.searchTerm) params.SearchTerm = options.searchTerm;\n if (options.sortBy) params.SortBy = options.sortBy;\n if (options.sortOrder) params.SortOrder = options.sortOrder;\n if (options.enableImages !== undefined) params.EnableImages = options.enableImages;\n if (options.imageTypeLimit !== undefined) params.ImageTypeLimit = options.imageTypeLimit;\n if (options.enableImageTypes && options.enableImageTypes.length > 0) {\n params.EnableImageTypes = options.enableImageTypes.join(',');\n }\n\n return await this.http.request<ItemsResponse>('/Genres', { params });\n }\n\n /**\n * Retrieves a single genre by name via GET /Genres/{genreName}.\n */\n async getGenre(genreName: string, options: { userId?: string } = {}): Promise<BaseItemDto> {\n const userId = this.resolveUserId(options.userId);\n const params: Record<string, unknown> = {};\n if (userId) params.UserId = userId;\n\n return await this.http.request<BaseItemDto>(`/Genres/${encodeURIComponent(genreName)}`, {\n params\n });\n }\n\n /**\n * Retrieves music genres from the server via GET /MusicGenres.\n */\n async getMusicGenres(options: GetGenresOptions = {}): Promise<ItemsResponse> {\n const userId = this.resolveUserId(options.userId);\n const params: Record<string, unknown> = {};\n\n if (userId) params.UserId = userId;\n if (options.parentId) params.ParentId = options.parentId;\n if (options.startIndex !== undefined) params.StartIndex = options.startIndex;\n if (options.limit !== undefined) params.Limit = options.limit;\n if (options.searchTerm) params.SearchTerm = options.searchTerm;\n if (options.sortBy) params.SortBy = options.sortBy;\n if (options.sortOrder) params.SortOrder = options.sortOrder;\n if (options.enableImages !== undefined) params.EnableImages = options.enableImages;\n if (options.imageTypeLimit !== undefined) params.ImageTypeLimit = options.imageTypeLimit;\n if (options.enableImageTypes && options.enableImageTypes.length > 0) {\n params.EnableImageTypes = options.enableImageTypes.join(',');\n }\n\n return await this.http.request<ItemsResponse>('/MusicGenres', { params });\n }\n\n /**\n * Retrieves a single music genre by name via GET /MusicGenres/{genreName}.\n */\n async getMusicGenre(genreName: string, options: { userId?: string } = {}): Promise<BaseItemDto> {\n const userId = this.resolveUserId(options.userId);\n const params: Record<string, unknown> = {};\n if (userId) params.UserId = userId;\n\n return await this.http.request<BaseItemDto>(`/MusicGenres/${encodeURIComponent(genreName)}`, {\n params\n });\n }\n\n /**\n * Retrieves studios/production companies from the server via GET /Studios.\n */\n async getStudios(options: GetStudiosOptions = {}): Promise<ItemsResponse> {\n const userId = this.resolveUserId(options.userId);\n const params: Record<string, unknown> = {};\n\n if (userId) params.UserId = userId;\n if (options.parentId) params.ParentId = options.parentId;\n if (options.startIndex !== undefined) params.StartIndex = options.startIndex;\n if (options.limit !== undefined) params.Limit = options.limit;\n if (options.searchTerm) params.SearchTerm = options.searchTerm;\n if (options.sortBy) params.SortBy = options.sortBy;\n if (options.sortOrder) params.SortOrder = options.sortOrder;\n if (options.enableImages !== undefined) params.EnableImages = options.enableImages;\n if (options.imageTypeLimit !== undefined) params.ImageTypeLimit = options.imageTypeLimit;\n if (options.enableImageTypes && options.enableImageTypes.length > 0) {\n params.EnableImageTypes = options.enableImageTypes.join(',');\n }\n\n return await this.http.request<ItemsResponse>('/Studios', { params });\n }\n\n /**\n * Retrieves a single studio by name via GET /Studios/{studioName}.\n */\n async getStudio(studioName: string, options: { userId?: string } = {}): Promise<BaseItemDto> {\n const userId = this.resolveUserId(options.userId);\n const params: Record<string, unknown> = {};\n if (userId) params.UserId = userId;\n\n return await this.http.request<BaseItemDto>(`/Studios/${encodeURIComponent(studioName)}`, {\n params\n });\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type {\n CreateCollectionOptions,\n GetCollectionItemsOptions,\n GetCollectionsOptions,\n ItemsResponse\n} from './types.js';\n\nexport class CollectionsModule {\n private http: HttpTransport;\n private getUserId: () => string;\n\n constructor(http: HttpTransport, getUserId: () => string) {\n this.http = http;\n this.getUserId = getUserId;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n return explicitUserId || this.getUserId() || '';\n }\n\n /**\n * Retrieves user BoxSet / Collections via GET /Collections.\n */\n async getCollections(options: GetCollectionsOptions = {}): Promise<ItemsResponse> {\n const userId = this.resolveUserId(options.userId);\n const params: Record<string, unknown> = {};\n\n if (userId) params.UserId = userId;\n if (options.parentId) params.ParentId = options.parentId;\n if (options.startIndex !== undefined) params.StartIndex = options.startIndex;\n if (options.limit !== undefined) params.Limit = options.limit;\n if (options.searchTerm) params.SearchTerm = options.searchTerm;\n if (options.sortBy) params.SortBy = options.sortBy;\n if (options.sortOrder) params.SortOrder = options.sortOrder;\n if (options.enableImages !== undefined) params.EnableImages = options.enableImages;\n if (options.imageTypeLimit !== undefined) params.ImageTypeLimit = options.imageTypeLimit;\n if (options.enableImageTypes && options.enableImageTypes.length > 0) {\n params.EnableImageTypes = options.enableImageTypes.join(',');\n }\n\n return await this.http.request<ItemsResponse>('/Collections', { params });\n }\n\n /**\n * Retrieves the items belonging to a collection / BoxSet.\n */\n async getCollectionItems(\n collectionId: string,\n options: GetCollectionItemsOptions = {}\n ): Promise<ItemsResponse> {\n const userId = this.resolveUserId(options.userId);\n const endpoint = userId ? `/Users/${userId}/Items` : '/Items';\n\n const params: Record<string, unknown> = {\n ParentId: collectionId\n };\n\n if (options.startIndex !== undefined) params.StartIndex = options.startIndex;\n if (options.limit !== undefined) params.Limit = options.limit;\n if (options.fields) params.Fields = options.fields;\n if (options.sortBy) params.SortBy = options.sortBy;\n if (options.sortOrder) params.SortOrder = options.sortOrder;\n\n return await this.http.request<ItemsResponse>(endpoint, { params });\n }\n\n /**\n * Creates a new BoxSet / Collection via POST /Collections.\n */\n async createCollection(options: CreateCollectionOptions): Promise<{ Id: string }> {\n const params: Record<string, unknown> = {\n Name: options.name\n };\n\n if (options.ids && options.ids.length > 0) {\n params.Ids = options.ids.join(',');\n }\n if (options.parentId) {\n params.ParentId = options.parentId;\n }\n if (options.isFolder !== undefined) {\n params.IsFolder = options.isFolder;\n }\n\n return await this.http.request<{ Id: string }>('/Collections', {\n method: 'POST',\n params\n });\n }\n\n /**\n * Adds items to an existing BoxSet / Collection via POST /Collections/{collectionId}/Items.\n */\n async addToCollection(collectionId: string, itemIds: string | string[]): Promise<void> {\n const ids = Array.isArray(itemIds) ? itemIds.join(',') : itemIds;\n\n await this.http.request(`/Collections/${collectionId}/Items`, {\n method: 'POST',\n params: {\n Ids: ids\n }\n });\n }\n\n /**\n * Removes items from an existing BoxSet / Collection via DELETE /Collections/{collectionId}/Items.\n */\n async removeFromCollection(collectionId: string, itemIds: string | string[]): Promise<void> {\n const ids = Array.isArray(itemIds) ? itemIds.join(',') : itemIds;\n\n await this.http.request(`/Collections/${collectionId}/Items`, {\n method: 'DELETE',\n params: {\n Ids: ids\n }\n });\n }\n}\n\n","import type { HttpTransport } from './http.js';\nimport type {\n DisplayPreferencesDto,\n GetDisplayPreferencesOptions,\n UpdateDisplayPreferencesOptions\n} from './types.js';\nimport { JellyfinError } from './errors.js';\n\nexport class DisplayPreferencesModule {\n private http: HttpTransport;\n private getUserId: () => string;\n private defaultClient: string;\n\n constructor(http: HttpTransport, getUserId: () => string, defaultClient = 'emby') {\n this.http = http;\n this.getUserId = getUserId;\n this.defaultClient = defaultClient;\n }\n\n private resolveUserId(explicitUserId?: string): string {\n const userId = explicitUserId || this.getUserId();\n if (!userId) {\n throw new JellyfinError(\n 'User ID is required for DisplayPreferences. Please authenticate or specify userId.'\n );\n }\n return userId;\n }\n\n /**\n * Retrieves the user's display preferences for a specific folder or view.\n * GET /DisplayPreferences/{displayPreferencesId}\n */\n async getDisplayPreferences(\n displayPreferencesId: string,\n options: GetDisplayPreferencesOptions = {}\n ): Promise<DisplayPreferencesDto> {\n const userId = this.resolveUserId(options.userId);\n const client = options.client || this.defaultClient;\n\n return await this.http.request<DisplayPreferencesDto>(\n `/DisplayPreferences/${displayPreferencesId}`,\n {\n params: {\n userId,\n client\n }\n }\n );\n }\n\n /**\n * Updates display preferences for a specific folder or view.\n * POST /DisplayPreferences/{displayPreferencesId}\n */\n async updateDisplayPreferences(\n displayPreferencesId: string,\n preferences: DisplayPreferencesDto,\n options: UpdateDisplayPreferencesOptions = {}\n ): Promise<void> {\n const userId = this.resolveUserId(options.userId);\n const client = options.client || this.defaultClient;\n\n const payload: DisplayPreferencesDto = {\n ...preferences,\n Id: preferences.Id || displayPreferencesId,\n Client: preferences.Client || client\n };\n\n await this.http.request(`/DisplayPreferences/${displayPreferencesId}`, {\n method: 'POST',\n params: {\n userId,\n client\n },\n body: payload\n });\n }\n\n /**\n * Sets a custom client-specific key-value pair in CustomPrefs.\n */\n async setCustomPreference(\n displayPreferencesId: string,\n key: string,\n value: string,\n options: UpdateDisplayPreferencesOptions = {}\n ): Promise<DisplayPreferencesDto> {\n const current = await this.getDisplayPreferences(displayPreferencesId, options);\n const customPrefs = {\n ...(current.CustomPrefs || {}),\n [key]: value\n };\n\n const updated: DisplayPreferencesDto = {\n ...current,\n CustomPrefs: customPrefs\n };\n\n await this.updateDisplayPreferences(displayPreferencesId, updated, options);\n return updated;\n }\n\n /**\n * Updates sort field and order preferences for a view.\n */\n async setSortPreferences(\n displayPreferencesId: string,\n sortBy: string,\n sortOrder: 'Ascending' | 'Descending',\n options: UpdateDisplayPreferencesOptions = {}\n ): Promise<DisplayPreferencesDto> {\n const current = await this.getDisplayPreferences(displayPreferencesId, options);\n const updated: DisplayPreferencesDto = {\n ...current,\n SortBy: sortBy,\n SortOrder: sortOrder,\n RememberSorting: true\n };\n\n await this.updateDisplayPreferences(displayPreferencesId, updated, options);\n return updated;\n }\n\n /**\n * Sets the view presentation layout type (e.g. 'Poster', 'Thumb', 'Banner', 'List').\n */\n async setViewType(\n displayPreferencesId: string,\n viewType: string,\n options: UpdateDisplayPreferencesOptions = {}\n ): Promise<DisplayPreferencesDto> {\n const current = await this.getDisplayPreferences(displayPreferencesId, options);\n const updated: DisplayPreferencesDto = {\n ...current,\n ViewType: viewType\n };\n\n await this.updateDisplayPreferences(displayPreferencesId, updated, options);\n return updated;\n }\n}\n\n","export interface CacheRecord<T = unknown> {\n key: string;\n data: T;\n timestamp: number;\n}\n\nexport interface CacheAdapter {\n get<T = unknown>(key: string): Promise<T | null> | T | null;\n set<T = unknown>(key: string, data: T): Promise<void> | void;\n delete(key: string): Promise<void> | void;\n clear(): Promise<void> | void;\n}\n\nexport class MemoryCacheAdapter implements CacheAdapter {\n private cache = new Map<string, { data: unknown; timestamp: number }>();\n\n get<T = unknown>(key: string): T | null {\n const entry = this.cache.get(key);\n return entry ? (entry.data as T) : null;\n }\n\n set<T = unknown>(key: string, data: T): void {\n this.cache.set(key, { data, timestamp: Date.now() });\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\nexport class IndexedDBCacheAdapter implements CacheAdapter {\n private dbName: string;\n private dbVersion: number;\n private storeName: string;\n private dbPromise: Promise<IDBDatabase | null> | null = null;\n\n constructor(dbName = 'JellyfinSdkCache', dbVersion = 1, storeName = 'api_cache') {\n this.dbName = dbName;\n this.dbVersion = dbVersion;\n this.storeName = storeName;\n }\n\n private async getDB(): Promise<IDBDatabase | null> {\n if (this.dbPromise) return this.dbPromise;\n\n this.dbPromise = new Promise((resolve) => {\n if (typeof window === 'undefined' || !('indexedDB' in window)) {\n resolve(null);\n return;\n }\n\n const request = indexedDB.open(this.dbName, this.dbVersion);\n\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName, { keyPath: 'key' });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = (e) => {\n console.warn('[Jellyfin Cache] IndexedDB open error:', e);\n resolve(null);\n };\n });\n\n return this.dbPromise;\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n try {\n const db = await this.getDB();\n if (!db) return null;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readonly');\n const store = tx.objectStore(this.storeName);\n const request = store.get(key);\n request.onsuccess = () => {\n const record = request.result;\n resolve(record ? (record.data as T) : null);\n };\n request.onerror = () => resolve(null);\n });\n } catch {\n return null;\n }\n }\n\n async set<T = unknown>(key: string, data: T): Promise<void> {\n if (!data) return;\n try {\n const db = await this.getDB();\n if (!db) return;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const record = { key, data, timestamp: Date.now() };\n const request = store.put(record);\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n } catch {\n // ignore cache failure\n }\n }\n\n async delete(key: string): Promise<void> {\n try {\n const db = await this.getDB();\n if (!db) return;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const request = store.delete(key);\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n } catch {\n // ignore\n }\n }\n\n async clear(): Promise<void> {\n try {\n const db = await this.getDB();\n if (!db) return;\n\n return new Promise((resolve) => {\n const tx = db.transaction(this.storeName, 'readwrite');\n const store = tx.objectStore(this.storeName);\n const request = store.clear();\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n } catch {\n // ignore\n }\n }\n}\n\n/**\n * Executes a Stale-While-Revalidate pattern using a CacheAdapter.\n */\nexport async function fetchWithCache<T>(\n cache: CacheAdapter,\n cacheKey: string,\n fetchFn: () => Promise<T>,\n onFreshData?: (data: T) => void\n): Promise<T> {\n const cached = await cache.get<T>(cacheKey);\n\n const backgroundFetch = fetchFn().then(async (freshData) => {\n if (freshData !== null && freshData !== undefined) {\n await cache.set(cacheKey, freshData);\n if (onFreshData) {\n try {\n onFreshData(freshData);\n } catch (e) {\n console.warn('[Jellyfin Cache] Error in onFreshData callback for %s:', cacheKey, e);\n }\n }\n }\n return freshData;\n }).catch((err) => {\n console.warn('[Jellyfin Cache] Background fetch failed for %s:', cacheKey, err);\n if (!cached) throw err;\n return cached;\n });\n\n if (cached !== null && cached !== undefined) {\n return cached;\n }\n\n return await backgroundFetch;\n}\n\n","import type { StorageAdapter } from './types.js';\n\nexport class MemoryStorage implements StorageAdapter {\n private store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.has(key) ? this.store.get(key)! : null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n\nexport class LocalStorageAdapter implements StorageAdapter {\n getItem(key: string): string | null {\n if (typeof localStorage !== 'undefined') {\n return localStorage.getItem(key);\n }\n return null;\n }\n\n setItem(key: string, value: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(key, value);\n }\n }\n\n removeItem(key: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(key);\n }\n }\n}\n\nexport function getDefaultStorage(): StorageAdapter {\n if (typeof window !== 'undefined' && typeof window.localStorage !== 'undefined') {\n return new LocalStorageAdapter();\n }\n return new MemoryStorage();\n}\n\nexport function generateDeviceId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n const array = new Uint8Array(16);\n crypto.getRandomValues(array);\n return 'sdk-' + Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n return 'sdk-' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n}\n\n","import { HttpTransport } from './http.js';\nimport { AuthModule } from './auth.js';\nimport { SystemModule } from './system.js';\nimport { LibraryModule } from './library.js';\nimport { PlaylistsModule } from './playlists.js';\nimport { PlaybackModule } from './playback.js';\nimport { MediaModule } from './media.js';\nimport { LyricsModule } from './lyrics.js';\nimport { FavoritesModule } from './favorites.js';\nimport { OfflineStorageManager } from './offline.js';\nimport { ResumeModule } from './resume.js';\nimport { NextUpModule } from './next-up.js';\nimport { LatestModule } from './latest.js';\nimport { TranscodeModule } from './transcode.js';\nimport { SearchModule } from './search.js';\nimport { WebSocketModule } from './websocket.js';\nimport { SessionsModule } from './sessions.js';\nimport { QuickConnectModule } from './quick-connect.js';\nimport { TrickplayModule } from './trickplay.js';\nimport { ChaptersModule } from './chapters.js';\nimport { GenresModule } from './genres.js';\nimport { CollectionsModule } from './collections.js';\nimport { DisplayPreferencesModule } from './display-preferences.js';\nimport { CacheAdapter, MemoryCacheAdapter } from './cache.js';\nimport { generateDeviceId, getDefaultStorage } from './storage.js';\nimport type { ClientInfo, JellyfinClientOptions, StorageAdapter } from './types.js';\n\nexport type ClientEventType = 'unauthorized' | 'authenticated' | 'logout';\nexport type ClientEventListener = (...args: unknown[]) => void;\n\nexport class JellyfinClient {\n public readonly auth: AuthModule;\n public readonly system: SystemModule;\n public readonly library: LibraryModule;\n public readonly search: SearchModule;\n public readonly playlists: PlaylistsModule;\n public readonly playback: PlaybackModule;\n public readonly media: MediaModule;\n public readonly lyrics: LyricsModule;\n public readonly favorites: FavoritesModule;\n public readonly offline: OfflineStorageManager;\n public readonly resume: ResumeModule;\n public readonly nextUp: NextUpModule;\n public readonly latest: LatestModule;\n public readonly transcode: TranscodeModule;\n public readonly websocket: WebSocketModule;\n public readonly sessions: SessionsModule;\n public readonly quickConnect: QuickConnectModule;\n public readonly trickplay: TrickplayModule;\n public readonly chapters: ChaptersModule;\n public readonly genres: GenresModule;\n public readonly collections: CollectionsModule;\n public readonly displayPreferences: DisplayPreferencesModule;\n\n private http: HttpTransport;\n private storage: StorageAdapter;\n private cache: CacheAdapter;\n private clientInfo: ClientInfo;\n private eventListeners = new Map<ClientEventType, Set<ClientEventListener>>();\n\n constructor(options: JellyfinClientOptions = {}) {\n this.storage = options.storage || getDefaultStorage();\n this.cache = new MemoryCacheAdapter();\n\n this.clientInfo = {\n name: options.clientInfo?.name || '@francofantomius/jellyfin',\n version: options.clientInfo?.version || '0.4.1',\n device: options.clientInfo?.device || (typeof window !== 'undefined' ? 'Web Browser' : 'Node.js'),\n deviceId: options.clientInfo?.deviceId || generateDeviceId()\n };\n\n this.http = new HttpTransport({\n serverUrl: options.serverUrl,\n token: options.accessToken,\n clientInfo: this.clientInfo,\n fetch: options.fetch,\n onUnauthorized: () => {\n this.emit('unauthorized');\n if (options.onUnauthorized) {\n options.onUnauthorized();\n }\n }\n });\n\n const getUserId = () => this.auth.getUserId();\n const getDeviceId = () => this.clientInfo.deviceId;\n\n this.system = new SystemModule(this.http, {\n serverVersion: options.serverVersion,\n targetVersion: options.targetVersion\n });\n this.auth = new AuthModule(this.http, options.userId || '');\n this.library = new LibraryModule(this.http, getUserId);\n this.search = new SearchModule(this.http, getUserId);\n this.playlists = new PlaylistsModule(this.http, getUserId);\n this.playback = new PlaybackModule(this.http);\n this.media = new MediaModule(this.http, getUserId);\n this.lyrics = new LyricsModule(this.http);\n this.favorites = new FavoritesModule(this.http, getUserId);\n this.offline = new OfflineStorageManager(this.media);\n this.resume = new ResumeModule(this.http, getUserId);\n this.nextUp = new NextUpModule(this.http, getUserId);\n this.latest = new LatestModule(this.http, getUserId);\n this.transcode = new TranscodeModule(this.http, getDeviceId);\n this.websocket = new WebSocketModule(this.http, getDeviceId);\n this.sessions = new SessionsModule(this.http, getUserId);\n this.quickConnect = new QuickConnectModule(this.http);\n this.trickplay = new TrickplayModule(this.http);\n this.chapters = new ChaptersModule(this.http, getUserId);\n this.genres = new GenresModule(this.http, getUserId);\n this.collections = new CollectionsModule(this.http, getUserId);\n this.displayPreferences = new DisplayPreferencesModule(this.http, getUserId, this.clientInfo.name);\n }\n\n // --- Configuration Getters & Setters ---\n\n get serverUrl(): string {\n return this.http.getServerUrl();\n }\n\n set serverUrl(url: string) {\n this.http.setServerUrl(url);\n }\n\n get accessToken(): string {\n return this.http.getToken();\n }\n\n set accessToken(token: string) {\n this.http.setToken(token);\n }\n\n get userId(): string {\n return this.auth.getUserId();\n }\n\n set userId(id: string) {\n this.auth.setUserId(id);\n }\n\n get serverVersion(): string | null {\n return this.system.getVersion();\n }\n\n set serverVersion(version: string | null) {\n this.system.setVersion(version);\n }\n\n /**\n * Check whether the connected Jellyfin server is version 12.0 or higher.\n */\n async isV12(): Promise<boolean> {\n return await this.system.isV12();\n }\n\n /**\n * Query server and detect the server version via /System/Info/Public.\n */\n async detectServerVersion(): Promise<string | null> {\n return await this.system.detectVersion();\n }\n\n get info(): ClientInfo {\n return this.http.getClientInfo();\n }\n\n setClientInfo(info: Partial<ClientInfo>): void {\n this.http.setClientInfo(info);\n }\n\n getCache(): CacheAdapter {\n return this.cache;\n }\n\n setCache(cache: CacheAdapter): void {\n this.cache = cache;\n }\n\n getStorage(): StorageAdapter {\n return this.storage;\n }\n\n setStorage(storage: StorageAdapter): void {\n this.storage = storage;\n }\n\n // --- Event Handling ---\n\n on(event: ClientEventType, listener: ClientEventListener): () => void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(listener);\n\n return () => {\n this.off(event, listener);\n };\n }\n\n off(event: ClientEventType, listener: ClientEventListener): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n emit(event: ClientEventType, ...args: unknown[]): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((fn) => {\n try {\n fn(...args);\n } catch (e) {\n console.error(`[Jellyfin SDK] Event handler error on '${event}':`, e);\n }\n });\n }\n }\n\n // --- Convenience Shortcuts ---\n\n /**\n * Authenticate with username and password, update client state, and emit 'authenticated'.\n */\n async authenticate(username: string, password: string = '') {\n const res = await this.auth.authenticateByName(username, password);\n if (!this.system.getVersion()) {\n this.system.detectVersion().catch(() => {});\n }\n this.emit('authenticated', res);\n return res;\n }\n\n /**\n * Log out and clear tokens and session.\n */\n logout(): void {\n if (this.websocket.isConnected) {\n this.websocket.disconnect();\n }\n this.auth.logout();\n this.emit('logout');\n }\n\n /**\n * Manually set authentication credentials.\n */\n setCredentials(credentials: { serverUrl?: string; accessToken: string; userId: string }): void {\n if (credentials.serverUrl) {\n this.http.setServerUrl(credentials.serverUrl);\n }\n this.http.setToken(credentials.accessToken);\n this.auth.setUserId(credentials.userId);\n }\n}\n\n"]}
|