From 09fc68e22819f9920fd897407a06fbd80ebabc93 Mon Sep 17 00:00:00 2001 From: abbeyokgo Date: Thu, 15 Nov 2018 15:32:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0PyOne3.0=EF=BC=81=EF=BC=81?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=BB=91=E5=AE=9A=E5=A4=9A=E4=B8=AAonedrive?= =?UTF-8?q?=E7=BD=91=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 0 admin.py | 146 ++++++++++-------- config.py.sample | 50 ++++++ data/README.md | 0 function.py | 247 ++++++++++++++---------------- requirements.txt | 0 run.py | 131 +++++++++++----- static/css/theme.css | 122 ++++++++++++++- static/img/bg-bottom.svg | 0 static/js/hashmap.js | 0 static/js/webuploader.min.js | 0 supervisord.conf.sample | 34 ++++ templates/_macro.html | 0 templates/admin/cache.html | 22 +-- templates/admin/edit.html | 2 +- templates/admin/install_0.html | 1 + templates/admin/install_1.html | 7 +- templates/admin/layout.html | 2 +- templates/admin/login.html | 2 +- templates/admin/manage.html | 61 ++++++-- templates/admin/setpass.html | 0 templates/admin/setting.html | 24 ++- templates/admin/upload.html | 18 ++- templates/admin/upload_local.html | 4 +- templates/footer.html | 0 templates/head.html | 0 templates/header.html | 32 ++-- templates/index.html | 12 +- templates/layout.html | 0 templates/password.html | 0 templates/readme.html | 0 templates/show/any.html | 0 templates/show/audio.html | 0 templates/show/code.html | 0 templates/show/image.html | 0 templates/show/video.html | 0 templates/show/video2.html | 0 upload/README.md | 0 38 files changed, 619 insertions(+), 298 deletions(-) mode change 100644 => 100755 README.md mode change 100644 => 100755 admin.py create mode 100755 config.py.sample mode change 100644 => 100755 data/README.md mode change 100644 => 100755 function.py mode change 100644 => 100755 requirements.txt mode change 100644 => 100755 run.py mode change 100644 => 100755 static/css/theme.css mode change 100644 => 100755 static/img/bg-bottom.svg mode change 100644 => 100755 static/js/hashmap.js mode change 100644 => 100755 static/js/webuploader.min.js create mode 100755 supervisord.conf.sample mode change 100644 => 100755 templates/_macro.html mode change 100644 => 100755 templates/admin/cache.html mode change 100644 => 100755 templates/admin/edit.html mode change 100644 => 100755 templates/admin/install_0.html mode change 100644 => 100755 templates/admin/install_1.html mode change 100644 => 100755 templates/admin/layout.html mode change 100644 => 100755 templates/admin/login.html mode change 100644 => 100755 templates/admin/manage.html mode change 100644 => 100755 templates/admin/setpass.html mode change 100644 => 100755 templates/admin/setting.html mode change 100644 => 100755 templates/admin/upload.html mode change 100644 => 100755 templates/admin/upload_local.html mode change 100644 => 100755 templates/footer.html mode change 100644 => 100755 templates/head.html mode change 100644 => 100755 templates/header.html mode change 100644 => 100755 templates/index.html mode change 100644 => 100755 templates/layout.html mode change 100644 => 100755 templates/password.html mode change 100644 => 100755 templates/readme.html mode change 100644 => 100755 templates/show/any.html mode change 100644 => 100755 templates/show/audio.html mode change 100644 => 100755 templates/show/code.html mode change 100644 => 100755 templates/show/image.html mode change 100644 => 100755 templates/show/video.html mode change 100644 => 100755 templates/show/video2.html mode change 100644 => 100755 upload/README.md diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/admin.py b/admin.py old mode 100644 new mode 100755 index 98c2462..5215ab8 --- a/admin.py +++ b/admin.py @@ -19,8 +19,8 @@ eventlet.monkey_patch() admin = Blueprint('admin', __name__,url_prefix='/admin') ############功能函数 -def set(key,value): - allow_key=['title','share_path','downloadUrl_timeout','allow_site','password','client_secret','client_id','tj_code'] +def set(key,value,user='A'): + allow_key=['title','downloadUrl_timeout','allow_site','password','client_secret','client_id','share_path','other_name','tj_code'] if key not in allow_key: return u'禁止修改' print 'set {}:{}'.format(key,value) @@ -28,29 +28,24 @@ def set(key,value): with open(config_path,'r') as f: old_text=f.read() with open(config_path,'w') as f: - if len(re.findall(key,old_text))>0: - if key=='allow_site': - value=value.split(',') - new_text=re.sub('{}=.*'.format(key),'{}={}'.format(key,value),old_text) - elif key=='tj_code': - new_text=re.sub('{}=.*'.format(key),'{}="""{}"""'.format(key,value),old_text) - else: - new_text=re.sub('{}=.*'.format(key),'{}="{}"'.format(key,value),old_text) + if key in ['client_secret','client_id','share_path','other_name']: + old_kv=re.findall('"{}":{{[\w\W]*?}}'.format(user),old_text)[0] + new_kv=re.sub('"{}":.*?,'.format(key),'"{}":"{}",'.format(key,value),old_kv) + new_text=old_text.replace(old_kv,new_kv) + elif key=='allow_site': + value=value.split(',') + new_text=re.sub('{}=.*'.format(key),'{}={}'.format(key,value),old_text) + elif key=='tj_code': + new_text=re.sub('{}=.*'.format(key),'{}="""{}"""'.format(key,value),old_text) else: - if key=='allow_site': - value=value.split(',') - new_text=old_text+'\n\n{}={}'.format(key,value) - elif key=='tj_code': - new_text=re.sub('{}=.*'.format(key),'{}="""{}"""'.format(key,value),old_text) - else: - new_text=old_text+'\n\n{}="{}"'.format(key,value) + new_text=re.sub('{}=.*'.format(key),'{}="{}"'.format(key,value),old_text) f.write(new_text) ############视图函数 @admin.before_request def before_request(): - if request.endpoint.startswith('admin') and request.endpoint!='admin.login' and request.endpoint!='admin.install' and session.get('login') is None: + if request.endpoint.startswith('admin') and request.endpoint!='admin.login' and session.get('login') is None: #and request.endpoint!='admin.install' return redirect(url_for('admin.login')) @@ -65,13 +60,11 @@ def web_console(): if action in ['UploadDir','Upload']: local=urllib.unquote(request.args.get('local')) remote=urllib.unquote(request.args.get('remote')) - cmd=["python","-u",os.path.join(config_dir,'function.py'),action,local,remote] + user=urllib.unquote(request.args.get('user')) + cmd=["python","-u",os.path.join(config_dir,'function.py'),action,local,remote,user] elif action=='UpdateFile': - dir_=request.args.get('dir') - if dir_=='/': - cmd=["python","-u",os.path.join(config_dir,'function.py'),action] - else: - cmd=["python","-u",os.path.join(config_dir,'function.py'),'Dir',dir_] + type_=request.args.get('type') + cmd=["python","-u",os.path.join(config_dir,'function.py'),'UpdateFile',type_] else: cmd=["python","-u",os.path.join(config_dir,'function.py'),action] p = g.run(cmd) @@ -89,7 +82,6 @@ def web_console(): def setting(): if request.method=='POST': title=request.form.get('title','PyOne') - share_path=request.form.get('share_path','/') downloadUrl_timeout=request.form.get('downloadUrl_timeout',5*60) allow_site=request.form.get('allow_site','no-referrer') tj_code=request.form.get('tj_code','') @@ -104,10 +96,16 @@ def setting(): new_password=password1 set('title',title) set('downloadUrl_timeout',downloadUrl_timeout) - set('share_path',share_path) set('allow_site',allow_site) set('tj_code',tj_code) set('password',new_password) + ####网盘信息处理 + for k,v in request.form.to_dict().items(): + if 'share_path' in k or 'other_name' in k: + user=re.findall('\[(.*?)\]',k)[0] + key=re.findall('(.*)\[',k)[0] + print('setting {}\'s {}\'s value {}'.format(user,key,v)) + set(key,v,user) reload() return render_template('admin/setting.html') return render_template('admin/setting.html') @@ -118,6 +116,7 @@ def setting(): @admin.route('/upload',methods=["POST","GET"]) def upload(): if request.method=='POST': + user=request.form.get('user').encode('utf-8') local=request.form.get('local').encode('utf-8') remote=request.form.get('remote').encode('utf-8') if not os.path.exists(local): @@ -127,7 +126,7 @@ def upload(): action='Upload' else: action='UploadDir' - return render_template('admin/upload.html',remote=remote,local=local,action=action) + return render_template('admin/upload.html',remote=remote,local=local,action=action,user=user) return render_template('admin/upload.html') @@ -135,8 +134,8 @@ def upload(): @admin.route('/cache',methods=["POST","GET"]) def cache(): if request.method=='POST': - dir_=request.form.get('dir') - return render_template('admin/cache.html',dir=dir_,action='UpdateFile') + type=request.form.get('type') + return render_template('admin/cache.html',type=type,action='UpdateFile') return render_template('admin/cache.html') @@ -144,11 +143,10 @@ def cache(): def manage(): if request.method=='POST': pass - path=urllib.unquote(request.args.get('path','/')) - if path=='': - path='/' - if path!='/' and path.startswith('/'): - path=re.sub('^/+','',path) + path=urllib.unquote(request.args.get('path','A:/')) + user,n_path=path.split(':') + if n_path=='': + path=':'.join([user,'/']) page=request.args.get('page',1,type=int) image_mode=request.args.get('image_mode') sortby=request.args.get('sortby') @@ -165,7 +163,9 @@ def manage(): order=order resp,total = FetchData(path=path,page=page,per_page=50,sortby=sortby,order=order) pagination=Pagination(query=None,page=page, per_page=50, total=total, items=None) - resp=make_response(render_template('admin/manage.html',pagination=pagination,items=resp,path=path,sortby=sortby,order=order,endpoint='admin.manage')) + if path.split(':',1)[-1]=='/': + path=':'.join([path.split(':',1)[0],'']) + resp=make_response(render_template('admin/manage.html',pagination=pagination,items=resp,path=path,sortby=sortby,order=order,cur_user=user,endpoint='admin.manage')) resp.set_cookie('admin_sortby',str(sortby)) resp.set_cookie('admin_order',str(order)) return resp @@ -175,9 +175,10 @@ def manage(): def edit(): if request.method=='POST': fileid=request.form.get('fileid') + user=request.form.get('user') content=request.form.get('content').encode('utf-8') info={} - token=GetToken() + token=GetToken(user=user) app_url=GetAppUrl() headers={'Authorization':'bearer {}'.format(token)} url=app_url+'v1.0/me/drive/items/{}/content'.format(fileid) @@ -193,6 +194,9 @@ def edit(): path=file['path'].replace('/'+name,'').replace(name,'') if path=='': path='/' + if not path.startswith('/'): + path='/'+path + path='{}:{}'.format(user,path) key='has_item$#$#$#$#{}$#$#$#$#{}'.format(path,name) rd.delete(key) else: @@ -204,19 +208,20 @@ def edit(): info['msg']='修改超时' return jsonify(info) fileid=request.args.get('fileid') + user=request.args.get('user') name=GetName(fileid) ext=name.split('.')[-1] language=CodeType(ext) if language is None: language='Text' - content=_remote_content(fileid) - return render_template('admin/edit.html',content=content,fileid=fileid,name=name,language=language) + content=_remote_content(fileid,user) + return render_template('admin/edit.html',content=content,fileid=fileid,name=name,language=language,cur_user=user) ###本地上传文件只onedrive,通过服务器中转 @admin.route('/upload_local',methods=['POST','GET']) def upload_local(): - remote_folder=request.args.get('path') - return render_template('admin/upload_local.html',remote_folder=remote_folder) + user,remote_folder=request.args.get('path').split(':') + return render_template('admin/upload_local.html',remote_folder=remote_folder,cur_user=user) @admin.route('/checkChunk', methods=['POST']) def checkChunk(): @@ -263,13 +268,14 @@ def recv_upload(): # 接收前端上传的一个分片 @admin.route('/to_one',methods=['GET']) def server_to_one(): + user=request.args.get('user') filename=request.args.get('filename').encode('utf-8') remote_folder=request.args.get('remote_folder').encode('utf-8') if remote_folder!='/': remote_folder=remote_folder+'/' local_dir=os.path.join(config_dir,'upload') filepath=urllib.unquote(os.path.join(local_dir,filename)) - _upload_session=Upload_for_server(filepath,remote_folder) + _upload_session=Upload_for_server(filepath,remote_folder,user) def read_status(): while 1: try: @@ -290,13 +296,14 @@ def server_to_one(): def setFile(filename=None): if request.method=='POST': path=request.form.get('path') + user,n_path=path.split(':') filename=request.form.get('filename') - if not path.startswith('/'): - path='/'+path - remote_file=os.path.join(path,filename) + if not n_path.startswith('/'): + n_path='/'+n_path + remote_file=os.path.join(n_path,filename) content=request.form.get('content').encode('utf-8') info={} - token=GetToken() + token=GetToken(user=user) app_url=GetAppUrl() headers={'Authorization':'bearer {}'.format(token)} url=app_url+'v1.0/me/drive/items/root:{}:/content'.format(remote_file) @@ -304,11 +311,9 @@ def setFile(filename=None): r=requests.put(url,headers=headers,data=content,timeout=10) data=json.loads(r.content) if data.get('id'): - AddResource(data) + AddResource(data,user) info['status']=0 info['msg']='添加成功' - if path.startswith('/') and path!='/': - path=path[1:] key='has_item$#$#$#$#{}$#$#$#$#{}'.format(path,filename) rd.delete(key) else: @@ -319,15 +324,17 @@ def setFile(filename=None): info['msg']='超时' return jsonify(info) path=urllib.unquote(request.args.get('path')) + user,n_path=path.split(':') _,fid,i=has_item(path,filename) if fid!=False: - return redirect(url_for('admin.edit',fileid=fid)) - return render_template('admin/setpass.html',path=path,filename=filename) + return redirect(url_for('admin.edit',fileid=fid,user=user)) + return render_template('admin/setpass.html',path=path,filename=filename,cur_user=user) @admin.route('/delete',methods=["POST"]) def delete(): ids=request.form.get('id') + user=request.form.get('user') if ids is None: return jsonify({'msg':u'请选择要删除的文件','status':0}) ids=ids.split('##') @@ -343,9 +350,14 @@ def delete(): path='/' else: path=items.find_one({'id':file['parent']})['path'] + if not path.startswith('/'): + path='/'+path + path='{}:{}'.format(user,path) key='has_item$#$#$#$#{}$#$#$#$#{}'.format(path,name) rd.delete(key) - status=DeleteRemoteFile(id) + kc='{}:content'.format(id) + rd.delete(kc) + status=DeleteRemoteFile(id,user) if status: infos['delete']+=1 else: @@ -356,25 +368,27 @@ def delete(): @admin.route('/add_folder',methods=['POST']) def AddFolder(): folder_name=request.form.get('folder_name') - grand_path=request.args.get('path') + path=request.args.get('path') + user,grand_path=path.split(':') if grand_path=='' or grand_path is None: grand_path='/' else: if grand_path.startswith('/'): grand_path=grand_path[1:] - result=CreateFolder(folder_name,grand_path) + result=CreateFolder(folder_name,grand_path,user) return jsonify({'result':result}) @admin.route('/move_file',methods=['POST']) def MoveFileToNewFolder(): fileid=request.form.get('fileid') + user=request.form.get('user') new_folder_path=request.form.get('new_folder_path') if new_folder_path=='' or new_folder_path is None: new_folder_path='/' else: if new_folder_path.startswith('/'): new_folder_path=new_folder_path[1:] - result=MoveFile(fileid,new_folder_path) + result=MoveFile(fileid,new_folder_path,user) return jsonify({'result':result}) @@ -402,7 +416,7 @@ def logout(): def reload(): cmd='supervisorctl -c {} restart pyone'.format(os.path.join(config_dir,'supervisord.conf')) subprocess.Popen(cmd,shell=True) - flash('正在重启网站...') + flash('正在重启网站...如果更改了分享目录,请更新缓存') return redirect(url_for('admin.setting')) @@ -411,18 +425,17 @@ def reload(): ###########################################安装 @admin.route('/install',methods=['POST','GET']) def install(): - if items.count()>0 or os.path.exists(os.path.join(config_dir,'data/token.json')): - return redirect('/') if request.method=='POST': step=request.form.get('step',type=int) + user=request.form.get('user') if step==1: client_secret=request.form.get('client_secret') client_id=request.form.get('client_id') redirect_uri='https://auth.3pp.me' - set('client_secret',client_secret) - set('client_id',client_id) + set('client_secret',client_secret,user) + set('client_id',client_id,user) login_url=LoginUrl.format(client_id=client_id,redirect_uri=redirect_uri) - return render_template('admin/install_1.html',client_secret=client_secret,client_id=client_id,login_url=login_url) + return render_template('admin/install_1.html',client_secret=client_secret,client_id=client_id,login_url=login_url,cur_user=user) else: client_secret=request.form.get('client_secret') client_id=request.form.get('client_id') @@ -435,18 +448,17 @@ def install(): r=requests.post(url,data=data,headers=headers) Atoken=json.loads(r.text) if Atoken.get('access_token'): - with open(os.path.join(config_dir,'data/Atoken.json'),'w') as f: + with open(os.path.join(config_dir,'data/{}_Atoken.json'.format(user)),'w') as f: json.dump(Atoken,f,ensure_ascii=False) - app_url=GetAppUrl() refresh_token=Atoken.get('refresh_token') - with open(os.path.join(config_dir,'data/AppUrl'),'w') as f: - f.write(app_url) - token=ReFreshToken(refresh_token) - with open(os.path.join(config_dir,'data/token.json'),'w') as f: + token=ReFreshToken(refresh_token,user) + with open(os.path.join(config_dir,'data/{}_token.json'.format(user)),'w') as f: json.dump(token,f,ensure_ascii=False) return make_response('

