nastavení pro zamezení opakovanému startu zobrazování videa, když video už je přehráváné a dojde k zaznamenání nového pohybu. Přidání zpoždění mezi zaznamenání pohybu a přehrávání videa.
This commit is contained in:
parent
5f7986cb69
commit
01f8a22cb0
1 changed files with 36 additions and 27 deletions
|
|
@ -19,17 +19,21 @@ PIR_PIN = config.get('pir_pin', 17)
|
||||||
VIDEOS_DIR = os.path.join(os.path.dirname(__file__), config.get('videos_dir', 'videos'))
|
VIDEOS_DIR = os.path.join(os.path.dirname(__file__), config.get('videos_dir', 'videos'))
|
||||||
BLACK_IMAGE_PATH = os.path.join(os.path.dirname(__file__), "black.png")
|
BLACK_IMAGE_PATH = os.path.join(os.path.dirname(__file__), "black.png")
|
||||||
VIDEO_EXTENSIONS = tuple(config.get('video_extensions', ['.mp4', '.mkv']))
|
VIDEO_EXTENSIONS = tuple(config.get('video_extensions', ['.mp4', '.mkv']))
|
||||||
MPV_SOCKET_PATH = "/tmp/mpvsocket" # Cesta k ovládacímu socketu
|
MPV_SOCKET_PATH = "/tmp/mpvsocket"
|
||||||
|
# <<< NOVINKA: Načtení hodnot ze souboru config.yaml >>>
|
||||||
|
SURPRISE_DELAY = config.get('surprise_delay', 1.5)
|
||||||
|
SENSOR_LOCK_DURATION = config.get('sensor_lock_duration', 30)
|
||||||
available_videos = []
|
available_videos = []
|
||||||
|
|
||||||
# --- Nové funkce pro ovládání mpv ---
|
is_playing = False
|
||||||
|
|
||||||
|
# --- Funkce pro ovládání mpv ---
|
||||||
def send_mpv_command(command_json):
|
def send_mpv_command(command_json):
|
||||||
"""Pošle JSON příkaz do běžícího mpv přes socat."""
|
"""Pošle JSON příkaz do běžícího mpv přes socat."""
|
||||||
full_command = f"echo '{command_json}' | socat - {MPV_SOCKET_PATH}"
|
full_command = f"echo '{command_json}' | socat - {MPV_SOCKET_PATH}"
|
||||||
try:
|
try:
|
||||||
subprocess.run(full_command, shell=True, check=True, capture_output=True, text=True)
|
subprocess.run(full_command, shell=True, check=True, capture_output=True, text=True)
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
# Chybu ignorujeme, pokud socket není připraven, další pokus proběhne při příštím pohybu
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# --- Hlavní logika ---
|
# --- Hlavní logika ---
|
||||||
|
|
@ -43,47 +47,52 @@ def load_videos():
|
||||||
available_videos = []
|
available_videos = []
|
||||||
|
|
||||||
def play_random_ghost():
|
def play_random_ghost():
|
||||||
"""Pošle mpv příkaz k přehrání videa JEDNOU a návratu k černé obrazovce."""
|
"""Zpracuje detekci pohybu, počká a přehraje video, pokud již jiné neběží."""
|
||||||
print("Pohyb detekován! Posílám příkaz do mpv...")
|
global is_playing
|
||||||
|
|
||||||
load_videos()
|
if is_playing:
|
||||||
if not available_videos:
|
print("Pohyb ignorován, video již běží.")
|
||||||
return
|
return
|
||||||
|
|
||||||
video_to_play = random.choice(available_videos)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Příkaz č. 1: Načti a přehraj video, ale s vypnutou smyčkou (loop=no)
|
is_playing = True
|
||||||
|
|
||||||
|
print(f"Pohyb detekován, čekám {SURPRISE_DELAY}s pro moment překvapení...")
|
||||||
|
# <<< NOVINKA: Použití proměnné ze souboru config.yaml >>>
|
||||||
|
time.sleep(SURPRISE_DELAY)
|
||||||
|
|
||||||
|
print("Posílám příkaz do mpv...")
|
||||||
|
load_videos()
|
||||||
|
if not available_videos:
|
||||||
|
return
|
||||||
|
|
||||||
|
video_to_play = random.choice(available_videos)
|
||||||
|
|
||||||
command1 = f'{{"command": ["loadfile", "{video_to_play}", "replace", "loop=no"]}}'
|
command1 = f'{{"command": ["loadfile", "{video_to_play}", "replace", "loop=no"]}}'
|
||||||
send_mpv_command(command1)
|
send_mpv_command(command1)
|
||||||
|
|
||||||
# Příkaz č. 2: Po skončení videa se vrať k zobrazení černého obrázku
|
|
||||||
command2 = f'{{"command": ["loadfile", "{BLACK_IMAGE_PATH}", "append-play"]}}'
|
command2 = f'{{"command": ["loadfile", "{BLACK_IMAGE_PATH}", "append-play"]}}'
|
||||||
send_mpv_command(command2)
|
send_mpv_command(command2)
|
||||||
|
|
||||||
except Exception:
|
finally:
|
||||||
pass
|
print(f"Senzor bude znovu aktivní za {SENSOR_LOCK_DURATION}s.")
|
||||||
|
# <<< NOVINKA: Použití proměnné ze souboru config.yaml >>>
|
||||||
|
time.sleep(SENSOR_LOCK_DURATION)
|
||||||
|
is_playing = False
|
||||||
|
print("Senzor je opět aktivní.")
|
||||||
|
|
||||||
|
|
||||||
# --- Hlavní spuštění ---
|
# --- Hlavní spuštění ---
|
||||||
# Ukončíme všechny staré instance mpv pro čistý start
|
|
||||||
os.system("pkill -f mpv")
|
os.system("pkill -f mpv")
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
load_videos()
|
load_videos()
|
||||||
|
|
||||||
# Spustíme mpv na pozadí s otevřeným ovládacím socketem
|
|
||||||
subprocess.Popen([
|
subprocess.Popen([
|
||||||
"/usr/bin/mpv",
|
"/usr/bin/mpv", "--no-audio", "--fullscreen", "--loop-file=inf", "--idle",
|
||||||
"--no-audio",
|
f"--input-ipc-server={MPV_SOCKET_PATH}", BLACK_IMAGE_PATH
|
||||||
"--fullscreen",
|
|
||||||
"--loop-file=inf",
|
|
||||||
"--idle", # Zůstane aktivní, i když nic nehraje
|
|
||||||
f"--input-ipc-server={MPV_SOCKET_PATH}", # Klíčový parametr pro ovládání
|
|
||||||
BLACK_IMAGE_PATH
|
|
||||||
])
|
])
|
||||||
time.sleep(2) # Dáme mpv čas na spuštění a vytvoření socketu
|
time.sleep(2)
|
||||||
|
|
||||||
# Nastavení senzoru pohybu
|
|
||||||
pir = MotionSensor(PIR_PIN)
|
pir = MotionSensor(PIR_PIN)
|
||||||
pir.when_motion = play_random_ghost
|
pir.when_motion = play_random_ghost
|
||||||
|
|
||||||
|
|
@ -92,4 +101,4 @@ try:
|
||||||
pause()
|
pause()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print("Ukončuji aplikaci.")
|
print("Ukončuji aplikaci.")
|
||||||
os.system("pkill -f mpv") # Při ukončení uklidíme
|
os.system("pkill -f mpv")
|
||||||
Loading…
Reference in a new issue