发布新版本,增加优选源功能

This commit is contained in:
晚风拂柳颜 2023-06-08 11:18:25 +08:00
parent 18fa2459d4
commit cb9275d5b7
12 changed files with 150 additions and 29 deletions

View File

@ -57,3 +57,4 @@ ALI_TOKEN = '' # 适用于初始配置的阿里云token
ENV = '{"bili_cookie":""}' # 自定义环境变量
UPDATE_PROXY = 'https://ghproxy.net/' # 检测升级代理
Thread = True # 开启windows多线程调用
SPECIAL = '腾云驾雾:腾讯&奇珍异兽:爱奇艺&百忙无果:芒果&优酷&哔哩影视&Alist' # 特殊优选

View File

@ -235,6 +235,7 @@ def config_render(mode):
tt = time()
UA = request.headers['User-Agent']
ver = getParmas('ver')
sp = getParmas('sp') # 优选
logger.info(f'ver:{ver},UA:{UA}')
if ver not in ['1','2']:
ISTVB = 'okhttp/3' in UA
@ -279,8 +280,12 @@ def config_render(mode):
merged_hide(merged_config)
# response = make_response(html)
# print(len(merged_config['sites']))
print(merged_config['sites'])
# print(merged_config['sites'])
merged_config['sites'] = sort_sites_by_order(merged_config['sites'],js_mode)
# print(merged_config['sites'])
if sp: # 执行动态优选源
special_rule(merged_config,lsg)
# print(merged_config['parses'])
parses = sort_parses_by_order(merged_config['parses'],host)
# print(parses)
@ -302,6 +307,23 @@ def config_render(mode):
logger.info(f'自动生成动态配置共计耗时:{get_interval(tt)}毫秒')
return response
def special_rule(merged_config,lsg):
# print(merged_config['sites'])
special = lsg.getItem('SPECIAL').strip()
# print('SPECIAL',special)
special_dict = {}
for sp in special.split('&'):
special_dict[sp.split(':')[0]] = sp.split(':')[1] if ':' in sp else ''
special_keys = list(special_dict.keys())
special_ft = list(filter(lambda x: x.get('key').replace('dr_', '') in special_keys, merged_config['sites']))
for spf in special_ft:
spf['name'] = special_dict[spf['key'].replace('dr_', '')] or spf['name']
special_st = sorted(special_ft, key=lambda x: special_keys.index(x.get('key').replace('dr_', '')))
merged_config['sites'] = special_st
merged_config['dr_count'] = len(special_st)
def comp(x, y):
if x['order'] > y['order']:
return 1

View File

@ -12,6 +12,7 @@ from utils.cfg import cfg
from base.database import db
from datetime import datetime, timedelta
class storage_service(object):
@staticmethod
@ -21,8 +22,11 @@ class storage_service(object):
return copy_utils.obj_to_list(res)
def __init__(self):
conf_list = ['LIVE_URL', 'USE_PY', 'JS_MODE','JS0_DISABLE','JS0_PASSWORD','PLAY_URL', 'PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
'WALL_PAPER', 'UNAME', 'PWD', 'LIVE_MODE', 'CATE_EXCLUDE', 'TAB_EXCLUDE','SEARCH_TIMEOUT','SEARCH_LIMIT','MULTI_MODE','XR_MODE','JS_PROXY','UPDATE_PROXY','ENV','ALI_TOKEN','OCR_API']
conf_list = ['LIVE_URL', 'USE_PY', 'JS_MODE', 'JS0_DISABLE', 'JS0_PASSWORD', 'PLAY_URL', 'PLAY_DISABLE',
'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
'WALL_PAPER', 'UNAME', 'PWD', 'LIVE_MODE', 'CATE_EXCLUDE', 'TAB_EXCLUDE', 'SEARCH_TIMEOUT',
'SEARCH_LIMIT', 'MULTI_MODE', 'XR_MODE', 'JS_PROXY', 'UPDATE_PROXY', 'ENV', 'ALI_TOKEN', 'OCR_API',
'SPECIAL']
for conf in conf_list:
if not self.hasItem(conf):
print(f'开始初始化{conf}')
@ -31,10 +35,14 @@ class storage_service(object):
@classmethod
def getStoreConf(self):
# MAX_CONTENT_LENGTH 最大上传和端口ip一样是顶级配置,无法外部修改的
conf_list = ['LIVE_URL', 'LIVE_MODE','PLAY_URL', 'PID_URL','USE_PY','JS_MODE', 'JS0_DISABLE','JS0_PASSWORD','PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
'WALL_PAPER', 'UNAME', 'PWD', 'CATE_EXCLUDE', 'TAB_EXCLUDE','SEARCH_TIMEOUT','SEARCH_LIMIT','MULTI_MODE','XR_MODE','JS_PROXY','UPDATE_PROXY','ENV','ALI_TOKEN','OCR_API']
conf_name_list = ['直播地址', '直播模式','远程地址', '进程管理链接','启用py源', 'js模式','禁用js0','js0密码','禁用免嗅', '免嗅模式', '启用壁纸', '壁纸链接', '管理账号',
'管理密码', '分类排除', '线路排除','聚搜超时','搜索条数','多源模式','仙人模式','源代理','升级代理','环境变量','阿里tk','OCR接口']
conf_list = ['LIVE_URL', 'LIVE_MODE', 'PLAY_URL', 'PID_URL', 'USE_PY', 'JS_MODE', 'JS0_DISABLE', 'JS0_PASSWORD',
'PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
'WALL_PAPER', 'UNAME', 'PWD', 'CATE_EXCLUDE', 'TAB_EXCLUDE', 'SEARCH_TIMEOUT', 'SEARCH_LIMIT',
'MULTI_MODE', 'XR_MODE', 'JS_PROXY', 'UPDATE_PROXY', 'ENV', 'SPECIAL', 'ALI_TOKEN', 'OCR_API']
conf_name_list = ['直播地址', '直播模式', '远程地址', '进程管理链接', '启用py源', 'js模式', '禁用js0',
'js0密码', '禁用免嗅', '免嗅模式', '启用壁纸', '壁纸链接', '管理账号',
'管理密码', '分类排除', '线路排除', '聚搜超时', '搜索条数', '多源模式', '仙人模式', '源代理',
'升级代理', '环境变量', '优选源', '阿里tk', 'OCR接口']
conf_lists = []
for i in range(len(conf_list)):
conf = conf_list[i]
@ -72,6 +80,7 @@ class storage_service(object):
def clearItem(self, key):
return Storage.clearItem(key)
class rules_service(object):
@staticmethod
@ -96,7 +105,6 @@ class rules_service(object):
state = 1
return state or 0
def setState(self, key, state=0):
res = RuleClass.query.filter(RuleClass.name == key).first()
if res:
@ -138,6 +146,7 @@ class rules_service(object):
res = RuleClass.query.filter(RuleClass.state == 0).all()
return copy_utils.obj_to_list(res)
class parse_service(object):
@staticmethod
@ -162,7 +171,6 @@ class parse_service(object):
state = 1
return state or 0
def setState(self, key, state=0):
res = VipParse.query.filter(VipParse.url == key).first()
if res:

View File

@ -1,3 +1,12 @@
###### 2023/06/08
- [X] 后台管理增加优选源功能。参考config.py进行配置优选源参数
配置好优选源后在动态的在线配置链接ver=2后面添加参数 &sp=1 可以开启优选结果
填写示例:
```text
腾云驾雾:腾讯&奇珍异兽:爱奇艺&百忙无果:芒果&优酷&哔哩影视&Alist
```
说明,每个源按&分开,按:起别名。如果没:就按原名称显示。
###### 2023/06/07
- [X] 后台管理增加p2p播放器
- [X] 3.9.43beta1 drpy新增hostJs属性可以用js动态捕捉网页根地址下面是一个示例

View File

@ -1 +1 @@
3.9.43beta2
3.9.43beta3

29
js/咕噜.js Normal file
View File

