-
Notifications
You must be signed in to change notification settings - Fork 1
/
ass.py
67 lines (61 loc) · 3.55 KB
/
ass.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# -*- coding: utf-8 -*-
from xml.dom.minidom import parse
import xml.dom.minidom
from xml.dom.minidom import parseString
import time
import sys
#get ass file from xml version 1.0 2020.05.10 20:16
#
#调用get_ass需要传入string类型的xml、歌曲名和是否需要k值,默认为0带k,1位不带k,可不填
#
def format_time(t):
hour = int(t/1000/60/60)
minute = int((t-hour*60*1000*60)/1000/60)
second = int((t-60*1000*minute-hour*60*1000*60)/1000)
if t-hour*60*1000*60-minute*60*1000-second*1000>995:
millisecond = int((t-hour*60*1000*60-minute*60*1000-second*1000)/10+0.5)-100
second+=1
else:
millisecond = int((t-hour*60*1000*60-minute*60*1000-second*1000)/10+0.5)
ft=str(hour)+":"+str(minute).zfill(2)+":"+str(second).zfill(2)+"."+str(millisecond).zfill(2)
return ft
def get_ass(s,songname,k=0):
try:
DOMTree = parseString(s)
wsy = DOMTree.documentElement
line = wsy.getElementsByTagName("line")
lyric_ass = "[Script Info]\n; Script generated by Aegisub 3.2.2\n; http://www.aegisub.org/\nTitle: Default Aegisub file\nScriptType: v4.00+\nWrapStyle: 0\nScaledBorderAndShadow: yes\nYCbCr Matrix: None\n\n[Aegisub Project Garbage]\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\nStyle: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1\n\n[Events]\nFormat: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n"
for l in line:
linestring = l.getElementsByTagName("linestring")[0]
if len(linestring.childNodes)>0:
line_lyric = linestring.childNodes[0].data
wordnum = l.getElementsByTagName("wordnum")[0].childNodes[0].data
word = l.getElementsByTagName("word")
line_starttime = format_time(int(word[0].getElementsByTagName("starttime")[0].childNodes[0].data))
line_endtime = format_time(int(word[int(wordnum)-1].getElementsByTagName("endtime")[0].childNodes[0].data))
line_lyric_k = ""
for w in word:
starttime = w.getElementsByTagName("starttime")[0].childNodes[0].data
chanum = w.getElementsByTagName("chanum")[0].childNodes[0].data
endtime = w.getElementsByTagName("endtime")[0].childNodes[0].data
wordstring = w.getElementsByTagName("wordstring")[0].childNodes[0].data
kdur = int((int(endtime)-int(starttime))/10+0.5)
line_lyric_k = line_lyric_k+"{\\k"+str(kdur)+"}"+wordstring
if k==0:
lyric_ass = lyric_ass+"Dialogue: 0,"+line_starttime+","+line_endtime+",Default,,0,0,0,,"+line_lyric_k+"\n"
elif k==1:
lyric_ass = lyric_ass+"Dialogue: 0,"+line_starttime+","+line_endtime+",Default,,0,0,0,,"+line_lyric+"\n"
fw = open(songname+"-k.ass",'w',encoding='utf8')
fw.write(lyric_ass)
fw.close()
except:
print(sys.exc_info()[0])
# if __name__ == "__main__":
# file_name = r'C:\Users\jinshuai\Desktop\君はMoon.xml'
# try:
# fp = open(file_name,"r",encoding="utf-8")
# s = fp.read()
# fp.close
# except IOError:
# print("文件打开失败")
# get_ass(s,"君はMoon",1)