открыть видео во время его загрузки в фоновом режиме команда

открыть видео во время его загрузки в фоновом режиме команда

Приведенная ниже команда обрабатывает вывод youtube-dl с помощью sed, чтобы получить имя файла видео.

youtube-dl "$URL" 2> /dev/null | \
sed -n 's/^\[download\] Destination: //p; s/^\[download\] \(.*\) has already been downloade.*/\1/p'

Сразу после того, как youtube-dl закончит загрузку и анализ HTML и начнет загрузку видео, что происходит через пару/несколько секунд после начала выполнения, он выводит имя файла видео, которое будет присвоено после завершения загрузки (с постфиксом, указывающим время .partзагрузки).

Итак, суть проблемы, на которой я застрял, заключается в следующем: как перевести указанную выше команду в фоновый режим (чтобы она продолжала загрузку) и получить имя видеофайла из ее стандартного вывода, чтобы я мог использовать его для открытия видеофайла до завершения его загрузки.

решение1

Вы можете использовать inotifywait:

$ youtube-dl "$URL" &
$ inotifywait  --event create --format '"%f"' . | xargs vlc

Там есть состояние гонки, если ваше соединение очень быстрое (у меня сейчас такое), файл может быть загружен и переименован до того, как ваш плеер его откроет. Кроме того, если youtube-dlон делает что-то вроде загрузки аудио и видео по отдельности, вы можете открыть не тот файл.

решение2

Комментарий @fra-san напомнил мне о readцикле while, который можно использовать для построчной/процедурной обработки вывода (в отличие от функциональной, с помощью каналов). Вы можете использовать оператор <для передачи вывода файла в этот цикл с помощью Bash Process Substitution команды youtube-dl, а также можете отправить его в фоновый режим, добавив , &и цикл while по-прежнему сможет считывать его вывод (это просто чтение файла, созданное BPS).

В ходе тестирования я обнаружил, что могу продолжать нормально воспроизводить видео даже после того, как оно загрузится и будет переименовано, хотя это может быть особенностью MPV.

#!/bin/bash
# ytdl-stream - use youtube-dl to stream videos i.e watch videos as they download
# usage: ytdl-stream [YOUTUBE_DL_OPTIONS] URL 
# you can pipe into it a command to open you video player, e.g:
# echo mpv --mute=yes | ytdl-stream -f 'best[width<=1920,height<=1080]' --write-auto-sub [URL]

test ! -t 0 && player_cmd="$(cat /dev/stdin)" || player_cmd="mpv"

while IFS="" read -r line; do
  filename=$(echo "$line" | sed -n 's/^\[download\] Destination: //p')
  if [[ -z "$filename" ]]; then
    filename=$(echo "$line" | sed -n 's/^\[download\] \(.*\) has already been downloade.*/\1/p')
    [[ -z "$filename" ]] && continue || notify-send "file already downloaded, opening.."
  else
    notify-send "downloading.."
  fi
  withoutExtensions="${filename%.*}"
  withoutExtensions="${withoutExtensions%.*}"
  if [[ -e "$filename" ]]; then
    sleep 0.5 && ($player_cmd "$filename")&
  elif [[ -e "$filename".part ]]; then
    sleep 2
    if [[ -e "$filename".part ]]; then
      notify-send "found .part after sleep again"
      ($player_cmd "$filename".part)&
    else
      sleep 0.5 && ($player_cmd "$withoutExtensions"*)&
    fi
  fi
done < <(youtube-dl "$@" 2> /dev/null)&

Связанный контент