Exemple #1
0
 def __init__(self, parsers_cls, encodings=None):
     self._parsers = [parser_cls() for parser_cls in parsers_cls]
     self._encodings = ['utf-8']
     if encodings:
         self._encodings = encodings
     self._row_parsing = False
     self.log = SimpleLogger('SubsLoader', )
Exemple #2
0
 def __init__(self, parsers_cls, encodings=None):
     self._parsers = [parser_cls() for parser_cls in parsers_cls]
     self._encodings = ['utf-8']
     if encodings:
         self._encodings = encodings
     self._row_parsing = False
     self.log = SimpleLogger('SubsLoader',)
Exemple #3
0
class SubsLoader(object):
    def __init__(self, parsers_cls, encodings=None):
        self._parsers = [parser_cls() for parser_cls in parsers_cls]
        self._encodings = ['utf-8']
        if encodings:
            self._encodings = encodings
        self._row_parsing = False
        self.log = SimpleLogger('SubsLoader',)
        
    def toggle_row_parsing(self):
        if self._row_parsing:
            self.set_row_parsing(False)
        else:
            self.set_row_parsing(True)

    def set_row_parsing(self, val):
        for parser in self._parsers:
            parser.rowParse = val
        if val:
            self.log.info("setting row parsing for Parsers")
            self._row_parsing = True
        else:
            self.log.info("setting block parsing for Parsers")
            self._row_parsing = False

    def change_encodings(self, encodings):
        self.log.info("changing encoding group to: %s" % str(encodings))
        self._encodings = encodings

    def change_encoding(self, text, current_encoding):
        try:
            decoded_text, encoding = decode(text, self._encodings, current_encoding)
        except Exception:
            traceback.print_exc()
            self.log.error("cannot decode subtitles'")
            raise DecodeError()
        return decoded_text, encoding

    def load(self, subfile, current_encoding=None, fps=None):
        filename = os.path.basename(subfile)
        self.log.info("<%s> loading ...", filename)
        while 1:
            decoded_text, encoding = self._process_path(subfile, current_encoding)
            try:
                sublist = self._parse(decoded_text, os.path.splitext(subfile)[1], fps)
            except NoSubtitlesParseError:
                # this could mean that subtitles file was decoded but
                # with not right encoding, we try to use other encodings
                if current_encoding == self._encodings[-1]:
                    raise
                self.log.info("<%s> no subtitles parsed, will try different encoding", filename)
                current_encoding = encoding
                continue
            self.log.info("<%s> successfully loaded", filename)
            return sublist, encoding

    def _process_path(self, subfile, current_encoding=None) :
        filename = os.path.basename(subfile)
        size = getFileSize(subfile)
        if size and size > SUBTITLES_FILE_MAX_SIZE:
            self.log.error("<%s> not supported subtitles size ({%d}KB > {%d}KB)!", filename, size / 1024, SUBTITLES_FILE_MAX_SIZE / 1024)
            raise LoadError('"%s" - not supported subtitles size: "%dKB"' % (toString(os.path.basename(subfile)), size / 1024))
        try:
            text = load(subfile)
        except (URLError, HTTPError, IOError) as e:
            self.log.error("<%s> %s", filename, str(e))
            raise LoadError(subfile)
        try:
            decoded_text, encoding = decode(text, self._encodings, current_encoding)
        except Exception as e:
            self.log.error("<%s> %s", filename, "cannot decode")
            raise DecodeError(subfile)
        return decoded_text, encoding

    def _parse(self, text, ext=None, fps=None, strict=False):
        self.log.info("looking for '%s' parser", str(ext))
        for parser in self._parsers:
            if not ext:
                self.log.info("extension is not set, parsing without it ...")
                break
            if parser.canParse(ext):
                self.log.info("found <%s> parser", parser)
                self.log.info("<%s> parsing...", parser)
                try:
                    return parser.parse(text, fps)
                except ParseError as e:
                    self.log.error("<%s>: %s", parser, str(e))
                    if strict:
                        raise
        for parser in self._parsers:
            self.log.info("trying parsing with <%s>", parser)
            try:
                return parser.parse(text, fps)
            except NoSubtitlesParseError as e:
                if parser == self._parsers[-1]:
                    raise
                continue
            except ParseError as e:
                self.log.error("<%s>: %s", parser, str(e))
                continue
        raise ParserNotFoundError(str(ext))
