-#!/usr/bin/python
+#!/usr/bin/python3
import sys
import os
+import hashlib
import ntpath
import tempfile
import shutil
import xml.etree.ElementTree as ET
if len(sys.argv) < 2:
- print 'Syntax: %s <film>' % sys.argv[1]
+ print('Syntax: %s <film>' % sys.argv[1])
sys.exit(1)
-tree = ET.parse(os.path.join(sys.argv[1], 'metadata.xml'))
+metadata_xml = os.path.join(sys.argv[1], 'metadata.xml');
+tree = ET.parse(metadata_xml)
+
+def digest_head_tail(filename, size=1000000):
+ m = hashlib.md5()
+ f = open(filename, 'rb')
+ m.update(f.read(size))
+ f.seek(size, 2)
+ m.update(f.read(size))
+ f.close()
+ return m.hexdigest() + str(os.path.getsize(filename))
+
+def command(c):
+ print(f"=> {c}")
+ os.system(c)
+
try:
os.makedirs(os.path.join(sys.argv[1], 'dummy'))
except:
pass
-for c in tree.getroot().find('Playlist').findall('Content'):
+root = tree.getroot()
+
+for c in root.find('Playlist').findall('Content'):
type = c.find('Type').text
if type == 'DCP':
# Find the ASSETMAP
os.system('convert -size 1998x1080 xc:black %s' % black_png.name)
os.system('image_to_j2k -i %s -o %s' % (black_png.name, black_j2c.name))
j2c_dir = tempfile.mkdtemp()
- print j2c_dir
for i in range(0, duration):
shutil.copyfile(black_j2c.name, os.path.join(j2c_dir, '%06d.j2c' % i))
os.system('asdcp-wrap -a %s %s %s' % (id, j2c_dir, os.path.join(sys.argv[1], 'dummy', assets[id])))
audio_length = int(c.find('AudioLength').text)
os.system('sox -n -r %d -c %d %s trim 0.0 %f' % (audio_frame_rate, channels, path, float(audio_length) / audio_frame_rate))
elif type == 'FFmpeg':
+ have_video = False
+ have_audio = False
+ path = os.path.join(sys.argv[1], 'dummy', ntpath.basename(c.find('Path').text))
if c.find('VideoFrameRate') is not None:
- video_frame_rate = int(c.find('VideoFrameRate').text)
+ video_frame_rate = float(c.find('VideoFrameRate').text)
video_length = int(c.find('VideoLength').text)
- path = os.path.join(sys.argv[1], 'dummy', ntpath.basename(c.find('Path').text))
- os.system('ffmpeg -t %d -s qcif -f rawvideo -pix_fmt rgb24 -r %d -i /dev/zero -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=48000 -shortest "%s"' % (float(video_length) / video_frame_rate, video_frame_rate, path))
+ have_video = True
+ command(f"ffmpeg -t {float(video_length) / video_frame_rate} -s qcif -f rawvideo -pix_fmt rgb24 -r {video_frame_rate} -i /dev/zero video.mkv")
+ if c.find('AudioStream') is not None:
+ audio_channels = int(c.find('AudioStream').find('Mapping').find('InputChannels').text)
+ audio_length = int(c.find('AudioStream').find('Length').text)
+ audio_frame_rate = int(c.find('AudioStream').find('FrameRate').text)
+ names = { 1: 'mono', 2: 'stereo', 3: '3.0', 4: '4.0', 5: '4.1', 6: '5.1', 7: '6.1', 8: '7.1' }
+ have_audio = True
+ print(f"audio_length={audio_length} frame_rate={audio_frame_rate}")
+ command(f'sox -n -r 48000 -c {audio_channels} audio.wav trim 0.0 {audio_length}s')
+ if have_video and have_audio:
+ command(f"ffmpeg -i video.mkv -i audio.wav {path}")
+ elif have_video:
+ shutil.move("video.mkv", path)
+ elif have_audio:
+ shutil.move("audio.wav", path)
+ try:
+ os.remove("video.mkv")
+ os.remove("audio.mkv")
+ except:
+ pass
+ c.find('Path').text = path
+ c.find('Digest').text = digest_head_tail(path)
elif type == 'Image':
width = int(c.find('VideoWidth').text)
height = int(c.find('VideoHeight').text)
path = os.path.join(sys.argv[1], 'dummy', ntpath.basename(c.find('Path').text))
os.system('convert -size %dx%d xc:black "%s"' % (width, height, path))
else:
- print 'Skipped %s' % type
+ print('Skipped %s' % type)
+
+
+shutil.move(metadata_xml, metadata_xml + '.bak')
+r = open(metadata_xml, 'w')
+r.write(ET.tostring(root).decode('UTF-8'))
+r.close()
+