JavBus library trailer

JavBus&library图书馆预告片花Direct,番号页封面下直接显示,默认不播放

As of 2022-09-21. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         JavBus library trailer
// @name:zh-CN   JavBus&library图书馆预告片花Direct
// @namespace    https://greasyfork.org/zh-CN/scripts/441120-javbus-library-trailer
// @homepageURL  https://greasyfork.org/zh-CN/scripts/441120-javbus-library-trailer
// @version      2022.0922.0205
// @description         JavBus&library图书馆预告片花Direct,番号页封面下直接显示,默认不播放
// @description:zh-cn   JavBus&library图书馆预告片花Direct,番号页封面下直接显示,默认不播放
// @author       匿名
// @license      GPL

// @include      /^.*(jav|bus|dmm|see|cdn|fan){2}\..*$/
// @include      *://*.javlib.com/*
// @include      *://*.javlibrary.com/*
// @include     *://*/cn/?v=jav*
// @include     *://*/en/?v=jav*
// @include     *://*/tw/?v=jav*
// @include     *://*/ja/?v=jav*
// @include      *://*/tw/movie/jav*
// @match      *://*.javlib.com/*
// @match      *://*.javlibrary.com/*
// @match      *://www.javbus.com/*
// @grant        GM_download
// @grant        GM_xmlhttpRequest
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_notification
// @grant        GM_setClipboard
// @grant        GM_getResourceURL

// @connect      btsow.club
// ==/UserScript==

/**
 *  - 2022-09-15 重新对片花地址进行修正,支持bus和图书馆,并公开分享脚本,期待愈加完善
 *  - 以下为历史记录
 *  - 2022-03-08
 *    脚本由 https://greasyfork.org/zh-CN/scripts/400267-javbus 二次修改以兼容老司机脚本
 *  - 只保留 预告片 功能,其它剔除
 *  - 可根据电脑分辨率自行调整播放器宽度,高度会自适应(搜索1120px修改合适值)
 *  - (脚本是在和老司机脚本做兼容,不保证兼容其它脚本,水平有限,仅作自用,不予公开)
 */
