我今天发现我可以使用 curl 下载一定范围内的多个文件,这很棒。
$ curl -O "http://example.com/[001-100].png"
(https://everything.curl.dev/cmdline/globbing)
另外我发现我可以使用-f
标志来防止在丢失的情况下保存空文件(假设我们检查 001-100 范围内的所有文件,但只有从 001 到 050 的文件)。
我的问题是我的范围真的很大。我想保存一些在线流媒体中的视频(它们被分割成大约 5 秒,稍后由我的脚本合并为一个视频)。范围是 00001-10000,但有些视频真的很短(00001-00100)。
我需要一种方法来在返回的文件为空时停止尝试下载视频文件,而不是忽略这种情况。有点像循环/中断。
使用 curl 可以吗?你有什么建议吗?(我只想保存 00001-10000 范围内的所有视频片段,但在没有找到任何其他内容时停止尝试下载)。
更新:
背景:一段长视频被分割成小的 .ts 文件,其片段以连续的整数命名。如果 070 是有效文件,而 071 是空文件,则意味着视频只有 70 个部分,然后我将合并。这些是我下载各部分后将视频合并为单个文件的最后步骤。
$ printf "file '%s'\n" ./*.ts > mylist.txt
$ ffmpeg -f concat -safe 0 -i mylist.txt -c copy final-video.ts
答案1
使用 for/if/break 解决。
#!/bin/bash
URL_prefix='http://example.com/filename_'
URL_var_range_start=1
URL_var_range_stop=10000
URL_var_range_zero_padding=5
URL_sufix='.ts'
echo "Creating videos folder..."
mkdir videos && cd "$_"
echo "Creating video folder..."
mkdir video && cd "$_"
echo "Downloading ts files..."
for i in $(seq -f "%0"$URL_var_range_zero_padding"g" $URL_var_range_start $URL_var_range_stop)
do
DOWNLOAD_URL=$URL_prefix$i$URL_sufix
SAVED_FILE="video_"$i".ts"
CURL_COMMAND="curl -f -s "$DOWNLOAD_URL" -o "$SAVED_FILE
if $CURL_COMMAND; then
echo "Downloading "$SAVED_FILE"..."
else
echo "No more files to download."
break
fi;
done
echo "Creating playlist mylist.txt..."
printf "file '%s'\n" ./*.ts > mylist.txt
echo "Saving the video files into a single final-video.ts file..."
ffmpeg -f concat -safe 0 -i mylist.txt -c copy final-video.ts
echo "Cleaning unused files..."
rm video*.* mylist.txt