feishin/src/renderer/api/controller.ts

342 lines
12 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,
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-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-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-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-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' });
return () => undefined;
}
const controllerFn = endpoints[serverType][endpoint];
if (typeof controllerFn !== 'function') {
toast.error({
message: `Endpoint ${endpoint} is not implemented for ${serverType}`,
title: 'Unable to route request',
});
return () => undefined;
}
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) => {
return (apiController('getAlbumList') as ControllerEndpoint['getAlbumList'])?.(args);
};
const getAlbumDetail = async (args: AlbumDetailArgs) => {
return (apiController('getAlbumDetail') as ControllerEndpoint['getAlbumDetail'])?.(args);
};
const getSongList = async (args: SongListArgs) => {
return (apiController('getSongList') as ControllerEndpoint['getSongList'])?.(args);
};
2022-12-20 19:11:33 -08:00
const getMusicFolderList = async (args: MusicFolderListArgs) => {
return (apiController('getMusicFolderList') as ControllerEndpoint['getMusicFolderList'])?.(args);
};
2022-12-22 01:56:59 -08:00
const getGenreList = async (args: GenreListArgs) => {
return (apiController('getGenreList') as ControllerEndpoint['getGenreList'])?.(args);
};
2023-01-08 20:45:38 -08:00
const getAlbumArtistDetail = async (args: AlbumArtistDetailArgs) => {
return (apiController('getAlbumArtistDetail') as ControllerEndpoint['getAlbumArtistDetail'])?.(
args,
);
};
2022-12-30 21:04:06 -08:00
const getAlbumArtistList = async (args: AlbumArtistListArgs) => {
return (apiController('getAlbumArtistList') as ControllerEndpoint['getAlbumArtistList'])?.(args);
};
const getArtistList = async (args: ArtistListArgs) => {
return (apiController('getArtistList') as ControllerEndpoint['getArtistList'])?.(args);
};
2022-12-31 03:46:12 -08:00
const getPlaylistList = async (args: PlaylistListArgs) => {
return (apiController('getPlaylistList') as ControllerEndpoint['getPlaylistList'])?.(args);
};
const createPlaylist = async (args: CreatePlaylistArgs) => {
return (apiController('createPlaylist') as ControllerEndpoint['createPlaylist'])?.(args);
};
const updatePlaylist = async (args: UpdatePlaylistArgs) => {
return (apiController('updatePlaylist') as ControllerEndpoint['updatePlaylist'])?.(args);
};
2023-01-03 00:28:09 -08:00
const deletePlaylist = async (args: DeletePlaylistArgs) => {
return (apiController('deletePlaylist') as ControllerEndpoint['deletePlaylist'])?.(args);
};
const addToPlaylist = async (args: AddToPlaylistArgs) => {
return (apiController('addToPlaylist') as ControllerEndpoint['addToPlaylist'])?.(args);
};
const removeFromPlaylist = async (args: RemoveFromPlaylistArgs) => {
return (apiController('removeFromPlaylist') as ControllerEndpoint['removeFromPlaylist'])?.(args);
};
2022-12-31 18:03:26 -08:00
const getPlaylistDetail = async (args: PlaylistDetailArgs) => {
return (apiController('getPlaylistDetail') as ControllerEndpoint['getPlaylistDetail'])?.(args);
};
const getPlaylistSongList = async (args: PlaylistSongListArgs) => {
return (apiController('getPlaylistSongList') as ControllerEndpoint['getPlaylistSongList'])?.(
args,
);
};
const getUserList = async (args: UserListArgs) => {
return (apiController('getUserList') as ControllerEndpoint['getUserList'])?.(args);
};
const createFavorite = async (args: FavoriteArgs) => {
return (apiController('createFavorite') as ControllerEndpoint['createFavorite'])?.(args);
};
const deleteFavorite = async (args: FavoriteArgs) => {
return (apiController('deleteFavorite') as ControllerEndpoint['deleteFavorite'])?.(args);
};
2023-04-27 20:34:28 -07:00
const updateRating = async (args: SetRatingArgs) => {
return (apiController('setRating') as ControllerEndpoint['setRating'])?.(args);
};
2023-01-12 18:43:25 -08:00
const getTopSongList = async (args: TopSongListArgs) => {
return (apiController('getTopSongs') as ControllerEndpoint['getTopSongs'])?.(args);
};
const scrobble = async (args: ScrobbleArgs) => {
2023-04-27 20:34:28 -07:00
return (apiController('scrobble') as ControllerEndpoint['scrobble'])?.(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,
updatePlaylist,
updateRating,
2022-12-19 15:59:14 -08:00
};