mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 12:30:12 +02:00
[enhancement]: allow downloading individual tracks for external use
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -1202,3 +1202,11 @@ export type MoveItemQuery = {
|
||||
export type MoveItemArgs = {
|
||||
query: MoveItemQuery;
|
||||
} & BaseEndpointArgs;
|
||||
|
||||
export type DownloadQuery = {
|
||||
id: string;
|
||||
};
|
||||
|
||||
export type DownloadArgs = {
|
||||
query: DownloadQuery;
|
||||
} & BaseEndpointArgs;
|
||||
|
||||
Reference in New Issue
Block a user