Hanime1
https://hanime1.me#xh
分享者: xiaohan231 (515)发布时间: 2024/09/11
修改:1、优化页面样式;by:xiaohan231-2024/08/25 修改:1、优化长按倍速播放功能;2、增加分辨率切换功能;by:xiaohan231-2024/08/24 修改:1、优化播放器样式;2、选择播放倍速后,点击屏幕不再恢复成正常;3、添加长按2倍速播放功能,想要设置成其他的可以在内容规则根据注释修改;by:xiaohan231-2024/08/21 修改:1、调用Plyr插件搭建网页播放器;2、设置播放器默认比例为16/9,以防止加载时播放器高度变动;3、优化播放器样式;by:xiaohan231-2024/08/20 修改:1、增加收藏关键词;2、视频不再采用第三方解析,改为调用原生播放器;3、添加视频封面;by:xiaohan231-2024/08/18 修改:1、优化内容规则;by:xiaohan231-2024/08/17 修改:1、修复cosplay视频链接获取bug;2、修复部分视频无法解析bug;3、优化视频链接获取,自动选择最高分辨率;4、增加排序方式切换和发布日期筛选;by:xiaohan231-2024/08/14 修改:1、修复列表bug;2、修改分类地址获取;3、优化内容规则;by:xiaohan231-2024/08/11 by:xiaohan231-2024/08/10
{ "articleStyle": 1, "customOrder": 18, "enableJs": true, "enabled": true, "enabledCookieJar": false, "header": "<js>\nheaders={\n \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/127.0.0.0 Mobile Safari\/537.36 EdgA\/127.0.0.0\",\n \"Referer\": String(source.getKey()).replace(\/(.*\\\/\\\/[a-z0-9.-]+).*\/, '$1')\n}\nJSON.stringify(headers);\n<\/js>", "injectJs": "", "jsLib": "function get(tag,num) {\n sort = ['','最新上市','最新上傳','本日排行','本週排行','本月排行','觀看次數','他們在看'];\n var e = eval(tag + '[' + num + ']');\n return e;\n}\nfunction Get(e) {\n const { java, source, cookie, cache } = this;\n var get = JSON.parse(source.getLoginHeader());\n return get[e];\n}\nfunction Map(e) {\n const { java, source, cookie, cache } = this;\n var infomap = source.getLoginInfoMap();\n var map = (infomap !== null && infomap.get(e)) ? infomap.get(e) : '';\n return String(map);\n}", "lastUpdateTime": 0, "loadWithBaseUrl": true, "loginCheckJs": "java.initUrl()", "loginUi": "[\n { name: \" ༺ˇ»`ʚ 点击切换排序 ɞ´«ˇ༻ \", type: \"button\" },\n { name: \" 默认排序 \", type: \"button\", action: \"o(0)\" },\n { name: \" 最新上市 \", type: \"button\", action: \"o(1)\" },\n { name: \" 最新上傳 \", type: \"button\", action: \"o(2)\" },\n { name: \" 本日排行 \", type: \"button\", action: \"o(3)\" },\n { name: \" 本週排行 \", type: \"button\", action: \"o(4)\" },\n { name: \" 本月排行 \", type: \"button\", action: \"o(5)\" },\n { name: \" 觀看次數 \", type: \"button\", action: \"o(6)\" },\n { name: \" 他們在看 \", type: \"button\", action: \"o(7)\" },\n { name: \" \", type: \"button\" },\n\n { name: \" ༺ˇ»`ʚ 筛选发布日期 ɞ´«ˇ༻ \", type: \"button\" },\n { name: \"年份:\", type: \"text\" },\n { name: \"月份:\", type: \"text\" },\n\n { name: \" ༺ˇ»`ʚ 填写收藏词条 ɞ´«ˇ༻ \", type: \"button\", action: \"login('【收藏词条】' + n(2) + '填写搜索关键词\\\\n多个关键词用英文逗号”,“隔开')\" },\n { name: \"收藏:\", type: \"text\" }\n]", "loginUrl": "original = {\n 'o': 0\n};\ntry {\n $$$ = JSON.parse(source.getLoginHeader());\n if ($$$ == null) {\n error;\n } else {\n '';\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\nfunction put(data) {\n return source.putLoginHeader(JSON.stringify(data, null, '\\t'));\n}\nfunction login(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}\nfunction n(e) {\n n = '\\n';\n for (m = 1; m < e; m++) {\n n = n + '\\n';\n }\n return n;\n}\nfunction k(e) {\n k = ' ';\n for (q = 1; q < e; q++) {\n k = k + ' ';\n }\n return k;\n}\nO = ['默认排序','最新上市','最新上傳','本日排行','本週排行','本月排行','觀看次數','他們在看'];\nfunction typeO(e) {\n if (e == undefined) {\n e = 0;\n }\n return O[e];\n}\nfunction o(e) {\n if (o == undefined) {\n o = result.o;\n }\n if (e == $$$.o) {\n return login('【排序切换提示】' + n(2) + '已经选择此排序,无需更换');\n }\n login('【排序切换提示】' + n(2) + '已经切换到[' + typeO(e) + ']排序');\n $$$.o = e;\n return put($$$);\n}", "ruleArticles": ".col-xs-12||.home-rows-videos-wrapper a", "ruleContent": "<js>\n\/\/获取集数\nvar list = java.getElements('#[email protected]');\nvar type = java.getElements('#video-artist-name').attr('href');\nlist = Array.from(list).reverse();\nvar n = '';\njishu = list.map(($, i)=>{\n var value = '',name = '',bt = '',rq = '',bf = '',dz = '',sc = '',bq = '',jj = '',fm = '';\n if (\/videos-scroll\/.test($)) {\n n = i;\n }\n if (\/裏番|泡麵番\/.test(type) || \/videos-scroll\/.test($)) {\n list0 = Array.from(java.getElements('.card-mobile-title')).reverse();\n url = $.select('.overlay').attr('href');\n name = \/預告\/.test(list0[i].text()) ? `第${i + 1}集⏳` : `第${i + 1}集`;\n J = org.jsoup.Jsoup.parse(java.ajax(url));\n bt = $.select('.card-mobile-title').text();\n rq = '📆 日期:' + String(J.select('.video-description-panel div')[0].text()).replace(\/.*\\s(.*?)$\/,'$1');\n bf = '🎥 播放:' + $.select('.card-mobile-duration')[1].text();\n dz = '❤ 点赞:' + String(J.select('#video-like-btn').text()).replace(\/thumb_up\/,'');\n sc = '👤 上传:' + $.select('.card-mobile-user').text();\n bq = '🔖 标签:' + String(J.select('.single-video-tag').text()).replace(\/ add| remove\/g,'');\n jj = '📋 简介:' + String(J.select('.video-description-panel div')[2].text()).replace(\/add|remove|\\s$\/g,'');\n fm = $.select('img')[1].attr('src');\n var Value = [];\n var size = '';\n var list1 = J.select('video source')[0] ? J.select('video source') : java.getElements('video source');\n if (!list1[0]) {\n res = String(java.getElements('script[type=\"application\/ld+json\"]'));\n url1 = res.match(\/contentUrl\":\\s*\"(.*?)\"\/)[1];\n Value.push({src:url1,size:'0'});\n } else {\n for (j in list1) {\n Value.push({src:list1[j].attr('src'),size:list1[j].attr('size')});\n }\n }\n Value.sort((a, b) => parseInt(b.size) - parseInt(a.size));\n value = JSON.stringify(Value);\n }\n return `<button onclick=\"jishu(this)\" value=${value} data-bt=\"${bt}\" data-rq=\"${rq}\" data-bf=\"${bf}\" data-dz=\"${dz}\" data-sc=\"${sc}\" data-bq=\"${bq}\" data-jj=\"${jj}\" data-fm=\"${fm}\"><b>${name}<\/b><\/button>`;\n}).join('\\n');\nstyle = \/裏番|泡麵番\/.test(type) ? '' : ' style=\"display:none;\"';\njishu = `<div class=\"jishu\" data-n=\"${n}\"${style}>\\n<p>🎬 集数:<\/p>\\n<p>${jishu}<\/p>\\n<\/div>\\n`;\n\n\/\/返回json\nJSON.stringify({\n jishu: jishu\n})\n<\/js>\n<!DOCTYPE html>\n<html lang=\"zh-Hans\">\n<head>\n<title><\/title>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no\">\n<link rel=\"stylesheet\" href=\"https:\/\/cdn.plyr.io\/3.6.12\/plyr.css\">\n<style>\n* {\n z-index: 0;\n margin: 0;\n padding: 0;\n}\n\nbody {\n margin: auto;\n background: #ccc;\n width: 100%;\n}\n\nbody>p:first-of-type {\n width: 100%;\n position: sticky;\n top: 0px;\n text-indent: 0px;\n height: 16px;\n font-size: 0.7rem;\n border-radius: 0px 0px 0px 0px;\n background: #000;\n color: #fff;\n white-space: nowrap;\n overflow: auto;\n z-index: 4;\n}\n\nvideo {\n visibility: hidden;\n}\n\n.video-container {\n position: relative;\n min-height: 56.25vw;\n z-index: 3;\n}\n\n#player {\n position: relative;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n:root {\n --plyr-color-main: #00aaff;\/* 播放器主要颜色 *\/\n --plyr-control-color: #fff;\/* 播放器控件图标颜色 *\/\n --plyr-control-background: transparent;\/* 播放器控件背景颜色 *\/\n --plyr-video-background: transparent;\/* 视频背景颜色 *\/\n --plyr-range-fill-background: #0099ee;\/* 进度条已填充部分的颜色 *\/\n --plyr-range-thumb-background: #fff;\/* 进度条滑块的颜色 *\/\n}\n\n.plyr__control--overlaid {\n background: transparent;\n border: 0;\n border-radius: 100%;\n color: #fff;\n left: calc(50% - 30px);\n top: calc(50% - 45px);\n transform: none;\n width: 60px;\n height: 60px;\n padding: 0;\n z-index: 2;\n}\n\n.plyr__control--overlaid svg {\n width: 50px;\n height: 50px;\n left: calc(50% - 25px);\n top: calc(50% - 25px);\n transform: none;\n fill: #fff;\/* 大播放器控件图标颜色 *\/\n}\n\n.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true] {\n background: transparent;\/* 播放器控件悬停\/点击背景颜色 *\/\n color: #00aaff;\/* 播放器控件悬停\/点击图标颜色 *\/\n}\n\n.plyr__controls .plyr__controls__item {\n margin-left: auto;\n margin: calc(var(--plyr-control-spacing,10px)\/4);\n}\n\n.plyr__time--duration {\n display: inline-block!important;\n}\n\n.plyr__time+.plyr__time:before {\n margin-right: 8px!important\n}\n\n@media (max-width: 640px) {\n .plyr__captions {\n margin-bottom:-8px\n }\n\n .plyr__progress__container {\n margin-right: 5px\n }\n\n .plyr__time {\n position: absolute;\n bottom: 29px;\n }\n\n .plyr__time--current {\n left: 108px\n }\n\n .plyr__time+.plyr__time:before {\n content: \"\"!important\n }\n\n .plyr__time--duration {\n right: 110px;\n }\n\n .plyr__volume {\n width: auto;\n max-width: 32px!important;\n min-width: 32px!important\n }\n\n input[id^=plyr-volume-] {\n display: none!important;\n }\n\n .plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--pip-supported [data-plyr=pip] {\n display: none!important;\n }\n}\n\n.all-info {\n position: absolute;\n background: #ccc;\/* 详情信息背景颜色 *\/\n margin: auto;\n width: 100%;\n height: auto;\n}\n\n.all-info>div {\n width: 100%;\n margin: auto;\n}\n\n.all-info>p {\n text-indent: 0px;\n}\n\n.all-info>div>p {\n width: 90%;\n margin: 5px 5%;\n outline: none;\n text-align: left;\n word-wrap: break-word;\n}\n\ndetails {\n width: 100%;\n height: auto;\n margin: auto;\n padding: 0;\n border-bottom: 0.5px solid #333;\n}\n\ndetails>img {\n width: 100%;\n}\n\ndetails[open] {\n border-bottom: none;\n}\n\nsummary {\n width: 90%;\n margin: 5px 3%;\n outline: none;\n line-height: 1.5;\n text-align: left;\n word-wrap: break-word;\n}\n\nsummary::-webkit-details-marker {\n display: none;\n}\n\nbutton {\n width: 29.5%;\n margin: 1.25%;\n padding: 5px;\n outline: none;\n border-radius: 8px;\n font-size: 0.7rem;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\nbutton.active {\n color: #166188;\n position: sticky;\n left: 0;\n right: 0;\n}\n<\/style>\n<\/head>\n<body>\n<p><\/p>\n<div class=\"video-container\">\n <video id=\"player\" playsinline controls preload=\"auto\" poster=\"https:\/\/qyyuapi.com\/img\/noposter.png\">\n <\/video>\n<\/div>\n<div class=\"all-info\">\n<details>\n <summary>\n <h3><\/h3>\n <\/summary>\n <img>\n<\/details>\n{{JSON.parse(result).jishu}}\n<div>\n <p><\/p>\n <p><\/p>\n <p><\/p>\n <p><\/p>\n <p><\/p>\n <p><\/p>\n<\/div>\n<\/div>\n\n\n<script src=\"https:\/\/cdn.plyr.io\/3.6.12\/plyr.js\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/hls.js@latest\"><\/script>\n\n<script>\n\/\/ 选中标签\nfunction $(rule) {\n return document.querySelectorAll(rule);\n}\n\n\/\/ 删除选中标签的class\nfunction omit(items) {\n return Array.from(items, (item) => {\n item.className = \"\";\n });\n}\n\n\/\/ 选中标签的class增加active\nfunction active(items, index) {\n items[index].className = \"active\";\n}\n\n\/\/ 播放器实例\nlet player = null;\n\n\/\/ 获取视频URL并更新视频源\nfunction geturl() {\n let zyurl = $(\".jishu button.active\")[0].value;\n let img = $('img')[0];\n let bt = $(\".jishu button.active\")[0].dataset.bt;\n let rq = $(\".jishu button.active\")[0].dataset.rq;\n let bf = $(\".jishu button.active\")[0].dataset.bf;\n let dz = $(\".jishu button.active\")[0].dataset.dz;\n let sc = $(\".jishu button.active\")[0].dataset.sc;\n let bq = $(\".jishu button.active\")[0].dataset.bq;\n let jj = $(\".jishu button.active\")[0].dataset.jj;\n let fm = $(\".jishu button.active\")[0].dataset.fm;\n\n \/\/ 更新页面信息\n $(\"title\")[0].innerText = bt;\n $(\".all-info>details>summary>h3\")[0].innerText = bt;\n $(\".all-info>div>p\")[2].innerText = rq;\n $(\".all-info>div>p\")[3].innerText = bf;\n $(\".all-info>div>p\")[4].innerText = dz;\n $(\".all-info>div>p\")[5].innerText = sc;\n $(\".all-info>div>p\")[6].innerText = bq;\n $(\".all-info>div>p\")[7].innerText = jj;\n $(\".all-info>div>p\")[2].style = \/:\\s*$\/.test(rq) ? \"display:none;\" : \"\";\n $(\".all-info>div>p\")[3].style = \/:\\s*$\/.test(bf) ? \"display:none;\" : \"\";\n $(\".all-info>div>p\")[4].style = \/:\\s*$\/.test(dz) ? \"display:none;\" : \"\";\n $(\".all-info>div>p\")[5].style = \/:\\s*$\/.test(sc) ? \"display:none;\" : \"\";\n $(\".all-info>div>p\")[6].style = \/:\\s*$\/.test(bq) ? \"display:none;\" : \"\";\n $(\".all-info>div>p\")[7].style = \/:\\s*$\/.test(jj) ? \"display:none;\" : \"\";\n\n \/\/ 更新详情封面\n img.src = fm;\n\n \/\/ 更新视频封面\n $(\".video-container\")[0].style.background = `#000 url('${fm}') no-repeat center center \/ cover`;\n\n \/\/ 设置不同分辨率的视频源\n let sources = JSON.parse(zyurl);\n\n return { sources: sources };\n}\n\n\/\/ 初始化播放器\nfunction initializePlayer(sources) {\n const video = $('video')[0];\n const qualityOptions = sources.map(source => parseInt(source.size));\n\n \/\/ 立即重新初始化 Plyr 实例\n player = new Plyr(video, {\n controls: [\n 'play-large', \/\/ 大播放按钮\n 'rewind', \/\/ 倒退\n 'play', \/\/ 播放\n 'fast-forward', \/\/ 快进\n 'progress', \/\/ 进度条\n 'current-time', \/\/ 当前时间\n 'duration', \/\/ 总时长\n 'mute', \/\/ 静音\n 'volume', \/\/ 音量\n 'captions', \/\/ 字幕\n 'settings', \/\/ 设置\n 'pip', \/\/ 画中画\n 'airplay', \/\/ Airplay\n 'fullscreen' \/\/ 全屏\n ],\n settings: ['quality', 'speed'],\n quality: {\n default: qualityOptions[0],\n options: qualityOptions,\n forced: true,\n onChange: (newQuality) => {\n changeVideoQuality(newQuality, sources);\n }\n },\n fullscreen: {\n enabled: true,\n fallback: true,\n iosNative: true,\n container: null,\n },\n speed: {\n selected: 1, \/\/ 设置默认播放倍数\n options: [0.25, 0.5, 1, 1.5, 2],\n },\n i18n: {\n restart: '重新开始',\n rewind: '倒退 {seektime} 秒',\n play: '播放',\n pause: '暂停',\n fastForward: '快进 {seektime} 秒',\n seek: '进度',\n seekLabel: '{currentTime} \/ {duration}',\n played: '播放',\n buffered: '缓冲',\n currentTime: '当前时间',\n duration: '持续时间',\n volume: '音量',\n mute: '静音',\n unmute: '取消静音',\n enableCaptions: '启用字幕',\n disableCaptions: '禁用字幕',\n enterFullscreen: '进入全屏',\n exitFullscreen: '退出全屏',\n frameTitle: '播放器',\n captions: '字幕',\n settings: '设置',\n speed: '速度',\n normal: '正常',\n quality: '画质',\n qualityLabel: {\n 0: '自动',\n },\n pip: '画中画',\n loop: '循环',\n start: '开始',\n end: '结束',\n all: '全部',\n reset: '重置',\n disabled: '禁用',\n advertisement: '广告'\n },\n keyboard: {\n focused: true,\n global: true,\n },\n tooltips: {\n controls: true,\n seek: true\n },\n captions: {\n active: true,\n update: true,\n language: 'auto',\n },\n });\n\n player.on('ready', () => {\n video.style.visibility = 'visible';\n\n \/\/ 添加长按倍速播放功能\n let longPressTimeout = null;\n let initialSpeed = 1;\n let isLongPress = false;\n const controls = document.querySelector('.plyr__controls');\n const overlaid = document.querySelector('.plyr__control--overlaid');\n\n const startLongPress = (e) => {\n e.stopPropagation();\n initialSpeed = player.speed;\n longPressTimeout = setTimeout(() => {\n setTimeout(() => {\n controls.style.display = 'none';\n overlaid.style.display = 'none';\n }, 1000);\n isLongPress = true;\n player.speed = 2; \/\/ 长按时设置2倍速播放\n }, 500);\n };\n\n const endLongPress = (e) => {\n e.stopPropagation();\n clearTimeout(longPressTimeout);\n if (isLongPress) {\n player.speed = initialSpeed;\n isLongPress = false;\n setTimeout(() => {\n controls.style.display = 'flex';\n overlaid.style.display = 'flex';\n }, 2000);\n }\n };\n\n \/\/ 监听播放器区域的pointerdown和pointerup事件\n const playerContainer = document.querySelector('.plyr__video-wrapper');\n\n playerContainer.addEventListener('pointerdown', startLongPress, true);\n playerContainer.addEventListener('pointerup', endLongPress, true);\n playerContainer.addEventListener('pointerleave', endLongPress, true);\n\n \/\/ 处理全屏模式下的特殊情况\n document.addEventListener('fullscreenchange', () => {\n if (!document.fullscreenElement) {\n endLongPress();\n }\n });\n });\n}\n\n\/\/ 切换视频质量的函数\nfunction changeVideoQuality(quality, sources) {\n const video = $('video')[0];\n const selectedSource = sources.find(source => source.size === quality.toString());\n const currentTime = video.currentTime;\n const wasPlaying = !video.paused;\n\n if (wasPlaying) {\n $(\".video-container\")[0].style.background = '#000';\n }\n $(\"body>p\")[0].innerText = selectedSource.src;\n\n if (selectedSource) {\n if (Hls.isSupported() && selectedSource.src.endsWith('.m3u8')) {\n const hls = new Hls();\n hls.loadSource(selectedSource.src);\n hls.attachMedia(video);\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n video.currentTime = currentTime;\n if (wasPlaying) {\n video.play();\n }\n });\n } else {\n video.pause();\n video.src = selectedSource.src;\n video.load();\n video.currentTime = currentTime;\n if (wasPlaying) {\n video.play();\n }\n }\n }\n}\n\n\/\/ 点击集数按钮时调用的函数\nfunction jishu(item) {\n if (player && typeof player.destroy === 'function') {\n player.destroy();\n player = null;\n }\n omit($('.jishu button.active'));\n item.className = \"active\";\n const { sources } = geturl();\n initializePlayer(sources);\n}\n\n\/\/ 页面加载时初始化播放器\n(() => {\n let n = $(\".jishu\")[0].dataset.n;\n active($('.jishu button'), n);\n const { sources } = geturl();\n initializePlayer(sources);\n})();\n<\/script>\n<\/body>\n<\/html>", "ruleDescription": "", "ruleImage": "img.1@src||img@src", "ruleLink": ".overlay@href||href", "ruleNextPage": "page", "rulePubDate": "⌚️ {{@@.card-mobile-duration.0@text}} 🎥 {{@@.card-mobile-duration.1@text}} 👤 {{@@.card-mobile-genre-wrapper@text}}##⌚️ 🎥 👤", "ruleTitle": ".card-mobile-title@text||.home-rows-videos-title@text", "singleUrl": false, "sortUrl": "@js:\neval(String(source.loginUrl));\nvar exploreUrl = [];\nvar Sort = `{{get('sort',Get('o'))}}`;\nvar Year = `{{Map('年份:')}}`;\nvar Month = `{{Map('月份:')}}`;\nfunction explore(e, f) {\n if (f=='收藏') {\n style = `${e}::\/search?query=${e}&type=&genre=全部&sort=${Sort}&year=${Year}&month=${Month}&page={{page}}\\n`;\n } else if (f=='排序') {\n style = `${e}::\/search?query=&type=&genre=全部&sort=${e}&year=${Year}&month=${Month}&page={{page}}\\n`;\n } else if (f=='分类') {\n style = `${e}::\/search?genre=${e}&sort=${Sort}&year=${Year}&month=${Month}&page={{page}}\\n`;\n } else {\/\/标签\n style = `${e}::\/search?query=&type=&genre=&sort=${Sort}&tags%5B%5D=${e}&year=${Year}&month=${Month}&page={{page}}\\n`;\n }\n return style;\n}\n\nsc = Map('收藏:');\nscs = sc !== '' ? sc.split(\",\") : [];\nif (scs.length > 0) {\n scs.forEach((sc) => {\n exploreUrl.push(explore(sc, '收藏'));\n });\n}\n\nsorts = ['最新上市','最新上傳','本日排行','本週排行','本月排行','觀看次數','他們在看'];\nfor (i in sorts) {\n exploreUrl.push(explore(sorts[i], '排序'));\n}\n\ngenres = ['裏番','泡麵番','Motion+Anime','3D動畫','同人作品','Cosplay'];\nfor (i in genres) {\n exploreUrl.push(explore(genres[i], '分类'));\n}\n\nJ = org.jsoup.Jsoup.parse(java.ajax(String(source.getKey()).replace(\/(.*\\\/\\\/[a-z0-9.-]+).*\/, '$1')+'\/search'));\ntags = J.select('.checkmark');\nfor (i in tags) {\n exploreUrl.push(explore(tags[i].text(), '标签'));\n}\n\n`变量搜索::\/search?query={{v=source.getVariable();if(\/^\\s*$\/.test(v)||v==null)source.setVariable('秘密');source.getVariable()}}&type=&genre=全部&sort=${Sort}&year=${Year}&month=${Month}&page={{page}}\\n\n${exploreUrl.join('\\n')}`", "sourceComment": "修改:1、优化页面样式;by:xiaohan231-2024\/08\/25\n\n修改:1、优化长按倍速播放功能;2、增加分辨率切换功能;by:xiaohan231-2024\/08\/24\n\n修改:1、优化播放器样式;2、选择播放倍速后,点击屏幕不再恢复成正常;3、添加长按2倍速播放功能,想要设置成其他的可以在内容规则根据注释修改;by:xiaohan231-2024\/08\/21\n\n修改:1、调用Plyr插件搭建网页播放器;2、设置播放器默认比例为16\/9,以防止加载时播放器高度变动;3、优化播放器样式;by:xiaohan231-2024\/08\/20\n\n修改:1、增加收藏关键词;2、视频不再采用第三方解析,改为调用原生播放器;3、添加视频封面;by:xiaohan231-2024\/08\/18\n\n修改:1、优化内容规则;by:xiaohan231-2024\/08\/17\n\n修改:1、修复cosplay视频链接获取bug;2、修复部分视频无法解析bug;3、优化视频链接获取,自动选择最高分辨率;4、增加排序方式切换和发布日期筛选;by:xiaohan231-2024\/08\/14\n\n修改:1、修复列表bug;2、修改分类地址获取;3、优化内容规则;by:xiaohan231-2024\/08\/11\n\nby:xiaohan231-2024\/08\/10", "sourceGroup": "🔭 其他,📽 视频", "sourceIcon": "https:\/\/krseoul.imgtbl.com\/i\/2024\/08\/17\/66bfb62154cb3.png", "sourceName": "Hanime1", "sourceUrl": "https:\/\/hanime1.me#xh", "style": "" }