def _download(url: str) -> File: resp = requests.get(url, timeout=5) content = BytesIO(resp.content) file = File(stream=content, mimetype=USE_MAGIC) file.size = resp.headers['Content-Length'] return file
def __init__(self, title, artist, lyrics, timings, stream, mimetype='audio/mpeg', language='en-US'): File.__init__(self, stream, mimetype, title) self.artist = artist self.lyrics = lyrics self.timings = timings self.language = language
def __init__(self, fp, mimetype=None, filename=None, **kwargs): if not filename: filename = self.title DaceObject.__init__(self, **kwargs) if fp: fp.seek(0) else: fp = None if not mimetype or mimetype == 'application/x-download': hint = USE_MAGIC else: hint = mimetype OriginFile.__init__(self, fp, hint, filename) self.set_data(kwargs)
def deserialize(self, node, value): """Deserialize into a File.""" if value == colander.null: return None try: result = File(stream=value.file, mimetype=USE_MAGIC, title=value.filename) # We add the size as an extra attribute since get_size() doesn't # work before the transaction has been committed if isinstance(value.file, io.BytesIO): result.size = len(value.file.getvalue()) else: result.size = os.fstat(value.file.fileno()).st_size except Exception as err: raise colander.Invalid(node, msg=str(err), value=value) if result.size > self.SIZE_LIMIT: msg = "Asset too large: {} bytes".format(result.size) raise colander.Invalid(node, msg=msg, value=value) return result
def deserialize(self, node, value): """Deserialize into a File.""" if value == colander.null: return None try: result = File(stream=value.file, mimetype=USE_MAGIC, title=value.filename) # We add the size as an extra attribute since get_size() doesn't # work before the transaction has been committed if isinstance(value.file, io.BytesIO): result.size = len(value.file.getvalue()) else: result.size = os.fstat(value.file.fileno()).st_size except Exception as err: raise colander.Invalid(node, msg=str(err), value=value) if result.size > self.SIZE_LIMIT: msg = 'Asset too large: {} bytes'.format(result.size) raise colander.Invalid(node, msg=msg, value=value) return result
def deserialize(self, node: SchemaNode, value: object) -> File: """Deserialize :class:`cgi.file` or class:`deform.widget.filedict` .""" if value == null: return None try: filedata, filename = self._get_file_data_and_name(value) filedata.seek(0) result = File(stream=filedata, mimetype=USE_MAGIC, title=filename) # We add the size as an extra attribute since get_size() doesn't # work before the transaction has been committed if isinstance(filedata, io.BytesIO): result.size = len(filedata.getvalue()) else: result.size = os.fstat(filedata.fileno()).st_size except Exception as err: raise Invalid(node, msg=str(err), value=value) if result.size > self.SIZE_LIMIT: msg = 'Asset too large: {} bytes'.format(result.size) raise Invalid(node, msg=msg, value=value) return result
def _crop_and_resize_image(self, context: IResource, registry: Registry) -> File: parent_file = retrieve_asset_file(context.__parent__, registry) # Crop and resize image via PIL with parent_file.blob.open('r') as blobdata: mimetype = parent_file.mimetype image = Image.open(blobdata) cropped_image = self._crop_if_needed(image) resized_image = cropped_image.resize(self.dimensions, Image.ANTIALIAS) bytestream = io.BytesIO() resized_image.save(bytestream, image.format) bytestream.seek(0) # Store as substanced File and return self.file = File(stream=bytestream, mimetype=mimetype) transaction.commit() # to avoid BlobError: Uncommitted changes return self.file
def get_size(self): try: return OriginFile.get_size(self) except BlobError: transaction.commit() return OriginFile.get_size(self)
def _get_response(self) -> FileResponse: return File.get_response(self)
def upload(self, stream, mimetype_hint=None): result = File.upload(self, stream, mimetype_hint) duration = audioread.audio_open( self.blob._p_blob_uncommitted).duration self.duration = duration return result
def __init__(self, title, artist, timings, audio_stream, audio_mimetype='audio/mpeg'): File.__init__(self, audio_stream, audio_mimetype, title) self.artist = artist self.timings = timings