feishin/src/renderer/api/controller.ts

456 lines
14 KiB
TypeScript
Raw Normal View History

2022-12-19 15:59:14 -08:00
import { useAuthStore } from '/@/renderer/store';
import { toast } from '/@/renderer/components/toast/index';
2022-12-19 15:59:14 -08:00
import type {
AlbumDetailArgs,
AlbumListArgs,
SongListArgs,
SongDetailArgs,
AlbumArtistDetailArgs,
AlbumArtistListArgs,
2023-04-27 20:34:28 -07:00
SetRatingArgs,
2022-12-19 15:59:14 -08:00
GenreListArgs,
CreatePlaylistArgs,
DeletePlaylistArgs,
PlaylistDetailArgs,
PlaylistListArgs,
MusicFolderListArgs,
PlaylistSongListArgs,
ArtistListArgs,
UpdatePlaylistArgs,
UserListArgs,
FavoriteArgs,
2023-01-12 18:43:25 -08:00
TopSongListArgs,
AddToPlaylistArgs,
2023-04-24 01:22:58 -07:00
AddToPlaylistResponse,
RemoveFromPlaylistArgs,
2023-04-24 01:22:58 -07:00
RemoveFromPlaylistResponse,
ScrobbleArgs,
2023-04-24 01:22:58 -07:00
ScrobbleResponse,
AlbumArtistDetailResponse,
FavoriteResponse,
CreatePlaylistResponse,
AlbumArtistListResponse,
AlbumDetailResponse,
AlbumListResponse,
ArtistListResponse,
GenreListResponse,
MusicFolderListResponse,
PlaylistDetailResponse,
PlaylistListResponse,
RatingResponse,
SongDetailResponse,
SongListResponse,
TopSongListResponse,
UpdatePlaylistResponse,
UserListResponse,
AuthenticationResponse,
2023-05-19 00:14:41 -07:00
SearchArgs,
SearchResponse,
2022-12-19 15:59:14 -08:00
} from '/@/renderer/api/types';
import { ServerType } from '/@/renderer/types';
2023-04-24 01:22:58 -07:00
import { DeletePlaylistResponse } from './types';
import { ndController } from '/@/renderer/api/navidrome/navidrome-controller';
import { ssController } from '/@/renderer/api/subsonic/subsonic-controller';
import { jfController } from '/@/renderer/api/jellyfin/jellyfin-controller';
2022-12-19 15:59:14 -08:00
export type ControllerEndpoint = Partial<{
2023-04-24 01:22:58 -07:00
addToPlaylist: (args: AddToPlaylistArgs) => Promise<AddToPlaylistResponse>;
authenticate: (
url: string,
body: { password: string; username: string },
) => Promise<AuthenticationResponse>;
2022-12-19 15:59:14 -08:00
clearPlaylist: () => void;
2023-04-24 01:22:58 -07:00
createFavorite: (args: FavoriteArgs) => Promise<FavoriteResponse>;
createPlaylist: (args: CreatePlaylistArgs) => Promise<CreatePlaylistResponse>;
deleteFavorite: (args: FavoriteArgs) => Promise<FavoriteResponse>;
deletePlaylist: (args: DeletePlaylistArgs) => Promise<DeletePlaylistResponse>;
getAlbumArtistDetail: (args: AlbumArtistDetailArgs) => Promise<AlbumArtistDetailResponse>;
getAlbumArtistList: (args: AlbumArtistListArgs) => Promise<AlbumArtistListResponse>;
getAlbumDetail: (args: AlbumDetailArgs) => Promise<AlbumDetailResponse>;
getAlbumList: (args: AlbumListArgs) => Promise<AlbumListResponse>;
2022-12-19 15:59:14 -08:00
getArtistDetail: () => void;
2023-01-12 18:43:25 -08:00
getArtistInfo: (args: any) => void;
2023-04-24 01:22:58 -07:00
getArtistList: (args: ArtistListArgs) => Promise<ArtistListResponse>;
2022-12-19 15:59:14 -08:00
getFavoritesList: () => void;
getFolderItemList: () => void;
getFolderList: () => void;
getFolderSongs: () => void;
2023-04-24 01:22:58 -07:00
getGenreList: (args: GenreListArgs) => Promise<GenreListResponse>;
getMusicFolderList: (args: MusicFolderListArgs) => Promise<MusicFolderListResponse>;
getPlaylistDetail: (args: PlaylistDetailArgs) => Promise<PlaylistDetailResponse>;
getPlaylistList: (args: PlaylistListArgs) => Promise<PlaylistListResponse>;
getPlaylistSongList: (args: PlaylistSongListArgs) => Promise<SongListResponse>;
getSongDetail: (args: SongDetailArgs) => Promise<SongDetailResponse>;
getSongList: (args: SongListArgs) => Promise<SongListResponse>;
getTopSongs: (args: TopSongListArgs) => Promise<TopSongListResponse>;
getUserList: (args: UserListArgs) => Promise<UserListResponse>;
removeFromPlaylist: (args: RemoveFromPlaylistArgs) => Promise<RemoveFromPlaylistResponse>;
scrobble: (args: ScrobbleArgs) => Promise<ScrobbleResponse>;
2023-05-19 00:14:41 -07:00
search: (args: SearchArgs) => Promise<SearchResponse>;
2023-04-27 20:34:28 -07:00
setRating: (args: SetRatingArgs) => Promise<RatingResponse>;
2023-04-24 01:22:58 -07:00
updatePlaylist: (args: UpdatePlaylistArgs) => Promise<UpdatePlaylistResponse>;
2022-12-19 15:59:14 -08:00
}>;
type ApiController = {
jellyfin: ControllerEndpoint;
navidrome: ControllerEndpoint;
subsonic: ControllerEndpoint;
};
const endpoints: ApiController = {
jellyfin: {
addToPlaylist: jfController.addToPlaylist,
authenticate: jfController.authenticate,
2022-12-19 15:59:14 -08:00
clearPlaylist: undefined,
createFavorite: jfController.createFavorite,
createPlaylist: jfController.createPlaylist,
deleteFavorite: jfController.deleteFavorite,
deletePlaylist: jfController.deletePlaylist,
getAlbumArtistDetail: jfController.getAlbumArtistDetail,
getAlbumArtistList: jfController.getAlbumArtistList,
getAlbumDetail: jfController.getAlbumDetail,
getAlbumList: jfController.getAlbumList,
2022-12-19 15:59:14 -08:00
getArtistDetail: undefined,
2023-01-12 18:43:25 -08:00
getArtistInfo: undefined,
getArtistList: undefined,
2022-12-19 15:59:14 -08:00
getFavoritesList: undefined,
getFolderItemList: undefined,
getFolderList: undefined,
getFolderSongs: undefined,
getGenreList: jfController.getGenreList,
getMusicFolderList: jfController.getMusicFolderList,
getPlaylistDetail: jfController.getPlaylistDetail,
getPlaylistList: jfController.getPlaylistList,
getPlaylistSongList: jfController.getPlaylistSongList,
2022-12-19 15:59:14 -08:00
getSongDetail: undefined,
getSongList: jfController.getSongList,
getTopSongs: jfController.getTopSongList,
getUserList: undefined,
removeFromPlaylist: jfController.removeFromPlaylist,
scrobble: jfController.scrobble,
2023-05-19 00:14:41 -07:00
search: undefined,
2023-04-27 20:34:28 -07:00
setRating: undefined,
updatePlaylist: jfController.updatePlaylist,
2022-12-19 15:59:14 -08:00
},
navidrome: {
2023-04-24 01:22:58 -07:00
addToPlaylist: ndController.addToPlaylist,
authenticate: ndController.authenticate,
2022-12-19 15:59:14 -08:00
clearPlaylist: undefined,
2023-04-24 01:22:58 -07:00
createFavorite: ssController.createFavorite,
createPlaylist: ndController.createPlaylist,
deleteFavorite: ssController.removeFavorite,
deletePlaylist: ndController.deletePlaylist,
getAlbumArtistDetail: ndController.getAlbumArtistDetail,
getAlbumArtistList: ndController.getAlbumArtistList,
getAlbumDetail: ndController.getAlbumDetail,
getAlbumList: ndController.getAlbumList,
2022-12-19 15:59:14 -08:00
getArtistDetail: undefined,
2023-01-12 18:43:25 -08:00
getArtistInfo: undefined,
2022-12-19 15:59:14 -08:00
getArtistList: undefined,
getFavoritesList: undefined,
getFolderItemList: undefined,
getFolderList: undefined,
getFolderSongs: undefined,
2023-04-24 01:22:58 -07:00
getGenreList: ndController.getGenreList,
getMusicFolderList: ssController.getMusicFolderList,
getPlaylistDetail: ndController.getPlaylistDetail,
getPlaylistList: ndController.getPlaylistList,
getPlaylistSongList: ndController.getPlaylistSongList,
getSongDetail: ndController.getSongDetail,
getSongList: ndController.getSongList,
getTopSongs: ssController.getTopSongList,
getUserList: ndController.getUserList,
removeFromPlaylist: ndController.removeFromPlaylist,
scrobble: ssController.scrobble,
2023-05-19 00:14:41 -07:00
search: ssController.search3,
2023-04-27 20:34:28 -07:00
setRating: ssController.setRating,
2023-04-24 01:22:58 -07:00
updatePlaylist: ndController.updatePlaylist,
2022-12-19 15:59:14 -08:00
},
subsonic: {
authenticate: ssController.authenticate,
2022-12-19 15:59:14 -08:00
clearPlaylist: undefined,
2023-04-24 01:22:58 -07:00
createFavorite: ssController.createFavorite,
2022-12-19 15:59:14 -08:00
createPlaylist: undefined,
2023-04-24 01:22:58 -07:00
deleteFavorite: ssController.removeFavorite,
2022-12-19 15:59:14 -08:00
deletePlaylist: undefined,
2023-04-24 01:22:58 -07:00
getAlbumArtistDetail: undefined,
getAlbumArtistList: undefined,
getAlbumDetail: undefined,
getAlbumList: undefined,
2022-12-19 15:59:14 -08:00
getArtistDetail: undefined,
2023-01-12 18:43:25 -08:00
getArtistInfo: undefined,
2022-12-19 15:59:14 -08:00
getArtistList: undefined,
getFavoritesList: undefined,
getFolderItemList: undefined,
getFolderList: undefined,
getFolderSongs: undefined,
getGenreList: undefined,
2023-04-24 01:22:58 -07:00
getMusicFolderList: ssController.getMusicFolderList,
2022-12-19 15:59:14 -08:00
getPlaylistDetail: undefined,
getPlaylistList: undefined,
getSongDetail: undefined,
getSongList: undefined,
2023-04-24 01:22:58 -07:00
getTopSongs: ssController.getTopSongList,
getUserList: undefined,
2023-04-24 01:22:58 -07:00
scrobble: ssController.scrobble,
2023-05-19 00:14:41 -07:00
search: ssController.search3,
2023-04-27 20:34:28 -07:00
setRating: undefined,
2022-12-19 15:59:14 -08:00
updatePlaylist: undefined,
},
};
const apiController = (endpoint: keyof ControllerEndpoint, type?: ServerType) => {
const serverType = type || useAuthStore.getState().currentServer?.type;
2022-12-19 15:59:14 -08:00
if (!serverType) {
toast.error({ message: 'No server selected', title: 'Unable to route request' });
2023-05-19 00:14:41 -07:00
throw new Error(`No server selected`);
2022-12-19 15:59:14 -08:00
}
2023-05-19 00:14:41 -07:00
const controllerFn = endpoints?.[serverType]?.[endpoint];
2022-12-19 15:59:14 -08:00
if (typeof controllerFn !== 'function') {
toast.error({
message: `Endpoint ${endpoint} is not implemented for ${serverType}`,
title: 'Unable to route request',
});
2023-05-19 00:14:41 -07:00
throw new Error(`Endpoint ${endpoint} is not implemented for ${serverType}`);
2022-12-19 15:59:14 -08:00
}
return endpoints[serverType][endpoint];
};
const authenticate = async (
url: string,
body: { legacy?: boolean; password: string; username: string },
type: ServerType,
) => {
return (apiController('authenticate', type) as ControllerEndpoint['authenticate'])?.(url, body);
};
2022-12-19 15:59:14 -08:00
const getAlbumList = async (args: AlbumListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getAlbumList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getAlbumList']
)?.(args);
2022-12-19 15:59:14 -08:00
};
const getAlbumDetail = async (args: AlbumDetailArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getAlbumDetail',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getAlbumDetail']
)?.(args);
2022-12-19 15:59:14 -08:00
};
const getSongList = async (args: SongListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getSongList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getSongList']
)?.(args);
2022-12-19 15:59:14 -08:00
};
2022-12-20 19:11:33 -08:00
const getMusicFolderList = async (args: MusicFolderListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getMusicFolderList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getMusicFolderList']
)?.(args);
2022-12-20 19:11:33 -08:00
};
2022-12-22 01:56:59 -08:00
const getGenreList = async (args: GenreListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getGenreList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getGenreList']
)?.(args);
2022-12-22 01:56:59 -08:00
};
2023-01-08 20:45:38 -08:00
const getAlbumArtistDetail = async (args: AlbumArtistDetailArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getAlbumArtistDetail',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getAlbumArtistDetail']
)?.(args);
2023-01-08 20:45:38 -08:00
};
2022-12-30 21:04:06 -08:00
const getAlbumArtistList = async (args: AlbumArtistListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getAlbumArtistList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getAlbumArtistList']
)?.(args);
2022-12-30 21:04:06 -08:00
};
const getArtistList = async (args: ArtistListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getArtistList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getArtistList']
)?.(args);
2022-12-30 21:04:06 -08:00
};
2022-12-31 03:46:12 -08:00
const getPlaylistList = async (args: PlaylistListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getPlaylistList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getPlaylistList']
)?.(args);
2022-12-31 03:46:12 -08:00
};
const createPlaylist = async (args: CreatePlaylistArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'createPlaylist',
args.apiClientProps.server?.type,
) as ControllerEndpoint['createPlaylist']
)?.(args);
};
const updatePlaylist = async (args: UpdatePlaylistArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'updatePlaylist',
args.apiClientProps.server?.type,
) as ControllerEndpoint['updatePlaylist']
)?.(args);
};
2023-01-03 00:28:09 -08:00
const deletePlaylist = async (args: DeletePlaylistArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'deletePlaylist',
args.apiClientProps.server?.type,
) as ControllerEndpoint['deletePlaylist']
)?.(args);
2023-01-03 00:28:09 -08:00
};
const addToPlaylist = async (args: AddToPlaylistArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'addToPlaylist',
args.apiClientProps.server?.type,
) as ControllerEndpoint['addToPlaylist']
)?.(args);
};
const removeFromPlaylist = async (args: RemoveFromPlaylistArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'removeFromPlaylist',
args.apiClientProps.server?.type,
) as ControllerEndpoint['removeFromPlaylist']
)?.(args);
};
2022-12-31 18:03:26 -08:00
const getPlaylistDetail = async (args: PlaylistDetailArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getPlaylistDetail',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getPlaylistDetail']
)?.(args);
2022-12-31 18:03:26 -08:00
};
const getPlaylistSongList = async (args: PlaylistSongListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getPlaylistSongList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getPlaylistSongList']
)?.(args);
2022-12-31 18:03:26 -08:00
};
const getUserList = async (args: UserListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getUserList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getUserList']
)?.(args);
};
const createFavorite = async (args: FavoriteArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'createFavorite',
args.apiClientProps.server?.type,
) as ControllerEndpoint['createFavorite']
)?.(args);
};
const deleteFavorite = async (args: FavoriteArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'deleteFavorite',
args.apiClientProps.server?.type,
) as ControllerEndpoint['deleteFavorite']
)?.(args);
};
2023-04-27 20:34:28 -07:00
const updateRating = async (args: SetRatingArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController('setRating', args.apiClientProps.server?.type) as ControllerEndpoint['setRating']
)?.(args);
};
2023-01-12 18:43:25 -08:00
const getTopSongList = async (args: TopSongListArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController(
'getTopSongs',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getTopSongs']
)?.(args);
2023-01-12 18:43:25 -08:00
};
const scrobble = async (args: ScrobbleArgs) => {
2023-05-09 05:49:05 -07:00
return (
apiController('scrobble', args.apiClientProps.server?.type) as ControllerEndpoint['scrobble']
)?.(args);
};
2023-05-19 00:14:41 -07:00
const search = async (args: SearchArgs) => {
return (
apiController('search', args.apiClientProps.server?.type) as ControllerEndpoint['search']
)?.(args);
};
2022-12-19 15:59:14 -08:00
export const controller = {
addToPlaylist,
authenticate,
createFavorite,
createPlaylist,
deleteFavorite,
2023-01-03 00:28:09 -08:00
deletePlaylist,
2023-01-08 20:45:38 -08:00
getAlbumArtistDetail,
2022-12-30 21:04:06 -08:00
getAlbumArtistList,
2022-12-19 15:59:14 -08:00
getAlbumDetail,
getAlbumList,
2022-12-30 21:04:06 -08:00
getArtistList,
2022-12-22 01:56:59 -08:00
getGenreList,
2022-12-20 19:11:33 -08:00
getMusicFolderList,
2022-12-31 18:03:26 -08:00
getPlaylistDetail,
2022-12-31 03:46:12 -08:00
getPlaylistList,
2022-12-31 18:03:26 -08:00
getPlaylistSongList,
2022-12-19 15:59:14 -08:00
getSongList,
2023-01-12 18:43:25 -08:00
getTopSongList,
getUserList,
removeFromPlaylist,
scrobble,
2023-05-19 00:14:41 -07:00
search,
updatePlaylist,
updateRating,
2022-12-19 15:59:14 -08:00
};