Quiero agregar el emblema predeterminado a los videos que terminé de ver. ¿Alguna forma sencilla y no manual de ejecutar un script si y exactamente si un video ha terminado de reproducirse? Puede ser para cualquier reproductor de video Linux (mint/ubuntu).
Respuesta1
vlc --play-and-exit video.mp4 && echo "Terminated"
Sustitúyalo echo "Terminated"
por el comando real que desea ejecutar. Esto &&
significa que si vlc sale con un código de error, el comando no se ejecutará. Si desea que el comando se ejecute incluso si ocurre un error,
vlc --play-and-exit video.mp4; echo "Terminated"
Si proporciona más archivos a vlc, el comando solo se ejecutaráuna vez que se hayan reproducido todos los medios. Por ejemplo,
vlc --play-and-exit s0.mp3 s1.mp4 && shutdown now
significa que el sistema se apagará inmediatamente después de que se hayan reproducido los dos archivos.
Si quieresrealizar una acción paracadaarchivo reproducido, puedes usar este script de shell (llamémoslo play.sh
):
#!/bin/sh
for file in "$@"; do
vlc --play-and-exit "$file"
echo "File $file has been played."
done
Luego ejecútelo en varios archivos:
sh play.sh file1.mp3 'Me & You.mp4' 'file 3.wav'
No olvide citar los archivos cuando sea apropiado (especialmente en espacios en blanco y caracteres especiales como &
, *
etc.).
La --play-and-exit
bandera también está disponible para cvlc
.
Respuesta2
Como pregunté, pensé en compartir el truco rápido basado en contenedor que se me ocurrió y que lo hace. Creé el siguiente contenedor vlc y configuré archivos de video para abrirlos en él en lugar de vlc directamente. Sólo admite un archivo a la vez. Si lo que se mueve en vlc mientras reproduce un archivo llega hasta el final, ejecutará el tag watched
comando al final si se ha visto aproximadamente el 60% del video.
#!/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
Es un código funcional en lugar de hermoso, pero es solo una solución rápida para una molestia.
Dependencias:
bash, ruby, + reemplace tag watched
con su comando de etiquetado real.