Sleazy Fork is available in English.

JAV cover picture + video preview

yase.one、JavDB、JavBus、JavLibrary avmoo.cyou、JAV cover picture + video preview

  1. // ==UserScript==
  2. // @name JAV cover picture + video preview
  3. // @description yase.one、JavDB、JavBus、JavLibrary avmoo.cyou、JAV cover picture + video preview
  4. // @include *javbus.com/*
  5. // @include *javdb.com/*
  6. // @include *avmoo.cyou/*
  7. // @include *javlibrary.com/*
  8. // @include /^.*(javbus|busjav|busfan|fanbus|buscdn|cdnbus|dmmsee|seedmm|busdmm|dmmbus|javsee|seejav)\..*$/
  9. // @include /^.*(javdb)[0-9]*\..*$/
  10. // @include /^.*(avmoo)\..*$/
  11. // @match https://yase.one/*
  12. // @match *://www.javbus.com/*
  13. // @match *://www.javdb.com/*
  14. // @grant GM_addStyle
  15. // @grant GM_xmlhttpRequest
  16. // @grant GM_getValue
  17. // @grant GM_setValue
  18. // @grant GM_download
  19. // @grant GM_setClipboard
  20. // @connect *
  21. // @version 4.1
  22. // @namespace https://greasyfork.org/users/852660
  23. // ==/UserScript==
  24.  
  25. (function () {
  26. 'use strict';
  27. // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/lazyload.min.js
  28. !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;t<arguments.length;t++){var e=arguments[t];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(n[i]=e[i])}return n},n.apply(this,arguments)}var t="undefined"!=typeof window,e=t&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),i=t&&"IntersectionObserver"in window,o=t&&"classList"in document.createElement("p"),a=t&&window.devicePixelRatio>1,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}));
  29.  
  30. let statusDefault = {
  31. autoPage: false,
  32. copyBtn :true,
  33. toolBar: true,
  34. avInfo:true,
  35. halfImg:false,
  36. fullTitle:false,
  37. waterfallWidth:100,
  38. columnNumFull:3,
  39. columnNumHalf:4,
  40. menutoTop : false
  41. };
  42. const SCREENSHOT_SUFFIX = "-screenshot-tag";
  43. const AVINFO_SUFFIX = "-avInfo-tag";
  44. const blogjavSelector= "h2.entry-title>a";
  45. const fullImgCSS=`width: 100%!important;height:100%!important;`;
  46. const halfImgCSS=`position: relative;left: -112%;width: 212% !important;height: 100% !important;max-width: 212%;`;
  47.  
  48. const copy_Svg = `<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="16" height="16" viewBox="0 0 16 16"><path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v13.5a.5.5 0 0 1-.777.416L8 13.101l-5.223 2.815A.5.5 0 0 1 2 15.5V2zm2-1a1 1 0 0 0-1 1v12.566l4.723-2.482a.5.5 0 0 1 .554 0L13 14.566V2a1 1 0 0 0-1-1H4z"/></svg>`;
  49. const download_Svg = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" class="tool-svg" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8zm15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z"/></svg>`;
  50. const picture_Svg = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" class="tool-svg" viewBox="0 0 16 16"><path d="M6.002 5.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/><path d="M2.002 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2h-12zm12 1a1 1 0 0 1 1 1v6.5l-3.777-1.947a.5.5 0 0 0-.577.093l-3.71 3.71-2.66-1.772a.5.5 0 0 0-.63.062L1.002 12V3a1 1 0 0 1 1-1h12z"/></svg>`;
  51. const magnet_Svg = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" class="tool-svg" x="0px" y="0px" viewBox="0 0 1000 1000" ><g><g transform="translate(0.000000,460.000000) scale(0.100000,-0.100000)"><path d="M4171.6,3994c-183.9-13.4-515.3-67.1-706.9-113c-770.2-187.7-1448.4-563.3-2021.2-1118.8c-707-685.9-1130.3-1494.4-1299-2481c-59.4-358.3-59.4-1002,0-1360.2c157.1-923.4,546-1705.1,1172.5-2354.6c695.4-722.3,1534.6-1159.1,2548.1-1325.7c174.4-28.7,388.9-34.5,1643.8-40.2l1440.7-7.7v1302.8v1302.8l-1354.5,7.6c-1207,5.7-1369.8,9.6-1480.9,40.2c-448.3,116.9-785.5,335.3-1036.5,666.7c-252.9,339.1-364,666.7-364,1088.2s111.1,749.1,364,1088.2c241.4,318,595.8,551.8,1000.1,659.1c157.1,40.2,191.6,42.1,1517.3,47.9l1354.5,7.7v1302.8v1300.9l-1344.9-3.8C4863.3,4001.6,4219.5,3997.8,4171.6,3994z"/><path d="M7620.1,2704.6V1401.8h1139.9H9900v1302.8v1302.8H8760.1H7620.1V2704.6z"/><path d="M7620.1-3502.7v-1302.8h1139.9H9900v1302.8v1302.8H8760.1H7620.1V-3502.7z"/></g></g></svg>`;
  52.  
  53. const LOCALE = {
  54. en: {
  55. menuText :'Settings',
  56. menu_autoPage:'auto Next Page',
  57. menu_copyBtn:'copy icon',
  58. menu_toolBar:'tools icon',
  59. menu_avInfo:'actors and sample images in pop-ups',
  60. menu_halfImg:'Vertical image mode',
  61. menu_fullTitle:'Full Title',
  62. menu_columnNum:'columns',
  63. menu_menutoTop:'Move the left menu to the top',
  64. copyButton:'Copy',
  65. copySuccess:'Copy successful',
  66. getAvImg_norespond:'blogjav.net is temporarily unable to respond',
  67. getAvImg_none:'Not found',
  68. tool_magnetTip:'Magnet',
  69. tool_downloadTip:'Download cover',
  70. tool_pictureTip:'Video screenshot from blogjav.net',
  71. scrollerPlugin_end:'End'
  72. }
  73. }
  74. let getlanguage = () => {
  75. let local= navigator.language;
  76. local = local.toLowerCase().replace('_', '-');
  77. if (local in LOCALE){
  78. return LOCALE[local];
  79. }else if (local.split('-')[0] in LOCALE){
  80. return LOCALE[local.split('-')[0]];
  81. }else {
  82. return LOCALE.en;
  83. }
  84. }
  85. let lang = getlanguage();
  86.  
  87. let showAlert = (msg,close) => {
  88. let $alert=$(`<div class="alert-zdy" >${msg}</div>`);
  89. if(close){
  90. let $close = $(`<div style="display: inline-block;padding: 0 10px;cursor: pointer;">X</div>`);
  91. $alert.append($close);
  92. $close.on("click",()=>$alert.hide());
  93. }
  94. $('body').append($alert);
  95. $alert.show({start:function(){
  96. $(this).css({'margin-top': -$(this).height() / 2 ,'margin-left': -$(this).width() / 2 });
  97. }});
  98. if(!close){$alert.delay(3000).fadeOut()};
  99. }
  100.  
  101. let imgCallback = (img)=> {
  102. if (Status.isHalfImg()) {
  103. if(img.height < img.width){
  104. img.style= halfImgCSS ;
  105. }else{
  106. img.style= fullImgCSS ;
  107. }
  108. }else{
  109. if(img.height/img.width>=0.7){
  110. img.style= `width:${img.width*67.25/img.height}%;` ;
  111. }else{
  112. img.style= fullImgCSS ;
  113. }
  114. }
  115. }
  116.  
  117. let Status = {
  118. halfImg_block:false,
  119. set : function(key,value){
  120. if(key=="columnNum") {
  121. key=key+(this.isHalfImg()?"Half":"Full");
  122. }else if(key=="waterfallWidth"){
  123. key=key+"_"+currentWeb;
  124. }
  125. return GM_setValue(key, value);
  126. },
  127. get : function(key){
  128. return GM_getValue(key=="waterfallWidth"?(key+"_"+currentWeb):key, statusDefault[key]);
  129. },
  130. isHalfImg: function () {
  131. return this.get("halfImg") && (!this.halfImg_block);
  132. },
  133. getColumnNum: function () {
  134. var key= 'columnNum'+(this.isHalfImg()?"Half":"Full");
  135. return this.get(key);
  136. }
  137. };
  138. class Popover{
  139. show(){
  140. document.documentElement.classList.add("scrollBarHide");
  141. this.element.show({duration:0,start:function(){
  142. var t=$(this).find('#modal-div');
  143. t.css({'margin-top': Math.max(0, ($(window).height() - t.height()) / 2) });
  144. }});
  145. }
  146. hide(){
  147. document.documentElement.classList.remove("scrollBarHide");
  148. this.element.hide();
  149. this.element.find('.pop-up-tag').hide();
  150. }
  151. init(){
  152. var me=this;
  153. me.element = $('<div id="myModal"><div id="modal-div" > </div></div>');
  154. me.element.on('click',function(e){
  155. if($(e.target).closest("#modal-div").length==0){
  156. me.hide();
  157. }
  158. });
  159. me.scrollBarWidth = me.getScrollBarWidth();
  160. GM_addStyle('.scrollBarHide{ padding-right: ' + me.scrollBarWidth + 'px;overflow:hidden;}');
  161. $('body').append(me.element);
  162. if(currentWeb=="javbus"){
  163. me.element.magnificPopup({
  164. delegate: 'a.sample-box-zdy:visible',
  165. type: 'image',
  166. closeOnContentClick: false,
  167. closeBtnInside: false,
  168. mainClass: 'mfp-with-zoom mfp-img-mobile',
  169. image: {verticalFit: true},
  170. gallery: { enabled: true},
  171. zoom: {enabled: true,duration: 300,opener: function (element) {return element.find('img');}}
  172. });
  173. }
  174. }
  175. append(elem){
  176. if(!this.element){ this.init();}
  177. this.element.find("#modal-div").append(elem);
  178. return this;
  179. }
  180. getScrollBarWidth() {
  181. var el = document.createElement("p");
  182. var styles = {width: "100px",height: "100px",overflowY: "scroll" };
  183. for (var i in styles) {
  184. el.style[i] = styles[i];
  185. }
  186. document.body.appendChild(el);
  187. var scrollBarWidth = el.offsetWidth - el.clientWidth;
  188. el.remove();
  189. return scrollBarWidth;
  190. }
  191. }
  192. class SettingMenu {
  193. onChange = {
  194. autoPage: function() {
  195. if (scroller) {
  196. scroller.destroy();scroller = null;
  197. } else {
  198. scroller = new ScrollerPlugin($('#grid-b'), lazyLoad);
  199. }
  200. },
  201. copyBtn: function() {
  202. $("#grid-b .copy-span").toggle();
  203. },
  204. toolBar: function() {
  205. $("#grid-b .toolbar-b").toggle();
  206. },
  207. halfImg: function() {
  208. let me = this;
  209. $("#grid-b .box-b img.loaded").each(function(index, el) {
  210. imgCallback(el);
  211. });
  212. var columnNum = Status.getColumnNum();
  213. GM_addStyle(`#grid-b .item-b{ width: ${100/columnNum}%;}`);
  214. $("#columnNum_range").val(columnNum);
  215. $("#columnNum_range+span").text(columnNum);
  216. },
  217. fullTitle: function() {
  218. $("#grid-b a[name='av-title']").toggleClass("titleNowrap");
  219. },
  220. avInfo: function() {},
  221. menutoTop : function() {location.reload();},
  222. columnNum: function(columnNum) {
  223. GM_addStyle(`#grid-b .item-b{ width: ${100/columnNum}%;}`);
  224. },
  225. waterfallWidth: function(width) {
  226. $(currentObj.widthSelector).css({"width":`${width}%`,"margin": `0 ${width>100?(100-width)/2+"%":"auto"}`});
  227. }
  228. }
  229. constructor() {
  230. let columnNum = Status.getColumnNum();
  231. let $menu = $('<div id="menu-div" ></div>');
  232. $menu.append(this.creatCheckbox("autoPage", lang.menu_autoPage));
  233. $menu.append(this.creatCheckbox("copyBtn", lang.menu_copyBtn));
  234. $menu.append(this.creatCheckbox("toolBar", lang.menu_toolBar));
  235. $menu.append(this.creatCheckbox("halfImg", lang.menu_halfImg, Status.halfImg_block));
  236. $menu.append(this.creatCheckbox("fullTitle", lang.menu_fullTitle));
  237. if (["javbus", "javdb"].includes(currentWeb)) {
  238. $menu.append(this.creatCheckbox("avInfo", lang.menu_avInfo));
  239. }
  240. if (currentWeb == 'javlibrary') {
  241. $menu.append(this.creatCheckbox("menutoTop", lang.menu_menutoTop));
  242. }
  243. $menu.append(this.creatRange("columnNum", lang.menu_columnNum, columnNum, 8));
  244. $menu.append(this.creatRange("waterfallWidth", '%', Status.get("waterfallWidth") , currentObj.maxWidth ? currentObj.maxWidth : 100));
  245. let $circle = $(`<div style="position: ${currentWeb=="javlibrary"?"absolute":"fixed"};z-index: 1030;left:0;top:${currentWeb=="javlibrary"?"36px":"0px"};"><div style="width: 40px;height: 40px;background-color: rgb(208 176 176 / 90%);border-radius: 20px;"></div></div>`);
  246. $circle.append($menu);
  247. $circle.mouseenter(() => $menu.show()).mouseleave(() => $menu.hide());
  248. $("body").append($circle);
  249. if(!Status.get("notice")){
  250. $menu.slideDown();Status.set("notice",true);
  251. }
  252. }
  253. creatCheckbox(tagName, name, disabled) {
  254. let me =this;
  255. let $checkbox = $(`<div class="switch-div"><input ${disabled?'disabled="disabled"':''} type="checkbox" id="${tagName}_checkbox" /><label for="${tagName}_checkbox" >${name}</label></div>`);
  256. $checkbox.find("input")[0].checked = Status.get(tagName);
  257. $checkbox.find("input").eq(0).click(function() {
  258. Status.set(tagName, this.checked);
  259. me.onChange[tagName]();
  260. });
  261. return $checkbox;
  262. }
  263. creatRange(tagName, name, value, max) {
  264. let me =this;
  265. let $range = $(`<div class="range-div"><input type="range" id="${tagName}_range" min="1" max="${max}" step="1" value="${value}" /><span name="value">${value}</span><span>${name}</span></div>`);
  266. $range.bind('input propertychange', function() {
  267. var val = $(this).find("input").eq(0).val();
  268. $(this).find("span[name=value]").html(val);
  269. Status.set(tagName, val);
  270. me.onChange[tagName](val);
  271. });
  272. return $range;
  273. }
  274. }
  275.  
  276. function showMagnetTable(itemID,avid,href,elem) {
  277. if ($(elem).hasClass("span-loading")) {return;}
  278. let tagName = `${itemID}${AVINFO_SUFFIX}`;
  279. let $el=$(`.pop-up-tag[name='${tagName}']`);
  280. if ($el.length > 0) {
  281. $el.show();myModal.show();
  282. } else {
  283. $(elem).addClass("span-loading");
  284. Promise.resolve().then(()=>{
  285. switch(currentWeb) {
  286. case "javbus": {
  287. return getMagnet4JavBus(href,tagName)
  288. }
  289. case "javdb": {
  290. return getMagnet4JavDB(href,tagName,itemID)
  291. }
  292. }
  293. }).then((dom)=>{
  294. myModal.append(dom).show();
  295. }).catch(err=>alert(err)).then(()=>$(elem).removeClass("span-loading"));
  296. }
  297. }
  298. async function getMagnet4JavDB(href, tagName, itemID) {
  299. let doc = await fetch(href).then(response => response.text());
  300. let $doc = $($.parseHTML(doc));
  301. let info = $(`<div class="pop-up-tag" name="${tagName}"></div>`);
  302. if (Status.get("avInfo")) {
  303. let actors = $doc.find("div.video-meta-panel .panel-block").toArray().find(el => $(el).find("a[href^='/actors/']").length > 0);
  304. $(actors).find("a").attr("target", "_blank");
  305. let preview_images = $doc.find(".columns").toArray().find(el => $(el).find("div.tile-images.preview-images").length > 0);
  306. let $preview_images = $(preview_images);
  307. $preview_images.find(".preview-video-container").attr("href", `#preview-video-${itemID}`);
  308. $preview_images.find("#preview-video").attr("id", `preview-video-${itemID}`);
  309. $preview_images.find("img[data-src]").each((i, el) => $(el).attr("src", $(el).attr("data-src")));
  310. info.append(actors);
  311. info.append(preview_images);
  312. }
  313. let magnetTable = $doc.find(`div.columns[data-controller="movie-tab"]`);
  314. magnetTable.find("div.top-meta").remove();
  315. info.append(magnetTable);
  316.  
  317.  
  318.  
  319. return info;
  320.  
  321. };
  322. async function getMagnet4JavBus(href, tagName) {
  323. let {gid,dom} = await avInfofetch(href,tagName);
  324. let uc_code = location.pathname.search(/(uncensored|mod=uc)/) < 1 ? 0 : 1;
  325. let url = `${location.protocol}//${location.hostname}/ajax/uncledatoolsbyajax.php?gid=${gid}&lang=zh&img=&uc=${uc_code}&floor=` + Math.floor(Math.random() * 1e3 + 1);
  326. let doc = await fetch(url).then(response => response.text());
  327. let table_html = doc.substring(0, doc.indexOf('<script')).trim();
  328. let table_tag = $(`<table class="table pop-up-tag" name="${tagName}" style="background-color:#FFFFFF;" ></table>`);
  329. table_tag.append($(table_html));
  330. table_tag.find("tr").each(function (i) {
  331. let $a = $(this).find('a');
  332. if ($a.length) {
  333. let magent_url = $a[0].href;
  334. $(this).prepend(creatCopybutton(magent_url));
  335. }
  336. });
  337. dom.push(table_tag);
  338. return dom;
  339. };
  340.  
  341.  
  342. function creatCopybutton(text) {
  343. let $copyButton = $(`<td><button class="center-block">${lang.copyButton}</button></td>`);
  344. let $authButton = createAuthorizationButton();
  345.  
  346. $copyButton.find("button").click(function () {
  347. GM_setClipboard(text);
  348. showAlert(lang.copySuccess);
  349. });
  350.  
  351.  
  352. return [$copyButton];
  353. }
  354.  
  355.  
  356.  
  357.  
  358. async function avInfofetch(href,tagName) {
  359. let doc = await fetch(href).then(response => response.text())
  360. let str = /var\s+gid\s+=\s+(\d{1,})/.exec(doc);
  361. let avInfo = {gid:str[1],dom:[]};
  362. if(Status.get("avInfo")){
  363. let sample_waterfall = $($.parseHTML(doc)).find("#sample-waterfall");
  364. let avatar_waterfall = $($.parseHTML(doc)).find("#avatar-waterfall");
  365. if(avatar_waterfall.length>0){
  366. avatar_waterfall[0].id = "";
  367. avatar_waterfall.addClass("pop-up-tag");
  368. avatar_waterfall.attr("name",tagName);
  369. avatar_waterfall.find("a.avatar-box span").each((i,el)=> {
  370. let $copySvg = $(`<div style="width:24px;height:24px;display: flex;align-items: center;justify-content: center;">${copy_Svg}</div>`);
  371. $copySvg.click(function () {
  372. GM_setClipboard($(el).text());
  373. showAlert(lang.copySuccess);
  374. return false;
  375. });
  376. $(el).prepend($copySvg);
  377. });
  378. avatar_waterfall.find("a.avatar-box").attr("target","_blank").removeClass("avatar-box").addClass("avatar-box-zdy");
  379. avInfo.dom.push(avatar_waterfall);
  380. }
  381. if(sample_waterfall.length>0){
  382. sample_waterfall[0].id = "";
  383. sample_waterfall.addClass("pop-up-tag");
  384. sample_waterfall.attr("name",tagName);
  385. sample_waterfall.find(".sample-box").removeClass("sample-box").addClass("sample-box-zdy");
  386. avInfo.dom.push(sample_waterfall);
  387. }
  388. }
  389. return avInfo;
  390. };
  391.  
  392. function showBigImg(itemID,avid,elem) {
  393. if ($(elem).hasClass("span-loading")) {return;}
  394. let tagName = `${itemID}${SCREENSHOT_SUFFIX}`;
  395. let $selector = $(`.pop-up-tag[name='${tagName}']`);
  396. if ($selector.length > 0) {
  397. $selector.show();
  398. myModal.show();
  399. } else {
  400. $(elem).addClass("span-loading");
  401. getAvImg(avid,tagName).then(($img)=>{
  402. myModal.append($img).show();
  403. }).catch(err=>err && showAlert(err)).then(()=>{
  404. $(elem).removeClass("span-loading");
  405. });
  406. }
  407. }
  408. const getRequest = (url) => {
  409. return new Promise((resolve, reject)=>{
  410. GM_xmlhttpRequest({
  411. method: "GET",
  412. url: url,
  413. timeout: 20000,
  414. onload: (r)=>resolve(r),
  415. onerror : (r)=> reject(`error`),
  416. ontimeout : (r)=> reject(`timeout`)
  417. });
  418. })
  419. }
  420. //
  421. async function getAvImg(avid,tagName) {
  422. const r = await getRequest(`https://blogjav.net/?s=${avid}`);
  423. if(r.status == 503){
  424. showAlert(`blogjav.net has an anti-attack mechanism, <a target="_blank" href="https://blogjav.net">Click to jump</a> to release `,`close`);
  425. return Promise.reject();
  426. }else if(r.status != 200){
  427. return Promise.reject(lang.getAvImg_norespond);
  428. }
  429. let resultList = $($.parseHTML(r.responseText)).find(blogjavSelector).toArray().map((v)=> {return {title:v.innerHTML,href:v.href} });
  430. if(resultList.length==0) {
  431. return Promise.reject(lang.getAvImg_none);
  432. }
  433. let $img = new ScreenshotPanel(tagName,resultList,avid);
  434. let findIndex = resultList.findIndex(v=> v.title.search(/FHD/i)>0);
  435. let index_show = findIndex>-1?findIndex:0;
  436. $img.find(`li.imgResult-li[index=${index_show}]`).trigger('click');
  437. return $img;
  438. };
  439. class ScreenshotPanel{
  440. constructor(tagName,resultList,avid){
  441. let me =this;
  442. let $img = $(`<div name="${tagName}" class="pop-up-tag" style="min-height:${$(window).height()}px;">
  443. <ul style="${resultList.length==1?'display:none':''}">
  444. ${resultList.map((v,i)=>`<li class="imgResult-li" index=${i} data="${v.href}">${v.title}</li>`).join('')}</ul>
  445. <span class="download-icon" >${download_Svg}</span>
  446. ${resultList.map((v,i)=>`<img index=${i} name="screenshot" style="display:none;width:100%" />`).join('')}
  447. </div>`);
  448. $img.find("li.imgResult-li").click(function(){
  449. if ($(this).hasClass("imgResult-loading")) {return;}
  450. let index_to = $(this).attr('index');
  451. let index_from = $img.find("img:visible").attr(`index`);
  452. if( index_to != index_from){
  453. $img.find("li.imgResult-li.imgResult-Current").removeClass('imgResult-Current');
  454. $(this).addClass(`imgResult-loading`).addClass("imgResult-Current");
  455. $img.find("img").hide();
  456. let $img_to = $img.find(`img[index=${index_to}]`);
  457. $img_to.show();
  458. Promise.resolve().then(()=>{
  459. if($img_to.attr(`src`)){
  460. return true;
  461. }else{
  462. return me.getScreenshotUrl($(this).attr('data')).then((r)=>{
  463. $img_to.attr(`src`,r);
  464. });
  465. }
  466. }).catch((err)=>{showAlert(err)}).then((r)=>{$(this).removeClass(`imgResult-loading`);});
  467. }
  468. })
  469. $img.find("span.download-icon").click(function(){
  470. if ($(this).hasClass("span-loading")) {return;}
  471. $(this).addClass("span-loading");
  472. Promise.resolve({
  473. then :(resolve,reject)=>{
  474. GM_download({
  475. url :$img.find("img:visible").attr(`src`),
  476. name: `${avid || "screenshot"}.jpg`,
  477. onerror :r => reject("error"),
  478. ontimeout :r => reject("timeout"),
  479. onload :() => resolve()
  480. });
  481. }
  482. }).catch(err=>err && showAlert(err)).then(()=>$(this).removeClass("span-loading"));
  483. });
  484. return $img;
  485. }
  486. async getScreenshotUrl(imgUrl){
  487. const result = await getRequest(imgUrl);
  488. let img_src = /<noscript>.*src="(.*pixhost.to\/thumbs[\S]+)".*<\/noscript>/.exec(result.responseText);
  489. let src = img_src[1].replace('thumbs', 'images').replace('//t', '//img').replace('"', '');
  490. console.log(src);
  491. return src;
  492. }
  493. }
  494.  
  495. let lazyLoad;
  496. let scroller;
  497. let myModal;//
  498. let currentWeb = "javbus";
  499. let currentObj ;//
  500. let ConstCode = {
  501. javbus: {
  502. domainReg: /(javbus|busjav|busfan|fanbus|buscdn|cdnbus|dmmsee|seedmm|busdmm|dmmbus|javsee|seejav)\./i,
  503. excludePages: ['/actresses', 'mdl=favor&sort=1', 'mdl=favor&sort=2', 'mdl=favor&sort=3', 'mdl=favor&sort=4', 'searchstar'],
  504. halfImg_block_Pages:['/uncensored','javbus.one','mod=uc','javbus.red'],
  505. gridSelector: 'div#waterfall',
  506. itemSelector: 'div#waterfall div.item',
  507. widthSelector : '#grid-b',
  508. pageNext:'a#next',
  509. pageSelector:'.pagination',
  510. getAvItem: function (elem) {
  511. var photoDiv = elem.find("div.photo-frame")[0];
  512. var href = elem.find("a")[0].href;
  513. var img = $(photoDiv).children("img")[0];
  514. var src = img.src;
  515. if (src.match(/pics.dmm.co.jp/)) {
  516. src = src.replace(/ps.jpg/, "pl.jpg");
  517. } else {
  518. src = src.replace(/thumbs/, "cover").replace(/thumb/, "cover").replace(/.jpg/, "_b.jpg");
  519. }
  520. var title = img.title;
  521. var AVID = elem.find("date").eq(0).text();
  522. var date = elem.find("date").eq(1).text();
  523. var itemTag = "";elem.find("div.photo-info .btn").toArray().forEach( x=> itemTag+=x.outerHTML);
  524. return {AVID,href,src,title,date,itemTag};
  525. }
  526. },
  527. javdb: {
  528. domainReg: /(javdb)[0-9]*\./i,
  529. excludePages: ['/users/'],
  530. halfImg_block_Pages:['/uncensored','/western','/video_uncensored','/video_western'],
  531. gridSelector: 'div.movie-list.h',
  532. itemSelector: 'div.movie-list.h>div.item',
  533. widthSelector : '#grid-b',
  534. pageNext: 'a.pagination-next',
  535. pageSelector:'.pagination-list',
  536. init_Style: function(){
  537. GM_addStyle(`#grid-b .info-bottom-two{flex-grow:1}
  538. [data-theme=light] .pop-up-tag[name$='${AVINFO_SUFFIX}'] {background-color: rgb(255 255 255 / 90%);}
  539. [data-theme=dark] .scroll-request span{background:white;}
  540. [data-theme=dark] #grid-b .box-b a:link {color : inherit;}
  541. [data-theme=dark] #grid-b .box-b{background-color:#222;}
  542. [data-theme=dark] .alert-zdy {color: black;background-color: rgb(255 255 255 / 90%);}
  543. #myModal #modal-div article.message {margin-bottom: 0}`);
  544. },
  545. maxWidth: 150,//
  546. getAvItem: function (elem) {
  547. var href = elem.find("a")[0].href;
  548. var src = elem.find("div.cover>img").eq(0).attr("src");
  549. var title = elem.find("a")[0].title;
  550. var AVID = elem.find("div.video-title>strong").eq(0).text();
  551. var date = elem.find("div.meta").eq(0).text();
  552. var score = elem.find("div.score").html();
  553. var itemTag = elem.find(".tags.has-addons").html();
  554. return {AVID,href,src,title,date,itemTag,score};
  555. }
  556. //init: function(){ if(location.href.includes("/users/")){ this.widthSelector="div.section";} }
  557. },
  558. avmoo: {
  559. domainReg: /avmoo\./i,
  560. excludePages: ['/actresses'],
  561. gridSelector: 'div#waterfall',
  562. itemSelector: 'div#waterfall div.item',
  563. widthSelector : '#grid-b',
  564. pageNext: 'a[name="nextpage"]',
  565. pageSelector:'.pagination',
  566. getAvItem: function (elem) {
  567. var photoDiv = elem.find("div.photo-frame")[0];
  568. var href = elem.find("a")[0].href;
  569. var img = $(photoDiv).children("img")[0];
  570. var src = img.src.replace(/ps.jpg/, "pl.jpg");
  571. var title = img.title;
  572. var AVID = elem.find("date").eq(0).text();
  573. var date = elem.find("date").eq(1).text();
  574. var itemTag = "";elem.find("div.photo-info .btn").toArray().forEach( x=> itemTag+=x.outerHTML);
  575. return {AVID,href,src,title,date,itemTag};
  576. }
  577. },
  578. javlibrary: {
  579. domainReg: /javlibrary\./i,
  580. gridSelector: 'div.videothumblist',
  581. itemSelector: 'div.videos div.video',
  582. widthSelector : '#grid-b',
  583. pageNext: 'a.page.next',
  584. pageSelector:'.page_selector',
  585. getAvItem: function (elem) {
  586. var href = elem.find("a")[0].href;
  587. var src = elem.find("img")[0].src;
  588. if(src.indexOf("pixhost")<0){//
  589. src= src.replace(/ps.jpg/, "pl.jpg");
  590. }
  591. var title = elem.find("div.title").eq(0).text();
  592. var AVID = elem.find("div.id").eq(0).text();
  593. return {AVID,href,src,title,date: '',itemTag:''};
  594. },
  595. init_Style: function(){
  596. GM_addStyle(`${Status.get("menutoTop")?`
  597. #leftmenu {width : 100%;float: none;}
  598. #leftmenu>table { display : none;}
  599. #leftmenu .menul1,#leftmenu .menul1>ul{display: flex;align-items: center;justify-content: center;flex-wrap: wrap;}
  600. #leftmenu .menul1{padding: 5px;}
  601. #rightcolumn{margin: 0 5px;padding : 10px 5px;}`:``}
  602. #grid-b div{box-sizing: border-box;}`);
  603. },
  604. }
  605. };
  606.  
  607. function oldDriverBlock(){
  608. if(['javbus','avmoo'].includes(currentWeb)){ //
  609. if ($('.masonry').length > 0) {
  610. $('.masonry').removeClass("masonry");
  611. }
  612. let $waterfall = $('#waterfall');
  613. if($waterfall.length){
  614. $waterfall.get(0).id = "waterfall-destroy";
  615. }
  616. if($waterfall.find("#waterfall").length){ //j
  617. $waterfall.find("#waterfall").get(0).id = "";
  618. }
  619. if ($('#waterfall_h.row').length > 0) {
  620. $('#waterfall_h.row').removeAttr("id");
  621. }
  622. let $waterfall_h= $('#waterfall_h');
  623. if ($waterfall_h.length) {
  624. $waterfall_h.get(0).id = "waterfall-destroy";
  625. }
  626. if(location.pathname.search(/search/) > 0){//
  627. $('body').append('<div id="waterfall"></div>');
  628. }
  629. currentObj.gridSelector = "#waterfall-destroy";
  630. }
  631. if(['javlibrary'].includes(currentWeb)){ //
  632. let $waterfall = $('div.videothumblist');
  633. if($waterfall.length){
  634. $waterfall.removeClass("videothumblist");
  635. $waterfall.find(".videos").removeClass("videos");
  636. $waterfall.get(0).id = "waterfall-destroy";
  637. }
  638. currentObj.gridSelector = "#waterfall-destroy";
  639. }
  640. }
  641. class Page{
  642. constructor(){
  643. for (let key in ConstCode) {
  644. let domainReg = ConstCode[key].domainReg;
  645. if (domainReg && domainReg.test(location.href)) {
  646. currentWeb = key;//
  647. break;
  648. }
  649. }
  650. currentObj = ConstCode[currentWeb];
  651. if (currentObj.excludePages) {
  652. for (let page of currentObj.excludePages) {
  653. if (location.pathname.includes(page)) return;
  654. }
  655. }
  656. if (currentObj.halfImg_block_Pages) {
  657. for (let blockPage of currentObj.halfImg_block_Pages) {
  658. if (location.href.includes(blockPage)) {
  659. Status.halfImg_block = true;
  660. break;
  661. };
  662. }
  663. }
  664. this.render();
  665. }
  666. render(){
  667. let $items = $(currentObj.itemSelector);
  668. if ($items.length<1) return;
  669. oldDriverBlock();
  670. addStyle();
  671. currentObj.init_Style?.();
  672. let menu = new SettingMenu();
  673. lazyLoad = new LazyLoad({
  674. callback_loaded: function (img) {
  675. $(img).removeClass("minHeight-200");
  676. imgCallback(img);
  677. }
  678. });
  679. let gridPanel = new GridPanel($items,lazyLoad);
  680. myModal = new Popover();//
  681. if(Status.get("autoPage") && $(currentObj.pageSelector).length ){
  682. scroller=new ScrollerPlugin(gridPanel.$dom,lazyLoad);
  683. }
  684. }
  685. }
  686. class GridPanel{
  687. constructor($items,lazyLoad){
  688. this.$dom=$(`<div id= 'grid-b'></div>`);
  689. $(currentObj.gridSelector).hide().eq(0).before(this.$dom);
  690. let $elems = this.constructor.parseItems($items);
  691. this.$dom.append($elems);
  692. lazyLoad.update();
  693. }
  694. static parseItems(elems){
  695. let elemsHtml = "";
  696. let {imgStyle,getAvItem,toolBar,copyBtn,fullTitle,magnet,magnetTip,downloadTip,pictureTip} = {
  697. imgStyle: Status.isHalfImg() ? halfImgCSS : fullImgCSS,
  698. getAvItem: currentObj.getAvItem,
  699. toolBar: Status.get("toolBar")?'':'hidden-b',
  700. copyBtn: Status.get("copyBtn")?'':'hidden-b',
  701. fullTitle: Status.get("fullTitle")?'':'titleNowrap',
  702. magnet: ['javbus','javdb'].includes(currentWeb)?'':'hidden-b',
  703. magnetTip : lang.tool_magnetTip,
  704. downloadTip: lang.tool_downloadTip,
  705. pictureTip: lang.tool_pictureTip,
  706. };
  707. for (let i = 0; i < elems.length; i++) {
  708. let tag = elems.eq(i);
  709. let html = "";
  710. if (currentWeb!="javdb" && tag.find(".avatar-box").length) {
  711. tag.find(".avatar-box").addClass("avatar-box-b").removeClass("avatar-box");
  712. html = `<div class='item-b'>${tag.html()}</div>`;
  713. }else{
  714. let AvItem = getAvItem(tag);
  715. html = `<div class="item-b">
  716. <div class="box-b">
  717. <div class="cover-b">
  718. <a href="${AvItem.href}" target="_blank"><img style="${imgStyle}" class="lazy minHeight-200" data-src="${AvItem.src}" ></a>
  719. </div>
  720. <div class="detail-b">
  721. <a name="av-title" href="${AvItem.href}" target="_blank" title="${AvItem.title}" class="${fullTitle}"><span class="tool-span copy-span ${copyBtn}" name="copy">${copy_Svg}</span> <span>${AvItem.title}</span></a>
  722. <div class="info-bottom">
  723. <div class="info-bottom-one">
  724. <a href="${AvItem.href}" target="_blank"><span class="tool-span copy-span ${copyBtn}" name="copy">${copy_Svg}</span><date name="avid">${AvItem.AVID}</date>${AvItem.date?` / ${AvItem.date}`:""}</a>
  725. </div>
  726. ${AvItem.score?`<a href="${AvItem.href}" target="_blank"><div class="score">${AvItem.score}</div></a>`:``}
  727. <div class="info-bottom-two">
  728. <div class="item-tag">${AvItem.itemTag}</div>
  729. <div class="toolbar-b ${toolBar}" item-id="${AvItem.AVID}${Math.random().toString(16).slice(2)}" >
  730. <span name="magnet" class="tool-span ${magnet}" title="${magnetTip}" AVID="${AvItem.AVID}" data-href="${AvItem.href}">${magnet_Svg}</span>
  731. <span name="download" class="tool-span" title="${downloadTip}" src="${AvItem.src}" src-title="${AvItem.AVID} ${AvItem.title}">${download_Svg}</span>
  732. <span name="picture" class="tool-span" title="${pictureTip}" AVID="${AvItem.AVID}" >${picture_Svg}</span>
  733. </div>
  734. </div>
  735. </div>
  736. </div>
  737. </div>
  738. </div>`;
  739. }
  740. elemsHtml = elemsHtml + html;
  741. }
  742. let $elems = $(elemsHtml);
  743. $elems.find("span[name]").click(function () {
  744. let name = $(this).attr("name");
  745. switch (name) {
  746. case "copy":GM_setClipboard($(this).next().text());showAlert(lang.copySuccess);return false;
  747. case "download":GM_download($(this).attr("src"), $(this).attr("src-title")+".jpg");break;
  748. case "magnet":showMagnetTable($(this).parent("div").attr("item-id"),$(this).attr("AVID").replace(/\./g, '-'),$(this).attr("data-href"),this);break;
  749. case "picture":showBigImg($(this).parent("div").attr("item-id"),$(this).attr("AVID"),this);break;
  750. default:break;
  751. }
  752. });
  753. return $elems;
  754. }
  755. }
  756. class ScrollerPlugin{
  757. constructor(waterfall,lazyLoad){
  758. let me=this;
  759. me.waterfall=waterfall;
  760. me.lazyLoad=lazyLoad;
  761. let $pageNext=$(currentObj.pageNext);
  762. me.nextURL = $pageNext.attr('href');
  763. me.scroller_status=$(`<div class = "scroller-status" style="text-align:center;display:none"><div class="scroll-request"><span></span><span></span><span></span><span></span></div><h2 class="scroll-last">${lang.scrollerPlugin_end}</h2></div>`);
  764. me.waterfall.after(me.scroller_status);
  765. me.locked=false;
  766. me.canLoad=true;
  767. me.$page=$(currentObj.pageSelector);
  768. me.domWatch_func=me.domWatch.bind(me);
  769. document.addEventListener('scroll',me.domWatch_func);
  770. if (history.scrollRestoration) {
  771. history.scrollRestoration = 'manual';//
  772. }
  773. }
  774. domWatch (){
  775. let me = this;
  776. if (me.$page.get(0).getBoundingClientRect().top - $(window).height() < 300 && (!me.locked) && (me.canLoad)) {
  777. me.locked=true;
  778. me.loadNextPage(me.nextURL).then(()=>{me.locked=false});
  779. }
  780. }
  781. async loadNextPage(url){
  782. this.showStatus('request');
  783. console.log(url);
  784. let responseText = await fetch(url, { credentials: 'same-origin' }).then(respond=>respond.text());
  785. let $body = $(new DOMParser().parseFromString(responseText, 'text/html'));
  786. let elems = GridPanel.parseItems($body.find(currentObj.itemSelector));
  787. if (currentWeb != "javdb" && location.pathname.includes('/star/') && elems) {
  788. elems=elems.slice(1);
  789. }
  790. this.scroller_status.hide();
  791. this.waterfall.append(elems);
  792. this.lazyLoad.update();
  793. //history.pushState({}, "", url);
  794. this.nextURL = $body.find(currentObj.pageNext).attr('href');
  795. if(!this.nextURL){
  796. this.canLoad=false;
  797. this.showStatus("last");
  798. }
  799. }
  800. showStatus(status){
  801. this.scroller_status.children().each( (i,e)=>{$(e).hide()});
  802. this.scroller_status.find(`.scroll-${status}`).show();
  803. this.scroller_status.show();
  804. }
  805. destroy (){
  806. this.scroller_status.remove();
  807. document.removeEventListener('scroll',this.domWatch_func);
  808. }
  809. }
  810.  
  811. const addStyle = () => {
  812. let columnNum = Status.getColumnNum();
  813. let waterfallWidth=Status.get("waterfallWidth");
  814. let css_waterfall = `
  815. ${currentObj.widthSelector}{width:${waterfallWidth}%;margin:0 ${waterfallWidth>100?(100-waterfallWidth)/2+'%':'auto'};transition:.5s ;}
  816. #grid-b{display:flex;flex-direction:row;flex-wrap:wrap;}
  817. #grid-b .item-b{padding:5px;width:${100 / columnNum}%;transition:.5s ;animation: fadeInUp .5s ease-out;}
  818. #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}
  819. #grid-b .box-b a:link{color:black}
  820. #grid-b .box-b a:visited{color:gray}
  821. #grid-b .box-b .cover-b{text-align:center}
  822. #grid-b .box-b .detail-b{padding:7px}
  823. #grid-b .box-b .detail-b a{display:block}
  824. #grid-b .info-bottom,.info-bottom-two{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}
  825. #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)}
  826. #grid-b .avatar-box-b p{margin:0 !important}
  827. #grid-b date:first-of-type{font-size:18px !important}
  828. #grid-b .toolbar-b{float:right;padding:2px;white-space:nowrap}
  829. #grid-b .toolbar-b span{margin-right:2px}
  830. #grid-b .copy-span{vertical-align:middle;display:inline-block}
  831. #grid-b span.tool-span{cursor:pointer;opacity:.3}
  832. #grid-b span.tool-span:hover{opacity:1}
  833. #grid-b .item-tag{display:inline-block;white-space:nowrap}
  834. #grid-b .hidden-b{display:none}
  835. #grid-b .minHeight-200{min-height:200px}
  836. #grid-b .cover-b img:not([src]) {visibility: hidden;}
  837. svg.tool-svg{fill:currentColor;width:22px;height:22px;vertical-align:middle}
  838. span.span-loading{display:inline-block;animation:span-loading 2s infinite}
  839.  
  840. #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)}
  841. #myModal #modal-div{position:relative;width:80%;margin:0 auto;background-color:rgb(6 6 6 / 50%);border-radius:8px;animation:fadeInDown .5s}
  842. #modal-div .pop-up-tag{border-radius:8px;overflow:hidden}
  843. #modal-div .sample-box-zdy,.avatar-box-zdy{display:inline-block;border-radius:8px;background-color:#fff;overflow:hidden;margin:5px;width:140px}
  844. #modal-div .sample-box-zdy .photo-frame{overflow:hidden;margin:10px}
  845. #modal-div .sample-box-zdy img{height:90px}
  846. #modal-div .avatar-box-zdy .photo-frame{overflow:hidden;height:120px;margin:10px}
  847. #modal-div .avatar-box-zdy img{height:120px}
  848. #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}
  849.  
  850. #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%)}
  851. #menu-div>div:hover{background-color:gainsboro}
  852. #menu-div .switch-div{display:flex;align-items:center;font-size:large;font-weight:bold}
  853. #menu-div .switch-div *{margin:0;padding:4px}
  854. #menu-div .switch-div label{flex-grow:1}
  855. #menu-div .range-div{display:flex;flex-direction:row;flex-wrap:nowrap}
  856. #menu-div .range-div input{cursor:pointer;width:80%;max-width:200px}
  857. .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}
  858. .titleNowrap{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}
  859. .download-icon{position:absolute;right:0;z-index:2;cursor:pointer}
  860. .download-icon>svg{width:30px;height:30px;fill:aliceblue}
  861. @keyframes fadeInUp{0%{transform:translate3d(0,10%,0);opacity:.5}100%{transform:none;opacity:1}}
  862. @keyframes fadeInDown{0%{transform:translate3d(0,-100%,0);opacity:0}100%{transform:none;opacity:1}}
  863. @keyframes itemShow{0%{transform:scale(0)}100%{transform:scale(1)}}
  864. @keyframes span-loading{0%{transform:scale(1);opacity:1}50%{transform:scale(1.2);opacity:1}100%{transform:scale(1);opacity:1}}
  865. .scroll-request{text-align:center;height:15px;margin:15px auto}
  866. .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}
  867. @keyframes scroll-load{0%,100%{transform:scale(1)} 50%{transform:scale(0)}}
  868. .scroll-request span:nth-child(2){animation-delay:0.125s}
  869. .scroll-request span:nth-child(3){animation-delay:0.25s}
  870. .scroll-request span:nth-child(4){animation-delay:0.375s}
  871. .imgResult-li{color:rgb(255,255,255,50%);font-size:20px}
  872. .imgResult-li.imgResult-Current{color:white}
  873. .imgResult-loading{animation:changeTextColor 1s ease-in infinite}
  874. .imgResult-li:hover{cursor:pointer;color:white}
  875. @keyframes changeTextColor{0%{color:rgba(255,255,255,1)}50%{color:rgba(255,255,255,.5)}100%{color:rgba(255,255,255,1)}}`;
  876. GM_addStyle(css_waterfall);
  877. }
  878.  
  879. new Page();
  880.  
  881. function initImageElement(imageElement, dateElement) {
  882. imageElement.setAttribute('title', '');
  883.  
  884. if (dateElement.innerText.includes("FC2-")) {
  885. dateElement.innerText = dateElement.innerText.replace("FC2-", "fc2-ppv-");
  886. }
  887.  
  888. let videoElement;
  889. let coverElement;
  890. let isVideoShowing = false;
  891.  
  892.  
  893. imageElement.addEventListener("mouseenter", function (event) {
  894. let timeoutId;
  895.  
  896. timeoutId = setTimeout(function () {
  897. if (!isVideoShowing) {
  898. const dateValue = dateElement.innerText.toLowerCase();
  899. const previewUrl = `https://eightcha.com/${dateValue}/preview.mp4`
  900.  
  901. coverElement = document.createElement("div");
  902.  
  903. videoElement = document.createElement("video");
  904. videoElement.setAttribute("controls", "");
  905. videoElement.setAttribute("autoplay", "");
  906. videoElement.setAttribute("muted", "");
  907. videoElement.setAttribute("loop", "");
  908. videoElement.style.pointerEvents = 'none';
  909. videoElement.style.zIndex = '9999';
  910.  
  911. const sourceElement = document.createElement("source");
  912. sourceElement.setAttribute("src", previewUrl);
  913. sourceElement.setAttribute("type", "video/mp4");
  914.  
  915. videoElement.appendChild(sourceElement);
  916. coverElement.appendChild(videoElement);
  917. document.body.appendChild(coverElement);
  918.  
  919. const x = event.clientX;
  920. const y = event.clientY;
  921. const vw = window.innerWidth;
  922. const vh = window.innerHeight;
  923. const w = Math.min(vw * 0.8, 450);
  924. const h = w * 9 / 16;
  925. let left = x - w / 2;
  926. let top = y - h / 2;
  927. if (left < 0) {
  928. left = 0;
  929. } else if (left + w > vw) {
  930. left = vw - w;
  931. }
  932. if (top < 0) {
  933. top = 0;
  934. } else if (top + h > vh) {
  935. top = vh - h;
  936. }
  937. videoElement.style.position = "fixed";
  938. videoElement.style.width = `${w}px`;
  939. videoElement.style.height = `${h}px`;
  940. videoElement.style.top = `${top}px`;
  941. videoElement.style.left = `${left}px`;
  942.  
  943. imageElement.style.transform = "scale(1)";
  944.  
  945. isVideoShowing = true;
  946. }
  947. }, 1500);
  948.  
  949.  
  950. imageElement.addEventListener("mouseleave", function () {
  951. clearTimeout(timeoutId);
  952.  
  953. if (isVideoShowing) {
  954. document.body.removeChild(coverElement);
  955. isVideoShowing = false;
  956. }
  957.  
  958. imageElement.style.transform = "scale(1)";
  959. });
  960. });
  961. }
  962.  
  963.  
  964. function observeGridChanges() {
  965. var gridElement = document.getElementById('grid-b');
  966. var itemElements = gridElement.querySelectorAll('.item-b');
  967. var titleElements = gridElement.querySelectorAll("div.info-bottom-one > a > date");
  968. var imageElements = gridElement.querySelectorAll("div.cover-b > a > img");
  969.  
  970. for (let i = 0; i < imageElements.length; i++) {
  971. const imageElement = imageElements[i];
  972. const dateElement = titleElements[i];
  973.  
  974. initImageElement(imageElement, dateElement);
  975. }
  976.  
  977. var observer = new MutationObserver(() => {
  978. var newItemElements = gridElement.querySelectorAll('.item-b');
  979. var newTitleElements = gridElement.querySelectorAll("div.info-bottom-one > a > date");
  980. var newImageElements = gridElement.querySelectorAll("div.cover-b > a > img");
  981.  
  982. if (newItemElements.length > itemElements.length) {
  983. for (let i = itemElements.length; i < newItemElements.length; i++) {
  984. const imageElement = newImageElements[i];
  985. const dateElement = newTitleElements[i];
  986.  
  987. initImageElement(imageElement, dateElement);
  988. }
  989.  
  990. itemElements = newItemElements;
  991. titleElements = newTitleElements;
  992. imageElements = newImageElements;
  993. }
  994. });
  995.  
  996. observer.observe(gridElement, { childList: true });
  997. }
  998.  
  999. observeGridChanges();
  1000. })();