1123
This commit is contained in:
Liu
2024-11-24 01:12:22 +08:00
parent 490838a337
commit 5902451f0a
51 changed files with 23220 additions and 24037 deletions

View File

@@ -42,5 +42,29 @@
{
"share_name": "4K影视",
"share_id": "wHPKUENKFsS"
},
{
"share_name": "诺兰全集",
"share_id": "gf2GebXnZHh"
},
{
"share_name": "纪录片",
"share_id": "fSNHaYST47s"
},
{
"share_name": "掌灯者|港",
"share_id": "wHPKUENKFsS"
},
{
"share_name": "掌灯者|一",
"share_id": "wHPKUENKFsS"
},
{
"share_name": "掌灯者|二",
"share_id": "wHPKUENKFsS"
},
{
"share_name": "掌灯者|三",
"share_id": "wHPKUENKFsS"
}
]

View File

@@ -27,7 +27,23 @@ cheerio.jinja2 = function(template, obj) {
// import {gbkTool} from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/gbk.js'
let vercode = typeof(pdfl) === 'function' ? 'drpy2.1' : 'drpy2';
const VERSION = vercode + ' 3.9.51beta5 20241014';
const VERSION = vercode + ' 3.9.51beta5 20241104';
const UpdateInfo = [{
date: '20241104',
title: 'drpy更新增加新特性',
version: '3.9.51beta5 20241104',
msg: `
1. rule增加 搜索验证标识 属性,可以不定义,默认为 '系统安全验证|请输入验证码'
2. rule增加 searchNoPage 属性,可以不定义,如果定义 1 将关闭该源的搜索翻页功能超过1页直接返回空
`
}, ];
function getUpdateInfo() {
return UpdateInfo.map((_o) => {
_o.msg = _o.msg.trim().split('\n').map(_it => _it.trim()).join('\n')
return _o
})
}
function init_test() {
// console.log(typeof(JSON5));
@@ -1788,12 +1804,14 @@ function request(url, obj, ocr_flag) {
obj.redirect = 0;
}
if (obj.headers.hasOwnProperty('Content-Type') || obj.headers.hasOwnProperty('content-type')) {
if (obj.headers["Content-Type"].includes("application/x-www-form-urlencoded")) {
log("body");
let _contentType = obj.headers["Content-Type"] || obj.headers["content-type"] || "";
if (_contentType.includes("application/x-www-form-urlencoded")) {
log("custom body is application/x-www-form-urlencoded");
//console.log(JSON.stringify(obj));
if (typeof obj.body == "string") {
let temp_obj = parseQueryString(obj.body);
//obj.body = objectToQueryString(temp_obj);
console.log(JSON.stringify(temp_obj));
}
}
}
@@ -2459,6 +2477,10 @@ function searchParse(searchObj) {
if (!searchObj.searchUrl) {
return '{}'
}
if (rule.searchNoPage && Number(searchObj.pg) > 1) {
// 关闭搜索分页
return '{}'
}
let p = searchObj.搜索 === '*' && rule.一级 ? rule.一级 : searchObj.搜索;
if (!p || typeof(p) !== 'string') {
return '{}'
@@ -2551,7 +2573,9 @@ function searchParse(searchObj) {
html = getHtml(MY_URL);
}
if (html) {
if (/系统安全验证|输入验证码/.test(html)) {
// 解决搜索源码奇葩触发自动过验证逻辑
let search_tag = rule.搜索验证标识 || '系统安全验证|输入验证码';
if (new RegExp(search_tag).test(html)) {
let cookie = verifyCode(MY_URL);
if (cookie) {
console.log(`本次成功过验证,cookie:${cookie}`);

View File

@@ -19,7 +19,23 @@ cheerio.jinja2 = function(template, obj) {
}
};
let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2";
const VERSION = vercode + " 3.9.51beta5 20241014";
const VERSION = vercode + " 3.9.51beta5 20241104";
const UpdateInfo = [{
date: "20241104",
title: "drpy更新增加新特性",
version: "3.9.51beta5 20241104",
msg: `
1. rule增加 搜索验证标识 属性,可以不定义,默认为 '系统安全验证|请输入验证码'
2. rule增加 searchNoPage 属性,可以不定义,如果定义 1 将关闭该源的搜索翻页功能超过1页直接返回空
`
}];
function getUpdateInfo() {
return UpdateInfo.map(_o => {
_o.msg = _o.msg.trim().split("\n").map(_it => _it.trim()).join("\n");
return _o
})
}
function init_test() {
console.log("init_test_start");
@@ -1376,10 +1392,12 @@ function request(url, obj, ocr_flag) {
obj.redirect = 0
}
if (obj.headers.hasOwnProperty("Content-Type") || obj.headers.hasOwnProperty("content-type")) {
if (obj.headers["Content-Type"].includes("application/x-www-form-urlencoded")) {
log("body");
let _contentType = obj.headers["Content-Type"] || obj.headers["content-type"] || "";
if (_contentType.includes("application/x-www-form-urlencoded")) {
log("custom body is application/x-www-form-urlencoded");
if (typeof obj.body == "string") {
let temp_obj = parseQueryString(obj.body)
let temp_obj = parseQueryString(obj.body);
console.log(JSON.stringify(temp_obj))
}
}
}
@@ -1938,6 +1956,9 @@ function searchParse(searchObj) {
if (!searchObj.searchUrl) {
return "{}"
}
if (rule.searchNoPage && Number(searchObj.pg) > 1) {
return "{}"
}
let p = searchObj.搜索 === "*" && rule.一级 ? rule.一级 : searchObj.搜索;
if (!p || typeof p !== "string") {
return "{}"
@@ -2016,7 +2037,8 @@ function searchParse(searchObj) {
html = getHtml(MY_URL)
}
if (html) {
if (/系统安全验证|输入验证码/.test(html)) {
let search_tag = rule.搜索验证标识 || "系统安全验证|输入验证码";
if (new RegExp(search_tag).test(html)) {
let cookie = verifyCode(MY_URL);
if (cookie) {
console.log(`本次成功过验证,cookie:${cookie}`);

504
潇洒/JS/jinja.min.js vendored Normal file
View File

@@ -0,0 +1,504 @@
(function(global, factory) {
typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.jinja = {}))
})(this, function(jinja) {
"use strict";
var STRINGS = /'(\\.|[^'])*'|"(\\.|[^"'"])*"/g;
var IDENTS_AND_NUMS = /([$_a-z][$\w]*)|([+-]?\d+(\.\d+)?)/g;
var NUMBER = /^[+-]?\d+(\.\d+)?$/;
var NON_PRIMITIVES = /\[[@#~](,[@#~])*\]|\[\]|\{([@i]:[@#~])(,[@i]:[@#~])*\}|\{\}/g;
var IDENTIFIERS = /[$_a-z][$\w]*/gi;
var VARIABLES = /i(\.i|\[[@#i]\])*/g;
var ACCESSOR = /(\.i|\[[@#i]\])/g;
var OPERATORS = /(===?|!==?|>=?|<=?|&&|\|\||[+\-\*\/%])/g;
var EOPS = /(^|[^$\w])(and|or|not|is|isnot)([^$\w]|$)/g;
var LEADING_SPACE = /^\s+/;
var TRAILING_SPACE = /\s+$/;
var START_TOKEN = /\{\{\{|\{\{|\{%|\{#/;
var TAGS = {
"{{{": /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?\}\}\}/,
"{{": /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?\}\}/,
"{%": /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?%\}/,
"{#": /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?#\}/
};
var delimeters = {
"{%": "directive",
"{{": "output",
"{#": "comment"
};
var operators = {
and: "&&",
or: "||",
not: "!",
is: "==",
isnot: "!="
};
var constants = {
true: true,
false: false,
null: null
};
function Parser() {
this.nest = [];
this.compiled = [];
this.childBlocks = 0;
this.parentBlocks = 0;
this.isSilent = false
}
Parser.prototype.push = function(line) {
if (!this.isSilent) {
this.compiled.push(line)
}
};
Parser.prototype.parse = function(src) {
this.tokenize(src);
return this.compiled
};
Parser.prototype.tokenize = function(src) {
var lastEnd = 0,
parser = this,
trimLeading = false;
matchAll(src, START_TOKEN, function(open, index, src) {
var match = src.slice(index + open.length).match(TAGS[open]);
match = match ? match[0] : "";
var simplified = match.replace(STRINGS, "@");
if (!match || ~simplified.indexOf(open)) {
return index + 1
}
var inner = match.slice(0, 0 - open.length);
if (inner.charAt(0) === "-") var wsCollapseLeft = true;
if (inner.slice(-1) === "-") var wsCollapseRight = true;
inner = inner.replace(/^-|-$/g, "").trim();
if (parser.rawMode && open + inner !== "{%endraw") {
return index + 1
}
var text = src.slice(lastEnd, index);
lastEnd = index + open.length + match.length;
if (trimLeading) text = trimLeft(text);
if (wsCollapseLeft) text = trimRight(text);
if (wsCollapseRight) trimLeading = true;
if (open === "{{{") {
open = "{{";
inner += "|safe"
}
parser.textHandler(text);
parser.tokenHandler(open, inner)
});
var text = src.slice(lastEnd);
if (trimLeading) text = trimLeft(text);
this.textHandler(text)
};
Parser.prototype.textHandler = function(text) {
this.push("write(" + JSON.stringify(text) + ");")
};
Parser.prototype.tokenHandler = function(open, inner) {
var type = delimeters[open];
if (type === "directive") {
this.compileTag(inner)
} else if (type === "output") {
var extracted = this.extractEnt(inner, STRINGS, "@");
extracted.src = extracted.src.replace(/\|\|/g, "~").split("|");
extracted.src = extracted.src.map(function(part) {
return part.split("~").join("||")
});
var parts = this.injectEnt(extracted, "@");
if (parts.length > 1) {
var filters = parts.slice(1).map(this.parseFilter.bind(this));
this.push("filter(" + this.parseExpr(parts[0]) + "," + filters.join(",") + ");")
} else {
this.push("filter(" + this.parseExpr(parts[0]) + ");")
}
}
};
Parser.prototype.compileTag = function(str) {
var directive = str.split(" ")[0];
var handler = tagHandlers[directive];
if (!handler) {
throw new Error("Invalid tag: " + str)
}
handler.call(this, str.slice(directive.length).trim())
};
Parser.prototype.parseFilter = function(src) {
src = src.trim();
var match = src.match(/[:(]/);
var i = match ? match.index : -1;
if (i < 0) return JSON.stringify([src]);
var name = src.slice(0, i);
var args = src.charAt(i) === ":" ? src.slice(i + 1) : src.slice(i + 1, -1);
args = this.parseExpr(args, {
terms: true
});
return "[" + JSON.stringify(name) + "," + args + "]"
};
Parser.prototype.extractEnt = function(src, regex, placeholder) {
var subs = [],
isFunc = typeof placeholder == "function";
src = src.replace(regex, function(str) {
var replacement = isFunc ? placeholder(str) : placeholder;
if (replacement) {
subs.push(str);
return replacement
}
return str
});
return {
src: src,
subs: subs
}
};
Parser.prototype.injectEnt = function(extracted, placeholder) {
var src = extracted.src,
subs = extracted.subs,
isArr = Array.isArray(src);
var arr = isArr ? src : [src];
var re = new RegExp("[" + placeholder + "]", "g"),
i = 0;
arr.forEach(function(src, index) {
arr[index] = src.replace(re, function() {
return subs[i++]
})
});
return isArr ? arr : arr[0]
};
Parser.prototype.replaceComplex = function(s) {
var parsed = this.extractEnt(s, /i(\.i|\[[@#i]\])+/g, "v");
parsed.src = parsed.src.replace(NON_PRIMITIVES, "~");
return this.injectEnt(parsed, "v")
};
Parser.prototype.parseExpr = function(src, opts) {
opts = opts || {};
var parsed1 = this.extractEnt(src, STRINGS, "@");
parsed1.src = parsed1.src.replace(EOPS, function(s, before, op, after) {
return op in operators ? before + operators[op] + after : s
});
var parsed2 = this.extractEnt(parsed1.src, IDENTS_AND_NUMS, function(s) {
return s in constants || NUMBER.test(s) ? "#" : null
});
var parsed3 = this.extractEnt(parsed2.src, IDENTIFIERS, "i");
parsed3.src = parsed3.src.replace(/\s+/g, "");
var simplified = parsed3.src;
while (simplified !== (simplified = this.replaceComplex(simplified)));
while (simplified !== (simplified = simplified.replace(/i(\.i|\[[@#i]\])+/, "v")));
simplified = simplified.replace(/[iv]\[v?\]/g, "x");
simplified = simplified.replace(/[@#~v]/g, "i");
simplified = simplified.replace(OPERATORS, "%");
simplified = simplified.replace(/!+[i]/g, "i");
var terms = opts.terms ? simplified.split(",") : [simplified];
terms.forEach(function(term) {
while (term !== (term = term.replace(/\(i(%i)*\)/g, "i")));
if (!term.match(/^i(%i)*/)) {
throw new Error("Invalid expression: " + src + " " + term)
}
});
parsed3.src = parsed3.src.replace(VARIABLES, this.parseVar.bind(this));
parsed2.src = this.injectEnt(parsed3, "i");
parsed1.src = this.injectEnt(parsed2, "#");
return this.injectEnt(parsed1, "@")
};
Parser.prototype.parseVar = function(src) {
var args = Array.prototype.slice.call(arguments);
var str = args.pop(),
index = args.pop();
if (src === "i" && str.charAt(index + 1) === ":") {
return '"i"'
}
var parts = ['"i"'];
src.replace(ACCESSOR, function(part) {
if (part === ".i") {
parts.push('"i"')
} else if (part === "[i]") {
parts.push('get("i")')
} else {
parts.push(part.slice(1, -1))
}
});
return "get(" + parts.join(",") + ")"
};
Parser.prototype.escName = function(str) {
return str.replace(/\W/g, function(s) {
return "$" + s.charCodeAt(0).toString(16)
})
};
Parser.prototype.parseQuoted = function(str) {
if (str.charAt(0) === "'") {
str = str.slice(1, -1).replace(/\\.|"/, function(s) {
if (s === "\\'") return "'";
return s.charAt(0) === "\\" ? s : "\\" + s
});
str = '"' + str + '"'
}
return JSON.parse(str)
};
var tagHandlers = {
if: function(expr) {
this.push("if (" + this.parseExpr(expr) + ") {");
this.nest.unshift("if")
},
else: function() {
if (this.nest[0] === "for") {
this.push("}, function() {")
} else {
this.push("} else {")
}
},
elseif: function(expr) {
this.push("} else if (" + this.parseExpr(expr) + ") {")
},
endif: function() {
this.nest.shift();
this.push("}")
},
for: function(str) {
var i = str.indexOf(" in ");
var name = str.slice(0, i).trim();
var expr = str.slice(i + 4).trim();
this.push("each(" + this.parseExpr(expr) + "," + JSON.stringify(name) + ",function() {");
this.nest.unshift("for")
},
endfor: function() {
this.nest.shift();
this.push("});")
},
raw: function() {
this.rawMode = true
},
endraw: function() {
this.rawMode = false
},
set: function(stmt) {
var i = stmt.indexOf("=");
var name = stmt.slice(0, i).trim();
var expr = stmt.slice(i + 1).trim();
this.push("set(" + JSON.stringify(name) + "," + this.parseExpr(expr) + ");")
},
block: function(name) {
if (this.isParent) {
++this.parentBlocks;
var blockName = "block_" + (this.escName(name) || this.parentBlocks);
this.push("block(typeof " + blockName + ' == "function" ? ' + blockName + " : function() {")
} else if (this.hasParent) {
this.isSilent = false;
++this.childBlocks;
blockName = "block_" + (this.escName(name) || this.childBlocks);
this.push("function " + blockName + "() {")
}
this.nest.unshift("block")
},
endblock: function() {
this.nest.shift();
if (this.isParent) {
this.push("});")
} else if (this.hasParent) {
this.push("}");
this.isSilent = true
}
},
extends: function(name) {
name = this.parseQuoted(name);
var parentSrc = this.readTemplateFile(name);
this.isParent = true;
this.tokenize(parentSrc);
this.isParent = false;
this.hasParent = true;
this.isSilent = true
},
include: function(name) {
name = this.parseQuoted(name);
var incSrc = this.readTemplateFile(name);
this.isInclude = true;
this.tokenize(incSrc);
this.isInclude = false
}
};
tagHandlers.assign = tagHandlers.set;
tagHandlers.elif = tagHandlers.elseif;
var getRuntime = function runtime(data, opts) {
var defaults = {
autoEscape: "toJson"
};
var _toString = Object.prototype.toString;
var _hasOwnProperty = Object.prototype.hasOwnProperty;
var getKeys = Object.keys || function(obj) {
var keys = [];
for (var n in obj)
if (_hasOwnProperty.call(obj, n)) keys.push(n);
return keys
};
var isArray = Array.isArray || function(obj) {
return _toString.call(obj) === "[object Array]"
};
var create = Object.create || function(obj) {
function F() {}
F.prototype = obj;
return new F
};
var toString = function(val) {
if (val == null) return "";
return typeof val.toString == "function" ? val.toString() : _toString.call(val)
};
var extend = function(dest, src) {
var keys = getKeys(src);
for (var i = 0, len = keys.length; i < len; i++) {
var key = keys[i];
dest[key] = src[key]
}
return dest
};
var get = function() {
var val, n = arguments[0],
c = stack.length;
while (c--) {
val = stack[c][n];
if (typeof val != "undefined") break
}
for (var i = 1, len = arguments.length; i < len; i++) {
if (val == null) continue;
n = arguments[i];
val = _hasOwnProperty.call(val, n) ? val[n] : typeof val._get == "function" ? val[n] = val._get(n) : null
}
return val == null ? "" : val
};
var set = function(n, val) {
stack[stack.length - 1][n] = val
};
var push = function(ctx) {
stack.push(ctx || {})
};
var pop = function() {
stack.pop()
};
var write = function(str) {
output.push(str)
};
var filter = function(val) {
for (var i = 1, len = arguments.length; i < len; i++) {
var arr = arguments[i],
name = arr[0],
filter = filters[name];
if (filter) {
arr[0] = val;
val = filter.apply(data, arr)
} else {
throw new Error("Invalid filter: " + name)
}
}
if (opts.autoEscape && name !== opts.autoEscape && name !== "safe") {
val = filters[opts.autoEscape].call(data, val)
}
output.push(val)
};
var each = function(obj, loopvar, fn1, fn2) {
if (obj == null) return;
var arr = isArray(obj) ? obj : getKeys(obj),
len = arr.length;
var ctx = {
loop: {
length: len,
first: arr[0],
last: arr[len - 1]
}
};
push(ctx);
for (var i = 0; i < len; i++) {
extend(ctx.loop, {
index: i + 1,
index0: i
});
fn1(ctx[loopvar] = arr[i])
}
if (len === 0 && fn2) fn2();
pop()
};
var block = function(fn) {
push();
fn();
pop()
};
var render = function() {
return output.join("")
};
data = data || {};
opts = extend(defaults, opts || {});
var filters = extend({
html: function(val) {
return toString(val).split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;").split('"').join("&quot;")
},
safe: function(val) {
return val
},
toJson: function(val) {
if (typeof val === "object") {
return JSON.stringify(val)
}
return toString(val)
}
}, opts.filters || {});
var stack = [create(data || {})],
output = [];
return {
get: get,
set: set,
push: push,
pop: pop,
write: write,
filter: filter,
each: each,
block: block,
render: render
}
};
var runtime;
jinja.compile = function(markup, opts) {
opts = opts || {};
var parser = new Parser;
parser.readTemplateFile = this.readTemplateFile;
var code = [];
code.push("function render($) {");
code.push("var get = $.get, set = $.set, push = $.push, pop = $.pop, write = $.write, filter = $.filter, each = $.each, block = $.block;");
code.push.apply(code, parser.parse(markup));
code.push("return $.render();");
code.push("}");
code = code.join("\n");
if (opts.runtime === false) {
var fn = new Function("data", "options", "return (" + code + ")(runtime(data, options))")
} else {
runtime = runtime || (runtime = getRuntime.toString());
fn = new Function("data", "options", "return (" + code + ")((" + runtime + ")(data, options))")
}
return {
render: fn
}
};
jinja.render = function(markup, data, opts) {
var tmpl = jinja.compile(markup);
return tmpl.render(data, opts)
};
jinja.templateFiles = [];
jinja.readTemplateFile = function(name) {
var templateFiles = this.templateFiles || [];
var templateFile = templateFiles[name];
if (templateFile == null) {
throw new Error("Template file not found: " + name)
}
return templateFile
};
function trimLeft(str) {
return str.replace(LEADING_SPACE, "")
}
function trimRight(str) {
return str.replace(TRAILING_SPACE, "")
}
function matchAll(str, reg, fn) {
reg = new RegExp(reg.source, "g" + (reg.ignoreCase ? "i" : "") + (reg.multiline ? "m" : ""));
var match;
while (match = reg.exec(str)) {
var result = fn(match[0], match.index, str);
if (typeof result == "number") {
reg.lastIndex = result
}
}
}
});

29
潇洒/JS/爱你短剧.js Normal file
View File

@@ -0,0 +1,29 @@
Object.assign(muban.mxone5.二级, {
tab_text: 'div--small&&Text',
});
var rule = {
模板: 'mxone5',
title: '爱你短剧',
host: 'https://www.ainidj.com',
url: '/vodshow/fyclass--------fypage---.html',
searchUrl: '/vodsearch/**----------fypage---.html',
lazy: $js.toString(() => {
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
var url = html.url;
if (html.encrypt == '1') {
url = unescape(url)
} else if (html.encrypt == '2') {
url = unescape(base64Decode(url))
}
if (/\.m3u8|\.mp4/.test(url)) {
input = {
jx: 0,
url: url,
parse: 0
}
} else {
input
}
}),
}

View File

@@ -1,81 +0,0 @@
{
"规则名": "河马短剧",
"规则作者": "香雅情",
"请求头参数": "MOBILE_UA",
"网页编码格式": "UTF-8",
"图片是否需要代理": "否",
"是否开启获取首页数据": "否",
"首页推荐链接": "https://www.kuaikaw.cn",
"首页列表数组规则": "body&&.module-items",
"首页片单列表数组规则": ".module-item:lt(12)",
"首页片单是否Jsoup写法": "1",
"分类起始页码": "1",
"分类链接": "https://www.kuaikaw.cn/browse/{cateId}/{catePg}[firstPage=https://www.kuaikaw.cn/browse/{cateId}]",
"分类名称": "全部",
"分类名称替换词": "0",
//"筛选数据": {},
"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "全部&民国&萌宝&动漫&超能&甜宠&豪门恩怨&长生&神医&寻亲&抗战谍战&电视剧&奇幻&闪婚&职场商战&权谋&高手下山&神话&时空之旅&欢喜冤家&都市&体育&家庭&喜剧&都市修仙&神豪&科幻&致富&奇幻脑洞&强者回归&励志&复仇&电影&马甲&亲情&小人物&无敌&现实&重生&穿越&年代&悬疑&婚姻&家国情仇&虐恋&古装&仙侠&玄幻仙侠&传承觉醒&功夫武打&戏曲歌舞&情感&逆袭&战争",
"筛选子分类替换词": "0&590-839&589&1115&442&462&585&1073&438&1125&1093&1092-1097&715&713&943&840-1101&474&1094&718&717&1129&1128&714-1126&917&1124&475&1130&918&721&476&1076-1100&416-463&1091-1096&719&835-837&472&1074&441-469&439-465&916&716-722&445-470&1127&915&466&444-468&1102&720&473&1095&1098&838&417-464&1099",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": ".BrowseList_listBox__MyeBa&&.BrowseList_listItem__h7lD4",
"分类片单是否Jsoup写法": "是",
"分类片单标题": "img&&alt",
"分类片单链接": "a&&href",
"分类片单图片": "img&&src",
"分类片单副标题": ".BrowseList_lastChapter__dkL54&&Text",
"分类片单链接加前缀": "https://www.kuaikaw.cn",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$MOBILE_UA",
"搜索链接": "https://www.kuaikaw.cn/search/{SearchPg}?searchValue={wd}",
"POST请求数据": "",
"搜索截取模式": "1",
"搜索列表数组规则": ".search_searchList__AvbeR&&.MTagBookList_tagBookItem__C_038",
"搜索片单是否Jsoup写法": "是",
"搜索片单图片": "img&&src",
"搜索片单标题": "img&&alt",
"搜索片单链接": "a&&href",
"搜索片单副标题": "",
"搜索片单链接加前缀": "https://www.kuaikaw.cn",
"搜索片单链接加后缀": "",
"链接是否直接播放": "否",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "是",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": "",
"简介详情": ".introduction_introBox__t4Bbz&&Text",
"线路列表数组规则": "",
"线路标题": "Text",
"播放列表数组规则": "body&&.CatalogList_swiperBox__5kdPs",
"选集列表数组规则": "a:not(:has(img))",
"选集标题链接是否Jsoup写法": "是",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "否",
"选集链接加前缀": "https://www.kuaikaw.cn",
"选集链接加后缀": "",
"分析MacPlayer": "否",
"是否开启手动嗅探": "否",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}

View File

@@ -1,81 +0,0 @@
{
"规则名": "爱你短剧",
"规则作者": "香雅情",
"请求头参数": "MOBILE_UA",
"网页编码格式": "UTF-8",
"图片是否需要代理": "否",
"是否开启获取首页数据": "是",
"首页推荐链接": "https://ainidj.com/",
"首页列表数组规则": "body&&.module-items",
"首页片单列表数组规则": ".module-item:lt(12)",
"首页片单是否Jsoup写法": "1",
"分类起始页码": "1",
"分类链接": "https://ainidj.com/vodshwo/{cateId}--------{catePg}---.html",
"分类名称": "穿越&战神&重生&爱情&萌娃&神医&古代&玄幻&言情",
"分类名称替换词": "fenle&fenlei2&fenlei3&fenlei4&guda&shenyi&gudai&xuanhuan&yanqing",
"筛选数据": {},
//"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": ".module-items&&.module-item",
"分类片单是否Jsoup写法": "是",
"分类片单标题": ".video-name&&Text",
"分类片单链接": "a&&href",
"分类片单图片": ".lazy&&data-src",
"分类片单副标题": ".module-item-text&&Text",
"分类片单链接加前缀": "https://ainidj.com",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$MOBILE_UA",
"搜索链接": "https://ainidj.com/vodsearch/{wd}----------{SearchPg}---.html",
"POST请求数据": "",
"搜索截取模式": "1",
"搜索列表数组规则": ".module-items&&.module-search-item",
"搜索片单是否Jsoup写法": "是",
"搜索片单图片": ".lazyload&&data-src",
"搜索片单标题": ".video-info&&h3&&Text",
"搜索片单链接": "a&&href",
"搜索片单副标题": ".video-serial&&Text",
"搜索片单链接加前缀": "https://ainidj.com",
"搜索片单链接加后缀": "",
"链接是否直接播放": "否",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "是",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": "",
"简介详情": ".video-info-main&&.video-info-content&&Text",
"线路列表数组规则": ".module-tab-items&&.module-tab-item",
"线路标题": "Text",
"播放列表数组规则": "body&&.module-player-list",
"选集列表数组规则": ".scroll-content&&a",
"选集标题链接是否Jsoup写法": "是",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "否",
"选集链接加前缀": "https://ainidj.com",
"选集链接加后缀": "",
"分析MacPlayer": "否",
"是否开启手动嗅探": "否",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}

View File

@@ -42,11 +42,7 @@
"type": 3,
"api": "csp_Duanj",
"searchable": 1,
"changeable": 0,
"style": {
"type": "rect",
"ratio": 1.433
}
"changeable": 0
},
{
"key": "在线短剧",
@@ -54,11 +50,7 @@
"type": 3,
"api": "csp_Duanju",
"searchable": 1,
"changeable": 0,
"style": {
"type": "rect",
"ratio": 1.433
}
"changeable": 0
},
{
"key": "星芽短剧",
@@ -69,6 +61,15 @@
"quickSearch": 0,
"filterable": 0
},
{
"key": "河马短剧",
"name": "河马|短剧",
"type": 3,
"api": "csp_AppHMDJ",
"searchable": 1,
"quickSearch": 0,
"filterable": 0
},
{
"key": "天堂短剧",
"name": "天堂|短剧",
@@ -80,21 +81,8 @@
"key": "爱你短剧",
"name": "爱你|短剧",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./XYQHiker/爱你短剧.json"
},
{
"key": "河马短剧",
"name": "河马|短剧",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./XYQHiker/河马短剧.json"
"api": "./JS/drpy2.min.js",
"ext": "./JS/爱你短剧.js"
},
{
"key": "短剧屋",
@@ -223,7 +211,7 @@
"name": "大米APP",
"type": 3,
"api": "./JS/drpy2.min.js",
"ext": "./JS/APPV2.js?type=url&params=https://dmz8k4.wiki"
"ext": "./JS/APPV2.js?type=url&params=https://damifan.wiki"
},
{
"key": "西瓜视频",
@@ -236,7 +224,7 @@
"changeable": 0,
"style": {
"type": "rect",
"ratio": 1.433
"ratio": 1.597
}
},
{
@@ -244,9 +232,7 @@
"name": "采集|合集",
"type": 3,
"api": "./JS/drpy2.min.js",
"searchable": 1,
"quickSearch": 1,
"ext": "./JS/采集之王.js?type=url&params=../JSON/采集静态.json$1"
"ext": "./JS/采集之王.js?type=url&params=../JSON/采集静态.json$1$1"
},
{
"key": "厂长资源",
@@ -1012,7 +998,7 @@
"filterable": 1,
"style": {
"type": "rect",
"ratio": 1.433
"ratio": 1.597
},
"ext": {
"cookie": "file://TV/bilibili.txt"
@@ -1189,8 +1175,8 @@
}
},
{
"key": "夸克土豆弹幕",
"name": "土豆4K弹幕",
"key": "夸克小米弹幕",
"name": "小米4K弹幕",
"type": 3,
"api": "csp_Wobg",
"quickSearch": 1,
@@ -1199,7 +1185,7 @@
"ext": {
"token": "file://TV/token.txt",
"cookie": "file://TV/quark.txt",
"site": "https://yunpan.yunpay.cc",
"site": "http://ucmi.fun",
"danmu": true
}
},
@@ -1229,7 +1215,7 @@
"ext": {
"token": "file://TV/token.txt",
"cookie": "file://TV/quark.txt",
"site": "http://labipan.com",
"site": "http://duopan.fun",
"danmu": true
}
},
@@ -1250,8 +1236,8 @@
}
},
{
"key": "夸克奥秘弹幕",
"name": "奥秘4K弹幕",
"key": "夸克龙龙弹幕",
"name": "龙龙4K弹幕",
"type": 3,
"api": "csp_Wobg",
"quickSearch": 1,
@@ -1261,23 +1247,7 @@
"token": "file://TV/token.txt",
"cookie": "file://TV/quark.txt",
"uc_cookie": "file://TV/uc.txt",
"site": "https://vip.omii.top",
"danmu": true
}
},
{
"key": "夸克云星弹幕",
"name": "云星4K弹幕",
"type": 3,
"api": "csp_Wobg",
"quickSearch": 1,
"changeable": 1,
"filterable": 1,
"ext": {
"token": "file://TV/token.txt",
"cookie": "file://TV/quark.txt",
"uc_cookie": "file://TV/uc.txt",
"site": "https://4k.4u4.cn",
"site": "http://wanou.龙龙.top:3108",
"danmu": true
}
},
@@ -1293,7 +1263,7 @@
"token": "file://TV/token.txt",
"cookie": "file://TV/quark.txt",
"uc_cookie": "file://TV/uc.txt",
"site": "http://mogg.top",
"site": "http://mogg.小胡.top",
"danmu": true
}
},
@@ -2207,4 +2177,4 @@
"ads": [
"static-mozai.4gtv.tv"
]
}
}