└── JAVBUS封面大图.user.js /JAVBUS封面大图.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name JAVBUS larger thumbnails 3 | // @name:zh-CN JAVBUS封面大图 4 | // @namespace https://github.com/kygo233/tkjs 5 | // @homepage https://sleazyfork.org/zh-CN/scripts/409874-javbus-larger-thumbnails 6 | // @version 20250311 7 | // @author kygo233 8 | // @license MIT 9 | // @description replace thumbnails of javbus,javdb,javlibrary and avmoo with source images 10 | // @description:zh-CN javbus,javdb,javlibrary,avmoo替换封面为源图 11 | 12 | // @include *javbus.com/* 13 | // @include *javdb.com/* 14 | // @include *avmoo.cyou/* 15 | // @include *javlibrary.com/* 16 | // @include /^.*(javbus|busjav|busfan|fanbus|buscdn|cdnbus|dmmsee|seedmm|busdmm|dmmbus|javsee|seejav)\..*$/ 17 | // @include /^.*(javdb)[0-9]*\..*$/ 18 | // @include /^.*(avmoo)\..*$/ 19 | 20 | // @grant GM_addStyle 21 | // @grant GM_xmlhttpRequest 22 | // @grant GM_getValue 23 | // @grant GM_setValue 24 | // @grant GM_download 25 | // @grant GM_setClipboard 26 | // @connect * 27 | 28 | // 2025-03-11 修复视频截图的报错 29 | // 2025-02-15 调整部分大图的替换规则siro-5418 30 | // 2024-06-29 修复图片下载失败的问题;新增更新内容通知弹窗 31 | // 2022-09-18 修复视频截图报错 32 | // 2022-05-26 调整lazyload插件为本地加载 33 | // 2022-04-29 适配javdb的新页面; 查看视频截图: 增加blogjav的防攻击跳转提示 34 | // 2022-04-17 调整javdb的磁力元素选择器;查看视频截图:显示所有的结果 35 | // 2022-03-28 匹配dmmbus;修复标题不可点击的bug 36 | // 2022-03-18 修复欧美区磁力按钮打开重复的问题;javlibrary添加将左侧菜单上移的功能 37 | // 2022-03-03 调整设置按钮到左上角;删除javdb磁力列表里的广告 38 | // 2021-09-03 匹配javdb更多网址 例如javdb30 39 | // 2021-08-18 调整blogjav视频截图获取方法 40 | // 2021-06-03 修复javdb磁力弹窗预告片播放bug;番号变成可点击 41 | // 2021-06-01 修复多列布局下 图片样式失效的问题 42 | // 2021-05-31 JavDb添加磁力功能;解决已点击链接颜色失效问题;对大于标准宽高比的图片进行缩放; 43 | // 2021-05-06 适配javlibrary;添加标题全显样式控制;自动翻页开关无需刷新页面;删除高清图标的显示控制 44 | // 2021-04-04 适配JAVDB;点击图片弹出新窗口;标题默认显示一行;调整样式;增加英文显示 45 | // 2021-03-09 恢复高清字幕图标的显示 46 | // 2021-02-06 新增图片懒加载插件;重调样式;优化按钮效果,切换样式不刷新页面;磁力界面新增演员表样品图显示; 47 | // 2021-01-18 适配AVMOO网站;无码页面屏蔽竖图模式;调整域名匹配规则 48 | // 2021-01-01 新增宽度调整功能; 49 | // 2020-12-29 解决半图模式下 竖图显示不全的问题; 50 | // 2020-10-16 解决功能开关取默认值为undefined的bug 51 | // 2020-10-16 解决和"JAV老司机"同时运行时样式冲突问题,需关闭老司机的瀑布流 52 | // 2020-10-14 收藏界面只匹配影片;下载图片文件名添加标题;新增复制番号、标题功能;视频截图文件下载;封面显示半图;增加样式开关 53 | // 2020-09-20 收藏界面的适配 54 | // 2020-08-27 适配更多界面 55 | // 2020-08-26 修复查询结果为1个时,item宽度为100%的问题 56 | // 2020-08-26 添加瀑布流 57 | // 2020-08-24 第一版:封面大图、下载封面、查看视频截图 58 | // ==/UserScript== 59 | 60 | (function () { 61 | 'use strict'; 62 | // @require https://cdn.jsdelivr.net/npm/vanilla-lazyload@17.8.2/dist/lazyload.min.js 63 | !function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(n="undefined"!=typeof globalThis?globalThis:n||self).LazyLoad=t()}(this,(function(){"use strict";function n(){return n=Object.assign||function(n){for(var t=1;t1,r={elements_selector:".lazy",container:e||t?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_bg_set:"bg-set",data_poster:"poster",class_applied:"applied",class_loading:"loading",class_loaded:"loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1,restore_on_error:!1},c=function(t){return n({},r,t)},l=function(n,t){var e,i="LazyLoad::Initialized",o=new n(t);try{e=new CustomEvent(i,{detail:{instance:o}})}catch(n){(e=document.createEvent("CustomEvent")).initCustomEvent(i,!1,!1,{instance:o})}window.dispatchEvent(e)},u="src",s="srcset",d="sizes",f="poster",_="llOriginalAttrs",g="data",v="loading",b="loaded",m="applied",p="error",h="native",E="data-",I="ll-status",y=function(n,t){return n.getAttribute(E+t)},k=function(n){return y(n,I)},w=function(n,t){return function(n,t,e){var i="data-ll-status";null!==e?n.setAttribute(i,e):n.removeAttribute(i)}(n,0,t)},A=function(n){return w(n,null)},L=function(n){return null===k(n)},O=function(n){return k(n)===h},x=[v,b,m,p],C=function(n,t,e,i){n&&(void 0===i?void 0===e?n(t):n(t,e):n(t,e,i))},N=function(n,t){o?n.classList.add(t):n.className+=(n.className?" ":"")+t},M=function(n,t){o?n.classList.remove(t):n.className=n.className.replace(new RegExp("(^|\\s+)"+t+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")},z=function(n){return n.llTempImage},T=function(n,t){if(t){var e=t._observer;e&&e.unobserve(n)}},R=function(n,t){n&&(n.loadingCount+=t)},G=function(n,t){n&&(n.toLoadCount=t)},j=function(n){for(var t,e=[],i=0;t=n.children[i];i+=1)"SOURCE"===t.tagName&&e.push(t);return e},D=function(n,t){var e=n.parentNode;e&&"PICTURE"===e.tagName&&j(e).forEach(t)},H=function(n,t){j(n).forEach(t)},V=[u],F=[u,f],B=[u,s,d],J=[g],P=function(n){return!!n[_]},S=function(n){return n[_]},U=function(n){return delete n[_]},$=function(n,t){if(!P(n)){var e={};t.forEach((function(t){e[t]=n.getAttribute(t)})),n[_]=e}},q=function(n,t){if(P(n)){var e=S(n);t.forEach((function(t){!function(n,t,e){e?n.setAttribute(t,e):n.removeAttribute(t)}(n,t,e[t])}))}},K=function(n,t,e){N(n,t.class_applied),w(n,m),e&&(t.unobserve_completed&&T(n,t),C(t.callback_applied,n,e))},Q=function(n,t,e){N(n,t.class_loading),w(n,v),e&&(R(e,1),C(t.callback_loading,n,e))},W=function(n,t,e){e&&n.setAttribute(t,e)},X=function(n,t){W(n,d,y(n,t.data_sizes)),W(n,s,y(n,t.data_srcset)),W(n,u,y(n,t.data_src))},Y={IMG:function(n,t){D(n,(function(n){$(n,B),X(n,t)})),$(n,B),X(n,t)},IFRAME:function(n,t){$(n,V),W(n,u,y(n,t.data_src))},VIDEO:function(n,t){H(n,(function(n){$(n,V),W(n,u,y(n,t.data_src))})),$(n,F),W(n,f,y(n,t.data_poster)),W(n,u,y(n,t.data_src)),n.load()},OBJECT:function(n,t){$(n,J),W(n,g,y(n,t.data_src))}},Z=["IMG","IFRAME","VIDEO","OBJECT"],nn=function(n,t){!t||function(n){return n.loadingCount>0}(t)||function(n){return n.toLoadCount>0}(t)||C(n.callback_finish,t)},tn=function(n,t,e){n.addEventListener(t,e),n.llEvLisnrs[t]=e},en=function(n,t,e){n.removeEventListener(t,e)},on=function(n){return!!n.llEvLisnrs},an=function(n){if(on(n)){var t=n.llEvLisnrs;for(var e in t){var i=t[e];en(n,e,i)}delete n.llEvLisnrs}},rn=function(n,t,e){!function(n){delete n.llTempImage}(n),R(e,-1),function(n){n&&(n.toLoadCount-=1)}(e),M(n,t.class_loading),t.unobserve_completed&&T(n,e)},cn=function(n,t,e){var i=z(n)||n;on(i)||function(n,t,e){on(n)||(n.llEvLisnrs={});var i="VIDEO"===n.tagName?"loadeddata":"load";tn(n,i,t),tn(n,"error",e)}(i,(function(o){!function(n,t,e,i){var o=O(t);rn(t,e,i),N(t,e.class_loaded),w(t,b),C(e.callback_loaded,t,i),o||nn(e,i)}(0,n,t,e),an(i)}),(function(o){!function(n,t,e,i){var o=O(t);rn(t,e,i),N(t,e.class_error),w(t,p),C(e.callback_error,t,i),e.restore_on_error&&q(t,B),o||nn(e,i)}(0,n,t,e),an(i)}))},ln=function(n,t,e){!function(n){return Z.indexOf(n.tagName)>-1}(n)?function(n,t,e){!function(n){n.llTempImage=document.createElement("IMG")}(n),cn(n,t,e),function(n){P(n)||(n[_]={backgroundImage:n.style.backgroundImage})}(n),function(n,t,e){var i=y(n,t.data_bg),o=y(n,t.data_bg_hidpi),r=a&&o?o:i;r&&(n.style.backgroundImage='url("'.concat(r,'")'),z(n).setAttribute(u,r),Q(n,t,e))}(n,t,e),function(n,t,e){var i=y(n,t.data_bg_multi),o=y(n,t.data_bg_multi_hidpi),r=a&&o?o:i;r&&(n.style.backgroundImage=r,K(n,t,e))}(n,t,e),function(n,t,e){var i=y(n,t.data_bg_set);if(i){var o=i.split("|"),a=o.map((function(n){return"image-set(".concat(n,")")}));n.style.backgroundImage=a.join(),""===n.style.backgroundImage&&(a=o.map((function(n){return"-webkit-image-set(".concat(n,")")})),n.style.backgroundImage=a.join()),K(n,t,e)}}(n,t,e)}(n,t,e):function(n,t,e){cn(n,t,e),function(n,t,e){var i=Y[n.tagName];i&&(i(n,t),Q(n,t,e))}(n,t,e)}(n,t,e)},un=function(n){n.removeAttribute(u),n.removeAttribute(s),n.removeAttribute(d)},sn=function(n){D(n,(function(n){q(n,B)})),q(n,B)},dn={IMG:sn,IFRAME:function(n){q(n,V)},VIDEO:function(n){H(n,(function(n){q(n,V)})),q(n,F),n.load()},OBJECT:function(n){q(n,J)}},fn=function(n,t){(function(n){var t=dn[n.tagName];t?t(n):function(n){if(P(n)){var t=S(n);n.style.backgroundImage=t.backgroundImage}}(n)})(n),function(n,t){L(n)||O(n)||(M(n,t.class_entered),M(n,t.class_exited),M(n,t.class_applied),M(n,t.class_loading),M(n,t.class_loaded),M(n,t.class_error))}(n,t),A(n),U(n)},_n=["IMG","IFRAME","VIDEO"],gn=function(n){return n.use_native&&"loading"in HTMLImageElement.prototype},vn=function(n,t,e){n.forEach((function(n){return function(n){return n.isIntersecting||n.intersectionRatio>0}(n)?function(n,t,e,i){var o=function(n){return x.indexOf(k(n))>=0}(n);w(n,"entered"),N(n,e.class_entered),M(n,e.class_exited),function(n,t,e){t.unobserve_entered&&T(n,e)}(n,e,i),C(e.callback_enter,n,t,i),o||ln(n,e,i)}(n.target,n,t,e):function(n,t,e,i){L(n)||(N(n,e.class_exited),function(n,t,e,i){e.cancel_on_exit&&function(n){return k(n)===v}(n)&&"IMG"===n.tagName&&(an(n),function(n){D(n,(function(n){un(n)})),un(n)}(n),sn(n),M(n,e.class_loading),R(i,-1),A(n),C(e.callback_cancel,n,t,i))}(n,t,e,i),C(e.callback_exit,n,t,i))}(n.target,n,t,e)}))},bn=function(n){return Array.prototype.slice.call(n)},mn=function(n){return n.container.querySelectorAll(n.elements_selector)},pn=function(n){return function(n){return k(n)===p}(n)},hn=function(n,t){return function(n){return bn(n).filter(L)}(n||mn(t))},En=function(n,e){var o=c(n);this._settings=o,this.loadingCount=0,function(n,t){i&&!gn(n)&&(t._observer=new IntersectionObserver((function(e){vn(e,n,t)}),function(n){return{root:n.container===document?null:n.container,rootMargin:n.thresholds||n.threshold+"px"}}(n)))}(o,this),function(n,e){t&&(e._onlineHandler=function(){!function(n,t){var e;(e=mn(n),bn(e).filter(pn)).forEach((function(t){M(t,n.class_error),A(t)})),t.update()}(n,e)},window.addEventListener("online",e._onlineHandler))}(o,this),this.update(e)};return En.prototype={update:function(n){var t,o,a=this._settings,r=hn(n,a);G(this,r.length),!e&&i?gn(a)?function(n,t,e){n.forEach((function(n){-1!==_n.indexOf(n.tagName)&&function(n,t,e){n.setAttribute("loading","lazy"),cn(n,t,e),function(n,t){var e=Y[n.tagName];e&&e(n,t)}(n,t),w(n,h)}(n,t,e)})),G(e,0)}(r,a,this):(o=r,function(n){n.disconnect()}(t=this._observer),function(n,t){t.forEach((function(t){n.observe(t)}))}(t,o)):this.loadAll(r)},destroy:function(){this._observer&&this._observer.disconnect(),t&&window.removeEventListener("online",this._onlineHandler),mn(this._settings).forEach((function(n){U(n)})),delete this._observer,delete this._settings,delete this._onlineHandler,delete this.loadingCount,delete this.toLoadCount},loadAll:function(n){var t=this,e=this._settings;hn(n,e).forEach((function(n){T(n,t),ln(n,e,t)}))},restoreAll:function(){var n=this._settings;mn(n).forEach((function(t){fn(t,n)}))}},En.load=function(n,t){var e=c(t);ln(n,e)},En.resetStatus=function(n){A(n)},t&&function(n,t){if(t)if(t.length)for(var e,i=0;e=t[i];i+=1)l(n,e);else l(n,t)}(En,window.lazyLoadOptions),En})); 64 | 65 | let statusDefault = { 66 | autoPage: false, 67 | copyBtn :true, 68 | toolBar: true, 69 | avInfo:true, 70 | halfImg:false, 71 | fullTitle:false, 72 | waterfallWidth:100, 73 | columnNumFull:3, 74 | columnNumHalf:4, 75 | menutoTop : false 76 | }; 77 | const VERSION = "20250311"; 78 | const NOTICE = "2025-03-11 修复视频截图的报错"; 79 | const SCREENSHOT_SUFFIX = "-screenshot-tag"; 80 | const AVINFO_SUFFIX = "-avInfo-tag"; 81 | const blogjavSelector= "h2.entry-title>a"; 82 | const fullImgCSS=`width: 100%!important;height:100%!important;`; 83 | const halfImgCSS=`position: relative;left: -112%;width: 212% !important;height: 100% !important;max-width: 212%;`; 84 | 85 | const copy_Svg = ``; 86 | const download_Svg = ``; 87 | const picture_Svg = ``; 88 | const magnet_Svg = ``; 89 | 90 | const LOCALE = { 91 | zh: { 92 | menuText :'设置', 93 | menu_autoPage: '自动下一页', 94 | menu_copyBtn :'复制图标', 95 | menu_toolBar: '功能图标', 96 | menu_avInfo:'弹窗中的演员和样品图', 97 | menu_halfImg:'竖图模式', 98 | menu_fullTitle:'标题全显', 99 | menu_columnNum:'列', 100 | menu_menutoTop:'左侧菜单移至上方', 101 | copyButton:'复制', 102 | copySuccess:'复制成功', 103 | getAvImg_norespond:'blogjav.net网站暂时无法响应', 104 | getAvImg_none:'未搜索到', 105 | tool_magnetTip:'磁力', 106 | tool_downloadTip:'下载封面', 107 | tool_pictureTip:'视频截图(blogjav.net)需代理', 108 | scrollerPlugin_end:'完' 109 | }, 110 | en: { 111 | menuText :'Settings', 112 | menu_autoPage:'auto Next Page', 113 | menu_copyBtn:'copy icon', 114 | menu_toolBar:'tools icon', 115 | menu_avInfo:'actors and sample images in pop-ups', 116 | menu_halfImg:'Vertical image mode', 117 | menu_fullTitle:'Full Title', 118 | menu_columnNum:'columns', 119 | menu_menutoTop:'Move the left menu to the top', 120 | copyButton:'Copy', 121 | copySuccess:'Copy successful', 122 | getAvImg_norespond:'blogjav.net is temporarily unable to respond', 123 | getAvImg_none:'Not found', 124 | tool_magnetTip:'Magnet', 125 | tool_downloadTip:'Download cover', 126 | tool_pictureTip:'Video screenshot from blogjav.net', 127 | scrollerPlugin_end:'End' 128 | } 129 | } 130 | let getlanguage = () => { 131 | let local= navigator.language; 132 | local = local.toLowerCase().replace('_', '-'); 133 | if (local in LOCALE){ 134 | return LOCALE[local]; 135 | }else if (local.split('-')[0] in LOCALE){ 136 | return LOCALE[local.split('-')[0]]; 137 | }else { 138 | return LOCALE.en; 139 | } 140 | } 141 | let lang = getlanguage(); 142 | 143 | // 弹出提示框 144 | let showAlert = (msg,close) => { 145 | let $alert=$(`
${msg}
`); 146 | if(close){ 147 | let $close = $(`
X
`); 148 | $alert.append($close); 149 | $close.on("click",()=>$alert.hide()); 150 | } 151 | $('body').append($alert); 152 | $alert.show({start:function(){ 153 | $(this).css({'margin-top': -$(this).height() / 2 ,'margin-left': -$(this).width() / 2 }); 154 | }}); 155 | if(!close){$alert.delay(3000).fadeOut()}; 156 | } 157 | 158 | //图片加载时的回调函数 159 | let imgCallback = (img)=> { 160 | if (Status.isHalfImg()) { 161 | if(img.height < img.width){ 162 | img.style= halfImgCSS ; 163 | }else{ 164 | img.style= fullImgCSS ; 165 | } 166 | }else{ 167 | //大图模式下,对大于标准比例(以ipx的封面为准)的图片进行缩小 168 | if(img.height/img.width>=0.7){ 169 | img.style= `width:${img.width*67.25/img.height}%;` ; 170 | }else{ 171 | img.style= fullImgCSS ; 172 | } 173 | } 174 | } 175 | 176 | let Status = { 177 | halfImg_block:false,//是否屏蔽竖图模式,默认为否 178 | set : function(key,value){ 179 | if(key=="columnNum") { 180 | key=key+(this.isHalfImg()?"Half":"Full"); 181 | }else if(key=="waterfallWidth"){ 182 | key=key+"_"+currentWeb;//宽度为各网站独立属性 183 | } 184 | return GM_setValue(key, value); 185 | }, 186 | get : function(key){ 187 | return GM_getValue(key=="waterfallWidth"?(key+"_"+currentWeb):key, statusDefault[key]); 188 | }, 189 | //是否为竖图模式 190 | isHalfImg: function () { 191 | return this.get("halfImg") && (!this.halfImg_block); 192 | }, 193 | //获取列数 194 | getColumnNum: function () { 195 | var key= 'columnNum'+(this.isHalfImg()?"Half":"Full"); 196 | return this.get(key); 197 | } 198 | }; 199 | //弹窗类,用于展示演员,样品图和磁力 200 | class Popover{ 201 | show(){ 202 | document.documentElement.classList.add("scrollBarHide"); 203 | this.element.show({duration:0,start:function(){ 204 | var t=$(this).find('#modal-div'); 205 | t.css({'margin-top': Math.max(0, ($(window).height() - t.height()) / 2) }); 206 | }}); 207 | } 208 | hide(){ 209 | document.documentElement.classList.remove("scrollBarHide"); 210 | this.element.hide(); 211 | this.element.find('.pop-up-tag').hide(); 212 | } 213 | init(){ 214 | var me=this; 215 | me.element = $('
'); 216 | me.element.on('click',function(e){ 217 | if($(e.target).closest("#modal-div").length==0){ 218 | me.hide(); 219 | } 220 | }); 221 | me.scrollBarWidth = me.getScrollBarWidth(); 222 | GM_addStyle('.scrollBarHide{ padding-right: ' + me.scrollBarWidth + 'px;overflow:hidden;}'); 223 | $('body').append(me.element); 224 | //加载javbus的图片浏览插件 225 | if(currentWeb=="javbus"){ 226 | me.element.magnificPopup({ 227 | delegate: 'a.sample-box-zdy:visible', 228 | type: 'image', 229 | closeOnContentClick: false, 230 | closeBtnInside: false, 231 | mainClass: 'mfp-with-zoom mfp-img-mobile', 232 | image: {verticalFit: true}, 233 | gallery: { enabled: true}, 234 | zoom: {enabled: true,duration: 300,opener: function (element) {return element.find('img');}} 235 | }); 236 | } 237 | } 238 | append(elem){ 239 | if(!this.element){ this.init();} 240 | this.element.find("#modal-div").append(elem); 241 | return this; 242 | } 243 | //获取滚动条的宽度 244 | getScrollBarWidth() { 245 | var el = document.createElement("p"); 246 | var styles = {width: "100px",height: "100px",overflowY: "scroll" }; 247 | for (var i in styles) { 248 | el.style[i] = styles[i]; 249 | } 250 | document.body.appendChild(el); 251 | var scrollBarWidth = el.offsetWidth - el.clientWidth; 252 | el.remove(); 253 | return scrollBarWidth; 254 | } 255 | } 256 | class SettingMenu { 257 | onChange = { 258 | autoPage: function() { 259 | if (scroller) { 260 | scroller.destroy();scroller = null; 261 | } else { 262 | scroller = new ScrollerPlugin($('#grid-b'), lazyLoad); 263 | } 264 | }, 265 | copyBtn: function() { 266 | $("#grid-b .copy-span").toggle(); 267 | }, 268 | toolBar: function() { 269 | $("#grid-b .toolbar-b").toggle(); 270 | }, 271 | halfImg: function() { 272 | let me = this; 273 | $("#grid-b .box-b img.loaded").each(function(index, el) { 274 | imgCallback(el); 275 | }); 276 | var columnNum = Status.getColumnNum(); 277 | GM_addStyle(`#grid-b .item-b{ width: ${100/columnNum}%;}`); 278 | $("#columnNum_range").val(columnNum); 279 | $("#columnNum_range+span").text(columnNum); 280 | }, 281 | fullTitle: function() { 282 | $("#grid-b a[name='av-title']").toggleClass("titleNowrap"); 283 | }, 284 | avInfo: function() {}, 285 | menutoTop : function() {location.reload();}, 286 | columnNum: function(columnNum) { 287 | GM_addStyle(`#grid-b .item-b{ width: ${100/columnNum}%;}`); 288 | }, 289 | waterfallWidth: function(width) { 290 | $(currentObj.widthSelector).css({"width":`${width}%`,"margin": `0 ${width>100?(100-width)/2+"%":"auto"}`}); 291 | } 292 | } 293 | constructor() { 294 | let columnNum = Status.getColumnNum(); 295 | let $menu = $(''); 296 | $menu.append(this.creatCheckbox("autoPage", lang.menu_autoPage)); 297 | $menu.append(this.creatCheckbox("copyBtn", lang.menu_copyBtn)); 298 | $menu.append(this.creatCheckbox("toolBar", lang.menu_toolBar)); 299 | $menu.append(this.creatCheckbox("halfImg", lang.menu_halfImg, Status.halfImg_block)); 300 | $menu.append(this.creatCheckbox("fullTitle", lang.menu_fullTitle)); 301 | if (["javbus", "javdb"].includes(currentWeb)) { 302 | $menu.append(this.creatCheckbox("avInfo", lang.menu_avInfo)); 303 | } 304 | if (currentWeb == 'javlibrary') { 305 | $menu.append(this.creatCheckbox("menutoTop", lang.menu_menutoTop)); 306 | } 307 | $menu.append(this.creatRange("columnNum", lang.menu_columnNum, columnNum, 8)); 308 | $menu.append(this.creatRange("waterfallWidth", '%', Status.get("waterfallWidth") , currentObj.maxWidth ? currentObj.maxWidth : 100)); 309 | let $circle = $(`
`); 310 | $circle.append($menu); 311 | $circle.mouseenter(() => $menu.show()).mouseleave(() => $menu.hide()); 312 | $("body").append($circle); 313 | notice($menu); 314 | } 315 | creatCheckbox(tagName, name, disabled) { 316 | let me =this; 317 | let $checkbox = $(`
`); 318 | $checkbox.find("input")[0].checked = Status.get(tagName); 319 | $checkbox.find("input").eq(0).click(function() { 320 | Status.set(tagName, this.checked); 321 | me.onChange[tagName](); 322 | }); 323 | return $checkbox; 324 | } 325 | creatRange(tagName, name, value, max) { 326 | let me =this; 327 | let $range = $(`
${value}${name}
`); 328 | $range.bind('input propertychange', function() { 329 | var val = $(this).find("input").eq(0).val(); 330 | $(this).find("span[name=value]").html(val); 331 | Status.set(tagName, val); 332 | me.onChange[tagName](val); 333 | }); 334 | return $range; 335 | } 336 | } 337 | const notice = ($menu)=>{ 338 | let version = Status.get("version"); 339 | if(version != VERSION){ 340 | if(!version){ 341 | $menu.slideDown(); 342 | } 343 | showAlert(NOTICE,true); 344 | Status.set("version",VERSION); 345 | } 346 | } 347 | function showMagnetTable(itemID,avid,href,elem) { 348 | if ($(elem).hasClass("span-loading")) {return;} 349 | let tagName = `${itemID}${AVINFO_SUFFIX}`; 350 | let $el=$(`.pop-up-tag[name='${tagName}']`); 351 | if ($el.length > 0) { 352 | $el.show();myModal.show(); 353 | } else { 354 | $(elem).addClass("span-loading"); 355 | Promise.resolve().then(()=>{ 356 | switch(currentWeb) { 357 | case "javbus": { 358 | return getMagnet4JavBus(href,tagName) 359 | } 360 | case "javdb": { 361 | return getMagnet4JavDB(href,tagName,itemID) 362 | } 363 | } 364 | }).then((dom)=>{ 365 | myModal.append(dom).show(); 366 | }).catch(err=>alert(err)).then(()=>$(elem).removeClass("span-loading")); 367 | } 368 | } 369 | //获取javdb的演员磁力信息 370 | async function getMagnet4JavDB(href,tagName,itemID) { 371 | let doc = await fetch(href).then(response => response.text()); 372 | let $doc=$($.parseHTML(doc)); 373 | let info = $(`
`); 374 | if(Status.get("avInfo")){ 375 | let actors= $doc.find("div.video-meta-panel .panel-block").toArray().find(el=> $(el).find("a[href^='/actors/']").length>0); 376 | $(actors).find("a").attr("target","_blank"); 377 | let preview_images= $doc.find(".columns").toArray().find(el=> $(el).find("div.tile-images.preview-images").length>0); 378 | let $preview_images = $(preview_images); 379 | $preview_images.find(".preview-video-container").attr("href",`#preview-video-${itemID}`); 380 | $preview_images.find("#preview-video").attr("id",`preview-video-${itemID}`); 381 | $preview_images.find("img[data-src]").each((i,el)=> $(el).attr("src",$(el).attr("data-src"))); 382 | info.append(actors);info.append(preview_images); 383 | } 384 | let magnetTable = $doc.find(`div.columns[data-controller="movie-tab"]`); 385 | magnetTable.find("div.top-meta").remove();// 移除广告 386 | info.append(magnetTable); 387 | return info; 388 | }; 389 | // javbus:获取演员磁力信息 390 | async function getMagnet4JavBus(href, tagName) { 391 | let {gid,dom} = await avInfofetch(href,tagName); 392 | //有码和欧美 0 无码 1 393 | let uc_code = location.pathname.search(/(uncensored|mod=uc)/) < 1 ? 0 : 1; 394 | let url = `${location.protocol}//${location.hostname}/ajax/uncledatoolsbyajax.php?gid=${gid}&lang=zh&img=&uc=${uc_code}&floor=` + Math.floor(Math.random() * 1e3 + 1); 395 | let doc = await fetch(url).then(response => response.text()); 396 | let table_html = doc.substring(0, doc.indexOf('`); 398 | table_tag.append($(table_html)); 399 | table_tag.find("tr").each(function (i) { // 遍历 tr 400 | let $a = $(this).find('a'); 401 | if ($a.length) { 402 | let magent_url = $a[0].href; 403 | $(this).prepend(creatCopybutton(magent_url)); 404 | } 405 | }); 406 | dom.push(table_tag); 407 | return dom; 408 | }; 409 | //javbus:磁力链接添加复制按钮 410 | function creatCopybutton(text) { 411 | let $copyButton = $(``); 412 | $copyButton.find("button").click(function () { 413 | GM_setClipboard(text); 414 | showAlert(lang.copySuccess); 415 | }); 416 | return $copyButton; 417 | } 418 | //javbus:获取详情页面的 演员表和样品图元素 419 | async function avInfofetch(href,tagName) { 420 | let doc = await fetch(href).then(response => response.text()) 421 | let str = /var\s+gid\s+=\s+(\d{1,})/.exec(doc); 422 | let avInfo = {gid:str[1],dom:[]}; 423 | if(Status.get("avInfo")){ 424 | let sample_waterfall = $($.parseHTML(doc)).find("#sample-waterfall"); 425 | let avatar_waterfall = $($.parseHTML(doc)).find("#avatar-waterfall"); 426 | if(avatar_waterfall.length>0){ 427 | avatar_waterfall[0].id = ""; 428 | avatar_waterfall.addClass("pop-up-tag"); 429 | avatar_waterfall.attr("name",tagName); 430 | avatar_waterfall.find("a.avatar-box span").each((i,el)=> { 431 | let $copySvg = $(`
${copy_Svg}
`); 432 | $copySvg.click(function () { 433 | GM_setClipboard($(el).text()); 434 | showAlert(lang.copySuccess); 435 | return false; 436 | }); 437 | $(el).prepend($copySvg); 438 | }); 439 | avatar_waterfall.find("a.avatar-box").attr("target","_blank").removeClass("avatar-box").addClass("avatar-box-zdy"); 440 | avInfo.dom.push(avatar_waterfall); 441 | } 442 | if(sample_waterfall.length>0){ 443 | sample_waterfall[0].id = ""; 444 | sample_waterfall.addClass("pop-up-tag"); 445 | sample_waterfall.attr("name",tagName); 446 | sample_waterfall.find(".sample-box").removeClass("sample-box").addClass("sample-box-zdy"); 447 | avInfo.dom.push(sample_waterfall); 448 | } 449 | } 450 | return avInfo; 451 | }; 452 | 453 | //弹出视频截图 454 | function showBigImg(itemID,avid,elem) { 455 | if ($(elem).hasClass("span-loading")) {return;} 456 | let tagName = `${itemID}${SCREENSHOT_SUFFIX}`; 457 | let $selector = $(`.pop-up-tag[name='${tagName}']`); 458 | if ($selector.length > 0) { 459 | $selector.show(); 460 | myModal.show(); 461 | } else { 462 | $(elem).addClass("span-loading"); 463 | getAvImg(avid,tagName).then(($img)=>{ 464 | myModal.append($img).show(); 465 | }).catch(err=>err && showAlert(err)).then(()=>{ 466 | $(elem).removeClass("span-loading"); 467 | }); 468 | } 469 | } 470 | const getRequest = (url) => { 471 | return new Promise((resolve, reject)=>{ 472 | GM_xmlhttpRequest({ 473 | method: "GET", 474 | url: url, 475 | timeout: 20000, 476 | onload: (r)=>resolve(r), 477 | onerror : (r)=> reject(`error`), 478 | ontimeout : (r)=> reject(`timeout`) 479 | }); 480 | }) 481 | } 482 | const downloadImg = (url,name,elem) => { 483 | if ($(elem).hasClass("span-loading")) return; 484 | $(elem).addClass("span-loading"); 485 | new Promise((resolve, reject)=>{ 486 | GM_download({ 487 | url: url, 488 | name :name, 489 | headers : {Referer : url}, 490 | onload: (r)=>resolve(r), 491 | onerror : (error,detail)=> reject(`error 错误`), 492 | ontimeout : (r)=> reject(`timeout 超时`) 493 | })}) 494 | .catch(err=>showAlert(err)) 495 | .then(()=>$(elem).removeClass("span-loading")); 496 | } 497 | /**根据番号获取blogjav的视频截图,使用fetch会产生跨域问题*/ 498 | async function getAvImg(avid,tagName) { 499 | const r = await getRequest(`https://blogjav.net/?s=${avid}`); 500 | if(r.status == 503){ 501 | showAlert(`blogjav.net有防攻击机制, 点击跳转解除 `,`close`); 502 | return Promise.reject(); 503 | }else if(r.status != 200){ 504 | return Promise.reject(lang.getAvImg_norespond); 505 | } 506 | let resultList = $($.parseHTML(r.responseText)).find(blogjavSelector).toArray().map((v)=> {return {title:v.innerHTML,href:v.href} }); 507 | if(resultList.length==0) { 508 | return Promise.reject(lang.getAvImg_none); 509 | } 510 | let indexTo = -1; 511 | for (let i = 0; i < resultList.length; i++) { 512 | const r = resultList[i]; 513 | let src = await ScreenshotPanel.getScreenshotUrl(r.href); 514 | if(src) { 515 | r.src = src; 516 | indexTo = i; 517 | break; 518 | } 519 | } 520 | if(indexTo == -1) { 521 | return Promise.reject(lang.getAvImg_none); 522 | } 523 | let $img = new ScreenshotPanel(tagName,resultList.slice(indexTo),avid); 524 | return $img; 525 | }; 526 | class ScreenshotPanel{ 527 | constructor(tagName,resultList,avid){ 528 | let me =this; 529 | let liHtml = resultList.map((v,i) => { 530 | if(i==0){ 531 | return `
  • ${v.title}
  • ` 532 | } else { 533 | return `
  • ${v.title}
  • ` 534 | } 535 | }).join(''); 536 | let imgsHtml = resultList.map((v,i)=> { 537 | if(i==0){ 538 | return `` 539 | } else { 540 | return `` 541 | } 542 | }).join(''); 543 | let $panel = $(`
    544 |
      ${liHtml}
    545 | ${download_Svg} 546 | ${imgsHtml}
    `); 547 | $panel.find("li.imgResult-li").click(async function(){ 548 | if ($(this).hasClass("imgResult-loading")) {return;} 549 | let index_to = $(this).attr('index'); 550 | let index_from = $panel.find("img:visible").attr(`index`); 551 | if( index_to != index_from){ 552 | $panel.find("li.imgResult-li.imgResult-Current").removeClass('imgResult-Current'); 553 | $(this).addClass(`imgResult-loading`).addClass("imgResult-Current"); 554 | $panel.find("img").hide(); 555 | let $img_to = $panel.find(`img[index=${index_to}]`); 556 | $img_to.show(); 557 | try { 558 | let data = resultList[index_to]; 559 | if(!data.src){ 560 | if(data.src === undefined){ 561 | let src = await me.constructor.getScreenshotUrl(data.href); 562 | data.src = src; 563 | if(src === null){ 564 | throw lang.getAvImg_none; 565 | } 566 | $img_to.attr(`src`,src); 567 | }else if(data.src === null){ 568 | throw lang.getAvImg_none; 569 | } 570 | } 571 | 572 | } catch (error) { 573 | showAlert(error) 574 | }finally{ 575 | $(this).removeClass(`imgResult-loading`); 576 | } 577 | } 578 | }) 579 | $panel.find("span.download-icon").click(function(){ 580 | let url = $panel.find("img:visible").attr(`src`); 581 | let name = `${avid || "screenshot"}.jpg`; 582 | downloadImg(url,name,this); 583 | }); 584 | return $panel; 585 | } 586 | static async getScreenshotUrl(imgUrl){ 587 | const result = await getRequest(imgUrl); 588 | const $img = $($.parseHTML(result.responseText)).find(`#primary .entry-content>p img[src*="pixhost.to/thumbs"]`); 589 | if ($img.length == 0) { 590 | return null; 591 | }else{ 592 | let src = $img[0].src.replace('thumbs', 'images').replace('//t', '//img'); 593 | console.log(src); 594 | return src; 595 | } 596 | } 597 | } 598 | 599 | let lazyLoad; 600 | let scroller; 601 | let myModal;//弹窗插件实例 602 | let currentWeb = "javbus";//网站域名标识,用于判断当前在什么网站 603 | let currentObj ;//当前网站对应的属性对象 604 | /** 605 | * 通用属性对象 606 | * domainReg: 域名正则式 用于判断当前在什么网站 607 | * excludePages: 排除的页面 608 | * halfImg_block_Pages 屏蔽竖图的页面 609 | * gridSelector 源网页的网格选择器 610 | * itemSelector 源网页的子元素选择器 611 | * widthSelector 源网页的宽度设置元素选择器 612 | * pageNext 源网页的下一页元素选择器 613 | * pageSelector 源网页的翻页元素选择器 614 | * getAvItem 解析源网页item的数据 615 | * init_Style 加载各网页的特殊css 616 | */ 617 | let ConstCode = { 618 | javbus: { 619 | domainReg: /(javbus|busjav|busfan|fanbus|buscdn|cdnbus|dmmsee|seedmm|busdmm|dmmbus|javsee|seejav)\./i, 620 | excludePages: ['/actresses', 'mdl=favor&sort=1', 'mdl=favor&sort=2', 'mdl=favor&sort=3', 'mdl=favor&sort=4', 'searchstar'], 621 | halfImg_block_Pages:['/uncensored','javbus.one','mod=uc','javbus.red'], 622 | gridSelector: 'div#waterfall', 623 | itemSelector: 'div#waterfall div.item', 624 | widthSelector : '#grid-b', 625 | pageNext:'a#next', 626 | pageSelector:'.pagination', 627 | getAvItem: function (elem) { 628 | var photoDiv = elem.find("div.photo-frame")[0]; 629 | var href = elem.find("a")[0].href; 630 | var img = $(photoDiv).children("img")[0]; 631 | var src = img.src; 632 | if (src.match(/pics.dmm.co.jp/)) { 633 | src = src.replace(/ps.jpg/, "pl.jpg"); 634 | }else if(src.match(/image.mgstage.com/)){ 635 | src = src.replace(/pf_o1_|pb_p_/, "pb_e_"); 636 | } else { 637 | src = src.replace(/thumbs/, "cover").replace(/thumb/, "cover").replace(/.jpg/, "_b.jpg"); 638 | } 639 | var title = img.title; 640 | var AVID = elem.find("date").eq(0).text(); 641 | var date = elem.find("date").eq(1).text(); 642 | var itemTag = "";elem.find("div.photo-info .btn").toArray().forEach( x=> itemTag+=x.outerHTML); 643 | return {AVID,href,src,title,date,itemTag}; 644 | } 645 | }, 646 | javdb: { 647 | domainReg: /(javdb)[0-9]*\./i, 648 | excludePages: ['/users/'], 649 | halfImg_block_Pages:['/uncensored','/western','/video_uncensored','/video_western'], 650 | gridSelector: 'div.movie-list.h', 651 | itemSelector: 'div.movie-list.h>div.item', 652 | widthSelector : '#grid-b', 653 | pageNext: 'a.pagination-next', 654 | pageSelector:'.pagination-list', 655 | init_Style: function(){ 656 | GM_addStyle(`#grid-b .info-bottom-two{flex-grow:1} 657 | [data-theme=light] .pop-up-tag[name$='${AVINFO_SUFFIX}'] {background-color: rgb(255 255 255 / 90%);} 658 | [data-theme=dark] .scroll-request span{background:white;} 659 | [data-theme=dark] #grid-b .box-b a:link {color : inherit;} 660 | [data-theme=dark] #grid-b .box-b{background-color:#222;} 661 | [data-theme=dark] .alert-zdy {color: black;background-color: rgb(255 255 255 / 90%);} 662 | #myModal #modal-div article.message {margin-bottom: 0}`); 663 | }, 664 | maxWidth: 150,//javdb允许的最大宽度为150%,其他网站默认最大宽度为100% 665 | getAvItem: function (elem) { 666 | var href = elem.find("a")[0].href; 667 | var src = elem.find("div.cover>img").eq(0).attr("src"); 668 | var title = elem.find("a")[0].title; 669 | var AVID = elem.find("div.video-title>strong").eq(0).text(); 670 | var date = elem.find("div.meta").eq(0).text(); 671 | var score = elem.find("div.score").html(); 672 | var itemTag = elem.find(".tags.has-addons").html(); 673 | return {AVID,href,src,title,date,itemTag,score}; 674 | } 675 | //init: function(){ if(location.href.includes("/users/")){ this.widthSelector="div.section";} } 676 | }, 677 | avmoo: { 678 | domainReg: /avmoo\./i, 679 | excludePages: ['/actresses'], 680 | gridSelector: 'div#waterfall', 681 | itemSelector: 'div#waterfall div.item', 682 | widthSelector : '#grid-b', 683 | pageNext: 'a[name="nextpage"]', 684 | pageSelector:'.pagination', 685 | getAvItem: function (elem) { 686 | var photoDiv = elem.find("div.photo-frame")[0]; 687 | var href = elem.find("a")[0].href; 688 | var img = $(photoDiv).children("img")[0]; 689 | var src = img.src.replace(/ps.jpg/, "pl.jpg"); 690 | var title = img.title; 691 | var AVID = elem.find("date").eq(0).text(); 692 | var date = elem.find("date").eq(1).text(); 693 | var itemTag = "";elem.find("div.photo-info .btn").toArray().forEach( x=> itemTag+=x.outerHTML); 694 | return {AVID,href,src,title,date,itemTag}; 695 | } 696 | }, 697 | javlibrary: { 698 | domainReg: /javlibrary\./i, 699 | gridSelector: 'div.videothumblist', 700 | itemSelector: 'div.videos div.video', 701 | widthSelector : '#grid-b', 702 | pageNext: 'a.page.next', 703 | pageSelector:'.page_selector', 704 | getAvItem: function (elem) { 705 | var href = elem.find("a")[0].href; 706 | var src = elem.find("img")[0].src; 707 | if(src.indexOf("pixhost")<0){//排除含有pixhost的src,暂时未发现规律 708 | src= src.replace(/ps.jpg/, "pl.jpg"); 709 | } 710 | var title = elem.find("div.title").eq(0).text(); 711 | var AVID = elem.find("div.id").eq(0).text(); 712 | return {AVID,href,src,title,date: '',itemTag:''}; 713 | }, 714 | init_Style: function(){ 715 | GM_addStyle(`${Status.get("menutoTop")?` 716 | #leftmenu {width : 100%;float: none;} 717 | #leftmenu>table { display : none;} 718 | #leftmenu .menul1,#leftmenu .menul1>ul{display: flex;align-items: center;justify-content: center;flex-wrap: wrap;} 719 | #leftmenu .menul1{padding: 5px;} 720 | #rightcolumn{margin: 0 5px;padding : 10px 5px;}`:``} 721 | #grid-b div{box-sizing: border-box;}`); 722 | }, 723 | } 724 | }; 725 | 726 | /** 用于屏蔽老司机脚本的代码*/ 727 | function oldDriverBlock(){ 728 | if(['javbus','avmoo'].includes(currentWeb)){ //屏蔽老司机脚本,改写id 729 | if ($('.masonry').length > 0) { 730 | $('.masonry').removeClass("masonry"); 731 | } 732 | let $waterfall = $('#waterfall'); 733 | if($waterfall.length){ 734 | $waterfall.get(0).id = "waterfall-destroy"; 735 | } 736 | if($waterfall.find("#waterfall").length){ //javbus首页有2个'waterfall' ID 737 | $waterfall.find("#waterfall").get(0).id = ""; 738 | } 739 | //解决 JAV老司机 $pages[0].parentElement.parentElement.id = "waterfall_h"; 740 | //女优作品界面此代码会把id设置到class=row层 741 | if ($('#waterfall_h.row').length > 0) { 742 | $('#waterfall_h.row').removeAttr("id"); 743 | } 744 | let $waterfall_h= $('#waterfall_h'); 745 | if ($waterfall_h.length) { 746 | $waterfall_h.get(0).id = "waterfall-destroy"; 747 | } 748 | if(location.pathname.search(/search/) > 0){//解决"改写id后,搜索页面自动跳转到无码页面"的bug 749 | $('body').append('
    '); 750 | } 751 | currentObj.gridSelector = "#waterfall-destroy"; 752 | } 753 | if(['javlibrary'].includes(currentWeb)){ //屏蔽老司机脚本,改写id 754 | let $waterfall = $('div.videothumblist'); 755 | if($waterfall.length){ 756 | $waterfall.removeClass("videothumblist"); 757 | $waterfall.find(".videos").removeClass("videos"); 758 | $waterfall.get(0).id = "waterfall-destroy"; 759 | } 760 | currentObj.gridSelector = "#waterfall-destroy"; 761 | } 762 | } 763 | class Page{ 764 | constructor(){ 765 | for (let key in ConstCode) { 766 | let domainReg = ConstCode[key].domainReg; 767 | if (domainReg && domainReg.test(location.href)) { 768 | currentWeb = key;//首先判断当前是什么网站 769 | break; 770 | } 771 | } 772 | currentObj = ConstCode[currentWeb]; 773 | //排除页面的判断 774 | if (currentObj.excludePages) { 775 | for (let page of currentObj.excludePages) { 776 | if (location.pathname.includes(page)) return; 777 | } 778 | } 779 | //调用初始化方法 未使用 if (currentObj.init) { currentObj.init();} 780 | //屏蔽竖图模式的页面判断 781 | if (currentObj.halfImg_block_Pages) { 782 | for (let blockPage of currentObj.halfImg_block_Pages) { 783 | if (location.href.includes(blockPage)) { 784 | Status.halfImg_block = true; 785 | break; 786 | }; 787 | } 788 | } 789 | this.render(); 790 | } 791 | render(){ 792 | let $items = $(currentObj.itemSelector); 793 | if ($items.length<1) return; 794 | oldDriverBlock(); 795 | addStyle(); 796 | currentObj.init_Style?.(); 797 | let menu = new SettingMenu(); 798 | //加载图片懒加载插件 799 | lazyLoad = new LazyLoad({ 800 | callback_loaded: function (img) { 801 | $(img).removeClass("minHeight-200"); 802 | imgCallback(img); 803 | } 804 | }); 805 | let gridPanel = new GridPanel($items,lazyLoad); 806 | myModal = new Popover();//弹出插件 807 | //加载滚动翻页插件 808 | if(Status.get("autoPage") && $(currentObj.pageSelector).length ){ 809 | scroller=new ScrollerPlugin(gridPanel.$dom,lazyLoad); 810 | } 811 | } 812 | } 813 | class GridPanel{ 814 | constructor($items,lazyLoad){ 815 | this.$dom=$(`
    `); 816 | $(currentObj.gridSelector).hide().eq(0).before(this.$dom); 817 | let $elems = this.constructor.parseItems($items); 818 | this.$dom.append($elems); 819 | lazyLoad.update(); 820 | } 821 | static parseItems(elems){ 822 | let elemsHtml = ""; 823 | let {imgStyle,getAvItem,toolBar,copyBtn,fullTitle,magnet,magnetTip,downloadTip,pictureTip} = { 824 | imgStyle: Status.isHalfImg() ? halfImgCSS : fullImgCSS, 825 | getAvItem: currentObj.getAvItem, 826 | toolBar: Status.get("toolBar")?'':'hidden-b', 827 | copyBtn: Status.get("copyBtn")?'':'hidden-b', 828 | fullTitle: Status.get("fullTitle")?'':'titleNowrap', 829 | magnet: ['javbus','javdb'].includes(currentWeb)?'':'hidden-b', 830 | magnetTip : lang.tool_magnetTip, 831 | downloadTip: lang.tool_downloadTip, 832 | pictureTip: lang.tool_pictureTip, 833 | }; 834 | for (let i = 0; i < elems.length; i++) { 835 | let tag = elems.eq(i); 836 | let html = ""; 837 | //判断是否为 女优个人资料item 838 | if (currentWeb!="javdb" && tag.find(".avatar-box").length) { 839 | tag.find(".avatar-box").addClass("avatar-box-b").removeClass("avatar-box"); 840 | html = `
    ${tag.html()}
    `; 841 | }else{ 842 | let AvItem = getAvItem(tag); 843 | html = `
    844 |
    845 |
    846 | 847 |
    848 |
    849 | ${copy_Svg} ${AvItem.title} 850 |
    851 | 854 | ${AvItem.score?`
    ${AvItem.score}
    `:``} 855 |
    856 |
    ${AvItem.itemTag}
    857 |
    858 | ${magnet_Svg} 859 | ${download_Svg} 860 | ${picture_Svg} 861 |
    862 |
    863 |
    864 |
    865 |
    866 |
    `; 867 | } 868 | elemsHtml = elemsHtml + html; 869 | } 870 | let $elems = $(elemsHtml); 871 | $elems.find("span[name]").click(function () { 872 | let name = $(this).attr("name"); 873 | switch (name) { 874 | case "copy":GM_setClipboard($(this).next().text());showAlert(lang.copySuccess);return false; 875 | case "download": 876 | let [url,name] = [$(this).attr("src"),$(this).attr("src-title")+".jpg"]; 877 | downloadImg(url,name,this);break; 878 | case "magnet":showMagnetTable($(this).parent("div").attr("item-id"),$(this).attr("AVID").replace(/\./g, '-'),$(this).attr("data-href"),this);break; 879 | case "picture":showBigImg($(this).parent("div").attr("item-id"),$(this).attr("AVID"),this);break; 880 | default:break; 881 | } 882 | }); 883 | return $elems; 884 | } 885 | } 886 | class ScrollerPlugin{ 887 | constructor(waterfall,lazyLoad){ 888 | let me=this; 889 | me.waterfall=waterfall; 890 | me.lazyLoad=lazyLoad; 891 | let $pageNext=$(currentObj.pageNext); 892 | me.nextURL = $pageNext.attr('href'); 893 | me.scroller_status=$(``); 894 | me.waterfall.after(me.scroller_status); 895 | me.locked=false; 896 | me.canLoad=true; 897 | me.$page=$(currentObj.pageSelector); 898 | me.domWatch_func=me.domWatch.bind(me); 899 | document.addEventListener('scroll',me.domWatch_func); 900 | if (history.scrollRestoration) { 901 | history.scrollRestoration = 'manual';//防止自动恢复页面位置 902 | } 903 | } 904 | domWatch (){ 905 | let me = this; 906 | if (me.$page.get(0).getBoundingClientRect().top - $(window).height() < 300 && (!me.locked) && (me.canLoad)) { 907 | me.locked=true; 908 | me.loadNextPage(me.nextURL).then(()=>{me.locked=false}); 909 | } 910 | } 911 | async loadNextPage(url){ 912 | this.showStatus('request'); 913 | console.log(url); 914 | let responseText = await fetch(url, { credentials: 'same-origin' }).then(respond=>respond.text()); 915 | let $body = $(new DOMParser().parseFromString(responseText, 'text/html')); 916 | let elems = GridPanel.parseItems($body.find(currentObj.itemSelector)); 917 | if (currentWeb != "javdb" && location.pathname.includes('/star/') && elems) { 918 | elems=elems.slice(1); 919 | } 920 | this.scroller_status.hide(); 921 | this.waterfall.append(elems); 922 | this.lazyLoad.update(); 923 | //history.pushState({}, "", url); 924 | this.nextURL = $body.find(currentObj.pageNext).attr('href'); 925 | if(!this.nextURL){ 926 | this.canLoad=false; 927 | this.showStatus("last"); 928 | } 929 | } 930 | showStatus(status){ 931 | this.scroller_status.children().each( (i,e)=>{$(e).hide()}); 932 | this.scroller_status.find(`.scroll-${status}`).show(); 933 | this.scroller_status.show(); 934 | } 935 | destroy (){ 936 | this.scroller_status.remove(); 937 | document.removeEventListener('scroll',this.domWatch_func); 938 | } 939 | } 940 | 941 | const addStyle = () => { 942 | let columnNum = Status.getColumnNum(); 943 | let waterfallWidth=Status.get("waterfallWidth"); 944 | let css_waterfall = ` 945 | ${currentObj.widthSelector}{width:${waterfallWidth}%;margin:0 ${waterfallWidth>100?(100-waterfallWidth)/2+'%':'auto'};transition:.5s ;} 946 | #grid-b{display:flex;flex-direction:row;flex-wrap:wrap;} 947 | #grid-b .item-b{padding:5px;width:${100 / columnNum}%;transition:.5s ;animation: fadeInUp .5s ease-out;} 948 | #grid-b .box-b{border-radius:5px;background-color:white;border:1px solid rgba(0,0,0,0.2);box-shadow:0 2px 3px 0 rgba(0,0,0,0.1);overflow:hidden} 949 | #grid-b .box-b a:link{color:black} 950 | #grid-b .box-b a:visited{color:gray} 951 | #grid-b .box-b .cover-b{text-align:center} 952 | #grid-b .box-b .detail-b{padding:7px} 953 | #grid-b .box-b .detail-b a{display:block} 954 | #grid-b .info-bottom,.info-bottom-two{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap} 955 | #grid-b .avatar-box-b{display:flex;flex-direction:column;background-color:white;border-radius:5px;align-items:center;border:1px solid rgba(0,0,0,0.2)} 956 | #grid-b .avatar-box-b p{margin:0 !important} 957 | #grid-b date:first-of-type{font-size:18px !important} 958 | #grid-b .toolbar-b{float:right;padding:2px;white-space:nowrap} 959 | #grid-b .toolbar-b span{margin-right:2px} 960 | #grid-b .copy-span{vertical-align:middle;display:inline-block} 961 | #grid-b span.tool-span{cursor:pointer;opacity:.3} 962 | #grid-b span.tool-span:hover{opacity:1} 963 | #grid-b .item-tag{display:inline-block;white-space:nowrap} 964 | #grid-b .hidden-b{display:none} 965 | #grid-b .minHeight-200{min-height:200px} 966 | #grid-b .cover-b img:not([src]) {visibility: hidden;} 967 | svg.tool-svg{fill:currentColor;width:22px;height:22px;vertical-align:middle} 968 | span.span-loading{display:inline-block;animation:span-loading 2s infinite} 969 | 970 | #myModal{overflow-x:hidden;overflow-y:auto;display:none;position:fixed;top:0;left:0;right:0;bottom:0;z-index:1050;background-color:rgba(0,0,0,0.5)} 971 | #myModal #modal-div{position:relative;width:80%;margin:0 auto;background-color:rgb(6 6 6 / 50%);border-radius:8px;animation:fadeInDown .5s} 972 | #modal-div .pop-up-tag{border-radius:8px;overflow:hidden} 973 | #modal-div .sample-box-zdy,.avatar-box-zdy{display:inline-block;border-radius:8px;background-color:#fff;overflow:hidden;margin:5px;width:140px} 974 | #modal-div .sample-box-zdy .photo-frame{overflow:hidden;margin:10px} 975 | #modal-div .sample-box-zdy img{height:90px} 976 | #modal-div .avatar-box-zdy .photo-frame{overflow:hidden;height:120px;margin:10px} 977 | #modal-div .avatar-box-zdy img{height:120px} 978 | #modal-div .avatar-box-zdy span{font-weight:bold;text-align:center;word-wrap:break-word;display:flex;justify-content:center;align-items:center;padding:5px;line-height:22px;color:#333;background-color:#fafafa;border-top:1px solid #f2f2f2} 979 | 980 | #menu-div{white-space:nowrap;background-color:white;color:black;display:none;min-width:200px;border-radius:5px;padding:10px;box-shadow:0 10px 20px 0 rgb(0 0 0 / 50%)} 981 | #menu-div>div:hover{background-color:gainsboro} 982 | #menu-div .switch-div{display:flex;align-items:center;font-size:large;font-weight:bold} 983 | #menu-div .switch-div *{margin:0;padding:4px} 984 | #menu-div .switch-div label{flex-grow:1} 985 | #menu-div .range-div{display:flex;flex-direction:row;flex-wrap:nowrap} 986 | #menu-div .range-div input{cursor:pointer;width:80%;max-width:200px} 987 | .alert-zdy{position:fixed;top:50%;left:50%;padding:12px 20px;font-size:20px;color:white;background-color:rgb(0,0,0,.75);border-radius:4px;animation:itemShow .3s;z-index:1051} 988 | .titleNowrap{white-space:nowrap;text-overflow:ellipsis;overflow:hidden} 989 | .download-icon{position:absolute;right:0;z-index:2;cursor:pointer} 990 | .download-icon>svg{width:30px;height:30px;fill:aliceblue} 991 | @keyframes fadeInUp{0%{transform:translate3d(0,10%,0);opacity:.5}100%{transform:none;opacity:1}} 992 | @keyframes fadeInDown{0%{transform:translate3d(0,-100%,0);opacity:0}100%{transform:none;opacity:1}} 993 | @keyframes itemShow{0%{transform:scale(0)}100%{transform:scale(1)}} 994 | @keyframes span-loading{0%{transform:scale(1);opacity:1}50%{transform:scale(1.2);opacity:1}100%{transform:scale(1);opacity:1}} 995 | .scroll-request{text-align:center;height:15px;margin:15px auto} 996 | .scroll-request span{display:inline-block;width:15px;height:100%;margin-right:8px;border-radius:50%;background:rgb(16,19,16);animation:scroll-load 1s ease infinite} 997 | @keyframes scroll-load{0%,100%{transform:scale(1)} 50%{transform:scale(0)}} 998 | .scroll-request span:nth-child(2){animation-delay:0.125s} 999 | .scroll-request span:nth-child(3){animation-delay:0.25s} 1000 | .scroll-request span:nth-child(4){animation-delay:0.375s} 1001 | .imgResult-li{color:rgb(255,255,255,50%);font-size:20px} 1002 | .imgResult-li.imgResult-Current{color:white} 1003 | .imgResult-loading{animation:changeTextColor 1s ease-in infinite} 1004 | .imgResult-li:hover{cursor:pointer;color:white} 1005 | @keyframes changeTextColor{0%{color:rgba(255,255,255,1)}50%{color:rgba(255,255,255,.5)}100%{color:rgba(255,255,255,1)}}`; 1006 | GM_addStyle(css_waterfall); 1007 | } 1008 | 1009 | new Page(); 1010 | })(); --------------------------------------------------------------------------------