Skip to content

Commit

Permalink
feat:allow customization on generated fanart,nfo and cover's name
Browse files Browse the repository at this point in the history
  • Loading branch information
glyh committed Sep 26, 2024
1 parent d964c98 commit d103767
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 84 deletions.
65 changes: 37 additions & 28 deletions config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ summarizer:

# NFO文件生成相关的选项
nfo:
# nfo文件的名称
basename_pattern: "movie"
# nfo文件中的影片标题(即媒体管理工具中显示的标题)
title_pattern: '{num} {title}'
# 要添加到自定义分类的字段,空列表表示不添加
Expand All @@ -110,38 +112,45 @@ summarizer:
# 依次设置 已知无码/已知有码/不确定 这三种情况下 {censor} 对应的文本(可以利用此变量将有码/无码影片整理到不同文件夹)
censor_options_representation: ['无码', '有码', '打码情况未知']

cover:
# 封面文件的名称(不含拓展名),可以使用如`{title}`等字段
basename_pattern: "poster"
# 尽可能下载高清封面?(高清封面大小约 8-10 MiB,远大于普通封面,如果你的网络条件不佳,会降低整理速度)
highres: true
# 在封面图上添加水印(标签),例如“字幕”
add_label: false
crop:
# 要使用图像识别来裁剪的番号系列需要匹配的正则表达式
on_id_pattern:
- '^\d{6}[-_]\d{3}$'
- '^ARA'
- '^SIRO'
- '^GANA'
- '^MIUM'
- '^HHL'
# 要使用的图像识别引擎,详细配置见文档 https://github.com/Yuukiy/JavSP/wiki/AI-%7C-%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB
# NOTE: 此处无法直接对应,请参照注释手动填入
engine: null #null表示禁用图像剪裁
## 使用百度人体分析应用: {{{
# engine:
# name: baidu_aip
# # 百度人体分析应用的AppID
# app_id: ''
# # 百度人体分析应用的API Key
# api_key: ''
# # 百度人体分析应用的Secret Key
# secret_key: ''
## }}}

fanart:
# 横版封面文件的名称(不含拓展名),可以使用如`{title}`等字段
basename_pattern: "fanart"

################################
media_sanitizer:
# 尽可能下载高清封面?(高清封面大小约 8-10 MiB,远大于普通封面,如果你的网络条件不佳,会降低整理速度)
highres_covers: true
extra_fanarts:
# 是否下载剧照?
enabled: false
enabled: true
# 间隔的两次封面爬取请求之间应该间隔多久
scrap_interval: PT1.5S
crop:
# 要使用图像识别来裁剪的番号系列需要匹配的正则表达式
on_id_pattern:
- '^\d{6}[-_]\d{3}$'
- '^ARA'
- '^SIRO'
- '^GANA'
- '^MIUM'
# 要使用的图像识别引擎,详细配置见文档 https://github.com/Yuukiy/JavSP/wiki/AI-%7C-%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB
engine: null # null表示禁用图像剪裁
## 使用百度人体分析应用: {{{
# engine:
# name: baidu_aip
# # 百度人体分析应用的AppID
# app_id: ''
# # 百度人体分析应用的API Key
# api_key: ''
# # 百度人体分析应用的Secret Key
# secret_key: ''
## }}}
# 在封面图上添加水印(标签),例如“字幕”
add_label_to_cover: false
scrap_interval: PT2S

################################
translator:
Expand Down
28 changes: 15 additions & 13 deletions javsp/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,9 +310,9 @@ def generate_names(movie: Movie):
if remaining > 0:
movie.save_dir = save_dir
movie.basename = basename
movie.nfo_file = os.path.join(save_dir, 'movie.nfo')
movie.fanart_file = os.path.join(save_dir, 'fanart.jpg')
movie.poster_file = os.path.join(save_dir, 'poster.jpg')
movie.nfo_file = os.path.join(save_dir, Cfg().summarizer.nfo.basename_pattern.format(**copyd) + '.nfo')
movie.fanart_file = os.path.join(save_dir, Cfg().summarizer.fanart.basename_pattern.format(**copyd) + '.jpg')
movie.poster_file = os.path.join(save_dir, Cfg().summarizer.cover.basename_pattern.format(**copyd) + '.jpg')
if d['title'] != copyd['title']:
logger.info(f"自动截短标题为:\n{copyd['title']}")
if d['rawtitle'] != copyd['rawtitle']:
Expand All @@ -333,9 +333,11 @@ def generate_names(movie: Movie):
basename = os.path.normpath(Cfg().summarizer.path.basename_pattern.format(**copyd)).strip()
movie.save_dir = save_dir
movie.basename = basename
movie.nfo_file = os.path.join(save_dir, 'movie.nfo')
movie.fanart_file = os.path.join(save_dir, 'fanart.jpg')
movie.poster_file = os.path.join(save_dir, 'poster.jpg')

movie.nfo_file = os.path.join(save_dir, Cfg().summarizer.nfo.basename_pattern.format(**copyd) + '.nfo')
movie.fanart_file = os.path.join(save_dir, Cfg().summarizer.fanart.basename_pattern.format(**copyd) + '.jpg')
movie.poster_file = os.path.join(save_dir, Cfg().summarizer.cover.basename_pattern.format(**copyd) + '.jpg')

if d['title'] != copyd['title']:
logger.info(f"自动截短标题为:\n{copyd['title']}")
if d['rawtitle'] != copyd['rawtitle']:
Expand Down Expand Up @@ -387,7 +389,7 @@ def crop_poster_wrapper(fanart_file, poster_file, engine: BaiduAipEngine | None,
crop_poster(fanart_file, poster_file)
else:
crop_poster(fanart_file, poster_file)
if Cfg().media_sanitizer.add_label_to_cover:
if Cfg().summarizer.cover.add_label:
if hard_sub == True:
add_label_to_poster(poster_file, SUBTITLE_MARK_FILE, LabelPostion.BOTTOM_RIGHT)
if uncensored == True:
Expand All @@ -407,7 +409,7 @@ def check_step(result, msg='步骤错误'):
total_step = 6
if Cfg().translator.engine:
total_step += 1
if Cfg().media_sanitizer.extra_fanarts.enabled:
if Cfg().summarizer.extra_fanarts.enabled:
total_step += 1

return_movies = []
Expand Down Expand Up @@ -438,7 +440,7 @@ def check_step(result, msg='步骤错误'):
os.makedirs(movie.save_dir)

inner_bar.set_description('下载封面图片')
if Cfg().media_sanitizer.highres_covers:
if Cfg().summarizer.cover.highres:
cover_dl = download_cover(movie.info.covers, movie.fanart_file, movie.info.big_covers)
else:
cover_dl = download_cover(movie.info.covers, movie.fanart_file)
Expand All @@ -454,7 +456,7 @@ def check_step(result, msg='步骤错误'):
movie.poster_file = os.path.splitext(movie.poster_file)[0] + actual_ext

def should_use_ai_crop_match(label):
for r in Cfg().media_sanitizer.crop.on_id_pattern:
for r in Cfg().summarizer.cover.crop.on_id_pattern:
re.match(r, label)
return True
return False
Expand All @@ -464,15 +466,15 @@ def should_use_ai_crop_match(label):
if (movie.info.uncensored or
movie.data_src == 'fc2' or
should_use_ai_crop_match(movie.info.label.upper())):
crop_engine = Cfg().media_sanitizer.crop.engine
crop_engine = Cfg().summarizer.cover.crop.engine
inner_bar.set_description('使用AI裁剪海报封面')
else:
inner_bar.set_description('裁剪海报封面')
crop_poster_wrapper(movie.fanart_file, movie.poster_file, crop_engine, movie.hard_sub, movie.uncensored)
check_step(True)

if Cfg().media_sanitizer.extra_fanarts.enabled:
scrape_interval = Cfg().media_sanitizer.extra_fanarts.scrap_interval.total_seconds()
if Cfg().summarizer.extra_fanarts.enabled:
scrape_interval = Cfg().summarizer.extra_fanarts.scrap_interval.total_seconds()
inner_bar.set_description('下载剧照')
if movie.info.preview_pics:
extrafanartdir = movie.save_dir + '/extrafanart'
Expand Down
3 changes: 1 addition & 2 deletions javsp/core/baidu_aip.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

class AipClient():
def __init__(self, app_id: str, api_key: str) -> None:
piccfg = Cfg().media_sanitizer
# 保存已经识别过的图片的结果,减少请求次数
self.file = resource_path('data/baidu_aip.cache.json')
dir_path = os.path.dirname(self.file)
Expand All @@ -28,7 +27,7 @@ def __init__(self, app_id: str, api_key: str) -> None:
self.cache = json.load(f)
else:
self.cache = {}
self.client = AipBodyAnalysis(app_id, api_key, piccfg.aip_secret_key)
self.client = AipBodyAnalysis(app_id, api_key, Cfg().summarizer.cover.crop.engine.secret_key)

def analysis(self, pic_path):
with open(pic_path, 'rb') as f:
Expand Down
42 changes: 24 additions & 18 deletions javsp/core/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,19 +134,12 @@ class TitleSummarize(BaseConfig):
remove_trailing_actor_name: bool

class NFOSummarize(BaseConfig):
basename_pattern: str
title_pattern: str
custom_genres_fields: list[str]
custom_tags_fields: list[str]

class Summarizer(BaseConfig):
path: PathSummarize
default: MovieDefault
nfo: NFOSummarize
censor_options_representation: list[str]
title: TitleSummarize
move_files: bool = True

class ExtraFanart(BaseConfig):
class ExtraFanartSummarize(BaseConfig):
enabled: bool
scrap_interval: Duration

Expand All @@ -156,15 +149,29 @@ class BaiduAipEngine(BaseConfig):
api_key: str
secret_key: str

class MediaCrop(BaseConfig):
engine: BaiduAipEngine | None
on_id_pattern: list[str]
class CoverCrop(BaseConfig):
engine: BaiduAipEngine | None
on_id_pattern: list[str]

class CoverSummarize(BaseConfig):
basename_pattern: str
highres: bool
add_label: bool
crop: CoverCrop

class FanartSummarize(BaseConfig):
basename_pattern: str

class MediaSanitizer(BaseConfig):
highres_covers: bool
extra_fanarts: ExtraFanart
crop: MediaCrop
add_label_to_cover: bool
class Summarizer(BaseConfig):
default: MovieDefault
censor_options_representation: list[str]
title: TitleSummarize
move_files: bool = True
path: PathSummarize
nfo: NFOSummarize
cover: CoverSummarize
fanart: FanartSummarize
extra_fanarts: ExtraFanartSummarize

class BaiduTranslateEngine(BaseConfig):
name: Literal['baidu']
Expand Down Expand Up @@ -225,7 +232,6 @@ class Cfg(BaseConfig):
network: Network
crawler: Crawler
summarizer: Summarizer
media_sanitizer: MediaSanitizer
translator: Translator
other: Other
CONFIG_SOURCES=get_config_source()
53 changes: 30 additions & 23 deletions tools/config_migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ def fix_pat(p):
# NFO文件生成相关的选项
nfo:
# nfo文件的名称
basename_pattern: "movie"
# nfo文件中的影片标题(即媒体管理工具中显示的标题)
title_pattern: '{fix_pat(cfg['NamingRule']['nfo_title'])}'
# 要添加到自定义分类的字段,空列表表示不添加
Expand All @@ -162,35 +164,40 @@ def fix_pat(p):
# 依次设置 已知无码/已知有码/不确定 这三种情况下 $censor 对应的文本(可以利用此变量将有码/无码影片整理到不同文件夹)
censor_options_representation: ['{cfg['NamingRule']['text_for_uncensored']}', '{cfg['NamingRule']['text_for_censored']}', '{cfg['NamingRule']['text_for_unknown_censorship']}']
cover:
# 封面文件的名称(不含拓展名),可以使用如`{{title}}`等字段
basename_pattern: "poster"
# 尽可能下载高清封面?(高清封面大小约 8-10 MiB,远大于普通封面,如果你的网络条件不佳,会降低整理速度)
highres: {yes_to_true(cfg['Picture']['use_big_cover'])}
# 在封面图上添加水印(标签),例如“字幕”
add_label: false
crop:
# 要使用图像识别来裁剪的番号系列需要匹配的正则表达式
on_id_pattern:
{'\n'.join([f" - '{ai_crop_pat(r)}'" for r in cfg['Picture']['use_ai_crop_labels'].split(',')])}
# 要使用的图像识别引擎,详细配置见文档 https://github.com/Yuukiy/JavSP/wiki/AI-%7C-%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB
# NOTE: 此处无法直接对应,请参照注释手动填入
engine: null #null表示禁用图像剪裁
## 使用百度人体分析应用: {{{{{{
# engine:
# name: baidu_aip
# # 百度人体分析应用的AppID
# app_id: ''
# # 百度人体分析应用的API Key
# api_key: ''
# # 百度人体分析应用的Secret Key
# secret_key: ''
## }}}}}}
fanart:
# 横版封面文件的名称(不含拓展名),可以使用如`{{title}}`等字段
basename_pattern: "fanart"
################################
media_sanitizer:
# 尽可能下载高清封面?(高清封面大小约 8-10 MiB,远大于普通封面,如果你的网络条件不佳,会降低整理速度)
highres_covers: {yes_to_true(cfg['Picture']['use_big_cover'])}
extra_fanarts:
# 是否下载剧照?
enabled: {yes_to_true(cfg['Picture']['use_extra_fanarts'])}
# 间隔的两次封面爬取请求之间应该间隔多久
scrap_interval: PT{cfg['Picture']['extra_fanarts_scrap_interval']}S
crop:
# 要使用图像识别来裁剪的番号系列需要匹配的正则表达式
on_id_pattern:
{'\n'.join([f" - '{ai_crop_pat(r)}'" for r in cfg['Picture']['use_ai_crop_labels'].split(',')])}
# 要使用的图像识别引擎,详细配置见文档 https://github.com/Yuukiy/JavSP/wiki/AI-%7C-%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB
# NOTE: 此处无法直接对应,请参照注释手动填入
engine: null #null表示禁用图像剪裁
## 使用百度人体分析应用: {{{{{{
# engine:
# name: baidu_aip
# # 百度人体分析应用的AppID
# app_id: ''
# # 百度人体分析应用的API Key
# api_key: ''
# # 百度人体分析应用的Secret Key
# secret_key: ''
## }}}}}}
# 在封面图上添加水印(标签),例如“字幕”
add_label_to_cover: false
################################
translator:
Expand Down

0 comments on commit d103767

Please sign in to comment.