simplify code, make last clip min one second long. handle missing lists

This commit is contained in:
jb-alvarado 2021-02-18 11:28:30 +01:00
parent d9c03932ec
commit 871b3c2c05

View File

@ -65,8 +65,8 @@ def get_delta(begin):
def handle_list_init(current_delta, total_delta, node):
"""
# handle init clip, but this clip can be the last one in playlist,
# this we have to figure out and calculate the right length
handle init clip, but this clip can be the last one in playlist,
this we have to figure out and calculate the right length
"""
new_seek = abs(current_delta) + node['seek']
new_out = node['out']
@ -100,6 +100,9 @@ def handle_list_end(new_length, node):
new_out = node['out']
messenger.debug('List end')
# make last clip always minimum a second long
new_length += 1
if node['seek'] > 0:
new_out = node['seek'] + new_length
else:
@ -108,7 +111,7 @@ def handle_list_end(new_length, node):
if new_out > node['duration']:
new_out = node['duration']
else:
messenger.info(f'We are over time, new length is: {new_length:.2f}')
messenger.warning(f'We are over time, new length is: {new_length:.2f}')
missing_secs = abs(new_length - (node['duration'] - node['seek']))
@ -117,8 +120,7 @@ def handle_list_end(new_length, node):
node['out'] = new_out
node = src_or_dummy(node)
elif node['duration'] > new_length > 0.0:
time.sleep(new_length)
messenger.info(
messenger.warning(
f'Last clip less then 1 second long, skip:\n{node["source"]}')
node = None
@ -307,6 +309,7 @@ class GetSourceFromPlaylist:
"""
def __init__(self):
self.prev_date = get_date(True)
self.list_start = _playlist.start
self.first = True
self.last = False
@ -316,6 +319,7 @@ class GetSourceFromPlaylist:
self.prev_node = None
self.next_node = None
self.playlist = PlaylistReader(get_date(True), 0.0)
self.last_error = False
def get_playlist(self):
"""
@ -324,6 +328,14 @@ class GetSourceFromPlaylist:
"""
self.playlist.read()
if self.last_error and not self.playlist.error and \
self.playlist.list_date == self.prev_date:
# when last playlist where not exists but now is there and
# is still the same playlist date,
# set self.first to true to seek in clip
# only in this situation seek in is correct!!
self.first = True
if self.playlist.nodes.get('program'):
self.clip_nodes = self.playlist.nodes.get('program')
self.node_count = len(self.clip_nodes)
@ -333,6 +345,8 @@ class GetSourceFromPlaylist:
self.node_count = 0
self.playlist.last_mod_time = 0.0
self.last_error = self.playlist.error
def init_time(self):
"""
get current time in second and shift it when is necessary
@ -353,6 +367,7 @@ class GetSourceFromPlaylist:
to get the date for a new playlist
"""
if self.node is None:
# a node is necessary for calculation
return
# calculate the length when current clip is done
@ -361,11 +376,11 @@ class GetSourceFromPlaylist:
current_length = self.node['begin'] - _playlist.start + (
self.node['out'] - seek)
if _playlist.length and self.node and math.isclose(
if _playlist.length and math.isclose(
_playlist.length, current_length, abs_tol=_general.threshold):
shift = self.node['out'] - seek
self.playlist.list_date = get_date(False, shift)
self.prev_date = get_date(False, shift)
self.playlist.list_date = self.prev_date
self.playlist.last_mod_time = 0.0
self.last_time = _playlist.start - 1
self.clip_nodes = []
@ -390,12 +405,14 @@ class GetSourceFromPlaylist:
self.node['filter'] = build_filtergraph(self.node, self.prev_node,
self.next_node)
def eof_handling(self, duration):
def fill_the_gap(self, duration):
"""
handle except playlist end
when playlist not exists, or is not long enough,
fill the gap
"""
self.node = {
'begin': get_time('full_sec'),
'number': 0,
'in': 0,
'seek': 0,
'out': duration,
@ -406,6 +423,28 @@ class GetSourceFromPlaylist:
self.generate_cmd()
self.check_for_next_playlist()
def eof_handling(self, begin):
"""
handle except playlist end
"""
if stdin_args.loop and self.node:
# when loop paramter is set and playlist node exists,
# jump to playlist start and play again
self.list_start = self.node['begin'] + (
self.node['out'] - self.node['seek'])
self.node = None
messenger.info('Loop playlist')
elif begin == _playlist.start or not self.clip_nodes:
# playlist not exist or is corrupt/empty
messenger.error('Clip nodes are empty!')
self.first = False
self.fill_the_gap(30)
else:
messenger.error('Playlist not long enough!')
self.fill_the_gap(60)
def next(self):
"""
endless loop for reading playlists
@ -453,32 +492,13 @@ class GetSourceFromPlaylist:
begin += self.node['out'] - self.node['seek']
else:
if stdin_args.loop and self.node:
# when loop paramter is set and playlist node exists,
# jump to playlist start and play again
self.list_start = self.node['begin'] + (
self.node['out'] - self.node['seek'])
self.node = None
messenger.info('Loop playlist')
elif not _playlist.length and not stdin_args.loop:
if not _playlist.length and not stdin_args.loop:
# when we reach playlist end, stop script
# TODO: take next playlist, without sync check
messenger.info('Playlist reached end!')
return None
elif begin == _playlist.start or not self.clip_nodes:
# playlist not exist or is corrupt/empty
messenger.error('Clip nodes are empty!')
self.first = True
self.last = False
self.eof_handling(30)
else:
messenger.error('Playlist not long enough!')
self.first = False
self.last = False
self.eof_handling(60)
self.eof_handling(begin)
if self.node:
yield self.node