@@ -18,6 +18,7 @@ class JmOptionPlugin:
1818 def __init__ (self , option : JmOption ):
1919 self .option = option
2020 self .log_enable = True
21+ self .delete_original_file = False
2122
2223 def invoke (self , ** kwargs ) -> None :
2324 """
@@ -66,6 +67,33 @@ def warning_lib_not_install(self, lib: str):
6667 import warnings
6768 warnings .warn (msg )
6869
70+ def execute_deletion (self , paths : List [str ]):
71+ """
72+ 删除文件和文件夹
73+ :param paths: 路径列表
74+ """
75+ if self .delete_original_file is not True :
76+ return
77+
78+ for p in paths :
79+ if file_not_exists (p ):
80+ continue
81+
82+ if os .path .isdir (p ):
83+ os .rmdir (p )
84+ self .log (f'删除文件夹: { p } ' , 'remove' )
85+ else :
86+ os .remove (p )
87+ self .log (f'删除原文件: { p } ' , 'remove' )
88+
89+ # noinspection PyMethodMayBeStatic
90+ def execute_cmd (self , cmd ):
91+ """
92+ 执行shell命令,这里采用简单的实现
93+ :param cmd: shell命令
94+ """
95+ return os .system (cmd )
96+
6997
7098class JmLoginPlugin (JmOptionPlugin ):
7199 """
@@ -342,12 +370,16 @@ def do_zip(self, source_dir, zip_path, all_filepath, msg):
342370 return self .unified_path (source_dir )
343371
344372 def after_zip (self , dir_zip_dict : Dict [str , Optional [str ]]):
345- # 是否要删除所有原文件
346- if self .delete_original_file is True :
347- self .delete_all_files_and_empty_dir (
348- all_downloaded = self .downloader .all_downloaded ,
349- dir_list = list (dir_zip_dict .keys ())
350- )
373+ # 删除所有原文件
374+ dirs = sorted (dir_zip_dict .keys (), reverse = True )
375+ image_paths = [
376+ path
377+ for photo_dict in self .downloader .all_downloaded .values ()
378+ for image_list in photo_dict .values ()
379+ for path , image in image_list
380+ ]
381+ self .execute_deletion (image_paths )
382+ self .execute_deletion (dirs )
351383
352384 # noinspection PyMethodMayBeStatic
353385 def get_zip_path (self , album , photo , filename_rule , suffix , zip_dir ):
@@ -361,28 +393,6 @@ def get_zip_path(self, album, photo, filename_rule, suffix, zip_dir):
361393 filename + fix_suffix (suffix ),
362394 )
363395
364- # noinspection PyMethodMayBeStatic
365- def delete_all_files_and_empty_dir (self , all_downloaded : dict , dir_list : List [str ]):
366- """
367- 删除所有文件和文件夹
368- """
369- import os
370- for photo_dict in all_downloaded .values ():
371- for image_list in photo_dict .values ():
372- for f , _ in image_list :
373- # check not exist
374- if file_not_exists (f ):
375- continue
376-
377- os .remove (f )
378- self .log (f'删除原文件: { f } ' , 'remove' )
379-
380- for d in sorted (dir_list , reverse = True ):
381- # check exist
382- if file_exists (d ):
383- os .rmdir (d )
384- self .log (f'删除文件夹: { d } ' , 'remove' )
385-
386396
387397class ClientProxyPlugin (JmOptionPlugin ):
388398 plugin_key = 'client_proxy'
@@ -581,10 +591,7 @@ def main(self):
581591 else :
582592 self .zip_with_password ()
583593
584- # 删除导出的原文件
585- if self .delete_original_file is True :
586- for f in self .files :
587- os .remove (f )
594+ self .execute_deletion (self .files )
588595
589596 def handle_folder (self , fid : str , fname : str ):
590597 self .log (f'【收藏夹: { fname } , fid: { fid } 】开始获取数据' )
@@ -646,35 +653,77 @@ def zip_with_password(self):
646653 os .chdir (self .save_dir )
647654 cmd = f'7z a "{ self .zip_filepath } " "{ self .save_dir } " -p{ self .zip_password } -mhe=on'
648655 self .require_true (
649- 0 == os . system (cmd ),
656+ 0 == self . execute_cmd (cmd ),
650657 '加密压缩文件失败'
651658 )
652659
653660
654661class ConvertJpgToPdfPlugin (JmOptionPlugin ):
655662 plugin_key = 'j2p'
656663
664+ def check_image_suffix_is_valid (self , std_suffix ):
665+ """
666+ 检查option配置的图片后缀转换,目前限制使用Magick时只能搭配jpg
667+ 暂不探究Magick是否支持更多图片格式
668+ """
669+ cur_suffix : Optional [str ] = self .option .download .image .suffix
670+
671+ ExceptionTool .require_true (
672+ cur_suffix is not None and cur_suffix .endswith (std_suffix ),
673+ '请把图片的后缀转换配置为jpg,不然无法使用Magick!'
674+ f'(当前配置是[{ cur_suffix } ])\n '
675+ f'配置模板如下: \n '
676+ f'```\n '
677+ f'download:\n '
678+ f' image:\n '
679+ f' suffix: { std_suffix } # 当前配置是{ cur_suffix } \n '
680+ f'```'
681+ )
682+
657683 def invoke (self ,
658684 photo : JmPhotoDetail ,
685+ downloader = None ,
659686 pdf_dir = None ,
660687 filename_rule = 'Pid' ,
661688 quality = 100 ,
689+ delete_original_file = False ,
690+ overwrite_cmd = None ,
691+ overwrite_jpg = None ,
662692 ** kwargs ,
663693 ):
694+ self .delete_original_file = delete_original_file
695+
696+ # 检查图片后缀配置
697+ suffix = overwrite_jpg or '.jpg'
698+ self .check_image_suffix_is_valid (suffix )
699+
700+ # 处理文件夹配置
664701 filename = DirRule .apply_rule_directly (None , photo , filename_rule )
665702 photo_dir = self .option .decide_image_save_dir (photo )
703+
704+ # 处理生成的pdf文件的路径
666705 if pdf_dir is None :
667706 pdf_dir = photo_dir
668707 else :
708+ pdf_dir = fix_filepath (pdf_dir , True )
669709 mkdir_if_not_exists (pdf_dir )
670710
671- pdf_filepath = f'{ pdf_dir } { filename } .pdf'
672-
673- def get_cmd (suffix = '.jpg' ):
674- return f'magick convert -quality { quality } "{ photo_dir } *{ suffix } " "{ pdf_filepath } "'
711+ pdf_filepath = os .path .join (pdf_dir , f'{ filename } .pdf' )
712+
713+ # 生成命令
714+ def generate_cmd ():
715+ return (
716+ overwrite_cmd or
717+ 'magick convert -quality {quality} "{photo_dir}*{suffix}" "{pdf_filepath}"'
718+ ).format (
719+ quality = quality ,
720+ photo_dir = photo_dir ,
721+ suffix = suffix ,
722+ pdf_filepath = pdf_filepath ,
723+ )
675724
676- cmd = get_cmd ()
677- self .log (f'execute command: { cmd } ' )
725+ cmd = generate_cmd ()
726+ self .log (f'Execute Command: [ { cmd } ] ' )
678727 code = self .execute_cmd (cmd )
679728
680729 self .require_true (
@@ -686,6 +735,14 @@ def get_cmd(suffix='.jpg'):
686735
687736 self .log (f'Convert Successfully: JM{ photo .id } → { pdf_filepath } ' )
688737
689- # noinspection PyMethodMayBeStatic
690- def execute_cmd (self , cmd ):
691- return os .system (cmd )
738+ if downloader is not None :
739+ from .jm_downloader import JmDownloader
740+ downloader : JmDownloader
741+
742+ paths = [
743+ path
744+ for path , image in downloader .all_downloaded [photo .from_album ][photo ]
745+ ]
746+
747+ paths .append (self .option .decide_image_save_dir (photo , ensure_exists = False ))
748+ self .execute_deletion (paths )
0 commit comments