#!/usr/bin/python3
# -*- coding: utf-8 -*-

# OpenBroadcaster off-the-air Recorder

import os
import sys
import time
import argparse

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst

GObject.threads_init()
Gst.init(None)


class ObRecorder:
    def __init__(self):
        parser = argparse.ArgumentParser(prog='obplayer_monitor', formatter_class=argparse.ArgumentDefaultsHelpFormatter, description='Record off-the-air audio, encode to ogg, and save to destination directory (one file per hour).')
        parser.add_argument('-D', '--alsa-device', type=str, help='Name of the ALSA input device.', default='default')
        parser.add_argument('-R', '--sample-rate', type=str, help='Output sample rate in hz.', default='22050')
        parser.add_argument('-C', '--channels', type=str, help='Number of channels.  1 for mono, 2 for stereo.', default='1')
        parser.add_argument('dest', help='File destination directory.', type=str)

        self.args = parser.parse_args()

        if os.access(self.args.dest, os.W_OK) == False:
            print 'Destination directory does not exist, or write permission denied.'
            exit(1)

    def start(self):
        # determine filename...
        outfile = self.args.dest + '/' + time.strftime('%Y-%m-%d_%H:%M:%S') + '.flac'

        launchcmd = 'alsasrc device=' + self.args.alsa_device \
                    + ' ! audioconvert ! audioresample ' \
                    + ' ! audio/x-raw, rate=' + self.args.sample_rate + ', channels=' + self.args.channels \
                    + ' ! queue ! flacenc quality=5 ! filesink location=' + outfile

        self.pipeline = Gst.parse_launch(launchcmd)
        self.pipeline.set_state(Gst.State.PLAYING)

    def stop(self):
        self.pipeline.set_state(Gst.State.NULL)
        del self.pipeline


def main():
    mainloop = GObject.MainLoop()

    record = ObRecorder()
    record.start()

    try:
        mainloop.run()
    except KeyboardInterrupt:
        pass

    record.stop()
    sys.exit(0)

main()

