OSDN Git Service

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