From 7f26c1aa98cd0ee7652fb3abc028d6d56a53a331 Mon Sep 17 00:00:00 2001 From: Sundog Date: Fri, 6 Oct 2023 13:19:02 -0400 Subject: [PATCH] adds duration parsing, changes default --to and --from datetimes to tomorrow from today --- mt_clockwheel.py | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/mt_clockwheel.py b/mt_clockwheel.py index d8c4bff..221542b 100644 --- a/mt_clockwheel.py +++ b/mt_clockwheel.py @@ -4,14 +4,15 @@ from glob import glob import json from listdict import ListDict import os +import subprocess # globals mediadir = "/var/lib/ffplayout/tv-media" playlistdir = "/var/lib/ffplayout/playlists" channel = "newellijaytelevision" verbose = False -from_date = datetime.date.today() -to_date = datetime.date.today() +from_date = datetime.date.today() + datetime.timedelta(days=1) # tomorrow by default +to_date = datetime.date.today() + datetime.timedelta(days=1) # tomorrow by default playlist_duration = 6 * 60 * 60 # six hours, in seconds mediadirs = ListDict() @@ -127,14 +128,30 @@ def get_playlist_entry(get_commercial): this_file = media_files.choose_random_item() if media_files.length() > 0 else "" if this_file == "": - return "", 0 # get out of this oopsie situation and try again + if verbose: + print('cannot select file from empty folder') + return {}, 0 # get out of this oopsie situation and try again - # TODO: ffprobe file for duration + if verbose: + print('selected file: ' + this_file) + + # probe file for details + metadata = json.loads(json.dumps(probe(this_file), sort_keys=True, indent=4)) + + if verbose: + print('file metadata: ', metadata) + print('format: ', metadata['format']) + + duration = int(float(metadata['format']['duration_secs'])) if "duration_secs" in metadata['format'].keys() else int(float(metadata["format"]["duration"])) if "duration" in metadata['format'].keys() else 0 + if duration == 0: + if verbose: + print('cannot parse duration of ' + this_file) + return {}, 0 # cannot parse duration, so skip this file entry = { "in": 0, - "out": 300, - "duration": 300, + "out": duration, + "duration": duration, "source": this_file } @@ -145,6 +162,23 @@ def get_playlist_entry(get_commercial): return entry, length +def probe(file): + cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', f"{file}"] + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = p.communicate() + if len(out) > 0: + result = json.loads(out) + else: + result = {} + if err: + print("===err===") + print(err) + + if verbose: + print('ffprobe result: ', result) + + return result + # generator function to yield single dates from a date range def daterange(start_date, end_date): for n in range(int((end_date - start_date).days) + 1): # adding 1 to make the range inclusive