24-5-1.txt 1.1 MB

1
  1. [{"last_chapter_rule":"","title":"吾爱破解","author":"","version":2,"type":"news","url":"hiker://empty##https://www.52pojie.cn/forum.php?mod=guide&view=hot&page=1","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nlet ad = JSON.parse(fetch(\"hiker://page/ad\")).rule;\nad = ad.split(\"¥\")[2];\nlet blockRules = ad.split(\"&&\");\nlet url = 'https://www.52pojie.cn/forum.php?mod=guide&view=hot&page=1';\nlet ite = $.require(\"hiker://page/u\")(MY_RULE.title, url);\nsetResult([{\n col_type: \"x5_webview_single\",\n url: url,\n desc: \"float&&100%\",\n extra: {\n urlInterceptor: ite,\n canBack: true,\n blockRules: blockRules,\n //floatVideo: true\n }\n}])","searchFind":"","search_url":"","group":"①推荐","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"广告拦截\",\"path\":\"ad\",\"rule\":\"海阔视界规则分享,当前分享的是:广告网址拦截¥ad_url_rule¥/ad/&&.GIF&&/sh/to/\"},{\"col_type\":\"movie_3\",\"name\":\"ysfx\",\"path\":\"ysfx\",\"rule\":\"js:\\nvar d = [];\\nlet rule = getParam(\\\"r\\\").split(\\\"##\\\")[0];\\nlet url = MY_URL.split(\\\"##\\\")[1];\\nlet ite = $.require(\\\"hiker://page/u\\\")(rule, getHome(url));\\nlet js = $.toString(() => {\\n try {\\n if (document.title && document.title.length) {\\n let r = $$$().lazyRule((t) => {\\n setPageTitle(t);\\n }, document.title);\\n fy_bridge_app.parseLazyRule(r);\\n }\\n } catch (e) {\\n fy_bridge_app.log(e.toString());\\n }\\n});\\nlet ad = JSON.parse(fetch(\\\"hiker://page/ad\\\")).rule;\\nad = ad.split(\\\"¥\\\")[2];\\nlet blockRules = ad.split(\\\"&&\\\");\\nlog(blockRules);\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"100%&&float\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n urlInterceptor: ite,\\n js: js,\\n canBack: true,\\n jsLoadingInject: true,\\n //floatVideo: true,\\n blockRules: blockRules\\n }\\n});\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"u\",\"path\":\"u\",\"rule\":\"$.exports = function(rule, origin) {\\n return $.toString((rule, origin) => {\\n let host = origin.replace(new RegExp(\\\"http://|https://\\\"), \\\"\\\").split(\\\"/\\\")[0];\\n let hosts = host.split(\\\".\\\");\\n if (hosts.length > 2) {\\n host = hosts[hosts.length - 2] + \\\".\\\" + hosts[hosts.length - 1];\\n }\\n if (input.startsWith(\\\"magnet\\\")) {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"检测到新的磁链地址,点击确定按钮即可播放,点击取消按钮可以复制链接\\\",\\n confirm: $.toString((mag) => {\\n return mag;\\n }, input),\\n cancel: $.toString((mag) => {\\n return \\\"copy://\\\" + mag\\n }, input)\\n })\\n return true;\\n } else if ((!input.includes(host) && input.startsWith(\\\"http\\\")) || input.includes(\\\"/play\\\") || (input.includes(\\\"/thread-\\\") && !origin.includes(\\\"/thread-\\\"))) {\\n log(input);\\n return $.toString((url, rule) => {\\n //跳网页\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"详情\\\",\\n url: \\\"hiker://page/ysfx?rule=\\\" + rule + \\\"&r=\\\" + rule + \\\"##\\\" + url,\\n }))\\n }, input, rule);\\n } else if (!input.startsWith(\\\"http\\\")) {\\n log(input);\\n //能唤起APP的白名单\\n let white = [\\n \\\"qklink\\\",\\n \\\"bdnetdisk\\\",\\n \\\"xunleiapp\\\"\\n ];\\n let inWhite = white.filter(it => input.startsWith(it)).length > 0;\\n if (!inWhite) {\\n return false;\\n }\\n return $.toString((url, rule) => {\\n fy_bridge_app.openThirdApp && fy_bridge_app.openThirdApp(url);\\n }, input, rule)\\n } else {\\n\\n }\\n }, rule, origin);\\n}\"}]","proxy":"","icon":"https://www.52pojie.cn/favicon.ico"},{"last_chapter_rule":"","title":"热榜","author":"小棉袄🌞","version":3,"type":"other","url":"hiker://empty##","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nvar d = [];\nlet url = \"https://rebang.today/\";\nd.push({\n col_type: \"x5_webview_single\",\n url: url,\n desc: \"float&&100%\",\n title: \"\",\n extra: {\n blockRules: [\"/ad/\", \"/ads/\", \"google\", \"/sh/to/\"],\n canBack: true,\n urlInterceptor: $.toString((my) => {\n if (input.startsWith(my)) {\n return false;\n }\n return $.toString((url) => {\n fy_bridge_app.open(JSON.stringify({\n title: \"详情\",\n url: \"hiker://empty\",\n findRule: \"js:\" + $$$.toString((u) => {\n let js = $.toString(() => {\n try {\n if (document.title && document.title.length) {\n let r = $$$().lazyRule((t) => {\n setPageTitle(t);\n }, document.title);\n fy_bridge_app.parseLazyRule(r);\n }\n } catch (e) {\n fy_bridge_app.log(e.toString());\n }\n });\n setResult([{\n url: u,\n col_type: \"x5_webview_single\",\n extra: {\n canBack: true,\n js: js,\n blockRules: [\"/ad/\", \"/ads/\", \"google\", \"/sh/to/\"]\n },\n desc: \"100%&&float\"\n }]);\n }, url)\n }))\n }, input)\n }, url)\n }\n});\n\nsetResult(d);","searchFind":"","search_url":"","group":"①推荐","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[]","proxy":"","icon":""},{"last_chapter_rule":"js:\neval(JSON.parse(request(\"hiker://page/main\")).rule);\nlet type = getParam('type', ''),\n id = getParam('id', ''),\n title = getParam('title', '');\nlet res = getDoubanRes(\"https://frodo.douban.com/api/v2/\" + type + \"/\" + id);\nlet update = \"\";\nif (title == '') {\n let length = res.vendors.length;\n update += length > 0 ? '共' + length + '个片源' : '暂无片源';\n if (length > 0) {\n let e = res.vendors[0];\n update += e.episodes_info ? \"|\" + e.episodes_info : \"\";\n }\n} else {\n for (let e of res.vendors) {\n if (e.title == title) {\n update += e.episodes_info ? e.episodes_info : \"\";\n break;\n }\n }\n}\nsetResult(update);","title":"青豆","author":"Joker&&Reborn","version":31,"type":"video","url":"hiker://empty##fypage","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nlet forceUrgencyMode = 0\nif (forceUrgencyMode) {\n let e = '当前为强制急救模式'\n let pos = '急救模式'\n eval(JSON.parse(request(\"hiker://page/urgencyMode\")).rule)\n} else {\n try {\n eval(JSON.parse(request(\"hiker://page/main\")).rule);\n home();\n } catch (e) {\n let pos = \"首页\";\n eval(JSON.parse(request(\"hiker://page/urgencyMode\")).rule)\n }\n}","searchFind":"js:\ntry {\n eval(JSON.parse(request(\"hiker://page/main\")).rule);\n search();\n} catch (e) {\n let pos = \"搜索页\";\n eval(JSON.parse(request(\"hiker://page/urgencyMode\")).rule)\n}","search_url":"hiker://empty/$page{fypage}/#/**","titleColor":"","group":"①推荐","detail_col_type":"movie_1_vertical_pic","detail_find_rule":"js:\ntry {\n eval(JSON.parse(request(\"hiker://page/main\")).rule);\n erji();\n} catch (e) {\n let pos = \"二级页面\";\n eval(JSON.parse(request(\"hiker://page/urgencyMode\")).rule)\n}","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"let file = \"hiker://files/rules/joker/qdb_config.js\";\nlet bakfile = \"hiker://files/rules/joker/qdb_config.js.bak\";\ntry {\n let defaultConfigs = $.require(\"hiker://page/defaultConfigs?rule=青豆\");\n if (!fileExist(file)) {\n writeFile(file, JSON.stringify(defaultConfigs));\n }else{\n try{\n let config = JSON.parse(fetch(file));\n config.detailsViewConfigs[\"默认\"] = defaultConfigs.detailsViewConfigs[\"默认\"];\n config.homePageConfigs[\"默认\"] = defaultConfigs.homePageConfigs[\"默认\"];\n writeFile(file, JSON.stringify(config));\n }catch(e){\n writeFile(bakfile, fetch(file));\n writeFile(file, JSON.stringify(defaultConfigs));\n }\n }\n putMyVar(\"qdb_config\", file);\n} catch (e) {\n let pos = \"预处理\";\n eval(JSON.parse(request(\"hiker://page/urgencyMode?rule=青豆\")).rule)\n}","pages":"[{\"col_type\":\"movie_3\",\"name\":\"配置编辑界面\",\"path\":\"setting-editor\",\"rule\":\"js:\\n/**\\n * 通过传入 params 对象生成编辑界面\\n * @param d 视界 setResult 用的列表\\n * @param configKey config 的 key 值,比如我要拿 config.detailsViewConfigs,configKey 就传 \\\"detailsViewConfigs\\\"\\n * @param params 编辑界面的配置\\n *\\n * 【params对象数据示例】\\n * {\\n key: \\\"input_name\\\",\\n desc: \\\"请输入名称\\\",\\n type: 'textarea',\\n data: {\\n config: {\\n key: \\\"input_code\\\",\\n desc: \\\"请输入输入配置\\\",\\n type: 'textarea'\\n },\\n }\\n }\\n */\\nfunction modeEditPage(d, configKey, params) {\\n addListener('onClose', $.toString((params) => {\\n clearMyVar(params.key)\\n let datas = params.data;\\n let dataKeys = Object.keys(datas);\\n for (let i in dataKeys) {\\n let dataKey = dataKeys[i]\\n clearMyVar(datas[dataKey].key)\\n }\\n }, params))\\n d.push({\\n title: \\\"保存\\\",\\n desc: params.desc,\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getMyVar(params.key, \\\"\\\"),\\n type: params.type ? params.type : '',\\n onChange: 'putMyVar(\\\"' + params.key + '\\\", input)'\\n }\\n })\\n let datas = params.data;\\n let dataKeys = Object.keys(datas);\\n for (let dataKey of dataKeys) {\\n let data = datas[dataKey]\\n d.push({\\n title: \\\"保存\\\",\\n desc: data.desc,\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getMyVar(data.key, \\\"\\\"),\\n type: data.type ? data.type : '',\\n height: 5,\\n highlight: true,\\n onChange: 'putMyVar(\\\"' + data.key + '\\\", input)'\\n }\\n })\\n }\\n d.push({\\n title: '保存',\\n col_type: 'text_center_1',\\n url: $('hiker://empty#noLoading#').lazyRule((configKey, params) => {\\n let config = JSON.parse(request(getMyVar('qdb_config')))\\n let name = getMyVar(params.key, \\\"\\\");\\n if(name == '默认') return 'toast://默认配置无法编辑'\\n config[configKey].use = name\\n if (!config[configKey][name]) config[configKey][name] = {}\\n let datas = params.data;\\n let dataKeys = Object.keys(datas);\\n for (let i in dataKeys) {\\n let dataKey = dataKeys[i]\\n let data = datas[dataKey]\\n config[configKey][name][dataKey] = getMyVar(data.key, \\\"\\\");\\n }\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config))\\n back();\\n return 'toast://保存成功'\\n }, configKey, params)\\n })\\n}\\n\\n//自定义首页-配置编辑页面\\nfunction homePageModeEditPage(d) {\\n d.push({\\n title: '<font color=\\\"red\\\">' + '返回数组,供setResult使用' + '</font>' + '<font color=\\\"#808080\\\"><br>' + '【内置函数】' + '<br>&nbsp;&nbsp;&nbsp;hiker://page/settingPage: 设置页(默认首页有使用示例)' + '</font>',\\n col_type: 'rich_text'\\n })\\n modeEditPage(d, \\\"homePageConfigs\\\", {\\n key: \\\"input_name\\\",\\n desc: \\\"请输入名称\\\",\\n // type: 'input'\\n data: {\\n config: {\\n key: \\\"input_code\\\",\\n desc: \\\"请输入配置代码\\\",\\n type: 'textarea'\\n }\\n }\\n })\\n}\\n\\n//自定义详情页面-配置编辑页面\\nfunction detailViewModeEditPage(d) {\\n d.push({\\n title: '<font color=\\\"#808080\\\">' + '【内置变量】' + '<br>&nbsp;&nbsp;&nbsp;id: 片单id' + '<br>&nbsp;&nbsp;&nbsp;type: 片单类型' + '<br>&nbsp;&nbsp;&nbsp;title: 片单标题' + '</font>',\\n col_type: 'rich_text'\\n })\\n modeEditPage(d, \\\"detailsViewConfigs\\\", {\\n key: \\\"input_name\\\",\\n desc: \\\"请输入名称\\\",\\n // type: 'input'\\n data: {\\n config: {\\n key: \\\"input_code\\\",\\n desc: \\\"请输入配置代码\\\",\\n type: 'textarea'\\n },\\n setting: {\\n key: \\\"input_setting_code\\\",\\n desc: \\\"请输入设置页面代码\\\",\\n type: 'textarea'\\n }\\n }\\n })\\n}\\n\\n//自定义解析-编辑页面\\nfunction analysisModeEditPage(d) {\\n d.push({\\n title: '<font color=\\\"#808080\\\">' + '【解析代码内置变量】' + '<br>&nbsp;&nbsp;&nbsp;input: 视频链接' + '</font>',\\n col_type: 'rich_text'\\n })\\n modeEditPage(d, \\\"analysisConfigs\\\", {\\n key: \\\"input_name\\\",\\n desc: \\\"请输入名称\\\",\\n // type: 'input'\\n data: {\\n config: {\\n key: \\\"input_code\\\",\\n desc: \\\"请输入解析代码\\\",\\n type: 'textarea'\\n },\\n extra: {\\n key: 'input_extra',\\n desc: '请输入extra属性值',\\n type: 'textarea'\\n },\\n setting: {\\n key: \\\"input_setting_code\\\",\\n desc: \\\"请输入设置页面代码\\\",\\n type: 'textarea'\\n }\\n }\\n })\\n}\\n\\nlet d = [];\\nlet view = getParam(\\\"view\\\",\\\"\\\");\\nif(view==\\\"analysisModeEditPage\\\"){\\n setPageTitle(\\\"自定义解析编辑\\\")\\n analysisModeEditPage(d);\\n}else if(view==\\\"detailViewModeEditPage\\\"){\\n setPageTitle(\\\"自定义详情页编辑\\\")\\n detailViewModeEditPage(d);\\n}else if(view==\\\"homePageModeEditPage\\\"){\\n setPageTitle(\\\"自定义首页编辑\\\")\\n homePageModeEditPage(d);\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"解除被封ip\",\"path\":\"releaseIP\",\"rule\":\"js:\\nlet id = getParam('id');\\nlet d = [];\\nd.push({\\n title: '您已被封禁IP地址或触发了人机验证,请按照以下步骤处理(如不处理您将在一段时间内无法正常获取剧集列表)',\\n url: 'hiker://empty',\\n col_type: 'text_1'\\n});\\nd.push({\\n title: '1.点击此处导入自动获取Cookie插件',\\n url: $()\\n .lazyRule(() => {\\n let getDoubanCookie = \\\"(function(){if(window['location']['host']=='www.douban.com'){fy_bridge_app['writeFile']('hiker://files/cache/doubancookie.txt',fy_bridge_app['getCookie']('https://www.douban.com/'));}if(window['location']['host']=='m.douban.com'){fy_bridge_app['writeFile']('hiker://files/cache/doubancookie.txt',fy_bridge_app['getCookie']('https://m.douban.com/'));}}());\\\"\\n if (!fileExist('hiker://files/cache/global_getDoubanCookie.js')) {\\n writeFile('hiker://files/cache/global_getDoubanCookie.js', getDoubanCookie);\\n };\\n return 'rule://' + base64Encode('海阔视界,网页插件¥js_url¥global_getDoubanCookie@hiker://files/cache/global_getDoubanCookie.js');\\n }),\\n col_type: 'text_1'\\n});\\nd.push({\\n title: '2.点击此处进入网页进行登录或人机验证,完成后返回此页面',\\n url: 'https://movie.douban.com/subject/' + id + '/',\\n col_type: 'text_1'\\n});\\nd.push({\\n title: '3.完成登录或人机验证后返回影片详情页面重新进入',\\n url: 'hiker://empty',\\n col_type: 'text_1'\\n});\\nsetResult(d)\"},{\"col_type\":\"movie_3\",\"name\":\"抢救页面\",\"path\":\"urgencyMode\",\"rule\":\"js:\\nlet d = [];\\n\\nd.push({\\n title: '很明显,出了一些小问题,建议查看设置',\\n desc: \\\"出错位置:\\\" + (typeof(pos) == 'undefined' ? '未知' : pos),\\n col_type: 'text_center_1',\\n url: 'hiker://empty',\\n});\\n\\nd.push({\\n title: '点我进入设置页',\\n col_type: 'text_1',\\n url: \\\"hiker://page/settingPage\\\"\\n})\\n\\nd.push({\\n title: '若修改设置不起作用,点我复制错误信息提交给开发者',\\n desc: e.toString(),\\n col_type: 'text_1',\\n url: 'copy://' + e.toString(),\\n});\\n\\nsetResult(d);\\n\"},{\"col_type\":\"movie_3\",\"name\":\"顺佬专用详情页\",\"path\":\"Sdetail\",\"rule\":\"js:\\neval(MY_RULE.preRule);\\neval(JSON.parse(request(\\\"hiker://page/main\\\")).rule);\\nlet type = getParam('type', ''),\\n id = getParam('id', '');\\ndetailsView(type, id);\"},{\"col_type\":\"movie_3\",\"name\":\"主代码\",\"path\":\"main\",\"rule\":\"let version = 202402170001;\\r\\neval(JSON.parse(request('hiker://page/utils')).rule);\\r\\n\\r\\nlet parseVideoUrlLazy = $.toString(() => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n let analysisConfigs = getConfig('analysisConfigs');\\r\\n let analysisConfig = analysisConfigs[analysisConfigs.use].config;\\r\\n let result = \\\"toast://解析失败\\\";\\r\\n try {\\r\\n if (analysisConfig.startsWith(\\\"(\\\")) {\\r\\n eval('result = ' + analysisConfig);\\r\\n } else {\\r\\n eval('result = ' + '(() => {' + analysisConfig + '})()');\\r\\n }\\r\\n } catch (e) {}\\r\\n return result;\\r\\n})\\r\\n\\r\\n//首页\\r\\nfunction home() {\\r\\n if (getItem(\\\"start\\\", \\\"\\\") == \\\"\\\") {\\r\\n setItem(\\\"start\\\", \\\"1\\\");\\r\\n setItem('update', String(version));\\r\\n confirm({\\r\\n title: '温馨提示',\\r\\n content: '此规则仅限学习交流使用\\\\n请于导入后24小时内删除!\\\\n\\\\n任何组织或个人不得以任何方式方法\\\\n传播此规则的整体或部分!!\\\\n\\\\n感谢大佬们提供的技术支持!!!',\\r\\n confirm: '',\\r\\n cancel: ''\\r\\n })\\r\\n } else {\\r\\n let updateInfo = getItem('update', '');\\r\\n if (updateInfo == '' || parseInt(updateInfo) < version) {\\r\\n setItem('update', String(version));\\r\\n confirm({\\r\\n title: '本次更新内容',\\r\\n content: '降低配置文件出错概率',\\r\\n confirm: '',\\r\\n cancel: ''\\r\\n })\\r\\n }\\r\\n }\\r\\n addListener(\\\"onClose\\\", $.toString(() => {\\r\\n clearMyVar(\\\"qdb_config\\\");\\r\\n }))\\r\\n let homePageConfigs = getConfig('homePageConfigs');\\r\\n let homePageConfig = homePageConfigs[homePageConfigs.use].config;\\r\\n if (homePageConfig.startsWith(\\\"(\\\")) {\\r\\n eval('d = ' + homePageConfig)\\r\\n } else {\\r\\n eval('d = ' + '(() => {' + homePageConfig + '})()')\\r\\n }\\r\\n setResult(d);\\r\\n}\\r\\n\\r\\n//海阔搜索\\r\\nfunction search() {\\r\\n let wd = MY_URL.split(\\\"/#/\\\")[1];\\r\\n let page = MY_PAGE;\\r\\n let s = getDoubanRes('https://frodo.douban.com/api/v2/search/subjects?type=movie&q=' + wd + (page ? '&start=' + (page - 1) * 20 : '&start=0') + '&count=20');\\r\\n\\r\\n let list = s.items;\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n\\r\\n let items = [];\\r\\n list.forEach(data => {\\r\\n if (data.target_type == 'doulist_cards') {\\r\\n data.target.doulists.forEach(e => {\\r\\n items.push({\\r\\n title: e.title,\\r\\n url: $('hiker://empty/$page{fypage}#noHistory#')\\r\\n .rule((type, id) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else if (type == \\\"collection\\\" || type == \\\"chart\\\") {\\r\\n subjectCollectionList(MY_PAGE, 50, id);\\r\\n }\\r\\n }, e.target_type, e.id),\\r\\n img: e.cover_url + \\\"@Referer=\\\" + e.cover_url\\r\\n })\\r\\n })\\r\\n } else if (data.target_type == 'chart') {\\r\\n let e = data.target;\\r\\n items.push({\\r\\n title: e.title,\\r\\n url: $('hiker://empty/$page{fypage}#noHistory#')\\r\\n .rule((type, id) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else if (type == \\\"collection\\\" || type == \\\"chart\\\") {\\r\\n subjectCollectionList(MY_PAGE, 50, id);\\r\\n }\\r\\n }, data.target_type, e.id),\\r\\n img: e.cover_url + \\\"@Referer=\\\" + e.cover_url\\r\\n })\\r\\n } else {\\r\\n let type = data.target_type,\\r\\n id = data.target.id,\\r\\n title = data.target.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id)\\r\\n .rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n items.push({\\r\\n title: title,\\r\\n img: data.target.cover_url + \\\"@Referer=\\\" + data.target.cover_url,\\r\\n desc: data.type_name,\\r\\n content: data.target.card_subtitle,\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra\\r\\n });\\r\\n }\\r\\n\\r\\n });\\r\\n\\r\\n setSearchResult({\\r\\n data: items\\r\\n });\\r\\n}\\r\\n\\r\\n//二级页面\\r\\nfunction erji() {\\r\\n addListener(\\\"onClose\\\", $.toString(() => {\\r\\n clearMyVar(\\\"findList\\\");\\r\\n clearMyVar(\\\"hotList\\\");\\r\\n clearMyVar(\\\"classlist\\\");\\r\\n clearMyVar(\\\"playlist\\\");\\r\\n clearMyVar(\\\"rankList\\\");\\r\\n clearMyVar(\\\"ranking\\\");\\r\\n clearMyVar(\\\"coming\\\");\\r\\n clearMyVar(\\\"analysis\\\");\\r\\n }))\\r\\n\\r\\n let choice = MY_URL.split('/#/')[1].split('#')[0];\\r\\n let d = [];\\r\\n switch (choice) {\\r\\n case \\\"推荐\\\":\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n d = findList(MY_PAGE, 10);\\r\\n break;\\r\\n case \\\"热门\\\":\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n d = hotList(MY_PAGE, 10);\\r\\n break;\\r\\n case \\\"分类\\\":\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n d = classList(MY_PAGE, 15);\\r\\n break;\\r\\n case \\\"片单\\\":\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n d = playList(MY_PAGE, 10);\\r\\n break;\\r\\n case \\\"榜单\\\":\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n d = rankList(MY_PAGE, 10);\\r\\n break;\\r\\n case \\\"将上映\\\":\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n d = comingList(MY_PAGE, 10);\\r\\n break;\\r\\n }\\r\\n setResult(d);\\r\\n}\\r\\n\\r\\n//获取豆瓣资源,返回json数据\\r\\nfunction getDoubanRes(url) {\\n //log(url)\\r\\n var cc =null;\\r\\n if($.type(url)=='object'){\\r\\n cc=url.cc;\\r\\n url = url.url;\\r\\n }\\r\\n var _url = url;\\r\\n if (url.indexOf('apikey') === -1) {\\r\\n _url += (url.indexOf('?') === -1 ? '?' : '&') + \\\"apikey=0dad551ec0f84ed02907ff5c42e8ec70\\\"\\r\\n }\\r\\n let _ts = parseInt(Date.now()/1000).toString();\\r\\n let m = 'GET&' + encodeURIComponent(url.split('douban.com')[1].split('?')[0]) + '&' + _ts;\\r\\n eval(getCryptoJS());\\r\\n let _sig = hexToBase64(CryptoJS.HmacSHA1(m,'bf7dddc7c9cfe6f7').toString());\\r\\n _url += '&_sig=' + _sig +'&_ts=' + _ts;\\r\\n //let cookieCache = 'hiker://files/cache/doubancookie.txt';\\r\\n let s = fetch(_url, {\\r\\n headers: {\\r\\n //'Cookie': fetch(cookieCache),\\r\\n \\\"User-Agent\\\": \\\"Rexxar-Core/0.1.3 api-client/1 com.douban.frodo/7.9.0.beta2(215) Android/25 product/TAS-AL00 vendor/HUAWEI model/TAS-AL00 rom/android network/wifi platform/mobile com.douban.frodo/7.9.0.beta2(215) Rexxar/1.2.151 platform/mobile 1.2.151\\\"\\r\\n },\\r\\n method: 'GET'\\r\\n //body: 'host=frodo.douban.com'\\r\\n });\\r\\n let json = JSON.parse(s);\\r\\n if(json.localized_message){\\r\\n cc= cc==null ? 1 : cc+1;\\r\\n log('重试次数:'+cc);\\r\\n if(cc>5){throw new Error('超时')}\\r\\n java.lang.Thread.sleep(1000);\\r\\n return getDoubanRes({url:url,cc:cc});\\r\\n }else{\\r\\n return json;\\r\\n }\\r\\n}\\r\\n\\r\\n//根据评分信息获取评分星星样式\\r\\nfunction computeRating(e, t) {\\r\\n let i = \\\"\\\";\\r\\n for (let r = 0; r < 5; r++) r < Math.round(t / (e / 5)) ? i += \\\"★\\\" : i += \\\"☆\\\";\\r\\n return i;\\r\\n}\\r\\n\\r\\n//评分详情页面\\r\\nfunction rating(type, id, ratingCount) {\\r\\n setPageTitle('影片信息');\\r\\n //评分统计\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/rating\\\");\\r\\n\\r\\n let r = \\\"<h2>评分统计</h2>\\\";\\r\\n\\r\\n r += '<small><font color=\\\"grey\\\">' + ratingCount + '人评分' + '</font></small><br/>';\\r\\n\\r\\n let starColor = getConfig('starColor');\\r\\n if (i.stats.length == 0) {\\r\\n i.stats = [0, 0, 0, 0, 0];\\r\\n }\\r\\n i.stats.reverse().forEach(((value, index) => {\\r\\n r += '<font color=' + starColor + '>' + [\\\"★★★★★\\\", \\\"★★★★☆\\\", \\\"★★★☆☆\\\", \\\"★★☆☆☆\\\", \\\"★☆☆☆☆\\\"][index] + \\\"</font>&nbsp;\\\";\\r\\n\\r\\n r += function(e) {\\r\\n let t1 = '';\\r\\n for (let i = 0; i < e; i++) t1 += \\\"▇\\\";\\r\\n let t2 = '';\\r\\n for (let i = 0; i < 10 - e; i++) t2 += \\\"▇\\\";\\r\\n return t1.fontcolor('#ffac2d') + t2.fontcolor('#e5e1e4');\\r\\n }((10 * value).toFixed(0));\\r\\n\\r\\n r += '&nbsp;<small><font color=\\\"grey\\\">' + (100 * value)\\r\\n .toFixed(1) + \\\"%</font></small><br/>\\\";\\r\\n }));\\r\\n\\r\\n r += [i.done_count ? i.done_count + \\\"人看过\\\" : \\\"\\\", i.doing_count ? i.doing_count + \\\"人在看\\\" : \\\"\\\", i.wish_count ? i.wish_count + \\\"人想看\\\" : \\\"\\\"].join(\\\"&nbsp;&nbsp;\\\")\\r\\n .small()\\r\\n .fontcolor('grey');\\r\\n //影片信息\\r\\n i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/desc\\\");\\r\\n let l = i.html.replace(/[\\\\n\\\\t\\\\r]/g, \\\"\\\")\\r\\n .replace(/<td\\\\s*[^>]*>(.*?)<\\\\/td>/g, \\\"<span>$1</span>\\\")\\r\\n .replace(/<tr\\\\s*[^>]*>(.*?)<\\\\/tr>/g, \\\"<teng>$1</teng><br/>\\\");\\r\\n parseDomForArray(l, \\\"section&&teng\\\").forEach((e => {\\r\\n let t = parseDomForArray(e, \\\"span\\\");\\r\\n l = l.replace(t[0], '<font color=\\\"grey\\\">' + t[0].replace(/<span\\\\s*[^>]*>(.*?)<\\\\/span>/g, \\\"$1\\\") + \\\":</font>\\\")\\r\\n }));\\r\\n r += l;\\r\\n //获奖记录\\r\\n let page = MY_PAGE;\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/awards?start=\\\" + 20 * (page - 1) + \\\"&count=20\\\");\\r\\n r += \\\"<h2>获奖记录\\\" + '<small><font color=\\\"grey\\\">' + (s.total != 0 ? '(共' + s.total + '项)' : '(暂无)') + '</font></small>' + \\\"</h2>\\\";\\r\\n //r += '<font color=\\\"grey\\\">' + (s.total != 0 ? '共' + s.total + '项' : '暂无') + '</font><br/>';\\r\\n let r2 = '';\\r\\n s.awards.forEach(e => {\\r\\n r2 += (e.ceremony.title + '(' + e.ceremony.year + ')').big().bold() + '<small>(<a href=\\\"hiker://empty#noHistory#@rule=js:eval(JSON.parse(fetch(`hiker://page/main`)).rule);awardView(`' + e.ceremony.id + '`,`' + e.ceremony.title + '`);\\\">查看详情</a>)</small>' + '<br/>';\\r\\n e.categories.forEach(item => {\\r\\n r2 += (item.category.title + (item.is_won ? '' : '(提名)') + '&nbsp;').fontcolor(\\\"grey\\\");\\r\\n r2 += item.celebrities.map(celebrity => celebrity.name).join('&nbsp;/&nbsp;');\\r\\n r2 += '<br/>';\\r\\n })\\r\\n r2 += '<br/>';\\r\\n })\\r\\n\\r\\n if (page == 1) {\\r\\n setHomeResult({\\r\\n data: [{\\r\\n title: r + r2,\\r\\n col_type: \\\"rich_text\\\"\\r\\n }]\\r\\n })\\r\\n } else if(s.awards.length == 0){\\r\\n setResult([]);\\r\\n } else{\\r\\n setHomeResult({\\r\\n data: [{\\r\\n title: r2,\\r\\n col_type: \\\"rich_text\\\"\\r\\n }]\\r\\n })\\r\\n }\\r\\n}\\r\\n\\r\\n//奖项详情页面\\r\\nfunction awardView(id, name) {\\r\\n setPageTitle(name);\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/ceremony/\\\" + id);\\r\\n let a = [];\\r\\n a.push({\\r\\n title: '““””' + (s.title + '(' + s.year + ')').big().bold(),\\r\\n col_type: 'text_1',\\r\\n extra: {\\r\\n lineVisible: false\\r\\n }\\r\\n })\\r\\n s.playlists.forEach(e => {\\r\\n a.push({\\r\\n title: e.title,\\r\\n desc: '共' + e.items_count + '部',\\r\\n img: e.cover_url + '@Referer=' + e.cover_url,\\r\\n url: $('hiker://empty#noHistory#').rule((id) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n douList(id);\\r\\n }, e.id)\\r\\n })\\r\\n })\\r\\n\\r\\n let r = '';\\r\\n s.prizes.forEach(e => {\\r\\n r += '<h4>获奖名单(' + e.title + ')</h4>';\\r\\n e.categories.forEach(t => {\\r\\n r += (t.title + '&nbsp;&nbsp;&nbsp;&nbsp;').fontcolor(\\\"grey\\\").bold();\\r\\n r += t.results.map(item => !!item.info ? item.info + ('&nbsp;-&nbsp;' + item.title + '&nbsp;&nbsp;').fontcolor(\\\"grey\\\") : item.title).join('&nbsp;/&nbsp;').bold();\\r\\n r += '<br/>';\\r\\n })\\r\\n })\\r\\n a.push({\\r\\n title: r,\\r\\n col_type: 'rich_text'\\r\\n })\\r\\n\\r\\n let i = [];\\r\\n s.ceremonies.forEach(e => {\\r\\n i.push({\\r\\n title: e.title,\\r\\n desc: e.year + '年',\\r\\n col_type: 'movie_3',\\r\\n img: e.pic.normal + '@Referer=' + e.pic.normal,\\r\\n url: $('hiker://empty#noHistory#').rule((id, name) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n awardView(id, name);\\r\\n }, e.id, e.title)\\r\\n })\\r\\n })\\r\\n if (i.length > 0) {\\r\\n i.unshift({\\r\\n title: '““””' + '历届回顾'.big().bold(),\\r\\n col_type: 'text_1',\\r\\n extra: {\\r\\n lineVisible: false\\r\\n }\\r\\n })\\r\\n }\\r\\n\\r\\n setResult(a.concat(i));\\r\\n}\\r\\n\\r\\n//剧照页面\\r\\nfunction stillsList(type, id) {\\r\\n addListener('onClose', 'clearMyVar(\\\"photo\\\")');\\r\\n let page = MY_PAGE;\\r\\n let items = {\\r\\n 剧照: 'photos',\\r\\n 海报: 'covers'\\r\\n };\\r\\n let a = [];\\r\\n let temp = getMyVar('photo', 'photos');\\r\\n let color = getConfig('chooseColor');\\r\\n for (let i in items) {\\r\\n a.push({\\r\\n title: temp == items[i] ? '““””' + i.fontcolor(color) : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty').lazyRule((t) => {\\r\\n putMyVar('photo', t);\\r\\n refreshPage();\\r\\n return 'hiker://empty';\\r\\n }, items[i])\\r\\n })\\r\\n }\\r\\n\\r\\n let r = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/\\\" + temp + \\\"?start=\\\" + 30 * (page - 1) + \\\"&count=30\\\");\\r\\n let l = r.photos.map((e => ({\\r\\n title: e.create_time,\\r\\n img: e.image.small.url + \\\"@Referer=\\\" + e.image.small.url,\\r\\n url: e.image.large.url + \\\"?type=.jpg@Referer=\\\" + e.image.large.url + \\\"?type=.jpg\\\",\\r\\n col_type: \\\"pic_2\\\"\\r\\n })));\\r\\n\\r\\n if (page == 1) {\\r\\n l.unshift({\\r\\n col_type: \\\"blank_block\\\"\\r\\n });\\r\\n if (temp == 'photos') {\\r\\n l.unshift({\\r\\n title: \\\"<big>共<strong> \\\" + r.total + ' </strong>张剧照</big><br/><small><font color=\\\"grey\\\">官方剧照:' + r.o + \\\"张&nbsp;截图:\\\" + r.c + \\\"张&nbsp;工作照:\\\" + r.w + \\\"张&nbsp;新闻图片:\\\" + r.n + \\\"张&nbsp;粉丝图片:\\\" + r.f + \\\"张</font></small>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n } else {\\r\\n l.unshift({\\r\\n title: \\\"<big>共<strong> \\\" + r.total + \\\"</strong>张海报</big>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n }\\r\\n l = a.concat(l);\\r\\n }\\r\\n setHomeResult({\\r\\n data: l\\r\\n })\\r\\n}\\r\\n\\r\\n//演职人员页面\\r\\nfunction credits(type, id) {\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/credits\\\");\\r\\n let r = [];\\r\\n i.credits.forEach((e => {\\r\\n r.push({\\r\\n title: e.title,\\r\\n col_type: \\\"rich_text\\\"\\r\\n });\\r\\n e.celebrities.forEach((e => {\\r\\n r.push({\\r\\n title: e.name + \\\"\\\\n\\\" + e.latin_name,\\r\\n desc: e.character,\\r\\n img: e.avatar.normal + \\\"@Referer=\\\" + e.avatar.normal,\\r\\n col_type: 'movie_1_vertical_pic',\\r\\n url: $('hiker://empty#noHistory##immersiveTheme#').rule((e) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n elessarView(e.uri.split(\\\"subject_id=\\\")[1], e.id, e.name);\\r\\n }, e)\\r\\n })\\r\\n }))\\r\\n }));\\r\\n setHomeResult({\\r\\n data: r\\r\\n })\\r\\n}\\r\\n\\r\\n//短评页面\\r\\nfunction shortCommentList(type, id) {\\r\\n addListener('onClose', \\\"clearMyVar('shortcomment')\\\");\\r\\n let items = {\\r\\n 热门: 'hot',\\r\\n 最新: 'latest'\\r\\n }\\r\\n let u = getMyVar('shortcomment', 'hot');\\r\\n let a = [];\\r\\n let chooseColor = getConfig('chooseColor') // || \\\"#FA7298\\\";\\r\\n for (i in items) {\\r\\n a.push({\\r\\n title: u === items[i] ? '““””<b> <font color=' + chooseColor + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty').lazyRule((t) => {\\r\\n putMyVar(\\\"shortcomment\\\", t);\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, items[i])\\r\\n })\\r\\n }\\r\\n\\r\\n let page = MY_PAGE;\\r\\n let r = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/interests?start=\\\" + 30 * (page - 1) + \\\"&count=30&order_by=\\\" + u);\\r\\n let l = [];\\r\\n let starColor = getConfig('starColor');\\r\\n r.interests.forEach((e => {\\r\\n let t = \\\"\\\";\\r\\n if (e.rating) {\\r\\n t = computeRating(e.rating.max, e.rating.value);\\r\\n }\\r\\n l.push({\\r\\n title: e.user.name,\\r\\n img: e.user.avatar,\\r\\n url: e.user.url,\\r\\n col_type: \\\"avatar\\\"\\r\\n });\\r\\n l.push({\\r\\n title: e.comment + (t ? '<br/><small>看过 <font color=' + starColor + '>' + t + \\\"</font></small>\\\" : \\\"\\\") + '<br/><small><font color=\\\"grey\\\">' + e.vote_count + \\\"赞•\\\" + /\\\\d{4}-\\\\d{1,2}-\\\\d{1,2}/g.exec(e.create_time) + \\\"</font></small>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n });\\r\\n l.push({\\r\\n col_type: \\\"line\\\"\\r\\n })\\r\\n }));\\r\\n\\r\\n if (page == 1) {\\r\\n l.unshift({\\r\\n col_type: \\\"blank_block\\\"\\r\\n });\\r\\n l.unshift({\\r\\n title: \\\"<big>共<strong> \\\" + r.total + \\\" </strong>条短评</big>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n });\\r\\n setHomeResult({\\r\\n data: a.concat(l)\\r\\n })\\r\\n } else {\\r\\n setHomeResult({\\r\\n data: l\\r\\n })\\r\\n }\\r\\n}\\r\\n\\r\\n//剧评页面\\r\\nfunction dramaReviewList(type, id) {\\r\\n addListener('onClose', \\\"clearMyVar('dramareview')\\\");\\r\\n let items = {\\r\\n 热门: 'hot',\\r\\n 最新: 'latest'\\r\\n }\\r\\n let u = getMyVar('dramareview', 'hot');\\r\\n let a = [];\\r\\n let chooseColor = getConfig('chooseColor');\\r\\n for (i in items) {\\r\\n a.push({\\r\\n title: u === items[i] ? '““””<b> <font color=' + chooseColor + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty').lazyRule((t) => {\\r\\n putMyVar(\\\"dramareview\\\", t);\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, items[i])\\r\\n })\\r\\n }\\r\\n\\r\\n let page = MY_PAGE\\r\\n let r = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/reviews?start=\\\" + 15 * (page - 1) + \\\"&count=15&order_by=\\\" + u);\\r\\n let l = [];\\r\\n let starColor = getConfig('starColor');\\r\\n r.reviews.forEach((e => {\\r\\n let t = \\\"\\\";\\r\\n if (e.rating) {\\r\\n t = computeRating(e.rating.max, e.rating.value);\\r\\n }\\r\\n let i = e.comments_count ? e.comments_count + \\\"回复\\\" : \\\"\\\",\\r\\n r = e.useful_count ? e.useful_count + \\\"有用\\\" : \\\"\\\",\\r\\n o = e.reshares_count ? e.reshares_count + \\\"转发\\\" : \\\"\\\";\\r\\n\\r\\n r = i && r ? \\\"•\\\" + r : r;\\r\\n o = (i || r) && o ? \\\"•\\\" + o : o;\\r\\n l.push({\\r\\n title: e.user.name,\\r\\n img: e.user.avatar,\\r\\n url: e.user.url,\\r\\n col_type: \\\"avatar\\\"\\r\\n })\\r\\n l.push({\\r\\n title: \\\"<strong>\\\" + e.title + \\\"</strong><br/>\\\" + e.abstract + ' <small>(<a href=\\\"hiker://empty#noHistory#@rule=js:eval(JSON.parse(fetch(`hiker://page/main`)).rule);dramaReviewView(' + e.id + ')\\\">更多</a>)</small>' + (t ? '<br/><small>看过 <font color=' + starColor + '>' + t + \\\"</font></small>\\\" : \\\"\\\") + '<br/><small><font color=\\\"grey\\\">' + i + r + o + \\\"</font></small>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n l.push({\\r\\n col_type: \\\"line\\\"\\r\\n })\\r\\n }));\\r\\n\\r\\n if (page == 1) {\\r\\n l.unshift({\\r\\n col_type: \\\"blank_block\\\"\\r\\n });\\r\\n l.unshift({\\r\\n title: \\\"<big>共<strong> \\\" + r.total + \\\" </strong>条剧评</big>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n });\\r\\n\\r\\n setHomeResult({\\r\\n data: a.concat(l)\\r\\n })\\r\\n } else {\\r\\n setHomeResult({\\r\\n data: l\\r\\n })\\r\\n }\\r\\n}\\r\\n\\r\\n//预告片页面\\r\\nfunction trailers(type, id) {\\r\\n setPageTitle('预告-片段-花絮')\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/trailers\\\").trailers;\\r\\n i.forEach((e => {\\r\\n e.col_type = \\\"movie_2\\\", e.desc = e.subject_title + \\\"•\\\" + e.create_time, e.img = e.cover_url, e.url = e.video_url\\r\\n }));\\r\\n\\r\\n let r = i.filter((e => \\\"A\\\" === e.type));\\r\\n let l = i.filter((e => \\\"B\\\" === e.type));\\r\\n let o = i.filter((e => \\\"C\\\" === e.type));\\r\\n\\r\\n if (r.length > 0) {\\r\\n r.unshift({\\r\\n title: \\\"预告\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n }\\r\\n if (l.length > 0) {\\r\\n l.unshift({\\r\\n title: \\\"片段\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n }\\r\\n if (o.length > 0) {\\r\\n o.unshift({\\r\\n title: \\\"花絮\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n }\\r\\n\\r\\n setHomeResult({\\r\\n data: r.concat(l)\\r\\n .concat(o)\\r\\n })\\r\\n}\\r\\n\\r\\n//视频评论页面\\r\\nfunction videoComment(type, id) {\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/videos\\\").videos;\\r\\n i.forEach((e => {\\r\\n e.col_type = \\\"movie_2\\\", e.desc = e.author.name + \\\"•\\\" + e.create_time, e.img = e.cover_url + \\\"@Referer=\\\" + e.cover_url, e.url = e.video_url\\r\\n }))\\r\\n if (i.length > 0) {\\r\\n i.unshift({\\r\\n title: \\\"视频评论\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n }\\r\\n setHomeResult({\\r\\n data: i\\r\\n })\\r\\n}\\r\\n\\r\\n//演职人员详情页面\\r\\nfunction elessarView(id, pid, name) {\\r\\n setPageTitle(name);\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/elessar/subject/\\\" + id);\\r\\n let a = [];\\r\\n a.push({\\r\\n title: '““””' + (i.title + '(' + i.latin_title + ')').big().bold(),\\r\\n desc: '““””' + i.desc.match(/\\\\<p\\\\>.*\\\\<\\\\/p\\\\>/)[0],\\r\\n img: i.cover.normal.url + '@Referer=' + i.cover.normal.url,\\r\\n col_type: 'movie_1_vertical_pic_blur',\\r\\n url: $('hiker://empty').rule((desc, extra, name) => {\\r\\n let info = extra.info.map(e => e.join(':&nbsp;'));\\r\\n setResult([{\\r\\n title: '<h2>' + name + '</h2>' + info.join('<br/>') + desc.match(/\\\\<p\\\\>.*\\\\<\\\\/p\\\\>/)[0],\\r\\n col_type: 'rich_text'\\r\\n }])\\r\\n }, i.desc, i.extra, i.title)\\r\\n })\\r\\n \\r\\n let index = i.modules.findIndex(cur => cur.type == \\\"award_result_collection\\\");\\r\\n if (index > -1) {\\r\\n let e = i.modules[index].payload;\\r\\n a.push({\\r\\n title: '““””' + '获奖记录'.big().bold() + '<small>(共' + e.total + '项)</small>',\\r\\n desc: '““””<strong>' + e.awards[0].ceremony.title + '</strong>\\\\n' + e.awards[0].category.title + (e.awards[0].is_won ? '' : '(提名)'),\\r\\n col_type: 'text_center_1',\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((id, count) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n elessarAwards(id, count);\\r\\n }, e.id, e.total),\\r\\n extra: {\\r\\n lineVisible: false\\r\\n }\\r\\n })\\r\\n }\\r\\n \\r\\n index = i.modules.findIndex(cur => cur.type == \\\"work_collections\\\");\\r\\n if (index > -1) {\\r\\n let e2 = i.modules[index].payload;\\r\\n a.push({\\r\\n col_type: 'line'\\r\\n })\\r\\n a.push({\\r\\n title: '““””' + '影视作品'.big().bold() + ('(共' + e2.collections[0].total + '部)').small(),\\r\\n col_type: 'text_center_1',\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((id, type) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n elessarWorks(id, type);\\r\\n }, e2.id, e2.collections[0].title),\\r\\n extra: {\\r\\n lineVisible: false\\r\\n }\\r\\n })\\r\\n\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n let works = e2.collections[0].works;\\r\\n let length = works.length <= 3 ? works.length : 3;\\r\\n for (let i = 0; i < length; i++) {\\r\\n let e = works[i];\\r\\n let rating = \\\"\\\";\\r\\n if (e.subject.extra.rating_group.rating) {\\r\\n rating = computeRating(e.subject.extra.rating_group.rating.max, e.subject.extra.rating_group.rating.value) + \\\" \\\" + e.subject.extra.rating_group.rating.value + \\\"分\\\";\\r\\n }\\r\\n\\r\\n let type = e.subject.subtype,\\r\\n id = e.subject.id,\\r\\n title = e.subject.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n a.push({\\r\\n title: title,\\r\\n img: e.subject.cover.normal.url + \\\"@Referer=\\\" + e.subject.cover.normal.url,\\r\\n desc: rating,\\r\\n col_type: 'movie_3',\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra\\r\\n })\\r\\n }\\r\\n /*a.push({\\r\\n title: '查看更多',\\r\\n img: 'https://joker-tx.coding.net/p/hikerimg/d/hiker/git/raw/master/img/more_ver.png?download=false',\\r\\n col_type: 'movie_3',\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#')\\r\\n .rule((id, type) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n elessarWorks(id, type);\\r\\n }, e2.id, e2.collections[0].title)\\r\\n })*/\\r\\n }\\r\\n \\r\\n index = i.modules.findIndex(cur => cur.type == \\\"photos\\\");\\r\\n if (index > -1) {\\r\\n let e3 = i.modules[index].payload;\\r\\n a.push({\\r\\n col_type: 'line'\\r\\n })\\r\\n a.push({\\r\\n title: '““””' + '演员照片'.big().bold() + ('(共' + e3.total + '张)').small(),\\r\\n col_type: 'text_center_1',\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((pid) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n elessarPhotos(pid);\\r\\n }, pid),\\r\\n extra: {\\r\\n lineVisible: false\\r\\n }\\r\\n })\\r\\n\\r\\n let plength = e3.photos.length <= 2 ? e3.photos.length : 2;\\r\\n for (let i = 0; i < plength; i++) {\\r\\n a.push({\\r\\n //title: e3.photos[0].description,\\r\\n col_type: 'card_pic_2',\\r\\n desc: '0',\\r\\n img: e3.photos[i].image.normal.url + '@Referer=' + e3.photos[i].image.normal.url,\\r\\n url: e3.photos[i].image.normal.url + '@Referer=' + e3.photos[i].image.normal.url\\r\\n })\\r\\n }\\r\\n\\r\\n /*a.push({\\r\\n //title: '查看更多',\\r\\n img: 'https://joker-tx.coding.net/p/hikerimg/d/hiker/git/raw/master/img/more.png?download=false',\\r\\n col_type: 'card_pic_2',\\r\\n desc: '0',\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#')\\r\\n .rule((pid) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n elessarPhotos(pid);\\r\\n }, pid)\\r\\n })*/\\r\\n }\\r\\n\\r\\n setResult(a);\\r\\n}\\r\\n\\r\\n//演职人员获奖详情页面\\r\\nfunction elessarAwards(id, count) {\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/elessar/award_result_collection/\\\" + id + \\\"/awards?start=\\\" + 30 * (MY_PAGE - 1) + \\\"&count=30\\\");\\r\\n let l = [];\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n i.awards.forEach(t => {\\r\\n l.push({\\r\\n title: (t.year+\\\"\\\").bold().big(),\\r\\n col_type: 'rich_text'\\r\\n })\\r\\n\\r\\n for (let i = 0; i < t.modules.length; i++) {\\r\\n let e = t.modules[i];\\r\\n if (!e.ceremony || !e.category) {\\r\\n let rating = \\\"\\\";\\r\\n if (e.extra.rating_group.rating) {\\r\\n rating = computeRating(e.extra.rating_group.rating.max, e.extra.rating_group.rating.value) + \\\" \\\" + e.extra.rating_group.rating.value + \\\"分\\\";\\r\\n }\\r\\n let type = e.subtype,\\r\\n id = e.id,\\r\\n title = e.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n l.push({\\r\\n title: title,\\r\\n img: e.cover.normal.url + \\\"@Referer=\\\" + e.cover.normal.url,\\r\\n desc: rating + '\\\\n' + e.extra.short_info,\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra\\r\\n })\\r\\n } else {\\r\\n l.push({\\r\\n title: e.ceremony.title.bold() + '<small>(<a href=\\\"hiker://empty#noHistory#@rule=js:eval(JSON.parse(fetch(`hiker://page/main`)).rule);awardView(`' + e.ceremony.id + '`,`' + e.ceremony.title + '`);\\\">查看详情</a>)</small>' + '<br/>' + (e.category.title + (e.is_won ? '' : '(提名)')).small(),\\r\\n col_type: 'rich_text'\\r\\n })\\r\\n }\\r\\n }\\r\\n })\\r\\n\\r\\n if (MY_PAGE == 1) {\\r\\n l.unshift({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n l.unshift({\\r\\n title: \\\"<big>共<strong> \\\" + count + \\\" </strong>项获奖记录</big>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n }\\r\\n setResult(l);\\r\\n}\\r\\n\\r\\n//演职人员作品页面\\r\\nfunction elessarWorks(id, type) {\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/elessar/work_collections/\\\" + id + \\\"/works?start=\\\" + 30 * (MY_PAGE - 1) + \\\"&count=30&collection_title=\\\" + type);\\r\\n\\r\\n let l = [];\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n i.works.forEach((e => {\\r\\n let rating = \\\"\\\";\\r\\n if (e.subject.extra.rating_group.rating) {\\r\\n rating = computeRating(e.subject.extra.rating_group.rating.max, e.subject.extra.rating_group.rating.value) + \\\" \\\" + e.subject.extra.rating_group.rating.value + \\\"分\\\";\\r\\n }\\n \\n let year = e.subject.extra ? (e.subject.extra.year ? '('+e.subject.extra.year+')' : '') : '';\\r\\n\\r\\n let type = e.subject.subtype,\\r\\n id = e.subject.id,\\r\\n title = e.subject.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n l.push({\\r\\n title: title + year,\\r\\n img: e.subject.cover.normal.url + \\\"@Referer=\\\" + e.subject.cover.normal.url,\\r\\n desc: e.roles.join(\\\"•\\\") + \\\"\\\\n\\\" + rating + '\\\\n' + e.subject.extra.short_info,\\r\\n col_type: 'movie_1_vertical_pic',\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra\\r\\n })\\r\\n }))\\r\\n\\r\\n if (MY_PAGE == 1) {\\r\\n l.unshift({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n l.unshift({\\r\\n title: \\\"<big>共<strong> \\\" + i.total + \\\" </strong>部作品</big>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n }\\r\\n setHomeResult({\\r\\n data: l\\r\\n })\\r\\n}\\r\\n\\r\\n//演职人员照片页面\\r\\nfunction elessarPhotos(pid) {\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/celebrity/\\\" + pid + \\\"/photos?start=\\\" + 30 * (MY_PAGE - 1) + \\\"&count=30\\\");\\r\\n let l = [];\\r\\n i.photos.forEach(e => {\\r\\n l.push({\\r\\n col_type: 'card_pic_2',\\r\\n desc: '0',\\r\\n img: e.image.normal.url + '@Referer=' + e.image.normal.url,\\r\\n url: e.image.normal.url + '@Referer=' + e.image.normal.url\\r\\n })\\r\\n })\\r\\n if (MY_PAGE == 1) {\\r\\n l.unshift({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n l.unshift({\\r\\n title: \\\"<big>共<strong> \\\" + i.total + \\\" </strong>张照片</big>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n }\\r\\n setResult(l);\\r\\n}\\r\\n\\r\\n//剧评详情页面\\r\\nfunction dramaReviewView(id) {\\r\\n setPageTitle('剧评详情');\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/review/\\\" + id);\\r\\n\\r\\n i.photos.forEach((e => {\\r\\n i.content = i.content.replace('id=\\\"' + e.tag_name + '\\\"', 'src=\\\"' + e.image.large.url + \\\"@Referer=\\\" + e.image.large.url + '\\\"')\\r\\n }));\\r\\n\\r\\n let l = getDoubanRes(\\\"https://frodo.douban.com/api/v2/review/\\\" + id + \\\"/comments\\\");\\r\\n let o = [{\\r\\n col_type: \\\"blank_block\\\"\\r\\n }, {\\r\\n title: \\\"<big><strong>评论:</strong></big>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n }];\\r\\n\\r\\n l.comments.length > 0 ? l.comments.forEach((e => {\\r\\n o.push({\\r\\n title: e.author.name,\\r\\n img: e.author.avatar,\\r\\n url: e.author.url,\\r\\n col_type: \\\"avatar\\\"\\r\\n })\\r\\n o.push({\\r\\n title: e.text + (e.replies.length > 0 ? ' <small><a href=\\\"hiker://empty#noHistory#@rule=js:eval(JSON.parse(fetch(`hiker://page/main`)).rule);dramaReviewReplyView(' + e.id + ');\\\">[查看回复]</a></small>' : \\\"\\\"),\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n o.push({\\r\\n col_type: \\\"line\\\"\\r\\n })\\r\\n })) : o.push({\\r\\n title: '<font color=\\\"grey\\\">( •̥́ ˍ •̀ू )还没有人评论...</font>',\\r\\n col_type: \\\"rich_text\\\"\\r\\n });\\r\\n\\r\\n let a = \\\"\\\";\\r\\n if (i.rating) {\\r\\n a = computeRating(i.rating.max, i.rating.value);\\r\\n }\\r\\n let color = JSON.parse(fetch(getMyVar('qdb_config')))\\r\\n .starColor || \\\"#ffac2d\\\";\\r\\n let s = [{\\r\\n title: \\\"<big><strong>\\\" + i.title + \\\"</strong></big>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n }, {\\r\\n title: i.user.name + \\\" 的剧评\\\",\\r\\n img: i.user.avatar,\\r\\n url: i.user.url,\\r\\n col_type: \\\"avatar\\\"\\r\\n }, {\\r\\n title: (i.spoiler ? \\\"<small><font color=#f20c00>这篇影评可能有剧透</font></small><br/>\\\" : \\\"\\\") + (a ? '<small>看过 <font color=' + color + '>' + a + \\\"</font><br/></small>\\\" : \\\"\\\") + '<small><font color=\\\"grey\\\">' + /\\\\d{4}-\\\\d{1,2}-\\\\d{1,2}/g.exec(i.create_time) + \\\"</font></small>\\\",\\r\\n col_type: \\\"rich_text\\\"\\r\\n }, {\\r\\n col_type: \\\"line_blank\\\"\\r\\n }, {\\r\\n title: i.content.replace(/<div\\\\s*[^>]*>(.*?)<\\\\/div>/g, \\\"$1\\\") + (i.is_original ? '<small><font color=\\\"grey\\\">&copy;本文版权归该作者所有,任何形式转载请联系作者。</font></small>' : \\\"\\\"),\\r\\n col_type: \\\"rich_text\\\"\\r\\n }];\\r\\n\\r\\n setHomeResult({\\r\\n data: s.concat(o)\\r\\n })\\r\\n}\\r\\n\\r\\n//剧评回复页面\\r\\nfunction dramaReviewReplyView(id) {\\r\\n setPageTitle('回复详情');\\r\\n let t = getDoubanRes(\\\"https://frodo.douban.com/api/v2/review/comment/\\\" + id + \\\"/replies\\\");\\r\\n let i = [];\\r\\n t.replies.forEach((e => {\\r\\n i.push({\\r\\n title: e.author.name,\\r\\n img: e.author.avatar,\\r\\n url: e.author.url,\\r\\n col_type: \\\"avatar\\\"\\r\\n })\\r\\n i.push({\\r\\n title: (e.ref_comment.has_ref ? '回复@<font color=\\\"blue\\\">' + e.ref_comment.author.name + \\\"</font>:\\\" : \\\"\\\") + e.text,\\r\\n col_type: \\\"rich_text\\\"\\r\\n })\\r\\n i.push({\\r\\n col_type: \\\"line\\\"\\r\\n })\\r\\n }))\\r\\n\\r\\n setHomeResult({\\r\\n data: i\\r\\n })\\r\\n}\\r\\n\\r\\n//相关推荐页面\\r\\nfunction recommendations(type, id){\\r\\n setPageTitle('相关推荐');\\r\\n let res = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\"+ type + \\\"/\\\" + id + \\\"/recommendations\\\");\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n let i = res.map((e => {\\r\\n let type = e.type,\\r\\n id = e.id,\\r\\n title = e.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n return {\\r\\n title: title,\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra,\\r\\n col_type: 'movie_3',\\r\\n img: e.pic ? e.pic.normal + \\\"@Referer=\\\" + e.pic.normal : e.cover.url + '@Referer=' + e.cover.url,\\r\\n desc: e.null_rating_reason || e.rating.value\\r\\n }\\r\\n }));\\r\\n\\r\\n setHomeResult({\\r\\n data: i\\r\\n })\\r\\n}\\r\\n\\r\\n//影片详情页面\\r\\nfunction detailsView(type, id) {\\r\\n let i = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id);\\r\\n setPageTitle(i.title);\\r\\n let info = \\\"\\\";\\r\\n if (i.is_tv) {\\r\\n info = [i.countries ? i.countries.join(\\\" \\\") : null, i.genres ? i.genres.join(\\\" \\\") : null, i.pubdate ? i.pubdate[0] + \\\"首播\\\" : null, i.episodes_count ? \\\"共\\\" + i.episodes_count + \\\"集\\\" : null, i.durations ? \\\"单集片长\\\" + i.durations : null].filter((e => null !== e)).join(\\\" / \\\");\\r\\n } else {\\r\\n info = [i.countries ? i.countries.join(\\\" \\\") : null, i.genres ? i.genres.join(\\\" \\\") : null, i.pubdate ? i.pubdate[0] + \\\"首播\\\" : null, i.durations ? \\\"片长\\\" + i.durations : null].filter((e => null !== e)).join(\\\" / \\\");\\r\\n }\\r\\n let infoItems = [{\\r\\n title: i.title + \\\"\\\\n\\\" + i.original_title + \\\"(\\\" + i.year + \\\")\\\",\\r\\n desc: info || i.card_subtitle,\\r\\n img: i.pic.normal + \\\"@Referer=\\\" + i.pic.normal,\\r\\n col_type: \\\"movie_1_vertical_pic_blur\\\",\\r\\n url: 'hiker://page/settingPage?view=analysisSettingModule#noHistory#',\\r\\n extra: {\\r\\n newWindow: true,\\r\\n windowId: '高级功能',\\r\\n gradient: true\\r\\n }\\r\\n }];\\r\\n\\r\\n let rating = \\\"\\\";\\r\\n if (i.rating) {\\r\\n rating = computeRating(i.rating.max, i.rating.value);\\r\\n }\\r\\n let ratingItems = [];\\r\\n let color = getConfig('starColor');\\r\\n let ratingTitle = ''\\r\\n if (rating) {\\r\\n ratingTitle = '豆瓣评分™'.big().bold() + '<br>' + rating.fontcolor(color) + '&nbsp;&nbsp;' + (i.rating.value.toFixed(1) + '分').big().bold();\\r\\n } else {\\r\\n ratingTitle = '暂无评分'.big().bold() + '<br>' + '点我查看影片信息'.fontcolor('grey');\\r\\n }\\r\\n ratingItems = [{\\r\\n title: '““””' + ratingTitle,\\r\\n col_type: \\\"text_center_1\\\",\\r\\n extra: {\\r\\n lineVisible: false\\r\\n },\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((type, id, ratingCount) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n rating(type, id, ratingCount);\\r\\n }, i.subtype, i.id, i.rating ? i.rating.count : 0)\\r\\n }];\\r\\n\\r\\n let relatedItems = [{\\r\\n title: \\\"剧照\\\",\\r\\n img: \\\"https://gitcode.net/qq_41846756/hiker/-/raw/master/img/剧照.png\\\",\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((t) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n stillsList(t[0], t[1]);\\r\\n }, [i.subtype, i.id]),\\r\\n col_type: \\\"icon_round_small_4\\\"\\r\\n }, {\\r\\n title: \\\"演职\\\",\\r\\n img: \\\"https://gitcode.net/qq_41846756/hiker/-/raw/master/img/演职.png\\\",\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((t) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n credits(t[0], t[1]);\\r\\n }, [i.subtype, i.id]),\\r\\n col_type: \\\"icon_round_small_4\\\"\\r\\n }, {\\r\\n title: \\\"短评\\\",\\r\\n img: \\\"https://gitcode.net/qq_41846756/hiker/-/raw/master/img/短评.png\\\",\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((t) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n shortCommentList(t[0], t[1]);\\r\\n }, [i.subtype, i.id]),\\r\\n col_type: \\\"icon_round_small_4\\\"\\r\\n }, {\\r\\n title: \\\"剧评\\\",\\r\\n img: \\\"https://gitcode.net/qq_41846756/hiker/-/raw/master/img/剧评.png\\\",\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((t) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n dramaReviewList(t[0], t[1]);\\r\\n }, [i.subtype, i.id]),\\r\\n col_type: \\\"icon_round_small_4\\\"\\r\\n }];\\r\\n\\r\\n let introItems = [];\\r\\n if (i.intro) {\\r\\n introItems = [{\\r\\n title: \\\"““””<big><strong>剧情简介</strong></big>\\\",\\r\\n col_type: \\\"text_center_1\\\",\\r\\n extra: {\\r\\n lineVisible: false\\r\\n },\\r\\n url: 'hiker://empty'\\r\\n }, {\\r\\n title: \\\"&nbsp;&nbsp;&nbsp;&nbsp;\\\" + i.intro.replace(/\\\\n/g, \\\"<br/>&nbsp;&nbsp;&nbsp;&nbsp;\\\").replace(/\\\\s/g, \\\" \\\").replace(/\\\\t/g, \\\" \\\"),\\r\\n col_type: \\\"rich_text\\\"\\r\\n }]\\r\\n }\\r\\n\\r\\n let videoRelatedItems = [];\\r\\n if (i.trailer) {\\r\\n videoRelatedItems.push({\\r\\n title: \\\"““””<big><strong>预告</strong></big>\\\",\\r\\n col_type: \\\"text_center_1\\\",\\r\\n extra: {\\r\\n lineVisible: false\\r\\n },\\r\\n url: 'hiker://empty'\\r\\n });\\r\\n videoRelatedItems.push({\\r\\n title: i.trailer.title,\\r\\n img: i.trailer.cover_url,\\r\\n url: i.trailer.video_url,\\r\\n desc: i.trailer.subject_title + \\\"•\\\" + i.trailer.create_time,\\r\\n col_type: \\\"movie_2\\\"\\r\\n });\\r\\n videoRelatedItems.push({\\r\\n title: '查看更多',\\r\\n img: \\\"https://gitcode.net/qq_41846756/hiker/-/raw/master/img/more.png\\\",\\r\\n col_type: \\\"movie_2\\\",\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((t) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n trailers(t[0], t[1]);\\r\\n }, [i.subtype, i.id]),\\r\\n });\\r\\n }\\r\\n if (i.video) {\\r\\n videoRelatedItems.push({\\r\\n title: \\\"““””<big><strong>视频评论</strong></big>\\\",\\r\\n col_type: \\\"text_center_1\\\",\\r\\n extra: {\\r\\n lineVisible: false\\r\\n },\\r\\n url: 'hiker://empty'\\r\\n });\\r\\n videoRelatedItems.push({\\r\\n title: i.video.title,\\r\\n img: i.video.cover_url + \\\"@Referer=\\\" + i.video.cover_url,\\r\\n url: i.video.video_url,\\r\\n desc: i.video.author.name + \\\"•\\\" + i.video.create_time,\\r\\n col_type: \\\"movie_2\\\"\\r\\n });\\r\\n videoRelatedItems.push({\\r\\n title: '查看更多',\\r\\n img: \\\"https://gitcode.net/qq_41846756/hiker/-/raw/master/img/more.png\\\",\\r\\n col_type: \\\"movie_2\\\",\\r\\n url: $('hiker://empty/#/$page{fypage}#noHistory#').rule((t) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n videoComment(t[0], t[1]);\\r\\n }, [i.subtype, i.id]),\\r\\n });\\r\\n }\\r\\n\\r\\n let config = JSON.parse(fetch(getMyVar('qdb_config')));\\r\\n\\r\\n let analysisConfigs = getConfig('analysisConfigs', config);\\r\\n let extraConfig = analysisConfigs[analysisConfigs.use].extra || '{}';\\r\\n let extra = {};\\r\\n try {\\r\\n if (extraConfig.startsWith('{')) eval('extra=' + extraConfig);\\r\\n } catch (e) {}\\r\\n let videoItems = [];\\r\\n videoUrlsModule(videoItems, type, id, ['icon_2', 'icon_small_4'], parseVideoUrlLazy, i, extra);\\r\\n if (videoItems.length > 0) {\\r\\n videoItems.unshift({\\r\\n title: \\\"““””<big><strong>在线观看</strong></big>\\\",\\r\\n col_type: \\\"text_center_1\\\",\\r\\n extra: {\\r\\n lineVisible: false\\r\\n },\\r\\n url: 'hiker://empty'\\r\\n })\\r\\n } else {\\r\\n videoItems.unshift({\\r\\n title: \\\"““””<big><strong>尚无片源</strong></big>\\\",\\r\\n col_type: \\\"text_center_1\\\",\\r\\n extra: {\\r\\n lineVisible: false\\r\\n },\\r\\n url: 'toast://真的没片源'\\r\\n })\\r\\n }\\r\\n\\r\\n let quickSearchConfigs = getConfig('quickSearchConfigs', config);\\r\\n let quickSearchItems = [];\\r\\n quickSearchConfigs.order.forEach(quickSearchItem => {\\r\\n if (quickSearchConfigs[quickSearchItem]) {\\r\\n quickSearchItems.push({\\r\\n title: quickSearchItem,\\r\\n img: quickSearchConfigs[quickSearchItem].pic,\\r\\n col_type: quickSearchConfigs.mode || 'icon_small_4',\\r\\n url: 'hiker://search?s=' + i.title + '&rule=' + quickSearchConfigs[quickSearchItem].name\\r\\n })\\r\\n }\\r\\n })\\r\\n if (quickSearchItems.length > 0) {\\r\\n quickSearchItems.unshift({\\r\\n title: '““””<strong><big>快速搜索</big></strong>',\\r\\n col_type: 'text_center_1',\\r\\n extra: {\\r\\n lineVisible: false\\r\\n },\\r\\n url: 'hiker://empty'\\r\\n })\\r\\n /*quickSearchItems.unshift({\\r\\n col_type: 'line'\\r\\n })*/\\r\\n }\\r\\n\\r\\n setHomeResult({\\r\\n data: infoItems.concat(ratingItems)\\r\\n .concat(relatedItems)\\r\\n .concat({\\r\\n col_type: 'line'\\r\\n })\\r\\n .concat(quickSearchItems)\\r\\n .concat({\\r\\n col_type: 'line'\\r\\n })\\r\\n .concat(videoItems)\\r\\n .concat({\\r\\n col_type: 'line'\\r\\n })\\r\\n .concat(videoRelatedItems)\\r\\n .concat({\\r\\n col_type: 'line'\\r\\n })\\r\\n .concat(introItems)\\r\\n .concat({\\r\\n col_type: 'line',\\r\\n extra:{\\r\\n id: 'recommendations'\\r\\n }\\r\\n })\\r\\n .concat({\\r\\n col_type: 'text_center_1',\\r\\n title: '““””<small><font color=#871f78>以上数据来源于豆瓣,如您喜欢,请下载官方app</font></small>',\\r\\n desc: '““””<small><font color=#f20c00>此规则仅限学习交流使用,请于导入后24小时内删除,任何组织或个人不得以任何方式方法传播此规则的整体或部分!</font></small>',\\r\\n url: 'https://movie.douban.com/subject/' + id + '/',\\r\\n extra: {\\r\\n lineVisible: false\\r\\n }\\r\\n })\\r\\n })\\r\\n be([{\\r\\n func: function(obj){\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n let res = getDoubanRes(obj.url);\\r\\n \\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n let l = [res[0],res[1],res[2]];\\r\\n let i = l.map((e => {\\r\\n let type = e.type,\\r\\n id = e.id,\\r\\n title = e.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n return {\\r\\n title: title,\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra,\\r\\n img: e.pic ? e.pic.normal + \\\"@Referer=\\\" + e.pic.normal : e.cover.url + '@Referer=' + e.cover.url,\\r\\n desc: e.null_rating_reason || e.rating.value\\r\\n }\\r\\n }));\\r\\n addItemAfter('recommendations', i[2]);\\r\\n addItemAfter('recommendations', i[1]);\\r\\n addItemAfter('recommendations', i[0]);\\r\\n addItemAfter('recommendations', {\\r\\n title: \\\"““””<big><strong>相关推荐</strong></big>\\\",\\r\\n col_type: \\\"text_center_1\\\",\\r\\n url: $('hiker://empty/#noHistory#').rule((t) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n recommendations(t[0], t[1]);\\r\\n }, [obj.type, obj.id]),\\r\\n extra: {\\r\\n lineVisible: false\\r\\n }\\r\\n })\\r\\n updateItem('recommendations',{col_type: 'line',extra:{id:'nooop'}})\\r\\n },\\r\\n param: {\\r\\n url: \\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id + \\\"/recommendations\\\",\\r\\n type: type,\\r\\n id: id\\r\\n }\\r\\n }])\\r\\n}\\r\\n\\r\\n//推荐\\r\\nfunction findList(page, count) {\\r\\n if (!getMyVar('findList')) putMyVar('findList', '{\\\"item\\\":\\\"movie\\\",\\\"playable\\\":\\\"0\\\",\\\"score\\\":\\\"0,10\\\"}');\\r\\n let a = [];\\r\\n let temp = JSON.parse(getMyVar('findList'));\\r\\n let color = getConfig('chooseColor');\\r\\n\\r\\n let items = {\\r\\n 电影: 'movie',\\r\\n 电视剧: 'tv'\\r\\n }\\r\\n for (i in items) {\\r\\n a.push({\\r\\n title: temp.item === items[i] ? '““””<b> <font color=' + color + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('findList'));\\r\\n temp.item = e;\\r\\n putMyVar(\\\"findList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, items[i])\\r\\n })\\r\\n }\\r\\n\\r\\n a.push({\\r\\n col_type: 'blank_block'\\r\\n })\\r\\n\\r\\n let playable = {\\r\\n 全部影片: '0',\\r\\n 仅有片源: '1'\\r\\n }\\r\\n for (let r in playable) {\\r\\n a.push({\\r\\n title: temp.playable == playable[r] ? '““””<b> <font color=' + color + '>' + r + ' </font></b>' : r,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('findList'));\\r\\n temp.playable = e;\\r\\n putMyVar(\\\"findList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, playable[r])\\r\\n })\\r\\n }\\r\\n\\r\\n a.push({\\r\\n title: '““””<b> <font color=' + color + '>评分区间:' + temp.score.replace(',', '-') + ' </font></b>',\\r\\n col_type: 'scroll_button',\\r\\n url: $(temp.score.replace(',', '-'), '评分应在0-10之间').input(() => {\\r\\n let temp = JSON.parse(getMyVar('findList'));\\r\\n let inputs = input.split('-');\\r\\n if (inputs.length == 2 && inputs.every(e => e >= 0 && e <= 10) && parseFloat(inputs[0]) < inputs[1]) {\\r\\n temp.score = input.replace('-', ',');\\r\\n putMyVar(\\\"findList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n } else {\\r\\n return 'toast://请正确输入'\\r\\n }\\r\\n })\\r\\n })\\r\\n\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + temp.item + \\\"/recommend\\\" + '?playable=' + temp.playable + '&score_range=' + temp.score + (page ? \\\"&start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"&start=0&count=8\\\"));\\r\\n let l = s.items;\\r\\n l = l.filter(e => e.type !== \\\"ad\\\" && e.type !== \\\"tags\\\");\\r\\n\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n let i = l.map((e => {\\r\\n let type = e.type,\\r\\n id = e.id,\\r\\n title = e.subtitle || e.title;\\r\\n let baseUrl = e.type === \\\"playlist\\\" ? 'hiker://empty/$page{fypage}' : 'hiker://empty#immersiveTheme#';\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(baseUrl + \\\"#noHistory#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n return {\\r\\n title: title + (type === \\\"playlist\\\" ? \\\"\\\" : \\\"(\\\" + e.year + \\\")\\\"),\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra,\\r\\n img: e.pic ? e.pic.normal + \\\"@Referer=\\\" + e.pic.normal : e.cover_url + \\\"@Referer=\\\" + e.cover_url,\\r\\n desc: e.type !== \\\"playlist\\\" ? (e.tags.map((e => e.name)).join(\\\",\\\") + \\\"\\\\n\\\" + (e.rating ? computeRating(e.rating.max, e.rating.value) + \\\" \\\" + e.rating.value.toFixed(1) + \\\"分\\\" : \\\"暂无评分\\\")) : (e.title + \\\"\\\\n\\\" + e.tags.join(\\\",\\\") + \\\"\\\\n共\\\" + e.items_count + \\\"部\\\")\\r\\n }\\r\\n }));\\r\\n\\r\\n return page > 1 ? i : a.concat(i);\\r\\n}\\r\\n\\r\\n//热门\\r\\nfunction hotList(page, count) {\\r\\n if (!getMyVar('hotList')) putMyVar('hotList', '{\\\"item\\\":\\\"movie_showing?area=全部\\\",\\\"playable\\\":\\\"0\\\",\\\"sort\\\":\\\"recommend\\\",\\\"score\\\":\\\"0,10\\\"}');\\r\\n let a = [];\\r\\n let temp = JSON.parse(getMyVar('hotList'));\\r\\n let color = getConfig('chooseColor');\\r\\n\\r\\n let items = {\\r\\n 电影: {\\r\\n 影院热映电影: 'movie_showing?area=全部',\\r\\n 豆瓣热门电影: 'hot_gaia?area=全部',\\r\\n 热门华语电影: 'hot_gaia?area=华语',\\r\\n 热门欧美电影: 'hot_gaia?area=欧美',\\r\\n 热门韩国电影: 'hot_gaia?area=韩国',\\r\\n 热门日本电影: 'hot_gaia?area=日本'\\r\\n },\\r\\n 电视剧: {\\r\\n 热播电视剧: 'tv_hot',\\r\\n 热播国产剧: 'tv_domestic',\\r\\n 热播欧美剧: 'tv_american',\\r\\n 热播日剧: 'tv_japanese',\\r\\n 热播韩剧: 'tv_korean',\\r\\n 热播动画: 'tv_animation'\\r\\n },\\r\\n 综艺: {\\r\\n 热播综艺: 'show_hot',\\r\\n 国内综艺: 'show_domestic',\\r\\n 国外综艺: 'show_foreign'\\r\\n }\\r\\n }\\r\\n for (let i in items) {\\r\\n for (let j in items[i]) {\\r\\n a.push({\\r\\n title: temp.item == items[i][j] ? '““””<b> <font color=' + color + '>' + j + ' </font></b>' : j,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('hotList'));\\r\\n temp.item = e;\\r\\n putMyVar('hotList', JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, items[i][j])\\r\\n })\\r\\n }\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n }\\r\\n\\r\\n let sort = {\\r\\n 热度排序: 'recommend',\\r\\n 时间排序: 'time',\\r\\n 评分排序: 'rank'\\r\\n }\\r\\n for (let r in sort) {\\r\\n a.push({\\r\\n title: temp.sort == sort[r] ? '““””<b> <font color=' + color + '>' + r + ' </font></b>' : r,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('hotList'));\\r\\n temp.sort = e;\\r\\n putMyVar(\\\"hotList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, sort[r])\\r\\n })\\r\\n }\\r\\n\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n\\r\\n let playable = {\\r\\n 全部影片: '0',\\r\\n 仅有片源: '1'\\r\\n }\\r\\n for (let r in playable) {\\r\\n a.push({\\r\\n title: temp.playable == playable[r] ? '““””<b> <font color=' + color + '>' + r + ' </font></b>' : r,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('hotList'));\\r\\n temp.playable = e;\\r\\n putMyVar(\\\"hotList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, playable[r])\\r\\n })\\r\\n }\\r\\n\\r\\n a.push({\\r\\n title: '““””<b> <font color=' + color + '>评分区间:' + temp.score.replace(',', '-') + ' </font></b>',\\r\\n col_type: 'scroll_button',\\r\\n url: $(temp.score.replace(',', '-'), '评分应在0-10之间').input(() => {\\r\\n let temp = JSON.parse(getMyVar('hotList'));\\r\\n let inputs = input.split('-');\\r\\n if (inputs.length == 2 && inputs.every(e => e >= 0 && e <= 10) && parseFloat(inputs[0]) < inputs[1]) {\\r\\n temp.score = input.replace('-', ',');\\r\\n putMyVar(\\\"hotList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n } else {\\r\\n return 'toast://请正确输入'\\r\\n }\\r\\n })\\r\\n })\\r\\n\\r\\n let l = [];\\r\\n if (temp.item.indexOf('?') != -1) {\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/movie/\\\" + temp.item + '&playable=' + temp.playable + '&sort=' + temp.sort + '&score_range=' + temp.score + (page ? \\\"&start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"&start=0&count=30\\\") + '&loc_id=108288');\\r\\n l = s.items;\\r\\n } else {\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/subject_collection/\\\" + temp.item + '/items' + '?playable=' + temp.playable + '&sort=' + temp.sort + '&score_range=' + temp.score + (page ? \\\"&start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"&start=0&count=30\\\"));\\r\\n l = s.subject_collection_items;\\r\\n }\\r\\n\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n let i = l.map((e => {\\r\\n let type = e.type,\\r\\n id = e.id,\\r\\n title = e.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n return {\\r\\n title: title + \\\"(\\\" + e.year + \\\")\\\",\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra,\\r\\n img: e.pic ? e.pic.normal + \\\"@Referer=\\\" + e.pic.normal : e.cover.url + '@Referer=' + e.cover.url,\\r\\n desc: (e.tags ? e.tags.map((e => e.name)).join(\\\",\\\") : e.card_subtitle) + \\\"\\\\n\\\" + (e.rating ? computeRating(e.rating.max, e.rating.value) + \\\" \\\" + e.rating.value.toFixed(1) + \\\"分\\\" : \\\"暂无评分\\\")\\r\\n }\\r\\n }));\\r\\n\\r\\n return page > 1 ? i : a.concat(i);\\r\\n}\\r\\n\\r\\n//分类\\r\\nfunction classList(page, count) {\\r\\n if (!getMyVar('classlist')){\\r\\n putMyVar('classlist', JSON.stringify({subtype:\\\"\\\",local:\\\"\\\",year:\\\"\\\",class:\\\"\\\",rank:\\\"U\\\",type:\\\"\\\",filter:\\\"\\\",score:\\\"0,10\\\"}));\\r\\n }\\r\\n let a = [];\\r\\n let temp = JSON.parse(getMyVar('classlist'));\\r\\n let color = getConfig('chooseColor');\\r\\n\\r\\n let items = {\\r\\n subtype: [\\\"全部形式\\\", \\\"电影\\\", \\\"电视剧\\\", \\\"综艺\\\", \\\"动漫\\\", \\\"纪录片\\\", \\\"短片\\\"],\\r\\n local: [\\\"全部地区\\\", \\\"自定义地区\\\", \\\"中国大陆\\\", \\\"美国\\\", \\\"中国香港\\\", \\\"中国台湾\\\", \\\"日本\\\", \\\"韩国\\\", \\\"英国\\\", \\\"法国\\\", \\\"德国\\\", \\\"意大利\\\", \\\"西班牙\\\", \\\"印度\\\", \\\"泰国\\\", \\\"俄罗斯\\\", \\\"伊朗\\\", \\\"加拿大\\\", \\\"澳大利亚\\\", \\\"爱尔兰\\\", \\\"瑞典\\\", \\\"巴西\\\", \\\"丹麦\\\"],\\r\\n type: [\\\"全部类型\\\", \\\"自定义类型\\\", \\\"剧情\\\", \\\"喜剧\\\", \\\"动作\\\", \\\"爱情\\\", \\\"科幻\\\", \\\"动画\\\", \\\"悬疑\\\", \\\"惊悚\\\", \\\"恐怖\\\", \\\"犯罪\\\", \\\"同性\\\", \\\"音乐\\\", \\\"歌舞\\\", \\\"传记\\\", \\\"历史\\\", \\\"战争\\\", \\\"西部\\\", \\\"奇幻\\\", \\\"冒险\\\", \\\"灾难\\\", \\\"武侠\\\", \\\"\\\\u60c5\\\\u8272\\\"],\\r\\n year: [\\\"全部年代\\\", \\\"自定义年份\\\", \\\"2020年代\\\", \\\"2010年代\\\", \\\"2000年代\\\", \\\"90年代\\\", \\\"80年代\\\", \\\"70年代\\\", \\\"60年代\\\", \\\"更早\\\"],\\r\\n class: [\\\"全部特色\\\", \\\"自定义标签\\\", \\\"经典\\\", \\\"青春\\\", \\\"文艺\\\", \\\"搞笑\\\", \\\"励志\\\", \\\"魔幻\\\", \\\"感人\\\", \\\"女性\\\", \\\"黑帮\\\", \\\"治愈\\\", \\\"美食\\\", \\\"宗教\\\", \\\"小说改编\\\", \\\"超级英雄\\\"]\\r\\n }\\r\\n for (item in items) {\\r\\n for (let i = 0; i < items[item].length; i++) {\\r\\n let title = \\\"\\\";\\r\\n if(temp[item] == items[item][i] || (temp[item] == \\\"\\\" && i == 0)){\\r\\n title = '““””<b> <font color=' + color + '>' + items[item][i] + ' </font></b>';\\r\\n }else{\\r\\n title = items[item][i];\\r\\n }\\r\\n let url = $('hiker://empty#noLoading#').lazyRule((text,item) => {\\r\\n let temp = JSON.parse(getMyVar('classlist'));\\r\\n temp[item] = text.indexOf(\\\"全部\\\") != -1 ? \\\"\\\" : text;\\r\\n putMyVar(\\\"classlist\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, items[item][i], item);\\r\\n \\r\\n if(items[item][i] == \\\"自定义年份\\\"){\\r\\n if(temp.year == \\\"自定义年份\\\"){\\r\\n title = '““””<b> <font color=' + color + '>自定义年份:' + temp.customYear + ' </font></b>';\\r\\n }\\r\\n \\r\\n url = $(temp.customYear, '直接输入具体年份,例如2000').input(() => {\\r\\n let temp = JSON.parse(getMyVar('classlist'));\\r\\n if(input.length == 4){\\r\\n temp.customYear = input;\\r\\n temp.year = \\\"自定义年份\\\";\\r\\n putMyVar(\\\"classlist\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }else{\\r\\n return 'toast://请正确输入'\\r\\n }\\r\\n });\\r\\n }else if(items[item][i] == \\\"自定义地区\\\"){\\r\\n if(temp.local == \\\"自定义地区\\\"){\\r\\n title = '““””<b> <font color=' + color + '>自定义地区:' + temp.customLocal + ' </font></b>';\\r\\n }\\r\\n \\r\\n url = $(temp.customLocal, '直接输入具体地区,例如中国大陆').input(() => {\\r\\n let temp = JSON.parse(getMyVar('classlist'));\\r\\n if(input.length > 0){\\r\\n temp.customLocal = input;\\r\\n temp.local = \\\"自定义地区\\\";\\r\\n putMyVar(\\\"classlist\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }else{\\r\\n return 'toast://请正确输入'\\r\\n }\\r\\n });\\r\\n }else if(items[item][i] == \\\"自定义类型\\\"){\\r\\n if(temp.type == \\\"自定义类型\\\"){\\r\\n title = '““””<b> <font color=' + color + '>自定义类型:' + temp.customType + ' </font></b>';\\r\\n }\\r\\n \\r\\n url = $(temp.customType, '直接输入具体类型,例如剧情').input(() => {\\r\\n let temp = JSON.parse(getMyVar('classlist'));\\r\\n if(input.length > 0){\\r\\n temp.customType = input;\\r\\n temp.type = \\\"自定义类型\\\";\\r\\n putMyVar(\\\"classlist\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }else{\\r\\n return 'toast://请正确输入'\\r\\n }\\r\\n });\\r\\n }else if(items[item][i] == \\\"自定义标签\\\"){\\r\\n if(temp.class == \\\"自定义标签\\\"){\\r\\n title = '““””<b> <font color=' + color + '>自定义标签:' + temp.customClass + ' </font></b>';\\r\\n }\\r\\n \\r\\n url = $(temp.customClass, '直接输入具体标签,例如经典\\\\n可写多个标签,使用\\\"英文逗号\\\"分隔').input(() => {\\r\\n let temp = JSON.parse(getMyVar('classlist'));\\r\\n if(input.length > 0){\\r\\n temp.customClass = input;\\r\\n temp.class = \\\"自定义标签\\\";\\r\\n putMyVar(\\\"classlist\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }else{\\r\\n return 'toast://请正确输入'\\r\\n }\\r\\n });\\r\\n }\\r\\n a.push({\\r\\n title: title,\\r\\n col_type: 'scroll_button',\\r\\n url: url\\r\\n })\\r\\n }\\r\\n a.push({\\r\\n col_type: 'blank_block'\\r\\n })\\r\\n }\\r\\n\\r\\n let rank = {\\r\\n 默认排序: \\\"U\\\",\\r\\n 热度: \\\"T\\\",\\r\\n 评分: \\\"S\\\",\\r\\n 时间: \\\"R\\\"\\r\\n }\\r\\n for (let r in rank) {\\r\\n a.push({\\r\\n title: temp.rank === rank[r] ? '““””<b> <font color=' + color + '>' + r + ' </font></b>' : r,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('classlist'));\\r\\n temp.rank = e;\\r\\n putMyVar(\\\"classlist\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, rank[r])\\r\\n })\\r\\n }\\r\\n\\r\\n a.push({\\r\\n col_type: 'blank_block'\\r\\n })\\r\\n\\r\\n let filter = {\\r\\n 全部影片: '',\\r\\n 仅有片源: 'playable'\\r\\n }\\r\\n for (let r in filter) {\\r\\n a.push({\\r\\n title: temp.filter === filter[r] ? '““””<b> <font color=' + color + '>' + r + ' </font></b>' : r,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('classlist'));\\r\\n temp.filter = e;\\r\\n putMyVar(\\\"classlist\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, filter[r])\\r\\n })\\r\\n }\\r\\n\\r\\n a.push({\\r\\n title: '““””<b> <font color=' + color + '>评分区间:' + temp.score.replace(',', '-') + ' </font></b>',\\r\\n col_type: 'scroll_button',\\r\\n url: $(temp.score.replace(',', '-'), '评分应在0-10之间').input(() => {\\r\\n let temp = JSON.parse(getMyVar('classlist'));\\r\\n let inputs = input.split('-');\\r\\n if (inputs.length == 2 && inputs.every(e => e >= 0 && e <= 10) && parseFloat(inputs[0]) < inputs[1]) {\\r\\n temp.score = input.replace('-', ',');\\r\\n putMyVar(\\\"classlist\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n } else {\\r\\n return 'toast://请正确输入'\\r\\n }\\r\\n })\\r\\n })\\r\\n\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/movie/tag?\\\"\\r\\n + (page ? \\\"start=\\\" + (page - 1) * count\\r\\n + \\\"&count=\\\" + count : \\\"start=0&count=30\\\")\\r\\n + \\\"&q=\\\" + temp.subtype\\r\\n + \\\",\\\" + (temp.local==\\\"自定义地区\\\" ? temp.customLocal : temp.local)\\r\\n + \\\",\\\" + (temp.type==\\\"自定义类型\\\" ? temp.customType : temp.type)\\r\\n + \\\",\\\" + (temp.year==\\\"自定义年份\\\" ? temp.customYear : temp.year)\\r\\n + \\\",\\\" + (temp.class==\\\"自定义标签\\\" ? temp.customClass : temp.class)\\r\\n + \\\"&sort=\\\" + temp.rank + \\\"&score_range=\\\" + temp.score + '&filter=' + temp.filter);\\r\\n let l = s.data;\\r\\n\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n let i = l.map((e => {\\r\\n let type = e.type,\\r\\n id = e.id,\\r\\n title = e.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n return {\\r\\n title: title,\\r\\n col_type: 'movie_3',\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra,\\r\\n img: e.cover_url + \\\"@Referer=\\\" + e.cover_url,\\r\\n desc: e.null_rating_reason || e.rating.value\\r\\n }\\r\\n }));\\r\\n\\r\\n return page > 1 ? i : a.concat(i);\\r\\n}\\r\\n\\r\\n//片单\\r\\nfunction playList(page, count) {\\r\\n if (!getMyVar('playlist')) putMyVar('playlist', '{\\\"subtype\\\":\\\"\\\",\\\"type\\\":\\\"all\\\"}');\\r\\n let a = [];\\r\\n let temp = JSON.parse(getMyVar('playlist', '{\\\"subtype\\\":\\\"\\\",\\\"type\\\":\\\"all\\\"}'));\\r\\n let color = getConfig('chooseColor');\\r\\n\\r\\n let items = {\\r\\n type: {\\r\\n 全部: \\\"all\\\",\\r\\n 豆瓣片单: \\\"official\\\",\\r\\n 精选: \\\"selected\\\",\\r\\n 经典: \\\"classical\\\",\\r\\n 获奖: \\\"prize\\\",\\r\\n 高分: \\\"high_score\\\",\\r\\n 榜单: \\\"movie_list\\\",\\r\\n 冷门佳片: \\\"dark_horse\\\",\\r\\n 主题: \\\"topic\\\",\\r\\n 导演: \\\"director\\\",\\r\\n 演员: \\\"actor\\\",\\r\\n 系列: \\\"series\\\",\\r\\n 华语: \\\"chinese\\\",\\r\\n 欧美: \\\"western\\\",\\r\\n 日本: \\\"japanese\\\",\\r\\n 韩国: \\\"korea\\\",\\r\\n 喜剧: \\\"comedy\\\",\\r\\n 动作: \\\"action\\\",\\r\\n 爱情: \\\"love\\\",\\r\\n 科幻: \\\"science_fiction\\\",\\r\\n 动画: \\\"cartoon\\\",\\r\\n 悬疑: \\\"mystery\\\",\\r\\n 惊悚: \\\"panic\\\",\\r\\n 恐怖: \\\"horrible\\\",\\r\\n 犯罪: \\\"criminal\\\",\\r\\n 同性: \\\"lgbt\\\",\\r\\n 战争: \\\"war\\\",\\r\\n 奇幻: \\\"fantasy\\\",\\r\\n \\\"\\\\u60c5\\\\u8272\\\": \\\"erotica\\\",\\r\\n 音乐: \\\"music\\\",\\r\\n 纪录片: \\\"documentary\\\",\\r\\n 治愈: \\\"cure\\\",\\r\\n 艺术: \\\"art\\\",\\r\\n 黑色幽默: \\\"dark_humor\\\",\\r\\n 青春: \\\"youth\\\",\\r\\n 女性: \\\"female\\\",\\r\\n 真实事件改编: \\\"real_event\\\",\\r\\n 暴力: \\\"violence\\\",\\r\\n 黑白: \\\"black_white\\\",\\r\\n 美食: \\\"food\\\",\\r\\n 旅行: \\\"travel\\\",\\r\\n 儿童: \\\"child\\\",\\r\\n 人性: \\\"humanity\\\",\\r\\n 家庭: \\\"family\\\",\\r\\n 文艺: \\\"literary_art\\\",\\r\\n 小说改编: \\\"novel\\\",\\r\\n 感人: \\\"moving\\\",\\r\\n 励志: \\\"inspiration\\\"\\r\\n },\\r\\n subtype: {\\r\\n 全部: \\\"\\\",\\r\\n 电影: \\\"movie\\\",\\r\\n 电视剧: \\\"tv\\\"\\r\\n }\\r\\n }\\r\\n for (let i in items) {\\r\\n for (let j in items[i]) {\\r\\n a.push({\\r\\n title: temp[i] === items[i][j] ? '““””<b> <font color=' + color + '>' + j + ' </font></b>' : j,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((t) => {\\r\\n let temp = JSON.parse(getMyVar('playlist', '{\\\"subtype\\\":\\\"\\\",\\\"type\\\":\\\"all\\\"}'));\\r\\n temp[t[0]] = t[1];\\r\\n putMyVar(\\\"playlist\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, [i, items[i][j]])\\r\\n })\\r\\n }\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n }\\r\\n\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/skynet/new_playlists\\\" + \\\"?category=\\\" + temp.type + \\\"&subject_type=\\\" + temp.subtype + (page ? \\\"&start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"&start=0&count=10\\\"));\\r\\n let l = s.data[0].items;\\r\\n\\r\\n let i = l.map((e => ({\\r\\n title: e.title,\\r\\n url: $('hiker://empty/$page{fypage}#noHistory#').rule((type, id) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n subjectCollectionList(MY_PAGE, 50, id);\\r\\n }\\r\\n }, e.type, e.id),\\r\\n img: e.cover_url + \\\"@Referer=\\\" + e.cover_url,\\r\\n desc: \\\"共\\\" + e.items_count + \\\"部\\\"\\r\\n })));\\r\\n\\r\\n return page > 1 ? i : a.concat(i);\\r\\n}\\r\\n\\r\\n//榜单\\r\\nfunction rankList(page, count) {\\r\\n if (!getMyVar('rankList')) putMyVar('rankList', '{\\\"type\\\":\\\"movie\\\",\\\"list\\\":\\\"rank_list\\\",\\\"year_lists\\\":[],\\\"category_lists\\\":[],\\\"year\\\":\\\"\\\",\\\"category\\\":\\\"\\\"}');\\r\\n let a = [];\\r\\n let temp = JSON.parse(getMyVar('rankList'));\\r\\n let color = getConfig('chooseColor');\\r\\n\\r\\n let items = {\\r\\n 电影: 'movie',\\r\\n 电视剧: 'tv'\\r\\n }\\r\\n for (let i in items) {\\r\\n a.push({\\r\\n title: temp.type == items[i] ? '““””<b> <font color=' + color + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('rankList'));\\r\\n temp.type = e;\\r\\n putMyVar(\\\"rankList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, items[i])\\r\\n })\\r\\n }\\r\\n\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n\\r\\n let list = {\\r\\n 口碑榜单: 'rank_list',\\r\\n 年度榜单: 'year_ranks',\\r\\n 类型榜单: 'category_ranks'\\r\\n }\\r\\n for (let i in list) {\\r\\n a.push({\\r\\n title: temp.list == list[i] ? '““””<b> <font color=' + color + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('rankList'));\\r\\n temp.list = e;\\r\\n putMyVar(\\\"rankList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, list[i])\\r\\n })\\r\\n }\\r\\n\\r\\n if (temp.list == 'year_ranks' && temp.year_lists.length == 0) {\\r\\n let t = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + temp.type + '/rank_list');\\r\\n temp.year_lists = t.groups[1].tabs;\\r\\n putMyVar('rankList', JSON.stringify(temp));\\r\\n } else if (temp.list == 'category_ranks' && temp.category_lists.length == 0) {\\r\\n let t = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + temp.type + '/rank_list');\\r\\n temp.category_lists = t.groups[2].tabs;\\r\\n putMyVar('rankList', JSON.stringify(temp));\\r\\n }\\r\\n\\r\\n if (temp.list == 'year_ranks') {\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n if (!temp.year) temp.year = temp.year_lists[0].key;\\r\\n for (let t of temp.year_lists) {\\r\\n a.push({\\r\\n title: temp.year == t.key ? '““””<b> <font color=' + color + '>' + t.title + ' </font></b>' : t.title,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('rankList'));\\r\\n temp.year = e;\\r\\n putMyVar(\\\"rankList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, t.key)\\r\\n })\\r\\n }\\r\\n } else if (temp.list == 'category_ranks') {\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n if (!temp.category) temp.category = temp.category_lists[0].key;\\r\\n for (let t of temp.category_lists) {\\r\\n a.push({\\r\\n title: temp.category == t.key ? '““””<b> <font color=' + color + '>' + t.title + ' </font></b>' : t.title,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('rankList'));\\r\\n temp.category = e;\\r\\n putMyVar(\\\"rankList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, t.key)\\r\\n })\\r\\n }\\r\\n }\\r\\n\\r\\n let l = [];\\r\\n if (temp.list == 'rank_list' && MY_PAGE == 1) {\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + temp.type + '/' + temp.list + (page ? \\\"?start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"?start=0&count=10\\\"));\\r\\n l = s.groups[0].selected_collections;\\r\\n } else if (temp.list == 'year_ranks' && MY_PAGE == 1) {\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + temp.type + '/' + temp.list + '?year=' + temp.year + (page ? \\\"&start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"&start=0&count=10\\\"));\\r\\n l = s.groups[0].selected_collections;\\r\\n } else if (temp.list == 'category_ranks') {\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + temp.type + '/' + temp.list + '?category=' + temp.category + (page ? \\\"&start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"&start=0&count=10\\\"));\\r\\n l = s.selected_collections;\\r\\n }\\r\\n\\r\\n let i = [];\\r\\n if (temp.list == 'category_ranks') {\\r\\n i = l.map((e => ({\\r\\n title: '““””' + e.title.bold(),\\r\\n url: $('hiker://empty/$page{fypage}#noHistory#').rule((type, id) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n subjectCollectionList(MY_PAGE, 50, id);\\r\\n }\\r\\n }, e.type, e.id),\\r\\n img: e.cover_url + \\\"@Referer=\\\" + e.cover_url,\\r\\n desc: \\\"共\\\" + e.total + \\\"部\\\"\\r\\n })));\\r\\n } else {\\r\\n i = l.map((e => ({\\r\\n title: '' /*'““””' + e.medium_name + '\\\\n' + getStrongText(e.title)*/ ,\\r\\n col_type: 'card_pic_2',\\r\\n url: $('hiker://empty/$page{fypage}#noHistory#').rule((type, id, stitle) => {\\r\\n setPageTitle(stitle);\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n subjectCollectionList(MY_PAGE, 50, id);\\r\\n }\\r\\n }, e.type, e.id, e.title),\\r\\n img: e.cover_url + \\\"@Referer=\\\" + e.cover_url,\\r\\n desc: \\\"0\\\"\\r\\n })));\\r\\n }\\r\\n\\r\\n return page > 1 ? i : a.concat(i);\\r\\n}\\r\\n\\r\\n//将上映\\r\\nfunction comingList(page, count) {\\r\\n if (!getMyVar('coming')) putMyVar('coming', '{\\\"type\\\":\\\"movie\\\",\\\"rank\\\":\\\"&sortby=hot\\\",\\\"local\\\":\\\"domestic\\\",\\\"area\\\":\\\"\\\",\\\"filter\\\":\\\"\\\"}');\\r\\n let a = [];\\r\\n let temp = JSON.parse(getMyVar('coming'));\\r\\n let color = getConfig('chooseColor');\\r\\n\\r\\n let items = {\\r\\n 电影: 'movie',\\r\\n 电视剧: 'tv'\\r\\n }\\r\\n for (let i in items) {\\r\\n a.push({\\r\\n title: temp.type === items[i] ? '““””<b> <font color=' + color + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('coming'));\\r\\n temp.type = e;\\r\\n putMyVar(\\\"coming\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, items[i])\\r\\n })\\r\\n }\\r\\n let rank = {\\r\\n 热度: '&sortby=hot',\\r\\n 时间: ''\\r\\n }\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n for (let i in rank) {\\r\\n a.push({\\r\\n title: temp.rank === rank[i] ? '““””<b> <font color=' + color + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('coming'));\\r\\n temp.rank = e;\\r\\n putMyVar(\\\"coming\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, rank[i])\\r\\n })\\r\\n }\\r\\n let local = {\\r\\n 国内: 'domestic',\\r\\n 全球: 'international'\\r\\n }\\r\\n if (temp.type == 'movie') {\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n for (let i in local) {\\r\\n a.push({\\r\\n title: temp.local === local[i] ? '““””<b> <font color=' + color + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('coming'));\\r\\n temp.local = e;\\r\\n putMyVar(\\\"coming\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, local[i])\\r\\n })\\r\\n }\\r\\n }\\r\\n let area = {\\r\\n 全部: '',\\r\\n 美国: '&area_filter=american',\\r\\n 欧洲: '&area_filter=europe',\\r\\n 日本: '&area_filter=japanese',\\r\\n 韩国: '&area_filter=korean'\\r\\n }\\r\\n if (temp.type == 'movie' && temp.local == 'international') {\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n for (let i in area) {\\r\\n a.push({\\r\\n title: temp.area === area[i] ? '““””<b> <font color=' + color + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('coming'));\\r\\n temp.area = e;\\r\\n putMyVar(\\\"coming\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, area[i])\\r\\n })\\r\\n }\\r\\n }\\r\\n let filter = {\\r\\n 全部: '',\\r\\n 国产剧: '&type_filter=tv_domestic',\\r\\n 欧美剧: '&type_filter=tv_american',\\r\\n 日剧: '&type_filter=tv_japanese',\\r\\n 韩剧: '&type_filter=tv_korean',\\r\\n 动画: '&type_filter=tv_animation',\\r\\n 国内综艺: '&type_filter=show_domestic',\\r\\n 国外综艺: '&type_filter=show_foreign'\\r\\n }\\r\\n if (temp.type == 'tv') {\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n for (let i in filter) {\\r\\n a.push({\\r\\n title: temp.filter === filter[i] ? '““””<b> <font color=' + color + '>' + i + ' </font></b>' : i,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('coming'));\\r\\n temp.filter = e;\\r\\n putMyVar(\\\"coming\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, filter[i])\\r\\n })\\r\\n }\\r\\n }\\r\\n\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + temp.type + \\\"/coming_soon\\\" + \\\"?area=\\\" + temp.local + temp.rank + temp.area + temp.filter + (page ? \\\"&start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"&start=0&count=10\\\"));\\r\\n let l = s.subjects;\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n\\r\\n let i = l.map((e => {\\r\\n let type = e.type,\\r\\n id = e.id,\\r\\n title = e.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n return {\\r\\n title: title + \\\"(\\\" + e.year + \\\")\\\",\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra,\\r\\n img: e.cover_url + \\\"@Referer=\\\" + e.cover_url,\\r\\n desc: \\\"上映日期:\\\" + e.pubdate + \\\"\\\\n\\\" + e.wish_count + \\\"人想看\\\" + \\\"\\\\n\\\" + e.null_rating_reason\\r\\n }\\r\\n }));\\r\\n\\r\\n return page > 1 ? i : a.concat(i);\\r\\n}\\r\\n\\r\\n//片单详情\\r\\nfunction subjectCollectionList(page, count, id) {\\r\\n if (!getMyVar('ranking')) putMyVar('ranking', '{\\\"item\\\":\\\"movie_real_time_hotest\\\",\\\"playable\\\":\\\"0\\\",\\\"score\\\":\\\"0-10\\\"}');\\r\\n let a = [];\\r\\n let temp = JSON.parse(getMyVar('ranking'));\\r\\n let color = getConfig('chooseColor');\\r\\n\\r\\n let items = {\\r\\n 电影: {\\r\\n 实时热门电影: 'movie_real_time_hotest',\\r\\n 一周口碑电影: 'movie_weekly_best',\\r\\n top250电影: 'movie_top250'\\r\\n },\\r\\n 电视剧: {\\r\\n 实时热门剧集: 'tv_real_time_hotest',\\r\\n 华语口碑剧集: 'tv_chinese_best_weekly',\\r\\n 全球口碑剧集: 'tv_global_best_weekly'\\r\\n },\\r\\n 综艺: {\\r\\n 国内口碑综艺: 'show_chinese_best_weekly',\\r\\n 国外口碑综艺: 'show_global_best_weekly'\\r\\n }\\r\\n }\\r\\n for (let i in items) {\\r\\n for (let j in items[i]) {\\r\\n a.push({\\r\\n title: temp.item == items[i][j] ? '““””<b> <font color=' + color + '>' + j + ' </font></b>' : j,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker://empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('ranking'));\\r\\n temp.item = e;\\r\\n putMyVar(\\\"ranking\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, items[i][j])\\r\\n })\\r\\n }\\r\\n a.push({\\r\\n col_type: \\\"blank_block\\\"\\r\\n })\\r\\n }\\r\\n\\r\\n a.push({\\r\\n col_type: 'blank_block'\\r\\n })\\r\\n\\r\\n let i = [];\\r\\n let playable = {\\r\\n 全部影片: '0',\\r\\n 仅有片源: '1'\\r\\n }\\r\\n for (let r in playable) {\\r\\n i.push({\\r\\n title: temp.playable == playable[r] ? '““””<b> <font color=' + color + '>' + r + ' </font></b>' : r,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('ranking'));\\r\\n temp.playable = e;\\r\\n putMyVar(\\\"ranking\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, playable[r])\\r\\n })\\r\\n }\\r\\n\\r\\n i.push({\\r\\n title: '““””<b> <font color=' + color + '>评分区间:' + temp.score + ' </font></b>',\\r\\n col_type: 'scroll_button',\\r\\n url: $(temp.score, '评分应在0-10之间').input(() => {\\r\\n let temp = JSON.parse(getMyVar('ranking'));\\r\\n let inputs = input.split('-');\\r\\n if (inputs.length == 2 && inputs.every(e => e >= 0 && e <= 10) && parseFloat(inputs[0]) < inputs[1]) {\\r\\n temp.score = input;\\r\\n putMyVar(\\\"ranking\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n } else {\\r\\n return 'toast://请正确输入'\\r\\n }\\r\\n })\\r\\n })\\r\\n\\r\\n let t = getDoubanRes(\\\"https://frodo.douban.com/api/v2/subject_collection/\\\" + (id || temp.item));\\r\\n i.push({\\r\\n title: t.title + '(共' + t.total + '部)',\\r\\n desc: t.description,\\r\\n /*img: t.header_bg_image + \\\"@Referer=\\\" + t.header_bg_image,\\r\\n url: t.header_bg_image + \\\"?type=.jpg@Referer=\\\" + t.header_bg_image + \\\"?type=.jpg\\\",*/\\r\\n url: 'toast://点我干嘛',\\r\\n col_type: \\\"text_1\\\"\\r\\n })\\r\\n\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/subject_collection/\\\" + (id || temp.item) + \\\"/items?\\\" + (page ? \\\"start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"start=0&count=50\\\"));\\r\\n let l = s.subject_collection_items;\\r\\n if (temp.playable == '1') l = l.filter(e => !!e.has_linewatch);\\r\\n if (temp.score != '0-10') {\\r\\n l = l.filter(e => {\\r\\n let r = temp.score.split('-');\\r\\n return e.rating && e.rating.value < r[1] && e.rating.value > r[0];\\r\\n });\\r\\n }\\r\\n\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n let r = l.map((e => {\\r\\n let type = e.type,\\r\\n id = e.id,\\r\\n title = e.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n return {\\r\\n title: title,\\r\\n col_type: 'movie_1_vertical_pic',\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra,\\r\\n img: e.pic.normal + \\\"@Referer=\\\" + e.pic.normal,\\r\\n desc: e.card_subtitle.split(\\\"/\\\").filter(((e, t) => {\\r\\n if (t < 3) return e\\r\\n })).join(\\\",\\\") + \\\"\\\\n\\\" + (e.rating ? computeRating(e.rating.max, e.rating.value) + \\\" \\\" + e.rating.value.toFixed(1) + \\\"分\\\" : \\\"暂无评分\\\")\\r\\n }\\r\\n }));\\r\\n\\r\\n setHomeResult({\\r\\n data: page > 1 ? r : (id ? i.concat(r) : a.concat(i).concat(r))\\r\\n })\\r\\n}\\r\\n\\r\\n//豆列详情\\r\\nfunction douList(id, page, count) {\\r\\n addListener('onClose', 'clearMyVar(\\\"douList\\\")');\\r\\n if (!getMyVar('douList')) putMyVar('douList', '{\\\"playable\\\":\\\"0\\\",\\\"score\\\":\\\"0-10\\\"}');\\r\\n let i = [];\\r\\n let temp = JSON.parse(getMyVar('douList'));\\r\\n let color = getConfig('chooseColor');\\r\\n\\r\\n let playable = {\\r\\n 全部影片: '0',\\r\\n 仅有片源: '1'\\r\\n }\\r\\n for (let r in playable) {\\r\\n i.push({\\r\\n title: temp.playable == playable[r] ? '““””<b> <font color=' + color + '>' + r + ' </font></b>' : r,\\r\\n col_type: 'scroll_button',\\r\\n url: $('hiker: //empty#noLoading#').lazyRule((e) => {\\r\\n let temp = JSON.parse(getMyVar('douList'));\\r\\n temp.playable = e;\\r\\n putMyVar(\\\"douList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n }, playable[r])\\r\\n })\\r\\n }\\r\\n\\r\\n i.push({\\r\\n title: '““””<b> <font color=' + color + '>评分区间:' + temp.score + ' </font></b>',\\r\\n col_type: 'scroll_button',\\r\\n url: $(temp.score, '评分应在0-10之间').input(() => {\\r\\n let temp = JSON.parse(getMyVar('douList'));\\r\\n let inputs = input.split('-');\\r\\n if (inputs.length == 2 && inputs.every(e => e >= 0 && e <= 10) && parseFloat(inputs[0]) < inputs[1]) {\\r\\n temp.score = input;\\r\\n putMyVar(\\\"douList\\\", JSON.stringify(temp));\\r\\n refreshPage();\\r\\n return 'hiker://empty'\\r\\n } else {\\r\\n return 'toast://请正确输入'\\r\\n }\\r\\n })\\r\\n })\\r\\n\\r\\n let t = getDoubanRes(\\\"https://frodo.douban.com/api/v2/doulist/\\\" + id);\\r\\n i.push({\\r\\n title: t.title,\\r\\n desc: '共' + t.items_count + '部(' + t.playable_count + '部可播放)',\\r\\n /*img: t.header_bg_image + \\\"@Referer=\\\" + t.header_bg_image,\\r\\n url: t.header_bg_image + \\\"?type=.jpg@Referer=\\\" + t.header_bg_image + \\\"?type=.jpg\\\",*/\\r\\n url: 'toast://别点我',\\r\\n col_type: \\\"text_1\\\"\\r\\n });\\r\\n\\r\\n let s = getDoubanRes(\\\"https://frodo.douban.com/api/v2/doulist/\\\" + id + \\\"/posts\\\" + '?playable=' + temp.playable + (page ? \\\"&start=\\\" + (page - 1) * count + \\\"&count=\\\" + count : \\\"&start=0&count=50\\\"));\\r\\n let l = s.items;\\r\\n if (temp.score != '0-10') {\\r\\n l = l.filter(e => {\\r\\n let r = temp.score.split('-');\\r\\n return e.content.subject.rating && e.content.subject.rating.value < r[1] && e.content.subject.rating.value > r[0];\\r\\n });\\r\\n }\\r\\n\\r\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\r\\n let r = l.map((e => {\\r\\n let type = e.content.subject.type,\\r\\n id = e.content.subject.id,\\r\\n title = e.content.subject.title;\\r\\n let useConfig = detailsViewConfigs[detailsViewConfigs.use].config;\\r\\n let urlParams = {};\\r\\n if (useConfig.startsWith('{')) {\\r\\n eval('urlParams = ' + useConfig);\\r\\n } else {\\r\\n urlParams.url = $(\\\"hiker://empty#noHistory##immersiveTheme#\\\" + '?type=' + type + '&id=' + id).rule((type, id, title, useConfig) => {\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n if (type === \\\"playlist\\\") {\\r\\n douList(id, MY_PAGE, 50);\\r\\n } else {\\r\\n eval(useConfig);\\r\\n }\\r\\n }, type, id, title, useConfig);\\r\\n }\\r\\n return {\\r\\n title: title,\\r\\n url: urlParams.url,\\r\\n extra: urlParams.extra,\\r\\n img: e.content.subject.pic.normal + \\\"@Referer=\\\" + e.content.subject.pic.normal,\\r\\n desc: e.content.subject.card_subtitle.split(\\\"/\\\").filter(((e, t) => {\\r\\n if (t < 3) return e\\r\\n })).join(\\\",\\\") + \\\"\\\\n\\\" + (e.content.subject.rating ? computeRating(e.content.subject.rating.max, e.content.subject.rating.value) + \\\" \\\" + e.content.subject.rating.value.toFixed(1) + \\\"分\\\" : \\\"暂无评分\\\")\\r\\n }\\r\\n }));\\r\\n\\r\\n setHomeResult({\\r\\n data: page > 1 ? r : i.concat(r)\\r\\n })\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n//视频模块\\r\\nfunction videoUrlsModule(d, type, id, col, lazy, _res, extra) {\\r\\n //col是样式col[0],col[1]分别是tv和movie的样式(tv会有分集信息title会很长)\\r\\n if (!col) col = ['icon_2', 'icon_small_4'];\\r\\n if (!lazy) lazy = 'return input';\\r\\n let res = _res || getDoubanRes(\\\"https://frodo.douban.com/api/v2/\\\" + type + \\\"/\\\" + id);\\r\\n for (let item in res.vendors) {\\r\\n let e = res.vendors[item];\\r\\n if (type === \\\"tv\\\") {\\r\\n d.push({\\r\\n title: e.title + (e.episodes_info ? \\\"•\\\" + e.episodes_info : \\\"\\\"),\\r\\n img: e.icon,\\r\\n col_type: col[0] || \\\"icon_2\\\",\\r\\n url: $('hiker://empty?id=' + id + '&type=' + type + '&title=' + e.title).rule((res, id, e, lazy, extra) => {\\r\\n let title = res.title,\\r\\n pic = res.pic.normal + \\\"@Referer=\\\" + res.pic.normal;\\r\\n setPageTitle(e.title + '-' + title);\\r\\n try {\\r\\n setPagePicUrl(pic);\\r\\n } catch (e) {}\\r\\n eval(JSON.parse(request('hiker://page/main')).rule);\\r\\n let urls = getTvUrls(id, e.id);\\r\\n lazy = $(\\\"\\\").lazyRule(lazy => {\\r\\n let resultUrl = \\\"toast://解析失败\\\";\\r\\n try {\\r\\n if (lazy.startsWith(\\\"(\\\")) {\\r\\n eval('resultUrl = ' + lazy)\\r\\n } else {\\r\\n eval('resultUrl = ' + '(() => {' + lazy + '})()')\\r\\n }\\r\\n } catch (e) {\\r\\n log(e.message)\\r\\n }\\r\\n return resultUrl\\r\\n }, lazy)\\r\\n let d = [];\\r\\n if (typeof(urls) == \\\"object\\\") {\\r\\n let d = [];\\r\\n for (let i = 0; i < urls.length; i++) {\\r\\n d.push({\\r\\n title: '第' + (i + 1) + '集',\\r\\n col_type: 'text_4',\\r\\n url: lazy ? urls[i] + lazy : urls[i],\\r\\n extra: extra\\r\\n })\\r\\n }\\r\\n setResult(d);\\r\\n } else if (typeof(urls) == \\\"string\\\" && urls == '被封ip') {\\r\\n let rule = JSON.parse(request(\\\"hiker://page/releaseIP?rule=青豆\\\"))\\r\\n .rule;\\r\\n eval(rule);\\r\\n } else if (typeof(urls) == 'string' && urls == '没有收录') {\\r\\n let d = [];\\r\\n d.push({\\r\\n title: '豆瓣没有收录此视频源的详细信息',\\r\\n desc: '点我可以去视频源网站看看',\\r\\n col_type: 'text_center_1',\\r\\n url: e.url\\r\\n })\\r\\n setResult(d);\\r\\n }\\r\\n }, res, id, e, lazy, extra)\\r\\n })\\r\\n } else if (type === 'movie') {\\r\\n let mLazy = $(\\\"\\\").lazyRule(lazy => {\\r\\n let resultUrl = \\\"toast://解析失败\\\";\\r\\n try {\\r\\n if (lazy.startsWith(\\\"(\\\")) {\\r\\n eval('resultUrl = ' + lazy)\\r\\n } else {\\r\\n eval('resultUrl = ' + '(() => {' + lazy + '})()')\\r\\n }\\r\\n } catch (e) {\\r\\n log(e.message)\\r\\n }\\r\\n return resultUrl\\r\\n }, lazy)\\r\\n d.push({\\r\\n title: e.title + (e.episodes_info ? \\\"•\\\" + e.episodes_info : \\\"\\\"),\\r\\n img: e.icon,\\r\\n col_type: col[1] || \\\"icon_small_4\\\",\\r\\n url: mLazy ? e.url + mLazy : e.url,\\r\\n extra: extra\\r\\n })\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n//获取电视剧分集链接,id是片子编号,uid是视频源编号\\r\\nfunction getTvUrls(id, uid) {\\r\\n let cookieCache = 'hiker://files/cache/doubancookie.txt';\\r\\n let mUrl = 'https://movie.douban.com/subject/' + id + '/';\\r\\n let headers = {\\r\\n \\\"User-Agent\\\": PC_UA,\\r\\n }\\r\\n if (fileExist(cookieCache)) {\\r\\n headers[\\\"Cookie\\\"] = fetch(cookieCache)\\r\\n }\\r\\n let html = request(mUrl, {\\r\\n headers: headers\\r\\n })\\r\\n if ((html.includes(\\\"登录跳转\\\") && html.includes(\\\"异常请求\\\")) || (html.includes(\\\"window.location.href\\\") && html.includes(\\\"sec.douban\\\"))) {\\r\\n return '被封ip';\\r\\n } else {\\r\\n let s = {\\r\\n qq: 1,\\r\\n youku: 3,\\r\\n letv: 6,\\r\\n mgtv: 7,\\r\\n bilibili: 8,\\r\\n iqiyi: 9,\\r\\n cntv: 12,\\r\\n cctv6: 13,\\r\\n miguvideo: 15,\\r\\n xigua: 17,\\r\\n acfun: 18,\\r\\n maiduidui: 19\\r\\n };\\r\\n let num = s[uid];\\r\\n\\r\\n var sources = {};\\r\\n let sl = html.match(/sources\\\\[[1-9]{1,2}\\\\][\\\\s\\\\S]*?\\\\]/g);\\r\\n if (sl) {\\r\\n for (var i in sl) {\\r\\n eval(sl[i]);\\r\\n }\\r\\n } else {\\r\\n let script_list = parseDomForArray(html, 'body&&script[src]');\\r\\n let sources_url = \\\"\\\";\\r\\n for (let i in script_list) {\\r\\n let url = parseDomForHtml(script_list[i], 'script&&src');\\r\\n if (url.indexOf('mixed_static') !== -1) {\\r\\n sources_url = url;\\r\\n }\\r\\n }\\r\\n let sources_list = request(sources_url).match(/sources\\\\[[1-9]{1,2}\\\\][\\\\s\\\\S]*?\\\\]/g);\\r\\n for (var i in sources_list) {\\r\\n eval(sources_list[i]);\\r\\n }\\r\\n }\\r\\n\\r\\n let ren = sources[num];\\r\\n if (ren && ren.length > 0) {\\r\\n /*var r = ren.map(e => unescape(e.play_link.replace(/(https|http):\\\\/\\\\/www.douban.com\\\\/link2\\\\/\\\\?url=/, '')\\r\\n .split(';')[0].split('.html')[0] + '.html'))*/\\r\\n var r = ren.map(e => unescape(e.play_link.split('?url=')[1].split('&')[0]))\\r\\n\\r\\n }\\r\\n return r || '没有收录';\\r\\n }\\r\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"设置页\",\"path\":\"settingPage\",\"rule\":\"js:\\neval(JSON.parse(request('hiker://page/utils')).rule);\\n\\n//影片详情配置模块\\nfunction detailViewModeModule(d, detailsViewConfigs) {\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\n d.push({\\n title: '自定义影片详情页面'.bold(),\\n col_type: \\\"rich_text\\\"\\n })\\n for (let configKey of Object.keys(detailsViewConfigs)) {\\n if (configKey === 'use') continue;\\n d.push({\\n title: configKey === detailsViewConfigs.use ? \\\"““\\\" + configKey + \\\"””\\\" : configKey,\\n url: $(\\\"hiker://empty#noLoading#\\\").lazyRule(configKey => {\\n let config = JSON.parse(request(getMyVar('qdb_config')))\\n if (config.detailsViewConfigs.use === configKey) {\\n //putMyVar(\\\"input_config_type\\\", '影片详情页面配置')\\n putMyVar(\\\"input_name\\\", configKey);\\n putMyVar(\\\"input_code\\\", config.detailsViewConfigs[configKey].config);\\n putMyVar(\\\"input_setting_code\\\", config.detailsViewConfigs[configKey].setting || \\\"\\\");\\n return 'hiker://page/setting-editor?rule=青豆&view=detailViewModeEditPage';\\n }\\n config.detailsViewConfigs.use = configKey\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config))\\n refreshPage(false);\\n return 'toast://切换成功'\\n }, configKey),\\n col_type: 'flex_button'\\n })\\n }\\n d.push({\\n col_type: 'blank_block'\\n })\\n d.push({\\n title: '➕',\\n col_type: 'flex_button',\\n url: 'hiker://page/setting-editor?rule=青豆&view=detailViewModeEditPage'\\n });\\n d.push({\\n title: '➖',\\n col_type: 'flex_button',\\n url: $(Object.keys(detailsViewConfigs).filter(configKey => configKey !== 'use' && configKey !== '默认'), 2)\\n .select(() => {\\n if (input === '默认') return 'toast://默认配置无法删除!'\\n let config = JSON.parse(request(getMyVar('qdb_config')))\\n if (input === config.detailsViewConfigs.use) return 'toast://该配置正在使用,无法删除!'\\n return $('确认删除\\\"' + input + '\\\"?').confirm((config, configKey) => {\\n delete config.detailsViewConfigs[configKey]\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config))\\n refreshPage(false);\\n return 'toast://删除' + configKey + '成功'\\n }, config, input)\\n })\\n })\\n d.push({\\n title: '📝',\\n col_type: 'flex_button',\\n url: $(Object.keys(detailsViewConfigs).filter(configKey => configKey !== 'use'), 2).select(() => {\\n // if (input === '默认') return 'toast://默认配置无法编辑!'\\n let config = JSON.parse(request(getMyVar('qdb_config')))\\n putMyVar(\\\"input_name\\\", configKey);\\n putMyVar(\\\"input_code\\\", config.detailsViewConfigs[configKey].config);\\n putMyVar(\\\"input_setting_code\\\", config.detailsViewConfigs[configKey].setting || \\\"\\\");\\n return 'hiker://page/setting-editor?rule=青豆&view=detailViewModeEditPage'\\n })\\n })\\n d.push({\\n title: '📥',\\n col_type: 'flex_button',\\n url: $(\\\"\\\", \\\"请输入口令\\\").input(() => {\\n if (!input.includes(\\\"影片详情页面配置\\\")) return \\\"toast://该口令不是影片详情页面配置\\\";\\n eval(JSON.parse(request('hiker://page/utils')).rule)\\n let importConfigs = ConfigTool.import(input);\\n if (!importConfigs) return \\\"toast://似乎出了错,请尝试再次导入~\\\";\\n putMyVar(\\\"input_name\\\", importConfigs.name);\\n putMyVar(\\\"input_code\\\", importConfigs.data.config);\\n putMyVar(\\\"input_setting_code\\\", importConfigs.data.setting || \\\"\\\");\\n return 'hiker://page/setting-editor?rule=青豆&view=detailViewModeEditPage';\\n })\\n })\\n d.push({\\n title: '📤',\\n col_type: 'flex_button',\\n url: $(Object.keys(detailsViewConfigs).filter(configKey => configKey !== 'use'), 2).select(() => {\\n // if (input === '默认') return 'toast://默认配置无法编辑!'\\n eval(JSON.parse(request('hiker://page/utils')).rule)\\n let config = getConfig();\\n let selectConfig = {\\n name: input,\\n data: config.detailsViewConfigs[input]\\n }\\n return $(ConfigTool.encTypeList, 2).select((selectConfig) => {\\n eval(JSON.parse(request('hiker://page/utils')).rule)\\n return ConfigTool.toClipboard(ConfigTool.export(selectConfig.name, selectConfig, \\\"影片详情页面配置\\\", input))\\n }, selectConfig)\\n })\\n })\\n}\\n// 详情页设置模块\\nfunction detailViewSettingModule(d) {\\n let detailsViewConfigs = getConfig('detailsViewConfigs');\\n detailViewModeModule(d, detailsViewConfigs)\\n let detailViewSetting = detailsViewConfigs[detailsViewConfigs.use].setting\\n let result = \\\"toast://该详情页无设置页面\\\";\\n if (detailViewSetting) {\\n try {\\n if (detailViewSetting.indexOf('return') == -1) throw new Error('必须 return @rule=js: 或 $().rule');\\n if (detailViewSetting.startsWith(\\\"(\\\")) {\\n eval('result = ' + detailViewSetting)\\n } else {\\n eval('result = ' + '(() => {' + detailViewSetting + '})()')\\n }\\n } catch (e) {\\n log(e.message);\\n result = \\\"toast://错误的设置页面代码,请前往 日志 查看错误原因\\\"\\n }\\n }\\n d.push({\\n title: '⚙️',\\n col_type: 'flex_button',\\n url: result\\n })\\n}\\n\\n// 首页设置模块\\nfunction homePageSettingModule(d) {\\n let homePageConfigs = getConfig('homePageConfigs');\\n d.push({\\n title: '自定义首页'.bold(),\\n col_type: \\\"rich_text\\\"\\n })\\n for (let configKey of Object.keys(homePageConfigs)) {\\n if (configKey === 'use') continue;\\n d.push({\\n title: configKey === homePageConfigs.use ? \\\"““\\\" + configKey + \\\"””\\\" : configKey,\\n url: $(\\\"hiker://empty#noLoading#\\\").lazyRule(configKey => {\\n let config = JSON.parse(request(getMyVar('qdb_config')))\\n if (config.homePageConfigs.use === configKey) {\\n //putMyVar(\\\"input_config_type\\\", '首页配置')\\n putMyVar(\\\"input_name\\\", configKey);\\n putMyVar(\\\"input_code\\\", config.homePageConfigs[configKey].config);\\n return 'hiker://page/setting-editor?rule=青豆&view=homePageModeEditPage';\\n }\\n config.homePageConfigs.use = configKey\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config))\\n refreshPage(false);\\n return 'toast://切换成功'\\n }, configKey),\\n col_type: 'flex_button'\\n })\\n }\\n d.push({\\n col_type: 'blank_block'\\n })\\n d.push({\\n title: '➕',\\n col_type: 'flex_button',\\n url: 'hiker://page/setting-editor?view=homePageModeEditPage'\\n });\\n d.push({\\n title: '➖',\\n col_type: 'flex_button',\\n url: $(Object.keys(homePageConfigs).filter(configKey => configKey !== 'use' && configKey !== '默认'), 2)\\n .select(() => {\\n if (input === '默认') return 'toast://默认配置无法删除!'\\n let config = JSON.parse(request(getMyVar('qdb_config')))\\n if (input === config.homePageConfigs.use) return 'toast://该配置正在使用,无法删除!'\\n return $('确认删除\\\"' + input + '\\\"?').confirm((config, configKey) => {\\n delete config.homePageConfigs[configKey]\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config))\\n refreshPage(false);\\n return 'toast://删除' + configKey + '成功'\\n }, config, input)\\n })\\n })\\n d.push({\\n title: '📝',\\n col_type: 'flex_button',\\n url: $(Object.keys(homePageConfigs).filter(configKey => configKey !== 'use'), 2).select(() => {\\n // if (input === '默认') return 'toast://默认配置无法编辑!'\\n let config = JSON.parse(request(getMyVar('qdb_config')));\\n let configKey = input;\\n putMyVar(\\\"input_name\\\", configKey);\\n putMyVar(\\\"input_code\\\", config.homePageConfigs[configKey].config);\\n return 'hiker://page/setting-editor?rule=青豆&view=homePageModeEditPage';\\n })\\n })\\n d.push({\\n title: '📥',\\n col_type: 'flex_button',\\n url: $(\\\"\\\", \\\"请输入口令\\\").input(() => {\\n if (!input.includes(\\\"首页配置\\\")) return \\\"toast://该口令不是首页配置\\\";\\n eval(JSON.parse(request('hiker://page/utils')).rule)\\n let importConfigs = ConfigTool.import(input);\\n if (!importConfigs) return \\\"toast://似乎出了错,请尝试再次导入~\\\";\\n putMyVar(\\\"input_name\\\", importConfigs.name);\\n putMyVar(\\\"input_code\\\", importConfigs.data.config);\\n return 'hiker://page/setting-editor?rule=青豆&view=homePageModeEditPage';\\n })\\n })\\n d.push({\\n title: '📤',\\n col_type: 'flex_button',\\n url: $(Object.keys(homePageConfigs).filter(configKey => configKey !== 'use'), 2).select(() => {\\n // if (input === '默认') return 'toast://默认配置无法编辑!'\\n eval(JSON.parse(request('hiker://page/utils')).rule)\\n let config = getConfig();\\n let selectConfig = {\\n name: input,\\n data: config.homePageConfigs[input]\\n }\\n return $(ConfigTool.encTypeList, 2).select((selectConfig) => {\\n eval(JSON.parse(request('hiker://page/utils')).rule)\\n return ConfigTool.toClipboard(ConfigTool.export(selectConfig.name, selectConfig, \\\"首页配置\\\", input))\\n }, selectConfig)\\n })\\n })\\n}\\n\\n// 解析配置模块\\nfunction analysisModeModule(d, analysisConfigs) {\\n d.push({\\n title: '自定义解析插件'.bold(),\\n col_type: \\\"rich_text\\\"\\n })\\n for (let configKey of Object.keys(analysisConfigs)) {\\n if (configKey === 'use') continue;\\n d.push({\\n title: configKey === analysisConfigs.use ? \\\"““\\\" + configKey + \\\"””\\\" : configKey,\\n url: $(\\\"hiker://empty#noLoading#\\\").lazyRule(configKey => {\\n let config = JSON.parse(request(getMyVar('qdb_config')))\\n if (config.analysisConfigs.use === configKey) {\\n //putMyVar(\\\"input_config_type\\\", '解析插件配置')\\n putMyVar(\\\"input_name\\\", configKey);\\n putMyVar(\\\"input_code\\\", config.analysisConfigs[configKey].config);\\n putMyVar(\\\"input_extra\\\", config.analysisConfigs[configKey].extra || \\\"\\\");\\n putMyVar(\\\"input_setting_code\\\", config.analysisConfigs[configKey].setting || \\\"\\\");\\n return 'hiker://page/setting-editor?rule=青豆&view=analysisModeEditPage';\\n }\\n config.analysisConfigs.use = configKey\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config))\\n refreshPage(false);\\n return 'toast://切换成功'\\n }, configKey),\\n col_type: 'flex_button'\\n })\\n }\\n d.push({\\n col_type: 'blank_block'\\n })\\n d.push({\\n title: '➕',\\n col_type: 'flex_button',\\n url: 'hiker://page/setting-editor?rule=青豆&view=analysisModeEditPage'\\n });\\n d.push({\\n title: '➖',\\n col_type: 'flex_button',\\n url: $(Object.keys(analysisConfigs).filter(configKey => configKey !== 'use' && configKey !== '不解析' && configKey !== '断插'), 2)\\n .select(() => {\\n if (input === '不解析' && input === '断插') return 'toast://默认解析无法删除!'\\n let config = JSON.parse(request(getMyVar('qdb_config')))\\n if (input === config.analysisConfigs.use) return 'toast://该解析正在使用,无法删除!'\\n return $('确认删除\\\"' + input + '\\\"?').confirm((config, configKey) => {\\n delete config.analysisConfigs[configKey]\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config))\\n refreshPage(false);\\n return 'toast://删除' + configKey + '成功'\\n }, config, input)\\n })\\n })\\n d.push({\\n title: '📝',\\n col_type: 'flex_button',\\n url: $(Object.keys(analysisConfigs).filter(configKey => configKey !== 'use'), 2)\\n .select(() => {\\n // if (input === '不解析' && input === '断插') return 'toast://默认解析无法编辑!'\\n let config = JSON.parse(request(getMyVar('qdb_config')));\\n let configKey = input;\\n putMyVar(\\\"input_name\\\", configKey);\\n putMyVar(\\\"input_code\\\", config.analysisConfigs[configKey].config);\\n putMyVar(\\\"input_extra\\\", config.analysisConfigs[configKey].extra || \\\"\\\");\\n putMyVar(\\\"input_setting_code\\\", config.analysisConfigs[configKey].setting || \\\"\\\");\\n return 'hiker://page/setting-editor?rule=青豆&view=analysisModeEditPage';\\n })\\n })\\n d.push({\\n title: '📥',\\n col_type: 'flex_button',\\n url: $(\\\"\\\", \\\"请输入口令\\\").input(() => {\\n if (!input.includes(\\\"解析插件配置\\\")) return \\\"toast://该口令不是解析插件配置\\\";\\n eval(JSON.parse(request('hiker://page/utils')).rule)\\n let importConfigs = ConfigTool.import(input);\\n if (!importConfigs) return \\\"toast://似乎出了错,请尝试再次导入~\\\";\\n putMyVar(\\\"input_name\\\", importConfigs.name);\\n putMyVar(\\\"input_code\\\", importConfigs.data.config);\\n putMyVar(\\\"input_extra\\\", importConfigs.data.extra || \\\"\\\");\\n putMyVar(\\\"input_setting_code\\\", importConfigs.data.setting || \\\"\\\");\\n return 'hiker://page/setting-editor?rule=青豆&view=analysisModeEditPage';\\n })\\n })\\n d.push({\\n title: '📤',\\n col_type: 'flex_button',\\n url: $(Object.keys(analysisConfigs).filter(configKey => configKey !== 'use'), 2).select(() => {\\n // if (input === '默认') return 'toast://默认配置无法编辑!'\\n eval(JSON.parse(request('hiker://page/utils')).rule)\\n let config = getConfig();\\n let selectConfig = {\\n name: input,\\n data: config.analysisConfigs[input]\\n }\\n return $(ConfigTool.encTypeList, 2).select((selectConfig) => {\\n eval(JSON.parse(request('hiker://page/utils')).rule)\\n return ConfigTool.toClipboard(ConfigTool.export(selectConfig.name, selectConfig, \\\"解析插件配置\\\", input))\\n }, selectConfig)\\n })\\n })\\n}\\n\\n// 解析设置模块\\nfunction analysisSettingModule(d) {\\n let analysisConfigs = getConfig('analysisConfigs');\\n analysisModeModule(d, analysisConfigs);\\n /**\\n * 这下面的都是拿设置页面的配置出来 eval 执行,最终获得插件设置页面的 url,这个 url 可以是网页也可以是二级界面\\n */\\n let analysisSetting = analysisConfigs[analysisConfigs.use].setting;\\n let result = \\\"toast://该插件无设置页面\\\";\\n if (analysisSetting) {\\n try {\\n if (analysisSetting.indexOf('return') == -1) throw new Error('必须 return @rule=js: 或 $().rule');\\n if (analysisSetting.startsWith(\\\"(\\\")) {\\n eval('result = ' + analysisSetting);\\n } else {\\n eval('result = ' + '(() => {' + analysisSetting + '})()');\\n }\\n } catch (e) {\\n log(e.message);\\n result = \\\"toast://错误的设置页面代码,请前往 日志 查看错误原因\\\"\\n }\\n }\\n d.push({\\n title: '⚙️',\\n col_type: 'flex_button',\\n url: result\\n })\\n}\\n\\n//自定义快速搜索模块\\nfunction quickSearchDIYModule(d, config) {\\n let quickSearchConfigs = getConfig('quickSearchConfigs', config);\\n d.push({\\n title: '自定义快速搜索'.bold(),\\n col_type: \\\"rich_text\\\"\\n })\\n for (let configKey of quickSearchConfigs.order) {\\n d.push({\\n title: configKey,\\n url: $('➕是添加\\\\n➖是删除\\\\n📝是修改\\\\n🔁是排序\\\\n⚙️是设置样式').confirm(() => {\\n return 'toast://下次不要再点我了'\\n }),\\n col_type: 'flex_button'\\n })\\n }\\n d.push({\\n col_type: 'blank_block'\\n })\\n d.push({\\n title: '➕️',\\n col_type: 'flex_button',\\n url: $('显示名@@小程序名@@图片链接', '根据提示输入就好了\\\\n小程序名为空则为海阔搜索').input(() => {\\n let config = JSON.parse(fetch(getMyVar('qdb_config')));\\n input = input.split('@@');\\n if(input.length != 3 || input[0] === \\\"\\\") return \\\"toast://格式不对,按格式输入!\\\";\\n if (config.quickSearchConfigs.order.indexOf(input[0]) == -1) config.quickSearchConfigs.order.push(input[0]);\\n config.quickSearchConfigs[input[0]] = {\\n name: input[1],\\n pic: input[2]\\n };\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config));\\n refreshPage(false);\\n return 'toast://添加成功';\\n })\\n });\\n d.push({\\n title: '➖',\\n col_type: 'flex_button',\\n url: $(quickSearchConfigs.order, 2).select(() => {\\n let config = JSON.parse(request(getMyVar('qdb_config')))\\n return $('确认删除\\\"' + input + '\\\"?').confirm((config, configKey) => {\\n let index = config.quickSearchConfigs.order.indexOf(configKey);\\n config.quickSearchConfigs.order.splice(index, 1);\\n delete config.quickSearchConfigs[configKey]\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config))\\n refreshPage(false);\\n return 'toast://删除' + configKey + '成功'\\n }, config, input)\\n })\\n })\\n d.push({\\n title: '📝',\\n col_type: 'flex_button',\\n url: $(quickSearchConfigs.order, 2).select(() => {\\n let config = JSON.parse(request(getMyVar('qdb_config')));\\n let quickSearchConfigs = config.quickSearchConfigs;\\n let dtext = input + '@@' + quickSearchConfigs[input].name + '@@' + quickSearchConfigs[input].pic;\\n return $(dtext, '请修改').input((config, raw) => {\\n input = input.split('@@');\\n if (raw != input[0]) {\\n let index = config.quickSearchConfigs.order.indexOf(raw);\\n config.quickSearchConfigs.order[index] = input[0];\\n delete config.quickSearchConfigs[raw];\\n }\\n if (config.quickSearchConfigs.order.indexOf(input[0]) == -1) config.quickSearchConfigs.order.push(input[0]);\\n config.quickSearchConfigs[input[0]] = {\\n name: input[1],\\n pic: input[2]\\n };\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config));\\n refreshPage(false);\\n return 'toast://修改成功';\\n }, config, input)\\n })\\n })\\n d.push({\\n title: '🔁',\\n col_type: 'flex_button',\\n url: $('hiker://empty#noHistory#').rule(() => {\\n addListener('onClose', $.toString(() => {\\n clearMyVar('json');\\n clearMyVar('op');\\n }))\\n if (getMyVar('json') == \\\"\\\") {\\n let config = JSON.parse(request(getMyVar('qdb_config')));\\n let quickSearchConfigs = config.quickSearchConfigs;\\n putMyVar('json', JSON.stringify(quickSearchConfigs));\\n }\\n\\n let old = JSON.parse(getMyVar('json'));\\n let d = [];\\n d.push({\\n title: '分别点击两项以交换顺序\\\\n‘‘排序完毕后点我保存排序,否则排序不生效’’',\\n col_type: 'text_center_1',\\n url: $('#noLoading#').lazyRule(() => {\\n let config = JSON.parse(fetch(getMyVar('qdb_config')));\\n config.quickSearchConfigs = JSON.parse(getMyVar('json'));\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config));\\n back(true);\\n return 'toast://修改成功'\\n })\\n })\\n old.order.forEach((value, index) => {\\n d.push({\\n title: getMyVar('op') == value ? value + '‘‘(当前选中)’’' : value,\\n col_type: 'text_1',\\n url: $().lazyRule((key, index) => {\\n let op = getMyVar('op');\\n if (op == '') {\\n putMyVar('op', key);\\n refreshPage();\\n return 'hiker://empty'\\n } else if (op == key) {\\n clearMyVar('op');\\n refreshPage();\\n return 'hiker://empty'\\n } else {\\n let old = JSON.parse(getMyVar('json'));\\n let newa = {\\n mode: old.mode,\\n order: old.order\\n };\\n let opindex = newa.order.indexOf(op);\\n if (Math.abs(opindex - index) == 1) {\\n newa.order[opindex] = key;\\n newa.order[index] = op;\\n } else if (opindex > index) {\\n newa.order.splice(opindex, 1);\\n newa.order.splice(index, 0, op);\\n } else {\\n newa.order.splice(opindex, 1);\\n newa.order.splice(index - 1, 0, op);\\n }\\n newa.order.forEach(value => newa[value] = old[value])\\n putMyVar('json', JSON.stringify(newa));\\n clearMyVar('op');\\n refreshPage();\\n return 'hiker://empty'\\n }\\n }, value, index)\\n })\\n })\\n setResult(d);\\n })\\n })\\n d.push({\\n title: '⚙️',\\n col_type: 'flex_button',\\n url: $(quickSearchConfigs['mode'] || \\\"\\\", '请正确输入组件样式\\\\n建议值:flex_button scroll_button icon_round_small_4 icon_small_4').input(() => {\\n let config = JSON.parse(request(getMyVar('qdb_config')));\\n config.quickSearchConfigs.mode = input;\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config));\\n refreshPage(false);\\n return 'toast://样式修改成功'\\n })\\n })\\n}\\n\\n//设置页面\\nfunction settingPage() {\\n let conf = getConfig();\\n let d = [];\\n\\n let starColor = conf.starColor || '#ffac2d';\\n d.push({\\n title: '““””' + '自定义星星颜色'.bold(),\\n desc: '““””<font color=' + starColor + '>' + '★★★★★</font>',\\n col_type: 'text_1',\\n url: $(starColor, '别忘了#').input(() => {\\n let config = JSON.parse(fetch(getMyVar('qdb_config')));\\n config.starColor = input;\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config));\\n refreshPage();\\n return \\\"toast://设置更改已保存\\\";\\n })\\n })\\n let chooseColor = conf.chooseColor || '#FA7298';\\n d.push({\\n title: '““””' + '自定义选中标签颜色'.bold(),\\n desc: '““””<font color=' + chooseColor + '>' + '我是预览效果</font>',\\n col_type: 'text_1',\\n url: $(chooseColor, '别忘了#').input(() => {\\n let config = JSON.parse(fetch(getMyVar('qdb_config')));\\n config.chooseColor = input;\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config));\\n refreshPage();\\n return \\\"toast://设置更改已保存\\\";\\n })\\n })\\n\\n homePageSettingModule(d);\\n d.push({\\n col_type: 'line'\\n })\\n\\n quickSearchDIYModule(d, conf);\\n d.push({\\n col_type: 'line'\\n })\\n\\n detailViewSettingModule(d);\\n d.push({\\n col_type: 'line'\\n })\\n\\n if (true/*getItem('password') == 'true'*/) {\\n analysisSettingModule(d);\\n d.push({\\n col_type: 'line'\\n })\\n }\\n\\n d.push({\\n title: '““””' + '恢复默认设置'.bold(),\\n desc: '重生',\\n col_type: 'text_1',\\n url: $(['重置星星颜色', '重置选中标签颜色', '重置快速搜索', '重置首页为默认', '重置详情页' , '清除全部设置'], 1).select(() => {\\n return $(\\\"确定要\\\" + input + \\\"?\\\").confirm((sel) => {\\n let item = '';\\n switch (sel) {\\n case '重置星星颜色':\\n item = 'starColor';\\n break;\\n case '重置选中标签颜色':\\n item = 'chooseColor';\\n break;\\n case '重置快速搜索':\\n item = 'quickSearchConfigs';\\n break;\\n case '重置首页为默认':\\n item = 'homePageConfigs';\\n break;\\n case '重置详情页':\\n item = 'detailViewConfigs';\\n break;\\n case '清除全部设置':\\n item = 'all';\\n break;\\n }\\n // eval(JSON.parse(request('hiker://page/settingPage')).rule);\\n let defaultConfigs = $.require(\\\"hiker://page/defaultConfigs\\\");\\n if (item == 'all') {\\n writeFile(getMyVar('qdb_config'), JSON.stringify(defaultConfigs));\\n refreshPage();\\n return \\\"toast://已\\\" + sel;\\n } else if(item == \\\"homePageConfigs\\\"){\\n let config = JSON.parse(fetch(getMyVar('qdb_config')));\\n config[item][\\\"默认\\\"] = defaultConfigs[item][\\\"默认\\\"];\\n config[item].use = \\\"默认\\\";\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config));\\n refreshPage();\\n return \\\"toast://已\\\" + sel;\\n }else {\\n let config = JSON.parse(fetch(getMyVar('qdb_config')));\\n config[item] = defaultConfigs[item];\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config));\\n refreshPage();\\n return \\\"toast://已\\\" + sel;\\n }\\n }, input)\\n })\\n })\\n setResult(d);\\n}\\n\\nlet view = getParam(\\\"view\\\",\\\"\\\");\\nif(view==\\\"\\\"){\\n setPageTitle(\\\"设置\\\")\\n settingPage();\\n}else if(view==\\\"analysisSettingModule\\\"){\\n let d = [];\\n setPageTitle(\\\"解析设置\\\")\\n analysisSettingModule(d);\\n setResult(d);\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"默认配置\",\"path\":\"defaultConfigs\",\"rule\":\"js:\\r\\nlet defaultConfigs = {\\r\\n starColor: \\\"#ffac2d\\\",\\r\\n chooseColor: \\\"#FA7298\\\",\\r\\n quickSearchConfigs: {\\r\\n mode: \\\"scroll_button\\\",\\r\\n order: [\\\"海阔搜索\\\"],\\r\\n \\\"海阔搜索\\\": {\\r\\n name: \\\"\\\",\\r\\n pic: \\\"\\\"\\r\\n }\\r\\n },\\r\\n detailsViewConfigs: {\\r\\n use: \\\"默认\\\",\\r\\n \\\"默认\\\": {\\r\\n config: \\\"eval(JSON.parse(request('hiker://page/main')).rule);detailsView(type, id);\\\"\\r\\n }\\r\\n },\\r\\n homePageConfigs:{\\r\\n use: \\\"默认\\\",\\r\\n \\\"默认\\\": {\\r\\n config: `let d = [];\\r\\nd.push({\\r\\n title: '',\\r\\n img: 'https://gitcode.net/qq_41846756/hiker/-/raw/master/img/豆瓣.png',\\r\\n desc: '0',\\r\\n col_type: 'card_pic_1',\\r\\n url: 'hiker://page/settingPage'\\r\\n})\\r\\n\\r\\nlet s = [\\\"推荐\\\", \\\"热门\\\", \\\"分类\\\", \\\"片单\\\", \\\"榜单\\\", \\\"将上映\\\"];\\r\\nlet img = \\\"https://gitcode.net/qq_41846756/hiker/-/raw/master/img/\\\";\\r\\nfor (let i in s) {\\r\\n d.push({\\r\\n title: s[i],\\r\\n img: img + s[i] + '.jpg',\\r\\n col_type: 'icon_2',\\r\\n url: \\\"hiker://empty\\\" + '$page{fypage}/#/' + s[i] + \\\"#noHistory#\\\"\\r\\n })\\r\\n}\\r\\nreturn d;`\\r\\n }\\r\\n },\\r\\n analysisConfigs: {\\r\\n use: \\\"不解析\\\",\\r\\n \\\"不解析\\\": {\\r\\n config: $.toString(() => {\\r\\n return input;\\r\\n }),\\r\\n setting: $.toString(() => {\\r\\n return \\\"toast://该插件无设置页面\\\";\\r\\n })\\r\\n },\\r\\n \\\"断插\\\": {\\r\\n config: $.toString(() => {\\r\\n let file = \\\"hiker://files/rules/DuanNian/MyParse.json\\\";\\r\\n let oldfile = \\\"hiker://files/cache/MyParseSet.json\\\";\\r\\n if (fileExist(file)) {\\r\\n eval('json=' + fetch(file));\\r\\n let jsUrl = json.settings.cj;\\r\\n eval(fetch(jsUrl));\\r\\n return aytmParse(input);\\r\\n } else if (fileExist(oldfile)) {\\r\\n let jsUrl = JSON.parse(fetch(oldfile)).cj;\\r\\n eval(fetch(jsUrl));\\r\\n return aytmParse(input);\\r\\n } else {\\r\\n return 'toast://没找到断插配置文件';\\r\\n }\\r\\n }),\\r\\n setting: $.toString(() => {\\r\\n let file = \\\"hiker://files/rules/DuanNian/MyParse.json\\\";\\r\\n let oldfile = \\\"hiker://files/cache/MyParseSet.json\\\";\\r\\n if (fileExist(file)) {\\r\\n eval('json=' + fetch(file));\\r\\n let jsUrl = json.settings.cj;\\r\\n eval(fetch(jsUrl));\\r\\n return setUrl;\\r\\n } else if (fileExist(oldfile)) {\\r\\n let jsUrl = JSON.parse(fetch(oldfile)).cj;\\r\\n eval(fetch(jsUrl));\\r\\n return setUrl;\\r\\n } else {\\r\\n return \\\"hiker://page/Route?rule=MyFieldᴰⁿ&type=设置\\\";\\r\\n }\\r\\n })\\r\\n }\\r\\n }\\r\\n}\\r\\n$.exports = defaultConfigs;\"},{\"col_type\":\"movie_3\",\"name\":\"工具集\",\"path\":\"utils\",\"rule\":\"js:\\r\\n//初始化配置,name为配置项名称\\r\\nfunction initConfigs(name, config) {\\r\\n if (!config) {\\r\\n config = JSON.parse(fetch(getMyVar('qdb_config')));\\r\\n }\\r\\n if (config[name] == null) {\\r\\n let defaultConfigs = $.require(\\\"hiker://page/defaultConfigs\\\");\\r\\n config[name] = defaultConfigs[name] ? defaultConfigs[name] : {};\\r\\n writeFile(getMyVar('qdb_config'), JSON.stringify(config));\\r\\n }\\r\\n return config;\\r\\n}\\r\\n\\r\\n//获取配置项\\r\\nfunction getConfig(name, rootConfig) {\\r\\n let config = rootConfig ? rootConfig : JSON.parse(fetch(getMyVar('qdb_config')));\\r\\n if (name) {\\r\\n if (config[name] == null) {\\r\\n config = initConfigs(name, config);\\r\\n }\\r\\n return config[name];\\r\\n } else {\\r\\n return config;\\r\\n }\\r\\n}\\r\\n\\r\\n//编码工具类\\r\\nlet ZipTool = {\\r\\n dependence: 'https://unpkg.com/lz-string@1.4.4/libs/lz-string.min.js',\\r\\n compress: {\\r\\n size: {\\r\\n key: \\\"text-compress-size\\\",\\r\\n set: (newValue) => {\\r\\n putMyVar(this.key, newValue.toString())\\r\\n },\\r\\n get: () => {\\r\\n return parseInt(getMyVar(this.key, \\\"0\\\"))\\r\\n }\\r\\n },\\r\\n exec: (input) => {\\r\\n eval(request(ZipTool.dependence))\\r\\n let result = LZString.compressToEncodedURIComponent(input)\\r\\n // ZipTool.compress.size.set(result.length * 2)\\r\\n return result\\r\\n }\\r\\n },\\r\\n decompress: {\\r\\n size: {\\r\\n get: () => {\\r\\n return getMyVar(\\\"text-decompress\\\", \\\"0\\\")\\r\\n .length\\r\\n }\\r\\n },\\r\\n exec: (input) => {\\r\\n eval(request(ZipTool.dependence))\\r\\n let result = LZString.decompressFromEncodedURIComponent(input)\\r\\n return result\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n// 配置项工具类\\r\\nlet ConfigTool = {\\r\\n encTypeList: ['Base64', 'Zipper'].concat(getPastes()),\\r\\n toClipboard: (configCommand, name) => {\\r\\n if (configCommand.startsWith('toast://')) return configCommand\\r\\n if (!name) {\\r\\n let commandSplits = configCommand.split(\\\"¥\\\")\\r\\n name = commandSplits[2]\\r\\n name = name ? (\\\"“\\\" + name + \\\"”\\\") : ''\\r\\n }\\r\\n refreshPage(false);\\r\\n return \\\"copy://\\\" + configCommand + \\\".js:'toast://导出\\\" + name + \\\"成功!'\\\";\\r\\n },\\r\\n export: (name, config, remark, encType) => {\\r\\n let symbol = \\\"青豆口令¥\\\" + remark + \\\"¥\\\" + name + \\\"¥\\\" + encType + \\\"¥\\\";\\r\\n let result = config\\r\\n if (typeof result === \\\"object\\\") {\\r\\n result = JSON.stringify(config);\\r\\n } else if (typeof result === \\\"string\\\") {\\r\\n result = config;\\r\\n } else {\\r\\n throw \\\"导出数据不合法\\\"\\r\\n }\\r\\n switch (encType) {\\r\\n case 'Base64':\\r\\n result = base64Encode(result);\\r\\n break;\\r\\n case 'Zipper':\\r\\n result = ZipTool.compress.exec(result)\\r\\n break;\\r\\n default :\\r\\n if (getAppVersion() > 2070) {\\r\\n symbol = \\\"青豆口令¥\\\" + remark + \\\"¥\\\" + name\\r\\n result = sharePaste(ConfigTool.export(name, config, remark, 'Zipper'),encType);\\r\\n return result + '\\\\n\\\\n' + symbol\\r\\n } else {\\r\\n return 'toast://请更新视界版本至 C2070 以上'\\r\\n }\\r\\n break;\\r\\n }\\r\\n result = symbol + result\\r\\n return result;\\r\\n },\\r\\n import: (configCommand) => {\\r\\n let result = ''\\r\\n if (configCommand.startsWith('云')) {\\r\\n if (getAppVersion() > 2070) {\\r\\n result = configCommand.split('青豆')[0].replace(/\\\\\\\\n/, '')\\r\\n configCommand = parsePaste(result)\\r\\n } else {\\r\\n return 'toast://请更新视界版本至 C2070 以上'\\r\\n }\\r\\n }\\r\\n try {\\r\\n let resultSplits = configCommand.split(\\\"¥\\\")\\r\\n let encType = resultSplits[3]\\r\\n result = resultSplits[4]\\r\\n switch (encType) {\\r\\n case 'Base64':\\r\\n result = base64Decode(result);\\r\\n break;\\r\\n case 'Zipper':\\r\\n result = ZipTool.decompress.exec(result)\\r\\n break;\\r\\n }\\r\\n result = JSON.parse(result);\\r\\n } catch (e) {\\r\\n log(e.message)\\r\\n throw \\\"导入数据不合法\\\"\\r\\n }\\r\\n return result;\\r\\n }\\r\\n}\"}]","proxy":"","icon":"https://gitcode.net/qq_41846756/hiker/-/raw/master/img/青豆.png"},{"firstHeader":"sort","last_chapter_rule":"","title":"道长仓库Pro","author":"@LoyDgIk","version":163,"type":"tool","url":"hiker://empty","col_type":"icon_2_round","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nconst {\n getApi,\n color,\n small,\n getFile,\n htmlTag,\n api,\n md\n} = $.require(\"hiker://page/utiliy\");\nvar r = $.require('hiker://page/notice');\n\n\nconst lsg = $.require(\"hiker://page/localStorage?rule=道长仓库Pro\");\nlet classA = getVar(\"Warehouse.class\", \"0\");\nlet listUrl = getApi(\"usersUrl\") + classA,\n myUrl = getApi(\"devSelf\"),\n noticeUrl = getApi(\"noticeUrl\");\n// myUrl = getApi(\"rulesAllUrl\");\nputVar(\"Warehouse.filter\", \"\");\nvar noWait = true; //无需重试\nvar timeout = 500;\nvar tmp_headers = {\n timeout: timeout\n};\ntry {\n var userList = JSON.parse(request(listUrl, tmp_headers)).result,\n notices=JSON.parse(request(noticeUrl, tmp_headers)).result,\n nowCon = 0,\n ruleCount = JSON.parse(request(getApi(\"ruleCountUrl\"), tmp_headers)).result;\n} catch (e) {\n noWait = false;\n setResult([{\n title: '仓库同时访问量过大或网络差,繁忙中...\\n请耐心等待稍后再试',\n desc: '点击尝试重新访问',\n col_type: 'text_1',\n url: $('#noLoading#').lazyRule(() => {\n refreshPage(false);\n return 'toast://已刷新'\n })\n }]);\n}\nif (noWait) {\n let data = [];\n //log(notices);\n if(notices.length>0){\n // let info = '道长仓库预计于2024年3月中旬下架停止运营,请各位开发者大佬妥善备份好自己的规则,插件,主题等数据';\n // let msg=info;\n //msg=info.slice(0,20)+'...';\n let msg='🔔'+notices[0].name+':'+notices[0].content_text;\n let notice_color=notices[0].color||'#ff7000';\n let info=notices.map(it=>`<h2>${it.name} ${it.publish_time}</h2>`+it.content).join('\\n');\n r.show(data, msg, notice_color,null,info);\n \n //r.show(data, msg,\"red\");\n//r.show(data, msg,\"red\",undefined, \"详细公告\");\n\n//r.show(d, msg,\"red\", \"web://https://baidu.com\");\n }\n \n \n let classTab = [\n [\"上次活跃\", \"0\"],\n [\"规则数\", \"1\"],\n [\"注册时间\", \"-1\"]\n ]\n for (let item of classTab) {\n data.push({\n title: item[1] === classA ? \"““\" + item[0] + \"””\" : item[0],\n url: $(\"#noLoading#\").lazyRule((key) => {\n putVar(\"Warehouse.class\", key);\n refreshPage(false);\n return \"hiker://empty\";\n }, item[1]),\n col_type: \"scroll_button\"\n });\n }\n data.push({\n title: \"全部规则\",\n url: \"hiker://page/AllPublicRule?url=hiker://empty#fypage#noHistory##noRecordHistory#\",\n col_type: \"scroll_button\"\n });\n data.push({\n title: \"刷新依赖\",\n url: $('#noLoading#').lazyRule((jsonUrl) => {\n jsonUrl = jsonUrl + '2505';\n // log(jsonUrl);\n let text = request(jsonUrl);\n if (!/version/.test(text)) {\n return 'toast://服务器正忙,请稍候再试...'\n }\n deleteCache(jsonUrl);\n try {\n require(jsonUrl);\n confirm({\n title: '刷新成功提示',\n content: \"toast://已刷新,当前版本信息:\\n\" + JSON.stringify(version)\n })\n return 'hiker://empty'\n } catch (e) {\n return 'toast://糟糕,本地缓存插件被清除了,但是服务器通讯失败!'\n }\n }, getApi(\"importUrl\")),\n col_type: \"scroll_button\"\n });\n data.push({\n title: \"通免:\" + color(lsg.getItem(\"通免\", \"X5\"), \"#ff7000\"),\n col_type: \"scroll_button\",\n url: $('#noLoading#').lazyRule(() => {\n const lsg = $.require(\"hiker://page/localStorage?rule=道长仓库Pro\");\n if (lsg.getItem(\"通免\", \"X5\") == \"X5\") {\n lsg.setItem(\"通免\", \"WEB\");\n } else {\n lsg.setItem(\"通免\", \"X5\");\n }\n refreshPage(false);\n return \"toast://已设置仓库通免模式为:\" + lsg.getItem(\"通免\");\n })\n });\n data.push({\n title: \"排序:\" + color(getItem(\"排序\", \"时间优先\"), \"#ff7000\"),\n col_type: \"scroll_button\",\n url: $('#noLoading#').lazyRule((color) => {\n let next = getItem(\"排序\", \"时间优先\") === '时间优先' ? '新版优先' : '时间优先';\n setItem(\"排序\", next);\n //refreshPage(false);\n updateItem('sort', {\n title: \"排序:\" + color(next, \"#ff7000\")\n })\n return \"toast://已设置仓库开发者规则排序模式为:\" + next;\n }, color),\n extra: {\n id: 'sort'\n }\n });\n data.push({\n title: color(\"仓库公告\", \"#ff7000\"),\n col_type: \"scroll_button\",\n url: $('hiker://empty#noHistory##noRecordHistory#').rule((md) => {\n require(md);\n let d = [];\n let 仓库公告 = \"暂无公告\";\n try {\n 仓库公告 = fetch('https://gitcode.net/qq_32394351/dr/-/raw/master/js/仓库公告.md');\n } catch (e) {}\n if (仓库公告) {\n d.push({\n title: marked.parse(仓库公告),\n col_type: 'rich_text',\n url: 'hiker://empty'\n });\n }\n setResult(d);\n }, md)\n });\n\n data.push({\n title: color(\"升级仓库\", \"#15ab21\"),\n col_type: \"scroll_button\",\n url: $('#noLoading#').lazyRule(() => {\n const {\n getApi\n } = $.require(\"hiker://page/utiliy\");\n let ruleHead = '海阔视界首页频道规则【道长仓库Pro】¥home_rule_url¥';\n let url = getApi('importUrl') + \"1094\";\n let importUrl = 'rule://' + base64Encode(ruleHead + url);\n return importUrl\n })\n });\n\n data.push({\n title: color(\"升级$扩展\", \"#15ab21\"),\n col_type: \"scroll_button\",\n url: $('#noLoading#').lazyRule(() => {\n const {\n getApi\n } = $.require(\"hiker://page/utiliy\");\n let ruleHead = '海阔视界,网页插件¥js_url¥$hiker@';\n let url = getApi('importUrl') + \"5111\";\n let importUrl = 'rule://' + base64Encode(ruleHead + url);\n return importUrl\n })\n });\n\n addListener('onClose', $.toString(() => {\n clearVar(\"Warehouse.class\");\n }));\n let {\n username,\n password,\n user\n } = getFile();\n\n let is_login = false;\n let is_manager = false;\n if (username !== void 0 && password !== void 0) {\n myUrl += '?qq=' + username + '&password=' + password;\n let code_str = request(myUrl, tmp_headers);\n let code = {};\n try {\n code = JSON.parse(code_str);\n } catch (e) {}\n if (code.status === 0 && code.result.active) {\n is_login = true;\n if (code.result.is_manager) {\n is_manager = true;\n putVar('house.is_manager', '真');\n putVar('house.username', username);\n putVar('house.password', password);\n } else {\n putVar('house.is_manager', '');\n clearVar('house.username');\n clearVar('house.password');\n }\n }\n }\n if (is_login) {\n try {\n nowCon = JSON.parse(request(getApi(\"nowConUrl\"), tmp_headers)).result;\n } catch (e) {\n nowCon = '未知';\n }\n let devData = userList.find(item => item.qq === username);\n data.push({\n title: '<strong><span style=\"color: #ff7000\">' + devData.name + '</span></strong>&nbsp;&nbsp;&nbsp;&nbsp;<small><u>规则管理 ></u></small>',\n pic_url: devData.avatar,\n col_type: \"avatar\",\n url: \"hiker://page/devManage#noHistory##noRecordHistory#\",\n extra: {\n //username: username,\n //password: password,\n dev: devData\n }\n });\n data.push({\n col_type: 'text_1',\n title: small(\"现有 \" + color(userList.length, \"#ff7000\") + \" 名开发者,\" + color(ruleCount[0], \"#ff7000\") + \" 条公开规则,\" + color(ruleCount[1], \"#ff7000\") + \" 条集芳阁规则。在线:\" + color(nowCon, \"#ff7000\")),\n url: \"toast://喵喵喵?\",\n });\n } else {\n data.push({\n title: small(color(\"开发者登录\", \"#00BFFF\")),\n col_type: 'text_center_1',\n desc: small(\"现有\" + color(userList.length, \"#ff7000\") + \"名开发者,\" + color(ruleCount[0], \"#ff7000\") + \"条公开规则,\" + color(0, \"#ff7000\") + \"条集芳阁规则。\"),\n url: \"hiker://page/devLogin\"\n });\n }\n if (Array.isArray(user) && user.length === 2) {\n let userlogin = request(api.dis_login, {\n headers: {\n 'content-type': 'application/json'\n },\n body: JSON.stringify({\n \"params\": {\n \"qq\": user[0],\n \"auth_code\": user[1]\n }\n }),\n method: 'POST',\n timeout: timeout\n });\n userlogin = JSON.parse(userlogin).result;\n if (userlogin.status === 0) {\n userlogin = userlogin.result\n data.push({\n title: userlogin.name + \"&nbsp;&nbsp;\" + userlogin.qq + \"&nbsp;&nbsp;&nbsp;&nbsp;<small><u>更换账号 ></u></small>\",\n col_type: 'avatar',\n pic_url: userlogin.avatar_url,\n url: \"hiker://page/Userregistration\"\n });\n data.splice(3, 0, {\n title: userlogin.has_reply ? \"🆕回复\" : \"🔔回复\",\n url: \"hiker://page/MyReply?url=hiker://empty#fypage#noHistory##noRecordHistory#\",\n col_type: \"scroll_button\",\n extra: {\n auth_code: user[1],\n qq: user[0]\n }\n });\n } else {\n data.push({\n title: userlogin.detail,\n col_type: 'text_center_1',\n desc: \"““””<small><u>重新获取验证码 ></u></small>\",\n url: \"hiker://page/Userregistration\"\n });\n }\n } else {\n data.push({\n title: \"评论登录/注册\",\n col_type: 'text_center_1',\n desc: \"\",\n url: \"hiker://page/Userregistration\"\n });\n }\n for (var item of userList) {\n data.push({\n title: item.name + \"(\" + item.rule_num + \")\",\n desc: item.id + ':' + item.nick_name,\n pic_url: item.avatar,\n url: \"hiker://page/rules#noHistory#\",\n extra: {\n avatarUrl: item.avatar,\n qq: item.qq,\n id: item.id,\n can_upload: item.can_upload\n }\n });\n }\n\n data.push({\n col_type: 'long_text'\n });\n setResult(data);\n try {\n let img = [\n [\n \"hiker://files/icon/赞.svg\", \"http://hiker.nokia.press/hikerule/rulelist.json?id=6756\"\n ],\n [\n \"hiker://files/icon/踩.svg\", \"http://hiker.nokia.press/hikerule/rulelist.json?id=6757\"\n ],\n [\n \"hiker://files/icon/评论.svg\", \"http://hiker.nokia.press/hikerule/rulelist.json?id=6758\"\n ]\n ];\n for (let item of img) {\n if (!fileExist(item[0])) {\n downloadFile(item[1], item[0]);\n }\n }\n } catch (e) {\n\n }\n}","searchFind":"js:\nvar d = [];\nconst {\n api,\n getApi,\n localRuleVer \n} = $.require(\"hiker://page/utiliy\");\nvar html = request(getApi(\"search\") + \"?key=\" + MY_URL.replace(\"hiker://empty#\", \"\")); // 获取源码\nvar rule_list = JSON.parse(html).result;\nlet filter = getVar(\"Warehouse.filter\", \"\");\nif (filter !== \"\") {\n rule_list = rule_list.filter(item => item.author === filter);\n}\nif (rule_list.length === 0) {\n d.push({\n title: '共搜索到' + rule_list.length + \"条记录\",\n desc: '详情请找道长,qq 434857005',\n url: \"hiker://empty\",\n col_type: 'text_center_1'\n });\n}\nlet homeList = JSON.parse(request(api.home));\n\nfor (let item of rule_list) {\n //let lver=localRuleVer(homeList, item);\n let label = \"\",\n lver = -2;\n if (item.data_type === \"home_rule_url\") {\n lver = localRuleVer(homeList, item);\n if (lver === -1) {\n label = \"🆕\";\n } else if (lver < item.ver) {\n label = \"🆙\";\n }\n }\n d.push({\n title: label+item.name,\n desc: item.type,\n content: item.author/*+\"\\n本地版本:\"+lver+\"\\t\\t云端版本:\"+item.ver*/+ '\\n更新于:' + item.last_update,\n url: \"hiker://page/ruleDetail#noHistory##noRecordHistory#\",\n extra: {\n lver: lver,\n id: item.id\n },\n pic_url: item.pic_url\n });\n\n}\n\nsetResult(d);","search_url":"hiker://empty#**","titleColor":"#ff228be6","group":"①推荐","detail_col_type":"text_1","detail_find_rule":"","sdetail_col_type":"text_1","sdetail_find_rule":"","ua":"mobile","preRule":"$.require('hiker://page/libs?rule=道长仓库Pro');","pages":"[{\"col_type\":\"movie_3\",\"name\":\"工具\",\"path\":\"utiliy\",\"rule\":\"js:\\nlet host = \\\"http://hiker.nokia.press\\\";\\n//let host = \\\"http://192.168.31.49:8079\\\";\\nlet home = base64Decode(\\\"aGlrZXI6Ly9ob21l\\\");\\nvar api = {\\n host: host+\\\"/hikerule\\\",\\n noticeUrl:\\\"/notice/get\\\",//获取仓库公告\\n usersUrl: \\\"/dev/users?order=\\\", //用户列表\\n ruleCountUrl: \\\"/dev/rulecount\\\", //获取规则数量\\n rulesUrl: \\\"/dev/get\\\", //用户对应的规则列表仅仅获取公开\\n rulesAllUrl: \\\"/dev/getall\\\", //开发者对应的规则列表可获取私有\\n devSelf:'/dev/getself',//获取开发者信息\\n manCanUpload:'/set_can_upload/',//超管设置开发者是否可上传\\n manRuleSafe:'/set_rule_safe/',//超管设置规则安全性\\n manRuleGood:'/set_rule_good/',//超管设置规则优质性\\n importUrl: \\\"/rulelist.json?id=\\\", //规则详情可导入\\n infoSetUrl: \\\"/dev/set_info\\\",\\n nowConUrl: \\\"/sql_info/get_now_con\\\",\\n infoGetUrl: \\\"/dev/get_info?name=\\\",\\n settingsGetUrl: \\\"/dev/get_settings?name=\\\",\\n gupload: \\\"/dev/gupload\\\",\\n gtimeover: \\\"/dev/gtimeover\\\",\\n getbyid: \\\"/dev/getbyid\\\",\\n ruleListJson: \\\"/rulelist.json\\\",\\n auth: \\\"/dev/get_auth\\\",\\n timeover: \\\"/dev/timeover\\\",\\n share: \\\"/dev/share\\\",\\n genAuth: \\\"/dev/gen_auth\\\",\\n deleteUrl: \\\"/dev/delete\\\",\\n jsonList: \\\"/dev/json_list\\\",\\n search: \\\"/dev/search\\\",\\n new_dev: \\\"/dev_regist/new\\\",\\n new_getId: \\\"/dev_regist/get_id\\\",\\n new_confirm: \\\"/dev_regist/confirm\\\",\\n modify_pwd: \\\"/modify/password\\\",\\n modify_name: \\\"/modify/name\\\",\\n modify_ava: \\\"/modify/avatar\\\",\\n user: \\\"/dev/user/\\\",\\n get_rule_note: \\\"/modify/get_rule_note/\\\",\\n set_rule_pic: \\\"/modify/rule_pic/\\\",\\n set_rule_note: \\\"/modify/rule_note/\\\"\\n}\\n$.exports.range = function(m, n) {\\n return Math.floor(Math.random() * (m - n + 1) + n);\\n}\\n$.exports.mapColType = function(target, type, n) {\\n for (let i = 0; i < n; i++) {\\n target.push({\\n col_type: type\\n });\\n }\\n}\\nvar getApi = function(k) {\\n return api.host + api[k];\\n};\\n$.exports.getApi=getApi;\\n$.exports.md=getApi('importUrl')+\\\"3187\\\";\\n$.exports.localRuleVer = function(localRuleList, rule) {\\n let localRule;\\n for (let i = 0; i < localRuleList.length; i++) {\\n let item = localRuleList[i];\\n let au = item.author || \\\"\\\";\\n let sameAu=au.length > 0 && rule.author.includes(au);\\n sameAu=true;//不判断作者默认为true\\n if (item.title === rule.name && sameAu) {\\n localRule = item;\\n break;\\n }\\n }\\n if (localRule === void 0) {\\n return -1;\\n } else {\\n return localRule.version;\\n }\\n}\\n$.exports.color = function(text, color) {\\n text += \\\"\\\";\\n if (text.indexOf(\\\"““””\\\") === 0) {\\n text.replace(\\\"““””\\\", \\\"\\\");\\n }\\n return \\\"““””<font color='\\\" + color + \\\"'>\\\" + text + \\\"</font>\\\";\\n}\\n\\n$.exports.sleep = function(timeout){\\n java.lang.Thread.sleep(timeout);\\n}\\nfunction htmlTag(tag, text) {\\n text += \\\"\\\";\\n if (text.indexOf(\\\"““””\\\") === 0) {\\n text.replace(\\\"““””\\\", \\\"\\\");\\n }\\n return \\\"““””\\\" + \\\"<\\\" + tag + \\\">\\\" + text + \\\"</\\\" + tag + \\\">\\\";\\n\\n}\\n\\nfunction getNowFormatDate() {\\n let date = new Date();\\n let seperator1 = \\\"-\\\";\\n let seperator2 = \\\":\\\";\\n let month = date.getMonth() + 1;\\n let strDate = date.getDate();\\n let strHours = date.getHours();\\n let strMinutes = date.getMinutes();\\n let strSeconds = date.getSeconds()+1;\\n if (month >= 1 && month <= 9) {\\n month = \\\"0\\\" + month\\n }\\n if (strDate >= 0 && strDate <= 9) {\\n strDate = \\\"0\\\" + strDate\\n }\\n if (strHours >= 0 && strHours <= 9) {\\n strHours = \\\"0\\\" + strHours\\n }\\n if (strMinutes >= 0 && strMinutes <= 9) {\\n strMinutes = \\\"0\\\" + strMinutes\\n }\\n if (strSeconds >= 0 && strSeconds <= 9) {\\n strSeconds = \\\"0\\\" + strSeconds\\n }\\n //let currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + \\\" \\\" + strHours + seperator2 + strMinutes + seperator2 + strSeconds;\\n let currentdate = (date.getFullYear()-2020)+''+ month +''+ strDate +''+ strHours+'' + strMinutes +''+ Math.ceil(strSeconds/7);\\n return parseInt(currentdate)\\n }\\n$.exports.getNowFormatDate = getNowFormatDate;\\n$.exports.htmlTag = htmlTag;\\n$.exports.small = function(text) {\\n return htmlTag(\\\"small\\\", text);\\n}\\n$.exports.getFile = function() {\\n var File = request(\\\"hiker://files/WarehouseUSER.json\\\") || \\\"{}\\\";\\n try {\\n return JSON.parse(File);\\n } catch (e) {\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\", \\\"{}\\\");\\n return {};\\n }\\n}\\n$.exports.getUserDate =function(){\\n var File = request(\\\"hiker://files/WarehouseUSERA.json\\\") || \\\"[]\\\";\\n try {\\n return JSON.parse(File);\\n } catch (e) {\\n writeFile(\\\"hiker://files/WarehouseUSERA.json\\\", \\\"[]\\\");\\n return [];\\n }\\n}\\n$.exports.existFile = function(spath, ipath, headers) {\\n let scode = request(spath);\\n if (!scode) {\\n writeFile(spath, request(ipath, headers));\\n }\\n}\\n\\nlet newApi = {\\n \\\"dis_new\\\": \\\"/hikerule/new_rule_discuss/\\\",\\n \\\"dis_verify\\\": \\\"/hikerule/rule_discuss/get_yzm\\\",\\n \\\"dis_get\\\": \\\"/hikerule/rule_discuss/\\\",\\n \\\"dis_set\\\": \\\"/hikerule/modify/can_discuss/\\\",\\n \\\"dis_new_user\\\": \\\"/hikerule/rule_discuss/new_user\\\",\\n \\\"dis_login\\\":\\\"/hikerule/rule_discuss/user_login\\\",\\n \\\"dis_dev_discuss\\\":\\\"/hikerule/modify/dev_can_discuss\\\",\\n \\\"dis_dev_control\\\":\\\"/hikerule/rule_discuss/remove/\\\",\\n \\\"all_rule\\\":\\\"/hikerule/get_rules\\\",\\n \\\"dis_get_reply\\\":\\\"/hikerule/get_reply_rule_discuss\\\",\\n \\\"dis_reply\\\":\\\"/hikerule/dev_new_rule_discuss/\\\",\\n}\\n\\nfunction setApi(object) {\\n let target = {};\\n for (let key in object) {\\n target[key]=host+object[key]\\n }\\n return target;\\n}\\n\\n$.exports.api = setApi(newApi);\\n$.exports.api.host=host;\\n$.exports.api.home=home;\"},{\"col_type\":\"movie_3\",\"name\":\"开发者登录\",\"path\":\"devLogin\",\"rule\":\"js:\\nsetPageTitle(\\\"开发者登录\\\");\\nconst {\\n getApi,\\n htmlTag,\\n mapColType,\\n small,\\ngetFile\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nvar data = [];\\naddListener('onClose', $.toString(()=>{\\n clearVar(\\\"WarehouseUsername\\\");\\n clearVar(\\\"WarehousePassword\\\");\\n}))\\ndata.push({\\n title: '账号',\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('WarehouseUsername',''),\\n type:\\\"number\\\",\\n onChange: 'putVar(\\\"WarehouseUsername\\\",input)'\\n }\\n}, {\\n title: '密码',\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('WarehousePassword', ''),\\n type: \\\"password\\\",\\n onChange: 'putVar(\\\"WarehousePassword\\\",input)'\\n }\\n});\\n\\ndata.push({\\n title:\\\"&nbsp;&nbsp;<a href='hiker://page/Register'>注册</a>\\\",\\n col_type:\\\"rich_text\\\"\\n});\\nmapColType(data, \\\"line_blank\\\", 1);\\nlet user = getFile();\\ndata.push({\\n title: htmlTag(\\\"b\\\", \\\"登录\\\"),\\n url: $().lazyRule((url, f)=> {\\n let username = getVar('WarehouseUsername', ''),\\n password = getVar('WarehousePassword', '');\\n if(username === \\\"\\\" && password ===\\\"\\\"){\\n return \\\"toast://账号和密码不能为空\\\"\\n }\\n let myUrl = url + '?qq=' + username + '&password=' + password;\\n let code_str = request(myUrl);\\n let code = JSON.parse(code_str);\\n if (code.status == 0) {\\n f.username=username;\\n f.password=password\\n writeFile('hiker://files/WarehouseUSER.json', JSON.stringify(f));\\n back();\\n return \\\"toast://登录成功\\\";\\n }else{\\n return \\\"toast://账号或密码错误\\\";\\n }\\n }, getApi(\\\"rulesAllUrl\\\"),user),\\n col_type: 'text_center_1'\\n});\\nsetResult(data);\"},{\"col_type\":\"icon_2_round\",\"name\":\"开发者管理\",\"path\":\"devManage\",\"rule\":\"js:\\nsetPageTitle(\\\"规则管理\\\");\\naddListener('onClose', 'clearVar(\\\"Warehouse.back\\\",\\\"\\\");');\\nif (getVar(\\\"Warehouse.back\\\") === \\\"1\\\") {\\n back();\\n}\\nconst {\\n getApi,\\n color,\\n small,\\n getFile,\\n existFile,\\n mapColType,\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n dev\\n} = MY_PARAMS;\\nlet {\\n username,\\n password,\\n} = getFile();\\n//existFile(\\\"hiker://files/rules/dzHouse/html/开发者分享.html\\\", \\\"https://erp.scwinbao.com/hikerule/rulelist.json?id=539\\\");\\nlet ruleList = JSON.parse(request(getApi(\\\"rulesAllUrl\\\") + '?qq=' + username + '&password=' + password)).result;\\nlet MOBILE_UA = 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Mobile Safari/537.36';\\nlet infoSetUrl = getApi(\\\"infoSetUrl\\\");\\nlet infoGetUrl = getApi(\\\"infoGetUrl\\\") + username;\\nlet settingsGetUrl = getApi(\\\"settingsGetUrl\\\") + username;\\nputMyVar(\\\"dev_set_info\\\", [username, password, infoSetUrl, MOBILE_UA, infoGetUrl].join(\\\"$$\\\"));\\nlet data = [];\\ndata.push({\\n title: '““””<big>仓库设置</big>&nbsp;&nbsp;&nbsp;<small><u>( 个人资料 >)</u></small>',\\n desc: '““””您共有 <span style=\\\"color: #ff7000\\\">' + ruleList.length + '</span>' + \\\" 条规则。\\\\n点击规则可进行分享、删除、导入操作及查看详情\\\",\\n url: \\\"hiker://page/PersonalData#noHistory##noRecordHistory#\\\",\\n extra:{id:dev.id},\\n col_type: 'text_1'\\n});\\nmapColType(data, \\\"line\\\", 2);\\ndata.push({\\n title: small(color(\\\"更改公告✍\\\", \\\"#34b1ff\\\")),\\n // url: \\\"x5://file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/rules/dzHouse/html/dev_info_edit.html\\\",\\n url: \\\"hiker://page/devInfoEdit\\\",\\n col_type: 'text_3'\\n});\\ndata.push({\\n title: small(color(\\\"更多分享📲\\\", \\\"#34b1ff\\\")),\\n //url: \\\"x5://file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/rules/dzHouse/html/开发者分享.html\\\",\\n url: \\\"hiker://page/moreShare\\\",\\n col_type: 'text_3'\\n});\\ndata.push({\\n title: small(color(\\\"升级依赖📥\\\", \\\"#34b1ff\\\")),\\n url: $(\\\"升级会重新从仓库拉取相关的静态页面到本地\\\\n确认升级吗?\\\").confirm((host) => {\\n writeFile(\\\"hiker://files/rules/dzHouse/html/开发者分享.html\\\", request(host+'/hikerule/rulelist.json?id=539'));\\n writeFile(\\\"hiker://files/rules/dzHouse/html/dev_info_edit.html\\\", request(host+'/hikerule/rulelist.json?id=402'));\\n writeFile(\\\"hiker://files/rules/dzHouse/html/dev_info_get.html\\\", request(host+'/hikerule/rulelist.json?id=404'));\\n refreshPage(false);\\n return \\\"toast://已重置开发者分享,简介查看,简介编辑等静态文件\\\";\\n },api.host),\\n col_type: 'text_3'\\n});\\nlet devSetBack;\\ntry {\\n devSetBack = JSON.parse(request(settingsGetUrl));\\n} catch (e) {\\n devSetBack = {};\\n}\\n\\nfunction setSettingItem(basic) {\\n let temp = {\\n title: basic.title,\\n col_type: basic.col_type,\\n url: $(basic.confirm).confirm((url, msg) => {\\n let back = request(url);\\n let ret = JSON.parse(back);\\n if (ret.status == 0) {\\n refreshPage(true);\\n return \\\"toast://\\\" + msg[0];\\n } else {\\n refreshPage(false);\\n return \\\"toast://\\\" + msg[1] + \\\"\\\\n\\\" + ret.detail;\\n }\\n }, basic.url, basic.msg)\\n };\\n return temp;\\n}\\nif (devSetBack.status == 0) {\\n let devSettings = devSetBack.result;\\n let share = {\\n col_type: \\\"text_3\\\"\\n };\\n if (devSettings.share_public) {\\n share.title = small(color(\\\"公开上传\\\", \\\"green\\\") + color(\\\"(私藏)\\\", \\\"#00bfff\\\"));\\n share.url = getApi(\\\"gupload\\\") + \\\"?qq=\\\" + username + \\\"&password=\\\" + password + \\\"&flag=1\\\";\\n share.confirm = \\\"是否确认私藏以后提交的规则?\\\";\\n share.msg = [\\\"已私藏\\\", \\\"私藏失败\\\"];\\n } else {\\n share.title = small(color(\\\"私密上传\\\", \\\"red\\\") + color(\\\"(公开)\\\", \\\"#adff2f\\\"));\\n share.url = getApi(\\\"gupload\\\") + \\\"?qq=\\\" + username + \\\"&password=\\\" + password;\\n share.confirm = \\\"是否确认公开以后提交的规则?\\\";\\n share.msg = [\\\"已公开\\\", \\\"公开失败\\\"];\\n }\\n data.push(setSettingItem(share));\\n let timeOver = {\\n col_type: \\\"text_3\\\"\\n };\\n if (devSettings.time_over) {\\n timeOver.title = small(color(\\\"短时秘钥\\\", \\\"green\\\") + color(\\\"(永久)\\\", \\\"#00bfff\\\"));\\n timeOver.url = getApi(\\\"gtimeover\\\") + \\\"?qq=\\\" + username + \\\"&password=\\\" + password + \\\"&flag=1\\\";\\n timeOver.confirm = \\\"是否确认以后的私藏规则分享不过期?\\\";\\n timeOver.msg = [\\\"已设为永久\\\", \\\"设为永久失败\\\"];\\n } else {\\n timeOver.title = small(color(\\\"永久秘钥\\\", \\\"red\\\") + color(\\\"(过期)\\\", \\\"#adff2f\\\"));\\n timeOver.url = getApi(\\\"gtimeover\\\") + \\\"?qq=\\\" + username + \\\"&password=\\\" + password;\\n timeOver.confirm = \\\"确认要以后分享的私藏规则自动到期?\\\";\\n timeOver.msg = [\\\"已设为过期\\\", \\\"设为过期失败\\\"];\\n }\\n data.push(setSettingItem(timeOver));\\n let discuss = {\\n col_type: \\\"text_3\\\"\\n };\\n if (devSettings.can_discuss) {\\n discuss.title = small(color(\\\"允许评论\\\", \\\"red\\\") + color(\\\"(不许)\\\", \\\"#adff2f\\\"));\\n discuss.url = api.dis_dev_discuss + \\\"?qq=\\\" + username + \\\"&password=\\\" + password+ \\\"&flag=1\\\";\\n discuss.confirm = \\\"是否确认以后上传的规则允许评论?\\\";\\n discuss.msg = [\\\"已设为不许\\\", \\\"设置失败\\\"];\\n\\n } else {\\n discuss.title = small(color(\\\"不许评论\\\", \\\"green\\\") + color(\\\"(允许)\\\", \\\"#00bfff\\\"));\\n discuss.url = api.dis_dev_discuss + \\\"?qq=\\\" + username + \\\"&password=\\\" + password;\\n discuss.confirm = \\\"是否确认以后上传的规则允许评论?\\\";\\n discuss.msg = [\\\"已设为允许\\\", \\\"设置失败\\\"];\\n }\\n data.push(setSettingItem(discuss));\\n}\\nmapColType(data, \\\"line\\\", 2);\\nfor (let item of ruleList) {\\n let my_t_excode1 = '';\\n let my_t_excode2 = '';\\n if (item.state != 'public') {\\n my_t_excode1 += '㊙️';\\n } else {\\n my_t_excode1 += '';\\n }\\n data.push({\\n title: my_t_excode1 + item.name + my_t_excode2,\\n url: \\\"hiker://page/manageRule#noHistory##noRecordHistory#\\\",\\n extra: {\\n id: item.id,\\n //username: username,\\n //password: password\\n },\\n pic_url: item.pic,\\n })\\n}\\nif (ruleList.length === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>快来上传你的第一条规则吧!</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n}\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"规则详细-dev\",\"path\":\"manageRule\",\"rule\":\"js:\\n const {\\n getApi,\\n color,\\n small,\\n getFile,\\n existFile,\\n mapColType,\\n htmlTag,\\n api,\\n md,\\n } = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n id\\n} = MY_PARAMS;\\nlet {\\n username,\\n password,\\n} = getFile();\\naddListener('onClose', $.toString(() => {\\n refreshPage(false);\\n}));\\nlet dataItem = JSON.parse(request(getApi(\\\"getbyid\\\") + \\\"?id=\\\" + id)).result;\\nsetPageTitle(\\\"编辑「\\\" + dataItem.name + \\\"」\\\");\\nlet reqByGet = \\\"?id=\\\" + dataItem.id + \\\"&qq=\\\" + username + \\\"&password=\\\" + password;\\nlet ruleListJson = getApi(\\\"ruleListJson\\\") + \\\"?id=\\\";\\nlet data = [];\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"版本\\\"),\\n desc: \\\"““””云端版本:\\\" + color(dataItem.ver, \\\"#5cff2c\\\") + \\\"\\\\n上次提交于: [\\\" + color(dataItem.last_update, \\\"#ff7000\\\") + \\\"]\\\",\\n url: $(\\\"<开发者>\\\\n\\\" + dataItem.author + \\\"\\\\n<名称>\\\\n\\\" + dataItem.name + \\\"\\\\n<云端版本>\\\\n\\\" + dataItem.ver + \\\"\\\\n<更新时间>\\\\n[\\\" + dataItem.last_update + \\\"]\\\").confirm(() => {}),\\n col_type: 'text_1'\\n});\\nlet dataType = {\\n home_rule_url: '首页云规则',\\n publish: '提交云仓库规则',\\n js_url: '网页插件规则',\\n html: '静态页面',\\n config: '主页配置'\\n};\\n\\nlet basic = {\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\"\\n};\\nlet dataTypeTips = dataType[dataItem.data_type] || '未知规则:' + dataItem.data_type;\\n\\nbasic.title = htmlTag(\\\"big\\\", \\\"类型\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(\\\"(id:\\\" + dataItem.id + \\\")\\\");\\nbasic.desc = \\\"数据类型:\\\" + color(dataTypeTips, \\\"#cb54ff\\\") + \\\"\\\\n分享状态为:\\\" + dataItem.state;\\nif ([\\\"html\\\", \\\"config\\\", \\\"js_url\\\"].includes(dataItem.data_type)) {\\n basic.desc += \\\"\\\\n““”” =>\\\" + small(\\\"点此预览\\\");\\n basic.url = ruleListJson + dataItem.id;\\n}\\nlet auth = \\\"\\\";\\nif (dataItem.state == \\\"private\\\") {\\n let auth_back = JSON.parse(request(getApi(\\\"auth\\\") + reqByGet));\\n basic.title = basic.title + \\\"\\\\n\\\" + small(color(auth_back.result, \\\"grey\\\"));\\n auth = '&auth=' + auth_back.result;\\n basic.url = basic.url === \\\"hiker://empty\\\" ? basic.url : basic.url + auth;\\n}\\ndata.push(basic);\\nlet notes = request(getApi(\\\"get_rule_note\\\") + id);\\nnotes = JSON.parse(notes).result;\\nrequire(md);\\nlet notesHtml=\\\"\\\"\\ntry{\\n notesHtml=marked.parse(notes);\\n}catch(e){}\\nif (notes !== false) {\\n data.push({\\n title: htmlTag(\\\"big\\\", \\\"备注\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(htmlTag(\\\"u\\\", \\\"查看完整公告 >\\\")),\\n desc: notes,\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra: {\\n text: notesHtml,\\n name: dataItem.name,\\n // type: \\\"long_text\\\"\\n type: \\\"rich_text\\\"\\n }\\n });\\n}\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"操作\\\"),\\n col_type: \\\"text_1\\\",\\n url: \\\"toast://你才是最帅的那个人!\\\"\\n});\\nlet importUrl, ruleCode, shareUrl, backCode = \\\"\\\";\\nlet subUrl = ruleListJson + dataItem.id + auth;\\nif (!dataItem.is_json) {\\n backCode = request(subUrl);\\n}\\nswitch (dataItem.data_type) {\\n case \\\"home_rule_url\\\":\\n ruleCode = \\\"海阔视界首页频道规则【\\\" + dataItem.name + \\\"】¥home_rule_url¥\\\" + ruleListJson + dataItem.id + auth;\\n importUrl = \\\"rule://\\\" + base64Encode(ruleCode)\\n break;\\n case 'publish':\\n ruleCode = '海阔视界规则分享,当前分享的是:' + dataItem.name + '¥publish¥' + base64Encode(backCode);\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break;\\n case 'js_url':\\n ruleCode = '海阔视界规则分享,当前分享的是:网页插件¥js_url¥' + dataItem.name + '@base64://' + base64Encode(backCode);\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break;\\n case 'html':\\n let file_tmp = dataItem.name.split('.');\\n let file_path = file_tmp.length > 1 ? file_tmp[file_tmp.length - 1] + \\\"/\\\" + dataItem.name : dataItem.name;\\n ruleCode = \\\"海阔视界本地文件分享¥file_url¥hiker://files/rules/dzHouse/\\\" + file_path + \\\"@\\\" + ruleListJson + dataItem.id + auth;\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break\\n case \\\"config\\\":\\n importUrl = $().rule(password => {\\n eval(fetch(\\\"hiker://assets/home.js\\\"));\\n HikerHome.load(\\\"import\\\", password);\\n }, backCode);\\n break;\\n}\\nlet my_col_type = \\\"text_2\\\";\\nif (importUrl) {\\n data.push({\\n title: \\\"导入规则\\\",\\n url: importUrl,\\n col_type: my_col_type\\n });\\n if(dataItem.is_json_list&&/home_rule_url|html/.test(dataItem.data_type)){\\n data.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入道德经</span>',\\n url: $().lazyRule((dataItem,subUrl)=>{\\n // let title = \\\"H-\\\"+dataItem.name+\\\".\\\"+dataItem.author;\\n let title = \\\"J-\\\"+dataItem.name.split('.')[0];\\n let subObj = {\\n title: title,\\n url: subUrl,\\n desc: \\\"hiker://files/rules/dzHouse/ruleCache/\\\"+title+\\\".json\\\",\\n code: \\\"\\\",\\n active: false,//禁用并发更新\\n }\\n let shareText = base64Encode(JSON.stringify(subObj));\\n var pastes = getPastes();\\n var url = sharePaste(shareText,pastes.slice(-1)[0]);\\n let import_rule= \\\"轻合集订阅:\\\"+title+'\\\\n'+url;\\n copy(import_rule);\\n const path = 'hiker://files/rules/dzHouse/ruleCache/sub.json';\\n $.rc(config.lib.sub);\\n return 订阅导入(path)\\n },dataItem,subUrl),\\n col_type: my_col_type\\n });\\n }\\n}\\nif (ruleCode) {\\n data.push({\\n title: \\\"分享规则\\\",\\n url: \\\"copy://\\\" + ruleCode,\\n col_type: my_col_type\\n });\\n}\\n\\nfunction setSettingItem(basic, pattern) {\\n let temp = {\\n title: basic.title,\\n col_type: basic.col_type,\\n url: $(basic.confirm).confirm((url, msg, pattern) => {\\n let backA = request(url);\\n let ret = JSON.parse(backA);\\n if (ret.status == 0) {\\n pattern ? back() : refreshPage(false);\\n return \\\"toast://\\\" + msg[0];\\n } else {\\n pattern ? back() : refreshPage(false);\\n return \\\"toast://\\\" + msg[1] + \\\"\\\\n\\\" + ret.detail;\\n }\\n }, basic.url, basic.msg, pattern)\\n };\\n return temp;\\n}\\nif (dataItem.state == 'private') {\\n data.push({\\n title: \\\"设为公开\\\",\\n url: $(getApi(\\\"share\\\") + reqByGet + \\\"&flag\\\" + \\\"#noLoading#\\\").lazyRule(() => {\\n request(input);\\n refreshPage(false);\\n return \\\"toast://已设为公开\\\";\\n }),\\n col_type: my_col_type\\n }, {\\n title: \\\"随机密钥\\\",\\n col_type: my_col_type,\\n url: $(getApi(\\\"genAuth\\\") + reqByGet + \\\"#noLoading#\\\").lazyRule(() => {\\n let back = request(input);\\n let ret = JSON.parse(back);\\n if (ret.status == 0) {\\n refreshPage(false);\\n return \\\"toast://已生成随机密码\\\\n\\\" + ret.result\\n } else {\\n refreshPage(true);\\n return \\\"toast://随机密码生成失败\\\"\\n }\\n })\\n });\\n let timeOver = {\\n col_type: my_col_type\\n };\\n if (dataItem.time_over) {\\n timeOver.title = small(color(\\\"短时密钥\\\", \\\"green\\\") + color(\\\"(→永久)\\\", \\\"red\\\"));\\n timeOver.url = getApi(\\\"timeover\\\") + reqByGet + \\\"&flag=1\\\";\\n timeOver.confirm = \\\"是否确认以后的私藏规则分享不过期?\\\";\\n timeOver.msg = [\\\"已设为永久\\\", \\\"设为永久失败\\\"];\\n } else {\\n timeOver.title = small(color(\\\"永久密钥\\\", \\\"red\\\") + color(\\\"(→短时)\\\", \\\"green\\\"));\\n timeOver.url = getApi(\\\"timeover\\\") + reqByGet;\\n timeOver.confirm = \\\"确认要以后分享的私藏规则自动到期?\\\";\\n timeOver.msg = [\\\"已设为过期\\\", \\\"设为过期失败\\\"];\\n }\\n data.push(setSettingItem(timeOver));\\n} else if (dataItem.state == 'public') {\\n data.push({\\n title: \\\"设为私有\\\",\\n url: $(getApi(\\\"share\\\") + reqByGet + \\\"&flag=1#noLoading#\\\").lazyRule(() => {\\n request(input);\\n refreshPage(false);\\n return \\\"toast://已设为私有\\\";\\n }),\\n col_type: my_col_type\\n });\\n}\\ndata.push(setSettingItem({\\n title: \\\"删除数据\\\",\\n confirm: \\\"是否确认删除\\\",\\n msg: [\\\"已删除\\\", \\\"删除失败\\\"],\\n url: getApi(\\\"deleteUrl\\\") + reqByGet,\\n col_type: my_col_type\\n}, true));\\ndata.push({\\n title: \\\"设置图标\\\",\\n url: $(dataItem.pic_url, \\\"输入图标地址\\\").input(api => {\\n if (input === \\\"\\\") {\\n return \\\"toast://你在逗我链接哪?\\\"\\n }\\n let result = request(api + \\\"&rule_pic=\\\" + input);\\n result = JSON.parse(result);\\n if (result.status !== 0) {\\n return \\\"toast://\\\" + result.detail;\\n }\\n return \\\"toast://修改成功\\\";\\n }, getApi(\\\"set_rule_pic\\\") + dataItem.id + reqByGet),\\n col_type: my_col_type\\n});\\n\\ndata.push({\\n title: dataItem.can_discuss ? \\\"禁止评论\\\" : \\\"开启评论\\\",\\n url: $(api.dis_set + dataItem.id + reqByGet + \\\"&state=\\\" + (dataItem.can_discuss ? \\\"\\\" : 1)).lazyRule((can_discuss) => {\\n request(input);\\n refreshPage(false);\\n return can_discuss ? \\\"toast://已禁止评论\\\" : \\\"toast://已开启评论\\\";\\n }, dataItem.can_discuss),\\n col_type: my_col_type\\n});\\nMY_PARAMS.name = dataItem.name;\\nMY_PARAMS.username=username;\\nMY_PARAMS.password=password;\\ndata.push({\\n title: \\\"设置备注\\\",\\n url: \\\"hiker://page/set_rule_notes\\\",\\n extra: MY_PARAMS,\\n col_type: my_col_type\\n});\\nif (dataItem.is_json && dataItem.data_type === \\\"home_rule_url\\\" && !dataItem.is_json_list) {\\n data.push({\\n title: '进入频道',\\n url: $( /*\\\"#noLoading#\\\"*/ ).lazyRule((name,home) => {\\n let ruleList = JSON.parse(request(home));\\n let hasRule = ruleList.some(item => item.title === name);\\n if (hasRule) {\\n putVar(\\\"Warehouse.back\\\", \\\"1\\\");\\n back();\\n return home+\\\"s@\\\" + name;\\n } else {\\n return \\\"toast://未安装\\\";\\n }\\n }, dataItem.name,api.home),\\n col_type: my_col_type\\n });\\n}\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\ndata.push({\\n title: dataItem.good_num,\\n pic_url: \\\"hiker://files/icon/赞.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://empty\\\"\\n});\\ndata.push({\\n title: dataItem.bad_num,\\n pic_url: \\\"hiker://files/icon/踩.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://empty\\\"\\n});\\ndata.push({\\n title: \\\"评论\\\",\\n pic_url: \\\"hiker://files/icon/评论.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://page/Reply#noHistory##noRecordHistory#\\\",\\n extra: {\\n ruleId: dataItem.id,\\n name: dataItem.author,\\n password: password,\\n username: username\\n }\\n});\\nlet totalSum = dataItem.good_num + dataItem.bad_num;\\n\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"评论(\\\" + totalSum + \\\")\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(htmlTag(\\\"u\\\", \\\"查看全部评论(控评) >\\\")),\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/Comment\\\",\\n extra: {\\n url: \\\"hiker://empty#fypage#noHistory##noRecordHistory#\\\",\\n id: dataItem.id,\\n totalSum: totalSum,\\n no_active: true,\\n username: username,\\n password: password\\n }\\n});\\n//const longestSum=120;\\nlet icon = {\\n \\\"good\\\": \\\"👍\\\",\\n \\\"bad\\\": \\\"👎\\\",\\n \\\"reply\\\": \\\"开发者🗣\\\"\\n}\\nif (totalSum === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>一条评论也没有,快来抢沙发吧!</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n} else {\\n let commentList = JSON.parse(request(api.dis_get + dataItem.id + \\\"?limit=5\\\")).result;\\n for (let item of commentList) {\\n let Reply = item.discuss_type===\\\"reply\\\"&&item.reply_to_name!==false&&item.reply_to_id!==false?\\\"‘‘回复@\\\"+item.reply_to_name+\\\" #\\\"+item.discuss_id+\\\"’’\\\\n\\\":\\\"\\\";\\n data.push({\\n title: item.name + \\\"&nbsp;&nbsp;<font color='gray'><small>#\\\" + item.id + \\\"</small><font>\\\",\\n col_type: \\\"avatar\\\",\\n url: \\\"hiker://page/Reply\\\",\\n extra:{\\n ruleId: dataItem.id,\\n name: item.name,\\n password: password,\\n username: username,\\n replyId:item.id\\n },\\n pic_url: item.avatar_url\\n });\\n data.push({\\n title: item.discuss_text,\\n desc: Reply+item.create_date + \\\"·\\\" + icon[item.discuss_type],\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra: {\\n name: item.name,\\n type: \\\"long_text\\\",\\n text: item.discuss_text\\n },\\n pic_url: item.avatar_url\\n });\\n }\\n}\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\nsetResult(data);\"},{\"col_type\":\"icon_2_round\",\"name\":\"规则列表\",\"path\":\"rules\",\"rule\":\"js:\\n addListener('onClose',$.toString(()=>{\\n clearVar(\\\"Warehouse.back\\\");\\n clearVar(\\\"Warehouse.filter\\\");\\n clearVar(\\\"Warehouse.type\\\");\\n if(getVar('Warehouse.can_upload','')){\\n log('操作过禁止上传:'+getVar('Warehouse.can_upload'));\\n clearVar(\\\"Warehouse.can_upload\\\");\\n refreshPage(true);\\n }\\n }));\\n\\nif (getVar(\\\"Warehouse.back\\\") === \\\"1\\\") {\\n back(false);\\n}\\n\\nconst {\\n getApi,\\n api,\\n color,\\n small,\\n localRuleVer,\\n htmlTag,\\n md\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nconst { normalSort } = $.require(\\\"hiker://page/sort\\\");\\nlet {\\n avatarUrl,\\n qq,\\n id,\\n can_upload\\n} = MY_PARAMS;\\nlet dataType = getVar(\\\"Warehouse.type\\\",\\\"\\\");\\nlet backCode = JSON.parse(request(getApi(\\\"rulesUrl\\\") + \\\"?name=\\\" + qq+\\\"&data_type=\\\"+dataType));\\nlet devName = backCode.dev_name;\\nputVar(\\\"Warehouse.filter\\\", devName);\\nlet ruleList = backCode.result;\\nlet subUrl = getApi(\\\"jsonList\\\") + \\\"?name=\\\" + qq;\\nlet hasSub = hasHomeSub(subUrl);\\nlet devInfo = \\\"这个人很懒,什么都没写哦~\\\";\\nlet tmpJson = JSON.parse(request(getApi(\\\"infoGetUrl\\\") + qq));\\nif (tmpJson.status == 0) {\\n devInfo = tmpJson.result || devInfo;\\n}\\nlet subFlag = hasSub ? '🆗' : '📡';\\nlet data = [];\\nrequire(md);\\ndevInfo=marked.parse(devInfo);\\ndata.push({\\n title: \\\"““””\\\" + devName + \\\"\\\\n\\\\n\\\" + small(htmlTag(\\\"u\\\", \\\"点击查看完整公告\\\")),\\n desc: small(devInfo),\\n url: 'hiker://page/info',\\n extra: {\\n text: devInfo,\\n name: devName,\\n type:\\\"rich_text\\\"\\n },\\n pic_url: avatarUrl,\\n col_type: 'movie_1_vertical_pic'\\n});\\ndata.push({\\n title: \\\"<big>订阅管理</big>&nbsp;&nbsp;<small>(当前\\\" + (hasSub ? \\\"已订阅\\\" : \\\"未订阅\\\") + \\\")</small>\\\",\\n col_type: \\\"rich_text\\\"\\n});\\n\\nlet sub_code = '海阔视界合集规则订阅¥home_sub¥' + devName + \\\"合集@@\\\" + subUrl;\\nlet rulesCode = '海阔视界合集规则¥home_rule_url¥' + subUrl;\\ndata.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">一键订阅</span>',\\n desc: '订阅““””<span style=\\\"color: #5cff2c\\\">' + devName + '</span>的所有单规则,合集需单独订阅',\\n url: sub_code,\\n col_type: 'text_2'\\n});\\ndata.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入全部</span>',\\n url: rulesCode,\\n col_type: 'text_2'\\n});\\ndata.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入轻合集</span>',\\n url: $().lazyRule((devName,subUrl,avatarUrl)=>{\\n const {genRule}=$.require(\\\"hiker://page/genApi\\\");\\n log(\\\"轻合集图标链接:\\\"+avatarUrl);\\n let import_rule=genRule(\\\"轻合集.\\\"+devName,subUrl,avatarUrl);\\n //copy(import_rule);\\n let ruleCode=parsePaste(import_rule.split(\\\"\\\\n\\\")[0]);\\n //return \\\"hiker://empty\\\"\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n return importUrl\\n },devName,subUrl,avatarUrl),\\n col_type: 'text_2'\\n});\\ndata.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入道德经</span>',\\n url: $().lazyRule((devName,subUrl,avatarUrl)=>{\\n let title = \\\"H-\\\"+devName;\\n let subObj = {\\n title: title,\\n url: subUrl,\\n desc: \\\"hiker://files/rules/dzHouse/ruleCache/\\\"+title+\\\".json\\\",\\n code: \\\"\\\",\\n active: false,//禁用并发更新\\n }\\n let shareText = base64Encode(JSON.stringify(subObj));\\n var pastes = getPastes();\\n var url = sharePaste(shareText,pastes.slice(-1)[0]);\\n let import_rule= \\\"轻合集订阅:\\\"+title+'\\\\n'+url;\\n copy(import_rule);\\n const path = 'hiker://files/rules/dzHouse/ruleCache/sub.json';\\n $.rc(config.lib.sub);\\n return 订阅导入(path)\\n },devName,subUrl,avatarUrl),\\n col_type: 'text_2'\\n});\\nlet can_upload_api = getApi(\\\"manCanUpload\\\")+id;\\nif(getVar('house.is_manager')){\\n let tips = can_upload?'能':'否';\\n // log('tips:'+tips);\\n // log('can_upload:'+can_upload);\\n data.push({\\n title:'⚠能否上传:'+(getVar('Warehouse.can_upload')||tips),\\n col_type:'scroll_button',\\n url:'hiker://empty'\\n });\\n function setUpload(flag,can_upload_api) {\\n flag = flag || '';\\n try {\\n let code = fetch(can_upload_api, {\\n headers: {\\\"User-Agent\\\": MOBILE_UA},\\n body: {\\n \\\"params\\\":\\n {\\n \\\"username\\\": getVar('house.username'),\\n \\\"password\\\": getVar('house.password'),\\n \\\"can_upload\\\": !!flag\\n }\\n }\\n });\\n code = JSON.parse(code).result;\\n if (code.status === 0) {\\n return code.detail\\n } else {\\n return '操作失败:' + code.detail\\n }\\n } catch (e) {\\n return '操作失败:' + e.message\\n }\\n }\\n data.push({\\n title:'🚫禁止上传',\\n col_type:'scroll_button',\\n url:$('禁止该开发者上传规则?你的操作将被系统记录').confirm((id,can_upload_api,setUpload)=>{\\n let ret = setUpload(false,can_upload_api);\\n if(!/操作失败/.test(ret)){\\n putVar('Warehouse.can_upload','否');\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },id,can_upload_api,setUpload)\\n });\\n data.push({\\n title:'✅允许上传',\\n col_type:'scroll_button',\\n url:$('允许该开发者上传规则?你的操作将被系统记录').confirm((id,can_upload_api,setUpload)=>{\\n let ret = setUpload(true,can_upload_api);\\n if(!/操作失败/.test(ret)){\\n putVar('Warehouse.can_upload','是');\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },id,can_upload_api,setUpload)\\n });\\n}\\ndata.push({\\n title: \\\"<small>提示:开发者单独分享的合集文件只能单独导入。</small>\\\",\\n col_type: \\\"rich_text\\\"\\n});\\ndata.push({\\n title: \\\"<big>规则列表</big>&nbsp;&nbsp;<small>(共\\\" + ruleList.length + \\\"条)</small>\\\",\\n col_type: \\\"rich_text\\\"\\n});\\nlet dataTypeList = {\\n \\\"\\\":\\\"全部\\\",\\n \\\"home_rule_url\\\": '小程序',\\n //\\\"publish\\\": '提交云仓库规则',\\n \\\"js_url\\\": '网页插件',\\n \\\"html\\\": '静态页面',\\n \\\"config\\\": '主题'\\n};\\nfor(let key in dataTypeList){\\n data.push({\\n title:dataType===key?\\\"““\\\"+dataTypeList[key]+\\\"””\\\":dataTypeList[key],\\n url:$(\\\"#noLoading#\\\").lazyRule((key)=>{\\n putVar(\\\"Warehouse.type\\\",key);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n },key),\\n col_type:\\\"scroll_button\\\"\\n });\\n}\\nif (ruleList.length > 20) {\\n data.push({\\n title: \\\"搜索\\\",\\n url: $.toString(name => \\\"hiker://search?s=\\\" + input + \\\"&rule=\\\" + name, MY_RULE.title),\\n col_type: \\\"input\\\",\\n desc: \\\"搜索当前开发者的规则\\\"\\n });\\n}\\nlet homeList = JSON.parse(request(api.home));\\nlet mRuleList = [];\\nfor (var item of ruleList) {\\n var name = item.name;\\n if (item.is_tap) {\\n let location = JSON.parse(request(getApi(\\\"ruleListJson\\\") + \\\"?id=\\\" + item.id));\\n item.id = location.id;\\n item.name = location.name;\\n item.author = location.author;\\n item.data_type = location.data_type;\\n item.ver = location.ver\\n }\\n item.version = item.ver;\\n let label = \\\"\\\",\\n lver = -2;\\n if (item.is_json && item.data_type === \\\"home_rule_url\\\") {\\n lver = localRuleVer(homeList, item);\\n if (lver === -1) {\\n label = \\\"🆕\\\";\\n } else if (lver < item.ver) {\\n label = \\\"🆙\\\";\\n }\\n }\\n mRuleList.push({\\n title: label + name,\\n url: \\\"hiker://page/ruleDetail#noHistory##noRecordHistory#\\\",\\n extra: {\\n lver: lver,\\n id: item.id\\n },\\n pic_url: item.pic,\\n });\\n}\\n/* 归并排序 Start */\\nif(getItem(\\\"排序\\\",\\\"时间优先\\\")==='新版优先'){\\n mRuleList = normalSort(mRuleList);\\n}\\n/* 归并排序 End */\\ndata.push.apply(data, mRuleList)\\nsetResult(data);\\n\"},{\"col_type\":\"movie_3\",\"name\":\"规则详细-user\",\"path\":\"ruleDetail\",\"rule\":\"js:\\n const {\\n getApi,\\n color,\\n small,\\n htmlTag,\\n api,\\n md\\n } = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n id,\\n lver,\\n isAll\\n} = MY_PARAMS;\\nif(getParam(\\\"id\\\")){\\n isAll = true;\\n id = getParam(\\\"id\\\");\\n lver = lver || \\\"未获取版本号\\\";\\n}\\naddListener('onClose', $.toString((isAll) => {\\n if(!isAll){\\n refreshPage(false);\\n }\\n},isAll));\\nlet dataItem = JSON.parse(request(getApi(\\\"getbyid\\\") + \\\"?id=\\\" + id)).result;\\nsetPageTitle(\\\"「\\\" + dataItem.name + \\\"」\\\")\\nlet ruleListJson = getApi(\\\"ruleListJson\\\") + \\\"?id=\\\";\\nlet data = [];\\nvar hasSub = false;\\n\\nif (dataItem.is_json_list) {\\n hasSub = hasHomeSub(ruleListJson + dataItem.id);\\n} else if (!dataItem.is_json_list && dataItem.data_type == 'home_rule_url') {\\n hasSub = hasHomeSub(ruleListJson + dataItem.id + '&debug=true');\\n}\\n\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"版本\\\"),\\n desc: \\\"““””开发者:\\\" + color(dataItem.author, \\\"#228BE6\\\") + \\\"\\\\n云端版本:\\\" + color(dataItem.ver, \\\"#5cff2c\\\") + \\\"\\\\t\\\\t本地版本:\\\" + color(lver, \\\"#5cff2c\\\") + \\\"\\\\n更新于: [\\\" + color(dataItem.last_update, \\\"#ff7000\\\") + \\\"]\\\",\\n url: $(\\\"<开发者>\\\\n\\\" + dataItem.author + \\\"\\\\n<名称>\\\\n\\\" + dataItem.name + \\\"\\\\n<云端版本>\\\\n\\\" + dataItem.ver + \\\"\\\\n<本地版本>\\\\n\\\" + lver + \\\"\\\\n<更新时间>\\\\n[\\\" + dataItem.last_update + \\\"]\\\").confirm(() => {}),\\n col_type: 'text_1'\\n});\\nlet dataType = {\\n home_rule_url: '首页云规则',\\n publish: '提交云仓库规则',\\n js_url: '网页插件规则',\\n html: '静态页面',\\n config: '主页配置'\\n};\\n\\nlet basic = {\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\"\\n};\\nlet dataTypeTips = dataType[dataItem.data_type] || '未知规则:' + dataItem.data_type;\\n\\nlet safe_tip=dataItem.is_safe?\\\"安全\\\":\\\"危险\\\";\\nlet good_tip = dataItem.is_good?small(color(\\\"【优质规则】\\\",'#ff7000')):\\\"\\\";\\nlet not_safe_note=dataItem.not_safe_note;\\nbasic.title = htmlTag(\\\"big\\\", \\\"类型\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(\\\"(id:\\\" + dataItem.id + \\\")\\\")+\\\"\\\\t\\\\t\\\\t\\\" + small(\\\"(风险检测:\\\" +safe_tip+\\\")\\\")+good_tip;\\nbasic.desc = \\\"数据类型:\\\" + color(dataTypeTips, \\\"#cb54ff\\\") + \\\"\\\\n分享状态为:\\\" + dataItem.state;\\nif ([\\\"html\\\", \\\"config\\\", \\\"js_url\\\"].includes(dataItem.data_type)) {\\n basic.desc += \\\"\\\\n““”” =>\\\" + small(\\\"点此预览\\\");\\n basic.url = ruleListJson + dataItem.id;\\n}\\n\\ndata.push(basic);\\nlet hasSubs = \\\"\\\";\\nif (hasSub) {\\n hasSubs = \\\"\\\\t\\\\t\\\\t\\\" + small(\\\"已订阅\\\")\\n}\\n\\nlet notes = request(getApi(\\\"get_rule_note\\\") + id);\\nnotes = JSON.parse(notes).result;\\nrequire(md);\\nlet notesHtml=\\\"\\\"\\ntry{\\n notesHtml=marked.parse(notes);\\n}catch(e){}\\n\\nif (notes !== false) {\\n data.push({\\n title: htmlTag(\\\"big\\\", \\\"备注\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(htmlTag(\\\"u\\\", \\\"查看完整公告 >\\\")),\\n desc: notes,\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra: {\\n text: notesHtml,\\n name: dataItem.name,\\n // type: \\\"long_text\\\"\\n type: \\\"rich_text\\\"\\n }\\n });\\n}\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"操作(分享详细页)\\\") + hasSubs,\\n col_type: \\\"text_1\\\",\\n url: \\\"copy://道长仓库「\\\"+dataItem.name+\\\"」\\\\n\\\"+id+'@import=js:$.require(\\\"hiker://page/ruleDetailImport?rule=道长仓库Pro\\\", input)'\\n});\\nlet importUrl, ruleCode, shareUrl, backCode = \\\"\\\";\\nif (!dataItem.is_json) {\\n backCode = request(ruleListJson + dataItem.id);\\n}\\nswitch (dataItem.data_type) {\\n case \\\"home_rule_url\\\":\\n ruleCode = \\\"海阔视界首页频道规则【\\\" + dataItem.name + \\\"】¥home_rule_url¥\\\" + ruleListJson + dataItem.id;\\n importUrl = \\\"rule://\\\" + base64Encode(ruleCode)\\n break;\\n case 'publish':\\n ruleCode = '海阔视界规则分享,当前分享的是:' + dataItem.name + '¥publish¥' + base64Encode(backCode);\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break;\\n case 'js_url':\\n ruleCode = '海阔视界规则分享,当前分享的是:网页插件¥js_url¥' + dataItem.name + '@base64://' + base64Encode(backCode);\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break;\\n case 'html':\\n let file_tmp = dataItem.name.split('.');\\n let file_path = file_tmp.length > 1 ? file_tmp[file_tmp.length - 1] + \\\"/\\\" + dataItem.name : dataItem.name;\\n ruleCode = \\\"海阔视界本地文件分享¥file_url¥hiker://files/rules/dzHouse/\\\" + file_path + \\\"@\\\" + ruleListJson + dataItem.id;\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break\\n case \\\"config\\\":\\n importUrl = $().rule(password => {\\n eval(fetch(\\\"hiker://assets/home.js\\\"));\\n HikerHome.load(\\\"import\\\", password);\\n }, backCode);\\n break;\\n}\\nlet my_col_type = \\\"text_2\\\";\\nlet my_col_type2 = \\\"text_3\\\";\\nif (importUrl) {\\n data.push({\\n title: \\\"导入规则\\\",\\n url: dataItem.is_safe?importUrl:'toast://风险规则禁止导入!!!',\\n col_type: my_col_type\\n });\\n}\\nif (ruleCode) {\\n data.push({\\n title: \\\"分享口令\\\",\\n url: \\\"copy://\\\" + ruleCode,\\n col_type: my_col_type\\n });\\n}\\n\\nif (importUrl) {\\n if (dataItem.is_json_list && !hasSub) {\\n let sub_rule_code = '海阔视界合集规则订阅¥home_sub¥' + dataItem.name + \\\"@@\\\" + ruleListJson + dataItem.id;\\n let sub_url = 'rule://' + base64Encode(sub_rule_code);\\n data.push({\\n title: '订阅合集',\\n url: sub_url,\\n col_type: my_col_type2\\n });\\n data.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入轻合集</span>',\\n url: $().lazyRule((dataItem,subUrl)=>{\\n const {genRule}=$.require(\\\"hiker://page/genApi\\\");\\n let import_rule=genRule(dataItem.name+\\\".\\\"+dataItem.author,subUrl);\\n //copy(import_rule);\\n let ruleCode=parsePaste(import_rule.split(\\\"\\\\n\\\")[0]);\\n //return \\\"hiker://empty\\\"\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n return importUrl\\n },dataItem,ruleListJson + dataItem.id),\\n col_type: my_col_type2\\n });\\n data.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入道德经</span>',\\n url: $().lazyRule((dataItem,subUrl)=>{\\n // let title = \\\"H-\\\"+dataItem.name+\\\".\\\"+dataItem.author;\\n let title = \\\"J-\\\"+dataItem.name.split('.')[0];\\n let subObj = {\\n title: title,\\n url: subUrl,\\n desc: \\\"hiker://files/rules/dzHouse/ruleCache/\\\"+title+\\\".json\\\",\\n code: \\\"\\\",\\n active: false,//禁用并发更新\\n }\\n let shareText = base64Encode(JSON.stringify(subObj));\\n var pastes = getPastes();\\n var url = sharePaste(shareText,pastes.slice(-1)[0]);\\n let import_rule= \\\"轻合集订阅:\\\"+title+'\\\\n'+url;\\n copy(import_rule);\\n const path = 'hiker://files/rules/dzHouse/ruleCache/sub.json';\\n $.rc(config.lib.sub);\\n return 订阅导入(path)\\n },dataItem,ruleListJson + dataItem.id),\\n col_type: my_col_type2\\n });\\n data.push({\\n title: \\\"<small>提示:开发者单独分享的合集文件只能单独导入。</small>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n } else if (!dataItem.is_json_list && !hasSub && dataItem.data_type == 'home_rule_url') {\\n let sub_rule_code = '海阔视界单规则订阅¥home_sub¥' + dataItem.name + \\\"@@\\\" + ruleListJson + dataItem.id + '&debug=true';\\n let sub_url = 'rule://' + base64Encode(sub_rule_code);\\n data.push({\\n title: '订阅规则',\\n url: sub_url,\\n col_type: my_col_type\\n })\\n }\\n}\\nif (dataItem.is_json && dataItem.data_type === \\\"home_rule_url\\\" && !dataItem.is_json_list) {\\n data.push({\\n title: '进入频道',\\n url: $( /*\\\"#noLoading#\\\"*/ ).lazyRule((name,home) => {\\n let ruleList = JSON.parse(request(home));\\n let hasRule = ruleList.some(item => item.title === name);\\n if (hasRule) {\\n putVar(\\\"Warehouse.back\\\", \\\"1\\\");\\n back();\\n return home+\\\"s@\\\" + name;\\n } else {\\n return \\\"toast://未安装\\\";\\n }\\n }, dataItem.name,api.home),\\n col_type: my_col_type\\n })\\n}\\nlet man_rule_safe = getApi(\\\"manRuleSafe\\\")+dataItem.id;\\nlet man_rule_good = getApi(\\\"manRuleGood\\\")+dataItem.id;\\n// dataItem.is_safe;\\nif(getVar('house.is_manager')){\\n function setIsSafe(flag,man_rule_safe) {\\n flag = flag || '';\\n try {\\n let code = fetch(man_rule_safe, {\\n headers: {\\\"User-Agent\\\": MOBILE_UA},\\n body: {\\n \\\"params\\\":\\n {\\n \\\"username\\\": getVar('house.username'),\\n \\\"password\\\": getVar('house.password'),\\n \\\"is_safe\\\": !!flag\\n }\\n }\\n });\\n code = JSON.parse(code).result;\\n if (code.status === 0) {\\n return code.detail\\n } else {\\n return '操作失败:' + code.detail\\n }\\n } catch (e) {\\n return '操作失败:' + e.message\\n }\\n }\\n function setIsGood(flag,man_rule_good) {\\n flag = flag || '';\\n try {\\n let code = fetch(man_rule_good, {\\n headers: {\\\"User-Agent\\\": MOBILE_UA},\\n body: {\\n \\\"params\\\":\\n {\\n \\\"username\\\": getVar('house.username'),\\n \\\"password\\\": getVar('house.password'),\\n \\\"is_good\\\": !!flag\\n }\\n }\\n });\\n code = JSON.parse(code).result;\\n if (code.status === 0) {\\n return code.detail\\n } else {\\n return '操作失败:' + code.detail\\n }\\n } catch (e) {\\n return '操作失败:' + e.message\\n }\\n }\\n data.push({\\n title:'🚫风险',\\n col_type:'scroll_button',\\n url:$('标记该规则为风险?风险规则无法被导入').confirm((id,man_rule_safe,setIsSafe)=>{\\n let ret = setIsSafe(false,man_rule_safe);\\n if(!/操作失败/.test(ret)){\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },dataItem.id,man_rule_safe,setIsSafe)\\n });\\n data.push({\\n title:'✅正常',\\n col_type:'scroll_button',\\n url:$('标记该规则为正常?').confirm((id,man_rule_safe,setIsSafe)=>{\\n let ret = setIsSafe(true,man_rule_safe);\\n if(!/操作失败/.test(ret)){\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },dataItem.id,man_rule_safe,setIsSafe)\\n });\\n data.push({\\n title:'♥非优质',\\n col_type:'scroll_button',\\n url:$('标记该规则为非优质?').confirm((id,man_rule_good,setIsGood)=>{\\n let ret = setIsGood(false,man_rule_good);\\n if(!/操作失败/.test(ret)){\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },dataItem.id,man_rule_good,setIsGood)\\n });\\n data.push({\\n title:'💖优质',\\n col_type:'scroll_button',\\n url:$('标记该规则为优质?').confirm((id,man_rule_good,setIsGood)=>{\\n let ret = setIsGood(true,man_rule_good);\\n if(!/操作失败/.test(ret)){\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },dataItem.id,man_rule_good,setIsGood)\\n });\\n}\\n\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\ndata.push({\\n title: dataItem.good_num,\\n pic_url: \\\"hiker://files/icon/赞.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://page/MakeAcomment#noHistory##noRecordHistory#\\\",\\n extra: {\\n id: dataItem.id,\\n name: dataItem.name\\n }\\n});\\ndata.push({\\n title: dataItem.bad_num,\\n pic_url: \\\"hiker://files/icon/踩.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://page/MakeAcomment#noHistory##noRecordHistory#\\\",\\n extra: {\\n id: dataItem.id,\\n name: dataItem.name,\\n defaultType:\\\"bad\\\"\\n }\\n});\\ndata.push({\\n title: \\\"评论\\\",\\n pic_url: \\\"hiker://files/icon/评论.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://page/MakeAcomment#noHistory##noRecordHistory#\\\",\\n extra: {\\n id: dataItem.id,\\n name: dataItem.name\\n }\\n});\\nlet totalSum = dataItem.good_num + dataItem.bad_num;\\n\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"评论(\\\" + totalSum + \\\")\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(htmlTag(\\\"u\\\", \\\"查看全部评论 >\\\")),\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/Comment\\\",\\n extra: {\\n url: \\\"hiker://empty#fypage#noHistory##noRecordHistory#\\\",\\n id: dataItem.id,\\n totalSum: totalSum,\\n no_active: false\\n }\\n});\\n//const longestSum=120;\\nlet icon = {\\n \\\"good\\\": \\\"👍\\\",\\n \\\"bad\\\": \\\"👎\\\",\\n \\\"reply\\\":\\\"开发者🗣\\\"\\n}\\nif (totalSum === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>一条评论也没有,快来抢沙发吧!</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n} else {\\n let commentList = JSON.parse(request(api.dis_get + dataItem.id + \\\"?limit=5\\\")).result;\\n for (let item of commentList) {\\n let Reply = item.discuss_type===\\\"reply\\\"&&item.reply_to_name!==false&&item.reply_to_id!==false?\\\"‘‘回复@\\\"+item.reply_to_name+\\\" #\\\"+item.discuss_id+\\\"’’\\\\n\\\":\\\"\\\";\\n data.push({\\n title: item.name + \\\"&nbsp;&nbsp;<font color='gray'><small>#\\\" + item.id + \\\"</small><font>\\\",\\n col_type: \\\"avatar\\\",\\n //url: \\\"toast://\\\" + item.qq,\\n url:\\\"mqqwpa://im/chat?chat_type=wpa&uin=\\\"+item.qq,\\n pic_url: item.avatar_url\\n });\\n data.push({\\n title: item.discuss_text,\\n desc: Reply+item.create_date + \\\"·\\\" + icon[item.discuss_type],\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra:{\\n name:item.name,\\n type:\\\"long_text\\\",\\n text:item.discuss_text\\n },\\n pic_url: item.avatar_url\\n });\\n }\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n}\\n\\nsetResult(data);\"},{\"col_type\":\"rich_text\",\"name\":\"查看\",\"path\":\"info\",\"rule\":\"js:\\nsetPageTitle(\\\"查看「\\\"+MY_PARAMS.name+\\\"」\\\")\\nsetResult([{\\n title: MY_PARAMS.text,\\n col_type:MY_PARAMS.type\\n}]);\"},{\"col_type\":\"movie_3\",\"name\":\"开发者注册\",\"path\":\"Register\",\"rule\":\"js:\\nsetPageTitle(\\\"开发者注册\\\");\\nconst {\\n getApi,\\n htmlTag,\\n mapColType,\\n small\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nvar data = [];\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.Password\\\");\\n clearVar(\\\"Warehouse.Username\\\");\\n clearVar(\\\"Warehouse.Description\\\");\\n clearVar(\\\"Warehouse.UserAddress\\\");\\n}));\\naddListener('onRefresh', $.toString(()=>{\\n putVar(\\\"Warehouse.Wait\\\", \\\"\\\");\\n}));\\ndata.push({\\n title: '账号',\\n desc: \\\"请输入账号(必填)\\\",\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('Warehouse.Username', ''),\\n type: \\\"number\\\",\\n onChange: 'putVar(\\\"Warehouse.Username\\\",input)'\\n }\\n}, {\\n title: '密码',\\n desc: \\\"请输入密码(必填)\\\",\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('Warehouse.Password', ''),\\n type: \\\"password\\\",\\n onChange: 'putVar(\\\"Warehouse.Password\\\",input)'\\n }\\n});\\nmapColType(data, \\\"line_blank\\\", 1);\\ndata.push({\\n title: '昵称',\\n desc: \\\"请输入昵称(必填)\\\",\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('Warehouse.UserAddress', ''),\\n onChange: 'putVar(\\\"Warehouse.UserAddress\\\",input)'\\n }\\n}, {\\n title: '描述',\\n desc: \\\"说说为什么要注册吧\\\\n(可以增加通过概率,选填)\\\",\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('Warehouse.Description', ''),\\n type: \\\"textarea\\\",\\n onChange: 'putVar(\\\"Warehouse.Description\\\",input)'\\n }\\n})\\n\\nmapColType(data, \\\"line_blank\\\", 1);\\n\\ndata.push({\\n title: htmlTag(\\\"b\\\", \\\"注册\\\"),\\n url: $(getApi(\\\"new_dev\\\")+\\\"#noLoading#\\\").lazyRule((getId, confirm) => {\\n let username = getVar('Warehouse.Username', \\\"\\\"),\\n password = getVar('Warehouse.Password', \\\"\\\"),\\n description = getVar('Warehouse.Description', \\\"\\\"),\\n name = getVar(\\\"Warehouse.UserAddress\\\", \\\"\\\");\\n if ([username, password, name].includes(\\\"\\\")) {\\n return \\\"toast://账号,密码和昵称不能为空\\\";\\n }\\n showLoading(\\\"正在提交申请表\\\");\\n let result = request(input, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"reason\\\": description,\\n \\\"name\\\": name,\\n \\\"password\\\": password,\\n \\\"qq\\\": username\\n }\\n }),\\n method: 'post'\\n });\\n result = JSON.parse(result).result;\\n hideLoading();\\n if (result.status !== 0) {\\n return \\\"toast://\\\" + result.detail;\\n }\\n let idresult = JSON.parse(request(getId + \\\"?qq=\\\" + username));\\n if (idresult.status !== 0) {\\n return \\\"toast://\\\" + idresult.detail;\\n }\\n \\n return $(\\\"\\\", \\\"输入邮箱验证码\\\\n\\\" + result.detail).input((confirm, id, account) => {\\n showLoading(\\\"请耐心等待\\\");\\n try {\\n let result = request(confirm, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"regist_id\\\": id,\\n \\\"yzm\\\": input\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status !== 0) {\\n hideLoading();\\n return \\\"toast://\\\" + result.detail;\\n } else {\\n putVar(\\\"WarehouseUsername\\\", account[0]);\\n putVar(\\\"WarehousePassword\\\", account[1]);\\n hideLoading();\\n back();\\n return \\\"toast://成功提交注册注册\\\\n\\\"+result.detail;\\n }\\n } catch (e) {\\n hideLoading();\\n return \\\"toast://出错了呐\\\";\\n }\\n }, confirm, idresult.result, [username, password]);\\n }, getApi(\\\"new_getId\\\"), getApi(\\\"new_confirm\\\")),\\n col_type: 'text_center_1'\\n});\\nsetResult(data);\"},{\"col_type\":\"text_1\",\"name\":\"个人资料\",\"path\":\"PersonalData\",\"rule\":\"js:\\nsetPageTitle(\\\"个人资料\\\");\\nvar data=[];\\nconst {\\n getApi,\\n getFile,\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\n\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\n\\nlet {username,password} = getFile();\\nlet dev = JSON.parse(request(getApi(\\\"user\\\")+MY_PARAMS.id)).result;\\ndata.push({\\n title:\\\"头像\\\",\\n desc:dev.avatar,\\n url:\\\"hiker://page/modify_PersonalData#noHistory##noRecordHistory#\\\",\\n extra:{\\n dev:dev,\\n username:username,\\n password:password,\\n Pattern:0\\n },\\n col_type:\\\"text_1\\\"\\n});\\n\\n\\ndata.push({\\n title:\\\"昵称\\\",\\n desc:dev.name,\\n url:\\\"hiker://page/modify_PersonalData#noHistory##noRecordHistory#\\\",\\n extra:{\\n dev:dev,\\n username:username,\\n password:password,\\n Pattern:1\\n },\\n col_type:\\\"text_1\\\"\\n});\\n\\ndata.push({\\n title:\\\"密码\\\",\\n url:\\\"hiker://page/modify_PersonalData#noHistory##noRecordHistory#\\\",\\n extra:{\\n dev:dev,\\n username:username,\\n password:password,\\n Pattern:2\\n },\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\ndata.push({\\n title:\\\"账号:\\\"+username,\\n url:\\\"copy://\\\"+username,\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n title:\\\"UID:\\\"+dev.id,\\n url:\\\"copy://\\\"+dev.id,\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\ndata.push({\\n title:\\\"提交云仓库规则\\\",\\n url:$(\\\"#noLoading#\\\").lazyRule((host)=>{\\n let code=request(host+\\\"/hikerule/rulelist.json?id=145\\\");\\n let word=\\\"¥publish¥\\\"+base64Encode(code);\\n return \\\"rule://\\\"+base64Encode(word);\\n },api.host),\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n title:\\\"同步提交云仓库账号密码\\\",\\n url:\\\"rule://\\\"+base64Encode(\\\"¥publish_account¥\\\"+username+\\\"@\\\"+password),\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\ndata.push({\\n title:\\\"你一共发布了「\\\"+dev.rule_num+\\\"」条规则\\\",\\n url:\\\"hiker://empty\\\",\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\nlet user = getFile();\\ndata.push({\\n title:\\\"注销登录\\\",\\n url:$(\\\"确认注销登录?\\\").confirm(f => {\\n f.username=\\\"\\\";\\n f.password=\\\"\\\";\\n writeFile('hiker://files/WarehouseUSER.json', JSON.stringify(f));\\n putVar(\\\"Warehouse.back\\\",\\\"1\\\");\\n back();\\n return \\\"toast://已注销\\\";\\n },user),\\n col_type:\\\"text_center_1\\\"\\n});\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"更改个人资料\",\"path\":\"modify_PersonalData\",\"rule\":\"js:\\nconst {\\n getApi,\\n color,\\n small,\\n getFile,\\n htmlTag\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n dev,\\n username,\\n password,\\n Pattern\\n} = MY_PARAMS;\\nvar data = [];\\nlet path = \\\"?qq=\\\" + username + \\\"&password=\\\" + password;\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.m.petName\\\");\\n clearVar(\\\"Warehouse.m.avatar\\\");\\n clearVar(\\\"Warehouse.m.Password.c\\\");\\n clearVar(\\\"Warehouse.m.Password.x\\\");\\n clearVar(\\\"Warehouse.m.Password.y\\\");\\n}));\\nfunction m_petName() {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n col_type: 'input',\\n desc: \\\"请输入新昵称\\\",\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.m.petName', '')||dev.name,\\n onChange: 'putVar(\\\"Warehouse.m.petName\\\",input)'\\n }\\n });\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title: \\\"保存\\\",\\n url: $(getApi(\\\"modify_name\\\") + path).lazyRule(() => {\\n let newPetName = getVar('Warehouse.m.petName', '');\\n if (newPetName == \\\"\\\") {\\n return \\\"toast://你还什么都没填啊!\\\";\\n }\\n let result = request(input + \\\"&name=\\\" + encodeURIComponent(newPetName));\\n result = JSON.parse(result);\\n if (result.status === 0) {\\n back();\\n return \\\"toast://修改成功\\\";\\n } else {\\n return \\\"toast://\\\" + result.detail;\\n }\\n }),\\n col_type: 'text_center_1'\\n });\\n}\\n\\nfunction m_avatar() {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n col_type: 'input',\\n desc: \\\"请输入新的头像链接\\\",\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.m.avatar', '') || dev.avatar,\\n onChange: 'putVar(\\\"Warehouse.m.avatar\\\",input)'\\n }\\n });\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title: \\\"保存\\\",\\n url: $(getApi(\\\"modify_ava\\\") + path).lazyRule(() => {\\n let newAvatar = getVar('Warehouse.m.avatar', '');\\n \\n let result = request(input + \\\"&avatar_url=\\\" + encodeURIComponent(newAvatar));\\n result = JSON.parse(result);\\n if (result.status === 0) {\\n back();\\n return \\\"toast://修改成功\\\";\\n } else {\\n return \\\"toast://\\\" + result.detail;\\n }\\n }),\\n col_type: 'text_center_1'\\n });\\n}\\n\\nfunction m_pwd() {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title:\\\"原密码\\\",\\n col_type: 'input',\\n desc: \\\"请输入原密码\\\",\\n extra: {\\n type:\\\"password\\\",\\n defaultValue: getVar('Warehouse.m.Password.y', ''),\\n onChange: 'putVar(\\\"Warehouse.m.Password.y\\\",input)'\\n }\\n });\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title:\\\"新密码\\\",\\n col_type: 'input',\\n desc: \\\"请输入新密码\\\",\\n extra: {\\n type:\\\"password\\\",\\n defaultValue: getVar('Warehouse.m.Password.x', ''),\\n onChange: 'putVar(\\\"Warehouse.m.Password.x\\\",input)'\\n }\\n });\\n data.push({\\n title:\\\"重复新密码\\\",\\n col_type: 'input',\\n desc: \\\"请重复新密码\\\",\\n extra: {\\n type:\\\"password\\\",\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.m.Password.c', ''),\\n onChange: 'putVar(\\\"Warehouse.m.Password.c\\\",input)'\\n }\\n });\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title: \\\"保存\\\",\\n url: $(getApi(\\\"modify_pwd\\\")+path).lazyRule((password,username) => {\\n let old_password = getVar('Warehouse.m.Password.y', '');\\n let new_password = getVar('Warehouse.m.Password.x', '');\\n let new_password_again = getVar('Warehouse.m.Password.c', '');\\n if (old_password!==password) {\\n return \\\"toast://原密码错误\\\";\\n }\\n if(new_password===\\\"\\\"){\\n return \\\"toast://请输入新密码\\\";\\n }\\n if(new_password!==new_password_again){\\n return \\\"toast://两次密码不同\\\"\\n }\\n let result = request(input + \\\"&new_password=\\\" + new_password+\\\"&new_password_re=\\\"+new_password_again);\\n result = JSON.parse(result);\\n if (result.status === 0) {\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\",JSON.stringify({\\n username:username,\\n password:new_password\\n }));\\n back();\\n return \\\"toast://修改成功\\\";\\n } else {\\n return \\\"toast://\\\" + result.detail;\\n }\\n },password,username),\\n col_type: 'text_center_1'\\n });\\n}\\n\\nswitch (Pattern) {\\n case 0:\\n setPageTitle(\\\"修改头像\\\");\\n m_avatar();\\n break;\\n case 1:\\n setPageTitle(\\\"修改昵称\\\");\\n m_petName();\\n break;\\n case 2:\\n setPageTitle(\\\"修改密码\\\");\\n m_pwd();\\n break;\\n}\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"编辑规则备注\",\"path\":\"set_rule_notes\",\"rule\":\"js:\\nlet data = [];\\nconst {\\n getApi\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n id,\\n username,\\n password,\\n name\\n} = MY_PARAMS;\\nsetPageTitle(\\\"备注「\\\"+name+\\\"」\\\");\\naddListener('onClose',\\\"clearVar('Warehouse.rule.notes', '')\\\");\\nlet notes=request(getApi(\\\"get_rule_note\\\")+id);\\nnotes=JSON.parse(notes).result;\\ndata.push({\\n desc: \\\"规则备注......\\\",\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.rule.notes', '')||notes||\\\"\\\",\\n type: \\\"textarea\\\",\\n height:-1,\\n onChange: 'putVar(\\\"Warehouse.rule.notes\\\",input)'\\n }\\n});\\n\\ndata.push({\\n title: \\\"保存\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(getApi(\\\"set_rule_note\\\") + id).lazyRule((username, password) => {\\n let notes = getVar('Warehouse.rule.notes', '');\\n let result = request(input, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"qq\\\": username,\\n \\\"password\\\": password,\\n \\\"note\\\":notes\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status !== 0) {\\n return \\\"toast://\\\" + result.detail;\\n }\\n back(false);\\n return \\\"toast://修改成功\\\";\\n }, username, password)\\n});\\nsetResult(data);\"},{\"col_type\":\"line\",\"name\":\"评论列表\",\"path\":\"Comment\",\"rule\":\"js:\\nsetPageTitle(\\\"评论列表\\\");\\nconst {\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet data = [];\\nlet {\\n totalSum,\\n id,\\n no_active,\\n username,\\n password\\n} = MY_PARAMS;\\nlet page = parseInt(MY_URL.split(\\\"#\\\")[1]);\\nlet discuss_type = getVar(\\\"Warehouse.comment.discuss_type\\\", \\\"\\\");\\nif (page === 1) {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n addListener('onClose', $.toString(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"\\\");\\n }));\\n data.push({\\n title: \\\"全部\\\" + (discuss_type === \\\"\\\" ? \\\"◉\\\" : \\\"○\\\"),\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_4'\\n\\n });\\n data.push({\\n title: \\\"👍赞\\\" + (discuss_type === \\\"good\\\" ? \\\"◉\\\" : \\\"○\\\"),\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"good\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_4'\\n\\n });\\n data.push({\\n title: \\\"👎踩\\\" + (discuss_type === \\\"bad\\\" ? \\\"◉\\\" : \\\"○\\\"),\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"bad\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_4'\\n });\\n data.push({\\n title: \\\"回复\\\" + (discuss_type === \\\"reply\\\" ? \\\"◉\\\" : \\\"○\\\"),\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"reply\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_4'\\n });\\n}\\n\\n\\nlet icon = {\\n \\\"good\\\": \\\"👍\\\",\\n \\\"bad\\\": \\\"👎\\\",\\n \\\"reply\\\":\\\"开发者🗣\\\"\\n}\\nlet control=(pid,active)=>void 0;\\nif(no_active){\\n control=function(pid,active){\\n data.push({\\n title:active?\\\"隐藏评论\\\":\\\"展示评论\\\",\\n url:$(api.dis_dev_control+pid+\\\"?qq=\\\" + username + \\\"&password=\\\" + password+\\\"#noLoading#\\\").lazyRule(()=>{\\n let result=JSON.parse(request(input));\\n refreshPage(false)\\n return \\\"toast://\\\"+result.detail;\\n }),\\n col_type:\\\"text_2\\\"\\n });\\n data.push({\\n title:\\\"删除评论\\\",\\n url:$(\\\"确认删除该评论?\\\").confirm((input)=>{\\n let result=JSON.parse(request(input));\\n refreshPage(false)\\n return \\\"toast://\\\"+result.detail;\\n },api.dis_dev_control+pid+\\\"?qq=\\\" + username + \\\"&password=\\\" + password+\\\"&delete=1\\\"),\\n col_type:\\\"text_2\\\"\\n });\\n data.push({\\n col_type:\\\"line\\\"\\n });\\n data.push({\\n col_type:\\\"line\\\"\\n });\\n }\\n}\\nif (totalSum === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>一条评论也没有,快来抢沙发吧!</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n} else {\\n let commentList = JSON.parse(request(api.dis_get + id + \\\"?limit=5&page=\\\" + page + \\\"&no_active=\\\" + no_active + \\\"&discuss_type=\\\" + discuss_type)).result;\\n for (let item of commentList) {\\n let Reply = item.discuss_type===\\\"reply\\\"&&item.reply_to_name!==false&&item.reply_to_id!==false?\\\"‘‘回复@\\\"+item.reply_to_name+\\\" #\\\"+item.discuss_id+\\\"’’\\\\n\\\":\\\"\\\";\\n data.push({\\n title: item.name + \\\"&nbsp;&nbsp;<font color='gray'><small>#\\\" + item.id + \\\"</small><font>\\\",\\n col_type: \\\"avatar\\\",\\n //url: no_active?\\\"hiker://page/Reply\\\":\\\"toast://\\\" + item.qq,\\n\\t\\t url:no_active?\\\"hiker://page/Reply\\\":\\\"mqqwpa://im/chat?chat_type=wpa&uin=\\\"+item.qq,\\n extra:{\\n ruleId: id,\\n name: item.name,\\n password: password,\\n username: username,\\n replyId:item.id\\n },\\n pic_url: item.avatar_url\\n });\\n data.push({\\n title: item.discuss_text,\\n desc: Reply+item.create_date + \\\"·\\\" + icon[item.discuss_type],\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra:{\\n name:item.name,\\n type:\\\"long_text\\\",\\n text:item.discuss_text\\n },\\n pic_url: item.avatar_url\\n });\\n control(item.id,item.active);\\n }\\n if (commentList.length === 0) {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n }\\n}\\n\\nsetResult(data)\"},{\"col_type\":\"movie_3\",\"name\":\"发表评论\",\"path\":\"MakeAcomment\",\"rule\":\"js:\\nlet data = [];\\nconst {\\n api,\\n getFile\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n id,\\n name,\\n defaultType\\n} = MY_PARAMS;\\nlet user=getFile().user||[\\\"\\\",\\\"\\\"];\\n\\nsetPageTitle(\\\"评论(\\\" + name + \\\")\\\");\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.comment.type\\\");\\n clearVar(\\\"Warehouse.comment.text\\\");\\n clearVar(\\\"Warehouse.comment.qq\\\");\\n refreshPage(false);\\n}));\\nlet type = getVar(\\\"Warehouse.comment.type\\\") || defaultType||\\\"good\\\";\\ndata.push({\\n desc: \\\"评论......\\\",\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.comment.text', ''),\\n type: \\\"textarea\\\",\\n height:7,\\n onChange: 'putVar(\\\"Warehouse.comment.text\\\",input)'\\n }\\n});\\ndata.push({\\n title:\\\"账号:\\\"+(user[0]||\\\"\\\"),\\n desc:\\\"验证码:\\\"+(user[1]||\\\"\\\"),\\n url:\\\"hiker://page/Userregistration\\\",\\n col_type: 'text_1',\\n \\n});\\n\\ndata.push({\\n title: (type === \\\"good\\\" ? \\\"◉\\\" : \\\"○\\\")+\\\" 👍\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.type\\\", \\\"good\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_2'\\n\\n});\\ndata.push({\\n title: (type === \\\"bad\\\" ? \\\"◉\\\" : \\\"○\\\")+\\\" 👎\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.type\\\", \\\"bad\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_2'\\n});\\n\\ndata.push({\\n title: \\\"提交\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(api.dis_new + id).lazyRule((Account) => {\\n let text = getVar('Warehouse.comment.text', '');\\n let [qq,auth_code] = Account;\\n let type = getVar('Warehouse.comment.type') || 'good';\\n qq=qq||\\\"\\\";\\n auth_code=auth_code||\\\"\\\";\\n if(qq==\\\"\\\"||auth_code==\\\"\\\"){\\n return \\\"toast://未登录账号\\\";\\n }\\n if(text==\\\"\\\"){\\n return \\\"toast://你还什么都没写啊\\\";\\n }\\n function r(p) {\\n let result = request(input, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify(p),\\n method: 'POST'\\n });\\n return JSON.parse(result).result;\\n }\\n let p = {\\n \\\"params\\\": {\\n \\\"discuss_text\\\": text,\\n \\\"qq\\\": qq,\\n \\\"discuss_type\\\": type,\\n \\\"auth_code\\\": auth_code\\n }\\n }\\n let result = r(p);\\n if(result.status===0){\\n back(false);\\n }\\n return \\\"toast://\\\"+result.detail;\\n\\n },user)\\n});\\n\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"伪用户注册\",\"path\":\"Userregistration\",\"rule\":\"js:\\nconst {\\n api,\\n getFile,\\n getUserDate\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet data = [];\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\nsetPageTitle(\\\"用户列表管理\\\");\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.m.qq\\\");\\n clearVar(\\\"Warehouse.m.yzm\\\");\\n}));\\nlet user = getFile();\\nlet userName = user.user || [\\\"\\\"];\\nuserName = userName[0];\\ndata.push({\\n title: \\\"““””<big>(添加/验证)账号</big>\\\",\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\"\\n});\\n\\ndata.push({\\n title: \\\"获取\\\",\\n col_type: 'input',\\n desc: \\\"请输入qq\\\",\\n url: $.toString((a, b) => {\\n let qq = input;\\n if (qq == \\\"\\\") {\\n return \\\"toast://你还什么都没填啊!\\\";\\n }\\n showLoading(\\\"获取中...\\\")\\n return $(\\\"#noLoading#\\\").lazyRule((qq, a, b) => {\\n try {\\n let result = request(a, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"qq\\\": qq\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status === 0) {\\n hideLoading();\\n return \\\"toast://\\\" + result.detail;\\n } else {\\n let result2 = JSON.parse(request(b + \\\"?qq=\\\" + qq));\\n hideLoading();\\n return \\\"toast://\\\" + result2.detail;\\n }\\n } catch (e) {\\n hideLoading();\\n throw e;\\n }\\n }, qq, a, b);\\n\\n }, api.dis_new_user, api.dis_verify),\\n extra: {\\n type: \\\"number\\\",\\n defaultValue: getVar('Warehouse.m.qq', '') || userName,\\n onChange: 'putVar(\\\"Warehouse.m.qq\\\",input)'\\n }\\n});\\n\\ndata.push({\\n col_type: 'input',\\n desc: \\\"请输入验证码\\\",\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.m.yzm', ''),\\n onChange: 'putVar(\\\"Warehouse.m.yzm\\\",input)'\\n }\\n});\\ndata.push({\\n col_type: 'rich_text',\\n title: \\\"<small>提示:1.每天只能获取5次验证码.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.<s>验证码有效期持续一周左右</s>(暂时不会,忘记验证码可通过QQ号获取)</small>\\\"\\n});\\n\\nlet userList = getUserDate();\\ndata.push({\\n title: \\\"验证/登录\\\",\\n url: $(\\\"确定保存,验证码填错,无法评论哦\\\").confirm((f, l, login) => {\\n let qq = getVar('Warehouse.m.qq', '');\\n let yzm = getVar('Warehouse.m.yzm', '');\\n if (qq == \\\"\\\" || yzm == \\\"\\\") {\\n return \\\"toast://qq或验证码为空\\\";\\n }\\n let result = request(login, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"qq\\\": qq,\\n \\\"auth_code\\\": yzm\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status === 0) {\\n f.user = [qq, yzm];\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\", JSON.stringify(f));\\n let index = l.findIndex(item => item[0] === qq);\\n if (index > -1) {\\n l.splice(index, 1, [qq, yzm]);\\n } else if (l.length < 6) {\\n l.push([qq, yzm]);\\n } else {\\n l.splice(0, 1);\\n l.push([qq, yzm]);\\n }\\n writeFile(\\\"hiker://files/WarehouseUSERA.json\\\", JSON.stringify(l));\\n back();\\n return \\\"toast://验证成功\\\";\\n }\\n return \\\"toast://\\\" + result.detail;\\n }, user, userList, api.dis_login),\\n col_type: 'text_center_1'\\n});\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\ndata.push({\\n title: \\\"““””<big>账号列表</big>\\\\t\\\\t\\\\t<small>(保留5条记录)</small>\\\",\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\"\\n});\\nuserList.reverse();\\n\\nfor (let item of userList) {\\n data.push({\\n title: \\\"账号:\\\" + item[0] + (userName === item[0] ? \\\"\\\\t\\\\t\\\\t““[当前账号]””\\\" : \\\"\\\"),\\n desc: \\\"验证码:\\\" + item[1],\\n url: $(\\\"是否切换为该[\\\" + item[0] + \\\"]账号\\\").confirm((f, item) => {\\n f.user = item;\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\", JSON.stringify(f));\\n back();\\n return \\\"toast://切换成功\\\";\\n }, user, item),\\n col_type: \\\"text_1\\\"\\n });\\n}\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\ndata.push({\\n title: \\\"退出账号\\\",\\n url: $(\\\"确认退出登录状态\\\").confirm((f) => {\\n f.user = [];\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\", JSON.stringify(f));\\n back();\\n return \\\"toast://退出成功\\\";\\n }, user),\\n col_type: 'text_center_1'\\n});\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"列表排序算法\",\"path\":\"sort\",\"rule\":\"js:\\n/* 规则列表排序 [ UP、NEW、无更新 ] 顺序 */\\n/* 归并排序 Start */\\n/*\\nfunction mergeSort(arr) {\\n var len = arr.length;\\n if (len < 2) {\\n return arr;\\n }\\n var middle = Math.floor(len / 2),\\n left = arr.slice(0, middle),\\n right = arr.slice(middle);\\n return merge(mergeSort(left), mergeSort(right));\\n}\\nfunction merge(left, right) {\\n var result = [];\\n var isThisVersionList = [];\\n\\n while (left.length > 0 && right.length > 0) {\\n if (left[0].title.includes(\\\"🆙\\\")) {\\n result.push(left.shift());\\n } else if (right[0].title.includes(\\\"🆙\\\")) {\\n result.push(right.shift());\\n } else if (left[0].title.includes(\\\"🆕\\\")) {\\n result.push(left.shift());\\n } else if (right[0].title.includes(\\\"🆕\\\")) {\\n result.push(right.shift());\\n } else {\\n isThisVersionList.push(left.shift());\\n isThisVersionList.push(right.shift());\\n }\\n }\\n\\n while (isThisVersionList.length) result.push(isThisVersionList.shift());\\n\\n while (left.length)\\n result.push(left.shift());\\n\\n while (right.length)\\n result.push(right.shift());\\n\\n return result;\\n}\\n$.exports.mergeSort = mergeSort;\\n*/\\n/* 归并排序 End */\\n/* 普通分类排序 Start */\\nfunction normalSort(arr) {\\n var len = arr.length;\\n if (len < 2) {\\n return arr;\\n }\\n let upResult = [];\\n let otherResult = [];\\n while(arr.length) {\\n let item = arr.shift();\\n if(item.title.includes(\\\"🆙\\\")) {\\n upResult.push(item)\\n } else {\\n otherResult.push(item)\\n }\\n }\\n return upResult.concat(otherResult);\\n}\\n$.exports.normalSort = normalSort;\\n/* 普通分类排序 End */\"},{\"col_type\":\"icon_2_round\",\"name\":\"全部公开规则\",\"path\":\"AllPublicRule\",\"rule\":\"js:\\n const {\\n api,\\n localRuleVer,\\n getApi\\n } = $.require(\\\"hiker://page/utiliy\\\");\\nconst {\\n mergeSort\\n} = $.require(\\\"hiker://page/sort\\\");\\nlet dataType = getVar(\\\"Warehouse.type\\\", \\\"\\\");\\nlet order = getVar(\\\"Warehouse.order\\\", \\\"0\\\");\\nlet sort = getVar(\\\"Warehouse.sort\\\", \\\"0\\\");\\nlet good = getVar(\\\"Warehouse.good\\\", \\\"\\\");\\nlet page = MY_URL.split(\\\"#\\\")[1] || 1;\\nlet ruleList = JSON.parse(request(api.all_rule + \\\"?data_type=\\\" + dataType + \\\"&page=\\\" + page + \\\"&limit=20&order=\\\" + order + \\\"&sort=\\\" + sort+ \\\"&is_good=\\\" + good)).result;\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.type\\\");\\n clearVar(\\\"Warehouse.order\\\");\\n clearVar(\\\"Warehouse.sort\\\");\\n clearVar(\\\"Warehouse.good\\\");\\n clearVar(\\\"Warehouse.back\\\");\\n}));\\nlet data = [];\\nif (getVar(\\\"Warehouse.back\\\") === \\\"1\\\") {\\n back();\\n}\\nfunction tab(arr, type, contrast) {\\n for (let item of arr) {\\n data.push({\\n title: item[1] === contrast ? \\\"““\\\" + item[0] + \\\"””\\\" : item[0],\\n url: $(\\\"#noLoading#\\\").lazyRule((key, type) => {\\n putVar(type, key);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, item[1], type),\\n col_type: \\\"scroll_button\\\"\\n });\\n }\\n data.push({\\n col_type: \\\"blank_block\\\"\\n });\\n}\\nif (page === \\\"1\\\") {\\n tab([\\n [\\\"全部\\\", \\\"\\\"],\\n [\\\"小程序\\\", \\\"home_rule_url\\\"],\\n [\\\"提交云仓库规则\\\", \\\"publish\\\"],\\n [\\\"网页插件\\\", \\\"js_url\\\"],\\n [\\\"静态页面\\\", \\\"html\\\"],\\n [\\\"主题\\\", \\\"config\\\"]\\n ], \\\"Warehouse.type\\\", dataType);\\n tab([\\n [\\\"时间\\\", \\\"0\\\"],\\n [\\\"ID\\\", \\\"1\\\"],\\n [\\\"好评度\\\", \\\"2\\\"],\\n [\\\"差评度\\\", \\\"3\\\"],\\n [\\\"回复数\\\", \\\"4\\\"]\\n ], \\\"Warehouse.order\\\", order);\\n tab([\\n [\\\"倒序\\\", \\\"0\\\"],\\n [\\\"正序\\\", \\\"1\\\"]\\n ], \\\"Warehouse.sort\\\", sort);\\n tab([\\n [\\\"不论\\\", \\\"\\\"],\\n [\\\"优质\\\", \\\"1\\\"]\\n ], \\\"Warehouse.good\\\", good);\\n data.push({\\n title: \\\"搜索\\\",\\n url: $.toString(name => \\\"hiker://search?s=\\\" + input + \\\"&rule=\\\" + name, MY_RULE.title),\\n col_type: \\\"input\\\",\\n desc: \\\"搜索全部规则\\\"\\n });\\n}\\n\\nlet homeList = JSON.parse(request(api.home));\\nlet mRuleList = [];\\nfor (var item of ruleList) {\\n var name = item.name;\\n if (item.is_tap) {\\n let location = JSON.parse(request(getApi(\\\"ruleListJson\\\") + \\\"?id=\\\" + item.id));\\n item.id = location.id;\\n item.name = location.name;\\n item.author = location.author;\\n item.data_type = location.data_type;\\n item.ver = location.ver\\n }\\n item.version = item.ver;\\n let label = \\\"\\\",\\n lver = -2;\\n if (item.is_json && item.data_type === \\\"home_rule_url\\\") {\\n lver = localRuleVer(homeList, item);\\n if (lver === -1) {\\n label = \\\"🆕\\\";\\n } else if (lver < item.ver) {\\n label = \\\"🆙\\\";\\n }\\n }\\n mRuleList.push({\\n title: label + name,\\n url: \\\"hiker://page/ruleDetail#noHistory##noRecordHistory#\\\",\\n extra: {\\n lver: lver,\\n id: item.id,\\n isAll:true\\n },\\n pic_url: item.pic,\\n })\\n}\\n/* 归并排序 Start */\\n//mRuleList = mergeSort(mRuleList);\\n/* 归并排序 End */\\ndata.push.apply(data, mRuleList)\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"回复\",\"path\":\"Reply\",\"rule\":\"js:\\nlet data = [];\\nconst {\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n replyId,\\n ruleId,\\n name,\\n password,\\n username\\n} = MY_PARAMS;\\n\\n\\nsetPageTitle(\\\"回复(\\\" + name + \\\")\\\");\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.comment.text\\\");\\n refreshPage(false);\\n}));\\n\\ndata.push({\\n desc: \\\"回复......\\\",\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.comment.text', ''),\\n type: \\\"textarea\\\",\\n height:7,\\n onChange: 'putVar(\\\"Warehouse.comment.text\\\",input)'\\n }\\n});\\n\\n\\ndata.push({\\n title: \\\"提交\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(api.dis_reply + ruleId).lazyRule((password, username, ruleId) => {\\n let text = getVar('Warehouse.comment.text', '');\\n if (password == \\\"\\\" || username == \\\"\\\") {\\n return \\\"toast://未登录账号\\\";\\n }\\n if (text == \\\"\\\") {\\n return \\\"toast://你还什么都没写啊\\\";\\n }\\n let result = request(input, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"discuss_text\\\": text,\\n \\\"qq\\\": username,\\n \\\"password\\\": password,\\n \\\"discuss_id\\\": ruleId\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status === 0) {\\n back(false);\\n }\\n return \\\"toast://\\\" + result.detail;\\n\\n }, password, username, replyId)\\n});\\n\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"我的回复\",\"path\":\"MyReply\",\"rule\":\"js:\\nconst {\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n auth_code,\\n qq\\n} = MY_PARAMS;\\nlet page = parseInt(MY_URL.split(\\\"#\\\")[1]);\\nlet data=[];\\nlet commentList = JSON.parse(request(api.dis_get_reply + \\\"?limit=5&page=\\\" + page + \\\"&qq=\\\" + qq + \\\"&auth_code=\\\" + auth_code)).result;\\nif (commentList.length === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>别拉了一条也不剩了</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n} else {\\n for (let item of commentList) {\\n data.push({\\n title: item.name + \\\"&nbsp;&nbsp;<font color='gray'><small>#\\\" + item.id + \\\"</small><font>\\\",\\n col_type: \\\"avatar\\\",\\n url: \\\"hiker://page/ruleDetail#noHistory##noRecordHistory#\\\",\\n extra: {\\n lver: \\\"回复进入不支持查看\\\",\\n id: item.rule_id[0]\\n },\\n pic_url: item.avatar_url\\n });\\n data.push({\\n title: item.discuss_text,\\n desc: item.create_date + \\\"·\\\"+item.rule_id[1]+\\\"·\\\"+\\\"开发者🗣\\\",\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra:{\\n name:item.name,\\n type:\\\"long_text\\\",\\n text:item.discuss_text\\n },\\n pic_url: item.avatar_url\\n });\\n }\\n \\n}\\nsetResult(data);\\n\"},{\"col_type\":\"movie_3\",\"name\":\"更多分享\",\"path\":\"moreShare\",\"rule\":\"js:\\n addListener('onClose', $.toString(()=>{\\n clearVar(\\\"house.upload_code\\\");\\n }));\\nconst {color,small,api, getFile} = $.require(\\\"hiker://page/utiliy\\\");\\nlet houseFile = getFile||false;\\nlet put_url = api.host+'/hikerule/dev/put';\\nif(!houseFile){\\n setItem('is_house_vip', 'false');\\n}\\nlet house_data = houseFile();\\n// log(house_data.username+'-'+house_data.password);\\nvar canup = house_data.username.length >= 6 && house_data.password.length > 2;\\nlog('可以上传?'+canup);\\nlet d = [];\\nlet file_type = [{name:'静态文件',value:'html'},{name:'网页插件',value:'js_url'},{name:'主页配置',value:'config'}]; //上传类型\\nlet file_redirect = [{name:'本地',value:'false'},{name:'直链302',value:'true'}]; //是否重定向\\nlet file_ua = [{name:'电脑',value:'pc'},{name:'手机',value:'mobile'}];\\nlet file_type_title = file_type.map((item) => {\\n let name = getItem('house.file_type','静态文件');\\n if(item.name===name){\\n return '👉'+item.name;\\n }else{\\n return item.name;\\n }\\n});\\nlet file_redirect_title = file_redirect.map((item) => {\\n let name = getItem('house.file_redirect','本地');\\n if(item.name===name){\\n return '👉'+item.name;\\n }else{\\n return item.name;\\n }\\n});\\nlet file_ua_title = file_ua.map((item) => {\\n let name = getItem('house.file_ua','电脑');\\n if(item.name===name){\\n return '👉'+item.name;\\n }else{\\n return item.name;\\n }\\n});\\nd.push({col_type: 'x5_webview_single', extra: {js: 'console.log(\\\"我加载了\\\")'}});\\nd.push({\\n title: '获取',\\n desc: \\\"文件路径,支持hiker,file,http,主题\\\",\\n extra: {\\n onChange: \\\"putVar('house.web_url',input)\\\",\\n titleVisible: true,\\n id:'filePath',\\n defaultValue:getVar('house.web_url')\\n },\\n url:$.toString(() => {\\n let input = getVar('house.web_url','');\\n if(input.length<2){\\n return 'toast://链接不可以为空'\\n } else if(/^hiker:|^file:|^http:|^https:|^\\\\/storage\\\\/|^\\\\/sdcard\\\\//.test(input)){\\n if(/^\\\\/storage\\\\/|^\\\\/sdcard\\\\//.test(input)){\\n input = 'file://'+input;\\n }\\n log('正常链接:'+input);\\n let ua = getItem('house.file_ua')==='电脑'?'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36':'Mozilla/5.0 (Linux; Android 9; MI 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Mobile Safari/537.36';\\n let web_url_arr = input.split(';');\\n let web_url = web_url_arr[0];\\n let headers = {\\n 'Referer':'https://blog.csdn.net',\\n 'User-Agent':ua,\\n 'Accept':'application/json, text/javascript, */*; q=0.01',\\n 'Accept-Language':'zh-CN',\\n };\\n if(web_url_arr.length>=3&&web_url_arr[2].length>2){ //设置编码\\n headers['content-type'] = 'charset='+web_url_arr[2].toUpperCase();\\n }\\n let params = {headers:headers,withHeaders:false,redirect:false};\\n if(web_url_arr.length>=2&&web_url_arr[1].length>2){ // 设置请求方法\\n params['method'] = web_url_arr[1].toUpperCase();\\n }\\n log('开始获取源码');\\n try {\\n /*\\n requestAsync(web_url,params,function (key,code) {\\n let back_code = code;\\n if(back_code.length>20){\\n putVar('house.upload_code',back_code);\\n refreshPage(true);\\n return 'toast://源码已获取,并部分插入到文本区域'\\n }else{\\n return 'toast://错误,本次获取到空文本,疑似你没有此文件!';\\n }\\n });\\n */\\n let back_code = getItem('house.file_ua')==='电脑'?fetch(web_url,params):request(web_url,params);\\n if(back_code.length>20){\\n putVar('house.upload_code',back_code);\\n refreshPage(true);\\n return 'toast://源码已获取,并部分插入到文本区域'\\n }else{\\n return 'toast://错误,本次获取到空文本,疑似你没有此文件!';\\n }\\n }catch (e) {\\n log(e.message);\\n return 'toast://发生了错误:\\\\n'+e.message;\\n }\\n }else if(/主题¥|元素¥/.test(input)){\\n log('主题链接');\\n let web_url_arr = input.split('¥');\\n let web_url = web_url_arr[web_url_arr.length-1];\\n let back_code = parsePaste(web_url);\\n if(back_code.length>20) {\\n putVar('house.upload_code',back_code);\\n refreshPage(true);\\n return 'toast://源码已获取,并部分插入到文本区域'\\n }else{\\n return 'toast://错误,本次获取返回为:\\\\n'+back_code;\\n }\\n }else{\\n return 'toast://非法链接:\\\\n'+getVar('house.web_url');\\n }\\n }),\\n col_type: \\\"input\\\"\\n});\\nd.push({\\n title: \\\"选择文件路径\\\",\\n url:$('#noLoading#').lazyRule(()=>{\\n /*\\n let fp = 'https://gitcode.net/qq_32394351/dr/-/raw/master/js/fileSelect.js';\\n let f = require(fp);\\n */\\n let fp=config.lib.fileSelect;\\n let f=$.rc(fp);\\n return f.fileSelectionUri({\\n callback: $.toString(() => {\\n let target = findItem(\\\"filePath\\\").extra;\\n updateItem(\\\"filePath\\\", {\\n extra: Object.assign(target, {\\n defaultValue: PATH\\n })\\n });\\n putVar('house.web_url',PATH);\\n return true;\\n }),\\n onClickType:'confirm',\\n fileType: \\\".js|.txt|.hiker|.json|.html\\\",\\n pattern: 0,\\n requireUrl:fp,\\n initialPath:getPath('hiker://files/rules/dzHouse/').slice(7),\\n memory:'true',\\n });\\n }),\\n col_type: \\\"text_center_1\\\",\\n});\\nd.push({\\n title:'上传类型',\\n desc:'上传文件的类型,当前为:'+color(getItem('house.file_type','静态文件'),'#ff7000'),\\n col_type:'text_1',\\n url:$(file_type_title,2).select(() => {\\n setItem('house.file_type',input.replace('👉',''));\\n refreshPage(true);\\n return 'toast://你选择了:'+input;\\n })\\n});\\n\\nd.push({\\n title:'文件定位',\\n desc:'文件是否属于重定向,当前为:'+color(getItem('house.file_redirect','本地'),'#ff7000'),\\n col_type:'text_1',\\n url:$(file_redirect_title,2).select(() => {\\n setItem('house.file_redirect',input.replace('👉',''));\\n refreshPage(true);\\n return 'toast://你选择了:'+input;\\n })\\n});\\n\\nd.push({\\n title:'设备UA',\\n desc:'发起网页请求头标识,当前为:'+color(getItem('house.file_ua','电脑'),'#ff7000'),\\n col_type:'text_1',\\n url:$(file_ua_title,2).select(() => {\\n setItem('house.file_ua',input.replace('👉',''));\\n refreshPage(true);\\n return 'toast://你选择了:'+input;\\n })\\n});\\nfunction compare(name) {\\n return function(item) {\\n return item.name === name;\\n }\\n}\\nd.push({\\n title:'🗄️环境',\\n col_type:'flex_button',\\n url:$().lazyRule((file_type,compare)=>{\\n log('查看环境变量');\\n try {\\n let up_code = getVar('house.upload_code','');\\n let ftype = file_type.filter(compare(getItem('house.file_type','静态文件')))[0].value;\\n let redirect = getItem('house.file_redirect','本地')!=='本地';\\n let code = !redirect?up_code:input;\\n let env = {\\n web_url:getVar('house.web_url',''),\\n device:getItem('house.file_ua','电脑'),\\n ftype:ftype||\\\"\\\",\\n redirect:redirect,\\n code:code.substring(0,40)||\\\"\\\",\\n }\\n log(env);\\n return 'toast://'+JSON.stringify(env);\\n // alert(JSON.stringify(env));\\n }catch (e) {\\n return 'toast://'+e.message;\\n // alert(e.message);\\n }\\n },file_type,compare)\\n});\\n\\nd.push({\\n title:'📃教程',\\n col_type:'flex_button',\\n url:$().x5Rule(()=>{\\n let msg = '欢迎使用开发者更多分享工具\\\\n1.输入网址为本地文件路径,hiker://或者file://开头\\\\n2.点击网址输入栏后面的按钮\\\\n3.看文本预览区是否正确\\\\n4.点击上传按钮提交到仓库';\\n alert(msg);\\n })\\n});\\n\\nd.push({\\n title:'🗑️清空',\\n col_type:'flex_button',\\n url:$().lazyRule(()=>{\\n clearVar('house.upload_code');\\n refreshPage(true);\\n return 'toast://已清除预览区域内容'\\n })\\n});\\n\\nd.push({\\n title:'📲示例',\\n col_type:'flex_button',\\n url:$().lazyRule(()=>{\\n let demo_code = getItem('house.demo','0');\\n if(demo_code=='0'){\\n putVar('house.web_url','hiker://files/rules/dzHouse/html/资源网书签.html');\\n demo_code = parseInt(demo_code)+1;\\n setItem('house.demo',demo_code+'');\\n }else{\\n putVar('house.web_url','file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/rules/dzHouse/html/资源网书签.html');\\n setItem('house.demo','0');\\n }\\n refreshPage(true);\\n return 'toast://已设置示例地址'\\n })\\n});\\n\\nd.push({\\n title:'📤上传',\\n col_type:'flex_button',\\n url:$().lazyRule((canup,house_data,put_url,file_type) =>{\\n function compare(name) {\\n return function(item) {\\n return item.name === name;\\n }\\n }\\n const {getNowFormatDate}=$.require(\\\"hiker://page/utiliy\\\");\\n let up_code = getVar('house.upload_code','');\\n if(up_code.length < 2){\\n return 'toast://源码区无内容,请先访问一个静态页面'\\n }\\n if(!canup){\\n return 'toast://你不是开发者,没有提交到仓库的权利!'\\n }\\n let input = getVar('house.web_url','');\\n let web_url = input.split(';')[0];\\n let fileName = '';\\n if(/^hiker:|^file:|^http:|^https:|^\\\\/storage\\\\/|^\\\\/sdcard\\\\//.test(web_url)){\\n fileName = web_url.split('/')[web_url.split('/').length-1];\\n }else if(/主题¥|元素¥/.test(input)){\\n let bkarr = up_code.split('¥');\\n if(bkarr.length<3){\\n return 'toast://云剪贴板内容有误'\\n }\\n switch (bkarr[1]) {\\n case 'my_home_theme':\\n fileName = up_code.split('「')[1].split('」')[0];\\n break;\\n case 'my_home_single':\\n fileName = up_code.split('「')[1].split('」')[0];\\n break;\\n case 'js_url':\\n fileName = up_code.split('¥')[2].split('@')[0];\\n break;\\n }\\n }else{\\n return 'toast://错误,网页链接无内容!';\\n }\\n let ua = getItem('house.file_ua')==='电脑'?'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36':'Mozilla/5.0 (Linux; Android 9; MI 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Mobile Safari/537.36';\\n let headers = {\\n 'Referer':'https://blog.csdn.net',\\n \\\"content-type\\\": \\\"application/json\\\",\\n 'User-Agent':ua,\\n 'Accept':'application/json, text/javascript, */*; q=0.01',\\n 'Accept-Language':'zh-CN',\\n };\\n let toCompare = '';\\n if(fileName.endsWith('.html')){\\n toCompare = '静态文件';\\n }else if(/主题/.test(fileName)){\\n toCompare = '主页配置'\\n }\\n let ftype = file_type.filter(compare(toCompare||getItem('house.file_type','静态文件')))[0].value;\\n let redirect = getItem('house.file_redirect','本地')!=='本地';\\n if(redirect&&!web_url.startsWith('http')){\\n return 'toast://直链302重定向网址链接必须http开头';\\n }\\n let code = !redirect?up_code:web_url;\\n let data = {\\\"params\\\":\\n {\\\"data\\\": {rule_name: fileName, \\\"rule_type\\\": '更多分享', \\\"version\\\":getNowFormatDate(),\\\"rule_value\\\": code,\\n data_type:ftype, is_redirect:redirect,deviceUa:getItem('house.file_ua'),\\n },\\n \\\"name\\\": house_data.username,\\n \\\"password\\\": house_data.password}\\n };\\n let upparams = {headers:headers,body:JSON.stringify(data),withHeaders:false,redirect:false,method:'POST'};\\n let backmsg = getItem('house.file_ua')==='电脑'?fetch(put_url,upparams):request(put_url,upparams);\\n try{\\n let result = JSON.parse(backmsg).result;\\n let detail = result.detail;\\n return 'toast://'+detail;\\n }catch (e) {\\n log(e.message);\\n return 'toast://发生了错误\\\\n'+e.message;\\n }\\n },canup,house_data,put_url,file_type)\\n});\\n\\nd.push({\\n title:'长文本预览区域',\\n col_type:'text_1',\\n url:'hiker://empty',\\n extra: {textSize: 11,lineVisible:false}\\n});\\n\\nd.push({\\n title:getVar('house.upload_code','').substring(0,10240),\\n col_type:'long_text',\\n extra: {textSize: 11}\\n});\\nsetPageTitle(\\\"更多分享\\\");\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"轻合集生成接口\",\"path\":\"genApi\",\"rule\":\"js:\\nfunction genRule(name,url,icon){\\n icon=icon||'https://z3.ax1x.com/2021/11/16/IWJhxf.png';\\n const {getNowFormatDate,api,getApi}=$.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n String.prototype.replaceAll = function(old,new_str){\\n return this.split(old).join(new_str);\\n };\\n let muban = getApi('importUrl')+\\\"1690\\\";\\n let muban_word={name:\\\"@轻合集\\\",url:\\\"@地址\\\",ver:\\\"@版本\\\",icon:\\\"@图标\\\"};\\n let muban_code = fetch(muban);\\n muban_code=muban_code.replaceAll(muban_word.name,name).replaceAll(muban_word.ver,getNowFormatDate()).replaceAll(muban_word.url,url).replaceAll(muban_word.icon,icon);\\n let import_code=\\\"海阔视界规则分享,当前分享的是:小程序,无根树,花正清,不断荤腥不戒淫¥home_rule_v2¥base64://@\\\"+name+\\\"@\\\"+base64Encode(muban_code);\\n var pastes = getPastes();\\n var url = sharePaste(import_code,pastes.slice(-1)[0]);\\n let import_rule= url+\\\"\\\\n\\\\n小程序:\\\"+name;\\n return import_rule;\\n}\\n$.exports.genRule=genRule;\"},{\"col_type\":\"movie_3\",\"name\":\"全局解析免嗅\",\"path\":\"globalParse\",\"rule\":\"js:\\n function getHeaders(playUrl){\\n let headers = {};\\n let refer=playUrl.split(\\\"//\\\")[0]+\\\"//\\\"+playUrl.split(\\\"//\\\")[1].split(\\\"/\\\")[0];\\n if(/lecloud\\\\.com|bilivideo\\\\.com/.test(playUrl)){\\n headers = {\\\"Referer\\\": 'https://www.bilibili.com/',\\\"User-Agent\\\":\\\"Mozilla/5.0\\\"}\\n }else if(/mgtv\\\\.com/.test(playUrl)){\\n headers = {\\\"Referer\\\": refer,\\\"User-Agent\\\":\\\"Mozilla/5.0\\\"}\\n }else if(/ixigua\\\\.com/.test(playUrl)){\\n headers = {\\\"Referer\\\": 'https://www.ixigua.com/',\\\"User-Agent\\\":\\\"Mozilla/5.0\\\"}\\n }else{\\n // headers = {\\\"Referer\\\": refer,'User-Agent':'Dart/2.13 (dart:io)'}\\n // headers = {\\\"Referer\\\": refer,'User-Agent':MOBILE_UA};\\n headers = {'User-Agent':MOBILE_UA};\\n }\\n return headers\\n }\\nfunction isPic(str){\\n return /\\\\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(str);\\n}\\nfunction isVideo(playUrl,rechange){\\n //注意.php不可以被排除否则融兴解析不了 |.php$\\n //如果是播放地址就直接返回地址加上UA,不是的话就返回false\\n // let t1 = new Date().getTime();\\n let cacheRegx = new RegExp('file:///storage/emulated/(.*?)\\\\\\\\.m3u8|hiker://files/(.*?)\\\\\\\\.m3u8');\\n if(cacheRegx.test(playUrl)){\\n return playUrl\\n }\\n function getHost(url){\\n // fba的parseLazy太慢了千万别用\\n try {\\n return url.match(/^http(s)?:\\\\/\\\\/(.*?)\\\\//)[0].slice(0,-1);\\n }catch (e) {\\n return false\\n }\\n /*\\n if(typeof(log)==='undefined'){\\n return fba.parseLazyRule($$$().lazyRule((url)=>{\\n return getHome(url)\\n },url))\\n }else {\\n return getHome(url)\\n }\\n */\\n }\\n let pUrl=playUrl.split(\\\";\\\")[0];//获取抠掉海阔ua等参数的网页播放链接\\n let host = getHost(pUrl); // 获取域名\\n if(!host){//判断无域名直接不是视频\\n return false\\n }\\n function print(data){\\n if(typeof(log)==='undefined'){\\n return fba.log(data)\\n }else {\\n return log(data)\\n }\\n }\\n rechange=typeof(rechange)===\\\"function\\\"?rechange:function(playUrl){return playUrl};\\n let exceptWords = '.js$|.css$|.ts$|.html$|.htm$|.gif$|.jpg$|.jpeg$|.png$|.ico$|.svg$|.txt$'.split('|').map(it=>'\\\\\\\\'+it).join('|');\\n var exceptKeys = new RegExp(exceptWords);\\n let exceptWords1 = 'referer=|url='.split('|').map(it=>it).join('|');\\n var exceptKeys1 = new RegExp(exceptWords1);\\n let replaceWords = 'playm3u8|m3u8\\\\.tv'.split('|').map(it=>it).join('|');\\n let replaceKeys = new RegExp(replaceWords,'g');\\n let videoWords = \\\"/video/tos|.mp4$|.m3u8$|.flv$|.avi$|.3gp$|.mpeg$|.wmv$|.mov$|rmvb|.dat$|.mp3$|.m4a$|qqBFdownload|mime=video%2F|mime_type=video_|type=m3u8|pt=m3u8\\\".split('|').map((it)=>{\\n //type=mp4\\n if(it.startsWith(\\\".\\\")){\\n return '\\\\\\\\'+it\\n }else{\\n return it\\n }\\n }).join(\\\"|\\\");\\n let videoKeys = new RegExp(videoWords);\\n let rUrl = pUrl.replace(host,'');//获取除开域名的剩余链接\\n let pUrl2=pUrl.split(\\\"&\\\")[0].split(\\\"?\\\")[0];//获取不带参数的网页链接\\n let rurl2 = pUrl2.replace(host,'');//获取除开域名的剩余不带参数链接\\n let hasKey = videoKeys.test(rUrl)||videoKeys.test(rurl2);\\n let parUrl = pUrl.replace(pUrl.split(\\\"?\\\")[0],''); // 分割问号后剩余参数的完整链接\\n let excKey = exceptKeys1.test(parUrl);\\n if(rUrl.split('?').length>2){\\n let rUrl3=rUrl.split(\\\"?\\\")[1];//获取?分割后的第一段\\n hasKey = hasKey||videoKeys.test(rUrl3);\\n }\\n if(hasKey&&!excKey){\\n let tips = '检测到疑似多媒体的地址:';\\n print(\\\"js中\\\"+tips+pUrl);\\n print(\\\"分割问号后:\\\"+parUrl);\\n }\\n // log('1:'+(videoKeys.test(pUrl)||videoKeys.test(pUrl2)||videoKeys.test(pUrl.replace(replaceKeys,\\\"\\\").split(\\\"&\\\")[0].split(\\\"?\\\")[0])));\\n // log('2:'+!exceptKeys.test(pUrl.split(\\\"?\\\")[0].split('&')[0]));\\n // log('3:'+!exceptKeys1.test(pUrl.replace(pUrl.split(\\\"?\\\")[0],'')));\\n if ((hasKey||videoKeys.test(rUrl.replace(replaceKeys,\\\"\\\").split(\\\"&\\\")[0].split(\\\"?\\\")[0]) )&& !exceptKeys.test(pUrl2)&&!exceptKeys1.test(pUrl2)) {\\n if(!(/User-Agent|Referer@/.test(playUrl))){\\n if(/lecloud\\\\.com|bilivideo/.test(playUrl)){\\n playUrl+=\\\";{Referer@https://www.bilibili.com/&&User-Agent@Mozilla/5.0}\\\";\\n }else if(/ixigua\\\\.com/.test(playUrl)){\\n playUrl+=\\\"#isvideo=true#;{Referer@https://www.ixigua.com/&&User-Agent@Mozilla/5.0}\\\";\\n }\\n else if(/mgtv\\\\.com|byteamone/.test(playUrl)){\\n playUrl+=\\\";{User-Agent@Mozilla/5.0}\\\";\\n }else if(/ptwo\\\\.wkfile\\\\.com/.test(playUrl)&&/url=/.test(playUrl)){\\n playUrl=playUrl.split(\\\"url=\\\")[1]+\\\";{Referer@https://fantuan.tv}\\\"\\n }\\n // 处理大师兄之类的app\\n // else{\\n // playUrl+=\\\";{User-Agent@Mozilla/5.0}\\\";\\n // }\\n }\\n playUrl=rechange(playUrl);\\n if(!/#isVideo=true#/.test(playUrl)){\\n playUrl+=\\\"#isVideo=true#\\\";\\n }\\n // let t2 = new Date().getTime();\\n // print('判断isVideo耗时:'+(t2-t1));\\n return playUrl;\\n }else{\\n // let t2 = new Date().getTime();\\n // print('判断isVideo耗时:'+(t2-t1));\\n return false;\\n }\\n}\\nfunction comParse(parStr,ej,onlyback,html){\\n //列表,标题,图片,描述,链接,内容\\n ej = ej||false;//有二级\\n onlyback=onlyback||false;//只返回数据\\n html = html||getResCode();\\n html = typeof(html)==='string'?html:html.html;\\n return $.toString((parStr,ej,onlyback,html,isPic)=>{\\n let t=parStr.split(\\\";\\\");\\n let d=[];\\n // let list=pdfa(getResCode(),t[0]);\\n let list=pdfa(html,t[0]);\\n let lazy = $('').lazyRule(()=>{\\n const {lazyParse} = $.require('hiker://page/globalParse?rule=道长仓库Pro');\\n return lazyParse(input)\\n });\\n for(let i in list){\\n let _pic = t[2]?pd(list[i],t[2]):'';\\n if(isPic(_pic)&&!/@Referer=/.test(_pic)){\\n _pic+='@Referer='\\n }\\n let it={\\n title:pdfh(list[i],t[1]),\\n pic_url:_pic,\\n desc:pdfh(list[i],t[3]),\\n url:ej?pd(list[i],t[4]):pd(list[i],t[4])+lazy\\n };\\n if(t.length>5){//内容,用于搜索\\n it.content=pdfh(list[i],t[5])\\n }\\n d.push(it);\\n }\\n if(onlyback){\\n return d\\n }else{\\n setResult(d)\\n }\\n },parStr,ej,onlyback,html,isPic)\\n}\\n\\nfunction isBadVideo(videoUrl) {//是坏的视频\\n let dmPath = 'hiker://files/cache/diaomao.txt';//吊毛模式过滤文件路径\\n let dmUrls;\\n try {\\n dmUrls = request(dmPath).trim().split('\\\\n').filter(it => it && !it.startsWith('//'));\\n } catch (e) {\\n dmUrls = [];\\n }\\n\\n function hasDm(videoUrl, dmUrls) {//播放地址是否为吊毛视频\\n if (dmUrls.length < 1) {\\n return false\\n }\\n function print(str){\\n if(typeof(log)!=='undefined'){\\n log(str);\\n }else{\\n fba.log(str);\\n }\\n }\\n for (let dmUrl of dmUrls) {\\n if ((new RegExp(dmUrl)).test(videoUrl)) {//播放地址包含吊毛标志的地址\\n print('吊毛视频,自动过滤:'+videoUrl);\\n return true\\n }\\n }\\n print('非吊毛视频,可播放:'+videoUrl);\\n return false\\n }\\n\\n function isDm(ret) {\\n if (!ret) {\\n return true\\n }\\n return hasDm(ret.split('#')[0].split(';')[0], dmUrls)\\n }\\n return isDm(videoUrl)\\n}\\n\\nfunction lazyParse(playUrl,ms,tm,rechange){\\n // log('调用仓库免嗅探传参超时为:'+ms);\\n tm = parseInt(tm)||5000;\\n const {isVideo,getHeaders,isBadVideo} = $.require('hiker://page/globalParse?rule=道长仓库Pro');\\n let realUrl = isVideo(playUrl,rechange);\\n //log(realUrl);\\n if(typeof(realUrl)=='string'){//bool值就是失败\\n try{\\n let rurl=realUrl.split(\\\";\\\")[0].split(\\\"#\\\")[0];\\n return JSON.parse(request(rurl,{timeout:tm})).url\\n }catch(e){\\n return realUrl\\n }\\n //return realUrl\\n }\\n\\n //log(\\\"访问超时:\\\"+tm);\\n log(\\\"尝试道长仓库x5免嗅:\\\"+playUrl);\\n clearVar(\\\"_x5jxUrl\\\");\\n let bad=$(\\\"网络不佳或者疑似对方网站挂了,你要查看其网页吗?\\\").confirm((playUrl)=>{\\n log(\\\"网站看起来挂了:\\\"+playUrl);\\n return playUrl\\n },playUrl);\\n try{\\n var back=request(playUrl,{headers: getHeaders(playUrl),timeout:tm});\\n //var back=fetch(playUrl,{headers: {'User-Agent': PC_UA}});\\n if(!back){\\n log(\\\"网站\\\"+playUrl+\\\"确实啥也没返回\\\");\\n return bad\\n }else if(/#EXTINF/.test(back)){\\n //let lcache=\\\"/storage/emulated/0/Android/data/com.example.hikerview/files/Documents/cache/video.m3u8\\\";\\n //writeFile(lcache,back);\\n //return lcache+\\\"##\\\"+playUrl+\\\"#isVideo=true#\\\"\\n playUrl=cacheM3u8(playUrl);\\n return playUrl\\n }else if((!/触发了防盗链|未授权|接口防盗/.test(back))&&(!/http|url/.test(back))&&(!/msg|code|html/.test(back))){\\n log(back);\\n return 'toast://疑似对方数据加密了,具体数据看日志'\\n }\\n }catch(e){\\n log(e.message);\\n return bad\\n }\\n try {\\n back=JSON.parse(back);\\n let realUrl=back.url;\\n if(typeof(realUrl)==\\\"undefined\\\"||!realUrl){\\n log(back);\\n return \\\"toast://道长仓库解析失败!返回播放地址为空\\\"\\n } else if(typeof(isVideo(realUrl,rechange))=='string'){\\n return isVideo(realUrl,rechange);\\n }else{\\n return realUrl+\\\"#isVideo=true#\\\";\\n }\\n //else{\\n //realUrl+=\\\";{User-Agent@Mozilla/5.0}\\\";\\n // }\\n }catch (e) {\\n log(\\\"检测到解析口非json错误:\\\"+e.message+',开始x5免嗅探');\\n // require('https://hjdhnx.coding.net/p/hiker/d/dr/git/raw/master/js/lsg.js');//引用本地储存插件\\n const lsg=$.require(\\\"hiker://page/localStorage?rule=道长仓库Pro\\\");//引用子页面本地储存插件\\n let local_ms = lsg.getItem('timeout');\\n let ms = parseInt(ms)||parseInt(local_ms)||5000;\\n let max_count=Math.ceil(ms/250);\\n log(\\\"本次嗅探超时:\\\"+ms+\\\"共计待抓包:\\\"+max_count+\\\"次\\\");\\n showLoading('嗅探中,若失败就切换web嗅探...');\\n let _x5 = $.toString((isVideo,rechange,playUrl,max_count,PC_UA,isBadVideo)=>{\\n try {\\n if(typeof(fba)=='undefined'||!fba){\\n var fba = fy_bridge_app;\\n }\\n try {\\n if(typeof(request)=='undefined'||!request){\\n eval(fba.getInternalJs());\\n }\\n }catch (e) {\\n fba.log(e.message);\\n }\\n fba.putVar(\\\"_x5jxUrl\\\",playUrl);\\n if(window.count == null){\\n window.count=1;\\n }\\n let text='';\\n try {\\n text=document.querySelector(\\\"body\\\").innerText;\\n }catch (e) {fba.log(e.message)}\\n if(/触发了防盗链|未授权|接口防盗/.test(text)&&window.count===1){\\n fba.log(\\\"检测到有授权,开始过授权\\\");\\n //location.reload();\\n location.href=fba.getVar(\\\"_x5jxUrl\\\");\\n }\\n window.count++;\\n // fba.log('count:'+window.count+',max_count:'+max_count);\\n if( window.count >= max_count){\\n fba.log(\\\"超过\\\"+max_count*250+\\\"毫秒未获取到资源地址,跳到源网页,以下是加载过的地址\\\");\\n try {\\n let text=document.querySelector(\\\"body\\\").innerText;\\n // fba.log(text);\\n }catch (e) {fba.log(e.message)}\\n fba.log(JSON.stringify(_getUrls()));\\n return fba.getVar(\\\"_x5jxUrl\\\");\\n }\\n function muteMe(elem) {\\n try {\\n elem.pause();\\n }\\n catch (e) {\\n }\\n }\\n var videos = document.querySelectorAll(\\\"video\\\"), audios = document.querySelectorAll(\\\"audio\\\"), v2 = document.querySelectorAll(\\\"embed\\\"), v3 = document.querySelectorAll(\\\"#player\\\");\\n try {\\n [].forEach.call(videos, function (video) {\\n muteMe(video);\\n });\\n } catch (e) {}\\n try {\\n [].forEach.call(audios, function (audio) {\\n muteMe(audio);\\n });\\n } catch (e) {}\\n try {\\n [].forEach.call(v2, function (v) {\\n muteMe(v);\\n });\\n } catch (e) {}\\n try {\\n [].forEach.call(v3, function (v) {\\n muteMe(v);\\n });\\n } catch (e) {}\\n var urls = _getUrls();\\n // fba.log(JSON.stringify(urls));\\n try {\\n for(let i in urls) {\\n let u=urls[i];\\n try{u=decodeURIComponent(u);}catch(e){\\n u=unescape(u);\\n }\\n //\\n if(/url=http/.test(u)){\\n u = u.split(\\\"url=\\\").slice(-1)[0];\\n // fba.log(\\\"url分割:\\\"+u);\\n }else if(/url=\\\\//.test(u)&&/\\\\.m3u8/.test(u)){\\n let host = u.match(/(.*)\\\\/\\\\/(.*?)\\\\//)[0];\\n u = host+u.split(\\\"url=\\\").slice(-1)[0];\\n // fba.log(\\\"url分割:\\\"+u);\\n }\\n else if(/vid=http/.test(u)){\\n u = u.split(\\\"vid=\\\").slice(-1)[0];\\n fba.log(\\\"vid分割:\\\"+u);\\n }else if(/vid=\\\\//.test(u)&&/\\\\.m3u8/.test(u)){\\n let host = u.match(/(.*)\\\\/\\\\/(.*?)\\\\//)[0];\\n u = host+u.split(\\\"vid=\\\").slice(-1)[0];\\n fba.log(\\\"vid分割:\\\"+u);\\n }\\n else if(/\\\\?(.*)=http/.test(u)&&/\\\\.m3u8/.test(u)){\\n u = \\\"http\\\"+u.split(/\\\\?(.*)=http/).slice(-1)[0];\\n fba.log(\\\"其他分割:\\\"+u);\\n }\\n //|index\\\\.m3u8$\\n else if(/\\\\/1\\\\.m3u8/.test(u)){\\n continue;\\n }\\n u=u.replace(/&from=.*|&next=.*|&jump=.*/,'');\\n let realUrl = isVideo(u,rechange);\\n if(typeof(realUrl)=='string'&&!isBadVideo(u)){//过滤吊毛视频\\n //fy_bridge_app.setWebUa(PC_UA);\\n if(typeof(fba.getHeaderUrl)!=='undefined'&&typeof(rechange)!=='function'){\\n // let backUrl = fba.getHeaderUrl(u.replace(\\\";{\\\",\\\"#isVideo=true#;{\\\"));\\n let backUrl = fba.getHeaderUrl(urls[i]).replace(';{','#ignoreImg=true##isVideo=true#;{');\\n let u1 = backUrl.split('#ignoreImg')[0];\\n let u2 = '#ignoreImg'+backUrl.split('#ignoreImg')[1];\\n u1 = u1.replace(/&from=.*|&next=.*|&jump=.*/,'');\\n if(/url=http/.test(u1)){\\n u1 = u1.split(\\\"url=\\\").slice(-1)[0];\\n }else if(/url=\\\\//.test(u1)&&/\\\\.m3u8/.test(u1)){\\n let host1 = u1.match(/(.*)\\\\/\\\\/(.*?)\\\\//)[0];\\n u1 = host1+u1.split(\\\"url=\\\").slice(-1)[0];\\n // fba.log(\\\"url分割:\\\"+u);\\n }\\n else if(/vid=http/.test(u1)){\\n u1 = u1.split(\\\"vid=\\\").slice(-1)[0];\\n }else if(/vid=\\\\//.test(u1)&&/\\\\.m3u8/.test(u1)){\\n let host1 = u1.match(/(.*)\\\\/\\\\/(.*?)\\\\//)[0];\\n u1 = host1+u1.split(\\\"vid=\\\").slice(-1)[0];\\n }\\n else if(/\\\\?(.*)=http/.test(u1)&&/\\\\.m3u8/.test(u1)){\\n u1 = \\\"http\\\"+u1.split(/\\\\?(.*)=http/).slice(-1)[0];\\n }\\n backUrl = u1 + u2;\\n // fba.log('返回自动加cookie链接:'+backUrl);\\n fba.log('返回链接:'+u+'并自动加了cookie,具体cookie在视频播放处查看');\\n return backUrl;\\n }\\n else{\\n fba.log(\\\"返回仓库x5免嗅结果:\\\"+realUrl);\\n return realUrl\\n }\\n }\\n }\\n }catch (e) {\\n fba.log(e.message)\\n }\\n }catch (e) {\\n // fy_bridge_app.log('x5大范围错误:'+e.message);\\n alert('x5大范围错误:'+e.message);\\n return 'toast://报错结束x5'\\n }\\n },isVideo,rechange,playUrl,max_count,PC_UA,isBadVideo);\\n let useWeb=lsg.getItem(\\\"通免\\\",\\\"X5\\\")===\\\"WEB\\\";\\n //log(\\\"仓库使用web通免替代x5:\\\"+useWeb);\\n let ruleHead=useWeb&&parseInt(getAppVersion())>=2339?\\\"webRule://\\\":\\\"x5Rule://\\\";\\n let x5Url = ruleHead+playUrl+ '@' +_x5;\\n return x5Url\\n }\\n}\\n\\nfunction x5ParsePro(x5list,x5Timeout,isVideo){\\n let bpath = 'file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/rules/dzHouse/html/海阔嗅探器.html';\\n let bcode = fetch(bpath);\\n if(!bcode||!/fy_bridge_app/.test(bcode)){\\n log('本地未安装嗅探器,开始安装');\\n const {api} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let html = fetch(api.host+'/rulelist.json?id=2055');\\n if(/海阔视界/.test(html)){\\n writeFile(bpath,html);\\n }else{\\n writeFile(bpath,fetch('https://hjdhnx.coding.net/p/hiker/d/dr/git/raw/master/html/getVideo.html'))\\n }\\n }\\n x5Timeout = parseInt(x5Timeout)||5000;\\n let max_count=(x5Timeout/250); //根据超时自动计算了可执行的次数\\n putVar('x5List',JSON.stringify(x5list));\\n let _x5 = $.toString((isVideo, max_count,x5Timeout,isBadVideo) => {\\n //初始化fba和requst\\n if (typeof (fba) == 'undefined' || !fba) {\\n var fba = fy_bridge_app;\\n }\\n try {\\n if (typeof (request) == 'undefined' || !request) {\\n eval(fba.getInternalJs());\\n }\\n } catch (e) {\\n fba.log(e.message);\\n }\\n //------------------\\n try {\\n if (window.count == null) {\\n window.count = 1;\\n }\\n let text='';\\n try {\\n text=document.querySelector(\\\"body\\\").innerText;\\n }catch (e) {fba.log(e.message)}\\n if(/触发了防盗链|未授权|接口防盗/.test(text)&&window.count==1){\\n location.reload();\\n fba.log(\\\"检测到有授权,开始过授权\\\");\\n }\\n window.count++;\\n // fba.log('count:' + window.count + ',max_count:' + max_count);\\n if (window.count >= max_count) {\\n fba.clearVar('x5List');\\n fba.hideLoading();\\n let fmsg = '道长仓库通免解析失败,原因:超时'+x5Timeout+'毫秒';\\n fba.log(fmsg);\\n return 'toast://'+fmsg;\\n }\\n }catch (e) {\\n fba.log(e.message);\\n }\\n\\n function muteMe(elem) {\\n try {\\n elem.pause();\\n } catch (e) {\\n }\\n }\\n\\n var videos = document.querySelectorAll(\\\"video\\\"), audios = document.querySelectorAll(\\\"audio\\\"),\\n v2 = document.querySelectorAll(\\\"embed\\\"), v3 = document.querySelectorAll(\\\"#player\\\");\\n try {\\n [].forEach.call(videos, function (video) {\\n muteMe(video);\\n });\\n } catch (e) {\\n }\\n try {\\n [].forEach.call(audios, function (audio) {\\n muteMe(audio);\\n });\\n } catch (e) {\\n }\\n try {\\n [].forEach.call(v2, function (v) {\\n muteMe(v);\\n });\\n } catch (e) {\\n }\\n try {\\n [].forEach.call(v3, function (v) {\\n muteMe(v);\\n });\\n } catch (e) {\\n }\\n var urls = _getUrls();\\n try {\\n for (let i in urls) {\\n let u=urls[i];\\n //u=decodeURIComponent(u);\\n try{u=decodeURIComponent(u);}catch(e){\\n u=unescape(u);\\n }\\n if(/url=http/.test(u)){\\n u = u.split(\\\"url=\\\").slice(-1)[0];\\n }else if(/vid=http/.test(u)){\\n u = u.split(\\\"vid=\\\").slice(-1)[0];\\n }else if(/\\\\?(.*)=http/.test(u)){\\n u = \\\"http\\\"+u.split(/\\\\?(.*)=http/).slice(-1)[0];\\n //fba.log(\\\"其他分割:\\\"+u);\\n }else if(/\\\\/1\\\\.m3u8$/.test(u)){\\n continue;\\n }\\n u=u.replace(/&from=.*|&next=.*|&jump=.*/,'');\\n let realUrl = isVideo(u);\\n if (realUrl&&!isBadVideo(u)) {//过滤吊毛\\n fba.log(\\\"仓库x5免嗅结果:\\\" + realUrl);\\n fba.clearVar('x5List');\\n return realUrl\\n }\\n }\\n } catch (e) {\\n fba.log(e.message)\\n }\\n }, isVideo, max_count,x5Timeout,isBadVideo);\\n const lsg=$.require(\\\"hiker://page/localStorage?rule=道长仓库Pro\\\");\\n let useWeb=lsg.getItem(\\\"通免\\\",\\\"X5\\\")===\\\"WEB\\\";\\n //log(\\\"仓库使用web通免替代x5:\\\"+useWeb);\\n let ruleHead=useWeb&&parseInt(getAppVersion())>=2339?\\\"webRule://\\\":\\\"x5Rule://\\\";\\n return ruleHead+bpath+'@' + _x5;\\n}\\n\\nfunction LazyParseFast(playUrlList,getTimeout,x5Timeout){\\n const {isVideo,getHeaders,x5ParsePro} = $.require('hiker://page/globalParse?rule=道长仓库Pro');\\n // log('开始执行'+playUrlList.length+'个地址的批量嗅探:'+playUrlList);\\n log('开始执行'+playUrlList.length+'个地址的批量嗅探');\\n let playUrls = playUrlList.map((it)=>{\\n return {\\n url:it.split(\\\";\\\")[0],\\n options: {\\n headers: {\\n //\\\"User-Agent\\\": \\\"Dart/2.13 (dart:io)\\\",\\n \\\"User-Agent\\\":\\\"Mozilla/5.0\\\"\\n },\\n timeout: getTimeout\\n }\\n }\\n });\\n let bhtml = batchFetch(playUrls);\\n let videos = [];\\n let x5list = [];\\n for(let i in bhtml){\\n let order = parseInt(i)+1;\\n let tname=order+'号解析网址:';\\n //log(tname);\\n let turl=playUrlList[i].split(\\\";\\\")[0];\\n let jname=playUrlList[i].split(\\\";\\\").length>1?playUrlList[i].split(\\\";\\\")[1]:\\\"\\\";\\n tname+=jname;\\n let backcode = bhtml[i];\\n if((!/url|http/.test(backcode))&&(!/#EXTINF/.test(backcode))){\\n log(tname+turl+'有问题,可能加密或者挂了');\\n continue;\\n }else if(/#EXTINF/.test(backcode)){\\n //let lcache=\\\"/storage/emulated/0/Android/data/com.example.hikerview/files/Documents/cache/video_\\\"+tname+\\\".m3u8\\\";\\n //writeFile(lcache,backcode);\\n //videos.push(lcache);\\n let pUrl=cacheM3u8(turl);\\n videos.push(pUrl);\\n continue;\\n }\\n try {\\n let url = JSON.parse(backcode).url;\\n if(/^http/.test(url)){\\n let realVideo = isVideo(url);\\n if(typeof(realVideo)=='string'){\\n log(tname+'已解析出视频:'+realVideo);\\n if(jname){\\n realVideo+=\\\"★\\\"+jname\\n }\\n videos.push(realVideo);\\n }else{\\n log(tname+'解析出不知道什么东西:'+url);\\n url+=\\\"#isVideo=true#\\\";\\n if(jname){\\n url+=\\\"★\\\"+jname\\n }\\n videos.push(url);\\n }\\n }else{\\n log(tname+'为json接口且无返回视频地址数据:'+playUrlList[i]+'\\\\n'+backcode);\\n }\\n }catch (e) {\\n log(tname+'为x5接口,加入x5嗅探列表');\\n x5list.push(playUrlList[i]);\\n }\\n }\\n // log(videos);\\n if(videos.length>0){\\n if(getVar('dp.cacheVideo','true')==='true'&&parseInt(getAppVersion())>=2255)\\n {\\n log(\\\"尊敬的魔断用户,视频缓存已启用,请尽情享受看剧时光\\\");\\n let videosCache=videos.map((it)=>{\\n let headers={};\\n if(it.split(\\\";\\\").length>1){\\n let head = it.split(';')[1];\\n if(/@/.test(head)&&/{|}/.test(head)){\\n//head = head.replace(/{|}/g,'');\\n head = head.split(\\\"{\\\")[1].split(\\\"}\\\")[0];\\n head = head.split('&&');\\n for(let i in head){\\n let key = head[i].split('@')[0];\\n let value =head[i].split('@')[1].replace(/;/,';;');\\n headers[key] = value;\\n }\\n }\\n }\\n return {\\n url:it.split(\\\";\\\")[0].split(\\\"★\\\")[0],\\n options:{\\n headers:headers\\n }\\n }\\n });\\n var data=batchCacheM3u8(videosCache);\\n data=data.map((it,id)=>{\\n let extra=\\\"\\\";\\n if(videos[id].split(\\\";\\\").length>1){\\n extra=\\\";\\\"+videos[id].split(\\\";\\\")[1];\\n }else if(videos[id].split(\\\"★\\\").length>1){\\n extra=\\\"★\\\"+videos[id].split(\\\"★\\\")[1];\\n }\\n\\n if(it+\\\"\\\"!=\\\"null\\\"){\\n return it+extra\\n }else{\\n return videos[id]\\n }\\n });\\n //log(data);\\n return data\\n //return videos\\n }else{\\n return videos\\n }\\n }\\n log('共有'+x5list.length+'个x5地址进行轮流嗅探');\\n //没有的话就开始依次x5嗅探\\n showLoading('嗅探中,若失败就切换web嗅探...');\\n return x5ParsePro(x5list,x5Timeout,isVideo);\\n}\\nvar lazy=$('').lazyRule(()=>{\\n try{\\n realUrl=input;\\n eval(\\\"var config_dp =\\\" + fetch(\\\"hiker://files/cache/MyParseSet.json\\\"));\\n eval(fetch(config_dp.cj));\\n log(input+'->正在断插魔改版解析...');\\n // 加入超时设置,建议在首页设置\\n return aytmParse(realUrl)\\n }catch(e){\\n return input\\n }\\n});\\n$.exports.isPic=isPic;\\n$.exports.isVideo=isVideo;\\n$.exports.isBadVideo=isBadVideo;\\n$.exports.comParse=comParse;\\n$.exports.getHeaders=getHeaders;\\n$.exports.lazyParse=lazyParse;\\n$.exports.x5ParsePro=x5ParsePro;\\n$.exports.LazyParseFast=LazyParseFast;\\n$.exports.lazy=lazy;\"},{\"name\":\"任务仓库接口\",\"path\":\"taskCall\",\"rule\":\"js:\\nString.prototype.strip = function () { return this.replace(/(^\\\\s*)|(\\\\s*$)/g, \\\"\\\"); };\\nfunction task_req(task_api,task) { // 通用发送仓库post调用任务请求\\n const {getFile} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let houseFile = getFile||false;\\n if(!houseFile){\\n setItem('is_house_vip', 'false');\\n }\\n let house_data = houseFile();\\n let result = request(task_api, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"data\\\": {\\n \\\"type\\\": task.mode||'run',\\n \\\"func\\\": task.func||'',\\n \\\"params\\\": task.params||[]\\n },\\n \\\"auth\\\": {\\n \\\"name\\\": house_data.username||\\\"\\\",\\n \\\"password\\\": house_data.password||\\\"\\\"\\n }\\n }\\n }),\\n method: 'POST'\\n });\\n return JSON.parse(result).result;\\n}\\n\\nfunction task_upload(task){ // 通用任务发布新增及修改功能\\n const {api,getFile} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let houseFile = getFile||false;\\n if(!houseFile){\\n setItem('is_house_vip', 'false');\\n }\\n let api_url = api.host+'/hikerule/task/add';\\n let house_data = houseFile();\\n let result = request(api_url, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"data\\\": {\\n \\\"name\\\": task.name,\\n \\\"pycode\\\": task.pycode,\\n \\\"note\\\": task.note,\\n \\\"test_code\\\": task.test_code,\\n },\\n \\\"auth\\\": {\\n \\\"name\\\": house_data.username||\\\"\\\",\\n \\\"password\\\": house_data.password||\\\"\\\"\\n }\\n }\\n }),\\n method: 'POST'\\n });\\n return JSON.parse(result).result;\\n}\\n\\nfunction task_call(id,func,params){\\n const {api} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let task_api = api.host+'/hikerule/task/run/'+id;\\n let task = {\\n mode:'call',\\n func:func,\\n params:params||[]\\n };\\n return task_req(task_api,task);\\n}\\n\\nfunction task_rename(id,new_task_name){\\n const {api,getFile} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let houseFile = getFile||false;\\n if(!houseFile){\\n setItem('is_house_vip', 'false');\\n }\\n let house_data = houseFile();\\n let task_api = api.host+'/hikerule/task/rename/'+id;\\n task_api = task_api+'?name='+house_data.username+'&password='+house_data.password+'&task_name='+new_task_name;\\n try {\\n let result = JSON.parse(fetch(task_api,{}));\\n if(result.status==0){\\n return result.detail\\n }else{\\n return result.result+''+result.detail\\n }\\n }catch (e) {\\n log(e.message);\\n return ''+e.message\\n }\\n}\\n\\nfunction task_change_state(id){\\n const {api,getFile} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let houseFile = getFile||false;\\n if(!houseFile){\\n setItem('is_house_vip', 'false');\\n }\\n let house_data = houseFile();\\n let task_api = api.host+'/hikerule/task/change_state/'+id;\\n task_api = task_api+'?name='+house_data.username+'&password='+house_data.password;\\n try {\\n let result = JSON.parse(fetch(task_api,{}));\\n if(result.status==0){\\n return result.detail\\n }else{\\n return result.result+''+result.detail\\n }\\n }catch (e) {\\n log(e.message);\\n return ''+e.message\\n }\\n}\\n\\nfunction task_run(id){\\n const {api} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let task_api = api.host+'/hikerule/task/run/'+id;\\n let task = {};\\n return task_req(task_api,task);\\n}\\n\\n$.exports.taskCall = task_call;\\n$.exports.taskRun = task_run;\\n$.exports.taskReq = task_req;\\n$.exports.taskUpload = task_upload;\\n$.exports.taskRename = task_rename;\\n$.exports.taskChangeState = task_change_state;\"},{\"col_type\":\"movie_3\",\"name\":\"全局储存\",\"path\":\"localStorage\",\"rule\":\"let localStorage = (function() {\\n evalPrivateJS(\\\"jwUKwNTiPGcWSLCXB5XtAXwb6LQbVyHD+0XJ7l07ce0=\\\");\\n //pathto=undefined;\\n evalPrivateJS(\\\"4C0YxRYnGCYkgFRXtpl/Cz5zL5hh4jCCztb+ng+WokymQ8oUrzS9lA8yxC5aFadnSEmyHKMbraflRqXCnNRHDlk6ue8yHTO16lBPrpwgs5jf0PhrAtoTJIE0ZHn9mKaQ4Jd2erqb4I55beWIeugKsDs211SzINQ5yJgSh1dVuNzzxRGJg40FmTuVmXVfN1xg2WIGHBEmkVnGxmORhPONA+Q5VwPmdp41/hze3eIsUvho7VCBgK4raJmPalIRBBVlCVgn8FkWmfKqZo+VW+oBcH7hrcrsSlCSjBangT/7syWHxKYhehU0kaMYjnWFg1Em0cmNRtomCsHz1B8q32OeQHoawdWxzKOaMHOXDBjRojA8E/ah0WROyziqRSxl/m8dhBd0f9phYz/5SU/zJD52X/9EC16WVVdpSW33akRHRslPpRlTWF9+AyRmRw0eZOEs1o9QMPAQUfAxbYyFHgztw/O2dJRpHyTmiBiaaqTcivx6v9zyvBz04wI1AaSCui+dTuU3lu5xdEt3Ajt6Z3iDXOVcEP0EDF7474PQU6JEZuwe97Sch4bi1wB1XHZSfItdlYYoGed3LLpbmDAIRciv0rAop8VmQcTt2K3Lfh1RDYY0YtvRcH49OvpDRH/xa5Fc8MY3DrFoA7qcoF4eCgiVBfBgJR68+LpQK7tOkg8k9ec+3NSxJThcl8d6yNwxT9Tk17zeJgd6MoyYZIpWQLlF6YvbOdEWhjmnA78wC0hWz+Xm6hQMSqtFw+bhFf7cBGU3aatPFmdCY2EdXfh0IYW85wdOyMfiwW7/vVTp9iE00I3F09wGHkGKhVbLueAkYe7zzJXR7thaFor6H7qLmJjbRQk9evNtBQXNR7DifiXuQf2lt7nOH80SWm1fDHHzjmPsNIps2TXGT+iwVV69g/tWipVQ6D8BTx+cCQp47nmTIrY+qN4kh2FYh5LlwXdgIyy1VIuC3x053ewAIIUmlY9niEpqYt+1fFPXOCtCGtYbSd37vVR1EOj2k5Gu/+9JWg2qvwl1twelg1J0txarIi4kTbTrvrnFLN92pofpZQUfoWo4ce7HWNdbu4JKEraLQUfdfGEPd1TIufuuRVa39eq9GZySDuBL60MPdldxKw1zo+fB5ZY+YMj3LL2gGtDbs98+AsRV9LJWmUmsx91hmJtFUMWD3xnj8HMZWs0NPlCFUr9485KqTpo5kRzGfF+k/Nl2Jzrv5cvkqtUnLgKpXEOj/se/oDzOArQKI5TNUbvYwcwcdjjMSfjK68Krwhs+n6SmWZ4ZdgRHgAK5MoFi3XmLV47P3vSRWu5zyEsMk4y3uuCFiuRPRlu4Q5pJvuOem7H7ULiIhCemv5DgkGtDL1cGL4EQhYRB6ISzVvsb2EaP9wQE6DVRnM7O+pnSzet6lzp3pFdGnbox1LRfC60utXZ+CjIm4iEMmtbB2N5zDShGbeM3XUbJQdCBis8XIrhh2biB5hBCVwn3Y3ett7GDPVtoi1GRjz+JbgM+YR928KbdWS5tFaMM3Kj3Xv6otIxzMBnDC9uW3d+IXx6vLPJ0JRuh3yP7pTla6c3iR4p9nWYDqJ+ZSmprHFnDOzsLWmFjapje/MqwMJd6Tk3nAWwicMOPuYpMyqIF04fl4mqgtsHLSMWRRNHPZjETQ9gRmeDYe6aRtlW02qL2olDENqLQMtAdoirNWRcP9VL3Td8HaUO6fSlGNabMakJD/00XChOSUOIP+7fM7V0/l1bLWPtEz1i7LygTV7pdGoDntqSCEnJrByhBAzLRg5QIc9438IhKmyfn0/3awoD1Ir780eyp/XcI6xNcw6Tv/ETfHg0e7iYC0UYcJIE5QUXv0s+YoGIEq5GIzKub8HNjSTUpsvnkVx+dbe2jRn3Yb9W7JCZ5YS6F5MyUVspjMD7NYc+DWjUL2b2sVyAfeYpC8Uhah9tumavbBv7a3a9kgFbq58lrHxzY7iJQVigzq3e1a2BSb0PcW1aJ8BD7NkNphKYayTxykgwilERL8jqqBEniHVdBxDJYLb+Xw3alLmltuTEV6KGtBntBX+yz36RPDMyGIKe+3fzcxfnCDn20ModVVkVNozPqMXZ0G5L4aLTAQakYKUjsVMQjAhQkTlHBeO/aLPx9sxl++j1Z5rLgG12TN4XJ1eicvw4AVE58Loraq0QiE0cS7PH1pbrZWrft7LYGiyBShor7+0jioUh1pdWq2qMYLqeMEeuCROQt57mFrOjyPH49qp97cWOrgeg2WyfWSDGQPje5+P0yQoCpD/D3RAMuWmb9wlBtcq2j8WJPt91E3kKawuQIyvd2r2Ujx4+HTNtVKb9kMLOO85I65bNGBH+4irSy5gQYlE26A2cSGIcLKQRlvJoMna7L/9wyry4HzOrzkrAvLdgsSNlYjpHQERiOI80sJ5jNCCnfw013F+A+sAfLmyS/BDLNQ1qaQ3p6h8/JqAfhX5OGHgSiRVOCEjuaDB/MwZNCu3QL9ehhoAj7uOf8Pkr3mIjbhh9Hijsjx191+0e2JQrFa01AVJKEVtuPtIc2h/1pPKMvyenxjTO2OxPnjjt+84nIKKhxDJ/ghPt7iv8PmTJ0lKKyPRssl8f/QdHdxupb6jTsI6UKmz9Y46PMBuD6P3wh8qp36O6oibNDiQd1sE10vJh9z1FysKIe8EqMpnNdEmG2TfEBxRpmQrhKEqee0p6+a6sQo8cVlRJkKQAYKawcaNES5Xc6dQY5nqeiq8sUizf1spfHeHelDu1M6BRXuCjFafXhz8i3lPWgYqVpfx13igVCRf47UH652yLnsmepCBWgyBTWAcOyF1Qx8YGtZnob1TN+6xEwzpcWVy7QO9P92sKA9SK+/NHsqf13COt0JHCtTV1OlTQW+JAKyxe1Hl7+s95z3KCgFKQS+3As1JV7Na+g+LCR2Ievu8d5D0L7GwoDreUv4374LRaFkNsHOqWbU9nhQjdMVr7a/i8O/4hbptaSzqqkgYFiNFU/omW5qwIz7sp4nscITRE3gua6bzklMZ8ECn1iqAWt0a6geki5DaL8qYapTCChjlWsExqFuxiWP35TUCddEd8ACbMGs+gQFyDOozfBDG17dZO0mCwW+PzCL2jbICDNai5/jm1Qr6ML56jzUaIDz0GLPTSaex1UDDwkQ9o7mXWC0R7jWnzbkHRWcomVbWmGqL1rjdoacs/R9ujqUuBA6A5VL/qkQ1xHL42EXooprC8wrrfR68zMMFxOwU7CYHJ7bhG/Q4rNsXDBcMo1Adiq9LXbXm/QJj0u/jgZGssz0nnKKUFJcxzuANK96zWwf1DXasUcOoEuEatm1rmP5wrBJmW/ZwT6aBBiR2OSJ0xr8tQ6ObmdKjyb+1eEXb1437R2IdhDUdk5PRztH2YFt2pmuL4/LmILFAvPdiyMtDHNj+Kh4sV4MlXbWPrrI97YBOFpFlX+gnewKKfFZkHE7dity34dUQ2Gne6sAGx1zxyjZv5KBM26lRHF45XqFNJ1RQ3hMymJHsyYNsMO41BWrGv19PA468ecw9HcRN0whjUTgns8ZVaC4hiJsgY07aAEBHm90/uhhjO/Wmb7wuVadhl9RnHeQjpx4gwCrLz5i5s5It1sBwfDb0Fe+PCpLkc+wIINK2Y86kPthR6gJwW75zuoN5C0CAiDwfU73vaAZahzf4VLNlM0U04OtHYBi13YgPoNmGHRelZVEy2KuKVZghD14vSlY+JrMBDdm2y2thFV+BrihL7+fQ5wcYnxGelawDuoSR5+bDDkr6RL40L4xyfAhxlrOn0uA28ghGeWguaWKEv5nBrrveu1ueVy1MvGUYBY+IlEr8NdDNRdmEzXt39kGld86xOfAH/xL1VmugaXOGaPB2qc7WDRkW6k5F6n3PkIzdPXyONKp1DkOg3ocSMZMTs6GKj9C3vODZ6ZQpwNDYLMT+CmEL18GRjXNcZlP/LnhiAIscYTL1+iHWDYvRmvPMwtOHhCnEXIU3FTbP+6QRGA6qydbnneqVhXowcLmbMIz16IC1kwhZj75/M53sKYX2zRgOSTAfNSD/5lZYSNUxJfKTDgiaFEggrCrd+3Cc+chzslI3zDXEKTrvlcX2InC9uH+fsypyHw+AvY2OmBGQMIIc8fE3tNO0gBTVqXsdsE76YwHr29dzQckusuyJsBfSVclrvsNCZ1PQDL8H3cRs3HE9nUkx5bbJYWsPxb825gnEpWU9Z9Ktzvsli7/heOlDKpHxJb1uCrWqf8gRnWmq3zfSSrUXBHSLu62MrkXTjWgapUVxMGkrnzR0E4PMy1bFcyDpEQe15TayWBM1B6jrIG+0DRR9OaCUPwD7exNmjZb9M81us+AIRfyzJPZGmfHuT9SNzFfNuQdFZyiZVtaYaovWuN2irI3zQatKCDnQIXpr0VhG0Gop8c/zroWBoN/aVKmn8skSFvADOjoZAixg6K1y9wFi8peCmimFZ3ZzCVsG6EU9Svlbq5+wn7D6y+dAYdaPms4gwCrLz5i5s5It1sBwfDbz4X4VxqIpcTC9NaYKqA7GKK+aTrZWUwwN21QOtr8eqxSgJ1U9eCOcWXQd+p36Gy4fY+t9c2CsVNbNl1ghxa9bI8U6e6FTd/vvBaq9jrKditq4mNCaiogmfPK6M48UYI8jZMCdd/9C8BqvUj4bYU5byWASEG6BBGdK8Klfi/a4LWt3ivC4u9QBTfb/vCmNJi/QAfabcPG+UsWmsYNRK+g8hMcsuBmhh48NphRvebVQqq6ncKxc1nFHWMW5M6of+z8c1HddnieDP9GaBsq+ysljKslYrt989PY9xsbmkr3X/oCfiFU4NfcOhee++ngW0XpZAVt1I2Qnc1alwbnoNqMMhXIB95ikLxSFqH226Zq9sG/trdr2SAVurnyWsfHNjuIlBWKDOrd7VrYFJvQ9xbVomKqQjuh9dzf2nvVrBzbEF0CZY6izkY/RQY5r9k93/y2NG7o07nMYjOtZYYeNUoik7GbK/HzQl1S7s/FChnt9M6fE0UyuPmttO98hqzxQbteMalMtSce2WLcjyXVGfpqdBkYym4gZByccS6antt4oLdluWSSJsHX1IcXhQy6oJ+Ahjw9hFYwXLHPLoCo3jEliUAK4179wtYtHsO0abLx4+hmtM5Fz7wUVahBA9supOTf/FD4siZMMof5W3vm5DedhqGANlht3mI6RmIhv48QVtneMsUzYC4NDhZD4M5R6p7GXBqcpu3FaEF/0I0e3LceX1HN+iDqKRPuGzvpac/1tsGPIteADxu9OYoap2z3F1CzSg/Uua8l/KEztAKDcvbhNU/YUc2lhgxgfdb4e+P9TZ7RaX82s627u0CbFsfGE/1hLpb5Mc2vk1uDGrdIcbWA6xhpYAHYhEYUl9c75Y/R/0gl6r9+m6cI0BvBY5Aa5NBRc6UMvsO/POw5Ccr79sJziceaV3YwrYEkjp6Ki+OYrGu954AA+dJ9WsvNGBFGMrKAfQ9VUC/ATkJfTloMltDeV5Ao9zkaay3dKAa5/PxAGRDAUcQLDF7uVXbD1vFgE/+RXiwzS5N7cr3aFBdRY7XAmFz/fb0/KSpR8CQ/lokpmM2mltJ9vGPgiqb5nZl9Ku7d2GlgAdiERhSX1zvlj9H/SBujBPoO1fpoOu5F35cdHa5kSFvADOjoZAixg6K1y9wFlj0Ez5ksUW3WU63E7e4qtDUCKWwjjU5f0Fd57VyVzpC6CdCScBjYSzT9rZLVskq61aOWrDDUNKqAQ3+nX/BBW3cQTEcOVdc15ngVXcSS/aK2QFMdiKQlqm15fErJdwqyeza7hflKTiCzUdu5VGlFW9qCt8syHoosA2NzfosJdTdN8bWHnoDr5N25et+p/nvjjOzZRaLYoY/fr/k5hqptOk=\\\");\\n return $.exports;\\n})();\"},{\"col_type\":\"movie_3\",\"name\":\"编辑公告\",\"path\":\"devInfoEdit\",\"rule\":\"js:\\naddListener('onClose', $.toString(()=>{\\n putMyVar(\\\"devInfo\\\",''); //清除历史公告\\n}));\\nsetPageTitle('编辑公告');\\n// let {nowJx,MyJiexi,jxsRoute} = MY_PARAMS;\\nconst {color,small,api, getFile,getApi} = $.require(\\\"hiker://page/utiliy\\\");\\n// let houseFile = getFile||false;\\nvar dev_info_url = getApi('infoGetUrl');\\n// log(dev_info_url);\\nvar get_info = function(qq){\\n qq = qq||'434857005';\\n let dev_info_url = dev_info_url+qq;\\n let back_code = JSON.parse(request(dev_info_url));\\n let dev_info=back_code.result||back_code.detail;\\n return dev_info;\\n};\\nvar before_refresh = function(){\\n let dev_set_info = getMyVar(\\\"dev_set_info\\\").split('$$');\\n let dev_info_url = dev_set_info.slice(-1)[0];\\n let back_code = JSON.parse(request(dev_info_url));\\n let dev_info=back_code.result||back_code.detail;\\n putMyVar(\\\"devInfo\\\",dev_info);\\n return dev_info\\n};\\nlet d = [];\\nd.push({\\n title:'编辑公告',\\n desc:'支持md语法,点击进入学习Md语法\\\\n保存公告按钮在文本框最下面',\\n col_type:'text_1',\\n url:'https://www.runoob.com/markdown/md-tutorial.html'\\n});\\nd.push({\\n title:'返回',\\n col_type:'text_2',\\n url:$('#noLoading#').lazyRule(()=>{\\n back(false);\\n return 'hiker://empty'\\n })\\n});\\nif(!getMyVar('devInfo')){\\n before_refresh();\\n}\\nlet empty = 'hiker://empty';\\nd.push({\\n title:'阅览查阅',\\n col_type:'text_2',\\n // url:$(getMyVar('devInfo')).confirm()\\n url:$(empty).rule(()=>{\\n require(\\\"https://gitlab.com/hjdhnx/hiker/-/raw/main/js/marked.min.js\\\");\\n let devInfo=\\\"\\\";\\n try{\\n devInfo=marked.parse(getMyVar('devInfo'));\\n }catch(e){}\\n setResult([\\n {\\n title:devInfo,\\n col_type:'rich_text',\\n }\\n ]);\\n })\\n});\\nd.push({\\n desc: \\\"快来编辑你的公告吧~\\\",\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getMyVar('devInfo', '')||\\\"\\\",\\n type: \\\"textarea\\\",\\n height:-1,\\n onChange: 'putMyVar(\\\"devInfo\\\",input)'\\n }\\n});\\nd.push({\\n title:\\\"保存公告\\\",\\n col_type: 'text_center_1',\\n url:$('确认保存公告吗?将会与道长仓库服务器通讯').confirm(()=>{\\n let dev_set_info = getMyVar(\\\"dev_set_info\\\").split('$$');\\n let input_text = getMyVar('devInfo', '');\\n if(input_text.length >= 4){\\n let info_set_url= dev_set_info[2];\\n let send_data = {\\\"params\\\":\\n {\\\"data\\\": {\\\"info\\\": input_text},\\n \\\"name\\\": dev_set_info[0],\\n \\\"password\\\": dev_set_info[1]}\\n };\\n // log(send_data);\\n let par2 = {headers:{'content-type':'application/json;charset=UTF-8','User-Agent':dev_set_info[3]},body:JSON.stringify(send_data),method:'POST'};\\n // par2 = JSON.stringify(par2); //x5里面请求才需要编码\\n try {\\n let back_ret = request(info_set_url, par2);\\n back_ret = JSON.parse(back_ret).result;\\n if(back_ret.status===0){\\n // refreshPage();\\n return 'toast://保存成功\\\\n'+back_ret.detail;\\n }else{\\n return 'toast://保存失败\\\\n'+back_ret.detail;\\n }\\n }catch (e) {\\n return 'toast://错误\\\\n'+e.message;\\n }\\n }else{\\n confirm({title:'道长提示',content:'虽然你很懒,但是公告至少写4个字吧!'});\\n return 'hiker://empty'\\n }\\n })\\n});\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"预处理依赖文件\",\"path\":\"libs\",\"rule\":\"if(getAppVersion()>=3200){\\n try{\\n rc(\\\"hiker://files/rules/js/$hiker.js\\\", -1);\\n //$.setRoot('https://hjdhnx.coding.net/public/hiker/hiker/git/files/master/js/');\\n $.setRoot();\\n $.setLib({\\n lsg: \\\"lsg.js\\\", //本地储存\\n file: \\\"file.js\\\", //文件os\\n fileSelect: \\\"fileSelect.js\\\", //文件选择器\\n dt: \\\"dt.js\\\", //动态分类\\n dr: \\\"dr.js\\\", //dr模板依赖\\n drpre: \\\"drpre.js\\\", //dr模板预处理\\n drup: \\\"drup.js\\\", //dr模板自动更新\\n drmatch: \\\"drmatch.js\\\", //dr模板自动模板匹配\\n drm: \\\"drm.js\\\", //dr模板小程序\\n cms: \\\"cms.js\\\", //cms模板依赖\\n cmspre: \\\"cmspre.js\\\", //cms预处理\\n cmsm: \\\"cmsm.js\\\", //cms模板小程序\\n libcheck: \\\"libcheck.js\\\", //dr检测依赖\\n ruleEditor: \\\"ruleEditor.js\\\", //写页源神器小程序\\n houseLazy: \\\"houseLazy.js\\\", //仓库通免\\n lazy: \\\"lazy.js\\\", //香免\\n sub: \\\"sub.js\\\", //道德经订阅\\n hikerUi: \\\"hikerUi.js\\\", //海阔组件依赖\\n hikerLibs: \\\"hikerLibs.js\\\", //海阔全能依赖\\n });\\n }catch(e){\\n //toast('请尝试点击仓库主页的升级仓库旁边的按钮升级$扩展,否则某些功能不能正常使用');\\n confirm({\\n title: '提示-点击确定可以导入',\\n content: '请尝试点击仓库主页的升级仓库旁边的按钮升级$扩展,否则某些功能不能正常使用',\\n confirm: $.toString(()=>{\\n const {getApi} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let ruleHead = '海阔视界,网页插件¥js_url¥$hiker@';\\n let url = getApi('importUrl')+\\\"5111\\\";\\n let importUrl = 'rule://'+base64Encode(ruleHead+url);\\n return importUrl\\n }),\\n cancel: $.toString(()=>{\\n\\n }),\\n })\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"Import详细\",\"path\":\"ruleDetailImport\",\"rule\":\"js:\\n$.exports = \\\"hiker://page/ruleDetail?rule=道长仓库Pro&id=\\\" + $.importParam;\\n\"},{\"col_type\":\"movie_3\",\"name\":\"跑马灯公告\",\"path\":\"notice\",\"rule\":\"js:\\nlet getHtml = (text, color) => `\\n<!DOCTYPE html>\\n<html>\\n<head>\\n<meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0\\\">\\n<style>\\n.marquee {\\n width: 100%;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n color: ${color};\\n font-size: 16px;\\n white-space: nowrap;\\n}\\n\\n.marquee span {\\n user-select:none;\\n display: inline-block; \\n padding-left: 100%;\\n animation: marquee 25s linear infinite;\\n}\\n\\n@keyframes marquee {\\n 0% { transform: translateX(0%); }\\n 100% { transform: translateX(-100%); }\\n}\\n\\n@media (prefers-color-scheme: dark) {\\n body {\\n background-color: #1B1B1B;\\n }\\n .text,.scroll{\\n color:#Fff;\\n }\\n }\\n\\n@media (prefers-color-scheme: light) {\\n body {\\n background-color: transparent;\\n }\\n }\\n\\n</style>\\n</head>\\n<body>\\n<div class=\\\"marquee\\\">\\n <span id=\\\"textContainer\\\">${text}</span>\\n</div>\\n</body>\\n</html>`;\\n\\n$.exports.show = function(arr, text, color, url, content) {\\n var html = getHtml(text || '这是跑马灯默认的文字,可以自行替换。', color || 'red');\\n arr.push({\\n col_type: \\\"x5_webview_single\\\",\\n url: \\\"about:blank\\\",\\n desc: \\\"50&&list\\\",\\n extra: {\\n js: $.toString((h, url) => {\\n var html = document.documentElement;\\n html.innerHTML = h;\\n\\n const textContainer = document.getElementById('textContainer');\\n const text = textContainer.innerHTML;\\n textContainer.onclick=function(){\\n window.location.href = url||\\\"about:blank/notice\\\";\\n }\\n // 设置文本容器宽度为文本内容的宽度\\n textContainer.style.width = `${textContainer.offsetWidth}px`;\\n\\n // 复制文本内容并追加到文本容器后面\\n textContainer.innerHTML += ' ' + text;\\n\\n // 动态计算动画持续时间\\n const duration = (textContainer.offsetWidth / textContainer.parentElement.offsetWidth) * 10;\\n\\n var styleElements = document.head.getElementsByTagName('style');\\n\\n\\n styleElements[2].innerHTML = `.marquee span {\\n display: inline-block;\\n padding-left: 100%;\\n animation: marquee ${duration}s linear infinite\\n }`;\\n\\n }, html, url),\\n urlInterceptor: $.toString((content) => {\\n if (input===\\\"about:blank/notice\\\") {\\n return $.toString((content) => {\\n fba.open(JSON.stringify({\\n title: \\\"公告\\\",\\n url: 'hiker://empty#noRecordHistory##noHistory#',\\n findRule: \\\"js:\\\" + $$$.toString((content) => setResult([{\\n title: content,\\n col_type: \\\"rich_text\\\",\\n }]),content)\\n }));\\n }, content);\\n }\\n }, content || text),\\n }\\n });\\n}\"}]","proxy":"","icon":"https://lanmeiguojiang.com/tubiao/other/30.svg"},{"last_chapter_rule":"","title":"聚影√","author":"","version":11,"type":"video","url":"hiker://empty##fypage","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nrequire(config.依赖);\nyiji()","searchFind":"js:require(config.依赖);\nsousuo()","search_url":"hiker://empty##**##fypage","group":"①推荐","detail_col_type":"movie_3","detail_find_rule":"js:require(config.依赖);\nerji()","sdetail_col_type":"movie_1","sdetail_find_rule":"*","ua":"pc","preRule":"if (!config.依赖) {\n //远程依赖索引文件代理地址列表\n let requirelist = [{ url: 'https://ghproxy.net/https://raw.githubusercontent.com/', sort: 0 }, { url: 'https://gh.con.sh/https://raw.githubusercontent.com/', sort: 0 }, { url: 'https://github.jevons.vip/https://raw.githubusercontent.com/', sort: 0 }]\n let requirefile = \"hiker://files/rules/Src/require.json\";\n if (fetch(requirefile)) {\n try {\n eval(\"requirelist=\" + fetch(requirefile) + \";\");\n } catch (e) { }\n }\n requirelist.sort(function (x, y) {\n if (x.sort < y.sort) {\n return -1;\n } else if (x.sort > y.sort) {\n return 1;\n } else {\n return 0;\n }\n });\n for (let i = 0; i < requirelist.length; i++) {\n try { //远程依赖索引\n require(requirelist[i].url + 'src48597962/hk/master/require.js', { timeout: 2000 });\n if (relyfile) {\n break;\n }\n } catch (e) {\n requirelist[i].sort++;\n log(e.message);\n }\n }\n writeFile(requirefile, JSON.stringify(requirelist));\n initConfig({\n 依赖: relyfile\n });\n let cfgfile = \"hiker://files/rules/Src/Juying/config.json\";\n if (fileExist(cfgfile)) {\n try {\n eval(\"let Juconfig=\" + fetch(cfgfile) + \";\");\n Juconfig[\"依赖\"] = relyfile;\n writeFile(cfgfile, JSON.stringify(Juconfig));\n } catch (e) { }\n }\n}\n//by.帅√`人才 聚影模板!","pages":"[{\"col_type\":\"movie_3\",\"name\":\"云口令导入\",\"path\":\"cloudimport\",\"rule\":\"function cloudimport() {\\n let remotefile;\\n let cfgfile = \\\"hiker://files/rules/Src/Juying/config.json\\\";\\n if (fileExist(cfgfile)) {\\n eval(\\\"let Juconfig=\\\" + fetch(cfgfile) + \\\";\\\");\\n remotefile = Juconfig[\\\"依赖\\\"].match(/http(s)?:\\\\/\\\\/.*\\\\//)[0] + 'SrcJySet.js';\\n }\\n if(remotefile){\\n require(remotefile);\\n return JYimport(input);\\n }else{\\n return \\\"toast://没有用过聚影√小程序?\\\";\\n }\\n}\\n$.exports = cloudimport();\"},{\"col_type\":\"movie_3\",\"name\":\"依赖文件\",\"path\":\"config\",\"rule\":\"js:\\n$.exports.version = 11;\"}]","proxy":"","icon":"https://img.vinua.cn/images/QqyC.png"},{"last_chapter_rule":"","title":"风影","author":"随风","version":230216,"type":"all","url":"hiker://empty##","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\n require(config.依赖);\n sy()","searchFind":"js:\n require(config.依赖);\n sou()","search_url":"hiker://empty##**","group":"①推荐","detail_col_type":"text_3","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"*","ua":"mobile","preRule":"let tacitly = \"aHR0cHM6Ly9naXRjb2RlLm5ldC9zdWlmZW4vc3VpZmVuZy8tL3Jhdy9tYXN0ZXIveWNsLmpz\";\nlet ycl = getItem(\"git\", base64Decode(tacitly));\ninitConfig({\n 依赖: ycl\n});","pages":"[]","proxy":"","icon":"https://s1.ax1x.com/2022/10/15/xwTPdU.jpg"},{"last_chapter_rule":"","title":"本地资源管理","author":"@LoyDgIk","version":99,"type":"tool","url":"hiker://empty","col_type":"movie_3_marquee","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nif (!getItem(\":startUse\", false)) {\n toast(\":-)初次见面,请多关照\");\n confirm({\n title: \"使用须知\",\n content: \"1.普通用户:本程序只提供本地阅读服务,不提供网络内容。\\n\\n2.开发者:提供多线程下载支持。\\n\\n3.如何获取内容?\\n通过「聚漫」「道长合集」等第三方小程序下载。\",\n confirm: \"setItem(':startUse','1');refreshPage();'toast://感谢您的理解'\",\n cancel: \"'toast://很遗憾,不能为您服务。\\\\n长按标题可删除。'\"\n });\n setResult([]);\n} else if (MY_RULE.title !== \"本地资源管理\") {\n confirm({\n title: \"警告⚠\",\n content: \"不能改名哦!\",\n confirm: $.toString(() => {\n MY_RULE.title = \"本地资源管理\";\n toast(\"已帮你改回原名,请重新导入\");\n return \"rule://\" + base64Encode(\"海阔视界¥home_rule¥\" + JSON.stringify(MY_RULE));\n }),\n cancel: \"'toast://很遗憾,不能为您服务。\\\\n长按标题可删除。'\"\n });\n setResult([]);\n} else {\n $.require(\"hiker://page/Main.view\");\n}","searchFind":"","search_url":"","group":"①推荐","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"#f.File工具\",\"path\":\"File.js\",\"rule\":\"const File = java.io.File;\\nconst {\\n Files,\\n Paths,\\n StandardCopyOption,\\n StandardOpenOption\\n} = java.nio.file;\\nconst javaString = java.lang.String;\\nlet javaScope = new JavaImporter(java.io, java.lang, java.lang.reflect, java.util.Vector);\\n\\nfunction deleteFiles(fileName) {\\n let file = new File(fileName);\\n if (!file.exists()) {\\n //log(\\\"删除文件失败:\\\" + fileName + \\\"文件不存在\\\");\\n return false;\\n } else {\\n if (file.isFile()) {\\n return deleteFile(fileName);\\n } else {\\n return deleteDirectory(fileName);\\n }\\n\\n }\\n\\n}\\n/**\\n * 删除单个文件\\n * \\n * @param fileName\\n * 被删除文件的文件名\\n * @return 单个文件删除成功返回true,否则返回false\\n */\\nfunction deleteFile(fileName) {\\n let file = new File(fileName);\\n if (file.isFile() && file.exists()) {\\n file.delete();\\n //log(\\\"删除单个文件\\\" + fileName + \\\"成功!\\\");\\n return true;\\n } else {\\n //log(\\\"删除单个文件\\\" + fileName + \\\"失败!\\\");\\n return false;\\n }\\n\\n}\\n/**\\n * 删除目录(文件夹)以及目录下的文件\\n * \\n * @param dir\\n * 被删除目录的文件路径\\n * @return 目录删除成功返回true,否则返回false\\n */\\nfunction deleteDirectory(dir) {\\n // 如果dir不以文件分隔符结尾,自动添加文件分隔符\\n if (!dir.endsWith(File.separator)) {\\n dir = dir + File.separator;\\n }\\n let dirFile = new File(dir);\\n // 如果dir对应的文件不存在,或者不是一个目录,则退出\\n if (!dirFile.exists() || !dirFile.isDirectory()) {\\n //log(\\\"删除目录失败\\\" + dir + \\\"目录不存在!\\\");\\n return false;\\n }\\n let flag = true;\\n // 删除文件夹下的所有文件(包括子目录)\\n let files = dirFile.listFiles();\\n for (let i = 0; i < files.length; i++) {\\n // 删除子文件\\n if (files[i].isFile()) {\\n flag = deleteFile(files[i].getAbsolutePath());\\n if (!flag) {\\n break;\\n }\\n } else { // 删除子目录\\n flag = deleteDirectory(files[i].getAbsolutePath());\\n if (!flag) {\\n break;\\n }\\n }\\n }\\n if (!flag) {\\n //log(\\\"删除目录失败\\\");\\n return false;\\n }\\n // 删除当前目录\\n if (dirFile.delete()) {\\n //log(\\\"删除目录\\\" + dir + \\\"成功!\\\");\\n return true;\\n } else {\\n //log(\\\"删除目录\\\" + dir + \\\"失败!\\\");\\n return false;\\n }\\n}\\n\\n//copy单个文件\\nfunction copyFile(source, target, isCover) {\\n let sourcePath = Paths.get(source);\\n let targetPath = Paths.get(target);\\n let isExist = Files.exists(targetPath);\\n if (Files.isDirectory(sourcePath) || (isExist && !isCover) || (isExist && Files.isDirectory(targetPath))) {\\n return false;\\n }\\n try {\\n if (!isExist) {\\n Files.createDirectories(targetPath.getParent());\\n }\\n if (isCover === true) {\\n Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);\\n } else {\\n Files.copy(sourcePath, targetPath, StandardCopyOption.COPY_ATTRIBUTES);\\n }\\n } catch (e) {\\n return false;\\n }\\n}\\n\\nfunction getFileTime(path) {\\n let file = new File(path);\\n let lastModified = file.lastModified();\\n let date = new Date(lastModified);\\n return date.getTime();\\n}\\n\\nfunction getName(path) {\\n return new File(path).getName() + \\\"\\\";\\n}\\n\\nfunction getFilePath(path, type, expand) {\\n type = type || \\\"file\\\";\\n if (![\\\"file\\\", \\\"dir\\\"].includes(type)) throw new Error(\\\"类型错误\\\");\\n let fileType = type === \\\"file\\\" ? \\\"isFile\\\" : \\\"isDirectory\\\";\\n let file = new File(path);\\n let array = file.listFiles() || [];\\n let pathList = [];\\n for (let i = 0; i < array.length; i++) {\\n if (array[i][fileType]()) {\\n pathList.push({\\n name: array[i].getName() + \\\"\\\",\\n path: array[i].getPath() + \\\"\\\",\\n lastModified: Number(array[i].lastModified()),\\n });\\n }\\n }\\n if (expand) {\\n pathList = pathList.filter(it => it.name.endsWith(expand));\\n }\\n return pathList;\\n}\\n\\nfunction getFiles(path, type, expand) {\\n let types = {\\n \\\"file\\\": \\\"isFile\\\",\\n \\\"dir\\\": \\\"isDirectory\\\"\\n };\\n let fileType = types[type];\\n let file = new File(path);\\n let array = file.listFiles() || [];\\n let fileList = [];\\n for (let i = 0; i < array.length; i++) {\\n let file = array[i];\\n if ((!fileType || file[fileType]()) && (!expand || file.getName().endsWith(expand))) {\\n fileList.push(file);\\n }\\n }\\n return fileList;\\n}\\n\\nfunction renameFile(fromPath, name) {\\n let fromFile = new File(fromPath);\\n let toFile = new File(fromFile.getParent() + \\\"/\\\" + name);\\n try {\\n if (!fromFile.exists()) {\\n return false;\\n }\\n if (toFile.exists()) {\\n if (!toFile.delete()) {\\n return false;\\n }\\n }\\n Files.move(fromFile.toPath(), toFile.toPath(), StandardCopyOption.REPLACE_EXISTING);\\n return true;\\n } catch (e) {\\n log(e.toString());\\n return false;\\n }\\n}\\n\\nfunction moveFiles(fromPath, toPath) {\\n let fromFile = new File(fromPath);\\n let toFile = new File(toPath);\\n try {\\n if (!fromFile.exists()) {\\n return false;\\n }\\n if (toFile.exists()) {\\n if (!deleteFiles(toPath)) {\\n return false;\\n }\\n }\\n Files.move(fromFile.toPath(), toFile.toPath(), StandardCopyOption.REPLACE_EXISTING);\\n return true;\\n } catch (e) {\\n log(e.toString());\\n return false;\\n }\\n}\\n\\nfunction fileWrite(path, content) {\\n writeFile(\\\"file://\\\" + path, content)\\n}\\n\\nfunction fileWriteAppend(path, content) {\\n let file = new File(path);\\n let paths = file.toPath();\\n if (file.exists()) {\\n Files.write(paths, new javaString(content).getBytes(), StandardOpenOption.APPEND);\\n } else {\\n writeFile(\\\"file://\\\" + path, content);\\n }\\n}\\n\\nfunction getTotalSizeOfFilesInDir(file) {\\n if (file.isFile()) {\\n return file.length();\\n }\\n let children = file.listFiles();\\n let total = 0;\\n if (children != null) {\\n for (let child of children) {\\n total += getTotalSizeOfFilesInDir(child);\\n }\\n }\\n return total;\\n}\\n\\nfunction getFileSize(filePath) {\\n //Byte\\n let size = getTotalSizeOfFilesInDir(new File(filePath));\\n if (size < 0) {\\n return null;\\n }\\n let unitForm = [\\\"Byte\\\", \\\"KB\\\", \\\"MB\\\", \\\"GB\\\", \\\"TB\\\"];\\n for (let i = 0, len = unitForm.length; i < len; i++) {\\n if (size > 1024) {\\n size /= 1024;\\n continue;\\n } else {\\n return size.toFixed(2).replace(/(\\\\.00)$/, \\\"\\\") + unitForm[i];\\n }\\n }\\n return \\\"ERROR:数值过大\\\";\\n}\\n//完整合并\\n/*\\nfunction fileCombine(filesInput, fileOut, extension, intercept) {\\n with(javaScope) {\\n const TMP_BUFFER_SIZE = 0x30000;\\n const BUFFER_SIZE = 0x300000;\\n //合并临时文件\\n let inputFile = new File(filesInput);\\n let tmpFile = new File(fileOut + \\\".tmp\\\");\\n let tos = new BufferedOutputStream(new FileOutputStream(tmpFile));\\n let inputFiles = inputFile.listFiles();\\n let tbys = Array.newInstance(Byte.TYPE, TMP_BUFFER_SIZE);\\n for (let file of inputFiles) {\\n if (file.getName().endsWith(extension)) {\\n let is = new FileInputStream(file);\\n let len = 0;\\n while ((len = is.read(tbys)) != -1) {\\n tos.write(tbys, 0, len);\\n }\\n is.close();\\n }\\n }\\n tos.close();\\n //规则替换规则;\\n let outFile = new File(fileOut);\\n if (typeof intercept === \\\"function\\\") {\\n let tis = new FileInputStream(tmpFile);\\n let os = new BufferedOutputStream(new FileOutputStream(outFile));\\n let len = 0;\\n let bys = Array.newInstance(Byte.TYPE, BUFFER_SIZE);\\n while ((len = tis.read(bys)) != -1) {\\n let nbys = intercept(new String(bys,0,len));\\n os.write(nbys, 0, nbys.length);\\n }\\n tmpFile.delete();\\n tis.close();\\n os.close();\\n } else {\\n if (outFile.exists()) {\\n outFile.delete();\\n }\\n tmpFile.renameTo(outFile);\\n }\\n }\\n}*/\\n//残\\nfunction fileRule(filesInput, fileOut, intercept) {\\n with(javaScope) {\\n const BUFFER_SIZE = 0x300000;\\n let tmpFile = new File(filesInput);\\n if (!(tmpFile.exists() && tmpFile.isFile())) {\\n return false;\\n }\\n let outFile = new File(fileOut);\\n\\n let tis = new FileInputStream(tmpFile);\\n let os = new BufferedOutputStream(new FileOutputStream(outFile));\\n let len = 0;\\n let bys = Array.newInstance(Byte.TYPE, BUFFER_SIZE);\\n while ((len = tis.read(bys)) != -1) {\\n let nbys = intercept(new String(bys, 0, len));\\n os.write(nbys, 0, nbys.length);\\n }\\n tmpFile.delete();\\n tis.close();\\n os.close();\\n return true;\\n }\\n}\\n\\nfunction readFile(path) {\\n try {\\n let paths = Paths.get(path);\\n if (!Files.exists(paths)) return \\\"\\\";\\n return String(new javaString(Files.readAllBytes(paths)));\\n } catch {\\n return \\\"\\\";\\n }\\n}\\n$.exports = {\\n getFileTime: (path) => getFileTime(path),\\n getFilePath: (path, type, expand) => getFilePath(path, type, expand),\\n deleteFiles: (path) => deleteFiles(path),\\n renameFile: (path, name) => renameFile(path, name),\\n moveFiles: (fromPath, toPath) => moveFiles(fromPath, toPath),\\n fileWrite: (path, content) => fileWrite(path, content),\\n fileWriteAppend: (path, content) => fileWriteAppend(path, content),\\n getName: (path) => getName(path),\\n getFileSize: (filePath) => getFileSize(filePath),\\n fileRule: (filesInput, fileOut, intercept) => fileRule(filesInput, fileOut, intercept),\\n copyFile: (source, target, isCover) => copyFile(source, target, isCover),\\n readFile: (path) => readFile(path),\\n getFiles: (path, type, expand) => getFiles(path, type, expand),\\n getTotalSizeOfFilesInDir:(file)=>getTotalSizeOfFilesInDir(file)\\n}\"},{\"col_type\":\"text_2\",\"name\":\"#v.下载列表-普通下载\",\"path\":\"download.view\",\"rule\":\"js:\\nconst viewConfig = Object.assign({\\n chapterList: [],\\n info: {},\\n defaultView: \\\"0\\\"\\n}, MY_PARAMS);\\nviewConfig.info = Object.assign({\\n ruleName: \\\"\\\",\\n bookName: \\\"\\\",\\n bookTopPic: \\\"\\\",\\n parseCode: \\\"\\\",\\n decode: undefined,\\n type: \\\"comic\\\",\\n comicScheme: \\\"1\\\"\\n}, viewConfig.info);\\nlet {\\n chapterList,\\n info,\\n defaultView\\n} = viewConfig;\\nsetPageTitle(\\\"选择器|\\\" + info.bookName)\\n\\nconst File = $.require(\\\"hiker://page/File.js\\\");\\nconst Tool = $.require(\\\"hiker://page/Tool.js\\\");\\nconst Config = $.require(\\\"hiker://page/Config.js\\\");\\n\\nviewConfig.info.bookName = Tool.textShield(viewConfig.info.bookName);\\nviewConfig.info.ruleName = Tool.textShield(viewConfig.info.ruleName);\\n\\nconst MY_ID = info.ruleName + \\\"//\\\" + info.bookName;\\n\\nlet isStart = getMyVar(MY_ID + \\\":isStart\\\");\\nlet viewMode = getMyVar(MY_ID + \\\":viewMode\\\", defaultView);\\nlet isReverse = getMyVar(MY_ID + \\\":isReverse\\\", \\\"0\\\");\\nlet tagFilter = getMyVar(MY_ID + \\\":tagFilter\\\", Config.def_DoVi_Type);\\n\\naddListener(\\\"onClose\\\", $.toString((MY_ID) => {\\n clearMyVar(MY_ID + \\\":loadingTeam\\\");\\n clearMyVar(MY_ID + \\\":viewMode\\\");\\n clearMyVar(MY_ID + \\\":completed\\\");\\n clearMyVar(MY_ID + \\\":batchTeam\\\");\\n clearMyVar(MY_ID + \\\":tagFilter\\\");\\n clearMyVar(MY_ID + \\\":pageNum\\\");\\n}, MY_ID));\\n\\nlet layout = [];\\n\\nif (isStart === \\\"1\\\") {\\n putMyVar(MY_ID + \\\":viewMode\\\", defaultView);\\n viewMode = \\\"1\\\";\\n}\\n\\nlet backupChapterList = chapterList;\\nif (typeof chapterList === \\\"string\\\") {\\n if (chapterList.startsWith(\\\"hiker://files/\\\")) {\\n chapterList = getPath(chapterList).slice(7);\\n backupChapterList = chapterList;\\n }\\n chapterList = JSON.parse(request(\\\"file://\\\" + chapterList) || \\\"[]\\\");\\n}\\nlet chapterAll = chapterList;\\nchapterList = chapterList.map((item, CID) => {\\n item.CID = CID;\\n item.title = Tool.textShield(item.title);\\n return item;\\n});\\nlet pageNum = Number(getMyVar(MY_ID + \\\":pageNum\\\", \\\"1\\\"));\\nlet chapterChunk = [chapterList].concat(Tool.chunk(chapterList, Config.viewPageSize));\\nchapterList = chapterChunk[pageNum] || [];\\nconst def_DoVi_Style = chapterAll.length === 1 ? \\\"text_center_1\\\" : Config.def_DoVi_Style;\\n\\nfunction setType() {\\n let set = (tag, put) => {\\n putMyVar(put, tag);\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n };\\n layout.push({\\n title: 0 == pageNum ? \\\"““””\\\" + (\\\"全部(\\\" + chapterAll.length + \\\")\\\").fontcolor(\\\"#23AD6F\\\") : \\\"全部(\\\" + chapterAll.length + \\\")\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(set, 0, MY_ID + \\\":pageNum\\\"),\\n col_type: \\\"scroll_button\\\"\\n });\\n for (let i = 1; i < chapterChunk.length; i++) {\\n let tagText = (i - 1) * Config.viewPageSize + \\\"-\\\" + ((i - 1) * Config.viewPageSize + chapterChunk[i].length);\\n layout.push({\\n title: i == pageNum ? \\\"““””\\\" + tagText.fontcolor(\\\"#23AD6F\\\") : tagText,\\n url: $(\\\"#noLoading#\\\").lazyRule(set, i, MY_ID + \\\":pageNum\\\"),\\n col_type: \\\"scroll_button\\\"\\n });\\n }\\n layout.push({\\n col_type: \\\"blank_block\\\"\\n });\\n layout.push({\\n title: tagFilter === \\\"0\\\" ? \\\"““””\\\" + \\\"全部\\\".fontcolor(\\\"#23AD6F\\\") : \\\"全部\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(set, \\\"0\\\", MY_ID + \\\":tagFilter\\\"),\\n col_type: \\\"scroll_button\\\"\\n });\\n layout.push({\\n title: tagFilter === \\\"1\\\" ? \\\"““””\\\" + \\\"未下载\\\".fontcolor(\\\"#23AD6F\\\") : \\\"未下载\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(set, \\\"1\\\", MY_ID + \\\":tagFilter\\\"),\\n col_type: \\\"scroll_button\\\"\\n });\\n layout.push({\\n title: tagFilter === \\\"2\\\" ? \\\"““””\\\" + \\\"已下载\\\".fontcolor(\\\"#23AD6F\\\") : \\\"已下载\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(set, \\\"2\\\", MY_ID + \\\":tagFilter\\\"),\\n col_type: \\\"scroll_button\\\"\\n });\\n}\\nlet chapterTeam = [];\\nlet record = [];\\nif (info.type === \\\"comic\\\") {\\n let lazy = $(\\\"#noLoading#\\\").lazyRule(() => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n let filelist = File.getFilePath(input);\\n let piclist = filelist.map((item, i) => \\\"file://\\\" + input + \\\"/\\\" + (i + 1) + \\\".jpg\\\");\\n return \\\"pics://\\\" + piclist.join(\\\"&&\\\");\\n });\\n\\n function comFun(i, item) {\\n let rootPath = Config.comicPath + \\\"/\\\" + info.ruleName + \\\"/\\\" + info.bookName + \\\"/\\\" + i + \\\"$A$\\\" + item.title;\\n return {\\n title: \\\"““\\\" + item.title + \\\"””\\\",\\n url: rootPath + lazy,\\n extra: {\\n id: MY_ID + \\\"#\\\" + i,\\n },\\n col_type: def_DoVi_Style\\n }\\n }\\n File.getFilePath(Config[info.type + \\\"Path\\\"] + \\\"/\\\" + info.ruleName + \\\"/\\\" + info.bookName, \\\"dir\\\").forEach((file) => {\\n let att = Tool.split(file.name, \\\"$\\\", 2);\\n if (att.length === 3 && att[1] === (\\\"A\\\")) {\\n record.push(att[2]);\\n }\\n });\\n} else {\\n function comFun(i, item) {\\n return {\\n title: \\\"““\\\" + item.title + \\\"””\\\",\\n url: \\\"hiker://page/NovelMainBody#autoPage##readTheme#\\\",\\n extra: {\\n id: MY_ID + \\\"#\\\" + i,\\n path: Config.novelPath + \\\"/\\\" + info.ruleName + \\\"/\\\" + info.bookName + \\\"/\\\" + i + \\\"$A$\\\" + item.title + \\\".txt\\\",\\n title: item.title\\n },\\n col_type: def_DoVi_Style\\n }\\n }\\n File.getFilePath(Config[info.type + \\\"Path\\\"] + \\\"/\\\" + info.ruleName + \\\"/\\\" + info.bookName, \\\"file\\\", \\\".txt\\\").forEach((file) => {\\n let att = Tool.split(file.name, \\\"$\\\", 2);\\n if (att.length === 3 && att[1] === (\\\"A\\\")) {\\n record.push(att[2].slice(0, att[2].lastIndexOf(\\\".\\\")));\\n }\\n });\\n}\\n\\nfunction clickDownload(item, info, MY_ID, i) {\\n let loadingTeam = JSON.parse(getMyVar(MY_ID + \\\":loadingTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n let ElementIndex = loadingTeam.indexOf(i);\\n if (ElementIndex > -1) return \\\"toast://正在下载\\\";\\n\\n loadingTeam.push(i);\\n putMyVar(MY_ID + \\\":loadingTeam\\\", JSON.stringify(loadingTeam));\\n updateItem({\\n title: \\\"‘‘\\\" + item.title + \\\"’’\\\",\\n extra: {\\n id: MY_ID + \\\"#\\\" + i\\n }\\n });\\n let result = \\\"toast://下载失败\\\";\\n try {\\n toast(\\\"开始下载:\\\" + item.title);\\n let download = $.require(\\\"hiker://page/Download.exe.js\\\");\\n result = download(item, info, i, MY_ID);\\n updateItem({\\n title: \\\"““\\\" + item.title + \\\"””\\\",\\n url: \\\"toast://已下载\\\",\\n extra: {\\n id: MY_ID + \\\"#\\\" + i\\n }\\n });\\n } catch (e) {\\n updateItem({\\n title: item.title,\\n extra: {\\n id: MY_ID + \\\"#\\\" + i\\n }\\n });\\n log(e.toString());\\n } finally {\\n loadingTeam.splice(ElementIndex, 1);\\n putMyVar(MY_ID + \\\":loadingTeam\\\", JSON.stringify(loadingTeam));\\n }\\n return result;\\n}\\n\\nfunction singleView() {\\n layout.push({\\n title: \\\"反转列表\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((isReverse, MY_ID) => {\\n putMyVar(MY_ID + \\\":isReverse\\\", isReverse === \\\"0\\\" ? \\\"1\\\" : \\\"0\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, isReverse, MY_ID),\\n pic_url: \\\"https://img.icons8.com/?id=33nvDqbHH7HW&size=48&format=gif&token=\\\",\\n col_type: \\\"icon_2\\\"\\n });\\n layout.push({\\n title: \\\"批量下载\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((MY_ID) => {\\n let loadingTeam = JSON.parse(getMyVar(MY_ID + \\\":loadingTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n if (loadingTeam.length > 0) return \\\"toast://还有任务没有完成\\\";\\n if (getAppVersion() < 2594) return \\\"toast://未开放\\\";\\n putMyVar(MY_ID + \\\":viewMode\\\", \\\"1\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n\\n }, MY_ID),\\n pic_url: \\\"https://img.icons8.com/?format=gif&id=0uafaMNzxj88&token=\\\",\\n col_type: \\\"icon_2\\\"\\n });\\n setType();\\n layout.push({\\n col_type: \\\"line_blank\\\"\\n });\\n let loadingTeam = JSON.parse(getMyVar(MY_ID + \\\":loadingTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n for (let i = 0, item = chapterList[0]; i < chapterList.length; item = chapterList[++i]) {\\n let is_download = record.includes(item.title);\\n if (is_download && tagFilter !== \\\"1\\\") {\\n chapterTeam.push(comFun(item.CID, item));\\n } else if (!is_download && tagFilter !== \\\"2\\\") {\\n chapterTeam.push({\\n title: loadingTeam.includes(item.CID) ? \\\"‘‘\\\" + item.title + \\\"’’\\\" : item.title,\\n url: $(\\\"#noLoading#\\\").lazyRule(clickDownload, item, info, MY_ID, item.CID),\\n extra: {\\n id: MY_ID + \\\"#\\\" + item.CID\\n },\\n col_type: def_DoVi_Style\\n });\\n }\\n }\\n}\\n\\nfunction clickChoose(title, MY_ID, i) {\\n let isStart = getMyVar(MY_ID + \\\":isStart\\\");\\n if (isStart === \\\"1\\\") return \\\"toast://正在下载...\\\";\\n let batchTeam = JSON.parse(getMyVar(MY_ID + \\\":batchTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n let ElementIndex = batchTeam.indexOf(i);\\n if (ElementIndex > -1) {\\n updateItem({\\n title: title,\\n extra: {\\n id: MY_ID + \\\"#\\\" + i\\n }\\n });\\n batchTeam.splice(ElementIndex, 1);\\n } else {\\n updateItem({\\n title: \\\"‘‘\\\" + title + \\\"’’\\\",\\n extra: {\\n id: MY_ID + \\\"#\\\" + i\\n }\\n });\\n batchTeam.push(i);\\n }\\n putMyVar(MY_ID + \\\":batchTeam\\\", JSON.stringify(batchTeam));\\n return \\\"hiker://empty\\\";\\n}\\n\\nfunction batchView() {\\n layout.push({\\n title: \\\"单选下载\\\",\\n pic_url: \\\"https://img.icons8.com/?id=PIicvF6ebzMn&size=48&format=gif&token=\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((MY_ID) => {\\n if (getMyVar(MY_ID + \\\":isStart\\\") === \\\"1\\\") return \\\"toast://正在批量下载\\\";\\n putMyVar(MY_ID + \\\":viewMode\\\", \\\"0\\\");\\n clearMyVar(MY_ID + \\\":batchTeam\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, MY_ID),\\n col_type: \\\"icon_small_4\\\"\\n });\\n let start = Config.viewPageSize * Math.max(pageNum - 1, 0);\\n let end = start + chapterList.length;\\n layout.push({\\n title: \\\"选择全部\\\",\\n pic_url: \\\"https://img.icons8.com/?format=gif&id=1HVcHLoNzrit&token=\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((start, end, MY_ID) => {\\n if (getMyVar(MY_ID + \\\":isStart\\\") === \\\"1\\\") return \\\"toast://正在下载哦~\\\";\\n const Tool = $.require(\\\"hiker://page/Tool.js\\\");\\n let chooseTeam = Tool.range(start, end);\\n let batchTeam = JSON.parse(getMyVar(MY_ID + \\\":batchTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n batchTeam = Array.from(new Set(batchTeam.concat(chooseTeam)));\\n let completed = JSON.parse(getMyVar(MY_ID + \\\":completed\\\", \\\"[]\\\") || \\\"[]\\\");\\n batchTeam = batchTeam.filter((i) => !completed.includes(i));\\n putMyVar(MY_ID + \\\":batchTeam\\\", JSON.stringify(batchTeam));\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, start, end, MY_ID),\\n col_type: \\\"icon_small_4\\\"\\n });\\n layout.push({\\n title: \\\"取消全部\\\",\\n pic_url: \\\"https://img.icons8.com/?format=gif&id=HzEjPpI3NL8D&token=\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((start, end, MY_ID) => {\\n if (getMyVar(MY_ID + \\\":isStart\\\") === \\\"1\\\") return \\\"toast://正在下载哦~\\\";\\n const Tool = $.require(\\\"hiker://page/Tool.js\\\");\\n let chooseTeam = new Set(Tool.range(start, end));\\n let batchTeam = JSON.parse(getMyVar(MY_ID + \\\":batchTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n batchTeam = batchTeam.filter(x => !chooseTeam.has(x));\\n putMyVar(MY_ID + \\\":batchTeam\\\", JSON.stringify(batchTeam));\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, start, end, MY_ID),\\n col_type: \\\"icon_small_4\\\"\\n });\\n layout.push({\\n title: \\\"确认选中\\\",\\n pic_url: \\\"https://img.icons8.com/?format=gif&id=tMrvtc6T9hVb&token=\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((MY_ID) => {\\n if (getMyVar(MY_ID + \\\":isStart\\\", \\\"-1\\\") !== \\\"-1\\\") {\\n return \\\"toast://正在下载哦~\\\";\\n }\\n let batchTeam = JSON.parse(getMyVar(MY_ID + \\\":batchTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n return batchTeam.length === 0 ? \\\"toast://你还什么都没有选\\\" : \\\"hiker://page/Batch.view#noRefresh##noHistory##noRecordHistory#\\\";\\n }, MY_ID),\\n extra: {\\n newWindow: true,\\n windowId: MY_ID + \\\"//批量下载\\\",\\n MY_ID: MY_ID,\\n chapterList: backupChapterList,\\n info: info\\n },\\n col_type: \\\"icon_small_4\\\"\\n });\\n setType();\\n layout.push({\\n col_type: \\\"line_blank\\\"\\n });\\n let batchTeam = JSON.parse(getMyVar(MY_ID + \\\":batchTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n let completed = [];\\n for (let i = 0, item = chapterList[0]; i < chapterList.length; item = chapterList[++i]) {\\n let is_download = record.includes(item.title);\\n\\n if (is_download) {\\n completed.push(item.CID);\\n if (tagFilter !== \\\"1\\\") {\\n chapterTeam.push(comFun(item.CID, item));\\n }\\n } else if (!is_download && tagFilter !== \\\"2\\\") {\\n chapterTeam.push({\\n title: batchTeam.includes(item.CID) ? \\\"‘‘\\\" + item.title + \\\"’’\\\" : item.title,\\n url: $(\\\"#noLoading#\\\").lazyRule(clickChoose, item.title, MY_ID, item.CID),\\n extra: {\\n id: MY_ID + \\\"#\\\" + item.CID\\n },\\n col_type: def_DoVi_Style\\n });\\n }\\n }\\n putMyVar(MY_ID + \\\":completed\\\", JSON.stringify(completed));\\n}\\nswitch (viewMode) {\\n case \\\"0\\\":\\n singleView();\\n break;\\n case \\\"1\\\":\\n batchView();\\n break;\\n}\\nif (isReverse === \\\"1\\\") {\\n chapterTeam.reverse();\\n}\\nlayout.push.apply(layout, chapterTeam);\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#v.批量下载器\",\"path\":\"Batch.view\",\"rule\":\"js:\\nlet {\\n chapterList,\\n info,\\n MY_ID\\n} = MY_PARAMS;\\nsetPageTitle(\\\"下载器|\\\"+info.bookName);\\naddListener(\\\"onClose\\\", $.toString((MY_ID) => {\\n clearMyVar(MY_ID + \\\":isStart\\\");\\n clearMyVar(MY_ID + \\\":status\\\");\\n clearMyVar(MY_ID + \\\":batchTeam\\\");\\n refreshPage();\\n}, MY_ID));\\n\\nlet isStart = getMyVar(MY_ID + \\\":isStart\\\", \\\"0\\\");\\nlet status = getMyVar(MY_ID + \\\":status\\\", \\\"0\\\");\\nlet layout = [];\\n\\nlet batchTeam = JSON.parse(getMyVar(MY_ID + \\\":batchTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\nif(typeof chapterList === \\\"string\\\"){\\n chapterList = JSON.parse(request(\\\"file://\\\"+chapterList)||\\\"[]\\\");\\n}\\nlet chapterTeam = batchTeam.map(v => {\\n let chapterItem = chapterList[v];\\n chapterItem.CID = v;\\n return chapterItem;\\n});\\nif (isStart === \\\"0\\\") {\\n layout.push({\\n title: \\\"开始下载[\\\" + chapterTeam.length + \\\"]\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((chapterTeam, info, MY_ID) => {\\n putMyVar(MY_ID + \\\":isStart\\\", \\\"1\\\");\\n refreshPage(false);\\n let download = $.require(\\\"hiker://page/BatchStatistics.js\\\");\\n if(info.type===\\\"comic\\\"&&info.comicScheme===\\\"1\\\"){\\n download=download.b;\\n }else{\\n download=download.a;\\n }\\n return download(chapterTeam, info, MY_ID) || \\\"toast://下载错误\\\";\\n }, chapterTeam, info, MY_ID),\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n id: MY_ID + \\\"||开始下载\\\"\\n }\\n });\\n layout.push({\\n title: \\\"任务列表:\\\",\\n col_type: \\\"rich_text\\\",\\n });\\n for (let item of chapterTeam) {\\n layout.push({\\n title: item.title,\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_2\\\"\\n });\\n }\\n\\n} else {\\n layout.push({\\n title: \\\"下载进度:0/\\\"+chapterTeam.length,\\n desc: \\\"““””▇▇▇▇▇▇▇▇▇▇\\\".fontcolor(\\\"#e5e1e4\\\")+\\\" 0%\\\",\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n id: MY_ID + \\\"||下载进度\\\",\\n lineVisible: false\\n }\\n });\\n layout.push({\\n title: \\\"后台下载\\\",\\n url: \\\"func://background\\\",\\n col_type: \\\"text_2\\\"\\n });\\n\\n layout.push({\\n title: [\\\"[取消下载]\\\", \\\"[正在停止...]\\\", \\\"[返回]\\\", \\\"[处理失败]\\\", \\\"[重新开始]\\\"][status],\\n url: $(\\\"#noLoading#\\\").lazyRule((MY_ID) => {\\n let status = getMyVar(MY_ID + \\\":status\\\", \\\"0\\\");\\n if (status === \\\"0\\\") {\\n putMyVar(MY_ID + \\\":status\\\", \\\"1\\\");\\n updateItem({\\n title: \\\"[正在停止...]\\\",\\n extra: {\\n id: MY_ID + \\\"||下载控制\\\"\\n }\\n });\\n return \\\"toast://正在取消下载任务\\\";\\n } else if (status === \\\"1\\\") {\\n return \\\"toast://正在暂停...\\\";\\n } else if (status === \\\"2\\\") {\\n back();\\n return \\\"toast://已退出下载器\\\";\\n } else if ([\\\"3\\\", \\\"4\\\"].includes(status)) {\\n clearMyVar(MY_ID + \\\":isStart\\\");\\n clearMyVar(MY_ID + \\\":status\\\");\\n clearMyVar(MY_ID + \\\":log\\\");\\n refreshPage();\\n return \\\"toast://重新点击下载\\\"\\n }\\n }, MY_ID),\\n col_type: \\\"text_2\\\",\\n extra: {\\n id: MY_ID + \\\"||下载控制\\\"\\n }\\n });\\n layout.push({\\n col_type: \\\"line_blank\\\"\\n });\\n layout.push({\\n title: \\\"<strong>下载日志</strong>\\\".big(),\\n col_type: \\\"rich_text\\\",\\n \\n });\\n layout.push({\\n col_type: \\\"line\\\",\\n extra: {\\n id: MY_ID + \\\"||日志\\\"\\n }\\n });\\n layout.push({\\n title:\\\"““””$>\\\"+\\\"开始下载......\\\".fontcolor(\\\"#00ff00\\\"),\\n url:\\\"hiker://empty\\\",\\n col_type: \\\"text_1\\\",\\n extra: {\\n id: MY_ID + \\\"#log#0\\\",\\n lineVisible:false\\n }\\n });\\n}\\n\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#fg.批量下载统计\",\"path\":\"BatchStatistics.js\",\"rule\":\"const Tool = $.require(\\\"hiker://page/Tool.js\\\");\\nconst Config = $.require(\\\"hiker://page/Config.js\\\");\\n\\n$.exports.a = function(chapterTeam, info, MY_ID) {\\n if (chapterTeam.length === 0) {\\n return \\\"toast://空的下载队列\\\";\\n }\\n\\n var count = 0;\\n var taskCount = chapterTeam.length;\\n var successCID = [];\\n var failName = [];\\n var logCount = 1;\\n var taskTeam = chapterTeam.map(chapterItem => ({\\n func: task,\\n id: chapterItem.title,\\n param: {\\n chapterItem: chapterItem,\\n info: info,\\n MY_ID: MY_ID\\n }\\n }));\\n let logNum = Config.logNum;\\n\\n\\n function putLog(text) {\\n log(text);\\n if (logCount >= logNum) {\\n deleteItem(MY_ID + \\\"#log#\\\" + (logCount - 10));\\n }\\n addItemAfter(MY_ID + \\\"||日志\\\", {\\n url: \\\"hiker://empty\\\",\\n title: \\\"$>\\\" + text,\\n col_type: \\\"text_1\\\",\\n extra: {\\n lineVisible: false,\\n id: MY_ID + \\\"#log#\\\" + logCount\\n }\\n });\\n logCount++;\\n }\\n\\n function task(taskParam) {\\n let result = $.require(\\\"hiker://page/Batch.exe.js\\\")(taskParam);\\n return result;\\n }\\n\\n function listener(perch, id, error, CID) {\\n count++;\\n let isSuccess = false;\\n if (error != null) {\\n failName.push(id);\\n putLog(\\\"[listener]下载失败:\\\" + id + \\\"<ERROR@ \\\" + error + \\\">\\\");\\n } else if (CID >= 0) {\\n successCID.push(CID);\\n let ratio = (count / taskCount).toFixed(4);\\n let stripCount = Math.ceil(ratio * 10);\\n isSuccess = true;\\n updateItem({\\n title: \\\"下载进度:\\\" + successCID.length + \\\"/\\\" + taskCount,\\n desc: \\\"““””\\\" + \\\"▇\\\".repeat(stripCount).fontcolor(\\\"#ffac2d\\\") + \\\"▇\\\".repeat(10 - stripCount).fontcolor(\\\"#e5e1e4\\\") + \\\" \\\" + String((ratio * 100)).slice(0, 5) + \\\"%\\\",\\n extra: {\\n id: MY_ID + \\\"||下载进度\\\"\\n }\\n });\\n putLog(\\\"[listener]已完成下载:\\\" + id);\\n } else if (CID === -1) {\\n failName.push(id);\\n putLog(\\\"[listener]已停止:\\\" + id);\\n count = taskCount;\\n }\\n\\n if (taskCount !== count) return;\\n if (successCID.length === taskCount) {\\n updateItem({\\n desc: \\\"““””\\\" + \\\"▇\\\".repeat(10).fontcolor(\\\"#00ff00\\\") + \\\" 100%\\\",\\n extra: {\\n id: MY_ID + \\\"||下载进度\\\"\\n }\\n });\\n }\\n let batchTeam = JSON.parse(getMyVar(MY_ID + \\\":batchTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n let status = getMyVar(MY_ID + \\\":status\\\", \\\"0\\\");\\n let failTeam = batchTeam.filter(v => !successCID.includes(v));\\n putMyVar(MY_ID + \\\":batchTeam\\\", JSON.stringify(failTeam));\\n if (failTeam.length > 0 && status !== \\\"1\\\") {\\n putMyVar(MY_ID + \\\":status\\\", \\\"3\\\");\\n putLog(\\\"下载失败:[\\\" + failName.join(\\\"],[\\\") + \\\"]。\\\");\\n updateItem({\\n title: \\\"[处理失败]\\\",\\n extra: {\\n id: MY_ID + \\\"||下载控制\\\"\\n }\\n });\\n } else if (failTeam.length > 0 && status === \\\"1\\\") {\\n putMyVar(MY_ID + \\\":status\\\", \\\"4\\\");\\n putLog(\\\"[listener]#已停止所有任务,但已有进度不会消失#\\\");\\n updateItem({\\n title: \\\"[重新开始]\\\",\\n extra: {\\n id: MY_ID + \\\"||下载控制\\\"\\n }\\n });\\n return \\\"break\\\";\\n } else {\\n putMyVar(MY_ID + \\\":status\\\", \\\"2\\\");\\n putLog(\\\"下载任务[\\\" + info.bookName + \\\"]已全部成功完成\\\");\\n updateItem({\\n title: \\\"[返回]\\\",\\n extra: {\\n id: MY_ID + \\\"||下载控制\\\"\\n }\\n });\\n }\\n toast(\\\"下载任务[\\\" + info.bookName + \\\"]已完成\\\");\\n }\\n let taskTeamChunk = [];\\n if (Config.threadNum > 0) {\\n taskTeamChunk = Tool.chunk(taskTeam, Config.threadNum);\\n } else {\\n taskTeamChunk = [taskTeam];\\n }\\n for (let taskList of taskTeamChunk) {\\n be(taskList, {\\n func: listener\\n });\\n let status = getMyVar(MY_ID + \\\":status\\\", \\\"0\\\");\\n if (status === \\\"1\\\") {\\n let batchTeam = JSON.parse(getMyVar(MY_ID + \\\":batchTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n //let status = getMyVar(MY_ID + \\\":status\\\", \\\"0\\\");\\n let failTeam = batchTeam.filter(v => !successCID.includes(v));\\n putMyVar(MY_ID + \\\":batchTeam\\\", JSON.stringify(failTeam));\\n putMyVar(MY_ID + \\\":status\\\", \\\"4\\\");\\n putLog(\\\"[listener]#已停止所有任务,但已有进度不会消失#\\\");\\n updateItem({\\n title: \\\"[重新开始]\\\",\\n extra: {\\n id: MY_ID + \\\"||下载控制\\\"\\n }\\n });\\n return \\\"hiker://empty\\\";\\n }\\n\\n }\\n\\n return \\\"hiker://empty\\\";\\n};\\n\\n$.exports.b = function comic(chapterTeam, info, MY_ID) {\\n if (chapterTeam.length === 0) {\\n return \\\"toast://空的下载队列\\\";\\n }\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n\\n let logNum = Config.logNum;\\n let logCount = 0;\\n\\n function putLog(text) {\\n log(text);\\n if (logCount >= logNum) {\\n deleteItem(MY_ID + \\\"#log#\\\" + (logCount - 10));\\n }\\n addItemAfter(MY_ID + \\\"||日志\\\", {\\n url: \\\"hiker://empty\\\",\\n title: \\\"$>\\\" + text,\\n col_type: \\\"text_1\\\",\\n extra: {\\n lineVisible: false,\\n id: MY_ID + \\\"#log#\\\" + logCount\\n }\\n });\\n logCount++;\\n }\\n\\n function task(taskParam) {\\n const Tool = $.require(\\\"hiker://page/Tool.js\\\");\\n for (let i = 0; i < 10; i++) {\\n try {\\n let pic = Tool.hikerPic(taskParam.url);\\n Tool.picDownload(pic[0], taskParam.chapterPath + (taskParam.i + 1) + \\\".jpg\\\", pic[1], taskParam.decode);\\n if (getMyVar(taskParam.MY_ID + \\\":status\\\", \\\"\\\") === \\\"1\\\") {\\n return -1;\\n }\\n errorNum = 0;\\n break;\\n } catch (e) {\\n if (i === 9) {\\n throw e;\\n }\\n }\\n }\\n return taskParam.CID;\\n }\\n let count = 0;\\n let totalCount = 0;\\n let successCID = [];\\n\\n function listener(param, id, error, result) {\\n try {\\n totalCount++;\\n\\n if (error != null) {\\n putLog(\\\"[listener]下载失败:\\\" + id + \\\"<ERROR@ \\\" + error + \\\">\\\");\\n } else if (result === -1) {\\n putLog(\\\"[listener]已停止:\\\" + id);\\n totalCount = param.pivCount;\\n } else {\\n count++;\\n let ratio = ((count / param.pivCount)).toFixed(4);\\n let stripCount = Math.ceil(ratio * 10);\\n if (param.pivCount === totalCount && totalCount === count) {\\n successCID.push(param.CID);\\n }\\n updateItem({\\n title: \\\"下载进度:\\\" + (successCID.length) + \\\"/\\\" + param.total,\\n desc: \\\"““””\\\" + \\\"▇\\\".repeat(stripCount).fontcolor(\\\"#ffac2d\\\") + \\\"▇\\\".repeat(10 - stripCount).fontcolor(\\\"#e5e1e4\\\") + \\\" \\\" + String((ratio * 100)).slice(0, 5) + \\\"%\\\",\\n extra: {\\n id: MY_ID + \\\"||下载进度\\\"\\n }\\n });\\n //putLog(\\\"[listener]已完成下载:\\\" + id);\\n }\\n if (totalCount !== param.pivCount) return;\\n if (totalCount === count) {\\n File.renameFile(param.chapterPath, param.CID + \\\"$A$\\\" + Tool.textShield(param.title));\\n }\\n totalCount = count = 0;\\n return \\\"break\\\";\\n } catch (e) {\\n log(e.toString());\\n }\\n }\\n let taskTeam = [];\\n let mainPath = Config.comicPath + \\\"/\\\" + info.ruleName + \\\"/\\\" + Tool.textShield(info.bookName) + \\\"/\\\";\\n if (info.bookTopPic) {\\n try {\\n let bookTopPic = Tool.hikerPic(info.bookTopPic);\\n Tool.picDownload(bookTopPic[0], mainPath + info.bookName + \\\".jpg\\\", bookTopPic[1], info.decode);\\n } catch (e) {\\n log(\\\"<封面下载错误> \\\" + e.message);\\n }\\n }\\n\\n for (let k = 0; k < chapterTeam.length; k++) {\\n let item = chapterTeam[k];\\n let order = k;\\n let chapterPath = mainPath + item.CID + \\\"$B$\\\" + Tool.textShield(item.title) + \\\"/\\\";\\n let picList = [];\\n try {\\n let getPicList = new Function(\\\"input\\\", \\\"url\\\", \\\"index\\\", \\\"title\\\", \\\"return\\\" + info.parseCode);\\n picList = getPicList(item.url, item.url, k, item.title);\\n if (typeof picList === \\\"string\\\") {\\n picList = picList.replace(\\\"pics://\\\", \\\"\\\").split(\\\"&&\\\");\\n }\\n } catch (e) {\\n putLog(\\\"<漫画图片解析错误> \\\" + e.message);\\n continue;\\n }\\n if (picList.length === 0) {\\n putLog(\\\"<漫画图片解析错误:图片链接返回为空>\\\");\\n continue;\\n }\\n picList = picList.filter(p => p);\\n var taskTeam = picList.map((url, i) => ({\\n func: task,\\n id: i,\\n param: {\\n url: url,\\n i: i,\\n chapterPath: chapterPath,\\n MY_ID: MY_ID,\\n decode: info.decode\\n }\\n }));\\n be(taskTeam, {\\n func: listener,\\n param: {\\n pivCount: picList.length,\\n total: chapterTeam.length,\\n order: order,\\n CID: item.CID,\\n title: item.title,\\n chapterPath: chapterPath\\n }\\n });\\n if (getMyVar(MY_ID + \\\":status\\\", \\\"\\\") === \\\"1\\\") {\\n break;\\n }\\n }\\n\\n let status = getMyVar(MY_ID + \\\":status\\\", \\\"0\\\");\\n java.lang.Thread.sleep(40);\\n //let batchTeam = JSON.parse(getMyVar(MY_ID + \\\":batchTeam\\\", \\\"[]\\\") || \\\"[]\\\");\\n let failTeam = chapterTeam.filter(v => !successCID.includes(v.CID));\\n let failName = failTeam.map(item => item.title);\\n let batchTeam = failTeam.map(item => item.CID);\\n\\n if (failTeam.length > 0 && status !== \\\"1\\\") {\\n putMyVar(MY_ID + \\\":batchTeam\\\", JSON.stringify(batchTeam));\\n putMyVar(MY_ID + \\\":status\\\", \\\"3\\\");\\n putLog(\\\"下载失败:[\\\" + failName.join(\\\"],[\\\") + \\\"]。\\\");\\n updateItem({\\n title: \\\"[处理失败]\\\",\\n extra: {\\n id: MY_ID + \\\"||下载控制\\\"\\n }\\n });\\n } else if (failTeam.length > 0 && status === \\\"1\\\") {\\n putMyVar(MY_ID + \\\":batchTeam\\\", JSON.stringify(batchTeam));\\n putMyVar(MY_ID + \\\":status\\\", \\\"4\\\");\\n putLog(\\\"[listener]#已停止所有任务,但已有进度不会消失#\\\");\\n updateItem({\\n title: \\\"[重新开始]\\\",\\n extra: {\\n id: MY_ID + \\\"||下载控制\\\"\\n }\\n });\\n } else {\\n putMyVar(MY_ID + \\\":status\\\", \\\"2\\\");\\n putLog(\\\"下载任务[\\\" + info.bookName + \\\"]已全部成功完成\\\");\\n updateItem({\\n title: \\\"[返回]\\\",\\n extra: {\\n id: MY_ID + \\\"||下载控制\\\"\\n }\\n });\\n }\\n return \\\"hiker://empty\\\";\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"#fg.批量主程序\",\"path\":\"Batch.exe.js\",\"rule\":\"const Mian = $.require(\\\"mainDownload\\\");\\nfunction comic(taskParam) {\\n let {\\n chapterItem,\\n info,\\n MY_ID,\\n } = taskParam;\\n return Mian.comic(chapterItem, info, chapterItem.CID, MY_ID, true)||chapterItem.CID;\\n}\\n\\nfunction novel(taskParam) {\\n let {\\n chapterItem,\\n info,\\n MY_ID,\\n } = taskParam;\\n return Mian.novel(chapterItem, info, chapterItem.CID,MY_ID, true)||chapterItem.CID;\\n //File.renameFile(chapterPath, chapterItem.CID + \\\"$A$\\\" + chapterItem.title);\\n}\\nvar $exe = {\\n comic: comic,\\n novel: novel\\n};\\n$.exports = function(taskParam) {\\n return $exe[taskParam.info.type](taskParam);\\n};\"},{\"col_type\":\"movie_3\",\"name\":\"#fg.普通主程序\",\"path\":\"Download.exe.js\",\"rule\":\"const Mian = $.require(\\\"mainDownload\\\");\\nfunction novel(item, info, order, MY_ID) {\\n Mian.novel(item, info, order);\\n return \\\"toast://\\\" + info.bookName + \\\"@\\\" + item.title + \\\" 下载完成\\\";\\n}\\n\\nfunction comic(item, info, order, MY_ID) {\\n Mian.comic(item, info, order);\\n return \\\"toast://\\\" + info.bookName + \\\"@\\\" + item.title + \\\" 下载完成\\\";\\n}\\nvar $exe = {\\n comic: comic,\\n novel: novel\\n};\\n$.exports = function(item, info, order, MY_ID) {\\n return $exe[info.type](item, info, order, MY_ID);\\n};\"},{\"col_type\":\"movie_3\",\"name\":\"#f.通用工具\",\"path\":\"Tool.js\",\"rule\":\"const v = {\\n split(text, target, count) {\\n count = count === undefined ? 1 : count;\\n let array = [text];\\n for (let i = 0; i < count; i++) {\\n text = array[i];\\n let index = text.indexOf(target);\\n if (index === -1) {\\n break;\\n }\\n array[i] = text.slice(0, index);\\n array[i + 1] = text.slice(index + target.length);\\n }\\n return array;\\n },\\n chunk(arr, size) {\\n var result = [];\\n for (var i = 0, len = arr.length; i < len; i += size) {\\n result.push(arr.slice(i, i + size));\\n }\\n return result;\\n },\\n hikerPic(url) {\\n var headers = {};\\n let urls = url.split(\\\"@\\\");\\n let picUrl = urls.shift();\\n let length = urls.length;\\n for (let i = 0; i < length; i++) {\\n let [key, value] = v.split(urls[i], \\\"=\\\");\\n if (key === \\\"headers\\\") {\\n try {\\n Object.assign(headers, JSON.parse(value));\\n } catch (e) {\\n log(e.toString());\\n }\\n } else if (key.includes(\\\".\\\") || key.includes(\\\"?\\\")) {\\n picUrl += \\\"@\\\" + key + (value ? \\\"=\\\" + value : \\\"\\\");\\n } else if (key !== \\\"js\\\") {\\n headers[key] = value;\\n }\\n }\\n return [picUrl, headers];\\n },\\n range(start, end) {\\n return Array(end - start).fill(0).map((el, i) => start + i);\\n },\\n picDownload(url, path, headers, deciphe) {\\n if (typeof deciphe === \\\"string\\\" && deciphe.length > 0) {\\n let instream;\\n let outstream;\\n let file;\\n try {\\n file = new java.io.File(path);\\n if (file.exists()) {\\n return;\\n }\\n let dir = file.getParentFile();\\n if (dir != null && !dir.exists()) {\\n dir.mkdirs();\\n }\\n instream = fetch(url, {\\n headers: headers,\\n inputStream: true\\n });\\n\\n outstream = new java.io.FileOutputStream(path);\\n let t = $.hiker.input,\\n c = $.hiker.url;\\n $.hiker.input = instream;\\n $.hiker.url = url;\\n let picin = (new Function(\\\"return \\\" + deciphe))();\\n $.hiker.input = t;\\n $.hiker.url = c;\\n let buf = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);\\n let len;\\n while ((len = picin.read(buf)) != -1) {\\n outstream.write(buf, 0, len);\\n }\\n closeMe(instream);\\n closeMe(outstream);\\n } catch (e) {\\n closeMe(instream);\\n closeMe(outstream);\\n if (file instanceof java.io.File && file.exists()) {\\n file.delete();\\n }\\n log(\\\"<解密下载Error>\\\" + e.toString())\\n throw e;\\n } finally {\\n closeMe(instream);\\n closeMe(outstream);\\n }\\n\\n } else {\\n requireDownload(url, path, headers);\\n }\\n },\\n textShield(text) {\\n let e = /#|:|&|\\\\||\\\\^|@|\\\\<|\\\\>|%|\\\\/|\\\\?/g;\\n return text.replace(e, \\\"_\\\");\\n }\\n \\n}\\n\\n$.exports = v;\"},{\"col_type\":\"movie_3\",\"name\":\"#v.主页面\",\"path\":\"Main.view\",\"rule\":\"js:\\nfunction main() {\\n var layout = [];\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n const Config = $.require(\\\"hiker://page/Config.js\\\");\\n let type = getMyVar(\\\".type\\\", getItem(\\\"main:type\\\", Config.def_Lord_Type));\\n let tgnum = getMyVar(\\\".tgnum\\\", \\\"0\\\");\\n addListener(\\\"onClose\\\", $.toString((MY_ID) => {\\n clearMyVar(\\\"searchKey\\\");\\n clearMyVar(\\\".tgnum\\\");\\n }));\\n layout.push({\\n title: type === \\\"comic\\\" ? \\\"◉漫画\\\" : \\\"○漫画\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((type) => {\\n if (type === \\\"comic\\\") return \\\"hiker://empty\\\";\\n putMyVar(\\\".type\\\", \\\"comic\\\");\\n setItem(\\\"main:type\\\", \\\"comic\\\");\\n clearMyVar(\\\".tgnum\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, type),\\n col_type: \\\"text_3\\\",\\n });\\n layout.push({\\n title: type === \\\"novel\\\" ? \\\"◉小说\\\" : \\\"○小说\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((type) => {\\n if (type === \\\"novel\\\") return \\\"hiker://empty\\\";\\n putMyVar(\\\".type\\\", \\\"novel\\\");\\n setItem(\\\"main:type\\\", \\\"novel\\\");\\n clearMyVar(\\\".tgnum\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, type),\\n col_type: \\\"text_3\\\",\\n });\\n layout.push({\\n title: type === \\\"txt\\\" ? \\\"◉整本小说\\\" : \\\"○整本小说\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((type) => {\\n if (type === \\\"txt\\\") return \\\"hiker://page/NovelCollected.view#noRecordHistory##noHistory#\\\";\\n putMyVar(\\\".type\\\", \\\"txt\\\");\\n setItem(\\\"main:type\\\", \\\"txt\\\");\\n clearMyVar(\\\".tgnum\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, type),\\n col_type: \\\"text_3\\\"\\n });\\n if (type === \\\"txt\\\") {\\n let txtView = $.require(\\\"hiker://page/externalimportTxt.view\\\");\\n return txtView(layout);\\n }\\n let tag = File.getFilePath(Config[type + \\\"Path\\\"], \\\"dir\\\");\\n if (tag.length === 0) {\\n layout.push({\\n col_type: \\\"line_blank\\\",\\n });\\n layout.push({\\n title: \\\"设置\\\",\\n url: \\\"hiker://page/Setting.view#noRefresh##noRecordHistory##noHistory#\\\",\\n col_type: \\\"text_2\\\",\\n extra: {\\n version: MY_RULE.version\\n }\\n });\\n\\n layout.push({\\n title: \\\"““帮助””\\\",\\n url: \\\"hiker://page/help.view#noRefresh##noRecordHistory##noHistory#?keyword=novelComic\\\",\\n col_type: \\\"text_2\\\"\\n });\\n layout.push({\\n title: '<h1 style=\\\"text-align: center;\\\">啥都没有耶</h1>',\\n col_type: \\\"rich_text\\\"\\n });\\n return setResult(layout);\\n }\\n layout.push({\\n url: '\\\"hiker://search?s=\\\"+input',\\n desc: \\\"搜你想要的#\\\" + type + \\\"#......\\\",\\n title: \\\"🔍\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n rules: $.toString((tag, type) => {\\n let arr1 = [];\\n for (let i = 0; i < tag.length; i++) {\\n arr1.push({\\n \\\"title\\\": tag[i].name,\\n \\\"search_url\\\": \\\"hiker://empty?isAll=1&searchTerms=**&type=\\\" + type,\\n \\\"searchFind\\\": \\\"js:$.require('hiker://page/Search.view?rule='+MY_RULE._title);\\\"\\n });\\n }\\n\\n return JSON.stringify(arr1);\\n }, tag, type),\\n defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"\\n }\\n });\\n\\n layout.push({\\n title: \\\"‘‘⚙设置’’\\\",\\n col_type: \\\"scroll_button\\\",\\n url: \\\"hiker://page/Setting.view#noRefresh##noRecordHistory##noHistory#\\\",\\n extra: {\\n version: MY_RULE.version\\n }\\n });\\n\\n\\n for (let i in tag) {\\n let it = tag[i];\\n if (tgnum === i) {\\n layout.push({\\n title: \\\"““\\\" + it.name + \\\"””\\\",\\n col_type: \\\"scroll_button\\\",\\n url: $([\\\"删除该目录\\\", \\\"跳转小程序\\\", \\\"打开书架\\\"], 1, \\\"选择操作\\\").select((it, type) => {\\n if (\\\"跳转小程序\\\" === input) {\\n return \\\"hiker://home@\\\" + it.name;\\n } else if(\\\"删除该目录\\\"===input){\\n //return then([\\\"该操作不会删除小程序,但该小程序下载的所有漫画将被删除\\\"]);\\n return $(\\\"该操作不会删除小程序,但该小程序下载的所有 漫画/小说 将被删除\\\").confirm((path) => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n clearMyVar(\\\".tgnum\\\");\\n refreshPage();\\n return \\\"toast://删除成功\\\";\\n } else {\\n return \\\"toast://删除失败\\\";\\n }\\n }, it.path);\\n }else{\\n return \\\"hiker://page/Bookrack.view?rule=本地资源管理&ruleName=\\\"+it.name+\\\"&type=\\\"+type;\\n }\\n }, it, type)\\n });\\n } else {\\n layout.push({\\n title: it.name,\\n col_type: \\\"scroll_button\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(i => {\\n putMyVar(\\\".tgnum\\\", i);\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }, i),\\n });\\n }\\n }\\n let path = tag[tgnum].path;\\n let mhlist = File.getFilePath(path, \\\"dir\\\");\\n\\n if (mhlist.length === 0) {\\n layout.push({\\n title: \\\"““””\\\" + \\\"啥都没有耶\\\".big(),\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n return setResult(layout);\\n }\\n let pageUrl = type === \\\"novel\\\" ? \\\"hiker://page/NovelBrowser.view\\\" : \\\"hiker://page/ComicBrowser.view\\\";\\n for (let item of mhlist) {\\n let pic = fileExist(\\\"file://\\\" + item.path + \\\"/\\\" + item.name + \\\".jpg\\\") ? item.path + \\\"/\\\" + item.name + \\\".jpg\\\" : Config.def_Pic;\\n layout.push({\\n title: item.name,\\n pic_url: pic,\\n url: type === \\\"novel\\\" ?pageUrl + \\\"?rule=\\\" + MY_RULE.title:$(\\\"#noLoading#\\\").lazyRule((pageUrl, path)=>{\\n return $.require(\\\"longPress.js\\\").singleEnter(pageUrl, path);\\n }, pageUrl, item.path),\\n extra: Object.assign(item, {\\n longClick: [{\\n title: \\\"删除\\\",\\n js: $.toString((path) => {\\n return $.require(\\\"longPress.js\\\").deleteFileForBook(path)\\n }, item.path)\\n }],\\n id: item.path\\n })\\n });\\n }\\n setResult(layout);\\n}\\n\\nmain();\"},{\"col_type\":\"text_1\",\"name\":\"#v.漫画章节列表\",\"path\":\"ComicBrowser.view\",\"rule\":\"js:\\nconst Tool = $.require(\\\"Tool.js\\\");\\nconst Config = $.require(\\\"Config.js\\\");\\nconst File = $.require(\\\"File.js\\\");\\nif (getParam(\\\"hasParams\\\") === \\\"true\\\") {\\n MY_PARAMS = {\\n path: decodeURIComponent(getParam(\\\"path\\\")),\\n name: decodeURIComponent(getParam(\\\"name\\\")),\\n bookName: decodeURIComponent(getParam(\\\"bookName\\\")),\\n ruleName: decodeURIComponent(getParam(\\\"ruleName\\\")),\\n comicStyle: getParam(\\\"comicStyle\\\")\\n }\\n}\\nlet path = MY_PARAMS.path;\\nif (!path) {\\n path = Config.comicPath + \\\"/\\\" + MY_PARAMS.ruleName + \\\"/\\\" + MY_PARAMS.bookName;\\n}\\nif (MY_PARAMS.comicStyle) {\\n Config.def_Comic_Style = MY_PARAMS.comicStyle;\\n}\\nsetPageTitle(\\\"CV|\\\" + (MY_PARAMS.name || File.getName(path)));\\n\\nvar layout = [];\\nlet mode = getMyVar(\\\".mode\\\", \\\"0\\\");\\nlet isReverse = getMyVar(\\\".isReverse\\\", \\\"0\\\");\\naddListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\".mode\\\");\\n clearMyVar(\\\".isReverse\\\");\\n}));\\nconst comicStatus = new Map([\\n [\\\"A\\\", \\\"\\\"],\\n [\\\"B\\\", \\\"‘‘[未完成]’’\\\"]\\n]);\\n\\nfunction getTitle(title) {\\n let titles = Tool.split(title, \\\"$\\\", 2);\\n return comicStatus.get(titles[1]) + titles[2] || title;\\n}\\n\\nfunction getTitle2(title) {\\n let titles = Tool.split(title, \\\"$\\\", 2);\\n return titles[2] || title;\\n}\\nlayout.push({\\n title: \\\"删除整本\\\",\\n url: $(\\\"确认删除整本漫画?\\\").confirm((path) => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n back();\\n return \\\"toast://删除成功\\\";\\n } else {\\n return \\\"toast://删除失败\\\";\\n }\\n }, path),\\n col_type: \\\"text_2\\\"\\n});\\nlayout.push({\\n title: [\\\"看漫画\\\", \\\"删除章节\\\"][mode],\\n url: $(\\\"#noLoading#\\\").lazyRule((mode) => {\\n putMyVar(\\\".mode\\\", mode === \\\"0\\\" ? \\\"1\\\" : \\\"0\\\");\\n refreshPage(true);\\n return \\\"hiker://empty\\\"\\n }, mode),\\n col_type: \\\"text_2\\\"\\n});\\nlayout.push({\\n col_type: \\\"line_blank\\\"\\n})\\nlet mhlist = File.getFilePath(path, \\\"dir\\\");\\nmhlist.sort((a, b) => {\\n a = (a.name.match(/\\\\d+/) || [])[0] || 0;\\n b = (b.name.match(/\\\\d+/) || [])[0] || 0;\\n return a - b;\\n});\\n\\nlayout.push({\\n title: \\\"““””\\\" + \\\"章节 \\\".big() + (\\\"共有:\\\" + mhlist.length + \\\"章\\\").small(),\\n url: $(\\\"#noLoading#\\\").lazyRule((isReverse) => {\\n putMyVar(\\\".isReverse\\\", isReverse === \\\"0\\\" ? \\\"1\\\" : \\\"0\\\");\\n refreshPage(true);\\n return \\\"hiker://empty\\\"\\n }, isReverse),\\n col_type: \\\"text_1\\\"\\n});\\nlet array = [];\\n\\nif (mode === \\\"0\\\") {\\n if (Config.def_isComicCompatible === \\\"0\\\") {\\n let lazy = $(\\\"#noLoading#\\\").lazyRule(() => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n let filelist = File.getFilePath(input);\\n let shorten = input.replace(getPath(\\\"hiker://files/\\\").slice(7), \\\"hiker://files/\\\");\\n let piclist = filelist.map((item, i) => shorten + \\\"/\\\" + (i + 1) + \\\".jpg\\\");\\n return \\\"pics://\\\" + piclist.join(\\\"&&\\\");\\n });\\n for (let item of mhlist) {\\n let title = getTitle(item.name);\\n array.push({\\n title: title,\\n url: item.path + lazy,\\n col_type: Config.def_Comic_Style,\\n pic_url: item.path + \\\"/1.jpg\\\"\\n });\\n }\\n } else {\\n for (let item of mhlist) {\\n let title = getTitle(item.name);\\n array.push({\\n title: title,\\n url: \\\"hiker://page/comicCompatible.view#autoPage##readTheme#?path=\\\" + encodeURIComponent(item.path),\\n col_type: Config.def_Comic_Style,\\n pic_url: item.path + \\\"/1.jpg\\\",\\n extra: {\\n path: item.path,\\n title: getTitle2(item.name)\\n }\\n });\\n }\\n }\\n\\n} else {\\n for (let item of mhlist) {\\n let name = getTitle2(item.name);\\n array.push({\\n title: name,\\n url: $(\\\"确认删除[\\\" + name + \\\"]?\\\").confirm((path) => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n refreshPage(true);\\n return \\\"toast://删除成功\\\";\\n } else {\\n return \\\"toast://删除失败\\\";\\n }\\n }, item.path),\\n col_type: Config.def_Comic_Style,\\n pic_url: item.path + \\\"/1.jpg\\\"\\n });\\n }\\n}\\nif (isReverse === \\\"1\\\") {\\n array.reverse();\\n}\\nlayout.push.apply(layout, array);\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#v.聚合搜索\",\"path\":\"Search.view\",\"rule\":\"js:\\nconst File = $.require(\\\"hiker://page/File.js?rule=\\\" + MY_RULE._title);\\nconst Config = $.require(\\\"hiker://page/Config.js?rule=\\\" + MY_RULE._title);\\nlet comicRuleDirs = File.getFilePath(Config[getParam(\\\"type\\\") + \\\"Path\\\"], \\\"dir\\\");\\nif (getParam(\\\"isAll\\\") === \\\"1\\\") {\\n comicRuleDirs = comicRuleDirs.filter(item => item.name === MY_RULE.title);\\n}\\n\\nlet searchResult = [];\\nlet searchTerms= getParam(\\\"searchTerms\\\");\\nlet searchTest;\\n\\nif (!getSearchMode()) {\\n let termsArr = searchTerms.split(\\\"\\\").map(t => t.replace(/\\\\*|\\\\.|\\\\?|\\\\+|\\\\$|\\\\^|\\\\[|\\\\]|\\\\(|\\\\)|\\\\{|\\\\}|\\\\||\\\\/|\\\\\\\\/g, k => \\\"\\\\\\\\\\\" + k));\\n let reg = new RegExp(termsArr.join(\\\".*\\\"), \\\"i\\\");\\n searchTest = text => reg.test(text);\\n} else {\\n searchTest = text => searchContains(text, searchTerms, false);\\n}\\n\\nlet pageUrl = getParam(\\\"type\\\") === \\\"novel\\\" ? \\\"hiker://page/NovelBrowser.view\\\" : \\\"hiker://page/ComicBrowser.view\\\";\\nfor (let sonDir of comicRuleDirs) {\\n let comicList = File.getFilePath(sonDir.path, \\\"dir\\\");\\n for (let comic of comicList) {\\n if (searchTest(comic.name)) {\\n searchResult.push({\\n title: comic.name,\\n pic_url: comic.path + \\\"/\\\" + comic.name + \\\".jpg\\\",\\n url: pageUrl + \\\"?rule=\\\" + MY_RULE._title,\\n desc: sonDir.name,\\n extra: comic\\n });\\n }\\n }\\n\\n}\\nsetResult(searchResult);\"},{\"col_type\":\"movie_3\",\"name\":\"#v.设置\",\"path\":\"Setting.view\",\"rule\":\"js:\\nsetPageTitle(MY_RULE.title + \\\"|设置\\\");\\nconst Config = $.require(\\\"hiker://page/Config.js\\\");\\n\\nlet layout = [];\\n\\nlayout.push({\\n title: \\\"<strong>基础设置</strong>\\\".big(),\\n col_type: \\\"rich_text\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\n\\nlayout.push({\\n title: \\\"目录路径\\\",\\n url: \\\"hiker://page/Setting/More.view#noRefresh##noRecordHistory##noHistory#?settingType=contents\\\",\\n desc: Config.homePath,\\n col_type: \\\"text_1\\\"\\n});\\nlayout.push({\\n title: \\\"设置默认封面\\\",\\n desc: Config.def_Pic,\\n url: \\\"hiker://page/Setting/More.view#noRefresh##noRecordHistory##noHistory#?settingType=defaultPic\\\",\\n col_type: \\\"text_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n});\\nlayout.push({\\n col_type: \\\"line_blank\\\"\\n});\\nlayout.push({\\n title: \\\"<strong>下载器设置</strong>\\\".big(),\\n col_type: \\\"rich_text\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\n\\nfunction setNum(key, test) {\\n let Config = JSON.parse(readFile(\\\"config.json\\\", 0) || \\\"{}\\\");\\n input = parseInt(input);\\n if (Number.isNaN(input)) return \\\"toast://请输入数字\\\";\\n if (!test(input)) return \\\"toast://不符合条件\\\";\\n Config[key] = input;\\n saveFile(\\\"config.json\\\", JSON.stringify(Config), 0);\\n refreshPage(false);\\n return \\\"toast://修改成功\\\";\\n}\\nlayout.push({\\n title: \\\"log数\\\",\\n url: $(Config.logNum, \\\"0<N<100\\\").input(setNum, \\\"logNum\\\", it => it > 0 && it < 100),\\n desc: \\\"\\\" + Config.logNum,\\n col_type: \\\"text_1\\\"\\n});\\n\\nlayout.push({\\n title: \\\"分批下载数(0不开启)\\\",\\n url: $(\\\"\\\" + Config.threadNum, \\\"N>-1\\\").input(setNum, \\\"threadNum\\\", it => it > -1),\\n desc: \\\"\\\" + Config.threadNum,\\n col_type: \\\"text_1\\\",\\n extra: {\\n lineVisible: false,\\n }\\n});\\n\\n\\nlayout.push({\\n col_type: \\\"line_blank\\\"\\n});\\n\\nlayout.push({\\n title: \\\"<strong>小说阅读器设置</strong>\\\".big(),\\n col_type: \\\"rich_text\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\n\\nlayout.push({\\n title: \\\"默认开启分页阅读\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((def_isPaginate) => {\\n let Config = JSON.parse(readFile(\\\"config.json\\\", 0) || \\\"{}\\\");\\n\\n Config.def_isPaginate = def_isPaginate === \\\"0\\\" ? \\\"1\\\" : \\\"0\\\";\\n\\n saveFile(\\\"config.json\\\", JSON.stringify(Config), 0);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, Config.def_isPaginate),\\n desc: Config.def_isPaginate === \\\"0\\\" ? \\\"不开启\\\" : \\\"开启\\\",\\n col_type: \\\"text_1\\\"\\n});\\n\\nlayout.push({\\n title: \\\"每页最大章数\\\",\\n url: $(Config.viewPageSize, \\\"30<N<500\\\").input(setNum, \\\"viewPageSize\\\", it => it > 30 && it < 500),\\n desc: \\\"\\\" + Config.viewPageSize,\\n col_type: \\\"text_1\\\"\\n});\\nlayout.push({\\n title: \\\"替换规则\\\",\\n url: \\\"hiker://page/Setting/More.view#noRecordHistory##noHistory##noRefresh#?settingType=replaceRule\\\",\\n col_type: \\\"text_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n});\\n\\nlayout.push({\\n col_type: \\\"line_blank\\\"\\n});\\nlayout.push({\\n title: \\\"<strong>漫画阅读器设置</strong>\\\".big(),\\n col_type: \\\"rich_text\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n title: \\\"兼容模式\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((def_isComicCompatible) => {\\n let Config = JSON.parse(readFile(\\\"config.json\\\", 0) || \\\"{}\\\");\\n\\n Config.def_isComicCompatible = def_isComicCompatible === \\\"0\\\" ? \\\"1\\\" : \\\"0\\\";\\n\\n saveFile(\\\"config.json\\\", JSON.stringify(Config), 0);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, Config.def_isComicCompatible),\\n desc: Config.def_isComicCompatible === \\\"0\\\" ? \\\"不开启\\\" : \\\"开启\\\",\\n col_type: \\\"text_1\\\"\\n});\\nlayout.push({\\n title: \\\"漫画列表样式\\\",\\n url: $([\\\"text_1\\\", \\\"avatar\\\", \\\"pic_3\\\", \\\"pic_3_square\\\", \\\"movie_3_marquee\\\"], 1, \\\"请选择漫画列表显示样式\\\").select(() => {\\n let Config = JSON.parse(readFile(\\\"config.json\\\", 0) || \\\"{}\\\");\\n Config.def_Comic_Style = input;\\n saveFile(\\\"config.json\\\", JSON.stringify(Config), 0);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, Config.def_Comic_Style),\\n desc: Config.def_Comic_Style||\\\"\\\",\\n col_type: \\\"text_1\\\"\\n});\\nlayout.push({\\n col_type: \\\"line_blank\\\"\\n});\\nlayout.push({\\n title: \\\"<strong>其他设置</strong>\\\".big(),\\n col_type: \\\"rich_text\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n title: \\\"规则发布页\\\",\\n url: \\\"hiker://page/ruleDetail#noHistory##noRecordHistory#?rule=道长仓库Pro\\\",\\n extra: {\\n lver: MY_PARAMS.version || \\\"获取版本失败,自行查看\\\",\\n id: \\\"3559\\\"\\n },\\n col_type: \\\"text_1\\\"\\n});\\n\\nlayout.push({\\n title: \\\"恢复默认设置\\\",\\n url: $(\\\"确认恢复默认设置?\\\").confirm(() => {\\n deleteFile(\\\"config.json\\\");\\n refreshPage(false);\\n return \\\"toast://恢复完成\\\";\\n }),\\n col_type: \\\"text_1\\\"\\n});\\nlayout.push({\\n title: \\\"清理缓存\\\",\\n url: \\\"hiker://page/Setting/More.view#noRecordHistory##noHistory#?settingType=cache\\\",\\n col_type: \\\"text_1\\\"\\n});\\nlayout.push({\\n title: \\\"文件管理\\\",\\n url: \\\"hiker://page/FileManagement.view#noRefresh##noRecordHistory##noHistory#\\\",\\n col_type: \\\"text_1\\\"\\n});\\nlet tid = Date.now();\\nlayout.push({\\n title: \\\"检测更新\\\",\\n col_type: \\\"text_1\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((oldVersion, tid) => {\\n try {\\n let newVersion = JSON.parse(request(\\\"http://hiker.nokia.press/hikerule/dev/getbyid?id=3559\\\", {\\n timeout: 2000\\n })).result.ver;\\n if (newVersion <= oldVersion) {\\n updateItem(tid + \\\"#设置_更新\\\", {\\n title: \\\"已经是最新版本了\\\"\\n });\\n return \\\"toast://已经是最新版本了\\\";\\n } else {\\n updateItem(tid + \\\"#设置_更新\\\", {\\n title: \\\"有新版本还未更新\\\"\\n });\\n toast(\\\"有新版本还未更新\\\");\\n return \\\"rule://5rW36ZiU6KeG55WM77+laG9tZV9ydWxlX3VybO+/pWh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTM1NTk=\\\";\\n }\\n } catch (e) {\\n updateItem(tid + \\\"#设置_更新\\\", {\\n title: \\\"信息获取失败\\\"\\n });\\n return \\\"toast://更新信息获取失败\\\";\\n }\\n }, MY_PARAMS.version, tid),\\n extra: {\\n id: tid + \\\"#设置_更新\\\"\\n }\\n});\\nlayout.push({\\n title: \\\"关于如何调用\\\",\\n url: \\\"mqqapi://forward/url?src_type=web&style=default&plg_auth=1&version=1&url_prefix=aHR0cHM6Ly9xdW4ucXEuY29tL3Fxd2ViL3F1bnByby9zaGFyZT9fd3Y9MyZfd3d2PTEyOCZpbnZpdGVDb2RlPTFIRnlCSiZmcm9tPTI0NjYxMCZiaXo9a2EjL291dA==\\\",\\n desc: \\\"详细点击加入频道(快来华山与我论[ji]剑)\\\",\\n col_type: \\\"text_1\\\"\\n});\\nlayout.push({\\n title: \\\"问题反馈\\\",\\n url: \\\"mqqapi://forward/url?src_type=web&style=default&plg_auth=1&version=1&url_prefix=aHR0cHM6Ly9xdW4ucXEuY29tL3Fxd2ViL3F1bnByby9zaGFyZT9fd3Y9MyZfd3d2PTEyOCZhcHBDaGFubmVsPXNoYXJlJmludml0ZUNvZGU9MVhOYWxBRXl2VmomY29udGVudElEPWMzbElQJmJ1c2luZXNzVHlwZT0yJmZyb209MTgxMDc0JmJpej1rYSZtYWluU291cmNlSWQ9c2hhcmUmc3ViU291cmNlSWQ9b3RoZXJzJmp1bXBzb3VyY2U9c2hvcnR1cmw=&t=1671893123597#Intent;scheme=mqqapi;package=com.tencent.mobileqq;end\\\",\\n desc: \\\"绝对不会有bug(啊我不接受!)\\\",\\n col_type: \\\"text_1\\\"\\n});\\n/*\\nlayout.push({\\n title: \\\"清除小说分页记录\\\",\\n url: $(\\\"确认清除小说分页记录?\\\").confirm(() => {\\n deleteFile(\\\"novelFootprint.json\\\");\\n return \\\"toast://清除完成\\\";\\n }),\\n col_type: \\\"text_1\\\"\\n});\\n*/\\nsetResult(layout);\"},{\"col_type\":\"text_1\",\"name\":\"#v.小说章节列表\",\"path\":\"NovelBrowser.view\",\"rule\":\"js:\\nif (getParam(\\\"hasParams\\\") === \\\"true\\\") {\\n MY_PARAMS = {\\n path: decodeURIComponent(getParam(\\\"path\\\")),\\n name: decodeURIComponent(getParam(\\\"name\\\"))\\n }\\n}\\nlet path = MY_PARAMS.path;\\nsetPageTitle(\\\"NV|\\\" + MY_PARAMS.name);\\nconst File = $.require(\\\"hiker://page/File.js\\\");\\nconst Tool = $.require(\\\"hiker://page/Tool.js\\\");\\nconst Config = $.require(\\\"hiker://page/Config.js\\\");\\nconst bookInfo = Object.assign({\\n foot: 0,\\n isReplace: true,\\n isSegment: true\\n}, JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\"));\\nlet id = \\\"#\\\" + new Date().getTime();\\nvar layout = [];\\nlet mode = getMyVar(\\\".mode\\\", \\\"0\\\");\\nlet mode2 = getMyVar(\\\".mode2\\\", Config.def_isPaginate);\\n\\nlet isReverse = getMyVar(\\\".isReverse\\\", \\\"0\\\");\\naddListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\".mode\\\");\\n clearMyVar(\\\".mode2\\\");\\n clearMyVar(\\\".isReverse\\\");\\n clearMyVar(\\\".pageNum\\\");\\n}));\\n\\nfunction getTitle(title) {\\n let titles = Tool.split(title, \\\"$\\\", 2);\\n return titles[2] !== undefined ? titles[2].slice(0, titles[2].lastIndexOf(\\\".\\\")) : title;\\n}\\nlayout.push({\\n title: \\\"删除整本\\\",\\n url: $(\\\"确认删除整本小说?\\\").confirm((path) => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n back();\\n return \\\"toast://删除成功\\\";\\n } else {\\n return \\\"toast://删除失败\\\";\\n }\\n }, path),\\n col_type: \\\"text_2\\\"\\n});\\n\\nlayout.push({\\n title: [\\\"看小说\\\", \\\"删除章节\\\"][mode],\\n url: $(\\\"#noLoading#\\\").lazyRule((mode) => {\\n putMyVar(\\\".mode\\\", mode === \\\"0\\\" ? \\\"1\\\" : \\\"0\\\");\\n refreshPage(true);\\n return \\\"hiker://empty\\\"\\n }, mode),\\n col_type: \\\"text_2\\\"\\n});\\n\\nlayout.push({\\n title: \\\"‘‘更多功能 >’’\\\",\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"scroll_button\\\"\\n});\\n\\nfunction txt(paths) {\\n showLoading(\\\"正在合并...\\\");\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n const Tool = $.require(\\\"hiker://page/Tool.js\\\");\\n const Config = $.require(\\\"hiker://page/Config.js\\\");\\n\\n let filelist = File.getFilePath(paths.path, \\\"file\\\", \\\".txt\\\");\\n let listLength = filelist.length;\\n if (listLength === 0) {\\n hideLoading();\\n return \\\"toast://空的章节\\\";\\n }\\n const bookInfo = Object.assign({\\n selected: [],\\n isReplace: true\\n }, JSON.parse(request(\\\"file://\\\" + paths.path + \\\"/bookInfo.json\\\") || \\\"{}\\\"));\\n let bufilelist = [];\\n for (let i = 0; i < listLength; i++) {\\n let file = filelist[i];\\n let fileInfo = Tool.split(file.name, \\\"$\\\", 2);\\n bufilelist.push({\\n name: fileInfo[2].slice(0, fileInfo[2].lastIndexOf(\\\".\\\")),\\n path: \\\"file://\\\" + file.path,\\n id: Number(fileInfo[0]) || 0\\n });\\n }\\n bufilelist.sort((a, b) => a.id - b.id);\\n let entirePath = paths.path.replace(Config.novelPath, Config.novelFullPath) + \\\".txt\\\";\\n let entirePathto = bookInfo.isReplace ? entirePath + \\\".tmp\\\" : entirePath;\\n\\n if (fileExist(\\\"file://\\\" + entirePath)) {\\n toast(\\\"初始化文件\\\");\\n if (!File.deleteFiles(entirePath)) {\\n hideLoading();\\n return \\\"toast://初始化失败\\\";\\n } else {\\n toast(\\\"初始化成功\\\");\\n }\\n }\\n\\n for (let i = 0; i < listLength; i++) {\\n let item = bufilelist[i];\\n let content = request(item.path);\\n File.fileWriteAppend(entirePathto, item.name + \\\"\\\\n  \\\" + content.replace(/&nbsp;/g,\\\"\\\").split(/(\\\\n|\\\\r)+/).filter(it => it.trim().length > 1).map(it=>it.trim()).join(\\\"\\\\r  \\\") + \\\"\\\\n\\\\n\\\");\\n }\\n if (bookInfo.isReplace) {\\n let ruleList = JSON.parse(readFile(\\\"replaceRule.json\\\") || \\\"[]\\\");\\n let len = ruleList.length;\\n let replacePattern = [\\\"replace\\\", \\\"replaceAll\\\"];\\n let flag = File.fileRule(entirePathto, entirePath, (javaString) => {\\n for (let i = 0; i < len; i++) {\\n let replaceRule = ruleList[i];\\n if (!bookInfo.selected.includes(replaceRule.id)) {\\n continue;\\n }\\n let replace = replacePattern[0 + replaceRule.isRegex];\\n javaString = javaString[replace](replaceRule.pattern, replaceRule.replacement);\\n }\\n return javaString.getBytes();\\n });\\n if (!flag) {\\n hideLoading();\\n return \\\"toast://合并失败\\\";\\n }\\n\\n }\\n hideLoading();\\n return \\\"toast://合并完成\\\";\\n}\\nlayout.push({\\n title: \\\"合并小说\\\",\\n url: $(\\\"确定合并?\\\\n会覆盖已有TXT\\\").confirm(txt, MY_PARAMS),\\n col_type: \\\"scroll_button\\\"\\n});\\nlayout.push({\\n title: [\\\"☐分页\\\", \\\"☑分页\\\"][mode2],\\n url: $(\\\"#noLoading#\\\").lazyRule((mode2) => {\\n putMyVar(\\\".mode2\\\", mode2 === \\\"0\\\" ? \\\"1\\\" : \\\"0\\\");\\n refreshPage(true);\\n return \\\"hiker://empty\\\";\\n }, mode2),\\n col_type: \\\"scroll_button\\\"\\n});\\nlayout.push({\\n title: [\\\"☐分段\\\", \\\"☑分段\\\"][Number(bookInfo.isSegment)],\\n url: $(\\\"#noLoading#\\\").lazyRule((isSegment, path) => {\\n const bookInfo = JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\");\\n bookInfo.isSegment = !isSegment;\\n writeFile(\\\"file://\\\" + path+\\\"/bookInfo.json\\\", JSON.stringify(bookInfo));\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, bookInfo.isSegment, path),\\n col_type: \\\"scroll_button\\\"\\n});\\nlayout.push({\\n title: \\\"净化\\\",\\n url: \\\"hiker://page/NovelCustom.view#noRecordHistory##noHistory##noRefresh#\\\",\\n extra: MY_PARAMS,\\n col_type: \\\"scroll_button\\\"\\n});\\nlayout.push({\\n title: \\\"外部查看\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((path) => {\\n const Config = $.require(\\\"hiker://page/Config.js\\\");\\n let entirePath = path.replace(Config.novelPath, Config.novelFullPath) + \\\".txt\\\";\\n if (fileExist(\\\"file://\\\" + entirePath)) {\\n toast(\\\"调用第三方应用打开文件\\\");\\n return \\\"openFile://file://\\\" + entirePath\\n } else {\\n return \\\"toast://本地暂无可供外部打开的txt文件,请先合并小说!\\\"\\n }\\n }, path),\\n col_type: \\\"scroll_button\\\"\\n});\\nlayout.push({\\n col_type: \\\"line_blank\\\"\\n});\\n\\nlet mhlist = File.getFilePath(path, \\\"file\\\", \\\".txt\\\");\\nmhlist.sort((a, b) => {\\n a = (a.name.match(/\\\\d+/) || [])[0] || 0;\\n b = (b.name.match(/\\\\d+/) || [])[0] || 0;\\n return a - b;\\n});\\nlet chapterList = [];\\nlet chapterCount = mhlist.length;\\n\\nif (mode2 === \\\"1\\\") {\\n let mhlistChunk = Tool.chunk(mhlist, Config.viewPageSize);\\n let viewPageCount = mhlistChunk.length;\\n let defPage = (viewPageCount - 1 < bookInfo.foot ? 0 : bookInfo.foot) || 0;\\n let pageNum = Number(getMyVar(\\\".pageNum\\\", \\\"\\\" + defPage));\\n chapterList = mhlistChunk[pageNum] || [];\\n layout.push({\\n title: \\\"““””\\\" + \\\"章节 \\\".big() + (\\\"本页:\\\" + chapterList.length + \\\" 共有:\\\" + chapterCount + \\\"章 当前:\\\" + (pageNum + 1) + \\\"/\\\" + viewPageCount).small(),\\n url: $(\\\"#noLoading#\\\").lazyRule((isReverse) => {\\n putMyVar(\\\".isReverse\\\", isReverse === \\\"0\\\" ? \\\"1\\\" : \\\"0\\\");\\n refreshPage(true);\\n return \\\"hiker://empty\\\"\\n }, isReverse),\\n col_type: \\\"text_1\\\"\\n });\\n layout.push({\\n title: \\\"跳集\\\",\\n url: $(chapterCount, \\\"输入跳转章节 1-\\\" + chapterCount).input((chapterCount, pageNum, viewPageSize, path) => {\\n let inputNum = Number(input);\\n if (Number.isNaN(inputNum) || inputNum < 0 || inputNum > chapterCount) {\\n return \\\"toast://请输入正确范围内的数字\\\";\\n }\\n inputNum = Math.floor((inputNum + viewPageSize) / viewPageSize) - 1;\\n if (pageNum === inputNum) return \\\"toast://正在当前页面\\\";\\n putMyVar(\\\".pageNum\\\", \\\"\\\" + inputNum);\\n const bookInfo = JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\");\\n bookInfo.foot = inputNum;\\n writeFile(\\\"file://\\\" + path, JSON.stringify(bookInfo));\\n refreshPage(false);\\n }, chapterCount, pageNum, Config.viewPageSize, path),\\n col_type: \\\"text_5\\\"\\n });\\n layout.push({\\n title: \\\"跳页\\\",\\n url: $(pageNum + 1, \\\"跳转页数 1-\\\" + viewPageCount).input((viewPageCount, pageNum, path) => {\\n let inputNum = Number(input) - 1;\\n if (Number.isNaN(inputNum) || inputNum < 0 || inputNum > viewPageCount - 1) {\\n return \\\"toast://请输入正确范围内的数字\\\";\\n }\\n if (pageNum === inputNum) return \\\"toast://正在当前页面\\\";\\n putMyVar(\\\".pageNum\\\", \\\"\\\" + inputNum);\\n const bookInfo = JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\");\\n bookInfo.foot = inputNum;\\n writeFile(\\\"file://\\\" + path + \\\"/bookInfo.json\\\", JSON.stringify(bookInfo));\\n refreshPage(false);\\n }, viewPageCount, pageNum, path),\\n col_type: \\\"text_5\\\"\\n });\\n layout.push({\\n title: \\\"上一页\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((pageNum, path) => {\\n let inputNum = pageNum - 1;\\n if (inputNum < 0) {\\n return \\\"toast://已经是第一页了\\\";\\n }\\n putMyVar(\\\".pageNum\\\", \\\"\\\" + inputNum);\\n const bookInfo = JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\");\\n bookInfo.foot = inputNum;\\n writeFile(\\\"file://\\\" + path + \\\"/bookInfo.json\\\", JSON.stringify(bookInfo));\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, pageNum, path),\\n col_type: \\\"text_5\\\"\\n });\\n layout.push({\\n title: \\\"下一页\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((viewPageCount, pageNum, path) => {\\n let inputNum = pageNum + 1;\\n if (inputNum > viewPageCount - 1) {\\n return \\\"toast://已经是最后一页了\\\";\\n }\\n putMyVar(\\\".pageNum\\\", \\\"\\\" + inputNum);\\n const bookInfo = JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\");\\n bookInfo.foot = inputNum;\\n writeFile(\\\"file://\\\" + path + \\\"/bookInfo.json\\\", JSON.stringify(bookInfo));\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, viewPageCount, pageNum, path),\\n col_type: \\\"text_5\\\"\\n });\\n layout.push({\\n title: \\\"末页\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((viewPageCount, pageNum, path) => {\\n let inputNum = viewPageCount - 1;\\n if (pageNum === inputNum || inputNum === -1) {\\n return \\\"toast://已经是最后一页了\\\";\\n }\\n putMyVar(\\\".pageNum\\\", \\\"\\\" + inputNum);\\n const bookInfo = JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\");\\n bookInfo.foot = inputNum;\\n writeFile(\\\"file://\\\" + path + \\\"/bookInfo.json\\\", JSON.stringify(bookInfo));\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, viewPageCount, pageNum, path),\\n col_type: \\\"text_5\\\"\\n });\\n} else {\\n chapterList = mhlist;\\n layout.push({\\n title: \\\"““””\\\" + \\\"章节 \\\".big() + (\\\"共有:\\\" + chapterCount + \\\"章\\\").small(),\\n url: $(\\\"#noLoading#\\\").lazyRule((isReverse) => {\\n putMyVar(\\\".isReverse\\\", isReverse === \\\"0\\\" ? \\\"1\\\" : \\\"0\\\");\\n refreshPage(true);\\n return \\\"hiker://empty\\\"\\n }, isReverse),\\n col_type: \\\"text_1\\\"\\n });\\n}\\nlet array = [];\\nif (mode === \\\"0\\\") {\\n for (let item of chapterList) {\\n let name = getTitle(item.name);\\n array.push({\\n title: name,\\n url: \\\"hiker://page/NovelMainBody#autoPage##readTheme#\\\",\\n extra: {\\n path: item.path,\\n dirPath: path,\\n title: name,\\n },\\n col_type: Config.def_View_Style\\n });\\n }\\n} else {\\n for (let item of chapterList) {\\n let name = getTitle(item.name);\\n array.push({\\n title: name,\\n url: $(\\\"确认删除[\\\" + name + \\\"]?\\\").confirm((path) => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n refreshPage(true);\\n return \\\"toast://删除成功\\\";\\n } else {\\n return \\\"toast://删除失败\\\";\\n }\\n }, item.path),\\n col_type: Config.def_View_Style\\n });\\n }\\n}\\nif (isReverse === \\\"1\\\") {\\n array.reverse();\\n}\\nlayout.push.apply(layout, array);\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#v.小说正文阅读\",\"path\":\"NovelMainBody\",\"rule\":\"js:\\nvar layout = [];\\nlet content = request(\\\"file://\\\" + MY_PARAMS.path);\\n//content = content.replace(/\\\\n|\\\\r/g, \\\"<br>\\\").replace(/(&nbsp;)+/g,\\\" \\\");\\nconst bookInfo = Object.assign({\\n selected: [],\\n isReplace: false,\\n isSegment: true,\\n}, JSON.parse(request(\\\"file://\\\" + MY_PARAMS.dirPath + \\\"/bookInfo.json\\\") || \\\"{}\\\"));\\n\\nif (bookInfo.isReplace) {\\n let javaString = java.lang.String(content);\\n let ruleList = JSON.parse(readFile(\\\"replaceRule.json\\\") || \\\"[]\\\");\\n let replacePattern = [\\\"replace\\\", \\\"replaceAll\\\"];\\n for (let i = 0, len = ruleList.length; i < len; i++) {\\n let replaceRule = ruleList[i];\\n if (!bookInfo.selected.includes(replaceRule.id)) {\\n continue;\\n }\\n let replace = replacePattern[0 + replaceRule.isRegex];\\n javaString = javaString[replace](replaceRule.pattern, replaceRule.replacement);\\n }\\n content = String(javaString);\\n}\\nif (bookInfo.isSegment) {\\n content = \\\"  \\\" + content.split(/(\\\\n|\\\\r)+/).filter(it => it.trim().length > 1).map(it => it.trim()).join(\\\"<br>  \\\");\\n}\\nlayout.push({\\n col_type: \\\"rich_text\\\",\\n title: (\\\"<strong>\\\" + MY_PARAMS.title + \\\"</strong>\\\").big(),\\n});\\n\\nlayout.push({\\n title: content,\\n col_type: 'rich_text',\\n extra: {\\n textSize: 18,\\n click: true\\n }\\n});\\nsetResult(layout);\"},{\"col_type\":\"text_1\",\"name\":\"#v.合并TXT\",\"path\":\"NovelCollected.view\",\"rule\":\"js:\\nconst File = $.require(\\\"hiker://page/File.js\\\");\\nconst Config = $.require(\\\"hiker://page/Config.js\\\");\\nlet rulelDir = File.getFilePath(Config.novelFullPath, \\\"dir\\\");\\nsetPageTitle(\\\"合并TXT\\\");\\nlet layout = [];\\n\\nfunction operation(path) {\\n switch (input) {\\n case \\\"分享\\\":\\n return \\\"share://\\\" + path;\\n break;\\n case \\\"删除\\\":\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n refreshPage();\\n return \\\"toast://删除成功\\\";\\n } else {\\n return \\\"toast://删除失败\\\";\\n }\\n break;\\n case \\\"海阔预览\\\":\\n return \\\"hiker://page/txtParser.view\\\";\\n break;\\n case \\\"打开方式\\\":\\n return \\\"openFile://file://\\\" + path;\\n break;\\n }\\n}\\nfor (let rulePaths of rulelDir) {\\n let novels = File.getFilePath(rulePaths.path, \\\"file\\\", \\\".txt\\\");\\n for (let novel of novels) {\\n layout.push({\\n title: novel.name,\\n url: $([\\\"分享\\\", \\\"删除\\\", \\\"海阔预览\\\", \\\"打开方式\\\"], 1).select(operation, novel.path),\\n desc: \\\"来源:\\\" + rulePaths.name,\\n col_type: \\\"text_1\\\",\\n extra: {\\n path: novel.path\\n }\\n });\\n }\\n}\\nif (layout.length === 0) {\\n layout.push({\\n title: '<h1 style=\\\"text-align: center;\\\">啥都没有耶</h1>',\\n col_type: \\\"rich_text\\\"\\n });\\n}\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#v.更多设置\",\"path\":\"Setting/More.view\",\"rule\":\"js:\\nconst File = $.require(\\\"hiker://page/File.js\\\");\\nconst Config = $.require(\\\"hiker://page/Config.js\\\");\\n\\nconst settingType = MY_PARAMS.settingType || getParam(\\\"settingType\\\");\\n\\nlet layout = [];\\nlet id = \\\"#\\\" + new Date().getTime();\\nswitch (settingType) {\\n case \\\"cache\\\":\\n setPageTitle(\\\"清除缓存|设置\\\");\\n const knownList = new Map([\\n [File.getName(Config.novelPath), \\\"#管理器#小说缓存目录[不建议清除]\\\"],\\n [File.getName(Config.comicPath), \\\"#管理器#漫画缓存目录[不建议清除]\\\"],\\n [File.getName(Config.externalImportPath), \\\"#管理器#导入的TXT目录[不建议清除]\\\"],\\n [File.getName(Config.novelFullPath), \\\"#管理器#小说合并目录[可以清除]\\\"],\\n [\\\"dr章节缓存\\\", \\\"道长模板临时缓存[建议清除]\\\"]\\n ]);\\n\\n let cacheDir = File.getFilePath(Config.homePath, \\\"dir\\\");\\n\\n function cleanCache(path) {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n refreshPage(false);\\n return \\\"toast://清除完成\\\";\\n } else {\\n return \\\"toast://清除失败\\\";\\n }\\n }\\n for (let cache of cacheDir) {\\n layout.push({\\n title: cache.name,\\n desc: \\\"大小:\\\" + File.getFileSize(cache.path) + \\\"\\\\n描述:\\\" + (knownList.get(cache.name) || \\\"未知目录[风险未知]\\\"),\\n col_type: \\\"text_1\\\",\\n url: $(\\\"确认清除 \\\" + cache.name + \\\" ?\\\").confirm(cleanCache, cache.path)\\n });\\n }\\n layout.push({\\n col_type: \\\"line_blank\\\"\\n });\\n layout.push({\\n title: \\\"全部清除(\\\" + File.getFileSize(Config.homePath) + \\\")\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(\\\"确认清除全部缓存数据?\\\").confirm(cleanCache, Config.homePath)\\n });\\n break;\\n case \\\"defaultPic\\\":\\n setPageTitle(\\\"默认封面|设置\\\");\\n if (getMyVar(\\\":defaultPicBack\\\")) {\\n back();\\n clearMyVar(\\\":defaultPicBack\\\");\\n break;\\n }\\n\\n function setDefaultPic(url) {\\n let Config = JSON.parse(readFile(\\\"config.json\\\", 0) || \\\"{}\\\");\\n Config.def_Pic = url;\\n saveFile(\\\"config.json\\\", JSON.stringify(Config), 0);\\n back();\\n return \\\"toast://修改成功\\\";\\n }\\n let start = 1;\\n if (typeof(MY_NAME) !== \\\"undefined\\\" && MY_NAME === \\\"嗅觉浏览器\\\") {\\n start = 4;\\n }else{\\n layout.push({\\n title: \\\"图片late\\\",\\n col_type: \\\"movie_3\\\",\\n pic_url: \\\"hiker://images/home_late\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(setDefaultPic, \\\"hiker://images/home_late\\\")\\n });\\n }\\n\\n for (let i = start; i <= 4; i++) {\\n layout.push({\\n title: \\\"图片\\\" + i,\\n col_type: \\\"movie_3\\\",\\n pic_url: \\\"hiker://images/home_pic\\\" + i,\\n url: $(\\\"#noLoading#\\\").lazyRule(setDefaultPic, \\\"hiker://images/home_pic\\\" + i)\\n });\\n }\\n layout.push({\\n title: \\\"自定义➕\\\",\\n col_type: \\\"text_3\\\",\\n url: $([\\\"自定义url\\\", \\\"选择文件路径\\\"]).select(() => {\\n if (input === \\\"自定义url\\\") {\\n return $(\\\"\\\", \\\"输入图片的路径或者链接\\\").input(() => {\\n let Config = JSON.parse(readFile(\\\"config.json\\\", 0) || \\\"{}\\\");\\n Config.def_Pic = input;\\n saveFile(\\\"config.json\\\", JSON.stringify(Config), 0);\\n back();\\n return \\\"toast://修改成功\\\";\\n });\\n } else {\\n let requireUrl = \\\"http://hiker.nokia.press/hikerule/rulelist.json?id=5099\\\";\\n let fileSelect = $.require(requireUrl);\\n return fileSelect.fileSelectionUri({\\n callback: $.toString(() => {\\n let Config = JSON.parse(readFile(\\\"config.json\\\", 0) || \\\"{}\\\");\\n Config.def_Pic = \\\"file://\\\" + PATH;\\n saveFile(\\\"config.json\\\", JSON.stringify(Config), 0);\\n putMyVar(\\\":defaultPicBack\\\", \\\"true\\\");\\n back();\\n return \\\"toast://修改成功\\\";\\n }),\\n fileType: \\\".jpg|.jpeg|.gif|.png|.svg|.bmp\\\",\\n onClickType: \\\"confirm\\\",\\n store: \\\"selectPathCache2\\\",\\n memoryPath: true\\n });\\n }\\n })\\n });\\n break;\\n case \\\"replaceRule\\\":\\n if (MY_PARAMS.isRefresh) {\\n addListener(\\\"onClose\\\", $.toString(() => refreshPage()));\\n }\\n setPageTitle(\\\"替换规则|设置\\\");\\n let ruleList = [];\\n try {\\n ruleList = JSON.parse(readFile(\\\"replaceRule.json\\\") || \\\"[]\\\");\\n } catch (e) {\\n confirm({\\n title: '错误提示',\\n content: '替换数据读取失败,是否初始化?\\\\n该操作会清除你的替换数据!!!',\\n confirm: $.toString(() => {\\n deleteFile(\\\"replaceRule.json\\\");\\n toast(\\\"初始化完成\\\");\\n }),\\n cancel: $.toString(() => {\\n //toast(\\\"取消\\\");\\n })\\n })\\n }\\n layout.push({\\n title: \\\"新建替换\\\",\\n url: \\\"hiker://page/editReplaceRule.view#noRecordHistory##noHistory##noRefresh#?isNew=true\\\",\\n col_type: \\\"text_3\\\"\\n });\\n layout.push({\\n title: \\\"导出规则\\\",\\n url: $(\\\"确认导出\\\" + ruleList.length + \\\"条规则?\\\\n({homePtah}/replaceRule.json)\\\").confirm((num) => {\\n const Config = $.require(\\\"hiker://page/Config.js\\\");\\n let savePta = Config.homePath + \\\"/replaceRule.json\\\";\\n writeFile(savePta, readFile(\\\"replaceRule.json\\\") || \\\"[]\\\");\\n log(\\\"\\\\n路径:\\\" + savePta + \\\"\\\\n导出规则 \\\" + num + \\\" 条\\\");\\n return \\\"share://\\\" + savePta;\\n }, ruleList.length),\\n col_type: \\\"text_3\\\"\\n });\\n\\n function importRule(isback) {\\n input = typeof PATH === \\\"undefined\\\" ? input : PATH;\\n input = input.startsWith(\\\"file://\\\") ? input : \\\"file://\\\" + input\\n let ruleText = request(input);\\n if (!ruleText) return \\\"toast://获取文件为空\\\";\\n try {\\n let newRuleList = JSON.parse(ruleText);\\n let ruleList = JSON.parse(readFile(\\\"replaceRule.json\\\") || \\\"[]\\\");\\n let newCount = 0,\\n updateCount = 0;\\n for (let i in newRuleList) {\\n let newRule = newRuleList[i];\\n if (!newRule.hasOwnProperty(\\\"replacement\\\") || !newRule.hasOwnProperty(\\\"pattern\\\") || !newRule.hasOwnProperty(\\\"name\\\") || (newRule.scopeContent === undefined ? false : !newRule.scopeContent)) {\\n continue;\\n }\\n let id = newRule.id;\\n newRule.id = id || new Date().getTime();\\n let idIndex = ruleList.findIndex(rule => rule.id === id);\\n if (idIndex > -1) {\\n updateCount++;\\n ruleList.splice(idIndex, 1, newRule);\\n } else {\\n newCount++;\\n ruleList.push(newRule);\\n }\\n }\\n saveFile(\\\"replaceRule.json\\\", JSON.stringify(ruleList));\\n if (isback) {\\n back();\\n } else {\\n refreshPage();\\n }\\n log(\\\"\\\\n路径:\\\" + input + \\\"\\\\n总规则数:\\\" + newRuleList.length + \\\"\\\\n更新规则 \\\" + updateCount + \\\" 条\\\\t新增规则 \\\" + newCount + \\\" 条\\\");\\n toast(\\\"导入成功\\\");\\n } catch (e) {\\n log(e.toString());\\n if (isback) back();\\n toast(\\\"导入失败\\\");\\n }\\n }\\n layout.push({\\n title: \\\"导入规则\\\",\\n url: $([\\\"外部文件\\\", \\\"内部文件\\\"], 1, \\\"规则导入\\\").select((importRule) => {\\n if (input === \\\"外部文件\\\") {\\n return \\\"fileSelect://\\\" + $.toString(importRule);\\n } else {\\n let requireUrl = \\\"http://hiker.nokia.press/hikerule/rulelist.json?id=5099\\\";\\n let fileSelect = require(requireUrl);\\n return fileSelect.fileSelectionUri({\\n callback: $.toString(importRule, true),\\n requireUrl: requireUrl,\\n fileType: \\\".json\\\",\\n onClickType: \\\"confirm\\\",\\n memory: \\\"selectPathCache\\\"\\n });\\n }\\n }, importRule),\\n col_type: \\\"text_3\\\"\\n });\\n layout.push({\\n col_type: \\\"line_blank\\\"\\n });\\n for (let i = 0, len = ruleList.length; i < len; i++) {\\n let replaceRule = ruleList[i];\\n layout.push({\\n title: replaceRule.name,\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\",\\n extra: {\\n cls: id + \\\".\\\" + i,\\n lineVisible: false\\n }\\n });\\n layout.push({\\n title: \\\"删除\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((id, index) => {\\n var ruleList = JSON.parse(readFile(\\\"replaceRule.json\\\") || \\\"[]\\\");\\n let g = ruleList.splice(index, 1);\\n\\n saveFile(\\\"replaceRule.json\\\", JSON.stringify(ruleList));\\n //deleteItemByCls(id + \\\".\\\" + index);\\n refreshPage(false);\\n toast(\\\"删除成功\\\");\\n return \\\"hiker://empty\\\";\\n }, id, i),\\n extra: {\\n cls: id + \\\".\\\" + i\\n },\\n col_type: \\\"text_2\\\"\\n });\\n layout.push({\\n title: \\\"编辑\\\",\\n url: \\\"hiker://page/editReplaceRule.view#noRecordHistory##noHistory##noRefresh#?index=\\\" + i,\\n col_type: \\\"text_2\\\",\\n extra: {\\n cls: id + \\\".\\\" + i\\n }\\n });\\n layout.push({\\n col_type: \\\"line_blank\\\",\\n extra: {\\n cls: id + \\\".\\\" + i\\n }\\n });\\n }\\n break;\\n case \\\"contents\\\":\\n let f = require(\\\"http://hiker.nokia.press/hikerule/rulelist.json?id=5099\\\");\\n setPageTitle(\\\"目录设置|设置\\\");\\n layout.push({\\n title: \\\"选择文件夹\\\",\\n url: JSON.stringify(f.fileSelectionUri({\\n callback: $.toString((id) => {\\n let target = findItem(id).extra;\\n updateItem(id, {\\n extra: Object.assign(target, {\\n defaultValue: PATH\\n })\\n });\\n return true;\\n }, id),\\n initialPath: Config.homePath,\\n requireUrl: \\\"http://hiker.nokia.press/hikerule/rulelist.json?id=5099\\\",\\n pattern: 1\\n })),\\n col_type: \\\"input\\\",\\n desc: \\\"支持hiker://files路径(该操作不会初始化目录)\\\",\\n extra: {\\n defaultValue: Config.homePath,\\n onChange: $.toString((id) => {\\n putMyVar(id, input);\\n }, id),\\n id: id\\n }\\n });\\n layout.push({\\n col_type: \\\"line_blank\\\"\\n });\\n layout.push({\\n title: \\\"确认\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((id) => {\\n let input = getMyVar(id, findItem(id).extra.defaultValue || \\\"\\\");\\n const Config = $.require(\\\"hiker://page/Config.js\\\");\\n if (input.startsWith(\\\"hiker://files/\\\")) input = getPath(input).slice(7);\\n if (input.endsWith(\\\"/\\\")) input = input.replace(/\\\\/$/, \\\"\\\");\\n if (Config.homePath == input) return \\\"toast://已经是当前目录\\\";\\n Config = JSON.parse(readFile(\\\"config.json\\\", 0) || \\\"{}\\\");\\n Config.homePath = input;\\n saveFile(\\\"config.json\\\", JSON.stringify(Config), 0);\\n back();\\n return \\\"toast://已保存\\\";\\n }, id),\\n col_type: \\\"text_center_1\\\",\\n });\\n\\n break;\\n}\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#v.编辑替换规则\",\"path\":\"editReplaceRule.view\",\"rule\":\"js:\\nconst isNew = MY_PARAMS.isNew || getParam(\\\"isNew\\\");\\nconst index = MY_PARAMS.index || Number(getParam(\\\"index\\\"));\\nlet layout = [];\\naddListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\".editReplaceRule.name\\\");\\n clearMyVar(\\\".editReplaceRule.isRegex\\\");\\n clearMyVar(\\\".editReplaceRule.pattern\\\");\\n clearMyVar(\\\".editReplaceRule.replacement\\\");\\n clearMyVar(\\\".editReplaceRule.first\\\");\\n //clearMyVar(\\\".editReplaceRule.scope\\\");\\n}));\\nlet ruleList = JSON.parse(readFile(\\\"replaceRule.json\\\") || \\\"[]\\\");\\nlet id = \\\"#\\\" + new Date().getTime();\\n//let replaceRule = isNew == \\\"true\\\"?{}:ruleList[index];\\nif (isNew == \\\"true\\\") {\\n replaceRule = {\\n id: new Date().getTime(),\\n isRegex: false,\\n }\\n} else {\\n replaceRule = ruleList[index];\\n}\\n//首次初始化\\nif(getMyVar(\\\".editReplaceRule.first\\\",\\\"\\\")==\\\"\\\"){\\n putMyVar(\\\".editReplaceRule.isRegex\\\", \\\"\\\" + replaceRule.isRegex);\\n putMyVar(\\\".editReplaceRule.first\\\",\\\"1\\\");\\n}\\nlayout.push({\\n title: \\\"拷贝\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n let att = [\\\"name\\\", \\\"isRegex\\\", \\\"pattern\\\", \\\"replacement\\\"];\\n let json = {};\\n att.forEach(key => {\\n let value = getMyVar(\\\".editReplaceRule.\\\" + key, \\\"\\\");\\n if (key === \\\"isRegex\\\") {\\n value = value === \\\"true\\\" ? true : false;\\n }\\n json[key] = value;\\n });\\n copy(JSON.stringify(json));\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"text_2\\\"\\n});\\nlayout.push({\\n title: \\\"粘贴\\\",\\n url: $(\\\"{{clipboard}}\\\").input(() => {\\n try {\\n let json = JSON.parse(input);\\n if (Array.isArray(json) || json.pattern == undefined) return;\\n let att = [\\\"name\\\", \\\"isRegex\\\", \\\"pattern\\\", \\\"replacement\\\"];\\n att.forEach(key => {\\n putMyVar(\\\".editReplaceRule.\\\" + key, String(json[key]));\\n });\\n refreshPage(false);\\n } catch (e) {\\n log(e.toString());\\n }\\n }),\\n col_type: \\\"text_2\\\"\\n});\\nlayout.push({\\n col_type: \\\"input\\\",\\n desc: \\\"替换规则名称\\\",\\n extra: {\\n titleVisible: false,\\n defaultValue: getMyVar(\\\".editReplaceRule.name\\\", replaceRule.name),\\n onChange: 'putMyVar(\\\".editReplaceRule.name\\\",input);'\\n }\\n});\\n\\nlayout.push({\\n col_type: \\\"input\\\",\\n desc: \\\"替换规则\\\",\\n extra: {\\n titleVisible: false,\\n type: \\\"textarea\\\",\\n height: -1,\\n defaultValue: getMyVar(\\\".editReplaceRule.pattern\\\", replaceRule.pattern),\\n onChange: 'putMyVar(\\\".editReplaceRule.pattern\\\", input);'\\n }\\n});\\nlayout.push({\\n title: \\\"是否使用正则表达式:\\\" + getMyVar(\\\".editReplaceRule.isRegex\\\"),\\n url: $(\\\"#noLoading#\\\").lazyRule((id) => {\\n let isRegex = getMyVar(\\\".editReplaceRule.isRegex\\\") === \\\"true\\\" ? false : true;\\n updateItem({\\n extra: {\\n id: id\\n },\\n title: \\\"是否使用正则表达式:\\\" + isRegex\\n });\\n putMyVar(\\\".editReplaceRule.isRegex\\\", \\\"\\\" + isRegex);\\n return \\\"hiker://empty\\\";\\n }, id),\\n col_type: \\\"text_1\\\",\\n extra: {\\n id: id\\n }\\n});\\nlayout.push({\\n col_type: \\\"input\\\",\\n desc: \\\"替换为\\\",\\n extra: {\\n titleVisible: false,\\n type: \\\"textarea\\\",\\n height: -1,\\n defaultValue: getMyVar(\\\".editReplaceRule.replacement\\\", replaceRule.replacement),\\n onChange: 'putMyVar(\\\".editReplaceRule.replacement\\\",input);'\\n }\\n});\\nlayout.push({\\n title: \\\"保存\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((replaceRule, isNew, index) => {\\n let pattern = getMyVar(\\\".editReplaceRule.pattern\\\", \\\"\\\");\\n if (!pattern) {\\n return \\\"toast://替换规则不能为空\\\";\\n }\\n Object.assign(replaceRule, {\\n name: getMyVar(\\\".editReplaceRule.name\\\", \\\"\\\"),\\n isRegex: getMyVar(\\\".editReplaceRule.isRegex\\\") === \\\"true\\\" ? true : false,\\n pattern: pattern,\\n replacement: getMyVar(\\\".editReplaceRule.replacement\\\", \\\"\\\")\\n });\\n let ruleList = JSON.parse(readFile(\\\"replaceRule.json\\\") || \\\"[]\\\");\\n if (isNew == \\\"true\\\") {\\n ruleList.push(replaceRule);\\n } else {\\n ruleList.splice(index, 1, replaceRule);\\n }\\n saveFile(\\\"replaceRule.json\\\", JSON.stringify(ruleList));\\n back();\\n return \\\"toast://保存成功\\\";\\n }, replaceRule, isNew, index),\\n col_type: \\\"text_center_1\\\",\\n});\\n\\n/*\\nlayout.push({\\n col_type: \\\"input\\\",\\n desc: \\\"替换范围\\\",\\n extra: {\\n titleVisible: false,\\n type: \\\"textarea\\\",\\n height: -1,\\n defaultValue: \\\"\\\",\\n onChange: 'putMyVar(\\\".editReplaceRule.scope\\\",input);'\\n }\\n});\\n\\n*/\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#v.小说个性化净化\",\"path\":\"NovelCustom.view\",\"rule\":\"js:\\nsetPageTitle(\\\"替换规则|\\\" + MY_PARAMS.name);\\nlet ruleList = JSON.parse(readFile(\\\"replaceRule.json\\\") || \\\"[]\\\");\\nlet id = \\\"#\\\" + new Date().getTime();\\n\\nconst bookInfo = Object.assign({\\n foot: 0,\\n isReplace: true,\\n selected: []\\n}, JSON.parse(request(\\\"file://\\\" + MY_PARAMS.path + \\\"/bookInfo.json\\\") || \\\"{}\\\"));\\n\\nlet layout = [];\\nlayout.push({\\n title: [\\\"☐净化\\\", \\\"☑净化\\\"][0 + bookInfo.isReplace],\\n url: $(\\\"#noLoading#\\\").lazyRule(($id, path) => {\\n\\n var bookInfo = JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\");\\n let isReplace = bookInfo.isReplace===undefined?true:bookInfo.isReplace;\\n bookInfo.isReplace = !isReplace;\\n writeFile(\\\"file://\\\" + path + \\\"/bookInfo.json\\\", JSON.stringify(bookInfo));\\n updateItem($id, {\\n title: isReplace ? \\\"☐净化\\\" : \\\"☑净化\\\",\\n });\\n return \\\"hiker://empty\\\";\\n }, id + \\\"#-1\\\", MY_PARAMS.path),\\n extra: {\\n id: id + \\\"#-1\\\"\\n },\\n col_type: \\\"text_2\\\"\\n});\\nlayout.push({\\n title: \\\"编辑规则\\\",\\n url: \\\"hiker://page/Setting/More.view#noRecordHistory##noHistory##noRefresh#?settingType=replaceRule\\\",\\n col_type: \\\"text_2\\\",\\n extra:{\\n isRefresh: true\\n }\\n});\\nfor (let i = 0, len = ruleList.length; i < len; i++) {\\n let replaceRule = ruleList[i];\\n let isTrue = bookInfo.selected.includes(replaceRule.id);\\n layout.push({\\n title: (isTrue ? \\\"●\\\" : \\\"○\\\") + replaceRule.name,\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\",\\n y: 0,\\n extra: {\\n isTrue: isTrue,\\n id: id + i,\\n lineVisible: false\\n }\\n });\\n layout.push({\\n title: \\\"开启\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(($id, replaceRule, path) => {\\n if (findItem($id).extra.isTrue) {\\n return \\\"toast://已开启\\\";\\n }\\n const bookInfo = Object.assign({\\n selected: []\\n }, JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\"));\\n bookInfo.selected.push(replaceRule.id);\\n updateItem($id, {\\n title: \\\"●\\\" + replaceRule.name,\\n extra: {\\n isTrue: true,\\n id: $id,\\n lineVisible: false\\n }\\n });\\n writeFile(\\\"file://\\\" + path + \\\"/bookInfo.json\\\", JSON.stringify(bookInfo));\\n return \\\"hiker://empty\\\";\\n }, id + i, replaceRule, MY_PARAMS.path),\\n col_type: \\\"text_2\\\"\\n });\\n layout.push({\\n title: \\\"关闭\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(($id, replaceRule, path) => {\\n if (!findItem($id).extra.isTrue) {\\n return \\\"toast://已关闭\\\";\\n }\\n const bookInfo = Object.assign({\\n selected: []\\n }, JSON.parse(request(\\\"file://\\\" + path + \\\"/bookInfo.json\\\") || \\\"{}\\\"));\\n bookInfo.selected.splice(bookInfo.selected.indexOf(replaceRule.id), 1);\\n updateItem($id, {\\n title: \\\"○\\\" + replaceRule.name,\\n extra: {\\n isTrue: false,\\n id: $id,\\n lineVisible: false\\n }\\n });\\n writeFile(\\\"file://\\\" + path + \\\"/bookInfo.json\\\", JSON.stringify(bookInfo));\\n return \\\"hiker://empty\\\";\\n }, id + i, replaceRule, MY_PARAMS.path),\\n col_type: \\\"text_2\\\"\\n });\\n layout.push({\\n col_type: \\\"line_blank\\\"\\n });\\n}\\n\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#v.外导小说\",\"path\":\"externalimportTxt.view\",\"rule\":\"js:\\nfunction txtView(layout) {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n const Config = $.require(\\\"hiker://page/Config.js\\\");\\n let files = File.getFilePath(Config.externalImportPath);\\n files = files.filter(v => /(\\\\.txt|\\\\.epub)$/.test(v.name));\\n\\n setPageTitle(\\\"小说书架\\\");\\n //let layout = [];\\n layout.push({\\n url: 'input?\\\"hiker://page/txtSearch.view#noRefresh#?searchTerms=\\\"+encodeURIComponent(input):\\\"toast://请输入小说名\\\"',\\n desc: \\\"搜索\\\",\\n title: \\\"🔍\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"searchKeyByTxt\\\", \\\"\\\"),\\n onChange: \\\"putMyVar('searchKeyByTxt',input)\\\"\\n }\\n });\\n layout.push({\\n title: \\\"导入小说\\\",\\n col_type: \\\"text_3\\\",\\n url: $([\\\"系统选择器\\\", \\\"海阔选择器\\\"], 1, \\\"选择器类型\\\").select(() => {\\n if (input === \\\"系统选择器\\\") {\\n return \\\"fileSelect://\\\" + $.toString(() => {\\n if (!/(\\\\.txt|.epub)$/i.test(input)) {\\n toast(\\\"选择了错误的文件类型\\\");\\n return;\\n }\\n const Config = $.require(\\\"hiker://page/Config.js\\\");\\n let fileMatch = input.match(/\\\\/([^\\\\/]*?)(\\\\.txt|\\\\.epub)$/i);\\n let novelName = fileMatch[1].replace(\\\"_fileSelect_\\\", \\\"\\\");\\n let topath = Config.externalImportPath + novelName + fileMatch[2];\\n let topathCache = Config.contentsCache + novelName + fileMatch[2];\\n let path = input.replace(\\\"file://\\\", \\\"\\\");\\n if (fileExist(\\\"file://\\\" + topath)) {\\n confirm({\\n title: \\\"导入提示\\\",\\n content: \\\"已存在[\\\" + novelName + \\\"]是否覆盖?\\\",\\n confirm: $.toString((path, topath, topathCache) => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n File.copyFile(path, topath, true);\\n if (fileExist(\\\"file://\\\" + topathCache)) {\\n File.deleteFiles(topathCache);\\n }\\n refreshPage(false);\\n return \\\"toast://导入成功\\\";\\n }, path, topath, topathCache)\\n });\\n return;\\n } else {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n File.copyFile(path, topath);\\n if (fileExist(\\\"file://\\\" + topathCache)) {\\n File.deleteFiles(topathCache);\\n }\\n refreshPage(false);\\n toast(\\\"导入成功\\\");\\n return;\\n }\\n });\\n } else {\\n let requireUrl = \\\"http://hiker.nokia.press/hikerule/rulelist.json?id=5099\\\";\\n let fileSelect = $.require(requireUrl);\\n return fileSelect.fileSelectionUri({\\n callback: $.toString(() => {\\n const Config = $.require(\\\"hiker://page/Config.js\\\");\\n let fileMatch = PATH.match(/\\\\/([^\\\\/]*?)(\\\\.txt|\\\\.epub)$/i);\\n let novelName = fileMatch[1];\\n let topath = Config.externalImportPath + novelName + fileMatch[2];\\n let topathCache = Config.contentsCache + novelName + fileMatch[2];\\n let path = PATH;\\n if (fileExist(\\\"file://\\\" + topath)) {\\n return $(\\\"已存在[\\\" + novelName + \\\"]是否覆盖?\\\").confirm((path, topath, topathCache) => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n File.copyFile(path, topath, true);\\n if (fileExist(\\\"file://\\\" + topathCache)) {\\n File.deleteFiles(topathCache);\\n }\\n back();\\n return \\\"toast://导入成功\\\";\\n }, path, topath, topathCache);\\n } else {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n File.copyFile(path, topath);\\n if (fileExist(\\\"file://\\\" + topathCache)) {\\n File.deleteFiles(topathCache);\\n }\\n back();\\n return \\\"toast://导入成功\\\";\\n }\\n }),\\n fileType: \\\".txt|.epub\\\",\\n onClickType: \\\"confirm\\\",\\n store: \\\"selectPathCache1\\\",\\n memoryPath: true\\n });\\n }\\n }),\\n extra: {\\n lineVisible: false\\n }\\n });\\n let options = [\\\"阅读\\\", \\\"分享\\\", \\\"删除\\\", \\\"打开方式\\\"];\\n\\n let pattern = getMyVar(\\\":txtPattern\\\", options[0]);\\n let id = Date.now() + \\\":模式\\\";\\n layout.push({\\n title: pattern,\\n col_type: \\\"text_3\\\",\\n url: $(options, 1, \\\"操作模式\\\").select((id) => {\\n putMyVar(\\\":txtPattern\\\", input);\\n updateItem(id, {\\n title: input\\n });\\n }, id),\\n extra: {\\n id: id\\n }\\n });\\n layout.push({\\n title: \\\"文件管理\\\",\\n col_type: \\\"text_3\\\",\\n url: \\\"hiker://page/FileManagement.view#noRefresh##noRecordHistory##noHistory#?type=externalImportPath\\\"\\n });\\n layout.push({\\n col_type: \\\"line_blank\\\"\\n });\\n\\n function operation(path, name, type) {\\n let pattern = getMyVar(\\\":txtPattern\\\", \\\"阅读\\\");\\n switch (pattern) {\\n case \\\"分享\\\":\\n return \\\"share://\\\" + path;\\n break;\\n case \\\"删除\\\":\\n return $(\\\"确认删除[\\\" + name + \\\"]\\\").confirm((path) => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n if (fileExist(\\\"file://\\\" + path + \\\".json\\\")) {\\n File.deleteFiles(path + \\\".json\\\");\\n }\\n //refreshPage();\\n deleteItem(path)\\n return \\\"toast://删除成功\\\";\\n } else {\\n return \\\"toast://删除失败\\\";\\n }\\n }, path);\\n break;\\n case \\\"阅读\\\":\\n return (type===\\\".txt\\\"?\\\"hiker://page/txtParser.view\\\":\\\"hiker://page/epubParser.view#autoCache#\\\")+\\\"?rule=\\\" + MY_RULE.title;\\n break;\\n case \\\"打开方式\\\":\\n return \\\"openFile://file://\\\" + path;\\n break;\\n }\\n }\\n\\n for (let novel of files) {\\n let type = novel.name.substring(novel.name.lastIndexOf(\\\".\\\"));\\n layout.push({\\n title: novel.name,\\n url: $(\\\"#noLoading#\\\").lazyRule(operation, novel.path, novel.name, type),\\n desc: \\\"大小:\\\" + File.getFileSize(novel.path) + \\\"\\\\n修改时间:\\\" + $.dateFormat(novel.lastModified, \\\"yyyy-MM-dd HH:mm:ss\\\"),\\n col_type: \\\"text_1\\\",\\n extra: {\\n path: novel.path,\\n isCache: true,\\n title: novel.name,\\n id: novel.path,\\n longClick: [{\\n title: \\\"分享\\\",\\n js: JSON.stringify(\\\"share://\\\" + novel.path)\\n }, {\\n title: \\\"阅读\\\",\\n js: JSON.stringify((type===\\\".txt\\\"?\\\"hiker://page/txtParser.view\\\":\\\"hiker://page/epubParser.view#autoCache#\\\")+\\\"?rule=\\\" + MY_RULE.title)\\n }, {\\n title: \\\"打开方式\\\",\\n js: JSON.stringify(\\\"openFile://file://\\\" + novel.path)\\n }, {\\n title: \\\"删除\\\",\\n js: $.toString((path) => {\\n return $.require(\\\"longPress.js\\\").deleteFileForTxt(path)\\n }, novel.path)\\n }]\\n }\\n });\\n }\\n if (files.length === 0) {\\n layout.push({\\n title: \\\"设置\\\",\\n url: \\\"hiker://page/Setting.view#noRefresh##noRecordHistory##noHistory#\\\",\\n col_type: \\\"text_2\\\",\\n extra: {\\n version: MY_RULE.version\\n }\\n });\\n\\n layout.push({\\n title: \\\"““帮助””\\\",\\n url: \\\"hiker://page/help.view#noRefresh##noRecordHistory##noHistory#?keyword=txt\\\",\\n col_type: \\\"text_2\\\"\\n });\\n layout.push({\\n title: '<h1 style=\\\"text-align: center;\\\">啥都没有耶</h1>',\\n col_type: \\\"rich_text\\\"\\n });\\n }\\n setResult(layout);\\n}\\n\\nif ($.importParam === undefined) {\\n $.exports = txtView;\\n} else if ($.importParam === null) {\\n setResult(txtView([]));\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"#v.TXT解析器\",\"path\":\"txtParser.view\",\"rule\":\"js:\\n(function() {\\n const Config = $.require(\\\"Config.js\\\");\\n let regs = $.require(\\\"hiker://page/regularChapter.f\\\");\\n let path = decodeURIComponent(getParam(\\\"path\\\") || \\\"\\\") || MY_PARAMS.path;\\n let charst = decodeURIComponent(getParam(\\\"charst\\\") || \\\"\\\") || MY_PARAMS.charst || \\\"UTF-8\\\";\\n let isCache = decodeURIComponent(getParam(\\\"isCache\\\") || \\\"\\\") || MY_PARAMS.isCache;\\n if (!path.startsWith(\\\"file://\\\")) {\\n path = \\\"file://\\\" + path;\\n }\\n if(MY_PARAMS.title){\\n setPageTitle(MY_PARAMS.title);\\n }else{\\n setPageTitle($.require(\\\"hiker://page/File.js\\\").getName(path));\\n }\\n let layout = [];\\n let chapterNames = [];\\n let intervals = [];\\n let hasPreface = false;\\n let cachePath = path.replace(Config.externalImportPath, Config.contentsCache);\\n if (isCache&&fileExist(cachePath)) {\\n try {\\n\\n let c = JSON.parse(request(cachePath));\\n chapterNames = c.chapterNames;\\n intervals = c.intervals;\\n hasPreface = c.hasPreface;\\n layout.push({\\n title: \\\"重新解析目录\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((path) => {\\n deleteFile(path);\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }, path+\\\".json\\\"),\\n extra: {\\n lineVisible:false\\n }\\n });\\n layout.push({\\n col_type:\\\"line_blank\\\"\\n });\\n } catch (e) {\\n log(e.toString());\\n setResult([{\\n title: \\\"““””<strong>目录解析失败(重新解析)</strong>\\\".big(),\\n col_type: \\\"text_center_1\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((path) => {\\n deleteFile(path);\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }, path+\\\".json\\\"),\\n extra: {\\n lineVisible: false\\n }\\n }]);\\n return;\\n }\\n\\n } else {\\n showLoading(\\\"正在解析目录\\\");\\n let txt = request(path, {\\n headers: {\\n //\\\"content-type\\\": \\\"text/plain; charst=\\\" + charst\\n }\\n });\\n let pattern = regs.getTocRule(txt);\\n if (!pattern) {\\n hideLoading();\\n setResult([{\\n title: \\\"““””<strong>目录解析失败</strong>\\\".big(),\\n col_type: \\\"text_center_1\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n back(false);\\n return \\\"hiker://empty\\\";\\n }),\\n extra: {\\n lineVisible: false\\n }\\n }]);\\n return;\\n }\\n let matcher = pattern.matcher(txt);\\n let pointer = 0;\\n while (matcher.find()) {\\n let start = matcher.start();\\n let end = matcher.end();\\n let t = matcher.group();\\n if (pointer === 0 && start > 30) {\\n hasPreface = true;\\n }\\n chapterNames.push(t);\\n intervals.push([pointer, start]);\\n pointer = end;\\n }\\n intervals.push([pointer, txt.length]);\\n if (isCache) {\\n writeFile(cachePath, JSON.stringify({\\n chapterNames: chapterNames,\\n intervals: intervals,\\n hasPreface: hasPreface\\n }));\\n }\\n hideLoading();\\n }\\n\\n\\n if (hasPreface) {\\n let interval = intervals[0];\\n layout.push({\\n title: \\\"序言\\\",\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/TXTViewer.view#autoPage##readTheme#\\\",\\n extra: {\\n chapterName: \\\"序言\\\",\\n start: interval[0],\\n end: interval[1],\\n path: path,\\n charst: charst\\n }\\n });\\n }\\n for (let i = 0; i < chapterNames.length; i++) {\\n let name = chapterNames[i];\\n let interval = intervals[i + 1];\\n layout.push({\\n title: name,\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/TXTViewer.view#autoPage##readTheme#\\\",\\n extra: {\\n start: interval[0],\\n end: interval[1],\\n chapterName: name,\\n path: path,\\n charst: charst\\n }\\n });\\n }\\n setResult(layout);\\n})()\"},{\"col_type\":\"movie_3\",\"name\":\"#v.TXT查看器\",\"path\":\"TXTViewer.view\",\"rule\":\"js:\\nlet path = MY_PARAMS.path;\\nlet charst = MY_PARAMS.charst;\\nlet txt = request(path, {\\n headers: {\\n //\\\"content-type\\\": \\\"text/plain; charst=\\\" + charst\\n }\\n});\\n\\nlet targetTexts = txt.substring(MY_PARAMS.start, MY_PARAMS.end);\\n\\nlet content = targetTexts.split(/(\\\\n|\\\\r)+/).filter(it => it.length > 1).join(\\\"<br>\\\");\\nlet layout = [];\\nlayout.push({\\n col_type: \\\"rich_text\\\",\\n title: (\\\"<strong>\\\" + MY_PARAMS.chapterName + \\\"</strong>\\\").big(),\\n});\\n\\nlayout.push({\\n title: content,\\n col_type: 'rich_text',\\n extra: {\\n textSize: 18,\\n click: true\\n }\\n});\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#j.章节正则\",\"path\":\"regularChapter.f\",\"rule\":\"js:\\nlet rules = [{\\n \\\"id\\\": -1,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"目录(去空白)\\\",\\n \\\"rule\\\": \\\"(?<=[ \\\\\\\\s])(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\\\\\\\s{0,4}[\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\\\\\\\s{0,4}(?:章|节(?!课)|卷|集(?![合和]))).{0,30}$\\\",\\n \\\"example\\\": \\\"第一章 假装第一章前面有空白但我不要\\\",\\n \\\"serialNumber\\\": 0\\n },\\n {\\n \\\"id\\\": -2,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"目录\\\",\\n \\\"rule\\\": \\\"^[  \\\\\\\\t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\\\\\\\s{0,4}[\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\\\\\\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|篇(?!张))).{0,30}$\\\",\\n \\\"example\\\": \\\"第一章 标准的粤语就是这样\\\",\\n \\\"serialNumber\\\": 1\\n },\\n {\\n \\\"id\\\": -3,\\n \\\"enable\\\": false,\\n \\\"name\\\": \\\"目录(匹配简介)\\\",\\n \\\"rule\\\": \\\"(?<=[ \\\\\\\\s])(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\\\\\\\s{0,4}[\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\\\\\\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|回(?![合来事去])|场(?![和合比电是])|篇(?!张))).{0,30}$\\\",\\n \\\"example\\\": \\\"简介 老夫诸葛村夫\\\",\\n \\\"serialNumber\\\": 2\\n },\\n {\\n \\\"id\\\": -4,\\n \\\"enable\\\": false,\\n \\\"name\\\": \\\"目录(古典、轻小说备用)\\\",\\n \\\"rule\\\": \\\"^[  \\\\\\\\t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\\\\\\\s{0,4}[\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\\\\\\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|回(?![合来事去])|场(?![和合比电是])|话|篇(?!张))).{0,30}$\\\",\\n \\\"example\\\": \\\"第一章 比上面只多了回和话\\\",\\n \\\"serialNumber\\\": 3\\n },\\n {\\n \\\"id\\\": -5,\\n \\\"enable\\\": false,\\n \\\"name\\\": \\\"数字(纯数字标题)\\\",\\n \\\"rule\\\": \\\"(?<=[ \\\\\\\\s])\\\\\\\\d+\\\\\\\\.?[  \\\\\\\\t]{0,4}$\\\",\\n \\\"example\\\": \\\"12\\\",\\n \\\"serialNumber\\\": 4\\n },\\n {\\n \\\"id\\\": -6,\\n \\\"enable\\\": false,\\n \\\"name\\\": \\\"大写数字(纯数字标题)\\\",\\n \\\"rule\\\": \\\"(?<=[ \\\\\\\\s])[〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,12}[  \\\\\\\\t]{0,4}$\\\",\\n \\\"example\\\": \\\"一百七十\\\",\\n \\\"serialNumber\\\": 4\\n },\\n {\\n \\\"id\\\": -7,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"数字 分隔符 标题名称\\\",\\n \\\"rule\\\": \\\"^[  \\\\\\\\t]{0,4}\\\\\\\\d{1,5}[::,., 、_—\\\\\\\\-].{1,30}$\\\",\\n \\\"example\\\": \\\"1、这个就是标题\\\",\\n \\\"serialNumber\\\": 5\\n },\\n {\\n \\\"id\\\": -8,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"大写数字 分隔符 标题名称\\\",\\n \\\"rule\\\": \\\"^[  \\\\\\\\t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|[〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8})[ 、_—\\\\\\\\-].{1,30}$\\\",\\n \\\"example\\\": \\\"一、只有前面的数字有差别\\\",\\n \\\"serialNumber\\\": 6\\n },\\n {\\n \\\"id\\\": -9,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"正文 标题/序号\\\",\\n \\\"rule\\\": \\\"^[  \\\\\\\\t]{0,4}正文[  ]{1,4}.{0,20}$\\\",\\n \\\"example\\\": \\\"正文 我奶常山赵子龙\\\",\\n \\\"serialNumber\\\": 7\\n },\\n {\\n \\\"id\\\": -10,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"Chapter/Section/Part/Episode 序号 标题\\\",\\n \\\"rule\\\": \\\"^[  \\\\\\\\t]{0,4}(?:[Cc]hapter|[Ss]ection|[Pp]art|PART|[Nn][oO]\\\\\\\\.|[Ee]pisode|(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外)\\\\\\\\s{0,4}\\\\\\\\d{1,4}.{0,30}$\\\",\\n \\\"example\\\": \\\"Chapter 1 MyGrandmaIsNB\\\",\\n \\\"serialNumber\\\": 8\\n },\\n {\\n \\\"id\\\": -11,\\n \\\"enable\\\": false,\\n \\\"name\\\": \\\"Chapter(去简介)\\\",\\n \\\"rule\\\": \\\"^[  \\\\\\\\t]{0,4}(?:[Cc]hapter|[Ss]ection|[Pp]art|PART|[Nn][Oo]\\\\\\\\.|[Ee]pisode)\\\\\\\\s{0,4}\\\\\\\\d{1,4}.{0,30}$\\\",\\n \\\"example\\\": \\\"Chapter 1 MyGrandmaIsNB\\\",\\n \\\"serialNumber\\\": 9\\n },\\n {\\n \\\"id\\\": -12,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"特殊符号 序号 标题\\\",\\n \\\"rule\\\": \\\"(?<=[\\\\\\\\s ])[【〔〖「『〈[\\\\\\\\[](?:第|[Cc]hapter)[\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,10}[章节].{0,20}$\\\",\\n \\\"example\\\": \\\"【第一章 后面的符号可以没有\\\",\\n \\\"serialNumber\\\": 10\\n },\\n {\\n \\\"id\\\": -13,\\n \\\"enable\\\": false,\\n \\\"name\\\": \\\"特殊符号 标题(成对)\\\",\\n \\\"rule\\\": \\\"(?<=[\\\\\\\\s ]{0,4})(?:[\\\\\\\\[〈「『〖〔《(【\\\\\\\\(].{1,30}[\\\\\\\\)】)》〕〗』」〉\\\\\\\\]]?|(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外)[  ]{0,4}$\\\",\\n \\\"example\\\": \\\"『加个直角引号更专业』\\\",\\n \\\"serialNumber\\\": 11\\n },\\n {\\n \\\"id\\\": -14,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"特殊符号 标题(单个)\\\",\\n \\\"rule\\\": \\\"(?<=[\\\\\\\\s ]{0,4})(?:[☆★✦✧].{1,30}|(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外)[  ]{0,4}$\\\",\\n \\\"example\\\": \\\"☆、晋江作者最喜欢的格式\\\",\\n \\\"serialNumber\\\": 12\\n },\\n {\\n \\\"id\\\": -15,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"章/卷 序号 标题\\\",\\n \\\"rule\\\": \\\"^[ \\\\\\\\t ]{0,4}(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|[卷章][\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8})[  ]{0,4}.{0,30}$\\\",\\n \\\"example\\\": \\\"卷五 开源盛世\\\",\\n \\\"serialNumber\\\": 13\\n },\\n {\\n \\\"id\\\": -16,\\n \\\"enable\\\": false,\\n \\\"name\\\": \\\"顶格标题\\\",\\n \\\"rule\\\": \\\"^\\\\\\\\S.{1,20}$\\\",\\n \\\"example\\\": \\\"不超过20个字顶格写的都是标题\\\",\\n \\\"serialNumber\\\": 14\\n },\\n {\\n \\\"id\\\": -17,\\n \\\"enable\\\": false,\\n \\\"name\\\": \\\"双标题(前向)\\\",\\n \\\"rule\\\": \\\"(?m)(?<=[ \\\\\\\\t ]{0,4})第[\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$(?=[\\\\\\\\s ]{0,8}第[\\\\\\\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章)\\\",\\n \\\"example\\\": \\\"第一章 真正的标题并假装换行第一章 这个不要\\\",\\n \\\"serialNumber\\\": 15\\n },\\n {\\n \\\"id\\\": -18,\\n \\\"enable\\\": false,\\n \\\"name\\\": \\\"双标题(后向)\\\",\\n \\\"rule\\\": \\\"(?m)(?<=[ \\\\\\\\t ]{0,4}第[\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$[\\\\\\\\s ]{0,8})第[\\\\\\\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$\\\",\\n \\\"example\\\": \\\"第一章 这个标题不要并假装换行第一章真正的标题\\\",\\n \\\"serialNumber\\\": 16\\n },\\n {\\n \\\"id\\\": -19,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"书名 括号 序号\\\",\\n \\\"rule\\\": \\\"^.{1,20}[((][\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}[))][  \\\\t]{0,4}$\\\",\\n \\\"example\\\": \\\"标题后面数字有括号(12)\\\",\\n \\\"serialNumber\\\": 17\\n },\\n {\\n \\\"id\\\": -20,\\n \\\"enable\\\": true,\\n \\\"name\\\": \\\"书名 序号\\\",\\n \\\"rule\\\": \\\"^.{1,20}[\\\\\\\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}[  \\\\t]{0,4}$\\\",\\n \\\"example\\\": \\\"标题后面数字没有括号124\\\",\\n \\\"serialNumber\\\": 18\\n }\\n];\\nlet Matcher = java.util.regex.Matcher;\\nlet Pattern = java.util.regex.Pattern;\\n\\nfunction getTocRule(content) {\\n let maxCs = 1;\\n let tocPattern = null;\\n for (let tocRule of rules) {\\n if (!tocRule.enable) continue;\\n let pattern = Pattern.compile(tocRule.rule, Pattern.MULTILINE);\\n let matcher = pattern.matcher(content);\\n let cs = 0;\\n while (matcher.find()) {\\n cs++;\\n }\\n if (cs >= maxCs) {\\n maxCs = cs;\\n tocPattern = pattern;\\n }\\n }\\n return tocPattern;\\n}\\n$.exports.getTocRule = getTocRule;\"},{\"col_type\":\"movie_3\",\"name\":\"#V.帮助\",\"path\":\"help.view\",\"rule\":\"js:\\nlet helpText = {\\n \\\"txt\\\": `\\n <h1 id=\\\"txt是什么\\\">TXT是什么?</h1>\\n <p><a href=\\\"https://baike.baidu.com/item/txt/1217330\\\">我已经帮你百度了</a>;简单来说就是一种储存小说的文件(扩展名:txt)。</p>\\n <h1 id=\\\"如何用该小程序阅读txt小说\\\">如何用该小程序阅读txt小说?</h1>\\n <p>在主页面 ◉TXT 界面下,点击导入TXT,选择目标小说文件(txt文件,<em>该操作不会删除txt文件,而是copy一份到小程序的路径下</em>),导入后再在 ◉TXT 界面下选择想要阅读的小说即可。</p>\\n\\n `,\\n \\\"novelComic\\\": `\\n <h1 id=\\\"这个小程序有什么用?\\\">这个小程序有什么用?</h1>\\n <ul>\\n <li><u>代码上为其他小程序(漫画类/小说类)提供下载接口。</u></li>\\n <li><u>本体充当阅读器,可以浏览用该小程序提供的下载接口(上面),下载的漫画/小说。</u></li>\\n <li><u>提供TXT格式小说文件解析功能。</u>\\n <h1 id=\\\"为什么列表里什么都没用\\\">为什么列表里什么都没用?</h1>\\n <u>初次使用,没有很正常吧。🤔</u>\\n <h1 id=\\\"该如何添加漫画或小说\\\">该如何添加漫画(或小说)?</h1>\\n <u> 在一个有下载功能的小程序(漫画类/小说类)中下载一本漫画/小说,返回该规则即可浏览。</u></li>\\n </ul>\\n `\\n};\\nsetPageTitle(\\\"帮助\\\");\\nlet keyword = getParam(\\\"keyword\\\");\\nlet text;\\nif (keyword === undefined || !(text = helpText[keyword])) {\\n setResult([{\\n title: '<h1 style=\\\"text-align: center;\\\">资料不见咯</h1>',\\n col_type: \\\"rich_text\\\"\\n }]);\\n} else {\\n setResult([{\\n title: text,\\n col_type: \\\"rich_text\\\"\\n }]);\\n}\"},{\"col_type\":\"text_1\",\"name\":\"#v.外导搜索\",\"path\":\"txtSearch.view\",\"rule\":\"js:\\nconst File = $.require(\\\"hiker://page/File.js\\\");\\nconst Config = $.require(\\\"hiker://page/Config.js\\\");\\n\\nlet searchTerms = decodeURIComponent(getParam(\\\"searchTerms\\\"));\\nsetPageTitle(\\\"「\\\" + searchTerms + \\\"」的搜索结果\\\");\\nlet data = File.getFilePath(Config.externalImportPath, undefined);\\ndata = data.filter(v => /(\\\\.txt|\\\\.epub)$/.test(v.name));\\n\\nlet termsArr = searchTerms.split(\\\"\\\").map(t => t.replace(/\\\\*|\\\\.|\\\\?|\\\\+|\\\\$|\\\\^|\\\\[|\\\\]|\\\\(|\\\\)|\\\\{|\\\\}|\\\\||\\\\/|\\\\\\\\/g, k => \\\"\\\\\\\\\\\" + k));\\nlet reg = new RegExp(termsArr.join(\\\".*\\\"), \\\"i\\\");\\nlet searchResult = [];\\nfor (let txt of data) {\\n if (reg.test(txt.name)) {\\n let type = txt.name.substring(txt.name.lastIndexOf(\\\".\\\"));\\n searchResult.push({\\n title: txt.name,\\n url: (type===\\\".txt\\\"?\\\"hiker://page/txtParser.view\\\":\\\"hiker://page/epubParser.view#autoCache#\\\")+\\\"?rule=\\\" + MY_RULE.title,\\n desc: txt.path,\\n extra: {\\n path: txt.path,\\n isCache: true,\\n title: txt.name\\n }\\n });\\n }\\n}\\nif (searchResult.length === 0) {\\n searchResult.push({\\n col_type: \\\"big_big_blank_block\\\",\\n }, {\\n col_type: \\\"big_big_blank_block\\\",\\n }, {\\n col_type: \\\"big_big_blank_block\\\",\\n }, {\\n col_type: \\\"big_big_blank_block\\\",\\n }, {\\n title: '<h2 style=\\\"text-align: center;\\\">🔎没有找到相关书籍</h2>',\\n col_type: \\\"rich_text\\\"\\n });\\n}\\nsetResult(searchResult);\"},{\"col_type\":\"movie_3\",\"name\":\"#f.长按/点击\",\"path\":\"longPress.js\",\"rule\":\"js:\\n$.exports = {\\n deleteFileForBook(path) {\\n //return $(\\\"所有的 漫画/小说 章节将被删除\\\\m确认删除?\\\").confirm((path) => {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n deleteItem(path)\\n return \\\"toast://删除成功\\\";\\n } else {\\n return \\\"toast://删除失败\\\";\\n }\\n //}, path);\\n },\\n deleteFileForTxt(path) {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n if (File.deleteFiles(path)) {\\n if (fileExist(\\\"file://\\\" + path + \\\".json\\\")) {\\n File.deleteFiles(path + \\\".json\\\");\\n }\\n deleteItem(path);\\n return \\\"toast://删除成功\\\";\\n } else {\\n return \\\"toast://删除失败\\\";\\n }\\n },\\n singleEnter(pageUrl, path) {\\n const File = $.require(\\\"hiker://page/File.js\\\");\\n let dirs = File.getFilePath(path, \\\"dir\\\");\\n if (dirs.length === 1) {\\n const Config = $.require(\\\"hiker://page/Config.js\\\");\\n let fi = dirs[0].path;\\n if (Config.def_isComicCompatible === \\\"0\\\") {\\n let filelist = File.getFilePath(fi);\\n let shorten = fi.replace(getPath(\\\"hiker://files/\\\").slice(7), \\\"hiker://files/\\\");\\n let piclist = filelist.map((item, i) => shorten + \\\"/\\\" + (i + 1) + \\\".jpg\\\");\\n return \\\"pics://\\\" + piclist.join(\\\"&&\\\");\\n\\n } else {\\n return \\\"hiker://page/comicCompatible.view#autoPage##readTheme#?path=\\\" + encodeURIComponent(fi);\\n }\\n } else {\\n return pageUrl + \\\"?rule=\\\" + MY_RULE.title\\n }\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"#fg.下载主程序\",\"path\":\"mainDownload\",\"rule\":\"const File = $.require(\\\"hiker://page/File.js\\\");\\nconst Config = $.require(\\\"hiker://page/Config.js\\\");\\nconst Tool = $.require(\\\"hiker://page/Tool.js\\\");\\n\\n\\n$.exports.novel = function novel(item, info, order, MY_ID, interrupt) {\\n let mainPath = Config.novelPath + \\\"/\\\" + info.ruleName + \\\"/\\\" + Tool.textShield(info.bookName) + \\\"/\\\";\\n let chapterPath = mainPath + order + \\\"$A$\\\" + Tool.textShield(item.title) + \\\".txt\\\";\\n let content = \\\"\\\";\\n if (interrupt && getMyVar(MY_ID + \\\":status\\\", \\\"\\\") === \\\"1\\\") {\\n return -1;\\n }\\n try {\\n let setResult = data => {\\n content = data[0].title||\\\"\\\";\\n if(data.length>1&&data[1].title&&data[1].title.length>content.length){\\n content=data[1].title;\\n }\\n }\\n let getResCode = () => {\\n return fetch(item.url);\\n }\\n let getContent = new Function(\\\"input\\\", \\\"url\\\", \\\"index\\\", \\\"title\\\", \\\"setResult\\\", \\\"getResCode\\\", \\\"return \\\" + info.parseCode);\\n content = getContent(item.url, item.url, order, item.title, setResult, getResCode) || content || \\\"\\\";\\n } catch (e) {\\n e.message = \\\"<小说正文解析错误> \\\" + e.message;\\n throw e;\\n }\\n if (!content) {\\n toast(\\\"小说为空\\\");\\n throw new Error(\\\"<小说正文解析错误:正文返回为空>\\\");\\n }\\n if (info.bookTopPic) {\\n try {\\n let bookTopPic = Tool.hikerPic(info.bookTopPic);\\n Tool.picDownload(bookTopPic[0], mainPath + info.bookName + \\\".jpg\\\", bookTopPic[1], info.decode);\\n\\n } catch (e) {\\n log(\\\"<封面下载错误> \\\" + e.message);\\n }\\n }\\n File.fileWrite(chapterPath, content.replace(/<script>.*?<\\\\/script>/gmi, \\\"\\\").trimRight());\\n //File.renameFile(chapterPath, order + \\\"$A$\\\" + item.title + \\\".txt\\\");\\n}\\n\\n$.exports.comic = function comic(item, info, order, MY_ID, interrupt) {\\n let mainPath = Config.comicPath + \\\"/\\\" + info.ruleName + \\\"/\\\" + Tool.textShield(info.bookName) + \\\"/\\\";\\n let chapterPath = mainPath + order + \\\"$B$\\\" + Tool.textShield(item.title) + \\\"/\\\";\\n let picList = [];\\n try {\\n let getPicList = new Function(\\\"input\\\", \\\"url\\\", \\\"index\\\", \\\"title\\\", \\\"return\\\" + info.parseCode);\\n picList = getPicList(item.url, item.url, order, item.title);\\n if (typeof picList === \\\"string\\\") {\\n picList = picList.replace(\\\"pics://\\\", \\\"\\\").split(\\\"&&\\\");\\n }\\n } catch (e) {\\n e.message = \\\"<漫画图片解析错误> \\\" + e.message;\\n throw e;\\n }\\n picList = picList.filter(p => p);\\n const L = picList.length;\\n if (L === 0) {\\n toast(\\\"图片链接为空\\\");\\n throw new Error(\\\"<漫画图片解析错误:图片链接返回为空>\\\");\\n }\\n if (info.bookTopPic) {\\n try {\\n let bookTopPic = Tool.hikerPic(info.bookTopPic);\\n Tool.picDownload(bookTopPic[0], mainPath + info.bookName + \\\".jpg\\\", bookTopPic[1], info.decode);\\n } catch (e) {\\n log(\\\"<封面下载错误> \\\" + e.message);\\n }\\n }\\n\\n let errorNum = 0;\\n for (var i = 0; i < L; i++) {\\n try {\\n let pic = Tool.hikerPic(picList[i]);\\n Tool.picDownload(pic[0], chapterPath + (i + 1) + \\\".jpg\\\", pic[1], info.decode);\\n if (interrupt && getMyVar(MY_ID + \\\":status\\\", \\\"\\\") === \\\"1\\\") {\\n return -1;\\n }\\n errorNum = 0;\\n } catch (e) {\\n if (errorNum < 10) {\\n i--;\\n errorNum++;\\n continue;\\n } else {\\n throw e;\\n }\\n }\\n }\\n\\n File.renameFile(chapterPath, order + \\\"$A$\\\" + Tool.textShield(item.title));\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"#v.漫画兼容\",\"path\":\"comicCompatible.view\",\"rule\":\"js:\\nconst File = $.require(\\\"hiker://page/File.js\\\");\\nsetPageTitle(MY_PARAMS.title);\\nlet path=decodeURIComponent(getParam(\\\"path\\\",MY_PARAMS.path));\\nlet filelist = File.getFilePath(path);\\nlet piclist = filelist.map((item, i) => ({\\n col_type: \\\"pic_1_full\\\",\\n url: \\\"hiker://empty\\\",\\n pic_url: path + \\\"/\\\" + (i + 1) + \\\".jpg\\\"\\n}));\\n\\nsetResult(piclist);\\n\"},{\"col_type\":\"movie_3\",\"name\":\"#v.书架\",\"path\":\"Bookrack.view\",\"rule\":\"js:\\nconst File = $.require(\\\"File.js\\\");\\nconst rank = $.require(\\\"fileRank.js\\\");\\nconst Tool = $.require(\\\"Tool.js\\\");\\nconst Config = $.require(\\\"Config.js\\\");\\n\\n(function() {\\n let type = MY_PARAMS.type || getParam(\\\"type\\\", \\\"\\\") || \\\"comic\\\";\\n let ruleName = Tool.textShield(MY_PARAMS.ruleName || decodeURIComponent(getParam(\\\"ruleName\\\")));\\n if (!ruleName) {\\n toast(\\\"请传入规则名\\\");\\n back(false);\\n }\\n if (![\\\"comic\\\", \\\"novel\\\"].includes(type)) {\\n toast(\\\"请传入正确的type:comic novel\\\");\\n back(false);\\n }\\n setPageTitle(ruleName + \\\"|本地书架\\\");\\n let layout = [];\\n let path = Config[type + \\\"Path\\\"] + ruleName;\\n let col_type = getItem(\\\"bookrack:col_type\\\", \\\"movie_3_marquee\\\");\\n let rankMethod = getItem(\\\"bookrack:rankMethod\\\", \\\"系统\\\");\\n let rankIsReverse = getItem(\\\"bookrack:rankIsReverse\\\", \\\"\\\");\\n\\n let colTypes = [\\\"movie_1\\\", \\\"movie_2\\\", \\\"movie_3_marquee\\\", \\\"movie_1_vertical_pic\\\", \\\"pic_2\\\", \\\"pic_3\\\", \\\"pic_3_square\\\", \\\"pic_2_card\\\"];\\n \\n let rankMethods = [\\\"系统\\\", \\\"大小\\\", \\\"名称\\\", \\\"时间\\\"];\\n layout.push({\\n url: '\\\"hiker://search?s=\\\"+input',\\n desc: \\\"搜你想要的#\\\" + type + \\\"#......\\\",\\n title: \\\"🔍\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n rules: $.toString((ruleName, type) => {\\n let arr1 = [{\\n \\\"title\\\": ruleName,\\n \\\"search_url\\\": \\\"hiker://empty?isAll=1&searchTerms=**&type=\\\" + type,\\n \\\"searchFind\\\": \\\"js:$.require('hiker://page/Search.view?rule='+MY_RULE._title);\\\"\\n }];\\n \\n return JSON.stringify(arr1);\\n }, ruleName, type),\\n /*defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"*/\\n }\\n });\\n\\n layout.push({\\n title: \\\"🧩\\\",\\n col_type: \\\"flex_button\\\",\\n url: $(colTypes.map(v=>v===col_type?\\\"““\\\"+v+\\\"””\\\":v)).select((name) => {\\n if(/““.*?””/.test(input)) return;\\n setItem(\\\"bookrack:col_type\\\", input);\\n refreshPage();\\n })\\n });\\n for (let name of rankMethods) {\\n let a = rankMethod === name;\\n let titlea = a ? \\\"‘‘\\\" + name + \\\"’’\\\" : name;\\n let titleb = \\\"\\\";\\n if (a) {\\n titleb = !rankIsReverse ? \\\"↓\\\" : \\\"↑\\\";\\n } else {\\n titleb = \\\"↕\\\";\\n }\\n layout.push({\\n title: titlea + titleb,\\n col_type: \\\"flex_button\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((name) => {\\n let rankMethod = getItem(\\\"bookrack:rankMethod\\\", \\\"系统\\\");\\n let rankIsReverse = getItem(\\\"bookrack:rankIsReverse\\\", \\\"\\\");\\n\\n if (rankMethod === name) {\\n if (rankIsReverse) {\\n rankIsReverse = \\\"\\\";\\n } else {\\n rankIsReverse = \\\"1\\\";\\n }\\n\\n setItem(\\\"bookrack:rankIsReverse\\\", rankIsReverse);\\n } else {\\n setItem(\\\"bookrack:rankIsReverse\\\", \\\"\\\");\\n setItem(\\\"bookrack:rankMethod\\\", name);\\n\\n }\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, name)\\n });\\n }\\n let rankMethodMap = {\\n \\\"系统\\\": \\\"\\\",\\n \\\"大小\\\": \\\"size\\\",\\n \\\"名称\\\": \\\"name\\\",\\n \\\"时间\\\": \\\"time\\\"\\n };\\n let bookList = [];\\n let list = rank(File.getFiles(path, \\\"dir\\\"), rankMethodMap[rankMethod]);\\n if (list.length === 0) {\\n bookList.push({\\n title: \\\"““””\\\" + \\\"啥都没有耶\\\".big(),\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n\\n }\\n let pageUrl = type === \\\"novel\\\" ? \\\"hiker://page/NovelBrowser.view\\\" : \\\"hiker://page/ComicBrowser.view\\\";\\n for (let item of list) {\\n let pic = fileExist(\\\"file://\\\" + item.getPath() + \\\"/\\\" + item.getName() + \\\".jpg\\\") ? item.getPath() + \\\"/\\\" + item.getName() + \\\".jpg\\\" : Config.def_Pic;\\n bookList.push({\\n title: item.getName(),\\n pic_url: pic,\\n url: type === \\\"novel\\\" ?pageUrl + \\\"?rule=\\\" + MY_RULE.title:$(\\\"#noLoading#\\\").lazyRule((pageUrl, path)=>{\\n return $.require(\\\"longPress.js\\\").singleEnter(pageUrl, path);\\n }, pageUrl, item.path),\\n col_type:col_type,\\n extra: {\\n longClick: [{\\n title: \\\"删除\\\",\\n js: $.toString((path) => {\\n return $.require(\\\"longPress.js\\\").deleteFileForBook(path);\\n }, item.getPath())\\n }],\\n id: item.getPath(),\\n path: item.getPath(),\\n name: item.getName()\\n }\\n });\\n }\\n if (rankIsReverse) {\\n bookList.reverse();\\n }\\n\\n setResult(layout.concat(bookList));\\n})();\"},{\"col_type\":\"movie_3\",\"name\":\"#f.文件排序\",\"path\":\"fileRank.js\",\"rule\":\"js:\\nconst File = $.require(\\\"File.js\\\");\\nlet chnNumChar = {\\n 零: 0,\\n 一: 1,\\n 二: 2,\\n 三: 3,\\n 四: 4,\\n 五: 5,\\n 六: 6,\\n 七: 7,\\n 八: 8,\\n 九: 9\\n};\\n\\nlet chnNameValue = {\\n 十: {\\n value: 10,\\n secUnit: false\\n },\\n 百: {\\n value: 100,\\n secUnit: false\\n },\\n 千: {\\n value: 1000,\\n secUnit: false\\n },\\n 万: {\\n value: 10000,\\n secUnit: true\\n },\\n 亿: {\\n value: 100000000,\\n secUnit: true\\n }\\n}\\n\\nfunction ChineseToNumber(chnStr) {\\n let rtn = 0;\\n let section = 0;\\n let number = 0;\\n let secUnit = false;\\n let str = chnStr.split('');\\n\\n for (let i = 0; i < str.length; i++) {\\n let num = chnNumChar[str[i]];\\n if (typeof num !== 'undefined') {\\n number = num;\\n if (i === str.length - 1) {\\n section += number;\\n }\\n } else {\\n let unit = chnNameValue[str[i]].value;\\n secUnit = chnNameValue[str[i]].secUnit;\\n if (secUnit) {\\n section = (section + number) * unit;\\n rtn += section;\\n section = 0;\\n } else {\\n section += (number * unit);\\n }\\n number = 0;\\n }\\n }\\n return rtn + section;\\n}\\n\\nfunction nameCompare(a, b) {\\n if (a == null || b == null)\\n return a == null ? b == null ? 0 : -1 : 1;\\n\\n a = a.replace(/([零一二三四五六七八九十百千万亿])/g, function(match, p1, p2, p3, offset, string) {\\n // p1 is nondigits, p2 digits, and p3 non-alphanumerics\\n return v.ChineseToNumber(p1);\\n })\\n b = b.replace(/([零一二三四五六七八九十百千万亿])/g, function(match, p1, p2, p3, offset, string) {\\n // p1 is nondigits, p2 digits, and p3 non-alphanumerics\\n return v.ChineseToNumber(p1);\\n })\\n\\n let NUMBERS = java.util.regex.Pattern.compile(\\\"(?<=\\\\\\\\D)(?=\\\\\\\\d)|(?<=\\\\\\\\d)(?=\\\\\\\\D)\\\");\\n let split1 = NUMBERS.split(new java.lang.String(a));\\n let split2 = NUMBERS.split(new java.lang.String(b));\\n\\n for (let i = 0; i < Math.min(split1.length, split2.length); i++) {\\n let c1 = split1[i].charCodeAt(0);\\n let c2 = split2[i].charCodeAt(0);\\n let cmp = 0;\\n let zeroCharCode = '0'.charCodeAt(0);\\n let nineCharCode = '9'.charCodeAt(0);\\n\\n if (c1 >= zeroCharCode && c1 <= nineCharCode && c2 >= zeroCharCode && c2 <= nineCharCode) {\\n cmp = new java.math.BigInteger(split1[i]).compareTo(new java.math.BigInteger(split2[i]));\\n }\\n\\n if (cmp === 0) {\\n let regex = /[a-zA-Z0-9]/\\n let s1 = String(split1[i])\\n let s2 = String(split2[i])\\n if (regex.test(s1) || regex.test(s2)) {\\n cmp = new java.lang.String(split1[i]).compareTo(new java.lang.String(split2[i]));\\n // cmp = s1.localeCompare(s2, 'en')\\n } else {\\n cmp = s1.localeCompare(s2, 'zh')\\n }\\n }\\n\\n if (cmp !== 0) {\\n return cmp;\\n }\\n }\\n let lengthCmp = split1.length - split2.length;\\n // if (lengthCmp !== 0) lengthCmp = lengthCmp > 0 ? -1 : 1;\\n return lengthCmp;\\n}\\n\\nfunction rank(list, m) {\\n switch (m) {\\n case \\\"type\\\":\\n return list;\\n case \\\"name\\\":\\n return list.sort((a, b) => nameCompare(String(a.getName()), String(b.getName())));\\n case \\\"size\\\":\\n return list.sort((a, b) => File.getTotalSizeOfFilesInDir(a) - File.getTotalSizeOfFilesInDir(b));\\n case \\\"time\\\":\\n return list.sort((a, b) => a.lastModified() - b.lastModified());\\n default:\\n return list;\\n }\\n\\n}\\n$.exports=rank;\"},{\"col_type\":\"movie_3\",\"name\":\"#v.epub解析器\",\"path\":\"epubParser.view\",\"rule\":\"js:\\nvar layout = [];\\nsetPageTitle(\\\"书籍信息\\\");\\nlet path = decodeURIComponent(getParam(\\\"path\\\") || \\\"\\\") || MY_PARAMS.path;\\nlet meta = getEpubMetadata(path);\\n//log(meta)\\n\\nlayout.push({\\n title: meta.firstTitle,\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n extra: {\\n lineVisible: false\\n }\\n});\\n\\nlayout.push({\\n title: \\\"👤作者:\\\" + meta.authors[0].lastname,\\n col_type: \\\"rich_text\\\",\\n});\\nlet description = (meta.descriptions[0] || \\\"\\\").replace(/<p.*?>|<\\\\/p>/g, \\\"\\\");\\nlet tdescription = description;\\nif (description) {\\n \\n if (description.length > 50) {\\n description = description.substring(0, 50) +\\\"......\\\" +\\\"更多>\\\".link($().b64(\\\"'\\\").rule(() => {\\n setPageTitle(\\\"简介\\\");\\n setResult([{\\n title: \\\"简介:<br>  \\\" + MY_PARAMS.text,\\n col_type: \\\"rich_text\\\",\\n\\n }]);\\n }));\\n }\\n layout.push({\\n title: \\\"📝简介:<br>  \\\"+description,\\n col_type: \\\"rich_text\\\",\\n extra: {\\n text: tdescription\\n }\\n });\\n}\\n//setPageTitle(meta.firstTitle);\\nlayout.push({\\n col_type: \\\"line_blank\\\",\\n url: \\\"hiker://empty\\\"\\n});\\nlet chapters = getEpubChapters(path);\\nfor (let it of chapters) {\\n layout.push({\\n title: it.title,\\n url: \\\"hiker://page/epubViewer.view#readTheme##autoPage#\\\",\\n col_type: \\\"text_1\\\",\\n extra: {\\n href: it.url,\\n path: path,\\n title: it.title\\n }\\n });\\n}\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#v.epub查看器\",\"path\":\"epubViewer.view\",\"rule\":\"js:\\nlet path = MY_PARAMS.path;\\nlet url = MY_PARAMS.href;\\nlet c = getEpubContent(path, url);\\n//let a= c.replace(/\\\\s?<div.*?>|<\\\\/div>\\\\s?/g, \\\"\\\").replace(/\\\\s?<p.*?>(.*)<\\\\/p>\\\\s?/g, \\\"\\\\u3000\\\\u3000$1<br>\\\");\\n//let b=c.replace(/\\\\s?<div.*?>|<\\\\/div>\\\\s?/g, \\\"\\\").replace(/\\\\s?<p.*?>(.*?)<\\\\/p>\\\\s?/g, \\\"\\\\u3000\\\\u3000$1<br>\\\");\\n//log(a==b)\\n//log(getEpubContent0(path, url))\\n\\nlet layout = [];\\nlayout.push({\\n col_type: \\\"rich_text\\\",\\n title: (\\\"<strong>\\\" + MY_PARAMS.title + \\\"</strong>\\\").big(),\\n});\\n\\nlayout.push({\\n title: c,\\n col_type: 'rich_text',\\n extra: {\\n textSize: 18,\\n click: true\\n }\\n});\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"#v文件管理\",\"path\":\"FileManagement.view\",\"rule\":\"js:\\nconst Config = $.require(\\\"hiker://page/Config.js\\\");\\nlet url = \\\"http://hiker.nokia.press/hikerule/rulelist.json?id=5099\\\";\\nlet f = $.require(url);\\nlet type = getParam(\\\"type\\\", \\\"homePath\\\");\\naddListener(\\\"onClose\\\", () => {\\n refreshPage();\\n});\\nlet hikerPath = \\\"file://\\\" + Config.homePath;\\nif(!fileExist(hikerPath)){\\n writeFile(hikerPath+\\\"/创建目录.txt\\\",\\\"\\\");\\n deleteFile(hikerPath+\\\"/创建目录.txt\\\");\\n}\\nf.fileSelection({\\n callback: $.toString(() => {\\n //根据文件扩展名,用不同小程序打开\\n if (\\\".jpg\\\" === TYPE) {\\n return PATH;\\n } else if (\\\".txt\\\" === TYPE) {\\n return \\\"hiker://page/txtParser.view?isCache=true&rule=\\\" + MY_RULE.title + \\\"&path=\\\" + PATH;\\n } else if (\\\".epub\\\" === TYPE) {\\n return \\\"hiker://page/epubParser.view#autoCache#?rule=\\\" + MY_RULE.title + \\\"&path=\\\" + PATH;\\n } else {\\n return $(\\\"无法打开,是否使用其他应用打开?\\\").confirm(path => \\\"openFile://file://\\\" + path, PATH);\\n }\\n }),\\n initialPath: Config[type],\\n rootDirPath: Config.homePath,\\n //onClickType: \\\"confirm\\\",\\n //memory: \\\"FileManagement:memory\\\",\\n fileType: \\\"\\\\.txt|\\\\.epub|.jpg\\\",\\n //cHomeTips: \\\"是否使用海阔小程序打开[${name}]?\\\",\\n //cSearchTips: \\\"是否使用海阔小程序打开[${path}]?\\\"\\n});\"},{\"col_type\":\"movie_3\",\"name\":\"#j.Config\",\"path\":\"Config.js\",\"rule\":\"js:\\nconst File = $.require(\\\"hiker://page/File.js?rule=本地资源管理\\\");\\n\\nlet localConfig = {};\\n\\ntry {\\n localConfig = JSON.parse(File.readFile(getPath(\\\"hiker://files/rules/files/本地资源管理/config.json\\\").slice(7)));\\n} catch (e) {\\n deleteFile(\\\"config.json\\\");\\n}\\nconst Config = Object.assign({\\n homePath: getPath(\\\"hiker://files/localManager\\\").slice(7),\\n logNum: 10,\\n threadNum: 0,\\n def_isPaginate: \\\"1\\\", //1默认开启分页,0默认关闭\\n viewPageSize: 200,\\n def_Pic: \\\"hiker://images/home_pic4\\\",\\n def_Lord_Type: \\\"comic\\\",\\n def_View_Style: \\\"text_1\\\",\\n def_DoVi_Style: \\\"text_2\\\",\\n def_DoVi_Type: \\\"1\\\", //0全部, 1未完成,2已完成\\n def_isComicCompatible: \\\"0\\\",\\n def_Comic_Style: \\\"text_1\\\"\\n}, localConfig);\\nconst PATHS = {\\n novelPath: \\\"/小说/\\\",\\n comicPath: \\\"/漫画/\\\",\\n novelFullPath: \\\"/小说合并/\\\",\\n externalImportPath: \\\"/外导小说/\\\",\\n contentsCache: \\\"/目录缓存/\\\"\\n}\\n\\n\\nObject.keys(PATHS).forEach(key => Config[key] = Config.homePath + PATHS[key]);\\n\\n$.exports = Config;\"}]","proxy":"","icon":"https://hikerfans.com/tubiao/q/58.png"},{"last_chapter_rule":"","title":"期刊杂志demo","author":"Joker","version":6,"type":"read","url":"hiker://empty##fypage","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nlet d = [];\nlet now = getItem('now', '推荐期刊');\nif (MY_PAGE == 1) {\n let arr = ['推荐期刊', '热门期刊', '直播', '收藏'];\n for (let it of arr) {\n d.push({\n title: now == it ? '““””' + it.fontcolor('red') : it,\n col_type: 'scroll_button',\n url: $('#noLoading#').lazyRule((it) => {\n setItem(\"now\", it);\n refreshPage();\n return 'hiker://empty';\n }, it)\n })\n }\n d.push({\n title: '规则设置',\n col_type: 'scroll_button',\n url: 'hiker://page/setting'\n });\n}\nif (now == '直播') {\n eval(JSON.parse(fetch(\"hiker://page/getHeaders\")).rule);\n let zb_list = JSON.parse(request(\"https://api.lifves.com/magazine/source\", {\n headers: headers\n })).data_list.live_source_list,\n select_list = zb_list.select_list,\n source_list = zb_list.source_list,\n select_zb = getItem('select_zb', select_list[0].value);\n if (MY_PAGE == 1) {\n d.push({\n col_type: \"blank_block\"\n });\n for (let obj of select_list) {\n d.push({\n title: obj.value == select_zb ? '““””' + obj.label.fontcolor('red') : obj.label,\n url: $('#noLoading#').lazyRule((e) => {\n setItem('select_zb', e);\n refreshPage();\n return 'hiker://empty'\n }, obj.value),\n col_type: \"scroll_button\"\n });\n }\n for (let it of source_list[select_zb].list) {\n d.push({\n title: it.title,\n url: $().lazyRule((tag) => {\n eval(JSON.parse(fetch(\"hiker://page/getHeaders\")).rule);\n let list = JSON.parse(request('http://api.lifves.com/video/getLiveSourceLink?tag=' + tag, {\n headers: headers\n })).data_list,\n urls = list.map(v => v.href);\n return JSON.stringify({\n urls: urls\n });\n }, it.tag),\n col_type: \"icon_4_card\",\n desc: it.sub_title,\n pic_url: it.img\n });\n }\n }\n} else if (now == '推荐期刊' || now == '热门期刊') {\n eval(JSON.parse(fetch(\"hiker://page/getHeaders\")).rule);\n let category_id = now == \"推荐期刊\" ? 0 : 1,\n qk_list = JSON.parse(request(\"https://api.lifves.com/magazine/more?category_id=\" + category_id + \"&page=\" + MY_PAGE, {\n headers: headers\n })).data_list;\n for (let i in qk_list) {\n let it = qk_list[i];\n d.push({\n title: it.title,\n desc: it.qishu,\n img: it.img,\n col_type: 'movie_3',\n url: 'hiker://page/catalogue#immersiveTheme#',\n extra: {\n href: 'https://api.lifves.com/magazine/book?mag_id=' + it.mag_id + '&qishu=' + it.qishu,\n }\n });\n }\n} else if (now == '收藏') {\n if (MY_PAGE == 1) {\n let collection = JSON.parse(readFile('collection') || '{}');\n for (let i in collection) {\n let it = collection[i];\n d.push({\n title: i,\n col_type: 'movie_3',\n img: it.img,\n url: 'hiker://page/history',\n extra: {\n href: it.url,\n title: i,\n img: it.img\n }\n })\n }\n }\n}\nsetResult(d);","searchFind":"js:\nlet d = [];\neval(JSON.parse(fetch(\"hiker://page/getHeaders\")).rule);\nlet qk_list = JSON.parse(request(\"https://api.lifves.com/magazine/search?keyword=\" + MY_URL.split(\"##\")[1], {\n headers: headers\n})).data_list;\nfor (let i in qk_list) {\n let it = qk_list[i];\n d.push({\n title: it.title,\n desc: it.qishu,\n img: it.img,\n col_type: 'movie_3',\n url: 'hiker://page/catalogue#immersiveTheme#',\n extra: {\n href: 'https://api.lifves.com/magazine/book?mag_id=' + it.mag_id + '&qishu=' + it.qishu,\n }\n });\n}\nsetResult(d);","search_url":"hiker://empty##**","group":"①推荐","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"目录\",\"path\":\"catalogue\",\"rule\":\"js:\\neval(JSON.parse(fetch(\\\"hiker://page/getHeaders\\\")).rule);\\nlet readTheme = getItem('readTheme', 'false') == 'true' ? '#readTheme#' : '',\\n fullTheme = getItem('fullTheme', 'true') == 'true' ? '#fullTheme#' : '',\\n url = MY_PARAMS.href,\\n data_list = JSON.parse(request(url, {\\n headers: headers\\n })).data_list;\\n\\nlet d = [];\\nd.push({\\n title: data_list.title + \\\"\\\\n\\\" + data_list.qishu,\\n desc: \\\"““””\\\" + \\\"点我查看往期期刊\\\".bold().big(),\\n img: data_list.img,\\n col_type: 'movie_1_vertical_pic_blur',\\n url: \\\"hiker://page/history\\\",\\n extra: {\\n href: \\\"https://api.lifves.com/magazine/history?mag_id=\\\" + data_list.mag_id,\\n title: data_list.title,\\n img: data_list.img\\n }\\n})\\nd.push({\\n title: '目录'.big().bold(),\\n col_type: 'rich_text'\\n})\\n\\nlet stroge = {};\\nfor (let i in data_list.ml) {\\n let list = data_list.ml[i].list;\\n for (let j in list) {\\n stroge[list[j].title] = \\\"https://api.lifves.com/magazine/read?read_id=\\\" + list[j].read_id;\\n }\\n}\\nsaveFile('stroge', JSON.stringify(stroge));\\nlet star = Object.keys(stroge);\\n\\nfor (let i in data_list.ml) {\\n let item = data_list.ml[i];\\n d.push({\\n title: '““””<strong>▶' + item.title + '</strong>',\\n col_type: 'text_1',\\n url: \\\"hiker://empty\\\",\\n extra: {\\n lineVisible: false\\n }\\n })\\n\\n item.list.forEach(e => {\\n let index = star.indexOf(e.title);\\n d.push({\\n title: '““””&nbsp;&nbsp;&nbsp;&nbsp;•' + e.title,\\n col_type: 'text_1',\\n url: 'hiker://page/text' + fullTheme + readTheme,\\n extra: {\\n lineVisible: false,\\n href: \\\"https://api.lifves.com/magazine/read?read_id=\\\" + e.read_id,\\n index: index\\n }\\n })\\n })\\n}\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"获取请求头\",\"path\":\"getHeaders\",\"rule\":\" function random_char(t) {\\n for (var n = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'], i = '', e = 0; e < t; e++) {\\n var o = Math.ceil(35 * Math.random())\\n i += n[o]\\n }\\n return i\\n }\\n\\n function getSecretdate() {\\n var t = parseInt((new Date()).getTime() / 1e3)\\n var n = random_char(32)\\n var i = 'timestamp=' + t + '&nonce=' + n\\n return i\\n }\\n\\n\\n var secretdate = getSecretdate()\\n var secreted = md5(secretdate + 'apilifves5201314')\\n\\n var headers = {\\n 'Secret-Date': secretdate,\\n 'Secreted': secreted,\\n \\\"Content-Type\\\": \\\"application/json;charset=utf-8\\\"\\n }\"},{\"col_type\":\"movie_3\",\"name\":\"往期期刊\",\"path\":\"history\",\"rule\":\"js:\\naddListener('onClose', 'clearVar(\\\"year\\\")');\\neval(JSON.parse(fetch(\\\"hiker://page/getHeaders\\\")).rule);\\nlet d = [],\\n {\\n href: url,\\n title: name,\\n img\\n } = MY_PARAMS,\\n collection = JSON.parse(readFile('collection') || '{}'),\\n isCollected = !!(collection[name] && collection[name].url == url),\\n data_list = JSON.parse(request(url, {\\n headers: headers\\n })).data_list;\\nsetPageTitle(name);\\nsetLastChapterRule('js:' + $.toString(() => {\\n eval(JSON.parse(fetch(\\\"hiker://page/getHeaders\\\")).rule);\\n let url = MY_PARAMS.href,\\n data_list = JSON.parse(request(url, {\\n headers: headers\\n })).data_list,\\n data = data_list[0].data[0].qishu;\\n setResult('最新:' + data);\\n}));\\nd.push({\\n title: isCollected ? '♥已收藏' : '♡添加收藏',\\n url: $().lazyRule((is, url, name, img) => {\\n let collection = JSON.parse(readFile('collection') || '{}');\\n if (is) {\\n delete collection[name];\\n saveFile('collection', JSON.stringify(collection));\\n refreshPage();\\n return 'toast://已取消收藏'\\n } else {\\n collection[name] = {\\n url: url,\\n img: img\\n };\\n saveFile('collection', JSON.stringify(collection));\\n refreshPage();\\n return 'toast://已添加收藏'\\n }\\n }, isCollected, url, name, img),\\n col_type: \\\"scroll_button\\\",\\n});\\n\\nlet data = {},\\n now = getVar('year', String(data_list[0].year));\\nfor (let list of data_list) {\\n if (now == list.year) data = list.data;\\n d.push({\\n title: '““””' + (list.year == now ? '<font color=red>' + list.year + '</font>' : list.year),\\n col_type: 'scroll_button',\\n url: $().lazyRule((year) => {\\n putVar('year', String(year));\\n refreshPage();\\n return 'hiker://empty'\\n }, list.year)\\n });\\n}\\nfor (let item of data) {\\n d.push({\\n title: item.qishu,\\n url: 'hiker://page/catalogue#immersiveTheme#',\\n img: item.img,\\n extra: {\\n href: \\\"https://api.lifves.com/magazine/book?mag_id=\\\" + item.mag_id + \\\"&qishu=\\\" + item.qishu\\n }\\n });\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"文章\",\"path\":\"text\",\"rule\":\"js:\\naddListener('onClose', $.toString(() => {\\n clearVar('texthref');\\n clearVar('texttitle');\\n clearVar('textindex');\\n}));\\nlet click = getItem('click', 'true'),\\n fontsize = parseInt(getItem('fontsize', String(17))),\\n indent = parseInt(getItem('indent', String(7))),\\n indents = '';\\nfor (let i = 0; i < indent; i++) {\\n indents += '&nbsp;';\\n}\\nlet stroge = JSON.parse(readFile('stroge')),\\n star = Object.keys(stroge);\\n\\neval(JSON.parse(fetch(\\\"hiker://page/getHeaders\\\")).rule);\\nlet index = parseInt(getVar('textindex') || MY_PARAMS.index),\\n href = getVar('texthref', '') || MY_PARAMS.href,\\n data_list = JSON.parse(request(href, {\\n headers: headers\\n })).data_list;\\n\\nlet d = [];\\nd.push({\\n title: '““””<h2>' + data_list.title + '</h2>',\\n col_type: 'text_center_1',\\n url: \\\"http://qk.demo.lifves.com/book/read/\\\" + data_list.mag_id + \\\"/\\\" + data_list.qishu + \\\"/\\\" + data_list.read_id,\\n extra: {\\n lineVisible: false\\n }\\n}, {\\n title: data_list.content.replace(/\\\\>[a-zA-Z0-9+=\\\\-\\\\/]*\\\\</g, '><').replace(/(\\\\<p\\\\>\\\\s*)+\\\\</g,'<').replace(/\\\\<p\\\\>/g, '<p>' + indents),\\n col_type: 'rich_text',\\n extra: {\\n textSize: fontsize,\\n click: click\\n }\\n})\\nif (index != 0) {\\n let title = star[index - 1];\\n let href = stroge[title];\\n d.push({\\n title: '上一篇:' + title,\\n col_type: 'text_center_1',\\n url: $('hiker://empty#noLoading#').lazyRule((href, title, index) => {\\n putVar('texthref', href);\\n putVar('texttitle', title);\\n putVar('textindex', String(index - 1));\\n refreshPage();\\n return 'hiker://empty'\\n }, href, title, index),\\n extra: {\\n href: href,\\n lineVisible: false\\n }\\n })\\n}\\nif (index != star.index) {\\n let title = star[index + 1];\\n let href = stroge[title];\\n d.push({\\n title: '下一篇:' + title,\\n col_type: 'text_center_1',\\n url: $('hiker://empty#noLoading#').lazyRule((href, title, index) => {\\n putVar('texthref', href);\\n putVar('texttitle', title);\\n putVar('textindex', String(index + 1));\\n refreshPage();\\n return 'hiker://empty'\\n }, href, title, index),\\n extra: {\\n href: href,\\n lineVisible: false\\n }\\n })\\n}\\nfor (let i = 0; i < 10; i++) {\\n d.push({\\n col_type: 'blank_block'\\n })\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"设置页\",\"path\":\"setting\",\"rule\":\"js:\\nlet d = [];\\nlet fontsize = parseInt(getItem('fontsize', String(17)));\\nlet indent = parseInt(getItem('indent', String(7)));\\nlet indents = '';\\nfor (let i = 0; i < indent; i++) {\\n indents += '&nbsp;';\\n}\\nlet readTheme = getItem('readTheme','false');\\nlet fullTheme = getItem('fullTheme', 'true');\\nlet click = getItem('click', 'true');\\n\\nd.push({\\n title: '阅读模式' + (readTheme == 'true' ? '✔' : '✘'),\\n col_type: 'text_3',\\n url: readTheme == 'true' ? $('hiker://empty#noLoading#').lazyRule(() => {\\n setItem('readTheme', 'false');\\n refreshPage();\\n return 'hiker://empty';\\n }) :$('注意:开启阅读模式后,全屏模式设置和字号设置将不起作用!').confirm(() => {\\n setItem('readTheme', 'true');\\n refreshPage();\\n return 'hiker://empty';\\n })\\n})\\nd.push({\\n title: '全屏模式' + (fullTheme == 'true' ? '✔' : '✘'),\\n col_type: 'text_3',\\n url: $('hiker://empty#noLoading#').lazyRule((i) => {\\n setItem('fullTheme', i == 'true' ? 'false' : 'true');\\n refreshPage();\\n return 'hiker://empty';\\n }, fullTheme)\\n})\\nd.push({\\n title: '点击翻页' + (click == 'true' ? '✔' : '✘'),\\n col_type: 'text_3',\\n url: $('hiker://empty#noLoading#').lazyRule((i) => {\\n setItem('click', i == 'true' ? 'false' : 'true');\\n refreshPage();\\n return 'hiker://empty';\\n }, click)\\n})\\n\\nd.push({\\n title: '调整字号'.big().bold(),\\n col_type: 'rich_text'\\n})\\nd.push({\\n title: '字号➕',\\n col_type: 'flex_button',\\n url: $(\\\"hiker://empty#noLoading#\\\").lazyRule((s) => {\\n setItem('fontsize', String(s + 1));\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, fontsize)\\n}, {\\n title: '字号➖',\\n col_type: 'flex_button',\\n url: $(\\\"hiker://empty#noLoading#\\\").lazyRule((s) => {\\n setItem('fontsize', String(s - 1));\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, fontsize)\\n})\\n\\nd.push({\\n col_type: 'line'\\n})\\n\\nd.push({\\n title: '调整缩进'.big().bold(),\\n col_type: 'rich_text'\\n})\\nd.push({\\n title: '缩进➕',\\n col_type: 'flex_button',\\n url: $(\\\"hiker://empty#noLoading#\\\").lazyRule((s) => {\\n setItem('indent', String(s + 1));\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, indent)\\n}, {\\n title: '缩进➖',\\n col_type: 'flex_button',\\n url: $(\\\"hiker://empty#noLoading#\\\").lazyRule((s) => {\\n setItem('indent', String(s - 1));\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, indent)\\n})\\n\\nd.push({\\n col_type: 'line'\\n})\\n\\nd.push({\\n title: '预览'.big() + '(字号:' + fontsize + ',缩进:' + indent + ')',\\n col_type: 'rich_text'\\n}, {\\n title: '<p>小棉袄帅吗?</p><p>小棉袄怎么这么帅?</p><p>小棉袄真是超超超超超超超超级帅!!!!帅炸了好不好?举世颜无双!!!!</p>'.replace(/\\\\<p\\\\>/g, '<p>' + indents),\\n col_type: 'rich_text',\\n extra: {\\n textSize: fontsize\\n }\\n})\\nsetResult(d);\"}]","proxy":"","icon":"http://qk.demo.lifves.com/favicon.ico"},{"last_chapter_rule":"","title":"游戏集𝔥","author":"小棉袄🌞&小🔥星&鬼四&爱是用心&Joker&妄炁&阿钊&Hood","version":7,"type":"other","url":"hiker://empty","col_type":"icon_round_small_4","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\r\nvar res = {};\r\nvar d = [];\r\nvar html = getResCode();\n\nd.push({\n title: \"更新数据\",\n pic_url: \"https://pic.imgdb.cn/item/64841a7c1ddac507cc8f4280.jpg\",\n url: $(\"#noLoading#\").lazyRule(() => {\n confirm({\n title: \" 确认更新数据?\",\n content: \"这会覆盖本地文件\",\n confirm: `eval(JSON.parse(fetch('hiker://page/update')).rule);refreshPage();'toast://数据已更新'`,\n cancel: ''\n });\n return 'hiker://empty'\n }),\n col_type: 'avatar'\n});\n\n//列表\neval(fetch(\"hiker://files/rules/Hood/yxj.json\"));\n\nfor(var i in list){\n let picurl = list[i].split(\",\")[2];\n if(!picurl) picurl = \"https://pic.imgdb.cn/item/6343873a16f2c2beb14176b7.png\";\n d.push({\n title: list[i].split(\",\")[0],\n pic_url: picurl + \"@Referer=\",\n url: list[i].split(\",\")[1] + \"#gameTheme#\"\n });\n}\n\r\nres.data = d;\r\nsetHomeResult(res);","searchFind":"","search_url":"","group":"①推荐","detail_col_type":"movie_1","detail_find_rule":"js:\nsetResult([{\n col_type: 'x5_webview_single',\n url: MY_URL,\n desc: \"auto&&float\",\n extra: {\n canBack: true\n }\n}])","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"//自动更新?1启用, 0关闭\nvar update = 1;\n\n//更新间隔, 单位为天\nvar uptime = 3;\n\nvar local = \"hiker://files/rules/Hood/yxj.json\";\nvar date_txt = \"hiker://files/cache/update/yxj.txt\";\n\n//计算时间间隔\nvar start = new Date(fetch(date_txt)); \nvar now = new Date(); \nvar D_T = now.getTime() - start.getTime(); \nvar D_D = D_T / (1000 * 3600 * 24);\nvar mytime=parseInt(D_D)+'';\n\nif(!fetch(date_txt) || !fetch(local) || (update==1&&mytime>=uptime)){\n try{\n var cloud = base64Decode(fetch(\"https://ghproxy.net/https://raw.githubusercontent.com/xixifree/Hiker/main/yxj.json\",{\n dns: \"51.195.241.253\"\n }));\n if(cloud.includes(\"合集\")){\n writeFile(local,cloud);\n writeFile(date_txt,new Date()+'');\n }\n }catch(e){}\n}","pages":"[{\"col_type\":\"movie_3\",\"name\":\"更新数据\",\"path\":\"update\",\"rule\":\"var cloud = base64Decode(fetchCache(\\\"https://ghproxy.net/https://raw.githubusercontent.com/xixifree/Hiker/main/yxj.json\\\", 24, {\\n dns: \\\"51.195.241.253\\\"\\n}));\\nif (cloud.includes(\\\"合集\\\")) {\\n writeFile(\\\"hiker://files/rules/Hood/yxj.json\\\", cloud);\\n writeFile(\\\"hiker://files/cache/update/yxj.txt\\\", new Date() + '');\\n}\"}]","proxy":"","icon":"https://hikerfans.com/tubiao/ke/58.png"},{"last_chapter_rule":"","title":"简易文件管理","author":"@LoyDgIk","version":0,"type":"other","url":"hiker://empty#noRefresh#","col_type":"text_1","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:$.require(\"hiker://page/Main\");","searchFind":"","search_url":"","group":"①推荐","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"Main\",\"path\":\"Main\",\"rule\":\"js:\\nlet d = [];\\n\\nd.push({\\n title: \\\"设置\\\",\\n url: \\\"hiker://page/设置#noRefresh#\\\",\\n pic_url: \\\"hiker://images/icon_setting6\\\",\\n col_type: \\\"avatar\\\",\\n\\n});\\n//let k = \\\"file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/rules/LoyDgIk/选择文件.js\\\";\\nlet k = \\\"http://hiker.nokia.press/hikerule/rulelist.json?id=5099\\\";\\nlet f = require(k);\\n\\nf.fileSelection({\\n callback: $.toString(() => {\\n //根据文件扩展名,用不同小程序打开\\n /*if (TYPE === \\\".json\\\") {\\n return 'hiker://page/interface#noHistory##noRecordHistory#?rule=JSON编辑器&Json=' + base64Encode(\\\"file://\\\" + PATH)\\n } else if (TYPE === \\\".html\\\") {\\n return \\\"web://file://\\\" + PATH;\\n } else if ([\\\".js\\\", \\\".txt\\\"].includes(TYPE)) {\\n return \\\"editFile://file://\\\" + PATH\\n } else if ([\\\".jpg\\\", \\\".svg\\\", \\\".mp3\\\", \\\".mp4\\\", \\\".m3u8\\\"].includes(TYPE)) {\\n return \\\"file://\\\" + PATH\\n } else if (\\\".hiker\\\" === TYPE) {\\n return \\\"rule://\\\" + base64Encode(request(\\\"file://\\\" + PATH));\\n } else {\\n return $(\\\"无法打开,是否使用其他应用打开?\\\").confirm(path => \\\"openFile://file://\\\" + path, PATH);\\n }*/\\n let waylist=readFile(\\\"waylist.json\\\",0);\\n if(!waylist){\\n waylist=$.require(\\\"Default\\\");\\n }else{\\n try{\\n waylist=JSON.parse(waylist);\\n }catch{\\n \\n }\\n }\\n let g=waylist.find(x=>x.type.includes(TYPE));\\n if(!g) return $(\\\"无法打开,是否使用其他应用打开?\\\").confirm(path => \\\"openFile://file://\\\" + path, PATH);\\n if(g.way.startsWith(\\\"<js>\\\")){\\n return eval(g.way.replace(\\\"<js>\\\",\\\"\\\"));\\n }else{\\n return g.way.replace(/\\\\{\\\\{\\\\PATH}\\\\}/g,PATH).replace(/\\\\{\\\\{\\\\TYPE}\\\\}/g,TYPE);\\n }\\n }),\\n initialPath: getItem(\\\"初始目录\\\", getPath(\\\"hiker://files/\\\").slice(7)),\\n rootDirPath: \\\"/storage/emulated/0/\\\",\\n //onClickType: \\\"confirm\\\",\\n memoryPath: true,\\n requireUrl: k,\\n canCreate: true,\\n store:\\\"cc\\\",\\n //isErJi:true,\\n //cHomeTips: \\\"是否使用海阔小程序打开[${name}]?\\\",\\n //cSearchTips: \\\"是否使用海阔小程序打开[${path}]?\\\",\\n notShowHide: !getItem(\\\"显示隐藏文件\\\", \\\"1\\\"),\\n isErJi: !!getItem(\\\"文件夹二级打开\\\", \\\"\\\")\\n}, d);\"},{\"col_type\":\"movie_3\",\"name\":\"设置\",\"path\":\"设置\",\"rule\":\"js:\\naddListener(\\\"onClose\\\",()=>{\\n refreshPage(false);\\n});\\nlet layout = [];\\nlayout.push({\\n title: \\\"<strong>基础设置</strong>\\\".big(),\\n col_type: \\\"rich_text\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n title: \\\"显示隐藏文件(夹)\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n let s = getItem(\\\"显示隐藏文件\\\", \\\"1\\\");\\n setItem(\\\"显示隐藏文件\\\", s ? \\\"\\\" : \\\"1\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }),\\n pic_url: getItem(\\\"显示隐藏文件\\\", \\\"1\\\") ? \\\"hiker://images/icon_rect_fill\\\" : \\\"hiker://images/icon_rect\\\",\\n col_type: \\\"text_icon\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\n/*layout.push({\\n title: \\\"文件夹二级打开\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n let s = getItem(\\\"文件夹二级打开\\\", \\\"\\\");\\n setItem(\\\"文件夹二级打开\\\", s ? \\\"\\\" : \\\"1\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }),\\n pic_url: getItem(\\\"文件夹二级打开\\\", \\\"\\\") ? \\\"hiker://images/icon_rect_fill\\\" : \\\"hiker://images/icon_rect\\\",\\n col_type: \\\"text_icon\\\"\\n});*/\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n title: \\\"““””\\\"+\\\"初始目录\\\".fontcolor(\\\"gray\\\"),\\n url: $().input(() => {\\n let path=getPath(input).slice(7);\\n if(!fileExist(\\\"file://\\\"+path)){\\n return \\\"toast://不存在该目录\\\";\\n }\\n setItem(\\\"初始目录\\\", path);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }),\\n desc: getItem(\\\"初始目录\\\", getPath(\\\"hiker://files/\\\").slice(7)),\\n col_type: \\\"text_1\\\"\\n});\\nlayout.push({\\n title: \\\"““””\\\"+\\\"自定义打开方式\\\".fontcolor(\\\"gray\\\"),\\n url: \\\"hiker://page/自定义打开方式\\\",\\n col_type: \\\"text_1\\\",\\n extra:{\\n lineVisible: false\\n }\\n});\\n/*\\nlayout.push({\\n title: \\\"<strong>自定义打开方式</strong>\\\".big(),\\n col_type: \\\"rich_text\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});\\nlayout.push({\\n col_type: \\\"line\\\"\\n});*/\\nsetResult(layout);\"},{\"col_type\":\"movie_3\",\"name\":\"默认\",\"path\":\"Default\",\"rule\":\"$.exports=[{\\n type:[\\\".json\\\"],\\n way:\\\"<js>'hiker://page/interface#noHistory##noRecordHistory#?rule=JSON编辑器&Json=' + base64Encode('file://' + PATH)\\\"\\n \\n},{\\n type:[\\\".html\\\"],\\n way: \\\"web://file://{{PATH}}\\\"\\n \\n},{\\n type:[\\\".jpg\\\", \\\".svg\\\", \\\".mp3\\\", \\\".mp4\\\", \\\".m3u8\\\"],\\n way:\\\"file://{{PATH}}\\\"\\n \\n},{\\n type:[\\\".hiker\\\"],\\n way:\\\"<js>'rule://' + base64Encode(request('file://' + PATH))\\\"\\n \\n},{\\n type:[\\\".js\\\", \\\".py\\\"],\\n way:\\\"editFile://file://{{PATH}}\\\"\\n \\n},/* {\\n type:[\\\".txt\\\"],\\n way:\\\"<js>'hiker://page/txtParser.view#noHistory##noRecordHistory#?rule=本地资源管理&path=' + encodeURIComponent(PATH)\\\"\\n \\n},*/{\\n type:[\\\".epub\\\"],\\n way:\\\"<js>'hiker://page/epubParser.view#noHistory##noRecordHistory#?rule=本地资源管理&path=' + encodeURIComponent(PATH)\\\"\\n \\n}];\\n\"},{\"col_type\":\"movie_3\",\"name\":\"自定义打开方式\",\"path\":\"自定义打开方式\",\"rule\":\"js:\\nlet waylist = readFile(\\\"waylist.json\\\", 0);\\nif (!waylist) {\\n waylist = $.require(\\\"Default\\\");\\n saveFile(\\\"waylist.json\\\", JSON.stringify(waylist), 0);\\n} else {\\n try {\\n waylist = JSON.parse(waylist);\\n } catch {\\n\\n }\\n}\\nlet d = [];\\nd.push({\\n title: \\\"创建\\\",\\n url: $(\\\"\\\", \\\"输入扩展名\\\").input(() => {\\n if (!input) return \\\"toast://创建失败\\\";\\n return $(\\\"\\\", \\\"输入方式\\\").input((type) => {\\n if (!input) return \\\"toast://创建失败\\\";\\n let arr = type.split(\\\"|\\\");\\n let waylist = readFile(\\\"waylist.json\\\", 0);\\n waylist = JSON.parse(waylist);\\n waylist.push({\\n type: arr,\\n way: input\\n });\\n saveFile(\\\"waylist.json\\\", JSON.stringify(waylist), 0);\\n refreshPage(false);\\n return \\\"toast://创建完成\\\";\\n }, input);\\n }),\\n col_type: \\\"text_center_1\\\"\\n});\\nwaylist.forEach((v, i) => {\\n d.push({\\n title: \\\"扩展名:\\\" + v.type.join(\\\"|\\\"),\\n desc: \\\"方式:\\\" + v.way,\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n d.push({\\n title: \\\"修改扩展名\\\",\\n url: $(v.type.join(\\\"|\\\")).input((i) => {\\n if (!input) return \\\"toast://修改失败\\\";\\n let arr = input.split(\\\"|\\\");\\n let waylist = readFile(\\\"waylist.json\\\", 0);\\n waylist = JSON.parse(waylist);\\n waylist[i].type = arr;\\n saveFile(\\\"waylist.json\\\", JSON.stringify(waylist), 0);\\n refreshPage(false);\\n return \\\"toast://修改完成\\\";\\n }, i),\\n col_type: \\\"text_3\\\"\\n });\\n d.push({\\n title: \\\"修改方式\\\",\\n url: $(v.way).input((i) => {\\n if (!input) return \\\"toast://修改失败\\\";\\n let waylist = readFile(\\\"waylist.json\\\", 0);\\n waylist = JSON.parse(waylist);\\n waylist[i].way = input;\\n saveFile(\\\"waylist.json\\\", JSON.stringify(waylist), 0);\\n refreshPage(false);\\n return \\\"toast://修改完成\\\"\\n }, i),\\n col_type: \\\"text_3\\\"\\n });\\n d.push({\\n title: \\\"删除\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((i) => {\\n let waylist = readFile(\\\"waylist.json\\\", 0);\\n waylist = JSON.parse(waylist);\\n waylist.splice(i,1);\\n saveFile(\\\"waylist.json\\\", JSON.stringify(waylist), 0);\\n refreshPage(false);\\n return \\\"toast://修改完成\\\"\\n }, i),\\n col_type: \\\"text_3\\\"\\n });\\n d.push({\\n col_type: \\\"line\\\"\\n });\\n});\\nsetResult(d);\"}]","proxy":"","icon":""},{"last_chapter_rule":"","title":"风阅","author":"随风","version":230327,"type":"all","url":"hiker://empty##","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\n require(config.依赖);\n sy()","searchFind":"js:\n require(config.依赖);\n sou()","search_url":"hiker://empty##**","group":"①推荐","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"*","ua":"mobile","preRule":"let tacitly = \"aHR0cHM6Ly9naXRjb2RlLm5ldC9zdWlmZW4veXVlLy0vcmF3L21hc3Rlci95Y2wuanM=\";\nlet ycl = getItem(\"git\", base64Decode(tacitly));\ninitConfig({\n 依赖: ycl\n});","pages":"[]","proxy":"","icon":"https://s1.ax1x.com/2023/03/27/ppsUsdx.png"},{"last_chapter_rule":"","title":"聚阅√","author":"","version":14,"type":"read","url":"hiker://empty##fypage","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nrequire(config.依赖);\nyiji()","searchFind":"js:\nrequire(config.依赖);\nsousuo()","search_url":"hiker://empty##**##fypage","group":"①推荐","detail_col_type":"movie_3","detail_find_rule":"js:\nrequire(config.依赖);\nerji();","sdetail_col_type":"movie_1","sdetail_find_rule":"*","ua":"pc","preRule":"if (!config.依赖) {\n //远程依赖索引文件代理地址列表\n let requirelist = [{ url: 'https://ghproxy.net/https://raw.githubusercontent.com/', sort: 0 }, { url: 'https://ghproxy.com/https://raw.githubusercontent.com/', sort: 0 }, { url: 'https://cdn.staticaly.com/gh/', sort: 0 }, { url: 'https://github.jevons.vip/https://raw.githubusercontent.com/', sort: 0 }]\n let requirefile = \"hiker://files/rules/Src/require.json\";\n if (fetch(requirefile)) {\n try {\n eval(\"requirelist=\" + fetch(requirefile) + \";\");\n } catch (e) { }\n }\n requirelist.sort(function (x, y) {\n if (x.sort < y.sort) {\n return -1;\n } else if (x.sort > y.sort) {\n return 1;\n } else {\n return 0;\n }\n });\n for (let i = 0; i < requirelist.length; i++) {\n try { //远程依赖索引\n require(requirelist[i].url + 'src48597962/hk/Ju/require.js', { timeout: 2000 });\n if (relyfile) {\n break;\n }\n } catch (e) {\n requirelist[i].sort++;\n log(e.message);\n }\n }\n writeFile(requirefile, JSON.stringify(requirelist));\n initConfig({\n 依赖: relyfile\n });\n let cfgfile = \"hiker://files/rules/Src/Ju/config.json\";\n if (fileExist(cfgfile)) {\n try {\n eval(\"let Juconfig=\" + fetch(cfgfile) + \";\");\n Juconfig[\"依赖\"] = relyfile;\n writeFile(cfgfile, JSON.stringify(Juconfig));\n } catch (e) { }\n }\n}\n//by.帅√`人才 聚模板!","pages":"[{\"col_type\":\"movie_3\",\"name\":\"依赖文件\",\"path\":\"config\",\"rule\":\"js:\\nlet method;\\nlet rely;\\nlet cfgfile = \\\"hiker://files/rules/Src/Ju/config.json\\\";\\nif (fileExist(cfgfile)) {\\n eval(\\\"let Juconfig=\\\" + fetch(cfgfile) + \\\";\\\");\\n method = Juconfig[\\\"依赖\\\"].match(/http(s)?:\\\\/\\\\/.*\\\\//)[0] + 'SrcJuMethod.js';\\n rely = Juconfig[\\\"依赖\\\"];\\n}\\n$.exports.method = method;\\n$.exports.rely = rely;\\n$.exports.version = 14;\"},{\"col_type\":\"movie_3\",\"name\":\"接口代码\",\"path\":\"jiekou\",\"rule\":\"js:\\nlet method;\\nlet cfgfile = \\\"hiker://files/rules/Src/Ju/config.json\\\";\\nif (fileExist(cfgfile)) {\\n eval(\\\"let Juconfig=\\\" + fetch(cfgfile) + \\\";\\\");\\n method = Juconfig[\\\"依赖\\\"].match(/http(s)?:\\\\/\\\\/.*\\\\//)[0] + 'SrcJuMethod2.js';\\n}\\nrequire(method);\"},{\"col_type\":\"movie_3\",\"name\":\"云口令导入\",\"path\":\"import\",\"rule\":\"js:\\nfunction cloudimport(title) {\\n let remotefile;\\n let cfgfile = \\\"hiker://files/rules/Src/Ju/config.json\\\";\\n if (fileExist(cfgfile)) {\\n eval(\\\"let Juconfig=\\\" + fetch(cfgfile) + \\\";\\\");\\n remotefile = Juconfig[\\\"依赖\\\"].match(/http(s)?:\\\\/\\\\/.*\\\\//)[0] + 'SrcJuSet.js';\\n }\\n if(remotefile){\\n require(remotefile);\\n return JYimport(input,title);\\n }else{\\n return \\\"toast://没有用过聚阅√小程序?\\\";\\n }\\n}\\n$.exports = cloudimport(\\\"聚阅√\\\");\"},{\"col_type\":\"movie_3\",\"name\":\"搜索页\",\"path\":\"sousuopage\",\"rule\":\"js:\\nlet relyfile = $.require(\\\"hiker://page/config?rule=\\\"+MY_RULE.title).rely;\\nrequire(relyfile);\\nlet name = getParam(\\\"keyword\\\");\\nlet type = getParam(\\\"type\\\");\\nnewsousuopage(name,type,relyfile);\"},{\"col_type\":\"movie_3\",\"name\":\"导入确认页\",\"path\":\"importConfirm\",\"rule\":\"js:\\nlet rely = $.require(\\\"hiker://page/config?rule=\\\"+MY_RULE.title).rely;\\n\\nrequire(rely.match(/http(s)?:\\\\/\\\\/.*\\\\//)[0] + 'SrcJuSet.js');\\nimportConfirm(MY_RULE.title);\"}]","proxy":"","icon":"https://img.vinua.cn/images/9OZX.png"},{"last_chapter_rule":"","title":"道长仓库阿里","author":"@LoyDgIk","version":163,"type":"tool","url":"hiker://empty","col_type":"icon_2_round","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nconst {\n getApi,\n color,\n small,\n getFile,\n htmlTag,\n api,\n md\n} = $.require(\"hiker://page/utiliy\");\nvar r = $.require('hiker://page/notice');\n\n\nconst lsg = $.require(\"hiker://page/localStorage?rule=道长仓库Pro\");\nlet classA = getVar(\"Warehouse.class\", \"0\");\nlet listUrl = getApi(\"usersUrl\") + classA,\n myUrl = getApi(\"devSelf\"),\n noticeUrl = getApi(\"noticeUrl\");\n// myUrl = getApi(\"rulesAllUrl\");\nputVar(\"Warehouse.filter\", \"\");\nvar noWait = true; //无需重试\nvar timeout = 500;\nvar tmp_headers = {\n timeout: timeout\n};\ntry {\n var userList = JSON.parse(request(listUrl, tmp_headers)).result,\n notices=JSON.parse(request(noticeUrl, tmp_headers)).result,\n nowCon = 0,\n ruleCount = JSON.parse(request(getApi(\"ruleCountUrl\"), tmp_headers)).result;\n} catch (e) {\n noWait = false;\n setResult([{\n title: '仓库同时访问量过大或网络差,繁忙中...\\n请耐心等待稍后再试',\n desc: '点击尝试重新访问',\n col_type: 'text_1',\n url: $('#noLoading#').lazyRule(() => {\n refreshPage(false);\n return 'toast://已刷新'\n })\n }]);\n}\nif (noWait) {\n let data = [];\n //log(notices);\n if(notices.length>0){\n // let info = '道长仓库预计于2024年3月中旬下架停止运营,请各位开发者大佬妥善备份好自己的规则,插件,主题等数据';\n // let msg=info;\n //msg=info.slice(0,20)+'...';\n let msg='🔔'+notices[0].name+':'+notices[0].content_text;\n let notice_color=notices[0].color||'#ff7000';\n let info=notices.map(it=>`<h2>${it.name} ${it.publish_time}</h2>`+it.content).join('\\n');\n r.show(data, msg, notice_color,null,info);\n \n //r.show(data, msg,\"red\");\n//r.show(data, msg,\"red\",undefined, \"详细公告\");\n\n//r.show(d, msg,\"red\", \"web://https://baidu.com\");\n }\n \n \n let classTab = [\n [\"上次活跃\", \"0\"],\n [\"规则数\", \"1\"],\n [\"注册时间\", \"-1\"]\n ]\n for (let item of classTab) {\n data.push({\n title: item[1] === classA ? \"““\" + item[0] + \"””\" : item[0],\n url: $(\"#noLoading#\").lazyRule((key) => {\n putVar(\"Warehouse.class\", key);\n refreshPage(false);\n return \"hiker://empty\";\n }, item[1]),\n col_type: \"scroll_button\"\n });\n }\n data.push({\n title: \"全部规则\",\n url: \"hiker://page/AllPublicRule?url=hiker://empty#fypage#noHistory##noRecordHistory#\",\n col_type: \"scroll_button\"\n });\n data.push({\n title: \"刷新依赖\",\n url: $('#noLoading#').lazyRule((jsonUrl) => {\n jsonUrl = jsonUrl + '2505';\n // log(jsonUrl);\n let text = request(jsonUrl);\n if (!/version/.test(text)) {\n return 'toast://服务器正忙,请稍候再试...'\n }\n deleteCache(jsonUrl);\n try {\n require(jsonUrl);\n confirm({\n title: '刷新成功提示',\n content: \"toast://已刷新,当前版本信息:\\n\" + JSON.stringify(version)\n })\n return 'hiker://empty'\n } catch (e) {\n return 'toast://糟糕,本地缓存插件被清除了,但是服务器通讯失败!'\n }\n }, getApi(\"importUrl\")),\n col_type: \"scroll_button\"\n });\n data.push({\n title: \"通免:\" + color(lsg.getItem(\"通免\", \"X5\"), \"#ff7000\"),\n col_type: \"scroll_button\",\n url: $('#noLoading#').lazyRule(() => {\n const lsg = $.require(\"hiker://page/localStorage?rule=道长仓库Pro\");\n if (lsg.getItem(\"通免\", \"X5\") == \"X5\") {\n lsg.setItem(\"通免\", \"WEB\");\n } else {\n lsg.setItem(\"通免\", \"X5\");\n }\n refreshPage(false);\n return \"toast://已设置仓库通免模式为:\" + lsg.getItem(\"通免\");\n })\n });\n data.push({\n title: \"排序:\" + color(getItem(\"排序\", \"时间优先\"), \"#ff7000\"),\n col_type: \"scroll_button\",\n url: $('#noLoading#').lazyRule((color) => {\n let next = getItem(\"排序\", \"时间优先\") === '时间优先' ? '新版优先' : '时间优先';\n setItem(\"排序\", next);\n //refreshPage(false);\n updateItem('sort', {\n title: \"排序:\" + color(next, \"#ff7000\")\n })\n return \"toast://已设置仓库开发者规则排序模式为:\" + next;\n }, color),\n extra: {\n id: 'sort'\n }\n });\n data.push({\n title: color(\"仓库公告\", \"#ff7000\"),\n col_type: \"scroll_button\",\n url: $('hiker://empty#noHistory##noRecordHistory#').rule((md) => {\n require(md);\n let d = [];\n let 仓库公告 = \"暂无公告\";\n try {\n 仓库公告 = fetch('https://gitcode.net/qq_32394351/dr/-/raw/master/js/仓库公告.md');\n } catch (e) {}\n if (仓库公告) {\n d.push({\n title: marked.parse(仓库公告),\n col_type: 'rich_text',\n url: 'hiker://empty'\n });\n }\n setResult(d);\n }, md)\n });\n\n data.push({\n title: color(\"升级仓库\", \"#15ab21\"),\n col_type: \"scroll_button\",\n url: $('#noLoading#').lazyRule(() => {\n const {\n getApi\n } = $.require(\"hiker://page/utiliy\");\n let ruleHead = '海阔视界首页频道规则【道长仓库Pro】¥home_rule_url¥';\n let url = getApi('importUrl') + \"1094\";\n let importUrl = 'rule://' + base64Encode(ruleHead + url);\n return importUrl\n })\n });\n\n data.push({\n title: color(\"升级$扩展\", \"#15ab21\"),\n col_type: \"scroll_button\",\n url: $('#noLoading#').lazyRule(() => {\n const {\n getApi\n } = $.require(\"hiker://page/utiliy\");\n let ruleHead = '海阔视界,网页插件¥js_url¥$hiker@';\n let url = getApi('importUrl') + \"5111\";\n let importUrl = 'rule://' + base64Encode(ruleHead + url);\n return importUrl\n })\n });\n\n addListener('onClose', $.toString(() => {\n clearVar(\"Warehouse.class\");\n }));\n let {\n username,\n password,\n user\n } = getFile();\n\n let is_login = false;\n let is_manager = false;\n if (username !== void 0 && password !== void 0) {\n myUrl += '?qq=' + username + '&password=' + password;\n let code_str = request(myUrl, tmp_headers);\n let code = {};\n try {\n code = JSON.parse(code_str);\n } catch (e) {}\n if (code.status === 0 && code.result.active) {\n is_login = true;\n if (code.result.is_manager) {\n is_manager = true;\n putVar('house.is_manager', '真');\n putVar('house.username', username);\n putVar('house.password', password);\n } else {\n putVar('house.is_manager', '');\n clearVar('house.username');\n clearVar('house.password');\n }\n }\n }\n if (is_login) {\n try {\n nowCon = JSON.parse(request(getApi(\"nowConUrl\"), tmp_headers)).result;\n } catch (e) {\n nowCon = '未知';\n }\n let devData = userList.find(item => item.qq === username);\n data.push({\n title: '<strong><span style=\"color: #ff7000\">' + devData.name + '</span></strong>&nbsp;&nbsp;&nbsp;&nbsp;<small><u>规则管理 ></u></small>',\n pic_url: devData.avatar,\n col_type: \"avatar\",\n url: \"hiker://page/devManage#noHistory##noRecordHistory#\",\n extra: {\n //username: username,\n //password: password,\n dev: devData\n }\n });\n data.push({\n col_type: 'text_1',\n title: small(\"现有 \" + color(userList.length, \"#ff7000\") + \" 名开发者,\" + color(ruleCount[0], \"#ff7000\") + \" 条公开规则,\" + color(ruleCount[1], \"#ff7000\") + \" 条集芳阁规则。在线:\" + color(nowCon, \"#ff7000\")),\n url: \"toast://喵喵喵?\",\n });\n } else {\n data.push({\n title: small(color(\"开发者登录\", \"#00BFFF\")),\n col_type: 'text_center_1',\n desc: small(\"现有\" + color(userList.length, \"#ff7000\") + \"名开发者,\" + color(ruleCount[0], \"#ff7000\") + \"条公开规则,\" + color(0, \"#ff7000\") + \"条集芳阁规则。\"),\n url: \"hiker://page/devLogin\"\n });\n }\n if (Array.isArray(user) && user.length === 2) {\n let userlogin = request(api.dis_login, {\n headers: {\n 'content-type': 'application/json'\n },\n body: JSON.stringify({\n \"params\": {\n \"qq\": user[0],\n \"auth_code\": user[1]\n }\n }),\n method: 'POST',\n timeout: timeout\n });\n userlogin = JSON.parse(userlogin).result;\n if (userlogin.status === 0) {\n userlogin = userlogin.result\n data.push({\n title: userlogin.name + \"&nbsp;&nbsp;\" + userlogin.qq + \"&nbsp;&nbsp;&nbsp;&nbsp;<small><u>更换账号 ></u></small>\",\n col_type: 'avatar',\n pic_url: userlogin.avatar_url,\n url: \"hiker://page/Userregistration\"\n });\n data.splice(3, 0, {\n title: userlogin.has_reply ? \"🆕回复\" : \"🔔回复\",\n url: \"hiker://page/MyReply?url=hiker://empty#fypage#noHistory##noRecordHistory#\",\n col_type: \"scroll_button\",\n extra: {\n auth_code: user[1],\n qq: user[0]\n }\n });\n } else {\n data.push({\n title: userlogin.detail,\n col_type: 'text_center_1',\n desc: \"““””<small><u>重新获取验证码 ></u></small>\",\n url: \"hiker://page/Userregistration\"\n });\n }\n } else {\n data.push({\n title: \"评论登录/注册\",\n col_type: 'text_center_1',\n desc: \"\",\n url: \"hiker://page/Userregistration\"\n });\n }\n for (var item of userList) {\n data.push({\n title: item.name + \"(\" + item.rule_num + \")\",\n desc: item.id + ':' + item.nick_name,\n pic_url: item.avatar,\n url: \"hiker://page/rules#noHistory#\",\n extra: {\n avatarUrl: item.avatar,\n qq: item.qq,\n id: item.id,\n can_upload: item.can_upload\n }\n });\n }\n\n data.push({\n col_type: 'long_text'\n });\n setResult(data);\n try {\n let img = [\n [\n \"hiker://files/icon/赞.svg\", \"http://hiker.nokia.press/hikerule/rulelist.json?id=6756\"\n ],\n [\n \"hiker://files/icon/踩.svg\", \"http://hiker.nokia.press/hikerule/rulelist.json?id=6757\"\n ],\n [\n \"hiker://files/icon/评论.svg\", \"http://hiker.nokia.press/hikerule/rulelist.json?id=6758\"\n ]\n ];\n for (let item of img) {\n if (!fileExist(item[0])) {\n downloadFile(item[1], item[0]);\n }\n }\n } catch (e) {\n\n }\n}","searchFind":"js:\nvar d = [];\nconst {\n api,\n getApi,\n localRuleVer \n} = $.require(\"hiker://page/utiliy\");\nvar html = request(getApi(\"search\") + \"?key=\" + MY_URL.replace(\"hiker://empty#\", \"\")); // 获取源码\nvar rule_list = JSON.parse(html).result;\nlet filter = getVar(\"Warehouse.filter\", \"\");\nif (filter !== \"\") {\n rule_list = rule_list.filter(item => item.author === filter);\n}\nif (rule_list.length === 0) {\n d.push({\n title: '共搜索到' + rule_list.length + \"条记录\",\n desc: '详情请找道长,qq 434857005',\n url: \"hiker://empty\",\n col_type: 'text_center_1'\n });\n}\nlet homeList = JSON.parse(request(api.home));\n\nfor (let item of rule_list) {\n //let lver=localRuleVer(homeList, item);\n let label = \"\",\n lver = -2;\n if (item.data_type === \"home_rule_url\") {\n lver = localRuleVer(homeList, item);\n if (lver === -1) {\n label = \"🆕\";\n } else if (lver < item.ver) {\n label = \"🆙\";\n }\n }\n d.push({\n title: label+item.name,\n desc: item.type,\n content: item.author/*+\"\\n本地版本:\"+lver+\"\\t\\t云端版本:\"+item.ver*/+ '\\n更新于:' + item.last_update,\n url: \"hiker://page/ruleDetail#noHistory##noRecordHistory#\",\n extra: {\n lver: lver,\n id: item.id\n },\n pic_url: item.pic_url\n });\n\n}\n\nsetResult(d);","search_url":"hiker://empty#**","group":"①推荐","detail_col_type":"text_1","detail_find_rule":"","sdetail_col_type":"text_1","sdetail_find_rule":"","ua":"mobile","preRule":"$.require('hiker://page/libs?rule=道长仓库Pro');","pages":"[{\"col_type\":\"movie_3\",\"name\":\"工具\",\"path\":\"utiliy\",\"rule\":\"js:\\n//let host = \\\"http://hiker.nokia.press\\\";\\nlet host=\\\"http://47.109.24.244:8025\\\";\\n//let host = \\\"http://192.168.31.49:8079\\\";\\nlet home = base64Decode(\\\"aGlrZXI6Ly9ob21l\\\");\\nvar api = {\\n host: host+\\\"/hikerule\\\",\\n noticeUrl:\\\"/notice/get\\\",//获取仓库公告\\n usersUrl: \\\"/dev/users?order=\\\", //用户列表\\n ruleCountUrl: \\\"/dev/rulecount\\\", //获取规则数量\\n rulesUrl: \\\"/dev/get\\\", //用户对应的规则列表仅仅获取公开\\n rulesAllUrl: \\\"/dev/getall\\\", //开发者对应的规则列表可获取私有\\n devSelf:'/dev/getself',//获取开发者信息\\n manCanUpload:'/set_can_upload/',//超管设置开发者是否可上传\\n manRuleSafe:'/set_rule_safe/',//超管设置规则安全性\\n manRuleGood:'/set_rule_good/',//超管设置规则优质性\\n importUrl: \\\"/rulelist.json?id=\\\", //规则详情可导入\\n infoSetUrl: \\\"/dev/set_info\\\",\\n nowConUrl: \\\"/sql_info/get_now_con\\\",\\n infoGetUrl: \\\"/dev/get_info?name=\\\",\\n settingsGetUrl: \\\"/dev/get_settings?name=\\\",\\n gupload: \\\"/dev/gupload\\\",\\n gtimeover: \\\"/dev/gtimeover\\\",\\n getbyid: \\\"/dev/getbyid\\\",\\n ruleListJson: \\\"/rulelist.json\\\",\\n auth: \\\"/dev/get_auth\\\",\\n timeover: \\\"/dev/timeover\\\",\\n share: \\\"/dev/share\\\",\\n genAuth: \\\"/dev/gen_auth\\\",\\n deleteUrl: \\\"/dev/delete\\\",\\n jsonList: \\\"/dev/json_list\\\",\\n search: \\\"/dev/search\\\",\\n new_dev: \\\"/dev_regist/new\\\",\\n new_getId: \\\"/dev_regist/get_id\\\",\\n new_confirm: \\\"/dev_regist/confirm\\\",\\n modify_pwd: \\\"/modify/password\\\",\\n modify_name: \\\"/modify/name\\\",\\n modify_ava: \\\"/modify/avatar\\\",\\n user: \\\"/dev/user/\\\",\\n get_rule_note: \\\"/modify/get_rule_note/\\\",\\n set_rule_pic: \\\"/modify/rule_pic/\\\",\\n set_rule_note: \\\"/modify/rule_note/\\\"\\n}\\n$.exports.range = function(m, n) {\\n return Math.floor(Math.random() * (m - n + 1) + n);\\n}\\n$.exports.mapColType = function(target, type, n) {\\n for (let i = 0; i < n; i++) {\\n target.push({\\n col_type: type\\n });\\n }\\n}\\nvar getApi = function(k) {\\n return api.host + api[k];\\n};\\n$.exports.getApi=getApi;\\n$.exports.md=getApi('importUrl')+\\\"3187\\\";\\n$.exports.localRuleVer = function(localRuleList, rule) {\\n let localRule;\\n for (let i = 0; i < localRuleList.length; i++) {\\n let item = localRuleList[i];\\n let au = item.author || \\\"\\\";\\n let sameAu=au.length > 0 && rule.author.includes(au);\\n sameAu=true;//不判断作者默认为true\\n if (item.title === rule.name && sameAu) {\\n localRule = item;\\n break;\\n }\\n }\\n if (localRule === void 0) {\\n return -1;\\n } else {\\n return localRule.version;\\n }\\n}\\n$.exports.color = function(text, color) {\\n text += \\\"\\\";\\n if (text.indexOf(\\\"““””\\\") === 0) {\\n text.replace(\\\"““””\\\", \\\"\\\");\\n }\\n return \\\"““””<font color='\\\" + color + \\\"'>\\\" + text + \\\"</font>\\\";\\n}\\n\\n$.exports.sleep = function(timeout){\\n java.lang.Thread.sleep(timeout);\\n}\\nfunction htmlTag(tag, text) {\\n text += \\\"\\\";\\n if (text.indexOf(\\\"““””\\\") === 0) {\\n text.replace(\\\"““””\\\", \\\"\\\");\\n }\\n return \\\"““””\\\" + \\\"<\\\" + tag + \\\">\\\" + text + \\\"</\\\" + tag + \\\">\\\";\\n\\n}\\n\\nfunction getNowFormatDate() {\\n let date = new Date();\\n let seperator1 = \\\"-\\\";\\n let seperator2 = \\\":\\\";\\n let month = date.getMonth() + 1;\\n let strDate = date.getDate();\\n let strHours = date.getHours();\\n let strMinutes = date.getMinutes();\\n let strSeconds = date.getSeconds()+1;\\n if (month >= 1 && month <= 9) {\\n month = \\\"0\\\" + month\\n }\\n if (strDate >= 0 && strDate <= 9) {\\n strDate = \\\"0\\\" + strDate\\n }\\n if (strHours >= 0 && strHours <= 9) {\\n strHours = \\\"0\\\" + strHours\\n }\\n if (strMinutes >= 0 && strMinutes <= 9) {\\n strMinutes = \\\"0\\\" + strMinutes\\n }\\n if (strSeconds >= 0 && strSeconds <= 9) {\\n strSeconds = \\\"0\\\" + strSeconds\\n }\\n //let currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + \\\" \\\" + strHours + seperator2 + strMinutes + seperator2 + strSeconds;\\n let currentdate = (date.getFullYear()-2020)+''+ month +''+ strDate +''+ strHours+'' + strMinutes +''+ Math.ceil(strSeconds/7);\\n return parseInt(currentdate)\\n }\\n$.exports.getNowFormatDate = getNowFormatDate;\\n$.exports.htmlTag = htmlTag;\\n$.exports.small = function(text) {\\n return htmlTag(\\\"small\\\", text);\\n}\\n$.exports.getFile = function() {\\n var File = request(\\\"hiker://files/WarehouseUSER.json\\\") || \\\"{}\\\";\\n try {\\n return JSON.parse(File);\\n } catch (e) {\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\", \\\"{}\\\");\\n return {};\\n }\\n}\\n$.exports.getUserDate =function(){\\n var File = request(\\\"hiker://files/WarehouseUSERA.json\\\") || \\\"[]\\\";\\n try {\\n return JSON.parse(File);\\n } catch (e) {\\n writeFile(\\\"hiker://files/WarehouseUSERA.json\\\", \\\"[]\\\");\\n return [];\\n }\\n}\\n$.exports.existFile = function(spath, ipath, headers) {\\n let scode = request(spath);\\n if (!scode) {\\n writeFile(spath, request(ipath, headers));\\n }\\n}\\n\\nlet newApi = {\\n \\\"dis_new\\\": \\\"/hikerule/new_rule_discuss/\\\",\\n \\\"dis_verify\\\": \\\"/hikerule/rule_discuss/get_yzm\\\",\\n \\\"dis_get\\\": \\\"/hikerule/rule_discuss/\\\",\\n \\\"dis_set\\\": \\\"/hikerule/modify/can_discuss/\\\",\\n \\\"dis_new_user\\\": \\\"/hikerule/rule_discuss/new_user\\\",\\n \\\"dis_login\\\":\\\"/hikerule/rule_discuss/user_login\\\",\\n \\\"dis_dev_discuss\\\":\\\"/hikerule/modify/dev_can_discuss\\\",\\n \\\"dis_dev_control\\\":\\\"/hikerule/rule_discuss/remove/\\\",\\n \\\"all_rule\\\":\\\"/hikerule/get_rules\\\",\\n \\\"dis_get_reply\\\":\\\"/hikerule/get_reply_rule_discuss\\\",\\n \\\"dis_reply\\\":\\\"/hikerule/dev_new_rule_discuss/\\\",\\n}\\n\\nfunction setApi(object) {\\n let target = {};\\n for (let key in object) {\\n target[key]=host+object[key]\\n }\\n return target;\\n}\\n\\n$.exports.api = setApi(newApi);\\n$.exports.api.host=host;\\n$.exports.api.home=home;\"},{\"col_type\":\"movie_3\",\"name\":\"开发者登录\",\"path\":\"devLogin\",\"rule\":\"js:\\nsetPageTitle(\\\"开发者登录\\\");\\nconst {\\n getApi,\\n htmlTag,\\n mapColType,\\n small,\\ngetFile\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nvar data = [];\\naddListener('onClose', $.toString(()=>{\\n clearVar(\\\"WarehouseUsername\\\");\\n clearVar(\\\"WarehousePassword\\\");\\n}))\\ndata.push({\\n title: '账号',\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('WarehouseUsername',''),\\n type:\\\"number\\\",\\n onChange: 'putVar(\\\"WarehouseUsername\\\",input)'\\n }\\n}, {\\n title: '密码',\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('WarehousePassword', ''),\\n type: \\\"password\\\",\\n onChange: 'putVar(\\\"WarehousePassword\\\",input)'\\n }\\n});\\n\\ndata.push({\\n title:\\\"&nbsp;&nbsp;<a href='hiker://page/Register'>注册</a>\\\",\\n col_type:\\\"rich_text\\\"\\n});\\nmapColType(data, \\\"line_blank\\\", 1);\\nlet user = getFile();\\ndata.push({\\n title: htmlTag(\\\"b\\\", \\\"登录\\\"),\\n url: $().lazyRule((url, f)=> {\\n let username = getVar('WarehouseUsername', ''),\\n password = getVar('WarehousePassword', '');\\n if(username === \\\"\\\" && password ===\\\"\\\"){\\n return \\\"toast://账号和密码不能为空\\\"\\n }\\n let myUrl = url + '?qq=' + username + '&password=' + password;\\n let code_str = request(myUrl);\\n let code = JSON.parse(code_str);\\n if (code.status == 0) {\\n f.username=username;\\n f.password=password\\n writeFile('hiker://files/WarehouseUSER.json', JSON.stringify(f));\\n back();\\n return \\\"toast://登录成功\\\";\\n }else{\\n return \\\"toast://账号或密码错误\\\";\\n }\\n }, getApi(\\\"rulesAllUrl\\\"),user),\\n col_type: 'text_center_1'\\n});\\nsetResult(data);\"},{\"col_type\":\"icon_2_round\",\"name\":\"开发者管理\",\"path\":\"devManage\",\"rule\":\"js:\\nsetPageTitle(\\\"规则管理\\\");\\naddListener('onClose', 'clearVar(\\\"Warehouse.back\\\",\\\"\\\");');\\nif (getVar(\\\"Warehouse.back\\\") === \\\"1\\\") {\\n back();\\n}\\nconst {\\n getApi,\\n color,\\n small,\\n getFile,\\n existFile,\\n mapColType,\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n dev\\n} = MY_PARAMS;\\nlet {\\n username,\\n password,\\n} = getFile();\\n//existFile(\\\"hiker://files/rules/dzHouse/html/开发者分享.html\\\", \\\"https://erp.scwinbao.com/hikerule/rulelist.json?id=539\\\");\\nlet ruleList = JSON.parse(request(getApi(\\\"rulesAllUrl\\\") + '?qq=' + username + '&password=' + password)).result;\\nlet MOBILE_UA = 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Mobile Safari/537.36';\\nlet infoSetUrl = getApi(\\\"infoSetUrl\\\");\\nlet infoGetUrl = getApi(\\\"infoGetUrl\\\") + username;\\nlet settingsGetUrl = getApi(\\\"settingsGetUrl\\\") + username;\\nputMyVar(\\\"dev_set_info\\\", [username, password, infoSetUrl, MOBILE_UA, infoGetUrl].join(\\\"$$\\\"));\\nlet data = [];\\ndata.push({\\n title: '““””<big>仓库设置</big>&nbsp;&nbsp;&nbsp;<small><u>( 个人资料 >)</u></small>',\\n desc: '““””您共有 <span style=\\\"color: #ff7000\\\">' + ruleList.length + '</span>' + \\\" 条规则。\\\\n点击规则可进行分享、删除、导入操作及查看详情\\\",\\n url: \\\"hiker://page/PersonalData#noHistory##noRecordHistory#\\\",\\n extra:{id:dev.id},\\n col_type: 'text_1'\\n});\\nmapColType(data, \\\"line\\\", 2);\\ndata.push({\\n title: small(color(\\\"更改公告✍\\\", \\\"#34b1ff\\\")),\\n // url: \\\"x5://file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/rules/dzHouse/html/dev_info_edit.html\\\",\\n url: \\\"hiker://page/devInfoEdit\\\",\\n col_type: 'text_3'\\n});\\ndata.push({\\n title: small(color(\\\"更多分享📲\\\", \\\"#34b1ff\\\")),\\n //url: \\\"x5://file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/rules/dzHouse/html/开发者分享.html\\\",\\n url: \\\"hiker://page/moreShare\\\",\\n col_type: 'text_3'\\n});\\ndata.push({\\n title: small(color(\\\"升级依赖📥\\\", \\\"#34b1ff\\\")),\\n url: $(\\\"升级会重新从仓库拉取相关的静态页面到本地\\\\n确认升级吗?\\\").confirm((host) => {\\n writeFile(\\\"hiker://files/rules/dzHouse/html/开发者分享.html\\\", request(host+'/hikerule/rulelist.json?id=539'));\\n writeFile(\\\"hiker://files/rules/dzHouse/html/dev_info_edit.html\\\", request(host+'/hikerule/rulelist.json?id=402'));\\n writeFile(\\\"hiker://files/rules/dzHouse/html/dev_info_get.html\\\", request(host+'/hikerule/rulelist.json?id=404'));\\n refreshPage(false);\\n return \\\"toast://已重置开发者分享,简介查看,简介编辑等静态文件\\\";\\n },api.host),\\n col_type: 'text_3'\\n});\\nlet devSetBack;\\ntry {\\n devSetBack = JSON.parse(request(settingsGetUrl));\\n} catch (e) {\\n devSetBack = {};\\n}\\n\\nfunction setSettingItem(basic) {\\n let temp = {\\n title: basic.title,\\n col_type: basic.col_type,\\n url: $(basic.confirm).confirm((url, msg) => {\\n let back = request(url);\\n let ret = JSON.parse(back);\\n if (ret.status == 0) {\\n refreshPage(true);\\n return \\\"toast://\\\" + msg[0];\\n } else {\\n refreshPage(false);\\n return \\\"toast://\\\" + msg[1] + \\\"\\\\n\\\" + ret.detail;\\n }\\n }, basic.url, basic.msg)\\n };\\n return temp;\\n}\\nif (devSetBack.status == 0) {\\n let devSettings = devSetBack.result;\\n let share = {\\n col_type: \\\"text_3\\\"\\n };\\n if (devSettings.share_public) {\\n share.title = small(color(\\\"公开上传\\\", \\\"green\\\") + color(\\\"(私藏)\\\", \\\"#00bfff\\\"));\\n share.url = getApi(\\\"gupload\\\") + \\\"?qq=\\\" + username + \\\"&password=\\\" + password + \\\"&flag=1\\\";\\n share.confirm = \\\"是否确认私藏以后提交的规则?\\\";\\n share.msg = [\\\"已私藏\\\", \\\"私藏失败\\\"];\\n } else {\\n share.title = small(color(\\\"私密上传\\\", \\\"red\\\") + color(\\\"(公开)\\\", \\\"#adff2f\\\"));\\n share.url = getApi(\\\"gupload\\\") + \\\"?qq=\\\" + username + \\\"&password=\\\" + password;\\n share.confirm = \\\"是否确认公开以后提交的规则?\\\";\\n share.msg = [\\\"已公开\\\", \\\"公开失败\\\"];\\n }\\n data.push(setSettingItem(share));\\n let timeOver = {\\n col_type: \\\"text_3\\\"\\n };\\n if (devSettings.time_over) {\\n timeOver.title = small(color(\\\"短时秘钥\\\", \\\"green\\\") + color(\\\"(永久)\\\", \\\"#00bfff\\\"));\\n timeOver.url = getApi(\\\"gtimeover\\\") + \\\"?qq=\\\" + username + \\\"&password=\\\" + password + \\\"&flag=1\\\";\\n timeOver.confirm = \\\"是否确认以后的私藏规则分享不过期?\\\";\\n timeOver.msg = [\\\"已设为永久\\\", \\\"设为永久失败\\\"];\\n } else {\\n timeOver.title = small(color(\\\"永久秘钥\\\", \\\"red\\\") + color(\\\"(过期)\\\", \\\"#adff2f\\\"));\\n timeOver.url = getApi(\\\"gtimeover\\\") + \\\"?qq=\\\" + username + \\\"&password=\\\" + password;\\n timeOver.confirm = \\\"确认要以后分享的私藏规则自动到期?\\\";\\n timeOver.msg = [\\\"已设为过期\\\", \\\"设为过期失败\\\"];\\n }\\n data.push(setSettingItem(timeOver));\\n let discuss = {\\n col_type: \\\"text_3\\\"\\n };\\n if (devSettings.can_discuss) {\\n discuss.title = small(color(\\\"允许评论\\\", \\\"red\\\") + color(\\\"(不许)\\\", \\\"#adff2f\\\"));\\n discuss.url = api.dis_dev_discuss + \\\"?qq=\\\" + username + \\\"&password=\\\" + password+ \\\"&flag=1\\\";\\n discuss.confirm = \\\"是否确认以后上传的规则允许评论?\\\";\\n discuss.msg = [\\\"已设为不许\\\", \\\"设置失败\\\"];\\n\\n } else {\\n discuss.title = small(color(\\\"不许评论\\\", \\\"green\\\") + color(\\\"(允许)\\\", \\\"#00bfff\\\"));\\n discuss.url = api.dis_dev_discuss + \\\"?qq=\\\" + username + \\\"&password=\\\" + password;\\n discuss.confirm = \\\"是否确认以后上传的规则允许评论?\\\";\\n discuss.msg = [\\\"已设为允许\\\", \\\"设置失败\\\"];\\n }\\n data.push(setSettingItem(discuss));\\n}\\nmapColType(data, \\\"line\\\", 2);\\nfor (let item of ruleList) {\\n let my_t_excode1 = '';\\n let my_t_excode2 = '';\\n if (item.state != 'public') {\\n my_t_excode1 += '㊙️';\\n } else {\\n my_t_excode1 += '';\\n }\\n data.push({\\n title: my_t_excode1 + item.name + my_t_excode2,\\n url: \\\"hiker://page/manageRule#noHistory##noRecordHistory#\\\",\\n extra: {\\n id: item.id,\\n //username: username,\\n //password: password\\n },\\n pic_url: item.pic,\\n })\\n}\\nif (ruleList.length === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>快来上传你的第一条规则吧!</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n}\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"规则详细-dev\",\"path\":\"manageRule\",\"rule\":\"js:\\n const {\\n getApi,\\n color,\\n small,\\n getFile,\\n existFile,\\n mapColType,\\n htmlTag,\\n api,\\n md,\\n } = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n id\\n} = MY_PARAMS;\\nlet {\\n username,\\n password,\\n} = getFile();\\naddListener('onClose', $.toString(() => {\\n refreshPage(false);\\n}));\\nlet dataItem = JSON.parse(request(getApi(\\\"getbyid\\\") + \\\"?id=\\\" + id)).result;\\nsetPageTitle(\\\"编辑「\\\" + dataItem.name + \\\"」\\\");\\nlet reqByGet = \\\"?id=\\\" + dataItem.id + \\\"&qq=\\\" + username + \\\"&password=\\\" + password;\\nlet ruleListJson = getApi(\\\"ruleListJson\\\") + \\\"?id=\\\";\\nlet data = [];\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"版本\\\"),\\n desc: \\\"““””云端版本:\\\" + color(dataItem.ver, \\\"#5cff2c\\\") + \\\"\\\\n上次提交于: [\\\" + color(dataItem.last_update, \\\"#ff7000\\\") + \\\"]\\\",\\n url: $(\\\"<开发者>\\\\n\\\" + dataItem.author + \\\"\\\\n<名称>\\\\n\\\" + dataItem.name + \\\"\\\\n<云端版本>\\\\n\\\" + dataItem.ver + \\\"\\\\n<更新时间>\\\\n[\\\" + dataItem.last_update + \\\"]\\\").confirm(() => {}),\\n col_type: 'text_1'\\n});\\nlet dataType = {\\n home_rule_url: '首页云规则',\\n publish: '提交云仓库规则',\\n js_url: '网页插件规则',\\n html: '静态页面',\\n config: '主页配置'\\n};\\n\\nlet basic = {\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\"\\n};\\nlet dataTypeTips = dataType[dataItem.data_type] || '未知规则:' + dataItem.data_type;\\n\\nbasic.title = htmlTag(\\\"big\\\", \\\"类型\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(\\\"(id:\\\" + dataItem.id + \\\")\\\");\\nbasic.desc = \\\"数据类型:\\\" + color(dataTypeTips, \\\"#cb54ff\\\") + \\\"\\\\n分享状态为:\\\" + dataItem.state;\\nif ([\\\"html\\\", \\\"config\\\", \\\"js_url\\\"].includes(dataItem.data_type)) {\\n basic.desc += \\\"\\\\n““”” =>\\\" + small(\\\"点此预览\\\");\\n basic.url = ruleListJson + dataItem.id;\\n}\\nlet auth = \\\"\\\";\\nif (dataItem.state == \\\"private\\\") {\\n let auth_back = JSON.parse(request(getApi(\\\"auth\\\") + reqByGet));\\n basic.title = basic.title + \\\"\\\\n\\\" + small(color(auth_back.result, \\\"grey\\\"));\\n auth = '&auth=' + auth_back.result;\\n basic.url = basic.url === \\\"hiker://empty\\\" ? basic.url : basic.url + auth;\\n}\\ndata.push(basic);\\nlet notes = request(getApi(\\\"get_rule_note\\\") + id);\\nnotes = JSON.parse(notes).result;\\nrequire(md);\\nlet notesHtml=\\\"\\\"\\ntry{\\n notesHtml=marked.parse(notes);\\n}catch(e){}\\nif (notes !== false) {\\n data.push({\\n title: htmlTag(\\\"big\\\", \\\"备注\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(htmlTag(\\\"u\\\", \\\"查看完整公告 >\\\")),\\n desc: notes,\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra: {\\n text: notesHtml,\\n name: dataItem.name,\\n // type: \\\"long_text\\\"\\n type: \\\"rich_text\\\"\\n }\\n });\\n}\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"操作\\\"),\\n col_type: \\\"text_1\\\",\\n url: \\\"toast://你才是最帅的那个人!\\\"\\n});\\nlet importUrl, ruleCode, shareUrl, backCode = \\\"\\\";\\nlet subUrl = ruleListJson + dataItem.id + auth;\\nif (!dataItem.is_json) {\\n backCode = request(subUrl);\\n}\\nswitch (dataItem.data_type) {\\n case \\\"home_rule_url\\\":\\n ruleCode = \\\"海阔视界首页频道规则【\\\" + dataItem.name + \\\"】¥home_rule_url¥\\\" + ruleListJson + dataItem.id + auth;\\n importUrl = \\\"rule://\\\" + base64Encode(ruleCode)\\n break;\\n case 'publish':\\n ruleCode = '海阔视界规则分享,当前分享的是:' + dataItem.name + '¥publish¥' + base64Encode(backCode);\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break;\\n case 'js_url':\\n ruleCode = '海阔视界规则分享,当前分享的是:网页插件¥js_url¥' + dataItem.name + '@base64://' + base64Encode(backCode);\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break;\\n case 'html':\\n let file_tmp = dataItem.name.split('.');\\n let file_path = file_tmp.length > 1 ? file_tmp[file_tmp.length - 1] + \\\"/\\\" + dataItem.name : dataItem.name;\\n ruleCode = \\\"海阔视界本地文件分享¥file_url¥hiker://files/rules/dzHouse/\\\" + file_path + \\\"@\\\" + ruleListJson + dataItem.id + auth;\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break\\n case \\\"config\\\":\\n importUrl = $().rule(password => {\\n eval(fetch(\\\"hiker://assets/home.js\\\"));\\n HikerHome.load(\\\"import\\\", password);\\n }, backCode);\\n break;\\n}\\nlet my_col_type = \\\"text_2\\\";\\nif (importUrl) {\\n data.push({\\n title: \\\"导入规则\\\",\\n url: importUrl,\\n col_type: my_col_type\\n });\\n if(dataItem.is_json_list&&/home_rule_url|html/.test(dataItem.data_type)){\\n data.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入道德经</span>',\\n url: $().lazyRule((dataItem,subUrl)=>{\\n // let title = \\\"H-\\\"+dataItem.name+\\\".\\\"+dataItem.author;\\n let title = \\\"J-\\\"+dataItem.name.split('.')[0];\\n let subObj = {\\n title: title,\\n url: subUrl,\\n desc: \\\"hiker://files/rules/dzHouse/ruleCache/\\\"+title+\\\".json\\\",\\n code: \\\"\\\",\\n active: false,//禁用并发更新\\n }\\n let shareText = base64Encode(JSON.stringify(subObj));\\n var pastes = getPastes();\\n var url = sharePaste(shareText,pastes.slice(-1)[0]);\\n let import_rule= \\\"轻合集订阅:\\\"+title+'\\\\n'+url;\\n copy(import_rule);\\n const path = 'hiker://files/rules/dzHouse/ruleCache/sub.json';\\n $.rc(config.lib.sub);\\n return 订阅导入(path)\\n },dataItem,subUrl),\\n col_type: my_col_type\\n });\\n }\\n}\\nif (ruleCode) {\\n data.push({\\n title: \\\"分享规则\\\",\\n url: \\\"copy://\\\" + ruleCode,\\n col_type: my_col_type\\n });\\n}\\n\\nfunction setSettingItem(basic, pattern) {\\n let temp = {\\n title: basic.title,\\n col_type: basic.col_type,\\n url: $(basic.confirm).confirm((url, msg, pattern) => {\\n let backA = request(url);\\n let ret = JSON.parse(backA);\\n if (ret.status == 0) {\\n pattern ? back() : refreshPage(false);\\n return \\\"toast://\\\" + msg[0];\\n } else {\\n pattern ? back() : refreshPage(false);\\n return \\\"toast://\\\" + msg[1] + \\\"\\\\n\\\" + ret.detail;\\n }\\n }, basic.url, basic.msg, pattern)\\n };\\n return temp;\\n}\\nif (dataItem.state == 'private') {\\n data.push({\\n title: \\\"设为公开\\\",\\n url: $(getApi(\\\"share\\\") + reqByGet + \\\"&flag\\\" + \\\"#noLoading#\\\").lazyRule(() => {\\n request(input);\\n refreshPage(false);\\n return \\\"toast://已设为公开\\\";\\n }),\\n col_type: my_col_type\\n }, {\\n title: \\\"随机密钥\\\",\\n col_type: my_col_type,\\n url: $(getApi(\\\"genAuth\\\") + reqByGet + \\\"#noLoading#\\\").lazyRule(() => {\\n let back = request(input);\\n let ret = JSON.parse(back);\\n if (ret.status == 0) {\\n refreshPage(false);\\n return \\\"toast://已生成随机密码\\\\n\\\" + ret.result\\n } else {\\n refreshPage(true);\\n return \\\"toast://随机密码生成失败\\\"\\n }\\n })\\n });\\n let timeOver = {\\n col_type: my_col_type\\n };\\n if (dataItem.time_over) {\\n timeOver.title = small(color(\\\"短时密钥\\\", \\\"green\\\") + color(\\\"(→永久)\\\", \\\"red\\\"));\\n timeOver.url = getApi(\\\"timeover\\\") + reqByGet + \\\"&flag=1\\\";\\n timeOver.confirm = \\\"是否确认以后的私藏规则分享不过期?\\\";\\n timeOver.msg = [\\\"已设为永久\\\", \\\"设为永久失败\\\"];\\n } else {\\n timeOver.title = small(color(\\\"永久密钥\\\", \\\"red\\\") + color(\\\"(→短时)\\\", \\\"green\\\"));\\n timeOver.url = getApi(\\\"timeover\\\") + reqByGet;\\n timeOver.confirm = \\\"确认要以后分享的私藏规则自动到期?\\\";\\n timeOver.msg = [\\\"已设为过期\\\", \\\"设为过期失败\\\"];\\n }\\n data.push(setSettingItem(timeOver));\\n} else if (dataItem.state == 'public') {\\n data.push({\\n title: \\\"设为私有\\\",\\n url: $(getApi(\\\"share\\\") + reqByGet + \\\"&flag=1#noLoading#\\\").lazyRule(() => {\\n request(input);\\n refreshPage(false);\\n return \\\"toast://已设为私有\\\";\\n }),\\n col_type: my_col_type\\n });\\n}\\ndata.push(setSettingItem({\\n title: \\\"删除数据\\\",\\n confirm: \\\"是否确认删除\\\",\\n msg: [\\\"已删除\\\", \\\"删除失败\\\"],\\n url: getApi(\\\"deleteUrl\\\") + reqByGet,\\n col_type: my_col_type\\n}, true));\\ndata.push({\\n title: \\\"设置图标\\\",\\n url: $(dataItem.pic_url, \\\"输入图标地址\\\").input(api => {\\n if (input === \\\"\\\") {\\n return \\\"toast://你在逗我链接哪?\\\"\\n }\\n let result = request(api + \\\"&rule_pic=\\\" + input);\\n result = JSON.parse(result);\\n if (result.status !== 0) {\\n return \\\"toast://\\\" + result.detail;\\n }\\n return \\\"toast://修改成功\\\";\\n }, getApi(\\\"set_rule_pic\\\") + dataItem.id + reqByGet),\\n col_type: my_col_type\\n});\\n\\ndata.push({\\n title: dataItem.can_discuss ? \\\"禁止评论\\\" : \\\"开启评论\\\",\\n url: $(api.dis_set + dataItem.id + reqByGet + \\\"&state=\\\" + (dataItem.can_discuss ? \\\"\\\" : 1)).lazyRule((can_discuss) => {\\n request(input);\\n refreshPage(false);\\n return can_discuss ? \\\"toast://已禁止评论\\\" : \\\"toast://已开启评论\\\";\\n }, dataItem.can_discuss),\\n col_type: my_col_type\\n});\\nMY_PARAMS.name = dataItem.name;\\nMY_PARAMS.username=username;\\nMY_PARAMS.password=password;\\ndata.push({\\n title: \\\"设置备注\\\",\\n url: \\\"hiker://page/set_rule_notes\\\",\\n extra: MY_PARAMS,\\n col_type: my_col_type\\n});\\nif (dataItem.is_json && dataItem.data_type === \\\"home_rule_url\\\" && !dataItem.is_json_list) {\\n data.push({\\n title: '进入频道',\\n url: $( /*\\\"#noLoading#\\\"*/ ).lazyRule((name,home) => {\\n let ruleList = JSON.parse(request(home));\\n let hasRule = ruleList.some(item => item.title === name);\\n if (hasRule) {\\n putVar(\\\"Warehouse.back\\\", \\\"1\\\");\\n back();\\n return home+\\\"s@\\\" + name;\\n } else {\\n return \\\"toast://未安装\\\";\\n }\\n }, dataItem.name,api.home),\\n col_type: my_col_type\\n });\\n}\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\ndata.push({\\n title: dataItem.good_num,\\n pic_url: \\\"hiker://files/icon/赞.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://empty\\\"\\n});\\ndata.push({\\n title: dataItem.bad_num,\\n pic_url: \\\"hiker://files/icon/踩.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://empty\\\"\\n});\\ndata.push({\\n title: \\\"评论\\\",\\n pic_url: \\\"hiker://files/icon/评论.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://page/Reply#noHistory##noRecordHistory#\\\",\\n extra: {\\n ruleId: dataItem.id,\\n name: dataItem.author,\\n password: password,\\n username: username\\n }\\n});\\nlet totalSum = dataItem.good_num + dataItem.bad_num;\\n\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"评论(\\\" + totalSum + \\\")\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(htmlTag(\\\"u\\\", \\\"查看全部评论(控评) >\\\")),\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/Comment\\\",\\n extra: {\\n url: \\\"hiker://empty#fypage#noHistory##noRecordHistory#\\\",\\n id: dataItem.id,\\n totalSum: totalSum,\\n no_active: true,\\n username: username,\\n password: password\\n }\\n});\\n//const longestSum=120;\\nlet icon = {\\n \\\"good\\\": \\\"👍\\\",\\n \\\"bad\\\": \\\"👎\\\",\\n \\\"reply\\\": \\\"开发者🗣\\\"\\n}\\nif (totalSum === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>一条评论也没有,快来抢沙发吧!</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n} else {\\n let commentList = JSON.parse(request(api.dis_get + dataItem.id + \\\"?limit=5\\\")).result;\\n for (let item of commentList) {\\n let Reply = item.discuss_type===\\\"reply\\\"&&item.reply_to_name!==false&&item.reply_to_id!==false?\\\"‘‘回复@\\\"+item.reply_to_name+\\\" #\\\"+item.discuss_id+\\\"’’\\\\n\\\":\\\"\\\";\\n data.push({\\n title: item.name + \\\"&nbsp;&nbsp;<font color='gray'><small>#\\\" + item.id + \\\"</small><font>\\\",\\n col_type: \\\"avatar\\\",\\n url: \\\"hiker://page/Reply\\\",\\n extra:{\\n ruleId: dataItem.id,\\n name: item.name,\\n password: password,\\n username: username,\\n replyId:item.id\\n },\\n pic_url: item.avatar_url\\n });\\n data.push({\\n title: item.discuss_text,\\n desc: Reply+item.create_date + \\\"·\\\" + icon[item.discuss_type],\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra: {\\n name: item.name,\\n type: \\\"long_text\\\",\\n text: item.discuss_text\\n },\\n pic_url: item.avatar_url\\n });\\n }\\n}\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\nsetResult(data);\"},{\"col_type\":\"icon_2_round\",\"name\":\"规则列表\",\"path\":\"rules\",\"rule\":\"js:\\n addListener('onClose',$.toString(()=>{\\n clearVar(\\\"Warehouse.back\\\");\\n clearVar(\\\"Warehouse.filter\\\");\\n clearVar(\\\"Warehouse.type\\\");\\n if(getVar('Warehouse.can_upload','')){\\n log('操作过禁止上传:'+getVar('Warehouse.can_upload'));\\n clearVar(\\\"Warehouse.can_upload\\\");\\n refreshPage(true);\\n }\\n }));\\n\\nif (getVar(\\\"Warehouse.back\\\") === \\\"1\\\") {\\n back(false);\\n}\\n\\nconst {\\n getApi,\\n api,\\n color,\\n small,\\n localRuleVer,\\n htmlTag,\\n md\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nconst { normalSort } = $.require(\\\"hiker://page/sort\\\");\\nlet {\\n avatarUrl,\\n qq,\\n id,\\n can_upload\\n} = MY_PARAMS;\\nlet dataType = getVar(\\\"Warehouse.type\\\",\\\"\\\");\\nlet backCode = JSON.parse(request(getApi(\\\"rulesUrl\\\") + \\\"?name=\\\" + qq+\\\"&data_type=\\\"+dataType));\\nlet devName = backCode.dev_name;\\nputVar(\\\"Warehouse.filter\\\", devName);\\nlet ruleList = backCode.result;\\nlet subUrl = getApi(\\\"jsonList\\\") + \\\"?name=\\\" + qq;\\nlet hasSub = hasHomeSub(subUrl);\\nlet devInfo = \\\"这个人很懒,什么都没写哦~\\\";\\nlet tmpJson = JSON.parse(request(getApi(\\\"infoGetUrl\\\") + qq));\\nif (tmpJson.status == 0) {\\n devInfo = tmpJson.result || devInfo;\\n}\\nlet subFlag = hasSub ? '🆗' : '📡';\\nlet data = [];\\nrequire(md);\\ndevInfo=marked.parse(devInfo);\\ndata.push({\\n title: \\\"““””\\\" + devName + \\\"\\\\n\\\\n\\\" + small(htmlTag(\\\"u\\\", \\\"点击查看完整公告\\\")),\\n desc: small(devInfo),\\n url: 'hiker://page/info',\\n extra: {\\n text: devInfo,\\n name: devName,\\n type:\\\"rich_text\\\"\\n },\\n pic_url: avatarUrl,\\n col_type: 'movie_1_vertical_pic'\\n});\\ndata.push({\\n title: \\\"<big>订阅管理</big>&nbsp;&nbsp;<small>(当前\\\" + (hasSub ? \\\"已订阅\\\" : \\\"未订阅\\\") + \\\")</small>\\\",\\n col_type: \\\"rich_text\\\"\\n});\\n\\nlet sub_code = '海阔视界合集规则订阅¥home_sub¥' + devName + \\\"合集@@\\\" + subUrl;\\nlet rulesCode = '海阔视界合集规则¥home_rule_url¥' + subUrl;\\ndata.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">一键订阅</span>',\\n desc: '订阅““””<span style=\\\"color: #5cff2c\\\">' + devName + '</span>的所有单规则,合集需单独订阅',\\n url: sub_code,\\n col_type: 'text_2'\\n});\\ndata.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入全部</span>',\\n url: rulesCode,\\n col_type: 'text_2'\\n});\\ndata.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入轻合集</span>',\\n url: $().lazyRule((devName,subUrl,avatarUrl)=>{\\n const {genRule}=$.require(\\\"hiker://page/genApi\\\");\\n log(\\\"轻合集图标链接:\\\"+avatarUrl);\\n let import_rule=genRule(\\\"轻合集.\\\"+devName,subUrl,avatarUrl);\\n //copy(import_rule);\\n let ruleCode=parsePaste(import_rule.split(\\\"\\\\n\\\")[0]);\\n //return \\\"hiker://empty\\\"\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n return importUrl\\n },devName,subUrl,avatarUrl),\\n col_type: 'text_2'\\n});\\ndata.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入道德经</span>',\\n url: $().lazyRule((devName,subUrl,avatarUrl)=>{\\n let title = \\\"H-\\\"+devName;\\n let subObj = {\\n title: title,\\n url: subUrl,\\n desc: \\\"hiker://files/rules/dzHouse/ruleCache/\\\"+title+\\\".json\\\",\\n code: \\\"\\\",\\n active: false,//禁用并发更新\\n }\\n let shareText = base64Encode(JSON.stringify(subObj));\\n var pastes = getPastes();\\n var url = sharePaste(shareText,pastes.slice(-1)[0]);\\n let import_rule= \\\"轻合集订阅:\\\"+title+'\\\\n'+url;\\n copy(import_rule);\\n const path = 'hiker://files/rules/dzHouse/ruleCache/sub.json';\\n $.rc(config.lib.sub);\\n return 订阅导入(path)\\n },devName,subUrl,avatarUrl),\\n col_type: 'text_2'\\n});\\nlet can_upload_api = getApi(\\\"manCanUpload\\\")+id;\\nif(getVar('house.is_manager')){\\n let tips = can_upload?'能':'否';\\n // log('tips:'+tips);\\n // log('can_upload:'+can_upload);\\n data.push({\\n title:'⚠能否上传:'+(getVar('Warehouse.can_upload')||tips),\\n col_type:'scroll_button',\\n url:'hiker://empty'\\n });\\n function setUpload(flag,can_upload_api) {\\n flag = flag || '';\\n try {\\n let code = fetch(can_upload_api, {\\n headers: {\\\"User-Agent\\\": MOBILE_UA},\\n body: {\\n \\\"params\\\":\\n {\\n \\\"username\\\": getVar('house.username'),\\n \\\"password\\\": getVar('house.password'),\\n \\\"can_upload\\\": !!flag\\n }\\n }\\n });\\n code = JSON.parse(code).result;\\n if (code.status === 0) {\\n return code.detail\\n } else {\\n return '操作失败:' + code.detail\\n }\\n } catch (e) {\\n return '操作失败:' + e.message\\n }\\n }\\n data.push({\\n title:'🚫禁止上传',\\n col_type:'scroll_button',\\n url:$('禁止该开发者上传规则?你的操作将被系统记录').confirm((id,can_upload_api,setUpload)=>{\\n let ret = setUpload(false,can_upload_api);\\n if(!/操作失败/.test(ret)){\\n putVar('Warehouse.can_upload','否');\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },id,can_upload_api,setUpload)\\n });\\n data.push({\\n title:'✅允许上传',\\n col_type:'scroll_button',\\n url:$('允许该开发者上传规则?你的操作将被系统记录').confirm((id,can_upload_api,setUpload)=>{\\n let ret = setUpload(true,can_upload_api);\\n if(!/操作失败/.test(ret)){\\n putVar('Warehouse.can_upload','是');\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },id,can_upload_api,setUpload)\\n });\\n}\\ndata.push({\\n title: \\\"<small>提示:开发者单独分享的合集文件只能单独导入。</small>\\\",\\n col_type: \\\"rich_text\\\"\\n});\\ndata.push({\\n title: \\\"<big>规则列表</big>&nbsp;&nbsp;<small>(共\\\" + ruleList.length + \\\"条)</small>\\\",\\n col_type: \\\"rich_text\\\"\\n});\\nlet dataTypeList = {\\n \\\"\\\":\\\"全部\\\",\\n \\\"home_rule_url\\\": '小程序',\\n //\\\"publish\\\": '提交云仓库规则',\\n \\\"js_url\\\": '网页插件',\\n \\\"html\\\": '静态页面',\\n \\\"config\\\": '主题'\\n};\\nfor(let key in dataTypeList){\\n data.push({\\n title:dataType===key?\\\"““\\\"+dataTypeList[key]+\\\"””\\\":dataTypeList[key],\\n url:$(\\\"#noLoading#\\\").lazyRule((key)=>{\\n putVar(\\\"Warehouse.type\\\",key);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n },key),\\n col_type:\\\"scroll_button\\\"\\n });\\n}\\nif (ruleList.length > 20) {\\n data.push({\\n title: \\\"搜索\\\",\\n url: $.toString(name => \\\"hiker://search?s=\\\" + input + \\\"&rule=\\\" + name, MY_RULE.title),\\n col_type: \\\"input\\\",\\n desc: \\\"搜索当前开发者的规则\\\"\\n });\\n}\\nlet homeList = JSON.parse(request(api.home));\\nlet mRuleList = [];\\nfor (var item of ruleList) {\\n var name = item.name;\\n if (item.is_tap) {\\n let location = JSON.parse(request(getApi(\\\"ruleListJson\\\") + \\\"?id=\\\" + item.id));\\n item.id = location.id;\\n item.name = location.name;\\n item.author = location.author;\\n item.data_type = location.data_type;\\n item.ver = location.ver\\n }\\n item.version = item.ver;\\n let label = \\\"\\\",\\n lver = -2;\\n if (item.is_json && item.data_type === \\\"home_rule_url\\\") {\\n lver = localRuleVer(homeList, item);\\n if (lver === -1) {\\n label = \\\"🆕\\\";\\n } else if (lver < item.ver) {\\n label = \\\"🆙\\\";\\n }\\n }\\n mRuleList.push({\\n title: label + name,\\n url: \\\"hiker://page/ruleDetail#noHistory##noRecordHistory#\\\",\\n extra: {\\n lver: lver,\\n id: item.id\\n },\\n pic_url: item.pic,\\n });\\n}\\n/* 归并排序 Start */\\nif(getItem(\\\"排序\\\",\\\"时间优先\\\")==='新版优先'){\\n mRuleList = normalSort(mRuleList);\\n}\\n/* 归并排序 End */\\ndata.push.apply(data, mRuleList)\\nsetResult(data);\\n\"},{\"col_type\":\"movie_3\",\"name\":\"规则详细-user\",\"path\":\"ruleDetail\",\"rule\":\"js:\\n const {\\n getApi,\\n color,\\n small,\\n htmlTag,\\n api,\\n md\\n } = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n id,\\n lver,\\n isAll\\n} = MY_PARAMS;\\nif(getParam(\\\"id\\\")){\\n isAll = true;\\n id = getParam(\\\"id\\\");\\n lver = lver || \\\"未获取版本号\\\";\\n}\\naddListener('onClose', $.toString((isAll) => {\\n if(!isAll){\\n refreshPage(false);\\n }\\n},isAll));\\nlet dataItem = JSON.parse(request(getApi(\\\"getbyid\\\") + \\\"?id=\\\" + id)).result;\\nsetPageTitle(\\\"「\\\" + dataItem.name + \\\"」\\\")\\nlet ruleListJson = getApi(\\\"ruleListJson\\\") + \\\"?id=\\\";\\nlet data = [];\\nvar hasSub = false;\\n\\nif (dataItem.is_json_list) {\\n hasSub = hasHomeSub(ruleListJson + dataItem.id);\\n} else if (!dataItem.is_json_list && dataItem.data_type == 'home_rule_url') {\\n hasSub = hasHomeSub(ruleListJson + dataItem.id + '&debug=true');\\n}\\n\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"版本\\\"),\\n desc: \\\"““””开发者:\\\" + color(dataItem.author, \\\"#228BE6\\\") + \\\"\\\\n云端版本:\\\" + color(dataItem.ver, \\\"#5cff2c\\\") + \\\"\\\\t\\\\t本地版本:\\\" + color(lver, \\\"#5cff2c\\\") + \\\"\\\\n更新于: [\\\" + color(dataItem.last_update, \\\"#ff7000\\\") + \\\"]\\\",\\n url: $(\\\"<开发者>\\\\n\\\" + dataItem.author + \\\"\\\\n<名称>\\\\n\\\" + dataItem.name + \\\"\\\\n<云端版本>\\\\n\\\" + dataItem.ver + \\\"\\\\n<本地版本>\\\\n\\\" + lver + \\\"\\\\n<更新时间>\\\\n[\\\" + dataItem.last_update + \\\"]\\\").confirm(() => {}),\\n col_type: 'text_1'\\n});\\nlet dataType = {\\n home_rule_url: '首页云规则',\\n publish: '提交云仓库规则',\\n js_url: '网页插件规则',\\n html: '静态页面',\\n config: '主页配置'\\n};\\n\\nlet basic = {\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\"\\n};\\nlet dataTypeTips = dataType[dataItem.data_type] || '未知规则:' + dataItem.data_type;\\n\\nlet safe_tip=dataItem.is_safe?\\\"安全\\\":\\\"危险\\\";\\nlet good_tip = dataItem.is_good?small(color(\\\"【优质规则】\\\",'#ff7000')):\\\"\\\";\\nlet not_safe_note=dataItem.not_safe_note;\\nbasic.title = htmlTag(\\\"big\\\", \\\"类型\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(\\\"(id:\\\" + dataItem.id + \\\")\\\")+\\\"\\\\t\\\\t\\\\t\\\" + small(\\\"(风险检测:\\\" +safe_tip+\\\")\\\")+good_tip;\\nbasic.desc = \\\"数据类型:\\\" + color(dataTypeTips, \\\"#cb54ff\\\") + \\\"\\\\n分享状态为:\\\" + dataItem.state;\\nif ([\\\"html\\\", \\\"config\\\", \\\"js_url\\\"].includes(dataItem.data_type)) {\\n basic.desc += \\\"\\\\n““”” =>\\\" + small(\\\"点此预览\\\");\\n basic.url = ruleListJson + dataItem.id;\\n}\\n\\ndata.push(basic);\\nlet hasSubs = \\\"\\\";\\nif (hasSub) {\\n hasSubs = \\\"\\\\t\\\\t\\\\t\\\" + small(\\\"已订阅\\\")\\n}\\n\\nlet notes = request(getApi(\\\"get_rule_note\\\") + id);\\nnotes = JSON.parse(notes).result;\\nrequire(md);\\nlet notesHtml=\\\"\\\"\\ntry{\\n notesHtml=marked.parse(notes);\\n}catch(e){}\\n\\nif (notes !== false) {\\n data.push({\\n title: htmlTag(\\\"big\\\", \\\"备注\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(htmlTag(\\\"u\\\", \\\"查看完整公告 >\\\")),\\n desc: notes,\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra: {\\n text: notesHtml,\\n name: dataItem.name,\\n // type: \\\"long_text\\\"\\n type: \\\"rich_text\\\"\\n }\\n });\\n}\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"操作(分享详细页)\\\") + hasSubs,\\n col_type: \\\"text_1\\\",\\n url: \\\"copy://道长仓库「\\\"+dataItem.name+\\\"」\\\\n\\\"+id+'@import=js:$.require(\\\"hiker://page/ruleDetailImport?rule=道长仓库Pro\\\", input)'\\n});\\nlet importUrl, ruleCode, shareUrl, backCode = \\\"\\\";\\nif (!dataItem.is_json) {\\n backCode = request(ruleListJson + dataItem.id);\\n}\\nswitch (dataItem.data_type) {\\n case \\\"home_rule_url\\\":\\n ruleCode = \\\"海阔视界首页频道规则【\\\" + dataItem.name + \\\"】¥home_rule_url¥\\\" + ruleListJson + dataItem.id;\\n importUrl = \\\"rule://\\\" + base64Encode(ruleCode)\\n break;\\n case 'publish':\\n ruleCode = '海阔视界规则分享,当前分享的是:' + dataItem.name + '¥publish¥' + base64Encode(backCode);\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break;\\n case 'js_url':\\n ruleCode = '海阔视界规则分享,当前分享的是:网页插件¥js_url¥' + dataItem.name + '@base64://' + base64Encode(backCode);\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break;\\n case 'html':\\n let file_tmp = dataItem.name.split('.');\\n let file_path = file_tmp.length > 1 ? file_tmp[file_tmp.length - 1] + \\\"/\\\" + dataItem.name : dataItem.name;\\n ruleCode = \\\"海阔视界本地文件分享¥file_url¥hiker://files/rules/dzHouse/\\\" + file_path + \\\"@\\\" + ruleListJson + dataItem.id;\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n break\\n case \\\"config\\\":\\n importUrl = $().rule(password => {\\n eval(fetch(\\\"hiker://assets/home.js\\\"));\\n HikerHome.load(\\\"import\\\", password);\\n }, backCode);\\n break;\\n}\\nlet my_col_type = \\\"text_2\\\";\\nlet my_col_type2 = \\\"text_3\\\";\\nif (importUrl) {\\n data.push({\\n title: \\\"导入规则\\\",\\n url: dataItem.is_safe?importUrl:'toast://风险规则禁止导入!!!',\\n col_type: my_col_type\\n });\\n}\\nif (ruleCode) {\\n data.push({\\n title: \\\"分享口令\\\",\\n url: \\\"copy://\\\" + ruleCode,\\n col_type: my_col_type\\n });\\n}\\n\\nif (importUrl) {\\n if (dataItem.is_json_list && !hasSub) {\\n let sub_rule_code = '海阔视界合集规则订阅¥home_sub¥' + dataItem.name + \\\"@@\\\" + ruleListJson + dataItem.id;\\n let sub_url = 'rule://' + base64Encode(sub_rule_code);\\n data.push({\\n title: '订阅合集',\\n url: sub_url,\\n col_type: my_col_type2\\n });\\n data.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入轻合集</span>',\\n url: $().lazyRule((dataItem,subUrl)=>{\\n const {genRule}=$.require(\\\"hiker://page/genApi\\\");\\n let import_rule=genRule(dataItem.name+\\\".\\\"+dataItem.author,subUrl);\\n //copy(import_rule);\\n let ruleCode=parsePaste(import_rule.split(\\\"\\\\n\\\")[0]);\\n //return \\\"hiker://empty\\\"\\n importUrl = 'rule://' + base64Encode(ruleCode);\\n return importUrl\\n },dataItem,ruleListJson + dataItem.id),\\n col_type: my_col_type2\\n });\\n data.push({\\n title: '““””<span style=\\\"color: #ff7000\\\">导入道德经</span>',\\n url: $().lazyRule((dataItem,subUrl)=>{\\n // let title = \\\"H-\\\"+dataItem.name+\\\".\\\"+dataItem.author;\\n let title = \\\"J-\\\"+dataItem.name.split('.')[0];\\n let subObj = {\\n title: title,\\n url: subUrl,\\n desc: \\\"hiker://files/rules/dzHouse/ruleCache/\\\"+title+\\\".json\\\",\\n code: \\\"\\\",\\n active: false,//禁用并发更新\\n }\\n let shareText = base64Encode(JSON.stringify(subObj));\\n var pastes = getPastes();\\n var url = sharePaste(shareText,pastes.slice(-1)[0]);\\n let import_rule= \\\"轻合集订阅:\\\"+title+'\\\\n'+url;\\n copy(import_rule);\\n const path = 'hiker://files/rules/dzHouse/ruleCache/sub.json';\\n $.rc(config.lib.sub);\\n return 订阅导入(path)\\n },dataItem,ruleListJson + dataItem.id),\\n col_type: my_col_type2\\n });\\n data.push({\\n title: \\\"<small>提示:开发者单独分享的合集文件只能单独导入。</small>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n } else if (!dataItem.is_json_list && !hasSub && dataItem.data_type == 'home_rule_url') {\\n let sub_rule_code = '海阔视界单规则订阅¥home_sub¥' + dataItem.name + \\\"@@\\\" + ruleListJson + dataItem.id + '&debug=true';\\n let sub_url = 'rule://' + base64Encode(sub_rule_code);\\n data.push({\\n title: '订阅规则',\\n url: sub_url,\\n col_type: my_col_type\\n })\\n }\\n}\\nif (dataItem.is_json && dataItem.data_type === \\\"home_rule_url\\\" && !dataItem.is_json_list) {\\n data.push({\\n title: '进入频道',\\n url: $( /*\\\"#noLoading#\\\"*/ ).lazyRule((name,home) => {\\n let ruleList = JSON.parse(request(home));\\n let hasRule = ruleList.some(item => item.title === name);\\n if (hasRule) {\\n putVar(\\\"Warehouse.back\\\", \\\"1\\\");\\n back();\\n return home+\\\"s@\\\" + name;\\n } else {\\n return \\\"toast://未安装\\\";\\n }\\n }, dataItem.name,api.home),\\n col_type: my_col_type\\n })\\n}\\nlet man_rule_safe = getApi(\\\"manRuleSafe\\\")+dataItem.id;\\nlet man_rule_good = getApi(\\\"manRuleGood\\\")+dataItem.id;\\n// dataItem.is_safe;\\nif(getVar('house.is_manager')){\\n function setIsSafe(flag,man_rule_safe) {\\n flag = flag || '';\\n try {\\n let code = fetch(man_rule_safe, {\\n headers: {\\\"User-Agent\\\": MOBILE_UA},\\n body: {\\n \\\"params\\\":\\n {\\n \\\"username\\\": getVar('house.username'),\\n \\\"password\\\": getVar('house.password'),\\n \\\"is_safe\\\": !!flag\\n }\\n }\\n });\\n code = JSON.parse(code).result;\\n if (code.status === 0) {\\n return code.detail\\n } else {\\n return '操作失败:' + code.detail\\n }\\n } catch (e) {\\n return '操作失败:' + e.message\\n }\\n }\\n function setIsGood(flag,man_rule_good) {\\n flag = flag || '';\\n try {\\n let code = fetch(man_rule_good, {\\n headers: {\\\"User-Agent\\\": MOBILE_UA},\\n body: {\\n \\\"params\\\":\\n {\\n \\\"username\\\": getVar('house.username'),\\n \\\"password\\\": getVar('house.password'),\\n \\\"is_good\\\": !!flag\\n }\\n }\\n });\\n code = JSON.parse(code).result;\\n if (code.status === 0) {\\n return code.detail\\n } else {\\n return '操作失败:' + code.detail\\n }\\n } catch (e) {\\n return '操作失败:' + e.message\\n }\\n }\\n data.push({\\n title:'🚫风险',\\n col_type:'scroll_button',\\n url:$('标记该规则为风险?风险规则无法被导入').confirm((id,man_rule_safe,setIsSafe)=>{\\n let ret = setIsSafe(false,man_rule_safe);\\n if(!/操作失败/.test(ret)){\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },dataItem.id,man_rule_safe,setIsSafe)\\n });\\n data.push({\\n title:'✅正常',\\n col_type:'scroll_button',\\n url:$('标记该规则为正常?').confirm((id,man_rule_safe,setIsSafe)=>{\\n let ret = setIsSafe(true,man_rule_safe);\\n if(!/操作失败/.test(ret)){\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },dataItem.id,man_rule_safe,setIsSafe)\\n });\\n data.push({\\n title:'♥非优质',\\n col_type:'scroll_button',\\n url:$('标记该规则为非优质?').confirm((id,man_rule_good,setIsGood)=>{\\n let ret = setIsGood(false,man_rule_good);\\n if(!/操作失败/.test(ret)){\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },dataItem.id,man_rule_good,setIsGood)\\n });\\n data.push({\\n title:'💖优质',\\n col_type:'scroll_button',\\n url:$('标记该规则为优质?').confirm((id,man_rule_good,setIsGood)=>{\\n let ret = setIsGood(true,man_rule_good);\\n if(!/操作失败/.test(ret)){\\n refreshPage(false);\\n }\\n return 'toast://'+ret\\n },dataItem.id,man_rule_good,setIsGood)\\n });\\n}\\n\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\ndata.push({\\n title: dataItem.good_num,\\n pic_url: \\\"hiker://files/icon/赞.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://page/MakeAcomment#noHistory##noRecordHistory#\\\",\\n extra: {\\n id: dataItem.id,\\n name: dataItem.name\\n }\\n});\\ndata.push({\\n title: dataItem.bad_num,\\n pic_url: \\\"hiker://files/icon/踩.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://page/MakeAcomment#noHistory##noRecordHistory#\\\",\\n extra: {\\n id: dataItem.id,\\n name: dataItem.name,\\n defaultType:\\\"bad\\\"\\n }\\n});\\ndata.push({\\n title: \\\"评论\\\",\\n pic_url: \\\"hiker://files/icon/评论.svg\\\",\\n col_type: \\\"icon_small_3\\\",\\n url: \\\"hiker://page/MakeAcomment#noHistory##noRecordHistory#\\\",\\n extra: {\\n id: dataItem.id,\\n name: dataItem.name\\n }\\n});\\nlet totalSum = dataItem.good_num + dataItem.bad_num;\\n\\ndata.push({\\n title: htmlTag(\\\"big\\\", \\\"评论(\\\" + totalSum + \\\")\\\") + \\\"\\\\t\\\\t\\\\t\\\" + small(htmlTag(\\\"u\\\", \\\"查看全部评论 >\\\")),\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/Comment\\\",\\n extra: {\\n url: \\\"hiker://empty#fypage#noHistory##noRecordHistory#\\\",\\n id: dataItem.id,\\n totalSum: totalSum,\\n no_active: false\\n }\\n});\\n//const longestSum=120;\\nlet icon = {\\n \\\"good\\\": \\\"👍\\\",\\n \\\"bad\\\": \\\"👎\\\",\\n \\\"reply\\\":\\\"开发者🗣\\\"\\n}\\nif (totalSum === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>一条评论也没有,快来抢沙发吧!</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n} else {\\n let commentList = JSON.parse(request(api.dis_get + dataItem.id + \\\"?limit=5\\\")).result;\\n for (let item of commentList) {\\n let Reply = item.discuss_type===\\\"reply\\\"&&item.reply_to_name!==false&&item.reply_to_id!==false?\\\"‘‘回复@\\\"+item.reply_to_name+\\\" #\\\"+item.discuss_id+\\\"’’\\\\n\\\":\\\"\\\";\\n data.push({\\n title: item.name + \\\"&nbsp;&nbsp;<font color='gray'><small>#\\\" + item.id + \\\"</small><font>\\\",\\n col_type: \\\"avatar\\\",\\n //url: \\\"toast://\\\" + item.qq,\\n url:\\\"mqqwpa://im/chat?chat_type=wpa&uin=\\\"+item.qq,\\n pic_url: item.avatar_url\\n });\\n data.push({\\n title: item.discuss_text,\\n desc: Reply+item.create_date + \\\"·\\\" + icon[item.discuss_type],\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra:{\\n name:item.name,\\n type:\\\"long_text\\\",\\n text:item.discuss_text\\n },\\n pic_url: item.avatar_url\\n });\\n }\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n}\\n\\nsetResult(data);\"},{\"col_type\":\"rich_text\",\"name\":\"查看\",\"path\":\"info\",\"rule\":\"js:\\nsetPageTitle(\\\"查看「\\\"+MY_PARAMS.name+\\\"」\\\")\\nsetResult([{\\n title: MY_PARAMS.text,\\n col_type:MY_PARAMS.type\\n}]);\"},{\"col_type\":\"movie_3\",\"name\":\"开发者注册\",\"path\":\"Register\",\"rule\":\"js:\\nsetPageTitle(\\\"开发者注册\\\");\\nconst {\\n getApi,\\n htmlTag,\\n mapColType,\\n small\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nvar data = [];\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.Password\\\");\\n clearVar(\\\"Warehouse.Username\\\");\\n clearVar(\\\"Warehouse.Description\\\");\\n clearVar(\\\"Warehouse.UserAddress\\\");\\n}));\\naddListener('onRefresh', $.toString(()=>{\\n putVar(\\\"Warehouse.Wait\\\", \\\"\\\");\\n}));\\ndata.push({\\n title: '账号',\\n desc: \\\"请输入账号(必填)\\\",\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('Warehouse.Username', ''),\\n type: \\\"number\\\",\\n onChange: 'putVar(\\\"Warehouse.Username\\\",input)'\\n }\\n}, {\\n title: '密码',\\n desc: \\\"请输入密码(必填)\\\",\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('Warehouse.Password', ''),\\n type: \\\"password\\\",\\n onChange: 'putVar(\\\"Warehouse.Password\\\",input)'\\n }\\n});\\nmapColType(data, \\\"line_blank\\\", 1);\\ndata.push({\\n title: '昵称',\\n desc: \\\"请输入昵称(必填)\\\",\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('Warehouse.UserAddress', ''),\\n onChange: 'putVar(\\\"Warehouse.UserAddress\\\",input)'\\n }\\n}, {\\n title: '描述',\\n desc: \\\"说说为什么要注册吧\\\\n(可以增加通过概率,选填)\\\",\\n col_type: 'input',\\n extra: {\\n defaultValue: getVar('Warehouse.Description', ''),\\n type: \\\"textarea\\\",\\n onChange: 'putVar(\\\"Warehouse.Description\\\",input)'\\n }\\n})\\n\\nmapColType(data, \\\"line_blank\\\", 1);\\n\\ndata.push({\\n title: htmlTag(\\\"b\\\", \\\"注册\\\"),\\n url: $(getApi(\\\"new_dev\\\")+\\\"#noLoading#\\\").lazyRule((getId, confirm) => {\\n let username = getVar('Warehouse.Username', \\\"\\\"),\\n password = getVar('Warehouse.Password', \\\"\\\"),\\n description = getVar('Warehouse.Description', \\\"\\\"),\\n name = getVar(\\\"Warehouse.UserAddress\\\", \\\"\\\");\\n if ([username, password, name].includes(\\\"\\\")) {\\n return \\\"toast://账号,密码和昵称不能为空\\\";\\n }\\n showLoading(\\\"正在提交申请表\\\");\\n let result = request(input, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"reason\\\": description,\\n \\\"name\\\": name,\\n \\\"password\\\": password,\\n \\\"qq\\\": username\\n }\\n }),\\n method: 'post'\\n });\\n result = JSON.parse(result).result;\\n hideLoading();\\n if (result.status !== 0) {\\n return \\\"toast://\\\" + result.detail;\\n }\\n let idresult = JSON.parse(request(getId + \\\"?qq=\\\" + username));\\n if (idresult.status !== 0) {\\n return \\\"toast://\\\" + idresult.detail;\\n }\\n \\n return $(\\\"\\\", \\\"输入邮箱验证码\\\\n\\\" + result.detail).input((confirm, id, account) => {\\n showLoading(\\\"请耐心等待\\\");\\n try {\\n let result = request(confirm, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"regist_id\\\": id,\\n \\\"yzm\\\": input\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status !== 0) {\\n hideLoading();\\n return \\\"toast://\\\" + result.detail;\\n } else {\\n putVar(\\\"WarehouseUsername\\\", account[0]);\\n putVar(\\\"WarehousePassword\\\", account[1]);\\n hideLoading();\\n back();\\n return \\\"toast://成功提交注册注册\\\\n\\\"+result.detail;\\n }\\n } catch (e) {\\n hideLoading();\\n return \\\"toast://出错了呐\\\";\\n }\\n }, confirm, idresult.result, [username, password]);\\n }, getApi(\\\"new_getId\\\"), getApi(\\\"new_confirm\\\")),\\n col_type: 'text_center_1'\\n});\\nsetResult(data);\"},{\"col_type\":\"text_1\",\"name\":\"个人资料\",\"path\":\"PersonalData\",\"rule\":\"js:\\nsetPageTitle(\\\"个人资料\\\");\\nvar data=[];\\nconst {\\n getApi,\\n getFile,\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\n\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\n\\nlet {username,password} = getFile();\\nlet dev = JSON.parse(request(getApi(\\\"user\\\")+MY_PARAMS.id)).result;\\ndata.push({\\n title:\\\"头像\\\",\\n desc:dev.avatar,\\n url:\\\"hiker://page/modify_PersonalData#noHistory##noRecordHistory#\\\",\\n extra:{\\n dev:dev,\\n username:username,\\n password:password,\\n Pattern:0\\n },\\n col_type:\\\"text_1\\\"\\n});\\n\\n\\ndata.push({\\n title:\\\"昵称\\\",\\n desc:dev.name,\\n url:\\\"hiker://page/modify_PersonalData#noHistory##noRecordHistory#\\\",\\n extra:{\\n dev:dev,\\n username:username,\\n password:password,\\n Pattern:1\\n },\\n col_type:\\\"text_1\\\"\\n});\\n\\ndata.push({\\n title:\\\"密码\\\",\\n url:\\\"hiker://page/modify_PersonalData#noHistory##noRecordHistory#\\\",\\n extra:{\\n dev:dev,\\n username:username,\\n password:password,\\n Pattern:2\\n },\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\ndata.push({\\n title:\\\"账号:\\\"+username,\\n url:\\\"copy://\\\"+username,\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n title:\\\"UID:\\\"+dev.id,\\n url:\\\"copy://\\\"+dev.id,\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\ndata.push({\\n title:\\\"提交云仓库规则\\\",\\n url:$(\\\"#noLoading#\\\").lazyRule((host)=>{\\n let code=request(host+\\\"/hikerule/rulelist.json?id=145\\\");\\n let word=\\\"¥publish¥\\\"+base64Encode(code);\\n return \\\"rule://\\\"+base64Encode(word);\\n },api.host),\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n title:\\\"同步提交云仓库账号密码\\\",\\n url:\\\"rule://\\\"+base64Encode(\\\"¥publish_account¥\\\"+username+\\\"@\\\"+password),\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\ndata.push({\\n title:\\\"你一共发布了「\\\"+dev.rule_num+\\\"」条规则\\\",\\n url:\\\"hiker://empty\\\",\\n col_type:\\\"text_1\\\"\\n});\\ndata.push({\\n col_type:\\\"line_blank\\\"\\n});\\nlet user = getFile();\\ndata.push({\\n title:\\\"注销登录\\\",\\n url:$(\\\"确认注销登录?\\\").confirm(f => {\\n f.username=\\\"\\\";\\n f.password=\\\"\\\";\\n writeFile('hiker://files/WarehouseUSER.json', JSON.stringify(f));\\n putVar(\\\"Warehouse.back\\\",\\\"1\\\");\\n back();\\n return \\\"toast://已注销\\\";\\n },user),\\n col_type:\\\"text_center_1\\\"\\n});\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"更改个人资料\",\"path\":\"modify_PersonalData\",\"rule\":\"js:\\nconst {\\n getApi,\\n color,\\n small,\\n getFile,\\n htmlTag\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n dev,\\n username,\\n password,\\n Pattern\\n} = MY_PARAMS;\\nvar data = [];\\nlet path = \\\"?qq=\\\" + username + \\\"&password=\\\" + password;\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.m.petName\\\");\\n clearVar(\\\"Warehouse.m.avatar\\\");\\n clearVar(\\\"Warehouse.m.Password.c\\\");\\n clearVar(\\\"Warehouse.m.Password.x\\\");\\n clearVar(\\\"Warehouse.m.Password.y\\\");\\n}));\\nfunction m_petName() {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n col_type: 'input',\\n desc: \\\"请输入新昵称\\\",\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.m.petName', '')||dev.name,\\n onChange: 'putVar(\\\"Warehouse.m.petName\\\",input)'\\n }\\n });\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title: \\\"保存\\\",\\n url: $(getApi(\\\"modify_name\\\") + path).lazyRule(() => {\\n let newPetName = getVar('Warehouse.m.petName', '');\\n if (newPetName == \\\"\\\") {\\n return \\\"toast://你还什么都没填啊!\\\";\\n }\\n let result = request(input + \\\"&name=\\\" + encodeURIComponent(newPetName));\\n result = JSON.parse(result);\\n if (result.status === 0) {\\n back();\\n return \\\"toast://修改成功\\\";\\n } else {\\n return \\\"toast://\\\" + result.detail;\\n }\\n }),\\n col_type: 'text_center_1'\\n });\\n}\\n\\nfunction m_avatar() {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n col_type: 'input',\\n desc: \\\"请输入新的头像链接\\\",\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.m.avatar', '') || dev.avatar,\\n onChange: 'putVar(\\\"Warehouse.m.avatar\\\",input)'\\n }\\n });\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title: \\\"保存\\\",\\n url: $(getApi(\\\"modify_ava\\\") + path).lazyRule(() => {\\n let newAvatar = getVar('Warehouse.m.avatar', '');\\n \\n let result = request(input + \\\"&avatar_url=\\\" + encodeURIComponent(newAvatar));\\n result = JSON.parse(result);\\n if (result.status === 0) {\\n back();\\n return \\\"toast://修改成功\\\";\\n } else {\\n return \\\"toast://\\\" + result.detail;\\n }\\n }),\\n col_type: 'text_center_1'\\n });\\n}\\n\\nfunction m_pwd() {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title:\\\"原密码\\\",\\n col_type: 'input',\\n desc: \\\"请输入原密码\\\",\\n extra: {\\n type:\\\"password\\\",\\n defaultValue: getVar('Warehouse.m.Password.y', ''),\\n onChange: 'putVar(\\\"Warehouse.m.Password.y\\\",input)'\\n }\\n });\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title:\\\"新密码\\\",\\n col_type: 'input',\\n desc: \\\"请输入新密码\\\",\\n extra: {\\n type:\\\"password\\\",\\n defaultValue: getVar('Warehouse.m.Password.x', ''),\\n onChange: 'putVar(\\\"Warehouse.m.Password.x\\\",input)'\\n }\\n });\\n data.push({\\n title:\\\"重复新密码\\\",\\n col_type: 'input',\\n desc: \\\"请重复新密码\\\",\\n extra: {\\n type:\\\"password\\\",\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.m.Password.c', ''),\\n onChange: 'putVar(\\\"Warehouse.m.Password.c\\\",input)'\\n }\\n });\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n data.push({\\n title: \\\"保存\\\",\\n url: $(getApi(\\\"modify_pwd\\\")+path).lazyRule((password,username) => {\\n let old_password = getVar('Warehouse.m.Password.y', '');\\n let new_password = getVar('Warehouse.m.Password.x', '');\\n let new_password_again = getVar('Warehouse.m.Password.c', '');\\n if (old_password!==password) {\\n return \\\"toast://原密码错误\\\";\\n }\\n if(new_password===\\\"\\\"){\\n return \\\"toast://请输入新密码\\\";\\n }\\n if(new_password!==new_password_again){\\n return \\\"toast://两次密码不同\\\"\\n }\\n let result = request(input + \\\"&new_password=\\\" + new_password+\\\"&new_password_re=\\\"+new_password_again);\\n result = JSON.parse(result);\\n if (result.status === 0) {\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\",JSON.stringify({\\n username:username,\\n password:new_password\\n }));\\n back();\\n return \\\"toast://修改成功\\\";\\n } else {\\n return \\\"toast://\\\" + result.detail;\\n }\\n },password,username),\\n col_type: 'text_center_1'\\n });\\n}\\n\\nswitch (Pattern) {\\n case 0:\\n setPageTitle(\\\"修改头像\\\");\\n m_avatar();\\n break;\\n case 1:\\n setPageTitle(\\\"修改昵称\\\");\\n m_petName();\\n break;\\n case 2:\\n setPageTitle(\\\"修改密码\\\");\\n m_pwd();\\n break;\\n}\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"编辑规则备注\",\"path\":\"set_rule_notes\",\"rule\":\"js:\\nlet data = [];\\nconst {\\n getApi\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n id,\\n username,\\n password,\\n name\\n} = MY_PARAMS;\\nsetPageTitle(\\\"备注「\\\"+name+\\\"」\\\");\\naddListener('onClose',\\\"clearVar('Warehouse.rule.notes', '')\\\");\\nlet notes=request(getApi(\\\"get_rule_note\\\")+id);\\nnotes=JSON.parse(notes).result;\\ndata.push({\\n desc: \\\"规则备注......\\\",\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.rule.notes', '')||notes||\\\"\\\",\\n type: \\\"textarea\\\",\\n height:-1,\\n onChange: 'putVar(\\\"Warehouse.rule.notes\\\",input)'\\n }\\n});\\n\\ndata.push({\\n title: \\\"保存\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(getApi(\\\"set_rule_note\\\") + id).lazyRule((username, password) => {\\n let notes = getVar('Warehouse.rule.notes', '');\\n let result = request(input, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"qq\\\": username,\\n \\\"password\\\": password,\\n \\\"note\\\":notes\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status !== 0) {\\n return \\\"toast://\\\" + result.detail;\\n }\\n back(false);\\n return \\\"toast://修改成功\\\";\\n }, username, password)\\n});\\nsetResult(data);\"},{\"col_type\":\"line\",\"name\":\"评论列表\",\"path\":\"Comment\",\"rule\":\"js:\\nsetPageTitle(\\\"评论列表\\\");\\nconst {\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet data = [];\\nlet {\\n totalSum,\\n id,\\n no_active,\\n username,\\n password\\n} = MY_PARAMS;\\nlet page = parseInt(MY_URL.split(\\\"#\\\")[1]);\\nlet discuss_type = getVar(\\\"Warehouse.comment.discuss_type\\\", \\\"\\\");\\nif (page === 1) {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n addListener('onClose', $.toString(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"\\\");\\n }));\\n data.push({\\n title: \\\"全部\\\" + (discuss_type === \\\"\\\" ? \\\"◉\\\" : \\\"○\\\"),\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_4'\\n\\n });\\n data.push({\\n title: \\\"👍赞\\\" + (discuss_type === \\\"good\\\" ? \\\"◉\\\" : \\\"○\\\"),\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"good\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_4'\\n\\n });\\n data.push({\\n title: \\\"👎踩\\\" + (discuss_type === \\\"bad\\\" ? \\\"◉\\\" : \\\"○\\\"),\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"bad\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_4'\\n });\\n data.push({\\n title: \\\"回复\\\" + (discuss_type === \\\"reply\\\" ? \\\"◉\\\" : \\\"○\\\"),\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.discuss_type\\\", \\\"reply\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_4'\\n });\\n}\\n\\n\\nlet icon = {\\n \\\"good\\\": \\\"👍\\\",\\n \\\"bad\\\": \\\"👎\\\",\\n \\\"reply\\\":\\\"开发者🗣\\\"\\n}\\nlet control=(pid,active)=>void 0;\\nif(no_active){\\n control=function(pid,active){\\n data.push({\\n title:active?\\\"隐藏评论\\\":\\\"展示评论\\\",\\n url:$(api.dis_dev_control+pid+\\\"?qq=\\\" + username + \\\"&password=\\\" + password+\\\"#noLoading#\\\").lazyRule(()=>{\\n let result=JSON.parse(request(input));\\n refreshPage(false)\\n return \\\"toast://\\\"+result.detail;\\n }),\\n col_type:\\\"text_2\\\"\\n });\\n data.push({\\n title:\\\"删除评论\\\",\\n url:$(\\\"确认删除该评论?\\\").confirm((input)=>{\\n let result=JSON.parse(request(input));\\n refreshPage(false)\\n return \\\"toast://\\\"+result.detail;\\n },api.dis_dev_control+pid+\\\"?qq=\\\" + username + \\\"&password=\\\" + password+\\\"&delete=1\\\"),\\n col_type:\\\"text_2\\\"\\n });\\n data.push({\\n col_type:\\\"line\\\"\\n });\\n data.push({\\n col_type:\\\"line\\\"\\n });\\n }\\n}\\nif (totalSum === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>一条评论也没有,快来抢沙发吧!</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n} else {\\n let commentList = JSON.parse(request(api.dis_get + id + \\\"?limit=5&page=\\\" + page + \\\"&no_active=\\\" + no_active + \\\"&discuss_type=\\\" + discuss_type)).result;\\n for (let item of commentList) {\\n let Reply = item.discuss_type===\\\"reply\\\"&&item.reply_to_name!==false&&item.reply_to_id!==false?\\\"‘‘回复@\\\"+item.reply_to_name+\\\" #\\\"+item.discuss_id+\\\"’’\\\\n\\\":\\\"\\\";\\n data.push({\\n title: item.name + \\\"&nbsp;&nbsp;<font color='gray'><small>#\\\" + item.id + \\\"</small><font>\\\",\\n col_type: \\\"avatar\\\",\\n //url: no_active?\\\"hiker://page/Reply\\\":\\\"toast://\\\" + item.qq,\\n\\t\\t url:no_active?\\\"hiker://page/Reply\\\":\\\"mqqwpa://im/chat?chat_type=wpa&uin=\\\"+item.qq,\\n extra:{\\n ruleId: id,\\n name: item.name,\\n password: password,\\n username: username,\\n replyId:item.id\\n },\\n pic_url: item.avatar_url\\n });\\n data.push({\\n title: item.discuss_text,\\n desc: Reply+item.create_date + \\\"·\\\" + icon[item.discuss_type],\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra:{\\n name:item.name,\\n type:\\\"long_text\\\",\\n text:item.discuss_text\\n },\\n pic_url: item.avatar_url\\n });\\n control(item.id,item.active);\\n }\\n if (commentList.length === 0) {\\n data.push({\\n col_type: \\\"line_blank\\\"\\n });\\n }\\n}\\n\\nsetResult(data)\"},{\"col_type\":\"movie_3\",\"name\":\"发表评论\",\"path\":\"MakeAcomment\",\"rule\":\"js:\\nlet data = [];\\nconst {\\n api,\\n getFile\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n id,\\n name,\\n defaultType\\n} = MY_PARAMS;\\nlet user=getFile().user||[\\\"\\\",\\\"\\\"];\\n\\nsetPageTitle(\\\"评论(\\\" + name + \\\")\\\");\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.comment.type\\\");\\n clearVar(\\\"Warehouse.comment.text\\\");\\n clearVar(\\\"Warehouse.comment.qq\\\");\\n refreshPage(false);\\n}));\\nlet type = getVar(\\\"Warehouse.comment.type\\\") || defaultType||\\\"good\\\";\\ndata.push({\\n desc: \\\"评论......\\\",\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.comment.text', ''),\\n type: \\\"textarea\\\",\\n height:7,\\n onChange: 'putVar(\\\"Warehouse.comment.text\\\",input)'\\n }\\n});\\ndata.push({\\n title:\\\"账号:\\\"+(user[0]||\\\"\\\"),\\n desc:\\\"验证码:\\\"+(user[1]||\\\"\\\"),\\n url:\\\"hiker://page/Userregistration\\\",\\n col_type: 'text_1',\\n \\n});\\n\\ndata.push({\\n title: (type === \\\"good\\\" ? \\\"◉\\\" : \\\"○\\\")+\\\" 👍\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.type\\\", \\\"good\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_2'\\n\\n});\\ndata.push({\\n title: (type === \\\"bad\\\" ? \\\"◉\\\" : \\\"○\\\")+\\\" 👎\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putVar(\\\"Warehouse.comment.type\\\", \\\"bad\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: 'text_2'\\n});\\n\\ndata.push({\\n title: \\\"提交\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(api.dis_new + id).lazyRule((Account) => {\\n let text = getVar('Warehouse.comment.text', '');\\n let [qq,auth_code] = Account;\\n let type = getVar('Warehouse.comment.type') || 'good';\\n qq=qq||\\\"\\\";\\n auth_code=auth_code||\\\"\\\";\\n if(qq==\\\"\\\"||auth_code==\\\"\\\"){\\n return \\\"toast://未登录账号\\\";\\n }\\n if(text==\\\"\\\"){\\n return \\\"toast://你还什么都没写啊\\\";\\n }\\n function r(p) {\\n let result = request(input, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify(p),\\n method: 'POST'\\n });\\n return JSON.parse(result).result;\\n }\\n let p = {\\n \\\"params\\\": {\\n \\\"discuss_text\\\": text,\\n \\\"qq\\\": qq,\\n \\\"discuss_type\\\": type,\\n \\\"auth_code\\\": auth_code\\n }\\n }\\n let result = r(p);\\n if(result.status===0){\\n back(false);\\n }\\n return \\\"toast://\\\"+result.detail;\\n\\n },user)\\n});\\n\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"伪用户注册\",\"path\":\"Userregistration\",\"rule\":\"js:\\nconst {\\n api,\\n getFile,\\n getUserDate\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet data = [];\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\nsetPageTitle(\\\"用户列表管理\\\");\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.m.qq\\\");\\n clearVar(\\\"Warehouse.m.yzm\\\");\\n}));\\nlet user = getFile();\\nlet userName = user.user || [\\\"\\\"];\\nuserName = userName[0];\\ndata.push({\\n title: \\\"““””<big>(添加/验证)账号</big>\\\",\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\"\\n});\\n\\ndata.push({\\n title: \\\"获取\\\",\\n col_type: 'input',\\n desc: \\\"请输入qq\\\",\\n url: $.toString((a, b) => {\\n let qq = input;\\n if (qq == \\\"\\\") {\\n return \\\"toast://你还什么都没填啊!\\\";\\n }\\n showLoading(\\\"获取中...\\\")\\n return $(\\\"#noLoading#\\\").lazyRule((qq, a, b) => {\\n try {\\n let result = request(a, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"qq\\\": qq\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status === 0) {\\n hideLoading();\\n return \\\"toast://\\\" + result.detail;\\n } else {\\n let result2 = JSON.parse(request(b + \\\"?qq=\\\" + qq));\\n hideLoading();\\n return \\\"toast://\\\" + result2.detail;\\n }\\n } catch (e) {\\n hideLoading();\\n throw e;\\n }\\n }, qq, a, b);\\n\\n }, api.dis_new_user, api.dis_verify),\\n extra: {\\n type: \\\"number\\\",\\n defaultValue: getVar('Warehouse.m.qq', '') || userName,\\n onChange: 'putVar(\\\"Warehouse.m.qq\\\",input)'\\n }\\n});\\n\\ndata.push({\\n col_type: 'input',\\n desc: \\\"请输入验证码\\\",\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.m.yzm', ''),\\n onChange: 'putVar(\\\"Warehouse.m.yzm\\\",input)'\\n }\\n});\\ndata.push({\\n col_type: 'rich_text',\\n title: \\\"<small>提示:1.每天只能获取5次验证码.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.<s>验证码有效期持续一周左右</s>(暂时不会,忘记验证码可通过QQ号获取)</small>\\\"\\n});\\n\\nlet userList = getUserDate();\\ndata.push({\\n title: \\\"验证/登录\\\",\\n url: $(\\\"确定保存,验证码填错,无法评论哦\\\").confirm((f, l, login) => {\\n let qq = getVar('Warehouse.m.qq', '');\\n let yzm = getVar('Warehouse.m.yzm', '');\\n if (qq == \\\"\\\" || yzm == \\\"\\\") {\\n return \\\"toast://qq或验证码为空\\\";\\n }\\n let result = request(login, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"qq\\\": qq,\\n \\\"auth_code\\\": yzm\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status === 0) {\\n f.user = [qq, yzm];\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\", JSON.stringify(f));\\n let index = l.findIndex(item => item[0] === qq);\\n if (index > -1) {\\n l.splice(index, 1, [qq, yzm]);\\n } else if (l.length < 6) {\\n l.push([qq, yzm]);\\n } else {\\n l.splice(0, 1);\\n l.push([qq, yzm]);\\n }\\n writeFile(\\\"hiker://files/WarehouseUSERA.json\\\", JSON.stringify(l));\\n back();\\n return \\\"toast://验证成功\\\";\\n }\\n return \\\"toast://\\\" + result.detail;\\n }, user, userList, api.dis_login),\\n col_type: 'text_center_1'\\n});\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\ndata.push({\\n title: \\\"““””<big>账号列表</big>\\\\t\\\\t\\\\t<small>(保留5条记录)</small>\\\",\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://empty\\\"\\n});\\nuserList.reverse();\\n\\nfor (let item of userList) {\\n data.push({\\n title: \\\"账号:\\\" + item[0] + (userName === item[0] ? \\\"\\\\t\\\\t\\\\t““[当前账号]””\\\" : \\\"\\\"),\\n desc: \\\"验证码:\\\" + item[1],\\n url: $(\\\"是否切换为该[\\\" + item[0] + \\\"]账号\\\").confirm((f, item) => {\\n f.user = item;\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\", JSON.stringify(f));\\n back();\\n return \\\"toast://切换成功\\\";\\n }, user, item),\\n col_type: \\\"text_1\\\"\\n });\\n}\\ndata.push({\\n col_type: \\\"line_blank\\\"\\n});\\ndata.push({\\n title: \\\"退出账号\\\",\\n url: $(\\\"确认退出登录状态\\\").confirm((f) => {\\n f.user = [];\\n writeFile(\\\"hiker://files/WarehouseUSER.json\\\", JSON.stringify(f));\\n back();\\n return \\\"toast://退出成功\\\";\\n }, user),\\n col_type: 'text_center_1'\\n});\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"列表排序算法\",\"path\":\"sort\",\"rule\":\"js:\\n/* 规则列表排序 [ UP、NEW、无更新 ] 顺序 */\\n/* 归并排序 Start */\\n/*\\nfunction mergeSort(arr) {\\n var len = arr.length;\\n if (len < 2) {\\n return arr;\\n }\\n var middle = Math.floor(len / 2),\\n left = arr.slice(0, middle),\\n right = arr.slice(middle);\\n return merge(mergeSort(left), mergeSort(right));\\n}\\nfunction merge(left, right) {\\n var result = [];\\n var isThisVersionList = [];\\n\\n while (left.length > 0 && right.length > 0) {\\n if (left[0].title.includes(\\\"🆙\\\")) {\\n result.push(left.shift());\\n } else if (right[0].title.includes(\\\"🆙\\\")) {\\n result.push(right.shift());\\n } else if (left[0].title.includes(\\\"🆕\\\")) {\\n result.push(left.shift());\\n } else if (right[0].title.includes(\\\"🆕\\\")) {\\n result.push(right.shift());\\n } else {\\n isThisVersionList.push(left.shift());\\n isThisVersionList.push(right.shift());\\n }\\n }\\n\\n while (isThisVersionList.length) result.push(isThisVersionList.shift());\\n\\n while (left.length)\\n result.push(left.shift());\\n\\n while (right.length)\\n result.push(right.shift());\\n\\n return result;\\n}\\n$.exports.mergeSort = mergeSort;\\n*/\\n/* 归并排序 End */\\n/* 普通分类排序 Start */\\nfunction normalSort(arr) {\\n var len = arr.length;\\n if (len < 2) {\\n return arr;\\n }\\n let upResult = [];\\n let otherResult = [];\\n while(arr.length) {\\n let item = arr.shift();\\n if(item.title.includes(\\\"🆙\\\")) {\\n upResult.push(item)\\n } else {\\n otherResult.push(item)\\n }\\n }\\n return upResult.concat(otherResult);\\n}\\n$.exports.normalSort = normalSort;\\n/* 普通分类排序 End */\"},{\"col_type\":\"icon_2_round\",\"name\":\"全部公开规则\",\"path\":\"AllPublicRule\",\"rule\":\"js:\\n const {\\n api,\\n localRuleVer,\\n getApi\\n } = $.require(\\\"hiker://page/utiliy\\\");\\nconst {\\n mergeSort\\n} = $.require(\\\"hiker://page/sort\\\");\\nlet dataType = getVar(\\\"Warehouse.type\\\", \\\"\\\");\\nlet order = getVar(\\\"Warehouse.order\\\", \\\"0\\\");\\nlet sort = getVar(\\\"Warehouse.sort\\\", \\\"0\\\");\\nlet good = getVar(\\\"Warehouse.good\\\", \\\"\\\");\\nlet page = MY_URL.split(\\\"#\\\")[1] || 1;\\nlet ruleList = JSON.parse(request(api.all_rule + \\\"?data_type=\\\" + dataType + \\\"&page=\\\" + page + \\\"&limit=20&order=\\\" + order + \\\"&sort=\\\" + sort+ \\\"&is_good=\\\" + good)).result;\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.type\\\");\\n clearVar(\\\"Warehouse.order\\\");\\n clearVar(\\\"Warehouse.sort\\\");\\n clearVar(\\\"Warehouse.good\\\");\\n clearVar(\\\"Warehouse.back\\\");\\n}));\\nlet data = [];\\nif (getVar(\\\"Warehouse.back\\\") === \\\"1\\\") {\\n back();\\n}\\nfunction tab(arr, type, contrast) {\\n for (let item of arr) {\\n data.push({\\n title: item[1] === contrast ? \\\"““\\\" + item[0] + \\\"””\\\" : item[0],\\n url: $(\\\"#noLoading#\\\").lazyRule((key, type) => {\\n putVar(type, key);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, item[1], type),\\n col_type: \\\"scroll_button\\\"\\n });\\n }\\n data.push({\\n col_type: \\\"blank_block\\\"\\n });\\n}\\nif (page === \\\"1\\\") {\\n tab([\\n [\\\"全部\\\", \\\"\\\"],\\n [\\\"小程序\\\", \\\"home_rule_url\\\"],\\n [\\\"提交云仓库规则\\\", \\\"publish\\\"],\\n [\\\"网页插件\\\", \\\"js_url\\\"],\\n [\\\"静态页面\\\", \\\"html\\\"],\\n [\\\"主题\\\", \\\"config\\\"]\\n ], \\\"Warehouse.type\\\", dataType);\\n tab([\\n [\\\"时间\\\", \\\"0\\\"],\\n [\\\"ID\\\", \\\"1\\\"],\\n [\\\"好评度\\\", \\\"2\\\"],\\n [\\\"差评度\\\", \\\"3\\\"],\\n [\\\"回复数\\\", \\\"4\\\"]\\n ], \\\"Warehouse.order\\\", order);\\n tab([\\n [\\\"倒序\\\", \\\"0\\\"],\\n [\\\"正序\\\", \\\"1\\\"]\\n ], \\\"Warehouse.sort\\\", sort);\\n tab([\\n [\\\"不论\\\", \\\"\\\"],\\n [\\\"优质\\\", \\\"1\\\"]\\n ], \\\"Warehouse.good\\\", good);\\n data.push({\\n title: \\\"搜索\\\",\\n url: $.toString(name => \\\"hiker://search?s=\\\" + input + \\\"&rule=\\\" + name, MY_RULE.title),\\n col_type: \\\"input\\\",\\n desc: \\\"搜索全部规则\\\"\\n });\\n}\\n\\nlet homeList = JSON.parse(request(api.home));\\nlet mRuleList = [];\\nfor (var item of ruleList) {\\n var name = item.name;\\n if (item.is_tap) {\\n let location = JSON.parse(request(getApi(\\\"ruleListJson\\\") + \\\"?id=\\\" + item.id));\\n item.id = location.id;\\n item.name = location.name;\\n item.author = location.author;\\n item.data_type = location.data_type;\\n item.ver = location.ver\\n }\\n item.version = item.ver;\\n let label = \\\"\\\",\\n lver = -2;\\n if (item.is_json && item.data_type === \\\"home_rule_url\\\") {\\n lver = localRuleVer(homeList, item);\\n if (lver === -1) {\\n label = \\\"🆕\\\";\\n } else if (lver < item.ver) {\\n label = \\\"🆙\\\";\\n }\\n }\\n mRuleList.push({\\n title: label + name,\\n url: \\\"hiker://page/ruleDetail#noHistory##noRecordHistory#\\\",\\n extra: {\\n lver: lver,\\n id: item.id,\\n isAll:true\\n },\\n pic_url: item.pic,\\n })\\n}\\n/* 归并排序 Start */\\n//mRuleList = mergeSort(mRuleList);\\n/* 归并排序 End */\\ndata.push.apply(data, mRuleList)\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"回复\",\"path\":\"Reply\",\"rule\":\"js:\\nlet data = [];\\nconst {\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n replyId,\\n ruleId,\\n name,\\n password,\\n username\\n} = MY_PARAMS;\\n\\n\\nsetPageTitle(\\\"回复(\\\" + name + \\\")\\\");\\naddListener('onClose', $.toString(() => {\\n clearVar(\\\"Warehouse.comment.text\\\");\\n refreshPage(false);\\n}));\\n\\ndata.push({\\n desc: \\\"回复......\\\",\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getVar('Warehouse.comment.text', ''),\\n type: \\\"textarea\\\",\\n height:7,\\n onChange: 'putVar(\\\"Warehouse.comment.text\\\",input)'\\n }\\n});\\n\\n\\ndata.push({\\n title: \\\"提交\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(api.dis_reply + ruleId).lazyRule((password, username, ruleId) => {\\n let text = getVar('Warehouse.comment.text', '');\\n if (password == \\\"\\\" || username == \\\"\\\") {\\n return \\\"toast://未登录账号\\\";\\n }\\n if (text == \\\"\\\") {\\n return \\\"toast://你还什么都没写啊\\\";\\n }\\n let result = request(input, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"discuss_text\\\": text,\\n \\\"qq\\\": username,\\n \\\"password\\\": password,\\n \\\"discuss_id\\\": ruleId\\n }\\n }),\\n method: 'POST'\\n });\\n result = JSON.parse(result).result;\\n if (result.status === 0) {\\n back(false);\\n }\\n return \\\"toast://\\\" + result.detail;\\n\\n }, password, username, replyId)\\n});\\n\\nsetResult(data);\"},{\"col_type\":\"movie_3\",\"name\":\"我的回复\",\"path\":\"MyReply\",\"rule\":\"js:\\nconst {\\n api\\n} = $.require(\\\"hiker://page/utiliy\\\");\\nlet {\\n auth_code,\\n qq\\n} = MY_PARAMS;\\nlet page = parseInt(MY_URL.split(\\\"#\\\")[1]);\\nlet data=[];\\nlet commentList = JSON.parse(request(api.dis_get_reply + \\\"?limit=5&page=\\\" + page + \\\"&qq=\\\" + qq + \\\"&auth_code=\\\" + auth_code)).result;\\nif (commentList.length === 0) {\\n data.push({\\n title: \\\"<h5 style='text-align:center'>别拉了一条也不剩了</h5>\\\",\\n col_type: \\\"rich_text\\\"\\n });\\n} else {\\n for (let item of commentList) {\\n data.push({\\n title: item.name + \\\"&nbsp;&nbsp;<font color='gray'><small>#\\\" + item.id + \\\"</small><font>\\\",\\n col_type: \\\"avatar\\\",\\n url: \\\"hiker://page/ruleDetail#noHistory##noRecordHistory#\\\",\\n extra: {\\n lver: \\\"回复进入不支持查看\\\",\\n id: item.rule_id[0]\\n },\\n pic_url: item.avatar_url\\n });\\n data.push({\\n title: item.discuss_text,\\n desc: item.create_date + \\\"·\\\"+item.rule_id[1]+\\\"·\\\"+\\\"开发者🗣\\\",\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/info\\\",\\n extra:{\\n name:item.name,\\n type:\\\"long_text\\\",\\n text:item.discuss_text\\n },\\n pic_url: item.avatar_url\\n });\\n }\\n \\n}\\nsetResult(data);\\n\"},{\"col_type\":\"movie_3\",\"name\":\"更多分享\",\"path\":\"moreShare\",\"rule\":\"js:\\n addListener('onClose', $.toString(()=>{\\n clearVar(\\\"house.upload_code\\\");\\n }));\\nconst {color,small,api, getFile} = $.require(\\\"hiker://page/utiliy\\\");\\nlet houseFile = getFile||false;\\nlet put_url = api.host+'/hikerule/dev/put';\\nif(!houseFile){\\n setItem('is_house_vip', 'false');\\n}\\nlet house_data = houseFile();\\n// log(house_data.username+'-'+house_data.password);\\nvar canup = house_data.username.length >= 6 && house_data.password.length > 2;\\nlog('可以上传?'+canup);\\nlet d = [];\\nlet file_type = [{name:'静态文件',value:'html'},{name:'网页插件',value:'js_url'},{name:'主页配置',value:'config'}]; //上传类型\\nlet file_redirect = [{name:'本地',value:'false'},{name:'直链302',value:'true'}]; //是否重定向\\nlet file_ua = [{name:'电脑',value:'pc'},{name:'手机',value:'mobile'}];\\nlet file_type_title = file_type.map((item) => {\\n let name = getItem('house.file_type','静态文件');\\n if(item.name===name){\\n return '👉'+item.name;\\n }else{\\n return item.name;\\n }\\n});\\nlet file_redirect_title = file_redirect.map((item) => {\\n let name = getItem('house.file_redirect','本地');\\n if(item.name===name){\\n return '👉'+item.name;\\n }else{\\n return item.name;\\n }\\n});\\nlet file_ua_title = file_ua.map((item) => {\\n let name = getItem('house.file_ua','电脑');\\n if(item.name===name){\\n return '👉'+item.name;\\n }else{\\n return item.name;\\n }\\n});\\nd.push({col_type: 'x5_webview_single', extra: {js: 'console.log(\\\"我加载了\\\")'}});\\nd.push({\\n title: '获取',\\n desc: \\\"文件路径,支持hiker,file,http,主题\\\",\\n extra: {\\n onChange: \\\"putVar('house.web_url',input)\\\",\\n titleVisible: true,\\n id:'filePath',\\n defaultValue:getVar('house.web_url')\\n },\\n url:$.toString(() => {\\n let input = getVar('house.web_url','');\\n if(input.length<2){\\n return 'toast://链接不可以为空'\\n } else if(/^hiker:|^file:|^http:|^https:|^\\\\/storage\\\\/|^\\\\/sdcard\\\\//.test(input)){\\n if(/^\\\\/storage\\\\/|^\\\\/sdcard\\\\//.test(input)){\\n input = 'file://'+input;\\n }\\n log('正常链接:'+input);\\n let ua = getItem('house.file_ua')==='电脑'?'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36':'Mozilla/5.0 (Linux; Android 9; MI 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Mobile Safari/537.36';\\n let web_url_arr = input.split(';');\\n let web_url = web_url_arr[0];\\n let headers = {\\n 'Referer':'https://blog.csdn.net',\\n 'User-Agent':ua,\\n 'Accept':'application/json, text/javascript, */*; q=0.01',\\n 'Accept-Language':'zh-CN',\\n };\\n if(web_url_arr.length>=3&&web_url_arr[2].length>2){ //设置编码\\n headers['content-type'] = 'charset='+web_url_arr[2].toUpperCase();\\n }\\n let params = {headers:headers,withHeaders:false,redirect:false};\\n if(web_url_arr.length>=2&&web_url_arr[1].length>2){ // 设置请求方法\\n params['method'] = web_url_arr[1].toUpperCase();\\n }\\n log('开始获取源码');\\n try {\\n /*\\n requestAsync(web_url,params,function (key,code) {\\n let back_code = code;\\n if(back_code.length>20){\\n putVar('house.upload_code',back_code);\\n refreshPage(true);\\n return 'toast://源码已获取,并部分插入到文本区域'\\n }else{\\n return 'toast://错误,本次获取到空文本,疑似你没有此文件!';\\n }\\n });\\n */\\n let back_code = getItem('house.file_ua')==='电脑'?fetch(web_url,params):request(web_url,params);\\n if(back_code.length>20){\\n putVar('house.upload_code',back_code);\\n refreshPage(true);\\n return 'toast://源码已获取,并部分插入到文本区域'\\n }else{\\n return 'toast://错误,本次获取到空文本,疑似你没有此文件!';\\n }\\n }catch (e) {\\n log(e.message);\\n return 'toast://发生了错误:\\\\n'+e.message;\\n }\\n }else if(/主题¥|元素¥/.test(input)){\\n log('主题链接');\\n let web_url_arr = input.split('¥');\\n let web_url = web_url_arr[web_url_arr.length-1];\\n let back_code = parsePaste(web_url);\\n if(back_code.length>20) {\\n putVar('house.upload_code',back_code);\\n refreshPage(true);\\n return 'toast://源码已获取,并部分插入到文本区域'\\n }else{\\n return 'toast://错误,本次获取返回为:\\\\n'+back_code;\\n }\\n }else{\\n return 'toast://非法链接:\\\\n'+getVar('house.web_url');\\n }\\n }),\\n col_type: \\\"input\\\"\\n});\\nd.push({\\n title: \\\"选择文件路径\\\",\\n url:$('#noLoading#').lazyRule(()=>{\\n /*\\n let fp = 'https://gitcode.net/qq_32394351/dr/-/raw/master/js/fileSelect.js';\\n let f = require(fp);\\n */\\n let fp=config.lib.fileSelect;\\n let f=$.rc(fp);\\n return f.fileSelectionUri({\\n callback: $.toString(() => {\\n let target = findItem(\\\"filePath\\\").extra;\\n updateItem(\\\"filePath\\\", {\\n extra: Object.assign(target, {\\n defaultValue: PATH\\n })\\n });\\n putVar('house.web_url',PATH);\\n return true;\\n }),\\n onClickType:'confirm',\\n fileType: \\\".js|.txt|.hiker|.json|.html\\\",\\n pattern: 0,\\n requireUrl:fp,\\n initialPath:getPath('hiker://files/rules/dzHouse/').slice(7),\\n memory:'true',\\n });\\n }),\\n col_type: \\\"text_center_1\\\",\\n});\\nd.push({\\n title:'上传类型',\\n desc:'上传文件的类型,当前为:'+color(getItem('house.file_type','静态文件'),'#ff7000'),\\n col_type:'text_1',\\n url:$(file_type_title,2).select(() => {\\n setItem('house.file_type',input.replace('👉',''));\\n refreshPage(true);\\n return 'toast://你选择了:'+input;\\n })\\n});\\n\\nd.push({\\n title:'文件定位',\\n desc:'文件是否属于重定向,当前为:'+color(getItem('house.file_redirect','本地'),'#ff7000'),\\n col_type:'text_1',\\n url:$(file_redirect_title,2).select(() => {\\n setItem('house.file_redirect',input.replace('👉',''));\\n refreshPage(true);\\n return 'toast://你选择了:'+input;\\n })\\n});\\n\\nd.push({\\n title:'设备UA',\\n desc:'发起网页请求头标识,当前为:'+color(getItem('house.file_ua','电脑'),'#ff7000'),\\n col_type:'text_1',\\n url:$(file_ua_title,2).select(() => {\\n setItem('house.file_ua',input.replace('👉',''));\\n refreshPage(true);\\n return 'toast://你选择了:'+input;\\n })\\n});\\nfunction compare(name) {\\n return function(item) {\\n return item.name === name;\\n }\\n}\\nd.push({\\n title:'🗄️环境',\\n col_type:'flex_button',\\n url:$().lazyRule((file_type,compare)=>{\\n log('查看环境变量');\\n try {\\n let up_code = getVar('house.upload_code','');\\n let ftype = file_type.filter(compare(getItem('house.file_type','静态文件')))[0].value;\\n let redirect = getItem('house.file_redirect','本地')!=='本地';\\n let code = !redirect?up_code:input;\\n let env = {\\n web_url:getVar('house.web_url',''),\\n device:getItem('house.file_ua','电脑'),\\n ftype:ftype||\\\"\\\",\\n redirect:redirect,\\n code:code.substring(0,40)||\\\"\\\",\\n }\\n log(env);\\n return 'toast://'+JSON.stringify(env);\\n // alert(JSON.stringify(env));\\n }catch (e) {\\n return 'toast://'+e.message;\\n // alert(e.message);\\n }\\n },file_type,compare)\\n});\\n\\nd.push({\\n title:'📃教程',\\n col_type:'flex_button',\\n url:$().x5Rule(()=>{\\n let msg = '欢迎使用开发者更多分享工具\\\\n1.输入网址为本地文件路径,hiker://或者file://开头\\\\n2.点击网址输入栏后面的按钮\\\\n3.看文本预览区是否正确\\\\n4.点击上传按钮提交到仓库';\\n alert(msg);\\n })\\n});\\n\\nd.push({\\n title:'🗑️清空',\\n col_type:'flex_button',\\n url:$().lazyRule(()=>{\\n clearVar('house.upload_code');\\n refreshPage(true);\\n return 'toast://已清除预览区域内容'\\n })\\n});\\n\\nd.push({\\n title:'📲示例',\\n col_type:'flex_button',\\n url:$().lazyRule(()=>{\\n let demo_code = getItem('house.demo','0');\\n if(demo_code=='0'){\\n putVar('house.web_url','hiker://files/rules/dzHouse/html/资源网书签.html');\\n demo_code = parseInt(demo_code)+1;\\n setItem('house.demo',demo_code+'');\\n }else{\\n putVar('house.web_url','file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/rules/dzHouse/html/资源网书签.html');\\n setItem('house.demo','0');\\n }\\n refreshPage(true);\\n return 'toast://已设置示例地址'\\n })\\n});\\n\\nd.push({\\n title:'📤上传',\\n col_type:'flex_button',\\n url:$().lazyRule((canup,house_data,put_url,file_type) =>{\\n function compare(name) {\\n return function(item) {\\n return item.name === name;\\n }\\n }\\n const {getNowFormatDate}=$.require(\\\"hiker://page/utiliy\\\");\\n let up_code = getVar('house.upload_code','');\\n if(up_code.length < 2){\\n return 'toast://源码区无内容,请先访问一个静态页面'\\n }\\n if(!canup){\\n return 'toast://你不是开发者,没有提交到仓库的权利!'\\n }\\n let input = getVar('house.web_url','');\\n let web_url = input.split(';')[0];\\n let fileName = '';\\n if(/^hiker:|^file:|^http:|^https:|^\\\\/storage\\\\/|^\\\\/sdcard\\\\//.test(web_url)){\\n fileName = web_url.split('/')[web_url.split('/').length-1];\\n }else if(/主题¥|元素¥/.test(input)){\\n let bkarr = up_code.split('¥');\\n if(bkarr.length<3){\\n return 'toast://云剪贴板内容有误'\\n }\\n switch (bkarr[1]) {\\n case 'my_home_theme':\\n fileName = up_code.split('「')[1].split('」')[0];\\n break;\\n case 'my_home_single':\\n fileName = up_code.split('「')[1].split('」')[0];\\n break;\\n case 'js_url':\\n fileName = up_code.split('¥')[2].split('@')[0];\\n break;\\n }\\n }else{\\n return 'toast://错误,网页链接无内容!';\\n }\\n let ua = getItem('house.file_ua')==='电脑'?'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36':'Mozilla/5.0 (Linux; Android 9; MI 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Mobile Safari/537.36';\\n let headers = {\\n 'Referer':'https://blog.csdn.net',\\n \\\"content-type\\\": \\\"application/json\\\",\\n 'User-Agent':ua,\\n 'Accept':'application/json, text/javascript, */*; q=0.01',\\n 'Accept-Language':'zh-CN',\\n };\\n let toCompare = '';\\n if(fileName.endsWith('.html')){\\n toCompare = '静态文件';\\n }else if(/主题/.test(fileName)){\\n toCompare = '主页配置'\\n }\\n let ftype = file_type.filter(compare(toCompare||getItem('house.file_type','静态文件')))[0].value;\\n let redirect = getItem('house.file_redirect','本地')!=='本地';\\n if(redirect&&!web_url.startsWith('http')){\\n return 'toast://直链302重定向网址链接必须http开头';\\n }\\n let code = !redirect?up_code:web_url;\\n let data = {\\\"params\\\":\\n {\\\"data\\\": {rule_name: fileName, \\\"rule_type\\\": '更多分享', \\\"version\\\":getNowFormatDate(),\\\"rule_value\\\": code,\\n data_type:ftype, is_redirect:redirect,deviceUa:getItem('house.file_ua'),\\n },\\n \\\"name\\\": house_data.username,\\n \\\"password\\\": house_data.password}\\n };\\n let upparams = {headers:headers,body:JSON.stringify(data),withHeaders:false,redirect:false,method:'POST'};\\n let backmsg = getItem('house.file_ua')==='电脑'?fetch(put_url,upparams):request(put_url,upparams);\\n try{\\n let result = JSON.parse(backmsg).result;\\n let detail = result.detail;\\n return 'toast://'+detail;\\n }catch (e) {\\n log(e.message);\\n return 'toast://发生了错误\\\\n'+e.message;\\n }\\n },canup,house_data,put_url,file_type)\\n});\\n\\nd.push({\\n title:'长文本预览区域',\\n col_type:'text_1',\\n url:'hiker://empty',\\n extra: {textSize: 11,lineVisible:false}\\n});\\n\\nd.push({\\n title:getVar('house.upload_code','').substring(0,10240),\\n col_type:'long_text',\\n extra: {textSize: 11}\\n});\\nsetPageTitle(\\\"更多分享\\\");\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"轻合集生成接口\",\"path\":\"genApi\",\"rule\":\"js:\\nfunction genRule(name,url,icon){\\n icon=icon||'https://z3.ax1x.com/2021/11/16/IWJhxf.png';\\n const {getNowFormatDate,api,getApi}=$.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n String.prototype.replaceAll = function(old,new_str){\\n return this.split(old).join(new_str);\\n };\\n let muban = getApi('importUrl')+\\\"1690\\\";\\n let muban_word={name:\\\"@轻合集\\\",url:\\\"@地址\\\",ver:\\\"@版本\\\",icon:\\\"@图标\\\"};\\n let muban_code = fetch(muban);\\n muban_code=muban_code.replaceAll(muban_word.name,name).replaceAll(muban_word.ver,getNowFormatDate()).replaceAll(muban_word.url,url).replaceAll(muban_word.icon,icon);\\n let import_code=\\\"海阔视界规则分享,当前分享的是:小程序,无根树,花正清,不断荤腥不戒淫¥home_rule_v2¥base64://@\\\"+name+\\\"@\\\"+base64Encode(muban_code);\\n var pastes = getPastes();\\n var url = sharePaste(import_code,pastes.slice(-1)[0]);\\n let import_rule= url+\\\"\\\\n\\\\n小程序:\\\"+name;\\n return import_rule;\\n}\\n$.exports.genRule=genRule;\"},{\"col_type\":\"movie_3\",\"name\":\"全局解析免嗅\",\"path\":\"globalParse\",\"rule\":\"js:\\n function getHeaders(playUrl){\\n let headers = {};\\n let refer=playUrl.split(\\\"//\\\")[0]+\\\"//\\\"+playUrl.split(\\\"//\\\")[1].split(\\\"/\\\")[0];\\n if(/lecloud\\\\.com|bilivideo\\\\.com/.test(playUrl)){\\n headers = {\\\"Referer\\\": 'https://www.bilibili.com/',\\\"User-Agent\\\":\\\"Mozilla/5.0\\\"}\\n }else if(/mgtv\\\\.com/.test(playUrl)){\\n headers = {\\\"Referer\\\": refer,\\\"User-Agent\\\":\\\"Mozilla/5.0\\\"}\\n }else if(/ixigua\\\\.com/.test(playUrl)){\\n headers = {\\\"Referer\\\": 'https://www.ixigua.com/',\\\"User-Agent\\\":\\\"Mozilla/5.0\\\"}\\n }else{\\n // headers = {\\\"Referer\\\": refer,'User-Agent':'Dart/2.13 (dart:io)'}\\n // headers = {\\\"Referer\\\": refer,'User-Agent':MOBILE_UA};\\n headers = {'User-Agent':MOBILE_UA};\\n }\\n return headers\\n }\\nfunction isPic(str){\\n return /\\\\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(str);\\n}\\nfunction isVideo(playUrl,rechange){\\n //注意.php不可以被排除否则融兴解析不了 |.php$\\n //如果是播放地址就直接返回地址加上UA,不是的话就返回false\\n // let t1 = new Date().getTime();\\n let cacheRegx = new RegExp('file:///storage/emulated/(.*?)\\\\\\\\.m3u8|hiker://files/(.*?)\\\\\\\\.m3u8');\\n if(cacheRegx.test(playUrl)){\\n return playUrl\\n }\\n function getHost(url){\\n // fba的parseLazy太慢了千万别用\\n try {\\n return url.match(/^http(s)?:\\\\/\\\\/(.*?)\\\\//)[0].slice(0,-1);\\n }catch (e) {\\n return false\\n }\\n /*\\n if(typeof(log)==='undefined'){\\n return fba.parseLazyRule($$$().lazyRule((url)=>{\\n return getHome(url)\\n },url))\\n }else {\\n return getHome(url)\\n }\\n */\\n }\\n let pUrl=playUrl.split(\\\";\\\")[0];//获取抠掉海阔ua等参数的网页播放链接\\n let host = getHost(pUrl); // 获取域名\\n if(!host){//判断无域名直接不是视频\\n return false\\n }\\n function print(data){\\n if(typeof(log)==='undefined'){\\n return fba.log(data)\\n }else {\\n return log(data)\\n }\\n }\\n rechange=typeof(rechange)===\\\"function\\\"?rechange:function(playUrl){return playUrl};\\n let exceptWords = '.js$|.css$|.ts$|.html$|.htm$|.gif$|.jpg$|.jpeg$|.png$|.ico$|.svg$|.txt$'.split('|').map(it=>'\\\\\\\\'+it).join('|');\\n var exceptKeys = new RegExp(exceptWords);\\n let exceptWords1 = 'referer=|url='.split('|').map(it=>it).join('|');\\n var exceptKeys1 = new RegExp(exceptWords1);\\n let replaceWords = 'playm3u8|m3u8\\\\.tv'.split('|').map(it=>it).join('|');\\n let replaceKeys = new RegExp(replaceWords,'g');\\n let videoWords = \\\"/video/tos|.mp4$|.m3u8$|.flv$|.avi$|.3gp$|.mpeg$|.wmv$|.mov$|rmvb|.dat$|.mp3$|.m4a$|qqBFdownload|mime=video%2F|mime_type=video_|type=m3u8|pt=m3u8\\\".split('|').map((it)=>{\\n //type=mp4\\n if(it.startsWith(\\\".\\\")){\\n return '\\\\\\\\'+it\\n }else{\\n return it\\n }\\n }).join(\\\"|\\\");\\n let videoKeys = new RegExp(videoWords);\\n let rUrl = pUrl.replace(host,'');//获取除开域名的剩余链接\\n let pUrl2=pUrl.split(\\\"&\\\")[0].split(\\\"?\\\")[0];//获取不带参数的网页链接\\n let rurl2 = pUrl2.replace(host,'');//获取除开域名的剩余不带参数链接\\n let hasKey = videoKeys.test(rUrl)||videoKeys.test(rurl2);\\n let parUrl = pUrl.replace(pUrl.split(\\\"?\\\")[0],''); // 分割问号后剩余参数的完整链接\\n let excKey = exceptKeys1.test(parUrl);\\n if(rUrl.split('?').length>2){\\n let rUrl3=rUrl.split(\\\"?\\\")[1];//获取?分割后的第一段\\n hasKey = hasKey||videoKeys.test(rUrl3);\\n }\\n if(hasKey&&!excKey){\\n let tips = '检测到疑似多媒体的地址:';\\n print(\\\"js中\\\"+tips+pUrl);\\n print(\\\"分割问号后:\\\"+parUrl);\\n }\\n // log('1:'+(videoKeys.test(pUrl)||videoKeys.test(pUrl2)||videoKeys.test(pUrl.replace(replaceKeys,\\\"\\\").split(\\\"&\\\")[0].split(\\\"?\\\")[0])));\\n // log('2:'+!exceptKeys.test(pUrl.split(\\\"?\\\")[0].split('&')[0]));\\n // log('3:'+!exceptKeys1.test(pUrl.replace(pUrl.split(\\\"?\\\")[0],'')));\\n if ((hasKey||videoKeys.test(rUrl.replace(replaceKeys,\\\"\\\").split(\\\"&\\\")[0].split(\\\"?\\\")[0]) )&& !exceptKeys.test(pUrl2)&&!exceptKeys1.test(pUrl2)) {\\n if(!(/User-Agent|Referer@/.test(playUrl))){\\n if(/lecloud\\\\.com|bilivideo/.test(playUrl)){\\n playUrl+=\\\";{Referer@https://www.bilibili.com/&&User-Agent@Mozilla/5.0}\\\";\\n }else if(/ixigua\\\\.com/.test(playUrl)){\\n playUrl+=\\\"#isvideo=true#;{Referer@https://www.ixigua.com/&&User-Agent@Mozilla/5.0}\\\";\\n }\\n else if(/mgtv\\\\.com|byteamone/.test(playUrl)){\\n playUrl+=\\\";{User-Agent@Mozilla/5.0}\\\";\\n }else if(/ptwo\\\\.wkfile\\\\.com/.test(playUrl)&&/url=/.test(playUrl)){\\n playUrl=playUrl.split(\\\"url=\\\")[1]+\\\";{Referer@https://fantuan.tv}\\\"\\n }\\n // 处理大师兄之类的app\\n // else{\\n // playUrl+=\\\";{User-Agent@Mozilla/5.0}\\\";\\n // }\\n }\\n playUrl=rechange(playUrl);\\n if(!/#isVideo=true#/.test(playUrl)){\\n playUrl+=\\\"#isVideo=true#\\\";\\n }\\n // let t2 = new Date().getTime();\\n // print('判断isVideo耗时:'+(t2-t1));\\n return playUrl;\\n }else{\\n // let t2 = new Date().getTime();\\n // print('判断isVideo耗时:'+(t2-t1));\\n return false;\\n }\\n}\\nfunction comParse(parStr,ej,onlyback,html){\\n //列表,标题,图片,描述,链接,内容\\n ej = ej||false;//有二级\\n onlyback=onlyback||false;//只返回数据\\n html = html||getResCode();\\n html = typeof(html)==='string'?html:html.html;\\n return $.toString((parStr,ej,onlyback,html,isPic)=>{\\n let t=parStr.split(\\\";\\\");\\n let d=[];\\n // let list=pdfa(getResCode(),t[0]);\\n let list=pdfa(html,t[0]);\\n let lazy = $('').lazyRule(()=>{\\n const {lazyParse} = $.require('hiker://page/globalParse?rule=道长仓库Pro');\\n return lazyParse(input)\\n });\\n for(let i in list){\\n let _pic = t[2]?pd(list[i],t[2]):'';\\n if(isPic(_pic)&&!/@Referer=/.test(_pic)){\\n _pic+='@Referer='\\n }\\n let it={\\n title:pdfh(list[i],t[1]),\\n pic_url:_pic,\\n desc:pdfh(list[i],t[3]),\\n url:ej?pd(list[i],t[4]):pd(list[i],t[4])+lazy\\n };\\n if(t.length>5){//内容,用于搜索\\n it.content=pdfh(list[i],t[5])\\n }\\n d.push(it);\\n }\\n if(onlyback){\\n return d\\n }else{\\n setResult(d)\\n }\\n },parStr,ej,onlyback,html,isPic)\\n}\\n\\nfunction isBadVideo(videoUrl) {//是坏的视频\\n let dmPath = 'hiker://files/cache/diaomao.txt';//吊毛模式过滤文件路径\\n let dmUrls;\\n try {\\n dmUrls = request(dmPath).trim().split('\\\\n').filter(it => it && !it.startsWith('//'));\\n } catch (e) {\\n dmUrls = [];\\n }\\n\\n function hasDm(videoUrl, dmUrls) {//播放地址是否为吊毛视频\\n if (dmUrls.length < 1) {\\n return false\\n }\\n function print(str){\\n if(typeof(log)!=='undefined'){\\n log(str);\\n }else{\\n fba.log(str);\\n }\\n }\\n for (let dmUrl of dmUrls) {\\n if ((new RegExp(dmUrl)).test(videoUrl)) {//播放地址包含吊毛标志的地址\\n print('吊毛视频,自动过滤:'+videoUrl);\\n return true\\n }\\n }\\n print('非吊毛视频,可播放:'+videoUrl);\\n return false\\n }\\n\\n function isDm(ret) {\\n if (!ret) {\\n return true\\n }\\n return hasDm(ret.split('#')[0].split(';')[0], dmUrls)\\n }\\n return isDm(videoUrl)\\n}\\n\\nfunction lazyParse(playUrl,ms,tm,rechange){\\n // log('调用仓库免嗅探传参超时为:'+ms);\\n tm = parseInt(tm)||5000;\\n const {isVideo,getHeaders,isBadVideo} = $.require('hiker://page/globalParse?rule=道长仓库Pro');\\n let realUrl = isVideo(playUrl,rechange);\\n //log(realUrl);\\n if(typeof(realUrl)=='string'){//bool值就是失败\\n try{\\n let rurl=realUrl.split(\\\";\\\")[0].split(\\\"#\\\")[0];\\n return JSON.parse(request(rurl,{timeout:tm})).url\\n }catch(e){\\n return realUrl\\n }\\n //return realUrl\\n }\\n\\n //log(\\\"访问超时:\\\"+tm);\\n log(\\\"尝试道长仓库x5免嗅:\\\"+playUrl);\\n clearVar(\\\"_x5jxUrl\\\");\\n let bad=$(\\\"网络不佳或者疑似对方网站挂了,你要查看其网页吗?\\\").confirm((playUrl)=>{\\n log(\\\"网站看起来挂了:\\\"+playUrl);\\n return playUrl\\n },playUrl);\\n try{\\n var back=request(playUrl,{headers: getHeaders(playUrl),timeout:tm});\\n //var back=fetch(playUrl,{headers: {'User-Agent': PC_UA}});\\n if(!back){\\n log(\\\"网站\\\"+playUrl+\\\"确实啥也没返回\\\");\\n return bad\\n }else if(/#EXTINF/.test(back)){\\n //let lcache=\\\"/storage/emulated/0/Android/data/com.example.hikerview/files/Documents/cache/video.m3u8\\\";\\n //writeFile(lcache,back);\\n //return lcache+\\\"##\\\"+playUrl+\\\"#isVideo=true#\\\"\\n playUrl=cacheM3u8(playUrl);\\n return playUrl\\n }else if((!/触发了防盗链|未授权|接口防盗/.test(back))&&(!/http|url/.test(back))&&(!/msg|code|html/.test(back))){\\n log(back);\\n return 'toast://疑似对方数据加密了,具体数据看日志'\\n }\\n }catch(e){\\n log(e.message);\\n return bad\\n }\\n try {\\n back=JSON.parse(back);\\n let realUrl=back.url;\\n if(typeof(realUrl)==\\\"undefined\\\"||!realUrl){\\n log(back);\\n return \\\"toast://道长仓库解析失败!返回播放地址为空\\\"\\n } else if(typeof(isVideo(realUrl,rechange))=='string'){\\n return isVideo(realUrl,rechange);\\n }else{\\n return realUrl+\\\"#isVideo=true#\\\";\\n }\\n //else{\\n //realUrl+=\\\";{User-Agent@Mozilla/5.0}\\\";\\n // }\\n }catch (e) {\\n log(\\\"检测到解析口非json错误:\\\"+e.message+',开始x5免嗅探');\\n // require('https://hjdhnx.coding.net/p/hiker/d/dr/git/raw/master/js/lsg.js');//引用本地储存插件\\n const lsg=$.require(\\\"hiker://page/localStorage?rule=道长仓库Pro\\\");//引用子页面本地储存插件\\n let local_ms = lsg.getItem('timeout');\\n let ms = parseInt(ms)||parseInt(local_ms)||5000;\\n let max_count=Math.ceil(ms/250);\\n log(\\\"本次嗅探超时:\\\"+ms+\\\"共计待抓包:\\\"+max_count+\\\"次\\\");\\n showLoading('嗅探中,若失败就切换web嗅探...');\\n let _x5 = $.toString((isVideo,rechange,playUrl,max_count,PC_UA,isBadVideo)=>{\\n try {\\n if(typeof(fba)=='undefined'||!fba){\\n var fba = fy_bridge_app;\\n }\\n try {\\n if(typeof(request)=='undefined'||!request){\\n eval(fba.getInternalJs());\\n }\\n }catch (e) {\\n fba.log(e.message);\\n }\\n fba.putVar(\\\"_x5jxUrl\\\",playUrl);\\n if(window.count == null){\\n window.count=1;\\n }\\n let text='';\\n try {\\n text=document.querySelector(\\\"body\\\").innerText;\\n }catch (e) {fba.log(e.message)}\\n if(/触发了防盗链|未授权|接口防盗/.test(text)&&window.count===1){\\n fba.log(\\\"检测到有授权,开始过授权\\\");\\n //location.reload();\\n location.href=fba.getVar(\\\"_x5jxUrl\\\");\\n }\\n window.count++;\\n // fba.log('count:'+window.count+',max_count:'+max_count);\\n if( window.count >= max_count){\\n fba.log(\\\"超过\\\"+max_count*250+\\\"毫秒未获取到资源地址,跳到源网页,以下是加载过的地址\\\");\\n try {\\n let text=document.querySelector(\\\"body\\\").innerText;\\n // fba.log(text);\\n }catch (e) {fba.log(e.message)}\\n fba.log(JSON.stringify(_getUrls()));\\n return fba.getVar(\\\"_x5jxUrl\\\");\\n }\\n function muteMe(elem) {\\n try {\\n elem.pause();\\n }\\n catch (e) {\\n }\\n }\\n var videos = document.querySelectorAll(\\\"video\\\"), audios = document.querySelectorAll(\\\"audio\\\"), v2 = document.querySelectorAll(\\\"embed\\\"), v3 = document.querySelectorAll(\\\"#player\\\");\\n try {\\n [].forEach.call(videos, function (video) {\\n muteMe(video);\\n });\\n } catch (e) {}\\n try {\\n [].forEach.call(audios, function (audio) {\\n muteMe(audio);\\n });\\n } catch (e) {}\\n try {\\n [].forEach.call(v2, function (v) {\\n muteMe(v);\\n });\\n } catch (e) {}\\n try {\\n [].forEach.call(v3, function (v) {\\n muteMe(v);\\n });\\n } catch (e) {}\\n var urls = _getUrls();\\n // fba.log(JSON.stringify(urls));\\n try {\\n for(let i in urls) {\\n let u=urls[i];\\n try{u=decodeURIComponent(u);}catch(e){\\n u=unescape(u);\\n }\\n //\\n if(/url=http/.test(u)){\\n u = u.split(\\\"url=\\\").slice(-1)[0];\\n // fba.log(\\\"url分割:\\\"+u);\\n }else if(/url=\\\\//.test(u)&&/\\\\.m3u8/.test(u)){\\n let host = u.match(/(.*)\\\\/\\\\/(.*?)\\\\//)[0];\\n u = host+u.split(\\\"url=\\\").slice(-1)[0];\\n // fba.log(\\\"url分割:\\\"+u);\\n }\\n else if(/vid=http/.test(u)){\\n u = u.split(\\\"vid=\\\").slice(-1)[0];\\n fba.log(\\\"vid分割:\\\"+u);\\n }else if(/vid=\\\\//.test(u)&&/\\\\.m3u8/.test(u)){\\n let host = u.match(/(.*)\\\\/\\\\/(.*?)\\\\//)[0];\\n u = host+u.split(\\\"vid=\\\").slice(-1)[0];\\n fba.log(\\\"vid分割:\\\"+u);\\n }\\n else if(/\\\\?(.*)=http/.test(u)&&/\\\\.m3u8/.test(u)){\\n u = \\\"http\\\"+u.split(/\\\\?(.*)=http/).slice(-1)[0];\\n fba.log(\\\"其他分割:\\\"+u);\\n }\\n //|index\\\\.m3u8$\\n else if(/\\\\/1\\\\.m3u8/.test(u)){\\n continue;\\n }\\n u=u.replace(/&from=.*|&next=.*|&jump=.*/,'');\\n let realUrl = isVideo(u,rechange);\\n if(typeof(realUrl)=='string'&&!isBadVideo(u)){//过滤吊毛视频\\n //fy_bridge_app.setWebUa(PC_UA);\\n if(typeof(fba.getHeaderUrl)!=='undefined'&&typeof(rechange)!=='function'){\\n // let backUrl = fba.getHeaderUrl(u.replace(\\\";{\\\",\\\"#isVideo=true#;{\\\"));\\n let backUrl = fba.getHeaderUrl(urls[i]).replace(';{','#ignoreImg=true##isVideo=true#;{');\\n let u1 = backUrl.split('#ignoreImg')[0];\\n let u2 = '#ignoreImg'+backUrl.split('#ignoreImg')[1];\\n u1 = u1.replace(/&from=.*|&next=.*|&jump=.*/,'');\\n if(/url=http/.test(u1)){\\n u1 = u1.split(\\\"url=\\\").slice(-1)[0];\\n }else if(/url=\\\\//.test(u1)&&/\\\\.m3u8/.test(u1)){\\n let host1 = u1.match(/(.*)\\\\/\\\\/(.*?)\\\\//)[0];\\n u1 = host1+u1.split(\\\"url=\\\").slice(-1)[0];\\n // fba.log(\\\"url分割:\\\"+u);\\n }\\n else if(/vid=http/.test(u1)){\\n u1 = u1.split(\\\"vid=\\\").slice(-1)[0];\\n }else if(/vid=\\\\//.test(u1)&&/\\\\.m3u8/.test(u1)){\\n let host1 = u1.match(/(.*)\\\\/\\\\/(.*?)\\\\//)[0];\\n u1 = host1+u1.split(\\\"vid=\\\").slice(-1)[0];\\n }\\n else if(/\\\\?(.*)=http/.test(u1)&&/\\\\.m3u8/.test(u1)){\\n u1 = \\\"http\\\"+u1.split(/\\\\?(.*)=http/).slice(-1)[0];\\n }\\n backUrl = u1 + u2;\\n // fba.log('返回自动加cookie链接:'+backUrl);\\n fba.log('返回链接:'+u+'并自动加了cookie,具体cookie在视频播放处查看');\\n return backUrl;\\n }\\n else{\\n fba.log(\\\"返回仓库x5免嗅结果:\\\"+realUrl);\\n return realUrl\\n }\\n }\\n }\\n }catch (e) {\\n fba.log(e.message)\\n }\\n }catch (e) {\\n // fy_bridge_app.log('x5大范围错误:'+e.message);\\n alert('x5大范围错误:'+e.message);\\n return 'toast://报错结束x5'\\n }\\n },isVideo,rechange,playUrl,max_count,PC_UA,isBadVideo);\\n let useWeb=lsg.getItem(\\\"通免\\\",\\\"X5\\\")===\\\"WEB\\\";\\n //log(\\\"仓库使用web通免替代x5:\\\"+useWeb);\\n let ruleHead=useWeb&&parseInt(getAppVersion())>=2339?\\\"webRule://\\\":\\\"x5Rule://\\\";\\n let x5Url = ruleHead+playUrl+ '@' +_x5;\\n return x5Url\\n }\\n}\\n\\nfunction x5ParsePro(x5list,x5Timeout,isVideo){\\n let bpath = 'file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/rules/dzHouse/html/海阔嗅探器.html';\\n let bcode = fetch(bpath);\\n if(!bcode||!/fy_bridge_app/.test(bcode)){\\n log('本地未安装嗅探器,开始安装');\\n const {api} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let html = fetch(api.host+'/rulelist.json?id=2055');\\n if(/海阔视界/.test(html)){\\n writeFile(bpath,html);\\n }else{\\n writeFile(bpath,fetch('https://hjdhnx.coding.net/p/hiker/d/dr/git/raw/master/html/getVideo.html'))\\n }\\n }\\n x5Timeout = parseInt(x5Timeout)||5000;\\n let max_count=(x5Timeout/250); //根据超时自动计算了可执行的次数\\n putVar('x5List',JSON.stringify(x5list));\\n let _x5 = $.toString((isVideo, max_count,x5Timeout,isBadVideo) => {\\n //初始化fba和requst\\n if (typeof (fba) == 'undefined' || !fba) {\\n var fba = fy_bridge_app;\\n }\\n try {\\n if (typeof (request) == 'undefined' || !request) {\\n eval(fba.getInternalJs());\\n }\\n } catch (e) {\\n fba.log(e.message);\\n }\\n //------------------\\n try {\\n if (window.count == null) {\\n window.count = 1;\\n }\\n let text='';\\n try {\\n text=document.querySelector(\\\"body\\\").innerText;\\n }catch (e) {fba.log(e.message)}\\n if(/触发了防盗链|未授权|接口防盗/.test(text)&&window.count==1){\\n location.reload();\\n fba.log(\\\"检测到有授权,开始过授权\\\");\\n }\\n window.count++;\\n // fba.log('count:' + window.count + ',max_count:' + max_count);\\n if (window.count >= max_count) {\\n fba.clearVar('x5List');\\n fba.hideLoading();\\n let fmsg = '道长仓库通免解析失败,原因:超时'+x5Timeout+'毫秒';\\n fba.log(fmsg);\\n return 'toast://'+fmsg;\\n }\\n }catch (e) {\\n fba.log(e.message);\\n }\\n\\n function muteMe(elem) {\\n try {\\n elem.pause();\\n } catch (e) {\\n }\\n }\\n\\n var videos = document.querySelectorAll(\\\"video\\\"), audios = document.querySelectorAll(\\\"audio\\\"),\\n v2 = document.querySelectorAll(\\\"embed\\\"), v3 = document.querySelectorAll(\\\"#player\\\");\\n try {\\n [].forEach.call(videos, function (video) {\\n muteMe(video);\\n });\\n } catch (e) {\\n }\\n try {\\n [].forEach.call(audios, function (audio) {\\n muteMe(audio);\\n });\\n } catch (e) {\\n }\\n try {\\n [].forEach.call(v2, function (v) {\\n muteMe(v);\\n });\\n } catch (e) {\\n }\\n try {\\n [].forEach.call(v3, function (v) {\\n muteMe(v);\\n });\\n } catch (e) {\\n }\\n var urls = _getUrls();\\n try {\\n for (let i in urls) {\\n let u=urls[i];\\n //u=decodeURIComponent(u);\\n try{u=decodeURIComponent(u);}catch(e){\\n u=unescape(u);\\n }\\n if(/url=http/.test(u)){\\n u = u.split(\\\"url=\\\").slice(-1)[0];\\n }else if(/vid=http/.test(u)){\\n u = u.split(\\\"vid=\\\").slice(-1)[0];\\n }else if(/\\\\?(.*)=http/.test(u)){\\n u = \\\"http\\\"+u.split(/\\\\?(.*)=http/).slice(-1)[0];\\n //fba.log(\\\"其他分割:\\\"+u);\\n }else if(/\\\\/1\\\\.m3u8$/.test(u)){\\n continue;\\n }\\n u=u.replace(/&from=.*|&next=.*|&jump=.*/,'');\\n let realUrl = isVideo(u);\\n if (realUrl&&!isBadVideo(u)) {//过滤吊毛\\n fba.log(\\\"仓库x5免嗅结果:\\\" + realUrl);\\n fba.clearVar('x5List');\\n return realUrl\\n }\\n }\\n } catch (e) {\\n fba.log(e.message)\\n }\\n }, isVideo, max_count,x5Timeout,isBadVideo);\\n const lsg=$.require(\\\"hiker://page/localStorage?rule=道长仓库Pro\\\");\\n let useWeb=lsg.getItem(\\\"通免\\\",\\\"X5\\\")===\\\"WEB\\\";\\n //log(\\\"仓库使用web通免替代x5:\\\"+useWeb);\\n let ruleHead=useWeb&&parseInt(getAppVersion())>=2339?\\\"webRule://\\\":\\\"x5Rule://\\\";\\n return ruleHead+bpath+'@' + _x5;\\n}\\n\\nfunction LazyParseFast(playUrlList,getTimeout,x5Timeout){\\n const {isVideo,getHeaders,x5ParsePro} = $.require('hiker://page/globalParse?rule=道长仓库Pro');\\n // log('开始执行'+playUrlList.length+'个地址的批量嗅探:'+playUrlList);\\n log('开始执行'+playUrlList.length+'个地址的批量嗅探');\\n let playUrls = playUrlList.map((it)=>{\\n return {\\n url:it.split(\\\";\\\")[0],\\n options: {\\n headers: {\\n //\\\"User-Agent\\\": \\\"Dart/2.13 (dart:io)\\\",\\n \\\"User-Agent\\\":\\\"Mozilla/5.0\\\"\\n },\\n timeout: getTimeout\\n }\\n }\\n });\\n let bhtml = batchFetch(playUrls);\\n let videos = [];\\n let x5list = [];\\n for(let i in bhtml){\\n let order = parseInt(i)+1;\\n let tname=order+'号解析网址:';\\n //log(tname);\\n let turl=playUrlList[i].split(\\\";\\\")[0];\\n let jname=playUrlList[i].split(\\\";\\\").length>1?playUrlList[i].split(\\\";\\\")[1]:\\\"\\\";\\n tname+=jname;\\n let backcode = bhtml[i];\\n if((!/url|http/.test(backcode))&&(!/#EXTINF/.test(backcode))){\\n log(tname+turl+'有问题,可能加密或者挂了');\\n continue;\\n }else if(/#EXTINF/.test(backcode)){\\n //let lcache=\\\"/storage/emulated/0/Android/data/com.example.hikerview/files/Documents/cache/video_\\\"+tname+\\\".m3u8\\\";\\n //writeFile(lcache,backcode);\\n //videos.push(lcache);\\n let pUrl=cacheM3u8(turl);\\n videos.push(pUrl);\\n continue;\\n }\\n try {\\n let url = JSON.parse(backcode).url;\\n if(/^http/.test(url)){\\n let realVideo = isVideo(url);\\n if(typeof(realVideo)=='string'){\\n log(tname+'已解析出视频:'+realVideo);\\n if(jname){\\n realVideo+=\\\"★\\\"+jname\\n }\\n videos.push(realVideo);\\n }else{\\n log(tname+'解析出不知道什么东西:'+url);\\n url+=\\\"#isVideo=true#\\\";\\n if(jname){\\n url+=\\\"★\\\"+jname\\n }\\n videos.push(url);\\n }\\n }else{\\n log(tname+'为json接口且无返回视频地址数据:'+playUrlList[i]+'\\\\n'+backcode);\\n }\\n }catch (e) {\\n log(tname+'为x5接口,加入x5嗅探列表');\\n x5list.push(playUrlList[i]);\\n }\\n }\\n // log(videos);\\n if(videos.length>0){\\n if(getVar('dp.cacheVideo','true')==='true'&&parseInt(getAppVersion())>=2255)\\n {\\n log(\\\"尊敬的魔断用户,视频缓存已启用,请尽情享受看剧时光\\\");\\n let videosCache=videos.map((it)=>{\\n let headers={};\\n if(it.split(\\\";\\\").length>1){\\n let head = it.split(';')[1];\\n if(/@/.test(head)&&/{|}/.test(head)){\\n//head = head.replace(/{|}/g,'');\\n head = head.split(\\\"{\\\")[1].split(\\\"}\\\")[0];\\n head = head.split('&&');\\n for(let i in head){\\n let key = head[i].split('@')[0];\\n let value =head[i].split('@')[1].replace(/;/,';');\\n headers[key] = value;\\n }\\n }\\n }\\n return {\\n url:it.split(\\\";\\\")[0].split(\\\"★\\\")[0],\\n options:{\\n headers:headers\\n }\\n }\\n });\\n var data=batchCacheM3u8(videosCache);\\n data=data.map((it,id)=>{\\n let extra=\\\"\\\";\\n if(videos[id].split(\\\";\\\").length>1){\\n extra=\\\";\\\"+videos[id].split(\\\";\\\")[1];\\n }else if(videos[id].split(\\\"★\\\").length>1){\\n extra=\\\"★\\\"+videos[id].split(\\\"★\\\")[1];\\n }\\n\\n if(it+\\\"\\\"!=\\\"null\\\"){\\n return it+extra\\n }else{\\n return videos[id]\\n }\\n });\\n //log(data);\\n return data\\n //return videos\\n }else{\\n return videos\\n }\\n }\\n log('共有'+x5list.length+'个x5地址进行轮流嗅探');\\n //没有的话就开始依次x5嗅探\\n showLoading('嗅探中,若失败就切换web嗅探...');\\n return x5ParsePro(x5list,x5Timeout,isVideo);\\n}\\nvar lazy=$('').lazyRule(()=>{\\n try{\\n realUrl=input;\\n eval(\\\"var config_dp =\\\" + fetch(\\\"hiker://files/cache/MyParseSet.json\\\"));\\n eval(fetch(config_dp.cj));\\n log(input+'->正在断插魔改版解析...');\\n // 加入超时设置,建议在首页设置\\n return aytmParse(realUrl)\\n }catch(e){\\n return input\\n }\\n});\\n$.exports.isPic=isPic;\\n$.exports.isVideo=isVideo;\\n$.exports.isBadVideo=isBadVideo;\\n$.exports.comParse=comParse;\\n$.exports.getHeaders=getHeaders;\\n$.exports.lazyParse=lazyParse;\\n$.exports.x5ParsePro=x5ParsePro;\\n$.exports.LazyParseFast=LazyParseFast;\\n$.exports.lazy=lazy;\"},{\"name\":\"任务仓库接口\",\"path\":\"taskCall\",\"rule\":\"js:\\nString.prototype.strip = function () { return this.replace(/(^\\\\s*)|(\\\\s*$)/g, \\\"\\\"); };\\nfunction task_req(task_api,task) { // 通用发送仓库post调用任务请求\\n const {getFile} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let houseFile = getFile||false;\\n if(!houseFile){\\n setItem('is_house_vip', 'false');\\n }\\n let house_data = houseFile();\\n let result = request(task_api, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"data\\\": {\\n \\\"type\\\": task.mode||'run',\\n \\\"func\\\": task.func||'',\\n \\\"params\\\": task.params||[]\\n },\\n \\\"auth\\\": {\\n \\\"name\\\": house_data.username||\\\"\\\",\\n \\\"password\\\": house_data.password||\\\"\\\"\\n }\\n }\\n }),\\n method: 'POST'\\n });\\n return JSON.parse(result).result;\\n}\\n\\nfunction task_upload(task){ // 通用任务发布新增及修改功能\\n const {api,getFile} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let houseFile = getFile||false;\\n if(!houseFile){\\n setItem('is_house_vip', 'false');\\n }\\n let api_url = api.host+'/hikerule/task/add';\\n let house_data = houseFile();\\n let result = request(api_url, {\\n headers: {\\n 'content-type': 'application/json'\\n },\\n body: JSON.stringify({\\n \\\"params\\\": {\\n \\\"data\\\": {\\n \\\"name\\\": task.name,\\n \\\"pycode\\\": task.pycode,\\n \\\"note\\\": task.note,\\n \\\"test_code\\\": task.test_code,\\n },\\n \\\"auth\\\": {\\n \\\"name\\\": house_data.username||\\\"\\\",\\n \\\"password\\\": house_data.password||\\\"\\\"\\n }\\n }\\n }),\\n method: 'POST'\\n });\\n return JSON.parse(result).result;\\n}\\n\\nfunction task_call(id,func,params){\\n const {api} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let task_api = api.host+'/hikerule/task/run/'+id;\\n let task = {\\n mode:'call',\\n func:func,\\n params:params||[]\\n };\\n return task_req(task_api,task);\\n}\\n\\nfunction task_rename(id,new_task_name){\\n const {api,getFile} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let houseFile = getFile||false;\\n if(!houseFile){\\n setItem('is_house_vip', 'false');\\n }\\n let house_data = houseFile();\\n let task_api = api.host+'/hikerule/task/rename/'+id;\\n task_api = task_api+'?name='+house_data.username+'&password='+house_data.password+'&task_name='+new_task_name;\\n try {\\n let result = JSON.parse(fetch(task_api,{}));\\n if(result.status==0){\\n return result.detail\\n }else{\\n return result.result+''+result.detail\\n }\\n }catch (e) {\\n log(e.message);\\n return ''+e.message\\n }\\n}\\n\\nfunction task_change_state(id){\\n const {api,getFile} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let houseFile = getFile||false;\\n if(!houseFile){\\n setItem('is_house_vip', 'false');\\n }\\n let house_data = houseFile();\\n let task_api = api.host+'/hikerule/task/change_state/'+id;\\n task_api = task_api+'?name='+house_data.username+'&password='+house_data.password;\\n try {\\n let result = JSON.parse(fetch(task_api,{}));\\n if(result.status==0){\\n return result.detail\\n }else{\\n return result.result+''+result.detail\\n }\\n }catch (e) {\\n log(e.message);\\n return ''+e.message\\n }\\n}\\n\\nfunction task_run(id){\\n const {api} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let task_api = api.host+'/hikerule/task/run/'+id;\\n let task = {};\\n return task_req(task_api,task);\\n}\\n\\n$.exports.taskCall = task_call;\\n$.exports.taskRun = task_run;\\n$.exports.taskReq = task_req;\\n$.exports.taskUpload = task_upload;\\n$.exports.taskRename = task_rename;\\n$.exports.taskChangeState = task_change_state;\"},{\"col_type\":\"movie_3\",\"name\":\"全局储存\",\"path\":\"localStorage\",\"rule\":\"let localStorage = (function() {\\n evalPrivateJS(\\\"jwUKwNTiPGcWSLCXB5XtAXwb6LQbVyHD+0XJ7l07ce0=\\\");\\n //pathto=undefined;\\n evalPrivateJS(\\\"4C0YxRYnGCYkgFRXtpl/Cz5zL5hh4jCCztb+ng+WokymQ8oUrzS9lA8yxC5aFadnSEmyHKMbraflRqXCnNRHDlk6ue8yHTO16lBPrpwgs5jf0PhrAtoTJIE0ZHn9mKaQ4Jd2erqb4I55beWIeugKsDs211SzINQ5yJgSh1dVuNzzxRGJg40FmTuVmXVfN1xg2WIGHBEmkVnGxmORhPONA+Q5VwPmdp41/hze3eIsUvho7VCBgK4raJmPalIRBBVlCVgn8FkWmfKqZo+VW+oBcH7hrcrsSlCSjBangT/7syWHxKYhehU0kaMYjnWFg1Em0cmNRtomCsHz1B8q32OeQHoawdWxzKOaMHOXDBjRojA8E/ah0WROyziqRSxl/m8dhBd0f9phYz/5SU/zJD52X/9EC16WVVdpSW33akRHRslPpRlTWF9+AyRmRw0eZOEs1o9QMPAQUfAxbYyFHgztw/O2dJRpHyTmiBiaaqTcivx6v9zyvBz04wI1AaSCui+dTuU3lu5xdEt3Ajt6Z3iDXOVcEP0EDF7474PQU6JEZuwe97Sch4bi1wB1XHZSfItdlYYoGed3LLpbmDAIRciv0rAop8VmQcTt2K3Lfh1RDYY0YtvRcH49OvpDRH/xa5Fc8MY3DrFoA7qcoF4eCgiVBfBgJR68+LpQK7tOkg8k9ec+3NSxJThcl8d6yNwxT9Tk17zeJgd6MoyYZIpWQLlF6YvbOdEWhjmnA78wC0hWz+Xm6hQMSqtFw+bhFf7cBGU3aatPFmdCY2EdXfh0IYW85wdOyMfiwW7/vVTp9iE00I3F09wGHkGKhVbLueAkYe7zzJXR7thaFor6H7qLmJjbRQk9evNtBQXNR7DifiXuQf2lt7nOH80SWm1fDHHzjmPsNIps2TXGT+iwVV69g/tWipVQ6D8BTx+cCQp47nmTIrY+qN4kh2FYh5LlwXdgIyy1VIuC3x053ewAIIUmlY9niEpqYt+1fFPXOCtCGtYbSd37vVR1EOj2k5Gu/+9JWg2qvwl1twelg1J0txarIi4kTbTrvrnFLN92pofpZQUfoWo4ce7HWNdbu4JKEraLQUfdfGEPd1TIufuuRVa39eq9GZySDuBL60MPdldxKw1zo+fB5ZY+YMj3LL2gGtDbs98+AsRV9LJWmUmsx91hmJtFUMWD3xnj8HMZWs0NPlCFUr9485KqTpo5kRzGfF+k/Nl2Jzrv5cvkqtUnLgKpXEOj/se/oDzOArQKI5TNUbvYwcwcdjjMSfjK68Krwhs+n6SmWZ4ZdgRHgAK5MoFi3XmLV47P3vSRWu5zyEsMk4y3uuCFiuRPRlu4Q5pJvuOem7H7ULiIhCemv5DgkGtDL1cGL4EQhYRB6ISzVvsb2EaP9wQE6DVRnM7O+pnSzet6lzp3pFdGnbox1LRfC60utXZ+CjIm4iEMmtbB2N5zDShGbeM3XUbJQdCBis8XIrhh2biB5hBCVwn3Y3ett7GDPVtoi1GRjz+JbgM+YR928KbdWS5tFaMM3Kj3Xv6otIxzMBnDC9uW3d+IXx6vLPJ0JRuh3yP7pTla6c3iR4p9nWYDqJ+ZSmprHFnDOzsLWmFjapje/MqwMJd6Tk3nAWwicMOPuYpMyqIF04fl4mqgtsHLSMWRRNHPZjETQ9gRmeDYe6aRtlW02qL2olDENqLQMtAdoirNWRcP9VL3Td8HaUO6fSlGNabMakJD/00XChOSUOIP+7fM7V0/l1bLWPtEz1i7LygTV7pdGoDntqSCEnJrByhBAzLRg5QIc9438IhKmyfn0/3awoD1Ir780eyp/XcI6xNcw6Tv/ETfHg0e7iYC0UYcJIE5QUXv0s+YoGIEq5GIzKub8HNjSTUpsvnkVx+dbe2jRn3Yb9W7JCZ5YS6F5MyUVspjMD7NYc+DWjUL2b2sVyAfeYpC8Uhah9tumavbBv7a3a9kgFbq58lrHxzY7iJQVigzq3e1a2BSb0PcW1aJ8BD7NkNphKYayTxykgwilERL8jqqBEniHVdBxDJYLb+Xw3alLmltuTEV6KGtBntBX+yz36RPDMyGIKe+3fzcxfnCDn20ModVVkVNozPqMXZ0G5L4aLTAQakYKUjsVMQjAhQkTlHBeO/aLPx9sxl++j1Z5rLgG12TN4XJ1eicvw4AVE58Loraq0QiE0cS7PH1pbrZWrft7LYGiyBShor7+0jioUh1pdWq2qMYLqeMEeuCROQt57mFrOjyPH49qp97cWOrgeg2WyfWSDGQPje5+P0yQoCpD/D3RAMuWmb9wlBtcq2j8WJPt91E3kKawuQIyvd2r2Ujx4+HTNtVKb9kMLOO85I65bNGBH+4irSy5gQYlE26A2cSGIcLKQRlvJoMna7L/9wyry4HzOrzkrAvLdgsSNlYjpHQERiOI80sJ5jNCCnfw013F+A+sAfLmyS/BDLNQ1qaQ3p6h8/JqAfhX5OGHgSiRVOCEjuaDB/MwZNCu3QL9ehhoAj7uOf8Pkr3mIjbhh9Hijsjx191+0e2JQrFa01AVJKEVtuPtIc2h/1pPKMvyenxjTO2OxPnjjt+84nIKKhxDJ/ghPt7iv8PmTJ0lKKyPRssl8f/QdHdxupb6jTsI6UKmz9Y46PMBuD6P3wh8qp36O6oibNDiQd1sE10vJh9z1FysKIe8EqMpnNdEmG2TfEBxRpmQrhKEqee0p6+a6sQo8cVlRJkKQAYKawcaNES5Xc6dQY5nqeiq8sUizf1spfHeHelDu1M6BRXuCjFafXhz8i3lPWgYqVpfx13igVCRf47UH652yLnsmepCBWgyBTWAcOyF1Qx8YGtZnob1TN+6xEwzpcWVy7QO9P92sKA9SK+/NHsqf13COt0JHCtTV1OlTQW+JAKyxe1Hl7+s95z3KCgFKQS+3As1JV7Na+g+LCR2Ievu8d5D0L7GwoDreUv4374LRaFkNsHOqWbU9nhQjdMVr7a/i8O/4hbptaSzqqkgYFiNFU/omW5qwIz7sp4nscITRE3gua6bzklMZ8ECn1iqAWt0a6geki5DaL8qYapTCChjlWsExqFuxiWP35TUCddEd8ACbMGs+gQFyDOozfBDG17dZO0mCwW+PzCL2jbICDNai5/jm1Qr6ML56jzUaIDz0GLPTSaex1UDDwkQ9o7mXWC0R7jWnzbkHRWcomVbWmGqL1rjdoacs/R9ujqUuBA6A5VL/qkQ1xHL42EXooprC8wrrfR68zMMFxOwU7CYHJ7bhG/Q4rNsXDBcMo1Adiq9LXbXm/QJj0u/jgZGssz0nnKKUFJcxzuANK96zWwf1DXasUcOoEuEatm1rmP5wrBJmW/ZwT6aBBiR2OSJ0xr8tQ6ObmdKjyb+1eEXb1437R2IdhDUdk5PRztH2YFt2pmuL4/LmILFAvPdiyMtDHNj+Kh4sV4MlXbWPrrI97YBOFpFlX+gnewKKfFZkHE7dity34dUQ2Gne6sAGx1zxyjZv5KBM26lRHF45XqFNJ1RQ3hMymJHsyYNsMO41BWrGv19PA468ecw9HcRN0whjUTgns8ZVaC4hiJsgY07aAEBHm90/uhhjO/Wmb7wuVadhl9RnHeQjpx4gwCrLz5i5s5It1sBwfDb0Fe+PCpLkc+wIINK2Y86kPthR6gJwW75zuoN5C0CAiDwfU73vaAZahzf4VLNlM0U04OtHYBi13YgPoNmGHRelZVEy2KuKVZghD14vSlY+JrMBDdm2y2thFV+BrihL7+fQ5wcYnxGelawDuoSR5+bDDkr6RL40L4xyfAhxlrOn0uA28ghGeWguaWKEv5nBrrveu1ueVy1MvGUYBY+IlEr8NdDNRdmEzXt39kGld86xOfAH/xL1VmugaXOGaPB2qc7WDRkW6k5F6n3PkIzdPXyONKp1DkOg3ocSMZMTs6GKj9C3vODZ6ZQpwNDYLMT+CmEL18GRjXNcZlP/LnhiAIscYTL1+iHWDYvRmvPMwtOHhCnEXIU3FTbP+6QRGA6qydbnneqVhXowcLmbMIz16IC1kwhZj75/M53sKYX2zRgOSTAfNSD/5lZYSNUxJfKTDgiaFEggrCrd+3Cc+chzslI3zDXEKTrvlcX2InC9uH+fsypyHw+AvY2OmBGQMIIc8fE3tNO0gBTVqXsdsE76YwHr29dzQckusuyJsBfSVclrvsNCZ1PQDL8H3cRs3HE9nUkx5bbJYWsPxb825gnEpWU9Z9Ktzvsli7/heOlDKpHxJb1uCrWqf8gRnWmq3zfSSrUXBHSLu62MrkXTjWgapUVxMGkrnzR0E4PMy1bFcyDpEQe15TayWBM1B6jrIG+0DRR9OaCUPwD7exNmjZb9M81us+AIRfyzJPZGmfHuT9SNzFfNuQdFZyiZVtaYaovWuN2irI3zQatKCDnQIXpr0VhG0Gop8c/zroWBoN/aVKmn8skSFvADOjoZAixg6K1y9wFi8peCmimFZ3ZzCVsG6EU9Svlbq5+wn7D6y+dAYdaPms4gwCrLz5i5s5It1sBwfDbz4X4VxqIpcTC9NaYKqA7GKK+aTrZWUwwN21QOtr8eqxSgJ1U9eCOcWXQd+p36Gy4fY+t9c2CsVNbNl1ghxa9bI8U6e6FTd/vvBaq9jrKditq4mNCaiogmfPK6M48UYI8jZMCdd/9C8BqvUj4bYU5byWASEG6BBGdK8Klfi/a4LWt3ivC4u9QBTfb/vCmNJi/QAfabcPG+UsWmsYNRK+g8hMcsuBmhh48NphRvebVQqq6ncKxc1nFHWMW5M6of+z8c1HddnieDP9GaBsq+ysljKslYrt989PY9xsbmkr3X/oCfiFU4NfcOhee++ngW0XpZAVt1I2Qnc1alwbnoNqMMhXIB95ikLxSFqH226Zq9sG/trdr2SAVurnyWsfHNjuIlBWKDOrd7VrYFJvQ9xbVomKqQjuh9dzf2nvVrBzbEF0CZY6izkY/RQY5r9k93/y2NG7o07nMYjOtZYYeNUoik7GbK/HzQl1S7s/FChnt9M6fE0UyuPmttO98hqzxQbteMalMtSce2WLcjyXVGfpqdBkYym4gZByccS6antt4oLdluWSSJsHX1IcXhQy6oJ+Ahjw9hFYwXLHPLoCo3jEliUAK4179wtYtHsO0abLx4+hmtM5Fz7wUVahBA9supOTf/FD4siZMMof5W3vm5DedhqGANlht3mI6RmIhv48QVtneMsUzYC4NDhZD4M5R6p7GXBqcpu3FaEF/0I0e3LceX1HN+iDqKRPuGzvpac/1tsGPIteADxu9OYoap2z3F1CzSg/Uua8l/KEztAKDcvbhNU/YUc2lhgxgfdb4e+P9TZ7RaX82s627u0CbFsfGE/1hLpb5Mc2vk1uDGrdIcbWA6xhpYAHYhEYUl9c75Y/R/0gl6r9+m6cI0BvBY5Aa5NBRc6UMvsO/POw5Ccr79sJziceaV3YwrYEkjp6Ki+OYrGu954AA+dJ9WsvNGBFGMrKAfQ9VUC/ATkJfTloMltDeV5Ao9zkaay3dKAa5/PxAGRDAUcQLDF7uVXbD1vFgE/+RXiwzS5N7cr3aFBdRY7XAmFz/fb0/KSpR8CQ/lokpmM2mltJ9vGPgiqb5nZl9Ku7d2GlgAdiERhSX1zvlj9H/SBujBPoO1fpoOu5F35cdHa5kSFvADOjoZAixg6K1y9wFlj0Ez5ksUW3WU63E7e4qtDUCKWwjjU5f0Fd57VyVzpC6CdCScBjYSzT9rZLVskq61aOWrDDUNKqAQ3+nX/BBW3cQTEcOVdc15ngVXcSS/aK2QFMdiKQlqm15fErJdwqyeza7hflKTiCzUdu5VGlFW9qCt8syHoosA2NzfosJdTdN8bWHnoDr5N25et+p/nvjjOzZRaLYoY/fr/k5hqptOk=\\\");\\n return $.exports;\\n})();\"},{\"col_type\":\"movie_3\",\"name\":\"编辑公告\",\"path\":\"devInfoEdit\",\"rule\":\"js:\\naddListener('onClose', $.toString(()=>{\\n putMyVar(\\\"devInfo\\\",''); //清除历史公告\\n}));\\nsetPageTitle('编辑公告');\\n// let {nowJx,MyJiexi,jxsRoute} = MY_PARAMS;\\nconst {color,small,api, getFile,getApi} = $.require(\\\"hiker://page/utiliy\\\");\\n// let houseFile = getFile||false;\\nvar dev_info_url = getApi('infoGetUrl');\\n// log(dev_info_url);\\nvar get_info = function(qq){\\n qq = qq||'434857005';\\n let dev_info_url = dev_info_url+qq;\\n let back_code = JSON.parse(request(dev_info_url));\\n let dev_info=back_code.result||back_code.detail;\\n return dev_info;\\n};\\nvar before_refresh = function(){\\n let dev_set_info = getMyVar(\\\"dev_set_info\\\").split('$$');\\n let dev_info_url = dev_set_info.slice(-1)[0];\\n let back_code = JSON.parse(request(dev_info_url));\\n let dev_info=back_code.result||back_code.detail;\\n putMyVar(\\\"devInfo\\\",dev_info);\\n return dev_info\\n};\\nlet d = [];\\nd.push({\\n title:'编辑公告',\\n desc:'支持md语法,点击进入学习Md语法\\\\n保存公告按钮在文本框最下面',\\n col_type:'text_1',\\n url:'https://www.runoob.com/markdown/md-tutorial.html'\\n});\\nd.push({\\n title:'返回',\\n col_type:'text_2',\\n url:$('#noLoading#').lazyRule(()=>{\\n back(false);\\n return 'hiker://empty'\\n })\\n});\\nif(!getMyVar('devInfo')){\\n before_refresh();\\n}\\nlet empty = 'hiker://empty';\\nd.push({\\n title:'阅览查阅',\\n col_type:'text_2',\\n // url:$(getMyVar('devInfo')).confirm()\\n url:$(empty).rule(()=>{\\n require(\\\"https://gitlab.com/hjdhnx/hiker/-/raw/main/js/marked.min.js\\\");\\n let devInfo=\\\"\\\";\\n try{\\n devInfo=marked.parse(getMyVar('devInfo'));\\n }catch(e){}\\n setResult([\\n {\\n title:devInfo,\\n col_type:'rich_text',\\n }\\n ]);\\n })\\n});\\nd.push({\\n desc: \\\"快来编辑你的公告吧~\\\",\\n col_type: 'input',\\n extra: {\\n titleVisible: false,\\n defaultValue: getMyVar('devInfo', '')||\\\"\\\",\\n type: \\\"textarea\\\",\\n height:-1,\\n onChange: 'putMyVar(\\\"devInfo\\\",input)'\\n }\\n});\\nd.push({\\n title:\\\"保存公告\\\",\\n col_type: 'text_center_1',\\n url:$('确认保存公告吗?将会与道长仓库服务器通讯').confirm(()=>{\\n let dev_set_info = getMyVar(\\\"dev_set_info\\\").split('$$');\\n let input_text = getMyVar('devInfo', '');\\n if(input_text.length >= 4){\\n let info_set_url= dev_set_info[2];\\n let send_data = {\\\"params\\\":\\n {\\\"data\\\": {\\\"info\\\": input_text},\\n \\\"name\\\": dev_set_info[0],\\n \\\"password\\\": dev_set_info[1]}\\n };\\n // log(send_data);\\n let par2 = {headers:{'content-type':'application/json;charset=UTF-8','User-Agent':dev_set_info[3]},body:JSON.stringify(send_data),method:'POST'};\\n // par2 = JSON.stringify(par2); //x5里面请求才需要编码\\n try {\\n let back_ret = request(info_set_url, par2);\\n back_ret = JSON.parse(back_ret).result;\\n if(back_ret.status===0){\\n // refreshPage();\\n return 'toast://保存成功\\\\n'+back_ret.detail;\\n }else{\\n return 'toast://保存失败\\\\n'+back_ret.detail;\\n }\\n }catch (e) {\\n return 'toast://错误\\\\n'+e.message;\\n }\\n }else{\\n confirm({title:'道长提示',content:'虽然你很懒,但是公告至少写4个字吧!'});\\n return 'hiker://empty'\\n }\\n })\\n});\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"预处理依赖文件\",\"path\":\"libs\",\"rule\":\"if(getAppVersion()>=3200){\\n try{\\n rc(\\\"hiker://files/rules/js/$hiker.js\\\", -1);\\n //$.setRoot('https://hjdhnx.coding.net/public/hiker/hiker/git/files/master/js/');\\n $.setRoot();\\n $.setLib({\\n lsg: \\\"lsg.js\\\", //本地储存\\n file: \\\"file.js\\\", //文件os\\n fileSelect: \\\"fileSelect.js\\\", //文件选择器\\n dt: \\\"dt.js\\\", //动态分类\\n dr: \\\"dr.js\\\", //dr模板依赖\\n drpre: \\\"drpre.js\\\", //dr模板预处理\\n drup: \\\"drup.js\\\", //dr模板自动更新\\n drmatch: \\\"drmatch.js\\\", //dr模板自动模板匹配\\n drm: \\\"drm.js\\\", //dr模板小程序\\n cms: \\\"cms.js\\\", //cms模板依赖\\n cmspre: \\\"cmspre.js\\\", //cms预处理\\n cmsm: \\\"cmsm.js\\\", //cms模板小程序\\n libcheck: \\\"libcheck.js\\\", //dr检测依赖\\n ruleEditor: \\\"ruleEditor.js\\\", //写页源神器小程序\\n houseLazy: \\\"houseLazy.js\\\", //仓库通免\\n lazy: \\\"lazy.js\\\", //香免\\n sub: \\\"sub.js\\\", //道德经订阅\\n hikerUi: \\\"hikerUi.js\\\", //海阔组件依赖\\n hikerLibs: \\\"hikerLibs.js\\\", //海阔全能依赖\\n });\\n }catch(e){\\n //toast('请尝试点击仓库主页的升级仓库旁边的按钮升级$扩展,否则某些功能不能正常使用');\\n confirm({\\n title: '提示-点击确定可以导入',\\n content: '请尝试点击仓库主页的升级仓库旁边的按钮升级$扩展,否则某些功能不能正常使用',\\n confirm: $.toString(()=>{\\n const {getApi} = $.require(\\\"hiker://page/utiliy?rule=道长仓库Pro\\\");\\n let ruleHead = '海阔视界,网页插件¥js_url¥$hiker@';\\n let url = getApi('importUrl')+\\\"5111\\\";\\n let importUrl = 'rule://'+base64Encode(ruleHead+url);\\n return importUrl\\n }),\\n cancel: $.toString(()=>{\\n\\n }),\\n })\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"Import详细\",\"path\":\"ruleDetailImport\",\"rule\":\"js:\\n$.exports = \\\"hiker://page/ruleDetail?rule=道长仓库Pro&id=\\\" + $.importParam;\\n\"},{\"col_type\":\"movie_3\",\"name\":\"跑马灯公告\",\"path\":\"notice\",\"rule\":\"js:\\nlet getHtml = (text, color) => `\\n<!DOCTYPE html>\\n<html>\\n<head>\\n<meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0\\\">\\n<style>\\n.marquee {\\n width: 100%;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n color: ${color};\\n font-size: 16px;\\n white-space: nowrap;\\n}\\n\\n.marquee span {\\n user-select:none;\\n display: inline-block; \\n padding-left: 100%;\\n animation: marquee 25s linear infinite;\\n}\\n\\n@keyframes marquee {\\n 0% { transform: translateX(0%); }\\n 100% { transform: translateX(-100%); }\\n}\\n\\n@media (prefers-color-scheme: dark) {\\n body {\\n background-color: #1B1B1B;\\n }\\n .text,.scroll{\\n color:#Fff;\\n }\\n }\\n\\n@media (prefers-color-scheme: light) {\\n body {\\n background-color: transparent;\\n }\\n }\\n\\n</style>\\n</head>\\n<body>\\n<div class=\\\"marquee\\\">\\n <span id=\\\"textContainer\\\">${text}</span>\\n</div>\\n</body>\\n</html>`;\\n\\n$.exports.show = function(arr, text, color, url, content) {\\n var html = getHtml(text || '这是跑马灯默认的文字,可以自行替换。', color || 'red');\\n arr.push({\\n col_type: \\\"x5_webview_single\\\",\\n url: \\\"about:blank\\\",\\n desc: \\\"50&&list\\\",\\n extra: {\\n js: $.toString((h, url) => {\\n var html = document.documentElement;\\n html.innerHTML = h;\\n\\n const textContainer = document.getElementById('textContainer');\\n const text = textContainer.innerHTML;\\n textContainer.onclick=function(){\\n window.location.href = url||\\\"about:blank/notice\\\";\\n }\\n // 设置文本容器宽度为文本内容的宽度\\n textContainer.style.width = `${textContainer.offsetWidth}px`;\\n\\n // 复制文本内容并追加到文本容器后面\\n textContainer.innerHTML += ' ' + text;\\n\\n // 动态计算动画持续时间\\n const duration = (textContainer.offsetWidth / textContainer.parentElement.offsetWidth) * 10;\\n\\n var styleElements = document.head.getElementsByTagName('style');\\n\\n\\n styleElements[2].innerHTML = `.marquee span {\\n display: inline-block;\\n padding-left: 100%;\\n animation: marquee ${duration}s linear infinite\\n }`;\\n\\n }, html, url),\\n urlInterceptor: $.toString((content) => {\\n if (input===\\\"about:blank/notice\\\") {\\n return $.toString((content) => {\\n fba.open(JSON.stringify({\\n title: \\\"公告\\\",\\n url: 'hiker://empty#noRecordHistory##noHistory#',\\n findRule: \\\"js:\\\" + $$$.toString((content) => setResult([{\\n title: content,\\n col_type: \\\"rich_text\\\",\\n }]),content)\\n }));\\n }, content);\\n }\\n }, content || text),\\n }\\n });\\n}\"}]","proxy":"","icon":"https://gitcode.net/qq_32394351/dr/-/raw/master/img/道长仓库.svg"},{"last_chapter_rule":"","title":"云盘君.简","author":"小棉袄🌞&@LoyDgIk","version":169,"type":"all","url":"hiker://empty##fypage","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:$.require(\"Main\");","searchFind":"js:\nlet isdDelegate = !!getItem(\"isdDelegate\", \"\");\nif (isdDelegate) {\n setResult([{\n title: \"点我开始聚合搜索\" + MY_KEYWORD,\n url: \"hiker://search?s=\" + MY_KEYWORD,\n extra: {\n delegateOnlySearch: true,\n rules: $.toString(() => {\n try {\n let ruleGroup = getItem(\"ruleGroup\", \"\");\n let data = $.require(\"data\").getAllData(ruleGroup);\n let rules = [];\n for (let it of data) {\n rules.push({\n title: it.name,\n search_url: \"hiker://empty?page=fypage&searchTerms=**\",\n searchFind: \"js:\" + $.toString((rule) => {\n setResult($.require(\"data\").carrySRule(rule, MY_KEYWORD, MY_PAGE, getSearchMode()));\n }, it)\n });\n }\n return JSON.stringify(rules);\n } catch (e) {\n log(e.toString());\n }\n })\n }\n }]);\n} else {\n setResult([{\n title: \"点我开始聚合搜索\" + MY_KEYWORD,\n url: \"hiker://page/sou#noHistory#?p=fypage\",\n extra: {\n pageTitle: \"搜索\" + MY_KEYWORD,\n searchTerms: MY_KEYWORD,\n hideSetting: true\n }\n }]);\n}","search_url":"hiker://empty?searchTerms=**","group":"①网盘","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"规则处理\",\"path\":\"data\",\"rule\":\"js:\\nlet ParseRlue = $.require(\\\"ParseRlue\\\");\\n\\nfunction toRedirectTreating(config) {\\n return $.require(\\\"redirect\\\").doubleTreating(config);\\n}\\n\\nfunction toRedirect(aliUrl, sharePwd) {\\n return $.require(\\\"redirect\\\").getModeUrl(aliUrl, sharePwd);\\n}\\n\\nfunction getCompleteRule(rule) {\\n if (rule.ruleType === \\\"JSON\\\") {\\n let find = rule.find;\\n rule.find = (s, page) => {\\n let url = String(rule.basicUrl).replace(\\\"**\\\", encodeURIComponent(s)).replace(\\\"fypage\\\", page + \\\"\\\");\\n return ParseRlue.parseSearchJson(url, find);\\n }\\n } else if (rule.ruleType === \\\"HTML\\\") {\\n let find = rule.find;\\n rule.find = (s, page) => {\\n let url = String(rule.basicUrl).replace(\\\"**\\\", encodeURIComponent(s)).replace(\\\"fypage\\\", page + \\\"\\\");\\n return ParseRlue.parseSearchHtml(url, find);\\n }\\n } else {\\n let find = new Function(\\\"s\\\", \\\"page\\\", \\\"user\\\", \\\"basicUrl\\\", rule.find);\\n rule.find = (s, page) => find(s, page, rule.user || {}, rule.basicUrl || \\\"\\\");\\n /*if (rule.findAliUrl) {\\n rule.findAliUrl = new Function(\\\"input\\\", \\\"basicUrl\\\", rule.findAliUrl);\\n }*/\\n }\\n return rule;\\n}\\n$.exports.carryRule = function(rule, s, page, searchMode) {\\n rule = getCompleteRule(rule);\\n let list = rule.find(s, page);\\n if (!list) return [];\\n\\n let descTips = \\\"““””\\\" + rule.name.fontcolor(\\\"#f13b66a\\\") + \\\"&nbsp;\\\";\\n let resList = [];\\n\\n for (let it of list) {\\n if (it.skip) {\\n resList.push(it);\\n continue;\\n }\\n if (searchMode && !searchContains(it.title, s, true)) continue;\\n if (rule.findAliUrl) {\\n it.url = $(it.url).lazyRule(toRedirectTreating, {\\n findAliUrl: rule.findAliUrl,\\n basicUrl: rule.basicUrl,\\n name: rule.name,\\n author: rule.author,\\n aliUrl: it.url,\\n ruleType: rule.ruleType\\n });\\n } else {\\n it.url = $(\\\"#noLoading#\\\").lazyRule(toRedirect, it.url, it.sharePwd || \\\"\\\");\\n }\\n let title = it.title || \\\"\\\";\\n resList.push({\\n title: title.includes(\\\"““””\\\") ? title : \\\"““””\\\" + title.replace(new RegExp(\\\"<em>|</em>\\\", \\\"g\\\"), \\\"\\\").replace(new RegExp(\\\"(\\\" + s + \\\")\\\", \\\"gi\\\"), \\\"<strong><span style=\\\\\\\"color: #1E90FF\\\\\\\">$1</span></strong>\\\"),\\n desc: descTips + (it.desc || \\\"\\\"),\\n url: it.url,\\n pic_url: it.pic_url,\\n col_type: it.pic_url ? \\\"movie_1_vertical_pic\\\" : \\\"text_1\\\",\\n extra: Object.assign({\\n inheritTitle: false,\\n noPic: true\\n }, it.extra)\\n });\\n }\\n return resList;\\n}\\n$.exports.carrySRule = function(rule, s, page, searchMode) {\\n rule = getCompleteRule(rule);\\n let list = rule.find(s, page);\\n if (!list) return [];\\n let resList = [];\\n for (let it of list) {\\n if (it.skip) {\\n resList.push(it);\\n continue;\\n }\\n if (searchMode && !searchContains(it.title, s, true)) continue;\\n if (rule.findAliUrl) {\\n it.url = $(it.url).lazyRule(toRedirectTreating, {\\n findAliUrl: rule.findAliUrl,\\n basicUrl: rule.basicUrl,\\n name: rule.name,\\n author: rule.author,\\n aliUrl: it.url,\\n ruleType: rule.ruleType\\n });\\n } else {\\n it.url = $(\\\"#noLoading#\\\").lazyRule(toRedirect, it.url, it.sharePwd || \\\"\\\");\\n }\\n resList.push({\\n title: it.title,\\n desc: it.desc || \\\"\\\",\\n url: it.url,\\n pic_url: it.pic_url,\\n extra: Object.assign({\\n inheritTitle: false,\\n noPic: true\\n }, it.extra)\\n });\\n }\\n return resList;\\n}\\nlet size = 10;\\n\\nlet rules;\\n\\nfunction getRules(group) {\\n let rulesTmp;\\n if (!rules) {\\n rules = $.require(\\\"configs\\\").getUsefulJson();\\n }\\n if (group) {\\n rulesTmp = rules.filter(v => v.group === group);\\n } else {\\n rulesTmp = rules;\\n }\\n return rulesTmp;\\n}\\n$.exports.getAllData = function(group) {\\n return getRules(group);\\n};\\n$.exports.getData = function(page, rule, group) {\\n if (rule) {\\n if (page != null && page > 1) {\\n return getRules().filter(i => i.name == rule && i.page);\\n }\\n return getRules().filter(i => i.name == rule);\\n }\\n let rulesTmp = getRules(group);\\n let start = (page - 1) * size;\\n if (rulesTmp.length < start + 1) {\\n return [];\\n }\\n let len = size;\\n if (rulesTmp.length < page * size) {\\n len = rulesTmp.length - start;\\n }\\n return rulesTmp.slice(start, start + len);\\n};\\n$.exports.getNames = function(group) {\\n return getRules(group).map(it => [it.name, it.basicUrl]);\\n};\\n\\n$.exports.getGroupNames = function() {\\n return Array.from(new Set(getRules().map(v => v.group))).filter(v => v);\\n};\\n$.exports.findModulo = function(input) {\\n let oriMods = [2, 3];\\n let mods = oriMods.map(v => input % v);\\n let zeroMods = mods.indexOf(0);\\n\\n if (zeroMods > -1) {\\n return oriMods[zeroMods];\\n } else {\\n return oriMods[mods.indexOf(Math.max.apply(null, mods))];\\n }\\n};\"},{\"col_type\":\"movie_3\",\"name\":\"搜索页面\",\"path\":\"sou\",\"rule\":\"js:\\nconst alitest = $.require(\\\"alitest\\\");\\n\\nfunction setClip() {\\n function getCopy() {\\n try {\\n const Context = android.content.Context;\\n const context = getCurrentActivity();\\n // 获取系统剪贴板\\n let clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE);\\n // 返回数据\\n let clipData = clipboard.getPrimaryClip();\\n if (clipData != null && clipData.getItemCount() > 0) {\\n // 从数据集中获取(粘贴)第一条文本数据\\n let text = clipData.getItemAt(0).getText();\\n if (text != null) {\\n return String(text.toString());\\n }\\n }\\n return null;\\n } catch (e) {\\n return null;\\n }\\n }\\n let text = getCopy() || \\\"\\\";\\n let url = alitest.matchAliUrl(text);\\n if (url) {\\n let cache = getItem(\\\"clipboardCache\\\", \\\"\\\");\\n if (url !== cache) {\\n d.push({\\n title: '““””<font color=\\\"#13B61B\\\">▐ </font><b>温馨提示<b>',\\n desc: \\\"检测到剪贴板含有阿里链接是否打开?\\\\n\\\" + url,\\n url: $(\\\"#noLoading#\\\").lazyRule((input, id) => {\\n deleteItem(id + \\\"clipboard\\\");\\n return \\\"hiker://page/aliyun?page=fypage&realurl=\\\" + encodeURIComponent(input) + \\\"&sharePwd=\\\";\\n }, url, id),\\n col_type: \\\"text_1\\\",\\n extra: {\\n id: id + \\\"clipboard\\\",\\n pageTitle: \\\"打开链接\\\"\\n }\\n });\\n setItem(\\\"clipboardCache\\\", url);\\n }\\n }\\n}\\n\\nfunction setPrepose() {\\n if (openMode == \\\"本地解析\\\") {\\n let aliTokensFilepath = $.require(\\\"hiker://page/tokenPath\\\").aliTokensFilepath;\\n let a = fetch(aliTokensFilepath);\\n if (!a || a == \\\"\\\") {\\n d.push({\\n title: '<font color=\\\"#13B61B\\\">▐ </font><b>温馨提示<b>',\\n col_type: \\\"rich_text\\\",\\n });\\n d.push({\\n url: $(\\\"#noLoading#\\\").lazyRule(() => $.require(\\\"loginMode\\\")),\\n col_type: \\\"text_1\\\",\\n title: \\\"未检测到登录信息,点我跳转登录账号页面,登录阿里云盘账号后方可使用本地解析模式\\\",\\n extra: {\\n pageTitle: \\\"登录阿里云盘\\\"\\n }\\n });\\n }\\n }\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"s\\\");\\n }));\\n addListener(\\\"onRefresh\\\", $.toString(() => {\\n if (!getMyVar(\\\"refs\\\", \\\"\\\")) {\\n clearMyVar(\\\"s\\\");\\n }\\n }));\\n}\\n\\nfunction setHead() {\\n d.push({\\n title: \\\"搜索:\\\" + [\\\"默认\\\", \\\"精准\\\"][searchMode],\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n setSearchMode(getSearchMode() ? 0 : 1);\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }),\\n col_type: \\\"icon_3_round_fill\\\",\\n pic_url: \\\"hiker://images/icon_search6\\\"\\n });\\n d.push({\\n title: \\\"我的阿里\\\",\\n url: \\\"hiker://page/myaliyun?page=fypage\\\",\\n col_type: \\\"icon_3_round_fill\\\",\\n pic_url: \\\"hiker://images/icon_cloud6\\\",\\n extra:{\\n isHome:true\\n }\\n });\\n d.push({\\n title: \\\"设置|\\\" + openMode,\\n url: $([\\\"模式:本地解析\\\", \\\"模式:官方APP\\\", \\\"登录阿里账号\\\", \\\"登录信息\\\", \\\"规则管理\\\", \\\"支持作者\\\", \\\"使用代理搜索\\\"], 1, \\\"云简设置\\\").select((ids) => {\\n if (\\\"规则管理\\\" == input) {\\n return \\\"hiker://page/ruleManage#noRecordHistory##noHistory#\\\";\\n }\\n if (\\\"支持作者\\\" == input) {\\n return \\\"hiker://page/Donate.v#noRecordHistory##noHistory#\\\";\\n }\\n if (\\\"登录阿里账号\\\" == input) {\\n return $.require(\\\"loginMode\\\");\\n }\\n if (\\\"使用代理搜索\\\" == input) {\\n let isdDelegate = !!getItem(\\\"isdDelegate\\\", \\\"\\\");\\n return $(\\\"开启后小程序底部搜索框将使用代理搜索\\\\n当前:\\\" + isdDelegate + \\\"\\\\n点击确定即可\\\" + (isdDelegate ? \\\"关闭\\\" : \\\"开启\\\")).confirm((isdDelegate) => {\\n setItem(\\\"isdDelegate\\\", isdDelegate ? \\\"\\\" : \\\"1\\\");\\n return \\\"toast://\\\" + (isdDelegate ? \\\"已关闭\\\" : \\\"已开启\\\");\\n }, isdDelegate);\\n }\\n if (\\\"登录信息\\\" == input) {\\n const {\\n openTokensFilepath,\\n aliTokensFilepath\\n } = $.require(\\\"tokenPath\\\");\\n if (!fileExist(aliTokensFilepath)) return \\\"toast://还未登陆\\\";\\n let ali = request(aliTokensFilepath);\\n try {\\n ali = JSON.parse(ali);\\n } catch (e) {\\n deleteFile(aliTokensFilepath);\\n return \\\"toast://获取失败\\\";\\n }\\n confirm({\\n title: '登录信息',\\n content: \\\"用户:\\\" + (ali.nick_name || ali.user_name || \\\"Token登录\\\") + \\\"\\\\nToken:\\\" + ali.refresh_token + \\\"\\\\n(取消:注销登录;确定:复制Token)\\\",\\n confirm: $.toString((token) => {\\n return \\\"copy://\\\" + token;\\n }, ali.refresh_token),\\n cancel: $.toString((path1, path2) => {\\n return $(\\\"确认注销登录\\\").confirm((path1, path2) => {\\n deleteFile(path1);\\n deleteFile(path2);\\n refreshPage();\\n return \\\"toast://已成功退出登陆\\\";\\n }, path1, path2);\\n }, aliTokensFilepath, openTokensFilepath)\\n });\\n return;\\n }\\n input = input.replace(\\\"模式:\\\", \\\"\\\");\\n setItem(\\\"openMode\\\", input);\\n updateItem(ids, {\\n title: \\\"设置|\\\" + input\\n });\\n if (input == \\\"官方APP\\\") {\\n return \\\"toast://修改成功,请确保手机有安装阿里云盘等官方APP\\\";\\n }\\n }, id + \\\"mode\\\"),\\n col_type: \\\"icon_3_round_fill\\\",\\n pic_url: \\\"hiker://images/icon_menu6\\\",\\n extra: {\\n id: id + \\\"mode\\\"\\n }\\n });\\n\\n d.push({\\n title: '搜索',\\n desc: '请输入关键词/链接',\\n col_type: 'input',\\n url: $.toString(() => {\\n input = input.trim();\\n if ($.require(\\\"alitest\\\").test(input)) {\\n clearMyVar(\\\"s\\\");\\n return \\\"hiker://page/aliyun?page=fypage&realurl=\\\" + encodeURIComponent(input) + \\\"&sharePwd=\\\";\\n }\\n putMyVar(\\\"s\\\", input);\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n extra: {\\n onChange: \\\"putMyVar('refs',input)\\\",\\n id: id + \\\"ss\\\",\\n defaultValue: s,\\n pageTitle: \\\"打开链接\\\"\\n }\\n });\\n}\\n\\nfunction setRuleItem() {\\n let rules = $.require(\\\"data\\\").getNames(ruleGroup);\\n d.push({\\n title: \\\"🌟\\\",\\n url: \\\"hiker://collection?rule=\\\" + MY_RULE.title,\\n col_type: \\\"scroll_button\\\",\\n }, {\\n title: \\\"📌\\\" + ruleGroup,\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n let group = $.require(\\\"data\\\").getGroupNames();\\n let ruleGroup = getItem(\\\"ruleGroup\\\", \\\"\\\");\\n let index = group.indexOf(ruleGroup)+1;\\n group.unshift(\\\"💡全部💡\\\");\\n let selectNum = $.require(\\\"data\\\").findModulo(group.length);\\n return $(group, selectNum, \\\"请选择分组\\\", index).select(() => {\\n if (!MY_INDEX) {\\n setItem(\\\"ruleGroup\\\", \\\"\\\");\\n } else {\\n setItem(\\\"ruleGroup\\\", input);\\n }\\n clearItem(\\\"rule\\\");\\n refreshPage();\\n });\\n }),\\n col_type: \\\"scroll_button\\\"\\n }, {\\n title: \\\"\\\" == r ? \\\"““全部””\\\" : \\\"全部\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((s, id) => {\\n let qr = getItem(\\\"rule\\\", \\\"\\\");\\n clearItem(\\\"rule\\\");\\n if (s) {\\n refreshPage();\\n } else {\\n updateItem(\\\"全部\\\" + id, {\\n title: \\\"““全部””\\\"\\n });\\n if (qr) {\\n updateItem(id + qr, {\\n title: qr\\n });\\n }\\n }\\n return \\\"hiker://empty\\\";\\n }, s, id),\\n col_type: \\\"scroll_button\\\",\\n extra: {\\n id: \\\"全部\\\" + id\\n }\\n });\\n for (let [it, basicUrl] of rules) {\\n d.push({\\n title: it == r ? \\\"““\\\" + it + \\\"””\\\" : it,\\n url: $((getHome(basicUrl) || \\\"\\\") + \\\"#noLoading#\\\").lazyRule((r, s, id) => {\\n let qr = getItem(\\\"rule\\\", \\\"\\\");\\n setItem(\\\"rule\\\", r);\\n if (s) {\\n refreshPage();\\n } else {\\n updateItem(qr ? (id + qr) : (\\\"全部\\\" + id), {\\n title: qr || \\\"全部\\\"\\n });\\n updateItem(id + r, {\\n title: \\\"““\\\" + r + \\\"””\\\"\\n });\\n }\\n return \\\"hiker://empty\\\";\\n }, it, s, id),\\n col_type: \\\"scroll_button\\\",\\n extra: {\\n id: id + it\\n }\\n });\\n }\\n\\n}\\n\\nfunction record() {\\n let history = storage0.getItem(\\\"searchHistory\\\", []);\\n let ii = history.indexOf(s);\\n if (ii > -1) {\\n history.splice(ii, 1);\\n }\\n if (history.length > 20) {\\n history.splice(history.length - 1, 1);\\n }\\n history.unshift(s);\\n storage0.setItem(\\\"searchHistory\\\", history);\\n}\\n\\nfunction searchEnd() {\\n let p = MY_PAGE;\\n let data = $.require(\\\"data\\\").getData(p, r, ruleGroup);\\n let pageid = id + \\\"ypj-page\\\" + p;\\n if (data.length > 0) {\\n d.push({\\n title: \\\"加载第\\\" + p + \\\"页中,进度:1/\\\" + data.length,\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n id: pageid\\n }\\n });\\n }\\n setResult(d);\\n if (data.length > 0) {\\n //多线程加载 \\n let realPage = \\\"\\\" == r ? 1 : p;\\n let tasks = data.map(it => {\\n return {\\n func: function(rule) {\\n try {\\n return $.require(\\\"data\\\").carryRule(rule, s, realPage, searchMode);\\n } catch (e) {\\n log(rule.name + \\\":\\\" + e.toString());\\n /*if(data.length===1&&p===1){\\n return [{\\n title:\\\"““\\\"+rule.name+\\\" ERROR””\\\",\\n desc: e.toString(),\\n col_type:\\\"text_center_1\\\",\\n url:\\\"hiker://empty\\\",\\n extra:{\\n lineVisible: false\\n }\\n }];\\n }*/\\n }\\n //return rule.find(s, realPage);\\n },\\n param: it,\\n id: \\\"rule@\\\" + it.name\\n }\\n });\\n\\n batchExecute(tasks, {\\n func: function(param, id, error, result) {\\n param.i += 1;\\n if (Array.isArray(result)) {\\n deleteItem(\\\"_nothave\\\");\\n addItemBefore(pageid, result);\\n }\\n if (param.i === param.all) {\\n if (!result || !result.length) {\\n deleteItem(\\\"_nothave\\\");\\n addItemBefore(pageid, {\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n title: \\\"““””\\\" + \\\"~~~什么资源都没有哦~~~\\\".fontcolor(\\\"Gray\\\"),\\n extra: {\\n lineVisible: false,\\n id: \\\"_nothave\\\"\\n }\\n });\\n }\\n deleteItem(pageid);\\n } else {\\n updateItem(pageid, {\\n title: \\\"加载第\\\" + MY_PAGE + \\\"页中,进度:\\\" + (param.i + 1) + \\\"/\\\" + param.all,\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\"\\n });\\n }\\n },\\n param: {\\n all: data.length,\\n i: 0,\\n }\\n })\\n }\\n}\\n\\nfunction setHistory() {\\n d.push({\\n title: '<span style=\\\"color:#ff6601\\\"><b>历史记录</b></span>',\\n pic_url: \\\"hiker://images/icon_clock\\\",\\n col_type: \\\"avatar\\\",\\n url: $([\\\"清除搜索记录\\\", \\\"打开观看记录\\\"]).select((id) => {\\n if (input === \\\"清除搜索记录\\\") {\\n return $(\\\"确定清除全部搜索记录?\\\").confirm((id) => {\\n clearItem(\\\"searchHistory\\\");\\n deleteItemByCls(id + \\\":key\\\");\\n addItemAfter(id + \\\":searchHistory\\\", {\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n title: \\\"““””\\\" + \\\"~~~什么都没有哦~~~\\\".fontcolor(\\\"Gray\\\"),\\n extra: {\\n cls: id + \\\":key\\\",\\n lineVisible: false\\n }\\n });\\n }, id);\\n } else {\\n return \\\"hiker://history?rule=\\\" + MY_RULE.title;\\n }\\n }, id),\\n extra: {\\n id: id + \\\":searchHistory\\\",\\n }\\n });\\n\\n let history = storage0.getItem(\\\"searchHistory\\\", []);\\n let i = 0;\\n for (let key of history) {\\n d.push({\\n title: key,\\n url: $(\\\"#noLoading#\\\").lazyRule((id, key) => {\\n let extra = findItem(id + \\\"ss\\\").extra;\\n extra.defaultValue = key;\\n updateItem({\\n extra: extra\\n });\\n return \\\"hiker://empty\\\";\\n }, id, key),\\n col_type: \\\"flex_button\\\",\\n extra: {\\n id: id + \\\":key:\\\" + key,\\n cls: id + \\\":key\\\",\\n longClick: [{\\n title: \\\"删除关键词:\\\" + key,\\n js: $.toString((id, key, i) => {\\n let history = storage0.getItem(\\\"searchHistory\\\", []);\\n history.splice(i, 1);\\n storage0.setItem(\\\"searchHistory\\\", history);\\n deleteItem(id + \\\":key:\\\" + key);\\n //toast();\\n }, id, key, i)\\n }]\\n }\\n });\\n i++;\\n }\\n if (history.length === 0) {\\n d.push({\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n title: \\\"““””\\\" + \\\"~~~什么都没有哦~~~\\\".fontcolor(\\\"Gray\\\"),\\n extra: {\\n cls: id + \\\":key\\\",\\n lineVisible: false\\n }\\n });\\n }\\n}\\n\\nfunction setTrendingTabEnd() {\\n let hotClass = {\\n \\\"百度\\\": {\\n \\\"电视剧\\\": \\\"teleplay\\\",\\n \\\"电影\\\": \\\"movie\\\"\\n },\\n \\\"夸克\\\": {\\n \\\"电视剧\\\": \\\"电视剧\\\",\\n \\\"电影\\\": \\\"电影\\\",\\n \\\"动漫\\\": \\\"动漫\\\",\\n \\\"综艺\\\": \\\"综艺\\\"\\n }\\n };\\n let dataSource = Object.keys(hotClass);\\n let selectsource = getItem(\\\"dataSource\\\", dataSource[0]);\\n let hotkeys = Object.keys(hotClass[selectsource]);\\n let selectkey = getItem(\\\"hotkey\\\", hotkeys[0]);\\n let tabkey = hotClass[selectsource][selectkey];\\n\\n d.push({\\n title: '<span style=\\\"color:#ff6601\\\"><b>' + selectsource + selectkey + '热搜</b></span>',\\n url: $(hotkeys, 1, \\\"切换热搜\\\").select(() => {\\n setItem(\\\"hotkey\\\", input);\\n refreshPage(false);\\n return \\\"toast://已切换为\\\" + input;\\n }),\\n col_type: \\\"avatar\\\",\\n pic_url: \\\"hiker://images/icon_fire\\\",\\n extra: {\\n longClick: [{\\n title: \\\"切换数据源\\\",\\n js: $.toString((dataSource) => {\\n return $(dataSource, 1, \\\"切换数据源\\\").select(() => {\\n setItem(\\\"dataSource\\\", input);\\n clearItem(\\\"hotkey\\\");\\n refreshPage(false);\\n return \\\"toast://已切换为\\\" + input;\\n });\\n }, dataSource)\\n }]\\n }\\n });\\n d.push({\\n title: \\\"正在加载...\\\",\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n id: id + \\\":hotkey\\\",\\n lineVisible: false\\n }\\n });\\n setResult(d);\\n let sd = [];\\n let setSearchKey = name => {\\n putMyVar('s', name);\\n refreshPage();\\n return 'hiker://empty'\\n };\\n\\n let getTitle = (i, name) => {\\n let color;\\n switch (i) {\\n case 0:\\n color = \\\"#ff3300\\\";\\n break;\\n case 1:\\n color = \\\"#ff6600\\\";\\n break;\\n case 2:\\n color = \\\"#ff9900\\\"\\n break;\\n default:\\n color = \\\"black\\\";\\n }\\n return \\\"““””\\\" + String(i + 1).fontcolor(color) + \\\"\\\\t\\\\t\\\\t\\\" + name;\\n }\\n try {\\n switch (selectsource) {\\n case \\\"百度\\\":\\n var json = request('https://top.baidu.com/api/board?platform=wise&tab=' + tabkey + '&tag=%7B%22category%22:%22%E5%85%A8%E9%83%A8%E7%B1%BB%E5%9E%8B%22%7D', {\\n headers: {\\n 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36',\\n 'Host': 'top.baidu.com',\\n 'Accept': 'application/json, text/plain, */*',\\n 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\\n 'Accept-Encoding': 'gzip, deflate, br',\\n 'Referer': 'https://top.baidu.com/board?tab=novel',\\n }\\n });\\n //var s = Date.now();\\n var list = JSON.parse(json).data.cards[0].content;\\n for (let i = 0; i < list.length; i++) {\\n let item = list[i];\\n let name = item.word + ' (' + item.show[2] + ')';\\n let des = item.desc;\\n sd.push({\\n title: getTitle(i, name),\\n url: $('#noLoading#').lazyRule(setSearchKey, item.word),\\n desc: des,\\n img: item.img,\\n col_type: \\\"movie_1_vertical_pic\\\"\\n });\\n }\\n break;\\n case \\\"夸克\\\":\\n var json = request(\\\"https://news.myquark.cn/v2/toplist/movie?&channel=\\\" + tabkey + \\\"&rank_type=%E6%9C%80%E7%83%AD\\\");\\n var xmlData = (JSON.parse(json).data || \\\"\\\").replace(/title>/g, \\\"h_title>\\\").replace(/src>/g, \\\"h_src>\\\").replace(/area>/g, \\\"h_area\\\");\\n var list = pdfa(xmlData, \\\"body&&item\\\");\\n var getText = t => t;\\n var trend = [\\\"ㄧ\\\", \\\"↑\\\", \\\"↓\\\"];\\n //var s = Date.now();\\n for (let i = 0; i < list.length; i++) {\\n let item = list[i];\\n let name = pdfh(item, \\\"h_title&&Text\\\");\\n let des = \\\"热度:\\\" + pdfh(item, \\\"hot_score&&Text\\\") + \\\" \\\" + trend.at(pdfh(item, \\\"hot_trend&&Text\\\")) +\\n \\\"\\\\n评分:\\\" + pdfh(item, \\\"score_avg&&Text\\\").replace(/^0$/, \\\"暂无评分\\\") +\\n \\\"\\\\n\\\" + pdfh(item, \\\"year&&Text\\\") + \\\"·\\\" + pdfh(item, \\\"h_area&&Text\\\") + \\\"·\\\" + pdfh(item, \\\"category&&Text\\\").replace(\\\",\\\", \\\"·\\\");\\n sd.push({\\n title: getTitle(i, name),\\n url: $('#noLoading#').lazyRule(setSearchKey, name),\\n desc: des,\\n img: pdfh(item, \\\"h_src&&Text\\\"),\\n col_type: \\\"movie_1_vertical_pic\\\"\\n });\\n }\\n break;\\n }\\n addItemAfter(id + \\\":hotkey\\\", sd);\\n } catch (e) {\\n log(e.toString());\\n } finally {\\n deleteItem(id + \\\":hotkey\\\");\\n }\\n}\\nlet r = getItem(\\\"rule\\\", \\\"\\\");\\nlet hideSetting = MY_PARAMS.hideSetting || getParam(\\\"hideSetting\\\", \\\"\\\") === \\\"true\\\";\\nlet s = getMyVar('s', '') || MY_PARAMS.searchTerms || decodeURIComponent(getParam(\\\"searchTerms\\\", \\\"\\\"));\\nlet searchMode = getSearchMode();\\nlet openMode = getItem(\\\"openMode\\\", \\\"本地解析\\\");\\nlet id = Date.now() + MY_RULE.title;\\nlet ruleGroup = getItem(\\\"ruleGroup\\\", \\\"\\\");\\nlet d = [];\\nif (MY_PAGE === 1) {\\n setPrepose();\\n if (!hideSetting) {\\n setClip();\\n setHead();\\n }\\n setRuleItem();\\n if (!s) {\\n setHistory();\\n }\\n}\\nif (s) {\\n record();\\n searchEnd();\\n} else if (MY_PAGE === 1) {\\n setTrendingTabEnd();\\n} else {\\n setResult([]);\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"网页浏览\",\"path\":\"ysfx\",\"rule\":\"js:\\nvar d = [];\\n\\nlet openMode = getItem(\\\"openMode\\\");\\nlet rule = MY_RULE.title;\\nlet url = decodeURIComponent(getParam(\\\"webUrl\\\",\\\"\\\"));\\n\\nfunction intercept(rule, origin, openMode) {\\n let host = origin.replace(new RegExp(\\\"http://|https://\\\"), \\\"\\\").split(\\\"/\\\")[0];\\n let hosts = host.split(\\\".\\\");\\n if (hosts.length > 2) {\\n host = hosts[hosts.length - 2] + \\\".\\\" + hosts[hosts.length - 1];\\n }\\n if (input.startsWith(\\\"magnet\\\")) {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"检测到新的磁链地址,点击确定按钮即可播放,点击取消按钮可以复制链接\\\",\\n confirm: $.toString((mag) => {\\n return mag;\\n }, input),\\n cancel: $.toString((mag) => {\\n return \\\"copy://\\\" + mag\\n }, input)\\n });\\n return true;\\n } else if ($.require(\\\"alitest?rule=\\\"+rule).test(input) && openMode != \\\"官方APP\\\") {\\n log(input);\\n if (input.includes('checkurl?url=') && input.includes('&urlrefer')) {\\n input = decodeURIComponent(input.split('&urlrefer')[0].split('checkurl?url=')[1]);\\n //log('贴吧'+input);\\n }\\n return $.toString((url, rule) => {\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"阿里云盘\\\",\\n url: \\\"hiker://page/aliyun?page=fypage&realurl=\\\" + encodeURIComponent(url) + \\\"&rule=\\\" + rule,\\n }))\\n }, input, rule);\\n } else if(input.includes(\\\"quark.cn/s/\\\")&&fetch(\\\"hiker://home@Quark.简\\\") != \\\"null\\\"){\\n return $.toString((url) => {\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"夸克网盘\\\",\\n url: \\\"hiker://page/quarkList?rule=Quark.简&realurl=\\\" + encodeURIComponent(url) + \\\"&sharePwd=\\\",\\n }))\\n },input);\\n } else if (/\\\\.(mp3|flac|m4a)$/.test(input)) {\\n log(input);\\n return $.toString((url, rule) => {\\n fy_bridge_app.playVideo(url);\\n }, input, rule);\\n } else if (!input.includes(host) && input.startsWith(\\\"http\\\")) {\\n log(input);\\n return $.toString((url, rule) => {\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"详情\\\",\\n url: \\\"hiker://page/ysfx?webUrl=\\\"+encodeURIComponent(url)+\\\"&rule=\\\"+rule,\\n }))\\n }, input, rule);\\n } else if (!input.startsWith(\\\"http\\\")) {\\n log(input);\\n //能唤起APP的白名单\\n let white = [\\n \\\"qklink\\\",\\n \\\"bdnetdisk\\\",\\n \\\"xunleiapp\\\",\\n \\\"smartdrive\\\"\\n ];\\n let inWhite = white.filter(it => input.startsWith(it)).length > 0;\\n if (!inWhite) {\\n return false;\\n }\\n return $.toString((url, rule) => {\\n fy_bridge_app.openThirdApp && fy_bridge_app.openThirdApp(url);\\n }, input, rule);\\n }\\n}\\n\\nfunction loadJs() {\\n try {\\n if (document.title && document.title.length) {\\n let r = $$$().lazyRule((t) => {\\n setPageTitle(t);\\n }, document.title);\\n fy_bridge_app.parseLazyRule(r);\\n }\\n } catch (e) {\\n fy_bridge_app.log(e.toString());\\n }\\n}\\n\\nd.push({\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"100%&&float\\\",\\n extra: {\\n urlInterceptor: $.toString(intercept, rule, getHome(url), openMode),\\n js: $.toString(loadJs),\\n canBack: true,\\n jsLoadingInject: true,\\n floatVideo: true\\n }\\n});\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"阿里Lazy\",\"path\":\"alilazy\",\"rule\":\"const AliAccessApi = $.require(\\\"aliPlayApi\\\");\\nconst {\\n openTokensFilepath,\\n aliTokensFilepath\\n} = $.require(\\\"tokenPath\\\");\\n\\nfunction aliM3u8Proxy(fileId, shareId, sharePwd, shareToken, aliToken, title) {\\n let suffix = MY_PARAMS.mode ? \\\"media.m3u8\\\" : \\\"ref_task.m3u8\\\";\\n let urlname = MY_PARAMS.mode ? \\\"url\\\" : \\\"preview_url\\\";\\n let cacheFilePath = \\\"hiker://files/_cache/\\\" + fileId + MY_PARAMS.timestamp[0]+ \\\".m3u8\\\"\\n //过期获取播放原始链接\\n function getAliPlayUrl(fileId, line) {\\n let aliurl;\\n try {\\n const AliAccessApi = $.require(\\\"hiker://page/aliPlayApi?rule=\\\" + title);\\n let aliAccessApi = AliAccessApi.createDefault(shareId, sharePwd, shareToken, aliToken, null, title);\\n let playUrlList = (MY_PARAMS.mode ? aliAccessApi.getAllVideoTemPlayUrl(fileId, true).preview : aliAccessApi.getShareVideoPreview(fileId)) || [];\\n\\n aliurl = playUrlList.find(v => v.template_id == line)[urlname];\\n } catch (e) {\\n log(e.toString());\\n throw e;\\n }\\n return aliurl;\\n }\\n\\n function getM3u8Content(playurl) {\\n //media.m3u8\\n let home = playurl.split(suffix)[0];\\n let f = fetch(playurl, {\\n headers: {\\n \\\"User-Agent\\\": PC_UA,\\n \\\"Referer\\\": \\\"https://www.aliyundrive.com/\\\"\\n },\\n timeout: 3000\\n }).split(\\\"\\\\n\\\");\\n let ff = f.map(it => {\\n if (it.startsWith(\\\"media-\\\")) {\\n return \\\"/proxy?url=\\\" + base64Encode(home + it)+\\\"&timestamp=\\\"+MY_PARAMS.timestamp[0];\\n }\\n return it;\\n }).join(\\\"\\\\n\\\");\\n\\n writeFile(cacheFilePath, ff);\\n return ff;\\n }\\n\\n function updateTsUrl(url) {\\n let fid = url.split('&f=')[1].split('&')[0];\\n //log('sfid-' + fid);\\n let f = fetch(cacheFilePath).split(\\\"\\\\n\\\");\\n f.forEach(it => {\\n if (it && it.startsWith('/proxy?url=')) {\\n let furl = base64Decode(it.replace('/proxy?url=', '').split(\\\"&\\\")[0]);\\n if (url.substr(url.indexOf('/media-'), url.indexOf('.ts')) == furl.substr(furl.indexOf('/media-'), furl.indexOf('.ts'))) {\\n url = furl;\\n }\\n }\\n })\\n let expires = url.split('x-oss-expires=')[1].split('&')[0];\\n const lasttime = parseInt(expires) - Date.now() / 1000;\\n if (lasttime < 60) {\\n //log('过期更新')\\n let line = url.split('/media')[0]; //取之前播放的ts段线路\\n line = line.substring(line.lastIndexOf('/') + 1);\\n let f = getM3u8Content(getAliPlayUrl(fid, line)).split(\\\"\\\\n\\\");\\n f.forEach(it => {\\n if (it && it.startsWith('/proxy?url=')) {\\n let furl = base64Decode(it.replace('/proxy?url=', ''));\\n if (url.substr(url.indexOf('/media-'), url.indexOf('.ts')) == furl.substr(furl.indexOf('/media-'), furl.indexOf('.ts'))) {\\n url = furl;\\n }\\n }\\n })\\n\\n }\\n return url;\\n }\\n try {\\n let url = base64Decode(MY_PARAMS.url[0]);\\n if (url.includes(\\\".ts\\\")) {\\n return JSON.stringify({\\n statusCode: 302,\\n headers: {\\n \\\"Location\\\": updateTsUrl(url),\\n \\\"User-Agent\\\": PC_UA,\\n \\\"Referer\\\": \\\"https://www.aliyundrive.com/\\\"\\n }\\n });\\n } else {\\n let templateId = MY_PARAMS.templateId[0];\\n if(fileExist(cacheFilePath)){\\n return getM3u8Content(getAliPlayUrl(fileId, templateId));\\n }else{\\n return getM3u8Content(url);\\n }\\n }\\n } catch (e) {\\n log(\\\"#代理播放失败#\\\\n错误信息>\\\" + e.toString() + \\\"\\\\n错误行>\\\" + e.lineNumber);\\n }\\n}\\nconst transcoding = {\\n UHD: \\\"4K 超清\\\",\\n QHD: \\\"2K 超清\\\",\\n FHD: \\\"1080 全高清\\\",\\n HD: \\\"720 高清\\\",\\n SD: \\\"540 标清\\\",\\n LD: \\\"360 流畅\\\"\\n};\\n\\nfunction getVideo(aliAccessApi, fileId) {\\n\\n let playUrlList = aliAccessApi.getShareVideoPreview(fileId) || [];\\n\\n let serverAddress = startProxyServer($.toString(aliM3u8Proxy, fileId, aliAccessApi.shareId, aliAccessApi.sharePwd, aliAccessApi.shareToken, aliAccessApi.aliToken, MY_RULE.title));\\n\\n if (playUrlList.length > 0) {\\n let urls = [],\\n names = [];\\n playUrlList.forEach((item) => {\\n urls.push(serverAddress + \\\"?url=\\\" + base64Encode(item.preview_url) + \\\"&timestamp=\\\"+Date.now()+\\\"&templateId=\\\" + item.template_id + \\\"#.m3u8\\\");\\n names.push(transcoding[item.template_id] ? transcoding[item.template_id] : item.template_height);\\n });\\n let heads = new Array(playUrlList.length).fill({\\n 'Referer': 'https://www.aliyundrive.com/'\\n });\\n return {\\n urls: urls,\\n names: names,\\n headers: heads,\\n };\\n } else {\\n return {};\\n }\\n\\n}\\n\\nfunction getSourceTransfer(aliAccessApi, fileId) {\\n let playUrlInfo = aliAccessApi.getAllVideoTemPlayUrl(fileId);\\n let playUrlList = playUrlInfo.preview;\\n\\n let serverAddress = startProxyServer($.toString(aliM3u8Proxy, fileId, aliAccessApi.shareId, aliAccessApi.sharePwd, aliAccessApi.shareToken, aliAccessApi.aliToken, MY_RULE.title));\\n if (playUrlList.length > 0) {\\n let urls = [],\\n names = [];\\n playUrlList.forEach((item) => {\\n urls.push(serverAddress + \\\"?url=\\\" + base64Encode(item.url) + \\\"&mode=1&timestamp=\\\"+Date.now()+\\\"&templateId=\\\" + item.template_id + \\\"#.m3u8\\\");\\n names.push(transcoding[item.template_id] ? transcoding[item.template_id] : item.template_height);\\n });\\n urls.push(playUrlInfo.origin);\\n names.push(\\\"原画\\\");\\n let heads = new Array(playUrlList.length).fill({\\n 'Referer': 'https://www.aliyundrive.com/'\\n });\\n return {\\n urls: urls,\\n names: names,\\n headers: heads,\\n };\\n } else {\\n return {};\\n }\\n}\\n\\nfunction getPlayFormat(playUrl, title) {\\n return {\\n names: [title],\\n urls: [playUrl + \\\"#isVideo=true##ignoreMusic=true#\\\"],\\n headers: [{\\n 'Referer': 'https://www.aliyundrive.com/',\\n \\\"User-Agent\\\": \\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\\\"\\n }]\\n };\\n}\\n\\n\\n$.exports = function(shareId, sharePwd, shareToken, fileId, cate, zimu) {\\n if (!fileExist(aliTokensFilepath)) {\\n toast(\\\"请先登陆登录账号\\\");\\n return \\\"hiker://page/login#noRecordHistory##noHistory#?noRefresh=1\\\";\\n }\\n let aliToken = $.require(aliTokensFilepath);\\n if (cate === \\\"video\\\") {\\n let playList = [];\\n let aliAccessApi;\\n let playMode = getItem(\\\"aliyun_playMode\\\", \\\"转码\\\");\\n try {\\n aliAccessApi = AliAccessApi.createDefault(shareId, sharePwd, shareToken, aliToken);\\n if (playMode === \\\"转码\\\") {\\n playList = getVideo(aliAccessApi, fileId) || {};\\n } else if (playMode === \\\"原画\\\") {\\n playList = getPlayFormat(aliAccessApi.getVideoTemPlayUrl(fileId), playMode);\\n } else if (playMode === \\\"极速原画\\\") {\\n playList = getPlayFormat(aliAccessApi.getFileToDownUrl(fileId) + \\\"#fastPlayMode##threads=\\\" + getItem(\\\"speedThread\\\", \\\"20\\\") + \\\"#\\\", playMode);\\n } else if (playMode === \\\"原转\\\") {\\n playList = getSourceTransfer(aliAccessApi, fileId);\\n }\\n } catch (e) {\\n log(\\\"#\\\" + playMode + \\\"播放失败#\\\\n错误信息>\\\" + e.toString() + \\\"\\\\n错误行>\\\" + e.lineNumber);\\n if (e.code === \\\"InvalidParameter.RefreshToken\\\") {\\n toast(\\\"登陆过期,请重新登陆\\\");\\n return \\\"hiker://page/login#noRecordHistory##noHistory#?noRefresh=1\\\";\\n } else if (e.code === \\\"QuotaExhausted.Drive\\\") {\\n return \\\"toast://网盘空间不足,无法播放请清理。\\\";\\n }\\n return \\\"toast://播放失败,错误信息已打印。\\\\n请查看日志(LOG)\\\";\\n }\\n let mountsub = storage0.getMyVar('mountzimu', {});\\n if (Object.keys(mountsub).length > 0) {\\n zimu = mountsub;\\n }\\n let subtitle;\\n if (Object.keys(zimu || {}).length > 0 && playList && playList.urls && playList.urls.length > 0) {\\n java.lang.Thread.sleep(100);\\n try {\\n var zmurl = aliAccessApi.getVideoTemPlayUrl(zimu.file_id);\\n let path = 'hiker://files/cache/云盘君/sub.' + zimu.ext;\\n downloadFile(zmurl, path, {\\n 'Referer': 'https://www.aliyundrive.com/'\\n });\\n subtitle = getPath(path);\\n } catch (e) {\\n toast(\\\"字幕加载失败\\\");\\n log(e.message);\\n }\\n }\\n let dmlist = storage0.getMyVar(\\\"dmlist\\\", []);\\n let dmlist_cache = getMyVar(\\\"dmlist_cache\\\", \\\"\\\");\\n if (dmlist_cache && dmlist_cache.startsWith(fileId + \\\"#\\\")) {\\n playList.danmu = dmlist_cache.replace(fileId + \\\"#\\\", \\\"\\\");\\n } else if (dmlist.length > 0) {\\n playList.danmu = \\\"hiker://files/cache/danmu/\\\" + dmlist.splice(0, 1)[0];\\n putMyVar(\\\"dmlist_cache\\\", fileId + \\\"#\\\" + playList.danmu);\\n storage0.putMyVar(\\\"dmlist\\\", dmlist);\\n if (dmlist.length === 0) {\\n toast(\\\"弹幕列表已全部挂载\\\");\\n }\\n } else {\\n playList.danmu = getVar(\\\"dm_share\\\", \\\"\\\");\\n }\\n playList.subtitle = subtitle;\\n return JSON.stringify(playList);\\n }\\n\\n let aliAccessApi = AliAccessApi.createDefault(shareId, sharePwd, shareToken, aliToken, null);\\n let url = aliAccessApi.getVideoTemPlayUrl(fileId);\\n\\n if (cate === \\\"image\\\") {\\n return url + \\\"#.jpg\\\";\\n } else if (cate === \\\"audio\\\") {\\n return url + \\\"#isMusic=true#\\\";\\n } else {\\n return \\\"download://\\\" + url;\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"阿里列表\",\"path\":\"aliyun\",\"rule\":\"js:\\n//@author LoyDgIk\\nconst AliShareApi = $.require(\\\"AliApi\\\");\\n\\n\\nlet openAPIList = [\\\"alist\\\", \\\"drive\\\", \\\"tvbox\\\", \\\"XBY\\\"];\\n\\nlet realurl = decodeURIComponent(getParam(\\\"realurl\\\", \\\"\\\")).split(\\\"?\\\")[0];\\nlet urlData = realurl.split(\\\"/\\\");\\n//https://www.aliyundrive.com/s/{shareId}/folder/{fileId}?;\\n\\nlet shareId = MY_PARAMS.shareId || urlData[4];\\nlet sharePwd = getParam(\\\"sharePwd\\\", MY_PARAMS.sharePwd || \\\"\\\");\\nlet shareToken = getParam(\\\"shareToken\\\", MY_PARAMS.shareToken);\\n\\nlet fileId = (urlData[5] === \\\"folder\\\" ? urlData[6] : void 0) || MY_PARAMS.fileId;\\nlet searchKey = decodeURIComponent(getParam(\\\"searchKey\\\", \\\"\\\")) || undefined;\\nlet isSearch = !!searchKey;\\n\\nlet pageId = String(Date.now()).slice(6);\\n\\nlet skipFile = isSearch && getItem(\\\"skipFile\\\", \\\"0\\\") === \\\"1\\\";\\n\\nfunction formatDate(_date, fmt) {\\n let date = !isNaN(_date) ? new Date(_date * 1000) : new Date(_date);\\n return $.dateFormat(date, fmt || \\\"yyyy-MM-dd HH:mm:ss\\\")\\n}\\n\\nfunction formatSize(size) {\\n if (!size) {\\n return '';\\n }\\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\\n let i = 0;\\n while (size >= 1024) {\\n size /= 1024;\\n i++;\\n }\\n size = i ? Number(size.toFixed(2)) : size;\\n return `${size} ${units[i]}`;\\n}\\n\\nfunction setMyPaCache(key, value) {\\n MY_PARAMS[key] = value;\\n}\\n\\nfunction saveMyPaCache() {\\n setPageParams(MY_PARAMS);\\n}\\n\\nfunction setMarker(marker) {\\n setMyPaCache(\\\"marker\\\", marker);\\n}\\n\\nfunction setToken(shareToken) {\\n setMyPaCache(\\\"shareToken\\\", shareToken);\\n}\\nif (MY_PARAMS.noPic) {\\n setPagePicUrl();\\n setMyPaCache(\\\"noPic\\\", false);\\n}\\n/*\\nfunction setVideoItemCache(videoItemCache) {\\n setMyPaCache(\\\"videoItemCache\\\", videoItemCache);\\n}\\n\\nfunction setSubtitleCache(subtitleCache) {\\n setMyPaCache(\\\"subtitleCache\\\", subtitleCache);\\n}*/\\n\\nlet iconType = \\\"ai|apk|avi|css|dmg|exe|flv|gif|hiker|html|iso|jpg|js|json|log|mov|mp3|mp4|otf|php|png|ppt|psd|table|txt|wav|xls|zip|css|doc|epub|exc|htm|xlsx\\\".split('|');\\n\\nfunction getIcon(ext, type) {\\n let root = \\\"https://gitcode.net/qq_32394351/dr/-/raw/master/img/文件类型2/\\\";\\n if (type === \\\"folder\\\") {\\n return root + \\\"文件夹.svg\\\";\\n }\\n if (iconType.includes((ext || \\\"\\\").toLowerCase())) {\\n return root + ext + \\\".svg\\\";\\n }\\n return root + \\\"文件.svg\\\";\\n\\n}\\n\\nfunction load(items) {\\n let aliShareApi = new AliShareApi(shareId, sharePwd, shareToken, (shareToken) => {\\n setToken(shareToken);\\n MY_PARAMS.shareToken = shareToken;\\n });\\n let orders = {\\n \\\"名称正序\\\": \\\"name#ASC\\\",\\n \\\"名称倒序\\\": \\\"name#DESC\\\",\\n \\\"时间正序\\\": \\\"updated_at#ASC\\\",\\n \\\"时间倒序\\\": \\\"updated_at#DESC\\\",\\n \\\"大小正序\\\": \\\"size#ASC\\\",\\n \\\"大小倒序\\\": \\\"size#DESC\\\"\\n };\\n let playMode = getItem(\\\"aliyun_playMode\\\", \\\"转码\\\");\\n let ordersKeys = Object.keys(orders);\\n let orderName = getItem(\\\"aliyun_order\\\", ordersKeys[0]);\\n let order = orders[orderName].split(\\\"#\\\");\\n let styles = [\\\"text_1\\\", \\\"movie_2\\\", \\\"card_pic_3\\\", \\\"avatar\\\", \\\"追剧\\\", \\\"看图\\\"];\\n let style = getItem(\\\"aliyun_style\\\", styles[0]);\\n if (MY_PAGE === 1) {\\n if (!getMyVar(\\\"mountzimu\\\", \\\"\\\")) {\\n storage0.putMyVar(\\\"mountzimu\\\", {});\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"mountzimu\\\");\\n clearMyVar(\\\"aliShareToken\\\");\\n clearVar(\\\"dm_share\\\");\\n clearMyVar(\\\"dmlist\\\");\\n clearMyVar(\\\"listSearchKey\\\");\\n clearMyVar(\\\"dm_listUrlList\\\");\\n }));\\n }\\n setMarker();\\n if (realurl && !isSearch) {\\n let shareInfo = aliShareApi.getShareInfo();\\n let fileInfo = shareInfo.file_infos || [];\\n if (fileInfo.length === 1 && fileInfo[0].type === \\\"folder\\\" && !fileId) {\\n fileId = fileInfo[0].file_id;\\n setPageTitle(fileInfo[0].file_name);\\n } else {\\n setPageTitle(shareInfo.share_name);\\n }\\n let deadline = \\\"永久有效\\\";\\n\\n if (shareInfo.expiration) {\\n deadline = \\\"有效至:\\\" + formatDate(shareInfo.expiration);\\n //shareInfo.updated_at\\n }\\n items.push({\\n title: (shareInfo.creator_name || shareInfo.creator_phone) + \\\"&nbsp;&nbsp;\\\" + deadline.small(),\\n url: realurl + \\\"#noHistory#\\\",\\n img: shareInfo.avatar || \\\"hiker://images/icon_unknown\\\",\\n col_type: \\\"avatar\\\"\\n });\\n }\\n if (!isSearch) {\\n items.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n input = input.trim();\\n if (!input) return \\\"toast://请输入关键词\\\";\\n return \\\"hiker://page/aliyun#noHistory##fullTheme#?page=fypage&searchKey=\\\" + encodeURIComponent(input);\\n }),\\n col_type: \\\"input\\\",\\n extra: {\\n onChange: \\\"putMyVar('listSearchKey',input)\\\",\\n sharePwd: sharePwd,\\n shareId: shareId,\\n shareToken: shareToken\\n }\\n });\\n } else {\\n items.push({\\n title: \\\"““\\\" + searchKey + \\\"””的搜索结果\\\",\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n }\\n let funcItems = [];\\n funcItems.push({\\n title: style,\\n url: $(styles, 1, \\\"排布样式\\\").select(() => {\\n setItem(\\\"aliyun_style\\\", input);\\n refreshPage();\\n return \\\"toast://已切换\\\";\\n }),\\n pic_url: \\\"https://hikerfans.com/img/ali_icon.svg\\\"\\n }, {\\n title: orderName,\\n url: $(ordersKeys, 2, \\\"排序方式\\\").select(() => {\\n setItem(\\\"aliyun_order\\\", input);\\n refreshPage();\\n return \\\"toast://切换成功\\\";\\n }),\\n pic_url: \\\"https://hikerfans.com/img/ali_sort.svg\\\"\\n }, {\\n title: playMode,\\n url: $([\\\"转码\\\", \\\"原画\\\", \\\"原转\\\"], 1, \\\"播放模式\\\").select(() => {\\n setItem(\\\"aliyun_playMode\\\", input);\\n refreshPage();\\n return \\\"toast://切换成功\\\";\\n }),\\n pic_url: \\\"https://hikerfans.com/img/ali_play.svg\\\",\\n });\\n if (playMode === \\\"原画\\\" || playMode === \\\"原转\\\") {\\n funcItems.push({\\n title: openAPIList[getItem(\\\"openApiMode\\\", \\\"0\\\")],\\n url: $(openAPIList, 1, \\\"原画API(不要频繁切换)\\\").select((openAPIList) => {\\n setItem(\\\"openApiMode\\\", String(openAPIList.indexOf(input)));\\n deleteFile($.require(\\\"tokenPath\\\").openTokensFilepath);\\n refreshPage(false);\\n return \\\"toast://已切换为\\\" + input;\\n }, openAPIList),\\n pic_url: \\\"https://hikerfans.com/img/ali_api.svg\\\",\\n });\\n }\\n if (!isSearch) {\\n funcItems.push({\\n title: \\\"功能\\\",\\n url: $([\\\"转存云盘\\\", \\\"登陆账号\\\", \\\"复制分享链接\\\", \\\"查看手动挂载字幕\\\", \\\"获取弹幕搜索规则\\\", \\\"批量挂载本地弹幕\\\", \\\"推送到TVBox\\\", \\\"设置收藏封面\\\", \\\"获取投屏IP\\\" /*, \\\"极速原画下载线程\\\"*/ , \\\"转存当前文件夹\\\"], 2, \\\"更多功能\\\").select((shareId, sharePwd, fileId) => {\\n switch (input) {\\n case \\\"转存云盘\\\":\\n return `smartdrive://share/browse?shareId=${shareId}&sharePwd=${sharePwd||\\\"\\\"}`;\\n case \\\"登陆账号\\\":\\n return \\\"hiker://page/login#noRecordHistory##noHistory#\\\";\\n case \\\"复制分享链接\\\":\\n return $([\\\"复制链接\\\", \\\"复制海阔口令\\\"], 1, \\\"分享方式\\\").select((url) => {\\n if (input === \\\"复制链接\\\") {\\n return \\\"copy://\\\" + url;\\n } else {\\n return \\\"copy://阿里云盘分享口令「\\\" + getPageTitle() + \\\"」\\\\n\\\" + url + \\\" @import=js:`hiker://page/aliyun?realurl=${input.trim()}&rule=\\\" + MY_RULE.title + \\\"`;\\\";\\n }\\n }, \\\"https://www.aliyundrive.com/s/\\\" + shareId + (fileId ? \\\"/folder/\\\" + fileId : \\\"\\\"));\\n case \\\"批量挂载本地弹幕\\\":\\n return \\\"hiker://page/dmMount#noHistory##noRecordHistory#\\\";\\n case \\\"查看手动挂载字幕\\\":\\n let zm = storage0.getMyVar(\\\"mountzimu\\\", {});\\n let tip = zm.name ? \\\"当前字幕文件\\\\n\\\" + zm.name + \\\".\\\" + zm.ext : \\\"还未手动挂载字幕\\\";\\n confirm({\\n title: '手动挂载字幕',\\n content: tip + \\\"\\\\n(点击取消可以清除挂载字幕)\\\",\\n cancel: () => {\\n clearMyVar(\\\"mountzimu\\\");\\n return \\\"toast://已清除手动挂载字幕\\\";\\n }\\n });\\n return;\\n case \\\"获取弹幕搜索规则\\\":\\n let rule = {\\n \\\"js\\\": JSON.stringify(\\\"hiker://page/loadDm?rule=\\\" + MY_RULE.title + \\\"&title=\\\") + \\\"+encodeURIComponent(playdata.title.split('-')[0]);\\\",\\n \\\"name\\\": MY_RULE.title + \\\"弹幕搜索\\\"\\n };\\n return \\\"rule://\\\" + base64Encode(\\\"¥projection_screen¥\\\" + JSON.stringify(rule));\\n case \\\"推送到TVBox\\\":\\n return \\\"hiker://page/tvboxPush#noHistory##noRecordHistory#\\\";\\n case \\\"设置收藏封面\\\":\\n return $([\\\"设置封面地址\\\", \\\"搜索封面\\\"], 1).select(() => {\\n if (input === \\\"设置封面地址\\\") {\\n return $(\\\"\\\", \\\"请输入图片地址\\\").input(() => {\\n input = input.trim();\\n if (!input) return \\\"toast://请输入地址\\\";\\n setPagePicUrl(input);\\n return \\\"toast://修改成功\\\";\\n });\\n } else {\\n return \\\"hiker://page/frontCover#noHistory##noRecordHistory#\\\";\\n }\\n });\\n case \\\"获取投屏IP\\\":\\n let ip = $.require(\\\"aliUtil\\\").getIPv4Address();\\n if (ip.startsWith(\\\"192.168.\\\")) {\\n return $(ip + \\\"\\\\n该IP适用于流量+热点的投屏\\\\n请替换链接中的0.0.0.0\\\").confirm((ip) => {\\n return \\\"copy://\\\" + ip;\\n }, ip);\\n } else {\\n return $(ip + \\\"\\\\n获取失败非稳定IP,请开启热点再使用,该IP可能会变,不能投屏\\\").confirm(() => {});\\n }\\n case \\\"极速原画下载线程\\\":\\n return $(getItem(\\\"speedThread\\\", \\\"20\\\"), \\\"请输入3-32之间的整数\\\").input(() => {\\n let speedThread = parseInt(input);\\n if (speedThread < 3 || speedThread > 32) {\\n return \\\"toast://设置不合法\\\";\\n }\\n setItem(\\\"speedThread\\\", String(speedThread));\\n return \\\"toast://设置成功\\\";\\n });\\n case \\\"转存当前文件夹\\\":\\n return \\\"hiker://page/myaliyun#noHistory##noRecordHistory#?page=fypage\\\";\\n }\\n }, shareId, sharePwd, fileId),\\n pic_url: \\\"https://hikerfans.com/img/ali_fileinto.svg\\\",\\n extra: {\\n pageId: pageId,\\n fileId: fileId,\\n shareId: shareId,\\n shareToken: shareToken,\\n sharePwd: sharePwd,\\n transfer: true,\\n folderName: getPageTitle()\\n }\\n });\\n } else {\\n funcItems.push({\\n title: [\\\"ALL\\\", \\\"跳过文件\\\"][Number(skipFile)],\\n url: $(\\\"#noLoading#\\\").lazyRule((skipFile) => {\\n setItem(\\\"skipFile\\\", String(skipFile ? \\\"0\\\" : \\\"1\\\"));\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, skipFile),\\n pic_url: \\\"hiker://images/icon_search6\\\",\\n });\\n }\\n let funStyle = [\\\"\\\", \\\"\\\", \\\"\\\", \\\"icon_small_3\\\", \\\"icon_round_small_4\\\", \\\"icon_5\\\"][funcItems.length];\\n items.push.apply(items, funcItems.map(v => (v.col_type = funStyle) && v));\\n items.push({\\n col_type: \\\"line_blank\\\"\\n });\\n }\\n let rescod = {};\\n let marker = MY_PARAMS.marker;\\n if (isSearch) {\\n rescod = aliShareApi.getSearchListFile(searchKey, marker, order[0], order[1]);\\n } else {\\n rescod = aliShareApi.getListFile(fileId, marker, order[0], order[1]);\\n }\\n if (rescod.next_marker) {\\n setMarker(rescod.next_marker);\\n } else {\\n setMarker();\\n }\\n\\n var conts = rescod.items;\\n //字幕匹配准备\\n let subExts = [\\\"vtt\\\", \\\"srt\\\", \\\"ass\\\"];\\n var zimulist = [];\\n conts.forEach((item) => {\\n if (subExts.includes(item.file_extension && item.file_extension.toLowerCase())) {\\n let name = item.name.replace('.' + item.file_extension, '');\\n zimulist.push({\\n ext: item.file_extension,\\n file_id: item.file_id,\\n name: name\\n });\\n }\\n });\\n //处理夸页匹配字幕\\n /*\\n let hasSub = zimulist.length > 0;\\n if (hasSub&&rescod.next_marker) {\\n if (zimulist.length > 4) {\\n setSubtitleCache(zimulist.slice(-4));\\n } else {\\n setSubtitleCache(zimulist);\\n }\\n }\\n let lastItem = conts.at(-1);\\n if (hasSub&&lastItem&&lastItem.category === \\\"video\\\") {\\n setVideoItemCache(conts.splice(conts.length-1,1));\\n }\\n if (MY_PAGE > 1) {\\n let subtitleCache = MY_PARAMS.subtitleCache || [];\\n zimulist = zimulist.concat(subtitleCache);\\n let videoItemCache = MY_PARAMS.videoItemCache || [];\\n conts = videoItemCache.concat(conts);\\n setSubtitleCache();\\n setVideoItemCache();\\n }*/\\n //简体优先\\n zimulist.sort((a, b) => (b.name.endsWith(\\\".sc\\\") || b.name.endsWith(\\\".chs\\\")) - (a.name.endsWith(\\\".sc\\\") || a.name.endsWith(\\\".chs\\\")));\\n //end\\n let titleHead = {\\n video: \\\"🎬\\\",\\n audio: \\\"🎵\\\",\\n doc: \\\"📑\\\",\\n image: \\\"🖼\\\",\\n zip: \\\"📦\\\",\\n folder: \\\"📂\\\"\\n };\\n\\n function getHead(type, ext) {\\n let head = titleHead[type];\\n if (subExts.includes(ext)) {\\n head = \\\"🕸\\\";\\n }\\n return head || \\\"❓\\\";\\n }\\n\\n function getPreviewPic(fileItem) {\\n if (fileItem.thumbnail) {\\n return $(\\\"https://empty?\\\" + fileItem.file_id).image((pic) => {\\n try {\\n return fetch(pic, {\\n inputStream: true\\n });\\n } catch (e) {\\n return null;\\n }\\n }, fileItem.thumbnail);\\n }\\n }\\n let folderStyle, fileStyle;\\n let filterType = [];\\n if (style === \\\"追剧\\\") {\\n folderStyle = \\\"avatar\\\";\\n fileStyle = \\\"movie_2\\\";\\n filterType.push(\\\"video\\\");\\n items.push({\\n title: \\\"““””\\\" + \\\"追剧模式只显示文件夹和视频\\\".small().fontcolor(\\\"grey\\\"),\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n } else if (style === \\\"看图\\\") {\\n folderStyle = \\\"avatar\\\";\\n fileStyle = \\\"card_pic_3\\\";\\n filterType.push(\\\"image\\\");\\n items.push({\\n title: \\\"““””\\\" + \\\"看图模式只显示文件夹和图片\\\".small().fontcolor(\\\"grey\\\"),\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n } else {\\n folderStyle = fileStyle = style;\\n }\\n let noSkipFile = !skipFile;\\n for (let i = 0; i < conts.length; i++) {\\n let fileItem = conts[i];\\n let cate = fileItem.category;\\n let desc = formatDate(fileItem.updated_at);\\n let pic_url = getIcon(fileItem.file_extension, fileItem.type);\\n\\n if (fileItem.type === \\\"folder\\\") {\\n let title = (folderStyle === \\\"text_1\\\" ? titleHead.folder : \\\"\\\") + fileItem.name;\\n items.push({\\n title: title,\\n url: 'hiker://page/aliyun?page=fypage',\\n col_type: folderStyle,\\n desc: formatDate(fileItem.updated_at),\\n pic_url: pic_url,\\n extra: {\\n shareId: shareId,\\n shareToken: MY_PARAMS.shareToken,\\n fileId: fileItem.file_id,\\n sharePwd: sharePwd,\\n pageTitle: fileItem.name,\\n transfer: true,\\n noPic: true,\\n longClick: [{\\n title: \\\"转存\\\",\\n js: JSON.stringify(\\\"hiker://page/myaliyun#noHistory##noRecordHistory#?page=fypage\\\")\\n }]\\n }\\n });\\n } else if (noSkipFile) {\\n if (filterType.length > 0 && !filterType.includes(cate)) {\\n continue;\\n }\\n let subtitle, cls, longc = [{\\n title: \\\"转存\\\",\\n js: JSON.stringify(\\\"hiker://page/myaliyun#noHistory##noRecordHistory#?page=fypage\\\")\\n }];\\n let title = fileItem.name;\\n let nameNotExt = fileItem.name.replace('.' + fileItem.file_extension, '');\\n if (subExts.includes(fileItem.file_extension)) {\\n longc.push({\\n title: \\\"挂载字幕\\\",\\n js: $.toString((zm) => {\\n storage0.putMyVar('mountzimu', zm);\\n return 'toast://挂载完成,当前字幕文件: ' + zm.name + '.' + zm.ext;\\n }, {\\n ext: fileItem.file_extension,\\n file_id: fileItem.file_id,\\n name: nameNotExt\\n }),\\n });\\n }\\n if (cate === \\\"video\\\") {\\n if (zimulist.length) {\\n subtitle = zimulist.find(v => v.name.includes(nameNotExt));\\n }\\n cls = \\\"playlist v\\\" + pageId;\\n }\\n if (fileStyle === \\\"text_1\\\") {\\n desc += \\\"\\\\t\\\\t\\\" + formatSize(fileItem.size);\\n title = getHead(cate, fileItem.file_extension) + title;\\n } else if ([\\\"video\\\", \\\"image\\\"].includes(cate)) {\\n pic_url = getPreviewPic(fileItem) || pic_url;\\n }\\n items.push({\\n title: title,\\n url: $(\\\"#noPre#\\\").lazyRule((shareId, sharePwd, shareToken, fileId, cate, subtitle) => {\\n return $.require(\\\"hiker://page/alilazy\\\")(shareId, sharePwd, shareToken, fileId, cate, subtitle);\\n }, shareId, sharePwd, MY_PARAMS.shareToken, fileItem.file_id, cate, subtitle),\\n desc: desc,\\n pic_url: pic_url,\\n extra: {\\n id: fileItem.file_id,\\n transfer: true,\\n shareInfo: {\\n pageId: pageId,\\n fileId: fileItem.file_id,\\n shareId: shareId,\\n shareToken: shareToken,\\n sharePwd: sharePwd,\\n },\\n longClick: longc,\\n cls: cls,\\n //inheritTitle: false,\\n pageTitle: fileItem.name\\n },\\n col_type: fileStyle\\n });\\n }\\n }\\n if (conts.length === 0) {\\n items.push({\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n title: \\\"““””\\\" + \\\"~~~什么都没有了哦~~~\\\".fontcolor(\\\"Gray\\\"),\\n extra: {\\n lineVisible: false,\\n }\\n });\\n }\\n}\\n\\nlet items = [];\\ntry {\\n if (MY_PAGE > 1 && !MY_PARAMS.marker) {\\n items.push({\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n title: \\\"““””\\\" + \\\"~~~什么都没有了哦~~~\\\".fontcolor(\\\"Gray\\\"),\\n extra: {\\n lineVisible: false,\\n }\\n });\\n } else {\\n load(items);\\n }\\n} catch (e) {\\n if (e.name === \\\"AliError\\\") {\\n if (e.code === \\\"InvalidResource.SharePwd\\\") {\\n items.push({\\n title: \\\"请输入提取码\\\",\\n desc: sharePwd ? \\\"““提取码错误””\\\" : \\\"\\\",\\n url: $().input((MY_PARAMS) => {\\n setPageParams(Object.assign({}, MY_PARAMS, {\\n sharePwd: input\\n }));\\n refreshPage();\\n }, MY_PARAMS),\\n col_type: \\\"text_center_1\\\"\\n });\\n } else {\\n if (e.significance === 1) {\\n items.push({\\n title: \\\"““””\\\" + e.message.big().big().fontcolor(\\\"red\\\"),\\n url: \\\"hiker://empty\\\",\\n col_type: 'text_center_1',\\n });\\n } else if (e.significance === 3) {\\n items.push({\\n title: \\\"““””\\\" + e.message.big().fontcolor(\\\"green\\\"),\\n url: \\\"hiker://empty\\\",\\n col_type: 'text_center_1'\\n });\\n }\\n }\\n\\n } else {\\n log(\\\"列表加载失败#\\\\n错误信息>\\\" + e.toString() + \\\"\\\\n错误行>\\\" + e.lineNumber);\\n items.push({\\n title: '欧欧,报错了。在刷新几次?或者更换文件夹。',\\n url: \\\"hiker://empty\\\",\\n desc: e.toString(),\\n col_type: 'text_center_1'\\n });\\n //throw e;\\n }\\n}\\nsaveMyPaCache();\\nsetResult(items);\"},{\"col_type\":\"movie_3\",\"name\":\"登录账号\",\"path\":\"login\",\"rule\":\"js:\\nvar d = [];\\nsetPageTitle(\\\"登录阿里云盘\\\");\\nlet index = Number(getParam(\\\"index\\\", \\\"1\\\"));\\nif (Number.isNaN(index)) {\\n index = 1;\\n}\\n\\n\\nfunction getQRCode() {\\n let json = fetch(\\\"https://passport.aliyundrive.com/newlogin/qrcode/generate.do?appName=aliyun_drive&fromSite=52&appName=aliyun_drive&appEntrance=web&isMobile=false&lang=zh_CN&returnUrl=&bizParams=&_bx-v=2.2.3\\\");\\n let qr = JSON.parse(json);\\n if (!openAppIntent('com.alicloud.databox', 'com.taobao.login4android.scan.QrScanActivity', {\\n \\\"key_scanParam\\\": json\\n })) {\\n createQRCode(qr.content.data.codeContent, false);\\n }\\n return qr;\\n}\\n\\nfunction backHome(t, i) {\\n back(i);\\n toast(t);\\n}\\n\\nfunction fromAppGetToken(qr) {\\n let qr = getQRCode();\\n if (!qr) return backHome(\\\"获取失败\\\");\\n let ckk = qr.content.data;\\n let body = {\\n ck: ckk.ck,\\n t: ckk.t + \\\"\\\",\\n appName: \\\"aliyun_drive\\\",\\n appEntrance: \\\"web\\\",\\n isMobile: false,\\n lang: \\\"zh_CN\\\",\\n navPlatform: \\\"MacIntel\\\",\\n returnUrl: \\\"\\\",\\n navlanguage: \\\"zh-CN\\\",\\n fromSite: 52,\\n bizParams: \\\"\\\"\\n\\n };\\n /*\\n {\\n NEW: \\\"待扫描\\\",\\n CANCELED: \\\"取消\\\",\\n SCANED:\\\"已扫描\\\",\\n CANCELED: \\\"完成\\\"\\n }*/\\n let errorCount = 0;\\n for (let i = 0; i < 30; i++) {\\n try {\\n let result = JSON.parse(post(\\\"https://passport.aliyundrive.com/newlogin/qrcode/query.do?appName=aliyun_drive&fromSite=52&_bx-v=2.2.3\\\", {\\n body: body\\n }));\\n let qrCodeStatus = result.content.data.qrCodeStatus;\\n\\n if (qrCodeStatus === \\\"CONFIRMED\\\") {\\n if (result.content.data.bizExt) {\\n let info = JSON.parse(base64Decode(result.content.data.bizExt));\\n let aliTokensFilepath = $.require(\\\"hiker://page/tokenPath\\\").aliTokensFilepath;\\n let aliToken = {\\n refresh_token: info.pds_login_result.refreshToken\\n };\\n writeFile(aliTokensFilepath, JSON.stringify(aliToken));\\n addItemAfter(\\\"loginy\\\", {\\n title: \\\"登录成功(点击返回)\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n back(false);\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"text_center_1\\\",\\n });\\n backHome(\\\"登录成功\\\", true);\\n } else {\\n backHome(\\\"登录失败,请尝试其他的方法\\\");\\n }\\n return;\\n } else if (qrCodeStatus === \\\"CANCELED\\\") {\\n backHome(\\\"取消登录授权\\\");\\n return;\\n }\\n if ([\\\"NEW\\\", \\\"SCANED\\\"].includes(qrCodeStatus)) {\\n java.lang.Thread.sleep(2500);\\n } else {\\n backHome(\\\"超时\\\");\\n return;\\n }\\n } catch (e) {\\n errorCount++;\\n if (errorCount > 4) {\\n throw e;\\n }\\n }\\n }\\n\\n}\\nif (index > -1) {\\n let loginUrls = [\\\"https://www.aliyundrive.com/sign\\\", \\\"https://auth.aliyundrive.com/v2/oauth/authorize?login_type=custom&response_type=code&redirect_uri=https%3A%2F%2Fwww.aliyundrive.com%2Fsign%2Fcallback&client_id=25dzX3vbYqktVxyX&state=%7B%22origin%22%3A%22*%22%7D#/login\\\"];\\n let url = loginUrls[index];\\n let isRefresh = !getParam(\\\"noRefresh\\\");\\n let aliTokensFilepath = $.require(\\\"tokenPath\\\").aliTokensFilepath;\\n\\n var js = $.toString((isRefresh, aliTokensFilepath) => {\\n setInterval(() => {\\n var token = JSON.parse(localStorage.getItem('token'));\\n if (token && token.user_id) {\\n let token_url = aliTokensFilepath;\\n fy_bridge_app.writeFile(token_url, JSON.stringify(token));\\n localStorage.clear();\\n fy_bridge_app.back(isRefresh);\\n fy_bridge_app.toast('TOKEN获取成功,请勿泄漏个人隐私!!!');\\n return;\\n }\\n }, 300);\\n }, isRefresh, aliTokensFilepath);\\n\\n d.push({\\n url: url,\\n col_type: 'x5_webview_single',\\n desc: '100%&&float',\\n extra: {\\n canBack: false,\\n js: js,\\n urlInterceptor: $.toString(() => true)\\n }\\n });\\n setResult(d);\\n} else {\\n \\n d.push({\\n col_type: \\\"text_center_1\\\",\\n title: \\\"““””\\\" + \\\"等待授权...\\\".big().big(),\\n desc: \\\"如果升级了官方App,无法自动调起授权,请扫码登录\\\",\\n url: \\\"hiker://empty\\\",\\n extra: {\\n id: \\\"loginy\\\",\\n }\\n });\\n setResult(d);\\n try {\\n fromAppGetToken();\\n } catch (e) {\\n backHome(\\\"内部错误:\\\" + e.toString());\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"阿里列表API\",\"path\":\"AliApi\",\"rule\":\"js:\\n//@author LoyDgIk\\nfunction AliError(errorCode, message, significance) {\\n let errorType = AliError.errorCodeMap.get(errorCode) || [];\\n this.code = errorCode;\\n this.message = errorType[0] || message || \\\"\\\";\\n this.name = \\\"AliError\\\";\\n this.significance = errorType[1] || significance || 1;\\n}\\nAliError.errorCodeMap = new Map([\\n [\\\"ShareLink.Cancelled\\\", [\\\"分享链接已失效\\\"]],\\n [\\\"ShareLink.Forbidden\\\", [\\\"违规资源已被封禁\\\"]],\\n [\\\"NotFound.ShareLink\\\", [\\\"不存在该链接请核对\\\"]],\\n [\\\"AccessTokenInvalid\\\", [\\\"访问令牌失效,请重新登陆\\\"]],\\n [\\\"ShareLinkTokenInvalid\\\", [\\\"分享令牌失效\\\"]],\\n [\\\"ParamFlowException\\\", [\\\"访问过于频繁,请稍后再试\\\", 3]]\\n]);\\n\\nAliError.prototype = Object.assign(new Error(), {\\n constructor: AliError\\n});\\n\\nfunction postApi(api, body, headers) {\\n let result = request('https://api.aliyundrive.com' + api, {\\n headers: Object.assign({\\n 'Content-Type': 'application/json',\\n }, headers),\\n body: JSON.stringify(body),\\n method: 'POST'\\n });\\n result = JSON.parse(result);\\n if (result.code) {\\n throw new AliError(result.code, result.message);\\n }\\n return result;\\n}\\n\\nfunction AliShareApi(shareId, sharePwd, shareToken, refreshCallBack) {\\n this.shareId = shareId;\\n this.sharePwd = sharePwd;\\n this.refreshCallBack = refreshCallBack || (() => void 0);\\n this.shareToken = shareToken || this.getShareToken();\\n}\\nObject.assign(AliShareApi.prototype, {\\n getShareToken() {\\n let result = postApi(\\\"/v2/share_link/get_share_token\\\", {\\n \\\"share_id\\\": this.shareId,\\n \\\"share_pwd\\\": this.sharePwd,\\n });\\n this.shareToken = result.share_token;\\n this.refreshCallBack(result.share_token, this);\\n return result.share_token;\\n },\\n postTokenApi(api, body, headers, isRetry) {\\n let result;\\n try {\\n result = postApi(api, body, Object.assign({\\n \\\"X-Share-Token\\\": this.shareToken || this.getShareToken()\\n }, headers));\\n } catch (e) {\\n if ((e.code === \\\"AccessTokenInvalid\\\" || e.code === \\\"ShareLinkTokenInvalid\\\") && !isRetry) {\\n this.getShareToken();\\n return this.postTokenApi(api, body, headers, true);\\n }\\n throw e;\\n }\\n return result;\\n },\\n getListFile(fileId, marker, orderBy, orderDirection) {\\n let result = this.postTokenApi(\\\"/adrive/v3/file/list\\\", {\\n \\\"share_id\\\": this.shareId,\\n \\\"parent_file_id\\\": fileId || \\\"root\\\",\\n \\\"limit\\\": 100,\\n \\\"image_thumbnail_process\\\": \\\"image/resize,w_160/format,jpeg\\\",\\n \\\"image_url_process\\\": \\\"image\\\\/resize,w_1920/format,jpeg\\\",\\n \\\"video_thumbnail_process\\\": \\\"video/snapshot,t_1000,f_jpg,ar_auto,w_300\\\",\\n \\\"order_by\\\": orderBy || \\\"name\\\",\\n \\\"order_direction\\\": orderDirection || \\\"ASC\\\",\\n \\\"marker\\\": marker\\n });\\n return result;\\n },\\n getShareInfo() {\\n let result = postApi(\\\"/adrive/v3/share_link/get_share_by_anonymous?share_id=\\\" + this.shareId, {\\n \\\"share_id\\\": this.shareId,\\n });\\n return result;\\n },\\n getSearchListFile(key, marker, orderBy, orderDirection) {\\n let result = this.postTokenApi(\\\"/recommend/v1/shareLink/search\\\", {\\n \\\"share_id\\\": this.shareId,\\n \\\"keyword\\\": key,\\n \\\"limit\\\": 100,\\n \\\"order_by\\\": orderBy + \\\" \\\" + orderDirection,\\n \\\"marker\\\": marker || undefined\\n });\\n if (Object.keys(result).length === 0) {\\n result.items = [];\\n }\\n return result;\\n }\\n});\\n$.exports = AliShareApi;\"},{\"col_type\":\"movie_3\",\"name\":\"阿里播放API\",\"path\":\"aliPlayApi\",\"rule\":\"//@author LoyDgIk\\n\\nfunction AliAccessApi({\\n shareId,\\n sharePwd,\\n shareToken,\\n aliTokens,\\n openTokens,\\n openSuffix,\\n refreshShareCallBack,\\n refreshAccessCallBack,\\n refreshOpenCallBack\\n}) {\\n this.openSuffix = openSuffix || \\\"\\\";\\n this.shareId = shareId;\\n this.sharePwd = sharePwd;\\n this.shareToken = shareToken;\\n this.refreshShareCallBack = refreshShareCallBack || (() => void 0);\\n this.refreshAccessCallBack = refreshAccessCallBack || (() => void 0);\\n this.refreshOpenCallBack = refreshOpenCallBack || (() => void 0);\\n this.aliTokens = aliTokens || {};\\n if (!this.aliTokens.refresh_token) {\\n throw new Error(\\\"未登陆\\\");\\n }\\n if (!this.aliTokens.access_token) {\\n this.refreshAccessToken();\\n }\\n this.defDriveId = this.aliTokens.resource_drive_id || this.aliTokens.default_drive_id;\\n this.reaccessTk = (this.aliTokens.token_type || \\\"Bearer\\\") + ' ' + this.aliTokens.access_token;\\n Object.defineProperty(this, \\\"shareToken\\\", {\\n get() {\\n return this._shareToken || this.getShareToken();\\n },\\n set(v) {\\n this._shareToken = v;\\n }\\n });\\n Object.defineProperty(this, \\\"openTools\\\", {\\n get() {\\n if (this._openTools) return this._openTools;\\n let OpenApiTools;\\n switch (getItem(\\\"openApiMode\\\", \\\"0\\\")) {\\n case \\\"1\\\":\\n OpenApiTools = $.require(\\\"openApi_aliyundrive\\\" + this.openSuffix);\\n break;\\n case \\\"2\\\":\\n OpenApiTools = $.require(\\\"openApi_tvbox\\\" + this.openSuffix);\\n break;\\n case \\\"3\\\":\\n OpenApiTools = $.require(\\\"openApi_XBY\\\" + this.openSuffix);\\n break;\\n case \\\"0\\\":\\n default:\\n OpenApiTools = $.require(\\\"openApi_alist\\\" + this.openSuffix);\\n }\\n this._openTools = new OpenApiTools(this);\\n return this._openTools;\\n }\\n });\\n Object.defineProperty(this, \\\"openTokens\\\", {\\n get() {\\n if (this._openTokens) return this._openTokens;\\n this._openTokens = Object.assign({\\n 'RefreshTokenOpen': '',\\n 'AccessTokenOpen': '',\\n 'BindRefreshToken': '',\\n }, openTokens);\\n if (openTokens !== null && !this._openTokens.AccessTokenOpen) {\\n this.refreshOpenToken();\\n }\\n return this._openTokens;\\n }\\n });\\n}\\nObject.assign(AliAccessApi.prototype, {\\n _openTools: void 0,\\n _openTokens: void 0,\\n _shareToken: void 0,\\n waitSleep(time) {\\n java.lang.Thread.sleep(time || 600);\\n return this;\\n },\\n postApi(api) {\\n return httpRequest.post(api.startsWith(\\\"http\\\") ? api : 'https://api.aliyundrive.com' + api).bodyToString(true).error((err) => {\\n throw err;\\n }).errorType((err, res) => {\\n let result = {};\\n try {\\n result = JSON.parse(res.body);\\n } catch (e) {\\n return err;\\n }\\n let rbody = (result.code ? result : (result && result.responses && result.responses[0] && result.responses[0].body)) || {};\\n if (rbody.code) {\\n let msg = rbody.display_message || rbody.message;\\n let error = new Error(api + \\\"=>\\\" + rbody.code + \\\":\\\" + msg);\\n error.code = rbody.code;\\n error.judgeMsg = msg;\\n return error;\\n }\\n return err;\\n });\\n },\\n setMyDrividType(isBackup) {\\n this.myDrividType = !!isBackup;\\n return this;\\n },\\n trySolve(e) {\\n if (e.code === \\\"ShareLinkTokenInvalid\\\" || e.code === \\\"InvalidParameterNotMatch.ShareId\\\") {\\n this.waitSleep(20).getShareToken();\\n return true;\\n } else if (e.code === \\\"AccessTokenInvalid\\\" || e.code === \\\"AccessTokenExpired\\\") {\\n this.waitSleep(20).refreshAccessToken();\\n return true;\\n } else if (e.code === \\\"ForbiddenNoPermission.File\\\" || (e.code === \\\"BadRequest\\\" && e.judgeMsg === \\\"仅可保存到转存空间\\\")) {\\n this.aliTokens.resource_drive_id = undefined;\\n this.waitSleep(20).refreshAccessToken();\\n return true;\\n }\\n return false;\\n },\\n tryOpenApiSolve(e) {\\n if (e.code === \\\"AccessTokenInvalid\\\" || e.code === \\\"AccessTokenExpired\\\") {\\n this.waitSleep(20).refreshOpenToken();\\n return true;\\n } else {\\n this.waitSleep(20).refreshAccessToken();\\n this.waitSleep(20).refreshOpenToken();\\n return true;\\n }\\n return false;\\n },\\n getShareToken() {\\n if (!this.shareId) return;\\n let result = this.postApi(\\\"/v2/share_link/get_share_token\\\").body({\\n \\\"share_id\\\": this.shareId,\\n \\\"share_pwd\\\": this.sharePwd,\\n }).start(true);\\n this.shareToken = result.share_token;\\n this.refreshShareCallBack(result.share_token, this);\\n return result.share_token;\\n },\\n refreshAccessToken() {\\n let result = this.postApi(\\\"https://auth.aliyundrive.com/v2/account/token\\\")\\n .body({\\n \\\"grant_type\\\": \\\"refresh_token\\\",\\n \\\"refresh_token\\\": this.aliTokens.refresh_token,\\n }).headers({\\n \\\"User-Agent\\\": PC_UA,\\n \\\"Referer\\\": \\\"https://www.aliyundrive.com/\\\"\\n }).error((e) => {\\n if (e.code === \\\"InvalidParameter.RefreshToken\\\") {\\n e.message = \\\"#登陆过期请重新登陆#\\\\n\\\" + e.message;\\n throw e;\\n }\\n }).start(true);\\n delete result.user_data;\\n let originDefdDriveId = this.aliTokens.default_drive_id;\\n this.aliTokens = Object.assign(this.aliTokens, result);\\n this.reaccessTk = this.aliTokens.token_type + ' ' + this.aliTokens.access_token;\\n try {\\n if ((originDefdDriveId !== this.aliTokens.default_drive_id) || this.aliTokens.resource_drive_id === undefined) {\\n let resource_drive_id = this.getUserInfo().resource_drive_id;\\n this.aliTokens.resource_drive_id = resource_drive_id;\\n if (resource_drive_id) {\\n this.defDriveId = resource_drive_id;\\n } else {\\n this.defDriveId = this.aliTokens.default_drive_id;\\n }\\n }\\n } catch (e) {\\n log(\\\"用户信息获取失败:\\\" + e.toString());\\n }\\n this.refreshAccessCallBack(result, this);\\n return this.aliTokens;\\n },\\n getUserInfo() {\\n let info = this.postApi(\\\"https://user.aliyundrive.com/v2/user/get\\\").headers({\\n \\\"User-Agent\\\": PC_UA,\\n \\\"authorization\\\": this.reaccessTk,\\n \\\"Referer\\\": \\\"https://www.aliyundrive.com/\\\"\\n }).errorWithRetry((e, _, http) => {\\n this.trySolve(e);\\n http.mergeHeadAndBody({\\n headers: {\\n 'authorization': this.reaccessTk\\n }\\n });\\n return true;\\n }).start(true);\\n return info;\\n },\\n cacheOpenToken(openResult) {\\n this.openTokens.RefreshTokenOpen = openResult.refresh_token;\\n this.openTokens.AccessTokenOpen = openResult.token_type + \\\" \\\" + openResult.access_token;\\n this.openTokens.BindRefreshToken = this.aliTokens.refresh_token;\\n this.refreshOpenCallBack(openResult, this);\\n },\\n refreshOpenToken() {\\n try {\\n let openResult;\\n if (this.openTokens.RefreshTokenOpen && this.openTokens.BindRefreshToken === this.aliTokens.refresh_token) {\\n openResult = this.openTools.refreshOpenToken() || {};\\n } else {\\n openResult = this.openTools.getOpenToken() || {};\\n }\\n if (openResult.refresh_token) {\\n this.cacheOpenToken(openResult);\\n return this.openTokens;\\n } else {\\n throw new Error(\\\"返回结果无Token\\\");\\n }\\n } catch (e) {\\n throw new Error(\\\"OpenToken获取失败:\\\" + e.toString());\\n }\\n },\\n _cloudFileOperate(body, cloudFileId, operateUrl) {\\n let result = this.postApi('https://api.aliyundrive.com/adrive/v2/batch').body({\\n \\\"requests\\\": [{\\n \\\"body\\\": body,\\n \\\"headers\\\": {\\n \\\"Content-Type\\\": \\\"application/json\\\"\\n },\\n \\\"id\\\": cloudFileId || \\\"0\\\",\\n \\\"method\\\": \\\"POST\\\",\\n \\\"url\\\": operateUrl\\n }],\\n \\\"resource\\\": \\\"file\\\"\\n }).headers({\\n 'User-Agent': PC_UA,\\n 'Referer': 'https://www.aliyundrive.com/',\\n 'authorization': this.reaccessTk,\\n //getAccessToken\\n 'x-canary': 'client=web,app=share,version=v2.3.1',\\n 'x-share-token': this.shareToken\\n }).errorWithRetry((e, _, http) => {\\n if (e.code === \\\"QuotaExhausted.Drive\\\") {\\n throw e;\\n }\\n\\n if (!this.trySolve(e)) {\\n this.waitSleep(20).refreshAccessToken();\\n }\\n let body = http.options.body.requests[0].body;\\n if (body.drive_id) {\\n body.drive_id = this.getMyDrivid();\\n }\\n if (body.to_drive_id) {\\n body.to_drive_id = this.getMyDrivid();\\n }\\n http.mergeHeadAndBody({\\n headers: {\\n 'authorization': this.reaccessTk,\\n 'x-share-token': this.shareToken\\n }\\n });\\n return true;\\n }).start(true);\\n return result;\\n },\\n copyFileToCloudFile(fileId, parentFileId, retry) {\\n let result = this._cloudFileOperate({\\n \\\"file_id\\\": fileId,\\n \\\"share_id\\\": this.shareId,\\n \\\"auto_rename\\\": true,\\n \\\"to_parent_file_id\\\": parentFileId || \\\"root\\\",\\n \\\"to_drive_id\\\": this.getMyDrivid()\\n }, \\\"0\\\", \\\"/file/copy\\\");\\n let body = result && result.responses && result.responses[0] && result.responses[0].body || {};\\n if (!body.file_id && !retry) {\\n this.waitSleep(20).getShareToken();\\n this.waitSleep(20).refreshAccessToken();\\n return this.waitSleep(20).copyFileToCloudFile(fileId, parentFileId, true);\\n } else if (!body.file_id) {\\n let e = new Error(\\\"文件复制失败:\\\\n\\\" + JSON.stringify(result));\\n e.code = body.code;\\n throw e;\\n }\\n return result.responses[0].body.file_id;\\n },\\n openCloudFileToDownUrl(cloudFileId) {\\n let fileInfo = this.postApi('https://open.aliyundrive.com/adrive/v1.0/openFile/getDownloadUrl').body({\\n 'file_id': cloudFileId,\\n 'drive_id': this.getMyDrivid()\\n }).headers({\\n 'User-Agent': PC_UA,\\n 'Referer': 'https://www.aliyundrive.com/',\\n 'authorization': this.openTokens.AccessTokenOpen\\n }).errorWithRetry(2, (e, _, http) => {\\n //this.waitSleep(30).trySolve(e);\\n this.waitSleep(30).tryOpenApiSolve(e);\\n http.mergeHeadAndBody({\\n body: {\\n 'drive_id': this.getMyDrivid(),\\n },\\n headers: {\\n 'authorization': this.openTokens.AccessTokenOpen\\n }\\n });\\n return true;\\n }).start(true);\\n if (!fileInfo.url || fileInfo.code) throw new Error(\\\"下载链接获取失败\\\\n\\\" + fileInfo.code + \\\":\\\" + fileInfo.message);\\n return fileInfo.url;\\n },\\n deleteeCloudFile(cloudFileId) {\\n let result = this._cloudFileOperate({\\n \\\"drive_id\\\": this.getMyDrivid(),\\n \\\"file_id\\\": cloudFileId\\n }, cloudFileId, \\\"/file/delete\\\");\\n return result;\\n },\\n getVideoCloudPreview(cloudFileId) {\\n let fileInfo = this.postApi('https://open.aliyundrive.com/adrive/v1.0/openFile/getVideoPreviewPlayInfo').body({\\n 'file_id': cloudFileId,\\n 'drive_id': this.getMyDrivid(),\\n \\\"category\\\": \\\"live_transcoding\\\",\\n \\\"template_id\\\": \\\"\\\",\\n \\\"get_subtitle_info\\\": true,\\n \\\"url_expire_sec\\\": 14400,\\n \\\"with_play_cursor\\\": true\\n }).headers({\\n 'User-Agent': PC_UA,\\n 'Referer': 'https://www.aliyundrive.com/',\\n 'authorization': this.openTokens.AccessTokenOpen\\n }).errorWithRetry(2, (e, _, http) => {\\n //this.waitSleep(30).trySolve(e);\\n this.waitSleep(30).tryOpenApiSolve(e);\\n http.mergeHeadAndBody({\\n body: {\\n 'drive_id': this.getMyDrivid(),\\n },\\n headers: {\\n 'authorization': this.openTokens.AccessTokenOpen\\n }\\n });\\n return true;\\n }).start(true);\\n return fileInfo.video_preview_play_info.live_transcoding_task_list.reverse();\\n },\\n getAllVideoTemPlayUrl(fileId, onlyPreview) {\\n let cloudFileId = this.copyFileToCloudFile(fileId);\\n this.waitSleep(20);\\n let playUrl = onlyPreview ? undefined : this.openCloudFileToDownUrl(cloudFileId);\\n this.waitSleep(50);\\n let preview = this.getVideoCloudPreview(cloudFileId);\\n this.waitSleep(50);\\n try {\\n this.deleteeCloudFile(cloudFileId);\\n } catch (e) {\\n log(\\\"#文件删除失败#\\\\n错误信息>\\\" + e.toString() + \\\"\\\\n错误行>\\\" + e.lineNumber);\\n }\\n return {\\n origin: playUrl,\\n preview\\n };\\n },\\n getVideoTemPlayUrl(fileId) {\\n let cloudFileId = this.copyFileToCloudFile(fileId);\\n this.waitSleep(20);\\n let playUrl = this.openCloudFileToDownUrl(cloudFileId);\\n this.waitSleep(50);\\n try {\\n this.deleteeCloudFile(cloudFileId);\\n } catch (e) {\\n log(\\\"#文件删除失败#\\\\n错误信息>\\\" + e.toString() + \\\"\\\\n错误行>\\\" + e.lineNumber);\\n }\\n return playUrl;\\n },\\n getFileToDownUrl(fileId) {\\n let downloadInfo = this.postApi(\\\"/v2/file/get_share_link_download_url\\\").body({\\n \\\"expire_sec\\\": 600,\\n \\\"file_id\\\": fileId,\\n \\\"share_id\\\": this.shareId\\n }).headers({\\n \\\"X-Share-Token\\\": this.shareToken,\\n \\\"authorization\\\": this.aliTokens.access_token\\n }).errorWithRetry((e, _, http) => {\\n this.trySolve(e);\\n http.mergeHeadAndBody({\\n headers: {\\n \\\"X-Share-Token\\\": this.shareToken,\\n \\\"authorization\\\": this.aliTokens.access_token\\n }\\n });\\n return true;\\n }).start(true);\\n return downloadInfo.download_url;\\n },\\n getSign() {\\n if (!this.aliTokens.device_id) {\\n this.waitSleep(20).refreshAccessToken();\\n }\\n let calculateNewSign = () => {\\n let sign = justTestSign(\\\"5dde4e1bdf9e4966b387ba58f4b3fdc3\\\", this.aliTokens.device_id, this.aliTokens.user_id).split(\\\"##\\\");\\n return {\\n signature: sign.at(0),\\n pubKey: sign.at(-1)\\n };\\n };\\n let newSign = calculateNewSign();\\n let result = this.postApi('/users/v1/users/device/create_session').body({\\n \\\"deviceName\\\": \\\"Edge浏览器\\\",\\n \\\"modelName\\\": \\\"Windows网页版\\\",\\n \\\"pubKey\\\": newSign.pubKey,\\n }).headers({\\n 'User-Agent': PC_UA,\\n 'Referer': 'https://www.aliyundrive.com',\\n 'Authorization': this.reaccessTk,\\n 'X-Share-Token': this.shareToken,\\n 'x-device-id': this.aliTokens.device_id,\\n 'x-signature': newSign.signature\\n }).errorWithRetry(3, (e, _, http) => {\\n if (e.message === \\\"x-device-id empty\\\") {\\n this.waitSleep(20).refreshAccessToken();\\n }\\n this.trySolve(e);\\n this.waitSleep(50);\\n newSign = calculateNewSign();\\n http.mergeHeadAndBody({\\n body: {\\n \\\"pubKey\\\": newSign.pubKey\\n },\\n headers: {\\n 'Authorization': this.reaccessTk,\\n 'X-Share-Token': this.shareToken,\\n 'x-device-id': this.aliTokens.device_id,\\n 'x-signature': newSign.signature\\n }\\n });\\n return true;\\n }).error((err, res) => {\\n return {};\\n }).success((body) => {\\n return body;\\n }).start(true);\\n if (result.success) {\\n return newSign;\\n } else {\\n throw new Error(\\\"Sign获取失败,请重试。\\\\ncode:\\\" + (result.code || \\\"\\\") + \\\"\\\\nmessage:\\\" + (result.message || \\\"\\\"));\\n }\\n },\\n getShareVideoPreview(fileId) {\\n let sign = this.getSign();\\n let json = this.postApi('https://api.aliyundrive.com/v2/file/get_share_link_video_preview_play_info').body({\\n \\\"category\\\": \\\"live_transcoding\\\",\\n \\\"file_id\\\": fileId,\\n \\\"get_preview_url\\\": true,\\n \\\"share_id\\\": this.shareId,\\n \\\"template_id\\\": \\\"\\\",\\n \\\"get_subtitle_info\\\": true\\n }).headers({\\n 'content-type': 'application/json;charset=UTF-8',\\n \\\"origin\\\": \\\"https://www.aliyundrive.com\\\",\\n \\\"referer\\\": \\\"https://www.aliyundrive.com/\\\",\\n \\\"user-agent\\\": \\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41\\\",\\n \\\"x-canary\\\": \\\"client=web,app=adrive,version=v3.1.0\\\",\\n \\\"x-share-token\\\": this.shareToken,\\n \\\"fileid\\\": this.aliTokens.user_id,\\n 'Authorization': this.reaccessTk,\\n 'x-device-id': this.aliTokens.device_id,\\n 'x-signature': sign.signature\\n }).errorWithRetry((e, _, http) => {\\n this.trySolve(e);\\n http.mergeHeadAndBody({\\n headers: {\\n 'Authorization': this.reaccessTk,\\n 'X-share-token': this.shareToken,\\n 'x-device-id': this.aliTokens.device_id,\\n 'x-signature': sign.signature\\n }\\n });\\n return true;\\n }).start(true);\\n return json.video_preview_play_info.live_transcoding_task_list.reverse();\\n },\\n getMyDrivid() {\\n return (this.myDrividType ? this.aliTokens.default_drive_id : this.aliTokens.resource_drive_id) || this.defDriveId;\\n },\\n getListFile(fileId, marker, orderBy, orderDirection) {\\n let result = this.postApi(\\\"https://open.aliyundrive.com/adrive/v1.0/openFile/list\\\").body({\\n \\\"drive_id\\\": this.getMyDrivid(),\\n \\\"parent_file_id\\\": fileId || \\\"root\\\",\\n \\\"limit\\\": 100,\\n \\\"all\\\": true,\\n \\\"url_expire_sec\\\": 86400,\\n \\\"image_thumbnail_process\\\": \\\"image/resize,w_400/format,jpeg\\\",\\n \\\"image_url_process\\\": \\\"image/resize,w_1920/format,jpeg\\\",\\n \\\"video_thumbnail_process\\\": \\\"video/snapshot,t_1000,f_jpg,ar_auto,w_300\\\",\\n \\\"order_by\\\": orderBy || \\\"name\\\",\\n \\\"order_direction\\\": orderDirection || \\\"ASC\\\",\\n \\\"marker\\\": marker\\n }).headers({\\n 'User-Agent': PC_UA,\\n 'Referer': 'https://www.aliyundrive.com/',\\n 'authorization': this.openTokens.AccessTokenOpen\\n }).errorWithRetry(2, (e, _, http) => {\\n\\n this.waitSleep(30).tryOpenApiSolve(e);\\n http.mergeHeadAndBody({\\n body: {\\n 'drive_id': this.getMyDrivid(),\\n },\\n headers: {\\n 'authorization': this.openTokens.AccessTokenOpen\\n }\\n });\\n return true;\\n }).start(true);\\n return result;\\n },\\n getSearchListFile(key, marker, orderBy, orderDirection, mode) {\\n let type = \\\"\\\";\\n if (mode === 1) {\\n type = \\\"type=\\\\\\\"file\\\\\\\" and \\\";\\n } else if (mode === 2) {\\n type = \\\"type=\\\\\\\"folder\\\\\\\" and \\\";\\n }\\n let result = this.postApi(\\\"https://api.alipan.com/adrive/v3/file/search\\\").body({\\n \\\"drive_id\\\": this.getMyDrivid(),\\n \\\"query\\\": type + \\\"name match \\\" + JSON.stringify(key),\\n \\\"limit\\\": 100,\\n \\\"order_by\\\": orderBy + \\\" \\\" + orderDirection,\\n \\\"marker\\\": marker || undefined\\n }).headers({\\n 'User-Agent': PC_UA,\\n 'Referer': 'https://www.aliyundrive.com/',\\n 'authorization': this.reaccessTk\\n }).errorWithRetry(2, (e, _, http) => {\\n this.waitSleep(20).refreshAccessToken();\\n //this.waitSleep(30).tryOpenApiSolve(e);\\n http.mergeHeadAndBody({\\n body: {\\n 'drive_id': this.getMyDrivid(),\\n },\\n headers: {\\n 'authorization': this.reaccessTk\\n }\\n });\\n return true;\\n }).start(true);\\n if (Object.keys(result).length === 0) {\\n result.items = [];\\n }\\n return result;\\n },\\n signInReward() {\\n let silData = this.postApi('https://member.aliyundrive.com/v1/activity/sign_in_list').body({\\n 'grant_type': 'refresh_token',\\n 'refresh_token': this.aliTokens.refresh_token\\n }).headers({\\n 'Authorization': this.reaccessTk,\\n 'Content-Type': 'application/json'\\n }).errorWithRetry((e, _, http) => {\\n this.trySolve(e);\\n http.mergeHeadAndBody({\\n headers: {\\n 'Authorization': this.reaccessTk,\\n\\n },\\n body: {\\n 'refresh_token': this.aliTokens.refresh_token\\n }\\n });\\n return true;\\n }).start(true);\\n let day = silData.result.signInCount;\\n let isReward = silData.result.signInLogs[day - 1].isReward;\\n if (isReward) {\\n let reward = silData.result.signInLogs[day - 1].reward;\\n if (reward) {\\n let rewnotice = reward.notice;\\n return \\\"今天已经签到,请不要重复签到!\\\\n\\\" + rewnotice;\\n } else {\\n //没有奖励,只有幸运签名片\\n return \\\"今天已经签到,请不要重复签到!\\\\n今日好运签:\\\" + silData.result.blessing;\\n }\\n } else {\\n let sirData = this.postApi('https://member.aliyundrive.com/v1/activity/sign_in_reward').body({\\n \\\"signInDay\\\": day\\n }).headers({\\n 'Authorization': this.reaccessTk,\\n 'Content-Type': 'application/json'\\n }).start(true);\\n let reward = sirData.result;\\n if (reward) {\\n let msg = \\\"签到成功! 获得奖励:\\\" + reward.notice + \\\"(\\\" + reward.subNotice + \\\") 本月已连续签到:\\\" + day + \\\"天\\\";\\n return msg;\\n } else {\\n //没有奖励,只有幸运签名片\\n return \\\"签到成功!今日幸运签:\\\" + silData.result.blessing;\\n }\\n }\\n }\\n});\\n\\nAliAccessApi.createDefault = function(shareId, sharePwd, shareToken, aliToken, openToken, MY_TITLE) {\\n const {\\n openTokensFilepath,\\n aliTokensFilepath\\n } = $.require(\\\"tokenPath\\\" + (MY_TITLE ? \\\"?rule=\\\" + MY_TITLE : \\\"\\\"));\\n if (!openToken && openToken !== null && fileExist(openTokensFilepath)) {\\n openToken = $.require(openTokensFilepath);\\n }\\n if (!aliToken && fileExist(aliTokensFilepath)) {\\n aliToken = $.require(aliTokensFilepath);\\n }\\n if (MY_TITLE) {\\n shareToken = getVar(MY_TITLE + \\\"@aliShareToken\\\", shareToken);\\n } else {\\n shareToken = getMyVar(\\\"aliShareToken\\\", shareToken);\\n }\\n return new AliAccessApi({\\n shareId,\\n sharePwd,\\n shareToken,\\n aliTokens: aliToken,\\n openTokens: openToken,\\n openSuffix: (MY_TITLE ? \\\"?rule=\\\" + MY_TITLE : \\\"\\\"),\\n refreshAccessCallBack(result, api) {\\n writeFile(aliTokensFilepath, JSON.stringify(api.aliTokens));\\n },\\n refreshOpenCallBack(result, api) {\\n writeFile(openTokensFilepath, JSON.stringify(api.openTokens));\\n },\\n refreshShareCallBack(result) {\\n if (MY_TITLE) {\\n shareToken = putVar(MY_TITLE + \\\"@\\\" + \\\"aliShareToken\\\", result);\\n } else {\\n shareToken = putMyVar(\\\"aliShareToken\\\", result);\\n }\\n }\\n });\\n}\\n$.exports = AliAccessApi;\\n\\nfunction httpRequest(url, options) {\\n this.retryCount = 0;\\n this.url = url;\\n this.options = Object.assign({}, options, {\\n withHeaders: true\\n });\\n this.errorCallback = (err, res) => {\\n throw err\\n };\\n this.errorCallbackWithRetry = (err, res, tryRestart) => false;\\n this.successCallback = (body, res) => body;\\n this.errorTypeCallback = (err, res) => err;\\n this.startRequest = fetch;\\n this._bodyToString = false;\\n}\\n\\nObject.assign(httpRequest.prototype, {\\n bodyToString(flag) {\\n this._bodyToString = !!flag;\\n return this;\\n },\\n body(body) {\\n this.options.body = body || void 0;\\n return this;\\n },\\n setStartRequestFunc(func) {\\n this.startRequest = func;\\n return this;\\n },\\n headers(headers) {\\n this.options.headers = headers || void 0;\\n return this;\\n },\\n success(successCallback) {\\n if (typeof successCallback !== \\\"function\\\") return this;\\n this.successCallback = successCallback;\\n return this;\\n },\\n error(errorCallback) {\\n if (typeof errorCallback !== \\\"function\\\") return this;\\n this.errorCallback = errorCallback;\\n return this;\\n },\\n errorType(errorTypeCallback) {\\n if (typeof errorTypeCallback !== \\\"function\\\") return this;\\n this.errorTypeCallback = errorTypeCallback;\\n return this;\\n },\\n errorWithRetry(retryCount, errorCallbackWithRetry) {\\n if (typeof retryCount === \\\"function\\\" && typeof errorCallbackWithRetry === \\\"undefined\\\") {\\n errorCallbackWithRetry = retryCount;\\n retryCount = 1;\\n }\\n if (typeof errorCallbackWithRetry !== \\\"function\\\") {\\n return this;\\n }\\n this.retryCount = Number(retryCount);\\n this.errorCallbackWithRetry = errorCallbackWithRetry;\\n return this;\\n },\\n start(toJson) {\\n let options = Object.assign({}, this.options);\\n if (typeof options.body === \\\"object\\\" && this._bodyToString) {\\n options.body = JSON.stringify(options.body);\\n }\\n var res = JSON.parse(this.startRequest(this.url, options));\\n try {\\n if (res.statusCode >= 200 && res.statusCode <= 300) {\\n let body = res.body;\\n if (toJson) {\\n body = JSON.parse(body);\\n }\\n return this.successCallback(body, res);\\n } else {\\n throw new Error(String(res.statusCode));\\n }\\n } catch (err) {\\n try {\\n err = this.errorTypeCallback(err, res);\\n } catch (e) {\\n\\n }\\n if (this.retryCount) {\\n\\n let tryResult = this.errorCallbackWithRetry(err, res, this);\\n if (tryResult) {\\n this.retryCount--;\\n return this.start(toJson);\\n } else {\\n this.retryCount = 0;\\n return this.errorCallback(err, res);\\n }\\n } else {\\n return this.errorCallback(err, res);\\n }\\n }\\n },\\n setOptions(options) {\\n this.options = Object.assign({}, options, {\\n withHeaders: true\\n });\\n return this;\\n },\\n mergeHeadAndBody(options) {\\n options = options || {};\\n this.options.headers = Object.assign(this.options.headers, options.headers);\\n if (typeof this.options.body === \\\"object\\\" && typeof options.body === \\\"object\\\") {\\n this.options.body = Object.assign(this.options.body, options.body);\\n }\\n return this;\\n }\\n});\\n\\nObject.assign(httpRequest, {\\n fetch(url, options) {\\n return new httpRequest(url, options);\\n },\\n post(url, options) {\\n return new httpRequest(url, options).setStartRequestFunc(post);\\n },\\n request(url, options) {\\n return new httpRequest(url, options).setStartRequestFunc(request);\\n },\\n postRequest(url, options) {\\n return new httpRequest(url, options).setStartRequestFunc(postRequest);\\n },\\n fetchCookie(url, options) {\\n return new httpRequest(url, options).setStartRequestFunc(fetchCookie);\\n }\\n});\"},{\"col_type\":\"movie_3\",\"name\":\"Token路径\",\"path\":\"tokenPath\",\"rule\":\"$.exports={\\n \\\"openTokensFilepath\\\": \\\"hiker://files/rules/LoyDgIk/aliOpenToken.json\\\",\\n \\\"aliTokensFilepath\\\": \\\"hiker://files/rules/LoyDgIk/aliToken.json\\\"\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"弹弹play工具\",\"path\":\"danmu\",\"rule\":\"js:\\nlet basicUrl = \\\"https://api.dandanplay.net/\\\";\\nlet sevePath = \\\"hiker://files/cache/danmu/\\\";\\n\\nfunction getRefreshRate() {\\n const Context = android.content.Context;\\n const Display = android.view.Display;\\n const WindowManager = android.view.WindowManager;\\n const context = com.example.hikerview.ui.Application().getContext();\\n\\n let windowManager = context.getSystemService(Context.WINDOW_SERVICE);\\n\\n let display = windowManager.getDefaultDisplay();\\n\\n let refreshRate = display.getRefreshRate();\\n return refreshRate;\\n}\\n$.exports.getDanMu = function(key) {\\n return JSON.parse(request(basicUrl + \\\"api/v2/search/episodes?anime=\\\" + encodeURIComponent(decodeURIComponent(key))));\\n}\\n\\nfunction encodeHtml(s) {\\n let REGX_HTML_ENCODE = /“|&|’|\\\\u003C|>|[\\\\x00-\\\\x20]|[\\\\x7F-\\\\xFF]|[\\\\u0100-\\\\u2700]/g;\\n return s.replace(REGX_HTML_ENCODE, function($0) {\\n var c = $0.charCodeAt(0),\\n r = [\\\"&#\\\"];\\n c = (c == 0x20) ? 0xA0 : c;\\n r.push(c);\\n r.push(\\\";\\\");\\n return r.join(\\\"\\\");\\n });\\n}\\n\\n\\n\\n//0默认 1简体 2繁体\\n$.exports.downloadDanMu = function(episodeId, name) {\\n let danMuData = JSON.parse(request(buildUrl(basicUrl + \\\"api/v2/comment/\\\" + episodeId, {\\n withRelated: true,\\n chConvert: 1\\n })));\\n let dMcontext = \\\"\\\";\\n //let fpsm = getRefreshRate()/60*0.95;\\n //danMuData.comments.sort((v,x)=>v.p.split(\\\",\\\")[0]-x.p.split(\\\",\\\")[0]);\\n for (let comment of danMuData.comments) {\\n //dMcontext += `<d p=\\\"${Math.round(timepoint)},${ct},${size},${color},0\\\">${content}</d>\\\\n`;\\n let paramText = comment.p;\\n let commentText = comment.m;\\n if (paramText == null || commentText == null) continue;\\n let params = paramText.split(\\\",\\\");\\n let paramsT = [];\\n for (let i in params) {\\n /*if (i == 0) {\\n paramsT.push(parseInt(params[i]));\\n continue;\\n }*/\\n if (i == 2) {\\n paramsT.push(\\\"25\\\");\\n }\\n if (i == 3) {\\n //颜色值为0时,默认设置为白色\\n if (params[i] == \\\"0\\\" || params[i] == \\\"-1\\\") {\\n paramsT.push(\\\"16777215\\\");\\n continue\\n }\\n break;\\n }\\n paramsT.push(params[i]);\\n }\\n paramsT.push(\\\"0\\\");\\n let times=parseInt(params[0]/60)+\\\":\\\"+parseInt(params[0]%60);\\n dMcontext += `<d p=\\\"${paramsT.join(',')}\\\">${encodeHtml(commentText)+\\\"#\\\"+times}</d>\\\\n`;\\n }\\n if (!dMcontext) return;\\n dMcontext = `<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?><i>\\\\n${dMcontext}</i>`;\\n let path = sevePath + name.replace(/\\\\//g, \\\"_\\\") + \\\"_\\\" + episodeId + \\\".xml\\\";\\n writeFile(path, dMcontext);\\n return path;\\n}\\n$.exports.getLocalDanMu = function(episodeId, name) {\\n let path = sevePath + name.replace(/\\\\//g, \\\"_\\\") + \\\"_\\\" + episodeId + \\\".xml\\\";\\n if (fileExist(path)) {\\n return path;\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"弹幕搜索&加载\",\"path\":\"loadDm\",\"rule\":\"js:\\nlet d = [];\\nlet onlyDownload = !!MY_PARAMS.onlyDownload;\\nif (onlyDownload) {\\n addListener(\\\"onClose\\\", () => {\\n refreshPage(false);\\n });\\n}\\nd.push({\\n col_type: \\\"rich_text\\\",\\n title: \\\"<font color='Gray'>❗关于<br><small> 内置搜索P数据来源于[弹弹play]</small></font>\\\"\\n});\\nd.push({\\n col_type: \\\"line\\\"\\n});\\nlet key = MY_PARAMS.name || getMyVar(\\\"s\\\") || decodeURIComponent(getParam(\\\"title\\\", \\\"\\\")) || \\\"\\\";\\nd.push({\\n title: \\\"内置搜索P\\\",\\n url: $(key, \\\"请搜索番剧名称\\\").input((MY_PARAMS) => {\\n setPageParams(Object.assign(MY_PARAMS, {\\n name: input,\\n }));\\n refreshPage();\\n }, MY_PARAMS),\\n col_type: \\\"text_3\\\"\\n});\\nd.push({\\n title: \\\"内置搜索T\\\",\\n url: $(key, \\\"格式:搜索关键词[回车]集数\\\").input((onlyDownload) => {\\n try {\\n showLoading(\\\"正在搜索并下载...\\\");\\n let [name, pos] = input.split(\\\"\\\\n\\\");\\n if (!name || !pos) {\\n throw \\\"格式错误\\\";\\n }\\n let urlInfo = fetch(buildUrl(\\\"https://azure.leuse.top/searchdm\\\", {\\n params: {\\n \\\"name\\\": name,\\n \\\"pos\\\": pos\\n }\\n }));\\n urlInfo = JSON.parse(urlInfo);\\n if (!urlInfo.url) throw \\\"暂时没有找到该视频的弹幕\\\";\\n let xml = fetch(buildUrl(\\\"https://azure.leuse.top/danmu\\\", {\\n params: urlInfo\\n }));\\n hideLoading();\\n if (!xml) {\\n throw \\\"还没有弹幕哟~\\\";\\n }\\n let path = \\\"hiker://files/cache/danmu/\\\" + urlInfo.platform + \\\"_\\\" + name + \\\"_\\\" + pos + \\\".xml\\\";\\n writeFile(path, '<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\\\n' + xml);\\n if (onlyDownload) return \\\"toast://下载完成\\\";\\n refreshVideoUrl({\\n danmu: path\\n });\\n back(false);\\n return \\\"toast://加载完成\\\";\\n } catch (e) {\\n hideLoading();\\n return \\\"toast://\\\" + e.toString();\\n }\\n }, onlyDownload),\\n col_type: \\\"text_3\\\"\\n});\\nd.push({\\n title: \\\"dm盒子搜索\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((key, onlyDownload) => {\\n let dm = getVar(\\\"dm_share\\\");\\n if (dm && !onlyDownload) {\\n clearVar(\\\"dm_share\\\");\\n refreshVideoUrl({\\n danmu: dm\\n });\\n back(false);\\n return \\\"toast://加载完成\\\";\\n } else {\\n return $(key, \\\"dm盒子搜索\\\").input(() => {\\n toast(\\\"下载完成弹幕后请重新点击搜索\\\");\\n return \\\"hiker://search?rule=dm盒子&s=\\\" + input;\\n });\\n }\\n }, key, onlyDownload),\\n col_type: \\\"text_3\\\"\\n});\\n\\nfunction search(d, name) {\\n const danmu = $.require(\\\"danmu\\\");\\n d.push({\\n col_type: \\\"line\\\"\\n });\\n d.push({\\n col_type: \\\"line\\\"\\n });\\n d.push({\\n col_type: \\\"line\\\"\\n });\\n let dmList = danmu.getDanMu(name);\\n\\n for (let anime of dmList.animes) {\\n d.push({\\n title: anime.animeTitle,\\n desc: anime.typeDescription,\\n col_type: \\\"avatar\\\",\\n url: $(\\\"\\\", \\\"请输入下载范围(1,\\\" + anime.episodes.length + \\\")\\\").input((animeTitle, episodes) => {\\n let [a, b] = input.split(/,|,/);\\n a = Number(a), b = Number(b);\\n if (Number.isNaN(a) || Number.isNaN(b)) {\\n return \\\"toast://请按格式输入数字\\\";\\n }\\n if (a < 1 || b > episodes.length) {\\n return \\\"toast://请输入规定范围内的数字\\\";\\n }\\n const danmu = $.require(\\\"danmu\\\");\\n try {\\n for (let i = a - 1, j = 1; i < b; i++, j++) {\\n let episode = episodes[i];\\n let dmTitle = animeTitle + \\\"_\\\" + episode.episodeTitle;\\n showLoading(\\\"正在下载:\\\" + episode.episodeTitle + \\\"\\\\t(\\\" + j + \\\"/\\\" + (b - a + 1) + \\\")\\\");\\n danmu.downloadDanMu(episode.episodeId, dmTitle);\\n }\\n } catch (e) {\\n log(e.toString());\\n hideLoading();\\n return \\\"toast://哦哦下载失败...\\\";\\n }\\n hideLoading();\\n return \\\"toast://下载完成\\\";\\n }, anime.animeTitle, anime.episodes),\\n pic_url: \\\"https://hikerfans.com/tubiao/movie/14.svg\\\"\\n });\\n d.push({\\n col_type: \\\"line\\\"\\n });\\n for (let episode of anime.episodes) {\\n let dmTitle = anime.animeTitle + \\\"_\\\" + episode.episodeTitle;\\n d.push({\\n title: episode.episodeTitle,\\n url: $(episode.episodeId).lazyRule((url, title, onlyDownload) => {\\n const danmu = $.require(\\\"danmu\\\");\\n let path = danmu.getLocalDanMu(input, title) || danmu.downloadDanMu(input, title);\\n if (onlyDownload) return \\\"toast://下载完成\\\";\\n let danmuText = fetch(path);\\n if (!danmuText) return \\\"toast://还没有弹幕哟~\\\";\\n refreshVideoUrl({\\n danmu: path\\n });\\n back(false);\\n return \\\"toast://加载完成\\\";\\n }, MY_PARAMS.durl, dmTitle, onlyDownload),\\n col_type: \\\"text_1\\\",\\n extra: {\\n longClick: [{\\n title: \\\"强制下载\\\",\\n js: $.toString((episodeTitle, episodeId) => {\\n showLoading(\\\"请等待\\\");\\n const danmu = $.require(\\\"danmu\\\");\\n danmu.downloadDanMu(episodeId, episodeTitle);\\n hideLoading();\\n return \\\"toast://重新下载完成,单击挂载。\\\";\\n }, dmTitle, episode.episodeId)\\n }]\\n }\\n });\\n }\\n d.push({\\n col_type: \\\"line_blank\\\"\\n });\\n }\\n if (!dmList.animes.length) {\\n d.push({\\n title: \\\"没有找到与[\\\" + name + \\\"]相关的弹幕\\\",\\n url: \\\"hiker://empty\\\",\\n desc: \\\"搜不到怎么办?\\\\n检查名称是否正确;可以尝试删除部分限定词,如第一季等;而且只能搜索番剧哦!其他弹幕可用dm盒子。\\\",\\n col_type: \\\"text_center_1\\\"\\n });\\n }\\n}\\nlet name = getParam(\\\"name\\\", MY_PARAMS.name);\\nif (name) {\\n try {\\n search(d, name);\\n } catch (e) {\\n d.push({\\n title: \\\"““ERROR””\\\",\\n desc: e.toString(),\\n col_type: \\\"text_1\\\"\\n });\\n }\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"公开工具\",\"path\":\"aliUtil\",\"rule\":\"//提供给规则使用的常用函数\\n$.exports = {\\n checkali(realurl) {\\n try {\\n if (realurl.includes(\\\"com/s/\\\") && realurl != \\\"\\\") {\\n let shareId = realurl.split(\\\"?\\\")[0].split(\\\"/\\\")[4];\\n let share = fetch(\\\"https://api.aliyundrive.com/adrive/v3/share_link/get_share_by_anonymous\\\", {\\n headers: {\\n 'content-type': 'application/json',\\n \\\"User-Agent\\\": PC_UA,\\n \\\"Referer\\\": \\\"https://www.aliyundrive.com/\\\"\\n },\\n body: {\\n \\\"share_id\\\": shareId\\n },\\n method: 'POST'\\n });\\n if (share.includes(\\\"share_link is\\\") || share.includes(\\\"share_link cannot\\\")) return false;\\n }\\n } catch (e) {}\\n return true;\\n },\\n bytesToSize(size) {\\n if (!size) {\\n return '0';\\n }\\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\\n let i = 0;\\n while (size >= 1024) {\\n size /= 1024;\\n i++;\\n }\\n size = i ? Number(size.toFixed(2)) : size;\\n return `${size} ${units[i]}`;\\n },\\n getCryptoJS() {\\n if (typeof CryptoJS === \\\"undefined\\\") {\\n eval(getCryptoJS());\\n return CryptoJS;\\n }\\n return CryptoJS;\\n },\\n matchAliUrl(text, isG) {\\n return $.require(\\\"alitest\\\").matchAliUrl(text, isG);\\n },\\n getIPv4Address() {\\n const NetworkInterface = java.net.NetworkInterface;\\n try {\\n for (let en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {\\n let intf = en.nextElement();\\n for (let enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {\\n let inetAddress = enumIpAddr.nextElement();\\n if (!inetAddress.isLoopbackAddress() && inetAddress instanceof java.net.Inet4Address) {\\n return String(inetAddress.getHostAddress());\\n }\\n }\\n }\\n } catch (ex) {\\n log(ex.toString());\\n }\\n return \\\"0.0.0.0\\\";\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"弹幕批量挂载\",\"path\":\"dmMount\",\"rule\":\"js:\\nlet d = [];\\naddListener(\\\"onClose\\\", () => clearMyVar(\\\"dllastTime\\\"));\\nsetPageTitle(\\\"弹幕挂载:\\\"+(MY_PARAMS.folderName||\\\"?\\\"));\\nd.push({\\n title: \\\"清空挂载列表\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n clearMyVar(\\\"dmlist\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"text_3\\\",\\n});\\nif(!MY_PARAMS.automaticadd){\\n MY_PARAMS.automaticadd = getItem(\\\"automaticadd\\\",\\\"1\\\");\\n setPageParams(MY_PARAMS);\\n}\\nd.push({\\n title: \\\"检测新增:\\\"+[\\\"关闭\\\",\\\"开启\\\"][MY_PARAMS.automaticadd||\\\"0\\\"],\\n url: $(\\\"#noLoading#\\\").lazyRule((v) => {\\n setItem(\\\"automaticadd\\\", v.automaticadd===\\\"1\\\"?\\\"0\\\":\\\"1\\\");\\n v.automaticadd = undefined;\\n setPageParams(v);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, MY_PARAMS),\\n col_type: \\\"text_3\\\",\\n});\\nd.push({\\n title: \\\"下载弹幕\\\",\\n col_type: \\\"text_3\\\",\\n url: \\\"hiker://page/loadDm#noHistory##noRecordHistory#\\\",\\n extra: {\\n onlyDownload: true,\\n name: MY_PARAMS.name||decodeURIComponent(getParam(\\\"name\\\",\\\"\\\"))\\n }\\n});\\nd.push({\\n col_type: \\\"line_blank\\\"\\n});\\nd.push({\\n title: \\\"““””\\\" + \\\"已挂载\\\".big(),\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n let dmlist = storage0.getMyVar(\\\"dmlist\\\", []);\\n let FileSorting = $.require(\\\"FileSorting\\\");\\n dmlist.sort((a, b) => FileSorting.nameCompare(a, b));\\n storage0.putMyVar(\\\"dmlist\\\", dmlist);\\n refreshPage(false);\\n return \\\"toast://排序完成\\\";\\n }),\\n col_type: \\\"text_center_1\\\"\\n});\\nlet file = $.require(\\\"https://hikerfans.com/weisyr/js/file.js?v=1\\\");\\nlet dmlist = storage0.getMyVar(\\\"dmlist\\\", []);\\n\\nfor (let i = 0; i < dmlist.length; i++) {\\n let dmname = dmlist[i];\\n d.push({\\n title: \\\"[\\\" + (i + 1) + \\\"]\\\\t\\\" + dmname,\\n url: $(\\\"#noLoading#\\\").lazyRule((i) => {\\n let dmlist = storage0.getMyVar(\\\"dmlist\\\", []);\\n dmlist.splice(i, 1);\\n storage0.putMyVar(\\\"dmlist\\\", dmlist);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, i),\\n col_type: \\\"text_1\\\"\\n });\\n}\\nd.push({\\n col_type: \\\"line_blank\\\"\\n});\\nd.push({\\n title: \\\"““””\\\" + \\\"本地未挂载\\\".big(),\\n url: $(\\\"是否清除所有本地弹幕文件?\\\\n(弹幕文件每三天会自动清除)\\\").confirm(() => {\\n let file = $.require(\\\"https://hikerfans.com/weisyr/js/file.js?v=1\\\");\\n file.deleteFiles(getPath(\\\"hiker://files/cache/danmu/\\\").slice(7));\\n clearMyVar(\\\"dmlist\\\");\\n refreshPage(false);\\n return \\\"toast://已删除\\\";\\n }),\\n col_type: \\\"text_center_1\\\"\\n});\\nlet dmListPath = getPath(\\\"hiker://files/cache/danmu/\\\").slice(7);\\nlet fileList = file.getFilePath(dmListPath, \\\"file\\\", \\\".xml\\\");\\nlet lastTime = 0;\\n\\nfor (let i = 0; i < fileList.length; i++) {\\n let dmfile = fileList[i];\\n lastTime = Math.max(lastTime, dmfile.lastModified);\\n if (dmlist.includes(dmfile.name)) continue;\\n d.push({\\n title: dmfile.name,\\n url: $(\\\"#noLoading#\\\").lazyRule((name) => {\\n let dmlist = storage0.getMyVar(\\\"dmlist\\\", []);\\n if (!dmlist.includes(name)) {\\n dmlist.push(name);\\n }\\n storage0.putMyVar(\\\"dmlist\\\", dmlist);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, dmfile.name),\\n col_type: \\\"text_1\\\"\\n });\\n}\\nlet lastRecord = Number(getMyVar(\\\"dllastTime\\\", \\\"-1\\\"));\\n\\nif (MY_PARAMS.automaticadd===\\\"1\\\"&&lastRecord!=-1&&lastRecord < lastTime) {\\n confirm({\\n title: \\\"新弹幕文件\\\",\\n content: \\\"检查到新下载的弹幕是否全部挂载?\\\",\\n confirm: $.toString((lastRecord, dmListPath) => {\\n let file = $.require(\\\"https://hikerfans.com/weisyr/js/file.js?v=1\\\");\\n let fileList = file.getFilePath(dmListPath, \\\"file\\\", \\\".xml\\\");\\n let dmlist = storage0.getMyVar(\\\"dmlist\\\", []);\\n fileList.forEach(v => {\\n if (!dmlist.includes(v.name)&&v.lastModified > lastRecord) {\\n dmlist.push(v.name);\\n }\\n });\\n storage0.putMyVar(\\\"dmlist\\\", dmlist);\\n refreshPage(false);\\n return \\\"toast://挂载成功。\\\";\\n }, lastRecord, dmListPath),\\n });\\n}\\nif(lastTime>=0){\\n putMyVar(\\\"dllastTime\\\", \\\"\\\" + lastTime);\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"主页处理\",\"path\":\"Main\",\"rule\":\"if (getItem(\\\"first\\\") == MY_RULE.version) {\\n $.require(\\\"sou\\\");\\n} else if (MY_PAGE === 1) {\\n let d = []\\n let time = getItem(\\\"first\\\", \\\"\\\") ? 6 : 20;\\n let id = Date.now();\\n let subPass = \\\"海阔视界规则分享,当前分享的是:合集规则订阅¥home_sub¥云盘君.简@@http://hiker.nokia.press/hikerule/rulelist.json?id=6591&debug=true\\\";\\n let content = `\\n 1. 本小程序所有代码全部开源,且本规则为学习目的,请于导入24小时内删除!!!\\n 2. 本小程序<b>完全免费</b>,如果你是付费购买的恭喜你被骗了。\\n 当然如果有能力想鼓励作者的可以${\\\"支持一下\\\".link(\\\"hiker://page/Donate.v#noHistory##noRecordHistory#\\\")}</a>(<small>点击可进入捐赠,可在主页菜单进入</small>)。\\n 3. 本小程序是在原版「云盘君」的基础进行的二次修改,请支持原版。\\n 4. 请「云盘君.简」的二次修改尊重一下原版,谢谢。\\n \\n <b>开始使用本规则即代表遵守规则条例</b>\\n 当前版本:${MY_RULE.version}\\n 如果你想保持最新版请${\\\"订阅此规则\\\".link(\\\"rule://\\\" + base64Encode(subPass))}\\n `;\\n let updateInfo = \\\"兄弟们好日子到头了,阿里云盘计划5月份开启第三方应用接口付费,总结就是不充钱转码只有标清,而且原画也可能限速(并且还限制下载线程,用极速模式播放也救不了),现在转码播放已经开始限制了只能看两分钟。原画暂且能用,且用且珍惜!\\\\n新加原转模式:利用转存+open接口获取转码链接(暂时未限制)\\\\n0504:增加我的阿里云盘\\\\n0513:每日首次打开我的阿里将自动签到\\\";\\n \\n d.push({\\n title: \\\"““””<strong>使用前须知</strong>\\\".big(),\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n d.push({\\n title: content.trim().replace(/\\\\n\\\\s*?/g, \\\"<br>\\\"),\\n \\\"col_type\\\": \\\"rich_text\\\"\\n }, {\\n col_type: \\\"line\\\"\\n }, {\\n title: time + \\\"秒后继续\\\",\\n url: \\\"toast://请认真阅读以上内容\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n id: id + \\\"timer\\\"\\n }\\n });\\n if (updateInfo) {\\n confirm({\\n title: \\\"更新内容\\\",\\n content: updateInfo,\\n confirm(){},\\n cancel(){}\\n });\\n }\\n setResult(d);\\n while (time != 0) {\\n java.lang.Thread.sleep(1000);\\n time -= 1;\\n updateItem(id + \\\"timer\\\", {\\n title: time + \\\"秒后继续\\\"\\n });\\n }\\n updateItem(id + \\\"timer\\\", {\\n title: \\\"““我同意以上要求””\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((v) => {\\n setItem(\\\"first\\\", String(v));\\n refreshPage();\\n return \\\"toast://感谢您的理解\\\";\\n }, MY_RULE.version),\\n col_type: \\\"text_center_1\\\"\\n });\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"捐赠\",\"path\":\"Donate.v\",\"rule\":\"js:\\nlet d = [];\\nsetPageTitle(\\\"捐赠/支持\\\");\\nd.push({\\n title: \\\"捐赠/支持\\\",\\n desc: \\\"这个捐赠不能为你带来特权,但您的支持是我更新创作的动力。\\\",\\n col_type: \\\"text_center_1\\\",\\n url: \\\"toast://感谢您的支持\\\"\\n});\\nd.push({\\n col_type: \\\"pic_1_full\\\",\\n url: \\\"https://gitee.com/LoyDgIk/LoyDgIk_Rule/raw/master/67d8f0187f0186c1.png\\\",\\n pic_url: \\\"https://gitee.com/LoyDgIk/LoyDgIk_Rule/raw/master/67d8f0187f0186c1.png\\\"\\n});\\nd.push({\\n col_type: \\\"text_center_1\\\",\\n title: \\\"““””\\\" + \\\"图片加载缓慢请稍等\\\".small().fontcolor(\\\"Gray\\\"),\\n url: \\\"hiker://empty\\\",\\n extra: {\\n lineVisible: false\\n }\\n});\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"TVBOX推送\",\"path\":\"tvboxPush\",\"rule\":\"js:\\n(function() {\\n let d = [];\\n const {\\n pageId,\\n shareId,\\n folderName,\\n fileId\\n } = MY_PARAMS;\\n setPageTitle(\\\"TVBOX推送:\\\" + folderName);\\n const {\\n aliTokensFilepath\\n } = $.require(\\\"tokenPath\\\");\\n let refreshToken = \\\"\\\";\\n if (!fileExist(aliTokensFilepath)) {\\n toast(\\\"请先登陆登录账号\\\");\\n back(false);\\n return;\\n } else {\\n refreshToken = $.require(aliTokensFilepath).refresh_token;\\n }\\n\\n function getPush(name, url) {\\n let push = {\\n \\\"share_id\\\": shareId,\\n \\\"refresh_token\\\": refreshToken,\\n \\\"name\\\": name,\\n \\\"url\\\": url\\n };\\n return \\\"hiker://page/push#noHistory##noRecordHistory#?rule=XYQ推送&pushurl=\\\" + encodeURIComponent(JSON.stringify(push));\\n }\\n d.push({\\n title: \\\"推送阿里分享链接\\\",\\n url: \\\"hiker://page/push#noHistory##noRecordHistory#?rule=XYQ推送&pushurl=\\\" + encodeURIComponent(\\\"https://www.aliyundrive.com/s/\\\" + shareId + (fileId ? \\\"/folder/\\\" + fileId : \\\"\\\")),\\n col_type: \\\"text_2\\\",\\n extra: {\\n inheritTitle: false\\n }\\n });\\n let all = {\\n title: \\\"推送全部已加载视频\\\",\\n col_type: \\\"text_2\\\",\\n url: \\\"hiker://empty\\\",\\n extra: {\\n inheritTitle: false\\n }\\n }\\n d.push(all);\\n let allUrls = [];\\n let list = findItemsByCls(\\\"v\\\" + pageId);\\n if (!Array.isArray(list) || list.length === 0) {\\n /*toast(\\\"还没有加载完成的视频\\\");\\n back(false);\\n return;*/\\n d.push({\\n title: \\\"““””\\\" + \\\"~~~还木有视频哦~~~\\\".fontcolor(\\\"grey\\\"),\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n all.url = \\\"toast://没有视频无法推送\\\";\\n } else {\\n list.forEach(v => {\\n v.col_type = v.type;\\n let name = v.extra.pageTitle;\\n let url = name.replace(/\\\\#/g, '_').replace(/\\\\$/g, '_') + \\\"$video|\\\" + v.extra.id;\\n allUrls.push(url);\\n v.url = getPush(name, url);\\n v.extra.cls = v.extra.id = undefined;\\n d.push(v);\\n });\\n all.url = getPush(folderName, allUrls.join(\\\"#\\\"));\\n }\\n setResult(d);\\n})();\"},{\"col_type\":\"movie_3\",\"name\":\"封面搜索\",\"path\":\"frontCover\",\"rule\":\"js:\\nlet d = [];\\nlet key = getMyVar(\\\"frontcoverkey\\\", \\\"\\\");\\nd.push({\\n title: \\\"搜索\\\",\\n col_type: \\\"input\\\",\\n url: $.toString(() => {\\n putMyVar(\\\"frontcoverkey\\\", input.trim());\\n refreshPage(false);\\n }),\\n extra: {\\n defaultValue: key || getMyVar(\\\"s\\\", \\\"\\\")\\n }\\n});\\nif (key) {\\n let r = request('https://m.douban.com/search/?query=' + encodeURIComponent(key))\\n let list = pdfa(r, \\\".search-results&&img\\\");\\n for (let it of list) {\\n let pic = pdfh(it, \\\"img&&src\\\");\\n d.push({\\n pic_url: pic,\\n url: $(\\\"#noLoading#\\\").lazyRule((pic) => {\\n putMyVar(\\\"frontcoverpic\\\", pic);\\n back(false);\\n return \\\"toast://设置成功\\\";\\n }, pic),\\n col_type: \\\"pic_2_card\\\"\\n });\\n }\\n\\n}\\naddListener(\\\"onClose\\\", () => {\\n let pic = getMyVar(\\\"frontcoverpic\\\");\\n clearMyVar(\\\"frontcoverpic\\\");\\n clearMyVar(\\\"frontcoverkey\\\");\\n setPagePicUrl(pic);\\n});\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"规则文件\",\"path\":\"configs\",\"rule\":\"const path = \\\"hiker://files/rules/LoyDgIk/aliSimpleRules.json\\\";\\nlet data;\\n\\nfunction getJson() {\\n if (Array.isArray(data)) {\\n return data;\\n }\\n try {\\n data = JSON.parse(readFile(path) || \\\"[]\\\");\\n } catch (e) {\\n deleteFile(path);\\n data = [];\\n }\\n return data;\\n}\\n\\nfunction saveJson(json) {\\n saveFile(path, JSON.stringify(json));\\n}\\n\\nfunction getUsefulJson() {\\n return getJson().filter(v => !v.forbidden);\\n}\\n\\nfunction getForbiddenJson() {\\n return getJson().filter(v => v.forbidden);\\n}\\n\\nfunction getGroupJson(group) {\\n return getJson().filter(v => v.group === group);\\n}\\n\\nfunction getGroupNames() {\\n return Array.from(new Set(getJson().map(v => v.group))).filter(v => v);\\n}\\n\\nif (!fileExist(path) && MY_RULE) {\\n let rules = $.require(\\\"rules\\\");\\n $.hiker.window = {};\\n eval.call(null, fetch('hiker://assets/beautify.js'));\\n rules = rules.map((v) => {\\n v.find = window.js_beautify(v.find.toString().replace(/function.*?\\\\(s.*?page\\\\).*?\\\\{/, \\\"\\\").replace(/(\\\\}[\\\\s\\\\S].*?)$/, \\\"\\\"));\\n if (v.findAliUrl) {\\n v.findAliUrl = window.js_beautify(v.findAliUrl.toString().replace(/function.*?\\\\(input\\\\).*?\\\\{/, \\\"\\\").replace(/(\\\\}[\\\\s\\\\S].*?)$/, \\\"\\\"));\\n }\\n return v;\\n });\\n saveJson(rules);\\n toast(\\\"已初始化\\\");\\n}\\n$.exports = {\\n getJson,\\n saveJson,\\n getUsefulJson,\\n getForbiddenJson,\\n path,\\n getGroupNames,\\n getGroupJson\\n};\"},{\"col_type\":\"movie_3\",\"name\":\"规则管理\",\"path\":\"ruleManage\",\"rule\":\"js:\\nvar d = [];\\nsetPageTitle(\\\"规则管理\\\");\\nlet configs = $.require(\\\"configs\\\");\\nlet arr = configs.getJson();\\nlet length = arr.length;\\nlet groups = configs.getGroupNames();\\nlet group = getItem(\\\"ruleManage_group\\\", \\\"\\\");\\nif (!groups.includes(group)) {\\n clearItem(\\\"ruleManage_group\\\");\\n group = \\\"\\\";\\n}\\nd.push({\\n title: \\\"新增\\\",\\n url: \\\"hiker://page/ruleEdit#noRecordHistory##noHistory##noRefresh#\\\",\\n col_type: \\\"icon_small_4\\\",\\n pic_url: \\\"hiker://images/icon_domain_config\\\",\\n extra: {\\n pageTitle: \\\"新增规则\\\"\\n }\\n});\\n\\nd.push({\\n title: \\\"分享\\\",\\n url: $(\\\"-1\\\", \\\"输入你要分享规则的序号\\\\n-1全部,-2已启用的,-3已禁用的,-4,组名分享组,多个用','隔开\\\").input((length) => {\\n let indexc = input.split(/,|,/);\\n let indexs = [];\\n let mo = parseInt(indexc[0]);\\n if (!(indexc.length !== 0 && mo < 0 && mo > -5)) {\\n for (let it of indexc) {\\n let num = parseInt(it);\\n if (Number.isNaN(num) || num >= length || num < 0) {\\n return \\\"toast://数字不合法\\\";\\n }\\n indexs.push(num);\\n }\\n }\\n return $([\\\"HIKER\\\", \\\"TXT\\\"].concat(getPastes()), 2, \\\"分享方式\\\").select((mo, indexs, ext) => {\\n function up(rules) {\\n let ruleb64 = base64Encode(JSON.stringify(rules));\\n let getPass = (length, rule, type) => \\\"海阔视界云简搜索引擎,共「\\\" + length + \\\"」条,复制整条口令打开软件就会自动导入$\\\" + rule + \\\"$\\\" + type + \\\"@import=js:$.require('import?rule='+\\\" + JSON.stringify(MY_RULE.title) + \\\")(input)\\\";\\n if (getPastes().includes(input)) {\\n let u = sharePaste(ruleb64, input);\\n return \\\"copy://\\\" + getPass(rules.length, u, \\\"b\\\");\\n } else {\\n let path = \\\"hiker://files/rules/LoyDgIk/share/云简搜索引擎规则「\\\" + rules.length + \\\"」条.\\\" + (input === \\\"HIKER\\\" ? \\\"hiker\\\" : \\\"txt\\\");\\n writeFile(path, getPass(rules.length, ruleb64, \\\"a\\\"));\\n return \\\"share://\\\" + path;\\n }\\n }\\n let rules;\\n if (mo === -1) {\\n rules = $.require(\\\"configs\\\").getJson();\\n } else if (mo === -2) {\\n rules = $.require(\\\"configs\\\").getUsefulJson();\\n } else if (mo === -3) {\\n rules = $.require(\\\"configs\\\").getForbiddenJson();\\n } else if (mo === -4) {\\n let group = ext;\\n rules = $.require(\\\"configs\\\").getGroupJson(ext);\\n if (!rules.length) return \\\"toast://不存在该组\\\";\\n } else {\\n rules = $.require(\\\"configs\\\").getJson().filter((v, i) => indexs.includes(i));\\n }\\n rules = rules.map((v) => {\\n v.user = undefined;\\n v.forbidden = undefined;\\n return v;\\n });\\n return up(rules);\\n }, mo, indexs, indexc[1]);\\n\\n }, length),\\n col_type: \\\"icon_small_4\\\",\\n pic_url: \\\"hiker://images/icon_share_green\\\"\\n});\\nd.push({\\n title: \\\"重置\\\",\\n url: $(\\\"你确定重置?\\\\n该操作会删除现有规则,恢复自带规则。\\\").confirm((path) => {\\n deleteFile(path);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, $.require(\\\"configs\\\").path),\\n col_type: \\\"icon_small_4\\\",\\n pic_url: \\\"hiker://images/icon_refresh\\\"\\n});\\nd.push({\\n title: \\\"清空\\\",\\n url: $(\\\"你确定全部删除?\\\\n该操作会删除现有规则。\\\").confirm((path) => {\\n writeFile(path, \\\"[]\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, $.require(\\\"configs\\\").path),\\n col_type: \\\"icon_small_4\\\",\\n pic_url: \\\"hiker://images/icon_code_view\\\"\\n});\\n\\nd.push({\\n //title: '<font color=\\\"#13B61B\\\">▐ </font><b>规则列表<b> (' + String(length).fontcolor(\\\"#ff6601\\\") + \\\")\\\",\\n col_type: \\\"rich_text\\\",\\n});\\nlet countTitle = d.at(-1);\\nd.push({\\n title: group ? \\\"全部\\\" : \\\"““全部””\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((group, length) => {\\n if (group) {\\n clearItem(\\\"ruleManage_group\\\");\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n } else {\\n return $(\\\"\\\", \\\"批量删除\\\\n格式:开始位置,结束位置(区间[0,\\\" + (length - 1) + \\\"])\\\").input((length) => {\\n let [start, end] = input.split(/,|,/);\\n start = parseInt(start), end = parseInt(end);\\n if (Number.isNaN(start) || Number.isNaN(end) || start < 0 || end > length - 1 || start > end) {\\n return \\\"toast://数字不合法\\\";\\n }\\n let number = end - start + 1;\\n return $(\\\"确认删除:[\\\" + start + \\\",\\\" + end + \\\"]\\\\n共\\\" + number + \\\"条搜索引擎\\\").confirm((start, number) => {\\n let rules = $.require(\\\"configs\\\").getJson();\\n rules.splice(start, number);\\n $.require(\\\"configs\\\").saveJson(rules);\\n refreshPage(false);\\n }, start, number);\\n }, length);\\n }\\n }, group, length),\\n col_type: \\\"scroll_button\\\"\\n});\\nfor (let it of groups) {\\n d.push({\\n title: it === group ? \\\"““\\\" + it + \\\"””\\\" : it,\\n url: $(\\\"#noLoading#\\\").lazyRule((it, group) => {\\n if (group !== it) {\\n setItem(\\\"ruleManage_group\\\", it);\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n } else {\\n return $([\\\"置顶\\\", \\\"置底\\\", \\\"改名\\\", \\\"删除\\\"]).select((it) => {\\n if (\\\"改名\\\" === input) {\\n return $(it, \\\"请输入新名称\\\").input((it) => {\\n let rules = $.require(\\\"configs\\\").getJson();\\n rules.forEach(v => {\\n if (it === v.group) {\\n v.group = input;\\n }\\n });\\n $.require(\\\"configs\\\").saveJson(rules);\\n clearItem(\\\"ruleManage_group\\\");\\n refreshPage(false);\\n }, it);\\n } else if (\\\"删除\\\" === input) {\\n return $(\\\"是否删除该组搜索引擎:\\\" + it).confirm((it) => {\\n let rules = $.require(\\\"configs\\\").getJson();\\n rules = rules.filter(v => v.group !== it);\\n $.require(\\\"configs\\\").saveJson(rules);\\n clearItem(\\\"ruleManage_group\\\");\\n refreshPage(false);\\n }, it);\\n }\\n let rules = $.require(\\\"configs\\\").getJson();\\n let tgRules = [],\\n txRules = [];\\n rules.forEach((v) => {\\n if (it === v.group) {\\n tgRules.push(v);\\n } else {\\n txRules.push(v);\\n }\\n });\\n if (input === \\\"置顶\\\") {\\n tgRules = tgRules.concat(txRules);\\n } else {\\n tgRules = txRules.concat(tgRules);\\n }\\n $.require(\\\"configs\\\").saveJson(tgRules);\\n refreshPage(false);\\n }, it);\\n }\\n\\n }, it, group),\\n col_type: \\\"scroll_button\\\"\\n });\\n}\\n\\nlet count = d.length;\\n\\nfor (let i = 0; i < length; i++) {\\n let it = arr[i];\\n if (group && group !== it.group) continue;\\n let user = it.user || {};\\n\\n d.push({\\n title: '““””[' + i + ']<b> ' + it.name + (it.group ? \\\"|\\\" + it.group.small() : \\\"\\\") + '<b>' + (it.forbidden ? \\\" #““禁用””\\\".small() : \\\"\\\") + (it.registerUrl && !(user.password || user.account || user.extra) ? \\\" #需要登录\\\".small() : \\\"\\\"),\\n url: $([\\\"编辑\\\", \\\"账号\\\", \\\"分享\\\", \\\"禁用/启用\\\", \\\"移动\\\", \\\"置顶\\\", \\\"删除\\\"], 1, \\\"操作:\\\" + it.name).select((index, length, group) => {\\n if (input === \\\"编辑\\\") {\\n return \\\"hiker://page/ruleEdit#noRecordHistory##noHistory##noRefresh#\\\";\\n } else if (input === \\\"账号\\\") {\\n return \\\"hiker://page/password#noRecordHistory##noHistory##noRefresh#\\\";\\n } else if (input === \\\"分享\\\") {\\n let ops = getPastes();\\n ops.unshift(\\\"完整口令\\\");\\n return $(ops, 2, \\\"分享方式\\\").select((index) => {\\n let rule = $.require(\\\"configs\\\").getJson()[index];\\n rule.user = undefined;\\n rule.forbidden = undefined;\\n let ruleb64 = base64Encode(JSON.stringify(rule));\\n let getPass = (name, rule, type) => \\\"海阔视界,「\\\" + name + \\\"」云简搜索引擎,复制整条口令打开软件就会自动导入$\\\" + rule + \\\"$\\\" + type + \\\"@import=js:$.require('import?rule='+\\\" + JSON.stringify(MY_RULE.title) + \\\")(input)\\\";\\n if (input == \\\"完整口令\\\") {\\n return \\\"copy://\\\" + getPass(rule.name, ruleb64, \\\"a\\\");\\n } else {\\n let u = sharePaste(ruleb64, input);\\n return \\\"copy://\\\" + getPass(rule.name, u, \\\"b\\\");\\n }\\n }, index);\\n } else if (input === \\\"移动\\\") {\\n return $(index + \\\"\\\", \\\"输入位置\\\").input((index, length) => {\\n let newIndex = Number(input);\\n if (Number.isNaN(newIndex) || newIndex >= length) {\\n return \\\"toast://不和规的位置\\\";\\n }\\n let rules = $.require(\\\"configs\\\").getJson();\\n let rule = rules.splice(index, 1)[0];\\n rules.splice(newIndex, 0, rule);\\n $.require(\\\"configs\\\").saveJson(rules);\\n refreshPage(false);\\n }, index, length);\\n } else if (input === \\\"置顶\\\") {\\n let newIndex = 0;\\n let rules = $.require(\\\"configs\\\").getJson();\\n if (group) {\\n newIndex = rules.findIndex(v => v.group === group);\\n newIndex = newIndex === -1 ? 0 : newIndex;\\n }\\n let rule = rules.splice(index, 1)[0];\\n rules.splice(newIndex, 0, rule);\\n $.require(\\\"configs\\\").saveJson(rules);\\n refreshPage(false);\\n } else if (input === \\\"删除\\\") {\\n return $(\\\"确认删除?\\\").confirm((index) => {\\n let rules = $.require(\\\"configs\\\").getJson();\\n let rule = rules.splice(index, 1)[0];\\n $.require(\\\"configs\\\").saveJson(rules);\\n refreshPage(false);\\n return \\\"toast://已删除\\\" + rule.name;\\n }, index);\\n } else {\\n let arr = $.require(\\\"configs\\\").getJson();\\n let rule = arr[index];\\n rule.forbidden = !rule.forbidden;\\n $.require(\\\"configs\\\").saveJson(arr);\\n refreshPage(false);\\n //return \\\"toast://\\\" + (rule.forbidden ? \\\"禁用\\\" : \\\"启用\\\") + rule.name;\\n }\\n }, i, length, group),\\n col_type: \\\"text_1\\\",\\n extra: {\\n i: i,\\n pageTitle: it.name\\n }\\n });\\n}\\ncountTitle.title = '<font color=\\\"#13B61B\\\">▐ </font><b>规则列表<b> (' + ((d.length - count) + \\\"/\\\" + length).fontcolor(\\\"#ff6601\\\") + \\\")\\\";\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"规则编辑\",\"path\":\"ruleEdit\",\"rule\":\"js:\\nvar d = [];\\n\\naddListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"ps_name\\\");\\n clearMyVar(\\\"ps_find\\\");\\n clearMyVar(\\\"ps_findAliUrl\\\");\\n clearMyVar(\\\"ps_page\\\");\\n clearMyVar(\\\"ps_registerUrl\\\");\\n clearMyVar(\\\"ps_basicUrl\\\");\\n clearMyVar(\\\"ps_group\\\");\\n clearMyVar(\\\"ps_author\\\");\\n clearMyVar(\\\"ps_ruleType\\\");\\n}));\\nlet urlIndex = parseInt(getParam(\\\"index\\\", \\\"\\\"));\\nurlIndex = Number.isNaN(urlIndex) ? void(0) : urlIndex;\\nlet index = void(0) === urlIndex ? MY_PARAMS.i : urlIndex;\\nlet isImport = !!getParam(\\\"isImport\\\", \\\"\\\");\\nlet arr = $.require(\\\"configs\\\").getJson();\\nlet obj;\\nif (isImport) {\\n try {\\n obj = $.require(\\\"hiker://files/_cache/yunSimpleImport.json\\\");\\n let tip = index !== void(0) ? \\\"更新规则\\\" : \\\"导入规则\\\";\\n setPageTitle(tip + \\\":\\\" + obj.name);\\n d.push({\\n title: \\\"‘‘\\\" + tip + \\\"’’\\\",\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n\\n } catch (e) {\\n obj = {};\\n back();\\n toast(\\\"导入错误\\\");\\n }\\n} else if (index !== void(0)) {\\n obj = arr[index];\\n setPageTitle(\\\"编辑规则:\\\" + obj.name);\\n if (obj.lastModify) {\\n d.push({\\n title: \\\"上次修改:\\\" + $.dateFormat(obj.lastModify, \\\"yyyy-MM-dd HH:mm:ss\\\"),\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n }\\n} else {\\n obj = {\\n page: true,\\n author: com.example.hikerview.utils.PreferenceMgr.getString(getCurrentActivity(), \\\"myName\\\", \\\"\\\")\\n };\\n setPageTitle(\\\"新建规则\\\");\\n}\\n\\nd.push({\\n col_type: \\\"input\\\",\\n desc: \\\"名字(必填)\\\",\\n extra: {\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_name\\\", input);\\n }),\\n defaultValue: obj.name,\\n titleVisible: false\\n }\\n});\\nd.push({\\n title: \\\"签名\\\",\\n col_type: \\\"input\\\",\\n desc: \\\"作者(选填)\\\",\\n url: $.toString(() => {\\n let author = getMyVar(\\\"ps_author\\\", \\\"\\\");\\n let my = String(com.example.hikerview.utils.PreferenceMgr.getString(getCurrentActivity(), \\\"myName\\\", \\\"\\\"));\\n let newAuthor = \\\"\\\";\\n if (author && !author.includes(my)) {\\n newAuthor = author + \\\"&\\\" + my;\\n } else {\\n newAuthor = my;\\n }\\n updateItem(\\\"id@ps_author\\\", {\\n extra: Object.assign(findItem(\\\"id@ps_author\\\").extra, {\\n defaultValue: newAuthor\\n })\\n });\\n }),\\n extra: {\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_author\\\", input);\\n }),\\n defaultValue: obj.author,\\n id: \\\"id@ps_author\\\"\\n //titleVisible: false\\n }\\n});\\nd.push({\\n title: \\\"选择\\\",\\n col_type: \\\"input\\\",\\n desc: \\\"分组(选填)\\\",\\n url: $.toString(() => {\\n let group = $.require(\\\"configs\\\").getGroupNames();\\n if (!group.length) {\\n return \\\"\\\";\\n }\\n return $(group).select(() => {\\n let extra = findItem(\\\"ruleEditGroup\\\").extra;\\n updateItem(\\\"ruleEditGroup\\\", {\\n extra: Object.assign(extra, {\\n defaultValue: input\\n })\\n });\\n });\\n }),\\n extra: {\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_group\\\", input);\\n }),\\n id: \\\"ruleEditGroup\\\",\\n defaultValue: obj.group,\\n }\\n});\\nd.push({\\n col_type: \\\"input\\\",\\n desc: \\\"搜索规则(必填)\\\\n内置变量:s搜索关键词,page页数,basicUrl基本链接,user用户账号信息(user.account,user.password)\\\",\\n extra: {\\n type: \\\"textarea\\\",\\n height: 3,\\n highlight: true,\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_find\\\", input);\\n }),\\n defaultValue: obj.find,\\n titleVisible: false,\\n }\\n});\\nd.push({\\n col_type: \\\"input\\\",\\n desc: \\\"URL规则(选填)\\\\n内置变量:input链接,basicUrl基本链接\\\",\\n extra: {\\n type: \\\"textarea\\\",\\n height: 3,\\n highlight: true,\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_findAliUrl\\\", input);\\n }),\\n defaultValue: obj.findAliUrl,\\n titleVisible: false,\\n }\\n});\\nd.push({\\n col_type: \\\"input\\\",\\n desc: \\\"基本链接(选填) 代码中用basicUrl引用\\\",\\n extra: {\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_basicUrl\\\", input);\\n }),\\n defaultValue: obj.basicUrl,\\n titleVisible: false,\\n }\\n});\\nd.push({\\n col_type: \\\"input\\\",\\n desc: \\\"注册地址(选填)\\\",\\n extra: {\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_registerUrl\\\", input);\\n }),\\n defaultValue: obj.registerUrl,\\n titleVisible: false,\\n }\\n});\\nd.push({\\n title: \\\"是否可以翻页:\\\" + obj.page,\\n col_type: \\\"text_2\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((page) => {\\n let isPage = !!getMyVar(\\\"ps_page\\\", page ? \\\"1\\\" : \\\"\\\");\\n putMyVar(\\\"ps_page\\\", isPage ? \\\"\\\" : \\\"1\\\");\\n updateItem(\\\"ruleedps_page\\\", {\\n title: \\\"是否可以翻页:\\\" + !isPage\\n });\\n return \\\"hiker://empty\\\";\\n }, obj.page),\\n extra: {\\n id: \\\"ruleedps_page\\\"\\n }\\n});\\nputMyVar(\\\"ps_ruleType\\\", (obj.ruleType||\\\"\\\"));\\nd.push({\\n title: \\\"解析模式:\\\" + (obj.ruleType || \\\"JS\\\"),\\n col_type: \\\"text_2\\\",\\n url: $([\\\"JS\\\", \\\"JSON\\\", \\\"HTML\\\"]).select(() => {\\n\\n putMyVar(\\\"ps_ruleType\\\", input === \\\"JS\\\" ? \\\"\\\" : input);\\n updateItem(\\\"ps_ruleType\\\", {\\n title: \\\"解析模式:\\\" + input\\n });\\n return \\\"hiker://empty\\\";\\n }),\\n extra: {\\n id: \\\"ps_ruleType\\\"\\n }\\n});\\nd.push({\\n title: \\\"删除\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((index, urlIndex) => {\\n if (index === void(0)) {\\n return \\\"toast://此项无法删除\\\";\\n }\\n if (urlIndex !== void(0)) {\\n return \\\"toast://正在更新规则,删除请从规则管理进入\\\";\\n }\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"确定要删除此规则吗?注意删除后无法恢复\\\",\\n confirm: $.toString((index) => {\\n let arr = $.require(\\\"configs\\\").getJson();\\n arr.splice(index, 1);\\n $.require(\\\"configs\\\").saveJson(arr);\\n back(true);\\n return \\\"toast://删除成功\\\";\\n }, index)\\n });\\n return \\\"hiker://empty\\\"\\n }, index, urlIndex),\\n col_type: \\\"text_3\\\",\\n});\\nd.push({\\n title: \\\"测试\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(page => {\\n let testKeyword = getItem(\\\"testKeyword\\\", \\\"\\\");\\n return $(testKeyword, \\\"请输入关键词\\\").input((page) => {\\n setItem(\\\"testKeyword\\\", input);\\n let name = getMyVar(\\\"ps_name\\\", \\\"\\\");\\n let find = getMyVar(\\\"ps_find\\\", \\\"\\\");\\n if (!find) {\\n return \\\"toast://搜索规则不能为空\\\";\\n }\\n let arr = $.require(\\\"configs\\\").getJson();\\n let testRule = {\\n name: name,\\n find: find,\\n basicUrl: getMyVar(\\\"ps_basicUrl\\\", \\\"\\\"),\\n findAliUrl: getMyVar(\\\"ps_findAliUrl\\\", \\\"\\\"),\\n page: !!getMyVar(\\\"ps_page\\\", page ? \\\"1\\\" : \\\"\\\"),\\n ruleType: getMyVar(\\\"ps_ruleType\\\", \\\"\\\"),\\n };\\n return $(\\\"hiker://empty#noRecordHistory##noHistory#?fypage\\\").rule((testRule, key) => {\\n if (MY_PAGE > 1 && !testRule.page) setResult([]);\\n setResult($.require(\\\"data\\\").carryRule(testRule, key, MY_PAGE, 0));\\n }, testRule, input);\\n }, page);\\n }, obj.page),\\n col_type: \\\"text_3\\\",\\n});\\n\\n\\nd.push({\\n title: \\\"保存\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((index, page, isImport) => {\\n let name = getMyVar(\\\"ps_name\\\", \\\"\\\");\\n if (!name) {\\n return \\\"toast://名字得有一个吧\\\";\\n }\\n let find = getMyVar(\\\"ps_find\\\", \\\"\\\");\\n if (!find) {\\n return \\\"toast://搜索规则不能为空\\\";\\n }\\n let arr = $.require(\\\"configs\\\").getJson();\\n let obj1 = {\\n name: name,\\n author: getMyVar(\\\"ps_author\\\", \\\"\\\"),\\n find: find,\\n basicUrl: getMyVar(\\\"ps_basicUrl\\\", \\\"\\\"),\\n findAliUrl: getMyVar(\\\"ps_findAliUrl\\\", \\\"\\\"),\\n page: !!getMyVar(\\\"ps_page\\\", page ? \\\"1\\\" : \\\"\\\"),\\n registerUrl: getMyVar(\\\"ps_registerUrl\\\", \\\"\\\") || undefined,\\n lastModify: Date.now(),\\n group: getMyVar(\\\"ps_group\\\", \\\"\\\"),\\n ruleType: getMyVar(\\\"ps_ruleType\\\", \\\"\\\"),\\n };\\n if (index === void(0)) {\\n if (arr.some(v => v.name === name)) {\\n return \\\"toast://已经存在该规则\\\";\\n }\\n if (obj1.group) {\\n let group = obj1.group;\\n let index = arr.findIndex(v => v.group === group);\\n if (index === -1) {\\n arr.unshift(obj1);\\n } else {\\n arr.splice(index, 0, obj1);\\n }\\n } else {\\n if (isImport) {\\n arr.push(obj1);\\n } else {\\n arr.unshift(obj1);\\n }\\n }\\n } else {\\n let namey = arr[index].name;\\n if (name !== namey) {\\n if (arr.some(v => v.name === name)) {\\n return \\\"toast://已经存在该规则\\\";\\n }\\n }\\n obj1 = Object.assign(arr[index], obj1);\\n arr.splice(index, 1, obj1);\\n }\\n $.require(\\\"configs\\\").saveJson(arr);\\n back(true);\\n return \\\"toast://保存成功\\\";\\n }, index, obj.page, isImport),\\n col_type: \\\"text_3\\\",\\n});\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"规则账号\",\"path\":\"password\",\"rule\":\"js:\\n(function() {\\n var d = [];\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"ps_account\\\");\\n clearMyVar(\\\"ps_password\\\");\\n clearMyVar(\\\"ps_extra\\\");\\n }));\\n let index = MY_PARAMS.i;\\n let arr = $.require(\\\"configs\\\").getJson();\\n let obj = arr[index] || {};\\n setPageTitle(\\\"设置账号:\\\" + obj.name);\\n let registerUrl = obj.registerUrl;\\n if (registerUrl) {\\n d.push({\\n col_type: \\\"text_center_1\\\",\\n title: \\\"前往注册\\\",\\n url: $(\\\"hiker://empty#noRecordHistory##noHistory#\\\").rule((registerUrl)=>{\\n setResult([{\\n col_type:\\\"x5_webview_single\\\",\\n url:registerUrl,\\n desc:\\\"float&&100%\\\"\\n }]);\\n }, registerUrl),\\n extra:{\\n pageTitle: \\\"注册账号:\\\" + obj.name\\n }\\n });\\n }\\n obj = obj.user || {};\\n d.push({\\n col_type: \\\"input\\\",\\n desc: \\\"用户名\\\",\\n extra: {\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_account\\\", input);\\n }),\\n defaultValue: obj.account,\\n titleVisible: false\\n }\\n });\\n d.push({\\n col_type: \\\"input\\\",\\n desc: \\\"密码\\\",\\n extra: {\\n type: \\\"password\\\",\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_password\\\", input);\\n }),\\n defaultValue: obj.password,\\n titleVisible: false,\\n }\\n });\\n d.push({\\n col_type: \\\"input\\\",\\n desc: \\\"额外\\\",\\n extra: {\\n type: \\\"textarea\\\",\\n onChange: $.toString(() => {\\n putMyVar(\\\"ps_extra\\\", input);\\n }),\\n defaultValue: obj.extra,\\n titleVisible: false,\\n height: -1\\n }\\n });\\n d.push({\\n title: \\\"保存\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((index) => {\\n let account = getMyVar(\\\"ps_account\\\", \\\"\\\");\\n let password = getMyVar(\\\"ps_password\\\", \\\"\\\");\\n let extra = getMyVar(\\\"ps_extra\\\", \\\"\\\");\\n /*if (!(account||password||extra)) {\\n return \\\"toast://不能全部为空\\\";\\n }*/\\n let arr = $.require(\\\"configs\\\").getJson();\\n let item = arr[index];\\n item.user = {};\\n item.user.account = account\\n item.user.password = password;\\n item.user.extra = extra;\\n if (index === void(0)) {\\n return \\\"toast://id错误\\\";\\n } else {\\n arr.splice(index, 1, item);\\n }\\n $.require(\\\"configs\\\").saveJson(arr);\\n back(true);\\n return \\\"toast://保存成功\\\";\\n }, index),\\n col_type: \\\"text_center_1\\\",\\n });\\n setResult(d);\\n})()\"},{\"col_type\":\"movie_3\",\"name\":\"规则导入\",\"path\":\"import\",\"rule\":\"js:\\nfunction saveCache(json) {\\n writeFile(\\\"hiker://files/_cache/yunSimpleImport.json\\\", JSON.stringify(json));\\n}\\n$.exports = function(pass) {\\n try {\\n let [_, rule, type] = pass.split(\\\"$\\\");\\n if (type === \\\"b\\\") {\\n rule = parsePaste(rule);\\n }\\n let rules = JSON.parse(base64Decode(rule));\\n if (!Array.isArray(rules)) {\\n rules = [rules];\\n }\\n //rules.reverse();\\n MY_URL = module.id;\\n let ruleTitle = getParam(\\\"rule\\\");\\n let arr = $.require(\\\"configs?rule=\\\" + ruleTitle).getJson();\\n let newI = 0;\\n for (let rule of rules) {\\n let index = arr.findIndex(v => v.name === rule.name);\\n if (index > -1) {\\n rule = Object.assign(arr[index], rule);\\n arr.splice(index, 1, rule);\\n if (rules.length === 1) {\\n saveCache(rule);\\n return \\\"hiker://page/ruleEdit#noHistory##noRecordHistory#?isImport=true&index=\\\" + index + \\\"&rule=\\\" + ruleTitle;\\n //toast(\\\"已更新规则:\\\" + rule.name);\\n } else {\\n log(\\\"已更新规则:\\\" + rule.name)\\n }\\n } else {\\n newI++;\\n arr.push(rule);\\n if (rules.length === 1) {\\n saveCache(rule);\\n return \\\"hiker://page/ruleEdit#noHistory##noRecordHistory#?isImport=true&rule=\\\" + ruleTitle;\\n //toast(\\\"已导入规则:\\\" + rule.name);\\n } else {\\n log(\\\"已导入规则:\\\" + rule.name)\\n }\\n }\\n }\\n if (rules.length > 1) {\\n $.require(\\\"configs?rule=\\\" + ruleTitle).saveJson(arr);\\n toast(\\\"新增:\\\" + newI + \\\" 覆盖更新:\\\" + (rules.length - newI));\\n }\\n } catch (e) {\\n log(e.toString());\\n toast(\\\"导入失败\\\");\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"规则列表\",\"path\":\"rules\",\"rule\":\"js:\\n$.exports = [{\\n name: \\\"小云\\\",\\n page: true,\\n find(s, page) {\\n let basicUrl = \\\"https://www.yunso.net\\\";\\n let api = \\\"/api/validate/search?wd=\\\" + encodeURIComponent(s) + \\\"&mode=90001&stype=20100&uk=&page=\\\" + page + \\\"&limit=20&screen_filetype=undefined\\\";\\n let json = post(basicUrl + api, {\\n body: \\\"data=\\\" + api,\\n headers: {\\n Referer: \\\"https://www.yunso.net/index/user/s?wd=\\\" + encodeURIComponent(s)\\n }\\n });\\n let html = JSON.parse(json).data;\\n let list = pdfa(html, \\\"body&&.layui-card:has(a)\\\");\\n let d = [];\\n for (let item of list) {\\n let title = pdfh(item, \\\"a&&Text\\\").replace(\\\"#文件夹 \\\", \\\"\\\");\\n //let time = /\\\\d{4}(-\\\\d{2}){2} \\\\d{2}(\\\\:\\\\d{2}){2}/.exec(pdfh(item, \\\".layui-card-body&&Text\\\")) || [];\\n d.push({\\n title: title,\\n //desc: time[0],\\n url: base64Decode(pdfh(item, \\\"a&&url\\\"))\\n });\\n }\\n return d;\\n }\\n }, {\\n name: \\\"混合盘\\\",\\n page: true,\\n find(s, page) {\\n let url = \\\"https://api.hunhepan.com/v1/search\\\";\\n let json = post(url, {\\n headers: {\\n Referer: \\\"https://hunhepan.com/\\\"\\n },\\n body: JSON.stringify({\\n \\\"q\\\": s,\\n \\\"page\\\": page,\\n \\\"size\\\": 15\\n })\\n });\\n json = JSON.parse(json);\\n let list = json.data.list;\\n let d = [];\\n for (let i = 0; i < list.length; i++) {\\n let it = list[i];\\n if (it.disk_type !== \\\"ALY\\\" || it.share_user === \\\"丶***丶\\\") continue;\\n d.push({\\n title: it.disk_name,\\n pic_url: pd(it, \\\"img&&src\\\", url),\\n url: it.link,\\n desc: it.update_time + \\\"\\\\n\\\" + it.link,\\n });\\n }\\n return d;\\n }\\n }, {\\n name: \\\"资源帮\\\",\\n page: true,\\n find(s, page) {\\n function search() {\\n let rtnList = [];\\n let resp = request(\\\"https://zyb.upyunso.com/v15/search?keyword=\\\" + en_aes(s) + \\\"&s_type=2&page=\\\" + page + \\\"&atk=&did=\\\" + generateRandomHexString(64), {\\n headers: {\\n \\\"user-agent\\\": \\\"Mozilla/5.0 (Linux; Android 10; Redmi Note 7 Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/81.0.4044.138 Mobile Safari/537.36 uni-app Html5Plus/1.0 (Immersed/29.09091)\\\",\\n },\\n });\\n let respData = de_aes(resp);\\n let jsonData = JSON.parse(respData) || {};\\n let result = jsonData.result || {};\\n let items = result.items || [];\\n\\n for (let i = 0; i < items.length; i++) {\\n let item = items[i];\\n let content = item.content || [];\\n if (content.length == 0 || !item.page_url) continue;\\n let url = de_aes(item.page_url) || \\\"\\\";\\n if (!url) continue;\\n rtnList.push({\\n title: (item.title.length > 30 ? item.title.slice(0, 27) + \\\"...\\\" : item.title) || \\\"\\\",\\n desc: \\\"分享时间:\\\" + item.insert_time,\\n url: url\\n });\\n }\\n\\n return rtnList;\\n }\\n\\n function generateRandomHexString(length) {\\n let result = \\\"\\\";\\n const characters = \\\"0123456789abcdef\\\";\\n const charactersLength = characters.length;\\n for (let i = 0; i < length; i++) {\\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\\n }\\n return result;\\n }\\n let aliUtil = $.require(\\\"aliUtil\\\");\\n let CryptoJS = aliUtil.getCryptoJS();\\n\\n function en_aes(e) {\\n let i = \\\"qq1920520460qqzz\\\";\\n // en_aes\\n let key = CryptoJS.enc.Utf8.parse(i);\\n var t = CryptoJS.enc.Utf8.parse(e),\\n r = CryptoJS.AES.encrypt(t, key, {\\n iv: key,\\n mode: CryptoJS.mode.CBC,\\n });\\n return r.ciphertext.toString();\\n }\\n\\n function de_aes(vv) {\\n let i = \\\"qq1920520460qqzz\\\";\\n // de_aes\\n let key = CryptoJS.enc.Utf8.parse(i);\\n let hexVal = CryptoJS.enc.Hex.parse(vv),\\n val = CryptoJS.enc.Base64.stringify(hexVal),\\n decrypted = CryptoJS.AES.decrypt(val, key, {\\n iv: key,\\n mode: CryptoJS.mode.CBC,\\n });\\n return decrypted.toString(CryptoJS.enc.Utf8);\\n }\\n return search();\\n }\\n }, {\\n name: \\\"云盘资源\\\",\\n page: true,\\n find: function(s, page) {\\n let url = \\\"https://res.yunpan.win/?PageIndex=\\\" + page + \\\"&PageSize=12&Keyword=\\\" + s + \\\"&Type=&Tag=\\\";\\n let html = request(url, {\\n headers: {\\n \\\"Referer\\\": \\\"https://res.yunpan.win/\\\"\\n }\\n });\\n\\n let arr = pdfa(html, \\\"main&&.card\\\");\\n //log(arr);\\n let d = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let u = pdfh(it, \\\".card-link,1&&onclick\\\").match(/https:\\\\/\\\\/(www\\\\.aliyundrive\\\\.com\\\\/s|alywp\\\\.net)\\\\/\\\\w*/g) || [];\\n u = u.length > 0 ? u[0] : url;\\n d.push({\\n title: pdfh(it, \\\".card-title&&Text\\\"),\\n pic_url: pd(it, \\\"img&&src\\\", url),\\n url: u,\\n desc: pdfh(it, \\\".card-text,-1&&Text\\\") + \\\"\\\\n\\\" + u,\\n });\\n }\\n return d;\\n }\\n },\\n {\\n name: \\\"UP云搜\\\",\\n page: true,\\n find: function(s, page) {\\n let url = \\\"https://api.upyunso2.com/search?keyword=\\\" + s + \\\"&page=\\\" + page + \\\"&s_type=1\\\";\\n let html = request(url, {\\n headers: {\\n \\\"Referer\\\": \\\"https://www.upyunso.com\\\",\\n \\\"Cookie\\\": \\\"code=1919\\\"\\n }\\n });\\n //log(base64Decode(html));\\n let arr = JSON.parse(base64Decode(html)).result.items;\\n //log(arr);\\n let d = [];\\n if (!arr) return [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let u = it.page_url;\\n //u = u.length > 0 ? u[0] : url;\\n if (!u.includes(\\\"aliyundrive\\\")) {\\n continue;\\n }\\n d.push({\\n title: it.title,\\n url: u,\\n desc: \\\"\\\\n\\\" + (u),\\n });\\n\\n }\\n return d;\\n }\\n },\\n {\\n name: \\\"猫狸盘搜\\\",\\n page: false,\\n find: function(s, page) {\\n let html = request(\\\"https://www.alipansou.com/search?k=\\\" + s, {\\n headers: {\\n \\\"Referer\\\": \\\"https://www.alipansou.com/search?k=\\\" + s\\n }\\n });\\n let arr = pdfa(html, \\\"#app&&a\\\");\\n //log(arr);\\n let d = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = \\\"<div>\\\" + arr[i] + \\\"</div>\\\";\\n let u = pdfh(it, \\\"a&&href\\\");\\n //log(u);\\n if (!u.includes(\\\"/s/\\\")) {\\n continue;\\n }\\n u = \\\"https://www.alipansou.com\\\" + u.replace(\\\"/s/\\\", \\\"/cv/\\\");\\n d.push({\\n title: pdfh(it, \\\"template&&Text\\\"),\\n url: u,\\n desc: pdfh(it, \\\"template,1&&Text\\\"),\\n });\\n }\\n return d;\\n },\\n findAliUrl(input) {\\n let html = request(input, {\\n headers: {\\n \\\"Cookie\\\": \\\"no_show_donate=1\\\",\\n \\\"Referer\\\": input.replace(\\\"/cv/\\\", \\\"/s/\\\")\\n },\\n redirect: false\\n });\\n html = parseDomForHtml(html, 'a&&href');\\n if (html.length > 0) {\\n return html;\\n } else {\\n return input;\\n }\\n }\\n },\\n {\\n name: \\\"易搜\\\",\\n page: true,\\n registerUrl: \\\"https://yiso.fun\\\",\\n find: function(s, page) {\\n let aliUtil = $.require(\\\"aliUtil\\\");\\n let CryptoJS = aliUtil.getCryptoJS();\\n\\n function keyen(str) {\\n var key = CryptoJS.enc.Utf8.parse(\\\"4OToScUFOaeVTrHE\\\"),\\n iv = CryptoJS.enc.Utf8.parse(\\\"9CLGao1vHKqm17Oz\\\");\\n var encrypted = CryptoJS.AES.decrypt({\\n ciphertext: CryptoJS.enc.Base64.parse(str)\\n }, key, {\\n iv: iv,\\n mode: CryptoJS.mode.CBC,\\n padding: CryptoJS.pad.Pkcs7\\n }).toString(CryptoJS.enc.Utf8);\\n return encrypted;\\n }\\n let html = request(\\\"https://yiso.fun/api/search?name=\\\" + s + \\\"&pageNo=\\\" + page, {\\n headers: {\\n \\\"Referer\\\": \\\"https://yiso.fun/info?searchKey=\\\" + s,\\n \\\"Cookie\\\": getItem('yisoucooke', '')\\n }\\n });\\n //log(html);\\n if (html.includes('登录用户无限制')) {\\n var i = 0;\\n do {\\n var tyimglin = 'https://yiso.fun/api/user/login/captcha?t=' + parseInt(new Date().getTime()) + '';\\n let img = convertBase64Image(tyimglin).split(',')[1];\\n let cod = request('https://api.xhofe.top/ocr/b64/text', {\\n headers: {\\n 'Content-Type': 'text/plain'\\n },\\n body: img,\\n method: 'POST'\\n });\\n var ver = JSON.parse(request('https://yiso.fun/api/user/login', {\\n headers: {\\n 'content-type': 'application/json',\\n 'referer': 'https://yiso.fun/login',\\n 'Cookie': getCookie(tyimglin)\\n },\\n body: {\\n \\\"userName\\\": user.account,\\n \\\"password\\\": user.password,\\n \\\"code\\\": cod\\n },\\n method: 'POST'\\n }));\\n if (ver.code == 200) {\\n log('易搜登入验证成功');\\n setItem('yisoucooke', getCookie('https://yiso.fun'));\\n html = request(\\\"https://yiso.fun/api/search?name=\\\" + s + \\\"&pageNo=\\\" + page, {\\n headers: {\\n \\\"Referer\\\": \\\"https://yiso.fun/info?searchKey=\\\" + s,\\n \\\"Cookie\\\": getItem('yisoucooke', '')\\n }\\n });\\n break;\\n }\\n i++;\\n } while (i < 4);\\n\\n }\\n let arr = JSON.parse(html).data.list;\\n //log(arr);\\n let d = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let u = keyen(it.url);\\n //log(u);\\n if (u == null || !u.includes(\\\"aliyun\\\")) {\\n continue;\\n }\\n d.push({\\n title: it.name,\\n url: u,\\n desc: (it.gmtShare || it.gmtCreate) + \\\"\\\\n\\\" + (u),\\n });\\n\\n }\\n return d;\\n }\\n },\\n {\\n name: \\\"小纸条\\\",\\n page: false,\\n find: function(s, page) {\\n let aliUtil = $.require(\\\"aliUtil\\\");\\n\\n function gettoken() {\\n if (getMyVar('xzytoken', '').length == 0) {\\n let token = JSON.parse(post('https://gitcafe.net/tool/alipaper/', {\\n headers: {\\n 'Referer': 'https://u.gitcafe.ink/'\\n },\\n body: {\\n action: 'get_token'\\n }\\n })).data;\\n putMyVar('xzttoken', token);\\n }\\n return getMyVar('xzttoken', '');\\n }\\n\\n function cat_code(a) {\\n var d, e, b = [\\\"华语电视\\\", \\\"日韩电视\\\", \\\"欧美电视\\\", \\\"其他电视\\\", \\\"华语电影\\\", \\\"日韩电影\\\", \\\"欧美电影\\\", \\\"其他电影\\\", \\\"华语动漫\\\", \\\"日韩动漫\\\", \\\"欧美动漫\\\", \\\"纪录片\\\", \\\"综艺片\\\", \\\"教育培训\\\", \\\"其他视频\\\", \\\"华语音乐\\\", \\\"日韩音乐\\\", \\\"欧美音乐\\\", \\\"其他音乐\\\", \\\"娱乐软件\\\", \\\"系统软件\\\", \\\"网络软件\\\", \\\"办公软件\\\", \\\"其他软件\\\", \\\"漫画\\\", \\\"小说\\\", \\\"出版书\\\", \\\"知识培训\\\", \\\"其他文档\\\", \\\"壁纸\\\", \\\"人物\\\", \\\"风景\\\", \\\"其他图片\\\", \\\"其他\\\"],\\n c = [\\\"hyds\\\", \\\"rhds\\\", \\\"omds\\\", \\\"qtds\\\", \\\"hydy\\\", \\\"rhdy\\\", \\\"omdy\\\", \\\"qtdy\\\", \\\"hydm\\\", \\\"rhdm\\\", \\\"omdm\\\", \\\"jlp\\\", \\\"zyp\\\", \\\"jypx\\\", \\\"qtsp\\\", \\\"hyyy\\\", \\\"rhyy\\\", \\\"omyy\\\", \\\"qtyy\\\", \\\"kfrj\\\", \\\"xtrj\\\", \\\"wlrj\\\", \\\"bgrj\\\", \\\"qtrj\\\", \\\"mh\\\", \\\"xs\\\", \\\"cbs\\\", \\\"zspx\\\", \\\"qtwd\\\", \\\"bz\\\", \\\"rw\\\", \\\"fj\\\", \\\"qttp\\\", \\\"qt\\\"];\\n for (d = 0, e = c.length; e > d; d++)\\n if (c[d] == a) return b[d];\\n }\\n let d = [];\\n let html = post(\\\"https://gitcafe.net/tool/alipaper/\\\", {\\n headers: {\\n 'Referer': 'https://u.gitcafe.ink/'\\n },\\n body: {\\n action: \\\"search\\\",\\n from: \\\"web\\\",\\n token: gettoken(),\\n keyword: s\\n }\\n })\\n let list = JSON.parse(html);\\n if (list.data) {\\n list = list.data;\\n }\\n for (let i = 0; i < list.length; i++) {\\n let it = list[i]\\n let title = it.title;\\n let murl = 'https://www.aliyundrive.com/s/' + it.alikey\\n if (!aliUtil.checkali(murl)) {\\n continue;\\n }\\n if (title.includes(s)) {\\n d.push({\\n title: \\\"√ \\\" + title,\\n desc: cat_code(it.cat),\\n extra: {\\n des: it.des\\n },\\n url: murl\\n });\\n }\\n }\\n return d;\\n }\\n },\\n {\\n name: \\\"玩偶哥哥\\\",\\n page: true,\\n basicUrl: \\\"http://wogg.xyz\\\",\\n find: function(s, page) {\\n let url = basicUrl + \\\"/index.php/vodsearch/\\\" + s + \\\"----------\\\" + page + \\\"---.html\\\";\\n let html = request(url);\\n let arr = parseDomForArray(html, \\\".module-items&&.module-search-item\\\");\\n\\n let bet = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let utitle = pdfh(it, \\\"h3&&a&&Text\\\");\\n let userial = pdfh(it, \\\".video-serial&&Text\\\");\\n let uimage = pdfh(it, \\\"img&&data-src\\\");\\n let u = pd(it, \\\"h3&&a&&href\\\", basicUrl);\\n bet.push({\\n title: utitle,\\n url: u,\\n pic_url: uimage,\\n desc: userial\\n });\\n }\\n\\n return bet;\\n },\\n findAliUrl(input) {\\n return pdfa(request(input), \\\"body&&.module-row-text.copy\\\").map(v => pdfh(v, \\\"a&&data-clipboard-text\\\"));\\n }\\n },\\n {\\n name: \\\"阿里云盘网\\\",\\n page: true,\\n basicUrl: \\\"https://www.alypw.cn\\\",\\n find: function(s, page) {\\n let url = basicUrl + \\\"/search.php?q=\\\" + s + \\\"&page=\\\" + page;\\n let html = request(url, {});\\n let arr = pdfa(html, \\\".list&&li\\\");\\n let bet = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let utitle = pdfh(it, \\\"a&&title\\\");\\n let userial = pdfh(it, \\\".fa-clock-o&&Text\\\");\\n let uimage = pdfh(it, \\\"img&&src\\\");\\n let u = pd(it, \\\"a&&href\\\", basicUrl);\\n if (!utitle.includes(s)) {\\n continue;\\n }\\n bet.push({\\n title: utitle,\\n url: u,\\n pic_url: uimage,\\n desc: userial\\n });\\n }\\n\\n return bet;\\n },\\n findAliUrl(input) {\\n return pdfa(request(input), \\\"body&&a[href^=https://www.aliyundrive.com/s/]\\\").map(v => pdfh(v, \\\"a&&href\\\"));\\n }\\n },\\n {\\n name: \\\"土拨鼠\\\",\\n page: false,\\n find: function(s, page) {\\n let html = fetch('https://www.tbsdy.com/search.html?keyword=' + s + '&category=983920&data_type=987910', {\\n headers: {\\n 'User-Agent': PC_UA\\n }\\n });\\n\\n let arr = parseDomForArray(html, '.search_result_netdisk_list&&a');\\n let d = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n //log(it);\\n let u = parseDomForHtml(it, 'a&&href');\\n let tit = parseDomForHtml(it, '.netdisk_item_detail_name&&Text');\\n if (!tit.includes(s)) {\\n continue;\\n }\\n //log(u);\\n d.push({\\n title: tit,\\n url: u,\\n desc: \\\"\\\\n\\\" + u,\\n });\\n }\\n return d;\\n }\\n },\\n {\\n name: \\\"阿里搜\\\",\\n page: true,\\n find: function(s, page) {\\n let d = [];\\n let html = request('https://aliso.cc/s/' + s + '-' + page + '-0.html', {});\\n\\n let list = parseDomForArray(html, '.search-result&&.resource-item');\\n for (let j = 0; j < list.length; j++) {\\n let u = list[j];\\n let tit = parseDomForHtml(u, 'h3&&Text');\\n if (!tit.includes(s)) {\\n continue;\\n }\\n d.push({\\n title: tit,\\n url: parseDom(u, 'h3&&a&&href', 'https://aliso.cc/'),\\n desc: parseDomForHtml(u, '.time&&Text'),\\n });\\n\\n }\\n return d;\\n },\\n findAliUrl(input) {\\n eval(getCryptoJS());\\n\\n function decry(str) {\\n var key = CryptoJS.enc.Utf8.parse(\\\"9EB20DDFD6AFBD68\\\");\\n var encrypted = CryptoJS.AES.decrypt(str, key, {\\n iv: key,\\n mode: CryptoJS.mode.CBC,\\n padding: CryptoJS.pad.Pkcs7\\n }).toString(CryptoJS.enc.Utf8);\\n return encrypted;\\n }\\n\\n let html = request(input);\\n let but = parseDom(html, '.button&&href', 'https://aliso.cc/');\\n //log(but);\\n let got = request(but);\\n //log(got);\\n eval(parseDomForHtml(got, 'head&&script,1&&Html'));\\n return decry(base64.split('!')[0]);\\n }\\n },\\n {\\n name: \\\"云盘分享社\\\",\\n page: false,\\n find: function(s, page) {\\n let aliUtil = $.require(\\\"aliUtil\\\");\\n let CryptoJS = aliUtil.getCryptoJS();\\n\\n function decry(str) {\\n var key = CryptoJS.enc.Utf8.parse(\\\"5F6B2AK33DASD123\\\");\\n var encrypted = CryptoJS.AES.decrypt(str, key, {\\n mode: CryptoJS.mode.ECB,\\n padding: CryptoJS.pad.Pkcs7\\n }).toString(CryptoJS.enc.Utf8);\\n return encrypted;\\n }\\n let html = request(\\\"https://www.yunpanfenxiang.cn/api/bbs/api/getdata?key=\\\" + s + \\\"&type=video\\\", {\\n headers: {\\n \\\"Referer\\\": \\\"https://www.yunpanfenxiang.cn/\\\"\\n }\\n });\\n let json = decry(JSON.parse(html).data);\\n let arr = JSON.parse(json);\\n\\n let bet = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let url = it.pid;\\n bet.push({\\n url: \\\"https://www.yunpanfenxiang.cn/api/bbs/api/getarticle?id=\\\" + url,\\n title: it.title,\\n desc: it.createtime\\n });\\n }\\n\\n return bet;\\n },\\n findAliUrl(input) {\\n let json = JSON.parse(request(input, {\\n headers: {\\n \\\"Referer\\\": \\\"https://www.yunpanfenxiang.cn/\\\"\\n }\\n })).data;\\n let list = json.download.split(\\\"@\\\");\\n let alist = new Set();\\n for (let j = 0; j < list.length; j++) {\\n alist.add(\\\"https://www.aliyundrive.com/s/\\\" + list[j]);\\n }\\n return Array.from(alist);\\n }\\n },\\n {\\n name: \\\"盘搜\\\",\\n page: true,\\n find: function(s, page) {\\n page = (page - 1) * 10;\\n let url = \\\"https://www.pansearch.me/search?keyword=\\\" + s + \\\"&offset=\\\" + page + \\\"&pan=aliyundrive\\\";\\n let html = request(url, {});\\n\\n let arr = parseDomForArray(html, '.grid&&.shadow:has(a[href^=https://www.aliyundrive.com/s/])');\\n //log(arr);\\n let d = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let u = parseDomForHtml(it, 'a[href^=https://www.aliyundrive.com/s/]&&href');\\n let pic_url = parseDomForHtml(it, 'img&&src');\\n d.push({\\n title: parseDomForHtml(it, '.break-all&&Text').split('http')[0],\\n pic_url: pic_url === \\\"/favicon.png\\\" ? \\\"https://www.pansearch.me/\\\" + pic_url : pic_url,\\n url: u,\\n desc: parseDomForHtml(it, 'p&&Text') + \\\"\\\\n\\\" + u,\\n });\\n\\n }\\n return d;\\n }\\n },\\n {\\n name: \\\"DOVX搜\\\",\\n page: false,\\n find: function(s, page) {\\n let url = \\\"https://api.dovx.tk/ali/search?wd=\\\" + s;\\n let html = request(url);\\n let arr = JSON.parse(html).list;\\n let d = [];\\n let aliUtil = $.require(\\\"aliUtil\\\");\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let u = it.vod_content;\\n if (!u.includes(\\\"aliyundrive\\\") || !aliUtil.checkali(u)) {\\n continue;\\n }\\n d.push({\\n title: \\\"√ \\\" + it.vod_name,\\n pic_url: it.vod_pic,\\n url: u,\\n desc: \\\"\\\\n\\\" + u,\\n });\\n }\\n return d;\\n }\\n },\\n {\\n name: \\\"必应\\\",\\n page: true,\\n find: function(s, page) {\\n let url = \\\"https://cn.bing.com/search?q=\\\" + s + \\\"+aliyundrive&qs=ds&form=QBRE\\\";\\n if (page != 1) {\\n url = getMyVar(\\\"bing\\\", url);\\n }\\n let html = request(url, {\\n headers: {\\n \\\"Referer\\\": \\\"https://cn.bing.com/\\\",\\n //\\\"X-Requested-With\\\": \\\"com.example.hikerview\\\",\\n \\\"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\\\"\\n }\\n });\\n let arr = pdfa(html, \\\"body&&a\\\");\\n //log(arr);\\n let d = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let u = pd(it, \\\"a&&href\\\", url);\\n let t = pdfh(it, \\\"a&&Text\\\");\\n if (it.includes(\\\"Next page\\\") || it.includes(\\\"下一页\\\")) {\\n let u2 = pd(it, \\\"a&&href\\\", url);\\n //log(\\\"next page\\\");\\n //log(u2);\\n putMyVar(\\\"bing\\\", u2);\\n }\\n if (u == null || t == null || !it.includes(s)) {\\n continue;\\n }\\n if (!it.includes(\\\"网盘\\\") && !it.includes(\\\"云盘\\\") &&\\n !it.includes(\\\"aliyundrive\\\") && !it.includes(\\\"yunpan\\\")) {\\n continue;\\n }\\n if (u.startsWith(\\\"https://cn.bing.com/\\\")) {\\n continue;\\n }\\n let dom = getHome(u).replace(\\\"http://\\\", \\\"\\\").replace(\\\"https://\\\", \\\"\\\");\\n let _links = t.match(/https:\\\\/\\\\/(www\\\\.aliyundrive\\\\.com\\\\/s|alywp\\\\.net)\\\\/\\\\w*/g) || [];\\n let c = null;\\n if (_links.length > 1 && _links[1].replace(_links[0], \\\"\\\").replace(/[a-zA-Z0-9]+/g, \\\"\\\") == \\\"\\\") {\\n c = _links[1];\\n } else if (_links.length > 0) {\\n c = _links[0];\\n }\\n d.push({\\n title: t,\\n desc: dom,\\n url: c != null ? c : u,\\n extra: {\\n longClick: [{\\n title: \\\"进入网站\\\",\\n js: JSON.stringify(\\\"hiker://page/ysfx?webUrl=\\\" + encodeURIComponent(u))\\n }]\\n }\\n });\\n }\\n return d;\\n },\\n findAliUrl(input) {\\n if (input.includes(\\\"aliyundrive\\\")) return input;\\n let html = request(input);\\n var _links = html.match(/https:\\\\/\\\\/(www\\\\.aliyundrive\\\\.com\\\\/s|alywp\\\\.net)\\\\/\\\\w*/g) || [];\\n if (_links.length > 1 && _links[1].replace(_links[0], \\\"\\\").replace(/[a-zA-Z0-9]+/g, \\\"\\\") == \\\"\\\") {\\n return _links[1];\\n } else if (_links.length > 0) {\\n return _links[0];\\n } else {\\n return \\\"hiker://page/ysfx?webUrl=\\\" + encodeURIComponent(input);\\n }\\n\\n }\\n },\\n {\\n name: 'CCOF',\\n page: true,\\n find: function(s, page) {\\n let d = []\\n let aliUtil = $.require(\\\"aliUtil\\\");\\n let html = fetch('https://pan.ccof.cc/api/search', {\\n headers: {\\n \\\"content-type\\\": 'application/json',\\n 'Referer': 'https://pan.ccof.cc/search?keyword=' + s\\n },\\n body: {\\n \\\"pageSize\\\": 20,\\n \\\"pageNum\\\": page,\\n \\\"keyword\\\": s,\\n \\\"fromMobile\\\": true\\n },\\n method: 'POST'\\n })\\n let list = JSON.parse(html)\\n .data.rows\\n for (let i = 0; i < list.length; i++) {\\n let it = list[i];\\n let title = it.fileName\\n let murl = it.url\\n let type = it.type.replace(/folder/, '文件夹').replace(/file/, '文件')\\n if (title.includes(s)) {\\n d.push({\\n title: title,\\n desc: '文件类型:' + type + ',文件大小:' + aliUtil.bytesToSize(it.size),\\n url: murl\\n })\\n }\\n }\\n return d\\n }\\n },\\n {\\n name: '阿里小站',\\n page: true,\\n find: function(s, page) {\\n let home = \\\"https://pan666.net\\\";\\n let d = [];\\n let html = request(buildUrl(home + \\\"/api/discussions\\\", {\\n \\\"include\\\": \\\"user,lastPostedUser,mostRelevantPost,mostRelevantPost.user,tags,tags.parent,firstPost\\\",\\n \\\"filter[q]\\\": s /* + \\\" tag:video,comic\\\"*/ ,\\n //\\\"filter[tag]\\\": \\\"video,comic\\\",\\n \\\"page[offset]\\\": 20 * (page - 1)\\n }), {\\n headers: {\\n \\\"content-type\\\": \\\"application/json\\\",\\n \\\"Referer\\\": \\\"https://pan666.net/?q=\\\" + s\\n }\\n });\\n let list = JSON.parse(html).data;\\n for (let i = 0; i < list.length; i++) {\\n let item = list[i].attributes;\\n let url = home + \\\"/d/\\\" + item.slug;\\n d.push({\\n title: item.title,\\n desc: '发布时间:' + $.dateFormat(new Date(item.createdAt), \\\"yyyy-MM-dd HH:mm:ss\\\"),\\n url: url,\\n extra: {\\n longClick: [{\\n title: \\\"进入帖子\\\",\\n js: JSON.stringify(\\\"hiker://page/ysfx?webUrl=\\\" + encodeURIComponent(url))\\n }]\\n }\\n });\\n }\\n return d;\\n },\\n findAliUrl(input) {\\n let html = pdfh(request(input), \\\"Text\\\");\\n let _links = html.match(/https:\\\\/\\\\/(www\\\\.aliyundrive\\\\.com\\\\/s|alywp\\\\.net)\\\\/\\\\w*/g) || [];\\n let sharePwd = html.match(/提取码[::]\\\\s*?(\\\\w{4})/);\\n sharePwd = Array.isArray(sharePwd) && sharePwd.length > 0 ? sharePwd[1] : \\\"\\\";\\n if (_links.length > 1 && _links[1].replace(_links[0], \\\"\\\").replace(/[a-zA-Z0-9]+/g, \\\"\\\") == \\\"\\\") {\\n return {\\n aliUrl: _links[1],\\n sharePwd: sharePwd\\n };\\n } else if (_links.length > 0) {\\n return {\\n aliUrl: _links[0],\\n sharePwd: sharePwd\\n };\\n } else {\\n return \\\"hiker://page/ysfx?webUrl=\\\" + encodeURIComponent(input);\\n }\\n }\\n },\\n {\\n name: '云盘分享社区',\\n page: true,\\n find: function(s, page) {\\n let home = \\\"https://yunpan1.cc\\\";\\n let d = [];\\n let html = request(buildUrl(home + \\\"/api/discussions\\\", {\\n \\\"include\\\": \\\"user,lastPostedUser,mostRelevantPost,mostRelevantPost.user,tags,tags.parent,firstPost\\\",\\n \\\"filter[q]\\\": s /* + \\\" tag:video,comic\\\"*/ ,\\n //\\\"filter[tag]\\\": \\\"video,comic\\\",\\n \\\"page[offset]\\\": 20 * (page - 1)\\n }), {\\n headers: {\\n \\\"content-type\\\": \\\"application/json\\\",\\n \\\"Referer\\\": \\\"https://pan666.net/?q=\\\" + s\\n }\\n });\\n let list = JSON.parse(html).data;\\n for (let i = 0; i < list.length; i++) {\\n let item = list[i].attributes;\\n let url = home + \\\"/d/\\\" + item.slug;\\n d.push({\\n title: item.title,\\n desc: '发布时间:' + $.dateFormat(new Date(item.createdAt), \\\"yyyy-MM-dd HH:mm:ss\\\"),\\n url: url,\\n extra: {\\n longClick: [{\\n title: \\\"进入帖子\\\",\\n js: JSON.stringify(\\\"hiker://page/ysfx?webUrl=\\\" + encodeURIComponent(url))\\n }]\\n }\\n });\\n }\\n return d;\\n },\\n findAliUrl(input) {\\n let html = pdfh(request(input), \\\"Text\\\");\\n let _links = html.match(/https:\\\\/\\\\/(www\\\\.aliyundrive\\\\.com\\\\/s|alywp\\\\.net)\\\\/\\\\w*/g) || [];\\n let sharePwd = html.match(/提取码[::]\\\\s*?(\\\\w{4})/);\\n sharePwd = Array.isArray(sharePwd) && sharePwd.length > 0 ? sharePwd[1] : \\\"\\\";\\n if (_links.length > 1 && _links[1].replace(_links[0], \\\"\\\").replace(/[a-zA-Z0-9]+/g, \\\"\\\") == \\\"\\\") {\\n return {\\n aliUrl: _links[1],\\n sharePwd: sharePwd\\n };\\n } else if (_links.length > 0) {\\n return {\\n aliUrl: _links[0],\\n sharePwd: sharePwd\\n };\\n } else {\\n return \\\"hiker://page/ysfx?webUrl=\\\" + encodeURIComponent(input);\\n }\\n }\\n }, {\\n name: \\\"爱看美剧\\\",\\n page: true,\\n find: function(s, page) {\\n let url = \\\"https://www.2kmj.cn/search.php?q=\\\" + s + \\\"&page/\\\" + page + \\\"/\\\";\\n let html = request(url);\\n let arr = parseDomForArray(html, \\\".list-it&&li\\\");\\n\\n let bet = [];\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let utitle = parseDomForHtml(it, \\\"a&&title\\\");\\n let userial = parseDomForHtml(it, \\\".info&&span:not(:has(a))--i&&Text\\\");\\n let uimage = parseDom(it, \\\"img&&src\\\");\\n let u = parseDom(it, \\\"a&&href\\\");\\n bet.push({\\n title: utitle,\\n url: u,\\n pic_url: uimage,\\n desc: userial\\n });\\n }\\n\\n return bet;\\n\\n },\\n findAliUrl(input) {\\n return pdfa(request(input), \\\"body&&#download\\\").map(v => pdfh(v, \\\".down&&href\\\"));\\n }\\n },\\n {\\n name: \\\"奇妙搜索\\\",\\n page: true,\\n find(s, page) {\\n let url;\\n if (page === 1) {\\n url = buildUrl(\\\"https://www.magicalsearch.top/api/pshou/getData\\\", {\\n word: s,\\n type: \\\"阿里网盘\\\"\\n });\\n } else {\\n url = buildUrl(\\\"https://www.magicalsearch.top/api/pshou/getNextPage\\\", {\\n url: \\\"https://api.upyunso2.com/search?s_type=2@page=\\\" + page + \\\"@keyword=\\\" + encodeURIComponent(s),\\n website: \\\"阿里网盘\\\"\\n });\\n }\\n let result = request(url, {\\n headers: {\\n Referer: buildUrl(\\\"https://www.magicalsearch.top/search\\\", {\\n word: s,\\n cpage: 0\\n })\\n }\\n });\\n result = JSON.parse(JSON.parse(result));\\n let list = result.result.items;\\n let d = [];\\n for (let it of list) {\\n if (it.id == -1) {\\n continue;\\n }\\n d.push({\\n title: it.title,\\n desc: \\\"日期:\\\" + it.insert_time + \\\"\\\\n路径:\\\" + it.path,\\n url: it.page_url\\n });\\n }\\n return d;\\n }\\n }\\n];\"},{\"col_type\":\"movie_3\",\"name\":\"文件排序\",\"path\":\"FileSorting\",\"rule\":\"let chnNumChar = {\\n 零: 0,\\n 一: 1,\\n 二: 2,\\n 三: 3,\\n 四: 4,\\n 五: 5,\\n 六: 6,\\n 七: 7,\\n 八: 8,\\n 九: 9\\n};\\n\\nlet chnNameValue = {\\n 十: {\\n value: 10,\\n secUnit: false\\n },\\n 百: {\\n value: 100,\\n secUnit: false\\n },\\n 千: {\\n value: 1000,\\n secUnit: false\\n },\\n 万: {\\n value: 10000,\\n secUnit: true\\n },\\n 亿: {\\n value: 100000000,\\n secUnit: true\\n }\\n}\\n\\nfunction ChineseToNumber(chnStr) {\\n let rtn = 0;\\n let section = 0;\\n let number = 0;\\n let secUnit = false;\\n let str = chnStr.split('');\\n\\n for (let i = 0; i < str.length; i++) {\\n let num = chnNumChar[str[i]];\\n if (typeof num !== 'undefined') {\\n number = num;\\n if (i === str.length - 1) {\\n section += number;\\n }\\n } else {\\n let unit = chnNameValue[str[i]].value;\\n secUnit = chnNameValue[str[i]].secUnit;\\n if (secUnit) {\\n section = (section + number) * unit;\\n rtn += section;\\n section = 0;\\n } else {\\n section += (number * unit);\\n }\\n number = 0;\\n }\\n }\\n return rtn + section;\\n}\\n\\nfunction nameCompare(a, b) {\\n if (a == null || b == null)\\n return a == null ? b == null ? 0 : -1 : 1;\\n\\n a = a.replace(/([零一二三四五六七八九十百千万亿])/g, function(match, p1, p2, p3, offset, string) {\\n // p1 is nondigits, p2 digits, and p3 non-alphanumerics\\n return ChineseToNumber(p1);\\n })\\n b = b.replace(/([零一二三四五六七八九十百千万亿])/g, function(match, p1, p2, p3, offset, string) {\\n // p1 is nondigits, p2 digits, and p3 non-alphanumerics\\n return ChineseToNumber(p1);\\n })\\n\\n let NUMBERS = java.util.regex.Pattern.compile(\\\"(?<=\\\\\\\\D)(?=\\\\\\\\d)|(?<=\\\\\\\\d)(?=\\\\\\\\D)\\\")\\n let split1 = NUMBERS.split(new java.lang.String(a));\\n let split2 = NUMBERS.split(new java.lang.String(b));\\n\\n for (let i = 0; i < Math.min(split1.length, split2.length); i++) {\\n let c1 = split1[i].charCodeAt(0);\\n let c2 = split2[i].charCodeAt(0);\\n let cmp = 0;\\n let zeroCharCode = '0'.charCodeAt(0);\\n let nineCharCode = '9'.charCodeAt(0);\\n\\n if (c1 >= zeroCharCode && c1 <= nineCharCode && c2 >= zeroCharCode && c2 <= nineCharCode) {\\n cmp = new java.math.BigInteger(split1[i]).compareTo(new java.math.BigInteger(split2[i]));\\n }\\n\\n if (cmp === 0) {\\n let regex = /[a-zA-Z0-9]/\\n let s1 = String(split1[i])\\n let s2 = String(split2[i])\\n if (regex.test(s1) || regex.test(s2)) {\\n cmp = new java.lang.String(split1[i]).compareTo(new java.lang.String(split2[i]));\\n // cmp = s1.localeCompare(s2, 'en')\\n } else {\\n cmp = s1.localeCompare(s2, 'zh')\\n }\\n }\\n\\n if (cmp !== 0) {\\n return cmp;\\n }\\n }\\n let lengthCmp = split1.length - split2.length;\\n // if (lengthCmp !== 0) lengthCmp = lengthCmp > 0 ? -1 : 1;\\n return lengthCmp;\\n}\\n$.exports.nameCompare = nameCompare;\"},{\"col_type\":\"movie_3\",\"name\":\"登录方式\",\"path\":\"loginMode\",\"rule\":\"$.exports = $([\\\"APP授权登录\\\", \\\"网页登录①\\\", \\\"网页登录②\\\", \\\"TOKEN登录\\\"], 1, \\\"登录方式\\\").select(() => {\\n if (\\\"网页登录①\\\" == input) {\\n return \\\"hiker://page/login#noRecordHistory##noHistory#?pageTitle=登录阿里云盘\\\"\\n }\\n if (\\\"网页登录②\\\" == input) {\\n return \\\"hiker://page/login#noRecordHistory##noHistory#?index=0&pageTitle=登录阿里云盘\\\"\\n }\\n if (\\\"APP授权登录\\\" == input) {\\n return \\\"hiker://page/login#noRefresh##noRecordHistory##noHistory#?index=-1&pageTitle=登录阿里云盘\\\"\\n }\\n if (\\\"TOKEN登录\\\" == input) {\\n return $(\\\"\\\", \\\"输入TOKEN\\\").input(() => {\\n let aliTokensFilepath = $.require(\\\"hiker://page/tokenPath\\\").aliTokensFilepath;\\n let aliToken = {\\n refresh_token: input.trim()\\n };\\n writeFile(aliTokensFilepath, JSON.stringify(aliToken));\\n refreshPage();\\n });\\n }\\n if (\\\"原画登录\\\" == input) {\\n return \\\"hiker://page/openApiLogin#noRefresh##noRecordHistory##noHistory#\\\";\\n }\\n});\"},{\"col_type\":\"movie_3\",\"name\":\"阿里链接匹配\",\"path\":\"alitest\",\"rule\":\"js:\\nlet matchReg = /https?:\\\\/\\\\/www.ali(pan|yundrive).com\\\\/s\\\\/[a-zA-Z0-9]{11}(\\\\/folder\\\\/[a-z0-9]{40})?/;\\nlet matchRegG = /https?:\\\\/\\\\/www.ali(pan|yundrive).com\\\\/s\\\\/[a-zA-Z0-9]{11}(\\\\/folder\\\\/[a-z0-9]{40})?/g;\\nlet testReg = /www.ali(pan|yundrive).com\\\\/s\\\\//;\\n$.exports = {\\n matchAliUrl(text, isG) {\\n if (isG) {\\n let url = text.match(matchRegG);\\n if (url) return url;\\n else return [];\\n } else {\\n let url = text.match(matchReg);\\n return url = url && url[0] || \\\"\\\";\\n }\\n },\\n test(text){\\n return testReg.test(text);\\n }\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"openApi登录-废弃\",\"path\":\"openApiLogin\",\"rule\":\"js:\\nsetPageTitle(\\\"openApi登录\\\");\\naddListener(\\\"onClose\\\", () => clearMyVar(\\\"Loggingin\\\"));\\n\\nlet d = [];\\nd.push({\\n title: \\\"点击获取扫码登录二维码\\\",\\n desc: \\\"点击图片可以保存\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n cls: \\\"login\\\",\\n id:\\\"getQC\\\"\\n },\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n putMyVar(\\\"Loggingin\\\", \\\"true\\\");\\n showLoading(\\\"正在获取二维码\\\");\\n\\n function get_qrcode_status(sid) {\\n let res = fetch(\\\"https://openapi.aliyundrive.com/oauth/qrcode/\\\" + sid + \\\"/status\\\");\\n return JSON.parse(res);\\n }\\n\\n function get_refresh_token(code) {\\n let res = post(\\\"https://aliyundrive-oauth.messense.me/oauth/access_token\\\", {\\n body: JSON.stringify({\\n \\\"grant_type\\\": \\\"authorization_code\\\",\\n \\\"code\\\": code,\\n }),\\n });\\n let data = JSON.parse(res);\\n return data[\\\"refresh_token\\\"];\\n }\\n let res = post(\\\"https://aliyundrive-oauth.messense.me/oauth/authorize/qrcode\\\", {\\n body: JSON.stringify({\\n \\\"scopes\\\": [\\\"user:base\\\", \\\"file:all:read\\\", \\\"file:all:write\\\"],\\n \\\"width\\\": 300,\\n \\\"height\\\": 300,\\n }),\\n });\\n let data = JSON.parse(res);\\n let sid = data[\\\"sid\\\"];\\n let qrcode_url = data[\\\"qrCodeUrl\\\"];\\n updateItem(\\\"infoOutput\\\", {\\n pic_url: qrcode_url,\\n url: qrcode_url + \\\"#.jpg\\\",\\n col_type: \\\"pic_1_full\\\"\\n });\\n addItemAfter(\\\"infoOutput\\\", {\\n title: \\\"‘‘’’\\\" + \\\"使用阿里云盘 App 扫码\\\".fontcolor(\\\"grey\\\"),\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n cls: \\\"login\\\"\\n }\\n });\\n deleteItem(\\\"getQC\\\");\\n hideLoading();\\n let refresh_token;\\n while (true) {\\n let data;\\n try {\\n data = get_qrcode_status(sid);\\n } catch (e) {\\n return \\\"toast://查询扫码结果超时, 可能是触发了阿里云盘接口限制, 请稍后再试.\\\";\\n }\\n let status = data[\\\"status\\\"];\\n if (status == \\\"LoginSuccess\\\") {\\n refresh_token = get_refresh_token(data[\\\"authCode\\\"]);\\n break\\n } else if (status == \\\"QRCodeExpired\\\") {\\n return \\\"toast://二维码已过期, 请刷新页面后重试\\\";\\n }\\n if (!getMyVar(\\\"Loggingin\\\", \\\"\\\")) {\\n return \\\"toast://cancel\\\";\\n }\\n java.lang.Thread.sleep(1500);\\n }\\n if (refresh_token) {\\n const {\\n openTokensFilepath,\\n } = $.require(\\\"tokenPath\\\");\\n let open = {\\n RefreshTokenOpen: refresh_token,\\n isV2: true\\n };\\n writeFile(openTokensFilepath, JSON.stringify(open));\\n addItemAfter(\\\"infoOutput\\\", {\\n title: \\\"登录成功(点击返回)\\\",\\n url:$(\\\"#noLoading#\\\").lazyRule(()=>{\\n back(false);\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"text_center_1\\\",\\n });\\n deleteItemByCls(\\\"login\\\");\\n\\n return \\\"toast://success\\\";\\n }\\n return \\\"toast://fail\\\";\\n })\\n});\\n\\nd.push({\\n col_type: \\\"blank_block\\\",\\n extra: {\\n id: \\\"infoOutput\\\",\\n cls: \\\"login\\\"\\n }\\n});\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"openApi:alist\",\"path\":\"openApi_alist\",\"rule\":\"\\nfunction OpenApiAlist($this) {\\n this.$this = $this;\\n}\\nObject.assign(OpenApiAlist.prototype, {\\n getOpenTokenCode() {\\n let result = this.$this.postApi('https://open.aliyundrive.com/oauth/users/authorize?client_id=' + '76917ccccd4441c39457a04f6084fb2f' + '&redirect_uri=https://alist.nn.ci/tool/aliyundrive/callback' + '&scope=user:base,file:all:read,file:all:write&state=').body({\\n \\\"authorize\\\": 1,\\n \\\"scope\\\": \\\"user:base,file:all:read,file:all:write\\\"\\n }).headers({\\n 'User-Agent': PC_UA,\\n 'Referer': 'https://www.aliyundrive.com/',\\n 'authorization': this.$this.reaccessTk, //getAccessToken\\n 'x-canary': 'client=web,app=share,version=v2.3.1',\\n 'x-share-token': this.$this.shareToken\\n }).errorWithRetry((e,_,http) => {\\n this.$this.trySolve(e);\\n http.mergeHeadAndBody({\\n headers: {\\n 'authorization': this.$this.reaccessTk,\\n 'x-share-token': this.$this.shareToken\\n }\\n });\\n return true;\\n }).start(true);\\n let code = result.redirectUri.split(\\\"code=\\\")[1];\\n return code;\\n },\\n getToken(body) {\\n let json = post('https://api.xhofe.top/alist/ali_open/code', {\\n headers: {\\n 'User-Agent': PC_UA,\\n 'Referer': 'https://www.aliyundrive.com/'\\n },\\n body: JSON.stringify(body),\\n });\\n if (!json) {\\n json = post('https://api-cf.nn.ci/alist/ali_open/code', {\\n headers: headers,\\n body: JSON.stringify(body),\\n });\\n }\\n if (json.includes('Too Many Requests') || json.includes(\\\"502 Bad Gateway\\\")) {\\n throw new Error(\\\"频繁请求暂时被封禁\\\\n\\\" + json);\\n } else {\\n let openResult = JSON.parse(json);\\n return openResult;\\n }\\n },\\n getOpenToken() {\\n return this.getToken({\\n code: this.getOpenTokenCode(),\\n grant_type: \\\"authorization_code\\\"\\n });\\n },\\n refreshOpenToken() {\\n return this.getToken({\\n grant_type: \\\"refresh_token\\\",\\n refresh_token: this.$this.openTokens.RefreshTokenOpen,\\n });\\n }\\n});\\n$.exports = OpenApiAlist;\"},{\"col_type\":\"movie_3\",\"name\":\"openApi:aliyundrive\",\"path\":\"openApi_aliyundrive\",\"rule\":\"js:\\nfunction OpenApi($this, postApi) {\\n this.$this = $this;\\n}\\n\\nObject.assign(OpenApi.prototype, {\\n getOpenTokenCode() {\\n function get_qrcode_code(sid) {\\n let res = fetch(\\\"https://openapi.aliyundrive.com/oauth/qrcode/\\\" + sid + \\\"/status\\\");\\n return JSON.parse(res).authCode;\\n }\\n\\n let res = post(\\\"https://aliyundrive-oauth.messense.me/oauth/authorize/qrcode\\\", {\\n body: JSON.stringify({\\n \\\"scopes\\\": [\\\"user:base\\\", \\\"file:all:read\\\", \\\"file:all:write\\\"],\\n \\\"width\\\": 300,\\n \\\"height\\\": 300,\\n }),\\n });\\n let data = JSON.parse(res);\\n let sid = data[\\\"sid\\\"];\\n let body = {\\n \\\"authorize\\\": 1,\\n \\\"scope\\\": \\\"user:base,file:all:read,file:all:write\\\",\\n \\\"drives\\\": [\\\"backup\\\", \\\"resource\\\"],\\n \\\"scopes\\\": [\\\"user:base\\\", \\\"file:all:read\\\", \\\"file:all:write\\\"],\\n \\\"sid\\\": sid\\n }\\n let headers = {\\n 'authorization': this.$this.reaccessTk\\n };\\n let res2 = this.$this.postApi(\\\"https://open.aliyundrive.com/oauth/users/qrcode/authorize?sid=\\\" + sid).body(body).headers(headers).errorWithRetry((e, _, http) => {\\n this.$this.trySolve(e);\\n http.mergeHeadAndBody({\\n headers: {\\n 'authorization': this.$this.reaccessTk,\\n }\\n });\\n return true;\\n }).start(true);\\n return get_qrcode_code(sid);\\n },\\n getToken(body) {\\n let res = post(\\\"https://aliyundrive-oauth.messense.me/oauth/access_token\\\", {\\n body: JSON.stringify(body),\\n });\\n let data = JSON.parse(res);\\n\\n return data;\\n },\\n getOpenToken() {\\n return this.getToken({\\n code: this.getOpenTokenCode(),\\n grant_type: \\\"authorization_code\\\"\\n });\\n },\\n refreshOpenToken() {\\n return this.getToken({\\n grant_type: \\\"refresh_token\\\",\\n refresh_token: this.$this.openTokens.RefreshTokenOpen,\\n });\\n }\\n});\\n$.exports = OpenApi;\"},{\"col_type\":\"movie_3\",\"name\":\"openApi:tvbox\",\"path\":\"openApi_tvbox\",\"rule\":\"function OpenApi($this) {\\n this.$this = $this;\\n}\\n\\nObject.assign(OpenApi.prototype, {\\n getOpenTokenCode() {\\n function get_qrcode_code(sid) {\\n let res = fetch(\\\"https://openapi.aliyundrive.com/oauth/qrcode/\\\" + sid + \\\"/status\\\");\\n return JSON.parse(res).authCode;\\n }\\n\\n let res = fetch(\\\"http://159.75.208.47/cloudisk/api/oauth/authorize/qrcode\\\");\\n let data = JSON.parse(res);\\n let sid = data[\\\"sid\\\"];\\n let body = {\\n \\\"authorize\\\": 1,\\n \\\"scope\\\": \\\"user:base,file:all:read,file:all:write\\\",\\n \\\"drives\\\": [\\\"backup\\\", \\\"resource\\\"],\\n \\\"scopes\\\": [\\\"user:base\\\", \\\"file:all:read\\\", \\\"file:all:write\\\"],\\n \\\"sid\\\": sid\\n }\\n let headers = {\\n 'authorization': this.$this.reaccessTk\\n };\\n let res2 = this.$this.postApi(\\\"https://open.aliyundrive.com/oauth/users/qrcode/authorize?sid=\\\" + sid).body(body).headers(headers).errorWithRetry((e, _, http) => {\\n this.$this.trySolve(e);\\n http.mergeHeadAndBody({\\n headers: {\\n 'authorization': this.$this.reaccessTk,\\n }\\n });\\n return true;\\n }).start(true);\\n return get_qrcode_code(sid);\\n },\\n getToken(body) {\\n let url = \\\"\\\";\\n if (body.code) {\\n url = buildUrl(\\\"http://159.75.208.47/cloudisk/api/oauth/accessToken\\\", {\\n authCode: body.code\\n });\\n } else {\\n url = buildUrl(\\\"http://159.75.208.47/cloudisk/api/oauth/accessToken\\\", {\\n refreshToken: body.refresh_token\\n });\\n }\\n let res = fetch(url);\\n let data = JSON.parse(res);\\n let ret = {\\n refresh_token: data.refreshToken,\\n token_type: data.tokenType,\\n access_token: data.accessToken\\n };\\n return ret;\\n },\\n getOpenToken() {\\n return this.getToken({\\n code: this.getOpenTokenCode(),\\n grant_type: \\\"authorization_code\\\"\\n });\\n },\\n refreshOpenToken() {\\n return this.getToken({\\n grant_type: \\\"refresh_token\\\",\\n refresh_token: this.$this.openTokens.RefreshTokenOpen,\\n });\\n }\\n});\\n$.exports = OpenApi;\"},{\"col_type\":\"movie_3\",\"name\":\"openApi:XBY\",\"path\":\"openApi_XBY\",\"rule\":\"js:\\nfunction OpenApi($this, postApi) {\\n this.$this = $this;\\n}\\n\\nObject.assign(OpenApi.prototype, {\\n client_secret: \\\"63f06c3c5c5d4e1196e2c13e8588ae29\\\",\\n client_id: \\\"df43e22f022d4c04b6e29964f3b8b46d\\\",\\n getOpenTokenCode() {\\n function get_qrcode_code(sid) {\\n let res = fetch(\\\"https://openapi.aliyundrive.com/oauth/qrcode/\\\" + sid + \\\"/status\\\");\\n return JSON.parse(res).authCode;\\n }\\n\\n let res = post(\\\"https://openapi.aliyundrive.com/oauth/authorize/qrcode\\\", {\\n body: JSON.stringify({\\n \\\"scopes\\\": [\\\"user:base\\\", \\\"file:all:read\\\", \\\"file:all:write\\\"],\\n \\\"client_secret\\\": this.client_secret,\\n \\\"client_id\\\": this.client_id,\\n \\\"width\\\": 350,\\n \\\"height\\\": 350,\\n }),\\n });\\n let data = JSON.parse(res);\\n let sid = data[\\\"sid\\\"];\\n let body = {\\n \\\"authorize\\\": 1,\\n \\\"scope\\\": \\\"user:base,file:all:read,file:all:write\\\",\\n \\\"drives\\\": [\\\"backup\\\", \\\"resource\\\"],\\n \\\"scopes\\\": [\\\"user:base\\\", \\\"file:all:read\\\", \\\"file:all:write\\\"],\\n \\\"sid\\\": sid\\n }\\n let headers = {\\n 'authorization': this.$this.reaccessTk\\n };\\n let res2 = this.$this.postApi(\\\"https://open.aliyundrive.com/oauth/users/qrcode/authorize?sid=\\\" + sid).body(body).headers(headers).errorWithRetry((e, _, http) => {\\n this.$this.trySolve(e);\\n http.mergeHeadAndBody({\\n headers: {\\n 'authorization': this.$this.reaccessTk,\\n }\\n });\\n return true;\\n }).start(true);\\n return get_qrcode_code(sid);\\n },\\n getToken(body) {\\n let res = post(\\\"https://openapi.aliyundrive.com/oauth/access_token\\\", {\\n body: JSON.stringify(body),\\n });\\n let data = JSON.parse(res);\\n\\n return data;\\n },\\n getOpenToken() {\\n return this.getToken({\\n code: this.getOpenTokenCode(),\\n grant_type: \\\"authorization_code\\\",\\n client_secret: this.client_secret,\\n client_id: this.client_id,\\n });\\n },\\n refreshOpenToken() {\\n return this.getToken({\\n grant_type: \\\"refresh_token\\\",\\n refresh_token: this.$this.openTokens.RefreshTokenOpen,\\n client_secret: this.client_secret,\\n client_id: this.client_id,\\n });\\n }\\n});\\n$.exports = OpenApi;\"},{\"col_type\":\"movie_3\",\"name\":\"链接定向\",\"path\":\"redirect\",\"rule\":\"js:\\nconst openMode = getItem(\\\"openMode\\\", \\\"本地解析\\\");\\nif (openMode === \\\"本地转码\\\") {\\n setItem(\\\"openMode\\\", \\\"本地解析\\\");\\n openMode = \\\"本地解析\\\";\\n}\\n\\nfunction dealArray(array) {\\n let isString = typeof array[0] === \\\"string\\\";\\n if (array.length === 1) {\\n return dealResult(array[0]);\\n } else if (isString) {\\n array = array.map(aliUrl => ({\\n aliUrl\\n }));\\n }\\n let select = array.map((v, i) => v.title || v.aliUrl.replace(/http.*?\\\\/s\\\\//, \\\"\\\"));\\n return $(select).select((result) => {\\n let index = MY_INDEX;\\n return $.require(\\\"redirect\\\").dealResult(result[index]);\\n }, array);\\n}\\n\\nfunction dealResult(result) {\\n let resultType = typeof result;\\n if (resultType === \\\"string\\\") {\\n return getModeUrl(result);\\n } else if (Array.isArray(result)) {\\n return dealArray(result);\\n } else if (result instanceof EasyNextPage) {\\n return result.toNextPage();\\n } else if (resultType === \\\"object\\\") {\\n return getModeUrl(result.aliUrl, result.sharePwd);\\n }\\n return \\\"toast://错误类型:\\\" + resultType;\\n}\\n\\nfunction EasyNextPage(list, col) {\\n //this.list = list;\\n col = col || \\\"text_3\\\";\\n this.toNextPage = function() {\\n return $().rule((list, col_type) => {\\n setResult(list.map(v => ({\\n col_type,\\n url: $().lazyRule(v => $.require(\\\"redirect\\\").dealResult(v), v),\\n title: v.title || v.aliUrl.replace(/http.*?\\\\/s\\\\//, \\\"\\\")\\n })));\\n }, list, col);\\n }\\n}\\n\\nfunction setErrorPop(name, author) {\\n return $(\\\"搜索引擎「\\\" + name + \\\"」失效请联系搜索引擎作者\\\" + (author ? \\\"[\\\" + author + \\\"]\\\" : \\\"\\\") + \\\"修复或删除\\\\n\\\\n引擎作者可以去官方频道询问\\\\n点击确定快速删除\\\").confirm((name) => {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"确定要删除\\\" + name + \\\"吗?注意删除后无法恢复\\\",\\n confirm: $.toString((name) => {\\n let arr = $.require(\\\"configs\\\").getJson();\\n let index = arr.findIndex(v => v.name === name);\\n arr.splice(index, 1);\\n $.require(\\\"configs\\\").saveJson(arr);\\n clearItem(\\\"rule\\\");\\n refreshPage(true);\\n return \\\"toast://删除成功\\\";\\n }, name)\\n });\\n }, name);\\n}\\n\\nfunction doubleTreating({\\n findAliUrl,\\n basicUrl,\\n name,\\n author,\\n aliUrl,\\n ruleType\\n}) {\\n if (!findAliUrl) return getModeUrl(aliUrl);\\n if (ruleType === \\\"JSON\\\") {\\n let ParseRlue = $.require(\\\"ParseRlue\\\");\\n let find = findAliUrl;\\n findAliUrl = (url, basicUrl) => {\\n return ParseRlue.parseUrlJson(url, find, basicUrl);\\n }\\n }else if (ruleType === \\\"HTML\\\") {\\n let ParseRlue = $.require(\\\"ParseRlue\\\");\\n let find = findAliUrl;\\n findAliUrl = (url, basicUrl) => {\\n return ParseRlue.parseUrlHtml(url, find, basicUrl);\\n }\\n } else {\\n findAliUrl = new Function(\\\"input\\\", \\\"basicUrl\\\", \\\"EasyNextPage\\\", findAliUrl);\\n }\\n try {\\n let result = findAliUrl(aliUrl, basicUrl, EasyNextPage);\\n return dealResult(result);\\n } catch (e) {\\n log(e.toString());\\n return setErrorPop(name, author);\\n }\\n}\\n\\nfunction getModeUrl(aliUrl, sharePwd) {\\n if ($.require(\\\"alitest\\\").test(aliUrl)) {\\n if (openMode === \\\"本地解析\\\") {\\n return \\\"hiker://page/aliyun?page=fypage&realurl=\\\" + encodeURIComponent(aliUrl) + \\\"&sharePwd=\\\" + (sharePwd || \\\"\\\");\\n } else {\\n shareId = aliUrl.split(\\\"/\\\")[4];\\n return \\\"smartdrive://share/browse?shareId=\\\" + shareId + \\\"&sharePwd=\\\" + (sharePwd || \\\"\\\");\\n }\\n } else if (aliUrl.includes(\\\"pan.quark.cn/s/\\\")) {\\n if (openMode === \\\"本地解析\\\") {\\n let has = fetch(\\\"hiker://home@Quark.简\\\") != \\\"null\\\";\\n if (has) {\\n return \\\"hiker://page/quarkList?rule=Quark.简&realurl=\\\" + encodeURIComponent(aliUrl) + \\\"&sharePwd=\\\" + (sharePwd || \\\"\\\");\\n } else {\\n return aliUrl;\\n }\\n } else {\\n return \\\"qklink://www.uc.cn/b20b84fd735a8dd3f7541129bacc4e9a?action=open_url&url=\\\" + aliUrl;\\n }\\n } else if (aliUrl.startsWith(\\\"http\\\")) {\\n return aliUrl;\\n } else if (aliUrl.startsWith(\\\"magnet\\\")) {\\n if (openMode === \\\"本地解析\\\") {\\n return aliUrl;\\n } else {\\n return \\\"download://\\\" + aliUrl;\\n }\\n } else {\\n return aliUrl;\\n }\\n}\\n$.exports.getModeUrl = getModeUrl;\\n$.exports.doubleTreating = doubleTreating;\\n$.exports.dealResult = dealResult;\"},{\"col_type\":\"movie_3\",\"name\":\"规则解析\",\"path\":\"ParseRlue\",\"rule\":\"function toPath(value) {\\n if (typeof value !== 'string') {\\n return [];\\n }\\n\\n let path = [];\\n let current = '';\\n let inBrackets = false;\\n let escape = false;\\n\\n for (let i = 0; i < value.length; i++) {\\n let char = value[i];\\n\\n if (escape) {\\n current += char;\\n escape = false;\\n } else if (char === '\\\\\\\\') {\\n escape = true;\\n } else if (char === '.' && !inBrackets) {\\n path.push(current);\\n current = '';\\n } else if (char === '[') {\\n inBrackets = true;\\n } else if (char === ']') {\\n inBrackets = false;\\n } else {\\n current += char;\\n }\\n }\\n\\n if (current) {\\n path.push(current);\\n }\\n\\n return path;\\n}\\n\\nfunction getJson(obj, path) {\\n if (!obj || !Array.isArray(path)) {\\n return undefined;\\n }\\n if (path.length === 0) {\\n return obj;\\n }\\n\\n let current = obj;\\n\\n for (let i = 0; i < path.length; i++) {\\n let key = path[i];\\n\\n if (current === null || current === undefined || typeof current !== 'object') {\\n return undefined;\\n }\\n\\n current = current[key];\\n }\\n\\n return current;\\n}\\n\\nfunction dealRule(json, rule, basicUrl) {\\n if (!rule) return;\\n rule = rule.split(\\\"@js=\\\");\\n let rule0 = rule.at(0);\\n let t = \\\"\\\";\\n if (rule0) {\\n t = getJson(json, toPath(rule0));\\n } else {\\n t = json;\\n }\\n if (rule.length > 1) {\\n return new Function(\\\"input\\\", \\\"$$\\\", \\\"basicUrl\\\", '\\\"use strict\\\";return ' + rule.at(1))(t, json, basicUrl);\\n }\\n return t;\\n}\\n\\nfunction parseSearchJson(url, rule) {\\n let json = JSON.parse(fetch(url));\\n let rules = rule.split(\\\"\\\\n\\\");\\n let list = getJson(json, toPath(rules.at(0)));\\n if (!list || !Array.isArray(list)) {\\n throw new Error(\\\"JSON:列表解析为空\\\");\\n }\\n let data = [];\\n for (let it of list) {\\n data.push({\\n title: dealRule(it, rules.at(1), url),\\n url: dealRule(it, rules.at(2), url),\\n desc: dealRule(it, rules.at(3), url),\\n pic_url: dealRule(it, rules.at(4), url),\\n });\\n }\\n return data;\\n}\\n\\nfunction parseUrlJson(url, rule, basicUrl) {\\n if (rule.startsWith(\\\"@js=\\\")) {\\n return dealRule(url, rule, basicUrl);\\n } else {\\n let json = JSON.parse(fetch(url));\\n return dealRule(json, rule, basicUrl);\\n }\\n\\n}\\n\\nfunction dealRuleForHtml(html, rule, basicUrl) {\\n if (!rule) return;\\n rule = rule.split(\\\"@js=\\\");\\n let rule0 = rule.at(0);\\n let t = \\\"\\\";\\n if (rule0) {\\n t = pdfh(html, rule0);\\n } else {\\n t = html\\n }\\n if (rule.length > 1) {\\n return new Function(\\\"input\\\", \\\"$$\\\", \\\"basicUrl\\\", '\\\"use strict\\\";return ' + rule.at(1))(t, html, basicUrl);\\n }\\n return t;\\n}\\n\\nfunction parseSearchHtml(url, rule) {\\n let html = fetch(url);\\n let rules = rule.split(\\\"\\\\n\\\");\\n let list = pdfa(html, rules.at(0));\\n if (!list || !Array.isArray(list)) {\\n throw new Error(\\\"HTML:列表解析为空\\\");\\n }\\n let data = [];\\n for (let it of list) {\\n let curl = dealRuleForHtml(it, rules.at(2), url);\\n data.push({\\n title: dealRuleForHtml(it, rules.at(1), url),\\n url: curl.startsWith(\\\"http\\\") ? curl : (getHome(url) + curl),\\n desc: dealRuleForHtml(it, rules.at(3), url),\\n pic_url: dealRuleForHtml(it, rules.at(4), url),\\n });\\n }\\n return data;\\n}\\n\\nfunction parseUrlHtml(url, rule, basicUrl) {\\n if (rule.startsWith(\\\"@js=\\\")) {\\n return dealRuleForHtml(url, rule, basicUrl);\\n } else {\\n let html = fetch(url);\\n return dealRuleForHtml(html, rule, basicUrl);\\n }\\n}\\n$.exports = {\\n parseSearchJson,\\n parseUrlJson,\\n parseSearchHtml,\\n parseUrlHtml\\n};\"},{\"col_type\":\"movie_3\",\"name\":\"我的阿里\",\"path\":\"myaliyun\",\"rule\":\"js:\\n//@author LoyDgIk\\nconst AliAccessApi = $.require(\\\"aliPlayApi\\\");\\nlet openAPIList = [\\\"alist\\\", \\\"drive\\\", \\\"tvbox\\\", \\\"XBY\\\"];\\nlet shareInfo = MY_PARAMS.shareInfo;\\nif (MY_PARAMS.transfer) {\\n if (!shareInfo) {\\n shareInfo = MY_PARAMS;\\n }\\n MY_PARAMS = {\\n isHome: true,\\n shareInfo\\n };\\n}\\n\\nlet fileId = MY_PARAMS.fileId || \\\"root\\\";\\nlet searchKey = decodeURIComponent(getParam(\\\"searchKey\\\", \\\"\\\")) || undefined;\\nlet isSearch = !!searchKey;\\n\\nlet pageId = String(Date.now()).slice(6);\\n\\nlet skipFile = Number(getItem(\\\"myskipFile\\\", \\\"0\\\"));\\n\\nfunction signInReward(aliAccessApi) {\\n let today = $.dateFormat(Date.now(), \\\"yyyyMMdd\\\");\\n let lastday = getItem(\\\"AliDay\\\", \\\"0\\\");\\n if (today != lastday && new Date().getHours() >= 0) {\\n setItem(\\\"AliDay\\\", today);\\n let result = \\\"\\\";\\n try {\\n if ((result = aliAccessApi.signInReward())) {\\n toast(result);\\n } else {\\n toast(result);\\n }\\n } catch (e) {\\n toast(\\\"签到失败:\\\" + e.toString());\\n }\\n }\\n}\\n\\nfunction formatDate(_date, fmt) {\\n let date = !isNaN(_date) ? new Date(_date * 1000) : new Date(_date);\\n return $.dateFormat(date, fmt || \\\"yyyy-MM-dd HH:mm:ss\\\")\\n}\\n\\nfunction formatSize(size) {\\n if (!size) {\\n return '';\\n }\\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\\n let i = 0;\\n while (size >= 1024) {\\n size /= 1024;\\n i++;\\n }\\n size = i ? Number(size.toFixed(2)) : size;\\n return `${size} ${units[i]}`;\\n}\\n\\nfunction setMyPaCache(key, value) {\\n MY_PARAMS[key] = value;\\n}\\n\\nfunction saveMyPaCache() {\\n setPageParams(MY_PARAMS);\\n}\\n\\nfunction setMarker(marker) {\\n setMyPaCache(\\\"marker\\\", marker);\\n}\\n\\n\\nif (MY_PARAMS.noPic) {\\n setPagePicUrl();\\n setMyPaCache(\\\"noPic\\\", false);\\n}\\n/*\\nfunction setVideoItemCache(videoItemCache) {\\n setMyPaCache(\\\"videoItemCache\\\", videoItemCache);\\n}\\n\\nfunction setSubtitleCache(subtitleCache) {\\n setMyPaCache(\\\"subtitleCache\\\", subtitleCache);\\n}*/\\n\\nlet iconType = \\\"ai|apk|avi|css|dmg|exe|flv|gif|hiker|html|iso|jpg|js|json|log|mov|mp3|mp4|otf|php|png|ppt|psd|table|txt|wav|xls|zip|css|doc|epub|exc|htm|xlsx\\\".split('|');\\n\\nfunction getIcon(ext, type) {\\n let root = \\\"https://gitcode.net/qq_32394351/dr/-/raw/master/img/文件类型2/\\\";\\n if (type === \\\"folder\\\") {\\n return root + \\\"文件夹.svg\\\";\\n }\\n if (iconType.includes((ext || \\\"\\\").toLowerCase())) {\\n return root + ext + \\\".svg\\\";\\n }\\n return root + \\\"文件.svg\\\";\\n\\n}\\n\\nfunction load(items) {\\n const aliAccessApi = AliAccessApi.createDefault();\\n\\n let orders = {\\n \\\"名称正序\\\": \\\"name#ASC\\\",\\n \\\"名称倒序\\\": \\\"name#DESC\\\",\\n \\\"时间正序\\\": \\\"updated_at#ASC\\\",\\n \\\"时间倒序\\\": \\\"updated_at#DESC\\\",\\n \\\"大小正序\\\": \\\"size#ASC\\\",\\n \\\"大小倒序\\\": \\\"size#DESC\\\"\\n };\\n let playMode = getItem(\\\"my_aliyun_playMode\\\", \\\"转码\\\");\\n let ordersKeys = Object.keys(orders);\\n let orderName = getItem(\\\"aliyun_order\\\", ordersKeys[0]);\\n let order = orders[orderName].split(\\\"#\\\");\\n let styles = [\\\"text_1\\\", \\\"movie_2\\\", \\\"card_pic_3\\\", \\\"avatar\\\", \\\"追剧\\\", \\\"看图\\\"];\\n let style = getItem(\\\"aliyun_style\\\", styles[0]);\\n\\n let isBackupDrivid = MY_PARAMS.isBackupDrivid || getItem(\\\"myAliPanDrivid\\\", \\\"false\\\") === \\\"true\\\";\\n aliAccessApi.setMyDrividType(isBackupDrivid);\\n if (MY_PAGE === 1) {\\n if (!getMyVar(\\\"mountzimu\\\", \\\"\\\")) {\\n storage0.putMyVar(\\\"mountzimu\\\", {});\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"mountzimu\\\");\\n clearMyVar(\\\"aliShareToken\\\");\\n clearVar(\\\"dm_share\\\");\\n clearMyVar(\\\"dmlist\\\");\\n clearMyVar(\\\"listSearchKey\\\");\\n clearMyVar(\\\"dm_listUrlList\\\");\\n }));\\n }\\n setMarker();\\n if (MY_PARAMS.isHome) {\\n signInReward(aliAccessApi);\\n items.push({\\n title: \\\"备份盘\\\" + [\\\"\\\", \\\"√\\\"][Number(isBackupDrivid)],\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n setItem(\\\"myAliPanDrivid\\\", \\\"true\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"text_2\\\",\\n });\\n items.push({\\n title: \\\"资源盘\\\" + [\\\"√\\\", \\\"\\\"][Number(isBackupDrivid)],\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n setItem(\\\"myAliPanDrivid\\\", \\\"false\\\");\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"text_2\\\",\\n });\\n }\\n if (shareInfo) {\\n items.push({\\n title: \\\"““转存到当前文件夹””\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((shareInfo, isBackupDrivid, fileId) => {\\n const AliAccessApi = $.require(\\\"aliPlayApi\\\");\\n let aliAccessApi = AliAccessApi.createDefault(shareInfo.shareId, shareInfo.sharePwd, shareInfo.shareToken);\\n aliAccessApi.setMyDrividType(isBackupDrivid);\\n aliAccessApi.copyFileToCloudFile(shareInfo.fileId, fileId);\\n backToHome();\\n return \\\"hiker://empty\\\";\\n }, shareInfo, isBackupDrivid, fileId),\\n col_type: \\\"text_center_1\\\",\\n });\\n }\\n if (!isSearch) {\\n items.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n input = input.trim();\\n if (!input) return \\\"toast://请输入关键词\\\";\\n return \\\"hiker://page/myaliyun#noHistory##fullTheme#?page=fypage&searchKey=\\\" + encodeURIComponent(input);\\n }),\\n col_type: \\\"input\\\",\\n extra: {\\n onChange: \\\"putMyVar('listSearchKey',input)\\\",\\n\\n }\\n });\\n } else {\\n items.push({\\n title: \\\"““\\\" + searchKey + \\\"””的搜索结果\\\",\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n }\\n let funcItems = [];\\n funcItems.push({\\n title: style,\\n url: $(styles, 1, \\\"排布样式\\\").select(() => {\\n setItem(\\\"aliyun_style\\\", input);\\n refreshPage();\\n return \\\"toast://已切换\\\";\\n }),\\n pic_url: \\\"https://hikerfans.com/img/ali_icon.svg\\\"\\n }, {\\n title: orderName,\\n url: $(ordersKeys, 2, \\\"排序方式\\\").select(() => {\\n setItem(\\\"aliyun_order\\\", input);\\n refreshPage();\\n return \\\"toast://切换成功\\\";\\n }),\\n pic_url: \\\"https://hikerfans.com/img/ali_sort.svg\\\"\\n }, {\\n title: playMode,\\n url: $([\\\"转码\\\", \\\"原画\\\"], 1, \\\"播放模式\\\").select(() => {\\n setItem(\\\"my_aliyun_playMode\\\", input);\\n refreshPage();\\n return \\\"toast://切换成功\\\";\\n }),\\n pic_url: \\\"https://hikerfans.com/img/ali_play.svg\\\",\\n });\\n\\n funcItems.push({\\n title: openAPIList[getItem(\\\"openApiMode\\\", \\\"0\\\")],\\n url: $(openAPIList, 1, \\\"原画API(不要频繁切换)\\\").select((openAPIList) => {\\n setItem(\\\"openApiMode\\\", String(openAPIList.indexOf(input)));\\n deleteFile($.require(\\\"tokenPath\\\").openTokensFilepath);\\n refreshPage(false);\\n return \\\"toast://已切换为\\\" + input;\\n }, openAPIList),\\n pic_url: \\\"https://hikerfans.com/img/ali_api.svg\\\",\\n });\\n\\n if (!isSearch) {\\n funcItems.push({\\n title: \\\"功能\\\",\\n url: $([\\\"查看手动挂载字幕\\\", \\\"获取弹幕搜索规则\\\", \\\"批量挂载本地弹幕\\\", \\\"推送到TVBox\\\", \\\"设置收藏封面\\\", \\\"获取投屏IP\\\" /*, \\\"极速原画下载线程\\\"*/ ], 2, \\\"更多功能\\\").select(() => {\\n switch (input) {\\n case \\\"批量挂载本地弹幕\\\":\\n return \\\"hiker://page/dmMount#noHistory##noRecordHistory#\\\";\\n case \\\"查看手动挂载字幕\\\":\\n let zm = storage0.getMyVar(\\\"mountzimu\\\", {});\\n let tip = zm.name ? \\\"当前字幕文件\\\\n\\\" + zm.name + \\\".\\\" + zm.ext : \\\"还未手动挂载字幕\\\";\\n confirm({\\n title: '手动挂载字幕',\\n content: tip + \\\"\\\\n(点击取消可以清除挂载字幕)\\\",\\n cancel: () => {\\n clearMyVar(\\\"mountzimu\\\");\\n return \\\"toast://已清除手动挂载字幕\\\";\\n }\\n });\\n return;\\n case \\\"获取弹幕搜索规则\\\":\\n let rule = {\\n \\\"js\\\": JSON.stringify(\\\"hiker://page/loadDm?rule=\\\" + MY_RULE.title + \\\"&title=\\\") + \\\"+encodeURIComponent(playdata.title.split('-')[0]);\\\",\\n \\\"name\\\": MY_RULE.title + \\\"弹幕搜索\\\"\\n };\\n return \\\"rule://\\\" + base64Encode(\\\"¥projection_screen¥\\\" + JSON.stringify(rule));\\n case \\\"推送到TVBox\\\":\\n return \\\"hiker://page/tvboxPush#noHistory##noRecordHistory#\\\";\\n case \\\"设置收藏封面\\\":\\n return $([\\\"设置封面地址\\\", \\\"搜索封面\\\"], 1).select(() => {\\n if (input === \\\"设置封面地址\\\") {\\n return $(\\\"\\\", \\\"请输入图片地址\\\").input(() => {\\n input = input.trim();\\n if (!input) return \\\"toast://请输入地址\\\";\\n setPagePicUrl(input);\\n return \\\"toast://修改成功\\\";\\n });\\n } else {\\n return \\\"hiker://page/frontCover#noHistory##noRecordHistory#\\\";\\n }\\n });\\n case \\\"获取投屏IP\\\":\\n let ip = $.require(\\\"aliUtil\\\").getIPv4Address();\\n if (ip.startsWith(\\\"192.168.\\\")) {\\n return $(ip + \\\"\\\\n该IP适用于流量+热点的投屏\\\\n请替换链接中的0.0.0.0\\\").confirm((ip) => {\\n return \\\"copy://\\\" + ip;\\n }, ip);\\n } else {\\n return $(ip + \\\"\\\\n获取失败非稳定IP,请开启热点再使用,该IP可能会变,不能投屏\\\").confirm(() => {});\\n }\\n case \\\"极速原画下载线程\\\":\\n return $(getItem(\\\"speedThread\\\", \\\"20\\\"), \\\"请输入3-32之间的整数\\\").input(() => {\\n let speedThread = parseInt(input);\\n if (speedThread < 3 || speedThread > 32) {\\n return \\\"toast://设置不合法\\\";\\n }\\n setItem(\\\"speedThread\\\", String(speedThread));\\n return \\\"toast://设置成功\\\";\\n });\\n }\\n }),\\n pic_url: \\\"https://hikerfans.com/img/ali_fileinto.svg\\\",\\n extra: {\\n pageId: pageId,\\n fileId: fileId,\\n folderName: getPageTitle()\\n }\\n });\\n } else {\\n funcItems.push({\\n title: [\\\"ALL\\\", \\\"仅文件\\\", \\\"仅文件夹\\\"][skipFile],\\n url: $([\\\"ALL\\\", \\\"仅文件\\\", \\\"仅文件夹\\\"]).select(() => {\\n setItem(\\\"myskipFile\\\", String(MY_INDEX));\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }),\\n pic_url: \\\"hiker://images/icon_search6\\\",\\n });\\n }\\n let funStyle = [\\\"\\\", \\\"\\\", \\\"\\\", \\\"icon_small_3\\\", \\\"icon_round_small_4\\\", \\\"icon_5\\\"][funcItems.length];\\n items.push.apply(items, funcItems.map(v => (v.col_type = funStyle) && v));\\n items.push({\\n col_type: \\\"line_blank\\\"\\n });\\n }\\n let rescod = {};\\n let marker = MY_PARAMS.marker;\\n if (isSearch) {\\n rescod = aliAccessApi.getSearchListFile(searchKey, marker, order[0], order[1], skipFile);\\n } else {\\n rescod = aliAccessApi.getListFile(fileId, marker, order[0], order[1]);\\n }\\n if (rescod.next_marker) {\\n setMarker(rescod.next_marker);\\n } else {\\n setMarker();\\n }\\n\\n var conts = rescod.items;\\n //字幕匹配准备\\n let subExts = [\\\"vtt\\\", \\\"srt\\\", \\\"ass\\\"];\\n var zimulist = [];\\n conts.forEach((item) => {\\n if (subExts.includes(item.file_extension && item.file_extension.toLowerCase())) {\\n let name = item.name.replace('.' + item.file_extension, '');\\n zimulist.push({\\n ext: item.file_extension,\\n file_id: item.file_id,\\n name: name\\n });\\n }\\n });\\n //处理夸页匹配字幕\\n /*\\n let hasSub = zimulist.length > 0;\\n if (hasSub&&rescod.next_marker) {\\n if (zimulist.length > 4) {\\n setSubtitleCache(zimulist.slice(-4));\\n } else {\\n setSubtitleCache(zimulist);\\n }\\n }\\n let lastItem = conts.at(-1);\\n if (hasSub&&lastItem&&lastItem.category === \\\"video\\\") {\\n setVideoItemCache(conts.splice(conts.length-1,1));\\n }\\n if (MY_PAGE > 1) {\\n let subtitleCache = MY_PARAMS.subtitleCache || [];\\n zimulist = zimulist.concat(subtitleCache);\\n let videoItemCache = MY_PARAMS.videoItemCache || [];\\n conts = videoItemCache.concat(conts);\\n setSubtitleCache();\\n setVideoItemCache();\\n }*/\\n //简体优先\\n zimulist.sort((a, b) => (b.name.endsWith(\\\".sc\\\") || b.name.endsWith(\\\".chs\\\")) - (a.name.endsWith(\\\".sc\\\") || a.name.endsWith(\\\".chs\\\")));\\n //end\\n let titleHead = {\\n video: \\\"🎬\\\",\\n audio: \\\"🎵\\\",\\n doc: \\\"📑\\\",\\n image: \\\"🖼\\\",\\n zip: \\\"📦\\\",\\n folder: \\\"📂\\\"\\n };\\n\\n function getHead(type, ext) {\\n let head = titleHead[type];\\n if (subExts.includes(ext)) {\\n head = \\\"🕸\\\";\\n }\\n return head || \\\"❓\\\";\\n }\\n\\n function getPreviewPic(fileItem) {\\n if (fileItem.thumbnail) {\\n return $(\\\"https://empty?\\\" + fileItem.file_id).image((pic) => {\\n try {\\n return fetch(pic, {\\n inputStream: true\\n });\\n } catch (e) {\\n return null;\\n }\\n }, fileItem.thumbnail);\\n }\\n }\\n\\n function deleteDFile(fileId, isBackupDrivid, name) {\\n return $(\\\"确认永久删除[\\\" + name + \\\"]\\\").confirm((fileId, isBackupDrivid) => {\\n const AliAccessApi = $.require(\\\"aliPlayApi\\\");\\n let aliAccessApi = AliAccessApi.createDefault();\\n aliAccessApi.setMyDrividType(isBackupDrivid);\\n aliAccessApi.deleteeCloudFile(fileId);\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n }, fileId, isBackupDrivid);\\n }\\n let folderStyle, fileStyle;\\n let filterType = [];\\n if (style === \\\"追剧\\\") {\\n folderStyle = \\\"avatar\\\";\\n fileStyle = \\\"movie_2\\\";\\n filterType.push(\\\"video\\\");\\n items.push({\\n title: \\\"““””\\\" + \\\"追剧模式只显示文件夹和视频\\\".small().fontcolor(\\\"grey\\\"),\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n } else if (style === \\\"看图\\\") {\\n folderStyle = \\\"avatar\\\";\\n fileStyle = \\\"card_pic_3\\\";\\n filterType.push(\\\"image\\\");\\n items.push({\\n title: \\\"““””\\\" + \\\"看图模式只显示文件夹和图片\\\".small().fontcolor(\\\"grey\\\"),\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n } else {\\n folderStyle = fileStyle = style;\\n }\\n let noSkipFile = true;\\n for (let i = 0; i < conts.length; i++) {\\n let fileItem = conts[i];\\n let cate = fileItem.category;\\n let desc = formatDate(fileItem.updated_at);\\n let pic_url = getIcon(fileItem.file_extension, fileItem.type);\\n\\n if (fileItem.type === \\\"folder\\\") {\\n let title = (folderStyle === \\\"text_1\\\" ? titleHead.folder : \\\"\\\") + fileItem.name;\\n items.push({\\n title: title,\\n url: 'hiker://page/myaliyun?page=fypage',\\n col_type: folderStyle,\\n desc: formatDate(fileItem.updated_at),\\n pic_url: pic_url,\\n extra: {\\n fileId: fileItem.file_id,\\n isBackupDrivid,\\n pageTitle: fileItem.name,\\n shareInfo,\\n noPic: true,\\n longClick: [{\\n title: \\\"删除文件夹\\\",\\n js: $.toString(deleteDFile, fileItem.file_id, isBackupDrivid, fileItem.name)\\n }]\\n }\\n });\\n } else if (noSkipFile) {\\n if (filterType.length > 0 && !filterType.includes(cate)) {\\n continue;\\n }\\n let subtitle, cls, longc = [{\\n title: \\\"删除文件\\\",\\n js: $.toString(deleteDFile, fileItem.file_id, isBackupDrivid, fileItem.name)\\n }];\\n let title = fileItem.name;\\n let nameNotExt = fileItem.name.replace('.' + fileItem.file_extension, '');\\n if (subExts.includes(fileItem.file_extension)) {\\n longc.push({\\n title: \\\"挂载字幕\\\",\\n js: $.toString((zm) => {\\n storage0.putMyVar('mountzimu', zm);\\n return 'toast://挂载完成,当前字幕文件: ' + zm.name + '.' + zm.ext;\\n }, {\\n ext: fileItem.file_extension,\\n file_id: fileItem.file_id,\\n name: nameNotExt\\n }),\\n });\\n }\\n if (cate === \\\"video\\\") {\\n if (zimulist.length) {\\n subtitle = zimulist.find(v => v.name.includes(nameNotExt));\\n }\\n cls = \\\"playlist v\\\" + pageId;\\n }\\n if (fileStyle === \\\"text_1\\\") {\\n desc += \\\"\\\\t\\\\t\\\" + formatSize(fileItem.size);\\n title = getHead(cate, fileItem.file_extension) + title;\\n } else if ([\\\"video\\\", \\\"image\\\"].includes(cate)) {\\n pic_url = getPreviewPic(fileItem) || pic_url;\\n }\\n items.push({\\n title: title,\\n url: $(\\\"#noPre#\\\").lazyRule((fileId, cate, isBackupDrivid, subtitle) => {\\n return $.require(\\\"myalilazy\\\")(fileId, cate, isBackupDrivid, subtitle);\\n }, fileItem.file_id, cate, isBackupDrivid, subtitle),\\n desc: desc,\\n pic_url: pic_url,\\n extra: {\\n id: fileItem.file_id,\\n longClick: longc,\\n cls: cls,\\n //inheritTitle: false,\\n pageTitle: fileItem.name\\n },\\n col_type: fileStyle\\n });\\n }\\n }\\n if (conts.length === 0) {\\n items.push({\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n title: \\\"““””\\\" + \\\"~~~什么都没有了哦~~~\\\".fontcolor(\\\"Gray\\\"),\\n extra: {\\n lineVisible: false,\\n }\\n });\\n }\\n}\\n\\nlet items = [];\\ntry {\\n if (MY_PAGE > 1 && !MY_PARAMS.marker) {\\n items.push({\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\",\\n title: \\\"““””\\\" + \\\"~~~什么都没有了哦~~~\\\".fontcolor(\\\"Gray\\\"),\\n extra: {\\n lineVisible: false,\\n }\\n });\\n } else {\\n load(items);\\n }\\n} catch (e) {\\n\\n log(\\\"列表加载失败#\\\\n错误信息>\\\" + e.toString() + \\\"\\\\n错误行>\\\" + e.lineNumber);\\n items.push({\\n title: '欧欧,报错了。在刷新几次?或者更换文件夹。',\\n url: \\\"hiker://empty\\\",\\n desc: e.toString(),\\n col_type: 'text_center_1'\\n });\\n //throw e;\\n}\\nsaveMyPaCache();\\nsetResult(items);\"},{\"col_type\":\"movie_3\",\"name\":\"我的阿里Lazy\",\"path\":\"myalilazy\",\"rule\":\"const AliAccessApi = $.require(\\\"aliPlayApi\\\");\\nconst {\\n openTokensFilepath,\\n aliTokensFilepath\\n} = $.require(\\\"tokenPath\\\");\\n\\nfunction aliM3u8Proxy(fileId, aliToken, isBackupDrivid, title) {\\n let suffix = \\\"media.m3u8\\\";\\n let urlname = \\\"url\\\";\\n let cacheFilePath = \\\"hiker://files/_cache/\\\" + fileId + MY_PARAMS.timestamp[0]+ \\\".m3u8\\\"\\n //过期获取播放原始链接\\n function getAliPlayUrl(fileId, line) {\\n let aliurl;\\n try {\\n const AliAccessApi = $.require(\\\"hiker://page/aliPlayApi?rule=\\\" + title);\\n let aliAccessApi = AliAccessApi.createDefault(null, null, null, aliToken, null, title).setMyDrividType(isBackupDrivid);\\n let playUrlList = aliAccessApi.getVideoCloudPreview(fileId) || [];\\n\\n aliurl = playUrlList.find(v => v.template_id == line)[urlname];\\n } catch (e) {\\n log(e.toString());\\n throw e;\\n }\\n return aliurl;\\n }\\n\\n function getM3u8Content(playurl) {\\n //media.m3u8\\n let home = playurl.split(suffix)[0];\\n let f = fetch(playurl, {\\n headers: {\\n \\\"User-Agent\\\": PC_UA,\\n \\\"Referer\\\": \\\"https://www.aliyundrive.com/\\\"\\n },\\n timeout: 3000\\n }).split(\\\"\\\\n\\\");\\n let ff = f.map(it => {\\n if (it.startsWith(\\\"media-\\\")) {\\n return \\\"/proxy?url=\\\" + base64Encode(home + it)+\\\"&timestamp=\\\"+MY_PARAMS.timestamp[0];\\n }\\n return it;\\n }).join(\\\"\\\\n\\\");\\n\\n writeFile(cacheFilePath, ff);\\n return ff;\\n }\\n\\n function updateTsUrl(url) {\\n let fid = url.split('&f=')[1].split('&')[0];\\n //log('sfid-' + fid);\\n let f = fetch(cacheFilePath).split(\\\"\\\\n\\\");\\n f.forEach(it => {\\n if (it && it.startsWith('/proxy?url=')) {\\n let furl = base64Decode(it.replace('/proxy?url=', '').split(\\\"&\\\")[0]);\\n if (url.substr(url.indexOf('/media-'), url.indexOf('.ts')) == furl.substr(furl.indexOf('/media-'), furl.indexOf('.ts'))) {\\n url = furl;\\n }\\n }\\n })\\n let expires = url.split('x-oss-expires=')[1].split('&')[0];\\n const lasttime = parseInt(expires) - Date.now() / 1000;\\n if (lasttime < 60) {\\n //log('过期更新')\\n let line = url.split('/media')[0]; //取之前播放的ts段线路\\n line = line.substring(line.lastIndexOf('/') + 1);\\n let f = getM3u8Content(getAliPlayUrl(fid, line)).split(\\\"\\\\n\\\");\\n f.forEach(it => {\\n if (it && it.startsWith('/proxy?url=')) {\\n let furl = base64Decode(it.replace('/proxy?url=', ''));\\n if (url.substr(url.indexOf('/media-'), url.indexOf('.ts')) == furl.substr(furl.indexOf('/media-'), furl.indexOf('.ts'))) {\\n url = furl;\\n }\\n }\\n })\\n\\n }\\n return url;\\n }\\n try {\\n let url = base64Decode(MY_PARAMS.url[0]);\\n if (url.includes(\\\".ts\\\")) {\\n return JSON.stringify({\\n statusCode: 302,\\n headers: {\\n \\\"Location\\\": updateTsUrl(url),\\n \\\"User-Agent\\\": PC_UA,\\n \\\"Referer\\\": \\\"https://www.aliyundrive.com/\\\"\\n }\\n });\\n } else {\\n let templateId = MY_PARAMS.templateId[0];\\n if(fileExist(cacheFilePath)){\\n return getM3u8Content(getAliPlayUrl(fileId, templateId));\\n }else{\\n return getM3u8Content(url);\\n }\\n }\\n } catch (e) {\\n log(\\\"#代理播放失败#\\\\n错误信息>\\\" + e.toString() + \\\"\\\\n错误行>\\\" + e.lineNumber);\\n }\\n}\\nconst transcoding = {\\n UHD: \\\"4K 超清\\\",\\n QHD: \\\"2K 超清\\\",\\n FHD: \\\"1080 全高清\\\",\\n HD: \\\"720 高清\\\",\\n SD: \\\"540 标清\\\",\\n LD: \\\"360 流畅\\\"\\n};\\n\\nfunction getVideo(aliAccessApi, fileId) {\\n\\n let playUrlList = aliAccessApi.getVideoCloudPreview(fileId) || [];\\n\\n let serverAddress = startProxyServer($.toString(aliM3u8Proxy, fileId, aliAccessApi.aliToken,aliAccessApi.myDrividType,MY_RULE.title));\\n\\n if (playUrlList.length > 0) {\\n let urls = [],\\n names = [];\\n playUrlList.forEach((item) => {\\n urls.push(serverAddress + \\\"?url=\\\" + base64Encode(item.url) + \\\"&timestamp=\\\"+Date.now()+\\\"&templateId=\\\" + item.template_id + \\\"#.m3u8\\\");\\n names.push(transcoding[item.template_id] ? transcoding[item.template_id] : item.template_height);\\n });\\n let heads = new Array(playUrlList.length).fill({\\n 'Referer': 'https://www.aliyundrive.com/'\\n });\\n return {\\n urls: urls,\\n names: names,\\n headers: heads,\\n };\\n } else {\\n return {};\\n }\\n\\n}\\n\\n\\nfunction getPlayFormat(playUrl, title) {\\n return {\\n names: [title],\\n urls: [playUrl + \\\"#isVideo=true##ignoreMusic=true#\\\"],\\n headers: [{\\n 'Referer': 'https://www.aliyundrive.com/',\\n \\\"User-Agent\\\": \\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\\\"\\n }]\\n };\\n}\\n\\n\\n$.exports = function(fileId, cate, isBackupDrivid, zimu) {\\n if (!fileExist(aliTokensFilepath)) {\\n toast(\\\"请先登陆登录账号\\\");\\n return \\\"hiker://page/login#noRecordHistory##noHistory#?noRefresh=1\\\";\\n }\\n let aliToken = $.require(aliTokensFilepath);\\n let aliAccessApi = AliAccessApi.createDefault(null, null, null, aliToken, null);\\n aliAccessApi.setMyDrividType(isBackupDrivid);\\n if (cate === \\\"video\\\") {\\n let playList = [];\\n let playMode = getItem(\\\"my_aliyun_playMode\\\", \\\"转码\\\");\\n try {\\n \\n if (playMode === \\\"转码\\\") {\\n playList = getVideo(aliAccessApi, fileId) || {};\\n } else if (playMode === \\\"原画\\\") {\\n playList = getPlayFormat(aliAccessApi.openCloudFileToDownUrl(fileId), playMode);\\n }\\n } catch (e) {\\n log(\\\"#\\\" + playMode + \\\"播放失败#\\\\n错误信息>\\\" + e.toString() + \\\"\\\\n错误行>\\\" + e.lineNumber);\\n if (e.code === \\\"InvalidParameter.RefreshToken\\\") {\\n toast(\\\"登陆过期,请重新登陆\\\");\\n return \\\"hiker://page/login#noRecordHistory##noHistory#?noRefresh=1\\\";\\n } else if (e.code === \\\"QuotaExhausted.Drive\\\") {\\n return \\\"toast://网盘空间不足,无法播放请清理。\\\";\\n }\\n return \\\"toast://播放失败,错误信息已打印。\\\\n请查看日志(LOG)\\\";\\n }\\n let mountsub = storage0.getMyVar('mountzimu', {});\\n if (Object.keys(mountsub).length > 0) {\\n zimu = mountsub;\\n }\\n let subtitle;\\n if (Object.keys(zimu || {}).length > 0 && playList && playList.urls && playList.urls.length > 0) {\\n java.lang.Thread.sleep(100);\\n try {\\n var zmurl = aliAccessApi.openCloudFileToDownUrl(zimu.file_id);\\n let path = 'hiker://files/cache/云盘君/sub.' + zimu.ext;\\n downloadFile(zmurl, path, {\\n 'Referer': 'https://www.aliyundrive.com/'\\n });\\n subtitle = getPath(path);\\n } catch (e) {\\n toast(\\\"字幕加载失败\\\");\\n log(e.message);\\n }\\n }\\n let dmlist = storage0.getMyVar(\\\"dmlist\\\", []);\\n let dmlist_cache = getMyVar(\\\"dmlist_cache\\\", \\\"\\\");\\n if (dmlist_cache && dmlist_cache.startsWith(fileId + \\\"#\\\")) {\\n playList.danmu = dmlist_cache.replace(fileId + \\\"#\\\", \\\"\\\");\\n } else if (dmlist.length > 0) {\\n playList.danmu = \\\"hiker://files/cache/danmu/\\\" + dmlist.splice(0, 1)[0];\\n putMyVar(\\\"dmlist_cache\\\", fileId + \\\"#\\\" + playList.danmu);\\n storage0.putMyVar(\\\"dmlist\\\", dmlist);\\n if (dmlist.length === 0) {\\n toast(\\\"弹幕列表已全部挂载\\\");\\n }\\n } else {\\n playList.danmu = getVar(\\\"dm_share\\\", \\\"\\\");\\n }\\n playList.subtitle = subtitle;\\n return JSON.stringify(playList);\\n }\\n\\n let url = aliAccessApi.openCloudFileToDownUrl(fileId);\\n\\n if (cate === \\\"image\\\") {\\n return url + \\\"#.jpg\\\";\\n } else if (cate === \\\"audio\\\") {\\n return url + \\\"#isMusic=true#\\\";\\n } else {\\n return \\\"download://\\\" + url;\\n }\\n}\"}]","proxy":"","icon":""},{"last_chapter_rule":"","title":"Quark.简","author":"@LoyDgIk","version":17,"type":"video","url":"hiker://empty##","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nlet d = [];\n\nlet cookie = getItem(\"quarkCookie\", \"\");\n\nif (!$.require(\"tool\").isLoginCookie(cookie)) {\n clearItem(\"quarkCookie\");\n d.push({\n title: '<font color=\"#13B61B\">▐ </font><b>温馨提示<b>',\n col_type: \"rich_text\",\n });\n d.push({\n url: $.require(\"account\", true),\n col_type: \"text_1\",\n title: \"未检测到登录信息,点我跳转登录账号页面,获取Quark Cookie后方可使用\",\n extra: {\n pageTitle: \"登录夸克云盘\"\n }\n });\n}\nd.push({\n title: \"云简\",\n url: \"hiker://home@云盘君.简\",\n pic_url: \"hiker://images/icon_left6\",\n col_type: \"icon_round_small_4\"\n});\nd.push({\n title: \"收藏\",\n url: \"hiker://collection?rule=\" + MY_RULE.title,\n pic_url: \"hiker://images/icon_good6\",\n col_type: \"icon_round_small_4\"\n});\nd.push({\n title: \"历史\",\n url: \"hiker://history?rule=\" + MY_RULE.title,\n pic_url: \"hiker://images/icon_time6\",\n col_type: \"icon_round_small_4\"\n});\nd.push({\n title: \"账号\",\n url: $.require(\"account\", true),\n pic_url: \"hiker://images/icon_setting6\",\n col_type: \"icon_round_small_4\"\n});\nd.push({\n title: '打开',\n desc: '请输入链接/搜索关键词',\n col_type: 'input',\n url: $.toString(() => {\n if (!input) return \"toast://请输入内容\";\n if (!input.startsWith(\"https://pan.quark.cn/s/\")) {\n return \"hiker://page/sou#noHistory#?rule=云盘君.简&p=fypage&searchTerms=\" + encodeURIComponent(input);\n }\n return \"hiker://page/quarkList?realurl=\" + encodeURIComponent(input) + \"&sharePwd=\";\n }),\n extra: {\n hideSetting: true,\n pageTitle: \"搜索\"\n }\n});\nsetResult(d);","searchFind":"","search_url":"","group":"①网盘","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"log(\"预处理\")","pages":"[{\"col_type\":\"movie_3\",\"name\":\"夸克列表API\",\"path\":\"QuarkShareApi\",\"rule\":\"js:\\n//@author LoyDgIk\\nlet httpRequest = $.require(\\\"httpRequest\\\");\\nconst baseUrl = \\\"https://pan.quark.cn\\\";\\n\\nfunction QuarkShareApi(shareId, sharePwd) {\\n this.shareId = shareId;\\n this.sharePwd = sharePwd;\\n this.refreshCallBack = (() => void 0);\\n //this.shareToken = shareToken || this.getShareToken();\\n}\\nObject.assign(QuarkShareApi.prototype, {\\n setRefresh(refreshCallBack) {\\n this.refreshCallBack = refreshCallBack;\\n return this;\\n },\\n setToken(shareToken) {\\n this.shareToken = shareToken;\\n return this;\\n },\\n requestHttp(api) {\\n return new httpRequest(baseUrl+api).success((body) => {\\n if (body.status !== 200) {\\n throw new Error(body.message);\\n }\\n return body;\\n });\\n },\\n getToken() {\\n return this.shareToken || this.getShareToken();\\n },\\n\\n getShareToken() {\\n let result = this.requestHttp(\\\"/1/clouddrive/share/sharepage/token\\\").body({\\n \\\"pwd_id\\\": this.shareId,\\n \\\"passcode\\\": this.sharePwd,\\n }).bodyToString(true).setStartRequestFunc(post).start(true);\\n this.shareToken = result.data.stoken;\\n this.refreshCallBack(result.data.stoken, this);\\n return this.shareToken;\\n },\\n getListFile(fileId, page, orderBy) {\\n let result = this.requestHttp(\\\"/1/clouddrive/share/sharepage/detail?pr=ucpro&fr=pc\\\").buildUrl({\\n pwd_id: this.shareId || \\\"\\\",\\n stoken: encodeURIComponent(this.getToken() || \\\"\\\"),\\n pdir_fid: fileId || \\\"\\\",\\n force: 0,\\n _page: page,\\n _size: 50,\\n _fetch_banner: 1,\\n _fetch_share: 1,\\n _fetch_total: 1,\\n _sort: \\\"file_type:asc,\\\" + orderBy\\n }).errorWithRetry((err, res, http) => {\\n if (JSON.parse(res.body).message.includes('stoken')) {\\n http.mergeHeadAndBody({\\n buildUrl: {\\n stoken: encodeURIComponent(this.getShareToken()||\\\"\\\")\\n }\\n });\\n return true;\\n }\\n }).start(true);\\n return result;\\n }\\n});\\n$.exports = QuarkShareApi;\"},{\"col_type\":\"movie_3\",\"name\":\"httpRequest\",\"path\":\"httpRequest\",\"rule\":\"function httpRequest(url, options) {\\n this.retryCount = 0;\\n this.url = url;\\n this.options = Object.assign({}, options, {\\n withHeaders: true\\n });\\n this.errorCallback = (err, res) => {throw err};\\n this.errorCallbackWithRetry = (err, res, tryRestart) => false;\\n this.successCallback = (body, statusCode, headers) => body;\\n this.errorTypeCallback = (err, res) => err;\\n this.startRequest = fetch;\\n this._bodyToString = false;\\n this.buildParam = void(0);\\n}\\n\\nObject.assign(httpRequest.prototype, {\\n bodyToString(flag) {\\n this._bodyToString = !!flag;\\n return this;\\n },\\n body(body) {\\n this.options.body = body || void 0;\\n return this;\\n },\\n buildUrl(buildParam) {\\n this.buildParam = buildParam || {};\\n return this;\\n },\\n setStartRequestFunc(func) {\\n this.startRequest = func;\\n return this;\\n },\\n headers(headers) {\\n this.options.headers = headers || void 0;\\n return this;\\n },\\n success(successCallback) {\\n if (typeof successCallback !== \\\"function\\\") return this;\\n this.successCallback = successCallback;\\n return this;\\n },\\n error(errorCallback) {\\n if (typeof errorCallback !== \\\"function\\\") return this;\\n this.errorCallback = errorCallback;\\n return this;\\n },\\n errorType(errorTypeCallback) {\\n if (typeof errorTypeCallback !== \\\"function\\\") return this;\\n this.errorTypeCallback = errorTypeCallback;\\n return this;\\n },\\n errorWithRetry(retryCount, errorCallbackWithRetry) {\\n if (typeof retryCount === \\\"function\\\" && typeof errorCallbackWithRetry === \\\"undefined\\\") {\\n errorCallbackWithRetry = retryCount;\\n retryCount = 1;\\n }\\n if (typeof errorCallbackWithRetry !== \\\"function\\\") {\\n return this;\\n }\\n this.retryCount = Number(retryCount);\\n this.errorCallbackWithRetry = errorCallbackWithRetry;\\n return this;\\n },\\n start(toJson) {\\n let options = Object.assign({}, this.options);\\n if (typeof options.body === \\\"object\\\" && this._bodyToString) {\\n options.body = JSON.stringify(options.body);\\n }\\n var res = JSON.parse(this.startRequest(this.buildParam?buildUrl(this.url, this.buildParam):this.url, options));\\n try {\\n if (res.statusCode >= 200 && res.statusCode <= 300) {\\n let body = res.body;\\n if (toJson) {\\n body = JSON.parse(body);\\n }\\n return this.successCallback(body, res);\\n } else {\\n throw new Error(String(res.statusCode));\\n }\\n } catch (err) {\\n try {\\n err = this.errorTypeCallback(err, res);\\n } catch (e) {\\n\\n }\\n if (this.retryCount) {\\n let tryResult = this.errorCallbackWithRetry(err, res, this);\\n if (tryResult) {\\n this.retryCount--;\\n return this.start(toJson);\\n } else {\\n this.retryCount = 0;\\n return this.errorCallback(err, res);\\n }\\n } else {\\n return this.errorCallback(err, res);\\n }\\n }\\n },\\n setOptions(options) {\\n this.options = Object.assign({}, options, {\\n withHeaders: true\\n });\\n return this;\\n },\\n mergeHeadAndBody(options) {\\n options = options || {};\\n Object.assign(this.options.headers||{}, options.headers);\\n if (typeof this.options.body === \\\"object\\\" && typeof options.body === \\\"object\\\") {\\n Object.assign(this.options.body||{}, options.body);\\n }\\n if (typeof options.buildUrl === \\\"object\\\") {\\n Object.assign(this.buildParam||{}, options.buildUrl);\\n }\\n return this;\\n }\\n});\\n\\nObject.assign(httpRequest, {\\n fetch(url, options) {\\n return new httpRequest(url, options);\\n },\\n post(url, options) {\\n return new httpRequest(url, options).setStartRequestFunc(post);\\n },\\n request(url, options) {\\n return new httpRequest(url, options).setStartRequestFunc(request);\\n },\\n postRequest(url, options) {\\n return new httpRequest(url, options).setStartRequestFunc(postRequest);\\n },\\n fetchCookie(url, options) {\\n return new httpRequest(url, options).setStartRequestFunc(fetchCookie);\\n }\\n});\\n$.exports = httpRequest;\"},{\"col_type\":\"movie_3\",\"name\":\"夸克列表\",\"path\":\"quarkList\",\"rule\":\"js:\\nlet d = [];\\n\\naddListener(\\\"onClose\\\", () => clearMyVar(\\\"playUrlCache\\\"));\\naddListener(\\\"onRefresh\\\", () => clearMyVar(\\\"playUrlCache\\\"));\\nlet soUrl = decodeURIComponent(getParam(\\\"realurl\\\", \\\"\\\"));\\nlet realurl = soUrl.split(\\\"?\\\")[0];\\nlet urlData = realurl.split(\\\"/\\\");\\n\\nlet shareId = MY_PARAMS.shareId || urlData[4].replace(\\\"#\\\", \\\"\\\");\\nlet sharePwd = getParam(\\\"sharePwd\\\", MY_PARAMS.sharePwd || getParam(\\\"passcode\\\", \\\"\\\", soUrl) || \\\"\\\");\\nlet shareToken = getParam(\\\"shareToken\\\", MY_PARAMS.shareToken || \\\"\\\");\\n\\nlet fileId = MY_PARAMS.fileId;\\n\\nlet sort = {\\n \\\"名称正序\\\": \\\"file_name:asc\\\",\\n \\\"名称倒序\\\": \\\"file_name:desc\\\",\\n \\\"时间正序\\\": \\\"updated_at:asc\\\",\\n \\\"时间倒序\\\": \\\"updated_at:desc\\\"\\n};\\nlet styles = [\\\"text_1\\\", \\\"avatar\\\"];\\n\\nlet sortValue = sort[getItem(\\\"sortKey\\\", \\\"名称正序\\\")];\\nlet style = getItem(\\\"style\\\", styles[0]);\\nif (MY_PAGE == 1) {\\n d.push({\\n title: \\\"夸克网盘\\\",\\n col_type: \\\"icon_5\\\",\\n pic_url:\\\"hiker://images/icon_kuake\\\",\\n url: $(\\\"当前是夸克网盘,众所周知夸克网盘和阿里云盘不是同一个账号,点击功能按钮=>个人账号管理即可登录夸克账号\\\").confirm(()=>{}),\\n });\\n d.push({\\n title: style,\\n url: $(styles, 1, '请选择').select(() => {\\n setItem('style', input);\\n refreshPage();\\n }),\\n pic_url: \\\"https://hikerfans.com/img/ali_icon.svg\\\",\\n col_type: \\\"icon_5\\\"\\n });\\n d.push({\\n title: getItem(\\\"sortKey\\\", \\\"名称正序\\\"),\\n url: $(Object.keys(sort), 1, '请选择').select(() => {\\n setItem(\\\"sortKey\\\", input)\\n refreshPage();\\n }),\\n pic_url: \\\"https://hikerfans.com/img/ali_sort.svg\\\",\\n col_type: \\\"icon_5\\\"\\n });\\n d.push({\\n title: getItem(\\\"quark_playMode\\\", \\\"转码\\\"),\\n url: $([\\\"转码\\\", \\\"原画\\\"], 2, \\\"播放模式\\\").select(() => {\\n setItem(\\\"quark_playMode\\\", input);\\n refreshPage();\\n return \\\"toast://切换成功\\\";\\n }),\\n col_type: \\\"icon_5\\\",\\n pic_url: \\\"https://hikerfans.com/img/ali_play.svg\\\",\\n });\\n d.push({\\n title: \\\"功能\\\",\\n url: $([\\\"跳转夸克APP\\\", \\\"复制分享链接\\\", \\\"个人账号管理\\\", \\\"原画下载线程\\\"], 2).select((shareId, sharePwd) => {\\n if (input === \\\"跳转夸克APP\\\") {\\n return \\\"qklink://www.uc.cn/b20b84fd735a8dd3f7541129bacc4e9a?action=open_url&url=https://pan.quark.cn/s/\\\" + shareId;\\n } else if (input === \\\"个人账号管理\\\") {\\n return $.require(\\\"account\\\");\\n } else if (input === \\\"原画下载线程\\\") {\\n return $(getItem(\\\"speedThread\\\", \\\"10\\\"), \\\"请输入3-32之间的整数\\\").input(() => {\\n let speedThread = parseInt(input);\\n if (speedThread < 3 || speedThread > 32) {\\n return \\\"toast://设置不合法\\\";\\n }\\n setItem(\\\"speedThread\\\", String(speedThread));\\n return \\\"toast://设置成功\\\";\\n });\\n } else if (input === \\\"复制分享链接\\\") {\\n return \\\"copy://\\\" + buildUrl(\\\"https://pan.quark.cn/s/\\\" + shareId, {\\n passcode: sharePwd\\n });\\n }\\n }, shareId, sharePwd),\\n col_type: \\\"icon_5\\\",\\n pic_url: \\\"https://hikerfans.com/img/ali_fileinto.svg\\\",\\n });\\n d.push({\\n col_type: 'line_blank'\\n });\\n}\\n\\n\\nlet QuarkShareApi = $.require(\\\"QuarkShareApi\\\");\\nlet quarkShareApi = new QuarkShareApi(shareId, sharePwd).setToken(shareToken).setRefresh((shareToken) => {\\n MY_PARAMS.shareToken = shareToken;\\n setPageParams(MY_PARAMS);\\n});\\n\\nfunction formatSize(size) {\\n if (!size) {\\n return '';\\n }\\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\\n let i = 0;\\n while (size >= 1024) {\\n size /= 1024;\\n i++;\\n }\\n size = i ? Number(size.toFixed(2)) : size;\\n return `${size} ${units[i]}`;\\n}\\n\\nlet subExts = [\\\"vtt\\\", \\\"srt\\\", \\\"ass\\\"];\\nlet titleHead = {\\n video: \\\"🎬\\\",\\n audio: \\\"🎵\\\",\\n doc: \\\"📑\\\",\\n image: \\\"🖼\\\",\\n archive: \\\"📦\\\",\\n \\\"default\\\": \\\"❓\\\"\\n};\\n\\nfunction getHead(type, ext) {\\n let head = titleHead[type];\\n /*if (subExts.includes(ext)) {\\n head = \\\"🕸\\\";\\n }*/\\n return head || \\\"❓\\\";\\n}\\ntry {\\n var res = quarkShareApi.getListFile(fileId, MY_PAGE, sortValue);\\n //设置标题\\n setPageTitle(res.data.share.title);\\n var list = res.data.list || [];\\n if (list.length === 0 && !fileId) {\\n res = quarkShareApi.getListFile(res.data.share.first_fid, MY_PAGE, sortValue);\\n setPageTitle(res.data.share.title);\\n var list = res.data.list || [];\\n }\\n list.forEach(item => {\\n //判断是否文件夹\\n if (item.dir) {\\n d.push({\\n title: \\\"📂\\\" + item.file_name,\\n desc: $.dateFormat(item.updated_at, 'yyyy-MM-dd') + ' ' + item.include_items + '项 ',\\n pic_url: \\\"https://hikerfans.com/tubiao/messy/27.svg\\\",\\n url: \\\"hiker://page/quarkList?page=fypage\\\",\\n col_type: style,\\n extra: {\\n shareId,\\n sharePwd,\\n shareToken: quarkShareApi.getToken(),\\n fileId: item.fid,\\n inheritTitle: false\\n }\\n });\\n } else {\\n d.push({\\n title: getHead(item.obj_category) + item.file_name,\\n desc: $.dateFormat(item.updated_at, 'yyyy-MM-dd') + ' ' + formatSize(item.size),\\n pic_url: item.thumbnail,\\n url: $().lazyRule((fid, fid_token, pwd_id, stoken, category) => {\\n let playUrlCache = storage0.getMyVar(\\\"playUrlCache\\\", {});\\n if (playUrlCache[fid]) {\\n return playUrlCache[fid];\\n } else {\\n let url = $.require(\\\"play\\\").getPlayUrl(fid, fid_token, pwd_id, stoken, category);\\n playUrlCache[fid] = url;\\n storage0.putMyVar(\\\"playUrlCache\\\", playUrlCache);\\n return url;\\n }\\n }, item.fid, item.share_fid_token, shareId, quarkShareApi.getToken(), item.obj_category),\\n col_type: style,\\n extra: {\\n id: item.fid,\\n inheritTitle: false,\\n cls: 'playlist ' + item.obj_category\\n }\\n })\\n }\\n d.push({\\n col_type: 'line'\\n });\\n });\\n} catch (e) {\\n d.push({\\n title: e.message,\\n url: 'hiker://empty',\\n col_type: 'text_center_1',\\n extra: {\\n lineVisible: false\\n }\\n });\\n if (e.message.includes(\\\"提取码\\\")) {\\n d.push({\\n title: \\\"输入提取码\\\",\\n url: $().input((MY_PARAMS) => {\\n setPageParams(Object.assign({}, MY_PARAMS, {\\n sharePwd: input\\n }));\\n refreshPage();\\n }, MY_PARAMS),\\n col_type: \\\"text_center_1\\\"\\n });\\n }\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"play\",\"path\":\"play\",\"rule\":\"js:\\nconst cookie = getItem(\\\"quarkCookie\\\", \\\"\\\");\\nlet httpRequest = $.require(\\\"httpRequest\\\");\\n\\nfunction CookieManage(cookie) {\\n this.cookie = {};\\n this.add(cookie);\\n}\\nObject.assign(CookieManage.prototype, {\\n add(cookie) {\\n let cookies = [];\\n if (typeof cookie === \\\"string\\\") {\\n cookies = cookie.split(\\\";\\\");\\n } else if (Array.isArray(cookie)) {\\n cookies = cookie;\\n }\\n cookies.forEach(v => {\\n v = v.split(\\\"=\\\");\\n if (v.length < 2) return;\\n this.cookie[v[0].trim()] = v[1].trim();\\n });\\n },\\n get() {\\n return Object.entries(this.cookie).map(v => v[0] + \\\"=\\\" + v[1]).join(\\\";\\\");\\n }\\n});\\nconst cookieManage = new CookieManage(cookie);\\n\\nfunction waitSleep(time) {\\n java.lang.Thread.sleep(time || 600);\\n}\\n\\nfunction requestHttp(url) {\\n return new httpRequest(url)\\n .success((body, res) => {\\n if (body.status !== 200) {\\n throw new Error(body.message);\\n }\\n cookieManage.add(res.headers[\\\"set-cookie\\\"]);\\n return body;\\n })\\n .errorType((err, res) => {\\n return new Error(JSON.parse(res.body).message);\\n })\\n .bodyToString(true)\\n .headers({\\n cookie: cookieManage.get(),\\n \\\"User-Agent\\\": \\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch\\\",\\n \\\"referer\\\": \\\"https://drive.quark.cn/\\\"\\n });\\n}\\n\\nfunction getDriveInfo() {\\n return requestHttp(\\\"https://drive.quark.cn/1/clouddrive/share/sharepage/dir?pr=ucpro&fr=pc&aver=1\\\").start(true);\\n}\\n\\nfunction createSaveTask(fid, fid_token, pwd_id, stoken) {\\n let driveInfo = getDriveInfo();\\n return requestHttp(\\\"https://drive.quark.cn/1/clouddrive/share/sharepage/save?pr=ucpro&fr=pc\\\").setStartRequestFunc(post).body({\\n \\\"fid_list\\\": [\\n fid\\n ],\\n \\\"fid_token_list\\\": [\\n fid_token\\n ],\\n \\\"to_pdir_fid\\\": driveInfo.data.dir.fid,\\n \\\"pwd_id\\\": pwd_id,\\n \\\"stoken\\\": stoken,\\n \\\"pdir_fid\\\": driveInfo.data.dir.pdir_fid\\n }).start(true);\\n}\\n\\nfunction createDeleteTask(fid) {\\n let driveInfo = getDriveInfo();\\n return requestHttp(\\\"https://drive.quark.cn/1/clouddrive/file/delete?pr=ucpro&fr=pc\\\").setStartRequestFunc(post).body({\\n \\\"action_type\\\": 2,\\n \\\"filelist\\\": [\\n fid\\n ],\\n \\\"exclude_fids\\\": []\\n }).start(true);\\n}\\n\\nfunction task(task_id, retry_index) {\\n return requestHttp(\\\"https://drive.quark.cn/1/clouddrive/task\\\").buildUrl({\\n pr: \\\"ucpro\\\",\\n fr: \\\"pc\\\",\\n task_id: task_id,\\n retry_index: retry_index\\n }).start(true);\\n}\\n\\nfunction queryTask(task_id) {\\n for (let i = 0; i < 9; i++) {\\n try {\\n let res = task(task_id, i + \\\"\\\");\\n if (res.data.status === 2) {\\n waitSleep(1000);\\n return res.data.save_as.save_as_top_fids[0];\\n }\\n waitSleep(300 * (i + 1));\\n } catch (e) {}\\n }\\n return void(0);\\n}\\n\\nfunction queryTaskStatus(task_id) {\\n for (let i = 0; i < 6; i++) {\\n try {\\n let res = task(task_id, i + \\\"\\\");\\n if (res.data.status === 2) {\\n waitSleep(1000);\\n return true;\\n }\\n waitSleep(300);\\n } catch (e) {}\\n }\\n return false;\\n}\\n\\nfunction getPreviewVideo(fid) {\\n return requestHttp(\\\"https://drive.quark.cn/1/clouddrive/file/v2/play?pr=ucpro&fr=pc\\\").body({\\n \\\"fid\\\": fid,\\n \\\"resolutions\\\": \\\"normal,low,high,super,2k,4k\\\",\\n \\\"supports\\\": \\\"fmp4,m3u8\\\"\\n }).setStartRequestFunc(post).start(true);\\n}\\n\\nfunction getDownloadUrl(fid) {\\n return requestHttp(\\\"https://drive.quark.cn/1/clouddrive/file/download?pr=ucpro&fr=pc\\\").body({\\n \\\"fids\\\": [fid]\\n }).setStartRequestFunc(post).start(true);\\n}\\n\\nfunction getPlayUrl(fid, fid_token, pwd_id, stoken, category) {\\n try {\\n if (!cookie) return \\\"toast://请登录账号\\\";\\n let taskId = createSaveTask(fid, fid_token, pwd_id, stoken).data.task_id;\\n let asfid = queryTask(taskId);\\n if (!asfid) {\\n return \\\"toast://获取失败\\\";\\n }\\n let playCookie = cookieManage.get();\\n let playHeader = {\\n Referer: \\\"http://pan.quark.cn/\\\",\\n cookie: playCookie,\\n \\\"User-Agent\\\": \\\"com.stub.StubApp/1.3.0 (Linux;Android 14) AndroidXMedia3/1.1.1\\\"\\n };\\n let playHeaders = Object.assign({}, playHeader, {\\n \\\"User-Agent\\\": \\\"LogStatistic\\\"\\n });\\n if (category == \\\"video\\\") {\\n let playMode = getItem(\\\"quark_playMode\\\", \\\"转码\\\");\\n if (playMode === \\\"转码\\\") {\\n let videoRes = getPreviewVideo(asfid);\\n let videoList = videoRes.data.video_list;\\n let playList = {\\n names: [],\\n urls: [],\\n headers: []\\n };\\n videoList.filter(v => v.accessable).forEach(v => {\\n playList.names.push(v.resolution);\\n playList.urls.push(v.video_info.url + \\\"#isVideo=true#\\\");\\n playList.headers.push(playHeaders);\\n });\\n createDeleteTask(asfid);\\n return JSON.stringify(playList);\\n } else {\\n let playUrl = getDownloadUrl(asfid).data[0].download_url;\\n let playList = {\\n names: [\\\"原画\\\"],\\n urls: [playUrl + \\\"#isVideo=true##fastPlayMode##threads=\\\" + getItem(\\\"speedThread\\\", \\\"10\\\") + \\\"#\\\"],\\n headers: [playHeaders]\\n }\\n createDeleteTask(asfid);\\n return JSON.stringify(playList);\\n }\\n } else {\\n let playUrl = getDownloadUrl(asfid).data[0].download_url;\\n createDeleteTask(asfid);\\n if (category === 'audio') {\\n let playList = {\\n names: [\\\"音频\\\"],\\n urls: [playUrl + \\\"#isVideo=true#\\\"],\\n headers: [playHeader],\\n lyric: \\\"\\\"\\n }\\n return JSON.stringify(playList);\\n } else if (category === 'image') {\\n return $(playUrl, playHeader).image();\\n } else {\\n playHeader = Object.keys(playHeader).map(key => key + \\\"@\\\" + String(playHeader[key]).replace(/;/g, \\\";;\\\"));\\n return \\\"download://\\\" + playUrl + \\\";{\\\" + playHeader.join(\\\"&&\\\") + \\\"}\\\";\\n }\\n }\\n } catch (e) {\\n if (e.message.includes(\\\"require login\\\")) {\\n toast(\\\"未登录或登录过期,请重新登录\\\");\\n return \\\"hiker://page/login\\\";\\n }\\n return \\\"toast://\\\" + e.toString();\\n }\\n}\\n\\n$.exports = {\\n getPlayUrl\\n};\"},{\"col_type\":\"movie_3\",\"name\":\"登录账号\",\"path\":\"login\",\"rule\":\"js:\\nlet d = [];\\nsetPageTitle(\\\"登录夸克账号\\\");\\naddListener(\\\"onClose\\\", () => clearMyVar(\\\"cookie\\\"));\\nd.push({\\n title: \\\"““确认登录””\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n //let cm = android.webkit.CookieManager.getInstance();\\n //let cm = com.tencent.smtt.sdk.CookieManager.getInstance();\\n //let cookie = String(cm.getCookie(\\\"https://pan.quark.cn\\\") || \\\"\\\");\\n let cookie = getMyVar(\\\"cookie\\\", \\\"\\\");\\n if ($.require(\\\"tool\\\").isLoginCookie(cookie)) {\\n setItem(\\\"quarkCookie\\\", cookie);\\n back();\\n return \\\"toast://登录成功\\\";\\n }\\n return \\\"toast://未登录\\\";\\n }),\\n desc: \\\"““””<small>点击头像可以退出账号重新登录</small>\\\",\\n col_type: \\\"text_center_1\\\"\\n});\\nd.push({\\n col_type: \\\"line_blank\\\"\\n});\\nd.push({\\n col_type: \\\"x5_webview_single\\\",\\n url: \\\"https://pan.quark.cn\\\",\\n desc: \\\"list&&screen-150\\\",\\n extra: {\\n ua: PC_UA,\\n js: $.toString((title) => {\\n let cookie = \\\"\\\";\\n setInterval(() => {\\n cookie = fba.getCookie(\\\"https://pan.quark.cn\\\");\\n fba.putVar(title + \\\"@cookie\\\", cookie);\\n }, 200);\\n }, MY_RULE.title)\\n }\\n});\\nsetResult(d)\"},{\"col_type\":\"movie_3\",\"name\":\"工具\",\"path\":\"tool\",\"rule\":\"js:\\n\\n$.exports={\\n isLoginCookie(cookie){\\n return !!(cookie && cookie.includes(\\\"__uid=\\\") && cookie.includes(\\\"__puus=\\\"));\\n }\\n};\"},{\"col_type\":\"movie_3\",\"name\":\"个人账号设置\",\"path\":\"account\",\"rule\":\"$.exports = $([\\\"Cookie登录\\\", \\\"网页登录\\\", \\\"从TVBOX获取Cookie\\\", \\\"复制Cookie\\\", \\\"清除Cookie\\\"]).select((isr) => {\\n if (input === \\\"网页登录\\\") {\\n return \\\"hiker://page/login#noRecordHistory##noHistory#\\\";\\n } else if (input === \\\"Cookie登录\\\") {\\n return $(\\\"\\\", \\\"请输入Cookie\\\").input((isr) => {\\n if ($.require(\\\"tool\\\").isLoginCookie(input)) {\\n setItem(\\\"quarkCookie\\\", input.replace(/\\\\s/g, \\\"\\\"));\\n isr && refreshPage();\\n return \\\"toast://设置成功\\\";\\n } else {\\n return \\\"toast://Cookie格式错误\\\";\\n }\\n }, isr);\\n } else if (input === \\\"从TVBOX获取Cookie\\\") {\\n let path = \\\"/storage/emulated/0/TV/.quark_user\\\";\\n if (fileExist(\\\"file://\\\" + path)) {\\n if (!new java.io.File(path).canRead()) {\\n return $(\\\"没有权限读取Cookie文件,请打开所有文件权限\\\\n海阔设置->更多功能->内部文件管理->右上角\\\").confirm(() => {});\\n }\\n try {\\n let json = JSON.parse(fetch(\\\"file://\\\" + path));\\n let cookie = json.cookie;\\n if ($.require(\\\"tool\\\").isLoginCookie(cookie)) {\\n setItem(\\\"quarkCookie\\\", cookie);\\n isr && refreshPage();\\n return \\\"toast://设置成功\\\";\\n } else {\\n return \\\"toast://Cookie格式错误\\\";\\n }\\n } catch (e) {\\n return \\\"toast://获取失败共享文件损坏\\\";\\n }\\n } else {\\n return $(\\\"未检测到TVBOX的Cookie文件\\\\n请使用过后再尝试\\\").confirm(() => {});\\n }\\n } else if (input === \\\"复制Cookie\\\") {\\n let cookie = getItem(\\\"quarkCookie\\\", \\\"\\\");\\n if (cookie) {\\n return \\\"copy://\\\" + cookie;\\n } else {\\n return \\\"toast://未登录\\\";\\n }\\n } else {\\n clearItem(\\\"quarkCookie\\\");\\n isr && refreshPage();\\n return \\\"toast://退出登录\\\";\\n }\\n}, $.importParam);\"}]","proxy":"","icon":""},{"last_chapter_rule":"","title":"Webdav","author":"Joe&小棉袄🌞","version":33,"type":"tool","url":"hiker://empty","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:$.require(\"hiker://page/main\")","searchFind":"","search_url":"","group":"①网盘","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"$.extend({\n text: [\"htm\", \"html\", \"xml\", \"java\", \"properties\", \"sql\", \"js\", \"md\", \"json\", \"conf\", \"ini\", \"vue\", \"php\", \"py\", \"bat\", \"gitignore\", \"yml\", \"go\", \"sh\", \"c\", \"cpp\", \"h\", \"hpp\", \"tsx\", \"txt\", \"epub\", \"azw3\", \"mobi\", \"pdf\", \"chm\"],\n audio: [\"mp3\", \"flac\", \"ogg\", \"m4a\", \"wav\", \"opus\"],\n movie: [\"mp4\", \"mkv\", \"avi\", \"mov\", \"rmvb\", \"webm\", \"flv\", \"m4v\", \"m3u8\"],\n img: [\"jpg\", \"png\", \"jpeg\", \"gif\", \"svg\", \"raw\"],\n subtitle: [\"vtt\", \"srt\", \"ass\"],\n yasuo: [\"zip\", \"rar\", \"jar\"],\n office: [\"doc\", \"docx\", \"xls\", \"xlsx\", \"ppt\", \"pptx\"]\n})","pages":"[{\"col_type\":\"text_1\",\"name\":\"设置\",\"path\":\"settings\",\"rule\":\"js:\\nvar d = [];\\nd.push({\\n desc: \\\"webdav地址\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n defaultValue: getItem(\\\"dav\\\", \\\"\\\"),\\n titleVisible: false,\\n onChange: $.toString(() => {\\n if (input[input.length - 1] == \\\"/\\\") {\\n url = input.substring(0, input.length - 1)\\n setItem(\\\"dav\\\", url)\\n } else {\\n setItem(\\\"dav\\\", input)\\n }\\n })\\n }\\n})\\nd.push({\\n desc: \\\"账户\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n defaultValue: getItem(\\\"user\\\", \\\"\\\"),\\n titleVisible: false,\\n onChange: $.toString(() => {\\n setItem(\\\"user\\\", input)\\n })\\n }\\n})\\nd.push({\\n desc: \\\"密码\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n defaultValue: getItem(\\\"passwd\\\", \\\"\\\"),\\n titleVisible: false,\\n type: \\\"password\\\",\\n onChange: $.toString(() => {\\n setItem(\\\"passwd\\\", input)\\n })\\n }\\n})\\nd.push({\\n title: \\\"测试连接\\\",\\n url: $().lazyRule(() => {\\n const {\\n getFiles\\n } = $.require(\\\"hiker://page/code\\\")\\n if (getFiles(getItem(\\\"dav\\\") + \\\"/\\\")) {\\n return \\\"toast://连接成功\\\"\\n } else {\\n return \\\"toast://连接失败,请检查账户密码\\\"\\n }\\n }),\\n col_type: \\\"text_center_1\\\"\\n})\\nlet icon = getItem(\\\"iconStyle\\\", \\\"默认\\\")\\nlet detail = getItem(\\\"detail\\\", \\\"开\\\")\\nlet subtitle = getItem(\\\"subtitle\\\", \\\"开\\\")\\nlet timestamp = getItem(\\\"time\\\", \\\"0\\\")\\nlet newVersion;\\nlet myVersion = MY_PARAMS.version || 999;\\ntry {\\n res = JSON.parse(fetch(\\\"http://hiker.nokia.press/hikerule/dev/getbyid?id=5210\\\"))\\n newVersion = res.result.ver\\n} catch (e) {\\n toast(\\\"道长仓库抽风了,本次未检测到新版信息\\\");\\n newVersion = myVersion;\\n}\\nlet isUpdate = Number(newVersion) <= Number(myVersion);\\nlet isVer = Number(newVersion) === Number(myVersion);\\nd.push({\\n col_type: \\\"line_blank\\\"\\n}, {\\n title: isUpdate ? \\\"已是最新版\\\" : \\\"🆙新版本\\\",\\n url: \\\"rule://5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQV2ViZGF244CR77+laG9tZV9ydWxlX3VybO+/pWh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUyMTAmYXV0aD1hYjIzMDUyYi1jMGQ2LTU4ZmMtOTU1NS1hMjUwMmEwMGEzODc=\\\",\\n col_type: \\\"text_2\\\"\\n}, {\\n title: \\\"显示详细:\\\" + detail,\\n url: $().lazyRule((detail) => {\\n setItem(\\\"detail\\\", detail == \\\"开\\\" ? \\\"关\\\" : \\\"开\\\")\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }, detail),\\n col_type: \\\"text_2\\\"\\n}, {\\n title: \\\"字幕功能:\\\" + subtitle,\\n url: $().lazyRule((subtitle) => {\\n setItem(\\\"subtitle\\\", subtitle == \\\"开\\\" ? \\\"关\\\" : \\\"开\\\")\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }, subtitle),\\n col_type: \\\"text_2\\\"\\n}, {\\n title: \\\"时间格式:\\\" + (timestamp == \\\"0\\\" ? \\\"2022/08/20 17:14:31\\\" : \\\"Sat, 20 Aug 2022 09:14:31 GMT\\\"),\\n url: $().lazyRule((timestamp) => {\\n setItem(\\\"time\\\", timestamp == \\\"0\\\" ? \\\"1\\\" : \\\"0\\\")\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }, timestamp),\\n col_type: \\\"text_1\\\"\\n}, {\\n url: $().rule(() => {\\n setResult([{\\n title: `\\n <p>本篇文章只针对设置,其他的使用方法已经在规则中说明清除了</p> <p><ins><ins>前提条件:已经更新7.9版本</ins></ins></p> <p>海阔视界首页频道规则【Webdav】¥home_rule_url¥http://hiker.nokia.press/hikerule/rulelist.json?id=5210&amp;auth=ab23052b-c0d6-58fc-9555-a2502a00a387</p> <h1 id=\\\"webdav%E6%98%AF%E4%BB%80%E4%B9%88\\\" tabindex=\\\"-1\\\">Webdav是什么</h1> <p>webdav就是一种网盘文件传输协议,常用于小众软件的数据备份。本规则可以管理webdav的文件,支持浏览、播放、下载、上传、删除等操作</p> <h1 id=\\\"%E6%89%93%E5%BC%80%E8%AE%BE%E7%BD%AE\\\" tabindex=\\\"-1\\\">打开设置</h1> <p><img src=\\\"http://alist.joegu.tk/d/hiker/Screenshot_20220821_082550_com.example.hikerview.jpg\\\" alt=\\\"Screenshot_20220821_082550_com.example.hikerview\\\" /></p> <p>将你的webdav链接和账户密码填进去(这里推荐使用坚果云,优点:稳定;缺点:容量少,价格贵。也可以自己搭建webdav系统,例如alist和cloudreve,需要一定的动手能力)</p> <h2 id=\\\"%E8%AE%BE%E7%BD%AE%E5%9B%BE%E6%A0%87\\\" tabindex=\\\"-1\\\">设置图标</h2> <p>本规则内置两种风格的图标,分别为道长的和蓝莓的,自己选择</p> <h2 id=\\\"%E6%98%BE%E7%A4%BA%E8%AF%A6%E7%BB%86\\\" tabindex=\\\"-1\\\">显示详细</h2> <p>可以列出当前文件夹或文件的创建时间。<br /> <strong><strong>问题:</strong></strong><br /> 不能自动播放下一集</p> <h2 id=\\\"%E5%AD%97%E5%B9%95\\\" tabindex=\\\"-1\\\">字幕</h2> <p>字幕功能如果打开,那么如果视频与字幕的文件名相同,那么就会自动挂载上。如果当前文件夹有这个字幕文件,但是名字不同,就会跳出选择框选择</p> <h1 id=\\\"%E8%BF%94%E5%9B%9E%E4%B8%BB%E7%95%8C%E9%9D%A2\\\" tabindex=\\\"-1\\\">返回主界面</h1> <p><img src=\\\"http://alist.joegu.tk/d/hiker/Screenshot_20220821_140705_com.example.hikerview.jpg\\\" alt=\\\"Screenshot_20220821_140705_com.example.hikerview\\\" /><br /> 可以看见有操作栏,可以上传文件,新建文件夹和删除文件三个操作</p> <p>下面是你的文件,你可以像浏览文件管理器一样使用他</p> <h1 id=\\\"%E9%AB%98%E7%BA%A7%E8%AE%BE%E7%BD%AE\\\" tabindex=\\\"-1\\\">高级设置</h1> <p>点击编辑规则,划到底部的预处理<br /> <img src=\\\"http://alist.joegu.tk/d/hiker/Screenshot_20220821_141135_com.example.hikerview.jpg\\\" alt=\\\"Screenshot_20220821_141135_com.example.hikerview\\\" /><br /> 根据注释修改,我写的几个文件格式已经很完整了,如果有朋友认为不好,可以自行修改<br /> 格式:[“类型1”,“类型2”]</p> <p>都完成了,enjoy💞</p>\\n `,\\n col_type: \\\"rich_text\\\"\\n }])\\n }),\\n title: \\\"查看使用说明\\\",\\n desc: \\\"Powered by Joe&小棉袄\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n})\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"代码\",\"path\":\"code\",\"rule\":\"$.exports.getFiles = function(path) {\\n try {\\n if (!path || path == \\\"\\\") {\\n return false\\n }\\n let webdav = buildWebDav(path, getItem(\\\"user\\\", \\\"\\\"), getItem(\\\"passwd\\\", \\\"\\\"))\\n let res = webdav.list()\\n res = JSON.parse(res)\\n return res\\n } catch (e) {\\n log(e.message)\\n return false\\n }\\n}\\n$.exports.fetchFile = function(path) {\\n let res = request(path, {\\n headers: {\\n \\\"authorization\\\": \\\"Basic \\\" + base64Encode(getItem(\\\"user\\\") + \\\":\\\" + getItem(\\\"passwd\\\"))\\n }\\n })\\n return res\\n}\\n$.exports.getIcon = function(content) {\\n if (content.dir) {\\n img = \\\"https://lanmeiguojiang.com/tubiao/more/274.png\\\"\\n } else {\\n let fileName = content.name.toLowerCase()\\n let hzm = $.require(\\\"code\\\").getHzm(fileName)\\n if (content.thumb && content.type != 0) {\\n img = content.thumb\\n } else if ($.movie.includes(hzm)) {\\n img = \\\"https://lanmeiguojiang.com/tubiao/more/30.png\\\"\\n } else if ($.audio.includes(hzm)) {\\n img = \\\"https://lanmeiguojiang.com/tubiao/more/40.png\\\"\\n } else if ($.text.includes(hzm)) {\\n img = \\\"https://lanmeiguojiang.com/tubiao/more/78.png\\\"\\n } else if ($.img.includes(hzm)) {\\n img = content.url + \\\"@headers=\\\" + JSON.stringify({\\n \\\"authorization\\\": \\\"Basic \\\" + base64Encode(getItem(\\\"user\\\") + \\\":\\\" + getItem(\\\"passwd\\\"))\\n })\\n } else if ($.yasuo.includes(hzm)) {\\n img = \\\"https://lanmeiguojiang.com/tubiao/more/201.png\\\"\\n } else if ($.office.includes(hzm)) {\\n img = \\\"https://lanmeiguojiang.com/tubiao/more/185.png\\\"\\n } else {\\n img = \\\"https://lanmeiguojiang.com/tubiao/more/239.png\\\"\\n }\\n }\\n return img\\n}\\n$.exports.getHzm = function(fileName) {\\n return fileName.substr(fileName.lastIndexOf(\\\".\\\") + 1)\\n}\\n$.exports.removeExt = function(file) {\\n return file.split('.').slice(0, -1).join('.')\\n};\\n$.exports.getSub = function(list) {\\n const {\\n getHzm\\n } = $.require(\\\"hiker://page/code\\\")\\n let s = []\\n list.forEach(item => {\\n if ($.subtitle.includes(getHzm(item.name))) {\\n s.push({\\n title: item.name,\\n url: item.url\\n })\\n }\\n })\\n return s\\n}\\n$.exports.download = function(path, name) {\\n let webdav = buildWebDav(path, getItem(\\\"user\\\", \\\"\\\"), getItem(\\\"passwd\\\", \\\"\\\"))\\n let p = \\\"hiker://files/cache/_fileSelect_\\\" + name;\\n webdav.download(name, p);\\n return getPath(p);\\n}\\n$.exports.deleteFile = function(path, name) {\\n let webdav = buildWebDav(path, getItem(\\\"user\\\", \\\"\\\"), getItem(\\\"passwd\\\", \\\"\\\"))\\n webdav.delete(name)\\n}\\n$.exports.rename = function(path, oldname, newname) {\\n toast(\\\"暂未支持\\\")\\n}\\n$.exports.sorts = function(list, method) {\\n if (method.includes(\\\"名称\\\")) {\\n list.sort(function(a, b) {\\n return a.name.localeCompare(b.name)\\n })\\n } else if (method.includes(\\\"时间\\\")) {\\n list.sort(function(a, b) {\\n return a.modifyTimestamp - b.modifyTimestamp\\n })\\n }\\n if (method.includes(\\\"反\\\")) {\\n list.reverse();\\n }\\n return list\\n}\\n$.exports.getInfo = function() {\\n return JSON.parse(readFile(\\\"hiker://files/rules/webdav/info.json\\\"))\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"主页\",\"path\":\"main\",\"rule\":\"js:\\ntry {\\n var d = [];\\n const {\\n getFiles,\\n download,\\n getIcon,\\n sorts\\n } = $.require(\\\"hiker://page/code\\\")\\n var root = getItem(\\\"dav\\\") + \\\"/\\\"\\n var paths = storage0.getMyVar(\\\"path\\\", [])\\n var sroot = paths.join(\\\"/\\\")\\n var path = root + sroot\\n var files = getFiles(path)\\n if (files) {\\n let temp = \\\"\\\"\\n sorts(files, getMyVar(\\\"sort\\\", \\\"默认\\\"))\\n let sorr = [\\\"默认\\\", \\\"名称\\\", \\\"时间\\\"]\\n d.push({\\n title: \\\"设置\\\",\\n url: \\\"hiker://page/settings\\\",\\n img: \\\"hiker://images/home_icon_item\\\",\\n col_type: \\\"icon_5\\\",\\n extra: {\\n version: MY_RULE.version\\n }\\n }, {\\n title: \\\"切换样式\\\",\\n url: $([\\\"movie_1_left_pic\\\", \\\"card_pic_3\\\", \\\"avatar\\\", \\\"movie_1_vertical_pic\\\", \\\"text_1\\\"]).select(() => {\\n setItem(\\\"col_type\\\", input)\\n refreshPage()\\n return \\\"toast://已切换\\\"\\n }),\\n img: \\\"hiker://images/home_icon_code\\\",\\n col_type: \\\"icon_5\\\"\\n }, {\\n title: \\\"上传文件\\\",\\n url: \\\"fileSelect://\\\" + $.toString((path) => {\\n let webdav = buildWebDav(path, getItem(\\\"user\\\"), getItem(\\\"passwd\\\"))\\n let s = input.split(\\\"/\\\")\\n webdav.upload(s[s.length - 1].replace(\\\"_fileSelect_\\\", \\\"\\\"), input)\\n refreshPage();\\n }, path),\\n img: \\\"hiker://images/home_icon_bookmark\\\",\\n col_type: \\\"icon_5\\\"\\n }, {\\n title: \\\"新建文件\\\",\\n url: $(\\\"\\\").input((path) => {\\n let webdav = buildWebDav(path, getItem(\\\"user\\\"), getItem(\\\"passwd\\\"))\\n writeFile(\\\"hiker://files/cache/wa.txt\\\", \\\"\\\")\\n webdav.upload(input, \\\"hiker://files/cache/wa.txt\\\")\\n refreshPage();\\n }, path),\\n img: \\\"hiker://images/home_icon_bookmark\\\",\\n col_type: \\\"icon_5\\\"\\n }, {\\n title: \\\"新文件夹\\\",\\n url: $(\\\"\\\", \\\"输入文件夹名称\\\").input((path) => {\\n let webdav = buildWebDav(path, getItem(\\\"user\\\"), getItem(\\\"passwd\\\"))\\n webdav.makeDir(input)\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }, path),\\n img: \\\"hiker://images/home_icon_fold\\\",\\n col_type: \\\"icon_5\\\"\\n })\\n sorr.forEach(item => {\\n var n = getMyVar(\\\"sort\\\", \\\"默认\\\")\\n if (n == item) {\\n var title = item + \\\"↓\\\"\\n } else if (n.includes(\\\"反\\\") && n.includes(item)) {\\n var title = item + \\\"↑\\\"\\n } else {\\n var title = item + \\\"↕\\\"\\n }\\n d.push({\\n title: title,\\n col_type: \\\"scroll_button\\\",\\n url: $().lazyRule((item) => {\\n if (getMyVar(\\\"sort\\\", \\\"默认\\\") == item) {\\n putMyVar(\\\"sort\\\", item + \\\"反\\\")\\n } else {\\n putMyVar(\\\"sort\\\", item)\\n }\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }, item)\\n })\\n })\\n d.push({\\n col_type: \\\"blank_block\\\"\\n })\\n d.push({\\n title: `<`,\\n url: $().lazyRule((paths) => {\\n paths.pop()\\n storage0.putMyVar(\\\"path\\\", paths)\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }, paths),\\n col_type: \\\"scroll_button\\\"\\n }, {\\n title: \\\"🏠\\\",\\n url: $().lazyRule(() => {\\n clearMyVar(\\\"path\\\")\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }),\\n col_type: \\\"scroll_button\\\"\\n })\\n paths.forEach((item, index) => {\\n if (item != \\\"\\\") {\\n d.push({\\n title: decodeURIComponent(item),\\n url: $().lazyRule((i, paths) => {\\n paths.splice(i + 1)\\n storage0.putMyVar(\\\"path\\\", paths)\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }, index, paths),\\n col_type: \\\"scroll_button\\\"\\n })\\n }\\n });\\n files.forEach((item, index) => {\\n let fileName = decodeURIComponent(item.name)\\n let icon = getIcon(item)\\n\\n var url = $().lazyRule((item, files, path) => {\\n var paths = storage0.getMyVar(\\\"path\\\", [])\\n const {\\n fetchFile,\\n getHzm,\\n getSub,\\n removeExt,\\n download\\n } = $.require(\\\"hiker://page/code\\\")\\n if (item.dir) {\\n paths.push(item.fileName)\\n storage0.putMyVar(\\\"path\\\", paths)\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n } else if ($.movie.includes(getHzm(item.name))) {\\n if (getItem(\\\"subtitle\\\", \\\"开\\\") == \\\"开\\\") {\\n let subtitles = getSub(files)\\n let names = [\\\"不需要字幕\\\"]\\n subtitles.forEach(ds => {\\n names.push(ds.title)\\n })\\n if (subtitles.length != 0) {\\n return $(names, 1, \\\"请选择字幕\\\").select((names, subtitles, url) => {\\n if (input == \\\"不需要字幕\\\") {\\n return JSON.stringify({\\n urls: [url],\\n headers: {\\n \\\"Authorization\\\": \\\"Basic \\\" + base64Encode(getItem(\\\"user\\\") + \\\":\\\" + getItem(\\\"passwd\\\"))\\n }\\n })\\n } else {\\n return JSON.stringify({\\n urls: [url],\\n subtitle: subtitles[names.indexOf(input) - 1].url,\\n headers: {\\n \\\"Authorization\\\": \\\"Basic \\\" + base64Encode(getItem(\\\"user\\\") + \\\":\\\" + getItem(\\\"passwd\\\"))\\n }\\n })\\n }\\n }, names, subtitles, item.url)\\n } else {\\n return item.playUrl + \\\"#isVideo=true#\\\"\\n }\\n } else {\\n return item.playUrl + \\\"#isVideo=true#\\\"\\n }\\n } else if ($.text.includes(getHzm(item.name))) {\\n return $([\\\"编辑\\\", \\\"下载\\\"]).select((item, path) => {\\n if (input == \\\"下载\\\") {\\n return \\\"download://\\\" + item.playUrl\\n } else {\\n return buildUrl(\\\"hiker://page/edit\\\", {\\n path: path,\\n name: item.name\\n })\\n }\\n }, item, path)\\n } else if ($.audio.includes(getHzm(item.name))) {\\n return item.playUrl + \\\"#isMusic=true#\\\"\\n } else if ($.img.includes(getHzm(item.name))) {\\n let p = download(path, item.name)\\n return p\\n } else {\\n return \\\"download://\\\" + item.playUrl\\n }\\n }, item, files, path)\\n d.push({\\n title: fileName,\\n desc: getItem(\\\"time\\\", \\\"0\\\") == \\\"0\\\" ? item.modifyTimeStr : item.modifyTime,\\n img: icon,\\n url: url,\\n col_type: getItem(\\\"col_type\\\", \\\"avatar\\\"),\\n extra: {\\n id: index + \\\"\\\",\\n longClick: [{\\n title: \\\"删除文件\\\",\\n js: $.toString((path, name) => {\\n return $(\\\"确定删除?\\\").confirm((path, name) => {\\n $.require(\\\"hiker://page/code\\\").deleteFile(path, name)\\n refreshPage()\\n }, path, name)\\n }, path, item.name)\\n }, {\\n title: \\\"使用其它应用打开\\\",\\n js: $.toString((path, item) => {\\n log(item)\\n let webdav = buildWebDav(path, getItem(\\\"user\\\", \\\"\\\"), getItem(\\\"passwd\\\", \\\"\\\"))\\n let p = \\\"hiker://files/cache/\\\" + item.name;\\n webdav.download(item.name, p)\\n return \\\"openFile://\\\" + p\\n }, path, item)\\n }]\\n }\\n })\\n if (getItem(\\\"detail\\\", \\\"开\\\") == \\\"开\\\" && getItem(\\\"col_type\\\", \\\"avatar\\\") == \\\"avatar\\\") {\\n d.push({\\n title: \\\"““””<small>““””<font color='#aaaaaa'>\\\" + (getItem(\\\"time\\\", \\\"0\\\") == \\\"0\\\" ? item.modifyTimeStr : item.modifyTime) + \\\"</font></small>\\\",\\n url: url,\\n col_type: \\\"text_1\\\"\\n })\\n }\\n })\\n } else if (getItem(\\\"dav\\\", \\\"\\\") == \\\"\\\" || getItem(\\\"user\\\", \\\"\\\") == \\\"\\\" || getItem(\\\"passwd\\\", \\\"\\\") == \\\"\\\") {\\n d.push({\\n title: \\\"当前未设置账号,点我设置\\\",\\n url: \\\"hiker://page/settings\\\",\\n col_type: \\\"text_center_1\\\"\\n })\\n } else {\\n d.push({\\n title: \\\"设置\\\",\\n col_type: \\\"text_1\\\",\\n url: \\\"hiker://page/settings\\\"\\n }, {\\n title: \\\"出错了,点击刷新\\\",\\n url: $().lazyRule(() => {\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }),\\n col_type: \\\"text_center_1\\\"\\n })\\n }\\n} catch (e) {\\n log(e.message)\\n toast(\\\"程序错误!!!请打开日志查看\\\")\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"编辑\",\"path\":\"edit\",\"rule\":\"js:\\nvar d = [];\\nconst {\\n download\\n} = $.require(\\\"hiker://page/code\\\")\\nvar p = download(getParam(\\\"path\\\"), getParam(\\\"name\\\"))\\nvar defa = fetch(p)\\nd.push({\\n col_type: \\\"input\\\",\\n extra: {\\n type: 'textarea',\\n height: 10,\\n highlight: true,\\n defaultValue: defa,\\n onChange: $.toString(() => {\\n putMyVar(\\\"text\\\", input)\\n updateItem(\\\"button\\\", {\\n title: `‘‘’’<big><span style=\\\"color:#6EB897\\\">保 存</span></big><strong><font color=\\\"#F54343\\\"> ◉ </front></strong>`\\n })\\n })\\n }\\n}, {\\n title: `‘‘’’<big><span style=\\\"color:#6EB897\\\">保 存</span></big>`,\\n url: $().lazyRule((defa, name) => {\\n let webdav = buildWebDav(getParam(\\\"path\\\"), getItem(\\\"user\\\"), getItem(\\\"passwd\\\"))\\n writeFile(\\\"hiker://files/cache/wa.txt\\\", getMyVar(\\\"text\\\", defa))\\n webdav.upload(name, \\\"hiker://files/cache/wa.txt\\\")\\n updateItem(\\\"button\\\", {\\n title: `‘‘’’<big><span style=\\\"color:#6EB897\\\">保 存</span></big>`\\n })\\n return \\\"toast://保存成功\\\"\\n }, defa, getParam(\\\"name\\\")),\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n id: \\\"button\\\"\\n }\\n})\\nsetResult(d);\"}]","proxy":"","icon":"https://lanmeiguojiang.com/tubiao/movie/7.svg"},{"last_chapter_rule":"","title":"Alist V3","author":"Joe","version":14,"type":"tool","url":"hiker://empty?page=fypage","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:$.require(\"home\")","searchFind":"","search_url":"","group":"①网盘","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"$.extend({\n text: [\"htm\", \"html\", \"xml\", \"java\", \"properties\", \"sql\", \"js\", \"md\", \"json\", \"conf\", \"ini\", \"vue\", \"php\", \"py\", \"bat\", \"gitignore\", \"yml\", \"go\", \"sh\", \"c\", \"cpp\", \"h\", \"hpp\", \"tsx\", \"txt\", \"epub\", \"azw3\", \"mobi\", \"pdf\", \"chm\"],\n audio: [\"mp3\", \"flac\", \"ogg\", \"m4a\", \"wav\", \"opus\"],\n movie: [\"mp4\", \"mkv\", \"avi\", \"mov\", \"rmvb\", \"webm\", \"flv\", \"m4v\", \"m3u8\", \"ts\"],\n img: [\"jpg\", \"png\", \"jpeg\", \"gif\", \"svg\", \"raw\"],\n subtitle: [\"vtt\", \"srt\", \"ass\"],\n yasuo: [\"zip\", \"rar\", \"jar\"],\n office: [\"doc\", \"docx\", \"xls\", \"xlsx\", \"ppt\", \"pptx\"]\n})\n// 调试用,请勿擅自开启\n//clearItem(\"list\")","pages":"[{\"col_type\":\"movie_3\",\"name\":\"主页\",\"path\":\"home\",\"rule\":\"js:\\nvar d = [];\\nif (fileExist(\\\"hiker://files/cache/alist_cache.json\\\")) {\\n let alist = storage0.getItem(\\\"list\\\", [])\\n var l = JSON.parse(fetch(\\\"hiker://files/cache/alist_cache.json\\\"))\\n var testlist = alist.map(function(item) {\\n return item.url\\n })\\n l.forEach(item => {\\n if (!testlist.includes(item.url)) {\\n alist.push(item)\\n } else {\\n toast(\\\"重复的链接,导入失败\\\")\\n }\\n })\\n storage0.setItem(\\\"list\\\", alist)\\n deleteFile(\\\"hiker://files/cache/alist_cache.json\\\")\\n}\\nvar alist = storage0.getItem(\\\"list\\\", [])\\nvar {\\n getIcon,\\n formatDate,\\n getFileSize,\\n sorts,\\n getHzm\\n} = $.require(\\\"api\\\")\\nif (alist.length == 0) {\\n setResult([{\\n title: \\\"当前无Alist配置\\\",\\n url: \\\"hiker://page/config\\\",\\n col_type: \\\"text_center_1\\\"\\n }])\\n} else {\\n // 设置headers\\n var headers = {}\\n\\n var path = MY_PARAMS.path ? MY_PARAMS.path : \\\"/\\\"\\n\\n var selected = parseInt(getItem(\\\"selected\\\", \\\"0\\\"))\\n var now = alist[selected]\\n\\n if (alist[selected][\\\"browser-password\\\"][path]) {\\n headers[\\\"Cookie\\\"] = \\\"browser-password=\\\" + alist[selected][\\\"browser-password\\\"][path]\\n } else {\\n headers[\\\"Cookie\\\"] = \\\"browser-password=\\\"\\n }\\n\\n let sorr = [\\\"默认\\\", \\\"名称\\\", \\\"时间\\\", \\\"大小\\\"]\\n var nsort = getItem(\\\"sort\\\", \\\"默认\\\")\\n\\n // 有密码的先获取token\\n if (now.user && now.password) {\\n let res = JSON.parse(post(now.url + \\\"api/auth/login\\\", {\\n body: JSON.stringify({\\n \\\"username\\\": now.user,\\n \\\"password\\\": now.password,\\n \\\"otp_code\\\": \\\"\\\"\\n })\\n }))\\n if (res.code == 200) {\\n headers[\\\"Authorization\\\"] = res.data.token\\n } else {\\n toast(\\\"登陆失败\\\")\\n log(res)\\n d.push({\\n title: \\\"账号密码错误\\\",\\n url: \\\"hiker://page/config\\\",\\n col_type: \\\"text_center_1\\\"\\n })\\n setResult(d)\\n }\\n }\\n if (MY_PAGE == 1) {\\n if (path == \\\"/\\\") {\\n d.push({\\n title: \\\"⚙️设置\\\",\\n url: \\\"hiker://page/config\\\",\\n col_type: \\\"scroll_button\\\"\\n })\\n alist.forEach((item, i) => {\\n d.push({\\n title: i == selected ? $.require(\\\"api\\\").color(item.name, \\\"red\\\") : item.name,\\n col_type: \\\"scroll_button\\\",\\n url: i == selected ? \\\"x5://\\\" + now.url : $().lazyRule((i) => {\\n setItem(\\\"selected\\\", i + \\\"\\\")\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }, i)\\n })\\n })\\n }\\n d.push({\\n col_type: \\\"blank_block\\\"\\n })\\n if (now.search) {\\n d.push({\\n title: \\\"🔎 搜索\\\",\\n col_type: \\\"scroll_button\\\",\\n url: \\\"hiker://page/search?page=fypage&u=\\\" + now.url + \\\"&path=\\\" + path,\\n extra: {\\n headers: headers,\\n now: now\\n }\\n })\\n }\\n if (now.user && now.password) {\\n d.push({\\n title: \\\"新建文件夹\\\",\\n col_type: \\\"scroll_button\\\",\\n url: $(\\\"\\\").input((path, now, headers) => {\\n var res = JSON.parse(post(now.url + \\\"api/fs/mkdir\\\", {\\n body: JSON.stringify({\\n path: path + \\\"/\\\" + input\\n }),\\n headers: headers\\n })).code\\n if (res == 200) {\\n refreshPage()\\n return \\\"toast://创建成功\\\"\\n } else {\\n return \\\"toast://创建失败\\\"\\n }\\n }, path, now, headers)\\n }, {\\n title: \\\"新建文件\\\",\\n col_type: \\\"scroll_button\\\",\\n url: $(\\\"\\\").input((path, now, headers) => {\\n headers[\\\"File-Path\\\"] = encodeURI(path + \\\"/\\\" + input)\\n var res = JSON.parse(request(now.url + \\\"api/fs/put\\\", {\\n body: \\\"\\\",\\n headers: headers,\\n method: \\\"PUT\\\"\\n })).code\\n if (res == 200) {\\n refreshPage()\\n return \\\"toast://创建成功\\\"\\n } else {\\n return \\\"toast://创建失败\\\"\\n }\\n }, path, now, headers)\\n }, {\\n title: \\\"添加aria2任务\\\",\\n col_type: \\\"scroll_button\\\",\\n url: $(\\\"\\\", \\\"多条用回车隔开\\\").input((path, now, headers) => {\\n var res = JSON.parse(post(now.url + \\\"api/fs/add_aria2\\\", {\\n body: JSON.stringify({\\n path: path,\\n urls: input.split(\\\"\\\\n\\\")\\n }),\\n headers: headers\\n })).code\\n if (res == 200) {\\n refreshPage()\\n return \\\"toast://创建成功\\\"\\n } else {\\n return \\\"toast://创建失败\\\"\\n }\\n }, path, now, headers)\\n })\\n }\\n\\n d.push({\\n col_type: \\\"line_blank\\\"\\n })\\n d.push({\\n col_type: \\\"big_blank_block\\\"\\n })\\n d.push({\\n col_type: \\\"big_blank_block\\\"\\n })\\n\\n // 排序\\n sorr.forEach(item => {\\n if (nsort == item) {\\n var title = item + \\\"↓\\\"\\n } else if (nsort.includes(\\\"反\\\") && nsort.includes(item)) {\\n var title = item + \\\"↑\\\"\\n } else {\\n var title = item + \\\"↕\\\"\\n }\\n d.push({\\n title: title,\\n col_type: \\\"scroll_button\\\",\\n url: $().lazyRule((item) => {\\n if (getItem(\\\"sort\\\", \\\"默认\\\") == item) {\\n setItem(\\\"sort\\\", item + \\\"反\\\")\\n } else {\\n setItem(\\\"sort\\\", item)\\n }\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }, item)\\n })\\n })\\n }\\n\\n let bid = path + \\\"-loading-\\\" + MY_PAGE;\\n let d2 = [];\\n d.push({\\n title: \\\"努力加载中,请稍候...\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n id: bid,\\n lineVisible: false\\n }\\n })\\n setResult(d);\\n\\n try {\\n // 获取文件列表\\n var list = JSON.parse(post(now.url + \\\"api/fs/list\\\", {\\n body: JSON.stringify({\\n \\\"path\\\": path,\\n \\\"password\\\": alist[selected][\\\"browser-password\\\"][path] ? alist[selected][\\\"browser-password\\\"][path] : \\\"\\\",\\n \\\"page\\\": MY_PAGE,\\n \\\"per_page\\\": 30,\\n \\\"refresh\\\": false\\n }),\\n headers: headers\\n }))\\n if (list.code == 200 && list.data.content) {\\n sorts(list.data.content, nsort)\\n list.data.content.forEach((item, index) => {\\n var desc = formatDate(item.modified) + \\\" \\\" + getFileSize(item.size)\\n var down_url = encodeURI(now.url + \\\"d\\\" + (path == \\\"/\\\" ? \\\"\\\" : path) + \\\"/\\\" + item.name + \\\"?sign=\\\" + item.sign)\\n var url = $().lazyRule((item, url, path, list, u) => {\\n const type_dict = {\\n 0: $.toString((url) => {\\n return \\\"download://\\\" + url\\n }, url),\\n 2: $.toString((url, list, u, path) => {\\n var subtitles = $.require(\\\"api\\\").getSubtitles(list, u, path)\\n if (subtitles.length > 1) {\\n var namelist = subtitles.map(function(item) {\\n return item.name\\n })\\n return $(namelist, 1, \\\"请选择字幕\\\").select((subtitles, namelist, url) => {\\n return JSON.stringify({\\n urls: [url],\\n subtitle: subtitles[namelist.indexOf(input)].url\\n })\\n }, subtitles, namelist, url)\\n } else {\\n return url + \\\"#isVideo=true#\\\"\\n }\\n }, url, list, u, path),\\n 3: $.toString((url) => {\\n return url + \\\"#isMusic=true#\\\"\\n }, url),\\n 4: $.toString((url) => {\\n return \\\"download://\\\" + url\\n }, url),\\n 5: $.toString((url) => {\\n return url + \\\"#.jpg\\\"\\n }, url)\\n }\\n if (item.is_dir) {\\n return \\\"hiker://page/home?page=fypage\\\"\\n } else if ($.require(\\\"api\\\").getHzm(item.name) == \\\"pdf\\\") {\\n return \\\"https://alist-org.github.io/pdf.js/web/viewer.html?file=\\\" + url\\n } else if ($.office.includes($.require(\\\"api\\\").getHzm(item.name))) {\\n return $([\\\"微软\\\", \\\"谷歌\\\"]).select((url) => {\\n if (input == \\\"微软\\\") {\\n return \\\"https://view.officeapps.live.com/op/view.aspx?src=\\\" + url\\n } else {\\n return \\\"https://docs.google.com/gview?&embedded=true&url=\\\" + url\\n }\\n }, url)\\n } else {\\n return eval(type_dict[item.type])\\n }\\n }, item, down_url, path, list.data.content, now.url)\\n var longClick = []\\n if (!item.is_dir) {\\n longClick.push({\\n title: \\\"下载\\\",\\n js: $.toString((item, u, path) => {\\n return \\\"download://\\\" + u\\n }, item, down_url, path)\\n }, {\\n title: \\\"用其他软件打开\\\",\\n js: $.toString((item, u, path) => {\\n downloadFile(u, \\\"hiker://files/cache/\\\" + item.name)\\n return \\\"openFile://\\\" + \\\"hiker://files/cache/\\\" + item.name\\n }, item, down_url, path)\\n })\\n }\\n if (now.user && now.password) {\\n longClick.push({\\n title: \\\"删除\\\",\\n js: $.toString((item, headers, path, now) => {\\n return $(\\\"确认删除?\\\").confirm((item, headers, path, now) => {\\n var res = JSON.parse(post(now.url + \\\"api/fs/remove\\\", {\\n headers: headers,\\n body: JSON.stringify({\\n dir: path,\\n names: [item.name]\\n })\\n })).code\\n if (res == 200) {\\n refreshPage()\\n return \\\"toast://删除成功\\\"\\n } else {\\n return \\\"toast://删除失败\\\"\\n }\\n }, item, headers, path, now)\\n }, item, headers, path, now)\\n }, {\\n title: \\\"重命名\\\",\\n js: $.toString((item, headers, path, now) => {\\n return $(item.name).input((item, headers, path, now) => {\\n var res = JSON.parse(post(now.url + \\\"api/fs/rename\\\", {\\n headers: headers,\\n body: JSON.stringify({\\n path: path + \\\"/\\\" + item.name,\\n name: input\\n })\\n })).code\\n if (res == 200) {\\n refreshPage()\\n return \\\"toast://重命名成功\\\"\\n } else {\\n return \\\"toast://重命名失败\\\"\\n }\\n }, item, headers, path, now)\\n }, item, headers, path, now)\\n })\\n }\\n d2.push({\\n title: item.name,\\n col_type: getItem(\\\"style\\\", \\\"avatar\\\"),\\n img: getIcon(item),\\n desc: desc,\\n url: url,\\n extra: {\\n longClick: longClick,\\n pageTitle: item.name,\\n path: (path == \\\"/\\\" ? \\\"/\\\" : path + \\\"/\\\") + item.name,\\n id: item.name,\\n cls: \\\"playlist main\\\"\\n }\\n })\\n if (getItem(\\\"style\\\", \\\"avatar\\\") == \\\"avatar\\\") {\\n d2.push({\\n title: `‘‘’’<small><font color='#aaaaaa'>${desc}</font></small>`,\\n col_type: \\\"text_1\\\",\\n url: url,\\n extra: {\\n longClick: longClick,\\n pageTitle: item.name,\\n path: (path == \\\"/\\\" ? \\\"/\\\" : path + \\\"/\\\") + item.name,\\n cls: \\\"playlist desc\\\"\\n }\\n })\\n }\\n })\\n } else if (list.message == \\\"password is incorrect or you have no permission\\\") {\\n d2.push({\\n title: \\\"浏览密码错误\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(\\\"\\\", \\\"输入密码\\\").input((alist, selected, path) => {\\n alist[selected][\\\"browser-password\\\"][path] = input\\n storage0.setItem(\\\"list\\\", alist)\\n refreshPage()\\n }, alist, selected, path)\\n })\\n } else if (list.code != 200) {\\n toast(\\\"出错了\\\")\\n log(list.message)\\n }\\n } catch (e) {\\n d2.push({\\n title: \\\"出现错误\\\",\\n url: \\\"hiker://page/config\\\",\\n col_type: \\\"text_center_1\\\"\\n })\\n log(e.message)\\n }\\n addItemBefore(bid, d2);\\n deleteItem(bid);\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"设置\",\"path\":\"config\",\"rule\":\"js:\\nvar d = [];\\nd.push({\\n title: \\\"显示网站详情:\\\" + getItem(\\\"detail\\\", \\\"开\\\"),\\n url: $().lazyRule(() => {\\n setItem(\\\"detail\\\", getItem(\\\"detail\\\", \\\"开\\\") == \\\"开\\\" ? \\\"关\\\" : \\\"开\\\")\\n refreshPage()\\n return \\\"hiker://empty\\\"\\n }),\\n col_type: \\\"text_2\\\"\\n}, {\\n title: \\\"切换样式:\\\" + getItem(\\\"style\\\", \\\"avatar\\\"),\\n url: $([\\\"movie_3\\\", \\\"movie_1_left_pic\\\", \\\"movie_1_vertical_pic\\\", \\\"card_pic_3\\\", \\\"avatar\\\", \\\"text_1\\\"]).select(() => {\\n setItem(\\\"style\\\", input)\\n refreshPage()\\n return \\\"toast://已切换\\\"\\n }),\\n col_type: \\\"text_2\\\"\\n})\\nd.push({\\n col_type: \\\"line_blank\\\"\\n})\\nd.push({\\n title: \\\"➕ 新增Alist\\\",\\n url: $(\\\"\\\", \\\"名称\\\").input(() => {\\n if (input == \\\"\\\") {\\n return \\\"toast://名称不能为空\\\"\\n } else if (storage0.getItem(\\\"list\\\", []).map(function(i) {\\n return i.name\\n }).includes(input)) {\\n return \\\"toast://已经有相同的网站了\\\"\\n } else {\\n return $(\\\"\\\", \\\"链接 示例:http://127.0.0.1/\\\").input((name) => {\\n if (!input.includes(\\\"http\\\")) {\\n return \\\"toast://链接格式错误\\\"\\n } else {\\n if (input[input.length - 1] != \\\"/\\\") {\\n input += \\\"/\\\"\\n }\\n var config = JSON.parse(request(input + \\\"api/public/settings\\\")).data\\n var list = storage0.getItem(\\\"list\\\", [])\\n list.push({\\n name: name,\\n url: input,\\n \\\"browser-password\\\": {},\\n \\\"search\\\": config.search_index && config.search_index != \\\"none\\\"\\n })\\n storage0.setItem(\\\"list\\\", list)\\n refreshPage()\\n }\\n }, input)\\n }\\n }),\\n col_type: \\\"text_2\\\"\\n}, {\\n title: \\\"分享\\\",\\n col_type: \\\"text_2\\\",\\n url: $([\\\"仅分享网站\\\", \\\"分享网站加密码\\\"]).select(() => {\\n var list = storage0.getItem(\\\"list\\\", [])\\n if (input == \\\"仅分享网站\\\") {\\n var alist = list.map(function(item) {\\n return {\\n name: item.name,\\n url: item.url,\\n \\\"browser-password\\\": {}\\n }\\n })\\n var url = sharePaste(JSON.stringify(alist))\\n return \\\"copy://Alist V3网盘导入口令 共\\\" + alist.length + \\\"个@\\\" + url + \\\"@import=js:\\\" + $.toString(() => {\\n $.require(\\\"hiker://page/cloudimport?rule=Alist V3\\\").input(input)\\n })\\n } else {\\n var url = sharePaste(JSON.stringify(list))\\n return \\\"copy://Alist V3网盘导入口令 共\\\" + alist.length + \\\"个@\\\" + url + \\\"@import=js:\\\" + $.toString(() => {\\n $.require(\\\"hiker://page/cloudimport?rule=Alist V3\\\").input(input)\\n })\\n }\\n })\\n})\\nvar list = storage0.getItem(\\\"list\\\", [])\\nlist.forEach((item, i) => {\\n d.push({\\n title: item.name,\\n desc: item.url,\\n url: $([\\\"删除\\\", \\\"排序\\\", \\\"修改名称\\\", \\\"修改链接\\\", \\\"修改账户密码\\\"]).select((a, i) => {\\n var list = storage0.getItem(\\\"list\\\", [])\\n switch (input) {\\n case \\\"删除\\\":\\n return $(\\\"确认删除?\\\").confirm((list, i) => {\\n list.splice(i, 1)\\n storage0.setItem(\\\"list\\\", list)\\n clearItem(\\\"selected\\\")\\n refreshPage()\\n }, list, i)\\n break;\\n case \\\"修改名称\\\":\\n return $(list[i].name).input((list, i) => {\\n if (input == \\\"\\\") {\\n return \\\"toast://名称不能为空\\\"\\n } else if (storage0.getItem(\\\"list\\\", []).map(function(i) {\\n return i.name\\n }).includes(input)) {\\n return \\\"toast://已经有相同的网站了\\\"\\n } else {\\n list[i].name = input\\n storage0.setItem(\\\"list\\\", list)\\n refreshPage()\\n }\\n }, list, i)\\n break\\n case \\\"修改链接\\\":\\n return $(list[i].url).input((list, i) => {\\n if (!input.includes(\\\"http\\\")) {\\n return \\\"toast://链接格式错误\\\"\\n } else if (input[input.length - 1] != \\\"/\\\") {\\n return \\\"toast://链接格式错误\\\"\\n } else {\\n list[i].url = input\\n storage0.setItem(\\\"list\\\", list)\\n refreshPage()\\n }\\n }, list, i)\\n break\\n case \\\"修改账户密码\\\":\\n return $(list[i][\\\"user\\\"] ? list[i][\\\"user\\\"] : \\\"\\\", \\\"账号\\\").input((list, i) => {\\n return $(list[i][\\\"password\\\"] ? list[i][\\\"password\\\"] : \\\"\\\", \\\"密码\\\").input((user, list, i) => {\\n list[i][\\\"user\\\"] = user\\n list[i][\\\"password\\\"] = input\\n storage0.setItem(\\\"list\\\", list)\\n refreshPage()\\n }, input, list, i)\\n }, list, i)\\n case \\\"排序\\\":\\n return $(i + 1 + \\\"\\\", \\\"拍到第几个\\\").input((list, i) => {\\n function checkRate(input) {  \\n var re = /^[0-9]+.?[0-9]*/; //判断字符串是否为数字//判断正整数/[1−9]+[0−9]∗]∗/\\n   \\n return re.test(input)  \\n }\\n if (checkRate(input)) {\\n var a = parseInt(input) - 1 // 目标\\n if (a > list.length && a == 0) {\\n toast(\\\"不能大于列表数量!\\\")\\n } else {\\n var temp = list[a]\\n list[a] = list[i]\\n list[i] = temp\\n storage0.setItem(\\\"list\\\", list)\\n refreshPage()\\n }\\n } else {\\n toast(\\\"请输入正整数\\\")\\n }\\n }, list, i)\\n }\\n }, item, i),\\n col_type: \\\"text_1\\\"\\n })\\n})\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"代码\",\"path\":\"api\",\"rule\":\"$.exports = {\\n color: function(text, color) {\\n return `‘‘’’<strong><font color=\\\"${color}\\\">${text}</front></strong>`\\n },\\n getIcon: function(content) {\\n if (content.is_dir) {\\n img = \\\"https://hikerfans.com/tubiao/more/274.png\\\"\\n } else {\\n let fileName = content.name.toLowerCase()\\n let hzm = $.require(\\\"api\\\").getHzm(fileName)\\n if (content.thumb && content.type != 0) {\\n img = content.thumb\\n } else if ($.movie.includes(hzm)) {\\n img = \\\"https://hikerfans.com/tubiao/more/30.png\\\"\\n } else if ($.audio.includes(hzm)) {\\n img = \\\"https://hikerfans.com/tubiao/more/40.png\\\"\\n } else if ($.text.includes(hzm)) {\\n img = \\\"https://hikerfans.com/tubiao/more/78.png\\\"\\n } else if ($.img.includes(hzm)) {\\n img = \\\"https://hikerfans.com/tubiao/more/38.png\\\"\\n } else if ($.yasuo.includes(hzm)) {\\n img = \\\"https://hikerfans.com/tubiao/more/201.png\\\"\\n } else if ($.office.includes(hzm)) {\\n img = \\\"https://hikerfans.com/tubiao/more/185.png\\\"\\n } else {\\n img = \\\"https://hikerfans.com/tubiao/more/239.png\\\"\\n }\\n }\\n return img\\n },\\n formatDate: function(time) {\\n return time.split(\\\"T\\\")[0] + \\\" \\\" + time.split(\\\"T\\\")[1].split(\\\".\\\")[0].split(\\\"Z\\\")[0].split(\\\"+\\\")[0]\\n },\\n getFileSize: function(size) {\\n if (size <= 0) {\\n return \\\"\\\";\\n }\\n let unitForm = [\\\"Byte\\\", \\\"KB\\\", \\\"MB\\\", \\\"GB\\\", \\\"TB\\\"];\\n for (let i = 0, len = unitForm.length; i < len; i++) {\\n if (size > 1024) {\\n size /= 1024;\\n continue;\\n } else {\\n return size.toFixed(2).replace(/(\\\\.00)$/, \\\"\\\") + unitForm[i];\\n }\\n }\\n return \\\"ERROR:数值过大\\\";\\n },\\n getHzm: function(fileName) {\\n return fileName.substr(fileName.lastIndexOf(\\\".\\\") + 1)\\n },\\n sorts: function(list, method) {\\n if (method.includes(\\\"名称\\\")) {\\n list.sort(function(a, b) {\\n return a.name.localeCompare(b.name)\\n })\\n } else if (method.includes(\\\"时间\\\")) {\\n list.sort(function(a, b) {\\n return a.modified - b.modified\\n })\\n } else if (method.includes(\\\"大小\\\")) {\\n list.sort(function(a, b) {\\n return a.size - b.size\\n })\\n }\\n if (method.includes(\\\"反\\\")) {\\n list.reverse();\\n }\\n return list\\n },\\n getSubtitles: function(list, url, path) {\\n const {\\n getHzm\\n } = $.require(\\\"api\\\")\\n let s = []\\n list.forEach(item => {\\n if ($.subtitle.includes(getHzm(item.name))) {\\n s.push({\\n name: item.name,\\n url: encodeURI(url + \\\"d\\\" + (path == \\\"/\\\" ? \\\"\\\" : path) + \\\"/\\\" + item.name + \\\"?sign=\\\" + item.sign)\\n })\\n }\\n })\\n s.unshift({\\n name: \\\"不需要字幕\\\"\\n })\\n return s\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"搜索\",\"path\":\"search\",\"rule\":\"js:\\ntry {\\n var d = [];\\n var {\\n getIcon,\\n getFileSize\\n } = $.require(\\\"api\\\")\\n var url = getParam(\\\"u\\\")\\n var now = MY_PARAMS.now\\n var headers = MY_PARAMS.headers\\n if (MY_PAGE == 1) {\\n d.unshift({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n putMyVar(\\\"kw\\\", input)\\n refreshPage()\\n }),\\n col_type: \\\"input\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"kw\\\", \\\"\\\")\\n }\\n })\\n }\\n var path = getParam(\\\"path\\\")\\n if (getMyVar(\\\"kw\\\", \\\"\\\") != \\\"\\\") {\\n var list = JSON.parse(post(url + \\\"api/fs/search\\\", {\\n headers: headers,\\n body: JSON.stringify({\\n \\\"parent\\\": getParam(\\\"path\\\"),\\n \\\"keywords\\\": getMyVar(\\\"kw\\\", \\\"\\\"),\\n \\\"page\\\": MY_PAGE,\\n \\\"per_page\\\": 100\\n })\\n }))\\n if (list.code == 200 && list.data.content) {\\n list.data.content.forEach(item => {\\n var desc = getFileSize(item.size)\\n var url = $().lazyRule((item, u, path, headers) => {\\n var sign = JSON.parse(post(u + \\\"api/fs/get\\\", {\\n headers: headers,\\n body: JSON.stringify({\\n \\\"path\\\": item.parent + \\\"/\\\" + item.name\\n })\\n })).data.sign\\n var url = encodeURI(u + \\\"d\\\" + item.parent + \\\"/\\\" + item.name + \\\"?sign=\\\" + sign)\\n const type_dict = {\\n 0: $.toString((url) => {\\n return \\\"download://\\\" + url\\n }, url),\\n 2: $.toString((url) => {\\n return url + \\\"#isVideo=true#\\\"\\n }, url),\\n 3: $.toString((url) => {\\n return url + \\\"#isMusic=true#\\\"\\n }, url),\\n 4: $.toString((url) => {\\n return \\\"download://\\\" + url\\n }, url),\\n 5: $.toString((url) => {\\n return url + \\\"#.jpg\\\"\\n }, url)\\n }\\n if (item.is_dir) {\\n return \\\"hiker://page/home?page=fypage\\\"\\n } else if ($.require(\\\"api\\\").getHzm(item.name) == \\\"pdf\\\") {\\n return \\\"https://alist-org.github.io/pdf.js/web/viewer.html?file=\\\" + url\\n } else if ($.office.includes($.require(\\\"api\\\").getHzm(item.name))) {\\n return $([\\\"微软\\\", \\\"谷歌\\\"]).select((url) => {\\n if (input == \\\"微软\\\") {\\n return \\\"https://view.officeapps.live.com/op/view.aspx?src=\\\" + url\\n } else {\\n return \\\"https://docs.google.com/gview?&embedded=true&url=\\\" + url\\n }\\n }, url)\\n } else {\\n return eval(type_dict[item.type])\\n }\\n }, item, now.url, path, headers)\\n var longClick = []\\n if (!item.is_dir) {\\n longClick.push({\\n title: \\\"下载\\\",\\n js: $.toString((item, u, path, headers) => {\\n return \\\"download://\\\" + encodeURI(u + \\\"d\\\" + item.parent + \\\"/\\\" + item.name + \\\"?sign=\\\" + JSON.parse(post(u + \\\"api/fs/get\\\", {\\n headers: headers,\\n body: JSON.stringify({\\n \\\"path\\\": item.parent + \\\"/\\\" + item.name\\n })\\n })).data.sign)\\n }, item, now.url, path, headers)\\n }, {\\n title: \\\"用其他软件打开\\\",\\n js: $.toString((item, u, path, headers) => {\\n var sign = JSON.parse(post(u + \\\"api/fs/get\\\", {\\n headers: headers,\\n body: JSON.stringify({\\n \\\"path\\\": item.parent + \\\"/\\\" + item.name\\n })\\n })).data.sign\\n downloadFile(encodeURI(u + \\\"d\\\" + item.parent + \\\"/\\\" + item.name + \\\"?sign=\\\" + sign), \\\"hiker://files/cache/\\\" + item.name)\\n return \\\"openFile://\\\" + \\\"hiker://files/cache/\\\" + item.name\\n }, item, now.url, path, headers)\\n })\\n }\\n if (now.user && now.password) {\\n longClick.push({\\n title: \\\"删除\\\",\\n js: $.toString((item, headers, path, now) => {\\n return $(\\\"确认删除?\\\").confirm((item, headers, path, now) => {\\n var res = JSON.parse(post(now.url + \\\"api/fs/remove\\\", {\\n headers: headers,\\n body: JSON.stringify({\\n dir: item.parent,\\n names: [item.name]\\n })\\n })).code\\n if (res == 200) {\\n refreshPage()\\n return \\\"toast://删除成功\\\"\\n } else {\\n return \\\"toast://删除失败\\\"\\n }\\n }, item, headers, path, now)\\n }, item, headers, path, now)\\n }, {\\n title: \\\"重命名\\\",\\n js: $.toString((item, headers, path, now) => {\\n return $(item.name).input((item, headers, path, now) => {\\n var res = JSON.parse(post(now.url + \\\"api/fs/rename\\\", {\\n headers: headers,\\n body: JSON.stringify({\\n path: item.parent + \\\"/\\\" + item.name,\\n name: input\\n })\\n })).code\\n if (res == 200) {\\n refreshPage()\\n return \\\"toast://操作成功\\\"\\n } else {\\n return \\\"toast://操作失败\\\"\\n }\\n }, item, headers, path, now)\\n }, item, headers, path, now)\\n })\\n }\\n d.push({\\n title: item.name,\\n col_type: getItem(\\\"style\\\", \\\"avatar\\\"),\\n img: getIcon(item),\\n desc: desc,\\n url: url,\\n extra: {\\n longClick: longClick,\\n path: item.parent + \\\"/\\\" + item.name,\\n pageTitle: item.name\\n }\\n })\\n if (getItem(\\\"style\\\", \\\"avatar\\\") == \\\"avatar\\\") {\\n d.push({\\n title: `‘‘’’<small><font color='#aaaaaa'>${desc}</font></small>`,\\n col_type: \\\"text_1\\\",\\n url: url,\\n extra: {\\n longClick: longClick,\\n path: item.parent + \\\"/\\\" + item.name,\\n pageTitle: item.name\\n }\\n })\\n }\\n })\\n } else if (list.code != 200) {\\n toast(\\\"出错了\\\")\\n log(list.message)\\n }\\n }\\n} catch (e) {\\n setResult([{\\n title: \\\"设置\\\",\\n url: \\\"hiker://page/config\\\",\\n col_type: \\\"text_center_1\\\"\\n }])\\n log(e.message)\\n toast(\\\"程序出现错误,请重试\\\")\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"云口令\",\"path\":\"cloudimport\",\"rule\":\"$.exports.input = function(url) {\\n var url = url.split(\\\"@\\\")[1]\\n var content = parsePaste(url)\\n writeFile(\\\"hiker://files/cache/alist_cache.json\\\", content)\\n}\"}]","proxy":"","icon":"https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg"},{"last_chapter_rule":"","title":"聚直播","author":"小棉袄🌞&Joker","version":10,"type":"live","url":"hiker://empty","col_type":"icon_2_round","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\neval(JSON.parse(request(\"hiker://page/config\")).rule); //getConfig\n\nlet data = [],\n config = getConfig();\nconfig.data = config.data.filter(v => !v.inVisible);\n\nif (config.data.length <= 0) {\n data = $.require('hiker://page/renderSetting').renderSetting();\n} else {\n let select = getItem(\"live-select\", config.data[0].name),\n has = config.data.map(i => i.name).includes(select);\n if (!has) {\n select = config.data[0].name;\n }\n\n data.push({\n title: '聚直播'.bold() + ' &nbsp &nbsp ' + '⚙ 聚直播设置 ⚙'.small(),\n col_type: \"avatar\",\n pic_url: MY_RULE.icon,\n url: $(\"hiker://empty#noLoading#\").rule(() => {\n addListener('onClose', 'refreshPage()')\n setResult($.require('hiker://page/renderSetting').renderSetting())\n })\n })\n\n data.push({\n title: '搜索',\n desc: '请输入搜索关键词',\n extra: {\n defaultValue: getVar('search_key', ''),\n onChange: 'putVar(\"search_key\",input)'\n },\n col_type: 'input',\n url: $.toString(() => {\n return 'hiker://search?rule=' + getMyVar('title') + '&s=' + getVar('search_key', '')\n })\n })\n\n\n\n for (source of config.data) {\n data.push({\n title: source.name == select ? \"““””<span style='color: #19B89D'>\" + select + \"</span>\" : source.name,\n col_type: \"scroll_button\",\n url: $('#noLoading#').lazyRule((a) => {\n setItem(\"live-select\", a);\n setItem('selectGroup', '');\n refreshPage();\n return \"hiker://empty\"\n }, source.name)\n })\n }\n\n data.push({\n col_type: 'blank_block'\n })\n \n if (typeof(setPreResult) != \"undefined\") {\n data.push({\n pic_url: \"https://hikerfans.com/weisyr/img/Loading1.gif\",\n col_type: \"pic_1_center\",\n extra: {\n cls: \"loading_gif\"\n }\n })\n setPreResult(data);\n data = [];\n }\n\n for (source of config.data) {\n if (source.name == select) {\n try {\n let items = $.require('hiker://page/renderData').renderLiveData(source.url,source.ua);\n let groups = Object.keys(items);\n //groups.push(groups.splice(groups.indexOf(0), 1)[0]);\n let selectGroup = getItem('selectGroup', groups[0]);\n if (selectGroup == \"\" || !groups.includes(selectGroup)) selectGroup = groups[0];\n groups.forEach((group) => {\n if (group) {\n data.push({\n title: group == selectGroup ? \"““””<span style='color: #19B89D'>\" + group + \"</span>\" : group,\n url: $('#noLoading#').lazyRule((group) => {\n setItem('selectGroup', group);\n refreshPage();\n return 'hiker://empty'\n }, group),\n col_type: 'scroll_button',\n extra: {\n lineVisible: false\n }\n })\n }\n })\n \n for (let title in items[selectGroup]) {\n data.push({\n title: title,\n url: $().lazyRule((sourceurl,selectGroup,title) => {\n let items = $.require('hiker://page/renderData').renderLiveData(sourceurl);\n let surls = items[selectGroup][title].url;\n let sheaders = items[selectGroup][title].headers;\n for (let groupi in items){\n let group = items[groupi];\n if(!group) continue;\n for (let ititle in group){\n if(ititle == title && !!group[ititle]){\n let urls = group[ititle].url;\n let headers = group[ititle].headers;\n surls = surls.concat(urls);\n sheaders = sheaders.concat(headers);\n }\n }\n }\n surls = Array.from(new Set(surls));\n sheaders = Array.from(new Set(sheaders));\n return JSON.stringify({\n urls: surls,\n headers: sheaders\n })\n },source.url,selectGroup,title),\n //col_type: 'text_3',\n img: \"https://hikerfans.com/tubiao/more/228.png\"\n })\n }\n } catch (e) {\n data.push({\n title: \"数据加载失败\\n\" + JSON.stringify(e),\n col_type: \"long_text\"\n })\n }\n break;\n }\n }\n deleteItemByCls(\"loading_gif\");\n}\nsetResult(data);","searchFind":"js:\neval(JSON.parse(request(\"hiker://page/config\")).rule);\nlet config = getConfig();\nlet rules = config.data.map((source) => {\n return {\n title: source.name,\n search_url: 'hiker://empty?key=**',\n searchFind: 'js:' + $.toString((url, rule_title) => {\n let d = [],\n key = getParam('key');\n let items = $.require('hiker://page/renderData?rule=' + rule_title).renderLiveData(url);\n for (let group in items) {\n for (let title in items[group]) {\n if (title.indexOf(key) >= 0 || title.toLowerCase().indexOf(key) >= 0) {\n d.push({\n title: title,\n url: JSON.stringify({\n urls: items[group][title].url,\n headers: items[group][title].headers\n })\n })\n }\n }\n }\n setResult(d);\n }, source.url, getMyVar('title'))\n };\n})\nsetResult([{\n title: \"点我开始聚搜\",\n url: \"hiker://search?s=\" + getParam(\"key\"),\n extra: {\n rules: $.toString((rules) => {\n return JSON.stringify(rules)\n }, rules)\n }\n}])","search_url":"hiker://empty?key=**","group":"⑥直播","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"putMyVar('title',MY_RULE.title);","pages":"[{\"col_type\":\"movie_3\",\"name\":\"加载数据\",\"path\":\"config\",\"rule\":\"function getConfig() {\\n try {\\n let config = fetch(\\\"hiker://files/rules/live/config.json\\\");\\n if (!config || config == \\\"\\\") {\\n return {\\n data: [],\\n version: 0\\n }\\n } else {\\n return JSON.parse(config)\\n }\\n } catch (e) {\\n try {\\n toast(\\\"配置文件格式有误\\\")\\n } catch (e) {}\\n return {\\n data: [],\\n version: 0\\n }\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"批量导入\",\"path\":\"batchIm\",\"rule\":\"function batchImport(input, rule) {\\n input = input.trim();\\n if (input.length < 3 || input[0] != \\\"{\\\") {\\n return \\\"toast://请输入正确的格式\\\"\\n }\\n let im = JSON.parse(input);\\n if (im.data == null || im.data.length < 1) {\\n return \\\"toast://请输入正确的格式\\\"\\n }\\n eval(JSON.parse(request(\\\"hiker://page/config?rule=\\\" + rule)).rule);\\n let config = getConfig();\\n let count = 0;\\n let all = config.data.map(it => it.url + \\\"&&&\\\").join();\\n for (let i of im.data) {\\n if (all.indexOf(i.url + \\\"&&&\\\") >= 0) {\\n //重复的不要\\n continue;\\n }\\n count++;\\n config.data.push(i)\\n }\\n writeFile(\\\"hiker://files/rules/live/config.json\\\", JSON.stringify(config));\\n refreshPage();\\n return \\\"toast://已导入\\\" + count + \\\"条订阅源\\\";\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"直播数据\",\"path\":\"renderData\",\"rule\":\"function renderLiveData(url,ua) {\\n let m3u = \\\"\\\";\\n if (url.startsWith('hiker://') || url.startsWith('file://')) {\\n m3u = fetch(url);\\n } else {\\n let interval = Number(getItem('interval', '24')),\\n oldData = fetch('hiker://files/libs/' + md5(url) + '.js'),\\n remoteData = '';\\n try {\\n remoteData = fetchCache(url, interval, {\\n headers:{\\n 'User-Agent' : ua || MOBILE_UA\\n },\\n timeout: 50000\\n });\\n } catch (e) {}\\n if (!remoteData.includes('http') || remoteData.includes('<body>')) { \\n log('更新失败');\\n if (oldData) writeFile('hiker://files/libs/' + md5(url) + '.js', oldData);\\n m3u = oldData;\\n } else {\\n m3u = remoteData;\\n }\\n }\\n\\n let mode = m3u.indexOf('#EXTM3U') == 0 , re;\\n if(mode){\\n re = /(.*),(.*)\\\\s*?((?:http|rtmp)[^#\\\\s]*)/g;\\n }else{\\n re = /()(?:\\\\B\\\\$c_start|\\\\B#{1,2})?(.*?),?(##|头#|\\\\$c_end|,?#genre#|(?:http|rtmp)[^\\\\s]*)/g;\\n }\\n \\n let items = {},\\n group = '未分组';\\n for (let i = re.exec(m3u); i != null; i = re.exec(m3u)) {\\n if (mode) {\\n group = (i[1].match(/group-title=\\\"(.*?)\\\"/) || [null, group])[1];\\n } else if (['#genre#','##','头#','$c_end'].includes(i[3])) {\\n group = i[2];\\n continue;\\n }\\n let title = i[2],\\n url = i[3].includes('#') ? i[3].split('#') : [i[3]],\\n headers = [];\\n if(!url[url.length-1]) url.pop();\\n url.forEach((v,index,array)=>{\\n if(/;\\\\{(.*)\\\\}/.test(v)){\\n let obj = {},\\n con = v.match(/;\\\\{(.*)\\\\}/)[1],\\n arr = con.split('&&');\\n arr.forEach((i)=>{\\n let [key,value] = i.split('@');\\n obj[key] = value.replace(/;/g,';;');\\n })\\n array[index] = v.match(/^([^;]*);\\\\{/)[1]\\n headers.push(obj);\\n }else{\\n headers.push({'User-Agent' : MOBILE_UA.replace(/;/g,';;')});\\n }\\n array[index] = array[index].replace(/;/g,';;')+'#isVideo=true#';\\n });\\n if (items[group]) {\\n if (items[group][title]) {\\n items[group][title].url = items[group][title].url.concat(url);\\n items[group][title].headers = items[group][title].headers.concat(headers);\\n } else {\\n items[group][title] = {url:url,headers:headers};\\n }\\n } else {\\n items[group] = {};\\n items[group][title] = {url:url,headers:headers};\\n };\\n }\\n return items;\\n}\\n\\n$.exports = {\\n renderLiveData: renderLiveData\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"设置页\",\"path\":\"renderSetting\",\"rule\":\"function renderSetting() {\\n function getColoredText(text) {\\n return '““””<span style=\\\"color: #19B89D\\\">' + text + '</span>';\\n }\\n const d = [];\\n let interval = getItem('interval', '24');\\n d.push({\\n title: interval == -1 ? '已禁止自动更新'.fontcolor(\\\"#19B89D\\\").bold() : ('更新间隔:' + interval + '小时').fontcolor(\\\"#19B89D\\\").bold(),\\n url: $(interval, '输入n为正整数时,每隔n小时自动更新\\\\n为0时,每次打开都会更新\\\\n为-1时,禁止自动更新').input(() => {\\n if (parseInt(input) >= -1) {\\n setItem('interval', input);\\n }\\n refreshPage();\\n return 'hiker://empty'\\n }),\\n pic_url: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fis4.mzstatic.com%2Fimage%2Fthumb%2FPurple3%2Fv4%2Fdf%2Ff6%2Fda%2Fdff6da83-47d7-9cb6-2398-1919c13837b4%2Fmzl.kgmnwodo.png%2F0x0ss-85.jpg&refer=http%3A%2F%2Fis4.mzstatic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1638629349&t=2f6d967185fe2b9c54e8b230eb83e66c',\\n col_type: \\\"avatar\\\"\\n });\\n\\n d.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n\\n d.push({\\n title: getColoredText(\\\"新建订阅\\\"),\\n col_type: \\\"scroll_button\\\",\\n desc: \\\"请输入直播源订阅地址\\\",\\n url: $('', '请输入订阅地址\\\\n可以在地址后加ua\\\\n(使用$$$分割)').input((rule) => {\\n if (input == \\\"\\\") {\\n return \\\"toast://不能为空\\\"\\n } else if (input.indexOf(\\\"http\\\") != 0 && input.indexOf(\\\"file\\\") != 0 && input.indexOf(\\\"hiker\\\") != 0) {\\n return \\\"toast://链接格式有误\\\"\\n } else {\\n let [url,ua] = input.split('$$$');\\n return $('', \\\"请输入订阅标题\\\").input((url, rule,ua) => {\\n eval(JSON.parse(request(\\\"hiker://page/config?rule=\\\" + rule)).rule);\\n let config = getConfig();\\n config.data.push({\\n name: input,\\n url: url,\\n ua: ua || ''\\n });\\n writeFile(\\\"hiker://files/rules/live/config.json\\\", JSON.stringify(config));\\n refreshPage();\\n return \\\"toast://已保存\\\";\\n }, url, rule,ua)\\n }\\n }, getMyVar('title'))\\n });\\n\\n d.push({\\n title: getColoredText(\\\"导入订阅\\\"),\\n col_type: \\\"scroll_button\\\",\\n url: $('', '支持原始数据和云剪贴板分享链接').input((rule) => {\\n eval(JSON.parse(request(\\\"hiker://page/batchIm?rule=\\\" + rule)).rule);\\n if (input.startsWith('聚直播分享##')) {\\n input = parsePaste(input.split('##\\\\n')[1]);\\n }\\n return batchImport(input, rule);\\n }, getMyVar('title'))\\n });\\n d.push({\\n title: getColoredText(\\\"导入本地源\\\"),\\n col_type: \\\"scroll_button\\\",\\n desc: \\\"请输入直播源名称\\\",\\n url: $('', '请输入直播源名称').input((rule) => {\\n if (input == \\\"\\\") {\\n return \\\"toast://不能为空\\\"\\n } else {\\n return \\\"fileSelect://\\\" + $.toString((name) => {\\n let s = input.split(\\\"/\\\")\\n var url = \\\"hiker://files/cache/live/\\\" + name + \\\".m3u\\\"\\n var c = fetch(\\\"hiker://files/cache/\\\" + s[s.length - 1])\\n if (!c.includes('http')) {\\n return 'toast://非法文件'\\n }\\n writeFile(url, c)\\n eval(JSON.parse(request(\\\"hiker://page/config?rule=聚直播\\\")).rule);\\n let config = getConfig();\\n config.data.push({\\n name: name,\\n url: url\\n });\\n writeFile(\\\"hiker://files/rules/live/config.json\\\", JSON.stringify(config));\\n refreshPage();\\n return 'toast://已保存'\\n }, input)\\n }\\n })\\n });\\n d.push({\\n title: getColoredText(\\\"分享订阅\\\"),\\n col_type: \\\"scroll_button\\\",\\n url: $([\\\"原始数据\\\", \\\"云剪贴板\\\", \\\"云口令\\\"], 3).select(() => {\\n return $('确定导出?\\\\n(禁用订阅不会导出)').confirm((type) => {\\n eval(JSON.parse(request(\\\"hiker://page/config\\\")).rule);\\n config = getConfig();\\n config.data = config.data.filter(v => !v.inVisible);\\n if (type == \\\"云剪贴板\\\") {\\n var data = '聚直播分享##\\\\n' + sharePaste(JSON.stringify(config));\\n } else if (type == \\\"云口令\\\") {\\n var data = '聚直播分享,复制后打开软件即可导入\\\\n' + sharePaste(JSON.stringify(config)) + '@import=js:eval(JSON.parse(fetch(\\\"hiker://page/cloud?rule=聚直播\\\")).rule)';\\n } else {\\n var data = JSON.stringify(config);\\n }\\n return \\\"copy://\\\" + data;\\n }, input)\\n })\\n });\\n d.push({\\n title: getColoredText(\\\"编辑全部\\\"),\\n col_type: \\\"scroll_button\\\",\\n url: \\\"editFile://hiker://files/rules/live/config.json\\\"\\n });\\n\\n d.push({\\n col_type: \\\"blank_block\\\"\\n });\\n\\n eval(JSON.parse(request(\\\"hiker://page/config\\\")).rule);\\n config = getConfig();\\n let editMode = getMyVar('editMode', '启用禁用');\\n ['启用禁用', '删除订阅', '重新排序', '编辑订阅', '清除缓存'].forEach((v) => {\\n d.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#19B89D') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n });\\n config.data.forEach((v, i) => {\\n let el = {\\n title: v.name,\\n col_type: \\\"text_3\\\"\\n }\\n switch (editMode) {\\n case '启用禁用':\\n el.title = (v.inVisible ? '🔴 ' : '🟢 ') + el.title\\n el.url = $('#noLoading#').lazyRule((i) => {\\n eval(JSON.parse(request(\\\"hiker://page/config\\\")).rule);\\n config = getConfig();\\n config.data[i].inVisible = !config.data[i].inVisible;\\n writeFile(\\\"hiker://files/rules/live/config.json\\\", JSON.stringify(config));\\n refreshPage(false);\\n return 'hiker://empty'\\n }, i)\\n break\\n case '删除订阅':\\n el.url = \\\"confirm://确认删除“\\\" + v.name + \\\"”订阅?.js:\\\" + $.toString((i) => {\\n eval(JSON.parse(request(\\\"hiker://page/config\\\")).rule);\\n config = getConfig();\\n config.data.splice(i, 1);\\n writeFile(\\\"hiker://files/rules/live/config.json\\\", JSON.stringify(config));\\n refreshPage(false);\\n return \\\"toast://已删除\\\";\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n el.title = (sortFlag == i ? '🔃 ' : '') + el.title\\n if (sortFlag == -1)\\n el.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n el.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n eval(JSON.parse(request(\\\"hiker://page/config\\\")).rule);\\n config = getConfig();\\n config.data.splice(newIndex, 0, config.data.splice(oldIndex, 1)[0])\\n writeFile(\\\"hiker://files/rules/live/config.json\\\", JSON.stringify(config));\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '编辑订阅':\\n let arr = ['编辑名称', '编辑地址', '编辑内容'];\\n el.url = $(arr, 3).select((v, i) => {\\n if (input == '编辑名称') {\\n return $(v.name, '输入新名称').input((i) => {\\n eval(JSON.parse(request(\\\"hiker://page/config\\\")).rule);\\n config = getConfig();\\n if (input) {\\n config.data[i].name = input\\n writeFile(\\\"hiker://files/rules/live/config.json\\\", JSON.stringify(config));\\n refreshPage(false)\\n return 'toast://修改成功'\\n } else {\\n return 'toast://不能为空'\\n }\\n }, i);\\n } else if (input == '编辑地址') {\\n return $(v.ua ? v.url + '$$$' + v.ua : v.url, '输入新地址').input((i) => {\\n eval(JSON.parse(request(\\\"hiker://page/config\\\")).rule);\\n config = getConfig();\\n if (input == \\\"\\\") {\\n return \\\"toast://不能为空\\\"\\n } else if (input.indexOf(\\\"http\\\") != 0 && input.indexOf(\\\"file\\\") != 0 && input.indexOf(\\\"hiker\\\") != 0) {\\n return \\\"toast://链接格式有误\\\"\\n } else {\\n let [url,ua] = input.split('$$$');\\n config.data[i].url = url;\\n config.data[i].ua = ua;\\n writeFile(\\\"hiker://files/rules/live/config.json\\\", JSON.stringify(config));\\n refreshPage(false)\\n return 'toast://修改成功'\\n }\\n }, i);\\n } else if (input == '编辑内容') {\\n if (v.url.startsWith('file://') || v.url.startsWith('hiker://files')) {\\n return 'editFile://' + v.url;\\n }\\n return 'editFile://hiker://files/libs/' + md5(v.url) + '.js'\\n }\\n }, v, i);\\n break;\\n case '清除缓存':\\n el.url = $('确定清除“' + v.name + '”订阅缓存?\\\\n(可立即更新)').confirm((url) => {\\n deleteCache(url);\\n return 'toast://清除成功'\\n }, v.url)\\n break;\\n }\\n d.push(el)\\n });\\n return d;\\n}\\n\\n$.exports = {\\n renderSetting: renderSetting\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"云口令\",\"path\":\"cloud\",\"rule\":\"eval(JSON.parse(request(\\\"hiker://page/batchIm?rule=聚直播\\\")).rule);\\nlet content = parsePaste(input);\\nbatchImport(content, \\\"聚直播\\\");\"}]","proxy":"","icon":"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fis4.mzstatic.com%2Fimage%2Fthumb%2FPurple3%2Fv4%2Fdf%2Ff6%2Fda%2Fdff6da83-47d7-9cb6-2398-1919c13837b4%2Fmzl.kgmnwodo.png%2F0x0ss-85.jpg&refer=http%3A%2F%2Fis4.mzstatic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1638629349&t=2f6d967185fe2b9c54e8b230eb83e66c"},{"last_chapter_rule":"","title":"悦读","author":"Joe&&小棉袄🌞","version":53,"type":"read","url":"hiker://empty","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:$.require(\"hiker://page/home\")","searchFind":"js:\nvar d = [];\nlet kw = getParam(\"kw\")\nsetResult([{\n title: \"点击开始聚搜\" + kw,\n url: \"hiker://page/ju?p=fypage&kw=\" + kw\n}])\nsetResult(d);","search_url":"hiker://empty?kw=**","group":"⑧阅读","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"text_1\",\"name\":\"源目录\",\"path\":\"source\",\"rule\":\"js:\\nvar d = [];\\nvar m = MY_PARAMS.rules\\nvar baseurl = m.bookSourceUrl\\nif (m.ruleExplore.bookList) {\\n var rule = m.ruleExplore\\n} else {\\n var rule = m.ruleSearch\\n}\\nd.push({\\n title: \\\"搜索\\\",\\n desc: \\\"请输入搜索关键词\\\",\\n url: $.toString(() => {\\n putMyVar(\\\"kw\\\", input);\\n return \\\"hiker://page/search?p=fypage&kw=\\\" + input\\n }),\\n col_type: \\\"input\\\",\\n extra: {\\n \\\"u\\\": baseurl + m.searchUrl,\\n \\\"rules\\\": m,\\n defaultValue: getMyVar(\\\"kw\\\", \\\"\\\"),\\n bookSourceName: m.bookSourceName\\n }\\n});\\ntry {\\n if (m.enabledExplore && m.exploreUrl) {\\n JSON.parse(m.exploreUrl).forEach(item => {\\n d.push({\\n title: item.title,\\n col_type: item.style.layout_flexBasisPercent == 1 ? \\\"text_center_1\\\" : \\\"text_3\\\",\\n url: item.url == \\\"\\\" ? \\\"hiker://empty\\\" : \\\"hiker://page/books?p=fypage\\\",\\n extra: {\\n \\\"all\\\": m,\\n \\\"rules\\\": rule,\\n \\\"u\\\": baseurl + item.url\\n }\\n })\\n })\\n }\\n} catch (e) {\\n log(m.exploreUrl);\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"主页\",\"path\":\"home\",\"rule\":\"var d = [];\\nlet {\\n load,\\n loadRules,\\n getSelect\\n} = $.require(\\\"hiker://page/datat\\\");\\nlet data = load();\\nif (data.length > 0) {\\n d.push({\\n title: \\\"⚙️设置\\\",\\n url: \\\"hiker://page/config\\\",\\n col_type: \\\"scroll_button\\\"\\n });\\n let select = getSelect(data);\\n data.forEach(item => {\\n d.push({\\n title: select.url == item.url ? \\\"““\\\" + item.name + \\\"””\\\" : item.name,\\n url: $().lazyRule((url) => {\\n setItem(\\\"tab\\\", url)\\n refreshPage()\\n return \\\"toast://切换成功\\\"\\n }, item.url),\\n col_type: \\\"scroll_button\\\"\\n })\\n })\\n d.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n putMyVar(\\\"kw\\\", input);\\n return \\\"hiker://page/ju?p=fypage&kw=\\\" + input\\n }),\\n col_type: \\\"input\\\",\\n desc: \\\"聚合搜索,请输入关键词\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"kw\\\", \\\"\\\"),\\n }\\n });\\n let list = loadRules(select.name);\\n list.forEach(item => {\\n d.push({\\n title: item.bookSourceName + `(${item.bookSourceGroup})`,\\n col_type: \\\"text_2\\\",\\n url: \\\"hiker://page/source?p=fypage\\\",\\n extra: {\\n \\\"rules\\\": item\\n }\\n })\\n })\\n} else {\\n setResult([{\\n title: \\\"你还没有书哦~~点我进入设置\\\",\\n url: \\\"hiker://page/config\\\",\\n col_type: \\\"text_center_1\\\"\\n }])\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_1_vertical_pic\",\"name\":\"列表\",\"path\":\"books\",\"rule\":\"js:\\nvar d = [];\\nvar {\\n convert,\\n parseUrl,\\n getCharset\\n} = $.require(\\\"hiker://page/converter\\\");\\ntry {\\n //log(MY_PARAMS);\\n var m = MY_PARAMS.rules\\n // 阅读=>视界\\n var url = parseUrl(MY_PARAMS.u, MY_PAGE);\\n var listrule = \\\"body&&\\\" + convert(m.bookList.split(\\\"||\\\")[0]);\\n let author = null;\\n try {\\n author = convert(m.author);\\n } catch (e) {}\\n let cover = null;\\n try {\\n cover = convert(m.coverUrl);\\n } catch (e) {}\\n let name = null;\\n try {\\n name = convert(m.name);\\n } catch (e) {}\\n let bookurl = null;\\n try {\\n bookurl = convert(m.bookUrl);\\n } catch (e) {}\\n let intro = null;\\n try {\\n intro = convert(m.intro);\\n } catch (e) {}\\n let pdfh1 = (a, b) => {\\n try {\\n if (b == null) return \\\"\\\";\\n return pdfh(a, b);\\n } catch (e) {\\n return \\\"\\\";\\n }\\n }\\n let pd1 = (a, b, c) => {\\n try {\\n if (b == null) return \\\"\\\";\\n return pd(a, b, c);\\n } catch (e) {\\n return \\\"\\\";\\n }\\n }\\n MY_URL = url;\\n if (MY_PARAMS.all && MY_PARAMS.all.searchUrl) {\\n m.charset = getCharset(MY_PARAMS.all.searchUrl);\\n }\\n let headers = m.charset ? {\\n \\\"Content-Type\\\": \\\"text/html; charset=\\\" + m.charset\\n } : {};\\n var res = request(url, {\\n headers: headers\\n })\\n let list = pdfa(res, listrule)\\n if (list.length > 0) {\\n list.forEach(item => {\\n let next = MY_PARAMS.all.ruleToc.nextTocUrl;\\n let nexttoc = next && next != \\\"\\\";\\n let ac = nexttoc ? \\\"\\\": \\\"#autoCache#\\\";\\n //let ac = \\\"#autoCache#\\\";\\n let u1 = pd1(item, bookurl) + ac + \\\"#immersiveTheme#\\\";\\n if (m.charset) {\\n u1 = u1 + \\\";get;\\\" + m.charset\\n }\\n d.push({\\n col_type: (cover ? \\\"movie_1_vertical_pic\\\" : \\\"text_1\\\"),\\n title: pdfh1(item, name),\\n img: (cover ? pd1(item, cover) + \\\"@Referer=\\\" : \\\"hiker://empty\\\"),\\n url: \\\"hiker://page/menu\\\",\\n desc: (author ? pdfh1(item, author) : \\\"\\\") + \\\"\\\\n\\\" + (intro ? pdfh1(item, intro) : \\\"\\\"),\\n extra: {\\n \\\"bookName\\\": pdfh1(item, name),\\n \\\"cover\\\": (cover ? pd1(item, cover) + \\\"@Referer=\\\" : \\\"hiker://empty\\\"),\\n \\\"Toc\\\": MY_PARAMS.all.ruleToc,\\n \\\"content\\\": MY_PARAMS.all.ruleContent,\\n url: nexttoc ? \\\"hiker://empty#\\\" + u1 : u1,\\n u1: nexttoc ? u1 : null,\\n charset: m.charset,\\n inheritTitle: false\\n }\\n })\\n })\\n } else {\\n d.push({\\n title: \\\"列表加载失败:\\\" + listrule,\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\"\\n })\\n }\\n} catch (e) {\\n d.push({\\n title: \\\"加载失败:\\\" + e.message,\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\"\\n })\\n}\\nsetResult(d);\"},{\"col_type\":\"text_center_1\",\"name\":\"设置\",\"path\":\"config\",\"rule\":\"js:\\nvar d = [];\\ntry {\\n d.push({\\n title: \\\"添加订阅\\\",\\n url: $(\\\"\\\", \\\"请输入订阅名称,取个名吧(注意不要填地址)\\\").input(() => {\\n if (input == null || input == \\\"\\\") {\\n return \\\"toast://不填怎么能行呢\\\"\\n }\\n if (input.includes(\\\"://\\\")) {\\n return \\\"toast://不能填地址哦,傻宝贝\\\"\\n }\\n return $(\\\"\\\", \\\"请输入订阅地址\\\").input((name) => {\\n let {\\n add,\\n update\\n } = $.require(\\\"hiker://page/datat\\\");\\n add(name, input);\\n try {\\n update(name, input);\\n refreshPage();\\n return \\\"toast://导入成功\\\"\\n } catch (e) {\\n return \\\"toast://导入失败\\\"\\n }\\n }, input)\\n }),\\n col_type: \\\"text_2\\\"\\n })\\n d.push({\\n title: \\\"添加本地\\\",\\n url: $(\\\"\\\", \\\"请输入订阅名称,取个名吧(输完点击确定后会跳转选择书源文件界面)\\\").input(() => {\\n if (input == null || input == \\\"\\\") {\\n return \\\"toast://不填怎么能行呢\\\"\\n }\\n if (input.includes(\\\"://\\\")) {\\n return \\\"toast://不能填地址哦,傻宝贝\\\"\\n }\\n return \\\"fileSelect://\\\" + $.toString((name) => {\\n let s = input.split(\\\"/\\\")\\n let fname = s[s.length - 1].replace(\\\"_fileSelect_\\\", \\\"\\\");\\n if (!fname.includes(\\\".json\\\") && !fname.includes(\\\".txt\\\")) {\\n return \\\"toast://格式不对,仅支持json或txt格式的书源文件\\\"\\n }\\n let url = \\\"hiker://files/yuedu/\\\" + fname;\\n let c = fetch(\\\"file://\\\" + input);\\n if (!c.includes(\\\"bookSource\\\")) {\\n return \\\"toast://格式不对,仅支持书源文件\\\"\\n }\\n writeFile(url, c);\\n let {\\n add,\\n update\\n } = $.require(\\\"hiker://page/datat\\\");\\n add(name, url);\\n try {\\n update(name, url);\\n refreshPage();\\n return \\\"toast://导入成功\\\"\\n } catch (e) {\\n return \\\"toast://导入失败\\\"\\n }\\n }, input);\\n }),\\n col_type: \\\"text_2\\\"\\n })\\n let list = $.require(\\\"hiker://page/datat\\\").load();\\n list.forEach((item, i) => {\\n d.push({\\n title: item.name,\\n desc: item.url,\\n url: $([\\\"删除订阅\\\", \\\"编辑名称\\\", \\\"分享订阅\\\", \\\"更新数据\\\"]).select((name, url) => {\\n if (input == \\\"删除订阅\\\") {\\n return $(\\\"确认删除?\\\").confirm((name, url) => {\\n if (url.startsWith(\\\"hiker://files/\\\")) {\\n deleteFile(url);\\n }\\n deleteFile(\\\"hiker://files/yuedu/\\\" + md5(name) + \\\".json\\\")\\n $.require(\\\"hiker://page/datat\\\").remove(url);\\n refreshPage();\\n return \\\"toast://已删除\\\"\\n }, name, url)\\n } else if (input == \\\"编辑名称\\\") {\\n return $(\\\"\\\").input((name, url) => {\\n deleteFile(\\\"hiker://files/yuedu/\\\" + md5(name) + \\\".json\\\")\\n let {\\n rename,\\n update\\n } = $.require(\\\"hiker://page/datat\\\");\\n update(input, url);\\n rename(url, input);\\n refreshPage();\\n return \\\"hiker://empty\\\"\\n }, name, url)\\n } else if (input == \\\"分享订阅\\\") {\\n if (url.startsWith(\\\"hiker://files/\\\")) {\\n return \\\"toast://当前订阅为本地文件,无法分享\\\";\\n }\\n return $(\\\"#noLoading#\\\").lazyRule((name, url) => {\\n let {\\n share\\n } = $.require(\\\"hiker://page/datat\\\");\\n return share(name, url)\\n }, name, url)\\n } else {\\n try {\\n let {\\n update\\n } = $.require(\\\"hiker://page/datat\\\");\\n update(name, url);\\n return \\\"toast://更新成功\\\"\\n } catch (e) {\\n return \\\"toast://更新失败\\\"\\n }\\n }\\n }, item.name, item.url),\\n col_type: \\\"text_1\\\"\\n })\\n })\\n} catch (e) {\\n d.push({\\n title: \\\"错误:\\\" + e.message,\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://empty\\\"\\n })\\n}\\nsetResult(d);\"},{\"col_type\":\"text_1\",\"name\":\"目录\",\"path\":\"menu\",\"rule\":\"js:\\nvar d = [];\\nvar res = getResCode()\\nlet Toc = MY_PARAMS.Toc\\nlet {\\n getArray,\\n getText,\\n getUrl0,\\n convert\\n} = $.require(\\\"hiker://page/converter\\\");\\n//log(Toc);\\nvar caches = [];\\n\\nfunction getCache() {\\n let c = readFile(\\\"chapter.json\\\") || \\\"[]\\\";\\n caches = JSON.parse(c)\\n let url = MY_URL\\n addListener(\\\"onRefresh\\\", $.toString((url) => {\\n let c = readFile(\\\"chapter.json\\\") || \\\"[]\\\";\\n c = JSON.parse(c)\\n let che = {\\n url: url,\\n next: \\\"\\\",\\n chapters: []\\n };\\n for (let i = 0; i < c.length; i++) {\\n if (c[i].url == che.url) {\\n c[i] = che;\\n log(\\\"clear:\\\" + url)\\n saveFile(\\\"chapter.json\\\", JSON.stringify(c))\\n break\\n }\\n }\\n }, url))\\n for (let it of caches) {\\n if (it.url == url) {\\n return it;\\n }\\n }\\n return {\\n url: url,\\n next: \\\"\\\",\\n chapters: []\\n }\\n}\\n\\nfunction saveCache(che) {\\n let c = caches\\n if (c.length > 10) {\\n c.shift()\\n }\\n let exist = false\\n for (let i = 0; i < c.length; i++) {\\n if (c[i].url == che.url) {\\n c[i] = che;\\n exist = true;\\n break\\n }\\n }\\n if (!exist) {\\n c.push(che)\\n }\\n saveFile(\\\"chapter.json\\\", JSON.stringify(c))\\n}\\n\\n\\nlet next = Toc.nextTocUrl;\\nlet list = [];\\nif (next && next != \\\"\\\") {\\n if (next == \\\"option@value\\\") {\\n next = \\\"text.下一页&&href\\\";\\n }\\n MY_URL = MY_PARAMS.u1 || MY_URL;\\n let headers = MY_PARAMS.charset ? {\\n \\\"charset\\\": MY_PARAMS.charset,\\n \\\"Content-Type\\\": \\\"text/html; charset=\\\" + MY_PARAMS.charset\\n } : {};\\n next = convert(next);\\n //log(next);\\n let cache = getCache();\\n let nurl = cache.next;\\n if (nurl == \\\"\\\") {\\n nurl = MY_URL;\\n }\\n let id = MY_URL + \\\"@@\\\" + new Date().getTime();\\n let aid = \\\"a\\\" + id;\\n putMyVar(aid, \\\"1\\\");\\n addListener(\\\"onClose\\\", $.toString((aid) => {\\n log(\\\"clear: \\\" + aid);\\n clearMyVar(aid);\\n }, aid));\\n let arr = cache.chapters || [];\\n var cc = (a) => {\\n return a.map(item => {\\n var title = getText(item, Toc.chapterName)\\n if (title != \\\"\\\") {\\n let u1 = getUrl0(item, Toc.chapterList, Toc.chapterUrl) + \\\"#autoPage##readTheme#\\\";\\n if (MY_PARAMS.charset) {\\n u1 = u1 + \\\";get;\\\" + MY_PARAMS.charset;\\n }\\n return {\\n title: title,\\n url: \\\"hiker://page/content\\\",\\n extra: {\\n title: title,\\n content: MY_PARAMS.content,\\n url: u1\\n },\\n col_type: \\\"text_1\\\"\\n };\\n }\\n });\\n }\\n //log(cache.next + \\\":\\\" + cache.chapters.length);\\n let d2 = cc(arr);\\n d2.push({\\n title: \\\"加载中,请稍候...\\\",\\n url: \\\"\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n id: id\\n }\\n });\\n d2.unshift({\\n title: MY_PARAMS.bookName,\\n img: MY_PARAMS.cover,\\n url: MY_URL,\\n col_type: \\\"movie_1_vertical_pic_blur\\\"\\n });\\n setResult(d2);\\n headers[\\\"Referer\\\"] = MY_URL.split(\\\"#\\\")[0];\\n if (nurl != MY_URL) {\\n MY_URL = nurl;\\n res = fetch(MY_URL, {\\n headers: headers\\n });\\n } else if (MY_PARAMS.u1) {\\n res = fetch(MY_URL, {\\n headers: headers\\n });\\n }\\n var urls = [nurl];\\n while (true) {\\n let a = [];\\n for (let it of arr) {\\n a.push(it);\\n }\\n cache.chapters = a;\\n let arr1 = getArray(res, Toc.chapterList);\\n //log(arr1);\\n if (arr1 && arr1.length > 0) {\\n for (let it of arr1) {\\n arr.push(it)\\n }\\n }\\n addItemBefore(id, cc(arr1));\\n try {\\n if (getMyVar(aid, \\\"0\\\") != \\\"1\\\") {\\n log(\\\"break: \\\" + aid);\\n break;\\n }\\n java.lang.Thread.sleep(50);\\n let nurl2 = pd(res, \\\"body&&\\\" + next);\\n if (nurl2 && nurl2 != \\\"\\\" && !urls.includes(nurl2)) {\\n headers[\\\"Referer\\\"] = cache.next.split(\\\"#\\\")[0];\\n urls.push(nurl2);\\n cache.next = nurl2;\\n nurl = nurl2;\\n MY_URL = nurl;\\n res = fetch(nurl, {\\n headers: headers\\n });\\n } else {\\n break;\\n }\\n } catch (e) {\\n break;\\n }\\n }\\n deleteItem(id);\\n //log(cache.next + \\\":end:\\\" + cache.chapters.length);\\n saveCache(cache);\\n} else {\\n list = getArray(res, Toc.chapterList);\\n list.forEach(item => {\\n //log(item); \\n var title = getText(item, Toc.chapterName)\\n if (title != \\\"\\\") {\\n let u1 = getUrl0(item, Toc.chapterList, Toc.chapterUrl) + \\\"#autoPage##readTheme#\\\";\\n if (MY_PARAMS.charset) {\\n u1 = u1 + \\\";get;\\\" + MY_PARAMS.charset;\\n }\\n d.push({\\n title: title,\\n url: \\\"hiker://page/content\\\",\\n extra: {\\n title: title,\\n content: MY_PARAMS.content,\\n url: u1\\n }\\n })\\n }\\n });\\n\\n var cp = d.map(function(item) {\\n return {\\n \\\"title\\\": item.title,\\n \\\"url\\\": item.extra.url.replace(\\\"#autoPage##readTheme#\\\", \\\"\\\")\\n }\\n });\\n if (list.length > 0) {\\n d.unshift({\\n title: \\\"下载\\\",\\n url: \\\"hiker://page/download.view#noRecordHistory##noRefresh##noHistory#?rule=本地资源管理\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n chapterList: cp,\\n defaultView: \\\"1\\\",\\n info: {\\n bookName: MY_PARAMS.bookName,\\n bookTopPic: MY_PARAMS.cover,\\n ruleName: \\\"悦读\\\",\\n parseCode: $.toString((MY_PARAMS, r0) => {\\n let {\\n convert\\n } = $.require(\\\"hiker://page/converter?rule=\\\" + r0);\\n var res = request(input);\\n var rule = MY_PARAMS.content;\\n let r = convert(rule.content);\\n let r1 = r.split(\\\"&&\\\");\\n let r2 = r1.slice(0, r1.length - 1).join(\\\"&&\\\");\\n let arr = pdfa(res, \\\"body&&\\\" + r2);\\n //log(arr);\\n var tt = \\\"\\\"\\n for (let it of arr) {\\n it = it.replace(new RegExp(\\\"\\\\n\\\", \\\"g\\\"), \\\"--br--\\\");\\n //log(it);\\n var t = pdfh(it, \\\"Text\\\");\\n t = t.replace(new RegExp(\\\"--br--\\\", \\\"g\\\"), \\\"<br>\\\");\\n if (t == \\\"\\\") {\\n continue\\n }\\n let t2 = t.split(\\\"<br>\\\");\\n for (let it2 of t2) {\\n if (it2 == \\\"\\\" || it2.length == 1) {\\n continue\\n }\\n if (!it2.startsWith(\\\" \\\") && !it2.startsWith(\\\"&nbsp;&nbsp;\\\")) {\\n it2 = \\\"&nbsp;&nbsp;&nbsp;&nbsp;\\\" + it2.trim();\\n }\\n if (rule.replaceRegex) {\\n it2 = it2.replace(new RegExp(rule.replaceRegex.replace(\\\"##\\\", \\\"\\\"), \\\"g\\\"), \\\"\\\")\\n }\\n if (it2 == \\\"\\\") {\\n continue\\n }\\n tt += it2 + \\\"\\\\n\\\"\\n }\\n }\\n return tt\\n }, MY_PARAMS, MY_RULE.title),\\n type: \\\"novel\\\"\\n }\\n }\\n });\\n } else {\\n d.unshift({\\n title: \\\"未解析到目录列表\\\",\\n url: MY_URL,\\n col_type: \\\"text_center_1\\\",\\n });\\n }\\n d.unshift({\\n title: MY_PARAMS.bookName,\\n img: MY_PARAMS.cover,\\n url: MY_URL,\\n col_type: \\\"movie_1_vertical_pic_blur\\\"\\n })\\n setResult(d);\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"内容\",\"path\":\"content\",\"rule\":\"js:\\nvar d = [];\\nlet {\\n convert\\n} = $.require(\\\"hiker://page/converter\\\");\\nvar res = getResCode();\\nvar rule = MY_PARAMS.content\\nlet r = convert(rule.content);\\nlet r1 = r.split(\\\"&&\\\");\\nlet r2 = r1.slice(0, r1.length - 1).join(\\\"&&\\\");\\nlet arr = pdfa(res, \\\"body&&\\\" + r2);\\n//log(arr);\\nfor (let it of arr) {\\n it = it.replace(new RegExp(\\\"\\\\n\\\", \\\"g\\\"), \\\"--br--\\\");\\n //log(it);\\n var t = pdfh(it, \\\"Text\\\");\\n t = t.replace(new RegExp(\\\"--br--\\\", \\\"g\\\"), \\\"<br>\\\");\\n if (t == \\\"\\\") {\\n continue\\n }\\n let t2 = t.split(\\\"<br>\\\");\\n for (let it2 of t2) {\\n if (it2 == \\\"\\\" || it2.length == 1) {\\n continue\\n }\\n if (!it2.startsWith(\\\" \\\") && !it2.startsWith(\\\"&nbsp;&nbsp;\\\")) {\\n it2 = \\\"&nbsp;&nbsp;&nbsp;&nbsp;\\\" + it2.trim();\\n }\\n if (rule.replaceRegex) {\\n it2 = it2.replace(new RegExp(rule.replaceRegex.replace(\\\"##\\\", \\\"\\\"), \\\"g\\\"), \\\"\\\")\\n }\\n if (it2 == \\\"\\\" || it2 == \\\"&nbsp;&nbsp;&nbsp;&nbsp;\\\") {\\n continue\\n }\\n d.push({\\n title: it2,\\n url: \\\"\\\",\\n col_type: \\\"rich_text\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\"\\n });\\n }\\n}\\nd.unshift({\\n title: \\\"<big>\\\" + MY_PARAMS.title + \\\"</big>\\\",\\n col_type: \\\"rich_text\\\"\\n})\\nsetResult(d);\"},{\"col_type\":\"movie_1_vertical_pic\",\"name\":\"搜索\",\"path\":\"search\",\"rule\":\"js:\\nlet {\\n search\\n} = $.require(\\\"hiker://page/ss\\\");\\nlet d = [];\\nlet kw = getParam(\\\"kw\\\");\\nlet s = kw;\\nsetPageTitle(\\\"搜索\\\" + kw + \\\" \\\" + MY_PARAMS.bookSourceName);\\nif (typeof(getSearchMode) == \\\"undefined\\\") {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"你的软件版本太低,更新到最新版才能使用本规则\\\"\\n })\\n}\\nlet matchMust = getSearchMode() == 1;\\nlet tip = \\\"精确匹配:\\\" + (matchMust ? \\\"是\\\" : \\\"否\\\");\\nif (MY_PAGE == 1) {\\n d.push({\\n title: tip,\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n setSearchMode(getSearchMode() == 0 ? 1 : 0);\\n refreshPage();\\n return \\\"toast://OK\\\";\\n }),\\n col_type: \\\"text_1\\\",\\n });\\n}\\nlet d2 = search(MY_PARAMS.rules, kw, MY_PAGE);\\nfor (let it of d2) {\\n if (!matchMust || searchContains(it.title, s)) {\\n it.title = it.title.includes(\\\"““””\\\") ? it.title : \\\"““””\\\" + it.title.replace(new RegExp(\\\"<em>|</em>\\\", \\\"g\\\"), \\\"\\\").replace(new RegExp(s, \\\"g\\\"), \\\"<strong><span style=\\\\\\\"color: #1E90FF\\\\\\\">\\\" + s + \\\"</span></strong>\\\")\\n d.push(it);\\n }\\n}\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"转换\",\"path\":\"converter\",\"rule\":\"var convert = (str) => {\\n return str.replace(/@/g, \\\"&&\\\")\\n .replace(/\\\\.[0-9]/g, function(a) {\\n return a.replace(\\\".\\\", \\\",\\\")\\n })\\n .replace(new RegExp(\\\" \\\", \\\"g\\\"), \\\"&&\\\")\\n .replace(/text\\\\.(.*?)&&/g, \\\"*:contains($1),-1&&\\\")\\n .replace(/-class\\\\./g, \\\".\\\")\\n .replace(/class\\\\./g, \\\".\\\")\\n .replace(/tag\\\\./g, \\\"\\\")\\n .replace(/id\\\\./g, \\\"#\\\")\\n .replace(/##/g, \\\"!\\\")\\n .replace(/&&([a-zA-Z\\\\.\\\\-]+?)!([0-9])/g, \\\"--$1,$2&&$1\\\")\\n .replace(\\\"text\\\", \\\"Text\\\");\\n};\\nlet getArray = (html, rule) => {\\n let r1 = rule.split(\\\"!\\\")[0].split(\\\"||\\\");\\n let c = convert(r1[0]);\\n if (c.includes(\\\"&&li&&a\\\") && c[c.length - 1] == \\\"a\\\") {\\n c = c.replace(\\\"&&li&&a\\\", \\\"&&li\\\");\\n }\\n log(c);\\n let arr = pdfa(html, \\\"body&&\\\" + c);\\n if (r1.length > 1) {\\n let r2 = r1[1].split(\\\":\\\");\\n let r3 = [];\\n for (let it of r2) {\\n try {\\n let i = parseInt(it);\\n if (isNaN(i)) {\\n continue;\\n }\\n r3.push(i);\\n } catch (e) {}\\n }\\n let arr2 = [];\\n for (let i = 0; i < arr.length; i++) {\\n if (r3.indexOf(i) < 0) {\\n arr2.push(arr[i]);\\n }\\n }\\n return arr2;\\n }\\n log(\\\"获取失败,失败定位:\\\" + r1)\\n return arr;\\n};\\nlet getText = (html, rule) => {\\n var ru = convert(rule)\\n var r = pdfh(html, ru)\\n if (r == \\\"\\\") {\\n log(\\\"返回为空,可能是定位失败:\\\" + rule)\\n }\\n return r\\n};\\nlet getUrl0 = (html, parentRule, rule) => {\\n if (parentRule != null) {\\n parentRule = parentRule.split(\\\"!\\\")[0];\\n }\\n let p = parentRule != null && parentRule[parentRule.length - 1] == \\\"a\\\" ? \\\"a&&\\\" : \\\"\\\";\\n let r = pd(html, p + convert(rule.split(\\\"##\\\")[0]));\\n if (r == \\\"\\\") {\\n log(\\\"返回为空,可能是定位失败:\\\" + rule)\\n }\\n return r\\n};\\nlet parseUrl = (url, page) => {\\n url = url.replace(new RegExp(\\\"{{page}}\\\", \\\"g\\\"), page);\\n let s = url.split(\\\"<,\\\");\\n if (s.length > 1) {\\n if (page > 1) {\\n let s2 = s[1].split(\\\">\\\");\\n url = s[0] + s2[0] + (s2.length > 1 ? s2[1] : \\\"\\\")\\n } else {\\n url = s[0];\\n }\\n }\\n return url;\\n}\\nlet getCharset = (searchUrl) => {\\n if (searchUrl) {\\n if (searchUrl.includes('\\\"gbk\\\"') || searchUrl.includes(\\\"'gbk'\\\")) {\\n return \\\"gbk\\\"\\n } else if (searchUrl.includes('\\\"gb2312\\\"') || searchUrl.includes(\\\"'gb2312'\\\")) {\\n return \\\"gb2312\\\"\\n }\\n }\\n return null\\n}\\n$.exports = {\\n getArray: getArray,\\n convert: convert,\\n getText: getText,\\n getUrl0: getUrl0,\\n parseUrl: parseUrl,\\n getCharset: getCharset\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"聚搜\",\"path\":\"ju\",\"rule\":\"js:\\nvar d = [];\\nlet {\\n search,\\n listRules\\n} = $.require(\\\"hiker://page/ss\\\");\\nlet {\\n all,\\n use,\\n data\\n} = listRules(MY_PAGE);\\ndata = data || [];\\nlet s = getParam(\\\"kw\\\");\\nsetPageTitle(\\\"搜索\\\" + s);\\nif (typeof(getSearchMode) == \\\"undefined\\\") {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"你的软件版本太低,更新到最新版才能使用本规则\\\"\\n })\\n}\\nlet matchMust = getSearchMode() == 1;\\nlet tip = \\\"搜索源:\\\" + use + \\\"/\\\" + all + \\\" 精确匹配:\\\" + (matchMust ? \\\"是\\\" : \\\"否\\\");\\nif (MY_PAGE == 1) {\\n d.push({\\n title: tip,\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n setSearchMode(getSearchMode() == 0 ? 1 : 0);\\n refreshPage();\\n return \\\"toast://OK\\\";\\n }),\\n col_type: \\\"text_1\\\",\\n extra: {\\n id: \\\"yuedu-s-h\\\"\\n }\\n });\\n} else if (data.length > 0) {\\n updateItem(\\\"yuedu-s-h\\\", {\\n title: tip\\n });\\n}\\nlet p = MY_PAGE;\\nlet pageid = \\\"yuedu-page\\\" + MY_PAGE;\\nif (data.length > 0) {\\n d.push({\\n title: \\\"加载第\\\" + MY_PAGE + \\\"页中,进度:1/\\\" + data.length,\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n id: pageid\\n }\\n });\\n}\\nsetResult(d);\\nif (data.length > 0) {\\n //多线程加载\\n let tasks = data.map(it => {\\n return {\\n func: function(rule) {\\n return search(rule, s, 1);\\n },\\n param: it,\\n id: \\\"rule@\\\" + it.name\\n }\\n });\\n\\n batchExecute(tasks, {\\n func: function(param, id, error, result) {\\n //log(\\\"listener: \\\" + (result || []).length)\\n param.i = param.i + 1;\\n if (result) {\\n try {\\n for (let it of result) {\\n param.j = param.j + 1;\\n if (matchMust) {\\n if (!searchContains(it.title, s)) {\\n continue;\\n }\\n }\\n let extra = it.extra || {};\\n extra.id = \\\"__app\\\" + MY_PAGE + \\\"@\\\" + param.j;\\n extra.bookName = it.title\\n extra.cover = it.pic_url || it.img\\n addItemBefore(pageid, {\\n title: it.title.includes(\\\"““””\\\") ? it.title : \\\"““””\\\" + it.title.replace(new RegExp(\\\"<em>|</em>\\\", \\\"g\\\"), \\\"\\\").replace(new RegExp(s, \\\"g\\\"), \\\"<strong><span style=\\\\\\\"color: #1E90FF\\\\\\\">\\\" + s + \\\"</span></strong>\\\"),\\n desc: it.desc,\\n url: it.url,\\n pic_url: it.pic_url || it.img,\\n col_type: it.pic_url || it.img ? 'movie_1_vertical_pic' : \\\"text_1\\\",\\n extra: extra\\n })\\n }\\n } catch (e) {}\\n\\n }\\n if (param.i >= param.all) {\\n deleteItem(pageid)\\n } else {\\n updateItem({\\n title: \\\"加载第\\\" + MY_PAGE + \\\"页中,进度:\\\" + (param.i + 1) + \\\"/\\\" + param.all,\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n id: pageid\\n }\\n })\\n }\\n },\\n param: {\\n all: data.length,\\n i: 0,\\n j: -1\\n }\\n });\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"搜索辅助\",\"path\":\"ss\",\"rule\":\"var {\\n convert,\\n parseUrl,\\n getCharset\\n} = $.require(\\\"hiker://page/converter\\\");\\nlet search = (rule, kw, page) => {\\n let d = [];\\n let m = rule.ruleSearch\\n // 阅读=>视界\\n let u = rule.searchUrl.startsWith(\\\"http\\\") ? rule.searchUrl : rule.bookSourceUrl + rule.searchUrl;\\n //log(m);\\n let url1 = parseUrl(u, page).replace(new RegExp(\\\"{{key}}\\\", \\\"g\\\"), kw);\\n let url2 = url1.split(\\\",{\\\");\\n let url = url2[0];\\n let headers = {};\\n let method = \\\"get\\\";\\n let body = null;\\n let c = getCharset(url1);\\n if (c) {\\n headers.charset = c;\\n headers[\\\"Content-Type\\\"] = \\\"text/html; charset=\\\" + c;\\n }\\n try {\\n if (url2.length > 1 && url1.substring(url1.length - 1, url1.length) == \\\"}\\\") {\\n let ext = \\\"{\\\" + url1.substring(url1.indexOf(\\\",{\\\") + 2, url1.length);\\n //log(ext);\\n try {\\n ext = JSON.parse(ext);\\n } catch (e) {\\n eval(\\\"ext=\\\" + ext);\\n }\\n if (ext.method && ext.method != \\\"\\\") {\\n method = ext.method;\\n }\\n if (ext.body && ext.body != \\\"\\\") {\\n body = ext.body;\\n headers[\\\"Content-Type\\\"] = \\\"application/x-www-form-urlencoded\\\" + (headers.charset ? \\\";charset=\\\" + headers.charset : \\\"\\\");\\n }\\n }\\n } catch (e) {\\n if (url1.includes('\\\"POST\\\"') || url1.includes('\\\"post\\\"')) {\\n method = \\\"post\\\";\\n }\\n }\\n if (method == \\\"post\\\" || method == \\\"POST\\\") {\\n let ct = headers[\\\"Content-Type\\\"];\\n headers[\\\"Content-Type\\\"] = ct ? ct.replace(\\\"text/html\\\", \\\"application/x-www-form-urlencoded\\\") : \\\"application/x-www-form-urlencoded\\\";\\n }\\n\\n let listrule = \\\"body&&\\\" + convert(m.bookList).split(\\\"||\\\")[0]\\n let author = null;\\n try {\\n author = convert(m.author);\\n } catch (e) {}\\n let cover = null;\\n try {\\n cover = convert(m.coverUrl);\\n } catch (e) {}\\n let name = null;\\n try {\\n name = convert(m.name);\\n } catch (e) {}\\n let bookurl = null;\\n try {\\n bookurl = convert(m.bookUrl);\\n } catch (e) {}\\n let intro = null;\\n try {\\n intro = convert(m.intro);\\n } catch (e) {}\\n //setPageTitle(\\\"搜索\\\" + getParam(\\\"kw\\\") + \\\" \\\" + MY_PARAMS.bookSourceName);\\n //MY_URL = url;\\n let res = request(url, {\\n method: method,\\n headers: headers,\\n body: body\\n });\\n let pdfh1 = (a, b) => {\\n try {\\n if (b == null) return \\\"\\\";\\n return pdfh(a, b);\\n } catch (e) {\\n return \\\"\\\";\\n }\\n }\\n let pd1 = (a, b, c) => {\\n try {\\n if (b == null) return \\\"\\\";\\n return pd(a, b, c);\\n } catch (e) {\\n return \\\"\\\";\\n }\\n }\\n listrule = listrule.replace(\\\"&&tbody--tr,0&&tr\\\", \\\"&&table tbody tr:gt(0)\\\");\\n //log(listrule);\\n let list = pdfa(res, listrule);\\n //log(list);\\n //log(name);\\n list.forEach(item => {\\n let next = rule.ruleToc.nextTocUrl;\\n let nexttoc = next && next != \\\"\\\";\\n let ac = nexttoc ? \\\"\\\": \\\"#autoCache#\\\";\\n //let ac = \\\"#autoCache#\\\";\\n let u1 = pd1(item, bookurl, url) + ac + \\\"#immersiveTheme#\\\";\\n if (c) {\\n u1 = u1 + \\\";get;\\\" + c\\n }\\n d.push({\\n title: pdfh1(item, name),\\n img: pd1(item, cover, url),\\n url: \\\"hiker://page/menu\\\",\\n desc: rule.bookSourceName + \\\"\\\\n\\\" + pdfh1(item, author) + \\\"\\\\n\\\" + pdfh1(item, intro),\\n extra: {\\n \\\"Toc\\\": rule.ruleToc,\\n \\\"content\\\": rule.ruleContent,\\n \\\"bookName\\\": parseDomForHtml(item, name),\\n \\\"cover\\\": parseDom(item, cover, url),\\n url: nexttoc ? \\\"hiker://empty#\\\" + u1 : u1,\\n u1: nexttoc ? u1 : null,\\n inheritTitle: false,\\n charset: c\\n }\\n })\\n });\\n return d;\\n}\\n$.exports = {\\n convert: convert,\\n search: search,\\n listRules: (page, rule) => {\\n try {\\n //并发数量\\n let size = 16;\\n let {\\n load,\\n loadRules,\\n getSelect\\n } = $.require(\\\"hiker://page/datat\\\");\\n let data = load();\\n let select = getSelect(data);\\n let rules = data.length > 0 ? loadRules(select.name) : [];\\n if (!page && !rule) {\\n return rules.map(it => it.name);\\n }\\n if (rule != null) {\\n return rules.filter(i => i.name == rule);\\n }\\n let start = (page - 1) * size;\\n if (rules.length < start + 1) {\\n return [];\\n }\\n let len = size;\\n if (rules.length < page * size) {\\n len = rules.length - start\\n }\\n let all = rules.length;\\n let use = (page - 1) * size + len;\\n return {\\n all: all,\\n use: use,\\n data: rules.slice(start, start + len)\\n };\\n } catch (e) {\\n return {\\n all: 0,\\n use: 0,\\n data: []\\n }\\n }\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"数据\",\"path\":\"datat\",\"rule\":\"let load = function() {\\n try {\\n return JSON.parse(fetch(\\\"hiker://files/yuedu/list.json\\\")).urls;\\n } catch (e) {\\n return [];\\n }\\n}\\nlet loadRules = function(name) {\\n try {\\n let list = JSON.parse(fetch(\\\"hiker://files/yuedu/\\\" + md5(name) + \\\".json\\\"));\\n return list.filter(it => {\\n let s = JSON.stringify(it)\\n if (s.includes(\\\"<js>\\\") || s.includes(\\\"@js:\\\") || s.includes(\\\"$.\\\") || s.includes(\\\"🔞\\\")) {\\n return false\\n } else {\\n return true\\n }\\n });\\n } catch (e) {\\n return [];\\n }\\n}\\nlet remove = function(url) {\\n let data = load();\\n data = data.filter(it => it.url != url);\\n writeFile(\\\"hiker://files/yuedu/list.json\\\", JSON.stringify({\\n urls: data\\n }))\\n}\\nlet rename = function(url, name) {\\n let arr = load();\\n for (let i in arr) {\\n if (arr[i].url == url) {\\n arr[i].name = name;\\n }\\n }\\n writeFile(\\\"hiker://files/yuedu/list.json\\\", JSON.stringify({\\n urls: arr\\n }))\\n}\\nlet add = function(name, url) {\\n let data = load();\\n data = data.filter(it => it.url != url);\\n data.push({\\n name: name,\\n url: url\\n });\\n writeFile(\\\"hiker://files/yuedu/list.json\\\", JSON.stringify({\\n urls: data\\n }))\\n}\\nlet update = function(name, url) {\\n let t = fetch(url)\\n JSON.parse(t)\\n writeFile(\\\"hiker://files/yuedu/\\\" + md5(name) + \\\".json\\\", t)\\n}\\nlet share = function(name, url) {\\n return \\\"copy://悦读订阅数据分享,复制整条口令打开软件即可导入\\\\n\\\" + name + \\\":\\\" + url + \\\"@import=js:$.require('hiker://page/datat?rule=\\\" + MY_RULE.title + \\\"').ca()\\\"\\n}\\nlet cloudAdd = function() {\\n let s = input.split(\\\":\\\");\\n if (s.length > 1) {\\n add(s[0], s[1]);\\n update(s[0], s[1]);\\n }\\n return \\\"toast://已导入悦读订阅源“\\\" + s[0] + \\\"”\\\"\\n}\\nlet getSelect = function(data) {\\n if (data == null) {\\n data = load();\\n }\\n if (data.length == 0) {\\n return {};\\n }\\n let tab = getItem(\\\"tab\\\", data[0].url);\\n let select = data.filter(it => it.url == tab);\\n if (select.length <= 0) {\\n return data[0];\\n } else {\\n return select[0];\\n }\\n}\\n$.exports = {\\n add: add,\\n update: update,\\n remove: remove,\\n rename: rename,\\n load: load,\\n loadRules: loadRules,\\n getSelect: getSelect,\\n share: share,\\n ca: cloudAdd\\n}\"}]","proxy":"","icon":"https://s3.bmp.ovh/imgs/2022/10/02/9248af2624d64904.png"}]