OSDN Git Service

implement new ts copy mode.
[rec10/rec10-git.git] / rec10 / trunk / src / auto_move.py
1 import shutil
2 #!/usr/bin/python
3 # coding: UTF-8
4 # Rec10 TS Recording Tools
5 # Copyright (C) 2009-2010 Yukikaze
6
7 import glob
8 import os
9 import os.path
10 import re
11 import time
12
13 import n_gram
14 import recdblist
15 def getTitle(title):
16     rT=re.compile("(.+)_(\d+)\Z")
17     tT=rT.match(title)
18     rT2=re.compile("(.+)_(.+)_(\d*)\Z")#_(aichi)_2010-02-06T01:59:00.mkv
19     tT2=rT2.match(title)
20     rT3=re.compile("(.+)_(.+)_\d+-\d+-\d+T\d+:\d+:\d+\Z")#_(aichi)_2010-02-06T01:59:00.mkv
21     tT3=rT3.match(title)
22     rT4=re.compile("(.+)_(.+)_\d+-\d+-\d+T\d+-\d+-\d+\Z")#_(aichi)_2010-02-06T01-59-00.mkv
23     tT4=rT4.match(title)
24     rT5=re.compile("(.+)_(.+)_(.+)\Z")#_(aichi)_2010-02-06T01-59-00.mkv
25     tT5=rT5.match(title)
26     ntitle=title
27     if tT :
28         ntitle=tT.group(1)
29     elif tT2:
30         ntitle=tT2.group(1)
31     elif tT3:
32         ntitle=tT3.group(1)
33     elif tT4:
34         ntitle=tT4.group(1)
35     elif tT5:
36         ntitle=tT5.group(1)
37     return ntitle
38 def detNameType(title):
39     """
40     type A ---title#<number>
41     type B ---title#<number>subtitle
42     type C ---title subtitle
43     type D ---title(without number)
44     """
45     recdblist.printutf8(title)
46     #rA=re.compile(".+(?P<title>)#\d(?P<num>)\s[0,10]\z")
47     rA=re.compile("(.+)#(\d*)\s*\Z")
48     tA=rA.match(title)
49     rB=re.compile("(.+)#(\d*)\s*(\D*)")
50     tB=rB.match(title)
51     if tA:
52         recdblist.printutf8("typeA")
53         recdblist.printutf8("title="+tA.group(1))
54         recdblist.printutf8("num="+tA.group(2))
55     elif tB:
56         recdblist.printutf8("typeB")
57         recdblist.printutf8("title="+tB.group(1))
58         recdblist.printutf8("num="+tB.group(2))
59         recdblist.printutf8("subtitle="+tB.group(3))
60 def search_file(temppath,recpath,ext):
61     """
62     録画一時フォルダ内mkvファイルを検索
63     """
64     avilist = glob.glob(temppath + "/*"+ext)
65     ret=[]
66     for avif in avilist:
67         ##b25f is title.ts.b25  avi is title.avi
68         dir = os.path.split(avif)[0]
69         title = os.path.split(avif)[1]
70         title = title.replace(ext, "")
71         avipath = os.path.join(dir, title + ext)
72         dtime = time.time()-os.path.getmtime(avipath)
73         dtime = int(dtime)
74         if dtime > 300:
75             if veryfySize(avipath):
76                 ret.append(title)
77     return ret
78 def get_move_dest_path(title,temppath,recpath,ext):
79     dstpath=os.path.join(recpath,title+ext)
80     srcpath=os.path.join(temppath,title+ext)
81     if os.path.exists(dstpath):
82         gmtime=time.gmtime(os.path.getmtime(srcpath))
83         iff=""
84         try:
85             iff=u"("+configreader.getenv("iff")+u")_"
86             if iff==u"()_":
87                 iff = u""
88         except:
89             iff=""
90         title=title+u"_"+iff+time.strftime("%Y-%m-%dT%H-%M-%S",gmtime)
91     return title
92 def get_delpath(temppath,title):
93     delpath=[os.path.join(temppath,title+".ts")]
94     delpath.append(os.path.join(temppath,title+".avi"))
95     delpath.append(os.path.join(temppath,title+".mp4"))
96     delpath.append(os.path.join(temppath,title+".m2v"))
97     delpath.append(os.path.join(temppath,title+".mkv"))
98     delpath.append(os.path.join(temppath,title+".120.avi"))
99     delpath.append(os.path.join(temppath,title+".timecode.txt"))
100     delpath.append(os.path.join(temppath,title+".aac"))
101     delpath.append(os.path.join(temppath,title+".ts.b25"))
102     delpath.append(os.path.join(temppath,title+".ts.tsmix"))
103     delpath.append(os.path.join(temppath,title+".ts.log"))
104     delpath.append(os.path.join(temppath,title+".sa.avi"))
105     delpath.append(os.path.join(temppath,title+".sa.avi.log"))
106     delpath.append(os.path.join(temppath,title+".log"))
107     return delpath
108 def veryfySize(path):
109     #vsize=[297,497,596,1196]#SD 30m 1h 1.5h 2h
110     vsize=[245,275,295,591,830]
111     vsize=vsize+[325,449,560,590,602,690,805,860,1014,1138,1237]
112     vsize=vsize+[261,535,540,616,740]#HD 30m 1h
113     #vsize=vsize+[381,895,447]
114     ret = 0
115     for size in vsize:
116         if os.path.getsize(path)>(size-10)*1024*1024 and os.path.getsize(path)<(size+10)*1024*1024:
117             ret=1
118     if os.path.getsize(path)>270*1024*1024:
119         ret=1
120     return ret
121 def searchFolder(title,path,threshold=500):
122     """
123     titleにマッチするフォルダを探し出す。
124     """
125     folderpath=os.listdir(path)
126     lfpath=[]
127     ngram=[]
128     for ft in folderpath:
129         fullpath=os.path.join(path.encode('utf-8'), ft)
130         if os.path.isdir(fullpath):
131             lfpath.append(fullpath)
132             ftt=os.listdir(fullpath)
133             if len(ftt)>0:
134                 for ft2 in ftt:
135                     try:
136                         folderpath.append(os.path.join(fullpath, ft2))
137                     except Exception, inst:
138                         #print type(inst)
139                         #print inst
140                         ""
141         else:
142             lfpath.append(fullpath)
143     for dirp in lfpath:
144         cmpp=""
145         appp=""
146         ntitle=title
147         if os.path.isdir(dirp):
148             cmpp=os.path.dirname(dirp)
149             appp=dirp
150         else:
151             cmpp=os.path.basename(dirp)
152             appp=os.path.dirname(dirp)
153         ntitle=getTitle(title)
154         #recdblist.printutf8(cmpp)
155         cmpp=getTitle(os.path.splitext(cmpp)[0])
156         #recdblist.printutf8(cmpp+"\n")
157         p=n_gram.trigram(ntitle,cmpp)
158         if p>0:
159             ngram.append((p,appp))
160     ngram=list(set(ngram))
161     ngram.sort()
162     ngram.reverse()
163     if len(ngram)>0:
164         #recdblist.printutf8(title + ngram[0][1] + " : "+str(ngram[0][0]))
165         if ngram[0][0]>threshold:
166             return ngram[0][1]
167         else:
168             return ""
169     else:
170         return ""
171 def execMove(title,temppath,recpath,ext,autodel):
172     srcpath=os.path.join(temppath,title+ext)
173     #desttitle=destName(title, temppath, recpath)
174
175     sf=searchFolder(title, recpath)
176     if sf!="":
177         destpath=os.path.join(sf,destNameMKV(title, temppath, sf)+ext)
178         recdblist.printutf8("moving now..")
179         recdblist.printutf8(srcpath+" : "+destpath)
180         print srcpath
181         shutil.copy(srcpath, destpath)
182         #shutil.copy(srcpath, destpath)
183         if autodel==1:
184             delpath=get_delpath(temppath, title)
185             for dp in delpath:
186                 try:
187                     os.remove(dp)
188                     ""
189                 except:
190                     ""