mirror of
https://github.com/amtoaer/bili-sync.git
synced 2026-07-12 16:11:32 +08:00
feat: 拷贝一份 poster 作为 fanart 使用 (#84)
* feat: 拷贝一份 poster 作为 fanart 使用 * feat: 添加对于现有视频的迁移脚本
This commit is contained in:
37
scripts/2.0.3_add_fanart.py
Normal file
37
scripts/2.0.3_add_fanart.py
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
"""
|
||||||
|
2.0.2 -> 2.0.3 时添加了将 poster 拷贝为 fanart 的行为
|
||||||
|
该行为对已存在的视频不会生效,所以可以手动执行该脚本
|
||||||
|
具体来说,该脚本会:
|
||||||
|
1. 遍历命令行参数中所有存在的路径
|
||||||
|
2. 找到路径中所有以 poster.jpg 结尾的文件
|
||||||
|
3. 将 poster.jpg 替换为 fanart.jpg,拷贝到同一目录
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import shutil
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) <= 1:
|
||||||
|
print("用法: python 2.0.3_add_fanart.py <path1> <path2> ...")
|
||||||
|
exit(1)
|
||||||
|
paths = [Path(path) for path in sys.argv[1:]]
|
||||||
|
for path in paths:
|
||||||
|
if not path.exists():
|
||||||
|
print(f"路径 {path} 不存在,跳过..")
|
||||||
|
continue
|
||||||
|
for root, _, files in os.walk(path):
|
||||||
|
for file in files:
|
||||||
|
if file.endswith("poster.jpg"):
|
||||||
|
poster_path = Path(root) / file
|
||||||
|
print(f"已找到 poster: {poster_path}")
|
||||||
|
fanart_path = Path(root) / file.replace("poster.jpg", "fanart.jpg")
|
||||||
|
shutil.copyfile(poster_path, fanart_path)
|
||||||
|
print(f"已将 {poster_path} 拷贝至 {fanart_path}")
|
||||||
|
print("操作完成")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -241,6 +241,7 @@ pub async fn download_video_pages(
|
|||||||
&video_model,
|
&video_model,
|
||||||
downloader,
|
downloader,
|
||||||
base_path.join("poster.jpg"),
|
base_path.join("poster.jpg"),
|
||||||
|
base_path.join("fanart.jpg"),
|
||||||
)),
|
)),
|
||||||
// 生成视频信息的 nfo
|
// 生成视频信息的 nfo
|
||||||
Box::pin(generate_video_nfo(
|
Box::pin(generate_video_nfo(
|
||||||
@@ -390,12 +391,13 @@ pub async fn download_page(
|
|||||||
"pid": page_model.pid,
|
"pid": page_model.pid,
|
||||||
}),
|
}),
|
||||||
)?);
|
)?);
|
||||||
let (poster_path, video_path, nfo_path, danmaku_path) = if is_single_page {
|
let (poster_path, video_path, nfo_path, danmaku_path, fanart_path) = if is_single_page {
|
||||||
(
|
(
|
||||||
base_path.join(format!("{}-poster.jpg", &base_name)),
|
base_path.join(format!("{}-poster.jpg", &base_name)),
|
||||||
base_path.join(format!("{}.mp4", &base_name)),
|
base_path.join(format!("{}.mp4", &base_name)),
|
||||||
base_path.join(format!("{}.nfo", &base_name)),
|
base_path.join(format!("{}.nfo", &base_name)),
|
||||||
base_path.join(format!("{}.zh-CN.default.ass", &base_name)),
|
base_path.join(format!("{}.zh-CN.default.ass", &base_name)),
|
||||||
|
Some(base_path.join(format!("{}-fanart.jpg", &base_name))),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
(
|
(
|
||||||
@@ -411,6 +413,8 @@ pub async fn download_page(
|
|||||||
base_path
|
base_path
|
||||||
.join("Season 1")
|
.join("Season 1")
|
||||||
.join(format!("{} - S01E{:0>2}.zh-CN.default.ass", &base_name, page_model.pid)),
|
.join(format!("{} - S01E{:0>2}.zh-CN.default.ass", &base_name, page_model.pid)),
|
||||||
|
// 对于多页视频,会在上一步 fetch_video_poster 中获取剧集的 fanart,无需在此处下载单集的
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
let dimension = if page_model.width.is_some() && page_model.height.is_some() {
|
let dimension = if page_model.width.is_some() && page_model.height.is_some() {
|
||||||
@@ -435,6 +439,7 @@ pub async fn download_page(
|
|||||||
&page_model,
|
&page_model,
|
||||||
downloader,
|
downloader,
|
||||||
poster_path,
|
poster_path,
|
||||||
|
fanart_path,
|
||||||
)),
|
)),
|
||||||
Box::pin(fetch_page_video(
|
Box::pin(fetch_page_video(
|
||||||
seprate_status[1],
|
seprate_status[1],
|
||||||
@@ -487,6 +492,7 @@ pub async fn fetch_page_poster(
|
|||||||
page_model: &page::Model,
|
page_model: &page::Model,
|
||||||
downloader: &Downloader,
|
downloader: &Downloader,
|
||||||
poster_path: PathBuf,
|
poster_path: PathBuf,
|
||||||
|
fanart_path: Option<PathBuf>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
if !should_run {
|
if !should_run {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -502,7 +508,11 @@ pub async fn fetch_page_poster(
|
|||||||
None => video_model.cover.as_str(),
|
None => video_model.cover.as_str(),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
downloader.fetch(url, &poster_path).await
|
downloader.fetch(url, &poster_path).await?;
|
||||||
|
if let Some(fanart_path) = fanart_path {
|
||||||
|
fs::copy(&poster_path, &fanart_path).await?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn fetch_page_video(
|
pub async fn fetch_page_video(
|
||||||
@@ -589,11 +599,14 @@ pub async fn fetch_video_poster(
|
|||||||
video_model: &video::Model,
|
video_model: &video::Model,
|
||||||
downloader: &Downloader,
|
downloader: &Downloader,
|
||||||
poster_path: PathBuf,
|
poster_path: PathBuf,
|
||||||
|
fanart_path: PathBuf,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
if !should_run {
|
if !should_run {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
downloader.fetch(&video_model.cover, &poster_path).await
|
downloader.fetch(&video_model.cover, &poster_path).await?;
|
||||||
|
fs::copy(&poster_path, &fanart_path).await?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn fetch_upper_face(
|
pub async fn fetch_upper_face(
|
||||||
|
|||||||
Reference in New Issue
Block a user