Faz o que eu espero
cat <(shuf my_ordered_playlist.m3u)
echo <(shuf my_ordered_playlist.m3u)
vlc my_ordered_playlist.m3u
Não faz o que eu espero
vlc <(shuf my_ordered_playlist.m3u)
O que eu quero fazer
- Reproduza os elementos da minha lista de reprodução em uma ordem não determinística em cada invocação de vlc e
- ser capaz de retroceder ao pressionar o botão Voltar (que
--random
fornece um suporte ruim para).
Outras notas
- Posso conseguir o que quero com um documento aqui ou
<<<
?
Porque
vlc
é mal concebido nesta matéria. Pior, ele é mal projetado duas vezes :provavelmente tem suas razões* para funcionar de uma maneira que cria as duas desvantagens a seguir:
inotifywait -m my_ordered_playlist.m3u
revela que apósvlc my_ordered_playlist.m3u
o arquivo é aberto e lido várias vezes. Não investiguei se há buscas envolvidas. Quando você usa<(shuf my_ordered_playlist.m3u)
vlc
obtém dados canalizadosshuf
e é capaz de lê-los exatamente uma vez. Aparentemente isso não é suficiente. Em um mundo perfeitovlc
leria os dados apenas uma vez e deveria ser suficiente.vlc
se recusa a trabalhar com uma lista de reprodução sem extensão. No Zsh existe uma=()
sintaxe semelhante a<()
; a diferença é que o shell cria um arquivo regular temporário em vez de um pipe. Esse arquivo pode ser lido várias vezes e é pesquisável. Parece uma boa solução para o seu problema (se você estiver bem com o Zsh), mas normalmente o nome do arquivo está sem a extensão, entãovlc =(shuf my_ordered_playlist.m3u)
ainda não funciona.Mas tem um jeito :
Execute os comandos em um subshell se desejar que a alteração
TMPSUFFIX
não afete o shell principal.*A declaração "
vlc
é mal projetado" recebeu um comentário útil:Uma opção alternativa é fazer isso em duas etapas e passar uma lista de reprodução já embaralhada para o VLC em um arquivo em vez de na linha de comando.
Você pode até estendê-lo para
Para limpar após a saída do VLC.
Você pode até usar um alias bash
e depois é só correr
shuf_vlc
para embaralhar sua playlist.A razão pela qual seu comando não funciona é porque ainda é um pipe e está sujeito às limitações de um pipe.
Limitações da Substituição do Processo
Dependendo do comportamento que você está vendo, pode ser que o VLC esteja procurando por uma lista de reprodução válida (para verificar UTF-8/16 etc ou que o arquivo foi construído corretamente), mas não está realmente lendo a lista de reprodução no primeiro passar. Ele tenta voltar para realmente carregar os arquivos e, devido a "nenhuma busca de arquivo", não consegue ler a lista de reprodução. A primeira passagem esvazia efetivamente o pipe que recebe um descritor de arquivo e, em seguida, não há nada com que trabalhar.
Alternativamente, o VLC verifica se o arquivo é "real" e capaz de ser
seek
editado e ao descobrir que não pode simplesmente se recusar a abri-lo, pois não poderá analisar tanto para frente quanto para trás no arquivo.Seus dois primeiros comandos são simples e não esperam nada mais do que um fluxo legível, o VLC quer algo real que possa segurar.