feishin/src/renderer/api/controller.ts

577 lines
18 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 {
2023-07-01 19:10:05 -07:00
AlbumDetailArgs,
AlbumListArgs,
SongListArgs,
SongDetailArgs,
AlbumArtistDetailArgs,
AlbumArtistListArgs,
SetRatingArgs,
ShareItemArgs,
2023-07-01 19:10:05 -07:00
GenreListArgs,
CreatePlaylistArgs,
DeletePlaylistArgs,
PlaylistDetailArgs,
PlaylistListArgs,
MusicFolderListArgs,
PlaylistSongListArgs,
ArtistListArgs,
UpdatePlaylistArgs,
UserListArgs,
FavoriteArgs,
TopSongListArgs,
AddToPlaylistArgs,
AddToPlaylistResponse,
RemoveFromPlaylistArgs,
RemoveFromPlaylistResponse,
ScrobbleArgs,
ScrobbleResponse,
AlbumArtistDetailResponse,
FavoriteResponse,
CreatePlaylistResponse,
AlbumArtistListResponse,
AlbumDetailResponse,
AlbumListResponse,
ArtistListResponse,
GenreListResponse,
MusicFolderListResponse,
PlaylistDetailResponse,
PlaylistListResponse,
RatingResponse,
SongDetailResponse,
SongListResponse,
TopSongListResponse,
UpdatePlaylistResponse,
UserListResponse,
AuthenticationResponse,
SearchArgs,
SearchResponse,
LyricsArgs,
LyricsResponse,
2024-02-01 08:17:31 -08:00
ServerInfo,
ServerInfoArgs,
2024-02-01 23:53:10 -08:00
StructuredLyricsArgs,
StructuredLyric,
SimilarSongsArgs,
Song,
ServerType,
ShareItemResponse,
2022-12-19 15:59:14 -08:00
} from '/@/renderer/api/types';
2023-05-21 07:30:28 -07:00
import { DeletePlaylistResponse, RandomSongListArgs } from './types';
2023-04-24 01:22:58 -07:00
import { ndController } from '/@/renderer/api/navidrome/navidrome-controller';
import { ssController } from '/@/renderer/api/subsonic/subsonic-controller';
import { jfController } from '/@/renderer/api/jellyfin/jellyfin-controller';
import i18n from '/@/i18n/i18n';
2022-12-19 15:59:14 -08:00
export type ControllerEndpoint = Partial<{
2023-07-01 19:10:05 -07:00
addToPlaylist: (args: AddToPlaylistArgs) => Promise<AddToPlaylistResponse>;
authenticate: (
url: string,
body: { password: string; username: string },
) => Promise<AuthenticationResponse>;
clearPlaylist: () => void;
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>;
getArtistDetail: () => void;
getArtistInfo: (args: any) => void;
getArtistList: (args: ArtistListArgs) => Promise<ArtistListResponse>;
getFavoritesList: () => void;
getFolderItemList: () => void;
getFolderList: () => void;
getFolderSongs: () => void;
getGenreList: (args: GenreListArgs) => Promise<GenreListResponse>;
getLyrics: (args: LyricsArgs) => Promise<LyricsResponse>;
getMusicFolderList: (args: MusicFolderListArgs) => Promise<MusicFolderListResponse>;
getPlaylistDetail: (args: PlaylistDetailArgs) => Promise<PlaylistDetailResponse>;
getPlaylistList: (args: PlaylistListArgs) => Promise<PlaylistListResponse>;
getPlaylistSongList: (args: PlaylistSongListArgs) => Promise<SongListResponse>;
getRandomSongList: (args: RandomSongListArgs) => Promise<SongListResponse>;
2024-02-01 08:17:31 -08:00
getServerInfo: (args: ServerInfoArgs) => Promise<ServerInfo>;
getSimilarSongs: (args: SimilarSongsArgs) => Promise<Song[]>;
2023-07-01 19:10:05 -07:00
getSongDetail: (args: SongDetailArgs) => Promise<SongDetailResponse>;
getSongList: (args: SongListArgs) => Promise<SongListResponse>;
2024-02-01 23:53:10 -08:00
getStructuredLyrics: (args: StructuredLyricsArgs) => Promise<StructuredLyric[]>;
2023-07-01 19:10:05 -07:00
getTopSongs: (args: TopSongListArgs) => Promise<TopSongListResponse>;
getUserList: (args: UserListArgs) => Promise<UserListResponse>;
removeFromPlaylist: (args: RemoveFromPlaylistArgs) => Promise<RemoveFromPlaylistResponse>;
scrobble: (args: ScrobbleArgs) => Promise<ScrobbleResponse>;
search: (args: SearchArgs) => Promise<SearchResponse>;
setRating: (args: SetRatingArgs) => Promise<RatingResponse>;
shareItem: (args: ShareItemArgs) => Promise<ShareItemResponse>;
2023-07-01 19:10:05 -07:00
updatePlaylist: (args: UpdatePlaylistArgs) => Promise<UpdatePlaylistResponse>;
2022-12-19 15:59:14 -08:00
}>;
type ApiController = {
2023-07-01 19:10:05 -07:00
jellyfin: ControllerEndpoint;
navidrome: ControllerEndpoint;
subsonic: ControllerEndpoint;
2022-12-19 15:59:14 -08:00
};
const endpoints: ApiController = {
2023-07-01 19:10:05 -07:00
jellyfin: {
addToPlaylist: jfController.addToPlaylist,
authenticate: jfController.authenticate,
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,
getArtistDetail: undefined,
getArtistInfo: undefined,
getArtistList: undefined,
getFavoritesList: undefined,
getFolderItemList: undefined,
getFolderList: undefined,
getFolderSongs: undefined,
getGenreList: jfController.getGenreList,
getLyrics: jfController.getLyrics,
getMusicFolderList: jfController.getMusicFolderList,
getPlaylistDetail: jfController.getPlaylistDetail,
getPlaylistList: jfController.getPlaylistList,
getPlaylistSongList: jfController.getPlaylistSongList,
getRandomSongList: jfController.getRandomSongList,
2024-02-01 08:17:31 -08:00
getServerInfo: jfController.getServerInfo,
getSimilarSongs: jfController.getSimilarSongs,
getSongDetail: jfController.getSongDetail,
2023-07-01 19:10:05 -07:00
getSongList: jfController.getSongList,
2024-02-01 23:53:10 -08:00
getStructuredLyrics: undefined,
2023-07-01 19:10:05 -07:00
getTopSongs: jfController.getTopSongList,
getUserList: undefined,
removeFromPlaylist: jfController.removeFromPlaylist,
scrobble: jfController.scrobble,
search: jfController.search,
setRating: undefined,
shareItem: undefined,
2023-07-01 19:10:05 -07:00
updatePlaylist: jfController.updatePlaylist,
},
navidrome: {
addToPlaylist: ndController.addToPlaylist,
authenticate: ndController.authenticate,
clearPlaylist: undefined,
createFavorite: ssController.createFavorite,
createPlaylist: ndController.createPlaylist,
deleteFavorite: ssController.removeFavorite,
deletePlaylist: ndController.deletePlaylist,
getAlbumArtistDetail: ndController.getAlbumArtistDetail,
getAlbumArtistList: ndController.getAlbumArtistList,
getAlbumDetail: ndController.getAlbumDetail,
getAlbumList: ndController.getAlbumList,
getArtistDetail: undefined,
getArtistInfo: undefined,
getArtistList: undefined,
getFavoritesList: undefined,
getFolderItemList: undefined,
getFolderList: undefined,
getFolderSongs: undefined,
getGenreList: ndController.getGenreList,
getLyrics: undefined,
getMusicFolderList: ssController.getMusicFolderList,
getPlaylistDetail: ndController.getPlaylistDetail,
getPlaylistList: ndController.getPlaylistList,
getPlaylistSongList: ndController.getPlaylistSongList,
getRandomSongList: ssController.getRandomSongList,
getServerInfo: ndController.getServerInfo,
getSimilarSongs: ndController.getSimilarSongs,
2023-07-01 19:10:05 -07:00
getSongDetail: ndController.getSongDetail,
getSongList: ndController.getSongList,
2024-02-01 23:53:10 -08:00
getStructuredLyrics: ssController.getStructuredLyrics,
2023-07-01 19:10:05 -07:00
getTopSongs: ssController.getTopSongList,
getUserList: ndController.getUserList,
removeFromPlaylist: ndController.removeFromPlaylist,
scrobble: ssController.scrobble,
search: ssController.search3,
setRating: ssController.setRating,
shareItem: ndController.shareItem,
2023-07-01 19:10:05 -07:00
updatePlaylist: ndController.updatePlaylist,
},
subsonic: {
authenticate: ssController.authenticate,
clearPlaylist: undefined,
createFavorite: ssController.createFavorite,
createPlaylist: undefined,
deleteFavorite: ssController.removeFavorite,
deletePlaylist: undefined,
getAlbumArtistDetail: undefined,
getAlbumArtistList: undefined,
getAlbumDetail: undefined,
getAlbumList: undefined,
getArtistDetail: undefined,
getArtistInfo: undefined,
getArtistList: undefined,
getFavoritesList: undefined,
getFolderItemList: undefined,
getFolderList: undefined,
getFolderSongs: undefined,
getGenreList: undefined,
getLyrics: undefined,
getMusicFolderList: ssController.getMusicFolderList,
getPlaylistDetail: undefined,
getPlaylistList: undefined,
2024-02-01 08:17:31 -08:00
getServerInfo: ssController.getServerInfo,
getSimilarSongs: ssController.getSimilarSongs,
2023-07-01 19:10:05 -07:00
getSongDetail: undefined,
getSongList: undefined,
2024-02-01 23:53:10 -08:00
getStructuredLyrics: ssController.getStructuredLyrics,
2023-07-01 19:10:05 -07:00
getTopSongs: ssController.getTopSongList,
getUserList: undefined,
scrobble: ssController.scrobble,
search: ssController.search3,
setRating: undefined,
shareItem: undefined,
2023-07-01 19:10:05 -07:00
updatePlaylist: undefined,
},
2022-12-19 15:59:14 -08:00
};
const apiController = (endpoint: keyof ControllerEndpoint, type?: ServerType) => {
2023-07-01 19:10:05 -07:00
const serverType = type || useAuthStore.getState().currentServer?.type;
2022-12-19 15:59:14 -08:00
2023-07-01 19:10:05 -07:00
if (!serverType) {
toast.error({
message: i18n.t('error.serverNotSelectedError', {
postProcess: 'sentenceCase',
}) as string,
title: i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' }) as string,
});
2023-07-01 19:10:05 -07:00
throw new Error(`No server selected`);
}
2022-12-19 15:59:14 -08:00
2023-07-01 19:10:05 -07:00
const controllerFn = endpoints?.[serverType]?.[endpoint];
2022-12-19 15:59:14 -08:00
2023-07-01 19:10:05 -07:00
if (typeof controllerFn !== 'function') {
toast.error({
message: `Endpoint ${endpoint} is not implemented for ${serverType}`,
title: i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' }) as string,
2023-07-01 19:10:05 -07:00
});
2023-05-19 00:14:41 -07:00
throw new Error(
i18n.t('error.endpointNotImplementedError', {
endpoint,
postProcess: 'sentenceCase',
serverType,
}) as string,
);
2023-07-01 19:10:05 -07:00
}
2022-12-19 15:59:14 -08:00
2023-07-01 19:10:05 -07:00
return endpoints[serverType][endpoint];
2022-12-19 15:59:14 -08:00
};
const authenticate = async (
2023-07-01 19:10:05 -07:00
url: string,
body: { legacy?: boolean; password: string; username: string },
type: ServerType,
) => {
2023-07-01 19:10:05 -07:00
return (apiController('authenticate', type) as ControllerEndpoint['authenticate'])?.(url, body);
};
2022-12-19 15:59:14 -08:00
const getAlbumList = async (args: AlbumListArgs) => {
2023-07-01 19:10: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-07-01 19:10: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-07-01 19:10:05 -07:00
return (
apiController(
'getSongList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getSongList']
)?.(args);
2022-12-19 15:59:14 -08:00
};
2023-05-19 22:20:32 -07:00
const getSongDetail = async (args: SongDetailArgs) => {
2023-07-01 19:10:05 -07:00
return (
apiController(
'getSongDetail',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getSongDetail']
)?.(args);
2023-05-19 22:20:32 -07:00
};
2022-12-20 19:11:33 -08:00
const getMusicFolderList = async (args: MusicFolderListArgs) => {
2023-07-01 19:10: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-07-01 19:10: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-07-01 19:10: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-07-01 19:10: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-07-01 19:10: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-07-01 19:10: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-07-01 19:10:05 -07:00
return (
apiController(
'createPlaylist',
args.apiClientProps.server?.type,
) as ControllerEndpoint['createPlaylist']
)?.(args);
};
const updatePlaylist = async (args: UpdatePlaylistArgs) => {
2023-07-01 19:10: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-07-01 19:10: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-07-01 19:10:05 -07:00
return (
apiController(
'addToPlaylist',
args.apiClientProps.server?.type,
) as ControllerEndpoint['addToPlaylist']
)?.(args);
};
const removeFromPlaylist = async (args: RemoveFromPlaylistArgs) => {
2023-07-01 19:10: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-07-01 19:10: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-07-01 19:10: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-07-01 19:10:05 -07:00
return (
apiController(
'getUserList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getUserList']
)?.(args);
};
const createFavorite = async (args: FavoriteArgs) => {
2023-07-01 19:10:05 -07:00
return (
apiController(
'createFavorite',
args.apiClientProps.server?.type,
) as ControllerEndpoint['createFavorite']
)?.(args);
};
const deleteFavorite = async (args: FavoriteArgs) => {
2023-07-01 19:10: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-07-01 19:10:05 -07:00
return (
apiController(
'setRating',
args.apiClientProps.server?.type,
) as ControllerEndpoint['setRating']
)?.(args);
};
const shareItem = async (args: ShareItemArgs) => {
return (
apiController(
'shareItem',
args.apiClientProps.server?.type,
) as ControllerEndpoint['shareItem']
)?.(args);
};
2023-01-12 18:43:25 -08:00
const getTopSongList = async (args: TopSongListArgs) => {
2023-07-01 19:10: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-07-01 19:10: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) => {
2023-07-01 19:10:05 -07:00
return (
apiController('search', args.apiClientProps.server?.type) as ControllerEndpoint['search']
)?.(args);
2023-05-19 00:14:41 -07:00
};
2023-05-21 07:30:28 -07:00
const getRandomSongList = async (args: RandomSongListArgs) => {
2023-07-01 19:10:05 -07:00
return (
apiController(
'getRandomSongList',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getRandomSongList']
)?.(args);
2023-05-21 07:30:28 -07:00
};
2023-06-02 23:54:34 -07:00
const getLyrics = async (args: LyricsArgs) => {
2023-07-01 19:10:05 -07:00
return (
apiController(
'getLyrics',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getLyrics']
)?.(args);
2023-06-02 23:54:34 -07:00
};
2024-02-01 08:17:31 -08:00
const getServerInfo = async (args: ServerInfoArgs) => {
return (
apiController(
'getServerInfo',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getServerInfo']
)?.(args);
};
2024-02-01 23:53:10 -08:00
const getStructuredLyrics = async (args: StructuredLyricsArgs) => {
return (
apiController(
'getStructuredLyrics',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getStructuredLyrics']
)?.(args);
};
const getSimilarSongs = async (args: SimilarSongsArgs) => {
return (
apiController(
'getSimilarSongs',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getSimilarSongs']
)?.(args);
};
2022-12-19 15:59:14 -08:00
export const controller = {
2023-07-01 19:10:05 -07:00
addToPlaylist,
authenticate,
createFavorite,
createPlaylist,
deleteFavorite,
deletePlaylist,
getAlbumArtistDetail,
getAlbumArtistList,
getAlbumDetail,
getAlbumList,
getArtistList,
getGenreList,
getLyrics,
getMusicFolderList,
getPlaylistDetail,
getPlaylistList,
getPlaylistSongList,
getRandomSongList,
2024-02-01 08:17:31 -08:00
getServerInfo,
getSimilarSongs,
2023-07-01 19:10:05 -07:00
getSongDetail,
getSongList,
2024-02-01 23:53:10 -08:00
getStructuredLyrics,
2023-07-01 19:10:05 -07:00
getTopSongList,
getUserList,
removeFromPlaylist,
scrobble,
search,
shareItem,
2023-07-01 19:10:05 -07:00
updatePlaylist,
updateRating,
2022-12-19 15:59:14 -08:00
};