diff --git a/server/src/database.ts b/server/src/database.ts index eb558c6d28..709dd8f2ba 100644 --- a/server/src/database.ts +++ b/server/src/database.ts @@ -346,8 +346,7 @@ export const columns = { 'asset.width', 'asset.height', ], - assetFiles: ['asset_file.id', 'asset_file.path', 'asset_file.type', 'asset_file.isEdited'], - assetFilesForThumbnail: [ + assetFiles: [ 'asset_file.id', 'asset_file.path', 'asset_file.type', diff --git a/server/src/queries/asset.job.repository.sql b/server/src/queries/asset.job.repository.sql index cebb9fe95e..416eef475d 100644 --- a/server/src/queries/asset.job.repository.sql +++ b/server/src/queries/asset.job.repository.sql @@ -30,7 +30,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -60,7 +62,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -184,7 +188,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -245,6 +251,55 @@ from where "asset"."id" = $4 +-- AssetJobRepository.getForAssetEditProcessing +select + "asset"."id", + "asset"."visibility", + "asset"."originalFileName", + "asset"."originalPath", + "asset"."ownerId", + "asset"."thumbhash", + "asset"."type", + ( + select + coalesce(json_agg(agg), '[]') + from + ( + select + "asset_file"."id", + "asset_file"."path", + "asset_file"."type", + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" + from + "asset_file" + where + "asset_file"."assetId" = "asset"."id" + and "asset_file"."type" in ($1, $2, $3, $4) + ) as agg + ) as "files", + ( + select + coalesce(json_agg(agg), '[]') + from + ( + select + "asset_edit"."action", + "asset_edit"."parameters" + from + "asset_edit" + where + "asset_edit"."assetId" = "asset"."id" + ) as agg + ) as "edits", + to_json("asset_exif") as "exifInfo" +from + "asset" + inner join "asset_exif" on "asset"."id" = "asset_exif"."assetId" +where + "asset"."id" = $5 + -- AssetJobRepository.getForMetadataExtraction select "asset"."id", @@ -288,7 +343,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -314,7 +371,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -371,7 +430,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -411,7 +472,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -436,11 +499,12 @@ select where "asset_file"."assetId" = "asset"."id" and "asset_file"."type" = $1 + and "asset_file"."isEdited" = $2 ) as "previewFile" from "asset" where - "asset"."id" = $2 + "asset"."id" = $3 -- AssetJobRepository.getForSyncAssets select @@ -474,7 +538,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -515,7 +581,8 @@ where -- AssetJobRepository.streamForVideoConversion select - "asset"."id" + "asset"."id", + "asset"."isEdited" from "asset" where @@ -546,17 +613,34 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where "asset_file"."assetId" = "asset"."id" + and "asset_file"."type" = $1 ) as agg - ) as "files" + ) as "files", + ( + select + coalesce(json_agg(agg), '[]') + from + ( + select + "asset_edit"."action", + "asset_edit"."parameters" + from + "asset_edit" + where + "asset_edit"."assetId" = "asset"."id" + ) as agg + ) as "edits" from "asset" where - "asset"."id" = $1 + "asset"."id" = $2 and "asset"."type" = 'VIDEO' -- AssetJobRepository.streamForMetadataExtraction @@ -598,7 +682,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -640,7 +726,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where diff --git a/server/src/queries/asset.repository.sql b/server/src/queries/asset.repository.sql index a2525c3b17..739ea8f7f9 100644 --- a/server/src/queries/asset.repository.sql +++ b/server/src/queries/asset.repository.sql @@ -285,7 +285,9 @@ select "asset_file"."id", "asset_file"."path", "asset_file"."type", - "asset_file"."isEdited" + "asset_file"."isEdited", + "asset_file"."isProgressive", + "asset_file"."isTransparent" from "asset_file" where @@ -638,12 +640,13 @@ select where "asset_file"."assetId" = "asset"."id" and "asset_file"."type" = $1 + and "asset_file"."isEdited" = $2 ) as "encodedVideoPath" from "asset" where - "asset"."id" = $2 - and "asset"."type" = $3 + "asset"."id" = $3 + and "asset"."type" = $4 -- AssetRepository.getForOcr select diff --git a/server/src/repositories/asset-job.repository.ts b/server/src/repositories/asset-job.repository.ts index 58bef905dc..5a1f19e86d 100644 --- a/server/src/repositories/asset-job.repository.ts +++ b/server/src/repositories/asset-job.repository.ts @@ -123,15 +123,7 @@ export class AssetJobRepository { 'asset.thumbhash', 'asset.type', ]) - .select((eb) => - jsonArrayFrom( - eb - .selectFrom('asset_file') - .select(columns.assetFilesForThumbnail) - .whereRef('asset_file.assetId', '=', 'asset.id') - .where('asset_file.type', 'in', [AssetFileType.Thumbnail, AssetFileType.Preview, AssetFileType.FullSize]), - ).as('files'), - ) + .select((eb) => withFiles(eb, [AssetFileType.Thumbnail, AssetFileType.Preview, AssetFileType.FullSize])) .select(withEdits) .$call(withExifInner) .where('asset.id', '=', id) @@ -152,19 +144,14 @@ export class AssetJobRepository { 'asset.type', ]) .select((eb) => - jsonArrayFrom( - eb - .selectFrom('asset_file') - .select(columns.assetFilesForThumbnail) - .whereRef('asset_file.assetId', '=', 'asset.id') - .where('asset_file.type', 'in', [ - AssetFileType.Thumbnail, - AssetFileType.Preview, - AssetFileType.FullSize, - AssetFileType.EncodedVideo, - ]), - ).as('files'), + withFiles(eb, [ + AssetFileType.Thumbnail, + AssetFileType.Preview, + AssetFileType.FullSize, + AssetFileType.EncodedVideo, + ]), ) + .select(withEdits) .$call(withExifInner) .where('asset.id', '=', id) @@ -367,15 +354,7 @@ export class AssetJobRepository { return this.db .selectFrom('asset') .select(['asset.id', 'asset.ownerId', 'asset.originalPath']) - .select((eb) => - jsonArrayFrom( - eb - .selectFrom('asset_file') - .select(columns.assetFilesForThumbnail) - .whereRef('asset_file.assetId', '=', 'asset.id') - .where('asset_file.type', '=', sql.lit(AssetFileType.EncodedVideo)), - ).as('files'), - ) + .select((eb) => withFiles(eb, AssetFileType.EncodedVideo)) .select(withEdits) .where('asset.id', '=', id) .where('asset.type', '=', sql.lit(AssetType.Video)) diff --git a/server/src/repositories/media.repository.ts b/server/src/repositories/media.repository.ts index 207d4e5358..58e006171a 100644 --- a/server/src/repositories/media.repository.ts +++ b/server/src/repositories/media.repository.ts @@ -29,7 +29,7 @@ const probe = (input: string, options: string[]): Promise => sharp.concurrency(0); sharp.cache({ files: 0 }); -export type ProgressEvent = { +type ProgressEvent = { frames: number; currentFps: number; currentKbps: number; @@ -327,7 +327,7 @@ export class MediaRepository { const { frameCount, percentInterval } = options.progress; const frameInterval = Math.ceil(frameCount / (100 / percentInterval)); - if (frameCount && frameInterval) { + if (this.logger.isLevelEnabled(LogLevel.Debug) && frameCount && frameInterval) { let lastProgressFrame: number = 0; ffmpegCall.on('progress', (progress: ProgressEvent) => { if (progress.frames - lastProgressFrame < frameInterval) { @@ -336,17 +336,12 @@ export class MediaRepository { lastProgressFrame = progress.frames; const percent = ((progress.frames / frameCount) * 100).toFixed(2); - - options.progress.callback?.(progress.frames / frameCount, progress.frames); - - if (this.logger.isLevelEnabled(LogLevel.Debug)) { - const ms = progress.currentFps ? Math.floor((frameCount - progress.frames) / progress.currentFps) * 1000 : 0; - const duration = ms ? Duration.fromMillis(ms).rescale().toHuman({ unitDisplay: 'narrow' }) : ''; - const outputText = output instanceof Writable ? 'stream' : output.split('/').pop(); - this.logger.debug( - `Transcoding ${percent}% done${duration ? `, estimated ${duration} remaining` : ''} for output ${outputText}`, - ); - } + const ms = progress.currentFps ? Math.floor((frameCount - progress.frames) / progress.currentFps) * 1000 : 0; + const duration = ms ? Duration.fromMillis(ms).rescale().toHuman({ unitDisplay: 'narrow' }) : ''; + const outputText = output instanceof Writable ? 'stream' : output.split('/').pop(); + this.logger.debug( + `Transcoding ${percent}% done${duration ? `, estimated ${duration} remaining` : ''} for output ${outputText}`, + ); }); } diff --git a/server/src/services/asset.service.ts b/server/src/services/asset.service.ts index 0386681edb..ebebf5edf9 100644 --- a/server/src/services/asset.service.ts +++ b/server/src/services/asset.service.ts @@ -615,7 +615,7 @@ export class AssetService extends BaseService { } const { width: liveWidth, height: liveHeight } = getDimensions(liveAsset); - console.log(liveWidth, liveHeight); + const scaledEdits = scaleEdits( edits, { width: liveWidth, height: liveHeight }, diff --git a/server/src/utils/database.ts b/server/src/utils/database.ts index ef2a2690dd..baa26859b8 100644 --- a/server/src/utils/database.ts +++ b/server/src/utils/database.ts @@ -116,13 +116,14 @@ export function withFaces(eb: ExpressionBuilder, withHidden?: boole ).as('faces'); } -export function withFiles(eb: ExpressionBuilder, type?: AssetFileType) { +export function withFiles(eb: ExpressionBuilder, type?: AssetFileType | AssetFileType[]) { return jsonArrayFrom( eb .selectFrom('asset_file') .select(columns.assetFiles) .whereRef('asset_file.assetId', '=', 'asset.id') - .$if(!!type, (qb) => qb.where('asset_file.type', '=', type!)), + .$if(!!type && typeof type === 'string', (qb) => qb.where('asset_file.type', '=', type!)) + .$if(!!type && Array.isArray(type), (qb) => qb.where('asset_file.type', 'in', type as AssetFileType[])), ).as('files'); }