import os import urllib.parse import argparse import re import time import yaml def natural_sort_key(s): """为了自然排序的辅助函数,将字符串中的数字部分转换成整数""" return [int(text) if text.isdigit() else text.lower() for text in re.split('([0-9]+)', s)] def generate_urls(file_paths, base_url, sub_directory, min_size): """根据文件路径、基础URL、子目录和最小文件大小生成URL链接""" urls = {} if not base_url.endswith('/'): base_url += '/' if sub_directory and not sub_directory.endswith('/'): sub_directory += '/' current_timestamp = int(time.time()) # 移到循环外 for path in sorted(file_paths, key=natural_sort_key): file_size_bytes = os.path.getsize(path) if file_size_bytes < min_size: continue relative_path = os.path.relpath(path, start='.') relative_path = relative_path.replace(os.sep, '/') # 将路径分隔符替换为正斜杠 encoded_path = urllib.parse.quote(relative_path) url = f"{base_url}{sub_directory}{encoded_path}" dir_name = os.path.dirname(relative_path) if dir_name not in urls: urls[dir_name] = [] urls[dir_name].append(f"{file_size_bytes}:{current_timestamp}:{url}") return urls def save_urls(urls, output_file, root_folder): """将URL链接保存到YAML文件中""" with open(output_file, 'w', encoding='utf-8') as f: f.write(f"{root_folder}:\n") if has_subdirectories(urls): for dir_name, files in urls.items(): if dir_name == '.': for file in files: f.write(f" {file}\n") else: f.write(f" {dir_name.split('/')[-1]}:\n") for file in files: f.write(f" {file}\n") else: for file in urls['.']: f.write(f" {file}\n") def parse_arguments(): """解析命令行参数""" parser = argparse.ArgumentParser(description='Generate URLs from file names.') parser.add_argument('--dir', type=str, default='', help='Sub-directory for generating file URLs (optional)') parser.add_argument('--output', type=str, default='urls.yaml', help='Output file name (default: urls.yaml)') parser.add_argument('--base-url', type=str, default='https://link.kite.kim/feng', help='Base URL for generating file URLs (default: https://link.kite.kim/feng)') parser.add_argument('--min-size', type=int, default=128*1024, help='Minimum file size in bytes (default: 128KB)') parser.add_argument('--rf', type=str, required=True, help='Root folder name for YAML output') return parser.parse_args() def list_files_recursive(start_path='.', exclude_files=None): """递归列出目录及其子目录中的所有文件,排除指定的文件""" if exclude_files is None: exclude_files = set() file_paths = [] for root, dirs, files in os.walk(start_path): for file in files: if file not in exclude_files: file_paths.append(os.path.join(root, file)) return file_paths def has_subdirectories(urls): """检查是否存在子文件夹""" return any(dir_name != '.' for dir_name in urls) def main(): args = parse_arguments() current_script = os.path.basename(__file__) exclude_files = {current_script} # 排除当前脚本文件 file_paths = list_files_recursive('.', exclude_files) urls = generate_urls(file_paths, args.base_url, args.dir, args.min_size) save_urls(urls, args.output, args.rf) print(f"URL链接已保存到{args.output}") if __name__ == '__main__': main()