// ==UserScript== // @name bilibili Video CDN // @version 0.0.4 // @description change bilibili video CDN URL // @author bevis // @match https://www.bilibili.com/* // @license MIT // @namespace https://greasyfork.org/users/429936 // @downloadURL none // ==/UserScript== const bilivideoRegex = /^https:\/\/[a-z.-\d]*(bilivideo.com)/i; const goodBilibiliCDNS = [ // 'upos-sz-mirrorks3.bilivideo.com', // 'upos-sz-mirrorks3b.bilivideo.com', // 'upos-sz-mirrorks3c.bilivideo.com', // 'upos-sz-mirrorks32.bilivideo.com', // 'upos-sz-mirrorcos.bilivideo.com', // 'upos-sz-mirrorcosb.bilivideo.com', // 'upos-sz-mirrorbos.bilivideo.com', // 'upos-sz-mirrorhw.bilivideo.com', // 'upos-sz-mirrorhwb.bilivideo.com', // 'upos-sz-upcdnbda2.bilivideo.com', // 'upos-sz-upcdnws.bilivideo.com', // 'upos-sz-upcdnhw.bilivideo.com', // 'upos-tf-all-js.bilivideo.com', // 'cn-hk-eq-bcache-01.bilivideo.com', // 'upos-hz-mirrorakam.akamaized.net', 'upos-sz-mirroraliov.bilivideo.com', ]; const httpRequestOriginOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function (method, url, ...args) { const isBiliBiliVideo = bilivideoRegex.test(url); if (!isBiliBiliVideo) { return httpRequestOriginOpen.apply(this, [method, url, ...args]); } const videoUrl = new URL(url); const isGoodUrl = goodBilibiliCDNS.includes(videoUrl.host); if (isGoodUrl) { return httpRequestOriginOpen.apply(this, [method, url, ...args]); } else { const goodUrl = goodBilibiliCDNS[Math.floor(Math.random() * goodBilibiliCDNS.length)]; videoUrl.host = goodUrl; return httpRequestOriginOpen.apply(this, [method, videoUrl.href, ...args]); } };