@francofantomius/jellyfin 0.1.0
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/LICENSE +21 -0
- package/README.md +285 -0
- package/dist/index.cjs +2247 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1092 -0
- package/dist/index.d.ts +1092 -0
- package/dist/index.js +2213 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +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/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 = this.requireUserId();\n const {\n limit = 30,\n startIndex = 0,\n includeItemTypes = 'Audio,MusicAlbum,MusicArtist,Playlist,Movie,Series,Episode'\n } = options;\n\n return await this.http.request<ItemsResponse>(`/Users/${userId}/Items`, {\n params: {\n SearchTerm: query.trim(),\n IncludeItemTypes: includeItemTypes,\n Limit: limit,\n StartIndex: startIndex,\n Recursive: true,\n Fields: COMMON_ITEM_FIELDS\n }\n });\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 */\n async reportStopped(itemId: string, positionTicks: number = 0): 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 } 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","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 { 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 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\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.1.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\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.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 }\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"]}
|