From 7f1a14e6361b7ca4df8932821381b844b2b74cfb Mon Sep 17 00:00:00 2001 From: Tony DiCola Date: Tue, 10 Feb 2015 22:20:14 -0800 Subject: [PATCH] Configure supervisord to run video_looper on boot. --- .gitignore | 1 + Adafruit_Video_Looper/omxplayer.py | 6 ++-- Adafruit_Video_Looper/video_looper.py | 20 +++++++++--- install.sh | 45 +++++++++++++++++++++++++++ video_looper.conf | 8 +++++ 5 files changed, 73 insertions(+), 7 deletions(-) create mode 100755 install.sh create mode 100644 video_looper.conf diff --git a/.gitignore b/.gitignore index db4561e..39dca49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +omxplayer-dist.tgz* # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/Adafruit_Video_Looper/omxplayer.py b/Adafruit_Video_Looper/omxplayer.py index ae8ff0d..fe3f2b5 100644 --- a/Adafruit_Video_Looper/omxplayer.py +++ b/Adafruit_Video_Looper/omxplayer.py @@ -55,9 +55,9 @@ class OMXPlayer(object): """ # Stop the player if it's running. if self._process is not None and self._process.returncode is None: - # process.kill() doesn't seem to work reliably if USB drive is - # removed, instead just run a kill -9 on it. - subprocess.call(['kill', '-9', str(self._process.pid)]) + # There are a couple processes used by omxplayer, so kill both + # with a pkill command. + subprocess.call(['pkill', '-9', 'omxplayer']) # If a blocking timeout was specified, wait up to that amount of time # for the process to stop. start = time.time() diff --git a/Adafruit_Video_Looper/video_looper.py b/Adafruit_Video_Looper/video_looper.py index db0a171..1c8078c 100644 --- a/Adafruit_Video_Looper/video_looper.py +++ b/Adafruit_Video_Looper/video_looper.py @@ -1,12 +1,12 @@ # Copyright 2015 Adafruit Industries. # Author: Tony DiCola # License: GNU GPLv2, see LICENSE.txt -import atexit import ConfigParser import importlib import os import re import sys +import signal import time import pygame @@ -50,7 +50,6 @@ class VideoLooper(object): self._console_output = self._config.getboolean('video_looper', 'console_output') # Load configured video player and file reader modules. self._player = self._load_player() - atexit.register(self._player.stop) # Make sure to stop player on exit. self._reader = self._load_file_reader() # Load other configuration values. self._osd = self._config.getboolean('video_looper', 'osd') @@ -73,6 +72,7 @@ class VideoLooper(object): self._extensions = self._player.supported_extensions() self._small_font = pygame.font.Font(None, 50) self._big_font = pygame.font.Font(None, 250) + self._running = True def _print(self, message): """Print message to standard output if console output is enabled.""" @@ -186,7 +186,7 @@ class VideoLooper(object): playlist = self._build_playlist() self._prepare_to_run_playlist(playlist) # Main loop to play videos in the playlist and listen for file changes. - while True: + while self._running: # Load and play a new movie if nothing is playing. if not self._player.is_playing(): movie = playlist.get_next() @@ -205,14 +205,26 @@ class VideoLooper(object): # Give the CPU some time to do other tasks. time.sleep(0) + def signal_quit(self, signal, frame): + """Shut down the program, meant to by called by signal handler.""" + self._running = False + if self._player is not None: + self._player.stop() + pygame.quit() + # Main entry point. def main(): + print('Starting Adafruit Video Looper.') # Default config path to /boot. config_path = '/boot/video_looper.ini' # Override config path if provided as parameter. if len(sys.argv) == 2: config_path = sys.argv[1] - # Create video looper and run it. + # Create video looper. videolooper = VideoLooper(config_path) + # Configure signal handlers to quit on TERM or INT signal. + signal.signal(signal.SIGTERM, videolooper.signal_quit) + signal.signal(signal.SIGINT, videolooper.signal_quit) + # Run the main loop. videolooper.run() diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..22fcb10 --- /dev/null +++ b/install.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +# Error out if anything fails. +set -e + +# Make sure script is run as root. +if [ "$(id -u)" != "0" ]; then + echo "Must be run as root with sudo! Try: sudo ./install.sh" + exit 1 +fi + +echo "Installing dependencies..." +echo "==========================" +#apt-get update +#apt-get -y install build-essential python-dev python-pip python-pygame supervisor git + +echo "Installing omxplayer..." +echo "=======================" +if [ -f "omxplayer-dist.tgz" ]; then + rm omxplayer-dist.tgz +fi +wget https://github.com/adafruit/omxplayer/releases/download/2%2F10%2F2015/omxplayer-dist.tgz +tar xvfz omxplayer-dist.tgz -C / + +echo "Installing hello_video..." +echo "=========================" +git clone https://github.com/adafruit/pi_hello_video.git +cd pi_hello_video +./rebuild.sh +cd hello_video +make install +cd ../.. +rm -rf pi_hello_video + +echo "Installing video_looper program..." +echo "==================================" +python setup.py install --force +cp video_looper.ini /boot/video_looper.ini + +echo "Configuring video_looper to run on start..." +echo "===========================================" +cp video_looper.conf /etc/supervisor/conf.d/ +service supervisor restart + +echo "Finished!" diff --git a/video_looper.conf b/video_looper.conf new file mode 100644 index 0000000..0b1904d --- /dev/null +++ b/video_looper.conf @@ -0,0 +1,8 @@ +# Supervisord configuration to run video looper at boot and +# ensure it runs continuously. +[program:video_looper] +command=video_looper +autostart=true +autorestart=unexpected +startsecs=5 +stopasgroup=true