Declaration of VAR

and some other stuff

Починка таймстампов в SRT после Google Translate

2015-03-21 20:07:58 +0300

2015-03-21 20:07:58 +0300 | Comments

Проблема в том, что если закинуть в Google Translate содержимое SRT файла, то после перевода Гугол изломает таймстампы, из-за чего субтитры перестанут восприниматься плеерами и другими приложениями.

Я запилил небольшой скрипт, который починяет таймстампы обратно в нормальный вид.

А ломает Гугол следующее:

  1. После двоеточий добавляет пробел;
  2. Запятую, разделитель миллисекунд, заменяет на точку;
  3. Разделитель начала и конца титра сокращает на один дефис.

Вот так выглядит нормальный:

00:57:15,600 --> 00:57:21,840

Вот так выглядит изломанный Гуголом:

00: 57: 15,600 -> 00: 57: 21.840

Для исправления этого я использовал поиск по регулярному выражению с заменой найденных поломанных таймстампов на нормальные. Некоторая сложность была в том, чтобы не просто выцепить из текста таймстампы, а исправить их. Так я открыл для себя, что функция JavaScript replace вторым аргументом может принимать другую функцию, которая может выполнять действия с найденными фрагментами.

Функция выглядит так:

function fixSubsAfterGoogle () {
    // вот тут идёт починка всех трёх пунктов, которые Гугол ломает после перевода
    function fixTime(match) {
        return match.replace(/: /g, ":").replace("->", "--\>").replace(/\./g, ",");
    }
    // предположим, в resultsOfGoogleTranslations лежит результат перевода
    var fixedSRT = resultsOfGoogleTranslations.replace(
        // или можно задать выражение сразу так: /\d{2}: \d{2}: \d{2}.\d{3} -> \d{2}: \d{2}: \d{2}.\d{3}/g
        new RegExp(
            "\d{2}: \d{2}: \d{2}.\d{3} -> \d{2}: \d{2}: \d{2}.\d{3}",
            "g"
            ),
        fixTime // вот этот второй аргумент, здесь вызывает функция, которая повыше
        );
}

В виде функции это ни сильно интересно и пригодно к использованию, потому я запилил страницу, на которой всё это можно проделать более-менее удобно и красиво.

Страница исправления таймстампов в SRT

Очень помогли следующие ресурсы: