#!/usr/bin/env python3

from argparse import ArgumentParser
import re
import sys
import time
from gi.repository import Gst
from subprocess import check_output


def check_state(device):
    """Checks whether the sink is available for the given device.
    """
    sink_info = check_output(['pacmd', 'list-sinks'],
                             universal_newlines=True)

    data = sink_info.split("\n")
    try:
        device = re.findall(".*name:\s.*%s.*" % device, sink_info)[0].lstrip()
        status = data[data.index("\t" + device) + 3]
    except (IndexError, ValueError):
        print("Failed to find status for device: %s" % device, file=sys.stderr)
        return False

    print("Device: %s %s" % (device.strip(), status.strip()))
    return status == "RUNNING"


def main():
    parser = ArgumentParser(description='Simple GStreamer pipeline player')
    parser.add_argument('PIPELINE',
        help='Quoted GStreamer pipeline to launch')
    parser.add_argument('-t', '--timeout',
        type=int, required=True,
        help='Timeout for running the pipeline')
    parser.add_argument('-d', '--device',
        type=str,
        help="Device to check for status")
    args = parser.parse_args()

    Gst.init(None)
    element = Gst.parse_launch(args.PIPELINE)
    element.set_state(Gst.State.PLAYING)

    if args.timeout:
        time.sleep(args.timeout)

    exit_code = 0
    if args.device:
        if not check_state(args.device):
            exit_code = 1

    element.set_state(Gst.State.NULL)

    return exit_code


if __name__ == "__main__":
    sys.exit(main())
