From 2674875dbcc81dd971433b73c81df7f7e55d1054 Mon Sep 17 00:00:00 2001 From: hjdhnx Date: Tue, 6 Sep 2022 17:44:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 631 +-------------------- classes/___init__.py | 7 - classes/cms.py | 895 ------------------------------ config.py | 38 -- js/rules.py | 73 +++ js/version.txt | 2 +- "js/\347\233\264\346\222\255.txt" | 754 +++++++++++++------------ models/__init__.py | 10 +- models/rules.db | Bin 40960 -> 40960 bytes models/storage.py | 102 ++-- readme.md | 1 + templates/admin.html | 4 +- templates/config.txt | 2 +- templates/index.html | 5 +- templates/login.html | 2 +- txt/pycms0.json | 141 ++++- txt/pycms1.json | 141 ++++- txt/pycms2.json | 141 ++++- utils/log.py | 2 +- utils/update.py | 9 +- utils/web.py | 144 ++--- 21 files changed, 991 insertions(+), 2113 deletions(-) delete mode 100644 classes/___init__.py delete mode 100644 classes/cms.py delete mode 100644 config.py diff --git a/app.py b/app.py index 5939adc..d8c0694 100644 --- a/app.py +++ b/app.py @@ -2,48 +2,37 @@ # -*- coding: utf-8 -*- # File : app.py # Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ -# Date : 2022/8/25 -import random -from utils.encode import base64Encode -import js2py -from flask_sqlalchemy import SQLAlchemy -from flask_migrate import Migrate -import config -import warnings -warnings.filterwarnings('ignore') +# Date : 2022/9/6 -import os -from flask import Flask, jsonify, abort,request,redirect,make_response,render_template,send_from_directory,url_for -from werkzeug.utils import secure_filename +from flask.app import Flask +from flask_migrate import Migrate +from base import config +from base.database import db +from utils.log import logger +from utils.system import get_wlan_info,getHost +from controllers import * from js.rules import getRuleLists -from utils import error,parser -from utils.web import * -from utils.update import checkUpdate,getOnlineVer,getLocalVer,download_new_version,download_lives import sys -import codecs -from classes.cms import CMS,logger -from models import * -import json -sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) -def create_flask_app(config): +def create_flask_app(): app = Flask(__name__, static_folder='static', static_url_path='/static') - # app.config["JSON_AS_ASCII"] = False # jsonify返回的中文正常显示 app.config.from_object(config) # 单独的配置文件里写了,这里就不用弄json中文显示了 - # new_conf = get_conf(settings) - # print(new_conf) + app.register_blueprint(home.home, url_prefix='') + app.register_blueprint(admin.admin, url_prefix='/admin') + app.register_blueprint(vod.vod, url_prefix='') + app.register_blueprint(cls.cls, url_prefix='/cls') print('自定义播放解析地址:', app.config.get('PLAY_URL')) print('当前操作系统', sys.platform) app.logger.name = "drLogger" rule_list = getRuleLists() wlan_info,_ = get_wlan_info() logger.info(rule_list) - logger.info(f'局域网: {getHost(1, 5705)}/index\n本地: {getHost(0, 5705)}/index\nwlan_info:{wlan_info}') + logger.info(f'局域网: {getHost(1, app.config.get("HTTP_PORT"))}/index\n本地: {getHost(0, app.config.get("HTTP_PORT"))}/index\nwlan_info:{wlan_info}') return app -app = create_flask_app(config) - -db = SQLAlchemy(app) +app = create_flask_app() +db.init_app(app) +db.create_all(app=app) migrate = Migrate(app, db) now_python_ver = ".".join([str(i) for i in sys.version_info[:3]]) @@ -55,595 +44,13 @@ if sys.version_info < (3,9): else: print(f'当前python版本{now_python_ver}为3.9.0及以上,不支持gevent') -# from geventwebsocket.handler import WebSocketHandler -RuleClass = rule_classes.init(db) -PlayParse = play_parse.init(db) -lsg = storage.init(db) - -def initConfToDb(): - if not lsg.getItem('LIVE_URL'): - lsg.setItem('LIVE_URL', app.config.get('LIVE_URL')) - -initConfToDb() - -def is_linux(): - return not 'win' in sys.platform - -def getParmas(key=None,value=''): - """ - 获取链接参数 - :param key: - :return: - """ - content_type = request.headers.get('Content-Type') - args = {} - if request.method == 'POST': - if 'application/x-www-form-urlencoded' in content_type or 'multipart/form-data' in content_type: - args = request.form - elif 'application/json' in content_type: - args = request.json - elif 'text/plain' in content_type: - args = request.data - else: - args = request.args - elif request.method == 'GET': - args = request.args - if key: - return args.get(key,value) - else: - return args - -@app.route('/') -def forbidden(): # put application's code here - abort(403) - -@app.route('/index') -def index(): # put application's code here - # logger.info("进入了首页") - sup_port = app.config.get('SUP_PORT', False) - manager0 = ':'.join(getHost(0).split(':')[0:2]) - manager1 = ':'.join(getHost(1).split(':')[0:2]) - manager2 = ':'.join(getHost(2).split(':')[0:2]).replace('https','http') - if sup_port: - manager0 += f':{sup_port}' - manager1 += f':{sup_port}' - manager2 += f':{sup_port}' - # print(manager1) - # print(manager2) - return render_template('index.html',getHost=getHost,manager0=manager0,manager1=manager1,manager2=manager2,is_linux=is_linux()) - -@app.route('/admin') -def admin_home(): # 管理员界面 - # headers = request.headers - # print(headers) - cookies = request.cookies - # print(cookies) - token = cookies.get('token','') - # print(f'mytoken:{token}') - if not verfy_token(token): - return render_template('login.html') - # return jsonify(error.success('登录成功')) - live_url = lsg.getItem('LIVE_URL') - return render_template('admin.html',rules=getRules('js'),ver=getLocalVer(),live_url=live_url) - -@app.route('/api/login',methods=['GET','POST']) -def login_api(): - username = getParmas('username') - password = getParmas('password') - autologin = getParmas('autologin') - if not all([username,password]): - return jsonify(error.failed('账号密码字段必填')) - token = md5(f'{username};{password}') - check = verfy_token(token) - if check: - # response = make_response(redirect('/admin')) - response = make_response(jsonify(error.success('登录成功'))) - response.set_cookie('token', token) - return response - else: - return jsonify(error.failed('登录失败,用户名或密码错误')) - -@app.route("/admin/view/",methods=['GET']) -def admin_view_rule(name): - if not name or not name.split('.')[-1] in ['js','txt','py','json']: - return jsonify(error.failed(f'非法猥亵,未指定文件名。必须包含js|txt|json|py')) - try: - return parser.toJs(name,'js') - except Exception as e: - return jsonify(error.failed(f'非法猥亵\n{e}')) - -@app.route('/admin/clear/') -def admin_clear_rule(name): - if not name or not name.split('.')[-1] in ['js','txt','py','json']: - return jsonify(error.failed(f'非法猥亵,未指定文件名。必须包含js|txt|json|py')) - cookies = request.cookies - # print(cookies) - token = cookies.get('token', '') - # print(f'mytoken:{token}') - if not verfy_token(token): - return render_template('login.html') - - file_path = os.path.abspath(f'js/{name}') - if not os.path.exists(file_path): - return jsonify(error.failed('服务端没有此文件!'+file_path)) - os.remove(file_path) - return jsonify(error.success('成功删除文件:'+file_path)) - -@app.route('/admin/get_ver') -def admin_get_ver(): - cookies = request.cookies - # print(cookies) - token = cookies.get('token', '') - # print(f'mytoken:{token}') - if not verfy_token(token): - # return render_template('login.html') - return jsonify(error.failed('请登录后再试')) - - return jsonify({'local_ver':getLocalVer(),'online_ver':getOnlineVer()}) - -@app.route('/admin/update_ver') -def admin_update_ver(): - cookies = request.cookies - # print(cookies) - token = cookies.get('token', '') - # print(f'mytoken:{token}') - if not verfy_token(token): - # return render_template('login.html') - return jsonify(error.failed('请登录后再试')) - msg = download_new_version() - return jsonify(error.success(msg)) - -@app.route('/admin/update_lives') -def admin_update_lives(): - url = getParmas('url') - if not url: - return jsonify(error.failed('未提供被同步的直播源远程地址!')) - cookies = request.cookies - token = cookies.get('token', '') - if not verfy_token(token): - return jsonify(error.failed('请登录后再试')) - live_url = url - success = download_lives(live_url) - if success: - return jsonify(error.success(f'直播源{live_url}同步成功')) - else: - return jsonify(error.failed(f'直播源{live_url}同步失败')) - -@app.route('/admin/write_live_url') -def admin_write_live_url(): - url = getParmas('url') - if not url: - return jsonify(error.failed('未提供修改后的直播源地址!')) - cookies = request.cookies - token = cookies.get('token', '') - if not verfy_token(token): - return jsonify(error.failed('请登录后再试')) - id = lsg.setItem('LIVE_URL',url) - msg = f'已修改的配置记录id为:{id}' - return jsonify(error.success(msg)) - - -@app.route('/upload', methods=['GET', 'POST']) -def upload_file(): - cookies = request.cookies - # print(cookies) - token = cookies.get('token', '') - # print(f'mytoken:{token}') - if not verfy_token(token): - return render_template('login.html') - if request.method == 'POST': - try: - file = request.files['file'] - # print(f.size) - # print(f) - # print(request.files) - filename = secure_filename(file.filename) - print(f'推荐安全文件命名:{filename}') - # savePath = f'js/{filename}' - savePath = f'js/{file.filename}' - # print(savePath) - if os.path.exists(savePath): - return jsonify(error.failed(f'上传失败,文件已存在,请先查看删除再试')) - with open('js/模板.js', encoding='utf-8') as f2: - before = f2.read() - upcode = file.stream.read().decode('utf-8') - check_to_run = before + upcode - # print(check_to_run) - try: - js2py.eval_js(check_to_run) - except: - return jsonify(error.failed('文件上传失败,检测到上传的文件不是drpy框架支持的源代码')) - print(savePath) - # savePath = os.path.join('', savePath) - # print(savePath) - file.seek(0) # 读取后变成空文件,重新赋能 - file.save(savePath) - return jsonify(error.success('文件上传成功')) - except Exception as e: - return jsonify(error.failed(f'文件上传失败!{e}')) - else: - # return render_template('upload.html') - return jsonify(error.failed('文件上传失败')) - -@app.route('/vod') -def vod(): - t0 = time() - rule = getParmas('rule') - ext = getParmas('ext') - if not ext.startswith('http') and not rule: - return jsonify(error.failed('规则字段必填')) - rule_list = getRuleLists() - if not ext.startswith('http') and not rule in rule_list: - msg = f'服务端本地仅支持以下规则:{",".join(rule_list)}' - return jsonify(error.failed(msg)) - # logger.info(f'检验耗时:{get_interval(t0)}毫秒') - t1 = time() - js_path = f'js/{rule}.js' if not ext.startswith('http') else ext - with open('js/模板.js', encoding='utf-8') as f: - before = f.read() - # logger.info(f'js读取耗时:{get_interval(t1)}毫秒') - logger.info(f'参数检验js读取共计耗时:{get_interval(t0)}毫秒') - t2 = time() - ctx, js_code = parser.runJs(js_path,before=before) - if not js_code: - return jsonify(error.failed('爬虫规则加载失败')) - - # rule = ctx.eval('rule') - # print(type(ctx.rule.lazy()),ctx.rule.lazy().toString()) - ruleDict = ctx.rule.to_dict() - ruleDict['id'] = rule # 把路由请求的id装到字典里,后面播放嗅探才能用 - # print(ruleDict) - # print(rule) - # print(type(rule)) - # print(ruleDict) - logger.info(f'js装载耗时:{get_interval(t2)}毫秒') - # print(ruleDict) - # print(rule) - cms = CMS(ruleDict,db,RuleClass,PlayParse,app.config) - wd = getParmas('wd') - ac = getParmas('ac') - quick = getParmas('quick') - play = getParmas('play') # 类型为4的时候点击播放会带上来 - flag = getParmas('flag') # 类型为4的时候点击播放会带上来 - filter = getParmas('filter') - t = getParmas('t') - pg = getParmas('pg','1') - pg = int(pg) - ids = getParmas('ids') - q = getParmas('q') - play_url = getParmas('play_url') - - if play: - jxs = getJxs() - play_url = play.split('play_url=')[1] - play_url = cms.playContent(play_url, jxs,flag) - if isinstance(play_url, str): - # return redirect(play_url) - # return jsonify({'parse': 0, 'playUrl': play_url, 'jx': 0, 'url': play_url}) - # return jsonify({'parse': 0, 'playUrl': play_url, 'jx': 0, 'url': ''}) - return jsonify({'parse': 0, 'playUrl': '', 'jx': 0, 'url': play_url}) - elif isinstance(play_url, dict): - return jsonify(play_url) - else: - return play_url - - if play_url: # 播放 - jxs = getJxs() - play_url = cms.playContent(play_url,jxs) - if isinstance(play_url,str): - return redirect(play_url) - elif isinstance(play_url,dict): - return jsonify(play_url) - else: - return play_url - - if ac and t: # 一级 - data = cms.categoryContent(t,pg) - # print(data) - return jsonify(data) - if ac and ids: # 二级 - id_list = ids.split(',') - # print('app:377',len(id_list)) - # print(id_list) - data = cms.detailContent(pg,id_list) - # print(data) - return jsonify(data) - if wd: # 搜索 - data = cms.searchContent(wd) - # print(data) - return jsonify(data) - - # return jsonify({'rule':rule,'js_code':js_code}) - home_data = cms.homeContent(pg) - return jsonify(home_data) - -@app.route('/clear') -def clear(): - rule = getParmas('rule') - if not rule: - return jsonify(error.failed('规则字段必填')) - cache_path = os.path.abspath(f'cache/{rule}.js') - if not os.path.exists(cache_path): - return jsonify(error.failed('服务端没有此规则的缓存文件!'+cache_path)) - os.remove(cache_path) - return jsonify(error.success('成功删除文件:'+cache_path)) - -def getRules(path='cache'): - t1 = time() - base_path = path+'/' # 当前文件所在目录 - # print(base_path) - os.makedirs(base_path,exist_ok=True) - file_name = os.listdir(base_path) - file_name = list(filter(lambda x: str(x).endswith('.js') and str(x).find('模板') < 0, file_name)) - # print(file_name) - rule_list = [file.replace('.js', '') for file in file_name] - js_path = [f'{path}/{rule}.js' for rule in rule_list] - with open('js/模板.js', encoding='utf-8') as f: - before = f.read() - rule_codes = [] - # for js in js_path: - # with open(js,encoding='utf-8') as f: - # code = f.read() - # rule_codes.append(js2py.eval_js(before+code)) - - ctx = js2py.EvalJs() - codes = [] - for i in range(len(js_path)): - js = js_path[i] - with open(js,encoding='utf-8') as f: - code = f.read() - codes.append(code.replace('rule',f'rule{i}',1)) - newCodes = before + '\n'+ '\n'.join(codes) - # print(newCodes) - ctx.execute(newCodes) - for i in range(len(js_path)): - rule_codes.append(ctx.eval(f'rule{i}')) - - # print(rule_codes) - # print(type(rule_codes[0]),rule_codes[0]) - # print(rule_codes[0].title) - # print(rule_codes[0].searchable) - # print(rule_codes[0].quickSearch) - new_rule_list = [] - for i in range(len(rule_list)): - new_rule_list.append({ - 'name':rule_list[i], - 'searchable':rule_codes[i].searchable or 0, - 'quickSearch':rule_codes[i].quickSearch or 0, - 'filterable':rule_codes[i].filterable or 0, - }) - # print(new_rule_list) - rules = {'list': new_rule_list, 'count': len(rule_list)} - logger.info(f'自动配置装载耗时:{get_interval(t1)}毫秒') - return rules - -def getPics(path='images'): - base_path = path+'/' # 当前文件所在目录 - os.makedirs(base_path,exist_ok=True) - file_name = os.listdir(base_path) - # file_name = list(filter(lambda x: str(x).endswith('.js') and str(x).find('模板') < 0, file_name)) - # print(file_name) - pic_list = [base_path+file for file in file_name] - # pic_list = file_name - # print(type(pic_list)) - return pic_list - -def getJxs(path='js'): - with open(f'{path}/解析.conf',encoding='utf-8') as f: - data = f.read().strip() - jxs = [] - for i in data.split('\n'): - i = i.strip() - dt = i.split(',') - if not i.startswith('#'): - jxs.append({ - 'name':dt[0], - 'url':dt[1], - 'type':dt[2] if len(dt) > 2 else 0, - 'ua':dt[3] if len(dt) > 3 else UA, - }) - # jxs = [{'name':dt.split(',')[0],'url':dt.split(',')[1]} for dt in data.split('\n')] - # jxs = list(filter(lambda x:not str(x['name']).strip().startswith('#'),jxs)) - # print(jxs) - print(f'共计{len(jxs)}条解析') - return jxs - - -def getClasses(): - if not db: - msg = '未提供数据库连接' - logger.info(msg) - return [] - res = db.session.query(RuleClass).all() - return [rc.name for rc in res] - -def getClassInfo(cls): - if not db: - msg = f'未提供数据库连接,获取{cls}详情失败' - logger.info(msg) - return None - logger.info(f'开始查询{cls}的分类详情') - res = db.session.query(RuleClass).filter(RuleClass.name == cls).first() - if res: - logger.info(str(res)) - return str(res) - else: - return f'数据库不存在{cls}的分类缓存' - - -@app.route('/favicon.ico') # 设置icon -def favicon(): - return app.send_static_file('img/favicon.svg') - # 对于当前文件所在路径,比如这里是static下的favicon.ico - return send_from_directory(os.path.join(app.root_path, 'static'), 'img/favicon.svg', mimetype='image/vnd.microsoft.icon') - -@app.route('/cls/') -def getClassInfoApi(cls): - info = getClassInfo(cls) - return jsonify({'msg':info}) - -@app.route('/clearcls/') -def clearClassApi(cls): - logger.info(f'开始查询{cls}的分类详情') - res = db.session.query(RuleClass).filter(RuleClass.name == cls) - if res: - res.delete() - db.session.commit() - return jsonify(error.success(f'已清除{cls}的分类缓存')) - else: - return jsonify(error.failed(f'数据库不存在{cls}的分类缓存')) - -@app.route('/rules') -def rules(): - return render_template('rules.html',rules=getRules(),classes=getClasses()) - -@app.route('/raw') -def rules_raw(): - return render_template('raw.html',rules=getRules(),classes=getClasses()) - -@app.route('/pics') -def random_pics(): - id = getParmas('id') - # print(f'id:{id}') - pics = getPics() - if len(pics) > 0: - if id and f'images/{id}.jpg' in pics: - pic = f'images/{id}.jpg' - else: - pic = random.choice(pics) - file = open(pic, "rb").read() - response = make_response(file) - response.headers['Content-Type'] = 'image/jpeg' - return response - else: - return redirect(config.WALL_PAPER) - -def get_live_url(new_conf,mode): - host = getHost(mode) - # t1 = time() - live_url = host + '/lives' if new_conf.get('LIVE_MODE',1) == 0 else lsg.getItem('LIVE_URL',getHost(2)+'/lives') - live_url = base64Encode(live_url) - # print(f'{get_interval(t1)}毫秒') - return live_url - -@app.route('/config/') -def config_render(mode): - # print(dict(app.config)) - if mode == 1: - jyw_ip = getHost(mode) - logger.info(jyw_ip) - new_conf = dict(app.config) - host = getHost(mode) - jxs = getJxs() - alists = getAlist() - live_url = get_live_url(new_conf,mode) - # html = render_template('config.txt',rules=getRules('js'),host=host,mode=mode,jxs=jxs,base64Encode=base64Encode,config=new_conf) - html = render_template('config.txt',rules=getRules('js'),host=host,mode=mode,jxs=jxs,alists=alists,live_url=live_url,config=new_conf) - response = make_response(html) - response.headers['Content-Type'] = 'application/json; charset=utf-8' - return response - -@app.route('/lives') -def get_lives(): - live_path = 'js/直播.txt' - if not os.path.exists(live_path): - with open(live_path,mode='w+',encoding='utf-8') as f: - f.write('') - - with open(live_path,encoding='utf-8') as f: - live_text = f.read() - response = make_response(live_text) - response.headers['Content-Type'] = 'text/plain; charset=utf-8' - return response - -@app.route('/liveslib') -def get_liveslib(): - live_path = 'js/custom_spider.jar' - if not os.path.exists(live_path): - with open(live_path,mode='w+',encoding='utf-8') as f: - f.write('') - - with open(live_path,mode='rb') as f: - live_text = f.read() - response = make_response(live_text) - filename = 'custom_spider.jar' - response.headers['Content-Type'] = 'application/octet-stream' - response.headers['Content-Disposition'] = f'attachment;filename="{filename}"' - return response - -@app.route('/configs') -def config_gen(): - # 生成文件 - os.makedirs('txt',exist_ok=True) - new_conf = dict(app.config) - jxs = getJxs() - alists = getAlist() - set_local = render_template('config.txt',rules=getRules('js'),alists=alists,live_url=get_live_url(new_conf,0),mode=0,host=getHost(0),jxs=jxs) - print(set_local) - set_area = render_template('config.txt',rules=getRules('js'),alists=alists,live_url=get_live_url(new_conf,1),mode=1,host=getHost(1),jxs=jxs) - set_online = render_template('config.txt',rules=getRules('js'),alists=alists,live_url=get_live_url(new_conf,2),mode=1,host=getHost(2),jxs=jxs) - with open('txt/pycms0.json','w+',encoding='utf-8') as f: - 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: - set_dict = json.loads(set_area) - f.write(json.dumps(set_dict,ensure_ascii=False,indent=4)) - - with open('txt/pycms2.json','w+',encoding='utf-8') as f: - 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)] - # print(files) - return jsonify(error.success('猫配置生成完毕,文件位置在:\n'+'\n'.join(files))) - -@app.route("/plugin/",methods=['GET']) -def plugin(name): - # name=道长影视模板.js - if not name or not name.split('.')[-1] in ['js','txt','py','json']: - return jsonify(error.failed(f'非法猥亵,未指定文件名。必须包含js|txt|json|py')) - try: - return parser.toJs(name) - except Exception as e: - return jsonify(error.failed(f'非法猥亵\n{e}')) - -def db_test(): - name = '555影视' - class_name = '电影&连续剧&福利&动漫&综艺' - class_url = '1&2&124&4&3' - # data = RuleClass.query.filter(RuleClass.name == '555影视').all() - res = db.session.query(RuleClass).filter(RuleClass.name == name).first() - print(res) - if res: - res.class_name = class_name - res.class_url = class_url - db.session.add(res) - msg = f'修改成功:{res.id}' - else: - res = RuleClass(name=name, class_name=class_name, class_url=class_url) - db.session.add(res) - res = db.session.query(RuleClass).filter(RuleClass.name == name).first() - msg = f'新增成功:{res.id}' - - try: - db.session.commit() - return jsonify(error.success(msg)) - except Exception as e: - return jsonify(error.failed(f'{e}')) - -@app.route('/db') -def database(): - return db_test() - - -if __name__ == '__main__': - # app.run(host="0.0.0.0", port=5705) - # app.run(debug=True, host='0.0.0.0', port=5705) +if __name__ == "__main__": http_port = int(app.config.get('HTTP_PORT', 5705)) http_host = app.config.get('HTTP_HOST', '0.0.0.0') if sys.version_info < (3, 9): # server = WSGIServer(('0.0.0.0', 5705), app, handler_class=WebSocketHandler,log=app.logger) # server = WSGIServer(('0.0.0.0', 5705), app, handler_class=WebSocketHandler,log=None) - server = WSGIServer((http_host, http_port), app,log=logger) + server = WSGIServer((http_host, http_port), app, log=logger) server.serve_forever() else: app.run(debug=False, host=http_host, port=http_port) \ No newline at end of file diff --git a/classes/___init__.py b/classes/___init__.py deleted file mode 100644 index b34a12d..0000000 --- a/classes/___init__.py +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# File : ___init__.py -# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ -# Date : 2022/8/27 - -from .cms import * \ No newline at end of file diff --git a/classes/cms.py b/classes/cms.py deleted file mode 100644 index 6247fbf..0000000 --- a/classes/cms.py +++ /dev/null @@ -1,895 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# File : cms.py -# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ -# Date : 2022/8/25 - -import requests -import re -import math -from utils.web import * -from models import * -from utils.config import playerConfig -from utils.log import logger -from utils.encode import base64Encode,baseDecode,fetch,post,request,getCryptoJS,getPreJs,buildUrl,getHome -from utils.encode import verifyCode,setDetail,join,urljoin2 -from utils.safePython import safePython -from utils.parser import runPy,runJScode,JsObjectWrapper -from utils.htmlParser import jsoup -from urllib.parse import urljoin -from concurrent.futures import ThreadPoolExecutor # 引入线程池 -from flask import url_for,redirect -from easydict import EasyDict as edict - -py_ctx = { -'requests':requests,'print':print,'base64Encode':base64Encode,'baseDecode':baseDecode, -'log':logger.info,'fetch':fetch,'post':post,'request':request,'getCryptoJS':getCryptoJS, -'buildUrl':buildUrl,'getHome':getHome,'setDetail':setDetail,'join':join,'urljoin2':urljoin2 -} -# print(getCryptoJS()) - -class CMS: - def __init__(self, rule, db=None, RuleClass=None, PlayParse=None,new_conf=None): - if new_conf is None: - new_conf = {} - self.title = rule.get('title', '') - self.id = rule.get('id', self.title) - self.lazy = rule.get('lazy', False) - self.play_disable = new_conf.get('PLAY_DISABLE',False) - self.retry_count = new_conf.get('RETRY_CNT',3) - self.lazy_mode = new_conf.get('LAZYPARSE_MODE') - self.ocr_api = new_conf.get('OCR_API') - self.cate_exclude = new_conf.get('CATE_EXCLUDE','') - try: - self.vod = redirect(url_for('vod')).headers['Location'] - except: - self.vod = '/vod' - # if not self.play_disable and self.lazy: - if not self.play_disable: - self.play_parse = rule.get('play_parse', False) - try: - play_url = getHost(self.lazy_mode) - except: - play_url = getHost(1,5705) - # play_url = new_conf.get('PLAY_URL',getHost(2)) - if not play_url.startswith('http'): - play_url = 'http://'+play_url - if self.play_parse: - # self.play_url = play_url + self.vod + '?play_url=' - self.play_url = f'{play_url}{self.vod}?rule={self.id}&play_url=' - # logger.info(f'cms重定向链接:{self.play_url}') - else: - self.play_url = '' - else: - self.play_parse = False - self.play_url = '' - # logger.info('播放免嗅地址: '+self.play_url) - - self.db = db - self.RuleClass = RuleClass - self.PlayParse = PlayParse - host = rule.get('host','').rstrip('/') - timeout = rule.get('timeout',5000) - homeUrl = rule.get('homeUrl','/') - url = rule.get('url','') - detailUrl = rule.get('detailUrl','') - searchUrl = rule.get('searchUrl','') - default_headers = getHeaders(host) - self_headers = rule.get('headers',{}) - default_headers.update(self_headers) - headers = default_headers - cookie = self.getCookie() - # print(f'{self.title}cookie:{cookie}') - if cookie: - headers['cookie'] = cookie - limit = rule.get('limit',6) - encoding = rule.get('编码', 'utf-8') - self.limit = min(limit,30) - keys = headers.keys() - for k in headers.keys(): - if str(k).lower() == 'user-agent': - v = headers[k] - if v == 'MOBILE_UA': - headers[k] = MOBILE_UA - elif v == 'PC_UA': - headers[k] = PC_UA - elif v == 'UC_UA': - headers[k] = UC_UA - lower_keys = list(map(lambda x:x.lower(),keys)) - if not 'user-agent' in lower_keys: - headers['User-Agent'] = UA - if not 'referer' in lower_keys: - headers['Referer'] = host - # print(headers) - self.headers = headers - self.host = host - self.homeUrl = urljoin(host,homeUrl) if host and homeUrl else homeUrl - if url.find('[') >-1 and url.find(']') > -1: - u1 = url.split('[')[0] - u2 = url.split('[')[1].split(']')[0] - self.url = urljoin(host,u1)+'['+urljoin(host,u2)+']' if host and url else url - else: - self.url = urljoin(host, url) if host and url else url - - self.detailUrl = urljoin(host,detailUrl) if host and detailUrl else detailUrl - self.searchUrl = urljoin(host,searchUrl) if host and searchUrl else searchUrl - self.class_name = rule.get('class_name','') - self.class_url = rule.get('class_url','') - self.class_parse = rule.get('class_parse','') - self.filter_name = rule.get('filter_name', '') - self.filter_url = rule.get('filter_url', '') - self.filter_parse = rule.get('filter_parse', '') - self.double = rule.get('double',False) - self.一级 = rule.get('一级','') - self.二级 = rule.get('二级','') - self.搜索 = rule.get('搜索','') - self.推荐 = rule.get('推荐','') - self.encoding = encoding - self.timeout = round(int(timeout)/1000,2) - self.filter = rule.get('filter',[]) - self.extend = rule.get('extend',[]) - self.d = self.getObject() - - def getName(self): - return self.title - - def getObject(self): - o = edict({ - 'jsp':jsoup(self.url), - 'getParse':self.getParse, - 'saveParse':self.saveParse, - 'headers':self.headers, - 'encoding':self.encoding, - 'name':self.title, - 'timeout':self.timeout, - }) - return o - - def regexp(self,prule,text,pos=None): - ret = re.search(prule,text).groups() - if pos != None and isinstance(pos,int): - return ret[pos] - else: - return ret - - def test(self,text,string): - searchObj = re.search(rf'{text}', string, re.M | re.I) - # print(searchObj) - # global vflag - if searchObj: - # vflag = searchObj.group() - pass - return searchObj - - def blank(self): - result = { - 'list': [] - } - return result - - def blank_vod(self): - return { - "vod_id": "", - "vod_name": "", - "vod_pic": "", - "type_name": "", - "vod_year": "", - "vod_area": "", - "vod_remarks": "", - "vod_actor": "", - "vod_director": "", - "vod_content": "" - } - - def jsoup(self): - jsp = jsoup(self.url) - pdfh = jsp.pdfh - pdfa = jsp.pdfa - pd = jsp.pd - pjfh = jsp.pjfh - pjfa = jsp.pjfa - pj = jsp.pj - - pq = jsp.pq - return pdfh,pdfa,pd,pq - - def getClasses(self): - if not self.db: - msg = '未提供数据库连接' - print(msg) - return [] - name = self.getName() - # self.db.metadata.clear() - # RuleClass = rule_classes.init(self.db) - res = self.db.session.query(self.RuleClass).filter(self.RuleClass.name == name).first() - # _logger.info('xxxxxx') - if res: - if not all([res.class_name,res.class_url]): - return [] - cls = res.class_name.split('&') - cls2 = res.class_url.split('&') - classes = [{'type_name':cls[i],'type_id':cls2[i]} for i in range(len(cls))] - # _logger.info(classes) - logger.info(f"{self.getName()}使用缓存分类:{classes}") - return classes - else: - return [] - - def getCookie(self): - name = self.getName() - if not self.db: - msg = f'{name}未提供数据库连接' - print(msg) - return False - res = self.db.session.query(self.RuleClass).filter(self.RuleClass.name == name).first() - if res: - return res.cookie or None - else: - return None - - def saveCookie(self,cookie): - name = self.getName() - if not self.db: - msg = f'{name}未提供数据库连接' - print(msg) - return False - res = self.db.session.query(self.RuleClass).filter(self.RuleClass.name == name).first() - if res: - res.cookie = cookie - self.db.session.add(res) - else: - res = self.RuleClass(name=name, cookie=cookie) - self.db.session.add(res) - try: - self.db.session.commit() - logger.info(f'{name}已保存cookie:{cookie}') - except Exception as e: - return f'保存cookie发生了错误:{e}' - - def saveClass(self, classes): - if not self.db: - msg = '未提供数据库连接' - print(msg) - return msg - name = self.getName() - class_name = '&'.join([cl['type_name'] for cl in classes]) - class_url = '&'.join([cl['type_id'] for cl in classes]) - # data = RuleClass.query.filter(RuleClass.name == '555影视').all() - # self.db.metadata.clear() - # RuleClass = rule_classes.init(self.db) - res = self.db.session.query(self.RuleClass).filter(self.RuleClass.name == name).first() - # print(res) - if res: - res.class_name = class_name - res.class_url = class_url - self.db.session.add(res) - msg = f'{self.getName()}修改成功:{res.id}' - else: - res = self.RuleClass(name=name, class_name=class_name, class_url=class_url) - self.db.session.add(res) - res = self.db.session.query(self.RuleClass).filter(self.RuleClass.name == name).first() - msg = f'{self.getName()}新增成功:{res.id}' - - try: - self.db.session.commit() - logger.info(msg) - except Exception as e: - return f'发生了错误:{e}' - - def getParse(self,play_url): - if not self.db: - msg = '未提供数据库连接' - print(msg) - return '' - name = self.getName() - # self.db.metadata.clear() - # RuleClass = rule_classes.init(self.db) - res = self.db.session.query(self.PlayParse).filter(self.PlayParse.play_url == play_url).first() - # _logger.info('xxxxxx') - if res: - real_url = res.real_url - logger.info(f"{name}使用缓存播放地址:{real_url}") - return real_url - else: - return '' - - def saveParse(self, play_url,real_url): - if not self.db: - msg = '未提供数据库连接' - print(msg) - return msg - name = self.getName() - # data = RuleClass.query.filter(RuleClass.name == '555影视').all() - # self.db.metadata.clear() - # RuleClass = rule_classes.init(self.db) - res = self.db.session.query(self.PlayParse).filter(self.PlayParse.play_url == play_url).first() - # print(res) - if res: - res.real_url = real_url - self.db.session.add(res) - msg = f'{name}服务端免嗅修改成功:{res.id}' - else: - res = self.PlayParse(play_url=play_url, real_url=real_url) - self.db.session.add(res) - res = self.db.session.query(self.PlayParse).filter(self.PlayParse.play_url == play_url).first() - msg = f'{name}服务端免嗅新增成功:{res.id}' - - try: - self.db.session.commit() - logger.info(msg) - except Exception as e: - return f'{name}发生了错误:{e}' - - - def homeContent(self,fypage=1): - # yanaifei - # https://yanetflix.com/vodtype/dianying.html - t1 = time() - result = {} - classes = [] - video_result = self.blank() - - if self.class_url and self.class_name: - class_names = self.class_name.split('&') - class_urls = self.class_url.split('&') - cnt = min(len(class_urls), len(class_names)) - for i in range(cnt): - classes.append({ - 'type_name': class_names[i], - 'type_id': class_urls[i] - }) - # print(self.url) - print(self.headers) - has_cache = False - if self.homeUrl.startswith('http'): - # print(self.homeUrl) - # print(self.class_parse) - try: - if self.class_parse: - t2 = time() - cache_classes = self.getClasses() - logger.info(f'{self.getName()}读取缓存耗时:{get_interval(t2)}毫秒') - if len(cache_classes) > 0: - classes = cache_classes - # print(cache_classes) - has_cache = True - # logger.info(f'是否有缓存分类:{has_cache}') - if has_cache and not self.推荐: - pass - else: - new_classes = [] - r = requests.get(self.homeUrl, headers=self.headers, timeout=self.timeout) - r.encoding = self.encoding - html = r.text - # print(html) - # print(self.headers) - if self.class_parse and not has_cache: - p = self.class_parse.split(';') - # print(p) - jsp = jsoup(self.url) - pdfh = jsp.pdfh - pdfa = jsp.pdfa - pd = jsp.pd - items = pdfa(html,p[0]) - # print(len(items)) - # print(items) - for item in items: - title = pdfh(item, p[1]) - # 过滤排除掉标题名称 - if self.cate_exclude and jsp.test(self.cate_exclude, title): - continue - url = pd(item, p[2]) - # print(url) - tag = url - if len(p) > 3 and p[3].strip(): - tag = self.regexp(p[3].strip(),url,0) - new_classes.append({ - 'type_name': title, - 'type_id': tag - }) - if len(new_classes) > 0: - classes.extend(new_classes) - self.saveClass(classes) - video_result = self.homeVideoContent(html,fypage) - except Exception as e: - logger.info(f'{self.getName()}主页发生错误:{e}') - - result['class'] = classes - if self.filter: - result['filters'] = playerConfig['filter'] - result.update(video_result) - # print(result) - logger.info(f'{self.getName()}获取首页总耗时(包含读取缓存):{get_interval(t1)}毫秒') - return result - - def homeVideoContent(self,html,fypage=1): - if not self.推荐: - return self.blank() - - p = self.推荐.split(';') # 解析 - if not self.double and len(p) < 5: - return self.blank() - if self.double and len(p) < 6: - return self.blank() - result = {} - videos = [] - jsp = jsoup(self.homeUrl) - is_json = str(p[0]).startswith('json:') - pdfh = jsp.pjfh if is_json else jsp.pdfh - pdfa = jsp.pjfa if is_json else jsp.pdfa - pd = jsp.pj if is_json else jsp.pd - # print(html) - try: - if self.double: - items = pdfa(html, p[0]) - for item in items: - items2 = pdfa(item,p[1]) - for item2 in items2: - try: - title = pdfh(item2, p[2]) - img = pd(item2, p[3]) - desc = pdfh(item2, p[4]) - links = [pd(item2, p5) if not self.detailUrl else pdfh(item2, p5) for p5 in p[5].split('+')] - link = '$'.join(links) - content = '' if len(p) < 7 else pdfh(item2, p[6]) - videos.append({ - "vod_id": link, - "vod_name": title, - "vod_pic": img, - "vod_remarks": desc, - "vod_content": content, - "type_id": 1, - "type_name": "首页推荐", - }) - except: - pass - else: - items = pdfa(html, p[0].replace('json:','')) - # print(items) - for item in items: - try: - title = pdfh(item, p[1]) - img = pd(item, p[2]) - desc = pdfh(item, p[3]) - # link = pd(item, p[4]) - links = [pd(item, p5) if not self.detailUrl else pdfh(item, p5) for p5 in p[4].split('+')] - link = '$'.join(links) - content = '' if len(p) < 6 else pdfh(item, p[5]) - videos.append({ - "vod_id": link, - "vod_name": title, - "vod_pic": img, - "vod_remarks": desc, - "vod_content": content, - "type_id": 1, - "type_name": "首页推荐", - }) - except: - pass - # result['list'] = videos[min((fypage-1)*self.limit,len(videos)-1):min(fypage*self.limit,len(videos))] - result['list'] = videos - result['code'] = 1 - result['msg'] = '数据列表' - result['page'] = fypage - result['pagecount'] = math.ceil(len(videos)/self.limit) - result['limit'] = self.limit - result['total'] = len(videos) - result['now_count'] = len(result['list']) - return result - except Exception as e: - logger.info(f'首页内容获取失败:{e}') - return self.blank() - - def categoryContent(self, fyclass, fypage): - """ - 一级带分类的数据返回 - :param fyclass: 分类标识 - :param fypage: 页码 - :return: cms一级数据 - """ - - result = {} - # urlParams = ["", "", "", "", "", "", "", "", "", "", "", ""] - # urlParams = [""] * 12 - # urlParams[0] = tid - # urlParams[8] = str(pg) - # for key in self.extend: - # urlParams[int(key)] = self.extend[key] - # params = '-'.join(urlParams) - # print(params) - # url = self.url + '/{0}.html'.format - t1 = time() - pg = str(fypage) - url = self.url.replace('fyclass',fyclass).replace('fypage',pg) - if fypage == 1 and self.test('[\[\]]',url): - url = url.split('[')[1].split(']')[0] - p = self.一级.split(';') # 解析 - if len(p) < 5: - return self.blank() - - jsp = jsoup(self.url) - is_json = str(p[0]).startswith('json:') - pdfh = jsp.pjfh if is_json else jsp.pdfh - pdfa = jsp.pjfa if is_json else jsp.pdfa - pd = jsp.pj if is_json else jsp.pd - # print(pdfh(r.text,'body a.module-poster-item.module-item:eq(1)&&Text')) - # print(pdfh(r.text,'body a.module-poster-item.module-item:eq(0)')) - # print(pdfh(r.text,'body a.module-poster-item.module-item:first')) - - videos = [] - items = [] - try: - r = requests.get(url, headers=self.headers, timeout=self.timeout) - r.encoding = self.encoding - print(r.url) - # html = r.text - html = r.json() if is_json else r.text - # print(html) - items = pdfa(html,p[0].replace('json:','',1)) - except: - pass - # print(items) - for item in items: - # print(item) - try: - title = pdfh(item, p[1]) - img = pd(item, p[2]) - desc = pdfh(item, p[3]) - links = [pd(item, p4) if not self.detailUrl else pdfh(item, p4) for p4 in p[4].split('+')] - link = '$'.join(links) - content = '' if len(p) < 6 else pdfh(item, p[5]) - # sid = self.regStr(sid, "/video/(\\S+).html") - videos.append({ - "vod_id": f'{fyclass}${link}' if self.detailUrl else link,# 分类,播放链接 - "vod_name": title, - "vod_pic": img, - "vod_remarks": desc, - "vod_content": content, - }) - except Exception as e: - print(f'发生了错误:{e}') - pass - result['list'] = videos - result['page'] = fypage - result['pagecount'] = 9999 - result['limit'] = 9999 - result['total'] = 999999 - logger.info(f'{self.getName()}获取分类{fyclass}第{fypage}页耗时:{get_interval(t1)}毫秒,共计{round(len(str(result)) / 1000, 2)} kb') - - return result - - def detailOneVod(self,id,fyclass=''): - detailUrl = str(id) - vod = {} - if not detailUrl.startswith('http'): - url = self.detailUrl.replace('fyid', detailUrl).replace('fyclass',fyclass) - else: - url = detailUrl - # print(url) - try: - p = self.二级 # 解析 - if p == '*': - vod = self.blank_vod() - vod['vod_play_from'] = '道长在线' - vod['vod_remarks'] = self.play_url+detailUrl - vod['vod_actor'] = '没有二级,只有一级链接直接嗅探播放' - vod['vod_content'] = detailUrl - vod['vod_play_url'] = '嗅探播放$'+detailUrl - return vod - - if not isinstance(p,dict) and not isinstance(p,str) and not str(p).startswith('js:'): - return vod - - jsp = jsoup(self.url) - - is_json = p.get('is_json',False) if isinstance(p,dict) else False # 二级里加is_json参数 - is_js = isinstance(p,str) and str(p).startswith('js:') # 是js - if is_js: - headers['Referer'] = getHome(url) - py_ctx.update({ - 'input': url, - 'fetch_params': {'headers': headers, 'timeout': self.d.timeout, 'encoding': self.d.encoding}, - 'd': self.d, - 'getParse': self.d.getParse, - 'saveParse': self.d.saveParse, - 'jsp':jsp,'setDetail':setDetail, - }) - ctx = py_ctx - # print(ctx) - jscode = getPreJs() + p.replace('js:','',1) - # print(jscode) - loader, _ = runJScode(jscode, ctx=ctx) - # print(loader.toString()) - vod = loader.eval('vod') - if isinstance(vod,JsObjectWrapper): - vod = vod.to_dict() - else: - vod = {} - # print(type(vod)) - # print(vod) - else: - pdfh = jsp.pjfh if is_json else jsp.pdfh - pdfa = jsp.pjfa if is_json else jsp.pdfa - pd = jsp.pj if is_json else jsp.pd - pq = jsp.pq - obj = {} - vod_name = '' - r = requests.get(url, headers=self.headers, timeout=self.timeout) - r.encoding = self.encoding - # html = r.text - html = r.json() if is_json else r.text - # print(html) - if p.get('title'): - p1 = p['title'].split(';') - vod_name = pdfh(html,p1[0]).replace('\n',' ') - # title = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) - title = '\n'.join([','.join([pdfh(html, pp1).strip() for pp1 in i.split('+')]) for i in p1]) - # print(title) - obj['title'] = title - if p.get('desc'): - p1 = p['desc'].split(';') - desc = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) - obj['desc'] = desc - - if p.get('content'): - p1 = p['content'].split(';') - content = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) - obj['content'] = content - - if p.get('img'): - p1 = p['img'].split(';') - img = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) - obj['img'] = img - - vod = { - "vod_id": detailUrl, - "vod_name": vod_name, - "vod_pic": obj.get('img',''), - "type_name": obj.get('title',''), - "vod_year": "", - "vod_area": "", - "vod_remarks": obj.get('desc',''), - "vod_actor": "", - "vod_director": "", - "vod_content": obj.get('content','') - } - - vod_play_from = '$$$' - playFrom = [] - if p.get('tabs'): - # print(p['tabs'].split(';')[0]) - vodHeader = pdfa(html,p['tabs'].split(';')[0]) - # print(f'线路列表数:{len((vodHeader))}') - # print(vodHeader) - if not is_json: - vodHeader = [pq(v).text() for v in vodHeader] - else: - vodHeader = ['道长在线'] - - # print(vodHeader) - - for v in vodHeader: - playFrom.append(v) - vod_play_from = vod_play_from.join(playFrom) - - vod_play_url = '$$$' - vod_tab_list = [] - if p.get('lists'): - for i in range(len(vodHeader)): - tab_name = str(vodHeader[i]) - tab_ext = p['tabs'].split(';')[1] if len(p['tabs'].split(';')) > 1 else '' - p1 = p['lists'].replace('#idv',tab_name).replace('#id',str(i)) - tab_ext = tab_ext.replace('#idv',tab_name).replace('#id',str(i)) - vodList = pdfa(html,p1) # 1条线路的选集列表 - # print(vodList) - # vodList = [pq(i).text()+'$'+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 - if self.play_parse: # 自动base64编码 - vodList = [(pdfh(html,tab_ext) if tab_ext else tab_name)+'$'+self.play_url+base64Encode(i) for i in vodList] if is_json else\ - [pq(i).text()+'$'+self.play_url+base64Encode(pd(i,'a&&href')) for i in vodList] # 拼接成 名称$链接 - else: - vodList = [(pdfh(html, tab_ext) if tab_ext else tab_name) + '$' + self.play_url + i for i in - vodList] if is_json else \ - [pq(i).text() + '$' + self.play_url + pd(i, 'a&&href') for i in vodList] # 拼接成 名称$链接 - vlist = '#'.join(vodList) # 拼多个选集 - vod_tab_list.append(vlist) - vod_play_url = vod_play_url.join(vod_tab_list) - # print(vod_play_url) - vod['vod_play_from'] = vod_play_from - # print(vod_play_from) - vod['vod_play_url'] = vod_play_url - # print(vod_play_url) - except Exception as e: - logger.info(f'{self.getName()}获取单个详情页{detailUrl}出错{e}') - # print(vod) - return vod - - def detailContent(self, fypage, array): - """ - cms二级数据 - :param array: - :return: - """ - t1 = time() - array = array if len(array) <= self.limit else array[(fypage-1)*self.limit:min(self.limit*fypage,len(array))] - thread_pool = ThreadPoolExecutor(min(self.limit,len(array))) # 定义线程池来启动多线程执行此任务 - obj_list = [] - try: - for vod_url in array: - # print(vod_url) - vod_class = '' - if vod_url.find('$') > -1: - tmp = vod_url.split('$') - vod_class = tmp[0] - vod_url = tmp[1] - obj = thread_pool.submit(self.detailOneVod, vod_url,vod_class) - obj_list.append(obj) - thread_pool.shutdown(wait=True) # 等待所有子线程并行完毕 - vod_list = [obj.result() for obj in obj_list] - result = { - 'list': vod_list - } - logger.info(f'{self.getName()}获取详情页耗时:{get_interval(t1)}毫秒,共计{round(len(str(result)) / 1000, 2)} kb') - except Exception as e: - result = { - 'list': [] - } - logger.info(f'{self.getName()}获取详情页耗时:{get_interval(t1)}毫秒,发生错误:{e}') - # print(result) - return result - - def searchContent(self, key, fypage=1): - pg = str(fypage) - if not self.searchUrl: - return self.blank() - url = self.searchUrl.replace('**', key).replace('fypage',pg) - logger.info(f'{self.getName()}搜索链接:{url}') - if not self.搜索: - return self.blank() - p = self.一级.split(';') if self.搜索 == '*' and self.一级 else self.搜索.split(';') # 解析 - if len(p) < 5: - return self.blank() - jsp = jsoup(self.url) - is_json = str(p[0]).startswith('json:') - pdfh = jsp.pjfh if is_json else jsp.pdfh - pdfa = jsp.pjfa if is_json else jsp.pdfa - pd = jsp.pj if is_json else jsp.pd - pq = jsp.pq - videos = [] - try: - r = requests.get(url, headers=self.headers,timeout=self.timeout) - r.encoding = self.encoding - # html = r.text - html = r.json() if is_json else r.text - # print(html) - if not is_json and html.find('输入验证码') > -1: - cookie = verifyCode(url,self.headers,self.timeout,self.retry_count,self.ocr_api) - # cookie = '' - if not cookie: - return { - 'list': videos - } - self.saveCookie(cookie) - self.headers['cookie'] = cookie - r = requests.get(url, headers=self.headers, timeout=self.timeout) - r.encoding = self.encoding - html = r.text - - items = pdfa(html,p[0].replace('json:','',1)) - print(items) - videos = [] - for item in items: - # print(item) - try: - title = pdfh(item, p[1]) - img = pd(item, p[2]) - desc = pdfh(item, p[3]) - # link = '$'.join([pd(item, p4) for p4 in p[4].split('+')]) - links = [pd(item, p4) if not self.detailUrl else pdfh(item, p4) for p4 in p[4].split('+')] - link = '$'.join(links) - content = '' if len(p) < 6 else pdfh(item, p[5]) - # sid = self.regStr(sid, "/video/(\\S+).html") - videos.append({ - "vod_id": link, - "vod_name": title, - "vod_pic": img, - "vod_remarks": desc, - "vod_content": content, - }) - except: - pass - # print(videos) - except Exception as e: - logger.info(f'搜索{self.getName()}发生错误:{e}') - result = { - 'list': videos - } - return result - - def playContent(self, play_url,jxs=None,flag=None): - # logger.info('播放免嗅地址: ' + self.play_url) - if not jxs: - jxs = [] - try: - play_url = baseDecode(play_url) # 自动base64解码 - except: - pass - if self.lazy: - print(f'{play_url}->开始执行免嗅代码{type(self.lazy)}->{self.lazy}') - t1 = time() - try: - if type(self.lazy) == JsObjectWrapper: - logger.info(f'lazy非纯文本免嗅失败耗时:{get_interval(t1)}毫秒,播放地址:{play_url}') - - elif not str(self.lazy).startswith('js:'): - pycode = runPy(self.lazy) - if pycode: - # print(pycode) - pos = pycode.find('def lazyParse') - if pos < 0: - return play_url - pyenv = safePython(self.lazy,pycode[pos:]) - lazy_url = pyenv.action_task_exec('lazyParse',[play_url,self.d]) - logger.info(f'py免嗅耗时:{get_interval(t1)}毫秒,播放地址:{lazy_url}') - if isinstance(lazy_url,str) and lazy_url.startswith('http'): - play_url = lazy_url - else: - jscode = str(self.lazy).split('js:')[1] - # jscode = f'var input={play_url};{jscode}' - # print(jscode) - headers['Referer'] = getHome(play_url) - py_ctx.update({ - 'input': play_url, - 'fetch_params':{'headers':headers,'timeout':self.d.timeout,'encoding':self.d.encoding}, - 'd': self.d, - 'jxs':jxs, - 'getParse':self.d.getParse, - 'saveParse':self.d.saveParse, - 'pdfh': self.d.jsp.pdfh, - 'pdfa': self.d.jsp.pdfa, 'pd': self.d.jsp.pd, - }) - ctx = py_ctx - # print(ctx) - jscode = getPreJs() + jscode - # print(jscode) - loader,_ = runJScode(jscode,ctx=ctx) - # print(loader.toString()) - play_url = loader.eval('input') - if isinstance(play_url,JsObjectWrapper): - play_url = play_url.to_dict() - # print(type(play_url)) - # print(play_url) - logger.info(f'js免嗅耗时:{get_interval(t1)}毫秒,播放地址:{play_url}') - except Exception as e: - logger.info(f'免嗅耗时:{get_interval(t1)}毫秒,并发生错误:{e}') - return play_url - else: - logger.info(f'播放重定向到:{play_url}') - return play_url - -if __name__ == '__main__': - print(urljoin('https://api.web.360kan.com/v1/f', - '//0img.hitv.com/preview/sp_images/2022/01/28/202201281528074643023.jpg')) - # exit() - from utils import parser - # js_path = f'js/玩偶姐姐.js' - # js_path = f'js/555影视.js' - with open('../js/模板.js', encoding='utf-8') as f: - before = f.read() - js_path = f'js/360影视.js' - ctx, js_code = parser.runJs(js_path,before=before) - ruleDict = ctx.rule.to_dict() - # lazy = ctx.eval('lazy') - # print(lazy) - # ruleDict['id'] = rule # 把路由请求的id装到字典里,后面播放嗅探才能用 - - cms = CMS(ruleDict) - print(cms.title) - print(cms.homeContent()) - # print(cms.categoryContent('5',1)) - # print(cms.categoryContent('latest',1)) - # print(cms.detailContent(['https://www.2345ka.com/v/45499.html'])) - # print(cms.detailContent(1,['https://cokemv.me/voddetail/40573.html'])) - # cms.categoryContent('dianying',1) - # print(cms.detailContent(['67391'])) - # print(cms.searchContent('斗罗大陆')) - print(cms.searchContent('独行月球')) \ No newline at end of file diff --git a/config.py b/config.py deleted file mode 100644 index 481322d..0000000 --- a/config.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# File : config.py -# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ -# Date : 2022/8/27 - -DIALECT = 'mysql' -DRIVER = 'pymysql' -USERNAME = 'gp' -PASSWORD = '123456' -HOST = '127.0.0.1' -PORT = '3306' -DATABASE = 'pira' -# DB_URI = '{}+{}://{}:{}@{}:{}/{}?charset=utf8'.format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT, DATABASE) -DB_URI = 'sqlite:///models/rules.db?charset=utf8&check_same_thread=False' -SQLALCHEMY_DATABASE_URI = DB_URI -SQLALCHEMY_TRACK_MODIFICATIONS = False -SQLALCHEMY_ECHO = False # 打印sql语句 -JSON_AS_ASCII = False # jsonify返回的中文正常显示 -PLAY_URL = 'http://cms.nokia.press' # 匹配远程解析服务器链接 远程接口主页地址,后面不能有/ -PLAY_URL = PLAY_URL.rstrip('/') -HTTP_HOST = '0.0.0.0' -HTTP_PORT = '5705' -PLAY_DISABLE = False # 全局禁用播放解析 -LAZYPARSE_MODE = 1 # 播放解析模式(0 本地 1 局域网 2远程 仅在全局禁用为False的时候生效) -WALL_PAPER_ENABLE = True # 启用自定义壁纸 -WALL_PAPER = "https://picsum.photos/1280/720/?blur=10" # 自定义壁纸,可注释 -SUP_PORT = 9001 # supervisord 服务端口 -RETRY_CNT = 3 # 验证码重试次数 -# OCR_API = 'http://192.168.3.224:9000/api/ocr_img' # 验证码识别接口,传参数data -OCR_API = 'http://dm.mudery.com:10000' # 验证码识别接口,传参数data -UNAME = 'admin' # 管理员账号 -PWD = 'drpy' # 管理员密码 -MAX_CONTENT_LENGTH = 1 * 1024 * 1024/100 # 100 kB -LIVE_MODE = 0 # 0 本地 1外网 -LIVE_URL = 'https://gitcode.net/qq_26898231/TVBox/-/raw/main/live/zb.txt' # 初始化外网直播地址(后续在管理界面改) -CATE_EXCLUDE = '首页|留言|APP|下载|资讯|新闻|动态' # 动态分类过滤 -# {% if config.WALL_PAPER %}"wallpaper":"{{ config.WALL_PAPER }}",{% endif %} \ No newline at end of file diff --git a/js/rules.py b/js/rules.py index 45a6a49..f299025 100644 --- a/js/rules.py +++ b/js/rules.py @@ -5,6 +5,10 @@ # Date : 2022/8/25 import os +from time import time +import js2py +from utils.log import logger +from utils.web import get_interval,UA def getRuleLists(): base_path = os.path.dirname(os.path.abspath(__file__)) # 当前文件所在目录 @@ -16,5 +20,74 @@ def getRuleLists(): # print(rule_list) return rule_list +def getRules(path='cache'): + t1 = time() + base_path = path+'/' # 当前文件所在目录 + # print(base_path) + os.makedirs(base_path,exist_ok=True) + file_name = os.listdir(base_path) + file_name = list(filter(lambda x: str(x).endswith('.js') and str(x).find('模板') < 0, file_name)) + # print(file_name) + rule_list = [file.replace('.js', '') for file in file_name] + js_path = [f'{path}/{rule}.js' for rule in rule_list] + with open('js/模板.js', encoding='utf-8') as f: + before = f.read() + rule_codes = [] + # for js in js_path: + # with open(js,encoding='utf-8') as f: + # code = f.read() + # rule_codes.append(js2py.eval_js(before+code)) + + ctx = js2py.EvalJs() + codes = [] + for i in range(len(js_path)): + js = js_path[i] + with open(js,encoding='utf-8') as f: + code = f.read() + codes.append(code.replace('rule',f'rule{i}',1)) + newCodes = before + '\n'+ '\n'.join(codes) + # print(newCodes) + ctx.execute(newCodes) + for i in range(len(js_path)): + rule_codes.append(ctx.eval(f'rule{i}')) + + # print(rule_codes) + # print(type(rule_codes[0]),rule_codes[0]) + # print(rule_codes[0].title) + # print(rule_codes[0].searchable) + # print(rule_codes[0].quickSearch) + new_rule_list = [] + for i in range(len(rule_list)): + new_rule_list.append({ + 'name':rule_list[i], + 'searchable':rule_codes[i].searchable or 0, + 'quickSearch':rule_codes[i].quickSearch or 0, + 'filterable':rule_codes[i].filterable or 0, + }) + # print(new_rule_list) + rules = {'list': new_rule_list, 'count': len(rule_list)} + logger.info(f'自动配置装载耗时:{get_interval(t1)}毫秒') + return rules + +def getJxs(path='js'): + with open(f'{path}/解析.conf',encoding='utf-8') as f: + data = f.read().strip() + jxs = [] + for i in data.split('\n'): + i = i.strip() + dt = i.split(',') + if not i.startswith('#'): + jxs.append({ + 'name':dt[0], + 'url':dt[1], + 'type':dt[2] if len(dt) > 2 else 0, + 'ua':dt[3] if len(dt) > 3 else UA, + }) + # jxs = [{'name':dt.split(',')[0],'url':dt.split(',')[1]} for dt in data.split('\n')] + # jxs = list(filter(lambda x:not str(x['name']).strip().startswith('#'),jxs)) + # print(jxs) + print(f'共计{len(jxs)}条解析') + return jxs + if __name__ == '__main__': print(getRuleLists()) \ No newline at end of file diff --git a/js/version.txt b/js/version.txt index d40b13a..a4f52a5 100644 --- a/js/version.txt +++ b/js/version.txt @@ -1 +1 @@ -3.1.7 \ No newline at end of file +3.2.0 \ No newline at end of file diff --git "a/js/\347\233\264\346\222\255.txt" "b/js/\347\233\264\346\222\255.txt" index fe2e74c..70002e3 100644 --- "a/js/\347\233\264\346\222\255.txt" +++ "b/js/\347\233\264\346\222\255.txt" @@ -445,187 +445,38 @@ CCTV17超高清,http://live.aikan.miguvideo.com/PLTV/88888888/224/3221231772/ind 北京卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225674/index.m3u8 北京卫视,http://140.207.241.3:8080/live/program/live/bjwshd/4000000/mnf.m3u8 北京卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225674/index.m3u8 -深圳卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225741/index.m3u8 -深圳卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225700/index.m3u8 -深圳卫视,http://39.134.66.110/PLTV/88888888/224/3221225668/index.m3u8 -深圳卫视,http://140.207.241.3:8080/live/program/live/szwshd/4000000/mnf.m3u8 -湖南卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225745/index.m3u8 -湖南卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225745/index.m3u8 -湖南卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225704/index.m3u8 -湖南卫视,http://39.134.66.66/PLTV/88888888/224/3221225506/index.m3u8 -湖南卫视,http://39.134.66.110/PLTV/88888888/224/3221225977/index.m3u8 -湖南卫视,http://39.134.66.110/PLTV/88888888/224/3221225506/index.m3u8 -重庆卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225692/index.m3u8 -重庆卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225692/index.m3u8 -重庆卫视,http://39.134.66.110/PLTV/88888888/224/3221225963/index.m3u8 -重庆卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225734/index.m3u8 -浙江卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225744/index.m3u8 -浙江卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225703/index.m3u8 -浙江卫视,http://140.207.241.3:8080/live/program/live/zjwshd/4000000/mnf.m3u8 -浙江卫视,http://39.134.66.66/PLTV/88888888/224/3221225514/index.m3u8 -辽宁卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225735/index.m3u8 -辽宁卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225696/index.m3u8 -辽宁卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225735/index.m3u8 -辽宁卫视,http://140.207.241.3:8080/live/program/live/lnwshd/4000000/mnf.m3u8 -江苏卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225702/index.m3u8 -江苏卫视,http://183.207.255.197/live/program/live/jswshd/2300000/mnf.m3u8 -江苏卫视,http://39.134.66.110/PLTV/88888888/224/3221225503/index.m3u8 -江苏卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225743/index.m3u8 -江苏卫视,http://140.207.241.3:8080/live/program/live/jswshd/4000000/mnf.m3u8 -江苏卫视,http://39.134.66.66/PLTV/88888888/224/3221225503/index.m3u8 -江苏卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225702/index.m3u8 -江西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225746/index.m3u8 -江西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225705/index.m3u8 -江西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225746/index.m3u8 -江西卫视,http://140.207.241.3:8080/live/program/live/jxwshd/4000000/mnf.m3u8 -东方卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225659/index.m3u8 -东方卫视,http://183.207.255.197/live/program/live/hddfws/2300000/mnf.m3u8 -东方卫视,http://140.207.241.3:8080/live/program/live/hddfws/4000000/mnf.m3u8 -广东卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225701/index.m3u8 -广东卫视,http://39.134.66.110/PLTV/88888888/224/3221225966/index.m3u8 -广东卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225742/index.m3u8 -广东卫视,http://140.207.241.3:8080/live/program/live/gdwshd/4000000/mnf.m3u8 -天津卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225698/index.m3u8 -天津卫视,http://140.207.241.3:8080/live/program/live/tjwshd/4000000/mnf.m3u8 -山东卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225697/index.m3u8 -山东卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225738/index.m3u8 -山东卫视,http://140.207.241.3:8080/live/program/live/sdwshd/4000000/mnf.m3u8 -湖北卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225699/index.m3u8 -湖北卫视,http://140.207.241.3:8080/live/program/live/hbwshd/4000000/mnf.m3u8 -安徽卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225691/index.m3u8 -安徽卫视,http://140.207.241.3:8080/live/program/live/ahwshd/4000000/mnf.m3u8 -四川卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225733/index.m3u8 -河北卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225732/index.m3u8 -贵州卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225728/index.m3u8 -贵州卫视,http://39.134.66.110/PLTV/88888888/224/3221225974/index.m3u8 -山西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225730/index.m3u8 -青海卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225727/index.m3u8 -云南卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225664/index.m3u8 -东南卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225657/index.m3u8 -东南卫视,http://140.207.241.3:8080/live/program/live/dnwshd/4000000/mnf.m3u8 -河南卫视,http://39.134.66.110/PLTV/88888888/224/3221225988/index.m3u8 -陕西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225729/index.m3u8 -内蒙古卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225667/index.m3u8 -宁夏卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225726/index.m3u8 -甘肃卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225724/index.m3u8 -新疆卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225725/index.m3u8 -广西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225731/index.m3u8 -吉林卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225680/index.m3u8 -吉林卫视,http://39.134.66.110/PLTV/88888888/224/3221225981/index.m3u8 -龙江卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225690/index.m3u8 -西藏卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225723/index.m3u8 -黑龙江卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225736/index.m3u8 -黑龙江卫视,http://39.134.66.110/PLTV/88888888/224/3221225985/index.m3u8 -黑龙江卫视,http://140.207.241.3:8080/live/program/live/hljwshd/4000000/mnf.m3u8 -综艺铜艺,http://39.134.66.110/PLTV/88888888/224/3221225525/index.m3u8 北京卫视,http://140.207.241.2:8080/live/program/live/bjwshd/4000000/mnf.m3u8 -北京卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/bjwshd/4000000/mnf.m3u8 -重庆卫视,http://183.207.255.197/live/program/live/cqws/1300000/mnf.m3u8 -湖南卫视,http://39.134.66.2/PLTV/88888888/224/3221225506/index.m3u8 -浙江卫视,http://39.134.66.2/PLTV/88888888/224/3221225514/index.m3u8 -浙江卫视,http://hw-m-l.cztv.com/channels/lantian/channel01/1080p.m3u8 -浙江卫视,http://hw-m-l.cztv.com/channels/lantian/channel15/1080p.m3u8 -辽宁卫视,http://39.134.66.66/PLTV/88888888/224/3221225499/index.m3u8 -辽宁卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/lnwshd/4000000/mnf.m3u8 -江西卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225705/index.m3u8 -江西卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/jxwshd/4000000/mnf.m3u8 -江苏卫视,http://39.134.66.2/PLTV/88888888/224/3221225503/index.m3u8 -江苏卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/jswshd/4000000/mnf.m3u8 -东方卫视,http://39.134.66.66/PLTV/88888888/224/3221225672/index.m3u8 -东方卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225658/index.m3u8 -东方卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/hddfws/4000000/mnf.m3u8 -广东卫视,http://cm.wshls.homecdn.com/live/1bd69.m3u8 -广东卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/gdwshd/4000000/mnf.m3u8 -山东卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225738/index.m3u8 -山东卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/sdwshd/4000000/mnf.m3u8 -安徽卫视,http://183.207.255.197/live/program/live/ahwshd/2300000/mnf.m3u8 -安徽卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/ahwshd/4000000/mnf.m3u8 -安徽卫视,http://183.207.249.15/PLTV/3/224/3221225634/index.m3u8 -河北卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225732/index.m3u8 -东南卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/dnwshd/2300000/mnf.m3u8 -青海卫视,http://stream.qhbtv.com/qhws/sd/live.m3u8?_upt=63cf437e1591689484 -内蒙古卫视,http://39.134.66.66/PLTV/88888888/224/3221225577/index.m3u8 -新疆卫视,http://39.134.66.66/PLTV/88888888/224/3221225582/index.m3u8 -广西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225731/index.m3u8 -晋江卫视,http://stream.jinjiang.tv/1/sd/live.m3u8 -上海纪实,http://183.207.255.188/live/program/live/jspdhd/4000000/mnf.m3u8 -延边卫视,http://live.ybtvyun.com/video/s10006-90fe76c52091/index.m3u8 -安多卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221226195/index.m3u8 -人间卫视,https://5ddce30eb4b55.streamlock.net/bltvhd/bltv1/chunklist_w511254805.m3u8 -海南卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225722/index.m3u8 -辽宁卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225735/index.m3u8 -辽宁卫视,http://112.74.200.9:88/tv000000/m3u8.php?/migu/630291707 -山西卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225549/index.m3u8?fmt=ts2hls -康巴卫视,http://111.40.196.38/PLTV/88888888/224/3221225648/index.m3u8 北京卫视,http://111.40.196.25/PLTV/88888888/224/3221225540/index.m3u8 北京卫视,http://111.40.196.30/PLTV/88888888/224/3221225540/index.m3u8 北京卫视,http://111.40.196.32/PLTV/88888888/224/3221225527/index.m3u8 北京卫视,http://39.134.65.208/PLTV/88888888/224/3221225678/index.m3u8 +北京卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225674/index.m3u8 +北京卫视,http://39.135.138.59:18890/PLTV/88888888/224/3221225674/index.m3u8 +北京卫视,http://222.132.191.125:9901/tsfile/live/0122_1.m3u8 +北京卫视,http://183.207.249.7/PLTV/3/224/3221225574/index.m3u8 +北京卫视,http://39.135.138.58:18890/PLTV/88888910/224/3221225673/index.m3u8 +北京卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225673/index.m3u8 +北京卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225600/index.m3u8?fmt=ts2hls +北京卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225674/index.m3u8 +北京卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225673/index.m3u8 北京卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225673/1653141522-1-1648950446.m3u8 北京卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225674/1653141549-1-1651284122.m3u8 -南方卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221226203/1653149724-1-1651284940.m3u8 -厦门卫视,http://111.40.196.32/PLTV/88888888/224/3221225643/index.m3u8 -厦门卫视,http://live.aikan.miguvideo.com/PLTV/88888888/224/3221229184/index.m3u8 -吉林卫视,http://111.40.196.36/PLTV/88888888/224/3221225589/index.m3u8 -吉林卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225680/index.m3u8 -吉林卫视,http://39.134.65.149/PLTV/88888888/224/3221225981/1.m3u8 -吉林卫视,http://39.134.65.149:80/PLTV/88888888/224/3221225981/1653149014-1-1652757736.m3u8 -吉林卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225680/1653149097-1-1648951247.m3u8 -四川卫视,http://111.40.196.34/PLTV/88888888/224/3221225562/index.m3u8 +北京卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/bjwshd/4000000/mnf.m3u8 +天津卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225698/index.m3u8 +天津卫视,http://140.207.241.3:8080/live/program/live/tjwshd/4000000/mnf.m3u8 天津卫视,http://111.20.33.93/PLTV/88888893/224/3221226204/index.m3u8 天津卫视,http://111.20.33.93/TVOD/88888893/224/3221226204/index.m3u8 天津卫视,http://111.40.196.32/PLTV/88888888/224/3221225597/index.m3u8 天津卫视,http://39.134.19.248:6610/yinhe/2/ch00000090990000001343/index.m3u8?virtualDomain=yinhe.live_hls.zte.com 天津卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225698/1653141771-1-1651284161.m3u8 天津卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225739/1653141888-1-1648950485.m3u8 -宁夏卫视,http://111.40.196.29/PLTV/88888888/224/3221225641/index.m3u8 -宁夏卫视,http://111.40.196.31/PLTV/88888888/224/3221225530/index.m3u8 -宁夏卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225726/index.m3u8 -宁夏卫视,http://www.nxtv.com.cn/m2o/channel/play.php?channel_id=6 -宁夏卫视,https://php.52sf.ga/jmstvbf.php?id=118 -安多卫视,http://111.40.196.28/PLTV/88888888/224/3221225666/index.m3u8 -安徽卫视,http://111.20.33.93/PLTV/88888893/224/3221226196/index.m3u8 -安徽卫视,http://111.20.33.93/TVOD/88888893/224/3221226196/index.m3u8 -安徽卫视,http://111.20.33.93/TVOD/88888893/224/3221226203/index.m3u8 -安徽卫视,http://111.40.196.25/PLTV/88888888/224/3221225551/index.m3u8 -安徽卫视,http://183.207.255.207/live/program/live/ahwshd/2300000/mnf.m3u8 -安徽卫视,http://39.134.19.248:6610/yinhe/2/ch00000090990000001346/index.m3u8?virtualDomain=yinhe.live_hls.zte.com -安徽卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225691/1653146382-1-1651284606.m3u8 -安徽卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225691/1653146432-1-1651284611.m3u8 -山东卫视,http://111.20.33.93/PLTV/88888893/224/3221226209/index.m3u8 -山东卫视,http://111.20.33.93/TVOD/88888893/224/3221226209/index.m3u8 -山东卫视,http://111.40.196.30/PLTV/88888888/224/3221225543/index.m3u8 -山东卫视,http://111.40.196.36/PLTV/88888888/224/3221225545/index.m3u8 -山东卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225697/1653142074-1-1651284174.m3u8 -山东卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225697/1653142177-1-1651284184.m3u8 -山东卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225697/index.m3u8 -山东卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225738/index.m3u8 -山西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225730/index.m3u8 -山西卫视,http://liveflash.sxrtv.com:80/live/sxwshd.m3u8 -山西卫视,http://player.521fanli.cn/1691/0/tide/tidem3u8.php?id=shanxihd -山西卫视,https://php.52sf.ga/jmstvbf.php?id=109 -广东卫视,http://111.20.33.93/PLTV/88888893/224/3221226216/index.m3u8 -广东卫视,http://111.20.33.93/TVOD/88888893/224/3221226216/index.m3u8 -广东卫视,http://111.40.196.31/PLTV/88888888/224/3221225531/index.m3u8 -广东卫视,http://111.40.196.32/PLTV/88888888/224/3221225533/index.m3u8 -广东卫视,http://39.134.19.248:6610/yinhe/2/ch00000090990000001337/index.m3u8?virtualDomain=yinhe.live_hls.zte.com -广东卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225701/1653140620-1-1651284060.m3u8 -广东卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225742/1653140709-1-1648950419.m3u8 -广西卫视,http://111.40.196.35/PLTV/88888888/224/3221225518/index.m3u8 -广西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225731/index.m3u8?fmt=ts2hls -广西卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221226211/index.m3u8?fmt=ts2hls -江苏卫视,http://111.40.196.31/PLTV/88888888/224/3221225515/index.m3u8 -江苏卫视,http://39.134.19.248:6610/yinhe/2/ch00000090990000001344/index.m3u8?virtualDomain=yinhe.live_hls.zte.com -江苏卫视,http://39.134.65.208/PLTV/88888888/224/3221225503/index.m3u8 -江苏卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225702/1653110064-1-1651280974.m3u8 -江苏卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225702/1653110094-1-1651280977.m3u8 -江西卫视,http://111.40.196.30/PLTV/88888888/224/3221225560/index.m3u8 -江西卫视,http://140.207.241.2:8080/live/program/live/jxwshd/4000000/d1.m3u8 -江西卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225705/1653147474-1-1651284715.m3u8 -江西卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225746/1653147615-1-1648951059.m3u8 -江西卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225746/index.m3u8 -江西卫视,https://php.52sf.ga/jmstvbf.php?id=098 -河北卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225732/index.m3u8 +天津卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225698/index.m3u8 +天津卫视,http://222.132.191.125:9901/tsfile/live/0135_1.m3u8 +天津卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225739/index.m3u8 +浙江卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225744/index.m3u8 +浙江卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225703/index.m3u8 +浙江卫视,http://140.207.241.3:8080/live/program/live/zjwshd/4000000/mnf.m3u8 +浙江卫视,http://39.134.66.66/PLTV/88888888/224/3221225514/index.m3u8 浙江卫视,http://111.20.33.93/PLTV/88888893/224/3221226199/index.m3u8 浙江卫视,http://111.20.33.93/TVOD/88888893/224/3221226199/index.m3u8 浙江卫视,http://111.40.196.25/PLTV/88888888/224/3221225510/index.m3u8 @@ -639,40 +490,166 @@ CCTV17超高清,http://live.aikan.miguvideo.com/PLTV/88888888/224/3221231772/ind 浙江卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225744/index.m3u8 浙江卫视,http://hms363nc1880172761.live.aikan.miguvideo.com/PLTV/88888888/224/3221229352/index.m3u8 浙江卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/zjwshd/4000000/mnf.m3u8 -海南卫视,http://111.40.196.35/PLTV/88888888/224/3221225623/index.m3u8 -深圳卫视,http://111.20.33.93/PLTV/88888893/224/3221226205/index.m3u8 -深圳卫视,http://111.40.196.25/PLTV/88888888/224/3221225537/index.m3u8 -深圳卫视,http://120.132.122.244:59845/hls/31/index.m3u8 -深圳卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225700/1653141079-1-1651284077.m3u8 -深圳卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225741/1653141184-1-1648950460.m3u8 -深圳卫视,http://39.135.138.58:18890/PLTV/88888910/224/3221225741/index.m3u8 +浙江卫视,http://39.134.66.2/PLTV/88888888/224/3221225514/index.m3u8 +浙江卫视,http://hw-m-l.cztv.com/channels/lantian/channel01/1080p.m3u8 +浙江卫视,http://hw-m-l.cztv.com/channels/lantian/channel15/1080p.m3u8 +浙江卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225703/index.m3u8 +浙江卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225703/index.m3u8 +浙江卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225491/index.m3u8?fmt=ts2hls +浙江卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225703/index.m3u8 +浙江卫视,http://hw-m-l.cztv.com/channels/lantian/channel012/1080p.m3u8 +江苏卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225702/index.m3u8 +江苏卫视,http://183.207.255.197/live/program/live/jswshd/2300000/mnf.m3u8 +江苏卫视,http://39.134.66.110/PLTV/88888888/224/3221225503/index.m3u8 +江苏卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225743/index.m3u8 +江苏卫视,http://140.207.241.3:8080/live/program/live/jswshd/4000000/mnf.m3u8 +江苏卫视,http://39.134.66.66/PLTV/88888888/224/3221225503/index.m3u8 +江苏卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225702/index.m3u8 +江苏卫视,http://111.40.196.31/PLTV/88888888/224/3221225515/index.m3u8 +江苏卫视,http://39.134.19.248:6610/yinhe/2/ch00000090990000001344/index.m3u8?virtualDomain=yinhe.live_hls.zte.com +江苏卫视,http://39.134.65.208/PLTV/88888888/224/3221225503/index.m3u8 +江苏卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225702/1653110064-1-1651280974.m3u8 +江苏卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225702/1653110094-1-1651280977.m3u8 +江苏卫视,http://39.134.66.2/PLTV/88888888/224/3221225503/index.m3u8 +江苏卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/jswshd/4000000/mnf.m3u8 +江苏卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225702/index.m3u8 +江苏卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225488/index.m3u8?fmt=ts2hls +江苏卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225743/index.m3u8 +江苏卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225743/index.m3u8 +江西卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225705/index.m3u8 +江西卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/jxwshd/4000000/mnf.m3u8 +江西卫视,http://111.40.196.30/PLTV/88888888/224/3221225560/index.m3u8 +江西卫视,http://140.207.241.2:8080/live/program/live/jxwshd/4000000/d1.m3u8 +江西卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225705/1653147474-1-1651284715.m3u8 +江西卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225746/1653147615-1-1648951059.m3u8 +江西卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225746/index.m3u8 +江西卫视,https://php.52sf.ga/jmstvbf.php?id=098 +江西卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225705/index.m3u8 +江西卫视,http://182.151.211.171:808/hls/60/index.m3u8 +江西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225705/index.m3u8?icpid=88888888&from=30&hms_devid=1452 +江西卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225705/index.m3u8 +江西卫视,http://ncyd.jilu8.cn/PLTV/88888910/224/3221225705/index.m3u8 +江西卫视,http://39.135.34.144:8080/000000001000/1000000001000013731/index.m3u8?test/PLTV/=02 +江西卫视,http://39.134.116.30:8080/PLTV/88888910/224/3221225705/index.m3u8 +江西卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225746/index.m3u8 +江西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225746/index.m3u8 +江西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225705/index.m3u8 +江西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225746/index.m3u8 +江西卫视,http://140.207.241.3:8080/live/program/live/jxwshd/4000000/mnf.m3u8 +湖北卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225699/index.m3u8 湖北卫视,http://111.20.33.93/PLTV/88888893/224/3221226194/index.m3u8 +湖北卫视,http://140.207.241.3:8080/live/program/live/hbwshd/4000000/mnf.m3u8 湖北卫视,http://111.20.33.93/TVOD/88888893/224/3221226194/index.m3u8 湖北卫视,http://111.20.33.93/TVOD/88888893/224/3221226206/index.m3u8 湖北卫视,http://111.40.196.30/PLTV/88888888/224/3221225547/index.m3u8 湖北卫视,http://39.134.19.248:6610/yinhe/2/ch00000090990000001347/index.m3u8?virtualDomain=yinhe.live_hls.zte.com 湖北卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225699/1653142328-1-1651284245.m3u8 湖北卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225740/1653142428-1-1648950531.m3u8 +湖北卫视,http://222.132.191.125:9901/tsfile/live/0132_1.m3u8 +湖北卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225740/index.m3u8 +湖南卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225745/index.m3u8 +湖南卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225745/index.m3u8 +湖南卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225704/index.m3u8 +湖南卫视,http://39.134.66.66/PLTV/88888888/224/3221225506/index.m3u8 +湖南卫视,http://39.134.66.110/PLTV/88888888/224/3221225977/index.m3u8 +湖南卫视,http://39.134.66.110/PLTV/88888888/224/3221225506/index.m3u8 湖南卫视,http://111.20.33.93/PLTV/88888893/224/3221226211/index.m3u8 +湖南卫视,http://39.134.66.2/PLTV/88888888/224/3221225506/index.m3u8 湖南卫视,http://111.20.33.93/TVOD/88888893/224/3221226211/index.m3u8 湖南卫视,http://111.40.196.28/PLTV/88888888/224/3221225519/index.m3u8 湖南卫视,http://140.207.241.3:8080/live/program/live/hnwshd/4000000/mnf.m3u8 湖南卫视,http://39.134.65.208/PLTV/88888888/224/3221225506/index.m3u8 湖南卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225704/1653109760-1-1651280942.m3u8 湖南卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225745/1653109807-1-1648947278.m3u8 -甘肃卫视,http://111.40.196.28/PLTV/88888888/224/3221225639/index.m3u8 -黑龙江卫视,http://111.20.33.93/PLTV/88888893/224/3221226215/index.m3u8 -黑龙江卫视,http://111.20.33.93/TVOD/88888893/224/3221226215/index.m3u8 -黑龙江卫视,http://111.40.196.27/PLTV/88888888/224/3221225544/index.m3u8 -黑龙江卫视,http://111.40.196.38/PLTV/88888888/224/3221225544/index.m3u8 -黑龙江卫视,http://183.207.249.36/PLTV/4/224/3221227323/index.m3u8 -黑龙江卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225690/1653146198-1-1651284587.m3u8 -黑龙江卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225736/1653146257-1-1648950924.m3u8 -黑龙江卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225690/index.m3u8 -黑龙江卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225736/index.m3u8 -东南卫视,http://111.40.196.28/PLTV/88888888/224/3221225583/index.m3u8 -东南卫视,http://117.169.120.140:8080/live/dongnanstv/.m3u8 -东南卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225657/1653147315-1-1648951029.m3u8 +湖南卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225490/index.m3u8?fmt=ts2hls +湖南卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225704/index.m3u8 +四川卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225733/index.m3u8 +四川卫视,http://111.40.196.34/PLTV/88888888/224/3221225562/index.m3u8 +重庆卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225692/index.m3u8 +重庆卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225692/index.m3u8 +重庆卫视,http://39.134.66.110/PLTV/88888888/224/3221225963/index.m3u8 +重庆卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225734/index.m3u8 +重庆卫视,http://111.20.33.93/PLTV/88888893/224/3221226202/index.m3u8 +重庆卫视,http://183.207.255.197/live/program/live/cqws/1300000/mnf.m3u8 +重庆卫视,http://111.40.196.31/PLTV/88888888/224/3221225514/index.m3u8 +重庆卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225692/1653147686-1-1651284739.m3u8 +重庆卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225734/1653147763-1-1648951092.m3u8 +重庆卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225692/index.m3u8 +重庆卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225734/index.m3u8 +重庆卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225692/index.m3u8 +重庆卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225734/index.m3u8 +重庆卫视,http://39.135.138.60:18890/TVOD/88888910/224/3221225734/index.m3u8 +重庆卫视,http://183.196.25.171:808/hls/43/index.m3u8 +重庆卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225734/index.m3u8 +重庆卫视,http://39.135.138.60:18890/TVOD/88888910/224/3221225692/index.m3u8 +重庆卫视,http://182.151.211.171:808/hls/63/index.m3u8 +河北卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225732/index.m3u8 +河北卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225732/index.m3u8 +河北卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225732/index.m3u8 +河北卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225610/index.m3u8?fmt=ts2hls +山西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225730/index.m3u8 +山西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225730/index.m3u8 +山西卫视,http://liveflash.sxrtv.com:80/live/sxwshd.m3u8 +山西卫视,http://player.521fanli.cn/1691/0/tide/tidem3u8.php?id=shanxihd +山西卫视,https://php.52sf.ga/jmstvbf.php?id=109 +山西卫视,http://111.59.189.40:8445/tsfile/live/0118_1.m3u8 +山西卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225549/index.m3u8?fmt=ts2hls +山东卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225697/index.m3u8 +山东卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225738/index.m3u8 +山东卫视,http://140.207.241.3:8080/live/program/live/sdwshd/4000000/mnf.m3u8 +山东卫视,http://111.20.33.93/PLTV/88888893/224/3221226209/index.m3u8 +山东卫视,http://111.20.33.93/TVOD/88888893/224/3221226209/index.m3u8 +山东卫视,http://111.40.196.30/PLTV/88888888/224/3221225543/index.m3u8 +山东卫视,http://111.40.196.36/PLTV/88888888/224/3221225545/index.m3u8 +山东卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225697/1653142074-1-1651284174.m3u8 +山东卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225697/1653142177-1-1651284184.m3u8 +山东卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225738/index.m3u8 +山东卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/sdwshd/4000000/mnf.m3u8 +山东卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225697/index.m3u8 +山东卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225738/index.m3u8 +山东卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225697/index.m3u8 +山东卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225738/index.m3u8 +山东卫视,http://39.134.65.141/PLTV/88888888/224/3221225952/1.m3u8 +山东卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225697/index.m3u8 +安徽卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225691/index.m3u8 +安徽卫视,http://140.207.241.3:8080/live/program/live/ahwshd/4000000/mnf.m3u8 +安徽卫视,http://183.207.255.197/live/program/live/ahwshd/2300000/mnf.m3u8 +安徽卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/ahwshd/4000000/mnf.m3u8 +安徽卫视,http://183.207.249.15/PLTV/3/224/3221225634/index.m3u8 +安徽卫视,http://111.20.33.93/PLTV/88888893/224/3221226196/index.m3u8 +安徽卫视,http://111.20.33.93/TVOD/88888893/224/3221226196/index.m3u8 +安徽卫视,http://111.20.33.93/TVOD/88888893/224/3221226203/index.m3u8 +安徽卫视,http://111.40.196.25/PLTV/88888888/224/3221225551/index.m3u8 +安徽卫视,http://183.207.255.207/live/program/live/ahwshd/2300000/mnf.m3u8 +安徽卫视,http://39.134.19.248:6610/yinhe/2/ch00000090990000001346/index.m3u8?virtualDomain=yinhe.live_hls.zte.com +安徽卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225691/1653146382-1-1651284606.m3u8 +安徽卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225691/1653146432-1-1651284611.m3u8 +安徽卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225691/index.m3u8 +安徽卫视,http://111.59.189.40:8445/tsfile/live/0130_1.m3u8 +安徽卫视,http://222.132.191.125:9901/tsfile/live/0130_1.m3u8 +安徽卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225737/index.m3u8 +安徽卫视,http://39.134.65.141/PLTV/88888888/224/3221225925/1.m3u8 +陕西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225729/index.m3u8 +陕西卫视,http://111.40.196.34/PLTV/88888888/224/3221225582/index.m3u8 +陕西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225729/index.m3u8 +陕西卫视,http://39.135.138.58:18890/PLTV/88888910/224/3221225729/1653148833-1-1648951214.m3u8 +陕西卫视,https://php.52sf.ga/jmstvbf.php?id=114 +陕西卫视,http://61.164.158.23:843/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 +陕西卫视,http://122.228.87.30:843/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 +陕西卫视,http://122.228.87.14:80/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 +陕西卫视,http://122.228.87.26:843/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 +陕西卫视,http://61.164.158.161:80/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 +东方卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225659/index.m3u8 +东方卫视,http://183.207.255.197/live/program/live/hddfws/2300000/mnf.m3u8 +东方卫视,http://140.207.241.3:8080/live/program/live/hddfws/4000000/mnf.m3u8 +东方卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225489/index.m3u8?fmt=ts2hls +东方卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225658/index.m3u8 +东方卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225659/index.m3u8 +东方卫视,http://111.59.189.40:8445/tsfile/live/0107_1.m3u8 +东方卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225659/index.m3u8 +东方卫视,http://39.134.66.66/PLTV/88888888/224/3221225672/index.m3u8 +东方卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225658/index.m3u8 +东方卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/hddfws/4000000/mnf.m3u8 东方卫视,http://111.20.33.93/PLTV/88888893/224/3221226217/index.m3u8 东方卫视,http://111.20.33.93/TVOD/88888893/224/3221226217/index.m3u8 东方卫视,http://111.40.196.30/PLTV/88888888/224/3221225509/index.m3u8 @@ -682,24 +659,89 @@ CCTV17超高清,http://live.aikan.miguvideo.com/PLTV/88888888/224/3221231772/ind 东方卫视,http://39.134.66.110/PLTV/88888888/224/3221225672/index.m3u8 东方卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225658/1653140236-1-1648950319.m3u8 东方卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225659/1653140325-1-1651284002.m3u8 +广东卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225701/index.m3u8 +广东卫视,http://cm.wshls.homecdn.com/live/1bd69.m3u8 +广东卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/gdwshd/4000000/mnf.m3u8 +广东卫视,http://111.20.33.93/PLTV/88888893/224/3221226216/index.m3u8 +广东卫视,http://111.20.33.93/TVOD/88888893/224/3221226216/index.m3u8 +广东卫视,http://111.40.196.31/PLTV/88888888/224/3221225531/index.m3u8 +广东卫视,http://111.40.196.32/PLTV/88888888/224/3221225533/index.m3u8 +广东卫视,http://39.134.19.248:6610/yinhe/2/ch00000090990000001337/index.m3u8?virtualDomain=yinhe.live_hls.zte.com +广东卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225701/1653140620-1-1651284060.m3u8 +广东卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225742/1653140709-1-1648950419.m3u8 +广东卫视,http://222.132.191.125:9901/tsfile/live/0125_1.m3u8 +广东卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225742/index.m3u8 +广东卫视,http://39.135.138.58:18890/PLTV/88888910/224/3221225742/index.m3u8 +广东卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225701/index.m3u8 +广东卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225742/index.m3u8 +广东卫视,http://39.134.66.110/PLTV/88888888/224/3221225966/index.m3u8 +广东卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225742/index.m3u8 +广东卫视,http://140.207.241.3:8080/live/program/live/gdwshd/4000000/mnf.m3u8 +广西卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225731/index.m3u8 +广西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225731/index.m3u8 +广西卫视,http://111.40.196.35/PLTV/88888888/224/3221225518/index.m3u8 +广西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225731/index.m3u8?fmt=ts2hls +广西卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221226211/index.m3u8?fmt=ts2hls +广西卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221226211/index.m3u8?fmt=ts2hls +广西卫视,http://111.59.63.32:9901/tsfile/live/1003_1.m3u8 +广西卫视,http://183.196.25.171:808/hls/46/index.m3u8 +深圳卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225741/index.m3u8 +深圳卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225700/index.m3u8 +深圳卫视,http://39.134.66.110/PLTV/88888888/224/3221225668/index.m3u8 +深圳卫视,http://140.207.241.3:8080/live/program/live/szwshd/4000000/mnf.m3u8 +深圳卫视,http://111.20.33.93/PLTV/88888893/224/3221226205/index.m3u8 +深圳卫视,http://111.40.196.25/PLTV/88888888/224/3221225537/index.m3u8 +深圳卫视,http://120.132.122.244:59845/hls/31/index.m3u8 +深圳卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225700/1653141079-1-1651284077.m3u8 +深圳卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225741/1653141184-1-1648950460.m3u8 +深圳卫视,http://39.135.138.58:18890/PLTV/88888910/224/3221225741/index.m3u8 +深圳卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225700/index.m3u8 +深圳卫视,http://222.132.191.125:9901/tsfile/live/0126_1.m3u8 +贵州卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225728/index.m3u8 +贵州卫视,http://39.134.66.110/PLTV/88888888/224/3221225974/index.m3u8 +贵州卫视,http://111.40.196.25/PLTV/88888888/224/3221225522/index.m3u8 +贵州卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225728/index.m3u8 +贵州卫视,http://39.134.65.149:80/PLTV/88888888/224/3221225974/1653148920-1-1652757727.m3u8 +贵州卫视,http://39.134.65.149/PLTV/88888888/224/3221225974/1.m3u8 +贵州卫视,http://39.134.65.141/PLTV/88888888/224/3221225974/1.m3u8 +贵州卫视,http://39.134.65.151/PLTV/88888888/224/3221225974/1.m3u8 +贵州卫视,http://39.134.65.145/PLTV/88888888/224/3221225974/1.m3u8 +云南卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225664/index.m3u8 云南卫视,http://111.40.196.29/PLTV/88888888/224/3221225644/index.m3u8 云南卫视,http://111.40.196.36/PLTV/88888888/224/3221225635/index.m3u8 -康巴卫视,http://111.20.33.93/PLTV/88888893/224/3221226234/index.m3u8 -康巴卫视,http://111.202.12.159:8080/3zvkK28/1000/live.m3u8 -康巴卫视,http://111.202.12.159:8080/kYGHWzA/1000/live.m3u8 -延边卫视,http://111.20.33.93/PLTV/88888893/224/3221226220/index.m3u8 -延边卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221226201/index.m3u8 -延边卫视,http://live.ybtvyun.com/video/s10006-28bc40431485/index.m3u8 -延边卫视,http://live.ybtvyun.com/video/s10006-44f040627ca1/index.m3u8 -延边卫视,http://live.ybtvyun.com/video/s10016-7e5f23de35df/index.m3u8 -新疆卫视,https://php.52sf.ga/jmstvbf.php?id=150 -兵团卫视,http://111.20.33.93/PLTV/88888893/224/3221226214/index.m3u8 -兵团卫视,http://111.40.196.31/PLTV/88888888/224/3221225637/index.m3u8 -兵团卫视,http://test5.btzx.com.cn/live/btxjbtws.stream/chunklist_w19172251.m3u8 -兵团卫视,http://test5.btzx.com.cn/live/btxjbtws.stream/playlist.m3u8 +云南卫视,http://tvlive.ynradio.com/live/yunnanweishi/chunks.m3u8 +东南卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225657/index.m3u8 +东南卫视,http://140.207.241.3:8080/live/program/live/dnwshd/4000000/mnf.m3u8 +东南卫视,http://111.40.196.28/PLTV/88888888/224/3221225583/index.m3u8 +东南卫视,http://117.169.120.140:8080/live/dongnanstv/.m3u8 +东南卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225657/1653147315-1-1648951029.m3u8 +东南卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/dnwshd/2300000/mnf.m3u8 +东南卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225657/index.m3u8 +东南卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225657/index.m3u8?icpid=88888888&from=30&hms_devid=1452 +东南卫视,http://182.151.211.171:808/hls/61/index.m3u8 +内蒙古卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225667/index.m3u8 +内蒙古卫视,http://39.134.66.66/PLTV/88888888/224/3221225577/index.m3u8 内蒙古卫视,http://111.40.196.39/PLTV/88888888/224/3221225574/index.m3u8 内蒙古卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225667/index.m3u8 -农林卫视,http://111.20.33.93/PLTV/88888893/224/3221226229/index.m3u8 +宁夏卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225726/index.m3u8 +宁夏卫视,http://111.40.196.29/PLTV/88888888/224/3221225641/index.m3u8 +宁夏卫视,http://111.40.196.31/PLTV/88888888/224/3221225530/index.m3u8 +宁夏卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225726/index.m3u8 +宁夏卫视,http://www.nxtv.com.cn/m2o/channel/play.php?channel_id=6 +宁夏卫视,https://php.52sf.ga/jmstvbf.php?id=118 +甘肃卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225724/index.m3u8 +甘肃卫视,http://111.40.196.28/PLTV/88888888/224/3221225639/index.m3u8 +甘肃卫视,http://39.134.32.102:6610/270000001111/1110000322/index.m3u8?IASHttpSessionId=OTT +甘肃卫视,http://39.134.35.199/PLTV/88888888/224/3221226240/index.m3u8 +青海卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225727/index.m3u8 +青海卫视,http://stream.qhbtv.com/qhws/sd/live.m3u8?_upt=63cf437e1591689484 +青海卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225727/index.m3u8 +青海卫视,http://stream.qhbtv.com/qhws/sd/live.m3u8?_upt=f35a89681647856030 +青海卫视,http://stream.qhbtv.com/qhws/sd/live.m3u8?_upt=1da074361609506578 +新疆卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225725/index.m3u8 +新疆卫视,https://php.52sf.ga/jmstvbf.php?id=150 +新疆卫视,http://39.134.66.66/PLTV/88888888/224/3221225582/index.m3u8 +西藏卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225723/index.m3u8 西藏卫视,http://111.20.33.93/PLTV/88888893/224/3221226212/index.m3u8 西藏卫视,http://117.169.120.140:8080/live/xizangstv/.m3u8 西藏卫视,http://140.207.241.3:8080/live/program/live/xzws/2500000/d1.m3u8 @@ -707,9 +749,10 @@ CCTV17超高清,http://live.aikan.miguvideo.com/PLTV/88888888/224/3221231772/ind 西藏卫视,http://39.134.19.248:6610/yinhe/2/ch00000090990000001302/index.m3u8?virtualDomain=yinhe.live_hls.zte.com 西藏卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225723/index.m3u8 西藏卫视,https://php.52sf.ga/jmstvbf.php?id=121 -贵州卫视,http://111.40.196.25/PLTV/88888888/224/3221225522/index.m3u8 -贵州卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225728/index.m3u8 -贵州卫视,http://39.134.65.149:80/PLTV/88888888/224/3221225974/1653148920-1-1652757727.m3u8 +辽宁卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225735/index.m3u8 +辽宁卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225696/index.m3u8 +辽宁卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225735/index.m3u8 +辽宁卫视,http://140.207.241.3:8080/live/program/live/lnwshd/4000000/mnf.m3u8 辽宁卫视,http://111.20.33.93/PLTV/88888893/224/3221226210/index.m3u8 辽宁卫视,http://111.20.33.93/TVOD/88888893/224/3221226210/index.m3u8 辽宁卫视,http://111.40.196.27/PLTV/88888888/224/3221225558/index.m3u8 @@ -718,215 +761,168 @@ CCTV17超高清,http://live.aikan.miguvideo.com/PLTV/88888888/224/3221231772/ind 辽宁卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225696/1653146508-1-1651284617.m3u8 辽宁卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225735/1653146603-1-1648950958.m3u8 辽宁卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225696/index.m3u8 -重庆卫视,http://111.20.33.93/PLTV/88888893/224/3221226202/index.m3u8 -重庆卫视,http://111.40.196.31/PLTV/88888888/224/3221225514/index.m3u8 -重庆卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225692/1653147686-1-1651284739.m3u8 -重庆卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225734/1653147763-1-1648951092.m3u8 -重庆卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225692/index.m3u8 -重庆卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225734/index.m3u8 -陕西卫视,http://111.40.196.34/PLTV/88888888/224/3221225582/index.m3u8 -陕西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225729/index.m3u8 -陕西卫视,http://39.135.138.58:18890/PLTV/88888910/224/3221225729/1653148833-1-1648951214.m3u8 -陕西卫视,https://php.52sf.ga/jmstvbf.php?id=114 -青海卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225727/index.m3u8 -青海卫视,http://stream.qhbtv.com/qhws/sd/live.m3u8?_upt=f35a89681647856030 -云南卫视,http://tvlive.ynradio.com/live/yunnanweishi/chunks.m3u8 -湖南卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225490/index.m3u8?fmt=ts2hls -湖南卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225704/index.m3u8 -东方卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225489/index.m3u8?fmt=ts2hls -东方卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225658/index.m3u8 -东方卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225659/index.m3u8 -东方卫视,http://111.59.189.40:8445/tsfile/live/0107_1.m3u8 -东方卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225659/index.m3u8 -浙江卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225703/index.m3u8 -浙江卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225703/index.m3u8 -浙江卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225491/index.m3u8?fmt=ts2hls -浙江卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225703/index.m3u8 -浙江卫视,http://hw-m-l.cztv.com/channels/lantian/channel012/1080p.m3u8 -江苏卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225702/index.m3u8 -江苏卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225488/index.m3u8?fmt=ts2hls -江苏卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225743/index.m3u8 -江苏卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225743/index.m3u8 -深圳卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225700/index.m3u8 -深圳卫视,http://222.132.191.125:9901/tsfile/live/0126_1.m3u8 -北京卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225674/index.m3u8 -北京卫视,http://39.135.138.59:18890/PLTV/88888888/224/3221225674/index.m3u8 -北京卫视,http://222.132.191.125:9901/tsfile/live/0122_1.m3u8 -北京卫视,http://183.207.249.7/PLTV/3/224/3221225574/index.m3u8 -北京卫视,http://39.135.138.58:18890/PLTV/88888910/224/3221225673/index.m3u8 -北京卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225673/index.m3u8 -北京卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225600/index.m3u8?fmt=ts2hls -北京卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225674/index.m3u8 -北京卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225673/index.m3u8 -重庆卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225692/index.m3u8 -重庆卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225734/index.m3u8 -重庆卫视,http://39.135.138.60:18890/TVOD/88888910/224/3221225734/index.m3u8 -重庆卫视,http://183.196.25.171:808/hls/43/index.m3u8 -重庆卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225734/index.m3u8 -重庆卫视,http://39.135.138.60:18890/TVOD/88888910/224/3221225692/index.m3u8 -重庆卫视,http://182.151.211.171:808/hls/63/index.m3u8 -天津卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225698/index.m3u8 -天津卫视,http://222.132.191.125:9901/tsfile/live/0135_1.m3u8 -天津卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225739/index.m3u8 -山东卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225697/index.m3u8 -山东卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225738/index.m3u8 -山东卫视,http://39.134.65.141/PLTV/88888888/224/3221225952/1.m3u8 -山东卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225697/index.m3u8 -山西卫视,http://111.59.189.40:8445/tsfile/live/0118_1.m3u8 -山西卫视,http://httpdvb.slave.yqdtv.com:13164/playurl?playtype=live&protocol=http&playtoken=31603YEQXREOPEG10&auth=no&verifycode=14183&accesstoken=G79E6023V21307D1TD05FABJB53102ABM786710FEI3282697DK98BDA6&programid=4200000133 -陕西卫视,http://61.164.158.23:843/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 -陕西卫视,http://122.228.87.30:843/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 -陕西卫视,http://122.228.87.14:80/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 -陕西卫视,http://122.228.87.26:843/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 -陕西卫视,http://61.164.158.161:80/zycfcdn.gdwlcloud.com/PLTV/88888888/224/3221225498/index.m3u8 -黑龙江卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225690/index.m3u8 -黑龙江卫视,http://39.135.34.144:8080/000000001000/1000000001000009082/index.m3u8?test/PLTV/=02 -黑龙江卫视,http://39.135.138.58:18890/TVOD/88888888/224/3221225736/index.m3u8 -黑龙江卫视,http://httplive.slave.bfgd.com.cn:14311/playurl?playtype=live&protocol=http&accesstoken=R5F2408FEU3198804BK78052214IE73560DFP2BF4M340CE68V0Z339CBW1626D4D261E46FEA&playtoken=ABCDEFGH&programid=4200000095 -黑龙江卫视,http://183.207.249.36:80/PLTV/4/224/3221227323/index.m3u8? +辽宁卫视,http://39.134.66.66/PLTV/88888888/224/3221225499/index.m3u8 +辽宁卫视,http://shbu.live.bestvcdn.com.cn:8080/live/program/live/lnwshd/4000000/mnf.m3u8 辽宁卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225696/index.m3u8 辽宁卫视,http://222.132.191.125:9901/tsfile/live/0121_1.m3u8 辽宁卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225735/index.m3u8 辽宁卫视,http://39.135.138.58:18890/PLTV/88888910/224/3221225696/index.m3u8 辽宁卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225601/index.m3u8?fmt=ts2hls +辽宁卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225735/index.m3u8 +辽宁卫视,http://112.74.200.9:88/tv000000/m3u8.php?/migu/630291707 +吉林卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225680/index.m3u8 +吉林卫视,http://39.134.66.110/PLTV/88888888/224/3221225981/index.m3u8 +吉林卫视,http://111.40.196.36/PLTV/88888888/224/3221225589/index.m3u8 +吉林卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225680/index.m3u8 +吉林卫视,http://39.134.65.149/PLTV/88888888/224/3221225981/1.m3u8 +吉林卫视,http://39.134.65.149:80/PLTV/88888888/224/3221225981/1653149014-1-1652757736.m3u8 +吉林卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225680/1653149097-1-1648951247.m3u8 吉林卫视,http://183.196.25.171:808/hls/47/index.m3u8 吉林卫视,http://stream4.jlntv.cn:80/jlwshd/playlist.m3u8? -江西卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225705/index.m3u8 -江西卫视,http://182.151.211.171:808/hls/60/index.m3u8 -江西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225705/index.m3u8?icpid=88888888&from=30&hms_devid=1452 -江西卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225705/index.m3u8 -江西卫视,http://ncyd.jilu8.cn/PLTV/88888910/224/3221225705/index.m3u8 -江西卫视,http://39.135.34.144:8080/000000001000/1000000001000013731/index.m3u8?test/PLTV/=02 -江西卫视,http://39.134.116.30:8080/PLTV/88888910/224/3221225705/index.m3u8 -江西卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225746/index.m3u8 吉林卫视,http://39.134.65.141/PLTV/88888888/224/3221225981/1.m3u8 吉林卫视,http://39.134.65.151/PLTV/88888888/224/3221225981/1.m3u8 吉林卫视,http://39.134.65.145/PLTV/88888888/224/3221225981/1.m3u8 -湖北卫视,http://222.132.191.125:9901/tsfile/live/0132_1.m3u8 -湖北卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225740/index.m3u8 -河北卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225610/index.m3u8?fmt=ts2hls -贵州卫视,http://39.134.65.149/PLTV/88888888/224/3221225974/1.m3u8 -贵州卫视,http://39.134.65.141/PLTV/88888888/224/3221225974/1.m3u8 -贵州卫视,http://39.134.65.151/PLTV/88888888/224/3221225974/1.m3u8 -贵州卫视,http://39.134.65.145/PLTV/88888888/224/3221225974/1.m3u8 -广东卫视,http://222.132.191.125:9901/tsfile/live/0125_1.m3u8 -广东卫视,http://39.135.138.60:18890/PLTV/88888910/224/3221225742/index.m3u8 -广东卫视,http://39.135.138.58:18890/PLTV/88888910/224/3221225742/index.m3u8 -广东卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225701/index.m3u8 -广东卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225742/index.m3u8 -广西卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221226211/index.m3u8?fmt=ts2hls -广西卫视,http://111.59.63.32:9901/tsfile/live/1003_1.m3u8 -广西卫视,http://183.196.25.171:808/hls/46/index.m3u8 -甘肃卫视,http://39.134.32.102:6610/270000001111/1110000322/index.m3u8?IASHttpSessionId=OTT -甘肃卫视,http://39.134.35.199/PLTV/88888888/224/3221226240/index.m3u8 -东南卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225657/index.m3u8 -东南卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225657/index.m3u8?icpid=88888888&from=30&hms_devid=1452 -东南卫视,http://182.151.211.171:808/hls/61/index.m3u8 -安徽卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225691/index.m3u8 -安徽卫视,http://111.59.189.40:8445/tsfile/live/0130_1.m3u8 -安徽卫视,http://222.132.191.125:9901/tsfile/live/0130_1.m3u8 -安徽卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225737/index.m3u8 -安徽卫视,http://39.134.65.141/PLTV/88888888/224/3221225925/1.m3u8 -青海卫视,http://stream.qhbtv.com/qhws/sd/live.m3u8?_upt=1da074361609506578 -青海卫视,http://httplive.slave.bfgd.com.cn:14311/playurl?playtype=live&protocol=http&accesstoken=R622FED72U319A204BK783FE086IC0841C75P2BF4M35E8673V0Z339C9W16DC6A07EDEFF7E9&playtoken=31608RMZHGPUCXX10&auth=no&programid=4200000111 -南方卫视,https://zqy-live.nanyuecloud.com/qingyuandianshi/qingyuandianshistream.m3u8?auth_key=601634549257-0-0-73ab89e29b6bf8ef7b5144cf0c04935a +黑龙江卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225736/index.m3u8 +黑龙江卫视,http://39.134.66.110/PLTV/88888888/224/3221225985/index.m3u8 +黑龙江卫视,http://140.207.241.3:8080/live/program/live/hljwshd/4000000/mnf.m3u8 +黑龙江卫视,http://39.135.138.59:18890/TVOD/88888910/224/3221225690/index.m3u8 +黑龙江卫视,http://39.135.34.144:8080/000000001000/1000000001000009082/index.m3u8?test/PLTV/=02 +黑龙江卫视,http://39.135.138.58:18890/TVOD/88888888/224/3221225736/index.m3u8 +黑龙江卫视,http://183.207.249.36:80/PLTV/4/224/3221227323/index.m3u8? +黑龙江卫视,http://111.20.33.93/PLTV/88888893/224/3221226215/index.m3u8 +黑龙江卫视,http://111.20.33.93/TVOD/88888893/224/3221226215/index.m3u8 +黑龙江卫视,http://111.40.196.27/PLTV/88888888/224/3221225544/index.m3u8 +黑龙江卫视,http://111.40.196.38/PLTV/88888888/224/3221225544/index.m3u8 +黑龙江卫视,http://183.207.249.36/PLTV/4/224/3221227323/index.m3u8 +黑龙江卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225690/1653146198-1-1651284587.m3u8 +黑龙江卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221225736/1653146257-1-1648950924.m3u8 +黑龙江卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225690/index.m3u8 +黑龙江卫视,http://39.135.138.60:18890/PLTV/88888888/224/3221225736/index.m3u8 +康巴卫视,http://111.40.196.38/PLTV/88888888/224/3221225648/index.m3u8 +康巴卫视,http://111.20.33.93/PLTV/88888893/224/3221226234/index.m3u8 +康巴卫视,http://111.202.12.159:8080/3zvkK28/1000/live.m3u8 +康巴卫视,http://111.202.12.159:8080/kYGHWzA/1000/live.m3u8 +延边卫视,http://111.20.33.93/PLTV/88888893/224/3221226220/index.m3u8 +延边卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221226201/index.m3u8 +延边卫视,http://live.ybtvyun.com/video/s10006-28bc40431485/index.m3u8 +延边卫视,http://live.ybtvyun.com/video/s10006-44f040627ca1/index.m3u8 +延边卫视,http://live.ybtvyun.com/video/s10016-7e5f23de35df/index.m3u8 +延边卫视,http://live.ybtvyun.com/video/s10006-90fe76c52091/index.m3u8 +兵团卫视,http://111.20.33.93/PLTV/88888893/224/3221226214/index.m3u8 +兵团卫视,http://111.40.196.31/PLTV/88888888/224/3221225637/index.m3u8 +兵团卫视,http://test5.btzx.com.cn/live/btxjbtws.stream/chunklist_w19172251.m3u8 +兵团卫视,http://test5.btzx.com.cn/live/btxjbtws.stream/playlist.m3u8 兵团卫视,http://111.59.189.40:8445/tsfile/live/0115_1.m3u8 兵团卫视,http://test5.btzx.com.cn/live/btxjbtws.stream/chunklist_w1179863659.m3u8 兵团卫视,http://test5.btzx.com.cn/live/btxjbtws.stream/chunklist_w588330955.m3u8 +海南卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225722/index.m3u8 +海南卫视,http://111.40.196.35/PLTV/88888888/224/3221225623/index.m3u8 +厦门卫视,http://111.40.196.32/PLTV/88888888/224/3221225643/index.m3u8 +厦门卫视,http://live.aikan.miguvideo.com/PLTV/88888888/224/3221229184/index.m3u8 +综艺铜艺,http://39.134.66.110/PLTV/88888888/224/3221225525/index.m3u8 +河南卫视,http://39.134.66.110/PLTV/88888888/224/3221225988/index.m3u8 +龙江卫视,http://39.135.138.59:18890/PLTV/88888910/224/3221225690/index.m3u8 +晋江卫视,http://stream.jinjiang.tv/1/sd/live.m3u8 +上海纪实,http://183.207.255.188/live/program/live/jspdhd/4000000/mnf.m3u8 +安多卫视,http://111.40.196.28/PLTV/88888888/224/3221225666/index.m3u8 +安多卫视,http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221226195/index.m3u8 +人间卫视,https://5ddce30eb4b55.streamlock.net/bltvhd/bltv1/chunklist_w511254805.m3u8 +南方卫视,http://39.135.138.58:18890/PLTV/88888888/224/3221226203/1653149724-1-1651284940.m3u8 +农林卫视,http://111.20.33.93/PLTV/88888893/224/3221226229/index.m3u8 💎|卫视蓝光,#genre# -江西卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888910/224/3221225705/index.m3u8 -湖南卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225745/index.m3u8 -江苏卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225743/index.m3u8 -江苏卫视[1920*1080],http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225743/index.m3u8 -东方卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225658/index.m3u8 +北京卫视[1920*1080],http://39.134.65.179/PLTV/88888888/224/3221225678/index.m3u8 +北京卫视[1920*1080],http://39.134.65.164/PLTV/88888888/224/3221225678/index.m3u8 +北京卫视[1920*1080],http://39.134.65.166/PLTV/88888888/224/3221225678/index.m3u8 +北京卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225674/index.m3u8 +北京卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225673/index.m3u8 +北京卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225673/index.m3u8 天津卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225739/index.m3u8 -山东卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225738/index.m3u8 -安徽卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225737/index.m3u8 -安徽卫视[1920*1080],http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225737/index.m3u8 -辽宁卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225735/index.m3u8 -湖南卫视[1920*1080],http://shbu.live.bestvcdn.com.cn:8080/live/program/live/hnwshd/4000000/mnf.m3u8 -四川卫视[1920*1080],http://live.aikan.miguvideo.com/PLTV/88888888/224/3221231885/1.m3u8 -湖南卫视[1920*1080],http://39.134.65.166/PLTV/88888888/224/3221225506/index.m3u8 -湖南卫视[1920*1080],http://39.134.65.181/PLTV/88888888/224/3221225506/index.m3u8 -江苏卫视[1920*1080],http://39.134.65.181/PLTV/88888888/224/3221225503/index.m3u8 -浙江卫视[1920*1080],http://39.134.65.179/PLTV/88888888/224/3221225514/index.m3u8 -浙江卫视[1920*1080],http://39.134.65.173/PLTV/88888888/224/3221225514/index.m3u8 -浙江卫视[1920*1080],http://39.134.65.175/PLTV/88888888/224/3221225514/index.m3u8 +天津卫视[1920*1080],http://39.134.65.166/PLTV/88888888/224/3221225665/index.m3u8 +天津卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225739/index.m3u8 +天津卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225698/index.m3u8 +天津卫视[1920*1080],http://39.134.66.66/PLTV/88888888/224/3221225665/index.m3u8 +天津卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225698/index.m3u8 +天津卫视[1920*1080],http://shbu.live.bestvcdn.com.cn:8080/live/program/live/tjwshd/4000000/mnf.m3u8 东方卫视[1920*1080],http://39.134.65.179/PLTV/88888888/224/3221225672/index.m3u8 东方卫视[1920*1080],http://39.134.65.164/PLTV/88888888/224/3221225672/index.m3u8 东方卫视[1920*1080],http://39.134.65.173/PLTV/88888888/224/3221225672/index.m3u8 东方卫视[1920*1080],http://39.134.65.175/PLTV/88888888/224/3221225672/index.m3u8 -深圳卫视[1920*1080],http://39.134.65.164/PLTV/88888888/224/3221225668/index.m3u8 -深圳卫视[1920*1080],http://39.134.65.166/PLTV/88888888/224/3221225668/index.m3u8 -深圳卫视[1920*1080],http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225741/index.m3u8 -北京卫视[1920*1080],http://39.134.65.179/PLTV/88888888/224/3221225678/index.m3u8 -北京卫视[1920*1080],http://39.134.65.164/PLTV/88888888/224/3221225678/index.m3u8 -北京卫视[1920*1080],http://39.134.65.166/PLTV/88888888/224/3221225678/index.m3u8 -贵州卫视[1920*1080],http://39.134.65.149/PLTV/88888888/224/3221225974/index.m3u8 -天津卫视[1920*1080],http://shbu.live.bestvcdn.com.cn:8080/live/program/live/tjwshd/4000000/mnf.m3u8 -湖北卫视[1920*1080],http://39.134.65.164/PLTV/88888888/224/3221225569/index.m3u8 -兵团卫视[1920*1080],http://test5.btzx.com.cn/live/btxjbtws.stream/chunklist_w544078748.m3u8 -天津卫视[1920*1080],http://39.134.65.166/PLTV/88888888/224/3221225665/index.m3u8 +东方卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225658/index.m3u8 东方卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225658/index.m3u8 东方卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225659/index.m3u8 -北京卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225673/index.m3u8 -湖南卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225704/index.m3u8 -山东卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225697/index.m3u8 +东方卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225659/index.m3u8 +东南卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225657/index.m3u8 +东南卫视[1920*1080],http://shbu.live.bestvcdn.com.cn:8080/live/program/live/dnwshd/4000000/mnf.m3u8 东南卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225657/index.m3u8 -广东卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225701/index.m3u8 -江西卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225705/index.m3u8 -安徽卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225737/index.m3u8 -安徽卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225691/index.m3u8 -浙江卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225744/index.m3u8 -浙江卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225703/index.m3u8 -深圳卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225741/index.m3u8 -深圳卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225700/index.m3u8 -天津卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225739/index.m3u8 -天津卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225698/index.m3u8 -黑龙江卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225690/index.m3u8 +湖南卫视[1920*1080],http://39.134.65.166/PLTV/88888888/224/3221225506/index.m3u8 +湖南卫视[1920*1080],http://39.134.65.181/PLTV/88888888/224/3221225506/index.m3u8 +湖南卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225704/index.m3u8 +湖南卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225704/index.m3u8 +湖南卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225745/index.m3u8 +湖南卫视[1920*1080],http://shbu.live.bestvcdn.com.cn:8080/live/program/live/hnwshd/4000000/mnf.m3u8 +湖北卫视[1920*1080],http://39.134.65.164/PLTV/88888888/224/3221225569/index.m3u8 +湖北卫视[1920*1080],http://39.134.66.66/PLTV/88888888/224/3221225569/index.m3u8 +湖北卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225699/index.m3u8 +湖北卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225740/index.m3u8 湖北卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225740/index.m3u8 湖北卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225699/index.m3u8 -辽宁卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225696/index.m3u8 -重庆卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225692/index.m3u8 -东方卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225659/index.m3u8 +江苏卫视[1920*1080],http://39.134.65.181/PLTV/88888888/224/3221225503/index.m3u8 +江苏卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225743/index.m3u8 江苏卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888910/224/3221225702/index.m3u8 -北京卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225673/index.m3u8 -湖南卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225704/index.m3u8 -山东卫视[1920*1080],http://39.135.138.59:18890/PLTV/88888910/224/3221225738/index.m3u8 -广东卫视[1920*1080],http://39.135.138.59:18890/PLTV/88888910/224/3221225742/index.m3u8 -浙江卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225703/index.m3u8 -浙江卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888910/224/3221225703/index.m3u8 -辽宁卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225696/index.m3u8 -重庆卫视[1920*1080],http://39.135.138.59:18890/PLTV/88888910/224/3221225734/index.m3u8 江苏卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225702/index.m3u8 +江苏卫视[1920*1080],http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225743/index.m3u8 +江西卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888910/224/3221225705/index.m3u8 +江西卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225705/index.m3u8 +江西卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225705/index.m3u8 +江西卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225746/index.m3u8 +浙江卫视[1920*1080],http://39.134.65.179/PLTV/88888888/224/3221225514/index.m3u8 +浙江卫视[1920*1080],http://39.134.65.173/PLTV/88888888/224/3221225514/index.m3u8 +浙江卫视[1920*1080],http://39.134.65.175/PLTV/88888888/224/3221225514/index.m3u8 +浙江卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225744/index.m3u8 +浙江卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225703/index.m3u8 +浙江卫视[1920*1080],http://hw-m-l.cztv.com/channels/lantian/channel001/1080p.m3u8 浙江卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225744/index.m3u8 -广东卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225701/index.m3u8 -广东卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225742/index.m3u8 -深圳卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225700/index.m3u8 -深圳卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225741/index.m3u8 -北京卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225674/index.m3u8 -天津卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225698/index.m3u8 +浙江卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225703/index.m3u8 +浙江卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888910/224/3221225703/index.m3u8 山东卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225697/index.m3u8 -湖北卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225699/index.m3u8 -湖北卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225740/index.m3u8 -黑龙江卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225690/index.m3u8 -黑龙江卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225736/index.m3u8 +山东卫视[1920*1080],http://39.135.138.59:18890/PLTV/88888910/224/3221225738/index.m3u8 +山东卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225697/index.m3u8 +山东卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225738/index.m3u8 +安徽卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225737/index.m3u8 +安徽卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225737/index.m3u8 +安徽卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225691/index.m3u8 安徽卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225691/index.m3u8 -东南卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225657/index.m3u8 -江西卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225705/index.m3u8 -江西卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225746/index.m3u8 +安徽卫视[1920*1080],http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225737/index.m3u8 +四川卫视[1920*1080],http://live.aikan.miguvideo.com/PLTV/88888888/224/3221231885/1.m3u8 +四川卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225487/index.m3u8?fmt=ts2hls 重庆卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225692/index.m3u8 重庆卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225734/index.m3u8 +重庆卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225692/index.m3u8 +重庆卫视[1920*1080],http://39.135.138.59:18890/PLTV/88888910/224/3221225734/index.m3u8 +深圳卫视[1920*1080],http://39.134.65.164/PLTV/88888888/224/3221225668/index.m3u8 +深圳卫视[1920*1080],http://39.134.65.166/PLTV/88888888/224/3221225668/index.m3u8 +深圳卫视[1920*1080],http://hwrr.jx.chinamobile.com:8080/PLTV/88888888/224/3221225741/index.m3u8 +深圳卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225741/index.m3u8 +深圳卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225700/index.m3u8 +深圳卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225700/index.m3u8 +深圳卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225741/index.m3u8 +贵州卫视[1920*1080],http://39.134.65.149/PLTV/88888888/224/3221225974/index.m3u8 +贵州卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225483/index.m3u8?fmt=ts2hls +广东卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225701/index.m3u8 +广东卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225742/index.m3u8 +广东卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225701/index.m3u8 +广东卫视[1920*1080],http://39.135.138.59:18890/PLTV/88888910/224/3221225742/index.m3u8 广西卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221226211/index.m3u8 -四川卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225487/index.m3u8?fmt=ts2hls 河北卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225610/index.m3u8?fmt=ts2hls 河南卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225611/index.m3u8?fmt=ts2hls -贵州卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225483/index.m3u8?fmt=ts2hls -天津卫视[1920*1080],http://39.134.66.66/PLTV/88888888/224/3221225665/index.m3u8 -湖北卫视[1920*1080],http://39.134.66.66/PLTV/88888888/224/3221225569/index.m3u8 -浙江卫视[1920*1080],http://hw-m-l.cztv.com/channels/lantian/channel001/1080p.m3u8 -东南卫视[1920*1080],http://shbu.live.bestvcdn.com.cn:8080/live/program/live/dnwshd/4000000/mnf.m3u8 +兵团卫视[1920*1080],http://test5.btzx.com.cn/live/btxjbtws.stream/chunklist_w544078748.m3u8 +辽宁卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225735/index.m3u8 +辽宁卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225696/index.m3u8 +辽宁卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225696/index.m3u8 +黑龙江卫视[1920*1080],http://39.134.115.163:8080/PLTV/88888910/224/3221225690/index.m3u8 +黑龙江卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225690/index.m3u8 +黑龙江卫视[1920*1080],http://39.135.138.58:18890/PLTV/88888888/224/3221225736/index.m3u8 黑龙江卫视[1920*1080],http://shbu.live.bestvcdn.com.cn:8080/live/program/live/hljwshd/4000000/mnf.m3u8 🏝|港澳台外,#genre# diff --git a/models/__init__.py b/models/__init__.py index 574f494..82c69fb 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# File : __init__.py.py +# File : __init__.py # Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ -# Date : 2022/8/25 +# Date : 2022/9/6 -from . import rule_classes -from . import play_parse -from . import storage \ No newline at end of file +from . import storage +from . import playparse +from . import ruleclass diff --git a/models/rules.db b/models/rules.db index d10f98685ac3f80a716a1b751ec40c4fce4d4890..99facc1f6e50ba5290ff96422c9bcae846592ef4 100644 GIT binary patch delta 103 zcmZoTz|?SnX@az1IRgU&7Z7s*F%yWMsADW$&Y;H_!OL62z{(@Yz_XP9Fkd>4Ab$@C vZgy0d%DtJNCzp|hpONA9<_6w|Bp#qX5MTsi_RWF`_xUFVux|cPFQ5Pb6fG6% delta 89 zcmZoTz|?SnX@az183O|Y7ZAe$`$QdM=`sdA?+Lv8j125Nf($%M`497@^VaZb@Cfqv mY<5(b%DtJNCzp|>QImyza|3Tf5+m1U#)S9$n?KYGC;$Kp>l8cy diff --git a/models/storage.py b/models/storage.py index 1e133d6..70aa085 100644 --- a/models/storage.py +++ b/models/storage.py @@ -4,63 +4,61 @@ # Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ # Date : 2022/9/6 +from base.database import db from functools import lru_cache +from utils.system import cfg -def init(db): - class Storage(db.Model): - __tablename__ = 'storage' - id = db.Column(db.Integer, primary_key=True, autoincrement=True) - key = db.Column(db.String(20),unique=True) - value = db.Column(db.UnicodeText()) - # value = db.Column(db.Text()) +class Storage(db.Model): + __tablename__ = 'storage' - def __repr__(self): - return "" % ( - self.key, self.value) + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + key = db.Column(db.String(20), unique=True) + value = db.Column(db.UnicodeText()) + # value = db.Column(db.Text()) - @classmethod - def setItem(self, key, value=None): - res = db.session.query(self).filter(self.key == key).first() - if res: - res.value = value - db.session.add(res) - else: - res = Storage(key=key, value=value) - db.session.add(res) - db.session.flush() - try: - db.session.commit() - self.clearCache() - return res.id - except Exception as e: - print(f'发生了错误:{e}') - return None + def __repr__(self): + return "" % ( + self.key, self.value) - @classmethod - @lru_cache(maxsize=200) - def getItem(self, key, value=''): - res = db.session.query(self).filter(self.key == key).first() - if res: - return res.value or value - else: - return value - - @classmethod - def clearItem(self, key): + @classmethod + def setItem(self, key, value=None): + res = db.session.query(self).filter(self.key == key).first() + if res: + res.value = value + db.session.add(res) + else: + res = Storage(key=key, value=value) + db.session.add(res) + db.session.flush() + try: + db.session.commit() self.clearCache() - res = db.session.query(self).filter(self.key == key).first() - if res: - res.delete() - ret = db.session.commit() - self.clearCache() - return ret - else: - return True + return res.id + except Exception as e: + print(f'发生了错误:{e}') + return None + + @classmethod + @lru_cache(maxsize=200) + def getItem(self, key, value=''): + res = db.session.query(self).filter(self.key == key).first() + if res: + return res.value or value + else: + return value - @classmethod - def clearCache(self): - self.getItem.cache_clear() + @classmethod + def clearItem(self, key): + self.clearCache() + res = db.session.query(self).filter(self.key == key).first() + if res: + res.delete() + ret = db.session.commit() + self.clearCache() + return ret + else: + return True - # db.create_all() - db.create_all() - return Storage \ No newline at end of file + @classmethod + def clearCache(self): + self.getItem.cache_clear() \ No newline at end of file diff --git a/readme.md b/readme.md index e74e30a..c3e5e4a 100644 --- a/readme.md +++ b/readme.md @@ -52,6 +52,7 @@ - [X] 3.首页推荐内容不限制数量(新版pluto牛逼!!!) - [X] 4.增加lsg配置模型和缓存 - [X] 5.增加了默认alist挂载 +- [X] 6.升级到3.2.0,进行了全面后端重构用了蓝图写法,app.py文件以后尽量不动 ###### 2022/09/05 - [X] 1.内置jar修复了原本tv_box无法播放直播的问题 - [X] 2.重新构建了三种平台的镜像 amd64,armv7,arm64 diff --git a/templates/admin.html b/templates/admin.html index 8d9c52e..2606656 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -91,7 +91,7 @@ form_data.append("file", file_data); $.ajax({ type: "POST", - url: "/upload", + url: "/admin/upload", dataType : "json", processData: false, // 注意:让jQuery不要处理数据 contentType: false, // 注意:让jQuery不要设置contentType @@ -160,7 +160,7 @@ function getFileSize(fileObj) {

你可以在此页面在线上传规则文件到js目录或者删除js目录的文件

-
+ diff --git a/templates/config.txt b/templates/config.txt index 3001847..f4455cf 100644 --- a/templates/config.txt +++ b/templates/config.txt @@ -3,7 +3,7 @@ "dr_count": {{rules.list|length}}, "mode": {{ mode }}, "spider": "{{ host }}/liveslib", -{% if alists|length > 0 %}"drives": {{alists}},{% endif %} +{% if alists|length > 0 %}"drives": {{alists_str}},{% endif %} "homepage":"https://gitcode.net/qq_32394351/dr_py", "sites": [{% for rule in rules.list %}{% if mode == 0 %} { diff --git a/templates/index.html b/templates/index.html index b4663e4..799764c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -44,11 +44,12 @@ CMS后台管理 + diff --git a/templates/login.html b/templates/login.html index 3a50836..72eb39a 100644 --- a/templates/login.html +++ b/templates/login.html @@ -69,7 +69,7 @@ $('#picture_autologin').attr('src',"/static/img/checked.png"); var json = {"username":username,"password":password,"autologin":autologin,"login":"1"}; // ajax_post("login.php",json,backmsg); console.log(json); - $.post("/api/login",json,function(result){ + $.post("/admin/login",json,function(result){ console.log(result); if(result.code === 200){ console.log('登录成功'); diff --git a/txt/pycms0.json b/txt/pycms0.json index 7675dd1..642399e 100644 --- a/txt/pycms0.json +++ b/txt/pycms0.json @@ -1,7 +1,135 @@ { "wallpaper": "http://localhost:5705/pics", - "dr_count": 20, + "dr_count": 21, "mode": 0, + "spider": "http://localhost:5705/liveslib", + "drives": [ + { + "name": "🔮嗨翻", + "server": "https://pan.hikerfans.com", + "type": "alist" + }, + { + "name": "🦀9T(Adult)", + "server": "https://drive.9t.ee", + "type": "alist" + }, + { + "name": "🐱梓澪の妙妙屋", + "server": "https://xn--i0v44m.xyz", + "type": "alist" + }, + { + "name": "🚆资源小站", + "server": "https://pan.142856.xyz", + "type": "alist" + }, + { + "name": "🌤晴园的宝藏库", + "server": "https://alist.52qy.repl.co", + "type": "alist" + }, + { + "name": "🐭米奇妙妙屋", + "server": "https://anime.mqmmw.ga", + "type": "alist" + }, + { + "name": "💂小兵组网盘影视", + "server": "https://6vv.app", + "type": "alist" + }, + { + "name": "📀小光盘", + "server": "https://alist.xiaoguanxiaocheng.life", + "type": "alist" + }, + { + "name": "🐋一只鱼", + "server": "https://alist.youte.ml", + "type": "alist" + }, + { + "name": "🌊七米蓝", + "server": "https://al.chirmyram.com", + "type": "alist" + }, + { + "name": "🌴非盘", + "server": "http://www.feifwp.top", + "type": "alist" + }, + { + "name": "🥼帅盘", + "server": "https://hi.shuaipeng.wang", + "type": "alist" + }, + { + "name": "🐉神族九帝", + "server": "https://alist.shenzjd.com", + "type": "alist" + }, + { + "name": "☃姬路白雪", + "server": "https://pan.jlbx.xyz", + "type": "alist" + }, + { + "name": "🎧听闻网盘", + "server": "https://wangpan.sangxuesheng.com", + "type": "alist" + }, + { + "name": "💾DISK", + "server": "http://124.222.140.243:8080", + "type": "alist" + }, + { + "name": "🌨云播放", + "server": "https://quanzi.laoxianghuijia.cn", + "type": "alist" + }, + { + "name": "✨星梦", + "server": "https://pan.bashroot.top", + "type": "alist" + }, + { + "name": "🌊小江", + "server": "https://dyj.me", + "type": "alist" + }, + { + "name": "💫触光", + "server": "https://pan.ichuguang.com", + "type": "alist" + }, + { + "name": "🕵好汉吧", + "server": "https://8023.haohanba.cn", + "type": "alist" + }, + { + "name": "🥗AUNEY", + "server": "http://121.227.25.116:8008", + "type": "alist" + }, + { + "name": "🎡资源小站", + "server": "https://960303.xyz/", + "type": "alist" + }, + { + "name": "🏝fenwe", + "server": "http://www.fenwe.tk:5244", + "type": "alist" + }, + { + "name": "🎢轻弹浅唱", + "server": "https://g.xiang.lol", + "type": "alist" + } + ], "homepage": "https://gitcode.net/qq_32394351/dr_py", "sites": [ { @@ -112,6 +240,15 @@ "quickSearch": 0, "filterable": 0 }, + { + "key": "dr_库马伊", + "name": "库马伊(道长)", + "type": 1, + "api": "http://localhost:5705/vod?rule=库马伊", + "searchable": 1, + "quickSearch": 1, + "filterable": 0 + }, { "key": "dr_影视工厂", "name": "影视工厂(道长)", @@ -352,7 +489,7 @@ { "name": "直播", "urls": [ - "proxy://do=live&type=txt&ext=aHR0cHM6Ly9naXRjb2RlLm5ldC9xcV8yNjg5ODIzMS9UVkJveC8tL3Jhdy9tYWluL2xpdmUvMDgzMHpiLnR4dA==" + "proxy://do=live&type=txt&ext=aHR0cDovL2xvY2FsaG9zdDo1NzA1L2xpdmVz" ] } ] diff --git a/txt/pycms1.json b/txt/pycms1.json index 8240803..12cdc8f 100644 --- a/txt/pycms1.json +++ b/txt/pycms1.json @@ -1,7 +1,135 @@ { "wallpaper": "http://192.168.3.224:5705/pics", - "dr_count": 20, + "dr_count": 21, "mode": 1, + "spider": "http://192.168.3.224:5705/liveslib", + "drives": [ + { + "name": "🔮嗨翻", + "server": "https://pan.hikerfans.com", + "type": "alist" + }, + { + "name": "🦀9T(Adult)", + "server": "https://drive.9t.ee", + "type": "alist" + }, + { + "name": "🐱梓澪の妙妙屋", + "server": "https://xn--i0v44m.xyz", + "type": "alist" + }, + { + "name": "🚆资源小站", + "server": "https://pan.142856.xyz", + "type": "alist" + }, + { + "name": "🌤晴园的宝藏库", + "server": "https://alist.52qy.repl.co", + "type": "alist" + }, + { + "name": "🐭米奇妙妙屋", + "server": "https://anime.mqmmw.ga", + "type": "alist" + }, + { + "name": "💂小兵组网盘影视", + "server": "https://6vv.app", + "type": "alist" + }, + { + "name": "📀小光盘", + "server": "https://alist.xiaoguanxiaocheng.life", + "type": "alist" + }, + { + "name": "🐋一只鱼", + "server": "https://alist.youte.ml", + "type": "alist" + }, + { + "name": "🌊七米蓝", + "server": "https://al.chirmyram.com", + "type": "alist" + }, + { + "name": "🌴非盘", + "server": "http://www.feifwp.top", + "type": "alist" + }, + { + "name": "🥼帅盘", + "server": "https://hi.shuaipeng.wang", + "type": "alist" + }, + { + "name": "🐉神族九帝", + "server": "https://alist.shenzjd.com", + "type": "alist" + }, + { + "name": "☃姬路白雪", + "server": "https://pan.jlbx.xyz", + "type": "alist" + }, + { + "name": "🎧听闻网盘", + "server": "https://wangpan.sangxuesheng.com", + "type": "alist" + }, + { + "name": "💾DISK", + "server": "http://124.222.140.243:8080", + "type": "alist" + }, + { + "name": "🌨云播放", + "server": "https://quanzi.laoxianghuijia.cn", + "type": "alist" + }, + { + "name": "✨星梦", + "server": "https://pan.bashroot.top", + "type": "alist" + }, + { + "name": "🌊小江", + "server": "https://dyj.me", + "type": "alist" + }, + { + "name": "💫触光", + "server": "https://pan.ichuguang.com", + "type": "alist" + }, + { + "name": "🕵好汉吧", + "server": "https://8023.haohanba.cn", + "type": "alist" + }, + { + "name": "🥗AUNEY", + "server": "http://121.227.25.116:8008", + "type": "alist" + }, + { + "name": "🎡资源小站", + "server": "https://960303.xyz/", + "type": "alist" + }, + { + "name": "🏝fenwe", + "server": "http://www.fenwe.tk:5244", + "type": "alist" + }, + { + "name": "🎢轻弹浅唱", + "server": "https://g.xiang.lol", + "type": "alist" + } + ], "homepage": "https://gitcode.net/qq_32394351/dr_py", "sites": [ { @@ -112,6 +240,15 @@ "quickSearch": 0, "filterable": 0 }, + { + "key": "dr_库马伊", + "name": "库马伊(道长)", + "type": 1, + "api": "http://192.168.3.224:5705/vod?rule=库马伊", + "searchable": 1, + "quickSearch": 1, + "filterable": 0 + }, { "key": "dr_影视工厂", "name": "影视工厂(道长)", @@ -352,7 +489,7 @@ { "name": "直播", "urls": [ - "proxy://do=live&type=txt&ext=aHR0cHM6Ly9naXRjb2RlLm5ldC9xcV8yNjg5ODIzMS9UVkJveC8tL3Jhdy9tYWluL2xpdmUvMDgzMHpiLnR4dA==" + "proxy://do=live&type=txt&ext=aHR0cDovLzE5Mi4xNjguMy4yMjQ6NTcwNS9saXZlcw==" ] } ] diff --git a/txt/pycms2.json b/txt/pycms2.json index 4793d6e..f59adba 100644 --- a/txt/pycms2.json +++ b/txt/pycms2.json @@ -1,7 +1,135 @@ { "wallpaper": "http://cms.nokia.press/pics", - "dr_count": 20, + "dr_count": 21, "mode": 1, + "spider": "http://cms.nokia.press/liveslib", + "drives": [ + { + "name": "🔮嗨翻", + "server": "https://pan.hikerfans.com", + "type": "alist" + }, + { + "name": "🦀9T(Adult)", + "server": "https://drive.9t.ee", + "type": "alist" + }, + { + "name": "🐱梓澪の妙妙屋", + "server": "https://xn--i0v44m.xyz", + "type": "alist" + }, + { + "name": "🚆资源小站", + "server": "https://pan.142856.xyz", + "type": "alist" + }, + { + "name": "🌤晴园的宝藏库", + "server": "https://alist.52qy.repl.co", + "type": "alist" + }, + { + "name": "🐭米奇妙妙屋", + "server": "https://anime.mqmmw.ga", + "type": "alist" + }, + { + "name": "💂小兵组网盘影视", + "server": "https://6vv.app", + "type": "alist" + }, + { + "name": "📀小光盘", + "server": "https://alist.xiaoguanxiaocheng.life", + "type": "alist" + }, + { + "name": "🐋一只鱼", + "server": "https://alist.youte.ml", + "type": "alist" + }, + { + "name": "🌊七米蓝", + "server": "https://al.chirmyram.com", + "type": "alist" + }, + { + "name": "🌴非盘", + "server": "http://www.feifwp.top", + "type": "alist" + }, + { + "name": "🥼帅盘", + "server": "https://hi.shuaipeng.wang", + "type": "alist" + }, + { + "name": "🐉神族九帝", + "server": "https://alist.shenzjd.com", + "type": "alist" + }, + { + "name": "☃姬路白雪", + "server": "https://pan.jlbx.xyz", + "type": "alist" + }, + { + "name": "🎧听闻网盘", + "server": "https://wangpan.sangxuesheng.com", + "type": "alist" + }, + { + "name": "💾DISK", + "server": "http://124.222.140.243:8080", + "type": "alist" + }, + { + "name": "🌨云播放", + "server": "https://quanzi.laoxianghuijia.cn", + "type": "alist" + }, + { + "name": "✨星梦", + "server": "https://pan.bashroot.top", + "type": "alist" + }, + { + "name": "🌊小江", + "server": "https://dyj.me", + "type": "alist" + }, + { + "name": "💫触光", + "server": "https://pan.ichuguang.com", + "type": "alist" + }, + { + "name": "🕵好汉吧", + "server": "https://8023.haohanba.cn", + "type": "alist" + }, + { + "name": "🥗AUNEY", + "server": "http://121.227.25.116:8008", + "type": "alist" + }, + { + "name": "🎡资源小站", + "server": "https://960303.xyz/", + "type": "alist" + }, + { + "name": "🏝fenwe", + "server": "http://www.fenwe.tk:5244", + "type": "alist" + }, + { + "name": "🎢轻弹浅唱", + "server": "https://g.xiang.lol", + "type": "alist" + } + ], "homepage": "https://gitcode.net/qq_32394351/dr_py", "sites": [ { @@ -112,6 +240,15 @@ "quickSearch": 0, "filterable": 0 }, + { + "key": "dr_库马伊", + "name": "库马伊(道长)", + "type": 1, + "api": "http://cms.nokia.press/vod?rule=库马伊", + "searchable": 1, + "quickSearch": 1, + "filterable": 0 + }, { "key": "dr_影视工厂", "name": "影视工厂(道长)", @@ -352,7 +489,7 @@ { "name": "直播", "urls": [ - "proxy://do=live&type=txt&ext=aHR0cHM6Ly9naXRjb2RlLm5ldC9xcV8yNjg5ODIzMS9UVkJveC8tL3Jhdy9tYWluL2xpdmUvMDgzMHpiLnR4dA==" + "proxy://do=live&type=txt&ext=aHR0cDovL2Ntcy5ub2tpYS5wcmVzcy9saXZlcw==" ] } ] diff --git a/utils/log.py b/utils/log.py index 18e47c0..18111d6 100644 --- a/utils/log.py +++ b/utils/log.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # File : log.py # Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ -# Date : 2022/8/27 +# Date : 2022/9/6 import os import logging diff --git a/utils/update.py b/utils/update.py index ee2df7d..964386e 100644 --- a/utils/update.py +++ b/utils/update.py @@ -73,12 +73,9 @@ def copy_to_update(): # print(f'升级失败,找不到目录{dr_path}') logger.info(f'升级失败,找不到目录{dr_path}') return False - force_copy_files(os.path.join(dr_path, f'js'),os.path.join(base_path, f'js')) - force_copy_files(os.path.join(dr_path, f'classes'),os.path.join(base_path, f'classes')) - force_copy_files(os.path.join(dr_path, f'models'),os.path.join(base_path, f'models')) - force_copy_files(os.path.join(dr_path, f'static'),os.path.join(base_path, f'static')) - force_copy_files(os.path.join(dr_path, f'templates'),os.path.join(base_path, f'templates')) - force_copy_files(os.path.join(dr_path, f'utils'),os.path.join(base_path, f'utils')) + paths = ['js','models','controllers','libs','static','templates','utils'] + for path in paths: + force_copy_files(os.path.join(dr_path, path),os.path.join(base_path, path)) return True def download_new_version(): diff --git a/utils/web.py b/utils/web.py index 812d80e..508fe58 100644 --- a/utils/web.py +++ b/utils/web.py @@ -2,14 +2,14 @@ # -*- coding: utf-8 -*- # File : web.py # Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ -# Date : 2022/8/25 +# Date : 2022/9/6 import os -import socket -import hashlib -from werkzeug.utils import import_string -import psutil + from flask import request -from utils.log import logger +import hashlib +from time import time +from utils.system import cfg + MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36' PC_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36' UA = 'Mozilla/5.0' @@ -18,88 +18,40 @@ headers = { 'Referer': 'https://www.baidu.com', 'user-agent': UA, } -from time import time -import config as settings -def get_host_ip2(): # 获取局域网ip - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - try: - # print('8888') - s.connect(('8.8.8.8', 80)) # 114.114.114.114也是dns地址 - ip = s.getsockname()[0] - finally: - s.close() - return ip - -def get_host_ip_old(): # 获取局域网ip - from netifaces import interfaces, ifaddresses, AF_INET - ips = [] - for ifaceName in interfaces(): - addresses = ''.join([i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr': ''}])]) - ips.append(addresses) - real_ips = list(filter(lambda x:x and x!='127.0.0.1',ips)) - # logger.info(real_ips) - jyw = list(filter(lambda x:str(x).startswith('192.168'),real_ips)) - return real_ips[-1] if len(jyw) < 1 else jyw[0] - -def get_host_ip(): # 获取局域网ip - netcard_info,ips = get_wlan_info() - # print(netcard_info) - real_ips = list(filter(lambda x: x and x != '127.0.0.1', ips)) - jyw = list(filter(lambda x: str(x).startswith('192.168'), real_ips)) - return real_ips[-1] if len(jyw) < 1 else jyw[0] - -def get_wlan_info(): - info = psutil.net_if_addrs() - # print(info) - netcard_info = [] - ips = [] - for k, v in info.items(): - for item in v: - if item[0] == 2: - netcard_info.append((k, item[1])) - ips.append(item[1]) - return netcard_info,ips - -def getHost(mode=0,port=None): - port = port or request.environ.get('SERVER_PORT') - # hostname = socket.gethostname() - # ip = socket.gethostbyname(hostname) - # ip = request.remote_addr - # print(ip) - # mode 为0是本地,1是局域网 2是线上 - if mode == 0: - host = f'http://localhost:{port}' - elif mode == 1: - REAL_IP = get_host_ip() - ip = REAL_IP - host = f'http://{ip}:{port}' +def getParmas(key=None,value=''): + """ + 获取链接参数 + :param key: + :return: + """ + content_type = request.headers.get('Content-Type') + args = {} + if request.method == 'POST': + if 'application/x-www-form-urlencoded' in content_type or 'multipart/form-data' in content_type: + args = request.form + elif 'application/json' in content_type: + args = request.json + elif 'text/plain' in content_type: + args = request.data + else: + args = request.args + elif request.method == 'GET': + args = request.args + if key: + return args.get(key,value) else: - host = get_conf(settings).get('PLAY_URL','http://cms.nokia.press') - return host - -def get_conf(obj): - new_conf = {} - if isinstance(obj, str): - config = import_string(obj) - for key in dir(obj): - if key.isupper(): - new_conf[key] = getattr(obj, key) - # print(new_conf) - return new_conf - -def get_interval(t): - interval = time() - t - interval = round(interval*1000,2) - return interval + return args def md5(str): return hashlib.md5(str.encode(encoding='UTF-8')).hexdigest() -def verfy_token(token=''): - if not token or len(str(token))!=32: +def verfy_token(token=None): + if not token: + cookies = request.cookies + token = cookies.get('token', '') + if not token or len(str(token)) != 32: return False - cfg = get_conf(settings) username = cfg.get('UNAME','') pwd = cfg.get('PWD','') ctoken = md5(f'{username};{pwd}') @@ -108,6 +60,11 @@ def verfy_token(token=''): return False return True +def get_interval(t): + interval = time() - t + interval = round(interval*1000,2) + return interval + def getHeaders(url): headers = {} if url: @@ -115,27 +72,4 @@ def getHeaders(url): headers.setdefault("User-Agent", PC_UA) headers.setdefault("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9") headers.setdefault("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2") - return headers - -def getAlist(): - base_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) # 上级目录 - alist_path = os.path.join(base_path, 'js/alist.conf') - with open(alist_path,encoding='utf-8') as f: - data = f.read().strip() - alists = [] - for i in data.split('\n'): - i = i.strip() - dt = i.split(',') - if not i.strip().startswith('#'): - obj = { - 'name': dt[0], - 'server': dt[1], - 'type':"alist", - } - if len(dt) > 2: - obj.update({ - 'password': dt[2] - }) - alists.append(obj) - print(f'共计{len(alists)}条alist记录') - return alists \ No newline at end of file + return headers \ No newline at end of file -- GitLab