swaroop: clear out viewer when deselecting playlist.
[dcpomatic.git] / hacks / make_dummy_files
1 #!/usr/bin/python
2
3 import sys
4 import os
5 import ntpath
6 import tempfile
7 import shutil
8 import xml.etree.ElementTree as ET
9
10 if len(sys.argv) < 2:
11     print 'Syntax: %s <film>' % sys.argv[1]
12     sys.exit(1)
13
14 tree = ET.parse(os.path.join(sys.argv[1], 'metadata.xml'))
15
16 try:
17     os.makedirs(os.path.join(sys.argv[1], 'dummy'))
18 except:
19     pass
20
21 for c in tree.getroot().find('Playlist').findall('Content'):
22     type = c.find('Type').text
23     if type == 'DCP':
24         # Find the ASSETMAP
25         assetmap_file = None
26         for p in c.findall('Path'):
27             if os.path.basename(p.text) == 'ASSETMAP':
28                 assetmap_file = p.text
29
30         assert(assetmap_file is not None)
31         dir = os.path.dirname(assetmap_file)
32
33         assets = {}
34
35         assetmap = ET.parse(assetmap_file)
36         ns = {'am': 'http://www.digicine.com/PROTO-ASDCP-AM-20040311#'}
37         for a in assetmap.getroot().find('am:AssetList', ns).findall('am:Asset', ns):
38             assets[a.find('am:Id', ns).text[9:]] = a.find('am:ChunkList', ns).find('am:Chunk', ns).find('am:Path', ns).text
39
40         cpl_id = None
41         for k, v in assets.iteritems():
42             try:
43                 e = ET.parse(os.path.join(dir, v))
44                 if e.getroot().tag == '{http://www.digicine.com/PROTO-ASDCP-CPL-20040511#}CompositionPlaylist':
45                     cpl_id = k
46             except:
47                 pass
48
49         assert(cpl_id is not None)
50         cpl = ET.parse(os.path.join(dir, assets[cpl_id]))
51
52         ns = {'cpl': 'http://www.digicine.com/PROTO-ASDCP-CPL-20040511#'}
53         for r in cpl.find('cpl:ReelList', ns).findall('cpl:Reel', ns):
54             for a in r.find('cpl:AssetList', ns).iter():
55                 if a.tag == '{%s}MainPicture' % ns['cpl']:
56                     id = a.find('cpl:Id', ns).text[9:]
57                     duration = int(a.find('cpl:IntrinsicDuration', ns).text)
58                     black_png = tempfile.NamedTemporaryFile('wb', suffix='.png')
59                     black_j2c = tempfile.NamedTemporaryFile('wb', suffix='.j2c')
60                     os.system('convert -size 1998x1080 xc:black %s' % black_png.name)
61                     os.system('image_to_j2k -i %s -o %s' % (black_png.name, black_j2c.name))
62                     j2c_dir = tempfile.mkdtemp()
63                     print j2c_dir
64                     for i in range(0, duration):
65                         shutil.copyfile(black_j2c.name, os.path.join(j2c_dir, '%06d.j2c' % i))
66                     os.system('asdcp-wrap -a %s %s %s' % (id, j2c_dir, os.path.join(sys.argv[1], 'dummy', assets[id])))
67                 elif a.tag == '{%s}MainSound' % ns['cpl']:
68                     wav = tempfile.NamedTemporaryFile('wb', suffix='.wav')
69                     id = a.find('cpl:Id', ns).text[9:]
70                     duration = int(a.find('cpl:IntrinsicDuration', ns).text)
71                     edit_rate = int(a.find('cpl:EditRate', ns).text.split()[0])
72                     os.system('sox -n -r 48000 -c 6 %s trim 0.0 %f' % (wav.name, float(duration) / edit_rate))
73                     os.system('asdcp-wrap -a %s %s %s' % (id, wav.name, os.path.join(sys.argv[1], 'dummy', assets[id])))
74     elif type == 'Sndfile':
75         audio_frame_rate = int(c.find('AudioFrameRate').text)
76         channels = int(c.find('AudioMapping').find('InputChannels').text)
77         path = os.path.join(sys.argv[1], 'dummy', ntpath.basename(c.find('Path').text))
78         audio_length = int(c.find('AudioLength').text)
79         os.system('sox -n -r %d -c %d %s trim 0.0 %f' % (audio_frame_rate, channels, path, float(audio_length) / audio_frame_rate))
80     elif type == 'FFmpeg':
81         if c.find('VideoFrameRate') is not None:
82             video_frame_rate = int(c.find('VideoFrameRate').text)
83             video_length = int(c.find('VideoLength').text)
84             path = os.path.join(sys.argv[1], 'dummy', ntpath.basename(c.find('Path').text))
85             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))
86         elif c.find('AudioGain') is not None:
87             audio_frame_rate = int(c.find('AudioStream').find('FrameRate').text)
88             channels = int(c.find('AudioStream').find('Mapping').find('InputChannels').text)
89             path = os.path.join(sys.argv[1], 'dummy', ntpath.basename(c.find('Path').text))
90             audio_length = int(c.find('AudioStream').find('Length').text)
91             os.system('sox -n -r %d -c %d %s trim 0.0 %f' % (audio_frame_rate, channels, path, float(audio_length) / audio_frame_rate))
92         else:
93             print 'Skipped %s' % type
94     elif type == 'Image':
95         width = int(c.find('VideoWidth').text)
96         height = int(c.find('VideoHeight').text)
97         path = os.path.join(sys.argv[1], 'dummy', ntpath.basename(c.find('Path').text))
98         os.system('convert -size %dx%d xc:black "%s"' % (width, height, path))
99     else:
100         print 'Skipped %s' % type