Greasy Fork

Greasy Fork is available in English.

B站辅助脚本,梦幻联动[音频🎵,视频📹,封面🌾]

脚本负责获取音频,工具负责视频封面弹幕等等,相互联动,互相增强,好耶ヽ(✿゚▽゚)ノ

当前为 2023-02-03 提交的版本,查看 最新版本

// ==UserScript==
// @name         B站辅助脚本,梦幻联动[音频🎵,视频📹,封面🌾]
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  脚本负责获取音频,工具负责视频封面弹幕等等,相互联动,互相增强,好耶ヽ(✿゚▽゚)ノ
// @author       王子周棋洛
// @match        https://www.bilibili.com/video/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bilibili.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    let audioState = false;
    let index = 0;
    let my_xhr;
    let renderButton = () => {
        if (__INITIAL_STATE__.videoData.pic && !document.querySelector(".my_coverImg_button")) {
            let coverImgButton = createNode('a', '获取封面', 'my_coverImg_button');
            coverImgButton.href = __INITIAL_STATE__.videoData.pic;
            coverImgButton.target = '_blank';
        }
        if (__INITIAL_STATE__.aid && __INITIAL_STATE__.bvid && __INITIAL_STATE__.videoData.pages[0].cid && !document.querySelector(".my_audio_button")) {
            let audioButton = createNode('a', '下载音频', 'my_audio_button');
            let items = document.querySelectorAll('.clickitem');
            if (items.length != 0) {
                items.forEach((item, i) => {
                    item.addEventListener('click', e => {
                        my_xhr.abort();
                        index = i;
                        if (audioButton) audioButton.remove();
                        if (document.querySelector(".my_coverImg_button")) document.querySelector(".my_coverImg_button").remove();
                        if (document.querySelector(".my_video_button")) document.querySelector(".my_video_button").remove();
                    })
                })
            }
            audioButton.addEventListener('click', e => {
                if (!audioState) {
                    audioState = true;
                    console.log(index);
                    let url = `https://api.bilibili.com/x/player/playurl?avid=${__INITIAL_STATE__.aid}&bvid=${__INITIAL_STATE__.bvid}&cid=${__INITIAL_STATE__.videoData.pages[index].cid}&fnval=4048`;
                    fetch(url, {
                        method: "GET",
                        responseType: "application/json"
                    }).then(resp => {
                        return resp.json();
                    }).then(i => {
                        my_xhr = new XMLHttpRequest();
                        my_xhr.responseType = 'blob';
                        my_xhr.open('GET', i.data.dash.audio[0].base_url, true);
                        my_xhr.addEventListener('progress', function (event) {
                            audioButton.textContent = `音频 ${parseInt((event.loaded / event.total) * 100)}%`;
                        }, false);
                        my_xhr.onload = () => {
                            if (my_xhr.status === 200) {
                                const reader = new FileReader();
                                reader.readAsDataURL(my_xhr.response);
                                reader.onload = function (e) {
                                    const a = document.createElement('a');
                                    a.download = '你好.mp3';
                                    a.href = e.target.result;
                                    document.documentElement.appendChild(a);
                                    a.click();
                                    a.remove();
                                    audioState = false;
                                };
                            }
                        }
                        my_xhr.send();
                    })
                }else{
                    my_xhr.abort();
                    audioButton.textContent = `下载音频`;
                    audioState = false;
                }
            })
        }
        if (location.href && !document.querySelector(".my_video_button")) {
            let videoButton = createNode('a', '下载视频', 'my_video_button');
            videoButton.href = `http://localhost:8080/?${location.href}`;
            videoButton.target = `_blank`;
        }
    }
    let createNode = (type, text, className) => {
        let node = document.createElement(type);
        node.textContent = text;
        node.className = className;
        node.style = `font-size:12px;text-decoration:none;padding:1px 4px;border-radius:3px;background-color:#fb819f;color:#fff;margin-right:8px`;
        document.querySelector(".video-data-list").appendChild(node);
        return node;
    }
    setInterval(() => {
        renderButton();
    }, 2500)
})();