Files
jellyfin-audio-player/src/store/music/actions.ts

104 lines
3.0 KiB
TypeScript
Raw Normal View History

2020-06-17 14:58:04 +02:00
import { createAsyncThunk, createEntityAdapter } from '@reduxjs/toolkit';
2022-01-01 19:09:21 +01:00
import { Album, AlbumTrack, Playlist } from './types';
2020-06-17 14:58:04 +02:00
import { AsyncThunkAPI } from '..';
2024-07-26 12:01:21 +02:00
import { retrieveAllAlbums, retrieveRecentAlbums, retrieveAlbumTracks, retrieveAlbum, retrieveSimilarAlbums } from '@/utility/JellyfinApi/album';
import { retrieveAllPlaylists, retrievePlaylistTracks } from '@/utility/JellyfinApi/playlist';
import { searchItem } from '@/utility/JellyfinApi/search';
2020-06-17 14:58:04 +02:00
2024-02-08 22:11:43 +01:00
export const albumAdapter = createEntityAdapter<Album, string>({
2020-06-17 14:58:04 +02:00
selectId: album => album.Id,
sortComparer: (a, b) => a.Name.localeCompare(b.Name),
});
2020-06-21 13:02:23 +02:00
/**
* Fetch all albums available on the jellyfin server
*/
2020-06-17 14:58:04 +02:00
export const fetchAllAlbums = createAsyncThunk<Album[], undefined, AsyncThunkAPI>(
'/albums/all',
retrieveAllAlbums,
2020-06-17 14:58:04 +02:00
);
2020-06-21 13:02:23 +02:00
/**
* Retrieve the most recent albums
*/
export const fetchRecentAlbums = createAsyncThunk<Album[], number | undefined, AsyncThunkAPI>(
'/albums/recent',
retrieveRecentAlbums,
2020-06-21 13:02:23 +02:00
);
2024-02-08 22:11:43 +01:00
export const trackAdapter = createEntityAdapter<AlbumTrack, string>({
2020-06-17 14:58:04 +02:00
selectId: track => track.Id,
sortComparer: (a, b) => a.IndexNumber - b.IndexNumber,
});
2020-06-21 13:02:23 +02:00
/**
* Retrieve all tracks from a particular album
*/
2020-06-17 14:58:04 +02:00
export const fetchTracksByAlbum = createAsyncThunk<AlbumTrack[], string, AsyncThunkAPI>(
'/tracks/byAlbum',
retrieveAlbumTracks,
2021-04-24 14:50:43 +02:00
);
export const fetchAlbum = createAsyncThunk<Album, string, AsyncThunkAPI>(
'/albums/single',
retrieveAlbum,
);
2024-07-26 12:01:21 +02:00
export const fetchSimilarAlbums = createAsyncThunk<Album[], string, AsyncThunkAPI>(
'/albums/similar',
retrieveSimilarAlbums,
);
2021-04-24 14:50:43 +02:00
type SearchAndFetchResults = {
albums: Album[];
results: (Album | AlbumTrack)[];
};
export const searchAndFetchAlbums = createAsyncThunk<
SearchAndFetchResults,
{ term: string, limit?: number },
AsyncThunkAPI
>(
'/search',
async ({ term, limit = 24 }, thunkAPI) => {
const state = thunkAPI.getState();
const results = await searchItem(term, limit);
2021-04-24 14:50:43 +02:00
const albums = await Promise.all(results.filter((item) => (
!state.music.albums.ids.includes(item.Type === 'MusicAlbum' ? item.Id : item.AlbumId)
2024-05-26 00:23:29 +02:00
&& (item.Type === 'Audio' ? item.AlbumId : true)
2021-04-24 14:50:43 +02:00
)).map(async (item) => {
if (item.Type === 'MusicAlbum') {
return item;
}
return retrieveAlbum(item.AlbumId);
2021-04-24 14:50:43 +02:00
}));
return {
albums,
results
};
}
2022-01-01 19:09:21 +01:00
);
2024-02-08 22:11:43 +01:00
export const playlistAdapter = createEntityAdapter<Playlist, string>({
2022-01-01 19:09:21 +01:00
selectId: (playlist) => playlist.Id,
sortComparer: (a, b) => a.Name.localeCompare(b.Name),
});
/**
* Fetch all playlists available
*/
export const fetchAllPlaylists = createAsyncThunk<Playlist[], undefined, AsyncThunkAPI>(
'/playlists/all',
retrieveAllPlaylists,
2022-01-01 19:09:21 +01:00
);
/**
* Retrieve all tracks from a particular playlist
*/
export const fetchTracksByPlaylist = createAsyncThunk<AlbumTrack[], string, AsyncThunkAPI>(
'/tracks/byPlaylist',
retrievePlaylistTracks,
2020-06-17 14:58:04 +02:00
);