youtubeの字幕のxmlをsrtに変換するスクリプト

前回の記事でyoutubeの字幕をダウンロードするスクリプトを載せたけど、どうやらxmlでは何かと不便らしい。srt形式にすると幸せになるらしい。次のサイトを参考にした。

srt

srtの中身は、例えばこんな感じ

1
00:00:00,000 --> 00:00:03,000
はろー。

2
00:00:03,000 --> 00:00:05,487
ぺろぺろ。

3
00:00:06,000 --> 00:00:09,000
ほげほげ。

番号、字幕表示の開始時間と終了時間、表示させる内容、空行、といった構成になっている。単純でいいね。
それじゃ、ダウンロードしたxmlをこの形に変換してみよう、ということで、Pythonでのxmlの扱いについて調べてみた。色々調べた後、次の記事を参考にすることにした。

http://perl.wonder-boys.net/?p=155

ちなみに字幕のxmlファイルは次のような構成になっている。

<?xml version="1.0" encoding="UTF-8"?>
-<transcript>
  <text dur="8.477" start="1.533">ほげほげ</text>
 </transcript>

startは開始時間、durは何秒表示させるか、といったところか。

で、次のようなスクリプトを書いた。Pythonのバージョンは2.7。

from xml.etree.ElementTree import ElementTree
import datetime

def encode(f, start, dur, content, num):    #変換する関数
    dt = datetime.datetime(2000, 1, 1, 0, 0, 0, )    #年、月、日は使わないので適当
    start = dt + datetime.timedelta(seconds = float(start))    #開始時間を求める
    end = start + datetime.timedelta(seconds = float(dur))    #終了時間を求める
    st = start.strftime('%H:%M:%S,') + str(start.microsecond)[0:3]    #書式を合わせる
    et = end.strftime('%H:%M:%S,') + str(end.microsecond)[0:3]    #マイクロ秒の部分は最初の3ケタだけ
    f.write(str(num) + '\n')
    f.write(st + ' --> ' + et + '\n')
    f.write(content + '\n')
    f.write('\n')

def get_element(wf, name):    #xmlファイルから要素を抽出してencode関数に渡す関数
    xml = ElementTree(file = open(name + '.xml'))
    root = xml.getroot()
    text = xml.findall('text')    #'text'タグを要素を含めて全てリストにしてtextに入れる
    num = 1
    for t in text:    #textから順番に要素を取り出してencode関数に渡すのを繰り返す
        tl = t.items()
        start = tl[0][1]
        dur = tl[1][1]
        content = t.text
        content = content.encode('utf_8')    #これがないとエラーが出る
        encode(wf, start, dur, content, num)
        num += 1

def main():
    name = raw_input('Input: ')
    f = open(name + '.srt','w')
    get_element(f, name)
    f.close()

if __name__ == "__main__":
	main()

これで、入力したxmlファイルと同じ名前のsrtファイルがカレントディレクトリに生成される。入力する際、○○○.xmlの○○○だけを入力する。
前回載せたスクリプトと合体させればURL入力->srtの生成ができる。