Après n'avoir pas reçu de réponse à temps (j'aurais dû le poster une semaine plus tôt), j'ai fini par plonger dans l'automatisation de VLC. J'ai trouvé ce petit bijou de blog sur le contrôle de VLC à l'aide de sockets UNIX. L'essentiel est que si vous configurez correctement VLC, vous pouvez lui envoyer des commandes via la syntaxe de ligne de commande:
echo [VLC Command] | nc -U /Users/vlc.sock
où [Commande VLC] est une commande prise en charge par VLC (vous pouvez trouver une liste de commandes en envoyant la commande " longhelp ").
J'ai fini par écrire un script Python pour charger automatiquement un répertoire plein de films, puis choisir au hasard les clips à afficher. Le script met d'abord tous les avis dans une liste de lecture VLC. Il choisit ensuite un fichier aléatoire dans la liste de lecture et choisit un point de départ aléatoire dans cette vidéo à lire. Le script attend ensuite la durée spécifiée et répète le processus. Le voici, pas pour les faibles de cœur:
import subprocess
import random
import time
import os
import sys
## Just seed if you want to get the same sequence after restarting the script
## random.seed()
SocketLocation = "/Users/vlc.sock"
## You can enter a directory as a command line argument; otherwise it will use the default
if(len(sys.argv) >= 2):
MoviesDir = sys.argv[1]
else:
MoviesDir = "/Users/Movies/Xmas"
## You can enter the interval in seconds as the second command line argument as well
if(len(sys.argv) >= 3):
IntervalInSeconds = int(sys.argv[2])
else:
IntervalInSeconds = 240
## Sends an arbitrary command to VLC
def RunVLCCommand(cmd):
p = subprocess.Popen("echo " + cmd + " | nc -U " + SocketLocation, shell = True, stdout = subprocess.PIPE)
errcode = p.wait()
retval = p.stdout.read()
print "returning: " + retval
return retval
## Clear the playlist
RunVLCCommand("clear")
RawMovieFiles = os.listdir(MoviesDir)
MovieFiles = []
FileLengths = []
## Loop through the directory listing and add each avi or divx file to the playlist
for MovieFile in RawMovieFiles:
if(MovieFile.endswith(".avi") or MovieFile.endswith(".divx")):
MovieFiles.append(MovieFile)
RunVLCCommand("add \"" + MoviesDir + "/" + MovieFile + "\"")
PlayListItemNum = 0
## Loop forever
while 1==1:
## Choose a random movie from the playlist
PlayListItemNum = random.randint(1, len(MovieFiles))
RunVLCCommand("goto " + str(PlayListItemNum))
FileLength = "notadigit"
tries = 0
## Sometimes get_length doesn't work right away so retry 50 times
while tries < 50 and FileLength .strip().isdigit() == False or FileLength.strip() == "0":
tries+=1
FileLength = RunVLCCommand("get_length")
## If get_length fails 50 times in a row, just choose another movie
if tries < 50:
## Choose a random start time
StartTimeCode = random.randint(30, int(FileLength) - IntervalInSeconds);
RunVLCCommand("seek " + str(StartTimeCode))
## Turn on fullscreen
RunVLCCommand("f on")
## Wait until the interval expires
time.sleep(IntervalInSeconds)
## Stop the movie
RunVLCCommand("stop")
tries = 0
## Wait until the video stops playing or 50 tries, whichever comes first
while tries < 50 and RunVLCCommand("is_playing").strip() == "1":
time.sleep(1)
tries+=1
Oh et comme note de côté, nous l'avons fait tourner sur un projecteur et c'était le succès de la fête. Tout le monde a adoré jouer avec les valeurs des secondes et choisir de nouvelles vidéos à ajouter. Je ne me suis pas couché , mais presque!
EDIT: J'ai supprimé la ligne qui ouvre VLC car il y avait des problèmes de synchronisation où VLC ne serait qu'à moitié chargé lorsque le script commençait à ajouter des fichiers à la liste de lecture. Maintenant, j'ouvre manuellement VLC et j'attends qu'il termine le chargement avant de démarrer le script.