|
|
|
# coding=utf-8
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import logging
|
|
|
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
from subzero.modification.mods import SubtitleTextModification
|
|
|
|
from subzero.modification.processors.string_processor import MultipleLineProcessor, WholeLineProcessor
|
|
|
|
from subzero.modification.processors.re_processor import MultipleWordReProcessor, NReProcessor
|
|
|
|
from subzero.modification import registry
|
|
|
|
from subzero.modification.dictionaries.data import data as OCR_fix_data
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
class FixOCR(SubtitleTextModification):
|
|
|
|
identifier = "OCR_fixes"
|
|
|
|
description = "Fix common OCR issues"
|
|
|
|
exclusive = True
|
|
|
|
order = 10
|
|
|
|
data_dict = None
|
|
|
|
|
|
|
|
long_description = "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR"
|
|
|
|
|
|
|
|
def __init__(self, parent):
|
|
|
|
super(FixOCR, self).__init__(parent)
|
|
|
|
data_dict = OCR_fix_data.get(parent.language.alpha3t)
|
|
|
|
if not data_dict:
|
|
|
|
logger.debug("No SnR-data available for language %s", parent.language)
|
|
|
|
return
|
|
|
|
|
|
|
|
self.data_dict = data_dict
|
|
|
|
self.processors = self.get_processors()
|
|
|
|
|
|
|
|
def get_processors(self):
|
|
|
|
if not self.data_dict:
|
|
|
|
return []
|
|
|
|
|
|
|
|
return [
|
|
|
|
# remove broken HI tag colons (ANNOUNCER'., ". instead of :) after at least 3 uppercase chars
|
|
|
|
# don't modify stuff inside quotes
|
|
|
|
NReProcessor(re.compile(r'(?u)(^[^"\'’ʼ❜‘‛”“‟„]*(?<=[A-ZÀ-Ž]{3})[A-ZÀ-Ž-_\s0-9]+)'
|
|
|
|
r'(["\'’ʼ❜‘‛”“‟„]*[.,‚،⹁、;]+)(\s*)(?!["\'’ʼ❜‘‛”“‟„])'),
|
|
|
|
r"\1:\3", name="OCR_fix_HI_colons", supported=lambda p: not p.only_uppercase),
|
|
|
|
# fix F'bla
|
|
|
|
NReProcessor(re.compile(r'(?u)(\bF)(\')([A-zÀ-ž]*\b)'), r"\1\3", name="OCR_fix_F"),
|
|
|
|
WholeLineProcessor(self.data_dict["WholeLines"], name="OCR_replace_line"),
|
|
|
|
MultipleWordReProcessor(self.data_dict["WholeWords"], name="OCR_replace_word"),
|
|
|
|
MultipleWordReProcessor(self.data_dict["BeginLines"], name="OCR_replace_beginline"),
|
|
|
|
MultipleWordReProcessor(self.data_dict["EndLines"], name="OCR_replace_endline"),
|
|
|
|
MultipleWordReProcessor(self.data_dict["PartialLines"], name="OCR_replace_partialline"),
|
|
|
|
MultipleLineProcessor(self.data_dict["PartialWordsAlways"], name="OCR_replace_partialwordsalways")
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
registry.register(FixOCR)
|