августа 30, 2010

Автоматизация в обычной жизни: исправление субтитров

В одном из фильмов не загружались субтитры. Решил посмотреть что не так, файл с субтитрами выглядел так

00:01:40.12,00:01:41.34
Dear God

00:01:41.44,00:01:44.15
Cut it off! His arm - cut it off!

00:01:58.92,00:02:00.23
Is he dead?

00:02:00.32,00:02:03.07
- Are you drunk, Mr Price?[br]- I am, I am.

00:02:03.16,00:02:06.35
- Is he dead, the Colonel?[br]- Not dead yet. He has hope.

00:02:06.44,00:02:09.43
Hey! You two. Get him back. Back!

00:02:11.32,00:02:14.91
We're in! Do you hear? They cheer!

00:02:15.00,00:02:16.95
Cuidad Rodrigo is taken

00:02:17.04,00:02:19.63
Oh. He looks dead to me.
...

А чтобы субтитры прочитались в моём плеере (GOMPlayer), он должен был выглядеть так:

0
00:01:40.12 --> 00:01:41.34
Dear God

1
00:01:41.44 --> 00:01:44.15
Cut it off! His arm - cut it off!

2
00:01:58.92 --> 00:02:00.23
Is he dead?

3
00:02:00.32 --> 00:02:03.07
- Are you drunk, Mr Price?[br]- I am, I am.

4
00:02:03.16 --> 00:02:06.35
- Is he dead, the Colonel?[br]- Not dead yet. He has hope.

5
00:02:06.44 --> 00:02:09.43
Hey! You two. Get him back. Back!

6
00:02:11.32 --> 00:02:14.91
We're in! Do you hear? They cheer!

7
00:02:15.00 --> 00:02:16.95
Cuidad Rodrigo is taken

8
00:02:17.04 --> 00:02:19.63
Oh. He looks dead to me.
...

Т.е. нужно добавить нумерацию и заменить запятые на стрелочки. Строк в файле 3438, вручную его править нет никакого желания. Поэтому я решил автоматизировать этот процесс.

Чтобы заменить запятые на стрелочки, можно воспользоваться макросами в виме. В первой строке выполняем
    qw0f,cl --> <ESC>jjjq
Это создаст макрос на букве w, меняющий в текущей строке первую запятую на стрелочку и смещающий курсор на три строки вниз. Осталось теперь несколько раз набрать
    1000@w
и все запятые будут заменены на стрелочки.

Теперь перейдём к нумерации. Тут мы воспользуемся M4, а именно пригодится макрос incr, который предназначен для увеличения своего параметра на единицу. Например, incr(`17') выдаст 18.

Будем хранить в переменной count кол-во занумерованных строк:
    define(`count',`0')
а макрос current будет подставлять очередной номер субтитра и увеличивать count на 1:
    define(`current',`define(`count',incr(count))count')
Эти два определения нужно расположить в самом начале файла.

Теперь вставляем current перед описанием каждого субтитра — используем тот же приём, что и при замене запятых, только создание макроса будет выглядеть так (предполагается, что курсор находится на пустой строке):
    qwocurrent<ESC>jjjq

Осталось скормить это в m4:
    m4 subtitles.srt4 > subtitles.srt

Всё, теперь субтитры грузятся и работают.

Осталась совсем маленькая деталь — в субтитрах можно обнаружить команду [br]. Она предназначена для разбиения субтитров на несколько строк, однако, GOMPlayer это игнорирует и отображает её как текст. Чтобы заменить все вхождения [br] на разбиение строк, достаточно выполнить команду
    :%s/\[br\]/\r/g


2 комментария:

Vlad комментирует...

Инфу по субтитрам, кстати, можно посмотреть на code.google.com в разделе API YouTube - там есть несколько разных форматов субтитров и расписано что и как обрабатывается плеерами. Может пригодиться для чего-нибудь ;)

Дож комментирует...

Спасибо, буду иметь в виду.

Отправить комментарий

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru