pyca/capture.py
def recording_command(event):
    '''Run the actual command to record the a/v material.
    '''
    conf = config('capture')
    # Prepare command line
    cmd = conf['command']
    cmd = cmd.replace('{{time}}', str(event.remaining_duration(timestamp())))
    cmd = cmd.replace('{{dir}}', event.directory())
    cmd = cmd.replace('{{name}}', event.name())
    cmd = cmd.replace('{{previewdir}}', conf['preview_dir'])

    # Signal configuration
    sigterm_time = conf['sigterm_time']
    sigkill_time = conf['sigkill_time']
    sigcustom_time = conf['sigcustom_time']
    sigcustom_time = 0 if sigcustom_time < 0 else event.end + sigcustom_time
    sigterm_time = 0 if sigterm_time < 0 else event.end + sigterm_time
    sigkill_time = 0 if sigkill_time < 0 else event.end + sigkill_time

    # Launch capture command
    logger.info(cmd)
    args = shlex.split(cmd)
    DEVNULL = getattr(subprocess, 'DEVNULL', os.open(os.devnull, os.O_RDWR))
    captureproc = subprocess.Popen(args, stdin=DEVNULL)
    hasattr(subprocess, 'DEVNULL') or os.close(DEVNULL)

    # Set systemd status
    notify.notify('STATUS=Capturing')

    # Check process
    while captureproc.poll() is None:
        notify.notify('WATCHDOG=1')
        if sigcustom_time and timestamp() > sigcustom_time:
            logger.info("Sending custom signal to capture process")
            captureproc.send_signal(conf['sigcustom'])
            sigcustom_time = 0  # send only once
        if sigterm_time and timestamp() > sigterm_time:
            logger.info("Terminating capture process")
            captureproc.terminate()
            sigterm_time = 0  # send only once
        elif sigkill_time and timestamp() > sigkill_time:
            logger.warning("Killing capture process")
            captureproc.kill()
            sigkill_time = 0  # send only once
        time.sleep(0.1)

    # Remove preview files:
    for preview in conf['preview']:
        try:
            os.remove(preview.replace('{{previewdir}}', conf['preview_dir']))
        except OSError:
            logger.warning('Could not remove preview files')
            logger.warning(traceback.format_exc())

    # Check process for errors
    exitcode = config()['capture']['exit_code']
    if captureproc.poll() > 0 and captureproc.returncode != exitcode:
        raise RuntimeError('Recording failed (%i)' % captureproc.returncode)

    # Reset systemd status
    notify.notify('STATUS=Waiting')

    # Return [(flavor,path),…]
    files = (f.replace('{{dir}}', event.directory()) for f in conf['files'])
    files = (f.replace('{{name}}', event.name()) for f in files)
    return list(zip(conf['flavors'], files))
def recording_command(event):
    '''Run the actual command to record the a/v material.
    '''
    conf = config('capture')
    # Prepare command line
    cmd = conf['command']
    cmd = cmd.replace('{{time}}', str(event.remaining_duration(timestamp())))
    cmd = cmd.replace('{{dir}}', event.directory())
    cmd = cmd.replace('{{name}}', event.name())
    cmd = cmd.replace('{{previewdir}}', conf['preview_dir'])

    # Signal configuration
    sigterm_time = conf['sigterm_time']
    sigkill_time = conf['sigkill_time']
    sigcustom_time = conf['sigcustom_time']
    sigcustom_time = 0 if sigcustom_time < 0 else event.end + sigcustom_time
    sigterm_time = 0 if sigterm_time < 0 else event.end + sigterm_time
    sigkill_time = 0 if sigkill_time < 0 else event.end + sigkill_time

    # Launch capture command
    logger.info(cmd)
    args = shlex.split(cmd)
    DEVNULL = getattr(subprocess, 'DEVNULL', os.open(os.devnull, os.O_RDWR))
    captureproc = subprocess.Popen(args, stdin=DEVNULL)
    hasattr(subprocess, 'DEVNULL') or os.close(DEVNULL)

    # Set systemd status
    notify.notify('STATUS=Capturing')

    # Check process
    while captureproc.poll() is None:
        notify.notify('WATCHDOG=1')
        if sigcustom_time and timestamp() > sigcustom_time:
            logger.info("Sending custom signal to capture process")
            captureproc.send_signal(conf['sigcustom'])
            sigcustom_time = 0  # send only once
        if sigterm_time and timestamp() > sigterm_time:
            logger.info("Terminating capture process")
            captureproc.terminate()
            sigterm_time = 0  # send only once
        elif sigkill_time and timestamp() > sigkill_time:
            logger.warning("Killing capture process")
            captureproc.kill()
            sigkill_time = 0  # send only once
        time.sleep(0.1)

    # Remove preview files:
    for preview in conf['preview']:
        try:
            os.remove(preview.replace('{{previewdir}}', conf['preview_dir']))
        except OSError:
            logger.warning('Could not remove preview files')
            logger.warning(traceback.format_exc())

    # Check process for errors
    exitcode = config()['capture']['exit_code']
    if captureproc.poll() > 0 and captureproc.returncode != exitcode:
        raise RuntimeError('Recording failed (%i)' % captureproc.returncode)

    # Reset systemd status
    notify.notify('STATUS=Waiting')

    # Return [(flavor,path),…]
    files = (f.replace('{{dir}}', event.directory()) for f in conf['files'])
    files = (f.replace('{{name}}', event.name()) for f in files)
    return list(zip(conf['flavors'], files))
