Add dedicated rename support logging
This commit is contained in:
@@ -46,6 +46,7 @@ import { startDebugServer, stopDebugServer } from "../src/main/debug-server";
|
||||
import { ensureItemLog, initItemLogs, shutdownItemLogs } from "../src/main/item-log";
|
||||
import { configureLogger, getLogFilePath, logger } from "../src/main/logger";
|
||||
import { ensurePackageLog, initPackageLogs, shutdownPackageLogs } from "../src/main/package-log";
|
||||
import { getRenameLogPath, initRenameLog, logRenameEvent, shutdownRenameLog } from "../src/main/rename-log";
|
||||
import { getSessionLogPath, initSessionLog, shutdownSessionLog } from "../src/main/session-log";
|
||||
import { createStoragePaths, saveHistory, saveSettings } from "../src/main/storage";
|
||||
import { getTraceConfigPath, getTraceLogPath, initTraceLog, logTraceEvent, setTraceEnabled, shutdownTraceLog } from "../src/main/trace-log";
|
||||
@@ -235,6 +236,9 @@ async function createFixture() {
|
||||
}
|
||||
logAuditEvent("INFO", "AUDIT-LINE", { scope: "settings" });
|
||||
|
||||
initRenameLog(baseDir);
|
||||
logRenameEvent("INFO", "RENAME-LINE", { stage: "auto-rename", sourcePath: "C:\\extract\\old.mkv" });
|
||||
|
||||
initTraceLog(baseDir);
|
||||
setTraceEnabled(true, "test-fixture");
|
||||
logTraceEvent("INFO", "support", "TRACE-EVENT", { scope: "fixture" });
|
||||
@@ -294,6 +298,7 @@ afterEach(() => {
|
||||
shutdownSessionLog();
|
||||
shutdownPackageLogs();
|
||||
shutdownItemLogs();
|
||||
shutdownRenameLog();
|
||||
shutdownTraceLog();
|
||||
shutdownAuditLog();
|
||||
while (tempDirs.length > 0) {
|
||||
@@ -324,6 +329,7 @@ describe("debug-server", () => {
|
||||
expect(payload.selectedPackage?.name).toBe("server-package");
|
||||
expect((payload.logs?.main?.lines || []).join("\n")).toContain("MAIN-LINE");
|
||||
expect((payload.logs?.audit?.lines || []).join("\n")).toContain("AUDIT-LINE");
|
||||
expect((payload.logs?.rename?.lines || []).join("\n")).toContain("RENAME-LINE");
|
||||
expect((payload.logs?.trace?.lines || []).join("\n")).toContain("TRACE-EVENT");
|
||||
expect((payload.logs?.session?.lines || []).join("\n")).toContain("SESSION-LINE");
|
||||
expect((payload.logs?.package?.lines || []).join("\n")).toContain("PACKAGE-LINE");
|
||||
@@ -353,6 +359,7 @@ describe("debug-server", () => {
|
||||
expect(metaPayload.supportFiles?.aiManifest).toBe(manifestPath);
|
||||
expect(metaPayload.supportFiles?.traceConfig).toBe(getTraceConfigPath());
|
||||
expect(metaPayload.supportFiles?.traceLog).toBe(getTraceLogPath());
|
||||
expect(metaPayload.logPaths?.rename).toBe(getRenameLogPath());
|
||||
expect(metaPayload.supportChecks?.setup).toBe("/debug/setup");
|
||||
expect(metaPayload.supportChecks?.selfCheck).toBe("/self-check");
|
||||
});
|
||||
@@ -376,6 +383,7 @@ describe("debug-server", () => {
|
||||
expect(payload.diskSpace?.output?.freeBytes).toBeGreaterThan(0);
|
||||
expect(payload.diskSpace?.extract?.freeBytes).toBeGreaterThan(0);
|
||||
expect(payload.logSummary?.totalBytes).toBeGreaterThan(0);
|
||||
expect(payload.logSummary?.rename?.bytes).toBeGreaterThan(0);
|
||||
expect(payload.logSummary?.packageLogs?.fileCount).toBe(1);
|
||||
expect(payload.logSummary?.itemLogs?.fileCount).toBe(1);
|
||||
expect(payload.supportBundle?.estimatedBytes).toBeGreaterThan(0);
|
||||
@@ -437,6 +445,11 @@ describe("debug-server", () => {
|
||||
const auditPayload = await auditResponse.json() as Record<string, any>;
|
||||
expect((auditPayload.lines || []).join("\n")).toContain("AUDIT-LINE");
|
||||
|
||||
const renameResponse = await fetch(`${fixture.baseUrl}/logs/rename?token=${fixture.token}&lines=20`);
|
||||
expect(renameResponse.ok).toBe(true);
|
||||
const renamePayload = await renameResponse.json() as Record<string, any>;
|
||||
expect((renamePayload.lines || []).join("\n")).toContain("RENAME-LINE");
|
||||
|
||||
const traceResponse = await fetch(`${fixture.baseUrl}/logs/trace?token=${fixture.token}&lines=50`);
|
||||
expect(traceResponse.ok).toBe(true);
|
||||
const tracePayload = await traceResponse.json() as Record<string, any>;
|
||||
@@ -492,6 +505,7 @@ describe("debug-server", () => {
|
||||
expect(entries).toContain("overview/self-check.json");
|
||||
expect(entries).toContain("overview/trace-config.json");
|
||||
expect(entries).toContain("logs/audit.log");
|
||||
expect(entries).toContain("logs/rename.log");
|
||||
expect(entries).toContain("logs/trace.log");
|
||||
expect(entries).toContain("runtime/debug_ai_manifest.json");
|
||||
expect(entries).not.toContain("runtime/debug_token.txt");
|
||||
|
||||
@@ -9,8 +9,10 @@ import { DownloadManager, extractArchiveNameFromExtractorLogMessage, getAuthorit
|
||||
import { defaultSettings } from "../src/main/constants";
|
||||
import { parseDebridLinkApiKeys } from "../src/shared/debrid-link-keys";
|
||||
import { getProviderUsageDayKey } from "../src/shared/provider-daily-limits";
|
||||
import { getItemLogPath, initItemLogs, shutdownItemLogs } from "../src/main/item-log";
|
||||
import { createStoragePaths, emptySession } from "../src/main/storage";
|
||||
import { primeDebridLinkRuntimeCooldownForTests, resetDebridLinkRuntimeStateForTests } from "../src/main/debrid";
|
||||
import { getRenameLogPath, initRenameLog, shutdownRenameLog } from "../src/main/rename-log";
|
||||
|
||||
const tempDirs: string[] = [];
|
||||
const originalFetch = globalThis.fetch;
|
||||
@@ -56,6 +58,8 @@ async function removeDirWithRetries(dir: string): Promise<void> {
|
||||
afterEach(async () => {
|
||||
globalThis.fetch = originalFetch;
|
||||
resetDebridLinkRuntimeStateForTests();
|
||||
shutdownItemLogs();
|
||||
shutdownRenameLog();
|
||||
for (const dir of tempDirs.splice(0)) {
|
||||
await removeDirWithRetries(dir);
|
||||
}
|
||||
@@ -6705,6 +6709,50 @@ describe("download manager", () => {
|
||||
expect(fs.existsSync(originalExtractedPath)).toBe(false);
|
||||
});
|
||||
|
||||
it("writes auto-rename details into rename and item logs", async () => {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), "rd-dm-"));
|
||||
tempDirs.push(root);
|
||||
|
||||
const packageName = "Asbest.S02.GERMAN.720p.WEB.AVC-4SF";
|
||||
const sourceFileName = "4sf-asbest.web.7p-s02e01.mkv";
|
||||
const expectedFileName = "Asbest.S02E01.GERMAN.720p.WEB.AVC-4SF.mkv";
|
||||
const { session, itemId, extractDir } = createCompletedArchiveSession(root, packageName, sourceFileName);
|
||||
const stateDir = path.join(root, "state");
|
||||
initItemLogs(stateDir);
|
||||
initRenameLog(stateDir);
|
||||
|
||||
new DownloadManager(
|
||||
{
|
||||
...defaultSettings(),
|
||||
token: "rd-token",
|
||||
outputDir: path.join(root, "downloads"),
|
||||
extractDir: path.join(root, "extract"),
|
||||
autoExtract: true,
|
||||
autoRename4sf4sj: true,
|
||||
enableIntegrityCheck: false,
|
||||
cleanupMode: "none"
|
||||
},
|
||||
session,
|
||||
createStoragePaths(stateDir)
|
||||
);
|
||||
|
||||
const expectedPath = path.join(extractDir, expectedFileName);
|
||||
await waitFor(() => fs.existsSync(expectedPath), 12000);
|
||||
await new Promise((resolve) => setTimeout(resolve, 350));
|
||||
|
||||
const renameLogPath = getRenameLogPath();
|
||||
expect(renameLogPath).not.toBeNull();
|
||||
const renameContent = fs.readFileSync(renameLogPath!, "utf8");
|
||||
expect(renameContent).toContain("Auto-Rename durchgeführt");
|
||||
expect(renameContent).toContain(`targetPath=${expectedPath}`);
|
||||
|
||||
const itemLogPath = getItemLogPath(itemId);
|
||||
expect(itemLogPath).not.toBeNull();
|
||||
const itemContent = fs.readFileSync(itemLogPath!, "utf8");
|
||||
expect(itemContent).toContain("Auto-Rename durchgeführt");
|
||||
expect(itemContent).toContain("stage=auto-rename");
|
||||
}, 20000);
|
||||
|
||||
it("adds REPACK marker from rp token and supports 4SJ folders", async () => {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), "rd-dm-"));
|
||||
tempDirs.push(root);
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
import fs from "node:fs";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
import { getRenameLogPath, initRenameLog, logRenameEvent, shutdownRenameLog } from "../src/main/rename-log";
|
||||
|
||||
const tempDirs: string[] = [];
|
||||
|
||||
afterEach(() => {
|
||||
shutdownRenameLog();
|
||||
for (const dir of tempDirs.splice(0)) {
|
||||
fs.rmSync(dir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
describe("rename-log", () => {
|
||||
it("writes rename events to the rename log", () => {
|
||||
const baseDir = fs.mkdtempSync(path.join(os.tmpdir(), "rd-rlog-"));
|
||||
tempDirs.push(baseDir);
|
||||
|
||||
initRenameLog(baseDir);
|
||||
logRenameEvent("INFO", "Auto-Rename durchgeführt", {
|
||||
packageName: "Test Paket",
|
||||
sourcePath: "C:\\extract\\old.mkv",
|
||||
targetPath: "C:\\extract\\new.mkv"
|
||||
});
|
||||
|
||||
const logPath = getRenameLogPath();
|
||||
expect(logPath).not.toBeNull();
|
||||
expect(fs.existsSync(logPath!)).toBe(true);
|
||||
const content = fs.readFileSync(logPath!, "utf8");
|
||||
expect(content).toContain("Rename-Log Start");
|
||||
expect(content).toContain("Auto-Rename durchgeführt");
|
||||
expect(content).toContain("sourcePath=C:\\extract\\old.mkv");
|
||||
});
|
||||
|
||||
it("rotates oversized rename logs on startup", () => {
|
||||
const baseDir = fs.mkdtempSync(path.join(os.tmpdir(), "rd-rlog-rotate-"));
|
||||
tempDirs.push(baseDir);
|
||||
|
||||
const oversizedPath = path.join(baseDir, "rename.log");
|
||||
fs.mkdirSync(baseDir, { recursive: true });
|
||||
fs.writeFileSync(oversizedPath, "x".repeat(10 * 1024 * 1024 + 256), "utf8");
|
||||
|
||||
initRenameLog(baseDir);
|
||||
|
||||
expect(fs.existsSync(oversizedPath)).toBe(true);
|
||||
expect(fs.existsSync(`${oversizedPath}.old`)).toBe(true);
|
||||
const content = fs.readFileSync(oversizedPath, "utf8");
|
||||
expect(content).toContain("Rename-Log Start");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user