]> git.parisson.com Git - telemeta.git/commitdiff
fix no separated audio tracks in kdenlive parser prob
authorGuillaume Pellerin <yomguy@parisson.com>
Tue, 9 Dec 2014 23:28:31 +0000 (00:28 +0100)
committerGuillaume Pellerin <yomguy@parisson.com>
Tue, 9 Dec 2014 23:33:24 +0000 (00:33 +0100)
Conflicts:
telemeta/util/kdenlive/session.py

telemeta/util/kdenlive/session.py [new file with mode: 0644]

diff --git a/telemeta/util/kdenlive/session.py b/telemeta/util/kdenlive/session.py
new file mode 100644 (file)
index 0000000..74eb425
--- /dev/null
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2012-2013 Parisson SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL  license under French law and
+# abiding by the rules of distribution of free software.  You can  use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and  rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty  and the software's author,  the holder of the
+# economic rights,  and the successive licensors  have only  limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading,  using,  modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean  that it is complicated to manipulate,  and  that  also
+# therefore means  that it is reserved for developers  and  experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and,  more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+
+# Authors: Guillaume Pellerin <yomguy@parisson.com>
+
+
+import time
+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 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
+