def crop_and_store_file(self, doc, content, filename, content_type): # retrieve file name and metadata from file file_name, content_type, metadata = process_file_from_stream(content, content_type=content_type) # crop the file if needed, can change the image size was_cropped, out = crop_image(content, filename, doc) # the length in metadata could be updated if it was cropped if was_cropped: file_name, content_type, metadata_after_cropped = process_file_from_stream(out, content_type=content_type) # when cropped, metadata are reseted. Then we update the previous metadata variable metadata['length'] = metadata_after_cropped['length'] try: logger.debug('Going to save media file with %s ' % file_name) out.seek(0) file_id = app.media.put(out, filename=file_name, content_type=content_type, resource=self.datasource, metadata=metadata) doc['media'] = file_id doc['mimetype'] = content_type doc['filemeta'] = decode_metadata(metadata) inserted = [doc['media']] file_type = content_type.split('/')[0] rendition_spec = config.RENDITIONS['avatar'] renditions = generate_renditions(out, file_id, inserted, file_type, content_type, rendition_spec, url_for_media) doc['renditions'] = renditions except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) raise SuperdeskApiError.internalError('Generating renditions failed')
def on_create(self, docs): ''' Create corresponding item on file upload ''' for doc in docs: file, content_type, metadata = self.get_file_from_document(doc) inserted = [doc['media']] file_type = content_type.split('/')[0] try: update_dates_for(doc) doc['guid'] = generate_guid(type=GUID_TAG) doc.setdefault('_id', doc['guid']) doc['type'] = self.type_av.get(file_type) doc['version'] = 1 doc['versioncreated'] = utcnow() rendition_spec = config.RENDITIONS['picture'] renditions = generate_renditions(file, doc['media'], inserted, file_type, content_type, rendition_spec, url_for_media) doc['renditions'] = renditions doc['mimetype'] = content_type doc['filemeta'] = metadata if not doc.get('_import', None): doc['creator'] = set_user(doc) add_activity('uploaded media {{ name }}', name=doc.get('headline', doc.get('mimetype')), renditions=doc.get('renditions')) except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) abort(500) on_create_media_archive()
def store_file(self, doc, content, filename, content_type): res = process_file_from_stream(content, filename=filename, content_type=content_type) file_name, content_type, metadata = res cropping_data = self.get_cropping_data(doc) _, out = crop_image(content, filename, cropping_data) metadata['length'] = json.dumps(len(out.getvalue())) try: logger.debug('Going to save media file with %s ' % file_name) out.seek(0) id = app.media.put(out, filename=file_name, content_type=content_type, metadata=metadata) doc['media'] = id doc['mime_type'] = content_type doc['filemeta'] = decode_metadata(metadata) inserted = [doc['media']] file_type = content_type.split('/')[0] rendition_spec = config.RENDITIONS['avatar'] renditions = generate_renditions(out, doc['media'], inserted, file_type, content_type, rendition_spec, url_for_media) doc['renditions'] = renditions except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) raise SuperdeskError(message='Generating renditions failed')
def on_create(self, docs): """Create corresponding item on file upload.""" for doc in docs: if 'media' not in doc or doc['media'] is None: abort(400, description="No media found") file, content_type, metadata = self.get_file_from_document(doc) inserted = [doc['media']] file_type = content_type.split('/')[0] self._set_metadata(doc) try: doc[ITEM_TYPE] = self.type_av.get(file_type) rendition_spec = get_renditions_spec() renditions = generate_renditions(file, doc['media'], inserted, file_type, content_type, rendition_spec, url_for_media) doc['renditions'] = renditions doc['mimetype'] = content_type set_filemeta(doc, metadata) add_activity('upload', 'uploaded media {{ name }}', 'archive', item=doc, name=doc.get('headline', doc.get('mimetype')), renditions=doc.get('renditions')) except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) abort(500)
def crop_and_store_file(self, doc, content, filename, content_type): # retrieve file name and metadata from file file_name, content_type, metadata = process_file_from_stream( content, content_type=content_type) # crop the file if needed, can change the image size was_cropped, out = crop_image(content, filename, doc) # the length in metadata could be updated if it was cropped if was_cropped: file_name, content_type, metadata_after_cropped = process_file_from_stream( out, content_type=content_type) # when cropped, metadata are reseted. Then we update the previous metadata variable metadata['length'] = metadata_after_cropped['length'] try: logger.debug('Going to save media file with %s ' % file_name) out.seek(0) file_id = app.media.put(out, filename=file_name, content_type=content_type, resource=self.datasource, metadata=metadata) doc['media'] = file_id doc['mimetype'] = content_type set_filemeta(doc, decode_metadata(metadata)) inserted = [doc['media']] file_type = content_type.split('/')[0] rendition_spec = config.RENDITIONS['avatar'] renditions = generate_renditions(out, file_id, inserted, file_type, content_type, rendition_spec, url_for_media) doc['renditions'] = renditions except Exception as io: for file_id in inserted: delete_file_on_error(doc, file_id) raise SuperdeskApiError.internalError( 'Generating renditions failed', exception=io)
def on_create(self, docs): """Create corresponding item on file upload.""" for doc in docs: if 'media' not in doc or doc['media'] is None: abort(400, description="No media found") # check content type of video by python-magic content_type = magic.from_buffer(doc['media'].read(1024), mime=True) doc['media'].seek(0) file_type = content_type.split('/')[0] if file_type == 'video' and app.config.get("VIDEO_SERVER_ENABLE"): if not self.videoEditor.check_video_server(): raise SuperdeskApiError( message="Cannot connect to videoserver", status_code=500) # upload media to video server res, renditions, metadata = self.upload_file_to_video_server( doc) # get thumbnails for timeline bar self.videoEditor.get_timeline_thumbnails(doc.get('media'), 40) else: file, content_type, metadata = self.get_file_from_document(doc) inserted = [doc['media']] # if no_custom_crops is set to False the custom crops are generated automatically on media upload # see (SDESK-4742) rendition_spec = get_renditions_spec( no_custom_crops=app.config.get("NO_CUSTOM_CROPS")) with timer('archive:renditions'): renditions = generate_renditions(file, doc['media'], inserted, file_type, content_type, rendition_spec, url_for_media) try: self._set_metadata(doc) doc[ITEM_TYPE] = self.type_av.get(file_type) doc[ITEM_STATE] = CONTENT_STATE.PROGRESS doc['renditions'] = renditions doc['mimetype'] = content_type set_filemeta(doc, metadata) add_activity('upload', 'uploaded media {{ name }}', 'archive', item=doc, name=doc.get('headline', doc.get('mimetype')), renditions=doc.get('renditions')) except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) if res: self.videoEditor.delete(res.get('_id')) abort(500)
def find_one_raw(self, resource, _id): # XXX: preview is used here instead of paid download # see SDNTB-15 data = {} url = self._app.config['SCANPIX_SEARCH_URL'] + '/search' data['refPtrs'] = [_id] r = self._request(url, data) doc = r.json()['data'][0] self._parse_doc(doc) url = doc['renditions']['baseImage']['href'] # if MIME type can't be guessed, we default to jpeg mime_type = mimetypes.guess_type(url)[0] or 'image/jpeg' r = self._request(url, data) out = BytesIO(r.content) file_name, content_type, metadata = process_file_from_stream( out, mime_type) logger.debug('Going to save media file with %s ' % file_name) out.seek(0) try: file_id = self._app.media.put(out, filename=file_name, content_type=content_type, metadata=None) except Exception as e: logger.exception(e) raise SuperdeskApiError.internalError('Media saving failed') else: try: inserted = [file_id] doc['mimetype'] = content_type doc['filemeta'] = decode_metadata(metadata) # set the version created to now to bring it to the top of the desk, images can be quite old doc['versioncreated'] = utcnow() file_type = content_type.split('/')[0] rendition_spec = get_renditions_spec() renditions = generate_renditions(out, file_id, inserted, file_type, content_type, rendition_spec, url_for_media, insert_metadata=False) doc['renditions'] = renditions except (IndexError, KeyError, json.JSONDecodeError) as e: logger.exception("Internal error: {}".format(e)) delete_file_on_error(doc, file_id) raise SuperdeskApiError.internalError( 'Generating renditions failed') return doc
def on_create(self, docs): """Create corresponding item on file upload.""" for doc in docs: if "media" not in doc or doc["media"] is None: abort(400, description="No media found") # check content type of video by python-magic content_type = app.media._get_mimetype(doc["media"]) doc["media"].seek(0) file_type = content_type.split("/")[0] if file_type == "video" and app.config.get("VIDEO_SERVER_ENABLED"): # upload media to video server res, renditions, metadata = self.upload_file_to_video_server( doc) # get thumbnails for timeline bar self.video_editor.create_timeline_thumbnails( doc.get("media"), 60) else: file, content_type, metadata = self.get_file_from_document(doc) inserted = [doc["media"]] # if no_custom_crops is set to False the custom crops are generated automatically on media upload # see (SDESK-4742) rendition_spec = get_renditions_spec( no_custom_crops=app.config.get("NO_CUSTOM_CROPS")) with timer("archive:renditions"): renditions = generate_renditions(file, doc["media"], inserted, file_type, content_type, rendition_spec, url_for_media) try: self._set_metadata(doc) doc[ITEM_TYPE] = self.type_av.get(file_type) doc[ITEM_STATE] = CONTENT_STATE.PROGRESS doc["renditions"] = renditions doc["mimetype"] = content_type set_filemeta(doc, metadata) add_activity( "upload", "uploaded media {{ name }}", "archive", item=doc, name=doc.get("headline", doc.get("mimetype")), renditions=doc.get("renditions"), ) except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) if res: self.video_editor.delete(res.get("_id")) abort(500)
def on_create(self, docs): """ Create corresponding item on file upload """ for doc in docs: if 'media' not in doc or doc['media'] is None: abort(400, description="No media found") file, content_type, metadata = self.get_file_from_document(doc) inserted = [doc['media']] file_type = content_type.split('/')[0] try: update_dates_for(doc) generate_unique_id_and_name(doc) doc['guid'] = generate_guid(type=GUID_TAG) doc.setdefault('_id', doc['guid']) doc['type'] = self.type_av.get(file_type) doc[config.VERSION] = 1 doc['versioncreated'] = utcnow() set_item_expiry({}, doc) rendition_spec = config.RENDITIONS['picture'] renditions = generate_renditions(file, doc['media'], inserted, file_type, content_type, rendition_spec, url_for_media) doc['renditions'] = renditions doc['mimetype'] = content_type doc['filemeta'] = metadata if not doc.get('_import', None): set_original_creator(doc) doc.setdefault(config.CONTENT_STATE, 'draft') add_activity('upload', 'uploaded media {{ name }}', item=doc, name=doc.get('headline', doc.get('mimetype')), renditions=doc.get('renditions')) except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) abort(500) on_create_media_archive()
def find_one_raw(self, resource, _id): url = self._app.config['AAP_MM_SEARCH_URL'] + '/Assets/{}'.format(_id) r = self._http.request('GET', url, headers=self._headers) doc = json.loads(r.data.decode('UTF-8')) self._parse_doc(doc) if 'fetch_endpoint' in doc: del doc['fetch_endpoint'] # Only if we have credentials can we download the original if the account has that privilege if 'AAP_MM_USER' in self._app.config and 'AAP_MM_PASSWORD' in self._app.config \ and self._app.config['AAP_MM_USER'] is not None: url = self._app.config[ 'AAP_MM_SEARCH_URL'] + '/Assets/{}/Original/download'.format( _id) else: url = doc['renditions']['original']['href'] r = self._http.request('GET', url, headers=self._headers) out = BytesIO(r.data) file_name, content_type, metadata = process_file_from_stream( out, 'image/jpeg') try: logger.debug('Going to save media file with %s ' % file_name) out.seek(0) file_id = self._app.media.put(out, filename=file_name, content_type=content_type, metadata=metadata) doc['mimetype'] = content_type doc['filemeta'] = decode_metadata(metadata) # set the version created to now to bring it to the top of the desk, images can be quite old doc['versioncreated'] = utcnow() inserted = [file_id] file_type = content_type.split('/')[0] rendition_spec = self._app.config['RENDITIONS']['picture'] renditions = generate_renditions(out, file_id, inserted, file_type, content_type, rendition_spec, self.url_for_media) doc['renditions'] = renditions except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) return doc
def on_create(self, docs): """ Create corresponding item on file upload """ for doc in docs: if 'media' not in doc or doc['media'] is None: abort(400, description="No media found") file, content_type, metadata = self.get_file_from_document(doc) inserted = [doc['media']] file_type = content_type.split('/')[0] try: update_dates_for(doc) generate_unique_id_and_name(doc) doc['guid'] = generate_guid(type=GUID_TAG) doc.setdefault('_id', doc['guid']) doc['type'] = self.type_av.get(file_type) doc[config.VERSION] = 1 doc['versioncreated'] = utcnow() set_item_expiry({}, doc) rendition_spec = config.RENDITIONS['picture'] renditions = generate_renditions(file, doc['media'], inserted, file_type, content_type, rendition_spec, url_for_media) doc['renditions'] = renditions doc['mimetype'] = content_type doc['filemeta'] = metadata if not doc.get('_import', None): set_original_creator(doc) doc.setdefault(config.CONTENT_STATE, 'draft') if not doc.get('ingest_provider'): doc['source'] = DEFAULT_SOURCE_VALUE_FOR_MANUAL_ARTICLES add_activity('upload', 'uploaded media {{ name }}', 'archive', item=doc, name=doc.get('headline', doc.get('mimetype')), renditions=doc.get('renditions')) except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) abort(500)
def find_one_raw(self, resource, _id): if self._headers is None: self.__set_auth_cookie(self._app) url = self._app.config['AAP_MM_SEARCH_URL'] + '/Assets/{}'.format(_id) r = self._http.request('GET', url, headers=self._headers) doc = json.loads(r.data.decode('UTF-8')) self._parse_doc(doc) if 'fetch_endpoint' in doc: del doc['fetch_endpoint'] # Only if we have credentials can we download the original if the account has that privilege if 'AAP_MM_USER' in self._app.config and 'AAP_MM_PASSWORD' in self._app.config \ and self._app.config['AAP_MM_USER'] is not None: url = self._app.config['AAP_MM_SEARCH_URL'] + '/Assets/{}/Original/download'.format(_id) else: url = doc['renditions']['original']['href'] r = self._http.request('GET', url, headers=self._headers) out = BytesIO(r.data) file_name, content_type, metadata = process_file_from_stream(out, 'image/jpeg') try: logger.debug('Going to save media file with %s ' % file_name) out.seek(0) file_id = self._app.media.put(out, filename=file_name, content_type=content_type, metadata=metadata) doc['mimetype'] = content_type doc['filemeta'] = decode_metadata(metadata) # set the version created to now to bring it to the top of the desk, images can be quite old doc['versioncreated'] = utcnow() inserted = [file_id] file_type = content_type.split('/')[0] rendition_spec = self._app.config['RENDITIONS']['picture'] renditions = generate_renditions(out, file_id, inserted, file_type, content_type, rendition_spec, self.url_for_media) doc['renditions'] = renditions except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) return doc
def on_create(self, docs): """ Create corresponding item on file upload """ for doc in docs: if 'media' not in doc or doc['media'] is None: abort(400, description="No media found") file, content_type, metadata = self.get_file_from_document(doc) inserted = [doc['media']] file_type = content_type.split('/')[0] self._set_metadata(doc) try: doc[ITEM_TYPE] = self.type_av.get(file_type) # renditions required by superdesk rendition_spec = config.RENDITIONS['picture'] # load custom crop sizes custom_crops = get_resource_service('vocabularies').find_one( req=None, _id='crop_sizes') if custom_crops: for crop in custom_crops.get('items'): # complete list of wanted renditions rendition_spec[crop['name']] = crop renditions = generate_renditions(file, doc['media'], inserted, file_type, content_type, rendition_spec, url_for_media) doc['renditions'] = renditions doc['mimetype'] = content_type doc['filemeta'] = metadata add_activity('upload', 'uploaded media {{ name }}', 'archive', item=doc, name=doc.get('headline', doc.get('mimetype')), renditions=doc.get('renditions')) except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) abort(500)
def on_create(self, docs): """Create corresponding item on file upload.""" for doc in docs: if 'media' not in doc or doc['media'] is None: abort(400, description="No media found") file, content_type, metadata = self.get_file_from_document(doc) inserted = [doc['media']] file_type = content_type.split('/')[0] self._set_metadata(doc) try: doc[ITEM_TYPE] = self.type_av.get(file_type) doc[ITEM_STATE] = CONTENT_STATE.PROGRESS # if no_custom_crops is set to False the custom crops are generated automatically on media upload # see (SDESK-4742) rendition_spec = get_renditions_spec( no_custom_crops=app.config.get("NO_CUSTOM_CROPS")) with timer('archive:renditions'): renditions = generate_renditions(file, doc['media'], inserted, file_type, content_type, rendition_spec, url_for_media) doc['renditions'] = renditions doc['mimetype'] = content_type set_filemeta(doc, metadata) add_activity('upload', 'uploaded media {{ name }}', 'archive', item=doc, name=doc.get('headline', doc.get('mimetype')), renditions=doc.get('renditions')) except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) abort(500)
def find_one_raw(self, resource, _id): if self._headers is None: self.__set_auth_cookie(self._app) url = self._app.config["AAP_MM_SEARCH_URL"] + "/Assets/{}".format(_id) r = self._http.request("GET", url, headers=self._headers) doc = json.loads(r.data.decode("UTF-8")) self._parse_doc(doc) if "fetch_endpoint" in doc: del doc["fetch_endpoint"] # Only if we have credentials can we download the original if the account has that privilege if self._username is not None and self._password is not None: resolutions = self._get_resolutions(_id) if doc["type"] == "picture": if any(i["Name"] == "Original" for i in resolutions["Image"]): url = self._app.config["AAP_MM_SEARCH_URL"] + "/Assets/{}/Original/download".format(_id) mime_type = "image/jpeg" source_ref = {"href": url, "mimetype": mime_type} else: raise FileNotFoundError elif doc["type"] == "video": if any(v["Name"] == "Ipod" for v in resolutions["Video"]): url = self._app.config["AAP_MM_SEARCH_URL"] + "/Assets/{}/Ipod/download".format(_id) mime_type = doc.get("renditions").get("original").get("mimetype") else: raise FileNotFoundError if any(v["Name"] == "Video" for v in resolutions["Video"]): source_ref = { "href": self._app.config["AAP_MM_SEARCH_URL"] + "/Assets/{}/Video/download".format(_id), "mimetype": "video/quicktime", } else: raise FileNotFoundError else: raise NotImplementedError else: if doc["type"] == "video": mime_type = doc.get("renditions").get("original").get("mimetype") else: mime_type = "image/jpeg" url = doc["renditions"]["original"]["href"] source_ref = {"href": url, "mimetype": mime_type} r = self._http.request("GET", url, headers=self._headers) out = BytesIO(r.data) file_name, content_type, metadata = process_file_from_stream(out, mime_type) try: logger.debug("Going to save media file with %s " % file_name) out.seek(0) file_id = self._app.media.put(out, filename=file_name, content_type=content_type, metadata=metadata) doc["mimetype"] = content_type doc["filemeta"] = decode_metadata(metadata) # set the version created to now to bring it to the top of the desk, images can be quite old doc["versioncreated"] = utcnow() inserted = [file_id] file_type = content_type.split("/")[0] rendition_spec = self._app.config["RENDITIONS"]["picture"] renditions = generate_renditions( out, file_id, inserted, file_type, content_type, rendition_spec, self.url_for_media ) doc["renditions"] = renditions doc["renditions"]["original_source"] = source_ref except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) return doc
def find_one_raw(self, resource, _id): if self._headers is None: self.__set_auth_cookie(self._app) url = self._app.config['AAP_MM_SEARCH_URL'] + '/Assets/{}'.format(_id) r = self._http.request('GET', url, headers=self._headers) doc = json.loads(r.data.decode('UTF-8')) self._parse_doc(doc) if 'fetch_endpoint' in doc: del doc['fetch_endpoint'] # Only if we have credentials can we download the original if the account has that privilege if self._username is not None and self._password is not None: resolutions = self._get_resolutions(_id) if doc[ITEM_TYPE] == CONTENT_TYPE.PICTURE: if any(i['Name'] == 'Original' for i in resolutions['Image']): url = self._app.config['AAP_MM_SEARCH_URL'] + '/Assets/{}/Original/download'.format(_id) mime_type = 'image/jpeg' else: raise FileNotFoundError elif doc[ITEM_TYPE] == CONTENT_TYPE.VIDEO: if any(v['Name'] == 'Ipod' for v in resolutions['Video']): url = self._app.config['AAP_MM_SEARCH_URL'] + '/Assets/{}/Ipod/download'.format(_id) mime_type = doc.get('renditions').get('original').get('mimetype') else: raise FileNotFoundError else: raise NotImplementedError else: if doc[ITEM_TYPE] == CONTENT_TYPE.VIDEO: mime_type = doc.get('renditions').get('original').get('mimetype') else: mime_type = 'image/jpeg' url = doc['renditions']['original']['href'] r = self._http.request('GET', url, headers=self._headers) out = BytesIO(r.data) file_name, content_type, metadata = process_file_from_stream(out, mime_type) inserted = [] try: logger.debug('Going to save media file with %s ' % file_name) out.seek(0) file_id = self._app.media.put(out, filename=file_name, content_type=content_type, metadata=None) doc['mimetype'] = content_type doc['filemeta'] = decode_metadata(metadata) # set the version created to now to bring it to the top of the desk, images can be quite old doc['versioncreated'] = utcnow() inserted = [file_id] file_type = content_type.split('/')[0] rendition_spec = self._app.config['RENDITIONS']['picture'] renditions = generate_renditions(out, file_id, inserted, file_type, content_type, rendition_spec, self.url_for_media, insert_metadata=False) doc['renditions'] = renditions except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) raise SuperdeskApiError.internalError('Generating renditions failed') return doc
def find_one_raw(self, resource, _id): if self._headers is None: self.__set_auth_cookie(self._app) url = self._app.config['AAP_MM_SEARCH_URL'] + '/Assets/{}'.format(_id) r = self._http.request('GET', url, headers=self._headers) doc = json.loads(r.data.decode('UTF-8')) self._parse_doc(doc) if 'fetch_endpoint' in doc: del doc['fetch_endpoint'] # Only if we have credentials can we download the original if the account has that privilege if self._username is not None and self._password is not None: resolutions = self._get_resolutions(_id) if doc[ITEM_TYPE] == CONTENT_TYPE.PICTURE: if any(i['Name'] == 'Original' for i in resolutions['Image']): url = self._app.config[ 'AAP_MM_SEARCH_URL'] + '/Assets/{}/Original/download'.format( _id) mime_type = 'image/jpeg' else: raise FileNotFoundError elif doc[ITEM_TYPE] == CONTENT_TYPE.VIDEO: if any(v['Name'] == 'Ipod' for v in resolutions['Video']): url = self._app.config[ 'AAP_MM_SEARCH_URL'] + '/Assets/{}/Ipod/download'.format( _id) mime_type = doc.get('renditions').get('original').get( 'mimetype') else: raise FileNotFoundError else: raise NotImplementedError else: if doc[ITEM_TYPE] == CONTENT_TYPE.VIDEO: mime_type = doc.get('renditions').get('original').get( 'mimetype') else: mime_type = 'image/jpeg' url = doc['renditions']['original']['href'] r = self._http.request('GET', url, headers=self._headers) out = BytesIO(r.data) file_name, content_type, metadata = process_file_from_stream( out, mime_type) inserted = [] try: logger.debug('Going to save media file with %s ' % file_name) out.seek(0) file_id = self._app.media.put(out, filename=file_name, content_type=content_type, metadata=None) doc['mimetype'] = content_type doc['filemeta'] = decode_metadata(metadata) # set the version created to now to bring it to the top of the desk, images can be quite old doc['versioncreated'] = utcnow() inserted = [file_id] file_type = content_type.split('/')[0] rendition_spec = self._app.config['RENDITIONS']['picture'] renditions = generate_renditions(out, file_id, inserted, file_type, content_type, rendition_spec, self.url_for_media, insert_metadata=False) doc['renditions'] = renditions except Exception as io: logger.exception(io) for file_id in inserted: delete_file_on_error(doc, file_id) raise SuperdeskApiError.internalError( 'Generating renditions failed') return doc