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)