Después de no obtener una respuesta a tiempo (debería haber publicado esto una semana antes), terminé sumergiéndome en la automatización de VLC. Encontré esta joya de una publicación de blog sobre el control de VLC utilizando sockets UNIX. La esencia de esto es que si configura VLC correctamente, puede enviarle comandos a través de la sintaxis de la línea de comando:
echo [VLC Command] | nc -U /Users/vlc.sock
donde [Comando VLC] es cualquier comando compatible con VLC (puede encontrar una lista de comandos enviando el comando " longhelp ").
Terminé escribiendo un script de Python para cargar automáticamente un directorio lleno de películas y luego elegir aleatoriamente clips para mostrar. El guión primero pone todos los avis en una lista de reproducción VLC. Luego elige un archivo aleatorio de la lista de reproducción y elige un punto de partida aleatorio en ese video para reproducir. El script luego espera el tiempo especificado y repite el proceso. Aquí está, no para los débiles de corazón:
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
Ah, y como nota al margen, teníamos esto funcionando en un proyector y fue el éxito de la fiesta. A todos les encantó jugar con los valores de los segundos y elegir nuevos videos para agregar. No me acostaron , pero casi!
EDITAR: eliminé la línea que abre VLC porque hubo problemas de tiempo en los que VLC solo se cargaba a medias cuando el script comenzó a agregar archivos a la lista de reproducción. Ahora solo abro VLC manualmente y espero a que termine de cargarse antes de comenzar el script.