Created
October 25, 2012 15:35
-
-
Save rjmoggach/3953411 to your computer and use it in GitHub Desktop.
bash command line script interface for zencoder-py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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