bilibili一键投币

在视频右上角添加快捷按钮帮助用户在全屏和非全屏下一键投币. 投币不需要退出全屏, 过程没有弹出遮挡提示,不需要暂停视频. 方便支持自己喜欢的作者, 投币获得经验5级帐号不再遥不可及.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         bilibili一键投币
// @namespace    www.papercomment.tech
// @version      0.5
// @description  在视频右上角添加快捷按钮帮助用户在全屏和非全屏下一键投币. 投币不需要退出全屏, 过程没有弹出遮挡提示,不需要暂停视频. 方便支持自己喜欢的作者, 投币获得经验5级帐号不再遥不可及. 
// @author       c4r
// @match        https://www.bilibili.com/watchlater/*
// @match        https://www.bilibili.com/video/*
// @match        https://www.bilibili.com/bangumi/play/*
// @require      https://code.jquery.com/jquery-latest.js
// @grant        GM_addStyle
// @license      MPL-2.0
// ==/UserScript==

(function () {
    'use strict';

    /**
     *  玩法:修改第二层div.c4r的类,可改的类名包括(.initial .success .error .processing .surprise .hide .fade),其中.inital和.success需要保证有且仅有一个存在。
     */
    GM_addStyle(`
.processing {
  animation: rotate 2s infinite linear;
}
@keyframes rotate {
  from {
    transform:rotate(0deg);
  }
  to {
    transform:rotate(360deg);
  }
}
.initial {
  background-color: #cacaca;
  height:50%;
  width:50%;
  top:-7%;
  right:-7%;
  border-radius:100%;
}
.success {
  background-color: #ffffff;
  height:50%;
  width:50%;
  top:-7%;
  right:-7%;
  border-radius:100%;
}
.error {
  background-color: #fd676f;
}
.surprise, #c4r-takecoin:hover .c4r {
  height:100%;
  width:100%;
  top:0;
  right:0;
  border-radius:100%;
}
.c4r {
  transition: all 0.3s ease;
}
.c4rHide{
  opacity: 0;
}
.fade {
  animation: fade 1s 0.3s forwards;
}
@keyframes fade {
  25% {
    opacity: 0.25;
  }
  50% {
    opacity: 1;
  }
  75% {
    opacity: 0.25;
  }
  100% {
    opacity: 1;
  }
}
.bcoin {
  fill: #1890ff;
}
.c4r.initial .c4r-logo,
.c4r.success .bcoin{
  display:;
}
.c4r.initial .bcoin,
.c4r.success .c4r-logo{
  display: none;
}
`)


    // ===========================================================================================
    // 全局变量
    // -------------------------------------------------------------------------------------------
    // let sureButton = [
    //     '.coin-operated-m .coin-bottom span.bi-btn', // 新, 老版本
    //     '.coin-sure', // watching list
    //     '.coin-bottom span.bi-btn', // 未订阅
    //     '.coin-bottom span.coin-btn' // 旧,新番剧
    // ]

    // let coinBox = [
    //     '.coin-box', // 老版本, watching list
    //     '.coin', //新版本
    //     '.bangumi-coin-wrap' //旧版番剧
    //     '.coin-info' // 新版番剧
    // ]
    let logoShowStatus = []
    // let islogoShowTime = false
    let isMouseInLogo = false

    // ===========================================================================================
    // 没有改动类函数...
    // -------------------------------------------------------------------------------------------

    /**
     * 是否为老版本一般视频
     */
    function isOldVersion() {
        return $('i.icon-move.c-icon-moved').length > 0
    }

    /**
     * 是否为番剧(老版本)
     */
    function isBangumiOld() {
        return $('div.bangumi-coin-wrap').length > 0
    }

    function isBangumiNew() {
        return $('div.coin-info').length > 0
    }

    /**
     * 是否为稍后再看
     */
    function isWatchList() {
        return $('.bilibili-player-watchlater-nav-header').length > 0
    }

    /**
     * 是否为新版本一般视频
     */
    function isNewVersion() {
        return $('.coin:not(.u)').length > 0
    }
    /**
     * 返回投币状态
     */
    function isCoinTaken() {

        if (isBangumiOld()) {
            return $('i.bangumi-coin-d').is(':visible')
        } else if (isBangumiNew()) {
            return $('div.coin-info.active').length > 0
        } else if (isOldVersion()) {
            return $('i.icon-move.c-icon-moved').is(':visible')
        } else {
            // new version , watch list
            return $('span.coin.on').length == 1
        }

    }
    // /**
    //  * 是否关注up
    //  * bug : 新版, 联合创造返回错误结果
    //  */
    // function isFollowing() {
    //     if (isOldVersion() || isWatchList()) {
    //         return $('div.btn.followed').length > 0
    //     } else if (isBangumiOld()) {
    //         return $('.func-btns.followed').length > 0
    //     } else if (isNewVersion()) {
    //         return $('.b-gz.following').length > 0
    //     } else {
    //         console.log("take-coin : error : ", "unknown version")
    //         return undefined
    //     }
    // }

    function islogoForeShow() {
        if (isCoinTaken() && logoShowStatus.indexOf("actTakingCoin") == -1) {
            // console.log('forec : taken')
            return false
        } else {
            // console.log('forec : logoShowStatus ', logoShowStatus.length)
            return logoShowStatus.length > 0
        }
    }

    /**
     * 判断视频是否全屏状态
     */
    function isVideoInFullscreen() {
        if (document.fullscreenElement && document.fullscreenElement.id == 'bilibiliPlayer') {
            return true;
        }
        return false;
    }

    /**
     * 插入投币按钮的html代码
     * 包含 :
     * - id(string) : coin-gen
     * - status(string) : taken, taking, untaken, undefined
     * - text : 已投, 处理中, 投币, 错误
     */
    function genButton() {
        console.log('status : ', isCoinTaken())

        let strClass = ''
        let strStatus = ''
        let strText = ''

        if (isOldVersion()) {

        } else if (isBangumiOld()) {

        } else if (isWatchList()) {

        } else {

        }

        if (isCoinTaken()) {
            // 已投币
            strClass = 'success'
        } else {
            strClass = 'initial'
        }


        return '<div id="c4r-takecoin" style="width: 6.5%;padding-top: 6.5%;position: absolute;overflow: hidden;top: 0px;right: 0px;cursor: pointer;z-index: 100">\
        <div id="coin-gen" class="c4r '+ strClass + '" style="position: absolute;">\
        <svg class="c4r-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 162.65 162.65"><path d="M102.74,20.66C67.1,13.31,7,103.51,31.89,108.3c13.7,2.65,24.31-4.73,33.83-6.17l13,.31a1.1,1.1,0,0,1,1.43.57,1.08,1.08,0,0,1-.57,1.43c-11,10.93-6.16,8.84-19.75,13-30.17,9.27-57.47,3.07-43.47-33.52C27.2,55.58,71.12,5,105.59,12.2a4.46,4.46,0,1,1-2.85,8.46Z" style="fill:#414042;fill-rule:evenodd"/><path d="M88.73,71.39a74.35,74.35,0,0,1,9.86,22.25c9.45-11.26,23-18.66,35.69-5.72a3.28,3.28,0,0,1-4.22,5c-12.77-4.54-18.35-1.41-26.57,10.46a41.16,41.16,0,0,0-2.9,5.13c.22,8.56-.94,17.53-2.93,27.55-.71,3.53-4.87,24.87-13.45,16.15-6.79-6.9,2.87-39.31,6.21-46,.19-.39.4-.78.6-1.18C90.49,94,88.23,83.34,83.59,75.51a3.28,3.28,0,0,1,5.14-4.07Zm-3.29,73.12a2.36,2.36,0,0,0-.62.85C85.29,144.85,85.3,144.89,85.44,144.51Z" style="fill:#414042;fill-rule:evenodd"/></svg>\
        <svg class="bcoin" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28"><path d="M14.89 8.664h3.276c.541 0 .979-.4.979-.892s-.438-.892-.979-.892H9.681c-.541 0-.979.4-.979.892s.438.892.979.892h3.425v1.637a5.64 5.64 0 0 0-5.355 5.616v1.19a.892.892 0 1 0 1.784.001v-1.19a3.855 3.855 0 0 1 3.57-3.831v8.329a.892.892 0 0 0 1.784 0v-8.329a3.855 3.855 0 0 1 3.57 3.831v1.19a.892.892 0 0 0 1.784 0v-1.19a5.64 5.64 0 0 0-5.355-5.616V8.664zM14 26C7.373 26 2 20.627 2 14S7.373 2 14 2s12 5.373 12 12a12.002 12.002 0 0 1-12 12z"/></svg>\
        </div>\
        </div>'
    }
    /**
     * 返回投币按钮JQ Selector
     * @returns {string} JQ Selector
     */
    function getCoinBoxSelector() {
        if (isOldVersion()) {
            return '.coin-box'
        } else if (isBangumiOld()) {
            return '.bangumi-coin-wrap'
        } else if (isBangumiNew()) {
            return 'div.coin-info'
        } else if (isWatchList()) {
            return '.coin-box'
        } else if (isNewVersion()) {
            return '.coin'
        } else {
            console.log("take-coin : error : ", "unknown version")
            return undefined
        }
    }

    /**
     * 返回确认投币的JQ Selector
     * @returns {string} JQ Selector
     */
    function getSureButtonSelector() {
        // console.log('version : ', isFollowing(), isOldVersion(), isBangumiOld(), isWatchList(),isNewVersion())
        if ($('.coin-bottom span.bi-btn').length > 0) { // 未订阅
            return '.coin-bottom span.bi-btn'
        } else {
            if (isOldVersion()) {
                return '.coin-operated-m .coin-bottom span.bi-btn'
            } else if (isBangumiOld() || isBangumiNew()) {
                return '.coin-bottom span.coin-btn'
            } else if (isWatchList()) {
                return '.coin-sure'
            } else if (isNewVersion()) {
                return '.coin-operated-m .coin-bottom span.bi-btn'
            } else {
                console.log("take-coin : error : ", "unknown version")
                return undefined
            }
        }

    }

    /**
     * 隐藏"投币确实"的selector
     */
    function getHideSureBackgroundSelector() {
        if (isWatchList()) {
            return '.coin-mask, .coin-wrap'
        } else if (isOldVersion() || isNewVersion()) {
            return '.bili-dialog-m'
        } else if (isBangumiOld()) {
            return '.dialog-mask'
        } else if (isBangumiNew()) {
            return '.coin-dialog-mask'
        }
    }




    // ===========================================================================================
    // 功能函数
    // -------------------------------------------------------------------------------------------
    /**
     * 强制隐藏logo
     */
    function logoHide() {
        $('#coin-gen').addClass('c4rHide')
    }

    /**
     * 根据情况判断隐藏图标
     */
    function autoLogoHide() {
        if (!islogoForeShow() && !isMouseInLogo) {
            logoHide()
        }
    }

    /**
     * logo出现
     */
    function logoShow() {
        $('#coin-gen').removeClass('c4rHide')
    }

    /**
     * 在投币动作结束后, 改变投币按钮状态
     * @param {String} status taken, taking, untaken, undefined
     * 对应 -> 已投, 处理中, 投币, 错误
     */
    function changeCoinTaken(status) {
        if (status == 'taken') {
            $('#coin-gen').attr('class', 'c4r success surprise')
            setTimeout(() => {
                if (logoShowStatus.indexOf("actTakingCoin") != -1) {
                    delete logoShowStatus[logoShowStatus.indexOf("actTakingCoin")]
                }
                autoLogoHide()
                $('#coin-gen').removeClass('surprise')
            }, 1000);


        } else if (status == 'taking') {
            $('#coin-gen').attr('class', 'c4r initial surprise processing')
            // $('#coin-gen').attr('class', 'c4r success surprise')

        } else if (status == 'untaken') {
            $('#coin-gen').attr('class', 'c4r initial')

        } else {
            $('#coin-gen').attr('class', 'c4r initial error')
            if (logoShowStatus.indexOf("actCoinError") == -1) {
                logoShowStatus.push("actCoinError")
            }
        }

    }

    /**
     * 检测进度条
     */
    function watchVideo() {

        let strStartRemind = 'timeStartRemind'
        let strKeepRemind = 'timeKeepRemind'


        $('video').on("timeupdate", () => {

            let timePoint1_s = 3. / 4. * $('video').get(0).duration
            let timePoint1_e = 3. / 4. * $('video').get(0).duration + 3
            // console.log("video time : ", $('video').get(0).currentTime)

            if ($('video').get(0).currentTime > timePoint1_s
                && $('video').get(0).currentTime < timePoint1_e) {
                // 闪烁

                if (logoShowStatus.indexOf(strStartRemind) == -1) {
                    logoShowStatus.push(strStartRemind)
                }


                if ($("#coin-gen").hasClass("success") || $("#coin-gen").hasClass("error")) {

                } else {

                    $("#coin-gen").addClass('surprise fade')
                }

            } else if ($('video').get(0).currentTime > timePoint1_e) {

                if (logoShowStatus.indexOf(strStartRemind) != -1) {
                    delete logoShowStatus[logoShowStatus.indexOf(strStartRemind)]
                }


                if (logoShowStatus.indexOf(strKeepRemind) == -1) {
                    logoShowStatus.push(strKeepRemind)
                }

                if ($("#coin-gen").hasClass("success") || $("#coin-gen").hasClass("error")) {

                } else {

                    $("#coin-gen").removeClass('fade').addClass('surprise')
                }
            }
            else {

                // $("#coin-gen").removeClass('surprise')
            }

            if (islogoForeShow()) {
                logoShow()
            }
        });
    }

    /**
     * 视频fullscreen时候要做的事情
     */
    function processFullScreen() {

        if (isVideoInFullscreen()) { // 视频为全屏

            if (isOldVersion() || isWatchList() || isBangumiOld() || isBangumiNew()) {
                console.log("Bcoin : start watching hide bar")
                observerHide.observe($('.bilibili-player-video-control').get(0),
                    {
                        subtree: false, childList: false, characterData: false, attributes: true,
                        attributeFilter: ["style"], attributeOldValue: true, characterDataOldValue: false
                    })
            } else {
                console.log("Bcoin : new version")
                observerHide.observe($('#bilibiliPlayer > div.bilibili-player-area').get(0),
                    {
                        subtree: false, childList: false, characterData: false, attributes: true,
                        attributeFilter: ["class"], attributeOldValue: true, characterDataOldValue: false
                    })
            }

        } else { // 视频退出全屏

            observerHide.disconnect()
            // $('#coin-gen').show()
            logoShow()
        }

        // 加载watching list
        // if (isVideoInFullscreen()) {
        //     $("#bcoin-watch-list").append($(".bilibili-player-wraplist").html())
        // } else {
        //     $("#bcoin-watch-list").empty()
        // }
    }

    /**
     * 实际运行部分
     */
    function watching() {
        // 添加按钮

        console.log("take-coin : add button")
        $('#c4r-takecoin').remove()

        logoShowStatus = []
        if (isOldVersion() || isWatchList() || isBangumiOld()) {
            console.log("oldversion")
            if ($('.bilibili-player-video-wrap').length == 0) {
                let callbackPlayer = function (mutationList, observer) {
                    // console.log("coin change : ", mutationList)
                    mutationList.forEach((mutation) => {
                        // if($(mutation.target).is('.van-icon-videodetails_throw')){
                        if ($('.bilibili-player-video-wrap').length > 0 && $('#coin-gen').length == 0) {
                            // $('#c4r-takecoin').remove()
                            $('.bilibili-player-video-wrap').append(genButton())
                            observer.disconnect()
                            console.log('disconnect coin observe')
                        }
                        // }
                    })

                }
                let observerPlayer = new MutationObserver(callbackPlayer)
                observerPlayer.observe($('#bilibiliPlayer').get(0),
                    {
                        subtree: true, childList: true, characterData: false, attributes: true,
                        attributeOldValue: false, characterDataOldValue: false
                    })
            } else {
                $('#c4r-takecoin').remove()
                $('.bilibili-player-video-wrap').append(genButton())
            }

        } else if (isNewVersion()) {
            console.log("new version")
            $('#c4r-takecoin').remove()
            $('#bilibiliPlayer').append(genButton())
            if (!$('.coin').hasClass('on')) {
                observerNewVersionCoin.observe($('.coin').get(0),
                    {
                        subtree: true, childList: true, characterData: false, attributes: true,
                        attributeFilter: ["class"], attributeOldValue: false, characterDataOldValue: false
                    })
            }

        } else if (isBangumiNew()) {
            console.log("Bangumi New version")
            $('#c4r-takecoin').remove()
            $('#bilibiliPlayer').append(genButton())
            if ($('.coin-info span').text().trim() == '--') {
                observerBangumiNewCoin.observe($('.coin-info').get(0),
                    {
                        subtree: true, childList: true, characterData: true, attributes: false,
                        attributeOldValue: false, characterDataOldValue: false
                    })
            }
        } else {
            console.log("unknown version")
        }


        processFullScreen()

        watchVideo()

    }

    /**
     * 模拟鼠标
     * @param {*} node 
     * @param {*} eventType 
     */
    function triggerMouseEvent(node, eventType) {
        var clickEvent = document.createEvent('MouseEvents');
        clickEvent.initEvent(eventType, true, true);
        node.dispatchEvent(clickEvent);
    }

    var clickTimeout = {
        _timeout: null,
        set: function (fn) {
            var that = this
            that.clear()
            that._timeout = setTimeout(fn, 300)
        },
        clear: function () {
            var that = this
            if (that._timeout) {
                clearTimeout(that._timeout)
            }
        }
    }


    // ===========================================================================================
    // observation
    // -------------------------------------------------------------------------------------------
    /**
     * 检查是否视频周边控制器隐藏状态是否变化
     */
    let callbackHide = function (mutationList, observer) {
        // console.log(mutationList)
        mutationList.forEach((mutation) => {
            // console.log(mutation.oldValue, $(".bilibili-player-video-control").attr('style'))
            if (isOldVersion() || isWatchList() || isBangumiOld() || isBangumiNew()) {
                if ($(".bilibili-player-video-control").attr('style') == 'opacity: 0;' ||
                    $(".bilibili-player-video-control").attr('style') == 'opacity: 1;') {
                    if ($(".bilibili-player-video-control").attr('style') == 'opacity: 0;') {
                        // console.log("Bcoin : hide")
                        // autoLogoHide()
                    } else {
                        // console.log("Bcoin : show")
                        // $('#coin-gen').show()
                        // logoShow()
                    }
                }
            } else {
                // 新版
                if ($("#bilibiliPlayer > div.bilibili-player-area").hasClass('video-control-show')) {

                    // $('#coin-gen').show()
                    // logoShow()
                } else {
                    // autoLogoHide()

                }

            }
        })

    }
    let observerHide = new MutationObserver(callbackHide)

    //-------------------------------------------------------------------------------------------
    /**
     * 新版coin图标会晚一点加载出来, 用来等待加载coin
     */
    let callbackNewVersionCoin = function (mutationList, observer) {
        // console.log("coin change : ", mutationList)
        mutationList.forEach((mutation) => {
            if ($(mutation.target).is('span.coin')) {
                // console.log($.trim($('.coin').text()))
                // if ($('.coin').hasClass('on')) {
                $('#c4r-takecoin').remove()
                $('#bilibiliPlayer').append(genButton())
                // observer.disconnect()
                // console.log('disconnect coin observe')
            }
            // }
        })

    }
    let observerNewVersionCoin = new MutationObserver(callbackNewVersionCoin)

    /**
     * 新版banggumi coin图标会晚一点加载出来, 用来等待加载coin
     */
    let callbackBangumiNewCoin = function (mutationList, observer) {
        // console.log("coin change : ", mutationList)
        mutationList.forEach((mutation) => {
            // if($(mutation.target).is('.van-icon-videodetails_throw')){
            // console.log($.trim($('.coin').text()))
            if ($('.coin-info span').text().trim() != '--') {
                $('#c4r-takecoin').remove()
                $('#bilibiliPlayer').append(genButton())
                observer.disconnect()
                // console.log('disconnect coin observe')
            }
            // }
        })

    }
    let observerBangumiNewCoin = new MutationObserver(callbackBangumiNewCoin)

    //-------------------------------------------------------------------------------------------
    /**
     * 检测video变化, 开始添加按钮
     */
    let callbackVideo = function (mutationList, observer) {
        // console.log(mutationList)
        mutationList.forEach((mutation) => {

            // 旧版, 以及发生视频变化
            if ($(mutation.target).hasClass('bilibili-player-video')) {
                console.log('take-coin : 视频变更 ', mutation)
                // console.log('take-coin : 视频变更...')

                // 添加按钮
                // if ($('#coin-gen').length == 0) {
                // watching()
                // }

                observerVideo.disconnect()
                console.log('take-coin : continue observing...')
                observerVideo.observe($('.player').get(0),
                    {
                        subtree: true, childList: true, characterData: false, attributes: true,
                        attributeFilter: ["src"], attributeOldValue: false, characterDataOldValue: false
                    })
                watching()
            }
        })

    }
    let observerVideo = new MutationObserver(callbackVideo)

    //-------------------------------------------------------------------------------------------
    /**
     * 等待投币确认按钮弹出
     */
    let callbackCoinBox = function (mutationList, observer) {

        let button = getSureButtonSelector()
        let isClicked = false
        let isDisconnect = false

        let hideSelector = getHideSureBackgroundSelector()
        // if (isWatchList()) {
        //     hideSelector = '.coin-mask, .coin-wrap'
        // } else if (isOldVersion() || isNewVersion()) {
        //     hideSelector = '.bili-dialog-m'
        // } else if (isBangumiOld()) {
        //     hideSelector = '.dialog-mask'
        // }
        // console.log(button, $(button).length, hideSelector, "callbackCoinBox : ", mutationList)
        mutationList.forEach((mutation) => {
            if ((!isClicked) && mutation.addedNodes.length > 0 && $(button).length > 0) {

                // console.log("take-coin :", "click")
                $(hideSelector).css('opacity', '0')
                $(button).get(0).click()
                isClicked = true

            }

            if ((!isDisconnect) && mutation.removedNodes.length > 0) {
                // console.log("take-coin :", "remove surebutton")
                setTimeout(() => {
                    console.log('check : ', isCoinTaken())
                    if (isCoinTaken()) {
                        changeCoinTaken('taken')

                    } else {
                        changeCoinTaken('unknown')
                    }

                }, 1500)
                observer.disconnect()

                isDisconnect = true

            }
        })
    }
    let observerCoinBox = new MutationObserver(callbackCoinBox)

    // ===========================================================================================
    // 全局listener
    // -------------------------------------------------------------------------------------------
    /**
     * 全屏变化
     */
    document.onfullscreenchange = function (event) {
        console.log("FULL SCREEN CHANGE")
        processFullScreen()
    }

    //-------------------------------------------------------------------------------------------
    // 检测按钮被按
    // 为防止按钮被删, $(document).on 必须放在这里
    $(document).on('click', function (event) {

        // console.log("click : ", event)
        if ($(event.target).closest('#coin-gen.initial').length > 0) {
            clickTimeout.set(function () {

                console.log("take-coin : 投币")
                // if (isOldVersion()) {
                //     // console.log("old version")
                //     $('.coin-box').click()
                // } else {
                //     // console.log("other version")
                //     // new version || watchlist || bangumiOld
                //     $('.coin').click()
                // }

                let CoinBoxObserverSelector = ''
                if (isWatchList()) {
                    CoinBoxObserverSelector = 'div[coinnum]'
                } else if (isOldVersion() || isNewVersion()) {
                    CoinBoxObserverSelector = '#app > div'
                } else if (isBangumiOld() || isBangumiNew()) {
                    CoinBoxObserverSelector = '#app'
                }
                observerCoinBox.observe($(CoinBoxObserverSelector).get(0),
                    {
                        subtree: true, childList: true, characterData: false, attributes: false,
                        // attributeFilter: ["src"],
                        attributeOldValue: false, characterDataOldValue: false
                    })

                let coinButton = getCoinBoxSelector()
                console.log(coinButton, $(coinButton).length)
                $(coinButton).get(0).click()

                console.log("changeCoinTaken...")
                changeCoinTaken('taking')
                if (logoShowStatus.indexOf("actTakingCoin") == -1) {
                    logoShowStatus.push("actTakingCoin")
                }
            })
        }

        if ($(event.target).closest('#coin-gen.success').length > 0) {
            clickTimeout.set(function () {
                $('#coin-gen').addClass('processing')
                setTimeout(() => {
                    $('#coin-gen').removeClass('processing')
                }, 2000);
            })
        }
    })


    $(document).on('dblclick', function (event) {

        // console.log("click : ", event)
        if ($(event.target).closest('#coin-gen').length > 0) {

            

            
            if (isNewVersion() &&  
            ($('span.like.on').length == 0 || (!isCoinTaken()) || $('span.collect.on').length == 0) ) {

                console.log("take-coin : 一键三联")
                clickTimeout.clear()
                let CoinBoxObserverSelector = ''

                if (isWatchList()) {
                    CoinBoxObserverSelector = 'div[coinnum]'
                } else if (isOldVersion() || isNewVersion()) {
                    CoinBoxObserverSelector = '#app > div'
                } else if (isBangumiOld() || isBangumiNew()) {
                    CoinBoxObserverSelector = '#app'
                }
                observerCoinBox.observe($(CoinBoxObserverSelector).get(0),
                    {
                        subtree: true, childList: true, characterData: false, attributes: false,
                        // attributeFilter: ["src"],
                        attributeOldValue: false, characterDataOldValue: false
                    })

                let coinButton = getCoinBoxSelector()
                // console.log(coinButton, $(coinButton).length)

                triggerMouseEvent($('span.like').get(0), "mousedown");

                console.log("changeCoinTaken...")
                changeCoinTaken('taking')
                if (logoShowStatus.indexOf("actTakingCoin") == -1) {
                    logoShowStatus.push("actTakingCoin")
                }



            }
        }
    })

    $(document).on('mouseover', function (event) {
        if ($(event.target).closest('#coin-gen').length > 0) {
            // console.log('take-coin :', 'mousenter')
            isMouseInLogo = true
            // logoShow()
        }
    })

    $(document).on('mouseout', function (event) {
        if ($(event.target).closest('#coin-gen').length > 0) {
            // console.log('take-coin :', 'leave')
            isMouseInLogo = false
            autoLogoHide()
        }
    })

    let mousemoveTimeoutID = 0
    $(document).on('mousemove', function (event) {
        // console.log('take-coin :', 'mousemove out')
        if ($('#coin-gen').length > 0) {
            // console.log('take-coin :', 'mousemove')
            logoShow()

            if (mousemoveTimeoutID) {
                clearTimeout(mousemoveTimeoutID)
            }
            mousemoveTimeoutID = setTimeout(() => {
                // console.log('take-coin :', 'Hide')
                autoLogoHide()
            }, 1500);
        }
    })


    // ===========================================================================================
    // ready
    // -------------------------------------------------------------------------------------------
    $(document).ready(function () {
        console.log('take-coin : ready ...')


        if ($('.player').length > 0) {
            // 添加按钮
            watching()

            // 检测按钮消失, 重新加载
            console.log('take-coin : observing...', $('.player').length)
            observerVideo.observe($('.player').get(0),
                {
                    subtree: true, childList: true, characterData: false, attributes: true,
                    attributeFilter: ["src"], attributeOldValue: false, characterDataOldValue: false
                })
        } else {
            // 在列表页面
            // 通过检测是否含有.player元素判断
            let callbackGoToWatch = function (mutationList, observer) {
                if ($('.player').length > 0) {
                    // 添加按钮
                    watching()

                    // 检测按钮消失, 重新加载
                    console.log('take-coin : observing...', $('.player').length)
                    observerVideo.observe($('.player').get(0),
                        {
                            subtree: true, childList: true, characterData: false, attributes: true,
                            attributeFilter: ["src"], attributeOldValue: false, characterDataOldValue: false
                        })
                    observer.disconnect()
                }
            }
            let observerGoToWatch = new MutationObserver(callbackGoToWatch)

            let strWaitLoadPlayer = ''
            if ($('.app-wrap').length > 0) {
                strWaitLoadPlayer = '.app-wrap'
            } else if ($('#app').length > 0) {
                strWaitLoadPlayer = '#app'
            }
            observerGoToWatch.observe($(strWaitLoadPlayer).get(0),
                {
                    subtree: true, childList: true, characterData: false, attributes: true,
                    attributeFilter: ["src"], attributeOldValue: false, characterDataOldValue: false
                })
        }

    })


})();