# This viminfo file was generated by Vim 9.1. # You may edit it if you're careful! # Viminfo version |1,4 # Value of 'encoding' when this file was written *encoding=utf-8 # hlsearch on (H) or off (h): ~h # Command Line History (newest to oldest): :wq |2,0,1783586086,,"wq" :q |2,0,1783586080,,"q" :q! |2,0,1783074856,,"q!" # Search String History (newest to oldest): # Expression History (newest to oldest): # Input Line History (newest to oldest): # Debug Line History (newest to oldest): # Registers: ""1 LINE 0 #!/usr/bin/env bash # # split_videos.sh # # 功能: # 遍历指定文件夹下的视频文件(文件名以 8 位数字 MMDDHHmm 结尾, # 例如 xxx07091111.mp4),每 110 分钟用 ffmpeg 流复制(-c copy, # 不重新编码)分割一次,并按“原时间戳 + 110*n 分钟”重新命名分片。 # # 命名规则示例: # 原文件: xxx07091111.mp4 (07-09 11:11) # 第1段: xxx07091301.mp4 (11:11 + 110min = 13:01) # 第2段: xxx07091451.mp4 (13:01 + 110min = 14:51) # # 规则细节(已与用户确认): # 1. 分割方式:ffmpeg -c copy 流复制,只能在关键帧处切割, # 时间点可能有几秒误差,不重新编码、不做任何画质/参数处理。 # 2. 分割成功后会删除原始文件。 # 3. 视频总时长本身不足 110 分钟:不分割,文件名保持不变,直接跳过。 # 4. 文件名最后 8 位数字 = MMDDHHmm(月日时分,无年份), # 前面部分(不管多长、含不含数字)都当作前缀原样保留。 # # 用法: # ./split_videos.sh /path/to/video/folder # 不传参数则默认处理当前目录 # # 依赖:ffmpeg, ffprobe # set -uo pipefail SEGMENT_MINUTES=110 SEGMENT_SECONDS=$((SEGMENT_MINUTES * 60)) DUMMY_YEAR=2000 # 仅用于日期加减运算的占位年份(闰年,避免2月29日报错),输出时会被去掉 TARGET_DIR="${1:-.}" if ! command -v ffmpeg >/dev/null 2>&1; then echo "错误: 未找到 ffmpeg,请先安装。" >&2 exit 1 fi if ! command -v ffprobe >/dev/null 2>&1; then echo "错误: 未找到 ffprobe,请先安装。" >&2 exit 1 fi if [[ ! -d "$TARGET_DIR" ]]; then echo "错误: 目录不存在: $TARGET_DIR" >&2 exit 1 fi |3,1,1,1,50,0,1783581354,"#!/usr/bin/env bash","#","# split_videos.sh","#","# 功能:","# 遍历指定文件夹下的视频文件(文件名以 8 位数字 MMDDHHmm 结尾,","# 例如 xxx07091111.mp4),每 110 分钟用 ffmpeg 流复制(-c copy,","# 不重新编码)分割一次,并按“原时间戳 + 110*n 分钟”重新命名分片。","#","# 命名规则示例:","# 原文件: xxx07091111.mp4 (07-09 11:11)",>60 |<"# 第1段: xxx07091301.mp4 (11:11 + 110min = 13:01)","# 第2段: xxx07091451.mp4 (13:01 + 110min = 14:51)","#","# 规则细节(已与用户确认):","# 1. 分割方式:ffmpeg -c copy 流复制,只能在关键帧处切割,","# 时间点可能有几秒误差,不重新编码、不做任何画质/参数处理。","# 2. 分割成功后会删除原始文件。",>103 |<"# 3. 视频总时长本身不足 110 分钟:不分割,文件名保持不变,直接跳过。","# 4. 文件名最后 8 位数字 = MMDDHHmm(月日时分,无年份),","# 前面部分(不管多长、含不含数字)都当作前缀原样保留。","#","# 用法:","# ./split_videos.sh /path/to/video/folder","# 不传参数则默认处理当前目录","#","# 依赖:ffmpeg, ffprobe","#","set -uo pipefail","","SEGMENT_MINUTES=110",>43 |<"SEGMENT_SECONDS=$((SEGMENT_MINUTES * 60))","DUMMY_YEAR=2000 # 仅用于日期加减运算的占位年份(闰年,避免2月29日报错),输出时会被去掉","","TARGET_DIR=\"${1:-.}\"","","if ! command -v ffmpeg >/dev/null 2>&1; then"," echo \"错误: 未找到 ffmpeg,请先安装。\" >&2"," exit 1","fi","if ! command -v ffprobe >/dev/null 2>&1; then"," echo \"错误: 未找到 ffprobe,请先安装。\" >&2"," exit 1","fi","",>37 |<"if [[ ! -d \"$TARGET_DIR\" ]]; then"," echo \"错误: 目录不存在: $TARGET_DIR\" >&2"," exit 1","fi","" "2 LINE 0 amd3.ddcj.bar { file_server { root /home/uftp browse } encode gzip } |3,0,2,1,7,0,1783580279,"amd3.ddcj.bar {"," file_server {"," root /home/uftp"," browse"," }"," encode gzip","}" "3 LINE 0 #!/usr/bin/env bash # # split_videos.sh # # 功能: # 遍历指定文件夹下的视频文件(文件名以 8 位数字 MMDDHHmm 结尾, # 例如 xxx07091111.mp4),每 110 分钟用 ffmpeg 流复制(-c copy, # 不重新编码)分割一次,并按“原时间戳 + 110*n 分钟”重新命名分片。 # # 命名规则示例: # 原文件: xxx07091111.mp4 (07-09 11:11) # 第1段: xxx07091301.mp4 (11:11 + 110min = 13:01) # 第2段: xxx07091451.mp4 (13:01 + 110min = 14:51) # # 规则细节(已与用户确认): # 1. 分割方式:ffmpeg -c copy 流复制,只能在关键帧处切割, # 时间点可能有几秒误差,不重新编码、不做任何画质/参数处理。 # 2. 分割成功后会删除原始文件。 # 3. 视频总时长本身不足 110 分钟:不分割,文件名保持不变,直接跳过。 # 4. 文件名最后 8 位数字 = MMDDHHmm(月日时分,无年份), # 前面部分(不管多长、含不含数字)都当作前缀原样保留。 # # 用法: # ./split_videos.sh /path/to/video/folder # 不传参数则默认处理当前目录 # # 依赖:ffmpeg, ffprobe # set -uo pipefail SEGMENT_MINUTES=110 SEGMENT_SECONDS=$((SEGMENT_MINUTES * 60)) DUMMY_YEAR=2000 # 仅用于日期加减运算的占位年份(闰年,避免2月29日报错),输出时会被去掉 TARGET_DIR="${1:-.}" if ! command -v ffmpeg >/dev/null 2>&1; then echo "错误: 未找到 ffmpeg,请先安装。" >&2 exit 1 fi if ! command -v ffprobe >/dev/null 2>&1; then echo "错误: 未找到 ffprobe,请先安装。" >&2 exit 1 fi if [[ ! -d "$TARGET_DIR" ]]; then echo "错误: 目录不存在: $TARGET_DIR" >&2 exit 1 fi |3,0,3,1,50,0,1783580275,"#!/usr/bin/env bash","#","# split_videos.sh","#","# 功能:","# 遍历指定文件夹下的视频文件(文件名以 8 位数字 MMDDHHmm 结尾,","# 例如 xxx07091111.mp4),每 110 分钟用 ffmpeg 流复制(-c copy,","# 不重新编码)分割一次,并按“原时间戳 + 110*n 分钟”重新命名分片。","#","# 命名规则示例:","# 原文件: xxx07091111.mp4 (07-09 11:11)",>60 |<"# 第1段: xxx07091301.mp4 (11:11 + 110min = 13:01)","# 第2段: xxx07091451.mp4 (13:01 + 110min = 14:51)","#","# 规则细节(已与用户确认):","# 1. 分割方式:ffmpeg -c copy 流复制,只能在关键帧处切割,","# 时间点可能有几秒误差,不重新编码、不做任何画质/参数处理。","# 2. 分割成功后会删除原始文件。",>103 |<"# 3. 视频总时长本身不足 110 分钟:不分割,文件名保持不变,直接跳过。","# 4. 文件名最后 8 位数字 = MMDDHHmm(月日时分,无年份),","# 前面部分(不管多长、含不含数字)都当作前缀原样保留。","#","# 用法:","# ./split_videos.sh /path/to/video/folder","# 不传参数则默认处理当前目录","#","# 依赖:ffmpeg, ffprobe","#","set -uo pipefail","","SEGMENT_MINUTES=110",>43 |<"SEGMENT_SECONDS=$((SEGMENT_MINUTES * 60))","DUMMY_YEAR=2000 # 仅用于日期加减运算的占位年份(闰年,避免2月29日报错),输出时会被去掉","","TARGET_DIR=\"${1:-.}\"","","if ! command -v ffmpeg >/dev/null 2>&1; then"," echo \"错误: 未找到 ffmpeg,请先安装。\" >&2"," exit 1","fi","if ! command -v ffprobe >/dev/null 2>&1; then"," echo \"错误: 未找到 ffprobe,请先安装。\" >&2"," exit 1","fi","",>37 |<"if [[ ! -d \"$TARGET_DIR\" ]]; then"," echo \"错误: 目录不存在: $TARGET_DIR\" >&2"," exit 1","fi","" "4 LINE 0 #!/bin/bash # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' echo -e "${BLUE}================ Aria2 交互式后台下载工具 ================${NC}" echo "" # 1. 先输入文件名 read -p "① 请输入保存文件名(带后缀,例 ubuntu.iso):" filename if [ -z "$filename" ]; then echo -e "${RED}错误:文件名不能为空!${NC}" exit 1 fi # 2. 再输入下载链接 read -p "② 请输入下载URL/磁力链接:" url if [ -z "$url" ]; then echo -e "${RED}错误:下载链接不能为空!${NC}" exit 1 fi # 目标目录 save_dir="$HOME/Downloads" # 不存在自动创建 mkdir -p "$save_dir" # 拼接完整路径,无重复拼接问题 output_path="${save_dir}/${filename}" log_file="$HOME/aria2_download.log" echo "" echo -e "${GREEN}===== 下载配置信息 =====${NC}" echo "保存文件名:$filename" echo "完整保存路径:$output_path" echo "下载链接:$url" echo "日志文件:$log_file" echo "" echo -e "${BLUE}任务后台运行,关闭终端不中断下载${NC}" echo "实时查看进度命令:tail -f $log_file" echo "" # 后台多线程断点续传下载 nohup aria2c -c -s 16 -x 16 -o "$output_path" "$url" > "$log_file" 2>&1 & pid=$! echo -e "${GREEN}后台下载已启动,进程PID:$pid${NC}" echo "停止当前任务:kill $pid" |3,0,4,1,50,0,1783578481,"#!/bin/bash","","# 颜色定义","RED='\\033[0;31m'","GREEN='\\033[0;32m'","BLUE='\\033[0;34m'","NC='\\033[0m'","","echo -e \"${BLUE}================ Aria2 交互式后台下载工具 ================${NC}\"","echo \"\"","","# 1. 先输入文件名","read -p \"① 请输入保存文件名(带后缀,例 ubuntu.iso):\" filename","if [ -z \"$filename\" ]; then"," echo -e \"${RED}错误:文件名不能为空!${NC}\"",>12 |<" exit 1","fi","","# 2. 再输入下载链接","read -p \"② 请输入下载URL/磁力链接:\" url","if [ -z \"$url\" ]; then"," echo -e \"${RED}错误:下载链接不能为空!${NC}\""," exit 1","fi","","# 目标目录","save_dir=\"$HOME/Downloads\"","# 不存在自动创建","mkdir -p \"$save_dir\"","# 拼接完整路径,无重复拼接问题","output_path=\"${save_dir}/${filename}\"","log_file=\"$HOME/aria2_download.log\"","","echo \"\"",>57 |<"echo -e \"${GREEN}===== 下载配置信息 =====${NC}\"","echo \"保存文件名:$filename\"","echo \"完整保存路径:$output_path\"","echo \"下载链接:$url\"","echo \"日志文件:$log_file\"","echo \"\"","echo -e \"${BLUE}任务后台运行,关闭终端不中断下载${NC}\"","echo \"实时查看进度命令:tail -f $log_file\"","echo \"\"","","# 后台多线程断点续传下载","nohup aria2c -c -s 16 -x 16 -o \"$output_path\" \"$url\" > \"$log_file\" 2>&1 &",>8 |<"pid=$!","","echo -e \"${GREEN}后台下载已启动,进程PID:$pid${NC}\"","echo \"停止当前任务:kill $pid\"" "5 LINE 0 h # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' echo -e "${BLUE}================ Aria2 交互式后台下载工具 ================${NC}" echo "" # 1. 先输入文件名 read -p "① 请输入保存文件名(带后缀,例 ubuntu.iso):" filename if [ -z "$filename" ]; then echo -e "${RED}错误:文件名不能为空!${NC}" exit 1 fi # 2. 再输入下载链接 read -p "② 请输入下载URL/磁力链接:" url if [ -z "$url" ]; then echo -e "${RED}错误:下载链接不能为空!${NC}" exit 1 fi # 目标目录 save_dir="$HOME/streamrecordings" # 不存在自动创建 mkdir -p "$save_dir" # 拼接完整路径,无重复拼接问题 output_path="${save_dir}/${filename}" log_file="$HOME/aria2_download.log" echo "" echo -e "${GREEN}===== 下载配置信息 =====${NC}" echo "保存文件名:$filename" echo "完整保存路径:$output_path" echo "下载链接:$url" echo "日志文件:$log_file" echo "" echo -e "${BLUE}任务后台运行,关闭终端不中断下载${NC}" echo "实时查看进度命令:tail -f $log_file" echo "" # 后台多线程断点续传下载 nohup aria2c -c -s 16 -x 16 -o "$output_path" "$url" > "$log_file" 2>&1 & pid=$! echo -e "${GREEN}后台下载已启动,进程PID:$pid${NC}" echo "停止当前任务:kill $pid" |3,0,5,1,50,0,1783578328,"h","","# 颜色定义","RED='\\033[0;31m'","GREEN='\\033[0;32m'","BLUE='\\033[0;34m'","NC='\\033[0m'","","echo -e \"${BLUE}================ Aria2 交互式后台下载工具 ================${NC}\"","echo \"\"","","# 1. 先输入文件名","read -p \"① 请输入保存文件名(带后缀,例 ubuntu.iso):\" filename","if [ -z \"$filename\" ]; then"," echo -e \"${RED}错误:文件名不能为空!${NC}\""," exit 1",>4 |<"fi","","# 2. 再输入下载链接","read -p \"② 请输入下载URL/磁力链接:\" url","if [ -z \"$url\" ]; then"," echo -e \"${RED}错误:下载链接不能为空!${NC}\""," exit 1","fi","","# 目标目录","save_dir=\"$HOME/streamrecordings\"","# 不存在自动创建","mkdir -p \"$save_dir\"","# 拼接完整路径,无重复拼接问题","output_path=\"${save_dir}/${filename}\"","log_file=\"$HOME/aria2_download.log\"","","echo \"\"",>57 |<"echo -e \"${GREEN}===== 下载配置信息 =====${NC}\"","echo \"保存文件名:$filename\"","echo \"完整保存路径:$output_path\"","echo \"下载链接:$url\"","echo \"日志文件:$log_file\"","echo \"\"","echo -e \"${BLUE}任务后台运行,关闭终端不中断下载${NC}\"","echo \"实时查看进度命令:tail -f $log_file\"","echo \"\"","","# 后台多线程断点续传下载","nohup aria2c -c -s 16 -x 16 -o \"$output_path\" \"$url\" > \"$log_file\" 2>&1 &",>8 |<"pid=$!","","echo -e \"${GREEN}后台下载已启动,进程PID:$pid${NC}\"","echo \"停止当前任务:kill $pid\"" "6 LINE 0 #!/bin/bash # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' echo -e "${BLUE}================ Aria2 交互式后台下载工具 ================${NC}" echo "" # 1. 先输入文件名 read -p "① 请输入保存文件名(带后缀,例 ubuntu.iso):" filename if [ -z "$filename" ]; then echo -e "${RED}错误:文件名不能为空!${NC}" exit 1 fi # 2. 再输入下载链接 read -p "② 请输入下载URL/磁力链接:" url if [ -z "$url" ]; then echo -e "${RED}错误:下载链接不能为空!${NC}" exit 1 fi # 指定保存目录 save_dir="$HOME/streamrecordings" # 不存在则自动创建 mkdir -p "$save_dir" output_path="$save_dir/$filename" log_file="$HOME/aria2_download.log" echo "" echo -e "${GREEN}===== 下载配置信息 =====${NC}" echo "保存文件名:$filename" echo "完整保存路径:$output_path" echo "下载链接:$url" echo "日志文件:$log_file" echo "" echo -e "${BLUE}任务后台运行,关闭终端不中断下载${NC}" echo "实时查看进度命令:tail -f $log_file" echo "" # nohup后台下载,多线程+断点续传 nohup aria2c -c -s 16 -x 16 -o "$output_path" "$url" > "$log_file" 2>&1 & pid=$! echo -e "${GREEN}后台下载已启动,进程PID:$pid${NC}" echo "停止当前任务:kill $pid" echo -e "${BLUE}=========================================================${NC}" |3,0,6,1,50,0,1783578221,"#!/bin/bash","","# 颜色定义","RED='\\033[0;31m'","GREEN='\\033[0;32m'","BLUE='\\033[0;34m'","NC='\\033[0m'","","echo -e \"${BLUE}================ Aria2 交互式后台下载工具 ================${NC}\"","echo \"\"","","# 1. 先输入文件名","read -p \"① 请输入保存文件名(带后缀,例 ubuntu.iso):\" filename","if [ -z \"$filename\" ]; then"," echo -e \"${RED}错误:文件名不能为空!${NC}\"",>12 |<" exit 1","fi","","# 2. 再输入下载链接","read -p \"② 请输入下载URL/磁力链接:\" url","if [ -z \"$url\" ]; then"," echo -e \"${RED}错误:下载链接不能为空!${NC}\""," exit 1","fi","","# 指定保存目录","save_dir=\"$HOME/streamrecordings\"","# 不存在则自动创建","mkdir -p \"$save_dir\"","output_path=\"$save_dir/$filename\"","log_file=\"$HOME/aria2_download.log\"","","echo \"\"","echo -e \"${GREEN}===== 下载配置信息 =====${NC}\"",>38 |<"echo \"保存文件名:$filename\"","echo \"完整保存路径:$output_path\"","echo \"下载链接:$url\"","echo \"日志文件:$log_file\"","echo \"\"","echo -e \"${BLUE}任务后台运行,关闭终端不中断下载${NC}\"","echo \"实时查看进度命令:tail -f $log_file\"","echo \"\"","","# nohup后台下载,多线程+断点续传","nohup aria2c -c -s 16 -x 16 -o \"$output_path\" \"$url\" > \"$log_file\" 2>&1 &","pid=$!","",>67 |<"echo -e \"${GREEN}后台下载已启动,进程PID:$pid${NC}\"","echo \"停止当前任务:kill $pid\"","echo -e \"${BLUE}=========================================================${NC}\"" "7 LINE 0 #!/bin/bash # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' echo -e "${BLUE}================ Aria2 交互式后台下载工具 ================${NC}" echo "" # 1. 先输入文件名 read -p "① 请输入保存文件名(带后缀,例 ubuntu.iso):" filename if [ -z "$filename" ]; then echo -e "${RED}错误:文件名不能为空!${NC}" exit 1 fi # 2. 再输入下载链接 read -p "② 请输入下载URL/磁力链接:" url if [ -z "$url" ]; then echo -e "${RED}错误:下载链接不能为空!${NC}" exit 1 fi # 下载保存目录 save_dir="$HOME/Downloads" mkdir -p "$save_dir" output_path="$save_dir/$filename" log_file="$HOME/aria2_download.log" echo "" echo -e "${GREEN}===== 下载配置信息 =====${NC}" echo "保存文件名:$filename" echo "完整保存路径:$output_path" echo "下载链接:$url" echo "日志文件:$log_file" echo "" echo -e "${BLUE}任务后台运行,关闭终端不中断下载${NC}" echo "实时查看进度命令:tail -f $log_file" echo "" # nohup后台下载,多线程+断点续传 nohup aria2c -c -s 16 -x 16 -o "$output_path" "$url" > "$log_file" 2>&1 & pid=$! echo -e "${GREEN}后台下载已启动,进程PID:$pid${NC}" echo "停止当前任务:kill $pid" echo -e "${BLUE}=========================================================${NC}" |3,0,7,1,49,0,1783577906,"#!/bin/bash","","# 颜色定义","RED='\\033[0;31m'","GREEN='\\033[0;32m'","BLUE='\\033[0;34m'","NC='\\033[0m'","","echo -e \"${BLUE}================ Aria2 交互式后台下载工具 ================${NC}\"","echo \"\"","","# 1. 先输入文件名","read -p \"① 请输入保存文件名(带后缀,例 ubuntu.iso):\" filename","if [ -z \"$filename\" ]; then"," echo -e \"${RED}错误:文件名不能为空!${NC}\"",>12 |<" exit 1","fi","","# 2. 再输入下载链接","read -p \"② 请输入下载URL/磁力链接:\" url","if [ -z \"$url\" ]; then"," echo -e \"${RED}错误:下载链接不能为空!${NC}\""," exit 1","fi","","# 下载保存目录","save_dir=\"$HOME/Downloads\"","mkdir -p \"$save_dir\"","output_path=\"$save_dir/$filename\"","log_file=\"$HOME/aria2_download.log\"","","echo \"\"","echo -e \"${GREEN}===== 下载配置信息 =====${NC}\"","echo \"保存文件名:$filename\"",>44 |<"echo \"完整保存路径:$output_path\"","echo \"下载链接:$url\"","echo \"日志文件:$log_file\"","echo \"\"","echo -e \"${BLUE}任务后台运行,关闭终端不中断下载${NC}\"","echo \"实时查看进度命令:tail -f $log_file\"","echo \"\"","","# nohup后台下载,多线程+断点续传","nohup aria2c -c -s 16 -x 16 -o \"$output_path\" \"$url\" > \"$log_file\" 2>&1 &","pid=$!","","echo -e \"${GREEN}后台下载已启动,进程PID:$pid${NC}\"",>41 |<"echo \"停止当前任务:kill $pid\"","echo -e \"${BLUE}=========================================================${NC}\"" "8 LINE 0 #!/bin/bash # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' clear echo -e "${BLUE}================ Aria2 交互式后台下载工具 ================${NC}" echo "" # 1. 先输入保存文件名 read -p "① 请输入保存文件名(带后缀,例 ubuntu.iso):" filename if [ -z "$filename" ]; then echo -e "${RED}错误:文件名不能为空!${NC}" exit 1 fi # 2. 再输入下载链接 read -p "② 请输入下载URL/磁力链接:" url if [ -z "$url" ]; then echo -e "${RED}错误:下载链接不能为空!${NC}" exit 1 fi # 配置路径 save_dir="$HOME/Downloads" mkdir -p "$save_dir" output_path="$save_dir/$filename" log_file="$HOME/aria2_download.log" echo "" echo -e "${GREEN}===== 下载配置信息 =====${NC}" echo "保存文件名:$filename" echo "完整保存路径:$output_path" echo "下载链接:$url" echo "日志文件:$log_file" echo "" echo -e "${BLUE}任务将后台运行,关闭终端不会中断下载${NC}" echo "实时查看进度:tail -f $log_file" echo "" # 后台启动 aria2c 多线程断点续传 nohup aria2c -c -s 16 -x 16 -o "$output_path" "$url" > "$log_file" 2>&1 & pid=$! echo -e "${GREEN}后台下载已启动,进程PID:$pid${NC}" echo "单独停止该任务执行:kill $pid" echo -e "${BLUE}=========================================================${NC}" |3,0,8,1,50,0,1783577616,"#!/bin/bash","","# 颜色定义","RED='\\033[0;31m'","GREEN='\\033[0;32m'","BLUE='\\033[0;34m'","NC='\\033[0m'","","clear","echo -e \"${BLUE}================ Aria2 交互式后台下载工具 ================${NC}\"","echo \"\"","","# 1. 先输入保存文件名","read -p \"① 请输入保存文件名(带后缀,例 ubuntu.iso):\" filename","if [ -z \"$filename\" ]; then",>62 |<" echo -e \"${RED}错误:文件名不能为空!${NC}\""," exit 1","fi","","# 2. 再输入下载链接","read -p \"② 请输入下载URL/磁力链接:\" url","if [ -z \"$url\" ]; then"," echo -e \"${RED}错误:下载链接不能为空!${NC}\""," exit 1","fi","","# 配置路径","save_dir=\"$HOME/Downloads\"","mkdir -p \"$save_dir\"","output_path=\"$save_dir/$filename\"","log_file=\"$HOME/aria2_download.log\"","","echo \"\"",>57 |<"echo -e \"${GREEN}===== 下载配置信息 =====${NC}\"","echo \"保存文件名:$filename\"","echo \"完整保存路径:$output_path\"","echo \"下载链接:$url\"","echo \"日志文件:$log_file\"","echo \"\"","echo -e \"${BLUE}任务将后台运行,关闭终端不会中断下载${NC}\"","echo \"实时查看进度:tail -f $log_file\"","echo \"\"","","# 后台启动 aria2c 多线程断点续传",>81 |<"nohup aria2c -c -s 16 -x 16 -o \"$output_path\" \"$url\" > \"$log_file\" 2>&1 &","pid=$!","","echo -e \"${GREEN}后台下载已启动,进程PID:$pid${NC}\"","echo \"单独停止该任务执行:kill $pid\"","echo -e \"${BLUE}=========================================================${NC}\"" "9 LINE 0 #!/bin/bash # # monitor.sh - 开播监测脚本 # 只负责“监测”本身,检测使用 streamlink --stream-url(只探测、不下载,不产生视频文件)。 # 检测到开播后,会调用 record.sh 单独拉起一个独立的录制进程(互不影响,remove 不会打断正在进行的录制)。 # # 用法: # 添加监测:./monitor.sh add # 移除监测:./monitor.sh remove # 查询状态:./monitor.sh list # # 说明: # - 监测状态下,每 MONITOR_INTERVAL 秒探测一次是否开播(不下载视频,只探测流地址)。 # - 探测到开播(退出码0):调用 `python ding.py {name}_on` 通知,然后调用 # `record.sh start {name} monitored` 单独启动一个独立的录制进程(有自己的 .record.pid, # 和监测进程完全独立),随后监测进程转入“等待录制结束”状态。 # - 录制进程内部的断流重连、下播判定(2分钟未恢复)、`{name}_off` 通知,都由 record.sh 自己负责。 # monitor.sh 只是定期检查 record.sh 的进程是否还活着,一旦发现录制已结束,就自动回到监测状态。 # - remove 只会终止监测进程本身,不会影响正在进行的录制(如果当时正好在录制的话, # 用 record.sh stop 单独去停止录制)。 # - 手动中断(remove / Ctrl+C)不会对文件夹内任何文件做修改。 # 解析脚本自身的绝对路径 SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" # ================== 以下为需要根据实际情况修改的配置 ================== BASE_DIR="/home/uftp/stripchat" # 主播文件夹的根目录(对应需求里的“xxx文件夹”) URL_TEMPLATE="https://zh.stripchat.com/%s" # 直播地址模板,%s 会替换为 name NOTIFY_SCRIPT="/home/uftp/ding.py" # ding.py 的绝对路径 PYTHON_BIN="python3" # 如果环境里是 python3,改成 python3 RECORD_SCRIPT="/home/uftp/record.sh" # record.sh 的绝对路径 MONITOR_INTERVAL=300 # 监测间隔(秒),默认5分钟 RECORD_POLL_INTERVAL=10 # 录制期间,检查录制进程是否还活着的轮询间隔(秒) ENABLE_LOG=0 # 默认不产生日志;排查问题时改成 1,日志会写到每个主播文件夹下的 .monitor.log # ======================================================================= ACTION="$1" NAME="$2" # ---------- list:查询当前正在监测的主播 ---------- if [ "$ACTION" = "list" ]; then if [ ! -d "$BASE_DIR" ]; then echo "$BASE_DIR 不存在。" exit 0 fi FOUND=0 for pid_file in "$BASE_DIR"/*/.monitor.pid; do |3,0,9,1,50,0,1783107726,"#!/bin/bash","#","# monitor.sh - 开播监测脚本","# 只负责“监测”本身,检测使用 streamlink --stream-url(只探测、不下载,不产生视频文件)。","# 检测到开播后,会调用 record.sh 单独拉起一个独立的录制进程(互不影响,remove 不会打断正在进行的录制)。","#","# 用法:","# 添加监测:./monitor.sh add ","# 移除监测:./monitor.sh remove ",>38 |<"# 查询状态:./monitor.sh list","#","# 说明:","# - 监测状态下,每 MONITOR_INTERVAL 秒探测一次是否开播(不下载视频,只探测流地址)。","# - 探测到开播(退出码0):调用 `python ding.py {name}_on` 通知,然后调用","# `record.sh start {name} monitored` 单独启动一个独立的录制进程(有自己的 .record.pid,","# 和监测进程完全独立),随后监测进程转入“等待录制结束”状态。",>135 |<"# - 录制进程内部的断流重连、下播判定(2分钟未恢复)、`{name}_off` 通知,都由 record.sh 自己负责。","# monitor.sh 只是定期检查 record.sh 的进程是否还活着,一旦发现录制已结束,就自动回到监测状态。","# - remove 只会终止监测进程本身,不会影响正在进行的录制(如果当时正好在录制的话,","# 用 record.sh stop 单独去停止录制)。",>86 |<"# - 手动中断(remove / Ctrl+C)不会对文件夹内任何文件做修改。","","# 解析脚本自身的绝对路径","SCRIPT_PATH=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)/$(basename \"${BASH_SOURCE[0]}\")\"","","# ================== 以下为需要根据实际情况修改的配置 ==================","BASE_DIR=\"/home/uftp/stripchat\" # 主播文件夹的根目录(对应需求里的“xxx文件夹”)",>96 |<"URL_TEMPLATE=\"https://zh.stripchat.com/%s\" # 直播地址模板,%s 会替换为 name","NOTIFY_SCRIPT=\"/home/uftp/ding.py\" # ding.py 的绝对路径","PYTHON_BIN=\"python3\" # 如果环境里是 python3,改成 python3","RECORD_SCRIPT=\"/home/uftp/record.sh\" # record.sh 的绝对路径","","MONITOR_INTERVAL=300 # 监测间隔(秒),默认5分钟",>116 |<"RECORD_POLL_INTERVAL=10 # 录制期间,检查录制进程是否还活着的轮询间隔(秒)","","ENABLE_LOG=0 # 默认不产生日志;排查问题时改成 1,日志会写到每个主播文件夹下的 .monitor.log","# =======================================================================","","ACTION=\"$1\"","NAME=\"$2\"","","# ---------- list:查询当前正在监测的主播 ----------","if [ \"$ACTION\" = \"list\" ]; then",>37 |<" if [ ! -d \"$BASE_DIR\" ]; then"," echo \"$BASE_DIR 不存在。\""," exit 0"," fi",""," FOUND=0"," for pid_file in \"$BASE_DIR\"/*/.monitor.pid; do" "- CHAR 0 #!/bin/bas |3,0,36,0,1,0,1783578326,"#!/bin/bas" # File marks: '0 38 0 ~/lazy_list.json |4,48,38,0,1783586086,"~/lazy_list.json" '1 1 0 ~/lazy_list |4,49,1,0,1783586080,"~/lazy_list" '2 177 26 ~/butoclip.sh |4,50,177,26,1783581356,"~/butoclip.sh" '3 1 26 ~/butoclip.sh |4,51,1,26,1783580283,"~/butoclip.sh" '4 173 26 ~/butoclip.sh |4,52,173,26,1783580283,"~/butoclip.sh" '5 159 26 ~/bjclip.sh |4,53,159,26,1783578993,"~/bjclip.sh" '6 1 0 ~/streamclip.sh |4,54,1,0,1783578985,"~/streamclip.sh" '7 50 78 ~/aria2_download.sh |4,55,50,78,1783578483,"~/aria2_download.sh" '8 1 78 ~/aria2_download.sh |4,56,1,78,1783578330,"~/aria2_download.sh" '9 51 78 ~/aria2_download.sh |4,57,51,78,1783578330,"~/aria2_download.sh" # Jumplist (newest first): -' 38 0 ~/lazy_list.json |4,39,38,0,1783586086,"~/lazy_list.json" -' 1 0 ~/lazy_list.json |4,39,1,0,1783586082,"~/lazy_list.json" -' 1 0 ~/lazy_list |4,39,1,0,1783586080,"~/lazy_list" -' 1 0 ~/lazy_list |4,39,1,0,1783586080,"~/lazy_list" -' 177 26 ~/butoclip.sh |4,39,177,26,1783581356,"~/butoclip.sh" -' 177 26 ~/butoclip.sh |4,39,177,26,1783581356,"~/butoclip.sh" -' 177 26 ~/butoclip.sh |4,39,177,26,1783581356,"~/butoclip.sh" -' 177 26 ~/butoclip.sh |4,39,177,26,1783581356,"~/butoclip.sh" -' 1 26 ~/butoclip.sh |4,39,1,26,1783581351,"~/butoclip.sh" -' 1 26 ~/butoclip.sh |4,39,1,26,1783581351,"~/butoclip.sh" -' 1 26 ~/butoclip.sh |4,39,1,26,1783581351,"~/butoclip.sh" -' 1 26 ~/butoclip.sh |4,39,1,26,1783581351,"~/butoclip.sh" -' 173 26 ~/butoclip.sh |4,39,173,26,1783580283,"~/butoclip.sh" -' 173 26 ~/butoclip.sh |4,39,173,26,1783580283,"~/butoclip.sh" -' 173 26 ~/butoclip.sh |4,39,173,26,1783580283,"~/butoclip.sh" -' 173 26 ~/butoclip.sh |4,39,173,26,1783580283,"~/butoclip.sh" -' 1 0 ~/butoclip.sh |4,39,1,0,1783580273,"~/butoclip.sh" -' 1 0 ~/butoclip.sh |4,39,1,0,1783580273,"~/butoclip.sh" -' 1 0 ~/butoclip.sh |4,39,1,0,1783580273,"~/butoclip.sh" -' 1 0 ~/butoclip.sh |4,39,1,0,1783580273,"~/butoclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 159 26 ~/bjclip.sh |4,39,159,26,1783578993,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/bjclip.sh |4,39,1,0,1783578991,"~/bjclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 1 0 ~/streamclip.sh |4,39,1,0,1783578985,"~/streamclip.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" -' 50 78 ~/aria2_download.sh |4,39,50,78,1783578483,"~/aria2_download.sh" # History of marks within files (newest to oldest): > ~/lazy_list.json * 1783586085 0 " 38 0 ^ 38 1 . 38 0 + 38 0 > ~/lazy_list * 1783586079 0 " 1 0 > ~/butoclip.sh * 1783581356 0 " 177 26 ^ 177 27 . 177 26 + 1 15 + 1 19 + 177 26 > ~/bjclip.sh * 1783578992 0 " 159 26 ^ 159 27 . 159 26 + 159 26 > ~/streamclip.sh * 1783578985 0 " 1 0 > ~/aria2_download.sh * 1783578482 0 " 50 78 ^ 50 79 . 50 78 + 1 11 + 1 78 + 1 11 + 50 78 > ~/aria2_download.s * 1783578287 0 " 1 0 > ~/fix_merge.sh * 1783114848 0 " 212 42 ^ 212 43 . 212 42 + 399 42 + 212 42 > ~/monitor.sh * 1783107727 0 " 224 3 ^ 224 4 . 224 3 + 1 3 + 1 11 + 1 3 + 1 11 + 224 3 > ~/record.sh * 1783107305 0 " 347 3 ^ 347 4 . 347 3 + 1317 3 + 1141 3 + 983 19 + 985 24 + 965 180 + 933 3 + 646 3 + 1 11 + 347 3 > ~/.bashrc * 1783106619 0 " 121 0 ^ 96 16 . 96 15 + 95 21 + 96 15 > ~/monitor_strip.sh * 1783105119 0 " 217 3 ^ 217 4 . 217 3 + 1 11 + 217 3 > ~/stripchat/record.sh * 1783098106 0 " 1 0 > ~/record_strip.sh * 1783097947 0 " 320 3 ^ 320 4 . 320 3 + 447 3 + 1 29 + 1 33 + 1 24 + 1 3 + 1 11 + 320 3 > ~/ding_start.py * 1783074863 0 " 34 17 ^ 34 18 . 34 17 + 1 15 + 34 17 > ~/ding.py * 1783074855 0 " 30 11 ^ 43 1 . 32 12 + 33 17 + 36 0 + 37 0 + 39 0 + 40 0 + 41 0 + 42 0 + 43 0 + 32 12 > ~/dingon.py * 1783074453 0 " 34 17 ^ 34 18 . 34 17 + 1 15 + 34 17 > ~/recordbug.sh * 1783043332 0 " 277 3 ^ 277 4 . 277 3 + 537 3 + 277 3 > /tmp/crontab.sCQKQk/crontab * 1783042724 0 " 1 0 > ~/fixtime.sh * 1783037997 0 " 89 70 ^ 89 71 . 89 70 + 89 70 > ~/merge.sh * 1783037241 0 " 118 27 ^ 118 28 . 118 27 + 118 27 > ~/scp-standalone/keys.txt * 1783022861 0 " 5 37 ^ 5 38 . 5 37 + 1 39 + 5 37 > ~/pkawai.py * 1783021536 0 " 39 12 ^ 39 13 . 39 12 + 39 12