OSDN Git Service

remove error log.
[rec10/rec10-git.git] / rec10 / trunk / src / tv2mp4.py
1 #!/usr/bin/python\r
2 # coding: UTF-8\r
3 # Rec10 TS Recording Tools\r
4 # Copyright (C) 2009-2010 Yukikaze\r
5 import commands\r
6 import shutil\r
7 import auto_process\r
8 import os\r
9 import re\r
10 import os.path\r
11 import string\r
12 import base64\r
13 import time\r
14 import subprocess\r
15 import traceback\r
16 \r
17 import tv2avi\r
18 import recdblist\r
19 import configreader\r
20 import status\r
21 import tv2audio\r
22 \r
23 def ts2mp4(pin, pout, opt):\r
24     dir=os.path.split(pout)[0]\r
25     title=os.path.split(pout)[1]\r
26     title=os.path.splitext(title)[0]\r
27     tpraw=os.path.join(dir, title+".264")\r
28     tpmp4=os.path.join(dir, title+".mp4")\r
29     if re.search("d",opt) and not os.path.exists(pin.replace(".ts",".m2v")):\r
30         tv2audio.ts2dualaudio_BonTsDemux(pin,recdblist.BONTSDEMUX_DELAY, opt)\r
31     if os.path.isfile(pin) and os.path.getsize(pin)>10*1000:\r
32         tv2avi.ts2raw(pin, tpraw, opt)\r
33         time.sleep(10)\r
34         if os.path.isfile(tpraw) and os.path.getsize(tpraw)>10*1000:\r
35             raw2mp4(tpraw, tpmp4, opt)\r
36         time.sleep(10)\r
37         if os.path.exists(tpraw):\r
38             os.remove(tpraw)\r
39 def raw2mp4(pin,pout,opt):\r
40     dir=os.path.split(pout)[0]\r
41     title=os.path.split(pout)[1]\r
42     title=os.path.splitext(title)[0]\r
43     duration="-fps 29.970030 "\r
44     if re.search("a",opt):\r
45         duration="-fps 23.976023 "\r
46     elif re.search("v",opt):\r
47         duration="-fps 23.976023 "\r
48     if re.search("d",opt):\r
49         duration="-fps 29.970030 "##ffmpegが24fpsに対応していないための措置\r
50     elif re.search("5",opt):\r
51         duration="-fps 29.970030 "##ffmpegが24fpsに対応していないための措置\r
52     if re.search("I",opt):\r
53         duration="-fps 29.970030 "\r
54     exe = configreader.getConfPath("mp4box")\r
55     txt=""\r
56     os.environ['LANG']="ja_JP.UTF-8"\r
57     pints=pin.replace(".264",".ts")\r
58     e1=exe +u" "+duration+" -add \""+pin+"\" -new \""+pout+"\""\r
59     execmp4box(pin, pout, e1)\r
60     addAudio(pints, pout, opt)\r
61     addCaption(pints, pout)\r
62     if status.getSettings_auto_del_tmp()==1:\r
63         if os.path.exists(pout):\r
64             if re.search(opt,"1") or re.search(opt,"2"):\r
65                 auto_process.deleteTmpFile(dir, title, ".mp4")\r
66             else:\r
67                 auto_process.deleteTmpFile(dir, title, ".mp4")\r
68 def mkv2mp4(pin,pout):\r
69     exeb = configreader.getConfPath(u"mkvextract")\r
70     exe = configreader.getConfPath(u"mp4Box")\r
71     #dtsedit=configreader.getConfPath("DtsEdit")\r
72     wineexe=configreader.getConfPath("wine")\r
73     dir=os.path.split(pin)[0]\r
74     title=os.path.split(pin)[1]\r
75     title=os.path.splitext(title)[0]\r
76     etitle=base64.b16encode(title.encode('utf-8'))\r
77     audiopath=os.path.join(dir,etitle+u"_audio.aac")\r
78     videopath=os.path.join(dir,etitle+u"_video.264")\r
79     timecodepath=os.path.join(dir,etitle+u"_1_timecode.txt")\r
80     tmpmp4=os.path.join(dir,etitle+u".tmp.mp4")\r
81     exe0=exeb+u" tracks \'"+pin+u"\' 1:\'"+videopath+u"\' 2:\'"+audiopath+u"\'"\r
82     exe1=exeb+u" timecodes_v2 \'"+pin+"\' 1:\'"+timecodepath+"\'"\r
83     exe2=exe+u" -fps 29.970030 -add \'"+videopath+u"\' -add \'"+audiopath+u"\' -new \'"+tmpmp4+u"\'"\r
84     exe3=wineexe+u" "+dtsedit+u" -tc \'Z:\\"+timecodepath+u"\' \'Z:\\"+tmpmp4+u"\' -o \'Z:\\"+pout+u"\'"\r
85     os.environ['LANG']="ja_JP.UTF-8"\r
86     txt=""\r
87     try:\r
88         txt=txt+execcomd(exe0)+"\n"\r
89         txt=txt+execcomd(exe1)+"\n"\r
90         txt=txt+execcomd(exe2)+"\n"\r
91         txt=txt+execcomd(exe3)+"\n"\r
92     except:\r
93         ""\r
94     recdblist.addLog(pin, txt, u"MKV2MP4-log")\r
95     txt = "\n####MKV2MP4-log####\n"+txt\r
96     time.sleep(10)\r
97     if status.getSettings_auto_del_tmp()==1:\r
98         if os.path.exists(pout):\r
99             auto_process.deleteTmpFile(dir, title, ".mp4")\r
100 def addCaption(pts,pmp4):##字幕の追加を試みる。\r
101     wineexe=configreader.getConfPath("wine")\r
102     pincap=pts.replace(".ts",".srt")\r
103     try:\r
104         cap2ass=configreader.getConfPath("caption2ass")\r
105     except:\r
106         cap2ass=""\r
107     if os.path.isfile(cap2ass):\r
108         e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pts+"\" \"Z:\\"+pincap+"\""\r
109         recdblist.printutf8(e0)\r
110         p0=subprocess.Popen(e0,shell=True,stdout=subprocess.PIPE)\r
111         time.sleep(100)\r
112         if p0.poll==None:#実行中\r
113             #if os.path.getsize(pincap)<1000:#2mで1kb以下の場合自動で終了\r
114              #   os.kill(p0.pid,signal.SIGKILL)\r
115             #else:\r
116             os.waitpid(p0.pid, 0)\r
117             logt=unicode(p0.communicate()[0], "UTF-8")\r
118             recdblist.addLog(pts,e0, u"Captionログ-コマンド")\r
119             recdblist.addLog(pts,logt, u"Captionログ-詳細")\r
120         if os.path.exists(pincap):\r
121             if os.path.getsize(pincap)>1000:\r
122                 exe = configreader.getConfPath("mp4box")\r
123                 e1s=exe +u" -add \""+pincap+"\" \""+pmp4+"\""\r
124                 addmp4(pincap,pmp4,e1s)\r
125 def addAudio(pts,pmp4,opts):#オプションに応じた音声の追加を行う\r
126     exe = configreader.getConfPath("mp4box")\r
127     if re.search("d",opts) or re.search("5",opts):#二カ国語放送/5.1ch放送の場合\r
128         paac1=pts.replace(".ts","_1.aac")\r
129         paac2=pts.replace(".ts","_2.aac")\r
130         recdblist.printutf8(paac1)\r
131         if not os.path.exists(paac1):\r
132             paac1=pts.replace(".ts","_1.mp3")\r
133         if not os.path.exists(paac2):\r
134             paac2=pts.replace(".ts","_2.mp3")\r
135         e1a1=exe +u" -add \""+paac1+"\" \""+pmp4+"\""\r
136         e1a2=exe +u" -add \""+paac2+"\" \""+pmp4+"\""\r
137         if os.path.exists(paac1):\r
138             addmp4(paac1, pmp4, e1a1)\r
139         if os.path.exists(paac2):\r
140             addmp4(paac2, pmp4, e1a2)\r
141     else:\r
142         tv2audio.ts2single_audio(pts,opts)\r
143         pinaac=pts.replace(".ts",".aac")\r
144         if not os.path.exists(pinaac):\r
145             pinaac=pinaac.replace(".aac",".mp3")\r
146         e1a=exe +u" -add \""+pinaac+"\" \""+pmp4+"\""\r
147         if os.path.exists(pinaac):\r
148             addmp4(pinaac, pmp4, e1a)\r
149 def execmp4box(pin,pout,cmd):\r
150     title=os.path.splitext(os.path.split(pin)[1])[0]\r
151     nt=base64.b16encode(title.encode('utf-8'))\r
152     if len(nt)>200:\r
153         nt=nt[:180]\r
154     ptin=os.path.join(os.path.dirname(pin),nt+".264")\r
155     recdblist.printutf8(ptin)\r
156     shutil.move(pin,ptin)\r
157     time.sleep(10)\r
158     ptout=os.path.join(os.path.dirname(pout),nt+".mp4")\r
159     cmdn=string.replace(cmd,pin,ptin)\r
160     cmdn=string.replace(cmdn,pout,ptout)\r
161     recdblist.printutf8(cmdn)\r
162     txt=""\r
163     try:\r
164         txt=execcomd(cmdn)\r
165     except Exception, inst:\r
166         txt= "error occures in execmp4box\n"\r
167         txt=txt+ str(type(inst))+"\n"\r
168         txt=txt+str(inst)\r
169         recdblist.addCommonlogEX("Error", "excecmp4box(tv2mp4.py)", str(type(inst)), str(inst)+traceback.format_exc(),verbose_level=200,log_level=200)\r
170     recdblist.addLog(pin, cmdn, u"MP4Boxログ-コマンド")\r
171     recdblist.addLog(pin, txt, u"MP4Boxログ-詳細")\r
172     time.sleep(5)\r
173     shutil.move(ptin,pin)\r
174     shutil.move(ptout,pout)\r
175     time.sleep(5)\r
176 def addmp4(padd,pout,cmd):#without video\r
177     title=os.path.splitext(os.path.split(padd)[1])[0]\r
178     ext=os.path.splitext(os.path.split(padd)[1])[1]\r
179     nt=base64.b16encode(title.encode('utf-8'))\r
180     if len(nt)>200:\r
181         nt=nt[:180]\r
182     ptadd=os.path.join(os.path.dirname(padd),nt+ext)\r
183     ptoutb=os.path.join(os.path.dirname(pout),nt+"_b.mp4")\r
184     ptout=os.path.join(os.path.dirname(pout),nt+".mp4")\r
185     shutil.move(padd,ptadd)\r
186     if os.path.isfile(pout):\r
187         shutil.move(pout,ptoutb)\r
188     time.sleep(5)\r
189     cmdn=string.replace(cmd,padd,ptadd)\r
190     cmdn=string.replace(cmdn,u"-out \""+pout,u"-add \""+ptoutb+"\" -new \""+ptout)\r
191     cmdn=string.replace(cmdn,u"\""+pout,u"-add \""+ptoutb+"\" -new \""+ptout)\r
192     cmdn=string.replace(cmdn,pout,ptout)\r
193     recdblist.printutf8(cmdn)\r
194     txt=""\r
195     try:\r
196         txt=execcomd(cmdn)\r
197     except Exception, inst:\r
198         txt= "error occures in addmp4\n"\r
199         txt=txt+ str(type(inst))+"\n"\r
200         txt=txt+str(inst)\r
201     recdblist.addLog(pout, cmdn, u"MP4Box追加ログ-コマンド")\r
202     recdblist.addLog(pout, txt, u"MP4Box追加ログ-詳細")\r
203     time.sleep(5)\r
204     shutil.move(ptadd,padd)\r
205     if os.path.exists(ptout):\r
206         shutil.move(ptout,pout)\r
207         os.remove(ptoutb)\r
208     else:\r
209         txtt=padd+u"のインポートエラー"\r
210         recdblist.addLog(pout, txtt, u"MP4Box追加ログ-コマンド")\r
211         shutil.move(ptoutb,pout)\r
212     time.sleep(5)\r
213 def execcomd(cmd):\r
214     txt=""\r
215     try:\r
216         txt=u"Cmd : "+cmd+"\n"\r
217         txt2=commands.getoutput(cmd.encode('utf-8'))\r
218         txt=txt+unicode(txt2,"utf-8")+"\n"\r
219     except:\r
220         ""\r
221     return txt\r