Починка таймстампов в SRT после Google Translate
Проблема в том, что если закинуть в Google Translate содержимое SRT
файла, то после перевода Гугол изломает таймстампы, из-за чего субтитры перестанут восприниматься плеерами и другими приложениями.
Я запилил небольшой скрипт, который починяет таймстампы обратно в нормальный вид.
А ломает Гугол следующее:
- После двоеточий добавляет пробел;
- Запятую, разделитель миллисекунд, заменяет на точку;
- Разделитель начала и конца титра сокращает на один дефис.
Вот так выглядит нормальный:
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 // вот этот второй аргумент, здесь вызывает функция, которая повыше
);
}
В виде функции это ни сильно интересно и пригодно к использованию, потому я запилил страницу, на которой всё это можно проделать более-менее удобно и красиво.
Social networks
Zuck: Just ask
Zuck: I have over 4,000 emails, pictures, addresses, SNS
smb: What? How'd you manage that one?
Zuck: People just submitted it.
Zuck: I don't know why.
Zuck: They "trust me"
Zuck: Dumb fucks