diff --git a/urls/README.md b/urls/README.md new file mode 100644 index 0000000..54d6d22 --- /dev/null +++ b/urls/README.md @@ -0,0 +1,178 @@ +## 123盘AlistURL生成器 + +## 简介 + +`123盘AlistURL生成器`是一个用于生成文件URL链接的Python脚本。它可以递归地遍历目录及其子目录中的所有文件,根据文件路径、基础URL、子目录和最小文件大小生成URL链接,并将生成的URL链接保存到YAML文件中。生成的YAML文件格式化输出,支持自定义根文件夹名称。 + +## 名称 + +- 程序名称:123盘AlistURL生成器 +- 脚本文件名:main.py + +## 功能特点 + +- 支持递归遍历目录及其子目录中的所有文件 +- 可以指定基础URL和子目录,生成的URL链接将包含这些信息 +- 可以指定最小文件大小,小于指定大小的文件将被排除 +- 生成的URL链接包含文件大小、时间戳和编码后的文件路径 +- 支持自然排序,确保文件按照合理的顺序排列 +- 输出链接格式化为YAML格式,子文件夹使用缩进表示层级关系 +- 支持自定义根文件夹名称 + +## 使用方法 + +1. 将脚本文件放置在要生成URL链接的目录中。 + +2. 打开命令行或终端,切换到脚本所在的目录。 + +3. + + 运行以下命令: + + + + ``` + sh + python main.py [--dir ] [--output ] [--base-url ] [--min-size ] --rf + ``` + + + +## 参数说明 + +- `--dir`:指定生成文件URL的子目录(可选)。如果不指定,默认为空。 +- `--output`:指定输出文件名(默认为urls.yaml)。生成的YAML文件将保存到该文件中。 +- `--base-url`:指定生成文件URL的基础URL(默认为https://link.kite.kim/feng)。生成的URL链接将包含该基础URL。 +- `--min-size`:指定最小文件大小,以字节为单位(默认为128KB)。小于该大小的文件将被排除。 +- `--rf`:指定YAML输出的根文件夹名称(必选)。生成的YAML文件将以该名称作为根文件夹。 + +## 示例 + +假设当前目录结构如下: + +```shell +. +├── dir1 +│ ├── file1.txt (200KB) +│ └── file2.txt (50KB) +├── dir2 +│ ├── file3.txt (300KB) +│ └── file4.txt (100KB) +└── main.py +``` + +运行以下命令: + +```bash +sh +python main.py --dir "subdir" --min-size 150000 --rf "八尾妖姬" +``` + +生成的urls.yaml文件内容将类似于: + +```python +八尾妖姬: + dir1: + 204800:1624761234:https://link.kite.kim/feng/subdir/dir1/file1.txt + dir2: + 307200:1624761234:https://link.kite.kim/feng/subdir/dir2/file3.txt +``` + +这个示例中,我们指定了子目录为"subdir",最小文件大小为150000字节(约150KB),并且指定了根文件夹名称为"八尾妖姬"。生成的URL链接包含了子目录、文件大小、时间戳和编码后的文件路径。小于150KB的文件(file2.txt和file4.txt)被排除在输出结果之外。 + +## 代码结构 + +## 自然排序函数 + +```python +pythondef natural_sort_key(s): + """为了自然排序的辅助函数,将字符串中的数字部分转换成整数""" + return [int(text) if text.isdigit() else text.lower() for text in re.split('([0-9]+)', s)] +``` + +## 生成URL函数 + +```python +pythondef 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='.') + 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 +``` + +## 保存URL函数 + +```python +pythondef 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") + 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}:\n") + for file in files: + f.write(f" {file}\n") +``` + +## 解析命令行参数 + +```python +pythondef 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() +``` + +## 递归列出文件 + +```python +pythondef 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 +``` + +## 主函数 + +```python +pythondef 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() +``` \ No newline at end of file