Beispiel #1
0
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
Beispiel #2
0
 def bucket(self):
     if not getattr(self, '_bucket', None):
         self._bucket = s3connection().get_bucket(
             app.config['VIDEO_S3_BUCKET'], validate=False)
     return self._bucket