"""Video recording library
Configuration for this module + fixture:
.. code-block:: yaml
logging:
video:
enabled: True
dir: video
display: ":99"
quality: 10
"""
import os
import subprocess
from signal import SIGINT
from cfme.utils.conf import env
# from utils.log import logger
vid_options = env.get('logging', {}).get('video')
[docs]def process_running(pid):
"""Check whether specified process is running"""
try:
os.kill(pid, 0)
except OSError as e:
if e.errno == 3:
return False
else:
raise
else:
return True
[docs]class Recorder(object):
"""Recorder class
Usage:
with Recorder(filename):
# do something
# or
r = Recorder(filename)
r.start()
# do something
r.stop()
The first way is preferred, obviously
"""
def __init__(self, filename, display=None, quality=None):
self.filename = filename
self.display = display or vid_options["display"]
self.quality = quality or vid_options["quality"]
self.pid = None
[docs] def start(self):
cmd_line = ['recordmydesktop',
'--display', str(self.display),
'-o', str(self.filename),
'--no-sound',
'--v_quality', str(self.quality),
'--on-the-fly-encoding',
'--overwrite']
try:
proc = subprocess.Popen(cmd_line, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
self.pid = proc.pid
except OSError:
# Had to disable for artifactor
# logger.exception("Couldn't initialize videoer! Is recordmydesktop installed?")
pass
[docs] def stop(self):
if self.pid is not None:
if process_running(self.pid):
os.kill(self.pid, SIGINT)
os.waitpid(self.pid, 0)
# Had to disable for artifactor
# logger.info("Recording finished")
self.pid = None
else:
# Had to disable for artifactor
# logger.exception("Could not find recordmydesktop process #%d" % self.pid)
pass
def __enter__(self):
self.start()
def __exit__(self, t, v, tb):
self.stop()
[docs] def __del__(self):
"""If the reference is lost and the object is destroyed ..."""
self.stop()