失败时中断 curl 范围下载(下载了空文件)

失败时中断 curl 范围下载(下载了空文件)

我今天发现我可以使用 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

相关内容