abra o vídeo enquanto ele está sendo baixado em um comando em segundo plano

abra o vídeo enquanto ele está sendo baixado em um comando em segundo plano

O comando abaixo processa a saída do youtube-dl com sed para obter o nome do arquivo do vídeo

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

Imediatamente após o youtube-dl terminar de buscar e analisar o HTML e começar a baixar o vídeo, que ocorre alguns segundos após o início da execução, ele exibe qual será o nome do arquivo do vídeo quando o download for concluído (pós-fixado com um .parttempo de download )

Portanto, o cerne da questão e o que estou travando é: como faço para colocar o comando acima em segundo plano (para que ele continue baixando) e obter o nome do arquivo de vídeo de sua saída padrão, para que eu possa usá-lo para abrir o vídeo arquivo antes de terminar o download.

Responder1

Você poderia usar inotifywait:

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

Há uma condição de corrida aí, se a sua conexão for muito rápida (a minha agora é), o arquivo poderá ser baixado e renomeado antes que o player o abra. Além disso, se youtube-dlfizer algo como baixar áudio e vídeo separadamente, você pode acabar abrindo o arquivo errado.

Responder2

O comentário de @fra-san me lembrou do readloop while que você pode usar para processar a saída linha por linha/processualmente (em oposição a funcionalmente, com pipes), você pode usar o <operador para canalizar a saída de um arquivo para esse loop com substituição do processo Bash do comando youtube-dl, e você também pode enviá-lo para segundo plano adicionando um &e o loop while ainda pode ler a saída dele (é apenas ler um arquivo, que o BPS fez).

por meio de testes, descobri que posso continuar reproduzindo o vídeo normalmente mesmo depois de terminar o download e ser renomeado, embora isso possa ser um recurso do 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)&

informação relacionada