Зависимости:

Зависимости:

Я хочу добавить эмблему по умолчанию к видео, которые я закончил смотреть. Есть ли простой, не ручной способ запустить скрипт, если и именно если видео закончило воспроизводиться? Может быть для любого видеоплеера 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на фактическую команду тегирования.

Связанный контент