Skip to content

Instantly share code, notes, and snippets.

@rjmoggach
Created October 25, 2012 15:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rjmoggach/3953411 to your computer and use it in GitHub Desktop.
Save rjmoggach/3953411 to your computer and use it in GitHub Desktop.
bash command line script interface for zencoder-py
#!/usr/bin/python
import os, sys
from optparse import OptionParser
from zencoder import Zencoder
DEBUG=False
if os.environ.get('ZENCODER_API_KEY'):
ZENCODER_API_KEY=os.environ.get('ZENCODER_API_KEY')
elif DEBUG:
if os.environ.get('ZENCODER_API_KEY_TESTING'):
ZENCODER_API_KEY=os.environ.get('ZENCODER_API_KEY_TESTING')
else:
print "ERROR: No ZENCODER_API_KEY found."
sys.exit(0)
zen = Zencoder(ZENCODER_API_KEY)
# these are some sane defaults, edit as you prefer
OUTPUT_DICT = {
'hi' : { 'width': 960, 'height': 540,'base_url': 'url', 'filename': 'file-960x540.mp4', 'audio_bitrate': 128, 'audio_sample_rate': 44100, 'max_frame_rate': 24, 'h264_profile': 'main', 'h264_level': 3.1, 'max_video_bitrate': 3500 },
'base' : { 'width': 640, 'height': 360,'base_url': 'url', 'filename': 'file-640x360.mp4', 'audio_bitrate': 128, 'audio_sample_rate': 44100, 'max_frame_rate': 24, 'max_video_bitrate': 1500 },
'webm' : { 'width': 640, 'height': 360,'base_url': 'url', 'filename': 'file-640x360.webm', 'audio_bitrate': 128, 'audio_sample_rate': 44100, 'max_frame_rate': 24, 'max_video_bitrate': 1500 },
'ogg' : { 'width': 640, 'height': 360,'base_url': 'url', 'filename': 'file-640x360.ogv', 'audio_bitrate': 128, 'audio_sample_rate': 44100, 'max_frame_rate': 24, 'max_video_bitrate': 1500 },
'uni' : { 'width': 480, 'height': 270,'base_url': 'url', 'filename': 'file-480x270.mp4', 'audio_bitrate': 128, 'audio_sample_rate': 44100, 'max_frame_rate': 24, 'max_video_bitrate': 1500 }
}
# this is a sample stream config - not tested
OUTPUT_DICT_STREAM = {
's64k' : { 'audio_bitrate': 56, 'audio_sample_rate': 22050, 'base_url': 'url', 'filename': 'file-64k.m3u8', 'format': 'aac', 'type': 'segmented' },
's150k': { 'audio_bitrate': 56, 'audio_sample_rate': 22050, 'base_url': 'url', 'filename': 'file-150k.m3u8', 'decoder_bitrate_cap': 165, 'decoder_buffer_size': 440, 'max_frame_rate': 10, 'type': 'segmented', 'video_bitrate': 110, 'width': 320, 'format': 'ts' },
's240k': { 'audio_bitrate': 56, 'audio_sample_rate': 22050, 'base_url': 'url', 'filename': 'file-240k.m3u8', 'decoder_bitrate_cap': 300, 'decoder_buffer_size': 800, 'max_frame_rate': 15, 'type': 'segmented', 'video_bitrate': 200, 'width': 400, 'format': 'ts' },
's440k': { 'audio_bitrate': 56, 'audio_sample_rate': 22050, 'base_url': 'url', 'filename': 'file-440k.m3u8', 'decoder_bitrate_cap': 600, 'decoder_buffer_size': 1600, 'max_frame_rate': 30, 'type': 'segmented', 'video_bitrate': 400, 'width': 400, 'format': 'ts' },
's640k': { 'audio_bitrate': 56, 'audio_sample_rate': 22050, 'base_url': 'url', 'filename': 'file-640k.m3u8', 'decoder_bitrate_cap': 900, 'decoder_buffer_size': 2400, 'max_frame_rate': 30, 'type': 'segmented', 'video_bitrate': 600, 'width': 400, 'format': 'ts' },
'pl' : { 'base_url': 'url', 'filename': 'file.m3u8',
'streams': [
{ 'bandwidth': 440, 'path': 'file-440k.m3u8' },
{ 'bandwidth': 640, 'path': 'file-640k.m3u8' },
{ 'bandwidth': 240, 'path': 'file-240k.m3u8' },
{ 'bandwidth': 150, 'path': 'file-150k.m3u8' },
{ 'bandwidth': 64, 'path': 'file-64k.m3u8' }
],
'type': 'playlist'
}
}
def return_output_tuple(src_video, base_url, dest_prefix, output_dict):
for profile,params in output_dict.items():
output_dict[profile]['base_url'] = params['base_url'].replace('url', base_url)
output_dict[profile]['filename'] = params['filename'].replace('file',dest_prefix)
if profile == 'pl':
for k,v in enumerate(output_dict['pl']['streams']):
output_dict[profile]['streams'][k]['path'] = params['streams'][k]['path'].replace('file', dest_prefix)
output_dict[profile]['label'] = profile
output_dict[profile]['public'] = 1
output_tuple = tuple(output_dict.values())
return output_tuple
def encode(input_src, outputs):
job = zen.job.create(input_src, outputs)
print job.body['outputs'][0]['id']
def progress(job_id):
progress = zen.job.progress(job_id)
print progress
def main():
usage = 'usage: %prog [-e|-p|-h]'
description = 'Encode an S3 uploaded video to various output formats'
parser = OptionParser(usage=usage, description=description)
parser.add_option('-e', '--encode', dest='encode', help='Encode uploaded asset', action='store_true', default=False)
parser.add_option('-p', '--progress', dest='progress', help='Check progress of encode job id', action='store_true', default=False)
(options, args) = parser.parse_args()
if options.encode:
print 'Enter the src S3 bucket name:\n\tEg. zencode.mysite.com'
src_bucket=raw_input('\tsrc_bucket > ')
src_bucket='s3://%s' % src_bucket
print 'Enter the src file name:\n\tEg. great-video-720p.mov or raw/great-video-720p.mov'
src_video=raw_input('\tsrc_video > ')
src_video='%s/%s' % (src_bucket, src_video)
print 'Enter the output file name without extension:\n\tEg. great-video'
dest_prefix=raw_input('\tdest_prefix > ')
print 'Enter the dest S3 bucket with no leading/trailing slashes:\n\tEg. s3.mysite.com'
dest_bucket=raw_input('\tdest_bucket > ')
print 'Enter the dest path with no leading/trailing slashes:\n\tEg. video/2012\n\t all files will be within a subfolder that matches the output name above'
dest_dir=raw_input('\tdest_dir > ')
base_url = 's3://%s/%s/%s' % (dest_bucket, dest_dir, dest_prefix)
outputs = return_output_tuple(src_video, base_url, dest_prefix, OUTPUT_DICT)
job = zen.job.create(src_video, outputs)
print "\n\nEncode has started with the following parameters:\n\tsrc_video: %s\n\tdest_video: %s/%s/%s<suffix>\n\nYou can view the results at:" % (src_video, base_url, dest_prefix, dest_prefix)
for output in outputs:
print "\t%s/%s" % (output['base_url'], output['filename'])
elif options.progress:
print 'Enter the job id:\n\tEg. 12345'
job_id=raw_input('\tjob_id > ')
progress(job_id)
else:
print usage
sys.exit(0)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment