You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.1 KiB
69 lines
2.1 KiB
6 years ago
|
from .formatbase import FormatBase
|
||
|
from .microdvd import MicroDVDFormat
|
||
|
from .subrip import SubripFormat
|
||
|
from .jsonformat import JSONFormat
|
||
|
from .substation import SubstationFormat
|
||
|
from .txt_generic import TXTGenericFormat, MPL2Format
|
||
|
from .exceptions import *
|
||
|
|
||
|
#: Dict mapping file extensions to format identifiers.
|
||
|
FILE_EXTENSION_TO_FORMAT_IDENTIFIER = {
|
||
|
".srt": "srt",
|
||
|
".ass": "ass",
|
||
|
".ssa": "ssa",
|
||
|
".sub": "microdvd",
|
||
|
".json": "json",
|
||
|
".txt": "txt_generic",
|
||
|
}
|
||
|
|
||
|
#: Dict mapping format identifiers to implementations (FormatBase subclasses).
|
||
|
FORMAT_IDENTIFIER_TO_FORMAT_CLASS = {
|
||
|
"srt": SubripFormat,
|
||
|
"ass": SubstationFormat,
|
||
|
"ssa": SubstationFormat,
|
||
|
"microdvd": MicroDVDFormat,
|
||
|
"json": JSONFormat,
|
||
|
"txt_generic": TXTGenericFormat,
|
||
|
"mpl2": MPL2Format,
|
||
|
}
|
||
|
|
||
|
def get_format_class(format_):
|
||
|
"""Format identifier -> format class (ie. subclass of FormatBase)"""
|
||
|
try:
|
||
|
return FORMAT_IDENTIFIER_TO_FORMAT_CLASS[format_]
|
||
|
except KeyError:
|
||
|
raise UnknownFormatIdentifierError(format_)
|
||
|
|
||
|
def get_format_identifier(ext):
|
||
|
"""File extension -> format identifier"""
|
||
|
try:
|
||
|
return FILE_EXTENSION_TO_FORMAT_IDENTIFIER[ext]
|
||
|
except KeyError:
|
||
|
raise UnknownFileExtensionError(ext)
|
||
|
|
||
|
def get_file_extension(format_):
|
||
|
"""Format identifier -> file extension"""
|
||
|
if format_ not in FORMAT_IDENTIFIER_TO_FORMAT_CLASS:
|
||
|
raise UnknownFormatIdentifierError(format_)
|
||
|
|
||
|
for ext, f in FILE_EXTENSION_TO_FORMAT_IDENTIFIER.items():
|
||
|
if f == format_:
|
||
|
return ext
|
||
|
|
||
|
raise RuntimeError("No file extension for format %r" % format_)
|
||
|
|
||
|
def autodetect_format(content):
|
||
|
"""Return format identifier for given fragment or raise FormatAutodetectionError."""
|
||
|
formats = set()
|
||
|
for impl in FORMAT_IDENTIFIER_TO_FORMAT_CLASS.values():
|
||
|
guess = impl.guess_format(content)
|
||
|
if guess is not None:
|
||
|
formats.add(guess)
|
||
|
|
||
|
if len(formats) == 1:
|
||
|
return formats.pop()
|
||
|
elif not formats:
|
||
|
raise FormatAutodetectionError("No suitable formats")
|
||
|
else:
|
||
|
raise FormatAutodetectionError("Multiple suitable formats (%r)" % formats)
|