OSDN Git Service

not to use sys.defaultencoding() (beta.)
[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         mp4path = os.path.join(dir, title + ".mp4")
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(mp4path):##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 def search_mp4(temppath,recpath):
95     """
96     録画一時フォルダ内mp4ファイルを検索
97     """
98     avilist = glob.glob(temppath + "/*.mp4")
99     ret=[]
100     for avif in avilist:
101         ##b25f is title.ts.b25  avi is title.avi
102         dir = os.path.split(avif)[0]
103         title = os.path.split(avif)[1]
104         title = title.replace(".mp4", "")
105         avipath = os.path.join(dir, title + ".mp4")
106         dtime = time.time()-os.path.getmtime(avipath)
107         dtime = int(dtime)
108         if dtime > 300:
109             if veryfySize(avipath):
110                 ret.append(title)
111     return ret
112 def veryfySize(path):
113     #vsize=[297,497,596,1196]#SD 30m 1h 1.5h 2h
114     vsize=[245,275,295,591,830]
115     vsize=vsize+[325,560,590,602,690,860]
116     #vsize=vsize+[458,916]#HD 30m 1h
117     #vsize=vsize+[381,895,447]
118     ret = 0
119     for size in vsize:
120         if os.path.getsize(path)>(size-10)*1024*1024 and os.path.getsize(path)<(size+10)*1024*1024:
121             ret=1
122     return ret
123 def searchFolder(title,path):
124     """
125     titleにマッチするフォルダを探し出す。
126     """
127     folderpath=os.listdir(path)
128     lfpath=[]
129     ngram=[]
130     for ft in folderpath:
131         fullpath=os.path.join(path, ft)
132         if os.path.isdir(fullpath):
133             lfpath.append(fullpath)
134             ftt=os.listdir(fullpath)
135             if len(ftt)>0:
136                 for ft2 in ftt:
137                     folderpath.append(os.path.join(fullpath, ft2))
138         else:
139             lfpath.append(fullpath)
140     for dirp in lfpath:
141         cmpp=""
142         appp=""
143         if os.path.isdir(dirp):
144             cmpp=os.path.dirname(dirp)
145             appp=dirp
146         else:
147             cmpp=os.path.basename(dirp)
148             appp=os.path.dirname(dirp)
149         p=n_gram.trigram(title.decode("utf-8"),cmpp.decode("utf-8"))
150         if p>0:
151             ngram.append((p,appp))
152     ngram=list(set(ngram))
153     ngram.sort()
154     ngram.reverse()
155     if len(ngram)>0:
156         #print title + ngram[0][1] + " : "+str(ngram[0][0])
157         if ngram[0][0]>400:
158             return ngram[0][1]
159         else:
160             return ""
161     else:
162         return ""
163 def execMove(title,temppath,recpath):
164     srcpath=os.path.join(temppath,title+".mp4")
165     #desttitle=destName(title, temppath, recpath)
166     
167     sf=searchFolder(title, recpath)
168     if sf!="":
169         destpath=os.path.join(sf,destNameMP4(title, temppath, sf)+".mp4")
170         #os.path.join(sf,desttitle+".mkv")
171         #print srcpath
172         #print destpath
173         print "moving now.."
174         print srcpath+" : "+destpath
175         shutil.move(srcpath, destpath)
176         #shutil.copy(srcpath, destpath)
177         delpath=[os.path.join(temppath,title+".ts")]
178         delpath.append(os.path.join(temppath,title+".avi"))
179         delpath.append(os.path.join(temppath,title+".ts.b25"))
180         delpath.append(os.path.join(temppath,title+".ts.tsmix"))
181         delpath.append(os.path.join(temppath,title+".ts.log"))
182         delpath.append(os.path.join(temppath,title+".sa.avi"))
183         delpath.append(os.path.join(temppath,title+".sa.avi.log"))
184         delpath.append(os.path.join(temppath,title+".log"))
185         for dp in delpath:
186             try:
187                 os.remove(dp)
188                 ""
189             except:
190                 ""
191 def destName(title,temppath,recpath):
192     """
193     titleから移動先に作るべきファイル名を作り出す。
194     """
195     dstpath=os.path.join(recpath,title+".avi")
196     srcpath=os.path.join(temppath,title+".avi")
197     if os.path.exists(dstpath):
198         gmtime=time.gmtime(os.path.getmtime(srcpath))
199         times=time.strftime("%y%m%d",gmtime)
200         title=title+"_"+times
201     return title
202 def destNameMKV(title,temppath,recpath):
203     """
204     titleから移動先に作るべきファイル名を作り出す。
205     """
206     dstpath=os.path.join(recpath,title+".mkv")
207     srcpath=os.path.join(temppath,title+".mkv")
208     if os.path.exists(dstpath):
209         gmtime=time.gmtime(os.path.getmtime(srcpath))
210         times=time.strftime("%y%m%d",gmtime)
211         title=title+"_"+times
212     return title
213 def destNameMP4(title,temppath,recpath):
214     """
215     titleから移動先に作るべきファイル名を作り出す。
216     """
217     dstpath=os.path.join(recpath,title+".mp4")
218     srcpath=os.path.join(temppath,title+".mp4")
219     if os.path.exists(dstpath):
220         gmtime=time.gmtime(os.path.getmtime(srcpath))
221         times=time.strftime("%y%m%d",gmtime)
222         title=title+"_"+times
223     return title
224 def detName(path,title):
225     """
226     type A ---title#<number>
227     type B ---title#<number>subtitle
228     type C ---title subtitle
229     type D ---title(without number)
230     """
231     #if re.match("#\d\s[0,10]\z|#[0-9]\s[0,10]\z", title)
232     #    print "typeA"
233     #elif re.match("#\d\s[0,10].|#[0-9]\s[0,10].", title)
234     #    print "typeB"
235
236 def detNameType(title):
237     """
238     type A ---title#<number>
239     type B ---title#<number>subtitle
240     type C ---title subtitle
241     type D ---title(without number)
242     """
243     print title
244     #rA=re.compile(".+(?P<title>)#\d(?P<num>)\s[0,10]\z")
245     rA=re.compile("(.+)#(\d*)\s*\Z")
246     tA=rA.match(title)
247     rB=re.compile("(.+)#(\d*)\s*(\D*)")
248     tB=rB.match(title)
249     if tA:
250         print "typeA"
251         print "title="+tA.group(1)
252         print "num="+tA.group(2)
253     elif tB:
254         print "typeB"
255         print "title="+tB.group(1)
256         print "num="+tB.group(2)
257         print "subtitle="+tB.group(3)
258 if __name__ == "__main__":
259     usage="usage: %prog read -h"
260     version="%prog 0.7.0beta1"
261     parser=optparse.OptionParser(usage=usage,version=version)
262     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)")
263     parser.add_option("-A","--Auto",action="store_true",dest="auto",default=False,help="auto classifying mode(not a test)")
264     parser.add_option("-e","--exec",action="store",type="string",dest="etitle",default="",metavar="TITLE",help="exec move(not a test)")
265     parser.add_option("-l","--list",action="store_true",dest="list",default=False,help="File listing mode(test for -a)")
266     (opts,args)=parser.parse_args(sys.argv)
267     if opts.ltitle!="":
268         sf=searchFolder(opts.ltitle, recordedpath)
269         print os.path.join(sf, destNameMKV(opts.ltitle,recpath,sf)+".mp4")
270     elif opts.auto:
271         sa=search_mp4(recpath, recordedpath)
272         for t in sa:
273             print u"自動推測実行中"
274             sf=searchFolder(t,recordedpath)
275             if sf!="":
276                 print u"移動先"
277                 print t+" : "+os.path.join(sf, destNameMP4(t, recpath,sf)+".mp4")
278                 print u"実行中"
279                 execMove(t, recpath, recordedpath)
280             else:
281                 print t+" can't find matching folder."
282     elif opts.list:
283         sa=search_mp4(recpath, recordedpath)
284         for t in sa:
285             sf=searchFolder(t,recordedpath)
286             if sf!="":
287                 print t+" : "+os.path.join(sf, destNameMP4(t, recpath,sf)+".mp4")
288     elif opts.etitle!="":
289         execMove(opts.etitle,recpath, recordedpath)
290