Я хочу добавить эмблему по умолчанию к видео, которые я закончил смотреть. Есть ли простой, не ручной способ запустить скрипт, если и именно если видео закончило воспроизводиться? Может быть для любого видеоплеера linux (mint/ubuntu).
решение1
vlc --play-and-exit video.mp4 && echo "Terminated"
Замените echo "Terminated"
на фактическую команду, которую вы хотите запустить. Это &&
означает, что если vlc завершит работу с кодом ошибки, команда не будет выполнена. Если вы хотите, чтобы команда выполнялась даже при возникновении ошибки,
vlc --play-and-exit video.mp4; echo "Terminated"
Если вы предоставите vlc больше файлов, то команда будет выполнена толькопосле того, как все медиа будут воспроизведены. Например,
vlc --play-and-exit s0.mp3 s1.mp4 && shutdown now
означает, что система выключится немедленно после воспроизведения двух файлов.
Если вы хотитевыполнить действие длякаждыйфайл воспроизводится, вы можете использовать этот скрипт оболочки (назовем его play.sh
):
#!/bin/sh
for file in "$@"; do
vlc --play-and-exit "$file"
echo "File $file has been played."
done
Затем выполните его для различных файлов:
sh play.sh file1.mp3 'Me & You.mp4' 'file 3.wav'
Не забывайте заключать файлы в кавычки, когда это уместно (особенно в случае пробелов и специальных символов, таких как &
, *
и т. д.).
Флаг --play-and-exit
также доступен для cvlc
.
решение2
Поскольку я спросил, я подумал, что поделюсь быстрым хаком на основе оболочки, который я придумал, который делает это. Я создал следующую оболочку vlc и настроил видеофайлы на открытие в ней, а не в vlc напрямую. Она поддерживает только один файл за раз. Если то, что движется в vlc при воспроизведении файла, дойдет до самого конца, она выполнит команду tag watched
в конце, если было просмотрено около 60% видео.
#!/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
Это работающий, а не красивый код, но это всего лишь быстрое решение проблемы.
Зависимости:
bash, ruby, + замените tag watched
на фактическую команду тегирования.