def create_cover_thumbnails(video_id, cover_filename=None): def _thumbnail(label, size): return VideoThumbnail.from_cover_image(cover_filename, video.account_id, label, size) video = Video.query.get(video_id) assert video.external_id cover_filepath = urlparse(video.thumbnails[0].url).path if cover_filename != cover_filepath.rsplit('/', 1)[-1]: current_app.logger.warning('Unexpected cover image: %d: %s: %s', video_id, cover_filename, cover_filepath) return imgdata = StringIO(download_file(media_bucket, cover_filepath)) image = Image.open(imgdata) video.thumbnails = [_thumbnail(None, image.size)] sizes = [size for size in current_app.config['COVER_THUMBNAIL_SIZES'] if size < image.size] for size, buf in resize(image, sizes, save_to_buffer='jpeg'): thumbnail = _thumbnail(str(size[0]), size) upload_file(media_bucket, urlparse(thumbnail.url).path, buf, 'image/jpeg') video.thumbnails.append(thumbnail) imgdata = buf try: ooyala_request('assets', video.external_id, 'preview_image_files', method='post', data=imgdata.getvalue()) except Exception: current_app.logger.exception('Unable to set preview image for %d (%s)', video.id, video.external_id)
def _videos_request(feed, path='', breakdown_by='', limit=50, page_token=None): q_params = dict(limit=limit) if page_token: q_params['page_token'] = page_token if breakdown_by: q_params['breakdown_by'] = breakdown_by return ooyala.ooyala_request(feed, path, query_params=q_params)
def _create_video_record(asset, account_id, tag_id): video = Video.query.filter_by(external_id=asset['embed_code']).first() if video: return video, False video = Video( account_id=account_id, status='published', date_added=asset['created_at'], date_updated=asset['updated_at'], title=asset['name'], duration=asset['duration'] / 1000, filename='dolly', external_id=asset['embed_code'], category=asset['metadata'].get('category'), ) db.session.add(video) preview_image = ooyala.ooyala_request('assets', asset['embed_code'], 'primary_preview_image') for t in preview_image['sizes']: t.pop('time', None) video.thumbnails = [VideoThumbnail(**t) for t in preview_image['sizes']] video.record_workflow_event('imported from ooyala') if tag_id: db.session.flush() db.session.add(VideoTagVideo(video_id=video.id, tag_id=tag_id)) return video, True
def import_videos_from_ooyala(label=None): next_page_token = None while True: params = dict(limit=100, include='metadata') if label: params['where'] = "labels INCLUDES '%s'" % label if next_page_token: params['page_token'] = next_page_token response = ooyala.ooyala_request('assets', params=params) for asset in response['items']: if asset['status'] != 'live': current_app.logger.warning('Video not "live": %s', asset['embed_code']) continue try: channel = asset['metadata']['channel'] user = asset['metadata']['user'] except KeyError: current_app.logger.error('No metadata found: %s', asset['embed_code']) continue else: account, created = _create_account_record(user) tag, created = _create_tag_record(channel, account) video, created = _create_video_record(asset, account.id, tag and tag.id) if created: current_app.logger.debug('Created video record: %s/%s/%s', account.id, tag.id if tag else '-', video.id) if 'next_page' in response: next_page_token = parse_qs(response['next_page'])['page_token'][0] else: break
def put(self, video): args = self.preview_image_parser.parse_args() thumbnails = ooyala_request( 'assets', video.external_id, 'primary_preview_image', data=json.dumps(dict(type='generated', time=args['time'])), method='put') video.thumbnails = [ VideoThumbnail(url=t['url'], width=t['width'], height=t['height']) for t in thumbnails['sizes'] ] return dict(image=dict(items=thumbnails['sizes']))
def check_ooyala_processing_status(): videos = Video.query.filter(Video.status == 'processing', Video.external_id != None) videoids = dict(videos.values('external_id', 'id')) if not videoids: return params = dict(where="embed_code in ('%s')" % "', '".join(videoids)) for asset in ooyala.ooyala_request('assets', params=params)['items']: if not asset['status'] == 'processing': video = Video.query.filter_by(external_id=asset['embed_code']).first() data = ooyala.get_video_data(asset['embed_code']) update_video_status(video, data)
def migrate_video_files(account): for video in Video.query.filter_by(account_id=account, filename='dolly'): metadata = ooyala.ooyala_request('assets', video.external_id, 'metadata') key = video_bucket.get_key(metadata['path']) assert key.size < 5 * 2 ** 30 # can't copy files bigger than this video.filename = get_random_filename() dst = Video.get_video_filepath(account, video.filename) key.copy(video_bucket.name, dst) key.delete() ooyala.set_metadata(video.external_id, dict(path=dst, label=account)) db.session.commit()
def _source_content_url(assetid): streams = ooyala_request('assets', assetid, 'streams') return next(s['url'] for s in streams if s['stream_type'] == 'single' and s['muxing_format'] == 'MP4' and s['average_video_bitrate'] > 1200)
def get(self, video): items = ooyala_request('assets', video.external_id, 'generated_preview_images') return dict(image=dict(items=items))