--- /dev/null
+#!/usr/bin/python
+# coding: UTF-8
+# Rec10 TS Recording Tools
+# Copyright (C) 2009-2011 Yukikaze
+
+import os
+import os.path
+import re
+import time
+import os
+import datetime
+import n_gram
+import recdblist
+import zenhan
+import auto_move
+
+def detSeriesNum(execpath):
+ files=os.listdir(execpath)
+ ss={}
+ for file in files:
+ ftitle=os.path.splitext(file)
+ fname=ftitle[0]
+ fname=zenhan.toHankaku(unicode(fname,"utf-8"))
+ nt=detNameType(fname, execpath)
+ st=nt['title']
+ if not ss.has_key(st):
+ ss[st]={}
+ ss[st][nt['num']]=ftitle
+ print ss
+ return ss
+def detDeltaNum(title,movepath):
+ """
+ #番組の話数を推測する。
+ """
+ files=os.listdir(movepath)
+ ff=[]
+ maxnum=0
+ for file in files:
+ recdblist.printutf8(unicode(file,'utf-8'),verbose_level=800)
+ file=os.path.join(movepath,file)
+ if os.path.isfile(file):
+ name=os.path.splitext(os.path.split(file)[1])
+ name=name[0]
+ name=zenhan.toHankaku(unicode(name,'utf-8'))
+ p1=detNameType(name,movepath)
+ #recdblist.printutf8(p1['title']+" "+str(p1['num']))
+ time1=time.localtime(os.path.getmtime(file))
+ time1=datetime.datetime.fromtimestamp(os.path.getmtime(file))
+ if p1['num']!=-1:
+ ff.append([p1['num'],p1['title'],time1])
+ if maxnum<p1['num']+1:
+ maxnum=p1['num']+1
+ return detMultiDeltaDays(ff)
+def detMultiDeltaDays(num_with_title_with_dates):
+ maxnum=0
+ for ft in num_with_title_with_dates:
+ if maxnum<ft[0]+1:
+ maxnum=ft[0]+1
+ ff=num_with_title_with_dates
+ f3=[None]*maxnum
+ fret={}
+ for i in range(0, maxnum, 1):
+ f3[i]=[]
+ for f2 in ff:
+ f3[f2[0]].append(f2)
+ for i in range(maxnum):
+ for j in range(i+1,maxnum,1):
+ for ft3 in f3[i]:
+ for ft4 in f3[j]:
+ for gdd in detSingleDeltaDay(i, ft3[2], j, ft4[2]):
+ #print gdd
+ if fret.get(gdd[0])!=None:
+ #print fret
+ fret[gdd[0]]=fret[gdd[0]]+gdd[1]
+ else:
+ fret[gdd[0]]=gdd[1]
+ #print fret
+ maxk=0
+ maxp=0
+ for i in range(maxnum):
+ if fret.get(i)!=None:
+ if maxp<fret[i]:
+ maxk=i
+ maxp=fret[i]
+ #print maxk
+ #print maxp
+ return maxk
+def detSingleDeltaDay(num1,date1,num2,date2):
+ dd=date1-date2
+ if date1<date2:
+ dd=date2-date1
+ dn=dd.days
+ d=num2-num1
+ if d<0:
+ d=-1*d
+ dp=dd+datetime.timedelta(hours=6)
+ dp=dp.days
+ dm=dd-datetime.timedelta(hours=6)
+ dm=dm.days
+ ret=[]
+ if dn%d*2>d:
+ dn=dn+d
+ if dm%d*2>d:
+ dm=dm+d
+ if dp%d*2>d:
+ dp=dp+d
+ #recdblist.printutf8(str(d)+":"+str(dn))
+ if dp!=dn:
+ ret.append([dn/d,60])
+ ret.append([dp/d,40])
+ elif dm!=dn:
+ ret.append([dn/d,60])
+ ret.append([dm/d,40])
+ else:
+ ret.append([dn/d,100])
+ return ret
+def detNameType(title,path):
+ """
+ type A ---title#<number>
+ type B ---title#<number>subtitle
+ type C ---title subtitle
+ type D ---title(without number)
+ type Aj ---title第<number>話
+ path --search reflexively
+ """
+ new=0
+ if re.search(u"[新]",title) or re.search(u" 新",title):
+ title=title.replace(u"[新]","")
+ title=title.replace(u" 新","")
+ new=1
+ recdblist.printutf8(title,verbose_level=800)
+ title=auto_move.getTitle(title)##titleから日時を除く
+ title=title.replace(u"無料≫","")
+ #rA=re.compile(".+(?P<title>)#\d(?P<num>)\s[0,10]\z")
+ rA=re.compile("(.+)#(\d*)\s*\Z")
+ tA=rA.match(title)
+ rB=re.compile("(.+)#(\d*)\s*(\D*)")
+ tB=rB.match(title)
+ rAj=re.compile("(.+)第(\d*)話\s*\Z")
+ tAj=rAj.match(title)
+ ret={'title':"",'type':"",'num':0,'subtitle':"",'folder':""}
+ if tA:
+ #recdblist.printutf8("typeA")
+ #recdblist.printutf8("title="+tA.group(1))
+ #recdblist.printutf8("num="+tA.group(2))
+ ret['type']="A"
+ ret['title']=tA.group(1).replace(" ","")
+ ret['num']=int(tA.group(2))
+ ret['folder']=searchFolder(tA.group(1),unicode(path,'utf-8'))
+ if tAj:
+ #recdblist.printutf8("typeA")
+ #recdblist.printutf8("title="+tAj.group(1))
+ #recdblist.printutf8("num="+tAj.group(2))
+ ret['type']="Aj"
+ ret['title']=tAj.group(1).replace(" ","")
+ ret['num']=int(tAj.group(2))
+ ret['folder']=searchFolder(tAj.group(1),unicode(path,'utf-8'))
+ elif tB:
+ #recdblist.printutf8("typeB")
+ #recdblist.printutf8("title="+tB.group(1))
+ #recdblist.printutf8("num="+tB.group(2))
+ #recdblist.printutf8("subtitle="+tB.group(3))
+ ret['type']="B"
+ ret['title']=tB.group(1).replace(" ","")
+ ret['num']=int(tB.group(2))
+ ret['folder']=searchFolder(tB.group(1),unicode(path,'utf-8'))
+ ret['subtitle']=tB.group(3)
+ else:#type C or type D
+ #fold=searchFolder(title, path)
+ ts=title.split(" ")
+ tt=""
+ rt=["",0,""]
+ for t in ts:
+ tt=tt+" "+t
+ ft1=searchFolder(tt,unicode(path,'utf-8'))
+ #recdblist.printutf8(tt)
+ #print ft1
+ if ft1!="":
+ #recdblist.printutf8(rt)
+ #recdblist.printutf8(ft1[0]+" : "+str(ft1[1]))
+ if ft1[1]>rt[1]:
+ rt[0]=tt
+ rt[1]=ft1[1]
+ rt[2]=ft1[0]
+ #recdblist.printutf8(rt)
+ #recdblist.printutf8("title="+rt[0][1:]+"/")
+ #recdblist.printutf8("subtitle = "+title.replace(rt[0][1:],"")[1:])
+ ret['title']=rt[0][1:].replace(" ","")
+ ret['num']=-1
+ ret['folder']=rt[2]
+ ret['subtitle']=title.replace(rt[0][1:],"")[1:]
+ if ret['subtitle'].replace(" ","")=="":
+ ret['type']="D"
+ else:
+ ret['type']="C"
+ if new==1:
+ ret['num']=1
+ return ret
+def searchFolder(title,path,threshold=500):
+ """
+ titleからフォルダーを探す
+ """
+ folderpath=os.listdir(path)
+ lfpath=[]
+ ngram=[]
+ for ft in folderpath:
+ fullpath=os.path.join(path, ft)
+ if os.path.isdir(fullpath):
+ lfpath.append(fullpath)
+ ftt=os.listdir(fullpath)
+ if len(ftt)>0:
+ for ft2 in ftt:
+ folderpath.append(os.path.join(fullpath, ft2))
+ else:
+ lfpath.append(fullpath)
+ for dirp in lfpath:
+ cmpp=""
+ appp=""
+ if os.path.isdir(dirp):
+ cmpp=os.path.dirname(dirp)
+ appp=dirp
+ else:
+ cmpp=os.path.basename(dirp)
+ appp=os.path.dirname(dirp)
+ ntitle=auto_move.getTitle(title)
+ ncmpp=auto_move.getTitle(cmpp)
+ p=n_gram.trigram(ntitle,ncmpp)
+ if p>0:
+ ngram.append((p,appp))
+ ngram=list(set(ngram))
+ ngram.sort()
+ ngram.reverse()
+ if len(ngram)>0:
+ #recdblist.printutf8(title + ngram[0][1] + " : "+str(ngram[0][0]))
+ if ngram[0][0]>threshold:
+ return ngram[0][1]
+ else:
+ return ""
+ else:
+ return ""
\ No newline at end of file