mirror of
https://github.com/SickGear/SickGear.git
synced 2024-12-01 00:43:37 +00:00
980e05cc99
Backported 400 revisions from rev 1de4961-8897c5b (2018-2014). Move core/benchmark, core/cmd_line, core/memory, core/profiler and core/timeout to core/optional/* Remove metadata/qt* PORT: Version 2.0a3 (inline with 3.0a3 @ f80c7d5). Basic Support for XMP Packets. tga: improvements to adhere more closely to the spec. pdf: slightly improved parsing. rar: fix TypeError on unknown block types. Add MacRoman win32 codepage. tiff/exif: support SubIFDs and tiled images. Add method to export metadata in dictionary. mpeg_video: don't attempt to parse Stream past length. mpeg_video: parse ESCR correctly, add SCR value. Change centralise CustomFragments. field: don't set parser class if class is None, to enable autodetect. field: add value/display for CustomFragment. parser: inline warning to enable tracebacks in debug mode. Fix empty bytestrings in makePrintable. Fix contentSize in jpeg.py to account for image_data blocks. Fix the ELF parser. Enhance the AR archive parser. elf parser: fix wrong wrong fields order in parsing little endian section flags. elf parser: add s390 as a machine type. Flesh out mp4 parser. PORT: Version 2.0a1 (inline with 3.0a1). Major refactoring and PEP8. Fix ResourceWarning warnings on files. Add a close() method and support for the context manager protocol ("with obj: ...") to parsers, input and output streams. metadata: get comment from ZIP. Support for InputIOStream.read(0). Fix sizeGe when size is None. Remove unused new_seekable_field_set file. Remove parser Mapsforge .map. Remove parser Parallel Realities Starfighter .pak files. sevenzip: fix for newer archives. java: update access flags and modifiers for Java 1.7 and update description text for most recent Java. Support ustar prefix field in tar archives. Remove file_system* parsers. Remove misc parsers 3d0, 3ds, gnome_keyring, msoffice*, mstask, ole*, word*. Remove program parsers macho, nds, prc. Support non-8bit Character subclasses. Python parser supports Python 3.7. Enhance mpeg_ts parser to support MTS/M2TS. Support for creation date in tiff. Change don't hardcode errno constant. PORT: 1.9.1 Internal Only: The following are legacy reference to upstream commit messages. Relevant changes up to b0a115f8. Use integer division. Replace HACHOIR_ERRORS with Exception. Fix metadata.Data: make it sortable. Import fixes from e7de492. PORT: Version 2.0a1 (inline with 3.0a1 @ e9f8fad). Replace hachoir.core.field with hachoir.field Replace hachoir.core.stream with hachoir.stream Remove the compatibility module for PY1.5 to PY2.5. metadata: support TIFF picture. metadata: fix string normalization. metadata: fix datetime regex Fix hachoir bug #57. FileFromInputStream: fix comparison between None and an int. InputIOStream: open the file in binary mode.
79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
from hachoir.field import Bytes
|
|
from hachoir.core.tools import makePrintable, humanFilesize
|
|
from hachoir.stream import InputIOStream
|
|
|
|
|
|
class SubFile(Bytes):
|
|
"""
|
|
File stored in another file
|
|
"""
|
|
|
|
def __init__(self, parent, name, length, description=None,
|
|
parser=None, filename=None, mime_type=None, parser_class=None):
|
|
if filename:
|
|
if not isinstance(filename, unicode):
|
|
filename = makePrintable(filename, "ISO-8859-1")
|
|
if not description:
|
|
description = 'File "%s" (%s)' % (filename, humanFilesize(length))
|
|
Bytes.__init__(self, parent, name, length, description)
|
|
|
|
def createInputStream(cis, **args):
|
|
tags = args.setdefault("tags", [])
|
|
if parser_class:
|
|
tags.append(("class", parser_class))
|
|
if parser is not None:
|
|
tags.append(("id", parser.PARSER_TAGS["id"]))
|
|
if mime_type:
|
|
tags.append(("mime", mime_type))
|
|
if filename:
|
|
tags.append(("filename", filename))
|
|
return cis(**args)
|
|
|
|
self.setSubIStream(createInputStream)
|
|
|
|
|
|
class CompressedStream:
|
|
offset = 0
|
|
|
|
def __init__(self, stream, decompressor):
|
|
self.stream = stream
|
|
self.decompressor = decompressor(stream)
|
|
self._buffer = ''
|
|
|
|
def read(self, size):
|
|
d = self._buffer
|
|
data = [d[:size]]
|
|
size -= len(d)
|
|
if size > 0:
|
|
d = self.decompressor(size)
|
|
data.append(d[:size])
|
|
size -= len(d)
|
|
while size > 0:
|
|
n = 4096
|
|
if self.stream.size:
|
|
n = min(self.stream.size - self.offset, n)
|
|
if not n:
|
|
break
|
|
d = self.stream.read(self.offset, n)[1]
|
|
self.offset += 8 * len(d)
|
|
d = self.decompressor(size, d)
|
|
data.append(d[:size])
|
|
size -= len(d)
|
|
self._buffer = d[size + len(d):]
|
|
return ''.join(data)
|
|
|
|
|
|
def CompressedField(field, decompressor):
|
|
def createInputStream(cis, source=None, **args):
|
|
if field._parent:
|
|
stream = cis(source=source)
|
|
args.setdefault("tags", []).extend(stream.tags)
|
|
else:
|
|
stream = field.stream
|
|
input = CompressedStream(stream, decompressor)
|
|
if source is None:
|
|
source = "Compressed source: '%s' (offset=%s)" % (stream.source, field.absolute_address)
|
|
return InputIOStream(input, source=source, **args)
|
|
|
|
field.setSubIStream(createInputStream)
|
|
return field
|