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 { uploadManager } from '$lib/managers/upload-manager.svelte';
|
||||
import { UploadState } from '$lib/models/upload-asset';
|
||||
import { uploadAssetsStore } from '$lib/stores/upload';
|
||||
import { uploadRequest } from '$lib/utils';
|
||||
@ -11,7 +12,6 @@ import {
|
||||
checkBulkUpload,
|
||||
getAssetOriginalPath,
|
||||
getBaseUrl,
|
||||
getSupportedMediaTypes,
|
||||
type AssetMediaResponseDto,
|
||||
} from '@immich/sdk';
|
||||
import { tick } from 'svelte';
|
||||
@ -40,25 +40,15 @@ export const addDummyItems = () => {
|
||||
|
||||
// addDummyItems();
|
||||
|
||||
let _extensions: string[];
|
||||
|
||||
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 } & (
|
||||
| { albumId?: string; assetId?: never }
|
||||
| { albumId?: never; assetId?: string }
|
||||
);
|
||||
export const openFileUploadDialog = async (options: FileUploadParam = {}) => {
|
||||
const { albumId, multiple = true, assetId } = options;
|
||||
const extensions = await getExtensions();
|
||||
const extensions = uploadManager.getExtensions();
|
||||
|
||||
return new Promise<(string | undefined)[]>((resolve, reject) => {
|
||||
try {
|
||||
@ -99,7 +89,7 @@ export const fileUploadHandler = async ({
|
||||
replaceAssetId,
|
||||
isLockedAssets = false,
|
||||
}: FileUploadHandlerParams): Promise<string[]> => {
|
||||
const extensions = await getExtensions();
|
||||
const extensions = uploadManager.getExtensions();
|
||||
const promises = [];
|
||||
for (const file of files) {
|
||||
const name = file.name.toLowerCase();
|
||||
|
Loading…
x
Reference in New Issue
Block a user