Появилось желание смотреть видео с субтитрами на двух языках одновременно. Тема эта уже обсуждалась, были предложены скрипт для mplayer, а так же плееры с уже встроенной такой возможностью: kmplayer, powerdvd, bsplayer.
В VLC VideoLan уже 5 лет висит тикет 824, в котором запрашивали такую возможность.
Все эти варианты мне не подошли по разным причинам: проблемы с кодировкой, "корявое" воспроизведение, непривичный интерфейс. Я уже привык к Media Player Classic и хотел бы смотреть виде через него.
И мне пришла в голову идея быстрого слияния английского и русского STR субтитров в один ASS файл.
Ознакомившись со спецификацией ASS субтитров на сайте
http://subs.com.ru/page.php?al=ssa_description, набросал стили для отображения русского и английского текста:
[Script Info]
ScriptType: v4.00+
Collisions: Normal
Timer: 100.0000
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: EngText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,2,20,20,20,204
Style: RusText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,8,20,20,20,204
Стиль выбрал аналогичный шрифту по умолчанию для SRT субтитров в Media Player Classic, его можно изменить на свой вкус.
Для работы с SRT субтитрами существует библиотека PySrt
http://pypi.python.org/pypi/pysrt/.
Сам скрип я только начал писать, еще не все реализовал, остается добавить обработку второго SRT файла, аргументы командной строки и, возможно, добавить графический интерфейс.
import os
import codecs
from pysrt import SubRipFile
INPUT_FILE = 'test.srt'
OUTPUT_FILE = 'out.ass'
FILE_ENCODE = 'cp1251'
head = '''[Script Info]
ScriptType: v4.00+
Collisions: Normal
Timer: 100.0000
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: EngText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,2,20,20,20,204
Style: RusText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,8,20,20,20,204
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text'''
OutSub = codecs.open(OUTPUT_FILE, encoding=FILE_ENCODE, mode='w+')
OutSub.write(head)
subs = SubRipFile.open(INPUT_FILE, encoding=FILE_ENCODE)
for sub in subs:
start_time = sub.start.to_time().strftime('%H:%M:%S.%f')[1:-4]
end_time = sub.end.to_time().strftime('%H:%M:%S.%f')[1:-4]
string = sub.text.replace('\n', '\\N')[:-2]
OutSub.write('Dialogue: 0,%s,%s,EngText,,0000,0000,0000,,%s\n' % (start_time, end_time, string))