Tampermonkey | blob-视频下载插件

// ==UserScript==
// @name         blob格式视频下载
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  https://github.com/Momo707577045/media-source-extract (原资源, 下面是原demo)
// @author       CY3761
// @include      *
// @exclude      http://blog.luckly-mjw.cn/tool-show/media-source-extract/player/player.html
// @grant        GM_addStyle
// @grant        GM_download
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js
// @run-at       document-start
// ==/UserScript==

// tampermonkey 文档地址
// https://www.tampermonkey.net/documentation.php

// 第三方库CDN地址 https://www.bootcdn.cn
// jquery | https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js

// GM_addStyle
(() => {
    GM_addStyle(`
        #blob-video-download-div {
            position: fixed;
            top: 45%;
            right: 10px;
            z-index: 9999;
        }
    `)
})();

(()=>{$(() => {
    'use strict'

    // 感觉一半一半而已

    setInterval(() => {
        const e = $('.pv-log-error')

        if (e) { e.remove() }
    }, 1e3)

    // 如果某个 DOM存在则不以下执行操作
    const sRootSelector = 'blob-video-download-div'
    const sBody = $('body')
    let sRoot = $('#' + sRootSelector)

    if (sRoot.length) {
        return
    }

    $('<div id="' + sRootSelector + '"><button>视频处理中..</button></div>').appendTo(sBody)

    const sDownload = $('#' + sRootSelector + ' button')

    // console.log(sDownload)

    sDownload.prop('disabled', true)

    let _sourceBufferItems = [] // 资源缓存(数组)

    // 下载资源 (函数)
    const download = () => {
        console.log(_sourceBufferItems, _sourceBufferItems.length)

        $.each(_sourceBufferItems, (key, target) => {
            let mime = target.mime.split(';')[0]
            const type = mime.split('/')[1]

            // 创建一个Blob对象,并设置文件的 MIME 类型
            const fileBlob = new Blob(target.bufferItems, { type: mime })

            const a = $('a')[0]

            mime = mime.split('/')[0]

            // a.download      =
            // a.href          = URL.createObjectURL(fileBlob)
            // a.style.display = 'none'
            // a.className = ''
            //
            // $(a).appendTo('body')

            GM_download(URL.createObjectURL(fileBlob),  `${document.title}-${mime}.${type}`) // 分片下载

            // console.log(a)



            // a.click().remove()

        })

        _sourceBufferItems = [] // 这里新增的

        return false
    }

    // 监听资源全部录取成功
    let _endOfStream = window.MediaSource.prototype.endOfStream
    console.log('window.MediaSource', window.MediaSource)

    window.MediaSource.prototype.endOfStream = function () {
        console.log('资源全部捕获成功!') // 这里不进行下载, 使用按钮点击下载

        sDownload.html(sDownload.html() + ' 可以下载了').prop('disabled', false)

        _endOfStream.call(this)
    }

    // 录取资源
    let _addSourceBuffer = window.MediaSource.prototype.addSourceBuffer

    window.MediaSource.prototype.addSourceBuffer = function(mime) {
        console.log('addSourceBuffer')

        let sourceBuffer = _addSourceBuffer.call(this, mime)
        let _append = sourceBuffer.appendBuffer
        let bufferItems = []

        _sourceBufferItems.push({
            mime,
            bufferItems,
        })

        sourceBuffer.appendBuffer = function(buffer) {
            console.log('appendBuffer')

            sDownload.html(`已捕获 ${_sourceBufferItems[0].bufferItems.length} 个片段`).prop('disabled', true)

            bufferItems.push(buffer)
            _append.call(this, buffer)
        }

        console.log('sourceBuffer', sourceBuffer)

        return sourceBuffer
    }

    $(document).on('click', '#' + sRootSelector + ' button', (e) => {
        console.log('click-download-button')

        download()

        return false
    })

})})();

感觉并非完全可行。。可能会出现检测问题而导致下载不完整


版权声明:本文为weixin_63272654原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。