(function () {
    'use strict';
    function GM_addStyle(css) {
        const style = document.getElementById("GM_addStyleBy8626") || (function () {
            const style = document.createElement('style');
            style.type = 'text/css';
            style.id = "GM_addStyleBy8626";
            document.head.appendChild(style);
            return style;
        })();
        style.innerHTML = css;
    }
    /**
     * 左则补零
     * @param num
     * @param len
     * @returns {*}
     */
    function format_zero(num, len) {
        if (String(num).length > len) return num;
        return (Array(len).join(0) + num).slice(-len);
    }

    //瀑布流
    class Waterfull {
        constructor() {
            // 瀑布流状态:1:开启、0:关闭
            this.waterfullScrollStatus = GM_getValue('scroll_status', 1);
            this.done = true;
            this.masonryObj = null;
            this.config = {};
        }

        init(config) {
            this.config = config;
            //滚动
            if (this.waterfullScrollStatus > 0 && $(this.config['pagination']).length > 0) {
                document.addEventListener('scroll', this.scroll.bind(this));
            }
            if (this.config['useMasonry']) {
                this.masonryObj = $(this.config['selector']).masonry({
                    itemSelector: this.config['items'],
                    isAnimated  : false,
                    isFitWidth  : true
                })
            }
        }

        //滚动到底获取数据
        scroll() {
            if ($(this.config['pagination'])[0].getBoundingClientRect().top - $(window).height() < 500 && this.done) {
                this.getData();
            }
        };

        //获取数据
        getData() {
            let url = $(this.config['next']).attr('href');
            let _this = this;
            if (url !== undefined) {
                this.done = false;
                fetch(url, {credentials: 'same-origin'})
                    .then(function (response) {
                        return response.text();
                    })
                    .then(function (html) {
                        let dom = new DOMParser().parseFromString(html, 'text/html');
                        dom = $(dom);
                        let avatarBox = dom.find(_this.config['items']).find('.avatar-box');
                        if (avatarBox.length > 0) {
                            avatarBox.parent().remove();
                        }
                        let elems = dom.find(_this.config['items']);
                        elems.each(function (i) {
                            $(this).attr('style', '');
                            $(this).find('a').attr('target', '_blank')
                            if (_this.config['selector'] === 'div#video_comments') {
                                let text = $(this).find('textarea').val();
                                text = text.replace(/\[url=([^\[\]]*?)\](.*?)\[\/url\]/g, '<a href="redirect.php?url=$1" target="_blank">$2</a>')
                                text = text.replace(/\[color=([^\[\]]*?)\](.*?)\[\/color\]/g, '<span style="color:$1">$2</span>')
                                text = text.replace(/\[b\](.*?)\[\/b\]/g, '<b>$1</b>')
                                $(this).find('.text').html(text).css('width', '442px');
                            }
                        });
                        $(_this.config['pagination']).html(dom.find(_this.config['pagination']).html());
                        $(_this.config['selector']).append(elems);
                        if (_this.config['useMasonry']) {
                            _this.masonryObj.masonry('appended', elems).masonry();
                        }
                        _this.done = true;
                    })
            }
        }
    }
    class Request {
        constructor() {
            this.lock = [];
        }
        send(url, successCallback) {
            let _this = this;
            return new Promise(function (resolve, reject) {
                let index = _this.lock.indexOf(url);
                if (index === -1) {
                    _this.lock.push(url);
                    GM_xmlhttpRequest({
                        url,
                        method   : 'GET',
                        headers  : {
                            "Cache-Control": "no-cache"
                        },
                        timeout  : 30000,
                        onload   : function (response) {
                            console.log(url + ' success');
                            _this.lock.splice(index, 1);
                            resolve(response);
                        },
                        onabort  : (e) => {
                            console.log(url + " abort");
                            reject("wrong");
                        },
                        onerror  : (e) => {
                            console.log(url + " error");
                            console.log(e);
                            reject("wrong");
                        },
                        ontimeout: (e) => {
                            console.log(url + " timeout");
                            reject("wrong");
                        },
                    });
                } else {
                    reject("发送请求ing");
                }
            }).then(function (response) {
                successCallback(response);
            }, function (err) {
                console.log(err)
            });
        }
    }

    class Base {

        downloadPic(title, imgUrl) {
            GM_download({
                url   : imgUrl,
                saveAs: true,
                name  : title + imgUrl.substring(imgUrl.lastIndexOf("."))
            });
        }
        addVideo(code, obj) {
            let codeArr = code.split(/-|_|\s/);
            let videoSeries = codeArr[0].toLowerCase();
            let videoNo = format_zero(codeArr[1], 5);
					  let videoTwo = codeArr[1].substring(1);
            let videoUrl = '//cc3001.dmm.co.jp/litevideo/freepv/' + videoSeries[0] + '/' + videoSeries.substr(0, 3) + '/' + videoSeries + videoNo + '/' + videoSeries + videoNo + '_dmb_w.mp4';
            if (code.indexOf('HEYZO') !== -1) {
                videoUrl = 'https://www.heyzo.com/contents/3000/' + codeArr[1] + '/heyzo_hd_' + codeArr[1] + '_sample.mp4'
            }
            if (code.indexOf('_001') !== -1) {
                videoUrl = 'http://smovie.1pondo.tv/sample/movies/' + code + '/1080p.mp4'
            }  //一本道 1pondo
            if (code.indexOf('-001') !== -1) {
                videoUrl = 'https://smovie.caribbeancom.com/sample/movies/' + code + '/1080p.mp4'
            }  //加勒比 carib
            if (code.indexOf('crazyasia') !== -1) {
                videoUrl = 'https://smovie.caribbeancom.com/sample/movies/' + code + '/1080p.mp4'
            }  //加勒比 carib
            if (null != location.href.match(/AB-/)){
                videoUrl = 'https://my.cdn.tokyo-hot.com/media/samples/' + code + '.mp4'
            }  //东京热 tokyo-hot AB-001

            let videoUrl2 = '//cc3001.dmm.co.jp/litevideo/freepv/' + videoSeries[0] + '/' + videoSeries.substr(0, 3) + '/' + videoSeries + codeArr[1] + '/' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl3 = '//cc3001.dmm.co.jp/litevideo/freepv/1/1' + videoSeries.substr(0, 2) + '/1' + videoSeries + codeArr[1] + '/1' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl4 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1324' + videoSeries + codeArr[1] + '/h_1324' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl5 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1472' + videoSeries + videoNo + '/h_1472' + videoSeries + videoNo + '_dmb_w.mp4';
            let videoUrl6 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_113' + videoSeries + codeArr[1] + '/h_113' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl7 = '//cc3001.dmm.co.jp/litevideo/freepv/1/118/118' + videoSeries + videoNo + '/118' + videoSeries + videoNo + '_dmb_w.mp4';
            let videoUrl8 = '//cc3001.dmm.co.jp/litevideo/freepv/1/118/118' + videoSeries + codeArr[1] + '/118' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl9 = '//cc3001.dmm.co.jp/litevideo/freepv/5/53' + videoSeries.substr(0, 1) + '/53' + videoSeries + codeArr[1] + '/53' + videoSeries + codeArr[1] + '_sm_s.mp4';
					  let videoUrl10 = '//cc3001.dmm.co.jp/litevideo/freepv/5/53' + videoSeries.substr(0, 1) + '/53' + videoSeries + codeArr[1] + '/53' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl11 = '//cc3001.dmm.co.jp/litevideo/freepv/1/13' + videoSeries.substr(0, 1) + '/13' + videoSeries + codeArr[1] + '/13' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl12 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_6/h_687' + videoSeries + codeArr[1] + '/h_687' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl13 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1594' + videoSeries + videoNo + '/h_1594' + videoSeries + videoNo + '_dmb_w.mp4';
            let videoUrl14 = '//cc3001.dmm.co.jp/litevideo/freepv/1/1' + videoSeries.substr(0, 2) + '/1' + videoSeries + videoNo + '/1' + videoSeries + videoNo + '_dmb_w.mp4';
            let videoUrl15 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1100' + videoSeries + codeArr[1] + '/h_1100' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl16 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_2/h_283' + videoSeries + codeArr[1] + '/h_283' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl17 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_4/h_491' + videoSeries + codeArr[1] + '/h_491' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl18 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1616' + videoSeries + videoNo + '/h_1616' + videoSeries + videoNo + '_dmb_w.mp4';
					  let videoUrl19 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1386' + videoSeries + videoNo + '/h_1386' + videoSeries + videoNo + '_dmb_w.mp4';
            let videoUrl20 = '//cc3001.dmm.co.jp/litevideo/freepv/5/55' + videoSeries.substr(0, 1) + '/55' + videoSeries + codeArr[1] + '/55' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl21 = '//cc3001.dmm.co.jp/litevideo/freepv/1/12l/12' + videoSeries + codeArr[1] + '/12' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl22 = '//cc3001.dmm.co.jp/vrsample/h/h_9/h_955' + videoSeries + videoNo + '/h_955' + videoSeries + videoNo + 'vrlite.mp4';
            let videoUrl23 = '//cc3001.dmm.co.jp/vrsample/2/24d/24' + videoSeries + videoNo + '/24' + videoSeries + videoNo + 'vrlite.mp4';
            let videoUrl24 = '//cc3001.dmm.co.jp/vrsample/h/h_1/h_1321' + videoSeries + videoNo + '/h_1321' + videoSeries + videoNo + 'vrlite.mp4';
            let videoUrl25 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1560' + videoSeries + videoNo + '/h_1560' + videoSeries + videoNo + '_dmb_w.mp4';
            let videoUrl26 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1160' + videoSeries + codeArr[1] + '/h_1160' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl27 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_2/h_254' + videoSeries + codeArr[1] + '/h_254' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl28 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_2/h_227' + videoSeries + videoNo + '/h_227' + videoSeries + videoNo + '_dmb_w.mp4';
            let videoUrl29 = '//cc3001.dmm.co.jp/litevideo/freepv/1/125/125' + videoSeries + codeArr[1] + '/125' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl30 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_3/h_346' + videoSeries + codeArr[1] + '/h_346' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl31 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1495' + videoSeries + codeArr[1] + '/h_1495' + videoSeries + codeArr[1] + '_dmb_w.mp4';
					  let videoUrl32 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_0/h_068' + videoSeries + codeArr[1] + '/h_068' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl33 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_0/h_086' + videoSeries + videoTwo + '/h_086' + videoSeries + videoTwo + '_dmb_w.mp4';
            let videoUrl34 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_0/h_086' + videoSeries + videoTwo + '/h_086' + videoSeries + videoTwo + '_sm_w.mp4';
					  let videoUrl35 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_0/h_086' + videoSeries + codeArr[1] + '/h_086' + videoSeries + codeArr[1] + '_dmb_w.mp4';
            let videoUrl36 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_0/h_086' + videoSeries + videoTwo + '/h_086' + videoSeries + videoTwo + '_dm_w.mp4';
					  let videoUrl37 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_1160' + videoSeries + videoTwo + '/h_1160' + videoSeries + videoTwo + '_dm_w.mp4';
					  let videoUrl38 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_6/h_635' + videoSeries + codeArr[1] + '/h_635' + videoSeries + codeArr[1] + '_dmb_w.mp4';
					  let videoUrl39 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_6/h_635' + videoSeries + codeArr[1] + '/h_635' + videoSeries + codeArr[1] + '_sm_w.mp4';
					  let videoUrl40 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_127' + videoSeries + videoNo + '/h_127' + videoSeries + videoNo + '_dmb_w.mp4';
					  let videoUrl41 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_127' + videoSeries + codeArr[1] + '/h_127' + videoSeries + codeArr[1] + '_sm_s.mp4';
					  let videoUrl42 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_4/h_480' + videoSeries + videoNo + '/h_480' + videoSeries + videoNo + '_dm_w.mp4';  //AAJB-143
					  let videoUrl43 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_1/h_170' + videoSeries + codeArr[1] + '/h_170' + videoSeries + codeArr[1] + '_dmb_w.mp4';  //AAK-048
					  let videoUrl44 = '//cc3001.dmm.co.jp/litevideo/freepv/h/h_2/h_237' + videoSeries + codeArr[1] + '/h_237' + videoSeries + codeArr[1] + '_dmb_w.mp4';   //FIND-002
					  let videoUrl95 = 'http://smovie.1pondo.tv/sample/movies/' + code + '/1080p.mp4';  //一本道 1pondo
					  let videoUrl96 = 'https://www.prestige-av.com/sample_movie/TKT' + code + '.mp4';
					  let videoUrl97 = 'https://sample.mgstage.com/sample/fullsail/' + videoSeries + '/' + codeArr[1] + '/' + code + '.mp4';  //ABC-056
					  let videoUrl98 = 'https://my.cdn.tokyo-hot.com/media/samples/' + code + '.mp4';	  //东京热 tokyo-hot AB-001
            let videoUrl99 = 'https://smovie.caribbeancom.com/sample/movies/' + code + '/1080p.mp4';  //加勒比 carib
					  let videoUrl100 = '//cc3001.dmm.co.jp/litevideo/freepv/' + videoSeries[0] + '/' + videoSeries.substr(0, 3) + '/' + videoSeries + videoNo + '/' + videoSeries + videoNo + '_dmb_w.mp4';
            let video = $('<div style="text-align: center;padding: 10px;border-radius: 4px;border: 1px solid #ccc;margin: 10px 0;">\
                          <video controls style="width: 1120px;">\
                          <source src="' + videoUrl + '" type="video/mp4" />\
                          <source src="' + videoUrl2 + '" type="video/mp4" />\
                          <source src="' + videoUrl3 + '" type="video/mp4" />\
                          <source src="' + videoUrl4 + '" type="video/mp4" />\
                          <source src="' + videoUrl5 + '" type="video/mp4" />\
                          <source src="' + videoUrl6 + '" type="video/mp4" />\
                          <source src="' + videoUrl7 + '" type="video/mp4" />\
                          <source src="' + videoUrl8 + '" type="video/mp4" />\
                          <source src="' + videoUrl9 + '" type="video/mp4" />\
                          <source src="' + videoUrl10 + '" type="video/mp4" />\
                          <source src="' + videoUrl11 + '" type="video/mp4" />\
                          <source src="' + videoUrl12 + '" type="video/mp4" />\
                          <source src="' + videoUrl13 + '" type="video/mp4" />\
                          <source src="' + videoUrl14 + '" type="video/mp4" />\
                          <source src="' + videoUrl15 + '" type="video/mp4" />\
                          <source src="' + videoUrl16 + '" type="video/mp4" />\
                          <source src="' + videoUrl17 + '" type="video/mp4" />\
                          <source src="' + videoUrl18 + '" type="video/mp4" />\
                          <source src="' + videoUrl19 + '" type="video/mp4" />\
                          <source src="' + videoUrl20 + '" type="video/mp4" />\
                          <source src="' + videoUrl21 + '" type="video/mp4" />\
                          <source src="' + videoUrl22 + '" type="video/mp4" />\
                          <source src="' + videoUrl23 + '" type="video/mp4" />\
                          <source src="' + videoUrl24 + '" type="video/mp4" />\
                          <source src="' + videoUrl25 + '" type="video/mp4" />\
                          <source src="' + videoUrl26 + '" type="video/mp4" />\
                          <source src="' + videoUrl27 + '" type="video/mp4" />\
                          <source src="' + videoUrl28 + '" type="video/mp4" />\
                          <source src="' + videoUrl29 + '" type="video/mp4" />\
                          <source src="' + videoUrl30 + '" type="video/mp4" />\
                          <source src="' + videoUrl31 + '" type="video/mp4" />\
                          <source src="' + videoUrl32 + '" type="video/mp4" />\
                          <source src="' + videoUrl33 + '" type="video/mp4" />\
                          <source src="' + videoUrl34 + '" type="video/mp4" />\
                          <source src="' + videoUrl35 + '" type="video/mp4" />\
                          <source src="' + videoUrl36 + '" type="video/mp4" />\
                          <source src="' + videoUrl37 + '" type="video/mp4" />\
                          <source src="' + videoUrl38 + '" type="video/mp4" />\
                          <source src="' + videoUrl39 + '" type="video/mp4" />\
                          <source src="' + videoUrl40 + '" type="video/mp4" />\
                          <source src="' + videoUrl41 + '" type="video/mp4" />\
                          <source src="' + videoUrl42 + '" type="video/mp4" />\
                          <source src="' + videoUrl43 + '" type="video/mp4" />\
                          <source src="' + videoUrl44 + '" type="video/mp4" />\
                          <source src="' + videoUrl95 + '" type="video/mp4" />\
                          <source src="' + videoUrl96 + '" type="video/mp4" />\
                          <source src="' + videoUrl97 + '" type="video/mp4" />\
                          <source src="' + videoUrl98 + '" type="video/mp4" />\
                          <source src="' + videoUrl99 + '" type="video/mp4" />\
                          <source src="' + videoUrl100 + '" type="video/mp4" />\
                          </video>\
                          </div>');
            $(obj).before(video)
        }
    }

    class JavBus extends Base {
        constructor(Request, Waterfull) {
            super(Request, Waterfull);
            GM_addStyle(`
                .info a.red {color:red;padding-right:15px;}
                .screencap {
                        position: relative;
                }
                .screencap a.download {
                    position: absolute;
										background: #fff;
                    background:rgba(255,255,255,0.7);
                    font-size: 12px;
                    right: 20px;
                    top: 5px;
                    border:0px solid;
                    border-radius: 4px;
                    padding: 2px 3px;
                    border-radius: 5px;
                }
            `);
            if ($('.col-md-3.info').length > 0) {
                this.detailPage();
            }
        }

        detailPage() {
            let _this = this;
            let info = $('.col-md-3.info');
            //标题
            let title = $('.container > h3').text();
            //识别码
            let codeRow = info.find('p').eq(0);
            let code = codeRow.find('span').eq(1).html();
            let studioN = info.find('p').eq(3);
            let studio = studioN.find('a[href]').eq(0).html();
            codeRow.append($('<span style="color:red">←点击复制</span>'));
            codeRow.on('click', function () {
                GM_setClipboard(code);
                $(this).find('span').eq(2).html('←已复制到黏贴板');
            });
            //添加预告视频观看按钮
            this.addVideo(code, '#mag-submit-show')
            //添加跳转到javlibrary链接
            info.append("<p><a class='red' href='http://www.javlibrary.com/cn/vl_searchbyid.php?keyword=" + code + "' target='_blank'>javlibrary</a><a class='red' href='https://javdb005.com/search?q=" + code + "' target='_blank'>javdb</a><a class='red' href='https://dd7448.com/serch_censored.htm?skey=" + code + "' target='_blank'>javbooks</a></p>");
            //封面图添加下载按钮
            let downloadBtn = $('<a class="download">' + studio + '&nbsp;&nbsp;封面下载</a>');
            let imgUrl = $('.screencap img').attr('src');
            downloadBtn.on('click', function (e) {
                e.stopPropagation();
                _this.downloadPic(title, imgUrl);
                return false;
            });
            downloadBtn.attr('download', code);
            $('.screencap').append(downloadBtn);
        }
    }

    class JavLibrary extends Base {
        constructor(Request, Waterfull) {
            super(Request, Waterfull);
            GM_addStyle(`
                .header a.red {color:red;padding-right:15px;}
                #video_info td {
                    vertical-align: text-bottom;
                }
                #video_jacket {
                    position: relative;
                }
                #video_jacket a {
                    position: absolute;
                    background: #fff;
                    border: 1px solid #000;
                    padding: 5px 10px;
                    border-radius: 5px;
                    font-size: 12px;
                    right: 5px;
                    top: 5px;
                }
            `);
            if ($('div.page_selector').length > 0) {
                this.listPage();
            }
            if ($('#video_info').length > 0) {
                this.detailPage();
            }
        }
        detailPage() {
            let _this = this;
            let info = $('#video_info');
            //标题
            let title = $('.post-title').text();
            //识别码
            let codeRow = info.find('.item').eq(0);
            let code = codeRow.find('.text').html();
            codeRow.find('tr').append($('<td class="text" style="color:red">←点击复制</td>'));
            codeRow.on('click', function () {
                GM_setClipboard(code);
                $(this).find('td').last().html('←已复制到黏贴板');
            });
            //添加跳转到javlibrary链接
            info.append("<div class='item'><table><tbody><tr><td class='header'><a class='red' href='https://www.busfan.blog/" + code + "' target='_blank'>javbus</a><a class='red' href='https://javdb005.com/search?q=" + code + "' target='_blank'>javdb</a><a class='red' href='https://dd7448.com/serch_censored.htm?skey=" + code + "' target='_blank'>javbooks</a></td></tr></tbody></table></div>");
            //演员
            info.find('a').attr('target', '_blank');
            //添加预告视频观看按钮
            this.addVideo(code, '#video_favorite_edit')
            //封面图添加下载按钮
            let downloadBtn = $('<a>下载</a>');
            let imgUrl = $('#video_jacket img').attr('src');
            downloadBtn.on('click', function (e) {
                e.stopPropagation();
                _this.downloadPic(title, imgUrl);
                return false;
            });
            downloadBtn.attr('download', code);
            $('#video_jacket').append(downloadBtn);
        }
    }

    class Main {
        constructor() {
            if ($("footer:contains('JavBus')").length) {
                this.site = 'javBus';
            } else if ($("#bottomcopyright:contains('JAVLibrary')").length) {
                this.site = 'javLibrary'
            }
        }

        make() {
            let waterfullObj = new Waterfull();
            let requestObj = new Request();
            let obj;
            switch (this.site) {
                case 'javBus':
                    obj = new JavBus(requestObj, waterfullObj);
                    break;
                case 'javLibrary':
                    obj = new JavLibrary(requestObj, waterfullObj);
                    break;
            }
            return obj;
        }
    }

    let main = new Main();
    main.make();
})();