Automatyczna aktualizacja / odświeżanie listy odtwarzania VLC „oglądaj listę odtwarzania” podczas dodawania nowych filmów

3

Czy jest na to sposób?

Chcę uruchomić VLC w trybie pełnoekranowym z automatycznie ładowaną listą odtwarzania. Powiedzmy, że lista odtwarzania byłaby folderem/home/user/videos

W ciągu dnia chcę przesłać kilka filmów na komputer z VLC z tą listą odtwarzania. Przesyłam film do/home/user/videos

Teraz muszę ponownie załadować / ponownie uruchomić VLC, aby zmiany odniosły skutek na liście odtwarzania.

Czy istnieje sposób na odświeżenie listy odtwarzania bez ponownego uruchamiania VLC? Może niech sprawdza nowe pliki co X minut czy coś takiego?

Bolli
źródło
Czy znalazłeś na to rozwiązanie?
hupseb
@hupseb Jeszcze nie, ale projekt został wstrzymany i mam zamiar rozpocząć go ponownie za 2 tygodnie. Dam ci znać, jeśli znajdę rozwiązanie tego problemu - jeśli w międzyczasie to zrobisz, daj mi znać :)
Bolli
Mam go tutaj ... youtube.com/watch?v=Kim5QM0nKfQ, ale wymaga ponownego otwarcia VLC.
hupseb
@hupseb Zamieściłem poniżej swoje rozwiązanie. Znalazłeś jakieś rozwiązanie?
Bolli,

Odpowiedzi:

1

Najpierw przyjrzałem się możliwościom napisania rozszerzenia VLC LUA i jest to bardzo możliwe.

Patrzyłem na to rozszerzenie: http://addons.videolan.org/CONTENT/content-files/140699-addsimilar.lua

Który ma wszystkie potrzebne funkcje. Tak więc ciężka modyfikacja działałaby poprawnie, ale wydawało się, że jest to zbyt dużo pracy dla tego projektu.

Więc przejrzałem trochę więcej i natknąłem się na tę stronę: http://www.cenolan.com/2013/03/looping-video-playlist-omxplayer-raspberry-pi/

Okazuje się, że ten skrypt bash można łatwo zmodyfikować, aby używał VLC lub cvlc.

Tak zrobiłem, a wynik wygląda następująco:

#!/bin/sh

# get rid of the cursor so we don't see it when videos are running
setterm -cursor off

#Time 
TIME=$(date +%H)

# set here the path to the directory containing your videos
VIDEOPATH="/home/user/videos" 

# you can normally leave this alone
SERVICE="cvlc"

# now for our infinite loop!
while true; do
        if ps ax | grep -v grep | grep $SERVICE > /dev/null
        then
        sleep 0;
else
        for entry in $VIDEOPATH/* # You could add .mkv to the end of this or any other file extention, to only play specific extentions
        do
             cvlc --play-and-exit --no-video-title -f "$entry" > /dev/null

        done

fi
done

Powodem, dla którego potrzebuję tej funkcji, jest ekran wideo w kiosku, taki jak projekt, w którym filmy są przesyłane i usuwane przez cały czas.

Jedną z wad tego rozwiązania jest to, że VLC nadal musi się otwierać i zamykać po odtworzeniu każdego filmu, co robi przy użyciu tego skryptu. Tak więc komputer z uruchomionym skryptem musi mieć pusty pulpit (usunięty GUI) i czarne tło. W ten sposób między każdym klipem wideo będzie widoczny tylko około 0,5 - 1 sekundowy czarny ekran.

Skrypt jest nadal w toku, ponieważ dodam do niego kilka dodatkowych funkcji, więc jeśli uznasz go za przydatny i chcesz mój ostatni skrypt, zostaw komentarz, a ja zaktualizuję odpowiedź.

Jeśli masz lepsze rozwiązanie, a nawet rozwiązanie LUA, opublikuj je - a ja zaakceptuję odpowiedź - ale na razie działa to w moim projekcie.

Twoje zdrowie

AKTUALIZACJA na żądanie TheFrost

Oto mój ostatni skrypt, krótko opiszę go poniżej: play.sh

#!/bin/bash

xsetroot

# Set the path to the directory containing your videos
VIDEOPATH="/home/pi/vids/" 

# Time & day
set_TIME() {
TIME=$(date +%H)
DAY=$(date +%u) 
}

set_TIME

# Normally leave this alone
SERVICE="omxplayer"

# Get rid of the cursor so we don't see it when videos are running
setterm -cursor off

# # #
#
#  Play files with omxplayer and close the player when the video is finished
#
# # #
play_files () {
 for entry in $1*
    do
    set_TIME
        # Dont try to play dirs
        if [ ! -d "$entry" ]; then 

            omxplayer -p -o hdmi "$entry" > /dev/null
        fi
    done  
} 

# # #
#
#  Check if its time to play files
#  $1 = hour now, $2 = begin hour, $3 = End hour, $4 = folder with video files
#
# # #
check_if_time_to_play() {

  # Make sure the arguments are interpreted as *decimal* integers
  # by evaluating them in an arithmetic context (-i) with prefix '10#', 
  # indicating number base 10.
  # (A leading '0' would cause intepretation as *octal*.)
  local -i hourNow=10#$1 startHour=10#$2 endHour=10#$3 play
  local dir=$4

  # Make sure the folder is not empty.
  if ! find "$dir" -mindepth 1 -print -quit | grep -q .; then
    return # It's empty! Don't play the non-existing clips. 
  fi

  # Determine if current hour is between begin and end time.
  play=0
  if (( startHour < endHour )); then
    if (( hourNow >= startHour && hourNow < endHour )); then
      play=1
    fi
  else # startHour > endHour: overnight hours
    if (( hourNow >= startHour || hourNow < endHour )); then
      play=1
    fi
  fi

  if (( play )); then
    # Play the clips
    play_files "$dir" 
  else
     : # Current hour is not in range, don't play the clips.
  fi
}

# Now for our infinite loop!
while true; do
        if ps ax | grep -v grep | grep $SERVICE > /dev/null
        then
        sleep 0;
else

# # #
#
#  First we check the Video folder if it has any subfolders.
#  If it doesn't, play the files in the folder.
#  If subfolders exists, and follow the naming standard do as the commanded. 
#   
#  A folder named: 18-22 means start at 18 o clock, end at 22, everyday.
#  A folder named: 18-22-07 means start at 18 o clock, end at 22, only during Sunday.
#
#  01 = Monday, 02 = Tuesday and so on, thats why 07 is Sunday.
#
#  Files in subfolders will be playd according to the folders name.
#  
#  If for some reason there is an empty folder or it doesn't follow the standard above, we ignore it.
#
# # #
    cd $VIDEOPATH
    shopt -s nullglob
    FOLDERS=(*/)
    shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later

    # Check if there is no subfolders
    if (( !${#FOLDERS[@]} )); then
        play_files "$VIDEOPATH" 
    else
        play_files "$VIDEOPATH"
        for entry in "${FOLDERS[@]}"; 
        do
            TEMPVAR=${entry::-1} # Remove trailing /
            IFS='-' read -a PLAYTIME <<< "$TEMPVAR" # PLAYTIME array [0] = Begin time, [1] = End time, [2] = Day
            if (( ${#PLAYTIME[@]} )); then
                #check if day is not set
                if (( !${#PLAYTIME[2]} )); then
                    check_if_time_to_play $TIME "${PLAYTIME[0]}" "${PLAYTIME[1]}" "$VIDEOPATH/$entry" 
                else # Day is set
                    if [ $DAY -eq "${PLAYTIME[2]}" ]; then
                        check_if_time_to_play $TIME "${PLAYTIME[0]}" "${PLAYTIME[1]}" "$VIDEOPATH/$entry"
                    else
                        continue # Not today..
                    fi
                fi
            fi
        done;
    fi

fi
done

Tak więc, jak stwierdzono w komentarzu, przełączyłem się na OMXplayer - ale VLC również będzie działać dobrze. Po prostu zmień to w SERVICE = i w play_files()funkcji.

Skrypt odtwarza pliki znajdujące się w nim VIDEOPATHi jeśli ta ścieżka zawiera podfoldery, sprawdzi, czy foldery korzystają z opracowanej w tym celu konwencji nazewnictwa. Przeczytaj komentarze w skrypcie - w zasadzie możesz utworzyć folder o nazwie StartTime-EndTime (fx. Nazwa folderu 22-23), a klipy w tym folderze będą odtwarzane tylko od 22:00 do 23:00. A jeśli chcesz odtwarzać klipy tylko określonego dnia tygodnia, utwórz folder StartTime-EndTime-DayOfWeek (Fx. Folder o nazwie 22-23-01) klipy w tym folderze będą odtwarzane tylko od 22:00 do 23:00 w poniedziałek. Czy to skończy się 02, będzie we wtorek, 03 środa i tak dalej.

Myślę, że resztę wyjaśniono w komentarzach do skryptu, w przeciwnym razie możesz zapytać, czy masz jakieś pytania. Proszę również podzielić się wszelkimi ulepszeniami :)

Mam ten skrypt działający na ponad 50 różnych Raspberry PI w różnych lokalizacjach. Działają 24/7 i działają bardzo stabilnie. Usunąłem wszystkie widoczne GUI z PI. Wszystkie uruchamiają cronjob, który co 15 minut rsyncs z głównym serwerem, skrypt My Sync wygląda następująco: sync.sh

#!/bin/sh

#MountFTP
echo "RASPERRYPIROOTPASSWORD" | sudo umount /home/pi/ftp/
sleep 5
echo "RASPERRYPIROOTPASSWORD" | sudo curlftpfs www-data:[email protected] /home/pi/ftp -o allow_other

#Sync Videos
rsync -avztr --delete /home/pi/ftp/data/files/CURRENTRASPBERRYPI/ /home/pi/vids/

#sync scripts (so we can remotely update the scripts)
rsync -avztr /home/pi/ftp/data/files/Scripts/syncscript/CURRENTRASPBERRYPI/sync.sh /home/pi #is this script
rsync -avztr /home/pi/ftp/data/files/Scripts/play.sh /home/pi #is they play videos script
chmod +x *.sh

#Write to log
IP="$(curl -s http://whatismyip.akamai.com/)"
DATE="$(date +%d-%m-%Y-%X)"

echo $DATE " - " $IP " - CURRENTRASPBERRYPI " >> /home/pi/CURRENTRASPBERRYPI.txt
cp /home/pi/CURRENTRASPBERRYPI.txt /home/pi/ftp/logs/

Wielkie litery w powyższym skrypcie ręcznie zmieniałem dla każdego komputera, na którym działa skrypt.

Na serwerze korzystałem z internetowego menedżera plików o nazwie AJAX explorer, zwanego teraz Pydio. Dzięki temu użytkownicy końcowi mogą łatwo przesyłać filmy wideo do każdego komputera / wybranej lokalizacji (/ ftp / data / files / CURRENTRASPBERRYPI /).

Bolli
źródło
Wiem, że to 5 lat, ale czy byłbyś tak uprzejmy i opublikowałby ostatni skrypt, o którym wspominałeś?
TheFrost
@TheFrost na pewno daj mi sekundę, zaktualizuję ten post. Skończyło się na przejściu na odtwarzacz omx - ale wierzę, że będzie dobrze działać również z VLC
Bolli
@TheFrost Zaktualizowałem swoją odpowiedź. Daj mi znać, jeśli jest coś, co nie ma sensu. A jeśli z tego skorzystasz, podziel się wszelkimi usprawnieniami, które możesz wprowadzić :)
Bolli,