diff --git a/base/rules.db b/base/rules.db index c9692ea86899fec60ba3eadfd79be0d55fbaa998..73f0cdae40eade35b5224194e7758d02beb79038 100644 Binary files a/base/rules.db and b/base/rules.db differ diff --git a/controllers/admin.py b/controllers/admin.py index 967c2816b5b2c80ac62548b899743312160e5fad..540a9b9918ebef040b11ac82fa65bd944dbc4c3b 100644 --- a/controllers/admin.py +++ b/controllers/admin.py @@ -145,6 +145,28 @@ def admin_rule_state(state=0): # 管理员修改规则状态 return R.success(f'修改成功,服务器反馈信息为:{success_list}') +@admin.route('/rule_order/',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 57bdc72f78025f9defc6ede70cf5a5cd8de8efca..45cb9f69cb3ffd01ca0a382342dd6797e88d7079 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 4198f7a8ceabb3996afd398a133f4337247e69f2..cb965129ef43c3b9883e02482ee1168e1a96e55b 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 927009d6dc96fcc123bd62d3dcb99c30156e7165..fc70815f2ac99e1711004a9aa7230cd292d34a4a 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 c4ec93f0725ab8f4613ccc135e2c6f614907bb06..86792116b784b47b069368adb58bef627f57a9ed 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 b78242bdc0b46233fb4dc4989c5ee04ed9a158e3..20bdd388ede671f38bc19b7629c89d5445af13c7 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 cfb867c237541e2080d37b1fd868fcec0e371a3d..98e38f391c321e8e2531960b64814d03ea1849e0 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 e3637eddb7a0640c959c756ff35a365d0296bbca..c5b9c28c9339676b5c7366e9a78763093114cff4 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 + } + }); } });