def create_asset(s3path, metadata): # get metadata from s3 chunk_size = 2 ** 23 bucket = s3connection().get_bucket(app.config['VIDEO_S3_BUCKET']) key = bucket.get_key(s3path) if not key: app.logger.error('s3://%s/%s not found', bucket.name, s3path) return file_size = key.size file_name = os.path.basename(key.name) name = metadata.pop('title', None) or os.path.splitext(file_name)[0].capitalize() # check if asset already exists name_exists = "name='%s'" % name.replace("'", "\\'") assets = _ooyala_feed('assets', params=dict(where=name_exists, include='metadata')) if assets['items'] and assets['items'][0]['name'] == name: app.logger.warning('Asset already exists for "%s"', name) return # create asset on ooyala asset = dict( asset_type='video', file_name=file_name, name=name, file_size=file_size, chunk_size=chunk_size, ) response = _ooyala_feed('assets', data=json.dumps(asset)) assetid = response['embed_code'] # set label and metadata labelname = metadata.pop('label', None) if labelname: idmap = dict((l['name'], l['id']) for l in _ooyala_feed('labels')['items']) if labelname in idmap: labelid = idmap[labelname] else: labelid = _ooyala_feed('labels', data=json.dumps(dict(name=labelname)))['id'] _ooyala_feed('assets', assetid, 'labels', labelid, method='put') if metadata: _ooyala_feed('assets', assetid, 'metadata', method='patch', data=json.dumps(metadata)) # copy video data from s3 to ooyala range = -1, -1 for upload_url in _ooyala_feed('assets', assetid, 'uploading_urls'): range = range[1] + 1, min(range[1] + chunk_size, file_size - 1) buf = key.get_contents_as_string(headers={'Range': 'bytes=%d-%d' % range}) response = requests.put(upload_url, buf) response.raise_for_status() assert response.status_code == 204 _ooyala_feed('assets', assetid, 'upload_status', method='put', data=json.dumps(dict(status='uploaded'))) return assetid
def bucket(self): if not getattr(self, '_bucket', None): self._bucket = s3connection().get_bucket( app.config['VIDEO_S3_BUCKET'], validate=False) return self._bucket