授权成功!点击进入首页
请在后台另开一个ssh窗口,运行:
python function.py UpdateFile
进行更新数据操作

') else: return jsonify(Atoken) - resp=render_template('admin/install_0.html',step=1) + step=request.args.get('step',type=int) + user=request.args.get('user','A') + resp=render_template('admin/install_0.html',step=step,cur_user=user) return resp diff --git a/config.py.sample b/config.py.sample new file mode 100755 index 0000000..79abd23 --- /dev/null +++ b/config.py.sample @@ -0,0 +1,50 @@ +#-*- coding=utf-8 -*- +import os + +#限制调用域名 +allow_site=[u'no-referrer'] + +#######源码目录 +config_dir="/home/centos/PyOne" +data_dir=os.path.join(config_dir,'data') + +#下载链接过期时间 +downloadUrl_timeout="300" + +#后台密码设置 +password="pyone210210" + +#网站名称 +title="资源整合" + +tj_code="""""" + +#onedrive api设置 +redirect_uri='https://auth.3pp.me/' #不要修改! +BaseAuthUrl='https://login.microsoftonline.com' +app_url=u'https://graph.microsoft.com/' + +od_users={ + "A":{ + "client_id":"d7d69676-b925-4714-a9bd-2200e3972179", + "client_secret":"cpmRN8154|-jfmmNMMVI3*:", + "share_path":"/日剧", + "other_name":"日日香", + "order":1 + }, + "B":{ + "client_id":"32489f67-d11d-4dc9-9352-ed7e95916d6c", + "client_secret":"sakUNW#iiyxQLDM01186={=", + "share_path":"/", + "other_name":"网盘2区", + "order":2 + }, + "C":{ + "client_id":"", + "client_secret":"", + "share_path":"/", + "other_name":"网盘3区", + "order":3 + } +} + diff --git a/data/README.md b/data/README.md old mode 100644 new mode 100755 diff --git a/function.py b/function.py old mode 100644 new mode 100755 index c9294cd..7a83e5e --- a/function.py +++ b/function.py @@ -24,7 +24,7 @@ from config import * from pymongo import MongoClient,ASCENDING,DESCENDING ######mongodb client = MongoClient('localhost',27017) -db=client.two +db=client.three items=db.items rd=Redis(host='localhost',port=6379) @@ -40,13 +40,15 @@ headers={'User-Agent':'ISV|PyOne|PyOne/2.0'} def convert2unicode(string): return string.encode('utf-8') -def get_value(key): +def get_value(key,user='A'): allow_key=['client_secret','client_id'] if key not in allow_key: return u'禁止获取' config_path=os.path.join(config_dir,'config.py') with open(config_path,'r') as f: - value=re.findall('{}="(.*)"'.format(key),f.read())[0] + text=f.read() + kv=re.findall('"{}":{{[\w\W]*?}}'.format(user),text)[0] + value=re.findall('"{}":"(.*?)"'.format(key),kv)[0] return value def GetName(id): @@ -86,9 +88,9 @@ def open_json(filepath): return token return token -def ReFreshToken(refresh_token): - client_id=get_value('client_id') - client_secret=get_value('client_secret') +def ReFreshToken(refresh_token,user='A'): + client_id=get_value('client_id',user) + client_secret=get_value('client_secret',user) headers['Content-Type']='application/x-www-form-urlencoded' data=ReFreshData.format(client_id=client_id,redirect_uri=urllib.quote(redirect_uri),client_secret=client_secret,refresh_token=refresh_token) url=OAuthUrl @@ -96,22 +98,23 @@ def ReFreshToken(refresh_token): return json.loads(r.text) -def GetToken(Token_file='token.json'): +def GetToken(Token_file='token.json',user='A'): + Token_file='{}_{}'.format(user,Token_file) if os.path.exists(os.path.join(data_dir,Token_file)): token=open_json(os.path.join(data_dir,Token_file)) try: if time.time()>int(token.get('expires_on')): print 'token timeout' refresh_token=token.get('refresh_token') - token=ReFreshToken(refresh_token) + token=ReFreshToken(refresh_token,user) if token.get('access_token'): with open(os.path.join(data_dir,Token_file),'w') as f: json.dump(token,f,ensure_ascii=False) except: - with open(os.path.join(data_dir,'Atoken.json'),'r') as f: + with open(os.path.join(data_dir,'{}_Atoken.json'.format(user)),'r') as f: Atoken=json.load(f) refresh_token=Atoken.get('refresh_token') - token=ReFreshToken(refresh_token) + token=ReFreshToken(refresh_token,user) token['expires_on']=str(time.time()+3599) if token.get('access_token'): with open(os.path.join(data_dir,Token_file),'w') as f: @@ -122,27 +125,7 @@ def GetToken(Token_file='token.json'): def GetAppUrl(): - global app_url - if os.path.exists(os.path.join(data_dir,'AppUrl')): - with open(os.path.join(data_dir,'AppUrl'),'r') as f: - app_url=f.read().strip() - return app_url - else: - # if od_type=='business': - # token=GetToken(Token_file='Atoken.json') - # print 'token:',token - # if token: - # header={'Authorization': 'Bearer {}'.format(token)} - # url='https://api.office.com/discovery/v1.0/me/services' - # r=requests.get(url,headers=header) - # retdata=json.loads(r.text) - # print retdata - # if retdata.get('value'): - # return retdata.get('value')[0]['serviceResourceId'] - # return False - # else: - # return app_url - return app_url + return 'https://graph.microsoft.com/' ################################################################################ ###############################onedrive操作函数################################# @@ -156,21 +139,23 @@ def GetExt(name): def date_to_char(date): return date.strftime('%Y/%m/%d') -def Dir(path=u'/'): +def Dir(path=u'A:/'): app_url=GetAppUrl() - if path=='/': + user,n_path=path.split(':') + print('update {}\'s file'.format(user)) + if n_path=='/': BaseUrl=app_url+u'v1.0/me/drive/root/children?expand=thumbnails' # items.remove() queue=Queue() # queue.put(dict(url=BaseUrl,grandid=grandid,parent=parent,trytime=1)) - g=GetItemThread(queue) + g=GetItemThread(queue,user) g.GetItem(BaseUrl) queue=g.queue if queue.qsize()==0: return tasks=[] for i in range(min(5,queue.qsize())): - t=GetItemThread(queue) + t=GetItemThread(queue,user) t.start() tasks.append(t) for t in tasks: @@ -178,60 +163,45 @@ def Dir(path=u'/'): RemoveRepeatFile() else: grandid=0 - parent_id='' - parent=None - if path.endswith('/'): - path=path[:-1] - if not path.startswith('/'): - path='/'+path - if items.find_one({'grandid':0,'type':'folder'}): - for idx,p in enumerate(path[1:].split('/')): - if parent_id=='': - parent=items.find_one({'name':p,'grandid':idx}) - parent_id=parent['id'] - else: - parent=items.find_one({'name':p,'grandid':idx,'parent':parent_id}) - parent_id=parent['id'] - # items.delete_many({'parent':parent_id}) - grandid=idx+1 - path=urllib.quote(path) - BaseUrl=app_url+u'v1.0/me/drive/root:{}:/children?expand=thumbnails'.format(path) - checkUrl=app_url+u'v1.0/me/drive/root:{}:/'.format(path) + parent='' + if n_path.endswith('/'): + n_path=n_path[:-1] + if not n_path.startswith('/'): + n_path='/'+n_path + n_path=urllib.quote(n_path) + BaseUrl=app_url+u'v1.0/me/drive/root:{}:/children?expand=thumbnails'.format(n_path) queue=Queue() # queue.put(dict(url=BaseUrl,grandid=grandid,parent=parent,trytime=1)) - g=GetItemThread(queue) - # g.GetItem(BaseUrl,grandid,parent_id,1) - # queue=g.queue - # if queue.qsize()==0: - # return - if parent: - item_remote=g.GetItemByUrl(checkUrl) - if parent['size_order']==item_remote['size']: - return + g=GetItemThread(queue,user) + g.GetItem(BaseUrl,grandid,parent,1) + queue=g.queue + if queue.qsize()==0: + return tasks=[] for i in range(min(10,queue.qsize())): - t=GetItemThread(queue) + t=GetItemThread(queue,user) t.start() tasks.append(t) for t in tasks: t.join() RemoveRepeatFile() -def Dir_all(path=u'/'): +def Dir_all(path=u'A:/'): app_url=GetAppUrl() - if path=='/': + user,n_path=path.split(':') + print('update {}\'s {} file'.format(user,n_path)) + if n_path=='/': BaseUrl=app_url+u'v1.0/me/drive/root/children?expand=thumbnails' - items.remove() + items.remove({'user':user}) queue=Queue() - # queue.put(dict(url=BaseUrl,grandid=grandid,parent=parent,trytime=1)) - g=GetItemThread(queue) + g=GetItemThread(queue,user) g.GetItem(BaseUrl) queue=g.queue if queue.qsize()==0: return tasks=[] for i in range(min(5,queue.qsize())): - t=GetItemThread(queue) + t=GetItemThread(queue,user) t.start() tasks.append(t) for t in tasks: @@ -240,32 +210,31 @@ def Dir_all(path=u'/'): else: grandid=0 parent='' - if path.endswith('/'): - path=path[:-1] - if not path.startswith('/'): - path='/'+path - if items.find_one({'grandid':0,'type':'folder'}): + if n_path.endswith('/'): + n_path=n_path[:-1] + if not n_path.startswith('/'): + n_path='/'+n_path + if items.find_one({'grandid':0,'type':'folder','user':user}): parent_id=0 - for idx,p in enumerate(path[1:].split('/')): + for idx,p in enumerate(n_path[1:].split('/')): if parent_id==0: - parent_id=items.find_one({'name':p,'grandid':idx})['id'] + parent_id=items.find_one({'name':p,'grandid':idx,'user':user})['id'] else: parent_id=items.find_one({'name':p,'grandid':idx,'parent':parent_id})['id'] items.delete_many({'parent':parent_id}) grandid=idx+1 parent=parent_id - path=urllib.quote(path) - BaseUrl=app_url+u'v1.0/me/drive/root:{}:/children?expand=thumbnails'.format(path) + n_path=urllib.quote(n_path) + BaseUrl=app_url+u'v1.0/me/drive/root:{}:/children?expand=thumbnails'.format(n_path) queue=Queue() - # queue.put(dict(url=BaseUrl,grandid=grandid,parent=parent,trytime=1)) - g=GetItemThread(queue) + g=GetItemThread(queue,user) g.GetItem(BaseUrl,grandid,parent,1) queue=g.queue if queue.qsize()==0: return tasks=[] for i in range(min(10,queue.qsize())): - t=GetItemThread(queue) + t=GetItemThread(queue,user) t.start() tasks.append(t) for t in tasks: @@ -273,9 +242,11 @@ def Dir_all(path=u'/'): RemoveRepeatFile() class GetItemThread(Thread): - def __init__(self,queue): + def __init__(self,queue,user): super(GetItemThread,self).__init__() self.queue=queue + self.user=user + share_path=od_users.get(user).get('share_path') if share_path=='/': self.share_path=share_path else: @@ -303,7 +274,7 @@ class GetItemThread(Thread): def GetItem(self,url,grandid=0,parent='',trytime=1): app_url=GetAppUrl() - token=GetToken() + token=GetToken(user=self.user) print(u'getting files from url {}'.format(url)) header={'Authorization': 'Bearer {}'.format(token)} try: @@ -326,6 +297,7 @@ class GetItemThread(Thread): else: items.delete_one({'id':value['id']}) item['type']='folder' + item['user']=self.user item['order']=0 item['name']=convert2unicode(value['name']) item['id']=convert2unicode(value['id']) @@ -343,6 +315,7 @@ class GetItemThread(Thread): path=path[1:] if path=='': path=convert2unicode(value['name']) + path='{}:/{}'.format(self.user,path) item['path']=path subfodler=items.insert_one(item) if value.get('folder').get('childCount')==0: @@ -364,7 +337,9 @@ class GetItemThread(Thread): path=path[1:] if path=='': path=convert2unicode(value['name']) + path='{}:/{}'.format(self.user,path) item['path']=path + item['user']=self.user item['name']=convert2unicode(value['name']) item['id']=convert2unicode(value['id']) item['size']=humanize.naturalsize(value['size'], gnu=True) @@ -394,7 +369,7 @@ class GetItemThread(Thread): def GetItemByPath(self,path): app_url=GetAppUrl() - token=GetToken() + token=GetToken(user=self.user) if path=='' or path=='/': url=app_url+u'v1.0/me/drive/root/' if path=='/': @@ -407,19 +382,19 @@ class GetItemThread(Thread): def GetItemByUrl(self,url): app_url=GetAppUrl() - token=GetToken() + token=GetToken(user=self.user) header={'Authorization': 'Bearer {}'.format(token)} r=requests.get(url,headers=header) data=json.loads(r.content) return data -def GetRootid(): - key='rootid' +def GetRootid(user='A'): + key='{}:rootid'.format(user) if rd.exists(key): return rd.get(key) else: app_url=GetAppUrl() - token=GetToken() + token=GetToken(user=user) url=app_url+u'v1.0/me/drive/root/' header={'Authorization': 'Bearer {}'.format(token)} r=requests.get(url,headers=header) @@ -430,14 +405,20 @@ def GetRootid(): def UpdateFile(renew='all'): if renew=='all': items.remove() - Dir_all(share_path) + for user,item in od_users.items(): + if item.get('client_id')!='': + share_path='{}:{}'.format(user,item['share_path']) + Dir_all(share_path) else: - Dir(share_path) + for user,item in od_users.items(): + if item.get('client_id')!='': + share_path='{}:{}'.format(user,item['share_path']) + Dir(share_path) print('update file success!') -def FileExists(filename): - token=GetToken() +def FileExists(filename,user='A'): + token=GetToken(user=user) headers={'Authorization':'bearer {}'.format(token),'Content-Type':'application/json'} search_url=app_url+"v1.0/me/drive/root/search(q='{}')".format(filename) r=requests.get(search_url,headers=headers) @@ -447,8 +428,8 @@ def FileExists(filename): else: return True -def FileInfo(fileid): - token=GetToken() +def FileInfo(fileid,user='A'): + token=GetToken(user=user) headers={'Authorization':'bearer {}'.format(token),'Content-Type':'application/json'} search_url=app_url+"v1.0/me/drive/items/{}".format(fileid) r=requests.get(search_url,headers=headers) @@ -501,8 +482,8 @@ def _file_content(path,offset,length): -def _upload(filepath,remote_path): #remote_path like 'share/share.mp4' - token=GetToken() +def _upload(filepath,remote_path,user='A'): #remote_path like 'share/share.mp4' + token=GetToken(user=user) headers={'Authorization':'bearer {}'.format(token)} url=app_url+'v1.0/me/drive/root:'+urllib.quote(remote_path)+':/content' r=requests.put(url,headers=headers,data=open(filepath,'rb')) @@ -516,7 +497,7 @@ def _upload(filepath,remote_path): #remote_path like 'share/share.mp4' break elif r.status_code==201 or r.status_code==200: print('upload {} success!'.format(filepath)) - AddResource(data) + AddResource(data,user) yield {'status':'upload success!'} break else: @@ -589,7 +570,7 @@ def _GetAllFile(parent_id="",parent_path="",filelist=[]): return filelist -def AddResource(data): +def AddResource(data,user='A'): #检查父文件夹是否在数据库,如果不在则获取添加 grand_path=data.get('parentReference').get('path').replace('/drive/root:','') if grand_path=='': @@ -625,6 +606,7 @@ def AddResource(data): item={} item['type']='file' item['name']=data.get('name') + item['user']=user item['id']=data.get('id') item['size']=humanize.naturalsize(data.get('size'), gnu=True) item['size_order']=data.get('size') @@ -653,8 +635,8 @@ def AddResource(data): items.insert_one(item) -def CreateUploadSession(path): - token=GetToken() +def CreateUploadSession(path,user='A'): + token=GetToken(user=user) headers={'Authorization':'bearer {}'.format(token),'Content-Type':'application/json'} url=app_url+'v1.0/me/drive/root:'+urllib.quote(path)+':/createUploadSession' data={ @@ -674,8 +656,7 @@ def CreateUploadSession(path): print('error to opreate CreateUploadSession("{}"),reason {}'.format(path,e)) return False -def UploadSession(uploadUrl, filepath): - token=GetToken() +def UploadSession(uploadUrl, filepath,user): length=327680*10 offset=0 trytime=1 @@ -685,7 +666,7 @@ def UploadSession(uploadUrl, filepath): code=result['code'] #上传完成 if code==0: - AddResource(result['info']) + AddResource(result['info'],user) yield {'status':'upload success!'} break #分片上传成功 @@ -710,8 +691,8 @@ def UploadSession(uploadUrl, filepath): -def Upload_for_server(filepath,remote_path=None): - token=GetToken() +def Upload_for_server(filepath,remote_path=None,user='A'): + token=GetToken(user=user) headers={'Authorization':'bearer {}'.format(token),'Content-Type':'application/json'} if remote_path is None: remote_path=os.path.basename(filepath) @@ -721,24 +702,24 @@ def Upload_for_server(filepath,remote_path=None): remote_path='/'+remote_path print('local file path:{}, remote file path:{}'.format(filepath,remote_path)) if _filesize(filepath)<1024*1024*3.25: - for msg in _upload(filepath,remote_path): + for msg in _upload(filepath,remote_path,user): yield msg else: - session_data=CreateUploadSession(remote_path) + session_data=CreateUploadSession(remote_path,user) if session_data==False: yield {'status':'file exists!'} else: if session_data.get('uploadUrl'): uploadUrl=session_data.get('uploadUrl') - for msg in UploadSession(uploadUrl,filepath): + for msg in UploadSession(uploadUrl,filepath,user): yield msg else: print(session_data.get('error').get('msg')) print('create upload session fail! {}'.format(remote_path)) yield {'status':'create upload session fail!'} -def Upload(filepath,remote_path=None): - token=GetToken() +def Upload(filepath,remote_path=None,user='A'): + token=GetToken(user=user) headers={'Authorization':'bearer {}'.format(token),'Content-Type':'application/json'} if remote_path is None: remote_path=os.path.basename(filepath) @@ -747,16 +728,16 @@ def Upload(filepath,remote_path=None): if not remote_path.startswith('/'): remote_path='/'+remote_path if _filesize(filepath)<1024*1024*3.25: - for msg in _upload(filepath,remote_path): + for msg in _upload(filepath,remote_path,user): 1 else: - session_data=CreateUploadSession(remote_path) + session_data=CreateUploadSession(remote_path,user) if session_data==False: return {'status':'file exists!'} else: if session_data.get('uploadUrl'): uploadUrl=session_data.get('uploadUrl') - for msg in UploadSession(uploadUrl,filepath): + for msg in UploadSession(uploadUrl,filepath,user): 1 else: print(session_data.get('error').get('msg')) @@ -765,17 +746,18 @@ def Upload(filepath,remote_path=None): class MultiUpload(Thread): - def __init__(self,waiting_queue): + def __init__(self,waiting_queue,user): super(MultiUpload,self).__init__() self.queue=waiting_queue + self.user=user def run(self): while not self.queue.empty(): localpath,remote_dir=self.queue.get() - Upload(localpath,remote_dir) + Upload(localpath,remote_dir,self.user) -def UploadDir(local_dir,remote_dir,threads=5): +def UploadDir(local_dir,remote_dir,user,threads=5): print(u'geting file from dir {}'.format(local_dir)) localfiles=list_all_files(local_dir) print(u'get {} files from dir {}'.format(len(localfiles),local_dir)) @@ -827,7 +809,7 @@ def UploadDir(local_dir,remote_dir,threads=5): print "start upload files 5s later" time.sleep(5) for i in range(min(threads,queue.qsize())): - t=MultiUpload(queue) + t=MultiUpload(queue,user) t.start() tasks.append(t) for t in tasks: @@ -841,9 +823,9 @@ def UploadDir(local_dir,remote_dir,threads=5): def DeleteLocalFile(fileid): items.remove({'id':fileid}) -def DeleteRemoteFile(fileid): +def DeleteRemoteFile(fileid,user='A'): app_url=GetAppUrl() - token=GetToken() + token=GetToken(user=user) headers={'Authorization':'bearer {}'.format(token)} url=app_url+'v1.0/me/drive/items/'+fileid r=requests.delete(url,headers=headers) @@ -855,15 +837,16 @@ def DeleteRemoteFile(fileid): return False ######################## -def CreateFolder(folder_name,grand_path): +def CreateFolder(folder_name,grand_path,user='A'): app_url=GetAppUrl() - token=GetToken() + token=GetToken(user=user) if grand_path=='' or grand_path is None or grand_path=='/': url=app_url+'v1.0/me/drive/root/children' parent_id='' grandid=0 else: - parent=items.find_one({'path':grand_path}) + path='{}:/{}'.format(user,grand_path) + parent=items.find_one({'path':path}) parent_id=parent['id'] grandid=parent['grandid']+1 url=app_url+'v1.0/me/drive/items/{}/children'.format(parent['id']) @@ -877,8 +860,10 @@ def CreateFolder(folder_name,grand_path): data=json.loads(r.content) if data.get('id'): #插入数据 + share_path=od_users.get(user).get('share_path') item={} item['type']='folder' + item['user']=user item['name']=data.get('name') item['id']=data.get('id') item['size']=humanize.naturalsize(data.get('size'), gnu=True) @@ -890,27 +875,29 @@ def CreateFolder(folder_name,grand_path): path=convert2unicode(data['name']) else: path=grand_path.replace(share_path,'',1)+'/'+convert2unicode(data['name']) - if path.startswith('/') and path!='/': - path=path[1:] + if not path.startswith('/'): + path='/'+path + path='{}:{}'.format(user,path) item['path']=path - item['order']=2 + item['order']=0 items.insert_one(item) return True else: print(data.get('error').get('msg')) return False -def MoveFile(fileid,new_folder_path): +def MoveFile(fileid,new_folder_path,user='A'): app_url=GetAppUrl() - token=GetToken() + token=GetToken(user=user) #GetRootid if new_folder_path=='' or new_folder_path is None or new_folder_path=='/': - folder_id=GetRootid() + folder_id=GetRootid(user) parent='' grandid=0 path=GetName(fileid) else: - parent_item=items.find_one({'path':new_folder_path}) + path='{}:/{}'.format(user,new_folder_path) + parent_item=items.find_one({'path':path}) folder_id=parent_item['id'] parent=parent_item['id'] grandid=parent_item['grandid']+1 diff --git a/requirements.txt b/requirements.txt old mode 100644 new mode 100755 diff --git a/run.py b/run.py old mode 100644 new mode 100755 index d7247a9..24f7740 --- a/run.py +++ b/run.py @@ -1,3 +1,4 @@ + #-*- coding=utf-8 -*- from flask import Flask,render_template,redirect,abort,make_response,jsonify,request,url_for,Response from flask_sqlalchemy import Pagination @@ -43,23 +44,24 @@ def md5(string): a.update(string.encode(encoding='utf-8')) return a.hexdigest() -def GetTotal(path): +def GetTotal(path='A:/'): key='total:{}'.format(path) if rd.exists(key): return int(rd.get(key)) else: - if path=='/': + user,n_path=path.split(':') + if n_path=='/': total=items.find({'grandid':0}).count() else: f=items.find_one({'path':path}) pid=f['id'] total=items.find({'parent':pid}).count() - rd.set(key,total,300) + rd.set(key,total,300) return total # @cache.memoize(timeout=60*5) -def FetchData(path='/',page=1,per_page=50,sortby='lastModtime',order='desc',dismiss=False): +def FetchData(path='A:/',page=1,per_page=50,sortby='lastModtime',order='desc',dismiss=False): path=urllib.unquote(path) resp=[] if sortby not in ['lastModtime','type','size','name']: @@ -71,8 +73,9 @@ def FetchData(path='/',page=1,per_page=50,sortby='lastModtime',order='desc',dism else: order=ASCENDING try: - if path=='/': - data=items.find({'grandid':0}).collation({"locale": "zh", 'numericOrdering':True})\ + user,n_path=path.split(':') + if n_path=='/': + data=items.find({'grandid':0,'user':user}).collation({"locale": "zh", 'numericOrdering':True})\ .sort([('order',ASCENDING),(sortby,order)])\ .limit(per_page).skip((page-1)*per_page) for d in data: @@ -115,9 +118,9 @@ def FetchData(path='/',page=1,per_page=50,sortby='lastModtime',order='desc',dism return resp,total @cache.memoize(timeout=60*5) -def _thunbnail(id): +def _thunbnail(id,user): app_url=GetAppUrl() - token=GetToken() + token=GetToken(user=user) headers={'Authorization':'bearer {}'.format(token),'Content-type':'application/json'} url=app_url+'v1.0/me/drive/items/{}/thumbnails/0?select=large'.format(id) r=requests.get(url,headers=headers) @@ -128,13 +131,13 @@ def _thunbnail(id): return False @cache.memoize(timeout=60*5) -def _getdownloadurl(id): +def _getdownloadurl(id,user): app_url=GetAppUrl() - token=GetToken() + token=GetToken(user=user) filename=GetName(id) ext=filename.split('.')[-1] if ext in ['webm','avi','mpg', 'mpeg', 'rm', 'rmvb', 'mov', 'wmv', 'mkv', 'asf']: - downloadUrl=_thunbnail(id) + downloadUrl=_thunbnail(id,user) downloadUrl=downloadUrl.replace('thumbnail','videomanifest')+'&part=index&format=dash&useScf=True&pretranscode=0&transcodeahead=0' return downloadUrl else: @@ -147,12 +150,12 @@ def _getdownloadurl(id): else: return False -def GetDownloadUrl(id): +def GetDownloadUrl(id,user): if rd.exists('downloadUrl2:{}'.format(id)): downloadUrl,ftime=rd.get('downloadUrl2:{}'.format(id)).split('####') if time.time()-int(ftime)>=600: # print('{} downloadUrl expired!'.format(id)) - downloadUrl=_getdownloadurl(id) + downloadUrl=_getdownloadurl(id,user) ftime=int(time.time()) k='####'.join([downloadUrl,str(ftime)]) rd.set('downloadUrl2:{}'.format(id),k) @@ -161,7 +164,7 @@ def GetDownloadUrl(id): downloadUrl=downloadUrl else: # print('first time get downloadUrl from {}'.format(id)) - downloadUrl=_getdownloadurl(id) + downloadUrl=_getdownloadurl(id,user) ftime=int(time.time()) k='####'.join([downloadUrl,str(ftime)]) rd.set('downloadUrl2:{}'.format(id),k) @@ -240,12 +243,12 @@ def file_ico(item): return "insert_drive_file"; -def _remote_content(fileid): +def _remote_content(fileid,user): kc='{}:content'.format(fileid) if rd.exists(kc): return rd.get(kc) else: - downloadUrl=GetDownloadUrl(fileid) + downloadUrl=GetDownloadUrl(fileid,user) if downloadUrl: r=requests.get(downloadUrl) r.encoding='utf-8' @@ -280,10 +283,11 @@ def has_item(path,name): if name=='.password': dz=True try: - if path=='/': - if items.find_one({'grandid':0,'name':name}): - fid=items.find_one({'grandid':0,'name':name})['id'] - item=_remote_content(fid).strip() + user,n_path=path.split(':') + if n_path=='/': + if items.find_one({'grandid':0,'name':name,'user':user}): + fid=items.find_one({'grandid':0,'name':name,'user':user})['id'] + item=_remote_content(fid,user).strip() else: route=path.split('/') if name=='.password': @@ -294,7 +298,7 @@ def has_item(path,name): data=items.find_one({'name':name,'parent':pid}) if data: fid=data['id'] - item=_remote_content(fid).strip() + item=_remote_content(fid,user).strip() if idx==len(route)-1: cur=True else: @@ -303,7 +307,7 @@ def has_item(path,name): data=items.find_one({'name':name,'parent':pid}) if data: fid=data['id'] - item=_remote_content(fid).strip() + item=_remote_content(fid,user).strip() except: item=False rd.set(key,'{}########{}########{}'.format(item,fid,cur)) @@ -337,16 +341,54 @@ def has_verify(path): def path_list(path): - if path=='/': - return [path] - if path.startswith('/'): - path=path[1:] - if path.endswith('/'): - path=path[:-1] - plist=path.split('/') + if path.split(':')=='': + plist=[path+'/'] + else: + user,n_path=path.split(':') + if n_path.startswith('/'): + n_path=n_path[1:] + if n_path.endswith('/'): + n_path=n_path[:-1] + plist=n_path.split('/') + plist=['{}:/{}'.format(user,plist[0])]+plist[1:] return plist + +def get_od_user(): + config_path=os.path.join(config_dir,'config.py') + with open(config_path,'r') as f: + text=f.read() + users=json.loads(re.findall('od_users=([\w\W]*})',text)[0]) + ret=[] + for user,value in users.items(): + if value.get('client_id')!='': + #userid,username,endpoint,sharepath,order, + ret.append( + ( + user, + value.get('other_name'), + '/{}:'.format(user), + value.get('share_path'), + value.get('order') + ) + ) + else: + ret.append( + ( + user, + '添加网盘', + url_for('admin.install',step=0,user=user), + value.get('share_path'), + value.get('order') + ) + ) + ret=sorted(ret,key=lambda x:x[-1],reverse=False) + return ret + + + + ################################################################################ ###################################试图函数##################################### ################################################################################ @@ -370,23 +412,26 @@ def before_request(): @app.route('/',methods=['POST','GET']) @app.route('/',methods=['POST','GET']) @limiter.limit("200/minute;50/second") -def index(path='/'): +def index(path='A:/'): if path=='favicon.ico': return redirect('https://onedrive.live.com/favicon.ico') if items.count()==0: - if not os.path.exists(os.path.join(config_dir,'data/token.json')): - return redirect(url_for('admin.install',step=0)) + if not os.path.exists(os.path.join(config_dir,'data/.install')): + return redirect(url_for('admin.install',step=0,user='A')) else: #subprocess.Popen('python {} UpdateFile'.format(os.path.join(config_dir,'function.py')),shell=True) return make_response('

