summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/DriveService.ts
diff options
context:
space:
mode:
authorJulia <julia@insertdomain.name>2025-06-19 21:35:18 +0000
committerJulia <julia@insertdomain.name>2025-06-19 21:35:18 +0000
commita77c32b17da63d3932b219f74152cce023a30f4a (patch)
treed2a05796e942c8f250bbd01369eab0cbe5a14531 /packages/backend/src/core/DriveService.ts
parentmerge: release 2025.4.2 (!1051) (diff)
parentMerge branch 'develop' into release/2025.4.3 (diff)
downloadsharkey-a77c32b17da63d3932b219f74152cce023a30f4a.tar.gz
sharkey-a77c32b17da63d3932b219f74152cce023a30f4a.tar.bz2
sharkey-a77c32b17da63d3932b219f74152cce023a30f4a.zip
merge: prepare release 2025.4.3 (!1125)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1125 Approved-by: Marie <github@yuugi.dev> Approved-by: Julia <julia@insertdomain.name>
Diffstat (limited to 'packages/backend/src/core/DriveService.ts')
-rw-r--r--packages/backend/src/core/DriveService.ts91
1 files changed, 46 insertions, 45 deletions
diff --git a/packages/backend/src/core/DriveService.ts b/packages/backend/src/core/DriveService.ts
index 82c447baaa..b9be4e3039 100644
--- a/packages/backend/src/core/DriveService.ts
+++ b/packages/backend/src/core/DriveService.ts
@@ -45,6 +45,7 @@ import { isMimeImage } from '@/misc/is-mime-image.js';
import { ModerationLogService } from '@/core/ModerationLogService.js';
import { UtilityService } from '@/core/UtilityService.js';
import { BunnyService } from '@/core/BunnyService.js';
+import { renderInlineError } from '@/misc/render-inline-error.js';
import { LoggerService } from './LoggerService.js';
type AddFileArgs = {
@@ -159,6 +160,14 @@ export class DriveService {
// thunbnail, webpublic を必要なら生成
const alts = await this.generateAlts(path, type, !file.uri);
+ if (type && type.startsWith('video/')) {
+ try {
+ await this.videoProcessingService.webOptimizeVideo(path, type);
+ } catch (err) {
+ this.registerLogger.warn(`Video optimization failed: ${renderInlineError(err)}`);
+ }
+ }
+
if (this.meta.useObjectStorage) {
//#region ObjectStorage params
let [ext] = (name.match(/\.([a-zA-Z0-9_-]+)$/) ?? ['']);
@@ -194,7 +203,7 @@ export class DriveService {
//#endregion
//#region Uploads
- this.registerLogger.info(`uploading original: ${key}`);
+ this.registerLogger.debug(`uploading original: ${key}`);
const uploads = [
this.upload(key, fs.createReadStream(path), type, null, name),
];
@@ -203,7 +212,7 @@ export class DriveService {
webpublicKey = `${prefix}webpublic-${randomUUID()}.${alts.webpublic.ext}`;
webpublicUrl = `${ baseUrl }/${ webpublicKey }`;
- this.registerLogger.info(`uploading webpublic: ${webpublicKey}`);
+ this.registerLogger.debug(`uploading webpublic: ${webpublicKey}`);
uploads.push(this.upload(webpublicKey, alts.webpublic.data, alts.webpublic.type, alts.webpublic.ext, name));
}
@@ -211,7 +220,7 @@ export class DriveService {
thumbnailKey = `${prefix}thumbnail-${randomUUID()}.${alts.thumbnail.ext}`;
thumbnailUrl = `${ baseUrl }/${ thumbnailKey }`;
- this.registerLogger.info(`uploading thumbnail: ${thumbnailKey}`);
+ this.registerLogger.debug(`uploading thumbnail: ${thumbnailKey}`);
uploads.push(this.upload(thumbnailKey, alts.thumbnail.data, alts.thumbnail.type, alts.thumbnail.ext, `${name}.thumbnail`));
}
@@ -255,11 +264,11 @@ export class DriveService {
const [url, thumbnailUrl, webpublicUrl] = await Promise.all(promises);
if (thumbnailUrl) {
- this.registerLogger.info(`thumbnail stored: ${thumbnailAccessKey}`);
+ this.registerLogger.debug(`thumbnail stored: ${thumbnailAccessKey}`);
}
if (webpublicUrl) {
- this.registerLogger.info(`web stored: ${webpublicAccessKey}`);
+ this.registerLogger.debug(`web stored: ${webpublicAccessKey}`);
}
file.storedInternal = true;
@@ -303,7 +312,7 @@ export class DriveService {
thumbnail,
};
} catch (err) {
- this.registerLogger.warn(`GenerateVideoThumbnail failed: ${err}`);
+ this.registerLogger.warn(`GenerateVideoThumbnail failed: ${renderInlineError(err)}`);
return {
webpublic: null,
thumbnail: null,
@@ -336,7 +345,7 @@ export class DriveService {
metadata.height && metadata.height <= 2048
);
} catch (err) {
- this.registerLogger.warn(`sharp failed: ${err}`);
+ this.registerLogger.warn(`sharp failed: ${renderInlineError(err)}`);
return {
webpublic: null,
thumbnail: null,
@@ -347,7 +356,7 @@ export class DriveService {
let webpublic: IImage | null = null;
if (generateWeb && !satisfyWebpublic && !isAnimated) {
- this.registerLogger.info('creating web image');
+ this.registerLogger.debug('creating web image');
try {
if (['image/jpeg', 'image/webp', 'image/avif'].includes(type)) {
@@ -358,12 +367,12 @@ export class DriveService {
this.registerLogger.debug('web image not created (not an required image)');
}
} catch (err) {
- this.registerLogger.warn('web image not created (an error occurred)', err as Error);
+ this.registerLogger.warn(`web image not created: ${renderInlineError(err)}`);
}
} else {
- if (satisfyWebpublic) this.registerLogger.info('web image not created (original satisfies webpublic)');
- else if (isAnimated) this.registerLogger.info('web image not created (animated image)');
- else this.registerLogger.info('web image not created (from remote)');
+ if (satisfyWebpublic) this.registerLogger.debug('web image not created (original satisfies webpublic)');
+ else if (isAnimated) this.registerLogger.debug('web image not created (animated image)');
+ else this.registerLogger.debug('web image not created (from remote)');
}
// #endregion webpublic
@@ -377,7 +386,7 @@ export class DriveService {
thumbnail = await this.imageProcessingService.convertSharpToWebp(img, 498, 422);
}
} catch (err) {
- this.registerLogger.warn('thumbnail not created (an error occurred)', err as Error);
+ this.registerLogger.warn(`Error creating thumbnail: ${renderInlineError(err)}`);
}
// #endregion thumbnail
@@ -411,27 +420,21 @@ export class DriveService {
);
if (this.meta.objectStorageSetPublicRead) params.ACL = 'public-read';
- if (this.bunnyService.usingBunnyCDN(this.meta)) {
- await this.bunnyService.upload(this.meta, key, stream).catch(
- err => {
- this.registerLogger.error(`Upload Failed: key = ${key}, filename = ${filename}`, err);
- },
- );
- } else {
- await this.s3Service.upload(this.meta, params)
- .then(
- result => {
- if ('Bucket' in result) { // CompleteMultipartUploadCommandOutput
- this.registerLogger.debug(`Uploaded: ${result.Bucket}/${result.Key} => ${result.Location}`);
- } else { // AbortMultipartUploadCommandOutput
- this.registerLogger.error(`Upload Result Aborted: key = ${key}, filename = ${filename}`);
- }
- })
- .catch(
- err => {
- this.registerLogger.error(`Upload Failed: key = ${key}, filename = ${filename}`, err);
- },
- );
+ try {
+ if (this.bunnyService.usingBunnyCDN(this.meta)) {
+ await this.bunnyService.upload(this.meta, key, stream);
+ } else {
+ const result = await this.s3Service.upload(this.meta, params);
+ if ('Bucket' in result) { // CompleteMultipartUploadCommandOutput
+ this.registerLogger.debug(`Uploaded: ${result.Bucket}/${result.Key} => ${result.Location}`);
+ } else { // AbortMultipartUploadCommandOutput
+ this.registerLogger.error(`Upload Result Aborted: key = ${key}, filename = ${filename}`);
+ throw new Error('S3 upload aborted');
+ }
+ }
+ } catch (err) {
+ this.registerLogger.error(`Upload Failed: key = ${key}, filename = ${filename}: ${renderInlineError(err)}`);
+ throw err;
}
}
@@ -490,7 +493,6 @@ export class DriveService {
}: AddFileArgs): Promise<MiDriveFile> {
const userRoleNSFW = user && (await this.roleService.getUserPolicies(user.id)).alwaysMarkNsfw;
const info = await this.fileInfoService.getFileInfo(path);
- this.registerLogger.info(`${JSON.stringify(info)}`);
// detect name
const detectedName = correctFilename(
@@ -500,6 +502,8 @@ export class DriveService {
ext ?? info.type.ext,
);
+ this.registerLogger.debug(`Detected file info: ${JSON.stringify(info)}`);
+
if (user && !force) {
// Check if there is a file with the same hash
const matched = await this.driveFilesRepository.findOneBy({
@@ -508,7 +512,7 @@ export class DriveService {
});
if (matched) {
- this.registerLogger.info(`file with same hash is found: ${matched.id}`);
+ this.registerLogger.debug(`file with same hash is found: ${matched.id}`);
if (sensitive && !matched.isSensitive) {
// The file is federated as sensitive for this time, but was federated as non-sensitive before.
// Therefore, update the file to sensitive.
@@ -636,14 +640,14 @@ export class DriveService {
} catch (err) {
// duplicate key error (when already registered)
if (isDuplicateKeyValueError(err)) {
- this.registerLogger.info(`already registered ${file.uri}`);
+ this.registerLogger.debug(`already registered ${file.uri}`);
file = await this.driveFilesRepository.findOneBy({
uri: file.uri!,
userId: user ? user.id : IsNull(),
}) as MiDriveFile;
} else {
- this.registerLogger.error(err as Error);
+ this.registerLogger.error('Error in drive register', err as Error);
throw err;
}
}
@@ -651,7 +655,7 @@ export class DriveService {
file = await (this.save(file, path, detectedName, info));
}
- this.registerLogger.succ(`drive file has been created ${file.id}`);
+ this.registerLogger.info(`Created file ${file.id} (${detectedName}) of type ${info.type.mime} for user ${user?.id ?? '<none>'}`);
if (user) {
this.driveFileEntityService.pack(file, { self: true }).then(packedFile => {
@@ -847,7 +851,7 @@ export class DriveService {
}
} catch (err: any) {
if (err.name === 'NoSuchKey') {
- this.deleteLogger.warn(`The object storage had no such key to delete: ${key}. Skipping this.`, err as Error);
+ this.deleteLogger.warn(`The object storage had no such key to delete: ${key}. Skipping this.`);
return;
} else {
throw new Error(`Failed to delete the file from the object storage with the given key: ${key}`, {
@@ -884,13 +888,10 @@ export class DriveService {
}
const driveFile = await this.addFile({ user, path, name, comment, folderId, force, isLink, url, uri, sensitive, requestIp, requestHeaders });
- this.downloaderLogger.succ(`Got: ${driveFile.id}`);
+ this.downloaderLogger.debug(`Upload succeeded: created file ${driveFile.id}`);
return driveFile!;
} catch (err) {
- this.downloaderLogger.error(`Failed to create drive file: ${err}`, {
- url: url,
- e: err,
- });
+ this.downloaderLogger.error(`Failed to create drive file from ${url}: ${renderInlineError(err)}`);
throw err;
} finally {
cleanup();