OSDN Git Service

add tar log.(alpha)
[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-2011 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             recdblist.addCommandLogTar(pts, "mp4box_caption", "mp4box_caption", e0, logt)\r
121         if os.path.exists(pincap):\r
122             if os.path.getsize(pincap)>1000:\r
123                 exe = configreader.getConfPath("mp4box")\r
124                 e1s=exe +u" -add \""+pincap+"\" \""+pmp4+"\""\r
125                 addmp4(pincap,pmp4,e1s)\r
126 def addAudio(pts,pmp4,opts):#オプションに応じた音声の追加を行う\r
127     exe = configreader.getConfPath("mp4box")\r
128     if re.search("d",opts) or re.search("5",opts):#二カ国語放送/5.1ch放送の場合\r
129         paac1=pts.replace(".ts","_1.aac")\r
130         paac2=pts.replace(".ts","_2.aac")\r
131         recdblist.printutf8(paac1)\r
132         if not os.path.exists(paac1):\r
133             paac1=pts.replace(".ts","_1.mp3")\r
134         if not os.path.exists(paac2):\r
135             paac2=pts.replace(".ts","_2.mp3")\r
136         e1a1=exe +u" -add \""+paac1+"\" \""+pmp4+"\""\r
137         e1a2=exe +u" -add \""+paac2+"\" \""+pmp4+"\""\r
138         if os.path.exists(paac1):\r
139             addmp4(paac1, pmp4, e1a1)\r
140         if os.path.exists(paac2):\r
141             addmp4(paac2, pmp4, e1a2)\r
142     else:\r
143         tv2audio.ts2single_audio(pts,opts)\r
144         pinaac=pts.replace(".ts",".aac")\r
145         if not os.path.exists(pinaac):\r
146             pinaac=pinaac.replace(".aac",".mp3")\r
147         e1a=exe +u" -add \""+pinaac+"\" \""+pmp4+"\""\r
148         if os.path.exists(pinaac):\r
149             addmp4(pinaac, pmp4, e1a)\r
150 def execmp4box(pin,pout,cmd):\r
151     title=os.path.splitext(os.path.split(pin)[1])[0]\r
152     nt=base64.b16encode(title.encode('utf-8'))\r
153     if len(nt)>200:\r
154         nt=nt[:180]\r
155     ptin=os.path.join(os.path.dirname(pin),nt+".264")\r
156     recdblist.printutf8(ptin)\r
157     shutil.move(pin,ptin)\r
158     time.sleep(10)\r
159     ptout=os.path.join(os.path.dirname(pout),nt+".mp4")\r
160     cmdn=string.replace(cmd,pin,ptin)\r
161     cmdn=string.replace(cmdn,pout,ptout)\r
162     recdblist.printutf8(cmdn)\r
163     txt=""\r
164     try:\r
165         txt=execcomd(cmdn)\r
166     except Exception, inst:\r
167         txt= "error occures in execmp4box\n"\r
168         txt=txt+ str(type(inst))+"\n"\r
169         txt=txt+str(inst)\r
170         recdblist.addCommonlogEX("Error", "excecmp4box(tv2mp4.py)", str(type(inst)), str(inst)+traceback.format_exc(),verbose_level=200,log_level=200)\r
171     recdblist.addLog(pin, cmdn, u"MP4Boxログ-コマンド")\r
172     recdblist.addLog(pin, txt, u"MP4Boxログ-詳細")\r
173     recdblist.addCommandLogTar(pin, "MP4Box", "mp4box", cmdn,txt)\r
174     time.sleep(5)\r
175     shutil.move(ptin,pin)\r
176     shutil.move(ptout,pout)\r
177     time.sleep(5)\r
178 def addmp4(padd,pout,cmd):#without video\r
179     title=os.path.splitext(os.path.split(padd)[1])[0]\r
180     ext=os.path.splitext(os.path.split(padd)[1])[1]\r
181     nt=base64.b16encode(title.encode('utf-8'))\r
182     if len(nt)>200:\r
183         nt=nt[:180]\r
184     ptadd=os.path.join(os.path.dirname(padd),nt+ext)\r
185     ptoutb=os.path.join(os.path.dirname(pout),nt+"_b.mp4")\r
186     ptout=os.path.join(os.path.dirname(pout),nt+".mp4")\r
187     shutil.move(padd,ptadd)\r
188     if os.path.isfile(pout):\r
189         shutil.move(pout,ptoutb)\r
190     time.sleep(5)\r
191     cmdn=string.replace(cmd,padd,ptadd)\r
192     cmdn=string.replace(cmdn,u"-out \""+pout,u"-add \""+ptoutb+"\" -new \""+ptout)\r
193     cmdn=string.replace(cmdn,u"\""+pout,u"-add \""+ptoutb+"\" -new \""+ptout)\r
194     cmdn=string.replace(cmdn,pout,ptout)\r
195     recdblist.printutf8(cmdn)\r
196     txt=""\r
197     try:\r
198         txt=execcomd(cmdn)\r
199     except Exception, inst:\r
200         txt= "error occures in addmp4\n"\r
201         txt=txt+ str(type(inst))+"\n"\r
202         txt=txt+str(inst)\r
203     recdblist.addLog(pout, cmdn, u"MP4Box追加ログ-コマンド")\r
204     recdblist.addLog(pout, txt, u"MP4Box追加ログ-詳細")\r
205     recdblist.addCommandLogTar(pout, "MP4Box_add", "mp4box_add", cmdn, txt)\r
206     time.sleep(5)\r
207     shutil.move(ptadd,padd)\r
208     if os.path.exists(ptout):\r
209         shutil.move(ptout,pout)\r
210         os.remove(ptoutb)\r
211     else:\r
212         txtt=padd+u"のインポートエラー"\r
213         recdblist.addLog(pout, txtt, u"MP4Box追加ログ-コマンド")\r
214         shutil.move(ptoutb,pout)\r
215     time.sleep(5)\r
216 def execcomd(cmd):\r
217     txt=""\r
218     try:\r
219         txt=u"Cmd : "+cmd+"\n"\r
220         txt2=commands.getoutput(cmd.encode('utf-8'))\r
221         txt=txt+unicode(txt2,"utf-8")+"\n"\r
222     except:\r
223         ""\r
224     return txt\r