diff --git a/apps/server/src/timer/timer.routes.ts b/apps/server/src/timer/timer.routes.ts index 2c91d4a..1bae61f 100644 --- a/apps/server/src/timer/timer.routes.ts +++ b/apps/server/src/timer/timer.routes.ts @@ -10,6 +10,7 @@ const router = Router(); const ruleSchema = z.object({ tags: z.array(z.string().min(1)).min(1), seedLimitSeconds: z.number().int().min(60).max(60 * 60 * 24 * 365), + deleteFiles: z.boolean().optional(), }); router.get("/rules", async (_req, res) => { @@ -27,6 +28,7 @@ router.post("/rules", async (req, res) => { id: randomUUID(), tags: parsed.data.tags, seedLimitSeconds: parsed.data.seedLimitSeconds, + deleteFiles: parsed.data.deleteFiles ?? true, createdAt: nowIso(), }; db.timerRules = [...(db.timerRules ?? []), rule]; diff --git a/apps/server/src/timer/timer.types.ts b/apps/server/src/timer/timer.types.ts index c9cdfba..f87c236 100644 --- a/apps/server/src/timer/timer.types.ts +++ b/apps/server/src/timer/timer.types.ts @@ -1,4 +1,5 @@ export interface TimerRuleInput { tags: string[]; seedLimitSeconds: number; + deleteFiles?: boolean; } diff --git a/apps/server/src/timer/timer.worker.ts b/apps/server/src/timer/timer.worker.ts index 963e6b1..87ceaba 100644 --- a/apps/server/src/timer/timer.worker.ts +++ b/apps/server/src/timer/timer.worker.ts @@ -57,7 +57,7 @@ export const startTimerWorker = (qbit: QbitClient, intervalMs: number) => { } try { - await qbit.deleteTorrent(torrent.hash, true); + await qbit.deleteTorrent(torrent.hash, matchingRule.deleteFiles ?? true); } catch (error) { continue; } diff --git a/apps/server/src/types.ts b/apps/server/src/types.ts index 2945651..cf2395a 100644 --- a/apps/server/src/types.ts +++ b/apps/server/src/types.ts @@ -74,6 +74,7 @@ export interface TimerRule { id: string; tags: string[]; seedLimitSeconds: number; + deleteFiles: boolean; createdAt: string; } diff --git a/apps/web/src/pages/TimerPage.tsx b/apps/web/src/pages/TimerPage.tsx index 9b76a9d..e01b70c 100644 --- a/apps/web/src/pages/TimerPage.tsx +++ b/apps/web/src/pages/TimerPage.tsx @@ -67,6 +67,11 @@ const formatCountdown = (seconds: number) => { return `${days}g ${pad(hours)}:${pad(minutes)}:${pad(secs)}`; }; +const formatAddedOn = (addedOn?: number) => { + if (!Number.isFinite(addedOn)) return "Bilinmiyor"; + return new Date(addedOn * 1000).toLocaleString(); +}; + const trackerLabel = (tracker?: string) => { if (!tracker) return "Bilinmiyor"; try { @@ -91,6 +96,7 @@ export const TimerPage = () => { const [seedUnit, setSeedUnit] = useState<(typeof unitOptions)[number]["value"]>( "weeks" ); + const [deleteFiles, setDeleteFiles] = useState(true); const [busy, setBusy] = useState(false); const pushAlert = useUiStore((s) => s.pushAlert); const [nowTick, setNowTick] = useState(() => Date.now()); @@ -225,9 +231,11 @@ export const TimerPage = () => { const response = await api.post("/api/timer/rules", { tags: selectedTags, seedLimitSeconds, + deleteFiles, }); setTimerRules([response.data, ...timerRules]); setSelectedTags([]); + setDeleteFiles(true); pushAlert({ title: "Kural kaydedildi", description: "Timer kuralı aktif edildi.", @@ -322,6 +330,9 @@ export const TimerPage = () => { .filter(Boolean) .join(", ") || "-"} +