cuburn/scripts/show.py

68 lines
2.2 KiB
Python
Raw Permalink Normal View History

2015-10-26 04:35:09 -04:00
#!/usr/bin/env python2
import random, os, subprocess, sys
class Shower(object):
def __init__(self):
self.nodes = {}
self.edges_by_src = {}
self.had_webm = False
self.y4m_header = None
def walk_dir(self, dir):
for i in os.listdir(dir):
fn = os.path.join(dir, i)
if not i.endswith('.h264') and not i.endswith('.webm'): continue
if i.startswith('latest'): continue
path = i.rsplit('.', 1)[0].rsplit('_', 1)[0]
if '=' in i:
src, dst = path.split('=')
self.edges_by_src.setdefault(src, set()).add((dst, fn))
else:
self.nodes[path] = fn
if i.endswith('.webm'):
self.had_webm = True
def output(self, path):
sys.stderr.write(path)
if self.had_webm:
self._output_y4m(path)
else:
with open(path) as fp:
self._output_raw(fp)
def _output_y4m(self, path):
subp = subprocess.Popen(['ffmpeg', '-r', '24', '-i', path, '-f', 'yuv4mpegpipe', '-pix_fmt', 'yuv420p', '-'],
stdout=subprocess.PIPE)
y4m_header = subp.stdout.readline()
if self.y4m_header is None:
self.y4m_header = y4m_header
sys.stdout.write(y4m_header)
elif self.y4m_header != y4m_header:
raise ValueError('Different Y4M headers: %s vs %s', repr(y4m_header), repr(self.y4m_header))
self._output_raw(subp.stdout)
def _output_raw(self, fp):
for chunk in iter(lambda: fp.read(1024 * 1024), ''):
sys.stdout.write(chunk)
def run_for(self, n):
src = None
for i in range(n):
if src not in self.nodes:
src = random.choice(self.nodes.keys())
self.output(self.nodes[src])
if src in self.edges_by_src:
src, path = random.choice(list(self.edges_by_src[src]))
self.output(path)
else:
src = None
def main():
shower = Shower()
while True:
shower.walk_dir(sys.argv[1])
shower.run_for(1000)
if __name__ == '__main__':
main()