biliup提供后处理选项用于扩展,毕竟一行命令后提供无限可能。
作用
用下载后处理来说,有时候因为主播的问题或者自己的网络原因造成了录播文件产生了很多视频碎片,本着自动化上传来说,肯定不会手动合成再上传,这时候我们有两种选择
- 系统默认了一个选项,即空间配置-碎片过滤(filtering_threshold),即使是空的,程序也会默认删除20M以下的文件,如图所示,你可以改大一些,然后保存。
- 利用ffmpeg对碎片进行合并,但是哔哩哔哩默认每个视频不得高于10小时,否则上传不上去,这一点要自己取舍。
上传完成后处理,这个作用很大,提供了run(运行命令),mv(移动),rm(删除),用法示例:
run = echo hello! 执行任意命令,等同于在shell中运行,视频文件路径作为标准输入传入
mv = backup/ 移动文件到backup目录下
run = python3 path/to/mail.py
rm为留空默认选项,详见 web ui版本下配置不删除录播/ 哔哩哔哩稿件投稿转码问题。 #127
你可以自己编写脚本来运行一些奇怪的东西,你甚至可以用命令来将录播文件上传到云盘内,一个例子,由 @Sora 提供
使用aliyunpan CLI项目的上传完成的后处理脚本 (上传阿里云盘)
import os
import re
import shutil
import subprocess
from datetime import datetime
def extract_anchor_name_and_date(file_path):
# 正则表达式匹配文件名中的主播名和日期
match = re.search(r"/([^/]+)(\d{4}-\d{2}-\d{2})T\d{2}_\d{2}_\d{2}\.mp4$", file_path)
if match:
return match.group(1), match.group(2)
else:
return None, None
def main():
print("开始处理文件...")
processed_dirs = set()
for line in sys.stdin:
file_path = line.strip()
anchor_name, date = extract_anchor_name_and_date(file_path)
if not anchor_name or not date:
print(f"无法从路径提取主播名或日期: {file_path}")
continue
target_dir = os.path.join("./backup", anchor_name, date)
os.makedirs(target_dir, exist_ok=True)
# 移动文件
shutil.move(file_path, target_dir)
print(f"文件已移动到: {target_dir}")
processed_dirs.add(target_dir)
# 上传到阿里云盘并删除本地文件
for dir_path in processed_dirs:
anchor_name = os.path.basename(os.path.dirname(dir_path))
date = os.path.basename(dir_path)
target_cloud_path = f"/录播/{anchor_name}"
print(f"开始上传 {dir_path} 到阿里云盘目录 {target_cloud_path}...")
cmd = ['aliyunpan', 'upload', dir_path, target_cloud_path]
subprocess.run(cmd, check=True)
shutil.rmtree(dir_path)
print(f"上传完成并已删除本地文件夹:{dir_path}")
if __name__ == "__main__":
import sys
main()
或者你需要一个合并脚本,一个例子,由 @铂屑 提供
示例视频合并脚本:
import json
import os
import subprocess
import sys
from typing import List
import tempfile
def merge_videos(video_list: List[str]):
if len(video_list) <= 1:
print("视频文件数量小于等于 1。")
return
# 对文件进行排序以确保按顺序处理
video_list.sort()
# 生成输出视频文件名
out_name = f"{os.path.splitext(video_list[0])[0]}-1.mp4"
# 创建临时playlist文件
with tempfile.NamedTemporaryFile(mode='wt', delete=False) as playlist:
for video_file in video_list:
playlist.write(f"file '{os.path.abspath(video_file)}'\n")
playlist_file = playlist.name
# 创建用于合并视频的ffmpeg命令
cmd = ['ffmpeg', '-f', 'concat', '-safe', '0', '-i', playlist_file, '-c', 'copy', out_name]
# 运行ffmpeg命令,指定encoding为'utf-8'
subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, encoding='utf-8')
print(f"视频合并成功。")
# 删除临时playlist文件
os.remove(playlist_file)
# 删除原始视频文件
for file in video_list:
os.remove(file)
print(f"已删除原始视频:{file}")
os.rename(out_name, video_list[0])
if __name__ == "__main__":
# 调用函数合并视频
json_str = sys.stdin.read()
data = json.loads(json_str)
file_list = data.get("file_list", [])
merge_videos(file_list)
请确保硬盘可用空间大小大于视频的两倍