OSDN Git Service

3c16d3eb87d469afe069c13633797f3dd4b83e0c
[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.getpath("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     #recdblist.addlog(pout, txt, "mp4boxログ-コマンド")\r
63     #recdblist.addlog(pout, txt, "mp4boxログ-詳細")\r
64     if status.getSettings_auto_del_tmp()==1:\r
65         if os.path.exists(pout):\r
66             if re.search(opt,"MW8") or re.search(opt,"MW9"):\r
67                 auto_process.deltmpfile(dir, title, ".mp4")\r
68             elif re.search(opt,"8") or re.search(opt,"9"):\r
69                 ""\r
70             else:\r
71                 auto_process.deltmpfile(dir, title, ".mp4")\r
72 def mkv2mp4(pin,pout):\r
73     exeb = configreader.getpath(u"mkvextract")\r
74     exe = configreader.getpath(u"mp4Box")\r
75     #dtsedit=configreader.getpath("DtsEdit")\r
76     wineexe=configreader.getpath("wine")\r
77     dir=os.path.split(pin)[0]\r
78     title=os.path.split(pin)[1]\r
79     title=os.path.splitext(title)[0]\r
80     etitle=base64.b16encode(title.encode('utf-8'))\r
81     audiopath=os.path.join(dir,etitle+u"_audio.aac")\r
82     videopath=os.path.join(dir,etitle+u"_video.264")\r
83     timecodepath=os.path.join(dir,etitle+u"_1_timecode.txt")\r
84     tmpmp4=os.path.join(dir,etitle+u".tmp.mp4")\r
85     exe0=exeb+u" tracks \'"+pin+u"\' 1:\'"+videopath+u"\' 2:\'"+audiopath+u"\'"\r
86     exe1=exeb+u" timecodes_v2 \'"+pin+"\' 1:\'"+timecodepath+"\'"\r
87     exe2=exe+u" -fps 29.970030 -add \'"+videopath+u"\' -add \'"+audiopath+u"\' -new \'"+tmpmp4+u"\'"\r
88     exe3=wineexe+u" "+dtsedit+u" -tc \'Z:\\"+timecodepath+u"\' \'Z:\\"+tmpmp4+u"\' -o \'Z:\\"+pout+u"\'"\r
89     os.environ['LANG']="ja_JP.UTF-8"\r
90     txt=""\r
91     try:\r
92         txt=txt+execcomd(exe0)+"\n"\r
93         txt=txt+execcomd(exe1)+"\n"\r
94         txt=txt+execcomd(exe2)+"\n"\r
95         txt=txt+execcomd(exe3)+"\n"\r
96     except:\r
97         ""\r
98     recdblist.addlog(pin, txt, u"MKV2MP4-log")\r
99     txt = "\n####MKV2MP4-log####\n"+txt\r
100     time.sleep(10)\r
101     if status.getSettings_auto_del_tmp()==1:\r
102         if os.path.exists(pout):\r
103             auto_process.deltmpfile(dir, title, ".mp4")\r
104 def addCaption(pts,pmp4):##字幕の追加を試みる。\r
105     wineexe=configreader.getpath("wine")\r
106     pincap=pts.replace(".ts",".srt")\r
107     try:\r
108         cap2ass=configreader.getpath("caption2ass")\r
109     except:\r
110         cap2ass=""\r
111     if os.path.isfile(cap2ass):\r
112         e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pts+"\" \"Z:\\"+pincap+"\""\r
113         recdblist.printutf8(e0)\r
114         p0=subprocess.Popen(e0,shell=True,stdout=subprocess.PIPE)\r
115         time.sleep(100)\r
116         if p0.poll==None:#実行中\r
117             #if os.path.getsize(pincap)<1000:#2mで1kb以下の場合自動で終了\r
118              #   os.kill(p0.pid,signal.SIGKILL)\r
119             #else:\r
120             os.waitpid(p0.pid, 0)\r
121             logt=unicode(p0.communicate()[0], "UTF-8")\r
122             recdblist.addlog(pts,e0, u"Captionログ-コマンド")\r
123             recdblist.addlog(pts,logt, u"Captionログ-詳細")\r
124         if os.path.exists(pincap):\r
125             if os.path.getsize(pincap)>1000:\r
126                 exe = configreader.getpath("mp4box")\r
127                 e1s=exe +u" -add \""+pincap+"\" \""+pmp4+"\""\r
128                 addmp4(pincap,pmp4,e1s)\r
129 def addAudio(pts,pmp4,opts):#オプションに応じた音声の追加を行う\r
130     exe = configreader.getpath("mp4box")\r
131     if re.search("d",opts) or re.search("5",opts):#二カ国語放送/5.1ch放送の場合\r
132         paac1=pts.replace(".ts","_1.aac")\r
133         paac2=pts.replace(".ts","_2.aac")\r
134         recdblist.printutf8(paac1)\r
135         if not os.path.exists(paac1):\r
136             paac1=pts.replace(".ts","_1.mp3")\r
137         if not os.path.exists(paac2):\r
138             paac2=pts.replace(".ts","_2.mp3")\r
139         e1a1=exe +u" -add \""+paac1+"\" \""+pmp4+"\""\r
140         e1a2=exe +u" -add \""+paac2+"\" \""+pmp4+"\""\r
141         if os.path.exists(paac1):\r
142             addmp4(paac1, pmp4, e1a1)\r
143         if os.path.exists(paac2):\r
144             addmp4(paac2, pmp4, e1a2)\r
145     else:\r
146         tv2audio.ts2single_audio(pts,opts)\r
147         pinaac=pts.replace(".ts",".aac")\r
148         if not os.path.exists(pinaac):\r
149             pinaac=pinaac.replace(".aac",".mp3")\r
150         e1a=exe +u" -add \""+pinaac+"\" \""+pmp4+"\""\r
151         if os.path.exists(pinaac):\r
152             addmp4(pinaac, pmp4, e1a)\r
153 def execmp4box(pin,pout,cmd):\r
154     title=os.path.splitext(os.path.split(pin)[1])[0]\r
155     nt=base64.b16encode(title.encode('utf-8'))\r
156     if len(nt)>200:\r
157         nt=nt[:180]\r
158     ptin=os.path.join(os.path.dirname(pin),nt+".264")\r
159     recdblist.printutf8(ptin)\r
160     shutil.move(pin,ptin)\r
161     time.sleep(10)\r
162     ptout=os.path.join(os.path.dirname(pout),nt+".mp4")\r
163     cmdn=string.replace(cmd,pin,ptin)\r
164     cmdn=string.replace(cmdn,pout,ptout)\r
165     recdblist.printutf8(cmdn)\r
166     txt=""\r
167     try:\r
168         txt=execcomd(cmdn)\r
169     except Exception, inst:\r
170         txt= "error occures in execmp4box\n"\r
171         txt=txt+ str(type(inst))+"\n"\r
172         txt=txt+str(inst)\r
173         recdblist.Commonlogex("Error", "excecmp4box(tv2mp4.py)", str(type(inst)), str(inst)+traceback.format_exc(),verbose_level=200,log_level=200)\r
174     recdblist.addlog(pin, cmdn, u"MP4Boxログ-コマンド")\r
175     recdblist.addlog(pin, txt, u"MP4Boxログ-詳細")\r
176     time.sleep(5)\r
177     shutil.move(ptin,pin)\r
178     shutil.move(ptout,pout)\r
179     time.sleep(5)\r
180 def addmp4(padd,pout,cmd):#without video\r
181     title=os.path.splitext(os.path.split(padd)[1])[0]\r
182     ext=os.path.splitext(os.path.split(padd)[1])[1]\r
183     nt=base64.b16encode(title.encode('utf-8'))\r
184     if len(nt)>200:\r
185         nt=nt[:180]\r
186     ptadd=os.path.join(os.path.dirname(padd),nt+ext)\r
187     ptoutb=os.path.join(os.path.dirname(pout),nt+"_b.mp4")\r
188     ptout=os.path.join(os.path.dirname(pout),nt+".mp4")\r
189     shutil.move(padd,ptadd)\r
190     if os.path.isfile(pout):\r
191         shutil.move(pout,ptoutb)\r
192     time.sleep(5)\r
193     cmdn=string.replace(cmd,padd,ptadd)\r
194     cmdn=string.replace(cmdn,u"-out \""+pout,u"-add \""+ptoutb+"\" -new \""+ptout)\r
195     cmdn=string.replace(cmdn,u"\""+pout,u"-add \""+ptoutb+"\" -new \""+ptout)\r
196     cmdn=string.replace(cmdn,pout,ptout)\r
197     recdblist.printutf8(cmdn)\r
198     txt=""\r
199     try:\r
200         txt=execcomd(cmdn)\r
201     except Exception, inst:\r
202         txt= "error occures in addmp4\n"\r
203         txt=txt+ str(type(inst))+"\n"\r
204         txt=txt+str(inst)\r
205     recdblist.addlog(pout, cmdn, u"MP4Box追加ログ-コマンド")\r
206     recdblist.addlog(pout, txt, u"MP4Box追加ログ-詳細")\r
207     time.sleep(5)\r
208     shutil.move(ptadd,padd)\r
209     if os.path.exists(ptout):\r
210         shutil.move(ptout,pout)\r
211         os.remove(ptoutb)\r
212     else:\r
213         txtt=padd+u"のインポートエラー"\r
214         recdblist.addlog(pout, txtt, u"MP4Box追加ログ-コマンド")\r
215         shutil.move(ptoutb,pout)\r
216     time.sleep(5)\r
217 def execcomd(cmd):\r
218     txt=""\r
219     try:\r
220         txt=u"Cmd : "+cmd+"\n"\r
221         txt2=commands.getoutput(cmd.encode('utf-8'))\r
222         txt=txt+unicode(txt2,"utf-8")+"\n"\r
223     except:\r
224         ""\r
225     return txt