refactor(logging): route frontend console calls through the logger

TRACES: | DR-204

484 ungated `console.*` calls across 63 non-test frontend files shipped to
end users with no way to turn them off. Mechanical substitution, no control
flow, error handling or message semantics changed:

  console.log / console.debug -> log.debug
  console.info                -> log.info
  console.warn                -> log.warn
  console.error               -> log.error

Hand-written `"[Scope] …"` prefixes are dropped where the logger's scope
now carries them; scope names that already existed are preserved verbatim
(`[Auth]`, `[VideoPlayer]`, `[PiP]`, …) and inferred from the filename
where a file had none. `src/routes/player/[id]/+page.svelte` keeps its
`NextEpisode` and `AutoPlay` sub-scopes as separate loggers rather than
flattening them into the page scope.

`grep -rn 'console\.' src/` now matches nothing outside the tests and the
facade itself.
This commit is contained in:
2026-08-20 19:29:59 +02:00
parent 4c82a0a025
commit d54d8cc7c4
63 changed files with 686 additions and 490 deletions
+26 -23
View File
@@ -4,6 +4,9 @@
import { writable, derived } from "svelte/store";
import { commands, events } from "$lib/api/bindings";
import type { Session } from "$lib/api/types";
import { createLogger } from "$lib/utils/logger";
const log = createLogger("Sessions");
interface SessionsState {
sessions: Session[];
@@ -28,9 +31,9 @@ function createSessionsStore() {
events.playerStatusEvent.listen((event) => {
if (event.payload.type === "sessions_updated") {
const sessions = event.payload.sessions as unknown as Session[];
console.log(`[Sessions] Received ${sessions.length} sessions from backend`);
log.debug(`Received ${sessions.length} sessions from backend`);
sessions.forEach((s, i) => {
console.log(`[Sessions] Session ${i}: id=${s.id}, device=${s.deviceName}, supportsRemoteControl=${s.supportsRemoteControl}`);
log.debug(`Session ${i}: id=${s.id}, device=${s.deviceName}, supportsRemoteControl=${s.supportsRemoteControl}`);
});
update((s) => ({
...s,
@@ -50,9 +53,9 @@ function createSessionsStore() {
const sessions = await commands.sessionsPollNow();
console.log(`[Sessions] Manual refresh returned ${sessions.length} sessions`);
log.debug(`Manual refresh returned ${sessions.length} sessions`);
sessions.forEach((s, i) => {
console.log(`[Sessions] Session ${i}: id=${s.id}, device=${s.deviceName}, supportsRemoteControl=${s.supportsRemoteControl}`);
log.debug(`Session ${i}: id=${s.id}, device=${s.deviceName}, supportsRemoteControl=${s.supportsRemoteControl}`);
});
update((s) => ({
@@ -69,7 +72,7 @@ function createSessionsStore() {
isLoading: false,
error: message,
}));
console.error("Failed to fetch sessions:", error);
log.error("Failed to fetch sessions:", error);
}
}
@@ -90,7 +93,7 @@ function createSessionsStore() {
// Refresh after command to get updated state
await refresh();
} catch (error) {
console.error("Failed to send play/pause command:", error);
log.error("Failed to send play/pause command:", error);
throw error;
}
}
@@ -103,7 +106,7 @@ function createSessionsStore() {
await commands.remoteSendCommand(sessionId ?? "", "Stop");
await refresh();
} catch (error) {
console.error("Failed to send stop command:", error);
log.error("Failed to send stop command:", error);
throw error;
}
}
@@ -116,7 +119,7 @@ function createSessionsStore() {
await commands.remoteSendCommand(sessionId ?? "", "NextTrack");
await refresh();
} catch (error) {
console.error("Failed to send next track command:", error);
log.error("Failed to send next track command:", error);
throw error;
}
}
@@ -129,7 +132,7 @@ function createSessionsStore() {
await commands.remoteSendCommand(sessionId ?? "", "PreviousTrack");
await refresh();
} catch (error) {
console.error("Failed to send previous track command:", error);
log.error("Failed to send previous track command:", error);
throw error;
}
}
@@ -142,7 +145,7 @@ function createSessionsStore() {
await commands.remoteSessionSeek(sessionId ?? "", positionTicks);
// Don't refresh immediately for seek to avoid UI lag
} catch (error) {
console.error("Failed to send seek command:", error);
log.error("Failed to send seek command:", error);
throw error;
}
}
@@ -155,7 +158,7 @@ function createSessionsStore() {
await commands.remoteSessionSetVolume(sessionId ?? "", volume);
// Don't refresh immediately for volume to avoid UI lag
} catch (error) {
console.error("Failed to send volume command:", error);
log.error("Failed to send volume command:", error);
throw error;
}
}
@@ -168,7 +171,7 @@ function createSessionsStore() {
await commands.remoteSendCommand(sessionId ?? "", "ToggleMute");
await refresh();
} catch (error) {
console.error("Failed to toggle mute:", error);
log.error("Failed to toggle mute:", error);
throw error;
}
}
@@ -181,20 +184,20 @@ function createSessionsStore() {
itemIds: string[],
startIndex = 0
): Promise<void> {
console.log("[SESSIONS] ========== playOnSession called ==========");
console.log("[SESSIONS] sessionId:", sessionId);
console.log("[SESSIONS] itemIds array:", itemIds);
console.log("[SESSIONS] itemIds.length:", itemIds.length);
console.log("[SESSIONS] itemIds JSON:", JSON.stringify(itemIds));
console.log("[SESSIONS] startIndex:", startIndex);
console.log("[SESSIONS] About to call commands.remotePlayOnSession");
log.debug("========== playOnSession called ==========");
log.debug("sessionId:", sessionId);
log.debug("itemIds array:", itemIds);
log.debug("itemIds.length:", itemIds.length);
log.debug("itemIds JSON:", JSON.stringify(itemIds));
log.debug("startIndex:", startIndex);
log.debug("About to call commands.remotePlayOnSession");
try {
// Use Rust player's Jellyfin client for remote playback
const result = await commands.remotePlayOnSession(sessionId ?? "", itemIds, startIndex);
console.log("[SESSIONS] invoke succeeded, result:", result);
log.debug("invoke succeeded, result:", result);
await refresh();
} catch (error) {
console.error("[SESSIONS] Failed to play on session:", error);
log.error("Failed to play on session:", error);
throw error;
}
}
@@ -242,10 +245,10 @@ export const controllableSessions = derived(
sessions,
($sessions) => {
const controllable = $sessions.sessions.filter((s) => s.supportsRemoteControl);
console.log(`[Sessions] Filtering ${$sessions.sessions.length} total sessions, ${controllable.length} are controllable`);
log.debug(`Filtering ${$sessions.sessions.length} total sessions, ${controllable.length} are controllable`);
$sessions.sessions.forEach((s, i) => {
const status = s.supportsRemoteControl ? "✓ CONTROLLABLE" : "✗ NOT CONTROLLABLE";
console.log(`[Sessions] ${status}: ${s.deviceName} (id=${s.id}, supportsRemoteControl=${s.supportsRemoteControl})`);
log.debug(` ${status}: ${s.deviceName} (id=${s.id}, supportsRemoteControl=${s.supportsRemoteControl})`);
});
return controllable;
}