diff --git a/src-plugin/plugin-api/src/lib.rs b/src-plugin/plugin-api/src/lib.rs index c1d58b2..664b1bf 100644 --- a/src-plugin/plugin-api/src/lib.rs +++ b/src-plugin/plugin-api/src/lib.rs @@ -327,6 +327,7 @@ pub mod v1 { pub part_title: Option, pub part_order: Option, pub episode_title: String, + pub episode_title_in_collection: Option, pub episode_order: i64, pub up_name: Option, pub up_uid: Option, diff --git a/src-tauri/src/downloader/download_progress.rs b/src-tauri/src/downloader/download_progress.rs index 4cc7c3c..f8d873a 100644 --- a/src-tauri/src/downloader/download_progress.rs +++ b/src-tauri/src/downloader/download_progress.rs @@ -32,6 +32,7 @@ use crate::{ bangumi_info::BangumiInfo, cheese_info::CheeseInfo, codec_type::CodecType, + get_normal_info_params::GetNormalInfoParams, normal_info::{NormalInfo, UgcSeason}, video_quality::VideoQuality, }, @@ -54,6 +55,7 @@ pub struct DownloadProgress { pub part_title: Option, pub part_order: Option, pub episode_title: String, + pub episode_title_in_collection: Option, pub episode_order: i64, pub up_name: Option, pub up_uid: Option, @@ -129,6 +131,7 @@ impl DownloadProgress { part_title: None, part_order: None, episode_title: episode.show_title.clone().unwrap_or(episode.title.clone()), + episode_title_in_collection: None, episode_order, up_name, up_uid, @@ -179,6 +182,7 @@ impl DownloadProgress { part_title: None, part_order: None, episode_title: episode.title.clone(), + episode_title_in_collection: None, episode_order: episode.index, up_name: Some(info.up_info.uname.clone()), up_uid: Some(info.up_info.mid), @@ -338,6 +342,18 @@ impl DownloadProgress { let audio_selected = self.audio_task.selected; let audio_completed = self.audio_task.completed; + // 通过合集批量创建的任务时,合集接口只提供视频在合集内的标题 + // 所以在创建任务阶段,episode_title暂时用它占位 + // 在真正开始下载前,需要重新获取视频的真实标题 + if self.episode_type == EpisodeType::Normal && self.episode_title_in_collection.is_some() { + let bili_client = app.get_bili_client(); + let info = bili_client + .get_normal_info(GetNormalInfoParams::Aid(self.aid)) + .await + .wrap_err("获取视频信息失败")?; + self.episode_title = info.title; + } + if (!video_selected && !audio_selected) || (video_completed && audio_completed) { // 如果视频和音频都没有选中,或者都已经完成,则更新需要格式化的字段就返回 self.update_fmt_fields(app) @@ -352,6 +368,7 @@ impl DownloadProgress { let Some(bvid) = &self.bvid else { return Err(eyre!("progress中的bvid为None,无法获取视频链接")); }; + let media_url = bili_client .get_normal_url(bvid, self.cid) .await @@ -442,6 +459,7 @@ impl DownloadProgress { pub_ts: self.pub_ts, collection_title: self.collection_title.clone(), episode_title: self.episode_title.clone(), + episode_title_in_collection: self.episode_title_in_collection.clone(), episode_order: self.episode_order, part_title: self.part_title.clone(), part_order: self.part_order, @@ -526,6 +544,7 @@ fn create_normal_progresses_for_single( part_title: Some(page.part.clone()), part_order: Some(page.page), episode_title: info.title.clone(), + episode_title_in_collection: None, episode_order: 1, up_name: Some(info.owner.name.clone()), up_uid: Some(info.owner.mid), @@ -564,6 +583,7 @@ fn create_normal_progresses_for_single( part_title: None, part_order: None, episode_title: info.title.clone(), + episode_title_in_collection: None, episode_order: 1, up_name: Some(info.owner.name.clone()), up_uid: Some(info.owner.mid), @@ -602,6 +622,7 @@ fn create_normal_progresses_for_single( part_title: Some(page.part.clone()), part_order: Some(page.page), episode_title: info.title.clone(), + episode_title_in_collection: None, episode_order: 1, up_name: Some(info.owner.name.clone()), up_uid: Some(info.owner.mid), @@ -653,6 +674,10 @@ fn create_normal_progresses_for_season( let tasks = Tasks::new(config, &ep.arc.pic); + // 合集接口返回的只有在合集内的标题,视频标题先用它占位,到prepare时再按aid获取真实标题 + let episode_title = ep.title.clone(); + let episode_title_in_collection = Some(ep.title.clone()); + let create_ts = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); if let Some(cid) = cid { @@ -672,7 +697,8 @@ fn create_normal_progresses_for_season( collection_title: ugc_season.title.clone(), part_title: Some(page.part.clone()), part_order: Some(page.page), - episode_title: ep.title.clone(), + episode_title: episode_title.clone(), + episode_title_in_collection: episode_title_in_collection.clone(), episode_order, up_name: Some(info.owner.name.clone()), up_uid: Some(info.owner.mid), @@ -710,7 +736,8 @@ fn create_normal_progresses_for_season( collection_title: ugc_season.title.clone(), part_title: None, part_order: None, - episode_title: ep.title.clone(), + episode_title: episode_title.clone(), + episode_title_in_collection: episode_title_in_collection.clone(), episode_order, up_name: Some(info.owner.name.clone()), up_uid: Some(info.owner.mid), @@ -749,7 +776,8 @@ fn create_normal_progresses_for_season( collection_title: ugc_season.title.clone(), part_title: Some(page.part.clone()), part_order: Some(page.page), - episode_title: ep.title.clone(), + episode_title: episode_title.clone(), + episode_title_in_collection: episode_title_in_collection.clone(), episode_order, up_name: Some(info.owner.name.clone()), up_uid: Some(info.owner.mid), diff --git a/src-tauri/src/downloader/download_task.rs b/src-tauri/src/downloader/download_task.rs index 35f62a6..f6227c2 100644 --- a/src-tauri/src/downloader/download_task.rs +++ b/src-tauri/src/downloader/download_task.rs @@ -130,6 +130,7 @@ impl DownloadTask { ep_id = progress.ep_id, collection_title = progress.collection_title, episode_title = progress.episode_title, + episode_title_in_collection = progress.episode_title_in_collection, episode_order = progress.episode_order, part_title = progress.part_title, part_order = progress.part_order, @@ -278,6 +279,7 @@ impl DownloadTask { ep_id = self.trace_fields.ep_id, collection_title = self.trace_fields.collection_title, episode_title = self.trace_fields.episode_title, + episode_title_in_collection = self.trace_fields.episode_title_in_collection, episode_order = self.trace_fields.episode_order, part_title = self.trace_fields.part_title, part_order = self.trace_fields.part_order, @@ -484,6 +486,7 @@ impl DownloadTask { ep_id = self.trace_fields.ep_id, collection_title = self.trace_fields.collection_title, episode_title = self.trace_fields.episode_title, + episode_title_in_collection = self.trace_fields.episode_title_in_collection, episode_order = self.trace_fields.episode_order, part_title = self.trace_fields.part_title, part_order = self.trace_fields.part_order, @@ -546,6 +549,7 @@ pub struct DownloadTaskTraceFields { pub ep_id: Option, pub collection_title: String, pub episode_title: String, + pub episode_title_in_collection: Option, pub episode_order: i64, pub part_title: Option, pub part_order: Option, @@ -564,6 +568,7 @@ impl From<&DownloadProgress> for DownloadTaskTraceFields { ep_id: progress.ep_id, collection_title: progress.collection_title.clone(), episode_title: progress.episode_title.clone(), + episode_title_in_collection: progress.episode_title_in_collection.clone(), episode_order: progress.episode_order, part_title: progress.part_title.clone(), part_order: progress.part_order, diff --git a/src-tauri/src/downloader/fmt_params.rs b/src-tauri/src/downloader/fmt_params.rs index 71e3a1d..ba3a6b8 100644 --- a/src-tauri/src/downloader/fmt_params.rs +++ b/src-tauri/src/downloader/fmt_params.rs @@ -25,6 +25,7 @@ pub struct FmtParams { pub pub_ts: i64, pub collection_title: String, pub episode_title: String, + pub episode_title_in_collection: Option, pub episode_order: i64, pub part_title: Option, pub part_order: Option, diff --git a/src/bindings.ts b/src/bindings.ts index db138ef..a57b762 100644 --- a/src/bindings.ts +++ b/src/bindings.ts @@ -329,7 +329,7 @@ export type Dimension = { width: number; height: number; rotate: number } export type DimensionInBangumi = { height: number; rotate: number; width: number } export type DimensionInWatchLater = { width: number; height: number; rotate: number } export type DownloadEvent = { event: "Speed"; data: { speed: string } } | { event: "TaskCreate"; data: { state: DownloadTaskState; progress: DownloadProgress } } | { event: "TaskStateUpdate"; data: { task_id: string; state: DownloadTaskState } } | { event: "TaskSleeping"; data: { task_id: string; remaining_sec: number } } | { event: "TaskDelete"; data: { task_id: string } } | { event: "ProgressPreparing"; data: { task_id: string } } | { event: "ProgressUpdate"; data: { progress: DownloadProgress } } -export type DownloadProgress = { task_id: string; episode_type: EpisodeType; aid: number; bvid: string | null; cid: number; ep_id: number | null; duration: number; pub_ts: number; collection_title: string; part_title: string | null; part_order: number | null; episode_title: string; episode_order: number; up_name: string | null; up_uid: number | null; up_avatar: string | null; episode_dir: string; filename: string; video_task: VideoTask; audio_task: AudioTask; video_process_task: VideoProcessTask; subtitle_task: SubtitleTask; danmaku_task: DanmakuTask; cover_task: CoverTask; nfo_task: NfoTask; json_task: JsonTask; create_ts: number; completed_ts: number | null; is_drm: boolean; is_preview: boolean } +export type DownloadProgress = { task_id: string; episode_type: EpisodeType; aid: number; bvid: string | null; cid: number; ep_id: number | null; duration: number; pub_ts: number; collection_title: string; part_title: string | null; part_order: number | null; episode_title: string; episode_title_in_collection: string | null; episode_order: number; up_name: string | null; up_uid: number | null; up_avatar: string | null; episode_dir: string; filename: string; video_task: VideoTask; audio_task: AudioTask; video_process_task: VideoProcessTask; subtitle_task: SubtitleTask; danmaku_task: DanmakuTask; cover_task: CoverTask; nfo_task: NfoTask; json_task: JsonTask; create_ts: number; completed_ts: number | null; is_drm: boolean; is_preview: boolean } export type DownloadTaskState = "Pending" | "Downloading" | "Paused" | "Completed" | "Failed" export type Ed = { end: number; start: number } export type EpInBangumi = { aid: number; badge: string; badge_info: BadgeInfoInBangumi; badge_type: number | null; bvid: string | null; cid: number; cover: string; dimension: DimensionInBangumi | null; duration: number | null; enable_vt: boolean; ep_id: number; from: string | null; id: number; is_view_hide: boolean; link: string; link_type: string | null; long_title: string | null; pub_time: number; pv: number; release_date: string | null; rights: RightsInBangumiEp | null; section_type: number; share_copy: string | null; share_url: string | null; short_link: string | null; showDrmLoginDialog: boolean; show_title: string | null; skip: Skip | null; status: number; subtitle: string | null; title: string; vid: string | null; icon_font: IconFont | null } diff --git a/src/dialogs/SettingsDialog/components/FmtSettings.vue b/src/dialogs/SettingsDialog/components/FmtSettings.vue index 60c803a..58c786f 100644 --- a/src/dialogs/SettingsDialog/components/FmtSettings.vue +++ b/src/dialogs/SettingsDialog/components/FmtSettings.vue @@ -56,13 +56,17 @@ function AvailableFmtFields() {
collection_title - 合集名称, - 对于单独(没有合集)的视频,合集名称就是视频名称 + 合集标题, + 对于单独(没有合集)的视频,合集标题就是视频标题
episode_title - 视频名称 + 视频标题 +
+
+ episode_title_in_collection + 视频在合集内的标题
episode_order @@ -83,7 +87,7 @@ function AvailableFmtFields() {
part_title - 分P名称 + 分P标题
part_order