mirror of
https://github.com/immich-app/immich.git
synced 2025-07-09 03:04:16 -04:00
feat: upload manager (#19565)
This commit is contained in:
parent
6c6a32c63e
commit
30b4f334d8
24
web/src/lib/managers/upload-manager.svelte.ts
Normal file
24
web/src/lib/managers/upload-manager.svelte.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { getSupportedMediaTypes, type ServerMediaTypesResponseDto } from '@immich/sdk';
|
||||||
|
|
||||||
|
class UploadManager {
|
||||||
|
mediaTypes = $state<ServerMediaTypesResponseDto>({ image: [], sidecar: [], video: [] });
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
eventManager.on('app.init', () => void this.#loadExtensions());
|
||||||
|
}
|
||||||
|
|
||||||
|
async #loadExtensions() {
|
||||||
|
try {
|
||||||
|
this.mediaTypes = await getSupportedMediaTypes();
|
||||||
|
} catch {
|
||||||
|
console.error('Failed to load supported media types');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getExtensions() {
|
||||||
|
return [...this.mediaTypes.image, ...this.mediaTypes.video];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const uploadManager = new UploadManager();
|
@ -1,4 +1,5 @@
|
|||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
|
import { uploadManager } from '$lib/managers/upload-manager.svelte';
|
||||||
import { UploadState } from '$lib/models/upload-asset';
|
import { UploadState } from '$lib/models/upload-asset';
|
||||||
import { uploadAssetsStore } from '$lib/stores/upload';
|
import { uploadAssetsStore } from '$lib/stores/upload';
|
||||||
import { uploadRequest } from '$lib/utils';
|
import { uploadRequest } from '$lib/utils';
|
||||||
@ -11,7 +12,6 @@ import {
|
|||||||
checkBulkUpload,
|
checkBulkUpload,
|
||||||
getAssetOriginalPath,
|
getAssetOriginalPath,
|
||||||
getBaseUrl,
|
getBaseUrl,
|
||||||
getSupportedMediaTypes,
|
|
||||||
type AssetMediaResponseDto,
|
type AssetMediaResponseDto,
|
||||||
} from '@immich/sdk';
|
} from '@immich/sdk';
|
||||||
import { tick } from 'svelte';
|
import { tick } from 'svelte';
|
||||||
@ -40,25 +40,15 @@ export const addDummyItems = () => {
|
|||||||
|
|
||||||
// addDummyItems();
|
// addDummyItems();
|
||||||
|
|
||||||
let _extensions: string[];
|
|
||||||
|
|
||||||
export const uploadExecutionQueue = new ExecutorQueue({ concurrency: 2 });
|
export const uploadExecutionQueue = new ExecutorQueue({ concurrency: 2 });
|
||||||
|
|
||||||
const getExtensions = async () => {
|
|
||||||
if (!_extensions) {
|
|
||||||
const { image, video } = await getSupportedMediaTypes();
|
|
||||||
_extensions = [...image, ...video];
|
|
||||||
}
|
|
||||||
return _extensions;
|
|
||||||
};
|
|
||||||
|
|
||||||
type FileUploadParam = { multiple?: boolean } & (
|
type FileUploadParam = { multiple?: boolean } & (
|
||||||
| { albumId?: string; assetId?: never }
|
| { albumId?: string; assetId?: never }
|
||||||
| { albumId?: never; assetId?: string }
|
| { albumId?: never; assetId?: string }
|
||||||
);
|
);
|
||||||
export const openFileUploadDialog = async (options: FileUploadParam = {}) => {
|
export const openFileUploadDialog = async (options: FileUploadParam = {}) => {
|
||||||
const { albumId, multiple = true, assetId } = options;
|
const { albumId, multiple = true, assetId } = options;
|
||||||
const extensions = await getExtensions();
|
const extensions = uploadManager.getExtensions();
|
||||||
|
|
||||||
return new Promise<(string | undefined)[]>((resolve, reject) => {
|
return new Promise<(string | undefined)[]>((resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
@ -99,7 +89,7 @@ export const fileUploadHandler = async ({
|
|||||||
replaceAssetId,
|
replaceAssetId,
|
||||||
isLockedAssets = false,
|
isLockedAssets = false,
|
||||||
}: FileUploadHandlerParams): Promise<string[]> => {
|
}: FileUploadHandlerParams): Promise<string[]> => {
|
||||||
const extensions = await getExtensions();
|
const extensions = uploadManager.getExtensions();
|
||||||
const promises = [];
|
const promises = [];
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
const name = file.name.toLowerCase();
|
const name = file.name.toLowerCase();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user