Greasy Fork is available in English.

BiibiliCover

B站显示视频封面

Verzia zo dňa 08.10.2017. Pozri najnovšiu verziu.

// ==UserScript==
// @name         BiibiliCover
// @version      1.4.5
// @description  B站显示视频封面
// @author       AnnAngela
// @match        *://www.bilibili.com/video/av*
// @match        *://www.bilibili.com/watchlater*
// @noframes
// @compatible   chrome
// @compatible   firefox
// @compatible   opera
// @compatible   safari
// @icon         data:image/png;base64,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
// @icon64       data:image/png;base64,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
// @run-at       document-start
// @grant        unsafeWindow
// @grant        GM_addStyle
// @namespace    https://greasyfork.org/users/129402
// @license      GNU General Public License version 3 https://www.gnu.org/licenses/gpl-3.0.en.html
// ==/UserScript==
unsafeWindow.addEventListener('load', function() {
    unsafeWindow.eval([
        "(function loop() {",
        "    var LF = String.fromCharCode(10),",
        "        XX = String.fromCharCode(47);",
        "    var plw = document.querySelector('.player-wrapper, .video-box-module > .bili-wrapper');",
        "    if (!plw) return setTimeout(loop, 1000);",
        "",
        "    var oP = document.createElement('p'),",
        "        styles = {",
        "            width: '100px',",
        "            height: '100px',",
        "            overflowY: 'scroll'",
        "        },",
        "        i, sbw;",
        "    for (i in styles) oP.style[i] = styles[i];",
        "    document.body.appendChild(oP);",
        "    sbw = oP.offsetWidth - oP.clientWidth;",
        "    oP.remove();",
        "",
        "    function coverImage(url) {",
        "        /* 本函数来自 https://greasyfork.org/zh-CN/scripts/30714-获取哔哩哔哩视频的封面图片-get-bilibili-cover-image/code?version=202372 特此感谢*/",
        "        var coverImageBigUrl = url;",
        "        // 去除url中的裁剪标识",
        "        if (url.indexOf(\"@\") > -1) { //处理以@做裁剪标识的url",
        "            coverImageBigUrl = url.split(\"@\")[0];",
        "        }",
        "        if (url.indexOf(\"jpg_\") > -1) { //处理以_做裁剪标识的url",
        "            coverImageBigUrl = url.split(\"jpg_\")[0] + \"jpg\"; //默认所有图片都是jpg格式的。如果不是jpg,则可能会出错",
        "        }",
        "        if (url.indexOf(\"png_\") > -1) { //处理以_做裁剪标识的url",
        "            coverImageBigUrl = url.split(\"png_\")[0] + \"png\";",
        "        }",
        "        if (url.indexOf(\"/320_200/\") > -1) { //有时裁剪标识是在后缀名之前的 目前主要发现的是“番剧”板块的列表里有,但尚不清楚其他地方的情况",
        "            coverImageBigUrl = url.replace(\"/320_200\", \"\");",
        "        }",
        "        if (coverImageBigUrl.substring(0, 2) === XX + XX) coverImageBigUrl = 'https:' + coverImageBigUrl;",
        "        else if (coverImageBigUrl.substring(0, 5) === 'http:') coverImageBigUrl = coverImageBigUrl.replace('http:', 'https:');",
        "        return coverImageBigUrl;",
        "    }",
        "",
        "    function getRealWidthAndHeight(src, callback) {",
        "        var imgtemp = new Image();",
        "        imgtemp.src = src;",
        "        imgtemp.addEventListener('load', function() {",
        "            callback({",
        "                width: imgtemp.width,",
        "                height: imgtemp.height",
        "            });",
        "        });",
        "    }",
        "    var img;",
        "    img = document.createElement('img');",
        "    img.id = 'cover_img';",
        "    setInterval(function() {",
        "        try {",
        "            document.querySelector('#cover_img').src = coverImage(document.querySelector('.cover_image, .bilibili-player-auxiliary-area .bilibili-player-watchlater-item[data-state-play=true] .bilibili-player-watchlater-cover-cell img').src);",
        "        } catch (_) {",
        "            console.info('bilibiliCover', 'no img');",
        "            img = document.createElement('img');",
        "            img.id = 'cover_img';",
        "            plw.appendChild(img);",
        "            img.style.display = 'block';",
        "            img.style.position = 'absolute';",
        "            img.style.cursor = 'pointer';",
        "        }",
        "    }, 1000);",
        "    plw.appendChild(img);",
        "    img.style.display = 'block';",
        "    img.style.position = 'absolute';",
        "    img.style.cursor = 'pointer';",
        "",
        "    function calc() {",
        "        var ofs = getComputedStyle(document.querySelector('#arc_toolbar_report, .video-toolbar-module')),",
        "            ofl = parseInt(ofs.width) + parseInt(ofs.marginLeft) + parseInt(ofs.paddingLeft) + parseInt(ofs.borderLeftWidth),",
        "            ofb = parseInt(ofs.height) + parseInt(ofs.marginTop) + parseInt(ofs.paddingTop) + parseInt(ofs.borderTopWidth),",
        "            wdt = ofs.width;",
        "        var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;",
        "        img.style.left = 'calc(' + ofl + 'px + 1em)';",
        "        img.style.bottom = 'calc(' + ofb + 'px + 1em)';",
        "        img.style.width = 'calc(' + w + 'px / 2 - ' + wdt + ' / 2 - 2em - ' + sbw / 2 + 'px)';",
        "    }",
        "",
        "    calc();",
        "    img.title = \"此处是本视频封面大图!\" + LF + LF + \"右键菜单可复制图片大图地址,\" + LF + \"左键单击可在新窗口查看大图!\";",
        "    window.addEventListener('resize', function() {",
        "        calc();",
        "    });",
        "    window.openWin = undefined;",
        "    img.addEventListener('click', function() {",
        "        var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;",
        "        var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;",
        "        var src = this.src;",
        "        setTimeout(function() {",
        "            if (!openWin) {",
        "                openWin = window.open('about:blank', 'bilibiliCover', 'location=1,scrollbars=1,channelmode=1,width=' + w * 0.6 + ',height=' + h * 0.9 + ',left=' + w * 0.2 + ',top=' + h * 0.05);",
        "                setTimeout(function() {",
        "                    openWin.document.body.innerHTML = '<div style=\"text-align: start;\">视频封面地址:</div><textarea readonly=\"readonly\" style=\"width: 100%; height: 1.1em; font-size: 24px; box-sizing: content-box; overflow: hidden; background-color: white; color: initial;\"></textarea><hr><img src=\"' + src + '\" style=\"max-width: 100%; height: auto;\"><p id=\"realsize\" style=\"text-align: center;\"></p><style> a { cursor: pointer; background-position: center right;background-repeat: no-repeat;background-image: -webkit-linear-gradient(transparent, transparent), url(d' + 'ata:ima' + 'ge/svg+xm' + 'l,%3C%3Fxml%20version%3D%221.0%22' + '%20encoding%3D%22UTF-8%22%3F%3E%3Csvg%20xmlns%3D%22ht' + 'tp%3A%2F%2Fw' + 'ww.w3.o' + 'rg%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%3E%3Cg%20transform%3D%22translate%28-826.429%20-698.791%29%22%3E%3Crect%20width%3D%225.982%22%20height%3D%225.982%22%20x%3D%22826.929%22%20y%3D%22702.309%22%20fill%3D%22%23fff%22' + '%20stroke%3D%22%2306c%22%2F%3E%3' + 'Cg%3E%3Cpath%20d%3D%22M831.194%20698.791h5.234v5.391l-1.571%201.545-1.31-1.31-2.725%202.725-2.689-2.689%202.808-2.808-1.311-1.311z%22%20fill%3D%22%2306f%22%2F%3E%3Cpath%20d%3D%22M835.424%20699.795l.022%204.885-1.817-1.817-2.881%202.881-1.228-1.228%202.881-2.881-1.851-1.851z%22%20fill%3D%22%23fff%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E); background-image: linear-gradient(transparent, transparent), url(d' + 'ata:imag' + 'e/svg+x' + 'ml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%3Csvg%20xmlns' + '%3D%22htt' + 'p%3A%2F%2Fww' + 'w.w3.o' + 'rg%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%3E%3Cg%20transform%3D%22translate%28-826.429' + '%20-698.791%29%22%3E%3Crect%20width%3D%225.982%22%20height%3D%225.982%22%20x%3D%22826.929%22%20y%3D%22702.309%22%20fill%3D%22%23fff%22%20stroke%3D%22%2306c%22%2F%3E%3Cg%3E%3Cpath%' + '20d%3D%22M831.194%20698.791h5.234v5.391l-1.571%201.545-1.31-1.31-2.725%202.725-2.689-2.689%202.808-2.808-1.311-1.311z%22%20fill%3D%22%2306f%22%2F%3E%3Cpath%20d%3D%22M835.424%20699.795l.022%204.885-1.817-1.817-2.881%202.881-1.228-1.228%202.881-2.881-1.851-1.851z%22%20fill%3D%22%23fff%22%2F%3' + 'E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E); padding-right: 13px; } </style><p style=\"display: flex; flex-wrap: nowrap; justify-content: space-around;\"><a target=\"_blank\" data-href=\"https://image.baidu.com/pcdutu?queryImageUrl=%s\">Baidu识图搜索</a><a target=\"_blank\" data-href=\"https://www.google.com/searchbyimage?image_url=%s&encoded_image=&image_content=&filename=&hl=zh-CN\">Google识图搜索</a></p>';",
        "                    openWin.document.body.style.textAlign = 'center';",
        "                    getRealWidthAndHeight(src, function(data) {",
        "                        openWin.document.querySelector('#realsize').innerText = '(' + data.width + '×' + data.height + ')';",
        "                    });",
        "                    openWin.document.title = 'BilibiliCover';",
        "                    var t = openWin.document.querySelector('textarea');",
        "                    t.value = src;",
        "                    t.addEventListener('mouseup', function(e) {",
        "                        if (e.which !== 1) return;",
        "                        var selection = getSelection();",
        "                        if (selection.toString() !== '') return;",
        "                        this.focus();",
        "                        this.select();",
        "                    });",
        "                    Array.from(openWin.document.querySelectorAll('a')).forEach(function(ele) {",
        "                        ele.addEventListener('click', function() {",
        "                            window.open(ele.dataset.href.replace('%s', encodeURIComponent(openWin.document.querySelector('textarea').value)), '_blank').focus();",
        "                        });",
        "                    });",
        "                    openWin.focus();",
        "                    openWin.addEventListener('beforeunload', function() {",
        "                        openWin = undefined;",
        "                    });",
        "                }, 0);",
        "            } else if (openWin.document.querySelector('img').src === src) openWin.focus();",
        "            else {",
        "                openWin.document.querySelector('img').src = src;",
        "                getRealWidthAndHeight(src, function(data) {",
        "                    openWin.document.querySelector('#realsize').innerText = '(' + data.width + '×' + data.height + ')';",
        "                });",
        "                openWin.document.querySelector('textarea').value = src;",
        "                setTimeout(function() {",
        "                    openWin.focus();",
        "                }, 50);",
        "            }",
        "        }, 0);",
        "    });",
        "    window.addEventListener('beforeunload', function() {",
        "        if (openWin) openWin.close();",
        "    });",
        "})();"
    ].join('\n'));
});