[enhancement]: allow downloading individual tracks for external use

This commit is contained in:
Kendall Garner 2024-08-25 17:08:38 -07:00
parent 10fca2dc12
commit c4677a63f6
No known key found for this signature in database
GPG key ID: 18D2767419676C87
10 changed files with 91 additions and 6 deletions

View file

@ -58,6 +58,7 @@ import type {
ServerType,
ShareItemResponse,
MoveItemArgs,
DownloadArgs,
} from '/@/renderer/api/types';
import { DeletePlaylistResponse, RandomSongListArgs } from './types';
import { ndController } from '/@/renderer/api/navidrome/navidrome-controller';
@ -83,6 +84,7 @@ export type ControllerEndpoint = Partial<{
getArtistDetail: () => void;
getArtistInfo: (args: any) => void;
getArtistList: (args: ArtistListArgs) => Promise<ArtistListResponse>;
getDownloadUrl: (args: DownloadArgs) => string;
getFavoritesList: () => void;
getFolderItemList: () => void;
getFolderList: () => void;
@ -132,6 +134,7 @@ const endpoints: ApiController = {
getArtistDetail: undefined,
getArtistInfo: undefined,
getArtistList: undefined,
getDownloadUrl: jfController.getDownloadUrl,
getFavoritesList: undefined,
getFolderItemList: undefined,
getFolderList: undefined,
@ -173,6 +176,7 @@ const endpoints: ApiController = {
getArtistDetail: undefined,
getArtistInfo: undefined,
getArtistList: undefined,
getDownloadUrl: ssController.getDownloadUrl,
getFavoritesList: undefined,
getFolderItemList: undefined,
getFolderList: undefined,
@ -213,6 +217,7 @@ const endpoints: ApiController = {
getArtistDetail: undefined,
getArtistInfo: undefined,
getArtistList: undefined,
getDownloadUrl: ssController.getDownloadUrl,
getFavoritesList: undefined,
getFolderItemList: undefined,
getFolderList: undefined,
@ -554,6 +559,15 @@ const movePlaylistItem = async (args: MoveItemArgs) => {
)?.(args);
};
const getDownloadUrl = (args: DownloadArgs) => {
return (
apiController(
'getDownloadUrl',
args.apiClientProps.server?.type,
) as ControllerEndpoint['getDownloadUrl']
)?.(args);
};
export const controller = {
addToPlaylist,
authenticate,
@ -566,6 +580,7 @@ export const controller = {
getAlbumDetail,
getAlbumList,
getArtistList,
getDownloadUrl,
getGenreList,
getLyrics,
getMusicFolderList,

View file

@ -54,6 +54,7 @@ import {
SimilarSongsArgs,
Song,
MoveItemArgs,
DownloadArgs,
} from '/@/renderer/api/types';
import { jfApiClient } from '/@/renderer/api/jellyfin/jellyfin-api';
import { jfNormalize } from './jellyfin-normalize';
@ -1043,6 +1044,12 @@ const movePlaylistItem = async (args: MoveItemArgs): Promise<void> => {
}
};
const getDownloadUrl = (args: DownloadArgs) => {
const { apiClientProps, query } = args;
return `${apiClientProps.server?.url}/items/${query.id}/download?api_key=${apiClientProps.server?.credential}`;
};
export const jfController = {
addToPlaylist,
authenticate,
@ -1055,6 +1062,7 @@ export const jfController = {
getAlbumDetail,
getAlbumList,
getArtistList,
getDownloadUrl,
getGenreList,
getLyrics,
getMusicFolderList,

View file

@ -27,6 +27,7 @@ import {
StructuredLyric,
SimilarSongsArgs,
Song,
DownloadArgs,
} from '/@/renderer/api/types';
import { randomString } from '/@/renderer/utils';
import { ServerFeatures } from '/@/renderer/api/features-types';
@ -482,10 +483,23 @@ const getSimilarSongs = async (args: SimilarSongsArgs): Promise<Song[]> => {
}, []);
};
const getDownloadUrl = (args: DownloadArgs) => {
const { apiClientProps, query } = args;
return (
`${apiClientProps.server?.url}/rest/download.view` +
`?id=${query.id}` +
`&${apiClientProps.server?.credential}` +
'&v=1.13.0' +
'&c=feishin'
);
};
export const ssController = {
authenticate,
createFavorite,
getArtistInfo,
getDownloadUrl,
getMusicFolderList,
getRandomSongList,
getServerInfo,

View file

@ -1202,3 +1202,11 @@ export type MoveItemQuery = {
export type MoveItemArgs = {
query: MoveItemQuery;
} & BaseEndpointArgs;
export type DownloadQuery = {
id: string;
};
export type DownloadArgs = {
query: DownloadQuery;
} & BaseEndpointArgs;