diff --git a/crates/bili_sync/build.rs b/crates/bili_sync/build.rs index d8f91cb..315a577 100644 --- a/crates/bili_sync/build.rs +++ b/crates/bili_sync/build.rs @@ -1,3 +1,4 @@ fn main() { + println!("cargo:rerun-if-changed=../../web/build"); built::write_built_file().expect("Failed to acquire build-time information"); } diff --git a/web/src/routes/video-sources/+page.svelte b/web/src/routes/video-sources/+page.svelte index 1fc389b..d426b99 100644 --- a/web/src/routes/video-sources/+page.svelte +++ b/web/src/routes/video-sources/+page.svelte @@ -71,6 +71,8 @@ let favoriteForm = { fid: '' }; let collectionForm = { sid: '', mid: '', collection_type: '2' }; // 默认为合集 let submissionForm = { upper_id: '' }; + let importingSubmissions = false; + let submissionImportInput: HTMLInputElement | null = null; let selectedIds: Record = { favorites: [], collections: [], @@ -383,6 +385,53 @@ } } + function parseUidLines(content: string): number[] { + return [...new Set(content.split(/\r?\n/).map((line) => line.trim()).filter((line) => /^\d+$/.test(line)))].map( + (uid) => parseInt(uid) + ); + } + + async function handleImportSubmissionUids(file: File | null) { + if (!file) return; + importingSubmissions = true; + try { + const content = await file.text(); + const uids = parseUidLines(content); + if (uids.length === 0) { + toast.error('未在文件中识别到有效 UID'); + return; + } + let success = 0; + let failed = 0; + for (const uid of uids) { + try { + await api.insertSubmission({ upper_id: uid }); + success += 1; + } catch { + failed += 1; + } + } + if (failed > 0) { + toast.warning('UID 文件导入完成(部分失败)', { + description: `成功 ${success} 条,失败 ${failed} 条` + }); + } else { + toast.success(`UID 文件导入成功,共 ${success} 条`); + } + loadVideoSources(); + } catch (error) { + toast.error('导入 UID 文件失败', { + description: (error as ApiError).message + }); + } finally { + importingSubmissions = false; + } + } + + function openSubmissionUidImport() { + submissionImportInput?.click(); + } + // 初始化 onMount(() => { setBreadcrumb([{ label: '视频源' }]); @@ -451,10 +500,34 @@ {/if} {#if key === 'favorites' || key === 'collections' || key === 'submissions'} - +
+ {#if key === 'submissions'} + { + const file = (event.currentTarget as HTMLInputElement).files?.[0] ?? null; + handleImportSubmissionUids(file); + (event.currentTarget as HTMLInputElement).value = ''; + }} + /> + + {/if} + +
{/if} {#if sources.length > 0} @@ -620,10 +693,21 @@ {/if}

{#if key === 'favorites' || key === 'collections' || key === 'submissions'} - +
+ {#if key === 'submissions'} + + {/if} + +
{/if} {/if} @@ -839,6 +923,24 @@ class="mt-1" /> +
+ + { + const file = (event.currentTarget as HTMLInputElement).files?.[0] ?? null; + handleImportSubmissionUids(file); + (event.currentTarget as HTMLInputElement).value = ''; + }} + /> +

+ 每行一个 UID,例如:2122895527 +

+
{/if}