OSDN Git Service

add dist
[rec10/rec10-git.git] / dist / trunk / rec10 / auto_process.py
diff --git a/dist/trunk/rec10/auto_process.py b/dist/trunk/rec10/auto_process.py
new file mode 100755 (executable)
index 0000000..175df6b
--- /dev/null
@@ -0,0 +1,285 @@
+#!/usr/bin/python\r
+# coding: UTF-8\r
+# Rec10 TS Recording Tools\r
+# Copyright (C) 2009-2011 Yukikaze\r
+import os\r
+import glob\r
+import time\r
+import datetime\r
+import commands\r
+import re\r
+import os.path\r
+\r
+import chdb\r
+import status\r
+import configreader\r
+import recdblist\r
+import rec10d\r
+import tv2mp4\r
+import epgdb\r
+def updateToMP4(path):\r
+    """\r
+    !現在未使用!\r
+    録画一時フォルダ内mp4ファイルを検索\r
+    """\r
+    avilist = glob.glob(path + "/*.avi")\r
+    mkvlist = glob.glob(path+"/*.mkv")\r
+    avilist=avilist+mkvlist\r
+    for avif in avilist:\r
+        if avif.rfind("sa.avi")==-1:\r
+            dir = os.path.split(avif)[0]\r
+            title = os.path.split(avif)[1]\r
+            title = title.replace(".avi", "")\r
+            title = title.replace(".mkv", "")\r
+            avipath = os.path.join(dir, title + ".avi")\r
+            mkvpath = os.path.join(dir, title + ".mkv")\r
+            mp4path = os.path.join(dir, title + ".mp4")\r
+            if not os.path.exists(mp4path):\r
+                if os.path.exists(avipath):\r
+                    avidtime = int(time.time()-os.path.getmtime(avipath))\r
+                    if avidtime>300:\r
+                        if os.path.exists(mkvpath):\r
+                            mkvdtime = int(time.time()-os.path.getmtime(mkvpath))\r
+                            if mkvdtime>300:\r
+                                recdblist.printutf8(mkvpath+":"+mp4path)\r
+                                tv2mp4.mkv2mp4(mkvpath,mp4path)\r
+                            else:\r
+                                recdblist.printutf8(avipath+":"+mp4path)\r
+                                tv2mp4.avi2mp4(avipath,mp4path)\r
+                        else:\r
+                            recdblist.printutf8(avipath+":"+mp4path)\r
+                            tv2mp4.avi2mp4(avipath,mp4path)\r
+                else:\r
+                    if not os.path.exists(avipath):\r
+                        if os.path.exists(mkvpath):\r
+                            mkvdtime = int(time.time()-os.path.getmtime(mkvpath))\r
+                            if mkvdtime>300:\r
+                                recdblist.printutf8(mkvpath+":"+mp4path)\r
+                                tv2mp4.mkv2mp4(mkvpath,mp4path)\r
+def autoCheck(path):\r
+    avilist = glob.glob(path + "/*.avi")\r
+    mkvlist = glob.glob(path+"/*.mkv")\r
+    mp4list = glob.glob(path+"/*.mp4")\r
+    tslist = glob.glob(path+"/*.ts")\r
+    b25list = glob.glob(path+"/*.ts.b25")\r
+    filelist=avilist+mkvlist+tslist+b25list+mp4list\r
+    add=[]\r
+    tbtime=datetime.datetime.now()+datetime.timedelta(seconds=60)\r
+    tbtime2=datetime.datetime.now()+datetime.timedelta(seconds=1200)\r
+    for fn in filelist:\r
+        if os.path.exists(fn):\r
+            if fn.rfind("sa.avi")==-1 and fn.rfind(".120.avi")==-1 and os.path.getsize(fn)>1*1000*1000:\r
+                dir = os.path.split(fn)[0]\r
+                file = os.path.split(fn)[1]\r
+                title = os.path.splitext(file)[0]\r
+                title = unicode(title,'utf-8')\r
+                ext = os.path.splitext(file)[1]\r
+                if ext == ".b25":\r
+                    title=title.replace(".ts","")\r
+                dbs=rec10d.rec10db.select_by_name_time_timeline(title,tbtime,tbtime2)\r
+                if len(dbs)==0:\r
+                    proc=checkProcess(dir, title)\r
+                    chtxtt=rec10d.rec10db.select_chtxt_by_title_timeline_log(title)\r
+                    nchtxt=""\r
+                    if chtxtt!=None:\r
+                        nchtxt=chtxtt\r
+                    if proc=="b25":\r
+                        add.append([recdblist.REC_AUTO_SUGGEST_DECODE,title,nchtxt])\r
+                    elif proc=="ts":\r
+                        add.append([recdblist.REC_AUTO_SUGGEST_ENCODE,title,nchtxt])\r
+                    elif proc =="264":\r
+                        add.append([recdblist.REC_AUTO_SUGGEST_AVI2FP,title,nchtxt])\r
+                    #elif proc =="mp4":\r
+                    #    add.append([recdblist.REC_AUTO_SUGGEST_AP2FP,title,nchtxt])\r
+        #print add\r
+    if len(add)>0:\r
+        rec10d.rec10db.new_auto_proc()\r
+        for a in add:\r
+            rec10d.rec10db.add_auto_proc(a[0],a[1],a[2])\r
+        time.sleep(1)\r
+"""\r
+    処理がどの段階まで言ったのかを調査し返す。\r
+    return\r
+    recording\r
+    b25\r
+    b25decoding\r
+    tssplitting\r
+    ts\r
+    encoding\r
+    avi\r
+    mp4making\r
+    mp4\r
+"""\r
+def checkProcess(path,title):\r
+    path1 = os.path.join(path,title+".mkv")\r
+    if os.path.exists(path1):\r
+        if int(time.time()-os.path.getmtime(path1))>300:\r
+            return "mkv"\r
+        else:\r
+            return "mkvmaking"\r
+    elif os.path.exists(os.path.join(path,title+".mp4")):\r
+        if int(time.time()-os.path.getmtime(os.path.join(path,title+".mp4")))>300:\r
+            return "mp4"\r
+        else:\r
+            return "mp4making"\r
+    elif os.path.exists(os.path.join(path,title+".264")):\r
+        if int(time.time()-os.path.getmtime(os.path.join(path,title+".264")))>300:\r
+            return "264"\r
+        else:\r
+            return "encoding"\r
+    elif os.path.exists(os.path.join(path,title+".ts.log")):\r
+        if int(time.time()-os.path.getmtime(os.path.join(path,title+".ts")))<300:\r
+            return "encoding"\r
+        else:\r
+            return "ts"\r
+    elif os.path.exists(os.path.join(path,title+".ts")):\r
+        if int(time.time()-os.path.getmtime(os.path.join(path,title+".ts")))>300:\r
+            return "ts"\r
+        else:\r
+            return "tssplitting"\r
+    elif os.path.exists(os.path.join(path,title+".sa.avi")):\r
+        if int(time.time()-os.path.getmtime(os.path.join(path,title+".sa.avi")))>300:\r
+            return "ts"\r
+        else:\r
+            return "tssplitting"\r
+    elif os.path.exists(os.path.join(path,title+".ts.b25")):\r
+        if int(time.time()-os.path.getmtime(os.path.join(path,title+".ts.b25")))>300:\r
+            return "b25"\r
+        else:\r
+            return "recording"\r
+def update_all_timeline_epg():\r
+    now=datetime.datetime.now()\r
+    et=now+datetime.timedelta(days=7)\r
+    update_timeline_epg(now.strftime("%Y-%m-%d %H:%M:%S"), et.strftime("%Y-%m-%d %H:%M:%S"))\r
+def update_timeline_epg(btime,etime):\r
+    update_timeline_epg_schedule(btime,etime)\r
+    update_timeline_dup(btime,etime)\r
+def update_timeline_epg_schedule(btime,etime):\r
+    dbl=rec10d.rec10db.select_bytime_all_timeline(btime, etime)\r
+    #print dbl\r
+    for db in dbl:\r
+        ret=[]\r
+        #[chtxtt, title, btime, etime,exp,longexp,category]\r
+        if db['type']==recdblist.REC_KEYWORD or db['type']==recdblist.REC_KEYWORD_EVERY_SOME_DAYS:\r
+            ret=epgdb.searchTime(db['title'], db['btime'], db['deltatime'], db['chtxt'])\r
+            if len(ret)>4 and len(ret[2])>18:\r
+                rec10d.rec10db.update_epg_timeline(db['type'], db['chtxt'], db['title'], db['btime'], ret[2],ret[3],ret[1],ret[4],ret[6])\r
+                if not (db['btime'] == ret[2] and  db['etime']==ret[3]):\r
+                    rec10d.rec10db.update_status_change_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "1")\r
+                else:\r
+                    rec10d.rec10db.update_status_change_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "0")\r
+            else:\r
+                rec10d.rec10db.update_status_change_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "1")\r
+        elif db['type']==recdblist.REC_RESERVE or db['type']==recdblist.REC_FINAL_RESERVE :\r
+            ret=epgdb.searchTime(db['title'], db['btime'],"5", db['chtxt'])\r
+            if len(ret)>4 and len(ret[2])>18:\r
+                rec10d.rec10db.update_epg_timeline(db['type'], db['chtxt'], db['title'], db['btime'], ret[2],ret[3],ret[1],ret[4],ret[6])\r
+                if not (db['btime'] == ret[2] and  db['etime']==ret[3]):\r
+                    rec10d.rec10db.update_status_change_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "1")\r
+                else:\r
+                    rec10d.rec10db.update_status_change_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "0")\r
+            else:\r
+                rec10d.rec10db.update_status_change_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "1")\r
+def update_timeline_dup(epgbtime,epgetime):\r
+    dbl=rec10d.rec10db.select_byepgtime_all_timeline(epgbtime, epgetime)\r
+    for db in dbl:\r
+        if db['type']==recdblist.REC_KEYWORD or db['type']==recdblist.REC_KEYWORD_EVERY_SOME_DAYS:\r
+            dbn=epgdb.countEpgSchedule(db['epgbtime'], db['epgetime'])\r
+            try:\r
+                bctypet=chdb.searchCHFromChtxt(db['chtxt'])['bctype']\r
+                if bctypet.find("cs") > -1 or bctypet.find("bs") > -1 :\r
+                    if dbn[1]>status.getRecordingMax()[1]:\r
+                        rec10d.rec10db.update_status_dup_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "1")\r
+                    else:\r
+                        rec10d.rec10db.update_status_dup_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "0")\r
+                else:\r
+                    if dbn[0]>status.getRecordingMax()[0]:\r
+                        rec10d.rec10db.update_status_dup_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "1")\r
+                    else:\r
+                        rec10d.rec10db.update_status_dup_timeline(db['type'], db['chtxt'], db['title'], db['btime'], "0")\r
+            except:\r
+                ""\r
+def killDeadEncode(path):\r
+    rawlist = glob.glob(path + "/*.264")\r
+    for fn in rawlist:\r
+        if int(time.time()-os.path.getmtime(fn))>3000:\r
+            m2vpath=unicode(fn.replace(".264",".m2v"),'utf-8')\r
+            x264path=os.path.split(fn)[1]\r
+            folderpath=unicode(os.path.split(fn)[0],'utf-8')\r
+            x264path=re.sub("\\[","[",x264path)\r
+            x264path=re.sub("\[","\\\[",x264path)\r
+            x264path=re.sub("\\]","]",x264path)\r
+            x264path=re.sub("]","\\]",x264path)\r
+            tspath=unicode(x264path.replace(".264",".ts"),'utf-8')\r
+            m2vpath=unicode(x264path.replace(".264",".m2v"),'utf-8')\r
+            x264path=unicode(x264path,'utf-8')\r
+            os.environ['LANG']="ja_JP.UTF-8"\r
+            ktmp=[]\r
+            ktmp.append(u"ps auxww | grep \""+folderpath+"\" | grep \""+x264path+u"\" | egrep -v grep | egrep -v \"sh -c\" | grep x264 | awk '{print $2}'")\r
+            ktmp.append(u"ps auxww | grep \""+folderpath+"\" | grep \""+tspath+u"\" | egrep -v grep | egrep -v \"sh -c\" | grep mencoder | awk '{print $2}'")\r
+            ktmp.append(u"ps auxww | grep \""+folderpath+"\" | grep \""+m2vpath+u"\" | egrep -v grep | egrep -v \"sh -c\" | grep ffmpeg | awk '{print $2}'")\r
+            recdblist.printutf8(u"エンコード処理異常終了タスク終了")\r
+            for istr in ktmp:\r
+                recdblist.printutf8(istr)\r
+                ktmt=commands.getoutput(istr.encode('utf-8'))\r
+                #print ktmt\r
+                #print len(ktmt)\r
+                if len(ktmt)>0:\r
+                    #print ktmt\r
+                    if len(ktmt[0])>0:\r
+                        ktmt=ktmt[0]\r
+                    #print ktmt\r
+                try:\r
+                    if int(ktmt)>0:\r
+                        ktmp=u"kill -9 `"+istr+u"`"\r
+                        recdblist.printutf8(ktmp)\r
+                        #print ktmp\r
+                        os.system(ktmp.encode('utf-8'))\r
+                except:\r
+                    ""\r
+def deleteTmpFile(path,title,ext):\r
+    level= 0##0:b25 1:ts(del tsmix and ts.b25) 5:x264(del 2 and so on) 10:mp4/mkv\r
+    smsize= 0\r
+    if re.search(".ts",ext):\r
+        level= 1\r
+        smsize = 100*1000*1000\r
+    elif re.search(".264",ext):\r
+        level= 5\r
+        smsize = 10*1000*1000\r
+    elif re.search(".mp4",ext):\r
+        level = 10\r
+        smsize = 10*1000*1000\r
+    elif re.search(".mkv",ext):\r
+        level = 15\r
+        smsize = 10*1000*1000\r
+    dp=[]\r
+    if level > 0 :\r
+        if os.path.exists(os.path.join(path,title+".ts")) and os.path.exists(os.path.join(path,title+".ts.b25")):\r
+            if os.path.getsize(os.path.join(path,title+".ts"))*12>os.path.getsize(os.path.join(path,title+".ts.b25")):\r
+                dp.append(os.path.join(path,title+".ts.b25"))\r
+            elif os.path.getsize(os.path.join(path,title+".ts"))>200*1000*1000:\r
+                dp.append(os.path.join(path,title+".ts.b25"))\r
+    if level > 4 :\r
+        if configreader.getConfEnv("remove_ts")=="1":\r
+            dp.append(os.path.join(path,title+".ts"))\r
+    if level > 9 :\r
+        dp.append(os.path.join(path,title+".avi"))\r
+        dp.append(os.path.join(path,title+".264"))\r
+        dp.append(os.path.join(path,title+".120.avi"))\r
+        dp.append(os.path.join(path,title+".noodml.avi"))\r
+        dp.append(os.path.join(path,title+".aac"))\r
+        dp.append(os.path.join(path,title+".m2v"))\r
+        dp.append(os.path.join(path,title+"_1.aac"))\r
+        dp.append(os.path.join(path,title+"_2.aac"))\r
+        dp.append(os.path.join(path,title+"_1.mp3"))\r
+        dp.append(os.path.join(path,title+"_2.mp3"))\r
+        dp.append(os.path.join(path,title+".srt"))\r
+    if level > 14 :\r
+        dp.append(os.path.join(path,title+".mp4"))\r
+    if os.path.exists(os.path.join(path,title+ext)):\r
+        if os.path.getsize(os.path.join(path,title+ext))>smsize:\r
+            for ip in dp:\r
+                try:\r
+                    os.remove(ip)\r
+                except:\r
+                    ""\r