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"
}
广告