padmafcp/fcp2json.py
2021-11-05 09:30:49 +00:00

90 lines
2.6 KiB
Python
Executable file

#!/usr/bin/env python3
from __future__ import division
import lxml
import lxml.etree
import ox
import os
import json
import sys
fps = 25
tree = lxml.etree.parse(sys.argv[1])
source = sys.argv[1]
target = '%s.json' % os.path.splitext(source)[0]
data = {
'descriptions': [],
'transcripts': []
}
for g in tree.xpath('//generatoritem'):
#start/end = relative position of the clip in the parent sequence.
#in/out indicate the portion of the source media file to reference.
_in = int(g.findall('in')[0].text)
_out = int(g.findall('out')[0].text)
_start = int(g.findall('start')[0].text)
_end = int(g.findall('end')[0].text)
effect = g.findall('effect')
assert len(effect) == 1
for parameter in effect[0].findall('parameter'):
if parameter.findall('parameterid')[0].text == 'str':
value = parameter.findall('value')[0].text
if _start == -1 and _end == -1:
_start = _in
_end = _out
if _start == -1:
_start = 0
#print _in, _out, _start, _end, value
value = '<br>\n'.join([v.strip() for v in value.strip().split('\r')])
data['transcripts'].append({
'in': _start/fps, 'out': (_end-1)/fps, 'value': value
})
_last = 0
for g in tree.xpath('//clipitem'):
#in/out indicate the portion of the source media file to reference.
#start/end = relative position of the clip in the parent sequence.
_in = int(g.findall('in')[0].text) / fps
_out = int(g.findall('out')[0].text) / fps
_start = int(g.findall('start')[0].text) / fps
_end = int(g.findall('end')[0].text) / fps
name = g.findall('name')[0].text.strip()
#print _in, _out, _start, _end, name
if _start == -0.04:
_start = _last
if _end == -0.04:
_end = _start + (_out - _in)
name = name.replace('.dv', '').replace('_ ', ': ')
id = name.replace(' ', '%20')
value = 'Source: <a href="/%s/%.3f,%.3f">%s %s-%s</a>' % (id, _in, _out, name, ox.format_timecode(_in), ox.format_timecode(_out))
data['descriptions'].append({
'in': _start, 'out': _end-0.04, 'value': value
})
_last = _end
with open(target, 'w') as f:
json.dump(data, f, indent=2)
'''
import os
import ox
import ox.api
item = 'KFB'
api = ox.api.signin('https://pad.ma/api/')
request = {
'item': item,
}
if data['descriptions']:
request['layer'] = 'descriptions'
request['annotations'] = data['descriptions']
r = api.addAnnotations(request)
assert(r['status']['code'] == 200)
if data['transcripts']:
request['layer'] = 'transcripts'
request['annotations'] = data['transcripts']
r = api.addAnnotations(request)
assert(r['status']['code'] == 200)
'''