From 972ab453058ec7a9c9f0382cada67ba68283a930 Mon Sep 17 00:00:00 2001 From: baczus Date: Wed, 4 Sep 2019 20:57:43 +0200 Subject: [PATCH] Post-processing: Convert character encoding only when needed (#141) --- libqnapi/src/subtitlepostprocessor.cpp | 32 +++++++++++++++----------- libqnapi/src/subtitlepostprocessor.h | 3 +-- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/libqnapi/src/subtitlepostprocessor.cpp b/libqnapi/src/subtitlepostprocessor.cpp index 0b27ccd..ced922c 100644 --- a/libqnapi/src/subtitlepostprocessor.cpp +++ b/libqnapi/src/subtitlepostprocessor.cpp @@ -26,6 +26,8 @@ SubtitlePostProcessor::SubtitlePostProcessor( void SubtitlePostProcessor::perform(const QString& movieFilePath, const QString& subtitleFilePath) const { + if (!QFileInfo(subtitleFilePath).exists()) return; + if (ppConfig.removeLines()) { ppRemoveLinesContainingWords(subtitleFilePath, ppConfig.removeLinesWords()); } @@ -35,11 +37,9 @@ void SubtitlePostProcessor::perform(const QString& movieFilePath, ppReplaceDiacriticsWithASCII(subtitleFilePath); break; case ECM_CHANGE: - if (!ppConfig.encodingAutoDetectFrom() || - !ppChangeSubtitlesEncoding(subtitleFilePath, ppConfig.encodingTo())) { - ppChangeSubtitlesEncoding(subtitleFilePath, ppConfig.encodingFrom(), + ppChangeSubtitlesEncoding(subtitleFilePath, + ppDetermineEncodingFrom(subtitleFilePath), ppConfig.encodingTo()); - } break; case ECM_ORIGINAL: // Nie ruszaj pobranych napisów! @@ -55,7 +55,6 @@ void SubtitlePostProcessor::perform(const QString& movieFilePath, bool SubtitlePostProcessor::ppReplaceDiacriticsWithASCII( const QString& subtitleFilePath) const { - if (!QFileInfo(subtitleFilePath).exists()) return false; QString from = encodingUtils.detectFileEncoding(subtitleFilePath); @@ -84,6 +83,12 @@ bool SubtitlePostProcessor::ppReplaceDiacriticsWithASCII( bool SubtitlePostProcessor::ppChangeSubtitlesEncoding( const QString& subtitleFilePath, const QString& from, const QString& to) const { + + if (QString::compare(from, ppConfig.encodingTo(), Qt::CaseInsensitive) == 0) { + // The same encoding, conversion isn't required. + return false; + } + QFile f(subtitleFilePath); if (!f.open(QIODevice::ReadOnly)) return false; @@ -109,20 +114,19 @@ bool SubtitlePostProcessor::ppChangeSubtitlesEncoding( return true; } -bool SubtitlePostProcessor::ppChangeSubtitlesEncoding( - const QString& subtitleFilePath, const QString& to) const { - if (!QFileInfo(subtitleFilePath).exists()) return false; - - QString from = encodingUtils.detectFileEncoding(subtitleFilePath); - - if (from.isEmpty()) return false; +QString SubtitlePostProcessor::ppDetermineEncodingFrom(const QString& subtitleFilePath) const { + if (ppConfig.encodingAutoDetectFrom()) { + QString autodetectedFrom = encodingUtils.detectFileEncoding(subtitleFilePath); + if (!autodetectedFrom.isEmpty()) { + return autodetectedFrom; + } + } - return ppChangeSubtitlesEncoding(from, to); + return ppConfig.encodingFrom(); } bool SubtitlePostProcessor::ppRemoveLinesContainingWords( const QString& subtitleFilePath, QStringList wordList) const { - if (!QFileInfo(subtitleFilePath).exists()) return false; wordList = wordList.filter(QRegExp("^(.+)$")); diff --git a/libqnapi/src/subtitlepostprocessor.h b/libqnapi/src/subtitlepostprocessor.h index ef88dad..54857c3 100644 --- a/libqnapi/src/subtitlepostprocessor.h +++ b/libqnapi/src/subtitlepostprocessor.h @@ -35,8 +35,7 @@ class SubtitlePostProcessor { bool ppReplaceDiacriticsWithASCII(const QString& subtitleFilePath) const; bool ppChangeSubtitlesEncoding(const QString& subtitleFilePath, const QString& from, const QString& to) const; - bool ppChangeSubtitlesEncoding(const QString& subtitleFilePath, - const QString& to) const; + QString ppDetermineEncodingFrom(const QString& subtitleFilePath) const; bool ppRemoveLinesContainingWords(const QString& subtitleFilePath, QStringList wordList) const;