OSDN Git Service

add dist
[rec10/rec10-git.git] / dist / trunk / rec10 / guess.py
diff --git a/dist/trunk/rec10/guess.py b/dist/trunk/rec10/guess.py
new file mode 100755 (executable)
index 0000000..cad73e1
--- /dev/null
@@ -0,0 +1,240 @@
+#!/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