chore: clean up logging

This commit is contained in:
Maya 2026-03-10 21:30:18 +03:00
parent fb1bd521f3
commit ed851d8bd3
No known key found for this signature in database
4 changed files with 66 additions and 128 deletions

View File

@ -79,9 +79,16 @@ export class FFmpegConverter extends Converter {
public readonly reportsProgress = true;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private log: (...msg: any[]) => void = () => {};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private error: (...msg: any[]) => void = () => {};
constructor() {
super();
log(["converters", this.name], `created converter`);
this.log = (msg) => log(["converters", this.name], msg);
this.error = (msg) => error(["converters", this.name], msg);
this.log(`created converter`);
if (!browser) return;
try {
// this is just to cache the wasm and js for when we actually use it. we're not using this ffmpeg instance
@ -246,10 +253,7 @@ export class FFmpegConverter extends Converter {
const buf = new Uint8Array(await input.file.arrayBuffer());
await ffmpeg.writeFile("input", buf);
log(
["converters", this.name],
`wrote ${input.name} to ffmpeg virtual fs`,
);
this.log(`wrote ${input.name} to ffmpeg virtual fs`);
const command = await this.buildConversionCommand(
ffmpeg,
@ -258,9 +262,9 @@ export class FFmpegConverter extends Converter {
conversionSettings,
isAlac,
);
log(["converters", this.name], `FFmpeg command: ${command.join(" ")}`);
this.log(`FFmpeg command: ${command.join(" ")}`);
await ffmpeg.exec(command);
log(["converters", this.name], "executed ffmpeg command");
this.log("executed ffmpeg command");
if (conversionError) {
ffmpeg.off("log", errorListener);
@ -280,10 +284,7 @@ export class FFmpegConverter extends Converter {
const outputFileName =
input.name.split(".").slice(0, -1).join(".") + to;
log(
["converters", this.name],
`read ${outputFileName} from ffmpeg virtual fs`,
);
this.log(`read ${outputFileName} from ffmpeg virtual fs`);
ffmpeg.off("log", errorListener);
ffmpeg.terminate();
@ -295,17 +296,11 @@ export class FFmpegConverter extends Converter {
public async cancel(input: VertFile): Promise<void> {
const ffmpeg = this.activeConversions.get(input.id);
if (!ffmpeg) {
error(
["converters", this.name],
`no active conversion found for file ${input.name}`,
);
this.error(`no active conversion found for file ${input.name}`);
return;
}
log(
["converters", this.name],
`cancelling conversion for file ${input.name}`,
);
this.log(`cancelling conversion for file ${input.name}`);
ffmpeg.terminate();
this.activeConversions.delete(input.id);
@ -323,7 +318,7 @@ export class FFmpegConverter extends Converter {
});
ffmpeg.on("log", (l) => {
log(["converters", this.name], l.message);
this.log(l.message);
});
}
@ -358,10 +353,7 @@ export class FFmpegConverter extends Converter {
const n = parseInt(event.message.trim(), 10);
if (!n) return;
bitrate = Math.round(n / 1000);
log(
["converters", this.name],
`Detected stream audio bitrate: ${bitrate} kbps`,
);
this.log(`Detected stream audio bitrate: ${bitrate} kbps`);
};
ffmpeg.on("log", bitrateListener);
@ -400,10 +392,7 @@ export class FFmpegConverter extends Converter {
const n = parseInt(event.message.trim(), 10);
if (!n) return;
sampleRate = n;
log(
["converters", this.name],
`Detected stream audio sample rate: ${sampleRate} Hz`,
);
this.log(`Detected stream audio sample rate: ${sampleRate} Hz`);
};
ffmpeg.on("log", sampleRateListener);
@ -453,7 +442,7 @@ export class FFmpegConverter extends Converter {
let metadataArgs: string[] = [];
let m4aArgs: string[] = [];
log(["converters", this.name], `keep metadata: ${keepMetadata}`);
this.log(`keep metadata: ${keepMetadata}`);
if (!keepMetadata) {
metadataArgs = [
"-map_metadata", // remove metadata
@ -473,17 +462,13 @@ export class FFmpegConverter extends Converter {
"-b:a",
`${userBitrate === "custom" ? customBitrate : userBitrate}k`,
];
log(
["converters", this.name],
`using user setting for audio bitrate: ${userBitrate}`,
);
this.log(`using user setting for audio bitrate: ${userBitrate}`);
} else {
// detect bitrate of original file and use
if (isLosslessToLossy) {
// use safe default
audioBitrateArgs = ["-b:a", "128k"];
log(
["converters", this.name],
this.log(
`converting from lossless to lossy, using default audio bitrate: 128k`,
);
} else {
@ -491,10 +476,7 @@ export class FFmpegConverter extends Converter {
audioBitrateArgs = inputBitrate
? ["-b:a", `${inputBitrate}k`]
: [];
log(
["converters", this.name],
`using detected audio bitrate: ${inputBitrate}k`,
);
this.log(`using detected audio bitrate: ${inputBitrate}k`);
}
}
@ -504,17 +486,13 @@ export class FFmpegConverter extends Converter {
"-ar",
userSampleRate === "custom" ? customSampleRate : userSampleRate,
];
log(
["converters", this.name],
`using user setting for sample rate: ${userSampleRate}Hz`,
);
this.log(`using user setting for sample rate: ${userSampleRate}Hz`);
} else {
// detect sample rate of original file and use
if (isLosslessToLossy) {
// use safe default
const defaultRate = to === ".opus" ? "48000" : "44100";
log(
["converters", this.name],
this.log(
`converting from lossless to lossy, using default sample rate: ${defaultRate}Hz`,
);
sampleRateArgs = ["-ar", defaultRate];
@ -522,9 +500,8 @@ export class FFmpegConverter extends Converter {
let inputSampleRate = await this.detectAudioSampleRate(ffmpeg);
if (to === ".opus" && inputSampleRate === 44100) {
// special case: opus does not support 44100Hz which is more common - adjust to 48000Hz
log(
["converters", this.name],
"conversion to opus with 44100Hz sample rate detected, adjusting to 48000Hz",
this.log(
`conversion to opus with 44100Hz sample rate detected, adjusting to 48000Hz`,
);
inputSampleRate = 48000;
}
@ -532,8 +509,7 @@ export class FFmpegConverter extends Converter {
sampleRateArgs = inputSampleRate
? ["-ar", `${inputSampleRate}`]
: [];
log(
["converters", this.name],
this.log(
`using detected audio sample rate: ${inputSampleRate}Hz`,
);
}
@ -542,8 +518,7 @@ export class FFmpegConverter extends Converter {
// channels setting
if (settings.channels !== "auto") {
channelsArgs = ["-ac", settings.channels];
log(
["converters", this.name],
this.log(
`using user setting for audio channels: ${settings.channels}`,
);
}
@ -560,18 +535,12 @@ export class FFmpegConverter extends Converter {
tracksArgs = ["-map", "0:a:0"]; // default to first audio track if not specified
}
log(
["converters", this.name],
`using user setting for audio tracks: ${settings.tracks}`,
);
this.log(`using user setting for audio tracks: ${settings.tracks}`);
}
// video to audio
if (videoFormats.includes(inputFormat)) {
log(
["converters", this.name],
`Converting video ${input.from} to audio ${to}`,
);
this.log(`Converting video ${input.from} to audio ${to}`);
return [
"-i",
"input",
@ -588,10 +557,7 @@ export class FFmpegConverter extends Converter {
// audio to video
if (videoFormats.includes(outputFormat)) {
log(
["converters", this.name],
`Converting audio ${input.from} to video ${to}`,
);
this.log(`Converting audio ${input.from} to video ${to}`);
const hasAlbumArt = keepMetadata
? await this.extractAlbumArt(ffmpeg)
@ -599,10 +565,7 @@ export class FFmpegConverter extends Converter {
const codecArgs = toArgs(to, isAlac);
if (hasAlbumArt) {
log(
["converters", this.name],
"Using album art as video background",
);
this.log("Using album art as video background");
return [
"-loop",
"1",
@ -626,7 +589,7 @@ export class FFmpegConverter extends Converter {
"output" + to,
];
} else {
log(["converters", this.name], "Using solid color background");
this.log("Using solid color background");
return [
"-f",
"lavfi",
@ -651,10 +614,7 @@ export class FFmpegConverter extends Converter {
}
// audio to audio
log(
["converters", this.name],
`Converting audio ${input.from} to audio ${to}`,
);
this.log(`Converting audio ${input.from} to audio ${to}`);
const { audio: audioCodec } = getCodecs(to, isAlac);
if (m4a && keepMetadata) m4aArgs = ["-c:v", "copy"]; // for album art
@ -688,10 +648,7 @@ export class FFmpegConverter extends Converter {
"cover.jpg",
])
) {
log(
["converters", this.name],
"Successfully extracted album art from stream 0:1",
);
this.log("Successfully extracted album art from stream 0:1");
return true;
}
@ -708,17 +665,11 @@ export class FFmpegConverter extends Converter {
"cover.jpg",
])
) {
log(
["converters", this.name],
"Successfully extracted album art (fallback method)",
);
this.log("Successfully extracted album art (fallback method)");
return true;
}
log(
["converters", this.name],
"No album art found, will create solid color background",
);
this.log("No album art found, will create solid color background");
return false;
}

View File

@ -83,9 +83,16 @@ export class MagickConverter extends Converter {
public readonly reportsProgress = false;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private log: (...msg: any[]) => void = () => {};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private error: (...msg: any[]) => void = () => {};
constructor() {
super();
log(["converters", this.name], `created converter`);
this.log = (msg) => log(["converters", this.name], msg);
this.error = (msg) => error(["converters", this.name], msg);
this.log(`created converter`);
if (!browser) return;
this.initializeWasm();
}
@ -104,10 +111,7 @@ export class MagickConverter extends Converter {
this.status = "ready";
} catch (err) {
this.status = "error";
error(
["converters", this.name],
`Failed to load ImageMagick WASM: ${err}`,
);
this.error(`Failed to load ImageMagick WASM: ${err}`);
ToastManager.add({
type: "error",
@ -209,7 +213,7 @@ export class MagickConverter extends Converter {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
...args: any[]
): Promise<VertFile> {
log(["converters", this.name], `converting ${input.name} to ${to}`);
this.log(`converting ${input.name} to ${to}`);
// handle converting from SVG manually because magick-wasm doesn't support it
if (input.from === ".svg") {
@ -222,10 +226,7 @@ export class MagickConverter extends Converter {
if (to === ".png") return pngFile; // if target is png, return it directly
return await this.convert(pngFile, to, settings, ...args); // otherwise, recursively convert png to user's target format
} catch (err) {
error(
["converters", this.name],
`SVG conversion failed: ${err}`,
);
this.error(`SVG conversion failed: ${err}`);
throw err;
}
}
@ -295,10 +296,7 @@ export class MagickConverter extends Converter {
const res = await this.waitForMessage(worker);
if (res.type === "finished") {
log(
["converters", this.name],
`converted ${input.name} to ${to}`,
);
this.log(`converted ${input.name} to ${to}`);
return new VertFile(
new File([res.output as unknown as BlobPart], input.name),
res.zip ? ".zip" : to,
@ -319,17 +317,11 @@ export class MagickConverter extends Converter {
public async cancel(input: VertFile): Promise<void> {
const worker = this.activeConversions.get(input.id);
if (!worker) {
error(
["converters", this.name],
`no active conversion found for file ${input.name}`,
);
this.error(`no active conversion found for file ${input.name}`);
return;
}
log(
["converters", this.name],
`cancelling conversion for file ${input.name}`,
);
this.log(`cancelling conversion for file ${input.name}`);
worker.terminate();
this.activeConversions.delete(input.id);
@ -366,7 +358,7 @@ export class MagickConverter extends Converter {
}
private async svgToImage(input: VertFile): Promise<Blob> {
log(["converters", this.name], `converting SVG to image (PNG)`);
this.log(`converting SVG to image (PNG)`);
const svgText = await input.file.text();
const svgBlob = new Blob([svgText], { type: "image/svg+xml" });

View File

@ -13,8 +13,15 @@ export class PandocConverter extends Converter {
private activeConversions = new Map<string, Worker>();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private log: (...msg: any[]) => void = () => {};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private error: (...msg: any[]) => void = () => {};
constructor() {
super();
this.log = (msg) => log(["converters", this.name], msg);
this.error = (msg) => error(["converters", this.name], msg);
if (!browser) return;
(async () => {
try {
@ -26,10 +33,7 @@ export class PandocConverter extends Converter {
this.status = "ready";
} catch (err) {
this.status = "error";
error(
["converters", this.name],
`Failed to load Pandoc worker: ${err}`,
);
this.error(`Failed to load Pandoc worker: ${err}`);
ToastManager.add({
type: "error",
message: m["workers.errors.pandoc"](),
@ -113,17 +117,11 @@ export class PandocConverter extends Converter {
public async cancel(input: VertFile): Promise<void> {
const worker = this.activeConversions.get(input.id);
if (!worker) {
error(
["converters", this.name],
`no active conversion found for file ${input.name}`,
);
this.error(`no active conversion found for file ${input.name}`);
return;
}
log(
["converters", this.name],
`cancelling conversion for file ${input.name}`,
);
this.log(`cancelling conversion for file ${input.name}`);
worker.terminate();
this.activeConversions.delete(input.id);

View File

@ -332,10 +332,13 @@ export class VertdConverter extends Converter {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private log: (...msg: any[]) => void = () => {};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private error: (...msg: any[]) => void = () => {};
constructor() {
super();
this.log = (msg) => log(["converters", this.name], msg);
this.error = (msg) => error(["converters", this.name], msg);
this.log("created converter");
this.log("not rly sure how to implement this :P");
this.status = "ready";
@ -712,10 +715,7 @@ export class VertdConverter extends Converter {
`confirmed download for file ${input.name}`,
);
} catch (e) {
error(
["converters", this.name],
`failed to confirm download: ${e}`,
);
this.error(`failed to confirm download: ${e}`);
}
resolve(new VertFile(new File([res], input.name), to));
@ -754,10 +754,7 @@ export class VertdConverter extends Converter {
public async cancel(input: VertFile): Promise<void> {
const activeConversion = this.activeConversions.get(input.id);
if (!activeConversion) {
error(
["converters", this.name],
`no active conversion found for file ${input.name}`,
);
this.error(`no active conversion found for file ${input.name}`);
return;
}