Greasy Fork

Greasy Fork is available in English.

AcFun - 我的关注直播间

修改uid: 0.0伪用户的直播间页面样式,只展示所关注的直播间列表

目前为 2022-08-28 提交的版本,查看 最新版本

// ==UserScript==
// @name         AcFun - 我的关注直播间
// @namespace    http://tampermonkey.net/
// @version      1.1.0
// @description  修改uid: 0.0伪用户的直播间页面样式,只展示所关注的直播间列表
// @author       dareomaewa
// @match        https://live.acfun.cn/live/0.0
// @icon         https://www.google.com/s2/favicons?sz=64&domain=acfun.cn
// @grant        none
// @require      https://cdn.staticfile.org/jquery/3.5.0/jquery.min.js
// @license MIT
// ==/UserScript==


(function() {
    'use strict';

    const config = {
        maxLiveSize: 1001,
        love: {
            // true: 打开love样式 false: 关闭
            open: true,
             // 添加love UP主的uid,使用逗号分隔“,”,例如:[123,456,]
            ups: [],
        },
        egg: {
            // 彩蛋开关 true: 打开 false: 关闭
            open: true,
            type: 0,
            upsInfo: {
                416752: {
                    uid: 416752,
                    coverUrls: [
                        'https://imgs.aixifan.com/newUpload/776907_30a99a69987d4995b43df39320491711.jpg',
                    ],
                },
                36626547: {
                    uid: 36626547,
                    coverUrls: [
                        'https://imgs.aixifan.com/newUpload/776907_3151ca8705334d88ba6cdc4834573ec1.jpg',
                    ],
                },
                23682490: {
                    uid: 23682490,
                    coverUrls: [
                        'https://imgs.aixifan.com/newUpload/776907_b8fbdbdd47be447895464b5555225679.jpg',
                    ],
                },
                1345673: {
                    uid: 1345673,
                    coverUrls: [
                        'https://imgs.aixifan.com/newUpload/776907_5d8820b3b8ca42d38f17240c48102752.jpg',
                    ],
                },
                179922: {
                    uid: 179922,
                    coverUrls: [
                        'https://imgs.aixifan.com/newUpload/776907_75e7e36b3e6445baa02f1c8618b4359c.jpg',
                    ],
                },
                30561040: {
                    uid: 30561040,
                    coverUrls: [
                        'https://imgs.aixifan.com/newUpload/776907_61f0f008b94c4d579f789c06e5d2ee4f.jpg',
                    ],
                },
                40740702: {
                    uid: 40740702,
                    coverUrls: [
                        'https://imgs.aixifan.com/newUpload/776907_25a67815bb984f5ea853395af9c8c237.jpg',
                    ],
                },
                12553939: {
                    uid: 12553939,
                    coverUrls: [
                        'https://imgs.aixifan.com/newUpload/776907_b8ac4f947626494cbb96356794d39e3c.jpg',
                    ],
                },
            },
        },
    };

    function StringBuffer() {
        this.__strings__ = [];
    };
    StringBuffer.prototype.Append = function (str) {
        this.__strings__.push(str);
        return this;
    };
    StringBuffer.prototype.ToString = function () {
        return this.__strings__.join('');
    };

    function createLiveListItemHtmlStr(data) {
        var htmlStr = new StringBuffer();
        htmlStr.Append('<div class="live-list-item list-item item">');
        htmlStr.Append(' <span style="position: relative;">');
        htmlStr.Append(' <div class="live-check-cover">');
        htmlStr.Append(' <div class="live-check-cover-desc"><a href="' + data.coverUrls[1]+ '" target="_blank" title="查看封面" style="color: #f3fdff">查看封面</a></div>');
        htmlStr.Append('</div>');
        htmlStr.Append(' <a href="/live/' + data.href + '" target="_blank" class="list-content-top">');
        htmlStr.Append(' <div class="list-content-data">');
        htmlStr.Append(' <span class="likeCount icon-like icon-ks">' + data.likeCount+ '');
        htmlStr.Append('</span>');
        htmlStr.Append(' <span class="onlineCount icon-view">' + data.onlineCount+ '');
        htmlStr.Append('</span>');
        htmlStr.Append('</div>');

        if (config.egg.open && Object.keys(config.egg.upsInfo).some(e => e === data.user.id)) {
            const eggCoverUrl = config.egg.upsInfo[data.user.id].coverUrls[config.egg.type];
            htmlStr.Append(' <div class="list-content-cover">');
            htmlStr.Append(' <img id="cover_' + data.user.id + '" data-src="' + data.coverUrls[0]+ '" src="' + data.coverUrls[0] + '" lazy="loaded"  />');
            htmlStr.Append(' <img id="cover_' + data.user.id + '_love" data-src="' + eggCoverUrl + '" src="' + eggCoverUrl + '" lazy="loaded" style="display: none;"  />');
            htmlStr.Append('</div>');
            htmlStr.Append(' <div class="danmaku-mask" style="background: rgb(0 0 0 / 0%);" onmouseover="danmakuMaskTrigger(\'#cover_' + data.user.id + '_love\', \'#cover_' + data.user.id + '\');" onmouseout="danmakuMaskTrigger(\'#cover_' + data.user.id + '\', \'#cover_' + data.user.id + '_love\');">');
        }else {
            htmlStr.Append(' <div class="list-content-cover">');
            htmlStr.Append(' <img id="cover_' + data.user.id + '" data-src="' + data.coverUrls[0]+ '" src="' + data.coverUrls[0] + '" lazy="loaded"  />');
            htmlStr.Append('</div>');
            htmlStr.Append(' <div class="danmaku-mask" style="background: rgb(0 0 0 / 28%);">');
        }

        htmlStr.Append(' <div class="space-danmaku"></div>');
        htmlStr.Append(' <span class="video-time"></span>');
        htmlStr.Append('</div>');
        htmlStr.Append(' <div class="live-status">');
        htmlStr.Append(' <div class="live-status-desc">直播中</div>');
        htmlStr.Append(' <div class="living-icon">');
        htmlStr.Append(' <div class="live-animate" style="width: 12px; height: 12px;">');
        htmlStr.Append(' <img width="100%" height="100%" src="//ali-imgs.acfun.cn/kos/nlav10360/static/img/liveing.54ae1410.gif" />');
        htmlStr.Append('</div>');
        htmlStr.Append('</div>');
        htmlStr.Append('</div>');
        htmlStr.Append('</a>');
        htmlStr.Append('</span>');
        htmlStr.Append(' <div class="up-info">');
        htmlStr.Append(' <a href="/live/' + data.href + '" target="_blank" class="up-info-left">');
        htmlStr.Append(' <img class="up-avatar" data-src="' + data.user.headUrl + '" src="' + data.user.headUrl + '" lazy="loaded" />');
        htmlStr.Append('</a>');
        htmlStr.Append(' <div class="up-info-right">');
        htmlStr.Append(' <h1 class="list-content-title">');
        htmlStr.Append(' <a href="/live/' + data.href + '" target="_blank" title="' + data.title + '">' + data.title + '</a>');
        htmlStr.Append('</h1>');
        htmlStr.Append(' <a href="//www.acfun.cn/u/' + data.user.id + '" target="_blank" title="' + data.user.name + '" data-uid="' + data.user.id + '" class="list-content-uplink">UP: ' + data.user.name + '</a>');
        htmlStr.Append('</div>');
        htmlStr.Append('</div>');
        htmlStr.Append('</div>');
        return htmlStr.ToString();
    }

    function waitElement(selector, times, interval, flag=true){
        var _times = times || -1,
            _interval = interval || 1,
            _selector = selector,
            _iIntervalID,
            _flag = flag;
        return new Promise(function(resolve, reject){
            _iIntervalID = setInterval(function() {
                if(!_times) {
                    clearInterval(_iIntervalID);
                    reject();
                }
                _times <= 0 || _times--;
                var _self = $(_selector);
                if( (_flag && _self.length) || (!_flag && !_self.length) ) {
                    clearInterval(_iIntervalID);
                    resolve(_iIntervalID);
                }
            }, _interval);
        });
    }

    function addChild(fatherNode, childNode, innerHtmlStr, type) {
        childNode.innerHTML = innerHtmlStr;
        if (type) {
            fatherNode.appendChild(childNode);
        }else {
            fatherNode.appendChild(childNode.childNodes[0]);
        }
    }

    function addChildDiv(fatherNode, innerHtmlStr) {
        addChild(fatherNode, document.createElement("div"), innerHtmlStr);
    }

    function addChildScript(fatherNode, scriptStr) {
        addChild(fatherNode, document.createElement("script"), scriptStr, 'script');
    }

    function addChildStyle(fatherNode, styleStr) {
        addChild(fatherNode, document.createElement("style"), styleStr, 'style');
    }

    function initLiveContainer(liveContainerSelector, liveList) {
        waitElement(liveContainerSelector).then(function() {
            var othersLiveContainer = document.querySelector(liveContainerSelector);
            //console.log(liveList);
            liveList.forEach(data => {
                addChildDiv(othersLiveContainer, createLiveListItemHtmlStr(data));
            });
        });
    }

    function replaceText(selector, newText) {
        waitElement(selector).then(function() {document.querySelector(selector).innerText = newText;});
    }

    function removeNode(selector) {
        waitElement(selector).then(function() {document.querySelector(selector).remove();});
    }

    function confirmMoreLive(selector) {
        const msg = '确定跳转AC直播大屏幕吗?你将可能进入未曾关注过的直播间。';
        waitElement(selector).then(function() {
            const moreLiveNodes = document.querySelectorAll(selector);
            moreLiveNodes.forEach(node => {
                node.setAttribute('href', 'javascript:if(confirm("' + msg + '")) window.open("/");');
                node.removeAttribute('target');
            });
        });
    }

    replaceText('title', '我的关注直播间');
    //replaceText('.recmd-live-title', '我的关注直播间');

    removeNode('.player-outer-wrapper');
    removeNode('.recmd-live-container');

    confirmMoreLive('.more-live');
    confirmMoreLive('.live-page-title');
    confirmMoreLive('a[href="/"].live');

    $.ajax({
        url: '/api/channel/list?count=' + config.maxLiveSize + '&pcursor=&filters=[%7B%22filterType%22:3,+%22filterId%22:0%7D]',
        type: 'get',
        success: function (res) {
            //console.log(res);

            const liveList = res.liveList;

            replaceText('.recmd-live-title', '我的关注直播间 (' + liveList.length + ')');

            let loveUps = config.love.ups;

            waitElement('.recommend-live-wrapper').then(function() {
                const recommendLiveWrapperNode =document.querySelector('.recommend-live-wrapper');
                addChildDiv(recommendLiveWrapperNode,
                         '<div id="loveLiveContainer" class="recmd-live-container" style="box-sizing: border-box;box-shadow: 0px 2px 0px 0px rgb(254 166 174);"></div>');

                addChildDiv(recommendLiveWrapperNode,
                         '<div id="othersLiveContainer" class="recmd-live-container" style="padding-top: 10px;"></div>');
            });

            waitElement('head').then(function() {
                const headNode = document.querySelector('head');
                addChildStyle(headNode,
                              '.live-check-cover {color: #fff;position: absolute;right: 4px;bottom: 5px;border-radius: 3px;text-align: center;width: auto;height: 19px;z-index: 996;} .live-check-cover-desc {font-size: 12px;line-height: 17px;height: 18px;display: inline-block;vertical-align: top;width: 58px;}');

                if (config.love.open) {
                    addChildStyle(headNode,
                                  '#loveLiveContainer .live-list-item .list-content-top .list-content-data {background: linear-gradient(180deg,transparent,rgb(254 129 141 / 83%));} .list-container {min-height: 500px;}');
                }

                if (config.egg.open) {
                    addChildScript(headNode,
                                   'function danmakuMaskTrigger(selector0, selector1){document.querySelector(selector0).setAttribute("style", "display: block;");document.querySelector(selector1).setAttribute("style", "display: none;");}');
                }
            });

            if (!config.love.open || loveUps.length ===0) {
                initLiveContainer('#othersLiveContainer', liveList);
            }else {
                const loveLiveList = liveList.filter((e) => loveUps.some((uid) => uid === e.authorId));
                initLiveContainer('#loveLiveContainer', loveLiveList);

                const othersLiveList = liveList.filter((e) => !loveUps.some((uid) => uid === e.authorId));
                initLiveContainer('#othersLiveContainer', othersLiveList);
            }
        }
    });

    window.aikaCut = function aikaCut() {
        event.preventDefault();
        $.ajax({
            url: 'https://id.app.acfun.cn/rest/web/token/get',
            type: 'post',
            data: {'sid': 'acfun.midground.api'},
            xhrFields: {
                withCredentials: true
            },
            success: function (res) {
                //console.log(res);
                const aikaText = document.getElementById('aika-text');
                const aikaCut = document.getElementById('aika-cut');
                const aikaTestValue = aikaText.value.trim();
                if (/https:\/\/onvideo.kuaishou.com\/vangogh\/editor\/(\d+)\?source=ac/g.test(aikaTestValue)) {
                    aikaCut.href = 'https://onvideoapi.kuaishou.com/rest/infra/sts?sid=acfun.midground.api&authToken=' + res['acfun.midground.api.at'] + '&followUrl=' + encodeURI(aikaTestValue);
                }
                else if (/^\d+$/.test(aikaTestValue)) {
                    aikaCut.href = 'https://onvideoapi.kuaishou.com/rest/infra/sts?sid=acfun.midground.api&authToken=' + res['acfun.midground.api.at'] + '&followUrl=' + encodeURI('https://onvideo.kuaishou.com/vangogh/editor/' + aikaTestValue + '?source=ac');
                }
                else {
                    aikaCut.href = '#';
                }
                console.log(aikaCut.href);

                const aikaA = document.createElement('a');
                aikaA.href = aikaCut.href;
                aikaA.target = '_blank';
                aikaA.click();
                aikaA.remove();
            }
        });
    }

    const aikaTextHtmlStr = `
    <div style="padding-top: 20px;">
        <input type="text" placeholder="爱咔号 或者 爱咔地址" value="" autocomplete="off" id="aika-text" style="
            width: 100%;
            padding: 8px 30px 8px 10px;
            height: 36px;
            font-size: 12px;
            border: 1px solid #e5e5e5;
            line-height: 14px;
            vertical-align: top;
            color: #999;
            box-sizing: border-box;">
    </div>
    `;

    const aikaBtnHtmlStr = `
    <div style="padding: 10px 0 0 0;">
        <a href="#" target="_blank" id="aika-cut" onclick="window.aikaCut();" style="
            display: inline-block;
            background-color: #fd4c5d;
            width: 74px;
            height: 26px;
            text-indent: 4px;
            text-align: left;
            text-indent: 10px;
            color: #fff;
            font-size: 14px;
            line-height: 26px;
            border-radius: 4px;
            border: 1px solid #fd4c5d;">
        直播剪辑
        </a>
    </div>
     `;

    waitElement('.list-right').then(function() {
        const listRightNode = document.querySelector('.list-right');
        addChild(listRightNode, document.createElement("div"), aikaTextHtmlStr, 'div');
        addChild(listRightNode, document.createElement("div"), aikaBtnHtmlStr, 'div');
    });

})();