#!/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()