mirror of
https://github.com/lanyeeee/bilibili-video-downloader.git
synced 2026-09-09 01:27:27 +08:00
fix: 修复目录命名的episode_title字段映射错误的问题
This commit is contained in:
@@ -327,6 +327,7 @@ pub mod v1 {
|
|||||||
pub part_title: Option<String>,
|
pub part_title: Option<String>,
|
||||||
pub part_order: Option<i64>,
|
pub part_order: Option<i64>,
|
||||||
pub episode_title: String,
|
pub episode_title: String,
|
||||||
|
pub episode_title_in_collection: Option<String>,
|
||||||
pub episode_order: i64,
|
pub episode_order: i64,
|
||||||
pub up_name: Option<String>,
|
pub up_name: Option<String>,
|
||||||
pub up_uid: Option<i64>,
|
pub up_uid: Option<i64>,
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ use crate::{
|
|||||||
bangumi_info::BangumiInfo,
|
bangumi_info::BangumiInfo,
|
||||||
cheese_info::CheeseInfo,
|
cheese_info::CheeseInfo,
|
||||||
codec_type::CodecType,
|
codec_type::CodecType,
|
||||||
|
get_normal_info_params::GetNormalInfoParams,
|
||||||
normal_info::{NormalInfo, UgcSeason},
|
normal_info::{NormalInfo, UgcSeason},
|
||||||
video_quality::VideoQuality,
|
video_quality::VideoQuality,
|
||||||
},
|
},
|
||||||
@@ -54,6 +55,7 @@ pub struct DownloadProgress {
|
|||||||
pub part_title: Option<String>,
|
pub part_title: Option<String>,
|
||||||
pub part_order: Option<i64>,
|
pub part_order: Option<i64>,
|
||||||
pub episode_title: String,
|
pub episode_title: String,
|
||||||
|
pub episode_title_in_collection: Option<String>,
|
||||||
pub episode_order: i64,
|
pub episode_order: i64,
|
||||||
pub up_name: Option<String>,
|
pub up_name: Option<String>,
|
||||||
pub up_uid: Option<i64>,
|
pub up_uid: Option<i64>,
|
||||||
@@ -129,6 +131,7 @@ impl DownloadProgress {
|
|||||||
part_title: None,
|
part_title: None,
|
||||||
part_order: None,
|
part_order: None,
|
||||||
episode_title: episode.show_title.clone().unwrap_or(episode.title.clone()),
|
episode_title: episode.show_title.clone().unwrap_or(episode.title.clone()),
|
||||||
|
episode_title_in_collection: None,
|
||||||
episode_order,
|
episode_order,
|
||||||
up_name,
|
up_name,
|
||||||
up_uid,
|
up_uid,
|
||||||
@@ -179,6 +182,7 @@ impl DownloadProgress {
|
|||||||
part_title: None,
|
part_title: None,
|
||||||
part_order: None,
|
part_order: None,
|
||||||
episode_title: episode.title.clone(),
|
episode_title: episode.title.clone(),
|
||||||
|
episode_title_in_collection: None,
|
||||||
episode_order: episode.index,
|
episode_order: episode.index,
|
||||||
up_name: Some(info.up_info.uname.clone()),
|
up_name: Some(info.up_info.uname.clone()),
|
||||||
up_uid: Some(info.up_info.mid),
|
up_uid: Some(info.up_info.mid),
|
||||||
@@ -338,6 +342,18 @@ impl DownloadProgress {
|
|||||||
let audio_selected = self.audio_task.selected;
|
let audio_selected = self.audio_task.selected;
|
||||||
let audio_completed = self.audio_task.completed;
|
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) {
|
if (!video_selected && !audio_selected) || (video_completed && audio_completed) {
|
||||||
// 如果视频和音频都没有选中,或者都已经完成,则更新需要格式化的字段就返回
|
// 如果视频和音频都没有选中,或者都已经完成,则更新需要格式化的字段就返回
|
||||||
self.update_fmt_fields(app)
|
self.update_fmt_fields(app)
|
||||||
@@ -352,6 +368,7 @@ impl DownloadProgress {
|
|||||||
let Some(bvid) = &self.bvid else {
|
let Some(bvid) = &self.bvid else {
|
||||||
return Err(eyre!("progress中的bvid为None,无法获取视频链接"));
|
return Err(eyre!("progress中的bvid为None,无法获取视频链接"));
|
||||||
};
|
};
|
||||||
|
|
||||||
let media_url = bili_client
|
let media_url = bili_client
|
||||||
.get_normal_url(bvid, self.cid)
|
.get_normal_url(bvid, self.cid)
|
||||||
.await
|
.await
|
||||||
@@ -442,6 +459,7 @@ impl DownloadProgress {
|
|||||||
pub_ts: self.pub_ts,
|
pub_ts: self.pub_ts,
|
||||||
collection_title: self.collection_title.clone(),
|
collection_title: self.collection_title.clone(),
|
||||||
episode_title: self.episode_title.clone(),
|
episode_title: self.episode_title.clone(),
|
||||||
|
episode_title_in_collection: self.episode_title_in_collection.clone(),
|
||||||
episode_order: self.episode_order,
|
episode_order: self.episode_order,
|
||||||
part_title: self.part_title.clone(),
|
part_title: self.part_title.clone(),
|
||||||
part_order: self.part_order,
|
part_order: self.part_order,
|
||||||
@@ -526,6 +544,7 @@ fn create_normal_progresses_for_single(
|
|||||||
part_title: Some(page.part.clone()),
|
part_title: Some(page.part.clone()),
|
||||||
part_order: Some(page.page),
|
part_order: Some(page.page),
|
||||||
episode_title: info.title.clone(),
|
episode_title: info.title.clone(),
|
||||||
|
episode_title_in_collection: None,
|
||||||
episode_order: 1,
|
episode_order: 1,
|
||||||
up_name: Some(info.owner.name.clone()),
|
up_name: Some(info.owner.name.clone()),
|
||||||
up_uid: Some(info.owner.mid),
|
up_uid: Some(info.owner.mid),
|
||||||
@@ -564,6 +583,7 @@ fn create_normal_progresses_for_single(
|
|||||||
part_title: None,
|
part_title: None,
|
||||||
part_order: None,
|
part_order: None,
|
||||||
episode_title: info.title.clone(),
|
episode_title: info.title.clone(),
|
||||||
|
episode_title_in_collection: None,
|
||||||
episode_order: 1,
|
episode_order: 1,
|
||||||
up_name: Some(info.owner.name.clone()),
|
up_name: Some(info.owner.name.clone()),
|
||||||
up_uid: Some(info.owner.mid),
|
up_uid: Some(info.owner.mid),
|
||||||
@@ -602,6 +622,7 @@ fn create_normal_progresses_for_single(
|
|||||||
part_title: Some(page.part.clone()),
|
part_title: Some(page.part.clone()),
|
||||||
part_order: Some(page.page),
|
part_order: Some(page.page),
|
||||||
episode_title: info.title.clone(),
|
episode_title: info.title.clone(),
|
||||||
|
episode_title_in_collection: None,
|
||||||
episode_order: 1,
|
episode_order: 1,
|
||||||
up_name: Some(info.owner.name.clone()),
|
up_name: Some(info.owner.name.clone()),
|
||||||
up_uid: Some(info.owner.mid),
|
up_uid: Some(info.owner.mid),
|
||||||
@@ -653,6 +674,10 @@ fn create_normal_progresses_for_season(
|
|||||||
|
|
||||||
let tasks = Tasks::new(config, &ep.arc.pic);
|
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();
|
let create_ts = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs();
|
||||||
|
|
||||||
if let Some(cid) = cid {
|
if let Some(cid) = cid {
|
||||||
@@ -672,7 +697,8 @@ fn create_normal_progresses_for_season(
|
|||||||
collection_title: ugc_season.title.clone(),
|
collection_title: ugc_season.title.clone(),
|
||||||
part_title: Some(page.part.clone()),
|
part_title: Some(page.part.clone()),
|
||||||
part_order: Some(page.page),
|
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,
|
episode_order,
|
||||||
up_name: Some(info.owner.name.clone()),
|
up_name: Some(info.owner.name.clone()),
|
||||||
up_uid: Some(info.owner.mid),
|
up_uid: Some(info.owner.mid),
|
||||||
@@ -710,7 +736,8 @@ fn create_normal_progresses_for_season(
|
|||||||
collection_title: ugc_season.title.clone(),
|
collection_title: ugc_season.title.clone(),
|
||||||
part_title: None,
|
part_title: None,
|
||||||
part_order: 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,
|
episode_order,
|
||||||
up_name: Some(info.owner.name.clone()),
|
up_name: Some(info.owner.name.clone()),
|
||||||
up_uid: Some(info.owner.mid),
|
up_uid: Some(info.owner.mid),
|
||||||
@@ -749,7 +776,8 @@ fn create_normal_progresses_for_season(
|
|||||||
collection_title: ugc_season.title.clone(),
|
collection_title: ugc_season.title.clone(),
|
||||||
part_title: Some(page.part.clone()),
|
part_title: Some(page.part.clone()),
|
||||||
part_order: Some(page.page),
|
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,
|
episode_order,
|
||||||
up_name: Some(info.owner.name.clone()),
|
up_name: Some(info.owner.name.clone()),
|
||||||
up_uid: Some(info.owner.mid),
|
up_uid: Some(info.owner.mid),
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ impl DownloadTask {
|
|||||||
ep_id = progress.ep_id,
|
ep_id = progress.ep_id,
|
||||||
collection_title = progress.collection_title,
|
collection_title = progress.collection_title,
|
||||||
episode_title = progress.episode_title,
|
episode_title = progress.episode_title,
|
||||||
|
episode_title_in_collection = progress.episode_title_in_collection,
|
||||||
episode_order = progress.episode_order,
|
episode_order = progress.episode_order,
|
||||||
part_title = progress.part_title,
|
part_title = progress.part_title,
|
||||||
part_order = progress.part_order,
|
part_order = progress.part_order,
|
||||||
@@ -278,6 +279,7 @@ impl DownloadTask {
|
|||||||
ep_id = self.trace_fields.ep_id,
|
ep_id = self.trace_fields.ep_id,
|
||||||
collection_title = self.trace_fields.collection_title,
|
collection_title = self.trace_fields.collection_title,
|
||||||
episode_title = self.trace_fields.episode_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,
|
episode_order = self.trace_fields.episode_order,
|
||||||
part_title = self.trace_fields.part_title,
|
part_title = self.trace_fields.part_title,
|
||||||
part_order = self.trace_fields.part_order,
|
part_order = self.trace_fields.part_order,
|
||||||
@@ -484,6 +486,7 @@ impl DownloadTask {
|
|||||||
ep_id = self.trace_fields.ep_id,
|
ep_id = self.trace_fields.ep_id,
|
||||||
collection_title = self.trace_fields.collection_title,
|
collection_title = self.trace_fields.collection_title,
|
||||||
episode_title = self.trace_fields.episode_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,
|
episode_order = self.trace_fields.episode_order,
|
||||||
part_title = self.trace_fields.part_title,
|
part_title = self.trace_fields.part_title,
|
||||||
part_order = self.trace_fields.part_order,
|
part_order = self.trace_fields.part_order,
|
||||||
@@ -546,6 +549,7 @@ pub struct DownloadTaskTraceFields {
|
|||||||
pub ep_id: Option<i64>,
|
pub ep_id: Option<i64>,
|
||||||
pub collection_title: String,
|
pub collection_title: String,
|
||||||
pub episode_title: String,
|
pub episode_title: String,
|
||||||
|
pub episode_title_in_collection: Option<String>,
|
||||||
pub episode_order: i64,
|
pub episode_order: i64,
|
||||||
pub part_title: Option<String>,
|
pub part_title: Option<String>,
|
||||||
pub part_order: Option<i64>,
|
pub part_order: Option<i64>,
|
||||||
@@ -564,6 +568,7 @@ impl From<&DownloadProgress> for DownloadTaskTraceFields {
|
|||||||
ep_id: progress.ep_id,
|
ep_id: progress.ep_id,
|
||||||
collection_title: progress.collection_title.clone(),
|
collection_title: progress.collection_title.clone(),
|
||||||
episode_title: progress.episode_title.clone(),
|
episode_title: progress.episode_title.clone(),
|
||||||
|
episode_title_in_collection: progress.episode_title_in_collection.clone(),
|
||||||
episode_order: progress.episode_order,
|
episode_order: progress.episode_order,
|
||||||
part_title: progress.part_title.clone(),
|
part_title: progress.part_title.clone(),
|
||||||
part_order: progress.part_order,
|
part_order: progress.part_order,
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ pub struct FmtParams {
|
|||||||
pub pub_ts: i64,
|
pub pub_ts: i64,
|
||||||
pub collection_title: String,
|
pub collection_title: String,
|
||||||
pub episode_title: String,
|
pub episode_title: String,
|
||||||
|
pub episode_title_in_collection: Option<String>,
|
||||||
pub episode_order: i64,
|
pub episode_order: i64,
|
||||||
pub part_title: Option<String>,
|
pub part_title: Option<String>,
|
||||||
pub part_order: Option<i64>,
|
pub part_order: Option<i64>,
|
||||||
|
|||||||
+1
-1
@@ -329,7 +329,7 @@ export type Dimension = { width: number; height: number; rotate: number }
|
|||||||
export type DimensionInBangumi = { height: number; rotate: number; width: number }
|
export type DimensionInBangumi = { height: number; rotate: number; width: number }
|
||||||
export type DimensionInWatchLater = { width: number; height: number; rotate: 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 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 DownloadTaskState = "Pending" | "Downloading" | "Paused" | "Completed" | "Failed"
|
||||||
export type Ed = { end: number; start: number }
|
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 }
|
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 }
|
||||||
|
|||||||
@@ -56,13 +56,17 @@ function AvailableFmtFields() {
|
|||||||
<div>
|
<div>
|
||||||
<span class="rounded bg-gray-500 px-1 select-all">collection_title</span>
|
<span class="rounded bg-gray-500 px-1 select-all">collection_title</span>
|
||||||
<span class="ml-2">
|
<span class="ml-2">
|
||||||
合集名称,
|
合集标题,
|
||||||
<span class="text-blue">对于单独(没有合集)的视频,合集名称就是视频名称</span>
|
<span class="text-blue">对于单独(没有合集)的视频,合集标题就是视频标题</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span class="rounded bg-gray-500 px-1 select-all">episode_title</span>
|
<span class="rounded bg-gray-500 px-1 select-all">episode_title</span>
|
||||||
<span class="ml-2">视频名称</span>
|
<span class="ml-2">视频标题</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="rounded bg-gray-500 px-1 select-all">episode_title_in_collection</span>
|
||||||
|
<span class="ml-2">视频在合集内的标题</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span class="rounded bg-gray-500 px-1 select-all">episode_order</span>
|
<span class="rounded bg-gray-500 px-1 select-all">episode_order</span>
|
||||||
@@ -83,7 +87,7 @@ function AvailableFmtFields() {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span class="rounded bg-gray-500 px-1 select-all">part_title</span>
|
<span class="rounded bg-gray-500 px-1 select-all">part_title</span>
|
||||||
<span class="ml-2">分P名称</span>
|
<span class="ml-2">分P标题</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span class="rounded bg-gray-500 px-1 select-all">part_order</span>
|
<span class="rounded bg-gray-500 px-1 select-all">part_order</span>
|
||||||
|
|||||||
Reference in New Issue
Block a user