MENU

使用alist上传监控视频到豆包云盘

2025 年 05 月 16 日 • 默认分类,Python,生活阅读设置

由于最近我们那边初中辍学的二五仔越来越多,导致盗窃事件频发。由于家里没监控,家里老人防范意识也不强,所有我家也遭殃了。
最近国补力度还不错,于是就装了一个小米的监控,首先先使用自带的功能,使用smb同步监控视频文件到我家的的Linux服务器。不过小米监控进行了分片,分成了每个大小为128MB的视频,我本来是通过alist上传到百度云盘、阿里云盘、UC云盘、移动云盘的,毕竟这几个加起来存储空间也有10T左右了,一天大概产生18G的视频,算下来可以存一年半的视频了。
然而在alist添加存储的时候发现有个豆包,于是去alist的仓库看了一下,发现豆包出了一个ai云盘,存储空间目前是无限!而且不限制上传文件的大小,所以我就又写了一个python程序,每天凌晨3点将昨天的视频使用ffmpeg合成为一个视频,然后再通过alist上传到豆包里面。最后在中午12点将合成的视频再删除掉,减少空间。因为我的磁盘不大,只有200多G的空间。
使用alist上传监控视频到豆包云盘
同时之前上传到百度的程序依然运行,毕竟豆包这玩意无限空间听着就不靠谱,由于不用合成,所以定到了凌晨一点执行。18G大概不到一个小时就可以上传完毕了。
代码如下,仅供参考

import requests
import json
import re
from datetime import datetime, timedelta
import subprocess

yesterday = datetime.today().date() - timedelta(days=1)

server = "https://alist.xx.cn" # alist地址
local_files_path = "/smb/xiaomi_camera_videos/XXXXXXXXXXXX"
cloud_files_path = "/doubao/xiaomi_camera_videos/" + str(yesterday.strftime("%Y/%m"))

payload = json.dumps({
    "username": "username",
    "password": "password"
})

token = json.loads(requests.request("POST", server + "/api/auth/login", headers={'Content-Type': 'application/json'},
                                    data=payload).text)["data"]["token"]

headers = {
    'Authorization': token,
    'Content-Type': 'application/json'
}

payload = json.dumps({
    "path": cloud_files_path
})

if json.loads(requests.request("POST", server + "/api/fs/mkdir", headers=headers, data=payload).text)["code"] == 200:
    print("创建文件夹成功")
else:
    print("创建文件夹失败")
    quit(1)

payload = json.dumps({
    "path": local_files_path,
    "password": "",
    "page": 1,
    "per_page": 0,
    "refresh": True
})
local_files = json.loads(requests.request("POST", server + "/api/fs/list", headers=headers, data=payload).text)
local_files_list = []
for item in local_files["data"]["content"]:
    if item["size"] != 134217728:
        break
    match = re.match(r"^00_(\d{14})_", item["name"])
    if match:
        timestamp_str = match.group(1)
        dt = datetime.strptime(timestamp_str, "%Y%m%d%H%M%S")
        if dt.date() == datetime.today().date() - timedelta(days=1):
            local_files_list.append(item["name"])
    else:
        print("文件名格式不匹配")

# 生成FFmpeg所需的文件列表文本
with open('video_list.txt', 'w') as f:
    for video in local_files_list:
        f.write(f"file /mnt/usb/xiaomi_camera_videos/XXXXXXXXXXXX/'{video}'\n")

# 拼接命令参数
output_file = "/mnt/usb/jk/" + str(yesterday.strftime("%d")) + '.mp4'
ffmpeg_cmd = [
    'ffmpeg',
    '-f', 'concat',
    '-safe', '0',
    '-i', 'video_list.txt',
    '-c', 'copy',
    output_file
]

try:
    # 执行FFmpeg命令
    subprocess.run(
        ffmpeg_cmd,
        check=True,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True
    )
    print(f"视频拼接完成,输出文件:{output_file}")

except subprocess.CalledProcessError as e:
    print(f"拼接失败,错误信息:\n{e.stderr}")

filename = str(yesterday.strftime("%d")) + '.mp4'
payload = json.dumps({
    "src_dir": "/smb/jk",
    "dst_dir": cloud_files_path,
    "names": [filename]
})

result = requests.request("POST", server + "/api/fs/copy", headers=headers, data=payload)

if json.loads(result.text)["code"] == 200:
    print("success")
else:
    print("error")