OSDN Git Service

8edf22aa8f20ede08a0ba9d600e5f3d8849f1dea
[rec10/rec10-git.git] / rec10 / trunk / src / tv2audio.py
1 #!/usr/bin/python
2 # coding: UTF-8
3 # Rec10 TS Recording Tools
4 # Copyright (C) 2009-2010 Yukikaze
5 import os
6 import configreader
7 import recdblist
8 import commands
9 import os.path
10 import tv2audio
11 import subprocess
12 import signal
13 import traceback
14 def wav2aac_nero(pin,pout):
15     os.environ['LANG']="ja_JP.UTF-8"
16     neroaac=configreader.getpath('NeroAAC')
17     exe=neroaac+" -br 128000 -2pass -if \""+pin+"\" -of \""+pout+"\""
18     try:
19         txt=commands.getoutput(exe.encode('utf-8'))
20         recdblist.addlog(pin, exe, u"Wav2aac_Neroログ-コマンド")
21         recdblist.addlog(pin, txt, u"Wav2aac_Neroログ-詳細")
22     except:
23         if not os.path.exists(pout):
24             lame="lame"
25             exe=lame+" -b 128 \""+pin+"\" \""+pout+"\""
26             txt=commands.getoutput(exe.encode('utf-8'))
27             recdblist.addlog(pin, exe, u"Wav2aac_Lameログ-コマンド")
28             recdblist.addlog(pin, txt, u"Wav2aac_Lameログ-詳細")
29 def wav2mp3_lame(pin,pout):
30     os.environ['LANG']="ja_JP.UTF-8"
31     lame="lame"
32     exe=lame+" -b 128 \""+pin+"\" \""+pout+"\""
33     try:
34         txt=commands.getoutput(exe.encode('utf-8'))
35     except:
36         ""
37     recdblist.addlog(pin, exe, u"Wav2aac_Lameログ-コマンド")
38     recdblist.addlog(pin, txt, u"Wav2aac_Lameログ-詳細")
39 def ts2single_audio(pts,opts):
40     paac=pts.replace(".ts",".aac")
41     ffmpeg=configreader.getpath("ffmpeg")
42     e0=ffmpeg+" -i \""+pts+"\" -y -vn -f aac -acodec copy \""+paac+"\""
43     p0=subprocess.Popen(e0,shell=True)
44     os.waitpid(p0.pid, 0)
45     if p0.poll==None:#実行中
46         if os.path.exists(paac):
47             if os.path.getsize(paac)<1000:#1mで1kb以下の場合自動で終了
48                 try:
49                     logt=unicode(p0.communicate()[0], "UTF-8")
50                     recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
51                     recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
52                 except:
53                     ""
54                 recdblist.Commonlogex("[Error]", "ffmpeg aac getting. (ts2single_audio@tv2audio.py)", u"AAC demux error(ffmpeg)", "", verbose_level=200, log_level=200)
55                 os.kill(p0.pid,signal.SIGKILL)
56                 os.remove(paac)
57                 ts2single_mp3_ffmpeg(pts)
58                 if not os.path.exists(pts.replace(".ts",".mp3")):
59                     ts2single_fp_BonTsDemux(pts,opts)
60             else:
61                 logt=unicode(p0.communicate()[0], "UTF-8")
62                 recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
63                 recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
64         else:
65             try:
66                 logt=unicode(p0.communicate()[0], "UTF-8")
67                 recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
68                 recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
69             except:
70                 ""
71             recdblist.Commonlogex("[Error]", "ffmpeg aac getting. (ts2single_audio@tv2audio.py)", u"AAC demux error(ffmpeg)", "", verbose_level=200, log_level=200)
72             try:
73                 os.kill(p0.pid,signal.SIGKILL)
74             except:
75                 ""
76             ts2single_mp3_ffmpeg(pts)
77             if not os.path.exists(pts.replace(".ts",".mp3")):
78                 ts2single_fp_BonTsDemux(pts,opts)
79     else:
80         if os.path.exists(paac):
81             if os.path.getsize(paac)<1000:#1mで1kb以下の場合自動で終了
82                 try:
83                     logt=unicode(p0.communicate()[0], "UTF-8")
84                     recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
85                     recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
86                 except:
87                     ""
88                 recdblist.Commonlogex("[Error]", "ffmpeg aac getting. (ts2single_audio@tv2audio.py)", u"AAC demux error(ffmpeg)", "", verbose_level=200, log_level=200)
89                 os.remove(paac)
90                 ts2single_mp3_ffmpeg(pts)
91                 if not os.path.exists(pts.replace(".ts",".mp3")):
92                     ts2single_fp_BonTsDemux(pts,opts)
93             else:
94                 try:
95                     logt=unicode(p0.communicate()[0], "UTF-8")
96                     recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
97                     recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
98                 except:
99                     ""
100         else:
101             try:
102                 logt=unicode(p0.communicate()[0], "UTF-8")
103                 recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
104                 recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
105             except:
106                 ""
107             recdblist.Commonlogex("[Error]", "ffmpeg aac getting. (ts2single_audio@tv2audio.py)", u"AAC demux error(ffmpeg)", "", verbose_level=200, log_level=200)
108             ts2single_mp3_ffmpeg(pts)
109             if not os.path.exists(pts.replace(".ts",".mp3")):
110                 ts2single_fp_BonTsDemux(pts,opts)
111 def ts2singlewav(pts,opts):
112     bontsdemux = configreader.getpath('bontsdemux')
113     bonpin = "Z:\\" + pts[1:]
114     outf = os.path.splitext(pts)[0]
115     bonpout = "Z:\\" + outf[1:]
116     xvfb = configreader.getpath('xvfb-run')
117     vf=""
118     delayt="-delay 167 "
119     if re.search(",",opts):
120         vf="-vf "
121     if re.search(".",opts):
122         delayt=""
123     exe = 'wine ' + bontsdemux + " -i \"" + bonpin + "\" "+delayt+" -nd "+vf+"-sound 0 -o \"" + bonpout + "\" -start -quit"
124     #recdblist.printutf8(exe)
125     exe = xvfb + ' -a ' + exe
126     recdblist.printutf8(exe)
127     p=subprocess.Popen(exe.encode('utf-8'),shell=True)
128     os.waitpid(p.pid, 0)
129     logt=unicode(p.communicate()[0], "UTF-8")
130     recdblist.addCommandLog(ots, u"BonTsDemux 音声取り出し", exe, logt)
131 def ts2single_mp3_ffmpeg(pts):
132     pmp3=pts.replace(".ts",".mp3")
133     ffmpeg=configreader.getpath("ffmpeg")
134     e0=ffmpeg+" -i \""+pts+"\" -y -vn -ab 128k \""+pmp3+"\""
135     p0=subprocess.Popen(e0,shell=True)
136     os.waitpid(p0.pid, 0)
137     try:
138         logt=unicode(p0.communicate()[0], "UTF-8")
139         recdblist.addlog(pts,e0, "FFmpeg_mp3音声取り出しログ-コマンド")
140         recdblist.addlog(pts,logt, "FFmpeg_mp3音声取り出しログ-詳細")
141     except:
142         ""
143 def ts2single_fp_BonTsDemux(pts,opts):
144     useNero=0
145     try:
146         if configreader.getpath("useNeroAAC")=="1" and os.path.exists(configreader.getpath("NeroAAC")):
147             useNero=1
148     except:
149         useNero=0
150     if useNero==1:
151         ts2single_aac_BonTsDemux_Nero(pts,opts)
152     else:
153         ts2single_mp3_BonTsDemux(pts,opts)
154 def ts2single_aac_BonTsDemux_Nero(pts,opts):
155     ts2singlewav(pts,opts)
156     aout=pts.replace(".ts",".aac")
157     ain=pts.replace(".ts",".wav")
158     tv2audio.wav2aac_nero(ain,aout)
159 def ts2single_mp3_BonTsDemux(pts,opts):
160     ts2singlewav(pts,opts)
161     aout=pts.replace(".ts",".mp3")
162     ain=pts.replace(".ts",".wav")
163     tv2audio.wav2mp3_lame(ain,aout)
164 def dualaudio2sep(pin, delay,opts):
165     """
166     delay is string
167     """
168     xvfb = configreader.getpath('xvfb-run')
169     bontsdemux = configreader.getpath('bontsdemux')
170     wine = configreader.getpath('wine')
171     bonpin = "Z:\\" + pin[1:]
172     outf = os.path.splitext(pin)[0]
173     bonpout = "Z:\\" + outf[1:]
174     if re.search(",",opts):
175         vf="-vf "
176     exe = wine + ' ' + bontsdemux + " -i \"" + bonpin + "\" -delay " + delay + " -nd "+vf+"-sound 1 -o \"" + bonpout + "\" -start -quit"
177     recdblist.printutf8(exe)
178     exe = xvfb + ' -a ' + exe
179     txt=commands.getoutput(exe.encode('utf-8'))
180     try:
181         recdblist.addCommandLog(pin, u"BonTsDemux 第一音声取り出し", exe, txt)
182     except:
183         ""
184     ffpin = pin.replace(".ts", "")
185     ffpin1 = pin.replace("ts", "wav")
186     ffpin2 = pin.replace("ts", "m2v")
187     ffpout1 = ffpin + "_1.wav"
188     ffpout2 = ffpin + "_2.wav"
189     ffpout3 = ffpin + ".m2v"
190     shutil.move(ffpin1, ffpout1)
191     exe = 'wine ' + bontsdemux + " -i \"" + bonpin + "\" -delay " + delay + " -nd  "+vf+"-sound 2 -encode Demux\(wav\) -o \"" + bonpout + "\" -start -quit"
192     recdblist.printutf8(exe)
193     exe = xvfb + ' -a ' + exe
194     txt=commands.getoutput(exe.encode('utf-8'))
195     try:
196         recdblist.addCommandLog(pin, u"BonTsDemux 第二音声取り出し", exe, txt)
197     except:
198         ""
199     #os.system(exe)
200     shutil.move(ffpin1, ffpout2)
201     shutil.move(ffpin2, ffpout3)
202     ffpout21=ffpout1.replace(".wav",".mp3")
203     ffpout22=ffpout2.replace(".wav",".mp3")
204     useNero=0
205     try:
206         if configreader.getpath("useNeroAAC")=="1" and os.path.exists(configreader.getpath("NeroAAC")):
207             useNero=1
208     except:
209         useNero=0
210     if useNero==1:
211         ffpout21=ffpout1.replace(".wav",".aac")
212         ffpout22=ffpout2.replace(".wav",".aac")
213         tv2audio.wav2aac_nero(ffpout1, ffpout21)
214         tv2audio.wav2aac_nero(ffpout2, ffpout22)
215     else:
216         tv2audio.wav2mp3_lame(ffpout1, ffpout21)
217         tv2audio.wav2mp3_lame(ffpout2, ffpout22)
218     time.sleep(3)
219     os.remove(ffpout1)
220     os.remove(ffpout2)
221 def pentaaudio2sep(pin):
222     bontsdemux = configreader.getpath('bontsdemux')
223     wine = configreader.getpath('wine')
224     xvfb = configreader.getpath('xvfb-run')
225     bonpin = "Z:\\" + pin[1:]
226     outf = os.path.splitext(pin)[0]
227     bonpout = "Z:\\" + outf[1:]
228     exe = wine + ' ' + bontsdemux + " -i \"" + bonpin + "\" -delay 167 -nd -sound 3 -o \"" + bonpout + "\" -start -quit"
229     exe = xvfb + ' -a ' + exe
230     recdblist.printutf8(exe)
231     txt=commands.getoutput(exe.encode('utf-8'))
232     try:
233         recdblist.addCommandLog(pin, u"BonTsDemux5.1ch 第一音声取り出し", exe, txt)
234     except:
235         ""
236     ffpin = pin.replace(".ts", "")
237     ffpin1 = pin.replace("ts", "wav")
238     ffpin2 = pin.replace("ts", "m2v")
239     ffpout1 = ffpin + "_1.wav"
240     ffpout2 = ffpin + "_2.aac"
241     shutil.move(ffpin1, ffpout1)
242     exe = "ffmpeg -i '"+pin+"' -vn -f aac -acodec copy '"+ffpout2+"'"
243     recdblist.printutf8(exe)
244     txt=commands.getoutput(exe.encode('utf-8'))
245     try:
246         recdblist.addCommandLog(pin, u"FFmpeg 5.1ch 第二音声(raw AAC)取り出し", exe, txt)
247     except:
248         ""
249     ffpout21=ffpout1.replace(".wav",".mp3")
250     useNero=0
251     try:
252         if configreader.getpath("useNeroAAC")=="1" and os.path.exists(configreader.getpath("NeroAAC")):
253             useNero=1
254     except:
255         useNero=0
256     if useNero==1:
257         ffpout21=ffpout1.replace(".wav",".aac")
258         tv2audio.wav2aac_nero(ffpout1, ffpout21)
259     else:
260         tv2audio.wav2mp3_lame(ffpout1, ffpout21)
261     if not os.path.exists(ffpout21):
262         exe = wine + ' ' + bontsdemux + " -i \"" + bonpin + "\" -delay 167 -nd -sound 0 -o \"" + bonpout + "\" -start -quit"
263         exe = xvfb + ' -a ' + exe
264         recdblist.printutf8(exe)
265         txt=commands.getoutput(exe.encode('utf-8'))
266         try:
267             recdblist.addCommandLog(pin, u"BonTsDemux 修正版第二音声(2chDownmix)取り出し", exe, txt)
268         except:
269             ""
270         shutil.move(ffpin1, ffpout1)
271         if useNero==1:
272             ffpout21=ffpout1.replace(".wav",".aac")
273             tv2audio.wav2aac_nero(ffpout1, ffpout21)
274         else:
275             tv2audio.wav2mp3_lame(ffpout1, ffpout21)
276         time.sleep(3)
277     ffpout21=ffpout1.replace(".wav",".aac")
278     if os.path.exists(ffpout21):
279         if os.path.getsize(ffpout21)>10*1000*1000:
280             os.remove(ffpout1)