Exemple #4
0
class SubsLoader(object):
    def __init__(self, parsers_cls, encodings=None):
        self._parsers = [parser_cls() for parser_cls in parsers_cls]
        self._encodings = ['utf-8']
        if encodings:
            self._encodings = encodings
        self._row_parsing = False
        self.log = SimpleLogger('SubsLoader', )

    def toggle_row_parsing(self):
        if self._row_parsing:
            self.set_row_parsing(False)
        else:
            self.set_row_parsing(True)

    def set_row_parsing(self, val):
        for parser in self._parsers:
            parser.rowParse = val
        if val:
            self.log.info("setting row parsing for Parsers")
            self._row_parsing = True
        else:
            self.log.info("setting block parsing for Parsers")
            self._row_parsing = False

    def change_encodings(self, encodings):
        self.log.info("changing encoding group to: %s" % str(encodings))
        self._encodings = encodings

    def change_encoding(self, text, current_encoding):
        try:
            decoded_text, encoding = decode(text, self._encodings,
                                            current_encoding)
        except Exception:
            traceback.print_exc()
            self.log.error("cannot decode subtitles'")
            raise DecodeError()
        return decoded_text, encoding

    def load(self, subfile, current_encoding=None, fps=None):
        filename = os.path.basename(subfile)
        self.log.info("<%s> loading ...", filename)
        while 1:
            decoded_text, encoding = self._process_path(
                subfile, current_encoding)
            try:
                sublist = self._parse(decoded_text,
                                      os.path.splitext(subfile)[1], fps)
            except NoSubtitlesParseError:
                # this could mean that subtitles file was decoded but
                # with not right encoding, we try to use other encodings
                if current_encoding == self._encodings[-1]:
                    raise
                self.log.info(
                    "<%s> no subtitles parsed, will try different encoding",
                    filename)
                current_encoding = encoding
                continue
            self.log.info("<%s> successfully loaded", filename)
            return sublist, encoding

    def _process_path(self, subfile, current_encoding=None):
        filename = os.path.basename(subfile)
        size = getFileSize(subfile)
        if size and size > SUBTITLES_FILE_MAX_SIZE:
            self.log.error(
                "<%s> not supported subtitles size ({%d}KB > {%d}KB)!",
                filename, size / 1024, SUBTITLES_FILE_MAX_SIZE / 1024)
            raise LoadError('"%s" - not supported subtitles size: "%dKB"' %
                            (toString(os.path.basename(subfile)), size / 1024))
        try:
            text = load(subfile)
        except (URLError, HTTPError, IOError) as e:
            self.log.error("<%s> %s", filename, str(e))
            raise LoadError(subfile)
        try:
            decoded_text, encoding = decode(text, self._encodings,
                                            current_encoding)
        except Exception as e:
            self.log.error("<%s> %s", filename, "cannot decode")
            raise DecodeError(subfile)
        return decoded_text, encoding

    def _parse(self, text, ext=None, fps=None, strict=False):
        self.log.info("looking for '%s' parser", str(ext))
        for parser in self._parsers:
            if not ext:
                self.log.info("extension is not set, parsing without it ...")
                break
            if parser.canParse(ext):
                self.log.info("found <%s> parser", parser)
                self.log.info("<%s> parsing...", parser)
                try:
                    return parser.parse(text, fps)
                except ParseError as e:
                    self.log.error("<%s>: %s", parser, str(e))
                    if strict:
                        raise
        for parser in self._parsers:
            self.log.info("trying parsing with <%s>", parser)
            try:
                return parser.parse(text, fps)
            except NoSubtitlesParseError as e:
                if parser == self._parsers[-1]:
                    raise
                continue
            except ParseError as e:
                self.log.error("<%s>: %s", parser, str(e))
                continue
        raise ParserNotFoundError(str(ext))