@ -0,0 +1,29 @@
var rule = {
title: '咕噜', // csp_AppYsV2
host: 'https://w.996w.top',
homeUrl:'/api.php/app/index_video',
// url: '/api.php/app/video?tid=fyclass&class=&area=&lang=&year=&limit=20&pg=fypage',
url: '/api.php/app/video?tid=fyclassfyfilter&limit=20&pg=fypage',
filter_url:'&class={{fl.class}}&area={{fl.area}}&lang={{fl.lang}}&year={{fl.year}}',
filter: {
"1":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"动画","v":"动画"},{"n":"奇幻","v":"奇幻"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"经典","v":"经典"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"微电影","v":"微电影"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"意大利","v":"意大利"},{"n":"西班牙","v":"西班牙"},{"n":"加拿大","v":"加拿大"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"法语","v":"法语"},{"n":"德语","v":"德语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"}]}],
"2":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"古装","v":"古装"},{"n":"战争","v":"战争"},{"n":"青春偶像","v":"青春偶像"},{"n":"喜剧","v":"喜剧"},{"n":"家庭","v":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"历史","v":"历史"},{"n":"经典","v":"经典"},{"n":"乡村","v":"乡村"},{"n":"情景","v":"情景"},{"n":"商战","v":"商战"},{"n":"网剧","v":"网剧"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"}]}],
"4":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"情感","v":"情感"},{"n":"科幻","v":"科幻"},{"n":"热血","v":"热血"},{"n":"推理","v":"推理"},{"n":"搞笑","v":"搞笑"},{"n":"冒险","v":"冒险"},{"n":"萝莉","v":"萝莉"},{"n":"校园","v":"校园"},{"n":"动作","v":"动作"},{"n":"机战","v":"机战"},{"n":"运动","v":"运动"},{"n":"战争","v":"战争"},{"n":"少年","v":"少年"},{"n":"少女","v":"少女"},{"n":"社会","v":"社会"},{"n":"原创","v":"原创"},{"n":"亲子","v":"亲子"},{"n":"益智","v":"益智"},{"n":"励志","v":"励志"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"国产","v":"国产"},{"n":"日本","v":"日本"},{"n":"欧美","v":"欧美"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"}]}]
},
detailUrl:'/api.php/app/video_detail?id=fyid',
searchUrl: '/api.php/app/search?text=**&pg=fypage',
searchable: 2,
quickSearch: 0,
filterable:1,//是否启用分类筛选,
headers:{'User-Agent':'Dart/2.10 (dart:io)'},
timeout:5000,
class_name:'电影&剧集&综艺&动漫',
class_url:'1&2&3&4',
play_parse:true,
lazy:"js:var html=JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);var url=html.url;if(html.encrypt=='1'){url=unescape(url)}else if(html.encrypt=='2'){url=unescape(base64Decode(url))}if(/m3u8|mp4/.test(url)){input=url}else{input}",
limit:6,
推荐:'json:list[0].vlist;*;*;*;*',
一级:'json:list;vod_name;vod_pic;vod_remarks||vod_score;vod_id',
二级:'js:try{let html=request(input);print(html);html=JSON.parse(html);let node=html.data;VOD={vod_id:node["vod_id"],vod_name:node["vod_name"],vod_pic:node["vod_pic"],type_name:node["vod_class"],vod_year:node["vod_year"],vod_area:node["vod_area"],vod_remarks:node["vod_remarks"],vod_actor:node["vod_actor"],vod_director:node["vod_director"],vod_content:node["vod_content"].strip()};let episodes=node.vod_url_with_player;let playMap={};if(typeof play_url==="undefined"){var play_url="code"}episodes.forEach(function(ep){let source=ep["name"];if(!playMap.hasOwnProperty(source)){playMap[source]=[]}playMap[source].append(ep["url"])});let playFrom=[];let playList=[];Object.keys(playMap).forEach(function(key){playFrom.append(key);playList.append(playMap[key])});let vod_play_from=playFrom.join("$$$");let vod_play_url=playList.join("$$$");VOD["vod_play_from"]=vod_play_from;VOD["vod_play_url"]=vod_play_url}catch(e){log("获取二级详情页发生错误:"+e.message)}',
搜索:'*',
}

