OSDN Git Service

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