Dependências:

Dependências:

Quero adicionar o emblema padrão aos vídeos que terminei de assistir. Alguma maneira direta e não manual de executar um script se e exatamente se um vídeo tiver terminado de ser reproduzido? Pode ser para qualquer reprodutor de vídeo Linux (mint/ubuntu).

Responder1

vlc --play-and-exit video.mp4 && echo "Terminated"

Substitua echo "Terminated"pelo comando real que você deseja executar. Isso &&significa que se o vlc sair com um código de erro, o comando não será executado. Se você deseja que o comando seja executado mesmo que ocorra um erro,

vlc --play-and-exit video.mp4; echo "Terminated"

Se você fornecer mais arquivos ao vlc, o comando só será executadodepois que toda a mídia tiver sido reproduzida. Por exemplo,

vlc --play-and-exit s0.mp3 s1.mp4 && shutdown now

significa que o sistema será desligado imediatamente após a reprodução dos dois arquivos.

Se você quiserrealizar uma ação paracadaarquivo reproduzido, você pode usar este script de shell (vamos chamá-lo play.sh):

#!/bin/sh
for file in "$@"; do
    vlc --play-and-exit "$file"
    echo "File $file has been played."
done

Em seguida, execute-o em vários arquivos:

sh play.sh file1.mp3 'Me & You.mp4' 'file 3.wav'

Não se esqueça de citar os arquivos quando apropriado (especialmente em espaços em branco e caracteres especiais como &, *, etc.).


A --play-and-exitbandeira também está disponível para cvlc.

Responder2

Já que perguntei, pensei em compartilhar o hack rápido baseado em wrapper que criei e que faz isso. Eu criei o seguinte wrapper vlc e configurei arquivos de vídeo para serem abertos nele, em vez de vlc diretamente. Ele suporta apenas um arquivo por vez. Se a coisa que se move no vlc enquanto reproduz um arquivo vai até o final, ele executará o tag watchedcomando no final se cerca de 60% do vídeo tiver sido assistido.

#!/bin/bash
#This depends on the cli interface having been activated in the preferences
# This while loop feeds the `get_length` vlc cli command to cli every 0.1 s
(while :; do echo get_length; sleep 0.1 ; done) | 
#Pass all arguments to vlc and set it up to be fed from the `get_length` while loop
/usr/bin/vlc "$@" |
ruby  -n -e '
    BEGIN { 
    cons_empty=0
    nlines_read=0
  }
    #Strip vlc cli noise
    $_=$_.sub(/^[> ]*/,"")
    #Watch consecutive (cons) empty lines
    if $_.match(/^\s*$/) 
      cons_empty += 1
    else
      #Assume each nonempty stdin line is the duration
      duration = $_.chomp.to_i
      cons_empty = 0
      nlines_read += 1
    end
    #On 10 consecutive empty lines, assume the file has finished playing
    if cons_empty == 10
      time_watched = nlines_read * 0.1
      p time_watched: time_watched, duration: duration
      ret = (time_watched > 0.6 * duration) ? 1 : 0
      exit ret
    end
    ' ||
tag watched "$@" #1 exit means finished watching

Está funcionando em vez de um código bonito, mas é apenas uma solução rápida para um aborrecimento.

Dependências:

bash, ruby, + replace tag watchedpelo seu comando de marcação real.

informação relacionada