25
js/奈飞中文.js Normal file
View File

@ -0,0 +1,25 @@
var rule={
title: '奈飞中文',
host: 'https://www.naifei.io',
url: '/vodshow/id/fyclass/page/fypage.html',
searchUrl: '/search/**----------fypage---.html',
searchable: 2,//是否启用全局搜索,
quickSearch: 0,//是否启用快速搜索,
filterable: 0,//是否启用分类筛选,
class_parse: '.nav-menu-items&&li;a&&Text;a&&href;.*/(.*?).html',
play_parse: true,
lazy: '',
limit: 6,
推荐: '.module-list;.module-items&&.module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
double: true, // 推荐内容是否双层定位
一级: '.module-items .module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
二级: {
"title": "h1&&Text;.tag-link&&Text",
"img": ".module-item-pic&&img&&data-src",
"desc": ".video-info-aux&&.tag-link&&Text;.video-info-aux&&a:eq(1)&&Text;.video-info-items:eq(2)&&Text;.video-info-items:eq(5)&&Text",
"content": ".vod_content&&Text",
"tabs": ".module-tab-item",
"lists": ".module-player-list:eq(#id)&&.scroll-content&&a"
},
搜索: '.module-items .module-search-item;a&&title;img&&data-src;.video-serial&&Text;a&&href',
}

25
js/西瓜影院.js Normal file
View File

@ -0,0 +1,25 @@
var rule={
title: '西瓜影院',
host: 'https://www.uccomic.com',
url: '/vodshow/fyclass--------fypage---/',
searchUrl: '/index.php/ajax/suggest?mid=1&wd=**',
searchable: 2,//是否启用全局搜索,
quickSearch: 0,//是否启用快速搜索,
filterable: 0,//是否启用分类筛选,
class_parse: '.menulist.hidden-xs li:gt(0):lt(5);a&&Text;a&&href;.*/(.*?)/',
play_parse: true,
lazy: '',
limit: 6,
推荐: 'body&&.col-md-2.col-sm-3.col-xs-4;a&&title;a&&data-original;.note.textbg&&Text;a&&href',
//double: true, // 推荐内容是否双层定位
一级: 'body&&.col-md-2.col-sm-3.col-xs-4;a&&title;a&&data-original;.note.textbg&&Text;a&&href',
二级: {
"title": "h3&&Text",
"img": "",
"desc": "",
"content": "",
"tabs": ".option",
"lists": ".playlistlink-1:eq(#id) li"
},
搜索:'json:list;name;pic;;id',
}

View File

@ -1260,7 +1260,7 @@ function homeVodParse(homeVodObj){
if(p.startsWith('js:')){
const TYPE = 'home';
var input = MY_URL;
const HOST = rule.host;
HOST = rule.host;
eval(p.replace('js:',''));
d = VODS;
}else {
@ -2148,6 +2148,7 @@ function playParse(playObj){
rule.host = (rule.host||'').rstrip('/');
HOST = rule.host;
if(rule.hostJs){
console.log(`检测到hostJs,准备执行...`);
try {
eval(rule.hostJs);
rule.host = HOST.rstrip('/');

2
libs/drpy.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1163,7 +1163,7 @@ function homeVodParse(homeVodObj){
if(p.startsWith('js:')){
const TYPE = 'home';
var input = MY_URL;
const HOST = rule.host;
HOST = rule.host;
eval(p.replace('js:',''));
d = VODS;
}else {
@ -2015,6 +2015,7 @@ function init(ext) {
rule.host = (rule.host||'').rstrip('/');
HOST = rule.host;
if(rule.hostJs){
console.log(`检测到hostJs,准备执行...`);
try {
eval(rule.hostJs);
rule.host = HOST.rstrip('/');

2
libs/drpy2.min.js vendored

File diff suppressed because one or more lines are too long