Add daemon restart, preview diagnostics, browse caching, and rate-limit pauses

This commit is contained in:
Fisto
2026-09-17 07:33:35 +02:00
parent cba7ae8143
commit dea1724eb3
13 changed files with 367 additions and 56 deletions
+38 -1
View File
@@ -135,6 +135,7 @@ export interface MediaRow {
file_hash: string | null;
preview_hash: string | null;
preview_ext: string | null;
anim_hash: string | null;
file_bytes: number | null;
preview_bytes: number | null;
file_path: string | null;
@@ -173,6 +174,7 @@ CREATE TABLE IF NOT EXISTS media (
file_hash TEXT,
preview_hash TEXT,
preview_ext TEXT,
anim_hash TEXT,
file_bytes INTEGER,
preview_bytes INTEGER,
file_path TEXT,
@@ -217,6 +219,7 @@ export class ScrapeStore {
if (!names.has("download_error")) this.db.exec("ALTER TABLE media ADD COLUMN download_error TEXT");
if (!names.has("preview_error")) this.db.exec("ALTER TABLE media ADD COLUMN preview_error TEXT");
if (!names.has("preview_ext")) this.db.exec("ALTER TABLE media ADD COLUMN preview_ext TEXT");
if (!names.has("anim_hash")) this.db.exec("ALTER TABLE media ADD COLUMN anim_hash TEXT");
if (!names.has("play_url")) this.db.exec("ALTER TABLE media ADD COLUMN play_url TEXT");
if (!names.has("aspect_ratio")) this.db.exec("ALTER TABLE media ADD COLUMN aspect_ratio REAL");
}
@@ -355,7 +358,16 @@ export class ScrapeStore {
.all(limit) as unknown as MediaRow[];
}
markPreview(id: number, preview: { hash: string; bytes: number; ext?: string }): void {
markPreview(id: number, preview: { hash: string; bytes: number; ext?: string; animHash?: string }): void {
if (preview.animHash) {
this.db
.prepare(
"UPDATE media SET preview_hash = ?, preview_bytes = ?, preview_ext = ?, anim_hash = ?, preview_error = NULL WHERE id = ?"
)
.run(preview.hash, preview.bytes, preview.ext ?? "webp", preview.animHash, id);
return;
}
this.db
.prepare(
"UPDATE media SET preview_hash = ?, preview_bytes = ?, preview_ext = ?, preview_error = NULL WHERE id = ?"
@@ -385,6 +397,31 @@ export class ScrapeStore {
this.db.prepare(`UPDATE media SET ${sets.join(", ")} WHERE id = ?`).run(...values, id);
}
/** Rows whose preview failed, with the reason, newest first. */
previewFailures(
limit = 50
): Array<{ id: number; kind: MediaKind; provider: string | null; url: string; error: string }> {
const rows = this.db
.prepare(
"SELECT id, kind, provider, url, preview_error FROM media WHERE preview_error IS NOT NULL ORDER BY id DESC LIMIT ?"
)
.all(limit) as unknown as Array<{
id: number;
kind: MediaKind;
provider: string | null;
url: string;
preview_error: string;
}>;
return rows.map(row => ({
id: row.id,
kind: row.kind,
provider: row.provider,
url: row.url,
error: row.preview_error
}));
}
/** The message a media row came from, for URL refreshes. */
sourceMessageId(mediaId: number): string | null {
const row = this.db