import { Album, AlbumTrack, SimilarAlbum } from '@/store/music/types'; import { fetchApi } from './lib'; import {retrieveAndInjectLyricsToTracks} from '@/utility/JellyfinApi/lyrics.ts'; const albumOptions = { SortBy: 'AlbumArtist,SortName', SortOrder: 'Ascending', IncludeItemTypes: 'MusicAlbum', Recursive: 'true', Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo,DateCreated', ImageTypeLimit: '1', EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', }; const albumParams = new URLSearchParams(albumOptions).toString(); /** * Retrieve all albums that are available on the Jellyfin server */ export async function retrieveAllAlbums() { return fetchApi<{ Items: Album[] }>(({ user_id }) => `/Users/${user_id}/Items?${albumParams}`) .then((data) => data!.Items); } /** * Retrieve a single album */ export async function retrieveAlbum(id: string): Promise { const Similar = await fetchApi<{ Items: SimilarAlbum[] }>(({ user_id }) => `/Items/${id}/Similar?userId=${user_id}&limit=12`) .then((albums) => albums!.Items.map((a) => a.Id)); return fetchApi(({ user_id }) => `/Users/${user_id}/Items/${id}`) .then(album => ({ ...album!, Similar })); } const latestAlbumsOptions = { IncludeItemTypes: 'MusicAlbum', Fields: 'DateCreated', SortOrder: 'Ascending', }; /** * Retrieve the most recently added albums on the Jellyfin server */ export async function retrieveRecentAlbums(numberOfAlbums = 24) { // Generate custom config based on function input const options = { ...latestAlbumsOptions, Limit: numberOfAlbums.toString(), }; const params = new URLSearchParams(options).toString(); // Retrieve albums return fetchApi(({ user_id }) => `/Users/${user_id}/Items/Latest?${params}`); } /** * Retrieve a single album from the Emby server */ export async function retrieveAlbumTracks(ItemId: string) { const singleAlbumOptions = { ParentId: ItemId, SortBy: 'ParentIndexNumber,IndexNumber,SortName', Fields: 'MediaStreams', }; const singleAlbumParams = new URLSearchParams(singleAlbumOptions).toString(); return fetchApi<{ Items: AlbumTrack[] }>(({ user_id }) => `/Users/${user_id}/Items?${singleAlbumParams}`) .then((data) => retrieveAndInjectLyricsToTracks(data.Items)); }