2022-10-06 11:25:54 -05:00
|
|
|
<script lang="ts">
|
2023-04-01 22:46:07 +02:00
|
|
|
import {
|
|
|
|
|
notificationController,
|
|
|
|
|
NotificationType
|
|
|
|
|
} from '$lib/components/shared-components/notification/notification';
|
2023-06-02 15:55:08 +02:00
|
|
|
import { AppRoute } from '$lib/constants';
|
2023-01-20 11:35:55 -05:00
|
|
|
import { handleError } from '$lib/utils/handle-error';
|
2023-04-01 06:53:20 +02:00
|
|
|
import { AllJobStatusResponseDto, api, JobCommand, JobCommandDto, JobName } from '@api';
|
|
|
|
|
import type { ComponentType } from 'svelte';
|
2023-06-02 15:55:08 +02:00
|
|
|
import type Icon from 'svelte-material-icons/DotsVertical.svelte';
|
2023-05-23 16:04:24 -04:00
|
|
|
import FaceRecognition from 'svelte-material-icons/FaceRecognition.svelte';
|
|
|
|
|
import FileJpgBox from 'svelte-material-icons/FileJpgBox.svelte';
|
2023-06-01 06:32:51 -04:00
|
|
|
import FileXmlBox from 'svelte-material-icons/FileXmlBox.svelte';
|
2023-05-23 16:04:24 -04:00
|
|
|
import FolderMove from 'svelte-material-icons/FolderMove.svelte';
|
2023-06-07 12:10:31 -04:00
|
|
|
import CogIcon from 'svelte-material-icons/Cog.svelte';
|
2023-05-23 16:04:24 -04:00
|
|
|
import Table from 'svelte-material-icons/Table.svelte';
|
|
|
|
|
import TagMultiple from 'svelte-material-icons/TagMultiple.svelte';
|
|
|
|
|
import VectorCircle from 'svelte-material-icons/VectorCircle.svelte';
|
|
|
|
|
import Video from 'svelte-material-icons/Video.svelte';
|
|
|
|
|
import ConfirmDialogue from '../../shared-components/confirm-dialogue.svelte';
|
2022-10-06 11:25:54 -05:00
|
|
|
import JobTile from './job-tile.svelte';
|
2023-04-01 06:53:20 +02:00
|
|
|
import StorageMigrationDescription from './storage-migration-description.svelte';
|
2023-06-07 12:10:31 -04:00
|
|
|
import Button from '../../elements/buttons/button.svelte';
|
2022-10-06 11:25:54 -05:00
|
|
|
|
2023-04-01 06:53:20 +02:00
|
|
|
export let jobs: AllJobStatusResponseDto;
|
2022-12-19 12:13:10 -06:00
|
|
|
|
2023-05-20 21:40:53 -04:00
|
|
|
interface JobDetails {
|
2023-04-01 06:53:20 +02:00
|
|
|
title: string;
|
|
|
|
|
subtitle?: string;
|
feat(server): xmp sidecar metadata (#2466)
* initial commit for XMP sidecar support
* Added support for 'missing' metadata files to include those without sidecar files, now detects sidecar files in the filesystem for media already ingested but the sidecar was created afterwards
* didn't mean to commit default log level during testing
* new sidecar logic for video metadata as well
* Added xml mimetype for sidecars only
* don't need capture group for this regex
* wrong default value reverted
* simplified the move here - keep it in the same try catch since the outcome is to move the media back anyway
* simplified setter logic
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* simplified logic per suggestions
* sidecar is now its own queue with a discover and sync, updated UI for the new job queueing
* queue a sidecar job for every asset based on discovery or sync, though the logic is almost identical aside from linking the sidecar
* now queue sidecar jobs for each assset, though logic is mostly the same between discovery and sync
* simplified logic of filename extraction and asset instantiation
* not sure how that got deleted..
* updated code per suggestions and comments in the PR
* stat was not being used, removed the variable set
* better type checking, using in-scope variables for exif getter instead of passing in every time
* removed commented out test
* ran and resolved all lints, formats, checks, and tests
* resolved suggested change in PR
* made getExifProperty more dynamic with multiple possible args for fallbacks, fixed typo, used generic in function for better type checking
* better error handling and moving files back to positions on move or save failure
* regenerated api
* format fixes
* Added XMP documentation
* documentation typo
* Merged in main
* missed merge conflict
* more changes due to a merge
* Resolving conflicts
* added icon for sidecar jobs
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2023-05-24 21:59:30 -04:00
|
|
|
allText?: string;
|
|
|
|
|
missingText?: string;
|
2023-05-23 16:04:24 -04:00
|
|
|
icon: typeof Icon;
|
2023-04-01 06:53:20 +02:00
|
|
|
allowForceCommand?: boolean;
|
|
|
|
|
component?: ComponentType;
|
2023-05-20 21:40:53 -04:00
|
|
|
handleCommand?: (jobId: JobName, jobCommand: JobCommandDto) => Promise<void>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let faceConfirm = false;
|
|
|
|
|
|
|
|
|
|
const handleFaceCommand = async (jobId: JobName, dto: JobCommandDto) => {
|
|
|
|
|
if (dto.force) {
|
|
|
|
|
faceConfirm = true;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await handleCommand(jobId, dto);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const onFaceConfirm = () => {
|
|
|
|
|
faceConfirm = false;
|
2023-06-01 06:32:51 -04:00
|
|
|
handleCommand(JobName.RecognizeFaces, { command: JobCommand.Start, force: true });
|
2023-01-21 23:13:36 -05:00
|
|
|
};
|
2022-10-06 11:25:54 -05:00
|
|
|
|
2023-05-20 21:40:53 -04:00
|
|
|
const jobDetails: Partial<Record<JobName, JobDetails>> = {
|
2023-06-01 06:32:51 -04:00
|
|
|
[JobName.ThumbnailGeneration]: {
|
2023-05-23 16:04:24 -04:00
|
|
|
icon: FileJpgBox,
|
2023-06-01 06:32:51 -04:00
|
|
|
title: api.getJobName(JobName.ThumbnailGeneration),
|
2023-04-01 06:53:20 +02:00
|
|
|
subtitle: 'Regenerate JPEG and WebP thumbnails'
|
|
|
|
|
},
|
2023-06-01 06:32:51 -04:00
|
|
|
[JobName.MetadataExtraction]: {
|
2023-05-23 16:04:24 -04:00
|
|
|
icon: Table,
|
2023-06-01 06:32:51 -04:00
|
|
|
title: api.getJobName(JobName.MetadataExtraction),
|
2023-04-01 06:53:20 +02:00
|
|
|
subtitle: 'Extract metadata information i.e. GPS, resolution...etc'
|
|
|
|
|
},
|
2023-06-01 06:32:51 -04:00
|
|
|
[JobName.Sidecar]: {
|
|
|
|
|
title: api.getJobName(JobName.Sidecar),
|
feat(server): xmp sidecar metadata (#2466)
* initial commit for XMP sidecar support
* Added support for 'missing' metadata files to include those without sidecar files, now detects sidecar files in the filesystem for media already ingested but the sidecar was created afterwards
* didn't mean to commit default log level during testing
* new sidecar logic for video metadata as well
* Added xml mimetype for sidecars only
* don't need capture group for this regex
* wrong default value reverted
* simplified the move here - keep it in the same try catch since the outcome is to move the media back anyway
* simplified setter logic
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* simplified logic per suggestions
* sidecar is now its own queue with a discover and sync, updated UI for the new job queueing
* queue a sidecar job for every asset based on discovery or sync, though the logic is almost identical aside from linking the sidecar
* now queue sidecar jobs for each assset, though logic is mostly the same between discovery and sync
* simplified logic of filename extraction and asset instantiation
* not sure how that got deleted..
* updated code per suggestions and comments in the PR
* stat was not being used, removed the variable set
* better type checking, using in-scope variables for exif getter instead of passing in every time
* removed commented out test
* ran and resolved all lints, formats, checks, and tests
* resolved suggested change in PR
* made getExifProperty more dynamic with multiple possible args for fallbacks, fixed typo, used generic in function for better type checking
* better error handling and moving files back to positions on move or save failure
* regenerated api
* format fixes
* Added XMP documentation
* documentation typo
* Merged in main
* missed merge conflict
* more changes due to a merge
* Resolving conflicts
* added icon for sidecar jobs
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2023-05-24 21:59:30 -04:00
|
|
|
icon: FileXmlBox,
|
|
|
|
|
subtitle: 'Discover or synchronize sidecar metadata from the filesystem',
|
|
|
|
|
allText: 'SYNC',
|
|
|
|
|
missingText: 'DISCOVER'
|
|
|
|
|
},
|
2023-06-01 06:32:51 -04:00
|
|
|
[JobName.ObjectTagging]: {
|
2023-05-23 16:04:24 -04:00
|
|
|
icon: TagMultiple,
|
2023-06-01 06:32:51 -04:00
|
|
|
title: api.getJobName(JobName.ObjectTagging),
|
2023-04-01 06:53:20 +02:00
|
|
|
subtitle:
|
|
|
|
|
'Run machine learning to tag objects\nNote that some assets may not have any objects detected'
|
|
|
|
|
},
|
2023-06-01 06:32:51 -04:00
|
|
|
[JobName.ClipEncoding]: {
|
2023-05-23 16:04:24 -04:00
|
|
|
icon: VectorCircle,
|
2023-06-01 06:32:51 -04:00
|
|
|
title: api.getJobName(JobName.ClipEncoding),
|
2023-04-01 06:53:20 +02:00
|
|
|
subtitle: 'Run machine learning to generate clip embeddings'
|
|
|
|
|
},
|
2023-06-01 06:32:51 -04:00
|
|
|
[JobName.RecognizeFaces]: {
|
2023-05-23 16:04:24 -04:00
|
|
|
icon: FaceRecognition,
|
2023-06-01 06:32:51 -04:00
|
|
|
title: api.getJobName(JobName.RecognizeFaces),
|
2023-05-20 21:40:53 -04:00
|
|
|
subtitle: 'Run machine learning to recognize faces',
|
|
|
|
|
handleCommand: handleFaceCommand
|
2023-05-17 13:07:17 -04:00
|
|
|
},
|
2023-06-01 06:32:51 -04:00
|
|
|
[JobName.VideoConversion]: {
|
2023-05-23 16:04:24 -04:00
|
|
|
icon: Video,
|
2023-06-01 06:32:51 -04:00
|
|
|
title: api.getJobName(JobName.VideoConversion),
|
2023-04-01 06:53:20 +02:00
|
|
|
subtitle: 'Transcode videos not in the desired format'
|
|
|
|
|
},
|
2023-06-01 06:32:51 -04:00
|
|
|
[JobName.StorageTemplateMigration]: {
|
2023-05-23 16:04:24 -04:00
|
|
|
icon: FolderMove,
|
2023-06-01 06:32:51 -04:00
|
|
|
title: api.getJobName(JobName.StorageTemplateMigration),
|
2023-04-01 06:53:20 +02:00
|
|
|
allowForceCommand: false,
|
|
|
|
|
component: StorageMigrationDescription
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-03-20 11:55:28 -04:00
|
|
|
|
2023-04-01 06:53:20 +02:00
|
|
|
const jobDetailsArray = Object.entries(jobDetails) as [JobName, JobDetails][];
|
2023-03-20 11:55:28 -04:00
|
|
|
|
2023-05-20 21:40:53 -04:00
|
|
|
async function handleCommand(jobId: JobName, jobCommand: JobCommandDto) {
|
2023-04-01 06:53:20 +02:00
|
|
|
const title = jobDetails[jobId]?.title;
|
2023-03-20 11:55:28 -04:00
|
|
|
|
2022-10-06 11:25:54 -05:00
|
|
|
try {
|
2023-06-16 15:36:07 -04:00
|
|
|
const { data } = await api.jobApi.sendJobCommand({ id: jobId, jobCommandDto: jobCommand });
|
2023-04-01 22:46:07 +02:00
|
|
|
jobs[jobId] = data;
|
2023-04-01 06:53:20 +02:00
|
|
|
|
|
|
|
|
switch (jobCommand.command) {
|
2023-04-01 22:46:07 +02:00
|
|
|
case JobCommand.Empty:
|
|
|
|
|
notificationController.show({
|
|
|
|
|
message: `Cleared jobs for: ${title}`,
|
|
|
|
|
type: NotificationType.Info
|
|
|
|
|
});
|
2023-04-01 06:53:20 +02:00
|
|
|
break;
|
|
|
|
|
}
|
2023-01-20 11:35:55 -05:00
|
|
|
} catch (error) {
|
2023-04-01 06:53:20 +02:00
|
|
|
handleError(error, `Command '${jobCommand.command}' failed for job: ${title}`);
|
2022-12-19 12:13:10 -06:00
|
|
|
}
|
2023-04-01 06:53:20 +02:00
|
|
|
}
|
2022-10-06 11:25:54 -05:00
|
|
|
</script>
|
|
|
|
|
|
2023-05-20 21:40:53 -04:00
|
|
|
{#if faceConfirm}
|
|
|
|
|
<ConfirmDialogue
|
|
|
|
|
prompt="Are you sure you want to reprocess all faces? This will also clear named people."
|
|
|
|
|
on:confirm={onFaceConfirm}
|
|
|
|
|
on:cancel={() => (faceConfirm = false)}
|
|
|
|
|
/>
|
|
|
|
|
{/if}
|
|
|
|
|
|
2023-01-26 22:50:22 -06:00
|
|
|
<div class="flex flex-col gap-7">
|
2023-06-07 12:10:31 -04:00
|
|
|
<div class="flex justify-end">
|
|
|
|
|
<a href="{AppRoute.ADMIN_SETTINGS}?open=job-settings">
|
|
|
|
|
<Button size="sm">
|
|
|
|
|
<CogIcon size="18" />
|
|
|
|
|
<span class="pl-2">Manage Concurrency</span>
|
|
|
|
|
</Button>
|
|
|
|
|
</a>
|
2023-06-01 06:32:51 -04:00
|
|
|
</div>
|
feat(server): xmp sidecar metadata (#2466)
* initial commit for XMP sidecar support
* Added support for 'missing' metadata files to include those without sidecar files, now detects sidecar files in the filesystem for media already ingested but the sidecar was created afterwards
* didn't mean to commit default log level during testing
* new sidecar logic for video metadata as well
* Added xml mimetype for sidecars only
* don't need capture group for this regex
* wrong default value reverted
* simplified the move here - keep it in the same try catch since the outcome is to move the media back anyway
* simplified setter logic
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* simplified logic per suggestions
* sidecar is now its own queue with a discover and sync, updated UI for the new job queueing
* queue a sidecar job for every asset based on discovery or sync, though the logic is almost identical aside from linking the sidecar
* now queue sidecar jobs for each assset, though logic is mostly the same between discovery and sync
* simplified logic of filename extraction and asset instantiation
* not sure how that got deleted..
* updated code per suggestions and comments in the PR
* stat was not being used, removed the variable set
* better type checking, using in-scope variables for exif getter instead of passing in every time
* removed commented out test
* ran and resolved all lints, formats, checks, and tests
* resolved suggested change in PR
* made getExifProperty more dynamic with multiple possible args for fallbacks, fixed typo, used generic in function for better type checking
* better error handling and moving files back to positions on move or save failure
* regenerated api
* format fixes
* Added XMP documentation
* documentation typo
* Merged in main
* missed merge conflict
* more changes due to a merge
* Resolving conflicts
* added icon for sidecar jobs
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2023-05-24 21:59:30 -04:00
|
|
|
{#each jobDetailsArray as [jobName, { title, subtitle, allText, missingText, allowForceCommand, icon, component, handleCommand: handleCommandOverride }]}
|
2023-04-01 22:46:07 +02:00
|
|
|
{@const { jobCounts, queueStatus } = jobs[jobName]}
|
2023-01-21 23:13:36 -05:00
|
|
|
<JobTile
|
2023-05-23 16:04:24 -04:00
|
|
|
{icon}
|
2023-04-01 06:53:20 +02:00
|
|
|
{title}
|
|
|
|
|
{subtitle}
|
feat(server): xmp sidecar metadata (#2466)
* initial commit for XMP sidecar support
* Added support for 'missing' metadata files to include those without sidecar files, now detects sidecar files in the filesystem for media already ingested but the sidecar was created afterwards
* didn't mean to commit default log level during testing
* new sidecar logic for video metadata as well
* Added xml mimetype for sidecars only
* don't need capture group for this regex
* wrong default value reverted
* simplified the move here - keep it in the same try catch since the outcome is to move the media back anyway
* simplified setter logic
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* simplified logic per suggestions
* sidecar is now its own queue with a discover and sync, updated UI for the new job queueing
* queue a sidecar job for every asset based on discovery or sync, though the logic is almost identical aside from linking the sidecar
* now queue sidecar jobs for each assset, though logic is mostly the same between discovery and sync
* simplified logic of filename extraction and asset instantiation
* not sure how that got deleted..
* updated code per suggestions and comments in the PR
* stat was not being used, removed the variable set
* better type checking, using in-scope variables for exif getter instead of passing in every time
* removed commented out test
* ran and resolved all lints, formats, checks, and tests
* resolved suggested change in PR
* made getExifProperty more dynamic with multiple possible args for fallbacks, fixed typo, used generic in function for better type checking
* better error handling and moving files back to positions on move or save failure
* regenerated api
* format fixes
* Added XMP documentation
* documentation typo
* Merged in main
* missed merge conflict
* more changes due to a merge
* Resolving conflicts
* added icon for sidecar jobs
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2023-05-24 21:59:30 -04:00
|
|
|
allText={allText || 'ALL'}
|
|
|
|
|
missingText={missingText || 'MISSING'}
|
2023-04-01 06:53:20 +02:00
|
|
|
{allowForceCommand}
|
2023-04-01 22:46:07 +02:00
|
|
|
{jobCounts}
|
|
|
|
|
{queueStatus}
|
2023-05-20 21:40:53 -04:00
|
|
|
on:command={({ detail }) => (handleCommandOverride || handleCommand)(jobName, detail)}
|
2022-12-19 12:13:10 -06:00
|
|
|
>
|
2023-06-07 12:10:31 -04:00
|
|
|
{#if component}
|
|
|
|
|
<svelte:component this={component} slot="description" />
|
|
|
|
|
{/if}
|
2023-01-21 23:13:36 -05:00
|
|
|
</JobTile>
|
2023-04-01 06:53:20 +02:00
|
|
|
{/each}
|
2022-10-06 11:25:54 -05:00
|
|
|
</div>
|