def recording_command ( event ) : conf = config ( 'capture' ) # Prepare command line cmd = conf [ 'command' ] cmd = cmd . replace ( '{{time}}' , str ( event . remaining_duration ( timestamp ( ) ) ) ) cmd = cmd . replace ( '{{dir}}' , event . directory ( ) ) cmd = cmd . replace ( '{{name}}' , event . name ( ) ) cmd = cmd . replace ( '{{previewdir}}' , conf [ 'preview_dir' ] ) # Signal configuration sigterm_time = conf [ 'sigterm_time' ] sigkill_time = conf [ 'sigkill_time' ] sigcustom_time = conf [ 'sigcustom_time' ] sigcustom_time = 0 if sigcustom_time < 0 else event . end + sigcustom_time sigterm_time = 0 if sigterm_time < 0 else event . end + sigterm_time sigkill_time = 0 if sigkill_time < 0 else event . end + sigkill_time # Launch capture command logger . info ( cmd ) args = shlex . split ( cmd ) DEVNULL = getattr ( subprocess , 'DEVNULL' , os . open ( os . devnull , os . O_RDWR ) ) captureproc = subprocess . Popen ( args , stdin = DEVNULL ) hasattr ( subprocess , 'DEVNULL' ) or os . close ( DEVNULL ) # Set systemd status notify . notify ( 'STATUS=Capturing' ) # Check process while captureproc . poll ( ) is None : notify . notify ( 'WATCHDOG=1' ) if sigcustom_time and timestamp ( ) > sigcustom_time : logger . info ( "Sending custom signal to capture process" ) captureproc . send_signal ( conf [ 'sigcustom' ] ) sigcustom_time = 0 # send only once if sigterm_time and timestamp ( ) > sigterm_time : logger . info ( "Terminating capture process" ) captureproc . terminate ( ) sigterm_time = 0 # send only once elif sigkill_time and timestamp ( ) > sigkill_time : logger . warning ( "Killing capture process" ) captureproc . kill ( ) sigkill_time = 0 # send only once time . sleep ( 0.1 ) # Remove preview files: for preview in conf [ 'preview' ] : try : os . remove ( preview . replace ( '{{previewdir}}' , conf [ 'preview_dir' ] ) ) except OSError : logger . warning ( 'Could not remove preview files' ) logger . warning ( traceback . format_exc ( ) ) # Check process for errors exitcode = config ( ) [ 'capture' ] [ 'exit_code' ] if captureproc . poll ( ) > 0 and captureproc . returncode != exitcode : raise RuntimeError ( 'Recording failed (%i)' % captureproc . returncode ) # Reset systemd status notify . notify ( 'STATUS=Waiting' ) # Return [(flavor,path),…] files = ( f . replace ( '{{dir}}' , event . directory ( ) ) for f in conf [ 'files' ] ) files = ( f . replace ( '{{name}}' , event . name ( ) ) for f in files ) return list ( zip ( conf [ 'flavors' ] , files ) )
Run the actual command to record the a/v material.
Run the actual command to record the a / v material .