refactor: image info filling

Signed-off-by: Varun Patil <radialapps@gmail.com>
pulsejet/aio-hw-docs
Varun Patil 2023-11-13 23:14:52 -08:00
parent e396359011
commit f0e1b00096
2 changed files with 35 additions and 19 deletions

View File

@ -128,8 +128,6 @@ export default defineComponent({
this.show = true;
this.processing = true;
this.sections = sections;
let done = 0;
this.progress = 0;
// Filter out forbidden MIME types
@ -159,24 +157,10 @@ export default defineComponent({
});
// Load metadata for all photos
const calls = photos.map((p) => async () => {
try {
const url = API.Q(API.IMAGE_INFO(p.fileid), { tags: 1 });
const res = await axios.get<IImageInfo>(url);
p.datetaken = res.data.datetaken;
p.imageInfo = res.data;
} catch (error) {
console.error('Failed to get date info for', p.fileid, error);
} finally {
done++;
this.progress = Math.round((done * 100) / photos.length);
}
await dav.fillImageInfo(photos, { tags: 1 }, (count) => {
this.progress = Math.round((count * 100) / photos.length);
});
for await (const _ of dav.runInParallel(calls, 8)) {
// nothing to do
}
// Check if already quit
if (!this.show || this.state !== state) return;

View File

@ -9,7 +9,7 @@ import { translate as t } from '@services/l10n';
import * as utils from '@services/utils';
import * as nativex from '@native';
import type { IFileInfo, IPhoto } from '@typings';
import type { IFileInfo, IImageInfo, IPhoto } from '@typings';
import type { ResponseDataDetailed, SearchResult } from 'webdav';
const GET_FILE_CHUNK_SIZE = 50;
@ -344,3 +344,35 @@ export async function* movePhotos(photos: IPhoto[], destination: string, overwri
yield* runInParallel(calls, 10);
}
/**
* Fill the imageInfo attributes of the given photos
*
* @param photos list of photos to fill
* @param query options
* @param query.tags whether to include tags in the response
* @param progress callback to report progress
*/
export async function fillImageInfo(photos: IPhoto[], query?: { tags?: number }, progress?: (count: number) => void) {
// Number of photos done
let done = 0;
// Load metadata for all photos
const calls = photos.map((p) => async () => {
try {
const url = API.Q(API.IMAGE_INFO(p.fileid), query ?? {});
const res = await axios.get<IImageInfo>(url);
p.datetaken = res.data.datetaken;
p.imageInfo = res.data;
} catch (error) {
console.error('Failed to get image info for', p.fileid, error);
} finally {
done++;
progress?.(done);
}
});
for await (const _ of runInParallel(calls, 8)) {
// nothing to do
}
}