Files
Lazuli/src/lib/services.ts

124 lines
4.4 KiB
TypeScript
Raw Normal View History

2024-02-03 02:47:23 -05:00
export class Jellyfin {
static audioPresets = (userId: string) => {
return {
MaxStreamingBitrate: '999999999',
Container: 'opus,webm|opus,mp3,aac,m4a|aac,m4b|aac,flac,webma,webm|webma,wav,ogg',
TranscodingContainer: 'ts',
TranscodingProtocol: 'hls',
AudioCodec: 'aac',
userId,
}
}
2024-02-23 00:53:54 -05:00
static fetchSerivceInfo = async (userId: string, urlOrigin: string, accessToken: string): Promise<Connection<'jellyfin'>['service']> => {
const reqHeaders = new Headers({ Authorization: `MediaBrowser Token="${accessToken}"` })
const userUrl = new URL(`Users/${userId}`, urlOrigin).href
const systemUrl = new URL('System/Info', urlOrigin).href
const userResponse = await fetch(userUrl, { headers: reqHeaders })
const systemResponse = await fetch(systemUrl, { headers: reqHeaders })
const userData: Jellyfin.User = await userResponse.json()
const systemData: Jellyfin.System = await systemResponse.json()
return {
userId,
urlOrigin,
username: userData.Name,
serverName: systemData.ServerName,
}
}
static songFactory = (song: Jellyfin.Song, connection: Connection<'jellyfin'>): Song => {
const { id, type, service } = connection
2024-02-04 01:01:37 -05:00
const thumbnail = song.ImageTags?.Primary
? new URL(`Items/${song.Id}/Images/Primary`, service.urlOrigin).href
: song.AlbumPrimaryImageTag
? new URL(`Items/${song.AlbumId}/Images/Primary`, service.urlOrigin).href
: undefined
2024-02-03 02:47:23 -05:00
2024-02-04 01:01:37 -05:00
const artists = song.ArtistItems
2024-02-03 02:47:23 -05:00
? Array.from(song.ArtistItems, (artist) => {
2024-02-04 01:01:37 -05:00
return { id: artist.Id, name: artist.Name }
2024-02-03 02:47:23 -05:00
})
2024-02-04 01:01:37 -05:00
: []
2024-02-03 02:47:23 -05:00
const audoSearchParams = new URLSearchParams(this.audioPresets(service.userId))
const audioSource = new URL(`Audio/${song.Id}/universal?${audoSearchParams.toString()}`, service.urlOrigin).href
2024-02-04 01:01:37 -05:00
return {
connectionId: id,
2024-02-23 00:53:54 -05:00
serviceType: type,
2024-02-04 01:01:37 -05:00
type: 'song',
2024-02-03 02:47:23 -05:00
id: song.Id,
name: song.Name,
duration: Math.floor(song.RunTimeTicks / 10000),
thumbnail,
artists,
albumId: song.AlbumId,
audio: audioSource,
releaseDate: String(song.ProductionYear),
}
2024-02-04 01:01:37 -05:00
}
2024-02-23 00:53:54 -05:00
static albumFactory = (album: Jellyfin.Album, connection: Connection<'jellyfin'>): Album => {
const { id, type, service } = connection
2024-02-04 01:01:37 -05:00
const thumbnail = album.ImageTags?.Primary ? new URL(`Items/${album.Id}/Images/Primary`, service.urlOrigin).href : undefined
const albumArtists = album.AlbumArtists
? Array.from(album.AlbumArtists, (artist) => {
return { id: artist.Id, name: artist.Name }
})
: []
const artists = album.ArtistItems
? Array.from(album.ArtistItems, (artist) => {
return { id: artist.Id, name: artist.Name }
})
: []
return {
connectionId: id,
2024-02-23 00:53:54 -05:00
serviceType: type,
2024-02-04 01:01:37 -05:00
type: 'album',
id: album.Id,
name: album.Name,
duration: Math.floor(album.RunTimeTicks / 10000),
thumbnail,
albumArtists,
artists,
releaseDate: String(album.ProductionYear),
}
}
2024-02-23 00:53:54 -05:00
static playListFactory = (playlist: Jellyfin.Playlist, connection: Connection<'jellyfin'>): Playlist => {
const { id, type, service } = connection
2024-02-04 01:01:37 -05:00
const thumbnail = playlist.ImageTags?.Primary ? new URL(`Items/${playlist.Id}/Images/Primary`, service.urlOrigin).href : undefined
return {
connectionId: id,
2024-02-23 00:53:54 -05:00
serviceType: type,
2024-02-04 01:01:37 -05:00
type: 'playlist',
id: playlist.Id,
name: playlist.Name,
duration: Math.floor(playlist.RunTimeTicks / 10000),
thumbnail,
}
}
2024-02-23 00:53:54 -05:00
static artistFactory = (artist: Jellyfin.Artist, connection: Connection<'jellyfin'>): Artist => {
const { id, type, service } = connection
2024-02-04 01:01:37 -05:00
const thumbnail = artist.ImageTags?.Primary ? new URL(`Items/${artist.Id}/Images/Primary`, service.urlOrigin).href : undefined
return {
connectionId: id,
2024-02-23 00:53:54 -05:00
serviceType: type,
2024-02-04 01:01:37 -05:00
type: 'artist',
id: artist.Id,
name: artist.Name,
thumbnail,
}
2024-02-03 02:47:23 -05:00
}
}