add library rescan to server selector menu

This commit is contained in:
jeffvli
2026-07-29 22:55:52 -07:00
parent 81f7b42409
commit 13528eff09
10 changed files with 114 additions and 26 deletions
+12
View File
@@ -1046,6 +1046,18 @@ export const controller: GeneralController = {
server.type,
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
},
startLibraryScan(args) {
const server = getServerById(args.apiClientProps.serverId);
if (!server) {
throw new Error(`${i18n.t('error.apiRouteError')}: startLibraryScan`);
}
return apiController(
'startLibraryScan',
server.type,
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
},
updateInternetRadioStation(args) {
const server = getServerById(args.apiClientProps.serverId);
@@ -314,7 +314,12 @@ export const contract = c.router({
method: 'POST',
path: 'Items/:id/Refresh',
query: z.object({
ImageRefreshMode: z.string().optional(),
MetadataRefreshMode: z.string().optional(),
Recursive: z.boolean().optional(),
RegenerateTrickplay: z.boolean().optional(),
ReplaceAllImages: z.boolean().optional(),
ReplaceAllMetadata: z.boolean().optional(),
}),
responses: {
204: z.null(),
@@ -1917,6 +1917,54 @@ export const JellyfinController: InternalControllerEndpoint = {
return null;
},
startLibraryScan: async (args) => {
const { apiClientProps } = args;
const server = apiClientProps.server;
const userId = server?.userId;
if (!userId) {
throw new Error('No userId found');
}
let musicFolderIds = server.musicFolderId?.filter(Boolean) ?? [];
if (musicFolderIds.length === 0) {
const res = await jfApiClient(apiClientProps).getMusicFolderList({
params: { userId },
});
if (res.status !== 200) {
throw new Error('Failed to get music folders');
}
musicFolderIds = res.body.Items.filter(
(folder) => folder.CollectionType === jfType._enum.collection.MUSIC,
).map((folder) => folder.Id);
}
if (musicFolderIds.length === 0) {
throw new Error('No music folders found');
}
await Promise.all(
musicFolderIds.map((id) =>
jfApiClient(apiClientProps).refreshItem({
body: null,
params: { id },
query: {
ImageRefreshMode: 'Default',
MetadataRefreshMode: 'Default',
Recursive: true,
RegenerateTrickplay: false,
ReplaceAllImages: false,
ReplaceAllMetadata: false,
},
}),
),
);
return null;
},
updateInternetRadioStation: async (args) => {
const { apiClientProps, body, query } = args;
@@ -1187,6 +1187,7 @@ export const NavidromeController: InternalControllerEndpoint = {
id: res.body.data.id,
};
},
startLibraryScan: SubsonicController.startLibraryScan,
updateInternetRadioStation: async (args) => {
const { apiClientProps, body, query } = args;
@@ -2366,6 +2366,17 @@ export const SubsonicController: InternalControllerEndpoint = {
return null;
},
startLibraryScan: async (args) => {
const { apiClientProps } = args;
const res = await ssApiClient(apiClientProps).startScan({ query: {} });
if (res.status !== 200) {
throw new Error('Failed to start library scan');
}
return null;
},
updateInternetRadioStation: async (args) => {
const { apiClientProps, body, query } = args;