From 4770d5df7d42d781efb51229fe33c63ec92e66a6 Mon Sep 17 00:00:00 2001 From: hjdhnx Date: Mon, 24 Oct 2022 15:11:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E8=87=B3=20v3.9.17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/rules.db | Bin 90112 -> 110592 bytes controllers/admin.py | 22 +++++++ controllers/home.py | 37 ++++++++++- controllers/layui.py | 8 ++- controllers/service.py | 16 +++++ controllers/vod.py | 61 ++++++++++++------ js/version.txt | 2 +- readme.md | 4 ++ templates/layui_list.html | 127 +++++++++++++++++++++++++++++++++----- 9 files changed, 238 insertions(+), 39 deletions(-) diff --git a/base/rules.db b/base/rules.db index c9692ea86899fec60ba3eadfd79be0d55fbaa998..73f0cdae40eade35b5224194e7758d02beb79038 100644 GIT binary patch literal 110592 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 KDJ}tf_J05y*ISGlie&4&_YccGz{(rB%_Bwm7 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 fLGX_EI(0',methods=['POST']) +def admin_rule_order(order=0): # 管理员修改规则顺序 + if not verfy_token(): + return R.error('请登录后再试') + names = getParmas('names') + if not names: + return R.success(f'修改失败,没有传递names参数') + rule_list = names.split(',') + rules = rules_service() + # print(rules.query_all()) + # print(rules.getState(rule_list[0])) + # print(rule_list) + success_list = [] + for rule in rule_list: + try: + res_id = rules.setOrder(rule,order) + success_list.append(f'{rule}:{res_id}') + except: + success_list.append(rule) + + return R.success(f'修改成功,服务器反馈信息为:{success_list}') + @admin.route('/force_update') def admin_force_update(): if not verfy_token(): diff --git a/controllers/home.py b/controllers/home.py index 57bdc72..45cb9f6 100644 --- a/controllers/home.py +++ b/controllers/home.py @@ -210,6 +210,7 @@ def merged_hide(merged_config): @home.route('/config/') def config_render(mode): # print(dict(app.config)) + tt = time() UA = request.headers['User-Agent'] ISTVB = 'okhttp/3' in UA logger.info(UA) @@ -244,15 +245,46 @@ def config_render(mode): html = render_template('config.txt',UA=UA,xr_mode=xr_mode,ISTVB=ISTVB,pys=pys,rules=rules,host=host,mode=mode,js_mode=js_mode,jxs=jxs,alists=alists,alists_str=alists_str,live_url=live_url,config=new_conf) merged_config = custom_merge(parseText(html),customConfig) # print(merged_config['sites']) - merged_hide(merged_config) # response = make_response(html) # print(len(merged_config['sites'])) + # print(merged_config['sites']) + merged_config['sites'] = sort_sites_by_order(merged_config['sites'],js_mode) response = make_response(json.dumps(merged_config,ensure_ascii=False,indent=1)) # response = make_response(str(merged_config)) response.headers['Content-Type'] = 'application/json; charset=utf-8' + logger.info(f'自动生成动态配置共计耗时:{get_interval(tt)}毫秒') return response +def sort_sites_by_order(sites,js_mode=0): + rules = rules_service() + rule_list = rules.query_all() + # print(rule_list) + rule_names = list(map(lambda x: x['name'], rule_list)) + # print(rule_names) + # print(sites) + for i in range(len(sites)): + # sites[i]['id'] = i+1 + site_name = sites[i]['api'].split('rule=')[1].split('&')[0] if 'rule=' in sites[i]['api'] else sites[i]['key'] + if js_mode and str(site_name).startswith('dr'): + site_name = site_name.replace('dr_','') + # print(site_name) + if site_name in rule_names: + site_rule = rule_list[rule_names.index(site_name)] + sites[i]['state'] = 1 if site_rule['state'] is None else site_rule['state'] + sites[i]['order'] = 0 if site_rule['order'] is None else site_rule['order'] + else: + sites[i]['state'] = 1 + sites[i]['order'] = 0 + # sites[i]['site_name'] = site_name + # print(sites) + sites.sort(key=lambda x: x['order'], reverse=False) + # print(sites) + for site in sites: + del site['state'] + del site['order'] + return sites + @home.route('/configs') def config_gen(): # 生成文件 @@ -285,12 +317,14 @@ def config_gen(): customConfig = getCustonDict(host0,ali_token) set_dict = custom_merge(parseText(set_local), customConfig) merged_hide(set_dict) + set_dict['sites'] = sort_sites_by_order(set_dict['sites'], js_mode) # set_dict = json.loads(set_local) f.write(json.dumps(set_dict,ensure_ascii=False,indent=4)) with open('txt/pycms1.json','w+',encoding='utf-8') as f: customConfig = getCustonDict(host1,ali_token) set_dict = custom_merge(parseText(set_area), customConfig) merged_hide(set_dict) + set_dict['sites'] = sort_sites_by_order(set_dict['sites'], js_mode) # set_dict = json.loads(set_area) f.write(json.dumps(set_dict,ensure_ascii=False,indent=4)) @@ -298,6 +332,7 @@ def config_gen(): customConfig = getCustonDict(host2,ali_token) set_dict = custom_merge(parseText(set_online), customConfig) merged_hide(set_dict) + set_dict['sites'] = sort_sites_by_order(set_dict['sites'], js_mode) # set_dict = json.loads(set_online) f.write(json.dumps(set_dict,ensure_ascii=False,indent=4)) files = [os.path.abspath(rf'txt\pycms{i}.json') for i in range(3)] diff --git a/controllers/layui.py b/controllers/layui.py index 4198f7a..cb96512 100644 --- a/controllers/layui.py +++ b/controllers/layui.py @@ -44,7 +44,9 @@ def layui_rule_list(): # print(pys) alists = [] live_url = [] - html = render_template('config.txt', pys=pys, rules=getRules('js'), host=host, mode=2, jxs=jxs, alists=alists, + local_rules = getRules('js') + # print(local_rules) + html = render_template('config.txt', pys=pys, rules=local_rules, host=host, mode=2, jxs=jxs, alists=alists, alists_str='[]', live_url=live_url, config=new_conf) merged_config = custom_merge(parseText(html), customConfig) sites = merged_config['sites'] @@ -52,7 +54,8 @@ def layui_rule_list(): rule_list = rules.query_all() rule_names = list(map(lambda x:x['name'],rule_list)) # print(rule_list) - # print(rule_names) + print(rule_names) + # print(sites) for i in range(len(sites)): sites[i]['id'] = i+1 site_name = sites[i]['api'].split('rule=')[1].split('&')[0] if 'rule=' in sites[i]['api'] else sites[i]['key'] @@ -66,6 +69,7 @@ def layui_rule_list(): sites[i]['order'] = 0 sites[i]['site_name'] = site_name + sites.sort(key=lambda x:x['order'],reverse=False) new_sites = sites[(page-1)*limit:page*limit] # print(new_sites) return layuiBack('获取成功',new_sites,count=len(sites)) diff --git a/controllers/service.py b/controllers/service.py index 927009d..fc70815 100644 --- a/controllers/service.py +++ b/controllers/service.py @@ -109,6 +109,22 @@ class rules_service(object): print(f'发生了错误:{e}') return None + def setOrder(self,key,order=0): + res = RuleClass.query.filter(RuleClass.name == key).first() + if res: + res.order = order + db.session.add(res) + else: + res = RuleClass(name=key, order=order) + db.session.add(res) + db.session.flush() # 获取id + try: + db.session.commit() + return res.id + except Exception as e: + print(f'发生了错误:{e}') + return None + @staticmethod def getHideRules(): res = RuleClass.query.filter(RuleClass.state == 0).all() diff --git a/controllers/vod.py b/controllers/vod.py index c4ec93f..8679211 100644 --- a/controllers/vod.py +++ b/controllers/vod.py @@ -18,7 +18,7 @@ from base.database import db from models.ruleclass import RuleClass from models.playparse import PlayParse from js.rules import getRules -from controllers.service import storage_service +from controllers.service import storage_service,rules_service from concurrent.futures import ThreadPoolExecutor,as_completed,thread # 引入线程池 from quickjs import Function,Context import ujson @@ -116,6 +116,25 @@ def multi_search2(wd): return jsonify(result) +def merged_hide(merged_rules): + t1 = time() + store_rule = rules_service() + hide_rules = store_rule.getHideRules() + hide_rule_names = list(map(lambda x: x['name'], hide_rules)) + # print('隐藏:',hide_rule_names) + all_cnt = len(merged_rules) + + def filter_show(x): + # name = x['api'].split('rule=')[1].split('&')[0] if 'rule=' in x['api'] else x['key'].replace('dr_','') + name = x + # print(name) + return name not in hide_rule_names + + merged_rules = list(filter(filter_show, merged_rules)) + # print('隐藏后:',merged_rules) + logger.info(f'数据库筛选隐藏规则耗时{get_interval(t1)}毫秒,共计{all_cnt}条规则,隐藏后可渲染{len(merged_rules)}条规则') + return merged_rules + def multi_search(wd): lsg = storage_service() t1 = time() @@ -128,31 +147,35 @@ def multi_search(wd): rules_exclude = ['drpy'] new_rules = list(filter(lambda x: x.get('searchable', 0) and x.get('name', '') not in rules_exclude, rules)) search_sites = [new_rule['name'] for new_rule in new_rules] + # print(search_sites) nosearch_sites = set(rule_names) ^ set(search_sites) nosearch_sites.remove('drpy') # print(nosearch_sites) logger.info(f'开始聚搜{wd},共计{len(search_sites)}个规则,聚搜超时{timeout}秒') logger.info(f'不支持聚搜的规则,共计{len(nosearch_sites)}个规则:{",".join(nosearch_sites)}') + search_sites = merged_hide(search_sites) # print(search_sites) + # search_sites = [] res = [] - with open('js/模板.js', encoding='utf-8') as f: - before = f.read().split('export')[0] - with ThreadPoolExecutor(max_workers=len(search_sites)) as executor: - to_do = [] - for site in search_sites: - future = executor.submit(search_one, site, wd, before) - to_do.append(future) - try: - for future in as_completed(to_do, timeout=timeout): # 并发执行 - ret = future.result() - # print(ret) - if ret and isinstance(ret,dict) and ret.get('list'): - res.extend(ret['list']) - except Exception as e: - print(f'发生错误:{e}') - import atexit - atexit.unregister(thread._python_exit) - executor.shutdown = lambda wait: None + if len(search_sites) > 0: + with open('js/模板.js', encoding='utf-8') as f: + before = f.read().split('export')[0] + with ThreadPoolExecutor(max_workers=len(search_sites)) as executor: + to_do = [] + for site in search_sites: + future = executor.submit(search_one, site, wd, before) + to_do.append(future) + try: + for future in as_completed(to_do, timeout=timeout): # 并发执行 + ret = future.result() + # print(ret) + if ret and isinstance(ret,dict) and ret.get('list'): + res.extend(ret['list']) + except Exception as e: + print(f'发生错误:{e}') + import atexit + atexit.unregister(thread._python_exit) + executor.shutdown = lambda wait: None logger.info(f'drpy聚搜{len(search_sites)}个源共计耗时{get_interval(t1)}毫秒') return jsonify({ "list": res diff --git a/js/version.txt b/js/version.txt index b78242b..20bdd38 100644 --- a/js/version.txt +++ b/js/version.txt @@ -1 +1 @@ -3.9.16beta1 \ No newline at end of file +3.9.17 \ No newline at end of file diff --git a/readme.md b/readme.md index cfb867c..98e38f3 100644 --- a/readme.md +++ b/readme.md @@ -47,6 +47,10 @@ [dockerfile教程](https://blog.csdn.net/qq_46158060/article/details/125718218) [获取本地设备信息](https://blog.csdn.net/cui_yonghua/article/details/125508991) [获取本地设备信息](https://m.jb51.net/article/140716.htm) +###### 2022/10/24 +- [X] v3.9.17 +- [X] drpy(道长) 服务端聚搜支持自动排除未来功能里隐藏的源 +- [X] 未来功能增加源置顶和置底功能 测试性增加排序功能(指定输入数字) ###### 2022/10/23 - [X] 新增几个源 包括虎牙直播 - [X] 设置中心增加仙人模式开关(自动识别不同设备返回不同的drpy接口,关闭的话只会走drpy.min.js) diff --git a/templates/layui_list.html b/templates/layui_list.html index e3637ed..c5b9c28 100644 --- a/templates/layui_list.html +++ b/templates/layui_list.html @@ -48,7 +48,8 @@ @@ -96,6 +97,34 @@ layui.use(['table', 'dropdown'], function(){ }); } + function setOrder(data,to_set_order){ + if(data.length < 1){ + return layer.msg('请至少选择一行'); + } + to_set_order = to_set_order||0; + console.log(data); + let site_names = data.map(it=>it.site_name); + let site_names_str = site_names.join(','); + console.log('准备将'+site_names_str+'的显示状态设置为:'+to_set_order); + let params = {"names":site_names_str}; + console.log(params); + $.post("/admin/rule_order/"+to_set_order,params,function(data,status){ + console.log(data); + if(data.code === 200){ + // alert(data.msg); + // location.reload(); + table.reload('test', { + // page: { + // curr: 3 //重新从第 1 页开始 + // } + }); + }else{ + console.log('修改失败了...'); + return false + } + }); + } + // 创建渲染实例 table.render({ elem: '#test' @@ -111,11 +140,11 @@ layui.use(['table', 'dropdown'], function(){ // ,totalRow: true // 开启合计行 ,page: true ,limit:12 - ,limits:[10,12,15,20,40,60,80,100,150,200] + ,limits:[10,12,15,20,40,60,80,100,150,200,300,500] ,cols: [[ {type: 'checkbox', fixed: 'left'} // ,{field: 'id', fixed: 'left',title: 'ID', width: 20, sort: true,totalRowText: '合计:'} - ,{field: 'id',title: 'ID', width: 20, sort: true} + ,{field: 'id',title: 'ID', width: 60, sort: true} ,{field: 'site_name', title: '存储名称', width: 120} , { field: 'state', title: '显示状态', minWidth: 100, templet: function (res) { @@ -219,20 +248,34 @@ layui.use(['table', 'dropdown'], function(){ elem: '#moreTest' //可绑定在任意元素中,此处以上述按钮为例 ,data: [{ id: 'show', - title: '显示' + title: '🟢显示' },{ id: 'hide', - title: '隐藏' - },{ - id: 'add', - title: '添加' - },{ - id: 'update', - title: '编辑' - },{ - id: 'delete', - title: '删除' - }] + title: '🔴隐藏' + }, + { + id:'set_top', + title: '⬆️置顶', + }, + { + id:'set_order_number', + title: '↕️指定序号', + }, + { + id:'set_bottom', + title: '⬇️置底', + }, + // { + // id: 'add', + // title: '添加' + // },{ + // id: 'update', + // title: '编辑' + // },{ + // id: 'delete', + // title: '删除' + // } + ] //菜单被点击的事件 ,click: function(obj){ var checkStatus = table.checkStatus(id) @@ -244,7 +287,35 @@ layui.use(['table', 'dropdown'], function(){ break; case 'hide': // console.log(obj); - setState(data,0) + setState(data,0); + break; + case 'set_top': + // console.log(obj); + setOrder(data,0); + break; + case 'set_order_number': + layer.prompt({ + formType: 0, + value: '', + title: '请输入指定的排序序号,数字越小排名越靠前', + btn: ['确定','取消'], //按钮, + btnAlign: 'c' + }, function(value,index){ + console.log('value:'+value); + var reg = /^[\d]+$/; + if(!reg.test(value)){ + layer.msg('请输入有效数字!',{time:500}); + }else{ + setOrder(data,Number(value)); + layer.close(index); + layer.msg('请设置顺序为'+value,{time:1000}); + } + }); + // setOrder(data,0); + break; + case 'set_bottom': + // console.log(obj); + setOrder(data,9999) break; case 'add': layer.open({ @@ -360,6 +431,30 @@ layui.use(['table', 'dropdown'], function(){ area: ['80%','80%'], content: '
自定义表单元素
' }); + }else if(obj.event === 'set_top'){ + let obj_name; + try{ + obj_name = obj.data.api.match(/rule=(.*)/)[1].split('&')[0]; + }catch (e){ + obj_name = obj.data.key; + } + console.log(obj); + let params = {"names":[obj_name].join(',')}; + console.log(params); + $.post("/admin/rule_order/0",params,function(res,status){ + console.log(res); + if(res.code === 200){ + data.order = 0; + obj.update({ + order: data.order + }); + layer.msg('已置顶'); + }else{ + console.log('修改失败了...'); + layer.msg('置顶失败,具体错误看日志'); + return false + } + }); } }); -- GitLab