From: Guillaume Pellerin Date: Tue, 9 Dec 2014 23:28:31 +0000 (+0100) Subject: fix no separated audio tracks in kdenlive parser X-Git-Tag: 1.5.0rc3~4^2 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=ea33e9abb24193360f2db0162a9c2ac170c637d7;p=telemeta.git fix no separated audio tracks in kdenlive parser --- diff --git a/telemeta/util/kdenlive/session.py b/telemeta/util/kdenlive/session.py index 6c6b1380..74eb4258 100644 --- a/telemeta/util/kdenlive/session.py +++ b/telemeta/util/kdenlive/session.py @@ -39,115 +39,114 @@ from telemeta.util.xmltodict2 import * class KDEnLiveSession(object): - def __init__(self, path): - self.session = xmltodict(path) - - def entries(self): - entries = [] - for attr in self.session['children']: - if 'playlist' in attr['name'] and 'children' in attr: - for att in attr['children']: - if 'entry' in att['name'] and att['attributes']['producer'] != 'black': - entries.append(att['attributes']) - return entries - - def video_entries(self): - entries = [] - for attr in self.session['children']: - if 'playlist' in attr['name'] and 'children' in attr: - for att in attr['children']: - if 'entry' in att['name'] and att['attributes']['producer'] != 'black' \ - and 'video' in att['attributes']['producer']: - entries.append(att['attributes']) - return entries - - - def entries_sorted(self): - return sorted(self.entries(), key=lambda k: int(k['in']), reverse=False) - - def entries_video_seconds(self): - fps = float(self.profile()['frame_rate_num']) - list = [] - entries = self.video_entries() - for i in range(0,len(entries)): - id = entries[i]['producer'].split('_')[0] - t_in = int(entries[i]['in'])/fps - t_out = int(entries[i]['out'])/fps - - if i == 0: - t = 0 - else: - t = list[i-1]['t'] + int(entries[i-1]['out'])/fps - int(entries[i-1]['in'])/fps - - list.append({'id' : id, 't': t, 'in': t_in , 'out': t_out }) - - return list - - def cuts(self, entries): - i = 0 - cuts = [0, ] - for entry in entries: - if i > 0: - cuts.append(cuts[i-1] + int(entries[i]['in'])-int(entries[i-1]['out'])) - i += 1 - return cuts - - def first_video_frame(self): - return int(self.entries_sorted()[0]['in']) - - def profile(self): - for attr in self.session['children']: - if 'profile' in attr['name']: - return attr['attributes'] - - def fix_text(self, text): - try: - s = text.split(' ') - i = int(s[1]) - s.insert(2, ':') - return ' '.join(s) - except: - return text - - def markers(self, offset=0, from_first_marker=False): - """ by default return a dict of markers with timecodes relative to an origin - - if from_first_marker=False: the origin is the first entry timecode - if from_first_marker=True: the origin is the first entry timecode before the first marker - - offset: general origin offset - """ - - abs_time = 0 - markers = [] - i = 0 - entries = self.entries_video_seconds() - - for attr in self.session['children']: - if 'kdenlivedoc' in attr['name']: - - for att in attr['children']: - if 'markers' in att['name'] and 'children' in att.keys(): - - for at in att['children']: - if 'marker' in at['name']: - - marker_time = float(at['attributes']['time'].replace(',','.')) - id = at['attributes']['id'] - rel_time = 0 - - for entry in entries: - if marker_time >= entry['in'] and marker_time <= entry['out'] and id == entry['id']: - if i == 0 and from_first_marker: - abs_time = entry['t'] - rel_time = entry['t'] + (marker_time - entry['in']) - abs_time + offset - break - - at['attributes']['time'] = rel_time - at['attributes']['session_timecode'] = time.strftime('%H:%M:%S', time.gmtime(rel_time)) - at['attributes']['comment'] = self.fix_text(at['attributes']['comment']) - markers.append(at['attributes']) - - i += 1 - return markers + def __init__(self, path): + self.session = xmltodict(path) + + def entries(self): + entries = [] + for attr in self.session['children']: + if 'playlist' in attr['name'] and 'children' in attr: + for att in attr['children']: + if 'entry' in att['name'] and att['attributes']['producer'] != 'black': + entries.append(att['attributes']) + return entries + + def video_entries(self): + entries = [] + for attr in self.session['children']: + if 'playlist' in attr['name'] and 'children' in attr: + for att in attr['children']: + if 'entry' in att['name'] and att['attributes']['producer'] != 'black' \ + and not 'audio' in att['attributes']['producer']: + entries.append(att['attributes']) + return entries + + def entries_sorted(self): + return sorted(self.entries(), key=lambda k: int(k['in']), reverse=False) + + def entries_video_seconds(self): + fps = float(self.profile()['frame_rate_num']) + list = [] + entries = self.video_entries() + for i in range(0,len(entries)): + id = entries[i]['producer'].split('_')[0] + t_in = int(entries[i]['in'])/fps + t_out = int(entries[i]['out'])/fps + + if i == 0: + t = 0 + else: + t = list[i-1]['t'] + int(entries[i-1]['out'])/fps - int(entries[i-1]['in'])/fps + + list.append({'id' : id, 't': t, 'in': t_in , 'out': t_out }) + + return list + + def cuts(self, entries): + i = 0 + cuts = [0, ] + for entry in entries: + if i > 0: + cuts.append(cuts[i-1] + int(entries[i]['in'])-int(entries[i-1]['out'])) + i += 1 + return cuts + + def first_video_frame(self): + return int(self.entries_sorted()[0]['in']) + + def profile(self): + for attr in self.session['children']: + if 'profile' in attr['name']: + return attr['attributes'] + + def fix_text(self, text): + try: + s = text.split(' ') + i = int(s[1]) + s.insert(2, ':') + return ' '.join(s) + except: + return text + + def markers(self, offset=0, from_first_marker=False): + """ by default return a dict of markers with timecodes relative to an origin + + if from_first_marker=False: the origin is the first entry timecode + if from_first_marker=True: the origin is the first entry timecode before the first marker + + offset: general origin offset + """ + + abs_time = 0 + markers = [] + i = 0 + entries = self.entries_video_seconds() + + for attr in self.session['children']: + if 'kdenlivedoc' in attr['name']: + + for att in attr['children']: + if 'markers' in att['name'] and 'children' in att.keys(): + + for at in att['children']: + if 'marker' in at['name']: + + marker_time = float(at['attributes']['time'].replace(',','.')) + id = at['attributes']['id'] + rel_time = 0 + + for entry in entries: + if marker_time >= entry['in'] and marker_time <= entry['out'] and id == entry['id']: + if i == 0 and from_first_marker: + abs_time = entry['t'] + rel_time = entry['t'] + (marker_time - entry['in']) - abs_time + offset + break + + at['attributes']['time'] = rel_time + at['attributes']['session_timecode'] = time.strftime('%H:%M:%S', time.gmtime(rel_time)) + at['attributes']['comment'] = self.fix_text(at['attributes']['comment']) + markers.append(at['attributes']) + + i += 1 + return markers