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}