#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# code.py: based on web.py
#
# author: observer
# email: jingchaohu@gmail.com
# blog: http://obmem.com
# last edit @ 2009.12.23
import memcache
import random
import os,sys
import web
from web import form
from hashlib import md5
from binascii import crc32
from threading import Thread
import sqlite3
import cache
import uclient
import time
import re
import urllib
import zlib
import sphinxapi
web.config.debug = False
#path = os.path.dirname(os.path.realpath(sys.argv[0]))
path ='/var/www/simplecd.old'
sys.path.insert(0,path)
db = web.database(dbn='sqlite', db=path+'/verycd.sqlite3.db')
#dbc = web.database(dbn='sqlite', db=path+'/comment.sqlite3.db')
dbc = web.database(dbn='mysql', user='root', pw='guess8', db='simplecd', charset=None)
#dbs = web.database(dbn='sqlite',db=path+'/stat.sqlite3.db')
dbl = web.database(dbn='sqlite',db=path+'/lock.sqlite3.db')
dbb = web.database(dbn='sqlite',db='/tmp/ddos.db3')
mc = memcache.Client(['127.0.0.1:11211'], debug=0)
antibots = path+'/antibots.list'
urls = (
'/', 'index',
'/category/(.+)','category',
'/search/', 'search',
'/otz/','otz',
'/idr/(.+)','id',
#'/gz/(.+)','gz',
#'/topics/(.+)','gz',
'/comment/(.*)','comment',
'/random/','seo',
'/edit/(.*)','edit',
#'/top/(.*)','top',
#'/top2/','top2',
#'/top3/','top3',
#'/top4/','top4',
'/seo/','seo',
'/login/','login',
'/logout/','logout',
'/user/(.*)','user',
#'/check_update/(.*)','update',
'/robots.txt','robots',
'/favicon.ico','favicon',
'/archive/(.*)','archive',
#'/activity/(.*)','activity',
'/hot','hot',
'/banlist','banlist',
'/feed2','feed',
'/feed','feed',
#'/360buy-union.txt','union',
)
class union:
def GET(self):
return open('/home/observer/360buy-union.txt').read()
def itervc(vc):
vc2 = []
try:
for x in vc:
try:
vc2.append( x )
except:
continue
except:
pass
return vc2
def unquote2(s):
s = s.encode('utf-8')
r = ''
i = 0
while i < len(s):
if s[i] != '%':
r += s[i]
i += 1
else:
r += chr(int(s[i+1:i+3],16))
i += 3
return r.decode('utf-8')
def check_login():
user = web.cookies().get('user')
md5 = web.cookies().get('md5')
if user and md5 and uclient.check_login(user,md5):
return True
else:
return False
def ensure_dir(f):
d = os.path.dirname(f)
if not os.path.exists(d):
os.makedirs(d)
def notfound():
return web.notfound(open(path+'/static/404.html').read())
def internalerror():
return web.internalerror(open(path+'/static/500.html').read())
def mkstat(id):
try:
st = dbc.select('t1',where='id='+str(id))[0]
try:
dbc.update('t1',where='id='+str(id),hits=st.hits+1,score=st.score+1)
dbc.insert('feed',username='anonymous',action='clicks',id=long(id),time=int(time.time()),weight=1)
vcpv = dbc.select('t1',where='id='+str(id),what='hits+vcpv as vcpv')[0].vcpv
#dbl.update('lock',where='id='+str(id),vcpv=vcpv)
except Exception as what:
open('staterror','a').write(what.__str__())
print what
except:
try:
rec = db.select('verycd',where='verycdid=%d'%id)
rec = [ x for x in rec ]
if rec != []:
title = rec[0].title.encode('utf-8')
brief = rec[0].brief.encode('utf-8')
category1 = rec[0].category1.encode('utf-8')
updtime = rec[0].updtime
status = rec[0].status.encode('utf-8')
else:
title = brief = category1 = updtime = status = ''
dbc.insert('t1',id=long(id),comments=0,hits=1,score=1,title=title,brief=brief,category1=category1,updtime=updtime,status=status,vcpv=0)
except Exception as what:
print what
def getsubs(edstr):
subs = re.compile(r'(ed2k://.*?\|/)').findall(edstr)
if subs:
subs = [ [x,x.split('|')[2]] for x in subs ]
return subs
else:
return []
def render_template(fname, arg=None):
rt = web.template.frender(fname)
return rt(arg)
render = web.template.render('templates', globals={'getsubs':getsubs,'render_template':render_template})
app = web.application(urls, globals())
app.notfound = notfound
app.internalerror = internalerror
class robots:
def GET(self):
return '''User-agent: *
Disallow: /edit/
Allow: /
'''
class favicon:
def GET(self):
return open(path+'/static/favicon.ico','r').read()
class update:
def GET(self,args):
try:
the_method,the_arg = args.split('.',1)
except:
return 'error: protocol failure'
if the_method in ['verycd','comment','lock']:
pass
updcache = path+'/updates/'+the_method+'/'+the_arg[:4]+'/'+the_arg
if os.path.exists(updcache):
return open(updcache,'rb').read()
if the_method == 'Binary':
# return none
rtn = 'new:server too busy, live update disabled'
#the_time = time.strftime('%Y/%m/%d %H:%M:%S',time.gmtime(int(the_arg)+3600*11))
#recs = db.select('verycd',what='verycdid',where='updtime>"'+the_time+'"',order='updtime desc')
#ids = [ str(x.verycdid) for x in recs ]
#ids2 = []
#idset = set([])
#for id in ids:
# if id not in idset:
# idset.add(id)
# ids2.append(id)
#ids2.reverse()
#rtn = 'ids:'+'.'.join(ids2)
elif the_method == 'Getids':
# return none
rtn = 'new:server too busy, live update disabled'
#(the_arg,the_version) = the_arg.split(',')
#if the_version < '0.1.2':
# return 'new:Version too old, please download update from http://desktop.simplecd.org'
#the_time = time.strftime('%Y/%m/%d %H:%M:%S',time.gmtime(int(the_arg)+3600*11))
#recs = db.select('verycd',what='verycdid',where='updtime>"'+the_time+'"',order='updtime desc')
#ids = [ str(x.verycdid) for x in recs ]
#ids2 = []
#idset = set([])
#for id in ids:
# if id not in idset:
# idset.add(id)
# ids2.append(id)
#ids2.reverse()
#rtn = 'ids:'+'.'.join(ids2)
elif the_method == 'Updtime':
try:
updtime = db.select('verycd',where='verycdid='+the_arg)[0].updtime
updtime = int(time.mktime(time.strptime(updtime,'%Y/%m/%d %H:%M:%S')))-8*3600
return str(updtime)
except:
return 'error: invalid id#'+args
elif the_method == 'verycd':
try:
recs = db.select('verycd',where='verycdid in ('+the_arg+')')
rl = []
for r in recs:
rl.append( '__>@!@<__'.join([str(r.verycdid),r.title,r.status,r.brief,r.pubtime,r.updtime,r.category1,r.category2,r.ed2k,r.content,r.related]) )
rtn = '__>@!@<__'.join(rl)+'__>@!@<__'
except Exception as what:
if 'decode' in what.__str__():
recs = db.select('verycd',where='verycdid in ('+the_arg+')',what='verycdid,title,status,brief,pubtime,updtime,category1,category2,ed2k,content')
rl = []
for r in recs:
rl.append( '__>@!@<__'.join([str(r.verycdid),r.title,r.status,r.brief,r.pubtime,r.updtime,r.category1,r.category2,r.ed2k,r.content,'']) )
rtn = '__>@!@<__'.join(rl)+'__>@!@<__'
else:
rtn = 'error: invalid id#'+args+what.__str__()
elif the_method == 'comment':
try:
recs = dbc.select('comment',where='id in ('+the_arg+')')
rl = []
for r in recs:
try:
rl.append( '__>@!@<__'.join([str(r.id),r.username,r.comment,str(r.time)]) )
except:
pass
rtn = '__>@!@<__'.join(rl)+'__>@!@<__'
except Exception as what:
if 'decode' in what.__str__():
recs = dbc.select('comment',where='id in ('+the_arg+')',what='id,time')
rl = []
for r in recs:
rl.append( '__>@!@<__'.join([str(r.id),'','',str(r.time)]) )
rtn = '__>@!@<__'.join(rl)+'__>@!@<__'
else:
rtn = 'error: invalid id#'+args+what.__str__()
elif the_method == 'lock':
try:
recs = dbl.select('lock',where='id in ('+the_arg+')')
rl = []
for r in recs:
try:
rl.append('__>@!@<__'.join([str(r.id),str(r.locked),r.owner,r.editor,r.title,r.updtime,str(r.vcpv)]))
except:
pass
rtn = '__>@!@<__'.join(rl)+'__>@!@<__'
except Exception as what:
rtn = 'error: invalid id'+what.__str__()+args
else:
rtn = 'error: unknown method#'+the_method+args
try:
rtn = rtn.encode('utf-8')
except:
pass
if the_method in ['verycd','comment','lock']:
if not rtn.startswith('error'):
#ensure_dir(updcache)
#open(updcache,'wb').write( zlib.compress(rtn) )
pass
return zlib.compress(rtn)
class seo:
def GET(self):
startint = random.randint(0,240000)
recs = db.select('verycd',order='updtime desc',offset=startint,limit=20)
recs = [ x for x in recs ]
return render.seo(recs)
class user:
def GET(self,user):
t1 = time.time()
key = md5(user.encode('utf-8')).hexdigest()
value = mc.get(key)
if not value:
OFFSET = 5
# type=1,fav; type=2,recent, type=3,cmt
type = 0
if '.' not in user:
arg = 1
else:
OFFSET = 10
spuser = user.split('.')
arg = int(spuser[-1])
user = spuser[0]
if len(spuser)==3:
type = int(spuser[1])
page = int(arg)
recs = dbl.select('lock',where='owner="'+user+'"',order='updtime desc',limit=OFFSET,offset=(page-1)*OFFSET)
num = dbl.select('lock',where='owner="'+user+'"',what='count(*) as count')[0].count
pages = [ page-1, page+1, (num-1)/OFFSET+1 ]
pop = dbl.select('lock',where='owner="'+user+'"',order='vcpv desc',limit=OFFSET,offset=(page-1)*OFFSET)
try:
posts = dbc.select('comment',where='username="'+user+'"',order='time desc',limit=OFFSET,offset=(page-1)*OFFSET)
nposts = dbc.select('comment',where='username="'+user+'"',what='count(*) as count')[0].count
npages = [ page-1, page+1, (nposts-1)/OFFSET+1 ]
posts = [ x for x in posts ]
ids = [ str(x.id) for x in posts ]
ttls = db.select('verycd',what='verycdid,title',where='verycdid in ('+','.join(ids)+')')
ttls = [ x for x in ttls ]
except:
posts = []
ttls = []
rtn = []
for y in posts:
for x in ttls:
if y.id == x.verycdid:
rtn.append([y.id,x.title,time.strftime('%Y/%m/%d %H:%M:%S',time.gmtime(int(y.time)+3600*11))])
break
value = render.user([recs,user,pages,pop,rtn,type,npages,time.time()-t1])
mc.set(key,value,60*60*2)
return value
class logout:
def GET(self):
web.setcookie('user','',300,'')
web.setcookie('md5','',300,'')
try:
refer = web.ctx.env["HTTP_REFERER"]
except:
refer = '/'
return render.error(['已退出',refer])
class login:
def GET(self):
i = web.input(redirect=None)
if i.redirect:
i.redirect = i.redirect.encode('utf-8')
i.redirect = urllib.unquote(i.redirect)
else:
try:
i.redirect = web.ctx.env["HTTP_REFERER"]
except:
i.redirect = '/'
r = '''
用户登录
''' % i.redirect
return render.login([i.redirect])
def POST(self):
try:
i = web.input(user=None,passwd=None,redirect='%2F')
i.redirect = i.redirect.encode('utf-8')
i.redirect = urllib.unquote(i.redirect)
r = uclient.login(i.user,i.passwd)
if 'success' in r[0]:
web.setcookie('user', i.user, 8640000, '')
web.setcookie('md5', r[1], 8640000, '')
#web.header('Set-Cookie','ra=SoDu; expires=Thu, 15-Oct-2009 20:19:20 GMT; path=/')
return render.error(['登录成功',i.redirect])
else:
return render.error(['登录失败',i.redirect])
except Exception as what:
return what.__str__()
# top user
class top4:
def GET(self):
# select owner,sum(vcpv) as sum from lock group by owner order by sum desc limit 20;
pop = dbl.select('lock',what='owner,sum(vcpv) as sum,count(*) as count,id,title',group='owner',order='sum desc',limit=20)
pop = [ x for x in pop ]
return render.top4(pop)
class top3:
def GET(self):
i = web.input(cat=None,status=None)
if i.cat:
where = 'category1 = "'+i.cat+'"'
else:
where = 'id != 1'
if i.status:
if i.status == '0':
i.status = '审核中资源 '
elif i.status == '3':
i.status = '自定义 '
where += ' and status = "'+i.status+'" or status = "'+i.status[:-1]+'"'
rec = dbc.select('t1',order='vcpv desc',limit=400,where=where)
rec = [ x for x in rec ]
return render.top3(rec)
class top2:
def GET(self):
i = web.input(cat=None,status=None)
if i.cat:
where = 'category1 = "'+i.cat+'"'
else:
where = 'id != 1'
if i.status:
if i.status == '0':
i.status = '审核中资源 '
elif i.status == '3':
i.status = '自定义 '
where += ' and status = "'+i.status+'"'
rec = dbc.select('t1',order='score desc',limit=20,where=where)
rec = [ x for x in rec ]
return render.top2(rec)
class top:
def GET(self,num):
if num:
if not num.isdigit():
num = 20
elif int(num)>100:
num = 100
else:
num = 20
i = web.input(cat=None)
rec2 = dbc.select('stat',order='score desc',limit='%s'%str(num))
rec2 = [ x for x in rec2 ]
where = 'verycdid in (' + ','.join([ str(x.id) for x in rec2 ]) + ')'
rec1 = db.select('verycd',where=where)
rec1 = [ x for x in rec1 ]
return render.top([rec1,rec2,i.cat])
class edit:
def GET(self,id):
try:
if not check_login():
return render.error(['请登录先','/login/?redirect=%%2Fedit%%2F%s'%str(id)] )
user = web.cookies().get('user')
timenow=time.strftime("%Y/%m/%d %H:%M:%S" ,time.gmtime(time.time()+3600*8))
if id == 'add':
newid = db.select('verycd',what='max(verycdid) as max')[0].max+1
newid2 = dbc.select('verycd',what='max(verycdid) as max')[0].max+1
newid = max(newid,newid2)
for _ in range(10):
try:
dbc.insert('verycd',verycdid=newid,title='Unfinished%ld'%newid,pubtime='1970/01/01 00:00:00',updtime='1970/01/01 00:00:00',status='',brief='',category1='',category2='',ed2k='',content='',related='')
db.insert('verycd',verycdid=newid,title='Unfinished%ld'%newid,pubtime='1970/01/01 00:00:00',updtime='1970/01/01 00:00:00',status='',brief='',category1='',category2='',ed2k='',content='',related='')
break
except Exception,what:
newid += 1
return what.__str__()
continue
try:
try:
dbl.insert('lock',id=newid,locked=False,owner=user,editor='',title='Unfinished%ld'%newid,updtime='1970/01/01 00:00:00',vcpv=0)
except:
pass
except:
dbl.update('lock',where='id=%s'%str(newid),locked=False,owner=user,editor='')
return render.edit(['add',newid,[],timenow,user,True])
else:
id = long(id)
owner = None
user = web.cookies().get('user')
if id > 2147483647L:
try:
try:
thelock = dbl.select('lock',where='id='+str(id))[0]
if thelock.locked and thelock.owner != user and (user not in thelock.editor):
return render.error(['资源被锁定,无法更改','/id/%s'%str(id)])
owner = thelock.owner
except:
pass
rec = db.select('verycd',where='verycdid='+str(id))[0]
if user and user == owner:
canlock = True
else:
canlock = False
return render.edit(['edit',id,rec,timenow,owner,canlock])
except:
return render.error(["Invalid ID",'/'])
return render.error(["Invalid ID",'/'])
except Exception as what:
return what.__str__()
def POST(self,id):
i = web.input(id=None,status=None,updtime=None,title=None,brief=None,pubtime=None,cat1=None,cat2=None,\
ed2k='',content='',related='',addlock='')
cache.clear_idcache(i.id)
if i.addlock=='yes' and i.id:
try:
thelock = dbl.select('lock',where='id='+str(i.id))[0]
user = web.cookies().get('user')
if user and check_login() and user == thelock.owner:
dbl.update('lock',where='id='+str(i.id),locked=True,title=i.title,updtime=i.updtime)
except:
pass
if i.id and i.status and i.updtime and i.title and i.brief\
and i.pubtime and i.cat1 and i.cat2:
if long(i.id)<2147483648L:
return render.error(['参数错误','/edit/%s'%str(i.id)])
try:
import urllib
i.ed2k = i.ed2k.strip()
i.ed2k = i.ed2k.split('\n')
for x in i.ed2k:
if not x.startswith('ed2k'):
i.ed2k.remove(x)
for k in range(len(i.ed2k)):
if not '`' in i.ed2k[k]:
# i.ed2k[k]+='`'+urllib.unquote(i.ed2k[k].split('|')[2].strip())
i.ed2k[k]+='`'+ unquote2(i.ed2k[k].split('|')[2].strip())
i.ed2k = '`'.join(i.ed2k)
i.content = re.compile(r'\n+',re.DOTALL).sub(r'\n',i.content)
i.content = re.compile(r'<.*?>',re.DOTALL).sub(r'',i.content)
i.content = re.compile(r'\[img\](.*?)\[/img\]',re.DOTALL).sub(r'
',i.content)
i.content = re.compile(r'\[url=(.*?)\](.*?)\[/url\]',re.DOTALL).sub(r'\1',i.content)
except:
i.ed2k = ''
if i.ed2k == '':
return render.error(['无法识别ed2k链接,请重新编辑','/edit/%s'%str(i.id)])
try:
db.update('verycd',where='verycdid='+str(i.id),title=i.title,updtime=i.updtime,status=i.status,brief=i.brief,pubtime=i.pubtime,category1=i.cat1,category2=i.cat2,ed2k=i.ed2k,content=i.content,related=i.related)
dbc.update('verycd',where='verycdid='+str(i.id),title=i.title.encode('utf-8'),updtime=i.updtime,status=i.status.encode('utf-8'),brief=i.brief.encode('utf-8'),pubtime=i.pubtime,category1=i.cat1.encode('utf-8'),category2=i.cat2.encode('utf-8'),ed2k=i.ed2k.encode('utf-8'),content=i.content.encode('utf-8'),related=i.related.encode('utf-8'))
dbl.update('lock',where='id='+str(i.id),title=i.title,updtime=i.updtime)
except Exception,what:
return what
return render.error(['保存成功','/id/%s'%str(i.id)])
else:
return render.error(['参数错误','/edit/%s'%str(i.id)])
class rand:
def GET(self):
count = db.select('verycd',what='count (*) as count',order='updtime')[0].count
offset = random.randint(0,count-1)
id = db.select('verycd',what='verycdid',order='updtime',limit=1,offset=offset)[0].verycdid
myvar = dict(id=id)
recl = dbl.select('lock',vars=myvar,where='id=$id')
recl = [ x for x in recl ]
rec = db.select('verycd',vars=myvar,where="verycdid=$id")
for r in rec:
r2 = [r.verycdid,r.title,r.status,r.brief,r.pubtime,r.updtime,r.category1,r.category2,r.ed2k,r.content,r.related]
fl = None
return render.id([r2,fl,str(r['verycdid']),recl])
return render.e404([])
class comment:
def GET(self,id):
if '?' in id:
id = id[:id.find('?')]
if '.' in id:
page = long(id.split('.')[1])
id = long(id.split('.')[0])
else:
id = long(id)
page = 1
if page != 0:
cts = dbc.select('comment',where='id=%d'%id,order='time DESC',offset=30*page-30,limit=30)
num = dbc.select('comment',what='count(*) as cnt',where='id=%d'%id)[0].cnt
else:
cts = dbc.select('comment',where='id=%d'%id,order='time DESC')
page = 1
num = 0
cts = [ x for x in cts ]
for i in range(len(cts)):
cts[i].time = time.strftime('%Y/%m/%d %H:%M:%S',time.gmtime(cts[i].time+3600*11))
mkstat(id)
return render.comment([cts,id,page,num])
def POST(self,any):
i = web.input(id=None,username=None,comment=None)
i.comment = i.comment.replace(r'<.*?>',r'')
if "href" in i.comment or "http" in i.comment or "/" in i.comment or "from" in i.comment:
return 'Failed'
try:
dbc.insert('comment',id=i.id,username=i.username.encode('utf-8'),comment=i.comment.encode('utf-8'),time=int(time.mktime(time.gmtime())))
except Exception as what:
return what.__str__()
try:
rec = dbc.select('t1',where='id='+str(i.id))[0]
try:
dbc.update('t1',where='id='+str(i.id),comments=rec.comments+1,score=rec.score+10)
except:
pass
except Exception as what:
# this branch should never execute...
try:
rec = db.select('verycd',where='verycdid=%d'%id)
rec = [ x for x in rec ]
if rec != []:
title = rec[0].title
brief = rec[0].brief
category1 = rec[0].category1
updtime = rec[0].updtime
status = rec[0].status
else:
title = brief = category1 = updtime = status = ''
dbc.insert('t1',id=long(id),comments=0,hits=1,score=1,title=title,brief=brief,category1=category1,updtime=updtime,status=status,vcpv=0)
except Exception as what:
return what.__str__()
return 'Done!Back'%i.id
class otz:
def GET(self):
return render.otz('')
class search:
def GET(self):
i = web.input(title=None,cat1=None,cat2=None,release=None,lang=None,loc=None,pubtime=None,page=1,\
imdb1=None,imdb2=None,genre=None,platform=None,gametype=None,producer=None,press=None,\
booktype=None)
eachpage = 10
offset = eachpage*(int(i.page)-1)
where = []
arg = '/search/?td=as'
if i.cat1:
where.append('category1 = "'+i.cat1+'"')
arg += '&cat1='+i.cat1
if i.cat2:
where.append('category2 = "'+i.cat2+'"')
arg += '&cat2='+i.cat2
if i.pubtime:
where.append('pubtime like "'+i.pubtime+'%"')
arg += '&pubtime='+i.pubtime
if i.imdb1:
where.append('brief like "IMDb%" and brief > "IMDb: '+i.imdb1+'"')
arg += '&imdb1='+i.imdb1
if not i.imdb2:
i.imdb2 = '9.9'
if i.imdb2:
where.append('brief like "IMDb%" and brief < "IMDb: '+i.imdb2+'"')
arg += '&imdb2='+i.imdb2
if i.platform:
where.append(u'brief like "游戏平台: '+i.platform+'%"')
arg += '&platform='+i.platform
if i.booktype:
where.append(u'brief like "图书分类: '+i.booktype+'%"')
arg += '&booktype='+i.booktype
if i.genre:
where.append(u'brief like "%'+i.genre+'%"')
arg += '&genre='+i.genre
if i.title:
where.append('title like "%'+i.title+'%"')
arg += '&title='+i.title
if i.release:
where.append(u'brief like "%: '+i.release+u'年%"')
arg += '&release='+i.release
if i.lang:
where.append(u'brief like "%语言: %'+i.lang+'%"')
arg += '&lang='+i.lang
if i.loc:
where.append(u'brief like "%地区: '+i.loc+'%"')
arg += '&loc='+i.loc
if i.gametype:
where.append(u'brief like "%游戏类型: '+i.gametype+'%"')
arg += '&gametype='+i.gametype
if i.producer:
where.append(u'brief like "%制作发行: %'+i.producer+'%"')
arg += '&producer='+i.producer
if i.press:
where.append(u'brief like "%出版社: %'+i.press+'%"')
arg += '&press='+i.press
arg += '&page'
where = ' and '.join(where)
if where == '':
where = 'updtime != "1"'
num = db.select('verycd',what='count(*) as count',order='updtime DESC',where=where)[0].count
vc = db.select('verycd',what='verycdid,title,brief,updtime',order='updtime DESC',limit=eachpage,\
offset=offset,where=where)
prev = int(i.page)-1 == 0 and '1' or str(int(i.page)-1)
next = int(i.page)+1 <= (num-1)/eachpage+1 and str(int(i.page)+1) or i.page
end = str((num-1)/eachpage+1)
pages = [prev,next,end]
left = min(4,int(i.page)-1)
right = min(4,int(end)-int(i.page))
if left < 4:
right = min(8-left,int(end)-int(i.page))
if right < 4:
left = min(8-right,int(i.page)-1)
while left > 0:
pages.append(str(int(i.page)-left))
left -= 1
j = 0
while j <= right:
pages.append(str(int(i.page)+j))
j += 1
return render.search([vc,pages,arg,i])
class gz:
def GET(self,id):
import gzip
id = str(id)
if id.endswith('/'):
id = id[:-1]
fname = path + '/gz/'+id[0:2]+'/'+id[2:4]+'/'+id+'.gz'
if os.path.exists( fname ):
return gzip.open(fname,'rb').read()
else:
return render.e404([])
class id:
def GET(self,id):
t1 = time.time()
if not id.isdigit():
return render.e404([])
l1 = str(long(id)%10)
l2 = str(long(id)/10%100)
l3 = str(long(id)/1000)
cachefile = path+'/idcache/%s/%s/%s.html'%(l1,l2,l3)
try:
if os.path.exists(cachefile):
return open(cachefile,'r').read()
except:
pass
myvar = dict(id=id)
recl = dbl.select('lock',vars=myvar,where='id=$id')
recl = [ x for x in recl ]
try:
rec = db.select('verycd',vars=myvar,where="verycdid=$id")
except:
rec = db.select('verycd',what='verycdid,title,status,brief,pubtime,updtime,category1,category2,ed2k,content',vars=myvar,where="verycdid=$id")
for r in rec:
fl = None
try:
r2 = [r.verycdid,r.title,r.status,r.brief,r.pubtime,r.updtime,r.category1,r.category2,r.ed2k,r.content,r.related]
except:
r2 = [r.verycdid,r.title,r.status,r.brief,r.pubtime,r.updtime,r.category1,r.category2,r.ed2k,r.content,'']
try:
import zlib
r2[8] = zlib.decompress(r.ed2k)
r2[9] = zlib.decompress(r.content)
except:
pass
idhtml = render.id([r2,fl,str(r['verycdid']),recl,time.time()-t1])
try:
os.umask(000)
open(cachefile,'w').write(idhtml.__str__())
links = re.compile(r'src="(http://image[^"]*)"').findall(idhtml.__str__())
links = [ x.replace('app-base','verycd') for x in links if 'app-base' in x ]
t = Thread(target=cache.cache_image(links))
t.start()
except:
pass
return idhtml
return render.e404([])
class archive:
def GET(self,args):
try:
cat,page = args.split('/')
vc = db.select('verycd',what='verycdid,title',where='category1="%s" and pubtime>"1971"'%cat.encode('utf-8'),order='pubtime asc',limit=100,offset=(int(page)-1)*100)
vc = [ x for x in vc ]
num = db.select('verycd',what='count(*) as count',where='category1="%s" and pubtime>"1971"'%cat.encode('utf-8'))[0].count
prev = int(page)-1 == 0 and '1' or str(int(page)-1)
next = int(page)+1 <= (num-1)/100+1 and str(int(page)+1) or page
end = str((num-1)/100+1)
pages = [str(page),prev,next,end]
left = min(4,int(page)-1)
right = min(4,int(end)-int(page))
if left < 4:
right = min(8-left,int(end)-int(page))
if right < 4:
left = min(8-right,int(page)-1)
while left > 0:
pages.append(str(int(page)-left))
left -= 1
j = 0
while j <= right:
pages.append(str(int(page)+j))
j += 1
return render.archive([cat,pages,vc])
except Exception, what:
return what.__str__()
class activity:
def GET(self,args):
try:
t1 = time.time()
action,page = args.split('/')
if action not in ['cmts','marks']:
return render.e404([])
feeds = dbc.select('feed',what='username,id,time',where='action="%s"'%action,order='time desc',limit=20,offset=(int(page)-1)*20)
#key = 'actnum'+action.encode('utf-8')
#value = mc.get(key)
#if not value:
# value = dbc.select('feed',where='action="%s"'%action,what='count(*) as count')[0].count
# mc.set(key,value,60*5)
#num = value
num = 1000
vc = []
for x in feeds:
try:
username,id,t = x.username,x.id,x.time
key = md5('idsum'+str(id)).hexdigest()
value = mc.get(key)
if not value:
value = db.select('verycd',what='verycdid,title,brief,updtime',where='verycdid=%d'%id)[0]
mc.set(key,value,60*60*24)
item = [ value.verycdid,value.title,value.brief,value.updtime ]
item.append(username)
item.append(time.strftime("%Y/%m/%d %H:%M:%S",time.gmtime(t+3600*8)))
vc.append(item)
except Exception,what:
print what
prev = int(page)-1 == 0 and '1' or str(int(page)-1)
next = int(page)+1 <= (num-1)/100+1 and str(int(page)+1) or page
end = str((num-1)/20+1)
pages = [str(page),prev,next,end]
left = min(4,int(page)-1)
right = min(4,int(end)-int(page))
if left < 4:
right = min(8-left,int(end)-int(page))
if right < 4:
left = min(8-right,int(page)-1)
while left > 0:
pages.append(str(int(page)-left))
left -= 1
j = 0
while j <= right:
pages.append(str(int(page)+j))
j += 1
return render.activity([action,pages,vc,num,time.time()-t1])
except Exception, what:
return what.__str__()
class hot:
def GET(self):
hots = []
for delta in [300,900,3600,43200,86400,604800]:
t = int(time.time()-delta)
hot = dbc.select('feed',what='id,count(*) as count',where='time>%d'%t,group='id',order='count(*) desc',limit=15)
temphot = []
for x in hot:
try:
ttl = db.select('verycd',what='title',where='verycdid='+str(x.id))[0].title
temphot.append( [x.id,ttl,x.count] )
except:
pass
hots.append(temphot[:10])
return render.hot(hots)
class banlist:
def GET(self):
bl = [ x for x in dbb.select('ddos') ]
html = "Total banned %s\n"%len(bl)
for x in bl:
html += "%-20s%d seconds left\n" % (x.ip,x.date+3600-int(time.time()))
return html
class feed:
def GET(self):
i = web.input(cat1='',cat2='')
import feed
return feed.feed(cat1=i.cat1.encode('utf-8'),cat2=i.cat2.encode('utf-8'))
class category:
def GET(self,arg):
args = arg.split('/')
cat1 = args[0]
cat2 = ''
page = 1
t1 = time.time()
try:
page = int(args[1])
except:
try:
cat2 = args[1]
page = int(args[2])
except:
pass
if cat1==u'状态':
if not cat2:
cat2 = u'审核中资源'
where = 'status="%s " or status="%s"' % (cat2,cat2)
ids = db.select('verycd',what='verycdid',where=where,order='updtime DESC',limit=20,offset=20*(int(page)-1))
vc = []
for id in ids:
id = id.verycdid
key = md5('idsum'+str(id)).hexdigest()
value = mc.get(key)
if not value:
value = db.select('verycd',what='verycdid,title,brief,updtime',where='verycdid=%d'%id)[0]
mc.set(key,value,60*60*24)
vc.append(value)
num = db.select('verycd',what='count(*) as count',where=where,_test=True)
key = md5(num.query()).hexdigest()
value = mc.get(key)
if not value:
value = db.select('verycd',what='count(*) as count',where=where)[0].count
mc.set(key,value,60*60)
num = value
arg = '/category/'+cat1+'/'+cat2+'/'
else:
#默认
timenow=time.strftime("%Y/%m/%d %H:%M:%S" ,time.gmtime(time.time()+3600*8))
where = 'updtime>"1971" and updtime<"%s"'%timenow
if not cat2:
myvar = dict(cat=cat1)
ids = db.select('verycd',what='verycdid,title,brief,updtime',order='updtime DESC',vars=myvar,where='category1=$cat',limit=20,offset=20*(int(page)-1))
else:
myvar = dict(cat=cat1,cat2=cat2)
ids = db.select('verycd',what='verycdid,title,brief,updtime',order='updtime DESC',vars=myvar,where='category1=$cat and category2=$cat2',limit=20,offset=20*(int(page)-1))
vc = []
for id in ids:
id = id.verycdid
key = md5('idsum'+str(id)).hexdigest()
value = mc.get(key)
if not value:
value = db.select('verycd',what='verycdid,title,brief,updtime',where='verycdid=%d'%id)[0]
mc.set(key,value,60*60*24)
vc.append(value)
if not cat2:
num = db.select('verycd',what="count(*) as count",vars=myvar,where='category1=$cat and updtime>"1971"',_test=True)
else:
num = db.select('verycd',what="count(*) as count",vars=myvar,where='category1=$cat and category2=$cat2 and updtime>"1971"',_test=True)
key = md5(cat1.encode('utf-8')+cat2.encode('utf-8')+num.query()).hexdigest()
value = mc.get(key)
if not value:
if not cat2:
value = db.select('verycd',what="count(*) as count",vars=myvar,where='category1=$cat and updtime>"1971"')[0].count
else:
value = db.select('verycd',what="count(*) as count",vars=myvar,where='category1=$cat and category2=$cat2 and updtime>"1971"')[0].count
mc.set(key,value,60*60)
num = value
arg = '/category/'+cat1+'/'
if cat2:
arg += cat2+'/'
#nav pages
prev = int(page)-1 == 0 and '1' or str(int(page)-1)
next = int(page)+1 <= (num-1)/20+1 and str(int(page)+1) or page
end = str((num-1)/20+1)
pages = [str(page),prev,next,end]
left = min(4,int(page)-1)
right = min(4,int(end)-int(page))
if left < 4:
right = min(8-left,int(end)-int(page))
if right < 4:
left = min(8-right,int(page)-1)
while left > 0:
pages.append(str(int(page)-left))
left -= 1
j = 0
while j <= right:
pages.append(str(int(page)+j))
j += 1
#owners
owners = []
hits = []
for x in vc:
try:
key = md5('lock'+str(x.verycdid)).hexdigest()
value = mc.get(key)
if not value:
value = dbl.select('lock',where='id='+str(x.verycdid))[0].owner
mc.set(key,value,60*60*24*30)
owners.append(value)
except:
owners.append( '' )
try:
key = md5('t1'+str(x.verycdid)).hexdigest()
value = mc.get(key)
if not value:
value = dbc.select('t1',what='hits,vcpv',where='id='+str(x.verycdid))[0]
value = str(value.hits+value.vcpv)
mc.set(key,value,60*60*24)
hits.append(value)
except:
hits.append( '1' )
mkstat(x.verycdid)
top = False
rss = '/feed2'
if cat1:
rss += '?cat1='+cat1.encode('utf-8')
if cat2:
rss += '&cat2='+cat2.encode('utf-8')
catdict = {
"电影":["动作","喜剧","爱情","文艺","剧情","科幻","魔幻","悬疑","惊悚","恐怖","罪案","战争","动画","音乐歌舞","电影周边"],
"剧集":["欧美","港台","大陆","日剧","韩剧"],
"音乐":["华语音乐","日韩音乐","欧美音乐","MV","演唱会","原声音乐","古典音乐","新世纪音乐","其他"],
"游戏":["光盘版游戏","硬盘版游戏","电视游戏","掌机游戏","网络游戏","游戏周边"],
"动漫":["电视动画","剧场动画","OVA","原创动漫","漫画","动漫周边"],
"图书":["小说","文学","人文社科","经济管理","计算机与网络","生活","教育科技","少儿","其他"],
"综艺":["综艺娱乐","艺人合集","体育节目","新闻综合","晚会典礼","科教节目","纪录片"],
"软件":["操作系统","应用软件","网络软件","系统工具","多媒体类","行业软件","编程开发","安全相关"],
"资料":["素材","杂志期刊","有声读物","其他"],
"教育":["人文社科","理工科","艺术教育","医学","商学","计算机","外语","其他"],
"状态":["审核中资源","普通资源","精华资源","自定义"],
}
html = mc.get("ic_"+web.ctx.fullpath.encode('utf-8'))
if not html:
try:
html = render.category([vc,pages,arg,'',num,cat1,'','',top,owners,hits,time.time()-t1,cat2,catdict,'','','',[],rss])
except:
raise web.seeother("/static/404.html")
mc.set("ic_"+web.ctx.fullpath.encode('utf-8'),html,60*5)
return html
class index:
def GET(self):
i = web.input(id=None,page='1',q=None,download=None,cat='',cat2='',order='',status=None,filtertime='',filterhits='')
if not (i.q) and i.page==1:
html = mc.get("ic_"+web.ctx.fullpath.encode('utf-8'))
if html:
return html
else:
html = None
t1 = time.time()
try:
cl = sphinxapi.SphinxClient()
cl.SetFieldWeights({"title":10,"brief":5,"ed2k":2,"content":1})
except:
pass
catdict = {
"电影":["动作","喜剧","爱情","文艺","剧情","科幻","魔幻","悬疑","惊悚","恐怖","罪案","战争","动画","音乐歌舞","电影周边"],
"剧集":["欧美","港台","大陆","日剧","韩剧"],
"音乐":["华语音乐","日韩音乐","欧美音乐","MV","演唱会","原声音乐","古典音乐","新世纪音乐","其他"],
"游戏":["光盘版游戏","硬盘版游戏","电视游戏","掌机游戏","网络游戏","游戏周边"],
"动漫":["电视动画","剧场动画","OVA","原创动漫","漫画","动漫周边"],
"图书":["小说","文学","人文社科","经济管理","计算机与网络","生活","教育科技","少儿","其他"],
"综艺":["综艺娱乐","艺人合集","体育节目","新闻综合","晚会典礼","科教节目","纪录片"],
"软件":["操作系统","应用软件","网络软件","系统工具","多媒体类","行业软件","编程开发","安全相关"],
"资料":["素材","杂志期刊","有声读物","其他"],
"教育":["人文社科","理工科","艺术教育","医学","商学","计算机","外语","其他"]
}
hots = []
nohots = [ long(x.value) for x in dbc.select('others',where='name="nohot"') ]
for delta in [300,3600,86400,300]:
t = int(time.time()-delta)
key = 'hot2.2'+str(delta)
value = mc.get(key)
if not value:
hot = dbc.select('feed',what='id,sum(weight) as count',where='time>%d'%t,group='id',order='sum(weight) desc',limit=15)
temphot = []
for x in hot:
try:
y = db.select('verycd',what='title,status',where='verycdid='+str(x.id))[0]
ttl,status = y.title,y.status.encode('utf-8')
if (x.id not in nohots):
temphot.append( [x.id,ttl,x.count] )
except Exception,what:
open("/tmp/err.err","a").write("%s\n"%what.__str__())
pass
value = temphot[:10]
mc.set(key,value,delta/5)
hots.append(value)
t = int(time.time()-86400)
key = 'hotcats500.4'
value = mc.get(key)
if not value:
hot = dbc.select('feed',what='id,sum(weight) as count',where='time>%d'%t,group='id',order='sum(weight) desc',limit=500)
temphot = []
for x in hot:
try:
r = db.select('verycd',what='title,category1',where='verycdid='+str(x.id))[0]
if (x.id not in nohots):
temphot.append( [x.id,r.title,x.count,r.category1] )
except:
pass
value = temphot
mc.set(key,value,86400/5)
hot500 = value
for mycat in [ u"游戏", u"电影", u"剧集",u"音乐",u"动漫" ]:
hot = []
count = 0
for y in hot500:
if y[-1] == mycat:
hot.append( y[:-1] )
count += 1
if count == 10:
break
hots.append(hot)
hots2 = hots[-5:]
hots2.extend(hots[:-5])
hots = hots2
#显示单个资源
if i.id:
raise web.seeother('/idr/'+str(i.id))
#显示最新更新的资源
else:
#显示审核中资源
if i.status:
if i.status=='0':
where = 'status = "审核中资源 " or status = "审核中资源"'
elif i.status=='1':
where = 'status = "普通资源 " or status = "普通资源"'
elif i.status=='2':
where = 'status = "精华资源 " or status = "精华资源"'
elif i.status=='3':
where = 'status = "自定义 "'
else:
where = 'status = "自定义 "'
ids = db.select('verycd',what='verycdid',where=where,order='updtime DESC',limit=20,offset=20*(int(i.page)-1))
vc = []
for id in ids:
id = id.verycdid
key = md5('idsum'+str(id)).hexdigest()
value = mc.get(key)
if not value:
value = db.select('verycd',what='verycdid,title,brief,updtime',where='verycdid=%d'%id)[0]
mc.set(key,value,60*60*24)
vc.append(value)
num = db.select('verycd',what='count(*) as count',where=where,_test=True)
key = md5(num.query()).hexdigest()
value = mc.get(key)
if not value:
value = db.select('verycd',what='count(*) as count',where=where)[0].count
mc.set(key,value,60*60)
num = value
arg = '/?'
arg += 'status='+i.status+'&page'
#默认情况,不指定分类,没有搜索关键字
elif (not i.q) and (not i.cat):
timenow=time.strftime("%Y/%m/%d %H:%M:%S" ,time.gmtime(time.time()+3600*8))
where = 'updtime>"1971" and updtime<"%s"'%timenow
try:
ids = db.select('verycd',what='verycdid',where=where,order='updtime DESC',limit=20,offset=20*(int(i.page)-1))
except:
ids = db.select('verycd',what='verycdid',order='updtime DESC',limit=20,offset=20*(int(i.page)-1))
if web.ctx.ip in open(antibots).read().strip().split(','):
ids2 = db.select('verycd',what='verycdid',where=where,order='updtime DESC',limit=20,offset=random.randint(1000,200000))
ids = [ x for x in ids ]
ids2 = [ x for x in ids2 ]
ids = [ ids[5],ids[11] ]
ids.extend(ids2[2:])
ids2 = []
for x in ids:
if x.verycdid<2147483648:
ids2.append(x)
ids = ids2
vc = []
for id in ids:
try:
id = id.verycdid
key = md5('idsum'+str(id)).hexdigest()
value = mc.get(key)
if not value:
value = db.select('verycd',what='verycdid,title,brief,updtime',where='verycdid=%d'%id)[0]
mc.set(key,value,60*60*24)
vc.append(value)
except:
pass
num = db.select('verycd',where='updtime>"1971"',what="count(*) as count",_test=True)
key = md5(num.query()).hexdigest()
value = mc.get(key)
if not value:
value= db.select('verycd',what="count(*) as count")[0].count
mc.set(key,value,60*60)
num = value
arg = '/?page'
#无搜索关键字,指定分类
elif (not i.q) and (i.cat):
timenow=time.strftime("%Y/%m/%d %H:%M:%S" ,time.gmtime(time.time()+3600*8))
where = 'updtime>"1971" and updtime<"%s"'%timenow
if not i.cat2:
myvar = dict(cat=i.cat)
ids = db.select('verycd',what='verycdid,title,brief,updtime',order='updtime DESC',vars=myvar,where='category1=$cat',limit=20,offset=20*(int(i.page)-1))
else:
myvar = dict(cat=i.cat,cat2=i.cat2)
ids = db.select('verycd',what='verycdid,title,brief,updtime',order='updtime DESC',vars=myvar,where='category1=$cat and category2=$cat2',limit=20,offset=20*(int(i.page)-1))
vc = []
for id in ids:
id = id.verycdid
key = md5('idsum'+str(id)).hexdigest()
value = mc.get(key)
if not value:
value = db.select('verycd',what='verycdid,title,brief,updtime',where='verycdid=%d'%id)[0]
mc.set(key,value,60*60*24)
vc.append(value)
if not i.cat2:
num = db.select('verycd',what="count(*) as count",vars=myvar,where='category1=$cat and updtime>"1971"',_test=True)
else:
num = db.select('verycd',what="count(*) as count",vars=myvar,where='category1=$cat and category2=$cat2 and updtime>"1971"',_test=True)
key = md5(i.cat.encode('utf-8')+i.cat2.encode('utf-8')+num.query()).hexdigest()
value = mc.get(key)
if not value:
if not i.cat2:
value = db.select('verycd',what="count(*) as count",vars=myvar,where='category1=$cat and updtime>"1971"')[0].count
else:
value = db.select('verycd',what="count(*) as count",vars=myvar,where='category1=$cat and category2=$cat2 and updtime>"1971"')[0].count
mc.set(key,value,60*60)
num = value
arg = '/?cat='+i.cat+'&cat2='+i.cat2+'&page'
#有搜索关键字,指定分类
elif i.q:
if i.cat:
filterid = {u'动漫':719562934,u'剧集':2095856694,u'游戏':1240228468,
u'教育':2281839130L,u'综艺':2606623585L,u'电影':816600256,
u'资料':1845344008,u'软件':2265599068L,u'音乐':2671274627L,
u'图书':141127530,u'教育':593163779}
cl.SetFilter("cat1_crc32",[filterid[i.cat]])
if i.cat2:
filterid = {u'剧情':3889669789L,u'管理营销':3257579659L,u'掌机游戏':652825696,
u'网络游戏':1465249412,u'日韩音乐':126073189,u'悬疑':1139569428,
u'警匪片':2287743336L,u'传记片':4071767814L,u'战争片':3670944100L,
u'OVA':1774032955,u'音乐歌舞':2755010194L,u'惊悚':2263369814L,
u'安全相关':2668768872L,u'经济管理':3081238464L,u'原创':1262200103,
u'校园片':461441367,u'剧场':1740548247,u'无':3314650135L,
u'MV视频':3555112012L,u'MV':2248595318L,u'大陆':4181635923L,
u'动画':3475403331L,u'动作片':2108700351,u'素材':3658781415L,
u'电视动画':1906637330,u'硬盘版游戏':2448004223L,u'破案片':3583236171L,
u'枪战片':400284812,u'医学':1491536283,u'欧美':3302000763L,
u'港台':1753932764,u'动漫':719562934,u'综艺娱乐':4285031930L,
u'魔幻':3129900996L,u'新世纪音乐':4113193486L,u'动画片':2994643978L,
u'系统工具':2828370203L,u'外语':121752816,u'战争':3613036019L,
u'外语教程':1712050037,u'励志片':391286461,u'其它图书':1522434117,
u'武侠':507189058,u'魔幻片':1311421749,u'编程开发':2981586544L,
u'多媒体类':984864652,u'灾难':1735610042,u'理工科':570620685,
u'剧场动画':3859054524L,u'综艺':2606623585L,u'课程讲座':2867504537L,
u'高清':1999993014,u'操作':2160007498L,u'华语音乐':2798462032L,
u'应用':335328804,u'演唱':1864374626,u'硬盘':677692124,
u'有声读物':1136943183,u'行业软件':1438460190,u'德文':637473814,
u'体育节目':3750548400L,u'繁体中文':3422370994L,u'计算机与网络':1277942216,
u'其它音乐':537173417,u'网络软件':2578694316L,u'操作系统':3065999329L,
u'破案':2966301611L,u'网络':630832038,u'其他':1320633819,
u'悬疑片':2408527136L,u'游戏周边':2510321995L,u'科幻片':1993377110,
u'欧美音乐':3187164846L,u'新片':2681697324L,u'医科':2461392277L,
u'小说':1119705105,u'华语':3432081974L,u'生活':4078605400L,
u'恐怖片':366694662,u'艺术体育':2693647409L,u'纪录':256830298,
u'漫画':580834229,u'科教':3771176659,u'杂志':2644005170L,
u'喜剧':3035540913L,u'杂志期刊':2867165743L,u'图片':3601152823L,
u'掌机':741245186,u'科教节目':3710750815L,u'计算':3458958604L,
u'计算机教程':325898917,u'预告片':1656706335,u'动漫周边':4221567864L,
u'艺人合集':1196990342,u'日剧':3426479413,u'其它':2574264210L,
u'人文社科':2933569312L,u'行业':3227229675L,u'教育科技':4124099447L,
u'有声':3205685455L,u'灾难片':562899294,u'体育健身':3784874160L,
u'纪录片':2791888905L,u'爱情片':542807837,u'原声音乐':2245160140L,
u'恐怖':3748184703L,u'英文':871688664,u'动作':916635576,
u'电脑游戏':3243122834L,u'演唱会':1865424354,u'韩剧':1537463991,
u'亚洲':3313111378L,u'光盘':3821496746L,u'惊悚片':4097254565L,
u'日韩':771013951,u'未分类':2732441435L,u'喜剧片':553814422,
u'电视游戏':3228836614L,u'原声':3234385718L,u'其他资料':3040818797L,
u'文艺':2307167021L,u'原创动漫':179595486,u'电子图书':2264444204L,
u'晚会典礼':2496405175L,u'古典音乐':7435291,u'电子':1625548782,
u'警匪':1031306199,u'OV':3023091188L,u'文学':1731443980,
u'专辑':3254056699L,u'科幻':379917236,u'文艺片':1370465836,
u'历史片':2773793620L,u'少儿':1978563153,u'新闻综合':4280160924L,
u'爱情':2872390923L,u'光盘版游戏':2515304864L,u'歌舞片':79763220,
u'历史':564085562,u'罪案':3667945758L,u'其它资料':750092156,
u'电影周边':3574267836L,u'影视原声':2725223802L,u'应用软件':3023964856L,
u'青春片':68802647,u'剧情片':3508160779L,u'商学':4223611760L,
u'计算机':1470184608L,u'电视':3802843126L,u'幼儿教育':3139913481L,}
try:
cl.SetFilter("cat2_crc32",[filterid[i.cat2]])
except:
pass
if i.order:
try:
cl.SetSortMode( sphinxapi.SPH_SORT_ATTR_DESC, str(i.order) )
except:
pass
if i.filtertime:
now = int(time.time()+3600*8)
try:
delta = int(i.filtertime)
except:
delta = now
cl.SetFilterRange("updtime",now-delta,now)
if i.filterhits:
try:
value = int(i.filterhits)
except:
value = 0
cl.SetFilterRange("hits",value,2147483647)
cl.SetLimits(max(0,10*(int(i.page)-1)),10)
result = cl.Query(i.q.encode('utf-8'))
if not result:
return render.e404([])
num = result['total']
matches = result['matches']
ids = [ x['id'] for x in matches ]
vc = []
for id in ids:
try:
key = md5('idsum'+str(id)).hexdigest()
value = mc.get(key)
if not value:
value = db.select('verycd',what='verycdid,title,brief,updtime',where='verycdid=%d'%id)[0]
mc.set(key,value,60*60*24)
vc.append(value)
except:
pass
if not i.cat:
i.cat=''
if not i.order:
i.order = ''
arg = '/?q='+i.q+'&cat='+i.cat+'&cat2='+i.cat2+'&filtertime='+i.filtertime+'&filterhits='+i.filterhits+'&order='+i.order+'&page'
prev = int(i.page)-1 == 0 and '1' or str(int(i.page)-1)
next = int(i.page)+1 <= (num-1)/20+1 and str(int(i.page)+1) or i.page
end = str((num-1)/20+1)
pages = [str(i.page),prev,next,end]
left = min(4,int(i.page)-1)
right = min(4,int(end)-int(i.page))
if left < 4:
right = min(8-left,int(end)-int(i.page))
if right < 4:
left = min(8-right,int(i.page)-1)
while left > 0:
pages.append(str(int(i.page)-left))
left -= 1
j = 0
while j <= right:
pages.append(str(int(i.page)+j))
j += 1
# vc = [ x for x in vc ]
#owners
owners = []
hits = []
for x in vc:
try:
key = md5('lock'+str(x.verycdid)).hexdigest()
value = mc.get(key)
if not value:
value = dbl.select('lock',where='id='+str(x.verycdid))[0].owner
mc.set(key,value,60*60*24*30)
owners.append(value)
except:
owners.append( '' )
try:
key = md5('t1'+str(x.verycdid)).hexdigest()
value = mc.get(key)
if not value:
value = dbc.select('t1',what='hits,vcpv',where='id='+str(x.verycdid))[0]
value = str(value.hits+value.vcpv)
mc.set(key,value,60*60*24)
hits.append(value)
except:
hits.append( '1' )
mkstat(x.verycdid)
top = False
rss = '/feed2'
if i.cat:
rss += '?cat1='+i.cat.encode('utf-8')
if i.cat2:
rss += '&cat2='+i.cat2.encode('utf-8')
if not html:
html = render.index([vc,pages,arg,i.q,num,i.cat,hot,i.status,top,owners,hits,time.time()-t1,i.cat2,catdict,i.order,i.filtertime,i.filterhits,hots,rss])
if not i.q:
mc.set("ic_"+web.ctx.fullpath.encode('utf-8'),html,60*5)
return html
application = app.wsgifunc()
#if __name__ == "__main__":
#web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)
#app.run()