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
+28 -25
View File
@@ -14,6 +14,9 @@ import { commands, events } from "$lib/api/bindings";
import { sessions, selectedSession } from "./sessions";
import { auth } from "./auth";
import { ticksToSeconds } from "$lib/utils/playbackUnits";
import { createLogger } from "$lib/utils/logger";
const log = createLogger("PlaybackMode");
export type PlaybackMode = "local" | "remote" | "idle";
@@ -59,7 +62,7 @@ function createPlaybackModeStore() {
// authoritative mode.
sessions.selectSession(remoteSessionId);
} catch (error) {
console.error("Failed to get playback mode:", error);
log.error("Failed to get playback mode:", error);
}
}
@@ -81,7 +84,7 @@ function createPlaybackModeStore() {
sessionId: string | null | undefined,
currentPosition?: number,
): Promise<void> {
console.log("[PlaybackMode] Transferring to remote session:", sessionId);
log.debug("Transferring to remote session:", sessionId);
update((s) => ({ ...s, isTransferring: true, transferError: null }));
let aborted = false;
@@ -104,12 +107,12 @@ function createPlaybackModeStore() {
// Rust handles everything - just wait for it to complete
// It includes its own 5-second timeout for track loading
console.log("[PlaybackMode] About to invoke playback_mode_transfer_to_remote with sessionId:", sessionId, "position:", positionOverride);
log.debug("About to invoke playback_mode_transfer_to_remote with sessionId:", sessionId, "position:", positionOverride);
await commands.playbackModeTransferToRemote(sessionId ?? "", positionOverride);
console.log("[PlaybackMode] Invoke completed successfully");
log.debug("Invoke completed successfully");
if (aborted) {
console.log("[PlaybackMode] Transfer was cancelled");
log.debug("Transfer was cancelled");
return;
}
@@ -122,10 +125,10 @@ function createPlaybackModeStore() {
isTransferring: false,
}));
console.log("[PlaybackMode] Successfully transferred to remote");
log.debug("Successfully transferred to remote");
} catch (error) {
if (aborted) {
console.log("[PlaybackMode] Transfer was cancelled");
log.debug("Transfer was cancelled");
return;
}
@@ -135,7 +138,7 @@ function createPlaybackModeStore() {
isTransferring: false,
transferError: message,
}));
console.error("Transfer to remote failed:", error);
log.error("Transfer to remote failed:", error);
throw error;
} finally {
currentTransferAbort = null;
@@ -154,7 +157,7 @@ function createPlaybackModeStore() {
* Will be fully migrated to Rust after Phase 3.
*/
async function transferToLocal(): Promise<void> {
console.log("[PlaybackMode] Transferring to local");
log.debug("Transferring to local");
update((s) => ({ ...s, isTransferring: true, transferError: null }));
let aborted = false;
@@ -195,7 +198,7 @@ function createPlaybackModeStore() {
const itemId = (nowPlaying as any).id || (nowPlaying as any).Id;
const itemName = (nowPlaying as any).name || (nowPlaying as any).Name;
console.log("[PlaybackMode] Current remote item:", itemName, "position:", positionSeconds, "id:", itemId);
log.debug("Current remote item:", itemName, "position:", positionSeconds, "id:", itemId);
if (!itemId) {
throw new Error("Cannot transfer: remote item has no ID");
@@ -246,10 +249,10 @@ function createPlaybackModeStore() {
isTransferring: false,
}));
console.log("[PlaybackMode] Successfully transferred to local");
log.debug("Successfully transferred to local");
} catch (error) {
if (aborted) {
console.log("[PlaybackMode] Transfer was cancelled");
log.debug("Transfer was cancelled");
return;
}
@@ -259,7 +262,7 @@ function createPlaybackModeStore() {
isTransferring: false,
transferError: message,
}));
console.error("Transfer to local failed:", error);
log.error("Transfer to local failed:", error);
throw error;
} finally {
// Always lower the Rust transferring flag so it can't stick on if any step
@@ -268,7 +271,7 @@ function createPlaybackModeStore() {
try {
await commands.playbackModeSetTransferring(false);
} catch (e) {
console.warn("[PlaybackMode] Failed to clear transferring flag:", e);
log.warn("Failed to clear transferring flag:", e);
}
currentTransferAbort = null;
// Reconcile to the authoritative Rust mode in case a step above threw and
@@ -294,9 +297,9 @@ function createPlaybackModeStore() {
if (event.payload.type === "remote_disconnect_requested") {
const currentState = get({ subscribe });
if (currentState.mode === "remote") {
console.log("[PlaybackMode] Lockscreen requested disconnect; transferring to local");
log.debug("Lockscreen requested disconnect; transferring to local");
transferToLocal().catch((e) =>
console.error("[PlaybackMode] Lockscreen-triggered transfer failed:", e),
log.error("Lockscreen-triggered transfer failed:", e),
);
}
return;
@@ -331,7 +334,7 @@ function createPlaybackModeStore() {
return;
}
console.log("[PlaybackMode] Backend mode changed →", mode, remoteSessionId);
log.debug("Backend mode changed →", mode, remoteSessionId);
update((s) => ({ ...s, mode, remoteSessionId }));
// Keep the selected session in step so the merged UI stores follow, but
// only touch the selection when it actually differs — re-selecting the
@@ -352,10 +355,10 @@ function createPlaybackModeStore() {
if (currentState.mode === "remote" && currentState.remoteSessionId && !currentState.isTransferring) {
if (!session || session.id !== currentState.remoteSessionId || !session.supportsMediaControl) {
consecutiveMisses++;
console.warn(`[PlaybackMode] Remote session miss ${consecutiveMisses}/${DISCONNECT_THRESHOLD}`);
log.warn(`Remote session miss ${consecutiveMisses}/${DISCONNECT_THRESHOLD}`);
if (consecutiveMisses >= DISCONNECT_THRESHOLD) {
console.warn("[PlaybackMode] Remote session lost after sustained disconnection");
log.warn("Remote session lost after sustained disconnection");
consecutiveMisses = 0;
update((s) => ({
...s,
@@ -367,7 +370,7 @@ function createPlaybackModeStore() {
} else {
// Session is healthy, reset counter
if (consecutiveMisses > 0) {
console.log("[PlaybackMode] Remote session recovered after", consecutiveMisses, "misses");
log.debug("Remote session recovered after", consecutiveMisses, "misses");
}
consecutiveMisses = 0;
}
@@ -389,7 +392,7 @@ function createPlaybackModeStore() {
*/
function cancelTransfer(): void {
if (currentTransferAbort) {
console.log("[PlaybackMode] Cancelling transfer");
log.debug("Cancelling transfer");
currentTransferAbort();
}
}
@@ -399,11 +402,11 @@ function createPlaybackModeStore() {
* This stops controlling the remote device and returns to idle/local state
*/
async function disconnect(): Promise<void> {
console.log("[PlaybackMode] Disconnecting from remote session");
log.debug("Disconnecting from remote session");
const currentState = get({ subscribe });
if (currentState.mode !== "remote") {
console.log("[PlaybackMode] Not in remote mode, nothing to disconnect");
log.debug("Not in remote mode, nothing to disconnect");
return;
}
@@ -420,10 +423,10 @@ function createPlaybackModeStore() {
transferError: null,
}));
console.log("[PlaybackMode] Successfully disconnected");
log.debug("Successfully disconnected");
} catch (error) {
const message = error instanceof Error ? error.message : "Failed to disconnect";
console.error("[PlaybackMode] Disconnect failed:", error);
log.error("Disconnect failed:", error);
update((s) => ({
...s,
transferError: message,