AlistSource/urls/README.md
2024-06-27 01:23:23 +08:00

178 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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 <sub_directory>] [--output <output_file>] [--base-url <base_url>] [--min-size <min_size>] --rf <root_folder>
```
## 参数说明
- `--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()
```