让b站播放器摇起来

开启后会让b站播放器像摇篮一样摇起来

// ==UserScript==
// @name         让b站播放器摇起来
// @namespace    http://tampermonkey.net/
// @version      0.9
// @description  开启后会让b站播放器像摇篮一样摇起来
// @author       邻桌男孩
// @icon         https://www.google.com/s2/favicons?sz=64&domain=gf.qytechs.cn
// @grant        none
// @license      GPL v3.0
// @match        https://www.bilibili.com/video/*
// ==/UserScript==

(function() {
    'use strict';
    function sleep(delay){
        return new Promise(resolve => setTimeout(resolve, delay))
    }

    class lock{
        status = false
        acquire(){
            while(this.status){} // bad written pattern
            this.status = true
        }
        release(){
            this.status = false
        }
    }
    let rotater = {}
    rotater.lock = new lock()
    rotater.rotate_delays = new Map()
    rotater.EVENT_ROTATED = 'rotated'
    rotater.rotate_element_single = function (element, delay, degree) {
        return sleep(delay).then(()=>{
            element.style = `transform:rotate(${Math.floor(3 * Math.sin(degree / 30))}deg)`
            const event = new CustomEvent(rotater.EVENT_ROTATED, {bubbles: false, detail: {degree : degree}})
            element.dispatchEvent(event)
        })
    }
    rotater.rotate_event_handler = (evt) => {
        let degree = evt.detail.degree + 1
        let element = evt.target
        rotater.lock.acquire()
        if(rotater.rotate_delays.get(element)) {
            rotater.rotate_element_single(element, rotater.rotate_delays[element], degree)
        }
        rotater.lock.release()
    }
    rotater.rotate_element = function(element, initial, delay){
        rotater.lock.acquire()
        rotater.rotate_delays.set(element, delay)
        rotater.lock.release()
        element.removeEventListener(rotater.EVENT_ROTATED, rotater.rotate_event_handler)
        element.addEventListener(rotater.EVENT_ROTATED, rotater.rotate_event_handler)
        rotater.rotate_element_single(element, delay, initial)
    }
    rotater.delay_modify = function (element, delay){
        rotater.lock.acquire()
        rotater.rotate_delays.set(element, delay)
        rotater.lock.release()
    }
    let page_loaded = false

    function sleep_and_check(){
        sleep(300).then( async () => {
            page_loaded = document.querySelector("#playerWrap")
            if(page_loaded)
                sleep_and_exec()
            else
                sleep_and_check()
        })
    }

    function sleep_and_exec(){
        sleep(50).then( async () => {
            let player = document.querySelector("#playerWrap")
            rotater.rotate_element(player, 0, 100)
        })
    }

    // main
    sleep_and_check()

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址