add ffprobe wrapper

This commit is contained in:
j 2012-06-11 12:11:06 +02:00
parent 77d7d7a2ec
commit d6be4b20f7

View file

@ -13,6 +13,12 @@ from ox.utils import json
__all__ = ['sha1sum', 'oshash', 'avinfo', 'makedirs'] __all__ = ['sha1sum', 'oshash', 'avinfo', 'makedirs']
def cmd(program):
local = os.path.expanduser('~/.ox/bin/%s' % program)
if os.path.exists(local):
program = local
return program
def sha1sum(filename): def sha1sum(filename):
sha1 = hashlib.sha1() sha1 = hashlib.sha1()
file=open(filename) file=open(filename)
@ -62,10 +68,7 @@ def oshash(filename):
def avinfo(filename): def avinfo(filename):
if os.path.getsize(filename): if os.path.getsize(filename):
ffmpeg2theora = 'ffmpeg2theora' ffmpeg2theora = cmd('ffmpeg2theora')
local = os.path.expanduser('~/.ox/bin/ffmpeg2theora')
if os.path.exists(local):
ffmpeg2theora = local
p = subprocess.Popen([ffmpeg2theora], stdout=subprocess.PIPE, stderr=subprocess.PIPE) p = subprocess.Popen([ffmpeg2theora], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
info, error = p.communicate() info, error = p.communicate()
version = info.split('\n')[0].split(' - ')[0].split(' ')[-1] version = info.split('\n')[0].split(' - ')[0].split(' ')[-1]
@ -90,6 +93,83 @@ def avinfo(filename):
return {'path': filename, 'size': 0} return {'path': filename, 'size': 0}
def ffprobe(filename):
p = subprocess.Popen([
cmd('ffprobe'),
'-show_format',
'-show_streams',
'-print_format',
'json',
'-i', filename
], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
info, error = p.communicate()
ffinfo = json.loads(info)
def fix_value(key, value):
if key == 'r_frame_rate':
value = value.replace('/', ':')
elif key == 'bit_rate':
value = float(value) / 1000
elif key == 'duration':
value = float(value)
elif key == 'size':
value = int(value)
return value
info = {}
for key in ('duration', 'size', 'bit_rate'):
info[{
'bit_rate': 'bitrate'
}.get(key, key)] = fix_value(key, ffinfo['format'][key])
info['audio'] = []
info['video'] = []
info['metadata'] = ffinfo['format'].get('tags', {})
for s in ffinfo['streams']:
tags = s.pop('tags', {})
for t in tags:
info['metadata'][t] = tags[t]
if s.get('codec_type') in ('audio', 'video'):
stream = {}
keys = [
'codec_name',
'width',
'height',
'bit_rate',
'index',
'display_aspect_ratio',
'sample_rate',
'channels',
]
if s['codec_type'] == 'video':
keys += [
'sample_aspect_ratio',
'r_frame_rate',
'pix_fmt',
]
for key in keys:
if key in s:
stream[{
'codec_name': 'codec',
'bit_rate': 'bitrate',
'index': 'id',
'r_frame_rate': 'framerate',
'sample_rate': 'samplerate',
'pix_fmt': 'pixel_format',
}.get(key, key)] = fix_value(key, s[key])
info[s['codec_type']].append(stream)
else:
pass
#print s
for v in info['video']:
if not 'display_aspect_ratio' in v and 'width' in v:
v['display_aspect_ratio'] = '%d:%d' % (v['width'], v['height'])
v['pixel_aspect_ratio'] = '1:1'
info['oshash'] = ox.oshash(filename)
info['path'] = os.path.basename(filename)
return info
def makedirs(path): def makedirs(path):
if not os.path.exists(path): if not os.path.exists(path):
try: try: