diff --git a/app.py b/app.py index f92632de47141794ab3fa2ebc707480a13ff202c..c979ae3451606b4d6ad0639703eb1e898db96539 100644 --- a/app.py +++ b/app.py @@ -6,11 +6,12 @@ from flask_sqlalchemy import SQLAlchemy import config +# import settings import warnings warnings.filterwarnings('ignore') import os -from flask import Flask, jsonify, abort,request,redirect,make_response,render_template,send_from_directory +from flask import Flask, jsonify, abort,request,redirect,make_response,render_template,send_from_directory,url_for from js.rules import getRules from utils import error,parser from utils.web import * @@ -19,11 +20,13 @@ import codecs from classes.cms import CMS,logger import json sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) - 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) +print('自定义播放解析地址:',app.config.get('PLAY_URL')) app.logger.name="drLogger" db = SQLAlchemy(app) @@ -60,10 +63,17 @@ def forbidden(): # put application's code here @app.route('/index') def index(): # put application's code here # logger.info("进入了首页") + a = redirect(url_for('vod')).headers['Location'] + print(a) return render_template('index.html',getHost=getHost) @app.route('/vod') def vod(): + play_url = getParmas('play_url') + if play_url: # 播放 + logger.info(f'播放重定向到:{play_url}') + return redirect(play_url) + rule = getParmas('rule') ext = getParmas('ext') if not ext.startswith('http') and not rule: @@ -77,7 +87,7 @@ def vod(): if not js_code: return jsonify(error.failed('爬虫规则加载失败')) rule = ctx.eval('rule') - cms = CMS(rule,db,RuleClass) + cms = CMS(rule,db,RuleClass,app.config) wd = getParmas('wd') ac = getParmas('ac') quick = getParmas('quick') diff --git a/classes/cms.py b/classes/cms.py index c284ec738dfbed2e3cbc85e58b7514788a046756..3b8ffcc4aaaf0721a9678fb1c12dd74913b3fbdd 100644 --- a/classes/cms.py +++ b/classes/cms.py @@ -14,9 +14,22 @@ from utils.htmlParser import jsoup from urllib.parse import urljoin from concurrent.futures import ThreadPoolExecutor # 引入线程池 from time import time +from flask import url_for,redirect class CMS: - def __init__(self,rule,db=None,RuleClass=None): + def __init__(self, rule, db=None, RuleClass=None, new_conf=None): + if new_conf is None: + new_conf = {} + self.play_parse = rule.get('play_parse', False) + play_url = new_conf.get('PLAY_URL',getHost(1)) + if not play_url.startswith('http'): + play_url = 'http://'+play_url + self.vod = redirect(url_for('vod')).headers['Location'] + if self.play_parse: + self.play_url = play_url + self.vod + '?play_url=' + logger.info(f'cms重定向链接:{self.play_url}') + else: + self.play_url = '' self.db = db self.RuleClass = RuleClass host = rule.get('host','').rstrip('/') @@ -386,7 +399,7 @@ class CMS: if p == '*': vod = self.blank_vod() vod['vod_play_from'] = '道长在线' - vod['desc'] = detailUrl + vod['desc'] = self.play_url+detailUrl vod['vod_actor'] = '没有二级,只有一级链接直接嗅探播放' vod['content'] = detailUrl vod['vod_play_url'] = '嗅探播放$'+detailUrl @@ -454,7 +467,8 @@ class CMS: for i in range(len(vodHeader)): p1 = p['lists'].replace('#id',str(i)) vodList = pdfa(html,p1) # 1条线路的选集列表 - vodList = [pq(i).text()+'$'+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 + # vodList = [pq(i).text()+'$'+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 + vodList = [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) @@ -483,7 +497,8 @@ class CMS: 'list': vod_list } t2 = time() - logger.info(f'{self.getName()}获取详情页耗时:{round((t2-t1)*1000,2)}毫秒') + logger.info(f'{self.getName()}获取详情页耗时:{round((t2-t1)*1000,2)}毫秒,共计{round(len(str(result))/1000,2)} kb') + # print(result) return result def searchContent(self, key, fypage=1): diff --git a/config.py b/config.py index dd6595dff2130815d3e999e0f6e9bee6676d6c87..cdef0356c3ffc4875d56535d9ac3c5ac29fea9c5 100644 --- a/config.py +++ b/config.py @@ -16,4 +16,6 @@ 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返回的中文正常显示 \ No newline at end of file +JSON_AS_ASCII = False # jsonify返回的中文正常显示 +# PLAY_URL = 'http://localhost:5705' # 匹配远程解析服务器链接 +# PLAY_URL = PLAY_URL.rstrip('/') \ No newline at end of file diff --git "a/js/555\345\275\261\350\247\206.js" "b/js/555\345\275\261\350\247\206.js" index 57141a4c0af765a38d5ac950e87bbd9b36791ed7..a9df19bc1f8c9edf9098b3063cb9e67c9ac339df 100644 --- "a/js/555\345\275\261\350\247\206.js" +++ "b/js/555\345\275\261\350\247\206.js" @@ -11,6 +11,7 @@ var rule = { // class_name:'电影&连续剧&福利&动漫&综艺', // class_url:'1&2&124&4&3', class_parse:'.navbar-items li:gt(2):lt(8);a&&Text;a&&href;/(\\d+).html', + play_parse:true, limit:10, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git a/js/cokemv.js b/js/cokemv.js index 7f99ee7883879db2219a34a1d1fed70a3107b984..8d094d45a2c74b2f7f12bf911ee1375397da83af 100644 --- a/js/cokemv.js +++ b/js/cokemv.js @@ -10,6 +10,7 @@ var rule = { }, timeout:5000, class_parse:'.navbar-items li:gt(1):lt(7);a&&Text;a&&href;/(\\d+).html', + play_parse:true, limit:8, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\345\226\265\345\226\265.js" "b/js/\345\226\265\345\226\265.js" index 63d21987c11b9b1350429c0e7ea6dfd431f768a4..5aea615f0dc10357e1a7e3ecaa9f57cd953aebf9 100644 --- "a/js/\345\226\265\345\226\265.js" +++ "b/js/\345\226\265\345\226\265.js" @@ -9,6 +9,7 @@ var rule = { }, timeout:5000, class_parse:'.bm-item-list a:gt(0):lt(7);a&&Text;a&&href;/(\\d+).html', + play_parse:true, limit:5, 推荐:'.movie-list-body;.movie-list-item;.movie-title&&Text;.movie-post-lazyload&&data-original;.movie-rating&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\345\244\234\347\251\272.js" "b/js/\345\244\234\347\251\272.js" index fa22db6a225c0fe7377af9e61f4b411c6ead2738..79921cb0e00c076d48439d411b8689897813caf0 100644 --- "a/js/\345\244\234\347\251\272.js" +++ "b/js/\345\244\234\347\251\272.js" @@ -11,6 +11,7 @@ var rule = { // class_name:'电影&连续剧&福利&动漫&综艺', // class_url:'1&2&124&4&3', class_parse:'.navbar-items li:gt(1):lt(7);a&&Text;a&&href;.*v/(.*?)/', + play_parse:true, limit:10, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\347\216\251\345\201\266\345\247\220\345\247\220.js" "b/js/\347\216\251\345\201\266\345\247\220\345\247\220.js" index feda1f7eb7cefc5087bb12d7ee1fa4eb5c91e95b..dce2f3a4a46a0d871586757dcbef50310c449f70 100644 --- "a/js/\347\216\251\345\201\266\345\247\220\345\247\220.js" +++ "b/js/\347\216\251\345\201\266\345\247\220\345\247\220.js" @@ -8,6 +8,7 @@ var rule = { }, timeout:5000, class_parse:'#side-menu:lt(1) li;a&&Text;a&&href;com/(.*?)/', + play_parse:true, 一级:'.col-sm-6;h3&&Text;img&&data-src;.date&&Text;a&&href', 二级:'*', } \ No newline at end of file diff --git "a/js/\347\223\234\347\232\256TV.js" "b/js/\347\223\234\347\232\256TV.js" index 291f308abaa2291621f055ef403f376d174c33f2..99024a3bfe658b2b90e67eea73e1ebdf46539958 100644 --- "a/js/\347\223\234\347\232\256TV.js" +++ "b/js/\347\223\234\347\232\256TV.js" @@ -11,6 +11,7 @@ var rule = { // class_name:'电影&连续剧&福利&动漫&综艺', // class_url:'1&2&124&4&3', class_parse:'.navbar-items li:gt(1):lt(8);a&&Text;a&&href;.*-(.*?).html', + play_parse:true, limit:10, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\350\216\253\346\211\216\345\205\224.js" "b/js/\350\216\253\346\211\216\345\205\224.js" index 64e36f860ebdf1f8e0878e6bf3418bb44247fb2e..232f7ca3fb03080efa6ba1ebe2523dfbc6d326f2 100644 --- "a/js/\350\216\253\346\211\216\345\205\224.js" +++ "b/js/\350\216\253\346\211\216\345\205\224.js" @@ -11,6 +11,7 @@ var rule = { // class_name:'电影&连续剧&福利&动漫&综艺', // class_url:'1&2&124&4&3', class_parse:'.navbar-items li:gt(2):lt(8);a&&Text;a&&href;.*/(.*?).html', + play_parse:true, limit:10, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\350\223\235\350\216\223\345\275\261\350\247\206.js" "b/js/\350\223\235\350\216\223\345\275\261\350\247\206.js" index 583f65dd74d4cfb4989237a602fb40e59507a658..8ad39f85b9fbc555154bebc75dc1ef0bf9240eba 100644 --- "a/js/\350\223\235\350\216\223\345\275\261\350\247\206.js" +++ "b/js/\350\223\235\350\216\223\345\275\261\350\247\206.js" @@ -10,6 +10,7 @@ var rule = { // class_name:'电影&网剧&剧集&动漫&综艺&记录', // class_url:'20&1&2&3&4&23', class_parse:'.navbar-items li:gt(1):lt(8);a&&Text;a&&href;/(\\d+).html', + play_parse:true, limit:30, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\351\270\255\345\245\210\351\243\236.js" "b/js/\351\270\255\345\245\210\351\243\236.js" index be8e6d74aa4d6052fdd7f0b6c22192fb0d0a2e4d..7d942a4c46592208f7c29911156909bb2a329eab 100644 --- "a/js/\351\270\255\345\245\210\351\243\236.js" +++ "b/js/\351\270\255\345\245\210\351\243\236.js" @@ -8,6 +8,7 @@ var rule = { // class_name:'电影&连续剧&综艺&动漫', // class_url:'dianying&lianxuju&zongyi&dongman', class_parse:'.navbar-items li:gt(1):lt(6);a&&Text;a&&href;.*/(.*?).html', + play_parse:true, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 一级:'body a.module-poster-item.module-item;a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href', diff --git a/readme.md b/readme.md index 0a0ed292005afc7501968913105bb94dd9ee4831..b65d2e571c1b1580d93c925928ee29cb538f5ff1 100644 --- a/readme.md +++ b/readme.md @@ -73,6 +73,8 @@ var rule = { class_url:'1&2&3&4',//静态分类标识拼接 //动态分类获取 列表;标题;链接;正则提取 不需要正则的时候后面别加分号 class_parse:'#side-menu:lt(1) li;a&&Text;a&&href;com/(.*?)/', + // 服务器解析播放 + play_parse:true, // 首页推荐显示数量 limit:6, double:true,//是否双层列表定位,默认false diff --git a/utils/web.py b/utils/web.py index 96b51a0eb44b3d59dc6f9d0b9e6c323beec43387..cd63e99db24a570f50772ed49de88181438b5bfb 100644 --- a/utils/web.py +++ b/utils/web.py @@ -5,6 +5,7 @@ # Date : 2022/8/25 import socket +from werkzeug.utils import import_string from netifaces import interfaces, ifaddresses, AF_INET from flask import request from utils.log import logger @@ -52,4 +53,14 @@ def getHost(mode=0,port=None): host = f'{ip}:{port}' else: host = 'cms.nokia.press' - return host \ No newline at end of file + 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 \ No newline at end of file