Sau khi không nhận được câu trả lời kịp thời (lẽ ra nên đăng bài này một tuần trước đó), tôi đã kết thúc việc tự động hóa VLC. Tôi tìm thấy viên ngọc quý này của một bài đăng trên blog về việc kiểm soát VLC bằng cách sử dụng các ổ cắm UNIX. Điểm chính của nó là nếu bạn cấu hình VLC chính xác, bạn có thể gửi lệnh đến nó thông qua cú pháp dòng lệnh:
echo [VLC Command] | nc -U /Users/vlc.sock
trong đó [Lệnh VLC] là bất kỳ lệnh nào mà VLC hỗ trợ (bạn có thể tìm thấy danh sách các lệnh bằng cách gửi lệnh " longhelp ").
Cuối cùng tôi đã viết một tập lệnh Python để tự động tải lên một thư mục chứa đầy phim và sau đó chọn ngẫu nhiên các clip để hiển thị. Kịch bản trước tiên đặt tất cả avis vào danh sách phát VLC. Sau đó, nó chọn một tệp ngẫu nhiên từ danh sách phát và chọn một điểm bắt đầu ngẫu nhiên trong video đó để phát. Tập lệnh sau đó chờ trong khoảng thời gian đã chỉ định và lặp lại quy trình. Nó đây, không dành cho người yếu tim:
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
Ồ và như một lưu ý phụ, chúng tôi đã có cái này chạy trên máy chiếu và nó là bản hit của bữa tiệc. Mọi người đều thích lộn xộn với các giá trị giây và chọn video mới để thêm. Không khiến tôi nằm , nhưng gần như vậy!
EDIT: Tôi đã xóa dòng mở VLC vì có vấn đề về thời gian trong đó VLC sẽ chỉ được tải một nửa khi tập lệnh bắt đầu thêm tệp vào danh sách phát. Bây giờ tôi chỉ cần mở VLC theo cách thủ công và đợi cho nó tải xong trước khi bắt đầu tập lệnh.