OSDN Git Service

fix many bugs.
[rec10/rec10-git.git] / rec10 / trunk / src / classify.py
1 #!/usr/bin/python
2 # coding: UTF-8
3 # Rec10 TS Recording Tools
4 # Copyright (C) 2009 Yukikaze
5
6 __author__="yukikaze"
7 __date__ ="$2009/09/14 17:38:25$"
8
9 import glob
10 import n_gram
11 import os
12 import os.path
13 import re
14 import time
15 import optparse
16 import sys
17 import shutil
18
19 import configreader
20 recordedpath=configreader.getpath("recorded")
21 recpath=configreader.getpath("recpath")
22 def search_b25(path):
23     """
24     録画フォルダを検索し、各QUEの実行状況を表示する
25     """
26     b25list = glob.glob(path + "/*.b25")
27     for b25f in b25list:
28         ##b25f is title.ts.b25  avi is title.avi
29         dir = os.path.split(b25f)[0]
30         title = os.path.split(b25f)[1]
31         title = title.replace(".ts.b25", "")
32         avipath = os.path.join(dir, title + ".avi")
33         mkvpath = os.path.join(dir, title + ".mkv")
34         tspath = os.path.join(dir, title + ".ts")
35         b25f = b25f.replace(".ts.b25", ".avi")
36         mode = "ts"
37         if os.path.isfile(tspath):##tsファイルが存在している
38             dtime = time.time()-os.path.getmtime(tspath)
39             dtime = int(dtime)
40             if dtime > 120:
41                 if os.path.getsize(tspath) > 1 * 1000 * 1000:##最終更新から22分以上経過かつ1MB以上
42                     mode = "avi"
43                 else:
44                     mode = "tsmiss"
45             else:
46                 mode = "ts"
47         if os.path.isfile(mkvpath):##tsファイルが存在している
48             dtime = time.time()-os.path.getmtime(mkvpath)
49             dtime = int(dtime)
50             if dtime > 120:
51                 if os.path.getsize(avipath) > 1 * 1000 * 1000:##最終更新から22分以上経過かつ1MB以上
52                     mode = "fin"
53                 else:
54                     mode = "avimiss"
55             else:
56                 mode = "avi"
57         print title + ":" + mode
58 def search_avi(temppath,recpath):
59     """
60     録画一時フォルダ内のaviファイルを検索
61     """
62     avilist = glob.glob(temppath + "/*.avi")
63     ret=[]
64     for avif in avilist:
65         ##b25f is title.ts.b25  avi is title.avi
66         dir = os.path.split(avif)[0]
67         title = os.path.split(avif)[1]
68         title = title.replace(".avi", "")
69         avipath = os.path.join(dir, title + ".avi")
70         dtime = time.time()-os.path.getmtime(avipath)
71         dtime = int(dtime)
72         if dtime > 300:
73             if veryfySize(avipath):
74                 ret.append(title)
75     return ret
76 def search_mkv(temppath,recpath):
77     """
78     録画一時フォルダ内mkvファイルを検索
79     """
80     avilist = glob.glob(temppath + "/*.mkv")
81     ret=[]
82     for avif in avilist:
83         ##b25f is title.ts.b25  avi is title.avi
84         dir = os.path.split(avif)[0]
85         title = os.path.split(avif)[1]
86         title = title.replace(".mkv", "")
87         avipath = os.path.join(dir, title + ".mkv")
88         dtime = time.time()-os.path.getmtime(avipath)
89         dtime = int(dtime)
90         if dtime > 300:
91             if veryfySize(avipath):
92                 ret.append(title)
93     return ret
94
95 def veryfySize(path):
96     #vsize=[297,497,596,1196]#SD 30m 1h 1.5h 2h
97     vsize=[245,275,295,591,830]
98     vsize=vsize+[325,560,590,602,690,860]
99     #vsize=vsize+[458,916]#HD 30m 1h
100     #vsize=vsize+[381,895,447]
101     ret = 0
102     for size in vsize:
103         if os.path.getsize(path)>(size-10)*1024*1024 and os.path.getsize(path)<(size+10)*1024*1024:
104             ret=1
105     return ret
106 def searchFolder(title,path):
107     """
108     titleにマッチするフォルダを探し出す。
109     """
110     folderpath=os.listdir(path)
111     lfpath=[]
112     ngram=[]
113     for ft in folderpath:
114         fullpath=os.path.join(path, ft)
115         if os.path.isdir(fullpath):
116             lfpath.append(fullpath)
117             ftt=os.listdir(fullpath)
118             if len(ftt)>0:
119                 for ft2 in ftt:
120                     folderpath.append(os.path.join(fullpath, ft2))
121         else:
122             lfpath.append(fullpath)
123     for dirp in lfpath:
124         cmpp=""
125         appp=""
126         if os.path.isdir(dirp):
127             cmpp=os.path.dirname(dirp)
128             appp=dirp
129         else:
130             cmpp=os.path.basename(dirp)
131             appp=os.path.dirname(dirp)
132         p=n_gram.trigram(title.decode("utf-8"),cmpp.decode("utf-8"))
133         if p>0:
134             ngram.append((p,appp))
135     ngram=list(set(ngram))
136     ngram.sort()
137     ngram.reverse()
138     if len(ngram)>0:
139         #print title + ngram[0][1] + " : "+str(ngram[0][0])
140         if ngram[0][0]>400:
141             return ngram[0][1]
142         else:
143             return ""
144     else:
145         return ""
146 def execMove(title,temppath,recpath):
147     srcpath=os.path.join(temppath,title+".mkv")
148     #desttitle=destName(title, temppath, recpath)
149     
150     sf=searchFolder(title, recpath)
151     if sf!="":
152         destpath=os.path.join(sf,destNameMKV(title, temppath, sf)+".mkv")
153         #os.path.join(sf,desttitle+".mkv")
154         #print srcpath
155         #print destpath
156         print "moving now.."
157         print srcpath+" : "+destpath
158         shutil.move(srcpath, destpath)
159         #shutil.copy(srcpath, destpath)
160         delpath=[os.path.join(temppath,title+".ts")]
161         delpath.append(os.path.join(temppath,title+".avi"))
162         delpath.append(os.path.join(temppath,title+".ts.b25"))
163         delpath.append(os.path.join(temppath,title+".ts.tsmix"))
164         delpath.append(os.path.join(temppath,title+".ts.log"))
165         delpath.append(os.path.join(temppath,title+".sa.avi"))
166         delpath.append(os.path.join(temppath,title+".sa.avi.log"))
167         delpath.append(os.path.join(temppath,title+".log"))
168         for dp in delpath:
169             try:
170                 os.remove(dp)
171                 ""
172             except:
173                 ""
174 def destName(title,temppath,recpath):
175     """
176     titleから移動先に作るべきファイル名を作り出す。
177     """
178     dstpath=os.path.join(recpath,title+".avi")
179     srcpath=os.path.join(temppath,title+".avi")
180     if os.path.exists(dstpath):
181         gmtime=time.gmtime(os.path.getmtime(srcpath))
182         times=time.strftime("%y%m%d",gmtime)
183         title=title+"_"+times
184     return title
185 def destNameMKV(title,temppath,recpath):
186     """
187     titleから移動先に作るべきファイル名を作り出す。
188     """
189     dstpath=os.path.join(recpath,title+".mkv")
190     srcpath=os.path.join(temppath,title+".mkv")
191     if os.path.exists(dstpath):
192         gmtime=time.gmtime(os.path.getmtime(srcpath))
193         times=time.strftime("%y%m%d",gmtime)
194         title=title+"_"+times
195     return title
196
197 def detName(path,title):
198     """
199     type A ---title#<number>
200     type B ---title#<number>subtitle
201     type C ---title subtitle
202     type D ---title(without number)
203     """
204     #if re.match("#\d\s[0,10]\z|#[0-9]\s[0,10]\z", title)
205     #    print "typeA"
206     #elif re.match("#\d\s[0,10].|#[0-9]\s[0,10].", title)
207     #    print "typeB"
208
209 def detNameType(title):
210     """
211     type A ---title#<number>
212     type B ---title#<number>subtitle
213     type C ---title subtitle
214     type D ---title(without number)
215     """
216     print title
217     #rA=re.compile(".+(?P<title>)#\d(?P<num>)\s[0,10]\z")
218     rA=re.compile("(.+)#(\d*)\s*\Z")
219     tA=rA.match(title)
220     rB=re.compile("(.+)#(\d*)\s*(\D*)")
221     tB=rB.match(title)
222     if tA:
223         print "typeA"
224         print "title="+tA.group(1)
225         print "num="+tA.group(2)
226     elif tB:
227         print "typeB"
228         print "title="+tB.group(1)
229         print "num="+tB.group(2)
230         print "subtitle="+tB.group(3)
231 if __name__ == "__main__":
232     usage="usage: %prog read -h"
233     version="%prog 0.7.0beta1"
234     parser=optparse.OptionParser(usage=usage,version=version)
235     parser.add_option("-s","--search",action="store",type="string",dest="ltitle",default="",metavar="TITLE",help="test to search where the title should be contained(test for -e)")
236     parser.add_option("-A","--Auto",action="store_true",dest="auto",default=False,help="auto classifying mode(not a test)")
237     parser.add_option("-e","--exec",action="store",type="string",dest="etitle",default="",metavar="TITLE",help="exec move(not a test)")
238     parser.add_option("-l","--list",action="store_true",dest="list",default=False,help="File listing mode(test for -a)")
239     (opts,args)=parser.parse_args(sys.argv)
240     if opts.ltitle!="":
241         sf=searchFolder(opts.ltitle, recordedpath)
242         print os.path.join(sf, destNameMKV(opts.ltitle,recpath,sf)+".mkv")
243     elif opts.auto:
244         sa=search_mkv(recpath, recordedpath)
245         for t in sa:
246             print "自動推測実行中"
247             sf=searchFolder(t,recordedpath)
248             if sf!="":
249                 print "移動先"
250                 print t+" : "+os.path.join(sf, destNameMKV(t, recpath,sf)+".mkv")
251                 print "実行中"
252                 execMove(t, recpath, recordedpath)
253             else:
254                 print t+" can't find matching folder."
255     elif opts.list:
256         sa=search_mkv(recpath, recordedpath)
257         for t in sa:
258             sf=searchFolder(t,recordedpath)
259             if sf!="":
260                 print t+" : "+os.path.join(sf, destNameMKV(t, recpath,sf)+".mkv")
261     elif opts.etitle!="":
262         execMove(opts.etitle,recpath, recordedpath)
263