18AV
https://18av.luoyacheng.ip-ddns.com
分享者: lyc486 (807)发布时间: 1天前
订阅源介绍:
内置Art播放器(感谢开源项目artplayer):
1、左右滑动跳转进度;2、左右双击快进快退,中间双击播放暂停;3、屏幕锁;4、自动播放和继续历史记录播放;5、长按3倍数等
登录界面:
1、可控制播放器是否自动播放和记录播放历史。
2、可选择是否显示预览图。
3、可选择显示播放链接并提供一键复制。
4、左右滑动的跳转幅度等级可调。
5、左右双击的跳转的跨度可设(单位,秒)(默认为10)。
6、可在登录界面填入两个搜索关键词。
7、每日更新可填写日期来查看具体某日的发布资源。
8、支持可设为调用手机本地播放器播放。
9、登录界面进入进入发布页后点击✓,会自动更新源地址和发布页地址。
10、长按界面超链接,会自动复制可用链接,可填写在订阅源登录界面的自定义分类或搜索处。
订阅源自带更新功能(点击版本更新会识别代码版本进行提示),但阅读自身没有订阅源版本识别,需在导入界面手动选中进行覆盖。
会对访问数据进行一定时间的缓存来提高使用体验。可多次下拉刷新来强制刷新内容。
注入js,对原网站进行广告净化处理。可在订阅源内跳转到原网站,当做普通浏览器使用。
[目前仅支持阅读测试版]
!!!未满18岁,请自觉绕道。严禁分享给未成年。
{ "articleStyle": 1, "contentBlacklist": ".*(?:pemsrv.com|mmfree3.com|magsrv.com).*,.*adcg.*gif", "customOrder": -10100149, "enableJs": true, "enabled": true, "enabledCookieJar": true, "header": "@js:\n(()=>{\n\tlet info=cache.getFromMemory('av18info');\nif (info) source.putLoginInfo(JSON.stringify(info)),cache.deleteMemory('av18info');\nlet headerss=gethd();\nheaderss['User-Agent']=java.getWebViewUA();\n return JSON.stringify(headerss);\n})();", "injectJs": "function setupAutoRemoveImages() {\n const AD_SELECTORS = [\n 'ut1_img',\n '.ut1_img_content',\n '.ut1_img utactivity',\n '.ut1_img_content_js',\n '.ut1_img_ex_content',\n '.di_img',\n '.di_100',\n '[class^=\"mvspan\"]'\n ].join(',');\n \/\/ 使用防抖函数优化高频DOM操作\n let cleanupTimer;\n const debouncedRemove = () => {\n clearTimeout(cleanupTimer);\n cleanupTimer = setTimeout(removeAllImages, 200);\n };\n const removeAllImages = () => { document.querySelectorAll(AD_SELECTORS).forEach(img => img.remove()); };\n\/\/forEach方法的回调函数是表达式,不是语句,不能加分号。\n\n const observer = new MutationObserver(mutations => {\n \/\/ 变化有效性检查\n const hasValidMutation = mutations.some(mutation =>\n mutation.type === 'childList' &&\n mutation.addedNodes.length > 0\n );\n\n if (hasValidMutation) {\n debouncedRemove();\n }\n });\n\n \/\/ 监听\n const observerConfig = {\n childList: true,\n subtree: true\n \/\/ 备用attributes: true\n };\n\n \/\/ 初始化立即执行一次清理\n removeAllImages();\n\n \/\/ 启动观察\n observer.observe(document.body, observerConfig);\n\n window.addEventListener('error', e => {\n console.error('广告清理出错:', e.error);\n observer.disconnect();\n });\n}\n\n\/\/ 自动重试机制\nlet retryCount = 0;\nfunction init() {\n try {\n setupAutoRemoveImages();\n } catch (e) {\n if (retryCount++ < 3) {\n setTimeout(init, 1000 * retryCount);\n }\n }\n}\n\n\/\/ 确保DOM加载后执行\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', init);\n} else {\n init();\n}", "jsLib": "sleep=Packages.java.lang.Thread.sleep;\nu_a = 'Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/135.0.0.0 Safari\/537.36 Edg\/135.0.0.0';\nx_r_w = ''; \/\/com.microsoft.emmx\ns_c_u_p = `\"Windows\"`;\ns_c_u = `\"Microsoft Edge\";v=\"135\", \"Not-A.Brand\";v=\"8\", \"Chromium\";v=\"135\"`;\na_l = 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7';\n\nfunction gethd(url='',ck='') {\n\tlet ck0 = this.source.getLoginHeader()||'';\n\tlet headerss = {\n\t\t \t'User-Agent': u_a,\n\t\t \t'Cookie': ck0,\n\t\t \t'x-requested-with': x_r_w,\n \t'Accept-Language': a_l\n \t }\nif (ck==1&&url!='') return url+','+JSON.stringify({'headers':headerss,'webView':true});\nif (ck!='') headerss['Cookie']=ck;\nif (url=='') return headerss;\nreturn url+','+JSON.stringify({'headers':headerss});\n}\n\nfunction gets(x, r) {\nreturn r == undefined ? String(this.java.getString(x)) : String(this.java.getString(x,r));}\n\nfunction surl() {\n\tlet surl=(this.source.getLoginInfoMap()||{'网址':''})['网址']+''||'https:\/\/mjv006.com';\n\treturn surl.replace(\/\\\/$\/,'');}\n\t\nfunction skey(x) {\n\treturn (this.source.getLoginInfoMap()||{'搜索1':'','搜索2':''})['搜索'+x]+[]||(x==1?'波多':'日向');}\n\nfunction tmtz() {\n\t\tlet tmt = (this.source.getLoginInfoMap()||{'双击跳转时间':''})['双击跳转时间']+[];\n\t\tif (tmt>2) return tmt;\n\t\telse return '10';\n\t}\n\nfunction tkey() {\n\tlet tkey = (this.source.getLoginInfoMap()||{'每日更新':''})['每日更新']+[];\n\tif (tkey) {\n\t\ttkey = tkey.replace(\/^\\d{0,2}(\\d{2})[\\-\\ \\\/](\\d{1,2})[-\\ \\\/](\\d{1,2})$\/, (mt, p1, p2, p3)=>{\n\t\t\tp1='20'+p1;\n\t\t\tp2=p2.padStart(2, '0');\n\t\t\tp3=p3.padStart(2, '0');\n\t\t\tp2>12&&(p2='012')\n\t\t\tp3>31&&(p3='031')\n\t\t\treturn p1+'-'+p2+'-'+p3;\n\t\t\t});\n\t\t\tif (!\/^\\d{4}-\\d{2}-\\d{2}$\/.test(tkey)) {\n\t\t\t\ttkey='';\n\t\t\t\tthis.java.toast('\\n❎请输入正确的时间格式');}\n}\nif (!tkey) {tkey = this.java.timeFormatUTC(Date.now(),\"yyyy-MM-dd\",6*60*60*1000)+[];}\n\treturn tkey;}\n\t\nfunction rrcheck(url, webr) {\n\tconst {java, source, cookie} = this;\n\tlet webr2 = org.jsoup.Jsoup.parse(webr);\n\tlet url19 = (webr2.select('#fwin_dialog_submit').attr('onclick')+'').match(\/http[^\"']+\/);\nif (url19) {\n\tlet ck=\tjava.connect(url19)\n\t.headers()\n\t.values(\"Set-Cookie\");\n\tlet cks = [];\n\tfor (let char of ck) {\n\tchar=(char+'').replace(\/;.+\/,'');\n\tcks.push(char);}\n\tck=cks.join('; '); \/\/带ajax得到的会话ck访问时不会有ck返回,为激活ck(主要用于不启用jar)\n\/\/\tcookie.replaceCookie(url,ck); \/\/不调用startBrowser,ck不会同步到内置浏览器\nck=ck||cookie.getCookie(url)+'';\n\/\/勾选ckjar就能getck读取本次软件会话ck(重启软件失效),setck函数才会一直保存源ck?\nck && source.putLoginHeader(ck); \/\/ck过期时不需要更新ck,直接再激活\n\tsleep(200); \/\/服务器记录可能需要延时\n\twebr=java.ajax(url); \/\/访问前会执行一次请求头规则\n\t}\n\treturn java.t2s(webr)+'';\n}\n\n\nfunction gengxin(){\nconst {java, source} = this;\n\tlet url0='https:\/\/gitee.com\/lyc486\/yuedu2\/commits\/main\/订阅\/18AV\/18av.json?browser_history=0&page=1&per=3';\n\tlet rr0=java.get(url0,{'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body();\n\tlet \tgxlrr = com.jayway.jsonpath.JsonPath.read(rr0, '$.list[0:3].title');\n\tlet [gxlr, gxlr2, gxlr3] = gxlrr;\n\tlet banben = String(source.sortUrl).match(\/let banben=\"([\\d\\.]+)\"\/)[1];\n\tgxlr=String(gxlr).split(\/^([^\\-]+)-\/);\n\tgxlr[0]=='' ? '' : gxlr=['','0',gxlr[0]];\n\tlet gxts;\n\tif (gxlr[1]>banben){gxts=['更新','0,140,186'];}\n\telse {gxts= ['导入','76,175,80'];};\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>18AV ${gxts[0]}<\/title>\n<style>\ntable {\n\ttext-align: center;\n\tmargin: 0 auto;\n\t}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;\n\t}\nbutton {\n\tbackground-color: rgb(${gxts[1]});\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\t}\nbutton span {\n cursor: pointer;\n display: inline-block;\n position: relative;\n transition: 0.4s;\n}\nbutton span:after {\n content: '>';\n position: absolute;\n opacity: 0;\n top: 0;\n right: 30px;\n transition: 0.2s;\n}\nbutton:active span {\n padding-right: 20px;\n}\nbutton:active span:after {\n opacity: 1;\n right: -40px;\n}\n<\/style>\n<\/head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<th colspan=\"2\">最新日志:${gxlr[2]}<\/th>\n<tr>\n<td>仓库版本:${gxlr[1]}<\/td>\n<td>本地版本:${banben}<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" style=\"text-align: left;\">往期日志:${gxlr2}<br> ${gxlr3}<\/td>\n<\/tr>\n<\/table>\n<div class=\"ann\">\n<a href=\"legado:\/\/import\/importonline?src=https:\/\/gitee.com\/lyc486\/yuedu2\/raw\/main\/订阅\/18AV\/18av.json\">\n<button><span>${gxts[0]}<\/span><\/button>\n<\/a>\n<\/div>\n<a href=\"legado:\/\/import\/importonline?src=https:\/\/cdn.jsdelivr.net\/gh\/Luoyacheng\/yuedu@main\/订阅\/18AV\/18av.json\" style=\"font-size: 10px;\">备用链接<\/a>\n<\/body>\n<\/html>`;\njava.startBrowser(`data:text\/html;base64,${java.base64Encode(htm)}`,'订阅源更新');\r\n}\n", "lastUpdateTime": 0, "loadWithBaseUrl": true, "loginUi": "[\n {\n name: \"网址\",\n type: \"text\"\n },\n {\n name: \"搜索1\",\n type: \"text\"\n },\n {\n name: \"搜索2\",\n type: \"text\"\n },\n {\n name: \"每日更新\",\n type: \"text\"\n },\n \t{\n name: \"📺播放器\",\n type: \"button\",\n action: \"bfq()\",\n style: {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1,\n \"layout_wrapBefore\": true\n }\n },\n \t{\n name: \"🔘继续播放\",\n type: \"button\",\n action: \"bfqfun('继续播放')\",\n style: {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_wrapBefore\": true\n }\n },\n \t{\n name: \"🔘自动播放\",\n type: \"button\",\n action: \"bfqfun2('自动播放')\",\n style: {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_wrapBefore\": flase\n }\n },\n \t{\n name: \"🔘滑动等级\",\n type: \"button\",\n action: \"bfqfun3('左右滑动等级',7)\",\n style: {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_wrapBefore\": flase\n }\n },\n \t{\n name: \"🔘显示链接\",\n type: \"button\",\n action: \"bfqfun('显示链接')\",\n style: {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_wrapBefore\": flase\n }\n },\n \t{\n name: \"🔘预览图\",\n type: \"button\",\n action: \"bfqfun('预览图')\",\n style: {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_wrapBefore\": flase\n }\n },\n \t{\n name: \"🔘外置播放器\",\n type: \"button\",\n action: \"bfqfun2('外置播放器')\",\n style: {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_wrapBefore\": flase\n }\n },\n {\n name: \"双击跳转时间\",\n type: \"text\"\n },\n {\n name: \"自定义分类\",\n type: \"text\"\n },\n \t{\n name: \"🌐网址发布\",\n type: \"button\",\n action: \"fabuye()\",\n style: {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_wrapBefore\": true\n }\n },\n \t{\n name: \"🆕版本更新\",\n type: \"button\",\n action: \"gengxin()\",\n style: {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_wrapBefore\": flase\n }\n }\n]", "loginUrl": "function login() {}\n\nfunction fabuye(){\n\tlet fbyu = source.get('fbyu')+'';\n\tlet headers = JSON.parse(eval(source.header.replace('@js:','')+''));\n\ttry {java.head(fbyu,headers);}\n\tcatch(e) {fbyu='https:\/\/mm18vc.com';}\n\tlet webr = java.startBrowserAwait(fbyu,'发布页',false).body();\n\tlet rr = org.jsoup.Jsoup.parse(webr);\n\tfbyu = rr.select('.list:nth-of-type(3) a').attr('href')+'';\n\tsource.put('fbyu',fbyu);\n\tlet surl = (rr.select('.list:nth-of-type(6) a').attr('href')+'').replace('http:\/\/','https:\/\/');\n\ttry {java.head(surl,headers);\n\tjava.longToast('已记录最新网址\\n'+surl);\n\tlet Info=source.getLoginInfoMap()||{};\n\tInfo['网址'] = surl;\n\tcache.putMemory('av18info',Info);\n\tsource.putLoginInfo(JSON.stringify(Info));\t\n} catch(e) {java.longToast('得到的网址\\n'+surl+'\\n无法访问,不进行记录');}\n}\n\nfunction bfq(){\njava.toast('正在读取播放器信息...');\njava.deleteFile('dcc1a0ac99b90ead.js');\nlet [,bb]=java.cacheFile('https:\/\/unpkg.com\/artplayer\/dist\/artplayer.js').match(\/artplayer.js.*v(.+)\/i);\njava.longToast('\\n当前使用artplayer播放器\\n版本号:V'+bb);\n\t}\n\nfunction bfqfun(x) {\nlet xx = source.get('av'+x);\n\/\/默认开启\nif(xx!=2) {source.put('av'+x,2);java.toast('⚫已关闭 '+x);}\nelse {source.put('av'+x,1);java.toast('🟢已开启 '+x);}\n\t}\nfunction bfqfun2(x) {\nlet xx = source.get('av'+x);\n\/\/默认关闭\nif(xx!=1) {source.put('av'+x,1);java.toast('🟢已开启 '+x);}\nelse {source.put('av'+x,0);java.toast('⚫已关闭 '+x);}\n\t}\nfunction bfqfun3(x,y) {\nlet xx = source.get('av'+x);\n\/\/等级调节\nxx=(xx==''||xx==1)?y+1:xx;\nif (xx>1) {\n\txx--;\n\tsource.put('av'+x,xx);\n\tjava.toast('🔵'+x+':'+xx+'级');}\n}\n", "ruleArticles": "<js>\nlet url=surl()+java.hexDecodeToString(result);\nlet webr=cache.get(url)+'';\nif (webr.length<6999) {\nwebr=java.ajax(url);\nwebr=rrcheck(url, webr);\nif (\/animation_list\\\/all\/.test(url))\ncache.put(url,webr,3600*24*3);\nelse if (\/content_news\\\/all|fc_search\\\/all\/.test(url))\ncache.put(url,webr,3600*24*2);\nelse if (\/uncensored_list\\\/all\/.test(url))\ncache.put(url,webr,3600*24);\nelse\ncache.put(url,webr,3600*4);\n} else {\n\tlet mk=cache.getFromMemory(url+'2')||0;\n\tcache.putMemory(url+'2',mk+1);\n\tlet tmh = new Date().getHours();\n\tif (\/content_news\\\/all|animation_list\\\/all|fc_search\\\/all\/.test(url)) {mk>3&&cache.delete(url);}\n\telse if (mk>1||tmh>1&&tmh<4) {\n\t\tcache.deleteMemory(url+'2');\n\t\tcache.delete(url);}\n}\nwebr = org.jsoup.Jsoup.parse(webr);\nwebr.select('.posts>.post')\n<\/js>", "ruleContent": "<js>\nlet uu=java.hexDecodeToString(result)+'';\nresult=uu.replace(\/[\\\/\\.\\_\\-\\s]|html$\/g,'');\nlet ssurl = surl();\r\n let url = ssurl + uu;\n let webr=cache.get(url)+'';\n if (webr.length<6999) {\r\n webr = java.ajax(url);\r\n webr = rrcheck(url, webr);\n cache.put(url,webr,3600*24*20);}\r\n let pimg = gets('#player-wrap img@src', webr);\r\n let yimgs = gets('.ut1_img_content_smallcg@html', webr);\r\n let jianjie = gets('.posts-inner-details-text,.actor-right-details-images,.posts-inner-details-text@html', webr).replaceAll('https:\/\/pics.','http:\/\/cdn.cdnjson.com\/pic.html?url=pics.');\r\n let srcurl = source.get('av18' + result) + '';\r\n if (!srcurl) {\r\n java.toast('解密本片链接中');\r\n let webjs = `\r\njfun_show_vfc();\r\n$('body .main .container_small center').html()`;\n try {\r\n webr = java.webView(webr, url, webjs);\n } catch(err) {webr='';}\r\n srcurl = webr.match(\/\\\/\\\/[^\"']+js\\\/player\\\/[^\"']+php\\?id=100_([^\"'_]+)_([^\"']+)\/);\r\n if (srcurl) {\r\n srcurl = `\/${srcurl[1]}\/${srcurl[2]}\/${srcurl[2]}.m3u8`;\r\n source.put('av18' + result, srcurl);\n }\r\n }\n\nif (!srcurl||!pimg) {\ncache.delete(url);\njava.longToast('💔未获取到播放链接');\nresult='';}\nelse {\n\tif (\/18av\\.mm\\-\/.test(ssurl))\n\tsrcurl = \"https:\/\/v.imgstream2.com\"+ srcurl;\n\telse\n\tsrcurl = ssurl.replace('\/\/', '\/\/fc.') + srcurl;\t\n\tlet lianjie=source.get('av显示链接')!=2?\n\t`<p>播放链接:<span>${srcurl}<\/span><button onclick=\"copyText(this,'before')\" style=\"margin-left: 2ex;\">⎘复制<\/button><\/p>`:'';\n\tlet pyer=source.get('av外置播放器')==1;\n\tif (pyer)\tjava.openUrl(srcurl,'video\/*');\n\t\/\/ 设置Cookie\nlet cks=(source.getLoginHeader()+'').split(\/;\\s*\/);\nlet ckjs='';\nfor (let ck of cks) {\n\tif (ck) ckjs+=`document.cookie = \"${ck}; path=\/\";\n`;}\n\n\tresult=`\r\n <!DOCTYPE html>\r\n <html lang=\"zh-CN\">\r\n \r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <title>${rssArticle.sort}<\/title>\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\">\r\n <style>\r\n * {\r\n margin: 0;\r\n padding: 0;\r\n box-sizing: border-box;\r\n }\r\n \r\n html,\r\n body {\r\n width: 100%;\n overflow-x: hidden;\n overflow-wrap: break-word;\n word-break: break-all;\r\n }\r\n \r\n .artplayer-app {\n \taspect-ratio: 16\/9;\r\n }\r\n \r\n .ut1_img_content_smallcg {\r\n display: flex;\r\n flex-wrap: wrap;\r\n line-height: 0;\r\n justify-content: space-between;\r\n }\r\n \r\n .img_smallcg img {\r\n width: 50vw;\r\n height: auto;\r\n }\r\n \r\n .posts-inner-details-text-top {\r\n display: flex;\r\n flex-wrap: wrap;\r\n }\r\n \r\n .posts-inner-details-text-left ul {\r\n display: flex;\r\n width: 50vw;\r\n flex-wrap: wrap;\r\n }\r\n \r\n .posts-inner-details-text-left li {\r\n width: 25vw;\r\n list-style: none;\n flex-wrap: wrap;\r\n }\r\n \r\n .posts-inner-details-text-under li span {\r\n margin-right: 1ex;\r\n }\r\n \r\n h3 {\r\n margin: 1ex;\r\n }\r\n <\/style>\r\n <\/head>\r\n \r\n <body>\r\n <div class=\"artplayer-${pyer?'exo':'app'}\"><\/div>\n <div class=\"jianjie\">\r\n <h3>${rssArticle.title}<\/h3>\r\n ${source.get('av预览图')!=2?yimgs:''}\r\n ${jianjie}\n ${lianjie}\r\n <br>\n <\/div>\r\n <script>\r\n function hexToString(hex) {\r\n if (hex.length % 2 !== 0) hex = '0' + hex;\r\n const bytes = new Uint8Array(hex.length \/ 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n bytes[i \/ 2] = parseInt(hex.substr(i, 2), 16);\r\n }\r\n return new TextDecoder('utf-8').decode(bytes);\r\n }\neval(hexToString(\"${pyer?'':java.hexEncodeToString(java.importScript('https:\/\/unpkg.com\/artplayer\/dist\/artplayer.js'))}\"))\r\n <\/script>\r\n <script>\n Artplayer.PLAYBACK_RATE = [0.75, 1, 2, 4, 6];\n Artplayer.FAST_FORWARD_TIME = 500;\n Artplayer.MOBILE_DBCLICK_PLAY = false;\n Artplayer.TOUCH_MOVE_RATIO = 0.${source.get('av左右滑动等级')+''||'5'};\r\n var art = new Artplayer({\r\n container: '.artplayer-app',\r\n url: '${srcurl}',\n poster: '${pimg}',\r\n id: '${result}',\r\n theme: '#ffad00',\r\n autoplay: ${source.get('av自动播放')==1?true:false},\r\n muted: ${source.get('av自动播放')==1?true:false},\r\n fullscreen: true,\r\n autoSize: true,\r\n autoMini: false,\r\n playbackRate: true,\r\n setting: true,\r\n lock: true,\r\n gesture: true,\r\n fastForward: true,\r\n autoPlayback: ${source.get('av继续播放')!=2?true:false},\r\n autoOrientation: true,\r\n });\nart.on('dblclick', (event) => {\n\t const tmz = +\"${tmtz()}\";\n\t\tconst clix = event.clientX;\n\t\tconst rwid = art.rect.width;\n\t if (clix < rwid \/ 3) art.backward = tmz;\n\t else if (clix > rwid * 2 \/ 3) art.forward = tmz;\n\t else art.toggle();\n});\nart.once('ready', () => {\nlet lo=localStorage.getItem(\"artplayer_settings\")+'';\nlet slo=\\`${source.get('localS')}\\`;\nif (slo.length>lo.length)\nlocalStorage.setItem(\"artplayer_settings\",slo);\nelse\nwindow.location.href = \"yuedu:\/\/setvar\/\" + encodeURIComponent(lo);\n});\n<\/script>\n<script>\n${ckjs}\nfunction copyText(button, weizi) {\n const text = weizi == 'before' ?\n button.previousElementSibling.textContent :\n weizi == 'after' ?\n button.nextElementSibling.textContent :\n '异常';\n const btext = button.textContent;\n navigator.clipboard.writeText(text)\n .then(() => {\n button.textContent = \"✓已复制\";\n setTimeout(() => {\n button.textContent = btext;\n }, 1500);\n })\n .catch(err => {\n button.textContent = \"✗失败\";\n setTimeout(() => {\n button.textContent = btext;\n }, 1500);\n });\n}\nlet pressTimer = null;\ndocument.querySelector('.jianjie').addEventListener('touchstart', (e) => {\n\tlet ee=e.target;\n\tif (ee.tagName=='A') \n\tpressTimer = setTimeout(() => {\n\t\tlet txt=ee.textContent+\"::\"+ee.href;\nnavigator.clipboard.writeText(txt).then(()=>{alert(\"已复制到剪贴板,可填在登录界面的自定义分类或搜索处。\\\\n\\\\n\"+txt);});\n}, 1200);\n\n});\n \ndocument.querySelector('.jianjie').addEventListener('touchend', e => {\n\tif (pressTimer) {\n\t\tclearTimeout(pressTimer);\n\t\tpressTimer = null;}\n});\r\n<\/script>\n <\/body>\r\n <\/html>\r\n `;}\r\n<\/js>", "ruleImage": "img@src", "ruleLink": "a.0@href\n<js>\nlet url=java.base64Encode(result.replace(\/^http.{4}[^\\\/]+\/,''));\nresult+`@js:'data:;base64,${url},{\"type\":\"18av\"}'`;\n<\/js>", "ruleNextPage": "page", "rulePubDate": ".con .meta@text", "ruleTitle": ".con a@text", "shouldOverrideUrlLoading": "if (url.startsWith('yuedu:\/\/setvar\/')) {\tsource.put('localS',decodeURIComponent(url.replace('yuedu:\/\/setvar\/','')));}\n!\/mjv\\d+.com|mm18\\w+.com|18av.mm\/.test(url)", "singleUrl": false, "sortUrl": "<js>\r\nlet banben=\"1.0.5\";\nlet fkey = (source.getLoginInfoMap()||{'自定义分类':''})['自定义分类']+[];\nfkey=fkey.trim().split(\/\\s+\/).map(x=>x\n\t.replace(\/::https.{3}[^\\\/]+\/,'::data:;base64,{{java.base64Encode(\"')\n\t.replace(\/(?:\\d+|page)\\.html$\/,'\"+page+\".html\")')\n\t.replace(\/(?:index)\\.html$\/,'index.html?t=\"+page)') + '}},{\"type\":\"18av\"}').join('\\n');\n`中文字幕::data:;base64,{{java.base64Encode(\"\/zh\/chinese_list\/all\/\"+page+\".html\")}},{\"type\":\"18av\"}\n无码AV::data:;base64,{{java.base64Encode(\"\/zh\/uncensored_list\/all\/\"+page+\".html\")}},{\"type\":\"18av\"}\nH动漫::data:;base64,{{java.base64Encode(\"\/zh\/animation_list\/all\/\"+page+\".html\")}},{\"type\":\"18av\"}\n搜索1::data:;base64,{{java.base64Encode(((y=skey(1).match(\/\\\\\/zh\\\\\/.+(?=\\\\\/1.html)\/))?y[0]:(\"\/zh\/fc_search\/all\/\"+skey(1)))+\"\/\"+page+\".html\")}},{\"type\":\"18av\"}\n搜索2::data:;base64,{{java.base64Encode(((y=skey(2).match(\/\\\\\/zh\\\\\/.+(?=\\\\\/1.html)\/))?y[0]:(\"\/zh\/fc_search\/all\/\"+skey(2)))+\"\/\"+page+\".html\")}},{\"type\":\"18av\"}\n每日更新::data:;base64,{{java.base64Encode(\"\/zh\/content_news\/all\/\"+tkey()+\".html\")}},{\"type\":\"18av\"}\n随机近作::data:;base64,{{java.base64Encode(\"\/zh\/chinese_random\/all\/index.html?t=\"+page)}},{\"type\":\"18av\"}\n随机所有::data:;base64,{{java.base64Encode(\"\/zh\/chinese_randomall\/all\/index.html?t=\"+page)}},{\"type\":\"18av\"}\n${fkey}\n国产自拍::data:;base64,{{java.base64Encode(\"\/zh\/dt_list\/all\/\"+page+\".html\")}},{\"type\":\"18av\"}\n`<\/js>", "sourceGroup": "🙈", "sourceIcon": "https:\/\/gitee.com\/lyc486\/yuedu\/raw\/master\/0GP0yD.gif", "sourceName": "18AV", "sourceUrl": "https:\/\/18av.luoyacheng.ip-ddns.com" }