#!/usr/bin/python3.13

## @file
# A replacement for gst-launch that allows seeks

"""
gst-launch with goodies

It allows to seek in the pipeline.
"""

# JBC. April 2011.

import sys
from optparse import OptionParser

parser = OptionParser(version='%prog 1.0', usage='%prog [options]',
                      description=__doc__)

parser.add_option('--start', type='int', help='start time')
parser.add_option('--end',   type='int', help='end time')

opts, rest = parser.parse_args()


#
# Initialization
#

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst
GObject.threads_init()
Gst.init(None)
from gstlal import simplehandler


#
# Create the pipeline (yes, it's *that* easy)
#

mainloop = GObject.MainLoop()
pipeline = Gst.parse_launch(' '.join(rest))


#
# Make it start playing at the appropriate time
#

if opts.start is not None:
    start_seektype = Gst.SeekType.SET
    start_ns = opts.start * 1e9
else:
    start_seektype = Gst.SeekType.NONE
    start_ns = 0  # not used anyway

if opts.end is not None:
    end_seektype = Gst.SeekType.SET
    end_ns = opts.end * 1e9
else:
    end_seektype = Gst.SeekType.NONE
    end_ns = 0  # not used anyway

for src in pipeline.iterate_sources():
    src.seek(1.0, Gst.Format.TIME, Gst.SeekFlags.FLUSH,
             start_seektype, start_ns,
             end_seektype, end_ns)


#
# Boilerplate
#

handler = simplehandler.Handler(mainloop, pipeline)
if pipeline.set_state(Gst.State.PLAYING) == Gst.StateChangeReturn.FAILURE:
	raise RuntimeError("pipeline failed to enter PLAYING state")
mainloop.run()
