OSDN Git Service

stop using trunk directory in rectool
[rec10/rec10-git.git] / rec10 / branches / 0.9.0 / src / guess.py
1 #!/usr/bin/python
2 # coding: UTF-8
3 # Rec10 TS Recording Tools
4 # Copyright (C) 2009 Yukikaze
5
6 import os
7 import re
8 import time
9 import os
10 import datetime
11 import n_gram
12 import zenhan
13
14 def detName(title,path):
15     tt=detNameType(title, path)
16     if tt['type']=="C"or tt['type']=="D":
17         tt['num']=detNum(tt['title'],tt['folder'])
18 def detNum(title,movepath):
19     """
20         #
21     """
22     files=os.listdir(movepath)
23     ff=[]
24     maxnum=0
25     for file in files:
26         print file
27         file=os.path.join(movepath,file)
28         if os.path.isfile(file):
29             name=os.path.splitext(os.path.split(file)[1])
30             name=name[0]
31             name=zenhan.toHankaku(unicode(name))
32             p1=detNameType(name,movepath)
33             print p1['title']+" "+str(p1['num'])
34             time1=time.localtime(os.path.getmtime(file))
35             time1=datetime.datetime.fromtimestamp(os.path.getmtime(file))
36             if p1['num']!=-1:
37                 ff.append([p1['num'],p1['title'],time1])
38                 if maxnum<p1['num']+1:
39                     maxnum=p1['num']+1
40     detMultiDeltaDays(ff)
41 def detMultiDeltaDays(num_with_title_with_dates):
42     maxnum=0
43     for ft in num_with_title_with_dates:
44         if maxnum<ft[0]+1:
45             maxnum=ft[0]+1
46     ff=num_with_title_with_dates
47     f3=[None]*maxnum
48     fret={}
49     for i in range(0, maxnum, 1):
50         f3[i]=[]
51     for f2 in ff:
52         f3[f2[0]].append(f2)
53     for i in range(maxnum):
54         for j in range(i+1,maxnum,1):
55             for ft3 in f3[i]:
56                 for ft4 in f3[j]:
57                     for gdd in detSingleDeltaDay(i, ft3[2], j, ft4[2]):
58                         print gdd
59                         if fret.get(gdd[0])!=None:
60                             print fret
61                             fret[gdd[0]]=fret[gdd[0]]+gdd[1]
62                         else:
63                             fret[gdd[0]]=gdd[1]
64     print fret
65     maxk=0
66     maxp=0
67     for i in range(maxnum):
68         if fret.get(i)!=None:
69             if maxp<fret[i]:
70                 maxk=i
71                 maxp=fret[i]
72     print maxk
73     print maxp
74     return maxk
75 def detSingleDeltaDay(num1,date1,num2,date2):
76     dd=date1-date2
77     if date1<date2:
78         dd=date2-date1
79     dn=dd.days
80     d=num2-num1
81     if d<0:
82         d=-1*d
83     dp=dd+datetime.timedelta(hours=6)
84     dp=dp.days
85     dm=dd-datetime.timedelta(hours=6)
86     dm=dm.days
87     ret=[]
88     if dn%d*2>d:
89         dn=dn+d
90     if dm%d*2>d:
91         dm=dm+d
92     if dp%d*2>d:
93         dp=dp+d
94     print str(d)+":"+str(dn)
95     if dp!=dn:
96         ret.append([dn/d,60])
97         ret.append([dp/d,40])
98     elif dm!=dn:
99         ret.append([dn/d,60])
100         ret.append([dm/d,40])
101     else:
102         ret.append([dn/d,100])
103     return ret
104 def detNameType(title,path):
105     """
106     type A ---title#<number>
107     type B ---title#<number>subtitle
108     type C ---title subtitle
109     type D ---title(without number)
110     type Aj ---title第<number>話
111     path --search reflexively
112     """
113     print title
114     #rA=re.compile(".+(?P<title>)#\d(?P<num>)\s[0,10]\z")
115     rA=re.compile("(.+)#(\d*)\s*\Z")
116     tA=rA.match(title)
117     rB=re.compile("(.+)#(\d*)\s*(\D*)")
118     tB=rB.match(title)
119     rAj=re.compile("(.+)第(\d*)話\s*\Z")
120     tAj=rAj.match(title)
121     ret={'title':"",'type':"",'num':0,'subtitle':"",'folder':""}
122     if tA:
123         print "typeA"
124         print "title="+tA.group(1)
125         print "num="+tA.group(2)
126         ret['type']="A"
127         ret['title']=tA.group(1)
128         ret['num']=int(tA.group(2))
129         ret['folder']=searchFolder(tA.group(1),path)
130     if tAj:
131         print "typeA"
132         print "title="+tAj.group(1)
133         print "num="+tAj.group(2)
134         ret['type']="Aj"
135         ret['title']=tAj.group(1)
136         ret['num']=int(tAj.group(2))
137         ret['folder']=searchFolder(tAj.group(1),path)
138     elif tB:
139         print "typeB"
140         print "title="+tB.group(1)
141         print "num="+tB.group(2)
142         print "subtitle="+tB.group(3)
143         ret['type']="B"
144         ret['title']=tB.group(1)
145         ret['num']=int(tB.group(2))
146         ret['folder']=searchFolder(tB.group(1),path)
147         ret['subtitle']=tB.group(3)
148     else:#type C or type D
149         #fold=searchFolder(title, path)
150         ts=title.split(" ")
151         tt=""
152         rt=["",0,""]
153         for t in ts:
154             tt=tt+" "+t
155             ft1=searchFolder(tt,path)
156             print tt
157             print ft1
158             if ft1!="":
159                 #print rt
160                 #print ft1[0]+" : "+str(ft1[1])
161                 if ft1[1]>rt[1]:
162                     rt[0]=tt
163                     rt[1]=ft1[1]
164                     rt[2]=ft1[0]
165                     #print rt
166         #print "title="+rt[0][1:]+"/"
167         #print "subtitle = "+title.replace(rt[0][1:],"")[1:]
168         ret['title']=rt[0][1:]
169         ret['num']=-1
170         ret['folder']=rt[2]
171         ret['subtitle']=title.replace(rt[0][1:],"")[1:]
172         if ret['subtitle'].replace(" ","")=="":
173             ret['type']="D"
174         else:
175             ret['type']="C"
176     return ret
177 def searchFolder(title,path):
178     """
179     titleからフォルダーを探す
180     """
181     folderpath=os.listdir(path)
182     lfpath=[]
183     ngram=[]
184     for ft in folderpath:
185         fullpath=os.path.join(path, ft)
186         if os.path.isdir(fullpath):
187             lfpath.append(fullpath)
188             ftt=os.listdir(fullpath)
189             if len(ftt)>0:
190                 for ft2 in ftt:
191                     folderpath.append(os.path.join(fullpath, ft2))
192         else:
193             lfpath.append(fullpath)
194     for dirp in lfpath:
195         cmpp=""
196         appp=""
197         if os.path.isdir(dirp):
198             cmpp=os.path.dirname(dirp)
199             appp=dirp
200         else:
201             cmpp=os.path.basename(dirp)
202             appp=os.path.dirname(dirp)
203         p=n_gram.trigram(title.decode("utf-8"),cmpp.decode("utf-8"))
204         if p>0:
205             ngram.append((p,appp))
206     ngram=list(set(ngram))
207     ngram.sort()
208     ngram.reverse()
209     if len(ngram)>0:
210         #print title + ngram[0][1] + " : "+str(ngram[0][0])
211         if ngram[0][0]>300:
212             return [ngram[0][1],ngram[0][0]]
213         else:
214             return ""
215     else:
216         return ""