1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
| import os import json import shutil import tkinter as tk from tkinter import filedialog from tkinter import messagebox from tkinter import ttk
class BiliRename() : fileSourcePath = None cpFilePath = None old_new_filename_dist = {} def __init__(self): self.root = tk.Tk() self.root.title('B站视频批处理') self.root.geometry('680x200') self.root.maxsize(1200,1200) self.fileSourcePath = tk.StringVar() self.cpFilePath = tk.StringVar() self.createUI() def run(self): self.root.mainloop() def createUI(self): self.selectFilePathUI() self.operateFileUI() pass def selectFilePathUI(self): row_num = 0 frame_file = tk.Frame(self.root).grid(row=row_num) label_file = tk.Label(frame_file,text="文件路径: ") label_file.grid(row=row_num,column=0,sticky="w") entry_file = tk.Entry(frame_file, width=50, state= 'readonly',textvariable=self.fileSourcePath) entry_file.grid(row=row_num, column=1, padx=5, pady=5) select_dir_btn = tk.Button(frame_file,text='选择路径',command=lambda: self.selectFilePathDlg(1)) select_dir_btn.grid(row=row_num, column=2, padx=5, pady=5) preview_btn = tk.Button(frame_file,text='预览文件',command=self.previewFileName) preview_btn.grid(row=row_num, column=3, padx=5, pady=5) pass def operateFileUI(self): row_num = 1 frame_file = tk.Frame(self.root).grid(row=row_num) label_file = tk.Label(frame_file,text="拷贝全部视频到指定路径: ") label_file.grid(row=row_num,column=0,sticky="w") entry_file = tk.Entry(frame_file, width=50, state= 'readonly',textvariable=self.cpFilePath) entry_file.grid(row=row_num, column=1, padx=5, pady=5) select_dir_btn = tk.Button(frame_file,text='选择路径',command=lambda: self.selectFilePathDlg(2)) select_dir_btn.grid(row=row_num, column=2, padx=5, pady=5) cp_file_btn = tk.Button(frame_file,text='确认拷贝',command=self.CPFileWithProgress) cp_file_btn.grid(row=row_num, column=3, padx=5, pady=5) pass def previewFileName(self): path = self.fileSourcePath.get() if path: self.readData(path) top = tk.Toplevel(self.root) top.geometry('800x400') top.resizable(True, True) top.title('文件列表') frame1 = tk.Frame(top) frame2 = tk.Frame(top) label1 = tk.Label(frame1, text='原文件名称列表:') lb1 = tk.Listbox(frame1) label2 = tk.Label(frame2, text='预修改文件名称列表:') lb2 = tk.Listbox(frame2) btn = tk.Button(top,text='确认修改',command=self.confirmNameChange) old_filenames = self.old_new_filename_dist.keys() new_filenames = self.old_new_filename_dist.values() for name in old_filenames: lb1.insert(tk.END, name) for name in new_filenames: lb2.insert(tk.END, name) label1.pack(side=tk.TOP) lb1.pack(fill=tk.BOTH, expand=True, side=tk.LEFT) label2.pack(side=tk.TOP) lb2.pack(fill=tk.BOTH, expand=True, side=tk.LEFT) frame1.pack(fill=tk.BOTH, expand=True, side=tk.LEFT) frame2.pack(fill=tk.BOTH, expand=True, side=tk.LEFT) btn.pack(side=tk.BOTTOM) else: messagebox.showerror("提示", "请选择文件路径") pass def selectFilePathDlg(self,index): filePath = filedialog.askdirectory() if index == 1: self.fileSourcePath.set(filePath) elif index == 2: self.cpFilePath.set(filePath) else: raise ValueError("Invalid index") pass def CPFileWithProgress(self): src_path = self.fileSourcePath.get() dst_path = self.cpFilePath.get() if not src_path or not dst_path: messagebox.showerror("错误", "请选择源路径和目标路径") return file_list = self.getVideoList(src_path) if not file_list: messagebox.showerror("错误", "源路径中不存在任何视频文件") return progress_window = tk.Toplevel(self.root) progress_window.title("拷贝进度") progress_label = tk.Label(progress_window, text="正在拷贝文件,请稍候...") progress_label.pack(padx=10, pady=10) progress_bar = ttk.Progressbar(progress_window, orient=tk.HORIZONTAL, mode='determinate', length=300) progress_bar.pack(padx=10, pady=10)
progress_bar['maximum'] = len(file_list) progress_bar['value'] = 0 for i, file in enumerate(file_list): try: shutil.copy(file, dst_path) except Exception as e: messagebox.showerror("错误", f"拷贝文件 {file} 失败:{str(e)}") progress_window.destroy() return progress_bar['value'] = str(i + 1) progress_window.update() progress_window.destroy() messagebox.showinfo("提示", "视频文件拷贝完成") pass def readData(self,path): for root, dirs, files in os.walk(path): old_name = "" new_name = "" for file in files: if file.endswith(".mp4"): old_name = file elif file.endswith(".info"): new_name = self.getPartName(os.path.join(root, file))+".mp4" if old_name and new_name: self.old_new_filename_dist[f"{os.path.join(root, old_name)}"] = f"{os.path.join(root, new_name)}" def confirmNameChange(self): for key, value in self.old_new_filename_dist.items(): try: os.rename(key,value) except Exception as e: messagebox.showerror("错误", f"修改文件名错误:{str(e)}") continue top = self.root.winfo_children()[-1] top.destroy() messagebox.showinfo("提示","文件名修改完成") self.old_new_filename_dist.clear()
def getPartName(self,info): with open(info, 'r', encoding='UTF-8') as todos: str = todos.read() str_dict = json.loads(str) return str_dict["PartName"] def getVideoList(self,path): video_exts = ['.mp4', '.avi', '.mkv', '.flv'] file_list = [] for root, dirs, files in os.walk(path): for file in files: _, ext = os.path.splitext(file) if ext.lower() in video_exts: file_list.append(os.path.join(root, file)) return file_list
def main(): app = BiliRename() app.run()
if __name__ == "__main__": main()
|