正在更新数据!如果您是网站管理员,请在后台运行命令:python function.py UpdateFile

') #参数 + user,n_path=path.split(':') + if n_path=='': + path=':'.join([user,'/']) page=request.args.get('page',1,type=int) image_mode=request.args.get('image_mode') sortby=request.args.get('sortby') order=request.args.get('order') resp,total = FetchData(path=path,page=page,per_page=50,sortby=sortby,order=order,dismiss=True) if total=='files': - return show(resp['id']) + return show(resp['id'],user) #是否有密码 password,_,cur=has_item(path,'.password') md5_p=md5(path) @@ -422,6 +467,8 @@ def index(path='/'): #参数 resp,total = FetchData(path=path,page=page,per_page=50,sortby=sortby,order=order,dismiss=True) pagination=Pagination(query=None,page=page, per_page=50, total=total, items=None) + if path.split(':',1)[-1]=='/': + path=':'.join([path.split(':',1)[0],'']) resp=make_response(render_template('index.html' ,pagination=pagination ,items=resp @@ -433,21 +480,22 @@ def index(path='/'): ,ext_d=ext_d ,sortby=sortby ,order=order + ,cur_user=user ,endpoint='.index')) resp.set_cookie('image_mode',str(image_mode)) resp.set_cookie('sortby',str(sortby)) resp.set_cookie('order',str(order)) return resp -@app.route('/file/') -def show(fileid): +@app.route('/file//') +def show(fileid,user): name=GetName(fileid) ext=name.split('.')[-1].lower() path=GetPath(fileid) if request.method=='POST': url=request.url.replace(':80','').replace(':443','') if ext in ['csv','doc','docx','odp','ods','odt','pot','potm','potx','pps','ppsx','ppsxm','ppt','pptm','pptx','rtf','xls','xlsx']: - downloadUrl=GetDownloadUrl(fileid) + downloadUrl=GetDownloadUrl(fileid,user) url = 'https://view.officeapps.live.com/op/view.aspx?src='+urllib.quote(downloadUrl) return redirect(url) elif ext in ['bmp','jpg','jpeg','png','gif']: @@ -461,18 +509,18 @@ def show(fileid): elif ext in ['ogg','mp3','wav']: return render_template('show/audio.html',url=url,path=path) elif CodeType(ext) is not None: - content=_remote_content(fileid) + content=_remote_content(fileid,user) return render_template('show/code.html',content=content,url=url,language=CodeType(ext),path=path) else: - downloadUrl=GetDownloadUrl(fileid) + downloadUrl=GetDownloadUrl(fileid,user) return redirect(downloadUrl) else: if 'no-referrer' in allow_site: - downloadUrl=GetDownloadUrl(fileid) + downloadUrl=GetDownloadUrl(fileid,user) resp=redirect(downloadUrl) return resp elif sum([i in referrer for i in allow_site])>0: - downloadUrl=GetDownloadUrl(fileid) + downloadUrl=GetDownloadUrl(fileid,user) return redirect(downloadUrl) else: return abort(404) @@ -504,8 +552,9 @@ app.jinja_env.globals['re']=re app.jinja_env.globals['file_ico']=file_ico app.jinja_env.globals['title']=title app.jinja_env.globals['tj_code']=tj_code if tj_code is not None else '' +app.jinja_env.globals['get_od_user']=get_od_user app.jinja_env.globals['allow_site']=','.join(allow_site) -app.jinja_env.globals['share_path']=share_path +# app.jinja_env.globals['share_path']=od_users.get('A').get('share_path') app.jinja_env.globals['downloadUrl_timeout']=downloadUrl_timeout ################################################################################ #####################################启动####################################### diff --git a/static/css/theme.css b/static/css/theme.css old mode 100644 new mode 100755 index 4220cfd..f2e6768 --- a/static/css/theme.css +++ b/static/css/theme.css @@ -1 +1,121 @@ -body{background-color:#f2f5fa;padding-bottom:60px;background-image:url(../img/bg-bottom.svg);background-position:50% 100%;background-repeat:no-repeat;background-attachment:fixed}.nexmoe-item{margin:20px -8px 0!important;padding:15px!important;border-radius:5px;background-color:#fff;-webkit-box-shadow:0 .5em 3em rgba(161,177,204,.4);box-shadow:0 .5em 3em rgba(161,177,204,.4);background-color:#fff}.mdui-img-fluid,.mdui-video-fluid{border-radius:5px;border:1px solid #eee}.mdui-list{padding:0}.mdui-list-item{margin:0!important;border-radius:5px;padding:0 10px 0 5px!important;border:1px solid #eee;margin-bottom:10px!important}.mdui-list-item:last-child{margin-bottom:0!important}.mdui-list-item:first-child{border:none}.mdui-toolbar{width:auto;margin-top:60px!important}.mdui-appbar .mdui-toolbar{height:56px;font-size:16px}.mdui-toolbar>*{padding:0 6px;margin:0 2px;opacity:.5}.mdui-toolbar>.mdui-typo-headline{padding:0 16px 0 0}.mdui-toolbar>i{padding:0}.mdui-toolbar>a:hover,a.mdui-typo-headline,a.active{opacity:1}.mdui-container{max-width:980px}.mdui-list>.th{background-color:initial}.mdui-list-item>a{width:100%;line-height:48px}.mdui-toolbar>a{padding:0 16px;line-height:30px;border-radius:30px;border:1px solid #eee}.mdui-toolbar>a:last-child{opacity:1;background-color:#1e89f2;color:#ffff}@media screen and (max-width:980px){.mdui-list-item .mdui-text-right{display:none}.mdui-container{width:100%!important;margin:0}.mdui-toolbar>*{display:none}.mdui-toolbar>a:last-child,.mdui-toolbar>.mdui-typo-headline,.mdui-toolbar>i:first-child{display:block}} +body { + background-color: #f2f5fa; + padding-bottom: 60px; + background-image: url(../img/bg-bottom.svg); + background-position: 50% 100%; + background-repeat: no-repeat; + background-attachment: fixed +} + +.nexmoe-item { + /*margin: 20px -8px 0 !important;*/ + padding: 15px !important; + border-radius: 5px; + background-color: #fff; + -webkit-box-shadow: 0 .5em 3em rgba(161, 177, 204, .4); + box-shadow: 0 .5em 3em rgba(161, 177, 204, .4); + background-color: #fff +} + +.mdui-img-fluid, +.mdui-video-fluid { + border-radius: 5px; + border: 1px solid #eee +} + +.mdui-list { + padding: 0 +} + +.mdui-list-item { + margin: 0 !important; + border-radius: 5px; + padding: 0 10px 0 5px !important; + border: 1px solid #eee; + margin-bottom: 10px !important +} + +.mdui-list-item:last-child { + margin-bottom: 0 !important +} + +.mdui-list-item:first-child { + border: none +} + +.mdui-toolbar { + width: auto; + /*margin-top: 60px !important*/ +} + +.mdui-appbar .mdui-toolbar { + height: 56px; + font-size: 16px +} + +.mdui-toolbar>* { + padding: 0 6px; + margin: 0 2px; + opacity: .5 +} + +.mdui-toolbar>.mdui-typo-headline { + padding: 0 16px 0 0 +} + +.mdui-toolbar>i { + padding: 0 +} + +.mdui-toolbar>a:hover, +a.mdui-typo-headline, +a.active { + opacity: 1 +} + +.mdui-container { + max-width: 980px +} + +.mdui-list>.th { + background-color: initial +} + +.mdui-list-item>a { + width: 100%; + line-height: 48px +} + +.mdui-toolbar>a { + padding: 0 16px; + line-height: 30px; + border-radius: 30px; + border: 1px solid #eee +} + +.mdui-toolbar>a:last-child { + opacity: 1; + background-color: #1e89f2; + color: #ffff +} + +@media screen and (max-width:980px) { + .mdui-list-item .mdui-text-right { + display: none + } + + .mdui-container { + width: 100% !important; + margin: 0 + } + + .mdui-toolbar>* { + display: none + } + + .mdui-toolbar>a:last-child, + .mdui-toolbar>.mdui-typo-headline, + .mdui-toolbar>i:first-child { + display: block + } +} diff --git a/static/img/bg-bottom.svg b/static/img/bg-bottom.svg old mode 100644 new mode 100755 diff --git a/static/js/hashmap.js b/static/js/hashmap.js old mode 100644 new mode 100755 diff --git a/static/js/webuploader.min.js b/static/js/webuploader.min.js old mode 100644 new mode 100755 diff --git a/supervisord.conf.sample b/supervisord.conf.sample new file mode 100755 index 0000000..f4eb846 --- /dev/null +++ b/supervisord.conf.sample @@ -0,0 +1,34 @@ +[unix_http_server] +file=/tmp/supervisor.sock + +[supervisord] +logfile=/tmp/supervisord.log +logfile_maxbytes=50MB +logfile_backups=10 +loglevel=info +pidfile=/tmp/supervisord.pid +nodaemon=false +minfds=1024 +minprocs=200 + +[inet_http_server] ; inet (TCP) server disabled by default +port=*:9001 + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///tmp/supervisor.sock + + + + +[program:pyone] +command = gunicorn -k eventlet -b 0.0.0.0:34567 run:app +directory = /root/PyOne +autorestart = true + +[program:online] +command = gunicorn -k eventlet -b 0.0.0.0:34568 run:app +directory = /root/vv2 +autorestart = true diff --git a/templates/_macro.html b/templates/_macro.html old mode 100644 new mode 100755 diff --git a/templates/admin/cache.html b/templates/admin/cache.html old mode 100644 new mode 100755 index 17cf403..e171da8 --- a/templates/admin/cache.html +++ b/templates/admin/cache.html @@ -15,20 +15,22 @@
-
- - -
+ +
-
+ +
-


-
-


@@ -38,8 +40,8 @@